From 46aa527028bad26f0e3c9a3b4210a60fbefde0d3 Mon Sep 17 00:00:00 2001 From: Sikander Saleem Date: Sun, 8 Jan 2023 09:48:49 +0300 Subject: [PATCH 001/181] android app package name change. --- android/app/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/android/app/build.gradle b/android/app/build.gradle index e17c83eb..02304bd9 100644 --- a/android/app/build.gradle +++ b/android/app/build.gradle @@ -37,7 +37,7 @@ android { defaultConfig { // TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html). - applicationId "com.example.test_sa" + applicationId "com.hmg.atoms" // You can update the following values to match your application needs. // For more information, see: https://docs.flutter.dev/deployment/android#reviewing-the-build-configuration. minSdkVersion 21 From bba0b3d7d748483ac8faacb73fc8036d9de6559c Mon Sep 17 00:00:00 2001 From: MaximusAshraf <50173497+MaximusAshraf@users.noreply.github.com> Date: Sat, 14 Jan 2023 22:32:58 +0200 Subject: [PATCH 002/181] version 0.7.4 - update pentry add update pentry add Defect Type and priority for service request rename and remove unused fields add search with asset number and view it in service request and ppm visit --- assets/subtitles/en_subtitle.json | 18 +- lib/controllers/api_routes/urls.dart | 11 + .../data/pentry/pentry_controller.dart | 18 ++ .../providers/api/devices_provider.dart | 20 +- .../providers/api/gas_refill_provider.dart | 4 +- .../providers/api/hospitals_provider.dart | 5 - .../providers/api/parts_provider.dart | 4 - .../api/regular_visits_provider.dart | 56 ++++- .../api/service_requests_provider.dart | 8 +- .../employee/employee_provider.dart | 8 +- .../gas_cylinder_size_provider.dart | 8 +- .../gas_refill/gas_status_provider.dart | 8 +- .../gas_refill/gas_types_provider.dart | 8 +- .../pentry/pentry_status_provider.dart | 75 +++++++ .../pentry/pentry_task_status_provider.dart | 75 +++++++ .../pentry/pentry_visit_status_provider.dart | 75 +++++++ .../service_report_defect_types_provider.dart | 75 +++++++ .../service_report_last_calls_provider.dart | 8 +- .../service_report_priority_provider.dart | 75 +++++++ .../service_report_reasons_provider.dart | 8 +- .../service_report_status_provider.dart | 8 +- .../report/service_report_types_provider.dart | 8 +- .../report/service_types_provider.dart | 8 +- lib/main.dart | 10 + lib/models/device/device.dart | 4 + lib/models/device/device_transfer.dart | 2 +- lib/models/device/device_transfer_info.dart | 6 +- lib/models/gas_refill/gas_refill_details.dart | 14 +- lib/models/gas_refill/gas_refill_model.dart | 8 +- lib/models/{status.dart => lookup.dart} | 18 +- lib/models/pantry/calibration_tools.dart | 26 +++ lib/models/pantry/contact.dart | 41 ++++ lib/models/pantry/lookups/contact_person.dart | 15 ++ lib/models/pantry/lookups/contact_title.dart | 15 ++ lib/models/pantry/pentry.dart | 121 +++++++++++ lib/models/pantry/pm_kit.dart | 45 ++++ lib/models/pantry/ppm_check_list.dart | 33 +++ lib/models/service_report.dart | 23 +-- .../service_request/service_request.dart | 9 + lib/models/user.dart | 1 - lib/models/visits/visit.dart | 9 +- lib/models/visits/visits_group.dart | 6 +- lib/views/app_style/colors.dart | 2 +- .../track_device_transfer.dart | 2 +- lib/views/pages/user/land_page.dart | 112 +++++----- .../pages/user/requests/create_request.dart | 27 ++- .../report/create_service_report.dart | 94 ++++----- .../requests/report/edit_service_report.dart | 2 +- .../pages/user/requests/request_details.dart | 12 +- .../pages/user/visits/pantry/edit_pentry.dart | 192 ++++++++++++++++++ .../visits/pantry/future_edit_pently.dart | 60 ++++++ .../visits/update_visits_group_sheet.dart | 16 +- .../pages/user/visits/visit_details.dart | 23 ++- .../widgets/date_and_time/date_picker.dart | 7 +- .../auto_complete_devices_field.dart | 99 ++++----- .../equipment/single_device_picker.dart | 45 ++-- ...dart => hospital_auto_complete_field.dart} | 9 +- .../widgets/images/mini_one_image_picker.dart | 4 +- .../widgets/images/multi_image_picker.dart | 2 +- .../parts/auto_complete_parts_field.dart | 101 +++++---- .../auto_complete_devices_field.dart | 95 +++++++++ .../pentry/pentry_calibration_tool_form.dart | 100 +++++++++ .../widgets/pentry/pentry_info_form.dart | 123 +++++++++++ .../widgets/pentry/pentry_pm_kit_form.dart | 158 ++++++++++++++ .../pentry/pentry_ppm_check_list_form.dart | 119 +++++++++++ .../widgets/requests/request_status.dart | 2 +- .../requests/service_request_item.dart | 51 ----- .../service_request_update_dialog.dart | 6 +- lib/views/widgets/search/filter_item.dart | 4 +- .../search/service_request_search_bar.dart | 18 +- .../widgets/search/visits_search_bar.dart | 22 +- .../status/employee/employee_mune.dart | 6 +- .../status/gas_refill/gas_cylinder_size.dart | 6 +- .../widgets/status/gas_refill/gas_status.dart | 6 +- .../widgets/status/gas_refill/gas_type.dart | 6 +- .../widgets/status/multi_status_menu.dart | 14 +- .../status/pentry/pentry_status_mune.dart | 40 ++++ .../pentry/pentry_task_status_mune.dart | 38 ++++ .../pentry/pentry_visit_status_mune.dart | 39 ++++ .../report/service_report_last_call.dart | 4 +- .../status/report/service_report_reasons.dart | 6 +- .../status/report/service_report_status.dart | 4 +- .../status/report/service_report_type.dart | 32 +-- .../widgets/status/report/service_status.dart | 6 +- .../service_request_defect_types_mune.dart | 41 ++++ .../service_request_priority_mune.dart | 40 ++++ .../widgets/status/single_status_menu.dart | 18 +- lib/views/widgets/timer/app_timer.dart | 47 ++--- lib/views/widgets/visits/visit_item.dart | 15 +- pubspec.yaml | 2 +- 90 files changed, 2331 insertions(+), 543 deletions(-) create mode 100644 lib/controllers/data/pentry/pentry_controller.dart create mode 100644 lib/controllers/providers/api/status_drop_down/pentry/pentry_status_provider.dart create mode 100644 lib/controllers/providers/api/status_drop_down/pentry/pentry_task_status_provider.dart create mode 100644 lib/controllers/providers/api/status_drop_down/pentry/pentry_visit_status_provider.dart create mode 100644 lib/controllers/providers/api/status_drop_down/report/service_report_defect_types_provider.dart create mode 100644 lib/controllers/providers/api/status_drop_down/report/service_report_priority_provider.dart rename lib/models/{status.dart => lookup.dart} (68%) create mode 100644 lib/models/pantry/calibration_tools.dart create mode 100644 lib/models/pantry/contact.dart create mode 100644 lib/models/pantry/lookups/contact_person.dart create mode 100644 lib/models/pantry/lookups/contact_title.dart create mode 100644 lib/models/pantry/pentry.dart create mode 100644 lib/models/pantry/pm_kit.dart create mode 100644 lib/models/pantry/ppm_check_list.dart create mode 100644 lib/views/pages/user/visits/pantry/edit_pentry.dart create mode 100644 lib/views/pages/user/visits/pantry/future_edit_pently.dart rename lib/views/widgets/hospitals/{auto_complete_field.dart => hospital_auto_complete_field.dart} (89%) create mode 100644 lib/views/widgets/pentry/auto_complete_fields/auto_complete_devices_field.dart create mode 100644 lib/views/widgets/pentry/pentry_calibration_tool_form.dart create mode 100644 lib/views/widgets/pentry/pentry_info_form.dart create mode 100644 lib/views/widgets/pentry/pentry_pm_kit_form.dart create mode 100644 lib/views/widgets/pentry/pentry_ppm_check_list_form.dart create mode 100644 lib/views/widgets/status/pentry/pentry_status_mune.dart create mode 100644 lib/views/widgets/status/pentry/pentry_task_status_mune.dart create mode 100644 lib/views/widgets/status/pentry/pentry_visit_status_mune.dart create mode 100644 lib/views/widgets/status/service_request/service_request_defect_types_mune.dart create mode 100644 lib/views/widgets/status/service_request/service_request_priority_mune.dart diff --git a/assets/subtitles/en_subtitle.json b/assets/subtitles/en_subtitle.json index 2353ebd1..2ce29fb9 100644 --- a/assets/subtitles/en_subtitle.json +++ b/assets/subtitles/en_subtitle.json @@ -64,7 +64,7 @@ "code": "Code", "serialNumber": "Serial Number", "add": "Add", - "brand": "Brand", + "brand": "manufacture", "clearSearch": "Clear Search", "closed": "Closed", "create": "Create", @@ -84,8 +84,8 @@ "facebook": "facebook", "faultDescription": "Fault Description", "general": "General", - "hospital": "Client", - "hospitalRequired": "Client Required", + "hospital": "Site", + "hospitalRequired": "Site Required", "hotLine": "Hot Line", "jobSheetNumber": "Job Sheet Number", "linkedIn": "linkedIn", @@ -97,8 +97,8 @@ "newServiceRequest": "New Service Request", "newWord": "New", "noDateFound": "No Date Found", - "noDeviceFound": "No Device Found", - "noHospitalFound": "No Client Found", + "noDeviceFound": "No Asset Found", + "noHospitalFound": "No Site Found", "noModelFound": "No Model Found", "noServiceRequestFound": "No Service Request Found", "noSnFound": "No SN Found", @@ -106,8 +106,8 @@ "notificationsNotFound": "Notifications Not Found", "noUniteFound": "No Unit Found", "ourWebsite": "Our Website", - "pickDevice": "Pick Device", - "pickHospital": "Pick Client", + "pickDevice": "Pick Asset", + "pickHospital": "Pick Site", "pickUnite": "Pick Unit", "policy": "Policy", "reason1": "The engineer didn't confirm visit date with 2 hours from the request time", @@ -169,10 +169,10 @@ "attachImage": "Attach Image", "callLastSituation": "Call's Last Situation", "customer": "Customer", - "editServiceReport": "Edit Service Report", + "editServiceReport": "Edit Work Order", "invoiceCode": "Invoice Code", "invoiceNumber": "Invoice Number", - "newServiceReport": "New Service Report", + "newServiceReport": "New Work Order", "number": "Number", "operatingHours": "Operating Hours", "partNumber": "Part Number", diff --git a/lib/controllers/api_routes/urls.dart b/lib/controllers/api_routes/urls.dart index f09068a2..be346745 100644 --- a/lib/controllers/api_routes/urls.dart +++ b/lib/controllers/api_routes/urls.dart @@ -37,6 +37,8 @@ class URLs{ static const getServiceReportLastCalls = "/return/call/last/situation"; // get static const getServiceTypes = "/return/service/type"; // get static const getPartNumber = "/handle/return/all/parts"; // get + static const getServiceReportPriority = "/return/call/priority/list"; // get + static const getServiceReportDefectTypes = "/return/call/defect/type/list"; // get //gas refill static const getGasTypes = "/return/gas/refill/types"; // get @@ -54,4 +56,13 @@ class URLs{ // employee static const getEmployees = "/return/assigned/employee"; // get + // pentry + static const getPentry = "/return/pentry/details"; // get + static const updatePentry = "/update/pentry/details"; // get + static const getPentryTaskStatus = "/return/pentry/task/status"; // get + static const getPentryVisitStatus = "/return/pentry/visit/status/list"; // get + static const getPentryStatus = "/return/pentry/status/list"; // get + // contacts + static const getPentryContacts = "/handle/return/all/contacts"; // get + } \ No newline at end of file diff --git a/lib/controllers/data/pentry/pentry_controller.dart b/lib/controllers/data/pentry/pentry_controller.dart new file mode 100644 index 00000000..f12b27b8 --- /dev/null +++ b/lib/controllers/data/pentry/pentry_controller.dart @@ -0,0 +1,18 @@ +import 'dart:convert'; + +import 'package:flutter/material.dart'; +import 'package:http/http.dart'; +import 'package:test_sa/models/lookup.dart'; +import 'package:test_sa/models/pantry/pentry.dart'; +import 'package:test_sa/models/visits/visit.dart'; + +import '../../../models/user.dart'; +import '../../api_routes/urls.dart'; + +class PentryController { + const PentryController._(); + + static const PentryController instance = PentryController._(); + + +} \ No newline at end of file diff --git a/lib/controllers/providers/api/devices_provider.dart b/lib/controllers/providers/api/devices_provider.dart index 808421da..985f3aad 100644 --- a/lib/controllers/providers/api/devices_provider.dart +++ b/lib/controllers/providers/api/devices_provider.dart @@ -81,25 +81,25 @@ class DevicesProvider extends ChangeNotifier{ @required String host, @required User user, @required String hospitalId, - @required String title}) async { + String serialNumber, + String number, + }) async { Response response; try{ response = await get( - Uri.parse(host + URLs.getEquipment+"?client=$hospitalId" - + ( title == null || title.isEmpty ? "" : "&name=$title" )), + Uri.parse("$host${URLs.getEquipment}?client=$hospitalId" + "${serialNumber?.isEmpty == false ? "&name=$serialNumber" :""}" + "${number?.isEmpty == false ? "&number=$number" : ""}" + ), ); - _stateCode = response.statusCode; - List _page = []; + List page = []; if(response.statusCode >= 200 && response.statusCode < 300) { // client's request was successfully received List categoriesListJson = json.decode(utf8.decode(response.bodyBytes)); - _page = categoriesListJson.map((device) => Device.fromJson(device)).toList(); + page = categoriesListJson.map((device) => Device.fromJson(device)).toList(); } - return _page; + return page; } catch(error) { - _loading = false; - _stateCode = -1; - notifyListeners(); return []; } diff --git a/lib/controllers/providers/api/gas_refill_provider.dart b/lib/controllers/providers/api/gas_refill_provider.dart index e0f90bbc..a409eea1 100644 --- a/lib/controllers/providers/api/gas_refill_provider.dart +++ b/lib/controllers/providers/api/gas_refill_provider.dart @@ -109,8 +109,8 @@ class GasRefillProvider extends ChangeNotifier{ }; body["details"] = jsonEncode(model.details.map((model) => { - "type": model.type.id.toString(), - "size": model.cylinderSize.id.toString(), + "type": model.type.id?.toString(), + "size": model.cylinderSize?.id.toString(), "requsted_qty": model.requestedQuantity.toString(), }).toList()); diff --git a/lib/controllers/providers/api/hospitals_provider.dart b/lib/controllers/providers/api/hospitals_provider.dart index 3ead9f6f..e7d61595 100644 --- a/lib/controllers/providers/api/hospitals_provider.dart +++ b/lib/controllers/providers/api/hospitals_provider.dart @@ -96,11 +96,6 @@ class HospitalsProvider extends ChangeNotifier{ } - /// return -2 if request in progress - /// return -1 if error happen when sending request - /// 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> getHospitalsList ({String host,User user,String title}) async { Response response; try{ diff --git a/lib/controllers/providers/api/parts_provider.dart b/lib/controllers/providers/api/parts_provider.dart index 061e3da7..6f763f77 100644 --- a/lib/controllers/providers/api/parts_provider.dart +++ b/lib/controllers/providers/api/parts_provider.dart @@ -110,7 +110,6 @@ class PartsProvider extends ChangeNotifier{ "Content-Type":"application/json; charset=utf-8" } ); - _stateCode = response.statusCode; List _page = []; if(response.statusCode >= 200 && response.statusCode < 300) { // client's request was successfully received @@ -119,9 +118,6 @@ class PartsProvider extends ChangeNotifier{ } return _page; } catch(error) { - _loading = false; - _stateCode = -1; - notifyListeners(); return []; } diff --git a/lib/controllers/providers/api/regular_visits_provider.dart b/lib/controllers/providers/api/regular_visits_provider.dart index 1db89790..bc0ec05c 100644 --- a/lib/controllers/providers/api/regular_visits_provider.dart +++ b/lib/controllers/providers/api/regular_visits_provider.dart @@ -1,6 +1,7 @@ import 'dart:convert'; import 'package:test_sa/controllers/api_routes/urls.dart'; +import 'package:test_sa/models/pantry/pentry.dart'; import 'package:test_sa/models/user.dart'; import 'package:test_sa/models/visits/visit.dart'; import 'package:test_sa/models/visits/visits_group.dart'; @@ -54,6 +55,11 @@ class RegularVisitsProvider extends ChangeNotifier{ Response response; //userId = 397.toString(); // testing id to view data try{ + print( Uri.parse( + "$host${URLs.getRegularVisits}?uid=${user.id}" + "&token=${user.token}" + "&page=${(visits?.length ?? 0) ~/pageItemNumber}${visitsSearch?.toSearchString()}" ?? "" + )); response = await get( Uri.parse( host+URLs.getRegularVisits @@ -76,7 +82,7 @@ class RegularVisitsProvider extends ChangeNotifier{ if(response.statusCode >= 200 && response.statusCode < 300) { // client's request was successfully received try{ - List requestsListJson = json.decode(utf8.decode(response.bodyBytes)); + List requestsListJson = json.decode(utf8.decode(response.bodyBytes).replaceAll("\\", "")); List _visits = requestsListJson.map( (request) => Visit.fromJson(request) ).toList(); @@ -89,6 +95,7 @@ class RegularVisitsProvider extends ChangeNotifier{ nextPage = false; } }catch(error){ + print(error); isLoading = false; stateCode = -1; notifyListeners(); @@ -137,5 +144,52 @@ class RegularVisitsProvider extends ChangeNotifier{ } } + Future getPently({String host,User user,String id}) async { + Response response; + print(Uri.parse("$host${URLs.getPentry}/$id"),); + response = await get( + Uri.parse("$host${URLs.getPentry}/$id"), + headers: { + "Content-Type":"application/json; charset=utf-8" + } + ); + print(response.body); + + Pentry pantry; + if(response.statusCode >= 200 && response.statusCode < 300) { + pantry = Pentry.fromMap(json.decode(utf8.decode(response.bodyBytes))); + } + return pantry; + } + Future updatePentry ({ + @required String host, + @required User user, + @required Pentry pentry, + @required Visit visit, + }) async { + try{ + Response response; + Map body = pentry.toMap(); + body["uid"] = user.id; + body["token"] = user.token; + print( Uri.parse(host+URLs.updatePentry + "/${visit.id}"),); + print(body); + response = await post( + Uri.parse(host+URLs.updatePentry + "/${visit.id}"), + body: body, + ); + print(response.body); + if(response.statusCode >= 200 && response.statusCode < 300) { + visit.status = pentry.ppmVisitStatus; + notifyListeners(); + } + return response.statusCode; + + } catch(error) { + print(error); + return -1; + } + + } } \ No newline at end of file diff --git a/lib/controllers/providers/api/service_requests_provider.dart b/lib/controllers/providers/api/service_requests_provider.dart index b5ab6022..3b452497 100644 --- a/lib/controllers/providers/api/service_requests_provider.dart +++ b/lib/controllers/providers/api/service_requests_provider.dart @@ -3,10 +3,10 @@ import 'dart:convert'; import 'package:test_sa/controllers/api_routes/urls.dart'; import 'package:test_sa/controllers/http_status_manger/http_status_manger.dart'; import 'package:test_sa/models/issue.dart'; +import 'package:test_sa/models/lookup.dart'; import 'package:test_sa/models/service_report.dart'; import 'package:test_sa/models/service_request/service_request.dart'; import 'package:test_sa/models/service_request/service_request_search.dart'; -import 'package:test_sa/models/status.dart'; import 'package:test_sa/models/subtitle.dart'; import 'package:test_sa/models/timer_model.dart'; import 'package:test_sa/models/user.dart'; @@ -161,6 +161,8 @@ class ServiceRequestsProvider extends ChangeNotifier{ "client": user.hospital.id ?? '', "complaint": serviceRequest.maintenanceIssue, "image": json.encode(serviceRequest.devicePhotos), + "priority": (serviceRequest.priority?.id).toString(), + "defect_types": (serviceRequest.defectType?.id).toString(), }; if(serviceRequest.audio != null){ body["audio"] = serviceRequest.audio; @@ -173,7 +175,7 @@ class ServiceRequestsProvider extends ChangeNotifier{ host+URLs.createRequest), body: body, ); - + print(response.body); stateCode = response.statusCode; if(response.statusCode >= 200 && response.statusCode < 300) { if(serviceRequests != null) @@ -225,7 +227,7 @@ class ServiceRequestsProvider extends ChangeNotifier{ @required String host, @required User user, @required String newDate, - @required Status employee, + @required Lookup employee, @required ServiceRequest request, }) async { Response response; diff --git a/lib/controllers/providers/api/status_drop_down/employee/employee_provider.dart b/lib/controllers/providers/api/status_drop_down/employee/employee_provider.dart index 7c6a6757..bd4db06c 100644 --- a/lib/controllers/providers/api/status_drop_down/employee/employee_provider.dart +++ b/lib/controllers/providers/api/status_drop_down/employee/employee_provider.dart @@ -1,7 +1,7 @@ import 'dart:convert'; import 'package:test_sa/controllers/api_routes/urls.dart'; -import 'package:test_sa/models/status.dart'; +import 'package:test_sa/models/lookup.dart'; import 'package:test_sa/models/user.dart'; import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; @@ -23,8 +23,8 @@ class EmployeesProvider extends ChangeNotifier{ // contain user data // when user not login or register _user = null - List _items; - List get items => _items; + List _items; + List get items => _items; // when categories in-process _loading = true // done _loading = true @@ -57,7 +57,7 @@ class EmployeesProvider extends ChangeNotifier{ if(response.statusCode >= 200 && response.statusCode < 300) { // client's request was successfully received List categoriesListJson = json.decode(utf8.decode(response.bodyBytes)); - _items = categoriesListJson.map((type) => Status.fromJson(type)).toList(); + _items = categoriesListJson.map((type) => Lookup.fromJson(type)).toList(); } _loading = false; notifyListeners(); diff --git a/lib/controllers/providers/api/status_drop_down/gas_refill/gas_cylinder_size_provider.dart b/lib/controllers/providers/api/status_drop_down/gas_refill/gas_cylinder_size_provider.dart index a4533788..5ea49fa9 100644 --- a/lib/controllers/providers/api/status_drop_down/gas_refill/gas_cylinder_size_provider.dart +++ b/lib/controllers/providers/api/status_drop_down/gas_refill/gas_cylinder_size_provider.dart @@ -1,7 +1,7 @@ import 'dart:convert'; import 'package:test_sa/controllers/api_routes/urls.dart'; -import 'package:test_sa/models/status.dart'; +import 'package:test_sa/models/lookup.dart'; import 'package:test_sa/models/user.dart'; import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; @@ -24,8 +24,8 @@ class GasCylinderSizesProvider extends ChangeNotifier{ // contain user data // when user not login or register _user = null - List _items; - List get items => _items; + List _items; + List get items => _items; // when categories in-process _loading = true // done _loading = true @@ -56,7 +56,7 @@ class GasCylinderSizesProvider extends ChangeNotifier{ if(response.statusCode >= 200 && response.statusCode < 300) { // client's request was successfully received List categoriesListJson = json.decode(utf8.decode(response.bodyBytes)); - _items = categoriesListJson.map((item) => Status.fromJson(item)).toList(); + _items = categoriesListJson.map((item) => Lookup.fromJson(item)).toList(); } _loading = false; notifyListeners(); diff --git a/lib/controllers/providers/api/status_drop_down/gas_refill/gas_status_provider.dart b/lib/controllers/providers/api/status_drop_down/gas_refill/gas_status_provider.dart index 60d5db9e..a6fcbc5a 100644 --- a/lib/controllers/providers/api/status_drop_down/gas_refill/gas_status_provider.dart +++ b/lib/controllers/providers/api/status_drop_down/gas_refill/gas_status_provider.dart @@ -1,7 +1,7 @@ import 'dart:convert'; import 'package:test_sa/controllers/api_routes/urls.dart'; -import 'package:test_sa/models/status.dart'; +import 'package:test_sa/models/lookup.dart'; import 'package:test_sa/models/user.dart'; import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; @@ -24,8 +24,8 @@ class GasStatusProvider extends ChangeNotifier{ // contain user data // when user not login or register _user = null - List _items; - List get items => _items; + List _items; + List get items => _items; // when categories in-process _loading = true // done _loading = true @@ -55,7 +55,7 @@ class GasStatusProvider extends ChangeNotifier{ if(response.statusCode >= 200 && response.statusCode < 300) { // client's request was successfully received List categoriesListJson = json.decode(utf8.decode(response.bodyBytes)); - _items = categoriesListJson.map((item) => Status.fromJson(item)).toList(); + _items = categoriesListJson.map((item) => Lookup.fromJson(item)).toList(); } _loading = false; notifyListeners(); diff --git a/lib/controllers/providers/api/status_drop_down/gas_refill/gas_types_provider.dart b/lib/controllers/providers/api/status_drop_down/gas_refill/gas_types_provider.dart index 33ab1b27..fa193fa4 100644 --- a/lib/controllers/providers/api/status_drop_down/gas_refill/gas_types_provider.dart +++ b/lib/controllers/providers/api/status_drop_down/gas_refill/gas_types_provider.dart @@ -1,7 +1,7 @@ import 'dart:convert'; import 'package:test_sa/controllers/api_routes/urls.dart'; -import 'package:test_sa/models/status.dart'; +import 'package:test_sa/models/lookup.dart'; import 'package:test_sa/models/user.dart'; import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; @@ -24,8 +24,8 @@ class GasTypesProvider extends ChangeNotifier{ // contain user data // when user not login or register _user = null - List _items; - List get items => _items; + List _items; + List get items => _items; // when categories in-process _loading = true // done _loading = true @@ -55,7 +55,7 @@ class GasTypesProvider extends ChangeNotifier{ if(response.statusCode >= 200 && response.statusCode < 300) { // client's request was successfully received List categoriesListJson = json.decode(utf8.decode(response.bodyBytes)); - _items = categoriesListJson.map((item) => Status.fromJson(item)).toList(); + _items = categoriesListJson.map((item) => Lookup.fromJson(item)).toList(); } _loading = false; notifyListeners(); diff --git a/lib/controllers/providers/api/status_drop_down/pentry/pentry_status_provider.dart b/lib/controllers/providers/api/status_drop_down/pentry/pentry_status_provider.dart new file mode 100644 index 00000000..d659ca7a --- /dev/null +++ b/lib/controllers/providers/api/status_drop_down/pentry/pentry_status_provider.dart @@ -0,0 +1,75 @@ +import 'dart:convert'; + +import 'package:test_sa/controllers/api_routes/urls.dart'; +import 'package:test_sa/models/lookup.dart'; +import 'package:test_sa/models/user.dart'; +import 'package:flutter/cupertino.dart'; +import 'package:flutter/material.dart'; +import 'package:http/http.dart'; + +class PentryStatusProvider extends ChangeNotifier{ + + //reset provider data + void reset(){ + _items = null; + _stateCode = null; + } + + // state code of current request to defied error message + // like 400 customer request failed + // 500 service not available + int _stateCode; + int get stateCode => _stateCode; + + // contain user data + // when user not login or register _user = null + List _items; + List get items => _items; + + // when categories in-process _loading = true + // done _loading = true + // failed _loading = false + bool _loading; + bool get isLoading => _loading; + set isLoading(bool isLoading){ + _loading = isLoading; + notifyListeners(); + } + + /// return -2 if request in progress + /// return -1 if error happen when sending request + /// 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 getData ({String host,User user}) async { + if(_loading == true) + return -2; + _loading = true; + notifyListeners(); + Response response; + try{ + response = await get( + Uri.parse( + host + URLs.getPentryStatus), + ); + print(response.body); + _stateCode = response.statusCode; + if(response.statusCode >= 200 && response.statusCode < 300) { + // client's request was successfully received + List listJson = json.decode(utf8.decode(response.bodyBytes)); + _items = listJson.map((type) => Lookup.fromIntIdJson(type)).toList(); + } + _loading = false; + notifyListeners(); + return response.statusCode; + } catch(error) { + print(error); + _loading = false; + _stateCode = -1; + notifyListeners(); + return -1; + } + + } + +} \ No newline at end of file diff --git a/lib/controllers/providers/api/status_drop_down/pentry/pentry_task_status_provider.dart b/lib/controllers/providers/api/status_drop_down/pentry/pentry_task_status_provider.dart new file mode 100644 index 00000000..5bbedd0b --- /dev/null +++ b/lib/controllers/providers/api/status_drop_down/pentry/pentry_task_status_provider.dart @@ -0,0 +1,75 @@ +import 'dart:convert'; + +import 'package:test_sa/controllers/api_routes/urls.dart'; +import 'package:test_sa/models/lookup.dart'; +import 'package:test_sa/models/user.dart'; +import 'package:flutter/cupertino.dart'; +import 'package:flutter/material.dart'; +import 'package:http/http.dart'; + +class PentryTaskStatusProvider extends ChangeNotifier{ + + //reset provider data + void reset(){ + _items = null; + _stateCode = null; + } + + // state code of current request to defied error message + // like 400 customer request failed + // 500 service not available + int _stateCode; + int get stateCode => _stateCode; + + // contain user data + // when user not login or register _user = null + List _items; + List get items => _items; + + // when categories in-process _loading = true + // done _loading = true + // failed _loading = false + bool _loading; + bool get isLoading => _loading; + set isLoading(bool isLoading){ + _loading = isLoading; + notifyListeners(); + } + + /// return -2 if request in progress + /// return -1 if error happen when sending request + /// 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 getData ({String host,User user}) async { + if(_loading == true) + return -2; + _loading = true; + notifyListeners(); + Response response; + try{ + response = await get( + Uri.parse( + host + URLs.getPentryTaskStatus), + ); + print(response.body); + _stateCode = response.statusCode; + if(response.statusCode >= 200 && response.statusCode < 300) { + // client's request was successfully received + List categoriesListJson = json.decode(utf8.decode(response.bodyBytes)); + _items = categoriesListJson.map((type) => Lookup.fromIntIdJson(type)).toList(); + } + _loading = false; + notifyListeners(); + return response.statusCode; + } catch(error) { + print(error); + _loading = false; + _stateCode = -1; + notifyListeners(); + return -1; + } + + } + +} \ No newline at end of file diff --git a/lib/controllers/providers/api/status_drop_down/pentry/pentry_visit_status_provider.dart b/lib/controllers/providers/api/status_drop_down/pentry/pentry_visit_status_provider.dart new file mode 100644 index 00000000..a25a402f --- /dev/null +++ b/lib/controllers/providers/api/status_drop_down/pentry/pentry_visit_status_provider.dart @@ -0,0 +1,75 @@ +import 'dart:convert'; + +import 'package:test_sa/controllers/api_routes/urls.dart'; +import 'package:test_sa/models/lookup.dart'; +import 'package:test_sa/models/user.dart'; +import 'package:flutter/cupertino.dart'; +import 'package:flutter/material.dart'; +import 'package:http/http.dart'; + +class PentryVisitStatusProvider extends ChangeNotifier{ + + //reset provider data + void reset(){ + _items = null; + _stateCode = null; + } + + // state code of current request to defied error message + // like 400 customer request failed + // 500 service not available + int _stateCode; + int get stateCode => _stateCode; + + // contain user data + // when user not login or register _user = null + List _items; + List get items => _items; + + // when categories in-process _loading = true + // done _loading = true + // failed _loading = false + bool _loading; + bool get isLoading => _loading; + set isLoading(bool isLoading){ + _loading = isLoading; + notifyListeners(); + } + + /// return -2 if request in progress + /// return -1 if error happen when sending request + /// 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 getData ({String host,User user}) async { + if(_loading == true) + return -2; + _loading = true; + notifyListeners(); + Response response; + try{ + response = await get( + Uri.parse( + host + URLs.getPentryVisitStatus), + ); + print(response.body); + _stateCode = response.statusCode; + if(response.statusCode >= 200 && response.statusCode < 300) { + // client's request was successfully received + List listJson = json.decode(utf8.decode(response.bodyBytes)); + _items = listJson.map((type) => Lookup.fromIntIdJson(type)).toList(); + } + _loading = false; + notifyListeners(); + return response.statusCode; + } catch(error) { + print(error); + _loading = false; + _stateCode = -1; + notifyListeners(); + return -1; + } + + } + +} \ No newline at end of file diff --git a/lib/controllers/providers/api/status_drop_down/report/service_report_defect_types_provider.dart b/lib/controllers/providers/api/status_drop_down/report/service_report_defect_types_provider.dart new file mode 100644 index 00000000..3547e8cc --- /dev/null +++ b/lib/controllers/providers/api/status_drop_down/report/service_report_defect_types_provider.dart @@ -0,0 +1,75 @@ +import 'dart:convert'; + +import 'package:test_sa/controllers/api_routes/urls.dart'; +import 'package:test_sa/models/lookup.dart'; +import 'package:test_sa/models/user.dart'; +import 'package:flutter/cupertino.dart'; +import 'package:flutter/material.dart'; +import 'package:http/http.dart'; + +class ServiceRequestDefectTypesProvider extends ChangeNotifier{ + + //reset provider data + void reset(){ + _items = null; + _stateCode = null; + } + + // state code of current request to defied error message + // like 400 customer request failed + // 500 service not available + int _stateCode; + int get stateCode => _stateCode; + + // contain user data + // when user not login or register _user = null + List _items; + List get items => _items; + + // when categories in-process _loading = true + // done _loading = true + // failed _loading = false + bool _loading; + bool get isLoading => _loading; + set isLoading(bool isLoading){ + _loading = isLoading; + notifyListeners(); + } + + /// return -2 if request in progress + /// return -1 if error happen when sending request + /// 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 getData ({String host,User user}) async { + if(_loading == true) + return -2; + _loading = true; + notifyListeners(); + Response response; + try{ + response = await get( + Uri.parse( + host + URLs.getServiceReportDefectTypes), + ); + print(response.body); + _stateCode = response.statusCode; + if(response.statusCode >= 200 && response.statusCode < 300) { + // client's request was successfully received + List listJson = json.decode(utf8.decode(response.bodyBytes)); + _items = listJson.map((type) => Lookup.fromIntIdJson(type)).toList(); + } + _loading = false; + notifyListeners(); + return response.statusCode; + } catch(error) { + print(error); + _loading = false; + _stateCode = -1; + notifyListeners(); + return -1; + } + + } + +} \ No newline at end of file diff --git a/lib/controllers/providers/api/status_drop_down/report/service_report_last_calls_provider.dart b/lib/controllers/providers/api/status_drop_down/report/service_report_last_calls_provider.dart index b7ac8b79..20e9f7be 100644 --- a/lib/controllers/providers/api/status_drop_down/report/service_report_last_calls_provider.dart +++ b/lib/controllers/providers/api/status_drop_down/report/service_report_last_calls_provider.dart @@ -1,7 +1,7 @@ import 'dart:convert'; import 'package:test_sa/controllers/api_routes/urls.dart'; -import 'package:test_sa/models/status.dart'; +import 'package:test_sa/models/lookup.dart'; import 'package:test_sa/models/user.dart'; import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; @@ -24,8 +24,8 @@ class ServiceReportLastCallsProvider extends ChangeNotifier{ // contain user data // when user not login or register _user = null - List _calls; - List get calls => _calls; + List _calls; + List get calls => _calls; // when categories in-process _loading = true // done _loading = true @@ -59,7 +59,7 @@ class ServiceReportLastCallsProvider extends ChangeNotifier{ if(response.statusCode >= 200 && response.statusCode < 300) { // client's request was successfully received List categoriesListJson = json.decode(utf8.decode(response.bodyBytes)); - _calls = categoriesListJson.map((type) => Status.fromServiceReportJson(type)).toList(); + _calls = categoriesListJson.map((type) => Lookup.fromIntIdJson(type)).toList(); } _loading = false; notifyListeners(); diff --git a/lib/controllers/providers/api/status_drop_down/report/service_report_priority_provider.dart b/lib/controllers/providers/api/status_drop_down/report/service_report_priority_provider.dart new file mode 100644 index 00000000..bcee8d4c --- /dev/null +++ b/lib/controllers/providers/api/status_drop_down/report/service_report_priority_provider.dart @@ -0,0 +1,75 @@ +import 'dart:convert'; + +import 'package:test_sa/controllers/api_routes/urls.dart'; +import 'package:test_sa/models/lookup.dart'; +import 'package:test_sa/models/user.dart'; +import 'package:flutter/cupertino.dart'; +import 'package:flutter/material.dart'; +import 'package:http/http.dart'; + +class ServiceRequestPriorityProvider extends ChangeNotifier{ + + //reset provider data + void reset(){ + _items = null; + _stateCode = null; + } + + // state code of current request to defied error message + // like 400 customer request failed + // 500 service not available + int _stateCode; + int get stateCode => _stateCode; + + // contain user data + // when user not login or register _user = null + List _items; + List get items => _items; + + // when categories in-process _loading = true + // done _loading = true + // failed _loading = false + bool _loading; + bool get isLoading => _loading; + set isLoading(bool isLoading){ + _loading = isLoading; + notifyListeners(); + } + + /// return -2 if request in progress + /// return -1 if error happen when sending request + /// 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 getData ({String host,User user}) async { + if(_loading == true) + return -2; + _loading = true; + notifyListeners(); + Response response; + try{ + response = await get( + Uri.parse( + host + URLs.getServiceReportPriority), + ); + print(response.body); + _stateCode = response.statusCode; + if(response.statusCode >= 200 && response.statusCode < 300) { + // client's request was successfully received + List listJson = json.decode(utf8.decode(response.bodyBytes)); + _items = listJson.map((type) => Lookup.fromIntIdJson(type)).toList(); + } + _loading = false; + notifyListeners(); + return response.statusCode; + } catch(error) { + print(error); + _loading = false; + _stateCode = -1; + notifyListeners(); + return -1; + } + + } + +} \ No newline at end of file diff --git a/lib/controllers/providers/api/status_drop_down/report/service_report_reasons_provider.dart b/lib/controllers/providers/api/status_drop_down/report/service_report_reasons_provider.dart index 5d2f499d..b1f86f54 100644 --- a/lib/controllers/providers/api/status_drop_down/report/service_report_reasons_provider.dart +++ b/lib/controllers/providers/api/status_drop_down/report/service_report_reasons_provider.dart @@ -1,7 +1,7 @@ import 'dart:convert'; import 'package:test_sa/controllers/api_routes/urls.dart'; -import 'package:test_sa/models/status.dart'; +import 'package:test_sa/models/lookup.dart'; import 'package:test_sa/models/user.dart'; import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; @@ -23,8 +23,8 @@ class ServiceReportReasonsProvider extends ChangeNotifier{ // contain user data // when user not login or register _user = null - List _reasons; - List get reasons => _reasons; + List _reasons; + List get reasons => _reasons; // when categories in-process _loading = true // done _loading = true @@ -56,7 +56,7 @@ class ServiceReportReasonsProvider extends ChangeNotifier{ if(response.statusCode >= 200 && response.statusCode < 300) { // client's request was successfully received List categoriesListJson = json.decode(utf8.decode(response.bodyBytes)); - _reasons = categoriesListJson.map((type) => Status.fromServiceReportJson(type)).toList(); + _reasons = categoriesListJson.map((type) => Lookup.fromIntIdJson(type)).toList(); } _loading = false; notifyListeners(); diff --git a/lib/controllers/providers/api/status_drop_down/report/service_report_status_provider.dart b/lib/controllers/providers/api/status_drop_down/report/service_report_status_provider.dart index 1cc21f4c..6e98367c 100644 --- a/lib/controllers/providers/api/status_drop_down/report/service_report_status_provider.dart +++ b/lib/controllers/providers/api/status_drop_down/report/service_report_status_provider.dart @@ -1,7 +1,7 @@ import 'dart:convert'; import 'package:test_sa/controllers/api_routes/urls.dart'; -import 'package:test_sa/models/status.dart'; +import 'package:test_sa/models/lookup.dart'; import 'package:test_sa/models/user.dart'; import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; @@ -23,8 +23,8 @@ class ServiceReportStatusProvider extends ChangeNotifier{ // contain user data // when user not login or register _user = null - List _status; - List get statuses => _status; + List _status; + List get statuses => _status; // when categories in-process _loading = true // done _loading = true @@ -56,7 +56,7 @@ class ServiceReportStatusProvider extends ChangeNotifier{ if(response.statusCode >= 200 && response.statusCode < 300) { // client's request was successfully received List categoriesListJson = json.decode(utf8.decode(response.bodyBytes)); - _status = categoriesListJson.map((type) => Status.fromServiceReportJson(type)).toList(); + _status = categoriesListJson.map((type) => Lookup.fromIntIdJson(type)).toList(); } _loading = false; notifyListeners(); diff --git a/lib/controllers/providers/api/status_drop_down/report/service_report_types_provider.dart b/lib/controllers/providers/api/status_drop_down/report/service_report_types_provider.dart index 3737fc51..358440a1 100644 --- a/lib/controllers/providers/api/status_drop_down/report/service_report_types_provider.dart +++ b/lib/controllers/providers/api/status_drop_down/report/service_report_types_provider.dart @@ -1,7 +1,7 @@ import 'dart:convert'; import 'package:test_sa/controllers/api_routes/urls.dart'; -import 'package:test_sa/models/status.dart'; +import 'package:test_sa/models/lookup.dart'; import 'package:test_sa/models/user.dart'; import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; @@ -23,8 +23,8 @@ class ServiceReportTypesProvider extends ChangeNotifier{ // contain user data // when user not login or register _user = null - List _types; - List get types => _types; + List _types; + List get types => _types; // when categories in-process _loading = true // done _loading = true @@ -57,7 +57,7 @@ class ServiceReportTypesProvider extends ChangeNotifier{ if(response.statusCode >= 200 && response.statusCode < 300) { // client's request was successfully received List categoriesListJson = json.decode(utf8.decode(response.bodyBytes)); - _types = categoriesListJson.map((type) => Status.fromServiceReportJson(type)).toList(); + _types = categoriesListJson.map((type) => Lookup.fromIntIdJson(type)).toList(); } _loading = false; notifyListeners(); diff --git a/lib/controllers/providers/api/status_drop_down/report/service_types_provider.dart b/lib/controllers/providers/api/status_drop_down/report/service_types_provider.dart index 5cde5e9b..3fa2ddb3 100644 --- a/lib/controllers/providers/api/status_drop_down/report/service_types_provider.dart +++ b/lib/controllers/providers/api/status_drop_down/report/service_types_provider.dart @@ -1,7 +1,7 @@ import 'dart:convert'; import 'package:test_sa/controllers/api_routes/urls.dart'; -import 'package:test_sa/models/status.dart'; +import 'package:test_sa/models/lookup.dart'; import 'package:test_sa/models/user.dart'; import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; @@ -23,8 +23,8 @@ class ServiceStatusProvider extends ChangeNotifier{ // contain user data // when user not login or register _user = null - List _statuses; - List get statuses => _statuses; + List _statuses; + List get statuses => _statuses; // when categories in-process _loading = true // done _loading = true @@ -57,7 +57,7 @@ class ServiceStatusProvider extends ChangeNotifier{ if(response.statusCode >= 200 && response.statusCode < 300) { // client's request was successfully received List categoriesListJson = json.decode(utf8.decode(response.bodyBytes)); - _statuses = categoriesListJson.map((e) => Status.fromServiceReportJson(e)).toList(); + _statuses = categoriesListJson.map((e) => Lookup.fromIntIdJson(e)).toList(); } _loading = false; diff --git a/lib/main.dart b/lib/main.dart index 2cf47e62..0be3e414 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -11,6 +11,10 @@ import 'package:test_sa/controllers/providers/api/status_drop_down/employee/empl import 'package:test_sa/controllers/providers/api/status_drop_down/gas_refill/gas_cylinder_size_provider.dart'; import 'package:test_sa/controllers/providers/api/status_drop_down/gas_refill/gas_status_provider.dart'; import 'package:test_sa/controllers/providers/api/status_drop_down/gas_refill/gas_types_provider.dart'; +import 'package:test_sa/controllers/providers/api/status_drop_down/pentry/pentry_task_status_provider.dart'; +import 'package:test_sa/controllers/providers/api/status_drop_down/pentry/pentry_visit_status_provider.dart'; +import 'package:test_sa/controllers/providers/api/status_drop_down/report/service_report_defect_types_provider.dart'; +import 'package:test_sa/controllers/providers/api/status_drop_down/report/service_report_priority_provider.dart'; import 'package:test_sa/views/app_style/colors.dart'; import 'package:test_sa/views/pages/login.dart'; import 'package:test_sa/views/pages/register.dart'; @@ -33,6 +37,7 @@ import 'package:flutter_localizations/flutter_localizations.dart'; import 'package:provider/provider.dart'; import 'controllers/providers/api/parts_provider.dart'; import 'controllers/providers/api/preventive_maintenance_visits_provider.dart'; +import 'controllers/providers/api/status_drop_down/pentry/pentry_status_provider.dart'; import 'controllers/providers/api/status_drop_down/report/service_report_last_calls_provider.dart'; import 'controllers/providers/api/status_drop_down/report/service_report_reasons_provider.dart'; import 'controllers/providers/api/status_drop_down/report/service_report_status_provider.dart'; @@ -80,6 +85,11 @@ class MyApp extends StatelessWidget { ChangeNotifierProvider(create: (_) => GasRefillProvider()), ChangeNotifierProvider(create: (_) => DeviceTransferProvider()), ChangeNotifierProvider(create: (_) => EmployeesProvider()), + ChangeNotifierProvider(create: (_) => PentryTaskStatusProvider()), + ChangeNotifierProvider(create: (_) => PentryVisitStatusProvider()), + ChangeNotifierProvider(create: (_) => PentryStatusProvider()), + ChangeNotifierProvider(create: (_) => ServiceRequestPriorityProvider()), + ChangeNotifierProvider(create: (_) => ServiceRequestDefectTypesProvider()), ], child: GestureDetector( onTap: () { diff --git a/lib/models/device/device.dart b/lib/models/device/device.dart index a817b00e..b84b8715 100644 --- a/lib/models/device/device.dart +++ b/lib/models/device/device.dart @@ -1,6 +1,7 @@ class Device{ String id; String serialNumber; + String number; String brand; String model; DateTime productionDate; @@ -13,6 +14,7 @@ class Device{ Device({ this.id, this.serialNumber, + this.number, this.brand, this.model, this.productionDate, @@ -27,6 +29,7 @@ class Device{ return Device( id: parsedJson["nid"] ?? parsedJson["id"], serialNumber: parsedJson["sn"] ?? parsedJson["value"], + number: parsedJson["asset_no"], brand: parsedJson["brand"].toString(), model: parsedJson["model"].toString(), productionDate: getDateFromString(parsedJson["production_date"]), @@ -42,6 +45,7 @@ class Device{ return Device( id: device.id, serialNumber: device.serialNumber, + number: device.number, brand: device.brand, model: device.model, productionDate: device.productionDate, diff --git a/lib/models/device/device_transfer.dart b/lib/models/device/device_transfer.dart index 2cad5ed0..27379344 100644 --- a/lib/models/device/device_transfer.dart +++ b/lib/models/device/device_transfer.dart @@ -3,7 +3,7 @@ import 'package:test_sa/models/department.dart'; import 'package:test_sa/models/device/device.dart'; import 'package:test_sa/models/device/device_transfer_info.dart'; import 'package:test_sa/models/hospital.dart'; -import 'package:test_sa/models/status.dart'; +import 'package:test_sa/models/lookup.dart'; class DeviceTransfer{ String id; diff --git a/lib/models/device/device_transfer_info.dart b/lib/models/device/device_transfer_info.dart index f3f1d80d..3e8d0f8f 100644 --- a/lib/models/device/device_transfer_info.dart +++ b/lib/models/device/device_transfer_info.dart @@ -2,7 +2,7 @@ import 'package:http/http.dart'; import 'package:test_sa/models/department.dart'; import 'package:test_sa/models/device/device.dart'; import 'package:test_sa/models/hospital.dart'; -import 'package:test_sa/models/status.dart'; +import 'package:test_sa/models/lookup.dart'; class DeviceTransferInfo{ String userId; @@ -13,7 +13,7 @@ class DeviceTransferInfo{ String travelingHours; String name; String signature; - Status status; + Lookup status; DeviceTransferInfo({ this.userId, @@ -67,7 +67,7 @@ class DeviceTransferInfo{ comment: parsedJson["${key}comment"], client: Hospital.fromJson(parsedJson["${key}client"]), department: Department.fromJson(parsedJson["${key}department"]), - status: Status.fromJson(parsedJson["${key}status"]), + status: Lookup.fromJson(parsedJson["${key}status"]), ); } } diff --git a/lib/models/gas_refill/gas_refill_details.dart b/lib/models/gas_refill/gas_refill_details.dart index 35ed91fa..f150e150 100644 --- a/lib/models/gas_refill/gas_refill_details.dart +++ b/lib/models/gas_refill/gas_refill_details.dart @@ -1,8 +1,8 @@ -import 'package:test_sa/models/status.dart'; +import 'package:test_sa/models/lookup.dart'; class GasRefillDetails{ - Status type; - Status cylinderSize; + Lookup type; + Lookup cylinderSize; int requestedQuantity; int deliveredQuantity; @@ -21,9 +21,9 @@ class GasRefillDetails{ } factory GasRefillDetails.fromJson(Map parsedJson){ return GasRefillDetails( - type: Status.fromJson(parsedJson["type"]), + type: Lookup.fromJson(parsedJson["type"]), - cylinderSize: Status.fromJson(parsedJson["size"]), + cylinderSize: Lookup.fromJson(parsedJson["size"]), requestedQuantity: parsedJson["requsted_qty"] == null ? 0 : int.tryParse(parsedJson["requsted_qty"].toString()) ?? 0, deliveredQuantity: parsedJson["deliverd_qty"] == null @@ -33,8 +33,8 @@ class GasRefillDetails{ factory GasRefillDetails.fromDetails(GasRefillDetails details){ return GasRefillDetails( - type: Status.fromStatus(details.type), - cylinderSize:Status.fromStatus(details.cylinderSize), + type: Lookup.fromStatus(details.type), + cylinderSize:Lookup.fromStatus(details.cylinderSize), requestedQuantity: details.requestedQuantity, deliveredQuantity: details.deliveredQuantity, ); diff --git a/lib/models/gas_refill/gas_refill_model.dart b/lib/models/gas_refill/gas_refill_model.dart index b0941c2b..28773fac 100644 --- a/lib/models/gas_refill/gas_refill_model.dart +++ b/lib/models/gas_refill/gas_refill_model.dart @@ -1,12 +1,12 @@ import 'package:test_sa/models/gas_refill/gas_refill_details.dart'; -import 'package:test_sa/models/status.dart'; +import 'package:test_sa/models/lookup.dart'; class GasRefillModel{ String id; String userId; String clientName; String title; - Status status; + Lookup status; List details; GasRefillModel({ @@ -30,7 +30,7 @@ class GasRefillModel{ userId = model.userId; clientName = model.clientName; title = model.title; - status = Status.fromStatus(model.status); + status = Lookup.fromStatus(model.status); details = model.details.map((e) => GasRefillDetails.fromDetails(e)).toList(); } @@ -45,7 +45,7 @@ class GasRefillModel{ userId: parsedJson["uid"], title: parsedJson["title"], clientName: parsedJson["client"], - status: Status.fromJson(parsedJson["status"]), + status: Lookup.fromJson(parsedJson["status"]), details: details, ); } diff --git a/lib/models/status.dart b/lib/models/lookup.dart similarity index 68% rename from lib/models/status.dart rename to lib/models/lookup.dart index 79786f40..a52a1698 100644 --- a/lib/models/status.dart +++ b/lib/models/lookup.dart @@ -1,10 +1,10 @@ -class Status{ +class Lookup{ final String label; final String key; final int id; - const Status({ + const Lookup({ this.label, this.key, this.id, @@ -12,7 +12,7 @@ class Status{ @override bool operator == (Object other) => - identical(this, other) || other is Status && + identical(this, other) || other is Lookup && key == other.key && id == other.id; @@ -20,17 +20,17 @@ class Status{ @override int get hashCode => id.hashCode; - factory Status.fromStatus(Status old){ - return Status( + factory Lookup.fromStatus(Lookup old){ + return Lookup( label: old.label, id: old.id, key: old.key, ); } - factory Status.fromJson(Map parsedJson){ + factory Lookup.fromJson(Map parsedJson){ if(parsedJson["id"] == null && parsedJson["uid"] == null) return null; - return Status( + return Lookup( label: parsedJson["value"], id: parsedJson["id"] is int ? parsedJson["id"] @@ -38,8 +38,8 @@ class Status{ ); } - factory Status.fromServiceReportJson(Map parsedJson){ - return Status( + factory Lookup.fromIntIdJson(Map parsedJson){ + return Lookup( label: parsedJson["value"], id: parsedJson["id"], ); diff --git a/lib/models/pantry/calibration_tools.dart b/lib/models/pantry/calibration_tools.dart new file mode 100644 index 00000000..2c70c6d2 --- /dev/null +++ b/lib/models/pantry/calibration_tools.dart @@ -0,0 +1,26 @@ +import 'package:test_sa/models/lookup.dart'; + +class CalibrationTool{ + Lookup assetsNumber; + DateTime dataOfTesting; + + CalibrationTool({ + this.assetsNumber, + this.dataOfTesting, + }); + + Map toMap() { + return { + if(assetsNumber != null) 'assetsSN': (assetsNumber?.id).toString(), + if(dataOfTesting != null) 'dataOfTesting': (dataOfTesting.millisecondsSinceEpoch ~/ 1000).toString(), + }; + } + + factory CalibrationTool.fromMap(Map map) { + return CalibrationTool( + assetsNumber: Lookup.fromJson(map['assetsSN']), + dataOfTesting: map['dataOfTesting'] == null || map['dataOfTesting'] == "" ? null : + DateTime.fromMillisecondsSinceEpoch(int.tryParse(map['dataOfTesting']) * 1000), + ); + } +} \ No newline at end of file diff --git a/lib/models/pantry/contact.dart b/lib/models/pantry/contact.dart new file mode 100644 index 00000000..50748bea --- /dev/null +++ b/lib/models/pantry/contact.dart @@ -0,0 +1,41 @@ +import 'package:test_sa/models/lookup.dart'; + +class Contact{ + Lookup title; + Lookup contactPerson; + String job; + String email; + String telephone; + String landLine; + + Contact({ + this.title, + this.contactPerson, + this.job, + this.email, + this.telephone, + this.landLine + }); + + Map toMap() { + return { + if (title != null) 'title': title.id.toString(), + if (contactPerson != null) 'contactPerson': contactPerson.id.toString(), + if (job != null) 'job': job, + if (email != null) 'email': email, + if (telephone != null) 'telephone': telephone, + if (landLine != null) 'landLine': landLine, + }; + } + + factory Contact.fromMap(Map map) { + return Contact( + title: map['title'] as Lookup, + contactPerson: map['contactPerson'] as Lookup, + job: map['job'] as String, + email: map['email'] as String, + telephone: map['telephone'] as String, + landLine: map['landLine'] as String, + ); + } +} \ No newline at end of file diff --git a/lib/models/pantry/lookups/contact_person.dart b/lib/models/pantry/lookups/contact_person.dart new file mode 100644 index 00000000..5231712c --- /dev/null +++ b/lib/models/pantry/lookups/contact_person.dart @@ -0,0 +1,15 @@ +import 'package:test_sa/models/lookup.dart'; + +class ContactTitle extends Lookup { + ContactTitle({ + int id, + String label + }):super(id: id,label: label); + + factory ContactTitle.fromMap(Map parsedJson){ + return ContactTitle( + label: parsedJson["value"], + id: parsedJson["id"], + ); + } +} \ No newline at end of file diff --git a/lib/models/pantry/lookups/contact_title.dart b/lib/models/pantry/lookups/contact_title.dart new file mode 100644 index 00000000..5231712c --- /dev/null +++ b/lib/models/pantry/lookups/contact_title.dart @@ -0,0 +1,15 @@ +import 'package:test_sa/models/lookup.dart'; + +class ContactTitle extends Lookup { + ContactTitle({ + int id, + String label + }):super(id: id,label: label); + + factory ContactTitle.fromMap(Map parsedJson){ + return ContactTitle( + label: parsedJson["value"], + id: parsedJson["id"], + ); + } +} \ No newline at end of file diff --git a/lib/models/pantry/pentry.dart b/lib/models/pantry/pentry.dart new file mode 100644 index 00000000..cee31181 --- /dev/null +++ b/lib/models/pantry/pentry.dart @@ -0,0 +1,121 @@ +import 'dart:convert'; +import 'dart:io'; + +import 'package:test_sa/models/lookup.dart'; +import 'package:test_sa/models/pantry/calibration_tools.dart'; +import 'package:test_sa/models/pantry/contact.dart'; +import 'package:test_sa/models/pantry/pm_kit.dart'; +import 'package:test_sa/models/pantry/ppm_check_list.dart'; +import 'package:test_sa/models/timer_model.dart'; + +class Pentry{ + Lookup ppmVisitStatus; + Lookup status; + TimerModel timer; + DateTime actualVisitDate; + String travelingHours; + String image; + File imageFile; + // List contacts; + List ppmCheckLists; + List calibrationTools; + List pmKits; + + Pentry({ + this.travelingHours, + this.timer, + this.status, + this.ppmVisitStatus, + this.actualVisitDate, + this.image, + this.imageFile, + // this.contacts, + this.ppmCheckLists, + this.calibrationTools, + this.pmKits, + }); + + bool validate(){ + if(actualVisitDate == null) return false; + if(timer == null && timer.endAt != null) return false; + if(ppmVisitStatus == null) return false; + //if(status == null) return false; + + return true; + } + + Map toMap() { + Map map = {}; + map["visit_status"] = ppmVisitStatus?.id.toString(); + if(status != null) map["pentry_status"] = status?.id.toString(); + if(travelingHours != null) map["traveling_hours"] = travelingHours; + if(imageFile != null) map["file_attachement"] = base64Encode(imageFile.readAsBytesSync()); + map["actual_date"] = (actualVisitDate.millisecondsSinceEpoch / 1000).toStringAsFixed(0); + if(timer != null){ + map["start_date"] = (timer.startAt.millisecondsSinceEpoch / 1000).toStringAsFixed(0); + map["end_date"] = ((timer.endAt ?? DateTime.now()).millisecondsSinceEpoch / 1000).toStringAsFixed(0); + map["working_hours"] = (timer.durationInSecond / 60 / 60).toStringAsFixed(5); + } + // if(contacts?.isNotEmpty == true) { + // for(int i = 0;i e.toMap()).toList()); + map["calibrationTools"] = jsonEncode(calibrationTools.map((e) => e.toMap()).toList()); + map["pmKits"] = jsonEncode(pmKits.map((e) => e.toMap()).toList()); + return map; + } + + factory Pentry.fromMap(Map map) { + // List contacts = []; + // if(map['contacts'] != null){ + // contacts =(map['contacts'] as List) + // .map((e) => Contact.fromMap(e as Map)) + // .toList(); + // } + + List pmKits = []; + if(map['pmKits'] != null){ + pmKits =(map['pmKits'] as List) + .map((e) => PMKit.fromMap(e as Map)) + .toList(); + } + + List ppmCheckLists = []; + if(map['ppmCheckLists'] != null){ + ppmCheckLists =(map['ppmCheckLists'] as List) + .map((e) => PPMCheckList.fromMap(e as Map)) + .toList(); + } + + List calibrationTools = []; + if(map['calibrationTools'] != null){ + calibrationTools =(map['calibrationTools'] as List) + .map((e) => CalibrationTool.fromMap(e as Map)) + .toList(); + } + return Pentry( + status: Lookup.fromJson(map["pentry_status"]), + ppmVisitStatus: Lookup.fromJson(map["visit_status"]), + actualVisitDate: getDate(map["actual_date"]), + travelingHours: map["traveling_hours"], + timer: TimerModel( + startAt: getDate(map["start_date"]), + endAt: getDate(map["end_date"]), + durationInSecond: (int.tryParse(map["working_hours"] ?? "") ?? 0) * 60 *60 + ), + // contacts: contacts, + ppmCheckLists: ppmCheckLists, + calibrationTools: calibrationTools, + pmKits: pmKits, + ); + } + + static getDate(String date){ + return date == null || date.isEmpty + ? null : DateTime.fromMillisecondsSinceEpoch(int.tryParse(date) * 1000); + } +} \ No newline at end of file diff --git a/lib/models/pantry/pm_kit.dart b/lib/models/pantry/pm_kit.dart new file mode 100644 index 00000000..0a008e5f --- /dev/null +++ b/lib/models/pantry/pm_kit.dart @@ -0,0 +1,45 @@ +import 'package:test_sa/models/lookup.dart'; + +class PMKit{ + Lookup itemCode; + String itemName; + String preparationTimeFrame; + String kitFrequencyDemand; + String availability; + String quantityNeeded; + String quantityReserved; + + PMKit({ + this.itemCode, + this.itemName, + this.preparationTimeFrame, + this.kitFrequencyDemand, + this.availability, + this.quantityNeeded, + this.quantityReserved + }); + + Map toMap() { + return { + if(itemCode != null) 'itemCode': (itemCode?.id).toString(), + if(itemName != null) 'itemName': itemName, + if(preparationTimeFrame != null) 'preparationTimeFrame': preparationTimeFrame, + if(kitFrequencyDemand != null) 'kitFrequencyDemand': kitFrequencyDemand, + if(availability != null) 'availability': availability, + if(quantityNeeded != null) 'quantityNeeded': quantityNeeded, + if(quantityReserved != null) 'quantityReserved': quantityReserved, + }; + } + + factory PMKit.fromMap(Map map) { + return PMKit( + itemCode: Lookup.fromJson(map['itemCode']), + itemName: map['itemName'] as String, + preparationTimeFrame: map['preparationTimeFrame'] as String, + kitFrequencyDemand: map['kitFrequencyDemand'] as String, + availability: map['availability'] as String, + quantityNeeded: map['quantityNeeded'] as String, + quantityReserved: map['quantityReserved'] as String, + ); + } +} \ No newline at end of file diff --git a/lib/models/pantry/ppm_check_list.dart b/lib/models/pantry/ppm_check_list.dart new file mode 100644 index 00000000..8f1a14d7 --- /dev/null +++ b/lib/models/pantry/ppm_check_list.dart @@ -0,0 +1,33 @@ +import 'package:test_sa/models/lookup.dart'; + +class PPMCheckList{ + Lookup status; + String title; + String comment; + String measuredValue; + + PPMCheckList({ + this.title, + this.status, + this.comment, + this.measuredValue, + }); + + Map toMap() { + return { + if(status != null) 'status': status?.id.toString(), + if(title != null) 'title': title, + if(comment != null) 'comment': comment, + if(measuredValue != null) 'measuredValue': measuredValue, + }; + } + + factory PPMCheckList.fromMap(Map map) { + return PPMCheckList( + status: Lookup.fromJson(map['status']), + title: map['title'] as String, + comment: map['comment'] as String, + measuredValue: map['measuredValue'] as String, + ); + } +} \ No newline at end of file diff --git a/lib/models/service_report.dart b/lib/models/service_report.dart index 7737c9f5..33bb2fd2 100644 --- a/lib/models/service_report.dart +++ b/lib/models/service_report.dart @@ -2,7 +2,7 @@ import 'dart:convert'; import 'package:test_sa/models/device/device.dart'; import 'package:test_sa/models/part.dart'; -import 'package:test_sa/models/status.dart'; +import 'package:test_sa/models/lookup.dart'; import 'package:test_sa/models/timer_model.dart'; class ServiceReport { @@ -10,11 +10,11 @@ class ServiceReport { String operatingHours; DateTime visitDate; DateTime endDate; - Status serviceType; - Status callLastSituation; - Status status; - Status type; - Status reason; + Lookup serviceType; + Lookup callLastSituation; + Lookup status; + Lookup type; + Lookup reason; String faultDescription; String workPreformed; //String workHours; @@ -90,7 +90,6 @@ class ServiceReport { } bool validate(){ - if(visitDate == null) return false; if(serviceType == null) return false; if(status == null) return false; @@ -120,11 +119,11 @@ class ServiceReport { } return ServiceReport( id: id, - serviceType: Status.fromJson(parsedJson["service_type"]), - callLastSituation: Status.fromJson(parsedJson["call_last_situtation"]), - reason: Status.fromJson(parsedJson["reasons"]), - status: Status.fromJson(parsedJson["service_report_status"]), - type: Status.fromJson(parsedJson["service_report_type"]), + serviceType: Lookup.fromJson(parsedJson["service_type"]), + callLastSituation: Lookup.fromJson(parsedJson["call_last_situtation"]), + reason: Lookup.fromJson(parsedJson["reasons"]), + status: Lookup.fromJson(parsedJson["service_report_status"]), + type: Lookup.fromJson(parsedJson["service_report_type"]), faultDescription: parsedJson["fault_description"], endDate:getDate(parsedJson["end_date"]), invoiceCode: parsedJson["invoice_code"], diff --git a/lib/models/service_request/service_request.dart b/lib/models/service_request/service_request.dart index 81ea6744..ae6f9370 100644 --- a/lib/models/service_request/service_request.dart +++ b/lib/models/service_request/service_request.dart @@ -1,3 +1,5 @@ +import 'package:test_sa/models/lookup.dart'; + import '../timer_model.dart'; class ServiceRequest{ @@ -27,6 +29,9 @@ class ServiceRequest{ DateTime nextVisitDate; String jobSheetNumber; String reportID; + String deviceNumber; + Lookup priority; + Lookup defectType; ServiceRequest({ this.id, @@ -55,6 +60,9 @@ class ServiceRequest{ this.nextVisitDate, this.workPerformed, this.reportID, + this.defectType, + this.priority, + this.deviceNumber, }); @@ -63,6 +71,7 @@ class ServiceRequest{ id: parsedJson["nid"], requestCode: parsedJson["call_id"] ?? parsedJson["jobcode"] , hospitalName: parsedJson["call_client"], + deviceNumber: parsedJson["device_no"], deviceId: parsedJson["deviceid"], audio: parsedJson["audio"] ?? "", deviceArName: parsedJson["equipment_arabic_name"] == false diff --git a/lib/models/user.dart b/lib/models/user.dart index 10fb06be..b091856f 100644 --- a/lib/models/user.dart +++ b/lib/models/user.dart @@ -9,7 +9,6 @@ class User{ String password; String email; String image; - String hospitalID; Hospital hospital; Department department; UsersTypes type; diff --git a/lib/models/visits/visit.dart b/lib/models/visits/visit.dart index 55071bf9..da3a2143 100644 --- a/lib/models/visits/visit.dart +++ b/lib/models/visits/visit.dart @@ -1,4 +1,4 @@ -import 'package:test_sa/models/status.dart'; +import 'package:test_sa/models/lookup.dart'; import 'package:test_sa/models/timer_model.dart'; class Visit{ @@ -16,8 +16,9 @@ class Visit{ String employName; String modelAndBrand; String contactStatus; - Status status; + Lookup status; String assignTo; + String deviceNumber; List images; Visit({ @@ -38,6 +39,7 @@ class Visit{ this.contactStatus, this.images, this.assignTo, + this.deviceNumber, }); factory Visit.fromJson(Map parsedJson){ @@ -45,6 +47,7 @@ class Visit{ id: parsedJson["nid"], serialNumber: parsedJson["title"], hospitalId: parsedJson["client"], + deviceNumber: parsedJson["device_no"], hospitalName: parsedJson["client_name"], deviceId: parsedJson["medical_equipment_nid"], deviceSerialNumber: parsedJson["medical_equipment"], @@ -57,7 +60,7 @@ class Visit{ modelAndBrand: parsedJson["mode_brand"], contactStatus: parsedJson["contactStatus"], images: List.from(parsedJson["images"] ?? []), - status: Status( + status: Lookup( id: int.tryParse(parsedJson["status"] ?? "-1"), // actual value (0,1,2) label: parsedJson["status_value"] // text value ), diff --git a/lib/models/visits/visits_group.dart b/lib/models/visits/visits_group.dart index b408e934..abe6dfc0 100644 --- a/lib/models/visits/visits_group.dart +++ b/lib/models/visits/visits_group.dart @@ -1,5 +1,5 @@ -import 'package:test_sa/models/status.dart'; +import 'package:test_sa/models/lookup.dart'; import 'package:test_sa/models/visits/visit.dart'; class VisitsGroup{ @@ -8,8 +8,8 @@ class VisitsGroup{ String travelingHours; String jobSheetNumber; String image; - Status status; - Status taskStatus; + Lookup status; + Lookup taskStatus; DateTime date; List visits; diff --git a/lib/views/app_style/colors.dart b/lib/views/app_style/colors.dart index 6d87c5f3..58f7d442 100644 --- a/lib/views/app_style/colors.dart +++ b/lib/views/app_style/colors.dart @@ -1,5 +1,5 @@ import 'package:flutter/material.dart'; -import 'package:test_sa/models/status.dart'; +import 'package:test_sa/models/lookup.dart'; class AColors { AColors._(); static const Color white = Color(0xffffffff); diff --git a/lib/views/pages/device_transfer/track_device_transfer.dart b/lib/views/pages/device_transfer/track_device_transfer.dart index 02da4946..7308617f 100644 --- a/lib/views/pages/device_transfer/track_device_transfer.dart +++ b/lib/views/pages/device_transfer/track_device_transfer.dart @@ -65,7 +65,7 @@ class _TrackDeviceTransferPageState extends State Expanded( child: Center( child: Text( - _subtitle.serviceRequests, + "Device Transfer", style: Theme.of(context).textTheme.headline6.copyWith( color: AColors.white, fontStyle: FontStyle.italic diff --git a/lib/views/pages/user/land_page.dart b/lib/views/pages/user/land_page.dart index d29f3600..c305b4ab 100644 --- a/lib/views/pages/user/land_page.dart +++ b/lib/views/pages/user/land_page.dart @@ -280,45 +280,46 @@ class _LandPageState extends State { }, ), - Expanded( - child: MaterialButton( - splashColor: AColors.secondaryColor.withOpacity(.5), - child: Row( - mainAxisAlignment: MainAxisAlignment.center, - children: [ - Container( - padding: EdgeInsets.all(12), - decoration: BoxDecoration( - borderRadius: BorderRadius.circular( - 8 * AppStyle.getScaleFactor(context) - ), - color: AColors.onPrimaryColor - ), - child: Icon( - Icons.phone_in_talk, - color: AColors.primaryColor , - size: 32, - ), - ), - SizedBox( - width: 12 * AppStyle.getScaleFactor(context), - ), - Text( - "${_subtitle.hotLine}\n15564", - - style: Theme.of(context).textTheme.headline6.copyWith( - color: AColors.white, - letterSpacing: 2.75, - fontWeight: FontWeight.bold - ), - ), - ], - ), - onPressed: (){ - launch("tel:15564"); - }, - ), - ), + Spacer(), + // Expanded( + // child: MaterialButton( + // splashColor: AColors.secondaryColor.withOpacity(.5), + // child: Row( + // mainAxisAlignment: MainAxisAlignment.center, + // children: [ + // Container( + // padding: EdgeInsets.all(12), + // decoration: BoxDecoration( + // borderRadius: BorderRadius.circular( + // 8 * AppStyle.getScaleFactor(context) + // ), + // color: AColors.onPrimaryColor + // ), + // child: Icon( + // Icons.phone_in_talk, + // color: AColors.primaryColor , + // size: 32, + // ), + // ), + // SizedBox( + // width: 12 * AppStyle.getScaleFactor(context), + // ), + // Text( + // "${_subtitle.hotLine}\n ", + // + // style: Theme.of(context).textTheme.headline6.copyWith( + // color: AColors.white, + // letterSpacing: 2.75, + // fontWeight: FontWeight.bold + // ), + // ), + // ], + // ), + // onPressed: (){ + // //launch("tel:15564"); + // }, + // ), + // ), AIconButton( iconData: Icons.notifications, onPressed: (){ @@ -349,7 +350,6 @@ class _LandPageState extends State { onPressed: (){ Navigator.of(context).pop(); Navigator.of(context).pushNamed(ProfilePage.id); - }, child: Column( mainAxisAlignment: MainAxisAlignment.center, @@ -366,9 +366,7 @@ class _LandPageState extends State { shape: BoxShape.circle ), child: ClipOval( - child: ImageLoader( - url: "https://cdn.business2community.com/wp-content/uploads/2017/08/blank-profile-picture-973460_640.png", - ), + child: Icon(Icons.person,size: 72,color: Theme.of(context).colorScheme.primary,), ), ), Text( @@ -419,20 +417,20 @@ class _LandPageState extends State { ), ], ), - DrawerItem( - icon: FontAwesomeIcons.linkedinIn, - title: _subtitle.linkedIn, - onPressed: (){ - launch("https://www.linkedin.com/company/Test SA/"); - }, - ), - DrawerItem( - icon: FontAwesomeIcons.globe, - title: _subtitle.ourWebsite, - onPressed: (){ - launch("https://www.Test SA.com/"); - }, - ), + // DrawerItem( + // icon: FontAwesomeIcons.linkedinIn, + // title: _subtitle.linkedIn, + // onPressed: (){ + // launch("https://www.linkedin.com/company/Test SA/"); + // }, + // ), + // DrawerItem( + // icon: FontAwesomeIcons.globe, + // title: _subtitle.ourWebsite, + // onPressed: (){ + // launch("https://www.Test SA.com/"); + // }, + // ), DrawerItem( icon: Icons.share, title: _subtitle.shareApp, diff --git a/lib/views/pages/user/requests/create_request.dart b/lib/views/pages/user/requests/create_request.dart index 104ce32e..705bb177 100644 --- a/lib/views/pages/user/requests/create_request.dart +++ b/lib/views/pages/user/requests/create_request.dart @@ -24,6 +24,9 @@ import 'package:test_sa/views/widgets/images/multi_image_picker.dart'; import 'package:test_sa/views/widgets/loaders/loading_manager.dart'; import 'package:test_sa/views/widgets/sound/record_sound.dart'; import 'package:test_sa/views/widgets/speech_to_text/speech_to_text.dart'; +import 'package:test_sa/views/widgets/status/service_request/service_request_defect_types_mune.dart'; +import 'package:test_sa/views/widgets/status/service_request/service_request_priority_mune.dart'; +import 'package:test_sa/views/widgets/titles/app_sub_title.dart'; class CreateRequestPage extends StatefulWidget { static final String id = "/create-request"; @override @@ -120,9 +123,9 @@ class _CreateRequestPageState extends State { enable: false, initialValue: _userProvider.user.hospital?.name ?? _subtitle.noHospitalFound, hintText: _subtitle.hospital, - prefixIconData: FontAwesomeIcons.hospitalAlt, + prefixIconData: FontAwesomeIcons.hospital, prefixIconSize: 36, - style: Theme.of(context).textTheme.headline6, + style: Theme.of(context).textTheme.subtitle1, ), const SizedBox(height: 8,), _userProvider.user.department == null ? SizedBox.shrink() : @@ -132,7 +135,7 @@ class _CreateRequestPageState extends State { hintText: _subtitle.unite, prefixIconData: FontAwesomeIcons.hospitalUser, prefixIconSize: 36, - style: Theme.of(context).textTheme.headline6, + style: Theme.of(context).textTheme.subtitle1, ), const SizedBox(height: 8,), DeviceButton( @@ -142,6 +145,24 @@ class _CreateRequestPageState extends State { setState(() {}); }, ), + const SizedBox(height: 8,), + const ASubTitle("Priority"), + const SizedBox(height: 4,), + ServiceRequestPriorityMenu( + initialValue: _serviceRequest.priority, + onSelect: (status){ + _serviceRequest.priority = status; + }, + ), + const SizedBox(height: 8,), + const ASubTitle("Defect Type"), + const SizedBox(height: 4,), + ServiceRequestDefectTypesMenu( + initialValue: _serviceRequest.defectType, + onSelect: (status){ + _serviceRequest.defectType = status; + }, + ), MultiImagesPicker( label: _subtitle.deviceImages, images: _deviceImages, diff --git a/lib/views/pages/user/requests/report/create_service_report.dart b/lib/views/pages/user/requests/report/create_service_report.dart index b509b58d..b9f353be 100644 --- a/lib/views/pages/user/requests/report/create_service_report.dart +++ b/lib/views/pages/user/requests/report/create_service_report.dart @@ -12,7 +12,7 @@ import 'package:test_sa/models/device/device.dart'; import 'package:test_sa/models/part.dart'; import 'package:test_sa/models/service_report.dart'; import 'package:test_sa/models/service_request/service_request.dart'; -import 'package:test_sa/models/status.dart'; +import 'package:test_sa/models/lookup.dart'; import 'package:test_sa/models/subtitle.dart'; import 'package:test_sa/views/app_style/colors.dart'; import 'package:test_sa/views/app_style/sizing.dart'; @@ -68,7 +68,7 @@ class _CreateServiceReportState extends State with TickerPr void initState() { _serviceReport = ServiceReport( visitDate: DateTime.now(), - type: const Status(id: 2), + type: const Lookup(id: 2), device: Device( id: widget.request.deviceId, serialNumber: widget.request.deviceSerialNumber, @@ -159,25 +159,25 @@ class _CreateServiceReportState extends State with TickerPr Row( children: [ // Report Status - Expanded( - child: Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - ASubTitle(_subtitle.reportType), - _validate && _serviceReport.type == null ? - ASubTitle(_subtitle.requiredWord,color: Colors.red,): - const SizedBox.shrink(), - const SizedBox(height: 4,), - ServiceReportTypeMenu( - initialValue: _serviceReport.type, - onSelect: (status){ - _serviceReport.type = status; - }, - ), - ], - ), - ), - const SizedBox(width: 8,), + // Expanded( + // child: Column( + // crossAxisAlignment: CrossAxisAlignment.start, + // children: [ + // ASubTitle(_subtitle.reportType), + // _validate && _serviceReport.type == null ? + // ASubTitle(_subtitle.requiredWord,color: Colors.red,): + // const SizedBox.shrink(), + // const SizedBox(height: 4,), + // ServiceReportTypeMenu( + // initialValue: _serviceReport.type, + // onSelect: (status){ + // _serviceReport.type = status; + // }, + // ), + // ], + // ), + // ), + // const SizedBox(width: 8,), // visit date Expanded( child: Column( @@ -490,9 +490,9 @@ class _CreateServiceReportState extends State with TickerPr textAlign: TextAlign.center, hintText: "i.e 3, 3.5, 4", style: Theme.of(context).textTheme.subtitle1, - validator: (value) => - Validator.isNumeric(value) - ? null : _subtitle.requiredWord, + // validator: (value) => + // Validator.isNumeric(value) + // ? null : _subtitle.requiredWord, textInputType: TextInputType.number, onSaved: (value){ _serviceReport.travelingHours = value; @@ -507,29 +507,29 @@ class _CreateServiceReportState extends State with TickerPr // Operating Hours and Job Sheet Number Row( children: [ - Expanded( - child: Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - ASubTitle(_subtitle.operatingHours), - const SizedBox(height: 4,), - ATextFormField( - initialValue: _serviceReport?.operatingHours, - textAlign: TextAlign.center, - hintText: "i.e 3, 3.5, 4", - style: Theme.of(context).textTheme.subtitle1, - validator: (value) => - Validator.isNumeric(value) - ? null : _subtitle.requiredWord, - textInputType: TextInputType.number, - onSaved: (value){ - _serviceReport.operatingHours = value; - }, - ), - ], - ), - ), - const SizedBox(width: 8,), + // Expanded( + // child: Column( + // crossAxisAlignment: CrossAxisAlignment.start, + // children: [ + // ASubTitle(_subtitle.operatingHours), + // const SizedBox(height: 4,), + // ATextFormField( + // initialValue: _serviceReport?.operatingHours, + // textAlign: TextAlign.center, + // hintText: "i.e 3, 3.5, 4", + // style: Theme.of(context).textTheme.subtitle1, + // validator: (value) => + // Validator.isNumeric(value) + // ? null : _subtitle.requiredWord, + // textInputType: TextInputType.number, + // onSaved: (value){ + // _serviceReport.operatingHours = value; + // }, + // ), + // ], + // ), + // ), + // const SizedBox(width: 8,), Expanded( child: Column( crossAxisAlignment: CrossAxisAlignment.start, diff --git a/lib/views/pages/user/requests/report/edit_service_report.dart b/lib/views/pages/user/requests/report/edit_service_report.dart index aeed77b5..1ca58282 100644 --- a/lib/views/pages/user/requests/report/edit_service_report.dart +++ b/lib/views/pages/user/requests/report/edit_service_report.dart @@ -12,7 +12,7 @@ import 'package:test_sa/models/device/device.dart'; import 'package:test_sa/models/part.dart'; import 'package:test_sa/models/service_report.dart'; import 'package:test_sa/models/service_request/service_request.dart'; -import 'package:test_sa/models/status.dart'; +import 'package:test_sa/models/lookup.dart'; import 'package:test_sa/models/subtitle.dart'; import 'package:test_sa/views/app_style/colors.dart'; import 'package:test_sa/views/app_style/sizing.dart'; diff --git a/lib/views/pages/user/requests/request_details.dart b/lib/views/pages/user/requests/request_details.dart index c9e78584..5e2d80f9 100644 --- a/lib/views/pages/user/requests/request_details.dart +++ b/lib/views/pages/user/requests/request_details.dart @@ -182,6 +182,10 @@ class RequestDetailsPage extends StatelessWidget { title: _subtitle.code, info: serviceRequest.requestCode, ), + RequestInfoRow( + title: "Asset Number", + info: serviceRequest.deviceNumber, + ), RequestInfoRow( title: _subtitle.deviceSN, info: serviceRequest.deviceSerialNumber, @@ -230,10 +234,10 @@ class RequestDetailsPage extends StatelessWidget { title: _subtitle.unite, info: serviceRequest.departmentName, ), - RequestInfoRow( - title: _subtitle.deviceArName, - content: serviceRequest.deviceArName, - ), + // RequestInfoRow( + // title: _subtitle.deviceArName, + // content: serviceRequest.deviceArName, + // ), RequestInfoRow( title: _subtitle.deviceEnName, content: serviceRequest.deviceEnName, diff --git a/lib/views/pages/user/visits/pantry/edit_pentry.dart b/lib/views/pages/user/visits/pantry/edit_pentry.dart new file mode 100644 index 00000000..6b508552 --- /dev/null +++ b/lib/views/pages/user/visits/pantry/edit_pentry.dart @@ -0,0 +1,192 @@ +import 'package:flutter/material.dart'; +import 'package:fluttertoast/fluttertoast.dart'; +import 'package:provider/provider.dart'; +import 'package:test_sa/controllers/data/pentry/pentry_controller.dart'; +import 'package:test_sa/controllers/http_status_manger/http_status_manger.dart'; +import 'package:test_sa/controllers/localization/localization.dart'; +import 'package:test_sa/controllers/providers/api/device_transfer_provider.dart'; +import 'package:test_sa/controllers/providers/api/regular_visits_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/models/device/device_transfer.dart'; +import 'package:test_sa/models/device/device_transfer_info.dart'; +import 'package:test_sa/models/pantry/pentry.dart'; +import 'package:test_sa/models/subtitle.dart'; +import 'package:test_sa/models/visits/visit.dart'; +import 'package:test_sa/views/widgets/buttons/app_button.dart'; +import 'package:test_sa/views/widgets/buttons/app_small_button.dart'; +import 'package:test_sa/views/widgets/loaders/loading_manager.dart'; +import 'package:test_sa/views/widgets/pentry/pentry_calibration_tool_form.dart'; +import 'package:test_sa/views/widgets/pentry/pentry_info_form.dart'; +import 'package:test_sa/views/widgets/pentry/pentry_pm_kit_form.dart'; +import 'package:test_sa/views/widgets/pentry/pentry_ppm_check_list_form.dart'; + +class EditPentry extends StatefulWidget { + final Pentry pentry; + final Visit visit; + const EditPentry({Key key,this.pentry, this.visit}) : super(key: key); + + @override + State createState() => _EditPentryState(); +} + +class _EditPentryState extends State with SingleTickerProviderStateMixin{ + bool _isLoading = false; + bool _validate = false; + Subtitle _subtitle; + UserProvider _userProvider; + SettingProvider _settingProvider; + RegularVisitsProvider _regularVisitsProvider; + Pentry _pentry; + final GlobalKey _scaffoldKey = GlobalKey(); + + TabController _tabController; + _onSubmit() async { + _validate = true; + + if(!_pentry.validate()) { + setState(() { }); + return; + } + + _isLoading = true; + setState(() {}); + + int status = await _regularVisitsProvider.updatePentry( + user: _userProvider.user, + host: _settingProvider.host, + pentry: _pentry, + visit: widget.visit + ); + _isLoading =false; + setState(() {}); + if(status >= 200 && status < 300){ + Fluttertoast.showToast( + msg: _subtitle.requestCompleteSuccessfully, + ); + // Navigator.of(context).pop(); + }else{ + String errorMessage = HttpStatusManger.getStatusMessage( + status: status, subtitle: _subtitle); + Fluttertoast.showToast( + msg: errorMessage, + ); + } + } + + @override + void initState() { + _pentry = widget.pentry; + _tabController = TabController(length: 4, vsync: this); + super.initState(); + } + + @override + void dispose() { + _tabController.dispose(); + super.dispose(); + } + + @override + Widget build(BuildContext context) { + _subtitle = AppLocalization.of(context).subtitle; + _userProvider = Provider.of(context); + _settingProvider = Provider.of(context); + _regularVisitsProvider = Provider.of(context); + return Scaffold( + key: _scaffoldKey, + body: SafeArea( + child: LoadingManager( + isLoading: _isLoading, + isFailedLoading: false, + stateCode: 200, + onRefresh: () async {}, + child: Column( + children: [ + Material( + color: Theme.of(context).colorScheme.primary, + child: Padding( + padding: const EdgeInsets.all(2.0), + child: TabBar( + controller: _tabController, + isScrollable: true, + onTap: (index){ + setState(() {}); + }, + tabs: const [ + Tab(text: "PPM Check List",), + Tab(text: "Calibration Tools",), + Tab(text: "PK Kits",), + Tab(text: "Pentry",), + ]), + ), + ), + Expanded( + child: Stack( + children: [ + TabBarView( + physics: const NeverScrollableScrollPhysics(), + controller: _tabController, + children: [ + PentryPPMCheckListForm( + models: _pentry.ppmCheckLists, + enableValidate: _validate, + ), + PentryCalibrationToolForm( + models: _pentry.calibrationTools, + enableValidate: _validate, + ), + PentryPMKitForm( + models: _pentry.pmKits, + enableValidate: _validate, + ), + PentryInfoForm( + model: _pentry, + enableValidate: _validate, + ) + ], + ), + Align( + alignment: Alignment.bottomCenter, + child: Padding( + padding: const EdgeInsets.all(8.0), + child: Row( + children: [ + if(_tabController.index != 0) + ASmallButton( + text: _subtitle.back, + onPressed: (){ + _tabController.animateTo(_tabController.index - 1,); + setState(() {}); + }, + ), + const Spacer(), + if(_tabController.index != _tabController.length -1) + ASmallButton( + text: _subtitle.next, + onPressed: (){ + _tabController.animateTo(_tabController.index + 1,); + setState(() {}); + }, + ), + if(_tabController.index == _tabController.length -1) + ASmallButton( + text: _subtitle.update, + onPressed: _onSubmit, + ), + ], + ), + ), + ) + ], + ), + ), + + ], + ) + ), + ), + ); + } +} + diff --git a/lib/views/pages/user/visits/pantry/future_edit_pently.dart b/lib/views/pages/user/visits/pantry/future_edit_pently.dart new file mode 100644 index 00000000..829052e0 --- /dev/null +++ b/lib/views/pages/user/visits/pantry/future_edit_pently.dart @@ -0,0 +1,60 @@ +import 'package:flutter/material.dart'; +import 'package:provider/provider.dart'; +import 'package:test_sa/controllers/data/pentry/pentry_controller.dart'; +import 'package:test_sa/controllers/localization/localization.dart'; +import 'package:test_sa/controllers/providers/api/regular_visits_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/models/pantry/pentry.dart'; +import 'package:test_sa/models/subtitle.dart'; +import 'package:test_sa/models/visits/visit.dart'; +import 'package:test_sa/views/pages/user/visits/pantry/edit_pentry.dart'; +import 'package:test_sa/views/widgets/loaders/app_loading.dart'; +import 'package:test_sa/views/widgets/loaders/failed_loading.dart'; +class FutureEditPentry extends StatefulWidget { + + final Visit visit; + + const FutureEditPentry({Key key, this.visit}) : super(key: key); + + @override + State createState() => _FutureEditPentryState(); +} + +class _FutureEditPentryState extends State { + + UserProvider _userProvider; + SettingProvider _settingProvider; + @override + Widget build(BuildContext context) { + _userProvider = Provider.of(context); + _settingProvider = Provider.of(context); + //String requestId = ModalRoute.of(context).settings.arguments; + Subtitle subtitle = AppLocalization.of(context).subtitle; + return Scaffold( + body: FutureBuilder( + future: RegularVisitsProvider().getPently( + user: _userProvider.user, + host: _settingProvider.host, + id: widget.visit.id + ), + builder: (BuildContext context, AsyncSnapshot snapshot){ + if(snapshot.hasError) { + print(snapshot.error); + return FailedLoading( + message: subtitle.failedToCompleteRequest, + onReload: (){setState(() {});}, + ); + } + if(snapshot.hasData){ + return EditPentry( + pentry: snapshot.data, + visit: widget.visit, + ); + } + return const Center(child: ALoading()); + }, + ), + ); + } +} diff --git a/lib/views/pages/user/visits/update_visits_group_sheet.dart b/lib/views/pages/user/visits/update_visits_group_sheet.dart index 50d925d5..8be79f27 100644 --- a/lib/views/pages/user/visits/update_visits_group_sheet.dart +++ b/lib/views/pages/user/visits/update_visits_group_sheet.dart @@ -2,7 +2,7 @@ import 'dart:convert'; import 'dart:io'; import 'package:test_sa/controllers/localization/localization.dart'; -import 'package:test_sa/models/status.dart'; +import 'package:test_sa/models/lookup.dart'; import 'package:test_sa/models/subtitle.dart'; import 'package:test_sa/models/visits/visit.dart'; import 'package:test_sa/models/visits/visits_group.dart'; @@ -26,15 +26,15 @@ class UpdateVisitsGroupSheet extends StatefulWidget { } class _UpdateVisitsGroupSheetState extends State { - List status = [ - Status(label: "Done", id: 0,), - Status(label: "Not Yet", id: 1), - Status(label: "On Hold", id: 2,), + List status = [ + Lookup(label: "Done", id: 0,), + Lookup(label: "Not Yet", id: 1), + Lookup(label: "On Hold", id: 2,), ]; - List taskStatus = [ - Status(label: "Passed", id: 0,), - Status(label: "Failed", id: 1), + List taskStatus = [ + Lookup(label: "Passed", id: 0,), + Lookup(label: "Failed", id: 1), ]; VisitsGroup _group = VisitsGroup(); File _image; diff --git a/lib/views/pages/user/visits/visit_details.dart b/lib/views/pages/user/visits/visit_details.dart index 98738c36..f5929ded 100644 --- a/lib/views/pages/user/visits/visit_details.dart +++ b/lib/views/pages/user/visits/visit_details.dart @@ -1,15 +1,20 @@ +import 'package:provider/provider.dart'; import 'package:test_sa/controllers/localization/localization.dart'; import 'package:test_sa/models/subtitle.dart'; import 'package:test_sa/models/visits/visit.dart'; import 'package:test_sa/views/app_style/colors.dart'; import 'package:test_sa/views/app_style/sizing.dart'; +import 'package:test_sa/views/pages/user/visits/pantry/future_edit_pently.dart'; import 'package:test_sa/views/widgets/buttons/app_back_button.dart'; +import 'package:test_sa/views/widgets/buttons/app_icon_button.dart'; import 'package:test_sa/views/widgets/images/images_list.dart'; import 'package:test_sa/views/widgets/loaders/image_loader.dart'; import 'package:test_sa/views/widgets/requests/info_row.dart'; import 'package:test_sa/views/widgets/visits/visit_status.dart'; import 'package:flutter/material.dart'; +import '../../../../controllers/providers/api/regular_visits_provider.dart'; + class VisitDetailsPage extends StatelessWidget { static final String id = "/visit-details"; final Visit visit; @@ -18,6 +23,7 @@ class VisitDetailsPage extends StatelessWidget { @override Widget build(BuildContext context) { Subtitle _subtitle = AppLocalization.of(context).subtitle; + final regularVisitsProvider = Provider.of(context); return Scaffold( body: SafeArea( child: Column( @@ -39,7 +45,18 @@ class VisitDetailsPage extends StatelessWidget { ), ), ), - SizedBox(width: 42,) + AIconButton( + iconData: Icons.edit, + color: AColors.white, + buttonSize: 42, + backgroundColor: AColors.green, + onPressed: () async { + Navigator.of(context).push( + MaterialPageRoute(builder: (_)=> FutureEditPentry(visit: visit,)) + ); + }, + ), + SizedBox(width: 16,) ], ), ), @@ -87,6 +104,10 @@ class VisitDetailsPage extends StatelessWidget { title: _subtitle.code, info: visit.serialNumber, ), + RequestInfoRow( + title: "Asset Number", + info: visit.deviceNumber, + ), RequestInfoRow( title: _subtitle.deviceSN, info: visit.deviceSerialNumber, diff --git a/lib/views/widgets/date_and_time/date_picker.dart b/lib/views/widgets/date_and_time/date_picker.dart index 4ce1dd9f..70a4c82e 100644 --- a/lib/views/widgets/date_and_time/date_picker.dart +++ b/lib/views/widgets/date_and_time/date_picker.dart @@ -14,18 +14,17 @@ class ADatePicker extends StatelessWidget { Widget build(BuildContext context) { return ElevatedButton( style: ElevatedButton.styleFrom( + foregroundColor: Colors.white, + textStyle: Theme.of(context).textTheme.subtitle2, shape: RoundedRectangleBorder( borderRadius: BorderRadius.circular( 12 * AppStyle.getScaleFactor(context) - ) + ), ), - primary: AColors.white, - onPrimary: AColors.primaryColor, ), child: Text( date == null ? "Pick Date" : date.toString().split(" ").first, - style: Theme.of(context).textTheme.subtitle2, textScaleFactor: AppStyle.getScaleFactor(context), ), onPressed: () async { diff --git a/lib/views/widgets/equipment/auto_complete_devices_field.dart b/lib/views/widgets/equipment/auto_complete_devices_field.dart index c9e11872..ec91ae17 100644 --- a/lib/views/widgets/equipment/auto_complete_devices_field.dart +++ b/lib/views/widgets/equipment/auto_complete_devices_field.dart @@ -43,65 +43,52 @@ class _AutoCompleteDeviceFieldState extends State { _userProvider = Provider.of(context); _devicesProvider = Provider.of(context); //Subtitle _subtitle = AppLocalization.of(context).subtitle; - return LoadingManager( - isLoading: _devicesProvider.isLoading, - isFailedLoading: _devicesProvider.devices == null, - stateCode: _devicesProvider.stateCode, - onRefresh: () async { - _devicesProvider.reset(); - await _devicesProvider.getEquipment( - host: _settingProvider.host, - user: _userProvider.user, - hospitalId: widget.hospitalId - ); - }, - child: Container( - padding: EdgeInsets.symmetric( - horizontal: 16 - ), - decoration: BoxDecoration( - color: Colors.white, - border: Border.all(color:AColors.black), - borderRadius: BorderRadius.circular( - AppStyle.borderRadius * AppStyle.getScaleFactor(context) - ), - boxShadow: [ - AppStyle.boxShadow - ] + return Container( + padding: const EdgeInsets.symmetric( + horizontal: 16 + ), + decoration: BoxDecoration( + color: Colors.white, + border: Border.all(color:AColors.black), + borderRadius: BorderRadius.circular( + AppStyle.borderRadius * AppStyle.getScaleFactor(context) ), - child: TypeAheadField( - textFieldConfiguration: TextFieldConfiguration( - style: Theme.of(context).textTheme.headline6, - controller: _controller, - textAlign: TextAlign.center, - decoration: InputDecoration( - border: InputBorder.none, - disabledBorder: InputBorder.none, - focusedBorder: InputBorder.none, - enabledBorder: InputBorder.none, - ), - textInputAction: TextInputAction.search, + boxShadow: [ + AppStyle.boxShadow + ] + ), + child: TypeAheadField( + textFieldConfiguration: TextFieldConfiguration( + style: Theme.of(context).textTheme.headline6, + controller: _controller, + textAlign: TextAlign.center, + decoration: const InputDecoration( + border: InputBorder.none, + disabledBorder: InputBorder.none, + focusedBorder: InputBorder.none, + enabledBorder: InputBorder.none, ), - suggestionsCallback: (vale) async { - return await _devicesProvider.getDevicesList( - host: _settingProvider.host, - user: _userProvider.user, - hospitalId: widget.hospitalId, - title: vale, - ); - }, - itemBuilder: (context, device) { - return ListTile( - title: Text(device.serialNumber), - subtitle: Text(device.model+"/"+device.brand), - ); - }, - onSuggestionSelected: (device) { - _controller.text = device.serialNumber; - widget.onPick(device.id); - }, - ), + textInputAction: TextInputAction.search, ), + suggestionsCallback: (value) async { + return await _devicesProvider.getDevicesList( + host: _settingProvider.host, + user: _userProvider.user, + hospitalId: widget.hospitalId, + serialNumber: value, + ); + }, + itemBuilder: (context, device) { + return ListTile( + title: Text(device.serialNumber), + subtitle: Text(device.model+"/"+device.brand), + ); + }, + onSuggestionSelected: (device) { + _controller.text = device.serialNumber; + widget.onPick(device.id); + }, + ), ); } } diff --git a/lib/views/widgets/equipment/single_device_picker.dart b/lib/views/widgets/equipment/single_device_picker.dart index 9ecd0bbe..aac06ff1 100644 --- a/lib/views/widgets/equipment/single_device_picker.dart +++ b/lib/views/widgets/equipment/single_device_picker.dart @@ -88,22 +88,41 @@ class _SingleDevicePickerState extends State { }, child: Column( children: [ - SizedBox(height: 48,), + const SizedBox(height: 48,), Padding( padding: const EdgeInsets.symmetric(vertical: 8,horizontal: 16), - child: ATextFormField( - hintText: _subtitle.searchBySn, - style: Theme.of(context).textTheme.headline6, - suffixIcon: const Icon(Icons.search_rounded), - onChange: (value){ - _searchableList.clear(); - _searchableList.addAll(_devicesProvider.devices.where( - (element) => element.serialNumber.toLowerCase().contains( + child: Column( + children: [ + ATextFormField( + hintText: _subtitle.searchBySn, + style: Theme.of(context).textTheme.subtitle1, + suffixIcon: const Icon(Icons.search_rounded), + onChange: (value){ + _searchableList.clear(); + _searchableList.addAll(_devicesProvider.devices.where( + (element) => element.serialNumber.toLowerCase().contains( + value.toLowerCase() + ) + ).toList()); + setState(() {}); + }, + ), + const SizedBox(height: 8,), + ATextFormField( + hintText: "Search by Number", + style: Theme.of(context).textTheme.subtitle1, + suffixIcon: const Icon(Icons.search_rounded), + onChange: (value){ + _searchableList.clear(); + _searchableList.addAll(_devicesProvider.devices.where( + (element) => element.number.toLowerCase().contains( value.toLowerCase() - ) - ).toList()); - setState(() {}); - }, + ) + ).toList()); + setState(() {}); + }, + ), + ], ), ), Expanded( diff --git a/lib/views/widgets/hospitals/auto_complete_field.dart b/lib/views/widgets/hospitals/hospital_auto_complete_field.dart similarity index 89% rename from lib/views/widgets/hospitals/auto_complete_field.dart rename to lib/views/widgets/hospitals/hospital_auto_complete_field.dart index 6c51d23f..ba860745 100644 --- a/lib/views/widgets/hospitals/auto_complete_field.dart +++ b/lib/views/widgets/hospitals/hospital_auto_complete_field.dart @@ -9,18 +9,18 @@ import 'package:test_sa/views/widgets/hospitals/hospital_item.dart'; import 'package:flutter/material.dart'; import 'package:flutter_typeahead/flutter_typeahead.dart'; import 'package:provider/provider.dart'; -class AutoCompleteField extends StatefulWidget { +class HospitalAutoCompleteField extends StatefulWidget { final String initialValue; final Function(String) onSearch; final Function(String) onSave; - const AutoCompleteField({Key key, this.onSearch, this.initialValue, this.onSave}) : super(key: key); + const HospitalAutoCompleteField({Key key, this.onSearch, this.initialValue, this.onSave}) : super(key: key); @override - _AutoCompleteFieldState createState() => _AutoCompleteFieldState(); + _HospitalAutoCompleteFieldState createState() => _HospitalAutoCompleteFieldState(); } -class _AutoCompleteFieldState extends State { +class _HospitalAutoCompleteFieldState extends State { SettingProvider _settingProvider; TextEditingController _controller; @@ -56,7 +56,6 @@ class _AutoCompleteFieldState extends State { ] ), child: TypeAheadField( - textFieldConfiguration: TextFieldConfiguration( style: Theme.of(context).textTheme.headline6, onSubmitted: widget.onSave, diff --git a/lib/views/widgets/images/mini_one_image_picker.dart b/lib/views/widgets/images/mini_one_image_picker.dart index 0f696032..b26e9f49 100644 --- a/lib/views/widgets/images/mini_one_image_picker.dart +++ b/lib/views/widgets/images/mini_one_image_picker.dart @@ -70,7 +70,8 @@ class _AMiniOneImagePickerState extends State { AppStyle.borderRadius * AppStyle.getScaleFactor(context) ) ), - primary: Colors.grey[200], + //primary: Colors.grey[200], + textStyle: Theme.of(context).textTheme.overline, padding: _image == null ? null : EdgeInsets.zero, ), @@ -78,7 +79,6 @@ class _AMiniOneImagePickerState extends State { padding: const EdgeInsets.all(8.0), child: Text( _image == null ? _subtitle.pickImage : _image.path.split("/").last, - style: Theme.of(context).textTheme.overline, textScaleFactor: AppStyle.getScaleFactor(context), ), ), diff --git a/lib/views/widgets/images/multi_image_picker.dart b/lib/views/widgets/images/multi_image_picker.dart index ae0dddb6..08f16926 100644 --- a/lib/views/widgets/images/multi_image_picker.dart +++ b/lib/views/widgets/images/multi_image_picker.dart @@ -38,7 +38,7 @@ class _MultiImagesPickerState extends State child: Text( widget.label ?? _subtitle.images, style: Theme.of(context).textTheme - .headline6.copyWith(fontSize: 18,), + .headline6.copyWith(fontSize: 14,), textScaleFactor: AppStyle.getScaleFactor(context), ), ), diff --git a/lib/views/widgets/parts/auto_complete_parts_field.dart b/lib/views/widgets/parts/auto_complete_parts_field.dart index ef2be956..0ce14380 100644 --- a/lib/views/widgets/parts/auto_complete_parts_field.dart +++ b/lib/views/widgets/parts/auto_complete_parts_field.dart @@ -10,9 +10,10 @@ import 'package:flutter_typeahead/flutter_typeahead.dart'; import 'package:provider/provider.dart'; class AutoCompletePartsField extends StatefulWidget { final String initialValue; + final bool clearAfterPick; final Function(Part) onPick; - const AutoCompletePartsField({Key key, this.initialValue, this.onPick}) : super(key: key); + const AutoCompletePartsField({Key key, this.initialValue, this.onPick, this.clearAfterPick = true}) : super(key: key); @override _AutoCompletePartsFieldState createState() => _AutoCompletePartsFieldState(); @@ -42,62 +43,54 @@ class _AutoCompletePartsFieldState extends State { _userProvider = Provider.of(context); _partsProvider = Provider.of(context); //Subtitle _subtitle = AppLocalization.of(context).subtitle; - return LoadingManager( - isLoading: _partsProvider.isLoading, - isFailedLoading: _partsProvider.parts == null, - stateCode: _partsProvider.stateCode, - onRefresh: () async { - _partsProvider.reset(); - await _partsProvider.getParts( - host: _settingProvider.host, - user: _userProvider.user, - ); - }, - child: Container( - padding: EdgeInsets.symmetric( - horizontal: 16 - ), - decoration: BoxDecoration( - color: Colors.white, - border: Border.all(color:AColors.black), - borderRadius: BorderRadius.circular( - AppStyle.borderRadius * AppStyle.getScaleFactor(context) - ), - boxShadow: [ - AppStyle.boxShadow - ] + return Container( + padding: const EdgeInsets.symmetric( + horizontal: 16 + ), + decoration: BoxDecoration( + color: Colors.white, + border: Border.all(color:AColors.black), + borderRadius: BorderRadius.circular( + AppStyle.borderRadius * AppStyle.getScaleFactor(context) ), - child: TypeAheadField( - textFieldConfiguration: TextFieldConfiguration( - style: Theme.of(context).textTheme.subtitle1, - controller: _controller, - textAlign: TextAlign.center, - decoration: InputDecoration( - border: InputBorder.none, - disabledBorder: InputBorder.none, - focusedBorder: InputBorder.none, - enabledBorder: InputBorder.none, - ), - textInputAction: TextInputAction.search, + boxShadow: const [ + AppStyle.boxShadow + ] + ), + child: TypeAheadField( + textFieldConfiguration: TextFieldConfiguration( + style: Theme.of(context).textTheme.subtitle1, + controller: _controller, + textAlign: TextAlign.center, + decoration: const InputDecoration( + border: InputBorder.none, + disabledBorder: InputBorder.none, + focusedBorder: InputBorder.none, + enabledBorder: InputBorder.none, ), - suggestionsCallback: (vale) async { - return await _partsProvider.getPartsList( - host: _settingProvider.host, - title: vale - ); - }, - itemBuilder: (context, part) { - return ListTile( - title: Text(part.code), - subtitle: Text(part.name, style: Theme.of(context).textTheme.caption,), - ); - }, - onSuggestionSelected: (part) { - _controller.clear(); - widget.onPick(part); - }, - ), + textInputAction: TextInputAction.search, ), + suggestionsCallback: (vale) async { + return await _partsProvider.getPartsList( + host: _settingProvider.host, + title: vale + ); + }, + itemBuilder: (context, part) { + return ListTile( + title: Text(part.code), + subtitle: Text(part.name, style: Theme.of(context).textTheme.caption,), + ); + }, + onSuggestionSelected: (part) { + if(widget.clearAfterPick){ + _controller.clear(); + } else{ + _controller.text = part.code; + } + widget.onPick(part); + }, + ), ); } } diff --git a/lib/views/widgets/pentry/auto_complete_fields/auto_complete_devices_field.dart b/lib/views/widgets/pentry/auto_complete_fields/auto_complete_devices_field.dart new file mode 100644 index 00000000..e21c9ba0 --- /dev/null +++ b/lib/views/widgets/pentry/auto_complete_fields/auto_complete_devices_field.dart @@ -0,0 +1,95 @@ +import 'package:test_sa/controllers/providers/api/devices_provider.dart'; +import 'package:test_sa/controllers/providers/api/user_provider.dart'; +import 'package:test_sa/controllers/providers/settings/setting_provider.dart'; +import 'package:test_sa/models/device/device.dart'; +import 'package:test_sa/models/lookup.dart'; +import 'package:test_sa/views/app_style/colors.dart'; +import 'package:test_sa/views/app_style/sizing.dart'; +import 'package:test_sa/views/widgets/loaders/loading_manager.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter_typeahead/flutter_typeahead.dart'; +import 'package:provider/provider.dart'; +class AutoCompleteDeviceNumberField extends StatefulWidget { + final Lookup initialValue; + final String hospitalId; + final Function(Lookup) onPick; + + const AutoCompleteDeviceNumberField({Key key, this.initialValue, this.onPick, this.hospitalId}) : super(key: key); + + @override + State createState() => _AutoCompleteDeviceNumberFieldState(); +} + +class _AutoCompleteDeviceNumberFieldState extends State { + + SettingProvider _settingProvider; + DevicesProvider _devicesProvider; + UserProvider _userProvider; + TextEditingController _controller; + + @override + void initState() { + _controller = TextEditingController(text: widget.initialValue?.label); + super.initState(); + } + + @override + void dispose() { + _controller.dispose(); + super.dispose(); + } + @override + Widget build(BuildContext context) { + _settingProvider = Provider.of(context); + _userProvider = Provider.of(context); + _devicesProvider = Provider.of(context); + //Subtitle _subtitle = AppLocalization.of(context).subtitle; + return Container( + padding: const EdgeInsets.symmetric( + horizontal: 16 + ), + decoration: BoxDecoration( + color: Colors.white, + border: Border.all(color:AColors.black), + borderRadius: BorderRadius.circular( + AppStyle.borderRadius * AppStyle.getScaleFactor(context) + ), + boxShadow: const [ + AppStyle.boxShadow + ] + ), + child: TypeAheadField( + textFieldConfiguration: TextFieldConfiguration( + style: Theme.of(context).textTheme.headline6, + controller: _controller, + textAlign: TextAlign.center, + decoration: const InputDecoration( + border: InputBorder.none, + disabledBorder: InputBorder.none, + focusedBorder: InputBorder.none, + enabledBorder: InputBorder.none, + ), + textInputAction: TextInputAction.search, + ), + suggestionsCallback: (vale) async { + return await _devicesProvider.getDevicesList( + host: _settingProvider.host, + user: _userProvider.user, + hospitalId: widget.hospitalId, + number: vale, + ); + }, + itemBuilder: (context, device) { + return ListTile( + title: Text(device.number), + subtitle: Text("${device.model}/${device.brand}"), + ); + }, + onSuggestionSelected: (device) { + _controller.text = device.number; + widget.onPick(Lookup(id: int.tryParse(device.id),label: device.number)); + }, + ), + ); + } +} diff --git a/lib/views/widgets/pentry/pentry_calibration_tool_form.dart b/lib/views/widgets/pentry/pentry_calibration_tool_form.dart new file mode 100644 index 00000000..a8d51b15 --- /dev/null +++ b/lib/views/widgets/pentry/pentry_calibration_tool_form.dart @@ -0,0 +1,100 @@ +import 'package:flutter/material.dart'; +import 'package:provider/provider.dart'; +import 'package:test_sa/controllers/localization/localization.dart'; +import 'package:test_sa/controllers/providers/api/user_provider.dart'; +import 'package:test_sa/models/pantry/calibration_tools.dart'; +import 'package:test_sa/models/pantry/contact.dart'; +import 'package:test_sa/models/pantry/ppm_check_list.dart'; +import 'package:test_sa/views/app_style/colors.dart'; +import 'package:test_sa/views/app_style/sizing.dart'; +import 'package:test_sa/views/widgets/app_text_form_field.dart'; +import 'package:test_sa/views/widgets/buttons/app_button.dart'; +import 'package:test_sa/views/widgets/buttons/app_small_button.dart'; +import 'package:test_sa/views/widgets/date_and_time/date_picker.dart'; +import 'package:test_sa/views/widgets/pentry/auto_complete_fields/auto_complete_devices_field.dart'; +import 'package:test_sa/views/widgets/status/pentry/pentry_task_status_mune.dart'; +import 'package:test_sa/views/widgets/titles/app_sub_title.dart'; +class PentryCalibrationToolForm extends StatefulWidget { + final List models; + final bool enableValidate; + const PentryCalibrationToolForm({ + Key key, this.models, this.enableValidate, + }) : super(key: key); + + @override + State createState() => _PentryCalibrationToolFormState(); +} + +class _PentryCalibrationToolFormState extends State { + + + @override + Widget build(BuildContext context) { + final subtitle = AppLocalization.of(context).subtitle; + final userProvider = Provider.of(context); + return ListView.builder( + padding: EdgeInsets.only( + top: 12 * AppStyle.getScaleFactor(context), + left: 12 * AppStyle.getScaleFactor(context), + right: 12 * AppStyle.getScaleFactor(context), + bottom: 80 * AppStyle.getScaleFactor(context) + ), + itemCount: widget.models.length + 1, + itemBuilder: (context,index){ + if(index == widget.models.length){ + return AButton( + text: subtitle.add, + onPressed: (){ + widget.models.add(CalibrationTool()); + setState(() {}); + }, + ); + } + final model = widget.models[index]; + return ListView( + shrinkWrap: true, + physics: const ClampingScrollPhysics(), + children: [ + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + ASubTitle("#${index+1}"), + if(index != 0) + ASmallButton( + color: Theme.of(context).colorScheme.error, + text: subtitle.delete, + onPressed: (){ + widget.models.remove(model); + setState(() {}); + }, + ), + ], + ), + const SizedBox(height: 8,), + const ASubTitle("Asset Number"), + const SizedBox(height: 4,), + AutoCompleteDeviceNumberField( + initialValue: model.assetsNumber, + hospitalId: userProvider.user.hospital.id, + onPick: (number){ + model.assetsNumber = number; + }, + ), + const SizedBox(height: 8,), + const ASubTitle("Date of Testing"), + const SizedBox(height: 4,), + ADatePicker( + date: model.dataOfTesting, + onDatePicker: (date){ + model.dataOfTesting =date; + setState(() {}); + }, + ), + const SizedBox(height: 8,), + Divider(color: Theme.of(context).textTheme.titleMedium.color,), + ], + ); + } + ); + } +} diff --git a/lib/views/widgets/pentry/pentry_info_form.dart b/lib/views/widgets/pentry/pentry_info_form.dart new file mode 100644 index 00000000..94813b50 --- /dev/null +++ b/lib/views/widgets/pentry/pentry_info_form.dart @@ -0,0 +1,123 @@ +import 'package:flutter/material.dart'; +import 'package:intl/intl.dart'; +import 'package:provider/provider.dart'; +import 'package:test_sa/controllers/localization/localization.dart'; +import 'package:test_sa/controllers/providers/api/user_provider.dart'; +import 'package:test_sa/models/pantry/calibration_tools.dart'; +import 'package:test_sa/models/pantry/contact.dart'; +import 'package:test_sa/models/pantry/pentry.dart'; +import 'package:test_sa/models/pantry/ppm_check_list.dart'; +import 'package:test_sa/views/app_style/colors.dart'; +import 'package:test_sa/views/app_style/sizing.dart'; +import 'package:test_sa/views/widgets/app_text_form_field.dart'; +import 'package:test_sa/views/widgets/buttons/app_button.dart'; +import 'package:test_sa/views/widgets/buttons/app_small_button.dart'; +import 'package:test_sa/views/widgets/date_and_time/date_picker.dart'; +import 'package:test_sa/views/widgets/images/mini_one_image_picker.dart'; +import 'package:test_sa/views/widgets/pentry/auto_complete_fields/auto_complete_devices_field.dart'; +import 'package:test_sa/views/widgets/status/pentry/pentry_status_mune.dart'; +import 'package:test_sa/views/widgets/status/pentry/pentry_task_status_mune.dart'; +import 'package:test_sa/views/widgets/status/pentry/pentry_visit_status_mune.dart'; +import 'package:test_sa/views/widgets/timer/app_timer.dart'; +import 'package:test_sa/views/widgets/titles/app_sub_title.dart'; +class PentryInfoForm extends StatefulWidget { + final Pentry model; + final bool enableValidate; + const PentryInfoForm({ + Key key, this.model, this.enableValidate, + }) : super(key: key); + + @override + State createState() => _PentryInfoFormState(); +} + +class _PentryInfoFormState extends State { + + @override + Widget build(BuildContext context) { + final subtitle = AppLocalization.of(context).subtitle; + final userProvider = Provider.of(context); + return ListView( + padding: EdgeInsets.only( + top: 12 * AppStyle.getScaleFactor(context), + left: 12 * AppStyle.getScaleFactor(context), + right: 12 * AppStyle.getScaleFactor(context), + bottom: 80 * AppStyle.getScaleFactor(context) + ), + shrinkWrap: true, + physics: const ClampingScrollPhysics(), + children: [ + const SizedBox(height: 8,), + const ASubTitle("PPM Visit Status"), + if(widget.enableValidate && widget.model.ppmVisitStatus == null) + ASubTitle(subtitle.requiredWord,color: Colors.red,), + const SizedBox(height: 4,), + PentryVisitsStatusMenu( + initialValue: widget.model.ppmVisitStatus, + onSelect: (status){ + widget.model.ppmVisitStatus = status; + }, + ), + const SizedBox(height: 8,), + const ASubTitle("Timer"), + if(widget.enableValidate && widget.model?.timer?.endAt == null) + ASubTitle(subtitle.requiredWord,color: Colors.red,), + const SizedBox(height: 4,), + AppTimer( + timer: widget.model.timer, + onChange: (timer) async{ + widget.model.timer = timer; + return true; + }, + ), + const SizedBox(height: 8,), + const ASubTitle("Status"), + // if(widget.enableValidate && widget.model.status == null) + // ASubTitle(subtitle.requiredWord,color: Colors.red,), + const SizedBox(height: 4,), + PentryStatusMenu( + initialValue: widget.model.status, + onSelect: (status){ + widget.model.status = status; + }, + ), + const SizedBox(height: 8,), + const ASubTitle("Actual Visit Date"), + if(widget.enableValidate && widget.model.actualVisitDate == null) + ASubTitle(subtitle.requiredWord,color: Colors.red,), + const SizedBox(height: 4,), + ADatePicker( + date: widget.model.actualVisitDate, + from: DateTime.now().subtract(const Duration(days: 30)), + onDatePicker: (date){ + if(date == null) return; + widget.model.actualVisitDate = date; + setState(() {}); + }, + ), + const SizedBox(height: 8,), + const ASubTitle("Traveling Hours"), + const SizedBox(height: 4,), + ATextFormField( + initialValue: (widget.model.travelingHours ?? "").toString(), + textAlign: TextAlign.center, + style: Theme.of(context).textTheme.subtitle1, + textInputType: TextInputType.number, + onChange: (value){ + widget.model.travelingHours = value; + }, + ), + const SizedBox(height: 12,), + const ASubTitle("PPM Attachment"), + AMiniOneImagePicker( + //error: _validate && _serviceReport.image == null, + image: widget.model.imageFile, + onPick: (image){ + widget.model.imageFile =image; + }, + ), + const SizedBox(height: 8,), + ], + ); + } +} diff --git a/lib/views/widgets/pentry/pentry_pm_kit_form.dart b/lib/views/widgets/pentry/pentry_pm_kit_form.dart new file mode 100644 index 00000000..c725a118 --- /dev/null +++ b/lib/views/widgets/pentry/pentry_pm_kit_form.dart @@ -0,0 +1,158 @@ +import 'package:flutter/material.dart'; +import 'package:test_sa/controllers/localization/localization.dart'; +import 'package:test_sa/models/lookup.dart'; +import 'package:test_sa/models/pantry/contact.dart'; +import 'package:test_sa/models/pantry/pm_kit.dart'; +import 'package:test_sa/models/pantry/ppm_check_list.dart'; +import 'package:test_sa/views/app_style/colors.dart'; +import 'package:test_sa/views/app_style/sizing.dart'; +import 'package:test_sa/views/widgets/app_text_form_field.dart'; +import 'package:test_sa/views/widgets/buttons/app_button.dart'; +import 'package:test_sa/views/widgets/buttons/app_small_button.dart'; +import 'package:test_sa/views/widgets/parts/auto_complete_parts_field.dart'; +import 'package:test_sa/views/widgets/status/pentry/pentry_task_status_mune.dart'; +import 'package:test_sa/views/widgets/titles/app_sub_title.dart'; +class PentryPMKitForm extends StatefulWidget { + final List models; + final bool enableValidate; + const PentryPMKitForm({ + Key key, this.models, this.enableValidate, + }) : super(key: key); + + @override + State createState() => _PentryPMKitFormState(); +} + +class _PentryPMKitFormState extends State { + + @override + Widget build(BuildContext context) { + final subtitle = AppLocalization.of(context).subtitle; + return ListView.builder( + padding: EdgeInsets.only( + top: 12 * AppStyle.getScaleFactor(context), + left: 12 * AppStyle.getScaleFactor(context), + right: 12 * AppStyle.getScaleFactor(context), + bottom: 80 * AppStyle.getScaleFactor(context) + ), + itemCount: widget.models.length + 1, + itemBuilder: (context,index){ + if(index == widget.models.length){ + return AButton( + text: subtitle.add, + onPressed: (){ + widget.models.add(PMKit()); + setState(() {}); + }, + ); + } + final model = widget.models[index]; + return ListView( + shrinkWrap: true, + physics: const ClampingScrollPhysics(), + children: [ + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + ASubTitle("#${index+1}"), + if(index != 0) + ASmallButton( + color: Theme.of(context).colorScheme.error, + text: subtitle.delete, + onPressed: (){ + widget.models.remove(model); + setState(() {}); + }, + ), + ], + ), + const SizedBox(height: 8,), + const ASubTitle("Item Code"), + const SizedBox(height: 4,), + AutoCompletePartsField( + clearAfterPick: false, + initialValue: (model.itemCode?.label ?? "").toString(), + onPick: (part){ + model.itemCode = Lookup(id: int.tryParse(part.id),label: part.code); + }, + ), + const SizedBox(height: 8,), + const ASubTitle("Item Name"), + const SizedBox(height: 4,), + ATextFormField( + initialValue: (model.itemName ?? "").toString(), + textAlign: TextAlign.center, + style: Theme.of(context).textTheme.subtitle1, + textInputType: TextInputType.text, + onChange: (value){ + model.itemName = value; + }, + ), + const SizedBox(height: 8,), + const ASubTitle("Preparation Time Frame"), + const SizedBox(height: 4,), + ATextFormField( + initialValue: (model.preparationTimeFrame ?? "").toString(), + textAlign: TextAlign.center, + style: Theme.of(context).textTheme.subtitle1, + textInputType: TextInputType.text, + onChange: (value){ + model.preparationTimeFrame = value; + }, + ), + const SizedBox(height: 8,), + const ASubTitle("kit Frequency Demand"), + const SizedBox(height: 4,), + ATextFormField( + initialValue: (model.kitFrequencyDemand ?? "").toString(), + textAlign: TextAlign.center, + style: Theme.of(context).textTheme.subtitle1, + textInputType: TextInputType.text, + onChange: (value){ + model.kitFrequencyDemand = value; + }, + ), + const SizedBox(height: 8,), + const ASubTitle("Availability"), + const SizedBox(height: 4,), + ATextFormField( + initialValue: (model.availability ?? "").toString(), + textAlign: TextAlign.center, + style: Theme.of(context).textTheme.subtitle1, + textInputType: TextInputType.text, + onChange: (value){ + model.availability = value; + }, + ), + const SizedBox(height: 8,), + const ASubTitle("Quantity Needed"), + const SizedBox(height: 4,), + ATextFormField( + initialValue: (model.quantityNeeded ?? "").toString(), + textAlign: TextAlign.center, + style: Theme.of(context).textTheme.subtitle1, + textInputType: TextInputType.number, + onChange: (value){ + model.quantityNeeded = value; + }, + ), + const SizedBox(height: 8,), + const ASubTitle("Quantity Reserved"), + const SizedBox(height: 4,), + ATextFormField( + initialValue: (model.quantityReserved ?? "").toString(), + textAlign: TextAlign.center, + style: Theme.of(context).textTheme.subtitle1, + textInputType: TextInputType.number, + onChange: (value){ + model.quantityReserved = value; + }, + ), + const SizedBox(height: 8,), + Divider(color: Theme.of(context).textTheme.titleMedium.color,), + ], + ); + } + ); + } +} diff --git a/lib/views/widgets/pentry/pentry_ppm_check_list_form.dart b/lib/views/widgets/pentry/pentry_ppm_check_list_form.dart new file mode 100644 index 00000000..7219c33a --- /dev/null +++ b/lib/views/widgets/pentry/pentry_ppm_check_list_form.dart @@ -0,0 +1,119 @@ +import 'package:flutter/material.dart'; +import 'package:test_sa/controllers/localization/localization.dart'; +import 'package:test_sa/models/pantry/contact.dart'; +import 'package:test_sa/models/pantry/ppm_check_list.dart'; +import 'package:test_sa/views/app_style/colors.dart'; +import 'package:test_sa/views/app_style/sizing.dart'; +import 'package:test_sa/views/widgets/app_text_form_field.dart'; +import 'package:test_sa/views/widgets/buttons/app_button.dart'; +import 'package:test_sa/views/widgets/buttons/app_small_button.dart'; +import 'package:test_sa/views/widgets/status/pentry/pentry_task_status_mune.dart'; +import 'package:test_sa/views/widgets/titles/app_sub_title.dart'; +class PentryPPMCheckListForm extends StatefulWidget { + final List models; + final bool enableValidate; + const PentryPPMCheckListForm({ + Key key, this.models, this.enableValidate, + }) : super(key: key); + + @override + State createState() => _PentryPPMCheckListFormState(); +} + +class _PentryPPMCheckListFormState extends State { + + + @override + Widget build(BuildContext context) { + final subtitle = AppLocalization.of(context).subtitle; + return ListView.builder( + padding: EdgeInsets.only( + top: 12 * AppStyle.getScaleFactor(context), + left: 12 * AppStyle.getScaleFactor(context), + right: 12 * AppStyle.getScaleFactor(context), + bottom: 80 * AppStyle.getScaleFactor(context) + ), + itemCount: widget.models.length + 1, + itemBuilder: (context,index){ + if(index == widget.models.length){ + return AButton( + text: subtitle.add, + onPressed: (){ + widget.models.add(PPMCheckList()); + setState(() {}); + }, + ); + } + final model = widget.models[index]; + return ListView( + shrinkWrap: true, + physics: const ClampingScrollPhysics(), + children: [ + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + ASubTitle("#${index+1}"), + if(index != 0) + ASmallButton( + color: Theme.of(context).colorScheme.error, + text: subtitle.delete, + onPressed: (){ + widget.models.remove(model); + setState(() {}); + }, + ), + ], + ), + const SizedBox(height: 8,), + const ASubTitle("Task"), + const SizedBox(height: 4,), + ATextFormField( + initialValue: (model.title ?? "").toString(), + textAlign: TextAlign.center, + style: Theme.of(context).textTheme.subtitle1, + textInputType: TextInputType.text, + onChange: (value){ + model.title = value; + }, + ), + const SizedBox(height: 8,), + ASubTitle(subtitle.status), + const SizedBox(height: 4,), + PentryTaskStatusMenu( + initialValue: model.status, + onSelect: (status){ + model.status = status; + }, + ), + const SizedBox(height: 8,), + const ASubTitle("Comment"), + const SizedBox(height: 4,), + ATextFormField( + initialValue: (model.comment ?? "").toString(), + textAlign: TextAlign.center, + style: Theme.of(context).textTheme.subtitle1, + textInputType: TextInputType.text, + onChange: (value){ + model.comment = value; + }, + ), + const SizedBox(height: 8,), + const ASubTitle("Measured Value"), + const SizedBox(height: 4,), + ATextFormField( + initialValue: (model.measuredValue ?? "").toString(), + textAlign: TextAlign.center, + style: Theme.of(context).textTheme.subtitle1, + textInputType: TextInputType.text, + onChange: (value){ + model.measuredValue = value; + }, + ), + const SizedBox(height: 8,), + Divider(color: Theme.of(context).textTheme.titleMedium.color,), + ], + ); + } + ); + } +} diff --git a/lib/views/widgets/requests/request_status.dart b/lib/views/widgets/requests/request_status.dart index 84142349..44308861 100644 --- a/lib/views/widgets/requests/request_status.dart +++ b/lib/views/widgets/requests/request_status.dart @@ -1,5 +1,5 @@ import 'package:test_sa/models/service_request/service_request.dart'; -import 'package:test_sa/models/status.dart'; +import 'package:test_sa/models/lookup.dart'; import 'package:test_sa/views/app_style/colors.dart'; import 'package:test_sa/views/app_style/sizing.dart'; import 'package:flutter/material.dart'; diff --git a/lib/views/widgets/requests/service_request_item.dart b/lib/views/widgets/requests/service_request_item.dart index 6cffb284..448cb53e 100644 --- a/lib/views/widgets/requests/service_request_item.dart +++ b/lib/views/widgets/requests/service_request_item.dart @@ -251,57 +251,6 @@ class ServiceRequestItem extends StatelessWidget { color: onItemColor ), ), - - ], - ), - ], - ), - if(request.viewReport) - Column( - children: [ - const SizedBox(height: 8,), - Row( - children: [ - Expanded( - child: Text( - "Work Duration", - style: Theme.of(context).textTheme.headline6.copyWith( - color: onItemColor, - fontSize: 14, - fontWeight: FontWeight.bold - ), - ), - ), - // AppTimer( - // timer: request.timer, - // onChange: (timeModel) async { - // - // request.timer = timeModel; - // if(timeModel.endAt == null) return true; - // int status = await servicesProvider.updateServiceReportTimer( - // host: settingProvider.host, - // user: _user, - // timer: timeModel, - // request: request - // ); - // if(status >= 200 && status < 300){ - // return true; - // }else{ - // String errorMessage = HttpStatusManger.getStatusMessage( - // status: status, subtitle: _subtitle); - // ScaffoldMessenger.of(context).showSnackBar( - // SnackBar( - // content: Text( - // errorMessage - // ), - // ) - // ); - // return false; - // } - // - // - // }, - // ), ], ), ], diff --git a/lib/views/widgets/requests/service_request_update_dialog.dart b/lib/views/widgets/requests/service_request_update_dialog.dart index ccea8858..bde17432 100644 --- a/lib/views/widgets/requests/service_request_update_dialog.dart +++ b/lib/views/widgets/requests/service_request_update_dialog.dart @@ -8,13 +8,13 @@ import 'package:test_sa/controllers/providers/api/user_provider.dart'; import 'package:test_sa/controllers/providers/settings/setting_provider.dart'; import 'package:test_sa/models/service_request/service_request.dart'; import 'package:test_sa/models/service_request/service_request_search.dart'; -import 'package:test_sa/models/status.dart'; +import 'package:test_sa/models/lookup.dart'; import 'package:test_sa/models/subtitle.dart'; import 'package:test_sa/views/app_style/sizing.dart'; import 'package:test_sa/views/widgets/buttons/app_button.dart'; import 'package:test_sa/views/widgets/buttons/app_small_button.dart'; import 'package:test_sa/views/widgets/date_and_time/date_picker.dart'; -import 'package:test_sa/views/widgets/hospitals/auto_complete_field.dart'; +import 'package:test_sa/views/widgets/hospitals/hospital_auto_complete_field.dart'; import 'package:flutter/material.dart'; import 'package:test_sa/views/widgets/status/employee/employee_mune.dart'; @@ -33,7 +33,7 @@ class _ServiceRequestsUpdateDialogState extends State with TickerProviderStateMixin{ ServiceRequestSearch _search; - List status = [ - Status(label: "New", id: 4,), + List status = [ + Lookup(label: "New", id: 4,), - Status(label: "Repaired", id: 6,), - Status(label: "Repeated", id: 8), - Status(label: "Closed", id: 9,), - Status(label: "Under Repair", id: 5,), + Lookup(label: "Repaired", id: 6,), + Lookup(label: "Repeated", id: 8), + Lookup(label: "Closed", id: 9,), + Lookup(label: "Under Repair", id: 5,), ]; final GlobalKey _formKey = GlobalKey(); @@ -94,7 +94,7 @@ class _ServiceRequestsSearchDialogState extends State with TickerProviderStateMixin{ VisitsSearch _search; - List status = [ - Status(label: "Done", id: 0,), - Status(label: "Not Yet", id: 1), - Status(label: "On Hold", id: 2,), + List status = [ + Lookup(label: "Done", id: 0,), + Lookup(label: "Not Yet", id: 1), + Lookup(label: "On Hold", id: 2,), ]; - List contactStatus = [ - Status(label: "Hospital Employee", key: "H",), - Status(label: "Under Warranty", key: "CW"), - Status(label: "Under Maintenance Contract", key: "CC",), + List contactStatus = [ + Lookup(label: "Hospital Employee", key: "H",), + Lookup(label: "Under Warranty", key: "CW"), + Lookup(label: "Under Maintenance Contract", key: "CC",), ]; @@ -100,7 +100,7 @@ class _VisitsSearchDialogState extends State }, ), SizedBox(height: 8.0 * AppStyle.getScaleFactor(context),), - AutoCompleteField( + HospitalAutoCompleteField( initialValue: _search.hospitalName, onSave: (value){ _search.hospitalName = value; diff --git a/lib/views/widgets/status/employee/employee_mune.dart b/lib/views/widgets/status/employee/employee_mune.dart index 5555233a..5ee55ea5 100644 --- a/lib/views/widgets/status/employee/employee_mune.dart +++ b/lib/views/widgets/status/employee/employee_mune.dart @@ -1,14 +1,14 @@ import 'package:test_sa/controllers/providers/api/status_drop_down/employee/employee_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/models/status.dart'; +import 'package:test_sa/models/lookup.dart'; import 'package:test_sa/views/widgets/loaders/loading_manager.dart'; import 'package:test_sa/views/widgets/status/single_status_menu.dart'; import 'package:flutter/material.dart'; import 'package:provider/provider.dart'; class EmployeeMenu extends StatelessWidget { - final Function(Status) onSelect; - final Status initialValue; + final Function(Lookup) onSelect; + final Lookup initialValue; const EmployeeMenu({Key key, this.onSelect, this.initialValue}) : super(key: key); @override diff --git a/lib/views/widgets/status/gas_refill/gas_cylinder_size.dart b/lib/views/widgets/status/gas_refill/gas_cylinder_size.dart index 842e5d0e..925e920a 100644 --- a/lib/views/widgets/status/gas_refill/gas_cylinder_size.dart +++ b/lib/views/widgets/status/gas_refill/gas_cylinder_size.dart @@ -3,14 +3,14 @@ import 'package:test_sa/controllers/providers/api/status_drop_down/gas_refill/ga import 'package:test_sa/controllers/providers/api/status_drop_down/report/service_types_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/models/status.dart'; +import 'package:test_sa/models/lookup.dart'; import 'package:test_sa/views/widgets/loaders/loading_manager.dart'; import 'package:test_sa/views/widgets/status/single_status_menu.dart'; import 'package:flutter/material.dart'; import 'package:provider/provider.dart'; class GasCylinderSizeMenu extends StatelessWidget { - final Function(Status) onSelect; - final Status initialValue; + final Function(Lookup) onSelect; + final Lookup initialValue; const GasCylinderSizeMenu({Key key, this.onSelect, this.initialValue}) : super(key: key); @override diff --git a/lib/views/widgets/status/gas_refill/gas_status.dart b/lib/views/widgets/status/gas_refill/gas_status.dart index 524d8acf..c198bd33 100644 --- a/lib/views/widgets/status/gas_refill/gas_status.dart +++ b/lib/views/widgets/status/gas_refill/gas_status.dart @@ -3,14 +3,14 @@ import 'package:test_sa/controllers/providers/api/status_drop_down/gas_refill/ga import 'package:test_sa/controllers/providers/api/status_drop_down/report/service_types_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/models/status.dart'; +import 'package:test_sa/models/lookup.dart'; import 'package:test_sa/views/widgets/loaders/loading_manager.dart'; import 'package:test_sa/views/widgets/status/single_status_menu.dart'; import 'package:flutter/material.dart'; import 'package:provider/provider.dart'; class GasStatusMenu extends StatelessWidget { - final Function(Status) onSelect; - final Status initialValue; + final Function(Lookup) onSelect; + final Lookup initialValue; const GasStatusMenu({Key key, this.onSelect, this.initialValue}) : super(key: key); @override diff --git a/lib/views/widgets/status/gas_refill/gas_type.dart b/lib/views/widgets/status/gas_refill/gas_type.dart index 9d9b47f5..6f0c0616 100644 --- a/lib/views/widgets/status/gas_refill/gas_type.dart +++ b/lib/views/widgets/status/gas_refill/gas_type.dart @@ -4,14 +4,14 @@ import 'package:test_sa/controllers/providers/api/status_drop_down/gas_refill/ga import 'package:test_sa/controllers/providers/api/status_drop_down/report/service_types_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/models/status.dart'; +import 'package:test_sa/models/lookup.dart'; import 'package:test_sa/views/widgets/loaders/loading_manager.dart'; import 'package:test_sa/views/widgets/status/single_status_menu.dart'; import 'package:flutter/material.dart'; import 'package:provider/provider.dart'; class GasTypeMenu extends StatelessWidget { - final Function(Status) onSelect; - final Status initialValue; + final Function(Lookup) onSelect; + final Lookup initialValue; const GasTypeMenu({Key key, this.onSelect, this.initialValue}) : super(key: key); @override diff --git a/lib/views/widgets/status/multi_status_menu.dart b/lib/views/widgets/status/multi_status_menu.dart index b0c8272d..8d1d7c4c 100644 --- a/lib/views/widgets/status/multi_status_menu.dart +++ b/lib/views/widgets/status/multi_status_menu.dart @@ -1,14 +1,14 @@ import 'package:flutter/cupertino.dart'; import 'package:flutter_typeahead/flutter_typeahead.dart'; -import 'package:test_sa/models/status.dart'; +import 'package:test_sa/models/lookup.dart'; import 'package:test_sa/views/app_style/colors.dart'; import 'package:test_sa/views/app_style/sizing.dart'; import 'package:flutter/material.dart'; import 'package:test_sa/views/widgets/app_text_form_field.dart'; class MultiStatusMenu extends StatefulWidget { - final List statuses; - final List initialSelectedStatus; - final Function(List) onSelect; + final List statuses; + final List initialSelectedStatus; + final Function(List) onSelect; const MultiStatusMenu({Key key, this.statuses, this.onSelect, this.initialSelectedStatus}) : super(key: key); @override @@ -17,7 +17,7 @@ class MultiStatusMenu extends StatefulWidget { class _MultiStatusMenuState extends State { - List _selectedStatus = []; + List _selectedStatus = []; TextEditingController _controller; @override @@ -93,7 +93,7 @@ class _MultiStatusMenuState extends State { AppStyle.boxShadow ] ), - child: TypeAheadField( + child: TypeAheadField( textFieldConfiguration: TextFieldConfiguration( style: Theme.of(context).textTheme.subtitle1, controller: _controller, @@ -107,7 +107,7 @@ class _MultiStatusMenuState extends State { textInputAction: TextInputAction.search, ), suggestionsCallback: (vale) { - return widget.statuses.where((Status option) { + return widget.statuses.where((Lookup option) { return option.label.toLowerCase().contains(_controller.text); }); }, diff --git a/lib/views/widgets/status/pentry/pentry_status_mune.dart b/lib/views/widgets/status/pentry/pentry_status_mune.dart new file mode 100644 index 00000000..3b1ef709 --- /dev/null +++ b/lib/views/widgets/status/pentry/pentry_status_mune.dart @@ -0,0 +1,40 @@ +import 'package:test_sa/controllers/providers/api/status_drop_down/employee/employee_provider.dart'; +import 'package:test_sa/controllers/providers/api/status_drop_down/pentry/pentry_status_provider.dart'; +import 'package:test_sa/controllers/providers/api/status_drop_down/pentry/pentry_task_status_provider.dart'; +import 'package:test_sa/controllers/providers/api/status_drop_down/pentry/pentry_visit_status_provider.dart'; +import 'package:test_sa/controllers/providers/api/user_provider.dart'; +import 'package:test_sa/controllers/providers/settings/setting_provider.dart'; +import 'package:test_sa/models/lookup.dart'; +import 'package:test_sa/views/widgets/loaders/loading_manager.dart'; +import 'package:test_sa/views/widgets/status/single_status_menu.dart'; +import 'package:flutter/material.dart'; +import 'package:provider/provider.dart'; +class PentryStatusMenu extends StatelessWidget { + final Function(Lookup) onSelect; + final Lookup initialValue; + + const PentryStatusMenu({Key key, this.onSelect, this.initialValue}) : super(key: key); + @override + Widget build(BuildContext context) { + final settingProvider = Provider.of(context); + final userProvider = Provider.of(context); + final menuProvider = Provider.of(context); + return LoadingManager( + isLoading: menuProvider.isLoading, + isFailedLoading: menuProvider.items == null, + stateCode: menuProvider.stateCode, + onRefresh: () async { + menuProvider.reset(); + await menuProvider.getData( + user: userProvider.user, + host: settingProvider.host + ); + }, + child: SingleStatusMenu( + initialStatus: initialValue, + statuses: menuProvider.items, + onSelect: onSelect, + ) + ); + } +} diff --git a/lib/views/widgets/status/pentry/pentry_task_status_mune.dart b/lib/views/widgets/status/pentry/pentry_task_status_mune.dart new file mode 100644 index 00000000..d9f4f276 --- /dev/null +++ b/lib/views/widgets/status/pentry/pentry_task_status_mune.dart @@ -0,0 +1,38 @@ +import 'package:test_sa/controllers/providers/api/status_drop_down/employee/employee_provider.dart'; +import 'package:test_sa/controllers/providers/api/status_drop_down/pentry/pentry_task_status_provider.dart'; +import 'package:test_sa/controllers/providers/api/user_provider.dart'; +import 'package:test_sa/controllers/providers/settings/setting_provider.dart'; +import 'package:test_sa/models/lookup.dart'; +import 'package:test_sa/views/widgets/loaders/loading_manager.dart'; +import 'package:test_sa/views/widgets/status/single_status_menu.dart'; +import 'package:flutter/material.dart'; +import 'package:provider/provider.dart'; +class PentryTaskStatusMenu extends StatelessWidget { + final Function(Lookup) onSelect; + final Lookup initialValue; + + const PentryTaskStatusMenu({Key key, this.onSelect, this.initialValue}) : super(key: key); + @override + Widget build(BuildContext context) { + final settingProvider = Provider.of(context); + final userProvider = Provider.of(context); + final menuProvider = Provider.of(context); + return LoadingManager( + isLoading: menuProvider.isLoading, + isFailedLoading: menuProvider.items == null, + stateCode: menuProvider.stateCode, + onRefresh: () async { + menuProvider.reset(); + await menuProvider.getData( + user: userProvider.user, + host: settingProvider.host + ); + }, + child: SingleStatusMenu( + initialStatus: initialValue, + statuses: menuProvider.items, + onSelect: onSelect, + ) + ); + } +} diff --git a/lib/views/widgets/status/pentry/pentry_visit_status_mune.dart b/lib/views/widgets/status/pentry/pentry_visit_status_mune.dart new file mode 100644 index 00000000..8df13d8c --- /dev/null +++ b/lib/views/widgets/status/pentry/pentry_visit_status_mune.dart @@ -0,0 +1,39 @@ +import 'package:test_sa/controllers/providers/api/status_drop_down/employee/employee_provider.dart'; +import 'package:test_sa/controllers/providers/api/status_drop_down/pentry/pentry_task_status_provider.dart'; +import 'package:test_sa/controllers/providers/api/status_drop_down/pentry/pentry_visit_status_provider.dart'; +import 'package:test_sa/controllers/providers/api/user_provider.dart'; +import 'package:test_sa/controllers/providers/settings/setting_provider.dart'; +import 'package:test_sa/models/lookup.dart'; +import 'package:test_sa/views/widgets/loaders/loading_manager.dart'; +import 'package:test_sa/views/widgets/status/single_status_menu.dart'; +import 'package:flutter/material.dart'; +import 'package:provider/provider.dart'; +class PentryVisitsStatusMenu extends StatelessWidget { + final Function(Lookup) onSelect; + final Lookup initialValue; + + const PentryVisitsStatusMenu({Key key, this.onSelect, this.initialValue}) : super(key: key); + @override + Widget build(BuildContext context) { + final settingProvider = Provider.of(context); + final userProvider = Provider.of(context); + final menuProvider = Provider.of(context); + return LoadingManager( + isLoading: menuProvider.isLoading, + isFailedLoading: menuProvider.items == null, + stateCode: menuProvider.stateCode, + onRefresh: () async { + menuProvider.reset(); + await menuProvider.getData( + user: userProvider.user, + host: settingProvider.host + ); + }, + child: SingleStatusMenu( + initialStatus: initialValue, + statuses: menuProvider.items, + onSelect: onSelect, + ) + ); + } +} diff --git a/lib/views/widgets/status/report/service_report_last_call.dart b/lib/views/widgets/status/report/service_report_last_call.dart index 7093e7e4..1e858cb9 100644 --- a/lib/views/widgets/status/report/service_report_last_call.dart +++ b/lib/views/widgets/status/report/service_report_last_call.dart @@ -1,12 +1,12 @@ import 'package:test_sa/controllers/providers/api/status_drop_down/report/service_report_last_calls_provider.dart'; import 'package:test_sa/models/service_report.dart'; -import 'package:test_sa/models/status.dart'; +import 'package:test_sa/models/lookup.dart'; import 'package:test_sa/views/widgets/loaders/loading_manager.dart'; import 'package:test_sa/views/widgets/status/single_status_menu.dart'; import 'package:flutter/material.dart'; import 'package:provider/provider.dart'; class ServiceReportLastCallsMenu extends StatelessWidget { - final Function(Status) onSelect; + final Function(Lookup) onSelect; final ServiceReport report; const ServiceReportLastCallsMenu({ diff --git a/lib/views/widgets/status/report/service_report_reasons.dart b/lib/views/widgets/status/report/service_report_reasons.dart index 8aa4effd..fc24140d 100644 --- a/lib/views/widgets/status/report/service_report_reasons.dart +++ b/lib/views/widgets/status/report/service_report_reasons.dart @@ -1,14 +1,14 @@ import 'package:test_sa/controllers/providers/api/status_drop_down/report/service_report_reasons_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/models/status.dart'; +import 'package:test_sa/models/lookup.dart'; import 'package:test_sa/views/widgets/loaders/loading_manager.dart'; import 'package:test_sa/views/widgets/status/single_status_menu.dart'; import 'package:flutter/material.dart'; import 'package:provider/provider.dart'; class ServiceReportReasonsMenu extends StatelessWidget { - final Status initialValue; - final Function(Status) onSelect; + final Lookup initialValue; + final Function(Lookup) onSelect; const ServiceReportReasonsMenu({Key key, this.onSelect, this.initialValue}) : super(key: key); @override diff --git a/lib/views/widgets/status/report/service_report_status.dart b/lib/views/widgets/status/report/service_report_status.dart index 41033e8b..d739b1db 100644 --- a/lib/views/widgets/status/report/service_report_status.dart +++ b/lib/views/widgets/status/report/service_report_status.dart @@ -5,13 +5,13 @@ import 'package:test_sa/controllers/providers/api/status_drop_down/report/servic import 'package:test_sa/controllers/providers/api/user_provider.dart'; import 'package:test_sa/controllers/providers/settings/setting_provider.dart'; import 'package:test_sa/models/service_report.dart'; -import 'package:test_sa/models/status.dart'; +import 'package:test_sa/models/lookup.dart'; import 'package:test_sa/views/widgets/loaders/loading_manager.dart'; import 'package:test_sa/views/widgets/status/single_status_menu.dart'; import 'package:flutter/material.dart'; import 'package:provider/provider.dart'; class ServiceReportStatusMenu extends StatefulWidget { - final Function(Status) onSelect; + final Function(Lookup) onSelect; final ServiceReport report; const ServiceReportStatusMenu({Key key, this.onSelect, this.report}) : super(key: key); diff --git a/lib/views/widgets/status/report/service_report_type.dart b/lib/views/widgets/status/report/service_report_type.dart index 26e4eb14..b3e509b3 100644 --- a/lib/views/widgets/status/report/service_report_type.dart +++ b/lib/views/widgets/status/report/service_report_type.dart @@ -1,36 +1,36 @@ import 'package:test_sa/controllers/providers/api/status_drop_down/report/service_report_types_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/models/status.dart'; +import 'package:test_sa/models/lookup.dart'; import 'package:test_sa/views/widgets/loaders/loading_manager.dart'; import 'package:test_sa/views/widgets/status/single_status_menu.dart'; import 'package:flutter/material.dart'; import 'package:provider/provider.dart'; class ServiceReportTypeMenu extends StatelessWidget { - final Function(Status) onSelect; - final Status initialValue; + final Function(Lookup) onSelect; + final Lookup initialValue; const ServiceReportTypeMenu({Key key, this.onSelect, this.initialValue}) : super(key: key); @override Widget build(BuildContext context) { - SettingProvider _settingProvider = Provider.of(context); - UserProvider _userProvider = Provider.of(context); - ServiceReportTypesProvider _menuProvider = Provider.of(context); + SettingProvider settingProvider = Provider.of(context); + UserProvider userProvider = Provider.of(context); + ServiceReportTypesProvider menuProvider = Provider.of(context); return LoadingManager( - isLoading: _menuProvider.isLoading, - isFailedLoading: _menuProvider.types == null, - stateCode: _menuProvider.stateCode, + isLoading: menuProvider.isLoading, + isFailedLoading: menuProvider.types == null, + stateCode: menuProvider.stateCode, onRefresh: () async { - _menuProvider.reset(); - await _menuProvider.getTypes( - user: _userProvider.user, - host: _settingProvider.host + menuProvider.reset(); + await menuProvider.getTypes( + user: userProvider.user, + host: settingProvider.host ); - onSelect(initialValue ?? _menuProvider.types?.last); + onSelect(initialValue ?? menuProvider.types?.last); }, child: SingleStatusMenu( - initialStatus: initialValue ?? _menuProvider.types?.last, - statuses: _menuProvider.types, + initialStatus: initialValue ?? menuProvider.types?.last, + statuses: menuProvider.types, onSelect: onSelect, ) ); diff --git a/lib/views/widgets/status/report/service_status.dart b/lib/views/widgets/status/report/service_status.dart index 6851ab38..a9bd0950 100644 --- a/lib/views/widgets/status/report/service_status.dart +++ b/lib/views/widgets/status/report/service_status.dart @@ -1,14 +1,14 @@ import 'package:test_sa/controllers/providers/api/status_drop_down/report/service_types_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/models/status.dart'; +import 'package:test_sa/models/lookup.dart'; import 'package:test_sa/views/widgets/loaders/loading_manager.dart'; import 'package:test_sa/views/widgets/status/single_status_menu.dart'; import 'package:flutter/material.dart'; import 'package:provider/provider.dart'; class ServiceStatusMenu extends StatelessWidget { - final Function(Status) onSelect; - final Status initialValue; + final Function(Lookup) onSelect; + final Lookup initialValue; const ServiceStatusMenu({Key key, this.onSelect, this.initialValue}) : super(key: key); @override diff --git a/lib/views/widgets/status/service_request/service_request_defect_types_mune.dart b/lib/views/widgets/status/service_request/service_request_defect_types_mune.dart new file mode 100644 index 00000000..5d4e0902 --- /dev/null +++ b/lib/views/widgets/status/service_request/service_request_defect_types_mune.dart @@ -0,0 +1,41 @@ +import 'package:test_sa/controllers/providers/api/status_drop_down/employee/employee_provider.dart'; +import 'package:test_sa/controllers/providers/api/status_drop_down/pentry/pentry_task_status_provider.dart'; +import 'package:test_sa/controllers/providers/api/status_drop_down/pentry/pentry_visit_status_provider.dart'; +import 'package:test_sa/controllers/providers/api/status_drop_down/report/service_report_defect_types_provider.dart'; +import 'package:test_sa/controllers/providers/api/status_drop_down/report/service_report_priority_provider.dart'; +import 'package:test_sa/controllers/providers/api/user_provider.dart'; +import 'package:test_sa/controllers/providers/settings/setting_provider.dart'; +import 'package:test_sa/models/lookup.dart'; +import 'package:test_sa/views/widgets/loaders/loading_manager.dart'; +import 'package:test_sa/views/widgets/status/single_status_menu.dart'; +import 'package:flutter/material.dart'; +import 'package:provider/provider.dart'; +class ServiceRequestDefectTypesMenu extends StatelessWidget { + final Function(Lookup) onSelect; + final Lookup initialValue; + + const ServiceRequestDefectTypesMenu({Key key, this.onSelect, this.initialValue}) : super(key: key); + @override + Widget build(BuildContext context) { + final settingProvider = Provider.of(context); + final userProvider = Provider.of(context); + final menuProvider = Provider.of(context); + return LoadingManager( + isLoading: menuProvider.isLoading, + isFailedLoading: menuProvider.items == null, + stateCode: menuProvider.stateCode, + onRefresh: () async { + menuProvider.reset(); + await menuProvider.getData( + user: userProvider.user, + host: settingProvider.host + ); + }, + child: SingleStatusMenu( + initialStatus: initialValue, + statuses: menuProvider.items, + onSelect: onSelect, + ) + ); + } +} diff --git a/lib/views/widgets/status/service_request/service_request_priority_mune.dart b/lib/views/widgets/status/service_request/service_request_priority_mune.dart new file mode 100644 index 00000000..709d35a4 --- /dev/null +++ b/lib/views/widgets/status/service_request/service_request_priority_mune.dart @@ -0,0 +1,40 @@ +import 'package:test_sa/controllers/providers/api/status_drop_down/employee/employee_provider.dart'; +import 'package:test_sa/controllers/providers/api/status_drop_down/pentry/pentry_task_status_provider.dart'; +import 'package:test_sa/controllers/providers/api/status_drop_down/pentry/pentry_visit_status_provider.dart'; +import 'package:test_sa/controllers/providers/api/status_drop_down/report/service_report_priority_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/models/lookup.dart'; +import 'package:test_sa/views/widgets/loaders/loading_manager.dart'; +import 'package:test_sa/views/widgets/status/single_status_menu.dart'; +import 'package:flutter/material.dart'; +import 'package:provider/provider.dart'; +class ServiceRequestPriorityMenu extends StatelessWidget { + final Function(Lookup) onSelect; + final Lookup initialValue; + + const ServiceRequestPriorityMenu({Key key, this.onSelect, this.initialValue}) : super(key: key); + @override + Widget build(BuildContext context) { + final settingProvider = Provider.of(context); + final userProvider = Provider.of(context); + final menuProvider = Provider.of(context); + return LoadingManager( + isLoading: menuProvider.isLoading, + isFailedLoading: menuProvider.items == null, + stateCode: menuProvider.stateCode, + onRefresh: () async { + menuProvider.reset(); + await menuProvider.getData( + user: userProvider.user, + host: settingProvider.host + ); + }, + child: SingleStatusMenu( + initialStatus: initialValue, + statuses: menuProvider.items, + onSelect: onSelect, + ) + ); + } +} diff --git a/lib/views/widgets/status/single_status_menu.dart b/lib/views/widgets/status/single_status_menu.dart index 6923b555..592830ef 100644 --- a/lib/views/widgets/status/single_status_menu.dart +++ b/lib/views/widgets/status/single_status_menu.dart @@ -1,11 +1,11 @@ -import 'package:test_sa/models/status.dart'; +import 'package:test_sa/models/lookup.dart'; import 'package:test_sa/views/app_style/colors.dart'; import 'package:test_sa/views/app_style/sizing.dart'; import 'package:flutter/material.dart'; class SingleStatusMenu extends StatefulWidget { - final List statuses; - final Status initialStatus; - final Function(Status) onSelect; + final List statuses; + final Lookup initialStatus; + final Function(Lookup) onSelect; const SingleStatusMenu({Key key, this.statuses, this.onSelect, this.initialStatus}) : super(key: key); @override @@ -14,7 +14,7 @@ class SingleStatusMenu extends StatefulWidget { class _SingleStatusMenuState extends State { - Status _selectedStatus; + Lookup _selectedStatus; @override void didUpdateWidget(covariant SingleStatusMenu oldWidget) { @@ -56,7 +56,7 @@ class _SingleStatusMenuState extends State { AppStyle.boxShadow ] ), - child: DropdownButton( + child: DropdownButton( value: _selectedStatus, iconSize: 24, elevation: 16, @@ -69,15 +69,15 @@ class _SingleStatusMenuState extends State { color: Theme.of(context).primaryColor ), underline: SizedBox.shrink(), - onChanged: (Status newValue) { + onChanged: (Lookup newValue) { setState(() { _selectedStatus = newValue; }); widget.onSelect(newValue); }, items: widget.statuses - .map>((Status value) { - return DropdownMenuItem( + .map>((Lookup value) { + return DropdownMenuItem( value: value, child: Text( value.label, diff --git a/lib/views/widgets/timer/app_timer.dart b/lib/views/widgets/timer/app_timer.dart index c2c332b3..48f96723 100644 --- a/lib/views/widgets/timer/app_timer.dart +++ b/lib/views/widgets/timer/app_timer.dart @@ -30,19 +30,19 @@ class _AppTimerState extends State { final ValueNotifier _period = ValueNotifier("0:00:00"); _startTimer() async { - final time = DateTime.now(); - bool result = await widget.onChange( - TimerModel(startAt: time,endAt: null,durationInSecond: _delay)); - if(!result) return; - _running = true; + if (!_running) { + final time = DateTime.now(); + bool result = await widget.onChange( + TimerModel(startAt: time,endAt: null,durationInSecond: _delay)); + if(!result) return; + _running = true; - if(_endAt != null){ - _delay += _endAt.difference(_startAt).inSeconds; + if(_endAt != null){ + _delay += _endAt.difference(_startAt).inSeconds; + } + _startAt = time.subtract(Duration(seconds: _delay)); + _endAt = null; } - _startAt = time.subtract(Duration(seconds: _delay)); - _endAt = null; - - _timer = Timer.periodic(const Duration(seconds: 1), (timer) { if(_loading == true) return; @@ -78,32 +78,13 @@ class _AppTimerState extends State { @override void initState() { - // TODO: implement initState - // if(widget.timer?.isNotEmpty == true){ - // _startAt = widget.timer.last.startAt; - // _endAt = widget.timer.last.endAt; - // _running = _startAt != null && _endAt == null; - // print(_startAt); - // print(_endAt); - // print(_running); - // if(widget.timer.length != 1){ - // for (int i = 0;i=2.7.0 <3.0.0" From 2d741e59174511bf9660f1b1a2395a9ae471f7cf Mon Sep 17 00:00:00 2001 From: MaximusAshraf <50173497+MaximusAshraf@users.noreply.github.com> Date: Sat, 14 Jan 2023 22:33:57 +0200 Subject: [PATCH 003/181] remove unused file --- .../data/pentry/pentry_controller.dart | 18 ------------------ .../pages/user/visits/pantry/edit_pentry.dart | 1 - .../user/visits/pantry/future_edit_pently.dart | 1 - 3 files changed, 20 deletions(-) delete mode 100644 lib/controllers/data/pentry/pentry_controller.dart diff --git a/lib/controllers/data/pentry/pentry_controller.dart b/lib/controllers/data/pentry/pentry_controller.dart deleted file mode 100644 index f12b27b8..00000000 --- a/lib/controllers/data/pentry/pentry_controller.dart +++ /dev/null @@ -1,18 +0,0 @@ -import 'dart:convert'; - -import 'package:flutter/material.dart'; -import 'package:http/http.dart'; -import 'package:test_sa/models/lookup.dart'; -import 'package:test_sa/models/pantry/pentry.dart'; -import 'package:test_sa/models/visits/visit.dart'; - -import '../../../models/user.dart'; -import '../../api_routes/urls.dart'; - -class PentryController { - const PentryController._(); - - static const PentryController instance = PentryController._(); - - -} \ No newline at end of file diff --git a/lib/views/pages/user/visits/pantry/edit_pentry.dart b/lib/views/pages/user/visits/pantry/edit_pentry.dart index 6b508552..be244603 100644 --- a/lib/views/pages/user/visits/pantry/edit_pentry.dart +++ b/lib/views/pages/user/visits/pantry/edit_pentry.dart @@ -1,7 +1,6 @@ import 'package:flutter/material.dart'; import 'package:fluttertoast/fluttertoast.dart'; import 'package:provider/provider.dart'; -import 'package:test_sa/controllers/data/pentry/pentry_controller.dart'; import 'package:test_sa/controllers/http_status_manger/http_status_manger.dart'; import 'package:test_sa/controllers/localization/localization.dart'; import 'package:test_sa/controllers/providers/api/device_transfer_provider.dart'; diff --git a/lib/views/pages/user/visits/pantry/future_edit_pently.dart b/lib/views/pages/user/visits/pantry/future_edit_pently.dart index 829052e0..a4077a44 100644 --- a/lib/views/pages/user/visits/pantry/future_edit_pently.dart +++ b/lib/views/pages/user/visits/pantry/future_edit_pently.dart @@ -1,6 +1,5 @@ import 'package:flutter/material.dart'; import 'package:provider/provider.dart'; -import 'package:test_sa/controllers/data/pentry/pentry_controller.dart'; import 'package:test_sa/controllers/localization/localization.dart'; import 'package:test_sa/controllers/providers/api/regular_visits_provider.dart'; import 'package:test_sa/controllers/providers/api/user_provider.dart'; From 72ff36020c8788b7f17b31c0df4762c02dc76e14 Mon Sep 17 00:00:00 2001 From: MaximusAshraf <50173497+MaximusAshraf@users.noreply.github.com> Date: Sat, 14 Jan 2023 23:09:43 +0200 Subject: [PATCH 004/181] remove prints and optimize imports --- .../providers/api/device_transfer_provider.dart | 11 ----------- .../providers/api/devices_provider.dart | 3 --- .../providers/api/gas_refill_provider.dart | 13 ------------- .../providers/api/hospitals_provider.dart | 6 +----- .../providers/api/regular_visits_provider.dart | 12 ------------ .../api/service_requests_provider.dart | 16 ---------------- .../employee/employee_provider.dart | 1 - .../gas_refill/gas_types_provider.dart | 1 - .../pentry/pentry_status_provider.dart | 4 ++-- .../pentry/pentry_task_status_provider.dart | 4 ++-- .../pentry/pentry_visit_status_provider.dart | 3 +-- .../service_report_defect_types_provider.dart | 4 ++-- .../service_report_priority_provider.dart | 3 +-- .../device_transfer_details.dart | 2 -- .../request_device_transfer.dart | 1 - .../device_transfer/track_device_transfer.dart | 13 +++---------- .../device_transfer/update_device_transfer.dart | 3 --- lib/views/pages/register.dart | 8 ++++---- lib/views/pages/splash_screen.dart | 9 +++------ .../user/gas_refill/request_gas_refill.dart | 2 -- .../pages/user/gas_refill/track_gas_refill.dart | 11 +++-------- lib/views/pages/user/land_page.dart | 17 +++++++---------- .../user/notifications/notifications_list.dart | 2 +- .../user/notifications/notifications_page.dart | 4 ++-- lib/views/pages/user/profile_page.dart | 6 +++--- lib/views/pages/user/report_issues_page.dart | 7 +++---- .../pages/user/requests/create_request.dart | 1 - .../future_request_service_details.dart | 4 ++-- .../requests/report/create_service_report.dart | 13 ++++++------- .../requests/report/edit_service_report.dart | 12 +++++------- .../requests/report/future_service_report.dart | 5 ++--- .../pages/user/requests/request_details.dart | 9 ++++----- .../pages/user/requests/requests_page.dart | 6 +++--- .../pages/user/visits/pantry/edit_pentry.dart | 4 ---- .../user/visits/pantry/future_edit_pently.dart | 2 +- .../preventive_maintenance_visits_page.dart | 10 +++++----- .../pages/user/visits/regular_visits_page.dart | 10 +++++----- .../user/visits/update_visits_group_sheet.dart | 2 +- lib/views/pages/user/visits/visit_details.dart | 2 +- lib/views/widgets/buttons/app_back_button.dart | 2 +- lib/views/widgets/buttons/app_button.dart | 2 +- lib/views/widgets/buttons/app_flat_button.dart | 2 +- lib/views/widgets/buttons/app_icon_button.dart | 4 ++-- lib/views/widgets/buttons/app_icon_button2.dart | 2 +- .../widgets/buttons/app_outlined_button.dart | 2 +- lib/views/widgets/buttons/app_small_button.dart | 2 +- lib/views/widgets/dialogs/dialog.dart | 4 ++-- lib/views/widgets/drawer/drawer_item.dart | 2 +- lib/views/widgets/images/image_item.dart | 4 ++-- lib/views/widgets/images/images_list.dart | 2 +- lib/views/widgets/images/images_viewer.dart | 2 +- .../widgets/images/mini_one_image_picker.dart | 6 +++--- .../widgets/images/multi_image_picker.dart | 8 ++++---- .../widgets/images/multi_image_picker_item.dart | 2 +- lib/views/widgets/images/one_image_picker.dart | 6 +++--- lib/views/widgets/issues/report_issue_item.dart | 2 +- lib/views/widgets/loaders/app_lazy_loading.dart | 2 +- lib/views/widgets/loaders/failed_loading.dart | 2 +- lib/views/widgets/loaders/lazy_loading.dart | 2 +- lib/views/widgets/loaders/loading_manager.dart | 2 +- lib/views/widgets/loaders/no_item_found.dart | 2 +- .../parts/auto_complete_parts_field.dart | 7 +++---- lib/views/widgets/parts/part_item.dart | 2 +- .../auto_complete_devices_field.dart | 7 +++---- .../pentry/pentry_calibration_tool_form.dart | 5 ----- lib/views/widgets/pentry/pentry_info_form.dart | 9 --------- .../widgets/pentry/pentry_pm_kit_form.dart | 4 ---- .../pentry/pentry_ppm_check_list_form.dart | 2 -- lib/views/widgets/requests/info_row.dart | 2 +- lib/views/widgets/requests/request_status.dart | 4 +--- .../widgets/requests/service_request_item.dart | 13 ++++--------- .../widgets/requests/service_request_list.dart | 2 +- .../requests/service_request_update_dialog.dart | 9 ++------- lib/views/widgets/search/filter_item.dart | 2 +- .../search/service_request_search_bar.dart | 4 ++-- lib/views/widgets/search/visits_search_bar.dart | 4 ++-- lib/views/widgets/sound/record_sound.dart | 5 ----- lib/views/widgets/sound/sound_player.dart | 5 +---- .../widgets/status/employee/employee_mune.dart | 4 ++-- .../status/gas_refill/gas_cylinder_size.dart | 6 ++---- .../widgets/status/gas_refill/gas_status.dart | 6 ++---- .../widgets/status/gas_refill/gas_type.dart | 7 ++----- lib/views/widgets/status/multi_status_menu.dart | 3 +-- .../status/pentry/pentry_status_mune.dart | 7 ++----- .../status/pentry/pentry_task_status_mune.dart | 5 ++--- .../status/pentry/pentry_visit_status_mune.dart | 6 ++---- .../status/report/service_report_last_call.dart | 6 +++--- .../status/report/service_report_reasons.dart | 4 ++-- .../status/report/service_report_status.dart | 6 +++--- .../status/report/service_report_type.dart | 4 ++-- .../widgets/status/report/service_status.dart | 4 ++-- .../service_request_defect_types_mune.dart | 8 ++------ .../service_request_priority_mune.dart | 7 ++----- .../widgets/status/single_status_menu.dart | 2 +- lib/views/widgets/timer/app_timer.dart | 1 - lib/views/widgets/titles/app_sub_title.dart | 2 +- lib/views/widgets/titles/app_title.dart | 2 +- .../widgets/titles/expandable_info_row.dart | 2 +- lib/views/widgets/visits/visit_item.dart | 7 +++---- lib/views/widgets/visits/visit_status.dart | 2 +- lib/views/widgets/visits/visits_list.dart | 2 +- 101 files changed, 167 insertions(+), 332 deletions(-) diff --git a/lib/controllers/providers/api/device_transfer_provider.dart b/lib/controllers/providers/api/device_transfer_provider.dart index e646a6da..907ae2ff 100644 --- a/lib/controllers/providers/api/device_transfer_provider.dart +++ b/lib/controllers/providers/api/device_transfer_provider.dart @@ -74,10 +74,6 @@ class DeviceTransferProvider extends ChangeNotifier{ // return 200; Response response; try{ - print( Uri.parse( - "$host${URLs.getDeviceTransfer}?uid=${user.id}" - "&token=${user.token}&page=${(items?.length ?? 0) ~/pageItemNumber}" - ),); response = await get( Uri.parse( "$host${URLs.getDeviceTransfer}?uid=${user.id}" @@ -106,7 +102,6 @@ class DeviceTransferProvider extends ChangeNotifier{ return response.statusCode; } catch(error) { - print(error); isLoading = false; stateCode = -1; notifyListeners(); @@ -137,7 +132,6 @@ class DeviceTransferProvider extends ChangeNotifier{ body: body, ); - print(response.body); stateCode = response.statusCode; if(response.statusCode >= 200 && response.statusCode < 300) { if(items != null) { @@ -153,7 +147,6 @@ class DeviceTransferProvider extends ChangeNotifier{ return response.statusCode; } catch(error) { - print(error); return -1; } @@ -175,16 +168,13 @@ class DeviceTransferProvider extends ChangeNotifier{ }; body.addAll(newModel.toJson(isSender)); - print(body); Response response; try{ - print(Uri.parse("$host${URLs.updateDeviceTransfer}/$requestId"),); response = await post( Uri.parse("$host${URLs.updateDeviceTransfer}/$requestId"), body: body, ); - print(response.body); stateCode = response.statusCode; if(response.statusCode >= 200 && response.statusCode < 300) { reset(); @@ -198,7 +188,6 @@ class DeviceTransferProvider extends ChangeNotifier{ return response.statusCode; } catch(error) { - print(error); return -1; } diff --git a/lib/controllers/providers/api/devices_provider.dart b/lib/controllers/providers/api/devices_provider.dart index 985f3aad..d434551f 100644 --- a/lib/controllers/providers/api/devices_provider.dart +++ b/lib/controllers/providers/api/devices_provider.dart @@ -128,13 +128,10 @@ class DevicesProvider extends ChangeNotifier{ if(response.statusCode >= 200 && response.statusCode < 300) { // client's request was successfully received List categoriesListJson = json.decode(utf8.decode(response.bodyBytes)); - print(categoriesListJson.length); _page = categoriesListJson.map((device) => Device.fromJson(device)).toList(); - print(_page.length); } return _page; } catch(error) { - print(error); _loading = false; _stateCode = -1; notifyListeners(); diff --git a/lib/controllers/providers/api/gas_refill_provider.dart b/lib/controllers/providers/api/gas_refill_provider.dart index a409eea1..5297ae06 100644 --- a/lib/controllers/providers/api/gas_refill_provider.dart +++ b/lib/controllers/providers/api/gas_refill_provider.dart @@ -54,10 +54,6 @@ class GasRefillProvider extends ChangeNotifier{ isLoading = true; Response response; try{ - print( Uri.parse( - "$host${URLs.getGasRefill}?uid=${user.id}" - "&token=${user.token}&page=${(items?.length ?? 0) ~/pageItemNumber}" - )); response = await get( Uri.parse( "$host${URLs.getGasRefill}?uid=${user.id}" @@ -67,7 +63,6 @@ class GasRefillProvider extends ChangeNotifier{ "Content-Type":"application/json; charset=utf-8" } ); - print(response.body); stateCode = response.statusCode; if(stateCode >= 200 && stateCode < 300) { // client's request was successfully received @@ -87,7 +82,6 @@ class GasRefillProvider extends ChangeNotifier{ return response.statusCode; } catch(error) { - print(error); isLoading = false; stateCode = -1; notifyListeners(); @@ -114,7 +108,6 @@ class GasRefillProvider extends ChangeNotifier{ "requsted_qty": model.requestedQuantity.toString(), }).toList()); - print(body); Response response; try{ response = await post( @@ -123,7 +116,6 @@ class GasRefillProvider extends ChangeNotifier{ body: body, ); - print(response.body); stateCode = response.statusCode; if(response.statusCode >= 200 && response.statusCode < 300) { if(items != null) { @@ -139,7 +131,6 @@ class GasRefillProvider extends ChangeNotifier{ return response.statusCode; } catch(error) { - print(error); return -1; } @@ -165,8 +156,6 @@ class GasRefillProvider extends ChangeNotifier{ "deliverd_qty": model.deliveredQuantity.toString(), }).toList()); - print(body); - print(Uri.parse("$host${URLs.updateGasRefill}/${newModel.id}"),); Response response; try{ response = await post( @@ -174,7 +163,6 @@ class GasRefillProvider extends ChangeNotifier{ body: body, ); - print(response.body); stateCode = response.statusCode; if(response.statusCode >= 200 && response.statusCode < 300) { oldModel.fromGasRefillModel(newModel); @@ -183,7 +171,6 @@ class GasRefillProvider extends ChangeNotifier{ return response.statusCode; } catch(error) { - print(error); return -1; } diff --git a/lib/controllers/providers/api/hospitals_provider.dart b/lib/controllers/providers/api/hospitals_provider.dart index e7d61595..5e3c4509 100644 --- a/lib/controllers/providers/api/hospitals_provider.dart +++ b/lib/controllers/providers/api/hospitals_provider.dart @@ -55,11 +55,7 @@ class HospitalsProvider extends ChangeNotifier{ notifyListeners(); Response response; try{ - print( Uri.parse( - host + URLs.getHospitals - + "?page=${(_hospitals?.length ?? 0) ~/pageItemNumber}" - + ( title == null || title.isEmpty ? "" : "&name=$title" ))); - response = await get( + response = await get( Uri.parse( host + URLs.getHospitals + "?page=${(_hospitals?.length ?? 0) ~/pageItemNumber}" diff --git a/lib/controllers/providers/api/regular_visits_provider.dart b/lib/controllers/providers/api/regular_visits_provider.dart index bc0ec05c..03737f73 100644 --- a/lib/controllers/providers/api/regular_visits_provider.dart +++ b/lib/controllers/providers/api/regular_visits_provider.dart @@ -55,11 +55,6 @@ class RegularVisitsProvider extends ChangeNotifier{ Response response; //userId = 397.toString(); // testing id to view data try{ - print( Uri.parse( - "$host${URLs.getRegularVisits}?uid=${user.id}" - "&token=${user.token}" - "&page=${(visits?.length ?? 0) ~/pageItemNumber}${visitsSearch?.toSearchString()}" ?? "" - )); response = await get( Uri.parse( host+URLs.getRegularVisits @@ -95,7 +90,6 @@ class RegularVisitsProvider extends ChangeNotifier{ nextPage = false; } }catch(error){ - print(error); isLoading = false; stateCode = -1; notifyListeners(); @@ -146,14 +140,12 @@ class RegularVisitsProvider extends ChangeNotifier{ Future getPently({String host,User user,String id}) async { Response response; - print(Uri.parse("$host${URLs.getPentry}/$id"),); response = await get( Uri.parse("$host${URLs.getPentry}/$id"), headers: { "Content-Type":"application/json; charset=utf-8" } ); - print(response.body); Pentry pantry; if(response.statusCode >= 200 && response.statusCode < 300) { @@ -173,13 +165,10 @@ class RegularVisitsProvider extends ChangeNotifier{ Map body = pentry.toMap(); body["uid"] = user.id; body["token"] = user.token; - print( Uri.parse(host+URLs.updatePentry + "/${visit.id}"),); - print(body); response = await post( Uri.parse(host+URLs.updatePentry + "/${visit.id}"), body: body, ); - print(response.body); if(response.statusCode >= 200 && response.statusCode < 300) { visit.status = pentry.ppmVisitStatus; notifyListeners(); @@ -187,7 +176,6 @@ class RegularVisitsProvider extends ChangeNotifier{ return response.statusCode; } catch(error) { - print(error); return -1; } diff --git a/lib/controllers/providers/api/service_requests_provider.dart b/lib/controllers/providers/api/service_requests_provider.dart index 3b452497..cb62d06b 100644 --- a/lib/controllers/providers/api/service_requests_provider.dart +++ b/lib/controllers/providers/api/service_requests_provider.dart @@ -58,14 +58,6 @@ class ServiceRequestsProvider extends ChangeNotifier{ isLoading = true; Response response; try{ - print( Uri.parse( - host+URLs.getServiceRequests - +"?uid=${user.id}" - +(hospitalId == null? "" :"&client_nid=$hospitalId") - +"&token=${user.token}" - "&page=${(serviceRequests?.length ?? 0) ~/pageItemNumber}" - +search?.toSearchString() ?? "" - )); response = await get( Uri.parse( host+URLs.getServiceRequests @@ -79,7 +71,6 @@ class ServiceRequestsProvider extends ChangeNotifier{ "Content-Type":"application/json; charset=utf-8" } ); - print(response.body); stateCode = response.statusCode; if(response.statusCode >= 200 && response.statusCode < 300) { // client's request was successfully received @@ -100,7 +91,6 @@ class ServiceRequestsProvider extends ChangeNotifier{ return response.statusCode; } catch(error) { - print(error); isLoading = false; stateCode = -1; notifyListeners(); @@ -167,7 +157,6 @@ class ServiceRequestsProvider extends ChangeNotifier{ if(serviceRequest.audio != null){ body["audio"] = serviceRequest.audio; } - print(body); Response response; try{ response = await post( @@ -175,7 +164,6 @@ class ServiceRequestsProvider extends ChangeNotifier{ host+URLs.createRequest), body: body, ); - print(response.body); stateCode = response.statusCode; if(response.statusCode >= 200 && response.statusCode < 300) { if(serviceRequests != null) @@ -190,7 +178,6 @@ class ServiceRequestsProvider extends ChangeNotifier{ return response.statusCode; } catch(error) { - print(error); return -1; } @@ -237,14 +224,12 @@ class ServiceRequestsProvider extends ChangeNotifier{ body["nid"] = request.id; if(newDate != null) body["date"] = newDate; if(employee != null) body["ass_emp"] = employee.id.toString(); - print(body); try{ response = await post( Uri.parse( host+URLs.updateRequestDate), body: body, ); - print(response.body); stateCode = response.statusCode; if(response.statusCode >= 200 && response.statusCode < 300) { request.engineerName = employee.label; @@ -379,7 +364,6 @@ class ServiceRequestsProvider extends ChangeNotifier{ host+URLs.updateServiceReport), body: body, ); - print(response.body); //stateCode = response.statusCode; if(response.statusCode >= 200 && response.statusCode < 300) { diff --git a/lib/controllers/providers/api/status_drop_down/employee/employee_provider.dart b/lib/controllers/providers/api/status_drop_down/employee/employee_provider.dart index bd4db06c..e21f7180 100644 --- a/lib/controllers/providers/api/status_drop_down/employee/employee_provider.dart +++ b/lib/controllers/providers/api/status_drop_down/employee/employee_provider.dart @@ -52,7 +52,6 @@ class EmployeesProvider extends ChangeNotifier{ Uri.parse( host + URLs.getEmployees), ); - print(response.body); _stateCode = response.statusCode; if(response.statusCode >= 200 && response.statusCode < 300) { // client's request was successfully received diff --git a/lib/controllers/providers/api/status_drop_down/gas_refill/gas_types_provider.dart b/lib/controllers/providers/api/status_drop_down/gas_refill/gas_types_provider.dart index fa193fa4..80e0d531 100644 --- a/lib/controllers/providers/api/status_drop_down/gas_refill/gas_types_provider.dart +++ b/lib/controllers/providers/api/status_drop_down/gas_refill/gas_types_provider.dart @@ -61,7 +61,6 @@ class GasTypesProvider extends ChangeNotifier{ notifyListeners(); return response.statusCode; } catch(error) { - print(error); _loading = false; _stateCode = -1; notifyListeners(); diff --git a/lib/controllers/providers/api/status_drop_down/pentry/pentry_status_provider.dart b/lib/controllers/providers/api/status_drop_down/pentry/pentry_status_provider.dart index d659ca7a..75d18783 100644 --- a/lib/controllers/providers/api/status_drop_down/pentry/pentry_status_provider.dart +++ b/lib/controllers/providers/api/status_drop_down/pentry/pentry_status_provider.dart @@ -52,7 +52,7 @@ class PentryStatusProvider extends ChangeNotifier{ Uri.parse( host + URLs.getPentryStatus), ); - print(response.body); + _stateCode = response.statusCode; if(response.statusCode >= 200 && response.statusCode < 300) { // client's request was successfully received @@ -63,7 +63,7 @@ class PentryStatusProvider extends ChangeNotifier{ notifyListeners(); return response.statusCode; } catch(error) { - print(error); + _loading = false; _stateCode = -1; notifyListeners(); diff --git a/lib/controllers/providers/api/status_drop_down/pentry/pentry_task_status_provider.dart b/lib/controllers/providers/api/status_drop_down/pentry/pentry_task_status_provider.dart index 5bbedd0b..900671e1 100644 --- a/lib/controllers/providers/api/status_drop_down/pentry/pentry_task_status_provider.dart +++ b/lib/controllers/providers/api/status_drop_down/pentry/pentry_task_status_provider.dart @@ -52,7 +52,7 @@ class PentryTaskStatusProvider extends ChangeNotifier{ Uri.parse( host + URLs.getPentryTaskStatus), ); - print(response.body); + _stateCode = response.statusCode; if(response.statusCode >= 200 && response.statusCode < 300) { // client's request was successfully received @@ -63,7 +63,7 @@ class PentryTaskStatusProvider extends ChangeNotifier{ notifyListeners(); return response.statusCode; } catch(error) { - print(error); + _loading = false; _stateCode = -1; notifyListeners(); diff --git a/lib/controllers/providers/api/status_drop_down/pentry/pentry_visit_status_provider.dart b/lib/controllers/providers/api/status_drop_down/pentry/pentry_visit_status_provider.dart index a25a402f..c8562f25 100644 --- a/lib/controllers/providers/api/status_drop_down/pentry/pentry_visit_status_provider.dart +++ b/lib/controllers/providers/api/status_drop_down/pentry/pentry_visit_status_provider.dart @@ -52,7 +52,7 @@ class PentryVisitStatusProvider extends ChangeNotifier{ Uri.parse( host + URLs.getPentryVisitStatus), ); - print(response.body); + _stateCode = response.statusCode; if(response.statusCode >= 200 && response.statusCode < 300) { // client's request was successfully received @@ -63,7 +63,6 @@ class PentryVisitStatusProvider extends ChangeNotifier{ notifyListeners(); return response.statusCode; } catch(error) { - print(error); _loading = false; _stateCode = -1; notifyListeners(); diff --git a/lib/controllers/providers/api/status_drop_down/report/service_report_defect_types_provider.dart b/lib/controllers/providers/api/status_drop_down/report/service_report_defect_types_provider.dart index 3547e8cc..a61b1e76 100644 --- a/lib/controllers/providers/api/status_drop_down/report/service_report_defect_types_provider.dart +++ b/lib/controllers/providers/api/status_drop_down/report/service_report_defect_types_provider.dart @@ -52,7 +52,7 @@ class ServiceRequestDefectTypesProvider extends ChangeNotifier{ Uri.parse( host + URLs.getServiceReportDefectTypes), ); - print(response.body); + _stateCode = response.statusCode; if(response.statusCode >= 200 && response.statusCode < 300) { // client's request was successfully received @@ -63,7 +63,7 @@ class ServiceRequestDefectTypesProvider extends ChangeNotifier{ notifyListeners(); return response.statusCode; } catch(error) { - print(error); + _loading = false; _stateCode = -1; notifyListeners(); diff --git a/lib/controllers/providers/api/status_drop_down/report/service_report_priority_provider.dart b/lib/controllers/providers/api/status_drop_down/report/service_report_priority_provider.dart index bcee8d4c..beb18280 100644 --- a/lib/controllers/providers/api/status_drop_down/report/service_report_priority_provider.dart +++ b/lib/controllers/providers/api/status_drop_down/report/service_report_priority_provider.dart @@ -52,7 +52,7 @@ class ServiceRequestPriorityProvider extends ChangeNotifier{ Uri.parse( host + URLs.getServiceReportPriority), ); - print(response.body); + _stateCode = response.statusCode; if(response.statusCode >= 200 && response.statusCode < 300) { // client's request was successfully received @@ -63,7 +63,6 @@ class ServiceRequestPriorityProvider extends ChangeNotifier{ notifyListeners(); return response.statusCode; } catch(error) { - print(error); _loading = false; _stateCode = -1; notifyListeners(); diff --git a/lib/views/pages/device_transfer/device_transfer_details.dart b/lib/views/pages/device_transfer/device_transfer_details.dart index 9b089448..7b36058c 100644 --- a/lib/views/pages/device_transfer/device_transfer_details.dart +++ b/lib/views/pages/device_transfer/device_transfer_details.dart @@ -15,7 +15,6 @@ import 'package:test_sa/views/widgets/buttons/app_small_button.dart'; import 'package:test_sa/views/widgets/device_trancfer/device_transfer_info_section.dart'; import 'package:test_sa/views/widgets/loaders/loading_manager.dart'; import 'package:test_sa/views/widgets/requests/info_row.dart'; -import 'package:test_sa/views/widgets/requests/request_status.dart'; class DeviceTransferDetails extends StatefulWidget { final DeviceTransfer model; @@ -51,7 +50,6 @@ class _DeviceTransferDetailsState extends State { _userProvider = Provider.of(context); _settingProvider = Provider.of(context); _deviceTransferProvider = Provider.of(context); - print(_userProvider.user.id); _isSender = _userProvider.user.id == widget.model.sender?.userId; _isReceiver = _userProvider.user.id == widget.model.receiver?.userId; return Scaffold( diff --git a/lib/views/pages/device_transfer/request_device_transfer.dart b/lib/views/pages/device_transfer/request_device_transfer.dart index f8ad6948..aa5562b9 100644 --- a/lib/views/pages/device_transfer/request_device_transfer.dart +++ b/lib/views/pages/device_transfer/request_device_transfer.dart @@ -11,7 +11,6 @@ import 'package:test_sa/models/subtitle.dart'; import 'package:test_sa/views/app_style/sizing.dart'; import 'package:test_sa/views/widgets/buttons/app_button.dart'; import 'package:test_sa/views/widgets/departments/department_button.dart'; -import 'package:test_sa/views/widgets/e_signature/e_signature.dart'; import 'package:test_sa/views/widgets/equipment/device_button.dart'; import 'package:test_sa/views/widgets/hospitals/hospital_button.dart'; import 'package:test_sa/views/widgets/loaders/loading_manager.dart'; diff --git a/lib/views/pages/device_transfer/track_device_transfer.dart b/lib/views/pages/device_transfer/track_device_transfer.dart index 7308617f..454d6d30 100644 --- a/lib/views/pages/device_transfer/track_device_transfer.dart +++ b/lib/views/pages/device_transfer/track_device_transfer.dart @@ -1,21 +1,14 @@ +import 'package:flutter/material.dart'; +import 'package:provider/provider.dart'; import 'package:test_sa/controllers/localization/localization.dart'; import 'package:test_sa/controllers/providers/api/device_transfer_provider.dart'; -import 'package:test_sa/controllers/providers/api/gas_refill_provider.dart'; -import 'package:test_sa/controllers/providers/api/service_requests_provider.dart'; import 'package:test_sa/controllers/providers/api/user_provider.dart'; import 'package:test_sa/controllers/providers/settings/setting_provider.dart'; -import 'package:test_sa/models/service_request/service_request_search.dart'; import 'package:test_sa/models/subtitle.dart'; import 'package:test_sa/views/app_style/colors.dart'; -import 'package:test_sa/views/widgets/device_trancfer/device_transfer_list.dart'; -import 'package:test_sa/views/widgets/gas_refill/gas_refill_list.dart'; -import 'package:test_sa/views/widgets/requests/service_request_list.dart'; import 'package:test_sa/views/widgets/buttons/app_back_button.dart'; -import 'package:test_sa/views/widgets/buttons/app_icon_button.dart'; +import 'package:test_sa/views/widgets/device_trancfer/device_transfer_list.dart'; import 'package:test_sa/views/widgets/loaders/loading_manager.dart'; -import 'package:test_sa/views/widgets/search/service_request_search_bar.dart'; -import 'package:flutter/material.dart'; -import 'package:provider/provider.dart'; class TrackDeviceTransferPage extends StatefulWidget { static const String id = "/track-device-transfer"; diff --git a/lib/views/pages/device_transfer/update_device_transfer.dart b/lib/views/pages/device_transfer/update_device_transfer.dart index f9044b65..2b407a48 100644 --- a/lib/views/pages/device_transfer/update_device_transfer.dart +++ b/lib/views/pages/device_transfer/update_device_transfer.dart @@ -14,10 +14,7 @@ import 'package:test_sa/models/subtitle.dart'; import 'package:test_sa/views/app_style/sizing.dart'; import 'package:test_sa/views/widgets/app_text_form_field.dart'; import 'package:test_sa/views/widgets/buttons/app_button.dart'; -import 'package:test_sa/views/widgets/departments/department_button.dart'; import 'package:test_sa/views/widgets/e_signature/e_signature.dart'; -import 'package:test_sa/views/widgets/equipment/device_button.dart'; -import 'package:test_sa/views/widgets/hospitals/hospital_button.dart'; import 'package:test_sa/views/widgets/loaders/loading_manager.dart'; import 'package:test_sa/views/widgets/status/gas_refill/gas_status.dart'; import 'package:test_sa/views/widgets/titles/app_sub_title.dart'; diff --git a/lib/views/pages/register.dart b/lib/views/pages/register.dart index 04312e9a..016fedf1 100644 --- a/lib/views/pages/register.dart +++ b/lib/views/pages/register.dart @@ -1,3 +1,7 @@ +import 'package:flutter/material.dart'; +import 'package:fluttertoast/fluttertoast.dart'; +import 'package:font_awesome_flutter/font_awesome_flutter.dart'; +import 'package:provider/provider.dart'; import 'package:test_sa/controllers/http_status_manger/http_status_manger.dart'; import 'package:test_sa/controllers/localization/localization.dart'; import 'package:test_sa/controllers/providers/api/user_provider.dart'; @@ -13,10 +17,6 @@ import 'package:test_sa/views/widgets/buttons/app_button.dart'; import 'package:test_sa/views/widgets/departments/department_button.dart'; import 'package:test_sa/views/widgets/hospitals/hospital_button.dart'; import 'package:test_sa/views/widgets/loaders/loading_manager.dart'; -import 'package:flutter/material.dart'; -import 'package:fluttertoast/fluttertoast.dart'; -import 'package:font_awesome_flutter/font_awesome_flutter.dart'; -import 'package:provider/provider.dart'; class Register extends StatefulWidget { static final String id = "/register"; diff --git a/lib/views/pages/splash_screen.dart b/lib/views/pages/splash_screen.dart index 32911345..aea53176 100644 --- a/lib/views/pages/splash_screen.dart +++ b/lib/views/pages/splash_screen.dart @@ -1,16 +1,15 @@ import 'dart:convert'; -import 'package:firebase_messaging/firebase_messaging.dart'; +import 'package:firebase_core/firebase_core.dart'; import 'package:flare_flutter/flare_actor.dart'; +import 'package:flutter/material.dart'; +import 'package:provider/provider.dart'; import 'package:test_sa/controllers/notification/notification_manger.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/models/app_notification.dart'; import 'package:test_sa/models/user.dart'; import 'package:test_sa/views/pages/user/land_page.dart'; -import 'package:firebase_core/firebase_core.dart'; -import 'package:flutter/material.dart'; -import 'package:provider/provider.dart'; import 'login.dart'; @@ -67,10 +66,8 @@ class _SplashScreenState extends State { fit: BoxFit.contain, animation: "splash", callback: (animation) async { - print(await FirebaseMessaging.instance.getToken()); Navigator.of(context).pushNamed(Login.id); if(_settingProvider.isLoaded && _settingProvider.user != null){ - print(_settingProvider.user.toJson()); _goToUserScreen(_settingProvider.user); } }, diff --git a/lib/views/pages/user/gas_refill/request_gas_refill.dart b/lib/views/pages/user/gas_refill/request_gas_refill.dart index 3b0cb343..5f41ec48 100644 --- a/lib/views/pages/user/gas_refill/request_gas_refill.dart +++ b/lib/views/pages/user/gas_refill/request_gas_refill.dart @@ -14,8 +14,6 @@ import 'package:test_sa/views/widgets/app_text_form_field.dart'; import 'package:test_sa/views/widgets/buttons/app_button.dart'; import 'package:test_sa/views/widgets/gas_refill/gas_refill_create_details_item.dart'; import 'package:test_sa/views/widgets/loaders/loading_manager.dart'; -import 'package:test_sa/views/widgets/status/gas_refill/gas_cylinder_size.dart'; -import 'package:test_sa/views/widgets/status/gas_refill/gas_status.dart'; import 'package:test_sa/views/widgets/status/gas_refill/gas_type.dart'; import 'package:test_sa/views/widgets/titles/app_sub_title.dart'; diff --git a/lib/views/pages/user/gas_refill/track_gas_refill.dart b/lib/views/pages/user/gas_refill/track_gas_refill.dart index 2b502f6d..31c67201 100644 --- a/lib/views/pages/user/gas_refill/track_gas_refill.dart +++ b/lib/views/pages/user/gas_refill/track_gas_refill.dart @@ -1,19 +1,14 @@ +import 'package:flutter/material.dart'; +import 'package:provider/provider.dart'; import 'package:test_sa/controllers/localization/localization.dart'; import 'package:test_sa/controllers/providers/api/gas_refill_provider.dart'; -import 'package:test_sa/controllers/providers/api/service_requests_provider.dart'; import 'package:test_sa/controllers/providers/api/user_provider.dart'; import 'package:test_sa/controllers/providers/settings/setting_provider.dart'; -import 'package:test_sa/models/service_request/service_request_search.dart'; import 'package:test_sa/models/subtitle.dart'; import 'package:test_sa/views/app_style/colors.dart'; -import 'package:test_sa/views/widgets/gas_refill/gas_refill_list.dart'; -import 'package:test_sa/views/widgets/requests/service_request_list.dart'; import 'package:test_sa/views/widgets/buttons/app_back_button.dart'; -import 'package:test_sa/views/widgets/buttons/app_icon_button.dart'; +import 'package:test_sa/views/widgets/gas_refill/gas_refill_list.dart'; import 'package:test_sa/views/widgets/loaders/loading_manager.dart'; -import 'package:test_sa/views/widgets/search/service_request_search_bar.dart'; -import 'package:flutter/material.dart'; -import 'package:provider/provider.dart'; class TrackGasRefillPage extends StatefulWidget { static const String id = "/track-gas-refill"; diff --git a/lib/views/pages/user/land_page.dart b/lib/views/pages/user/land_page.dart index c305b4ab..d173219d 100644 --- a/lib/views/pages/user/land_page.dart +++ b/lib/views/pages/user/land_page.dart @@ -1,5 +1,12 @@ import 'dart:io'; +import 'package:flutter/cupertino.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter/services.dart'; +import 'package:font_awesome_flutter/font_awesome_flutter.dart'; +import 'package:package_info/package_info.dart'; +import 'package:provider/provider.dart'; +import 'package:share/share.dart'; import 'package:test_sa/controllers/localization/localization.dart'; import 'package:test_sa/controllers/notification/firebase_notification_manger.dart'; import 'package:test_sa/controllers/providers/api/departments_provider.dart'; @@ -19,20 +26,11 @@ import 'package:test_sa/views/pages/user/gas_refill/request_gas_refill.dart'; import 'package:test_sa/views/pages/user/gas_refill/track_gas_refill.dart'; import 'package:test_sa/views/pages/user/notifications/notifications_page.dart'; import 'package:test_sa/views/pages/user/requests/create_request.dart'; -import 'package:test_sa/views/pages/user/visits/preventive_maintenance_visits_page.dart'; import 'package:test_sa/views/pages/user/visits/regular_visits_page.dart'; import 'package:test_sa/views/widgets/buttons/app_back_button.dart'; import 'package:test_sa/views/widgets/buttons/app_icon_button.dart'; import 'package:test_sa/views/widgets/dialogs/dialog.dart'; import 'package:test_sa/views/widgets/drawer/drawer_item.dart'; -import 'package:test_sa/views/widgets/loaders/image_loader.dart'; -import 'package:flutter/cupertino.dart'; -import 'package:flutter/material.dart'; -import 'package:flutter/services.dart'; -import 'package:font_awesome_flutter/font_awesome_flutter.dart'; -import 'package:package_info/package_info.dart'; -import 'package:provider/provider.dart'; -import 'package:share/share.dart'; import 'package:url_launcher/url_launcher.dart'; import '../../widgets/land_page/land_page_item.dart'; @@ -97,7 +95,6 @@ class _LandPageState extends State { _buttonHeight = 68 * AppStyle.getScaleFactor(context); return WillPopScope( onWillPop: () async { - print("back pressed"); bool result = await showDialog( context: context, builder: (_) => AAlertDialog( diff --git a/lib/views/pages/user/notifications/notifications_list.dart b/lib/views/pages/user/notifications/notifications_list.dart index 2df3171d..6034f1aa 100644 --- a/lib/views/pages/user/notifications/notifications_list.dart +++ b/lib/views/pages/user/notifications/notifications_list.dart @@ -1,3 +1,4 @@ +import 'package:flutter/material.dart'; import 'package:test_sa/controllers/localization/localization.dart'; import 'package:test_sa/models/app_notification.dart'; import 'package:test_sa/models/subtitle.dart'; @@ -5,7 +6,6 @@ import 'package:test_sa/views/pages/user/requests/future_request_service_details import 'package:test_sa/views/widgets/loaders/lazy_loading.dart'; import 'package:test_sa/views/widgets/loaders/no_item_found.dart'; import 'package:test_sa/views/widgets/notifications/notification_item.dart'; -import 'package:flutter/material.dart'; class NotificationsList extends StatelessWidget { final List notifications; final bool nextPage; diff --git a/lib/views/pages/user/notifications/notifications_page.dart b/lib/views/pages/user/notifications/notifications_page.dart index 900fb460..a0e85259 100644 --- a/lib/views/pages/user/notifications/notifications_page.dart +++ b/lib/views/pages/user/notifications/notifications_page.dart @@ -1,3 +1,5 @@ +import 'package:flutter/material.dart'; +import 'package:provider/provider.dart'; import 'package:test_sa/controllers/localization/localization.dart'; import 'package:test_sa/controllers/providers/api/notifications_provider.dart'; import 'package:test_sa/controllers/providers/api/user_provider.dart'; @@ -7,8 +9,6 @@ import 'package:test_sa/views/app_style/colors.dart'; import 'package:test_sa/views/pages/user/notifications/notifications_list.dart'; import 'package:test_sa/views/widgets/buttons/app_back_button.dart'; import 'package:test_sa/views/widgets/loaders/loading_manager.dart'; -import 'package:flutter/material.dart'; -import 'package:provider/provider.dart'; class NotificationsPage extends StatefulWidget { static final String id = "/notifications"; @override diff --git a/lib/views/pages/user/profile_page.dart b/lib/views/pages/user/profile_page.dart index 514655e9..f22b09f6 100644 --- a/lib/views/pages/user/profile_page.dart +++ b/lib/views/pages/user/profile_page.dart @@ -1,3 +1,6 @@ +import 'package:flutter/material.dart'; +import 'package:font_awesome_flutter/font_awesome_flutter.dart'; +import 'package:provider/provider.dart'; import 'package:test_sa/controllers/http_status_manger/http_status_manger.dart'; import 'package:test_sa/controllers/localization/localization.dart'; import 'package:test_sa/controllers/providers/api/user_provider.dart'; @@ -13,9 +16,6 @@ import 'package:test_sa/views/widgets/buttons/app_button.dart'; import 'package:test_sa/views/widgets/departments/department_button.dart'; import 'package:test_sa/views/widgets/hospitals/hospital_button.dart'; import 'package:test_sa/views/widgets/loaders/loading_manager.dart'; -import 'package:flutter/material.dart'; -import 'package:font_awesome_flutter/font_awesome_flutter.dart'; -import 'package:provider/provider.dart'; class ProfilePage extends StatefulWidget { static final String id = "/user/profile"; @override diff --git a/lib/views/pages/user/report_issues_page.dart b/lib/views/pages/user/report_issues_page.dart index d9a91be3..a1641b24 100644 --- a/lib/views/pages/user/report_issues_page.dart +++ b/lib/views/pages/user/report_issues_page.dart @@ -1,3 +1,6 @@ +import 'package:flutter/material.dart'; +import 'package:fluttertoast/fluttertoast.dart'; +import 'package:provider/provider.dart'; import 'package:test_sa/controllers/localization/localization.dart'; import 'package:test_sa/controllers/providers/api/service_requests_provider.dart'; import 'package:test_sa/controllers/providers/api/user_provider.dart'; @@ -8,15 +11,11 @@ import 'package:test_sa/models/service_request/service_request.dart'; import 'package:test_sa/models/subtitle.dart'; import 'package:test_sa/views/app_style/colors.dart'; import 'package:test_sa/views/app_style/sizing.dart'; - import 'package:test_sa/views/widgets/app_text_form_field.dart'; import 'package:test_sa/views/widgets/buttons/app_back_button.dart'; import 'package:test_sa/views/widgets/buttons/app_button.dart'; import 'package:test_sa/views/widgets/issues/report_issue_item.dart'; import 'package:test_sa/views/widgets/loaders/loading_manager.dart'; -import 'package:flutter/material.dart'; -import 'package:fluttertoast/fluttertoast.dart'; -import 'package:provider/provider.dart'; class ReportIssuesPage extends StatefulWidget { static final String id = "/report-issue"; final ServiceRequest serviceRequest; diff --git a/lib/views/pages/user/requests/create_request.dart b/lib/views/pages/user/requests/create_request.dart index 705bb177..8e0a5b78 100644 --- a/lib/views/pages/user/requests/create_request.dart +++ b/lib/views/pages/user/requests/create_request.dart @@ -213,7 +213,6 @@ class _CreateRequestPageState extends State { final file = File(_serviceRequest.audio); _serviceRequest.audio = base64Encode(file.readAsBytesSync()); } - print("pass data"); int status = await _serviceRequestsProvider.createRequest( user: _userProvider.user, host: _settingProvider.host, diff --git a/lib/views/pages/user/requests/future_request_service_details.dart b/lib/views/pages/user/requests/future_request_service_details.dart index 7f56dd5f..1c2dbe38 100644 --- a/lib/views/pages/user/requests/future_request_service_details.dart +++ b/lib/views/pages/user/requests/future_request_service_details.dart @@ -1,3 +1,5 @@ +import 'package:flutter/material.dart'; +import 'package:provider/provider.dart'; import 'package:test_sa/controllers/localization/localization.dart'; import 'package:test_sa/controllers/providers/api/service_requests_provider.dart'; import 'package:test_sa/controllers/providers/api/user_provider.dart'; @@ -7,8 +9,6 @@ import 'package:test_sa/models/subtitle.dart'; import 'package:test_sa/views/pages/user/requests/request_details.dart'; import 'package:test_sa/views/widgets/loaders/app_loading.dart'; import 'package:test_sa/views/widgets/loaders/failed_loading.dart'; -import 'package:flutter/material.dart'; -import 'package:provider/provider.dart'; class FutureRequestServiceDetails extends StatefulWidget { static final String id = "/service-request-details"; diff --git a/lib/views/pages/user/requests/report/create_service_report.dart b/lib/views/pages/user/requests/report/create_service_report.dart index b9f353be..33638f92 100644 --- a/lib/views/pages/user/requests/report/create_service_report.dart +++ b/lib/views/pages/user/requests/report/create_service_report.dart @@ -1,18 +1,22 @@ import 'dart:convert'; import 'dart:io'; +import 'package:flutter/material.dart'; +import 'package:flutter/rendering.dart'; +import 'package:fluttertoast/fluttertoast.dart'; +import 'package:provider/provider.dart'; import 'package:test_sa/controllers/http_status_manger/http_status_manger.dart'; import 'package:test_sa/controllers/localization/localization.dart'; -import 'package:test_sa/controllers/providers/api/status_drop_down/report/service_report_last_calls_provider.dart'; import 'package:test_sa/controllers/providers/api/service_requests_provider.dart'; +import 'package:test_sa/controllers/providers/api/status_drop_down/report/service_report_last_calls_provider.dart'; import 'package:test_sa/controllers/providers/api/user_provider.dart'; import 'package:test_sa/controllers/providers/settings/setting_provider.dart'; import 'package:test_sa/controllers/validator/validator.dart'; import 'package:test_sa/models/device/device.dart'; +import 'package:test_sa/models/lookup.dart'; import 'package:test_sa/models/part.dart'; import 'package:test_sa/models/service_report.dart'; import 'package:test_sa/models/service_request/service_request.dart'; -import 'package:test_sa/models/lookup.dart'; import 'package:test_sa/models/subtitle.dart'; import 'package:test_sa/views/app_style/colors.dart'; import 'package:test_sa/views/app_style/sizing.dart'; @@ -29,14 +33,9 @@ import 'package:test_sa/views/widgets/speech_to_text/speech_to_text.dart'; import 'package:test_sa/views/widgets/status/report/service_report_last_call.dart'; import 'package:test_sa/views/widgets/status/report/service_report_reasons.dart'; import 'package:test_sa/views/widgets/status/report/service_report_status.dart'; -import 'package:test_sa/views/widgets/status/report/service_report_type.dart'; import 'package:test_sa/views/widgets/status/report/service_status.dart'; import 'package:test_sa/views/widgets/timer/app_timer.dart'; import 'package:test_sa/views/widgets/titles/app_sub_title.dart'; -import 'package:flutter/material.dart'; -import 'package:flutter/rendering.dart'; -import 'package:fluttertoast/fluttertoast.dart'; -import 'package:provider/provider.dart'; class CreateServiceReport extends StatefulWidget { static final String id = "/create-service-report"; final ServiceRequest request ; diff --git a/lib/views/pages/user/requests/report/edit_service_report.dart b/lib/views/pages/user/requests/report/edit_service_report.dart index 1ca58282..0b268fc7 100644 --- a/lib/views/pages/user/requests/report/edit_service_report.dart +++ b/lib/views/pages/user/requests/report/edit_service_report.dart @@ -1,18 +1,20 @@ import 'dart:convert'; import 'dart:io'; +import 'package:flutter/material.dart'; +import 'package:flutter/rendering.dart'; +import 'package:fluttertoast/fluttertoast.dart'; +import 'package:provider/provider.dart'; import 'package:test_sa/controllers/http_status_manger/http_status_manger.dart'; import 'package:test_sa/controllers/localization/localization.dart'; -import 'package:test_sa/controllers/providers/api/status_drop_down/report/service_report_last_calls_provider.dart'; import 'package:test_sa/controllers/providers/api/service_requests_provider.dart'; +import 'package:test_sa/controllers/providers/api/status_drop_down/report/service_report_last_calls_provider.dart'; import 'package:test_sa/controllers/providers/api/user_provider.dart'; import 'package:test_sa/controllers/providers/settings/setting_provider.dart'; import 'package:test_sa/controllers/validator/validator.dart'; -import 'package:test_sa/models/device/device.dart'; import 'package:test_sa/models/part.dart'; import 'package:test_sa/models/service_report.dart'; import 'package:test_sa/models/service_request/service_request.dart'; -import 'package:test_sa/models/lookup.dart'; import 'package:test_sa/models/subtitle.dart'; import 'package:test_sa/views/app_style/colors.dart'; import 'package:test_sa/views/app_style/sizing.dart'; @@ -33,10 +35,6 @@ import 'package:test_sa/views/widgets/status/report/service_report_type.dart'; import 'package:test_sa/views/widgets/status/report/service_status.dart'; import 'package:test_sa/views/widgets/timer/app_timer.dart'; import 'package:test_sa/views/widgets/titles/app_sub_title.dart'; -import 'package:flutter/material.dart'; -import 'package:flutter/rendering.dart'; -import 'package:fluttertoast/fluttertoast.dart'; -import 'package:provider/provider.dart'; class EditServiceReport extends StatefulWidget { static final String id = "/edit-service-report"; final ServiceRequest request ; diff --git a/lib/views/pages/user/requests/report/future_service_report.dart b/lib/views/pages/user/requests/report/future_service_report.dart index a2e1897d..5ee16ea2 100644 --- a/lib/views/pages/user/requests/report/future_service_report.dart +++ b/lib/views/pages/user/requests/report/future_service_report.dart @@ -1,3 +1,5 @@ +import 'package:flutter/material.dart'; +import 'package:provider/provider.dart'; import 'package:test_sa/controllers/localization/localization.dart'; import 'package:test_sa/controllers/providers/api/service_requests_provider.dart'; import 'package:test_sa/controllers/providers/api/user_provider.dart'; @@ -5,11 +7,8 @@ import 'package:test_sa/controllers/providers/settings/setting_provider.dart'; import 'package:test_sa/models/service_report.dart'; import 'package:test_sa/models/service_request/service_request.dart'; import 'package:test_sa/models/subtitle.dart'; -import 'package:test_sa/views/pages/user/requests/request_details.dart'; import 'package:test_sa/views/widgets/loaders/app_loading.dart'; import 'package:test_sa/views/widgets/loaders/failed_loading.dart'; -import 'package:flutter/material.dart'; -import 'package:provider/provider.dart'; import 'edit_service_report.dart'; class FutureServiceReport extends StatefulWidget { diff --git a/lib/views/pages/user/requests/request_details.dart b/lib/views/pages/user/requests/request_details.dart index 5e2d80f9..2ada571e 100644 --- a/lib/views/pages/user/requests/request_details.dart +++ b/lib/views/pages/user/requests/request_details.dart @@ -1,3 +1,7 @@ +import 'package:flutter/cupertino.dart'; +import 'package:flutter/material.dart'; +import 'package:intl/intl.dart'; +import 'package:provider/provider.dart'; import 'package:test_sa/controllers/http_status_manger/http_status_manger.dart'; import 'package:test_sa/controllers/localization/localization.dart'; import 'package:test_sa/controllers/providers/api/service_requests_provider.dart'; @@ -20,11 +24,6 @@ import 'package:test_sa/views/widgets/requests/request_status.dart'; import 'package:test_sa/views/widgets/requests/service_request_update_dialog.dart'; import 'package:test_sa/views/widgets/sound/sound_player.dart'; import 'package:test_sa/views/widgets/titles/app_sub_title.dart'; -import 'package:flutter/cupertino.dart'; -import 'package:flutter/material.dart'; -import 'package:fluttertoast/fluttertoast.dart'; -import 'package:intl/intl.dart'; -import 'package:provider/provider.dart'; import '../report_issues_page.dart'; import 'report/future_service_report.dart'; diff --git a/lib/views/pages/user/requests/requests_page.dart b/lib/views/pages/user/requests/requests_page.dart index af926f28..e535d03b 100644 --- a/lib/views/pages/user/requests/requests_page.dart +++ b/lib/views/pages/user/requests/requests_page.dart @@ -1,3 +1,5 @@ +import 'package:flutter/material.dart'; +import 'package:provider/provider.dart'; import 'package:test_sa/controllers/localization/localization.dart'; import 'package:test_sa/controllers/providers/api/service_requests_provider.dart'; import 'package:test_sa/controllers/providers/api/user_provider.dart'; @@ -5,13 +7,11 @@ import 'package:test_sa/controllers/providers/settings/setting_provider.dart'; import 'package:test_sa/models/service_request/service_request_search.dart'; import 'package:test_sa/models/subtitle.dart'; import 'package:test_sa/views/app_style/colors.dart'; -import 'package:test_sa/views/widgets/requests/service_request_list.dart'; import 'package:test_sa/views/widgets/buttons/app_back_button.dart'; import 'package:test_sa/views/widgets/buttons/app_icon_button.dart'; import 'package:test_sa/views/widgets/loaders/loading_manager.dart'; +import 'package:test_sa/views/widgets/requests/service_request_list.dart'; import 'package:test_sa/views/widgets/search/service_request_search_bar.dart'; -import 'package:flutter/material.dart'; -import 'package:provider/provider.dart'; class ServiceRequestsPage extends StatefulWidget { static final String id = "/service-requests"; @override diff --git a/lib/views/pages/user/visits/pantry/edit_pentry.dart b/lib/views/pages/user/visits/pantry/edit_pentry.dart index be244603..7c9201b1 100644 --- a/lib/views/pages/user/visits/pantry/edit_pentry.dart +++ b/lib/views/pages/user/visits/pantry/edit_pentry.dart @@ -3,16 +3,12 @@ import 'package:fluttertoast/fluttertoast.dart'; import 'package:provider/provider.dart'; import 'package:test_sa/controllers/http_status_manger/http_status_manger.dart'; import 'package:test_sa/controllers/localization/localization.dart'; -import 'package:test_sa/controllers/providers/api/device_transfer_provider.dart'; import 'package:test_sa/controllers/providers/api/regular_visits_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/models/device/device_transfer.dart'; -import 'package:test_sa/models/device/device_transfer_info.dart'; import 'package:test_sa/models/pantry/pentry.dart'; import 'package:test_sa/models/subtitle.dart'; import 'package:test_sa/models/visits/visit.dart'; -import 'package:test_sa/views/widgets/buttons/app_button.dart'; import 'package:test_sa/views/widgets/buttons/app_small_button.dart'; import 'package:test_sa/views/widgets/loaders/loading_manager.dart'; import 'package:test_sa/views/widgets/pentry/pentry_calibration_tool_form.dart'; diff --git a/lib/views/pages/user/visits/pantry/future_edit_pently.dart b/lib/views/pages/user/visits/pantry/future_edit_pently.dart index a4077a44..161df3ce 100644 --- a/lib/views/pages/user/visits/pantry/future_edit_pently.dart +++ b/lib/views/pages/user/visits/pantry/future_edit_pently.dart @@ -39,7 +39,7 @@ class _FutureEditPentryState extends State { ), builder: (BuildContext context, AsyncSnapshot snapshot){ if(snapshot.hasError) { - print(snapshot.error); + return FailedLoading( message: subtitle.failedToCompleteRequest, onReload: (){setState(() {});}, diff --git a/lib/views/pages/user/visits/preventive_maintenance_visits_page.dart b/lib/views/pages/user/visits/preventive_maintenance_visits_page.dart index b4eec47f..7c1c57c2 100644 --- a/lib/views/pages/user/visits/preventive_maintenance_visits_page.dart +++ b/lib/views/pages/user/visits/preventive_maintenance_visits_page.dart @@ -1,3 +1,7 @@ +import 'package:flutter/cupertino.dart'; +import 'package:flutter/material.dart'; +import 'package:fluttertoast/fluttertoast.dart'; +import 'package:provider/provider.dart'; import 'package:test_sa/controllers/http_status_manger/http_status_manger.dart'; import 'package:test_sa/controllers/localization/localization.dart'; import 'package:test_sa/controllers/providers/api/preventive_maintenance_visits_provider.dart'; @@ -8,16 +12,12 @@ import 'package:test_sa/models/visits/visits_group.dart'; import 'package:test_sa/models/visits/visits_search.dart'; import 'package:test_sa/views/app_style/colors.dart'; import 'package:test_sa/views/pages/user/visits/update_visits_group_sheet.dart'; -import 'package:test_sa/views/widgets/visits/visits_list.dart'; import 'package:test_sa/views/widgets/buttons/app_back_button.dart'; import 'package:test_sa/views/widgets/buttons/app_button.dart'; import 'package:test_sa/views/widgets/buttons/app_icon_button.dart'; import 'package:test_sa/views/widgets/loaders/loading_manager.dart'; import 'package:test_sa/views/widgets/search/visits_search_bar.dart'; -import 'package:flutter/cupertino.dart'; -import 'package:flutter/material.dart'; -import 'package:fluttertoast/fluttertoast.dart'; -import 'package:provider/provider.dart'; +import 'package:test_sa/views/widgets/visits/visits_list.dart'; class PreventiveMaintenanceVisitsPage extends StatefulWidget { static final String id = "/preventive-maintenance-visits"; @override diff --git a/lib/views/pages/user/visits/regular_visits_page.dart b/lib/views/pages/user/visits/regular_visits_page.dart index d1bd69bd..37e34fed 100644 --- a/lib/views/pages/user/visits/regular_visits_page.dart +++ b/lib/views/pages/user/visits/regular_visits_page.dart @@ -1,3 +1,7 @@ +import 'package:flutter/cupertino.dart'; +import 'package:flutter/material.dart'; +import 'package:fluttertoast/fluttertoast.dart'; +import 'package:provider/provider.dart'; import 'package:test_sa/controllers/http_status_manger/http_status_manger.dart'; import 'package:test_sa/controllers/localization/localization.dart'; import 'package:test_sa/controllers/providers/api/regular_visits_provider.dart'; @@ -8,16 +12,12 @@ import 'package:test_sa/models/visits/visits_group.dart'; import 'package:test_sa/models/visits/visits_search.dart'; import 'package:test_sa/views/app_style/colors.dart'; import 'package:test_sa/views/pages/user/visits/update_visits_group_sheet.dart'; -import 'package:test_sa/views/widgets/visits/visits_list.dart'; import 'package:test_sa/views/widgets/buttons/app_back_button.dart'; import 'package:test_sa/views/widgets/buttons/app_button.dart'; import 'package:test_sa/views/widgets/buttons/app_icon_button.dart'; import 'package:test_sa/views/widgets/loaders/loading_manager.dart'; import 'package:test_sa/views/widgets/search/visits_search_bar.dart'; -import 'package:flutter/cupertino.dart'; -import 'package:flutter/material.dart'; -import 'package:fluttertoast/fluttertoast.dart'; -import 'package:provider/provider.dart'; +import 'package:test_sa/views/widgets/visits/visits_list.dart'; class RegularVisitsPage extends StatefulWidget { static final String id = "/Regular-visits"; @override diff --git a/lib/views/pages/user/visits/update_visits_group_sheet.dart b/lib/views/pages/user/visits/update_visits_group_sheet.dart index 8be79f27..724f4657 100644 --- a/lib/views/pages/user/visits/update_visits_group_sheet.dart +++ b/lib/views/pages/user/visits/update_visits_group_sheet.dart @@ -1,6 +1,7 @@ import 'dart:convert'; import 'dart:io'; +import 'package:flutter/material.dart'; import 'package:test_sa/controllers/localization/localization.dart'; import 'package:test_sa/models/lookup.dart'; import 'package:test_sa/models/subtitle.dart'; @@ -15,7 +16,6 @@ import 'package:test_sa/views/widgets/date_and_time/date_picker.dart'; import 'package:test_sa/views/widgets/images/one_image_picker.dart'; import 'package:test_sa/views/widgets/search/filter_item.dart'; import 'package:test_sa/views/widgets/visits/visit_status.dart'; -import 'package:flutter/material.dart'; class UpdateVisitsGroupSheet extends StatefulWidget { final List visits; final String title; diff --git a/lib/views/pages/user/visits/visit_details.dart b/lib/views/pages/user/visits/visit_details.dart index f5929ded..f2b06be0 100644 --- a/lib/views/pages/user/visits/visit_details.dart +++ b/lib/views/pages/user/visits/visit_details.dart @@ -1,3 +1,4 @@ +import 'package:flutter/material.dart'; import 'package:provider/provider.dart'; import 'package:test_sa/controllers/localization/localization.dart'; import 'package:test_sa/models/subtitle.dart'; @@ -11,7 +12,6 @@ import 'package:test_sa/views/widgets/images/images_list.dart'; import 'package:test_sa/views/widgets/loaders/image_loader.dart'; import 'package:test_sa/views/widgets/requests/info_row.dart'; import 'package:test_sa/views/widgets/visits/visit_status.dart'; -import 'package:flutter/material.dart'; import '../../../../controllers/providers/api/regular_visits_provider.dart'; diff --git a/lib/views/widgets/buttons/app_back_button.dart b/lib/views/widgets/buttons/app_back_button.dart index c7c72ce4..fbb080bb 100644 --- a/lib/views/widgets/buttons/app_back_button.dart +++ b/lib/views/widgets/buttons/app_back_button.dart @@ -1,7 +1,7 @@ -import 'package:test_sa/views/app_style/colors.dart'; import 'package:flutter/material.dart'; import 'package:font_awesome_flutter/font_awesome_flutter.dart'; +import 'package:test_sa/views/app_style/colors.dart'; import 'app_icon_button.dart'; class ABackButton extends StatelessWidget { diff --git a/lib/views/widgets/buttons/app_button.dart b/lib/views/widgets/buttons/app_button.dart index 231e1d80..7d96c68e 100644 --- a/lib/views/widgets/buttons/app_button.dart +++ b/lib/views/widgets/buttons/app_button.dart @@ -1,6 +1,6 @@ +import 'package:flutter/material.dart'; import 'package:test_sa/views/app_style/colors.dart'; import 'package:test_sa/views/app_style/sizing.dart'; -import 'package:flutter/material.dart'; class AButton extends StatelessWidget { final String text; diff --git a/lib/views/widgets/buttons/app_flat_button.dart b/lib/views/widgets/buttons/app_flat_button.dart index 903b05e2..f8df57b6 100644 --- a/lib/views/widgets/buttons/app_flat_button.dart +++ b/lib/views/widgets/buttons/app_flat_button.dart @@ -1,5 +1,5 @@ -import 'package:test_sa/views/app_style/sizing.dart'; import 'package:flutter/material.dart'; +import 'package:test_sa/views/app_style/sizing.dart'; class AFlatButton extends StatelessWidget { final String text; diff --git a/lib/views/widgets/buttons/app_icon_button.dart b/lib/views/widgets/buttons/app_icon_button.dart index 8c1da58e..07e9c9a3 100644 --- a/lib/views/widgets/buttons/app_icon_button.dart +++ b/lib/views/widgets/buttons/app_icon_button.dart @@ -1,7 +1,7 @@ -import 'package:test_sa/views/app_style/colors.dart'; -import 'package:test_sa/views/app_style/sizing.dart'; import 'package:flutter/material.dart'; import 'package:font_awesome_flutter/font_awesome_flutter.dart'; +import 'package:test_sa/views/app_style/colors.dart'; +import 'package:test_sa/views/app_style/sizing.dart'; class AIconButton extends StatelessWidget { final IconData iconData; diff --git a/lib/views/widgets/buttons/app_icon_button2.dart b/lib/views/widgets/buttons/app_icon_button2.dart index 1a9bc78e..bce63196 100644 --- a/lib/views/widgets/buttons/app_icon_button2.dart +++ b/lib/views/widgets/buttons/app_icon_button2.dart @@ -1,6 +1,6 @@ -import 'package:test_sa/views/app_style/sizing.dart'; import 'package:flutter/material.dart'; import 'package:font_awesome_flutter/font_awesome_flutter.dart'; +import 'package:test_sa/views/app_style/sizing.dart'; class AIconButton2 extends StatelessWidget { final IconData iconData; diff --git a/lib/views/widgets/buttons/app_outlined_button.dart b/lib/views/widgets/buttons/app_outlined_button.dart index 7497d395..1b8c47f0 100644 --- a/lib/views/widgets/buttons/app_outlined_button.dart +++ b/lib/views/widgets/buttons/app_outlined_button.dart @@ -1,6 +1,6 @@ +import 'package:flutter/material.dart'; import 'package:test_sa/views/app_style/colors.dart'; import 'package:test_sa/views/app_style/sizing.dart'; -import 'package:flutter/material.dart'; class AOutLinedButton extends StatelessWidget { final String text; diff --git a/lib/views/widgets/buttons/app_small_button.dart b/lib/views/widgets/buttons/app_small_button.dart index b2f71626..10c103f6 100644 --- a/lib/views/widgets/buttons/app_small_button.dart +++ b/lib/views/widgets/buttons/app_small_button.dart @@ -1,5 +1,5 @@ -import 'package:test_sa/views/app_style/sizing.dart'; import 'package:flutter/material.dart'; +import 'package:test_sa/views/app_style/sizing.dart'; class ASmallButton extends StatelessWidget { final String text; diff --git a/lib/views/widgets/dialogs/dialog.dart b/lib/views/widgets/dialogs/dialog.dart index fa20a8f3..7bb08f20 100644 --- a/lib/views/widgets/dialogs/dialog.dart +++ b/lib/views/widgets/dialogs/dialog.dart @@ -1,7 +1,7 @@ -import 'package:test_sa/controllers/localization/localization.dart'; -import 'package:test_sa/models/subtitle.dart'; import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; +import 'package:test_sa/controllers/localization/localization.dart'; +import 'package:test_sa/models/subtitle.dart'; class AAlertDialog extends StatelessWidget { final String title; final String content; diff --git a/lib/views/widgets/drawer/drawer_item.dart b/lib/views/widgets/drawer/drawer_item.dart index 88f027dd..8323141f 100644 --- a/lib/views/widgets/drawer/drawer_item.dart +++ b/lib/views/widgets/drawer/drawer_item.dart @@ -1,5 +1,5 @@ -import 'package:test_sa/views/app_style/sizing.dart'; import 'package:flutter/material.dart'; +import 'package:test_sa/views/app_style/sizing.dart'; class DrawerItem extends StatelessWidget { final String title; final IconData icon; diff --git a/lib/views/widgets/images/image_item.dart b/lib/views/widgets/images/image_item.dart index 8478ae97..5e2412a0 100644 --- a/lib/views/widgets/images/image_item.dart +++ b/lib/views/widgets/images/image_item.dart @@ -1,8 +1,8 @@ +import 'package:flutter/material.dart'; +import 'package:font_awesome_flutter/font_awesome_flutter.dart'; import 'package:test_sa/views/app_style/colors.dart'; import 'package:test_sa/views/app_style/sizing.dart'; import 'package:test_sa/views/widgets/loaders/image_loader.dart'; -import 'package:flutter/material.dart'; -import 'package:font_awesome_flutter/font_awesome_flutter.dart'; class ImageItem extends StatelessWidget { final String url; final bool isVideo; diff --git a/lib/views/widgets/images/images_list.dart b/lib/views/widgets/images/images_list.dart index 01868340..df2bdb0d 100644 --- a/lib/views/widgets/images/images_list.dart +++ b/lib/views/widgets/images/images_list.dart @@ -1,5 +1,5 @@ -import 'package:test_sa/views/app_style/sizing.dart'; import 'package:flutter/material.dart'; +import 'package:test_sa/views/app_style/sizing.dart'; import 'image_item.dart'; import 'images_viewer.dart'; diff --git a/lib/views/widgets/images/images_viewer.dart b/lib/views/widgets/images/images_viewer.dart index 76c79814..865f0306 100644 --- a/lib/views/widgets/images/images_viewer.dart +++ b/lib/views/widgets/images/images_viewer.dart @@ -1,6 +1,6 @@ +import 'package:flutter/material.dart'; import 'package:test_sa/views/app_style/sizing.dart'; import 'package:test_sa/views/widgets/loaders/image_loader.dart'; -import 'package:flutter/material.dart'; class ImagesViewer extends StatelessWidget { final List images; diff --git a/lib/views/widgets/images/mini_one_image_picker.dart b/lib/views/widgets/images/mini_one_image_picker.dart index b26e9f49..710e960d 100644 --- a/lib/views/widgets/images/mini_one_image_picker.dart +++ b/lib/views/widgets/images/mini_one_image_picker.dart @@ -1,11 +1,11 @@ import 'dart:io'; -import 'package:test_sa/controllers/localization/localization.dart'; -import 'package:test_sa/models/subtitle.dart'; -import 'package:test_sa/views/app_style/sizing.dart'; import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; import 'package:image_picker/image_picker.dart'; +import 'package:test_sa/controllers/localization/localization.dart'; +import 'package:test_sa/models/subtitle.dart'; +import 'package:test_sa/views/app_style/sizing.dart'; class AMiniOneImagePicker extends StatefulWidget { final Function(File) onPick; diff --git a/lib/views/widgets/images/multi_image_picker.dart b/lib/views/widgets/images/multi_image_picker.dart index 08f16926..e9c794fe 100644 --- a/lib/views/widgets/images/multi_image_picker.dart +++ b/lib/views/widgets/images/multi_image_picker.dart @@ -1,14 +1,14 @@ import 'dart:io'; +import 'package:flutter/cupertino.dart'; +import 'package:flutter/material.dart'; +import 'package:fluttertoast/fluttertoast.dart'; +import 'package:image_picker/image_picker.dart'; import 'package:test_sa/controllers/localization/localization.dart'; import 'package:test_sa/models/subtitle.dart'; import 'package:test_sa/views/app_style/colors.dart'; import 'package:test_sa/views/app_style/sizing.dart'; import 'package:test_sa/views/widgets/buttons/app_flat_button.dart'; -import 'package:flutter/cupertino.dart'; -import 'package:flutter/material.dart'; -import 'package:fluttertoast/fluttertoast.dart'; -import 'package:image_picker/image_picker.dart'; import 'multi_image_picker_item.dart'; class MultiImagesPicker extends StatefulWidget { diff --git a/lib/views/widgets/images/multi_image_picker_item.dart b/lib/views/widgets/images/multi_image_picker_item.dart index 92943032..be1d1b15 100644 --- a/lib/views/widgets/images/multi_image_picker_item.dart +++ b/lib/views/widgets/images/multi_image_picker_item.dart @@ -1,9 +1,9 @@ import 'dart:io'; +import 'package:flutter/material.dart'; import 'package:test_sa/views/app_style/colors.dart'; import 'package:test_sa/views/app_style/sizing.dart'; import 'package:test_sa/views/widgets/buttons/app_back_button.dart'; -import 'package:flutter/material.dart'; class MultiImagesPickerItem extends StatelessWidget { diff --git a/lib/views/widgets/images/one_image_picker.dart b/lib/views/widgets/images/one_image_picker.dart index 4220f330..3ff3ebbf 100644 --- a/lib/views/widgets/images/one_image_picker.dart +++ b/lib/views/widgets/images/one_image_picker.dart @@ -1,11 +1,11 @@ import 'dart:io'; -import 'package:test_sa/controllers/localization/localization.dart'; -import 'package:test_sa/models/subtitle.dart'; -import 'package:test_sa/views/app_style/sizing.dart'; import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; import 'package:image_picker/image_picker.dart'; +import 'package:test_sa/controllers/localization/localization.dart'; +import 'package:test_sa/models/subtitle.dart'; +import 'package:test_sa/views/app_style/sizing.dart'; class AOneImagePicker extends StatefulWidget { final Function(File) onPick; diff --git a/lib/views/widgets/issues/report_issue_item.dart b/lib/views/widgets/issues/report_issue_item.dart index 0d04910d..8a952be7 100644 --- a/lib/views/widgets/issues/report_issue_item.dart +++ b/lib/views/widgets/issues/report_issue_item.dart @@ -1,6 +1,6 @@ +import 'package:flutter/material.dart'; import 'package:test_sa/views/app_style/colors.dart'; import 'package:test_sa/views/app_style/sizing.dart'; -import 'package:flutter/material.dart'; class ReportIssueItem extends StatelessWidget { final bool isSelected; final String issueInfo; diff --git a/lib/views/widgets/loaders/app_lazy_loading.dart b/lib/views/widgets/loaders/app_lazy_loading.dart index 7f2676c1..e3378c98 100644 --- a/lib/views/widgets/loaders/app_lazy_loading.dart +++ b/lib/views/widgets/loaders/app_lazy_loading.dart @@ -1,5 +1,5 @@ -import 'package:test_sa/views/app_style/sizing.dart'; import 'package:flutter/material.dart'; +import 'package:test_sa/views/app_style/sizing.dart'; import 'app_loading.dart'; class ALazyLoading extends StatelessWidget { diff --git a/lib/views/widgets/loaders/failed_loading.dart b/lib/views/widgets/loaders/failed_loading.dart index 42e047ef..5039628b 100644 --- a/lib/views/widgets/loaders/failed_loading.dart +++ b/lib/views/widgets/loaders/failed_loading.dart @@ -1,6 +1,6 @@ -import 'package:test_sa/views/app_style/sizing.dart'; import 'package:flutter/material.dart'; +import 'package:test_sa/views/app_style/sizing.dart'; class FailedLoading extends StatelessWidget { final String message; final VoidCallback onReload; diff --git a/lib/views/widgets/loaders/lazy_loading.dart b/lib/views/widgets/loaders/lazy_loading.dart index d5649c30..d5e5f2ed 100644 --- a/lib/views/widgets/loaders/lazy_loading.dart +++ b/lib/views/widgets/loaders/lazy_loading.dart @@ -1,5 +1,5 @@ -import 'package:test_sa/views/app_style/sizing.dart'; import 'package:flutter/material.dart'; +import 'package:test_sa/views/app_style/sizing.dart'; import 'app_loading.dart'; class LazyLoading extends StatefulWidget { diff --git a/lib/views/widgets/loaders/loading_manager.dart b/lib/views/widgets/loaders/loading_manager.dart index 2a0c9bd9..8ed322e0 100644 --- a/lib/views/widgets/loaders/loading_manager.dart +++ b/lib/views/widgets/loaders/loading_manager.dart @@ -1,7 +1,7 @@ +import 'package:flutter/material.dart'; import 'package:test_sa/controllers/http_status_manger/http_status_manger.dart'; import 'package:test_sa/controllers/localization/localization.dart'; import 'package:test_sa/models/subtitle.dart'; -import 'package:flutter/material.dart'; import 'app_loading.dart'; import 'failed_loading.dart'; diff --git a/lib/views/widgets/loaders/no_item_found.dart b/lib/views/widgets/loaders/no_item_found.dart index ca71c28e..5ed637e7 100644 --- a/lib/views/widgets/loaders/no_item_found.dart +++ b/lib/views/widgets/loaders/no_item_found.dart @@ -1,5 +1,5 @@ -import 'package:test_sa/views/app_style/sizing.dart'; import 'package:flutter/material.dart'; +import 'package:test_sa/views/app_style/sizing.dart'; class NoItemFound extends StatelessWidget { final String message; diff --git a/lib/views/widgets/parts/auto_complete_parts_field.dart b/lib/views/widgets/parts/auto_complete_parts_field.dart index 0ce14380..9481e9cd 100644 --- a/lib/views/widgets/parts/auto_complete_parts_field.dart +++ b/lib/views/widgets/parts/auto_complete_parts_field.dart @@ -1,13 +1,12 @@ +import 'package:flutter/material.dart'; +import 'package:flutter_typeahead/flutter_typeahead.dart'; +import 'package:provider/provider.dart'; import 'package:test_sa/controllers/providers/api/parts_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/models/part.dart'; import 'package:test_sa/views/app_style/colors.dart'; import 'package:test_sa/views/app_style/sizing.dart'; -import 'package:test_sa/views/widgets/loaders/loading_manager.dart'; -import 'package:flutter/material.dart'; -import 'package:flutter_typeahead/flutter_typeahead.dart'; -import 'package:provider/provider.dart'; class AutoCompletePartsField extends StatefulWidget { final String initialValue; final bool clearAfterPick; diff --git a/lib/views/widgets/parts/part_item.dart b/lib/views/widgets/parts/part_item.dart index 354e4302..a82809bc 100644 --- a/lib/views/widgets/parts/part_item.dart +++ b/lib/views/widgets/parts/part_item.dart @@ -1,7 +1,7 @@ +import 'package:flutter/material.dart'; import 'package:test_sa/models/part.dart'; import 'package:test_sa/views/app_style/sizing.dart'; import 'package:test_sa/views/widgets/buttons/app_icon_button2.dart'; -import 'package:flutter/material.dart'; class PartItem extends StatefulWidget { final Part part; diff --git a/lib/views/widgets/pentry/auto_complete_fields/auto_complete_devices_field.dart b/lib/views/widgets/pentry/auto_complete_fields/auto_complete_devices_field.dart index e21c9ba0..ea2228cd 100644 --- a/lib/views/widgets/pentry/auto_complete_fields/auto_complete_devices_field.dart +++ b/lib/views/widgets/pentry/auto_complete_fields/auto_complete_devices_field.dart @@ -1,3 +1,6 @@ +import 'package:flutter/material.dart'; +import 'package:flutter_typeahead/flutter_typeahead.dart'; +import 'package:provider/provider.dart'; import 'package:test_sa/controllers/providers/api/devices_provider.dart'; import 'package:test_sa/controllers/providers/api/user_provider.dart'; import 'package:test_sa/controllers/providers/settings/setting_provider.dart'; @@ -5,10 +8,6 @@ import 'package:test_sa/models/device/device.dart'; import 'package:test_sa/models/lookup.dart'; import 'package:test_sa/views/app_style/colors.dart'; import 'package:test_sa/views/app_style/sizing.dart'; -import 'package:test_sa/views/widgets/loaders/loading_manager.dart'; -import 'package:flutter/material.dart'; -import 'package:flutter_typeahead/flutter_typeahead.dart'; -import 'package:provider/provider.dart'; class AutoCompleteDeviceNumberField extends StatefulWidget { final Lookup initialValue; final String hospitalId; diff --git a/lib/views/widgets/pentry/pentry_calibration_tool_form.dart b/lib/views/widgets/pentry/pentry_calibration_tool_form.dart index a8d51b15..70528bb3 100644 --- a/lib/views/widgets/pentry/pentry_calibration_tool_form.dart +++ b/lib/views/widgets/pentry/pentry_calibration_tool_form.dart @@ -3,16 +3,11 @@ import 'package:provider/provider.dart'; import 'package:test_sa/controllers/localization/localization.dart'; import 'package:test_sa/controllers/providers/api/user_provider.dart'; import 'package:test_sa/models/pantry/calibration_tools.dart'; -import 'package:test_sa/models/pantry/contact.dart'; -import 'package:test_sa/models/pantry/ppm_check_list.dart'; -import 'package:test_sa/views/app_style/colors.dart'; import 'package:test_sa/views/app_style/sizing.dart'; -import 'package:test_sa/views/widgets/app_text_form_field.dart'; import 'package:test_sa/views/widgets/buttons/app_button.dart'; import 'package:test_sa/views/widgets/buttons/app_small_button.dart'; import 'package:test_sa/views/widgets/date_and_time/date_picker.dart'; import 'package:test_sa/views/widgets/pentry/auto_complete_fields/auto_complete_devices_field.dart'; -import 'package:test_sa/views/widgets/status/pentry/pentry_task_status_mune.dart'; import 'package:test_sa/views/widgets/titles/app_sub_title.dart'; class PentryCalibrationToolForm extends StatefulWidget { final List models; diff --git a/lib/views/widgets/pentry/pentry_info_form.dart b/lib/views/widgets/pentry/pentry_info_form.dart index 94813b50..1fadc1c9 100644 --- a/lib/views/widgets/pentry/pentry_info_form.dart +++ b/lib/views/widgets/pentry/pentry_info_form.dart @@ -1,22 +1,13 @@ import 'package:flutter/material.dart'; -import 'package:intl/intl.dart'; import 'package:provider/provider.dart'; import 'package:test_sa/controllers/localization/localization.dart'; import 'package:test_sa/controllers/providers/api/user_provider.dart'; -import 'package:test_sa/models/pantry/calibration_tools.dart'; -import 'package:test_sa/models/pantry/contact.dart'; import 'package:test_sa/models/pantry/pentry.dart'; -import 'package:test_sa/models/pantry/ppm_check_list.dart'; -import 'package:test_sa/views/app_style/colors.dart'; import 'package:test_sa/views/app_style/sizing.dart'; import 'package:test_sa/views/widgets/app_text_form_field.dart'; -import 'package:test_sa/views/widgets/buttons/app_button.dart'; -import 'package:test_sa/views/widgets/buttons/app_small_button.dart'; import 'package:test_sa/views/widgets/date_and_time/date_picker.dart'; import 'package:test_sa/views/widgets/images/mini_one_image_picker.dart'; -import 'package:test_sa/views/widgets/pentry/auto_complete_fields/auto_complete_devices_field.dart'; import 'package:test_sa/views/widgets/status/pentry/pentry_status_mune.dart'; -import 'package:test_sa/views/widgets/status/pentry/pentry_task_status_mune.dart'; import 'package:test_sa/views/widgets/status/pentry/pentry_visit_status_mune.dart'; import 'package:test_sa/views/widgets/timer/app_timer.dart'; import 'package:test_sa/views/widgets/titles/app_sub_title.dart'; diff --git a/lib/views/widgets/pentry/pentry_pm_kit_form.dart b/lib/views/widgets/pentry/pentry_pm_kit_form.dart index c725a118..6fdd3b43 100644 --- a/lib/views/widgets/pentry/pentry_pm_kit_form.dart +++ b/lib/views/widgets/pentry/pentry_pm_kit_form.dart @@ -1,16 +1,12 @@ import 'package:flutter/material.dart'; import 'package:test_sa/controllers/localization/localization.dart'; import 'package:test_sa/models/lookup.dart'; -import 'package:test_sa/models/pantry/contact.dart'; import 'package:test_sa/models/pantry/pm_kit.dart'; -import 'package:test_sa/models/pantry/ppm_check_list.dart'; -import 'package:test_sa/views/app_style/colors.dart'; import 'package:test_sa/views/app_style/sizing.dart'; import 'package:test_sa/views/widgets/app_text_form_field.dart'; import 'package:test_sa/views/widgets/buttons/app_button.dart'; import 'package:test_sa/views/widgets/buttons/app_small_button.dart'; import 'package:test_sa/views/widgets/parts/auto_complete_parts_field.dart'; -import 'package:test_sa/views/widgets/status/pentry/pentry_task_status_mune.dart'; import 'package:test_sa/views/widgets/titles/app_sub_title.dart'; class PentryPMKitForm extends StatefulWidget { final List models; diff --git a/lib/views/widgets/pentry/pentry_ppm_check_list_form.dart b/lib/views/widgets/pentry/pentry_ppm_check_list_form.dart index 7219c33a..201c7498 100644 --- a/lib/views/widgets/pentry/pentry_ppm_check_list_form.dart +++ b/lib/views/widgets/pentry/pentry_ppm_check_list_form.dart @@ -1,8 +1,6 @@ import 'package:flutter/material.dart'; import 'package:test_sa/controllers/localization/localization.dart'; -import 'package:test_sa/models/pantry/contact.dart'; import 'package:test_sa/models/pantry/ppm_check_list.dart'; -import 'package:test_sa/views/app_style/colors.dart'; import 'package:test_sa/views/app_style/sizing.dart'; import 'package:test_sa/views/widgets/app_text_form_field.dart'; import 'package:test_sa/views/widgets/buttons/app_button.dart'; diff --git a/lib/views/widgets/requests/info_row.dart b/lib/views/widgets/requests/info_row.dart index e7f8ed43..d8fe0bc6 100644 --- a/lib/views/widgets/requests/info_row.dart +++ b/lib/views/widgets/requests/info_row.dart @@ -1,5 +1,5 @@ -import 'package:test_sa/views/app_style/sizing.dart'; import 'package:flutter/material.dart'; +import 'package:test_sa/views/app_style/sizing.dart'; class RequestInfoRow extends StatelessWidget { final String title; final String info; diff --git a/lib/views/widgets/requests/request_status.dart b/lib/views/widgets/requests/request_status.dart index 44308861..c953efc8 100644 --- a/lib/views/widgets/requests/request_status.dart +++ b/lib/views/widgets/requests/request_status.dart @@ -1,8 +1,6 @@ -import 'package:test_sa/models/service_request/service_request.dart'; -import 'package:test_sa/models/lookup.dart'; +import 'package:flutter/material.dart'; import 'package:test_sa/views/app_style/colors.dart'; import 'package:test_sa/views/app_style/sizing.dart'; -import 'package:flutter/material.dart'; class StatusLabel extends StatelessWidget { final String label; final Color color; diff --git a/lib/views/widgets/requests/service_request_item.dart b/lib/views/widgets/requests/service_request_item.dart index 448cb53e..0c63f2ff 100644 --- a/lib/views/widgets/requests/service_request_item.dart +++ b/lib/views/widgets/requests/service_request_item.dart @@ -1,4 +1,7 @@ -import 'package:fluttertoast/fluttertoast.dart'; +import 'package:flutter/cupertino.dart'; +import 'package:flutter/material.dart'; +import 'package:intl/intl.dart'; +import 'package:provider/provider.dart'; import 'package:test_sa/controllers/localization/localization.dart'; import 'package:test_sa/controllers/providers/api/service_requests_provider.dart'; import 'package:test_sa/controllers/providers/api/user_provider.dart'; @@ -10,16 +13,8 @@ import 'package:test_sa/models/user.dart'; import 'package:test_sa/views/app_style/colors.dart'; import 'package:test_sa/views/app_style/sizing.dart'; import 'package:test_sa/views/pages/user/requests/report/create_service_report.dart'; -import 'package:test_sa/views/pages/user/requests/report/future_service_report.dart'; import 'package:test_sa/views/widgets/loaders/image_loader.dart'; import 'package:test_sa/views/widgets/requests/request_status.dart'; -import 'package:flutter/cupertino.dart'; -import 'package:flutter/material.dart'; -import 'package:intl/intl.dart'; -import 'package:provider/provider.dart'; -import 'package:test_sa/views/widgets/timer/app_timer.dart'; - -import '../../../controllers/http_status_manger/http_status_manger.dart'; class ServiceRequestItem extends StatelessWidget { final int index; final ServiceRequest request; diff --git a/lib/views/widgets/requests/service_request_list.dart b/lib/views/widgets/requests/service_request_list.dart index 7672a5d6..7cd71079 100644 --- a/lib/views/widgets/requests/service_request_list.dart +++ b/lib/views/widgets/requests/service_request_list.dart @@ -1,3 +1,4 @@ +import 'package:flutter/material.dart'; import 'package:test_sa/controllers/localization/localization.dart'; import 'package:test_sa/models/service_request/service_request.dart'; import 'package:test_sa/models/subtitle.dart'; @@ -5,7 +6,6 @@ import 'package:test_sa/views/pages/user/requests/request_details.dart'; import 'package:test_sa/views/widgets/loaders/lazy_loading.dart'; import 'package:test_sa/views/widgets/loaders/no_item_found.dart'; import 'package:test_sa/views/widgets/requests/service_request_item.dart'; -import 'package:flutter/material.dart'; class ServiceRequestsList extends StatelessWidget { final List requests; final bool nextPage; diff --git a/lib/views/widgets/requests/service_request_update_dialog.dart b/lib/views/widgets/requests/service_request_update_dialog.dart index bde17432..71dd67cc 100644 --- a/lib/views/widgets/requests/service_request_update_dialog.dart +++ b/lib/views/widgets/requests/service_request_update_dialog.dart @@ -1,4 +1,5 @@ import 'package:flutter/cupertino.dart'; +import 'package:flutter/material.dart'; import 'package:fluttertoast/fluttertoast.dart'; import 'package:provider/provider.dart'; import 'package:test_sa/controllers/http_status_manger/http_status_manger.dart'; @@ -6,20 +7,14 @@ import 'package:test_sa/controllers/localization/localization.dart'; import 'package:test_sa/controllers/providers/api/service_requests_provider.dart'; import 'package:test_sa/controllers/providers/api/user_provider.dart'; import 'package:test_sa/controllers/providers/settings/setting_provider.dart'; -import 'package:test_sa/models/service_request/service_request.dart'; -import 'package:test_sa/models/service_request/service_request_search.dart'; import 'package:test_sa/models/lookup.dart'; +import 'package:test_sa/models/service_request/service_request.dart'; import 'package:test_sa/models/subtitle.dart'; import 'package:test_sa/views/app_style/sizing.dart'; -import 'package:test_sa/views/widgets/buttons/app_button.dart'; import 'package:test_sa/views/widgets/buttons/app_small_button.dart'; import 'package:test_sa/views/widgets/date_and_time/date_picker.dart'; -import 'package:test_sa/views/widgets/hospitals/hospital_auto_complete_field.dart'; -import 'package:flutter/material.dart'; import 'package:test_sa/views/widgets/status/employee/employee_mune.dart'; -import '../app_text_form_field.dart'; - class ServiceRequestsUpdateDialog extends StatefulWidget { final ServiceRequest request; const ServiceRequestsUpdateDialog({ diff --git a/lib/views/widgets/search/filter_item.dart b/lib/views/widgets/search/filter_item.dart index 0d346dfb..10d708a0 100644 --- a/lib/views/widgets/search/filter_item.dart +++ b/lib/views/widgets/search/filter_item.dart @@ -1,7 +1,7 @@ +import 'package:flutter/material.dart'; import 'package:test_sa/models/lookup.dart'; import 'package:test_sa/views/app_style/colors.dart'; import 'package:test_sa/views/app_style/sizing.dart'; -import 'package:flutter/material.dart'; class FilterItem extends StatelessWidget { final bool isSelected; diff --git a/lib/views/widgets/search/service_request_search_bar.dart b/lib/views/widgets/search/service_request_search_bar.dart index 57781690..a1f78945 100644 --- a/lib/views/widgets/search/service_request_search_bar.dart +++ b/lib/views/widgets/search/service_request_search_bar.dart @@ -1,12 +1,12 @@ +import 'package:flutter/material.dart'; import 'package:test_sa/controllers/localization/localization.dart'; -import 'package:test_sa/models/service_request/service_request_search.dart'; import 'package:test_sa/models/lookup.dart'; +import 'package:test_sa/models/service_request/service_request_search.dart'; import 'package:test_sa/models/subtitle.dart'; import 'package:test_sa/views/app_style/sizing.dart'; import 'package:test_sa/views/widgets/buttons/app_button.dart'; import 'package:test_sa/views/widgets/buttons/app_small_button.dart'; import 'package:test_sa/views/widgets/hospitals/hospital_auto_complete_field.dart'; -import 'package:flutter/material.dart'; import '../app_text_form_field.dart'; import 'filter_item.dart'; diff --git a/lib/views/widgets/search/visits_search_bar.dart b/lib/views/widgets/search/visits_search_bar.dart index 8930ea76..17805c20 100644 --- a/lib/views/widgets/search/visits_search_bar.dart +++ b/lib/views/widgets/search/visits_search_bar.dart @@ -1,3 +1,5 @@ +import 'package:flutter/material.dart'; +import 'package:flutter/services.dart'; import 'package:test_sa/controllers/localization/localization.dart'; import 'package:test_sa/models/lookup.dart'; import 'package:test_sa/models/subtitle.dart'; @@ -8,8 +10,6 @@ import 'package:test_sa/views/widgets/buttons/app_small_button.dart'; import 'package:test_sa/views/widgets/date_and_time/from_to_date_bar.dart'; import 'package:test_sa/views/widgets/hospitals/hospital_auto_complete_field.dart'; import 'package:test_sa/views/widgets/titles/app_sub_title.dart'; -import 'package:flutter/material.dart'; -import 'package:flutter/services.dart'; import '../app_text_form_field.dart'; import 'filter_item.dart'; diff --git a/lib/views/widgets/sound/record_sound.dart b/lib/views/widgets/sound/record_sound.dart index 2f93c150..a5ffcc32 100644 --- a/lib/views/widgets/sound/record_sound.dart +++ b/lib/views/widgets/sound/record_sound.dart @@ -3,7 +3,6 @@ import 'package:flutter/services.dart'; import 'package:flutter_sound/flutter_sound.dart'; import 'package:permission_handler/permission_handler.dart'; import 'package:rive/rive.dart'; -import 'package:test_sa/views/widgets/buttons/app_button.dart'; import 'package:test_sa/views/widgets/buttons/app_icon_button2.dart'; import 'package:test_sa/views/widgets/buttons/app_small_button.dart'; import 'package:test_sa/views/widgets/sound/sound_player.dart'; @@ -89,7 +88,6 @@ class _RecordSoundState extends State { _recording = true; setState(() {}); - print("onTapDown"); } _stopRecording() async { @@ -99,12 +97,10 @@ class _RecordSoundState extends State { return; } String path = (await _myRecorder.stopRecorder()).toString(); - print("audio path ----> $path <-----"); _record = path; widget.onRecord(path); _recording = false; setState(() { }); - print("onTapUp"); } _cancelRecording() async { @@ -117,7 +113,6 @@ class _RecordSoundState extends State { _recording = false; await Future.delayed(const Duration(seconds: 1)); if(!_recording) setState(() { }); - print("onTapCancel"); // _message.memoryAudio.; } diff --git a/lib/views/widgets/sound/sound_player.dart b/lib/views/widgets/sound/sound_player.dart index 20dd0051..7793f54b 100644 --- a/lib/views/widgets/sound/sound_player.dart +++ b/lib/views/widgets/sound/sound_player.dart @@ -1,5 +1,3 @@ -import 'dart:typed_data'; - import 'package:audioplayers/audioplayers.dart'; import 'package:flutter/material.dart'; import 'package:test_sa/views/app_style/sizing.dart'; @@ -81,7 +79,7 @@ class _ASoundPlayerState extends State { icon: const Icon( Icons.replay_rounded), onPressed: () async { _failedToLoad = false; - print(!Uri.parse(_audio).isAbsolute); + try { _audioPlayer.seek(const Duration(milliseconds: 0)); _audioPlayer.stop(); @@ -131,7 +129,6 @@ class _ASoundPlayerState extends State { } // set up listeners _audioPlayer.onPositionChanged.listen((Duration duration) { - //print('Current position: $p'); if(!_sliderMoving){ _audioPosition = duration; rebuild(); diff --git a/lib/views/widgets/status/employee/employee_mune.dart b/lib/views/widgets/status/employee/employee_mune.dart index 5ee55ea5..5ea741d4 100644 --- a/lib/views/widgets/status/employee/employee_mune.dart +++ b/lib/views/widgets/status/employee/employee_mune.dart @@ -1,11 +1,11 @@ +import 'package:flutter/material.dart'; +import 'package:provider/provider.dart'; import 'package:test_sa/controllers/providers/api/status_drop_down/employee/employee_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/models/lookup.dart'; import 'package:test_sa/views/widgets/loaders/loading_manager.dart'; import 'package:test_sa/views/widgets/status/single_status_menu.dart'; -import 'package:flutter/material.dart'; -import 'package:provider/provider.dart'; class EmployeeMenu extends StatelessWidget { final Function(Lookup) onSelect; final Lookup initialValue; diff --git a/lib/views/widgets/status/gas_refill/gas_cylinder_size.dart b/lib/views/widgets/status/gas_refill/gas_cylinder_size.dart index 925e920a..358226b0 100644 --- a/lib/views/widgets/status/gas_refill/gas_cylinder_size.dart +++ b/lib/views/widgets/status/gas_refill/gas_cylinder_size.dart @@ -1,13 +1,11 @@ +import 'package:flutter/material.dart'; +import 'package:provider/provider.dart'; import 'package:test_sa/controllers/providers/api/status_drop_down/gas_refill/gas_cylinder_size_provider.dart'; -import 'package:test_sa/controllers/providers/api/status_drop_down/gas_refill/gas_status_provider.dart'; -import 'package:test_sa/controllers/providers/api/status_drop_down/report/service_types_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/models/lookup.dart'; import 'package:test_sa/views/widgets/loaders/loading_manager.dart'; import 'package:test_sa/views/widgets/status/single_status_menu.dart'; -import 'package:flutter/material.dart'; -import 'package:provider/provider.dart'; class GasCylinderSizeMenu extends StatelessWidget { final Function(Lookup) onSelect; final Lookup initialValue; diff --git a/lib/views/widgets/status/gas_refill/gas_status.dart b/lib/views/widgets/status/gas_refill/gas_status.dart index c198bd33..1dce0c71 100644 --- a/lib/views/widgets/status/gas_refill/gas_status.dart +++ b/lib/views/widgets/status/gas_refill/gas_status.dart @@ -1,13 +1,11 @@ -import 'package:test_sa/controllers/providers/api/status_drop_down/gas_refill/gas_cylinder_size_provider.dart'; +import 'package:flutter/material.dart'; +import 'package:provider/provider.dart'; import 'package:test_sa/controllers/providers/api/status_drop_down/gas_refill/gas_status_provider.dart'; -import 'package:test_sa/controllers/providers/api/status_drop_down/report/service_types_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/models/lookup.dart'; import 'package:test_sa/views/widgets/loaders/loading_manager.dart'; import 'package:test_sa/views/widgets/status/single_status_menu.dart'; -import 'package:flutter/material.dart'; -import 'package:provider/provider.dart'; class GasStatusMenu extends StatelessWidget { final Function(Lookup) onSelect; final Lookup initialValue; diff --git a/lib/views/widgets/status/gas_refill/gas_type.dart b/lib/views/widgets/status/gas_refill/gas_type.dart index 6f0c0616..8d3b9e61 100644 --- a/lib/views/widgets/status/gas_refill/gas_type.dart +++ b/lib/views/widgets/status/gas_refill/gas_type.dart @@ -1,14 +1,11 @@ -import 'package:test_sa/controllers/providers/api/status_drop_down/gas_refill/gas_cylinder_size_provider.dart'; -import 'package:test_sa/controllers/providers/api/status_drop_down/gas_refill/gas_status_provider.dart'; +import 'package:flutter/material.dart'; +import 'package:provider/provider.dart'; import 'package:test_sa/controllers/providers/api/status_drop_down/gas_refill/gas_types_provider.dart'; -import 'package:test_sa/controllers/providers/api/status_drop_down/report/service_types_provider.dart'; import 'package:test_sa/controllers/providers/api/user_provider.dart'; import 'package:test_sa/controllers/providers/settings/setting_provider.dart'; import 'package:test_sa/models/lookup.dart'; import 'package:test_sa/views/widgets/loaders/loading_manager.dart'; import 'package:test_sa/views/widgets/status/single_status_menu.dart'; -import 'package:flutter/material.dart'; -import 'package:provider/provider.dart'; class GasTypeMenu extends StatelessWidget { final Function(Lookup) onSelect; final Lookup initialValue; diff --git a/lib/views/widgets/status/multi_status_menu.dart b/lib/views/widgets/status/multi_status_menu.dart index 8d1d7c4c..99a52a87 100644 --- a/lib/views/widgets/status/multi_status_menu.dart +++ b/lib/views/widgets/status/multi_status_menu.dart @@ -1,10 +1,9 @@ import 'package:flutter/cupertino.dart'; +import 'package:flutter/material.dart'; import 'package:flutter_typeahead/flutter_typeahead.dart'; import 'package:test_sa/models/lookup.dart'; import 'package:test_sa/views/app_style/colors.dart'; import 'package:test_sa/views/app_style/sizing.dart'; -import 'package:flutter/material.dart'; -import 'package:test_sa/views/widgets/app_text_form_field.dart'; class MultiStatusMenu extends StatefulWidget { final List statuses; final List initialSelectedStatus; diff --git a/lib/views/widgets/status/pentry/pentry_status_mune.dart b/lib/views/widgets/status/pentry/pentry_status_mune.dart index 3b1ef709..b0813f22 100644 --- a/lib/views/widgets/status/pentry/pentry_status_mune.dart +++ b/lib/views/widgets/status/pentry/pentry_status_mune.dart @@ -1,14 +1,11 @@ -import 'package:test_sa/controllers/providers/api/status_drop_down/employee/employee_provider.dart'; +import 'package:flutter/material.dart'; +import 'package:provider/provider.dart'; import 'package:test_sa/controllers/providers/api/status_drop_down/pentry/pentry_status_provider.dart'; -import 'package:test_sa/controllers/providers/api/status_drop_down/pentry/pentry_task_status_provider.dart'; -import 'package:test_sa/controllers/providers/api/status_drop_down/pentry/pentry_visit_status_provider.dart'; import 'package:test_sa/controllers/providers/api/user_provider.dart'; import 'package:test_sa/controllers/providers/settings/setting_provider.dart'; import 'package:test_sa/models/lookup.dart'; import 'package:test_sa/views/widgets/loaders/loading_manager.dart'; import 'package:test_sa/views/widgets/status/single_status_menu.dart'; -import 'package:flutter/material.dart'; -import 'package:provider/provider.dart'; class PentryStatusMenu extends StatelessWidget { final Function(Lookup) onSelect; final Lookup initialValue; diff --git a/lib/views/widgets/status/pentry/pentry_task_status_mune.dart b/lib/views/widgets/status/pentry/pentry_task_status_mune.dart index d9f4f276..8564410d 100644 --- a/lib/views/widgets/status/pentry/pentry_task_status_mune.dart +++ b/lib/views/widgets/status/pentry/pentry_task_status_mune.dart @@ -1,12 +1,11 @@ -import 'package:test_sa/controllers/providers/api/status_drop_down/employee/employee_provider.dart'; +import 'package:flutter/material.dart'; +import 'package:provider/provider.dart'; import 'package:test_sa/controllers/providers/api/status_drop_down/pentry/pentry_task_status_provider.dart'; import 'package:test_sa/controllers/providers/api/user_provider.dart'; import 'package:test_sa/controllers/providers/settings/setting_provider.dart'; import 'package:test_sa/models/lookup.dart'; import 'package:test_sa/views/widgets/loaders/loading_manager.dart'; import 'package:test_sa/views/widgets/status/single_status_menu.dart'; -import 'package:flutter/material.dart'; -import 'package:provider/provider.dart'; class PentryTaskStatusMenu extends StatelessWidget { final Function(Lookup) onSelect; final Lookup initialValue; diff --git a/lib/views/widgets/status/pentry/pentry_visit_status_mune.dart b/lib/views/widgets/status/pentry/pentry_visit_status_mune.dart index 8df13d8c..4df17a49 100644 --- a/lib/views/widgets/status/pentry/pentry_visit_status_mune.dart +++ b/lib/views/widgets/status/pentry/pentry_visit_status_mune.dart @@ -1,13 +1,11 @@ -import 'package:test_sa/controllers/providers/api/status_drop_down/employee/employee_provider.dart'; -import 'package:test_sa/controllers/providers/api/status_drop_down/pentry/pentry_task_status_provider.dart'; +import 'package:flutter/material.dart'; +import 'package:provider/provider.dart'; import 'package:test_sa/controllers/providers/api/status_drop_down/pentry/pentry_visit_status_provider.dart'; import 'package:test_sa/controllers/providers/api/user_provider.dart'; import 'package:test_sa/controllers/providers/settings/setting_provider.dart'; import 'package:test_sa/models/lookup.dart'; import 'package:test_sa/views/widgets/loaders/loading_manager.dart'; import 'package:test_sa/views/widgets/status/single_status_menu.dart'; -import 'package:flutter/material.dart'; -import 'package:provider/provider.dart'; class PentryVisitsStatusMenu extends StatelessWidget { final Function(Lookup) onSelect; final Lookup initialValue; diff --git a/lib/views/widgets/status/report/service_report_last_call.dart b/lib/views/widgets/status/report/service_report_last_call.dart index 1e858cb9..a3f59211 100644 --- a/lib/views/widgets/status/report/service_report_last_call.dart +++ b/lib/views/widgets/status/report/service_report_last_call.dart @@ -1,10 +1,10 @@ +import 'package:flutter/material.dart'; +import 'package:provider/provider.dart'; import 'package:test_sa/controllers/providers/api/status_drop_down/report/service_report_last_calls_provider.dart'; -import 'package:test_sa/models/service_report.dart'; import 'package:test_sa/models/lookup.dart'; +import 'package:test_sa/models/service_report.dart'; import 'package:test_sa/views/widgets/loaders/loading_manager.dart'; import 'package:test_sa/views/widgets/status/single_status_menu.dart'; -import 'package:flutter/material.dart'; -import 'package:provider/provider.dart'; class ServiceReportLastCallsMenu extends StatelessWidget { final Function(Lookup) onSelect; final ServiceReport report; diff --git a/lib/views/widgets/status/report/service_report_reasons.dart b/lib/views/widgets/status/report/service_report_reasons.dart index fc24140d..dbdd48ef 100644 --- a/lib/views/widgets/status/report/service_report_reasons.dart +++ b/lib/views/widgets/status/report/service_report_reasons.dart @@ -1,11 +1,11 @@ +import 'package:flutter/material.dart'; +import 'package:provider/provider.dart'; import 'package:test_sa/controllers/providers/api/status_drop_down/report/service_report_reasons_provider.dart'; import 'package:test_sa/controllers/providers/api/user_provider.dart'; import 'package:test_sa/controllers/providers/settings/setting_provider.dart'; import 'package:test_sa/models/lookup.dart'; import 'package:test_sa/views/widgets/loaders/loading_manager.dart'; import 'package:test_sa/views/widgets/status/single_status_menu.dart'; -import 'package:flutter/material.dart'; -import 'package:provider/provider.dart'; class ServiceReportReasonsMenu extends StatelessWidget { final Lookup initialValue; final Function(Lookup) onSelect; diff --git a/lib/views/widgets/status/report/service_report_status.dart b/lib/views/widgets/status/report/service_report_status.dart index d739b1db..8a4d1c98 100644 --- a/lib/views/widgets/status/report/service_report_status.dart +++ b/lib/views/widgets/status/report/service_report_status.dart @@ -1,15 +1,15 @@ import 'dart:math'; +import 'package:flutter/material.dart'; +import 'package:provider/provider.dart'; import 'package:test_sa/controllers/providers/api/status_drop_down/report/service_report_last_calls_provider.dart'; import 'package:test_sa/controllers/providers/api/status_drop_down/report/service_report_status_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/models/service_report.dart'; import 'package:test_sa/models/lookup.dart'; +import 'package:test_sa/models/service_report.dart'; import 'package:test_sa/views/widgets/loaders/loading_manager.dart'; import 'package:test_sa/views/widgets/status/single_status_menu.dart'; -import 'package:flutter/material.dart'; -import 'package:provider/provider.dart'; class ServiceReportStatusMenu extends StatefulWidget { final Function(Lookup) onSelect; final ServiceReport report; diff --git a/lib/views/widgets/status/report/service_report_type.dart b/lib/views/widgets/status/report/service_report_type.dart index b3e509b3..fb315747 100644 --- a/lib/views/widgets/status/report/service_report_type.dart +++ b/lib/views/widgets/status/report/service_report_type.dart @@ -1,11 +1,11 @@ +import 'package:flutter/material.dart'; +import 'package:provider/provider.dart'; import 'package:test_sa/controllers/providers/api/status_drop_down/report/service_report_types_provider.dart'; import 'package:test_sa/controllers/providers/api/user_provider.dart'; import 'package:test_sa/controllers/providers/settings/setting_provider.dart'; import 'package:test_sa/models/lookup.dart'; import 'package:test_sa/views/widgets/loaders/loading_manager.dart'; import 'package:test_sa/views/widgets/status/single_status_menu.dart'; -import 'package:flutter/material.dart'; -import 'package:provider/provider.dart'; class ServiceReportTypeMenu extends StatelessWidget { final Function(Lookup) onSelect; final Lookup initialValue; diff --git a/lib/views/widgets/status/report/service_status.dart b/lib/views/widgets/status/report/service_status.dart index a9bd0950..37eb554e 100644 --- a/lib/views/widgets/status/report/service_status.dart +++ b/lib/views/widgets/status/report/service_status.dart @@ -1,11 +1,11 @@ +import 'package:flutter/material.dart'; +import 'package:provider/provider.dart'; import 'package:test_sa/controllers/providers/api/status_drop_down/report/service_types_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/models/lookup.dart'; import 'package:test_sa/views/widgets/loaders/loading_manager.dart'; import 'package:test_sa/views/widgets/status/single_status_menu.dart'; -import 'package:flutter/material.dart'; -import 'package:provider/provider.dart'; class ServiceStatusMenu extends StatelessWidget { final Function(Lookup) onSelect; final Lookup initialValue; diff --git a/lib/views/widgets/status/service_request/service_request_defect_types_mune.dart b/lib/views/widgets/status/service_request/service_request_defect_types_mune.dart index 5d4e0902..be02c54e 100644 --- a/lib/views/widgets/status/service_request/service_request_defect_types_mune.dart +++ b/lib/views/widgets/status/service_request/service_request_defect_types_mune.dart @@ -1,15 +1,11 @@ -import 'package:test_sa/controllers/providers/api/status_drop_down/employee/employee_provider.dart'; -import 'package:test_sa/controllers/providers/api/status_drop_down/pentry/pentry_task_status_provider.dart'; -import 'package:test_sa/controllers/providers/api/status_drop_down/pentry/pentry_visit_status_provider.dart'; +import 'package:flutter/material.dart'; +import 'package:provider/provider.dart'; import 'package:test_sa/controllers/providers/api/status_drop_down/report/service_report_defect_types_provider.dart'; -import 'package:test_sa/controllers/providers/api/status_drop_down/report/service_report_priority_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/models/lookup.dart'; import 'package:test_sa/views/widgets/loaders/loading_manager.dart'; import 'package:test_sa/views/widgets/status/single_status_menu.dart'; -import 'package:flutter/material.dart'; -import 'package:provider/provider.dart'; class ServiceRequestDefectTypesMenu extends StatelessWidget { final Function(Lookup) onSelect; final Lookup initialValue; diff --git a/lib/views/widgets/status/service_request/service_request_priority_mune.dart b/lib/views/widgets/status/service_request/service_request_priority_mune.dart index 709d35a4..fe3bd6db 100644 --- a/lib/views/widgets/status/service_request/service_request_priority_mune.dart +++ b/lib/views/widgets/status/service_request/service_request_priority_mune.dart @@ -1,14 +1,11 @@ -import 'package:test_sa/controllers/providers/api/status_drop_down/employee/employee_provider.dart'; -import 'package:test_sa/controllers/providers/api/status_drop_down/pentry/pentry_task_status_provider.dart'; -import 'package:test_sa/controllers/providers/api/status_drop_down/pentry/pentry_visit_status_provider.dart'; +import 'package:flutter/material.dart'; +import 'package:provider/provider.dart'; import 'package:test_sa/controllers/providers/api/status_drop_down/report/service_report_priority_provider.dart'; import 'package:test_sa/controllers/providers/api/user_provider.dart'; import 'package:test_sa/controllers/providers/settings/setting_provider.dart'; import 'package:test_sa/models/lookup.dart'; import 'package:test_sa/views/widgets/loaders/loading_manager.dart'; import 'package:test_sa/views/widgets/status/single_status_menu.dart'; -import 'package:flutter/material.dart'; -import 'package:provider/provider.dart'; class ServiceRequestPriorityMenu extends StatelessWidget { final Function(Lookup) onSelect; final Lookup initialValue; diff --git a/lib/views/widgets/status/single_status_menu.dart b/lib/views/widgets/status/single_status_menu.dart index 592830ef..6640bf19 100644 --- a/lib/views/widgets/status/single_status_menu.dart +++ b/lib/views/widgets/status/single_status_menu.dart @@ -1,7 +1,7 @@ +import 'package:flutter/material.dart'; import 'package:test_sa/models/lookup.dart'; import 'package:test_sa/views/app_style/colors.dart'; import 'package:test_sa/views/app_style/sizing.dart'; -import 'package:flutter/material.dart'; class SingleStatusMenu extends StatefulWidget { final List statuses; final Lookup initialStatus; diff --git a/lib/views/widgets/timer/app_timer.dart b/lib/views/widgets/timer/app_timer.dart index 48f96723..4002475d 100644 --- a/lib/views/widgets/timer/app_timer.dart +++ b/lib/views/widgets/timer/app_timer.dart @@ -4,7 +4,6 @@ import 'package:flutter/material.dart'; import 'package:test_sa/models/timer_model.dart'; import 'package:test_sa/views/app_style/colors.dart'; import 'package:test_sa/views/app_style/sizing.dart'; -import 'package:test_sa/views/widgets/loaders/app_loading.dart'; class AppTimer extends StatefulWidget { final TimerModel timer; final Future Function(TimerModel) onChange; diff --git a/lib/views/widgets/titles/app_sub_title.dart b/lib/views/widgets/titles/app_sub_title.dart index 0d611db1..68211873 100644 --- a/lib/views/widgets/titles/app_sub_title.dart +++ b/lib/views/widgets/titles/app_sub_title.dart @@ -1,5 +1,5 @@ -import 'package:test_sa/views/app_style/sizing.dart'; import 'package:flutter/material.dart'; +import 'package:test_sa/views/app_style/sizing.dart'; class ASubTitle extends StatelessWidget { final String text; final EdgeInsets padding; diff --git a/lib/views/widgets/titles/app_title.dart b/lib/views/widgets/titles/app_title.dart index e97f8b9d..e5dfbc9e 100644 --- a/lib/views/widgets/titles/app_title.dart +++ b/lib/views/widgets/titles/app_title.dart @@ -1,5 +1,5 @@ -import 'package:test_sa/views/app_style/sizing.dart'; import 'package:flutter/material.dart'; +import 'package:test_sa/views/app_style/sizing.dart'; class ATitle extends StatelessWidget { final String text; final EdgeInsets padding; diff --git a/lib/views/widgets/titles/expandable_info_row.dart b/lib/views/widgets/titles/expandable_info_row.dart index c67ff85f..b5d24e62 100644 --- a/lib/views/widgets/titles/expandable_info_row.dart +++ b/lib/views/widgets/titles/expandable_info_row.dart @@ -1,6 +1,6 @@ -import 'package:test_sa/views/app_style/sizing.dart'; import 'package:flutter/material.dart'; import 'package:font_awesome_flutter/font_awesome_flutter.dart'; +import 'package:test_sa/views/app_style/sizing.dart'; class ExpandableInfoRow extends StatefulWidget { final IconData iconData; final String title; diff --git a/lib/views/widgets/visits/visit_item.dart b/lib/views/widgets/visits/visit_item.dart index 3298aa53..a57016e6 100644 --- a/lib/views/widgets/visits/visit_item.dart +++ b/lib/views/widgets/visits/visit_item.dart @@ -1,14 +1,13 @@ +import 'package:flutter/cupertino.dart'; +import 'package:flutter/material.dart'; +import 'package:provider/provider.dart'; import 'package:test_sa/controllers/localization/localization.dart'; import 'package:test_sa/controllers/providers/api/user_provider.dart'; import 'package:test_sa/models/enums/user_types.dart'; import 'package:test_sa/models/subtitle.dart'; import 'package:test_sa/models/visits/visit.dart'; import 'package:test_sa/views/app_style/sizing.dart'; -import 'package:test_sa/views/widgets/timer/app_timer.dart'; import 'package:test_sa/views/widgets/visits/visit_status.dart'; -import 'package:flutter/cupertino.dart'; -import 'package:flutter/material.dart'; -import 'package:provider/provider.dart'; class VisitItem extends StatelessWidget { final Visit visit; final int index; diff --git a/lib/views/widgets/visits/visit_status.dart b/lib/views/widgets/visits/visit_status.dart index 7309dcd6..871287fe 100644 --- a/lib/views/widgets/visits/visit_status.dart +++ b/lib/views/widgets/visits/visit_status.dart @@ -1,7 +1,7 @@ +import 'package:flutter/material.dart'; import 'package:test_sa/models/visits/visit.dart'; import 'package:test_sa/views/app_style/colors.dart'; import 'package:test_sa/views/app_style/sizing.dart'; -import 'package:flutter/material.dart'; class VisitStatusLabel extends StatelessWidget { final Visit visit; diff --git a/lib/views/widgets/visits/visits_list.dart b/lib/views/widgets/visits/visits_list.dart index a5b05966..ba688518 100644 --- a/lib/views/widgets/visits/visits_list.dart +++ b/lib/views/widgets/visits/visits_list.dart @@ -1,3 +1,4 @@ +import 'package:flutter/material.dart'; import 'package:test_sa/controllers/localization/localization.dart'; import 'package:test_sa/models/subtitle.dart'; import 'package:test_sa/models/visits/visit.dart'; @@ -6,7 +7,6 @@ import 'package:test_sa/views/pages/user/visits/visit_details.dart'; import 'package:test_sa/views/widgets/loaders/lazy_loading.dart'; import 'package:test_sa/views/widgets/loaders/no_item_found.dart'; import 'package:test_sa/views/widgets/visits/visit_item.dart'; -import 'package:flutter/material.dart'; class VisitsList extends StatefulWidget { final List visits; final bool nextPage; From d256a27a214f92db83835f1d10aaad8911f39f7d Mon Sep 17 00:00:00 2001 From: MaximusAshraf <50173497+MaximusAshraf@users.noreply.github.com> Date: Tue, 17 Jan 2023 10:32:51 +0200 Subject: [PATCH 005/181] comment sign up button in login form --- lib/views/pages/login.dart | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/lib/views/pages/login.dart b/lib/views/pages/login.dart index 9d06692b..ad8554cd 100644 --- a/lib/views/pages/login.dart +++ b/lib/views/pages/login.dart @@ -140,16 +140,16 @@ class _LoginState extends State { } }, ), - SizedBox(height: 140 * AppStyle.getScaleFactor(context),), - AOutLinedButton( - text: _subtitle.signUp, - //color: AColors.cyan, - onPressed: (){ - Navigator.of(context).pushNamed(Register.id); - }, - ), + // SizedBox(height: 140 * AppStyle.getScaleFactor(context),), + // AOutLinedButton( + // text: _subtitle.signUp, + // //color: AColors.cyan, + // onPressed: (){ + // Navigator.of(context).pushNamed(Register.id); + // }, + // ), - SizedBox(height: 32,), + const SizedBox(height: 32,), ], ), ), From 079a11ad9812777868776c544e9f4098dcb856e9 Mon Sep 17 00:00:00 2001 From: Sikander Saleem Date: Mon, 13 Mar 2023 14:19:41 +0300 Subject: [PATCH 006/181] uat url added. --- lib/controllers/api_routes/urls.dart | 3 +- pubspec.lock | 450 ++++++++++++++++++--------- 2 files changed, 298 insertions(+), 155 deletions(-) diff --git a/lib/controllers/api_routes/urls.dart b/lib/controllers/api_routes/urls.dart index f2e26591..58c41d6f 100644 --- a/lib/controllers/api_routes/urls.dart +++ b/lib/controllers/api_routes/urls.dart @@ -1,7 +1,8 @@ class URLs{ URLs._(); static const host2 = "http://194.163.164.213/atoms/api"; - static const host1 = "https://atoms.hmg.com/api"; + // static const host1 = "https://atoms.hmg.com/api"; // production url + static const host1 = "https://atomsdev.hmg.com/api"; // uat url // API Routes static const login = "/handle/user/login"; // post diff --git a/pubspec.lock b/pubspec.lock index 8608b33d..414df867 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -5,252 +5,288 @@ packages: dependency: transitive description: name: _flutterfire_internals - url: "https://pub.dartlang.org" + sha256: "3ff770dfff04a67b0863dff205a0936784de1b87a5e99b11c693fc10e66a9ce3" + url: "https://pub.dev" source: hosted version: "1.0.12" archive: dependency: transitive description: name: archive - url: "https://pub.dartlang.org" + sha256: ed7cc591a948744994714375caf9a2ce89e1d82e8243997c8a2994d57181c212 + url: "https://pub.dev" source: hosted version: "3.3.5" args: dependency: transitive description: name: args - url: "https://pub.dartlang.org" + sha256: b003c3098049a51720352d219b0bb5f219b60fbfb68e7a4748139a06a5676515 + url: "https://pub.dev" source: hosted version: "2.3.1" async: dependency: transitive description: name: async - url: "https://pub.dartlang.org" + sha256: bfe67ef28df125b7dddcea62755991f807aa39a2492a23e1550161692950bbe0 + url: "https://pub.dev" source: hosted - version: "2.9.0" + version: "2.10.0" audioplayers: dependency: "direct main" description: name: audioplayers - url: "https://pub.dartlang.org" + sha256: bb506873ab4fb663db9b47243754ef669adf684dbe6ba8b57c26e27b834065c4 + url: "https://pub.dev" source: hosted version: "1.2.0" audioplayers_android: dependency: transitive description: name: audioplayers_android - url: "https://pub.dartlang.org" + sha256: "53969a1c5d94ebdaef72e334f1c0ea2f3946ab2baa8d398a9584ac27baf4f037" + url: "https://pub.dev" source: hosted version: "1.1.3" audioplayers_darwin: dependency: transitive description: name: audioplayers_darwin - url: "https://pub.dartlang.org" + sha256: dcd5a4ceef5aa3d04e8ae49441f13a3d9f93fe6e9e88fe121ff6b6f391b2a40b + url: "https://pub.dev" source: hosted version: "1.0.4" audioplayers_linux: dependency: transitive description: name: audioplayers_linux - url: "https://pub.dartlang.org" + sha256: ea1cb9a5c9389b38f293ee1375b22b02fb1d1f7a2e1517fcb674297dd074dc7b + url: "https://pub.dev" source: hosted version: "1.0.2" audioplayers_platform_interface: dependency: transitive description: name: audioplayers_platform_interface - url: "https://pub.dartlang.org" + sha256: "589c3106d0c656540e81ac2c7a78a9414a4a6534ae7b77f06ddb5d6aa5dc653c" + url: "https://pub.dev" source: hosted version: "2.1.0" audioplayers_web: dependency: transitive description: name: audioplayers_web - url: "https://pub.dartlang.org" + sha256: "13fb044a443276223774f8ed1f8d2b82f443cf8980edd0e172e55967c1556a49" + url: "https://pub.dev" source: hosted version: "2.1.0" audioplayers_windows: dependency: transitive description: name: audioplayers_windows - url: "https://pub.dartlang.org" + sha256: "87964ddece7275b97277935df67af60536155914c81c633f708914b99433129b" + url: "https://pub.dev" source: hosted version: "1.1.1" boolean_selector: dependency: transitive description: name: boolean_selector - url: "https://pub.dartlang.org" + sha256: "6cfb5af12253eaf2b368f07bacc5a80d1301a071c73360d746b7f2e32d762c66" + url: "https://pub.dev" source: hosted - version: "2.1.0" + version: "2.1.1" cached_network_image: dependency: "direct main" description: name: cached_network_image - url: "https://pub.dartlang.org" + sha256: fd3d0dc1d451f9a252b32d95d3f0c3c487bc41a75eba2e6097cb0b9c71491b15 + url: "https://pub.dev" source: hosted version: "3.2.3" cached_network_image_platform_interface: dependency: transitive description: name: cached_network_image_platform_interface - url: "https://pub.dartlang.org" + sha256: bb2b8403b4ccdc60ef5f25c70dead1f3d32d24b9d6117cfc087f496b178594a7 + url: "https://pub.dev" source: hosted version: "2.0.0" cached_network_image_web: dependency: transitive description: name: cached_network_image_web - url: "https://pub.dartlang.org" + sha256: b8eb814ebfcb4dea049680f8c1ffb2df399e4d03bf7a352c775e26fa06e02fa0 + url: "https://pub.dev" source: hosted version: "1.0.2" carousel_slider: dependency: "direct main" description: name: carousel_slider - url: "https://pub.dartlang.org" + sha256: "9c695cc963bf1d04a47bd6021f68befce8970bcd61d24938e1fb0918cf5d9c42" + url: "https://pub.dev" source: hosted version: "4.2.1" characters: dependency: transitive description: name: characters - url: "https://pub.dartlang.org" + sha256: e6a326c8af69605aec75ed6c187d06b349707a27fbff8222ca9cc2cff167975c + url: "https://pub.dev" source: hosted version: "1.2.1" checked_yaml: dependency: transitive description: name: checked_yaml - url: "https://pub.dartlang.org" + sha256: "3d1505d91afa809d177efd4eed5bb0eb65805097a1463abdd2add076effae311" + url: "https://pub.dev" source: hosted version: "2.0.2" cli_util: dependency: transitive description: name: cli_util - url: "https://pub.dartlang.org" + sha256: "66f86e916d285c1a93d3b79587d94bd71984a66aac4ff74e524cfa7877f1395c" + url: "https://pub.dev" source: hosted version: "0.3.5" clock: dependency: transitive description: name: clock - url: "https://pub.dartlang.org" + sha256: cb6d7f03e1de671e34607e909a7213e31d7752be4fb66a86d29fe1eb14bfb5cf + url: "https://pub.dev" source: hosted version: "1.1.1" collection: dependency: transitive description: name: collection - url: "https://pub.dartlang.org" + sha256: cfc915e6923fe5ce6e153b0723c753045de46de1b4d63771530504004a45fae0 + url: "https://pub.dev" source: hosted - version: "1.16.0" + version: "1.17.0" convert: dependency: transitive description: name: convert - url: "https://pub.dartlang.org" + sha256: "0f08b14755d163f6e2134cb58222dd25ea2a2ee8a195e53983d57c075324d592" + url: "https://pub.dev" source: hosted version: "3.1.1" cross_file: dependency: transitive description: name: cross_file - url: "https://pub.dartlang.org" + sha256: f71079978789bc2fe78d79227f1f8cfe195b31bbd8db2399b0d15a4b96fb843b + url: "https://pub.dev" source: hosted version: "0.3.3+2" crypto: dependency: transitive description: name: crypto - url: "https://pub.dartlang.org" + sha256: aa274aa7774f8964e4f4f38cc994db7b6158dd36e9187aaceaddc994b35c6c67 + url: "https://pub.dev" source: hosted version: "3.0.2" cupertino_icons: dependency: "direct main" description: name: cupertino_icons - url: "https://pub.dartlang.org" + sha256: e35129dc44c9118cee2a5603506d823bab99c68393879edb440e0090d07586be + url: "https://pub.dev" source: hosted version: "1.0.5" dbus: dependency: transitive description: name: dbus - url: "https://pub.dartlang.org" + sha256: "6f07cba3f7b3448d42d015bfd3d53fe12e5b36da2423f23838efc1d5fb31a263" + url: "https://pub.dev" source: hosted version: "0.7.8" fake_async: dependency: transitive description: name: fake_async - url: "https://pub.dartlang.org" + sha256: "511392330127add0b769b75a987850d136345d9227c6b94c96a04cf4a391bf78" + url: "https://pub.dev" source: hosted version: "1.3.1" ffi: dependency: transitive description: name: ffi - url: "https://pub.dartlang.org" + sha256: a38574032c5f1dd06c4aee541789906c12ccaab8ba01446e800d9c5b79c4a978 + url: "https://pub.dev" source: hosted version: "2.0.1" file: dependency: transitive description: name: file - url: "https://pub.dartlang.org" + sha256: "1b92bec4fc2a72f59a8e15af5f52cd441e4a7860b49499d69dfa817af20e925d" + url: "https://pub.dev" source: hosted version: "6.1.4" firebase_core: dependency: "direct main" description: name: firebase_core - url: "https://pub.dartlang.org" + sha256: c129209ba55f3d4272c89fb4a4994c15bea77fb6de63a82d45fb6bc5c94e4355 + url: "https://pub.dev" source: hosted version: "2.4.1" firebase_core_platform_interface: dependency: transitive description: name: firebase_core_platform_interface - url: "https://pub.dartlang.org" + sha256: "5fab93f5b354648efa62e7cc829c90efb68c8796eecf87e0888cae2d5f3accd4" + url: "https://pub.dev" source: hosted version: "4.5.2" firebase_core_web: dependency: transitive description: name: firebase_core_web - url: "https://pub.dartlang.org" + sha256: "18b35ce111b0a4266abf723c825bcf9d4e2519d13638cc7f06f2a8dd960c75bc" + url: "https://pub.dev" source: hosted version: "2.1.0" firebase_messaging: dependency: "direct main" description: name: firebase_messaging - url: "https://pub.dartlang.org" + sha256: dc010a6436333029fba858415fe65887c3fe44d8f6e6ea162bb8d3dd764fbcb6 + url: "https://pub.dev" source: hosted version: "14.2.1" firebase_messaging_platform_interface: dependency: transitive description: name: firebase_messaging_platform_interface - url: "https://pub.dartlang.org" + sha256: abda2d766486096eb1c568c7b20aef46180596c8b0708190b929133ff03e0a8d + url: "https://pub.dev" source: hosted version: "4.2.10" firebase_messaging_web: dependency: transitive description: name: firebase_messaging_web - url: "https://pub.dartlang.org" + sha256: "7a0ce957bd2210e8636325152234728874dad039f1c7271ba1be5c752fdc5888" + url: "https://pub.dev" source: hosted version: "3.2.11" flare_flutter: dependency: "direct main" description: name: flare_flutter - url: "https://pub.dartlang.org" + sha256: "99d63c60f00fac81249ce6410ee015d7b125c63d8278a30da81edf3317a1f6a0" + url: "https://pub.dev" source: hosted version: "3.0.2" flutter: @@ -262,91 +298,104 @@ packages: dependency: transitive description: name: flutter_blurhash - url: "https://pub.dartlang.org" + sha256: "05001537bd3fac7644fa6558b09ec8c0a3f2eba78c0765f88912882b1331a5c6" + url: "https://pub.dev" source: hosted version: "0.7.0" flutter_cache_manager: dependency: transitive description: name: flutter_cache_manager - url: "https://pub.dartlang.org" + sha256: "32cd900555219333326a2d0653aaaf8671264c29befa65bbd9856d204a4c9fb3" + url: "https://pub.dev" source: hosted version: "3.3.0" flutter_keyboard_visibility: dependency: transitive description: name: flutter_keyboard_visibility - url: "https://pub.dartlang.org" + sha256: "86b71bbaffa38e885f5c21b1182408b9be6951fd125432cf6652c636254cef2d" + url: "https://pub.dev" source: hosted version: "5.4.0" flutter_keyboard_visibility_linux: dependency: transitive description: name: flutter_keyboard_visibility_linux - url: "https://pub.dartlang.org" + sha256: "6fba7cd9bb033b6ddd8c2beb4c99ad02d728f1e6e6d9b9446667398b2ac39f08" + url: "https://pub.dev" source: hosted version: "1.0.0" flutter_keyboard_visibility_macos: dependency: transitive description: name: flutter_keyboard_visibility_macos - url: "https://pub.dartlang.org" + sha256: c5c49b16fff453dfdafdc16f26bdd8fb8d55812a1d50b0ce25fc8d9f2e53d086 + url: "https://pub.dev" source: hosted version: "1.0.0" flutter_keyboard_visibility_platform_interface: dependency: transitive description: name: flutter_keyboard_visibility_platform_interface - url: "https://pub.dartlang.org" + sha256: e43a89845873f7be10cb3884345ceb9aebf00a659f479d1c8f4293fcb37022a4 + url: "https://pub.dev" source: hosted version: "2.0.0" flutter_keyboard_visibility_web: dependency: transitive description: name: flutter_keyboard_visibility_web - url: "https://pub.dartlang.org" + sha256: d3771a2e752880c79203f8d80658401d0c998e4183edca05a149f5098ce6e3d1 + url: "https://pub.dev" source: hosted version: "2.0.0" flutter_keyboard_visibility_windows: dependency: transitive description: name: flutter_keyboard_visibility_windows - url: "https://pub.dartlang.org" + sha256: fc4b0f0b6be9b93ae527f3d527fb56ee2d918cd88bbca438c478af7bcfd0ef73 + url: "https://pub.dev" source: hosted version: "1.0.0" flutter_launcher_icons: dependency: "direct main" description: name: flutter_launcher_icons - url: "https://pub.dartlang.org" + sha256: a9de6706cd844668beac27c0aed5910fa0534832b3c2cad61a5fd977fce82a5d + url: "https://pub.dev" source: hosted version: "0.10.0" flutter_lints: dependency: "direct dev" description: name: flutter_lints - url: "https://pub.dartlang.org" + sha256: aeb0b80a8b3709709c9cc496cdc027c5b3216796bc0af0ce1007eaf24464fd4c + url: "https://pub.dev" source: hosted version: "2.0.1" flutter_local_notifications: dependency: "direct main" description: name: flutter_local_notifications - url: "https://pub.dartlang.org" + sha256: f222919a34545931e47b06000836b5101baeffb0e6eb5a4691d2d42851740dd9 + url: "https://pub.dev" source: hosted version: "12.0.4" flutter_local_notifications_linux: dependency: transitive description: name: flutter_local_notifications_linux - url: "https://pub.dartlang.org" + sha256: "3c6d6db334f609a92be0c0915f40871ec56f5d2adf01e77ae364162c587c0ca8" + url: "https://pub.dev" source: hosted version: "2.0.0" flutter_local_notifications_platform_interface: dependency: transitive description: name: flutter_local_notifications_platform_interface - url: "https://pub.dartlang.org" + sha256: "5ec1feac5f7f7d9266759488bc5f76416152baba9aa1b26fe572246caa00d1ab" + url: "https://pub.dev" source: hosted version: "6.0.0" flutter_localizations: @@ -358,35 +407,40 @@ packages: dependency: transitive description: name: flutter_plugin_android_lifecycle - url: "https://pub.dartlang.org" + sha256: "60fc7b78455b94e6de2333d2f95196d32cf5c22f4b0b0520a628804cb463503b" + url: "https://pub.dev" source: hosted version: "2.0.7" flutter_sound: dependency: "direct main" description: name: flutter_sound - url: "https://pub.dartlang.org" + sha256: "090a4694b11ecc744c2010621c4ffc5fe7c3079d304ea014961a72c7b72cfe6c" + url: "https://pub.dev" source: hosted version: "9.2.13" flutter_sound_platform_interface: dependency: transitive description: name: flutter_sound_platform_interface - url: "https://pub.dartlang.org" + sha256: "4537eaeb58a32748c42b621ad6116f7f4c6ee0a8d6ffaa501b165fe1c9df4753" + url: "https://pub.dev" source: hosted version: "9.2.13" flutter_sound_web: dependency: transitive description: name: flutter_sound_web - url: "https://pub.dartlang.org" + sha256: ad4ca92671a1879e1f613e900bbbdb8170b20d57d1e4e6363018fe56b055594f + url: "https://pub.dev" source: hosted version: "9.2.13" flutter_svg: dependency: transitive description: name: flutter_svg - url: "https://pub.dartlang.org" + sha256: "6ff9fa12892ae074092de2fa6a9938fb21dbabfdaa2ff57dc697ff912fc8d4b2" + url: "https://pub.dev" source: hosted version: "1.1.6" flutter_test: @@ -398,7 +452,8 @@ packages: dependency: "direct main" description: name: flutter_typeahead - url: "https://pub.dartlang.org" + sha256: "0ec56e1deac7556f3616f3cd53c9a25bf225dc8b72e9f44b5a7717e42bb467b5" + url: "https://pub.dev" source: hosted version: "4.1.1" flutter_web_plugins: @@ -410,413 +465,472 @@ packages: dependency: "direct main" description: name: fluttertoast - url: "https://pub.dartlang.org" + sha256: "7cc92eabe01e3f1babe1571c5560b135dfc762a34e41e9056881e2196b178ec1" + url: "https://pub.dev" source: hosted version: "8.1.2" font_awesome_flutter: dependency: "direct main" description: name: font_awesome_flutter - url: "https://pub.dartlang.org" + sha256: "875dbb9ec1ad30d68102019ceb682760d06c72747c1c5b7885781b95f88569cc" + url: "https://pub.dev" source: hosted version: "10.3.0" graphs: dependency: transitive description: name: graphs - url: "https://pub.dartlang.org" + sha256: f9e130f3259f52d26f0cfc0e964513796dafed572fa52e45d2f8d6ca14db39b2 + url: "https://pub.dev" source: hosted version: "2.2.0" http: dependency: "direct main" description: name: http - url: "https://pub.dartlang.org" + sha256: "6aa2946395183537c8b880962d935877325d6a09a2867c3970c05c0fed6ac482" + url: "https://pub.dev" source: hosted version: "0.13.5" http_parser: dependency: transitive description: name: http_parser - url: "https://pub.dartlang.org" + sha256: "2aa08ce0341cc9b354a498388e30986515406668dbcc4f7c950c3e715496693b" + url: "https://pub.dev" source: hosted version: "4.0.2" image: dependency: transitive description: name: image - url: "https://pub.dartlang.org" + sha256: "8e9d133755c3e84c73288363e6343157c383a0c6c56fc51afcc5d4d7180306d6" + url: "https://pub.dev" source: hosted version: "3.3.0" image_picker: dependency: "direct main" description: name: image_picker - url: "https://pub.dartlang.org" + sha256: a8f2f0aed50c03230ab37e93ca2905c50b6c4097245345956eb24a88f45328cd + url: "https://pub.dev" source: hosted version: "0.8.6" image_picker_android: dependency: transitive description: name: image_picker_android - url: "https://pub.dartlang.org" + sha256: b22718074bcecfd0d5008e5fe1ab89db157e125c015b0776ab57ce2160167b82 + url: "https://pub.dev" source: hosted version: "0.8.5+4" image_picker_for_web: dependency: transitive description: name: image_picker_for_web - url: "https://pub.dartlang.org" + sha256: "7d319fb74955ca46d9bf7011497860e3923bb67feebcf068f489311065863899" + url: "https://pub.dev" source: hosted version: "2.1.10" image_picker_ios: dependency: transitive description: name: image_picker_ios - url: "https://pub.dartlang.org" + sha256: "356426b01c5acd493db244dd6122e9864ef712d4f97b1bfa8cf29809efc06d8b" + url: "https://pub.dev" source: hosted version: "0.8.6+5" image_picker_platform_interface: dependency: transitive description: name: image_picker_platform_interface - url: "https://pub.dartlang.org" + sha256: "7cef2f28f4f2fef99180f636c3d446b4ccbafd6ba0fad2adc9a80c4040f656b8" + url: "https://pub.dev" source: hosted version: "2.6.2" intl: dependency: "direct main" description: name: intl - url: "https://pub.dartlang.org" + sha256: "910f85bce16fb5c6f614e117efa303e85a1731bb0081edf3604a2ae6e9a3cc91" + url: "https://pub.dev" source: hosted version: "0.17.0" js: dependency: transitive description: name: js - url: "https://pub.dartlang.org" + sha256: "5528c2f391ededb7775ec1daa69e65a2d61276f7552de2b5f7b8d34ee9fd4ab7" + url: "https://pub.dev" source: hosted - version: "0.6.4" + version: "0.6.5" json_annotation: dependency: transitive description: name: json_annotation - url: "https://pub.dartlang.org" + sha256: "3520fa844009431b5d4491a5a778603520cdc399ab3406332dcc50f93547258c" + url: "https://pub.dev" source: hosted version: "4.7.0" lints: dependency: transitive description: name: lints - url: "https://pub.dartlang.org" + sha256: "5e4a9cd06d447758280a8ac2405101e0e2094d2a1dbdd3756aec3fe7775ba593" + url: "https://pub.dev" source: hosted version: "2.0.1" logger: dependency: transitive description: name: logger - url: "https://pub.dartlang.org" + sha256: "5076f09225f91dc49289a4ccb92df2eeea9ea01cf7c26d49b3a1f04c6a49eec1" + url: "https://pub.dev" source: hosted version: "1.1.0" matcher: dependency: transitive description: name: matcher - url: "https://pub.dartlang.org" + sha256: "16db949ceee371e9b99d22f88fa3a73c4e59fd0afed0bd25fc336eb76c198b72" + url: "https://pub.dev" source: hosted - version: "0.12.12" + version: "0.12.13" material_color_utilities: dependency: transitive description: name: material_color_utilities - url: "https://pub.dartlang.org" + sha256: d92141dc6fe1dad30722f9aa826c7fbc896d021d792f80678280601aff8cf724 + url: "https://pub.dev" source: hosted - version: "0.1.5" + version: "0.2.0" meta: dependency: transitive description: name: meta - url: "https://pub.dartlang.org" + sha256: "6c268b42ed578a53088d834796959e4a1814b5e9e164f147f580a386e5decf42" + url: "https://pub.dev" source: hosted version: "1.8.0" mime: dependency: transitive description: name: mime - url: "https://pub.dartlang.org" + sha256: "52e38f7e1143ef39daf532117d6b8f8f617bf4bcd6044ed8c29040d20d269630" + url: "https://pub.dev" source: hosted version: "1.0.3" nested: dependency: transitive description: name: nested - url: "https://pub.dartlang.org" + sha256: "03bac4c528c64c95c722ec99280375a6f2fc708eec17c7b3f07253b626cd2a20" + url: "https://pub.dev" source: hosted version: "1.0.0" octo_image: dependency: transitive description: name: octo_image - url: "https://pub.dartlang.org" + sha256: "107f3ed1330006a3bea63615e81cf637433f5135a52466c7caa0e7152bca9143" + url: "https://pub.dev" source: hosted version: "1.0.2" package_info: dependency: "direct main" description: name: package_info - url: "https://pub.dartlang.org" + sha256: "6c07d9d82c69e16afeeeeb6866fe43985a20b3b50df243091bfc4a4ad2b03b75" + url: "https://pub.dev" source: hosted version: "2.0.2" path: dependency: transitive description: name: path - url: "https://pub.dartlang.org" + sha256: db9d4f58c908a4ba5953fcee2ae317c94889433e5024c27ce74a37f94267945b + url: "https://pub.dev" source: hosted version: "1.8.2" path_drawing: dependency: transitive description: name: path_drawing - url: "https://pub.dartlang.org" + sha256: bbb1934c0cbb03091af082a6389ca2080345291ef07a5fa6d6e078ba8682f977 + url: "https://pub.dev" source: hosted version: "1.0.1" path_parsing: dependency: transitive description: name: path_parsing - url: "https://pub.dartlang.org" + sha256: e3e67b1629e6f7e8100b367d3db6ba6af4b1f0bb80f64db18ef1fbabd2fa9ccf + url: "https://pub.dev" source: hosted version: "1.0.1" path_provider: dependency: transitive description: name: path_provider - url: "https://pub.dartlang.org" + sha256: "050e8e85e4b7fecdf2bb3682c1c64c4887a183720c802d323de8a5fd76d372dd" + url: "https://pub.dev" source: hosted version: "2.0.11" path_provider_android: dependency: transitive description: name: path_provider_android - url: "https://pub.dartlang.org" + sha256: a776c088d671b27f6e3aa8881d64b87b3e80201c64e8869b811325de7a76c15e + url: "https://pub.dev" source: hosted version: "2.0.22" path_provider_ios: dependency: transitive description: name: path_provider_ios - url: "https://pub.dartlang.org" + sha256: "03d639406f5343478352433f00d3c4394d52dac8df3d847869c5e2333e0bbce8" + url: "https://pub.dev" source: hosted version: "2.0.11" path_provider_linux: dependency: transitive description: name: path_provider_linux - url: "https://pub.dartlang.org" + sha256: ab0987bf95bc591da42dffb38c77398fc43309f0b9b894dcc5d6f40c4b26c379 + url: "https://pub.dev" source: hosted version: "2.1.7" path_provider_macos: dependency: transitive description: name: path_provider_macos - url: "https://pub.dartlang.org" + sha256: "2a97e7fbb7ae9dcd0dfc1220a78e9ec3e71da691912e617e8715ff2a13086ae8" + url: "https://pub.dev" source: hosted version: "2.0.6" path_provider_platform_interface: dependency: transitive description: name: path_provider_platform_interface - url: "https://pub.dartlang.org" + sha256: f0abc8ebd7253741f05488b4813d936b4d07c6bae3e86148a09e342ee4b08e76 + url: "https://pub.dev" source: hosted version: "2.0.5" path_provider_windows: dependency: transitive description: name: path_provider_windows - url: "https://pub.dartlang.org" + sha256: bcabbe399d4042b8ee687e17548d5d3f527255253b4a639f5f8d2094a9c2b45c + url: "https://pub.dev" source: hosted version: "2.1.3" pedantic: dependency: transitive description: name: pedantic - url: "https://pub.dartlang.org" + sha256: "67fc27ed9639506c856c840ccce7594d0bdcd91bc8d53d6e52359449a1d50602" + url: "https://pub.dev" source: hosted version: "1.11.1" permission_handler: dependency: "direct main" description: name: permission_handler - url: "https://pub.dartlang.org" + sha256: "33c6a1253d1f95fd06fa74b65b7ba907ae9811f9d5c1d3150e51417d04b8d6a8" + url: "https://pub.dev" source: hosted version: "10.2.0" permission_handler_android: dependency: transitive description: name: permission_handler_android - url: "https://pub.dartlang.org" + sha256: "8028362b40c4a45298f1cbfccd227c8dd6caf0e27088a69f2ba2ab15464159e2" + url: "https://pub.dev" source: hosted version: "10.2.0" permission_handler_apple: dependency: transitive description: name: permission_handler_apple - url: "https://pub.dartlang.org" + sha256: "9c370ef6a18b1c4b2f7f35944d644a56aa23576f23abee654cf73968de93f163" + url: "https://pub.dev" source: hosted version: "9.0.7" permission_handler_platform_interface: dependency: transitive description: name: permission_handler_platform_interface - url: "https://pub.dartlang.org" + sha256: "68abbc472002b5e6dfce47fe9898c6b7d8328d58b5d2524f75e277c07a97eb84" + url: "https://pub.dev" source: hosted version: "3.9.0" permission_handler_windows: dependency: transitive description: name: permission_handler_windows - url: "https://pub.dartlang.org" + sha256: f67cab14b4328574938ecea2db3475dad7af7ead6afab6338772c5f88963e38b + url: "https://pub.dev" source: hosted version: "0.1.2" petitparser: dependency: transitive description: name: petitparser - url: "https://pub.dartlang.org" + sha256: "49392a45ced973e8d94a85fdb21293fbb40ba805fc49f2965101ae748a3683b4" + url: "https://pub.dev" source: hosted version: "5.1.0" platform: dependency: transitive description: name: platform - url: "https://pub.dartlang.org" + sha256: "4a451831508d7d6ca779f7ac6e212b4023dd5a7d08a27a63da33756410e32b76" + url: "https://pub.dev" source: hosted version: "3.1.0" plugin_platform_interface: dependency: transitive description: name: plugin_platform_interface - url: "https://pub.dartlang.org" + sha256: dbf0f707c78beedc9200146ad3cb0ab4d5da13c246336987be6940f026500d3a + url: "https://pub.dev" source: hosted version: "2.1.3" pointycastle: dependency: transitive description: name: pointycastle - url: "https://pub.dartlang.org" + sha256: db7306cf0249f838d1a24af52b5a5887c5bf7f31d8bb4e827d071dc0939ad346 + url: "https://pub.dev" source: hosted version: "3.6.2" process: dependency: transitive description: name: process - url: "https://pub.dartlang.org" + sha256: "53fd8db9cec1d37b0574e12f07520d582019cb6c44abf5479a01505099a34a09" + url: "https://pub.dev" source: hosted version: "4.2.4" provider: dependency: "direct main" description: name: provider - url: "https://pub.dartlang.org" + sha256: cdbe7530b12ecd9eb455bdaa2fcb8d4dad22e80b8afb4798b41479d5ce26847f + url: "https://pub.dev" source: hosted version: "6.0.5" qr_code_scanner: dependency: "direct main" description: name: qr_code_scanner - url: "https://pub.dartlang.org" + sha256: f23b68d893505a424f0bd2e324ebea71ed88465d572d26bb8d2e78a4749591fd + url: "https://pub.dev" source: hosted version: "1.0.1" recase: dependency: transitive description: name: recase - url: "https://pub.dartlang.org" + sha256: e4eb4ec2dcdee52dcf99cb4ceabaffc631d7424ee55e56f280bc039737f89213 + url: "https://pub.dev" source: hosted version: "4.1.0" rive: dependency: "direct main" description: name: rive - url: "https://pub.dartlang.org" + sha256: "22e3755b75f4ea4492d2fecf4fc2acf1c8d0073df39781d290a20cbfe74c3760" + url: "https://pub.dev" source: hosted version: "0.9.1" rxdart: dependency: transitive description: name: rxdart - url: "https://pub.dartlang.org" + sha256: "0c7c0cedd93788d996e33041ffecda924cc54389199cde4e6a34b440f50044cb" + url: "https://pub.dev" source: hosted version: "0.27.7" share: dependency: "direct main" description: name: share - url: "https://pub.dartlang.org" + sha256: "97e6403f564ed1051a01534c2fc919cb6e40ea55e60a18ec23cee6e0ce19f4be" + url: "https://pub.dev" source: hosted version: "2.0.4" shared_preferences: dependency: "direct main" description: name: shared_preferences - url: "https://pub.dartlang.org" + sha256: "76917b7d4b9526b2ba416808a7eb9fb2863c1a09cf63ec85f1453da240fa818a" + url: "https://pub.dev" source: hosted version: "2.0.15" shared_preferences_android: dependency: transitive description: name: shared_preferences_android - url: "https://pub.dartlang.org" + sha256: "8e251f3c986002b65fed6396bce81f379fb63c27317d49743cf289fd0fd1ab97" + url: "https://pub.dev" source: hosted version: "2.0.14" shared_preferences_ios: dependency: transitive description: name: shared_preferences_ios - url: "https://pub.dartlang.org" + sha256: "585a14cefec7da8c9c2fb8cd283a3bb726b4155c0952afe6a0caaa7b2272de34" + url: "https://pub.dev" source: hosted version: "2.1.1" shared_preferences_linux: dependency: transitive description: name: shared_preferences_linux - url: "https://pub.dartlang.org" + sha256: fbc3cd6826896b66a5f576b025e4f344f780c84ea7f8203097a353370607a2c8 + url: "https://pub.dev" source: hosted version: "2.1.2" shared_preferences_macos: dependency: transitive description: name: shared_preferences_macos - url: "https://pub.dartlang.org" + sha256: "81b6a60b2d27020eb0fc41f4cebc91353047309967901a79ee8203e40c42ed46" + url: "https://pub.dev" source: hosted version: "2.0.5" shared_preferences_platform_interface: dependency: transitive description: name: shared_preferences_platform_interface - url: "https://pub.dartlang.org" + sha256: da9431745ede5ece47bc26d5d73a9d3c6936ef6945c101a5aca46f62e52c1cf3 + url: "https://pub.dev" source: hosted version: "2.1.0" shared_preferences_web: dependency: transitive description: name: shared_preferences_web - url: "https://pub.dartlang.org" + sha256: a4b5bc37fe1b368bbc81f953197d55e12f49d0296e7e412dfe2d2d77d6929958 + url: "https://pub.dev" source: hosted version: "2.0.4" shared_preferences_windows: dependency: transitive description: name: shared_preferences_windows - url: "https://pub.dartlang.org" + sha256: "07c274c2115d4d5e4280622abb09f0980e2c5b1fcdc98ae9f59a3bad5bfc1f26" + url: "https://pub.dev" source: hosted version: "2.1.2" signature: dependency: "direct main" description: name: signature - url: "https://pub.dartlang.org" + sha256: ad23383717dfa926204695ef6928ff513a77387be1b4a8c685099ce3ec35e5f8 + url: "https://pub.dev" source: hosted version: "5.3.0" sky_engine: @@ -828,196 +942,224 @@ packages: dependency: transitive description: name: source_span - url: "https://pub.dartlang.org" + sha256: dd904f795d4b4f3b870833847c461801f6750a9fa8e61ea5ac53f9422b31f250 + url: "https://pub.dev" source: hosted - version: "1.9.0" + version: "1.9.1" speech_to_text: dependency: "direct main" description: name: speech_to_text - url: "https://pub.dartlang.org" + sha256: ff8fbd31d039bdbac6c7ec9f0516d37df2cbea62c45198326d3b64034e6fb920 + url: "https://pub.dev" source: hosted version: "6.1.1" speech_to_text_macos: dependency: transitive description: name: speech_to_text_macos - url: "https://pub.dartlang.org" + sha256: "6b5575e5a8346be1779838b0a482c259474965b5943668830b479147a75b5bfc" + url: "https://pub.dev" source: hosted version: "1.0.2" speech_to_text_platform_interface: dependency: transitive description: name: speech_to_text_platform_interface - url: "https://pub.dartlang.org" + sha256: "13d90215a7554b9a8c1ce47c0a1739af8eacd2cf196ca66351e54dfd2172746d" + url: "https://pub.dev" source: hosted version: "2.0.1" sqflite: dependency: transitive description: name: sqflite - url: "https://pub.dartlang.org" + sha256: "2b1697c7b78576fdc722c358f16f62171bd56e92dc13422d9e44be3fc446c276" + url: "https://pub.dev" source: hosted version: "2.2.2" sqflite_common: dependency: transitive description: name: sqflite_common - url: "https://pub.dartlang.org" + sha256: "0c21a187d645aa65da5be6997c0c713eed61e049158870ae2de157e6897067ab" + url: "https://pub.dev" source: hosted version: "2.4.0+2" stack_trace: dependency: transitive description: name: stack_trace - url: "https://pub.dartlang.org" + sha256: c3c7d8edb15bee7f0f74debd4b9c5f3c2ea86766fe4178eb2a18eb30a0bdaed5 + url: "https://pub.dev" source: hosted - version: "1.10.0" + version: "1.11.0" stream_channel: dependency: transitive description: name: stream_channel - url: "https://pub.dartlang.org" + sha256: "83615bee9045c1d322bbbd1ba209b7a749c2cbcdcb3fdd1df8eb488b3279c1c8" + url: "https://pub.dev" source: hosted - version: "2.1.0" + version: "2.1.1" string_scanner: dependency: transitive description: name: string_scanner - url: "https://pub.dartlang.org" + sha256: "556692adab6cfa87322a115640c11f13cb77b3f076ddcc5d6ae3c20242bedcde" + url: "https://pub.dev" source: hosted - version: "1.1.1" + version: "1.2.0" synchronized: dependency: transitive description: name: synchronized - url: "https://pub.dartlang.org" + sha256: "7b530acd9cb7c71b0019a1e7fa22c4105e675557a4400b6a401c71c5e0ade1ac" + url: "https://pub.dev" source: hosted version: "3.0.0+3" term_glyph: dependency: transitive description: name: term_glyph - url: "https://pub.dartlang.org" + sha256: a29248a84fbb7c79282b40b8c72a1209db169a2e0542bce341da992fe1bc7e84 + url: "https://pub.dev" source: hosted version: "1.2.1" test_api: dependency: transitive description: name: test_api - url: "https://pub.dartlang.org" + sha256: ad540f65f92caa91bf21dfc8ffb8c589d6e4dc0c2267818b4cc2792857706206 + url: "https://pub.dev" source: hosted - version: "0.4.12" + version: "0.4.16" timezone: dependency: transitive description: name: timezone - url: "https://pub.dartlang.org" + sha256: "24c8fcdd49a805d95777a39064862133ff816ebfffe0ceff110fb5960e557964" + url: "https://pub.dev" source: hosted version: "0.9.1" typed_data: dependency: transitive description: name: typed_data - url: "https://pub.dartlang.org" + sha256: "26f87ade979c47a150c9eaab93ccd2bebe70a27dc0b4b29517f2904f04eb11a5" + url: "https://pub.dev" source: hosted version: "1.3.1" url_launcher: dependency: "direct main" description: name: url_launcher - url: "https://pub.dartlang.org" + sha256: "3c92b0efb5e9dcb8f846aefabf9f0f739f91682ed486b991ceda51c288e60896" + url: "https://pub.dev" source: hosted version: "6.1.7" url_launcher_android: dependency: transitive description: name: url_launcher_android - url: "https://pub.dartlang.org" + sha256: "6f91d30ce9060c204b2dbe728adb300750fa4b228e8f7ed1b961aa1ceb728799" + url: "https://pub.dev" source: hosted version: "6.0.22" url_launcher_ios: dependency: transitive description: name: url_launcher_ios - url: "https://pub.dartlang.org" + sha256: "6ba7dddee26c9fae27c9203c424631109d73c8fa26cfa7bc3e35e751cb87f62e" + url: "https://pub.dev" source: hosted version: "6.0.17" url_launcher_linux: dependency: transitive description: name: url_launcher_linux - url: "https://pub.dartlang.org" + sha256: "360fa359ab06bcb4f7c5cd3123a2a9a4d3364d4575d27c4b33468bd4497dd094" + url: "https://pub.dev" source: hosted version: "3.0.1" url_launcher_macos: dependency: transitive description: name: url_launcher_macos - url: "https://pub.dartlang.org" + sha256: a9b3ea9043eabfaadfa3fb89de67a11210d85569086d22b3854484beab8b3978 + url: "https://pub.dev" source: hosted version: "3.0.1" url_launcher_platform_interface: dependency: transitive description: name: url_launcher_platform_interface - url: "https://pub.dartlang.org" + sha256: "4eae912628763eb48fc214522e58e942fd16ce195407dbf45638239523c759a6" + url: "https://pub.dev" source: hosted version: "2.1.1" url_launcher_web: dependency: transitive description: name: url_launcher_web - url: "https://pub.dartlang.org" + sha256: "5669882643b96bb6d5786637cac727c6e918a790053b09245fd4513b8a07df2a" + url: "https://pub.dev" source: hosted version: "2.0.13" url_launcher_windows: dependency: transitive description: name: url_launcher_windows - url: "https://pub.dartlang.org" + sha256: e3c3b16d3104260c10eea3b0e34272aaa57921f83148b0619f74c2eced9b7ef1 + url: "https://pub.dev" source: hosted version: "3.0.1" uuid: dependency: transitive description: name: uuid - url: "https://pub.dartlang.org" + sha256: "648e103079f7c64a36dc7d39369cabb358d377078a051d6ae2ad3aa539519313" + url: "https://pub.dev" source: hosted version: "3.0.7" vector_math: dependency: transitive description: name: vector_math - url: "https://pub.dartlang.org" + sha256: "80b3257d1492ce4d091729e3a67a60407d227c27241d6927be0130c98e741803" + url: "https://pub.dev" source: hosted - version: "2.1.2" + version: "2.1.4" win32: dependency: transitive description: name: win32 - url: "https://pub.dartlang.org" + sha256: c9ebe7ee4ab0c2194e65d3a07d8c54c5d00bb001b76081c4a04cdb8448b59e46 + url: "https://pub.dev" source: hosted version: "3.1.3" xdg_directories: dependency: transitive description: name: xdg_directories - url: "https://pub.dartlang.org" + sha256: "11541eedefbcaec9de35aa82650b695297ce668662bbd6e3911a7fabdbde589f" + url: "https://pub.dev" source: hosted version: "0.2.0+2" xml: dependency: transitive description: name: xml - url: "https://pub.dartlang.org" + sha256: ac0e3f4bf00ba2708c33fbabbbe766300e509f8c82dbd4ab6525039813f7e2fb + url: "https://pub.dev" source: hosted version: "6.1.0" yaml: dependency: transitive description: name: yaml - url: "https://pub.dartlang.org" + sha256: "23812a9b125b48d4007117254bca50abb6c712352927eece9e155207b1db2370" + url: "https://pub.dev" source: hosted version: "3.1.1" sdks: From 75fedf395ee2266bd60d1be037a6733b451a9f60 Mon Sep 17 00:00:00 2001 From: MaximusAshraf <50173497+MaximusAshraf@users.noreply.github.com> Date: Tue, 4 Apr 2023 22:25:25 +0200 Subject: [PATCH 007/181] new server edits --- lib/controllers/api_routes/api_manager.dart | 138 +++++++++ .../http_status_manger.dart | 0 lib/controllers/api_routes/urls.dart | 109 +++++--- .../providers/api/departments_provider.dart | 14 +- .../api/device_transfer_provider.dart | 88 ++++-- .../providers/api/devices_provider.dart | 78 ++++-- .../providers/api/gas_refill_provider.dart | 85 +++--- .../providers/api/hospitals_provider.dart | 39 +-- .../providers/api/notifications_provider.dart | 2 +- .../providers/api/parts_provider.dart | 36 +-- ...reventive_maintenance_visits_provider.dart | 23 +- .../api/regular_visits_provider.dart | 70 ++--- .../api/service_requests_provider.dart | 90 +++--- ...rovider.dart => assigned_to_provider.dart} | 12 +- .../employee/engineers_provider.dart | 74 +++++ .../gas_cylinder_size_provider.dart | 7 +- .../gas_cylinder_type_provider.dart | 74 +++++ .../gas_refill/gas_status_provider.dart | 7 +- .../gas_refill/gas_types_provider.dart | 7 +- .../pentry/pentry_status_provider.dart | 10 +- .../pentry/pentry_task_status_provider.dart | 10 +- .../pentry/pentry_visit_status_provider.dart | 10 +- .../service_report_defect_types_provider.dart | 11 +- .../service_report_last_calls_provider.dart | 19 +- .../service_report_priority_provider.dart | 11 +- .../service_report_reasons_provider.dart | 10 +- .../service_report_status_provider.dart | 11 +- .../report/service_report_types_provider.dart | 11 +- .../report/service_types_provider.dart | 11 +- .../service_request_status_provider.dart | 74 +++++ .../service_request_through_provider.dart | 74 +++++ .../service_request_type_provider.dart | 74 +++++ .../providers/api/user_provider.dart | 27 +- lib/main.dart | 14 +- lib/models/department.dart | 6 +- lib/models/device/device.dart | 14 +- lib/models/device/device_transfer.dart | 58 +++- lib/models/device/device_transfer_info.dart | 23 +- lib/models/engineer.dart | 31 +++ lib/models/gas_refill/gas_refill_details.dart | 19 +- lib/models/gas_refill/gas_refill_model.dart | 19 +- lib/models/hospital.dart | 6 +- lib/models/lookup.dart | 50 +++- lib/models/pantry/calibration_tools.dart | 26 +- lib/models/pantry/lookups/contact_person.dart | 2 +- lib/models/pantry/lookups/contact_title.dart | 2 +- lib/models/pantry/pentry.dart | 105 +++++-- lib/models/pantry/pm_kit.dart | 45 ++- lib/models/pantry/ppm_check_list.dart | 35 ++- lib/models/part.dart | 12 +- lib/models/service_report.dart | 21 +- .../service_request/service_request.dart | 77 +++--- .../service_request_search.dart | 36 ++- lib/models/user.dart | 62 +++-- lib/models/visits/visit.dart | 55 ++-- lib/models/visits/visits_group.dart | 64 +++-- lib/models/visits/visits_search.dart | 44 +-- .../device_transfer_details.dart | 4 +- .../request_device_transfer.dart | 6 +- .../update_device_transfer.dart | 16 +- lib/views/pages/login.dart | 15 +- lib/views/pages/register.dart | 2 +- lib/views/pages/splash_screen.dart | 9 +- .../user/gas_refill/gas_refill_details.dart | 5 +- .../user/gas_refill/request_gas_refill.dart | 67 +++-- lib/views/pages/user/land_page.dart | 15 +- lib/views/pages/user/profile_page.dart | 2 +- .../pages/user/requests/create_request.dart | 30 +- .../report/create_service_report.dart | 2 +- .../requests/report/edit_service_report.dart | 8 +- .../pages/user/requests/request_details.dart | 102 ++++--- .../pages/user/requests/requests_page.dart | 2 +- .../pages/user/visits/pantry/edit_pentry.dart | 20 +- .../preventive_maintenance_visits_page.dart | 4 +- .../user/visits/regular_visits_page.dart | 6 +- .../visits/update_visits_group_sheet.dart | 261 +++++++++--------- .../pages/user/visits/visit_details.dart | 3 +- .../device_transfer_info_section.dart | 4 +- .../device_trancfer/device_transfer_item.dart | 6 +- .../auto_complete_devices_field.dart | 6 +- .../equipment/auto_complete_models_field.dart | 92 ++++++ .../equipment/single_device_picker.dart | 65 +++-- .../gas_refill_create_details_item.dart | 9 +- .../widgets/gas_refill/gas_refill_item.dart | 4 +- .../gas_refill_update_details_item.dart | 8 +- .../hospital_auto_complete_field.dart | 16 +- .../widgets/loaders/loading_manager.dart | 2 +- .../auto_complete_devices_field.dart | 6 +- .../pentry/pentry_calibration_tool_form.dart | 2 +- .../widgets/pentry/pentry_info_form.dart | 33 ++- .../widgets/pentry/pentry_pm_kit_form.dart | 148 +++++----- .../requests/service_request_item.dart | 2 +- .../service_request_update_dialog.dart | 6 +- lib/views/widgets/search/filter_item.dart | 2 +- .../search/service_request_search_bar.dart | 98 ++++--- .../widgets/search/visits_search_bar.dart | 200 ++++++++------ ...ployee_mune.dart => assigned_to_mune.dart} | 8 +- .../status/employee/engineers_mune.dart | 37 +++ .../status/employee/single_type_menu.dart | 99 +++++++ .../status/gas_refill/gas_cylinder_type.dart | 38 +++ .../widgets/status/multi_status_menu.dart | 6 +- .../status/report/service_report_status.dart | 21 +- .../service_request_status_mune.dart | 40 +++ .../service_request_through_mune.dart | 38 +++ .../service_request_types_mune.dart | 39 +++ .../widgets/status/single_status_menu.dart | 17 +- lib/views/widgets/visits/visit_item.dart | 14 +- lib/views/widgets/visits/visit_status.dart | 6 +- pubspec.lock | 2 +- 109 files changed, 2610 insertions(+), 1185 deletions(-) create mode 100644 lib/controllers/api_routes/api_manager.dart rename lib/controllers/{http_status_manger => api_routes}/http_status_manger.dart (100%) rename lib/controllers/providers/api/status_drop_down/employee/{employee_provider.dart => assigned_to_provider.dart} (86%) create mode 100644 lib/controllers/providers/api/status_drop_down/employee/engineers_provider.dart create mode 100644 lib/controllers/providers/api/status_drop_down/gas_refill/gas_cylinder_type_provider.dart create mode 100644 lib/controllers/providers/api/status_drop_down/service_reqest/service_request_status_provider.dart create mode 100644 lib/controllers/providers/api/status_drop_down/service_reqest/service_request_through_provider.dart create mode 100644 lib/controllers/providers/api/status_drop_down/service_reqest/service_request_type_provider.dart create mode 100644 lib/models/engineer.dart create mode 100644 lib/views/widgets/equipment/auto_complete_models_field.dart rename lib/views/widgets/status/employee/{employee_mune.dart => assigned_to_mune.dart} (83%) create mode 100644 lib/views/widgets/status/employee/engineers_mune.dart create mode 100644 lib/views/widgets/status/employee/single_type_menu.dart create mode 100644 lib/views/widgets/status/gas_refill/gas_cylinder_type.dart create mode 100644 lib/views/widgets/status/service_request/service_request_status_mune.dart create mode 100644 lib/views/widgets/status/service_request/service_request_through_mune.dart create mode 100644 lib/views/widgets/status/service_request/service_request_types_mune.dart diff --git a/lib/controllers/api_routes/api_manager.dart b/lib/controllers/api_routes/api_manager.dart new file mode 100644 index 00000000..ae4eae9c --- /dev/null +++ b/lib/controllers/api_routes/api_manager.dart @@ -0,0 +1,138 @@ +import 'dart:convert'; + +import 'package:flutter/cupertino.dart'; +import 'package:fluttertoast/fluttertoast.dart'; +import 'package:http/http.dart' as http; +import 'package:http/http.dart'; + +class ApiManager { + + ApiManager._(); + + final Map _headers = {'Content-Type': 'application/json',}; + + static ApiManager instance = ApiManager._(); + + Future get( + String url, + {Map headers,} + ) async{ + + Uri _url = Uri.parse(url); + print(_url); + http.Response response = await http.get(_url,headers: headers); + if(response.body is! List){ + final message = jsonDecode(response.body)["message"]; + if(message != null && message.toString().isNotEmpty){ + Fluttertoast.showToast(msg: message ?? "",toastLength: Toast.LENGTH_LONG); + } + } + + return response; + } + + Future post( + String url, { + Map headers, + @required Map body, + } + ) async{ + + headers ??= {}; + + headers.addAll(_headers); + + Uri _url = Uri.parse(url); + print(_url); + print(headers); + print(json.encode(body)); + var request = http.Request('POST', _url); + request.body = json.encode(body); + request.headers.addAll(headers); + + http.StreamedResponse _streamedResponse = await request.send(); + http.Response response = await http.Response.fromStream(_streamedResponse); + print(response.statusCode); + print(response.body); + + if(response.body is! List){ + final message = jsonDecode(response.body)["message"]; + if(message != null && message.toString().isNotEmpty){ + Fluttertoast.showToast(msg: message ?? "",toastLength: Toast.LENGTH_LONG); + } + } + + return response; + } + + Future put( + String url, { + Map headers, + @required Map body, + } + ) async{ + + headers ??= {}; + + headers.addAll(_headers); + + Uri _url = Uri.parse(url); + print(_url); + print(headers); + print(json.encode(body)); + var request = http.Request('PUT', _url); + request.body = json.encode(body); + request.headers.addAll(headers); + + http.StreamedResponse streamedResponse = await request.send(); + http.Response response = await http.Response.fromStream(streamedResponse); + print(response.statusCode); + print(response.body); + if(response.body is! List){ + final message = jsonDecode(response.body)["message"]; + if(message != null && message.toString().isNotEmpty){ + Fluttertoast.showToast(msg: message ?? "",toastLength: Toast.LENGTH_LONG); + } + } + return response; + } + + Future multiPart( + String url, { + Map headers, + @required Map body, + @required List> files, + }) async{ + Map _headers = const {'Content-Type': 'multipart/form-data',}; + + headers ??= {}; + + headers.addAll(_headers); + + Uri _url = Uri.parse(url); + print(_url); + print(_headers); + print(json.encode(body)); + var request = http.MultipartRequest('POST', _url); + request.fields.addAll(body); + request.headers.addAll(_headers); + + for (var element in files) { + request.files.add(await element); + } + + //request.files.addAll(_files); + print(request.files); + http.StreamedResponse streamedResponse = await request.send(); + http.Response response = await http.Response.fromStream(streamedResponse); + print(response.statusCode); + print(response.body); + if(response.body is! List){ + final message = jsonDecode(response.body)["message"]; + if(message != null && message.toString().isNotEmpty){ + Fluttertoast.showToast(msg: message ?? "",toastLength: Toast.LENGTH_LONG); + } + } + return response; + } +} \ No newline at end of file diff --git a/lib/controllers/http_status_manger/http_status_manger.dart b/lib/controllers/api_routes/http_status_manger.dart similarity index 100% rename from lib/controllers/http_status_manger/http_status_manger.dart rename to lib/controllers/api_routes/http_status_manger.dart diff --git a/lib/controllers/api_routes/urls.dart b/lib/controllers/api_routes/urls.dart index be346745..70dca275 100644 --- a/lib/controllers/api_routes/urls.dart +++ b/lib/controllers/api_routes/urls.dart @@ -1,68 +1,85 @@ class URLs{ URLs._(); static const host2 = "http://194.163.164.213/atoms/api"; - static const host1 = "http://194.163.164.213/atoms/api"; + static const host1 = "http://109.123.243.118:9000"; + + static String _baseUrl = "$_host/mobile"; + + static String _host = host1; + + set host(String value) => _host = value; + + static String getFileUrl(String file) => file == null || file.isEmpty + ? null : "$_host/attachment/$file"; // API Routes - static const login = "/handle/user/login"; // post - static const register = "/handle/create/user"; // post - static const updateProfile = "/update/user/profile"; // post - static const getHospitals = "/handle/return/all/clients"; // get - static const getDepartments = "/handle/return/all/departments"; // get - static const getEquipment = "/handle/return/all/client/equipments"; // get ?client=208051 - static const getServiceRequests = "/return/user/calls"; // get + static get login => "$_baseUrl/MobileAuth/Login"; // post + static get register => "$_baseUrl/handle/create/user"; // post + static get updateProfile => "$_baseUrl/update/user/profile"; // post + static get getHospitals => "$_baseUrl/Customer/GetCustomers"; // get + static get getDepartments => "$_baseUrl/Customer/GetDepartmentLookup"; // get + static get getEquipment => "$_baseUrl/Asset/GetAssets"; // get ?client=208051 + static get getModels => "$_baseUrl/ModelDefinition/GetModelDefinitionAsset"; // get ?client=2 + // 08051 + static get getServiceRequests => "$_baseUrl/CallRequest/GetCallRequests"; // get + static get getServiceRequestThrough => "$_baseUrl/Lookups/GetLookup?lookupEnum=603"; // get + static get getServiceRequestTypes => "$_baseUrl/Lookups/GetLookup?lookupEnum=604"; // get + static get getServiceRequestStatus => "$_baseUrl/Lookups/GetLookup?lookupEnum=503"; - static const getPreventiveMaintenanceVisits = "/return/user/calibrations"; // get - static const updatePreventiveMaintenanceVisits = "/update/user/calibrations"; // get + static get getPreventiveMaintenanceVisits => "$_baseUrl/return/user/calibrations"; // get + static get updatePreventiveMaintenanceVisits => "$_baseUrl/Visit/UpdateVisits"; // get - static const getRegularVisits = "/return/user/ppm"; // get - static const updateRegularVisits = "/update/user/ppm"; // get + static get getRegularVisits => "$_baseUrl/Visit/GetVisits"; // get + static get updateRegularVisits => "$_baseUrl/Visit/UpdateVisits"; // get - static const getSingleServiceRequest = "/return/call/information"; // get - static const getNotifications = "/return/user/notification"; // get - static const getRecentNotifications = "/return/user/recent/notification"; // get - static const createRequest = "/handle/create/request"; // get - static const createReport = "/handle/create/report/issue"; // get - static const updateRequestDate = "/handle/update/request"; // get + static get getSingleServiceRequest => "$_baseUrl/return/call/information"; // get + static get getNotifications => "$_baseUrl/return/user/notification"; // get + static get getRecentNotifications => "$_baseUrl/return/user/recent/notification"; // get + static get createRequest => "$_baseUrl/CallRequest/AddCallRequest"; // get + static get createReport => "$_baseUrl/handle/create/report/issue"; // get + static get updateRequestDate => "$_baseUrl/handle/update/request"; // get // service report - static const createServiceReport = "/handle/create/service/report"; // get - static const updateServiceReport = "/handle/update/service/report"; // get - static const getServiceReport = "/handle/view/service/report"; // get - static const createDuplicatedReport = "/handle/duplicate/request"; // get + static get createServiceReport => "$_baseUrl/handle/create/service/report"; // get + static get updateServiceReport => "$_baseUrl/handle/update/service/report"; // get + static get getServiceReport => "$_baseUrl/WorkOrder/GetWorkOrderById"; // get + static get createDuplicatedReport => "$_baseUrl/handle/duplicate/request"; // get - static const getServiceReportReasons = "/return/service/report/reasons"; // get - static const getServiceReportTypes = "/return/service/report/type"; // get - static const getServiceReportStatus = "/return/service/report/status"; // get - static const getServiceReportLastCalls = "/return/call/last/situation"; // get - static const getServiceTypes = "/return/service/type"; // get - static const getPartNumber = "/handle/return/all/parts"; // get - static const getServiceReportPriority = "/return/call/priority/list"; // get - static const getServiceReportDefectTypes = "/return/call/defect/type/list"; // get + static get getServiceReportReasons => "$_baseUrl/Lookups/GetLookup?lookupEnum=522"; // get + static get getServiceReportTypes => "$_baseUrl/Lookups/GetLookup?lookupEnum=34"; // get + static get getServiceReportStatus => "$_baseUrl/Lookups/GetLookup?lookupEnum=521"; // get + static get getServiceReportLastCalls => "$_baseUrl/Lookups/GetLookup?lookupEnum=520"; // get + static get getServiceTypes => "$_baseUrl/Lookups/GetLookup?lookupEnum=604"; // get + static get getPartNumber => "$_baseUrl/PartCatalog/GetPartAutoComplete"; // get + static get getServiceReportPriority => "$_baseUrl/Lookups/GetLookup?lookupEnum=602"; // get + static get getServiceReportDefectTypes => "$_baseUrl/Lookups/GetLookup?lookupEnum=601"; // get //gas refill - static const getGasTypes = "/return/gas/refill/types"; // get - static const getGasCylinderSize = "/return/gas/refill/size/cylinder"; // get - static const getGasStatus = "/return/gas/refill/status"; // get - static const requestGasRefill = "/create/gas/refill"; // get - static const updateGasRefill = "/update/gas/refill/"; // get - static const getGasRefill = "/search/gas/refill"; // get + static get getGasTypes => "$_baseUrl/Lookups/GetLookup?lookupEnum=606"; // get + // todo check edits with backend + static get getGasCylinderSize => "$_baseUrl/Lookups/GetLookup?lookupEnum=608"; // get + static get getGasCylinderType => "$_baseUrl/Lookups/GetLookup?lookupEnum=607"; // get + static get getGasStatus => "$_baseUrl/Lookups/GetLookup?lookupEnum=609"; // get + static get requestGasRefill => "$_baseUrl/GazRefill/AddGazRefill"; // get + static get updateGasRefill => "$_baseUrl/GazRefill/UpdateGazRefill"; // get + static get getGasRefill => "$_baseUrl/GazRefill/GetGazRefills"; // get //device transfer - static const requestDeviceTransfer = "/create/transfer/asset"; // get - static const updateDeviceTransfer = "/update/transfer/asset"; // get - static const getDeviceTransfer = "/search/transfer/asset"; // get + static get requestDeviceTransfer => "$_baseUrl/AssetTransfer/AddAssetTransfer"; // get + static get updateDeviceTransfer => "$_baseUrl/AssetTransfer/UpdateAssetTransfer"; // get + static get getDeviceTransfer => "$_baseUrl/AssetTransfer/GetAssetTransfers"; // get // employee - static const getEmployees = "/return/assigned/employee"; // get + static get getEmployees => "$_baseUrl/Lookups/GetLookup?lookupEnum=33"; // get + static get getEngineers => "$_baseUrl/Account/GetUserByRoleValue?value=R-6"; // get // pentry - static const getPentry = "/return/pentry/details"; // get - static const updatePentry = "/update/pentry/details"; // get - static const getPentryTaskStatus = "/return/pentry/task/status"; // get - static const getPentryVisitStatus = "/return/pentry/visit/status/list"; // get - static const getPentryStatus = "/return/pentry/status/list"; // get + static get getPentry => "$_baseUrl/return/pentry/details"; // get + static get updatePentry => "$_baseUrl/Visit/UpdateVisit"; // get + static get getPentryTaskStatus => "$_baseUrl/Lookups/GetLookup?lookupEnum=403"; // get + static get getPentryVisitStatus => "$_baseUrl/Lookups/GetLookup?lookupEnum=402"; // get + static get getPentryStatus => "$_baseUrl/Lookups/GetLookup?lookupEnum=401"; // get // contacts - static const getPentryContacts = "/handle/return/all/contacts"; // get + static get getPentryContacts => "$_baseUrl/handle/return/all/contacts"; // get } \ No newline at end of file diff --git a/lib/controllers/providers/api/departments_provider.dart b/lib/controllers/providers/api/departments_provider.dart index 1b66771d..07b0a57b 100644 --- a/lib/controllers/providers/api/departments_provider.dart +++ b/lib/controllers/providers/api/departments_provider.dart @@ -1,5 +1,6 @@ import 'dart:convert'; +import 'package:test_sa/controllers/api_routes/api_manager.dart'; import 'package:test_sa/controllers/api_routes/urls.dart'; import 'package:test_sa/models/department.dart'; import 'package:flutter/cupertino.dart'; @@ -41,11 +42,12 @@ class DepartmentsProvider extends ChangeNotifier{ notifyListeners(); Response response; try{ - response = await get( - Uri.parse(host + URLs.getDepartments), - headers: { - "Content-Type":"application/json; charset=utf-8" - } + response = await ApiManager.instance.post( + URLs.getDepartments, + body: { + "pageSize":50, + // if(title != null && title.isNotEmpty) "name":title, + } ); } catch(error) { isLoading = false; @@ -56,7 +58,7 @@ class DepartmentsProvider extends ChangeNotifier{ stateCode = response.statusCode; if(response.statusCode >= 200 && response.statusCode < 300) { // client's request was successfully received - List listJson = json.decode(utf8.decode(response.bodyBytes).replaceAll("\\", "")); + List listJson = json.decode(response.body)["data"]; departments = listJson.map((department) => Department.fromJson(department)).toList(); } isLoading = false; diff --git a/lib/controllers/providers/api/device_transfer_provider.dart b/lib/controllers/providers/api/device_transfer_provider.dart index 907ae2ff..ff1b77f3 100644 --- a/lib/controllers/providers/api/device_transfer_provider.dart +++ b/lib/controllers/providers/api/device_transfer_provider.dart @@ -1,7 +1,8 @@ import 'dart:convert'; +import 'package:test_sa/controllers/api_routes/api_manager.dart'; import 'package:test_sa/controllers/api_routes/urls.dart'; -import 'package:test_sa/controllers/http_status_manger/http_status_manger.dart'; +import 'package:test_sa/controllers/api_routes/http_status_manger.dart'; import 'package:test_sa/models/department.dart'; import 'package:test_sa/models/device/device_transfer.dart'; import 'package:test_sa/models/device/device.dart'; @@ -74,19 +75,19 @@ class DeviceTransferProvider extends ChangeNotifier{ // return 200; Response response; try{ - response = await get( - Uri.parse( - "$host${URLs.getDeviceTransfer}?uid=${user.id}" - "&token=${user.token}&page=${(items?.length ?? 0) ~/pageItemNumber}" - ), - headers: { - "Content-Type":"application/json; charset=utf-8" - } + Map body = {}; + body["pageNumber"] = (items?.length ?? 0) ~/pageItemNumber + 1; + body["pageSize"] = pageItemNumber; + + response = await ApiManager.instance.post( + URLs.getDeviceTransfer, + body: body, ); + stateCode = response.statusCode; if(stateCode >= 200 && stateCode < 300) { // client's request was successfully received - List listJson = json.decode(utf8.decode(response.bodyBytes).replaceAll("\\", "")); + List listJson = json.decode(response.body)["data"]; List itemsPage = listJson.map( (request) => DeviceTransfer.fromJson(request)).toList(); items ??= []; @@ -116,23 +117,22 @@ class DeviceTransferProvider extends ChangeNotifier{ @required DeviceTransfer model, }) async { Map body = { - "uid": user.id.toString(), - "token": user.token ?? "", - "serial_id": model.device.id ?? "", - "destination_client": model.receiver.client.id ?? "", - "destination_department": model.receiver.department.id ?? "", + // "uid": user.id.toString(), + // "token": user.token ?? "", + "assetId": model.device.id ?? "", + "destSiteId": model.receiver.client.id ?? "", + "destDepartmentId": model.receiver.department.id ?? "", + "senderSiteId": model.receiver.client.id ?? "", }; Response response; try{ - response = await post( - Uri.parse( - host+URLs.requestDeviceTransfer), - body: body, + response = await ApiManager.instance.post( + URLs.requestDeviceTransfer, + body: body ); - stateCode = response.statusCode; if(response.statusCode >= 200 && response.statusCode < 300) { if(items != null) { items.insert( @@ -156,24 +156,58 @@ class DeviceTransferProvider extends ChangeNotifier{ @required String host, @required User user, @required bool isSender, - @required String requestId, + @required int requestId, @required DeviceTransfer oldModel, @required DeviceTransferInfo newModel, }) async { Map body = { - "uid": user.id.toString(), - "token": user.token ?? "", - "current_user": user.id ?? "", + "id": oldModel.id, + "assetId": oldModel.device.id ?? "", + "senderSiteId": oldModel.sender.client.id, + "destSiteId": oldModel.receiver.client.id, + "destDepartmentId": oldModel.receiver.department.id, }; + + if(isSender){ + body.addAll( + { + //"senderSiteId": newModel.client.id, + //"senderDepartmentId": newModel.department.id, + "senderAssignedEmployeeId": newModel.userId, + "senderMachineStatusId": newModel.status.id, + "senderComment": newModel.comment, + "senderWorkingHours": newModel.workingHours, + "senderTravelingHours": newModel.travelingHours, + "senderAttachmentName": "${DateTime.now().toIso8601String()}.png|${newModel.signature}", + } + ); + }else{ + body.addAll( + { + //"destSiteId": newModel.client.id, + //"destDepartmentId": newModel.department.id, + "receiverAssignedEmployeeId": newModel.userId, + "receiverMachineStatusId": newModel.status.id, + "receiverComment": newModel.comment, + "receiverWorkingHours": newModel.workingHours, + "receiverTravelingHours": newModel.travelingHours, + "receiverAttachmentName": "${DateTime.now().toIso8601String()}.png|${newModel.signature}", + } + ); + } body.addAll(newModel.toJson(isSender)); Response response; try{ - response = await post( - Uri.parse("$host${URLs.updateDeviceTransfer}/$requestId"), - body: body, + response = await ApiManager.instance.put( + URLs.updateDeviceTransfer, + body: body ); + // response = await post( + // Uri.parse("$host${URLs.updateDeviceTransfer}/$requestId"), + // body: body, + // ); stateCode = response.statusCode; if(response.statusCode >= 200 && response.statusCode < 300) { diff --git a/lib/controllers/providers/api/devices_provider.dart b/lib/controllers/providers/api/devices_provider.dart index d434551f..e957cb17 100644 --- a/lib/controllers/providers/api/devices_provider.dart +++ b/lib/controllers/providers/api/devices_provider.dart @@ -1,7 +1,9 @@ import 'dart:convert'; +import 'package:test_sa/controllers/api_routes/api_manager.dart'; import 'package:test_sa/controllers/api_routes/urls.dart'; import 'package:test_sa/models/device/device.dart'; +import 'package:test_sa/models/lookup.dart'; import 'package:test_sa/models/user.dart'; import 'package:flutter/cupertino.dart'; import 'package:http/http.dart'; @@ -41,7 +43,9 @@ class DevicesProvider extends ChangeNotifier{ Future getEquipment ({ @required String host, @required User user, - @required String hospitalId + @required int hospitalId, + String serialNumber, + String number, }) async { if(_loading == true) return -2; @@ -49,11 +53,14 @@ class DevicesProvider extends ChangeNotifier{ notifyListeners(); Response response; try{ - response = await get( - Uri.parse(host + URLs.getEquipment+"?client=$hospitalId"), - headers: { - "Content-Type":"application/json; charset=utf-8" - } + response = await ApiManager.instance.post( + URLs.getEquipment, + body: { + "pageSize":50, + "siteId":hospitalId, + if(serialNumber?.isEmpty == false) "assetSerialNumber":serialNumber, + if(number?.isEmpty == false) "assetNo":number, + } ); } catch(error) { _loading = false; @@ -64,7 +71,7 @@ class DevicesProvider extends ChangeNotifier{ _stateCode = response.statusCode; if(response.statusCode >= 200 && response.statusCode < 300) { // client's request was successfully received - List equipmentListJson = json.decode(utf8.decode(response.bodyBytes)); + List equipmentListJson = json.decode(response.body)["data"]; _devices = equipmentListJson.map((device) => Device.fromJson(device)).toList(); } _loading = false; @@ -80,31 +87,70 @@ class DevicesProvider extends ChangeNotifier{ Future> getDevicesList ({ @required String host, @required User user, - @required String hospitalId, + @required int hospitalId, String serialNumber, String number, }) async { Response response; try{ - response = await get( - Uri.parse("$host${URLs.getEquipment}?client=$hospitalId" - "${serialNumber?.isEmpty == false ? "&name=$serialNumber" :""}" - "${number?.isEmpty == false ? "&number=$number" : ""}" - ), + response = await ApiManager.instance.post( + URLs.getEquipment, + body: { + "pageSize":50, + "siteId":hospitalId, + if(serialNumber?.isEmpty == false) "assetSerialNumber":serialNumber, + if(number?.isEmpty == false) "assetNo":number, + } ); + // response = await get( + // Uri.parse("$host${URLs.getEquipment}?siteId=$hospitalId" + // "${serialNumber?.isEmpty == false ? "&assetSerialNumber=$serialNumber" :""}" + // "${number?.isEmpty == false ? "&assetNo=$number" : ""}" + // ), + // ); List page = []; if(response.statusCode >= 200 && response.statusCode < 300) { // client's request was successfully received - List categoriesListJson = json.decode(utf8.decode(response.bodyBytes)); - page = categoriesListJson.map((device) => Device.fromJson(device)).toList(); + List equipmentListJson = json.decode(response.body)["data"]; + page = equipmentListJson.map((device) => Device.fromJson(device)).toList(); + } + return page; + } catch(error) { + print(error); + return []; + } + + } + + Future> getModels({ + String code, + }) async { + Response response; + try{ + response = await ApiManager.instance.get( + URLs.getModels+"?code=$code", + ); + List page = []; + if(response.statusCode >= 200 && response.statusCode < 300) { + // client's request was successfully received + List categoriesListJson = json.decode(response.body)["data"]; + page = categoriesListJson.map((json) => + Lookup( + name: json["modelDefCode"], + id: json["id"], + value: json["id"], + ) + ).toList(); } return page; } catch(error) { + print(error); return []; } } + /// return -2 if request in progress /// return -1 if error happen when sending request /// return state code if request complete may be 200, 404 or 403 @@ -113,7 +159,7 @@ class DevicesProvider extends ChangeNotifier{ Future> getDevicesListBySN ({ @required String host, @required User user, - @required String hospitalId, + @required int hospitalId, @required String sn }) async { Response response; diff --git a/lib/controllers/providers/api/gas_refill_provider.dart b/lib/controllers/providers/api/gas_refill_provider.dart index 5297ae06..da3b6077 100644 --- a/lib/controllers/providers/api/gas_refill_provider.dart +++ b/lib/controllers/providers/api/gas_refill_provider.dart @@ -1,7 +1,8 @@ import 'dart:convert'; +import 'package:test_sa/controllers/api_routes/api_manager.dart'; import 'package:test_sa/controllers/api_routes/urls.dart'; -import 'package:test_sa/controllers/http_status_manger/http_status_manger.dart'; +import 'package:test_sa/controllers/api_routes/http_status_manger.dart'; import 'package:test_sa/models/gas_refill/gas_refill_model.dart'; import 'package:test_sa/models/issue.dart'; import 'package:test_sa/models/service_report.dart'; @@ -53,20 +54,19 @@ class GasRefillProvider extends ChangeNotifier{ return -2; isLoading = true; Response response; - try{ - response = await get( - Uri.parse( - "$host${URLs.getGasRefill}?uid=${user.id}" - "&token=${user.token}&page=${(items?.length ?? 0) ~/pageItemNumber}" - ), - headers: { - "Content-Type":"application/json; charset=utf-8" - } + + Map body = {}; + body["pageNumber"] = (items?.length ?? 0) ~/pageItemNumber + 1; + body["pageSize"] = pageItemNumber; + + response = await ApiManager.instance.post( + URLs.getGasRefill, + body: body, ); stateCode = response.statusCode; if(stateCode >= 200 && stateCode < 300) { // client's request was successfully received - List requestsListJson = json.decode(utf8.decode(response.bodyBytes)); + List requestsListJson = json.decode(response.body)["data"]; List itemsPage = requestsListJson.map( (request) => GasRefillModel.fromJson(request)).toList(); items ??= []; @@ -77,11 +77,13 @@ class GasRefillProvider extends ChangeNotifier{ nextPage = false; } } + try{ isLoading = false; notifyListeners(); return response.statusCode; } catch(error) { + print(error); isLoading = false; stateCode = -1; notifyListeners(); @@ -98,39 +100,34 @@ class GasRefillProvider extends ChangeNotifier{ Map body = { "uid": user.id.toString(), "token": user.token ?? "", - "title": model.title ?? "", - "status": "0",//model.status.value.toString(), + "GazRefillNo": "GR-${DateTime.now().toString().split(" ").first}", + "status": model.status.toMap(), }; - body["details"] = jsonEncode(model.details.map((model) => { - "type": model.type.id?.toString(), - "size": model.cylinderSize?.id.toString(), - "requsted_qty": model.requestedQuantity.toString(), - }).toList()); + body["gazRefillDetails"] = model.details.map((model) => { + "gasType": model.type.toMap(), + "cylinderSize": model.cylinderSize.toMap(), + "cylinderType": model.cylinderType.toMap(), + "requestedQty": model.requestedQuantity, + }).toList(); Response response; try{ - response = await post( - Uri.parse( - host+URLs.requestGasRefill), - body: body, + response = await ApiManager.instance.post( + URLs.requestGasRefill, + body: body ); - stateCode = response.statusCode; if(response.statusCode >= 200 && response.statusCode < 300) { if(items != null) { - items.insert( - 0, - GasRefillModel.fromJson( - json.decode(utf8.decode(response.bodyBytes))[0] - ) - ); + reset(); notifyListeners(); } } return response.statusCode; } catch(error) { + print(error); return -1; } @@ -143,25 +140,29 @@ class GasRefillProvider extends ChangeNotifier{ @required GasRefillModel newModel, }) async { Map body = { - "uid": user.id.toString(), - "token": user.token ?? "", - "title": newModel.title ?? "", - "status": newModel.status.id.toString(), + "id":newModel.id, + "gazRefillNo": newModel.title ?? "", + "status": newModel.status.toMap(), }; - body["details"] = jsonEncode(newModel.details.map((model) => { - "type": model.type.id.toString(), - "size": model.cylinderSize.id.toString(), - "requsted_qty": model.requestedQuantity.toString(), - "deliverd_qty": model.deliveredQuantity.toString(), - }).toList()); + body["gazRefillDetails"] = newModel.details.map((model) => { + "gasType": model.type.toMap(), + "cylinderSize": model.cylinderSize.toMap(), + "cylinderType": model.cylinderType.toMap(), + "requestedQty": model.requestedQuantity, + "deliverdQty": model.deliveredQuantity, + }).toList(); Response response; try{ - response = await post( - Uri.parse("$host${URLs.updateGasRefill}/${newModel.id}"), - body: body, + response = await ApiManager.instance.put( + URLs.updateGasRefill, + body: body ); + // response = await post( + // Uri.parse("$host${URLs.updateGasRefill}/${newModel.id}"), + // body: body, + // ); stateCode = response.statusCode; if(response.statusCode >= 200 && response.statusCode < 300) { diff --git a/lib/controllers/providers/api/hospitals_provider.dart b/lib/controllers/providers/api/hospitals_provider.dart index 5e3c4509..7b19a6e1 100644 --- a/lib/controllers/providers/api/hospitals_provider.dart +++ b/lib/controllers/providers/api/hospitals_provider.dart @@ -1,5 +1,6 @@ import 'dart:convert'; +import 'package:test_sa/controllers/api_routes/api_manager.dart'; import 'package:test_sa/controllers/api_routes/urls.dart'; import 'package:test_sa/models/hospital.dart'; import 'package:test_sa/models/user.dart'; @@ -55,20 +56,18 @@ class HospitalsProvider extends ChangeNotifier{ notifyListeners(); Response response; try{ - response = await get( - Uri.parse( - host + URLs.getHospitals - + "?page=${(_hospitals?.length ?? 0) ~/pageItemNumber}" - + ( title == null || title.isEmpty ? "" : "&name=$title" ) - ), - headers: { - "Content-Type":"application/json; charset=utf-8" - } + response = await ApiManager.instance.post( + URLs.getHospitals, + body: { + "pageNumber":(hospitals?.length ?? 0) ~/pageItemNumber + 1, + "pageSize":50, + if(title != null && title.isNotEmpty) "name":title, + } ); _stateCode = response.statusCode; if(response.statusCode >= 200 && response.statusCode < 300) { // client's request was successfully received - List categoriesListJson = json.decode(utf8.decode(response.bodyBytes)); + List categoriesListJson = json.decode(response.body)["data"]; List _page = categoriesListJson.map((category) => Hospital.fromJson(category)).toList(); if(hospitals == null) _hospitals = []; @@ -95,20 +94,26 @@ class HospitalsProvider extends ChangeNotifier{ Future> getHospitalsList ({String host,User user,String title}) async { Response response; try{ - - response = await get( - Uri.parse(host + URLs.getHospitals - + ( title == null || title.isEmpty ? "" : "?name=$title" )), - headers: { - "Content-Type":"application/json; charset=utf-8" + response = await ApiManager.instance.post( + URLs.getHospitals, + body: { + "pageSize":50, + if(title != null && title.isNotEmpty) "name":title, } ); + // response = await get( + // Uri.parse(host + URLs.getHospitals + // + ( title == null || title.isEmpty ? "" : "?name=$title" )), + // headers: { + // "Content-Type":"application/json; charset=utf-8" + // } + // ); _stateCode = response.statusCode; List _page = []; if(response.statusCode >= 200 && response.statusCode < 300) { // client's request was successfully received - List categoriesListJson = json.decode(utf8.decode(response.bodyBytes)); + List categoriesListJson = json.decode(response.body)["data"]; _page = categoriesListJson.map((category) => Hospital.fromJson(category)).toList(); } return _page; diff --git a/lib/controllers/providers/api/notifications_provider.dart b/lib/controllers/providers/api/notifications_provider.dart index 0bea5f26..36abef10 100644 --- a/lib/controllers/providers/api/notifications_provider.dart +++ b/lib/controllers/providers/api/notifications_provider.dart @@ -43,7 +43,7 @@ class NotificationsProvider extends ChangeNotifier{ Future getNotifications ({ @required String host, @required User user, - @required String hospitalId, + @required int hospitalId, }) async { if(isLoading == true) return -2; diff --git a/lib/controllers/providers/api/parts_provider.dart b/lib/controllers/providers/api/parts_provider.dart index 6f763f77..864adaeb 100644 --- a/lib/controllers/providers/api/parts_provider.dart +++ b/lib/controllers/providers/api/parts_provider.dart @@ -1,5 +1,6 @@ import 'dart:convert'; +import 'package:test_sa/controllers/api_routes/api_manager.dart'; import 'package:test_sa/controllers/api_routes/urls.dart'; import 'package:test_sa/models/part.dart'; import 'package:test_sa/models/user.dart'; @@ -55,16 +56,12 @@ class PartsProvider extends ChangeNotifier{ notifyListeners(); Response response; try{ - response = await get( - Uri.parse( - host + URLs.getPartNumber - + "?page=${(_parts?.length ?? 0) ~/pageItemNumber}" - + ( title == null || title.isEmpty ? "" : "&name=$title" ) - ), - headers: { - "Content-Type":"application/json; charset=utf-8" - } - ); + response = await ApiManager.instance.post( + URLs.getPartNumber, + body: { + if(title != null && title.isNotEmpty) + "partName":title + }); _stateCode = response.statusCode; if(response.statusCode >= 200 && response.statusCode < 300) { // client's request was successfully received @@ -100,24 +97,21 @@ class PartsProvider extends ChangeNotifier{ Future> getPartsList ({String host,User user,String title}) async { Response response; try{ - - response = await get( - Uri.parse( - host + URLs.getPartNumber - + ( title == null || title.isEmpty ? "" : "?name=$title" ) - ), - headers: { - "Content-Type":"application/json; charset=utf-8" - } - ); + response = await ApiManager.instance.post( + URLs.getPartNumber, + body: { + if(title != null && title.isNotEmpty) + "partName":title + }); List _page = []; if(response.statusCode >= 200 && response.statusCode < 300) { // client's request was successfully received - List categoriesListJson = json.decode(utf8.decode(response.bodyBytes)); + List categoriesListJson = json.decode(response.body)["data"]; _page = categoriesListJson.map((part) => Part.fromJson(part)).toList(); } return _page; } catch(error) { + print(error); return []; } diff --git a/lib/controllers/providers/api/preventive_maintenance_visits_provider.dart b/lib/controllers/providers/api/preventive_maintenance_visits_provider.dart index 14103fd6..9d209fec 100644 --- a/lib/controllers/providers/api/preventive_maintenance_visits_provider.dart +++ b/lib/controllers/providers/api/preventive_maintenance_visits_provider.dart @@ -1,5 +1,6 @@ import 'dart:convert'; +import 'package:test_sa/controllers/api_routes/api_manager.dart'; import 'package:test_sa/controllers/api_routes/urls.dart'; import 'package:test_sa/models/user.dart'; import 'package:test_sa/models/visits/visit.dart'; @@ -60,7 +61,7 @@ class PreventiveMaintenanceVisitsProvider extends ChangeNotifier{ +"?uid=${user.id}" "&token=${user.token}" "&page=${(visits?.length ?? 0) ~/pageItemNumber}" - +visitsSearch?.toSearchString() ?? "" + // +visitsSearch?.toMap() ?? "" ), headers: { "Content-Type":"application/json; charset=utf-8" @@ -104,24 +105,20 @@ class PreventiveMaintenanceVisitsProvider extends ChangeNotifier{ }) async { Response response; Map body = group.toJson(); - body["token"] = user.token ?? ""; - body["uid"] = user.id; + // body["token"] = user.token ?? ""; + // body["uid"] = user.id; //userId = 397.toString(); // testing id to view data try{ - response = await post( - Uri.parse( - host+URLs.updatePreventiveMaintenanceVisits - ), - body: body, - ); + response = await ApiManager.instance.put( + URLs.updatePreventiveMaintenanceVisits, body: body); stateCode = response.statusCode; if(response.statusCode >= 200 && response.statusCode < 300) { // client's request was successfully received - group.visits.forEach((visit) { - visit.status = group.status; - visit.actualDate = group.date.toString().split(" ").first; - }); + // group.visits.forEach((visit) { + // visit.status = group.status; + // visit.actualDate = group.date.toString().split(" ").first; + // }); group.visits.clear(); notifyListeners(); } diff --git a/lib/controllers/providers/api/regular_visits_provider.dart b/lib/controllers/providers/api/regular_visits_provider.dart index 03737f73..d9baaec1 100644 --- a/lib/controllers/providers/api/regular_visits_provider.dart +++ b/lib/controllers/providers/api/regular_visits_provider.dart @@ -1,5 +1,6 @@ import 'dart:convert'; +import 'package:test_sa/controllers/api_routes/api_manager.dart'; import 'package:test_sa/controllers/api_routes/urls.dart'; import 'package:test_sa/models/pantry/pentry.dart'; import 'package:test_sa/models/user.dart'; @@ -8,11 +9,12 @@ import 'package:test_sa/models/visits/visits_group.dart'; import 'package:test_sa/models/visits/visits_search.dart'; import 'package:flutter/cupertino.dart'; import 'package:http/http.dart'; +import 'package:logger/logger.dart'; class RegularVisitsProvider extends ChangeNotifier{ // number of items call in each request - final pageItemNumber = 50; + final pageItemNumber = 20; //reset provider data void reset(){ @@ -52,20 +54,19 @@ class RegularVisitsProvider extends ChangeNotifier{ if(isLoading == true) return -2; isLoading = true; + if(visits == null) notifyListeners(); Response response; //userId = 397.toString(); // testing id to view data + try{ - response = await get( - Uri.parse( - host+URLs.getRegularVisits - +"?uid=${user.id}" - "&token=${user.token}" - "&page=${(visits?.length ?? 0) ~/pageItemNumber}" - +visitsSearch?.toSearchString() ?? "" - ), - headers: { - "Content-Type":"application/json; charset=utf-8" - } + Map body = {}; + body.addAll(visitsSearch.toMap()); + body["pageNumber"] = (visits?.length ?? 0) ~/pageItemNumber +1; + body["pageSize"] = pageItemNumber; + + response = await ApiManager.instance.post( + URLs.getRegularVisits, + body: body, ); } catch(error) { isLoading = false; @@ -77,12 +78,11 @@ class RegularVisitsProvider extends ChangeNotifier{ if(response.statusCode >= 200 && response.statusCode < 300) { // client's request was successfully received try{ - List requestsListJson = json.decode(utf8.decode(response.bodyBytes).replaceAll("\\", "")); + List requestsListJson = json.decode(response.body)["data"]; List _visits = requestsListJson.map( (request) => Visit.fromJson(request) ).toList(); - if(visits == null) - visits = []; + visits ??= []; visits.addAll(_visits); if(_visits.length == pageItemNumber){ nextPage = true; @@ -90,12 +90,12 @@ class RegularVisitsProvider extends ChangeNotifier{ nextPage = false; } }catch(error){ + Logger().e(error); isLoading = false; stateCode = -1; notifyListeners(); return -1; } - } isLoading = false; notifyListeners(); @@ -113,14 +113,13 @@ class RegularVisitsProvider extends ChangeNotifier{ VisitsGroup group, }) async { Response response; - Map body = group.toJson(); - body["token"] = user.token ?? ""; - body["uid"] = user.id; - //userId = 397.toString(); // testing id to view data + try{ - response = await post( - Uri.parse(host+URLs.updateRegularVisits), - body: body, + Map body = group.toJson(); + + response = await ApiManager.instance.post( + URLs.getRegularVisits, + body: body, ); stateCode = response.statusCode; if(response.statusCode >= 200 && response.statusCode < 300) { @@ -138,7 +137,7 @@ class RegularVisitsProvider extends ChangeNotifier{ } } - Future getPently({String host,User user,String id}) async { + Future getPently({String host,User user,int id}) async { Response response; response = await get( Uri.parse("$host${URLs.getPentry}/$id"), @@ -162,20 +161,29 @@ class RegularVisitsProvider extends ChangeNotifier{ }) async { try{ Response response; - Map body = pentry.toMap(); - body["uid"] = user.id; - body["token"] = user.token; - response = await post( - Uri.parse(host+URLs.updatePentry + "/${visit.id}"), - body: body, + Map body = pentry.toMap(visit.id); + body["id"] = visit.id; + body["assetId"] = visit.deviceId; + // body["token"] = user.token; + // body["vChecklists"]?.addAll({}); + // body["vCalibrationTools"]?.addAll({"visitId": visit.id,}); + // body["vKits"]?.add({"visitId": visit.id,}); + response = await ApiManager.instance.put( + URLs.updatePentry, body: body ); + + // response = await post( + // Uri.parse(host+URLs.updatePentry + "/${visit.id}"), + // body: body, + // ); if(response.statusCode >= 200 && response.statusCode < 300) { - visit.status = pentry.ppmVisitStatus; + reset();//visit.status = pentry.ppmVisitStatus; notifyListeners(); } return response.statusCode; } catch(error) { + print(error); return -1; } diff --git a/lib/controllers/providers/api/service_requests_provider.dart b/lib/controllers/providers/api/service_requests_provider.dart index cb62d06b..67f7f5ab 100644 --- a/lib/controllers/providers/api/service_requests_provider.dart +++ b/lib/controllers/providers/api/service_requests_provider.dart @@ -1,7 +1,8 @@ import 'dart:convert'; +import 'package:test_sa/controllers/api_routes/api_manager.dart'; import 'package:test_sa/controllers/api_routes/urls.dart'; -import 'package:test_sa/controllers/http_status_manger/http_status_manger.dart'; +import 'package:test_sa/controllers/api_routes/http_status_manger.dart'; import 'package:test_sa/models/issue.dart'; import 'package:test_sa/models/lookup.dart'; import 'package:test_sa/models/service_report.dart'; @@ -51,36 +52,33 @@ class ServiceRequestsProvider extends ChangeNotifier{ Future getRequests ({ @required String host, @required User user, - @required String hospitalId, + @required int hospitalId, }) async { if(isLoading == true) return -2; isLoading = true; + if(serviceRequests == null) notifyListeners(); Response response; try{ - response = await get( - Uri.parse( - host+URLs.getServiceRequests - +"?uid=${user.id}" - +(hospitalId == null? "" :"&client_nid=$hospitalId") - +"&token=${user.token}" - "&page=${(serviceRequests?.length ?? 0) ~/pageItemNumber}" - +search?.toSearchString() ?? "" - ), - headers: { - "Content-Type":"application/json; charset=utf-8" - } + Map body = {}; + body.addAll(search.toMap()); + body["pageNumber"] = (serviceRequests?.length ?? 0) ~/pageItemNumber + 1; + body["pageSize"] = pageItemNumber; + + response = await ApiManager.instance.post( + URLs.getServiceRequests, + body: body, ); + stateCode = response.statusCode; if(response.statusCode >= 200 && response.statusCode < 300) { // client's request was successfully received - List requestsListJson = json.decode(utf8.decode(response.bodyBytes).replaceAll("\\", "")); - List _serviceRequestsPage = requestsListJson.map( + List requestsListJson = json.decode(response.body)["data"]; + List serviceRequestsPage = requestsListJson.map( (request) => ServiceRequest.fromJson(request)).toList(); - if(serviceRequests == null) - serviceRequests = []; - serviceRequests.addAll(_serviceRequestsPage); - if(_serviceRequestsPage.length == pageItemNumber){ + serviceRequests ??= []; + serviceRequests.addAll(serviceRequestsPage); + if(serviceRequestsPage.length == pageItemNumber){ nextPage = true; }else{ nextPage = false; @@ -91,6 +89,7 @@ class ServiceRequestsProvider extends ChangeNotifier{ return response.statusCode; } catch(error) { + print(error); isLoading = false; stateCode = -1; notifyListeners(); @@ -144,26 +143,31 @@ class ServiceRequestsProvider extends ChangeNotifier{ }) async { var body = { - "uid": user.id, - "token": user.token ?? "", - "sn_id": serviceRequest.deviceId ?? "", - "date": (DateTime.now().millisecondsSinceEpoch).toString(), - "client": user.hospital.id ?? '', - "complaint": serviceRequest.maintenanceIssue, - "image": json.encode(serviceRequest.devicePhotos), - "priority": (serviceRequest.priority?.id).toString(), - "defect_types": (serviceRequest.defectType?.id).toString(), + "callCreatedBy": { + "id":user.id, + "name":user.userName + }, + "assets":serviceRequest.deviceId == null ? [] : [serviceRequest.deviceId], + "requestedDate": DateTime.now().toIso8601String(), + "requestedTime": DateTime.now().toIso8601String(), + "client": user.hospital?.id ?? '', + "callComments": serviceRequest.maintenanceIssue, + "attachmentsCallRequest": serviceRequest.devicePhotos.map((e) => {"name":e}).toList(), + "priority": serviceRequest.priority.toMap(), + "defectType": serviceRequest.defectType.toMap(), + "typeofRequest":serviceRequest.type.toMap(), + "requestedThrough":serviceRequest.type.toMap(), }; if(serviceRequest.audio != null){ - body["audio"] = serviceRequest.audio; + body["voiceNote"] = serviceRequest.audio; } Response response; try{ - response = await post( - Uri.parse( - host+URLs.createRequest), - body: body, + response = await ApiManager.instance.post( + URLs.createRequest, + body: body ); + stateCode = response.statusCode; if(response.statusCode >= 200 && response.statusCode < 300) { if(serviceRequests != null) @@ -178,6 +182,7 @@ class ServiceRequestsProvider extends ChangeNotifier{ return response.statusCode; } catch(error) { + print(error); return -1; } @@ -232,7 +237,7 @@ class ServiceRequestsProvider extends ChangeNotifier{ ); stateCode = response.statusCode; if(response.statusCode >= 200 && response.statusCode < 300) { - request.engineerName = employee.label; + request.engineerName = employee.name; notifyListeners(); } return response.statusCode; @@ -385,21 +390,12 @@ class ServiceRequestsProvider extends ChangeNotifier{ @required User user, @required Subtitle 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.getServiceReport - +'?report_id=$reportId' - '$userData',) - ); + response = await ApiManager.instance.get( + URLs.getServiceReport + "?workOrderId=$reportId", + ); }catch(error){ throw(HttpStatusManger.getStatusMessage( diff --git a/lib/controllers/providers/api/status_drop_down/employee/employee_provider.dart b/lib/controllers/providers/api/status_drop_down/employee/assigned_to_provider.dart similarity index 86% rename from lib/controllers/providers/api/status_drop_down/employee/employee_provider.dart rename to lib/controllers/providers/api/status_drop_down/employee/assigned_to_provider.dart index e21f7180..757b13f9 100644 --- a/lib/controllers/providers/api/status_drop_down/employee/employee_provider.dart +++ b/lib/controllers/providers/api/status_drop_down/employee/assigned_to_provider.dart @@ -1,5 +1,6 @@ import 'dart:convert'; +import 'package:test_sa/controllers/api_routes/api_manager.dart'; import 'package:test_sa/controllers/api_routes/urls.dart'; import 'package:test_sa/models/lookup.dart'; import 'package:test_sa/models/user.dart'; @@ -7,7 +8,7 @@ import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; import 'package:http/http.dart'; -class EmployeesProvider extends ChangeNotifier{ +class AssignedToProvider extends ChangeNotifier{ //reset provider data void reset(){ @@ -48,21 +49,20 @@ class EmployeesProvider extends ChangeNotifier{ notifyListeners(); Response response; try{ - response = await get( - Uri.parse( - host + URLs.getEmployees), + response = await ApiManager.instance.get( + URLs.getEmployees, ); _stateCode = response.statusCode; if(response.statusCode >= 200 && response.statusCode < 300) { // client's request was successfully received - List categoriesListJson = json.decode(utf8.decode(response.bodyBytes)); + List categoriesListJson = json.decode(response.body)["data"]; _items = categoriesListJson.map((type) => Lookup.fromJson(type)).toList(); } _loading = false; notifyListeners(); return response.statusCode; } catch(error) { - + print(error); _loading = false; _stateCode = -1; notifyListeners(); diff --git a/lib/controllers/providers/api/status_drop_down/employee/engineers_provider.dart b/lib/controllers/providers/api/status_drop_down/employee/engineers_provider.dart new file mode 100644 index 00000000..67c10b26 --- /dev/null +++ b/lib/controllers/providers/api/status_drop_down/employee/engineers_provider.dart @@ -0,0 +1,74 @@ +import 'dart:convert'; + +import 'package:test_sa/controllers/api_routes/api_manager.dart'; +import 'package:test_sa/controllers/api_routes/urls.dart'; +import 'package:test_sa/models/engineer.dart'; +import 'package:test_sa/models/lookup.dart'; +import 'package:test_sa/models/user.dart'; +import 'package:flutter/cupertino.dart'; +import 'package:flutter/material.dart'; +import 'package:http/http.dart'; + +class EngineersProvider extends ChangeNotifier{ + + //reset provider data + void reset(){ + _items = null; + _stateCode = null; + } + + // state code of current request to defied error message + // like 400 customer request failed + // 500 service not available + int _stateCode; + int get stateCode => _stateCode; + + // contain user data + // when user not login or register _user = null + List _items; + List get items => _items; + + // when categories in-process _loading = true + // done _loading = true + // failed _loading = false + bool _loading; + bool get isLoading => _loading; + set isLoading(bool isLoading){ + _loading = isLoading; + notifyListeners(); + } + + /// return -2 if request in progress + /// return -1 if error happen when sending request + /// 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 getData ({String host,User user}) async { + if(_loading == true) return -2; + _loading = true; + notifyListeners(); + Response response; + try{ + response = await ApiManager.instance.get( + URLs.getEngineers, + ); + _stateCode = response.statusCode; + if(response.statusCode >= 200 && response.statusCode < 300) { + // client's request was successfully received + List categoriesListJson = json.decode(response.body); + _items = categoriesListJson.map((type) => Engineer.fromJson(type)).toList(); + } + _loading = false; + notifyListeners(); + return response.statusCode; + } catch(error) { + print(error); + _loading = false; + _stateCode = -1; + notifyListeners(); + return -1; + } + + } + +} \ No newline at end of file diff --git a/lib/controllers/providers/api/status_drop_down/gas_refill/gas_cylinder_size_provider.dart b/lib/controllers/providers/api/status_drop_down/gas_refill/gas_cylinder_size_provider.dart index 5ea49fa9..ecf5a0c7 100644 --- a/lib/controllers/providers/api/status_drop_down/gas_refill/gas_cylinder_size_provider.dart +++ b/lib/controllers/providers/api/status_drop_down/gas_refill/gas_cylinder_size_provider.dart @@ -1,5 +1,6 @@ import 'dart:convert'; +import 'package:test_sa/controllers/api_routes/api_manager.dart'; import 'package:test_sa/controllers/api_routes/urls.dart'; import 'package:test_sa/models/lookup.dart'; import 'package:test_sa/models/user.dart'; @@ -49,13 +50,13 @@ class GasCylinderSizesProvider extends ChangeNotifier{ notifyListeners(); Response response; try{ - response = await get( - Uri.parse(host + URLs.getGasCylinderSize), + response = await ApiManager.instance.get( + URLs.getGasCylinderSize, ); _stateCode = response.statusCode; if(response.statusCode >= 200 && response.statusCode < 300) { // client's request was successfully received - List categoriesListJson = json.decode(utf8.decode(response.bodyBytes)); + List categoriesListJson = json.decode(response.body)["data"]; _items = categoriesListJson.map((item) => Lookup.fromJson(item)).toList(); } _loading = false; diff --git a/lib/controllers/providers/api/status_drop_down/gas_refill/gas_cylinder_type_provider.dart b/lib/controllers/providers/api/status_drop_down/gas_refill/gas_cylinder_type_provider.dart new file mode 100644 index 00000000..0d1a1e0a --- /dev/null +++ b/lib/controllers/providers/api/status_drop_down/gas_refill/gas_cylinder_type_provider.dart @@ -0,0 +1,74 @@ +import 'dart:convert'; + +import 'package:test_sa/controllers/api_routes/api_manager.dart'; +import 'package:test_sa/controllers/api_routes/urls.dart'; +import 'package:test_sa/models/lookup.dart'; +import 'package:test_sa/models/user.dart'; +import 'package:flutter/cupertino.dart'; +import 'package:flutter/material.dart'; +import 'package:http/http.dart'; + +class GasCylinderTypesProvider extends ChangeNotifier{ + + //reset provider data + void reset(){ + _items = null; + _loading = null; + _stateCode = null; + } + + // state code of current request to defied error message + // like 400 customer request failed + // 500 service not available + int _stateCode; + int get stateCode => _stateCode; + + // contain user data + // when user not login or register _user = null + List _items; + List get items => _items; + + // when categories in-process _loading = true + // done _loading = true + // failed _loading = false + bool _loading; + bool get isLoading => _loading; + set isLoading(bool isLoading){ + _loading = isLoading; + notifyListeners(); + } + + /// return -2 if request in progress + /// return -1 if error happen when sending request + /// 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 getData ({String host,User user,}) async { + if(_loading == true) + return -2; + _loading = true; + notifyListeners(); + Response response; + try{ + response = await ApiManager.instance.get( + URLs.getGasCylinderType, + ); + _stateCode = response.statusCode; + if(response.statusCode >= 200 && response.statusCode < 300) { + // client's request was successfully received + List categoriesListJson = json.decode(response.body)["data"]; + _items = categoriesListJson.map((item) => Lookup.fromJson(item)).toList(); + } + _loading = false; + notifyListeners(); + return response.statusCode; + } catch(error) { + _loading = false; + _stateCode = -1; + notifyListeners(); + return -1; + } + + } + +} \ No newline at end of file diff --git a/lib/controllers/providers/api/status_drop_down/gas_refill/gas_status_provider.dart b/lib/controllers/providers/api/status_drop_down/gas_refill/gas_status_provider.dart index a6fcbc5a..6073c9fe 100644 --- a/lib/controllers/providers/api/status_drop_down/gas_refill/gas_status_provider.dart +++ b/lib/controllers/providers/api/status_drop_down/gas_refill/gas_status_provider.dart @@ -1,5 +1,6 @@ import 'dart:convert'; +import 'package:test_sa/controllers/api_routes/api_manager.dart'; import 'package:test_sa/controllers/api_routes/urls.dart'; import 'package:test_sa/models/lookup.dart'; import 'package:test_sa/models/user.dart'; @@ -48,13 +49,13 @@ class GasStatusProvider extends ChangeNotifier{ notifyListeners(); Response response; try{ - response = await get( - Uri.parse(host + URLs.getGasStatus), + response = await ApiManager.instance.get( + URLs.getGasStatus, ); _stateCode = response.statusCode; if(response.statusCode >= 200 && response.statusCode < 300) { // client's request was successfully received - List categoriesListJson = json.decode(utf8.decode(response.bodyBytes)); + List categoriesListJson = json.decode(response.body)["data"]; _items = categoriesListJson.map((item) => Lookup.fromJson(item)).toList(); } _loading = false; diff --git a/lib/controllers/providers/api/status_drop_down/gas_refill/gas_types_provider.dart b/lib/controllers/providers/api/status_drop_down/gas_refill/gas_types_provider.dart index 80e0d531..3286ea00 100644 --- a/lib/controllers/providers/api/status_drop_down/gas_refill/gas_types_provider.dart +++ b/lib/controllers/providers/api/status_drop_down/gas_refill/gas_types_provider.dart @@ -1,5 +1,6 @@ import 'dart:convert'; +import 'package:test_sa/controllers/api_routes/api_manager.dart'; import 'package:test_sa/controllers/api_routes/urls.dart'; import 'package:test_sa/models/lookup.dart'; import 'package:test_sa/models/user.dart'; @@ -48,13 +49,13 @@ class GasTypesProvider extends ChangeNotifier{ notifyListeners(); Response response; try{ - response = await get( - Uri.parse(host + URLs.getGasTypes), + response = await ApiManager.instance.get( + URLs.getGasTypes, ); _stateCode = response.statusCode; if(response.statusCode >= 200 && response.statusCode < 300) { // client's request was successfully received - List categoriesListJson = json.decode(utf8.decode(response.bodyBytes)); + List categoriesListJson = json.decode(response.body)["data"]; _items = categoriesListJson.map((item) => Lookup.fromJson(item)).toList(); } _loading = false; diff --git a/lib/controllers/providers/api/status_drop_down/pentry/pentry_status_provider.dart b/lib/controllers/providers/api/status_drop_down/pentry/pentry_status_provider.dart index 75d18783..e5d769ac 100644 --- a/lib/controllers/providers/api/status_drop_down/pentry/pentry_status_provider.dart +++ b/lib/controllers/providers/api/status_drop_down/pentry/pentry_status_provider.dart @@ -1,5 +1,6 @@ import 'dart:convert'; +import 'package:test_sa/controllers/api_routes/api_manager.dart'; import 'package:test_sa/controllers/api_routes/urls.dart'; import 'package:test_sa/models/lookup.dart'; import 'package:test_sa/models/user.dart'; @@ -48,16 +49,15 @@ class PentryStatusProvider extends ChangeNotifier{ notifyListeners(); Response response; try{ - response = await get( - Uri.parse( - host + URLs.getPentryStatus), + response = await ApiManager.instance.get( + URLs.getPentryStatus, ); _stateCode = response.statusCode; if(response.statusCode >= 200 && response.statusCode < 300) { // client's request was successfully received - List listJson = json.decode(utf8.decode(response.bodyBytes)); - _items = listJson.map((type) => Lookup.fromIntIdJson(type)).toList(); + List listJson = json.decode(response.body)["data"]; + _items = listJson.map((type) => Lookup.fromJson(type)).toList(); } _loading = false; notifyListeners(); diff --git a/lib/controllers/providers/api/status_drop_down/pentry/pentry_task_status_provider.dart b/lib/controllers/providers/api/status_drop_down/pentry/pentry_task_status_provider.dart index 900671e1..689f357d 100644 --- a/lib/controllers/providers/api/status_drop_down/pentry/pentry_task_status_provider.dart +++ b/lib/controllers/providers/api/status_drop_down/pentry/pentry_task_status_provider.dart @@ -1,5 +1,6 @@ import 'dart:convert'; +import 'package:test_sa/controllers/api_routes/api_manager.dart'; import 'package:test_sa/controllers/api_routes/urls.dart'; import 'package:test_sa/models/lookup.dart'; import 'package:test_sa/models/user.dart'; @@ -48,16 +49,15 @@ class PentryTaskStatusProvider extends ChangeNotifier{ notifyListeners(); Response response; try{ - response = await get( - Uri.parse( - host + URLs.getPentryTaskStatus), + response = await ApiManager.instance.get( + URLs.getPentryTaskStatus, ); _stateCode = response.statusCode; if(response.statusCode >= 200 && response.statusCode < 300) { // client's request was successfully received - List categoriesListJson = json.decode(utf8.decode(response.bodyBytes)); - _items = categoriesListJson.map((type) => Lookup.fromIntIdJson(type)).toList(); + List categoriesListJson = json.decode(response.body)["data"]; + _items = categoriesListJson.map((type) => Lookup.fromJson(type)).toList(); } _loading = false; notifyListeners(); diff --git a/lib/controllers/providers/api/status_drop_down/pentry/pentry_visit_status_provider.dart b/lib/controllers/providers/api/status_drop_down/pentry/pentry_visit_status_provider.dart index c8562f25..c616d746 100644 --- a/lib/controllers/providers/api/status_drop_down/pentry/pentry_visit_status_provider.dart +++ b/lib/controllers/providers/api/status_drop_down/pentry/pentry_visit_status_provider.dart @@ -1,5 +1,6 @@ import 'dart:convert'; +import 'package:test_sa/controllers/api_routes/api_manager.dart'; import 'package:test_sa/controllers/api_routes/urls.dart'; import 'package:test_sa/models/lookup.dart'; import 'package:test_sa/models/user.dart'; @@ -48,16 +49,15 @@ class PentryVisitStatusProvider extends ChangeNotifier{ notifyListeners(); Response response; try{ - response = await get( - Uri.parse( - host + URLs.getPentryVisitStatus), + response = await ApiManager.instance.get( + URLs.getPentryVisitStatus, ); _stateCode = response.statusCode; if(response.statusCode >= 200 && response.statusCode < 300) { // client's request was successfully received - List listJson = json.decode(utf8.decode(response.bodyBytes)); - _items = listJson.map((type) => Lookup.fromIntIdJson(type)).toList(); + List listJson = json.decode(response.body)["data"]; + _items = listJson.map((type) => Lookup.fromJson(type)).toList(); } _loading = false; notifyListeners(); diff --git a/lib/controllers/providers/api/status_drop_down/report/service_report_defect_types_provider.dart b/lib/controllers/providers/api/status_drop_down/report/service_report_defect_types_provider.dart index a61b1e76..563ba8d8 100644 --- a/lib/controllers/providers/api/status_drop_down/report/service_report_defect_types_provider.dart +++ b/lib/controllers/providers/api/status_drop_down/report/service_report_defect_types_provider.dart @@ -1,5 +1,6 @@ import 'dart:convert'; +import 'package:test_sa/controllers/api_routes/api_manager.dart'; import 'package:test_sa/controllers/api_routes/urls.dart'; import 'package:test_sa/models/lookup.dart'; import 'package:test_sa/models/user.dart'; @@ -48,16 +49,14 @@ class ServiceRequestDefectTypesProvider extends ChangeNotifier{ notifyListeners(); Response response; try{ - response = await get( - Uri.parse( - host + URLs.getServiceReportDefectTypes), + response = await ApiManager.instance.get( + URLs.getServiceReportDefectTypes, ); - _stateCode = response.statusCode; if(response.statusCode >= 200 && response.statusCode < 300) { // client's request was successfully received - List listJson = json.decode(utf8.decode(response.bodyBytes)); - _items = listJson.map((type) => Lookup.fromIntIdJson(type)).toList(); + List listJson = json.decode(response.body)["data"]; + _items = listJson.map((type) => Lookup.fromJson(type)).toList(); } _loading = false; notifyListeners(); diff --git a/lib/controllers/providers/api/status_drop_down/report/service_report_last_calls_provider.dart b/lib/controllers/providers/api/status_drop_down/report/service_report_last_calls_provider.dart index 20e9f7be..b76938fd 100644 --- a/lib/controllers/providers/api/status_drop_down/report/service_report_last_calls_provider.dart +++ b/lib/controllers/providers/api/status_drop_down/report/service_report_last_calls_provider.dart @@ -1,5 +1,6 @@ import 'dart:convert'; +import 'package:test_sa/controllers/api_routes/api_manager.dart'; import 'package:test_sa/controllers/api_routes/urls.dart'; import 'package:test_sa/models/lookup.dart'; import 'package:test_sa/models/user.dart'; @@ -49,17 +50,21 @@ class ServiceReportLastCallsProvider extends ChangeNotifier{ notifyListeners(); Response response; try{ - response = await get( - Uri.parse( - host + URLs.getServiceReportLastCalls - +(serviceStatus == null ? "" : "?service_status=$serviceStatus") - ), + // todo request new api from backend to make filter work + response = await ApiManager.instance.get( + URLs.getServiceReportLastCalls, ); + // response = await get( + // Uri.parse( + // URLs.getServiceReportLastCalls + // +(serviceStatus == null ? "" : "?service_status=$serviceStatus") + // ), + // ); _stateCode = response.statusCode; if(response.statusCode >= 200 && response.statusCode < 300) { // client's request was successfully received - List categoriesListJson = json.decode(utf8.decode(response.bodyBytes)); - _calls = categoriesListJson.map((type) => Lookup.fromIntIdJson(type)).toList(); + List categoriesListJson = json.decode(response.body)["data"]; + _calls = categoriesListJson.map((type) => Lookup.fromJson(type)).toList(); } _loading = false; notifyListeners(); diff --git a/lib/controllers/providers/api/status_drop_down/report/service_report_priority_provider.dart b/lib/controllers/providers/api/status_drop_down/report/service_report_priority_provider.dart index beb18280..a9c566e0 100644 --- a/lib/controllers/providers/api/status_drop_down/report/service_report_priority_provider.dart +++ b/lib/controllers/providers/api/status_drop_down/report/service_report_priority_provider.dart @@ -1,5 +1,6 @@ import 'dart:convert'; +import 'package:test_sa/controllers/api_routes/api_manager.dart'; import 'package:test_sa/controllers/api_routes/urls.dart'; import 'package:test_sa/models/lookup.dart'; import 'package:test_sa/models/user.dart'; @@ -48,21 +49,21 @@ class ServiceRequestPriorityProvider extends ChangeNotifier{ notifyListeners(); Response response; try{ - response = await get( - Uri.parse( - host + URLs.getServiceReportPriority), + response = await ApiManager.instance.get( + URLs.getServiceReportPriority, ); _stateCode = response.statusCode; if(response.statusCode >= 200 && response.statusCode < 300) { // client's request was successfully received - List listJson = json.decode(utf8.decode(response.bodyBytes)); - _items = listJson.map((type) => Lookup.fromIntIdJson(type)).toList(); + List listJson = json.decode(response.body)["data"]; + _items = listJson.map((type) => Lookup.fromJson(type)).toList(); } _loading = false; notifyListeners(); return response.statusCode; } catch(error) { + print(error); _loading = false; _stateCode = -1; notifyListeners(); diff --git a/lib/controllers/providers/api/status_drop_down/report/service_report_reasons_provider.dart b/lib/controllers/providers/api/status_drop_down/report/service_report_reasons_provider.dart index b1f86f54..7df11d8d 100644 --- a/lib/controllers/providers/api/status_drop_down/report/service_report_reasons_provider.dart +++ b/lib/controllers/providers/api/status_drop_down/report/service_report_reasons_provider.dart @@ -1,5 +1,6 @@ import 'dart:convert'; +import 'package:test_sa/controllers/api_routes/api_manager.dart'; import 'package:test_sa/controllers/api_routes/urls.dart'; import 'package:test_sa/models/lookup.dart'; import 'package:test_sa/models/user.dart'; @@ -48,15 +49,14 @@ class ServiceReportReasonsProvider extends ChangeNotifier{ notifyListeners(); Response response; try{ - response = await get( - Uri.parse( - host + URLs.getServiceReportReasons), + response = await ApiManager.instance.get( + URLs.getServiceReportReasons, ); _stateCode = response.statusCode; if(response.statusCode >= 200 && response.statusCode < 300) { // client's request was successfully received - List categoriesListJson = json.decode(utf8.decode(response.bodyBytes)); - _reasons = categoriesListJson.map((type) => Lookup.fromIntIdJson(type)).toList(); + List categoriesListJson = json.decode(response.body)["data"]; + _reasons = categoriesListJson.map((type) => Lookup.fromJson(type)).toList(); } _loading = false; notifyListeners(); diff --git a/lib/controllers/providers/api/status_drop_down/report/service_report_status_provider.dart b/lib/controllers/providers/api/status_drop_down/report/service_report_status_provider.dart index 6e98367c..93209606 100644 --- a/lib/controllers/providers/api/status_drop_down/report/service_report_status_provider.dart +++ b/lib/controllers/providers/api/status_drop_down/report/service_report_status_provider.dart @@ -1,5 +1,6 @@ import 'dart:convert'; +import 'package:test_sa/controllers/api_routes/api_manager.dart'; import 'package:test_sa/controllers/api_routes/urls.dart'; import 'package:test_sa/models/lookup.dart'; import 'package:test_sa/models/user.dart'; @@ -48,15 +49,15 @@ class ServiceReportStatusProvider extends ChangeNotifier{ notifyListeners(); Response response; try{ - response = await get( - Uri.parse( - host + URLs.getServiceReportStatus), + response = await ApiManager.instance.get( + URLs.getServiceReportStatus, ); + _stateCode = response.statusCode; if(response.statusCode >= 200 && response.statusCode < 300) { // client's request was successfully received - List categoriesListJson = json.decode(utf8.decode(response.bodyBytes)); - _status = categoriesListJson.map((type) => Lookup.fromIntIdJson(type)).toList(); + List categoriesListJson = json.decode(response.body)["data"]; + _status = categoriesListJson.map((type) => Lookup.fromJson(type)).toList(); } _loading = false; notifyListeners(); diff --git a/lib/controllers/providers/api/status_drop_down/report/service_report_types_provider.dart b/lib/controllers/providers/api/status_drop_down/report/service_report_types_provider.dart index 358440a1..f385c27e 100644 --- a/lib/controllers/providers/api/status_drop_down/report/service_report_types_provider.dart +++ b/lib/controllers/providers/api/status_drop_down/report/service_report_types_provider.dart @@ -1,5 +1,6 @@ import 'dart:convert'; +import 'package:test_sa/controllers/api_routes/api_manager.dart'; import 'package:test_sa/controllers/api_routes/urls.dart'; import 'package:test_sa/models/lookup.dart'; import 'package:test_sa/models/user.dart'; @@ -48,16 +49,14 @@ class ServiceReportTypesProvider extends ChangeNotifier{ notifyListeners(); Response response; try{ - - response = await get( - Uri.parse( - host + URLs.getServiceReportTypes), + response = await ApiManager.instance.get( + URLs.getServiceReportTypes, ); _stateCode = response.statusCode; if(response.statusCode >= 200 && response.statusCode < 300) { // client's request was successfully received - List categoriesListJson = json.decode(utf8.decode(response.bodyBytes)); - _types = categoriesListJson.map((type) => Lookup.fromIntIdJson(type)).toList(); + List categoriesListJson = json.decode(response.body)["data"]; + _types = categoriesListJson.map((type) => Lookup.fromJson(type)).toList(); } _loading = false; notifyListeners(); diff --git a/lib/controllers/providers/api/status_drop_down/report/service_types_provider.dart b/lib/controllers/providers/api/status_drop_down/report/service_types_provider.dart index 3fa2ddb3..9e25f2eb 100644 --- a/lib/controllers/providers/api/status_drop_down/report/service_types_provider.dart +++ b/lib/controllers/providers/api/status_drop_down/report/service_types_provider.dart @@ -1,5 +1,6 @@ import 'dart:convert'; +import 'package:test_sa/controllers/api_routes/api_manager.dart'; import 'package:test_sa/controllers/api_routes/urls.dart'; import 'package:test_sa/models/lookup.dart'; import 'package:test_sa/models/user.dart'; @@ -48,16 +49,14 @@ class ServiceStatusProvider extends ChangeNotifier{ notifyListeners(); Response response; try{ - - response = await get( - Uri.parse( - host + URLs.getServiceTypes), + response = await ApiManager.instance.get( + URLs.getServiceTypes, ); _stateCode = response.statusCode; if(response.statusCode >= 200 && response.statusCode < 300) { // client's request was successfully received - List categoriesListJson = json.decode(utf8.decode(response.bodyBytes)); - _statuses = categoriesListJson.map((e) => Lookup.fromIntIdJson(e)).toList(); + List categoriesListJson = json.decode(response.body)["data"]; + _statuses = categoriesListJson.map((e) => Lookup.fromJson(e)).toList(); } _loading = false; diff --git a/lib/controllers/providers/api/status_drop_down/service_reqest/service_request_status_provider.dart b/lib/controllers/providers/api/status_drop_down/service_reqest/service_request_status_provider.dart new file mode 100644 index 00000000..4ead90e0 --- /dev/null +++ b/lib/controllers/providers/api/status_drop_down/service_reqest/service_request_status_provider.dart @@ -0,0 +1,74 @@ +import 'dart:convert'; + +import 'package:test_sa/controllers/api_routes/api_manager.dart'; +import 'package:test_sa/controllers/api_routes/urls.dart'; +import 'package:test_sa/models/lookup.dart'; +import 'package:test_sa/models/user.dart'; +import 'package:flutter/cupertino.dart'; +import 'package:flutter/material.dart'; +import 'package:http/http.dart'; + +class ServiceRequestStatusProvider extends ChangeNotifier{ + + //reset provider data + void reset(){ + _statuses = null; + _stateCode = null; + } + + // state code of current request to defied error message + // like 400 customer request failed + // 500 service not available + int _stateCode; + int get stateCode => _stateCode; + + // contain user data + // when user not login or register _user = null + List _statuses; + List get items => _statuses; + + // when categories in-process _loading = true + // done _loading = true + // failed _loading = false + bool _loading; + bool get isLoading => _loading; + set isLoading(bool isLoading){ + _loading = isLoading; + notifyListeners(); + } + + /// return -2 if request in progress + /// return -1 if error happen when sending request + /// 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 getData ({String host,User user}) async { + if(_loading == true) + return -2; + _loading = true; + notifyListeners(); + Response response; + try{ + response = await ApiManager.instance.get( + URLs.getServiceRequestStatus, + ); + _stateCode = response.statusCode; + if(response.statusCode >= 200 && response.statusCode < 300) { + // client's request was successfully received + List categoriesListJson = json.decode(response.body)["data"]; + _statuses = categoriesListJson.map((e) => Lookup.fromJson(e)).toList(); + + } + _loading = false; + notifyListeners(); + return response.statusCode; + } catch(error) { + _loading = false; + _stateCode = -1; + notifyListeners(); + return -1; + } + + } + +} \ No newline at end of file diff --git a/lib/controllers/providers/api/status_drop_down/service_reqest/service_request_through_provider.dart b/lib/controllers/providers/api/status_drop_down/service_reqest/service_request_through_provider.dart new file mode 100644 index 00000000..592ec4dc --- /dev/null +++ b/lib/controllers/providers/api/status_drop_down/service_reqest/service_request_through_provider.dart @@ -0,0 +1,74 @@ +import 'dart:convert'; + +import 'package:test_sa/controllers/api_routes/api_manager.dart'; +import 'package:test_sa/controllers/api_routes/urls.dart'; +import 'package:test_sa/models/lookup.dart'; +import 'package:test_sa/models/user.dart'; +import 'package:flutter/cupertino.dart'; +import 'package:flutter/material.dart'; +import 'package:http/http.dart'; + +class ServiceRequestedThroughProvider extends ChangeNotifier{ + + //reset provider data + void reset(){ + _statuses = null; + _stateCode = null; + } + + // state code of current request to defied error message + // like 400 customer request failed + // 500 service not available + int _stateCode; + int get stateCode => _stateCode; + + // contain user data + // when user not login or register _user = null + List _statuses; + List get items => _statuses; + + // when categories in-process _loading = true + // done _loading = true + // failed _loading = false + bool _loading; + bool get isLoading => _loading; + set isLoading(bool isLoading){ + _loading = isLoading; + notifyListeners(); + } + + /// return -2 if request in progress + /// return -1 if error happen when sending request + /// 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 getData ({String host,User user}) async { + if(_loading == true) + return -2; + _loading = true; + notifyListeners(); + Response response; + try{ + response = await ApiManager.instance.get( + URLs.getServiceRequestThrough, + ); + _stateCode = response.statusCode; + if(response.statusCode >= 200 && response.statusCode < 300) { + // client's request was successfully received + List categoriesListJson = json.decode(response.body)["data"]; + _statuses = categoriesListJson.map((e) => Lookup.fromJson(e)).toList(); + + } + _loading = false; + notifyListeners(); + return response.statusCode; + } catch(error) { + _loading = false; + _stateCode = -1; + notifyListeners(); + return -1; + } + + } + +} \ No newline at end of file diff --git a/lib/controllers/providers/api/status_drop_down/service_reqest/service_request_type_provider.dart b/lib/controllers/providers/api/status_drop_down/service_reqest/service_request_type_provider.dart new file mode 100644 index 00000000..bcc01b4a --- /dev/null +++ b/lib/controllers/providers/api/status_drop_down/service_reqest/service_request_type_provider.dart @@ -0,0 +1,74 @@ +import 'dart:convert'; + +import 'package:test_sa/controllers/api_routes/api_manager.dart'; +import 'package:test_sa/controllers/api_routes/urls.dart'; +import 'package:test_sa/models/lookup.dart'; +import 'package:test_sa/models/user.dart'; +import 'package:flutter/cupertino.dart'; +import 'package:flutter/material.dart'; +import 'package:http/http.dart'; + +class ServiceRequestTypeProvider extends ChangeNotifier{ + + //reset provider data + void reset(){ + _statuses = null; + _stateCode = null; + } + + // state code of current request to defied error message + // like 400 customer request failed + // 500 service not available + int _stateCode; + int get stateCode => _stateCode; + + // contain user data + // when user not login or register _user = null + List _statuses; + List get items => _statuses; + + // when categories in-process _loading = true + // done _loading = true + // failed _loading = false + bool _loading; + bool get isLoading => _loading; + set isLoading(bool isLoading){ + _loading = isLoading; + notifyListeners(); + } + + /// return -2 if request in progress + /// return -1 if error happen when sending request + /// 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 getData ({String host,User user}) async { + if(_loading == true) + return -2; + _loading = true; + notifyListeners(); + Response response; + try{ + response = await ApiManager.instance.get( + URLs.getServiceRequestTypes, + ); + _stateCode = response.statusCode; + if(response.statusCode >= 200 && response.statusCode < 300) { + // client's request was successfully received + List categoriesListJson = json.decode(response.body)["data"]; + _statuses = categoriesListJson.map((e) => Lookup.fromJson(e)).toList(); + + } + _loading = false; + notifyListeners(); + return response.statusCode; + } catch(error) { + _loading = false; + _stateCode = -1; + notifyListeners(); + return -1; + } + + } + +} \ No newline at end of file diff --git a/lib/controllers/providers/api/user_provider.dart b/lib/controllers/providers/api/user_provider.dart index 843746c9..55788923 100644 --- a/lib/controllers/providers/api/user_provider.dart +++ b/lib/controllers/providers/api/user_provider.dart @@ -1,5 +1,7 @@ import 'dart:convert'; +import 'package:fluttertoast/fluttertoast.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/user.dart'; import 'package:flutter/material.dart'; @@ -48,22 +50,21 @@ class UserProvider extends ChangeNotifier{ notifyListeners(); Response response; try{ - response = await post( - Uri.parse( - host+URLs.login), - body: await user.toLoginJson(), + response = await ApiManager.instance.post( + URLs.login, + body: await user.toLoginJson(), ); _loading = false; if(response.statusCode >= 200 && response.statusCode < 300) { // client's request was successfully received - _user = User.fromJson(jsonDecode(utf8.decode(response.bodyBytes))[0]); - + _user = User.fromJson(jsonDecode(response.body)); return response.statusCode; } notifyListeners(); return response.statusCode; } catch(error) { + print(error); _loading = false; notifyListeners(); return -1; @@ -86,10 +87,9 @@ class UserProvider extends ChangeNotifier{ notifyListeners(); Response response; try{ - response = await post( - Uri.parse( - host+URLs.register), - body: await user.toRegisterJson() + response = await ApiManager.instance.post( + URLs.register, + body: await user.toLoginJson(), ); } catch(error) { _loading = false; @@ -134,10 +134,9 @@ class UserProvider extends ChangeNotifier{ if(user.phoneNumber != _user.phoneNumber) jsonObject["phone"] = user.phoneNumber; try{ - response = await post( - Uri.parse( - host+URLs.updateProfile), - body: jsonObject + response = response = await ApiManager.instance.post( + URLs.login, + body: jsonObject, ); } catch(error) { _loading = false; diff --git a/lib/main.dart b/lib/main.dart index 0be3e414..f21c35b5 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -7,14 +7,19 @@ import 'package:test_sa/controllers/providers/api/hospitals_provider.dart'; import 'package:test_sa/controllers/providers/api/notifications_provider.dart'; import 'package:test_sa/controllers/providers/api/regular_visits_provider.dart'; import 'package:test_sa/controllers/providers/api/service_requests_provider.dart'; -import 'package:test_sa/controllers/providers/api/status_drop_down/employee/employee_provider.dart'; +import 'package:test_sa/controllers/providers/api/status_drop_down/employee/assigned_to_provider.dart'; +import 'package:test_sa/controllers/providers/api/status_drop_down/employee/engineers_provider.dart'; import 'package:test_sa/controllers/providers/api/status_drop_down/gas_refill/gas_cylinder_size_provider.dart'; +import 'package:test_sa/controllers/providers/api/status_drop_down/gas_refill/gas_cylinder_type_provider.dart'; import 'package:test_sa/controllers/providers/api/status_drop_down/gas_refill/gas_status_provider.dart'; import 'package:test_sa/controllers/providers/api/status_drop_down/gas_refill/gas_types_provider.dart'; import 'package:test_sa/controllers/providers/api/status_drop_down/pentry/pentry_task_status_provider.dart'; import 'package:test_sa/controllers/providers/api/status_drop_down/pentry/pentry_visit_status_provider.dart'; import 'package:test_sa/controllers/providers/api/status_drop_down/report/service_report_defect_types_provider.dart'; import 'package:test_sa/controllers/providers/api/status_drop_down/report/service_report_priority_provider.dart'; +import 'package:test_sa/controllers/providers/api/status_drop_down/service_reqest/service_request_status_provider.dart'; +import 'package:test_sa/controllers/providers/api/status_drop_down/service_reqest/service_request_through_provider.dart'; +import 'package:test_sa/controllers/providers/api/status_drop_down/service_reqest/service_request_type_provider.dart'; import 'package:test_sa/views/app_style/colors.dart'; import 'package:test_sa/views/pages/login.dart'; import 'package:test_sa/views/pages/register.dart'; @@ -80,16 +85,21 @@ class MyApp extends StatelessWidget { ChangeNotifierProvider(create: (_) => ServiceStatusProvider()), ChangeNotifierProvider(create: (_) => ServiceReportLastCallsProvider()), ChangeNotifierProvider(create: (_) => GasCylinderSizesProvider()), + ChangeNotifierProvider(create: (_) => GasCylinderTypesProvider()), ChangeNotifierProvider(create: (_) => GasStatusProvider()), ChangeNotifierProvider(create: (_) => GasTypesProvider()), ChangeNotifierProvider(create: (_) => GasRefillProvider()), ChangeNotifierProvider(create: (_) => DeviceTransferProvider()), - ChangeNotifierProvider(create: (_) => EmployeesProvider()), + ChangeNotifierProvider(create: (_) => AssignedToProvider()), ChangeNotifierProvider(create: (_) => PentryTaskStatusProvider()), ChangeNotifierProvider(create: (_) => PentryVisitStatusProvider()), ChangeNotifierProvider(create: (_) => PentryStatusProvider()), ChangeNotifierProvider(create: (_) => ServiceRequestPriorityProvider()), ChangeNotifierProvider(create: (_) => ServiceRequestDefectTypesProvider()), + ChangeNotifierProvider(create: (_) => ServiceRequestTypeProvider()), + ChangeNotifierProvider(create: (_) => ServiceRequestedThroughProvider()), + ChangeNotifierProvider(create: (_) => ServiceRequestStatusProvider()), + ChangeNotifierProvider(create: (_) => EngineersProvider()), ], child: GestureDetector( onTap: () { diff --git a/lib/models/department.dart b/lib/models/department.dart index 27df7b06..4dfe4cd0 100644 --- a/lib/models/department.dart +++ b/lib/models/department.dart @@ -1,5 +1,5 @@ class Department{ - String id; + int id; String name; Department({ @@ -9,8 +9,8 @@ class Department{ factory Department.fromJson(Map parsedJson){ return Department( - id: parsedJson["nid"] ?? parsedJson["id"], - name: parsedJson["dept_name"] ?? parsedJson["value"], + id: parsedJson["id"], + name: parsedJson["name"], ); } factory Department.fromDepartment(Department department){ diff --git a/lib/models/device/device.dart b/lib/models/device/device.dart index b84b8715..cf6eed07 100644 --- a/lib/models/device/device.dart +++ b/lib/models/device/device.dart @@ -1,5 +1,5 @@ class Device{ - String id; + int id; String serialNumber; String number; String brand; @@ -27,11 +27,13 @@ class Device{ factory Device.fromJson(Map parsedJson){ return Device( - id: parsedJson["nid"] ?? parsedJson["id"], - serialNumber: parsedJson["sn"] ?? parsedJson["value"], - number: parsedJson["asset_no"], - brand: parsedJson["brand"].toString(), - model: parsedJson["model"].toString(), + id: parsedJson["id"], + serialNumber: parsedJson["assetSerialNo"], + number: parsedJson["assetNumber"], + brand: parsedJson["modelDefinition"] == null ? "" : + parsedJson["modelDefinition"]["manufacturerName"], + model: parsedJson["modelDefinition"] == null ? "" : + parsedJson["modelDefinition"]["modelName"], productionDate: getDateFromString(parsedJson["production_date"]), supplyDate: getDateFromString(parsedJson["supply_date "]), installDate: getDateFromString(parsedJson["install_date "]), diff --git a/lib/models/device/device_transfer.dart b/lib/models/device/device_transfer.dart index 27379344..d2e18572 100644 --- a/lib/models/device/device_transfer.dart +++ b/lib/models/device/device_transfer.dart @@ -1,4 +1,5 @@ import 'package:http/http.dart'; +import 'package:test_sa/controllers/api_routes/urls.dart'; import 'package:test_sa/models/department.dart'; import 'package:test_sa/models/device/device.dart'; import 'package:test_sa/models/device/device_transfer_info.dart'; @@ -6,7 +7,7 @@ import 'package:test_sa/models/hospital.dart'; import 'package:test_sa/models/lookup.dart'; class DeviceTransfer{ - String id; + int id; String userId; String title; Device device; @@ -41,13 +42,60 @@ class DeviceTransfer{ } factory DeviceTransfer.fromJson(Map parsedJson){ + print(parsedJson["id"],); + print(URLs.getFileUrl(parsedJson["senderAttachmentName"]),); + print(URLs.getFileUrl(parsedJson["receiverAttachmentName"]),); return DeviceTransfer( id: parsedJson["id"], - title: parsedJson["title"], + title: parsedJson["transferCode"], userId: parsedJson["uid"], - device: Device.fromJson(parsedJson["eq_sn"]), - sender: DeviceTransferInfo.fromJson(parsedJson,"sender_"), - receiver: DeviceTransferInfo.fromJson(parsedJson,"receiver_"), + device: Device( + id: parsedJson["assetId"], + number: parsedJson["assetNumber"], + serialNumber: parsedJson["assetSerialNo"], + ), + sender: DeviceTransferInfo( + travelingHours: parsedJson["senderTravelingHours"], + comment: parsedJson["senderComment"], + workingHours: parsedJson["senderWorkingHours"], + userId: parsedJson["senderAssignedEmployeeId"], + userName: parsedJson["senderAssignedEmployeeName"], + client: Hospital( + id: parsedJson["senderSiteId"], + name: parsedJson["senderSiteName"] + ), + department: Department( + id: parsedJson["senderDepartmentId"], + name: parsedJson["senderDepartmentName"], + ), + // todo add segnature + signature: URLs.getFileUrl(parsedJson["senderAttachmentName"]), + status: Lookup( + id: parsedJson["senderMachineStatusId"], + name: parsedJson["senderMachineStatusName"], + ), + ), + receiver: DeviceTransferInfo( + travelingHours: parsedJson["receiverTravelingHours"], + comment: parsedJson["receiverComment"], + workingHours: parsedJson["receiverWorkingHours"], + userId: parsedJson["receiverAssignedEmployeeId"], + userName: parsedJson["receiverAssignedEmployeeName"], + client: Hospital( + id: parsedJson["destSiteId"], + name: parsedJson["destSiteName"] + ), + department: Department( + id: parsedJson["destDepartmentId"], + name: parsedJson["destDepartmentName"], + ), + // todo add segnature + signature: URLs.getFileUrl(parsedJson["receiverAttachmentName"]), + status: Lookup( + id: parsedJson["receiverMachineStatusId"], + name: parsedJson["receiverMachineStatusName"], + ), + ), ); } } diff --git a/lib/models/device/device_transfer_info.dart b/lib/models/device/device_transfer_info.dart index 3e8d0f8f..4475b085 100644 --- a/lib/models/device/device_transfer_info.dart +++ b/lib/models/device/device_transfer_info.dart @@ -11,7 +11,7 @@ class DeviceTransferInfo{ Department department; String workingHours; String travelingHours; - String name; + String userName; String signature; Lookup status; @@ -20,7 +20,7 @@ class DeviceTransferInfo{ this.comment, this.department, this.client, - this.name, + this.userName, this.travelingHours, this.workingHours, this.signature, @@ -47,7 +47,7 @@ class DeviceTransferInfo{ fromDetails(DeviceTransferInfo old,{bool withSignature = true}){ userId = old.userId; - name = old.name; + userName = old.userName; client = Hospital.fromHospital(old.client); department = Department.fromDepartment(old.department); workingHours = old.workingHours; @@ -61,13 +61,22 @@ class DeviceTransferInfo{ return DeviceTransferInfo( workingHours: parsedJson["${key}working_hours"], travelingHours: parsedJson["${key}travel_hours"], - name: parsedJson["${key}name"], + userName: parsedJson["${key}name"], signature: parsedJson["${key}image"], userId: parsedJson["${key}id"], comment: parsedJson["${key}comment"], - client: Hospital.fromJson(parsedJson["${key}client"]), - department: Department.fromJson(parsedJson["${key}department"]), - status: Lookup.fromJson(parsedJson["${key}status"]), + client: Hospital( + id: parsedJson["${key}SiteId"], + name: parsedJson["${key}SiteName"] + ), + department: Department( + id: parsedJson["${key}DepartmentId"], + name: parsedJson["${key}DepartmentName"], + ), + status: Lookup( + id: parsedJson["${key}status"], + name: parsedJson["${key}status"], + ), ); } } diff --git a/lib/models/engineer.dart b/lib/models/engineer.dart new file mode 100644 index 00000000..74916e45 --- /dev/null +++ b/lib/models/engineer.dart @@ -0,0 +1,31 @@ +class Engineer{ + String id; + String name; + + Engineer({ + this.id, + this.name, + }); + + factory Engineer.fromJson(Map parsedJson){ + return Engineer( + id: parsedJson["userId"], + name: parsedJson["userName"], + ); + } + factory Engineer.fromEngineer(Engineer department){ + return Engineer( + id: department?.id, + name: department?.name, + ); + } + + @override + bool operator == (Object other) => + identical(this, other) || other is Engineer && + id == other.id; + + + @override + int get hashCode => id.hashCode; +} \ No newline at end of file diff --git a/lib/models/gas_refill/gas_refill_details.dart b/lib/models/gas_refill/gas_refill_details.dart index f150e150..2f8d55ff 100644 --- a/lib/models/gas_refill/gas_refill_details.dart +++ b/lib/models/gas_refill/gas_refill_details.dart @@ -3,12 +3,14 @@ import 'package:test_sa/models/lookup.dart'; class GasRefillDetails{ Lookup type; Lookup cylinderSize; - int requestedQuantity; - int deliveredQuantity; + Lookup cylinderType; + double requestedQuantity; + double deliveredQuantity; GasRefillDetails({ this.type, this.cylinderSize, + this.cylinderType, this.requestedQuantity, this.deliveredQuantity, }); @@ -21,13 +23,11 @@ class GasRefillDetails{ } factory GasRefillDetails.fromJson(Map parsedJson){ return GasRefillDetails( - type: Lookup.fromJson(parsedJson["type"]), - - cylinderSize: Lookup.fromJson(parsedJson["size"]), - requestedQuantity: parsedJson["requsted_qty"] == null - ? 0 : int.tryParse(parsedJson["requsted_qty"].toString()) ?? 0, - deliveredQuantity: parsedJson["deliverd_qty"] == null - ? 0 : int.tryParse(parsedJson["deliverd_qty"].toString()) ?? 0, + type: Lookup.fromJson(parsedJson["gasType"]), + cylinderSize: Lookup.fromJson(parsedJson["cylinderSize"]), + cylinderType: Lookup.fromJson(parsedJson["cylinderType"]), + requestedQuantity: parsedJson["requestedQty"], + deliveredQuantity: parsedJson["deliverdQty"], ); } @@ -35,6 +35,7 @@ class GasRefillDetails{ return GasRefillDetails( type: Lookup.fromStatus(details.type), cylinderSize:Lookup.fromStatus(details.cylinderSize), + cylinderType:Lookup.fromStatus(details.cylinderType), requestedQuantity: details.requestedQuantity, deliveredQuantity: details.deliveredQuantity, ); diff --git a/lib/models/gas_refill/gas_refill_model.dart b/lib/models/gas_refill/gas_refill_model.dart index 28773fac..ae3331fb 100644 --- a/lib/models/gas_refill/gas_refill_model.dart +++ b/lib/models/gas_refill/gas_refill_model.dart @@ -2,8 +2,8 @@ import 'package:test_sa/models/gas_refill/gas_refill_details.dart'; import 'package:test_sa/models/lookup.dart'; class GasRefillModel{ - String id; - String userId; + int id; + //String userId; String clientName; String title; Lookup status; @@ -11,7 +11,7 @@ class GasRefillModel{ GasRefillModel({ this.id, - this.userId, + //this.userId, this.clientName, this.title, this.status, @@ -27,7 +27,7 @@ class GasRefillModel{ fromGasRefillModel(GasRefillModel model){ id = model.id; - userId = model.userId; + //userId = model.userId; clientName = model.clientName; title = model.title; status = Lookup.fromStatus(model.status); @@ -36,15 +36,16 @@ class GasRefillModel{ factory GasRefillModel.fromJson(Map parsedJson){ List details = []; - if(parsedJson["details"] != null){ - List list = parsedJson["details"]; + if(parsedJson["gazRefillDetails"] != null){ + List list = parsedJson["gazRefillDetails"]; details = list.map((e) => GasRefillDetails.fromJson(e)).toList(); } return GasRefillModel( id: parsedJson["id"], - userId: parsedJson["uid"], - title: parsedJson["title"], - clientName: parsedJson["client"], + //userId: parsedJson["uid"], + title: parsedJson["gazRefillNo"], + clientName: parsedJson["site"] == null ? null: + parsedJson["site"]["custName"], status: Lookup.fromJson(parsedJson["status"]), details: details, ); diff --git a/lib/models/hospital.dart b/lib/models/hospital.dart index 34e2e3a9..432b1748 100644 --- a/lib/models/hospital.dart +++ b/lib/models/hospital.dart @@ -1,5 +1,5 @@ class Hospital{ - String id; + int id; String name; Hospital({ @@ -9,8 +9,8 @@ class Hospital{ factory Hospital.fromJson(Map parsedJson){ return Hospital( - id: parsedJson["nid"] ?? parsedJson["id"], - name: parsedJson["client_name"] ?? parsedJson["value"], + id: parsedJson["id"], + name: parsedJson["custName"], ); } diff --git a/lib/models/lookup.dart b/lib/models/lookup.dart index a52a1698..dd0ba990 100644 --- a/lib/models/lookup.dart +++ b/lib/models/lookup.dart @@ -1,46 +1,66 @@ class Lookup{ - final String label; - final String key; + //old name label + final String name; + // old name key + final int value; final int id; const Lookup({ - this.label, - this.key, + this.name, + this.value, this.id, }); @override bool operator == (Object other) => identical(this, other) || other is Lookup && - key == other.key && - id == other.id; + ((value != null && value == other.value) + || ( id != null && id == other.id )) ; @override - int get hashCode => id.hashCode; + int get hashCode => id?.hashCode ?? value?.hashCode; + + toMap(){ + return { + "id": id, + "name": name, + "value": value + }; + } factory Lookup.fromStatus(Lookup old){ + if(old == null) return null; return Lookup( - label: old.label, + name: old.name, id: old.id, - key: old.key, + value: old.value, ); } factory Lookup.fromJson(Map parsedJson){ - if(parsedJson["id"] == null && parsedJson["uid"] == null) return null; + if(parsedJson == null) return null; return Lookup( - label: parsedJson["value"], - id: parsedJson["id"] is int - ? parsedJson["id"] - : int.tryParse(parsedJson["id"] ?? parsedJson["uid"]), + name: parsedJson["name"], + id: parsedJson["id"], + value: parsedJson["value"] ?? parsedJson["id"], ); } + // factory Lookup.fromJson(Map parsedJson){ + // if(parsedJson["id"] == null && parsedJson["uid"] == null) return null; + // return Lookup( + // name: parsedJson["value"], + // id: parsedJson["id"] is int + // ? parsedJson["id"] + // : int.tryParse(parsedJson["id"] ?? parsedJson["uid"]), + // ); + // } + factory Lookup.fromIntIdJson(Map parsedJson){ return Lookup( - label: parsedJson["value"], + name: parsedJson["value"], id: parsedJson["id"], ); } diff --git a/lib/models/pantry/calibration_tools.dart b/lib/models/pantry/calibration_tools.dart index 2c70c6d2..9e006eac 100644 --- a/lib/models/pantry/calibration_tools.dart +++ b/lib/models/pantry/calibration_tools.dart @@ -1,26 +1,40 @@ import 'package:test_sa/models/lookup.dart'; class CalibrationTool{ + int id; Lookup assetsNumber; DateTime dataOfTesting; CalibrationTool({ + this.id, this.assetsNumber, this.dataOfTesting, }); - Map toMap() { + Map toMap(int visitId) { return { - if(assetsNumber != null) 'assetsSN': (assetsNumber?.id).toString(), - if(dataOfTesting != null) 'dataOfTesting': (dataOfTesting.millisecondsSinceEpoch ~/ 1000).toString(), + "id":id, + "visitId": visitId, + if(assetsNumber != null) 'assetId': (assetsNumber?.id).toString(), + if(dataOfTesting != null) 'calibrationDateOfTesters': dataOfTesting.toIso8601String(), }; } factory CalibrationTool.fromMap(Map map) { return CalibrationTool( - assetsNumber: Lookup.fromJson(map['assetsSN']), - dataOfTesting: map['dataOfTesting'] == null || map['dataOfTesting'] == "" ? null : - DateTime.fromMillisecondsSinceEpoch(int.tryParse(map['dataOfTesting']) * 1000), + assetsNumber: Lookup(id: map["assetId"],name: map['assetSerialNo']), + dataOfTesting: DateTime.tryParse(map['calibrationDateOfTesters'] ?? ""), + ); + } + + CalibrationTool copyWith({ + Lookup assetsNumber, + DateTime dataOfTesting, + }) { + return CalibrationTool( + id: id, + assetsNumber: assetsNumber ?? this.assetsNumber, + dataOfTesting: dataOfTesting ?? this.dataOfTesting, ); } } \ No newline at end of file diff --git a/lib/models/pantry/lookups/contact_person.dart b/lib/models/pantry/lookups/contact_person.dart index 5231712c..156a2086 100644 --- a/lib/models/pantry/lookups/contact_person.dart +++ b/lib/models/pantry/lookups/contact_person.dart @@ -4,7 +4,7 @@ class ContactTitle extends Lookup { ContactTitle({ int id, String label - }):super(id: id,label: label); + }):super(id: id,name: label); factory ContactTitle.fromMap(Map parsedJson){ return ContactTitle( diff --git a/lib/models/pantry/lookups/contact_title.dart b/lib/models/pantry/lookups/contact_title.dart index 5231712c..156a2086 100644 --- a/lib/models/pantry/lookups/contact_title.dart +++ b/lib/models/pantry/lookups/contact_title.dart @@ -4,7 +4,7 @@ class ContactTitle extends Lookup { ContactTitle({ int id, String label - }):super(id: id,label: label); + }):super(id: id,name: label); factory ContactTitle.fromMap(Map parsedJson){ return ContactTitle( diff --git a/lib/models/pantry/pentry.dart b/lib/models/pantry/pentry.dart index cee31181..e624f9e6 100644 --- a/lib/models/pantry/pentry.dart +++ b/lib/models/pantry/pentry.dart @@ -1,5 +1,6 @@ import 'dart:convert'; import 'dart:io'; +import 'dart:typed_data'; import 'package:test_sa/models/lookup.dart'; import 'package:test_sa/models/pantry/calibration_tools.dart'; @@ -13,6 +14,7 @@ class Pentry{ Lookup status; TimerModel timer; DateTime actualVisitDate; + DateTime expectedVisitDate; String travelingHours; String image; File imageFile; @@ -20,6 +22,8 @@ class Pentry{ List ppmCheckLists; List calibrationTools; List pmKits; + String signature; + Uint8List localSignature; Pentry({ this.travelingHours, @@ -27,16 +31,20 @@ class Pentry{ this.status, this.ppmVisitStatus, this.actualVisitDate, + this.expectedVisitDate, this.image, this.imageFile, // this.contacts, this.ppmCheckLists, this.calibrationTools, this.pmKits, + this.signature, + this.localSignature }); bool validate(){ if(actualVisitDate == null) return false; + if(expectedVisitDate == null) return false; if(timer == null && timer.endAt != null) return false; if(ppmVisitStatus == null) return false; //if(status == null) return false; @@ -44,18 +52,29 @@ class Pentry{ return true; } - Map toMap() { - Map map = {}; - map["visit_status"] = ppmVisitStatus?.id.toString(); - if(status != null) map["pentry_status"] = status?.id.toString(); - if(travelingHours != null) map["traveling_hours"] = travelingHours; - if(imageFile != null) map["file_attachement"] = base64Encode(imageFile.readAsBytesSync()); - map["actual_date"] = (actualVisitDate.millisecondsSinceEpoch / 1000).toStringAsFixed(0); + + + Map toMap(int visitId) { + Map map = {}; + map["visitStatusId"] = ppmVisitStatus?.id.toString(); + if(status != null) map["visitStatusId"] = status?.id.toString(); + if(travelingHours != null) map["travelingHours"] = travelingHours; + //if(imageFile != null) map["file_attachement"] = base64Encode(imageFile.readAsBytesSync()); + map["actualDate"] = actualVisitDate.toIso8601String(); + map["expectedDate"] = expectedVisitDate.toIso8601String(); if(timer != null){ - map["start_date"] = (timer.startAt.millisecondsSinceEpoch / 1000).toStringAsFixed(0); - map["end_date"] = ((timer.endAt ?? DateTime.now()).millisecondsSinceEpoch / 1000).toStringAsFixed(0); - map["working_hours"] = (timer.durationInSecond / 60 / 60).toStringAsFixed(5); + map["startDate"] = timer.startAt.toIso8601String(); + map["endDate"] = timer.endAt?.toIso8601String() ?? DateTime.now().toIso8601String(); + map["workingHours"] = (timer.durationInSecond / 60 / 60).toStringAsFixed(5); + } + if(imageFile !=null){ + map["vAttachments"]=[ + { + "attachmentName":(imageFile.path.split("/").last+base64Encode(imageFile.readAsBytesSync())) + } + ]; } + // if(contacts?.isNotEmpty == true) { // for(int i = 0;i e.toMap()).toList()); - map["calibrationTools"] = jsonEncode(calibrationTools.map((e) => e.toMap()).toList()); - map["pmKits"] = jsonEncode(pmKits.map((e) => e.toMap()).toList()); + map["vChecklists"] = ppmCheckLists.map((e) => e.toMap(visitId)).toList(); + map["vCalibrationTools"] = calibrationTools.map((e) => e.toMap(visitId)).toList(); + map["vKits"] = pmKits.map((e) => e.toMap(visitId)).toList(); + map["signature"] = signature; return map; } @@ -78,44 +98,71 @@ class Pentry{ // } List pmKits = []; - if(map['pmKits'] != null){ - pmKits =(map['pmKits'] as List) + if(map['vKits'] != null){ + pmKits =(map['vKits'] as List) .map((e) => PMKit.fromMap(e as Map)) .toList(); } List ppmCheckLists = []; - if(map['ppmCheckLists'] != null){ - ppmCheckLists =(map['ppmCheckLists'] as List) + if(map['vChecklists'] != null){ + ppmCheckLists =(map['vChecklists'] as List) .map((e) => PPMCheckList.fromMap(e as Map)) .toList(); } List calibrationTools = []; - if(map['calibrationTools'] != null){ - calibrationTools =(map['calibrationTools'] as List) + if(map['vCalibrationTools'] != null){ + calibrationTools =(map['vCalibrationTools'] as List) .map((e) => CalibrationTool.fromMap(e as Map)) .toList(); } return Pentry( - status: Lookup.fromJson(map["pentry_status"]), - ppmVisitStatus: Lookup.fromJson(map["visit_status"]), - actualVisitDate: getDate(map["actual_date"]), - travelingHours: map["traveling_hours"], + status: Lookup(id: map["taskStatusId"],name: map["taskStatusName"]), + ppmVisitStatus: Lookup(id: map["visitStatusId"],name: map["visitStatusName"]), + actualVisitDate: DateTime.tryParse(map["actualDate"] ?? ""), + expectedVisitDate: DateTime.tryParse(map["expectedDate"] ?? ""), + travelingHours: map["travelingHours"], timer: TimerModel( - startAt: getDate(map["start_date"]), - endAt: getDate(map["end_date"]), - durationInSecond: (int.tryParse(map["working_hours"] ?? "") ?? 0) * 60 *60 + startAt: DateTime.tryParse(map["startDate"] ?? ""), + endAt: DateTime.tryParse(map["endDate"] ?? ""), + durationInSecond: (int.tryParse(map["workingHours"] ?? "") ?? 0) * 60 *60 ), // contacts: contacts, ppmCheckLists: ppmCheckLists, calibrationTools: calibrationTools, pmKits: pmKits, + signature: map["signature"], ); } - static getDate(String date){ - return date == null || date.isEmpty - ? null : DateTime.fromMillisecondsSinceEpoch(int.tryParse(date) * 1000); + Pentry copyWith({ + Lookup ppmVisitStatus, + Lookup status, + TimerModel timer, + DateTime actualVisitDate, + DateTime expectedVisitDate, + String travelingHours, + String image, + File imageFile, + List ppmCheckLists, + List calibrationTools, + List pmKits, + String signature + }) { + return Pentry( + ppmVisitStatus: ppmVisitStatus ?? this.ppmVisitStatus, + status: status ?? this.status, + timer: timer ?? this.timer, + actualVisitDate: actualVisitDate ?? this.actualVisitDate, + expectedVisitDate: expectedVisitDate ?? this.expectedVisitDate, + travelingHours: travelingHours ?? this.travelingHours, + image: image ?? this.image, + imageFile: imageFile ?? this.imageFile, + ppmCheckLists: ppmCheckLists ?? this.ppmCheckLists?.map((e) => e.copyWith())?.toList(), + calibrationTools: calibrationTools ?? this.calibrationTools?.map((e) => e.copyWith())?.toList(), + pmKits: pmKits ?? this.pmKits.map((e) => e.copyWith()).toList(), + signature: signature ?? this.signature + ); } } \ No newline at end of file diff --git a/lib/models/pantry/pm_kit.dart b/lib/models/pantry/pm_kit.dart index 0a008e5f..ddb75a40 100644 --- a/lib/models/pantry/pm_kit.dart +++ b/lib/models/pantry/pm_kit.dart @@ -1,6 +1,7 @@ import 'package:test_sa/models/lookup.dart'; class PMKit{ + int id; Lookup itemCode; String itemName; String preparationTimeFrame; @@ -10,6 +11,7 @@ class PMKit{ String quantityReserved; PMKit({ + this.id, this.itemCode, this.itemName, this.preparationTimeFrame, @@ -19,21 +21,24 @@ class PMKit{ this.quantityReserved }); - Map toMap() { + Map toMap(int visitId) { return { - if(itemCode != null) 'itemCode': (itemCode?.id).toString(), - if(itemName != null) 'itemName': itemName, - if(preparationTimeFrame != null) 'preparationTimeFrame': preparationTimeFrame, - if(kitFrequencyDemand != null) 'kitFrequencyDemand': kitFrequencyDemand, - if(availability != null) 'availability': availability, - if(quantityNeeded != null) 'quantityNeeded': quantityNeeded, - if(quantityReserved != null) 'quantityReserved': quantityReserved, + "id":id, + "visitId": visitId, + if(itemCode != null) 'partCatalogItemId': (itemCode?.id).toString(), + // if(itemName != null) 'itemName': itemName, + // if(preparationTimeFrame != null) 'preparationTimeFrame': preparationTimeFrame, + // if(kitFrequencyDemand != null) 'kitFrequencyDemand': kitFrequencyDemand, + // if(availability != null) 'availability': availability, + // if(quantityNeeded != null) 'quantityNeeded': quantityNeeded, + // if(quantityReserved != null) 'quantityReserved': quantityReserved, }; } factory PMKit.fromMap(Map map) { return PMKit( - itemCode: Lookup.fromJson(map['itemCode']), + id: map['id'], + //itemCode: Lookup.fromJson(map['itemCode']), itemName: map['itemName'] as String, preparationTimeFrame: map['preparationTimeFrame'] as String, kitFrequencyDemand: map['kitFrequencyDemand'] as String, @@ -42,4 +47,26 @@ class PMKit{ quantityReserved: map['quantityReserved'] as String, ); } + + PMKit copyWith({ + int id, + Lookup itemCode, + String itemName, + String preparationTimeFrame, + String kitFrequencyDemand, + String availability, + String quantityNeeded, + String quantityReserved, + }) { + return PMKit( + id: id ?? this.id, + itemCode: itemCode ?? this.itemCode, + itemName: itemName ?? this.itemName, + preparationTimeFrame: preparationTimeFrame ?? this.preparationTimeFrame, + kitFrequencyDemand: kitFrequencyDemand ?? this.kitFrequencyDemand, + availability: availability ?? this.availability, + quantityNeeded: quantityNeeded ?? this.quantityNeeded, + quantityReserved: quantityReserved ?? this.quantityReserved, + ); + } } \ No newline at end of file diff --git a/lib/models/pantry/ppm_check_list.dart b/lib/models/pantry/ppm_check_list.dart index 8f1a14d7..cbf750bc 100644 --- a/lib/models/pantry/ppm_check_list.dart +++ b/lib/models/pantry/ppm_check_list.dart @@ -1,33 +1,54 @@ import 'package:test_sa/models/lookup.dart'; class PPMCheckList{ + int id; Lookup status; String title; String comment; String measuredValue; PPMCheckList({ + this.id, this.title, this.status, this.comment, this.measuredValue, }); - Map toMap() { + Map toMap(int visitId) { return { - if(status != null) 'status': status?.id.toString(), - if(title != null) 'title': title, - if(comment != null) 'comment': comment, + 'id': id, + "visitId": visitId, + if(status != null) 'taskStatusId': status?.id.toString(), + if(title != null) 'task': title, + if(comment != null) 'taskComment': comment, if(measuredValue != null) 'measuredValue': measuredValue, }; } factory PPMCheckList.fromMap(Map map) { return PPMCheckList( - status: Lookup.fromJson(map['status']), - title: map['title'] as String, - comment: map['comment'] as String, + id: map['id'] as int, + status: Lookup(id: map["taskStatusId"],name: map["taskStatusName"]), + title: map['task'] as String, + comment: map['taskComment'] as String, measuredValue: map['measuredValue'] as String, ); } + + PPMCheckList copyWith({ + int id, + Lookup status, + String title, + String comment, + String measuredValue, + }) { + return PPMCheckList( + id: id ?? this.id, + status: status ?? this.status, + title: title ?? this.title, + comment: comment ?? this.comment, + measuredValue: measuredValue ?? this.measuredValue, + ); + } } \ No newline at end of file diff --git a/lib/models/part.dart b/lib/models/part.dart index d75bb493..5589d9b0 100644 --- a/lib/models/part.dart +++ b/lib/models/part.dart @@ -1,5 +1,5 @@ class Part{ - String id; + int id; String code; String name; int quantity; @@ -13,11 +13,11 @@ class Part{ factory Part.fromJson(Map parsedJson){ return Part( - id: parsedJson["nid"] ?? parsedJson["id"], - code: parsedJson["part_code"] ?? parsedJson["name"], - name: parsedJson["part_name"], - quantity: parsedJson["qty"] == null - ? 1 : int.tryParse(parsedJson["qty"].toString()) ?? 1, + id: parsedJson["id"], + code: parsedJson["partNo"], + name: parsedJson["partName"], + quantity: parsedJson["partQuantity"] == null + ? 1 : int.tryParse(parsedJson["partQuantity"].toString()) ?? 1, ); } } \ No newline at end of file diff --git a/lib/models/service_report.dart b/lib/models/service_report.dart index 33bb2fd2..01b75bec 100644 --- a/lib/models/service_report.dart +++ b/lib/models/service_report.dart @@ -52,12 +52,12 @@ class ServiceReport { this.timer, }); - Map toMap(){ + Map toMap(){ Map _map = {}; if(id != null) _map["id"] = id; if(visitDate != null) _map["visit_date"] = (visitDate.millisecondsSinceEpoch ~/ 1000).toString(); if(serviceType != null) _map["service_type"] = serviceType.id.toString(); - if(status != null) _map["status"] = status.id.toString(); + if(status != null) _map["status"] = status.toMap(); if(type != null) _map["service_report_type"] = type.id.toString(); if(faultDescription != null && faultDescription.isNotEmpty) _map["fault_description"] = faultDescription; //if(workHours != null && workHours.isNotEmpty) _map["working_hours"] = workHours; @@ -71,18 +71,18 @@ class ServiceReport { if(jobSheetNumber != null && jobSheetNumber.isNotEmpty) _map["job_sheet_no"] = jobSheetNumber; if(parts != null && parts.isNotEmpty){ Map _partsMap = {}; - parts.forEach((part) { - if(part.id.isNotEmpty) - _partsMap[part.id] = part.quantity; - }); + // parts.forEach((part) { + // if(part.id == null) + // _partsMap[part.id] = part.quantity; + // }); _map["parts"] = json.encode(_partsMap); } - if(device?.id != null && device.id != null) _map["eq_id"] = device.id; + //if(device?.id != null && device.id != null) _map["eq_id"] = device.id; if(quantity != null && quantity.isNotEmpty) _map["qty"] = quantity; if(endDate != null) _map["end_date"] = (endDate.millisecondsSinceEpoch ~/ 1000).toString(); - if(reason != null) _map["reasons"] = reason.id.toString(); + if(reason != null) _map["reasons"] = reason.toMap(); if(operatingHours != null && operatingHours.isNotEmpty) _map["operation_hours"] = operatingHours; - if(callLastSituation != null) _map["call_last_situtation"] = callLastSituation.id.toString(); + if(callLastSituation != null) _map["calllastSituation"] = callLastSituation.id.toString(); if(image != null) _map["image"] = image; if(invoiceCode != null) _map["invoice_no"] = invoiceCode; if(invoiceNumber != null) _map["invoice_code"] = invoiceNumber; @@ -102,7 +102,8 @@ class ServiceReport { if(parts == null) return false; //if(endDate == null) return false; //if(reason == null) return false; - if((device?.id == null || device.id.isEmpty) && type?.id != 1) return false; + //todo uncoment this line + //if((device?.id == null || device.id.isEmpty) && type?.id != 1) return false; //if(quantity == null || quantity.isEmpty) return false; //if(image == null) return false; return true; diff --git a/lib/models/service_request/service_request.dart b/lib/models/service_request/service_request.dart index ae6f9370..23f178a8 100644 --- a/lib/models/service_request/service_request.dart +++ b/lib/models/service_request/service_request.dart @@ -1,3 +1,4 @@ +import 'package:test_sa/controllers/api_routes/urls.dart'; import 'package:test_sa/models/lookup.dart'; import '../timer_model.dart'; @@ -6,13 +7,13 @@ class ServiceRequest{ String id; String requestCode; String deviceSerialNumber; - String deviceId; + int deviceId; String deviceArName; String deviceEnName; List devicePhotos; String maintenanceIssue; String hospitalName; - String hospitalId; + int hospitalId; String departmentName; String engineerName; String date; @@ -32,6 +33,8 @@ class ServiceRequest{ String deviceNumber; Lookup priority; Lookup defectType; + Lookup type; + Lookup requestedThrough; ServiceRequest({ this.id, @@ -63,42 +66,48 @@ class ServiceRequest{ this.defectType, this.priority, this.deviceNumber, - + this.type, + this.requestedThrough, }); factory ServiceRequest.fromJson(Map parsedJson){ + List images = []; + if(parsedJson["attachmentsCallRequest"] is List){ + List list = parsedJson["attachmentsCallRequest"]; + images = list.map((e) => URLs.getFileUrl(e["attachmentsCallRequest"])).toList(); + } return ServiceRequest( - id: parsedJson["nid"], - requestCode: parsedJson["call_id"] ?? parsedJson["jobcode"] , - hospitalName: parsedJson["call_client"], - deviceNumber: parsedJson["device_no"], - deviceId: parsedJson["deviceid"], - audio: parsedJson["audio"] ?? "", - deviceArName: parsedJson["equipment_arabic_name"] == false - ? "No Name found" : parsedJson["equipment_arabic_name"], - deviceEnName: parsedJson["equipment_english_name"] == false - ? "No Name found" : parsedJson["equipment_english_name"], - devicePhotos: List.from(parsedJson["image"]), - deviceSerialNumber: parsedJson["call_sn"], - date: parsedJson["call_data"], - maintenanceIssue: parsedJson["call_complaint"] ?? parsedJson["complaint"], - statusLabel: parsedJson["status_value"], - statusValue: int.tryParse(parsedJson["status"]??"-1"), - departmentName: parsedJson["department_name"], - engineerName: parsedJson["employee_name"], - hospitalId: parsedJson["client"], - reportID: parsedJson["service_report_nid"] is String - ? parsedJson["service_report_nid"] - : null , - viewReport: parsedJson["service_report_nid"] is bool ? false : true, - deviceModel: parsedJson["device_model"], - engineerMobile: parsedJson["engineer_mobile"], - faultDescription: parsedJson["fault_desc"], - jobSheetNumber: parsedJson["job_sheet_number"], - visitDate: parsedJson["visit_date"], - nextVisitDate:parsedJson["next_visit_date"] == null - ? null : DateTime.fromMillisecondsSinceEpoch(int.tryParse(parsedJson["next_visit_date"]) * 1000), - workPerformed: parsedJson["work_performed"], + id: parsedJson["id"].toString(), + requestCode: parsedJson["callNo"].toString(), + hospitalName: parsedJson["asset"]["site"]["custName"], + deviceNumber: parsedJson["asset"]["assetNumber"].toString(), + deviceId: parsedJson["asset"]["id"], + audio: URLs.getFileUrl(parsedJson["voiceNote"] ?? ""), + deviceArName: parsedJson["asset"]["modelDefinition"]["assetName"] ?? "", + deviceEnName: parsedJson["asset"]["modelDefinition"]["assetName"] ?? "", + devicePhotos: images, + deviceSerialNumber: parsedJson["asset"]["assetSerialNo"], + date: DateTime.tryParse(parsedJson["requestedDate"] ?? "").toString().split(" ").first, + maintenanceIssue: parsedJson["comments"], + statusLabel: parsedJson["status"] == null ? null : + parsedJson["status"]["name"], + statusValue: parsedJson["status"] == null ? null : + parsedJson["status"]["value"], + departmentName: parsedJson["asset"]["department"] != null ? + parsedJson["asset"]["department"]["name"] : "", + engineerName: parsedJson["assignedEmployee"] == null ? null : + parsedJson["assignedEmployee"]["name"], + hospitalId: parsedJson["asset"]["site"]["id"], + reportID: parsedJson["workOrder"]["id"].toString(), + viewReport: parsedJson["workOrder"] != null, + deviceModel: parsedJson["asset"]["modelDefinition"]["modelName"], + engineerMobile: parsedJson["assignedEmployee"] == null ? null : + parsedJson["assignedEmployee"]["phone"], + faultDescription: parsedJson["workOrder"]["faultDescription"], + jobSheetNumber: parsedJson["workOrder"]["jobSheetNumber"], + visitDate: DateTime.tryParse(parsedJson["visitDate"] ?? "").toString().split(" ").first, + nextVisitDate: DateTime.tryParse(parsedJson["nextVisitDate"] ?? ""), + workPerformed: parsedJson["workOrder"]["workPerformed"], ); } } \ No newline at end of file diff --git a/lib/models/service_request/service_request_search.dart b/lib/models/service_request/service_request_search.dart index 257f25f5..cd2adf04 100644 --- a/lib/models/service_request/service_request_search.dart +++ b/lib/models/service_request/service_request_search.dart @@ -1,13 +1,18 @@ +import 'package:test_sa/models/hospital.dart'; +import 'package:test_sa/models/lookup.dart'; + class ServiceRequestSearch{ String deviceSerialNumber; + String deviceNumber; String deviceName; - String hospital; + Hospital hospital; String model; - int statusValue; + Lookup statusValue; ServiceRequestSearch({ this.deviceSerialNumber, + this.deviceNumber, this.statusValue, this.deviceName, this.model, @@ -16,31 +21,38 @@ class ServiceRequestSearch{ fromSearch(ServiceRequestSearch newSearch){ deviceSerialNumber = newSearch.deviceSerialNumber; + deviceNumber = newSearch.deviceNumber; statusValue = newSearch.statusValue; hospital = newSearch.hospital; model = newSearch.model; } - String toSearchString(){ - String _search = ""; + Map toMap(){ + Map search = {}; if(deviceSerialNumber != null && deviceSerialNumber.isNotEmpty){ - _search += "&sn_id=$deviceSerialNumber"; + search["assetSerialNumber"] = deviceSerialNumber; + } + + if(deviceNumber != null && deviceNumber.isNotEmpty){ + search["assetNo"] = deviceNumber; } if(statusValue != null){ - _search += "&status=$statusValue"; + search["status"] = statusValue.toMap(); } if(deviceName != null && deviceName.isNotEmpty){ - _search += "&equipment_en_name=$deviceName"; + search["assetName"] = deviceName; + } - if(hospital != null && hospital.isNotEmpty){ - _search += "&client=$hospital"; + if(hospital != null){ + search["site"] = hospital.name; } - if(model != null && model.isNotEmpty){ - _search += "&model=$model"; + + if(model != null){ + search["modelDefinition"] = model; } - return _search; + return search; } } \ No newline at end of file diff --git a/lib/models/user.dart b/lib/models/user.dart index b091856f..6aabf108 100644 --- a/lib/models/user.dart +++ b/lib/models/user.dart @@ -8,7 +8,6 @@ class User{ String userName; String password; String email; - String image; Hospital hospital; Department department; UsersTypes type; @@ -16,6 +15,7 @@ class User{ String whatsApp; String token; bool isActive; + DateTime tokenLife; User({ @@ -25,11 +25,11 @@ class User{ this.password = "", this.phoneNumber = "", this.hospital, - this.image, this.department, this.type, this.whatsApp, this.token, + this.tokenLife, this.isActive = false }); @@ -38,14 +38,14 @@ class User{ await FirebaseNotificationManger.getToken(); return { "username":userName, - "pass":password, + "password":password, "firebase_token": FirebaseNotificationManger?.token ?? "", }; } Map toUpdateProfileJson(){ Map jsonObject ={}; - if(department?.id != null && department.id.isNotEmpty) + if(department?.id != null) jsonObject["department"] = department.id; if(whatsApp != null && whatsApp.isNotEmpty) jsonObject["whatsapp"] = whatsApp; @@ -71,48 +71,52 @@ class User{ Map toJson(){ return { - "uid":id, - "name": userName, + "userID":id, + "username": userName, "email":email, "token":token, - "phone":phoneNumber, + "phoneNumber":phoneNumber, "whatsapp":whatsApp, - "client":hospital?.id, + "client_id":hospital?.id, "client_name":hospital?.name, - "department":department?.id, + "department_id":department?.id, "department_name":department?.name, - "password":password, - "picture":image, - "active":isActive ? 1 : 0, - "role": type == UsersTypes.engineer - ? "field_engineer" : "normal_user" , + //"password":password, + "tokenlife":tokenLife.toIso8601String(), + "active":isActive, + "userRoles": type == UsersTypes.engineer + ? "value: R-6" : "value: R-5" , // "token":token, pass is token }; } factory User.fromJson(Map parsedJson){ UsersTypes type; - switch(parsedJson["role"]){ - case "field_engineer": type = UsersTypes.engineer; break; - default: type = UsersTypes.normal_user; break; + if(parsedJson["userRoles"].toString().contains("value: R-4") + || parsedJson["userRoles"].toString().contains("value: R-5") + || parsedJson["userRoles"].toString().contains("value: R-7")){ + type = UsersTypes.normal_user; + } else { + type = UsersTypes.engineer; } + print(parsedJson); return User( - id: parsedJson["uid"], - userName: parsedJson["name"] ?? parsedJson["title"], - email: parsedJson["mail"] ?? parsedJson["email"], - hospital: Hospital( - id: parsedJson["client"], - name: parsedJson["client_name"] - ), + id: parsedJson["userID"], + userName: parsedJson["username"], + email: parsedJson["email"], + // hospital: Hospital( + // id: parsedJson["client_id"], + // name: parsedJson["client_name"] + // ), department: Department( - id: parsedJson["department"], + id: parsedJson["department_id"], name: parsedJson["department_name"], ), - image: parsedJson["picture"], - phoneNumber: parsedJson["phone"], - whatsApp: parsedJson["whatsapp"], + phoneNumber: parsedJson["phoneNumber"], + whatsApp: parsedJson["phoneNumber"], token: parsedJson["token"], - isActive: parsedJson["active"] == "1", + isActive: parsedJson["isAuthenticated"], + tokenLife: DateTime.tryParse(parsedJson["tokenlife"]??""), type:type ); } diff --git a/lib/models/visits/visit.dart b/lib/models/visits/visit.dart index da3a2143..7554ecd4 100644 --- a/lib/models/visits/visit.dart +++ b/lib/models/visits/visit.dart @@ -1,21 +1,22 @@ import 'package:test_sa/models/lookup.dart'; +import 'package:test_sa/models/pantry/pentry.dart'; import 'package:test_sa/models/timer_model.dart'; class Visit{ - String id; + int id; String serialNumber; String expectDate; String actualDate; - String hospitalId; + int hospitalId; String hospitalName; - String deviceId; + int deviceId; String deviceSerialNumber; String deviceArabicName; String deviceEnglishName; String employId; String employName; String modelAndBrand; - String contactStatus; + Pentry pentry; Lookup status; String assignTo; String deviceNumber; @@ -36,35 +37,41 @@ class Visit{ this.actualDate, this.status, this.modelAndBrand, - this.contactStatus, + this.pentry, this.images, this.assignTo, this.deviceNumber, }); factory Visit.fromJson(Map parsedJson){ + List images = []; + if(parsedJson["vAttachments"] is List){ + List list = parsedJson["vAttachments"]; + images = list.map((e) => e["attachmentURL"].toString()).toList(); + } return Visit( - id: parsedJson["nid"], - serialNumber: parsedJson["title"], - hospitalId: parsedJson["client"], - deviceNumber: parsedJson["device_no"], - hospitalName: parsedJson["client_name"], - deviceId: parsedJson["medical_equipment_nid"], - deviceSerialNumber: parsedJson["medical_equipment"], - deviceEnglishName: parsedJson["equipment_english_name"], - deviceArabicName: parsedJson["equipment_arabic_name"], - employId: parsedJson["assigned_employee"], - employName: parsedJson["assigned_employee_name"], - expectDate: parsedJson["expected_date"], - actualDate: parsedJson["actual_date"], - modelAndBrand: parsedJson["mode_brand"], - contactStatus: parsedJson["contactStatus"], - images: List.from(parsedJson["images"] ?? []), + id: parsedJson["id"], + serialNumber: parsedJson["visitCode"], + hospitalId: parsedJson["siteId"], + deviceNumber: parsedJson["assetNumber"], + hospitalName: parsedJson["siteName"], + deviceId: parsedJson["assetId"], + deviceSerialNumber: parsedJson["assetSerialNo"], + deviceEnglishName: parsedJson["assetName"], + deviceArabicName: parsedJson["assetName"], + employId: parsedJson["assignedToId"].toString(), + employName: parsedJson["assignedToName"], + expectDate: parsedJson["expectedDate"].toString().split("T").first, + actualDate: parsedJson["actualDate"].toString().split("T").first, + modelAndBrand: "${parsedJson["modelName"]} / ${parsedJson["manufacturerName"]}", + // contactStatus: parsedJson["contactStatus"], + images: images, status: Lookup( - id: int.tryParse(parsedJson["status"] ?? "-1"), // actual value (0,1,2) - label: parsedJson["status_value"] // text value + id: parsedJson["visitStatusId"], // actual value (0,1,2) + name: parsedJson["visitStatusName"] // text value ), - assignTo: parsedJson["assigned_to"], + assignTo: parsedJson["assignedToName"], + pentry: Pentry.fromMap(parsedJson) ); } } \ No newline at end of file diff --git a/lib/models/visits/visits_group.dart b/lib/models/visits/visits_group.dart index abe6dfc0..3f47b8cf 100644 --- a/lib/models/visits/visits_group.dart +++ b/lib/models/visits/visits_group.dart @@ -1,43 +1,47 @@ +import 'package:test_sa/models/engineer.dart'; import 'package:test_sa/models/lookup.dart'; import 'package:test_sa/models/visits/visit.dart'; class VisitsGroup{ - String userId; - String workingHours; - String travelingHours; - String jobSheetNumber; - String image; - Lookup status; - Lookup taskStatus; - DateTime date; + // String userId; + // String workingHours; + // String travelingHours; + // String jobSheetNumber; + // String image; + // Lookup status; + // Lookup taskStatus; + // DateTime date; + Engineer engineer; List visits; VisitsGroup({ - this.userId, - this.status, - this.date, - this.jobSheetNumber, - this.travelingHours, - this.workingHours, - this.visits, - this.image, - this.taskStatus, + // this.userId, + // this.status, + // this.date, + // this.jobSheetNumber, + // this.travelingHours, + // this.workingHours, + this.visits, + this.engineer, + // this.image, + // this.taskStatus, }); - Map toJson(){ - Map jsonObject = {}; - jsonObject["nids"] = visits.map((e) => e.id).toList().join(','); - if(status != null) jsonObject["status"] = status.id.toString(); - if(date != null) jsonObject["date"] = date.toString().split(" ").first; - if(jobSheetNumber != null && jobSheetNumber.isNotEmpty) - jsonObject["job_sheet_no"] = jobSheetNumber; - if(travelingHours != null && travelingHours.isNotEmpty) - jsonObject["traveling_hours"] = travelingHours; - if(workingHours != null && workingHours.isNotEmpty) - jsonObject["working_hours"] = workingHours; - if(image != null) jsonObject["image"] = image; - if(taskStatus != null) jsonObject["task_status"] = taskStatus.id.toString(); + Map toJson(){ + Map jsonObject = {}; + jsonObject["ids"] = visits.map((e) => e.id).toList(); + jsonObject["assignedEmployeeId"] = engineer?.id; + // if(status != null) jsonObject["taskStatusId"] = status.id.toString(); + // if(date != null) jsonObject["actualDate"] = date.toIso8601String(); + // if(jobSheetNumber != null && jobSheetNumber.isNotEmpty) + // jsonObject["jobSheetNo"] = jobSheetNumber; + // if(travelingHours != null && travelingHours.isNotEmpty) + // jsonObject["travelingHours"] = travelingHours; + // if(workingHours != null && workingHours.isNotEmpty) + // jsonObject["workingHours"] = workingHours; + // if(image != null) jsonObject["image"] = image; + // if(taskStatus != null) jsonObject["task_status"] = taskStatus.id.toString(); return jsonObject; } diff --git a/lib/models/visits/visits_search.dart b/lib/models/visits/visits_search.dart index 7cfd4ceb..737277f8 100644 --- a/lib/models/visits/visits_search.dart +++ b/lib/models/visits/visits_search.dart @@ -1,20 +1,23 @@ +import 'package:test_sa/models/hospital.dart'; +import 'package:test_sa/models/lookup.dart'; + class VisitsSearch{ String deviceSerialNumber; - String hospitalName; + Hospital hospital; String brand; - String model; - String contactStatus; + Lookup model; + Lookup contactStatus; DateTime expectedDateFrom; DateTime expectedDateTo; DateTime actualDateFrom; DateTime actualDateTo; - int statusValue; + Lookup statusValue; VisitsSearch({ this.deviceSerialNumber, this.statusValue, this.brand, - this.hospitalName, + this.hospital, this.actualDateTo, this.actualDateFrom, this.model, @@ -26,7 +29,7 @@ class VisitsSearch{ fromSearch(VisitsSearch newSearch){ deviceSerialNumber = newSearch.deviceSerialNumber; brand = newSearch.brand; - hospitalName = newSearch.hospitalName; + hospital = newSearch.hospital; actualDateTo = newSearch.actualDateTo; actualDateFrom = newSearch.actualDateFrom; model = newSearch.model; @@ -36,46 +39,47 @@ class VisitsSearch{ statusValue = newSearch.statusValue; } - String toSearchString(){ - String _search = ""; + Map toMap(){ + Map _search = {}; if(deviceSerialNumber != null && deviceSerialNumber.isNotEmpty){ - _search += "&sn_id=$deviceSerialNumber"; + _search["assetId"]= deviceSerialNumber; } - if(hospitalName != null && hospitalName.isNotEmpty){ - _search += "&client=$hospitalName"; + if(hospital != null){ + _search["siteId"]= hospital.id; } if(brand != null && brand.isNotEmpty){ - _search += "&brand=$brand"; + // todo get new key + _search[""]= brand; } - if(model != null && model.isNotEmpty){ - _search += "&model=$model"; + if(model != null){ + _search["modelId"]= model.id; } if(expectedDateFrom != null){ - _search += "&expected_date_from=${expectedDateFrom.millisecondsSinceEpoch ~/ 1000}"; + _search["expectedDateFrom"]= expectedDateFrom.toIso8601String(); } if(expectedDateTo != null){ - _search += "&expected_date_to=${expectedDateTo.millisecondsSinceEpoch~/1000}"; + _search["expectedDateTo"]= expectedDateTo.toIso8601String(); } if(actualDateFrom != null){ - _search += "&actual_date_from=${actualDateFrom.millisecondsSinceEpoch ~/ 1000}"; + _search["actualDateFrom"]= actualDateFrom.toIso8601String(); } if(actualDateTo != null){ - _search += "&actual_date_to=${actualDateTo.millisecondsSinceEpoch~/1000}"; + _search["actualDateTo"]= actualDateTo.toIso8601String(); } if(statusValue != null){ - _search += "&status=$statusValue"; + _search["visitStatusId"]= statusValue.id; } if(contactStatus != null){ - _search += "&assigned_to=$contactStatus"; + _search["assignedToId"]= contactStatus.id; } return _search; } diff --git a/lib/views/pages/device_transfer/device_transfer_details.dart b/lib/views/pages/device_transfer/device_transfer_details.dart index 7b36058c..6975304b 100644 --- a/lib/views/pages/device_transfer/device_transfer_details.dart +++ b/lib/views/pages/device_transfer/device_transfer_details.dart @@ -108,7 +108,7 @@ class _DeviceTransferDetailsState extends State { style: Theme.of(context).textTheme.headline6 ), ), - if(_isSender) + if(_isSender || true) ASmallButton( text: _subtitle.edit, onPressed: (){ @@ -134,7 +134,7 @@ class _DeviceTransferDetailsState extends State { style: Theme.of(context).textTheme.headline6 ), ), - if(_isReceiver) + if(_isReceiver || true) ASmallButton( text: _subtitle.edit, onPressed: (){ diff --git a/lib/views/pages/device_transfer/request_device_transfer.dart b/lib/views/pages/device_transfer/request_device_transfer.dart index aa5562b9..30c9310a 100644 --- a/lib/views/pages/device_transfer/request_device_transfer.dart +++ b/lib/views/pages/device_transfer/request_device_transfer.dart @@ -1,7 +1,7 @@ import 'package:flutter/material.dart'; import 'package:fluttertoast/fluttertoast.dart'; import 'package:provider/provider.dart'; -import 'package:test_sa/controllers/http_status_manger/http_status_manger.dart'; +import 'package:test_sa/controllers/api_routes/http_status_manger.dart'; import 'package:test_sa/controllers/providers/api/device_transfer_provider.dart'; import 'package:test_sa/controllers/providers/api/user_provider.dart'; import 'package:test_sa/controllers/providers/settings/setting_provider.dart'; @@ -33,7 +33,7 @@ class _RequestDeviceTransferState extends State { SettingProvider _settingProvider; DeviceTransferProvider _deviceTransferProvider; final TextEditingController _requestedQuantityController = TextEditingController(); - final DeviceTransfer _formModel = DeviceTransfer(receiver: DeviceTransferInfo()); + final DeviceTransfer _formModel = DeviceTransfer(receiver: DeviceTransferInfo(),sender: DeviceTransferInfo()); final GlobalKey _formKey = GlobalKey(); final GlobalKey _scaffoldKey = GlobalKey(); @@ -57,7 +57,7 @@ class _RequestDeviceTransferState extends State { _isLoading = true; setState(() {}); - + _formModel.sender.client.id = _userProvider.user.hospital?.id; int status = await _deviceTransferProvider.createRequest( user: _userProvider.user, host: _settingProvider.host, diff --git a/lib/views/pages/device_transfer/update_device_transfer.dart b/lib/views/pages/device_transfer/update_device_transfer.dart index 2b407a48..7604e2ce 100644 --- a/lib/views/pages/device_transfer/update_device_transfer.dart +++ b/lib/views/pages/device_transfer/update_device_transfer.dart @@ -4,7 +4,7 @@ import 'package:flutter/foundation.dart'; import 'package:flutter/material.dart'; import 'package:fluttertoast/fluttertoast.dart'; import 'package:provider/provider.dart'; -import 'package:test_sa/controllers/http_status_manger/http_status_manger.dart'; +import 'package:test_sa/controllers/api_routes/http_status_manger.dart'; import 'package:test_sa/controllers/providers/api/device_transfer_provider.dart'; import 'package:test_sa/controllers/providers/api/user_provider.dart'; import 'package:test_sa/controllers/providers/settings/setting_provider.dart'; @@ -69,22 +69,12 @@ class _UpdateDeviceTransferState extends State { _validate = false; Navigator.of(context).pop(); Navigator.of(context).pop(); - }else{ - String errorMessage = HttpStatusManger.getStatusMessage( - status: status, subtitle: _subtitle); - ScaffoldMessenger.of(context).showSnackBar( - SnackBar( - content: Text( - errorMessage - ), - ) - ); } } @override void setState(VoidCallback fn){ - if(mounted) super.setState(() {}); + if(!mounted) super.setState(() {}); } @override @@ -207,7 +197,9 @@ class _UpdateDeviceTransferState extends State { newSignature: _signature, onSaved: (signature){ _signature = signature; + if(signature == null || signature.isEmpty) return; _formModel.signature = base64Encode(signature); + }, ), Padding( diff --git a/lib/views/pages/login.dart b/lib/views/pages/login.dart index ad8554cd..35e0570c 100644 --- a/lib/views/pages/login.dart +++ b/lib/views/pages/login.dart @@ -1,5 +1,5 @@ import 'package:test_sa/controllers/api_routes/urls.dart'; -import 'package:test_sa/controllers/http_status_manger/http_status_manger.dart'; +import 'package:test_sa/controllers/api_routes/http_status_manger.dart'; import 'package:test_sa/controllers/localization/localization.dart'; import 'package:test_sa/controllers/notification/notification_manger.dart'; import 'package:test_sa/controllers/providers/api/user_provider.dart'; @@ -119,13 +119,16 @@ class _LoginState extends State { user: _user, host: _settingProvider.host, ); - if(status >= 200 && status < 300){ + if(status >= 200 && status < 300 ){ _settingProvider.setUser(_userProvider.user); - if(_userProvider.user.isActive) - Navigator.of(context).pushNamed(LandPage.id); - else - Fluttertoast.showToast(msg: _subtitle.activationAlert); + Navigator.of(context).pushNamed(LandPage.id); + // if(_userProvider.user.isActive) + // Navigator.of(context).pushNamed(LandPage.id); + // else + // Fluttertoast.showToast(msg: _subtitle.activationAlert); }else{ + if(status >= 400 && status < 500) return; + String errorMessage = status == 400 ? _subtitle.wrongEmailOrPassword : HttpStatusManger.getStatusMessage( diff --git a/lib/views/pages/register.dart b/lib/views/pages/register.dart index 016fedf1..fe347039 100644 --- a/lib/views/pages/register.dart +++ b/lib/views/pages/register.dart @@ -2,7 +2,7 @@ import 'package:flutter/material.dart'; import 'package:fluttertoast/fluttertoast.dart'; import 'package:font_awesome_flutter/font_awesome_flutter.dart'; import 'package:provider/provider.dart'; -import 'package:test_sa/controllers/http_status_manger/http_status_manger.dart'; +import 'package:test_sa/controllers/api_routes/http_status_manger.dart'; import 'package:test_sa/controllers/localization/localization.dart'; import 'package:test_sa/controllers/providers/api/user_provider.dart'; import 'package:test_sa/controllers/providers/settings/setting_provider.dart'; diff --git a/lib/views/pages/splash_screen.dart b/lib/views/pages/splash_screen.dart index aea53176..9892b126 100644 --- a/lib/views/pages/splash_screen.dart +++ b/lib/views/pages/splash_screen.dart @@ -27,9 +27,12 @@ class _SplashScreenState extends State { UserProvider _userProvider; _goToUserScreen(User user){ - _userProvider.user = user; - // Navigator.of(context).pushNamed(Login.id); - Navigator.of(context).pushNamed(LandPage.id); + print(user.toJson()); + if(user.tokenLife != null && user.tokenLife.isAfter(DateTime.now())){ + _userProvider.user = user; + // Navigator.of(context).pushNamed(Login.id); + Navigator.of(context).pushNamed(LandPage.id); + } } @override diff --git a/lib/views/pages/user/gas_refill/gas_refill_details.dart b/lib/views/pages/user/gas_refill/gas_refill_details.dart index 33dd686a..8b053b6b 100644 --- a/lib/views/pages/user/gas_refill/gas_refill_details.dart +++ b/lib/views/pages/user/gas_refill/gas_refill_details.dart @@ -1,7 +1,7 @@ import 'package:flutter/material.dart'; import 'package:fluttertoast/fluttertoast.dart'; import 'package:provider/provider.dart'; -import 'package:test_sa/controllers/http_status_manger/http_status_manger.dart'; +import 'package:test_sa/controllers/api_routes/http_status_manger.dart'; import 'package:test_sa/controllers/localization/localization.dart'; import 'package:test_sa/controllers/providers/api/gas_refill_provider.dart'; import 'package:test_sa/controllers/providers/api/user_provider.dart'; @@ -177,7 +177,8 @@ class _GasRefillDetailsState extends State { textScaleFactor: AppStyle.getScaleFactor(context), ), ), - StatusLabel(label: _model.status.label, + if(_model.status?.id != null) + StatusLabel(label: _model.status.name, color: AColors.getGasStatusColor(_model.status.id) ), ], diff --git a/lib/views/pages/user/gas_refill/request_gas_refill.dart b/lib/views/pages/user/gas_refill/request_gas_refill.dart index 5f41ec48..0f4f3c41 100644 --- a/lib/views/pages/user/gas_refill/request_gas_refill.dart +++ b/lib/views/pages/user/gas_refill/request_gas_refill.dart @@ -1,19 +1,23 @@ import 'package:flutter/material.dart'; import 'package:fluttertoast/fluttertoast.dart'; import 'package:provider/provider.dart'; -import 'package:test_sa/controllers/http_status_manger/http_status_manger.dart'; +import 'package:test_sa/controllers/api_routes/http_status_manger.dart'; import 'package:test_sa/controllers/providers/api/gas_refill_provider.dart'; import 'package:test_sa/controllers/providers/api/user_provider.dart'; import 'package:test_sa/controllers/providers/settings/setting_provider.dart'; import 'package:test_sa/controllers/validator/validator.dart'; import 'package:test_sa/models/gas_refill/gas_refill_details.dart'; import 'package:test_sa/models/gas_refill/gas_refill_model.dart'; +import 'package:test_sa/models/lookup.dart'; import 'package:test_sa/models/subtitle.dart'; import 'package:test_sa/views/app_style/sizing.dart'; import 'package:test_sa/views/widgets/app_text_form_field.dart'; import 'package:test_sa/views/widgets/buttons/app_button.dart'; import 'package:test_sa/views/widgets/gas_refill/gas_refill_create_details_item.dart'; import 'package:test_sa/views/widgets/loaders/loading_manager.dart'; +import 'package:test_sa/views/widgets/status/gas_refill/gas_cylinder_size.dart'; +import 'package:test_sa/views/widgets/status/gas_refill/gas_cylinder_type.dart'; +import 'package:test_sa/views/widgets/status/gas_refill/gas_status.dart'; import 'package:test_sa/views/widgets/status/gas_refill/gas_type.dart'; import 'package:test_sa/views/widgets/titles/app_sub_title.dart'; @@ -153,19 +157,21 @@ class _RequestGasRefillState extends State { // _formModel.title = value; // }, // ), - // // const SizedBox(height: 8,), - // ASubTitle(_subtitle.status), - // if(_validate && _formModel.status == null) - // ASubTitle(_subtitle.requiredWord,color: Colors.red,), - // const SizedBox(height: 4,), - // GasStatusMenu( - // initialValue: _formModel.status, - // onSelect: (status){ - // _formModel.status = status; - // }, - // ), // const SizedBox(height: 8,), - // Divider(color: Theme.of(context).colorScheme.primary,), + ASubTitle(_subtitle.status), + if(_validate && _formModel.status == null) + ASubTitle(_subtitle.requiredWord,color: Colors.red,), + const SizedBox(height: 4,), + GasStatusMenu( + initialValue: _formModel.status ?? const Lookup( + value: 1 + ), + onSelect: (status){ + _formModel.status = status; + }, + ), + const SizedBox(height: 8,), + Divider(color: Theme.of(context).colorScheme.primary,), const SizedBox(height: 4,), const ASubTitle("Type"), if(_validate && _currentDetails.type == null) @@ -178,17 +184,28 @@ class _RequestGasRefillState extends State { }, ), - // const SizedBox(height: 8,), - // const ASubTitle("Cylinder Size"), - // if(_validate && _currentDetails.cylinderSize == null) - // ASubTitle(_subtitle.requiredWord,color: Colors.red,), - // const SizedBox(height: 4,), - // GasCylinderSizeMenu( - // initialValue: _currentDetails.cylinderSize, - // onSelect: (status){ - // _currentDetails.cylinderSize = status; - // }, - // ), + const SizedBox(height: 8,), + const ASubTitle("Cylinder Size"), + if(_validate && _currentDetails.cylinderSize == null) + ASubTitle(_subtitle.requiredWord,color: Colors.red,), + const SizedBox(height: 4,), + GasCylinderSizeMenu( + initialValue: _currentDetails.cylinderSize, + onSelect: (status){ + _currentDetails.cylinderSize = status; + }, + ), + const SizedBox(height: 8,), + const ASubTitle("Cylinder Type"), + if(_validate && _currentDetails.cylinderSize == null) + ASubTitle(_subtitle.requiredWord,color: Colors.red,), + const SizedBox(height: 4,), + GasCylinderTypesMenu( + initialValue: _currentDetails.cylinderType, + onSelect: (status){ + _currentDetails.cylinderType = status; + }, + ), const SizedBox(height: 8,), ASubTitle(_subtitle.quantity), if(_validate && _currentDetails.requestedQuantity == null) @@ -204,7 +221,7 @@ class _RequestGasRefillState extends State { ? null : "allow numbers only", textInputType: TextInputType.number, onSaved: (value){ - _currentDetails.requestedQuantity = int.tryParse(value); + _currentDetails.requestedQuantity = double.tryParse(value); }, ), const SizedBox(height: 8,), diff --git a/lib/views/pages/user/land_page.dart b/lib/views/pages/user/land_page.dart index d173219d..5bf91817 100644 --- a/lib/views/pages/user/land_page.dart +++ b/lib/views/pages/user/land_page.dart @@ -366,12 +366,17 @@ class _LandPageState extends State { child: Icon(Icons.person,size: 72,color: Theme.of(context).colorScheme.primary,), ), ), - Text( - _userProvider.user.userName, - style: Theme.of(context).textTheme.headline6.copyWith( - fontWeight: FontWeight.normal, + Padding( + padding: const EdgeInsets.all(8.0), + child: FittedBox( + child: Text( + _userProvider.user?.userName ?? "??", + style: Theme.of(context).textTheme.headline6.copyWith( + fontWeight: FontWeight.normal, + ), + textScaleFactor: AppStyle.getScaleFactor(context), + ), ), - textScaleFactor: AppStyle.getScaleFactor(context), ), ], ), diff --git a/lib/views/pages/user/profile_page.dart b/lib/views/pages/user/profile_page.dart index f22b09f6..0b3757a0 100644 --- a/lib/views/pages/user/profile_page.dart +++ b/lib/views/pages/user/profile_page.dart @@ -1,7 +1,7 @@ import 'package:flutter/material.dart'; import 'package:font_awesome_flutter/font_awesome_flutter.dart'; import 'package:provider/provider.dart'; -import 'package:test_sa/controllers/http_status_manger/http_status_manger.dart'; +import 'package:test_sa/controllers/api_routes/http_status_manger.dart'; import 'package:test_sa/controllers/localization/localization.dart'; import 'package:test_sa/controllers/providers/api/user_provider.dart'; import 'package:test_sa/controllers/providers/settings/setting_provider.dart'; diff --git a/lib/views/pages/user/requests/create_request.dart b/lib/views/pages/user/requests/create_request.dart index 8e0a5b78..715a1488 100644 --- a/lib/views/pages/user/requests/create_request.dart +++ b/lib/views/pages/user/requests/create_request.dart @@ -5,13 +5,15 @@ import 'package:flutter/material.dart'; import 'package:fluttertoast/fluttertoast.dart'; import 'package:font_awesome_flutter/font_awesome_flutter.dart'; import 'package:provider/provider.dart'; -import 'package:test_sa/controllers/http_status_manger/http_status_manger.dart'; +import 'package:test_sa/controllers/api_routes/http_status_manger.dart'; import 'package:test_sa/controllers/localization/localization.dart'; import 'package:test_sa/controllers/providers/api/service_requests_provider.dart'; +import 'package:test_sa/controllers/providers/api/status_drop_down/service_reqest/service_request_through_provider.dart'; import 'package:test_sa/controllers/providers/api/user_provider.dart'; import 'package:test_sa/controllers/providers/settings/setting_provider.dart'; import 'package:test_sa/controllers/validator/validator.dart'; import 'package:test_sa/models/device/device.dart'; +import 'package:test_sa/models/lookup.dart'; import 'package:test_sa/models/service_request/service_request.dart'; import 'package:test_sa/models/subtitle.dart'; import 'package:test_sa/views/app_style/colors.dart'; @@ -26,6 +28,8 @@ import 'package:test_sa/views/widgets/sound/record_sound.dart'; import 'package:test_sa/views/widgets/speech_to_text/speech_to_text.dart'; import 'package:test_sa/views/widgets/status/service_request/service_request_defect_types_mune.dart'; import 'package:test_sa/views/widgets/status/service_request/service_request_priority_mune.dart'; +import 'package:test_sa/views/widgets/status/service_request/service_request_through_mune.dart'; +import 'package:test_sa/views/widgets/status/service_request/service_request_types_mune.dart'; import 'package:test_sa/views/widgets/titles/app_sub_title.dart'; class CreateRequestPage extends StatefulWidget { static final String id = "/create-request"; @@ -163,6 +167,24 @@ class _CreateRequestPageState extends State { _serviceRequest.defectType = status; }, ), + const SizedBox(height: 8,), + const ASubTitle("Type"), + const SizedBox(height: 4,), + ServiceRequestTypesMenu( + initialValue: _serviceRequest.type, + onSelect: (status){ + _serviceRequest.type = status; + }, + ), + const SizedBox(height: 8,), + const ASubTitle("Through"), + const SizedBox(height: 4,), + ServiceRequestedThroughMenu( + initialValue: const Lookup(name: "App",value: 3), + onSelect: (status){ + _serviceRequest.requestedThrough = status; + }, + ), MultiImagesPicker( label: _subtitle.deviceImages, images: _deviceImages, @@ -204,14 +226,14 @@ class _CreateRequestPageState extends State { if(!_formKey.currentState.validate()) return; _formKey.currentState.save(); - _serviceRequest.deviceId = _device?.id ?? ""; + _serviceRequest.deviceId = _device?.id; _isLoading =true; setState(() {}); _serviceRequest.devicePhotos = _deviceImages.map( - (e) => base64Encode(e.readAsBytesSync())).toList(); + (e) => "${e.path.split("/").last}|${base64Encode(e.readAsBytesSync())}").toList(); if(_serviceRequest.audio != null){ final file = File(_serviceRequest.audio); - _serviceRequest.audio = base64Encode(file.readAsBytesSync()); + _serviceRequest.audio = "${file.path.split("/").last}|${base64Encode(file.readAsBytesSync())}"; } int status = await _serviceRequestsProvider.createRequest( user: _userProvider.user, diff --git a/lib/views/pages/user/requests/report/create_service_report.dart b/lib/views/pages/user/requests/report/create_service_report.dart index 33638f92..2d65c34b 100644 --- a/lib/views/pages/user/requests/report/create_service_report.dart +++ b/lib/views/pages/user/requests/report/create_service_report.dart @@ -5,7 +5,7 @@ import 'package:flutter/material.dart'; import 'package:flutter/rendering.dart'; import 'package:fluttertoast/fluttertoast.dart'; import 'package:provider/provider.dart'; -import 'package:test_sa/controllers/http_status_manger/http_status_manger.dart'; +import 'package:test_sa/controllers/api_routes/http_status_manger.dart'; import 'package:test_sa/controllers/localization/localization.dart'; import 'package:test_sa/controllers/providers/api/service_requests_provider.dart'; import 'package:test_sa/controllers/providers/api/status_drop_down/report/service_report_last_calls_provider.dart'; diff --git a/lib/views/pages/user/requests/report/edit_service_report.dart b/lib/views/pages/user/requests/report/edit_service_report.dart index 0b268fc7..4a7be338 100644 --- a/lib/views/pages/user/requests/report/edit_service_report.dart +++ b/lib/views/pages/user/requests/report/edit_service_report.dart @@ -5,7 +5,7 @@ import 'package:flutter/material.dart'; import 'package:flutter/rendering.dart'; import 'package:fluttertoast/fluttertoast.dart'; import 'package:provider/provider.dart'; -import 'package:test_sa/controllers/http_status_manger/http_status_manger.dart'; +import 'package:test_sa/controllers/api_routes/http_status_manger.dart'; import 'package:test_sa/controllers/localization/localization.dart'; import 'package:test_sa/controllers/providers/api/service_requests_provider.dart'; import 'package:test_sa/controllers/providers/api/status_drop_down/report/service_report_last_calls_provider.dart'; @@ -273,8 +273,8 @@ class _EditServiceReportState extends State with TickerProvid ServiceReportLastCallsMenu( report: _serviceReport, onSelect: (status){ - if(status?.id == 12 - || _serviceReport.callLastSituation?.id == 12){ + if(status?.value == 12 + || _serviceReport.callLastSituation?.value == 12){ _serviceReport.callLastSituation = status; setState(() {}); } else { @@ -289,7 +289,7 @@ class _EditServiceReportState extends State with TickerProvid ), const SizedBox(height: 8,), // invoice number & code - _serviceReport.callLastSituation?.id != 12 ? const SizedBox.shrink(): + _serviceReport.callLastSituation?.value != 12 ? const SizedBox.shrink(): Row( children: [ Expanded( diff --git a/lib/views/pages/user/requests/request_details.dart b/lib/views/pages/user/requests/request_details.dart index 2ada571e..c052fb68 100644 --- a/lib/views/pages/user/requests/request_details.dart +++ b/lib/views/pages/user/requests/request_details.dart @@ -2,7 +2,7 @@ import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; import 'package:intl/intl.dart'; import 'package:provider/provider.dart'; -import 'package:test_sa/controllers/http_status_manger/http_status_manger.dart'; +import 'package:test_sa/controllers/api_routes/http_status_manger.dart'; import 'package:test_sa/controllers/localization/localization.dart'; import 'package:test_sa/controllers/providers/api/service_requests_provider.dart'; import 'package:test_sa/controllers/providers/api/user_provider.dart'; @@ -61,61 +61,59 @@ class RequestDetailsPage extends StatelessWidget { ), ), ), - Visibility( - visible: _userProvider.user.type == UsersTypes.normal_user, - replacement: AIconButton( - iconData: Icons.edit, - color: AColors.white, - buttonSize: 42, - backgroundColor: AColors.green, - onPressed: () async { - showModalBottomSheet( + _userProvider.user.type == UsersTypes.normal_user ? + AIconButton( + iconData: Icons.warning_amber_rounded, + color: AColors.white, + buttonSize: 42, + backgroundColor: AColors.deepOrange, + onPressed: (){ + Navigator.of(context).push( + MaterialPageRoute( + builder: (_) => ReportIssuesPage(serviceRequest: serviceRequest,) + ) + ); + }, + ) + : AIconButton( + iconData: Icons.edit, + color: AColors.white, + buttonSize: 42, + backgroundColor: AColors.green, + onPressed: () async { + showModalBottomSheet( context: context, builder: (context){ return ServiceRequestsUpdateDialog(request: serviceRequest,); }); - // DateTime picked = await showDatePicker( - // context: context, - // initialDate: DateTime.now(), - // firstDate: DateTime.now(), - // lastDate: DateTime.now().add(Duration(days: 182)) - // ); - // if(picked == null){return;} - // showDialog( - // context: context, - // barrierDismissible: false, - // builder: (BuildContext context) { - // return CupertinoAlertDialog( - // title: Text(_subtitle.updatingDots), - // content: Center(child: CircularProgressIndicator()), - // ); - // }, - // ); - // int status = await _serviceRequestsProvider.updateDate( - // user: _userProvider.user, - // host: _settingProvider.host, - // request: serviceRequest, - // newDate: picked.toString().split(" ").first - // ); - // Navigator.of(context).pop(); - // Fluttertoast.showToast( - // msg: HttpStatusManger.getStatusMessage(status: status, subtitle: _subtitle), - // ); - }, - ), - child: AIconButton( - iconData: Icons.warning_amber_rounded, - color: AColors.white, - buttonSize: 42, - backgroundColor: AColors.deepOrange, - onPressed: (){ - Navigator.of(context).push( - MaterialPageRoute( - builder: (_) => ReportIssuesPage(serviceRequest: serviceRequest,) - ) - ); - }, - ), + // DateTime picked = await showDatePicker( + // context: context, + // initialDate: DateTime.now(), + // firstDate: DateTime.now(), + // lastDate: DateTime.now().add(Duration(days: 182)) + // ); + // if(picked == null){return;} + // showDialog( + // context: context, + // barrierDismissible: false, + // builder: (BuildContext context) { + // return CupertinoAlertDialog( + // title: Text(_subtitle.updatingDots), + // content: Center(child: CircularProgressIndicator()), + // ); + // }, + // ); + // int status = await _serviceRequestsProvider.updateDate( + // user: _userProvider.user, + // host: _settingProvider.host, + // request: serviceRequest, + // newDate: picked.toString().split(" ").first + // ); + // Navigator.of(context).pop(); + // Fluttertoast.showToast( + // msg: HttpStatusManger.getStatusMessage(status: status, subtitle: _subtitle), + // ); + }, ), SizedBox(width: 16,) ], diff --git a/lib/views/pages/user/requests/requests_page.dart b/lib/views/pages/user/requests/requests_page.dart index e535d03b..6c04d822 100644 --- a/lib/views/pages/user/requests/requests_page.dart +++ b/lib/views/pages/user/requests/requests_page.dart @@ -47,7 +47,7 @@ class _ServiceRequestsPageState extends State await _serviceRequestsProvider.getRequests( user: _userProvider.user, host: _settingProvider.host, - hospitalId: _userProvider.user.hospital.id, + hospitalId: _userProvider.user.hospital?.id, ); }, child: Stack( diff --git a/lib/views/pages/user/visits/pantry/edit_pentry.dart b/lib/views/pages/user/visits/pantry/edit_pentry.dart index 7c9201b1..39971677 100644 --- a/lib/views/pages/user/visits/pantry/edit_pentry.dart +++ b/lib/views/pages/user/visits/pantry/edit_pentry.dart @@ -1,12 +1,15 @@ import 'package:flutter/material.dart'; import 'package:fluttertoast/fluttertoast.dart'; import 'package:provider/provider.dart'; -import 'package:test_sa/controllers/http_status_manger/http_status_manger.dart'; +import 'package:test_sa/controllers/api_routes/http_status_manger.dart'; import 'package:test_sa/controllers/localization/localization.dart'; import 'package:test_sa/controllers/providers/api/regular_visits_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/models/pantry/calibration_tools.dart'; import 'package:test_sa/models/pantry/pentry.dart'; +import 'package:test_sa/models/pantry/pm_kit.dart'; +import 'package:test_sa/models/pantry/ppm_check_list.dart'; import 'package:test_sa/models/subtitle.dart'; import 'package:test_sa/models/visits/visit.dart'; import 'package:test_sa/views/widgets/buttons/app_small_button.dart'; @@ -61,17 +64,20 @@ class _EditPentryState extends State with SingleTickerProviderStateM ); // Navigator.of(context).pop(); }else{ - String errorMessage = HttpStatusManger.getStatusMessage( - status: status, subtitle: _subtitle); - Fluttertoast.showToast( - msg: errorMessage, - ); + // String errorMessage = HttpStatusManger.getStatusMessage( + // status: status, subtitle: _subtitle); + // Fluttertoast.showToast( + // msg: errorMessage, + // ); } } @override void initState() { - _pentry = widget.pentry; + _pentry = widget.pentry.copyWith(); + if(_pentry.pmKits.isEmpty) _pentry.pmKits.add(PMKit()); + if(_pentry.calibrationTools.isEmpty) _pentry.calibrationTools.add(CalibrationTool()); + if(_pentry.ppmCheckLists.isEmpty) _pentry.ppmCheckLists.add(PPMCheckList()); _tabController = TabController(length: 4, vsync: this); super.initState(); } diff --git a/lib/views/pages/user/visits/preventive_maintenance_visits_page.dart b/lib/views/pages/user/visits/preventive_maintenance_visits_page.dart index 7c1c57c2..d61c9841 100644 --- a/lib/views/pages/user/visits/preventive_maintenance_visits_page.dart +++ b/lib/views/pages/user/visits/preventive_maintenance_visits_page.dart @@ -2,7 +2,7 @@ import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; import 'package:fluttertoast/fluttertoast.dart'; import 'package:provider/provider.dart'; -import 'package:test_sa/controllers/http_status_manger/http_status_manger.dart'; +import 'package:test_sa/controllers/api_routes/http_status_manger.dart'; import 'package:test_sa/controllers/localization/localization.dart'; import 'package:test_sa/controllers/providers/api/preventive_maintenance_visits_provider.dart'; import 'package:test_sa/controllers/providers/api/user_provider.dart'; @@ -109,7 +109,7 @@ class _PreventiveMaintenanceVisitsPageState extends State ), ), Visibility( - visible: _visitsProvider.visitsSearch.toSearchString().isNotEmpty, + visible: _visitsProvider.visitsSearch.toMap().isNotEmpty, child: Padding( padding: const EdgeInsets.all(8.0), child: AButton( @@ -156,7 +156,7 @@ class _RegularVisitsPageState extends State Navigator.of(context).pop(); if(status >= 200 && status < 300){ Fluttertoast.showToast( - msg: _subtitle.regularVisitsUpdatedSuccessfully, + msg: _subtitle.preventiveMaintenanceUpdatedSuccessfully, toastLength: Toast.LENGTH_LONG, gravity: ToastGravity.BOTTOM, ); diff --git a/lib/views/pages/user/visits/update_visits_group_sheet.dart b/lib/views/pages/user/visits/update_visits_group_sheet.dart index 724f4657..ae8d66cb 100644 --- a/lib/views/pages/user/visits/update_visits_group_sheet.dart +++ b/lib/views/pages/user/visits/update_visits_group_sheet.dart @@ -15,6 +15,7 @@ import 'package:test_sa/views/widgets/buttons/app_small_button.dart'; import 'package:test_sa/views/widgets/date_and_time/date_picker.dart'; import 'package:test_sa/views/widgets/images/one_image_picker.dart'; import 'package:test_sa/views/widgets/search/filter_item.dart'; +import 'package:test_sa/views/widgets/status/employee/engineers_mune.dart'; import 'package:test_sa/views/widgets/visits/visit_status.dart'; class UpdateVisitsGroupSheet extends StatefulWidget { final List visits; @@ -26,25 +27,25 @@ class UpdateVisitsGroupSheet extends StatefulWidget { } class _UpdateVisitsGroupSheetState extends State { - List status = [ - Lookup(label: "Done", id: 0,), - Lookup(label: "Not Yet", id: 1), - Lookup(label: "On Hold", id: 2,), - ]; - - List taskStatus = [ - Lookup(label: "Passed", id: 0,), - Lookup(label: "Failed", id: 1), - ]; + // List status = [ + // Lookup(name: "Done", id: 0,), + // Lookup(name: "Not Yet", id: 1), + // Lookup(name: "On Hold", id: 2,), + // ]; + // + // List taskStatus = [ + // Lookup(name: "Passed", id: 0,), + // Lookup(name: "Failed", id: 1), + // ]; VisitsGroup _group = VisitsGroup(); - File _image; + // File _image; Subtitle _subtitle; @override void initState() { super.initState(); _group.visits = widget.visits; - _group.date = DateTime.now(); + //_group.date = DateTime.now(); } @override @@ -78,123 +79,130 @@ class _UpdateVisitsGroupSheetState extends State { ), ], ), - - AOneImagePicker( - image: _image, - onPick: (image){ - _image =image; - _group.image = base64Encode(image.readAsBytesSync()); - }, - ), - SizedBox(height: 12 * AppStyle.getScaleFactor(context),), - ATextFormField( - initialValue: _group.jobSheetNumber, - hintText: _subtitle.jobSheetNumber, - style: Theme.of(context).textTheme.headline6, - onSaved: (value){ - _group.jobSheetNumber = value; - }, - ), - SizedBox(height: 8 * AppStyle.getScaleFactor(context),), - ATextFormField( - initialValue: _group.workingHours, - hintText: _subtitle.workingHours, - style: Theme.of(context).textTheme.headline6, - onSaved: (value){ - _group.workingHours = value; - }, - ), SizedBox(height: 8 * AppStyle.getScaleFactor(context),), - ATextFormField( - initialValue: _group.travelingHours, - hintText: _subtitle.travelingHours, - style: Theme.of(context).textTheme.headline6, - onSaved: (value){ - _group.travelingHours = value; + EngineersMenu( + initialValue: _group.engineer, + onSelect: (engineer){ + _group.engineer = engineer; }, ), SizedBox(height: 8 * AppStyle.getScaleFactor(context),), - Row( - children: [ - Expanded( - child: Text( - "${_subtitle.date} :", - style: Theme.of(context).textTheme.subtitle1, - textScaleFactor: AppStyle.getScaleFactor(context), - ), - ), - ADatePicker( - date: _group.date ?? DateTime.now(), - onDatePicker: (date){ - _group.date = date; - setState(() {}); - }, - ), - ], - ), - // SizedBox(height: 8 * AStyling.getScaleFactor(context),), - Text( - "${_subtitle.status} :", - style: Theme.of(context).textTheme.subtitle1, - textScaleFactor: AppStyle.getScaleFactor(context), - ), - SizedBox(height: 8 * AppStyle.getScaleFactor(context),), - Center( - child: Wrap( - spacing: 10, - runSpacing: 10, - children: List.generate( - status.length, - (index) { - bool isSelected = _group.status == status[index]; - return FilterItem( - isSelected: isSelected, - onSelected: (){ - if(isSelected) - _group.status = null; - else - _group.status = status[index]; - - setState(() {}); - }, - status: status[index], - ); - } - - ), - ), - ), - Text( - "${_subtitle.taskStatus} :", - style: Theme.of(context).textTheme.subtitle1, - textScaleFactor: AppStyle.getScaleFactor(context), - ), - SizedBox(height: 8 * AppStyle.getScaleFactor(context),), - Center( - child: Wrap( - spacing: 10, - runSpacing: 10, - children: List.generate( - taskStatus.length, - (index) { - bool isSelected = _group.taskStatus == taskStatus[index]; - return FilterItem( - isSelected: isSelected, - onSelected: (){ - if(isSelected) - _group.taskStatus = null; - else - _group.taskStatus = taskStatus[index]; - - setState(() {}); - }, - status: taskStatus[index], - ); - } - - ), - ), - ), + // AOneImagePicker( + // image: _image, + // onPick: (image){ + // _image =image; + // _group.image = base64Encode(image.readAsBytesSync()); + // }, + // ), + // SizedBox(height: 12 * AppStyle.getScaleFactor(context),), + // ATextFormField( + // initialValue: _group.jobSheetNumber, + // hintText: _subtitle.jobSheetNumber, + // style: Theme.of(context).textTheme.headline6, + // onSaved: (value){ + // _group.jobSheetNumber = value; + // }, + // ), + // SizedBox(height: 8 * AppStyle.getScaleFactor(context),), + // ATextFormField( + // initialValue: _group.workingHours, + // hintText: _subtitle.workingHours, + // style: Theme.of(context).textTheme.headline6, + // onSaved: (value){ + // _group.workingHours = value; + // }, + // ), + // SizedBox(height: 8 * AppStyle.getScaleFactor(context),), + // ATextFormField( + // initialValue: _group.travelingHours, + // hintText: _subtitle.travelingHours, + // style: Theme.of(context).textTheme.headline6, + // onSaved: (value){ + // _group.travelingHours = value; + // }, + // ), + // SizedBox(height: 8 * AppStyle.getScaleFactor(context),), + // Row( + // children: [ + // Expanded( + // child: Text( + // "${_subtitle.date} :", + // style: Theme.of(context).textTheme.subtitle1, + // textScaleFactor: AppStyle.getScaleFactor(context), + // ), + // ), + // ADatePicker( + // date: _group.date ?? DateTime.now(), + // onDatePicker: (date){ + // _group.date = date; + // setState(() {}); + // }, + // ), + // ], + // ), + // // SizedBox(height: 8 * AStyling.getScaleFactor(context),), + // Text( + // "${_subtitle.status} :", + // style: Theme.of(context).textTheme.subtitle1, + // textScaleFactor: AppStyle.getScaleFactor(context), + // ), + // SizedBox(height: 8 * AppStyle.getScaleFactor(context),), + // Center( + // child: Wrap( + // spacing: 10, + // runSpacing: 10, + // children: List.generate( + // status.length, + // (index) { + // bool isSelected = _group.status == status[index]; + // return FilterItem( + // isSelected: isSelected, + // onSelected: (){ + // if(isSelected) + // _group.status = null; + // else + // _group.status = status[index]; + // + // setState(() {}); + // }, + // status: status[index], + // ); + // } + // + // ), + // ), + // ), + // Text( + // "${_subtitle.taskStatus} :", + // style: Theme.of(context).textTheme.subtitle1, + // textScaleFactor: AppStyle.getScaleFactor(context), + // ), + // SizedBox(height: 8 * AppStyle.getScaleFactor(context),), + // Center( + // child: Wrap( + // spacing: 10, + // runSpacing: 10, + // children: List.generate( + // taskStatus.length, + // (index) { + // bool isSelected = _group.taskStatus == taskStatus[index]; + // return FilterItem( + // isSelected: isSelected, + // onSelected: (){ + // if(isSelected) + // _group.taskStatus = null; + // else + // _group.taskStatus = taskStatus[index]; + // + // setState(() {}); + // }, + // status: taskStatus[index], + // ); + // } + // + // ), + // ), + // ), SizedBox(height: 8 * AppStyle.getScaleFactor(context),), Expanded( child: ListView.builder( @@ -240,10 +248,7 @@ class _UpdateVisitsGroupSheetState extends State { ), ], ), - Align( - alignment: Alignment.topRight, - ), ], ), ); diff --git a/lib/views/pages/user/visits/visit_details.dart b/lib/views/pages/user/visits/visit_details.dart index f2b06be0..ca876b77 100644 --- a/lib/views/pages/user/visits/visit_details.dart +++ b/lib/views/pages/user/visits/visit_details.dart @@ -5,6 +5,7 @@ import 'package:test_sa/models/subtitle.dart'; import 'package:test_sa/models/visits/visit.dart'; import 'package:test_sa/views/app_style/colors.dart'; import 'package:test_sa/views/app_style/sizing.dart'; +import 'package:test_sa/views/pages/user/visits/pantry/edit_pentry.dart'; import 'package:test_sa/views/pages/user/visits/pantry/future_edit_pently.dart'; import 'package:test_sa/views/widgets/buttons/app_back_button.dart'; import 'package:test_sa/views/widgets/buttons/app_icon_button.dart'; @@ -52,7 +53,7 @@ class VisitDetailsPage extends StatelessWidget { backgroundColor: AColors.green, onPressed: () async { Navigator.of(context).push( - MaterialPageRoute(builder: (_)=> FutureEditPentry(visit: visit,)) + MaterialPageRoute(builder: (_)=> EditPentry(visit: visit,pentry: visit.pentry,)) ); }, ), diff --git a/lib/views/widgets/device_trancfer/device_transfer_info_section.dart b/lib/views/widgets/device_trancfer/device_transfer_info_section.dart index a042d72f..8360ba23 100644 --- a/lib/views/widgets/device_trancfer/device_transfer_info_section.dart +++ b/lib/views/widgets/device_trancfer/device_transfer_info_section.dart @@ -26,7 +26,7 @@ class DeviceTransferInfoSection extends StatelessWidget { ), RequestInfoRow( title: subtitle.engineerName, - info: info.name, + info: info.userName, ), RequestInfoRow( title: subtitle.workingHours, @@ -52,7 +52,7 @@ class DeviceTransferInfoSection extends StatelessWidget { RequestInfoRow( title: subtitle.status, infoWidget: StatusLabel( - label: info.status?.label, + label: info.status?.name, color: AColors.getGasStatusColor(info.status?.id) ), ), diff --git a/lib/views/widgets/device_trancfer/device_transfer_item.dart b/lib/views/widgets/device_trancfer/device_transfer_item.dart index 0cd2adbf..ea426523 100644 --- a/lib/views/widgets/device_trancfer/device_transfer_item.dart +++ b/lib/views/widgets/device_trancfer/device_transfer_item.dart @@ -79,7 +79,7 @@ class DeviceTransferItem extends StatelessWidget { ), StatusLabel( color: AColors.getRequestStatusColor(item.sender.status?.id), - label: item.sender.status?.label, + label: item.sender.status?.name, ) ], @@ -99,6 +99,7 @@ class DeviceTransferItem extends StatelessWidget { ], ), + if(item.sender.department.id != null) Text( item.sender.department.name, style: Theme.of(context).textTheme.bodySmall.copyWith( @@ -118,7 +119,7 @@ class DeviceTransferItem extends StatelessWidget { ), StatusLabel( color: AColors.getRequestStatusColor(item.receiver.status?.id), - label: item.receiver.status?.label, + label: item.receiver.status?.name, ) ], @@ -138,6 +139,7 @@ class DeviceTransferItem extends StatelessWidget { ], ), + if(item.receiver.department.id != null) Text( item.receiver.department.name, style: Theme.of(context).textTheme.bodySmall.copyWith( diff --git a/lib/views/widgets/equipment/auto_complete_devices_field.dart b/lib/views/widgets/equipment/auto_complete_devices_field.dart index ec91ae17..95952765 100644 --- a/lib/views/widgets/equipment/auto_complete_devices_field.dart +++ b/lib/views/widgets/equipment/auto_complete_devices_field.dart @@ -10,8 +10,8 @@ import 'package:flutter_typeahead/flutter_typeahead.dart'; import 'package:provider/provider.dart'; class AutoCompleteDeviceField extends StatefulWidget { final Device initialValue; - final String hospitalId; - final Function(String) onPick; + final int hospitalId; + final Function(int) onPick; const AutoCompleteDeviceField({Key key, this.initialValue, this.onPick, this.hospitalId}) : super(key: key); @@ -74,7 +74,7 @@ class _AutoCompleteDeviceFieldState extends State { return await _devicesProvider.getDevicesList( host: _settingProvider.host, user: _userProvider.user, - hospitalId: widget.hospitalId, + hospitalId: widget.hospitalId ?? _userProvider.user.hospital.id, serialNumber: value, ); }, diff --git a/lib/views/widgets/equipment/auto_complete_models_field.dart b/lib/views/widgets/equipment/auto_complete_models_field.dart new file mode 100644 index 00000000..1c40a544 --- /dev/null +++ b/lib/views/widgets/equipment/auto_complete_models_field.dart @@ -0,0 +1,92 @@ +import 'package:test_sa/controllers/providers/api/devices_provider.dart'; +import 'package:test_sa/controllers/providers/api/user_provider.dart'; +import 'package:test_sa/controllers/providers/settings/setting_provider.dart'; +import 'package:test_sa/models/device/device.dart'; +import 'package:test_sa/models/lookup.dart'; +import 'package:test_sa/views/app_style/colors.dart'; +import 'package:test_sa/views/app_style/sizing.dart'; +import 'package:test_sa/views/widgets/loaders/loading_manager.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter_typeahead/flutter_typeahead.dart'; +import 'package:provider/provider.dart'; +class AutoCompleteModelField extends StatefulWidget { + final Lookup initialValue; + final Function(Lookup) onPick; + + const AutoCompleteModelField({Key key, this.initialValue, this.onPick,}) : super(key: key); + + @override + _AutoCompleteModelFieldState createState() => _AutoCompleteModelFieldState(); +} + +class _AutoCompleteModelFieldState extends State { + + SettingProvider _settingProvider; + DevicesProvider _devicesProvider; + UserProvider _userProvider; + TextEditingController _controller; + + @override + void initState() { + _controller = TextEditingController(text: widget.initialValue?.name); + super.initState(); + } + + @override + void dispose() { + _controller.dispose(); + super.dispose(); + } + @override + Widget build(BuildContext context) { + _settingProvider = Provider.of(context); + _userProvider = Provider.of(context); + _devicesProvider = Provider.of(context); + //Subtitle _subtitle = AppLocalization.of(context).subtitle; + return Container( + padding: const EdgeInsets.symmetric( + horizontal: 16 + ), + decoration: BoxDecoration( + color: Colors.white, + border: Border.all(color:AColors.black), + borderRadius: BorderRadius.circular( + AppStyle.borderRadius * AppStyle.getScaleFactor(context) + ), + boxShadow: [ + AppStyle.boxShadow + ] + ), + child: TypeAheadField( + textFieldConfiguration: TextFieldConfiguration( + style: Theme.of(context).textTheme.headline6, + controller: _controller, + textAlign: TextAlign.center, + + decoration: const InputDecoration( + hintText: "Model", + border: InputBorder.none, + disabledBorder: InputBorder.none, + focusedBorder: InputBorder.none, + enabledBorder: InputBorder.none, + ), + textInputAction: TextInputAction.search, + ), + suggestionsCallback: (value) async { + return await _devicesProvider.getModels( + code: value, + ); + }, + itemBuilder: (context, lookup) { + return ListTile( + title: Text(lookup.name), + ); + }, + onSuggestionSelected: (lookup) { + _controller.text = lookup.name; + widget.onPick(lookup); + }, + ), + ); + } +} diff --git a/lib/views/widgets/equipment/single_device_picker.dart b/lib/views/widgets/equipment/single_device_picker.dart index aac06ff1..031ab2c1 100644 --- a/lib/views/widgets/equipment/single_device_picker.dart +++ b/lib/views/widgets/equipment/single_device_picker.dart @@ -28,6 +28,8 @@ class _SingleDevicePickerState extends State { bool _firstTime = true; Subtitle _subtitle; + TextEditingController numberController = TextEditingController(); + TextEditingController snController = TextEditingController(); _getDevice(String result) async { if(result == null) return; showDialog( @@ -58,6 +60,8 @@ class _SingleDevicePickerState extends State { @override void dispose() { + numberController.dispose(); + snController.dispose(); super.dispose(); } @@ -68,6 +72,7 @@ class _SingleDevicePickerState extends State { _settingProvider = Provider.of(context); if(_firstTime && _devicesProvider.devices != null){ + _searchableList.clear(); _searchableList.addAll(_devicesProvider.devices); _firstTime = false; } @@ -83,7 +88,7 @@ class _SingleDevicePickerState extends State { await _devicesProvider.getEquipment( user: _userProvider.user, host: _settingProvider.host, - hospitalId: _userProvider.user.hospital.id + hospitalId: _userProvider.user.hospital?.id ); }, child: Column( @@ -95,31 +100,41 @@ class _SingleDevicePickerState extends State { children: [ ATextFormField( hintText: _subtitle.searchBySn, + controller: snController, style: Theme.of(context).textTheme.subtitle1, suffixIcon: const Icon(Icons.search_rounded), - onChange: (value){ + textInputAction: TextInputAction.search, + onAction: () async { + _devicesProvider.reset(); + await _devicesProvider.getEquipment( + user: _userProvider.user, + host: _settingProvider.host, + hospitalId: _userProvider.user.hospital?.id, + serialNumber: snController.text, + number: numberController.text + ); _searchableList.clear(); - _searchableList.addAll(_devicesProvider.devices.where( - (element) => element.serialNumber.toLowerCase().contains( - value.toLowerCase() - ) - ).toList()); - setState(() {}); + _searchableList.addAll(_devicesProvider.devices); }, ), const SizedBox(height: 8,), ATextFormField( hintText: "Search by Number", + controller: numberController, style: Theme.of(context).textTheme.subtitle1, suffixIcon: const Icon(Icons.search_rounded), - onChange: (value){ + textInputAction: TextInputAction.search, + onAction: () async { + _devicesProvider.reset(); + await _devicesProvider.getEquipment( + user: _userProvider.user, + host: _settingProvider.host, + hospitalId: _userProvider.user.hospital?.id, + serialNumber: snController.text, + number: numberController.text + ); _searchableList.clear(); - _searchableList.addAll(_devicesProvider.devices.where( - (element) => element.number.toLowerCase().contains( - value.toLowerCase() - ) - ).toList()); - setState(() {}); + _searchableList.addAll(_devicesProvider.devices); }, ), ], @@ -145,16 +160,16 @@ class _SingleDevicePickerState extends State { ], ), ), - floatingActionButton: FloatingActionButton( - heroTag: "some tag 2", - child: const Icon(Icons.qr_code_scanner), - onPressed: () async { - String result = await Navigator.of(context).push( - MaterialPageRoute(builder: (_)=> const ScanQr()), - ) as String; - _getDevice(result); - }, - ), + // floatingActionButton: FloatingActionButton( + // heroTag: "some tag 2", + // child: const Icon(Icons.qr_code_scanner), + // onPressed: () async { + // String result = await Navigator.of(context).push( + // MaterialPageRoute(builder: (_)=> const ScanQr()), + // ) as String; + // _getDevice(result); + // }, + // ), ); } } diff --git a/lib/views/widgets/gas_refill/gas_refill_create_details_item.dart b/lib/views/widgets/gas_refill/gas_refill_create_details_item.dart index d246d05d..375a1b1c 100644 --- a/lib/views/widgets/gas_refill/gas_refill_create_details_item.dart +++ b/lib/views/widgets/gas_refill/gas_refill_create_details_item.dart @@ -15,7 +15,7 @@ class GasRefillCreateDetailsItem extends StatelessWidget { children: [ Row( children: [ - Expanded(child: Text(model.type.label)), + Expanded(child: Text(model.type.name)), IconButton( onPressed: onDelete, color: AColors.red, @@ -23,9 +23,12 @@ class GasRefillCreateDetailsItem extends StatelessWidget { ) ], ), - Row( + Wrap( + spacing: 10, children: [ - Text(model.requestedQuantity.toStringAsFixed(0)), + Text("Quantity: ${model.requestedQuantity.toStringAsFixed(0)}"), + Text("Cylinder Size: ${model.cylinderSize.name}"), + Text("Cylinder Type: ${model.cylinderType.name}"), ], ), if(model.deliveredQuantity != null) diff --git a/lib/views/widgets/gas_refill/gas_refill_item.dart b/lib/views/widgets/gas_refill/gas_refill_item.dart index e9bf3d02..e6ab7477 100644 --- a/lib/views/widgets/gas_refill/gas_refill_item.dart +++ b/lib/views/widgets/gas_refill/gas_refill_item.dart @@ -75,6 +75,7 @@ class GasRefillItem extends StatelessWidget { ), ), ), + if(item.clientName != null) Text( item.clientName, style: Theme.of(context).textTheme.subtitle2.copyWith( @@ -95,7 +96,8 @@ class GasRefillItem extends StatelessWidget { ), ), ), - StatusLabel(label: item.status.label, + if(item.status?.id != null) + StatusLabel(label: item.status.name, color: AColors.getGasStatusColor(item.status.id) ), ], diff --git a/lib/views/widgets/gas_refill/gas_refill_update_details_item.dart b/lib/views/widgets/gas_refill/gas_refill_update_details_item.dart index 2a94a9ba..dc41e11d 100644 --- a/lib/views/widgets/gas_refill/gas_refill_update_details_item.dart +++ b/lib/views/widgets/gas_refill/gas_refill_update_details_item.dart @@ -22,10 +22,10 @@ class GasRefillUpdateDetailsItem extends StatelessWidget { return Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ - ATitle(details.type.label), + ATitle(details.type.name), RequestInfoRow( title: "Cylinder Size", - info: details.cylinderSize.label, + info: details.cylinderSize.name, ), RequestInfoRow( title: "Requested Quantity", @@ -48,14 +48,14 @@ class GasRefillUpdateDetailsItem extends StatelessWidget { ? null : "allow numbers only", textInputType: TextInputType.number, onSaved: (value){ - details.deliveredQuantity = int.tryParse(value); + details.deliveredQuantity = double.tryParse(value); }, ), ], ): RequestInfoRow( title: "Delivered Quantity", - info: details.deliveredQuantity.toStringAsFixed(0), + info: details.deliveredQuantity?.toStringAsFixed(0), ), //SizedBox(height: 16,) ], diff --git a/lib/views/widgets/hospitals/hospital_auto_complete_field.dart b/lib/views/widgets/hospitals/hospital_auto_complete_field.dart index ba860745..68444be0 100644 --- a/lib/views/widgets/hospitals/hospital_auto_complete_field.dart +++ b/lib/views/widgets/hospitals/hospital_auto_complete_field.dart @@ -11,10 +11,10 @@ import 'package:flutter_typeahead/flutter_typeahead.dart'; import 'package:provider/provider.dart'; class HospitalAutoCompleteField extends StatefulWidget { final String initialValue; - final Function(String) onSearch; - final Function(String) onSave; + final Function(Hospital) onSearch; + //final Function(Hospital) onSave; - const HospitalAutoCompleteField({Key key, this.onSearch, this.initialValue, this.onSave}) : super(key: key); + const HospitalAutoCompleteField({Key key, this.onSearch, this.initialValue, }) : super(key: key); @override _HospitalAutoCompleteFieldState createState() => _HospitalAutoCompleteFieldState(); @@ -58,7 +58,6 @@ class _HospitalAutoCompleteFieldState extends State { child: TypeAheadField( textFieldConfiguration: TextFieldConfiguration( style: Theme.of(context).textTheme.headline6, - onSubmitted: widget.onSave, controller: _controller, textAlign: TextAlign.center, decoration: InputDecoration( @@ -69,9 +68,6 @@ class _HospitalAutoCompleteFieldState extends State { enabledBorder: InputBorder.none, ), textInputAction: TextInputAction.search, - onEditingComplete:(){ - widget.onSearch(_controller.text); - } ), suggestionsCallback: (vale) async { return await HospitalsProvider().getHospitalsList( @@ -80,12 +76,12 @@ class _HospitalAutoCompleteFieldState extends State { ); }, itemBuilder: (context, hospital) { - return HospitalItem( - hospital: hospital, + return ListTile( + title: Text(hospital.name), ); }, onSuggestionSelected: (hospital) { - widget.onSearch(hospital.name); + widget.onSearch(hospital); }, ), ); diff --git a/lib/views/widgets/loaders/loading_manager.dart b/lib/views/widgets/loaders/loading_manager.dart index 8ed322e0..b0002ae1 100644 --- a/lib/views/widgets/loaders/loading_manager.dart +++ b/lib/views/widgets/loaders/loading_manager.dart @@ -1,5 +1,5 @@ import 'package:flutter/material.dart'; -import 'package:test_sa/controllers/http_status_manger/http_status_manger.dart'; +import 'package:test_sa/controllers/api_routes/http_status_manger.dart'; import 'package:test_sa/controllers/localization/localization.dart'; import 'package:test_sa/models/subtitle.dart'; diff --git a/lib/views/widgets/pentry/auto_complete_fields/auto_complete_devices_field.dart b/lib/views/widgets/pentry/auto_complete_fields/auto_complete_devices_field.dart index ea2228cd..e516bb3c 100644 --- a/lib/views/widgets/pentry/auto_complete_fields/auto_complete_devices_field.dart +++ b/lib/views/widgets/pentry/auto_complete_fields/auto_complete_devices_field.dart @@ -10,7 +10,7 @@ import 'package:test_sa/views/app_style/colors.dart'; import 'package:test_sa/views/app_style/sizing.dart'; class AutoCompleteDeviceNumberField extends StatefulWidget { final Lookup initialValue; - final String hospitalId; + final int hospitalId; final Function(Lookup) onPick; const AutoCompleteDeviceNumberField({Key key, this.initialValue, this.onPick, this.hospitalId}) : super(key: key); @@ -28,7 +28,7 @@ class _AutoCompleteDeviceNumberFieldState extends State { const SizedBox(height: 4,), AutoCompleteDeviceNumberField( initialValue: model.assetsNumber, - hospitalId: userProvider.user.hospital.id, + hospitalId: userProvider.user.hospital?.id, onPick: (number){ model.assetsNumber = number; }, diff --git a/lib/views/widgets/pentry/pentry_info_form.dart b/lib/views/widgets/pentry/pentry_info_form.dart index 1fadc1c9..da9434e5 100644 --- a/lib/views/widgets/pentry/pentry_info_form.dart +++ b/lib/views/widgets/pentry/pentry_info_form.dart @@ -1,4 +1,7 @@ +import 'dart:convert'; + import 'package:flutter/material.dart'; +import 'package:flutter/services.dart'; import 'package:provider/provider.dart'; import 'package:test_sa/controllers/localization/localization.dart'; import 'package:test_sa/controllers/providers/api/user_provider.dart'; @@ -6,6 +9,7 @@ import 'package:test_sa/models/pantry/pentry.dart'; import 'package:test_sa/views/app_style/sizing.dart'; import 'package:test_sa/views/widgets/app_text_form_field.dart'; import 'package:test_sa/views/widgets/date_and_time/date_picker.dart'; +import 'package:test_sa/views/widgets/e_signature/e_signature.dart'; import 'package:test_sa/views/widgets/images/mini_one_image_picker.dart'; import 'package:test_sa/views/widgets/status/pentry/pentry_status_mune.dart'; import 'package:test_sa/views/widgets/status/pentry/pentry_visit_status_mune.dart'; @@ -23,7 +27,6 @@ class PentryInfoForm extends StatefulWidget { } class _PentryInfoFormState extends State { - @override Widget build(BuildContext context) { final subtitle = AppLocalization.of(context).subtitle; @@ -87,6 +90,20 @@ class _PentryInfoFormState extends State { }, ), const SizedBox(height: 8,), + const ASubTitle("Expected Visit Date"), + if(widget.enableValidate && widget.model.expectedVisitDate == null) + ASubTitle(subtitle.requiredWord,color: Colors.red,), + const SizedBox(height: 4,), + ADatePicker( + date: widget.model.expectedVisitDate, + from: DateTime.now().subtract(const Duration(days: 30)), + onDatePicker: (date){ + if(date == null) return; + widget.model.expectedVisitDate = date; + setState(() {}); + }, + ), + const SizedBox(height: 8,), const ASubTitle("Traveling Hours"), const SizedBox(height: 4,), ATextFormField( @@ -108,6 +125,20 @@ class _PentryInfoFormState extends State { }, ), const SizedBox(height: 8,), + const ASubTitle("Signature"), + ESignature( + oldSignature: widget.model.signature, + newSignature: widget.model.localSignature, + onSaved: (signature){ + widget.model.localSignature = signature; + if(signature == null || signature.isEmpty) { + widget.model.signature = null; + return; + } + widget.model.signature = "${DateTime.now().toIso8601String()}.png|${base64Encode(signature)}"; + }, + ), + const SizedBox(height: 8,), ], ); } diff --git a/lib/views/widgets/pentry/pentry_pm_kit_form.dart b/lib/views/widgets/pentry/pentry_pm_kit_form.dart index 6fdd3b43..e0345597 100644 --- a/lib/views/widgets/pentry/pentry_pm_kit_form.dart +++ b/lib/views/widgets/pentry/pentry_pm_kit_form.dart @@ -67,84 +67,84 @@ class _PentryPMKitFormState extends State { const SizedBox(height: 4,), AutoCompletePartsField( clearAfterPick: false, - initialValue: (model.itemCode?.label ?? "").toString(), + initialValue: (model.itemCode?.name ?? "").toString(), onPick: (part){ - model.itemCode = Lookup(id: int.tryParse(part.id),label: part.code); - }, - ), - const SizedBox(height: 8,), - const ASubTitle("Item Name"), - const SizedBox(height: 4,), - ATextFormField( - initialValue: (model.itemName ?? "").toString(), - textAlign: TextAlign.center, - style: Theme.of(context).textTheme.subtitle1, - textInputType: TextInputType.text, - onChange: (value){ - model.itemName = value; - }, - ), - const SizedBox(height: 8,), - const ASubTitle("Preparation Time Frame"), - const SizedBox(height: 4,), - ATextFormField( - initialValue: (model.preparationTimeFrame ?? "").toString(), - textAlign: TextAlign.center, - style: Theme.of(context).textTheme.subtitle1, - textInputType: TextInputType.text, - onChange: (value){ - model.preparationTimeFrame = value; - }, - ), - const SizedBox(height: 8,), - const ASubTitle("kit Frequency Demand"), - const SizedBox(height: 4,), - ATextFormField( - initialValue: (model.kitFrequencyDemand ?? "").toString(), - textAlign: TextAlign.center, - style: Theme.of(context).textTheme.subtitle1, - textInputType: TextInputType.text, - onChange: (value){ - model.kitFrequencyDemand = value; - }, - ), - const SizedBox(height: 8,), - const ASubTitle("Availability"), - const SizedBox(height: 4,), - ATextFormField( - initialValue: (model.availability ?? "").toString(), - textAlign: TextAlign.center, - style: Theme.of(context).textTheme.subtitle1, - textInputType: TextInputType.text, - onChange: (value){ - model.availability = value; - }, - ), - const SizedBox(height: 8,), - const ASubTitle("Quantity Needed"), - const SizedBox(height: 4,), - ATextFormField( - initialValue: (model.quantityNeeded ?? "").toString(), - textAlign: TextAlign.center, - style: Theme.of(context).textTheme.subtitle1, - textInputType: TextInputType.number, - onChange: (value){ - model.quantityNeeded = value; - }, - ), - const SizedBox(height: 8,), - const ASubTitle("Quantity Reserved"), - const SizedBox(height: 4,), - ATextFormField( - initialValue: (model.quantityReserved ?? "").toString(), - textAlign: TextAlign.center, - style: Theme.of(context).textTheme.subtitle1, - textInputType: TextInputType.number, - onChange: (value){ - model.quantityReserved = value; + model.itemCode = Lookup(id: part.id,name: part.code); }, ), const SizedBox(height: 8,), + // const ASubTitle("Item Name"), + // const SizedBox(height: 4,), + // ATextFormField( + // initialValue: (model.itemName ?? "").toString(), + // textAlign: TextAlign.center, + // style: Theme.of(context).textTheme.subtitle1, + // textInputType: TextInputType.text, + // onChange: (value){ + // model.itemName = value; + // }, + // ), + // const SizedBox(height: 8,), + // const ASubTitle("Preparation Time Frame"), + // const SizedBox(height: 4,), + // ATextFormField( + // initialValue: (model.preparationTimeFrame ?? "").toString(), + // textAlign: TextAlign.center, + // style: Theme.of(context).textTheme.subtitle1, + // textInputType: TextInputType.text, + // onChange: (value){ + // model.preparationTimeFrame = value; + // }, + // ), + // const SizedBox(height: 8,), + // const ASubTitle("kit Frequency Demand"), + // const SizedBox(height: 4,), + // ATextFormField( + // initialValue: (model.kitFrequencyDemand ?? "").toString(), + // textAlign: TextAlign.center, + // style: Theme.of(context).textTheme.subtitle1, + // textInputType: TextInputType.text, + // onChange: (value){ + // model.kitFrequencyDemand = value; + // }, + // ), + // const SizedBox(height: 8,), + // const ASubTitle("Availability"), + // const SizedBox(height: 4,), + // ATextFormField( + // initialValue: (model.availability ?? "").toString(), + // textAlign: TextAlign.center, + // style: Theme.of(context).textTheme.subtitle1, + // textInputType: TextInputType.text, + // onChange: (value){ + // model.availability = value; + // }, + // ), + // const SizedBox(height: 8,), + // const ASubTitle("Quantity Needed"), + // const SizedBox(height: 4,), + // ATextFormField( + // initialValue: (model.quantityNeeded ?? "").toString(), + // textAlign: TextAlign.center, + // style: Theme.of(context).textTheme.subtitle1, + // textInputType: TextInputType.number, + // onChange: (value){ + // model.quantityNeeded = value; + // }, + // ), + // const SizedBox(height: 8,), + // const ASubTitle("Quantity Reserved"), + // const SizedBox(height: 4,), + // ATextFormField( + // initialValue: (model.quantityReserved ?? "").toString(), + // textAlign: TextAlign.center, + // style: Theme.of(context).textTheme.subtitle1, + // textInputType: TextInputType.number, + // onChange: (value){ + // model.quantityReserved = value; + // }, + // ), + // const SizedBox(height: 8,), Divider(color: Theme.of(context).textTheme.titleMedium.color,), ], ); diff --git a/lib/views/widgets/requests/service_request_item.dart b/lib/views/widgets/requests/service_request_item.dart index 0c63f2ff..e46eed9d 100644 --- a/lib/views/widgets/requests/service_request_item.dart +++ b/lib/views/widgets/requests/service_request_item.dart @@ -59,7 +59,7 @@ class ServiceRequestItem extends StatelessWidget { child: Column( mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ - request.devicePhotos.isEmpty ? SizedBox.shrink(): + request.devicePhotos?.isEmpty != false ? SizedBox.shrink(): Column( children: [ SizedBox( diff --git a/lib/views/widgets/requests/service_request_update_dialog.dart b/lib/views/widgets/requests/service_request_update_dialog.dart index 71dd67cc..57237c10 100644 --- a/lib/views/widgets/requests/service_request_update_dialog.dart +++ b/lib/views/widgets/requests/service_request_update_dialog.dart @@ -2,7 +2,7 @@ import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; import 'package:fluttertoast/fluttertoast.dart'; import 'package:provider/provider.dart'; -import 'package:test_sa/controllers/http_status_manger/http_status_manger.dart'; +import 'package:test_sa/controllers/api_routes/http_status_manger.dart'; import 'package:test_sa/controllers/localization/localization.dart'; import 'package:test_sa/controllers/providers/api/service_requests_provider.dart'; import 'package:test_sa/controllers/providers/api/user_provider.dart'; @@ -13,7 +13,7 @@ import 'package:test_sa/models/subtitle.dart'; import 'package:test_sa/views/app_style/sizing.dart'; import 'package:test_sa/views/widgets/buttons/app_small_button.dart'; import 'package:test_sa/views/widgets/date_and_time/date_picker.dart'; -import 'package:test_sa/views/widgets/status/employee/employee_mune.dart'; +import 'package:test_sa/views/widgets/status/employee/assigned_to_mune.dart'; class ServiceRequestsUpdateDialog extends StatefulWidget { final ServiceRequest request; @@ -126,7 +126,7 @@ class _ServiceRequestsUpdateDialogState extends State 0.5 ? AColors.black : Colors.white, diff --git a/lib/views/widgets/search/service_request_search_bar.dart b/lib/views/widgets/search/service_request_search_bar.dart index a1f78945..5bb981bd 100644 --- a/lib/views/widgets/search/service_request_search_bar.dart +++ b/lib/views/widgets/search/service_request_search_bar.dart @@ -1,3 +1,4 @@ +import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; import 'package:test_sa/controllers/localization/localization.dart'; import 'package:test_sa/models/lookup.dart'; @@ -7,6 +8,9 @@ import 'package:test_sa/views/app_style/sizing.dart'; import 'package:test_sa/views/widgets/buttons/app_button.dart'; import 'package:test_sa/views/widgets/buttons/app_small_button.dart'; import 'package:test_sa/views/widgets/hospitals/hospital_auto_complete_field.dart'; +import 'package:test_sa/views/widgets/status/service_request/service_request_status_mune.dart'; +import 'package:test_sa/views/widgets/status/service_request/service_request_types_mune.dart'; +import 'package:test_sa/views/widgets/titles/app_sub_title.dart'; import '../app_text_form_field.dart'; import 'filter_item.dart'; @@ -29,12 +33,12 @@ class _ServiceRequestsSearchDialogState extends State status = [ - Lookup(label: "New", id: 4,), + Lookup(name: "New", id: 4,), - Lookup(label: "Repaired", id: 6,), - Lookup(label: "Repeated", id: 8), - Lookup(label: "Closed", id: 9,), - Lookup(label: "Under Repair", id: 5,), + Lookup(name: "Repaired", id: 6,), + Lookup(name: "Repeated", id: 8), + Lookup(name: "Closed", id: 9,), + Lookup(name: "Under Repair", id: 5,), ]; final GlobalKey _formKey = GlobalKey(); @@ -55,6 +59,7 @@ class _ServiceRequestsSearchDialogState extends State with TickerProviderStateMixin{ VisitsSearch _search; List status = [ - Lookup(label: "Done", id: 0,), - Lookup(label: "Not Yet", id: 1), - Lookup(label: "On Hold", id: 2,), + Lookup(name: "Done", id: 0,), + Lookup(name: "Not Yet", id: 1), + Lookup(name: "On Hold", id: 2,), ]; List contactStatus = [ - Lookup(label: "Hospital Employee", key: "H",), - Lookup(label: "Under Warranty", key: "CW"), - Lookup(label: "Under Maintenance Contract", key: "CC",), + // Lookup(name: "Hospital Employee", value: "H",), + // Lookup(name: "Under Warranty", value: "CW"), + // Lookup(name: "Under Maintenance Contract", value: "CC",), ]; @@ -61,6 +64,8 @@ class _VisitsSearchDialogState extends State child: Form( key: _formKey, child: ListView( + // shrinkWrap: true, + // physics: const ClampingScrollPhysics(), padding: const EdgeInsets.symmetric(vertical: 8,horizontal: 16), children: [ Row( @@ -76,8 +81,9 @@ class _VisitsSearchDialogState extends State ASmallButton( text: _subtitle.search, onPressed: (){ - if(!_formKey.currentState.validate()) + if(!_formKey.currentState.validate()) { return; + } _formKey.currentState.save(); Navigator.of(context).pop(_search); }, @@ -90,8 +96,9 @@ class _VisitsSearchDialogState extends State style: Theme.of(context).textTheme.headline6, textInputAction: TextInputAction.search, onAction: (){ - if(!_formKey.currentState.validate()) + if(!_formKey.currentState.validate()) { return; + } _formKey.currentState.save(); Navigator.of(context).pop(_search); }, @@ -101,99 +108,122 @@ class _VisitsSearchDialogState extends State ), SizedBox(height: 8.0 * AppStyle.getScaleFactor(context),), HospitalAutoCompleteField( - initialValue: _search.hospitalName, - onSave: (value){ - _search.hospitalName = value; - }, + initialValue: _search.hospital?.name, + // onSave: (value){ + // _search.hospital = value; + // }, onSearch: (value){ - _search.hospitalName = value; + _search.hospital = value; Navigator.of(context).pop(_search); }, ), + // SizedBox(height: 8.0 * AppStyle.getScaleFactor(context),), + // ATextFormField( + // initialValue: _search.brand, + // hintText: _subtitle.brand, + // style: Theme.of(context).textTheme.headline6, + // textInputAction: TextInputAction.search, + // onAction: (){ + // if(!_formKey.currentState.validate()) { + // return; + // } + // _formKey.currentState.save(); + // Navigator.of(context).pop(_search); + // }, + // onSaved: (value){ + // _search.brand = value; + // }, + // ), SizedBox(height: 8.0 * AppStyle.getScaleFactor(context),), - ATextFormField( - initialValue: _search.brand, - hintText: _subtitle.brand, - style: Theme.of(context).textTheme.headline6, - textInputAction: TextInputAction.search, - onAction: (){ - if(!_formKey.currentState.validate()) - return; - _formKey.currentState.save(); - Navigator.of(context).pop(_search); - }, - onSaved: (value){ - _search.brand = value; - }, - ), - SizedBox(height: 8.0 * AppStyle.getScaleFactor(context),), - ATextFormField( + AutoCompleteModelField( initialValue: _search.model, - hintText: _subtitle.model, - style: Theme.of(context).textTheme.headline6, - textInputAction: TextInputAction.search, - onAction: (){ - if(!_formKey.currentState.validate()) - return; - _formKey.currentState.save(); + onPick: (lookup){ + _search.model = lookup; Navigator.of(context).pop(_search); }, - onSaved: (value){ - _search.model = value; - }, ), + // ATextFormField( + // initialValue: _search.model, + // hintText: _subtitle.model, + // style: Theme.of(context).textTheme.headline6, + // textInputAction: TextInputAction.search, + // onAction: (){ + // if(!_formKey.currentState.validate()) { + // return; + // } + // _formKey.currentState.save(); + // Navigator.of(context).pop(_search); + // }, + // onSaved: (value){ + // _search.model = value; + // }, + // ), SizedBox(height: 8.0 * AppStyle.getScaleFactor(context),), ASubTitle(_subtitle.status), SizedBox(height: 4.0 * AppStyle.getScaleFactor(context),), - Wrap( - spacing: 10, - runSpacing: 10, - children: List.generate( - status.length, - (index) { - bool isSelected = _search.statusValue == status[index].id; - return FilterItem( - isSelected: isSelected, - onSelected: (){ - if(isSelected) - _search.statusValue = null; - else - _search.statusValue = status[index].id; - - setState(() {}); - }, - status: status[index], - ); - } - - ), + PentryVisitsStatusMenu( + initialValue: _search.statusValue, + onSelect: (status){ + _search.statusValue = status; + }, ), + // Wrap( + // spacing: 10, + // runSpacing: 10, + // children: List.generate( + // status.length, + // (index) { + // bool isSelected = _search.statusValue == status[index].id; + // return FilterItem( + // isSelected: isSelected, + // onSelected: (){ + // if(isSelected) { + // _search.statusValue = null; + // } else { + // _search.statusValue = status[index].id; + // } + // + // setState(() {}); + // }, + // status: status[index], + // ); + // } + // + // ), + // ), SizedBox(height: 8.0 * AppStyle.getScaleFactor(context),), ASubTitle(_subtitle.contactStatus), SizedBox(height: 4.0 * AppStyle.getScaleFactor(context),), - Wrap( - spacing: 10, - runSpacing: 10, - children: List.generate( - contactStatus.length, - (index) { - bool isSelected = _search.contactStatus == contactStatus[index].key; - return FilterItem( - isSelected: isSelected, - onSelected: (){ - if(isSelected) - _search.contactStatus = null; - else - _search.contactStatus = contactStatus[index].key; - - setState(() {}); - }, - status: contactStatus[index], - ); - } - - ), + AssignedToMenu( + initialValue: _search.contactStatus, + onSelect: (status){ + _search.contactStatus = status; + }, ), + // Wrap( + // spacing: 10, + // runSpacing: 10, + // children: List.generate( + // contactStatus.length, + // (index) { + // bool isSelected = _search.contactStatus == contactStatus[index]; + // return FilterItem( + // isSelected: isSelected, + // onSelected: (){ + // if(isSelected) { + // _search.contactStatus = null; + // } else { + // _search.contactStatus = contactStatus[index]; + // } + // + // setState(() {}); + // }, + // status: contactStatus[index], + // ); + // } + // + // ), + // ), SizedBox(height: 8.0 * AppStyle.getScaleFactor(context),), ASubTitle(_subtitle.actualDate), SizedBox(height: 4.0 * AppStyle.getScaleFactor(context),), @@ -221,7 +251,7 @@ class _VisitsSearchDialogState extends State }, ), Visibility( - visible: _search.toSearchString().isNotEmpty, + visible: _search.toMap().isNotEmpty, child: Padding( padding: const EdgeInsets.symmetric(vertical: 8,horizontal: 16), child: AButton( diff --git a/lib/views/widgets/status/employee/employee_mune.dart b/lib/views/widgets/status/employee/assigned_to_mune.dart similarity index 83% rename from lib/views/widgets/status/employee/employee_mune.dart rename to lib/views/widgets/status/employee/assigned_to_mune.dart index 5ea741d4..8e4addf6 100644 --- a/lib/views/widgets/status/employee/employee_mune.dart +++ b/lib/views/widgets/status/employee/assigned_to_mune.dart @@ -1,21 +1,21 @@ import 'package:flutter/material.dart'; import 'package:provider/provider.dart'; -import 'package:test_sa/controllers/providers/api/status_drop_down/employee/employee_provider.dart'; +import 'package:test_sa/controllers/providers/api/status_drop_down/employee/assigned_to_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/models/lookup.dart'; import 'package:test_sa/views/widgets/loaders/loading_manager.dart'; import 'package:test_sa/views/widgets/status/single_status_menu.dart'; -class EmployeeMenu extends StatelessWidget { +class AssignedToMenu extends StatelessWidget { final Function(Lookup) onSelect; final Lookup initialValue; - const EmployeeMenu({Key key, this.onSelect, this.initialValue}) : super(key: key); + const AssignedToMenu({Key key, this.onSelect, this.initialValue}) : super(key: key); @override Widget build(BuildContext context) { final settingProvider = Provider.of(context); final userProvider = Provider.of(context); - final menuProvider = Provider.of(context); + final menuProvider = Provider.of(context); return LoadingManager( isLoading: menuProvider.isLoading, isFailedLoading: menuProvider.items == null, diff --git a/lib/views/widgets/status/employee/engineers_mune.dart b/lib/views/widgets/status/employee/engineers_mune.dart new file mode 100644 index 00000000..93b1597d --- /dev/null +++ b/lib/views/widgets/status/employee/engineers_mune.dart @@ -0,0 +1,37 @@ +import 'package:flutter/material.dart'; +import 'package:provider/provider.dart'; +import 'package:test_sa/controllers/providers/api/status_drop_down/employee/engineers_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/models/engineer.dart'; +import 'package:test_sa/views/widgets/loaders/loading_manager.dart'; +import 'package:test_sa/views/widgets/status/employee/single_type_menu.dart'; +class EngineersMenu extends StatelessWidget { + final Function(Engineer) onSelect; + final Engineer initialValue; + + const EngineersMenu({Key key, this.onSelect, this.initialValue}) : super(key: key); + @override + Widget build(BuildContext context) { + final settingProvider = Provider.of(context); + final userProvider = Provider.of(context); + final menuProvider = Provider.of(context); + return LoadingManager( + isLoading: menuProvider.isLoading, + isFailedLoading: menuProvider.items == null, + stateCode: menuProvider.stateCode, + onRefresh: () async { + menuProvider.reset(); + await menuProvider.getData( + user: userProvider.user, + host: settingProvider.host + ); + }, + child: SingleEngineerMenu( + initialStatus: initialValue, + engineers: menuProvider.items, + onSelect: onSelect, + ) + ); + } +} diff --git a/lib/views/widgets/status/employee/single_type_menu.dart b/lib/views/widgets/status/employee/single_type_menu.dart new file mode 100644 index 00000000..4ee21b7d --- /dev/null +++ b/lib/views/widgets/status/employee/single_type_menu.dart @@ -0,0 +1,99 @@ +import 'package:flutter/material.dart'; +import 'package:test_sa/models/engineer.dart'; +import 'package:test_sa/models/lookup.dart'; +import 'package:test_sa/views/app_style/colors.dart'; +import 'package:test_sa/views/app_style/sizing.dart'; +class SingleEngineerMenu extends StatefulWidget { + final List engineers; + final Engineer initialStatus; + final Function(Engineer) onSelect; + + const SingleEngineerMenu({Key key, this.engineers, this.onSelect, this.initialStatus}) : super(key: key); + @override + _SingleEngineerMenuState createState() => _SingleEngineerMenuState(); +} + +class _SingleEngineerMenuState extends State { + + Engineer _selectedStatus; + + @override + void didUpdateWidget(covariant SingleEngineerMenu oldWidget) { + if(widget.initialStatus != null && widget.initialStatus.id != null){ + _selectedStatus = widget.engineers?.firstWhere( + (element) { + return element == widget.initialStatus; + }); + widget.onSelect(_selectedStatus); + } else { + _selectedStatus = null; + } + super.didUpdateWidget(oldWidget); + } + + @override + void initState() { + if(widget.initialStatus != null && widget.initialStatus.id != null){ + _selectedStatus = widget.engineers?.firstWhere( + (element) { + return element == widget.initialStatus; + }); + widget.onSelect(_selectedStatus); + } + + super.initState(); + } + @override + Widget build(BuildContext context) { + return Container( + padding: const EdgeInsets.symmetric( + horizontal: 16 + ), + decoration: BoxDecoration( + color: Colors.white, + border: Border.all(color:AColors.black), + borderRadius: BorderRadius.circular( + AppStyle.borderRadius * AppStyle.getScaleFactor(context) + ), + boxShadow: const [ + AppStyle.boxShadow + ] + ), + child: DropdownButton( + value: _selectedStatus, + iconSize: 24, + elevation: 16, + isExpanded: true, + hint: Text( + "Select", + style: Theme.of(context).textTheme.subtitle1, + ), + style: TextStyle( + color: Theme.of(context).primaryColor + ), + underline: SizedBox.shrink(), + onChanged: (Engineer newValue) { + setState(() { + _selectedStatus = newValue; + }); + widget.onSelect(newValue); + }, + items: widget.engineers + .map>((Engineer value) { + return DropdownMenuItem( + value: value, + child: Text( + value.name, + style: Theme.of(context).textTheme.subtitle1.copyWith( + color: Theme.of(context).primaryColor, + fontSize: 11, + //fontWeight: FontWeight.bold + ), + ), + ); + }) + .toList(), + ), + ); + } +} diff --git a/lib/views/widgets/status/gas_refill/gas_cylinder_type.dart b/lib/views/widgets/status/gas_refill/gas_cylinder_type.dart new file mode 100644 index 00000000..7402e3a7 --- /dev/null +++ b/lib/views/widgets/status/gas_refill/gas_cylinder_type.dart @@ -0,0 +1,38 @@ +import 'package:flutter/material.dart'; +import 'package:provider/provider.dart'; +import 'package:test_sa/controllers/providers/api/status_drop_down/gas_refill/gas_cylinder_size_provider.dart'; +import 'package:test_sa/controllers/providers/api/status_drop_down/gas_refill/gas_cylinder_type_provider.dart'; +import 'package:test_sa/controllers/providers/api/user_provider.dart'; +import 'package:test_sa/controllers/providers/settings/setting_provider.dart'; +import 'package:test_sa/models/lookup.dart'; +import 'package:test_sa/views/widgets/loaders/loading_manager.dart'; +import 'package:test_sa/views/widgets/status/single_status_menu.dart'; +class GasCylinderTypesMenu extends StatelessWidget { + final Function(Lookup) onSelect; + final Lookup initialValue; + + const GasCylinderTypesMenu({Key key, this.onSelect, this.initialValue}) : super(key: key); + @override + Widget build(BuildContext context) { + final settingProvider = Provider.of(context); + final userProvider = Provider.of(context); + final menuProvider = Provider.of(context); + return LoadingManager( + isLoading: menuProvider.isLoading, + isFailedLoading: menuProvider.items == null, + stateCode: menuProvider.stateCode, + onRefresh: () async { + menuProvider.reset(); + await menuProvider.getData( + user: userProvider.user, + host: settingProvider.host + ); + }, + child: SingleStatusMenu( + initialStatus: initialValue, + statuses: menuProvider.items, + onSelect: onSelect, + ) + ); + } +} diff --git a/lib/views/widgets/status/multi_status_menu.dart b/lib/views/widgets/status/multi_status_menu.dart index 99a52a87..9d925df8 100644 --- a/lib/views/widgets/status/multi_status_menu.dart +++ b/lib/views/widgets/status/multi_status_menu.dart @@ -58,7 +58,7 @@ class _MultiStatusMenuState extends State { children: [ const SizedBox(width: 12,), Text( - status.label, + status.name, style: Theme.of(context).textTheme.bodyText1.copyWith( color:Theme.of(context).colorScheme.onPrimary, ), @@ -107,12 +107,12 @@ class _MultiStatusMenuState extends State { ), suggestionsCallback: (vale) { return widget.statuses.where((Lookup option) { - return option.label.toLowerCase().contains(_controller.text); + return option.name.toLowerCase().contains(_controller.text); }); }, itemBuilder: (context, part) { return ListTile( - title: Text(part.label), + title: Text(part.name), ); }, onSuggestionSelected: (status) { diff --git a/lib/views/widgets/status/report/service_report_status.dart b/lib/views/widgets/status/report/service_report_status.dart index 8a4d1c98..c0f0633e 100644 --- a/lib/views/widgets/status/report/service_report_status.dart +++ b/lib/views/widgets/status/report/service_report_status.dart @@ -34,10 +34,9 @@ class _ServiceReportStatusMenuState extends State { firstTime = false; } return LoadingManager( - isLoading: _menuProvider.isLoading == true || _callsLastSituationsProvider.isLoading == true, - isFailedLoading: _menuProvider.statuses == null || _callsLastSituationsProvider.calls == null, - stateCode: _menuProvider.stateCode == null || _callsLastSituationsProvider.stateCode == null ? null: - max(_menuProvider.stateCode ?? 0,_callsLastSituationsProvider.stateCode ?? 0), + isLoading: _menuProvider.isLoading == true, + isFailedLoading: _menuProvider.statuses == null, + stateCode: _menuProvider.stateCode, onRefresh: () async { if(_menuProvider.stateCode == null){ _menuProvider.reset(); @@ -46,7 +45,7 @@ class _ServiceReportStatusMenuState extends State { host: _settingProvider.host ); } - await _callsLastSituationsProvider.getCalls( + _callsLastSituationsProvider.getCalls( user: _userProvider.user, host: _settingProvider.host, serviceStatus: widget.report.status?.id.toString() @@ -56,12 +55,12 @@ class _ServiceReportStatusMenuState extends State { statuses: _menuProvider.statuses, initialStatus: widget.report.status, onSelect: (status){ - _callsLastSituationsProvider.getCalls( - user: _userProvider.user, - host: _settingProvider.host, - serviceStatus: status.id.toString() - ); - widget.report.callLastSituation = null; + // _callsLastSituationsProvider.getCalls( + // user: _userProvider.user, + // host: _settingProvider.host, + // serviceStatus: status.id.toString() + // ); + //widget.report.callLastSituation = null; widget.onSelect(status); }, ) diff --git a/lib/views/widgets/status/service_request/service_request_status_mune.dart b/lib/views/widgets/status/service_request/service_request_status_mune.dart new file mode 100644 index 00000000..b856f6c6 --- /dev/null +++ b/lib/views/widgets/status/service_request/service_request_status_mune.dart @@ -0,0 +1,40 @@ +import 'package:flutter/material.dart'; +import 'package:provider/provider.dart'; +import 'package:test_sa/controllers/providers/api/status_drop_down/report/service_report_priority_provider.dart'; +import 'package:test_sa/controllers/providers/api/status_drop_down/service_reqest/service_request_status_provider.dart'; +import 'package:test_sa/controllers/providers/api/status_drop_down/service_reqest/service_request_through_provider.dart'; +import 'package:test_sa/controllers/providers/api/status_drop_down/service_reqest/service_request_type_provider.dart'; +import 'package:test_sa/controllers/providers/api/user_provider.dart'; +import 'package:test_sa/controllers/providers/settings/setting_provider.dart'; +import 'package:test_sa/models/lookup.dart'; +import 'package:test_sa/views/widgets/loaders/loading_manager.dart'; +import 'package:test_sa/views/widgets/status/single_status_menu.dart'; +class ServiceRequestStatusMenu extends StatelessWidget { + final Function(Lookup) onSelect; + final Lookup initialValue; + + const ServiceRequestStatusMenu({Key key, this.onSelect, this.initialValue}) : super(key: key); + @override + Widget build(BuildContext context) { + final settingProvider = Provider.of(context); + final userProvider = Provider.of(context); + final menuProvider = Provider.of(context); + return LoadingManager( + isLoading: menuProvider.isLoading, + isFailedLoading: menuProvider.items == null, + stateCode: menuProvider.stateCode, + onRefresh: () async { + menuProvider.reset(); + await menuProvider.getData( + user: userProvider.user, + host: settingProvider.host + ); + }, + child: SingleStatusMenu( + initialStatus: initialValue, + statuses: menuProvider.items, + onSelect: onSelect, + ) + ); + } +} diff --git a/lib/views/widgets/status/service_request/service_request_through_mune.dart b/lib/views/widgets/status/service_request/service_request_through_mune.dart new file mode 100644 index 00000000..4612250a --- /dev/null +++ b/lib/views/widgets/status/service_request/service_request_through_mune.dart @@ -0,0 +1,38 @@ +import 'package:flutter/material.dart'; +import 'package:provider/provider.dart'; +import 'package:test_sa/controllers/providers/api/status_drop_down/report/service_report_priority_provider.dart'; +import 'package:test_sa/controllers/providers/api/status_drop_down/service_reqest/service_request_through_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/models/lookup.dart'; +import 'package:test_sa/views/widgets/loaders/loading_manager.dart'; +import 'package:test_sa/views/widgets/status/single_status_menu.dart'; +class ServiceRequestedThroughMenu extends StatelessWidget { + final Function(Lookup) onSelect; + final Lookup initialValue; + + const ServiceRequestedThroughMenu({Key key, this.onSelect, this.initialValue}) : super(key: key); + @override + Widget build(BuildContext context) { + final settingProvider = Provider.of(context); + final userProvider = Provider.of(context); + final menuProvider = Provider.of(context); + return LoadingManager( + isLoading: menuProvider.isLoading, + isFailedLoading: menuProvider.items == null, + stateCode: menuProvider.stateCode, + onRefresh: () async { + menuProvider.reset(); + await menuProvider.getData( + user: userProvider.user, + host: settingProvider.host + ); + }, + child: SingleStatusMenu( + initialStatus: initialValue, + statuses: menuProvider.items, + onSelect: onSelect, + ) + ); + } +} diff --git a/lib/views/widgets/status/service_request/service_request_types_mune.dart b/lib/views/widgets/status/service_request/service_request_types_mune.dart new file mode 100644 index 00000000..223a5725 --- /dev/null +++ b/lib/views/widgets/status/service_request/service_request_types_mune.dart @@ -0,0 +1,39 @@ +import 'package:flutter/material.dart'; +import 'package:provider/provider.dart'; +import 'package:test_sa/controllers/providers/api/status_drop_down/report/service_report_priority_provider.dart'; +import 'package:test_sa/controllers/providers/api/status_drop_down/service_reqest/service_request_through_provider.dart'; +import 'package:test_sa/controllers/providers/api/status_drop_down/service_reqest/service_request_type_provider.dart'; +import 'package:test_sa/controllers/providers/api/user_provider.dart'; +import 'package:test_sa/controllers/providers/settings/setting_provider.dart'; +import 'package:test_sa/models/lookup.dart'; +import 'package:test_sa/views/widgets/loaders/loading_manager.dart'; +import 'package:test_sa/views/widgets/status/single_status_menu.dart'; +class ServiceRequestTypesMenu extends StatelessWidget { + final Function(Lookup) onSelect; + final Lookup initialValue; + + const ServiceRequestTypesMenu({Key key, this.onSelect, this.initialValue}) : super(key: key); + @override + Widget build(BuildContext context) { + final settingProvider = Provider.of(context); + final userProvider = Provider.of(context); + final menuProvider = Provider.of(context); + return LoadingManager( + isLoading: menuProvider.isLoading, + isFailedLoading: menuProvider.items == null, + stateCode: menuProvider.stateCode, + onRefresh: () async { + menuProvider.reset(); + await menuProvider.getData( + user: userProvider.user, + host: settingProvider.host + ); + }, + child: SingleStatusMenu( + initialStatus: initialValue, + statuses: menuProvider.items, + onSelect: onSelect, + ) + ); + } +} diff --git a/lib/views/widgets/status/single_status_menu.dart b/lib/views/widgets/status/single_status_menu.dart index 6640bf19..fdf2b78d 100644 --- a/lib/views/widgets/status/single_status_menu.dart +++ b/lib/views/widgets/status/single_status_menu.dart @@ -16,13 +16,19 @@ class _SingleStatusMenuState extends State { Lookup _selectedStatus; + @override + void setState(VoidCallback fn) { + if(mounted) super.setState(fn); + } + @override void didUpdateWidget(covariant SingleStatusMenu oldWidget) { - if(widget.initialStatus != null){ + if(widget.initialStatus != null && widget.initialStatus.value != null){ _selectedStatus = widget.statuses?.firstWhere( (element) { - return element?.id == widget.initialStatus.id; + return element == widget.initialStatus; }); + widget.onSelect(_selectedStatus); } else { _selectedStatus = null; } @@ -31,11 +37,12 @@ class _SingleStatusMenuState extends State { @override void initState() { - if(widget.initialStatus != null){ + if(widget.initialStatus != null && widget.initialStatus.value != null){ _selectedStatus = widget.statuses?.firstWhere( (element) { - return element?.id == widget.initialStatus.id; + return element == widget.initialStatus; }); + widget.onSelect(_selectedStatus); } super.initState(); @@ -80,7 +87,7 @@ class _SingleStatusMenuState extends State { return DropdownMenuItem( value: value, child: Text( - value.label, + value.name, style: Theme.of(context).textTheme.subtitle1.copyWith( color: Theme.of(context).primaryColor, fontSize: 11, diff --git a/lib/views/widgets/visits/visit_item.dart b/lib/views/widgets/visits/visit_item.dart index a57016e6..54d9a64a 100644 --- a/lib/views/widgets/visits/visit_item.dart +++ b/lib/views/widgets/visits/visit_item.dart @@ -130,13 +130,13 @@ class VisitItem extends StatelessWidget { ), ), ), - Text( - visit.contactStatus ?? "", - style: Theme.of(context).textTheme.subtitle1.copyWith( - color: onItemColor, - fontSize: 14, - ), - ), + // Text( + // visit.contactStatus ?? "", + // style: Theme.of(context).textTheme.subtitle1.copyWith( + // color: onItemColor, + // fontSize: 14, + // ), + // ), ], ), Divider(color: onItemColor,), diff --git a/lib/views/widgets/visits/visit_status.dart b/lib/views/widgets/visits/visit_status.dart index 871287fe..5fb31918 100644 --- a/lib/views/widgets/visits/visit_status.dart +++ b/lib/views/widgets/visits/visit_status.dart @@ -31,9 +31,9 @@ class VisitStatusLabel extends StatelessWidget { ] ), child: Text( - visit.status.label == null - || visit.status.label.isEmpty - ? "no status" :visit.status.label, + visit.status.name == null + || visit.status.name.isEmpty + ? "no status" :visit.status.name, style: Theme.of(context).textTheme.subtitle2.copyWith( color: getStatusColor().computeLuminance() > 0.5 ? AColors.black : Colors.white, diff --git a/pubspec.lock b/pubspec.lock index 6dc640b6..5e3764cb 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -531,7 +531,7 @@ packages: name: logger url: "https://pub.dartlang.org" source: hosted - version: "1.1.0" + version: "1.3.0" matcher: dependency: transitive description: From 910e01324fdef1d998e938bfb1bcf51a78d9ad35 Mon Sep 17 00:00:00 2001 From: MaximusAshraf <50173497+MaximusAshraf@users.noreply.github.com> Date: Sat, 8 Apr 2023 16:05:24 +0200 Subject: [PATCH 008/181] bug fixing --- lib/controllers/api_routes/api_manager.dart | 43 +- .../api_routes/http_status_manger.dart | 2 +- lib/controllers/api_routes/urls.dart | 8 +- .../localization/localization.dart | 2 +- .../firebase_notification_manger.dart | 2 +- .../notification/notification_manger.dart | 2 +- .../providers/api/departments_provider.dart | 4 +- .../api/device_transfer_provider.dart | 14 +- .../providers/api/devices_provider.dart | 2 - .../providers/api/gas_refill_provider.dart | 12 +- .../providers/api/hospitals_provider.dart | 6 +- .../providers/api/notifications_provider.dart | 4 +- .../providers/api/parts_provider.dart | 7 +- ...reventive_maintenance_visits_provider.dart | 4 +- .../api/regular_visits_provider.dart | 8 +- .../api/service_requests_provider.dart | 63 +-- .../employee/assigned_to_provider.dart | 7 +- .../employee/engineers_provider.dart | 1 - .../gas_cylinder_size_provider.dart | 6 +- .../gas_cylinder_type_provider.dart | 6 +- .../gas_refill/gas_status_provider.dart | 6 +- .../gas_refill/gas_types_provider.dart | 6 +- .../pentry/pentry_status_provider.dart | 6 +- .../pentry/pentry_task_status_provider.dart | 6 +- .../pentry/pentry_visit_status_provider.dart | 6 +- .../service_report_defect_types_provider.dart | 6 +- .../service_report_last_calls_provider.dart | 8 +- .../service_report_priority_provider.dart | 7 +- .../service_report_reasons_provider.dart | 6 +- .../report/service_report_types_provider.dart | 6 +- .../report/service_types_provider.dart | 8 +- .../service_request_status_provider.dart | 6 +- .../service_request_through_provider.dart | 6 +- .../service_request_type_provider.dart | 6 +- .../providers/api/user_provider.dart | 6 +- lib/main.dart | 7 +- lib/models/device/device.dart | 77 ++-- lib/models/device/device_transfer.dart | 4 - lib/models/device/device_transfer_info.dart | 2 - lib/models/device/model.dart | 47 +++ lib/models/engineer.dart | 14 +- lib/models/hospital.dart | 18 + lib/models/lookup.dart | 14 +- lib/models/pantry/calibration_tools.dart | 2 +- lib/models/pantry/pentry.dart | 28 +- lib/models/pantry/pm_kit.dart | 4 +- lib/models/pantry/ppm_check_list.dart | 2 +- lib/models/part.dart | 20 +- lib/models/service_report.dart | 160 ++++--- .../service_request/service_request.dart | 10 +- lib/models/user.dart | 1 - lib/models/visits/visit.dart | 4 +- lib/models/visits/visits_group.dart | 1 - lib/views/app_style/colors.dart | 1 - .../update_device_transfer.dart | 1 - lib/views/pages/login.dart | 11 +- lib/views/pages/splash_screen.dart | 1 - .../user/gas_refill/gas_refill_details.dart | 1 - lib/views/pages/user/land_page.dart | 130 +++--- .../pages/user/requests/create_request.dart | 1 - .../report/create_service_report.dart | 396 ++++++++++-------- .../requests/report/edit_service_report.dart | 371 +++++++++------- .../pages/user/requests/request_details.dart | 110 ++--- .../pages/user/visits/pantry/edit_pentry.dart | 4 +- .../visits/update_visits_group_sheet.dart | 8 - .../pages/user/visits/visit_details.dart | 1 - lib/views/widgets/app_name_bar.dart | 2 +- lib/views/widgets/app_text_form_field.dart | 2 +- .../widgets/date_and_time/date_picker.dart | 3 +- .../date_and_time/from_to_date_bar.dart | 2 +- .../departments/department_button.dart | 4 +- .../widgets/departments/department_item.dart | 2 +- .../departments/single_department_picker.dart | 4 +- .../device_transfer_info_section.dart | 1 - .../device_trancfer/device_transfer_item.dart | 13 +- .../device_trancfer/device_transfer_list.dart | 8 +- .../widgets/e_signature/e_signature.dart | 6 +- .../auto_complete_devices_field.dart | 9 +- .../equipment/auto_complete_models_field.dart | 8 +- .../widgets/equipment/device_button.dart | 10 +- lib/views/widgets/equipment/device_item.dart | 8 +- .../equipment/single_device_picker.dart | 7 +- .../widgets/gas_refill/gas_refill_item.dart | 12 +- .../widgets/gas_refill/gas_refill_list.dart | 5 +- .../gas_refill_update_details_item.dart | 1 - .../hospital_auto_complete_field.dart | 7 +- .../widgets/hospitals/hospital_button.dart | 4 +- .../widgets/hospitals/hospital_item.dart | 2 +- .../hospitals/single_hospital_picker.dart | 4 +- .../widgets/loaders/loading_manager.dart | 2 +- .../notifications/notification_item.dart | 4 +- .../auto_complete_devices_field.dart | 2 +- .../widgets/pentry/pentry_info_form.dart | 49 ++- .../widgets/pentry/pentry_pm_kit_form.dart | 1 - .../search/service_request_search_bar.dart | 2 - .../widgets/search/visits_search_bar.dart | 1 - .../speech_to_text/speech_to_text.dart | 9 +- .../status/employee/single_type_menu.dart | 1 - .../status/gas_refill/gas_cylinder_type.dart | 1 - .../status/report/service_report_status.dart | 53 +-- .../widgets/status/report/service_status.dart | 4 +- .../service_request_status_mune.dart | 3 - .../service_request_through_mune.dart | 1 - .../service_request_types_mune.dart | 2 - .../widgets/status/single_status_menu.dart | 22 +- 105 files changed, 1089 insertions(+), 941 deletions(-) create mode 100644 lib/models/device/model.dart diff --git a/lib/controllers/api_routes/api_manager.dart b/lib/controllers/api_routes/api_manager.dart index ae4eae9c..41728339 100644 --- a/lib/controllers/api_routes/api_manager.dart +++ b/lib/controllers/api_routes/api_manager.dart @@ -1,4 +1,5 @@ import 'dart:convert'; +import 'dart:developer'; import 'package:flutter/cupertino.dart'; import 'package:fluttertoast/fluttertoast.dart'; @@ -19,9 +20,9 @@ class ApiManager { ) async{ Uri _url = Uri.parse(url); - print(_url); +// print(_url); http.Response response = await http.get(_url,headers: headers); - if(response.body is! List){ + if(jsonDecode(response.body) is Map){ final message = jsonDecode(response.body)["message"]; if(message != null && message.toString().isNotEmpty){ Fluttertoast.showToast(msg: message ?? "",toastLength: Toast.LENGTH_LONG); @@ -43,19 +44,19 @@ class ApiManager { headers.addAll(_headers); Uri _url = Uri.parse(url); - print(_url); - print(headers); - print(json.encode(body)); +// print(_url); +// print(headers); + log(json.encode(body)); var request = http.Request('POST', _url); request.body = json.encode(body); request.headers.addAll(headers); http.StreamedResponse _streamedResponse = await request.send(); http.Response response = await http.Response.fromStream(_streamedResponse); - print(response.statusCode); - print(response.body); +// print(response.statusCode); +// log(response.body); - if(response.body is! List){ + if(jsonDecode(response.body) is Map){ final message = jsonDecode(response.body)["message"]; if(message != null && message.toString().isNotEmpty){ Fluttertoast.showToast(msg: message ?? "",toastLength: Toast.LENGTH_LONG); @@ -77,18 +78,18 @@ class ApiManager { headers.addAll(_headers); Uri _url = Uri.parse(url); - print(_url); - print(headers); - print(json.encode(body)); + // print(_url); + // print(headers); + // log(json.encode(body)); var request = http.Request('PUT', _url); request.body = json.encode(body); request.headers.addAll(headers); http.StreamedResponse streamedResponse = await request.send(); http.Response response = await http.Response.fromStream(streamedResponse); - print(response.statusCode); - print(response.body); - if(response.body is! List){ + // print(response.statusCode); + // log(response.body); + if(jsonDecode(response.body) is Map){ final message = jsonDecode(response.body)["message"]; if(message != null && message.toString().isNotEmpty){ Fluttertoast.showToast(msg: message ?? "",toastLength: Toast.LENGTH_LONG); @@ -110,9 +111,9 @@ class ApiManager { headers.addAll(_headers); Uri _url = Uri.parse(url); - print(_url); - print(_headers); - print(json.encode(body)); + // print(_url); + // print(_headers); + // print(json.encode(body)); var request = http.MultipartRequest('POST', _url); request.fields.addAll(body); request.headers.addAll(_headers); @@ -122,12 +123,12 @@ class ApiManager { } //request.files.addAll(_files); - print(request.files); + // print(request.files); http.StreamedResponse streamedResponse = await request.send(); http.Response response = await http.Response.fromStream(streamedResponse); - print(response.statusCode); - print(response.body); - if(response.body is! List){ + // print(response.statusCode); + // log(response.body); + if(jsonDecode(response.body) is Map){ final message = jsonDecode(response.body)["message"]; if(message != null && message.toString().isNotEmpty){ Fluttertoast.showToast(msg: message ?? "",toastLength: Toast.LENGTH_LONG); diff --git a/lib/controllers/api_routes/http_status_manger.dart b/lib/controllers/api_routes/http_status_manger.dart index 012a9a23..0bfb2170 100644 --- a/lib/controllers/api_routes/http_status_manger.dart +++ b/lib/controllers/api_routes/http_status_manger.dart @@ -1,5 +1,5 @@ -import 'package:test_sa/models/subtitle.dart'; import 'package:meta/meta.dart'; +import 'package:test_sa/models/subtitle.dart'; class HttpStatusManger{ static String getStatusMessage({ diff --git a/lib/controllers/api_routes/urls.dart b/lib/controllers/api_routes/urls.dart index 70dca275..d6607102 100644 --- a/lib/controllers/api_routes/urls.dart +++ b/lib/controllers/api_routes/urls.dart @@ -40,16 +40,16 @@ class URLs{ static get updateRequestDate => "$_baseUrl/handle/update/request"; // get // service report - static get createServiceReport => "$_baseUrl/handle/create/service/report"; // get - static get updateServiceReport => "$_baseUrl/handle/update/service/report"; // get + static get createServiceReport => "$_baseUrl/WorkOrder/AddWorkOrder"; // get + static get updateServiceReport => "$_baseUrl/WorkOrder/UpdateWorkOrder"; // get static get getServiceReport => "$_baseUrl/WorkOrder/GetWorkOrderById"; // get static get createDuplicatedReport => "$_baseUrl/handle/duplicate/request"; // get static get getServiceReportReasons => "$_baseUrl/Lookups/GetLookup?lookupEnum=522"; // get - static get getServiceReportTypes => "$_baseUrl/Lookups/GetLookup?lookupEnum=34"; // get + static get getServiceReportTypes => "$_baseUrl/Lookups/GetLookup?lookupEnum=501"; // get static get getServiceReportStatus => "$_baseUrl/Lookups/GetLookup?lookupEnum=521"; // get static get getServiceReportLastCalls => "$_baseUrl/Lookups/GetLookup?lookupEnum=520"; // get - static get getServiceTypes => "$_baseUrl/Lookups/GetLookup?lookupEnum=604"; // get + static get getAssetTypes => "$_baseUrl/Lookups/GetLookup?lookupEnum=28"; // get static get getPartNumber => "$_baseUrl/PartCatalog/GetPartAutoComplete"; // get static get getServiceReportPriority => "$_baseUrl/Lookups/GetLookup?lookupEnum=602"; // get static get getServiceReportDefectTypes => "$_baseUrl/Lookups/GetLookup?lookupEnum=601"; // get diff --git a/lib/controllers/localization/localization.dart b/lib/controllers/localization/localization.dart index fafc8aaf..a6e7fe82 100644 --- a/lib/controllers/localization/localization.dart +++ b/lib/controllers/localization/localization.dart @@ -1,8 +1,8 @@ import 'dart:convert'; -import 'package:test_sa/models/subtitle.dart'; import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; +import 'package:test_sa/models/subtitle.dart'; class AppLocalization { diff --git a/lib/controllers/notification/firebase_notification_manger.dart b/lib/controllers/notification/firebase_notification_manger.dart index 19ef543e..153d28fa 100644 --- a/lib/controllers/notification/firebase_notification_manger.dart +++ b/lib/controllers/notification/firebase_notification_manger.dart @@ -1,9 +1,9 @@ import 'dart:convert'; -import 'package:test_sa/models/app_notification.dart'; import 'package:firebase_core/firebase_core.dart'; import 'package:firebase_messaging/firebase_messaging.dart'; import 'package:flutter/material.dart'; +import 'package:test_sa/models/app_notification.dart'; import 'notification_manger.dart'; diff --git a/lib/controllers/notification/notification_manger.dart b/lib/controllers/notification/notification_manger.dart index 8c0de712..a568d5d3 100644 --- a/lib/controllers/notification/notification_manger.dart +++ b/lib/controllers/notification/notification_manger.dart @@ -1,6 +1,6 @@ -import 'package:test_sa/views/app_style/colors.dart'; import 'package:flutter/foundation.dart'; import 'package:flutter_local_notifications/flutter_local_notifications.dart'; +import 'package:test_sa/views/app_style/colors.dart'; class NotificationManger{ // private constructor to avoid create object diff --git a/lib/controllers/providers/api/departments_provider.dart b/lib/controllers/providers/api/departments_provider.dart index 07b0a57b..27146791 100644 --- a/lib/controllers/providers/api/departments_provider.dart +++ b/lib/controllers/providers/api/departments_provider.dart @@ -1,10 +1,10 @@ import 'dart:convert'; +import 'package:flutter/cupertino.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/department.dart'; -import 'package:flutter/cupertino.dart'; -import 'package:http/http.dart'; class DepartmentsProvider extends ChangeNotifier{ diff --git a/lib/controllers/providers/api/device_transfer_provider.dart b/lib/controllers/providers/api/device_transfer_provider.dart index ff1b77f3..ce8920f5 100644 --- a/lib/controllers/providers/api/device_transfer_provider.dart +++ b/lib/controllers/providers/api/device_transfer_provider.dart @@ -1,22 +1,12 @@ import 'dart:convert'; +import 'package:flutter/cupertino.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/controllers/api_routes/http_status_manger.dart'; -import 'package:test_sa/models/department.dart'; import 'package:test_sa/models/device/device_transfer.dart'; -import 'package:test_sa/models/device/device.dart'; import 'package:test_sa/models/device/device_transfer_info.dart'; -import 'package:test_sa/models/gas_refill/gas_refill_model.dart'; -import 'package:test_sa/models/hospital.dart'; -import 'package:test_sa/models/issue.dart'; -import 'package:test_sa/models/service_report.dart'; -import 'package:test_sa/models/service_request/service_request.dart'; -import 'package:test_sa/models/service_request/service_request_search.dart'; -import 'package:test_sa/models/subtitle.dart'; import 'package:test_sa/models/user.dart'; -import 'package:flutter/cupertino.dart'; -import 'package:http/http.dart'; class DeviceTransferProvider extends ChangeNotifier{ diff --git a/lib/controllers/providers/api/devices_provider.dart b/lib/controllers/providers/api/devices_provider.dart index e957cb17..781e7c45 100644 --- a/lib/controllers/providers/api/devices_provider.dart +++ b/lib/controllers/providers/api/devices_provider.dart @@ -116,7 +116,6 @@ class DevicesProvider extends ChangeNotifier{ } return page; } catch(error) { - print(error); return []; } @@ -144,7 +143,6 @@ class DevicesProvider extends ChangeNotifier{ } return page; } catch(error) { - print(error); return []; } diff --git a/lib/controllers/providers/api/gas_refill_provider.dart b/lib/controllers/providers/api/gas_refill_provider.dart index da3b6077..2f460a0a 100644 --- a/lib/controllers/providers/api/gas_refill_provider.dart +++ b/lib/controllers/providers/api/gas_refill_provider.dart @@ -1,17 +1,11 @@ import 'dart:convert'; +import 'package:flutter/cupertino.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/controllers/api_routes/http_status_manger.dart'; import 'package:test_sa/models/gas_refill/gas_refill_model.dart'; -import 'package:test_sa/models/issue.dart'; -import 'package:test_sa/models/service_report.dart'; -import 'package:test_sa/models/service_request/service_request.dart'; -import 'package:test_sa/models/service_request/service_request_search.dart'; -import 'package:test_sa/models/subtitle.dart'; import 'package:test_sa/models/user.dart'; -import 'package:flutter/cupertino.dart'; -import 'package:http/http.dart'; class GasRefillProvider extends ChangeNotifier{ @@ -83,7 +77,6 @@ class GasRefillProvider extends ChangeNotifier{ return response.statusCode; } catch(error) { - print(error); isLoading = false; stateCode = -1; notifyListeners(); @@ -127,7 +120,6 @@ class GasRefillProvider extends ChangeNotifier{ return response.statusCode; } catch(error) { - print(error); return -1; } diff --git a/lib/controllers/providers/api/hospitals_provider.dart b/lib/controllers/providers/api/hospitals_provider.dart index 7b19a6e1..bdcb9fa7 100644 --- a/lib/controllers/providers/api/hospitals_provider.dart +++ b/lib/controllers/providers/api/hospitals_provider.dart @@ -1,12 +1,12 @@ import 'dart:convert'; +import 'package:flutter/cupertino.dart'; +import 'package:flutter/material.dart'; +import 'package:http/http.dart'; import 'package:test_sa/controllers/api_routes/api_manager.dart'; import 'package:test_sa/controllers/api_routes/urls.dart'; import 'package:test_sa/models/hospital.dart'; import 'package:test_sa/models/user.dart'; -import 'package:flutter/cupertino.dart'; -import 'package:flutter/material.dart'; -import 'package:http/http.dart'; class HospitalsProvider extends ChangeNotifier{ diff --git a/lib/controllers/providers/api/notifications_provider.dart b/lib/controllers/providers/api/notifications_provider.dart index 36abef10..0f216a0a 100644 --- a/lib/controllers/providers/api/notifications_provider.dart +++ b/lib/controllers/providers/api/notifications_provider.dart @@ -1,10 +1,10 @@ import 'dart:convert'; +import 'package:flutter/cupertino.dart'; +import 'package:http/http.dart'; import 'package:test_sa/controllers/api_routes/urls.dart'; import 'package:test_sa/models/app_notification.dart'; import 'package:test_sa/models/user.dart'; -import 'package:flutter/cupertino.dart'; -import 'package:http/http.dart'; class NotificationsProvider extends ChangeNotifier{ diff --git a/lib/controllers/providers/api/parts_provider.dart b/lib/controllers/providers/api/parts_provider.dart index 864adaeb..8603c860 100644 --- a/lib/controllers/providers/api/parts_provider.dart +++ b/lib/controllers/providers/api/parts_provider.dart @@ -1,12 +1,12 @@ import 'dart:convert'; +import 'package:flutter/cupertino.dart'; +import 'package:flutter/material.dart'; +import 'package:http/http.dart'; import 'package:test_sa/controllers/api_routes/api_manager.dart'; import 'package:test_sa/controllers/api_routes/urls.dart'; import 'package:test_sa/models/part.dart'; import 'package:test_sa/models/user.dart'; -import 'package:flutter/cupertino.dart'; -import 'package:flutter/material.dart'; -import 'package:http/http.dart'; class PartsProvider extends ChangeNotifier{ @@ -111,7 +111,6 @@ class PartsProvider extends ChangeNotifier{ } return _page; } catch(error) { - print(error); return []; } diff --git a/lib/controllers/providers/api/preventive_maintenance_visits_provider.dart b/lib/controllers/providers/api/preventive_maintenance_visits_provider.dart index 9d209fec..feb64cd4 100644 --- a/lib/controllers/providers/api/preventive_maintenance_visits_provider.dart +++ b/lib/controllers/providers/api/preventive_maintenance_visits_provider.dart @@ -1,13 +1,13 @@ import 'dart:convert'; +import 'package:flutter/cupertino.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/user.dart'; import 'package:test_sa/models/visits/visit.dart'; import 'package:test_sa/models/visits/visits_group.dart'; import 'package:test_sa/models/visits/visits_search.dart'; -import 'package:flutter/cupertino.dart'; -import 'package:http/http.dart'; class PreventiveMaintenanceVisitsProvider extends ChangeNotifier{ diff --git a/lib/controllers/providers/api/regular_visits_provider.dart b/lib/controllers/providers/api/regular_visits_provider.dart index d9baaec1..39119490 100644 --- a/lib/controllers/providers/api/regular_visits_provider.dart +++ b/lib/controllers/providers/api/regular_visits_provider.dart @@ -1,5 +1,8 @@ import 'dart:convert'; +import 'package:flutter/cupertino.dart'; +import 'package:http/http.dart'; +import 'package:logger/logger.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/pantry/pentry.dart'; @@ -7,9 +10,6 @@ import 'package:test_sa/models/user.dart'; import 'package:test_sa/models/visits/visit.dart'; import 'package:test_sa/models/visits/visits_group.dart'; import 'package:test_sa/models/visits/visits_search.dart'; -import 'package:flutter/cupertino.dart'; -import 'package:http/http.dart'; -import 'package:logger/logger.dart'; class RegularVisitsProvider extends ChangeNotifier{ @@ -164,6 +164,7 @@ class RegularVisitsProvider extends ChangeNotifier{ Map body = pentry.toMap(visit.id); body["id"] = visit.id; body["assetId"] = visit.deviceId; + body["ppmScheduleId"] = visit.ppmScheduleId; // body["token"] = user.token; // body["vChecklists"]?.addAll({}); // body["vCalibrationTools"]?.addAll({"visitId": visit.id,}); @@ -183,7 +184,6 @@ class RegularVisitsProvider extends ChangeNotifier{ return response.statusCode; } catch(error) { - print(error); return -1; } diff --git a/lib/controllers/providers/api/service_requests_provider.dart b/lib/controllers/providers/api/service_requests_provider.dart index 67f7f5ab..36e20746 100644 --- a/lib/controllers/providers/api/service_requests_provider.dart +++ b/lib/controllers/providers/api/service_requests_provider.dart @@ -1,8 +1,10 @@ import 'dart:convert'; +import 'package:flutter/cupertino.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/controllers/api_routes/http_status_manger.dart'; +import 'package:test_sa/controllers/api_routes/urls.dart'; import 'package:test_sa/models/issue.dart'; import 'package:test_sa/models/lookup.dart'; import 'package:test_sa/models/service_report.dart'; @@ -11,8 +13,6 @@ import 'package:test_sa/models/service_request/service_request_search.dart'; import 'package:test_sa/models/subtitle.dart'; import 'package:test_sa/models/timer_model.dart'; import 'package:test_sa/models/user.dart'; -import 'package:flutter/cupertino.dart'; -import 'package:http/http.dart'; class ServiceRequestsProvider extends ChangeNotifier{ @@ -89,7 +89,6 @@ class ServiceRequestsProvider extends ChangeNotifier{ return response.statusCode; } catch(error) { - print(error); isLoading = false; stateCode = -1; notifyListeners(); @@ -182,7 +181,6 @@ class ServiceRequestsProvider extends ChangeNotifier{ return response.statusCode; } catch(error) { - print(error); return -1; } @@ -255,16 +253,20 @@ class ServiceRequestsProvider extends ChangeNotifier{ @required ServiceRequest request, }) async { Response response; - Map body = report.toMap(); - body["uid"] = user.id; - body["token"] = user.token; - body["job_id"] = request.id; + try{ - response = await post( - Uri.parse( - host+URLs.createServiceReport), - body: body, + Map body = report.toMap(request); + // body["uid"] = user.id; + // body["token"] = user.token; + response = await ApiManager.instance.post( + URLs.createServiceReport, + body: body ); + // response = await post( + // Uri.parse( + // host+URLs.createServiceReport), + // body: body, + // ); stateCode = response.statusCode; if(response.statusCode >= 200 && response.statusCode < 300) { @@ -274,7 +276,6 @@ class ServiceRequestsProvider extends ChangeNotifier{ return response.statusCode; } catch(error) { - return -1; } @@ -322,18 +323,25 @@ class ServiceRequestsProvider extends ChangeNotifier{ @required ServiceRequest request, }) async { Response response; - Map body = report.toMap(); - body["uid"] = user.id; - body["token"] = user.token; - body["job_id"] = request.id; - body["report_id"] = request.reportID; + //Map body = report.toMap(request); + // body["uid"] = user.id; + // body["token"] = user.token; + // body["job_id"] = request.id; + // body["report_id"] = request.reportID; try{ - response = await post( - Uri.parse( - host+URLs.updateServiceReport), - body: body, + Map body = report.toMap(request); + // body["uid"] = user.id; + // body["token"] = user.token; + response = await ApiManager.instance.put( + URLs.updateServiceReport, + body: body ); - stateCode = response.statusCode; + // response = await post( + // Uri.parse( + // host+URLs.updateServiceReport), + // body: body, + // ); + // stateCode = response.statusCode; if(response.statusCode >= 200 && response.statusCode < 300) { reset(); @@ -342,7 +350,6 @@ class ServiceRequestsProvider extends ChangeNotifier{ return response.statusCode; } catch(error) { - return -1; } @@ -355,7 +362,7 @@ class ServiceRequestsProvider extends ChangeNotifier{ @required ServiceRequest request, }) async { Response response; - Map body = {}; + Map body = {}; body["uid"] = user.id; body["token"] = user.token; body["job_id"] = request.id; @@ -385,7 +392,7 @@ class ServiceRequestsProvider extends ChangeNotifier{ } Future getSingleServiceReport({ - @required String reportId, + @required int reportId, @required String host, @required User user, @required Subtitle subtitle, @@ -406,7 +413,7 @@ class ServiceRequestsProvider extends ChangeNotifier{ if (response.statusCode >= 200 && response.statusCode < 300){ // If the call to the server was successful, parse the JSON. return ServiceReport.fromJson( - json.decode(utf8.decode(response.bodyBytes)),reportId); + json.decode(response.body)["data"],reportId); }else{ throw(HttpStatusManger.getStatusMessage( status: response.statusCode, subtitle: subtitle)); diff --git a/lib/controllers/providers/api/status_drop_down/employee/assigned_to_provider.dart b/lib/controllers/providers/api/status_drop_down/employee/assigned_to_provider.dart index 757b13f9..f0ff7e05 100644 --- a/lib/controllers/providers/api/status_drop_down/employee/assigned_to_provider.dart +++ b/lib/controllers/providers/api/status_drop_down/employee/assigned_to_provider.dart @@ -1,12 +1,12 @@ import 'dart:convert'; +import 'package:flutter/cupertino.dart'; +import 'package:flutter/material.dart'; +import 'package:http/http.dart'; import 'package:test_sa/controllers/api_routes/api_manager.dart'; import 'package:test_sa/controllers/api_routes/urls.dart'; import 'package:test_sa/models/lookup.dart'; import 'package:test_sa/models/user.dart'; -import 'package:flutter/cupertino.dart'; -import 'package:flutter/material.dart'; -import 'package:http/http.dart'; class AssignedToProvider extends ChangeNotifier{ @@ -62,7 +62,6 @@ class AssignedToProvider extends ChangeNotifier{ notifyListeners(); return response.statusCode; } catch(error) { - print(error); _loading = false; _stateCode = -1; notifyListeners(); diff --git a/lib/controllers/providers/api/status_drop_down/employee/engineers_provider.dart b/lib/controllers/providers/api/status_drop_down/employee/engineers_provider.dart index 67c10b26..af47a022 100644 --- a/lib/controllers/providers/api/status_drop_down/employee/engineers_provider.dart +++ b/lib/controllers/providers/api/status_drop_down/employee/engineers_provider.dart @@ -62,7 +62,6 @@ class EngineersProvider extends ChangeNotifier{ notifyListeners(); return response.statusCode; } catch(error) { - print(error); _loading = false; _stateCode = -1; notifyListeners(); diff --git a/lib/controllers/providers/api/status_drop_down/gas_refill/gas_cylinder_size_provider.dart b/lib/controllers/providers/api/status_drop_down/gas_refill/gas_cylinder_size_provider.dart index ecf5a0c7..7952a2f6 100644 --- a/lib/controllers/providers/api/status_drop_down/gas_refill/gas_cylinder_size_provider.dart +++ b/lib/controllers/providers/api/status_drop_down/gas_refill/gas_cylinder_size_provider.dart @@ -1,12 +1,12 @@ import 'dart:convert'; +import 'package:flutter/cupertino.dart'; +import 'package:flutter/material.dart'; +import 'package:http/http.dart'; import 'package:test_sa/controllers/api_routes/api_manager.dart'; import 'package:test_sa/controllers/api_routes/urls.dart'; import 'package:test_sa/models/lookup.dart'; import 'package:test_sa/models/user.dart'; -import 'package:flutter/cupertino.dart'; -import 'package:flutter/material.dart'; -import 'package:http/http.dart'; class GasCylinderSizesProvider extends ChangeNotifier{ diff --git a/lib/controllers/providers/api/status_drop_down/gas_refill/gas_cylinder_type_provider.dart b/lib/controllers/providers/api/status_drop_down/gas_refill/gas_cylinder_type_provider.dart index 0d1a1e0a..370370c1 100644 --- a/lib/controllers/providers/api/status_drop_down/gas_refill/gas_cylinder_type_provider.dart +++ b/lib/controllers/providers/api/status_drop_down/gas_refill/gas_cylinder_type_provider.dart @@ -1,12 +1,12 @@ import 'dart:convert'; +import 'package:flutter/cupertino.dart'; +import 'package:flutter/material.dart'; +import 'package:http/http.dart'; import 'package:test_sa/controllers/api_routes/api_manager.dart'; import 'package:test_sa/controllers/api_routes/urls.dart'; import 'package:test_sa/models/lookup.dart'; import 'package:test_sa/models/user.dart'; -import 'package:flutter/cupertino.dart'; -import 'package:flutter/material.dart'; -import 'package:http/http.dart'; class GasCylinderTypesProvider extends ChangeNotifier{ diff --git a/lib/controllers/providers/api/status_drop_down/gas_refill/gas_status_provider.dart b/lib/controllers/providers/api/status_drop_down/gas_refill/gas_status_provider.dart index 6073c9fe..be389cdf 100644 --- a/lib/controllers/providers/api/status_drop_down/gas_refill/gas_status_provider.dart +++ b/lib/controllers/providers/api/status_drop_down/gas_refill/gas_status_provider.dart @@ -1,12 +1,12 @@ import 'dart:convert'; +import 'package:flutter/cupertino.dart'; +import 'package:flutter/material.dart'; +import 'package:http/http.dart'; import 'package:test_sa/controllers/api_routes/api_manager.dart'; import 'package:test_sa/controllers/api_routes/urls.dart'; import 'package:test_sa/models/lookup.dart'; import 'package:test_sa/models/user.dart'; -import 'package:flutter/cupertino.dart'; -import 'package:flutter/material.dart'; -import 'package:http/http.dart'; class GasStatusProvider extends ChangeNotifier{ diff --git a/lib/controllers/providers/api/status_drop_down/gas_refill/gas_types_provider.dart b/lib/controllers/providers/api/status_drop_down/gas_refill/gas_types_provider.dart index 3286ea00..63b0e0ed 100644 --- a/lib/controllers/providers/api/status_drop_down/gas_refill/gas_types_provider.dart +++ b/lib/controllers/providers/api/status_drop_down/gas_refill/gas_types_provider.dart @@ -1,12 +1,12 @@ import 'dart:convert'; +import 'package:flutter/cupertino.dart'; +import 'package:flutter/material.dart'; +import 'package:http/http.dart'; import 'package:test_sa/controllers/api_routes/api_manager.dart'; import 'package:test_sa/controllers/api_routes/urls.dart'; import 'package:test_sa/models/lookup.dart'; import 'package:test_sa/models/user.dart'; -import 'package:flutter/cupertino.dart'; -import 'package:flutter/material.dart'; -import 'package:http/http.dart'; class GasTypesProvider extends ChangeNotifier{ diff --git a/lib/controllers/providers/api/status_drop_down/pentry/pentry_status_provider.dart b/lib/controllers/providers/api/status_drop_down/pentry/pentry_status_provider.dart index e5d769ac..335aae1d 100644 --- a/lib/controllers/providers/api/status_drop_down/pentry/pentry_status_provider.dart +++ b/lib/controllers/providers/api/status_drop_down/pentry/pentry_status_provider.dart @@ -1,12 +1,12 @@ import 'dart:convert'; +import 'package:flutter/cupertino.dart'; +import 'package:flutter/material.dart'; +import 'package:http/http.dart'; import 'package:test_sa/controllers/api_routes/api_manager.dart'; import 'package:test_sa/controllers/api_routes/urls.dart'; import 'package:test_sa/models/lookup.dart'; import 'package:test_sa/models/user.dart'; -import 'package:flutter/cupertino.dart'; -import 'package:flutter/material.dart'; -import 'package:http/http.dart'; class PentryStatusProvider extends ChangeNotifier{ diff --git a/lib/controllers/providers/api/status_drop_down/pentry/pentry_task_status_provider.dart b/lib/controllers/providers/api/status_drop_down/pentry/pentry_task_status_provider.dart index 689f357d..5690aa83 100644 --- a/lib/controllers/providers/api/status_drop_down/pentry/pentry_task_status_provider.dart +++ b/lib/controllers/providers/api/status_drop_down/pentry/pentry_task_status_provider.dart @@ -1,12 +1,12 @@ import 'dart:convert'; +import 'package:flutter/cupertino.dart'; +import 'package:flutter/material.dart'; +import 'package:http/http.dart'; import 'package:test_sa/controllers/api_routes/api_manager.dart'; import 'package:test_sa/controllers/api_routes/urls.dart'; import 'package:test_sa/models/lookup.dart'; import 'package:test_sa/models/user.dart'; -import 'package:flutter/cupertino.dart'; -import 'package:flutter/material.dart'; -import 'package:http/http.dart'; class PentryTaskStatusProvider extends ChangeNotifier{ diff --git a/lib/controllers/providers/api/status_drop_down/pentry/pentry_visit_status_provider.dart b/lib/controllers/providers/api/status_drop_down/pentry/pentry_visit_status_provider.dart index c616d746..f86f15b0 100644 --- a/lib/controllers/providers/api/status_drop_down/pentry/pentry_visit_status_provider.dart +++ b/lib/controllers/providers/api/status_drop_down/pentry/pentry_visit_status_provider.dart @@ -1,12 +1,12 @@ import 'dart:convert'; +import 'package:flutter/cupertino.dart'; +import 'package:flutter/material.dart'; +import 'package:http/http.dart'; import 'package:test_sa/controllers/api_routes/api_manager.dart'; import 'package:test_sa/controllers/api_routes/urls.dart'; import 'package:test_sa/models/lookup.dart'; import 'package:test_sa/models/user.dart'; -import 'package:flutter/cupertino.dart'; -import 'package:flutter/material.dart'; -import 'package:http/http.dart'; class PentryVisitStatusProvider extends ChangeNotifier{ diff --git a/lib/controllers/providers/api/status_drop_down/report/service_report_defect_types_provider.dart b/lib/controllers/providers/api/status_drop_down/report/service_report_defect_types_provider.dart index 563ba8d8..775dd106 100644 --- a/lib/controllers/providers/api/status_drop_down/report/service_report_defect_types_provider.dart +++ b/lib/controllers/providers/api/status_drop_down/report/service_report_defect_types_provider.dart @@ -1,12 +1,12 @@ import 'dart:convert'; +import 'package:flutter/cupertino.dart'; +import 'package:flutter/material.dart'; +import 'package:http/http.dart'; import 'package:test_sa/controllers/api_routes/api_manager.dart'; import 'package:test_sa/controllers/api_routes/urls.dart'; import 'package:test_sa/models/lookup.dart'; import 'package:test_sa/models/user.dart'; -import 'package:flutter/cupertino.dart'; -import 'package:flutter/material.dart'; -import 'package:http/http.dart'; class ServiceRequestDefectTypesProvider extends ChangeNotifier{ diff --git a/lib/controllers/providers/api/status_drop_down/report/service_report_last_calls_provider.dart b/lib/controllers/providers/api/status_drop_down/report/service_report_last_calls_provider.dart index b76938fd..59fc821a 100644 --- a/lib/controllers/providers/api/status_drop_down/report/service_report_last_calls_provider.dart +++ b/lib/controllers/providers/api/status_drop_down/report/service_report_last_calls_provider.dart @@ -1,12 +1,12 @@ import 'dart:convert'; +import 'package:flutter/cupertino.dart'; +import 'package:flutter/material.dart'; +import 'package:http/http.dart'; import 'package:test_sa/controllers/api_routes/api_manager.dart'; import 'package:test_sa/controllers/api_routes/urls.dart'; import 'package:test_sa/models/lookup.dart'; import 'package:test_sa/models/user.dart'; -import 'package:flutter/cupertino.dart'; -import 'package:flutter/material.dart'; -import 'package:http/http.dart'; class ServiceReportLastCallsProvider extends ChangeNotifier{ @@ -43,7 +43,7 @@ class ServiceReportLastCallsProvider 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 getCalls ({String host,User user,String serviceStatus}) async { + Future getCalls ({String host,User user,int serviceStatus}) async { if(_loading == true) return -2; _loading = true; diff --git a/lib/controllers/providers/api/status_drop_down/report/service_report_priority_provider.dart b/lib/controllers/providers/api/status_drop_down/report/service_report_priority_provider.dart index a9c566e0..d25644c9 100644 --- a/lib/controllers/providers/api/status_drop_down/report/service_report_priority_provider.dart +++ b/lib/controllers/providers/api/status_drop_down/report/service_report_priority_provider.dart @@ -1,12 +1,12 @@ import 'dart:convert'; +import 'package:flutter/cupertino.dart'; +import 'package:flutter/material.dart'; +import 'package:http/http.dart'; import 'package:test_sa/controllers/api_routes/api_manager.dart'; import 'package:test_sa/controllers/api_routes/urls.dart'; import 'package:test_sa/models/lookup.dart'; import 'package:test_sa/models/user.dart'; -import 'package:flutter/cupertino.dart'; -import 'package:flutter/material.dart'; -import 'package:http/http.dart'; class ServiceRequestPriorityProvider extends ChangeNotifier{ @@ -63,7 +63,6 @@ class ServiceRequestPriorityProvider extends ChangeNotifier{ notifyListeners(); return response.statusCode; } catch(error) { - print(error); _loading = false; _stateCode = -1; notifyListeners(); diff --git a/lib/controllers/providers/api/status_drop_down/report/service_report_reasons_provider.dart b/lib/controllers/providers/api/status_drop_down/report/service_report_reasons_provider.dart index 7df11d8d..6a4808f2 100644 --- a/lib/controllers/providers/api/status_drop_down/report/service_report_reasons_provider.dart +++ b/lib/controllers/providers/api/status_drop_down/report/service_report_reasons_provider.dart @@ -1,12 +1,12 @@ import 'dart:convert'; +import 'package:flutter/cupertino.dart'; +import 'package:flutter/material.dart'; +import 'package:http/http.dart'; import 'package:test_sa/controllers/api_routes/api_manager.dart'; import 'package:test_sa/controllers/api_routes/urls.dart'; import 'package:test_sa/models/lookup.dart'; import 'package:test_sa/models/user.dart'; -import 'package:flutter/cupertino.dart'; -import 'package:flutter/material.dart'; -import 'package:http/http.dart'; class ServiceReportReasonsProvider extends ChangeNotifier{ diff --git a/lib/controllers/providers/api/status_drop_down/report/service_report_types_provider.dart b/lib/controllers/providers/api/status_drop_down/report/service_report_types_provider.dart index f385c27e..084daf1c 100644 --- a/lib/controllers/providers/api/status_drop_down/report/service_report_types_provider.dart +++ b/lib/controllers/providers/api/status_drop_down/report/service_report_types_provider.dart @@ -1,12 +1,12 @@ import 'dart:convert'; +import 'package:flutter/cupertino.dart'; +import 'package:flutter/material.dart'; +import 'package:http/http.dart'; import 'package:test_sa/controllers/api_routes/api_manager.dart'; import 'package:test_sa/controllers/api_routes/urls.dart'; import 'package:test_sa/models/lookup.dart'; import 'package:test_sa/models/user.dart'; -import 'package:flutter/cupertino.dart'; -import 'package:flutter/material.dart'; -import 'package:http/http.dart'; class ServiceReportTypesProvider extends ChangeNotifier{ diff --git a/lib/controllers/providers/api/status_drop_down/report/service_types_provider.dart b/lib/controllers/providers/api/status_drop_down/report/service_types_provider.dart index 9e25f2eb..48da78f4 100644 --- a/lib/controllers/providers/api/status_drop_down/report/service_types_provider.dart +++ b/lib/controllers/providers/api/status_drop_down/report/service_types_provider.dart @@ -1,12 +1,12 @@ import 'dart:convert'; +import 'package:flutter/cupertino.dart'; +import 'package:flutter/material.dart'; +import 'package:http/http.dart'; import 'package:test_sa/controllers/api_routes/api_manager.dart'; import 'package:test_sa/controllers/api_routes/urls.dart'; import 'package:test_sa/models/lookup.dart'; import 'package:test_sa/models/user.dart'; -import 'package:flutter/cupertino.dart'; -import 'package:flutter/material.dart'; -import 'package:http/http.dart'; class ServiceStatusProvider extends ChangeNotifier{ @@ -50,7 +50,7 @@ class ServiceStatusProvider extends ChangeNotifier{ Response response; try{ response = await ApiManager.instance.get( - URLs.getServiceTypes, + URLs.getAssetTypes, ); _stateCode = response.statusCode; if(response.statusCode >= 200 && response.statusCode < 300) { diff --git a/lib/controllers/providers/api/status_drop_down/service_reqest/service_request_status_provider.dart b/lib/controllers/providers/api/status_drop_down/service_reqest/service_request_status_provider.dart index 4ead90e0..91b7d4ca 100644 --- a/lib/controllers/providers/api/status_drop_down/service_reqest/service_request_status_provider.dart +++ b/lib/controllers/providers/api/status_drop_down/service_reqest/service_request_status_provider.dart @@ -1,12 +1,12 @@ import 'dart:convert'; +import 'package:flutter/cupertino.dart'; +import 'package:flutter/material.dart'; +import 'package:http/http.dart'; import 'package:test_sa/controllers/api_routes/api_manager.dart'; import 'package:test_sa/controllers/api_routes/urls.dart'; import 'package:test_sa/models/lookup.dart'; import 'package:test_sa/models/user.dart'; -import 'package:flutter/cupertino.dart'; -import 'package:flutter/material.dart'; -import 'package:http/http.dart'; class ServiceRequestStatusProvider extends ChangeNotifier{ diff --git a/lib/controllers/providers/api/status_drop_down/service_reqest/service_request_through_provider.dart b/lib/controllers/providers/api/status_drop_down/service_reqest/service_request_through_provider.dart index 592ec4dc..ec2e6720 100644 --- a/lib/controllers/providers/api/status_drop_down/service_reqest/service_request_through_provider.dart +++ b/lib/controllers/providers/api/status_drop_down/service_reqest/service_request_through_provider.dart @@ -1,12 +1,12 @@ import 'dart:convert'; +import 'package:flutter/cupertino.dart'; +import 'package:flutter/material.dart'; +import 'package:http/http.dart'; import 'package:test_sa/controllers/api_routes/api_manager.dart'; import 'package:test_sa/controllers/api_routes/urls.dart'; import 'package:test_sa/models/lookup.dart'; import 'package:test_sa/models/user.dart'; -import 'package:flutter/cupertino.dart'; -import 'package:flutter/material.dart'; -import 'package:http/http.dart'; class ServiceRequestedThroughProvider extends ChangeNotifier{ diff --git a/lib/controllers/providers/api/status_drop_down/service_reqest/service_request_type_provider.dart b/lib/controllers/providers/api/status_drop_down/service_reqest/service_request_type_provider.dart index bcc01b4a..76e6c7c4 100644 --- a/lib/controllers/providers/api/status_drop_down/service_reqest/service_request_type_provider.dart +++ b/lib/controllers/providers/api/status_drop_down/service_reqest/service_request_type_provider.dart @@ -1,12 +1,12 @@ import 'dart:convert'; +import 'package:flutter/cupertino.dart'; +import 'package:flutter/material.dart'; +import 'package:http/http.dart'; import 'package:test_sa/controllers/api_routes/api_manager.dart'; import 'package:test_sa/controllers/api_routes/urls.dart'; import 'package:test_sa/models/lookup.dart'; import 'package:test_sa/models/user.dart'; -import 'package:flutter/cupertino.dart'; -import 'package:flutter/material.dart'; -import 'package:http/http.dart'; class ServiceRequestTypeProvider extends ChangeNotifier{ diff --git a/lib/controllers/providers/api/user_provider.dart b/lib/controllers/providers/api/user_provider.dart index 55788923..565408d5 100644 --- a/lib/controllers/providers/api/user_provider.dart +++ b/lib/controllers/providers/api/user_provider.dart @@ -1,11 +1,10 @@ import 'dart:convert'; -import 'package:fluttertoast/fluttertoast.dart'; +import 'package:flutter/material.dart'; +import 'package:http/http.dart'; import 'package:test_sa/controllers/api_routes/api_manager.dart'; import 'package:test_sa/controllers/api_routes/urls.dart'; import 'package:test_sa/models/user.dart'; -import 'package:flutter/material.dart'; -import 'package:http/http.dart'; class UserProvider extends ChangeNotifier{ @@ -64,7 +63,6 @@ class UserProvider extends ChangeNotifier{ notifyListeners(); return response.statusCode; } catch(error) { - print(error); _loading = false; notifyListeners(); return -1; diff --git a/lib/main.dart b/lib/main.dart index f21c35b5..0e8e832a 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -1,3 +1,6 @@ +import 'package:flutter/material.dart'; +import 'package:flutter_localizations/flutter_localizations.dart'; +import 'package:provider/provider.dart'; import 'package:test_sa/controllers/localization/localization.dart'; import 'package:test_sa/controllers/providers/api/departments_provider.dart'; import 'package:test_sa/controllers/providers/api/device_transfer_provider.dart'; @@ -37,9 +40,7 @@ import 'package:test_sa/views/pages/user/visits/preventive_maintenance_visits_pa import 'package:test_sa/views/pages/user/visits/regular_visits_page.dart'; import 'package:test_sa/views/widgets/departments/single_department_picker.dart'; import 'package:test_sa/views/widgets/equipment/single_device_picker.dart'; -import 'package:flutter/material.dart'; -import 'package:flutter_localizations/flutter_localizations.dart'; -import 'package:provider/provider.dart'; + import 'controllers/providers/api/parts_provider.dart'; import 'controllers/providers/api/preventive_maintenance_visits_provider.dart'; import 'controllers/providers/api/status_drop_down/pentry/pentry_status_provider.dart'; diff --git a/lib/models/device/device.dart b/lib/models/device/device.dart index cf6eed07..5bcecd50 100644 --- a/lib/models/device/device.dart +++ b/lib/models/device/device.dart @@ -1,45 +1,44 @@ +import 'package:test_sa/models/hospital.dart'; +import 'package:test_sa/models/lookup.dart'; + +import 'model.dart'; + class Device{ int id; String serialNumber; String number; - String brand; - String model; - DateTime productionDate; - DateTime supplyDate; - DateTime installDate; - DateTime receivingDate; - DateTime operationDate; - DateTime warrantyDate; + // String brand; + // String model; + ModelDefinition modelDefinition; + Hospital hospital; + Device({ this.id, this.serialNumber, this.number, - this.brand, - this.model, - this.productionDate, - this.supplyDate, - this.installDate, - this.receivingDate, - this.operationDate, - this.warrantyDate, + this.hospital, + // this.brand, + // this.model, + this.modelDefinition, + }); + + + factory Device.fromJson(Map parsedJson){ + return Device( id: parsedJson["id"], serialNumber: parsedJson["assetSerialNo"], number: parsedJson["assetNumber"], - brand: parsedJson["modelDefinition"] == null ? "" : - parsedJson["modelDefinition"]["manufacturerName"], - model: parsedJson["modelDefinition"] == null ? "" : - parsedJson["modelDefinition"]["modelName"], - productionDate: getDateFromString(parsedJson["production_date"]), - supplyDate: getDateFromString(parsedJson["supply_date "]), - installDate: getDateFromString(parsedJson["install_date "]), - receivingDate: getDateFromString(parsedJson["receving_date "]), - operationDate: getDateFromString(parsedJson["operation_date "]), - warrantyDate: getDateFromString(parsedJson["warranty_date "]), + modelDefinition:ModelDefinition.fromJson(parsedJson["modelDefinition"]), + hospital:Hospital.fromJson(parsedJson["site"]), + // parsedJson["modelDefinition"] == null ? "" : + // parsedJson["modelDefinition"]["manufacturerName"], + // model: parsedJson["modelDefinition"] == null ? "" : + // parsedJson["modelDefinition"]["modelName"], ); } @@ -48,21 +47,19 @@ class Device{ id: device.id, serialNumber: device.serialNumber, number: device.number, - brand: device.brand, - model: device.model, - productionDate: device.productionDate, - supplyDate: device.supplyDate, - installDate: device.installDate, - receivingDate: device.receivingDate, - operationDate: device.operationDate, - warrantyDate: device.warrantyDate, + // brand: device.brand, + // model: device.model, ); } -} -DateTime getDateFromString(String unixDate){ - if(unixDate == null) - return null; - return DateTime.fromMillisecondsSinceEpoch( - int.parse(unixDate)); + Map toMap(Lookup assetType) { + return { + 'id': id, + 'assetSerialNo': serialNumber, + 'assetNumber': number, + 'modelDefinition': modelDefinition.toJson(), + 'site': hospital.toMap(), + 'AssetType':assetType.toMap(), + }; + } } \ No newline at end of file diff --git a/lib/models/device/device_transfer.dart b/lib/models/device/device_transfer.dart index d2e18572..d76728bf 100644 --- a/lib/models/device/device_transfer.dart +++ b/lib/models/device/device_transfer.dart @@ -1,4 +1,3 @@ -import 'package:http/http.dart'; import 'package:test_sa/controllers/api_routes/urls.dart'; import 'package:test_sa/models/department.dart'; import 'package:test_sa/models/device/device.dart'; @@ -42,9 +41,6 @@ class DeviceTransfer{ } factory DeviceTransfer.fromJson(Map parsedJson){ - print(parsedJson["id"],); - print(URLs.getFileUrl(parsedJson["senderAttachmentName"]),); - print(URLs.getFileUrl(parsedJson["receiverAttachmentName"]),); return DeviceTransfer( id: parsedJson["id"], title: parsedJson["transferCode"], diff --git a/lib/models/device/device_transfer_info.dart b/lib/models/device/device_transfer_info.dart index 4475b085..05e877f5 100644 --- a/lib/models/device/device_transfer_info.dart +++ b/lib/models/device/device_transfer_info.dart @@ -1,6 +1,4 @@ -import 'package:http/http.dart'; import 'package:test_sa/models/department.dart'; -import 'package:test_sa/models/device/device.dart'; import 'package:test_sa/models/hospital.dart'; import 'package:test_sa/models/lookup.dart'; diff --git a/lib/models/device/model.dart b/lib/models/device/model.dart new file mode 100644 index 00000000..bd49b250 --- /dev/null +++ b/lib/models/device/model.dart @@ -0,0 +1,47 @@ +class ModelDefinition { + int id; + String assetName; + String modelDefCode; + String modelName; + String manufacturerName; + String supplierName; + String replacementDate; + int lifeSpan; + + ModelDefinition( + {this.id, + this.assetName, + this.modelDefCode, + this.modelName, + this.manufacturerName, + this.supplierName, + this.replacementDate, + this.lifeSpan,}); + + Map toJson() { + final Map data = {}; + data['id'] = id; + data['assetName'] = assetName; + data['modelDefCode'] = modelDefCode; + data['modelName'] = modelName; + data['manufacturerName'] = manufacturerName; + data['supplierName'] = supplierName; + data['replacementDate'] = replacementDate; + data['lifeSpan'] = lifeSpan; + return data; + } + + factory ModelDefinition.fromJson(Map map) { + if(map == null) return null; + return ModelDefinition( + id: map['id'] as int, + assetName: map['assetName'] as String, + modelDefCode: map['modelDefCode'] as String, + modelName: map['modelName'] as String, + manufacturerName: map['manufacturerName'] as String, + supplierName: map['supplierName'] as String, + replacementDate: map['replacementDate'] as String, + lifeSpan: map['lifeSpan'] as int, + ); + } +} \ No newline at end of file diff --git a/lib/models/engineer.dart b/lib/models/engineer.dart index 74916e45..d8b15f07 100644 --- a/lib/models/engineer.dart +++ b/lib/models/engineer.dart @@ -7,10 +7,12 @@ class Engineer{ this.name, }); + + factory Engineer.fromJson(Map parsedJson){ return Engineer( - id: parsedJson["userId"], - name: parsedJson["userName"], + id: parsedJson["userId"] ?? parsedJson["id"], + name: parsedJson["userName"] ?? parsedJson["name"], ); } factory Engineer.fromEngineer(Engineer department){ @@ -28,4 +30,12 @@ class Engineer{ @override int get hashCode => id.hashCode; + + Map toMap() { + return { + 'id': id, + 'name': name, + }; + } + } \ No newline at end of file diff --git a/lib/models/hospital.dart b/lib/models/hospital.dart index 432b1748..71cde19d 100644 --- a/lib/models/hospital.dart +++ b/lib/models/hospital.dart @@ -1,16 +1,23 @@ class Hospital{ int id; + int customerCode; String name; + List buildings; Hospital({ this.id, + this.customerCode, this.name, + this.buildings, }); + factory Hospital.fromJson(Map parsedJson){ return Hospital( id: parsedJson["id"], name: parsedJson["custName"], + customerCode: parsedJson["customerCode"], + buildings: parsedJson["buildings"] ); } @@ -18,6 +25,17 @@ class Hospital{ return Hospital( id: hospital?.id, name: hospital?.name, + customerCode: hospital?.customerCode, + buildings:hospital?.buildings ); } + + Map toMap() { + return { + 'id': id, + 'customerCode': customerCode, + 'custName': name, + "buildings":buildings + }; + } } \ No newline at end of file diff --git a/lib/models/lookup.dart b/lib/models/lookup.dart index dd0ba990..3d803d0e 100644 --- a/lib/models/lookup.dart +++ b/lib/models/lookup.dart @@ -44,7 +44,7 @@ class Lookup{ return Lookup( name: parsedJson["name"], id: parsedJson["id"], - value: parsedJson["value"] ?? parsedJson["id"], + value: parsedJson["value"], ); } @@ -58,10 +58,10 @@ class Lookup{ // ); // } - factory Lookup.fromIntIdJson(Map parsedJson){ - return Lookup( - name: parsedJson["value"], - id: parsedJson["id"], - ); - } + // factory Lookup.fromIntIdJson(Map parsedJson){ + // return Lookup( + // name: parsedJson["value"], + // id: parsedJson["id"], + // ); + // } } \ No newline at end of file diff --git a/lib/models/pantry/calibration_tools.dart b/lib/models/pantry/calibration_tools.dart index 9e006eac..4207c99b 100644 --- a/lib/models/pantry/calibration_tools.dart +++ b/lib/models/pantry/calibration_tools.dart @@ -13,7 +13,7 @@ class CalibrationTool{ Map toMap(int visitId) { return { - "id":id, + "id":id ?? 0, "visitId": visitId, if(assetsNumber != null) 'assetId': (assetsNumber?.id).toString(), if(dataOfTesting != null) 'calibrationDateOfTesters': dataOfTesting.toIso8601String(), diff --git a/lib/models/pantry/pentry.dart b/lib/models/pantry/pentry.dart index e624f9e6..0f7e1cfa 100644 --- a/lib/models/pantry/pentry.dart +++ b/lib/models/pantry/pentry.dart @@ -2,9 +2,9 @@ import 'dart:convert'; import 'dart:io'; import 'dart:typed_data'; +import 'package:test_sa/controllers/api_routes/urls.dart'; import 'package:test_sa/models/lookup.dart'; import 'package:test_sa/models/pantry/calibration_tools.dart'; -import 'package:test_sa/models/pantry/contact.dart'; import 'package:test_sa/models/pantry/pm_kit.dart'; import 'package:test_sa/models/pantry/ppm_check_list.dart'; import 'package:test_sa/models/timer_model.dart'; @@ -22,8 +22,10 @@ class Pentry{ List ppmCheckLists; List calibrationTools; List pmKits; - String signature; - Uint8List localSignature; + String signatureNurse; + String signatureEngineer; + Uint8List localNurseSignature; + Uint8List localEngineerSignature; Pentry({ this.travelingHours, @@ -38,8 +40,10 @@ class Pentry{ this.ppmCheckLists, this.calibrationTools, this.pmKits, - this.signature, - this.localSignature + this.signatureNurse, + this.signatureEngineer, + this.localNurseSignature, + this.localEngineerSignature }); bool validate(){ @@ -57,7 +61,7 @@ class Pentry{ Map toMap(int visitId) { Map map = {}; map["visitStatusId"] = ppmVisitStatus?.id.toString(); - if(status != null) map["visitStatusId"] = status?.id.toString(); + //if(status != null) map["visitStatusId"] = status?.id.toString(); if(travelingHours != null) map["travelingHours"] = travelingHours; //if(imageFile != null) map["file_attachement"] = base64Encode(imageFile.readAsBytesSync()); map["actualDate"] = actualVisitDate.toIso8601String(); @@ -85,7 +89,8 @@ class Pentry{ map["vChecklists"] = ppmCheckLists.map((e) => e.toMap(visitId)).toList(); map["vCalibrationTools"] = calibrationTools.map((e) => e.toMap(visitId)).toList(); map["vKits"] = pmKits.map((e) => e.toMap(visitId)).toList(); - map["signature"] = signature; + map["nurseSignature"] = signatureNurse; + map["engSignature"] = signatureEngineer; return map; } @@ -132,7 +137,8 @@ class Pentry{ ppmCheckLists: ppmCheckLists, calibrationTools: calibrationTools, pmKits: pmKits, - signature: map["signature"], + signatureNurse: URLs.getFileUrl(map["nurseSignature"]) , + signatureEngineer:URLs.getFileUrl(map["engSignature"]), ); } @@ -148,7 +154,8 @@ class Pentry{ List ppmCheckLists, List calibrationTools, List pmKits, - String signature + String signatureNurse, + String signatureEngineer, }) { return Pentry( ppmVisitStatus: ppmVisitStatus ?? this.ppmVisitStatus, @@ -162,7 +169,8 @@ class Pentry{ ppmCheckLists: ppmCheckLists ?? this.ppmCheckLists?.map((e) => e.copyWith())?.toList(), calibrationTools: calibrationTools ?? this.calibrationTools?.map((e) => e.copyWith())?.toList(), pmKits: pmKits ?? this.pmKits.map((e) => e.copyWith()).toList(), - signature: signature ?? this.signature + signatureNurse: signatureNurse ?? this.signatureNurse, + signatureEngineer: signatureEngineer ?? this.signatureEngineer ); } } \ No newline at end of file diff --git a/lib/models/pantry/pm_kit.dart b/lib/models/pantry/pm_kit.dart index ddb75a40..40bcf514 100644 --- a/lib/models/pantry/pm_kit.dart +++ b/lib/models/pantry/pm_kit.dart @@ -23,7 +23,7 @@ class PMKit{ Map toMap(int visitId) { return { - "id":id, + "id":id ?? 0, "visitId": visitId, if(itemCode != null) 'partCatalogItemId': (itemCode?.id).toString(), // if(itemName != null) 'itemName': itemName, @@ -38,7 +38,7 @@ class PMKit{ factory PMKit.fromMap(Map map) { return PMKit( id: map['id'], - //itemCode: Lookup.fromJson(map['itemCode']), + itemCode: Lookup(id:map['partCatalogItemId'],name:map["partNumber"]), itemName: map['itemName'] as String, preparationTimeFrame: map['preparationTimeFrame'] as String, kitFrequencyDemand: map['kitFrequencyDemand'] as String, diff --git a/lib/models/pantry/ppm_check_list.dart b/lib/models/pantry/ppm_check_list.dart index cbf750bc..3ed03dae 100644 --- a/lib/models/pantry/ppm_check_list.dart +++ b/lib/models/pantry/ppm_check_list.dart @@ -17,7 +17,7 @@ class PPMCheckList{ Map toMap(int visitId) { return { - 'id': id, + 'id': id ?? 0, "visitId": visitId, if(status != null) 'taskStatusId': status?.id.toString(), if(title != null) 'task': title, diff --git a/lib/models/part.dart b/lib/models/part.dart index 5589d9b0..298f4359 100644 --- a/lib/models/part.dart +++ b/lib/models/part.dart @@ -1,23 +1,37 @@ class Part{ int id; + int reportPartID; String code; String name; int quantity; Part({ this.id, + this.reportPartID, this.code, this.name, this.quantity = 1, }); - factory Part.fromJson(Map parsedJson){ + Map toJson(){ + return { + "id": reportPartID ?? 0, + "sparePart":{ + "id":id, + "partNo": code, + "partName":name + }, + "qty":quantity + }; + } + + factory Part.fromJson(Map parsedJson,{Map reportJson}){ return Part( id: parsedJson["id"], + reportPartID: reportJson != null ? reportJson["id"] : null, code: parsedJson["partNo"], name: parsedJson["partName"], - quantity: parsedJson["partQuantity"] == null - ? 1 : int.tryParse(parsedJson["partQuantity"].toString()) ?? 1, + quantity: reportJson != null ? (reportJson["qty"] ?? 1).toInt() : 1, ); } } \ No newline at end of file diff --git a/lib/models/service_report.dart b/lib/models/service_report.dart index 01b75bec..58eb2c98 100644 --- a/lib/models/service_report.dart +++ b/lib/models/service_report.dart @@ -1,21 +1,25 @@ -import 'dart:convert'; +import 'dart:typed_data'; +import 'package:test_sa/controllers/api_routes/urls.dart'; import 'package:test_sa/models/device/device.dart'; -import 'package:test_sa/models/part.dart'; +import 'package:test_sa/models/engineer.dart'; import 'package:test_sa/models/lookup.dart'; +import 'package:test_sa/models/part.dart'; +import 'package:test_sa/models/service_request/service_request.dart'; import 'package:test_sa/models/timer_model.dart'; class ServiceReport { - String id; + int id; String operatingHours; DateTime visitDate; DateTime endDate; - Lookup serviceType; + Lookup assetType; Lookup callLastSituation; + Engineer engineer; Lookup status; Lookup type; Lookup reason; - String faultDescription; + int faultDescriptionId; String workPreformed; //String workHours; String travelingHours; @@ -27,18 +31,23 @@ class ServiceReport { String quantity; String jobSheetNumber; TimerModel timer; + String signatureNurse; + String signatureEngineer; + Uint8List localNurseSignature; + Uint8List localEngineerSignature; ServiceReport({ this.id, this.visitDate, this.endDate, - this.serviceType, + this.assetType, this.status, this.type, - this.faultDescription, + this.faultDescriptionId, //this.workHours, this.travelingHours, this.parts, + this.engineer, this.workPreformed, this.reason, this.operatingHours, @@ -50,53 +59,73 @@ class ServiceReport { this.invoiceNumber, this.quantity = "1", this.timer, + this.signatureNurse, + this.signatureEngineer, + this.localNurseSignature, + this.localEngineerSignature }); - Map toMap(){ - Map _map = {}; + Map toMap(ServiceRequest request){ + Map _map = {}; if(id != null) _map["id"] = id; - if(visitDate != null) _map["visit_date"] = (visitDate.millisecondsSinceEpoch ~/ 1000).toString(); - if(serviceType != null) _map["service_type"] = serviceType.id.toString(); - if(status != null) _map["status"] = status.toMap(); - if(type != null) _map["service_report_type"] = type.id.toString(); - if(faultDescription != null && faultDescription.isNotEmpty) _map["fault_description"] = faultDescription; + if(visitDate != null) _map["visitDate"] = visitDate.toIso8601String(); + //if(serviceType != null) _map["service_type"] = serviceType.id.toString(); + if(status != null) _map["status"] = status?.toMap(); + if(type != null) _map["typeOfWO"] = type?.toMap(); + if(assetType != null) _map["TypeOfWO"] = assetType?.toMap(); + //if(faultDescriptionId != null && faultDescriptionId.isNotEmpty) _map["fault_description"] = faultDescriptionId; //if(workHours != null && workHours.isNotEmpty) _map["working_hours"] = workHours; if(timer != null){ - _map["start_time"] = (timer.startAt.millisecondsSinceEpoch / 1000).toStringAsFixed(0); - _map["end_time"] = ((timer.endAt ?? DateTime.now()).millisecondsSinceEpoch / 1000).toStringAsFixed(0); - _map["working_hours"] = (timer.durationInSecond / 60 / 60).toStringAsFixed(5); + _map["startofWorkTime"] = timer.startAt.toIso8601String(); + _map["endofWorkTime"] = (timer.endAt ?? DateTime.now()).toIso8601String(); + _map["workingHours"] = (timer.durationInSecond / 60 / 60).toStringAsFixed(5); } if(travelingHours != null && travelingHours.isNotEmpty) _map["traveling_hours"] = travelingHours; - if(workPreformed != null && workPreformed.isNotEmpty) _map["work_performed"] = workPreformed; + // if(workPreformed != null && workPreformed.isNotEmpty){ + // _map["faultDescription"] = { + // //"id":faultDescriptionId ?? 0, + // "workPerformed":workPreformed + // }; + // } if(jobSheetNumber != null && jobSheetNumber.isNotEmpty) _map["job_sheet_no"] = jobSheetNumber; if(parts != null && parts.isNotEmpty){ - Map _partsMap = {}; - // parts.forEach((part) { - // if(part.id == null) - // _partsMap[part.id] = part.quantity; - // }); - _map["parts"] = json.encode(_partsMap); + _map["sparePartsWorkOrders"] = parts.map((e) => e.toJson()).toList(); + } + if(device != null && device.id != null){ + _map["callRequest"] = { + "id":request.id, + "asset":device?.toMap(assetType), + }; + _map["callRequest"]["asset"]["invoiceNumber"] = invoiceNumber; } - //if(device?.id != null && device.id != null) _map["eq_id"] = device.id; - if(quantity != null && quantity.isNotEmpty) _map["qty"] = quantity; - if(endDate != null) _map["end_date"] = (endDate.millisecondsSinceEpoch ~/ 1000).toString(); - if(reason != null) _map["reasons"] = reason.toMap(); - if(operatingHours != null && operatingHours.isNotEmpty) _map["operation_hours"] = operatingHours; - if(callLastSituation != null) _map["calllastSituation"] = callLastSituation.id.toString(); - if(image != null) _map["image"] = image; - if(invoiceCode != null) _map["invoice_no"] = invoiceCode; - if(invoiceNumber != null) _map["invoice_code"] = invoiceNumber; + _map["AssignedEmployee"] = engineer?.toMap(); + //if(quantity != null && quantity.isNotEmpty) _map["qty"] = quantity; + //if(endDate != null) _map["end_date"] = (endDate.millisecondsSinceEpoch ~/ 1000).toString(); + if(reason != null) _map["reason"] = reason.toMap(); + //if(operatingHours != null && operatingHours.isNotEmpty) _map["operation_hours"] = operatingHours; + if(callLastSituation != null) _map["calllastSituation"] = callLastSituation.toMap(); + //if(image != null) _map["image"] = image; + //if(invoiceCode != null) _map["invoice_no"] = invoiceCode; + //if(invoiceNumber != null) _map["invoice_code"] = invoiceNumber; + if(image != null){ + _map["attachmentsWorkOrder"]=[{ + "name":image + }]; + } + _map["nurseSignature"] = signatureNurse; + _map["engSignature"] = signatureEngineer; return _map; } bool validate(){ if(visitDate == null) return false; - if(serviceType == null) return false; + //if(serviceType == null) return false; if(status == null) return false; if(type == null) return false; + if(engineer == null) return false; if(callLastSituation == null) return false; - if(callLastSituation?.id == 12){ - if(invoiceCode != null || invoiceCode?.isEmpty == true) return false; + if(callLastSituation?.value == 12){ + // if(invoiceCode != null || invoiceCode?.isEmpty == true) return false; if(invoiceNumber != null || invoiceNumber?.isEmpty== true ) return false; } if(parts == null) return false; @@ -109,42 +138,49 @@ class ServiceReport { return true; } - factory ServiceReport.fromJson(Map parsedJson,String id){ + factory ServiceReport.fromJson(Map parsedJson,int id){ List _parts = []; - if(parsedJson["parts"] != null){ - if(parsedJson["parts"][0]["id"] != null){ - List partsList = parsedJson["parts"]; - _parts = partsList.map((e) => Part.fromJson(e)).toList(); + if(parsedJson["sparePartsWorkOrders"] != null){ + if(parsedJson["sparePartsWorkOrders"][0]["id"] != null){ + List partsList = parsedJson["sparePartsWorkOrders"]; + _parts = partsList.map((e) => Part.fromJson( + e["sparePart"],reportJson: e)).toList(); } } return ServiceReport( id: id, - serviceType: Lookup.fromJson(parsedJson["service_type"]), - callLastSituation: Lookup.fromJson(parsedJson["call_last_situtation"]), - reason: Lookup.fromJson(parsedJson["reasons"]), - status: Lookup.fromJson(parsedJson["service_report_status"]), - type: Lookup.fromJson(parsedJson["service_report_type"]), - faultDescription: parsedJson["fault_description"], - endDate:getDate(parsedJson["end_date"]), - invoiceCode: parsedJson["invoice_code"], - invoiceNumber: parsedJson["invoice_no"], - jobSheetNumber: parsedJson["job_sheet_no"], - operatingHours: parsedJson["operation_hours"], + assetType: Lookup.fromJson(parsedJson["assetType"]), + callLastSituation: Lookup.fromJson(parsedJson["calllastSituation"]), + reason: Lookup.fromJson(parsedJson["reason"]), + status: Lookup.fromJson(parsedJson["status"]), + type: Lookup.fromJson(parsedJson["typeOfWO"]), + //faultDescriptionId: parsedJson["fault_description"], + endDate:DateTime.tryParse(parsedJson["endofWorkTime"]), + //invoiceCode: parsedJson["invoice_code"], + //invoiceNumber: parsedJson["invoice_no"], + //jobSheetNumber: parsedJson["job_sheet_no"], + //operatingHours: parsedJson["workingHours"], + engineer: Engineer.fromJson(parsedJson["assignedEmployee"]), parts: _parts, - quantity: parsedJson["nid"], - travelingHours: parsedJson["traveling_hours"], - visitDate: getDate(parsedJson["visit_date"]), + //quantity: parsedJson["nid"], + //travelingHours: parsedJson["traveling_hours"], + visitDate: DateTime.tryParse(parsedJson["visitDate"]), //workHours: parsedJson["working_hours"], timer: TimerModel( - durationInSecond: (int.tryParse(parsedJson["working_hours"] ?? "") ?? 0) * 60 *60), - workPreformed: parsedJson["work_performed"], - device: parsedJson["eq_nid"] == null ? null : Device(id: parsedJson["eq_nid"],serialNumber: parsedJson["eq_serial"]) + startAt: DateTime.tryParse(parsedJson["startofWorkTime"]), + endAt: DateTime.tryParse(parsedJson["endofWorkTime"]), + durationInSecond: ((parsedJson["workingHours"] ?? 0) * 60 *60).toInt() + ), + //workPreformed: parsedJson["work_performed"], + device: Device.fromJson(parsedJson["callRequest"]["asset"]), + signatureNurse: URLs.getFileUrl(parsedJson["nurseSignature"]) , + signatureEngineer:URLs.getFileUrl(parsedJson["engSignature"]), ); } - static getDate(String date){ - return date == null || date.isEmpty - ? null : DateTime.fromMillisecondsSinceEpoch(int.tryParse(date) * 1000); - } + // static getDate(String date){ + // return date == null || date.isEmpty + // ? null : DateTime.fromMillisecondsSinceEpoch(int.tryParse(date) * 1000); + // } } \ No newline at end of file diff --git a/lib/models/service_request/service_request.dart b/lib/models/service_request/service_request.dart index 23f178a8..eea5d244 100644 --- a/lib/models/service_request/service_request.dart +++ b/lib/models/service_request/service_request.dart @@ -1,8 +1,7 @@ import 'package:test_sa/controllers/api_routes/urls.dart'; +import 'package:test_sa/models/device/device.dart'; import 'package:test_sa/models/lookup.dart'; -import '../timer_model.dart'; - class ServiceRequest{ String id; String requestCode; @@ -29,12 +28,13 @@ class ServiceRequest{ String visitDate; DateTime nextVisitDate; String jobSheetNumber; - String reportID; + int reportID; String deviceNumber; Lookup priority; Lookup defectType; Lookup type; Lookup requestedThrough; + Device device; ServiceRequest({ this.id, @@ -68,6 +68,7 @@ class ServiceRequest{ this.deviceNumber, this.type, this.requestedThrough, + this.device, }); factory ServiceRequest.fromJson(Map parsedJson){ @@ -98,7 +99,7 @@ class ServiceRequest{ engineerName: parsedJson["assignedEmployee"] == null ? null : parsedJson["assignedEmployee"]["name"], hospitalId: parsedJson["asset"]["site"]["id"], - reportID: parsedJson["workOrder"]["id"].toString(), + reportID: parsedJson["workOrder"]["workOrderId"], viewReport: parsedJson["workOrder"] != null, deviceModel: parsedJson["asset"]["modelDefinition"]["modelName"], engineerMobile: parsedJson["assignedEmployee"] == null ? null : @@ -108,6 +109,7 @@ class ServiceRequest{ visitDate: DateTime.tryParse(parsedJson["visitDate"] ?? "").toString().split(" ").first, nextVisitDate: DateTime.tryParse(parsedJson["nextVisitDate"] ?? ""), workPerformed: parsedJson["workOrder"]["workPerformed"], + device: Device.fromJson(parsedJson["asset"]) ); } } \ No newline at end of file diff --git a/lib/models/user.dart b/lib/models/user.dart index 6aabf108..246ed717 100644 --- a/lib/models/user.dart +++ b/lib/models/user.dart @@ -99,7 +99,6 @@ class User{ } else { type = UsersTypes.engineer; } - print(parsedJson); return User( id: parsedJson["userID"], userName: parsedJson["username"], diff --git a/lib/models/visits/visit.dart b/lib/models/visits/visit.dart index 7554ecd4..10717be1 100644 --- a/lib/models/visits/visit.dart +++ b/lib/models/visits/visit.dart @@ -1,6 +1,5 @@ import 'package:test_sa/models/lookup.dart'; import 'package:test_sa/models/pantry/pentry.dart'; -import 'package:test_sa/models/timer_model.dart'; class Visit{ int id; @@ -10,6 +9,7 @@ class Visit{ int hospitalId; String hospitalName; int deviceId; + int ppmScheduleId; String deviceSerialNumber; String deviceArabicName; String deviceEnglishName; @@ -24,6 +24,7 @@ class Visit{ Visit({ this.id, + this.ppmScheduleId, this.serialNumber, this.hospitalId, this.hospitalName, @@ -52,6 +53,7 @@ class Visit{ return Visit( id: parsedJson["id"], serialNumber: parsedJson["visitCode"], + ppmScheduleId: parsedJson["ppmScheduleId"], hospitalId: parsedJson["siteId"], deviceNumber: parsedJson["assetNumber"], hospitalName: parsedJson["siteName"], diff --git a/lib/models/visits/visits_group.dart b/lib/models/visits/visits_group.dart index 3f47b8cf..57f377ae 100644 --- a/lib/models/visits/visits_group.dart +++ b/lib/models/visits/visits_group.dart @@ -1,6 +1,5 @@ import 'package:test_sa/models/engineer.dart'; -import 'package:test_sa/models/lookup.dart'; import 'package:test_sa/models/visits/visit.dart'; class VisitsGroup{ diff --git a/lib/views/app_style/colors.dart b/lib/views/app_style/colors.dart index 58f7d442..9a90cbc7 100644 --- a/lib/views/app_style/colors.dart +++ b/lib/views/app_style/colors.dart @@ -1,5 +1,4 @@ import 'package:flutter/material.dart'; -import 'package:test_sa/models/lookup.dart'; class AColors { AColors._(); static const Color white = Color(0xffffffff); diff --git a/lib/views/pages/device_transfer/update_device_transfer.dart b/lib/views/pages/device_transfer/update_device_transfer.dart index 7604e2ce..d3e3e479 100644 --- a/lib/views/pages/device_transfer/update_device_transfer.dart +++ b/lib/views/pages/device_transfer/update_device_transfer.dart @@ -4,7 +4,6 @@ import 'package:flutter/foundation.dart'; import 'package:flutter/material.dart'; import 'package:fluttertoast/fluttertoast.dart'; import 'package:provider/provider.dart'; -import 'package:test_sa/controllers/api_routes/http_status_manger.dart'; import 'package:test_sa/controllers/providers/api/device_transfer_provider.dart'; import 'package:test_sa/controllers/providers/api/user_provider.dart'; import 'package:test_sa/controllers/providers/settings/setting_provider.dart'; diff --git a/lib/views/pages/login.dart b/lib/views/pages/login.dart index 35e0570c..2f8c48fb 100644 --- a/lib/views/pages/login.dart +++ b/lib/views/pages/login.dart @@ -1,24 +1,17 @@ -import 'package:test_sa/controllers/api_routes/urls.dart'; +import 'package:flutter/material.dart'; +import 'package:provider/provider.dart'; import 'package:test_sa/controllers/api_routes/http_status_manger.dart'; import 'package:test_sa/controllers/localization/localization.dart'; -import 'package:test_sa/controllers/notification/notification_manger.dart'; import 'package:test_sa/controllers/providers/api/user_provider.dart'; import 'package:test_sa/controllers/providers/settings/setting_provider.dart'; import 'package:test_sa/controllers/validator/validator.dart'; import 'package:test_sa/models/subtitle.dart'; import 'package:test_sa/models/user.dart'; import 'package:test_sa/views/app_style/sizing.dart'; -import 'package:test_sa/views/pages/register.dart'; import 'package:test_sa/views/pages/user/land_page.dart'; import 'package:test_sa/views/widgets/app_text_form_field.dart'; import 'package:test_sa/views/widgets/buttons/app_button.dart'; -import 'package:test_sa/views/widgets/buttons/app_flat_button.dart'; import 'package:test_sa/views/widgets/loaders/loading_manager.dart'; -import 'package:flutter/material.dart'; -import 'package:fluttertoast/fluttertoast.dart'; -import 'package:provider/provider.dart'; - -import '../widgets/buttons/app_outlined_button.dart'; class Login extends StatefulWidget { static final String id = "/login"; @override diff --git a/lib/views/pages/splash_screen.dart b/lib/views/pages/splash_screen.dart index 9892b126..bd7a770f 100644 --- a/lib/views/pages/splash_screen.dart +++ b/lib/views/pages/splash_screen.dart @@ -27,7 +27,6 @@ class _SplashScreenState extends State { UserProvider _userProvider; _goToUserScreen(User user){ - print(user.toJson()); if(user.tokenLife != null && user.tokenLife.isAfter(DateTime.now())){ _userProvider.user = user; // Navigator.of(context).pushNamed(Login.id); diff --git a/lib/views/pages/user/gas_refill/gas_refill_details.dart b/lib/views/pages/user/gas_refill/gas_refill_details.dart index 8b053b6b..bed4999d 100644 --- a/lib/views/pages/user/gas_refill/gas_refill_details.dart +++ b/lib/views/pages/user/gas_refill/gas_refill_details.dart @@ -13,7 +13,6 @@ import 'package:test_sa/views/app_style/sizing.dart'; import 'package:test_sa/views/widgets/buttons/app_back_button.dart'; import 'package:test_sa/views/widgets/buttons/app_button.dart'; import 'package:test_sa/views/widgets/buttons/app_icon_button.dart'; -import 'package:test_sa/views/widgets/gas_refill/gas_refill_create_details_item.dart'; import 'package:test_sa/views/widgets/gas_refill/gas_refill_update_details_item.dart'; import 'package:test_sa/views/widgets/loaders/loading_manager.dart'; import 'package:test_sa/views/widgets/requests/info_row.dart'; diff --git a/lib/views/pages/user/land_page.dart b/lib/views/pages/user/land_page.dart index 5bf91817..e5b612e9 100644 --- a/lib/views/pages/user/land_page.dart +++ b/lib/views/pages/user/land_page.dart @@ -24,14 +24,12 @@ import 'package:test_sa/views/pages/device_transfer/request_device_transfer.dart import 'package:test_sa/views/pages/device_transfer/track_device_transfer.dart'; import 'package:test_sa/views/pages/user/gas_refill/request_gas_refill.dart'; import 'package:test_sa/views/pages/user/gas_refill/track_gas_refill.dart'; -import 'package:test_sa/views/pages/user/notifications/notifications_page.dart'; import 'package:test_sa/views/pages/user/requests/create_request.dart'; import 'package:test_sa/views/pages/user/visits/regular_visits_page.dart'; import 'package:test_sa/views/widgets/buttons/app_back_button.dart'; import 'package:test_sa/views/widgets/buttons/app_icon_button.dart'; import 'package:test_sa/views/widgets/dialogs/dialog.dart'; import 'package:test_sa/views/widgets/drawer/drawer_item.dart'; -import 'package:url_launcher/url_launcher.dart'; import '../../widgets/land_page/land_page_item.dart'; import 'profile_page.dart'; @@ -263,70 +261,70 @@ class _LandPageState extends State { ), ), ), - Align( - alignment: Alignment.bottomCenter, - child: Container( - padding: EdgeInsets.all(16), - color: AColors.primaryColor, - child: Row( - children: [ - AIconButton( - iconData: Icons.mail, - onPressed: (){ - launch("mailto:customerservice@Test SA.com"); - - }, - ), - Spacer(), - // Expanded( - // child: MaterialButton( - // splashColor: AColors.secondaryColor.withOpacity(.5), - // child: Row( - // mainAxisAlignment: MainAxisAlignment.center, - // children: [ - // Container( - // padding: EdgeInsets.all(12), - // decoration: BoxDecoration( - // borderRadius: BorderRadius.circular( - // 8 * AppStyle.getScaleFactor(context) - // ), - // color: AColors.onPrimaryColor - // ), - // child: Icon( - // Icons.phone_in_talk, - // color: AColors.primaryColor , - // size: 32, - // ), - // ), - // SizedBox( - // width: 12 * AppStyle.getScaleFactor(context), - // ), - // Text( - // "${_subtitle.hotLine}\n ", - // - // style: Theme.of(context).textTheme.headline6.copyWith( - // color: AColors.white, - // letterSpacing: 2.75, - // fontWeight: FontWeight.bold - // ), - // ), - // ], - // ), - // onPressed: (){ - // //launch("tel:15564"); - // }, - // ), - // ), - AIconButton( - iconData: Icons.notifications, - onPressed: (){ - Navigator.of(context).pushNamed(NotificationsPage.id); - }, - ), - ], - ), - ), - ), + // Align( + // alignment: Alignment.bottomCenter, + // child: Container( + // padding: EdgeInsets.all(16), + // color: AColors.primaryColor, + // child: Row( + // children: [ + // AIconButton( + // iconData: Icons.mail, + // onPressed: (){ + // launch("mailto:customerservice@Test SA.com"); + // + // }, + // ), + // Spacer(), + // // Expanded( + // // child: MaterialButton( + // // splashColor: AColors.secondaryColor.withOpacity(.5), + // // child: Row( + // // mainAxisAlignment: MainAxisAlignment.center, + // // children: [ + // // Container( + // // padding: EdgeInsets.all(12), + // // decoration: BoxDecoration( + // // borderRadius: BorderRadius.circular( + // // 8 * AppStyle.getScaleFactor(context) + // // ), + // // color: AColors.onPrimaryColor + // // ), + // // child: Icon( + // // Icons.phone_in_talk, + // // color: AColors.primaryColor , + // // size: 32, + // // ), + // // ), + // // SizedBox( + // // width: 12 * AppStyle.getScaleFactor(context), + // // ), + // // Text( + // // "${_subtitle.hotLine}\n ", + // // + // // style: Theme.of(context).textTheme.headline6.copyWith( + // // color: AColors.white, + // // letterSpacing: 2.75, + // // fontWeight: FontWeight.bold + // // ), + // // ), + // // ], + // // ), + // // onPressed: (){ + // // //launch("tel:15564"); + // // }, + // // ), + // // ), + // AIconButton( + // iconData: Icons.notifications, + // onPressed: (){ + // Navigator.of(context).pushNamed(NotificationsPage.id); + // }, + // ), + // ], + // ), + // ), + // ), ], ), ), diff --git a/lib/views/pages/user/requests/create_request.dart b/lib/views/pages/user/requests/create_request.dart index 715a1488..5fff68c1 100644 --- a/lib/views/pages/user/requests/create_request.dart +++ b/lib/views/pages/user/requests/create_request.dart @@ -8,7 +8,6 @@ import 'package:provider/provider.dart'; import 'package:test_sa/controllers/api_routes/http_status_manger.dart'; import 'package:test_sa/controllers/localization/localization.dart'; import 'package:test_sa/controllers/providers/api/service_requests_provider.dart'; -import 'package:test_sa/controllers/providers/api/status_drop_down/service_reqest/service_request_through_provider.dart'; import 'package:test_sa/controllers/providers/api/user_provider.dart'; import 'package:test_sa/controllers/providers/settings/setting_provider.dart'; import 'package:test_sa/controllers/validator/validator.dart'; diff --git a/lib/views/pages/user/requests/report/create_service_report.dart b/lib/views/pages/user/requests/report/create_service_report.dart index 2d65c34b..8fe279c6 100644 --- a/lib/views/pages/user/requests/report/create_service_report.dart +++ b/lib/views/pages/user/requests/report/create_service_report.dart @@ -12,8 +12,6 @@ import 'package:test_sa/controllers/providers/api/status_drop_down/report/servic import 'package:test_sa/controllers/providers/api/user_provider.dart'; import 'package:test_sa/controllers/providers/settings/setting_provider.dart'; import 'package:test_sa/controllers/validator/validator.dart'; -import 'package:test_sa/models/device/device.dart'; -import 'package:test_sa/models/lookup.dart'; import 'package:test_sa/models/part.dart'; import 'package:test_sa/models/service_report.dart'; import 'package:test_sa/models/service_request/service_request.dart'; @@ -24,15 +22,17 @@ import 'package:test_sa/views/widgets/app_text_form_field.dart'; import 'package:test_sa/views/widgets/buttons/app_back_button.dart'; import 'package:test_sa/views/widgets/buttons/app_button.dart'; import 'package:test_sa/views/widgets/date_and_time/date_picker.dart'; +import 'package:test_sa/views/widgets/e_signature/e_signature.dart'; import 'package:test_sa/views/widgets/equipment/auto_complete_devices_field.dart'; import 'package:test_sa/views/widgets/images/mini_one_image_picker.dart'; import 'package:test_sa/views/widgets/loaders/loading_manager.dart'; import 'package:test_sa/views/widgets/parts/auto_complete_parts_field.dart'; import 'package:test_sa/views/widgets/parts/part_item.dart'; -import 'package:test_sa/views/widgets/speech_to_text/speech_to_text.dart'; +import 'package:test_sa/views/widgets/status/employee/engineers_mune.dart'; import 'package:test_sa/views/widgets/status/report/service_report_last_call.dart'; import 'package:test_sa/views/widgets/status/report/service_report_reasons.dart'; import 'package:test_sa/views/widgets/status/report/service_report_status.dart'; +import 'package:test_sa/views/widgets/status/report/service_report_type.dart'; import 'package:test_sa/views/widgets/status/report/service_status.dart'; import 'package:test_sa/views/widgets/timer/app_timer.dart'; import 'package:test_sa/views/widgets/titles/app_sub_title.dart'; @@ -67,11 +67,8 @@ class _CreateServiceReportState extends State with TickerPr void initState() { _serviceReport = ServiceReport( visitDate: DateTime.now(), - type: const Lookup(id: 2), - device: Device( - id: widget.request.deviceId, - serialNumber: widget.request.deviceSerialNumber, - ), + //type: const Lookup(value: 2), + device: widget.request.device, parts: [] ); super.initState(); @@ -158,25 +155,25 @@ class _CreateServiceReportState extends State with TickerPr Row( children: [ // Report Status - // Expanded( - // child: Column( - // crossAxisAlignment: CrossAxisAlignment.start, - // children: [ - // ASubTitle(_subtitle.reportType), - // _validate && _serviceReport.type == null ? - // ASubTitle(_subtitle.requiredWord,color: Colors.red,): - // const SizedBox.shrink(), - // const SizedBox(height: 4,), - // ServiceReportTypeMenu( - // initialValue: _serviceReport.type, - // onSelect: (status){ - // _serviceReport.type = status; - // }, - // ), - // ], - // ), - // ), - // const SizedBox(width: 8,), + Expanded( + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + ASubTitle(_subtitle.reportType), + _validate && _serviceReport.type == null ? + ASubTitle(_subtitle.requiredWord,color: Colors.red,): + const SizedBox.shrink(), + const SizedBox(height: 4,), + ServiceReportTypeMenu( + initialValue: _serviceReport.type, + onSelect: (status){ + _serviceReport.type = status; + }, + ), + ], + ), + ), + const SizedBox(width: 8,), // visit date Expanded( child: Column( @@ -231,14 +228,14 @@ class _CreateServiceReportState extends State with TickerPr ), const SizedBox(height: 8,), ASubTitle(_subtitle.serviceType), - _validate && _serviceReport.serviceType == null ? + _validate && _serviceReport.assetType == null ? ASubTitle(_subtitle.requiredWord,color: Colors.red,): const SizedBox.shrink(), const SizedBox(height: 4,), - ServiceStatusMenu( - initialValue: _serviceReport.serviceType, + ServiceAssetTypeMenu( + initialValue: _serviceReport.assetType, onSelect: (status){ - _serviceReport.serviceType = status; + _serviceReport.assetType = status; }, ), const SizedBox(height: 8,), @@ -265,36 +262,53 @@ class _CreateServiceReportState extends State with TickerPr ), ), const SizedBox(width: 8,), - Provider.of(context).isLoading == null - ? const SizedBox.shrink(): + // Provider.of(context).isLoading == null + // ? const SizedBox.shrink(): // Call's last Situation - Expanded( - child: Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - - ASubTitle(_subtitle.callLastSituation), - _validate && _serviceReport.callLastSituation == null ? - ASubTitle(_subtitle.requiredWord,color: Colors.red,): - const SizedBox.shrink(), - const SizedBox(height: 4,), - ServiceReportLastCallsMenu( - report: _serviceReport, - onSelect: (status){ - if(status?.id == 12 - || _serviceReport.callLastSituation?.id == 12){ - _serviceReport.callLastSituation = status; - setState(() {}); - } else { - _serviceReport.callLastSituation = status; - } - }, + Consumer( + builder: (_, provider, __) { + if(provider.isLoading == null) return const SizedBox.shrink(); + return Expanded( + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + ASubTitle(_subtitle.callLastSituation), + _validate && _serviceReport.callLastSituation == null ? + ASubTitle(_subtitle.requiredWord,color: Colors.red,): + const SizedBox.shrink(), + const SizedBox(height: 4,), + ServiceReportLastCallsMenu( + report: _serviceReport, + onSelect: (status){ + if(status?.value == 12 + || _serviceReport.callLastSituation?.value == 12){ + _serviceReport.callLastSituation = status; + setState(() {}); + } else { + _serviceReport.callLastSituation = status; + } + }, + ), + ], ), - ], - ), + ); + }, ), ], ), + SizedBox(height: 8 * AppStyle.getScaleFactor(context),), + const ASubTitle("Assign Employee"), + const SizedBox(height: 8,), + _validate && _serviceReport.engineer == null ? + ASubTitle(_subtitle.requiredWord,color: Colors.red,): + const SizedBox.shrink(), + const SizedBox(height: 4,), + EngineersMenu( + initialValue: _serviceReport.engineer, + onSelect: (engineer){ + _serviceReport.engineer = engineer; + }, + ), const SizedBox(height: 8,), // invoice number & code _serviceReport.callLastSituation?.id != 12 ? const SizedBox.shrink(): @@ -346,65 +360,65 @@ class _CreateServiceReportState extends State with TickerPr ], ), - const SizedBox(height: 8,), - Row( - children: [ - ASubTitle(_subtitle.faultDescription), - Expanded( - child: SizedBox( - height: 32 * AppStyle.getScaleFactor(context), - child: SpeechToTextButton( - controller: _faultController, - mini: true, - ), - ), - ), - ], - ), - const SizedBox(height: 4,), - ATextFormField( - initialValue: _serviceReport?.faultDescription, - textAlign: TextAlign.center, - controller: _faultController, - style: Theme.of(context).textTheme.subtitle1, - validator: (value) => - Validator.hasValue(value) - ? null : _subtitle.requiredWord, - textInputType: TextInputType.multiline, - onSaved: (value){ - _serviceReport.faultDescription = value; - }, - ), - const SizedBox(height: 8,), - Row( - children: [ - ASubTitle(_subtitle.workPreformed), - Expanded( - child: SizedBox( - height: 32 * AppStyle.getScaleFactor(context), - child: SpeechToTextButton( - controller: _workPreformedController, - mini: true, - ), - ), - ), - ], - ), - const SizedBox(height: 4,), - ATextFormField( - initialValue: _serviceReport?.workPreformed, - textAlign: TextAlign.center, - controller: _workPreformedController, - style: Theme.of(context).textTheme.subtitle1, - validator: (value) => - Validator.hasValue(value) - ? null : _subtitle.requiredWord, - textInputType: TextInputType.multiline, - onSaved: (value){ - _serviceReport.workPreformed = value; - }, - ), - const SizedBox(height: 8,), + // const SizedBox(height: 8,), + // Row( + // children: [ + // ASubTitle(_subtitle.faultDescription), + // Expanded( + // child: SizedBox( + // height: 32 * AppStyle.getScaleFactor(context), + // child: SpeechToTextButton( + // controller: _faultController, + // mini: true, + // ), + // ), + // ), + // ], + // ), + // const SizedBox(height: 4,), + // ATextFormField( + // initialValue: _serviceReport?.faultDescriptionId, + // textAlign: TextAlign.center, + // controller: _faultController, + // style: Theme.of(context).textTheme.subtitle1, + // validator: (value) => + // Validator.hasValue(value) + // ? null : _subtitle.requiredWord, + // textInputType: TextInputType.multiline, + // onSaved: (value){ + // _serviceReport.faultDescriptionId = value; + // }, + // ), + // const SizedBox(height: 8,), + // Row( + // children: [ + // ASubTitle(_subtitle.workPreformed), + // Expanded( + // child: SizedBox( + // height: 32 * AppStyle.getScaleFactor(context), + // child: SpeechToTextButton( + // controller: _workPreformedController, + // mini: true, + // ), + // ), + // ), + // ], + // ), + // const SizedBox(height: 4,), + // ATextFormField( + // initialValue: _serviceReport?.workPreformed, + // textAlign: TextAlign.center, + // controller: _workPreformedController, + // style: Theme.of(context).textTheme.subtitle1, + // validator: (value) => + // Validator.hasValue(value) + // ? null : _subtitle.requiredWord, + // textInputType: TextInputType.multiline, + // onSaved: (value){ + // _serviceReport.workPreformed = value; + // }, + // ), + // const SizedBox(height: 8,), const SizedBox(height: 8,), Row( @@ -436,7 +450,7 @@ class _CreateServiceReportState extends State with TickerPr image: _image, onPick: (image){ _image =image; - _serviceReport.image = base64Encode(image.readAsBytesSync()); + _serviceReport.image = "${image.path.split("/").last}|${base64Encode(image.readAsBytesSync())}"; }, ), ], @@ -454,12 +468,18 @@ class _CreateServiceReportState extends State with TickerPr children: [ ASubTitle(_subtitle.workingHours), const SizedBox(height: 8,), - AppTimer( - timer: _serviceReport.timer, - onChange: (timer) async{ - _serviceReport.timer = timer; - return true; - }, + Row( + children: [ + Expanded( + child: AppTimer( + timer: _serviceReport.timer, + onChange: (timer) async{ + _serviceReport.timer = timer; + return true; + }, + ), + ), + ], ), // ATextFormField( // initialValue: _serviceReport?.workHours, @@ -477,79 +497,102 @@ class _CreateServiceReportState extends State with TickerPr ], ), ), - const SizedBox(width: 8,), - Expanded( - child: Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - ASubTitle(_subtitle.travelingHours), - const SizedBox(height: 4,), - ATextFormField( - initialValue: _serviceReport?.travelingHours, - textAlign: TextAlign.center, - hintText: "i.e 3, 3.5, 4", - style: Theme.of(context).textTheme.subtitle1, - // validator: (value) => - // Validator.isNumeric(value) - // ? null : _subtitle.requiredWord, - textInputType: TextInputType.number, - onSaved: (value){ - _serviceReport.travelingHours = value; - }, - ), - ], - ), - ), - ], - ), - const SizedBox(height: 8,), - // Operating Hours and Job Sheet Number - Row( - children: [ + // const SizedBox(width: 8,), // Expanded( // child: Column( // crossAxisAlignment: CrossAxisAlignment.start, // children: [ - // ASubTitle(_subtitle.operatingHours), + // ASubTitle(_subtitle.travelingHours), // const SizedBox(height: 4,), // ATextFormField( - // initialValue: _serviceReport?.operatingHours, + // initialValue: _serviceReport?.travelingHours, // textAlign: TextAlign.center, // hintText: "i.e 3, 3.5, 4", // style: Theme.of(context).textTheme.subtitle1, - // validator: (value) => - // Validator.isNumeric(value) - // ? null : _subtitle.requiredWord, + // // validator: (value) => + // // Validator.isNumeric(value) + // // ? null : _subtitle.requiredWord, // textInputType: TextInputType.number, // onSaved: (value){ - // _serviceReport.operatingHours = value; + // _serviceReport.travelingHours = value; // }, // ), // ], // ), // ), - // const SizedBox(width: 8,), - Expanded( - child: Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - ASubTitle(_subtitle.jobSheetNumber), - const SizedBox(height: 4,), - ATextFormField( - initialValue: _serviceReport?.jobSheetNumber, - textAlign: TextAlign.center, - style: Theme.of(context).textTheme.subtitle1, - textInputType: TextInputType.name, - onSaved: (value){ - _serviceReport.jobSheetNumber = value; - }, - ), - ], - ), - ), ], ), const SizedBox(height: 8,), + // Operating Hours and Job Sheet Number + // Row( + // children: [ + // Expanded( + // child: Column( + // crossAxisAlignment: CrossAxisAlignment.start, + // children: [ + // ASubTitle(_subtitle.operatingHours), + // const SizedBox(height: 4,), + // ATextFormField( + // initialValue: _serviceReport?.operatingHours, + // textAlign: TextAlign.center, + // hintText: "i.e 3, 3.5, 4", + // style: Theme.of(context).textTheme.subtitle1, + // validator: (value) => + // Validator.isNumeric(value) + // ? null : _subtitle.requiredWord, + // textInputType: TextInputType.number, + // onSaved: (value){ + // _serviceReport.operatingHours = value; + // }, + // ), + // ], + // ), + // ), + // const SizedBox(width: 8,), + // Expanded( + // child: Column( + // crossAxisAlignment: CrossAxisAlignment.start, + // children: [ + // ASubTitle(_subtitle.jobSheetNumber), + // const SizedBox(height: 4,), + // ATextFormField( + // initialValue: _serviceReport?.jobSheetNumber, + // textAlign: TextAlign.center, + // style: Theme.of(context).textTheme.subtitle1, + // textInputType: TextInputType.name, + // onSaved: (value){ + // _serviceReport.jobSheetNumber = value; + // }, + // ), + // ], + // ), + // ), + // ], + // ), + //const SizedBox(height: 8,), + const SizedBox(height: 8,), + const ASubTitle("Nurse Signature"), + ESignature( + oldSignature: _serviceReport.signatureNurse, + newSignature: _serviceReport.localNurseSignature, + onChange: (signature){ + if(signature == null || signature.isEmpty) {return;} + _serviceReport.localNurseSignature = signature; + _serviceReport.signatureNurse = "${DateTime.now().toIso8601String()}.png|${base64Encode(signature)}"; + }, + ), + const SizedBox(height: 8,), + const ASubTitle("Engineer Signature"), + ESignature( + oldSignature: _serviceReport.signatureEngineer, + newSignature: _serviceReport.localNurseSignature, + onChange: (signature){ + if(signature == null || signature.isEmpty) {return;} + _serviceReport.localNurseSignature = signature; + _serviceReport.signatureEngineer = "${DateTime.now().toIso8601String()}.png|${base64Encode(signature)}"; + }, + ), + const SizedBox(height: 8,), // Part Number and Quantity Row( children: [ @@ -596,7 +639,6 @@ class _CreateServiceReportState extends State with TickerPr } ), ), - const SizedBox(height: 16,), ], diff --git a/lib/views/pages/user/requests/report/edit_service_report.dart b/lib/views/pages/user/requests/report/edit_service_report.dart index 4a7be338..bfc8f4f5 100644 --- a/lib/views/pages/user/requests/report/edit_service_report.dart +++ b/lib/views/pages/user/requests/report/edit_service_report.dart @@ -22,12 +22,13 @@ import 'package:test_sa/views/widgets/app_text_form_field.dart'; import 'package:test_sa/views/widgets/buttons/app_back_button.dart'; import 'package:test_sa/views/widgets/buttons/app_button.dart'; import 'package:test_sa/views/widgets/date_and_time/date_picker.dart'; +import 'package:test_sa/views/widgets/e_signature/e_signature.dart'; import 'package:test_sa/views/widgets/equipment/auto_complete_devices_field.dart'; import 'package:test_sa/views/widgets/images/mini_one_image_picker.dart'; import 'package:test_sa/views/widgets/loaders/loading_manager.dart'; import 'package:test_sa/views/widgets/parts/auto_complete_parts_field.dart'; import 'package:test_sa/views/widgets/parts/part_item.dart'; -import 'package:test_sa/views/widgets/speech_to_text/speech_to_text.dart'; +import 'package:test_sa/views/widgets/status/employee/engineers_mune.dart'; import 'package:test_sa/views/widgets/status/report/service_report_last_call.dart'; import 'package:test_sa/views/widgets/status/report/service_report_reasons.dart'; import 'package:test_sa/views/widgets/status/report/service_report_status.dart'; @@ -223,14 +224,28 @@ class _EditServiceReportState extends State with TickerProvid ), const SizedBox(height: 8,), ASubTitle(_subtitle.serviceType), - _validate && _serviceReport.serviceType == null ? + _validate && _serviceReport.assetType == null ? ASubTitle(_subtitle.requiredWord,color: Colors.red,): const SizedBox.shrink(), const SizedBox(height: 4,), - ServiceStatusMenu( - initialValue: _serviceReport.serviceType, + ServiceAssetTypeMenu( + initialValue: _serviceReport.assetType, onSelect: (status){ - _serviceReport.serviceType = status; + _serviceReport.assetType = status; + }, + ), + const SizedBox(height: 8,), + SizedBox(height: 8 * AppStyle.getScaleFactor(context),), + const ASubTitle("Assign Employee"), + const SizedBox(height: 8,), + _validate && _serviceReport.engineer == null ? + ASubTitle(_subtitle.requiredWord,color: Colors.red,): + const SizedBox.shrink(), + const SizedBox(height: 4,), + EngineersMenu( + initialValue: _serviceReport.engineer, + onSelect: (engineer){ + _serviceReport.engineer = engineer; }, ), const SizedBox(height: 8,), @@ -257,33 +272,34 @@ class _EditServiceReportState extends State with TickerProvid ), ), const SizedBox(width: 8,), - Provider.of(context).isLoading == null - ? const SizedBox.shrink(): - // Call's last Situation - Expanded( - child: Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - - ASubTitle(_subtitle.callLastSituation), - _validate && _serviceReport.callLastSituation == null ? - ASubTitle(_subtitle.requiredWord,color: Colors.red,): - const SizedBox.shrink(), - const SizedBox(height: 4,), - ServiceReportLastCallsMenu( - report: _serviceReport, - onSelect: (status){ - if(status?.value == 12 - || _serviceReport.callLastSituation?.value == 12){ - _serviceReport.callLastSituation = status; - setState(() {}); - } else { - _serviceReport.callLastSituation = status; - } - }, + Consumer( + builder: (_, provider, __) { + if(provider.isLoading == null) return const SizedBox.shrink(); + return Expanded( + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + ASubTitle(_subtitle.callLastSituation), + _validate && _serviceReport.callLastSituation == null ? + ASubTitle(_subtitle.requiredWord,color: Colors.red,): + const SizedBox.shrink(), + const SizedBox(height: 4,), + ServiceReportLastCallsMenu( + report: _serviceReport, + onSelect: (status){ + if(status?.value == 12 + || _serviceReport.callLastSituation?.value == 12){ + _serviceReport.callLastSituation = status; + setState(() {}); + } else { + _serviceReport.callLastSituation = status; + } + }, + ), + ], ), - ], - ), + ); + }, ), ], ), @@ -338,65 +354,65 @@ class _EditServiceReportState extends State with TickerProvid ], ), - const SizedBox(height: 8,), - Row( - children: [ - ASubTitle(_subtitle.faultDescription), - Expanded( - child: SizedBox( - height: 32 * AppStyle.getScaleFactor(context), - child: SpeechToTextButton( - controller: _faultController, - mini: true, - ), - ), - ), - ], - ), - const SizedBox(height: 4,), - ATextFormField( - initialValue: _serviceReport?.faultDescription, - textAlign: TextAlign.center, - controller: _faultController, - style: Theme.of(context).textTheme.subtitle1, - validator: (value) => - Validator.hasValue(value) - ? null : _subtitle.requiredWord, - textInputType: TextInputType.multiline, - onSaved: (value){ - _serviceReport.faultDescription = value; - }, - ), - const SizedBox(height: 8,), - Row( - children: [ - ASubTitle(_subtitle.workPreformed), - Expanded( - child: SizedBox( - height: 32 * AppStyle.getScaleFactor(context), - child: SpeechToTextButton( - controller: _workPreformedController, - mini: true, - ), - ), - ), - ], - ), - const SizedBox(height: 4,), - ATextFormField( - initialValue: _serviceReport?.workPreformed, - textAlign: TextAlign.center, - controller: _workPreformedController, - style: Theme.of(context).textTheme.subtitle1, - validator: (value) => - Validator.hasValue(value) - ? null : _subtitle.requiredWord, - textInputType: TextInputType.multiline, - onSaved: (value){ - _serviceReport.workPreformed = value; - }, - ), - const SizedBox(height: 8,), + // const SizedBox(height: 8,), + // Row( + // children: [ + // ASubTitle(_subtitle.faultDescription), + // Expanded( + // child: SizedBox( + // height: 32 * AppStyle.getScaleFactor(context), + // child: SpeechToTextButton( + // controller: _faultController, + // mini: true, + // ), + // ), + // ), + // ], + // ), + // const SizedBox(height: 4,), + // ATextFormField( + // initialValue: _serviceReport?.faultDescriptionId, + // textAlign: TextAlign.center, + // controller: _faultController, + // style: Theme.of(context).textTheme.subtitle1, + // validator: (value) => + // Validator.hasValue(value) + // ? null : _subtitle.requiredWord, + // textInputType: TextInputType.multiline, + // onSaved: (value){ + // _serviceReport.faultDescriptionId = value; + // }, + // ), + // const SizedBox(height: 8,), + // Row( + // children: [ + // ASubTitle(_subtitle.workPreformed), + // Expanded( + // child: SizedBox( + // height: 32 * AppStyle.getScaleFactor(context), + // child: SpeechToTextButton( + // controller: _workPreformedController, + // mini: true, + // ), + // ), + // ), + // ], + // ), + // const SizedBox(height: 4,), + // ATextFormField( + // initialValue: _serviceReport?.workPreformed, + // textAlign: TextAlign.center, + // controller: _workPreformedController, + // style: Theme.of(context).textTheme.subtitle1, + // validator: (value) => + // Validator.hasValue(value) + // ? null : _subtitle.requiredWord, + // textInputType: TextInputType.multiline, + // onSaved: (value){ + // _serviceReport.workPreformed = value; + // }, + // ), + // const SizedBox(height: 8,), const SizedBox(height: 8,), Row( @@ -446,12 +462,18 @@ class _EditServiceReportState extends State with TickerProvid children: [ ASubTitle(_subtitle.workingHours), const SizedBox(height: 8,), - AppTimer( - timer: _serviceReport.timer, - onChange: (timer) async{ - _serviceReport.timer = timer; - return true; - }, + Row( + children: [ + Expanded( + child: AppTimer( + timer: _serviceReport.timer, + onChange: (timer) async{ + _serviceReport.timer = timer; + return true; + }, + ), + ), + ], ), // ATextFormField( // initialValue: _serviceReport?.workHours, @@ -469,77 +491,100 @@ class _EditServiceReportState extends State with TickerProvid ], ), ), - const SizedBox(width: 8,), - Expanded( - child: Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - ASubTitle(_subtitle.travelingHours), - const SizedBox(height: 4,), - ATextFormField( - initialValue: _serviceReport?.travelingHours, - textAlign: TextAlign.center, - hintText: "i.e 3, 3.5, 4", - style: Theme.of(context).textTheme.subtitle1, - validator: (value) => - Validator.isNumeric(value) - ? null : _subtitle.requiredWord, - textInputType: TextInputType.number, - onSaved: (value){ - _serviceReport.travelingHours = value; - }, - ), - ], - ), - ), + // const SizedBox(width: 8,), + // Expanded( + // child: Column( + // crossAxisAlignment: CrossAxisAlignment.start, + // children: [ + // ASubTitle(_subtitle.travelingHours), + // const SizedBox(height: 4,), + // ATextFormField( + // initialValue: _serviceReport?.travelingHours, + // textAlign: TextAlign.center, + // hintText: "i.e 3, 3.5, 4", + // style: Theme.of(context).textTheme.subtitle1, + // validator: (value) => + // Validator.isNumeric(value) + // ? null : _subtitle.requiredWord, + // textInputType: TextInputType.number, + // onSaved: (value){ + // _serviceReport.travelingHours = value; + // }, + // ), + // ], + // ), + // ), ], ), const SizedBox(height: 8,), // Operating Hours and Job Sheet Number - Row( - children: [ - Expanded( - child: Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - ASubTitle(_subtitle.operatingHours), - const SizedBox(height: 4,), - ATextFormField( - initialValue: _serviceReport?.operatingHours, - textAlign: TextAlign.center, - hintText: "i.e 3, 3.5, 4", - style: Theme.of(context).textTheme.subtitle1, - validator: (value) => - Validator.isNumeric(value) - ? null : _subtitle.requiredWord, - textInputType: TextInputType.number, - onSaved: (value){ - _serviceReport.operatingHours = value; - }, - ), - ], - ), - ), - const SizedBox(width: 8,), - Expanded( - child: Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - ASubTitle(_subtitle.jobSheetNumber), - const SizedBox(height: 4,), - ATextFormField( - initialValue: _serviceReport?.jobSheetNumber, - textAlign: TextAlign.center, - style: Theme.of(context).textTheme.subtitle1, - textInputType: TextInputType.name, - onSaved: (value){ - _serviceReport.jobSheetNumber = value; - }, - ), - ], - ), - ), - ], + // Row( + // children: [ + // Expanded( + // child: Column( + // crossAxisAlignment: CrossAxisAlignment.start, + // children: [ + // ASubTitle(_subtitle.operatingHours), + // const SizedBox(height: 4,), + // ATextFormField( + // initialValue: _serviceReport?.operatingHours, + // textAlign: TextAlign.center, + // hintText: "i.e 3, 3.5, 4", + // style: Theme.of(context).textTheme.subtitle1, + // validator: (value) => + // Validator.isNumeric(value) + // ? null : _subtitle.requiredWord, + // textInputType: TextInputType.number, + // onSaved: (value){ + // _serviceReport.operatingHours = value; + // }, + // ), + // ], + // ), + // ), + // const SizedBox(width: 8,), + // Expanded( + // child: Column( + // crossAxisAlignment: CrossAxisAlignment.start, + // children: [ + // ASubTitle(_subtitle.jobSheetNumber), + // const SizedBox(height: 4,), + // ATextFormField( + // initialValue: _serviceReport?.jobSheetNumber, + // textAlign: TextAlign.center, + // style: Theme.of(context).textTheme.subtitle1, + // textInputType: TextInputType.name, + // onSaved: (value){ + // _serviceReport.jobSheetNumber = value; + // }, + // ), + // ], + // ), + // ), + // ], + // ), + //const SizedBox(height: 8,), + const SizedBox(height: 8,), + const ASubTitle("Nurse Signature"), + ESignature( + oldSignature: _serviceReport.signatureNurse, + newSignature: _serviceReport.localNurseSignature, + onChange: (signature){ + if(signature == null || signature.isEmpty) {return;} + _serviceReport.localNurseSignature = signature; + _serviceReport.signatureNurse = "${DateTime.now().toIso8601String()}.png|${base64Encode(signature)}"; + }, + ), + const SizedBox(height: 8,), + const ASubTitle("Engineer Signature"), + ESignature( + oldSignature: _serviceReport.signatureEngineer, + newSignature: _serviceReport.localNurseSignature, + onChange: (signature){ + if(signature == null || signature.isEmpty) {return;} + _serviceReport.localNurseSignature = signature; + _serviceReport.signatureEngineer = "${DateTime.now().toIso8601String()}.png|${base64Encode(signature)}"; + }, ), const SizedBox(height: 8,), // Part Number and Quantity diff --git a/lib/views/pages/user/requests/request_details.dart b/lib/views/pages/user/requests/request_details.dart index c052fb68..d45692d8 100644 --- a/lib/views/pages/user/requests/request_details.dart +++ b/lib/views/pages/user/requests/request_details.dart @@ -2,7 +2,6 @@ import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; import 'package:intl/intl.dart'; import 'package:provider/provider.dart'; -import 'package:test_sa/controllers/api_routes/http_status_manger.dart'; import 'package:test_sa/controllers/localization/localization.dart'; import 'package:test_sa/controllers/providers/api/service_requests_provider.dart'; import 'package:test_sa/controllers/providers/api/user_provider.dart'; @@ -16,7 +15,6 @@ import 'package:test_sa/views/pages/user/requests/report/create_service_report.d import 'package:test_sa/views/widgets/buttons/app_back_button.dart'; import 'package:test_sa/views/widgets/buttons/app_button.dart'; import 'package:test_sa/views/widgets/buttons/app_icon_button.dart'; -import 'package:test_sa/views/widgets/dialogs/dialog.dart'; import 'package:test_sa/views/widgets/images/images_list.dart'; import 'package:test_sa/views/widgets/loaders/image_loader.dart'; import 'package:test_sa/views/widgets/requests/info_row.dart'; @@ -25,7 +23,6 @@ import 'package:test_sa/views/widgets/requests/service_request_update_dialog.dar import 'package:test_sa/views/widgets/sound/sound_player.dart'; import 'package:test_sa/views/widgets/titles/app_sub_title.dart'; -import '../report_issues_page.dart'; import 'report/future_service_report.dart'; class RequestDetailsPage extends StatelessWidget { static final String id = "/call-details"; @@ -62,19 +59,20 @@ class RequestDetailsPage extends StatelessWidget { ), ), _userProvider.user.type == UsersTypes.normal_user ? - AIconButton( - iconData: Icons.warning_amber_rounded, - color: AColors.white, - buttonSize: 42, - backgroundColor: AColors.deepOrange, - onPressed: (){ - Navigator.of(context).push( - MaterialPageRoute( - builder: (_) => ReportIssuesPage(serviceRequest: serviceRequest,) - ) - ); - }, - ) + // AIconButton( + // iconData: Icons.warning_amber_rounded, + // color: AColors.white, + // buttonSize: 42, + // backgroundColor: AColors.deepOrange, + // onPressed: (){ + // Navigator.of(context).push( + // MaterialPageRoute( + // builder: (_) => ReportIssuesPage(serviceRequest: serviceRequest,) + // ) + // ); + // }, + // ) + const SizedBox(width: 48,) : AIconButton( iconData: Icons.edit, color: AColors.white, @@ -247,44 +245,45 @@ class RequestDetailsPage extends StatelessWidget { ASoundPlayer( audio: serviceRequest.audio, ), - Center( - child: Padding( - padding: EdgeInsets.all(32), - child: AButton( - text: _subtitle.duplicateRequest, - onPressed: () async { - bool result = await showDialog( - context: context, - builder: (_) => AAlertDialog( - title: _subtitle.duplicateAlert, - content: _subtitle.duplicateAlertMessage, - ) - ); - if(result == true){ - showDialog( - context: context, - builder: (context){ - return Center(child: CircularProgressIndicator()); - } - ); - int status = await _serviceRequestsProvider.createDuplicatedReport( - host: _settingProvider.host, - user: _userProvider.user, - request: serviceRequest - ); - Navigator.of(context).pop(); - ScaffoldMessenger.of(context).showSnackBar( - SnackBar( - content: Text( - HttpStatusManger.getStatusMessage(status: status, subtitle: _subtitle) - ) - ) - ); - } - }, - ), - ), - ) + // + // Center( + // child: Padding( + // padding: EdgeInsets.all(32), + // child: AButton( + // text: _subtitle.duplicateRequest, + // onPressed: () async { + // bool result = await showDialog( + // context: context, + // builder: (_) => AAlertDialog( + // title: _subtitle.duplicateAlert, + // content: _subtitle.duplicateAlertMessage, + // ) + // ); + // if(result == true){ + // showDialog( + // context: context, + // builder: (context){ + // return Center(child: CircularProgressIndicator()); + // } + // ); + // int status = await _serviceRequestsProvider.createDuplicatedReport( + // host: _settingProvider.host, + // user: _userProvider.user, + // request: serviceRequest + // ); + // Navigator.of(context).pop(); + // ScaffoldMessenger.of(context).showSnackBar( + // SnackBar( + // content: Text( + // HttpStatusManger.getStatusMessage(status: status, subtitle: _subtitle) + // ) + // ) + // ); + // } + // }, + // ), + // ), + // ) ], ), serviceRequest.viewReport ? @@ -307,7 +306,8 @@ class RequestDetailsPage extends StatelessWidget { title: _subtitle.jobSheetNumber, info: serviceRequest.jobSheetNumber, ), - _userProvider.user.type == UsersTypes.engineer ? + _userProvider.user.type == UsersTypes.engineer + && serviceRequest.reportID != null? Padding( padding: EdgeInsets.all(32), child: AButton( diff --git a/lib/views/pages/user/visits/pantry/edit_pentry.dart b/lib/views/pages/user/visits/pantry/edit_pentry.dart index 39971677..a758bb93 100644 --- a/lib/views/pages/user/visits/pantry/edit_pentry.dart +++ b/lib/views/pages/user/visits/pantry/edit_pentry.dart @@ -1,7 +1,6 @@ import 'package:flutter/material.dart'; import 'package:fluttertoast/fluttertoast.dart'; import 'package:provider/provider.dart'; -import 'package:test_sa/controllers/api_routes/http_status_manger.dart'; import 'package:test_sa/controllers/localization/localization.dart'; import 'package:test_sa/controllers/providers/api/regular_visits_provider.dart'; import 'package:test_sa/controllers/providers/api/user_provider.dart'; @@ -62,7 +61,8 @@ class _EditPentryState extends State with SingleTickerProviderStateM Fluttertoast.showToast( msg: _subtitle.requestCompleteSuccessfully, ); - // Navigator.of(context).pop(); + Navigator.of(context).pop(); + Navigator.of(context).pop(); }else{ // String errorMessage = HttpStatusManger.getStatusMessage( // status: status, subtitle: _subtitle); diff --git a/lib/views/pages/user/visits/update_visits_group_sheet.dart b/lib/views/pages/user/visits/update_visits_group_sheet.dart index ae8d66cb..40ebd651 100644 --- a/lib/views/pages/user/visits/update_visits_group_sheet.dart +++ b/lib/views/pages/user/visits/update_visits_group_sheet.dart @@ -1,20 +1,12 @@ -import 'dart:convert'; -import 'dart:io'; - import 'package:flutter/material.dart'; import 'package:test_sa/controllers/localization/localization.dart'; -import 'package:test_sa/models/lookup.dart'; import 'package:test_sa/models/subtitle.dart'; import 'package:test_sa/models/visits/visit.dart'; import 'package:test_sa/models/visits/visits_group.dart'; import 'package:test_sa/views/app_style/colors.dart'; import 'package:test_sa/views/app_style/sizing.dart'; -import 'package:test_sa/views/widgets/app_text_form_field.dart'; import 'package:test_sa/views/widgets/buttons/app_button.dart'; import 'package:test_sa/views/widgets/buttons/app_small_button.dart'; -import 'package:test_sa/views/widgets/date_and_time/date_picker.dart'; -import 'package:test_sa/views/widgets/images/one_image_picker.dart'; -import 'package:test_sa/views/widgets/search/filter_item.dart'; import 'package:test_sa/views/widgets/status/employee/engineers_mune.dart'; import 'package:test_sa/views/widgets/visits/visit_status.dart'; class UpdateVisitsGroupSheet extends StatefulWidget { diff --git a/lib/views/pages/user/visits/visit_details.dart b/lib/views/pages/user/visits/visit_details.dart index ca876b77..cd400297 100644 --- a/lib/views/pages/user/visits/visit_details.dart +++ b/lib/views/pages/user/visits/visit_details.dart @@ -6,7 +6,6 @@ import 'package:test_sa/models/visits/visit.dart'; import 'package:test_sa/views/app_style/colors.dart'; import 'package:test_sa/views/app_style/sizing.dart'; import 'package:test_sa/views/pages/user/visits/pantry/edit_pentry.dart'; -import 'package:test_sa/views/pages/user/visits/pantry/future_edit_pently.dart'; import 'package:test_sa/views/widgets/buttons/app_back_button.dart'; import 'package:test_sa/views/widgets/buttons/app_icon_button.dart'; import 'package:test_sa/views/widgets/images/images_list.dart'; diff --git a/lib/views/widgets/app_name_bar.dart b/lib/views/widgets/app_name_bar.dart index 35a382a0..8aebd901 100644 --- a/lib/views/widgets/app_name_bar.dart +++ b/lib/views/widgets/app_name_bar.dart @@ -1,6 +1,6 @@ +import 'package:flutter/material.dart'; import 'package:test_sa/views/app_style/colors.dart'; import 'package:test_sa/views/app_style/sizing.dart'; -import 'package:flutter/material.dart'; class AppNameBar extends StatelessWidget { @override Widget build(BuildContext context) { diff --git a/lib/views/widgets/app_text_form_field.dart b/lib/views/widgets/app_text_form_field.dart index 407b351f..90885a27 100644 --- a/lib/views/widgets/app_text_form_field.dart +++ b/lib/views/widgets/app_text_form_field.dart @@ -1,6 +1,6 @@ +import 'package:flutter/material.dart'; import 'package:test_sa/views/app_style/colors.dart'; import 'package:test_sa/views/app_style/sizing.dart'; -import 'package:flutter/material.dart'; class ATextFormField extends StatefulWidget { final Function(String) onSaved; final Function(String) validator; diff --git a/lib/views/widgets/date_and_time/date_picker.dart b/lib/views/widgets/date_and_time/date_picker.dart index 70a4c82e..a3136342 100644 --- a/lib/views/widgets/date_and_time/date_picker.dart +++ b/lib/views/widgets/date_and_time/date_picker.dart @@ -1,6 +1,5 @@ -import 'package:test_sa/views/app_style/colors.dart'; -import 'package:test_sa/views/app_style/sizing.dart'; import 'package:flutter/material.dart'; +import 'package:test_sa/views/app_style/sizing.dart'; class ADatePicker extends StatelessWidget { final DateTime date; diff --git a/lib/views/widgets/date_and_time/from_to_date_bar.dart b/lib/views/widgets/date_and_time/from_to_date_bar.dart index 422dcbf9..4ef79e81 100644 --- a/lib/views/widgets/date_and_time/from_to_date_bar.dart +++ b/lib/views/widgets/date_and_time/from_to_date_bar.dart @@ -1,7 +1,7 @@ +import 'package:flutter/material.dart'; import 'package:test_sa/controllers/localization/localization.dart'; import 'package:test_sa/models/subtitle.dart'; import 'package:test_sa/views/app_style/sizing.dart'; -import 'package:flutter/material.dart'; import 'date_picker.dart'; class FromToDateBar extends StatefulWidget { diff --git a/lib/views/widgets/departments/department_button.dart b/lib/views/widgets/departments/department_button.dart index 811f0898..1f9668b2 100644 --- a/lib/views/widgets/departments/department_button.dart +++ b/lib/views/widgets/departments/department_button.dart @@ -1,11 +1,11 @@ +import 'package:flutter/material.dart'; +import 'package:font_awesome_flutter/font_awesome_flutter.dart'; import 'package:test_sa/controllers/localization/localization.dart'; import 'package:test_sa/models/department.dart'; import 'package:test_sa/models/subtitle.dart'; import 'package:test_sa/views/app_style/colors.dart'; import 'package:test_sa/views/app_style/sizing.dart'; import 'package:test_sa/views/widgets/departments/single_department_picker.dart'; -import 'package:flutter/material.dart'; -import 'package:font_awesome_flutter/font_awesome_flutter.dart'; class DepartmentButton extends StatelessWidget { final Function(Department) onDepartmentPick; final Department department; diff --git a/lib/views/widgets/departments/department_item.dart b/lib/views/widgets/departments/department_item.dart index fd37b418..4ac240e9 100644 --- a/lib/views/widgets/departments/department_item.dart +++ b/lib/views/widgets/departments/department_item.dart @@ -1,7 +1,7 @@ +import 'package:flutter/material.dart'; import 'package:test_sa/models/department.dart'; import 'package:test_sa/views/app_style/colors.dart'; import 'package:test_sa/views/app_style/sizing.dart'; -import 'package:flutter/material.dart'; class DepartmentItem extends StatelessWidget { final Department department; final Function(Department) onPressed; diff --git a/lib/views/widgets/departments/single_department_picker.dart b/lib/views/widgets/departments/single_department_picker.dart index fb07b393..e5fb916b 100644 --- a/lib/views/widgets/departments/single_department_picker.dart +++ b/lib/views/widgets/departments/single_department_picker.dart @@ -1,3 +1,5 @@ +import 'package:flutter/material.dart'; +import 'package:provider/provider.dart'; import 'package:test_sa/controllers/localization/localization.dart'; import 'package:test_sa/controllers/providers/api/departments_provider.dart'; import 'package:test_sa/controllers/providers/settings/setting_provider.dart'; @@ -6,8 +8,6 @@ import 'package:test_sa/models/subtitle.dart'; import 'package:test_sa/views/widgets/departments/department_item.dart'; import 'package:test_sa/views/widgets/loaders/loading_manager.dart'; import 'package:test_sa/views/widgets/loaders/no_item_found.dart'; -import 'package:flutter/material.dart'; -import 'package:provider/provider.dart'; import '../app_text_form_field.dart'; class SingleDepartmentPicker extends StatefulWidget { diff --git a/lib/views/widgets/device_trancfer/device_transfer_info_section.dart b/lib/views/widgets/device_trancfer/device_transfer_info_section.dart index 8360ba23..03e694c4 100644 --- a/lib/views/widgets/device_trancfer/device_transfer_info_section.dart +++ b/lib/views/widgets/device_trancfer/device_transfer_info_section.dart @@ -2,7 +2,6 @@ import 'package:flutter/material.dart'; import 'package:test_sa/controllers/localization/localization.dart'; import 'package:test_sa/models/device/device_transfer_info.dart'; import 'package:test_sa/views/app_style/colors.dart'; -import 'package:test_sa/views/app_style/sizing.dart'; import 'package:test_sa/views/widgets/loaders/image_loader.dart'; import 'package:test_sa/views/widgets/requests/info_row.dart'; import 'package:test_sa/views/widgets/requests/request_status.dart'; diff --git a/lib/views/widgets/device_trancfer/device_transfer_item.dart b/lib/views/widgets/device_trancfer/device_transfer_item.dart index ea426523..4b2d78ce 100644 --- a/lib/views/widgets/device_trancfer/device_transfer_item.dart +++ b/lib/views/widgets/device_trancfer/device_transfer_item.dart @@ -1,21 +1,14 @@ +import 'package:flutter/cupertino.dart'; +import 'package:flutter/material.dart'; +import 'package:provider/provider.dart'; import 'package:test_sa/controllers/localization/localization.dart'; import 'package:test_sa/controllers/providers/api/user_provider.dart'; import 'package:test_sa/models/device/device_transfer.dart'; -import 'package:test_sa/models/enums/user_types.dart'; -import 'package:test_sa/models/gas_refill/gas_refill_model.dart'; -import 'package:test_sa/models/service_request/service_request.dart'; import 'package:test_sa/models/subtitle.dart'; import 'package:test_sa/models/user.dart'; import 'package:test_sa/views/app_style/colors.dart'; import 'package:test_sa/views/app_style/sizing.dart'; -import 'package:test_sa/views/pages/user/requests/report/create_service_report.dart'; -import 'package:test_sa/views/pages/user/requests/report/future_service_report.dart'; -import 'package:test_sa/views/widgets/loaders/image_loader.dart'; import 'package:test_sa/views/widgets/requests/request_status.dart'; -import 'package:flutter/cupertino.dart'; -import 'package:flutter/material.dart'; -import 'package:intl/intl.dart'; -import 'package:provider/provider.dart'; class DeviceTransferItem extends StatelessWidget { final int index; final DeviceTransfer item; diff --git a/lib/views/widgets/device_trancfer/device_transfer_list.dart b/lib/views/widgets/device_trancfer/device_transfer_list.dart index ede0bc6d..18bee922 100644 --- a/lib/views/widgets/device_trancfer/device_transfer_list.dart +++ b/lib/views/widgets/device_trancfer/device_transfer_list.dart @@ -1,17 +1,11 @@ +import 'package:flutter/material.dart'; import 'package:test_sa/controllers/localization/localization.dart'; import 'package:test_sa/models/device/device_transfer.dart'; -import 'package:test_sa/models/gas_refill/gas_refill_model.dart'; -import 'package:test_sa/models/service_request/service_request.dart'; import 'package:test_sa/models/subtitle.dart'; import 'package:test_sa/views/pages/device_transfer/device_transfer_details.dart'; -import 'package:test_sa/views/pages/user/gas_refill/gas_refill_details.dart'; -import 'package:test_sa/views/pages/user/requests/request_details.dart'; import 'package:test_sa/views/widgets/device_trancfer/device_transfer_item.dart'; -import 'package:test_sa/views/widgets/gas_refill/gas_refill_item.dart'; import 'package:test_sa/views/widgets/loaders/lazy_loading.dart'; import 'package:test_sa/views/widgets/loaders/no_item_found.dart'; -import 'package:test_sa/views/widgets/requests/service_request_item.dart'; -import 'package:flutter/material.dart'; class DeviceTransferList extends StatelessWidget { final List items; final bool nextPage; diff --git a/lib/views/widgets/e_signature/e_signature.dart b/lib/views/widgets/e_signature/e_signature.dart index 72f9d653..1136a0a3 100644 --- a/lib/views/widgets/e_signature/e_signature.dart +++ b/lib/views/widgets/e_signature/e_signature.dart @@ -1,5 +1,3 @@ -import 'dart:convert'; - import 'package:flutter/foundation.dart'; import 'package:flutter/material.dart'; import 'package:signature/signature.dart'; @@ -11,7 +9,8 @@ class ESignature extends StatefulWidget { final String oldSignature; final Uint8List newSignature; final Function(Uint8List) onSaved; - const ESignature({Key key, this.oldSignature, this.onSaved, this.newSignature}) : super(key: key); + final Function(Uint8List) onChange; + const ESignature({Key key, this.oldSignature, this.onSaved,this.onChange, this.newSignature}) : super(key: key); @override State createState() => _ESignatureState(); @@ -104,6 +103,7 @@ class _ESignatureState extends State { const Spacer(), IconButton(onPressed: () async { signature = await _controller.toPngBytes(); + widget.onChange(signature); setState(() {}); }, icon: const Icon(Icons.check)), ], diff --git a/lib/views/widgets/equipment/auto_complete_devices_field.dart b/lib/views/widgets/equipment/auto_complete_devices_field.dart index 95952765..c11315f9 100644 --- a/lib/views/widgets/equipment/auto_complete_devices_field.dart +++ b/lib/views/widgets/equipment/auto_complete_devices_field.dart @@ -1,13 +1,12 @@ +import 'package:flutter/material.dart'; +import 'package:flutter_typeahead/flutter_typeahead.dart'; +import 'package:provider/provider.dart'; import 'package:test_sa/controllers/providers/api/devices_provider.dart'; import 'package:test_sa/controllers/providers/api/user_provider.dart'; import 'package:test_sa/controllers/providers/settings/setting_provider.dart'; import 'package:test_sa/models/device/device.dart'; import 'package:test_sa/views/app_style/colors.dart'; import 'package:test_sa/views/app_style/sizing.dart'; -import 'package:test_sa/views/widgets/loaders/loading_manager.dart'; -import 'package:flutter/material.dart'; -import 'package:flutter_typeahead/flutter_typeahead.dart'; -import 'package:provider/provider.dart'; class AutoCompleteDeviceField extends StatefulWidget { final Device initialValue; final int hospitalId; @@ -81,7 +80,7 @@ class _AutoCompleteDeviceFieldState extends State { itemBuilder: (context, device) { return ListTile( title: Text(device.serialNumber), - subtitle: Text(device.model+"/"+device.brand), + subtitle: Text("${device.modelDefinition.modelName}/${device.modelDefinition.manufacturerName}"), ); }, onSuggestionSelected: (device) { diff --git a/lib/views/widgets/equipment/auto_complete_models_field.dart b/lib/views/widgets/equipment/auto_complete_models_field.dart index 1c40a544..7f776b91 100644 --- a/lib/views/widgets/equipment/auto_complete_models_field.dart +++ b/lib/views/widgets/equipment/auto_complete_models_field.dart @@ -1,14 +1,12 @@ +import 'package:flutter/material.dart'; +import 'package:flutter_typeahead/flutter_typeahead.dart'; +import 'package:provider/provider.dart'; import 'package:test_sa/controllers/providers/api/devices_provider.dart'; import 'package:test_sa/controllers/providers/api/user_provider.dart'; import 'package:test_sa/controllers/providers/settings/setting_provider.dart'; -import 'package:test_sa/models/device/device.dart'; import 'package:test_sa/models/lookup.dart'; import 'package:test_sa/views/app_style/colors.dart'; import 'package:test_sa/views/app_style/sizing.dart'; -import 'package:test_sa/views/widgets/loaders/loading_manager.dart'; -import 'package:flutter/material.dart'; -import 'package:flutter_typeahead/flutter_typeahead.dart'; -import 'package:provider/provider.dart'; class AutoCompleteModelField extends StatefulWidget { final Lookup initialValue; final Function(Lookup) onPick; diff --git a/lib/views/widgets/equipment/device_button.dart b/lib/views/widgets/equipment/device_button.dart index 78617fc2..80c7194a 100644 --- a/lib/views/widgets/equipment/device_button.dart +++ b/lib/views/widgets/equipment/device_button.dart @@ -1,11 +1,11 @@ +import 'package:flutter/material.dart'; +import 'package:font_awesome_flutter/font_awesome_flutter.dart'; import 'package:test_sa/controllers/localization/localization.dart'; import 'package:test_sa/models/device/device.dart'; import 'package:test_sa/models/subtitle.dart'; import 'package:test_sa/views/app_style/colors.dart'; import 'package:test_sa/views/app_style/sizing.dart'; import 'package:test_sa/views/widgets/equipment/single_device_picker.dart'; -import 'package:flutter/material.dart'; -import 'package:font_awesome_flutter/font_awesome_flutter.dart'; class DeviceButton extends StatelessWidget { final Function(Device) onDevicePick; final Device device; @@ -56,18 +56,18 @@ class DeviceButton extends StatelessWidget { ): Expanded( child: ListTile( - title: Text("${_subtitle.sn} : " + device.serialNumber, + title: Text("${_subtitle.sn} : ${device.serialNumber}", style: Theme.of(context).textTheme.subtitle1, ), subtitle: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ Divider(color: Theme.of(context).textTheme.subtitle1.color,), - Text("${_subtitle.brand} : " + device.brand, + Text("${_subtitle.brand} : ${device.modelDefinition.manufacturerName}", style: Theme.of(context).textTheme.subtitle2, ), Divider(color: Theme.of(context).textTheme.subtitle1.color,), - Text("${_subtitle.model} : " + device.model, + Text("${_subtitle.model} : ${device.modelDefinition.modelName}", style: Theme.of(context).textTheme.subtitle2, ), ], diff --git a/lib/views/widgets/equipment/device_item.dart b/lib/views/widgets/equipment/device_item.dart index aaa3112d..0ead41ef 100644 --- a/lib/views/widgets/equipment/device_item.dart +++ b/lib/views/widgets/equipment/device_item.dart @@ -1,9 +1,9 @@ +import 'package:flutter/material.dart'; import 'package:test_sa/controllers/localization/localization.dart'; import 'package:test_sa/models/device/device.dart'; import 'package:test_sa/models/subtitle.dart'; import 'package:test_sa/views/app_style/colors.dart'; import 'package:test_sa/views/app_style/sizing.dart'; -import 'package:flutter/material.dart'; class DeviceItem extends StatelessWidget { final Device device; final Function(Device) onPressed; @@ -28,7 +28,7 @@ class DeviceItem extends StatelessWidget { onPressed(device); }, child: ListTile( - title: Text("${_subtitle.sn} : " + device.serialNumber, + title: Text("${_subtitle.sn} : ${device.serialNumber}", style: Theme.of(context).textTheme.headline6.copyWith( color: AColors.white ), @@ -38,13 +38,13 @@ class DeviceItem extends StatelessWidget { crossAxisAlignment: CrossAxisAlignment.start, children: [ Divider(color: Theme.of(context).scaffoldBackgroundColor,), - Text("${_subtitle.brand} : " + device.brand, + Text("${_subtitle.brand} : ${device.modelDefinition.manufacturerName}", style: Theme.of(context).textTheme.subtitle1.copyWith( color: AColors.white ), ), Divider(color: Theme.of(context).scaffoldBackgroundColor,), - Text("${_subtitle.model} : " + device.model, + Text("${_subtitle.model} : ${device.modelDefinition.modelName}", style: Theme.of(context).textTheme.subtitle1.copyWith( color: AColors.white ), diff --git a/lib/views/widgets/equipment/single_device_picker.dart b/lib/views/widgets/equipment/single_device_picker.dart index 031ab2c1..bf697540 100644 --- a/lib/views/widgets/equipment/single_device_picker.dart +++ b/lib/views/widgets/equipment/single_device_picker.dart @@ -1,3 +1,6 @@ +import 'package:flutter/material.dart'; +import 'package:fluttertoast/fluttertoast.dart'; +import 'package:provider/provider.dart'; import 'package:test_sa/controllers/localization/localization.dart'; import 'package:test_sa/controllers/providers/api/devices_provider.dart'; import 'package:test_sa/controllers/providers/api/user_provider.dart'; @@ -7,10 +10,6 @@ import 'package:test_sa/models/subtitle.dart'; import 'package:test_sa/views/widgets/equipment/device_item.dart'; import 'package:test_sa/views/widgets/loaders/loading_manager.dart'; import 'package:test_sa/views/widgets/loaders/no_item_found.dart'; -import 'package:test_sa/views/widgets/qr/scan_qr.dart'; -import 'package:flutter/material.dart'; -import 'package:fluttertoast/fluttertoast.dart'; -import 'package:provider/provider.dart'; import '../app_text_form_field.dart'; class SingleDevicePicker extends StatefulWidget { diff --git a/lib/views/widgets/gas_refill/gas_refill_item.dart b/lib/views/widgets/gas_refill/gas_refill_item.dart index e6ab7477..47af778b 100644 --- a/lib/views/widgets/gas_refill/gas_refill_item.dart +++ b/lib/views/widgets/gas_refill/gas_refill_item.dart @@ -1,20 +1,14 @@ +import 'package:flutter/cupertino.dart'; +import 'package:flutter/material.dart'; +import 'package:provider/provider.dart'; import 'package:test_sa/controllers/localization/localization.dart'; import 'package:test_sa/controllers/providers/api/user_provider.dart'; -import 'package:test_sa/models/enums/user_types.dart'; import 'package:test_sa/models/gas_refill/gas_refill_model.dart'; -import 'package:test_sa/models/service_request/service_request.dart'; import 'package:test_sa/models/subtitle.dart'; import 'package:test_sa/models/user.dart'; import 'package:test_sa/views/app_style/colors.dart'; import 'package:test_sa/views/app_style/sizing.dart'; -import 'package:test_sa/views/pages/user/requests/report/create_service_report.dart'; -import 'package:test_sa/views/pages/user/requests/report/future_service_report.dart'; -import 'package:test_sa/views/widgets/loaders/image_loader.dart'; import 'package:test_sa/views/widgets/requests/request_status.dart'; -import 'package:flutter/cupertino.dart'; -import 'package:flutter/material.dart'; -import 'package:intl/intl.dart'; -import 'package:provider/provider.dart'; class GasRefillItem extends StatelessWidget { final int index; final GasRefillModel item; diff --git a/lib/views/widgets/gas_refill/gas_refill_list.dart b/lib/views/widgets/gas_refill/gas_refill_list.dart index b54c2ee9..e25797d2 100644 --- a/lib/views/widgets/gas_refill/gas_refill_list.dart +++ b/lib/views/widgets/gas_refill/gas_refill_list.dart @@ -1,14 +1,11 @@ +import 'package:flutter/material.dart'; import 'package:test_sa/controllers/localization/localization.dart'; import 'package:test_sa/models/gas_refill/gas_refill_model.dart'; -import 'package:test_sa/models/service_request/service_request.dart'; import 'package:test_sa/models/subtitle.dart'; import 'package:test_sa/views/pages/user/gas_refill/gas_refill_details.dart'; -import 'package:test_sa/views/pages/user/requests/request_details.dart'; import 'package:test_sa/views/widgets/gas_refill/gas_refill_item.dart'; import 'package:test_sa/views/widgets/loaders/lazy_loading.dart'; import 'package:test_sa/views/widgets/loaders/no_item_found.dart'; -import 'package:test_sa/views/widgets/requests/service_request_item.dart'; -import 'package:flutter/material.dart'; class GasRefillList extends StatelessWidget { final List items; final bool nextPage; diff --git a/lib/views/widgets/gas_refill/gas_refill_update_details_item.dart b/lib/views/widgets/gas_refill/gas_refill_update_details_item.dart index dc41e11d..aa9804cb 100644 --- a/lib/views/widgets/gas_refill/gas_refill_update_details_item.dart +++ b/lib/views/widgets/gas_refill/gas_refill_update_details_item.dart @@ -3,7 +3,6 @@ import 'package:test_sa/controllers/localization/localization.dart'; import 'package:test_sa/controllers/validator/validator.dart'; import 'package:test_sa/models/gas_refill/gas_refill_details.dart'; import 'package:test_sa/models/subtitle.dart'; -import 'package:test_sa/views/app_style/colors.dart'; import 'package:test_sa/views/widgets/app_text_form_field.dart'; import 'package:test_sa/views/widgets/requests/info_row.dart'; import 'package:test_sa/views/widgets/titles/app_sub_title.dart'; diff --git a/lib/views/widgets/hospitals/hospital_auto_complete_field.dart b/lib/views/widgets/hospitals/hospital_auto_complete_field.dart index 68444be0..8091303c 100644 --- a/lib/views/widgets/hospitals/hospital_auto_complete_field.dart +++ b/lib/views/widgets/hospitals/hospital_auto_complete_field.dart @@ -1,3 +1,6 @@ +import 'package:flutter/material.dart'; +import 'package:flutter_typeahead/flutter_typeahead.dart'; +import 'package:provider/provider.dart'; import 'package:test_sa/controllers/localization/localization.dart'; import 'package:test_sa/controllers/providers/api/hospitals_provider.dart'; import 'package:test_sa/controllers/providers/settings/setting_provider.dart'; @@ -5,10 +8,6 @@ import 'package:test_sa/models/hospital.dart'; import 'package:test_sa/models/subtitle.dart'; import 'package:test_sa/views/app_style/colors.dart'; import 'package:test_sa/views/app_style/sizing.dart'; -import 'package:test_sa/views/widgets/hospitals/hospital_item.dart'; -import 'package:flutter/material.dart'; -import 'package:flutter_typeahead/flutter_typeahead.dart'; -import 'package:provider/provider.dart'; class HospitalAutoCompleteField extends StatefulWidget { final String initialValue; final Function(Hospital) onSearch; diff --git a/lib/views/widgets/hospitals/hospital_button.dart b/lib/views/widgets/hospitals/hospital_button.dart index 81c7d9e9..3d1f4bc0 100644 --- a/lib/views/widgets/hospitals/hospital_button.dart +++ b/lib/views/widgets/hospitals/hospital_button.dart @@ -1,11 +1,11 @@ +import 'package:flutter/material.dart'; +import 'package:font_awesome_flutter/font_awesome_flutter.dart'; import 'package:test_sa/controllers/localization/localization.dart'; import 'package:test_sa/models/hospital.dart'; import 'package:test_sa/models/subtitle.dart'; import 'package:test_sa/views/app_style/colors.dart'; import 'package:test_sa/views/app_style/sizing.dart'; import 'package:test_sa/views/widgets/hospitals/single_hospital_picker.dart'; -import 'package:flutter/material.dart'; -import 'package:font_awesome_flutter/font_awesome_flutter.dart'; class HospitalButton extends StatelessWidget { final Function(Hospital) onHospitalPick; final Hospital hospital; diff --git a/lib/views/widgets/hospitals/hospital_item.dart b/lib/views/widgets/hospitals/hospital_item.dart index 523dace6..3ee5b699 100644 --- a/lib/views/widgets/hospitals/hospital_item.dart +++ b/lib/views/widgets/hospitals/hospital_item.dart @@ -1,7 +1,7 @@ +import 'package:flutter/material.dart'; import 'package:test_sa/models/hospital.dart'; import 'package:test_sa/views/app_style/colors.dart'; import 'package:test_sa/views/app_style/sizing.dart'; -import 'package:flutter/material.dart'; class HospitalItem extends StatelessWidget { final Hospital hospital; final Function(Hospital) onPressed; diff --git a/lib/views/widgets/hospitals/single_hospital_picker.dart b/lib/views/widgets/hospitals/single_hospital_picker.dart index f2ee3c74..27ca0861 100644 --- a/lib/views/widgets/hospitals/single_hospital_picker.dart +++ b/lib/views/widgets/hospitals/single_hospital_picker.dart @@ -1,3 +1,5 @@ +import 'package:flutter/material.dart'; +import 'package:provider/provider.dart'; import 'package:test_sa/controllers/localization/localization.dart'; import 'package:test_sa/controllers/providers/api/hospitals_provider.dart'; import 'package:test_sa/controllers/providers/settings/setting_provider.dart'; @@ -6,8 +8,6 @@ import 'package:test_sa/models/subtitle.dart'; import 'package:test_sa/views/widgets/hospitals/hospital_item.dart'; import 'package:test_sa/views/widgets/loaders/loading_manager.dart'; import 'package:test_sa/views/widgets/loaders/no_item_found.dart'; -import 'package:flutter/material.dart'; -import 'package:provider/provider.dart'; import '../app_text_form_field.dart'; class SingleHospitalPicker extends StatefulWidget { diff --git a/lib/views/widgets/loaders/loading_manager.dart b/lib/views/widgets/loaders/loading_manager.dart index b0002ae1..d2a5273d 100644 --- a/lib/views/widgets/loaders/loading_manager.dart +++ b/lib/views/widgets/loaders/loading_manager.dart @@ -48,7 +48,7 @@ class _LoadingManagerState extends State { Subtitle subtitle = AppLocalization.of(context).subtitle; Widget placeHolder; // to load data if load not start - if(widget.isLoading == false && widget.stateCode == null){ + if(widget.isLoading != true && widget.stateCode == null){ WidgetsBinding.instance.addPostFrameCallback((timeStamp) { widget.onRefresh(); }); diff --git a/lib/views/widgets/notifications/notification_item.dart b/lib/views/widgets/notifications/notification_item.dart index e29cc3c4..f505b5d3 100644 --- a/lib/views/widgets/notifications/notification_item.dart +++ b/lib/views/widgets/notifications/notification_item.dart @@ -1,8 +1,8 @@ +import 'package:flutter/cupertino.dart'; +import 'package:flutter/material.dart'; import 'package:test_sa/models/app_notification.dart'; import 'package:test_sa/views/app_style/colors.dart'; import 'package:test_sa/views/app_style/sizing.dart'; -import 'package:flutter/cupertino.dart'; -import 'package:flutter/material.dart'; class NotificationItem extends StatelessWidget { final AppNotification notification; final Function(AppNotification) onPressed; diff --git a/lib/views/widgets/pentry/auto_complete_fields/auto_complete_devices_field.dart b/lib/views/widgets/pentry/auto_complete_fields/auto_complete_devices_field.dart index e516bb3c..bf18fd66 100644 --- a/lib/views/widgets/pentry/auto_complete_fields/auto_complete_devices_field.dart +++ b/lib/views/widgets/pentry/auto_complete_fields/auto_complete_devices_field.dart @@ -81,7 +81,7 @@ class _AutoCompleteDeviceNumberFieldState extends State { }, ), const SizedBox(height: 8,), - const ASubTitle("Status"), - // if(widget.enableValidate && widget.model.status == null) - // ASubTitle(subtitle.requiredWord,color: Colors.red,), - const SizedBox(height: 4,), - PentryStatusMenu( - initialValue: widget.model.status, - onSelect: (status){ - widget.model.status = status; - }, - ), + // const ASubTitle("Status"), + // // if(widget.enableValidate && widget.model.status == null) + // // ASubTitle(subtitle.requiredWord,color: Colors.red,), + // const SizedBox(height: 4,), + // PentryStatusMenu( + // initialValue: widget.model.status, + // onSelect: (status){ + // widget.model.status = status; + // }, + // ), const SizedBox(height: 8,), const ASubTitle("Actual Visit Date"), if(widget.enableValidate && widget.model.actualVisitDate == null) @@ -125,17 +124,25 @@ class _PentryInfoFormState extends State { }, ), const SizedBox(height: 8,), - const ASubTitle("Signature"), + const ASubTitle("Nurse Signature"), + ESignature( + oldSignature: widget.model.signatureNurse, + newSignature: widget.model.localNurseSignature, + onChange: (signature){ + if(signature == null || signature.isEmpty) {return;} + widget.model.localNurseSignature = signature; + widget.model.signatureNurse = "${DateTime.now().toIso8601String()}.png|${base64Encode(signature)}"; + }, + ), + const SizedBox(height: 8,), + const ASubTitle("Engineer Signature"), ESignature( - oldSignature: widget.model.signature, - newSignature: widget.model.localSignature, - onSaved: (signature){ - widget.model.localSignature = signature; - if(signature == null || signature.isEmpty) { - widget.model.signature = null; - return; - } - widget.model.signature = "${DateTime.now().toIso8601String()}.png|${base64Encode(signature)}"; + oldSignature: widget.model.signatureEngineer, + newSignature: widget.model.localNurseSignature, + onChange: (signature){ + if(signature == null || signature.isEmpty) {return;} + widget.model.localNurseSignature = signature; + widget.model.signatureEngineer = "${DateTime.now().toIso8601String()}.png|${base64Encode(signature)}"; }, ), const SizedBox(height: 8,), diff --git a/lib/views/widgets/pentry/pentry_pm_kit_form.dart b/lib/views/widgets/pentry/pentry_pm_kit_form.dart index e0345597..c9194466 100644 --- a/lib/views/widgets/pentry/pentry_pm_kit_form.dart +++ b/lib/views/widgets/pentry/pentry_pm_kit_form.dart @@ -3,7 +3,6 @@ import 'package:test_sa/controllers/localization/localization.dart'; import 'package:test_sa/models/lookup.dart'; import 'package:test_sa/models/pantry/pm_kit.dart'; import 'package:test_sa/views/app_style/sizing.dart'; -import 'package:test_sa/views/widgets/app_text_form_field.dart'; import 'package:test_sa/views/widgets/buttons/app_button.dart'; import 'package:test_sa/views/widgets/buttons/app_small_button.dart'; import 'package:test_sa/views/widgets/parts/auto_complete_parts_field.dart'; diff --git a/lib/views/widgets/search/service_request_search_bar.dart b/lib/views/widgets/search/service_request_search_bar.dart index 5bb981bd..a3f8b96d 100644 --- a/lib/views/widgets/search/service_request_search_bar.dart +++ b/lib/views/widgets/search/service_request_search_bar.dart @@ -9,11 +9,9 @@ import 'package:test_sa/views/widgets/buttons/app_button.dart'; import 'package:test_sa/views/widgets/buttons/app_small_button.dart'; import 'package:test_sa/views/widgets/hospitals/hospital_auto_complete_field.dart'; import 'package:test_sa/views/widgets/status/service_request/service_request_status_mune.dart'; -import 'package:test_sa/views/widgets/status/service_request/service_request_types_mune.dart'; import 'package:test_sa/views/widgets/titles/app_sub_title.dart'; import '../app_text_form_field.dart'; -import 'filter_item.dart'; class ServiceRequestsSearchDialog extends StatefulWidget { final ServiceRequestSearch initialSearchValue; final bool expandedSearch; diff --git a/lib/views/widgets/search/visits_search_bar.dart b/lib/views/widgets/search/visits_search_bar.dart index b745fce2..77172dbb 100644 --- a/lib/views/widgets/search/visits_search_bar.dart +++ b/lib/views/widgets/search/visits_search_bar.dart @@ -15,7 +15,6 @@ import 'package:test_sa/views/widgets/status/pentry/pentry_visit_status_mune.dar import 'package:test_sa/views/widgets/titles/app_sub_title.dart'; import '../app_text_form_field.dart'; -import 'filter_item.dart'; class VisitsSearchDialog extends StatefulWidget { final VisitsSearch initialSearchValue; final bool expandedSearch; diff --git a/lib/views/widgets/speech_to_text/speech_to_text.dart b/lib/views/widgets/speech_to_text/speech_to_text.dart index 03e2eda1..59cabf8a 100644 --- a/lib/views/widgets/speech_to_text/speech_to_text.dart +++ b/lib/views/widgets/speech_to_text/speech_to_text.dart @@ -1,15 +1,12 @@ -import 'package:test_sa/controllers/providers/settings/setting_provider.dart'; -import 'package:test_sa/views/widgets/buttons/app_icon_button.dart'; -import 'package:test_sa/views/widgets/buttons/app_icon_button2.dart'; -import 'package:test_sa/views/widgets/titles/app_sub_title.dart'; import 'package:flutter/material.dart'; import 'package:fluttertoast/fluttertoast.dart'; import 'package:provider/provider.dart'; import 'package:speech_to_text/speech_recognition_error.dart'; import 'package:speech_to_text/speech_recognition_result.dart'; import 'package:speech_to_text/speech_to_text.dart'; - -import '../app_text_form_field.dart'; +import 'package:test_sa/controllers/providers/settings/setting_provider.dart'; +import 'package:test_sa/views/widgets/buttons/app_icon_button2.dart'; +import 'package:test_sa/views/widgets/titles/app_sub_title.dart'; class SpeechToTextButton extends StatefulWidget { final TextEditingController controller; diff --git a/lib/views/widgets/status/employee/single_type_menu.dart b/lib/views/widgets/status/employee/single_type_menu.dart index 4ee21b7d..ccb46c0a 100644 --- a/lib/views/widgets/status/employee/single_type_menu.dart +++ b/lib/views/widgets/status/employee/single_type_menu.dart @@ -1,6 +1,5 @@ import 'package:flutter/material.dart'; import 'package:test_sa/models/engineer.dart'; -import 'package:test_sa/models/lookup.dart'; import 'package:test_sa/views/app_style/colors.dart'; import 'package:test_sa/views/app_style/sizing.dart'; class SingleEngineerMenu extends StatefulWidget { diff --git a/lib/views/widgets/status/gas_refill/gas_cylinder_type.dart b/lib/views/widgets/status/gas_refill/gas_cylinder_type.dart index 7402e3a7..9b2c264d 100644 --- a/lib/views/widgets/status/gas_refill/gas_cylinder_type.dart +++ b/lib/views/widgets/status/gas_refill/gas_cylinder_type.dart @@ -1,6 +1,5 @@ import 'package:flutter/material.dart'; import 'package:provider/provider.dart'; -import 'package:test_sa/controllers/providers/api/status_drop_down/gas_refill/gas_cylinder_size_provider.dart'; import 'package:test_sa/controllers/providers/api/status_drop_down/gas_refill/gas_cylinder_type_provider.dart'; import 'package:test_sa/controllers/providers/api/user_provider.dart'; import 'package:test_sa/controllers/providers/settings/setting_provider.dart'; diff --git a/lib/views/widgets/status/report/service_report_status.dart b/lib/views/widgets/status/report/service_report_status.dart index c0f0633e..12adf5d3 100644 --- a/lib/views/widgets/status/report/service_report_status.dart +++ b/lib/views/widgets/status/report/service_report_status.dart @@ -24,43 +24,46 @@ class _ServiceReportStatusMenuState extends State { bool firstTime = true; @override Widget build(BuildContext context) { - SettingProvider _settingProvider = Provider.of(context); - UserProvider _userProvider = Provider.of(context); - ServiceReportStatusProvider _menuProvider = Provider.of(context); - ServiceReportLastCallsProvider _callsLastSituationsProvider = Provider.of(context,listen: false); + SettingProvider settingProvider = Provider.of(context); + UserProvider userProvider = Provider.of(context); + ServiceReportStatusProvider menuProvider = Provider.of(context); + ServiceReportLastCallsProvider callsLastSituationsProvider = Provider.of(context); if(firstTime){ - _callsLastSituationsProvider.reset(); + callsLastSituationsProvider.reset(); firstTime = false; } return LoadingManager( - isLoading: _menuProvider.isLoading == true, - isFailedLoading: _menuProvider.statuses == null, - stateCode: _menuProvider.stateCode, + isLoading: menuProvider.isLoading == true || callsLastSituationsProvider.isLoading == true, + isFailedLoading: menuProvider.statuses == null || callsLastSituationsProvider.calls == null, + stateCode: menuProvider.stateCode == null || callsLastSituationsProvider.stateCode == null ? null: + max(menuProvider.stateCode ?? 0,callsLastSituationsProvider.stateCode ?? 0), onRefresh: () async { - if(_menuProvider.stateCode == null){ - _menuProvider.reset(); - await _menuProvider.getTypes( - user: _userProvider.user, - host: _settingProvider.host + await callsLastSituationsProvider.getCalls( + user: userProvider.user, + host: settingProvider.host, + serviceStatus: widget.report.status?.id + ); + if(menuProvider.stateCode == null){ + menuProvider.reset(); + await menuProvider.getTypes( + user: userProvider.user, + host: settingProvider.host ); + setState(() {}); } - _callsLastSituationsProvider.getCalls( - user: _userProvider.user, - host: _settingProvider.host, - serviceStatus: widget.report.status?.id.toString() - ); }, child: SingleStatusMenu( - statuses: _menuProvider.statuses, + statuses: menuProvider.statuses, initialStatus: widget.report.status, onSelect: (status){ - // _callsLastSituationsProvider.getCalls( - // user: _userProvider.user, - // host: _settingProvider.host, - // serviceStatus: status.id.toString() - // ); - //widget.report.callLastSituation = null; + widget.report.callLastSituation = null; + callsLastSituationsProvider.getCalls( + user: userProvider.user, + host: settingProvider.host, + serviceStatus: status.id + ); + widget.onSelect(status); }, ) diff --git a/lib/views/widgets/status/report/service_status.dart b/lib/views/widgets/status/report/service_status.dart index 37eb554e..3c4eb794 100644 --- a/lib/views/widgets/status/report/service_status.dart +++ b/lib/views/widgets/status/report/service_status.dart @@ -6,11 +6,11 @@ import 'package:test_sa/controllers/providers/settings/setting_provider.dart'; import 'package:test_sa/models/lookup.dart'; import 'package:test_sa/views/widgets/loaders/loading_manager.dart'; import 'package:test_sa/views/widgets/status/single_status_menu.dart'; -class ServiceStatusMenu extends StatelessWidget { +class ServiceAssetTypeMenu extends StatelessWidget { final Function(Lookup) onSelect; final Lookup initialValue; - const ServiceStatusMenu({Key key, this.onSelect, this.initialValue}) : super(key: key); + const ServiceAssetTypeMenu({Key key, this.onSelect, this.initialValue}) : super(key: key); @override Widget build(BuildContext context) { SettingProvider _settingProvider = Provider.of(context); diff --git a/lib/views/widgets/status/service_request/service_request_status_mune.dart b/lib/views/widgets/status/service_request/service_request_status_mune.dart index b856f6c6..8ac8d1c5 100644 --- a/lib/views/widgets/status/service_request/service_request_status_mune.dart +++ b/lib/views/widgets/status/service_request/service_request_status_mune.dart @@ -1,9 +1,6 @@ import 'package:flutter/material.dart'; import 'package:provider/provider.dart'; -import 'package:test_sa/controllers/providers/api/status_drop_down/report/service_report_priority_provider.dart'; import 'package:test_sa/controllers/providers/api/status_drop_down/service_reqest/service_request_status_provider.dart'; -import 'package:test_sa/controllers/providers/api/status_drop_down/service_reqest/service_request_through_provider.dart'; -import 'package:test_sa/controllers/providers/api/status_drop_down/service_reqest/service_request_type_provider.dart'; import 'package:test_sa/controllers/providers/api/user_provider.dart'; import 'package:test_sa/controllers/providers/settings/setting_provider.dart'; import 'package:test_sa/models/lookup.dart'; diff --git a/lib/views/widgets/status/service_request/service_request_through_mune.dart b/lib/views/widgets/status/service_request/service_request_through_mune.dart index 4612250a..81a1c5b0 100644 --- a/lib/views/widgets/status/service_request/service_request_through_mune.dart +++ b/lib/views/widgets/status/service_request/service_request_through_mune.dart @@ -1,6 +1,5 @@ import 'package:flutter/material.dart'; import 'package:provider/provider.dart'; -import 'package:test_sa/controllers/providers/api/status_drop_down/report/service_report_priority_provider.dart'; import 'package:test_sa/controllers/providers/api/status_drop_down/service_reqest/service_request_through_provider.dart'; import 'package:test_sa/controllers/providers/api/user_provider.dart'; import 'package:test_sa/controllers/providers/settings/setting_provider.dart'; diff --git a/lib/views/widgets/status/service_request/service_request_types_mune.dart b/lib/views/widgets/status/service_request/service_request_types_mune.dart index 223a5725..1cba8f6a 100644 --- a/lib/views/widgets/status/service_request/service_request_types_mune.dart +++ b/lib/views/widgets/status/service_request/service_request_types_mune.dart @@ -1,7 +1,5 @@ import 'package:flutter/material.dart'; import 'package:provider/provider.dart'; -import 'package:test_sa/controllers/providers/api/status_drop_down/report/service_report_priority_provider.dart'; -import 'package:test_sa/controllers/providers/api/status_drop_down/service_reqest/service_request_through_provider.dart'; import 'package:test_sa/controllers/providers/api/status_drop_down/service_reqest/service_request_type_provider.dart'; import 'package:test_sa/controllers/providers/api/user_provider.dart'; import 'package:test_sa/controllers/providers/settings/setting_provider.dart'; diff --git a/lib/views/widgets/status/single_status_menu.dart b/lib/views/widgets/status/single_status_menu.dart index fdf2b78d..bfe4de6d 100644 --- a/lib/views/widgets/status/single_status_menu.dart +++ b/lib/views/widgets/status/single_status_menu.dart @@ -23,12 +23,19 @@ class _SingleStatusMenuState extends State { @override void didUpdateWidget(covariant SingleStatusMenu oldWidget) { - if(widget.initialStatus != null && widget.initialStatus.value != null){ - _selectedStatus = widget.statuses?.firstWhere( + if(widget.initialStatus != null ){ + final result = widget.statuses?.where( (element) { return element == widget.initialStatus; }); - widget.onSelect(_selectedStatus); + if(result.isNotEmpty) { + _selectedStatus =result.first; + }else{ + _selectedStatus =null; + } + if(widget.initialStatus.id != _selectedStatus.id) { + widget.onSelect(_selectedStatus); + } } else { _selectedStatus = null; } @@ -37,12 +44,15 @@ class _SingleStatusMenuState extends State { @override void initState() { - if(widget.initialStatus != null && widget.initialStatus.value != null){ - _selectedStatus = widget.statuses?.firstWhere( + if(widget.initialStatus != null){ + final result = widget.statuses?.where( (element) { return element == widget.initialStatus; }); - widget.onSelect(_selectedStatus); + if(result.isNotEmpty) _selectedStatus = result.first; + if(widget.initialStatus.id != _selectedStatus.id) { + widget.onSelect(_selectedStatus); + } } super.initState(); From 35ae5e9002421f4e2ff7df09756f33e6671292e8 Mon Sep 17 00:00:00 2001 From: MaximusAshraf <50173497+MaximusAshraf@users.noreply.github.com> Date: Thu, 4 May 2023 15:35:41 +0300 Subject: [PATCH 009/181] handling null values - in get service requests and create device transfer --- lib/models/service_request/service_request.dart | 12 ++++++++---- .../device_transfer/request_device_transfer.dart | 2 +- pubspec.yaml | 2 +- 3 files changed, 10 insertions(+), 6 deletions(-) diff --git a/lib/models/service_request/service_request.dart b/lib/models/service_request/service_request.dart index eea5d244..434f8de7 100644 --- a/lib/models/service_request/service_request.dart +++ b/lib/models/service_request/service_request.dart @@ -99,16 +99,20 @@ class ServiceRequest{ engineerName: parsedJson["assignedEmployee"] == null ? null : parsedJson["assignedEmployee"]["name"], hospitalId: parsedJson["asset"]["site"]["id"], - reportID: parsedJson["workOrder"]["workOrderId"], + reportID: parsedJson["workOrder"] != null ? + parsedJson["workOrder"]["workOrderId"] : null, viewReport: parsedJson["workOrder"] != null, deviceModel: parsedJson["asset"]["modelDefinition"]["modelName"], engineerMobile: parsedJson["assignedEmployee"] == null ? null : parsedJson["assignedEmployee"]["phone"], - faultDescription: parsedJson["workOrder"]["faultDescription"], - jobSheetNumber: parsedJson["workOrder"]["jobSheetNumber"], + faultDescription: parsedJson["workOrder"] != null ? + parsedJson["workOrder"]["faultDescription"] : null, + jobSheetNumber: parsedJson["workOrder"] != null ? + parsedJson["workOrder"]["jobSheetNumber"] :null, visitDate: DateTime.tryParse(parsedJson["visitDate"] ?? "").toString().split(" ").first, nextVisitDate: DateTime.tryParse(parsedJson["nextVisitDate"] ?? ""), - workPerformed: parsedJson["workOrder"]["workPerformed"], + workPerformed: parsedJson["workOrder"] != null ? + parsedJson["workOrder"]["workPerformed"] : null, device: Device.fromJson(parsedJson["asset"]) ); } diff --git a/lib/views/pages/device_transfer/request_device_transfer.dart b/lib/views/pages/device_transfer/request_device_transfer.dart index 30c9310a..cd55f5b2 100644 --- a/lib/views/pages/device_transfer/request_device_transfer.dart +++ b/lib/views/pages/device_transfer/request_device_transfer.dart @@ -57,7 +57,7 @@ class _RequestDeviceTransferState extends State { _isLoading = true; setState(() {}); - _formModel.sender.client.id = _userProvider.user.hospital?.id; + _formModel.sender?.client?.id = _userProvider.user?.hospital?.id; int status = await _deviceTransferProvider.createRequest( user: _userProvider.user, host: _settingProvider.host, diff --git a/pubspec.yaml b/pubspec.yaml index 6cf0797c..dd4f5b99 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -15,7 +15,7 @@ publish_to: 'none' # Remove this line if you wish to publish to pub.dev # In iOS, build-name is used as CFBundleShortVersionString while build-number used as CFBundleVersion. # Read more about iOS versioning at # https://developer.apple.com/library/archive/documentation/General/Reference/InfoPlistKeyReference/Articles/CoreFoundationKeys.html -version: 0.7.4+1 +version: 1.0.0+1 environment: sdk: ">=2.7.0 <3.0.0" From c5b5a8011a3e366a0ab0bf092b01cbf4881769f1 Mon Sep 17 00:00:00 2001 From: MaximusAshraf <50173497+MaximusAshraf@users.noreply.github.com> Date: Sat, 6 May 2023 10:40:17 +0300 Subject: [PATCH 010/181] active api auth --- lib/controllers/api_routes/api_manager.dart | 12 +++++++++++- lib/controllers/providers/api/user_provider.dart | 2 ++ lib/views/pages/user/land_page.dart | 1 + 3 files changed, 14 insertions(+), 1 deletion(-) diff --git a/lib/controllers/api_routes/api_manager.dart b/lib/controllers/api_routes/api_manager.dart index 41728339..ece2395a 100644 --- a/lib/controllers/api_routes/api_manager.dart +++ b/lib/controllers/api_routes/api_manager.dart @@ -5,20 +5,30 @@ import 'package:flutter/cupertino.dart'; import 'package:fluttertoast/fluttertoast.dart'; import 'package:http/http.dart' as http; import 'package:http/http.dart'; +import 'package:test_sa/models/user.dart'; class ApiManager { ApiManager._(); - final Map _headers = {'Content-Type': 'application/json',}; + Map get _headers => { + 'Content-Type': 'application/json', + if(user != null) 'Authorization': 'Bearer ${user.token}', + }; static ApiManager instance = ApiManager._(); + User user; + Future get( String url, {Map headers,} ) async{ + headers ??= {}; + + headers.addAll(_headers); + Uri _url = Uri.parse(url); // print(_url); http.Response response = await http.get(_url,headers: headers); diff --git a/lib/controllers/providers/api/user_provider.dart b/lib/controllers/providers/api/user_provider.dart index 565408d5..8adcd357 100644 --- a/lib/controllers/providers/api/user_provider.dart +++ b/lib/controllers/providers/api/user_provider.dart @@ -11,6 +11,7 @@ class UserProvider extends ChangeNotifier{ //reset provider data void reset(){ _user = null; + ApiManager.instance.user = user; _loading = false; } @@ -20,6 +21,7 @@ class UserProvider extends ChangeNotifier{ User get user => _user; set user(User user) { _user = user; + ApiManager.instance.user = user; notifyListeners(); } diff --git a/lib/views/pages/user/land_page.dart b/lib/views/pages/user/land_page.dart index e5b612e9..6982b955 100644 --- a/lib/views/pages/user/land_page.dart +++ b/lib/views/pages/user/land_page.dart @@ -238,6 +238,7 @@ class _LandPageState extends State { _regularVisitsProvider.reset(); _preventiveMaintenanceVisitsProvider.reset(); _settingProvider.resetSettings(); + _userProvider.reset(); Navigator.of(context).pop(); } }, From fab1bdf65d0c82f25619569a6bd843b0c5893fc2 Mon Sep 17 00:00:00 2001 From: MaximusAshraf <50173497+MaximusAshraf@users.noreply.github.com> Date: Sat, 6 May 2023 10:57:53 +0300 Subject: [PATCH 011/181] auth edits --- lib/controllers/api_routes/api_manager.dart | 9 +++++---- lib/controllers/providers/api/user_provider.dart | 2 +- lib/models/user.dart | 8 ++++---- lib/views/pages/user/land_page.dart | 2 +- 4 files changed, 11 insertions(+), 10 deletions(-) diff --git a/lib/controllers/api_routes/api_manager.dart b/lib/controllers/api_routes/api_manager.dart index ece2395a..1a0a125c 100644 --- a/lib/controllers/api_routes/api_manager.dart +++ b/lib/controllers/api_routes/api_manager.dart @@ -30,7 +30,8 @@ class ApiManager { headers.addAll(_headers); Uri _url = Uri.parse(url); -// print(_url); + // print(_url); + // print(headers); http.Response response = await http.get(_url,headers: headers); if(jsonDecode(response.body) is Map){ final message = jsonDecode(response.body)["message"]; @@ -54,9 +55,9 @@ class ApiManager { headers.addAll(_headers); Uri _url = Uri.parse(url); -// print(_url); -// print(headers); - log(json.encode(body)); + // print(_url); + // print(headers); + // log(json.encode(body)); var request = http.Request('POST', _url); request.body = json.encode(body); request.headers.addAll(headers); diff --git a/lib/controllers/providers/api/user_provider.dart b/lib/controllers/providers/api/user_provider.dart index 8adcd357..35634708 100644 --- a/lib/controllers/providers/api/user_provider.dart +++ b/lib/controllers/providers/api/user_provider.dart @@ -59,7 +59,7 @@ class UserProvider extends ChangeNotifier{ if(response.statusCode >= 200 && response.statusCode < 300) { // client's request was successfully received _user = User.fromJson(jsonDecode(response.body)); - + ApiManager.instance.user = _user; return response.statusCode; } notifyListeners(); diff --git a/lib/models/user.dart b/lib/models/user.dart index 246ed717..aea639a8 100644 --- a/lib/models/user.dart +++ b/lib/models/user.dart @@ -103,10 +103,10 @@ class User{ id: parsedJson["userID"], userName: parsedJson["username"], email: parsedJson["email"], - // hospital: Hospital( - // id: parsedJson["client_id"], - // name: parsedJson["client_name"] - // ), + hospital: Hospital( + id: parsedJson["client_id"], + name: parsedJson["client_name"] + ), department: Department( id: parsedJson["department_id"], name: parsedJson["department_name"], diff --git a/lib/views/pages/user/land_page.dart b/lib/views/pages/user/land_page.dart index 6982b955..e89430c6 100644 --- a/lib/views/pages/user/land_page.dart +++ b/lib/views/pages/user/land_page.dart @@ -154,7 +154,7 @@ class _LandPageState extends State { mainAxisSpacing: 5, childAspectRatio: 1.15, children: [ - if (_userProvider.user.type == UsersTypes.normal_user) + if (_userProvider.user?.type == UsersTypes.normal_user) LandPageItem( text: _subtitle.newServiceRequest, icon: FontAwesomeIcons.tools, From 534aab3ceb673f2edf697d59fca900cab5428d4f Mon Sep 17 00:00:00 2001 From: Sikander Saleem Date: Mon, 8 May 2023 15:24:22 +0300 Subject: [PATCH 012/181] latest code merge changes --- lib/models/lookup.dart | 67 + lib/views/pages/user/land_page.dart | 3 +- .../auto_complete_devices_field.dart | 1 + .../widgets/equipment/device_button.dart | 5 +- .../parts/auto_complete_parts_field.dart | 1 - .../service_request_update_dialog.dart | 56 +- lib/views/widgets/visits/visit_item.dart | 28 +- pubspec.lock | 1167 ----------------- 8 files changed, 113 insertions(+), 1215 deletions(-) delete mode 100644 pubspec.lock diff --git a/lib/models/lookup.dart b/lib/models/lookup.dart index e69de29b..c523c489 100644 --- a/lib/models/lookup.dart +++ b/lib/models/lookup.dart @@ -0,0 +1,67 @@ +class Lookup{ + + //old name label + final String name; + // old name key + final int value; + final int id; + + const Lookup({ + this.name, + this.value, + this.id, + }); + + @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; + + toMap(){ + return { + "id": id, + "name": name, + "value": value + }; + } + + factory Lookup.fromStatus(Lookup old){ + if(old == null) return null; + return Lookup( + name: old.name, + id: old.id, + value: old.value, + ); + } + + factory Lookup.fromJson(Map parsedJson){ + if(parsedJson == null) return null; + return Lookup( + name: parsedJson["name"], + id: parsedJson["id"], + value: parsedJson["value"], + ); + } + +// factory Lookup.fromJson(Map parsedJson){ +// if(parsedJson["id"] == null && parsedJson["uid"] == null) return null; +// return Lookup( +// name: parsedJson["value"], +// id: parsedJson["id"] is int +// ? parsedJson["id"] +// : int.tryParse(parsedJson["id"] ?? parsedJson["uid"]), +// ); +// } + +// factory Lookup.fromIntIdJson(Map parsedJson){ +// return Lookup( +// name: parsedJson["value"], +// id: parsedJson["id"], +// ); +// } +} \ No newline at end of file diff --git a/lib/views/pages/user/land_page.dart b/lib/views/pages/user/land_page.dart index eb4a57e6..190b365c 100644 --- a/lib/views/pages/user/land_page.dart +++ b/lib/views/pages/user/land_page.dart @@ -26,6 +26,7 @@ import 'package:test_sa/views/pages/device_transfer/request_device_transfer.dart import 'package:test_sa/views/pages/device_transfer/track_device_transfer.dart'; import 'package:test_sa/views/pages/user/gas_refill/request_gas_refill.dart'; import 'package:test_sa/views/pages/user/gas_refill/track_gas_refill.dart'; +import 'package:test_sa/views/pages/user/notifications/notifications_page.dart'; import 'package:test_sa/views/pages/user/requests/create_request.dart'; import 'package:test_sa/views/pages/user/visits/regular_visits_page.dart'; import 'package:test_sa/views/widgets/buttons/app_back_button.dart'; @@ -284,7 +285,7 @@ class _LandPageState extends State { ), 12.width, Text( - _userProvider.user.userName, + _userProvider.user?.userName ?? "??", style: Theme.of(context).textTheme.headline6.copyWith( fontWeight: FontWeight.w600, ), diff --git a/lib/views/widgets/equipment/auto_complete_devices_field.dart b/lib/views/widgets/equipment/auto_complete_devices_field.dart index 85abcaec..3c6fbc99 100644 --- a/lib/views/widgets/equipment/auto_complete_devices_field.dart +++ b/lib/views/widgets/equipment/auto_complete_devices_field.dart @@ -7,6 +7,7 @@ import 'package:test_sa/controllers/providers/settings/setting_provider.dart'; import 'package:test_sa/models/device/device.dart'; import 'package:test_sa/views/app_style/colors.dart'; import 'package:test_sa/views/app_style/sizing.dart'; +import 'package:test_sa/views/widgets/loaders/loading_manager.dart'; class AutoCompleteDeviceField extends StatefulWidget { final Device initialValue; final int hospitalId; diff --git a/lib/views/widgets/equipment/device_button.dart b/lib/views/widgets/equipment/device_button.dart index 0177179e..824547d2 100644 --- a/lib/views/widgets/equipment/device_button.dart +++ b/lib/views/widgets/equipment/device_button.dart @@ -6,6 +6,7 @@ import 'package:test_sa/models/subtitle.dart'; import 'package:test_sa/views/app_style/colors.dart'; import 'package:test_sa/views/app_style/sizing.dart'; import 'package:test_sa/views/widgets/equipment/single_device_picker.dart'; + class DeviceButton extends StatelessWidget { final Function(Device) onDevicePick; final Device device; @@ -59,14 +60,14 @@ class DeviceButton extends StatelessWidget { color: Theme.of(context).textTheme.subtitle1.color, ), Text( - "${_subtitle.brand} : " + device.brand, + "${_subtitle.brand} : ${device.modelDefinition.manufacturerName}", style: Theme.of(context).textTheme.subtitle2, ), Divider( color: Theme.of(context).textTheme.subtitle1.color, ), Text( - "${_subtitle.model} : " + device.model, + "${_subtitle.model} : ${device.modelDefinition.modelName}", style: Theme.of(context).textTheme.subtitle2, ), ], diff --git a/lib/views/widgets/parts/auto_complete_parts_field.dart b/lib/views/widgets/parts/auto_complete_parts_field.dart index 2f4582f6..893d2f91 100644 --- a/lib/views/widgets/parts/auto_complete_parts_field.dart +++ b/lib/views/widgets/parts/auto_complete_parts_field.dart @@ -12,7 +12,6 @@ class AutoCompletePartsField extends StatefulWidget { final String initialValue; final bool clearAfterPick; final Function(Part) onPick; - final bool clearAfterPick; const AutoCompletePartsField({Key key, this.initialValue, this.onPick, this.clearAfterPick = true}) : super(key: key); diff --git a/lib/views/widgets/requests/service_request_update_dialog.dart b/lib/views/widgets/requests/service_request_update_dialog.dart index 6b5ce0d8..e2680384 100644 --- a/lib/views/widgets/requests/service_request_update_dialog.dart +++ b/lib/views/widgets/requests/service_request_update_dialog.dart @@ -14,24 +14,20 @@ import 'package:test_sa/views/app_style/sizing.dart'; import 'package:test_sa/views/widgets/buttons/app_small_button.dart'; import 'package:test_sa/views/widgets/date_and_time/date_picker.dart'; import 'package:test_sa/views/widgets/status/employee/assigned_to_mune.dart'; -import 'package:test_sa/views/widgets/hospitals/hospital_auto_complete_field.dart'; -import 'package:flutter/material.dart'; -import 'package:test_sa/views/widgets/status/employee/employee_mune.dart'; - -import '../app_text_form_field.dart'; class ServiceRequestsUpdateDialog extends StatefulWidget { final ServiceRequest request; + const ServiceRequestsUpdateDialog({ - Key key, this.request, + Key key, + this.request, }) : super(key: key); + @override State createState() => _ServiceRequestsUpdateDialogState(); } -class _ServiceRequestsUpdateDialogState extends State - with TickerProviderStateMixin{ - +class _ServiceRequestsUpdateDialogState extends State with TickerProviderStateMixin { DateTime _dateTime; Lookup _employee; Subtitle _subtitle; @@ -42,7 +38,7 @@ class _ServiceRequestsUpdateDialogState extends State _formKey = GlobalKey(); _update() async { - if(_dateTime == null && _employee == null){ + if (_dateTime == null && _employee == null) { Fluttertoast.showToast( msg: _subtitle.noDateFound, ); @@ -59,13 +55,8 @@ class _ServiceRequestsUpdateDialogState extends State(context,listen: false); - _settingProvider = Provider.of(context,listen: false); - _serviceRequestsProvider = Provider.of(context,listen: false); - return Column( + _subtitle = AppLocalization.of(context).subtitle; + _userProvider = Provider.of(context, listen: false); + _settingProvider = Provider.of(context, listen: false); + _serviceRequestsProvider = Provider.of(context, listen: false); + return Column( mainAxisSize: MainAxisSize.min, children: [ SizedBox( - // height: MediaQuery.of(context).size.height / 1.2, + // height: MediaQuery.of(context).size.height / 1.2, child: Form( key: _formKey, child: Padding( @@ -99,18 +90,19 @@ class _ServiceRequestsUpdateDialogState extends State=2.18.0 <3.0.0" - flutter: ">=3.3.0" From 4f37bb9476e79a4f08dfa2eadbbd038d824c3009 Mon Sep 17 00:00:00 2001 From: Sikander Saleem Date: Tue, 9 May 2023 10:22:52 +0300 Subject: [PATCH 013/181] improvements. --- lib/controllers/api_routes/urls.dart | 4 +- .../providers/api/notifications_provider.dart | 2 +- lib/views/pages/user/land_page.dart | 14 +-- .../parts/auto_complete_parts_field.dart | 102 ++++++++---------- 4 files changed, 55 insertions(+), 67 deletions(-) diff --git a/lib/controllers/api_routes/urls.dart b/lib/controllers/api_routes/urls.dart index 95b6027c..cf4849fd 100644 --- a/lib/controllers/api_routes/urls.dart +++ b/lib/controllers/api_routes/urls.dart @@ -1,9 +1,9 @@ class URLs{ URLs._(); static const host2 = "http://194.163.164.213/atoms/api"; - // static const host1 = "https://atomsdev.hmg.com/api"; // uat url + static const host1 = "https://atomsuat.hmg.com"; // uat url - static const host1 = "http://109.123.243.118:9000"; + // static const host1 = "http://109.123.243.118:9000"; static String _baseUrl = "$_host/mobile"; diff --git a/lib/controllers/providers/api/notifications_provider.dart b/lib/controllers/providers/api/notifications_provider.dart index 0f216a0a..14afc4b7 100644 --- a/lib/controllers/providers/api/notifications_provider.dart +++ b/lib/controllers/providers/api/notifications_provider.dart @@ -53,7 +53,7 @@ class NotificationsProvider extends ChangeNotifier{ // userId = 397.toString(); // testing id to view data try{ response = await get( - Uri.parse(host+URLs.getNotifications + Uri.parse(URLs.getNotifications +"?uid=${user.id}" "&token=${user.token}" "&page=${(notifications?.length ?? 0) ~/pageItemNumber}"), diff --git a/lib/views/pages/user/land_page.dart b/lib/views/pages/user/land_page.dart index 190b365c..41c4826c 100644 --- a/lib/views/pages/user/land_page.dart +++ b/lib/views/pages/user/land_page.dart @@ -330,13 +330,13 @@ class _LandPageState extends State { ), ], ), - DrawerItem( - icon: Icons.notifications, - title: _subtitle.notifications, - onPressed: () { - Navigator.of(context).pushNamed(NotificationsPage.id); - }, - ), + // DrawerItem( + // icon: Icons.notifications, + // title: _subtitle.notifications, + // onPressed: () { + // Navigator.of(context).pushNamed(NotificationsPage.id); + // }, + // ), DrawerItem( icon: Icons.mail, title: _subtitle.email, diff --git a/lib/views/widgets/parts/auto_complete_parts_field.dart b/lib/views/widgets/parts/auto_complete_parts_field.dart index 893d2f91..025b6e1d 100644 --- a/lib/views/widgets/parts/auto_complete_parts_field.dart +++ b/lib/views/widgets/parts/auto_complete_parts_field.dart @@ -43,66 +43,54 @@ class _AutoCompletePartsFieldState extends State { _userProvider = Provider.of(context); _partsProvider = Provider.of(context); //Subtitle _subtitle = AppLocalization.of(context).subtitle; - return LoadingManager( - isLoading: _partsProvider.isLoading, - isFailedLoading: _partsProvider.parts == null, - stateCode: _partsProvider.stateCode, - onRefresh: () async { - _partsProvider.reset(); - await _partsProvider.getParts( - host: _settingProvider.host, - user: _userProvider.user, - ); - }, - child: Container( - padding: const EdgeInsets.symmetric( - horizontal: 16 + return Container( + padding: const EdgeInsets.symmetric( + horizontal: 16 + ), + decoration: BoxDecoration( + color: Colors.white, + border: Border.all(color:AColors.black), + borderRadius: BorderRadius.circular( + AppStyle.borderRadius * AppStyle.getScaleFactor(context) ), - decoration: BoxDecoration( - color: Colors.white, - border: Border.all(color:AColors.black), - borderRadius: BorderRadius.circular( - AppStyle.borderRadius * AppStyle.getScaleFactor(context) - ), - boxShadow: const [ - AppStyle.boxShadow - ] - ), - child: TypeAheadField( - textFieldConfiguration: TextFieldConfiguration( - style: Theme.of(context).textTheme.subtitle1, - controller: _controller, - textAlign: TextAlign.center, - decoration: const InputDecoration( - border: InputBorder.none, - disabledBorder: InputBorder.none, - focusedBorder: InputBorder.none, - enabledBorder: InputBorder.none, - ), - textInputAction: TextInputAction.search, - ), - suggestionsCallback: (vale) async { - return await _partsProvider.getPartsList( - host: _settingProvider.host, - title: vale - ); - }, - itemBuilder: (context, part) { - return ListTile( - title: Text(part.code), - subtitle: Text(part.name, style: Theme.of(context).textTheme.caption,), - ); - }, - onSuggestionSelected: (part) { - if(widget.clearAfterPick){ - _controller.clear(); - } else{ - _controller.text = part.code; - } - widget.onPick(part); - }, + boxShadow: const [ + AppStyle.boxShadow + ] + ), + child: TypeAheadField( + textFieldConfiguration: TextFieldConfiguration( + style: Theme.of(context).textTheme.subtitle1, + controller: _controller, + textAlign: TextAlign.center, + decoration: const InputDecoration( + border: InputBorder.none, + disabledBorder: InputBorder.none, + focusedBorder: InputBorder.none, + enabledBorder: InputBorder.none, ), + textInputAction: TextInputAction.search, ), + suggestionsCallback: (vale) async { + return await _partsProvider.getPartsList( + host: _settingProvider.host, + title: vale + ); + }, + itemBuilder: (context, part) { + return ListTile( + title: Text(part.code), + subtitle: Text(part.name, style: Theme.of(context).textTheme.caption,), + ); + }, + onSuggestionSelected: (part) { + if(widget.clearAfterPick){ + _controller.clear(); + } else{ + _controller.text = part.code; + } + widget.onPick(part); + }, + ), ); } } From 363a46b97fb43bfc4a6d0141cf6fa9d5e8fe83f6 Mon Sep 17 00:00:00 2001 From: Sikander Saleem Date: Tue, 9 May 2023 10:58:44 +0300 Subject: [PATCH 014/181] improvements --- lib/controllers/providers/api/service_requests_provider.dart | 4 +++- lib/views/widgets/status/single_status_menu.dart | 2 +- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/lib/controllers/providers/api/service_requests_provider.dart b/lib/controllers/providers/api/service_requests_provider.dart index 35bda175..adb8212a 100644 --- a/lib/controllers/providers/api/service_requests_provider.dart +++ b/lib/controllers/providers/api/service_requests_provider.dart @@ -229,7 +229,9 @@ class ServiceRequestsProvider extends ChangeNotifier{ try{ response = await post( Uri.parse( - host+URLs.updateRequestDate), + //host+ + URLs.updateRequestDate + ), body: body, ); stateCode = response.statusCode; diff --git a/lib/views/widgets/status/single_status_menu.dart b/lib/views/widgets/status/single_status_menu.dart index 6b99d975..1bb1f844 100644 --- a/lib/views/widgets/status/single_status_menu.dart +++ b/lib/views/widgets/status/single_status_menu.dart @@ -51,7 +51,7 @@ class _SingleStatusMenuState extends State { return element == widget.initialStatus; }); if(result.isNotEmpty) _selectedStatus = result.first; - if(widget.initialStatus.id != _selectedStatus.id) { + if(widget.initialStatus.id != _selectedStatus?.id) { widget.onSelect(_selectedStatus); } } From e4c37ec052f4ba18ffa8e4e775ba7874c4982292 Mon Sep 17 00:00:00 2001 From: Sikander Saleem Date: Tue, 9 May 2023 15:29:09 +0300 Subject: [PATCH 015/181] create report submission fix. --- lib/models/service_report.dart | 2 +- .../pages/user/requests/report/create_service_report.dart | 6 ++++-- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/lib/models/service_report.dart b/lib/models/service_report.dart index 58eb2c98..7016d0d6 100644 --- a/lib/models/service_report.dart +++ b/lib/models/service_report.dart @@ -121,7 +121,7 @@ class ServiceReport { if(visitDate == null) return false; //if(serviceType == null) return false; if(status == null) return false; - if(type == null) return false; + if(type == null && assetType==null) return false; if(engineer == null) return false; if(callLastSituation == null) return false; if(callLastSituation?.value == 12){ diff --git a/lib/views/pages/user/requests/report/create_service_report.dart b/lib/views/pages/user/requests/report/create_service_report.dart index 2c1c2b43..f077fbd7 100644 --- a/lib/views/pages/user/requests/report/create_service_report.dart +++ b/lib/views/pages/user/requests/report/create_service_report.dart @@ -576,7 +576,7 @@ class _CreateServiceReportState extends State with TickerPr ESignature( oldSignature: _serviceReport.signatureNurse, newSignature: _serviceReport.localNurseSignature, - onChange: (signature){ + onSaved: (signature){ if(signature == null || signature.isEmpty) {return;} _serviceReport.localNurseSignature = signature; _serviceReport.signatureNurse = "${DateTime.now().toIso8601String()}.png|${base64Encode(signature)}"; @@ -587,7 +587,7 @@ class _CreateServiceReportState extends State with TickerPr ESignature( oldSignature: _serviceReport.signatureEngineer, newSignature: _serviceReport.localNurseSignature, - onChange: (signature){ + onSaved: (signature){ if(signature == null || signature.isEmpty) {return;} _serviceReport.localNurseSignature = signature; _serviceReport.signatureEngineer = "${DateTime.now().toIso8601String()}.png|${base64Encode(signature)}"; @@ -661,6 +661,8 @@ class _CreateServiceReportState extends State with TickerPr _isLoading =true; setState(() {}); + + int status = await _serviceRequestsProvider.createServiceReport( user: _userProvider.user, host: _settingProvider.host, From b82c9b86d90a4585bafdaff101005577fd41e945 Mon Sep 17 00:00:00 2001 From: Sikander Saleem Date: Thu, 11 May 2023 10:59:03 +0300 Subject: [PATCH 016/181] improvement --- lib/views/widgets/e_signature/e_signature.dart | 2 +- lib/views/widgets/status/single_status_menu.dart | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/lib/views/widgets/e_signature/e_signature.dart b/lib/views/widgets/e_signature/e_signature.dart index 1136a0a3..b32b5f14 100644 --- a/lib/views/widgets/e_signature/e_signature.dart +++ b/lib/views/widgets/e_signature/e_signature.dart @@ -103,7 +103,7 @@ class _ESignatureState extends State { const Spacer(), IconButton(onPressed: () async { signature = await _controller.toPngBytes(); - widget.onChange(signature); + widget.onSaved(signature); setState(() {}); }, icon: const Icon(Icons.check)), ], diff --git a/lib/views/widgets/status/single_status_menu.dart b/lib/views/widgets/status/single_status_menu.dart index 1bb1f844..9679910e 100644 --- a/lib/views/widgets/status/single_status_menu.dart +++ b/lib/views/widgets/status/single_status_menu.dart @@ -34,7 +34,7 @@ class _SingleStatusMenuState extends State { }else{ _selectedStatus =null; } - if(widget.initialStatus.id != _selectedStatus.id) { + if(widget.initialStatus.id != _selectedStatus?.id) { widget.onSelect(_selectedStatus); } } else { From 7b49f9f40ebfc03d93b9fee9de84bf4e2f2b1454 Mon Sep 17 00:00:00 2001 From: nextwo <1234> Date: Sun, 14 May 2023 10:38:40 +0300 Subject: [PATCH 017/181] FIX BUGS --- .../providers/api/device_transfer_provider.dart | 15 +++++++++------ .../providers/api/devices_provider.dart | 2 +- lib/views/widgets/status/single_status_menu.dart | 2 +- 3 files changed, 11 insertions(+), 8 deletions(-) diff --git a/lib/controllers/providers/api/device_transfer_provider.dart b/lib/controllers/providers/api/device_transfer_provider.dart index faebf334..1d2dc0b7 100644 --- a/lib/controllers/providers/api/device_transfer_provider.dart +++ b/lib/controllers/providers/api/device_transfer_provider.dart @@ -162,8 +162,8 @@ class DeviceTransferProvider extends ChangeNotifier{ if(isSender){ body.addAll( { - //"senderSiteId": newModel.client.id, - //"senderDepartmentId": newModel.department.id, + "senderSiteId": newModel.client.id, + "senderDepartmentId": newModel.department.id, "senderAssignedEmployeeId": newModel.userId, "senderMachineStatusId": newModel.status.id, "senderComment": newModel.comment, @@ -175,14 +175,14 @@ class DeviceTransferProvider extends ChangeNotifier{ }else{ body.addAll( { - //"destSiteId": newModel.client.id, - //"destDepartmentId": newModel.department.id, + "destSiteId": newModel.client.id, + "destDepartmentId": newModel.department.id, "receiverAssignedEmployeeId": newModel.userId, - "receiverMachineStatusId": newModel.status.id, + "receiverMachineStatusId": newModel.status?.id??"", "receiverComment": newModel.comment, "receiverWorkingHours": newModel.workingHours, "receiverTravelingHours": newModel.travelingHours, - "receiverAttachmentName": "${DateTime.now().toIso8601String()}.png|${newModel.signature}", + "receiverAttachmentName": "${newModel.signature}.png", } ); } @@ -194,6 +194,9 @@ class DeviceTransferProvider extends ChangeNotifier{ URLs.updateDeviceTransfer, body: body ); + + print(response.body); + print("${DateTime.now().toIso8601String()}.png|${newModel.signature}"); // response = await post( // Uri.parse("$host${URLs.updateDeviceTransfer}/$requestId"), // body: body, diff --git a/lib/controllers/providers/api/devices_provider.dart b/lib/controllers/providers/api/devices_provider.dart index 458ed9de..acc066e4 100644 --- a/lib/controllers/providers/api/devices_provider.dart +++ b/lib/controllers/providers/api/devices_provider.dart @@ -72,7 +72,7 @@ class DevicesProvider extends ChangeNotifier{ if(response.statusCode >= 200 && response.statusCode < 300) { // client's request was successfully received List equipmentListJson = json.decode(response.body)["data"]; - _devices = equipmentListJson.map((device) => Device.fromJson(device)).toList(); + _devices = equipmentListJson.map((device) => Device.fromJson(device)).toList(); } _loading = false; notifyListeners(); diff --git a/lib/views/widgets/status/single_status_menu.dart b/lib/views/widgets/status/single_status_menu.dart index 1bb1f844..22c19755 100644 --- a/lib/views/widgets/status/single_status_menu.dart +++ b/lib/views/widgets/status/single_status_menu.dart @@ -34,7 +34,7 @@ class _SingleStatusMenuState extends State { }else{ _selectedStatus =null; } - if(widget.initialStatus.id != _selectedStatus.id) { + if((widget.initialStatus?.id??"") != (_selectedStatus?.id??"")) { widget.onSelect(_selectedStatus); } } else { From 1bf9d612add7204d5326c919e27246fabb094709 Mon Sep 17 00:00:00 2001 From: zaid_daoud Date: Sun, 14 May 2023 11:49:24 +0300 Subject: [PATCH 018/181] Fixing bugs --- .../api/device_transfer_provider.dart | 126 +++++++--------- .../providers/api/devices_provider.dart | 106 ++++++-------- lib/models/user.dart | 134 ++++++++--------- .../update_device_transfer.dart | 104 +++++++------- lib/views/pages/user/land_page.dart | 10 +- .../widgets/e_signature/e_signature.dart | 125 ++++++++-------- .../pentry/pentry_calibration_tool_form.dart | 136 +++++++++--------- .../service_request_priority_mune.dart | 10 +- .../widgets/status/single_status_menu.dart | 51 ++++--- 9 files changed, 379 insertions(+), 423 deletions(-) diff --git a/lib/controllers/providers/api/device_transfer_provider.dart b/lib/controllers/providers/api/device_transfer_provider.dart index faebf334..8db040a7 100644 --- a/lib/controllers/providers/api/device_transfer_provider.dart +++ b/lib/controllers/providers/api/device_transfer_provider.dart @@ -8,13 +8,12 @@ import 'package:test_sa/models/device/device_transfer.dart'; import 'package:test_sa/models/device/device_transfer_info.dart'; import 'package:test_sa/models/user.dart'; -class DeviceTransferProvider extends ChangeNotifier{ - +class DeviceTransferProvider extends ChangeNotifier { // number of items call in each request final pageItemNumber = 50; //reset provider data - void reset(){ + void reset() { items = null; nextPage = true; stateCode = null; @@ -41,12 +40,11 @@ class DeviceTransferProvider 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 ({ + Future getRequests({ @required String host, @required User user, }) async { - if(isLoading == true) - return -2; + if (isLoading == true) return -2; isLoading = true; // isLoading = false; @@ -64,9 +62,9 @@ class DeviceTransferProvider extends ChangeNotifier{ // notifyListeners(); // return 200; Response response; - try{ - Map body = {}; - body["pageNumber"] = (items?.length ?? 0) ~/pageItemNumber + 1; + try { + Map body = {}; + body["pageNumber"] = (items?.length ?? 0) ~/ pageItemNumber + 1; body["pageSize"] = pageItemNumber; response = await ApiManager.instance.post( @@ -75,38 +73,35 @@ class DeviceTransferProvider extends ChangeNotifier{ ); stateCode = response.statusCode; - if(stateCode >= 200 && stateCode < 300) { + if (stateCode >= 200 && stateCode < 300) { // client's request was successfully received List listJson = json.decode(response.body)["data"]; - List itemsPage = listJson.map( - (request) => DeviceTransfer.fromJson(request)).toList(); + List itemsPage = listJson.map((request) => DeviceTransfer.fromJson(request)).toList(); items ??= []; items.addAll(itemsPage); - if(itemsPage.length == pageItemNumber){ + if (itemsPage.length == pageItemNumber) { nextPage = true; - }else{ + } else { nextPage = false; } } isLoading = false; notifyListeners(); return response.statusCode; - - } catch(error) { + } catch (error) { isLoading = false; stateCode = -1; notifyListeners(); return -1; } - } - Future createRequest ({ + Future createRequest({ @required String host, @required User user, @required DeviceTransfer model, }) async { - Map body = { + Map body = { // "uid": user.id.toString(), // "token": user.token ?? "", "assetId": model.device.id ?? "", @@ -115,34 +110,23 @@ class DeviceTransferProvider extends ChangeNotifier{ "senderSiteId": model.receiver.client.id ?? "", }; - Response response; - try{ - response = await ApiManager.instance.post( - URLs.requestDeviceTransfer, - body: body - ); + try { + response = await ApiManager.instance.post(URLs.requestDeviceTransfer, body: body); stateCode = response.statusCode; - if(response.statusCode >= 200 && response.statusCode < 300) { - if(items != null) { - items.insert( - 0, - DeviceTransfer.fromJson( - json.decode(utf8.decode(response.bodyBytes))[0] - ) - ); + if (response.statusCode >= 200 && response.statusCode < 300) { + if (items != null) { + items.insert(0, DeviceTransfer.fromJson(json.decode(utf8.decode(response.bodyBytes))[0])); notifyListeners(); } } return response.statusCode; - - } catch(error) { + } catch (error) { return -1; } - } - Future updateRequest ({ + Future updateRequest({ @required String host, @required User user, @required bool isSender, @@ -150,57 +134,49 @@ class DeviceTransferProvider extends ChangeNotifier{ @required DeviceTransfer oldModel, @required DeviceTransferInfo newModel, }) async { - - Map body = { + Map body = { "id": oldModel.id, "assetId": oldModel.device.id ?? "", "senderSiteId": oldModel.sender.client.id, "destSiteId": oldModel.receiver.client.id, - "destDepartmentId": oldModel.receiver.department.id, + "destDepartmentId": oldModel.receiver.department.id, }; - if(isSender){ - body.addAll( - { - //"senderSiteId": newModel.client.id, - //"senderDepartmentId": newModel.department.id, - "senderAssignedEmployeeId": newModel.userId, - "senderMachineStatusId": newModel.status.id, - "senderComment": newModel.comment, - "senderWorkingHours": newModel.workingHours, - "senderTravelingHours": newModel.travelingHours, - "senderAttachmentName": "${DateTime.now().toIso8601String()}.png|${newModel.signature}", - } - ); - }else{ - body.addAll( - { - //"destSiteId": newModel.client.id, - //"destDepartmentId": newModel.department.id, - "receiverAssignedEmployeeId": newModel.userId, - "receiverMachineStatusId": newModel.status.id, - "receiverComment": newModel.comment, - "receiverWorkingHours": newModel.workingHours, - "receiverTravelingHours": newModel.travelingHours, - "receiverAttachmentName": "${DateTime.now().toIso8601String()}.png|${newModel.signature}", - } - ); + if (isSender) { + body.addAll({ + //"senderSiteId": newModel.client.id, + //"senderDepartmentId": newModel.department.id, + "senderAssignedEmployeeId": newModel.userId, + "senderMachineStatusId": newModel.status.id, + "senderComment": newModel.comment, + "senderWorkingHours": newModel.workingHours, + "senderTravelingHours": newModel.travelingHours, + "senderAttachmentName": "${DateTime.now().toIso8601String()}.png|${newModel.signature}", + }); + } else { + body.addAll({ + //"destSiteId": newModel.client.id, + //"destDepartmentId": newModel.department.id, + "receiverAssignedEmployeeId": newModel.userId, + "receiverMachineStatusId": newModel.status.id, + "receiverComment": newModel.comment, + "receiverWorkingHours": newModel.workingHours, + "receiverTravelingHours": newModel.travelingHours, + "receiverAttachmentName": "${DateTime.now().toIso8601String()}.png|${newModel.signature}", + }); } body.addAll(newModel.toJson(isSender)); Response response; - try{ - response = await ApiManager.instance.put( - URLs.updateDeviceTransfer, - body: body - ); + try { + response = await ApiManager.instance.put(URLs.updateDeviceTransfer, body: body); // response = await post( // Uri.parse("$host${URLs.updateDeviceTransfer}/$requestId"), // body: body, // ); stateCode = response.statusCode; - if(response.statusCode >= 200 && response.statusCode < 300) { + if (response.statusCode >= 200 && response.statusCode < 300) { reset(); // oldModel.fromDeviceTransfer( // DeviceTransfer.fromJson( @@ -210,10 +186,8 @@ class DeviceTransferProvider extends ChangeNotifier{ notifyListeners(); } return response.statusCode; - - } catch(error) { + } catch (error) { return -1; } - } -} \ No newline at end of file +} diff --git a/lib/controllers/providers/api/devices_provider.dart b/lib/controllers/providers/api/devices_provider.dart index 458ed9de..f7eaa388 100644 --- a/lib/controllers/providers/api/devices_provider.dart +++ b/lib/controllers/providers/api/devices_provider.dart @@ -8,10 +8,9 @@ import 'package:test_sa/models/device/device.dart'; import 'package:test_sa/models/lookup.dart'; import 'package:test_sa/models/user.dart'; -class DevicesProvider extends ChangeNotifier{ - +class DevicesProvider extends ChangeNotifier { //reset provider data - void reset(){ + void reset() { _devices = null; _stateCode = null; } @@ -30,7 +29,7 @@ class DevicesProvider extends ChangeNotifier{ // failed _loading = false bool _loading; bool get isLoading => _loading; - set isLoading(bool isLoading){ + set isLoading(bool isLoading) { _loading = isLoading; notifyListeners(); } @@ -40,36 +39,32 @@ class DevicesProvider 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 getEquipment ({ + Future getEquipment({ @required String host, @required User user, @required int hospitalId, String serialNumber, String number, }) async { - if(_loading == true) - return -2; + if (_loading == true) return -2; _loading = true; notifyListeners(); Response response; - try{ - response = await ApiManager.instance.post( - URLs.getEquipment, - body: { - "pageSize":50, - "siteId":hospitalId, - if(serialNumber?.isEmpty == false) "assetSerialNumber":serialNumber, - if(number?.isEmpty == false) "assetNo":number, - } - ); - } catch(error) { + try { + response = await ApiManager.instance.post(URLs.getEquipment, body: { + "pageSize": 50, + "siteId": hospitalId, + if (serialNumber?.isEmpty == false) "assetSerialNumber": serialNumber, + if (number?.isEmpty == false) "assetNo": number, + }); + } catch (error) { _loading = false; _stateCode = -1; notifyListeners(); return -1; } _stateCode = response.statusCode; - if(response.statusCode >= 200 && response.statusCode < 300) { + if (response.statusCode >= 200 && response.statusCode < 300) { // client's request was successfully received List equipmentListJson = json.decode(response.body)["data"]; _devices = equipmentListJson.map((device) => Device.fromJson(device)).toList(); @@ -84,7 +79,7 @@ class DevicesProvider 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> getDevicesList ({ + Future> getDevicesList({ @required String host, @required User user, @required int hospitalId, @@ -92,95 +87,82 @@ class DevicesProvider extends ChangeNotifier{ String number, }) async { Response response; - try{ - response = await ApiManager.instance.post( - URLs.getEquipment, - body: { - "pageSize":50, - "siteId":hospitalId, - if(serialNumber?.isEmpty == false) "assetSerialNumber":serialNumber, - if(number?.isEmpty == false) "assetNo":number, - } - ); + try { + response = await ApiManager.instance.post(URLs.getEquipment, body: { + "pageSize": 50, + "siteId": hospitalId, + if (serialNumber?.isEmpty == false) "assetSerialNumber": serialNumber, + if (number?.isEmpty == false) "assetNo": number, + }); // response = await get( // Uri.parse("$host${URLs.getEquipment}?siteId=$hospitalId" // "${serialNumber?.isEmpty == false ? "&assetSerialNumber=$serialNumber" :""}" // "${number?.isEmpty == false ? "&assetNo=$number" : ""}" // ), // ); - List page = []; - if(response.statusCode >= 200 && response.statusCode < 300) { + List page = []; + if (response.statusCode >= 200 && response.statusCode < 300) { // client's request was successfully received List equipmentListJson = json.decode(response.body)["data"]; page = equipmentListJson.map((device) => Device.fromJson(device)).toList(); } return page; - } catch(error) { + } catch (error) { return []; } - } Future> getModels({ String code, }) async { Response response; - try{ + try { response = await ApiManager.instance.get( - URLs.getModels+"?code=$code", + URLs.getModels + "?code=$code", ); - List page = []; - if(response.statusCode >= 200 && response.statusCode < 300) { + List page = []; + if (response.statusCode >= 200 && response.statusCode < 300) { // client's request was successfully received List categoriesListJson = json.decode(response.body)["data"]; - page = categoriesListJson.map((json) => - Lookup( - name: json["modelDefCode"], - id: json["id"], - value: json["id"], - ) - ).toList(); + page = categoriesListJson + .map((json) => Lookup( + name: json["modelDefCode"], + id: json["id"], + value: json["id"], + )) + .toList(); } return page; - } catch(error) { + } catch (error) { return []; } - } - /// return -2 if request in progress /// return -1 if error happen when sending request /// 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> getDevicesListBySN ({ - @required String host, - @required User user, - @required int hospitalId, - @required String sn - }) async { + Future> getDevicesListBySN({@required String host, @required User user, @required int hospitalId, @required String sn}) async { Response response; - try{ + try { response = await get( - Uri.parse(host + URLs.getEquipment+"?client=$hospitalId" - + ( sn == null || sn.isEmpty ? "" : "&serial_qr=$sn" )), + Uri.parse(URLs.getEquipment + "?client=$hospitalId" + (sn == null || sn.isEmpty ? "" : "&serial_qr=$sn")), ); _stateCode = response.statusCode; - List _page = []; - if(response.statusCode >= 200 && response.statusCode < 300) { + List _page = []; + if (response.statusCode >= 200 && response.statusCode < 300) { // client's request was successfully received List categoriesListJson = json.decode(utf8.decode(response.bodyBytes)); _page = categoriesListJson.map((device) => Device.fromJson(device)).toList(); } return _page; - } catch(error) { + } catch (error) { _loading = false; _stateCode = -1; notifyListeners(); return []; } - } -} \ No newline at end of file +} diff --git a/lib/models/user.dart b/lib/models/user.dart index aea639a8..05a1f3cc 100644 --- a/lib/models/user.dart +++ b/lib/models/user.dart @@ -3,7 +3,7 @@ import 'package:test_sa/models/department.dart'; import 'package:test_sa/models/enums/user_types.dart'; import 'package:test_sa/models/hospital.dart'; -class User{ +class User { String id; String userName; String password; @@ -17,106 +17,92 @@ class User{ bool isActive; DateTime tokenLife; - - User({ - this.id, - this.userName = "", - this.email = "", - this.password = "", - this.phoneNumber = "", - this.hospital, - this.department, - this.type, - this.whatsApp, - this.token, - this.tokenLife, - this.isActive = false - }); + User( + {this.id, + this.userName = "", + this.email = "", + this.password = "", + this.phoneNumber = "", + this.hospital, + this.department, + this.type, + this.whatsApp, + this.token, + this.tokenLife, + this.isActive = false}); Future> toLoginJson() async { - if(FirebaseNotificationManger.token == null) - await FirebaseNotificationManger.getToken(); + if (FirebaseNotificationManger.token == null) await FirebaseNotificationManger.getToken(); return { - "username":userName, - "password":password, + "username": userName, + "password": password, "firebase_token": FirebaseNotificationManger?.token ?? "", }; } - Map toUpdateProfileJson(){ - Map jsonObject ={}; - if(department?.id != null) - jsonObject["department"] = department.id; - if(whatsApp != null && whatsApp.isNotEmpty) - jsonObject["whatsapp"] = whatsApp; - if(phoneNumber != null && phoneNumber.isNotEmpty) - jsonObject["phone"] = phoneNumber; + Map toUpdateProfileJson() { + Map jsonObject = {}; + if (department?.id != null) jsonObject["department"] = department.id; + if (whatsApp != null && whatsApp.isNotEmpty) jsonObject["whatsapp"] = whatsApp; + if (phoneNumber != null && phoneNumber.isNotEmpty) jsonObject["phone"] = phoneNumber; return jsonObject; } Future> toRegisterJson() async { - if(FirebaseNotificationManger.token == null) - await FirebaseNotificationManger.getToken(); + if (FirebaseNotificationManger.token == null) await FirebaseNotificationManger.getToken(); return { "username": userName, - "email":email, - "whatsapp":whatsApp, - "client":hospital.id, - "department":department?.id, - "phone":phoneNumber, - "pass":password, + "email": email, + "whatsapp": whatsApp, + "client": hospital.id, + "department": department?.id, + "phone": phoneNumber, + "pass": password, "firebase_token": FirebaseNotificationManger?.token ?? "", }; } - Map toJson(){ + Map toJson() { return { - "userID":id, + "userID": id, "username": userName, - "email":email, - "token":token, - "phoneNumber":phoneNumber, - "whatsapp":whatsApp, - "client_id":hospital?.id, - "client_name":hospital?.name, - "department_id":department?.id, - "department_name":department?.name, + "email": email, + "token": token, + "phoneNumber": phoneNumber, + "whatsapp": whatsApp, + "client_id": hospital?.id, + "client_name": hospital?.name, + "department_id": department?.id, + "department_name": department?.name, //"password":password, - "tokenlife":tokenLife.toIso8601String(), - "active":isActive, - "userRoles": type == UsersTypes.engineer - ? "value: R-6" : "value: R-5" , - // "token":token, pass is token + "tokenlife": tokenLife.toIso8601String(), + "active": isActive, + "userRoles": type == UsersTypes.engineer ? "value: R-6" : "value: R-5", + // "token":token, pass is token }; } - factory User.fromJson(Map parsedJson){ + factory User.fromJson(Map parsedJson) { UsersTypes type; - if(parsedJson["userRoles"].toString().contains("value: R-4") - || parsedJson["userRoles"].toString().contains("value: R-5") - || parsedJson["userRoles"].toString().contains("value: R-7")){ + if (parsedJson["userRoles"].toString().contains("value: R-4") || parsedJson["userRoles"].toString().contains("value: R-5") || parsedJson["userRoles"].toString().contains("value: R-7")) { type = UsersTypes.normal_user; } else { type = UsersTypes.engineer; } return User( - id: parsedJson["userID"], - userName: parsedJson["username"], - email: parsedJson["email"], - hospital: Hospital( - id: parsedJson["client_id"], - name: parsedJson["client_name"] - ), - department: Department( - id: parsedJson["department_id"], - name: parsedJson["department_name"], - ), - phoneNumber: parsedJson["phoneNumber"], - whatsApp: parsedJson["phoneNumber"], - token: parsedJson["token"], - isActive: parsedJson["isAuthenticated"], - tokenLife: DateTime.tryParse(parsedJson["tokenlife"]??""), - type:type - ); + id: parsedJson["userID"], + userName: parsedJson["username"], + email: parsedJson["email"], + hospital: Hospital(id: parsedJson["client_id"], name: parsedJson["client_name"]), + department: Department( + id: parsedJson["department_id"], + name: parsedJson["department_name"], + ), + phoneNumber: parsedJson["phoneNumber"], + whatsApp: parsedJson["phoneNumber"], + token: parsedJson["token"], + isActive: parsedJson["isAuthenticated"], + tokenLife: DateTime.tryParse(parsedJson["tokenlife"] ?? ""), + type: type); } -} \ No newline at end of file +} diff --git a/lib/views/pages/device_transfer/update_device_transfer.dart b/lib/views/pages/device_transfer/update_device_transfer.dart index d3e3e479..ce0f827c 100644 --- a/lib/views/pages/device_transfer/update_device_transfer.dart +++ b/lib/views/pages/device_transfer/update_device_transfer.dart @@ -19,6 +19,7 @@ import 'package:test_sa/views/widgets/status/gas_refill/gas_status.dart'; import 'package:test_sa/views/widgets/titles/app_sub_title.dart'; import '../../../../controllers/localization/localization.dart'; + class UpdateDeviceTransfer extends StatefulWidget { final DeviceTransfer model; final bool isSender; @@ -43,25 +44,19 @@ class _UpdateDeviceTransferState extends State { _update() async { _validate = true; - if(!_formKey.currentState.validate()){ + if (!_formKey.currentState.validate()) { setState(() {}); return false; } _formKey.currentState.save(); - _isLoading =true; + _isLoading = true; setState(() {}); int status = await _deviceTransferProvider.updateRequest( - user: _userProvider.user, - host: _settingProvider.host, - requestId: widget.model.id, - isSender: widget.isSender, - newModel: _formModel, - oldModel: widget.model - ); - _isLoading =false; + user: _userProvider.user, host: _settingProvider.host, requestId: widget.model.id, isSender: widget.isSender, newModel: _formModel, oldModel: widget.model); + _isLoading = false; setState(() {}); - if(status >= 200 && status < 300){ + if (status >= 200 && status < 300) { Fluttertoast.showToast( msg: _subtitle.requestCompleteSuccessfully, ); @@ -72,16 +67,13 @@ class _UpdateDeviceTransferState extends State { } @override - void setState(VoidCallback fn){ - if(!mounted) super.setState(() {}); + void setState(VoidCallback fn) { + if (!mounted) super.setState(() {}); } @override void initState() { - _formModel.fromDetails(widget.isSender - ? widget.model.sender : widget.model.receiver, - withSignature: false - ); + _formModel.fromDetails(widget.isSender ? widget.model.sender : widget.model.receiver, withSignature: false); super.initState(); } @@ -96,7 +88,7 @@ class _UpdateDeviceTransferState extends State { _subtitle = AppLocalization.of(context).subtitle; _userProvider = Provider.of(context); _settingProvider = Provider.of(context); - _deviceTransferProvider = Provider.of(context,listen: false); + _deviceTransferProvider = Provider.of(context, listen: false); return Scaffold( key: _scaffoldKey, body: Form( @@ -117,48 +109,56 @@ class _UpdateDeviceTransferState extends State { padding: const EdgeInsets.all(8.0), child: Text( "Edit Transfer Device", - style: Theme.of(context).textTheme.headline5.copyWith( - color: Theme.of(context).primaryColor, - fontSize: 28, - fontWeight: FontWeight.bold - ), + style: Theme.of(context).textTheme.headline5.copyWith(color: Theme.of(context).primaryColor, fontSize: 28, fontWeight: FontWeight.bold), ), ), ), - const SizedBox(height: 8,), + const SizedBox( + height: 8, + ), ASubTitle("Comment"), - const SizedBox(height: 4,), + const SizedBox( + height: 4, + ), ATextFormField( initialValue: _formModel?.comment, textAlign: TextAlign.center, style: Theme.of(context).textTheme.subtitle1, textInputType: TextInputType.text, - onSaved: (value){ + onSaved: (value) { _formModel.comment = value; }, ), - const SizedBox(height: 8,), + const SizedBox( + height: 8, + ), ASubTitle(_subtitle.travelingHours), - const SizedBox(height: 4,), + const SizedBox( + height: 4, + ), ATextFormField( initialValue: _formModel?.travelingHours, textAlign: TextAlign.center, style: Theme.of(context).textTheme.subtitle1, textInputType: TextInputType.number, - onSaved: (value){ + onSaved: (value) { _formModel.travelingHours = value; }, ), - const SizedBox(height: 8,), + const SizedBox( + height: 8, + ), ASubTitle(_subtitle.workingHours), - const SizedBox(height: 4,), + const SizedBox( + height: 4, + ), ATextFormField( initialValue: _formModel?.workingHours, textAlign: TextAlign.center, style: Theme.of(context).textTheme.subtitle1, textInputType: TextInputType.number, - onSaved: (value){ + onSaved: (value) { _formModel.workingHours = value; }, ), @@ -174,32 +174,37 @@ class _UpdateDeviceTransferState extends State { // setState(() {}); // }, // ), - const SizedBox(height: 8,), + const SizedBox( + height: 8, + ), ASubTitle(_subtitle.status), - const SizedBox(height: 4,), + const SizedBox( + height: 4, + ), GasStatusMenu( initialValue: _formModel.status, - onSelect: (status){ + onSelect: (status) { _formModel.status = status; setState(() {}); }, ), - const SizedBox(height: 8,), + const SizedBox( + height: 8, + ), const ASubTitle("Signature"), // if(_validate && _formModel.signature == null) // ASubTitle(_subtitle.requiredWord,color: Colors.red,), - const SizedBox(height: 4,), + const SizedBox( + height: 4, + ), ESignature( - oldSignature: widget.isSender - ? widget.model.sender.signature - : widget.model.receiver.signature, - newSignature: _signature, - onSaved: (signature){ - _signature = signature; - if(signature == null || signature.isEmpty) return; - _formModel.signature = base64Encode(signature); - - }, + oldSignature: widget.isSender ? widget.model.sender.signature : widget.model.receiver.signature, + newSignature: _signature, + onSaved: (signature) { + _signature = signature; + if (signature == null || signature.isEmpty) return; + _formModel.signature = base64Encode(signature); + }, ), Padding( padding: const EdgeInsets.all(16.0), @@ -208,7 +213,9 @@ class _UpdateDeviceTransferState extends State { onPressed: _update, ), ), - const SizedBox(height: 100,) + const SizedBox( + height: 100, + ) ], ), ), @@ -218,4 +225,3 @@ class _UpdateDeviceTransferState extends State { ); } } - diff --git a/lib/views/pages/user/land_page.dart b/lib/views/pages/user/land_page.dart index 41c4826c..096e3009 100644 --- a/lib/views/pages/user/land_page.dart +++ b/lib/views/pages/user/land_page.dart @@ -1,6 +1,5 @@ import 'dart:io'; -import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; import 'package:font_awesome_flutter/font_awesome_flutter.dart'; @@ -26,7 +25,6 @@ import 'package:test_sa/views/pages/device_transfer/request_device_transfer.dart import 'package:test_sa/views/pages/device_transfer/track_device_transfer.dart'; import 'package:test_sa/views/pages/user/gas_refill/request_gas_refill.dart'; import 'package:test_sa/views/pages/user/gas_refill/track_gas_refill.dart'; -import 'package:test_sa/views/pages/user/notifications/notifications_page.dart'; import 'package:test_sa/views/pages/user/requests/create_request.dart'; import 'package:test_sa/views/pages/user/visits/regular_visits_page.dart'; import 'package:test_sa/views/widgets/buttons/app_back_button.dart'; @@ -153,7 +151,7 @@ class _LandPageState extends State { mainAxisSpacing: 12, childAspectRatio: 1, children: [ - if (_userProvider.user.type == UsersTypes.normal_user) + if (_userProvider.user != null && _userProvider.user.type == UsersTypes.normal_user) LandPageItem( text: _subtitle.newServiceRequest, icon: FontAwesomeIcons.tools, @@ -279,7 +277,11 @@ class _LandPageState extends State { decoration: BoxDecoration(border: Border.all(color: Theme.of(context).primaryColor, width: 2), shape: BoxShape.circle), child: ClipOval( child: ClipOval( - child: Icon(Icons.person,size: 36,color: Theme.of(context).colorScheme.primary,), + child: Icon( + Icons.person, + size: 36, + color: Theme.of(context).colorScheme.primary, + ), ), ), ), diff --git a/lib/views/widgets/e_signature/e_signature.dart b/lib/views/widgets/e_signature/e_signature.dart index 1136a0a3..2c5dcc41 100644 --- a/lib/views/widgets/e_signature/e_signature.dart +++ b/lib/views/widgets/e_signature/e_signature.dart @@ -10,7 +10,7 @@ class ESignature extends StatefulWidget { final Uint8List newSignature; final Function(Uint8List) onSaved; final Function(Uint8List) onChange; - const ESignature({Key key, this.oldSignature, this.onSaved,this.onChange, this.newSignature}) : super(key: key); + const ESignature({Key key, this.oldSignature, this.onSaved, this.onChange, this.newSignature}) : super(key: key); @override State createState() => _ESignatureState(); @@ -29,7 +29,7 @@ class _ESignatureState extends State { bool _unpaint = false; @override void initState() { - if(widget.newSignature != null) { + if (widget.newSignature != null) { signature = widget.newSignature; } // TODO: implement initState @@ -46,72 +46,75 @@ class _ESignatureState extends State { Widget build(BuildContext context) { return Column( children: [ - if(widget.oldSignature != null || signature != null) - Container( - width: MediaQuery.of(context).size.width, - padding: const EdgeInsets.only(bottom: 8), - height: 90 * AppStyle.getScaleFactor(context), - child: signature != null ? - Image.memory(signature): - ImageLoader( - boxFit: BoxFit.contain, - url: widget.oldSignature) - ), - FormField( - onSaved: (_) async { - widget.onSaved(signature); - }, - builder: (FormFieldState state) { - return Column( - children: [ - Container( - width: MediaQuery.of(context).size.width, - padding: const EdgeInsets.symmetric( - horizontal: 16 - ), - decoration: BoxDecoration( - color: Colors.white, - border: Border.all(color:AColors.black), - borderRadius: BorderRadius.circular( - AppStyle.borderRadius * AppStyle.getScaleFactor(context) - ), - boxShadow: const [ - AppStyle.boxShadow - ] - ), - child: AbsorbPointer( - absorbing: _unpaint, - child: Signature( - controller: _controller, - height: 160 * AppStyle.getScaleFactor(context), - backgroundColor: Colors.transparent, - ), - ), + if (widget.oldSignature != null || signature != null) + Container( + width: MediaQuery.of(context).size.width, + padding: const EdgeInsets.only(bottom: 8), + height: 90 * AppStyle.getScaleFactor(context), + child: signature != null ? Image.memory(signature) : ImageLoader(boxFit: BoxFit.contain, url: widget.oldSignature)), + FormField(onSaved: (_) async { + widget.onSaved(signature); + }, builder: (FormFieldState state) { + return Column( + children: [ + Container( + width: MediaQuery.of(context).size.width, + padding: const EdgeInsets.symmetric(horizontal: 16), + decoration: BoxDecoration( + color: Colors.white, + border: Border.all(color: AColors.black), + borderRadius: BorderRadius.circular(AppStyle.borderRadius * AppStyle.getScaleFactor(context)), + boxShadow: const [AppStyle.boxShadow]), + child: AbsorbPointer( + absorbing: _unpaint, + child: Signature( + controller: _controller, + height: 160 * AppStyle.getScaleFactor(context), + backgroundColor: Colors.transparent, ), - Row( - children: [ - IconButton(onPressed: (){_controller.clear();}, icon: const Icon(Icons.clear)), - IconButton(onPressed: (){_controller.undo();}, icon: const Icon(Icons.undo)), - IconButton(onPressed: (){_controller.redo();}, icon: const Icon(Icons.redo)), - - IconButton(onPressed: (){ + ), + ), + Row( + children: [ + IconButton( + onPressed: () { + _controller.clear(); + }, + icon: const Icon(Icons.clear)), + IconButton( + onPressed: () { + _controller.undo(); + }, + icon: const Icon(Icons.undo)), + IconButton( + onPressed: () { + _controller.redo(); + }, + icon: const Icon(Icons.redo)), + IconButton( + onPressed: () { _unpaint = !_unpaint; setState(() {}); - }, icon: Icon( + }, + icon: Icon( _unpaint ? Icons.draw : Icons.ac_unit, - color: _unpaint ? AColors.orange : null,)), - const Spacer(), - IconButton(onPressed: () async { + color: _unpaint ? AColors.orange : null, + )), + const Spacer(), + IconButton( + onPressed: () async { signature = await _controller.toPngBytes(); - widget.onChange(signature); + if (widget.onChange != null) { + widget.onChange(signature); + } setState(() {}); - }, icon: const Icon(Icons.check)), - ], - ) + }, + icon: const Icon(Icons.check)), ], - ); - } - ), + ) + ], + ); + }), ], ); } diff --git a/lib/views/widgets/pentry/pentry_calibration_tool_form.dart b/lib/views/widgets/pentry/pentry_calibration_tool_form.dart index 84ba3492..7ecdaed6 100644 --- a/lib/views/widgets/pentry/pentry_calibration_tool_form.dart +++ b/lib/views/widgets/pentry/pentry_calibration_tool_form.dart @@ -9,11 +9,14 @@ import 'package:test_sa/views/widgets/buttons/app_small_button.dart'; import 'package:test_sa/views/widgets/date_and_time/date_picker.dart'; import 'package:test_sa/views/widgets/pentry/auto_complete_fields/auto_complete_devices_field.dart'; import 'package:test_sa/views/widgets/titles/app_sub_title.dart'; + class PentryCalibrationToolForm extends StatefulWidget { final List models; final bool enableValidate; const PentryCalibrationToolForm({ - Key key, this.models, this.enableValidate, + Key key, + this.models, + this.enableValidate, }) : super(key: key); @override @@ -21,75 +24,80 @@ class PentryCalibrationToolForm extends StatefulWidget { } class _PentryCalibrationToolFormState extends State { - - @override Widget build(BuildContext context) { final subtitle = AppLocalization.of(context).subtitle; final userProvider = Provider.of(context); return ListView.builder( - padding: EdgeInsets.only( - top: 12 * AppStyle.getScaleFactor(context), - left: 12 * AppStyle.getScaleFactor(context), - right: 12 * AppStyle.getScaleFactor(context), - bottom: 80 * AppStyle.getScaleFactor(context) - ), - itemCount: widget.models.length + 1, - itemBuilder: (context,index){ - if(index == widget.models.length){ - return AButton( - text: subtitle.add, - onPressed: (){ - widget.models.add(CalibrationTool()); - setState(() {}); - }, - ); - } - final model = widget.models[index]; - return ListView( - shrinkWrap: true, - physics: const ClampingScrollPhysics(), - children: [ - Row( - mainAxisAlignment: MainAxisAlignment.spaceBetween, - children: [ - ASubTitle("#${index+1}"), - if(index != 0) - ASmallButton( - color: Theme.of(context).colorScheme.error, - text: subtitle.delete, - onPressed: (){ - widget.models.remove(model); - setState(() {}); - }, - ), - ], - ), - const SizedBox(height: 8,), - const ASubTitle("Asset Number"), - const SizedBox(height: 4,), - AutoCompleteDeviceNumberField( - initialValue: model.assetsNumber, - hospitalId: userProvider.user.hospital?.id, - onPick: (number){ - model.assetsNumber = number; - }, - ), - const SizedBox(height: 8,), - const ASubTitle("Date of Testing"), - const SizedBox(height: 4,), - ADatePicker( - date: model.dataOfTesting, - onDatePicker: (date){ - model.dataOfTesting =date; + padding: EdgeInsets.only( + top: 12 * AppStyle.getScaleFactor(context), left: 12 * AppStyle.getScaleFactor(context), right: 12 * AppStyle.getScaleFactor(context), bottom: 80 * AppStyle.getScaleFactor(context)), + itemCount: widget.models.length + 1, + itemBuilder: (context, index) { + if (index == widget.models.length) { + return AButton( + text: subtitle.add, + onPressed: () { + widget.models.add(CalibrationTool()); setState(() {}); }, - ), - const SizedBox(height: 8,), - Divider(color: Theme.of(context).textTheme.titleMedium.color,), - ], - ); - } - ); + ); + } + final model = widget.models[index]; + return ListView( + shrinkWrap: true, + physics: const ClampingScrollPhysics(), + children: [ + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + ASubTitle("#${index + 1}"), + if (index != 0) + ASmallButton( + color: Theme.of(context).colorScheme.error, + text: subtitle.delete, + onPressed: () { + widget.models.remove(model); + setState(() {}); + }, + ), + ], + ), + const SizedBox( + height: 8, + ), + const ASubTitle("Asset Number"), + const SizedBox( + height: 4, + ), + AutoCompleteDeviceNumberField( + initialValue: model.assetsNumber, + hospitalId: userProvider.user.hospital?.id, + onPick: (number) { + model.assetsNumber = number; + }, + ), + const SizedBox( + height: 8, + ), + const ASubTitle("Date of Testing"), + const SizedBox( + height: 4, + ), + ADatePicker( + date: model.dataOfTesting, + onDatePicker: (date) { + model.dataOfTesting = date; + setState(() {}); + }, + ), + const SizedBox( + height: 8, + ), + Divider( + color: Theme.of(context).textTheme.titleMedium.color, + ), + ], + ); + }); } } diff --git a/lib/views/widgets/status/service_request/service_request_priority_mune.dart b/lib/views/widgets/status/service_request/service_request_priority_mune.dart index fe3bd6db..4896fdcc 100644 --- a/lib/views/widgets/status/service_request/service_request_priority_mune.dart +++ b/lib/views/widgets/status/service_request/service_request_priority_mune.dart @@ -6,6 +6,7 @@ import 'package:test_sa/controllers/providers/settings/setting_provider.dart'; import 'package:test_sa/models/lookup.dart'; import 'package:test_sa/views/widgets/loaders/loading_manager.dart'; import 'package:test_sa/views/widgets/status/single_status_menu.dart'; + class ServiceRequestPriorityMenu extends StatelessWidget { final Function(Lookup) onSelect; final Lookup initialValue; @@ -16,22 +17,19 @@ class ServiceRequestPriorityMenu extends StatelessWidget { final settingProvider = Provider.of(context); final userProvider = Provider.of(context); final menuProvider = Provider.of(context); + return LoadingManager( isLoading: menuProvider.isLoading, isFailedLoading: menuProvider.items == null, stateCode: menuProvider.stateCode, onRefresh: () async { menuProvider.reset(); - await menuProvider.getData( - user: userProvider.user, - host: settingProvider.host - ); + await menuProvider.getData(user: userProvider.user, host: settingProvider.host); }, child: SingleStatusMenu( initialStatus: initialValue, statuses: menuProvider.items, onSelect: onSelect, - ) - ); + )); } } diff --git a/lib/views/widgets/status/single_status_menu.dart b/lib/views/widgets/status/single_status_menu.dart index 1bb1f844..48aa402f 100644 --- a/lib/views/widgets/status/single_status_menu.dart +++ b/lib/views/widgets/status/single_status_menu.dart @@ -2,6 +2,7 @@ import 'package:flutter/material.dart'; import 'package:test_sa/models/lookup.dart'; import 'package:test_sa/views/app_style/colors.dart'; import 'package:test_sa/views/app_style/sizing.dart'; + class SingleStatusMenu extends StatefulWidget { final List statuses; final Lookup initialStatus; @@ -14,27 +15,25 @@ class SingleStatusMenu extends StatefulWidget { } class _SingleStatusMenuState extends State { - Lookup _selectedStatus; @override void setState(VoidCallback fn) { - if(mounted) super.setState(fn); + if (mounted) super.setState(fn); } @override void didUpdateWidget(covariant SingleStatusMenu oldWidget) { - if(widget.initialStatus != null ){ - final result = widget.statuses?.where( - (element) { - return element == widget.initialStatus; - }); - if(result.isNotEmpty) { - _selectedStatus =result.first; - }else{ - _selectedStatus =null; + if (widget.initialStatus != null) { + final result = widget.statuses?.where((element) { + return element == widget.initialStatus; + }); + if (result.isNotEmpty) { + _selectedStatus = result.first; + } else { + _selectedStatus = null; } - if(widget.initialStatus.id != _selectedStatus.id) { + if (widget.initialStatus?.id != _selectedStatus?.id) { widget.onSelect(_selectedStatus); } } else { @@ -45,13 +44,12 @@ class _SingleStatusMenuState extends State { @override void initState() { - if(widget.initialStatus != null){ - final result = widget.statuses?.where( - (element) { - return element == widget.initialStatus; - }); - if(result.isNotEmpty) _selectedStatus = result.first; - if(widget.initialStatus.id != _selectedStatus?.id) { + if (widget.initialStatus != null) { + final result = widget.statuses?.where((element) { + return element == widget.initialStatus; + }); + if (result.isNotEmpty) _selectedStatus = result.first; + if (widget.initialStatus.id != _selectedStatus?.id) { widget.onSelect(_selectedStatus); } } @@ -76,7 +74,7 @@ class _SingleStatusMenuState extends State { child: DropdownButton( value: _selectedStatus, iconSize: 24, - icon: Icon(Icons.keyboard_arrow_down_rounded), + icon: const Icon(Icons.keyboard_arrow_down_rounded), elevation: 0, isExpanded: true, hint: Text( @@ -91,17 +89,16 @@ class _SingleStatusMenuState extends State { }); widget.onSelect(newValue); }, - items: widget.statuses - .map>((Lookup value) { + items: widget.statuses.map>((Lookup value) { return DropdownMenuItem( value: value, child: Text( - value.name, + value.name, style: Theme.of(context).textTheme.subtitle1.copyWith( - color: Theme.of(context).primaryColor, - fontSize: 11, - //fontWeight: FontWeight.bold - ), + color: Theme.of(context).primaryColor, + fontSize: 11, + //fontWeight: FontWeight.bold + ), ), ); }).toList(), From 2c09cdb7e4ecf00be9a4e286276f28fc97524191 Mon Sep 17 00:00:00 2001 From: nextwo <1234> Date: Sun, 14 May 2023 12:04:24 +0300 Subject: [PATCH 019/181] FIX BUGS --- lib/controllers/providers/api/device_transfer_provider.dart | 4 ++-- lib/views/pages/user/land_page.dart | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/lib/controllers/providers/api/device_transfer_provider.dart b/lib/controllers/providers/api/device_transfer_provider.dart index 1d2dc0b7..f5db6caa 100644 --- a/lib/controllers/providers/api/device_transfer_provider.dart +++ b/lib/controllers/providers/api/device_transfer_provider.dart @@ -169,7 +169,7 @@ class DeviceTransferProvider extends ChangeNotifier{ "senderComment": newModel.comment, "senderWorkingHours": newModel.workingHours, "senderTravelingHours": newModel.travelingHours, - "senderAttachmentName": "${DateTime.now().toIso8601String()}.png|${newModel.signature}", + "senderAttachmentName": "${newModel.signature}.png", } ); }else{ @@ -196,7 +196,7 @@ class DeviceTransferProvider extends ChangeNotifier{ ); print(response.body); - print("${DateTime.now().toIso8601String()}.png|${newModel.signature}"); + print("${newModel.signature}.png"); // response = await post( // Uri.parse("$host${URLs.updateDeviceTransfer}/$requestId"), // body: body, diff --git a/lib/views/pages/user/land_page.dart b/lib/views/pages/user/land_page.dart index 41c4826c..7235ed4c 100644 --- a/lib/views/pages/user/land_page.dart +++ b/lib/views/pages/user/land_page.dart @@ -153,7 +153,7 @@ class _LandPageState extends State { mainAxisSpacing: 12, childAspectRatio: 1, children: [ - if (_userProvider.user.type == UsersTypes.normal_user) + if (_userProvider?.user?.type == UsersTypes.normal_user) LandPageItem( text: _subtitle.newServiceRequest, icon: FontAwesomeIcons.tools, @@ -184,7 +184,7 @@ class _LandPageState extends State { // Navigator.of(context).pushNamed(PreventiveMaintenanceVisitsPage.id); // }, // ), - if (_userProvider.user.type != UsersTypes.engineer) + if (_userProvider?.user != null && _userProvider?.user?.type != UsersTypes.engineer) LandPageItem( text: "Request Gas Refill", icon: FontAwesomeIcons.truckFast, From f7057f4827a78384112e468b998f2650a63f5b4f Mon Sep 17 00:00:00 2001 From: zaid_daoud Date: Mon, 15 May 2023 10:02:53 +0300 Subject: [PATCH 020/181] Login Api Issue Fixed Manually --- .../providers/api/user_provider.dart | 58 ++++++++----------- lib/views/pages/login.dart | 17 +++--- lib/views/pages/user/land_page.dart | 2 +- 3 files changed, 34 insertions(+), 43 deletions(-) diff --git a/lib/controllers/providers/api/user_provider.dart b/lib/controllers/providers/api/user_provider.dart index 35634708..918787b0 100644 --- a/lib/controllers/providers/api/user_provider.dart +++ b/lib/controllers/providers/api/user_provider.dart @@ -6,10 +6,9 @@ import 'package:test_sa/controllers/api_routes/api_manager.dart'; import 'package:test_sa/controllers/api_routes/urls.dart'; import 'package:test_sa/models/user.dart'; -class UserProvider extends ChangeNotifier{ - +class UserProvider extends ChangeNotifier { //reset provider data - void reset(){ + void reset() { _user = null; ApiManager.instance.user = user; _loading = false; @@ -25,7 +24,6 @@ class UserProvider extends ChangeNotifier{ notifyListeners(); } - // when login or register in-process _login = true // when login or register is done or not start = false bool _loading = false; @@ -41,30 +39,30 @@ class UserProvider 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 login ({ + Future login({ @required String host, @required User user, }) async { - if(_loading == true) - return -2; + if (_loading == true) return -2; _loading = true; notifyListeners(); Response response; - try{ + try { response = await ApiManager.instance.post( - URLs.login, - body: await user.toLoginJson(), + URLs.login, + body: await user.toLoginJson(), ); _loading = false; - if(response.statusCode >= 200 && response.statusCode < 300) { + if (response.statusCode >= 200 && response.statusCode < 300) { // client's request was successfully received _user = User.fromJson(jsonDecode(response.body)); ApiManager.instance.user = _user; + notifyListeners(); return response.statusCode; } notifyListeners(); return response.statusCode; - } catch(error) { + } catch (error) { _loading = false; notifyListeners(); return -1; @@ -77,28 +75,27 @@ class UserProvider extends ChangeNotifier{ /// return state code if request complete may be 200, 404 or 403 /// for more details about state codes check http state manager /// lib\controllers\http_status_manger\http_status_manger.dart - Future register ({ + Future register({ @required String host, @required User user, }) async { - if(_loading == true) - return -2; + if (_loading == true) return -2; _loading = true; notifyListeners(); Response response; - try{ + try { response = await ApiManager.instance.post( URLs.register, body: await user.toLoginJson(), ); - } catch(error) { + } catch (error) { _loading = false; notifyListeners(); return -1; } _loading = false; notifyListeners(); - if(response.statusCode >= 200 && response.statusCode < 300) { + if (response.statusCode >= 200 && response.statusCode < 300) { // client's request was successfully received _user = User.fromJson(jsonDecode(utf8.decode(response.bodyBytes))[0]); _user.hospital = user.hospital; @@ -114,31 +111,27 @@ class UserProvider extends ChangeNotifier{ /// return state code if request complete may be 200, 404 or 403 /// for more details about state codes check http state manager /// lib\controllers\http_status_manger\http_status_manger.dart - Future updateProfile ({ + Future updateProfile({ @required String host, @required User user, }) async { - if(_loading == true) - return -2; + if (_loading == true) return -2; _loading = true; notifyListeners(); Response response; - Map jsonObject ={}; + Map jsonObject = {}; jsonObject["uid"] = user.id; jsonObject["token"] = user.token; - if(user.department.id != _user.department.id) - jsonObject["department"] = user.department.id; - if(user.whatsApp != _user.whatsApp) - jsonObject["whatsapp"] = user.whatsApp; - if(user.phoneNumber != _user.phoneNumber) - jsonObject["phone"] = user.phoneNumber; - try{ + if (user.department.id != _user.department.id) jsonObject["department"] = user.department.id; + if (user.whatsApp != _user.whatsApp) jsonObject["whatsapp"] = user.whatsApp; + if (user.phoneNumber != _user.phoneNumber) jsonObject["phone"] = user.phoneNumber; + try { response = response = await ApiManager.instance.post( URLs.login, body: jsonObject, ); - } catch(error) { + } catch (error) { _loading = false; notifyListeners(); return -1; @@ -147,7 +140,7 @@ class UserProvider extends ChangeNotifier{ _loading = false; notifyListeners(); - if(response.statusCode >= 200 && response.statusCode < 300) { + if (response.statusCode >= 200 && response.statusCode < 300) { // client's request was successfully received _user = User.fromJson(jsonDecode(utf8.decode(response.bodyBytes))[0]); _user.hospital = user.hospital; @@ -157,5 +150,4 @@ class UserProvider extends ChangeNotifier{ } return response.statusCode; } - -} \ No newline at end of file +} diff --git a/lib/views/pages/login.dart b/lib/views/pages/login.dart index 4d872ac9..3bd061b0 100644 --- a/lib/views/pages/login.dart +++ b/lib/views/pages/login.dart @@ -13,8 +13,6 @@ import 'package:test_sa/views/widgets/app_text_form_field.dart'; import 'package:test_sa/views/widgets/buttons/app_button.dart'; import 'package:test_sa/views/widgets/loaders/loading_manager.dart'; -import '../widgets/buttons/app_outlined_button.dart'; - class Login extends StatefulWidget { static final String id = "/login"; @@ -115,16 +113,17 @@ class _LoginState extends State { user: _user, host: _settingProvider.host, ); - if (status >= 200 && status < 300) { + if (status >= 200 && status < 300 && _userProvider.user?.userName != null) { _settingProvider.setUser(_userProvider.user); - // if (_userProvider.user.isActive) - Navigator.of(context).pushNamed(LandPage.id); - // else - // Fluttertoast.showToast(msg: _subtitle.activationAlert); + // if (_userProvider.user.isActive) + Navigator.of(context).pushNamed(LandPage.id); + // else + // Fluttertoast.showToast(msg: _subtitle.activationAlert); } else { - if(status >= 400 && status < 500) return; + if (status >= 400 && status < 500) return; - String errorMessage = status == 400 ? _subtitle.wrongEmailOrPassword : HttpStatusManger.getStatusMessage(status: status, subtitle: _subtitle); + String errorMessage = + status == 400 || _userProvider.user?.userName == null ? _subtitle.wrongEmailOrPassword : HttpStatusManger.getStatusMessage(status: status, subtitle: _subtitle); ScaffoldMessenger.of(context).showSnackBar(SnackBar( content: Text(errorMessage), )); diff --git a/lib/views/pages/user/land_page.dart b/lib/views/pages/user/land_page.dart index 096e3009..d0ff700a 100644 --- a/lib/views/pages/user/land_page.dart +++ b/lib/views/pages/user/land_page.dart @@ -182,7 +182,7 @@ class _LandPageState extends State { // Navigator.of(context).pushNamed(PreventiveMaintenanceVisitsPage.id); // }, // ), - if (_userProvider.user.type != UsersTypes.engineer) + if (_userProvider.user != null && _userProvider.user.type != UsersTypes.engineer) LandPageItem( text: "Request Gas Refill", icon: FontAwesomeIcons.truckFast, From a33e4f4b7df0481e218449812ae4f3084ff3e2d1 Mon Sep 17 00:00:00 2001 From: zaid_daoud Date: Mon, 15 May 2023 10:29:37 +0300 Subject: [PATCH 021/181] Preventive Maintenance Search Issue Fixed --- ...reventive_maintenance_visits_provider.dart | 54 ++++++++----------- 1 file changed, 21 insertions(+), 33 deletions(-) diff --git a/lib/controllers/providers/api/preventive_maintenance_visits_provider.dart b/lib/controllers/providers/api/preventive_maintenance_visits_provider.dart index feb64cd4..70078a33 100644 --- a/lib/controllers/providers/api/preventive_maintenance_visits_provider.dart +++ b/lib/controllers/providers/api/preventive_maintenance_visits_provider.dart @@ -9,13 +9,12 @@ import 'package:test_sa/models/visits/visit.dart'; import 'package:test_sa/models/visits/visits_group.dart'; import 'package:test_sa/models/visits/visits_search.dart'; -class PreventiveMaintenanceVisitsProvider extends ChangeNotifier{ - +class PreventiveMaintenanceVisitsProvider extends ChangeNotifier { // number of items call in each request final pageItemNumber = 50; //reset provider data - void reset(){ + void reset() { visits = null; nextPage = true; stateCode = null; @@ -44,47 +43,37 @@ class PreventiveMaintenanceVisitsProvider 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 getVisits ({ + Future getVisits({ @required String host, @required User user, - // VisitsSearch visitsSearch, + // VisitsSearch visitsSearch, }) async { - if(isLoading == true) - return -2; + if (isLoading == true) return -2; isLoading = true; Response response; //userId = 397.toString(); // testing id to view data - try{ + try { response = await get( Uri.parse( - host + URLs.getPreventiveMaintenanceVisits - +"?uid=${user.id}" - "&token=${user.token}" - "&page=${(visits?.length ?? 0) ~/pageItemNumber}" - // +visitsSearch?.toMap() ?? "" + "${host + URLs.getPreventiveMaintenanceVisits}?uid=${user.id}&token=${user.token}&page=${(visits?.length ?? 0) ~/ pageItemNumber}${visitsSearch?.toMap()}", ), - headers: { - "Content-Type":"application/json; charset=utf-8" - } - ); - } catch(error) { + headers: {"Content-Type": "application/json; charset=utf-8"}); + } catch (error) { isLoading = false; stateCode = -1; notifyListeners(); return -1; } stateCode = response.statusCode; - if(response.statusCode >= 200 && response.statusCode < 300) { + if (response.statusCode >= 200 && response.statusCode < 300) { // client's request was successfully received List requestsListJson = json.decode(utf8.decode(response.bodyBytes)); - List _visits = requestsListJson.map( - (request) => Visit.fromJson(request)).toList(); - if(visits == null) - visits = []; + List _visits = requestsListJson.map((request) => Visit.fromJson(request)).toList(); + if (visits == null) visits = []; visits.addAll(_visits); - if(_visits.length == pageItemNumber){ + if (_visits.length == pageItemNumber) { nextPage = true; - }else{ + } else { nextPage = false; } } @@ -98,22 +87,21 @@ class PreventiveMaintenanceVisitsProvider 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 updateGroupOfVisits ({ + Future updateGroupOfVisits({ @required String host, @required User user, VisitsGroup group, }) async { Response response; - Map body = group.toJson(); + Map body = group.toJson(); // body["token"] = user.token ?? ""; // body["uid"] = user.id; //userId = 397.toString(); // testing id to view data - try{ - response = await ApiManager.instance.put( - URLs.updatePreventiveMaintenanceVisits, body: body); + try { + response = await ApiManager.instance.put(URLs.updatePreventiveMaintenanceVisits, body: body); stateCode = response.statusCode; - if(response.statusCode >= 200 && response.statusCode < 300) { + if (response.statusCode >= 200 && response.statusCode < 300) { // client's request was successfully received // group.visits.forEach((visit) { // visit.status = group.status; @@ -124,11 +112,11 @@ class PreventiveMaintenanceVisitsProvider extends ChangeNotifier{ } return response.statusCode; - } catch(error) { + } catch (error) { isLoading = false; stateCode = -1; notifyListeners(); return -1; } } -} \ No newline at end of file +} From e25dc22bd0232e3d063dc80bc0f075facfc35129 Mon Sep 17 00:00:00 2001 From: zaid_daoud Date: Tue, 16 May 2023 09:11:27 +0300 Subject: [PATCH 022/181] Enhancements --- ...reventive_maintenance_visits_provider.dart | 2 +- .../api/service_requests_provider.dart | 246 +++++++----------- lib/models/service_report.dart | 183 +++++++------ 3 files changed, 201 insertions(+), 230 deletions(-) diff --git a/lib/controllers/providers/api/preventive_maintenance_visits_provider.dart b/lib/controllers/providers/api/preventive_maintenance_visits_provider.dart index 70078a33..59bf347a 100644 --- a/lib/controllers/providers/api/preventive_maintenance_visits_provider.dart +++ b/lib/controllers/providers/api/preventive_maintenance_visits_provider.dart @@ -11,7 +11,7 @@ import 'package:test_sa/models/visits/visits_search.dart'; class PreventiveMaintenanceVisitsProvider extends ChangeNotifier { // number of items call in each request - final pageItemNumber = 50; + final pageItemNumber = 10; //reset provider data void reset() { diff --git a/lib/controllers/providers/api/service_requests_provider.dart b/lib/controllers/providers/api/service_requests_provider.dart index adb8212a..d80faed3 100644 --- a/lib/controllers/providers/api/service_requests_provider.dart +++ b/lib/controllers/providers/api/service_requests_provider.dart @@ -14,13 +14,12 @@ import 'package:test_sa/models/subtitle.dart'; import 'package:test_sa/models/timer_model.dart'; import 'package:test_sa/models/user.dart'; -class ServiceRequestsProvider extends ChangeNotifier{ - +class ServiceRequestsProvider extends ChangeNotifier { // number of items call in each request - final pageItemNumber = 50; + final pageItemNumber = 10; //reset provider data - void reset(){ + void reset() { serviceRequests = null; nextPage = true; stateCode = null; @@ -49,20 +48,19 @@ 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 ({ + Future getRequests({ @required String host, @required User user, @required int hospitalId, }) async { - if(isLoading == true) - return -2; + if (isLoading == true) return -2; isLoading = true; - if(serviceRequests == null) notifyListeners(); + if (serviceRequests == null) notifyListeners(); Response response; - try{ - Map body = {}; + try { + Map body = {}; body.addAll(search.toMap()); - body["pageNumber"] = (serviceRequests?.length ?? 0) ~/pageItemNumber + 1; + body["pageNumber"] = (serviceRequests?.length ?? 0) ~/ pageItemNumber + 1; body["pageSize"] = pageItemNumber; response = await ApiManager.instance.post( @@ -71,30 +69,27 @@ class ServiceRequestsProvider extends ChangeNotifier{ ); stateCode = response.statusCode; - if(response.statusCode >= 200 && response.statusCode < 300) { + if (response.statusCode >= 200 && response.statusCode < 300) { // client's request was successfully received List requestsListJson = json.decode(response.body)["data"]; - List serviceRequestsPage = requestsListJson.map( - (request) => ServiceRequest.fromJson(request)).toList(); + List serviceRequestsPage = requestsListJson.map((request) => ServiceRequest.fromJson(request)).toList(); serviceRequests ??= []; serviceRequests.addAll(serviceRequestsPage); - if(serviceRequestsPage.length == pageItemNumber){ + if (serviceRequestsPage.length == pageItemNumber) { nextPage = true; - }else{ + } else { nextPage = false; } } isLoading = false; notifyListeners(); return response.statusCode; - - } catch(error) { + } catch (error) { isLoading = false; stateCode = -1; notifyListeners(); return -1; } - } Future getSingleServiceRequest({ @@ -104,115 +99,93 @@ class ServiceRequestsProvider extends ChangeNotifier{ @required Subtitle subtitle, }) async { String userData = ''; - if(user != null){ - userData += "&uid="+user.id; - userData += "&token="+user.token; + 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)); + 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 (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)); + } else { + throw (HttpStatusManger.getStatusMessage(status: response.statusCode, subtitle: subtitle)); } - } - Future createRequest ({ + Future createRequest({ @required String host, @required User user, @required ServiceRequest serviceRequest, }) async { - var body = { - "callCreatedBy": { - "id":user.id, - "name":user.userName - }, - "assets":serviceRequest.deviceId == null ? [] : [serviceRequest.deviceId], + "callCreatedBy": {"id": user.id, "name": user.userName}, + "assets": serviceRequest.deviceId == null ? [] : [serviceRequest.deviceId], "requestedDate": DateTime.now().toIso8601String(), "requestedTime": DateTime.now().toIso8601String(), "client": user.hospital?.id ?? '', "callComments": serviceRequest.maintenanceIssue, - "attachmentsCallRequest": serviceRequest.devicePhotos.map((e) => {"name":e}).toList(), + "attachmentsCallRequest": serviceRequest.devicePhotos.map((e) => {"name": e}).toList(), "priority": serviceRequest.priority.toMap(), "defectType": serviceRequest.defectType.toMap(), - "typeofRequest":serviceRequest.type.toMap(), - "requestedThrough":serviceRequest.type.toMap(), + "typeofRequest": serviceRequest.type.toMap(), + "requestedThrough": serviceRequest.type.toMap(), }; - if(serviceRequest.audio != null){ + if (serviceRequest.audio != null) { body["voiceNote"] = serviceRequest.audio; } Response response; - try{ - response = await ApiManager.instance.post( - URLs.createRequest, - body: body - ); + try { + response = await ApiManager.instance.post(URLs.createRequest, body: body); stateCode = response.statusCode; - if(response.statusCode >= 200 && response.statusCode < 300) { - if(serviceRequests != null) - serviceRequests.insert( - 0, - ServiceRequest.fromJson( - json.decode(utf8.decode(response.bodyBytes))[0] - ) - ); + if (response.statusCode >= 200 && response.statusCode < 300) { + if (serviceRequests != null) serviceRequests.insert(0, ServiceRequest.fromJson(json.decode(utf8.decode(response.bodyBytes))[0])); notifyListeners(); } return response.statusCode; - - } catch(error) { + } catch (error) { return -1; } - } - Future createIssueReport ({ + Future createIssueReport({ @required String host, @required User user, @required Issue issue, }) async { Response response; - Map body = issue.toMap(); + Map body = issue.toMap(); body["uid"] = user.id; body["token"] = user.token; - try{ + try { response = await post( - Uri.parse(host+URLs.createReport), + Uri.parse(host + URLs.createReport), body: body, ); stateCode = response.statusCode; - if(response.statusCode >= 200 && response.statusCode < 300) { - - } + if (response.statusCode >= 200 && response.statusCode < 300) {} return response.statusCode; - - } catch(error) { + } catch (error) { return -1; } - } - Future updateDate ({ + Future updateDate({ @required String host, @required User user, @required String newDate, @@ -220,49 +193,43 @@ class ServiceRequestsProvider extends ChangeNotifier{ @required ServiceRequest request, }) async { Response response; - Map body = {}; + Map body = {}; body["uid"] = user.id; body["token"] = user.token; body["nid"] = request.id; - if(newDate != null) body["date"] = newDate; - if(employee != null) body["ass_emp"] = employee.id.toString(); - try{ + if (newDate != null) body["date"] = newDate; + if (employee != null) body["ass_emp"] = employee.id.toString(); + try { response = await post( - Uri.parse( - //host+ - URLs.updateRequestDate - ), + Uri.parse( + //host+ + URLs.updateRequestDate), body: body, ); stateCode = response.statusCode; - if(response.statusCode >= 200 && response.statusCode < 300) { + if (response.statusCode >= 200 && response.statusCode < 300) { request.engineerName = employee.name; notifyListeners(); } return response.statusCode; - - } catch(error) { + } catch (error) { return -1; } - } - Future createServiceReport ({ + Future createServiceReport({ @required String host, @required User user, @required ServiceReport report, @required ServiceRequest request, }) async { Response response; - - try{ - Map body = report.toMap(request); + try { + Map body = report.toMap(request); // body["uid"] = user.id; // body["token"] = user.token; - response = await ApiManager.instance.post( - URLs.createServiceReport, - body: body - ); + response = await ApiManager.instance.post(URLs.createServiceReport, body: body); + print(response.body); // response = await post( // Uri.parse( // host+URLs.createServiceReport), @@ -270,54 +237,46 @@ class ServiceRequestsProvider extends ChangeNotifier{ // ); stateCode = response.statusCode; - if(response.statusCode >= 200 && response.statusCode < 300) { + if (response.statusCode >= 200 && response.statusCode < 300) { reset(); notifyListeners(); } return response.statusCode; - - } catch(error) { + } catch (error) { return -1; } - } - Future createDuplicatedReport ({ + 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; + if (user != null) { + userData += "&uid=" + user.id; + userData += "&token=" + user.token; } - try{ + try { response = await get( - Uri.parse( - host+URLs.createDuplicatedReport - +"?nid=${request.id}" - +userData), + Uri.parse(host + URLs.createDuplicatedReport + "?nid=${request.id}" + userData), ); stateCode = response.statusCode; - if(response.statusCode >= 200 && response.statusCode < 300) { + if (response.statusCode >= 200 && response.statusCode < 300) { reset(); notifyListeners(); } return response.statusCode; - - } catch(error) { - + } catch (error) { return -1; } - } - Future updateServiceReport ({ + Future updateServiceReport({ @required String host, @required User user, @required ServiceReport report, @@ -329,14 +288,11 @@ class ServiceRequestsProvider extends ChangeNotifier{ // body["token"] = user.token; // body["job_id"] = request.id; // body["report_id"] = request.reportID; - try{ - Map body = report.toMap(request); + try { + Map body = report.toMap(request); // body["uid"] = user.id; // body["token"] = user.token; - response = await ApiManager.instance.put( - URLs.updateServiceReport, - body: body - ); + response = await ApiManager.instance.put(URLs.updateServiceReport, body: body); // response = await post( // Uri.parse( // host+URLs.updateServiceReport), @@ -344,52 +300,46 @@ class ServiceRequestsProvider extends ChangeNotifier{ // ); // stateCode = response.statusCode; - if(response.statusCode >= 200 && response.statusCode < 300) { + if (response.statusCode >= 200 && response.statusCode < 300) { reset(); notifyListeners(); } return response.statusCode; - - } catch(error) { + } catch (error) { return -1; } - } - Future updateServiceReportTimer ({ + Future updateServiceReportTimer({ @required String host, @required User user, @required TimerModel timer, @required ServiceRequest request, }) async { Response response; - Map body = {}; + 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["end_time"] = (timer.endAt.millisecondsSinceEpoch / 1000).toStringAsFixed(0); body["working_hours"] = (timer.durationInSecond / 60 / 60).toStringAsFixed(5); body["report_id"] = request.reportID; - try{ + try { response = await post( - Uri.parse( - host+URLs.updateServiceReport), + Uri.parse(host + URLs.updateServiceReport), body: body, ); //stateCode = response.statusCode; - if(response.statusCode >= 200 && response.statusCode < 300) { + if (response.statusCode >= 200 && response.statusCode < 300) { // reset(); // notifyListeners(); } return response.statusCode; - - } catch(error) { - + } catch (error) { return -1; } - } Future getSingleServiceReport({ @@ -398,29 +348,21 @@ class ServiceRequestsProvider extends ChangeNotifier{ @required User user, @required Subtitle subtitle, }) async { - Response response; - try{ + try { response = await ApiManager.instance.get( URLs.getServiceReport + "?workOrderId=$reportId", - ); - - }catch(error){ - throw(HttpStatusManger.getStatusMessage( - status: -1, subtitle: subtitle)); + ); + } 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 (response.statusCode >= 200 && response.statusCode < 300) { // If the call to the server was successful, parse the JSON. - return ServiceReport.fromJson( - json.decode(response.body)["data"],reportId); - }else{ - throw(HttpStatusManger.getStatusMessage( - status: response.statusCode, subtitle: subtitle)); + return ServiceReport.fromJson(json.decode(response.body)["data"], reportId); + } else { + throw (HttpStatusManger.getStatusMessage(status: response.statusCode, subtitle: subtitle)); } - } - - -} \ No newline at end of file +} diff --git a/lib/models/service_report.dart b/lib/models/service_report.dart index 7016d0d6..af66ca77 100644 --- a/lib/models/service_report.dart +++ b/lib/models/service_report.dart @@ -36,99 +36,133 @@ class ServiceReport { Uint8List localNurseSignature; Uint8List localEngineerSignature; - ServiceReport({ - this.id, - this.visitDate, - this.endDate, - this.assetType, - this.status, - this.type, - this.faultDescriptionId, - //this.workHours, - this.travelingHours, - this.parts, - this.engineer, - this.workPreformed, - this.reason, - this.operatingHours, - this.callLastSituation, - this.jobSheetNumber, - this.image, - this.device, - this.invoiceCode, - this.invoiceNumber, - this.quantity = "1", - this.timer, - this.signatureNurse, - this.signatureEngineer, - this.localNurseSignature, - this.localEngineerSignature - }); + ServiceReport( + {this.id, + this.visitDate, + this.endDate, + this.assetType, + this.status, + this.type, + this.faultDescriptionId, + //this.workHours, + this.travelingHours, + this.parts, + this.engineer, + this.workPreformed, + this.reason, + this.operatingHours, + this.callLastSituation, + this.jobSheetNumber, + this.image, + this.device, + this.invoiceCode, + this.invoiceNumber, + this.quantity = "1", + this.timer, + this.signatureNurse, + this.signatureEngineer, + this.localNurseSignature, + this.localEngineerSignature}); - Map toMap(ServiceRequest request){ - Map _map = {}; - if(id != null) _map["id"] = id; - if(visitDate != null) _map["visitDate"] = visitDate.toIso8601String(); + Map toMap(ServiceRequest request) { + Map _map = {}; + if (id != null) _map["id"] = id; + if (visitDate != null) _map["visitDate"] = visitDate.toIso8601String(); //if(serviceType != null) _map["service_type"] = serviceType.id.toString(); - if(status != null) _map["status"] = status?.toMap(); - if(type != null) _map["typeOfWO"] = type?.toMap(); - if(assetType != null) _map["TypeOfWO"] = assetType?.toMap(); + if (status != null) _map["status"] = status?.toMap(); + if (type != null) _map["typeOfWO"] = type?.toMap(); + if (assetType != null) _map["TypeOfWO"] = assetType?.toMap(); //if(faultDescriptionId != null && faultDescriptionId.isNotEmpty) _map["fault_description"] = faultDescriptionId; //if(workHours != null && workHours.isNotEmpty) _map["working_hours"] = workHours; - if(timer != null){ + if (timer != null) { _map["startofWorkTime"] = timer.startAt.toIso8601String(); - _map["endofWorkTime"] = (timer.endAt ?? DateTime.now()).toIso8601String(); + _map["endofWorkTime"] = (timer.endAt ?? DateTime.now()).toIso8601String(); _map["workingHours"] = (timer.durationInSecond / 60 / 60).toStringAsFixed(5); } - if(travelingHours != null && travelingHours.isNotEmpty) _map["traveling_hours"] = travelingHours; + if (travelingHours != null && travelingHours.isNotEmpty) _map["traveling_hours"] = travelingHours; // if(workPreformed != null && workPreformed.isNotEmpty){ // _map["faultDescription"] = { // //"id":faultDescriptionId ?? 0, // "workPerformed":workPreformed // }; // } - if(jobSheetNumber != null && jobSheetNumber.isNotEmpty) _map["job_sheet_no"] = jobSheetNumber; - if(parts != null && parts.isNotEmpty){ + if (jobSheetNumber != null && jobSheetNumber.isNotEmpty) _map["job_sheet_no"] = jobSheetNumber; + if (parts != null && parts.isNotEmpty) { _map["sparePartsWorkOrders"] = parts.map((e) => e.toJson()).toList(); } - if(device != null && device.id != null){ + if (device != null && device.id != null) { _map["callRequest"] = { - "id":request.id, - "asset":device?.toMap(assetType), + "id": request.id, + "asset": device?.toMap(assetType), }; _map["callRequest"]["asset"]["invoiceNumber"] = invoiceNumber; } _map["AssignedEmployee"] = engineer?.toMap(); //if(quantity != null && quantity.isNotEmpty) _map["qty"] = quantity; //if(endDate != null) _map["end_date"] = (endDate.millisecondsSinceEpoch ~/ 1000).toString(); - if(reason != null) _map["reason"] = reason.toMap(); + if (reason != null) _map["reason"] = reason.toMap(); //if(operatingHours != null && operatingHours.isNotEmpty) _map["operation_hours"] = operatingHours; - if(callLastSituation != null) _map["calllastSituation"] = callLastSituation.toMap(); + if (callLastSituation != null) _map["calllastSituation"] = callLastSituation.toMap(); //if(image != null) _map["image"] = image; //if(invoiceCode != null) _map["invoice_no"] = invoiceCode; //if(invoiceNumber != null) _map["invoice_code"] = invoiceNumber; - if(image != null){ - _map["attachmentsWorkOrder"]=[{ - "name":image - }]; + if (image != null) { + _map["attachmentsWorkOrder"] = [ + {"name": image} + ]; } _map["nurseSignature"] = signatureNurse; _map["engSignature"] = signatureEngineer; + + // ///TODO : zaid + // _map["supplier"] = { + // "id": 0, + // "suppliername": "string", + // "name": "string", + // "website": "string", + // "email": "string", + // "code": "string", + // "suppNo": 0, + // "suppStatusId": 0, + // "cityId": 0, + // "person": "string", + // "comment": "string", + // "zipcode": 0, + // "contact": "string", + // "telephones": [ + // {"id": 0, "supplierId": 0, "telephone": "string"} + // ], + // "faxes": [ + // {"id": 0, "supplierId": 0, "fax": "string"} + // ], + // "addresses": [ + // {"id": 0, "supplierId": 0, "address": "string"} + // ], + // "attachments": [ + // {"id": 0, "supplierId": 0, "attachmentName": "string", "attachmentURL": "string"} + // ], + // "suppPersons": [ + // {"id": 0, "supplierId": 0, "personName": "string", "personRoleId": 0, "contact": "string", "externalEngCode": "string", "email": "string"} + // ], + // "suppTCodes": [ + // {"id": 0, "supplierId": 0, "codeTypeId": 0, "codeValue": "string"} + // ] + // }; return _map; } - bool validate(){ - if(visitDate == null) return false; + bool validate() { + if (visitDate == null) return false; //if(serviceType == null) return false; - if(status == null) return false; - if(type == null && assetType==null) return false; - if(engineer == null) return false; - if(callLastSituation == null) return false; - if(callLastSituation?.value == 12){ - // if(invoiceCode != null || invoiceCode?.isEmpty == true) return false; - if(invoiceNumber != null || invoiceNumber?.isEmpty== true ) return false; + if (status == null) return false; + if (type == null && assetType == null) return false; + if (engineer == null) return false; + if (callLastSituation == null) return false; + if (callLastSituation?.value == 12) { + // if(invoiceCode != null || invoiceCode?.isEmpty == true) return false; + if (invoiceNumber != null || invoiceNumber?.isEmpty == true) return false; } - if(parts == null) return false; + if (parts == null) return false; //if(endDate == null) return false; //if(reason == null) return false; //todo uncoment this line @@ -138,16 +172,14 @@ class ServiceReport { return true; } - factory ServiceReport.fromJson(Map parsedJson,int id){ - List _parts = []; - if(parsedJson["sparePartsWorkOrders"] != null){ - if(parsedJson["sparePartsWorkOrders"][0]["id"] != null){ - List partsList = parsedJson["sparePartsWorkOrders"]; - _parts = partsList.map((e) => Part.fromJson( - e["sparePart"],reportJson: e)).toList(); - } - + factory ServiceReport.fromJson(Map parsedJson, int id) { + List _parts = []; + if (parsedJson["sparePartsWorkOrders"] != null) { + if (parsedJson["sparePartsWorkOrders"][0]["id"] != null) { + List partsList = parsedJson["sparePartsWorkOrders"]; + _parts = partsList.map((e) => Part.fromJson(e["sparePart"], reportJson: e)).toList(); } + } return ServiceReport( id: id, assetType: Lookup.fromJson(parsedJson["assetType"]), @@ -156,7 +188,7 @@ class ServiceReport { status: Lookup.fromJson(parsedJson["status"]), type: Lookup.fromJson(parsedJson["typeOfWO"]), //faultDescriptionId: parsedJson["fault_description"], - endDate:DateTime.tryParse(parsedJson["endofWorkTime"]), + endDate: DateTime.tryParse(parsedJson["endofWorkTime"]), //invoiceCode: parsedJson["invoice_code"], //invoiceNumber: parsedJson["invoice_no"], //jobSheetNumber: parsedJson["job_sheet_no"], @@ -168,14 +200,11 @@ class ServiceReport { visitDate: DateTime.tryParse(parsedJson["visitDate"]), //workHours: parsedJson["working_hours"], timer: TimerModel( - startAt: DateTime.tryParse(parsedJson["startofWorkTime"]), - endAt: DateTime.tryParse(parsedJson["endofWorkTime"]), - durationInSecond: ((parsedJson["workingHours"] ?? 0) * 60 *60).toInt() - ), + startAt: DateTime.tryParse(parsedJson["startofWorkTime"]), endAt: DateTime.tryParse(parsedJson["endofWorkTime"]), durationInSecond: ((parsedJson["workingHours"] ?? 0) * 60 * 60).toInt()), //workPreformed: parsedJson["work_performed"], - device: Device.fromJson(parsedJson["callRequest"]["asset"]), - signatureNurse: URLs.getFileUrl(parsedJson["nurseSignature"]) , - signatureEngineer:URLs.getFileUrl(parsedJson["engSignature"]), + device: Device.fromJson(parsedJson["callRequest"]["asset"]), + signatureNurse: URLs.getFileUrl(parsedJson["nurseSignature"]), + signatureEngineer: URLs.getFileUrl(parsedJson["engSignature"]), ); } @@ -183,4 +212,4 @@ class ServiceReport { // return date == null || date.isEmpty // ? null : DateTime.fromMillisecondsSinceEpoch(int.tryParse(date) * 1000); // } -} \ No newline at end of file +} From 048774bd8cbef5508e86eed14ae31a253ff1f696 Mon Sep 17 00:00:00 2001 From: zaid_daoud Date: Tue, 16 May 2023 11:00:26 +0300 Subject: [PATCH 023/181] Enhancements --- lib/controllers/api_routes/urls.dart | 12 +++---- .../api/service_requests_provider.dart | 18 +++++----- lib/models/device/device.dart | 21 +++++------ lib/models/service_report.dart | 35 ------------------- 4 files changed, 21 insertions(+), 65 deletions(-) diff --git a/lib/controllers/api_routes/urls.dart b/lib/controllers/api_routes/urls.dart index cf4849fd..65c8935d 100644 --- a/lib/controllers/api_routes/urls.dart +++ b/lib/controllers/api_routes/urls.dart @@ -1,4 +1,4 @@ -class URLs{ +class URLs { URLs._(); static const host2 = "http://194.163.164.213/atoms/api"; static const host1 = "https://atomsuat.hmg.com"; // uat url @@ -11,8 +11,7 @@ class URLs{ set host(String value) => _host = value; - static String getFileUrl(String file) => file == null || file.isEmpty - ? null : "$_host/attachment/$file"; + static String getFileUrl(String file) => file == null || file.isEmpty ? null : "$_host/attachment/$file"; // API Routes static get login => "$_baseUrl/MobileAuth/Login"; // post @@ -39,7 +38,7 @@ class URLs{ static get getRecentNotifications => "$_baseUrl/return/user/recent/notification"; // get static get createRequest => "$_baseUrl/CallRequest/AddCallRequest"; // get static get createReport => "$_baseUrl/handle/create/report/issue"; // get - static get updateRequestDate => "$_baseUrl/handle/update/request"; // get + static get updateRequestDate => "$_baseUrl/CallRequest/UpdateCallRequest"; // get // service report static get createServiceReport => "$_baseUrl/WorkOrder/AddWorkOrder"; // get @@ -47,7 +46,7 @@ class URLs{ static get getServiceReport => "$_baseUrl/WorkOrder/GetWorkOrderById"; // get static get createDuplicatedReport => "$_baseUrl/handle/duplicate/request"; // get - static get getServiceReportReasons => "$_baseUrl/Lookups/GetLookup?lookupEnum=522"; // get + static get getServiceReportReasons => "$_baseUrl/Lookups/GetLookup?lookupEnum=522"; // get static get getServiceReportTypes => "$_baseUrl/Lookups/GetLookup?lookupEnum=501"; // get static get getServiceReportStatus => "$_baseUrl/Lookups/GetLookup?lookupEnum=521"; // get static get getServiceReportLastCalls => "$_baseUrl/Lookups/GetLookup?lookupEnum=520"; // get @@ -83,5 +82,4 @@ class URLs{ static get getPentryStatus => "$_baseUrl/Lookups/GetLookup?lookupEnum=401"; // get // contacts static get getPentryContacts => "$_baseUrl/handle/return/all/contacts"; // get - -} \ No newline at end of file +} diff --git a/lib/controllers/providers/api/service_requests_provider.dart b/lib/controllers/providers/api/service_requests_provider.dart index d80faed3..59062251 100644 --- a/lib/controllers/providers/api/service_requests_provider.dart +++ b/lib/controllers/providers/api/service_requests_provider.dart @@ -193,17 +193,15 @@ class ServiceRequestsProvider extends ChangeNotifier { @required ServiceRequest request, }) async { Response response; - Map body = {}; - body["uid"] = user.id; - body["token"] = user.token; - body["nid"] = request.id; - if (newDate != null) body["date"] = newDate; - if (employee != null) body["ass_emp"] = employee.id.toString(); + var body = { + "callCreatedBy": {"id": user.id, "name": user.userName}, + "assets": request.deviceId == null ? [] : [request.deviceId], + "requestedDate": newDate, + "requestedTime": newDate, + }; try { - response = await post( - Uri.parse( - //host+ - URLs.updateRequestDate), + response = await ApiManager.instance.put( + URLs.updateRequestDate, body: body, ); stateCode = response.statusCode; diff --git a/lib/models/device/device.dart b/lib/models/device/device.dart index 5bcecd50..001289e2 100644 --- a/lib/models/device/device.dart +++ b/lib/models/device/device.dart @@ -3,7 +3,7 @@ import 'package:test_sa/models/lookup.dart'; import 'model.dart'; -class Device{ +class Device { int id; String serialNumber; String number; @@ -12,7 +12,6 @@ class Device{ ModelDefinition modelDefinition; Hospital hospital; - Device({ this.id, this.serialNumber, @@ -21,20 +20,15 @@ class Device{ // this.brand, // this.model, this.modelDefinition, - }); - - - - factory Device.fromJson(Map parsedJson){ - + factory Device.fromJson(Map parsedJson) { return Device( id: parsedJson["id"], serialNumber: parsedJson["assetSerialNo"], number: parsedJson["assetNumber"], - modelDefinition:ModelDefinition.fromJson(parsedJson["modelDefinition"]), - hospital:Hospital.fromJson(parsedJson["site"]), + modelDefinition: ModelDefinition.fromJson(parsedJson["modelDefinition"]), + hospital: Hospital.fromJson(parsedJson["site"]), // parsedJson["modelDefinition"] == null ? "" : // parsedJson["modelDefinition"]["manufacturerName"], // model: parsedJson["modelDefinition"] == null ? "" : @@ -42,7 +36,7 @@ class Device{ ); } - factory Device.fromDevice(Device device){ + factory Device.fromDevice(Device device) { return Device( id: device.id, serialNumber: device.serialNumber, @@ -59,7 +53,8 @@ class Device{ 'assetNumber': number, 'modelDefinition': modelDefinition.toJson(), 'site': hospital.toMap(), - 'AssetType':assetType.toMap(), + 'AssetType': assetType.toMap(), + "supplier": {"id": 0, "suppliername": "string"}, }; } -} \ No newline at end of file +} diff --git a/lib/models/service_report.dart b/lib/models/service_report.dart index af66ca77..8abb1303 100644 --- a/lib/models/service_report.dart +++ b/lib/models/service_report.dart @@ -113,41 +113,6 @@ class ServiceReport { } _map["nurseSignature"] = signatureNurse; _map["engSignature"] = signatureEngineer; - - // ///TODO : zaid - // _map["supplier"] = { - // "id": 0, - // "suppliername": "string", - // "name": "string", - // "website": "string", - // "email": "string", - // "code": "string", - // "suppNo": 0, - // "suppStatusId": 0, - // "cityId": 0, - // "person": "string", - // "comment": "string", - // "zipcode": 0, - // "contact": "string", - // "telephones": [ - // {"id": 0, "supplierId": 0, "telephone": "string"} - // ], - // "faxes": [ - // {"id": 0, "supplierId": 0, "fax": "string"} - // ], - // "addresses": [ - // {"id": 0, "supplierId": 0, "address": "string"} - // ], - // "attachments": [ - // {"id": 0, "supplierId": 0, "attachmentName": "string", "attachmentURL": "string"} - // ], - // "suppPersons": [ - // {"id": 0, "supplierId": 0, "personName": "string", "personRoleId": 0, "contact": "string", "externalEngCode": "string", "email": "string"} - // ], - // "suppTCodes": [ - // {"id": 0, "supplierId": 0, "codeTypeId": 0, "codeValue": "string"} - // ] - // }; return _map; } From 42787e450ee450da2c1ed5996fbba96eed0fbaa9 Mon Sep 17 00:00:00 2001 From: zaid_daoud Date: Tue, 16 May 2023 12:28:55 +0300 Subject: [PATCH 024/181] Enhancements --- lib/models/pantry/pentry.dart | 128 +++++++++++--------------- lib/models/pantry/ppm_check_list.dart | 14 +-- 2 files changed, 63 insertions(+), 79 deletions(-) diff --git a/lib/models/pantry/pentry.dart b/lib/models/pantry/pentry.dart index 0f7e1cfa..82ef9fd6 100644 --- a/lib/models/pantry/pentry.dart +++ b/lib/models/pantry/pentry.dart @@ -9,7 +9,7 @@ import 'package:test_sa/models/pantry/pm_kit.dart'; import 'package:test_sa/models/pantry/ppm_check_list.dart'; import 'package:test_sa/models/timer_model.dart'; -class Pentry{ +class Pentry { Lookup ppmVisitStatus; Lookup status; TimerModel timer; @@ -27,55 +27,50 @@ class Pentry{ Uint8List localNurseSignature; Uint8List localEngineerSignature; - Pentry({ - this.travelingHours, - this.timer, - this.status, - this.ppmVisitStatus, - this.actualVisitDate, - this.expectedVisitDate, - this.image, - this.imageFile, - // this.contacts, - this.ppmCheckLists, - this.calibrationTools, - this.pmKits, - this.signatureNurse, - this.signatureEngineer, - this.localNurseSignature, - this.localEngineerSignature - }); + Pentry( + {this.travelingHours, + this.timer, + this.status, + this.ppmVisitStatus, + this.actualVisitDate, + this.expectedVisitDate, + this.image, + this.imageFile, + // this.contacts, + this.ppmCheckLists, + this.calibrationTools, + this.pmKits, + this.signatureNurse, + this.signatureEngineer, + this.localNurseSignature, + this.localEngineerSignature}); - bool validate(){ - if(actualVisitDate == null) return false; - if(expectedVisitDate == null) return false; - if(timer == null && timer.endAt != null) return false; - if(ppmVisitStatus == null) return false; + bool validate() { + if (actualVisitDate == null) return false; + if (expectedVisitDate == null) return false; + if (timer == null && timer.endAt != null) return false; + if (ppmVisitStatus == null) return false; //if(status == null) return false; return true; } - - Map toMap(int visitId) { Map map = {}; map["visitStatusId"] = ppmVisitStatus?.id.toString(); //if(status != null) map["visitStatusId"] = status?.id.toString(); - if(travelingHours != null) map["travelingHours"] = travelingHours; + if (travelingHours != null) map["travelingHours"] = travelingHours; //if(imageFile != null) map["file_attachement"] = base64Encode(imageFile.readAsBytesSync()); map["actualDate"] = actualVisitDate.toIso8601String(); map["expectedDate"] = expectedVisitDate.toIso8601String(); - if(timer != null){ + if (timer != null) { map["startDate"] = timer.startAt.toIso8601String(); - map["endDate"] = timer.endAt?.toIso8601String() ?? DateTime.now().toIso8601String(); + map["endDate"] = timer.endAt?.toIso8601String() ?? DateTime.now().toIso8601String(); map["workingHours"] = (timer.durationInSecond / 60 / 60).toStringAsFixed(5); } - if(imageFile !=null){ - map["vAttachments"]=[ - { - "attachmentName":(imageFile.path.split("/").last+base64Encode(imageFile.readAsBytesSync())) - } + if (imageFile != null) { + map["vAttachments"] = [ + {"attachmentName": (imageFile.path.split("/").last + base64Encode(imageFile.readAsBytesSync()))} ]; } @@ -89,8 +84,8 @@ class Pentry{ map["vChecklists"] = ppmCheckLists.map((e) => e.toMap(visitId)).toList(); map["vCalibrationTools"] = calibrationTools.map((e) => e.toMap(visitId)).toList(); map["vKits"] = pmKits.map((e) => e.toMap(visitId)).toList(); - map["nurseSignature"] = signatureNurse; - map["engSignature"] = signatureEngineer; + map["nurseSignature"] = "${DateTime.now().toIso8601String()}.png|$signatureNurse"; + map["engSignature"] = "${DateTime.now().toIso8601String()}.png|$signatureEngineer"; return map; } @@ -103,42 +98,32 @@ class Pentry{ // } List pmKits = []; - if(map['vKits'] != null){ - pmKits =(map['vKits'] as List) - .map((e) => PMKit.fromMap(e as Map)) - .toList(); + if (map['vKits'] != null) { + pmKits = (map['vKits'] as List).map((e) => PMKit.fromMap(e as Map)).toList(); } List ppmCheckLists = []; - if(map['vChecklists'] != null){ - ppmCheckLists =(map['vChecklists'] as List) - .map((e) => PPMCheckList.fromMap(e as Map)) - .toList(); + if (map['vChecklists'] != null) { + ppmCheckLists = (map['vChecklists'] as List).map((e) => PPMCheckList.fromMap(e as Map)).toList(); } List calibrationTools = []; - if(map['vCalibrationTools'] != null){ - calibrationTools =(map['vCalibrationTools'] as List) - .map((e) => CalibrationTool.fromMap(e as Map)) - .toList(); + if (map['vCalibrationTools'] != null) { + calibrationTools = (map['vCalibrationTools'] as List).map((e) => CalibrationTool.fromMap(e as Map)).toList(); } return Pentry( - status: Lookup(id: map["taskStatusId"],name: map["taskStatusName"]), - ppmVisitStatus: Lookup(id: map["visitStatusId"],name: map["visitStatusName"]), + status: Lookup(id: map["taskStatusId"], name: map["taskStatusName"]), + ppmVisitStatus: Lookup(id: map["visitStatusId"], name: map["visitStatusName"]), actualVisitDate: DateTime.tryParse(map["actualDate"] ?? ""), expectedVisitDate: DateTime.tryParse(map["expectedDate"] ?? ""), travelingHours: map["travelingHours"], - timer: TimerModel( - startAt: DateTime.tryParse(map["startDate"] ?? ""), - endAt: DateTime.tryParse(map["endDate"] ?? ""), - durationInSecond: (int.tryParse(map["workingHours"] ?? "") ?? 0) * 60 *60 - ), + timer: TimerModel(startAt: DateTime.tryParse(map["startDate"] ?? ""), endAt: DateTime.tryParse(map["endDate"] ?? ""), durationInSecond: (int.tryParse(map["workingHours"] ?? "") ?? 0) * 60 * 60), // contacts: contacts, ppmCheckLists: ppmCheckLists, calibrationTools: calibrationTools, pmKits: pmKits, - signatureNurse: URLs.getFileUrl(map["nurseSignature"]) , - signatureEngineer:URLs.getFileUrl(map["engSignature"]), + signatureNurse: URLs.getFileUrl(map["nurseSignature"]), + signatureEngineer: URLs.getFileUrl(map["engSignature"]), ); } @@ -158,19 +143,18 @@ class Pentry{ String signatureEngineer, }) { return Pentry( - ppmVisitStatus: ppmVisitStatus ?? this.ppmVisitStatus, - status: status ?? this.status, - timer: timer ?? this.timer, - actualVisitDate: actualVisitDate ?? this.actualVisitDate, - expectedVisitDate: expectedVisitDate ?? this.expectedVisitDate, - travelingHours: travelingHours ?? this.travelingHours, - image: image ?? this.image, - imageFile: imageFile ?? this.imageFile, - ppmCheckLists: ppmCheckLists ?? this.ppmCheckLists?.map((e) => e.copyWith())?.toList(), - calibrationTools: calibrationTools ?? this.calibrationTools?.map((e) => e.copyWith())?.toList(), - pmKits: pmKits ?? this.pmKits.map((e) => e.copyWith()).toList(), - signatureNurse: signatureNurse ?? this.signatureNurse, - signatureEngineer: signatureEngineer ?? this.signatureEngineer - ); + ppmVisitStatus: ppmVisitStatus ?? this.ppmVisitStatus, + status: status ?? this.status, + timer: timer ?? this.timer, + actualVisitDate: actualVisitDate ?? this.actualVisitDate, + expectedVisitDate: expectedVisitDate ?? this.expectedVisitDate, + travelingHours: travelingHours ?? this.travelingHours, + image: image ?? this.image, + imageFile: imageFile ?? this.imageFile, + ppmCheckLists: ppmCheckLists ?? this.ppmCheckLists?.map((e) => e.copyWith())?.toList(), + calibrationTools: calibrationTools ?? this.calibrationTools?.map((e) => e.copyWith())?.toList(), + pmKits: pmKits ?? this.pmKits.map((e) => e.copyWith()).toList(), + signatureNurse: signatureNurse ?? this.signatureNurse, + signatureEngineer: signatureEngineer ?? this.signatureEngineer); } -} \ No newline at end of file +} diff --git a/lib/models/pantry/ppm_check_list.dart b/lib/models/pantry/ppm_check_list.dart index 3ed03dae..23594b90 100644 --- a/lib/models/pantry/ppm_check_list.dart +++ b/lib/models/pantry/ppm_check_list.dart @@ -1,6 +1,6 @@ import 'package:test_sa/models/lookup.dart'; -class PPMCheckList{ +class PPMCheckList { int id; Lookup status; String title; @@ -19,17 +19,17 @@ class PPMCheckList{ return { 'id': id ?? 0, "visitId": visitId, - if(status != null) 'taskStatusId': status?.id.toString(), - if(title != null) 'task': title, - if(comment != null) 'taskComment': comment, - if(measuredValue != null) 'measuredValue': measuredValue, + if (status != null) 'taskStatusId': status?.id, + if (title != null) 'task': title, + if (comment != null) 'taskComment': comment, + if (measuredValue != null) 'measuredValue': measuredValue, }; } factory PPMCheckList.fromMap(Map map) { return PPMCheckList( id: map['id'] as int, - status: Lookup(id: map["taskStatusId"],name: map["taskStatusName"]), + status: Lookup(id: map["taskStatusId"], name: map["taskStatusName"]), title: map['task'] as String, comment: map['taskComment'] as String, measuredValue: map['measuredValue'] as String, @@ -51,4 +51,4 @@ class PPMCheckList{ measuredValue: measuredValue ?? this.measuredValue, ); } -} \ No newline at end of file +} From 12764a647c4d1e888c36e9349ae2d8e0ecd2a2ff Mon Sep 17 00:00:00 2001 From: nextwo <1234> Date: Tue, 16 May 2023 19:28:03 +0300 Subject: [PATCH 025/181] pagintion + FIX BUGS --- .../providers/api/devices_provider.dart | 24 +++++++++---- .../request_device_transfer.dart | 17 ++++----- .../equipment/single_device_picker.dart | 36 ++++++++++++------- lib/views/widgets/loaders/lazy_loading.dart | 6 ++-- 4 files changed, 52 insertions(+), 31 deletions(-) diff --git a/lib/controllers/providers/api/devices_provider.dart b/lib/controllers/providers/api/devices_provider.dart index 7674b2d7..5bbd281f 100644 --- a/lib/controllers/providers/api/devices_provider.dart +++ b/lib/controllers/providers/api/devices_provider.dart @@ -11,17 +11,19 @@ import 'package:test_sa/models/user.dart'; class DevicesProvider extends ChangeNotifier { //reset provider data void reset() { - _devices = null; + _devices = []; _stateCode = null; } + final pageItemNumber = 10; + bool nextPage = true; // state code of current request to defied error message // like 400 customer request failed // 500 service not available int _stateCode; int get stateCode => _stateCode; - List _devices; + List _devices=[]; List get devices => _devices; // when categories in-process _loading = true @@ -52,7 +54,8 @@ class DevicesProvider extends ChangeNotifier { Response response; try { response = await ApiManager.instance.post(URLs.getEquipment, body: { - "pageSize": 50, + "pageSize": pageItemNumber , + "pageNumber":devices.length ~/ pageItemNumber + 1, "siteId": hospitalId, if (serialNumber?.isEmpty == false) "assetSerialNumber": serialNumber, if (number?.isEmpty == false) "assetNo": number, @@ -67,8 +70,12 @@ class DevicesProvider extends ChangeNotifier { if (response.statusCode >= 200 && response.statusCode < 300) { // client's request was successfully received List equipmentListJson = json.decode(response.body)["data"]; - _devices = equipmentListJson.map((device) => Device.fromJson(device)).toList(); - } + _devices.addAll(equipmentListJson.map((device) => Device.fromJson(device)).toList()); + nextPage = true; + }else + { + nextPage = false; + } _loading = false; notifyListeners(); return response.statusCode; @@ -89,8 +96,9 @@ class DevicesProvider extends ChangeNotifier { Response response; try { response = await ApiManager.instance.post(URLs.getEquipment, body: { - "pageSize": 50, - "siteId": hospitalId, + "pageSize": pageItemNumber, + "pageNumber":devices.length ~/ pageItemNumber + 1, + "siteId": devices.length ~/ pageItemNumber + 1, if (serialNumber?.isEmpty == false) "assetSerialNumber": serialNumber, if (number?.isEmpty == false) "assetNo": number, }); @@ -105,6 +113,8 @@ class DevicesProvider extends ChangeNotifier { // client's request was successfully received List equipmentListJson = json.decode(response.body)["data"]; page = equipmentListJson.map((device) => Device.fromJson(device)).toList(); + _devices.addAll(equipmentListJson.map((device) => Device.fromJson(device)).toList()); + notifyListeners(); } return page; } catch (error) { diff --git a/lib/views/pages/device_transfer/request_device_transfer.dart b/lib/views/pages/device_transfer/request_device_transfer.dart index 6eb86d08..b3beb23f 100644 --- a/lib/views/pages/device_transfer/request_device_transfer.dart +++ b/lib/views/pages/device_transfer/request_device_transfer.dart @@ -68,16 +68,17 @@ class _RequestDeviceTransferState extends State { _isLoading = false; setState(() {}); if (status >= 200 && status < 300) { - Fluttertoast.showToast( - msg: _subtitle.requestCompleteSuccessfully, - ); + // Fluttertoast.showToast( + // msg: _subtitle.requestCompleteSuccessfully, + // ); Navigator.of(context).pop(); - } else { - String errorMessage = HttpStatusManger.getStatusMessage(status: status, subtitle: _subtitle); - ScaffoldMessenger.of(context).showSnackBar(SnackBar( - content: Text(errorMessage), - )); } + // else { + // String errorMessage = HttpStatusManger.getStatusMessage(status: status, subtitle: _subtitle); + // ScaffoldMessenger.of(context).showSnackBar(SnackBar( + // content: Text(errorMessage), + // )); + // } } @override diff --git a/lib/views/widgets/equipment/single_device_picker.dart b/lib/views/widgets/equipment/single_device_picker.dart index a31be4df..03b0d66f 100644 --- a/lib/views/widgets/equipment/single_device_picker.dart +++ b/lib/views/widgets/equipment/single_device_picker.dart @@ -8,6 +8,7 @@ import 'package:test_sa/controllers/providers/settings/setting_provider.dart'; import 'package:test_sa/models/device/device.dart'; import 'package:test_sa/models/subtitle.dart'; import 'package:test_sa/views/widgets/equipment/device_item.dart'; +import 'package:test_sa/views/widgets/loaders/lazy_loading.dart'; import 'package:test_sa/views/widgets/loaders/loading_manager.dart'; import 'package:test_sa/views/widgets/loaders/no_item_found.dart'; import 'package:test_sa/views/widgets/qr/scan_qr.dart'; @@ -74,7 +75,6 @@ class _SingleDevicePickerState extends State { if(_firstTime && _devicesProvider.devices != null){ _searchableList.clear(); _searchableList.addAll(_devicesProvider.devices); - _firstTime = false; } _subtitle = AppLocalization.of(context).subtitle; return Scaffold( @@ -143,19 +143,31 @@ class _SingleDevicePickerState extends State { Expanded( child: _searchableList.isEmpty ? NoItemFound(message: _subtitle.noDeviceFound,): - ListView.builder( - padding: EdgeInsets.zero, - shrinkWrap: true, - itemCount: _searchableList.length, - itemBuilder: (listContext,itemIndex){ - return DeviceItem( - device: _searchableList[itemIndex], - onPressed: (device){ - Navigator.of(context).pop(device); - }, + LazyLoading( + nextPage: _devicesProvider.nextPage, + onLazyLoad: () async { + await _devicesProvider.getDevicesList( + user: _userProvider.user, + host: _settingProvider.host, + hospitalId: _userProvider.user.hospital?.id, + serialNumber: snController.text, + number: numberController.text ); }, - ), + child:ListView.builder( + padding: EdgeInsets.zero, + shrinkWrap: true, + itemCount: _searchableList.length, + itemBuilder: (listContext,itemIndex){ + return DeviceItem( + device: _searchableList[itemIndex], + onPressed: (device){ + Navigator.of(context).pop(device); + }, + ); + }, + ), + ) ), ], ), diff --git a/lib/views/widgets/loaders/lazy_loading.dart b/lib/views/widgets/loaders/lazy_loading.dart index d5e5f2ed..f59871e3 100644 --- a/lib/views/widgets/loaders/lazy_loading.dart +++ b/lib/views/widgets/loaders/lazy_loading.dart @@ -27,12 +27,10 @@ class _LazyLoadingState extends State with TickerProviderStateMixin _scrollListener() async { if (!_animationController.isAnimating && !_animationController.isCompleted && widget.nextPage) { - _animationController.forward(); - setState(() {}); + //_animationController.forward(); await widget.onLazyLoad(); await Future.delayed(Duration(milliseconds: 600)); - setState(() {}); - _animationController.reverse(); + // _animationController.reverse(); } } From 81a6a515c481e9023ec0468fa3ce4b39f54c29a6 Mon Sep 17 00:00:00 2001 From: zaid_daoud Date: Mon, 22 May 2023 10:24:14 +0300 Subject: [PATCH 026/181] Enhancements --- lib/controllers/providers/api/service_requests_provider.dart | 1 + 1 file changed, 1 insertion(+) diff --git a/lib/controllers/providers/api/service_requests_provider.dart b/lib/controllers/providers/api/service_requests_provider.dart index 59062251..5349d1ec 100644 --- a/lib/controllers/providers/api/service_requests_provider.dart +++ b/lib/controllers/providers/api/service_requests_provider.dart @@ -144,6 +144,7 @@ class ServiceRequestsProvider extends ChangeNotifier { "defectType": serviceRequest.defectType.toMap(), "typeofRequest": serviceRequest.type.toMap(), "requestedThrough": serviceRequest.type.toMap(), + "reviewComment": "", }; if (serviceRequest.audio != null) { body["voiceNote"] = serviceRequest.audio; From dad222f8fb199387b9fe02f12f38e966825f46d4 Mon Sep 17 00:00:00 2001 From: nextwo <1234> Date: Mon, 22 May 2023 15:02:47 +0300 Subject: [PATCH 027/181] fix track device transfer issue --- .../api/device_transfer_provider.dart | 21 +++++++++++++++++++ lib/models/device/device_transfer_info.dart | 2 +- .../device_transfer_details.dart | 4 ++-- 3 files changed, 24 insertions(+), 3 deletions(-) diff --git a/lib/controllers/providers/api/device_transfer_provider.dart b/lib/controllers/providers/api/device_transfer_provider.dart index ffb84856..359a98d9 100644 --- a/lib/controllers/providers/api/device_transfer_provider.dart +++ b/lib/controllers/providers/api/device_transfer_provider.dart @@ -79,6 +79,7 @@ class DeviceTransferProvider extends ChangeNotifier { List itemsPage = listJson.map((request) => DeviceTransfer.fromJson(request)).toList(); items ??= []; items.addAll(itemsPage); + print(listJson); if (itemsPage.length == pageItemNumber) { nextPage = true; } else { @@ -153,11 +154,27 @@ class DeviceTransferProvider extends ChangeNotifier { "senderWorkingHours": newModel.workingHours, "senderTravelingHours": newModel.travelingHours, "senderAttachmentName": "${newModel.signature}.png", + "destSiteId": oldModel.receiver.client.id, + "destDepartmentId": oldModel.receiver.department.id, + "receiverAssignedEmployeeId": oldModel.receiver.userId, + "receiverMachineStatusId": oldModel.receiver.status.id??"", + "receiverComment": oldModel.receiver.comment, + "receiverWorkingHours": oldModel.receiver.workingHours, + "receiverTravelingHours": oldModel.receiver.travelingHours, + "receiverAttachmentName": "${oldModel.receiver.signature}.png", } ); }else{ body.addAll( { + "senderSiteId": oldModel.sender.client.id, + "senderDepartmentId": oldModel.sender.department.id, + "senderAssignedEmployeeId": oldModel.sender.userId, + "senderMachineStatusId": oldModel.sender.status.id, + "senderComment": oldModel.sender.comment, + "senderWorkingHours": oldModel.sender.workingHours, + "senderTravelingHours": oldModel.sender.travelingHours, + "senderAttachmentName": "${oldModel.sender.signature}.png", "destSiteId": newModel.client.id, "destDepartmentId": newModel.department.id, "receiverAssignedEmployeeId": newModel.userId, @@ -170,7 +187,11 @@ class DeviceTransferProvider extends ChangeNotifier { ); } + print(body["senderWorkingHours"]); + + body.addAll(newModel.toJson(isSender)); + print(body); Response response; try{ response = await ApiManager.instance.put( diff --git a/lib/models/device/device_transfer_info.dart b/lib/models/device/device_transfer_info.dart index 05e877f5..31cae58f 100644 --- a/lib/models/device/device_transfer_info.dart +++ b/lib/models/device/device_transfer_info.dart @@ -31,7 +31,7 @@ class DeviceTransferInfo{ if(comment != null && comment.isNotEmpty) body["${baseKey}comment"] = comment; if(workingHours != null && workingHours.isNotEmpty) body["${baseKey}working_hours"] = workingHours; - if(travelingHours != null && travelingHours.isNotEmpty) body["${baseKey}travel_hours"] = comment; + if(travelingHours != null && travelingHours.isNotEmpty) body["${baseKey}travel_hours"] = travelingHours; if(status != null) body["${baseKey}status"] = status.id.toString(); if(signature != null && signature.isNotEmpty) body["${baseKey}image"] = signature; return body; diff --git a/lib/views/pages/device_transfer/device_transfer_details.dart b/lib/views/pages/device_transfer/device_transfer_details.dart index 6975304b..ee45e92c 100644 --- a/lib/views/pages/device_transfer/device_transfer_details.dart +++ b/lib/views/pages/device_transfer/device_transfer_details.dart @@ -114,7 +114,7 @@ class _DeviceTransferDetailsState extends State { onPressed: (){ Navigator.of(context).push( MaterialPageRoute( - builder: (_)=> UpdateDeviceTransfer(model: widget.model,isSender: _isSender,) + builder: (_)=> UpdateDeviceTransfer(model: widget.model,isSender: true,) ) ); }, @@ -140,7 +140,7 @@ class _DeviceTransferDetailsState extends State { onPressed: (){ Navigator.of(context).push( MaterialPageRoute( - builder: (_)=> UpdateDeviceTransfer(model: widget.model,isSender: _isSender,) + builder: (_)=> UpdateDeviceTransfer(model: widget.model,isSender: false,) ) ); }, From 93f2378ec5574d9dfce101010f30473d4ee3c5ad Mon Sep 17 00:00:00 2001 From: zaid_daoud Date: Tue, 23 May 2023 13:33:10 +0300 Subject: [PATCH 028/181] Update Service Request Date Still Has Issue --- .../providers/api/service_requests_provider.dart | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/lib/controllers/providers/api/service_requests_provider.dart b/lib/controllers/providers/api/service_requests_provider.dart index 5349d1ec..ddd49c7d 100644 --- a/lib/controllers/providers/api/service_requests_provider.dart +++ b/lib/controllers/providers/api/service_requests_provider.dart @@ -199,6 +199,20 @@ class ServiceRequestsProvider extends ChangeNotifier { "assets": request.deviceId == null ? [] : [request.deviceId], "requestedDate": newDate, "requestedTime": newDate, + "priority": request.priority?.toMap(), + "defectType": request.defectType?.toMap(), + "typeofRequest": request.type?.toMap(), + "requestedThrough": request.type?.toMap(), + "assignedEmployee": { + "id": request.requestedThrough?.id ?? "", + "name": request.requestedThrough?.name ?? '', + }, + "voiceNote": request.audio, + "callComments": request.maintenanceIssue, + "noofFollowup": 0, + "attachmentsCallRequest": request.devicePhotos?.map((e) => {"name": e})?.toList(), + // "status": request.statusLabel, + "callLastSituation": null, }; try { response = await ApiManager.instance.put( From bdfa26411b5982770dbece942546017f3a9f3f38 Mon Sep 17 00:00:00 2001 From: zaid_daoud Date: Sun, 28 May 2023 12:03:14 +0300 Subject: [PATCH 029/181] Add New Service Body Changed --- assets/subtitles/ar_subtitle.json | 3 +- assets/subtitles/en_subtitle.json | 3 +- .../api/service_requests_provider.dart | 26 ++++++- .../service_request/service_request.dart | 43 +++++------- lib/models/subtitle.dart | 21 ++---- .../pages/user/requests/create_request.dart | 70 +++++++++++++------ 6 files changed, 103 insertions(+), 63 deletions(-) diff --git a/assets/subtitles/ar_subtitle.json b/assets/subtitles/ar_subtitle.json index ada5f900..5a57fc1d 100644 --- a/assets/subtitles/ar_subtitle.json +++ b/assets/subtitles/ar_subtitle.json @@ -188,5 +188,6 @@ "alert": "تنبيه", "duplicateAlert": "تنبيه التكرار", "duplicateAlertMessage": "هل أنت متأكد أنك تريد تكرار الطلب؟", - "duplicateRequest": "تكرار الطلب" + "duplicateRequest": "تكرار الطلب", + "comment" : "تعليق" } \ No newline at end of file diff --git a/assets/subtitles/en_subtitle.json b/assets/subtitles/en_subtitle.json index 2ce29fb9..a86013b2 100644 --- a/assets/subtitles/en_subtitle.json +++ b/assets/subtitles/en_subtitle.json @@ -188,5 +188,6 @@ "alert": "Alert", "duplicateAlert": "Duplicate Alert", "duplicateAlertMessage": "Are you sure you want to duplicate request?", - "duplicateRequest": "Duplicate Request" + "duplicateRequest": "Duplicate Request", + "comment" : "Comment" } \ No newline at end of file diff --git a/lib/controllers/providers/api/service_requests_provider.dart b/lib/controllers/providers/api/service_requests_provider.dart index ddd49c7d..0361a6e2 100644 --- a/lib/controllers/providers/api/service_requests_provider.dart +++ b/lib/controllers/providers/api/service_requests_provider.dart @@ -133,6 +133,8 @@ class ServiceRequestsProvider extends ChangeNotifier { @required ServiceRequest serviceRequest, }) async { var body = { + "id": 0, + "calNo": "", "callCreatedBy": {"id": user.id, "name": user.userName}, "assets": serviceRequest.deviceId == null ? [] : [serviceRequest.deviceId], "requestedDate": DateTime.now().toIso8601String(), @@ -144,7 +146,29 @@ class ServiceRequestsProvider extends ChangeNotifier { "defectType": serviceRequest.defectType.toMap(), "typeofRequest": serviceRequest.type.toMap(), "requestedThrough": serviceRequest.type.toMap(), - "reviewComment": "", + "reviewComment": serviceRequest.comment, + "voiceNote": serviceRequest.audio, + "noofFollowup": 0, + "callSiteContactPerson": [ + { + "id": 0, + "employeeCode": "string", + "name": "", + "telephone": "", + "job": "", + "email": "", + "land": "", + "contactUserId": "66e4235d-2527-471d-bbef-f29625fde43d ", + }, + ], + "status": null, + "callLastSituation": null, + "firstAction": null, + "loanAvailablity": null, + "comments": null, + "firstActionDate": null, + "visitDate": null, + "callReview": null, }; if (serviceRequest.audio != null) { body["voiceNote"] = serviceRequest.audio; diff --git a/lib/models/service_request/service_request.dart b/lib/models/service_request/service_request.dart index 434f8de7..bf957294 100644 --- a/lib/models/service_request/service_request.dart +++ b/lib/models/service_request/service_request.dart @@ -2,7 +2,7 @@ import 'package:test_sa/controllers/api_routes/urls.dart'; import 'package:test_sa/models/device/device.dart'; import 'package:test_sa/models/lookup.dart'; -class ServiceRequest{ +class ServiceRequest { String id; String requestCode; String deviceSerialNumber; @@ -19,6 +19,7 @@ class ServiceRequest{ String audio; int statusValue; String statusLabel; + String comment; bool viewReport; String engineerMobile; @@ -53,7 +54,6 @@ class ServiceRequest{ this.deviceId, this.audio, this.engineerName, - this.viewReport = false, this.deviceModel, this.engineerMobile, @@ -69,11 +69,12 @@ class ServiceRequest{ this.type, this.requestedThrough, this.device, + this.comment, }); - factory ServiceRequest.fromJson(Map parsedJson){ + factory ServiceRequest.fromJson(Map parsedJson) { List images = []; - if(parsedJson["attachmentsCallRequest"] is List){ + if (parsedJson["attachmentsCallRequest"] is List) { List list = parsedJson["attachmentsCallRequest"]; images = list.map((e) => URLs.getFileUrl(e["attachmentsCallRequest"])).toList(); } @@ -85,35 +86,27 @@ class ServiceRequest{ deviceId: parsedJson["asset"]["id"], audio: URLs.getFileUrl(parsedJson["voiceNote"] ?? ""), deviceArName: parsedJson["asset"]["modelDefinition"]["assetName"] ?? "", - deviceEnName: parsedJson["asset"]["modelDefinition"]["assetName"] ?? "", + deviceEnName: parsedJson["asset"]["modelDefinition"]["assetName"] ?? "", devicePhotos: images, deviceSerialNumber: parsedJson["asset"]["assetSerialNo"], date: DateTime.tryParse(parsedJson["requestedDate"] ?? "").toString().split(" ").first, maintenanceIssue: parsedJson["comments"], - statusLabel: parsedJson["status"] == null ? null : - parsedJson["status"]["name"], - statusValue: parsedJson["status"] == null ? null : - parsedJson["status"]["value"], - departmentName: parsedJson["asset"]["department"] != null ? - parsedJson["asset"]["department"]["name"] : "", - engineerName: parsedJson["assignedEmployee"] == null ? null : - parsedJson["assignedEmployee"]["name"], + statusLabel: parsedJson["status"] == null ? null : parsedJson["status"]["name"], + statusValue: parsedJson["status"] == null ? null : parsedJson["status"]["value"], + departmentName: parsedJson["asset"]["department"] != null ? parsedJson["asset"]["department"]["name"] : "", + engineerName: parsedJson["assignedEmployee"] == null ? null : parsedJson["assignedEmployee"]["name"], hospitalId: parsedJson["asset"]["site"]["id"], - reportID: parsedJson["workOrder"] != null ? - parsedJson["workOrder"]["workOrderId"] : null, + reportID: parsedJson["workOrder"] != null ? parsedJson["workOrder"]["workOrderId"] : null, viewReport: parsedJson["workOrder"] != null, deviceModel: parsedJson["asset"]["modelDefinition"]["modelName"], - engineerMobile: parsedJson["assignedEmployee"] == null ? null : - parsedJson["assignedEmployee"]["phone"], - faultDescription: parsedJson["workOrder"] != null ? - parsedJson["workOrder"]["faultDescription"] : null, - jobSheetNumber: parsedJson["workOrder"] != null ? - parsedJson["workOrder"]["jobSheetNumber"] :null, + engineerMobile: parsedJson["assignedEmployee"] == null ? null : parsedJson["assignedEmployee"]["phone"], + faultDescription: parsedJson["workOrder"] != null ? parsedJson["workOrder"]["faultDescription"] : null, + jobSheetNumber: parsedJson["workOrder"] != null ? parsedJson["workOrder"]["jobSheetNumber"] : null, visitDate: DateTime.tryParse(parsedJson["visitDate"] ?? "").toString().split(" ").first, nextVisitDate: DateTime.tryParse(parsedJson["nextVisitDate"] ?? ""), - workPerformed: parsedJson["workOrder"] != null ? - parsedJson["workOrder"]["workPerformed"] : null, - device: Device.fromJson(parsedJson["asset"]) + workPerformed: parsedJson["workOrder"] != null ? parsedJson["workOrder"]["workPerformed"] : null, + device: Device.fromJson(parsedJson["asset"]), + comment: parsedJson["reviewComment"], ); } -} \ No newline at end of file +} diff --git a/lib/models/subtitle.dart b/lib/models/subtitle.dart index a2f212c2..30b8efc9 100644 --- a/lib/models/subtitle.dart +++ b/lib/models/subtitle.dart @@ -1,6 +1,6 @@ import 'package:meta/meta.dart'; -class Subtitle{ +class Subtitle { // http requests status messages String currentlyServiceNotAvailable; String waitUntilYourRequestComplete; @@ -215,8 +215,9 @@ class Subtitle{ String duplicateAlert; String duplicateAlertMessage; String alert; + String comment; - void setIssues(List issues){ + void setIssues(List issues) { issues.clear(); issues.add(reason1); issues.add(reason2); @@ -226,6 +227,7 @@ class Subtitle{ } Subtitle({ + @required this.comment, @required this.currentlyServiceNotAvailable, @required this.waitUntilYourRequestComplete, @required this.requestCompleteSuccessfully, @@ -278,7 +280,6 @@ class Subtitle{ @required this.titleValidateMessage, @required this.to, @required this.urlNotFound, - @required this.nameExist, @required this.unitRequired, @required this.unite, @@ -384,7 +385,6 @@ class Subtitle{ @required this.pickImage, @required this.requiredImage, @required this.activationAlert, - @required this.callId, @required this.requiredWord, @required this.quantity, @@ -409,8 +409,9 @@ class Subtitle{ @required this.duplicateRequest, }); - factory Subtitle.fromJson(Map parsedJson){ + factory Subtitle.fromJson(Map parsedJson) { return Subtitle( + comment: parsedJson["comment"], currentlyServiceNotAvailable: parsedJson["server_error_message"], failedToCompleteRequest: parsedJson["failed_request_message"], requestCompleteSuccessfully: parsedJson["successful_request_message"], @@ -423,7 +424,6 @@ class Subtitle{ signOut: parsedJson["sign_out"], signOutAlert: parsedJson["logout_alert"], language: parsedJson["language"], - name: parsedJson["name"], email: parsedJson["email"], phoneNumber: parsedJson["phone_number"], @@ -437,7 +437,6 @@ class Subtitle{ passwordValidateMessage: parsedJson["password_validate_message"], confirmPasswordValidateMessage: parsedJson["confirm_password_validate_message"], phoneNumberValidateMessage: parsedJson["phone_number_validate_message"], - forgetPasswordWithMark: parsedJson["forget_password_with_mark"], showPassword: parsedJson["show_password"], wrongEmailOrPassword: parsedJson["wrong_email_or_password"], @@ -447,7 +446,6 @@ class Subtitle{ back: parsedJson["back"], search: parsedJson["search"], searchByName: parsedJson["search_by_name"], - address: parsedJson["address"], addressNotFound: parsedJson["address_not_found"], addressValidateMessage: parsedJson["address_validate_message"], @@ -466,7 +464,6 @@ class Subtitle{ titleNotFound: parsedJson["title_not_found"], titleValidateMessage: parsedJson["title_validate_message"], urlNotFound: parsedJson["url_not_found"], - date: parsedJson["date"], status: parsedJson["status"], code: parsedJson["code"], @@ -542,7 +539,6 @@ class Subtitle{ visitDate: parsedJson["visitDate"], whatsApp: parsedJson["whatsApp"], workPerformed: parsedJson["workPerformed"], - actualDate: parsedJson["actualDate"], done: parsedJson["done"], expectDate: parsedJson["expectDate"], @@ -573,7 +569,6 @@ class Subtitle{ requiredImage: parsedJson["requiredImage"], taskStatus: parsedJson["taskStatus"], activationAlert: parsedJson["activationAlert"], - attachImage: parsedJson["attachImage"], callLastSituation: parsedJson["callLastSituation"], customer: parsedJson["customer"], @@ -592,12 +587,10 @@ class Subtitle{ requiredWord: parsedJson["requiredWord"], serviceType: parsedJson["serviceType"], workPreformed: parsedJson["workPreformed"], - alert: parsedJson["alert"], duplicateAlert: parsedJson["duplicateAlert"], duplicateAlertMessage: parsedJson["duplicateAlertMessage"], duplicateRequest: parsedJson["duplicateRequest"], ); } - -} \ No newline at end of file +} diff --git a/lib/views/pages/user/requests/create_request.dart b/lib/views/pages/user/requests/create_request.dart index b5c71478..42524743 100644 --- a/lib/views/pages/user/requests/create_request.dart +++ b/lib/views/pages/user/requests/create_request.dart @@ -31,6 +31,7 @@ import 'package:test_sa/views/widgets/status/service_request/service_request_pri import 'package:test_sa/views/widgets/status/service_request/service_request_through_mune.dart'; import 'package:test_sa/views/widgets/status/service_request/service_request_types_mune.dart'; import 'package:test_sa/views/widgets/titles/app_sub_title.dart'; + class CreateRequestPage extends StatefulWidget { static final String id = "/create-request"; @@ -50,17 +51,19 @@ class _CreateRequestPageState extends State { Subtitle _subtitle; final GlobalKey _formKey = GlobalKey(); final GlobalKey _scaffoldKey = GlobalKey(); - TextEditingController _controller; + TextEditingController _maintenanceController, _commentController; @override void initState() { - _controller = TextEditingController(); + _maintenanceController = TextEditingController(); + _commentController = TextEditingController(); super.initState(); } @override void dispose() { - _controller.dispose(); + _maintenanceController.dispose(); + _commentController.dispose(); super.dispose(); } @@ -136,40 +139,56 @@ class _CreateRequestPageState extends State { setState(() {}); }, ), - const SizedBox(height: 8,), + const SizedBox( + height: 8, + ), const ASubTitle("Priority"), - const SizedBox(height: 4,), + const SizedBox( + height: 4, + ), ServiceRequestPriorityMenu( initialValue: _serviceRequest.priority, - onSelect: (status){ + onSelect: (status) { _serviceRequest.priority = status; }, ), - const SizedBox(height: 8,), + const SizedBox( + height: 8, + ), const ASubTitle("Defect Type"), - const SizedBox(height: 4,), + const SizedBox( + height: 4, + ), ServiceRequestDefectTypesMenu( initialValue: _serviceRequest.defectType, - onSelect: (status){ + onSelect: (status) { _serviceRequest.defectType = status; }, ), 12.height, - const SizedBox(height: 8,), + const SizedBox( + height: 8, + ), const ASubTitle("Type"), - const SizedBox(height: 4,), + const SizedBox( + height: 4, + ), ServiceRequestTypesMenu( initialValue: _serviceRequest.type, - onSelect: (status){ + onSelect: (status) { _serviceRequest.type = status; }, ), - const SizedBox(height: 8,), + const SizedBox( + height: 8, + ), const ASubTitle("Through"), - const SizedBox(height: 4,), + const SizedBox( + height: 4, + ), ServiceRequestedThroughMenu( - initialValue: const Lookup(name: "App",value: 3), - onSelect: (status){ + initialValue: const Lookup(name: "App", value: 3), + onSelect: (status) { _serviceRequest.requestedThrough = status; }, ), @@ -179,10 +198,10 @@ class _CreateRequestPageState extends State { images: _deviceImages, ), 12.height, - SpeechToTextButton(controller: _controller), + SpeechToTextButton(controller: _maintenanceController), 12.height, ATextFormField( - controller: _controller, + controller: _maintenanceController, initialValue: _serviceRequest.maintenanceIssue, hintText: _subtitle.maintenanceIssue, prefixIconData: FontAwesomeIcons.triangleExclamation, @@ -198,6 +217,16 @@ class _CreateRequestPageState extends State { _serviceRequest.audio = audio; }), 12.height, + ATextFormField( + controller: _commentController, + initialValue: _serviceRequest.comment, + hintText: _subtitle.comment, + style: Theme.of(context).textTheme.titleMedium, + textInputType: TextInputType.multiline, + onSaved: (value) { + _serviceRequest.comment = value; + }, + ), ], ).paddingOnly(left: 20, right: 20), Padding( @@ -210,9 +239,8 @@ class _CreateRequestPageState extends State { _serviceRequest.deviceId = _device?.id ?? ""; _isLoading = true; setState(() {}); - _serviceRequest.devicePhotos = _deviceImages.map( - (e) => "${e.path.split("/").last}|${base64Encode(e.readAsBytesSync())}").toList(); - if(_serviceRequest.audio != null){ + _serviceRequest.devicePhotos = _deviceImages.map((e) => "${e.path.split("/").last}|${base64Encode(e.readAsBytesSync())}").toList(); + if (_serviceRequest.audio != null) { final file = File(_serviceRequest.audio); _serviceRequest.audio = "${file.path.split("/").last}|${base64Encode(file.readAsBytesSync())}"; } From a4998896031a890441dc531a7ed0601b2f61a5af Mon Sep 17 00:00:00 2001 From: zaid_daoud Date: Sun, 28 May 2023 12:32:39 +0300 Subject: [PATCH 030/181] Add New Service Body Changed --- .../api/service_requests_provider.dart | 20 +++++++++---------- .../pages/user/requests/create_request.dart | 6 +++++- 2 files changed, 15 insertions(+), 11 deletions(-) diff --git a/lib/controllers/providers/api/service_requests_provider.dart b/lib/controllers/providers/api/service_requests_provider.dart index 0361a6e2..6c72fbb9 100644 --- a/lib/controllers/providers/api/service_requests_provider.dart +++ b/lib/controllers/providers/api/service_requests_provider.dart @@ -141,26 +141,26 @@ class ServiceRequestsProvider extends ChangeNotifier { "requestedTime": DateTime.now().toIso8601String(), "client": user.hospital?.id ?? '', "callComments": serviceRequest.maintenanceIssue, - "attachmentsCallRequest": serviceRequest.devicePhotos.map((e) => {"name": e}).toList(), + if (serviceRequest.devicePhotos.isNotEmpty) "attachmentsCallRequest": serviceRequest.devicePhotos.map((e) => {"name": e}).toList(), "priority": serviceRequest.priority.toMap(), "defectType": serviceRequest.defectType.toMap(), "typeofRequest": serviceRequest.type.toMap(), "requestedThrough": serviceRequest.type.toMap(), "reviewComment": serviceRequest.comment, - "voiceNote": serviceRequest.audio, - "noofFollowup": 0, + if (serviceRequest.audio != null) "voiceNote": serviceRequest.audio, "callSiteContactPerson": [ { "id": 0, - "employeeCode": "string", - "name": "", - "telephone": "", - "job": "", - "email": "", - "land": "", - "contactUserId": "66e4235d-2527-471d-bbef-f29625fde43d ", + "employeeCode": user.email, + "name": user.userName, + "telephone": user.phoneNumber, + // "job": "", + "email": user.email, + // "land": "", + "contactUserId": user.id, }, ], + "noofFollowup": 0, "status": null, "callLastSituation": null, "firstAction": null, diff --git a/lib/views/pages/user/requests/create_request.dart b/lib/views/pages/user/requests/create_request.dart index 42524743..695a4075 100644 --- a/lib/views/pages/user/requests/create_request.dart +++ b/lib/views/pages/user/requests/create_request.dart @@ -235,8 +235,12 @@ class _CreateRequestPageState extends State { text: _subtitle.submit, onPressed: () async { if (!_formKey.currentState.validate()) return; + if (_device?.id == null) { + Fluttertoast.showToast(msg: _subtitle.pickDevice); + return; + } _formKey.currentState.save(); - _serviceRequest.deviceId = _device?.id ?? ""; + _serviceRequest.deviceId = _device?.id; _isLoading = true; setState(() {}); _serviceRequest.devicePhotos = _deviceImages.map((e) => "${e.path.split("/").last}|${base64Encode(e.readAsBytesSync())}").toList(); From a219d81ccc3703df6a8c770f3a56d75123bbca1f Mon Sep 17 00:00:00 2001 From: zaid_daoud Date: Mon, 29 May 2023 11:04:09 +0300 Subject: [PATCH 031/181] Update Service Request Done --- assets/subtitles/ar_subtitle.json | 3 +- assets/subtitles/en_subtitle.json | 3 +- ios/Runner.xcodeproj/project.pbxproj | 4 +- ios/Runner/Info.plist | 2 + lib/controllers/api_routes/urls.dart | 2 + .../api/service_requests_provider.dart | 45 ++- ...service_request_first_action_provider.dart | 69 ++++ ...ce_request_loan_availability_provider.dart | 69 ++++ lib/main.dart | 79 ++-- .../service_request/service_request.dart | 10 + lib/models/subtitle.dart | 3 + .../pages/user/requests/create_request.dart | 112 ++++-- .../pages/user/requests/request_details.dart | 369 +++++++++--------- .../service_request_update_dialog.dart | 3 +- .../service_request_first_action.dart | 36 ++ .../service_request_loan_availability.dart | 35 ++ 16 files changed, 571 insertions(+), 273 deletions(-) create mode 100644 lib/controllers/providers/api/status_drop_down/service_reqest/service_request_first_action_provider.dart create mode 100644 lib/controllers/providers/api/status_drop_down/service_reqest/service_request_loan_availability_provider.dart create mode 100644 lib/views/widgets/status/service_request/service_request_first_action.dart create mode 100644 lib/views/widgets/status/service_request/service_request_loan_availability.dart diff --git a/assets/subtitles/ar_subtitle.json b/assets/subtitles/ar_subtitle.json index 5a57fc1d..b4294845 100644 --- a/assets/subtitles/ar_subtitle.json +++ b/assets/subtitles/ar_subtitle.json @@ -189,5 +189,6 @@ "duplicateAlert": "تنبيه التكرار", "duplicateAlertMessage": "هل أنت متأكد أنك تريد تكرار الطلب؟", "duplicateRequest": "تكرار الطلب", - "comment" : "تعليق" + "comment" : "تعليق", + "updateServiceRequest" : "تعديل طلب الخدمة" } \ No newline at end of file diff --git a/assets/subtitles/en_subtitle.json b/assets/subtitles/en_subtitle.json index a86013b2..3045e66e 100644 --- a/assets/subtitles/en_subtitle.json +++ b/assets/subtitles/en_subtitle.json @@ -189,5 +189,6 @@ "duplicateAlert": "Duplicate Alert", "duplicateAlertMessage": "Are you sure you want to duplicate request?", "duplicateRequest": "Duplicate Request", - "comment" : "Comment" + "comment" : "Comment", + "updateServiceRequest" : "Update Service Request" } \ No newline at end of file diff --git a/ios/Runner.xcodeproj/project.pbxproj b/ios/Runner.xcodeproj/project.pbxproj index a5559bc2..5116f0d6 100644 --- a/ios/Runner.xcodeproj/project.pbxproj +++ b/ios/Runner.xcodeproj/project.pbxproj @@ -3,7 +3,7 @@ archiveVersion = 1; classes = { }; - objectVersion = 51; + objectVersion = 54; objects = { /* Begin PBXBuildFile section */ @@ -227,6 +227,7 @@ }; 3B06AD1E1E4923F5004D2608 /* Thin Binary */ = { isa = PBXShellScriptBuildPhase; + alwaysOutOfDate = 1; buildActionMask = 2147483647; files = ( ); @@ -258,6 +259,7 @@ }; 9740EEB61CF901F6004384FC /* Run Script */ = { isa = PBXShellScriptBuildPhase; + alwaysOutOfDate = 1; buildActionMask = 2147483647; files = ( ); diff --git a/ios/Runner/Info.plist b/ios/Runner/Info.plist index 347cd5f4..86b0405c 100644 --- a/ios/Runner/Info.plist +++ b/ios/Runner/Info.plist @@ -60,5 +60,7 @@ UIViewControllerBasedStatusBarAppearance + UIApplicationSupportsIndirectInputEvents + diff --git a/lib/controllers/api_routes/urls.dart b/lib/controllers/api_routes/urls.dart index 65c8935d..44645f76 100644 --- a/lib/controllers/api_routes/urls.dart +++ b/lib/controllers/api_routes/urls.dart @@ -24,6 +24,8 @@ class URLs { // 08051 static get getServiceRequests => "$_baseUrl/CallRequest/GetCallRequests"; // get static get getServiceRequestThrough => "$_baseUrl/Lookups/GetLookup?lookupEnum=603"; // get + static get getServiceLoanAvailability => "$_baseUrl/Lookups/GetLookup?lookupEnum=4"; // get + static get getServiceFirstAction => "$_baseUrl/Lookups/GetLookup?lookupEnum=700"; // get static get getServiceRequestTypes => "$_baseUrl/Lookups/GetLookup?lookupEnum=604"; // get static get getServiceRequestStatus => "$_baseUrl/Lookups/GetLookup?lookupEnum=503"; diff --git a/lib/controllers/providers/api/service_requests_provider.dart b/lib/controllers/providers/api/service_requests_provider.dart index 6c72fbb9..e989a85d 100644 --- a/lib/controllers/providers/api/service_requests_provider.dart +++ b/lib/controllers/providers/api/service_requests_provider.dart @@ -6,7 +6,6 @@ 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/models/issue.dart'; -import 'package:test_sa/models/lookup.dart'; import 'package:test_sa/models/service_report.dart'; import 'package:test_sa/models/service_request/service_request.dart'; import 'package:test_sa/models/service_request/service_request_search.dart'; @@ -146,7 +145,7 @@ class ServiceRequestsProvider extends ChangeNotifier { "defectType": serviceRequest.defectType.toMap(), "typeofRequest": serviceRequest.type.toMap(), "requestedThrough": serviceRequest.type.toMap(), - "reviewComment": serviceRequest.comment, + "reviewComment": null, if (serviceRequest.audio != null) "voiceNote": serviceRequest.audio, "callSiteContactPerson": [ { @@ -213,30 +212,46 @@ class ServiceRequestsProvider extends ChangeNotifier { Future updateDate({ @required String host, @required User user, - @required String newDate, - @required Lookup employee, @required ServiceRequest request, + DateTime date, }) async { Response response; var body = { + "id": request.id, + "callNo": "", "callCreatedBy": {"id": user.id, "name": user.userName}, - "assets": request.deviceId == null ? [] : [request.deviceId], - "requestedDate": newDate, - "requestedTime": newDate, + "requestedDate": date?.toIso8601String(), + "requestedTime": date?.toIso8601String(), "priority": request.priority?.toMap(), "defectType": request.defectType?.toMap(), "typeofRequest": request.type?.toMap(), - "requestedThrough": request.type?.toMap(), - "assignedEmployee": { - "id": request.requestedThrough?.id ?? "", - "name": request.requestedThrough?.name ?? '', - }, + "requestedThrough": request.requestedThrough?.toMap(), "voiceNote": request.audio, + "assets": request.deviceId == null ? [] : [request.deviceId], + "attachmentsCallRequest": request.devicePhotos?.map((e) => {"name": e})?.toList(), + "callSiteContactPerson": [ + { + "id": 0, + "employeeCode": user.email, + "name": user.userName, + "telephone": user.phoneNumber, + // "job": "", + "email": user.email, + // "land": "", + "contactUserId": user.id, + }, + ], "callComments": request.maintenanceIssue, "noofFollowup": 0, - "attachmentsCallRequest": request.devicePhotos?.map((e) => {"name": e})?.toList(), - // "status": request.statusLabel, + // "status": null, "callLastSituation": null, + "firstAction": request.firstAction.toMap(), + "loanAvailablity": request.loanAvailability.toMap(), + "comments": request.comment, + "firstActionDate": null, + "visitDate": null, + "callReview": null, + "reviewComment": null, }; try { response = await ApiManager.instance.put( @@ -245,7 +260,7 @@ class ServiceRequestsProvider extends ChangeNotifier { ); stateCode = response.statusCode; if (response.statusCode >= 200 && response.statusCode < 300) { - request.engineerName = employee.name; + // request.engineerName = employee.name; notifyListeners(); } return response.statusCode; diff --git a/lib/controllers/providers/api/status_drop_down/service_reqest/service_request_first_action_provider.dart b/lib/controllers/providers/api/status_drop_down/service_reqest/service_request_first_action_provider.dart new file mode 100644 index 00000000..6c1beb9d --- /dev/null +++ b/lib/controllers/providers/api/status_drop_down/service_reqest/service_request_first_action_provider.dart @@ -0,0 +1,69 @@ +import 'dart:convert'; + +import 'package:flutter/cupertino.dart'; +import 'package:flutter/material.dart'; +import 'package:http/http.dart'; +import 'package:test_sa/controllers/api_routes/api_manager.dart'; +import 'package:test_sa/controllers/api_routes/urls.dart'; +import 'package:test_sa/models/lookup.dart'; +import 'package:test_sa/models/user.dart'; + +class ServiceFirstActionProvider extends ChangeNotifier { + //reset provider data + void reset() { + _statuses = null; + _stateCode = null; + } + + // state code of current request to defied error message + // like 400 customer request failed + // 500 service not available + int _stateCode; + int get stateCode => _stateCode; + + // contain user data + // when user not login or register _user = null + List _statuses; + List get items => _statuses; + + // when categories in-process _loading = true + // done _loading = true + // failed _loading = false + bool _loading; + bool get isLoading => _loading; + set isLoading(bool isLoading) { + _loading = isLoading; + notifyListeners(); + } + + /// return -2 if request in progress + /// return -1 if error happen when sending request + /// 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 getData({String host, User user}) async { + if (_loading == true) return -2; + _loading = true; + notifyListeners(); + Response response; + try { + response = await ApiManager.instance.get( + URLs.getServiceFirstAction, + ); + _stateCode = response.statusCode; + if (response.statusCode >= 200 && response.statusCode < 300) { + // client's request was successfully received + List categoriesListJson = json.decode(response.body)["data"]; + _statuses = categoriesListJson.map((e) => Lookup.fromJson(e)).toList(); + } + _loading = false; + notifyListeners(); + return response.statusCode; + } catch (error) { + _loading = false; + _stateCode = -1; + notifyListeners(); + return -1; + } + } +} diff --git a/lib/controllers/providers/api/status_drop_down/service_reqest/service_request_loan_availability_provider.dart b/lib/controllers/providers/api/status_drop_down/service_reqest/service_request_loan_availability_provider.dart new file mode 100644 index 00000000..a4f1594a --- /dev/null +++ b/lib/controllers/providers/api/status_drop_down/service_reqest/service_request_loan_availability_provider.dart @@ -0,0 +1,69 @@ +import 'dart:convert'; + +import 'package:flutter/cupertino.dart'; +import 'package:flutter/material.dart'; +import 'package:http/http.dart'; +import 'package:test_sa/controllers/api_routes/api_manager.dart'; +import 'package:test_sa/controllers/api_routes/urls.dart'; +import 'package:test_sa/models/lookup.dart'; +import 'package:test_sa/models/user.dart'; + +class ServiceLoanAvailabilityProvider extends ChangeNotifier { + //reset provider data + void reset() { + _statuses = null; + _stateCode = null; + } + + // state code of current request to defied error message + // like 400 customer request failed + // 500 service not available + int _stateCode; + int get stateCode => _stateCode; + + // contain user data + // when user not login or register _user = null + List _statuses; + List get items => _statuses; + + // when categories in-process _loading = true + // done _loading = true + // failed _loading = false + bool _loading; + bool get isLoading => _loading; + set isLoading(bool isLoading) { + _loading = isLoading; + notifyListeners(); + } + + /// return -2 if request in progress + /// return -1 if error happen when sending request + /// 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 getData({String host, User user}) async { + if (_loading == true) return -2; + _loading = true; + notifyListeners(); + Response response; + try { + response = await ApiManager.instance.get( + URLs.getServiceLoanAvailability, + ); + _stateCode = response.statusCode; + if (response.statusCode >= 200 && response.statusCode < 300) { + // client's request was successfully received + List categoriesListJson = json.decode(response.body)["data"]; + _statuses = categoriesListJson.map((e) => Lookup.fromJson(e)).toList(); + } + _loading = false; + notifyListeners(); + return response.statusCode; + } catch (error) { + _loading = false; + _stateCode = -1; + notifyListeners(); + return -1; + } + } +} diff --git a/lib/main.dart b/lib/main.dart index 26805518..60cea674 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -1,6 +1,3 @@ -import 'package:flutter/material.dart'; -import 'package:flutter_localizations/flutter_localizations.dart'; -import 'package:provider/provider.dart'; import 'dart:io'; import 'package:firebase_core/firebase_core.dart'; @@ -26,6 +23,8 @@ import 'package:test_sa/controllers/providers/api/status_drop_down/pentry/pentry import 'package:test_sa/controllers/providers/api/status_drop_down/pentry/pentry_visit_status_provider.dart'; import 'package:test_sa/controllers/providers/api/status_drop_down/report/service_report_defect_types_provider.dart'; import 'package:test_sa/controllers/providers/api/status_drop_down/report/service_report_priority_provider.dart'; +import 'package:test_sa/controllers/providers/api/status_drop_down/service_reqest/service_request_first_action_provider.dart'; +import 'package:test_sa/controllers/providers/api/status_drop_down/service_reqest/service_request_loan_availability_provider.dart'; import 'package:test_sa/controllers/providers/api/status_drop_down/service_reqest/service_request_status_provider.dart'; import 'package:test_sa/controllers/providers/api/status_drop_down/service_reqest/service_request_through_provider.dart'; import 'package:test_sa/controllers/providers/api/status_drop_down/service_reqest/service_request_type_provider.dart'; @@ -65,17 +64,16 @@ void main() async { WidgetsFlutterBinding.ensureInitialized(); if (Platform.isIOS) { await Firebase.initializeApp( - options: const FirebaseOptions(apiKey: "AIzaSyACQkSleNwU1jzEKR5ho1uSfZERokwwAbc", appId: "1:973582662416:ios:bc4a8061444c6a08fbc395", messagingSenderId: "973582662416", projectId: "atoms-fb912"), + options: + const FirebaseOptions(apiKey: "AIzaSyACQkSleNwU1jzEKR5ho1uSfZERokwwAbc", appId: "1:973582662416:ios:bc4a8061444c6a08fbc395", messagingSenderId: "973582662416", projectId: "atoms-fb912"), ); } else { await Firebase.initializeApp(); } - runApp( - ChangeNotifierProvider( - create: (_) => SettingProvider(), - child: MyApp(), - ) - ); + runApp(ChangeNotifierProvider( + create: (_) => SettingProvider(), + child: MyApp(), + )); } class MyApp extends StatelessWidget { @@ -115,6 +113,8 @@ class MyApp extends StatelessWidget { ChangeNotifierProvider(create: (_) => ServiceRequestedThroughProvider()), ChangeNotifierProvider(create: (_) => ServiceRequestStatusProvider()), ChangeNotifierProvider(create: (_) => EngineersProvider()), + ChangeNotifierProvider(create: (_) => ServiceLoanAvailabilityProvider()), + ChangeNotifierProvider(create: (_) => ServiceFirstActionProvider()), ], child: GestureDetector( onTap: () { @@ -127,18 +127,12 @@ class MyApp extends StatelessWidget { title: 'ATOMS', debugShowCheckedModeBanner: false, theme: ThemeData( - fontFamily: "Poppins", - //canvasColor: AColors.primaryColor, - scaffoldBackgroundColor: AColors.scaffoldBackgroundColor, - primaryColor: AColors.primaryColor, - indicatorColor: AColors.primaryColor, - colorScheme: const ColorScheme.light( - primary: AColors.primaryColor, - onPrimary: Colors.white, - secondary: AColors.secondaryColor, - onSecondary: Colors.white - ) - ), + fontFamily: "Poppins", + //canvasColor: AColors.primaryColor, + scaffoldBackgroundColor: AColors.scaffoldBackgroundColor, + primaryColor: AColors.primaryColor, + indicatorColor: AColors.primaryColor, + colorScheme: const ColorScheme.light(primary: AColors.primaryColor, onPrimary: Colors.white, secondary: AColors.secondaryColor, onSecondary: Colors.white)), localizationsDelegates: const [ // ... app-specific localization delegate[s] here AppLocalization.delegate, @@ -153,31 +147,28 @@ class MyApp extends StatelessWidget { locale: Locale(_settingProvider.language ?? 'en'), initialRoute: SplashScreen.id, routes: { - SplashScreen.id: (_)=> const SplashScreen(), - LandPage.id: (_)=> const LandPage(), - Login.id: (_)=> Login(), - Register.id: (_)=> Register(), - ProfilePage.id: (_)=> ProfilePage(), - ReportIssuesPage.id: (_)=> const ReportIssuesPage(), - RequestGasRefill.id: (_)=> const RequestGasRefill(), - CreateRequestPage.id: (_)=> CreateRequestPage(), - SingleHospitalPicker.id: (_)=> SingleHospitalPicker(), - SingleDevicePicker.id: (_)=> SingleDevicePicker(), - SingleDepartmentPicker.id: (_)=> SingleDepartmentPicker(), - ServiceRequestsPage.id: (_)=> ServiceRequestsPage(), - NotificationsPage.id: (_)=> NotificationsPage(), - FutureRequestServiceDetails.id: (_)=> FutureRequestServiceDetails(), - PreventiveMaintenanceVisitsPage.id: (_)=> PreventiveMaintenanceVisitsPage(), - RegularVisitsPage.id: (_)=> RegularVisitsPage(), - TrackGasRefillPage.id: (_)=> const TrackGasRefillPage(), - RequestDeviceTransfer.id: (_)=> const RequestDeviceTransfer(), - TrackDeviceTransferPage.id: (_)=> const TrackDeviceTransferPage(), + SplashScreen.id: (_) => const SplashScreen(), + LandPage.id: (_) => const LandPage(), + Login.id: (_) => Login(), + Register.id: (_) => Register(), + ProfilePage.id: (_) => ProfilePage(), + ReportIssuesPage.id: (_) => const ReportIssuesPage(), + RequestGasRefill.id: (_) => const RequestGasRefill(), + CreateRequestPage.id: (_) => const CreateRequestPage(), + SingleHospitalPicker.id: (_) => SingleHospitalPicker(), + SingleDevicePicker.id: (_) => SingleDevicePicker(), + SingleDepartmentPicker.id: (_) => SingleDepartmentPicker(), + ServiceRequestsPage.id: (_) => ServiceRequestsPage(), + NotificationsPage.id: (_) => NotificationsPage(), + FutureRequestServiceDetails.id: (_) => FutureRequestServiceDetails(), + PreventiveMaintenanceVisitsPage.id: (_) => PreventiveMaintenanceVisitsPage(), + RegularVisitsPage.id: (_) => RegularVisitsPage(), + TrackGasRefillPage.id: (_) => const TrackGasRefillPage(), + RequestDeviceTransfer.id: (_) => const RequestDeviceTransfer(), + TrackDeviceTransferPage.id: (_) => const TrackDeviceTransferPage(), }, ), ), ); } } - - - diff --git a/lib/models/service_request/service_request.dart b/lib/models/service_request/service_request.dart index bf957294..6ebc748b 100644 --- a/lib/models/service_request/service_request.dart +++ b/lib/models/service_request/service_request.dart @@ -35,6 +35,8 @@ class ServiceRequest { Lookup defectType; Lookup type; Lookup requestedThrough; + Lookup firstAction; + Lookup loanAvailability; Device device; ServiceRequest({ @@ -70,6 +72,8 @@ class ServiceRequest { this.requestedThrough, this.device, this.comment, + this.loanAvailability, + this.firstAction, }); factory ServiceRequest.fromJson(Map parsedJson) { @@ -107,6 +111,12 @@ class ServiceRequest { workPerformed: parsedJson["workOrder"] != null ? parsedJson["workOrder"]["workPerformed"] : null, device: Device.fromJson(parsedJson["asset"]), comment: parsedJson["reviewComment"], + type: Lookup.fromJson(parsedJson['typeofRequest']), + defectType: Lookup.fromJson(parsedJson['defectType']), + loanAvailability: Lookup.fromJson(parsedJson['loanAvailability']), + firstAction: Lookup.fromJson(parsedJson['firstAction']), + requestedThrough: Lookup.fromJson(parsedJson['requestedThrough']), + priority: Lookup.fromJson(parsedJson['priority']), ); } } diff --git a/lib/models/subtitle.dart b/lib/models/subtitle.dart index 30b8efc9..1a05ab65 100644 --- a/lib/models/subtitle.dart +++ b/lib/models/subtitle.dart @@ -216,6 +216,7 @@ class Subtitle { String duplicateAlertMessage; String alert; String comment; + String updateServiceRequest; void setIssues(List issues) { issues.clear(); @@ -227,6 +228,7 @@ class Subtitle { } Subtitle({ + @required this.updateServiceRequest, @required this.comment, @required this.currentlyServiceNotAvailable, @required this.waitUntilYourRequestComplete, @@ -411,6 +413,7 @@ class Subtitle { factory Subtitle.fromJson(Map parsedJson) { return Subtitle( + updateServiceRequest: parsedJson["updateServiceRequest"], comment: parsedJson["comment"], currentlyServiceNotAvailable: parsedJson["server_error_message"], failedToCompleteRequest: parsedJson["failed_request_message"], diff --git a/lib/views/pages/user/requests/create_request.dart b/lib/views/pages/user/requests/create_request.dart index 695a4075..5e6701f5 100644 --- a/lib/views/pages/user/requests/create_request.dart +++ b/lib/views/pages/user/requests/create_request.dart @@ -32,31 +32,43 @@ import 'package:test_sa/views/widgets/status/service_request/service_request_thr import 'package:test_sa/views/widgets/status/service_request/service_request_types_mune.dart'; import 'package:test_sa/views/widgets/titles/app_sub_title.dart'; +import '../../../widgets/date_and_time/date_picker.dart'; +import '../../../widgets/status/service_request/service_request_first_action.dart'; +import '../../../widgets/status/service_request/service_request_loan_availability.dart'; + class CreateRequestPage extends StatefulWidget { - static final String id = "/create-request"; + static const String id = "/create-request"; + final ServiceRequest serviceRequest; + const CreateRequestPage({this.serviceRequest, Key key}) : super(key: key); @override - _CreateRequestPageState createState() => _CreateRequestPageState(); + CreateRequestPageState createState() => CreateRequestPageState(); } -class _CreateRequestPageState extends State { +class CreateRequestPageState extends State { double _height; UserProvider _userProvider; SettingProvider _settingProvider; ServiceRequestsProvider _serviceRequestsProvider; - ServiceRequest _serviceRequest = ServiceRequest(); - List _deviceImages = []; + ServiceRequest _serviceRequest; + final List _deviceImages = []; bool _isLoading = false; Device _device; Subtitle _subtitle; final GlobalKey _formKey = GlobalKey(); final GlobalKey _scaffoldKey = GlobalKey(); TextEditingController _maintenanceController, _commentController; + DateTime _dateTime; @override void initState() { _maintenanceController = TextEditingController(); _commentController = TextEditingController(); + if (widget.serviceRequest != null) { + _serviceRequest = widget.serviceRequest; + _device = _serviceRequest.device; + _deviceImages.addAll(_serviceRequest.devicePhotos.map((e) => File(e)).toList()); + } super.initState(); } @@ -89,21 +101,19 @@ class _CreateRequestPageState extends State { ListView( children: [ //AppNameBar(), - SizedBox( - height: 16, - ), + const SizedBox(height: 16), Hero( tag: "logo", child: Image( height: _height / 6, - image: AssetImage("assets/images/logo.png"), + image: const AssetImage("assets/images/logo.png"), ), ), Center( child: Padding( padding: const EdgeInsets.all(8.0), child: Text( - _subtitle.newServiceRequest, + widget.serviceRequest == null ? _subtitle.newServiceRequest : _subtitle.updateServiceRequest, style: Theme.of(context).textTheme.headline5.copyWith(color: AColors.cyan, fontWeight: FontWeight.w600), ), ), @@ -113,7 +123,7 @@ class _CreateRequestPageState extends State { children: [ 12.height, _userProvider.user.hospital == null - ? SizedBox.shrink() + ? const SizedBox.shrink() : ATextFormField( enable: false, initialValue: _userProvider.user.hospital?.name ?? _subtitle.noHospitalFound, @@ -123,7 +133,7 @@ class _CreateRequestPageState extends State { ), 12.height, _userProvider.user.department == null - ? SizedBox.shrink() + ? const SizedBox.shrink() : ATextFormField( enable: false, initialValue: _userProvider.user.department?.name ?? _subtitle.noUniteFound, @@ -192,12 +202,45 @@ class _CreateRequestPageState extends State { _serviceRequest.requestedThrough = status; }, ), + if (widget.serviceRequest != null) 12.height, + if (widget.serviceRequest != null) const ASubTitle("First Action"), + const SizedBox( + height: 4, + ), + if (widget.serviceRequest != null) + ServiceRequestedFirstAction( + initialValue: _serviceRequest.firstAction, + onSelect: (status) { + _serviceRequest.firstAction = status; + }, + ), + if (widget.serviceRequest != null) 12.height, + if (widget.serviceRequest != null) const ASubTitle("Loan Availability"), + const SizedBox( + height: 4, + ), + if (widget.serviceRequest != null) + ServiceRequestedLoanAvailability( + initialValue: _serviceRequest.loanAvailability, + onSelect: (status) { + _serviceRequest.loanAvailability = status; + }, + ), 12.height, MultiImagesPicker( label: _subtitle.deviceImages, images: _deviceImages, ), 12.height, + ADatePicker( + date: _dateTime, + from: DateTime.now(), + onDatePicker: (date) { + _dateTime = date; + setState(() {}); + }, + ), + 12.height, SpeechToTextButton(controller: _maintenanceController), 12.height, ATextFormField( @@ -217,22 +260,23 @@ class _CreateRequestPageState extends State { _serviceRequest.audio = audio; }), 12.height, - ATextFormField( - controller: _commentController, - initialValue: _serviceRequest.comment, - hintText: _subtitle.comment, - style: Theme.of(context).textTheme.titleMedium, - textInputType: TextInputType.multiline, - onSaved: (value) { - _serviceRequest.comment = value; - }, - ), + if (widget.serviceRequest != null) + ATextFormField( + controller: _commentController, + initialValue: _serviceRequest.comment, + hintText: _subtitle.comment, + style: Theme.of(context).textTheme.titleMedium, + textInputType: TextInputType.multiline, + onSaved: (value) { + _serviceRequest.comment = value; + }, + ), ], ).paddingOnly(left: 20, right: 20), Padding( padding: const EdgeInsets.all(20.0), child: AButton( - text: _subtitle.submit, + text: widget.serviceRequest == null ? _subtitle.submit : _subtitle.update, onPressed: () async { if (!_formKey.currentState.validate()) return; if (_device?.id == null) { @@ -248,11 +292,21 @@ class _CreateRequestPageState extends State { final file = File(_serviceRequest.audio); _serviceRequest.audio = "${file.path.split("/").last}|${base64Encode(file.readAsBytesSync())}"; } - int status = await _serviceRequestsProvider.createRequest( - user: _userProvider.user, - host: _settingProvider.host, - serviceRequest: _serviceRequest, - ); + int status = 0; + if (widget.serviceRequest == null) { + status = await _serviceRequestsProvider.createRequest( + user: _userProvider.user, + host: _settingProvider.host, + serviceRequest: _serviceRequest, + ); + } else { + status = await _serviceRequestsProvider.updateDate( + user: _userProvider.user, + host: _settingProvider.host, + request: _serviceRequest, + date: _dateTime, + ); + } _isLoading = false; setState(() {}); if (status >= 200 && status < 300) { @@ -271,7 +325,7 @@ class _CreateRequestPageState extends State { ), ], ), - ABackButton(), + const ABackButton(), ], ), ), diff --git a/lib/views/pages/user/requests/request_details.dart b/lib/views/pages/user/requests/request_details.dart index d45692d8..598e8f2b 100644 --- a/lib/views/pages/user/requests/request_details.dart +++ b/lib/views/pages/user/requests/request_details.dart @@ -1,4 +1,3 @@ -import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; import 'package:intl/intl.dart'; import 'package:provider/provider.dart'; @@ -11,6 +10,7 @@ import 'package:test_sa/models/service_request/service_request.dart'; import 'package:test_sa/models/subtitle.dart'; import 'package:test_sa/views/app_style/colors.dart'; import 'package:test_sa/views/app_style/sizing.dart'; +import 'package:test_sa/views/pages/user/requests/create_request.dart'; import 'package:test_sa/views/pages/user/requests/report/create_service_report.dart'; import 'package:test_sa/views/widgets/buttons/app_back_button.dart'; import 'package:test_sa/views/widgets/buttons/app_button.dart'; @@ -19,11 +19,11 @@ import 'package:test_sa/views/widgets/images/images_list.dart'; import 'package:test_sa/views/widgets/loaders/image_loader.dart'; import 'package:test_sa/views/widgets/requests/info_row.dart'; import 'package:test_sa/views/widgets/requests/request_status.dart'; -import 'package:test_sa/views/widgets/requests/service_request_update_dialog.dart'; import 'package:test_sa/views/widgets/sound/sound_player.dart'; import 'package:test_sa/views/widgets/titles/app_sub_title.dart'; import 'report/future_service_report.dart'; + class RequestDetailsPage extends StatelessWidget { static final String id = "/call-details"; final ServiceRequest serviceRequest; @@ -42,8 +42,8 @@ class RequestDetailsPage extends StatelessWidget { child: Column( children: [ Container( - color:AColors.primaryColor, - padding: const EdgeInsets.symmetric(horizontal: 0,vertical: 4), + color: AColors.primaryColor, + padding: const EdgeInsets.symmetric(horizontal: 0, vertical: 4), child: Row( children: [ ABackButton(), @@ -51,124 +51,133 @@ class RequestDetailsPage extends StatelessWidget { child: Center( child: Text( _subtitle.details, - style: Theme.of(context).textTheme.headline6.copyWith( - color: AColors.white, - fontStyle: FontStyle.italic - ), + style: Theme.of(context).textTheme.headline6.copyWith(color: AColors.white, fontStyle: FontStyle.italic), ), ), ), - _userProvider.user.type == UsersTypes.normal_user ? - // AIconButton( - // iconData: Icons.warning_amber_rounded, - // color: AColors.white, - // buttonSize: 42, - // backgroundColor: AColors.deepOrange, - // onPressed: (){ - // Navigator.of(context).push( - // MaterialPageRoute( - // builder: (_) => ReportIssuesPage(serviceRequest: serviceRequest,) - // ) - // ); - // }, - // ) - const SizedBox(width: 48,) - : AIconButton( - iconData: Icons.edit, - color: AColors.white, - buttonSize: 42, - backgroundColor: AColors.green, - onPressed: () async { - showModalBottomSheet( - context: context, - builder: (context){ - return ServiceRequestsUpdateDialog(request: serviceRequest,); - }); - // DateTime picked = await showDatePicker( - // context: context, - // initialDate: DateTime.now(), - // firstDate: DateTime.now(), - // lastDate: DateTime.now().add(Duration(days: 182)) - // ); - // if(picked == null){return;} - // showDialog( - // context: context, - // barrierDismissible: false, - // builder: (BuildContext context) { - // return CupertinoAlertDialog( - // title: Text(_subtitle.updatingDots), - // content: Center(child: CircularProgressIndicator()), + _userProvider.user.type == UsersTypes.normal_user + ? + // AIconButton( + // iconData: Icons.warning_amber_rounded, + // color: AColors.white, + // buttonSize: 42, + // backgroundColor: AColors.deepOrange, + // onPressed: (){ + // Navigator.of(context).push( + // MaterialPageRoute( + // builder: (_) => ReportIssuesPage(serviceRequest: serviceRequest,) + // ) // ); // }, - // ); - // int status = await _serviceRequestsProvider.updateDate( - // user: _userProvider.user, - // host: _settingProvider.host, - // request: serviceRequest, - // newDate: picked.toString().split(" ").first - // ); - // Navigator.of(context).pop(); - // Fluttertoast.showToast( - // msg: HttpStatusManger.getStatusMessage(status: status, subtitle: _subtitle), - // ); - }, - ), - SizedBox(width: 16,) + // ) + const SizedBox( + width: 48, + ) + : AIconButton( + iconData: Icons.edit, + color: AColors.white, + buttonSize: 42, + backgroundColor: AColors.green, + onPressed: () async { + Navigator.of(context).push( + MaterialPageRoute(builder: (_) => CreateRequestPage(serviceRequest: serviceRequest)), + ); + // showModalBottomSheet( + // context: context, + // builder: (context) { + // + // // return ServiceRequestsUpdateDialog(request: serviceRequest,); + // }); + // DateTime picked = await showDatePicker( + // context: context, + // initialDate: DateTime.now(), + // firstDate: DateTime.now(), + // lastDate: DateTime.now().add(Duration(days: 182)) + // ); + // if(picked == null){return;} + // showDialog( + // context: context, + // barrierDismissible: false, + // builder: (BuildContext context) { + // return CupertinoAlertDialog( + // title: Text(_subtitle.updatingDots), + // content: Center(child: CircularProgressIndicator()), + // ); + // }, + // ); + // int status = await _serviceRequestsProvider.updateDate( + // user: _userProvider.user, + // host: _settingProvider.host, + // request: serviceRequest, + // newDate: picked.toString().split(" ").first + // ); + // Navigator.of(context).pop(); + // Fluttertoast.showToast( + // msg: HttpStatusManger.getStatusMessage(status: status, subtitle: _subtitle), + // ); + }, + ), + SizedBox( + width: 16, + ) ], ), ), - - serviceRequest.devicePhotos.isEmpty ? SizedBox.shrink(): - Column( - children: [ - SizedBox(height: 8,), - MaterialButton( - padding: EdgeInsets.zero, - onPressed: (){ - Navigator.of(context).push( - MaterialPageRoute( - builder: (_) => Scaffold( - body: InteractiveViewer( - child: Center( - child: ImageLoader( - url: serviceRequest.devicePhotos.first, - boxFit: BoxFit.contain, - ), - ), - ), - ) - ) - ); - }, - child: SizedBox( - height: 140 * AppStyle.getScaleFactor(context), - width: MediaQuery.of(context).size.width, - child: ImageLoader( - url: serviceRequest.devicePhotos.first, - boxFit: BoxFit.cover, - ), - ), - ), - SizedBox(height: 8,), - SizedBox( - height: 60* AppStyle.getScaleFactor(context), - child: ImagesList( - images: serviceRequest.devicePhotos, + serviceRequest.devicePhotos.isEmpty + ? SizedBox.shrink() + : Column( + children: [ + SizedBox( + height: 8, + ), + MaterialButton( + padding: EdgeInsets.zero, + onPressed: () { + Navigator.of(context).push(MaterialPageRoute( + builder: (_) => Scaffold( + body: InteractiveViewer( + child: Center( + child: ImageLoader( + url: serviceRequest.devicePhotos.first, + boxFit: BoxFit.contain, + ), + ), + ), + ))); + }, + child: SizedBox( + height: 140 * AppStyle.getScaleFactor(context), + width: MediaQuery.of(context).size.width, + child: ImageLoader( + url: serviceRequest.devicePhotos.first, + boxFit: BoxFit.cover, + ), + ), + ), + SizedBox( + height: 8, + ), + SizedBox( + height: 60 * AppStyle.getScaleFactor(context), + child: ImagesList( + images: serviceRequest.devicePhotos, + ), + ), + ], ), - ), - ], - ), - - TabBar( - labelColor: AColors.primaryColor, - tabs: [ - Tab(text: _subtitle.general,), - Tab(text: _subtitle.serviceRequestInformation,), + TabBar(labelColor: AColors.primaryColor, tabs: [ + Tab( + text: _subtitle.general, + ), + Tab( + text: _subtitle.serviceRequestInformation, + ), ]), - SizedBox(height: 8,), + SizedBox( + height: 8, + ), Expanded( child: TabBarView( - children: [ ListView( padding: EdgeInsets.symmetric(horizontal: 16), @@ -187,7 +196,7 @@ class RequestDetailsPage extends StatelessWidget { ), RequestInfoRow( title: _subtitle.deviceModel, - info : serviceRequest.deviceModel, + info: serviceRequest.deviceModel, ), RequestInfoRow( title: _subtitle.engineerName, @@ -201,11 +210,12 @@ class RequestDetailsPage extends StatelessWidget { title: _subtitle.date, info: serviceRequest.date, ), - serviceRequest.nextVisitDate == null ? SizedBox.shrink() : - RequestInfoRow( - title: _subtitle.nextVisitDate, - info: DateFormat('EE dd/MM/yyyy').format(serviceRequest.nextVisitDate), - ), + serviceRequest.nextVisitDate == null + ? SizedBox.shrink() + : RequestInfoRow( + title: _subtitle.nextVisitDate, + info: DateFormat('EE dd/MM/yyyy').format(serviceRequest.nextVisitDate), + ), Row( children: [ Expanded( @@ -215,12 +225,12 @@ class RequestDetailsPage extends StatelessWidget { textScaleFactor: AppStyle.getScaleFactor(context), ), ), - StatusLabel(label: serviceRequest.statusLabel, - color: AColors.getRequestStatusColor(serviceRequest.statusValue) - ), + StatusLabel(label: serviceRequest.statusLabel, color: AColors.getRequestStatusColor(serviceRequest.statusValue)), ], ), - Divider(color: Theme.of(context).primaryColor,), + Divider( + color: Theme.of(context).primaryColor, + ), RequestInfoRow( title: _subtitle.hospital, info: serviceRequest.hospitalName, @@ -241,10 +251,10 @@ class RequestDetailsPage extends StatelessWidget { title: _subtitle.maintenanceIssue, content: serviceRequest.maintenanceIssue, ), - if(serviceRequest.audio?.isNotEmpty == true) - ASoundPlayer( - audio: serviceRequest.audio, - ), + if (serviceRequest.audio?.isNotEmpty == true) + ASoundPlayer( + audio: serviceRequest.audio, + ), // // Center( // child: Padding( @@ -286,65 +296,64 @@ class RequestDetailsPage extends StatelessWidget { // ) ], ), - serviceRequest.viewReport ? - ListView( - padding: EdgeInsets.symmetric(horizontal: 16), - children: [ - RequestInfoRow( - title: _subtitle.faultDescription, - content: serviceRequest.faultDescription, - ), - RequestInfoRow( - title: _subtitle.workPerformed, - content: serviceRequest.workPerformed, - ), - RequestInfoRow( - title: _subtitle.visitDate, - info: serviceRequest.visitDate, - ), - RequestInfoRow( - title: _subtitle.jobSheetNumber, - info: serviceRequest.jobSheetNumber, - ), - _userProvider.user.type == UsersTypes.engineer - && serviceRequest.reportID != null? - Padding( - padding: EdgeInsets.all(32), - child: AButton( - text: _subtitle.editServiceReport, - onPressed: (){ - Navigator.of(context).push( - MaterialPageRoute( - builder: (_) => FutureServiceReport( - request: serviceRequest, + serviceRequest.viewReport + ? ListView( + padding: EdgeInsets.symmetric(horizontal: 16), + children: [ + RequestInfoRow( + title: _subtitle.faultDescription, + content: serviceRequest.faultDescription, + ), + RequestInfoRow( + title: _subtitle.workPerformed, + content: serviceRequest.workPerformed, + ), + RequestInfoRow( + title: _subtitle.visitDate, + info: serviceRequest.visitDate, + ), + RequestInfoRow( + title: _subtitle.jobSheetNumber, + info: serviceRequest.jobSheetNumber, + ), + _userProvider.user.type == UsersTypes.engineer && serviceRequest.reportID != null + ? Padding( + padding: EdgeInsets.all(32), + child: AButton( + text: _subtitle.editServiceReport, + onPressed: () { + Navigator.of(context).push( + MaterialPageRoute( + builder: (_) => FutureServiceReport( + request: serviceRequest, + )), + ); + }, + ), ) + : SizedBox.shrink(), + ], + ) + : _userProvider.user.type == UsersTypes.engineer + ? Center( + child: Padding( + padding: EdgeInsets.all(32), + child: AButton( + text: "Create Report", + onPressed: () { + Navigator.of(context).push( + MaterialPageRoute( + builder: (_) => CreateServiceReport( + request: serviceRequest, + )), + ); + }, + ), ), - ); - }, - ), - ): SizedBox.shrink(), - ], - ): - _userProvider.user.type == UsersTypes.engineer ? - Center( - child: Padding( - padding: EdgeInsets.all(32), - child: AButton( - text: "Create Report", - onPressed: (){ - Navigator.of(context).push( - MaterialPageRoute( - builder: (_) => CreateServiceReport( - request: serviceRequest, - ) + ) + : Center( + child: ASubTitle(_subtitle.noDateFound), ), - ); - }, - ), - ), - ): Center(child: ASubTitle(_subtitle.noDateFound),), - - ], ), ), diff --git a/lib/views/widgets/requests/service_request_update_dialog.dart b/lib/views/widgets/requests/service_request_update_dialog.dart index e2680384..ce8cae93 100644 --- a/lib/views/widgets/requests/service_request_update_dialog.dart +++ b/lib/views/widgets/requests/service_request_update_dialog.dart @@ -54,8 +54,7 @@ class _ServiceRequestsUpdateDialogState extends State(context); + final userProvider = Provider.of(context); + final menuProvider = Provider.of(context); + return LoadingManager( + isLoading: menuProvider.isLoading, + isFailedLoading: menuProvider.items == null, + stateCode: menuProvider.stateCode, + onRefresh: () async { + menuProvider.reset(); + await menuProvider.getData(user: userProvider.user, host: settingProvider.host); + }, + child: SingleStatusMenu( + initialStatus: initialValue, + statuses: menuProvider.items, + onSelect: onSelect, + ), + ); + } +} diff --git a/lib/views/widgets/status/service_request/service_request_loan_availability.dart b/lib/views/widgets/status/service_request/service_request_loan_availability.dart new file mode 100644 index 00000000..31cb3f33 --- /dev/null +++ b/lib/views/widgets/status/service_request/service_request_loan_availability.dart @@ -0,0 +1,35 @@ +import 'package:flutter/material.dart'; +import 'package:provider/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/models/lookup.dart'; +import 'package:test_sa/views/widgets/loaders/loading_manager.dart'; +import 'package:test_sa/views/widgets/status/single_status_menu.dart'; + +import '../../../../controllers/providers/api/status_drop_down/service_reqest/service_request_loan_availability_provider.dart'; + +class ServiceRequestedLoanAvailability extends StatelessWidget { + final Function(Lookup) onSelect; + final Lookup initialValue; + + const ServiceRequestedLoanAvailability({Key key, this.onSelect, this.initialValue}) : super(key: key); + @override + Widget build(BuildContext context) { + final settingProvider = Provider.of(context); + final userProvider = Provider.of(context); + final menuProvider = Provider.of(context); + return LoadingManager( + isLoading: menuProvider.isLoading, + isFailedLoading: menuProvider.items == null, + stateCode: menuProvider.stateCode, + onRefresh: () async { + menuProvider.reset(); + await menuProvider.getData(user: userProvider.user, host: settingProvider.host); + }, + child: SingleStatusMenu( + initialStatus: initialValue, + statuses: menuProvider.items, + onSelect: onSelect, + )); + } +} From d0f083ce223da4145bc3bd5c276425e55dd023e5 Mon Sep 17 00:00:00 2001 From: zaid_daoud Date: Mon, 29 May 2023 14:59:40 +0300 Subject: [PATCH 032/181] - Update Login API - Adding Get Service Request By ID API --- lib/controllers/api_routes/urls.dart | 3 +- .../api/service_requests_provider.dart | 34 ++- .../providers/api/user_provider.dart | 13 +- lib/models/user.dart | 261 +++++++++++++----- .../request_device_transfer.dart | 4 +- lib/views/pages/login.dart | 2 +- lib/views/pages/register.dart | 41 +-- lib/views/pages/splash_screen.dart | 33 +-- .../notifications/notifications_page.dart | 27 +- lib/views/pages/user/profile_page.dart | 153 +++++----- .../pages/user/requests/create_request.dart | 8 +- .../pages/user/requests/requests_page.dart | 37 ++- .../auto_complete_devices_field.dart | 102 +++---- .../equipment/single_device_picker.dart | 82 +++--- .../pentry/pentry_calibration_tool_form.dart | 2 +- 15 files changed, 449 insertions(+), 353 deletions(-) diff --git a/lib/controllers/api_routes/urls.dart b/lib/controllers/api_routes/urls.dart index 44645f76..36f430fd 100644 --- a/lib/controllers/api_routes/urls.dart +++ b/lib/controllers/api_routes/urls.dart @@ -14,7 +14,7 @@ class URLs { static String getFileUrl(String file) => file == null || file.isEmpty ? null : "$_host/attachment/$file"; // API Routes - static get login => "$_baseUrl/MobileAuth/Login"; // post + static get login => "$_baseUrl/MobileAuth/LoginIntegration"; // post static get register => "$_baseUrl/handle/create/user"; // post static get updateProfile => "$_baseUrl/update/user/profile"; // post static get getHospitals => "$_baseUrl/Customer/GetCustomers"; // get @@ -23,6 +23,7 @@ class URLs { static get getModels => "$_baseUrl/ModelDefinition/GetModelDefinitionAsset"; // get ?client=2 // 08051 static get getServiceRequests => "$_baseUrl/CallRequest/GetCallRequests"; // get + static get getServiceRequestById => "$_baseUrl/CallRequest/GetCallRequestById"; // get static get getServiceRequestThrough => "$_baseUrl/Lookups/GetLookup?lookupEnum=603"; // get static get getServiceLoanAvailability => "$_baseUrl/Lookups/GetLookup?lookupEnum=4"; // get static get getServiceFirstAction => "$_baseUrl/Lookups/GetLookup?lookupEnum=700"; // get diff --git a/lib/controllers/providers/api/service_requests_provider.dart b/lib/controllers/providers/api/service_requests_provider.dart index e989a85d..6f853e06 100644 --- a/lib/controllers/providers/api/service_requests_provider.dart +++ b/lib/controllers/providers/api/service_requests_provider.dart @@ -138,7 +138,7 @@ class ServiceRequestsProvider extends ChangeNotifier { "assets": serviceRequest.deviceId == null ? [] : [serviceRequest.deviceId], "requestedDate": DateTime.now().toIso8601String(), "requestedTime": DateTime.now().toIso8601String(), - "client": user.hospital?.id ?? '', + "client": user.clientId, "callComments": serviceRequest.maintenanceIssue, if (serviceRequest.devicePhotos.isNotEmpty) "attachmentsCallRequest": serviceRequest.devicePhotos.map((e) => {"name": e}).toList(), "priority": serviceRequest.priority.toMap(), @@ -215,13 +215,14 @@ class ServiceRequestsProvider extends ChangeNotifier { @required ServiceRequest request, DateTime date, }) async { + String callNo = await getServiceRequestCallNoById(requestId: request.id) ?? ""; Response response; var body = { "id": request.id, - "callNo": "", + "callNo": callNo, "callCreatedBy": {"id": user.id, "name": user.userName}, - "requestedDate": date?.toIso8601String(), - "requestedTime": date?.toIso8601String(), + "requestedDate": date?.toIso8601String() ?? "", + "requestedTime": date?.toIso8601String() ?? "", "priority": request.priority?.toMap(), "defectType": request.defectType?.toMap(), "typeofRequest": request.type?.toMap(), @@ -245,8 +246,8 @@ class ServiceRequestsProvider extends ChangeNotifier { "noofFollowup": 0, // "status": null, "callLastSituation": null, - "firstAction": request.firstAction.toMap(), - "loanAvailablity": request.loanAvailability.toMap(), + "firstAction": request.firstAction?.toMap(), + "loanAvailablity": request.loanAvailability?.toMap(), "comments": request.comment, "firstActionDate": null, "visitDate": null, @@ -417,4 +418,25 @@ class ServiceRequestsProvider extends ChangeNotifier { throw (HttpStatusManger.getStatusMessage(status: response.statusCode, subtitle: subtitle)); } } + + Future getServiceRequestCallNoById({@required String requestId}) async { + Response response; + try { + response = await ApiManager.instance.get( + URLs.getServiceRequestById + "?callRequestId=$requestId", + ); + } catch (error) { + print(error); + return ""; + } + + // 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. + print(json.decode(response.body)["data"]); + return json.decode(response.body)["data"]["callNo"] as String; + } else { + return ""; + } + } } diff --git a/lib/controllers/providers/api/user_provider.dart b/lib/controllers/providers/api/user_provider.dart index 918787b0..bce2ce22 100644 --- a/lib/controllers/providers/api/user_provider.dart +++ b/lib/controllers/providers/api/user_provider.dart @@ -98,7 +98,8 @@ class UserProvider extends ChangeNotifier { if (response.statusCode >= 200 && response.statusCode < 300) { // client's request was successfully received _user = User.fromJson(jsonDecode(utf8.decode(response.bodyBytes))[0]); - _user.hospital = user.hospital; + _user.clientId = user.clientId; + _user.clientName = user.clientName; notifyListeners(); return response.statusCode; } @@ -123,8 +124,8 @@ class UserProvider extends ChangeNotifier { Map jsonObject = {}; jsonObject["uid"] = user.id; jsonObject["token"] = user.token; - if (user.department.id != _user.department.id) jsonObject["department"] = user.department.id; - if (user.whatsApp != _user.whatsApp) jsonObject["whatsapp"] = user.whatsApp; + if (user.departmentId != _user.departmentId) jsonObject["department"] = user.departmentId; + // if (user.whatsApp != _user.whatsApp) jsonObject["whatsapp"] = user.whatsApp; if (user.phoneNumber != _user.phoneNumber) jsonObject["phone"] = user.phoneNumber; try { response = response = await ApiManager.instance.post( @@ -143,8 +144,10 @@ class UserProvider extends ChangeNotifier { if (response.statusCode >= 200 && response.statusCode < 300) { // client's request was successfully received _user = User.fromJson(jsonDecode(utf8.decode(response.bodyBytes))[0]); - _user.hospital = user.hospital; - _user.department = user.department; + _user.clientId = user.clientId; + _user.clientName = user.clientName; + _user.departmentName = user.departmentName; + _user.departmentId = user.departmentId; notifyListeners(); return response.statusCode; } diff --git a/lib/models/user.dart b/lib/models/user.dart index 05a1f3cc..89b031a5 100644 --- a/lib/models/user.dart +++ b/lib/models/user.dart @@ -1,108 +1,219 @@ import 'package:test_sa/controllers/notification/firebase_notification_manger.dart'; -import 'package:test_sa/models/department.dart'; import 'package:test_sa/models/enums/user_types.dart'; -import 'package:test_sa/models/hospital.dart'; class User { + int clientId; + String clientName; + int departmentId; + String departmentName; + String message; + String username; + String userID; + String email; + String password; + String token; + dynamic roles; + List userRoles; + String tokenlife; + bool isAuthenticated; + bool hasError; + String profilePhotoName; String id; String userName; - String password; - String email; - Hospital hospital; - Department department; - UsersTypes type; + String normalizedUserName; + String normalizedEmail; + bool emailConfirmed; + dynamic passwordHash; + String securityStamp; + String concurrencyStamp; String phoneNumber; - String whatsApp; - String token; - bool isActive; - DateTime tokenLife; + bool phoneNumberConfirmed; + bool twoFactorEnabled; + dynamic lockoutEnd; + bool lockoutEnabled; + int accessFailedCount; - User( - {this.id, - this.userName = "", - this.email = "", - this.password = "", - this.phoneNumber = "", - this.hospital, - this.department, - this.type, - this.whatsApp, - this.token, - this.tokenLife, - this.isActive = false}); + User({ + this.clientId, + this.clientName, + this.departmentId, + this.departmentName, + this.message, + this.username, + this.userID, + this.email, + this.password, + this.token, + this.roles, + this.userRoles, + this.tokenlife, + this.isAuthenticated, + this.hasError, + this.profilePhotoName, + this.id, + this.userName, + this.normalizedUserName, + this.normalizedEmail, + this.emailConfirmed, + this.passwordHash, + this.securityStamp, + this.concurrencyStamp, + this.phoneNumber, + this.phoneNumberConfirmed, + this.twoFactorEnabled, + this.lockoutEnd, + this.lockoutEnabled, + this.accessFailedCount, + }); Future> toLoginJson() async { if (FirebaseNotificationManger.token == null) await FirebaseNotificationManger.getToken(); return { "username": userName, "password": password, - "firebase_token": FirebaseNotificationManger?.token ?? "", + "fireBaseToken": FirebaseNotificationManger?.token ?? "", }; } + UsersTypes get type { + switch (userRoles.first.name) { + case "Engineer": + return UsersTypes.engineer; + case "Nurse": + return UsersTypes.normal_user; + default: + return null; + } + } + Map toUpdateProfileJson() { Map jsonObject = {}; - if (department?.id != null) jsonObject["department"] = department.id; - if (whatsApp != null && whatsApp.isNotEmpty) jsonObject["whatsapp"] = whatsApp; - if (phoneNumber != null && phoneNumber.isNotEmpty) jsonObject["phone"] = phoneNumber; + // if (departmentId != null) jsonObject["department"] = departmentId; + // if (whatsApp != null && whatsApp.isNotEmpty) jsonObject["whatsapp"] = whatsApp; + // if (phoneNumber != null && phoneNumber.isNotEmpty) jsonObject["phone"] = phoneNumber; return jsonObject; } Future> toRegisterJson() async { - if (FirebaseNotificationManger.token == null) await FirebaseNotificationManger.getToken(); + // if (FirebaseNotificationManger.token == null) await FirebaseNotificationManger.getToken(); return { - "username": userName, - "email": email, - "whatsapp": whatsApp, - "client": hospital.id, - "department": department?.id, - "phone": phoneNumber, - "pass": password, - "firebase_token": FirebaseNotificationManger?.token ?? "", + // "username": userName, + // "email": email, + // "whatsapp": whatsApp, + // "client": hospital.id, + // "department": department?.id, + // "phone": phoneNumber, + // "pass": password, + // "firebase_token": FirebaseNotificationManger?.token ?? "", }; } Map toJson() { - return { - "userID": id, - "username": userName, - "email": email, - "token": token, - "phoneNumber": phoneNumber, - "whatsapp": whatsApp, - "client_id": hospital?.id, - "client_name": hospital?.name, - "department_id": department?.id, - "department_name": department?.name, - //"password":password, - "tokenlife": tokenLife.toIso8601String(), - "active": isActive, - "userRoles": type == UsersTypes.engineer ? "value: R-6" : "value: R-5", - // "token":token, pass is token - }; + final map = {}; + map['client_id'] = clientId; + map['client_name'] = clientName; + map['department_id'] = departmentId; + map['department_name'] = departmentName; + map['message'] = message; + map['username'] = username; + map['userID'] = userID; + map['email'] = email; + map['password'] = password; + map['token'] = token; + map['roles'] = roles; + if (userRoles != null) { + map['userRoles'] = userRoles.map((v) => v.toJson()).toList(); + } + map['tokenlife'] = tokenlife; + map['isAuthenticated'] = isAuthenticated; + map['hasError'] = hasError; + map['profilePhotoName'] = profilePhotoName; + map['id'] = id; + map['userName'] = userName; + map['normalizedUserName'] = normalizedUserName; + map['normalizedEmail'] = normalizedEmail; + map['emailConfirmed'] = emailConfirmed; + map['passwordHash'] = passwordHash; + map['securityStamp'] = securityStamp; + map['concurrencyStamp'] = concurrencyStamp; + map['phoneNumber'] = phoneNumber; + map['phoneNumberConfirmed'] = phoneNumberConfirmed; + map['twoFactorEnabled'] = twoFactorEnabled; + map['lockoutEnd'] = lockoutEnd; + map['lockoutEnabled'] = lockoutEnabled; + map['accessFailedCount'] = accessFailedCount; + return map; } - factory User.fromJson(Map parsedJson) { - UsersTypes type; - if (parsedJson["userRoles"].toString().contains("value: R-4") || parsedJson["userRoles"].toString().contains("value: R-5") || parsedJson["userRoles"].toString().contains("value: R-7")) { - type = UsersTypes.normal_user; - } else { - type = UsersTypes.engineer; + User.fromJson(dynamic json) { + clientId = json['client_id']; + clientName = json['client_name']; + departmentId = json['department_id']; + departmentName = json['department_name']; + message = json['message']; + username = json['username']; + userID = json['userID']; + email = json['email']; + password = json['password']; + token = json['token']; + roles = json['roles']; + if (json['userRoles'] != null) { + userRoles = []; + json['userRoles'].forEach((v) { + userRoles.add(UserRoles.fromJson(v)); + }); } - return User( - id: parsedJson["userID"], - userName: parsedJson["username"], - email: parsedJson["email"], - hospital: Hospital(id: parsedJson["client_id"], name: parsedJson["client_name"]), - department: Department( - id: parsedJson["department_id"], - name: parsedJson["department_name"], - ), - phoneNumber: parsedJson["phoneNumber"], - whatsApp: parsedJson["phoneNumber"], - token: parsedJson["token"], - isActive: parsedJson["isAuthenticated"], - tokenLife: DateTime.tryParse(parsedJson["tokenlife"] ?? ""), - type: type); + tokenlife = json['tokenlife']; + isAuthenticated = json['isAuthenticated']; + hasError = json['hasError']; + profilePhotoName = json['profilePhotoName']; + id = json['id']; + userName = json['userName']; + normalizedUserName = json['normalizedUserName']; + normalizedEmail = json['normalizedEmail']; + emailConfirmed = json['emailConfirmed']; + passwordHash = json['passwordHash']; + securityStamp = json['securityStamp']; + concurrencyStamp = json['concurrencyStamp']; + phoneNumber = json['phoneNumber']; + phoneNumberConfirmed = json['phoneNumberConfirmed']; + twoFactorEnabled = json['twoFactorEnabled']; + lockoutEnd = json['lockoutEnd']; + lockoutEnabled = json['lockoutEnabled']; + accessFailedCount = json['accessFailedCount']; + } +} + +class UserRoles { + UserRoles({ + this.id, + this.name, + this.value, + }); + + UserRoles.fromJson(dynamic json) { + id = json['id']; + name = json['name']; + value = json['value']; + } + String id; + String name; + String value; + UserRoles copyWith({ + String id, + String name, + String value, + }) => + UserRoles( + id: id ?? this.id, + name: name ?? this.name, + value: value ?? this.value, + ); + Map toJson() { + final map = {}; + map['id'] = id; + map['name'] = name; + map['value'] = value; + return map; } } diff --git a/lib/views/pages/device_transfer/request_device_transfer.dart b/lib/views/pages/device_transfer/request_device_transfer.dart index 6eb86d08..c92c4929 100644 --- a/lib/views/pages/device_transfer/request_device_transfer.dart +++ b/lib/views/pages/device_transfer/request_device_transfer.dart @@ -35,7 +35,7 @@ class _RequestDeviceTransferState extends State { SettingProvider _settingProvider; DeviceTransferProvider _deviceTransferProvider; final TextEditingController _requestedQuantityController = TextEditingController(); - final DeviceTransfer _formModel = DeviceTransfer(receiver: DeviceTransferInfo(),sender: DeviceTransferInfo()); + final DeviceTransfer _formModel = DeviceTransfer(receiver: DeviceTransferInfo(), sender: DeviceTransferInfo()); final GlobalKey _formKey = GlobalKey(); final GlobalKey _scaffoldKey = GlobalKey(); @@ -59,7 +59,7 @@ class _RequestDeviceTransferState extends State { _isLoading = true; setState(() {}); - _formModel.sender?.client?.id = _userProvider.user?.hospital?.id; + _formModel.sender?.client?.id = _userProvider.user?.clientId; int status = await _deviceTransferProvider.createRequest( user: _userProvider.user, host: _settingProvider.host, diff --git a/lib/views/pages/login.dart b/lib/views/pages/login.dart index 3bd061b0..65585b85 100644 --- a/lib/views/pages/login.dart +++ b/lib/views/pages/login.dart @@ -113,7 +113,7 @@ class _LoginState extends State { user: _user, host: _settingProvider.host, ); - if (status >= 200 && status < 300 && _userProvider.user?.userName != null) { + if (status >= 200 && status < 300) { _settingProvider.setUser(_userProvider.user); // if (_userProvider.user.isActive) Navigator.of(context).pushNamed(LandPage.id); diff --git a/lib/views/pages/register.dart b/lib/views/pages/register.dart index 22cd7d91..ab370de9 100644 --- a/lib/views/pages/register.dart +++ b/lib/views/pages/register.dart @@ -1,12 +1,13 @@ import 'package:flutter/material.dart'; import 'package:fluttertoast/fluttertoast.dart'; -import 'package:font_awesome_flutter/font_awesome_flutter.dart'; import 'package:provider/provider.dart'; import 'package:test_sa/controllers/api_routes/http_status_manger.dart'; import 'package:test_sa/controllers/localization/localization.dart'; import 'package:test_sa/controllers/providers/api/user_provider.dart'; import 'package:test_sa/controllers/providers/settings/setting_provider.dart'; import 'package:test_sa/controllers/validator/validator.dart'; +import 'package:test_sa/models/department.dart'; +import 'package:test_sa/models/hospital.dart'; import 'package:test_sa/models/subtitle.dart'; import 'package:test_sa/models/user.dart'; import 'package:test_sa/views/widgets/app_text_form_field.dart'; @@ -123,17 +124,19 @@ class _RegisterState extends State { ), const SizedBox(height: 12), HospitalButton( - hospital: _user.hospital, + hospital: Hospital(id: _user.clientId, name: _user.clientName), onHospitalPick: (hospital) { - _user.hospital = hospital; + _user.clientId = hospital.id; + _user.clientName = hospital.name; setState(() {}); }, ), const SizedBox(height: 12), DepartmentButton( - department: _user.department, + department: Department(id: _user.departmentId, name: _user.departmentName), onDepartmentPick: (department) { - _user.department = department; + _user.departmentId = department.id; + _user.departmentName = department.name; setState(() {}); }, ), @@ -150,31 +153,31 @@ class _RegisterState extends State { }, ), SizedBox(height: 8), - ATextFormField( - initialValue: _user.whatsApp, - hintText: _subtitle.whatsApp, - style: Theme.of(context).textTheme.headline6, - prefixIconData: FontAwesomeIcons.whatsapp, - prefixIconSize: 36, - validator: (value) => Validator.isPhoneNumber(value) ? null : _subtitle.phoneNumberValidateMessage, - textInputType: TextInputType.phone, - onSaved: (value) { - _user.whatsApp = value; - }, - ), + // ATextFormField( + // initialValue: _user.whatsApp, + // hintText: _subtitle.whatsApp, + // style: Theme.of(context).textTheme.headline6, + // prefixIconData: FontAwesomeIcons.whatsapp, + // prefixIconSize: 36, + // validator: (value) => Validator.isPhoneNumber(value) ? null : _subtitle.phoneNumberValidateMessage, + // textInputType: TextInputType.phone, + // onSaved: (value) { + // _user.whatsApp = value; + // }, + // ), const SizedBox(height: 12), AButton( text: _subtitle.signUp, onPressed: () async { if (!_formKey.currentState.validate()) return; _formKey.currentState.save(); - if (_user.hospital == null) { + if (_user.clientId == null) { ScaffoldMessenger.of(context).showSnackBar(SnackBar( content: Text(_subtitle.hospitalRequired), )); return; } - if (_user.department == null) { + if (_user.departmentId == null) { ScaffoldMessenger.of(context).showSnackBar(SnackBar( content: Text(_subtitle.unitRequired), )); diff --git a/lib/views/pages/splash_screen.dart b/lib/views/pages/splash_screen.dart index bd7a770f..e28c09de 100644 --- a/lib/views/pages/splash_screen.dart +++ b/lib/views/pages/splash_screen.dart @@ -22,12 +22,11 @@ class SplashScreen extends StatefulWidget { } class _SplashScreenState extends State { - SettingProvider _settingProvider; UserProvider _userProvider; - _goToUserScreen(User user){ - if(user.tokenLife != null && user.tokenLife.isAfter(DateTime.now())){ + _goToUserScreen(User user) { + if (user.tokenlife != null && (DateTime.tryParse(user.tokenlife)?.isAfter(DateTime.now()) ?? false)) { _userProvider.user = user; // Navigator.of(context).pushNamed(Login.id); Navigator.of(context).pushNamed(LandPage.id); @@ -38,38 +37,30 @@ class _SplashScreenState extends State { void initState() { Firebase.initializeApp(); - NotificationManger.initialisation( - (notificationDetails) { - AppNotification notification = AppNotification.fromJson(json.decode(notificationDetails.payload)); - if(notification.path == null || notification.path.isEmpty) - return; - Navigator.pushNamed( - context, - notification.path, - arguments: notification.requestId - ); - } - , (id, title, body, payload) async { - }); + NotificationManger.initialisation((notificationDetails) { + AppNotification notification = AppNotification.fromJson(json.decode(notificationDetails.payload)); + if (notification.path == null || notification.path.isEmpty) return; + Navigator.pushNamed(context, notification.path, arguments: notification.requestId); + }, (id, title, body, payload) async {}); super.initState(); } @override Widget build(BuildContext context) { - _settingProvider = Provider.of(context,listen: false); - _userProvider = Provider.of(context,listen: false); + _settingProvider = Provider.of(context, listen: false); + _userProvider = Provider.of(context, listen: false); return Scaffold( backgroundColor: Colors.white, body: Center( child: SizedBox( - width: MediaQuery.of(context).size.width/1.1, - child: FlareActor( + width: MediaQuery.of(context).size.width / 1.1, + child: FlareActor( "assets/rives/atoms_splash.flr", fit: BoxFit.contain, animation: "splash", callback: (animation) async { Navigator.of(context).pushNamed(Login.id); - if(_settingProvider.isLoaded && _settingProvider.user != null){ + if (_settingProvider.isLoaded && _settingProvider.user != null) { _goToUserScreen(_settingProvider.user); } }, diff --git a/lib/views/pages/user/notifications/notifications_page.dart b/lib/views/pages/user/notifications/notifications_page.dart index a0e85259..bab082e3 100644 --- a/lib/views/pages/user/notifications/notifications_page.dart +++ b/lib/views/pages/user/notifications/notifications_page.dart @@ -9,14 +9,14 @@ import 'package:test_sa/views/app_style/colors.dart'; import 'package:test_sa/views/pages/user/notifications/notifications_list.dart'; import 'package:test_sa/views/widgets/buttons/app_back_button.dart'; import 'package:test_sa/views/widgets/loaders/loading_manager.dart'; + class NotificationsPage extends StatefulWidget { static final String id = "/notifications"; @override _NotificationsPageState createState() => _NotificationsPageState(); } -class _NotificationsPageState extends State - with TickerProviderStateMixin{ +class _NotificationsPageState extends State with TickerProviderStateMixin { NotificationsProvider _notificationsProvider; UserProvider _userProvider; SettingProvider _settingProvider; @@ -36,9 +36,9 @@ class _NotificationsPageState extends State onRefresh: () async { _notificationsProvider.reset(); await _notificationsProvider.getNotifications( - user: _userProvider.user, - host: _settingProvider.host, - hospitalId: _userProvider.user.hospital.id, + user: _userProvider.user, + host: _settingProvider.host, + hospitalId: _userProvider.user.clientId, ); }, child: Stack( @@ -46,8 +46,8 @@ class _NotificationsPageState extends State Column( children: [ Container( - color:AColors.primaryColor, - padding: const EdgeInsets.symmetric(horizontal: 0,vertical: 4), + color: AColors.primaryColor, + padding: const EdgeInsets.symmetric(horizontal: 0, vertical: 4), child: Column( children: [ Row( @@ -57,17 +57,15 @@ class _NotificationsPageState extends State child: Center( child: Text( _subtitle.notifications, - style: Theme.of(context).textTheme.headline6.copyWith( - color: AColors.white, - fontStyle: FontStyle.italic - ), + style: Theme.of(context).textTheme.headline6.copyWith(color: AColors.white, fontStyle: FontStyle.italic), ), ), ), - SizedBox(width: 48,) + SizedBox( + width: 48, + ) ], ), - ], ), ), @@ -78,7 +76,7 @@ class _NotificationsPageState extends State await _notificationsProvider.getNotifications( user: _userProvider.user, host: _settingProvider.host, - hospitalId: _userProvider.user.hospital.id, + hospitalId: _userProvider.user.clientId, ); }, notifications: _notificationsProvider.notifications, @@ -86,7 +84,6 @@ class _NotificationsPageState extends State ), ], ), - ], ), ), diff --git a/lib/views/pages/user/profile_page.dart b/lib/views/pages/user/profile_page.dart index 0b3757a0..f5bb5c2c 100644 --- a/lib/views/pages/user/profile_page.dart +++ b/lib/views/pages/user/profile_page.dart @@ -1,11 +1,12 @@ import 'package:flutter/material.dart'; -import 'package:font_awesome_flutter/font_awesome_flutter.dart'; import 'package:provider/provider.dart'; import 'package:test_sa/controllers/api_routes/http_status_manger.dart'; import 'package:test_sa/controllers/localization/localization.dart'; import 'package:test_sa/controllers/providers/api/user_provider.dart'; import 'package:test_sa/controllers/providers/settings/setting_provider.dart'; import 'package:test_sa/controllers/validator/validator.dart'; +import 'package:test_sa/models/department.dart'; +import 'package:test_sa/models/hospital.dart'; import 'package:test_sa/models/subtitle.dart'; import 'package:test_sa/models/user.dart'; import 'package:test_sa/views/app_style/colors.dart'; @@ -16,6 +17,7 @@ import 'package:test_sa/views/widgets/buttons/app_button.dart'; import 'package:test_sa/views/widgets/departments/department_button.dart'; import 'package:test_sa/views/widgets/hospitals/hospital_button.dart'; import 'package:test_sa/views/widgets/loaders/loading_manager.dart'; + class ProfilePage extends StatefulWidget { static final String id = "/user/profile"; @override @@ -38,13 +40,13 @@ class _ProfilePageState extends State { _width = MediaQuery.of(context).size.width; _height = MediaQuery.of(context).size.height; Subtitle _subtitle = AppLocalization.of(context).subtitle; - if(_firstTime){ + if (_firstTime) { _user = User.fromJson(_userProvider.user.toJson()); _firstTime = false; } return Scaffold( key: _scaffoldKey, - body:LoadingManager( + body: LoadingManager( isLoading: _userProvider.isLoading, isFailedLoading: false, stateCode: 200, @@ -60,23 +62,19 @@ class _ProfilePageState extends State { Hero( tag: "logo", child: Image( - height: _height/4, + height: _height / 4, image: AssetImage("assets/images/logo.png"), ), ), Container( - padding: EdgeInsets.symmetric(horizontal: 16,vertical: 16), + padding: EdgeInsets.symmetric(horizontal: 16, vertical: 16), margin: EdgeInsets.symmetric(horizontal: 16), - decoration: BoxDecoration( - color: AColors.primaryColor, - borderRadius: BorderRadius.circular(AppStyle.getBorderRadius(context)), - boxShadow: [ - BoxShadow( - color: AColors.grey, - offset: Offset(0,-1), - ) - ] - ), + decoration: BoxDecoration(color: AColors.primaryColor, borderRadius: BorderRadius.circular(AppStyle.getBorderRadius(context)), boxShadow: [ + BoxShadow( + color: AColors.grey, + offset: Offset(0, -1), + ) + ]), child: Column( children: [ ATextFormField( @@ -85,13 +83,14 @@ class _ProfilePageState extends State { enable: false, prefixIconData: Icons.account_circle, style: Theme.of(context).textTheme.headline6, - validator: (value) => Validator.hasValue(value) - ? null : _subtitle.nameValidateMessage, - onSaved: (value){ + validator: (value) => Validator.hasValue(value) ? null : _subtitle.nameValidateMessage, + onSaved: (value) { _user.userName = value; }, ), - SizedBox(height: 8,), + SizedBox( + height: 8, + ), ATextFormField( initialValue: _user.email, hintText: _subtitle.email, @@ -99,110 +98,108 @@ class _ProfilePageState extends State { prefixIconData: Icons.email, textInputType: TextInputType.emailAddress, style: Theme.of(context).textTheme.headline6, - validator: (value) => Validator.isEmail(value) - ? null : _subtitle.emailValidateMessage, - onSaved: (value){ + validator: (value) => Validator.isEmail(value) ? null : _subtitle.emailValidateMessage, + onSaved: (value) { _user.email = value; }, ), - SizedBox(height: 8,), + SizedBox( + height: 8, + ), AbsorbPointer( child: HospitalButton( - hospital: _user.hospital, - onHospitalPick: (hospital){ - _user.hospital = hospital; + hospital: Hospital(name: _user.clientName, id: _user.clientId), + onHospitalPick: (hospital) { + _user.clientName = hospital.name; + _user.clientId = hospital.id; setState(() {}); }, ), ), - SizedBox(height: 8,), + SizedBox( + height: 8, + ), DepartmentButton( - department: _user.department, - onDepartmentPick: (department){ - _user.department = department; + department: Department(name: _user.departmentName, id: _user.departmentId), + onDepartmentPick: (department) { + _user.departmentName = department.name; + _user.departmentId = department.id; setState(() {}); }, ), - SizedBox(height: 8,), + SizedBox( + height: 8, + ), ATextFormField( initialValue: _user.phoneNumber, hintText: _subtitle.phoneNumber, style: Theme.of(context).textTheme.headline6, prefixIconData: Icons.phone_android, - validator: (value) => - Validator.isPhoneNumber(value) ? null : _subtitle.phoneNumberValidateMessage, + validator: (value) => Validator.isPhoneNumber(value) ? null : _subtitle.phoneNumberValidateMessage, textInputType: TextInputType.phone, - onSaved: (value){ + onSaved: (value) { _user.phoneNumber = value; }, ), - SizedBox(height: 8,), - ATextFormField( - initialValue: _user.whatsApp, - hintText: _subtitle.whatsApp, - style: Theme.of(context).textTheme.headline6, - prefixIconData: FontAwesomeIcons.whatsapp, - prefixIconSize: 36, - validator: (value) => - Validator.isPhoneNumber(value) ? null : _subtitle.phoneNumberValidateMessage, - textInputType: TextInputType.phone, - onSaved: (value){ - _user.whatsApp = value; - }, + SizedBox( + height: 8, ), + // ATextFormField( + // initialValue: _user.whatsApp, + // hintText: _subtitle.whatsApp, + // style: Theme.of(context).textTheme.headline6, + // prefixIconData: FontAwesomeIcons.whatsapp, + // prefixIconSize: 36, + // validator: (value) => + // Validator.isPhoneNumber(value) ? null : _subtitle.phoneNumberValidateMessage, + // textInputType: TextInputType.phone, + // onSaved: (value){ + // _user.whatsApp = value; + // }, + // ), ], ), ), - SizedBox(height: 16,), + SizedBox( + height: 16, + ), Center( child: SizedBox( height: _width / 8, - width: _width/1.2, + width: _width / 1.2, child: AButton( text: _subtitle.update, onPressed: () async { - if(!_formKey.currentState.validate()) - return; + if (!_formKey.currentState.validate()) return; _formKey.currentState.save(); - if(_user.department?.id == null){ - ScaffoldMessenger.of(context).showSnackBar( - SnackBar( - content: Text( - _subtitle.unitRequired - ), - ) - ); + if (_user.departmentId == null) { + ScaffoldMessenger.of(context).showSnackBar(SnackBar( + content: Text(_subtitle.unitRequired), + )); return; } int status = await _userProvider.updateProfile( user: _user, host: _settingProvider.host, ); - if(status >= 200 && status < 300){ + if (status >= 200 && status < 300) { _settingProvider.setUser(_userProvider.user); - ScaffoldMessenger.of(context).showSnackBar( - SnackBar( - content: Text( - _subtitle.requestCompleteSuccessfully - ), - ) - ); - }else{ - String errorMessage = HttpStatusManger.getStatusMessage( - status: status, subtitle: _subtitle); - ScaffoldMessenger.of(context).showSnackBar( - SnackBar( - content: Text( - errorMessage - ), - ) - ); + ScaffoldMessenger.of(context).showSnackBar(SnackBar( + content: Text(_subtitle.requestCompleteSuccessfully), + )); + } else { + String errorMessage = HttpStatusManger.getStatusMessage(status: status, subtitle: _subtitle); + ScaffoldMessenger.of(context).showSnackBar(SnackBar( + content: Text(errorMessage), + )); } }, ), ), ), - SizedBox(height: 32,), + SizedBox( + height: 32, + ), ], ), ), diff --git a/lib/views/pages/user/requests/create_request.dart b/lib/views/pages/user/requests/create_request.dart index 5e6701f5..c6135982 100644 --- a/lib/views/pages/user/requests/create_request.dart +++ b/lib/views/pages/user/requests/create_request.dart @@ -122,21 +122,21 @@ class CreateRequestPageState extends State { crossAxisAlignment: CrossAxisAlignment.start, children: [ 12.height, - _userProvider.user.hospital == null + _userProvider.user.clientId == null ? const SizedBox.shrink() : ATextFormField( enable: false, - initialValue: _userProvider.user.hospital?.name ?? _subtitle.noHospitalFound, + initialValue: _userProvider.user.clientName ?? _subtitle.noHospitalFound, hintText: _subtitle.hospital, prefixIconData: FontAwesomeIcons.hospital, style: Theme.of(context).textTheme.subtitle1, ), 12.height, - _userProvider.user.department == null + _userProvider.user.departmentId == null ? const SizedBox.shrink() : ATextFormField( enable: false, - initialValue: _userProvider.user.department?.name ?? _subtitle.noUniteFound, + initialValue: _userProvider.user.departmentName ?? _subtitle.noUniteFound, hintText: _subtitle.unite, prefixIconData: FontAwesomeIcons.hospitalUser, style: Theme.of(context).textTheme.subtitle1, diff --git a/lib/views/pages/user/requests/requests_page.dart b/lib/views/pages/user/requests/requests_page.dart index 6c04d822..06160333 100644 --- a/lib/views/pages/user/requests/requests_page.dart +++ b/lib/views/pages/user/requests/requests_page.dart @@ -12,14 +12,14 @@ import 'package:test_sa/views/widgets/buttons/app_icon_button.dart'; import 'package:test_sa/views/widgets/loaders/loading_manager.dart'; import 'package:test_sa/views/widgets/requests/service_request_list.dart'; import 'package:test_sa/views/widgets/search/service_request_search_bar.dart'; + class ServiceRequestsPage extends StatefulWidget { static final String id = "/service-requests"; @override _ServiceRequestsPageState createState() => _ServiceRequestsPageState(); } -class _ServiceRequestsPageState extends State - with TickerProviderStateMixin{ +class _ServiceRequestsPageState extends State with TickerProviderStateMixin { ServiceRequestsProvider _serviceRequestsProvider; UserProvider _userProvider; SettingProvider _settingProvider; @@ -31,7 +31,7 @@ class _ServiceRequestsPageState extends State _userProvider = Provider.of(context); _settingProvider = Provider.of(context); Subtitle _subtitle = AppLocalization.of(context).subtitle; - if(_firstTime){ + if (_firstTime) { _serviceRequestsProvider.reset(); _firstTime = false; } @@ -45,9 +45,9 @@ class _ServiceRequestsPageState extends State onRefresh: () async { _serviceRequestsProvider.reset(); await _serviceRequestsProvider.getRequests( - user: _userProvider.user, - host: _settingProvider.host, - hospitalId: _userProvider.user.hospital?.id, + user: _userProvider.user, + host: _settingProvider.host, + hospitalId: _userProvider.user.clientId, ); }, child: Stack( @@ -55,8 +55,8 @@ class _ServiceRequestsPageState extends State Column( children: [ Container( - color:AColors.primaryColor, - padding: const EdgeInsets.symmetric(horizontal: 0,vertical: 4), + color: AColors.primaryColor, + padding: const EdgeInsets.symmetric(horizontal: 0, vertical: 4), child: Column( children: [ Row( @@ -66,10 +66,7 @@ class _ServiceRequestsPageState extends State child: Center( child: Text( _subtitle.serviceRequests, - style: Theme.of(context).textTheme.headline6.copyWith( - color: AColors.white, - fontStyle: FontStyle.italic - ), + style: Theme.of(context).textTheme.headline6.copyWith(color: AColors.white, fontStyle: FontStyle.italic), ), ), ), @@ -83,22 +80,23 @@ class _ServiceRequestsPageState extends State ServiceRequestSearch _temp = await showModalBottomSheet( context: context, isScrollControlled: true, - builder: (context){ + builder: (context) { return ServiceRequestsSearchDialog( initialSearchValue: _serviceRequestsProvider.search, ); }); - if(_temp != null){ + if (_temp != null) { _serviceRequestsProvider.search = _temp; _serviceRequestsProvider.reset(); setState(() {}); } }, ), - SizedBox(width: 16,) + SizedBox( + width: 16, + ) ], ), - ], ), ), @@ -107,9 +105,9 @@ class _ServiceRequestsPageState extends State nextPage: _serviceRequestsProvider.nextPage, onLazyLoad: () async { await _serviceRequestsProvider.getRequests( - user: _userProvider.user, - host: _settingProvider.host, - hospitalId: _userProvider.user.hospital.id, + user: _userProvider.user, + host: _settingProvider.host, + hospitalId: _userProvider.user.clientId, ); }, requests: _serviceRequestsProvider.serviceRequests, @@ -117,7 +115,6 @@ class _ServiceRequestsPageState extends State ), ], ), - ], ), ), diff --git a/lib/views/widgets/equipment/auto_complete_devices_field.dart b/lib/views/widgets/equipment/auto_complete_devices_field.dart index 3c6fbc99..0d45aa6e 100644 --- a/lib/views/widgets/equipment/auto_complete_devices_field.dart +++ b/lib/views/widgets/equipment/auto_complete_devices_field.dart @@ -8,6 +8,7 @@ import 'package:test_sa/models/device/device.dart'; import 'package:test_sa/views/app_style/colors.dart'; import 'package:test_sa/views/app_style/sizing.dart'; import 'package:test_sa/views/widgets/loaders/loading_manager.dart'; + class AutoCompleteDeviceField extends StatefulWidget { final Device initialValue; final int hospitalId; @@ -20,7 +21,6 @@ class AutoCompleteDeviceField extends StatefulWidget { } class _AutoCompleteDeviceFieldState extends State { - SettingProvider _settingProvider; DevicesProvider _devicesProvider; UserProvider _userProvider; @@ -37,6 +37,7 @@ class _AutoCompleteDeviceFieldState extends State { _controller.dispose(); super.dispose(); } + @override Widget build(BuildContext context) { _settingProvider = Provider.of(context); @@ -44,64 +45,53 @@ class _AutoCompleteDeviceFieldState extends State { _devicesProvider = Provider.of(context); //Subtitle _subtitle = AppLocalization.of(context).subtitle; return LoadingManager( - isLoading: _devicesProvider.isLoading, - isFailedLoading: _devicesProvider.devices == null, - stateCode: _devicesProvider.stateCode, - onRefresh: () async { - _devicesProvider.reset(); - await _devicesProvider.getEquipment( - host: _settingProvider.host, - user: _userProvider.user, - hospitalId: widget.hospitalId - ); - }, - child: Container( - padding: const EdgeInsets.symmetric( - horizontal: 16 - ), - decoration: BoxDecoration( - color: Colors.white, - border: Border.all(color:AColors.black), - borderRadius: BorderRadius.circular( - AppStyle.borderRadius * AppStyle.getScaleFactor(context) - ), - boxShadow: [ - AppStyle.boxShadow - ] - ), - child: TypeAheadField( - textFieldConfiguration: TextFieldConfiguration( - style: Theme.of(context).textTheme.headline6, - controller: _controller, - textAlign: TextAlign.center, - decoration: const InputDecoration( - border: InputBorder.none, - disabledBorder: InputBorder.none, - focusedBorder: InputBorder.none, - enabledBorder: InputBorder.none, - ), - textInputAction: TextInputAction.search, + isLoading: _devicesProvider.isLoading, + isFailedLoading: _devicesProvider.devices == null, + stateCode: _devicesProvider.stateCode, + onRefresh: () async { + _devicesProvider.reset(); + await _devicesProvider.getEquipment(host: _settingProvider.host, user: _userProvider.user, hospitalId: widget.hospitalId); + }, + child: Container( + padding: const EdgeInsets.symmetric(horizontal: 16), + decoration: BoxDecoration( + color: Colors.white, + border: Border.all(color: AColors.black), + borderRadius: BorderRadius.circular(AppStyle.borderRadius * AppStyle.getScaleFactor(context)), + boxShadow: [AppStyle.boxShadow]), + child: TypeAheadField( + textFieldConfiguration: TextFieldConfiguration( + style: Theme.of(context).textTheme.headline6, + controller: _controller, + textAlign: TextAlign.center, + decoration: const InputDecoration( + border: InputBorder.none, + disabledBorder: InputBorder.none, + focusedBorder: InputBorder.none, + enabledBorder: InputBorder.none, ), - suggestionsCallback: (value) async { - return await _devicesProvider.getDevicesList( - host: _settingProvider.host, - user: _userProvider.user, - hospitalId: widget.hospitalId ?? _userProvider.user.hospital.id, - serialNumber: value, - ); - }, - itemBuilder: (context, device) { - return ListTile( - title: Text(device.serialNumber), - subtitle: Text("${device.modelDefinition.modelName}/${device.modelDefinition.manufacturerName}"), - ); - }, - onSuggestionSelected: (device) { - _controller.text = device.serialNumber; - widget.onPick(device.id); - }, + textInputAction: TextInputAction.search, ), + suggestionsCallback: (value) async { + return await _devicesProvider.getDevicesList( + host: _settingProvider.host, + user: _userProvider.user, + hospitalId: widget.hospitalId ?? _userProvider.user.clientId, + serialNumber: value, + ); + }, + itemBuilder: (context, device) { + return ListTile( + title: Text(device.serialNumber), + subtitle: Text("${device.modelDefinition.modelName}/${device.modelDefinition.manufacturerName}"), + ); + }, + onSuggestionSelected: (device) { + _controller.text = device.serialNumber; + widget.onPick(device.id); + }, ), + ), ); } } diff --git a/lib/views/widgets/equipment/single_device_picker.dart b/lib/views/widgets/equipment/single_device_picker.dart index a31be4df..3af9e58e 100644 --- a/lib/views/widgets/equipment/single_device_picker.dart +++ b/lib/views/widgets/equipment/single_device_picker.dart @@ -10,9 +10,9 @@ import 'package:test_sa/models/subtitle.dart'; import 'package:test_sa/views/widgets/equipment/device_item.dart'; import 'package:test_sa/views/widgets/loaders/loading_manager.dart'; import 'package:test_sa/views/widgets/loaders/no_item_found.dart'; -import 'package:test_sa/views/widgets/qr/scan_qr.dart'; import '../app_text_form_field.dart'; + class SingleDevicePicker extends StatefulWidget { static final String id = "/single-device-Picker"; final bool sandraChoice = true; @@ -31,22 +31,16 @@ class _SingleDevicePickerState extends State { TextEditingController numberController = TextEditingController(); TextEditingController snController = TextEditingController(); _getDevice(String result) async { - if(result == null) return; + if (result == null) return; showDialog( barrierDismissible: false, context: context, - builder: (dialogContext){ + builder: (dialogContext) { return const Center(child: CircularProgressIndicator()); - } - ); - List devices = await _devicesProvider.getDevicesListBySN( - host: _settingProvider.host, - user: _userProvider.user, - hospitalId: _userProvider.user.hospital.id, - sn: result - ); + }); + List devices = await _devicesProvider.getDevicesListBySN(host: _settingProvider.host, user: _userProvider.user, hospitalId: _userProvider.user.clientId, sn: result); Navigator.of(context).pop(); - if(devices.isEmpty){ + if (devices.isEmpty) { Fluttertoast.showToast(msg: _subtitle.noDeviceFound); return; } @@ -71,7 +65,7 @@ class _SingleDevicePickerState extends State { _userProvider = Provider.of(context); _settingProvider = Provider.of(context); - if(_firstTime && _devicesProvider.devices != null){ + if (_firstTime && _devicesProvider.devices != null) { _searchableList.clear(); _searchableList.addAll(_devicesProvider.devices); _firstTime = false; @@ -85,54 +79,42 @@ class _SingleDevicePickerState extends State { isFailedLoading: _devicesProvider.devices == null, onRefresh: () async { _devicesProvider.reset(); - await _devicesProvider.getEquipment( - user: _userProvider.user, - host: _settingProvider.host, - hospitalId: _userProvider.user.hospital?.id - ); + await _devicesProvider.getEquipment(user: _userProvider.user, host: _settingProvider.host, hospitalId: _userProvider.user.clientId); }, child: Column( children: [ const SizedBox(height: 48), Padding( - padding: const EdgeInsets.symmetric(vertical: 8,horizontal: 16), + padding: const EdgeInsets.symmetric(vertical: 8, horizontal: 16), child: Column( children: [ ATextFormField( hintText: _subtitle.searchBySn, controller: snController, - style: Theme.of(context).textTheme.subtitle1, + style: Theme.of(context).textTheme.subtitle1, suffixIcon: const Icon(Icons.search_rounded), textInputAction: TextInputAction.search, onAction: () async { _devicesProvider.reset(); await _devicesProvider.getEquipment( - user: _userProvider.user, - host: _settingProvider.host, - hospitalId: _userProvider.user.hospital?.id, - serialNumber: snController.text, - number: numberController.text - ); + user: _userProvider.user, host: _settingProvider.host, hospitalId: _userProvider.user.clientId, serialNumber: snController.text, number: numberController.text); _searchableList.clear(); _searchableList.addAll(_devicesProvider.devices); }, ), - const SizedBox(height: 8,), + const SizedBox( + height: 8, + ), ATextFormField( hintText: "Search by Number", controller: numberController, - style: Theme.of(context).textTheme.subtitle1, + style: Theme.of(context).textTheme.subtitle1, suffixIcon: const Icon(Icons.search_rounded), textInputAction: TextInputAction.search, onAction: () async { _devicesProvider.reset(); await _devicesProvider.getEquipment( - user: _userProvider.user, - host: _settingProvider.host, - hospitalId: _userProvider.user.hospital?.id, - serialNumber: snController.text, - number: numberController.text - ); + user: _userProvider.user, host: _settingProvider.host, hospitalId: _userProvider.user.clientId, serialNumber: snController.text, number: numberController.text); _searchableList.clear(); _searchableList.addAll(_devicesProvider.devices); }, @@ -141,21 +123,23 @@ class _SingleDevicePickerState extends State { ), ), Expanded( - child: _searchableList.isEmpty ? - NoItemFound(message: _subtitle.noDeviceFound,): - ListView.builder( - padding: EdgeInsets.zero, - shrinkWrap: true, - itemCount: _searchableList.length, - itemBuilder: (listContext,itemIndex){ - return DeviceItem( - device: _searchableList[itemIndex], - onPressed: (device){ - Navigator.of(context).pop(device); - }, - ); - }, - ), + child: _searchableList.isEmpty + ? NoItemFound( + message: _subtitle.noDeviceFound, + ) + : ListView.builder( + padding: EdgeInsets.zero, + shrinkWrap: true, + itemCount: _searchableList.length, + itemBuilder: (listContext, itemIndex) { + return DeviceItem( + device: _searchableList[itemIndex], + onPressed: (device) { + Navigator.of(context).pop(device); + }, + ); + }, + ), ), ], ), diff --git a/lib/views/widgets/pentry/pentry_calibration_tool_form.dart b/lib/views/widgets/pentry/pentry_calibration_tool_form.dart index 7ecdaed6..048e113c 100644 --- a/lib/views/widgets/pentry/pentry_calibration_tool_form.dart +++ b/lib/views/widgets/pentry/pentry_calibration_tool_form.dart @@ -71,7 +71,7 @@ class _PentryCalibrationToolFormState extends State { ), AutoCompleteDeviceNumberField( initialValue: model.assetsNumber, - hospitalId: userProvider.user.hospital?.id, + hospitalId: userProvider.user.clientId, onPick: (number) { model.assetsNumber = number; }, From 7044cc8ff023252a7c6d78316664949d49168c84 Mon Sep 17 00:00:00 2001 From: zaid_daoud Date: Tue, 30 May 2023 14:56:31 +0300 Subject: [PATCH 033/181] Enhancements --- .../api/service_requests_provider.dart | 45 +++++++++++-------- lib/models/user.dart | 2 +- .../pages/user/requests/create_request.dart | 29 +++++++----- 3 files changed, 46 insertions(+), 30 deletions(-) diff --git a/lib/controllers/providers/api/service_requests_provider.dart b/lib/controllers/providers/api/service_requests_provider.dart index 6f853e06..bde8b2cf 100644 --- a/lib/controllers/providers/api/service_requests_provider.dart +++ b/lib/controllers/providers/api/service_requests_provider.dart @@ -134,7 +134,7 @@ class ServiceRequestsProvider extends ChangeNotifier { var body = { "id": 0, "calNo": "", - "callCreatedBy": {"id": user.id, "name": user.userName}, + "callCreatedBy": {"id": user.id, "name": user.userName ?? ""}, "assets": serviceRequest.deviceId == null ? [] : [serviceRequest.deviceId], "requestedDate": DateTime.now().toIso8601String(), "requestedTime": DateTime.now().toIso8601String(), @@ -150,7 +150,7 @@ class ServiceRequestsProvider extends ChangeNotifier { "callSiteContactPerson": [ { "id": 0, - "employeeCode": user.email, + // "employeeCode": user.email, "name": user.userName, "telephone": user.phoneNumber, // "job": "", @@ -215,12 +215,15 @@ class ServiceRequestsProvider extends ChangeNotifier { @required ServiceRequest request, DateTime date, }) async { - String callNo = await getServiceRequestCallNoById(requestId: request.id) ?? ""; + Map serviceRequest = await getServiceRequestById(requestId: request.id) ?? ""; + final List callSiteContacts = (serviceRequest['callSiteContactPerson'] as List); + final Map callSiteContactPerson = callSiteContacts.isEmpty ? {} : callSiteContacts[0]; + print(callSiteContactPerson); Response response; var body = { "id": request.id, - "callNo": callNo, - "callCreatedBy": {"id": user.id, "name": user.userName}, + "callNo": serviceRequest['callNo'], + "callCreatedBy": serviceRequest['callCreatedBy'], "requestedDate": date?.toIso8601String() ?? "", "requestedTime": date?.toIso8601String() ?? "", "priority": request.priority?.toMap(), @@ -232,13 +235,13 @@ class ServiceRequestsProvider extends ChangeNotifier { "attachmentsCallRequest": request.devicePhotos?.map((e) => {"name": e})?.toList(), "callSiteContactPerson": [ { - "id": 0, - "employeeCode": user.email, - "name": user.userName, - "telephone": user.phoneNumber, - // "job": "", - "email": user.email, - // "land": "", + "id": callSiteContactPerson['id'] ?? 0, + "employeeCode": callSiteContactPerson['employeeCode'], + "name": callSiteContactPerson['name'] ?? user.userName, + "telephone": callSiteContactPerson['telephone'] ?? user.phoneNumber, + "job": callSiteContactPerson['job'], + "email": callSiteContactPerson['email'] ?? user.email, + "land": callSiteContactPerson['land'], "contactUserId": user.id, }, ], @@ -249,8 +252,8 @@ class ServiceRequestsProvider extends ChangeNotifier { "firstAction": request.firstAction?.toMap(), "loanAvailablity": request.loanAvailability?.toMap(), "comments": request.comment, - "firstActionDate": null, - "visitDate": null, + "firstActionDate": serviceRequest['firstActionDate'], + "visitDate": date?.toIso8601String() ?? "", "callReview": null, "reviewComment": null, }; @@ -419,7 +422,7 @@ class ServiceRequestsProvider extends ChangeNotifier { } } - Future getServiceRequestCallNoById({@required String requestId}) async { + Future> getServiceRequestById({@required String requestId}) async { Response response; try { response = await ApiManager.instance.get( @@ -427,16 +430,20 @@ class ServiceRequestsProvider extends ChangeNotifier { ); } catch (error) { print(error); - return ""; + return {}; } // 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. - print(json.decode(response.body)["data"]); - return json.decode(response.body)["data"]["callNo"] as String; + return { + "callNo": json.decode(response.body)["data"]["callNo"], + "callCreatedBy": json.decode(response.body)["data"]["callCreatedBy"], + "callSiteContactPerson": json.decode(response.body)["data"]["callSiteContactPerson"], + "firstActionDate": json.decode(response.body)["data"]["firstActionDate"], + }; } else { - return ""; + return {}; } } } diff --git a/lib/models/user.dart b/lib/models/user.dart index 89b031a5..7cfcb713 100644 --- a/lib/models/user.dart +++ b/lib/models/user.dart @@ -79,7 +79,7 @@ class User { switch (userRoles.first.name) { case "Engineer": return UsersTypes.engineer; - case "Nurse": + case "Hospital": return UsersTypes.normal_user; default: return null; diff --git a/lib/views/pages/user/requests/create_request.dart b/lib/views/pages/user/requests/create_request.dart index c6135982..fb676de4 100644 --- a/lib/views/pages/user/requests/create_request.dart +++ b/lib/views/pages/user/requests/create_request.dart @@ -68,6 +68,8 @@ class CreateRequestPageState extends State { _serviceRequest = widget.serviceRequest; _device = _serviceRequest.device; _deviceImages.addAll(_serviceRequest.devicePhotos.map((e) => File(e)).toList()); + } else { + _serviceRequest = ServiceRequest(); } super.initState(); } @@ -197,7 +199,7 @@ class CreateRequestPageState extends State { height: 4, ), ServiceRequestedThroughMenu( - initialValue: const Lookup(name: "App", value: 3), + initialValue: const Lookup(name: "App", value: 375), onSelect: (status) { _serviceRequest.requestedThrough = status; }, @@ -211,7 +213,19 @@ class CreateRequestPageState extends State { ServiceRequestedFirstAction( initialValue: _serviceRequest.firstAction, onSelect: (status) { + _dateTime = null; _serviceRequest.firstAction = status; + _serviceRequestsProvider.notifyListeners(); + }, + ), + if (_serviceRequest.firstAction != null) 12.height, + if (_serviceRequest.firstAction != null) + ADatePicker( + date: _dateTime, + from: DateTime.now(), + onDatePicker: (date) { + _dateTime = date; + setState(() {}); }, ), if (widget.serviceRequest != null) 12.height, @@ -232,15 +246,6 @@ class CreateRequestPageState extends State { images: _deviceImages, ), 12.height, - ADatePicker( - date: _dateTime, - from: DateTime.now(), - onDatePicker: (date) { - _dateTime = date; - setState(() {}); - }, - ), - 12.height, SpeechToTextButton(controller: _maintenanceController), 12.height, ATextFormField( @@ -283,6 +288,10 @@ class CreateRequestPageState extends State { Fluttertoast.showToast(msg: _subtitle.pickDevice); return; } + if (_serviceRequest.firstAction != null && _dateTime == null) { + Fluttertoast.showToast(msg: _subtitle.noDateFound); + return; + } _formKey.currentState.save(); _serviceRequest.deviceId = _device?.id; _isLoading = true; From 31c7c7376fff4844e9adf2b171083728a00de599 Mon Sep 17 00:00:00 2001 From: zaid_daoud Date: Tue, 30 May 2023 15:25:03 +0300 Subject: [PATCH 034/181] Enhancements --- .../equipment/single_device_picker.dart | 52 +++++++++---------- 1 file changed, 24 insertions(+), 28 deletions(-) diff --git a/lib/views/widgets/equipment/single_device_picker.dart b/lib/views/widgets/equipment/single_device_picker.dart index 35d7de20..ab36d5f4 100644 --- a/lib/views/widgets/equipment/single_device_picker.dart +++ b/lib/views/widgets/equipment/single_device_picker.dart @@ -123,34 +123,30 @@ class _SingleDevicePickerState extends State { ), ), Expanded( - child: _searchableList.isEmpty ? - NoItemFound(message: _subtitle.noDeviceFound,): - LazyLoading( - nextPage: _devicesProvider.nextPage, - onLazyLoad: () async { - await _devicesProvider.getDevicesList( - user: _userProvider.user, - host: _settingProvider.host, - hospitalId: _userProvider.user.hospital?.id, - serialNumber: snController.text, - number: numberController.text - ); - }, - child:ListView.builder( - padding: EdgeInsets.zero, - shrinkWrap: true, - itemCount: _searchableList.length, - itemBuilder: (listContext,itemIndex){ - return DeviceItem( - device: _searchableList[itemIndex], - onPressed: (device){ - Navigator.of(context).pop(device); - }, - ); - }, - ), - ) - ), + child: _searchableList.isEmpty + ? NoItemFound( + message: _subtitle.noDeviceFound, + ) + : LazyLoading( + nextPage: _devicesProvider.nextPage, + onLazyLoad: () async { + await _devicesProvider.getDevicesList( + user: _userProvider.user, host: _settingProvider.host, hospitalId: _userProvider.user.clientId, serialNumber: snController.text, number: numberController.text); + }, + child: ListView.builder( + padding: EdgeInsets.zero, + shrinkWrap: true, + itemCount: _searchableList.length, + itemBuilder: (listContext, itemIndex) { + return DeviceItem( + device: _searchableList[itemIndex], + onPressed: (device) { + Navigator.of(context).pop(device); + }, + ); + }, + ), + )), ], ), ), From d869f8202054f23f976396c17d41510c2fdec70d Mon Sep 17 00:00:00 2001 From: nextwo <1234> Date: Tue, 30 May 2023 15:47:40 +0300 Subject: [PATCH 035/181] implement searchWorkOrders api and edit on ui --- assets/subtitles/ar_subtitle.json | 9 +- assets/subtitles/en_subtitle.json | 8 + lib/controllers/api_routes/urls.dart | 1 + .../api/service_requests_provider.dart | 33 + .../service_request/search_work_order.dart | 584 ++++++++++++++++++ lib/models/subtitle.dart | 21 + .../pages/user/requests/request_details.dart | 216 +++++-- 7 files changed, 815 insertions(+), 57 deletions(-) create mode 100644 lib/models/service_request/search_work_order.dart diff --git a/assets/subtitles/ar_subtitle.json b/assets/subtitles/ar_subtitle.json index ada5f900..7a2aa1ca 100644 --- a/assets/subtitles/ar_subtitle.json +++ b/assets/subtitles/ar_subtitle.json @@ -188,5 +188,12 @@ "alert": "تنبيه", "duplicateAlert": "تنبيه التكرار", "duplicateAlertMessage": "هل أنت متأكد أنك تريد تكرار الطلب؟", - "duplicateRequest": "تكرار الطلب" + "duplicateRequest": "تكرار الطلب", + "orderWorkNumber": "رقم طلب العمل", + "assignedEmployee": "الموظف المعين", + "assetSN": "رقم تسلسلي للاصل ", + "assetName": "اسم الاصل", + "site": "الموقع", + "maintenanceSituation": "موقع الصيانه", + "currentSituation": "الموقع الحالي" } \ No newline at end of file diff --git a/assets/subtitles/en_subtitle.json b/assets/subtitles/en_subtitle.json index 2ce29fb9..df591025 100644 --- a/assets/subtitles/en_subtitle.json +++ b/assets/subtitles/en_subtitle.json @@ -184,9 +184,17 @@ "requiredWord": "required", "serviceType": "Service Type", "workPreformed": "Work Preformed", + "orderWorkNumber": "Order Work Number", + "assignedEmployee": "Assigned Employee", + "assetSN": "Asset S.N", + "assetName": "Asset Name", + "site": "Site", + "maintenanceSituation": "Maintenance Situation", + "currentSituation": "Current Situation", "alert": "Alert", "duplicateAlert": "Duplicate Alert", "duplicateAlertMessage": "Are you sure you want to duplicate request?", "duplicateRequest": "Duplicate Request" + } \ No newline at end of file diff --git a/lib/controllers/api_routes/urls.dart b/lib/controllers/api_routes/urls.dart index 65c8935d..5edeb3ae 100644 --- a/lib/controllers/api_routes/urls.dart +++ b/lib/controllers/api_routes/urls.dart @@ -45,6 +45,7 @@ class URLs { static get updateServiceReport => "$_baseUrl/WorkOrder/UpdateWorkOrder"; // get static get getServiceReport => "$_baseUrl/WorkOrder/GetWorkOrderById"; // get static get createDuplicatedReport => "$_baseUrl/handle/duplicate/request"; // get + static get searchWorkOrders => "$_baseUrl/WorkOrder/SearchWorkOrders"; static get getServiceReportReasons => "$_baseUrl/Lookups/GetLookup?lookupEnum=522"; // get static get getServiceReportTypes => "$_baseUrl/Lookups/GetLookup?lookupEnum=501"; // get diff --git a/lib/controllers/providers/api/service_requests_provider.dart b/lib/controllers/providers/api/service_requests_provider.dart index 59062251..167087b9 100644 --- a/lib/controllers/providers/api/service_requests_provider.dart +++ b/lib/controllers/providers/api/service_requests_provider.dart @@ -14,6 +14,8 @@ import 'package:test_sa/models/subtitle.dart'; import 'package:test_sa/models/timer_model.dart'; import 'package:test_sa/models/user.dart'; +import '../../../models/service_request/search_work_order.dart'; + class ServiceRequestsProvider extends ChangeNotifier { // number of items call in each request final pageItemNumber = 10; @@ -35,6 +37,7 @@ class ServiceRequestsProvider extends ChangeNotifier { // list of user requests List serviceRequests; + List workOrders =[]; // when requests in-process _loading = true // done _loading = true @@ -245,6 +248,36 @@ class ServiceRequestsProvider extends ChangeNotifier { } } + Future> searchWorkOrders({@required String callId}) async { + + Response response; + + try{ + var body = { + "pageSize": pageItemNumber, + "pageNumber":( (workOrders?.length ?? 0) ~/ pageItemNumber) + 1, + "callId": callId, + }; + response = await ApiManager.instance.post(URLs.searchWorkOrders, body: body); + stateCode = response.statusCode; + if (response.statusCode >= 200 && response.statusCode < 300) { + // client's request was successfully received + List workOrdersJson = json.decode(response.body)["data"]; + print(workOrdersJson); + workOrders = workOrdersJson.map((request) => SearchWorkOrders.fromJson(request)).toList(); + if (workOrders.length == pageItemNumber) { + nextPage = true; + } else { + nextPage = false; + } + } + return workOrders; + + }catch(e){ + return []; + } + } + Future createDuplicatedReport({ @required String host, @required User user, diff --git a/lib/models/service_request/search_work_order.dart b/lib/models/service_request/search_work_order.dart new file mode 100644 index 00000000..ac58714f --- /dev/null +++ b/lib/models/service_request/search_work_order.dart @@ -0,0 +1,584 @@ +import 'package:test_sa/models/lookup.dart'; + +class SearchWorkOrders { + int id; + String parentWOId; + String workOrderNo; + int workOrderYear; + int workOrderSequennce; + CallRequest callRequest; + String assetType; + AssignedEmployee assignedEmployee; + String visitDate; + List assistantEmployees; + String supplier; + String vendorTicketNumber; + List contactPersonWorkOrders; + Lookup calllastSituation; + Lookup currentSituation; + String repairLocation; + String reason; + String startofWorkTime; + String endofWorkTime; + double workingHours; + String travelingHours; + String travelingExpenses; + ModelDefRelatedDefects faultDescription; + List sparePartsWorkOrders; + String reviewComment; + String comment; + String attachmentsWorkOrder; + String equipmentStatus; + List suppEngineerWorkOrders; + String engSignature; + String nurseSignature; + String woParentDto; + + SearchWorkOrders( + {this.id, + this.parentWOId, + this.workOrderNo, + this.workOrderYear, + this.workOrderSequennce, + this.callRequest, + this.assetType, + this.assignedEmployee, + this.visitDate, + this.assistantEmployees, + this.supplier, + this.vendorTicketNumber, + this.contactPersonWorkOrders, + this.calllastSituation, + this.currentSituation, + this.repairLocation, + this.reason, + this.startofWorkTime, + this.endofWorkTime, + this.workingHours, + this.travelingHours, + this.travelingExpenses, + this.faultDescription, + this.sparePartsWorkOrders, + this.reviewComment, + this.comment, + this.attachmentsWorkOrder, + this.equipmentStatus, + this.suppEngineerWorkOrders, + this.engSignature, + this.nurseSignature, + this.woParentDto}); + + SearchWorkOrders.fromJson(Map json) { + print(json['callRequest']); + id = json['id']; + parentWOId = json['parentWOId']; + workOrderNo = json['workOrderNo']; + workOrderYear = json['workOrderYear']; + workOrderSequennce = json['workOrderSequennce']; + callRequest = json['callRequest'] != null + ? new CallRequest.fromJson(json['callRequest']) + : CallRequest(); + assetType = json['assetType']; + assignedEmployee = json['assignedEmployee'] != null + ? new AssignedEmployee.fromJson(json['assignedEmployee']) + : AssignedEmployee(); + visitDate = json['visitDate']; + if (json['assistantEmployees'] != null) { + assistantEmployees = json['assistantEmployees']; + } + supplier = json['supplier']; + vendorTicketNumber = json['vendorTicketNumber']; + if (json['contactPersonWorkOrders'] != null) { + contactPersonWorkOrders = json['contactPersonWorkOrders']; + } + calllastSituation = json['calllastSituation'] != null + ? new Lookup.fromJson(json['calllastSituation']) + : Lookup(); + currentSituation = json['currentSituation'] != null + ? new Lookup.fromJson(json['currentSituation']) + : Lookup(); + repairLocation = json['repairLocation']; + reason = json['reason']; + startofWorkTime = json['startofWorkTime']; + endofWorkTime = json['endofWorkTime']; + workingHours = json['workingHours']; + travelingHours = json['travelingHours']; + travelingExpenses = json['travelingExpenses']; + faultDescription = json['faultDescription'] != null + ? new ModelDefRelatedDefects.fromJson(json['faultDescription']) + : ModelDefRelatedDefects(); + if (json['sparePartsWorkOrders'] != null) { + sparePartsWorkOrders = json['sparePartsWorkOrders']; + } + reviewComment = json['reviewComment']; + comment = json['comment']; + attachmentsWorkOrder = json['attachmentsWorkOrder']; + equipmentStatus = json['equipmentStatus']; + if (json['suppEngineerWorkOrders'] != null) { + suppEngineerWorkOrders = json['suppEngineerWorkOrders']; + } + engSignature = json['engSignature']; + nurseSignature = json['nurseSignature']; + woParentDto = json['woParentDto']; + } + + Map toJson() { + final Map data = new Map(); + data['id'] = this.id; + data['parentWOId'] = this.parentWOId; + data['workOrderNo'] = this.workOrderNo; + data['workOrderYear'] = this.workOrderYear; + data['workOrderSequennce'] = this.workOrderSequennce; + if (this.callRequest != null) { + data['callRequest'] = this.callRequest.toJson(); + } + data['assetType'] = this.assetType; + if (this.assignedEmployee != null) { + data['assignedEmployee'] = this.assignedEmployee.toJson(); + } + data['visitDate'] = this.visitDate; + if (this.assistantEmployees != null) { + data['assistantEmployees'] = + this.assistantEmployees.map((v) => v.toJson()).toList(); + } + data['supplier'] = this.supplier; + data['vendorTicketNumber'] = this.vendorTicketNumber; + if (this.contactPersonWorkOrders != null) { + data['contactPersonWorkOrders'] = + this.contactPersonWorkOrders.map((v) => v.toJson()).toList(); + } + if (this.calllastSituation != null) { + data['calllastSituation'] = this.calllastSituation.toMap(); + } + if (this.currentSituation != null) { + data['currentSituation'] = this.currentSituation.toMap(); + } + data['repairLocation'] = this.repairLocation; + data['reason'] = this.reason; + data['startofWorkTime'] = this.startofWorkTime; + data['endofWorkTime'] = this.endofWorkTime; + data['workingHours'] = this.workingHours; + data['travelingHours'] = this.travelingHours; + data['travelingExpenses'] = this.travelingExpenses; + if (this.faultDescription != null) { + data['faultDescription'] = this.faultDescription.toJson(); + } + if (this.sparePartsWorkOrders != null) { + data['sparePartsWorkOrders'] = + this.sparePartsWorkOrders.map((v) => v.toJson()).toList(); + } + data['reviewComment'] = this.reviewComment; + data['comment'] = this.comment; + data['attachmentsWorkOrder'] = this.attachmentsWorkOrder; + data['equipmentStatus'] = this.equipmentStatus; + if (this.suppEngineerWorkOrders != null) { + data['suppEngineerWorkOrders'] = + this.suppEngineerWorkOrders.map((v) => v.toJson()).toList(); + } + data['engSignature'] = this.engSignature; + data['nurseSignature'] = this.nurseSignature; + data['woParentDto'] = this.woParentDto; + return data; + } +} + +class CallRequest { + int id; + String callNo; + Asset asset; + AssignedEmployee assignedEmployee; + List callSiteContactPerson; + Lookup status; + Lookup callLastSituation; + String defectType; + String firstAction; + String assetType; + + CallRequest( + {this.id, + this.callNo, + this.asset, + this.assignedEmployee, + this.callSiteContactPerson, + this.status, + this.callLastSituation, + this.defectType, + this.firstAction, + this.assetType}); + + CallRequest.fromJson(Map json) { + id = json['id']; + callNo = json['callNo']; + asset = json['asset'] != null ? new Asset.fromJson(json['asset']) : Asset(); + assignedEmployee = json['assignedEmployee'] != null + ? new AssignedEmployee.fromJson(json['assignedEmployee']) + : AssignedEmployee(); + if (json['callSiteContactPerson'] != null) { + callSiteContactPerson = json['callSiteContactPerson']; + } + status = + json['status'] != null ? new Lookup.fromJson(json['status']) : Lookup(); + callLastSituation = json['callLastSituation'] != null + ? new Lookup.fromJson(json['callLastSituation']) + : Lookup(); + defectType = json['defectType']; + firstAction = json['firstAction']; + assetType = json['assetType']; + } + + Map toJson() { + final Map data = new Map(); + data['id'] = this.id; + data['callNo'] = this.callNo; + if (this.asset != null) { + data['asset'] = this.asset.toJson(); + } + if (this.assignedEmployee != null) { + data['assignedEmployee'] = this.assignedEmployee.toJson(); + } + if (this.callSiteContactPerson != null) { + data['callSiteContactPerson'] = + this.callSiteContactPerson.map((v) => v.toJson()).toList(); + } + if (this.status != null) { + data['status'] = this.status.toMap(); + } + if (this.callLastSituation != null) { + data['callLastSituation'] = this.callLastSituation.toMap(); + } + data['defectType'] = this.defectType; + data['firstAction'] = this.firstAction; + data['assetType'] = this.assetType; + return data; + } +} + +class Asset { + int id; + String assetSerialNo; + String systemID; + String assetNumber; + ModelDefinition modelDefinition; + String supplier; + String ipAddress; + String macAddress; + String portNumber; + String assetReplace; + String oldAsset; + String isParent; + String parentAsset; + String assetType; + Site site; + String building; + String floor; + String department; + String room; + String testsDay; + String purchasingPrice; + String nbv; + String currency; + String poNo; + String invoiceNumber; + String invoiceDate; + String replacementDate; + String originDepartment; + Site originSite; + String budgetYear; + String lastPOPrice; + String commissioningStatus; + String productionDate; + String edd; + String technicalInspectionDate; + String deliveryInspectionDate; + String endUserAcceptanceDate; + String receivingCommittee; + String siteWarrantyMonths; + String extendedWarrantyMonths; + String remainderWarrantyMonths; + String eomWarrantyMonthsNo; + String warrantyValue; + String warrantyEndDate; + String warrantyContractConditions; + List technicalGuidanceBooks; + String comment; + String tagCode; + + Asset( + {this.id, + this.assetSerialNo, + this.systemID, + this.assetNumber, + this.modelDefinition, + this.supplier, + this.ipAddress, + this.macAddress, + this.portNumber, + this.assetReplace, + this.oldAsset, + this.isParent, + this.parentAsset, + this.assetType, + this.site, + this.building, + this.floor, + this.department, + this.room, + this.testsDay, + this.purchasingPrice, + this.nbv, + this.currency, + this.poNo, + this.invoiceNumber, + this.invoiceDate, + this.replacementDate, + this.originDepartment, + this.originSite, + this.budgetYear, + this.lastPOPrice, + this.commissioningStatus, + this.productionDate, + this.edd, + this.technicalInspectionDate, + this.deliveryInspectionDate, + this.endUserAcceptanceDate, + this.receivingCommittee, + this.siteWarrantyMonths, + this.extendedWarrantyMonths, + this.remainderWarrantyMonths, + this.eomWarrantyMonthsNo, + this.warrantyValue, + this.warrantyEndDate, + this.warrantyContractConditions, + this.technicalGuidanceBooks, + this.comment, + this.tagCode}); + + Asset.fromJson(Map json) { + id = json['id']; + assetSerialNo = json['assetSerialNo']; + systemID = json['systemID']; + assetNumber = json['assetNumber']; + modelDefinition = json['modelDefinition'] != null + ? new ModelDefinition.fromJson(json['modelDefinition']) + : ModelDefinition(); + supplier = json['supplier']; + ipAddress = json['ipAddress']; + macAddress = json['macAddress']; + portNumber = json['portNumber']; + assetReplace = json['assetReplace']; + oldAsset = json['oldAsset']; + isParent = json['isParent']; + parentAsset = json['parentAsset']; + assetType = json['assetType']; + site = json['site'] != null ? new Site.fromJson(json['site']) : Site(); + building = json['building']; + floor = json['floor']; + department = json['department']; + } + + Map toJson() { + final Map data = new Map(); + data['id'] = this.id; + data['assetSerialNo'] = this.assetSerialNo; + data['systemID'] = this.systemID; + data['assetNumber'] = this.assetNumber; + if (this.modelDefinition != null) { + data['modelDefinition'] = this.modelDefinition.toJson(); + } + data['supplier'] = this.supplier; + data['ipAddress'] = this.ipAddress; + data['macAddress'] = this.macAddress; + data['portNumber'] = this.portNumber; + data['assetReplace'] = this.assetReplace; + data['oldAsset'] = this.oldAsset; + data['isParent'] = this.isParent; + data['parentAsset'] = this.parentAsset; + data['assetType'] = this.assetType; + if (this.site != null) { + data['site'] = this.site.toJson(); + } + data['building'] = this.building; + data['floor'] = this.floor; + data['department'] = this.department; + data['room'] = this.room; + data['testsDay'] = this.testsDay; + data['purchasingPrice'] = this.purchasingPrice; + data['nbv'] = this.nbv; + data['currency'] = this.currency; + data['poNo'] = this.poNo; + data['invoiceNumber'] = this.invoiceNumber; + data['invoiceDate'] = this.invoiceDate; + data['replacementDate'] = this.replacementDate; + data['originDepartment'] = this.originDepartment; + if (this.originSite != null) { + data['originSite'] = this.originSite.toJson(); + } + data['budgetYear'] = this.budgetYear; + data['lastPOPrice'] = this.lastPOPrice; + data['commissioningStatus'] = this.commissioningStatus; + data['productionDate'] = this.productionDate; + data['edd'] = this.edd; + data['technicalInspectionDate'] = this.technicalInspectionDate; + data['deliveryInspectionDate'] = this.deliveryInspectionDate; + data['endUserAcceptanceDate'] = this.endUserAcceptanceDate; + data['receivingCommittee'] = this.receivingCommittee; + data['siteWarrantyMonths'] = this.siteWarrantyMonths; + data['extendedWarrantyMonths'] = this.extendedWarrantyMonths; + data['remainderWarrantyMonths'] = this.remainderWarrantyMonths; + data['eomWarrantyMonthsNo'] = this.eomWarrantyMonthsNo; + data['warrantyValue'] = this.warrantyValue; + data['warrantyEndDate'] = this.warrantyEndDate; + data['warrantyContractConditions'] = this.warrantyContractConditions; + if (this.technicalGuidanceBooks != null) { + data['technicalGuidanceBooks'] = + this.technicalGuidanceBooks.map((v) => v.toJson()).toList(); + } + data['comment'] = this.comment; + data['tagCode'] = this.tagCode; + return data; + } +} + +class ModelDefinition { + int id; + String assetName; + String modelDefCode; + String modelName; + int manufacturerId; + String manufacturerName; + String supplierName; + String replacementDate; + int lifeSpan; + List modelDefRelatedDefects; + List suppliers; + + ModelDefinition( + {this.id, + this.assetName, + this.modelDefCode, + this.modelName, + this.manufacturerId, + this.manufacturerName, + this.supplierName, + this.replacementDate, + this.lifeSpan, + this.modelDefRelatedDefects, + this.suppliers}); + + ModelDefinition.fromJson(Map json) { + id = json['id']; + assetName = json['assetName']; + modelDefCode = json['modelDefCode']; + modelName = json['modelName']; + manufacturerId = json['manufacturerId']; + manufacturerName = json['manufacturerName']; + supplierName = json['supplierName']; + replacementDate = json['replacementDate']; + lifeSpan = json['lifeSpan']; + if (json['modelDefRelatedDefects'] != null) { + modelDefRelatedDefects = []; + json['modelDefRelatedDefects'].forEach((v) { + modelDefRelatedDefects.add(new ModelDefRelatedDefects.fromJson(v)); + }); + } + if (json['suppliers'] != null) { + suppliers = json['suppliers']; + } + } + + Map toJson() { + final Map data = new Map(); + data['id'] = this.id; + data['assetName'] = this.assetName; + data['modelDefCode'] = this.modelDefCode; + data['modelName'] = this.modelName; + data['manufacturerId'] = this.manufacturerId; + data['manufacturerName'] = this.manufacturerName; + data['supplierName'] = this.supplierName; + data['replacementDate'] = this.replacementDate; + data['lifeSpan'] = this.lifeSpan; + if (this.modelDefRelatedDefects != null) { + data['modelDefRelatedDefects'] = + this.modelDefRelatedDefects.map((v) => v.toJson()).toList(); + } + if (this.suppliers != null) { + data['suppliers'] = this.suppliers.map((v) => v.toJson()).toList(); + } + return data; + } +} + +class ModelDefRelatedDefects { + String id; + String defectName; + String workPerformed; + String estimatedTime; + + ModelDefRelatedDefects( + {this.id, this.defectName, this.workPerformed, this.estimatedTime}); + + ModelDefRelatedDefects.fromJson(Map json) { + id = json['id']; + defectName = json['defectName']; + workPerformed = json['workPerformed']; + estimatedTime = json['estimatedTime']; + } + + Map toJson() { + final Map data = new Map(); + data['id'] = this.id; + data['defectName'] = this.defectName; + data['workPerformed'] = this.workPerformed; + data['estimatedTime'] = this.estimatedTime; + return data; + } +} + +class Site { + int id; + int customerCode; + String custName; + List buildings; + + Site({this.id, this.customerCode, this.custName, this.buildings}); + + Site.fromJson(Map json) { + id = json['id']; + customerCode = json['customerCode']; + custName = json['custName']; + if (json['buildings'] != null) { + buildings = json['buildings']; + } + } + + Map toJson() { + final Map data = new Map(); + data['id'] = this.id; + data['customerCode'] = this.customerCode; + data['custName'] = this.custName; + if (this.buildings != null) { + data['buildings'] = this.buildings.map((v) => v.toJson()).toList(); + } + return data; + } +} + +class AssignedEmployee { + String id; + String name; + + AssignedEmployee({this.id, this.name}); + + AssignedEmployee.fromJson(Map json) { + id = json['id']; + name = json['name']; + } + + Map toJson() { + final Map data = new Map(); + data['id'] = this.id; + data['name'] = this.name; + return data; + } +} + diff --git a/lib/models/subtitle.dart b/lib/models/subtitle.dart index a2f212c2..49722511 100644 --- a/lib/models/subtitle.dart +++ b/lib/models/subtitle.dart @@ -209,6 +209,13 @@ class Subtitle{ String partNumber; String number; String quantity; + String orderWorkNumber; + String assignedEmployee; + String assetSN; + String assetName; + String site; + String maintenanceSituation; + String currentSituation; // all String duplicateRequest; @@ -407,6 +414,13 @@ class Subtitle{ @required this.duplicateAlert, @required this.duplicateAlertMessage, @required this.duplicateRequest, + @required this.orderWorkNumber, + @required this.assignedEmployee, + @required this.assetSN, + @required this.assetName, + @required this.site, + @required this.maintenanceSituation, + @required this.currentSituation, }); factory Subtitle.fromJson(Map parsedJson){ @@ -597,6 +611,13 @@ class Subtitle{ duplicateAlert: parsedJson["duplicateAlert"], duplicateAlertMessage: parsedJson["duplicateAlertMessage"], duplicateRequest: parsedJson["duplicateRequest"], + orderWorkNumber:parsedJson["orderWorkNumber"], + assignedEmployee:parsedJson["assignedEmployee"], + assetSN:parsedJson["assetSN"], + assetName:parsedJson["assetName"], + site:parsedJson["site"], + maintenanceSituation:parsedJson["maintenanceSituation"], + currentSituation:parsedJson["currentSituation"], ); } diff --git a/lib/views/pages/user/requests/request_details.dart b/lib/views/pages/user/requests/request_details.dart index d45692d8..f33ab0c9 100644 --- a/lib/views/pages/user/requests/request_details.dart +++ b/lib/views/pages/user/requests/request_details.dart @@ -23,6 +23,7 @@ import 'package:test_sa/views/widgets/requests/service_request_update_dialog.dar import 'package:test_sa/views/widgets/sound/sound_player.dart'; import 'package:test_sa/views/widgets/titles/app_sub_title.dart'; +import '../../../../models/service_request/search_work_order.dart'; import 'report/future_service_report.dart'; class RequestDetailsPage extends StatelessWidget { static final String id = "/call-details"; @@ -34,6 +35,7 @@ class RequestDetailsPage extends StatelessWidget { Subtitle _subtitle = AppLocalization.of(context).subtitle; UserProvider _userProvider = Provider.of(context); SettingProvider _settingProvider = Provider.of(context); + List workOrders=[]; ServiceRequestsProvider _serviceRequestsProvider = Provider.of(context); return DefaultTabController( length: 2, @@ -286,65 +288,102 @@ class RequestDetailsPage extends StatelessWidget { // ) ], ), - serviceRequest.viewReport ? - ListView( - padding: EdgeInsets.symmetric(horizontal: 16), - children: [ - RequestInfoRow( - title: _subtitle.faultDescription, - content: serviceRequest.faultDescription, - ), - RequestInfoRow( - title: _subtitle.workPerformed, - content: serviceRequest.workPerformed, - ), - RequestInfoRow( - title: _subtitle.visitDate, - info: serviceRequest.visitDate, - ), - RequestInfoRow( - title: _subtitle.jobSheetNumber, - info: serviceRequest.jobSheetNumber, - ), - _userProvider.user.type == UsersTypes.engineer - && serviceRequest.reportID != null? - Padding( - padding: EdgeInsets.all(32), - child: AButton( - text: _subtitle.editServiceReport, - onPressed: (){ - Navigator.of(context).push( - MaterialPageRoute( - builder: (_) => FutureServiceReport( - request: serviceRequest, - ) - ), + // workOrders.isEmpty ? + FutureBuilder( + future: _serviceRequestsProvider.searchWorkOrders(callId:serviceRequest.requestCode), + builder: (context, snap){ + print("${workOrders?.length}"); + workOrders= snap.data as List; + print("${workOrders?.length}"); + if(snap.connectionState==ConnectionState.done && snap.data.length != 0) + return ListView.builder( + padding: EdgeInsets.symmetric(horizontal: 16), + itemCount: workOrders.length, + itemBuilder: (context , index){ + return Column( + children: [ + RequestInfoRow( + title: _subtitle.callId, + content:workOrders[index].id.toString(), + ), + RequestInfoRow( + title: _subtitle.orderWorkNumber, + info: "123", + ), + RequestInfoRow( + title: _subtitle.visitDate, + info: workOrders[index].visitDate, + ), + RequestInfoRow( + title: _subtitle.assignedEmployee, + info: workOrders[index].callRequest.assignedEmployee.name, + ), + RequestInfoRow( + title: _subtitle.assetSN, + info:workOrders[index].callRequest.asset.assetSerialNo, + ), + RequestInfoRow( + title: _subtitle.assetName, + info:"123", + ), + RequestInfoRow( + title: _subtitle.model, + info:"123", + ), + RequestInfoRow( + title: _subtitle.site, + info:workOrders[index].callRequest.asset.site.custName, + ), + RequestInfoRow( + title: _subtitle.maintenanceSituation, + info:"123", + ), + RequestInfoRow( + title: _subtitle.currentSituation, + info:workOrders[index].currentSituation.name??'', + ), + _userProvider.user.type == UsersTypes.engineer + && serviceRequest.reportID != null? + Padding( + padding: EdgeInsets.all(32), + child: AButton( + text: _subtitle.editServiceReport, + onPressed: (){ + Navigator.of(context).push( + MaterialPageRoute( + builder: (_) => FutureServiceReport( + request: serviceRequest, + ) + ), + ); + }, + ), + ): SizedBox.shrink(), + ], ); }, - ), - ): SizedBox.shrink(), - ], - ): - _userProvider.user.type == UsersTypes.engineer ? - Center( - child: Padding( - padding: EdgeInsets.all(32), - child: AButton( - text: "Create Report", - onPressed: (){ - Navigator.of(context).push( - MaterialPageRoute( - builder: (_) => CreateServiceReport( - request: serviceRequest, - ) + ); + else + return _userProvider.user.type == UsersTypes.engineer ? + Center( + child: Padding( + padding: EdgeInsets.all(32), + child: AButton( + text: "Create Report", + onPressed: (){ + Navigator.of(context).push( + MaterialPageRoute( + builder: (_) => CreateServiceReport( + request: serviceRequest, + ) + ), + ); + }, ), - ); - }, - ), - ), - ): Center(child: ASubTitle(_subtitle.noDateFound),), - - + ), + ): Center(child: ASubTitle(_subtitle.noDateFound),); + }, + ) ], ), ), @@ -354,4 +393,69 @@ class RequestDetailsPage extends StatelessWidget { ), ); } + + Widget dataList({@required Subtitle subtitle, @required List workOrders, @required UserProvider userProvider, @required BuildContext context}){ + return ListView( + padding: EdgeInsets.symmetric(horizontal: 16), + children: [ + RequestInfoRow( + title: subtitle.callId, + content:"123", + ), + RequestInfoRow( + title: subtitle.orderWorkNumber, + info: "123", + ), + RequestInfoRow( + title: subtitle.visitDate, + info: workOrders[0].visitDate??"", + ), + RequestInfoRow( + title: subtitle.assignedEmployee, + info: "123", + ), + RequestInfoRow( + title: subtitle.assetSN, + info:"123", + ), + RequestInfoRow( + title: subtitle.assetName, + info:"123", + ), + RequestInfoRow( + title: subtitle.model, + info:"123", + ), + RequestInfoRow( + title: subtitle.site, + info:"123", + ), + RequestInfoRow( + title: subtitle.maintenanceSituation, + info:"123", + ), + RequestInfoRow( + title: subtitle.currentSituation, + info:"123", + ), + userProvider.user.type == UsersTypes.engineer + && serviceRequest.reportID != null? + Padding( + padding: EdgeInsets.all(32), + child: AButton( + text: subtitle.editServiceReport, + onPressed: (){ + Navigator.of(context).push( + MaterialPageRoute( + builder: (_) => FutureServiceReport( + request: serviceRequest, + ) + ), + ); + }, + ), + ): SizedBox.shrink(), + ], + ); + } } From f39b6f5d8e2128a86075537d712b682d499a7f91 Mon Sep 17 00:00:00 2001 From: Sikander Saleem Date: Wed, 31 May 2023 10:55:07 +0300 Subject: [PATCH 036/181] work order improvement. --- .../service_request/search_work_order.dart | 6 +- .../report/future_service_report.dart | 6 +- .../pages/user/requests/request_details.dart | 500 ++++++++---------- 3 files changed, 236 insertions(+), 276 deletions(-) diff --git a/lib/models/service_request/search_work_order.dart b/lib/models/service_request/search_work_order.dart index ac58714f..91fc0c9d 100644 --- a/lib/models/service_request/search_work_order.dart +++ b/lib/models/service_request/search_work_order.dart @@ -21,8 +21,8 @@ class SearchWorkOrders { String startofWorkTime; String endofWorkTime; double workingHours; - String travelingHours; - String travelingExpenses; + num travelingHours; + num travelingExpenses; ModelDefRelatedDefects faultDescription; List sparePartsWorkOrders; String reviewComment; @@ -509,7 +509,7 @@ class ModelDefinition { } class ModelDefRelatedDefects { - String id; + int id; String defectName; String workPerformed; String estimatedTime; diff --git a/lib/views/pages/user/requests/report/future_service_report.dart b/lib/views/pages/user/requests/report/future_service_report.dart index 5ee16ea2..15c792ea 100644 --- a/lib/views/pages/user/requests/report/future_service_report.dart +++ b/lib/views/pages/user/requests/report/future_service_report.dart @@ -5,6 +5,7 @@ import 'package:test_sa/controllers/providers/api/service_requests_provider.dart import 'package:test_sa/controllers/providers/api/user_provider.dart'; import 'package:test_sa/controllers/providers/settings/setting_provider.dart'; import 'package:test_sa/models/service_report.dart'; +import 'package:test_sa/models/service_request/search_work_order.dart'; import 'package:test_sa/models/service_request/service_request.dart'; import 'package:test_sa/models/subtitle.dart'; import 'package:test_sa/views/widgets/loaders/app_loading.dart'; @@ -13,8 +14,9 @@ import 'package:test_sa/views/widgets/loaders/failed_loading.dart'; import 'edit_service_report.dart'; class FutureServiceReport extends StatefulWidget { final ServiceRequest request; + final SearchWorkOrders workOrder; - const FutureServiceReport({Key key, this.request}) : super(key: key); + const FutureServiceReport({Key key, this.request,this.workOrder}) : super(key: key); @override _FutureServiceReportState createState() => _FutureServiceReportState(); @@ -32,7 +34,7 @@ class _FutureServiceReportState extends State { return Scaffold( body: FutureBuilder( future: ServiceRequestsProvider().getSingleServiceReport( - reportId: widget.request.reportID, + reportId: widget.workOrder.id, user: _userProvider.user, host: _settingProvider.host, subtitle: _subtitle diff --git a/lib/views/pages/user/requests/request_details.dart b/lib/views/pages/user/requests/request_details.dart index f33ab0c9..1deaaca4 100644 --- a/lib/views/pages/user/requests/request_details.dart +++ b/lib/views/pages/user/requests/request_details.dart @@ -6,6 +6,7 @@ import 'package:test_sa/controllers/localization/localization.dart'; import 'package:test_sa/controllers/providers/api/service_requests_provider.dart'; import 'package:test_sa/controllers/providers/api/user_provider.dart'; import 'package:test_sa/controllers/providers/settings/setting_provider.dart'; +import 'package:test_sa/extensions/int_extensions.dart'; import 'package:test_sa/models/enums/user_types.dart'; import 'package:test_sa/models/service_request/service_request.dart'; import 'package:test_sa/models/subtitle.dart'; @@ -25,17 +26,19 @@ import 'package:test_sa/views/widgets/titles/app_sub_title.dart'; import '../../../../models/service_request/search_work_order.dart'; import 'report/future_service_report.dart'; + class RequestDetailsPage extends StatelessWidget { static final String id = "/call-details"; final ServiceRequest serviceRequest; const RequestDetailsPage({Key key, this.serviceRequest}) : super(key: key); + @override Widget build(BuildContext context) { Subtitle _subtitle = AppLocalization.of(context).subtitle; UserProvider _userProvider = Provider.of(context); SettingProvider _settingProvider = Provider.of(context); - List workOrders=[]; + List workOrders = []; ServiceRequestsProvider _serviceRequestsProvider = Provider.of(context); return DefaultTabController( length: 2, @@ -44,8 +47,8 @@ class RequestDetailsPage extends StatelessWidget { child: Column( children: [ Container( - color:AColors.primaryColor, - padding: const EdgeInsets.symmetric(horizontal: 0,vertical: 4), + color: AColors.primaryColor, + padding: const EdgeInsets.symmetric(horizontal: 0, vertical: 4), child: Row( children: [ ABackButton(), @@ -53,124 +56,129 @@ class RequestDetailsPage extends StatelessWidget { child: Center( child: Text( _subtitle.details, - style: Theme.of(context).textTheme.headline6.copyWith( - color: AColors.white, - fontStyle: FontStyle.italic - ), + style: Theme.of(context).textTheme.headline6.copyWith(color: AColors.white, fontStyle: FontStyle.italic), ), ), ), - _userProvider.user.type == UsersTypes.normal_user ? - // AIconButton( - // iconData: Icons.warning_amber_rounded, - // color: AColors.white, - // buttonSize: 42, - // backgroundColor: AColors.deepOrange, - // onPressed: (){ - // Navigator.of(context).push( - // MaterialPageRoute( - // builder: (_) => ReportIssuesPage(serviceRequest: serviceRequest,) - // ) - // ); - // }, - // ) - const SizedBox(width: 48,) - : AIconButton( - iconData: Icons.edit, - color: AColors.white, - buttonSize: 42, - backgroundColor: AColors.green, - onPressed: () async { - showModalBottomSheet( - context: context, - builder: (context){ - return ServiceRequestsUpdateDialog(request: serviceRequest,); - }); - // DateTime picked = await showDatePicker( - // context: context, - // initialDate: DateTime.now(), - // firstDate: DateTime.now(), - // lastDate: DateTime.now().add(Duration(days: 182)) - // ); - // if(picked == null){return;} - // showDialog( - // context: context, - // barrierDismissible: false, - // builder: (BuildContext context) { - // return CupertinoAlertDialog( - // title: Text(_subtitle.updatingDots), - // content: Center(child: CircularProgressIndicator()), + _userProvider.user.type == UsersTypes.normal_user + ? + // AIconButton( + // iconData: Icons.warning_amber_rounded, + // color: AColors.white, + // buttonSize: 42, + // backgroundColor: AColors.deepOrange, + // onPressed: (){ + // Navigator.of(context).push( + // MaterialPageRoute( + // builder: (_) => ReportIssuesPage(serviceRequest: serviceRequest,) + // ) // ); // }, - // ); - // int status = await _serviceRequestsProvider.updateDate( - // user: _userProvider.user, - // host: _settingProvider.host, - // request: serviceRequest, - // newDate: picked.toString().split(" ").first - // ); - // Navigator.of(context).pop(); - // Fluttertoast.showToast( - // msg: HttpStatusManger.getStatusMessage(status: status, subtitle: _subtitle), - // ); - }, - ), - SizedBox(width: 16,) + // ) + const SizedBox( + width: 48, + ) + : AIconButton( + iconData: Icons.edit, + color: AColors.white, + buttonSize: 42, + backgroundColor: AColors.green, + onPressed: () async { + showModalBottomSheet( + context: context, + builder: (context) { + return ServiceRequestsUpdateDialog( + request: serviceRequest, + ); + }); + // DateTime picked = await showDatePicker( + // context: context, + // initialDate: DateTime.now(), + // firstDate: DateTime.now(), + // lastDate: DateTime.now().add(Duration(days: 182)) + // ); + // if(picked == null){return;} + // showDialog( + // context: context, + // barrierDismissible: false, + // builder: (BuildContext context) { + // return CupertinoAlertDialog( + // title: Text(_subtitle.updatingDots), + // content: Center(child: CircularProgressIndicator()), + // ); + // }, + // ); + // int status = await _serviceRequestsProvider.updateDate( + // user: _userProvider.user, + // host: _settingProvider.host, + // request: serviceRequest, + // newDate: picked.toString().split(" ").first + // ); + // Navigator.of(context).pop(); + // Fluttertoast.showToast( + // msg: HttpStatusManger.getStatusMessage(status: status, subtitle: _subtitle), + // ); + }, + ), + SizedBox( + width: 16, + ) ], ), ), - - serviceRequest.devicePhotos.isEmpty ? SizedBox.shrink(): - Column( - children: [ - SizedBox(height: 8,), - MaterialButton( - padding: EdgeInsets.zero, - onPressed: (){ - Navigator.of(context).push( - MaterialPageRoute( - builder: (_) => Scaffold( - body: InteractiveViewer( - child: Center( - child: ImageLoader( - url: serviceRequest.devicePhotos.first, - boxFit: BoxFit.contain, - ), - ), - ), - ) - ) - ); - }, - child: SizedBox( - height: 140 * AppStyle.getScaleFactor(context), - width: MediaQuery.of(context).size.width, - child: ImageLoader( - url: serviceRequest.devicePhotos.first, - boxFit: BoxFit.cover, - ), - ), - ), - SizedBox(height: 8,), - SizedBox( - height: 60* AppStyle.getScaleFactor(context), - child: ImagesList( - images: serviceRequest.devicePhotos, + serviceRequest.devicePhotos.isEmpty + ? SizedBox.shrink() + : Column( + children: [ + SizedBox( + height: 8, + ), + MaterialButton( + padding: EdgeInsets.zero, + onPressed: () { + Navigator.of(context).push(MaterialPageRoute( + builder: (_) => Scaffold( + body: InteractiveViewer( + child: Center( + child: ImageLoader( + url: serviceRequest.devicePhotos.first, + boxFit: BoxFit.contain, + ), + ), + ), + ))); + }, + child: SizedBox( + height: 140 * AppStyle.getScaleFactor(context), + width: MediaQuery.of(context).size.width, + child: ImageLoader( + url: serviceRequest.devicePhotos.first, + boxFit: BoxFit.cover, + ), + ), + ), + SizedBox(height: 8), + SizedBox( + height: 60 * AppStyle.getScaleFactor(context), + child: ImagesList( + images: serviceRequest.devicePhotos, + ), + ), + ], ), - ), - ], - ), - - TabBar( - labelColor: AColors.primaryColor, - tabs: [ - Tab(text: _subtitle.general,), - Tab(text: _subtitle.serviceRequestInformation,), + TabBar(labelColor: AColors.primaryColor, tabs: [ + Tab( + text: _subtitle.general, + ), + Tab( + text: _subtitle.serviceRequestInformation, + ), ]), - SizedBox(height: 8,), + SizedBox( + height: 8, + ), Expanded( child: TabBarView( - children: [ ListView( padding: EdgeInsets.symmetric(horizontal: 16), @@ -189,7 +197,7 @@ class RequestDetailsPage extends StatelessWidget { ), RequestInfoRow( title: _subtitle.deviceModel, - info : serviceRequest.deviceModel, + info: serviceRequest.deviceModel, ), RequestInfoRow( title: _subtitle.engineerName, @@ -203,11 +211,12 @@ class RequestDetailsPage extends StatelessWidget { title: _subtitle.date, info: serviceRequest.date, ), - serviceRequest.nextVisitDate == null ? SizedBox.shrink() : - RequestInfoRow( - title: _subtitle.nextVisitDate, - info: DateFormat('EE dd/MM/yyyy').format(serviceRequest.nextVisitDate), - ), + serviceRequest.nextVisitDate == null + ? SizedBox.shrink() + : RequestInfoRow( + title: _subtitle.nextVisitDate, + info: DateFormat('EE dd/MM/yyyy').format(serviceRequest.nextVisitDate), + ), Row( children: [ Expanded( @@ -217,12 +226,12 @@ class RequestDetailsPage extends StatelessWidget { textScaleFactor: AppStyle.getScaleFactor(context), ), ), - StatusLabel(label: serviceRequest.statusLabel, - color: AColors.getRequestStatusColor(serviceRequest.statusValue) - ), + StatusLabel(label: serviceRequest.statusLabel, color: AColors.getRequestStatusColor(serviceRequest.statusValue)), ], ), - Divider(color: Theme.of(context).primaryColor,), + Divider( + color: Theme.of(context).primaryColor, + ), RequestInfoRow( title: _subtitle.hospital, info: serviceRequest.hospitalName, @@ -243,10 +252,10 @@ class RequestDetailsPage extends StatelessWidget { title: _subtitle.maintenanceIssue, content: serviceRequest.maintenanceIssue, ), - if(serviceRequest.audio?.isNotEmpty == true) - ASoundPlayer( - audio: serviceRequest.audio, - ), + if (serviceRequest.audio?.isNotEmpty == true) + ASoundPlayer( + audio: serviceRequest.audio, + ), // // Center( // child: Padding( @@ -290,98 +299,112 @@ class RequestDetailsPage extends StatelessWidget { ), // workOrders.isEmpty ? FutureBuilder( - future: _serviceRequestsProvider.searchWorkOrders(callId:serviceRequest.requestCode), - builder: (context, snap){ - print("${workOrders?.length}"); - workOrders= snap.data as List; - print("${workOrders?.length}"); - if(snap.connectionState==ConnectionState.done && snap.data.length != 0) - return ListView.builder( - padding: EdgeInsets.symmetric(horizontal: 16), + future: _serviceRequestsProvider.searchWorkOrders(callId: serviceRequest.requestCode), + builder: (context, snap) { + workOrders = snap.data as List; + if (snap.connectionState == ConnectionState.done && (snap.data?.length ?? 0) != 0) + return ListView.separated( + padding: EdgeInsets.all(21), itemCount: workOrders.length, - itemBuilder: (context , index){ - return Column( - children: [ - RequestInfoRow( - title: _subtitle.callId, - content:workOrders[index].id.toString(), - ), - RequestInfoRow( - title: _subtitle.orderWorkNumber, - info: "123", - ), - RequestInfoRow( - title: _subtitle.visitDate, - info: workOrders[index].visitDate, - ), - RequestInfoRow( - title: _subtitle.assignedEmployee, - info: workOrders[index].callRequest.assignedEmployee.name, - ), - RequestInfoRow( - title: _subtitle.assetSN, - info:workOrders[index].callRequest.asset.assetSerialNo, - ), - RequestInfoRow( - title: _subtitle.assetName, - info:"123", - ), - RequestInfoRow( - title: _subtitle.model, - info:"123", - ), - RequestInfoRow( - title: _subtitle.site, - info:workOrders[index].callRequest.asset.site.custName, - ), - RequestInfoRow( - title: _subtitle.maintenanceSituation, - info:"123", - ), - RequestInfoRow( - title: _subtitle.currentSituation, - info:workOrders[index].currentSituation.name??'', + separatorBuilder: (czt, index) => 21.height, + itemBuilder: (context, index) { + Color itemColor = index % 2 == 0 ? Theme.of(context).colorScheme.primary : Theme.of(context).colorScheme.onPrimary; + Color onItemColor = index % 2 != 0 ? Theme.of(context).colorScheme.primary : Theme.of(context).colorScheme.onPrimary; + + return ElevatedButton( + style: ElevatedButton.styleFrom( + padding: EdgeInsets.symmetric(vertical: 8, horizontal: 8), + primary: itemColor.withOpacity(.7), + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(AppStyle.getBorderRadius(context)), ), - _userProvider.user.type == UsersTypes.engineer - && serviceRequest.reportID != null? - Padding( + ), + //padding: EdgeInsets.symmetric(vertical: 8,horizontal: 8), + onPressed: () { + // onPressed(request); + }, + child: Column( + children: [ + RequestInfoRow( + title: _subtitle.callId, + content: workOrders[index].id.toString(), + ), + RequestInfoRow( + title: _subtitle.orderWorkNumber, + info: workOrders[index].workOrderNo.toString(), + ), + RequestInfoRow( + title: _subtitle.visitDate, + info: workOrders[index].visitDate, + ), + RequestInfoRow(title: _subtitle.assignedEmployee, info: workOrders[index].assignedEmployee.name), + RequestInfoRow( + title: _subtitle.assetSN, + info: workOrders[index].callRequest.asset.assetSerialNo, + ), + RequestInfoRow( + title: _subtitle.assetName, + info: workOrders[index].callRequest.asset.modelDefinition.assetName, + ), + RequestInfoRow( + title: _subtitle.model, + info: workOrders[index].callRequest.asset.modelDefinition.modelName, + ), + RequestInfoRow( + title: _subtitle.site, + info: workOrders[index].callRequest.asset.site.custName, + ), + RequestInfoRow( + title: _subtitle.maintenanceSituation, + info: workOrders[index].calllastSituation.name ?? '', + ), + RequestInfoRow( + title: _subtitle.currentSituation, + info: workOrders[index].currentSituation.name ?? '', + ), + _userProvider.user.type == UsersTypes.engineer && workOrders[index].workOrderNo != null + ? Padding( + padding: EdgeInsets.all(32), + child: AButton( + text: _subtitle.editServiceReport, + onPressed: () { + Navigator.of(context).push( + MaterialPageRoute( + builder: (_) => FutureServiceReport( + request: serviceRequest, + workOrder: workOrders[index], + )), + ); + }, + ), + ) + : SizedBox.shrink(), + ], + ), + ); + }, + ); + else + return _userProvider.user.type == UsersTypes.engineer + ? Center( + child: Padding( padding: EdgeInsets.all(32), child: AButton( - text: _subtitle.editServiceReport, - onPressed: (){ + text: "Create Report", + onPressed: () { Navigator.of(context).push( MaterialPageRoute( - builder: (_) => FutureServiceReport( - request: serviceRequest, - ) - ), + builder: (_) => CreateServiceReport( + request: serviceRequest, + )), ); }, ), - ): SizedBox.shrink(), - ], - ); - }, - ); - else - return _userProvider.user.type == UsersTypes.engineer ? - Center( - child: Padding( - padding: EdgeInsets.all(32), - child: AButton( - text: "Create Report", - onPressed: (){ - Navigator.of(context).push( - MaterialPageRoute( - builder: (_) => CreateServiceReport( - request: serviceRequest, - ) - ), - ); - }, - ), - ), - ): Center(child: ASubTitle(_subtitle.noDateFound),); + ), + ) + : Center( + child: ASubTitle(_subtitle.noDateFound), + ); }, ) ], @@ -393,69 +416,4 @@ class RequestDetailsPage extends StatelessWidget { ), ); } - - Widget dataList({@required Subtitle subtitle, @required List workOrders, @required UserProvider userProvider, @required BuildContext context}){ - return ListView( - padding: EdgeInsets.symmetric(horizontal: 16), - children: [ - RequestInfoRow( - title: subtitle.callId, - content:"123", - ), - RequestInfoRow( - title: subtitle.orderWorkNumber, - info: "123", - ), - RequestInfoRow( - title: subtitle.visitDate, - info: workOrders[0].visitDate??"", - ), - RequestInfoRow( - title: subtitle.assignedEmployee, - info: "123", - ), - RequestInfoRow( - title: subtitle.assetSN, - info:"123", - ), - RequestInfoRow( - title: subtitle.assetName, - info:"123", - ), - RequestInfoRow( - title: subtitle.model, - info:"123", - ), - RequestInfoRow( - title: subtitle.site, - info:"123", - ), - RequestInfoRow( - title: subtitle.maintenanceSituation, - info:"123", - ), - RequestInfoRow( - title: subtitle.currentSituation, - info:"123", - ), - userProvider.user.type == UsersTypes.engineer - && serviceRequest.reportID != null? - Padding( - padding: EdgeInsets.all(32), - child: AButton( - text: subtitle.editServiceReport, - onPressed: (){ - Navigator.of(context).push( - MaterialPageRoute( - builder: (_) => FutureServiceReport( - request: serviceRequest, - ) - ), - ); - }, - ), - ): SizedBox.shrink(), - ], - ); - } } From 756e2a1881f687e6580e9a0b7fe919df1d2fc4e9 Mon Sep 17 00:00:00 2001 From: nextwo <1234> Date: Wed, 31 May 2023 11:15:36 +0300 Subject: [PATCH 037/181] implement searchWorkOrders api and edit on ui --- lib/controllers/api_routes/api_manager.dart | 82 ++-- .../api_routes/http_status_manger.dart | 21 +- .../localization/localization.dart | 14 +- .../firebase_notification_manger.dart | 30 +- .../notification/notification_manger.dart | 45 +- .../providers/api/departments_provider.dart | 32 +- .../api/device_transfer_provider.dart | 90 ++-- .../providers/api/devices_provider.dart | 15 +- .../providers/api/gas_refill_provider.dart | 129 +++-- .../providers/api/hospitals_provider.dart | 66 ++- .../providers/api/notifications_provider.dart | 66 +-- .../providers/api/parts_provider.dart | 56 +-- .../api/regular_visits_provider.dart | 77 ++- .../api/service_requests_provider.dart | 20 +- .../employee/assigned_to_provider.dart | 22 +- .../employee/engineers_provider.dart | 21 +- .../gas_cylinder_size_provider.dart | 27 +- .../gas_cylinder_type_provider.dart | 27 +- .../gas_refill/gas_status_provider.dart | 24 +- .../gas_refill/gas_types_provider.dart | 24 +- .../pentry/pentry_status_provider.dart | 23 +- .../pentry/pentry_task_status_provider.dart | 23 +- .../pentry/pentry_visit_status_provider.dart | 22 +- .../service_report_defect_types_provider.dart | 23 +- .../service_report_last_calls_provider.dart | 22 +- .../service_report_priority_provider.dart | 22 +- .../service_report_reasons_provider.dart | 22 +- .../service_report_status_provider.dart | 23 +- .../report/service_report_types_provider.dart | 22 +- .../report/service_types_provider.dart | 23 +- .../service_request_status_provider.dart | 23 +- .../service_request_through_provider.dart | 23 +- .../service_request_type_provider.dart | 23 +- .../providers/settings/app_settings.dart | 2 +- .../providers/settings/setting_provider.dart | 28 +- lib/controllers/validator/validator.dart | 27 +- lib/main.dart | 72 ++- lib/models/app_notification.dart | 17 +- lib/models/department.dart | 8 +- lib/models/device/device_transfer.dart | 23 +- lib/models/device/device_transfer_info.dart | 38 +- lib/models/device/model.dart | 23 +- lib/models/engineer.dart | 16 +- lib/models/enums/user_types.dart | 4 +- lib/models/gas_refill/gas_refill_details.dart | 18 +- lib/models/gas_refill/gas_refill_model.dart | 20 +- lib/models/hospital.dart | 30 +- lib/models/issue.dart | 18 +- lib/models/lookup.dart | 27 +- lib/models/pantry/calibration_tools.dart | 12 +- lib/models/pantry/contact.dart | 13 +- lib/models/pantry/lookups/contact_person.dart | 9 +- lib/models/pantry/lookups/contact_title.dart | 9 +- lib/models/pantry/pm_kit.dart | 21 +- lib/models/part.dart | 18 +- .../service_request/search_work_order.dart | 248 +++++----- .../service_request/service_request.dart | 73 ++- .../service_request_search.dart | 24 +- lib/models/subtitle.dart | 32 +- lib/models/timer_model.dart | 4 +- lib/models/visits/visit.dart | 55 ++- lib/models/visits/visits_group.dart | 15 +- lib/models/visits/visits_search.dart | 49 +- lib/views/app_style/colors.dart | 63 +-- lib/views/app_style/sizing.dart | 38 +- .../device_transfer_details.dart | 67 ++- .../request_device_transfer.dart | 2 +- .../track_device_transfer.dart | 18 +- lib/views/pages/splash_screen.dart | 33 +- .../user/gas_refill/gas_refill_details.dart | 168 ++++--- .../user/gas_refill/request_gas_refill.dart | 184 ++++---- .../user/gas_refill/track_gas_refill.dart | 19 +- .../notifications/notifications_list.dart | 25 +- .../notifications/notifications_page.dart | 25 +- lib/views/pages/user/profile_page.dart | 121 +++-- lib/views/pages/user/report_issues_page.dart | 69 ++- .../pages/user/requests/create_request.dart | 48 +- .../future_request_service_details.dart | 19 +- .../report/create_service_report.dart | 426 +++++++++-------- .../requests/report/edit_service_report.dart | 440 ++++++++++-------- .../pages/user/requests/requests_page.dart | 37 +- .../pages/user/visits/pantry/edit_pentry.dart | 212 ++++----- .../visits/pantry/future_edit_pently.dart | 20 +- .../preventive_maintenance_visits_page.dart | 61 ++- .../user/visits/regular_visits_page.dart | 67 ++- .../visits/update_visits_group_sheet.dart | 266 ++++++----- .../pages/user/visits/visit_details.dart | 58 +-- lib/views/widgets/app_name_bar.dart | 8 +- .../widgets/buttons/app_back_button.dart | 2 +- lib/views/widgets/buttons/app_button.dart | 2 +- .../widgets/buttons/app_flat_button.dart | 22 +- .../widgets/buttons/app_icon_button.dart | 21 +- .../widgets/buttons/app_icon_button2.dart | 2 +- .../widgets/buttons/app_outlined_button.dart | 12 +- .../widgets/buttons/app_small_button.dart | 26 +- .../custom_clip_path/carve_in_image.dart | 10 +- .../widgets/date_and_time/date_picker.dart | 14 +- .../date_and_time/from_to_date_bar.dart | 16 +- .../departments/department_button.dart | 1 + .../widgets/departments/department_item.dart | 16 +- .../departments/single_department_picker.dart | 51 +- .../device_transfer_info_section.dart | 18 +- .../device_trancfer/device_transfer_item.dart | 96 ++-- .../device_trancfer/device_transfer_list.dart | 30 +- lib/views/widgets/dialogs/dialog.dart | 9 +- lib/views/widgets/drawer/drawer_item.dart | 4 +- .../auto_complete_devices_field.dart | 102 ++-- .../equipment/auto_complete_models_field.dart | 49 +- lib/views/widgets/equipment/device_item.dart | 40 +- .../equipment/single_device_picker.dart | 101 ++-- .../gas_refill_create_details_item.dart | 25 +- .../widgets/gas_refill/gas_refill_item.dart | 67 ++- .../widgets/gas_refill/gas_refill_list.dart | 30 +- .../gas_refill_update_details_item.dart | 61 +-- .../hospital_auto_complete_field.dart | 30 +- .../widgets/hospitals/hospital_button.dart | 3 +- .../widgets/hospitals/hospital_item.dart | 23 +- .../hospitals/single_hospital_picker.dart | 55 +-- lib/views/widgets/images/image_item.dart | 49 +- lib/views/widgets/images/images_list.dart | 33 +- lib/views/widgets/images/images_viewer.dart | 93 ++-- .../widgets/images/mini_one_image_picker.dart | 78 ++-- .../images/multi_image_picker_item.dart | 53 +-- .../widgets/images/one_image_picker.dart | 106 ++--- .../widgets/issues/report_issue_item.dart | 23 +- .../widgets/loaders/app_lazy_loading.dart | 9 +- lib/views/widgets/loaders/app_loading.dart | 1 + lib/views/widgets/loaders/failed_loading.dart | 14 +- lib/views/widgets/loaders/image_loader.dart | 9 +- lib/views/widgets/loaders/lazy_loading.dart | 20 +- .../widgets/loaders/loading_manager.dart | 15 +- lib/views/widgets/loaders/no_item_found.dart | 3 +- .../notifications/notification_item.dart | 36 +- .../parts/auto_complete_parts_field.dart | 34 +- lib/views/widgets/parts/part_item.dart | 58 +-- .../auto_complete_devices_field.dart | 48 +- .../widgets/pentry/pentry_info_form.dart | 129 +++-- .../widgets/pentry/pentry_pm_kit_form.dart | 257 +++++----- .../pentry/pentry_ppm_check_list_form.dart | 196 ++++---- lib/views/widgets/qr/scan_qr.dart | 18 +- lib/views/widgets/requests/info_row.dart | 66 +-- .../widgets/requests/request_status.dart | 25 +- .../requests/service_request_item.dart | 299 ++++++------ .../requests/service_request_list.dart | 30 +- lib/views/widgets/search/filter_item.dart | 47 +- .../search/service_request_search_bar.dart | 100 ++-- .../widgets/search/visits_search_bar.dart | 106 +++-- lib/views/widgets/sound/record_sound.dart | 4 +- lib/views/widgets/sound/sound_player.dart | 142 +++--- .../speech_to_text/speech_to_text.dart | 1 + .../status/employee/assigned_to_mune.dart | 9 +- .../status/employee/engineers_mune.dart | 9 +- .../status/employee/single_type_menu.dart | 56 +-- .../status/gas_refill/gas_cylinder_size.dart | 9 +- .../status/gas_refill/gas_cylinder_type.dart | 9 +- .../widgets/status/gas_refill/gas_status.dart | 9 +- .../widgets/status/gas_refill/gas_type.dart | 9 +- .../widgets/status/multi_status_menu.dart | 169 ++++--- .../status/pentry/pentry_status_mune.dart | 9 +- .../pentry/pentry_task_status_mune.dart | 9 +- .../pentry/pentry_visit_status_mune.dart | 9 +- .../report/service_report_last_call.dart | 7 +- .../status/report/service_report_reasons.dart | 5 +- .../status/report/service_report_status.dart | 30 +- .../status/report/service_report_type.dart | 9 +- .../widgets/status/report/service_status.dart | 9 +- .../service_request_defect_types_mune.dart | 9 +- .../service_request_status_mune.dart | 9 +- .../service_request_through_mune.dart | 9 +- .../service_request_types_mune.dart | 9 +- .../widgets/status/single_status_menu.dart | 2 +- lib/views/widgets/timer/app_timer.dart | 79 ++-- lib/views/widgets/timer/timer_manager.dart | 1 + lib/views/widgets/titles/app_sub_title.dart | 10 +- lib/views/widgets/titles/app_title.dart | 9 +- .../widgets/titles/expandable_info_row.dart | 65 ++- lib/views/widgets/visits/visit_status.dart | 43 +- lib/views/widgets/visits/visits_list.dart | 56 ++- 178 files changed, 3922 insertions(+), 4414 deletions(-) diff --git a/lib/controllers/api_routes/api_manager.dart b/lib/controllers/api_routes/api_manager.dart index 1a0a125c..f40b309c 100644 --- a/lib/controllers/api_routes/api_manager.dart +++ b/lib/controllers/api_routes/api_manager.dart @@ -8,35 +8,33 @@ import 'package:http/http.dart'; import 'package:test_sa/models/user.dart'; class ApiManager { - ApiManager._(); - Map get _headers => { - 'Content-Type': 'application/json', - if(user != null) 'Authorization': 'Bearer ${user.token}', - }; + Map get _headers => { + 'Content-Type': 'application/json', + if (user != null) 'Authorization': 'Bearer ${user.token}', + }; static ApiManager instance = ApiManager._(); User user; Future get( - String url, - {Map headers,} - ) async{ - + String url, { + Map headers, + }) async { headers ??= {}; headers.addAll(_headers); Uri _url = Uri.parse(url); - // print(_url); - // print(headers); - http.Response response = await http.get(_url,headers: headers); - if(jsonDecode(response.body) is Map){ + // print(_url); + // print(headers); + http.Response response = await http.get(_url, headers: headers); + if (jsonDecode(response.body) is Map) { final message = jsonDecode(response.body)["message"]; - if(message != null && message.toString().isNotEmpty){ - Fluttertoast.showToast(msg: message ?? "",toastLength: Toast.LENGTH_LONG); + if (message != null && message.toString().isNotEmpty) { + Fluttertoast.showToast(msg: message ?? "", toastLength: Toast.LENGTH_LONG); } } @@ -44,12 +42,10 @@ class ApiManager { } Future post( - String url, { - Map headers, - @required Map body, - } - ) async{ - + String url, { + Map headers, + @required Map body, + }) async { headers ??= {}; headers.addAll(_headers); @@ -67,10 +63,10 @@ class ApiManager { // print(response.statusCode); // log(response.body); - if(jsonDecode(response.body) is Map){ + if (jsonDecode(response.body) is Map) { final message = jsonDecode(response.body)["message"]; - if(message != null && message.toString().isNotEmpty){ - Fluttertoast.showToast(msg: message ?? "",toastLength: Toast.LENGTH_LONG); + if (message != null && message.toString().isNotEmpty) { + Fluttertoast.showToast(msg: message ?? "", toastLength: Toast.LENGTH_LONG); } } @@ -78,12 +74,10 @@ class ApiManager { } Future put( - String url, { - Map headers, - @required Map body, - } - ) async{ - + String url, { + Map headers, + @required Map body, + }) async { headers ??= {}; headers.addAll(_headers); @@ -100,22 +94,24 @@ class ApiManager { http.Response response = await http.Response.fromStream(streamedResponse); // print(response.statusCode); // log(response.body); - if(jsonDecode(response.body) is Map){ + if (jsonDecode(response.body) is Map) { final message = jsonDecode(response.body)["message"]; - if(message != null && message.toString().isNotEmpty){ - Fluttertoast.showToast(msg: message ?? "",toastLength: Toast.LENGTH_LONG); + if (message != null && message.toString().isNotEmpty) { + Fluttertoast.showToast(msg: message ?? "", toastLength: Toast.LENGTH_LONG); } } return response; } Future multiPart( - String url, { - Map headers, - @required Map body, - @required List> files, - }) async{ - Map _headers = const {'Content-Type': 'multipart/form-data',}; + String url, { + Map headers, + @required Map body, + @required List> files, + }) async { + Map _headers = const { + 'Content-Type': 'multipart/form-data', + }; headers ??= {}; @@ -139,12 +135,12 @@ class ApiManager { http.Response response = await http.Response.fromStream(streamedResponse); // print(response.statusCode); // log(response.body); - if(jsonDecode(response.body) is Map){ + if (jsonDecode(response.body) is Map) { final message = jsonDecode(response.body)["message"]; - if(message != null && message.toString().isNotEmpty){ - Fluttertoast.showToast(msg: message ?? "",toastLength: Toast.LENGTH_LONG); + if (message != null && message.toString().isNotEmpty) { + Fluttertoast.showToast(msg: message ?? "", toastLength: Toast.LENGTH_LONG); } } return response; } -} \ No newline at end of file +} diff --git a/lib/controllers/api_routes/http_status_manger.dart b/lib/controllers/api_routes/http_status_manger.dart index 0bfb2170..f9405f62 100644 --- a/lib/controllers/api_routes/http_status_manger.dart +++ b/lib/controllers/api_routes/http_status_manger.dart @@ -1,40 +1,39 @@ import 'package:meta/meta.dart'; import 'package:test_sa/models/subtitle.dart'; -class HttpStatusManger{ +class HttpStatusManger { static String getStatusMessage({ @required int status, @required Subtitle subtitle, String messageFor400, String messageFor200, - }){ - if(status == null) + }) { + if (status == null) // no status code - code error no need for subtitle return "careful null status"; - if(status == -1) + if (status == -1) // client's request in process return subtitle.currentlyServiceNotAvailable; - if(status == -2){ + if (status == -2) { // client's request in process return subtitle.waitUntilYourRequestComplete; - }else if(status >= 200 && status < 300){ + } else if (status >= 200 && status < 300) { // client's request was successfully received return messageFor200 ?? subtitle.requestCompleteSuccessfully; - } else if(status >= 400 && status < 500){ + } else if (status >= 400 && status < 500) { // client's request have error - switch(status){ + switch (status) { case 400: return messageFor400 ?? subtitle.failedToCompleteRequest; default: return subtitle.failedToCompleteRequest; } - } else if(status >= 500){ + } else if (status >= 500) { // server error return subtitle.currentlyServiceNotAvailable; } else { // no error match so return default error return subtitle.failedToCompleteRequest; } - } -} \ No newline at end of file +} diff --git a/lib/controllers/localization/localization.dart b/lib/controllers/localization/localization.dart index a6e7fe82..182833e2 100644 --- a/lib/controllers/localization/localization.dart +++ b/lib/controllers/localization/localization.dart @@ -4,7 +4,6 @@ import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; import 'package:test_sa/models/subtitle.dart'; - class AppLocalization { AppLocalization(this.locale); @@ -17,23 +16,20 @@ class AppLocalization { Subtitle get subtitle => _subtitle; Future load() async { - String jsonStringValues = - await rootBundle.loadString('assets/subtitles/${locale.languageCode}_subtitle.json'); + String jsonStringValues = await rootBundle.loadString('assets/subtitles/${locale.languageCode}_subtitle.json'); _subtitle = Subtitle.fromJson(json.decode(jsonStringValues)); } // static member to have simple access to the delegate from Material App - static const LocalizationsDelegate delegate = - _DemoLocalizationsDelegate(); + static const LocalizationsDelegate delegate = _DemoLocalizationsDelegate(); } -class _DemoLocalizationsDelegate - extends LocalizationsDelegate { +class _DemoLocalizationsDelegate extends LocalizationsDelegate { const _DemoLocalizationsDelegate(); @override bool isSupported(Locale locale) { - return ['en','ar'].contains(locale.languageCode); + return ['en', 'ar'].contains(locale.languageCode); } @override @@ -45,4 +41,4 @@ class _DemoLocalizationsDelegate @override bool shouldReload(LocalizationsDelegate old) => false; -} \ No newline at end of file +} diff --git a/lib/controllers/notification/firebase_notification_manger.dart b/lib/controllers/notification/firebase_notification_manger.dart index 153d28fa..7e92b918 100644 --- a/lib/controllers/notification/firebase_notification_manger.dart +++ b/lib/controllers/notification/firebase_notification_manger.dart @@ -7,8 +7,7 @@ import 'package:test_sa/models/app_notification.dart'; import 'notification_manger.dart'; -class FirebaseNotificationManger{ - +class FirebaseNotificationManger { static FirebaseMessaging messaging = FirebaseMessaging.instance; static String token; @@ -23,7 +22,7 @@ class FirebaseNotificationManger{ sound: true, ); - if(settings.authorizationStatus == AuthorizationStatus.authorized){ + if (settings.authorizationStatus == AuthorizationStatus.authorized) { token = await messaging.getToken(); } return token; @@ -32,7 +31,7 @@ class FirebaseNotificationManger{ static initialized(BuildContext context) async { await Firebase.initializeApp(); NotificationSettings settings; - try{ + try { settings = await messaging.requestPermission( alert: true, announcement: false, @@ -42,11 +41,11 @@ class FirebaseNotificationManger{ provisional: false, sound: true, ); - }catch(error){ + } catch (error) { return; } - if(settings.authorizationStatus != AuthorizationStatus.authorized){ + if (settings.authorizationStatus != AuthorizationStatus.authorized) { return; } @@ -56,28 +55,17 @@ class FirebaseNotificationManger{ FirebaseMessaging.onMessageOpenedApp.listen((RemoteMessage message) { AppNotification notification = AppNotification.fromJson(message.data); - if(notification.path == null - || notification.path.isEmpty) - return; - Navigator.pushNamed( - context, - notification.path, - arguments: notification.requestId - ); + if (notification.path == null || notification.path.isEmpty) return; + Navigator.pushNamed(context, notification.path, arguments: notification.requestId); }); FirebaseMessaging.onMessage.listen((RemoteMessage message) { AppNotification notification = AppNotification.fromJson(message.data); NotificationManger.showNotification( - title: message.notification.title, - subtext: message.notification.body, - hashcode: int.tryParse(notification.requestId ?? "") ?? 1, - payload: json.encode(message.data) - ); + title: message.notification.title, subtext: message.notification.body, hashcode: int.tryParse(notification.requestId ?? "") ?? 1, payload: json.encode(message.data)); return; }); } } -Future firebaseMessagingBackgroundHandler(RemoteMessage message) async { -} \ No newline at end of file +Future firebaseMessagingBackgroundHandler(RemoteMessage message) async {} diff --git a/lib/controllers/notification/notification_manger.dart b/lib/controllers/notification/notification_manger.dart index a568d5d3..3038f784 100644 --- a/lib/controllers/notification/notification_manger.dart +++ b/lib/controllers/notification/notification_manger.dart @@ -2,7 +2,7 @@ import 'package:flutter/foundation.dart'; import 'package:flutter_local_notifications/flutter_local_notifications.dart'; import 'package:test_sa/views/app_style/colors.dart'; -class NotificationManger{ +class NotificationManger { // private constructor to avoid create object NotificationManger._(); @@ -12,43 +12,26 @@ class NotificationManger{ /// onNotificationPressed action when notification pressed to open tap /// onIOSNotificationPressed action when notification pressed /// to open tap in iOS versions older than 10 - static initialisation( - Function(NotificationResponse) onNotificationPressed, - DidReceiveLocalNotificationCallback onIOSNotificationPressed - ) async { - FlutterLocalNotificationsPlugin flutterLocalNotificationsPlugin = - FlutterLocalNotificationsPlugin(); + static initialisation(Function(NotificationResponse) onNotificationPressed, DidReceiveLocalNotificationCallback onIOSNotificationPressed) async { + FlutterLocalNotificationsPlugin flutterLocalNotificationsPlugin = FlutterLocalNotificationsPlugin(); // initialise the plugin. app_icon needs to be a added as a drawable resource to the Android head project - const AndroidInitializationSettings initializationSettingsAndroid = - AndroidInitializationSettings('app_icon',); + const AndroidInitializationSettings initializationSettingsAndroid = AndroidInitializationSettings( + 'app_icon', + ); - final DarwinInitializationSettings initializationSettingsDarwin = - DarwinInitializationSettings( - onDidReceiveLocalNotification: onIOSNotificationPressed); + final DarwinInitializationSettings initializationSettingsDarwin = DarwinInitializationSettings(onDidReceiveLocalNotification: onIOSNotificationPressed); - final InitializationSettings initializationSettings = InitializationSettings( - android: initializationSettingsAndroid, - iOS: initializationSettingsDarwin, - macOS: initializationSettingsDarwin); + final InitializationSettings initializationSettings = InitializationSettings(android: initializationSettingsAndroid, iOS: initializationSettingsDarwin, macOS: initializationSettingsDarwin); - await flutterLocalNotificationsPlugin.initialize( - initializationSettings, - onDidReceiveNotificationResponse: onNotificationPressed); + await flutterLocalNotificationsPlugin.initialize(initializationSettings, onDidReceiveNotificationResponse: onNotificationPressed); } // push new notification - static Future showNotification( - { - @required String title, - @required String subtext, - @required int hashcode, - String payload - }) async { - + static Future showNotification({@required String title, @required String subtext, @required int hashcode, String payload}) async { const AndroidNotificationDetails androidChannel = AndroidNotificationDetails( 'com.newtrack.testsa', 'Test SA', - channelDescription:'Push notification service for Test SA', + channelDescription: 'Push notification service for Test SA', importance: Importance.max, priority: Priority.max, playSound: true, @@ -62,8 +45,7 @@ class NotificationManger{ groupKey: 'com.newtrack.testsa', ); - const DarwinNotificationDetails iosNotificationDetails = - DarwinNotificationDetails( + const DarwinNotificationDetails iosNotificationDetails = DarwinNotificationDetails( categoryIdentifier: "testSA", ); @@ -81,5 +63,4 @@ class NotificationManger{ payload: payload, ); } - -} \ No newline at end of file +} diff --git a/lib/controllers/providers/api/departments_provider.dart b/lib/controllers/providers/api/departments_provider.dart index 27146791..b5ca6387 100644 --- a/lib/controllers/providers/api/departments_provider.dart +++ b/lib/controllers/providers/api/departments_provider.dart @@ -6,10 +6,9 @@ import 'package:test_sa/controllers/api_routes/api_manager.dart'; import 'package:test_sa/controllers/api_routes/urls.dart'; import 'package:test_sa/models/department.dart'; -class DepartmentsProvider extends ChangeNotifier{ - +class DepartmentsProvider extends ChangeNotifier { //reset provider data - void reset(){ + void reset() { departments = null; stateCode = null; } @@ -19,7 +18,6 @@ class DepartmentsProvider extends ChangeNotifier{ // 500 service not available int stateCode; - // contain user data // when user not login or register _user = null List departments; @@ -29,34 +27,29 @@ class DepartmentsProvider extends ChangeNotifier{ // failed _loading = false bool isLoading; - /// return -2 if request in progress /// return -1 if error happen when sending request /// 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 getDepartment (String host) async { - if(isLoading == true) - return -2; + Future getDepartment(String host) async { + if (isLoading == true) return -2; isLoading = true; notifyListeners(); Response response; - try{ - response = await ApiManager.instance.post( - URLs.getDepartments, - body: { - "pageSize":50, - // if(title != null && title.isNotEmpty) "name":title, - } - ); - } catch(error) { + try { + response = await ApiManager.instance.post(URLs.getDepartments, body: { + "pageSize": 50, + // if(title != null && title.isNotEmpty) "name":title, + }); + } catch (error) { isLoading = false; stateCode = -1; notifyListeners(); return -1; } stateCode = response.statusCode; - if(response.statusCode >= 200 && response.statusCode < 300) { + if (response.statusCode >= 200 && response.statusCode < 300) { // client's request was successfully received List listJson = json.decode(response.body)["data"]; departments = listJson.map((department) => Department.fromJson(department)).toList(); @@ -65,5 +58,4 @@ class DepartmentsProvider extends ChangeNotifier{ notifyListeners(); return response.statusCode; } - -} \ No newline at end of file +} diff --git a/lib/controllers/providers/api/device_transfer_provider.dart b/lib/controllers/providers/api/device_transfer_provider.dart index 359a98d9..f3cd3a46 100644 --- a/lib/controllers/providers/api/device_transfer_provider.dart +++ b/lib/controllers/providers/api/device_transfer_provider.dart @@ -143,61 +143,53 @@ class DeviceTransferProvider extends ChangeNotifier { "destDepartmentId": oldModel.receiver.department.id, }; - if(isSender){ - body.addAll( - { - "senderSiteId": newModel.client.id, - "senderDepartmentId": newModel.department.id, - "senderAssignedEmployeeId": newModel.userId, - "senderMachineStatusId": newModel.status.id, - "senderComment": newModel.comment, - "senderWorkingHours": newModel.workingHours, - "senderTravelingHours": newModel.travelingHours, - "senderAttachmentName": "${newModel.signature}.png", - "destSiteId": oldModel.receiver.client.id, - "destDepartmentId": oldModel.receiver.department.id, - "receiverAssignedEmployeeId": oldModel.receiver.userId, - "receiverMachineStatusId": oldModel.receiver.status.id??"", - "receiverComment": oldModel.receiver.comment, - "receiverWorkingHours": oldModel.receiver.workingHours, - "receiverTravelingHours": oldModel.receiver.travelingHours, - "receiverAttachmentName": "${oldModel.receiver.signature}.png", - } - ); - }else{ - body.addAll( - { - "senderSiteId": oldModel.sender.client.id, - "senderDepartmentId": oldModel.sender.department.id, - "senderAssignedEmployeeId": oldModel.sender.userId, - "senderMachineStatusId": oldModel.sender.status.id, - "senderComment": oldModel.sender.comment, - "senderWorkingHours": oldModel.sender.workingHours, - "senderTravelingHours": oldModel.sender.travelingHours, - "senderAttachmentName": "${oldModel.sender.signature}.png", - "destSiteId": newModel.client.id, - "destDepartmentId": newModel.department.id, - "receiverAssignedEmployeeId": newModel.userId, - "receiverMachineStatusId": newModel.status?.id??"", - "receiverComment": newModel.comment, - "receiverWorkingHours": newModel.workingHours, - "receiverTravelingHours": newModel.travelingHours, - "receiverAttachmentName": "${newModel.signature}.png", - } - ); + if (isSender) { + body.addAll({ + "senderSiteId": newModel.client.id, + "senderDepartmentId": newModel.department.id, + "senderAssignedEmployeeId": newModel.userId, + "senderMachineStatusId": newModel.status.id, + "senderComment": newModel.comment, + "senderWorkingHours": newModel.workingHours, + "senderTravelingHours": newModel.travelingHours, + "senderAttachmentName": "${newModel.signature}.png", + "destSiteId": oldModel.receiver.client.id, + "destDepartmentId": oldModel.receiver.department.id, + "receiverAssignedEmployeeId": oldModel.receiver.userId, + "receiverMachineStatusId": oldModel.receiver.status.id ?? "", + "receiverComment": oldModel.receiver.comment, + "receiverWorkingHours": oldModel.receiver.workingHours, + "receiverTravelingHours": oldModel.receiver.travelingHours, + "receiverAttachmentName": "${oldModel.receiver.signature}.png", + }); + } else { + body.addAll({ + "senderSiteId": oldModel.sender.client.id, + "senderDepartmentId": oldModel.sender.department.id, + "senderAssignedEmployeeId": oldModel.sender.userId, + "senderMachineStatusId": oldModel.sender.status.id, + "senderComment": oldModel.sender.comment, + "senderWorkingHours": oldModel.sender.workingHours, + "senderTravelingHours": oldModel.sender.travelingHours, + "senderAttachmentName": "${oldModel.sender.signature}.png", + "destSiteId": newModel.client.id, + "destDepartmentId": newModel.department.id, + "receiverAssignedEmployeeId": newModel.userId, + "receiverMachineStatusId": newModel.status?.id ?? "", + "receiverComment": newModel.comment, + "receiverWorkingHours": newModel.workingHours, + "receiverTravelingHours": newModel.travelingHours, + "receiverAttachmentName": "${newModel.signature}.png", + }); } print(body["senderWorkingHours"]); - body.addAll(newModel.toJson(isSender)); print(body); Response response; - try{ - response = await ApiManager.instance.put( - URLs.updateDeviceTransfer, - body: body - ); + try { + response = await ApiManager.instance.put(URLs.updateDeviceTransfer, body: body); print(response.body); print("${newModel.signature}.png"); @@ -221,4 +213,4 @@ class DeviceTransferProvider extends ChangeNotifier { return -1; } } -} \ No newline at end of file +} diff --git a/lib/controllers/providers/api/devices_provider.dart b/lib/controllers/providers/api/devices_provider.dart index 5bbd281f..4bede208 100644 --- a/lib/controllers/providers/api/devices_provider.dart +++ b/lib/controllers/providers/api/devices_provider.dart @@ -23,7 +23,7 @@ class DevicesProvider extends ChangeNotifier { int _stateCode; int get stateCode => _stateCode; - List _devices=[]; + List _devices = []; List get devices => _devices; // when categories in-process _loading = true @@ -54,8 +54,8 @@ class DevicesProvider extends ChangeNotifier { Response response; try { response = await ApiManager.instance.post(URLs.getEquipment, body: { - "pageSize": pageItemNumber , - "pageNumber":devices.length ~/ pageItemNumber + 1, + "pageSize": pageItemNumber, + "pageNumber": devices.length ~/ pageItemNumber + 1, "siteId": hospitalId, if (serialNumber?.isEmpty == false) "assetSerialNumber": serialNumber, if (number?.isEmpty == false) "assetNo": number, @@ -72,10 +72,9 @@ class DevicesProvider extends ChangeNotifier { List equipmentListJson = json.decode(response.body)["data"]; _devices.addAll(equipmentListJson.map((device) => Device.fromJson(device)).toList()); nextPage = true; - }else - { - nextPage = false; - } + } else { + nextPage = false; + } _loading = false; notifyListeners(); return response.statusCode; @@ -97,7 +96,7 @@ class DevicesProvider extends ChangeNotifier { try { response = await ApiManager.instance.post(URLs.getEquipment, body: { "pageSize": pageItemNumber, - "pageNumber":devices.length ~/ pageItemNumber + 1, + "pageNumber": devices.length ~/ pageItemNumber + 1, "siteId": devices.length ~/ pageItemNumber + 1, if (serialNumber?.isEmpty == false) "assetSerialNumber": serialNumber, if (number?.isEmpty == false) "assetNo": number, diff --git a/lib/controllers/providers/api/gas_refill_provider.dart b/lib/controllers/providers/api/gas_refill_provider.dart index 2f460a0a..ef9beedf 100644 --- a/lib/controllers/providers/api/gas_refill_provider.dart +++ b/lib/controllers/providers/api/gas_refill_provider.dart @@ -7,13 +7,12 @@ import 'package:test_sa/controllers/api_routes/urls.dart'; import 'package:test_sa/models/gas_refill/gas_refill_model.dart'; import 'package:test_sa/models/user.dart'; -class GasRefillProvider extends ChangeNotifier{ - +class GasRefillProvider extends ChangeNotifier { // number of items call in each request final pageItemNumber = 50; //reset provider data - void reset(){ + void reset() { items = null; nextPage = true; stateCode = null; @@ -40,132 +39,122 @@ class GasRefillProvider 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 ({ + Future getRequests({ @required String host, @required User user, }) async { - if(isLoading == true) - return -2; + if (isLoading == true) return -2; isLoading = true; Response response; - Map body = {}; - body["pageNumber"] = (items?.length ?? 0) ~/pageItemNumber + 1; - body["pageSize"] = pageItemNumber; - - response = await ApiManager.instance.post( - URLs.getGasRefill, - body: body, - ); - stateCode = response.statusCode; - if(stateCode >= 200 && stateCode < 300) { - // client's request was successfully received - List requestsListJson = json.decode(response.body)["data"]; - List itemsPage = requestsListJson.map( - (request) => GasRefillModel.fromJson(request)).toList(); - items ??= []; - items.addAll(itemsPage); - if(itemsPage.length == pageItemNumber){ - nextPage = true; - }else{ - nextPage = false; - } + Map body = {}; + body["pageNumber"] = (items?.length ?? 0) ~/ pageItemNumber + 1; + body["pageSize"] = pageItemNumber; + + response = await ApiManager.instance.post( + URLs.getGasRefill, + body: body, + ); + stateCode = response.statusCode; + if (stateCode >= 200 && stateCode < 300) { + // client's request was successfully received + List requestsListJson = json.decode(response.body)["data"]; + List itemsPage = requestsListJson.map((request) => GasRefillModel.fromJson(request)).toList(); + items ??= []; + items.addAll(itemsPage); + if (itemsPage.length == pageItemNumber) { + nextPage = true; + } else { + nextPage = false; } - try{ + } + try { isLoading = false; notifyListeners(); return response.statusCode; - - } catch(error) { + } catch (error) { isLoading = false; stateCode = -1; notifyListeners(); return -1; } - } - Future createModel ({ + Future createModel({ @required String host, @required User user, @required GasRefillModel model, }) async { - Map body = { + Map body = { "uid": user.id.toString(), "token": user.token ?? "", "GazRefillNo": "GR-${DateTime.now().toString().split(" ").first}", "status": model.status.toMap(), }; - body["gazRefillDetails"] = model.details.map((model) => { - "gasType": model.type.toMap(), - "cylinderSize": model.cylinderSize.toMap(), - "cylinderType": model.cylinderType.toMap(), - "requestedQty": model.requestedQuantity, - }).toList(); + body["gazRefillDetails"] = model.details + .map((model) => { + "gasType": model.type.toMap(), + "cylinderSize": model.cylinderSize.toMap(), + "cylinderType": model.cylinderType.toMap(), + "requestedQty": model.requestedQuantity, + }) + .toList(); Response response; - try{ - response = await ApiManager.instance.post( - URLs.requestGasRefill, - body: body - ); + try { + response = await ApiManager.instance.post(URLs.requestGasRefill, body: body); stateCode = response.statusCode; - if(response.statusCode >= 200 && response.statusCode < 300) { - if(items != null) { - reset(); + if (response.statusCode >= 200 && response.statusCode < 300) { + if (items != null) { + reset(); notifyListeners(); } } return response.statusCode; - - } catch(error) { + } catch (error) { return -1; } - } - Future updateModel ({ + Future updateModel({ @required String host, @required User user, @required GasRefillModel oldModel, @required GasRefillModel newModel, }) async { - Map body = { - "id":newModel.id, + Map body = { + "id": newModel.id, "gazRefillNo": newModel.title ?? "", "status": newModel.status.toMap(), }; - body["gazRefillDetails"] = newModel.details.map((model) => { - "gasType": model.type.toMap(), - "cylinderSize": model.cylinderSize.toMap(), - "cylinderType": model.cylinderType.toMap(), - "requestedQty": model.requestedQuantity, - "deliverdQty": model.deliveredQuantity, - }).toList(); + body["gazRefillDetails"] = newModel.details + .map((model) => { + "gasType": model.type.toMap(), + "cylinderSize": model.cylinderSize.toMap(), + "cylinderType": model.cylinderType.toMap(), + "requestedQty": model.requestedQuantity, + "deliverdQty": model.deliveredQuantity, + }) + .toList(); Response response; - try{ - response = await ApiManager.instance.put( - URLs.updateGasRefill, - body: body - ); + try { + response = await ApiManager.instance.put(URLs.updateGasRefill, body: body); // response = await post( // Uri.parse("$host${URLs.updateGasRefill}/${newModel.id}"), // body: body, // ); stateCode = response.statusCode; - if(response.statusCode >= 200 && response.statusCode < 300) { + if (response.statusCode >= 200 && response.statusCode < 300) { oldModel.fromGasRefillModel(newModel); notifyListeners(); } return response.statusCode; - - } catch(error) { + } catch (error) { return -1; } - } -} \ No newline at end of file +} diff --git a/lib/controllers/providers/api/hospitals_provider.dart b/lib/controllers/providers/api/hospitals_provider.dart index bdcb9fa7..9a54490c 100644 --- a/lib/controllers/providers/api/hospitals_provider.dart +++ b/lib/controllers/providers/api/hospitals_provider.dart @@ -8,13 +8,12 @@ import 'package:test_sa/controllers/api_routes/urls.dart'; import 'package:test_sa/models/hospital.dart'; import 'package:test_sa/models/user.dart'; -class HospitalsProvider extends ChangeNotifier{ - +class HospitalsProvider extends ChangeNotifier { // number of items call in each request final pageItemNumber = 50; //reset provider data - void reset(){ + void reset() { _hospitals = null; _stateCode = null; } @@ -39,7 +38,7 @@ class HospitalsProvider extends ChangeNotifier{ // failed _loading = false bool _loading; bool get isLoading => _loading; - set isLoading(bool isLoading){ + set isLoading(bool isLoading) { _loading = isLoading; notifyListeners(); } @@ -49,58 +48,49 @@ class HospitalsProvider 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 getHospitals ({String host,User user,String title}) async { - if(_loading == true) - return -2; + Future getHospitals({String host, User user, String title}) async { + if (_loading == true) return -2; _loading = true; notifyListeners(); Response response; - try{ - response = await ApiManager.instance.post( - URLs.getHospitals, - body: { - "pageNumber":(hospitals?.length ?? 0) ~/pageItemNumber + 1, - "pageSize":50, - if(title != null && title.isNotEmpty) "name":title, - } - ); + try { + response = await ApiManager.instance.post(URLs.getHospitals, body: { + "pageNumber": (hospitals?.length ?? 0) ~/ pageItemNumber + 1, + "pageSize": 50, + if (title != null && title.isNotEmpty) "name": title, + }); _stateCode = response.statusCode; - if(response.statusCode >= 200 && response.statusCode < 300) { + if (response.statusCode >= 200 && response.statusCode < 300) { // client's request was successfully received List categoriesListJson = json.decode(response.body)["data"]; - List _page = categoriesListJson.map((category) => Hospital.fromJson(category)).toList(); - if(hospitals == null) - _hospitals = []; + List _page = categoriesListJson.map((category) => Hospital.fromJson(category)).toList(); + if (hospitals == null) _hospitals = []; _hospitals.addAll(_page); - if(_page.length >= pageItemNumber){ + if (_page.length >= pageItemNumber) { _nextPage = true; - }else{ + } else { _nextPage = false; } } _loading = false; notifyListeners(); return response.statusCode; - } catch(error) { + } catch (error) { _loading = false; _stateCode = -1; notifyListeners(); return -1; } - } - Future> getHospitalsList ({String host,User user,String title}) async { + Future> getHospitalsList({String host, User user, String title}) async { Response response; - try{ - response = await ApiManager.instance.post( - URLs.getHospitals, - body: { - "pageSize":50, - if(title != null && title.isNotEmpty) "name":title, - } - ); + try { + response = await ApiManager.instance.post(URLs.getHospitals, body: { + "pageSize": 50, + if (title != null && title.isNotEmpty) "name": title, + }); // response = await get( // Uri.parse(host + URLs.getHospitals // + ( title == null || title.isEmpty ? "" : "?name=$title" )), @@ -110,20 +100,18 @@ class HospitalsProvider extends ChangeNotifier{ // ); _stateCode = response.statusCode; - List _page = []; - if(response.statusCode >= 200 && response.statusCode < 300) { + List _page = []; + if (response.statusCode >= 200 && response.statusCode < 300) { // client's request was successfully received List categoriesListJson = json.decode(response.body)["data"]; _page = categoriesListJson.map((category) => Hospital.fromJson(category)).toList(); } return _page; - } catch(error) { + } catch (error) { _loading = false; _stateCode = -1; notifyListeners(); return []; } - } - -} \ No newline at end of file +} diff --git a/lib/controllers/providers/api/notifications_provider.dart b/lib/controllers/providers/api/notifications_provider.dart index 14afc4b7..05ec6738 100644 --- a/lib/controllers/providers/api/notifications_provider.dart +++ b/lib/controllers/providers/api/notifications_provider.dart @@ -6,13 +6,12 @@ import 'package:test_sa/controllers/api_routes/urls.dart'; import 'package:test_sa/models/app_notification.dart'; import 'package:test_sa/models/user.dart'; -class NotificationsProvider extends ChangeNotifier{ - +class NotificationsProvider extends ChangeNotifier { // number of items call in each request final pageItemNumber = 20; //reset provider data - void reset(){ + void reset() { notifications = null; nextPage = true; stateCode = null; @@ -34,58 +33,50 @@ class NotificationsProvider extends ChangeNotifier{ // failed _loading = false bool isLoading; - /// return -2 if request in progress /// return -1 if error happen when sending request /// 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 getNotifications ({ + Future getNotifications({ @required String host, @required User user, @required int hospitalId, }) async { - if(isLoading == true) - return -2; + if (isLoading == true) return -2; isLoading = true; notifyListeners(); Response response; - // userId = 397.toString(); // testing id to view data - try{ + // userId = 397.toString(); // testing id to view data + try { response = await get( - Uri.parse(URLs.getNotifications - +"?uid=${user.id}" - "&token=${user.token}" - "&page=${(notifications?.length ?? 0) ~/pageItemNumber}"), - headers: { - "Content-Type":"application/json; charset=utf-8" - } - ); + Uri.parse(URLs.getNotifications + + "?uid=${user.id}" + "&token=${user.token}" + "&page=${(notifications?.length ?? 0) ~/ pageItemNumber}"), + headers: {"Content-Type": "application/json; charset=utf-8"}); stateCode = response.statusCode; - if(response.statusCode >= 200 && response.statusCode < 300) { + if (response.statusCode >= 200 && response.statusCode < 300) { // client's request was successfully received List requestsListJson = json.decode(utf8.decode(response.bodyBytes)); - List _serviceRequestsPage = requestsListJson.map( - (request) => AppNotification.fromJson(request)).toList(); - if(notifications == null) - notifications = []; + List _serviceRequestsPage = requestsListJson.map((request) => AppNotification.fromJson(request)).toList(); + if (notifications == null) notifications = []; notifications.addAll(_serviceRequestsPage); - if(_serviceRequestsPage.length == pageItemNumber){ + if (_serviceRequestsPage.length == pageItemNumber) { nextPage = true; - }else{ + } else { nextPage = false; } } isLoading = false; notifyListeners(); return response.statusCode; - } catch(error) { + } catch (error) { isLoading = false; stateCode = -1; notifyListeners(); return -1; } - } /// return -2 if request in progress @@ -93,35 +84,26 @@ class NotificationsProvider 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> getRecentNotifications ({ + Future> getRecentNotifications({ @required String host, @required User user, }) async { Response response; //userId = 397.toString(); // testing id to view data - try{ - response = await get( - Uri.parse(host+URLs.getNotifications - +"?uid=${user.id}&token=${user.token}"), - headers: { - "Content-Type":"application/json; charset=utf-8" - } - ); + try { + response = await get(Uri.parse(host + URLs.getNotifications + "?uid=${user.id}&token=${user.token}"), headers: {"Content-Type": "application/json; charset=utf-8"}); stateCode = response.statusCode; - if(response.statusCode >= 200 && response.statusCode < 300) { + if (response.statusCode >= 200 && response.statusCode < 300) { // client's request was successfully received List requestsListJson = json.decode(utf8.decode(response.bodyBytes)); - List _recentNotifications = requestsListJson.map( - (request) => AppNotification.fromJson(request)).toList(); + List _recentNotifications = requestsListJson.map((request) => AppNotification.fromJson(request)).toList(); return _recentNotifications; } return null; - - } catch(error) { + } catch (error) { return null; } - } -} \ No newline at end of file +} diff --git a/lib/controllers/providers/api/parts_provider.dart b/lib/controllers/providers/api/parts_provider.dart index 8603c860..7f8cca4f 100644 --- a/lib/controllers/providers/api/parts_provider.dart +++ b/lib/controllers/providers/api/parts_provider.dart @@ -8,13 +8,12 @@ import 'package:test_sa/controllers/api_routes/urls.dart'; import 'package:test_sa/models/part.dart'; import 'package:test_sa/models/user.dart'; -class PartsProvider extends ChangeNotifier{ - +class PartsProvider extends ChangeNotifier { // number of items call in each request final pageItemNumber = 50; //reset provider data - void reset(){ + void reset() { _parts = null; _stateCode = null; } @@ -39,7 +38,7 @@ class PartsProvider extends ChangeNotifier{ // failed _loading = false bool _loading; bool get isLoading => _loading; - set isLoading(bool isLoading){ + set isLoading(bool isLoading) { _loading = isLoading; notifyListeners(); } @@ -49,44 +48,36 @@ class PartsProvider 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 getParts ({String host,User user,String title}) async { - if(_loading == true) - return -2; + Future getParts({String host, User user, String title}) async { + if (_loading == true) return -2; _loading = true; notifyListeners(); Response response; - try{ - response = await ApiManager.instance.post( - URLs.getPartNumber, - body: { - if(title != null && title.isNotEmpty) - "partName":title - }); + try { + response = await ApiManager.instance.post(URLs.getPartNumber, body: {if (title != null && title.isNotEmpty) "partName": title}); _stateCode = response.statusCode; - if(response.statusCode >= 200 && response.statusCode < 300) { + if (response.statusCode >= 200 && response.statusCode < 300) { // client's request was successfully received List categoriesListJson = json.decode(utf8.decode(response.bodyBytes)); - List _page = categoriesListJson.map((part) => Part.fromJson(part)).toList(); - if(parts == null) - _parts = []; + List _page = categoriesListJson.map((part) => Part.fromJson(part)).toList(); + if (parts == null) _parts = []; _parts.addAll(_page); - if(_page.length >= pageItemNumber){ + if (_page.length >= pageItemNumber) { _nextPage = true; - }else{ + } else { _nextPage = false; } } _loading = false; notifyListeners(); return response.statusCode; - } catch(error) { + } catch (error) { _loading = false; _stateCode = -1; notifyListeners(); return -1; } - } /// return -2 if request in progress @@ -94,26 +85,19 @@ class PartsProvider 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> getPartsList ({String host,User user,String title}) async { + Future> getPartsList({String host, User user, String title}) async { Response response; - try{ - response = await ApiManager.instance.post( - URLs.getPartNumber, - body: { - if(title != null && title.isNotEmpty) - "partName":title - }); - List _page = []; - if(response.statusCode >= 200 && response.statusCode < 300) { + try { + response = await ApiManager.instance.post(URLs.getPartNumber, body: {if (title != null && title.isNotEmpty) "partName": title}); + List _page = []; + if (response.statusCode >= 200 && response.statusCode < 300) { // client's request was successfully received List categoriesListJson = json.decode(response.body)["data"]; _page = categoriesListJson.map((part) => Part.fromJson(part)).toList(); } return _page; - } catch(error) { + } catch (error) { return []; } - } - -} \ No newline at end of file +} diff --git a/lib/controllers/providers/api/regular_visits_provider.dart b/lib/controllers/providers/api/regular_visits_provider.dart index 39119490..42fb1dd9 100644 --- a/lib/controllers/providers/api/regular_visits_provider.dart +++ b/lib/controllers/providers/api/regular_visits_provider.dart @@ -11,13 +11,12 @@ import 'package:test_sa/models/visits/visit.dart'; import 'package:test_sa/models/visits/visits_group.dart'; import 'package:test_sa/models/visits/visits_search.dart'; -class RegularVisitsProvider extends ChangeNotifier{ - +class RegularVisitsProvider extends ChangeNotifier { // number of items call in each request final pageItemNumber = 20; //reset provider data - void reset(){ + void reset() { visits = null; nextPage = true; stateCode = null; @@ -46,50 +45,47 @@ class RegularVisitsProvider 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 getVisits ({ + Future getVisits({ @required String host, @required User user, - // VisitsSearch visitsSearch, + // VisitsSearch visitsSearch, }) async { - if(isLoading == true) - return -2; + if (isLoading == true) return -2; isLoading = true; - if(visits == null) notifyListeners(); + if (visits == null) notifyListeners(); Response response; //userId = 397.toString(); // testing id to view data - try{ - Map body = {}; + try { + Map body = {}; body.addAll(visitsSearch.toMap()); - body["pageNumber"] = (visits?.length ?? 0) ~/pageItemNumber +1; + body["pageNumber"] = (visits?.length ?? 0) ~/ pageItemNumber + 1; body["pageSize"] = pageItemNumber; response = await ApiManager.instance.post( URLs.getRegularVisits, body: body, ); - } catch(error) { + } catch (error) { isLoading = false; stateCode = -1; notifyListeners(); return -1; } stateCode = response.statusCode; - if(response.statusCode >= 200 && response.statusCode < 300) { + if (response.statusCode >= 200 && response.statusCode < 300) { // client's request was successfully received - try{ + try { List requestsListJson = json.decode(response.body)["data"]; - List _visits = requestsListJson.map( - (request) => Visit.fromJson(request) - ).toList(); + List _visits = requestsListJson.map((request) => Visit.fromJson(request)).toList(); visits ??= []; visits.addAll(_visits); - if(_visits.length == pageItemNumber){ + if (_visits.length == pageItemNumber) { nextPage = true; - }else{ + } else { nextPage = false; } - }catch(error){ + } catch (error) { Logger().e(error); isLoading = false; stateCode = -1; @@ -107,29 +103,29 @@ class RegularVisitsProvider 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 updateGroupOfVisits ({ + Future updateGroupOfVisits({ @required String host, @required User user, VisitsGroup group, }) async { Response response; - try{ - Map body = group.toJson(); + try { + Map body = group.toJson(); response = await ApiManager.instance.post( URLs.getRegularVisits, body: body, ); stateCode = response.statusCode; - if(response.statusCode >= 200 && response.statusCode < 300) { + if (response.statusCode >= 200 && response.statusCode < 300) { // client's request was successfully received reset(); notifyListeners(); } return response.statusCode; - } catch(error) { + } catch (error) { isLoading = false; stateCode = -1; notifyListeners(); @@ -137,31 +133,26 @@ class RegularVisitsProvider extends ChangeNotifier{ } } - Future getPently({String host,User user,int id}) async { + Future getPently({String host, User user, int id}) async { Response response; - response = await get( - Uri.parse("$host${URLs.getPentry}/$id"), - headers: { - "Content-Type":"application/json; charset=utf-8" - } - ); + response = await get(Uri.parse("$host${URLs.getPentry}/$id"), headers: {"Content-Type": "application/json; charset=utf-8"}); Pentry pantry; - if(response.statusCode >= 200 && response.statusCode < 300) { + if (response.statusCode >= 200 && response.statusCode < 300) { pantry = Pentry.fromMap(json.decode(utf8.decode(response.bodyBytes))); } return pantry; } - Future updatePentry ({ + Future updatePentry({ @required String host, @required User user, @required Pentry pentry, @required Visit visit, }) async { - try{ + try { Response response; - Map body = pentry.toMap(visit.id); + Map body = pentry.toMap(visit.id); body["id"] = visit.id; body["assetId"] = visit.deviceId; body["ppmScheduleId"] = visit.ppmScheduleId; @@ -169,23 +160,19 @@ class RegularVisitsProvider extends ChangeNotifier{ // body["vChecklists"]?.addAll({}); // body["vCalibrationTools"]?.addAll({"visitId": visit.id,}); // body["vKits"]?.add({"visitId": visit.id,}); - response = await ApiManager.instance.put( - URLs.updatePentry, body: body - ); + response = await ApiManager.instance.put(URLs.updatePentry, body: body); // response = await post( // Uri.parse(host+URLs.updatePentry + "/${visit.id}"), // body: body, // ); - if(response.statusCode >= 200 && response.statusCode < 300) { - reset();//visit.status = pentry.ppmVisitStatus; + if (response.statusCode >= 200 && response.statusCode < 300) { + reset(); //visit.status = pentry.ppmVisitStatus; notifyListeners(); } return response.statusCode; - - } catch(error) { + } catch (error) { return -1; } - } -} \ No newline at end of file +} diff --git a/lib/controllers/providers/api/service_requests_provider.dart b/lib/controllers/providers/api/service_requests_provider.dart index 167087b9..17c24e81 100644 --- a/lib/controllers/providers/api/service_requests_provider.dart +++ b/lib/controllers/providers/api/service_requests_provider.dart @@ -37,7 +37,7 @@ class ServiceRequestsProvider extends ChangeNotifier { // list of user requests List serviceRequests; - List workOrders =[]; + List workOrders = []; // when requests in-process _loading = true // done _loading = true @@ -249,16 +249,15 @@ class ServiceRequestsProvider extends ChangeNotifier { } Future> searchWorkOrders({@required String callId}) async { - Response response; - try{ + try { var body = { - "pageSize": pageItemNumber, - "pageNumber":( (workOrders?.length ?? 0) ~/ pageItemNumber) + 1, - "callId": callId, - }; - response = await ApiManager.instance.post(URLs.searchWorkOrders, body: body); + "pageSize": pageItemNumber, + "pageNumber": ((workOrders?.length ?? 0) ~/ pageItemNumber) + 1, + "callId": callId, + }; + response = await ApiManager.instance.post(URLs.searchWorkOrders, body: body); stateCode = response.statusCode; if (response.statusCode >= 200 && response.statusCode < 300) { // client's request was successfully received @@ -272,9 +271,8 @@ class ServiceRequestsProvider extends ChangeNotifier { } } return workOrders; - - }catch(e){ - return []; + } catch (e) { + return []; } } diff --git a/lib/controllers/providers/api/status_drop_down/employee/assigned_to_provider.dart b/lib/controllers/providers/api/status_drop_down/employee/assigned_to_provider.dart index f0ff7e05..f98e16cd 100644 --- a/lib/controllers/providers/api/status_drop_down/employee/assigned_to_provider.dart +++ b/lib/controllers/providers/api/status_drop_down/employee/assigned_to_provider.dart @@ -8,10 +8,9 @@ import 'package:test_sa/controllers/api_routes/urls.dart'; import 'package:test_sa/models/lookup.dart'; import 'package:test_sa/models/user.dart'; -class AssignedToProvider extends ChangeNotifier{ - +class AssignedToProvider extends ChangeNotifier { //reset provider data - void reset(){ + void reset() { _items = null; _stateCode = null; } @@ -32,7 +31,7 @@ class AssignedToProvider extends ChangeNotifier{ // failed _loading = false bool _loading; bool get isLoading => _loading; - set isLoading(bool isLoading){ + set isLoading(bool isLoading) { _loading = isLoading; notifyListeners(); } @@ -42,18 +41,17 @@ class AssignedToProvider 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 getData ({String host,User user}) async { - if(_loading == true) - return -2; + Future getData({String host, User user}) async { + if (_loading == true) return -2; _loading = true; notifyListeners(); Response response; - try{ + try { response = await ApiManager.instance.get( URLs.getEmployees, ); _stateCode = response.statusCode; - if(response.statusCode >= 200 && response.statusCode < 300) { + if (response.statusCode >= 200 && response.statusCode < 300) { // client's request was successfully received List categoriesListJson = json.decode(response.body)["data"]; _items = categoriesListJson.map((type) => Lookup.fromJson(type)).toList(); @@ -61,13 +59,11 @@ class AssignedToProvider extends ChangeNotifier{ _loading = false; notifyListeners(); return response.statusCode; - } catch(error) { + } catch (error) { _loading = false; _stateCode = -1; notifyListeners(); return -1; } - } - -} \ No newline at end of file +} diff --git a/lib/controllers/providers/api/status_drop_down/employee/engineers_provider.dart b/lib/controllers/providers/api/status_drop_down/employee/engineers_provider.dart index af47a022..d6fe0011 100644 --- a/lib/controllers/providers/api/status_drop_down/employee/engineers_provider.dart +++ b/lib/controllers/providers/api/status_drop_down/employee/engineers_provider.dart @@ -9,10 +9,9 @@ import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; import 'package:http/http.dart'; -class EngineersProvider extends ChangeNotifier{ - +class EngineersProvider extends ChangeNotifier { //reset provider data - void reset(){ + void reset() { _items = null; _stateCode = null; } @@ -33,7 +32,7 @@ class EngineersProvider extends ChangeNotifier{ // failed _loading = false bool _loading; bool get isLoading => _loading; - set isLoading(bool isLoading){ + set isLoading(bool isLoading) { _loading = isLoading; notifyListeners(); } @@ -43,17 +42,17 @@ class EngineersProvider 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 getData ({String host,User user}) async { - if(_loading == true) return -2; + Future getData({String host, User user}) async { + if (_loading == true) return -2; _loading = true; notifyListeners(); Response response; - try{ + try { response = await ApiManager.instance.get( URLs.getEngineers, ); _stateCode = response.statusCode; - if(response.statusCode >= 200 && response.statusCode < 300) { + if (response.statusCode >= 200 && response.statusCode < 300) { // client's request was successfully received List categoriesListJson = json.decode(response.body); _items = categoriesListJson.map((type) => Engineer.fromJson(type)).toList(); @@ -61,13 +60,11 @@ class EngineersProvider extends ChangeNotifier{ _loading = false; notifyListeners(); return response.statusCode; - } catch(error) { + } catch (error) { _loading = false; _stateCode = -1; notifyListeners(); return -1; } - } - -} \ No newline at end of file +} diff --git a/lib/controllers/providers/api/status_drop_down/gas_refill/gas_cylinder_size_provider.dart b/lib/controllers/providers/api/status_drop_down/gas_refill/gas_cylinder_size_provider.dart index 7952a2f6..9ae44e96 100644 --- a/lib/controllers/providers/api/status_drop_down/gas_refill/gas_cylinder_size_provider.dart +++ b/lib/controllers/providers/api/status_drop_down/gas_refill/gas_cylinder_size_provider.dart @@ -8,10 +8,9 @@ import 'package:test_sa/controllers/api_routes/urls.dart'; import 'package:test_sa/models/lookup.dart'; import 'package:test_sa/models/user.dart'; -class GasCylinderSizesProvider extends ChangeNotifier{ - +class GasCylinderSizesProvider extends ChangeNotifier { //reset provider data - void reset(){ + void reset() { _items = null; _loading = null; _stateCode = null; @@ -33,7 +32,7 @@ class GasCylinderSizesProvider extends ChangeNotifier{ // failed _loading = false bool _loading; bool get isLoading => _loading; - set isLoading(bool isLoading){ + set isLoading(bool isLoading) { _loading = isLoading; notifyListeners(); } @@ -43,18 +42,20 @@ class GasCylinderSizesProvider 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 getData ({String host,User user,}) async { - if(_loading == true) - return -2; + Future getData({ + String host, + User user, + }) async { + if (_loading == true) return -2; _loading = true; notifyListeners(); Response response; - try{ + try { response = await ApiManager.instance.get( - URLs.getGasCylinderSize, + URLs.getGasCylinderSize, ); _stateCode = response.statusCode; - if(response.statusCode >= 200 && response.statusCode < 300) { + if (response.statusCode >= 200 && response.statusCode < 300) { // client's request was successfully received List categoriesListJson = json.decode(response.body)["data"]; _items = categoriesListJson.map((item) => Lookup.fromJson(item)).toList(); @@ -62,13 +63,11 @@ class GasCylinderSizesProvider extends ChangeNotifier{ _loading = false; notifyListeners(); return response.statusCode; - } catch(error) { + } catch (error) { _loading = false; _stateCode = -1; notifyListeners(); return -1; } - } - -} \ No newline at end of file +} diff --git a/lib/controllers/providers/api/status_drop_down/gas_refill/gas_cylinder_type_provider.dart b/lib/controllers/providers/api/status_drop_down/gas_refill/gas_cylinder_type_provider.dart index 370370c1..52e210c8 100644 --- a/lib/controllers/providers/api/status_drop_down/gas_refill/gas_cylinder_type_provider.dart +++ b/lib/controllers/providers/api/status_drop_down/gas_refill/gas_cylinder_type_provider.dart @@ -8,10 +8,9 @@ import 'package:test_sa/controllers/api_routes/urls.dart'; import 'package:test_sa/models/lookup.dart'; import 'package:test_sa/models/user.dart'; -class GasCylinderTypesProvider extends ChangeNotifier{ - +class GasCylinderTypesProvider extends ChangeNotifier { //reset provider data - void reset(){ + void reset() { _items = null; _loading = null; _stateCode = null; @@ -33,7 +32,7 @@ class GasCylinderTypesProvider extends ChangeNotifier{ // failed _loading = false bool _loading; bool get isLoading => _loading; - set isLoading(bool isLoading){ + set isLoading(bool isLoading) { _loading = isLoading; notifyListeners(); } @@ -43,18 +42,20 @@ class GasCylinderTypesProvider 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 getData ({String host,User user,}) async { - if(_loading == true) - return -2; + Future getData({ + String host, + User user, + }) async { + if (_loading == true) return -2; _loading = true; notifyListeners(); Response response; - try{ + try { response = await ApiManager.instance.get( - URLs.getGasCylinderType, + URLs.getGasCylinderType, ); _stateCode = response.statusCode; - if(response.statusCode >= 200 && response.statusCode < 300) { + if (response.statusCode >= 200 && response.statusCode < 300) { // client's request was successfully received List categoriesListJson = json.decode(response.body)["data"]; _items = categoriesListJson.map((item) => Lookup.fromJson(item)).toList(); @@ -62,13 +63,11 @@ class GasCylinderTypesProvider extends ChangeNotifier{ _loading = false; notifyListeners(); return response.statusCode; - } catch(error) { + } catch (error) { _loading = false; _stateCode = -1; notifyListeners(); return -1; } - } - -} \ No newline at end of file +} diff --git a/lib/controllers/providers/api/status_drop_down/gas_refill/gas_status_provider.dart b/lib/controllers/providers/api/status_drop_down/gas_refill/gas_status_provider.dart index dacc96d0..ce7332a7 100644 --- a/lib/controllers/providers/api/status_drop_down/gas_refill/gas_status_provider.dart +++ b/lib/controllers/providers/api/status_drop_down/gas_refill/gas_status_provider.dart @@ -11,10 +11,9 @@ import 'package:test_sa/controllers/api_routes/urls.dart'; import 'package:test_sa/models/lookup.dart'; import 'package:test_sa/models/user.dart'; -class GasStatusProvider extends ChangeNotifier{ - +class GasStatusProvider extends ChangeNotifier { //reset provider data - void reset(){ + void reset() { _items = null; _loading = null; _stateCode = null; @@ -36,7 +35,7 @@ class GasStatusProvider extends ChangeNotifier{ // failed _loading = false bool _loading; bool get isLoading => _loading; - set isLoading(bool isLoading){ + set isLoading(bool isLoading) { _loading = isLoading; notifyListeners(); } @@ -46,17 +45,20 @@ class GasStatusProvider 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 getData ({String host,User user,}) async { - if(_loading == true) return -2; + Future getData({ + String host, + User user, + }) async { + if (_loading == true) return -2; _loading = true; notifyListeners(); Response response; - try{ + try { response = await ApiManager.instance.get( URLs.getGasStatus, ); _stateCode = response.statusCode; - if(response.statusCode >= 200 && response.statusCode < 300) { + if (response.statusCode >= 200 && response.statusCode < 300) { // client's request was successfully received List categoriesListJson = json.decode(response.body)["data"]; _items = categoriesListJson.map((item) => Lookup.fromJson(item)).toList(); @@ -64,13 +66,11 @@ class GasStatusProvider extends ChangeNotifier{ _loading = false; notifyListeners(); return response.statusCode; - } catch(error) { + } catch (error) { _loading = false; _stateCode = -1; notifyListeners(); return -1; } - } - -} \ No newline at end of file +} diff --git a/lib/controllers/providers/api/status_drop_down/gas_refill/gas_types_provider.dart b/lib/controllers/providers/api/status_drop_down/gas_refill/gas_types_provider.dart index 78e206f0..e9b3836f 100644 --- a/lib/controllers/providers/api/status_drop_down/gas_refill/gas_types_provider.dart +++ b/lib/controllers/providers/api/status_drop_down/gas_refill/gas_types_provider.dart @@ -11,10 +11,9 @@ import 'package:test_sa/controllers/api_routes/urls.dart'; import 'package:test_sa/models/lookup.dart'; import 'package:test_sa/models/user.dart'; -class GasTypesProvider extends ChangeNotifier{ - +class GasTypesProvider extends ChangeNotifier { //reset provider data - void reset(){ + void reset() { _items = null; _loading = null; _stateCode = null; @@ -36,7 +35,7 @@ class GasTypesProvider extends ChangeNotifier{ // failed _loading = false bool _loading; bool get isLoading => _loading; - set isLoading(bool isLoading){ + set isLoading(bool isLoading) { _loading = isLoading; notifyListeners(); } @@ -46,17 +45,20 @@ class GasTypesProvider 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 getData ({String host,User user,}) async { - if(_loading == true) return -2; + Future getData({ + String host, + User user, + }) async { + if (_loading == true) return -2; _loading = true; notifyListeners(); Response response; - try{ + try { response = await ApiManager.instance.get( URLs.getGasTypes, ); _stateCode = response.statusCode; - if(response.statusCode >= 200 && response.statusCode < 300) { + if (response.statusCode >= 200 && response.statusCode < 300) { // client's request was successfully received List categoriesListJson = json.decode(response.body)["data"]; _items = categoriesListJson.map((item) => Lookup.fromJson(item)).toList(); @@ -64,13 +66,11 @@ class GasTypesProvider extends ChangeNotifier{ _loading = false; notifyListeners(); return response.statusCode; - } catch(error) { + } catch (error) { _loading = false; _stateCode = -1; notifyListeners(); return -1; } - } - -} \ No newline at end of file +} diff --git a/lib/controllers/providers/api/status_drop_down/pentry/pentry_status_provider.dart b/lib/controllers/providers/api/status_drop_down/pentry/pentry_status_provider.dart index 335aae1d..26afccf5 100644 --- a/lib/controllers/providers/api/status_drop_down/pentry/pentry_status_provider.dart +++ b/lib/controllers/providers/api/status_drop_down/pentry/pentry_status_provider.dart @@ -8,10 +8,9 @@ import 'package:test_sa/controllers/api_routes/urls.dart'; import 'package:test_sa/models/lookup.dart'; import 'package:test_sa/models/user.dart'; -class PentryStatusProvider extends ChangeNotifier{ - +class PentryStatusProvider extends ChangeNotifier { //reset provider data - void reset(){ + void reset() { _items = null; _stateCode = null; } @@ -32,7 +31,7 @@ class PentryStatusProvider extends ChangeNotifier{ // failed _loading = false bool _loading; bool get isLoading => _loading; - set isLoading(bool isLoading){ + set isLoading(bool isLoading) { _loading = isLoading; notifyListeners(); } @@ -42,19 +41,18 @@ class PentryStatusProvider 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 getData ({String host,User user}) async { - if(_loading == true) - return -2; + Future getData({String host, User user}) async { + if (_loading == true) return -2; _loading = true; notifyListeners(); Response response; - try{ + try { response = await ApiManager.instance.get( URLs.getPentryStatus, ); _stateCode = response.statusCode; - if(response.statusCode >= 200 && response.statusCode < 300) { + if (response.statusCode >= 200 && response.statusCode < 300) { // client's request was successfully received List listJson = json.decode(response.body)["data"]; _items = listJson.map((type) => Lookup.fromJson(type)).toList(); @@ -62,14 +60,11 @@ class PentryStatusProvider extends ChangeNotifier{ _loading = false; notifyListeners(); return response.statusCode; - } catch(error) { - + } catch (error) { _loading = false; _stateCode = -1; notifyListeners(); return -1; } - } - -} \ No newline at end of file +} diff --git a/lib/controllers/providers/api/status_drop_down/pentry/pentry_task_status_provider.dart b/lib/controllers/providers/api/status_drop_down/pentry/pentry_task_status_provider.dart index 5690aa83..b69c310a 100644 --- a/lib/controllers/providers/api/status_drop_down/pentry/pentry_task_status_provider.dart +++ b/lib/controllers/providers/api/status_drop_down/pentry/pentry_task_status_provider.dart @@ -8,10 +8,9 @@ import 'package:test_sa/controllers/api_routes/urls.dart'; import 'package:test_sa/models/lookup.dart'; import 'package:test_sa/models/user.dart'; -class PentryTaskStatusProvider extends ChangeNotifier{ - +class PentryTaskStatusProvider extends ChangeNotifier { //reset provider data - void reset(){ + void reset() { _items = null; _stateCode = null; } @@ -32,7 +31,7 @@ class PentryTaskStatusProvider extends ChangeNotifier{ // failed _loading = false bool _loading; bool get isLoading => _loading; - set isLoading(bool isLoading){ + set isLoading(bool isLoading) { _loading = isLoading; notifyListeners(); } @@ -42,19 +41,18 @@ class PentryTaskStatusProvider 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 getData ({String host,User user}) async { - if(_loading == true) - return -2; + Future getData({String host, User user}) async { + if (_loading == true) return -2; _loading = true; notifyListeners(); Response response; - try{ + try { response = await ApiManager.instance.get( URLs.getPentryTaskStatus, ); _stateCode = response.statusCode; - if(response.statusCode >= 200 && response.statusCode < 300) { + if (response.statusCode >= 200 && response.statusCode < 300) { // client's request was successfully received List categoriesListJson = json.decode(response.body)["data"]; _items = categoriesListJson.map((type) => Lookup.fromJson(type)).toList(); @@ -62,14 +60,11 @@ class PentryTaskStatusProvider extends ChangeNotifier{ _loading = false; notifyListeners(); return response.statusCode; - } catch(error) { - + } catch (error) { _loading = false; _stateCode = -1; notifyListeners(); return -1; } - } - -} \ No newline at end of file +} diff --git a/lib/controllers/providers/api/status_drop_down/pentry/pentry_visit_status_provider.dart b/lib/controllers/providers/api/status_drop_down/pentry/pentry_visit_status_provider.dart index f86f15b0..ab0f7d7c 100644 --- a/lib/controllers/providers/api/status_drop_down/pentry/pentry_visit_status_provider.dart +++ b/lib/controllers/providers/api/status_drop_down/pentry/pentry_visit_status_provider.dart @@ -8,10 +8,9 @@ import 'package:test_sa/controllers/api_routes/urls.dart'; import 'package:test_sa/models/lookup.dart'; import 'package:test_sa/models/user.dart'; -class PentryVisitStatusProvider extends ChangeNotifier{ - +class PentryVisitStatusProvider extends ChangeNotifier { //reset provider data - void reset(){ + void reset() { _items = null; _stateCode = null; } @@ -32,7 +31,7 @@ class PentryVisitStatusProvider extends ChangeNotifier{ // failed _loading = false bool _loading; bool get isLoading => _loading; - set isLoading(bool isLoading){ + set isLoading(bool isLoading) { _loading = isLoading; notifyListeners(); } @@ -42,19 +41,18 @@ class PentryVisitStatusProvider 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 getData ({String host,User user}) async { - if(_loading == true) - return -2; + Future getData({String host, User user}) async { + if (_loading == true) return -2; _loading = true; notifyListeners(); Response response; - try{ + try { response = await ApiManager.instance.get( URLs.getPentryVisitStatus, ); _stateCode = response.statusCode; - if(response.statusCode >= 200 && response.statusCode < 300) { + if (response.statusCode >= 200 && response.statusCode < 300) { // client's request was successfully received List listJson = json.decode(response.body)["data"]; _items = listJson.map((type) => Lookup.fromJson(type)).toList(); @@ -62,13 +60,11 @@ class PentryVisitStatusProvider extends ChangeNotifier{ _loading = false; notifyListeners(); return response.statusCode; - } catch(error) { + } catch (error) { _loading = false; _stateCode = -1; notifyListeners(); return -1; } - } - -} \ No newline at end of file +} diff --git a/lib/controllers/providers/api/status_drop_down/report/service_report_defect_types_provider.dart b/lib/controllers/providers/api/status_drop_down/report/service_report_defect_types_provider.dart index 775dd106..2c348e02 100644 --- a/lib/controllers/providers/api/status_drop_down/report/service_report_defect_types_provider.dart +++ b/lib/controllers/providers/api/status_drop_down/report/service_report_defect_types_provider.dart @@ -8,10 +8,9 @@ import 'package:test_sa/controllers/api_routes/urls.dart'; import 'package:test_sa/models/lookup.dart'; import 'package:test_sa/models/user.dart'; -class ServiceRequestDefectTypesProvider extends ChangeNotifier{ - +class ServiceRequestDefectTypesProvider extends ChangeNotifier { //reset provider data - void reset(){ + void reset() { _items = null; _stateCode = null; } @@ -32,7 +31,7 @@ class ServiceRequestDefectTypesProvider extends ChangeNotifier{ // failed _loading = false bool _loading; bool get isLoading => _loading; - set isLoading(bool isLoading){ + set isLoading(bool isLoading) { _loading = isLoading; notifyListeners(); } @@ -42,18 +41,17 @@ class ServiceRequestDefectTypesProvider 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 getData ({String host,User user}) async { - if(_loading == true) - return -2; + Future getData({String host, User user}) async { + if (_loading == true) return -2; _loading = true; notifyListeners(); Response response; - try{ + try { response = await ApiManager.instance.get( URLs.getServiceReportDefectTypes, ); _stateCode = response.statusCode; - if(response.statusCode >= 200 && response.statusCode < 300) { + if (response.statusCode >= 200 && response.statusCode < 300) { // client's request was successfully received List listJson = json.decode(response.body)["data"]; _items = listJson.map((type) => Lookup.fromJson(type)).toList(); @@ -61,14 +59,11 @@ class ServiceRequestDefectTypesProvider extends ChangeNotifier{ _loading = false; notifyListeners(); return response.statusCode; - } catch(error) { - + } catch (error) { _loading = false; _stateCode = -1; notifyListeners(); return -1; } - } - -} \ No newline at end of file +} diff --git a/lib/controllers/providers/api/status_drop_down/report/service_report_last_calls_provider.dart b/lib/controllers/providers/api/status_drop_down/report/service_report_last_calls_provider.dart index 59fc821a..9dc17ab0 100644 --- a/lib/controllers/providers/api/status_drop_down/report/service_report_last_calls_provider.dart +++ b/lib/controllers/providers/api/status_drop_down/report/service_report_last_calls_provider.dart @@ -8,10 +8,9 @@ import 'package:test_sa/controllers/api_routes/urls.dart'; import 'package:test_sa/models/lookup.dart'; import 'package:test_sa/models/user.dart'; -class ServiceReportLastCallsProvider extends ChangeNotifier{ - +class ServiceReportLastCallsProvider extends ChangeNotifier { //reset provider data - void reset(){ + void reset() { _calls = null; _loading = null; _stateCode = null; @@ -33,7 +32,7 @@ class ServiceReportLastCallsProvider extends ChangeNotifier{ // failed _loading = false bool _loading; bool get isLoading => _loading; - set isLoading(bool isLoading){ + set isLoading(bool isLoading) { _loading = isLoading; notifyListeners(); } @@ -43,13 +42,12 @@ class ServiceReportLastCallsProvider 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 getCalls ({String host,User user,int serviceStatus}) async { - if(_loading == true) - return -2; + Future getCalls({String host, User user, int serviceStatus}) async { + if (_loading == true) return -2; _loading = true; notifyListeners(); Response response; - try{ + try { // todo request new api from backend to make filter work response = await ApiManager.instance.get( URLs.getServiceReportLastCalls, @@ -61,7 +59,7 @@ class ServiceReportLastCallsProvider extends ChangeNotifier{ // ), // ); _stateCode = response.statusCode; - if(response.statusCode >= 200 && response.statusCode < 300) { + if (response.statusCode >= 200 && response.statusCode < 300) { // client's request was successfully received List categoriesListJson = json.decode(response.body)["data"]; _calls = categoriesListJson.map((type) => Lookup.fromJson(type)).toList(); @@ -69,13 +67,11 @@ class ServiceReportLastCallsProvider extends ChangeNotifier{ _loading = false; notifyListeners(); return response.statusCode; - } catch(error) { + } catch (error) { _loading = false; _stateCode = -1; notifyListeners(); return -1; } - } - -} \ No newline at end of file +} diff --git a/lib/controllers/providers/api/status_drop_down/report/service_report_priority_provider.dart b/lib/controllers/providers/api/status_drop_down/report/service_report_priority_provider.dart index d25644c9..c9160a1f 100644 --- a/lib/controllers/providers/api/status_drop_down/report/service_report_priority_provider.dart +++ b/lib/controllers/providers/api/status_drop_down/report/service_report_priority_provider.dart @@ -8,10 +8,9 @@ import 'package:test_sa/controllers/api_routes/urls.dart'; import 'package:test_sa/models/lookup.dart'; import 'package:test_sa/models/user.dart'; -class ServiceRequestPriorityProvider extends ChangeNotifier{ - +class ServiceRequestPriorityProvider extends ChangeNotifier { //reset provider data - void reset(){ + void reset() { _items = null; _stateCode = null; } @@ -32,7 +31,7 @@ class ServiceRequestPriorityProvider extends ChangeNotifier{ // failed _loading = false bool _loading; bool get isLoading => _loading; - set isLoading(bool isLoading){ + set isLoading(bool isLoading) { _loading = isLoading; notifyListeners(); } @@ -42,19 +41,18 @@ class ServiceRequestPriorityProvider 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 getData ({String host,User user}) async { - if(_loading == true) - return -2; + Future getData({String host, User user}) async { + if (_loading == true) return -2; _loading = true; notifyListeners(); Response response; - try{ + try { response = await ApiManager.instance.get( URLs.getServiceReportPriority, ); _stateCode = response.statusCode; - if(response.statusCode >= 200 && response.statusCode < 300) { + if (response.statusCode >= 200 && response.statusCode < 300) { // client's request was successfully received List listJson = json.decode(response.body)["data"]; _items = listJson.map((type) => Lookup.fromJson(type)).toList(); @@ -62,13 +60,11 @@ class ServiceRequestPriorityProvider extends ChangeNotifier{ _loading = false; notifyListeners(); return response.statusCode; - } catch(error) { + } catch (error) { _loading = false; _stateCode = -1; notifyListeners(); return -1; } - } - -} \ No newline at end of file +} diff --git a/lib/controllers/providers/api/status_drop_down/report/service_report_reasons_provider.dart b/lib/controllers/providers/api/status_drop_down/report/service_report_reasons_provider.dart index 6a4808f2..e2f686c9 100644 --- a/lib/controllers/providers/api/status_drop_down/report/service_report_reasons_provider.dart +++ b/lib/controllers/providers/api/status_drop_down/report/service_report_reasons_provider.dart @@ -8,10 +8,9 @@ import 'package:test_sa/controllers/api_routes/urls.dart'; import 'package:test_sa/models/lookup.dart'; import 'package:test_sa/models/user.dart'; -class ServiceReportReasonsProvider extends ChangeNotifier{ - +class ServiceReportReasonsProvider extends ChangeNotifier { //reset provider data - void reset(){ + void reset() { _reasons = null; _stateCode = null; } @@ -32,7 +31,7 @@ class ServiceReportReasonsProvider extends ChangeNotifier{ // failed _loading = false bool _loading; bool get isLoading => _loading; - set isLoading(bool isLoading){ + set isLoading(bool isLoading) { _loading = isLoading; notifyListeners(); } @@ -42,18 +41,17 @@ class ServiceReportReasonsProvider 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 getTypes ({String host,User user}) async { - if(_loading == true) - return -2; + Future getTypes({String host, User user}) async { + if (_loading == true) return -2; _loading = true; notifyListeners(); Response response; - try{ + try { response = await ApiManager.instance.get( URLs.getServiceReportReasons, ); _stateCode = response.statusCode; - if(response.statusCode >= 200 && response.statusCode < 300) { + if (response.statusCode >= 200 && response.statusCode < 300) { // client's request was successfully received List categoriesListJson = json.decode(response.body)["data"]; _reasons = categoriesListJson.map((type) => Lookup.fromJson(type)).toList(); @@ -61,13 +59,11 @@ class ServiceReportReasonsProvider extends ChangeNotifier{ _loading = false; notifyListeners(); return response.statusCode; - } catch(error) { + } catch (error) { _loading = false; _stateCode = -1; notifyListeners(); return -1; } - } - -} \ No newline at end of file +} diff --git a/lib/controllers/providers/api/status_drop_down/report/service_report_status_provider.dart b/lib/controllers/providers/api/status_drop_down/report/service_report_status_provider.dart index a05aa23a..fed9a24f 100644 --- a/lib/controllers/providers/api/status_drop_down/report/service_report_status_provider.dart +++ b/lib/controllers/providers/api/status_drop_down/report/service_report_status_provider.dart @@ -11,10 +11,9 @@ import 'package:test_sa/controllers/api_routes/urls.dart'; import 'package:test_sa/models/lookup.dart'; import 'package:test_sa/models/user.dart'; -class ServiceReportStatusProvider extends ChangeNotifier{ - +class ServiceReportStatusProvider extends ChangeNotifier { //reset provider data - void reset(){ + void reset() { _status = null; _stateCode = null; } @@ -35,7 +34,7 @@ class ServiceReportStatusProvider extends ChangeNotifier{ // failed _loading = false bool _loading; bool get isLoading => _loading; - set isLoading(bool isLoading){ + set isLoading(bool isLoading) { _loading = isLoading; notifyListeners(); } @@ -45,19 +44,18 @@ class ServiceReportStatusProvider 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 getTypes ({String host,User user}) async { - if(_loading == true) - return -2; + Future getTypes({String host, User user}) async { + if (_loading == true) return -2; _loading = true; notifyListeners(); Response response; - try{ + try { response = await ApiManager.instance.get( URLs.getServiceReportStatus, ); _stateCode = response.statusCode; - if(response.statusCode >= 200 && response.statusCode < 300) { + if (response.statusCode >= 200 && response.statusCode < 300) { // client's request was successfully received List categoriesListJson = json.decode(response.body)["data"]; _status = categoriesListJson.map((type) => Lookup.fromJson(type)).toList(); @@ -65,14 +63,11 @@ class ServiceReportStatusProvider extends ChangeNotifier{ _loading = false; notifyListeners(); return response.statusCode; - } catch(error) { - + } catch (error) { _loading = false; _stateCode = -1; notifyListeners(); return -1; } - } - -} \ No newline at end of file +} diff --git a/lib/controllers/providers/api/status_drop_down/report/service_report_types_provider.dart b/lib/controllers/providers/api/status_drop_down/report/service_report_types_provider.dart index 084daf1c..ced86e89 100644 --- a/lib/controllers/providers/api/status_drop_down/report/service_report_types_provider.dart +++ b/lib/controllers/providers/api/status_drop_down/report/service_report_types_provider.dart @@ -8,10 +8,9 @@ import 'package:test_sa/controllers/api_routes/urls.dart'; import 'package:test_sa/models/lookup.dart'; import 'package:test_sa/models/user.dart'; -class ServiceReportTypesProvider extends ChangeNotifier{ - +class ServiceReportTypesProvider extends ChangeNotifier { //reset provider data - void reset(){ + void reset() { _types = null; _stateCode = null; } @@ -32,7 +31,7 @@ class ServiceReportTypesProvider extends ChangeNotifier{ // failed _loading = false bool _loading; bool get isLoading => _loading; - set isLoading(bool isLoading){ + set isLoading(bool isLoading) { _loading = isLoading; notifyListeners(); } @@ -42,18 +41,17 @@ class ServiceReportTypesProvider 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 getTypes ({String host,User user}) async { - if(_loading == true) - return -2; + Future getTypes({String host, User user}) async { + if (_loading == true) return -2; _loading = true; notifyListeners(); Response response; - try{ + try { response = await ApiManager.instance.get( URLs.getServiceReportTypes, ); _stateCode = response.statusCode; - if(response.statusCode >= 200 && response.statusCode < 300) { + if (response.statusCode >= 200 && response.statusCode < 300) { // client's request was successfully received List categoriesListJson = json.decode(response.body)["data"]; _types = categoriesListJson.map((type) => Lookup.fromJson(type)).toList(); @@ -61,13 +59,11 @@ class ServiceReportTypesProvider extends ChangeNotifier{ _loading = false; notifyListeners(); return response.statusCode; - } catch(error) { + } catch (error) { _loading = false; _stateCode = -1; notifyListeners(); return -1; } - } - -} \ No newline at end of file +} diff --git a/lib/controllers/providers/api/status_drop_down/report/service_types_provider.dart b/lib/controllers/providers/api/status_drop_down/report/service_types_provider.dart index 48da78f4..c28e425e 100644 --- a/lib/controllers/providers/api/status_drop_down/report/service_types_provider.dart +++ b/lib/controllers/providers/api/status_drop_down/report/service_types_provider.dart @@ -8,10 +8,9 @@ import 'package:test_sa/controllers/api_routes/urls.dart'; import 'package:test_sa/models/lookup.dart'; import 'package:test_sa/models/user.dart'; -class ServiceStatusProvider extends ChangeNotifier{ - +class ServiceStatusProvider extends ChangeNotifier { //reset provider data - void reset(){ + void reset() { _statuses = null; _stateCode = null; } @@ -32,7 +31,7 @@ class ServiceStatusProvider extends ChangeNotifier{ // failed _loading = false bool _loading; bool get isLoading => _loading; - set isLoading(bool isLoading){ + set isLoading(bool isLoading) { _loading = isLoading; notifyListeners(); } @@ -42,33 +41,29 @@ class ServiceStatusProvider 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 getTypes ({String host,User user}) async { - if(_loading == true) - return -2; + Future getTypes({String host, User user}) async { + if (_loading == true) return -2; _loading = true; notifyListeners(); Response response; - try{ + try { response = await ApiManager.instance.get( URLs.getAssetTypes, ); _stateCode = response.statusCode; - if(response.statusCode >= 200 && response.statusCode < 300) { + if (response.statusCode >= 200 && response.statusCode < 300) { // client's request was successfully received List categoriesListJson = json.decode(response.body)["data"]; _statuses = categoriesListJson.map((e) => Lookup.fromJson(e)).toList(); - } _loading = false; notifyListeners(); return response.statusCode; - } catch(error) { + } catch (error) { _loading = false; _stateCode = -1; notifyListeners(); return -1; } - } - -} \ No newline at end of file +} diff --git a/lib/controllers/providers/api/status_drop_down/service_reqest/service_request_status_provider.dart b/lib/controllers/providers/api/status_drop_down/service_reqest/service_request_status_provider.dart index 91b7d4ca..27de1513 100644 --- a/lib/controllers/providers/api/status_drop_down/service_reqest/service_request_status_provider.dart +++ b/lib/controllers/providers/api/status_drop_down/service_reqest/service_request_status_provider.dart @@ -8,10 +8,9 @@ import 'package:test_sa/controllers/api_routes/urls.dart'; import 'package:test_sa/models/lookup.dart'; import 'package:test_sa/models/user.dart'; -class ServiceRequestStatusProvider extends ChangeNotifier{ - +class ServiceRequestStatusProvider extends ChangeNotifier { //reset provider data - void reset(){ + void reset() { _statuses = null; _stateCode = null; } @@ -32,7 +31,7 @@ class ServiceRequestStatusProvider extends ChangeNotifier{ // failed _loading = false bool _loading; bool get isLoading => _loading; - set isLoading(bool isLoading){ + set isLoading(bool isLoading) { _loading = isLoading; notifyListeners(); } @@ -42,33 +41,29 @@ class ServiceRequestStatusProvider 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 getData ({String host,User user}) async { - if(_loading == true) - return -2; + Future getData({String host, User user}) async { + if (_loading == true) return -2; _loading = true; notifyListeners(); Response response; - try{ + try { response = await ApiManager.instance.get( URLs.getServiceRequestStatus, ); _stateCode = response.statusCode; - if(response.statusCode >= 200 && response.statusCode < 300) { + if (response.statusCode >= 200 && response.statusCode < 300) { // client's request was successfully received List categoriesListJson = json.decode(response.body)["data"]; _statuses = categoriesListJson.map((e) => Lookup.fromJson(e)).toList(); - } _loading = false; notifyListeners(); return response.statusCode; - } catch(error) { + } catch (error) { _loading = false; _stateCode = -1; notifyListeners(); return -1; } - } - -} \ No newline at end of file +} diff --git a/lib/controllers/providers/api/status_drop_down/service_reqest/service_request_through_provider.dart b/lib/controllers/providers/api/status_drop_down/service_reqest/service_request_through_provider.dart index ec2e6720..cfc49f74 100644 --- a/lib/controllers/providers/api/status_drop_down/service_reqest/service_request_through_provider.dart +++ b/lib/controllers/providers/api/status_drop_down/service_reqest/service_request_through_provider.dart @@ -8,10 +8,9 @@ import 'package:test_sa/controllers/api_routes/urls.dart'; import 'package:test_sa/models/lookup.dart'; import 'package:test_sa/models/user.dart'; -class ServiceRequestedThroughProvider extends ChangeNotifier{ - +class ServiceRequestedThroughProvider extends ChangeNotifier { //reset provider data - void reset(){ + void reset() { _statuses = null; _stateCode = null; } @@ -32,7 +31,7 @@ class ServiceRequestedThroughProvider extends ChangeNotifier{ // failed _loading = false bool _loading; bool get isLoading => _loading; - set isLoading(bool isLoading){ + set isLoading(bool isLoading) { _loading = isLoading; notifyListeners(); } @@ -42,33 +41,29 @@ class ServiceRequestedThroughProvider 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 getData ({String host,User user}) async { - if(_loading == true) - return -2; + Future getData({String host, User user}) async { + if (_loading == true) return -2; _loading = true; notifyListeners(); Response response; - try{ + try { response = await ApiManager.instance.get( URLs.getServiceRequestThrough, ); _stateCode = response.statusCode; - if(response.statusCode >= 200 && response.statusCode < 300) { + if (response.statusCode >= 200 && response.statusCode < 300) { // client's request was successfully received List categoriesListJson = json.decode(response.body)["data"]; _statuses = categoriesListJson.map((e) => Lookup.fromJson(e)).toList(); - } _loading = false; notifyListeners(); return response.statusCode; - } catch(error) { + } catch (error) { _loading = false; _stateCode = -1; notifyListeners(); return -1; } - } - -} \ No newline at end of file +} diff --git a/lib/controllers/providers/api/status_drop_down/service_reqest/service_request_type_provider.dart b/lib/controllers/providers/api/status_drop_down/service_reqest/service_request_type_provider.dart index 76e6c7c4..a0c6cad2 100644 --- a/lib/controllers/providers/api/status_drop_down/service_reqest/service_request_type_provider.dart +++ b/lib/controllers/providers/api/status_drop_down/service_reqest/service_request_type_provider.dart @@ -8,10 +8,9 @@ import 'package:test_sa/controllers/api_routes/urls.dart'; import 'package:test_sa/models/lookup.dart'; import 'package:test_sa/models/user.dart'; -class ServiceRequestTypeProvider extends ChangeNotifier{ - +class ServiceRequestTypeProvider extends ChangeNotifier { //reset provider data - void reset(){ + void reset() { _statuses = null; _stateCode = null; } @@ -32,7 +31,7 @@ class ServiceRequestTypeProvider extends ChangeNotifier{ // failed _loading = false bool _loading; bool get isLoading => _loading; - set isLoading(bool isLoading){ + set isLoading(bool isLoading) { _loading = isLoading; notifyListeners(); } @@ -42,33 +41,29 @@ class ServiceRequestTypeProvider 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 getData ({String host,User user}) async { - if(_loading == true) - return -2; + Future getData({String host, User user}) async { + if (_loading == true) return -2; _loading = true; notifyListeners(); Response response; - try{ + try { response = await ApiManager.instance.get( URLs.getServiceRequestTypes, ); _stateCode = response.statusCode; - if(response.statusCode >= 200 && response.statusCode < 300) { + if (response.statusCode >= 200 && response.statusCode < 300) { // client's request was successfully received List categoriesListJson = json.decode(response.body)["data"]; _statuses = categoriesListJson.map((e) => Lookup.fromJson(e)).toList(); - } _loading = false; notifyListeners(); return response.statusCode; - } catch(error) { + } catch (error) { _loading = false; _stateCode = -1; notifyListeners(); return -1; } - } - -} \ No newline at end of file +} diff --git a/lib/controllers/providers/settings/app_settings.dart b/lib/controllers/providers/settings/app_settings.dart index 2d09c2a1..65824cc7 100644 --- a/lib/controllers/providers/settings/app_settings.dart +++ b/lib/controllers/providers/settings/app_settings.dart @@ -3,4 +3,4 @@ class ASettings { static final String host = "host"; static final String language = "language"; static final String speechToText = "speech_to_text"; -} \ No newline at end of file +} diff --git a/lib/controllers/providers/settings/setting_provider.dart b/lib/controllers/providers/settings/setting_provider.dart index 118b24c1..0e8db564 100644 --- a/lib/controllers/providers/settings/setting_provider.dart +++ b/lib/controllers/providers/settings/setting_provider.dart @@ -7,9 +7,7 @@ import 'package:flutter/foundation.dart'; import 'package:shared_preferences/shared_preferences.dart'; import '../settings/app_settings.dart'; - -class SettingProvider extends ChangeNotifier{ - +class SettingProvider extends ChangeNotifier { resetSettings() async { SharedPreferences prefs = await SharedPreferences.getInstance(); user = null; @@ -58,40 +56,38 @@ class SettingProvider extends ChangeNotifier{ } // call loadSharedPreferences when provider initialise - SettingProvider(){ + SettingProvider() { loadSharedPreferences(); } // get app setting Future loadSharedPreferences() async { - SharedPreferences prefs = await SharedPreferences.getInstance(); - if(prefs.containsKey(ASettings.language)){ + if (prefs.containsKey(ASettings.language)) { _language = prefs.getString(ASettings.language); - }else{ - _language = 'en'; + } else { + _language = 'en'; } - if(prefs.containsKey(ASettings.speechToText)){ + if (prefs.containsKey(ASettings.speechToText)) { _speechToText = prefs.getString(ASettings.speechToText); - }else{ - _speechToText = 'ar'; + } else { + _speechToText = 'ar'; } - if(prefs.containsKey(ASettings.user)){ + if (prefs.containsKey(ASettings.user)) { String userJson = prefs.getString(ASettings.user); user = User.fromJson(json.decode(userJson)); } - if(prefs.containsKey(ASettings.host)){ + if (prefs.containsKey(ASettings.host)) { _host = prefs.getString(ASettings.host); - } else{ + } else { _host = URLs.host1; } isLoaded = true; notifyListeners(); } - -} \ No newline at end of file +} diff --git a/lib/controllers/validator/validator.dart b/lib/controllers/validator/validator.dart index 0eb09e9c..bb84dfca 100644 --- a/lib/controllers/validator/validator.dart +++ b/lib/controllers/validator/validator.dart @@ -1,24 +1,22 @@ -class Validator{ +class Validator { // private constructor to avoid create class object Validator._(); // check if string not empty and has value - static bool hasValue(String string){ - if (string == null || string.isEmpty) - return false; + static bool hasValue(String string) { + if (string == null || string.isEmpty) return false; return true; } // Return true if email is valid. Otherwise, return false - static bool isEmail(String email){ + static bool isEmail(String email) { RegExp exp = new RegExp(r"^[a-zA-Z0-9.a-zA-Z0-9.!#$%&'*+-/=?^_`{|}~]+@[a-zA-Z0-9]+\.[a-zA-Z]+"); - if(exp.hasMatch(email)) - return true; + if (exp.hasMatch(email)) return true; return false; } // Return true if phone number is valid. Otherwise, return false - static bool isPhoneNumber(String phoneNumber){ + static bool isPhoneNumber(String phoneNumber) { if (phoneNumber == null || phoneNumber.isEmpty) { return false; } @@ -26,17 +24,14 @@ class Validator{ final pattern = r'^[+]*[(]{0,1}[0-9]{1,4}[)]{0,1}[-\s\./0-9]*$'; final regExp = RegExp(pattern); - if (regExp.hasMatch(phoneNumber)) - return true; + if (regExp.hasMatch(phoneNumber)) return true; return false; } // Return true if password is valid. Otherwise, return false - static bool isValidPassword(String password){ - if(password == null) - return false; - if(password.length <6) - return false; + static bool isValidPassword(String password) { + if (password == null) return false; + if (password.length < 6) return false; return true; } @@ -55,4 +50,4 @@ class Validator{ } return int.tryParse(value) != null; } -} \ No newline at end of file +} diff --git a/lib/main.dart b/lib/main.dart index 26805518..3939c2d3 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -65,17 +65,16 @@ void main() async { WidgetsFlutterBinding.ensureInitialized(); if (Platform.isIOS) { await Firebase.initializeApp( - options: const FirebaseOptions(apiKey: "AIzaSyACQkSleNwU1jzEKR5ho1uSfZERokwwAbc", appId: "1:973582662416:ios:bc4a8061444c6a08fbc395", messagingSenderId: "973582662416", projectId: "atoms-fb912"), + options: + const FirebaseOptions(apiKey: "AIzaSyACQkSleNwU1jzEKR5ho1uSfZERokwwAbc", appId: "1:973582662416:ios:bc4a8061444c6a08fbc395", messagingSenderId: "973582662416", projectId: "atoms-fb912"), ); } else { await Firebase.initializeApp(); } - runApp( - ChangeNotifierProvider( - create: (_) => SettingProvider(), - child: MyApp(), - ) - ); + runApp(ChangeNotifierProvider( + create: (_) => SettingProvider(), + child: MyApp(), + )); } class MyApp extends StatelessWidget { @@ -127,18 +126,12 @@ class MyApp extends StatelessWidget { title: 'ATOMS', debugShowCheckedModeBanner: false, theme: ThemeData( - fontFamily: "Poppins", - //canvasColor: AColors.primaryColor, - scaffoldBackgroundColor: AColors.scaffoldBackgroundColor, - primaryColor: AColors.primaryColor, - indicatorColor: AColors.primaryColor, - colorScheme: const ColorScheme.light( - primary: AColors.primaryColor, - onPrimary: Colors.white, - secondary: AColors.secondaryColor, - onSecondary: Colors.white - ) - ), + fontFamily: "Poppins", + //canvasColor: AColors.primaryColor, + scaffoldBackgroundColor: AColors.scaffoldBackgroundColor, + primaryColor: AColors.primaryColor, + indicatorColor: AColors.primaryColor, + colorScheme: const ColorScheme.light(primary: AColors.primaryColor, onPrimary: Colors.white, secondary: AColors.secondaryColor, onSecondary: Colors.white)), localizationsDelegates: const [ // ... app-specific localization delegate[s] here AppLocalization.delegate, @@ -153,31 +146,28 @@ class MyApp extends StatelessWidget { locale: Locale(_settingProvider.language ?? 'en'), initialRoute: SplashScreen.id, routes: { - SplashScreen.id: (_)=> const SplashScreen(), - LandPage.id: (_)=> const LandPage(), - Login.id: (_)=> Login(), - Register.id: (_)=> Register(), - ProfilePage.id: (_)=> ProfilePage(), - ReportIssuesPage.id: (_)=> const ReportIssuesPage(), - RequestGasRefill.id: (_)=> const RequestGasRefill(), - CreateRequestPage.id: (_)=> CreateRequestPage(), - SingleHospitalPicker.id: (_)=> SingleHospitalPicker(), - SingleDevicePicker.id: (_)=> SingleDevicePicker(), - SingleDepartmentPicker.id: (_)=> SingleDepartmentPicker(), - ServiceRequestsPage.id: (_)=> ServiceRequestsPage(), - NotificationsPage.id: (_)=> NotificationsPage(), - FutureRequestServiceDetails.id: (_)=> FutureRequestServiceDetails(), - PreventiveMaintenanceVisitsPage.id: (_)=> PreventiveMaintenanceVisitsPage(), - RegularVisitsPage.id: (_)=> RegularVisitsPage(), - TrackGasRefillPage.id: (_)=> const TrackGasRefillPage(), - RequestDeviceTransfer.id: (_)=> const RequestDeviceTransfer(), - TrackDeviceTransferPage.id: (_)=> const TrackDeviceTransferPage(), + SplashScreen.id: (_) => const SplashScreen(), + LandPage.id: (_) => const LandPage(), + Login.id: (_) => Login(), + Register.id: (_) => Register(), + ProfilePage.id: (_) => ProfilePage(), + ReportIssuesPage.id: (_) => const ReportIssuesPage(), + RequestGasRefill.id: (_) => const RequestGasRefill(), + CreateRequestPage.id: (_) => CreateRequestPage(), + SingleHospitalPicker.id: (_) => SingleHospitalPicker(), + SingleDevicePicker.id: (_) => SingleDevicePicker(), + SingleDepartmentPicker.id: (_) => SingleDepartmentPicker(), + ServiceRequestsPage.id: (_) => ServiceRequestsPage(), + NotificationsPage.id: (_) => NotificationsPage(), + FutureRequestServiceDetails.id: (_) => FutureRequestServiceDetails(), + PreventiveMaintenanceVisitsPage.id: (_) => PreventiveMaintenanceVisitsPage(), + RegularVisitsPage.id: (_) => RegularVisitsPage(), + TrackGasRefillPage.id: (_) => const TrackGasRefillPage(), + RequestDeviceTransfer.id: (_) => const RequestDeviceTransfer(), + TrackDeviceTransferPage.id: (_) => const TrackDeviceTransferPage(), }, ), ), ); } } - - - diff --git a/lib/models/app_notification.dart b/lib/models/app_notification.dart index d199a07e..339e3121 100644 --- a/lib/models/app_notification.dart +++ b/lib/models/app_notification.dart @@ -1,6 +1,6 @@ import 'package:test_sa/views/pages/user/requests/future_request_service_details.dart'; -class AppNotification{ +class AppNotification { String requestId; String title; String description; @@ -15,13 +15,12 @@ class AppNotification{ this.path, }); - factory AppNotification.fromJson(Map parsedJson){ + factory AppNotification.fromJson(Map parsedJson) { return AppNotification( - requestId: parsedJson["nid"], - title: parsedJson["call_client"] ?? parsedJson["title"], - description: parsedJson["task_description"], - date: parsedJson["creation_date"], - path: FutureRequestServiceDetails.id - ); + requestId: parsedJson["nid"], + title: parsedJson["call_client"] ?? parsedJson["title"], + description: parsedJson["task_description"], + date: parsedJson["creation_date"], + path: FutureRequestServiceDetails.id); } -} \ No newline at end of file +} diff --git a/lib/models/department.dart b/lib/models/department.dart index 4dfe4cd0..36b744a5 100644 --- a/lib/models/department.dart +++ b/lib/models/department.dart @@ -1,4 +1,4 @@ -class Department{ +class Department { int id; String name; @@ -7,16 +7,16 @@ class Department{ this.name, }); - factory Department.fromJson(Map parsedJson){ + factory Department.fromJson(Map parsedJson) { return Department( id: parsedJson["id"], name: parsedJson["name"], ); } - factory Department.fromDepartment(Department department){ + factory Department.fromDepartment(Department department) { return Department( id: department?.id, name: department?.name, ); } -} \ No newline at end of file +} diff --git a/lib/models/device/device_transfer.dart b/lib/models/device/device_transfer.dart index d76728bf..acda1187 100644 --- a/lib/models/device/device_transfer.dart +++ b/lib/models/device/device_transfer.dart @@ -5,7 +5,7 @@ import 'package:test_sa/models/device/device_transfer_info.dart'; import 'package:test_sa/models/hospital.dart'; import 'package:test_sa/models/lookup.dart'; -class DeviceTransfer{ +class DeviceTransfer { int id; String userId; String title; @@ -22,12 +22,12 @@ class DeviceTransfer{ this.receiver, }); - bool validate(){ - if(device == null) return false; + bool validate() { + if (device == null) return false; return receiver.validate(); } - fromDeviceTransfer(DeviceTransfer old){ + fromDeviceTransfer(DeviceTransfer old) { id = old.id; title = old.title; userId = old.userId; @@ -40,7 +40,7 @@ class DeviceTransfer{ this.receiver = receiver; } - factory DeviceTransfer.fromJson(Map parsedJson){ + factory DeviceTransfer.fromJson(Map parsedJson) { return DeviceTransfer( id: parsedJson["id"], title: parsedJson["transferCode"], @@ -56,16 +56,13 @@ class DeviceTransfer{ workingHours: parsedJson["senderWorkingHours"], userId: parsedJson["senderAssignedEmployeeId"], userName: parsedJson["senderAssignedEmployeeName"], - client: Hospital( - id: parsedJson["senderSiteId"], - name: parsedJson["senderSiteName"] - ), + client: Hospital(id: parsedJson["senderSiteId"], name: parsedJson["senderSiteName"]), department: Department( id: parsedJson["senderDepartmentId"], name: parsedJson["senderDepartmentName"], ), // todo add segnature - signature: URLs.getFileUrl(parsedJson["senderAttachmentName"]), + signature: URLs.getFileUrl(parsedJson["senderAttachmentName"]), status: Lookup( id: parsedJson["senderMachineStatusId"], name: parsedJson["senderMachineStatusName"], @@ -77,10 +74,7 @@ class DeviceTransfer{ workingHours: parsedJson["receiverWorkingHours"], userId: parsedJson["receiverAssignedEmployeeId"], userName: parsedJson["receiverAssignedEmployeeName"], - client: Hospital( - id: parsedJson["destSiteId"], - name: parsedJson["destSiteName"] - ), + client: Hospital(id: parsedJson["destSiteId"], name: parsedJson["destSiteName"]), department: Department( id: parsedJson["destDepartmentId"], name: parsedJson["destDepartmentName"], @@ -95,4 +89,3 @@ class DeviceTransfer{ ); } } - diff --git a/lib/models/device/device_transfer_info.dart b/lib/models/device/device_transfer_info.dart index 31cae58f..ca20907e 100644 --- a/lib/models/device/device_transfer_info.dart +++ b/lib/models/device/device_transfer_info.dart @@ -2,7 +2,7 @@ import 'package:test_sa/models/department.dart'; import 'package:test_sa/models/hospital.dart'; import 'package:test_sa/models/lookup.dart'; -class DeviceTransferInfo{ +class DeviceTransferInfo { String userId; String comment; Hospital client; @@ -25,25 +25,25 @@ class DeviceTransferInfo{ this.status, }); - MaptoJson(bool isSender){ - Map body = {}; + Map toJson(bool isSender) { + Map body = {}; final baseKey = isSender ? "sender_" : "receiver_"; - if(comment != null && comment.isNotEmpty) body["${baseKey}comment"] = comment; - if(workingHours != null && workingHours.isNotEmpty) body["${baseKey}working_hours"] = workingHours; - if(travelingHours != null && travelingHours.isNotEmpty) body["${baseKey}travel_hours"] = travelingHours; - if(status != null) body["${baseKey}status"] = status.id.toString(); - if(signature != null && signature.isNotEmpty) body["${baseKey}image"] = signature; + if (comment != null && comment.isNotEmpty) body["${baseKey}comment"] = comment; + if (workingHours != null && workingHours.isNotEmpty) body["${baseKey}working_hours"] = workingHours; + if (travelingHours != null && travelingHours.isNotEmpty) body["${baseKey}travel_hours"] = travelingHours; + if (status != null) body["${baseKey}status"] = status.id.toString(); + if (signature != null && signature.isNotEmpty) body["${baseKey}image"] = signature; return body; } - bool validate(){ - if(client == null) return false; - if(department == null) return false; + bool validate() { + if (client == null) return false; + if (department == null) return false; return true; } - fromDetails(DeviceTransferInfo old,{bool withSignature = true}){ + fromDetails(DeviceTransferInfo old, {bool withSignature = true}) { userId = old.userId; userName = old.userName; client = Hospital.fromHospital(old.client); @@ -51,11 +51,11 @@ class DeviceTransferInfo{ workingHours = old.workingHours; travelingHours = old.travelingHours; comment = old.comment; - if(withSignature) signature = old.signature; + if (withSignature) signature = old.signature; status = old.status; } - factory DeviceTransferInfo.fromJson(Map parsedJson,String key){ + factory DeviceTransferInfo.fromJson(Map parsedJson, String key) { return DeviceTransferInfo( workingHours: parsedJson["${key}working_hours"], travelingHours: parsedJson["${key}travel_hours"], @@ -63,19 +63,15 @@ class DeviceTransferInfo{ signature: parsedJson["${key}image"], userId: parsedJson["${key}id"], comment: parsedJson["${key}comment"], - client: Hospital( - id: parsedJson["${key}SiteId"], - name: parsedJson["${key}SiteName"] - ), + client: Hospital(id: parsedJson["${key}SiteId"], name: parsedJson["${key}SiteName"]), department: Department( id: parsedJson["${key}DepartmentId"], name: parsedJson["${key}DepartmentName"], ), status: Lookup( - id: parsedJson["${key}status"], - name: parsedJson["${key}status"], + id: parsedJson["${key}status"], + name: parsedJson["${key}status"], ), ); } } - diff --git a/lib/models/device/model.dart b/lib/models/device/model.dart index bd49b250..25732845 100644 --- a/lib/models/device/model.dart +++ b/lib/models/device/model.dart @@ -8,15 +8,16 @@ class ModelDefinition { String replacementDate; int lifeSpan; - ModelDefinition( - {this.id, - this.assetName, - this.modelDefCode, - this.modelName, - this.manufacturerName, - this.supplierName, - this.replacementDate, - this.lifeSpan,}); + ModelDefinition({ + this.id, + this.assetName, + this.modelDefCode, + this.modelName, + this.manufacturerName, + this.supplierName, + this.replacementDate, + this.lifeSpan, + }); Map toJson() { final Map data = {}; @@ -32,7 +33,7 @@ class ModelDefinition { } factory ModelDefinition.fromJson(Map map) { - if(map == null) return null; + if (map == null) return null; return ModelDefinition( id: map['id'] as int, assetName: map['assetName'] as String, @@ -44,4 +45,4 @@ class ModelDefinition { lifeSpan: map['lifeSpan'] as int, ); } -} \ No newline at end of file +} diff --git a/lib/models/engineer.dart b/lib/models/engineer.dart index d8b15f07..096dd316 100644 --- a/lib/models/engineer.dart +++ b/lib/models/engineer.dart @@ -1,4 +1,4 @@ -class Engineer{ +class Engineer { String id; String name; @@ -7,15 +7,13 @@ class Engineer{ this.name, }); - - - factory Engineer.fromJson(Map parsedJson){ + factory Engineer.fromJson(Map parsedJson) { return Engineer( id: parsedJson["userId"] ?? parsedJson["id"], name: parsedJson["userName"] ?? parsedJson["name"], ); } - factory Engineer.fromEngineer(Engineer department){ + factory Engineer.fromEngineer(Engineer department) { return Engineer( id: department?.id, name: department?.name, @@ -23,10 +21,7 @@ class Engineer{ } @override - bool operator == (Object other) => - identical(this, other) || other is Engineer && - id == other.id; - + bool operator ==(Object other) => identical(this, other) || other is Engineer && id == other.id; @override int get hashCode => id.hashCode; @@ -37,5 +32,4 @@ class Engineer{ 'name': name, }; } - -} \ No newline at end of file +} diff --git a/lib/models/enums/user_types.dart b/lib/models/enums/user_types.dart index 2d608f7f..41df2134 100644 --- a/lib/models/enums/user_types.dart +++ b/lib/models/enums/user_types.dart @@ -1,4 +1,4 @@ -enum UsersTypes{ +enum UsersTypes { engineer, // 0 normal_user, // 1 -} \ No newline at end of file +} diff --git a/lib/models/gas_refill/gas_refill_details.dart b/lib/models/gas_refill/gas_refill_details.dart index 2f8d55ff..02d31cf4 100644 --- a/lib/models/gas_refill/gas_refill_details.dart +++ b/lib/models/gas_refill/gas_refill_details.dart @@ -1,6 +1,6 @@ import 'package:test_sa/models/lookup.dart'; -class GasRefillDetails{ +class GasRefillDetails { Lookup type; Lookup cylinderSize; Lookup cylinderType; @@ -15,13 +15,14 @@ class GasRefillDetails{ this.deliveredQuantity, }); - bool validate(){ + bool validate() { //if(cylinderSize == null) return false; - if(type == null) return false; - if(requestedQuantity == null) return false; + if (type == null) return false; + if (requestedQuantity == null) return false; return true; } - factory GasRefillDetails.fromJson(Map parsedJson){ + + factory GasRefillDetails.fromJson(Map parsedJson) { return GasRefillDetails( type: Lookup.fromJson(parsedJson["gasType"]), cylinderSize: Lookup.fromJson(parsedJson["cylinderSize"]), @@ -31,14 +32,13 @@ class GasRefillDetails{ ); } - factory GasRefillDetails.fromDetails(GasRefillDetails details){ + factory GasRefillDetails.fromDetails(GasRefillDetails details) { return GasRefillDetails( type: Lookup.fromStatus(details.type), - cylinderSize:Lookup.fromStatus(details.cylinderSize), - cylinderType:Lookup.fromStatus(details.cylinderType), + cylinderSize: Lookup.fromStatus(details.cylinderSize), + cylinderType: Lookup.fromStatus(details.cylinderType), requestedQuantity: details.requestedQuantity, deliveredQuantity: details.deliveredQuantity, ); } } - diff --git a/lib/models/gas_refill/gas_refill_model.dart b/lib/models/gas_refill/gas_refill_model.dart index ae3331fb..4cc43203 100644 --- a/lib/models/gas_refill/gas_refill_model.dart +++ b/lib/models/gas_refill/gas_refill_model.dart @@ -1,7 +1,7 @@ import 'package:test_sa/models/gas_refill/gas_refill_details.dart'; import 'package:test_sa/models/lookup.dart'; -class GasRefillModel{ +class GasRefillModel { int id; //String userId; String clientName; @@ -18,14 +18,14 @@ class GasRefillModel{ this.details, }); - bool validate(){ - if(title == null) return false; - if(status == null) return false; - if(details == null && details.isEmpty) return false; + bool validate() { + if (title == null) return false; + if (status == null) return false; + if (details == null && details.isEmpty) return false; return true; } - fromGasRefillModel(GasRefillModel model){ + fromGasRefillModel(GasRefillModel model) { id = model.id; //userId = model.userId; clientName = model.clientName; @@ -34,9 +34,9 @@ class GasRefillModel{ details = model.details.map((e) => GasRefillDetails.fromDetails(e)).toList(); } - factory GasRefillModel.fromJson(Map parsedJson){ + factory GasRefillModel.fromJson(Map parsedJson) { List details = []; - if(parsedJson["gazRefillDetails"] != null){ + if (parsedJson["gazRefillDetails"] != null) { List list = parsedJson["gazRefillDetails"]; details = list.map((e) => GasRefillDetails.fromJson(e)).toList(); } @@ -44,11 +44,9 @@ class GasRefillModel{ id: parsedJson["id"], //userId: parsedJson["uid"], title: parsedJson["gazRefillNo"], - clientName: parsedJson["site"] == null ? null: - parsedJson["site"]["custName"], + clientName: parsedJson["site"] == null ? null : parsedJson["site"]["custName"], status: Lookup.fromJson(parsedJson["status"]), details: details, ); } } - diff --git a/lib/models/hospital.dart b/lib/models/hospital.dart index 71cde19d..d59eda18 100644 --- a/lib/models/hospital.dart +++ b/lib/models/hospital.dart @@ -1,4 +1,4 @@ -class Hospital{ +class Hospital { int id; int customerCode; String name; @@ -11,31 +11,15 @@ class Hospital{ this.buildings, }); - - factory Hospital.fromJson(Map parsedJson){ - return Hospital( - id: parsedJson["id"], - name: parsedJson["custName"], - customerCode: parsedJson["customerCode"], - buildings: parsedJson["buildings"] - ); + factory Hospital.fromJson(Map parsedJson) { + return Hospital(id: parsedJson["id"], name: parsedJson["custName"], customerCode: parsedJson["customerCode"], buildings: parsedJson["buildings"]); } - factory Hospital.fromHospital(Hospital hospital){ - return Hospital( - id: hospital?.id, - name: hospital?.name, - customerCode: hospital?.customerCode, - buildings:hospital?.buildings - ); + factory Hospital.fromHospital(Hospital hospital) { + return Hospital(id: hospital?.id, name: hospital?.name, customerCode: hospital?.customerCode, buildings: hospital?.buildings); } Map toMap() { - return { - 'id': id, - 'customerCode': customerCode, - 'custName': name, - "buildings":buildings - }; + return {'id': id, 'customerCode': customerCode, 'custName': name, "buildings": buildings}; } -} \ No newline at end of file +} diff --git a/lib/models/issue.dart b/lib/models/issue.dart index cc186eb6..b56acbd6 100644 --- a/lib/models/issue.dart +++ b/lib/models/issue.dart @@ -1,4 +1,4 @@ -class Issue{ +class Issue { String title; String userId; List reports; @@ -15,13 +15,13 @@ class Issue{ this.serviceRequestId, }); - Map toMap(){ - Map map ={}; - if(title != null) map["title"] = title; - if(reports != null) map["issue_report"] = reports.toString(); - if(userId != null) map["uid"] = userId; - if(description != null) map["desc"] = description; - if(serviceRequestId != null) map["call_id"] = serviceRequestId; + Map toMap() { + Map map = {}; + if (title != null) map["title"] = title; + if (reports != null) map["issue_report"] = reports.toString(); + if (userId != null) map["uid"] = userId; + if (description != null) map["desc"] = description; + if (serviceRequestId != null) map["call_id"] = serviceRequestId; return map; } -} \ No newline at end of file +} diff --git a/lib/models/lookup.dart b/lib/models/lookup.dart index c523c489..e4deb993 100644 --- a/lib/models/lookup.dart +++ b/lib/models/lookup.dart @@ -1,5 +1,4 @@ -class Lookup{ - +class Lookup { //old name label final String name; // old name key @@ -13,25 +12,17 @@ class Lookup{ }); @override - bool operator == (Object other) => - identical(this, other) || other is Lookup && - ((value != null && value == other.value) - || ( id != null && id == other.id )) ; - + 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; - toMap(){ - return { - "id": id, - "name": name, - "value": value - }; + toMap() { + return {"id": id, "name": name, "value": value}; } - factory Lookup.fromStatus(Lookup old){ - if(old == null) return null; + factory Lookup.fromStatus(Lookup old) { + if (old == null) return null; return Lookup( name: old.name, id: old.id, @@ -39,8 +30,8 @@ class Lookup{ ); } - factory Lookup.fromJson(Map parsedJson){ - if(parsedJson == null) return null; + factory Lookup.fromJson(Map parsedJson) { + if (parsedJson == null) return null; return Lookup( name: parsedJson["name"], id: parsedJson["id"], @@ -64,4 +55,4 @@ class Lookup{ // id: parsedJson["id"], // ); // } -} \ No newline at end of file +} diff --git a/lib/models/pantry/calibration_tools.dart b/lib/models/pantry/calibration_tools.dart index 4207c99b..324be41a 100644 --- a/lib/models/pantry/calibration_tools.dart +++ b/lib/models/pantry/calibration_tools.dart @@ -1,6 +1,6 @@ import 'package:test_sa/models/lookup.dart'; -class CalibrationTool{ +class CalibrationTool { int id; Lookup assetsNumber; DateTime dataOfTesting; @@ -13,16 +13,16 @@ class CalibrationTool{ Map toMap(int visitId) { return { - "id":id ?? 0, + "id": id ?? 0, "visitId": visitId, - if(assetsNumber != null) 'assetId': (assetsNumber?.id).toString(), - if(dataOfTesting != null) 'calibrationDateOfTesters': dataOfTesting.toIso8601String(), + if (assetsNumber != null) 'assetId': (assetsNumber?.id).toString(), + if (dataOfTesting != null) 'calibrationDateOfTesters': dataOfTesting.toIso8601String(), }; } factory CalibrationTool.fromMap(Map map) { return CalibrationTool( - assetsNumber: Lookup(id: map["assetId"],name: map['assetSerialNo']), + assetsNumber: Lookup(id: map["assetId"], name: map['assetSerialNo']), dataOfTesting: DateTime.tryParse(map['calibrationDateOfTesters'] ?? ""), ); } @@ -37,4 +37,4 @@ class CalibrationTool{ dataOfTesting: dataOfTesting ?? this.dataOfTesting, ); } -} \ No newline at end of file +} diff --git a/lib/models/pantry/contact.dart b/lib/models/pantry/contact.dart index 50748bea..9f0182d4 100644 --- a/lib/models/pantry/contact.dart +++ b/lib/models/pantry/contact.dart @@ -1,6 +1,6 @@ import 'package:test_sa/models/lookup.dart'; -class Contact{ +class Contact { Lookup title; Lookup contactPerson; String job; @@ -8,14 +8,7 @@ class Contact{ String telephone; String landLine; - Contact({ - this.title, - this.contactPerson, - this.job, - this.email, - this.telephone, - this.landLine - }); + Contact({this.title, this.contactPerson, this.job, this.email, this.telephone, this.landLine}); Map toMap() { return { @@ -38,4 +31,4 @@ class Contact{ landLine: map['landLine'] as String, ); } -} \ No newline at end of file +} diff --git a/lib/models/pantry/lookups/contact_person.dart b/lib/models/pantry/lookups/contact_person.dart index 156a2086..af74b99b 100644 --- a/lib/models/pantry/lookups/contact_person.dart +++ b/lib/models/pantry/lookups/contact_person.dart @@ -1,15 +1,12 @@ import 'package:test_sa/models/lookup.dart'; class ContactTitle extends Lookup { - ContactTitle({ - int id, - String label - }):super(id: id,name: label); + ContactTitle({int id, String label}) : super(id: id, name: label); - factory ContactTitle.fromMap(Map parsedJson){ + factory ContactTitle.fromMap(Map parsedJson) { return ContactTitle( label: parsedJson["value"], id: parsedJson["id"], ); } -} \ No newline at end of file +} diff --git a/lib/models/pantry/lookups/contact_title.dart b/lib/models/pantry/lookups/contact_title.dart index 156a2086..af74b99b 100644 --- a/lib/models/pantry/lookups/contact_title.dart +++ b/lib/models/pantry/lookups/contact_title.dart @@ -1,15 +1,12 @@ import 'package:test_sa/models/lookup.dart'; class ContactTitle extends Lookup { - ContactTitle({ - int id, - String label - }):super(id: id,name: label); + ContactTitle({int id, String label}) : super(id: id, name: label); - factory ContactTitle.fromMap(Map parsedJson){ + factory ContactTitle.fromMap(Map parsedJson) { return ContactTitle( label: parsedJson["value"], id: parsedJson["id"], ); } -} \ No newline at end of file +} diff --git a/lib/models/pantry/pm_kit.dart b/lib/models/pantry/pm_kit.dart index 40bcf514..fb3fa857 100644 --- a/lib/models/pantry/pm_kit.dart +++ b/lib/models/pantry/pm_kit.dart @@ -1,6 +1,6 @@ import 'package:test_sa/models/lookup.dart'; -class PMKit{ +class PMKit { int id; Lookup itemCode; String itemName; @@ -10,22 +10,13 @@ class PMKit{ String quantityNeeded; String quantityReserved; - PMKit({ - this.id, - this.itemCode, - this.itemName, - this.preparationTimeFrame, - this.kitFrequencyDemand, - this.availability, - this.quantityNeeded, - this.quantityReserved - }); + PMKit({this.id, this.itemCode, this.itemName, this.preparationTimeFrame, this.kitFrequencyDemand, this.availability, this.quantityNeeded, this.quantityReserved}); Map toMap(int visitId) { return { - "id":id ?? 0, + "id": id ?? 0, "visitId": visitId, - if(itemCode != null) 'partCatalogItemId': (itemCode?.id).toString(), + if (itemCode != null) 'partCatalogItemId': (itemCode?.id).toString(), // if(itemName != null) 'itemName': itemName, // if(preparationTimeFrame != null) 'preparationTimeFrame': preparationTimeFrame, // if(kitFrequencyDemand != null) 'kitFrequencyDemand': kitFrequencyDemand, @@ -38,7 +29,7 @@ class PMKit{ factory PMKit.fromMap(Map map) { return PMKit( id: map['id'], - itemCode: Lookup(id:map['partCatalogItemId'],name:map["partNumber"]), + itemCode: Lookup(id: map['partCatalogItemId'], name: map["partNumber"]), itemName: map['itemName'] as String, preparationTimeFrame: map['preparationTimeFrame'] as String, kitFrequencyDemand: map['kitFrequencyDemand'] as String, @@ -69,4 +60,4 @@ class PMKit{ quantityReserved: quantityReserved ?? this.quantityReserved, ); } -} \ No newline at end of file +} diff --git a/lib/models/part.dart b/lib/models/part.dart index 298f4359..176811cc 100644 --- a/lib/models/part.dart +++ b/lib/models/part.dart @@ -1,4 +1,4 @@ -class Part{ +class Part { int id; int reportPartID; String code; @@ -13,25 +13,21 @@ class Part{ this.quantity = 1, }); - Map toJson(){ + Map toJson() { return { "id": reportPartID ?? 0, - "sparePart":{ - "id":id, - "partNo": code, - "partName":name - }, - "qty":quantity + "sparePart": {"id": id, "partNo": code, "partName": name}, + "qty": quantity }; } - factory Part.fromJson(Map parsedJson,{Map reportJson}){ + factory Part.fromJson(Map parsedJson, {Map reportJson}) { return Part( - id: parsedJson["id"], + id: parsedJson["id"], reportPartID: reportJson != null ? reportJson["id"] : null, code: parsedJson["partNo"], name: parsedJson["partName"], quantity: reportJson != null ? (reportJson["qty"] ?? 1).toInt() : 1, ); } -} \ No newline at end of file +} diff --git a/lib/models/service_request/search_work_order.dart b/lib/models/service_request/search_work_order.dart index 91fc0c9d..a130fee0 100644 --- a/lib/models/service_request/search_work_order.dart +++ b/lib/models/service_request/search_work_order.dart @@ -36,37 +36,37 @@ class SearchWorkOrders { SearchWorkOrders( {this.id, - this.parentWOId, - this.workOrderNo, - this.workOrderYear, - this.workOrderSequennce, - this.callRequest, - this.assetType, - this.assignedEmployee, - this.visitDate, - this.assistantEmployees, - this.supplier, - this.vendorTicketNumber, - this.contactPersonWorkOrders, - this.calllastSituation, - this.currentSituation, - this.repairLocation, - this.reason, - this.startofWorkTime, - this.endofWorkTime, - this.workingHours, - this.travelingHours, - this.travelingExpenses, - this.faultDescription, - this.sparePartsWorkOrders, - this.reviewComment, - this.comment, - this.attachmentsWorkOrder, - this.equipmentStatus, - this.suppEngineerWorkOrders, - this.engSignature, - this.nurseSignature, - this.woParentDto}); + this.parentWOId, + this.workOrderNo, + this.workOrderYear, + this.workOrderSequennce, + this.callRequest, + this.assetType, + this.assignedEmployee, + this.visitDate, + this.assistantEmployees, + this.supplier, + this.vendorTicketNumber, + this.contactPersonWorkOrders, + this.calllastSituation, + this.currentSituation, + this.repairLocation, + this.reason, + this.startofWorkTime, + this.endofWorkTime, + this.workingHours, + this.travelingHours, + this.travelingExpenses, + this.faultDescription, + this.sparePartsWorkOrders, + this.reviewComment, + this.comment, + this.attachmentsWorkOrder, + this.equipmentStatus, + this.suppEngineerWorkOrders, + this.engSignature, + this.nurseSignature, + this.woParentDto}); SearchWorkOrders.fromJson(Map json) { print(json['callRequest']); @@ -75,13 +75,9 @@ class SearchWorkOrders { workOrderNo = json['workOrderNo']; workOrderYear = json['workOrderYear']; workOrderSequennce = json['workOrderSequennce']; - callRequest = json['callRequest'] != null - ? new CallRequest.fromJson(json['callRequest']) - : CallRequest(); + callRequest = json['callRequest'] != null ? new CallRequest.fromJson(json['callRequest']) : CallRequest(); assetType = json['assetType']; - assignedEmployee = json['assignedEmployee'] != null - ? new AssignedEmployee.fromJson(json['assignedEmployee']) - : AssignedEmployee(); + assignedEmployee = json['assignedEmployee'] != null ? new AssignedEmployee.fromJson(json['assignedEmployee']) : AssignedEmployee(); visitDate = json['visitDate']; if (json['assistantEmployees'] != null) { assistantEmployees = json['assistantEmployees']; @@ -91,12 +87,8 @@ class SearchWorkOrders { if (json['contactPersonWorkOrders'] != null) { contactPersonWorkOrders = json['contactPersonWorkOrders']; } - calllastSituation = json['calllastSituation'] != null - ? new Lookup.fromJson(json['calllastSituation']) - : Lookup(); - currentSituation = json['currentSituation'] != null - ? new Lookup.fromJson(json['currentSituation']) - : Lookup(); + calllastSituation = json['calllastSituation'] != null ? new Lookup.fromJson(json['calllastSituation']) : Lookup(); + currentSituation = json['currentSituation'] != null ? new Lookup.fromJson(json['currentSituation']) : Lookup(); repairLocation = json['repairLocation']; reason = json['reason']; startofWorkTime = json['startofWorkTime']; @@ -104,9 +96,7 @@ class SearchWorkOrders { workingHours = json['workingHours']; travelingHours = json['travelingHours']; travelingExpenses = json['travelingExpenses']; - faultDescription = json['faultDescription'] != null - ? new ModelDefRelatedDefects.fromJson(json['faultDescription']) - : ModelDefRelatedDefects(); + faultDescription = json['faultDescription'] != null ? new ModelDefRelatedDefects.fromJson(json['faultDescription']) : ModelDefRelatedDefects(); if (json['sparePartsWorkOrders'] != null) { sparePartsWorkOrders = json['sparePartsWorkOrders']; } @@ -138,14 +128,12 @@ class SearchWorkOrders { } data['visitDate'] = this.visitDate; if (this.assistantEmployees != null) { - data['assistantEmployees'] = - this.assistantEmployees.map((v) => v.toJson()).toList(); + data['assistantEmployees'] = this.assistantEmployees.map((v) => v.toJson()).toList(); } data['supplier'] = this.supplier; data['vendorTicketNumber'] = this.vendorTicketNumber; if (this.contactPersonWorkOrders != null) { - data['contactPersonWorkOrders'] = - this.contactPersonWorkOrders.map((v) => v.toJson()).toList(); + data['contactPersonWorkOrders'] = this.contactPersonWorkOrders.map((v) => v.toJson()).toList(); } if (this.calllastSituation != null) { data['calllastSituation'] = this.calllastSituation.toMap(); @@ -164,16 +152,14 @@ class SearchWorkOrders { data['faultDescription'] = this.faultDescription.toJson(); } if (this.sparePartsWorkOrders != null) { - data['sparePartsWorkOrders'] = - this.sparePartsWorkOrders.map((v) => v.toJson()).toList(); + data['sparePartsWorkOrders'] = this.sparePartsWorkOrders.map((v) => v.toJson()).toList(); } data['reviewComment'] = this.reviewComment; data['comment'] = this.comment; data['attachmentsWorkOrder'] = this.attachmentsWorkOrder; data['equipmentStatus'] = this.equipmentStatus; if (this.suppEngineerWorkOrders != null) { - data['suppEngineerWorkOrders'] = - this.suppEngineerWorkOrders.map((v) => v.toJson()).toList(); + data['suppEngineerWorkOrders'] = this.suppEngineerWorkOrders.map((v) => v.toJson()).toList(); } data['engSignature'] = this.engSignature; data['nurseSignature'] = this.nurseSignature; @@ -194,33 +180,18 @@ class CallRequest { String firstAction; String assetType; - CallRequest( - {this.id, - this.callNo, - this.asset, - this.assignedEmployee, - this.callSiteContactPerson, - this.status, - this.callLastSituation, - this.defectType, - this.firstAction, - this.assetType}); + CallRequest({this.id, this.callNo, this.asset, this.assignedEmployee, this.callSiteContactPerson, this.status, this.callLastSituation, this.defectType, this.firstAction, this.assetType}); CallRequest.fromJson(Map json) { id = json['id']; callNo = json['callNo']; asset = json['asset'] != null ? new Asset.fromJson(json['asset']) : Asset(); - assignedEmployee = json['assignedEmployee'] != null - ? new AssignedEmployee.fromJson(json['assignedEmployee']) - : AssignedEmployee(); + assignedEmployee = json['assignedEmployee'] != null ? new AssignedEmployee.fromJson(json['assignedEmployee']) : AssignedEmployee(); if (json['callSiteContactPerson'] != null) { callSiteContactPerson = json['callSiteContactPerson']; } - status = - json['status'] != null ? new Lookup.fromJson(json['status']) : Lookup(); - callLastSituation = json['callLastSituation'] != null - ? new Lookup.fromJson(json['callLastSituation']) - : Lookup(); + status = json['status'] != null ? new Lookup.fromJson(json['status']) : Lookup(); + callLastSituation = json['callLastSituation'] != null ? new Lookup.fromJson(json['callLastSituation']) : Lookup(); defectType = json['defectType']; firstAction = json['firstAction']; assetType = json['assetType']; @@ -237,8 +208,7 @@ class CallRequest { data['assignedEmployee'] = this.assignedEmployee.toJson(); } if (this.callSiteContactPerson != null) { - data['callSiteContactPerson'] = - this.callSiteContactPerson.map((v) => v.toJson()).toList(); + data['callSiteContactPerson'] = this.callSiteContactPerson.map((v) => v.toJson()).toList(); } if (this.status != null) { data['status'] = this.status.toMap(); @@ -305,62 +275,60 @@ class Asset { Asset( {this.id, - this.assetSerialNo, - this.systemID, - this.assetNumber, - this.modelDefinition, - this.supplier, - this.ipAddress, - this.macAddress, - this.portNumber, - this.assetReplace, - this.oldAsset, - this.isParent, - this.parentAsset, - this.assetType, - this.site, - this.building, - this.floor, - this.department, - this.room, - this.testsDay, - this.purchasingPrice, - this.nbv, - this.currency, - this.poNo, - this.invoiceNumber, - this.invoiceDate, - this.replacementDate, - this.originDepartment, - this.originSite, - this.budgetYear, - this.lastPOPrice, - this.commissioningStatus, - this.productionDate, - this.edd, - this.technicalInspectionDate, - this.deliveryInspectionDate, - this.endUserAcceptanceDate, - this.receivingCommittee, - this.siteWarrantyMonths, - this.extendedWarrantyMonths, - this.remainderWarrantyMonths, - this.eomWarrantyMonthsNo, - this.warrantyValue, - this.warrantyEndDate, - this.warrantyContractConditions, - this.technicalGuidanceBooks, - this.comment, - this.tagCode}); + this.assetSerialNo, + this.systemID, + this.assetNumber, + this.modelDefinition, + this.supplier, + this.ipAddress, + this.macAddress, + this.portNumber, + this.assetReplace, + this.oldAsset, + this.isParent, + this.parentAsset, + this.assetType, + this.site, + this.building, + this.floor, + this.department, + this.room, + this.testsDay, + this.purchasingPrice, + this.nbv, + this.currency, + this.poNo, + this.invoiceNumber, + this.invoiceDate, + this.replacementDate, + this.originDepartment, + this.originSite, + this.budgetYear, + this.lastPOPrice, + this.commissioningStatus, + this.productionDate, + this.edd, + this.technicalInspectionDate, + this.deliveryInspectionDate, + this.endUserAcceptanceDate, + this.receivingCommittee, + this.siteWarrantyMonths, + this.extendedWarrantyMonths, + this.remainderWarrantyMonths, + this.eomWarrantyMonthsNo, + this.warrantyValue, + this.warrantyEndDate, + this.warrantyContractConditions, + this.technicalGuidanceBooks, + this.comment, + this.tagCode}); Asset.fromJson(Map json) { id = json['id']; assetSerialNo = json['assetSerialNo']; systemID = json['systemID']; assetNumber = json['assetNumber']; - modelDefinition = json['modelDefinition'] != null - ? new ModelDefinition.fromJson(json['modelDefinition']) - : ModelDefinition(); + modelDefinition = json['modelDefinition'] != null ? new ModelDefinition.fromJson(json['modelDefinition']) : ModelDefinition(); supplier = json['supplier']; ipAddress = json['ipAddress']; macAddress = json['macAddress']; @@ -430,8 +398,7 @@ class Asset { data['warrantyEndDate'] = this.warrantyEndDate; data['warrantyContractConditions'] = this.warrantyContractConditions; if (this.technicalGuidanceBooks != null) { - data['technicalGuidanceBooks'] = - this.technicalGuidanceBooks.map((v) => v.toJson()).toList(); + data['technicalGuidanceBooks'] = this.technicalGuidanceBooks.map((v) => v.toJson()).toList(); } data['comment'] = this.comment; data['tagCode'] = this.tagCode; @@ -454,16 +421,16 @@ class ModelDefinition { ModelDefinition( {this.id, - this.assetName, - this.modelDefCode, - this.modelName, - this.manufacturerId, - this.manufacturerName, - this.supplierName, - this.replacementDate, - this.lifeSpan, - this.modelDefRelatedDefects, - this.suppliers}); + this.assetName, + this.modelDefCode, + this.modelName, + this.manufacturerId, + this.manufacturerName, + this.supplierName, + this.replacementDate, + this.lifeSpan, + this.modelDefRelatedDefects, + this.suppliers}); ModelDefinition.fromJson(Map json) { id = json['id']; @@ -498,8 +465,7 @@ class ModelDefinition { data['replacementDate'] = this.replacementDate; data['lifeSpan'] = this.lifeSpan; if (this.modelDefRelatedDefects != null) { - data['modelDefRelatedDefects'] = - this.modelDefRelatedDefects.map((v) => v.toJson()).toList(); + data['modelDefRelatedDefects'] = this.modelDefRelatedDefects.map((v) => v.toJson()).toList(); } if (this.suppliers != null) { data['suppliers'] = this.suppliers.map((v) => v.toJson()).toList(); @@ -514,8 +480,7 @@ class ModelDefRelatedDefects { String workPerformed; String estimatedTime; - ModelDefRelatedDefects( - {this.id, this.defectName, this.workPerformed, this.estimatedTime}); + ModelDefRelatedDefects({this.id, this.defectName, this.workPerformed, this.estimatedTime}); ModelDefRelatedDefects.fromJson(Map json) { id = json['id']; @@ -581,4 +546,3 @@ class AssignedEmployee { return data; } } - diff --git a/lib/models/service_request/service_request.dart b/lib/models/service_request/service_request.dart index 434f8de7..3da64bea 100644 --- a/lib/models/service_request/service_request.dart +++ b/lib/models/service_request/service_request.dart @@ -2,7 +2,7 @@ import 'package:test_sa/controllers/api_routes/urls.dart'; import 'package:test_sa/models/device/device.dart'; import 'package:test_sa/models/lookup.dart'; -class ServiceRequest{ +class ServiceRequest { String id; String requestCode; String deviceSerialNumber; @@ -53,7 +53,6 @@ class ServiceRequest{ this.deviceId, this.audio, this.engineerName, - this.viewReport = false, this.deviceModel, this.engineerMobile, @@ -71,49 +70,39 @@ class ServiceRequest{ this.device, }); - factory ServiceRequest.fromJson(Map parsedJson){ + factory ServiceRequest.fromJson(Map parsedJson) { List images = []; - if(parsedJson["attachmentsCallRequest"] is List){ + if (parsedJson["attachmentsCallRequest"] is List) { List list = parsedJson["attachmentsCallRequest"]; images = list.map((e) => URLs.getFileUrl(e["attachmentsCallRequest"])).toList(); } return ServiceRequest( - id: parsedJson["id"].toString(), - requestCode: parsedJson["callNo"].toString(), - hospitalName: parsedJson["asset"]["site"]["custName"], - deviceNumber: parsedJson["asset"]["assetNumber"].toString(), - deviceId: parsedJson["asset"]["id"], - audio: URLs.getFileUrl(parsedJson["voiceNote"] ?? ""), - deviceArName: parsedJson["asset"]["modelDefinition"]["assetName"] ?? "", - deviceEnName: parsedJson["asset"]["modelDefinition"]["assetName"] ?? "", - devicePhotos: images, - deviceSerialNumber: parsedJson["asset"]["assetSerialNo"], - date: DateTime.tryParse(parsedJson["requestedDate"] ?? "").toString().split(" ").first, - maintenanceIssue: parsedJson["comments"], - statusLabel: parsedJson["status"] == null ? null : - parsedJson["status"]["name"], - statusValue: parsedJson["status"] == null ? null : - parsedJson["status"]["value"], - departmentName: parsedJson["asset"]["department"] != null ? - parsedJson["asset"]["department"]["name"] : "", - engineerName: parsedJson["assignedEmployee"] == null ? null : - parsedJson["assignedEmployee"]["name"], - hospitalId: parsedJson["asset"]["site"]["id"], - reportID: parsedJson["workOrder"] != null ? - parsedJson["workOrder"]["workOrderId"] : null, - viewReport: parsedJson["workOrder"] != null, - deviceModel: parsedJson["asset"]["modelDefinition"]["modelName"], - engineerMobile: parsedJson["assignedEmployee"] == null ? null : - parsedJson["assignedEmployee"]["phone"], - faultDescription: parsedJson["workOrder"] != null ? - parsedJson["workOrder"]["faultDescription"] : null, - jobSheetNumber: parsedJson["workOrder"] != null ? - parsedJson["workOrder"]["jobSheetNumber"] :null, - visitDate: DateTime.tryParse(parsedJson["visitDate"] ?? "").toString().split(" ").first, - nextVisitDate: DateTime.tryParse(parsedJson["nextVisitDate"] ?? ""), - workPerformed: parsedJson["workOrder"] != null ? - parsedJson["workOrder"]["workPerformed"] : null, - device: Device.fromJson(parsedJson["asset"]) - ); + id: parsedJson["id"].toString(), + requestCode: parsedJson["callNo"].toString(), + hospitalName: parsedJson["asset"]["site"]["custName"], + deviceNumber: parsedJson["asset"]["assetNumber"].toString(), + deviceId: parsedJson["asset"]["id"], + audio: URLs.getFileUrl(parsedJson["voiceNote"] ?? ""), + deviceArName: parsedJson["asset"]["modelDefinition"]["assetName"] ?? "", + deviceEnName: parsedJson["asset"]["modelDefinition"]["assetName"] ?? "", + devicePhotos: images, + deviceSerialNumber: parsedJson["asset"]["assetSerialNo"], + date: DateTime.tryParse(parsedJson["requestedDate"] ?? "").toString().split(" ").first, + maintenanceIssue: parsedJson["comments"], + statusLabel: parsedJson["status"] == null ? null : parsedJson["status"]["name"], + statusValue: parsedJson["status"] == null ? null : parsedJson["status"]["value"], + departmentName: parsedJson["asset"]["department"] != null ? parsedJson["asset"]["department"]["name"] : "", + engineerName: parsedJson["assignedEmployee"] == null ? null : parsedJson["assignedEmployee"]["name"], + hospitalId: parsedJson["asset"]["site"]["id"], + reportID: parsedJson["workOrder"] != null ? parsedJson["workOrder"]["workOrderId"] : null, + viewReport: parsedJson["workOrder"] != null, + deviceModel: parsedJson["asset"]["modelDefinition"]["modelName"], + engineerMobile: parsedJson["assignedEmployee"] == null ? null : parsedJson["assignedEmployee"]["phone"], + faultDescription: parsedJson["workOrder"] != null ? parsedJson["workOrder"]["faultDescription"] : null, + jobSheetNumber: parsedJson["workOrder"] != null ? parsedJson["workOrder"]["jobSheetNumber"] : null, + visitDate: DateTime.tryParse(parsedJson["visitDate"] ?? "").toString().split(" ").first, + nextVisitDate: DateTime.tryParse(parsedJson["nextVisitDate"] ?? ""), + workPerformed: parsedJson["workOrder"] != null ? parsedJson["workOrder"]["workPerformed"] : null, + device: Device.fromJson(parsedJson["asset"])); } -} \ No newline at end of file +} diff --git a/lib/models/service_request/service_request_search.dart b/lib/models/service_request/service_request_search.dart index cd2adf04..53fca4ab 100644 --- a/lib/models/service_request/service_request_search.dart +++ b/lib/models/service_request/service_request_search.dart @@ -1,7 +1,7 @@ import 'package:test_sa/models/hospital.dart'; import 'package:test_sa/models/lookup.dart'; -class ServiceRequestSearch{ +class ServiceRequestSearch { String deviceSerialNumber; String deviceNumber; String deviceName; @@ -9,7 +9,6 @@ class ServiceRequestSearch{ String model; Lookup statusValue; - ServiceRequestSearch({ this.deviceSerialNumber, this.deviceNumber, @@ -19,7 +18,7 @@ class ServiceRequestSearch{ this.hospital, }); - fromSearch(ServiceRequestSearch newSearch){ + fromSearch(ServiceRequestSearch newSearch) { deviceSerialNumber = newSearch.deviceSerialNumber; deviceNumber = newSearch.deviceNumber; statusValue = newSearch.statusValue; @@ -27,32 +26,31 @@ class ServiceRequestSearch{ model = newSearch.model; } - Map toMap(){ - Map search = {}; - if(deviceSerialNumber != null && deviceSerialNumber.isNotEmpty){ + Map toMap() { + Map search = {}; + if (deviceSerialNumber != null && deviceSerialNumber.isNotEmpty) { search["assetSerialNumber"] = deviceSerialNumber; } - if(deviceNumber != null && deviceNumber.isNotEmpty){ + if (deviceNumber != null && deviceNumber.isNotEmpty) { search["assetNo"] = deviceNumber; } - if(statusValue != null){ + if (statusValue != null) { search["status"] = statusValue.toMap(); } - if(deviceName != null && deviceName.isNotEmpty){ + if (deviceName != null && deviceName.isNotEmpty) { search["assetName"] = deviceName; - } - if(hospital != null){ + if (hospital != null) { search["site"] = hospital.name; } - if(model != null){ + if (model != null) { search["modelDefinition"] = model; } return search; } -} \ No newline at end of file +} diff --git a/lib/models/subtitle.dart b/lib/models/subtitle.dart index 49722511..a825fa97 100644 --- a/lib/models/subtitle.dart +++ b/lib/models/subtitle.dart @@ -1,6 +1,6 @@ import 'package:meta/meta.dart'; -class Subtitle{ +class Subtitle { // http requests status messages String currentlyServiceNotAvailable; String waitUntilYourRequestComplete; @@ -223,7 +223,7 @@ class Subtitle{ String duplicateAlertMessage; String alert; - void setIssues(List issues){ + void setIssues(List issues) { issues.clear(); issues.add(reason1); issues.add(reason2); @@ -285,7 +285,6 @@ class Subtitle{ @required this.titleValidateMessage, @required this.to, @required this.urlNotFound, - @required this.nameExist, @required this.unitRequired, @required this.unite, @@ -391,7 +390,6 @@ class Subtitle{ @required this.pickImage, @required this.requiredImage, @required this.activationAlert, - @required this.callId, @required this.requiredWord, @required this.quantity, @@ -423,7 +421,7 @@ class Subtitle{ @required this.currentSituation, }); - factory Subtitle.fromJson(Map parsedJson){ + factory Subtitle.fromJson(Map parsedJson) { return Subtitle( currentlyServiceNotAvailable: parsedJson["server_error_message"], failedToCompleteRequest: parsedJson["failed_request_message"], @@ -437,7 +435,6 @@ class Subtitle{ signOut: parsedJson["sign_out"], signOutAlert: parsedJson["logout_alert"], language: parsedJson["language"], - name: parsedJson["name"], email: parsedJson["email"], phoneNumber: parsedJson["phone_number"], @@ -451,7 +448,6 @@ class Subtitle{ passwordValidateMessage: parsedJson["password_validate_message"], confirmPasswordValidateMessage: parsedJson["confirm_password_validate_message"], phoneNumberValidateMessage: parsedJson["phone_number_validate_message"], - forgetPasswordWithMark: parsedJson["forget_password_with_mark"], showPassword: parsedJson["show_password"], wrongEmailOrPassword: parsedJson["wrong_email_or_password"], @@ -461,7 +457,6 @@ class Subtitle{ back: parsedJson["back"], search: parsedJson["search"], searchByName: parsedJson["search_by_name"], - address: parsedJson["address"], addressNotFound: parsedJson["address_not_found"], addressValidateMessage: parsedJson["address_validate_message"], @@ -480,7 +475,6 @@ class Subtitle{ titleNotFound: parsedJson["title_not_found"], titleValidateMessage: parsedJson["title_validate_message"], urlNotFound: parsedJson["url_not_found"], - date: parsedJson["date"], status: parsedJson["status"], code: parsedJson["code"], @@ -556,7 +550,6 @@ class Subtitle{ visitDate: parsedJson["visitDate"], whatsApp: parsedJson["whatsApp"], workPerformed: parsedJson["workPerformed"], - actualDate: parsedJson["actualDate"], done: parsedJson["done"], expectDate: parsedJson["expectDate"], @@ -587,7 +580,6 @@ class Subtitle{ requiredImage: parsedJson["requiredImage"], taskStatus: parsedJson["taskStatus"], activationAlert: parsedJson["activationAlert"], - attachImage: parsedJson["attachImage"], callLastSituation: parsedJson["callLastSituation"], customer: parsedJson["customer"], @@ -606,19 +598,17 @@ class Subtitle{ requiredWord: parsedJson["requiredWord"], serviceType: parsedJson["serviceType"], workPreformed: parsedJson["workPreformed"], - alert: parsedJson["alert"], duplicateAlert: parsedJson["duplicateAlert"], duplicateAlertMessage: parsedJson["duplicateAlertMessage"], duplicateRequest: parsedJson["duplicateRequest"], - orderWorkNumber:parsedJson["orderWorkNumber"], - assignedEmployee:parsedJson["assignedEmployee"], - assetSN:parsedJson["assetSN"], - assetName:parsedJson["assetName"], - site:parsedJson["site"], - maintenanceSituation:parsedJson["maintenanceSituation"], - currentSituation:parsedJson["currentSituation"], + orderWorkNumber: parsedJson["orderWorkNumber"], + assignedEmployee: parsedJson["assignedEmployee"], + assetSN: parsedJson["assetSN"], + assetName: parsedJson["assetName"], + site: parsedJson["site"], + maintenanceSituation: parsedJson["maintenanceSituation"], + currentSituation: parsedJson["currentSituation"], ); } - -} \ No newline at end of file +} diff --git a/lib/models/timer_model.dart b/lib/models/timer_model.dart index 191128fd..c6434f93 100644 --- a/lib/models/timer_model.dart +++ b/lib/models/timer_model.dart @@ -3,5 +3,5 @@ class TimerModel { DateTime endAt; int durationInSecond; - TimerModel({this.startAt,this.endAt,this.durationInSecond}); -} \ No newline at end of file + TimerModel({this.startAt, this.endAt, this.durationInSecond}); +} diff --git a/lib/models/visits/visit.dart b/lib/models/visits/visit.dart index 10717be1..f3faed08 100644 --- a/lib/models/visits/visit.dart +++ b/lib/models/visits/visit.dart @@ -1,7 +1,7 @@ import 'package:test_sa/models/lookup.dart'; import 'package:test_sa/models/pantry/pentry.dart'; -class Visit{ +class Visit { int id; String serialNumber; String expectDate; @@ -44,36 +44,35 @@ class Visit{ this.deviceNumber, }); - factory Visit.fromJson(Map parsedJson){ + factory Visit.fromJson(Map parsedJson) { List images = []; - if(parsedJson["vAttachments"] is List){ + if (parsedJson["vAttachments"] is List) { List list = parsedJson["vAttachments"]; images = list.map((e) => e["attachmentURL"].toString()).toList(); } return Visit( - id: parsedJson["id"], - serialNumber: parsedJson["visitCode"], - ppmScheduleId: parsedJson["ppmScheduleId"], - hospitalId: parsedJson["siteId"], - deviceNumber: parsedJson["assetNumber"], - hospitalName: parsedJson["siteName"], - deviceId: parsedJson["assetId"], - deviceSerialNumber: parsedJson["assetSerialNo"], - deviceEnglishName: parsedJson["assetName"], - deviceArabicName: parsedJson["assetName"], - employId: parsedJson["assignedToId"].toString(), - employName: parsedJson["assignedToName"], - expectDate: parsedJson["expectedDate"].toString().split("T").first, - actualDate: parsedJson["actualDate"].toString().split("T").first, - modelAndBrand: "${parsedJson["modelName"]} / ${parsedJson["manufacturerName"]}", - // contactStatus: parsedJson["contactStatus"], - images: images, - status: Lookup( - id: parsedJson["visitStatusId"], // actual value (0,1,2) - name: parsedJson["visitStatusName"] // text value - ), - assignTo: parsedJson["assignedToName"], - pentry: Pentry.fromMap(parsedJson) - ); + id: parsedJson["id"], + serialNumber: parsedJson["visitCode"], + ppmScheduleId: parsedJson["ppmScheduleId"], + hospitalId: parsedJson["siteId"], + deviceNumber: parsedJson["assetNumber"], + hospitalName: parsedJson["siteName"], + deviceId: parsedJson["assetId"], + deviceSerialNumber: parsedJson["assetSerialNo"], + deviceEnglishName: parsedJson["assetName"], + deviceArabicName: parsedJson["assetName"], + employId: parsedJson["assignedToId"].toString(), + employName: parsedJson["assignedToName"], + expectDate: parsedJson["expectedDate"].toString().split("T").first, + actualDate: parsedJson["actualDate"].toString().split("T").first, + modelAndBrand: "${parsedJson["modelName"]} / ${parsedJson["manufacturerName"]}", + // contactStatus: parsedJson["contactStatus"], + images: images, + status: Lookup( + id: parsedJson["visitStatusId"], // actual value (0,1,2) + name: parsedJson["visitStatusName"] // text value + ), + assignTo: parsedJson["assignedToName"], + pentry: Pentry.fromMap(parsedJson)); } -} \ No newline at end of file +} diff --git a/lib/models/visits/visits_group.dart b/lib/models/visits/visits_group.dart index 57f377ae..7ced9b3b 100644 --- a/lib/models/visits/visits_group.dart +++ b/lib/models/visits/visits_group.dart @@ -1,8 +1,7 @@ - import 'package:test_sa/models/engineer.dart'; import 'package:test_sa/models/visits/visit.dart'; -class VisitsGroup{ +class VisitsGroup { // String userId; // String workingHours; // String travelingHours; @@ -21,14 +20,14 @@ class VisitsGroup{ // this.jobSheetNumber, // this.travelingHours, // this.workingHours, - this.visits, - this.engineer, + this.visits, + this.engineer, // this.image, // this.taskStatus, }); - Map toJson(){ - Map jsonObject = {}; + Map toJson() { + Map jsonObject = {}; jsonObject["ids"] = visits.map((e) => e.id).toList(); jsonObject["assignedEmployeeId"] = engineer?.id; // if(status != null) jsonObject["taskStatusId"] = status.id.toString(); @@ -43,6 +42,4 @@ class VisitsGroup{ // if(taskStatus != null) jsonObject["task_status"] = taskStatus.id.toString(); return jsonObject; } - - -} \ No newline at end of file +} diff --git a/lib/models/visits/visits_search.dart b/lib/models/visits/visits_search.dart index 737277f8..5c3692bd 100644 --- a/lib/models/visits/visits_search.dart +++ b/lib/models/visits/visits_search.dart @@ -1,7 +1,7 @@ import 'package:test_sa/models/hospital.dart'; import 'package:test_sa/models/lookup.dart'; -class VisitsSearch{ +class VisitsSearch { String deviceSerialNumber; Hospital hospital; String brand; @@ -26,7 +26,7 @@ class VisitsSearch{ this.expectedDateTo, }); - fromSearch(VisitsSearch newSearch){ + fromSearch(VisitsSearch newSearch) { deviceSerialNumber = newSearch.deviceSerialNumber; brand = newSearch.brand; hospital = newSearch.hospital; @@ -39,49 +39,48 @@ class VisitsSearch{ statusValue = newSearch.statusValue; } - Map toMap(){ - Map _search = {}; - if(deviceSerialNumber != null && deviceSerialNumber.isNotEmpty){ - _search["assetId"]= deviceSerialNumber; + Map toMap() { + Map _search = {}; + if (deviceSerialNumber != null && deviceSerialNumber.isNotEmpty) { + _search["assetId"] = deviceSerialNumber; } - if(hospital != null){ - _search["siteId"]= hospital.id; + if (hospital != null) { + _search["siteId"] = hospital.id; } - if(brand != null && brand.isNotEmpty){ + if (brand != null && brand.isNotEmpty) { // todo get new key - _search[""]= brand; + _search[""] = brand; } - if(model != null){ - _search["modelId"]= model.id; + if (model != null) { + _search["modelId"] = model.id; } - if(expectedDateFrom != null){ - _search["expectedDateFrom"]= expectedDateFrom.toIso8601String(); + if (expectedDateFrom != null) { + _search["expectedDateFrom"] = expectedDateFrom.toIso8601String(); } - if(expectedDateTo != null){ - _search["expectedDateTo"]= expectedDateTo.toIso8601String(); + if (expectedDateTo != null) { + _search["expectedDateTo"] = expectedDateTo.toIso8601String(); } - if(actualDateFrom != null){ - _search["actualDateFrom"]= actualDateFrom.toIso8601String(); + if (actualDateFrom != null) { + _search["actualDateFrom"] = actualDateFrom.toIso8601String(); } - if(actualDateTo != null){ - _search["actualDateTo"]= actualDateTo.toIso8601String(); + if (actualDateTo != null) { + _search["actualDateTo"] = actualDateTo.toIso8601String(); } - if(statusValue != null){ - _search["visitStatusId"]= statusValue.id; + if (statusValue != null) { + _search["visitStatusId"] = statusValue.id; } - if(contactStatus != null){ - _search["assignedToId"]= contactStatus.id; + if (contactStatus != null) { + _search["assignedToId"] = contactStatus.id; } return _search; } } - diff --git a/lib/views/app_style/colors.dart b/lib/views/app_style/colors.dart index 9e4ad36f..3d247952 100644 --- a/lib/views/app_style/colors.dart +++ b/lib/views/app_style/colors.dart @@ -1,40 +1,49 @@ import 'package:flutter/material.dart'; + class AColors { AColors._(); - static const Color white = Color(0xffffffff); - static const Color black = Color(0xff000000); - static const Color grey3A = Color(0xff2e303a); - static const Color grey = Color(0xffe1e7e7); - static const green = Colors.green; - static const Color orange = Colors.orange; - static const Color deepOrange = Colors.deepOrangeAccent; - static const Color red = Colors.red; - static const Color deepRed = Color(0xFFD32F2F); + static const Color white = Color(0xffffffff); + static const Color black = Color(0xff000000); + static const Color grey3A = Color(0xff2e303a); + static const Color grey = Color(0xffe1e7e7); + static const green = Colors.green; + static const Color orange = Colors.orange; + static const Color deepOrange = Colors.deepOrangeAccent; + static const Color red = Colors.red; + static const Color deepRed = Color(0xFFD32F2F); static const Color scaffoldBackgroundColor = Color(0xffffffff); - static const Color secondaryColor = Color(0xff111427); - static const Color primaryColor = Color(0xff5bb0da); - static const Color cyan = Color(0xff4A8DB7); - static const Color onPrimaryColor = Color(0xffffffff); + static const Color secondaryColor = Color(0xff111427); + static const Color primaryColor = Color(0xff5bb0da); + static const Color cyan = Color(0xff4A8DB7); + static const Color onPrimaryColor = Color(0xffffffff); static Color inputFieldBackgroundColor = Color(0xfff5f5f5); static Color greyEF = Color(0xffEFEFEF); - static Color getRequestStatusColor(int id){ - switch(id){ - case 4: return AColors.deepRed; - case 6: return AColors.green; - case 5: return AColors.orange; - case 8: return AColors.green; - case 9: return AColors.orange; - default : return AColors.grey; + static Color getRequestStatusColor(int id) { + switch (id) { + case 4: + return AColors.deepRed; + case 6: + return AColors.green; + case 5: + return AColors.orange; + case 8: + return AColors.green; + case 9: + return AColors.orange; + default: + return AColors.grey; } } - static Color getGasStatusColor(int id){ - switch(id){ - case 0: return AColors.orange; - case 1: return AColors.green; - default : return AColors.grey; + static Color getGasStatusColor(int id) { + switch (id) { + case 0: + return AColors.orange; + case 1: + return AColors.green; + default: + return AColors.grey; } } } - diff --git a/lib/views/app_style/sizing.dart b/lib/views/app_style/sizing.dart index bb66b317..e14f3bce 100644 --- a/lib/views/app_style/sizing.dart +++ b/lib/views/app_style/sizing.dart @@ -1,39 +1,31 @@ import 'package:flutter/material.dart'; + class AppStyle { AppStyle._(); static const double borderRadius = 10; - static const BoxShadow boxShadow = BoxShadow( - color: Colors.black26, - blurRadius: 3, - offset: Offset(0,2) - ); + static const BoxShadow boxShadow = BoxShadow(color: Colors.black26, blurRadius: 3, offset: Offset(0, 2)); - static double getBorderRadius(BuildContext context){ + static double getBorderRadius(BuildContext context) { return borderRadius * getScaleFactor(context); } - static double getScaleFactor(BuildContext context){ + static double getScaleFactor(BuildContext context) { return MediaQuery.of(context).orientation == Orientation.portrait - ? MediaQuery.of(context).size.width/(360) > 1.5 - ? 1.5 : MediaQuery.of(context).size.width/(360) - : MediaQuery.of(context).size.height/(360) > 1.5 - ? 1.5 : MediaQuery.of(context).size.height/(360); + ? MediaQuery.of(context).size.width / (360) > 1.5 + ? 1.5 + : MediaQuery.of(context).size.width / (360) + : MediaQuery.of(context).size.height / (360) > 1.5 + ? 1.5 + : MediaQuery.of(context).size.height / (360); } - static BorderRadius getCardBorder(BuildContext context){ + static BorderRadius getCardBorder(BuildContext context) { return BorderRadius.only( - topRight: Radius.circular( - AppStyle.borderRadius * AppStyle.getScaleFactor(context) - ), - topLeft: Radius.circular( - AppStyle.borderRadius * AppStyle.getScaleFactor(context) - ), - bottomRight: Radius.circular( - AppStyle.borderRadius * AppStyle.getScaleFactor(context) - ), + topRight: Radius.circular(AppStyle.borderRadius * AppStyle.getScaleFactor(context)), + topLeft: Radius.circular(AppStyle.borderRadius * AppStyle.getScaleFactor(context)), + bottomRight: Radius.circular(AppStyle.borderRadius * AppStyle.getScaleFactor(context)), ); } - -} \ No newline at end of file +} diff --git a/lib/views/pages/device_transfer/device_transfer_details.dart b/lib/views/pages/device_transfer/device_transfer_details.dart index ee45e92c..184cc4b2 100644 --- a/lib/views/pages/device_transfer/device_transfer_details.dart +++ b/lib/views/pages/device_transfer/device_transfer_details.dart @@ -25,7 +25,6 @@ class DeviceTransferDetails extends StatefulWidget { } class _DeviceTransferDetailsState extends State { - final DeviceTransferInfo _model = DeviceTransferInfo(); bool _isSender = false; bool _isReceiver = false; @@ -39,8 +38,6 @@ class _DeviceTransferDetailsState extends State { @override void initState() { - - super.initState(); } @@ -66,7 +63,7 @@ class _DeviceTransferDetailsState extends State { children: [ Container( color: Theme.of(context).colorScheme.primary, - padding: const EdgeInsets.symmetric(horizontal: 0,vertical: 4), + padding: const EdgeInsets.symmetric(horizontal: 0, vertical: 4), child: Row( children: [ const ABackButton(), @@ -74,10 +71,7 @@ class _DeviceTransferDetailsState extends State { child: Center( child: Text( _subtitle.details, - style: Theme.of(context).textTheme.headline6.copyWith( - color: AColors.white, - fontStyle: FontStyle.italic - ), + style: Theme.of(context).textTheme.headline6.copyWith(color: AColors.white, fontStyle: FontStyle.italic), ), ), ), @@ -87,7 +81,7 @@ class _DeviceTransferDetailsState extends State { ), Expanded( child: SingleChildScrollView( - padding: EdgeInsets.all(16*AppStyle.getScaleFactor(context)), + padding: EdgeInsets.all(16 * AppStyle.getScaleFactor(context)), child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ @@ -99,59 +93,52 @@ class _DeviceTransferDetailsState extends State { title: _subtitle.device, info: widget.model.device.serialNumber, ), - const SizedBox(height:8), + const SizedBox(height: 8), Row( children: [ Expanded( - child: Text( - "Sender", - style: Theme.of(context).textTheme.headline6 - ), + child: Text("Sender", style: Theme.of(context).textTheme.headline6), ), - if(_isSender || true) + if (_isSender || true) ASmallButton( text: _subtitle.edit, - onPressed: (){ - Navigator.of(context).push( - MaterialPageRoute( - builder: (_)=> UpdateDeviceTransfer(model: widget.model,isSender: true,) - ) - ); + onPressed: () { + Navigator.of(context).push(MaterialPageRoute( + builder: (_) => UpdateDeviceTransfer( + model: widget.model, + isSender: true, + ))); }, ), ], ), - const SizedBox(height:12), + const SizedBox(height: 12), DeviceTransferInfoSection( info: widget.model.sender, ), - const SizedBox(height:8), + const SizedBox(height: 8), Row( children: [ Expanded( - child: Text( - "Receiver", - style: Theme.of(context).textTheme.headline6 - ), - ), - if(_isReceiver || true) - ASmallButton( - text: _subtitle.edit, - onPressed: (){ - Navigator.of(context).push( - MaterialPageRoute( - builder: (_)=> UpdateDeviceTransfer(model: widget.model,isSender: false,) - ) - ); - }, + child: Text("Receiver", style: Theme.of(context).textTheme.headline6), ), + if (_isReceiver || true) + ASmallButton( + text: _subtitle.edit, + onPressed: () { + Navigator.of(context).push(MaterialPageRoute( + builder: (_) => UpdateDeviceTransfer( + model: widget.model, + isSender: false, + ))); + }, + ), ], ), - const SizedBox(height:12), + const SizedBox(height: 12), DeviceTransferInfoSection( info: widget.model.receiver, ), - ], ), ), diff --git a/lib/views/pages/device_transfer/request_device_transfer.dart b/lib/views/pages/device_transfer/request_device_transfer.dart index b3beb23f..f320fcfe 100644 --- a/lib/views/pages/device_transfer/request_device_transfer.dart +++ b/lib/views/pages/device_transfer/request_device_transfer.dart @@ -35,7 +35,7 @@ class _RequestDeviceTransferState extends State { SettingProvider _settingProvider; DeviceTransferProvider _deviceTransferProvider; final TextEditingController _requestedQuantityController = TextEditingController(); - final DeviceTransfer _formModel = DeviceTransfer(receiver: DeviceTransferInfo(),sender: DeviceTransferInfo()); + final DeviceTransfer _formModel = DeviceTransfer(receiver: DeviceTransferInfo(), sender: DeviceTransferInfo()); final GlobalKey _formKey = GlobalKey(); final GlobalKey _scaffoldKey = GlobalKey(); diff --git a/lib/views/pages/device_transfer/track_device_transfer.dart b/lib/views/pages/device_transfer/track_device_transfer.dart index 454d6d30..d62943ef 100644 --- a/lib/views/pages/device_transfer/track_device_transfer.dart +++ b/lib/views/pages/device_transfer/track_device_transfer.dart @@ -9,6 +9,7 @@ import 'package:test_sa/views/app_style/colors.dart'; import 'package:test_sa/views/widgets/buttons/app_back_button.dart'; import 'package:test_sa/views/widgets/device_trancfer/device_transfer_list.dart'; import 'package:test_sa/views/widgets/loaders/loading_manager.dart'; + class TrackDeviceTransferPage extends StatefulWidget { static const String id = "/track-device-transfer"; @@ -18,8 +19,7 @@ class TrackDeviceTransferPage extends StatefulWidget { State createState() => _TrackDeviceTransferPageState(); } -class _TrackDeviceTransferPageState extends State - with TickerProviderStateMixin{ +class _TrackDeviceTransferPageState extends State with TickerProviderStateMixin { DeviceTransferProvider _deviceTransferProvider; UserProvider _userProvider; SettingProvider _settingProvider; @@ -48,8 +48,8 @@ class _TrackDeviceTransferPageState extends State Column( children: [ Container( - color:AColors.primaryColor, - padding: const EdgeInsets.symmetric(horizontal: 0,vertical: 4), + color: AColors.primaryColor, + padding: const EdgeInsets.symmetric(horizontal: 0, vertical: 4), child: Column( children: [ Row( @@ -59,17 +59,15 @@ class _TrackDeviceTransferPageState extends State child: Center( child: Text( "Device Transfer", - style: Theme.of(context).textTheme.headline6.copyWith( - color: AColors.white, - fontStyle: FontStyle.italic - ), + style: Theme.of(context).textTheme.headline6.copyWith(color: AColors.white, fontStyle: FontStyle.italic), ), ), ), - const SizedBox(width: 48,) + const SizedBox( + width: 48, + ) ], ), - ], ), ), diff --git a/lib/views/pages/splash_screen.dart b/lib/views/pages/splash_screen.dart index bd7a770f..2a1af30d 100644 --- a/lib/views/pages/splash_screen.dart +++ b/lib/views/pages/splash_screen.dart @@ -22,12 +22,11 @@ class SplashScreen extends StatefulWidget { } class _SplashScreenState extends State { - SettingProvider _settingProvider; UserProvider _userProvider; - _goToUserScreen(User user){ - if(user.tokenLife != null && user.tokenLife.isAfter(DateTime.now())){ + _goToUserScreen(User user) { + if (user.tokenLife != null && user.tokenLife.isAfter(DateTime.now())) { _userProvider.user = user; // Navigator.of(context).pushNamed(Login.id); Navigator.of(context).pushNamed(LandPage.id); @@ -38,38 +37,30 @@ class _SplashScreenState extends State { void initState() { Firebase.initializeApp(); - NotificationManger.initialisation( - (notificationDetails) { - AppNotification notification = AppNotification.fromJson(json.decode(notificationDetails.payload)); - if(notification.path == null || notification.path.isEmpty) - return; - Navigator.pushNamed( - context, - notification.path, - arguments: notification.requestId - ); - } - , (id, title, body, payload) async { - }); + NotificationManger.initialisation((notificationDetails) { + AppNotification notification = AppNotification.fromJson(json.decode(notificationDetails.payload)); + if (notification.path == null || notification.path.isEmpty) return; + Navigator.pushNamed(context, notification.path, arguments: notification.requestId); + }, (id, title, body, payload) async {}); super.initState(); } @override Widget build(BuildContext context) { - _settingProvider = Provider.of(context,listen: false); - _userProvider = Provider.of(context,listen: false); + _settingProvider = Provider.of(context, listen: false); + _userProvider = Provider.of(context, listen: false); return Scaffold( backgroundColor: Colors.white, body: Center( child: SizedBox( - width: MediaQuery.of(context).size.width/1.1, - child: FlareActor( + width: MediaQuery.of(context).size.width / 1.1, + child: FlareActor( "assets/rives/atoms_splash.flr", fit: BoxFit.contain, animation: "splash", callback: (animation) async { Navigator.of(context).pushNamed(Login.id); - if(_settingProvider.isLoaded && _settingProvider.user != null){ + if (_settingProvider.isLoaded && _settingProvider.user != null) { _goToUserScreen(_settingProvider.user); } }, diff --git a/lib/views/pages/user/gas_refill/gas_refill_details.dart b/lib/views/pages/user/gas_refill/gas_refill_details.dart index bed4999d..9171aea0 100644 --- a/lib/views/pages/user/gas_refill/gas_refill_details.dart +++ b/lib/views/pages/user/gas_refill/gas_refill_details.dart @@ -21,6 +21,7 @@ import 'package:test_sa/views/widgets/status/gas_refill/gas_status.dart'; import 'package:test_sa/views/widgets/titles/app_sub_title.dart'; import '../../../app_style/colors.dart'; + class GasRefillDetails extends StatefulWidget { final GasRefillModel model; const GasRefillDetails({Key key, this.model}) : super(key: key); @@ -30,7 +31,6 @@ class GasRefillDetails extends StatefulWidget { } class _GasRefillDetailsState extends State { - final GasRefillModel _model = GasRefillModel(); bool _enableEdit = false; bool _validate = false; @@ -43,39 +43,29 @@ class _GasRefillDetailsState extends State { final GlobalKey _scaffoldKey = GlobalKey(); _update() async { _validate = true; - if(!_formKey.currentState.validate()){ + if (!_formKey.currentState.validate()) { setState(() {}); return false; } _formKey.currentState.save(); - _isLoading =true; + _isLoading = true; setState(() {}); - int status = await _gasRefillProvider.updateModel( - user: _userProvider.user, - host: _settingProvider.host, - newModel: _model, - oldModel: widget.model - ); - _isLoading =false; + int status = await _gasRefillProvider.updateModel(user: _userProvider.user, host: _settingProvider.host, newModel: _model, oldModel: widget.model); + _isLoading = false; setState(() {}); - if(status >= 200 && status < 300){ + if (status >= 200 && status < 300) { Fluttertoast.showToast( msg: _subtitle.requestCompleteSuccessfully, ); _enableEdit = false; _validate = false; //Navigator.of(context).pop(); - }else{ - String errorMessage = HttpStatusManger.getStatusMessage( - status: status, subtitle: _subtitle); - ScaffoldMessenger.of(context).showSnackBar( - SnackBar( - content: Text( - errorMessage - ), - ) - ); + } else { + String errorMessage = HttpStatusManger.getStatusMessage(status: status, subtitle: _subtitle); + ScaffoldMessenger.of(context).showSnackBar(SnackBar( + content: Text(errorMessage), + )); } } @@ -105,7 +95,7 @@ class _GasRefillDetailsState extends State { children: [ Container( color: Theme.of(context).colorScheme.primary, - padding: const EdgeInsets.symmetric(horizontal: 0,vertical: 4), + padding: const EdgeInsets.symmetric(horizontal: 0, vertical: 4), child: Row( children: [ const ABackButton(), @@ -113,32 +103,31 @@ class _GasRefillDetailsState extends State { child: Center( child: Text( _subtitle.details, - style: Theme.of(context).textTheme.headline6.copyWith( - color: AColors.white, - fontStyle: FontStyle.italic - ), + style: Theme.of(context).textTheme.headline6.copyWith(color: AColors.white, fontStyle: FontStyle.italic), ), ), ), - if(_userProvider.user.type == UsersTypes.engineer) - AIconButton( - iconData: _enableEdit ? Icons.cancel : Icons.edit, - color: Theme.of(context).colorScheme.onPrimary, - buttonSize: 42, - backgroundColor: AColors.green, - onPressed: () async { - _enableEdit = !_enableEdit; - _model.fromGasRefillModel(widget.model); - setState(() {}); - }, - ), - const SizedBox(width: 16,) + if (_userProvider.user.type == UsersTypes.engineer) + AIconButton( + iconData: _enableEdit ? Icons.cancel : Icons.edit, + color: Theme.of(context).colorScheme.onPrimary, + buttonSize: 42, + backgroundColor: AColors.green, + onPressed: () async { + _enableEdit = !_enableEdit; + _model.fromGasRefillModel(widget.model); + setState(() {}); + }, + ), + const SizedBox( + width: 16, + ) ], ), ), Expanded( child: SingleChildScrollView( - padding: EdgeInsets.all(16*AppStyle.getScaleFactor(context)), + padding: EdgeInsets.all(16 * AppStyle.getScaleFactor(context)), child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ @@ -150,64 +139,73 @@ class _GasRefillDetailsState extends State { title: _subtitle.hospital, info: _model.clientName, ), - _enableEdit ? - Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - const SizedBox(height: 8,), - ASubTitle(_subtitle.status), - if(_validate && _model.status == null) - ASubTitle(_subtitle.requiredWord,color: Colors.red,), - const SizedBox(height: 4,), - GasStatusMenu( - initialValue: _model.status, - onSelect: (status){ - _model.status = status; - }, - ) - ], - ): - Row( - children: [ - Expanded( - child: Text( - "${_subtitle.status} : ", - style: Theme.of(context).textTheme.subtitle2, - textScaleFactor: AppStyle.getScaleFactor(context), + _enableEdit + ? Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + const SizedBox( + height: 8, + ), + ASubTitle(_subtitle.status), + if (_validate && _model.status == null) + ASubTitle( + _subtitle.requiredWord, + color: Colors.red, + ), + const SizedBox( + height: 4, + ), + GasStatusMenu( + initialValue: _model.status, + onSelect: (status) { + _model.status = status; + }, + ) + ], + ) + : Row( + children: [ + Expanded( + child: Text( + "${_subtitle.status} : ", + style: Theme.of(context).textTheme.subtitle2, + textScaleFactor: AppStyle.getScaleFactor(context), + ), + ), + if (_model.status?.id != null) StatusLabel(label: _model.status.name, color: AColors.getGasStatusColor(_model.status.id)), + ], ), - ), - if(_model.status?.id != null) - StatusLabel(label: _model.status.name, - color: AColors.getGasStatusColor(_model.status.id) - ), - ], + const SizedBox( + height: 8, ), - const SizedBox(height: 8,), const ASubTitle("Gas Requests"), - const SizedBox(height: 8,), + const SizedBox( + height: 8, + ), ListView.builder( shrinkWrap: true, physics: const ClampingScrollPhysics(), itemCount: _model.details.length, - itemBuilder: (context,index){ + itemBuilder: (context, index) { final details = _model.details[index]; return GasRefillUpdateDetailsItem( details: details, validate: _validate, enableEdit: _enableEdit, ); - } - ), - if(_enableEdit) - Column( - children: [ - const SizedBox(height: 16,), - AButton( - text: _subtitle.update, - onPressed: _update, - ), - ], - ), + }), + if (_enableEdit) + Column( + children: [ + const SizedBox( + height: 16, + ), + AButton( + text: _subtitle.update, + onPressed: _update, + ), + ], + ), ], ), ), diff --git a/lib/views/pages/user/gas_refill/request_gas_refill.dart b/lib/views/pages/user/gas_refill/request_gas_refill.dart index 6dfcb72e..79a2320f 100644 --- a/lib/views/pages/user/gas_refill/request_gas_refill.dart +++ b/lib/views/pages/user/gas_refill/request_gas_refill.dart @@ -22,6 +22,7 @@ import 'package:test_sa/views/widgets/status/gas_refill/gas_type.dart'; import 'package:test_sa/views/widgets/titles/app_sub_title.dart'; import '../../../../controllers/localization/localization.dart'; + class RequestGasRefill extends StatefulWidget { static const String id = "/request-gas-refill"; const RequestGasRefill({Key key}) : super(key: key); @@ -45,16 +46,16 @@ class _RequestGasRefillState extends State { final GlobalKey _scaffoldKey = GlobalKey(); @override - void setState(VoidCallback fn){ - if(mounted) super.setState(() {}); + void setState(VoidCallback fn) { + if (mounted) super.setState(() {}); } _onSubmit() async { - if(_formModel.details.isEmpty){ - if(!_addNewModel()) return; + if (_formModel.details.isEmpty) { + if (!_addNewModel()) return; } - _isLoading =true; + _isLoading = true; setState(() {}); int status = await _gasRefillProvider.createModel( @@ -62,40 +63,34 @@ class _RequestGasRefillState extends State { host: _settingProvider.host, model: _formModel, ); - _isLoading =false; + _isLoading = false; setState(() {}); - if(status >= 200 && status < 300){ + if (status >= 200 && status < 300) { Fluttertoast.showToast( msg: _subtitle.requestCompleteSuccessfully, ); Navigator.of(context).pop(); - }else{ - String errorMessage = HttpStatusManger.getStatusMessage( - status: status, subtitle: _subtitle); - ScaffoldMessenger.of(context).showSnackBar( - SnackBar( - content: Text( - errorMessage - ), - ) - ); + } else { + String errorMessage = HttpStatusManger.getStatusMessage(status: status, subtitle: _subtitle); + ScaffoldMessenger.of(context).showSnackBar(SnackBar( + content: Text(errorMessage), + )); } } - bool _addNewModel(){ + bool _addNewModel() { _validate = true; - if(!_formKey.currentState.validate()){ + if (!_formKey.currentState.validate()) { setState(() {}); return false; } _formKey.currentState.save(); - if(!_currentDetails.validate()) { - setState(() { }); + if (!_currentDetails.validate()) { + setState(() {}); return false; } - - _formModel.details.insert(0,_currentDetails); + _formModel.details.insert(0, _currentDetails); _validate = false; Scrollable.ensureVisible(_DetailsKey.currentContext); _requestedQuantityController.clear(); @@ -109,12 +104,13 @@ class _RequestGasRefillState extends State { _requestedQuantityController.dispose(); super.dispose(); } + @override Widget build(BuildContext context) { _subtitle = AppLocalization.of(context).subtitle; _userProvider = Provider.of(context); _settingProvider = Provider.of(context); - _gasRefillProvider = Provider.of(context,listen: false); + _gasRefillProvider = Provider.of(context, listen: false); return Scaffold( key: _scaffoldKey, body: Form( @@ -135,11 +131,7 @@ class _RequestGasRefillState extends State { padding: const EdgeInsets.all(8.0), child: Text( "Request Gas Refill", - style: Theme.of(context).textTheme.headline5.copyWith( - color: Theme.of(context).primaryColor, - fontSize: 28, - fontWeight: FontWeight.bold - ), + style: Theme.of(context).textTheme.headline5.copyWith(color: Theme.of(context).primaryColor, fontSize: 28, fontWeight: FontWeight.bold), ), ), ), @@ -159,68 +151,101 @@ class _RequestGasRefillState extends State { // ), // const SizedBox(height: 8,), ASubTitle(_subtitle.status), - if(_validate && _formModel.status == null) - ASubTitle(_subtitle.requiredWord,color: Colors.red,), - const SizedBox(height: 4,), - GasStatusMenu( - initialValue: _formModel.status ?? const Lookup( - value: 1 + if (_validate && _formModel.status == null) + ASubTitle( + _subtitle.requiredWord, + color: Colors.red, ), - onSelect: (status){ + const SizedBox( + height: 4, + ), + GasStatusMenu( + initialValue: _formModel.status ?? const Lookup(value: 1), + onSelect: (status) { _formModel.status = status; }, ), - const SizedBox(height: 8,), - Divider(color: Theme.of(context).colorScheme.primary,), - const SizedBox(height: 4,), + const SizedBox( + height: 8, + ), + Divider( + color: Theme.of(context).colorScheme.primary, + ), + const SizedBox( + height: 4, + ), const ASubTitle("Type"), - if(_validate && _currentDetails.type == null) - ASubTitle(_subtitle.requiredWord,color: Colors.red,), - const SizedBox(height: 4,), + if (_validate && _currentDetails.type == null) + ASubTitle( + _subtitle.requiredWord, + color: Colors.red, + ), + const SizedBox( + height: 4, + ), GasTypeMenu( initialValue: _currentDetails.type, - onSelect: (status){ + onSelect: (status) { _currentDetails.type = status; }, ), - const SizedBox(height: 8,), + const SizedBox( + height: 8, + ), const ASubTitle("Cylinder Size"), - if(_validate && _currentDetails.cylinderSize == null) - ASubTitle(_subtitle.requiredWord,color: Colors.red,), - const SizedBox(height: 4,), + if (_validate && _currentDetails.cylinderSize == null) + ASubTitle( + _subtitle.requiredWord, + color: Colors.red, + ), + const SizedBox( + height: 4, + ), GasCylinderSizeMenu( initialValue: _currentDetails.cylinderSize, - onSelect: (status){ + onSelect: (status) { _currentDetails.cylinderSize = status; }, ), - const SizedBox(height: 8,), + const SizedBox( + height: 8, + ), const ASubTitle("Cylinder Type"), - if(_validate && _currentDetails.cylinderSize == null) - ASubTitle(_subtitle.requiredWord,color: Colors.red,), - const SizedBox(height: 4,), + if (_validate && _currentDetails.cylinderSize == null) + ASubTitle( + _subtitle.requiredWord, + color: Colors.red, + ), + const SizedBox( + height: 4, + ), GasCylinderTypesMenu( initialValue: _currentDetails.cylinderType, - onSelect: (status){ + onSelect: (status) { _currentDetails.cylinderType = status; }, ), - const SizedBox(height: 8,), + const SizedBox( + height: 8, + ), ASubTitle(_subtitle.quantity), - if(_validate && _currentDetails.requestedQuantity == null) - ASubTitle(_subtitle.requiredWord,color: Colors.red,), - SizedBox(height: 4,), + if (_validate && _currentDetails.requestedQuantity == null) + ASubTitle( + _subtitle.requiredWord, + color: Colors.red, + ), + SizedBox( + height: 4, + ), ATextFormField( initialValue: (_currentDetails?.requestedQuantity ?? "").toString(), textAlign: TextAlign.center, controller: _requestedQuantityController, style: Theme.of(context).textTheme.subtitle1, - validator: (value) => - Validator.isNumeric(value) - ? null : "allow numbers only", + validator: (value) => Validator.isNumeric(value) ? null : "allow numbers only", textInputType: TextInputType.number, - onSaved: (value){ + onSaved: (value) { _currentDetails.requestedQuantity = double.tryParse(value); }, ), @@ -229,30 +254,30 @@ class _RequestGasRefillState extends State { text: _subtitle.add, onPressed: _addNewModel, ), - if(_formModel.details.isNotEmpty) - const ASubTitle("Gas Requests"), + if (_formModel.details.isNotEmpty) const ASubTitle("Gas Requests"), ListView.builder( - key: _DetailsKey, - shrinkWrap: true, - physics: const ClampingScrollPhysics(), - itemCount: _formModel.details.length, - itemBuilder: (context,index){ - final model = _formModel.details[index]; - return GasRefillCreateDetailsItem( - model: model, - onDelete: (){ - _formModel.details.remove(model); - setState(() {}); - }, - ); - } - ), + key: _DetailsKey, + shrinkWrap: true, + physics: const ClampingScrollPhysics(), + itemCount: _formModel.details.length, + itemBuilder: (context, index) { + final model = _formModel.details[index]; + return GasRefillCreateDetailsItem( + model: model, + onDelete: () { + _formModel.details.remove(model); + setState(() {}); + }, + ); + }), const SizedBox(height: 16), AButton( text: _subtitle.submit, onPressed: _onSubmit, ), - const SizedBox(height: 100,) + const SizedBox( + height: 100, + ) ], ), ), @@ -262,4 +287,3 @@ class _RequestGasRefillState extends State { ); } } - diff --git a/lib/views/pages/user/gas_refill/track_gas_refill.dart b/lib/views/pages/user/gas_refill/track_gas_refill.dart index 713c9530..aa3141c1 100644 --- a/lib/views/pages/user/gas_refill/track_gas_refill.dart +++ b/lib/views/pages/user/gas_refill/track_gas_refill.dart @@ -9,6 +9,7 @@ import 'package:test_sa/views/app_style/colors.dart'; import 'package:test_sa/views/widgets/buttons/app_back_button.dart'; import 'package:test_sa/views/widgets/gas_refill/gas_refill_list.dart'; import 'package:test_sa/views/widgets/loaders/loading_manager.dart'; + class TrackGasRefillPage extends StatefulWidget { static const String id = "/track-gas-refill"; @@ -18,8 +19,7 @@ class TrackGasRefillPage extends StatefulWidget { State createState() => _TrackGasRefillPageState(); } -class _TrackGasRefillPageState extends State - with TickerProviderStateMixin{ +class _TrackGasRefillPageState extends State with TickerProviderStateMixin { GasRefillProvider _gasRefillProvider; UserProvider _userProvider; SettingProvider _settingProvider; @@ -48,8 +48,8 @@ class _TrackGasRefillPageState extends State Column( children: [ Container( - color:AColors.white, - padding: const EdgeInsets.symmetric(horizontal: 0,vertical: 4), + color: AColors.white, + padding: const EdgeInsets.symmetric(horizontal: 0, vertical: 4), child: Column( children: [ Row( @@ -59,17 +59,15 @@ class _TrackGasRefillPageState extends State child: Center( child: Text( _subtitle.serviceRequests, - style: Theme.of(context).textTheme.headline6.copyWith( - color: AColors.grey3A, - fontStyle: FontStyle.italic - ), + style: Theme.of(context).textTheme.headline6.copyWith(color: AColors.grey3A, fontStyle: FontStyle.italic), ), ), ), - const SizedBox(width: 48,) + const SizedBox( + width: 48, + ) ], ), - ], ), ), @@ -87,7 +85,6 @@ class _TrackGasRefillPageState extends State ), ], ), - ], ), ), diff --git a/lib/views/pages/user/notifications/notifications_list.dart b/lib/views/pages/user/notifications/notifications_list.dart index 6034f1aa..61c7c331 100644 --- a/lib/views/pages/user/notifications/notifications_list.dart +++ b/lib/views/pages/user/notifications/notifications_list.dart @@ -6,6 +6,7 @@ import 'package:test_sa/views/pages/user/requests/future_request_service_details import 'package:test_sa/views/widgets/loaders/lazy_loading.dart'; import 'package:test_sa/views/widgets/loaders/no_item_found.dart'; import 'package:test_sa/views/widgets/notifications/notification_item.dart'; + class NotificationsList extends StatelessWidget { final List notifications; final bool nextPage; @@ -16,28 +17,26 @@ class NotificationsList extends StatelessWidget { @override Widget build(BuildContext context) { Subtitle _subtitle = AppLocalization.of(context).subtitle; - if(notifications.length == 0){ - return NoItemFound(message: _subtitle.notificationsNotFound,); + if (notifications.length == 0) { + return NoItemFound( + message: _subtitle.notificationsNotFound, + ); } return LazyLoading( nextPage: nextPage, onLazyLoad: onLazyLoad, child: ListView.builder( - physics: BouncingScrollPhysics(), - itemCount: notifications.length, - padding: EdgeInsets.symmetric(horizontal: 16,vertical: 8), - itemBuilder: (context,itemIndex){ + physics: BouncingScrollPhysics(), + itemCount: notifications.length, + padding: EdgeInsets.symmetric(horizontal: 16, vertical: 8), + itemBuilder: (context, itemIndex) { return NotificationItem( notification: notifications[itemIndex], - onPressed: (notification){ - Navigator.of(context).pushNamed( - FutureRequestServiceDetails.id, - arguments: notification.requestId - ); + onPressed: (notification) { + Navigator.of(context).pushNamed(FutureRequestServiceDetails.id, arguments: notification.requestId); }, ); - } - ), + }), ); } } diff --git a/lib/views/pages/user/notifications/notifications_page.dart b/lib/views/pages/user/notifications/notifications_page.dart index a0e85259..d06892de 100644 --- a/lib/views/pages/user/notifications/notifications_page.dart +++ b/lib/views/pages/user/notifications/notifications_page.dart @@ -9,14 +9,14 @@ import 'package:test_sa/views/app_style/colors.dart'; import 'package:test_sa/views/pages/user/notifications/notifications_list.dart'; import 'package:test_sa/views/widgets/buttons/app_back_button.dart'; import 'package:test_sa/views/widgets/loaders/loading_manager.dart'; + class NotificationsPage extends StatefulWidget { static final String id = "/notifications"; @override _NotificationsPageState createState() => _NotificationsPageState(); } -class _NotificationsPageState extends State - with TickerProviderStateMixin{ +class _NotificationsPageState extends State with TickerProviderStateMixin { NotificationsProvider _notificationsProvider; UserProvider _userProvider; SettingProvider _settingProvider; @@ -36,9 +36,9 @@ class _NotificationsPageState extends State onRefresh: () async { _notificationsProvider.reset(); await _notificationsProvider.getNotifications( - user: _userProvider.user, - host: _settingProvider.host, - hospitalId: _userProvider.user.hospital.id, + user: _userProvider.user, + host: _settingProvider.host, + hospitalId: _userProvider.user.hospital.id, ); }, child: Stack( @@ -46,8 +46,8 @@ class _NotificationsPageState extends State Column( children: [ Container( - color:AColors.primaryColor, - padding: const EdgeInsets.symmetric(horizontal: 0,vertical: 4), + color: AColors.primaryColor, + padding: const EdgeInsets.symmetric(horizontal: 0, vertical: 4), child: Column( children: [ Row( @@ -57,17 +57,15 @@ class _NotificationsPageState extends State child: Center( child: Text( _subtitle.notifications, - style: Theme.of(context).textTheme.headline6.copyWith( - color: AColors.white, - fontStyle: FontStyle.italic - ), + style: Theme.of(context).textTheme.headline6.copyWith(color: AColors.white, fontStyle: FontStyle.italic), ), ), ), - SizedBox(width: 48,) + SizedBox( + width: 48, + ) ], ), - ], ), ), @@ -86,7 +84,6 @@ class _NotificationsPageState extends State ), ], ), - ], ), ), diff --git a/lib/views/pages/user/profile_page.dart b/lib/views/pages/user/profile_page.dart index 0b3757a0..6b5c976c 100644 --- a/lib/views/pages/user/profile_page.dart +++ b/lib/views/pages/user/profile_page.dart @@ -16,6 +16,7 @@ import 'package:test_sa/views/widgets/buttons/app_button.dart'; import 'package:test_sa/views/widgets/departments/department_button.dart'; import 'package:test_sa/views/widgets/hospitals/hospital_button.dart'; import 'package:test_sa/views/widgets/loaders/loading_manager.dart'; + class ProfilePage extends StatefulWidget { static final String id = "/user/profile"; @override @@ -38,13 +39,13 @@ class _ProfilePageState extends State { _width = MediaQuery.of(context).size.width; _height = MediaQuery.of(context).size.height; Subtitle _subtitle = AppLocalization.of(context).subtitle; - if(_firstTime){ + if (_firstTime) { _user = User.fromJson(_userProvider.user.toJson()); _firstTime = false; } return Scaffold( key: _scaffoldKey, - body:LoadingManager( + body: LoadingManager( isLoading: _userProvider.isLoading, isFailedLoading: false, stateCode: 200, @@ -60,23 +61,19 @@ class _ProfilePageState extends State { Hero( tag: "logo", child: Image( - height: _height/4, + height: _height / 4, image: AssetImage("assets/images/logo.png"), ), ), Container( - padding: EdgeInsets.symmetric(horizontal: 16,vertical: 16), + padding: EdgeInsets.symmetric(horizontal: 16, vertical: 16), margin: EdgeInsets.symmetric(horizontal: 16), - decoration: BoxDecoration( - color: AColors.primaryColor, - borderRadius: BorderRadius.circular(AppStyle.getBorderRadius(context)), - boxShadow: [ - BoxShadow( - color: AColors.grey, - offset: Offset(0,-1), - ) - ] - ), + decoration: BoxDecoration(color: AColors.primaryColor, borderRadius: BorderRadius.circular(AppStyle.getBorderRadius(context)), boxShadow: [ + BoxShadow( + color: AColors.grey, + offset: Offset(0, -1), + ) + ]), child: Column( children: [ ATextFormField( @@ -85,13 +82,14 @@ class _ProfilePageState extends State { enable: false, prefixIconData: Icons.account_circle, style: Theme.of(context).textTheme.headline6, - validator: (value) => Validator.hasValue(value) - ? null : _subtitle.nameValidateMessage, - onSaved: (value){ + validator: (value) => Validator.hasValue(value) ? null : _subtitle.nameValidateMessage, + onSaved: (value) { _user.userName = value; }, ), - SizedBox(height: 8,), + SizedBox( + height: 8, + ), ATextFormField( initialValue: _user.email, hintText: _subtitle.email, @@ -99,110 +97,105 @@ class _ProfilePageState extends State { prefixIconData: Icons.email, textInputType: TextInputType.emailAddress, style: Theme.of(context).textTheme.headline6, - validator: (value) => Validator.isEmail(value) - ? null : _subtitle.emailValidateMessage, - onSaved: (value){ + validator: (value) => Validator.isEmail(value) ? null : _subtitle.emailValidateMessage, + onSaved: (value) { _user.email = value; }, ), - SizedBox(height: 8,), + SizedBox( + height: 8, + ), AbsorbPointer( child: HospitalButton( hospital: _user.hospital, - onHospitalPick: (hospital){ + onHospitalPick: (hospital) { _user.hospital = hospital; setState(() {}); }, ), ), - SizedBox(height: 8,), + SizedBox( + height: 8, + ), DepartmentButton( department: _user.department, - onDepartmentPick: (department){ + onDepartmentPick: (department) { _user.department = department; setState(() {}); }, ), - SizedBox(height: 8,), + SizedBox( + height: 8, + ), ATextFormField( initialValue: _user.phoneNumber, hintText: _subtitle.phoneNumber, style: Theme.of(context).textTheme.headline6, prefixIconData: Icons.phone_android, - validator: (value) => - Validator.isPhoneNumber(value) ? null : _subtitle.phoneNumberValidateMessage, + validator: (value) => Validator.isPhoneNumber(value) ? null : _subtitle.phoneNumberValidateMessage, textInputType: TextInputType.phone, - onSaved: (value){ + onSaved: (value) { _user.phoneNumber = value; }, ), - SizedBox(height: 8,), + SizedBox( + height: 8, + ), ATextFormField( initialValue: _user.whatsApp, hintText: _subtitle.whatsApp, style: Theme.of(context).textTheme.headline6, prefixIconData: FontAwesomeIcons.whatsapp, prefixIconSize: 36, - validator: (value) => - Validator.isPhoneNumber(value) ? null : _subtitle.phoneNumberValidateMessage, + validator: (value) => Validator.isPhoneNumber(value) ? null : _subtitle.phoneNumberValidateMessage, textInputType: TextInputType.phone, - onSaved: (value){ + onSaved: (value) { _user.whatsApp = value; }, ), ], ), ), - SizedBox(height: 16,), + SizedBox( + height: 16, + ), Center( child: SizedBox( height: _width / 8, - width: _width/1.2, + width: _width / 1.2, child: AButton( text: _subtitle.update, onPressed: () async { - if(!_formKey.currentState.validate()) - return; + if (!_formKey.currentState.validate()) return; _formKey.currentState.save(); - if(_user.department?.id == null){ - ScaffoldMessenger.of(context).showSnackBar( - SnackBar( - content: Text( - _subtitle.unitRequired - ), - ) - ); + if (_user.department?.id == null) { + ScaffoldMessenger.of(context).showSnackBar(SnackBar( + content: Text(_subtitle.unitRequired), + )); return; } int status = await _userProvider.updateProfile( user: _user, host: _settingProvider.host, ); - if(status >= 200 && status < 300){ + if (status >= 200 && status < 300) { _settingProvider.setUser(_userProvider.user); - ScaffoldMessenger.of(context).showSnackBar( - SnackBar( - content: Text( - _subtitle.requestCompleteSuccessfully - ), - ) - ); - }else{ - String errorMessage = HttpStatusManger.getStatusMessage( - status: status, subtitle: _subtitle); - ScaffoldMessenger.of(context).showSnackBar( - SnackBar( - content: Text( - errorMessage - ), - ) - ); + ScaffoldMessenger.of(context).showSnackBar(SnackBar( + content: Text(_subtitle.requestCompleteSuccessfully), + )); + } else { + String errorMessage = HttpStatusManger.getStatusMessage(status: status, subtitle: _subtitle); + ScaffoldMessenger.of(context).showSnackBar(SnackBar( + content: Text(errorMessage), + )); } }, ), ), ), - SizedBox(height: 32,), + SizedBox( + height: 32, + ), ], ), ), diff --git a/lib/views/pages/user/report_issues_page.dart b/lib/views/pages/user/report_issues_page.dart index a1641b24..3a2f3f3e 100644 --- a/lib/views/pages/user/report_issues_page.dart +++ b/lib/views/pages/user/report_issues_page.dart @@ -16,6 +16,7 @@ import 'package:test_sa/views/widgets/buttons/app_back_button.dart'; import 'package:test_sa/views/widgets/buttons/app_button.dart'; import 'package:test_sa/views/widgets/issues/report_issue_item.dart'; import 'package:test_sa/views/widgets/loaders/loading_manager.dart'; + class ReportIssuesPage extends StatefulWidget { static final String id = "/report-issue"; final ServiceRequest serviceRequest; @@ -64,22 +65,18 @@ class _ReportIssuesPageState extends State { ), child: Text( _subtitle.reportIssue, - style: Theme.of(context).textTheme.headline5.copyWith( - color: AColors.cyan, - fontWeight: FontWeight.bold - ), + style: Theme.of(context).textTheme.headline5.copyWith(color: AColors.cyan, fontWeight: FontWeight.bold), ), ), ), Image( - height: _height/8, + height: _height / 8, image: AssetImage("assets/images/logo.png"), ), - Container( padding: EdgeInsets.symmetric( - horizontal: 16, - vertical: 16, + horizontal: 16, + vertical: 16, ), decoration: BoxDecoration( color: AColors.grey, @@ -90,10 +87,9 @@ class _ReportIssuesPageState extends State { boxShadow: [ BoxShadow( color: AColors.grey, - offset: Offset(0,-1), + offset: Offset(0, -1), ) - ] - ), + ]), child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ @@ -102,32 +98,30 @@ class _ReportIssuesPageState extends State { hintText: _subtitle.title, textAlign: TextAlign.center, style: Theme.of(context).textTheme.headline6, - validator: (value) => - Validator.hasValue(value) - ? null : _subtitle.titleValidateMessage, + validator: (value) => Validator.hasValue(value) ? null : _subtitle.titleValidateMessage, textInputType: TextInputType.name, - onSaved: (value){ + onSaved: (value) { _issue.title = value; }, ), - SizedBox(height: 8,), - Column( - children: List.generate( - _issues.length, - (index) => ReportIssueItem( - isSelected: _issue.reports.contains(index), - issueInfo: _issues[index], - onChange: (info,value){ - if(value){ - _issue.reports.add(index); - } else { - _issue.reports.remove(index); - } - setState(() {}); - }, - ) - ) + SizedBox( + height: 8, ), + Column( + children: List.generate( + _issues.length, + (index) => ReportIssueItem( + isSelected: _issue.reports.contains(index), + issueInfo: _issues[index], + onChange: (info, value) { + if (value) { + _issue.reports.add(index); + } else { + _issue.reports.remove(index); + } + setState(() {}); + }, + ))), Padding( padding: const EdgeInsets.all(8.0), child: Text( @@ -139,7 +133,7 @@ class _ReportIssuesPageState extends State { hintText: _subtitle.description, style: Theme.of(context).textTheme.subtitle1, textInputType: TextInputType.multiline, - onSaved: (value){ + onSaved: (value) { _issue.description = value; }, ), @@ -148,20 +142,19 @@ class _ReportIssuesPageState extends State { child: AButton( text: _subtitle.submit, onPressed: () async { - if(!_formKey.currentState.validate()) - return; + if (!_formKey.currentState.validate()) return; _formKey.currentState.save(); _issue.serviceRequestId = widget.serviceRequest.id; - _isLoading =true; + _isLoading = true; setState(() {}); int status = await _serviceRequestsProvider.createIssueReport( user: _userProvider.user, host: _settingProvider.host, issue: _issue, ); - _isLoading =false; + _isLoading = false; setState(() {}); - if(status >= 200 && status < 300){ + if (status >= 200 && status < 300) { Fluttertoast.showToast( msg: _subtitle.requestCompleteSuccessfully, ); diff --git a/lib/views/pages/user/requests/create_request.dart b/lib/views/pages/user/requests/create_request.dart index b5c71478..c344698f 100644 --- a/lib/views/pages/user/requests/create_request.dart +++ b/lib/views/pages/user/requests/create_request.dart @@ -31,6 +31,7 @@ import 'package:test_sa/views/widgets/status/service_request/service_request_pri import 'package:test_sa/views/widgets/status/service_request/service_request_through_mune.dart'; import 'package:test_sa/views/widgets/status/service_request/service_request_types_mune.dart'; import 'package:test_sa/views/widgets/titles/app_sub_title.dart'; + class CreateRequestPage extends StatefulWidget { static final String id = "/create-request"; @@ -136,40 +137,56 @@ class _CreateRequestPageState extends State { setState(() {}); }, ), - const SizedBox(height: 8,), + const SizedBox( + height: 8, + ), const ASubTitle("Priority"), - const SizedBox(height: 4,), + const SizedBox( + height: 4, + ), ServiceRequestPriorityMenu( initialValue: _serviceRequest.priority, - onSelect: (status){ + onSelect: (status) { _serviceRequest.priority = status; }, ), - const SizedBox(height: 8,), + const SizedBox( + height: 8, + ), const ASubTitle("Defect Type"), - const SizedBox(height: 4,), + const SizedBox( + height: 4, + ), ServiceRequestDefectTypesMenu( initialValue: _serviceRequest.defectType, - onSelect: (status){ + onSelect: (status) { _serviceRequest.defectType = status; }, ), 12.height, - const SizedBox(height: 8,), + const SizedBox( + height: 8, + ), const ASubTitle("Type"), - const SizedBox(height: 4,), + const SizedBox( + height: 4, + ), ServiceRequestTypesMenu( initialValue: _serviceRequest.type, - onSelect: (status){ + onSelect: (status) { _serviceRequest.type = status; }, ), - const SizedBox(height: 8,), + const SizedBox( + height: 8, + ), const ASubTitle("Through"), - const SizedBox(height: 4,), + const SizedBox( + height: 4, + ), ServiceRequestedThroughMenu( - initialValue: const Lookup(name: "App",value: 3), - onSelect: (status){ + initialValue: const Lookup(name: "App", value: 3), + onSelect: (status) { _serviceRequest.requestedThrough = status; }, ), @@ -210,9 +227,8 @@ class _CreateRequestPageState extends State { _serviceRequest.deviceId = _device?.id ?? ""; _isLoading = true; setState(() {}); - _serviceRequest.devicePhotos = _deviceImages.map( - (e) => "${e.path.split("/").last}|${base64Encode(e.readAsBytesSync())}").toList(); - if(_serviceRequest.audio != null){ + _serviceRequest.devicePhotos = _deviceImages.map((e) => "${e.path.split("/").last}|${base64Encode(e.readAsBytesSync())}").toList(); + if (_serviceRequest.audio != null) { final file = File(_serviceRequest.audio); _serviceRequest.audio = "${file.path.split("/").last}|${base64Encode(file.readAsBytesSync())}"; } diff --git a/lib/views/pages/user/requests/future_request_service_details.dart b/lib/views/pages/user/requests/future_request_service_details.dart index 1c2dbe38..3ece8e61 100644 --- a/lib/views/pages/user/requests/future_request_service_details.dart +++ b/lib/views/pages/user/requests/future_request_service_details.dart @@ -9,6 +9,7 @@ import 'package:test_sa/models/subtitle.dart'; import 'package:test_sa/views/pages/user/requests/request_details.dart'; import 'package:test_sa/views/widgets/loaders/app_loading.dart'; import 'package:test_sa/views/widgets/loaders/failed_loading.dart'; + class FutureRequestServiceDetails extends StatefulWidget { static final String id = "/service-request-details"; @@ -17,7 +18,6 @@ class FutureRequestServiceDetails extends StatefulWidget { } class _FutureRequestServiceDetailsState extends State { - UserProvider _userProvider; SettingProvider _settingProvider; @override @@ -28,19 +28,16 @@ class _FutureRequestServiceDetailsState extends State( - future: ServiceRequestsProvider().getSingleServiceRequest( - requestId: requestId, - user: _userProvider.user, - host: _settingProvider.host, - subtitle: _subtitle - ), - builder: (BuildContext context, AsyncSnapshot snapshot){ - if(snapshot.hasError) + future: ServiceRequestsProvider().getSingleServiceRequest(requestId: requestId, user: _userProvider.user, host: _settingProvider.host, subtitle: _subtitle), + builder: (BuildContext context, AsyncSnapshot snapshot) { + if (snapshot.hasError) return FailedLoading( message: snapshot.error.toString(), - onReload: (){setState(() {});}, + onReload: () { + setState(() {}); + }, ); - if(snapshot.hasData){ + if (snapshot.hasData) { return RequestDetailsPage( serviceRequest: snapshot.data, ); diff --git a/lib/views/pages/user/requests/report/create_service_report.dart b/lib/views/pages/user/requests/report/create_service_report.dart index f077fbd7..3afe07ba 100644 --- a/lib/views/pages/user/requests/report/create_service_report.dart +++ b/lib/views/pages/user/requests/report/create_service_report.dart @@ -37,18 +37,17 @@ import 'package:test_sa/views/widgets/status/report/service_report_type.dart'; import 'package:test_sa/views/widgets/status/report/service_status.dart'; import 'package:test_sa/views/widgets/timer/app_timer.dart'; import 'package:test_sa/views/widgets/titles/app_sub_title.dart'; + class CreateServiceReport extends StatefulWidget { static final String id = "/create-service-report"; - final ServiceRequest request ; + final ServiceRequest request; const CreateServiceReport({Key key, this.request}) : super(key: key); @override _CreateServiceReportState createState() => _CreateServiceReportState(); } -class _CreateServiceReportState extends State with TickerProviderStateMixin{ - - +class _CreateServiceReportState extends State with TickerProviderStateMixin { UserProvider _userProvider; SettingProvider _settingProvider; ServiceRequestsProvider _serviceRequestsProvider; @@ -67,11 +66,10 @@ class _CreateServiceReportState extends State with TickerPr @override void initState() { _serviceReport = ServiceReport( - visitDate: DateTime.now(), - //type: const Lookup(value: 2), - device: widget.request.device, - parts: [] - ); + visitDate: DateTime.now(), + //type: const Lookup(value: 2), + device: widget.request.device, + parts: []); super.initState(); } @@ -81,6 +79,7 @@ class _CreateServiceReportState extends State with TickerPr _workPreformedController.dispose(); super.dispose(); } + @override Widget build(BuildContext context) { _userProvider = Provider.of(context); @@ -102,52 +101,54 @@ class _CreateServiceReportState extends State with TickerPr ListView( children: [ //AppNameBar(), - const SizedBox(height: 16,), + const SizedBox( + height: 16, + ), Center( child: Padding( padding: const EdgeInsets.all(8.0), child: Text( _subtitle.newServiceReport, - style: Theme.of(context).textTheme.headline5.copyWith( - color: AColors.cyan, - fontSize: 28, - fontWeight: FontWeight.bold - ), + style: Theme.of(context).textTheme.headline5.copyWith(color: AColors.cyan, fontSize: 28, fontWeight: FontWeight.bold), ), ), ), Container( padding: const EdgeInsets.symmetric(horizontal: 16), - margin: const EdgeInsets.symmetric(horizontal: 16,vertical: 16), - decoration: BoxDecoration( + margin: const EdgeInsets.symmetric(horizontal: 16, vertical: 16), + decoration: BoxDecoration(color: AColors.grey, borderRadius: BorderRadius.circular(AppStyle.getBorderRadius(context)), boxShadow: [ + const BoxShadow( color: AColors.grey, - borderRadius: BorderRadius.circular(AppStyle.getBorderRadius(context)), - boxShadow: [ - const BoxShadow( - color: AColors.grey, - offset: Offset(0,-1), - ) - ] - ), + offset: Offset(0, -1), + ) + ]), child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ - const SizedBox(height: 8,), + const SizedBox( + height: 8, + ), Wrap( spacing: 10, children: [ - ASubTitle("${_subtitle.callId}: ${widget.request.requestCode}",font: 14,), - widget.request.deviceSerialNumber == null ? const SizedBox(): - ASubTitle("${_subtitle.deviceSN}: ${widget.request.deviceSerialNumber}",font: 14,), + ASubTitle( + "${_subtitle.callId}: ${widget.request.requestCode}", + font: 14, + ), + widget.request.deviceSerialNumber == null + ? const SizedBox() + : ASubTitle( + "${_subtitle.deviceSN}: ${widget.request.deviceSerialNumber}", + font: 14, + ), Text( "${_subtitle.customer}: ${widget.request.hospitalName}", style: Theme.of(context).textTheme.subtitle1.copyWith( - fontWeight: FontWeight.bold, - fontSize: 12, - ), + fontWeight: FontWeight.bold, + fontSize: 12, + ), textScaleFactor: AppStyle.getScaleFactor(context), ) - ], ), const Divider(), @@ -181,9 +182,12 @@ class _CreateServiceReportState extends State with TickerPr crossAxisAlignment: CrossAxisAlignment.start, children: [ ASubTitle(_subtitle.visitDate), - _validate && _serviceReport.visitDate == null ? - ASubTitle(_subtitle.requiredWord,color: Colors.red,): - const SizedBox.shrink(), + _validate && _serviceReport.visitDate == null + ? ASubTitle( + _subtitle.requiredWord, + color: Colors.red, + ) + : const SizedBox.shrink(), Row( children: [ Expanded( @@ -191,7 +195,7 @@ class _CreateServiceReportState extends State with TickerPr date: _serviceReport.visitDate, from: DateTime.now().subtract(const Duration(days: 365)), to: DateTime.now().add(const Duration(days: 365)), - onDatePicker: (date){ + onDatePicker: (date) { _serviceReport.visitDate = date; setState(() {}); }, @@ -202,10 +206,11 @@ class _CreateServiceReportState extends State with TickerPr ], ), ), - ], ), - const SizedBox(height: 8,), + const SizedBox( + height: 8, + ), // device sn Visibility( visible: widget.request.deviceSerialNumber == null, @@ -213,33 +218,47 @@ class _CreateServiceReportState extends State with TickerPr crossAxisAlignment: CrossAxisAlignment.start, children: [ ASubTitle(_subtitle.deviceSN), - _validate && _serviceReport.device?.id == null ? - ASubTitle(_subtitle.requiredWord,color: Colors.red,): - const SizedBox.shrink(), + _validate && _serviceReport.device?.id == null + ? ASubTitle( + _subtitle.requiredWord, + color: Colors.red, + ) + : const SizedBox.shrink(), AutoCompleteDeviceField( hospitalId: widget.request.hospitalId, initialValue: _serviceReport.device, - onPick: (id){ + onPick: (id) { _serviceReport.device.id = id; }, ), - const SizedBox(height: 8,), + const SizedBox( + height: 8, + ), ], ), ), - const SizedBox(height: 8,), + const SizedBox( + height: 8, + ), ASubTitle(_subtitle.serviceType), - _validate && _serviceReport.assetType == null ? - ASubTitle(_subtitle.requiredWord,color: Colors.red,): - const SizedBox.shrink(), - const SizedBox(height: 4,), + _validate && _serviceReport.assetType == null + ? ASubTitle( + _subtitle.requiredWord, + color: Colors.red, + ) + : const SizedBox.shrink(), + const SizedBox( + height: 4, + ), ServiceAssetTypeMenu( initialValue: _serviceReport.assetType, - onSelect: (status){ + onSelect: (status) { _serviceReport.assetType = status; }, ), - const SizedBox(height: 8,), + const SizedBox( + height: 8, + ), // Report status and Service Type Row( children: [ @@ -249,40 +268,51 @@ class _CreateServiceReportState extends State with TickerPr crossAxisAlignment: CrossAxisAlignment.start, children: [ ASubTitle(_subtitle.reportStatus), - _validate && _serviceReport.status == null ? - ASubTitle(_subtitle.requiredWord,color: Colors.red,): - const SizedBox.shrink(), - const SizedBox(height: 4,), + _validate && _serviceReport.status == null + ? ASubTitle( + _subtitle.requiredWord, + color: Colors.red, + ) + : const SizedBox.shrink(), + const SizedBox( + height: 4, + ), ServiceReportStatusMenu( report: _serviceReport, - onSelect: (status){ + onSelect: (status) { _serviceReport.status = status; }, ), ], ), ), - const SizedBox(width: 8,), + const SizedBox( + width: 8, + ), // Provider.of(context).isLoading == null // ? const SizedBox.shrink(): // Call's last Situation Consumer( builder: (_, provider, __) { - if(provider.isLoading == null) return const SizedBox.shrink(); - return Expanded( + if (provider.isLoading == null) return const SizedBox.shrink(); + return Expanded( child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ ASubTitle(_subtitle.callLastSituation), - _validate && _serviceReport.callLastSituation == null ? - ASubTitle(_subtitle.requiredWord,color: Colors.red,): - const SizedBox.shrink(), - const SizedBox(height: 4,), + _validate && _serviceReport.callLastSituation == null + ? ASubTitle( + _subtitle.requiredWord, + color: Colors.red, + ) + : const SizedBox.shrink(), + const SizedBox( + height: 4, + ), ServiceReportLastCallsMenu( report: _serviceReport, - onSelect: (status){ - if(status?.value == 12 - || _serviceReport.callLastSituation?.value == 12){ + onSelect: (status) { + if (status?.value == 12 || _serviceReport.callLastSituation?.value == 12) { _serviceReport.callLastSituation = status; setState(() {}); } else { @@ -297,69 +327,83 @@ class _CreateServiceReportState extends State with TickerPr ), ], ), - SizedBox(height: 8 * AppStyle.getScaleFactor(context),), + SizedBox( + height: 8 * AppStyle.getScaleFactor(context), + ), const ASubTitle("Assign Employee"), - const SizedBox(height: 8,), - _validate && _serviceReport.engineer == null ? - ASubTitle(_subtitle.requiredWord,color: Colors.red,): - const SizedBox.shrink(), - const SizedBox(height: 4,), + const SizedBox( + height: 8, + ), + _validate && _serviceReport.engineer == null + ? ASubTitle( + _subtitle.requiredWord, + color: Colors.red, + ) + : const SizedBox.shrink(), + const SizedBox( + height: 4, + ), EngineersMenu( initialValue: _serviceReport.engineer, - onSelect: (engineer){ + onSelect: (engineer) { _serviceReport.engineer = engineer; }, ), - const SizedBox(height: 8,), + const SizedBox( + height: 8, + ), // invoice number & code - _serviceReport.callLastSituation?.id != 12 ? const SizedBox.shrink(): - Row( - children: [ - Expanded( - child: Column( - crossAxisAlignment: CrossAxisAlignment.start, + _serviceReport.callLastSituation?.id != 12 + ? const SizedBox.shrink() + : Row( children: [ - ASubTitle(_subtitle.invoiceNumber), - const SizedBox(height: 8,), - ATextFormField( - initialValue: _serviceReport?.invoiceNumber, - textAlign: TextAlign.center, - style: Theme.of(context).textTheme.subtitle1, - validator: (value) => - Validator.hasValue(value) - ? null : _subtitle.requiredWord, - textInputType: TextInputType.number, - onSaved: (value){ - _serviceReport.invoiceNumber = value; - }, + Expanded( + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + ASubTitle(_subtitle.invoiceNumber), + const SizedBox( + height: 8, + ), + ATextFormField( + initialValue: _serviceReport?.invoiceNumber, + textAlign: TextAlign.center, + style: Theme.of(context).textTheme.subtitle1, + validator: (value) => Validator.hasValue(value) ? null : _subtitle.requiredWord, + textInputType: TextInputType.number, + onSaved: (value) { + _serviceReport.invoiceNumber = value; + }, + ), + ], + ), ), - ], - ), - ), - const SizedBox(width: 8,), - Expanded( - child: Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - ASubTitle(_subtitle.invoiceCode), - const SizedBox(height: 4,), - ATextFormField( - initialValue: _serviceReport?.invoiceCode, - textAlign: TextAlign.center, - style: Theme.of(context).textTheme.subtitle1, - validator: (value) => - Validator.hasValue(value) - ? null : _subtitle.requiredWord, - textInputType: TextInputType.text, - onSaved: (value){ - _serviceReport.invoiceCode = value; - }, + const SizedBox( + width: 8, + ), + Expanded( + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + ASubTitle(_subtitle.invoiceCode), + const SizedBox( + height: 4, + ), + ATextFormField( + initialValue: _serviceReport?.invoiceCode, + textAlign: TextAlign.center, + style: Theme.of(context).textTheme.subtitle1, + validator: (value) => Validator.hasValue(value) ? null : _subtitle.requiredWord, + textInputType: TextInputType.text, + onSaved: (value) { + _serviceReport.invoiceCode = value; + }, + ), + ], + ), ), ], ), - ), - ], - ), // const SizedBox(height: 8,), // Row( @@ -421,7 +465,9 @@ class _CreateServiceReportState extends State with TickerPr // ), // const SizedBox(height: 8,), - const SizedBox(height: 8,), + const SizedBox( + height: 8, + ), Row( children: [ // reasons @@ -430,17 +476,21 @@ class _CreateServiceReportState extends State with TickerPr crossAxisAlignment: CrossAxisAlignment.start, children: [ ASubTitle(_subtitle.reasons), - const SizedBox(height: 4,), + const SizedBox( + height: 4, + ), ServiceReportReasonsMenu( initialValue: _serviceReport.reason, - onSelect: (status){ + onSelect: (status) { _serviceReport.reason = status; }, ), ], ), ), - const SizedBox(width: 8,), + const SizedBox( + width: 8, + ), Expanded( child: Column( crossAxisAlignment: CrossAxisAlignment.start, @@ -449,8 +499,8 @@ class _CreateServiceReportState extends State with TickerPr AMiniOneImagePicker( //error: _validate && _serviceReport.image == null, image: _image, - onPick: (image){ - _image =image; + onPick: (image) { + _image = image; _serviceReport.image = "${image.path.split("/").last}|${base64Encode(image.readAsBytesSync())}"; }, ), @@ -459,7 +509,9 @@ class _CreateServiceReportState extends State with TickerPr ), ], ), - const SizedBox(height: 8,), + const SizedBox( + height: 8, + ), // Traveling Hours & Working Hours Row( children: [ @@ -468,13 +520,15 @@ class _CreateServiceReportState extends State with TickerPr crossAxisAlignment: CrossAxisAlignment.start, children: [ ASubTitle(_subtitle.workingHours), - const SizedBox(height: 8,), + const SizedBox( + height: 8, + ), Row( children: [ Expanded( child: AppTimer( timer: _serviceReport.timer, - onChange: (timer) async{ + onChange: (timer) async { _serviceReport.timer = timer; return true; }, @@ -523,7 +577,9 @@ class _CreateServiceReportState extends State with TickerPr // ), ], ), - const SizedBox(height: 8,), + const SizedBox( + height: 8, + ), // Operating Hours and Job Sheet Number // Row( // children: [ @@ -571,29 +627,39 @@ class _CreateServiceReportState extends State with TickerPr // ], // ), //const SizedBox(height: 8,), - const SizedBox(height: 8,), + const SizedBox( + height: 8, + ), const ASubTitle("Nurse Signature"), ESignature( oldSignature: _serviceReport.signatureNurse, newSignature: _serviceReport.localNurseSignature, - onSaved: (signature){ - if(signature == null || signature.isEmpty) {return;} + onSaved: (signature) { + if (signature == null || signature.isEmpty) { + return; + } _serviceReport.localNurseSignature = signature; _serviceReport.signatureNurse = "${DateTime.now().toIso8601String()}.png|${base64Encode(signature)}"; }, ), - const SizedBox(height: 8,), + const SizedBox( + height: 8, + ), const ASubTitle("Engineer Signature"), ESignature( oldSignature: _serviceReport.signatureEngineer, newSignature: _serviceReport.localNurseSignature, - onSaved: (signature){ - if(signature == null || signature.isEmpty) {return;} + onSaved: (signature) { + if (signature == null || signature.isEmpty) { + return; + } _serviceReport.localNurseSignature = signature; _serviceReport.signatureEngineer = "${DateTime.now().toIso8601String()}.png|${base64Encode(signature)}"; }, ), - const SizedBox(height: 8,), + const SizedBox( + height: 8, + ), // Part Number and Quantity Row( children: [ @@ -603,45 +669,49 @@ class _CreateServiceReportState extends State with TickerPr crossAxisAlignment: CrossAxisAlignment.start, children: [ ASubTitle(_subtitle.partNumber), - _validate && _serviceReport.parts == null ? - ASubTitle(_subtitle.requiredWord,color: Colors.red,): - const SizedBox.shrink(), - const SizedBox(height: 4,), + _validate && _serviceReport.parts == null + ? ASubTitle( + _subtitle.requiredWord, + color: Colors.red, + ) + : const SizedBox.shrink(), + const SizedBox( + height: 4, + ), AutoCompletePartsField( - onPick: (part){ + onPick: (part) { _serviceReport.parts.add(part); }, ), ], ), ), - ], ), - SizedBox(height: 8*AppStyle.getScaleFactor(context),), + SizedBox( + height: 8 * AppStyle.getScaleFactor(context), + ), Row( children: [ - Expanded(flex:3,child: Text(_subtitle.number)), - Expanded(flex: 1,child: Text(_subtitle.quantity)), + Expanded(flex: 3, child: Text(_subtitle.number)), + Expanded(flex: 1, child: Text(_subtitle.quantity)), ], ), Column( - children: List.generate( - _serviceReport.parts.length, - (index) { - Part _part = _serviceReport.parts[index]; - return PartItem( - part: _part, - onDelete: (part){ - _serviceReport.parts.remove(part); - setState(() {}); - }, - ); - } - ), + children: List.generate(_serviceReport.parts.length, (index) { + Part _part = _serviceReport.parts[index]; + return PartItem( + part: _part, + onDelete: (part) { + _serviceReport.parts.remove(part); + setState(() {}); + }, + ); + }), + ), + const SizedBox( + height: 16, ), - const SizedBox(height: 16,), - ], ), ), @@ -651,47 +721,37 @@ class _CreateServiceReportState extends State with TickerPr text: _subtitle.submit, onPressed: () async { _validate = true; - if(!_formKey.currentState.validate()){ + if (!_formKey.currentState.validate()) { setState(() {}); return; } - if(!_serviceReport.validate()) return; + if (!_serviceReport.validate()) return; _formKey.currentState.save(); - _isLoading =true; + _isLoading = true; setState(() {}); - - - int status = await _serviceRequestsProvider.createServiceReport( - user: _userProvider.user, - host: _settingProvider.host, - report: _serviceReport, - request: widget.request - ); - _isLoading =false; + int status = await _serviceRequestsProvider.createServiceReport(user: _userProvider.user, host: _settingProvider.host, report: _serviceReport, request: widget.request); + _isLoading = false; setState(() {}); - if(status >= 200 && status < 300){ + if (status >= 200 && status < 300) { Fluttertoast.showToast( - msg: _subtitle.requestCompleteSuccessfully, + msg: _subtitle.requestCompleteSuccessfully, ); Navigator.of(context).pop(); Navigator.of(context).pop(); - }else{ - String errorMessage = HttpStatusManger.getStatusMessage( - status: status, subtitle: _subtitle); - ScaffoldMessenger.of(context).showSnackBar( - SnackBar( - content: Text( - errorMessage - ), - ) - ); + } else { + String errorMessage = HttpStatusManger.getStatusMessage(status: status, subtitle: _subtitle); + ScaffoldMessenger.of(context).showSnackBar(SnackBar( + content: Text(errorMessage), + )); } }, ), ), - const SizedBox(height: 300,) + const SizedBox( + height: 300, + ) ], ), const ABackButton(), diff --git a/lib/views/pages/user/requests/report/edit_service_report.dart b/lib/views/pages/user/requests/report/edit_service_report.dart index bfc8f4f5..61692bbd 100644 --- a/lib/views/pages/user/requests/report/edit_service_report.dart +++ b/lib/views/pages/user/requests/report/edit_service_report.dart @@ -36,9 +36,10 @@ import 'package:test_sa/views/widgets/status/report/service_report_type.dart'; import 'package:test_sa/views/widgets/status/report/service_status.dart'; import 'package:test_sa/views/widgets/timer/app_timer.dart'; import 'package:test_sa/views/widgets/titles/app_sub_title.dart'; + class EditServiceReport extends StatefulWidget { static final String id = "/edit-service-report"; - final ServiceRequest request ; + final ServiceRequest request; final ServiceReport report; const EditServiceReport({Key key, this.request, this.report}) : super(key: key); @@ -46,9 +47,7 @@ class EditServiceReport extends StatefulWidget { _EditServiceReportState createState() => _EditServiceReportState(); } -class _EditServiceReportState extends State with TickerProviderStateMixin{ - - +class _EditServiceReportState extends State with TickerProviderStateMixin { UserProvider _userProvider; SettingProvider _settingProvider; ServiceRequestsProvider _serviceRequestsProvider; @@ -76,6 +75,7 @@ class _EditServiceReportState extends State with TickerProvid _workPreformedController.dispose(); super.dispose(); } + @override Widget build(BuildContext context) { _userProvider = Provider.of(context); @@ -97,52 +97,54 @@ class _EditServiceReportState extends State with TickerProvid ListView( children: [ //AppNameBar(), - const SizedBox(height: 16,), + const SizedBox( + height: 16, + ), Center( child: Padding( padding: const EdgeInsets.all(8.0), child: Text( _subtitle.editServiceReport, - style: Theme.of(context).textTheme.headline5.copyWith( - color: AColors.cyan, - fontSize: 28, - fontWeight: FontWeight.bold - ), + style: Theme.of(context).textTheme.headline5.copyWith(color: AColors.cyan, fontSize: 28, fontWeight: FontWeight.bold), ), ), ), Container( padding: const EdgeInsets.symmetric(horizontal: 16), - margin: const EdgeInsets.symmetric(horizontal: 16,vertical: 16), - decoration: BoxDecoration( + margin: const EdgeInsets.symmetric(horizontal: 16, vertical: 16), + decoration: BoxDecoration(color: AColors.grey, borderRadius: BorderRadius.circular(AppStyle.getBorderRadius(context)), boxShadow: [ + const BoxShadow( color: AColors.grey, - borderRadius: BorderRadius.circular(AppStyle.getBorderRadius(context)), - boxShadow: [ - const BoxShadow( - color: AColors.grey, - offset: Offset(0,-1), - ) - ] - ), + offset: Offset(0, -1), + ) + ]), child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ - const SizedBox(height: 8,), + const SizedBox( + height: 8, + ), Wrap( spacing: 10, children: [ - ASubTitle("${_subtitle.callId}: ${widget.request.requestCode}",font: 14,), - widget.request.deviceSerialNumber == null ? const SizedBox(): - ASubTitle("${_subtitle.deviceSN}: ${widget.request.deviceSerialNumber}",font: 14,), + ASubTitle( + "${_subtitle.callId}: ${widget.request.requestCode}", + font: 14, + ), + widget.request.deviceSerialNumber == null + ? const SizedBox() + : ASubTitle( + "${_subtitle.deviceSN}: ${widget.request.deviceSerialNumber}", + font: 14, + ), Text( "${_subtitle.customer}: ${widget.request.hospitalName}", style: Theme.of(context).textTheme.subtitle1.copyWith( - fontWeight: FontWeight.bold, - fontSize: 12, - ), + fontWeight: FontWeight.bold, + fontSize: 12, + ), textScaleFactor: AppStyle.getScaleFactor(context), ) - ], ), const Divider(), @@ -156,29 +158,39 @@ class _EditServiceReportState extends State with TickerProvid crossAxisAlignment: CrossAxisAlignment.start, children: [ ASubTitle(_subtitle.reportType), - _validate && _serviceReport.type == null ? - ASubTitle(_subtitle.requiredWord,color: Colors.red,): - const SizedBox.shrink(), - const SizedBox(height: 4,), + _validate && _serviceReport.type == null + ? ASubTitle( + _subtitle.requiredWord, + color: Colors.red, + ) + : const SizedBox.shrink(), + const SizedBox( + height: 4, + ), ServiceReportTypeMenu( initialValue: _serviceReport.type, - onSelect: (status){ + onSelect: (status) { _serviceReport.type = status; }, ), ], ), ), - const SizedBox(width: 8,), + const SizedBox( + width: 8, + ), // visit date Expanded( child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ ASubTitle(_subtitle.visitDate), - _validate && _serviceReport.visitDate == null ? - ASubTitle(_subtitle.requiredWord,color: Colors.red,): - const SizedBox.shrink(), + _validate && _serviceReport.visitDate == null + ? ASubTitle( + _subtitle.requiredWord, + color: Colors.red, + ) + : const SizedBox.shrink(), Row( children: [ Expanded( @@ -186,7 +198,7 @@ class _EditServiceReportState extends State with TickerProvid date: _serviceReport.visitDate, from: DateTime.now().subtract(const Duration(days: 365)), to: DateTime.now().add(const Duration(days: 365)), - onDatePicker: (date){ + onDatePicker: (date) { _serviceReport.visitDate = date; setState(() {}); }, @@ -197,58 +209,84 @@ class _EditServiceReportState extends State with TickerProvid ], ), ), - ], ), - const SizedBox(height: 8,), + const SizedBox( + height: 8, + ), // device sn Visibility( - visible: true,//widget.report.device == null, + visible: true, //widget.report.device == null, child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ ASubTitle(_subtitle.deviceSN), - _validate && _serviceReport.device?.id == null ? - ASubTitle(_subtitle.requiredWord,color: Colors.red,): - const SizedBox.shrink(), + _validate && _serviceReport.device?.id == null + ? ASubTitle( + _subtitle.requiredWord, + color: Colors.red, + ) + : const SizedBox.shrink(), AutoCompleteDeviceField( hospitalId: widget.request.hospitalId, initialValue: _serviceReport.device, - onPick: (id){ + onPick: (id) { _serviceReport.device.id = id; }, ), - const SizedBox(height: 8,), + const SizedBox( + height: 8, + ), ], ), ), - const SizedBox(height: 8,), + const SizedBox( + height: 8, + ), ASubTitle(_subtitle.serviceType), - _validate && _serviceReport.assetType == null ? - ASubTitle(_subtitle.requiredWord,color: Colors.red,): - const SizedBox.shrink(), - const SizedBox(height: 4,), + _validate && _serviceReport.assetType == null + ? ASubTitle( + _subtitle.requiredWord, + color: Colors.red, + ) + : const SizedBox.shrink(), + const SizedBox( + height: 4, + ), ServiceAssetTypeMenu( initialValue: _serviceReport.assetType, - onSelect: (status){ + onSelect: (status) { _serviceReport.assetType = status; }, ), - const SizedBox(height: 8,), - SizedBox(height: 8 * AppStyle.getScaleFactor(context),), + const SizedBox( + height: 8, + ), + SizedBox( + height: 8 * AppStyle.getScaleFactor(context), + ), const ASubTitle("Assign Employee"), - const SizedBox(height: 8,), - _validate && _serviceReport.engineer == null ? - ASubTitle(_subtitle.requiredWord,color: Colors.red,): - const SizedBox.shrink(), - const SizedBox(height: 4,), + const SizedBox( + height: 8, + ), + _validate && _serviceReport.engineer == null + ? ASubTitle( + _subtitle.requiredWord, + color: Colors.red, + ) + : const SizedBox.shrink(), + const SizedBox( + height: 4, + ), EngineersMenu( initialValue: _serviceReport.engineer, - onSelect: (engineer){ + onSelect: (engineer) { _serviceReport.engineer = engineer; }, ), - const SizedBox(height: 8,), + const SizedBox( + height: 8, + ), // Report status and Service Type Row( children: [ @@ -258,37 +296,48 @@ class _EditServiceReportState extends State with TickerProvid crossAxisAlignment: CrossAxisAlignment.start, children: [ ASubTitle(_subtitle.reportStatus), - _validate && _serviceReport.status == null ? - ASubTitle(_subtitle.requiredWord,color: Colors.red,): - const SizedBox.shrink(), - const SizedBox(height: 4,), + _validate && _serviceReport.status == null + ? ASubTitle( + _subtitle.requiredWord, + color: Colors.red, + ) + : const SizedBox.shrink(), + const SizedBox( + height: 4, + ), ServiceReportStatusMenu( report: _serviceReport, - onSelect: (status){ + onSelect: (status) { _serviceReport.status = status; }, ), ], ), ), - const SizedBox(width: 8,), + const SizedBox( + width: 8, + ), Consumer( builder: (_, provider, __) { - if(provider.isLoading == null) return const SizedBox.shrink(); - return Expanded( + if (provider.isLoading == null) return const SizedBox.shrink(); + return Expanded( child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ ASubTitle(_subtitle.callLastSituation), - _validate && _serviceReport.callLastSituation == null ? - ASubTitle(_subtitle.requiredWord,color: Colors.red,): - const SizedBox.shrink(), - const SizedBox(height: 4,), + _validate && _serviceReport.callLastSituation == null + ? ASubTitle( + _subtitle.requiredWord, + color: Colors.red, + ) + : const SizedBox.shrink(), + const SizedBox( + height: 4, + ), ServiceReportLastCallsMenu( report: _serviceReport, - onSelect: (status){ - if(status?.value == 12 - || _serviceReport.callLastSituation?.value == 12){ + onSelect: (status) { + if (status?.value == 12 || _serviceReport.callLastSituation?.value == 12) { _serviceReport.callLastSituation = status; setState(() {}); } else { @@ -303,56 +352,61 @@ class _EditServiceReportState extends State with TickerProvid ), ], ), - const SizedBox(height: 8,), + const SizedBox( + height: 8, + ), // invoice number & code - _serviceReport.callLastSituation?.value != 12 ? const SizedBox.shrink(): - Row( - children: [ - Expanded( - child: Column( - crossAxisAlignment: CrossAxisAlignment.start, + _serviceReport.callLastSituation?.value != 12 + ? const SizedBox.shrink() + : Row( children: [ - ASubTitle(_subtitle.invoiceNumber), - const SizedBox(height: 8,), - ATextFormField( - initialValue: _serviceReport?.invoiceNumber, - textAlign: TextAlign.center, - style: Theme.of(context).textTheme.subtitle1, - validator: (value) => - Validator.hasValue(value) - ? null : _subtitle.requiredWord, - textInputType: TextInputType.number, - onSaved: (value){ - _serviceReport.invoiceNumber = value; - }, + Expanded( + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + ASubTitle(_subtitle.invoiceNumber), + const SizedBox( + height: 8, + ), + ATextFormField( + initialValue: _serviceReport?.invoiceNumber, + textAlign: TextAlign.center, + style: Theme.of(context).textTheme.subtitle1, + validator: (value) => Validator.hasValue(value) ? null : _subtitle.requiredWord, + textInputType: TextInputType.number, + onSaved: (value) { + _serviceReport.invoiceNumber = value; + }, + ), + ], + ), ), - ], - ), - ), - const SizedBox(width: 8,), - Expanded( - child: Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - ASubTitle(_subtitle.invoiceCode), - const SizedBox(height: 4,), - ATextFormField( - initialValue: _serviceReport?.invoiceCode, - textAlign: TextAlign.center, - style: Theme.of(context).textTheme.subtitle1, - validator: (value) => - Validator.hasValue(value) - ? null : _subtitle.requiredWord, - textInputType: TextInputType.text, - onSaved: (value){ - _serviceReport.invoiceCode = value; - }, + const SizedBox( + width: 8, + ), + Expanded( + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + ASubTitle(_subtitle.invoiceCode), + const SizedBox( + height: 4, + ), + ATextFormField( + initialValue: _serviceReport?.invoiceCode, + textAlign: TextAlign.center, + style: Theme.of(context).textTheme.subtitle1, + validator: (value) => Validator.hasValue(value) ? null : _subtitle.requiredWord, + textInputType: TextInputType.text, + onSaved: (value) { + _serviceReport.invoiceCode = value; + }, + ), + ], + ), ), ], ), - ), - ], - ), // const SizedBox(height: 8,), // Row( @@ -414,7 +468,9 @@ class _EditServiceReportState extends State with TickerProvid // ), // const SizedBox(height: 8,), - const SizedBox(height: 8,), + const SizedBox( + height: 8, + ), Row( children: [ // reasons @@ -423,17 +479,21 @@ class _EditServiceReportState extends State with TickerProvid crossAxisAlignment: CrossAxisAlignment.start, children: [ ASubTitle(_subtitle.reasons), - const SizedBox(height: 4,), + const SizedBox( + height: 4, + ), ServiceReportReasonsMenu( initialValue: _serviceReport.reason, - onSelect: (status){ + onSelect: (status) { _serviceReport.reason = status; }, ), ], ), ), - const SizedBox(width: 8,), + const SizedBox( + width: 8, + ), Expanded( child: Column( crossAxisAlignment: CrossAxisAlignment.start, @@ -442,8 +502,8 @@ class _EditServiceReportState extends State with TickerProvid AMiniOneImagePicker( //error: _validate && _serviceReport.image == null, image: _image, - onPick: (image){ - _image =image; + onPick: (image) { + _image = image; _serviceReport.image = base64Encode(image.readAsBytesSync()); }, ), @@ -452,7 +512,9 @@ class _EditServiceReportState extends State with TickerProvid ), ], ), - const SizedBox(height: 8,), + const SizedBox( + height: 8, + ), // Traveling Hours & Working Hours Row( children: [ @@ -461,13 +523,15 @@ class _EditServiceReportState extends State with TickerProvid crossAxisAlignment: CrossAxisAlignment.start, children: [ ASubTitle(_subtitle.workingHours), - const SizedBox(height: 8,), + const SizedBox( + height: 8, + ), Row( children: [ Expanded( child: AppTimer( timer: _serviceReport.timer, - onChange: (timer) async{ + onChange: (timer) async { _serviceReport.timer = timer; return true; }, @@ -516,7 +580,9 @@ class _EditServiceReportState extends State with TickerProvid // ), ], ), - const SizedBox(height: 8,), + const SizedBox( + height: 8, + ), // Operating Hours and Job Sheet Number // Row( // children: [ @@ -564,29 +630,39 @@ class _EditServiceReportState extends State with TickerProvid // ], // ), //const SizedBox(height: 8,), - const SizedBox(height: 8,), + const SizedBox( + height: 8, + ), const ASubTitle("Nurse Signature"), ESignature( oldSignature: _serviceReport.signatureNurse, newSignature: _serviceReport.localNurseSignature, - onChange: (signature){ - if(signature == null || signature.isEmpty) {return;} + onChange: (signature) { + if (signature == null || signature.isEmpty) { + return; + } _serviceReport.localNurseSignature = signature; _serviceReport.signatureNurse = "${DateTime.now().toIso8601String()}.png|${base64Encode(signature)}"; }, ), - const SizedBox(height: 8,), + const SizedBox( + height: 8, + ), const ASubTitle("Engineer Signature"), ESignature( oldSignature: _serviceReport.signatureEngineer, newSignature: _serviceReport.localNurseSignature, - onChange: (signature){ - if(signature == null || signature.isEmpty) {return;} + onChange: (signature) { + if (signature == null || signature.isEmpty) { + return; + } _serviceReport.localNurseSignature = signature; _serviceReport.signatureEngineer = "${DateTime.now().toIso8601String()}.png|${base64Encode(signature)}"; }, ), - const SizedBox(height: 8,), + const SizedBox( + height: 8, + ), // Part Number and Quantity Row( children: [ @@ -596,12 +672,17 @@ class _EditServiceReportState extends State with TickerProvid crossAxisAlignment: CrossAxisAlignment.start, children: [ ASubTitle(_subtitle.partNumber), - _validate && _serviceReport.parts == null ? - ASubTitle(_subtitle.requiredWord,color: Colors.red,): - const SizedBox.shrink(), - const SizedBox(height: 4,), + _validate && _serviceReport.parts == null + ? ASubTitle( + _subtitle.requiredWord, + color: Colors.red, + ) + : const SizedBox.shrink(), + const SizedBox( + height: 4, + ), AutoCompletePartsField( - onPick: (part){ + onPick: (part) { _serviceReport.parts.add(part); setState(() {}); }, @@ -609,34 +690,33 @@ class _EditServiceReportState extends State with TickerProvid ], ), ), - ], ), - SizedBox(height: 8*AppStyle.getScaleFactor(context),), + SizedBox( + height: 8 * AppStyle.getScaleFactor(context), + ), Row( children: [ - Expanded(flex:3,child: Text(_subtitle.number)), - Expanded(flex: 1,child: Text(_subtitle.quantity)), + Expanded(flex: 3, child: Text(_subtitle.number)), + Expanded(flex: 1, child: Text(_subtitle.quantity)), ], ), Column( - children: List.generate( - _serviceReport.parts.length, - (index) { - Part _part = _serviceReport.parts[index]; - return PartItem( - part: _part, - onDelete: (part){ - _serviceReport.parts.remove(part); - setState(() {}); - }, - ); - } - ), + children: List.generate(_serviceReport.parts.length, (index) { + Part _part = _serviceReport.parts[index]; + return PartItem( + part: _part, + onDelete: (part) { + _serviceReport.parts.remove(part); + setState(() {}); + }, + ); + }), ), - const SizedBox(height: 16,), - + const SizedBox( + height: 16, + ), ], ), ), @@ -646,48 +726,40 @@ class _EditServiceReportState extends State with TickerProvid text: _subtitle.update, onPressed: () async { _validate = true; - if(!_formKey.currentState.validate()){ + if (!_formKey.currentState.validate()) { setState(() {}); return; } - if(!_serviceReport.validate()) { + if (!_serviceReport.validate()) { setState(() {}); return; } _formKey.currentState.save(); - _isLoading =true; + _isLoading = true; setState(() {}); - int status = await _serviceRequestsProvider.updateServiceReport( - user: _userProvider.user, - host: _settingProvider.host, - report: _serviceReport, - request: widget.request - ); - _isLoading =false; + int status = await _serviceRequestsProvider.updateServiceReport(user: _userProvider.user, host: _settingProvider.host, report: _serviceReport, request: widget.request); + _isLoading = false; setState(() {}); - if(status >= 200 && status < 300){ + if (status >= 200 && status < 300) { Fluttertoast.showToast( - msg: _subtitle.requestCompleteSuccessfully, + msg: _subtitle.requestCompleteSuccessfully, ); Navigator.of(context).pop(); Navigator.of(context).pop(); - }else{ - String errorMessage = HttpStatusManger.getStatusMessage( - status: status, subtitle: _subtitle); - ScaffoldMessenger.of(context).showSnackBar( - SnackBar( - content: Text( - errorMessage - ), - ) - ); + } else { + String errorMessage = HttpStatusManger.getStatusMessage(status: status, subtitle: _subtitle); + ScaffoldMessenger.of(context).showSnackBar(SnackBar( + content: Text(errorMessage), + )); } }, ), ), - const SizedBox(height: 300,) + const SizedBox( + height: 300, + ) ], ), const ABackButton(), diff --git a/lib/views/pages/user/requests/requests_page.dart b/lib/views/pages/user/requests/requests_page.dart index 6c04d822..fb73812e 100644 --- a/lib/views/pages/user/requests/requests_page.dart +++ b/lib/views/pages/user/requests/requests_page.dart @@ -12,14 +12,14 @@ import 'package:test_sa/views/widgets/buttons/app_icon_button.dart'; import 'package:test_sa/views/widgets/loaders/loading_manager.dart'; import 'package:test_sa/views/widgets/requests/service_request_list.dart'; import 'package:test_sa/views/widgets/search/service_request_search_bar.dart'; + class ServiceRequestsPage extends StatefulWidget { static final String id = "/service-requests"; @override _ServiceRequestsPageState createState() => _ServiceRequestsPageState(); } -class _ServiceRequestsPageState extends State - with TickerProviderStateMixin{ +class _ServiceRequestsPageState extends State with TickerProviderStateMixin { ServiceRequestsProvider _serviceRequestsProvider; UserProvider _userProvider; SettingProvider _settingProvider; @@ -31,7 +31,7 @@ class _ServiceRequestsPageState extends State _userProvider = Provider.of(context); _settingProvider = Provider.of(context); Subtitle _subtitle = AppLocalization.of(context).subtitle; - if(_firstTime){ + if (_firstTime) { _serviceRequestsProvider.reset(); _firstTime = false; } @@ -45,9 +45,9 @@ class _ServiceRequestsPageState extends State onRefresh: () async { _serviceRequestsProvider.reset(); await _serviceRequestsProvider.getRequests( - user: _userProvider.user, - host: _settingProvider.host, - hospitalId: _userProvider.user.hospital?.id, + user: _userProvider.user, + host: _settingProvider.host, + hospitalId: _userProvider.user.hospital?.id, ); }, child: Stack( @@ -55,8 +55,8 @@ class _ServiceRequestsPageState extends State Column( children: [ Container( - color:AColors.primaryColor, - padding: const EdgeInsets.symmetric(horizontal: 0,vertical: 4), + color: AColors.primaryColor, + padding: const EdgeInsets.symmetric(horizontal: 0, vertical: 4), child: Column( children: [ Row( @@ -66,10 +66,7 @@ class _ServiceRequestsPageState extends State child: Center( child: Text( _subtitle.serviceRequests, - style: Theme.of(context).textTheme.headline6.copyWith( - color: AColors.white, - fontStyle: FontStyle.italic - ), + style: Theme.of(context).textTheme.headline6.copyWith(color: AColors.white, fontStyle: FontStyle.italic), ), ), ), @@ -83,22 +80,23 @@ class _ServiceRequestsPageState extends State ServiceRequestSearch _temp = await showModalBottomSheet( context: context, isScrollControlled: true, - builder: (context){ + builder: (context) { return ServiceRequestsSearchDialog( initialSearchValue: _serviceRequestsProvider.search, ); }); - if(_temp != null){ + if (_temp != null) { _serviceRequestsProvider.search = _temp; _serviceRequestsProvider.reset(); setState(() {}); } }, ), - SizedBox(width: 16,) + SizedBox( + width: 16, + ) ], ), - ], ), ), @@ -107,9 +105,9 @@ class _ServiceRequestsPageState extends State nextPage: _serviceRequestsProvider.nextPage, onLazyLoad: () async { await _serviceRequestsProvider.getRequests( - user: _userProvider.user, - host: _settingProvider.host, - hospitalId: _userProvider.user.hospital.id, + user: _userProvider.user, + host: _settingProvider.host, + hospitalId: _userProvider.user.hospital.id, ); }, requests: _serviceRequestsProvider.serviceRequests, @@ -117,7 +115,6 @@ class _ServiceRequestsPageState extends State ), ], ), - ], ), ), diff --git a/lib/views/pages/user/visits/pantry/edit_pentry.dart b/lib/views/pages/user/visits/pantry/edit_pentry.dart index a758bb93..d0df5e34 100644 --- a/lib/views/pages/user/visits/pantry/edit_pentry.dart +++ b/lib/views/pages/user/visits/pantry/edit_pentry.dart @@ -21,13 +21,13 @@ import 'package:test_sa/views/widgets/pentry/pentry_ppm_check_list_form.dart'; class EditPentry extends StatefulWidget { final Pentry pentry; final Visit visit; - const EditPentry({Key key,this.pentry, this.visit}) : super(key: key); + const EditPentry({Key key, this.pentry, this.visit}) : super(key: key); @override State createState() => _EditPentryState(); } -class _EditPentryState extends State with SingleTickerProviderStateMixin{ +class _EditPentryState extends State with SingleTickerProviderStateMixin { bool _isLoading = false; bool _validate = false; Subtitle _subtitle; @@ -41,29 +41,24 @@ class _EditPentryState extends State with SingleTickerProviderStateM _onSubmit() async { _validate = true; - if(!_pentry.validate()) { - setState(() { }); + if (!_pentry.validate()) { + setState(() {}); return; } _isLoading = true; setState(() {}); - int status = await _regularVisitsProvider.updatePentry( - user: _userProvider.user, - host: _settingProvider.host, - pentry: _pentry, - visit: widget.visit - ); - _isLoading =false; + int status = await _regularVisitsProvider.updatePentry(user: _userProvider.user, host: _settingProvider.host, pentry: _pentry, visit: widget.visit); + _isLoading = false; setState(() {}); - if(status >= 200 && status < 300){ + if (status >= 200 && status < 300) { Fluttertoast.showToast( msg: _subtitle.requestCompleteSuccessfully, ); Navigator.of(context).pop(); Navigator.of(context).pop(); - }else{ + } else { // String errorMessage = HttpStatusManger.getStatusMessage( // status: status, subtitle: _subtitle); // Fluttertoast.showToast( @@ -75,9 +70,9 @@ class _EditPentryState extends State with SingleTickerProviderStateM @override void initState() { _pentry = widget.pentry.copyWith(); - if(_pentry.pmKits.isEmpty) _pentry.pmKits.add(PMKit()); - if(_pentry.calibrationTools.isEmpty) _pentry.calibrationTools.add(CalibrationTool()); - if(_pentry.ppmCheckLists.isEmpty) _pentry.ppmCheckLists.add(PPMCheckList()); + if (_pentry.pmKits.isEmpty) _pentry.pmKits.add(PMKit()); + if (_pentry.calibrationTools.isEmpty) _pentry.calibrationTools.add(CalibrationTool()); + if (_pentry.ppmCheckLists.isEmpty) _pentry.ppmCheckLists.add(PPMCheckList()); _tabController = TabController(length: 4, vsync: this); super.initState(); } @@ -98,96 +93,105 @@ class _EditPentryState extends State with SingleTickerProviderStateM key: _scaffoldKey, body: SafeArea( child: LoadingManager( - isLoading: _isLoading, - isFailedLoading: false, - stateCode: 200, - onRefresh: () async {}, - child: Column( - children: [ - Material( - color: Theme.of(context).colorScheme.primary, - child: Padding( - padding: const EdgeInsets.all(2.0), - child: TabBar( - controller: _tabController, - isScrollable: true, - onTap: (index){ - setState(() {}); - }, - tabs: const [ - Tab(text: "PPM Check List",), - Tab(text: "Calibration Tools",), - Tab(text: "PK Kits",), - Tab(text: "Pentry",), - ]), - ), - ), - Expanded( - child: Stack( - children: [ - TabBarView( - physics: const NeverScrollableScrollPhysics(), - controller: _tabController, - children: [ - PentryPPMCheckListForm( - models: _pentry.ppmCheckLists, - enableValidate: _validate, - ), - PentryCalibrationToolForm( - models: _pentry.calibrationTools, - enableValidate: _validate, - ), - PentryPMKitForm( - models: _pentry.pmKits, - enableValidate: _validate, - ), - PentryInfoForm( - model: _pentry, - enableValidate: _validate, - ) + isLoading: _isLoading, + isFailedLoading: false, + stateCode: 200, + onRefresh: () async {}, + child: Column( + children: [ + Material( + color: Theme.of(context).colorScheme.primary, + child: Padding( + padding: const EdgeInsets.all(2.0), + child: TabBar( + controller: _tabController, + isScrollable: true, + onTap: (index) { + setState(() {}); + }, + tabs: const [ + Tab( + text: "PPM Check List", + ), + Tab( + text: "Calibration Tools", + ), + Tab( + text: "PK Kits", + ), + Tab( + text: "Pentry", + ), + ]), + ), + ), + Expanded( + child: Stack( + children: [ + TabBarView( + physics: const NeverScrollableScrollPhysics(), + controller: _tabController, + children: [ + PentryPPMCheckListForm( + models: _pentry.ppmCheckLists, + enableValidate: _validate, + ), + PentryCalibrationToolForm( + models: _pentry.calibrationTools, + enableValidate: _validate, + ), + PentryPMKitForm( + models: _pentry.pmKits, + enableValidate: _validate, + ), + PentryInfoForm( + model: _pentry, + enableValidate: _validate, + ) + ], + ), + Align( + alignment: Alignment.bottomCenter, + child: Padding( + padding: const EdgeInsets.all(8.0), + child: Row( + children: [ + if (_tabController.index != 0) + ASmallButton( + text: _subtitle.back, + onPressed: () { + _tabController.animateTo( + _tabController.index - 1, + ); + setState(() {}); + }, + ), + const Spacer(), + if (_tabController.index != _tabController.length - 1) + ASmallButton( + text: _subtitle.next, + onPressed: () { + _tabController.animateTo( + _tabController.index + 1, + ); + setState(() {}); + }, + ), + if (_tabController.index == _tabController.length - 1) + ASmallButton( + text: _subtitle.update, + onPressed: _onSubmit, + ), + ], + ), + ), + ) ], - ), - Align( - alignment: Alignment.bottomCenter, - child: Padding( - padding: const EdgeInsets.all(8.0), - child: Row( - children: [ - if(_tabController.index != 0) - ASmallButton( - text: _subtitle.back, - onPressed: (){ - _tabController.animateTo(_tabController.index - 1,); - setState(() {}); - }, - ), - const Spacer(), - if(_tabController.index != _tabController.length -1) - ASmallButton( - text: _subtitle.next, - onPressed: (){ - _tabController.animateTo(_tabController.index + 1,); - setState(() {}); - }, - ), - if(_tabController.index == _tabController.length -1) - ASmallButton( - text: _subtitle.update, - onPressed: _onSubmit, - ), - ], - ), - ), - ) - ], - ), - ), - - ], - ) - ), + ), + ), + ], + )), ), ); } } - diff --git a/lib/views/pages/user/visits/pantry/future_edit_pently.dart b/lib/views/pages/user/visits/pantry/future_edit_pently.dart index 161df3ce..1f050f58 100644 --- a/lib/views/pages/user/visits/pantry/future_edit_pently.dart +++ b/lib/views/pages/user/visits/pantry/future_edit_pently.dart @@ -10,8 +10,8 @@ import 'package:test_sa/models/visits/visit.dart'; import 'package:test_sa/views/pages/user/visits/pantry/edit_pentry.dart'; import 'package:test_sa/views/widgets/loaders/app_loading.dart'; import 'package:test_sa/views/widgets/loaders/failed_loading.dart'; -class FutureEditPentry extends StatefulWidget { +class FutureEditPentry extends StatefulWidget { final Visit visit; const FutureEditPentry({Key key, this.visit}) : super(key: key); @@ -21,7 +21,6 @@ class FutureEditPentry extends StatefulWidget { } class _FutureEditPentryState extends State { - UserProvider _userProvider; SettingProvider _settingProvider; @override @@ -32,20 +31,17 @@ class _FutureEditPentryState extends State { Subtitle subtitle = AppLocalization.of(context).subtitle; return Scaffold( body: FutureBuilder( - future: RegularVisitsProvider().getPently( - user: _userProvider.user, - host: _settingProvider.host, - id: widget.visit.id - ), - builder: (BuildContext context, AsyncSnapshot snapshot){ - if(snapshot.hasError) { - + future: RegularVisitsProvider().getPently(user: _userProvider.user, host: _settingProvider.host, id: widget.visit.id), + builder: (BuildContext context, AsyncSnapshot snapshot) { + if (snapshot.hasError) { return FailedLoading( message: subtitle.failedToCompleteRequest, - onReload: (){setState(() {});}, + onReload: () { + setState(() {}); + }, ); } - if(snapshot.hasData){ + if (snapshot.hasData) { return EditPentry( pentry: snapshot.data, visit: widget.visit, diff --git a/lib/views/pages/user/visits/preventive_maintenance_visits_page.dart b/lib/views/pages/user/visits/preventive_maintenance_visits_page.dart index d61c9841..9dccd448 100644 --- a/lib/views/pages/user/visits/preventive_maintenance_visits_page.dart +++ b/lib/views/pages/user/visits/preventive_maintenance_visits_page.dart @@ -18,14 +18,14 @@ import 'package:test_sa/views/widgets/buttons/app_icon_button.dart'; import 'package:test_sa/views/widgets/loaders/loading_manager.dart'; import 'package:test_sa/views/widgets/search/visits_search_bar.dart'; import 'package:test_sa/views/widgets/visits/visits_list.dart'; + class PreventiveMaintenanceVisitsPage extends StatefulWidget { static final String id = "/preventive-maintenance-visits"; @override _PreventiveMaintenanceVisitsPageState createState() => _PreventiveMaintenanceVisitsPageState(); } -class _PreventiveMaintenanceVisitsPageState extends State - with TickerProviderStateMixin{ +class _PreventiveMaintenanceVisitsPageState extends State with TickerProviderStateMixin { PreventiveMaintenanceVisitsProvider _visitsProvider; UserProvider _userProvider; SettingProvider _settingProvider; @@ -57,8 +57,8 @@ class _PreventiveMaintenanceVisitsPageState extends State( context: context, barrierDismissible: false, @@ -151,24 +152,17 @@ class _PreventiveMaintenanceVisitsPageState extends State= 200 && status < 300){ + if (status >= 200 && status < 300) { Fluttertoast.showToast( msg: _subtitle.preventiveMaintenanceUpdatedSuccessfully, toastLength: Toast.LENGTH_LONG, gravity: ToastGravity.BOTTOM, ); - }else{ + } else { Fluttertoast.showToast( - msg: HttpStatusManger.getStatusMessage( - status: status, - subtitle: _subtitle - ), + msg: HttpStatusManger.getStatusMessage(status: status, subtitle: _subtitle), toastLength: Toast.LENGTH_LONG, gravity: ToastGravity.BOTTOM, ); @@ -180,7 +174,6 @@ class _PreventiveMaintenanceVisitsPageState extends State _RegularVisitsPageState(); } -class _RegularVisitsPageState extends State - with TickerProviderStateMixin{ +class _RegularVisitsPageState extends State with TickerProviderStateMixin { RegularVisitsProvider _visitsProvider; UserProvider _userProvider; SettingProvider _settingProvider; @@ -47,8 +47,8 @@ class _RegularVisitsPageState extends State _visitsProvider.reset(); //_visitsProvider.visitsSearch = VisitsSearch(); await _visitsProvider.getVisits( - user: _userProvider.user, - host: _settingProvider.host, + user: _userProvider.user, + host: _settingProvider.host, ); }, child: Stack( @@ -56,8 +56,8 @@ class _RegularVisitsPageState extends State Column( children: [ Container( - color:AColors.primaryColor, - padding: const EdgeInsets.symmetric(horizontal: 0,vertical: 4), + color: AColors.primaryColor, + padding: const EdgeInsets.symmetric(horizontal: 0, vertical: 4), child: Column( children: [ Row( @@ -67,10 +67,7 @@ class _RegularVisitsPageState extends State child: Center( child: Text( _subtitle.preventiveMaintenance, - style: Theme.of(context).textTheme.headline6.copyWith( - color: AColors.white, - fontStyle: FontStyle.italic - ), + style: Theme.of(context).textTheme.headline6.copyWith(color: AColors.white, fontStyle: FontStyle.italic), ), ), ), @@ -78,7 +75,7 @@ class _RegularVisitsPageState extends State duration: Duration(milliseconds: 400), child: AIconButton( key: ValueKey(_expandedSearch), - iconData: _expandedSearch ? Icons.keyboard_arrow_up :Icons.search, + iconData: _expandedSearch ? Icons.keyboard_arrow_up : Icons.search, color: AColors.secondaryColor, buttonSize: 42, backgroundColor: AColors.white, @@ -86,23 +83,24 @@ class _RegularVisitsPageState extends State VisitsSearch _temp = await showModalBottomSheet( context: context, isScrollControlled: true, - builder: (context){ + builder: (context) { return VisitsSearchDialog( initialSearchValue: _visitsProvider.visitsSearch, ); }); - if(_temp != null){ - _visitsProvider.visitsSearch.fromSearch(_temp) ; + if (_temp != null) { + _visitsProvider.visitsSearch.fromSearch(_temp); _visitsProvider.reset(); setState(() {}); } }, ), ), - SizedBox(width: 16,) + SizedBox( + width: 16, + ) ], ), - ], ), ), @@ -112,7 +110,7 @@ class _RegularVisitsPageState extends State padding: const EdgeInsets.all(8.0), child: AButton( text: _subtitle.clearSearch, - onPressed: (){ + onPressed: () { _visitsProvider.visitsSearch = VisitsSearch(); _visitsProvider.reset(); setState(() {}); @@ -125,8 +123,8 @@ class _RegularVisitsPageState extends State nextPage: _visitsProvider.nextPage, onLazyLoad: () async { await _visitsProvider.getVisits( - user: _userProvider.user, - host: _settingProvider.host, + user: _userProvider.user, + host: _settingProvider.host, ); }, onEditGroup: (visits) async { @@ -134,10 +132,13 @@ class _RegularVisitsPageState extends State isScrollControlled: true, context: context, builder: (context) { - return UpdateVisitsGroupSheet(visits: visits,title: _subtitle.updateRegularVisits,); + return UpdateVisitsGroupSheet( + visits: visits, + title: _subtitle.updateRegularVisits, + ); }, - )as VisitsGroup; - if(_group != null){ + ) as VisitsGroup; + if (_group != null) { showDialog( context: context, barrierDismissible: false, @@ -148,24 +149,17 @@ class _RegularVisitsPageState extends State ); }, ); - int status = await _visitsProvider.updateGroupOfVisits( - user: _userProvider.user, - host: _settingProvider.host, - group: _group - ); + int status = await _visitsProvider.updateGroupOfVisits(user: _userProvider.user, host: _settingProvider.host, group: _group); Navigator.of(context).pop(); - if(status >= 200 && status < 300){ + if (status >= 200 && status < 300) { Fluttertoast.showToast( - msg: _subtitle.preventiveMaintenanceUpdatedSuccessfully, - toastLength: Toast.LENGTH_LONG, - gravity: ToastGravity.BOTTOM, + msg: _subtitle.preventiveMaintenanceUpdatedSuccessfully, + toastLength: Toast.LENGTH_LONG, + gravity: ToastGravity.BOTTOM, ); - }else{ + } else { Fluttertoast.showToast( - msg: HttpStatusManger.getStatusMessage( - status: status, - subtitle: _subtitle - ), + msg: HttpStatusManger.getStatusMessage(status: status, subtitle: _subtitle), toastLength: Toast.LENGTH_LONG, gravity: ToastGravity.BOTTOM, ); @@ -177,7 +171,6 @@ class _RegularVisitsPageState extends State ), ], ), - ], ), ), diff --git a/lib/views/pages/user/visits/update_visits_group_sheet.dart b/lib/views/pages/user/visits/update_visits_group_sheet.dart index 8b0368ec..7068b2aa 100644 --- a/lib/views/pages/user/visits/update_visits_group_sheet.dart +++ b/lib/views/pages/user/visits/update_visits_group_sheet.dart @@ -14,6 +14,7 @@ import 'package:test_sa/views/widgets/buttons/app_button.dart'; import 'package:test_sa/views/widgets/buttons/app_small_button.dart'; import 'package:test_sa/views/widgets/status/employee/engineers_mune.dart'; import 'package:test_sa/views/widgets/visits/visit_status.dart'; + class UpdateVisitsGroupSheet extends StatefulWidget { final List visits; final String title; @@ -70,20 +71,24 @@ class _UpdateVisitsGroupSheetState extends State { ), ASmallButton( text: _subtitle.cancel, - onPressed: (){ + onPressed: () { Navigator.of(context).pop(); }, ), ], ), - SizedBox(height: 8 * AppStyle.getScaleFactor(context),), + SizedBox( + height: 8 * AppStyle.getScaleFactor(context), + ), EngineersMenu( initialValue: _group.engineer, - onSelect: (engineer){ + onSelect: (engineer) { _group.engineer = engineer; }, ), - SizedBox(height: 8 * AppStyle.getScaleFactor(context),), + SizedBox( + height: 8 * AppStyle.getScaleFactor(context), + ), // AOneImagePicker( // image: _image, // onPick: (image){ @@ -91,146 +96,138 @@ class _UpdateVisitsGroupSheetState extends State { // _group.image = base64Encode(image.readAsBytesSync()); // }, // ), - // SizedBox(height: 12 * AppStyle.getScaleFactor(context),), - // ATextFormField( - // initialValue: _group.jobSheetNumber, - // hintText: _subtitle.jobSheetNumber, - // style: Theme.of(context).textTheme.headline6, - // onSaved: (value){ - // _group.jobSheetNumber = value; - // }, - // ), - // SizedBox(height: 8 * AppStyle.getScaleFactor(context),), - // ATextFormField( - // initialValue: _group.workingHours, - // hintText: _subtitle.workingHours, - // style: Theme.of(context).textTheme.headline6, - // onSaved: (value){ - // _group.workingHours = value; - // }, - // ), - // SizedBox(height: 8 * AppStyle.getScaleFactor(context),), - // ATextFormField( - // initialValue: _group.travelingHours, - // hintText: _subtitle.travelingHours, - // style: Theme.of(context).textTheme.headline6, - // onSaved: (value){ - // _group.travelingHours = value; - // }, - // ), - // SizedBox(height: 8 * AppStyle.getScaleFactor(context),), - // Row( - // children: [ - // Expanded( - // child: Text( - // "${_subtitle.date} :", - // style: Theme.of(context).textTheme.subtitle1, - // textScaleFactor: AppStyle.getScaleFactor(context), - // ), - // ), - // ADatePicker( - // date: _group.date ?? DateTime.now(), - // onDatePicker: (date){ - // _group.date = date; - // setState(() {}); - // }, - // ), - // ], - // ), - // // SizedBox(height: 8 * AStyling.getScaleFactor(context),), - // Text( - // "${_subtitle.status} :", - // style: Theme.of(context).textTheme.subtitle1, - // textScaleFactor: AppStyle.getScaleFactor(context), - // ), - // SizedBox(height: 8 * AppStyle.getScaleFactor(context),), - // Center( - // child: Wrap( - // spacing: 10, - // runSpacing: 10, - // children: List.generate( - // status.length, - // (index) { - // bool isSelected = _group.status == status[index]; - // return FilterItem( - // isSelected: isSelected, - // onSelected: (){ - // if(isSelected) - // _group.status = null; - // else - // _group.status = status[index]; - // - // setState(() {}); - // }, - // status: status[index], - // ); - // } - // - // ), - // ), - // ), - // Text( - // "${_subtitle.taskStatus} :", - // style: Theme.of(context).textTheme.subtitle1, - // textScaleFactor: AppStyle.getScaleFactor(context), - // ), - // SizedBox(height: 8 * AppStyle.getScaleFactor(context),), - // Center( - // child: Wrap( - // spacing: 10, - // runSpacing: 10, - // children: List.generate( - // taskStatus.length, - // (index) { - // bool isSelected = _group.taskStatus == taskStatus[index]; - // return FilterItem( - // isSelected: isSelected, - // onSelected: (){ - // if(isSelected) - // _group.taskStatus = null; - // else - // _group.taskStatus = taskStatus[index]; - // - // setState(() {}); - // }, - // status: taskStatus[index], - // ); - // } - // - // ), - // ), - // ), - SizedBox(height: 8 * AppStyle.getScaleFactor(context),), + // SizedBox(height: 12 * AppStyle.getScaleFactor(context),), + // ATextFormField( + // initialValue: _group.jobSheetNumber, + // hintText: _subtitle.jobSheetNumber, + // style: Theme.of(context).textTheme.headline6, + // onSaved: (value){ + // _group.jobSheetNumber = value; + // }, + // ), + // SizedBox(height: 8 * AppStyle.getScaleFactor(context),), + // ATextFormField( + // initialValue: _group.workingHours, + // hintText: _subtitle.workingHours, + // style: Theme.of(context).textTheme.headline6, + // onSaved: (value){ + // _group.workingHours = value; + // }, + // ), + // SizedBox(height: 8 * AppStyle.getScaleFactor(context),), + // ATextFormField( + // initialValue: _group.travelingHours, + // hintText: _subtitle.travelingHours, + // style: Theme.of(context).textTheme.headline6, + // onSaved: (value){ + // _group.travelingHours = value; + // }, + // ), + // SizedBox(height: 8 * AppStyle.getScaleFactor(context),), + // Row( + // children: [ + // Expanded( + // child: Text( + // "${_subtitle.date} :", + // style: Theme.of(context).textTheme.subtitle1, + // textScaleFactor: AppStyle.getScaleFactor(context), + // ), + // ), + // ADatePicker( + // date: _group.date ?? DateTime.now(), + // onDatePicker: (date){ + // _group.date = date; + // setState(() {}); + // }, + // ), + // ], + // ), + // // SizedBox(height: 8 * AStyling.getScaleFactor(context),), + // Text( + // "${_subtitle.status} :", + // style: Theme.of(context).textTheme.subtitle1, + // textScaleFactor: AppStyle.getScaleFactor(context), + // ), + // SizedBox(height: 8 * AppStyle.getScaleFactor(context),), + // Center( + // child: Wrap( + // spacing: 10, + // runSpacing: 10, + // children: List.generate( + // status.length, + // (index) { + // bool isSelected = _group.status == status[index]; + // return FilterItem( + // isSelected: isSelected, + // onSelected: (){ + // if(isSelected) + // _group.status = null; + // else + // _group.status = status[index]; + // + // setState(() {}); + // }, + // status: status[index], + // ); + // } + // + // ), + // ), + // ), + // Text( + // "${_subtitle.taskStatus} :", + // style: Theme.of(context).textTheme.subtitle1, + // textScaleFactor: AppStyle.getScaleFactor(context), + // ), + // SizedBox(height: 8 * AppStyle.getScaleFactor(context),), + // Center( + // child: Wrap( + // spacing: 10, + // runSpacing: 10, + // children: List.generate( + // taskStatus.length, + // (index) { + // bool isSelected = _group.taskStatus == taskStatus[index]; + // return FilterItem( + // isSelected: isSelected, + // onSelected: (){ + // if(isSelected) + // _group.taskStatus = null; + // else + // _group.taskStatus = taskStatus[index]; + // + // setState(() {}); + // }, + // status: taskStatus[index], + // ); + // } + // + // ), + // ), + // ), + SizedBox( + height: 8 * AppStyle.getScaleFactor(context), + ), Expanded( child: ListView.builder( itemCount: widget.visits.length, - itemBuilder: (context,index){ + itemBuilder: (context, index) { Visit visit = widget.visits[index]; return Container( - padding: EdgeInsets.symmetric(vertical: 8,horizontal: 8), + padding: EdgeInsets.symmetric(vertical: 8, horizontal: 8), margin: EdgeInsets.symmetric(vertical: 4), - decoration: BoxDecoration( - color: AColors.primaryColor, - borderRadius: BorderRadius.circular( - AppStyle.getBorderRadius(context) - ), - boxShadow: [ - AppStyle.boxShadow - ] - ), + decoration: BoxDecoration(color: AColors.primaryColor, borderRadius: BorderRadius.circular(AppStyle.getBorderRadius(context)), boxShadow: [AppStyle.boxShadow]), child: Row( children: [ Expanded( child: Text( - "${_subtitle.sn}: "+visit.deviceSerialNumber ?? _subtitle.noSerialNumberFound, - style: Theme.of(context).textTheme.headline6.copyWith( - color: AColors.white, - fontSize: 16, - fontWeight: FontWeight.bold - ), + "${_subtitle.sn}: " + visit.deviceSerialNumber ?? _subtitle.noSerialNumberFound, + style: Theme.of(context).textTheme.headline6.copyWith(color: AColors.white, fontSize: 16, fontWeight: FontWeight.bold), ), ), - VisitStatusLabel(visit: visit,) + VisitStatusLabel( + visit: visit, + ) ], ), ); @@ -239,13 +236,12 @@ class _UpdateVisitsGroupSheetState extends State { ), AButton( text: _subtitle.update, - onPressed: (){ - Navigator.of(context).pop(_group); + onPressed: () { + Navigator.of(context).pop(_group); }, ), ], ), - ], ), ); diff --git a/lib/views/pages/user/visits/visit_details.dart b/lib/views/pages/user/visits/visit_details.dart index c2e70372..145dd68c 100644 --- a/lib/views/pages/user/visits/visit_details.dart +++ b/lib/views/pages/user/visits/visit_details.dart @@ -29,8 +29,8 @@ class VisitDetailsPage extends StatelessWidget { child: Column( children: [ Container( - color:AColors.primaryColor, - padding: const EdgeInsets.symmetric(horizontal: 0,vertical: 4), + color: AColors.primaryColor, + padding: const EdgeInsets.symmetric(horizontal: 0, vertical: 4), child: Row( children: [ ABackButton(), @@ -38,10 +38,7 @@ class VisitDetailsPage extends StatelessWidget { child: Center( child: Text( _subtitle.visitInformation, - style: Theme.of(context).textTheme.headline6.copyWith( - color: AColors.white, - fontStyle: FontStyle.italic - ), + style: Theme.of(context).textTheme.headline6.copyWith(color: AColors.white, fontStyle: FontStyle.italic), ), ), ), @@ -51,9 +48,11 @@ class VisitDetailsPage extends StatelessWidget { buttonSize: 42, backgroundColor: AColors.green, onPressed: () async { - Navigator.of(context).push( - MaterialPageRoute(builder: (_)=> EditPentry(visit: visit,pentry: visit.pentry,)) - ); + Navigator.of(context).push(MaterialPageRoute( + builder: (_) => EditPentry( + visit: visit, + pentry: visit.pentry, + ))); }, ), SizedBox(width: 42) @@ -64,13 +63,14 @@ class VisitDetailsPage extends StatelessWidget { child: ListView( padding: EdgeInsets.symmetric(horizontal: 16), children: [ - SizedBox(height: 8,), + SizedBox( + height: 8, + ), MaterialButton( padding: EdgeInsets.zero, - onPressed: (){ - Navigator.of(context).push( - MaterialPageRoute( - builder: (_) => Scaffold( + onPressed: () { + Navigator.of(context).push(MaterialPageRoute( + builder: (_) => Scaffold( body: InteractiveViewer( child: Center( child: ImageLoader( @@ -79,27 +79,29 @@ class VisitDetailsPage extends StatelessWidget { ), ), ), - ) - ) - ); + ))); }, child: SizedBox( height: 140 * AppStyle.getScaleFactor(context), width: MediaQuery.of(context).size.width, child: ImageLoader( - url: visit.images.isEmpty ? " ":visit.images.first, + url: visit.images.isEmpty ? " " : visit.images.first, boxFit: BoxFit.cover, ), ), ), - SizedBox(height: 8,), SizedBox( - height: 60* AppStyle.getScaleFactor(context), + height: 8, + ), + SizedBox( + height: 60 * AppStyle.getScaleFactor(context), child: ImagesList( images: visit.images, ), ), - SizedBox(height: 8,), + SizedBox( + height: 8, + ), RequestInfoRow( title: _subtitle.code, info: visit.serialNumber, @@ -112,7 +114,6 @@ class VisitDetailsPage extends StatelessWidget { title: _subtitle.deviceSN, info: visit.deviceSerialNumber, ), - RequestInfoRow( title: _subtitle.expectDate, info: visit.expectDate, @@ -126,17 +127,18 @@ class VisitDetailsPage extends StatelessWidget { Expanded( child: Text( "${_subtitle.status} : ", - style: Theme.of(context).textTheme.subtitle1.copyWith( - fontWeight: FontWeight.bold - ), + style: Theme.of(context).textTheme.subtitle1.copyWith(fontWeight: FontWeight.bold), textScaleFactor: AppStyle.getScaleFactor(context), ), ), - VisitStatusLabel(visit: visit,), + VisitStatusLabel( + visit: visit, + ), ], ), - - Divider(color: Theme.of(context).primaryColor,), + Divider( + color: Theme.of(context).primaryColor, + ), RequestInfoRow( title: _subtitle.contactStatus, info: visit.assignTo, diff --git a/lib/views/widgets/app_name_bar.dart b/lib/views/widgets/app_name_bar.dart index 8aebd901..9979dace 100644 --- a/lib/views/widgets/app_name_bar.dart +++ b/lib/views/widgets/app_name_bar.dart @@ -1,20 +1,18 @@ import 'package:flutter/material.dart'; import 'package:test_sa/views/app_style/colors.dart'; import 'package:test_sa/views/app_style/sizing.dart'; + class AppNameBar extends StatelessWidget { @override Widget build(BuildContext context) { return Container( height: 50 * AppStyle.getScaleFactor(context), - color:AColors.primaryColor, + color: AColors.primaryColor, padding: const EdgeInsets.all(8.0), child: Center( child: Text( "Test SA", - style: Theme.of(context).textTheme.headline6.copyWith( - color: AColors.white, - fontStyle: FontStyle.italic - ), + style: Theme.of(context).textTheme.headline6.copyWith(color: AColors.white, fontStyle: FontStyle.italic), ), ), ); diff --git a/lib/views/widgets/buttons/app_back_button.dart b/lib/views/widgets/buttons/app_back_button.dart index a7ce9c2b..ef26325a 100644 --- a/lib/views/widgets/buttons/app_back_button.dart +++ b/lib/views/widgets/buttons/app_back_button.dart @@ -7,7 +7,7 @@ class ABackButton extends StatelessWidget { final VoidCallback onPressed; final IconData icon; - const ABackButton({Key key, this.onPressed,this.icon}) : super(key: key); + const ABackButton({Key key, this.onPressed, this.icon}) : super(key: key); @override Widget build(BuildContext context) { diff --git a/lib/views/widgets/buttons/app_button.dart b/lib/views/widgets/buttons/app_button.dart index 6c0459d5..c3fd1680 100644 --- a/lib/views/widgets/buttons/app_button.dart +++ b/lib/views/widgets/buttons/app_button.dart @@ -27,7 +27,7 @@ class AButton extends StatelessWidget { onPressed: onPressed, child: Text( text ?? "", - style: textStyle ?? Theme.of(context).textTheme.subtitle2.copyWith(color: AColors.white, fontSize: 14,fontWeight: FontWeight.w600), + style: textStyle ?? Theme.of(context).textTheme.subtitle2.copyWith(color: AColors.white, fontSize: 14, fontWeight: FontWeight.w600), textScaleFactor: AppStyle.getScaleFactor(context), ), ), diff --git a/lib/views/widgets/buttons/app_flat_button.dart b/lib/views/widgets/buttons/app_flat_button.dart index f8df57b6..b154ac4d 100644 --- a/lib/views/widgets/buttons/app_flat_button.dart +++ b/lib/views/widgets/buttons/app_flat_button.dart @@ -8,19 +8,19 @@ class AFlatButton extends StatelessWidget { final EdgeInsets padding; final VoidCallback onPressed; - const AFlatButton({Key key, this.text, this.textColor,this.style ,this.onPressed,this.padding}) : super(key: key); + const AFlatButton({Key key, this.text, this.textColor, this.style, this.onPressed, this.padding}) : super(key: key); @override Widget build(BuildContext context) { return TextButton( - style: TextButton.styleFrom( - foregroundColor: this.textColor ?? Colors.black, padding: padding, - ), - onPressed: onPressed, - child: Text( - text??"", - style: style ?? Theme.of(context).textTheme.bodyText1, - textScaleFactor: AppStyle.getScaleFactor(context), - ) - ); + style: TextButton.styleFrom( + foregroundColor: this.textColor ?? Colors.black, + padding: padding, + ), + onPressed: onPressed, + child: Text( + text ?? "", + style: style ?? Theme.of(context).textTheme.bodyText1, + textScaleFactor: AppStyle.getScaleFactor(context), + )); } } diff --git a/lib/views/widgets/buttons/app_icon_button.dart b/lib/views/widgets/buttons/app_icon_button.dart index 07e9c9a3..139d70ca 100644 --- a/lib/views/widgets/buttons/app_icon_button.dart +++ b/lib/views/widgets/buttons/app_icon_button.dart @@ -2,8 +2,8 @@ import 'package:flutter/material.dart'; import 'package:font_awesome_flutter/font_awesome_flutter.dart'; import 'package:test_sa/views/app_style/colors.dart'; import 'package:test_sa/views/app_style/sizing.dart'; -class AIconButton extends StatelessWidget { +class AIconButton extends StatelessWidget { final IconData iconData; final Color color; final Color backgroundColor; @@ -11,16 +11,7 @@ class AIconButton extends StatelessWidget { final double iconSize; final double buttonSize; - - const AIconButton({ - Key key, - this.iconData, - this.onPressed, - this.color, - this.iconSize, - this.buttonSize = 54, - this.backgroundColor - }) : super(key: key); + const AIconButton({Key key, this.iconData, this.onPressed, this.color, this.iconSize, this.buttonSize = 54, this.backgroundColor}) : super(key: key); @override Widget build(BuildContext context) { @@ -30,12 +21,8 @@ class AIconButton extends StatelessWidget { child: ElevatedButton( style: ElevatedButton.styleFrom( padding: EdgeInsets.zero, - shape: RoundedRectangleBorder( - borderRadius: BorderRadius.circular( - (AppStyle.borderRadius - 4) * AppStyle.getScaleFactor(context) - ) - ), - backgroundColor: backgroundColor ?? AColors.onPrimaryColor, + shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular((AppStyle.borderRadius - 4) * AppStyle.getScaleFactor(context))), + backgroundColor: backgroundColor ?? AColors.onPrimaryColor, ), onPressed: onPressed, child: FaIcon( diff --git a/lib/views/widgets/buttons/app_icon_button2.dart b/lib/views/widgets/buttons/app_icon_button2.dart index bce63196..1726a375 100644 --- a/lib/views/widgets/buttons/app_icon_button2.dart +++ b/lib/views/widgets/buttons/app_icon_button2.dart @@ -1,8 +1,8 @@ import 'package:flutter/material.dart'; import 'package:font_awesome_flutter/font_awesome_flutter.dart'; import 'package:test_sa/views/app_style/sizing.dart'; -class AIconButton2 extends StatelessWidget { +class AIconButton2 extends StatelessWidget { final IconData iconData; final Color color; final VoidCallback onPressed; diff --git a/lib/views/widgets/buttons/app_outlined_button.dart b/lib/views/widgets/buttons/app_outlined_button.dart index ddfb3042..b7e18bd2 100644 --- a/lib/views/widgets/buttons/app_outlined_button.dart +++ b/lib/views/widgets/buttons/app_outlined_button.dart @@ -16,11 +16,7 @@ class AOutLinedButton extends StatelessWidget { return OutlinedButton( style: ElevatedButton.styleFrom( padding: padding ?? EdgeInsets.symmetric(vertical: 12), - textStyle: textStyle ?? Theme - .of(context) - .textTheme - .subtitle2 - .copyWith(fontSize: 18), + textStyle: textStyle ?? Theme.of(context).textTheme.subtitle2.copyWith(fontSize: 18), shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(AppStyle.getBorderRadius(context))), ), onPressed: onPressed, @@ -29,11 +25,7 @@ class AOutLinedButton extends StatelessWidget { Expanded( child: Text( text ?? "", - style: Theme - .of(context) - .textTheme - .subtitle2 - .copyWith(color: AColors.primaryColor, fontSize: 14, fontWeight: FontWeight.w600), + style: Theme.of(context).textTheme.subtitle2.copyWith(color: AColors.primaryColor, fontSize: 14, fontWeight: FontWeight.w600), textAlign: TextAlign.center, textScaleFactor: AppStyle.getScaleFactor(context), ), diff --git a/lib/views/widgets/buttons/app_small_button.dart b/lib/views/widgets/buttons/app_small_button.dart index 10c103f6..44073d64 100644 --- a/lib/views/widgets/buttons/app_small_button.dart +++ b/lib/views/widgets/buttons/app_small_button.dart @@ -8,26 +8,20 @@ class ASmallButton extends StatelessWidget { final EdgeInsets padding; final VoidCallback onPressed; - const ASmallButton({Key key, this.text, this.style ,this.onPressed,this.padding, this.color}) : super(key: key); + const ASmallButton({Key key, this.text, this.style, this.onPressed, this.padding, this.color}) : super(key: key); @override Widget build(BuildContext context) { return ElevatedButton( - style: ElevatedButton.styleFrom( - padding: padding, - primary: color ?? Theme.of(context).primaryColor, - shape: RoundedRectangleBorder( - borderRadius: BorderRadius.circular(8) + style: ElevatedButton.styleFrom( + padding: padding, + primary: color ?? Theme.of(context).primaryColor, + shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(8)), ), - ), - child: Text( - text??"", - style: style ?? Theme.of(context).textTheme.bodyText1.copyWith( - color: color == Colors.white - ? Theme.of(context).primaryColor : Colors.white + child: Text( + text ?? "", + style: style ?? Theme.of(context).textTheme.bodyText1.copyWith(color: color == Colors.white ? Theme.of(context).primaryColor : Colors.white), + textScaleFactor: AppStyle.getScaleFactor(context), ), - textScaleFactor: AppStyle.getScaleFactor(context), - ), - onPressed: onPressed - ); + onPressed: onPressed); } } diff --git a/lib/views/widgets/custom_clip_path/carve_in_image.dart b/lib/views/widgets/custom_clip_path/carve_in_image.dart index a9f72b08..9b4783c1 100644 --- a/lib/views/widgets/custom_clip_path/carve_in_image.dart +++ b/lib/views/widgets/custom_clip_path/carve_in_image.dart @@ -2,7 +2,7 @@ import 'package:flutter/material.dart'; class CarveInImage extends CustomClipper { final double gab; - var radius=10.0; + var radius = 10.0; CarveInImage(this.gab); @@ -10,14 +10,14 @@ class CarveInImage extends CustomClipper { Path getClip(Size size) { Path path = Path(); path.lineTo(0, size.height); - path.lineTo(size.width/2 - gab / 2, size.height); - path.arcToPoint(Offset(size.width/2 + gab / 2, size.height), - radius: Radius.circular(gab/2)); + path.lineTo(size.width / 2 - gab / 2, size.height); + path.arcToPoint(Offset(size.width / 2 + gab / 2, size.height), radius: Radius.circular(gab / 2)); path.lineTo(size.width, size.height); path.lineTo(size.width, 0); path.lineTo(0, 0); return path; } + @override bool shouldReclip(CustomClipper oldClipper) => true; -} \ No newline at end of file +} diff --git a/lib/views/widgets/date_and_time/date_picker.dart b/lib/views/widgets/date_and_time/date_picker.dart index a3136342..54c4ef8c 100644 --- a/lib/views/widgets/date_and_time/date_picker.dart +++ b/lib/views/widgets/date_and_time/date_picker.dart @@ -16,23 +16,15 @@ class ADatePicker extends StatelessWidget { foregroundColor: Colors.white, textStyle: Theme.of(context).textTheme.subtitle2, shape: RoundedRectangleBorder( - borderRadius: BorderRadius.circular( - 12 * AppStyle.getScaleFactor(context) - ), + borderRadius: BorderRadius.circular(12 * AppStyle.getScaleFactor(context)), ), ), child: Text( - date == null ? "Pick Date" : - date.toString().split(" ").first, + date == null ? "Pick Date" : date.toString().split(" ").first, textScaleFactor: AppStyle.getScaleFactor(context), ), onPressed: () async { - DateTime picked = await showDatePicker( - context: context, - initialDate: DateTime.now(), - firstDate: from ?? DateTime.now(), - lastDate: to ?? DateTime.now().add(Duration(days: 365)) - ); + DateTime picked = await showDatePicker(context: context, initialDate: DateTime.now(), firstDate: from ?? DateTime.now(), lastDate: to ?? DateTime.now().add(Duration(days: 365))); onDatePicker(picked); }, ); diff --git a/lib/views/widgets/date_and_time/from_to_date_bar.dart b/lib/views/widgets/date_and_time/from_to_date_bar.dart index 4ef79e81..1288c743 100644 --- a/lib/views/widgets/date_and_time/from_to_date_bar.dart +++ b/lib/views/widgets/date_and_time/from_to_date_bar.dart @@ -4,6 +4,7 @@ import 'package:test_sa/models/subtitle.dart'; import 'package:test_sa/views/app_style/sizing.dart'; import 'date_picker.dart'; + class FromToDateBar extends StatefulWidget { final DateTime from; final DateTime to; @@ -32,22 +33,18 @@ class _FromToDateBarState extends State { return Row( mainAxisAlignment: MainAxisAlignment.spaceEvenly, children: [ - Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ Text( _subtitle.from, - style: Theme.of(context).textTheme.bodyText1.copyWith( - fontSize: 12, - fontWeight: FontWeight.normal - ), + style: Theme.of(context).textTheme.bodyText1.copyWith(fontSize: 12, fontWeight: FontWeight.normal), textScaleFactor: AppStyle.getScaleFactor(context), ), ADatePicker( date: _from, from: DateTime(1950), - onDatePicker: (date){ + onDatePicker: (date) { _from = date; setState(() {}); widget.onPickFrom(date); @@ -60,16 +57,13 @@ class _FromToDateBarState extends State { children: [ Text( _subtitle.to, - style: Theme.of(context).textTheme.bodyText1.copyWith( - fontSize: 12, - fontWeight: FontWeight.normal - ), + style: Theme.of(context).textTheme.bodyText1.copyWith(fontSize: 12, fontWeight: FontWeight.normal), textScaleFactor: AppStyle.getScaleFactor(context), ), ADatePicker( date: _to, from: DateTime(1950), - onDatePicker: (date){ + onDatePicker: (date) { _to = date; setState(() {}); widget.onPickTo(date); diff --git a/lib/views/widgets/departments/department_button.dart b/lib/views/widgets/departments/department_button.dart index cf859874..47bc81ce 100644 --- a/lib/views/widgets/departments/department_button.dart +++ b/lib/views/widgets/departments/department_button.dart @@ -6,6 +6,7 @@ import 'package:test_sa/models/subtitle.dart'; import 'package:test_sa/views/app_style/colors.dart'; import 'package:test_sa/views/app_style/sizing.dart'; import 'package:test_sa/views/widgets/departments/single_department_picker.dart'; + class DepartmentButton extends StatelessWidget { final Function(Department) onDepartmentPick; final Department department; diff --git a/lib/views/widgets/departments/department_item.dart b/lib/views/widgets/departments/department_item.dart index 4ac240e9..4474af62 100644 --- a/lib/views/widgets/departments/department_item.dart +++ b/lib/views/widgets/departments/department_item.dart @@ -2,6 +2,7 @@ import 'package:flutter/material.dart'; import 'package:test_sa/models/department.dart'; import 'package:test_sa/views/app_style/colors.dart'; import 'package:test_sa/views/app_style/sizing.dart'; + class DepartmentItem extends StatelessWidget { final Department department; final Function(Department) onPressed; @@ -10,28 +11,23 @@ class DepartmentItem extends StatelessWidget { @override Widget build(BuildContext context) { return Padding( - padding: EdgeInsets.symmetric(horizontal: 16,vertical: 6), + padding: EdgeInsets.symmetric(horizontal: 16, vertical: 6), child: ElevatedButton( style: ElevatedButton.styleFrom( backgroundColor: AColors.primaryColor, shape: RoundedRectangleBorder( - borderRadius: BorderRadius.circular( - AppStyle.getBorderRadius(context) - ), + borderRadius: BorderRadius.circular(AppStyle.getBorderRadius(context)), ), ), - onPressed: (){ + onPressed: () { onPressed(department); }, child: ListTile( title: Text( - department.name ?? "", - style: Theme.of(context).textTheme.subtitle1.copyWith( - color: AColors.white - ), + department.name ?? "", + style: Theme.of(context).textTheme.subtitle1.copyWith(color: AColors.white), textDirection: TextDirection.rtl, ), - ), ), ); diff --git a/lib/views/widgets/departments/single_department_picker.dart b/lib/views/widgets/departments/single_department_picker.dart index e5fb916b..d055a873 100644 --- a/lib/views/widgets/departments/single_department_picker.dart +++ b/lib/views/widgets/departments/single_department_picker.dart @@ -10,6 +10,7 @@ import 'package:test_sa/views/widgets/loaders/loading_manager.dart'; import 'package:test_sa/views/widgets/loaders/no_item_found.dart'; import '../app_text_form_field.dart'; + class SingleDepartmentPicker extends StatefulWidget { static final String id = "/single-Department-Picker"; @override @@ -26,7 +27,7 @@ class _SingleDepartmentPickerState extends State { _departmentsProvider = Provider.of(context); _settingProvider = Provider.of(context); Subtitle _subtitle = AppLocalization.of(context).subtitle; - if(_firstTime && _departmentsProvider.departments != null){ + if (_firstTime && _departmentsProvider.departments != null) { _searchableList.addAll(_departmentsProvider.departments); _firstTime = false; } @@ -45,40 +46,40 @@ class _SingleDepartmentPickerState extends State { }, child: Column( children: [ - SizedBox(height: 48,), + SizedBox( + height: 48, + ), Padding( - padding: const EdgeInsets.symmetric(vertical: 8,horizontal: 16), + padding: const EdgeInsets.symmetric(vertical: 8, horizontal: 16), child: ATextFormField( hintText: _subtitle.searchByName, - style: Theme.of(context).textTheme.headline6, + style: Theme.of(context).textTheme.headline6, suffixIcon: Icon(Icons.search_rounded), - onChange: (value){ + onChange: (value) { _searchableList.clear(); - _searchableList.addAll(_departmentsProvider.departments.where( - (element) => element.name.toLowerCase().contains( - value.toLowerCase() - ) - ).toList()); + _searchableList.addAll(_departmentsProvider.departments.where((element) => element.name.toLowerCase().contains(value.toLowerCase())).toList()); setState(() {}); }, ), ), Expanded( - child: _searchableList.isEmpty ? - NoItemFound(message: _subtitle.noUniteFound,): - ListView.builder( - padding: EdgeInsets.zero, - shrinkWrap: true, - itemCount: _searchableList.length, - itemBuilder: (listContext,itemIndex){ - return DepartmentItem( - department: _searchableList[itemIndex], - onPressed: (hospital){ - Navigator.of(context).pop(hospital); - }, - ); - }, - ), + child: _searchableList.isEmpty + ? NoItemFound( + message: _subtitle.noUniteFound, + ) + : ListView.builder( + padding: EdgeInsets.zero, + shrinkWrap: true, + itemCount: _searchableList.length, + itemBuilder: (listContext, itemIndex) { + return DepartmentItem( + department: _searchableList[itemIndex], + onPressed: (hospital) { + Navigator.of(context).pop(hospital); + }, + ); + }, + ), ), ], ), diff --git a/lib/views/widgets/device_trancfer/device_transfer_info_section.dart b/lib/views/widgets/device_trancfer/device_transfer_info_section.dart index 03e694c4..55e6b1d3 100644 --- a/lib/views/widgets/device_trancfer/device_transfer_info_section.dart +++ b/lib/views/widgets/device_trancfer/device_transfer_info_section.dart @@ -5,6 +5,7 @@ import 'package:test_sa/views/app_style/colors.dart'; import 'package:test_sa/views/widgets/loaders/image_loader.dart'; import 'package:test_sa/views/widgets/requests/info_row.dart'; import 'package:test_sa/views/widgets/requests/request_status.dart'; + class DeviceTransferInfoSection extends StatelessWidget { final DeviceTransferInfo info; final VoidCallback onEdit; @@ -41,19 +42,16 @@ class DeviceTransferInfoSection extends StatelessWidget { ), RequestInfoRow( title: "Signature", - info: info.signature?.isEmpty != false - ? subtitle.noDateFound : null, - contentWidget: info.signature?.isEmpty != false ? null : - ImageLoader( - url: info.signature, - ), + info: info.signature?.isEmpty != false ? subtitle.noDateFound : null, + contentWidget: info.signature?.isEmpty != false + ? null + : ImageLoader( + url: info.signature, + ), ), RequestInfoRow( title: subtitle.status, - infoWidget: StatusLabel( - label: info.status?.name, - color: AColors.getGasStatusColor(info.status?.id) - ), + infoWidget: StatusLabel(label: info.status?.name, color: AColors.getGasStatusColor(info.status?.id)), ), ], ); diff --git a/lib/views/widgets/device_trancfer/device_transfer_item.dart b/lib/views/widgets/device_trancfer/device_transfer_item.dart index 4b2d78ce..9da46fad 100644 --- a/lib/views/widgets/device_trancfer/device_transfer_item.dart +++ b/lib/views/widgets/device_trancfer/device_transfer_item.dart @@ -9,6 +9,7 @@ import 'package:test_sa/models/user.dart'; import 'package:test_sa/views/app_style/colors.dart'; import 'package:test_sa/views/app_style/sizing.dart'; import 'package:test_sa/views/widgets/requests/request_status.dart'; + class DeviceTransferItem extends StatelessWidget { final int index; final DeviceTransfer item; @@ -18,28 +19,22 @@ class DeviceTransferItem extends StatelessWidget { @override Widget build(BuildContext context) { Subtitle _subtitle = AppLocalization.of(context).subtitle; - User _user = Provider.of(context,listen: false).user; - Color itemColor = index % 2 == 0 - ? Theme.of(context).colorScheme.primary - : Theme.of(context).colorScheme.onPrimary; - Color onItemColor = index % 2 != 0 - ? Theme.of(context).colorScheme.primary - : Theme.of(context).colorScheme.onPrimary; + User _user = Provider.of(context, listen: false).user; + Color itemColor = index % 2 == 0 ? Theme.of(context).colorScheme.primary : Theme.of(context).colorScheme.onPrimary; + Color onItemColor = index % 2 != 0 ? Theme.of(context).colorScheme.primary : Theme.of(context).colorScheme.onPrimary; return Padding( padding: const EdgeInsets.symmetric(vertical: 4), child: ElevatedButton( - style: ElevatedButton.styleFrom( - padding: EdgeInsets.symmetric(vertical: 8,horizontal: 8), - backgroundColor: itemColor, - shape: RoundedRectangleBorder( - borderRadius: BorderRadius.circular( - AppStyle.getBorderRadius(context) - ), - ), - ), + style: ElevatedButton.styleFrom( + padding: EdgeInsets.symmetric(vertical: 8, horizontal: 8), + backgroundColor: itemColor, + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(AppStyle.getBorderRadius(context)), + ), + ), //padding: EdgeInsets.symmetric(vertical: 8,horizontal: 8), - onPressed: (){ + onPressed: () { onPressed(item); }, child: Column( @@ -53,28 +48,25 @@ class DeviceTransferItem extends StatelessWidget { children: [ Text( item.title ?? "-----", - style: Theme.of(context).textTheme.headline6.copyWith( - color: onItemColor, - fontSize: 16, - fontWeight: FontWeight.bold - ), + style: Theme.of(context).textTheme.headline6.copyWith(color: onItemColor, fontSize: 16, fontWeight: FontWeight.bold), + ), + Divider( + color: onItemColor, ), - Divider(color: onItemColor,), Row( children: [ Expanded( child: Text( _subtitle.from, style: Theme.of(context).textTheme.subtitle2.copyWith( - color: onItemColor, - ), + color: onItemColor, + ), ), ), - StatusLabel( - color: AColors.getRequestStatusColor(item.sender.status?.id), - label: item.sender.status?.name, - ) - + StatusLabel( + color: AColors.getRequestStatusColor(item.sender.status?.id), + label: item.sender.status?.name, + ) ], ), //const SizedBox(height: 8,), @@ -84,37 +76,36 @@ class DeviceTransferItem extends StatelessWidget { child: Text( item.sender.client.name, style: Theme.of(context).textTheme.subtitle2.copyWith( - color: onItemColor, - ), + color: onItemColor, + ), ), ), - - ], ), - if(item.sender.department.id != null) - Text( - item.sender.department.name, - style: Theme.of(context).textTheme.bodySmall.copyWith( - color: onItemColor, + if (item.sender.department.id != null) + Text( + item.sender.department.name, + style: Theme.of(context).textTheme.bodySmall.copyWith( + color: onItemColor, + ), ), + Divider( + color: onItemColor, ), - Divider(color: onItemColor,), Row( children: [ Expanded( child: Text( _subtitle.to, style: Theme.of(context).textTheme.subtitle2.copyWith( - color: onItemColor, - ), + color: onItemColor, + ), ), ), StatusLabel( color: AColors.getRequestStatusColor(item.receiver.status?.id), label: item.receiver.status?.name, ) - ], ), //const SizedBox(height: 8,), @@ -124,26 +115,23 @@ class DeviceTransferItem extends StatelessWidget { child: Text( item.receiver.client.name, style: Theme.of(context).textTheme.subtitle2.copyWith( - color: onItemColor, - ), + color: onItemColor, + ), ), ), - - ], ), - if(item.receiver.department.id != null) - Text( - item.receiver.department.name, - style: Theme.of(context).textTheme.bodySmall.copyWith( - color: onItemColor, + if (item.receiver.department.id != null) + Text( + item.receiver.department.name, + style: Theme.of(context).textTheme.bodySmall.copyWith( + color: onItemColor, + ), ), - ), //Divider(color: onItemColor,), ], ), ), - ], ), ], diff --git a/lib/views/widgets/device_trancfer/device_transfer_list.dart b/lib/views/widgets/device_trancfer/device_transfer_list.dart index 18bee922..dd6f0212 100644 --- a/lib/views/widgets/device_trancfer/device_transfer_list.dart +++ b/lib/views/widgets/device_trancfer/device_transfer_list.dart @@ -6,6 +6,7 @@ import 'package:test_sa/views/pages/device_transfer/device_transfer_details.dart import 'package:test_sa/views/widgets/device_trancfer/device_transfer_item.dart'; import 'package:test_sa/views/widgets/loaders/lazy_loading.dart'; import 'package:test_sa/views/widgets/loaders/no_item_found.dart'; + class DeviceTransferList extends StatelessWidget { final List items; final bool nextPage; @@ -15,32 +16,31 @@ class DeviceTransferList extends StatelessWidget { @override Widget build(BuildContext context) { - - if(items.length == 0){ + if (items.length == 0) { Subtitle subtitle = AppLocalization.of(context).subtitle; - return NoItemFound(message: subtitle.noServiceRequestFound,); + return NoItemFound( + message: subtitle.noServiceRequestFound, + ); } return LazyLoading( nextPage: nextPage, onLazyLoad: onLazyLoad, child: ListView.builder( - //physics: const BouncingScrollPhysics(), - itemCount: items.length, - padding: const EdgeInsets.symmetric(horizontal: 16,vertical: 8), - itemBuilder: (context,itemIndex){ + //physics: const BouncingScrollPhysics(), + itemCount: items.length, + padding: const EdgeInsets.symmetric(horizontal: 16, vertical: 8), + itemBuilder: (context, itemIndex) { return DeviceTransferItem( index: itemIndex, item: items[itemIndex], - onPressed: (model){ - Navigator.of(context).push( - MaterialPageRoute( - builder: (_)=> DeviceTransferDetails(model: model,) - ) - ); + onPressed: (model) { + Navigator.of(context).push(MaterialPageRoute( + builder: (_) => DeviceTransferDetails( + model: model, + ))); }, ); - } - ), + }), ); } } diff --git a/lib/views/widgets/dialogs/dialog.dart b/lib/views/widgets/dialogs/dialog.dart index 7bb08f20..bf9db495 100644 --- a/lib/views/widgets/dialogs/dialog.dart +++ b/lib/views/widgets/dialogs/dialog.dart @@ -2,6 +2,7 @@ import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; import 'package:test_sa/controllers/localization/localization.dart'; import 'package:test_sa/models/subtitle.dart'; + class AAlertDialog extends StatelessWidget { final String title; final String content; @@ -12,12 +13,8 @@ class AAlertDialog extends StatelessWidget { Widget build(BuildContext context) { Subtitle _subtitle = AppLocalization.of(context).subtitle; return CupertinoAlertDialog( - title: title != null - ? Text(title) - : null, - content: content != null - ? Text(content) - : null, + title: title != null ? Text(title) : null, + content: content != null ? Text(content) : null, actions: [ TextButton( child: Text(_subtitle.confirm), diff --git a/lib/views/widgets/drawer/drawer_item.dart b/lib/views/widgets/drawer/drawer_item.dart index 1bbc2474..70e072ea 100644 --- a/lib/views/widgets/drawer/drawer_item.dart +++ b/lib/views/widgets/drawer/drawer_item.dart @@ -25,7 +25,7 @@ class DrawerItem extends StatelessWidget { onPressed: onPressed, child: Row( children: [ - Icon(icon, color: AColors.grey3A,size: 20), + Icon(icon, color: AColors.grey3A, size: 20), 12.width, Text( title, @@ -33,7 +33,7 @@ class DrawerItem extends StatelessWidget { textScaleFactor: AppStyle.getScaleFactor(context), ), ], - ).paddingOnly(left: 20,right: 20), + ).paddingOnly(left: 20, right: 20), ), ); } diff --git a/lib/views/widgets/equipment/auto_complete_devices_field.dart b/lib/views/widgets/equipment/auto_complete_devices_field.dart index 3c6fbc99..5d9cd1e0 100644 --- a/lib/views/widgets/equipment/auto_complete_devices_field.dart +++ b/lib/views/widgets/equipment/auto_complete_devices_field.dart @@ -8,6 +8,7 @@ import 'package:test_sa/models/device/device.dart'; import 'package:test_sa/views/app_style/colors.dart'; import 'package:test_sa/views/app_style/sizing.dart'; import 'package:test_sa/views/widgets/loaders/loading_manager.dart'; + class AutoCompleteDeviceField extends StatefulWidget { final Device initialValue; final int hospitalId; @@ -20,7 +21,6 @@ class AutoCompleteDeviceField extends StatefulWidget { } class _AutoCompleteDeviceFieldState extends State { - SettingProvider _settingProvider; DevicesProvider _devicesProvider; UserProvider _userProvider; @@ -37,6 +37,7 @@ class _AutoCompleteDeviceFieldState extends State { _controller.dispose(); super.dispose(); } + @override Widget build(BuildContext context) { _settingProvider = Provider.of(context); @@ -44,64 +45,53 @@ class _AutoCompleteDeviceFieldState extends State { _devicesProvider = Provider.of(context); //Subtitle _subtitle = AppLocalization.of(context).subtitle; return LoadingManager( - isLoading: _devicesProvider.isLoading, - isFailedLoading: _devicesProvider.devices == null, - stateCode: _devicesProvider.stateCode, - onRefresh: () async { - _devicesProvider.reset(); - await _devicesProvider.getEquipment( - host: _settingProvider.host, - user: _userProvider.user, - hospitalId: widget.hospitalId - ); - }, - child: Container( - padding: const EdgeInsets.symmetric( - horizontal: 16 - ), - decoration: BoxDecoration( - color: Colors.white, - border: Border.all(color:AColors.black), - borderRadius: BorderRadius.circular( - AppStyle.borderRadius * AppStyle.getScaleFactor(context) - ), - boxShadow: [ - AppStyle.boxShadow - ] - ), - child: TypeAheadField( - textFieldConfiguration: TextFieldConfiguration( - style: Theme.of(context).textTheme.headline6, - controller: _controller, - textAlign: TextAlign.center, - decoration: const InputDecoration( - border: InputBorder.none, - disabledBorder: InputBorder.none, - focusedBorder: InputBorder.none, - enabledBorder: InputBorder.none, - ), - textInputAction: TextInputAction.search, + isLoading: _devicesProvider.isLoading, + isFailedLoading: _devicesProvider.devices == null, + stateCode: _devicesProvider.stateCode, + onRefresh: () async { + _devicesProvider.reset(); + await _devicesProvider.getEquipment(host: _settingProvider.host, user: _userProvider.user, hospitalId: widget.hospitalId); + }, + child: Container( + padding: const EdgeInsets.symmetric(horizontal: 16), + decoration: BoxDecoration( + color: Colors.white, + border: Border.all(color: AColors.black), + borderRadius: BorderRadius.circular(AppStyle.borderRadius * AppStyle.getScaleFactor(context)), + boxShadow: [AppStyle.boxShadow]), + child: TypeAheadField( + textFieldConfiguration: TextFieldConfiguration( + style: Theme.of(context).textTheme.headline6, + controller: _controller, + textAlign: TextAlign.center, + decoration: const InputDecoration( + border: InputBorder.none, + disabledBorder: InputBorder.none, + focusedBorder: InputBorder.none, + enabledBorder: InputBorder.none, ), - suggestionsCallback: (value) async { - return await _devicesProvider.getDevicesList( - host: _settingProvider.host, - user: _userProvider.user, - hospitalId: widget.hospitalId ?? _userProvider.user.hospital.id, - serialNumber: value, - ); - }, - itemBuilder: (context, device) { - return ListTile( - title: Text(device.serialNumber), - subtitle: Text("${device.modelDefinition.modelName}/${device.modelDefinition.manufacturerName}"), - ); - }, - onSuggestionSelected: (device) { - _controller.text = device.serialNumber; - widget.onPick(device.id); - }, + textInputAction: TextInputAction.search, ), + suggestionsCallback: (value) async { + return await _devicesProvider.getDevicesList( + host: _settingProvider.host, + user: _userProvider.user, + hospitalId: widget.hospitalId ?? _userProvider.user.hospital.id, + serialNumber: value, + ); + }, + itemBuilder: (context, device) { + return ListTile( + title: Text(device.serialNumber), + subtitle: Text("${device.modelDefinition.modelName}/${device.modelDefinition.manufacturerName}"), + ); + }, + onSuggestionSelected: (device) { + _controller.text = device.serialNumber; + widget.onPick(device.id); + }, ), + ), ); } } diff --git a/lib/views/widgets/equipment/auto_complete_models_field.dart b/lib/views/widgets/equipment/auto_complete_models_field.dart index 7f776b91..7b2c7555 100644 --- a/lib/views/widgets/equipment/auto_complete_models_field.dart +++ b/lib/views/widgets/equipment/auto_complete_models_field.dart @@ -7,18 +7,22 @@ import 'package:test_sa/controllers/providers/settings/setting_provider.dart'; import 'package:test_sa/models/lookup.dart'; import 'package:test_sa/views/app_style/colors.dart'; import 'package:test_sa/views/app_style/sizing.dart'; + class AutoCompleteModelField extends StatefulWidget { final Lookup initialValue; final Function(Lookup) onPick; - const AutoCompleteModelField({Key key, this.initialValue, this.onPick,}) : super(key: key); + const AutoCompleteModelField({ + Key key, + this.initialValue, + this.onPick, + }) : super(key: key); @override _AutoCompleteModelFieldState createState() => _AutoCompleteModelFieldState(); } class _AutoCompleteModelFieldState extends State { - SettingProvider _settingProvider; DevicesProvider _devicesProvider; UserProvider _userProvider; @@ -35,6 +39,7 @@ class _AutoCompleteModelFieldState extends State { _controller.dispose(); super.dispose(); } + @override Widget build(BuildContext context) { _settingProvider = Provider.of(context); @@ -42,37 +47,29 @@ class _AutoCompleteModelFieldState extends State { _devicesProvider = Provider.of(context); //Subtitle _subtitle = AppLocalization.of(context).subtitle; return Container( - padding: const EdgeInsets.symmetric( - horizontal: 16 - ), + padding: const EdgeInsets.symmetric(horizontal: 16), decoration: BoxDecoration( color: Colors.white, - border: Border.all(color:AColors.black), - borderRadius: BorderRadius.circular( - AppStyle.borderRadius * AppStyle.getScaleFactor(context) - ), - boxShadow: [ - AppStyle.boxShadow - ] - ), + border: Border.all(color: AColors.black), + borderRadius: BorderRadius.circular(AppStyle.borderRadius * AppStyle.getScaleFactor(context)), + boxShadow: [AppStyle.boxShadow]), child: TypeAheadField( textFieldConfiguration: TextFieldConfiguration( - style: Theme.of(context).textTheme.headline6, - controller: _controller, - textAlign: TextAlign.center, - - decoration: const InputDecoration( - hintText: "Model", - border: InputBorder.none, - disabledBorder: InputBorder.none, - focusedBorder: InputBorder.none, - enabledBorder: InputBorder.none, - ), - textInputAction: TextInputAction.search, + style: Theme.of(context).textTheme.headline6, + controller: _controller, + textAlign: TextAlign.center, + decoration: const InputDecoration( + hintText: "Model", + border: InputBorder.none, + disabledBorder: InputBorder.none, + focusedBorder: InputBorder.none, + enabledBorder: InputBorder.none, + ), + textInputAction: TextInputAction.search, ), suggestionsCallback: (value) async { return await _devicesProvider.getModels( - code: value, + code: value, ); }, itemBuilder: (context, lookup) { diff --git a/lib/views/widgets/equipment/device_item.dart b/lib/views/widgets/equipment/device_item.dart index 0ead41ef..e9fb9043 100644 --- a/lib/views/widgets/equipment/device_item.dart +++ b/lib/views/widgets/equipment/device_item.dart @@ -4,6 +4,7 @@ import 'package:test_sa/models/device/device.dart'; import 'package:test_sa/models/subtitle.dart'; import 'package:test_sa/views/app_style/colors.dart'; import 'package:test_sa/views/app_style/sizing.dart'; + class DeviceItem extends StatelessWidget { final Device device; final Function(Device) onPressed; @@ -13,41 +14,38 @@ class DeviceItem extends StatelessWidget { Widget build(BuildContext context) { Subtitle _subtitle = AppLocalization.of(context).subtitle; return Padding( - padding: EdgeInsets.symmetric(horizontal: 16,vertical: 6), + padding: EdgeInsets.symmetric(horizontal: 16, vertical: 6), child: ElevatedButton( style: ElevatedButton.styleFrom( primary: AColors.primaryColor, shape: RoundedRectangleBorder( - borderRadius: BorderRadius.circular( - AppStyle.getBorderRadius(context) - ), + borderRadius: BorderRadius.circular(AppStyle.getBorderRadius(context)), ), ), - - onPressed: (){ + onPressed: () { onPressed(device); }, child: ListTile( - title: Text("${_subtitle.sn} : ${device.serialNumber}", - style: Theme.of(context).textTheme.headline6.copyWith( - color: AColors.white - ), - + title: Text( + "${_subtitle.sn} : ${device.serialNumber}", + style: Theme.of(context).textTheme.headline6.copyWith(color: AColors.white), ), subtitle: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ - Divider(color: Theme.of(context).scaffoldBackgroundColor,), - Text("${_subtitle.brand} : ${device.modelDefinition.manufacturerName}", - style: Theme.of(context).textTheme.subtitle1.copyWith( - color: AColors.white - ), + Divider( + color: Theme.of(context).scaffoldBackgroundColor, + ), + Text( + "${_subtitle.brand} : ${device.modelDefinition.manufacturerName}", + style: Theme.of(context).textTheme.subtitle1.copyWith(color: AColors.white), + ), + Divider( + color: Theme.of(context).scaffoldBackgroundColor, ), - Divider(color: Theme.of(context).scaffoldBackgroundColor,), - Text("${_subtitle.model} : ${device.modelDefinition.modelName}", - style: Theme.of(context).textTheme.subtitle1.copyWith( - color: AColors.white - ), + Text( + "${_subtitle.model} : ${device.modelDefinition.modelName}", + style: Theme.of(context).textTheme.subtitle1.copyWith(color: AColors.white), ), ], ), diff --git a/lib/views/widgets/equipment/single_device_picker.dart b/lib/views/widgets/equipment/single_device_picker.dart index 03b0d66f..566037c6 100644 --- a/lib/views/widgets/equipment/single_device_picker.dart +++ b/lib/views/widgets/equipment/single_device_picker.dart @@ -14,6 +14,7 @@ import 'package:test_sa/views/widgets/loaders/no_item_found.dart'; import 'package:test_sa/views/widgets/qr/scan_qr.dart'; import '../app_text_form_field.dart'; + class SingleDevicePicker extends StatefulWidget { static final String id = "/single-device-Picker"; final bool sandraChoice = true; @@ -32,22 +33,16 @@ class _SingleDevicePickerState extends State { TextEditingController numberController = TextEditingController(); TextEditingController snController = TextEditingController(); _getDevice(String result) async { - if(result == null) return; + if (result == null) return; showDialog( barrierDismissible: false, context: context, - builder: (dialogContext){ + builder: (dialogContext) { return const Center(child: CircularProgressIndicator()); - } - ); - List devices = await _devicesProvider.getDevicesListBySN( - host: _settingProvider.host, - user: _userProvider.user, - hospitalId: _userProvider.user.hospital.id, - sn: result - ); + }); + List devices = await _devicesProvider.getDevicesListBySN(host: _settingProvider.host, user: _userProvider.user, hospitalId: _userProvider.user.hospital.id, sn: result); Navigator.of(context).pop(); - if(devices.isEmpty){ + if (devices.isEmpty) { Fluttertoast.showToast(msg: _subtitle.noDeviceFound); return; } @@ -72,7 +67,7 @@ class _SingleDevicePickerState extends State { _userProvider = Provider.of(context); _settingProvider = Provider.of(context); - if(_firstTime && _devicesProvider.devices != null){ + if (_firstTime && _devicesProvider.devices != null) { _searchableList.clear(); _searchableList.addAll(_devicesProvider.devices); } @@ -85,54 +80,42 @@ class _SingleDevicePickerState extends State { isFailedLoading: _devicesProvider.devices == null, onRefresh: () async { _devicesProvider.reset(); - await _devicesProvider.getEquipment( - user: _userProvider.user, - host: _settingProvider.host, - hospitalId: _userProvider.user.hospital?.id - ); + await _devicesProvider.getEquipment(user: _userProvider.user, host: _settingProvider.host, hospitalId: _userProvider.user.hospital?.id); }, child: Column( children: [ const SizedBox(height: 48), Padding( - padding: const EdgeInsets.symmetric(vertical: 8,horizontal: 16), + padding: const EdgeInsets.symmetric(vertical: 8, horizontal: 16), child: Column( children: [ ATextFormField( hintText: _subtitle.searchBySn, controller: snController, - style: Theme.of(context).textTheme.subtitle1, + style: Theme.of(context).textTheme.subtitle1, suffixIcon: const Icon(Icons.search_rounded), textInputAction: TextInputAction.search, onAction: () async { _devicesProvider.reset(); await _devicesProvider.getEquipment( - user: _userProvider.user, - host: _settingProvider.host, - hospitalId: _userProvider.user.hospital?.id, - serialNumber: snController.text, - number: numberController.text - ); + user: _userProvider.user, host: _settingProvider.host, hospitalId: _userProvider.user.hospital?.id, serialNumber: snController.text, number: numberController.text); _searchableList.clear(); _searchableList.addAll(_devicesProvider.devices); }, ), - const SizedBox(height: 8,), + const SizedBox( + height: 8, + ), ATextFormField( hintText: "Search by Number", controller: numberController, - style: Theme.of(context).textTheme.subtitle1, + style: Theme.of(context).textTheme.subtitle1, suffixIcon: const Icon(Icons.search_rounded), textInputAction: TextInputAction.search, onAction: () async { _devicesProvider.reset(); await _devicesProvider.getEquipment( - user: _userProvider.user, - host: _settingProvider.host, - hospitalId: _userProvider.user.hospital?.id, - serialNumber: snController.text, - number: numberController.text - ); + user: _userProvider.user, host: _settingProvider.host, hospitalId: _userProvider.user.hospital?.id, serialNumber: snController.text, number: numberController.text); _searchableList.clear(); _searchableList.addAll(_devicesProvider.devices); }, @@ -141,34 +124,30 @@ class _SingleDevicePickerState extends State { ), ), Expanded( - child: _searchableList.isEmpty ? - NoItemFound(message: _subtitle.noDeviceFound,): - LazyLoading( - nextPage: _devicesProvider.nextPage, - onLazyLoad: () async { - await _devicesProvider.getDevicesList( - user: _userProvider.user, - host: _settingProvider.host, - hospitalId: _userProvider.user.hospital?.id, - serialNumber: snController.text, - number: numberController.text - ); - }, - child:ListView.builder( - padding: EdgeInsets.zero, - shrinkWrap: true, - itemCount: _searchableList.length, - itemBuilder: (listContext,itemIndex){ - return DeviceItem( - device: _searchableList[itemIndex], - onPressed: (device){ - Navigator.of(context).pop(device); - }, - ); - }, - ), - ) - ), + child: _searchableList.isEmpty + ? NoItemFound( + message: _subtitle.noDeviceFound, + ) + : LazyLoading( + nextPage: _devicesProvider.nextPage, + onLazyLoad: () async { + await _devicesProvider.getDevicesList( + user: _userProvider.user, host: _settingProvider.host, hospitalId: _userProvider.user.hospital?.id, serialNumber: snController.text, number: numberController.text); + }, + child: ListView.builder( + padding: EdgeInsets.zero, + shrinkWrap: true, + itemCount: _searchableList.length, + itemBuilder: (listContext, itemIndex) { + return DeviceItem( + device: _searchableList[itemIndex], + onPressed: (device) { + Navigator.of(context).pop(device); + }, + ); + }, + ), + )), ], ), ), diff --git a/lib/views/widgets/gas_refill/gas_refill_create_details_item.dart b/lib/views/widgets/gas_refill/gas_refill_create_details_item.dart index 375a1b1c..41d0806f 100644 --- a/lib/views/widgets/gas_refill/gas_refill_create_details_item.dart +++ b/lib/views/widgets/gas_refill/gas_refill_create_details_item.dart @@ -1,8 +1,8 @@ import 'package:flutter/material.dart'; import 'package:test_sa/models/gas_refill/gas_refill_details.dart'; import 'package:test_sa/views/app_style/colors.dart'; -class GasRefillCreateDetailsItem extends StatelessWidget { +class GasRefillCreateDetailsItem extends StatelessWidget { final GasRefillDetails model; final VoidCallback onDelete; @@ -14,14 +14,7 @@ class GasRefillCreateDetailsItem extends StatelessWidget { crossAxisAlignment: CrossAxisAlignment.start, children: [ Row( - children: [ - Expanded(child: Text(model.type.name)), - IconButton( - onPressed: onDelete, - color: AColors.red, - icon: const Icon(Icons.delete) - ) - ], + children: [Expanded(child: Text(model.type.name)), IconButton(onPressed: onDelete, color: AColors.red, icon: const Icon(Icons.delete))], ), Wrap( spacing: 10, @@ -31,13 +24,13 @@ class GasRefillCreateDetailsItem extends StatelessWidget { Text("Cylinder Type: ${model.cylinderType.name}"), ], ), - if(model.deliveredQuantity != null) - Row( - children: [ - const Text("Delivered Quantity"), - Text(model.deliveredQuantity.toStringAsFixed(0)), - ], - ), + if (model.deliveredQuantity != null) + Row( + children: [ + const Text("Delivered Quantity"), + Text(model.deliveredQuantity.toStringAsFixed(0)), + ], + ), const Divider(), ], ); diff --git a/lib/views/widgets/gas_refill/gas_refill_item.dart b/lib/views/widgets/gas_refill/gas_refill_item.dart index 47af778b..0ad575c1 100644 --- a/lib/views/widgets/gas_refill/gas_refill_item.dart +++ b/lib/views/widgets/gas_refill/gas_refill_item.dart @@ -9,6 +9,7 @@ import 'package:test_sa/models/user.dart'; import 'package:test_sa/views/app_style/colors.dart'; import 'package:test_sa/views/app_style/sizing.dart'; import 'package:test_sa/views/widgets/requests/request_status.dart'; + class GasRefillItem extends StatelessWidget { final int index; final GasRefillModel item; @@ -18,28 +19,22 @@ class GasRefillItem extends StatelessWidget { @override Widget build(BuildContext context) { Subtitle _subtitle = AppLocalization.of(context).subtitle; - User _user = Provider.of(context,listen: false).user; - Color itemColor = index % 2 == 0 - ? Theme.of(context).colorScheme.primary - : Theme.of(context).colorScheme.onPrimary; - Color onItemColor = index % 2 != 0 - ? Theme.of(context).colorScheme.primary - : Theme.of(context).colorScheme.onPrimary; + User _user = Provider.of(context, listen: false).user; + Color itemColor = index % 2 == 0 ? Theme.of(context).colorScheme.primary : Theme.of(context).colorScheme.onPrimary; + Color onItemColor = index % 2 != 0 ? Theme.of(context).colorScheme.primary : Theme.of(context).colorScheme.onPrimary; return Padding( padding: const EdgeInsets.symmetric(vertical: 4), child: ElevatedButton( - style: ElevatedButton.styleFrom( - padding: EdgeInsets.symmetric(vertical: 8,horizontal: 8), - backgroundColor: itemColor, - shape: RoundedRectangleBorder( - borderRadius: BorderRadius.circular( - AppStyle.getBorderRadius(context) - ), - ), - ), + style: ElevatedButton.styleFrom( + padding: EdgeInsets.symmetric(vertical: 8, horizontal: 8), + backgroundColor: itemColor, + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(AppStyle.getBorderRadius(context)), + ), + ), //padding: EdgeInsets.symmetric(vertical: 8,horizontal: 8), - onPressed: (){ + onPressed: () { onPressed(item); }, child: Column( @@ -53,11 +48,7 @@ class GasRefillItem extends StatelessWidget { children: [ Text( item.title ?? "-----", - style: Theme.of(context).textTheme.headline6.copyWith( - color: onItemColor, - fontSize: 16, - fontWeight: FontWeight.bold - ), + style: Theme.of(context).textTheme.headline6.copyWith(color: onItemColor, fontSize: 16, fontWeight: FontWeight.bold), ), Row( children: [ @@ -65,43 +56,39 @@ class GasRefillItem extends StatelessWidget { child: Text( _subtitle.hospital, style: Theme.of(context).textTheme.subtitle2.copyWith( - color: onItemColor, - ), + color: onItemColor, + ), ), ), - if(item.clientName != null) - Text( - item.clientName, - style: Theme.of(context).textTheme.subtitle2.copyWith( - color: onItemColor, + if (item.clientName != null) + Text( + item.clientName, + style: Theme.of(context).textTheme.subtitle2.copyWith( + color: onItemColor, + ), ), - ), - ], ), - Divider(color: onItemColor,), + Divider( + color: onItemColor, + ), Row( children: [ Expanded( child: Text( _subtitle.status, style: Theme.of(context).textTheme.subtitle2.copyWith( - color: onItemColor, - ), + color: onItemColor, + ), ), ), - if(item.status?.id != null) - StatusLabel(label: item.status.name, - color: AColors.getGasStatusColor(item.status.id) - ), + if (item.status?.id != null) StatusLabel(label: item.status.name, color: AColors.getGasStatusColor(item.status.id)), ], ), //Divider(color: onItemColor,), - ], ), ), - ], ), ], diff --git a/lib/views/widgets/gas_refill/gas_refill_list.dart b/lib/views/widgets/gas_refill/gas_refill_list.dart index e25797d2..b6f58e83 100644 --- a/lib/views/widgets/gas_refill/gas_refill_list.dart +++ b/lib/views/widgets/gas_refill/gas_refill_list.dart @@ -6,6 +6,7 @@ import 'package:test_sa/views/pages/user/gas_refill/gas_refill_details.dart'; import 'package:test_sa/views/widgets/gas_refill/gas_refill_item.dart'; import 'package:test_sa/views/widgets/loaders/lazy_loading.dart'; import 'package:test_sa/views/widgets/loaders/no_item_found.dart'; + class GasRefillList extends StatelessWidget { final List items; final bool nextPage; @@ -15,32 +16,31 @@ class GasRefillList extends StatelessWidget { @override Widget build(BuildContext context) { - - if(items.length == 0){ + if (items.length == 0) { Subtitle subtitle = AppLocalization.of(context).subtitle; - return NoItemFound(message: subtitle.noServiceRequestFound,); + return NoItemFound( + message: subtitle.noServiceRequestFound, + ); } return LazyLoading( nextPage: nextPage, onLazyLoad: onLazyLoad, child: ListView.builder( - //physics: const BouncingScrollPhysics(), - itemCount: items.length, - padding: const EdgeInsets.symmetric(horizontal: 16,vertical: 8), - itemBuilder: (context,itemIndex){ + //physics: const BouncingScrollPhysics(), + itemCount: items.length, + padding: const EdgeInsets.symmetric(horizontal: 16, vertical: 8), + itemBuilder: (context, itemIndex) { return GasRefillItem( index: itemIndex, item: items[itemIndex], - onPressed: (model){ - Navigator.of(context).push( - MaterialPageRoute( - builder: (_)=> GasRefillDetails(model: model,) - ) - ); + onPressed: (model) { + Navigator.of(context).push(MaterialPageRoute( + builder: (_) => GasRefillDetails( + model: model, + ))); }, ); - } - ), + }), ); } } diff --git a/lib/views/widgets/gas_refill/gas_refill_update_details_item.dart b/lib/views/widgets/gas_refill/gas_refill_update_details_item.dart index aa9804cb..d71b2612 100644 --- a/lib/views/widgets/gas_refill/gas_refill_update_details_item.dart +++ b/lib/views/widgets/gas_refill/gas_refill_update_details_item.dart @@ -7,8 +7,8 @@ import 'package:test_sa/views/widgets/app_text_form_field.dart'; import 'package:test_sa/views/widgets/requests/info_row.dart'; import 'package:test_sa/views/widgets/titles/app_sub_title.dart'; import 'package:test_sa/views/widgets/titles/app_title.dart'; -class GasRefillUpdateDetailsItem extends StatelessWidget { +class GasRefillUpdateDetailsItem extends StatelessWidget { final GasRefillDetails details; final bool enableEdit; final bool validate; @@ -23,39 +23,42 @@ class GasRefillUpdateDetailsItem extends StatelessWidget { children: [ ATitle(details.type.name), RequestInfoRow( - title: "Cylinder Size", + title: "Cylinder Size", info: details.cylinderSize.name, ), RequestInfoRow( - title: "Requested Quantity", + title: "Requested Quantity", info: details.requestedQuantity.toStringAsFixed(0), ), - enableEdit ? - Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - ASubTitle(subtitle.quantity), - if(validate && details.deliveredQuantity == null) - ASubTitle(subtitle.requiredWord,color: Colors.red,), - SizedBox(height: 4,), - ATextFormField( - initialValue: (details.deliveredQuantity ?? "").toString(), - textAlign: TextAlign.center, - style: Theme.of(context).textTheme.subtitle1, - validator: (value) => - Validator.isNumeric(value) - ? null : "allow numbers only", - textInputType: TextInputType.number, - onSaved: (value){ - details.deliveredQuantity = double.tryParse(value); - }, - ), - ], - ): - RequestInfoRow( - title: "Delivered Quantity", - info: details.deliveredQuantity?.toStringAsFixed(0), - ), + enableEdit + ? Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + ASubTitle(subtitle.quantity), + if (validate && details.deliveredQuantity == null) + ASubTitle( + subtitle.requiredWord, + color: Colors.red, + ), + SizedBox( + height: 4, + ), + ATextFormField( + initialValue: (details.deliveredQuantity ?? "").toString(), + textAlign: TextAlign.center, + style: Theme.of(context).textTheme.subtitle1, + validator: (value) => Validator.isNumeric(value) ? null : "allow numbers only", + textInputType: TextInputType.number, + onSaved: (value) { + details.deliveredQuantity = double.tryParse(value); + }, + ), + ], + ) + : RequestInfoRow( + title: "Delivered Quantity", + info: details.deliveredQuantity?.toStringAsFixed(0), + ), //SizedBox(height: 16,) ], ); diff --git a/lib/views/widgets/hospitals/hospital_auto_complete_field.dart b/lib/views/widgets/hospitals/hospital_auto_complete_field.dart index ca0df0f2..40e1eb6a 100644 --- a/lib/views/widgets/hospitals/hospital_auto_complete_field.dart +++ b/lib/views/widgets/hospitals/hospital_auto_complete_field.dart @@ -8,19 +8,23 @@ import 'package:test_sa/models/hospital.dart'; import 'package:test_sa/models/subtitle.dart'; import 'package:test_sa/views/app_style/colors.dart'; import 'package:test_sa/views/app_style/sizing.dart'; + class HospitalAutoCompleteField extends StatefulWidget { final String initialValue; final Function(Hospital) onSearch; //final Function(Hospital) onSave; - const HospitalAutoCompleteField({Key key, this.onSearch, this.initialValue, }) : super(key: key); + const HospitalAutoCompleteField({ + Key key, + this.onSearch, + this.initialValue, + }) : super(key: key); @override _HospitalAutoCompleteFieldState createState() => _HospitalAutoCompleteFieldState(); } class _HospitalAutoCompleteFieldState extends State { - SettingProvider _settingProvider; TextEditingController _controller; @@ -54,17 +58,17 @@ class _HospitalAutoCompleteFieldState extends State { ), child: TypeAheadField( textFieldConfiguration: TextFieldConfiguration( - style: Theme.of(context).textTheme.headline6, - controller: _controller, - textAlign: TextAlign.center, - decoration: InputDecoration( - hintText: _subtitle.hospital, - border: InputBorder.none, - disabledBorder: InputBorder.none, - focusedBorder: InputBorder.none, - enabledBorder: InputBorder.none, - ), - textInputAction: TextInputAction.search, + style: Theme.of(context).textTheme.headline6, + controller: _controller, + textAlign: TextAlign.center, + decoration: InputDecoration( + hintText: _subtitle.hospital, + border: InputBorder.none, + disabledBorder: InputBorder.none, + focusedBorder: InputBorder.none, + enabledBorder: InputBorder.none, + ), + textInputAction: TextInputAction.search, ), suggestionsCallback: (vale) async { return await HospitalsProvider().getHospitalsList(host: _settingProvider.host, title: vale); diff --git a/lib/views/widgets/hospitals/hospital_button.dart b/lib/views/widgets/hospitals/hospital_button.dart index 2990aca7..86fb867e 100644 --- a/lib/views/widgets/hospitals/hospital_button.dart +++ b/lib/views/widgets/hospitals/hospital_button.dart @@ -6,6 +6,7 @@ import 'package:test_sa/models/subtitle.dart'; import 'package:test_sa/views/app_style/colors.dart'; import 'package:test_sa/views/app_style/sizing.dart'; import 'package:test_sa/views/widgets/hospitals/single_hospital_picker.dart'; + class HospitalButton extends StatelessWidget { final Function(Hospital) onHospitalPick; final Hospital hospital; @@ -31,7 +32,7 @@ class HospitalButton extends StatelessWidget { child: Text( hospital?.name ?? _subtitle.pickHospital, style: Theme.of(context).textTheme.bodyText1.copyWith(fontSize: 14, color: AColors.grey3A), - // textScaleFactor: AppStyle.getScaleFactor(context), + // textScaleFactor: AppStyle.getScaleFactor(context), textDirection: TextDirection.rtl, textAlign: TextAlign.left, ), diff --git a/lib/views/widgets/hospitals/hospital_item.dart b/lib/views/widgets/hospitals/hospital_item.dart index 3ee5b699..02281449 100644 --- a/lib/views/widgets/hospitals/hospital_item.dart +++ b/lib/views/widgets/hospitals/hospital_item.dart @@ -2,6 +2,7 @@ import 'package:flutter/material.dart'; import 'package:test_sa/models/hospital.dart'; import 'package:test_sa/views/app_style/colors.dart'; import 'package:test_sa/views/app_style/sizing.dart'; + class HospitalItem extends StatelessWidget { final Hospital hospital; final Function(Hospital) onPressed; @@ -10,29 +11,25 @@ class HospitalItem extends StatelessWidget { @override Widget build(BuildContext context) { return Padding( - padding: const EdgeInsets.symmetric(horizontal: 16,vertical: 6), + padding: const EdgeInsets.symmetric(horizontal: 16, vertical: 6), child: ElevatedButton( style: ElevatedButton.styleFrom( backgroundColor: AColors.primaryColor, shape: RoundedRectangleBorder( - borderRadius: BorderRadius.circular( - AppStyle.getBorderRadius(context) - ), + borderRadius: BorderRadius.circular(AppStyle.getBorderRadius(context)), ), ), - - onPressed: onPressed == null ? null : (){ - onPressed(hospital); - }, + onPressed: onPressed == null + ? null + : () { + onPressed(hospital); + }, child: ListTile( title: Text( - hospital.name ?? "", - style: Theme.of(context).textTheme.subtitle1.copyWith( - color: AColors.white - ), + hospital.name ?? "", + style: Theme.of(context).textTheme.subtitle1.copyWith(color: AColors.white), textDirection: TextDirection.rtl, ), - ), ), ); diff --git a/lib/views/widgets/hospitals/single_hospital_picker.dart b/lib/views/widgets/hospitals/single_hospital_picker.dart index 27ca0861..244166f6 100644 --- a/lib/views/widgets/hospitals/single_hospital_picker.dart +++ b/lib/views/widgets/hospitals/single_hospital_picker.dart @@ -10,6 +10,7 @@ import 'package:test_sa/views/widgets/loaders/loading_manager.dart'; import 'package:test_sa/views/widgets/loaders/no_item_found.dart'; import '../app_text_form_field.dart'; + class SingleHospitalPicker extends StatefulWidget { static final String id = "/single-Hospital-Picker"; final bool sandraChoice = true; @@ -26,7 +27,7 @@ class _SingleHospitalPickerState extends State { Widget build(BuildContext context) { _hospitalsProvider = Provider.of(context); _settingProvider = Provider.of(context); - if(_firstTime && _hospitalsProvider.hospitals != null){ + if (_firstTime && _hospitalsProvider.hospitals != null) { _searchableList.addAll(_hospitalsProvider.hospitals); _firstTime = false; } @@ -39,44 +40,46 @@ class _SingleHospitalPickerState extends State { isFailedLoading: _hospitalsProvider.hospitals == null, onRefresh: () async { _hospitalsProvider.reset(); - await _hospitalsProvider.getHospitals(host: _settingProvider.host,); + await _hospitalsProvider.getHospitals( + host: _settingProvider.host, + ); }, child: Column( children: [ - SizedBox(height: 48,), + SizedBox( + height: 48, + ), Padding( - padding: const EdgeInsets.symmetric(vertical: 8,horizontal: 16), + padding: const EdgeInsets.symmetric(vertical: 8, horizontal: 16), child: ATextFormField( hintText: _subtitle.searchByName, - style: Theme.of(context).textTheme.headline6, + style: Theme.of(context).textTheme.headline6, suffixIcon: Icon(Icons.search_rounded), - onChange: (value){ + onChange: (value) { _searchableList.clear(); - _searchableList.addAll(_hospitalsProvider.hospitals.where( - (element) => element.name.toLowerCase().contains( - value.toLowerCase() - ) - ).toList()); + _searchableList.addAll(_hospitalsProvider.hospitals.where((element) => element.name.toLowerCase().contains(value.toLowerCase())).toList()); setState(() {}); }, ), ), Expanded( - child: _searchableList.isEmpty ? - NoItemFound(message: _subtitle.noHospitalFound,): - ListView.builder( - padding: EdgeInsets.zero, - shrinkWrap: true, - itemCount: _searchableList.length, - itemBuilder: (listContext,itemIndex){ - return HospitalItem( - hospital: _searchableList[itemIndex], - onPressed: (hospital){ - Navigator.of(context).pop(hospital); - }, - ); - }, - ), + child: _searchableList.isEmpty + ? NoItemFound( + message: _subtitle.noHospitalFound, + ) + : ListView.builder( + padding: EdgeInsets.zero, + shrinkWrap: true, + itemCount: _searchableList.length, + itemBuilder: (listContext, itemIndex) { + return HospitalItem( + hospital: _searchableList[itemIndex], + onPressed: (hospital) { + Navigator.of(context).pop(hospital); + }, + ); + }, + ), ), ], ), diff --git a/lib/views/widgets/images/image_item.dart b/lib/views/widgets/images/image_item.dart index 5e2412a0..5d2dee91 100644 --- a/lib/views/widgets/images/image_item.dart +++ b/lib/views/widgets/images/image_item.dart @@ -3,17 +3,13 @@ import 'package:font_awesome_flutter/font_awesome_flutter.dart'; import 'package:test_sa/views/app_style/colors.dart'; import 'package:test_sa/views/app_style/sizing.dart'; import 'package:test_sa/views/widgets/loaders/image_loader.dart'; + class ImageItem extends StatelessWidget { final String url; final bool isVideo; final VoidCallback onPressed; - const ImageItem({ - Key key, - this.url, - this.isVideo = false, - this.onPressed - }) : super(key: key); + const ImageItem({Key key, this.url, this.isVideo = false, this.onPressed}) : super(key: key); @override Widget build(BuildContext context) { @@ -24,11 +20,11 @@ class ImageItem extends StatelessWidget { horizontal: 4 * AppStyle.getScaleFactor(context), ), decoration: BoxDecoration( - border: Border.all( - color: Theme.of(context).dividerColor, - width: 2 * AppStyle.getScaleFactor(context), - ), - borderRadius: BorderRadius.circular(8 * AppStyle.getScaleFactor(context)), + border: Border.all( + color: Theme.of(context).dividerColor, + width: 2 * AppStyle.getScaleFactor(context), + ), + borderRadius: BorderRadius.circular(8 * AppStyle.getScaleFactor(context)), ), child: ClipRRect( borderRadius: BorderRadius.circular(6 * AppStyle.getScaleFactor(context)), @@ -36,26 +32,27 @@ class ImageItem extends StatelessWidget { fit: StackFit.expand, alignment: Alignment.center, children: [ - ImageLoader(url: url,), + ImageLoader( + url: url, + ), MaterialButton( onPressed: onPressed, padding: EdgeInsets.zero, child: Visibility( - visible: isVideo, - child: Center( - child: Container( - decoration: BoxDecoration( - color: Colors.black45, - shape: BoxShape.circle, - ), - child: FaIcon( - FontAwesomeIcons.playCircle, - size: 32 * AppStyle.getScaleFactor(context), - color: AColors.orange, + visible: isVideo, + child: Center( + child: Container( + decoration: BoxDecoration( + color: Colors.black45, + shape: BoxShape.circle, + ), + child: FaIcon( + FontAwesomeIcons.playCircle, + size: 32 * AppStyle.getScaleFactor(context), + color: AColors.orange, + ), ), - ), - ) - ), + )), ), ], ), diff --git a/lib/views/widgets/images/images_list.dart b/lib/views/widgets/images/images_list.dart index df2bdb0d..f130f6dd 100644 --- a/lib/views/widgets/images/images_list.dart +++ b/lib/views/widgets/images/images_list.dart @@ -3,6 +3,7 @@ import 'package:test_sa/views/app_style/sizing.dart'; import 'image_item.dart'; import 'images_viewer.dart'; + class ImagesList extends StatelessWidget { final List images; final EdgeInsets padding; @@ -12,22 +13,20 @@ class ImagesList extends StatelessWidget { @override Widget build(BuildContext context) { return ListView.builder( - padding: padding?? EdgeInsets.symmetric(horizontal: 32 * AppStyle.getScaleFactor(context)), - scrollDirection: Axis.horizontal, - itemCount: images.length, - itemBuilder: (context,itemIndex){ - return ImageItem( - url: images[itemIndex], - onPressed: (){ - Navigator.of(context).push( - MaterialPageRoute(builder: (_)=> ImagesViewer( - initialIndex: itemIndex, - images: images, - )) - ); - }, - ); - } - ); + padding: padding ?? EdgeInsets.symmetric(horizontal: 32 * AppStyle.getScaleFactor(context)), + scrollDirection: Axis.horizontal, + itemCount: images.length, + itemBuilder: (context, itemIndex) { + return ImageItem( + url: images[itemIndex], + onPressed: () { + Navigator.of(context).push(MaterialPageRoute( + builder: (_) => ImagesViewer( + initialIndex: itemIndex, + images: images, + ))); + }, + ); + }); } } diff --git a/lib/views/widgets/images/images_viewer.dart b/lib/views/widgets/images/images_viewer.dart index 865f0306..b4becc05 100644 --- a/lib/views/widgets/images/images_viewer.dart +++ b/lib/views/widgets/images/images_viewer.dart @@ -20,53 +20,60 @@ class ImagesViewer extends StatelessWidget { child: SafeArea( child: Column( children: [ - images.length == 1 ? SizedBox.shrink() : - Column( - children: [ - SizedBox(height: 8 * AppStyle.getScaleFactor(context),), - TabBar( - isScrollable: images.length * 84 > MediaQuery.of(context).size.width, - indicator: BoxDecoration( - color: Theme.of(context).primaryColor, - borderRadius: BorderRadius.only( - topRight: Radius.circular(24 * AppStyle.getScaleFactor(context)), - bottomLeft: Radius.circular(24 * AppStyle.getScaleFactor(context)), - ), - ), - indicatorSize: TabBarIndicatorSize.label, - tabs: images.map( - (imagePath) => InteractiveViewer( - child: Container( - height: 60, - width: 80, - padding: EdgeInsets.all(AppStyle.getScaleFactor(context),), - child: ClipRRect( - borderRadius: BorderRadius.only( - topRight: Radius.circular(22 * AppStyle.getScaleFactor(context)), - bottomLeft: Radius.circular(22 * AppStyle.getScaleFactor(context)), - ), - child: ImageLoader( - url: imagePath, - boxFit: BoxFit.cover, - ), + images.length == 1 + ? SizedBox.shrink() + : Column( + children: [ + SizedBox( + height: 8 * AppStyle.getScaleFactor(context), + ), + TabBar( + isScrollable: images.length * 84 > MediaQuery.of(context).size.width, + indicator: BoxDecoration( + color: Theme.of(context).primaryColor, + borderRadius: BorderRadius.only( + topRight: Radius.circular(24 * AppStyle.getScaleFactor(context)), + bottomLeft: Radius.circular(24 * AppStyle.getScaleFactor(context)), ), ), - ) - ).toList(), - ), - SizedBox(height: 8 * AppStyle.getScaleFactor(context),), - ], - ), + indicatorSize: TabBarIndicatorSize.label, + tabs: images + .map((imagePath) => InteractiveViewer( + child: Container( + height: 60, + width: 80, + padding: EdgeInsets.all( + AppStyle.getScaleFactor(context), + ), + child: ClipRRect( + borderRadius: BorderRadius.only( + topRight: Radius.circular(22 * AppStyle.getScaleFactor(context)), + bottomLeft: Radius.circular(22 * AppStyle.getScaleFactor(context)), + ), + child: ImageLoader( + url: imagePath, + boxFit: BoxFit.cover, + ), + ), + ), + )) + .toList(), + ), + SizedBox( + height: 8 * AppStyle.getScaleFactor(context), + ), + ], + ), Expanded( child: TabBarView( - children: images.map( - (imagePath) => InteractiveViewer( - child: ImageLoader( - url: imagePath, - boxFit: BoxFit.contain, - ), - ) - ).toList(), + children: images + .map((imagePath) => InteractiveViewer( + child: ImageLoader( + url: imagePath, + boxFit: BoxFit.contain, + ), + )) + .toList(), ), ), ], diff --git a/lib/views/widgets/images/mini_one_image_picker.dart b/lib/views/widgets/images/mini_one_image_picker.dart index 710e960d..13c8f424 100644 --- a/lib/views/widgets/images/mini_one_image_picker.dart +++ b/lib/views/widgets/images/mini_one_image_picker.dart @@ -12,7 +12,7 @@ class AMiniOneImagePicker extends StatefulWidget { final File image; final String label; final bool error; - const AMiniOneImagePicker({Key key, this.label, this.error,this.image, this.onPick}) : super(key: key); + const AMiniOneImagePicker({Key key, this.label, this.error, this.image, this.onPick}) : super(key: key); @override _AMiniOneImagePickerState createState() => _AMiniOneImagePickerState(); @@ -26,6 +26,7 @@ class _AMiniOneImagePickerState extends State { super.initState(); _image = widget.image; } + @override Widget build(BuildContext context) { _subtitle = AppLocalization.of(context).subtitle; @@ -33,12 +34,14 @@ class _AMiniOneImagePickerState extends State { crossAxisAlignment: CrossAxisAlignment.start, children: [ Visibility( - visible: widget.label != null, + visible: widget.label != null, child: Column( children: [ - SizedBox(height: 8 * AppStyle.getScaleFactor(context),), + SizedBox( + height: 8 * AppStyle.getScaleFactor(context), + ), Text( - widget.label?? '', + widget.label ?? '', style: Theme.of(context).textTheme.headline6, textScaleFactor: AppStyle.getScaleFactor(context), ), @@ -49,32 +52,29 @@ class _AMiniOneImagePickerState extends State { visible: _image == null && widget.error == true, child: Column( children: [ - SizedBox(height: 4,), + SizedBox( + height: 4, + ), Text( _subtitle.requiredImage, - style: Theme.of(context).textTheme.headline6.copyWith( - color: Colors.red - ), + style: Theme.of(context).textTheme.headline6.copyWith(color: Colors.red), textScaleFactor: AppStyle.getScaleFactor(context), ), ], ), ), - SizedBox(height: 8,), + SizedBox( + height: 8, + ), Container( width: MediaQuery.of(context).size.width, child: ElevatedButton( style: ElevatedButton.styleFrom( - shape: RoundedRectangleBorder( - borderRadius: BorderRadius.circular( - AppStyle.borderRadius * AppStyle.getScaleFactor(context) - ) - ), + shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(AppStyle.borderRadius * AppStyle.getScaleFactor(context))), //primary: Colors.grey[200], textStyle: Theme.of(context).textTheme.overline, padding: _image == null ? null : EdgeInsets.zero, ), - child: Padding( padding: const EdgeInsets.all(8.0), child: Text( @@ -86,40 +86,30 @@ class _AMiniOneImagePickerState extends State { ImageSource source = await showDialog( context: context, builder: (_) => CupertinoAlertDialog( - actions: [ - TextButton( - child: Text("pick from camera"), - onPressed: () { - Navigator.of(context).pop(ImageSource.camera); - }, - ), - TextButton( - child: Text("pick from gallery"), - onPressed: () { - Navigator.of(context).pop(ImageSource.gallery); - }, - ), - ], - ) - ); - if(source == null) - return; - - final pickedFile = await ImagePicker().pickImage( - source: source, - imageQuality: 70, - maxWidth: 1000, - maxHeight: 1000 - ); + actions: [ + TextButton( + child: Text("pick from camera"), + onPressed: () { + Navigator.of(context).pop(ImageSource.camera); + }, + ), + TextButton( + child: Text("pick from gallery"), + onPressed: () { + Navigator.of(context).pop(ImageSource.gallery); + }, + ), + ], + )); + if (source == null) return; + final pickedFile = await ImagePicker().pickImage(source: source, imageQuality: 70, maxWidth: 1000, maxHeight: 1000); setState(() { if (pickedFile != null) { _image = File(pickedFile.path); widget.onPick(_image); - } else { - - } + } else {} }); }, ), @@ -127,4 +117,4 @@ class _AMiniOneImagePickerState extends State { ], ); } -} \ No newline at end of file +} diff --git a/lib/views/widgets/images/multi_image_picker_item.dart b/lib/views/widgets/images/multi_image_picker_item.dart index be1d1b15..e540cc2b 100644 --- a/lib/views/widgets/images/multi_image_picker_item.dart +++ b/lib/views/widgets/images/multi_image_picker_item.dart @@ -5,9 +5,7 @@ import 'package:test_sa/views/app_style/colors.dart'; import 'package:test_sa/views/app_style/sizing.dart'; import 'package:test_sa/views/widgets/buttons/app_back_button.dart'; - class MultiImagesPickerItem extends StatelessWidget { - final File image; final Function(File) onRemoveTap; @@ -18,58 +16,43 @@ class MultiImagesPickerItem extends StatelessWidget { return Container( width: 80 * AppStyle.getScaleFactor(context), height: 80 * AppStyle.getScaleFactor(context), - decoration: BoxDecoration( - boxShadow: [ - BoxShadow( - color: Colors.black38, - blurRadius: 2 - ) - ], - image: DecorationImage( - image:FileImage(image), - fit: BoxFit.cover - ), - borderRadius: BorderRadius.circular(8) - ), + decoration: + BoxDecoration(boxShadow: [BoxShadow(color: Colors.black38, blurRadius: 2)], image: DecorationImage(image: FileImage(image), fit: BoxFit.cover), borderRadius: BorderRadius.circular(8)), child: MaterialButton( padding: EdgeInsets.zero, - onPressed: (){ - Navigator.of(context).push( - MaterialPageRoute( - builder: (_)=> Scaffold( + onPressed: () { + Navigator.of(context).push(MaterialPageRoute( + builder: (_) => Scaffold( body: SafeArea( child: Stack( children: [ Center( child: InteractiveViewer( - child: Image(image:FileImage(image),) - ), + child: Image( + image: FileImage(image), + )), ), ABackButton(), ], ), ), - ) - ) - ); + ))); }, child: Align( - alignment: Alignment.topRight, - child: IconButton( + alignment: Alignment.topRight, + child: IconButton( padding: const EdgeInsets.all(2.0), icon: Container( padding: EdgeInsets.all(1), - decoration: BoxDecoration( - color: Theme.of(context).scaffoldBackgroundColor.withOpacity(.3), - borderRadius: BorderRadius.circular(8) - ), - child: Icon(Icons.remove_circle,color: AColors.red,) - ), - onPressed: (){ + decoration: BoxDecoration(color: Theme.of(context).scaffoldBackgroundColor.withOpacity(.3), borderRadius: BorderRadius.circular(8)), + child: Icon( + Icons.remove_circle, + color: AColors.red, + )), + onPressed: () { onRemoveTap(image); }, - ) - ), + )), ), ); } diff --git a/lib/views/widgets/images/one_image_picker.dart b/lib/views/widgets/images/one_image_picker.dart index 3ff3ebbf..08647cb7 100644 --- a/lib/views/widgets/images/one_image_picker.dart +++ b/lib/views/widgets/images/one_image_picker.dart @@ -12,7 +12,7 @@ class AOneImagePicker extends StatefulWidget { final File image; final String label; final bool error; - const AOneImagePicker({Key key, this.label, this.error,this.image, this.onPick}) : super(key: key); + const AOneImagePicker({Key key, this.label, this.error, this.image, this.onPick}) : super(key: key); @override _AOneImagePickerState createState() => _AOneImagePickerState(); @@ -26,6 +26,7 @@ class _AOneImagePickerState extends State { super.initState(); _image = widget.image; } + @override Widget build(BuildContext context) { _subtitle = AppLocalization.of(context).subtitle; @@ -33,12 +34,14 @@ class _AOneImagePickerState extends State { crossAxisAlignment: CrossAxisAlignment.start, children: [ Visibility( - visible: widget.label != null, + visible: widget.label != null, child: Column( children: [ - SizedBox(height: 8 * AppStyle.getScaleFactor(context),), + SizedBox( + height: 8 * AppStyle.getScaleFactor(context), + ), Text( - widget.label?? '', + widget.label ?? '', style: Theme.of(context).textTheme.headline6, textScaleFactor: AppStyle.getScaleFactor(context), ), @@ -49,79 +52,66 @@ class _AOneImagePickerState extends State { visible: _image == null && widget.error == true, child: Column( children: [ - SizedBox(height: 4,), + SizedBox( + height: 4, + ), Text( _subtitle.requiredImage, - style: Theme.of(context).textTheme.headline6.copyWith( - color: Colors.red - ), + style: Theme.of(context).textTheme.headline6.copyWith(color: Colors.red), textScaleFactor: AppStyle.getScaleFactor(context), ), ], ), ), - SizedBox(height: 8,), + SizedBox( + height: 8, + ), Container( height: MediaQuery.of(context).size.height / 8, width: MediaQuery.of(context).size.width, child: ElevatedButton( style: ElevatedButton.styleFrom( - shape: RoundedRectangleBorder( - borderRadius: BorderRadius.circular( - AppStyle.borderRadius * AppStyle.getScaleFactor(context) - ) - ), + shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(AppStyle.borderRadius * AppStyle.getScaleFactor(context))), primary: Colors.grey[200], padding: _image == null ? null : EdgeInsets.zero, ), - - child: _image == null ? - Text( - _subtitle.pickImage, - style: Theme.of(context).textTheme.headline6, - textScaleFactor: AppStyle.getScaleFactor(context), - ): - ClipRRect( - borderRadius: BorderRadius.circular( - AppStyle.borderRadius * AppStyle.getScaleFactor(context) - ), - child: Image( - height: MediaQuery.of(context).size.height / 6, - width: MediaQuery.of(context).size.width, - image: FileImage(_image), - fit: BoxFit.cover, - ), - ), + child: _image == null + ? Text( + _subtitle.pickImage, + style: Theme.of(context).textTheme.headline6, + textScaleFactor: AppStyle.getScaleFactor(context), + ) + : ClipRRect( + borderRadius: BorderRadius.circular(AppStyle.borderRadius * AppStyle.getScaleFactor(context)), + child: Image( + height: MediaQuery.of(context).size.height / 6, + width: MediaQuery.of(context).size.width, + image: FileImage(_image), + fit: BoxFit.cover, + ), + ), onPressed: () async { ImageSource source = await showDialog( context: context, builder: (_) => CupertinoAlertDialog( - actions: [ - TextButton( - child: Text("pick from camera"), - onPressed: () { - Navigator.of(context).pop(ImageSource.camera); - }, - ), - TextButton( - child: Text("pick from gallery"), - onPressed: () { - Navigator.of(context).pop(ImageSource.gallery); - }, - ), - ], - ) - ); - if(source == null) - return; - - final pickedFile = await ImagePicker().pickImage( - source: source, - imageQuality: 70, - maxWidth: 1000, - maxHeight: 1000 - ); + actions: [ + TextButton( + child: Text("pick from camera"), + onPressed: () { + Navigator.of(context).pop(ImageSource.camera); + }, + ), + TextButton( + child: Text("pick from gallery"), + onPressed: () { + Navigator.of(context).pop(ImageSource.gallery); + }, + ), + ], + )); + if (source == null) return; + final pickedFile = await ImagePicker().pickImage(source: source, imageQuality: 70, maxWidth: 1000, maxHeight: 1000); setState(() { if (pickedFile != null) { @@ -135,4 +125,4 @@ class _AOneImagePickerState extends State { ], ); } -} \ No newline at end of file +} diff --git a/lib/views/widgets/issues/report_issue_item.dart b/lib/views/widgets/issues/report_issue_item.dart index 8a952be7..8aba4e91 100644 --- a/lib/views/widgets/issues/report_issue_item.dart +++ b/lib/views/widgets/issues/report_issue_item.dart @@ -1,25 +1,21 @@ import 'package:flutter/material.dart'; import 'package:test_sa/views/app_style/colors.dart'; import 'package:test_sa/views/app_style/sizing.dart'; + class ReportIssueItem extends StatelessWidget { final bool isSelected; final String issueInfo; - final Function(String,bool) onChange; + final Function(String, bool) onChange; - const ReportIssueItem({ - Key key, - this.isSelected, - this.issueInfo, - this.onChange - }) : super(key: key); + const ReportIssueItem({Key key, this.isSelected, this.issueInfo, this.onChange}) : super(key: key); @override Widget build(BuildContext context) { return MaterialButton( splashColor: AColors.secondaryColor.withOpacity(.5), padding: EdgeInsets.symmetric(vertical: 4), - onPressed: (){ - onChange(issueInfo,!isSelected); + onPressed: () { + onChange(issueInfo, !isSelected); }, child: Column( children: [ @@ -36,14 +32,11 @@ class ReportIssueItem extends StatelessWidget { ), ), Padding( - padding: const EdgeInsets.symmetric( - horizontal: 16, - vertical: 8 - ), + padding: const EdgeInsets.symmetric(horizontal: 16, vertical: 8), child: Checkbox( value: isSelected, - onChanged: (value){ - onChange(issueInfo,value); + onChanged: (value) { + onChange(issueInfo, value); }, ), ), diff --git a/lib/views/widgets/loaders/app_lazy_loading.dart b/lib/views/widgets/loaders/app_lazy_loading.dart index e3378c98..a52417e5 100644 --- a/lib/views/widgets/loaders/app_lazy_loading.dart +++ b/lib/views/widgets/loaders/app_lazy_loading.dart @@ -2,6 +2,7 @@ import 'package:flutter/material.dart'; import 'package:test_sa/views/app_style/sizing.dart'; import 'app_loading.dart'; + class ALazyLoading extends StatelessWidget { @override Widget build(BuildContext context) { @@ -10,13 +11,7 @@ class ALazyLoading extends StatelessWidget { height: 36 * AppStyle.getScaleFactor(context), width: 36 * AppStyle.getScaleFactor(context), padding: EdgeInsets.all(8), - decoration: BoxDecoration( - color: Colors.white, - shape: BoxShape.circle, - boxShadow: [ - AppStyle.boxShadow - ] - ), + decoration: BoxDecoration(color: Colors.white, shape: BoxShape.circle, boxShadow: [AppStyle.boxShadow]), child: ALoading(), ), ); diff --git a/lib/views/widgets/loaders/app_loading.dart b/lib/views/widgets/loaders/app_loading.dart index 71623050..267313c3 100644 --- a/lib/views/widgets/loaders/app_loading.dart +++ b/lib/views/widgets/loaders/app_loading.dart @@ -1,4 +1,5 @@ import 'package:flutter/material.dart'; + class ALoading extends StatelessWidget { const ALoading({Key key}) : super(key: key); diff --git a/lib/views/widgets/loaders/failed_loading.dart b/lib/views/widgets/loaders/failed_loading.dart index 5039628b..dc8f39b5 100644 --- a/lib/views/widgets/loaders/failed_loading.dart +++ b/lib/views/widgets/loaders/failed_loading.dart @@ -1,15 +1,11 @@ - import 'package:flutter/material.dart'; import 'package:test_sa/views/app_style/sizing.dart'; + class FailedLoading extends StatelessWidget { final String message; final VoidCallback onReload; - const FailedLoading({ - Key key, - this.message, - this.onReload - }) : super(key: key); + const FailedLoading({Key key, this.message, this.onReload}) : super(key: key); @override Widget build(BuildContext context) { return Center( @@ -17,11 +13,13 @@ class FailedLoading extends StatelessWidget { mainAxisAlignment: MainAxisAlignment.center, children: [ Text( - message?? "Error Request Failed", + message ?? "Error Request Failed", style: Theme.of(context).textTheme.subtitle1, textScaleFactor: AppStyle.getScaleFactor(context), ), - SizedBox(height: 16,), + SizedBox( + height: 16, + ), OutlinedButton( child: Text("try again"), onPressed: onReload, diff --git a/lib/views/widgets/loaders/image_loader.dart b/lib/views/widgets/loaders/image_loader.dart index 7550de1d..7093d0a3 100644 --- a/lib/views/widgets/loaders/image_loader.dart +++ b/lib/views/widgets/loaders/image_loader.dart @@ -1,17 +1,12 @@ import 'package:cached_network_image/cached_network_image.dart'; import 'package:flutter/material.dart'; + class ImageLoader extends StatelessWidget { final String url; final BoxFit boxFit; final Color color; final Alignment alignment; - const ImageLoader({ - Key key, - @required this.url, - this.boxFit, - this.color, - this.alignment - }) : super(key: key); + const ImageLoader({Key key, @required this.url, this.boxFit, this.color, this.alignment}) : super(key: key); @override Widget build(BuildContext context) { diff --git a/lib/views/widgets/loaders/lazy_loading.dart b/lib/views/widgets/loaders/lazy_loading.dart index f59871e3..04f430c0 100644 --- a/lib/views/widgets/loaders/lazy_loading.dart +++ b/lib/views/widgets/loaders/lazy_loading.dart @@ -2,6 +2,7 @@ import 'package:flutter/material.dart'; import 'package:test_sa/views/app_style/sizing.dart'; import 'app_loading.dart'; + class LazyLoading extends StatefulWidget { final Widget child; final bool nextPage; @@ -21,7 +22,6 @@ class LazyLoading extends StatefulWidget { } class _LazyLoadingState extends State with TickerProviderStateMixin { - AnimationController _animationController; Animation _offsetAnimation; @@ -30,7 +30,7 @@ class _LazyLoadingState extends State with TickerProviderStateMixin //_animationController.forward(); await widget.onLazyLoad(); await Future.delayed(Duration(milliseconds: 600)); - // _animationController.reverse(); + // _animationController.reverse(); } } @@ -43,13 +43,12 @@ class _LazyLoadingState extends State with TickerProviderStateMixin ); _offsetAnimation = Tween( - begin: const Offset(0.0, .8), + begin: const Offset(0.0, .8), end: const Offset(0, .4), ).animate(CurvedAnimation( parent: _animationController, curve: Curves.easeInOutBack, )); - } @override @@ -64,13 +63,12 @@ class _LazyLoadingState extends State with TickerProviderStateMixin children: [ NotificationListener( onNotification: (notification) { - if(notification.metrics.pixels >= notification.metrics.maxScrollExtent){ + if (notification.metrics.pixels >= notification.metrics.maxScrollExtent) { _scrollListener(); } return false; }, - child: widget.child - ), + child: widget.child), SlideTransition( position: _offsetAnimation, child: Center( @@ -80,13 +78,7 @@ class _LazyLoadingState extends State with TickerProviderStateMixin height: 36 * AppStyle.getScaleFactor(context), width: 36 * AppStyle.getScaleFactor(context), padding: EdgeInsets.all(8), - decoration: BoxDecoration( - color: Colors.white, - shape: BoxShape.circle, - boxShadow: [ - AppStyle.boxShadow - ] - ), + decoration: BoxDecoration(color: Colors.white, shape: BoxShape.circle, boxShadow: [AppStyle.boxShadow]), child: ALoading(), ), ), diff --git a/lib/views/widgets/loaders/loading_manager.dart b/lib/views/widgets/loaders/loading_manager.dart index d2a5273d..7ab67a60 100644 --- a/lib/views/widgets/loaders/loading_manager.dart +++ b/lib/views/widgets/loaders/loading_manager.dart @@ -5,6 +5,7 @@ import 'package:test_sa/models/subtitle.dart'; import 'app_loading.dart'; import 'failed_loading.dart'; + class LoadingManager extends StatefulWidget { final bool isLoading; final bool isFailedLoading; @@ -32,10 +33,9 @@ class LoadingManager extends StatefulWidget { } class _LoadingManagerState extends State { - @override void initState() { - if(widget.onRefresh != null && widget.stateCode == null){ + if (widget.onRefresh != null && widget.stateCode == null) { WidgetsBinding.instance.addPostFrameCallback((timeStamp) { widget.onRefresh(); }); @@ -48,7 +48,7 @@ class _LoadingManagerState extends State { Subtitle subtitle = AppLocalization.of(context).subtitle; Widget placeHolder; // to load data if load not start - if(widget.isLoading != true && widget.stateCode == null){ + if (widget.isLoading != true && widget.stateCode == null) { WidgetsBinding.instance.addPostFrameCallback((timeStamp) { widget.onRefresh(); }); @@ -56,20 +56,19 @@ class _LoadingManagerState extends State { // if loading of still not start in loading (true or null) // return loading widget - if(widget.isLoading != false || widget.stateCode == null){ + if (widget.isLoading != false || widget.stateCode == null) { placeHolder = ALoading(); - }else if(widget.isFailedLoading && !widget.isNotPage){ + } else if (widget.isFailedLoading && !widget.isNotPage) { // if failed return failed widget placeHolder = FailedLoading( - message: HttpStatusManger.getStatusMessage( - status: widget.stateCode, subtitle: subtitle), + message: HttpStatusManger.getStatusMessage(status: widget.stateCode, subtitle: subtitle), onReload: widget.onRefresh, ); } // if load end successfully return loaded widget return RefreshIndicator( - onRefresh: () async{ + onRefresh: () async { await widget.onRefresh(); }, child: AnimatedSwitcher( diff --git a/lib/views/widgets/loaders/no_item_found.dart b/lib/views/widgets/loaders/no_item_found.dart index 5ed637e7..3466f7e7 100644 --- a/lib/views/widgets/loaders/no_item_found.dart +++ b/lib/views/widgets/loaders/no_item_found.dart @@ -1,5 +1,6 @@ import 'package:flutter/material.dart'; import 'package:test_sa/views/app_style/sizing.dart'; + class NoItemFound extends StatelessWidget { final String message; @@ -14,7 +15,7 @@ class NoItemFound extends StatelessWidget { children: [ Center( child: Text( - message ?? "no item found", + message ?? "no item found", style: Theme.of(context).textTheme.headline6, textScaleFactor: AppStyle.getScaleFactor(context), ), diff --git a/lib/views/widgets/notifications/notification_item.dart b/lib/views/widgets/notifications/notification_item.dart index f505b5d3..c548f628 100644 --- a/lib/views/widgets/notifications/notification_item.dart +++ b/lib/views/widgets/notifications/notification_item.dart @@ -3,32 +3,28 @@ import 'package:flutter/material.dart'; import 'package:test_sa/models/app_notification.dart'; import 'package:test_sa/views/app_style/colors.dart'; import 'package:test_sa/views/app_style/sizing.dart'; + class NotificationItem extends StatelessWidget { final AppNotification notification; final Function(AppNotification) onPressed; const NotificationItem({Key key, this.notification, this.onPressed}) : super(key: key); - @override Widget build(BuildContext context) { return Padding( padding: const EdgeInsets.symmetric(vertical: 4), child: ElevatedButton( style: ElevatedButton.styleFrom( - padding: EdgeInsets.symmetric(vertical: 8,horizontal: 8), + padding: EdgeInsets.symmetric(vertical: 8, horizontal: 8), primary: AColors.primaryColor, shape: RoundedRectangleBorder( - borderRadius: BorderRadius.circular( - AppStyle.getBorderRadius(context) - ), + borderRadius: BorderRadius.circular(AppStyle.getBorderRadius(context)), ), ), - - onPressed: (){ + onPressed: () { onPressed(notification); }, - - child:Column( + child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ Row( @@ -36,30 +32,24 @@ class NotificationItem extends StatelessWidget { Expanded( child: Text( notification.title ?? "No Hospital Found", - style: Theme.of(context).textTheme.headline6.copyWith( - color: AColors.white, - fontSize: 16, - fontWeight: FontWeight.bold - ), + style: Theme.of(context).textTheme.headline6.copyWith(color: AColors.white, fontSize: 16, fontWeight: FontWeight.bold), ), ), Text( notification.date ?? "complaint not available", - style: Theme.of(context).textTheme.subtitle1.copyWith( - color: AColors.white, - fontSize: 12, - fontWeight: FontWeight.bold - ), + style: Theme.of(context).textTheme.subtitle1.copyWith(color: AColors.white, fontSize: 12, fontWeight: FontWeight.bold), ), ], ), - Divider(color: AColors.white,), + Divider( + color: AColors.white, + ), Text( notification.description ?? "complaint not available", style: Theme.of(context).textTheme.subtitle1.copyWith( - color: AColors.white, - fontSize: 14, - ), + color: AColors.white, + fontSize: 14, + ), ), ], ), diff --git a/lib/views/widgets/parts/auto_complete_parts_field.dart b/lib/views/widgets/parts/auto_complete_parts_field.dart index 025b6e1d..d499b815 100644 --- a/lib/views/widgets/parts/auto_complete_parts_field.dart +++ b/lib/views/widgets/parts/auto_complete_parts_field.dart @@ -8,6 +8,7 @@ import 'package:test_sa/models/part.dart'; import 'package:test_sa/views/app_style/colors.dart'; import 'package:test_sa/views/app_style/sizing.dart'; import 'package:test_sa/views/widgets/loaders/loading_manager.dart'; + class AutoCompletePartsField extends StatefulWidget { final String initialValue; final bool clearAfterPick; @@ -20,7 +21,6 @@ class AutoCompletePartsField extends StatefulWidget { } class _AutoCompletePartsFieldState extends State { - SettingProvider _settingProvider; PartsProvider _partsProvider; UserProvider _userProvider; @@ -37,6 +37,7 @@ class _AutoCompletePartsFieldState extends State { _controller.dispose(); super.dispose(); } + @override Widget build(BuildContext context) { _settingProvider = Provider.of(context); @@ -44,22 +45,15 @@ class _AutoCompletePartsFieldState extends State { _partsProvider = Provider.of(context); //Subtitle _subtitle = AppLocalization.of(context).subtitle; return Container( - padding: const EdgeInsets.symmetric( - horizontal: 16 - ), + padding: const EdgeInsets.symmetric(horizontal: 16), decoration: BoxDecoration( color: Colors.white, - border: Border.all(color:AColors.black), - borderRadius: BorderRadius.circular( - AppStyle.borderRadius * AppStyle.getScaleFactor(context) - ), - boxShadow: const [ - AppStyle.boxShadow - ] - ), + border: Border.all(color: AColors.black), + borderRadius: BorderRadius.circular(AppStyle.borderRadius * AppStyle.getScaleFactor(context)), + boxShadow: const [AppStyle.boxShadow]), child: TypeAheadField( textFieldConfiguration: TextFieldConfiguration( - style: Theme.of(context).textTheme.subtitle1, + style: Theme.of(context).textTheme.subtitle1, controller: _controller, textAlign: TextAlign.center, decoration: const InputDecoration( @@ -71,21 +65,21 @@ class _AutoCompletePartsFieldState extends State { textInputAction: TextInputAction.search, ), suggestionsCallback: (vale) async { - return await _partsProvider.getPartsList( - host: _settingProvider.host, - title: vale - ); + return await _partsProvider.getPartsList(host: _settingProvider.host, title: vale); }, itemBuilder: (context, part) { return ListTile( title: Text(part.code), - subtitle: Text(part.name, style: Theme.of(context).textTheme.caption,), + subtitle: Text( + part.name, + style: Theme.of(context).textTheme.caption, + ), ); }, onSuggestionSelected: (part) { - if(widget.clearAfterPick){ + if (widget.clearAfterPick) { _controller.clear(); - } else{ + } else { _controller.text = part.code; } widget.onPick(part); diff --git a/lib/views/widgets/parts/part_item.dart b/lib/views/widgets/parts/part_item.dart index a82809bc..63d411e4 100644 --- a/lib/views/widgets/parts/part_item.dart +++ b/lib/views/widgets/parts/part_item.dart @@ -2,8 +2,8 @@ import 'package:flutter/material.dart'; import 'package:test_sa/models/part.dart'; import 'package:test_sa/views/app_style/sizing.dart'; import 'package:test_sa/views/widgets/buttons/app_icon_button2.dart'; -class PartItem extends StatefulWidget { +class PartItem extends StatefulWidget { final Part part; final Function(Part) onDelete; @@ -24,22 +24,20 @@ class _PartItemState extends State { children: [ Expanded( child: Column( - crossAxisAlignment: CrossAxisAlignment.start, + crossAxisAlignment: CrossAxisAlignment.start, children: [ Row( children: [ Expanded( - child: Text(widget.part.code, - style: Theme.of(context).textTheme.bodyText1.copyWith( - fontSize: 12, - fontWeight: FontWeight.bold - ), + child: Text( + widget.part.code, + style: Theme.of(context).textTheme.bodyText1.copyWith(fontSize: 12, fontWeight: FontWeight.bold), ), ), AIconButton2( iconData: Icons.add, color: Theme.of(context).primaryColor, - onPressed: (){ + onPressed: () { widget.part.quantity++; setState(() {}); }, @@ -47,41 +45,45 @@ class _PartItemState extends State { AIconButton2( iconData: Icons.remove, color: Theme.of(context).primaryColor, - onPressed: widget.part.quantity < 2 ? null : (){ - widget.part.quantity--; - setState(() {}); - }, + onPressed: widget.part.quantity < 2 + ? null + : () { + widget.part.quantity--; + setState(() {}); + }, + ), + SizedBox( + width: 8 * AppStyle.getScaleFactor(context), ), - SizedBox(width: 8*AppStyle.getScaleFactor(context),), - Text(widget.part.quantity.toString(), + Text( + widget.part.quantity.toString(), style: Theme.of(context).textTheme.headline6.copyWith( //fontSize: 12, //fontWeight: FontWeight.bold - ), + ), + ), + SizedBox( + width: 8 * AppStyle.getScaleFactor(context), ), - SizedBox(width: 8*AppStyle.getScaleFactor(context),), ], ), - widget.part.name == null ? SizedBox.shrink() : - Text(widget.part.name, - style: Theme.of(context).textTheme.caption.copyWith( - fontSize: 11, - fontWeight: FontWeight.bold - ), - maxLines: 1, - overflow: TextOverflow.ellipsis, - ), + widget.part.name == null + ? SizedBox.shrink() + : Text( + widget.part.name, + style: Theme.of(context).textTheme.caption.copyWith(fontSize: 11, fontWeight: FontWeight.bold), + maxLines: 1, + overflow: TextOverflow.ellipsis, + ), ], )), AIconButton2( iconData: Icons.close, color: Colors.red, - onPressed: (){ + onPressed: () { widget.onDelete(widget.part); }, ), - - ], ), ], diff --git a/lib/views/widgets/pentry/auto_complete_fields/auto_complete_devices_field.dart b/lib/views/widgets/pentry/auto_complete_fields/auto_complete_devices_field.dart index bf18fd66..0691e452 100644 --- a/lib/views/widgets/pentry/auto_complete_fields/auto_complete_devices_field.dart +++ b/lib/views/widgets/pentry/auto_complete_fields/auto_complete_devices_field.dart @@ -8,6 +8,7 @@ import 'package:test_sa/models/device/device.dart'; import 'package:test_sa/models/lookup.dart'; import 'package:test_sa/views/app_style/colors.dart'; import 'package:test_sa/views/app_style/sizing.dart'; + class AutoCompleteDeviceNumberField extends StatefulWidget { final Lookup initialValue; final int hospitalId; @@ -20,7 +21,6 @@ class AutoCompleteDeviceNumberField extends StatefulWidget { } class _AutoCompleteDeviceNumberFieldState extends State { - SettingProvider _settingProvider; DevicesProvider _devicesProvider; UserProvider _userProvider; @@ -37,6 +37,7 @@ class _AutoCompleteDeviceNumberFieldState extends State(context); @@ -44,38 +45,31 @@ class _AutoCompleteDeviceNumberFieldState extends State(context); //Subtitle _subtitle = AppLocalization.of(context).subtitle; return Container( - padding: const EdgeInsets.symmetric( - horizontal: 16 - ), + padding: const EdgeInsets.symmetric(horizontal: 16), decoration: BoxDecoration( color: Colors.white, - border: Border.all(color:AColors.black), - borderRadius: BorderRadius.circular( - AppStyle.borderRadius * AppStyle.getScaleFactor(context) - ), - boxShadow: const [ - AppStyle.boxShadow - ] - ), + border: Border.all(color: AColors.black), + borderRadius: BorderRadius.circular(AppStyle.borderRadius * AppStyle.getScaleFactor(context)), + boxShadow: const [AppStyle.boxShadow]), child: TypeAheadField( textFieldConfiguration: TextFieldConfiguration( - style: Theme.of(context).textTheme.headline6, - controller: _controller, - textAlign: TextAlign.center, - decoration: const InputDecoration( - border: InputBorder.none, - disabledBorder: InputBorder.none, - focusedBorder: InputBorder.none, - enabledBorder: InputBorder.none, - ), - textInputAction: TextInputAction.search, + style: Theme.of(context).textTheme.headline6, + controller: _controller, + textAlign: TextAlign.center, + decoration: const InputDecoration( + border: InputBorder.none, + disabledBorder: InputBorder.none, + focusedBorder: InputBorder.none, + enabledBorder: InputBorder.none, + ), + textInputAction: TextInputAction.search, ), suggestionsCallback: (vale) async { return await _devicesProvider.getDevicesList( - host: _settingProvider.host, - user: _userProvider.user, - hospitalId: widget.hospitalId, - number: vale, + host: _settingProvider.host, + user: _userProvider.user, + hospitalId: widget.hospitalId, + number: vale, ); }, itemBuilder: (context, device) { @@ -86,7 +80,7 @@ class _AutoCompleteDeviceNumberFieldState extends State { final userProvider = Provider.of(context); return ListView( padding: EdgeInsets.only( - top: 12 * AppStyle.getScaleFactor(context), - left: 12 * AppStyle.getScaleFactor(context), - right: 12 * AppStyle.getScaleFactor(context), - bottom: 80 * AppStyle.getScaleFactor(context) - ), + top: 12 * AppStyle.getScaleFactor(context), left: 12 * AppStyle.getScaleFactor(context), right: 12 * AppStyle.getScaleFactor(context), bottom: 80 * AppStyle.getScaleFactor(context)), shrinkWrap: true, physics: const ClampingScrollPhysics(), children: [ - const SizedBox(height: 8,), + const SizedBox( + height: 8, + ), const ASubTitle("PPM Visit Status"), - if(widget.enableValidate && widget.model.ppmVisitStatus == null) - ASubTitle(subtitle.requiredWord,color: Colors.red,), - const SizedBox(height: 4,), + if (widget.enableValidate && widget.model.ppmVisitStatus == null) + ASubTitle( + subtitle.requiredWord, + color: Colors.red, + ), + const SizedBox( + height: 4, + ), PentryVisitsStatusMenu( initialValue: widget.model.ppmVisitStatus, - onSelect: (status){ + onSelect: (status) { widget.model.ppmVisitStatus = status; }, ), - const SizedBox(height: 8,), + const SizedBox( + height: 8, + ), const ASubTitle("Timer"), - if(widget.enableValidate && widget.model?.timer?.endAt == null) - ASubTitle(subtitle.requiredWord,color: Colors.red,), - const SizedBox(height: 4,), + if (widget.enableValidate && widget.model?.timer?.endAt == null) + ASubTitle( + subtitle.requiredWord, + color: Colors.red, + ), + const SizedBox( + height: 4, + ), AppTimer( timer: widget.model.timer, - onChange: (timer) async{ + onChange: (timer) async { widget.model.timer = timer; return true; }, ), - const SizedBox(height: 8,), + const SizedBox( + height: 8, + ), // const ASubTitle("Status"), // // if(widget.enableValidate && widget.model.status == null) // // ASubTitle(subtitle.requiredWord,color: Colors.red,), @@ -74,78 +89,108 @@ class _PentryInfoFormState extends State { // widget.model.status = status; // }, // ), - const SizedBox(height: 8,), + const SizedBox( + height: 8, + ), const ASubTitle("Actual Visit Date"), - if(widget.enableValidate && widget.model.actualVisitDate == null) - ASubTitle(subtitle.requiredWord,color: Colors.red,), - const SizedBox(height: 4,), + if (widget.enableValidate && widget.model.actualVisitDate == null) + ASubTitle( + subtitle.requiredWord, + color: Colors.red, + ), + const SizedBox( + height: 4, + ), ADatePicker( date: widget.model.actualVisitDate, from: DateTime.now().subtract(const Duration(days: 30)), - onDatePicker: (date){ - if(date == null) return; + onDatePicker: (date) { + if (date == null) return; widget.model.actualVisitDate = date; setState(() {}); }, ), - const SizedBox(height: 8,), + const SizedBox( + height: 8, + ), const ASubTitle("Expected Visit Date"), - if(widget.enableValidate && widget.model.expectedVisitDate == null) - ASubTitle(subtitle.requiredWord,color: Colors.red,), - const SizedBox(height: 4,), + if (widget.enableValidate && widget.model.expectedVisitDate == null) + ASubTitle( + subtitle.requiredWord, + color: Colors.red, + ), + const SizedBox( + height: 4, + ), ADatePicker( date: widget.model.expectedVisitDate, from: DateTime.now().subtract(const Duration(days: 30)), - onDatePicker: (date){ - if(date == null) return; + onDatePicker: (date) { + if (date == null) return; widget.model.expectedVisitDate = date; setState(() {}); }, ), - const SizedBox(height: 8,), + const SizedBox( + height: 8, + ), const ASubTitle("Traveling Hours"), - const SizedBox(height: 4,), + const SizedBox( + height: 4, + ), ATextFormField( initialValue: (widget.model.travelingHours ?? "").toString(), textAlign: TextAlign.center, style: Theme.of(context).textTheme.subtitle1, textInputType: TextInputType.number, - onChange: (value){ + onChange: (value) { widget.model.travelingHours = value; }, ), - const SizedBox(height: 12,), + const SizedBox( + height: 12, + ), const ASubTitle("PPM Attachment"), AMiniOneImagePicker( //error: _validate && _serviceReport.image == null, image: widget.model.imageFile, - onPick: (image){ - widget.model.imageFile =image; + onPick: (image) { + widget.model.imageFile = image; }, ), - const SizedBox(height: 8,), + const SizedBox( + height: 8, + ), const ASubTitle("Nurse Signature"), ESignature( oldSignature: widget.model.signatureNurse, newSignature: widget.model.localNurseSignature, - onChange: (signature){ - if(signature == null || signature.isEmpty) {return;} + onChange: (signature) { + if (signature == null || signature.isEmpty) { + return; + } widget.model.localNurseSignature = signature; widget.model.signatureNurse = "${DateTime.now().toIso8601String()}.png|${base64Encode(signature)}"; }, ), - const SizedBox(height: 8,), + const SizedBox( + height: 8, + ), const ASubTitle("Engineer Signature"), ESignature( oldSignature: widget.model.signatureEngineer, newSignature: widget.model.localNurseSignature, - onChange: (signature){ - if(signature == null || signature.isEmpty) {return;} + onChange: (signature) { + if (signature == null || signature.isEmpty) { + return; + } widget.model.localNurseSignature = signature; widget.model.signatureEngineer = "${DateTime.now().toIso8601String()}.png|${base64Encode(signature)}"; }, ), - const SizedBox(height: 8,), + const SizedBox( + height: 8, + ), ], ); } diff --git a/lib/views/widgets/pentry/pentry_pm_kit_form.dart b/lib/views/widgets/pentry/pentry_pm_kit_form.dart index c9194466..f6ac9b18 100644 --- a/lib/views/widgets/pentry/pentry_pm_kit_form.dart +++ b/lib/views/widgets/pentry/pentry_pm_kit_form.dart @@ -7,11 +7,14 @@ import 'package:test_sa/views/widgets/buttons/app_button.dart'; import 'package:test_sa/views/widgets/buttons/app_small_button.dart'; import 'package:test_sa/views/widgets/parts/auto_complete_parts_field.dart'; import 'package:test_sa/views/widgets/titles/app_sub_title.dart'; + class PentryPMKitForm extends StatefulWidget { final List models; final bool enableValidate; const PentryPMKitForm({ - Key key, this.models, this.enableValidate, + Key key, + this.models, + this.enableValidate, }) : super(key: key); @override @@ -19,135 +22,137 @@ class PentryPMKitForm extends StatefulWidget { } class _PentryPMKitFormState extends State { - @override Widget build(BuildContext context) { final subtitle = AppLocalization.of(context).subtitle; return ListView.builder( - padding: EdgeInsets.only( - top: 12 * AppStyle.getScaleFactor(context), - left: 12 * AppStyle.getScaleFactor(context), - right: 12 * AppStyle.getScaleFactor(context), - bottom: 80 * AppStyle.getScaleFactor(context) - ), - itemCount: widget.models.length + 1, - itemBuilder: (context,index){ - if(index == widget.models.length){ - return AButton( - text: subtitle.add, - onPressed: (){ - widget.models.add(PMKit()); - setState(() {}); - }, - ); - } - final model = widget.models[index]; - return ListView( - shrinkWrap: true, - physics: const ClampingScrollPhysics(), - children: [ - Row( - mainAxisAlignment: MainAxisAlignment.spaceBetween, - children: [ - ASubTitle("#${index+1}"), - if(index != 0) - ASmallButton( - color: Theme.of(context).colorScheme.error, - text: subtitle.delete, - onPressed: (){ - widget.models.remove(model); - setState(() {}); - }, - ), - ], - ), - const SizedBox(height: 8,), - const ASubTitle("Item Code"), - const SizedBox(height: 4,), - AutoCompletePartsField( - clearAfterPick: false, - initialValue: (model.itemCode?.name ?? "").toString(), - onPick: (part){ - model.itemCode = Lookup(id: part.id,name: part.code); + padding: EdgeInsets.only( + top: 12 * AppStyle.getScaleFactor(context), left: 12 * AppStyle.getScaleFactor(context), right: 12 * AppStyle.getScaleFactor(context), bottom: 80 * AppStyle.getScaleFactor(context)), + itemCount: widget.models.length + 1, + itemBuilder: (context, index) { + if (index == widget.models.length) { + return AButton( + text: subtitle.add, + onPressed: () { + widget.models.add(PMKit()); + setState(() {}); }, - ), - const SizedBox(height: 8,), - // const ASubTitle("Item Name"), - // const SizedBox(height: 4,), - // ATextFormField( - // initialValue: (model.itemName ?? "").toString(), - // textAlign: TextAlign.center, - // style: Theme.of(context).textTheme.subtitle1, - // textInputType: TextInputType.text, - // onChange: (value){ - // model.itemName = value; - // }, - // ), - // const SizedBox(height: 8,), - // const ASubTitle("Preparation Time Frame"), - // const SizedBox(height: 4,), - // ATextFormField( - // initialValue: (model.preparationTimeFrame ?? "").toString(), - // textAlign: TextAlign.center, - // style: Theme.of(context).textTheme.subtitle1, - // textInputType: TextInputType.text, - // onChange: (value){ - // model.preparationTimeFrame = value; - // }, - // ), - // const SizedBox(height: 8,), - // const ASubTitle("kit Frequency Demand"), - // const SizedBox(height: 4,), - // ATextFormField( - // initialValue: (model.kitFrequencyDemand ?? "").toString(), - // textAlign: TextAlign.center, - // style: Theme.of(context).textTheme.subtitle1, - // textInputType: TextInputType.text, - // onChange: (value){ - // model.kitFrequencyDemand = value; - // }, - // ), - // const SizedBox(height: 8,), - // const ASubTitle("Availability"), - // const SizedBox(height: 4,), - // ATextFormField( - // initialValue: (model.availability ?? "").toString(), - // textAlign: TextAlign.center, - // style: Theme.of(context).textTheme.subtitle1, - // textInputType: TextInputType.text, - // onChange: (value){ - // model.availability = value; - // }, - // ), - // const SizedBox(height: 8,), - // const ASubTitle("Quantity Needed"), - // const SizedBox(height: 4,), - // ATextFormField( - // initialValue: (model.quantityNeeded ?? "").toString(), - // textAlign: TextAlign.center, - // style: Theme.of(context).textTheme.subtitle1, - // textInputType: TextInputType.number, - // onChange: (value){ - // model.quantityNeeded = value; - // }, - // ), - // const SizedBox(height: 8,), - // const ASubTitle("Quantity Reserved"), - // const SizedBox(height: 4,), - // ATextFormField( - // initialValue: (model.quantityReserved ?? "").toString(), - // textAlign: TextAlign.center, - // style: Theme.of(context).textTheme.subtitle1, - // textInputType: TextInputType.number, - // onChange: (value){ - // model.quantityReserved = value; - // }, - // ), - // const SizedBox(height: 8,), - Divider(color: Theme.of(context).textTheme.titleMedium.color,), - ], - ); - } - ); + ); + } + final model = widget.models[index]; + return ListView( + shrinkWrap: true, + physics: const ClampingScrollPhysics(), + children: [ + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + ASubTitle("#${index + 1}"), + if (index != 0) + ASmallButton( + color: Theme.of(context).colorScheme.error, + text: subtitle.delete, + onPressed: () { + widget.models.remove(model); + setState(() {}); + }, + ), + ], + ), + const SizedBox( + height: 8, + ), + const ASubTitle("Item Code"), + const SizedBox( + height: 4, + ), + AutoCompletePartsField( + clearAfterPick: false, + initialValue: (model.itemCode?.name ?? "").toString(), + onPick: (part) { + model.itemCode = Lookup(id: part.id, name: part.code); + }, + ), + const SizedBox( + height: 8, + ), + // const ASubTitle("Item Name"), + // const SizedBox(height: 4,), + // ATextFormField( + // initialValue: (model.itemName ?? "").toString(), + // textAlign: TextAlign.center, + // style: Theme.of(context).textTheme.subtitle1, + // textInputType: TextInputType.text, + // onChange: (value){ + // model.itemName = value; + // }, + // ), + // const SizedBox(height: 8,), + // const ASubTitle("Preparation Time Frame"), + // const SizedBox(height: 4,), + // ATextFormField( + // initialValue: (model.preparationTimeFrame ?? "").toString(), + // textAlign: TextAlign.center, + // style: Theme.of(context).textTheme.subtitle1, + // textInputType: TextInputType.text, + // onChange: (value){ + // model.preparationTimeFrame = value; + // }, + // ), + // const SizedBox(height: 8,), + // const ASubTitle("kit Frequency Demand"), + // const SizedBox(height: 4,), + // ATextFormField( + // initialValue: (model.kitFrequencyDemand ?? "").toString(), + // textAlign: TextAlign.center, + // style: Theme.of(context).textTheme.subtitle1, + // textInputType: TextInputType.text, + // onChange: (value){ + // model.kitFrequencyDemand = value; + // }, + // ), + // const SizedBox(height: 8,), + // const ASubTitle("Availability"), + // const SizedBox(height: 4,), + // ATextFormField( + // initialValue: (model.availability ?? "").toString(), + // textAlign: TextAlign.center, + // style: Theme.of(context).textTheme.subtitle1, + // textInputType: TextInputType.text, + // onChange: (value){ + // model.availability = value; + // }, + // ), + // const SizedBox(height: 8,), + // const ASubTitle("Quantity Needed"), + // const SizedBox(height: 4,), + // ATextFormField( + // initialValue: (model.quantityNeeded ?? "").toString(), + // textAlign: TextAlign.center, + // style: Theme.of(context).textTheme.subtitle1, + // textInputType: TextInputType.number, + // onChange: (value){ + // model.quantityNeeded = value; + // }, + // ), + // const SizedBox(height: 8,), + // const ASubTitle("Quantity Reserved"), + // const SizedBox(height: 4,), + // ATextFormField( + // initialValue: (model.quantityReserved ?? "").toString(), + // textAlign: TextAlign.center, + // style: Theme.of(context).textTheme.subtitle1, + // textInputType: TextInputType.number, + // onChange: (value){ + // model.quantityReserved = value; + // }, + // ), + // const SizedBox(height: 8,), + Divider( + color: Theme.of(context).textTheme.titleMedium.color, + ), + ], + ); + }); } } diff --git a/lib/views/widgets/pentry/pentry_ppm_check_list_form.dart b/lib/views/widgets/pentry/pentry_ppm_check_list_form.dart index 201c7498..3f7eecf8 100644 --- a/lib/views/widgets/pentry/pentry_ppm_check_list_form.dart +++ b/lib/views/widgets/pentry/pentry_ppm_check_list_form.dart @@ -7,11 +7,14 @@ import 'package:test_sa/views/widgets/buttons/app_button.dart'; import 'package:test_sa/views/widgets/buttons/app_small_button.dart'; import 'package:test_sa/views/widgets/status/pentry/pentry_task_status_mune.dart'; import 'package:test_sa/views/widgets/titles/app_sub_title.dart'; + class PentryPPMCheckListForm extends StatefulWidget { final List models; final bool enableValidate; const PentryPPMCheckListForm({ - Key key, this.models, this.enableValidate, + Key key, + this.models, + this.enableValidate, }) : super(key: key); @override @@ -19,99 +22,112 @@ class PentryPPMCheckListForm extends StatefulWidget { } class _PentryPPMCheckListFormState extends State { - - @override Widget build(BuildContext context) { final subtitle = AppLocalization.of(context).subtitle; return ListView.builder( - padding: EdgeInsets.only( - top: 12 * AppStyle.getScaleFactor(context), - left: 12 * AppStyle.getScaleFactor(context), - right: 12 * AppStyle.getScaleFactor(context), - bottom: 80 * AppStyle.getScaleFactor(context) - ), - itemCount: widget.models.length + 1, - itemBuilder: (context,index){ - if(index == widget.models.length){ - return AButton( - text: subtitle.add, - onPressed: (){ - widget.models.add(PPMCheckList()); - setState(() {}); - }, - ); - } - final model = widget.models[index]; - return ListView( - shrinkWrap: true, - physics: const ClampingScrollPhysics(), - children: [ - Row( - mainAxisAlignment: MainAxisAlignment.spaceBetween, - children: [ - ASubTitle("#${index+1}"), - if(index != 0) - ASmallButton( - color: Theme.of(context).colorScheme.error, - text: subtitle.delete, - onPressed: (){ - widget.models.remove(model); - setState(() {}); - }, - ), - ], - ), - const SizedBox(height: 8,), - const ASubTitle("Task"), - const SizedBox(height: 4,), - ATextFormField( - initialValue: (model.title ?? "").toString(), - textAlign: TextAlign.center, - style: Theme.of(context).textTheme.subtitle1, - textInputType: TextInputType.text, - onChange: (value){ - model.title = value; + padding: EdgeInsets.only( + top: 12 * AppStyle.getScaleFactor(context), left: 12 * AppStyle.getScaleFactor(context), right: 12 * AppStyle.getScaleFactor(context), bottom: 80 * AppStyle.getScaleFactor(context)), + itemCount: widget.models.length + 1, + itemBuilder: (context, index) { + if (index == widget.models.length) { + return AButton( + text: subtitle.add, + onPressed: () { + widget.models.add(PPMCheckList()); + setState(() {}); }, - ), - const SizedBox(height: 8,), - ASubTitle(subtitle.status), - const SizedBox(height: 4,), - PentryTaskStatusMenu( - initialValue: model.status, - onSelect: (status){ - model.status = status; - }, - ), - const SizedBox(height: 8,), - const ASubTitle("Comment"), - const SizedBox(height: 4,), - ATextFormField( - initialValue: (model.comment ?? "").toString(), - textAlign: TextAlign.center, - style: Theme.of(context).textTheme.subtitle1, - textInputType: TextInputType.text, - onChange: (value){ - model.comment = value; - }, - ), - const SizedBox(height: 8,), - const ASubTitle("Measured Value"), - const SizedBox(height: 4,), - ATextFormField( - initialValue: (model.measuredValue ?? "").toString(), - textAlign: TextAlign.center, - style: Theme.of(context).textTheme.subtitle1, - textInputType: TextInputType.text, - onChange: (value){ - model.measuredValue = value; - }, - ), - const SizedBox(height: 8,), - Divider(color: Theme.of(context).textTheme.titleMedium.color,), - ], - ); - } - ); + ); + } + final model = widget.models[index]; + return ListView( + shrinkWrap: true, + physics: const ClampingScrollPhysics(), + children: [ + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + ASubTitle("#${index + 1}"), + if (index != 0) + ASmallButton( + color: Theme.of(context).colorScheme.error, + text: subtitle.delete, + onPressed: () { + widget.models.remove(model); + setState(() {}); + }, + ), + ], + ), + const SizedBox( + height: 8, + ), + const ASubTitle("Task"), + const SizedBox( + height: 4, + ), + ATextFormField( + initialValue: (model.title ?? "").toString(), + textAlign: TextAlign.center, + style: Theme.of(context).textTheme.subtitle1, + textInputType: TextInputType.text, + onChange: (value) { + model.title = value; + }, + ), + const SizedBox( + height: 8, + ), + ASubTitle(subtitle.status), + const SizedBox( + height: 4, + ), + PentryTaskStatusMenu( + initialValue: model.status, + onSelect: (status) { + model.status = status; + }, + ), + const SizedBox( + height: 8, + ), + const ASubTitle("Comment"), + const SizedBox( + height: 4, + ), + ATextFormField( + initialValue: (model.comment ?? "").toString(), + textAlign: TextAlign.center, + style: Theme.of(context).textTheme.subtitle1, + textInputType: TextInputType.text, + onChange: (value) { + model.comment = value; + }, + ), + const SizedBox( + height: 8, + ), + const ASubTitle("Measured Value"), + const SizedBox( + height: 4, + ), + ATextFormField( + initialValue: (model.measuredValue ?? "").toString(), + textAlign: TextAlign.center, + style: Theme.of(context).textTheme.subtitle1, + textInputType: TextInputType.text, + onChange: (value) { + model.measuredValue = value; + }, + ), + const SizedBox( + height: 8, + ), + Divider( + color: Theme.of(context).textTheme.titleMedium.color, + ), + ], + ); + }); } } diff --git a/lib/views/widgets/qr/scan_qr.dart b/lib/views/widgets/qr/scan_qr.dart index 0c1cf10b..63c188a2 100644 --- a/lib/views/widgets/qr/scan_qr.dart +++ b/lib/views/widgets/qr/scan_qr.dart @@ -4,6 +4,7 @@ import 'package:flutter/material.dart'; import 'package:qr_code_scanner/qr_code_scanner.dart'; import '../buttons/app_icon_button.dart'; + class ScanQr extends StatefulWidget { const ScanQr({Key key}) : super(key: key); @@ -12,7 +13,6 @@ class ScanQr extends StatefulWidget { } class _ScanQrState extends State { - Barcode result; QRViewController _controller; bool _scanDone = false; @@ -43,31 +43,25 @@ class _ScanQrState extends State { children: [ QRView( key: qrKey, - onQRViewCreated:(QRViewController controller) { + onQRViewCreated: (QRViewController controller) { setState(() { _controller = controller; }); controller.scannedDataStream.listen((scanData) { - if(!_scanDone){ + if (!_scanDone) { _scanDone = true; Navigator.of(context).pop(scanData.code); } - }); }, - overlay: QrScannerOverlayShape( - borderColor: Colors.red, - borderRadius: 10, - borderLength: 30, - borderWidth: 10, - cutOutSize: 280), + overlay: QrScannerOverlayShape(borderColor: Colors.red, borderRadius: 10, borderLength: 30, borderWidth: 10, cutOutSize: 280), ), SafeArea( child: Padding( padding: EdgeInsets.all(12.0), child: AIconButton( - iconData:Icons.arrow_back, - onPressed: (){ + iconData: Icons.arrow_back, + onPressed: () { Navigator.of(context).pop(); }, ), diff --git a/lib/views/widgets/requests/info_row.dart b/lib/views/widgets/requests/info_row.dart index d8fe0bc6..e92195e1 100644 --- a/lib/views/widgets/requests/info_row.dart +++ b/lib/views/widgets/requests/info_row.dart @@ -1,5 +1,6 @@ import 'package:flutter/material.dart'; import 'package:test_sa/views/app_style/sizing.dart'; + class RequestInfoRow extends StatelessWidget { final String title; final String info; @@ -7,13 +8,13 @@ class RequestInfoRow extends StatelessWidget { final Widget contentWidget; final Widget infoWidget; - const RequestInfoRow({Key key, this.title, this.info,this.content, this.contentWidget, this.infoWidget}) : super(key: key); + const RequestInfoRow({Key key, this.title, this.info, this.content, this.contentWidget, this.infoWidget}) : super(key: key); @override Widget build(BuildContext context) { - if(info != null && info.isEmpty){ + if (info != null && info.isEmpty) { return SizedBox.shrink(); } - if(content != null && content.isEmpty){ + if (content != null && content.isEmpty) { return SizedBox.shrink(); } return Column( @@ -23,21 +24,20 @@ class RequestInfoRow extends StatelessWidget { Text( title + " : ", style: Theme.of(context).textTheme.subtitle2.copyWith( - //fontSize: 12 - ), + //fontSize: 12 + ), textScaleFactor: AppStyle.getScaleFactor(context), ), - - if(info != null) - Expanded( - child: Text( - info, - style: Theme.of(context).textTheme.bodyText2, - textAlign: TextAlign.right, - textScaleFactor: AppStyle.getScaleFactor(context), + if (info != null) + Expanded( + child: Text( + info, + style: Theme.of(context).textTheme.bodyText2, + textAlign: TextAlign.right, + textScaleFactor: AppStyle.getScaleFactor(context), + ), ), - ), - if(infoWidget != null) + if (infoWidget != null) Expanded( child: Row( mainAxisAlignment: MainAxisAlignment.end, @@ -48,27 +48,27 @@ class RequestInfoRow extends StatelessWidget { ), ], ), - - if(content != null) - Padding( - padding: const EdgeInsets.symmetric(horizontal: 8), - child: Row( - children: [ - Expanded( - child: Text( - content ?? 'No data found', - style: Theme.of(context).textTheme.bodyText2, - textAlign: TextAlign.center, - textScaleFactor: AppStyle.getScaleFactor(context), + if (content != null) + Padding( + padding: const EdgeInsets.symmetric(horizontal: 8), + child: Row( + children: [ + Expanded( + child: Text( + content ?? 'No data found', + style: Theme.of(context).textTheme.bodyText2, + textAlign: TextAlign.center, + textScaleFactor: AppStyle.getScaleFactor(context), + ), ), - ), - ], + ], + ), ), + if (contentWidget != null) contentWidget, + Divider( + color: Theme.of(context).primaryColor, ), - if(contentWidget != null) - contentWidget, - Divider(color: Theme.of(context).primaryColor,), ], ); } -} \ No newline at end of file +} diff --git a/lib/views/widgets/requests/request_status.dart b/lib/views/widgets/requests/request_status.dart index c953efc8..7f606a44 100644 --- a/lib/views/widgets/requests/request_status.dart +++ b/lib/views/widgets/requests/request_status.dart @@ -1,35 +1,24 @@ import 'package:flutter/material.dart'; import 'package:test_sa/views/app_style/colors.dart'; import 'package:test_sa/views/app_style/sizing.dart'; + class StatusLabel extends StatelessWidget { final String label; final Color color; const StatusLabel({Key key, this.label, this.color}) : super(key: key); - - @override Widget build(BuildContext context) { - return Container( - padding: EdgeInsets.symmetric(vertical: 2,horizontal: 8), + return Container( + padding: EdgeInsets.symmetric(vertical: 2, horizontal: 8), alignment: Alignment.center, - decoration: BoxDecoration( - color: color ?? Colors.green, - borderRadius: BorderRadius.circular( - AppStyle.getBorderRadius(context) - ), - boxShadow: [ - AppStyle.boxShadow - ] - ), + decoration: BoxDecoration(color: color ?? Colors.green, borderRadius: BorderRadius.circular(AppStyle.getBorderRadius(context)), boxShadow: [AppStyle.boxShadow]), child: Text( label ?? "no status", style: Theme.of(context).textTheme.subtitle2.copyWith( - color: color.computeLuminance() > 0.5 - ? AColors.black : Colors.white, - ), - ) - ); + color: color.computeLuminance() > 0.5 ? AColors.black : Colors.white, + ), + )); } } diff --git a/lib/views/widgets/requests/service_request_item.dart b/lib/views/widgets/requests/service_request_item.dart index e46eed9d..7977048d 100644 --- a/lib/views/widgets/requests/service_request_item.dart +++ b/lib/views/widgets/requests/service_request_item.dart @@ -15,6 +15,7 @@ import 'package:test_sa/views/app_style/sizing.dart'; import 'package:test_sa/views/pages/user/requests/report/create_service_report.dart'; import 'package:test_sa/views/widgets/loaders/image_loader.dart'; import 'package:test_sa/views/widgets/requests/request_status.dart'; + class ServiceRequestItem extends StatelessWidget { final int index; final ServiceRequest request; @@ -24,84 +25,83 @@ class ServiceRequestItem extends StatelessWidget { @override Widget build(BuildContext context) { Subtitle _subtitle = AppLocalization.of(context).subtitle; - User _user = Provider.of(context,listen: false).user; - final servicesProvider = Provider.of(context,listen: false); - final settingProvider = Provider.of(context,listen: false); - Color itemColor = index % 2 == 0 - ? Theme.of(context).colorScheme.primary - : Theme.of(context).colorScheme.onPrimary; - Color onItemColor = index % 2 != 0 - ? Theme.of(context).colorScheme.primary - : Theme.of(context).colorScheme.onPrimary; + User _user = Provider.of(context, listen: false).user; + final servicesProvider = Provider.of(context, listen: false); + final settingProvider = Provider.of(context, listen: false); + Color itemColor = index % 2 == 0 ? Theme.of(context).colorScheme.primary : Theme.of(context).colorScheme.onPrimary; + Color onItemColor = index % 2 != 0 ? Theme.of(context).colorScheme.primary : Theme.of(context).colorScheme.onPrimary; return Padding( padding: const EdgeInsets.symmetric(vertical: 4), child: ElevatedButton( - style: ElevatedButton.styleFrom( - padding: EdgeInsets.symmetric(vertical: 8,horizontal: 8), - primary: itemColor, - shape: RoundedRectangleBorder( - borderRadius: BorderRadius.circular( - AppStyle.getBorderRadius(context) - ), - ), - ), + style: ElevatedButton.styleFrom( + padding: EdgeInsets.symmetric(vertical: 8, horizontal: 8), + primary: itemColor, + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(AppStyle.getBorderRadius(context)), + ), + ), //padding: EdgeInsets.symmetric(vertical: 8,horizontal: 8), - onPressed: (){ + onPressed: () { onPressed(request); }, child: Row( children: [ //Placeholder(color: onItemColor,fallbackWidth: 80,fallbackHeight: 80,), - _user.type == UsersTypes.normal_user && request.devicePhotos.isEmpty ? SizedBox.shrink(): - SizedBox( - width: 80, - child: Column( - mainAxisAlignment: MainAxisAlignment.spaceBetween, - children: [ - request.devicePhotos?.isEmpty != false ? SizedBox.shrink(): - Column( - children: [ - SizedBox( - height: 80, - width: 80, - child: ImageLoader( - url: request.devicePhotos.first, - boxFit: BoxFit.cover, - ), - ), - SizedBox(height: 24,), - ], - ), + _user.type == UsersTypes.normal_user && request.devicePhotos.isEmpty + ? SizedBox.shrink() + : SizedBox( + width: 80, + child: Column( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + request.devicePhotos?.isEmpty != false + ? SizedBox.shrink() + : Column( + children: [ + SizedBox( + height: 80, + width: 80, + child: ImageLoader( + url: request.devicePhotos.first, + boxFit: BoxFit.cover, + ), + ), + SizedBox( + height: 24, + ), + ], + ), - _user.type == UsersTypes.engineer ? - Material( - color: onItemColor, - elevation: 6, - shape: CircleBorder(), - child: IconButton( - icon: Icon( - Icons.description, - color: itemColor, - size: 32, - ), - onPressed: (){ - Navigator.of(context).push( - MaterialPageRoute( - builder: (_) => CreateServiceReport( - request: request, + _user.type == UsersTypes.engineer + ? Material( + color: onItemColor, + elevation: 6, + shape: CircleBorder(), + child: IconButton( + icon: Icon( + Icons.description, + color: itemColor, + size: 32, + ), + onPressed: () { + Navigator.of(context).push( + MaterialPageRoute( + builder: (_) => CreateServiceReport( + request: request, + )), + ); + }, + ), ) - ), - ); - }, + : SizedBox.shrink(), + //SizedBox(height: 8,), + ], ), - ) :SizedBox.shrink(), - //SizedBox(height: 8,), - - ], - ), + ), + SizedBox( + width: 8, ), - SizedBox(width: 8,), Expanded( child: Column( crossAxisAlignment: CrossAxisAlignment.start, @@ -115,141 +115,122 @@ class ServiceRequestItem extends StatelessWidget { Row( children: [ Expanded( - child: request.requestCode == null ? SizedBox.shrink(): - Text( - request.requestCode ?? "-----", - style: Theme.of(context).textTheme.headline6.copyWith( - color: onItemColor, - fontSize: 16, - fontWeight: FontWeight.bold - ), - ), - ), - request.engineerName == null ? SizedBox.shrink(): - Text( - request.engineerName ?? "", - style: Theme.of(context).textTheme.subtitle2.copyWith( - color: onItemColor, - fontSize: 12, - fontWeight: FontWeight.normal - ), + child: request.requestCode == null + ? SizedBox.shrink() + : Text( + request.requestCode ?? "-----", + style: Theme.of(context).textTheme.headline6.copyWith(color: onItemColor, fontSize: 16, fontWeight: FontWeight.bold), + ), ), - + request.engineerName == null + ? SizedBox.shrink() + : Text( + request.engineerName ?? "", + style: Theme.of(context).textTheme.subtitle2.copyWith(color: onItemColor, fontSize: 12, fontWeight: FontWeight.normal), + ), ], ), - Divider(color: onItemColor,), - Row( - children: [ - Expanded( - child: request.deviceModel == null ? SizedBox.shrink(): - Text( - request.deviceModel ?? "Model not available", - style: Theme.of(context).textTheme.subtitle2.copyWith( - color: onItemColor, - fontSize: 12, - fontWeight: FontWeight.normal - ), - ), - ), - request.engineerMobile == null ? SizedBox.shrink(): - Text( - request.engineerMobile, - style: Theme.of(context).textTheme.subtitle1.copyWith( - color: onItemColor, - fontSize: 12, - fontWeight: FontWeight.normal - ), - ), - ], + Divider( + color: onItemColor, ), - Divider(color: onItemColor,), Row( children: [ Expanded( - child: request.deviceSerialNumber == null ? SizedBox.shrink(): - Text( - request.deviceSerialNumber, - style: Theme.of(context).textTheme.subtitle2.copyWith( - color: onItemColor, - fontSize: 12, - fontWeight: FontWeight.normal - ), - ), + child: request.deviceModel == null + ? SizedBox.shrink() + : Text( + request.deviceModel ?? "Model not available", + style: Theme.of(context).textTheme.subtitle2.copyWith(color: onItemColor, fontSize: 12, fontWeight: FontWeight.normal), + ), ), + request.engineerMobile == null + ? SizedBox.shrink() + : Text( + request.engineerMobile, + style: Theme.of(context).textTheme.subtitle1.copyWith(color: onItemColor, fontSize: 12, fontWeight: FontWeight.normal), + ), ], ), - request.deviceEnName == null ? SizedBox.shrink(): + Divider( + color: onItemColor, + ), Row( children: [ Expanded( - child: Text( - request.deviceEnName, - style: Theme.of(context).textTheme.subtitle1.copyWith( - color: onItemColor, - fontSize: 12, - fontWeight: FontWeight.normal - ), - ), + child: request.deviceSerialNumber == null + ? SizedBox.shrink() + : Text( + request.deviceSerialNumber, + style: Theme.of(context).textTheme.subtitle2.copyWith(color: onItemColor, fontSize: 12, fontWeight: FontWeight.normal), + ), ), ], ), + request.deviceEnName == null + ? SizedBox.shrink() + : Row( + children: [ + Expanded( + child: Text( + request.deviceEnName, + style: Theme.of(context).textTheme.subtitle1.copyWith(color: onItemColor, fontSize: 12, fontWeight: FontWeight.normal), + ), + ), + ], + ), ], ), ), - ], ), - - Divider(color: onItemColor,), + Divider( + color: onItemColor, + ), Center( child: Padding( padding: const EdgeInsets.symmetric(horizontal: 8), child: Text( request.maintenanceIssue ?? "No maintenance issue found", - style: Theme.of(context).textTheme.subtitle1.copyWith( - color: onItemColor - ), + style: Theme.of(context).textTheme.subtitle1.copyWith(color: onItemColor), textAlign: TextAlign.center, ), ), ), - Divider(color: onItemColor,), + Divider( + color: onItemColor, + ), Row( children: [ Text( request.date ?? "Date not available", - style: Theme.of(context).textTheme.subtitle2.copyWith( - color: onItemColor - ), + style: Theme.of(context).textTheme.subtitle2.copyWith(color: onItemColor), ), Spacer(), - StatusLabel(label: request.statusLabel, - color: AColors.getRequestStatusColor(request.statusValue)), + StatusLabel(label: request.statusLabel, color: AColors.getRequestStatusColor(request.statusValue)), ], ), - request.nextVisitDate == null ? SizedBox.shrink() : - Column( - children: [ - Divider(color: onItemColor,), - Row( - children: [ - Text( - _subtitle.nextVisitDate, - style: Theme.of(context).textTheme.subtitle2.copyWith( - color: onItemColor + request.nextVisitDate == null + ? SizedBox.shrink() + : Column( + children: [ + Divider( + color: onItemColor, ), - ), - Spacer(), - Text( - DateFormat('EE dd/MM/yyyy').format(request.nextVisitDate), - style: Theme.of(context).textTheme.subtitle2.copyWith( - color: onItemColor + Row( + children: [ + Text( + _subtitle.nextVisitDate, + style: Theme.of(context).textTheme.subtitle2.copyWith(color: onItemColor), + ), + Spacer(), + Text( + DateFormat('EE dd/MM/yyyy').format(request.nextVisitDate), + style: Theme.of(context).textTheme.subtitle2.copyWith(color: onItemColor), + ), + ], ), - ), - ], - ), - ], - ), + ], + ), ], ), ), diff --git a/lib/views/widgets/requests/service_request_list.dart b/lib/views/widgets/requests/service_request_list.dart index 7cd71079..29fa65e1 100644 --- a/lib/views/widgets/requests/service_request_list.dart +++ b/lib/views/widgets/requests/service_request_list.dart @@ -6,6 +6,7 @@ import 'package:test_sa/views/pages/user/requests/request_details.dart'; import 'package:test_sa/views/widgets/loaders/lazy_loading.dart'; import 'package:test_sa/views/widgets/loaders/no_item_found.dart'; import 'package:test_sa/views/widgets/requests/service_request_item.dart'; + class ServiceRequestsList extends StatelessWidget { final List requests; final bool nextPage; @@ -15,32 +16,31 @@ class ServiceRequestsList extends StatelessWidget { @override Widget build(BuildContext context) { - Subtitle _subtitle = AppLocalization.of(context).subtitle; - if(requests.length == 0){ - return NoItemFound(message: _subtitle.noServiceRequestFound,); + if (requests.length == 0) { + return NoItemFound( + message: _subtitle.noServiceRequestFound, + ); } return LazyLoading( nextPage: nextPage, onLazyLoad: onLazyLoad, child: ListView.builder( - //physics: BouncingScrollPhysics(), - itemCount: requests.length, - padding: EdgeInsets.symmetric(horizontal: 16,vertical: 8), - itemBuilder: (context,itemIndex){ + //physics: BouncingScrollPhysics(), + itemCount: requests.length, + padding: EdgeInsets.symmetric(horizontal: 16, vertical: 8), + itemBuilder: (context, itemIndex) { return ServiceRequestItem( index: itemIndex, request: requests[itemIndex], - onPressed: (request){ - Navigator.of(context).push( - MaterialPageRoute( - builder: (_)=> RequestDetailsPage(serviceRequest: request,) - ) - ); + onPressed: (request) { + Navigator.of(context).push(MaterialPageRoute( + builder: (_) => RequestDetailsPage( + serviceRequest: request, + ))); }, ); - } - ), + }), ); } } diff --git a/lib/views/widgets/search/filter_item.dart b/lib/views/widgets/search/filter_item.dart index e4e88ef7..7129405c 100644 --- a/lib/views/widgets/search/filter_item.dart +++ b/lib/views/widgets/search/filter_item.dart @@ -8,22 +8,24 @@ class FilterItem extends StatelessWidget { final Lookup status; final VoidCallback onSelected; - const FilterItem({ - Key key, - this.status, - this.isSelected, - this.onSelected - }) : super(key: key); + const FilterItem({Key key, this.status, this.isSelected, this.onSelected}) : super(key: key); - Color getStatusColor(){ - switch(status.id){ - case 0: return AColors.green; - case 4: return AColors.deepRed; - case 6: return AColors.green; - case 5: return AColors.orange; - case 8: return AColors.green; - case 9: return AColors.orange; - default : return AColors.grey; + Color getStatusColor() { + switch (status.id) { + case 0: + return AColors.green; + case 4: + return AColors.deepRed; + case 6: + return AColors.green; + case 5: + return AColors.orange; + case 8: + return AColors.green; + case 9: + return AColors.orange; + default: + return AColors.grey; } } @@ -36,22 +38,17 @@ class FilterItem extends StatelessWidget { child: ElevatedButton( style: ElevatedButton.styleFrom( padding: EdgeInsets.symmetric(horizontal: 8), - shape: RoundedRectangleBorder( - borderRadius: BorderRadius.circular( - AppStyle.getBorderRadius(context) - ) - ), + shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(AppStyle.getBorderRadius(context))), primary: getStatusColor(), ), child: Text( - status.name??"", + status.name ?? "", style: Theme.of(context).textTheme.bodyText1.copyWith( - color:getStatusColor().computeLuminance() > 0.5 - ? AColors.black : Colors.white, - ), + color: getStatusColor().computeLuminance() > 0.5 ? AColors.black : Colors.white, + ), textScaleFactor: AppStyle.getScaleFactor(context), ), - onPressed:onSelected, + onPressed: onSelected, ), ), ); diff --git a/lib/views/widgets/search/service_request_search_bar.dart b/lib/views/widgets/search/service_request_search_bar.dart index a3f8b96d..c5b31e29 100644 --- a/lib/views/widgets/search/service_request_search_bar.dart +++ b/lib/views/widgets/search/service_request_search_bar.dart @@ -12,31 +12,37 @@ import 'package:test_sa/views/widgets/status/service_request/service_request_sta import 'package:test_sa/views/widgets/titles/app_sub_title.dart'; import '../app_text_form_field.dart'; + class ServiceRequestsSearchDialog extends StatefulWidget { final ServiceRequestSearch initialSearchValue; final bool expandedSearch; final Function(ServiceRequestSearch) onSearch; - const ServiceRequestsSearchDialog({ - Key key, - this.initialSearchValue, - this.expandedSearch, - this.onSearch - }) : super(key: key); + const ServiceRequestsSearchDialog({Key key, this.initialSearchValue, this.expandedSearch, this.onSearch}) : super(key: key); @override _ServiceRequestsSearchDialogState createState() => _ServiceRequestsSearchDialogState(); } -class _ServiceRequestsSearchDialogState extends State - with TickerProviderStateMixin{ +class _ServiceRequestsSearchDialogState extends State with TickerProviderStateMixin { ServiceRequestSearch _search; List status = [ - Lookup(name: "New", id: 4,), - - Lookup(name: "Repaired", id: 6,), + Lookup( + name: "New", + id: 4, + ), + Lookup( + name: "Repaired", + id: 6, + ), Lookup(name: "Repeated", id: 8), - Lookup(name: "Closed", id: 9,), - Lookup(name: "Under Repair", id: 5,), + Lookup( + name: "Closed", + id: 9, + ), + Lookup( + name: "Under Repair", + id: 5, + ), ]; final GlobalKey _formKey = GlobalKey(); @@ -47,10 +53,11 @@ class _ServiceRequestsSearchDialogState extends State _VisitsSearchDialogState(); } -class _VisitsSearchDialogState extends State - with TickerProviderStateMixin{ +class _VisitsSearchDialogState extends State with TickerProviderStateMixin { VisitsSearch _search; List status = [ - Lookup(name: "Done", id: 0,), + Lookup( + name: "Done", + id: 0, + ), Lookup(name: "Not Yet", id: 1), - Lookup(name: "On Hold", id: 2,), + Lookup( + name: "On Hold", + id: 2, + ), ]; List contactStatus = [ @@ -46,7 +47,6 @@ class _VisitsSearchDialogState extends State // Lookup(name: "Under Maintenance Contract", value: "CC",), ]; - final GlobalKey _formKey = GlobalKey(); @override @@ -55,33 +55,33 @@ class _VisitsSearchDialogState extends State _search = VisitsSearch(); _search.fromSearch(widget.initialSearchValue); } + @override Widget build(BuildContext context) { Subtitle _subtitle = AppLocalization.of(context).subtitle; DateTime today = DateTime.now(); - return SizedBox( + return SizedBox( height: MediaQuery.of(context).size.height / 1.3, child: Form( key: _formKey, child: ListView( // shrinkWrap: true, // physics: const ClampingScrollPhysics(), - padding: const EdgeInsets.symmetric(vertical: 8,horizontal: 16), + padding: const EdgeInsets.symmetric(vertical: 8, horizontal: 16), children: [ Row( mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ ASmallButton( text: _subtitle.cancel, - onPressed: (){ + onPressed: () { Navigator.of(context).pop(); }, ), - ASmallButton( text: _subtitle.search, - onPressed: (){ - if(!_formKey.currentState.validate()) { + onPressed: () { + if (!_formKey.currentState.validate()) { return; } _formKey.currentState.save(); @@ -93,26 +93,28 @@ class _VisitsSearchDialogState extends State ATextFormField( initialValue: _search.deviceSerialNumber, hintText: _subtitle.serialNumber, - style: Theme.of(context).textTheme.headline6, + style: Theme.of(context).textTheme.headline6, textInputAction: TextInputAction.search, - onAction: (){ - if(!_formKey.currentState.validate()) { + onAction: () { + if (!_formKey.currentState.validate()) { return; } _formKey.currentState.save(); Navigator.of(context).pop(_search); }, - onSaved: (value){ + onSaved: (value) { _search.deviceSerialNumber = value; }, ), - SizedBox(height: 8.0 * AppStyle.getScaleFactor(context),), + SizedBox( + height: 8.0 * AppStyle.getScaleFactor(context), + ), HospitalAutoCompleteField( initialValue: _search.hospital?.name, // onSave: (value){ // _search.hospital = value; // }, - onSearch: (value){ + onSearch: (value) { _search.hospital = value; Navigator.of(context).pop(_search); }, @@ -134,10 +136,12 @@ class _VisitsSearchDialogState extends State // _search.brand = value; // }, // ), - SizedBox(height: 8.0 * AppStyle.getScaleFactor(context),), + SizedBox( + height: 8.0 * AppStyle.getScaleFactor(context), + ), AutoCompleteModelField( initialValue: _search.model, - onPick: (lookup){ + onPick: (lookup) { _search.model = lookup; Navigator.of(context).pop(_search); }, @@ -158,12 +162,16 @@ class _VisitsSearchDialogState extends State // _search.model = value; // }, // ), - SizedBox(height: 8.0 * AppStyle.getScaleFactor(context),), + SizedBox( + height: 8.0 * AppStyle.getScaleFactor(context), + ), ASubTitle(_subtitle.status), - SizedBox(height: 4.0 * AppStyle.getScaleFactor(context),), + SizedBox( + height: 4.0 * AppStyle.getScaleFactor(context), + ), PentryVisitsStatusMenu( initialValue: _search.statusValue, - onSelect: (status){ + onSelect: (status) { _search.statusValue = status; }, ), @@ -191,12 +199,16 @@ class _VisitsSearchDialogState extends State // // ), // ), - SizedBox(height: 8.0 * AppStyle.getScaleFactor(context),), + SizedBox( + height: 8.0 * AppStyle.getScaleFactor(context), + ), ASubTitle(_subtitle.contactStatus), - SizedBox(height: 4.0 * AppStyle.getScaleFactor(context),), + SizedBox( + height: 4.0 * AppStyle.getScaleFactor(context), + ), AssignedToMenu( initialValue: _search.contactStatus, - onSelect: (status){ + onSelect: (status) { _search.contactStatus = status; }, ), @@ -224,40 +236,48 @@ class _VisitsSearchDialogState extends State // // ), // ), - SizedBox(height: 8.0 * AppStyle.getScaleFactor(context),), + SizedBox( + height: 8.0 * AppStyle.getScaleFactor(context), + ), ASubTitle(_subtitle.actualDate), - SizedBox(height: 4.0 * AppStyle.getScaleFactor(context),), + SizedBox( + height: 4.0 * AppStyle.getScaleFactor(context), + ), FromToDateBar( - from: _search.actualDateFrom , + from: _search.actualDateFrom, to: _search.actualDateTo, - onPickFrom: (date){ + onPickFrom: (date) { _search.actualDateFrom = date; }, - onPickTo: (date){ + onPickTo: (date) { _search.actualDateTo = date; }, ), - SizedBox(height: 8.0 * AppStyle.getScaleFactor(context),), + SizedBox( + height: 8.0 * AppStyle.getScaleFactor(context), + ), ASubTitle(_subtitle.expectDate), - SizedBox(height: 4.0 * AppStyle.getScaleFactor(context),), + SizedBox( + height: 4.0 * AppStyle.getScaleFactor(context), + ), FromToDateBar( from: _search.expectedDateFrom ?? DateTime(today.year, today.month, 1), - to: _search.expectedDateTo ?? DateTime(today.year, (today.month +1).clamp(1, 12) , today.month == 12 ? 31 : 0), - onPickFrom: (date){ + to: _search.expectedDateTo ?? DateTime(today.year, (today.month + 1).clamp(1, 12), today.month == 12 ? 31 : 0), + onPickFrom: (date) { _search.expectedDateFrom = date; }, - onPickTo: (date){ + onPickTo: (date) { _search.expectedDateTo = date; }, ), Visibility( visible: _search.toMap().isNotEmpty, child: Padding( - padding: const EdgeInsets.symmetric(vertical: 8,horizontal: 16), + padding: const EdgeInsets.symmetric(vertical: 8, horizontal: 16), child: AButton( padding: EdgeInsets.zero, text: _subtitle.clearSearch, - onPressed: (){ + onPressed: () { _search = VisitsSearch(); Navigator.of(context).pop(_search); }, diff --git a/lib/views/widgets/sound/record_sound.dart b/lib/views/widgets/sound/record_sound.dart index 3170fe94..5ca797e4 100644 --- a/lib/views/widgets/sound/record_sound.dart +++ b/lib/views/widgets/sound/record_sound.dart @@ -95,7 +95,7 @@ class _RecordSoundState extends State { _record = path; widget.onRecord(path); _recording = false; - setState(() { }); + setState(() {}); } _cancelRecording() async { @@ -107,7 +107,7 @@ class _RecordSoundState extends State { // rebuild(); _recording = false; await Future.delayed(const Duration(seconds: 1)); - if(!_recording) setState(() { }); + if (!_recording) setState(() {}); // _message.memoryAudio.; } diff --git a/lib/views/widgets/sound/sound_player.dart b/lib/views/widgets/sound/sound_player.dart index 7793f54b..74cf2571 100644 --- a/lib/views/widgets/sound/sound_player.dart +++ b/lib/views/widgets/sound/sound_player.dart @@ -5,7 +5,6 @@ import 'package:test_sa/views/app_style/sizing.dart'; import '../../app_style/colors.dart'; class ASoundPlayer extends StatefulWidget { - final String audio; const ASoundPlayer({Key key, this.audio}) : super(key: key); @@ -15,7 +14,6 @@ class ASoundPlayer extends StatefulWidget { } class _ASoundPlayerState extends State { - //FlutterSoundPlayer _myPlayer = FlutterSoundPlayer(); bool _sliderMoving = false; Duration _audioTime; @@ -25,8 +23,8 @@ class _ASoundPlayerState extends State { bool _failedToLoad = false; AudioPlayer _audioPlayer; - Widget _getAudioButton(){ - switch(_audioPlayer.state){ + Widget _getAudioButton() { + switch (_audioPlayer.state) { case PlayerState.playing: return IconButton( icon: const Icon(Icons.pause_rounded), @@ -34,84 +32,71 @@ class _ASoundPlayerState extends State { _failedToLoad = false; await _audioPlayer.pause(); rebuild(); - } - ); + }); case PlayerState.paused: - return IconButton( + return IconButton( icon: const Icon(Icons.play_arrow_rounded), onPressed: () async { _failedToLoad = false; await _audioPlayer.resume(); rebuild(); - } - ); + }); case PlayerState.completed: - return IconButton( + return IconButton( icon: const Icon(Icons.replay_rounded), onPressed: () async { _failedToLoad = false; await _audioPlayer.stop(); await _audioPlayer.resume(); rebuild(); - } - ); + }); case PlayerState.stopped: return IconButton( - icon: Icon( _isLocalFile - ? Icons.play_circle_fill_outlined - : Icons.download_rounded - - ), + icon: Icon(_isLocalFile ? Icons.play_circle_fill_outlined : Icons.download_rounded), onPressed: () async { _failedToLoad = false; try { await _audioPlayer.play( - _isLocalFile? - DeviceFileSource(_audio):UrlSource(_audio), + _isLocalFile ? DeviceFileSource(_audio) : UrlSource(_audio), ); rebuild(); } on Exception catch (e) { _failedToLoad = true; } - } - ); - default: return IconButton( - icon: const Icon( Icons.replay_rounded), - onPressed: () async { - _failedToLoad = false; + }); + default: + return IconButton( + icon: const Icon(Icons.replay_rounded), + onPressed: () async { + _failedToLoad = false; - try { - _audioPlayer.seek(const Duration(milliseconds: 0)); - _audioPlayer.stop(); - await _audioPlayer.play( - _isLocalFile? - DeviceFileSource(_audio):UrlSource(_audio), - ); - rebuild(); - } on Exception catch (e) { - _failedToLoad = true; - } - } - ); + try { + _audioPlayer.seek(const Duration(milliseconds: 0)); + _audioPlayer.stop(); + await _audioPlayer.play( + _isLocalFile ? DeviceFileSource(_audio) : UrlSource(_audio), + ); + rebuild(); + } on Exception catch (e) { + _failedToLoad = true; + } + }); } } String format(Duration d) { - if(d == null) - return "00:00"; + if (d == null) return "00:00"; return d.toString().substring(2, 7); } - rebuild(){ + rebuild() { if (!mounted) return; setState(() {}); } bool _isLocalUrl(String url) { - if(url?.isEmpty != false) return false; - return url.startsWith("/") || - url.startsWith("file://") || - url.substring(1).startsWith(':\\'); + if (url?.isEmpty != false) return false; + return url.startsWith("/") || url.startsWith("file://") || url.substring(1).startsWith(':\\'); } @override @@ -122,14 +107,16 @@ class _ASoundPlayerState extends State { _audio = widget.audio; _isLocalFile = _isLocalUrl(_audio); _audioPlayer.setReleaseMode(ReleaseMode.stop); - if(_isLocalFile){ - _audioPlayer.setSourceDeviceFile(_audio).then((value) {rebuild();}); - } else{ + if (_isLocalFile) { + _audioPlayer.setSourceDeviceFile(_audio).then((value) { + rebuild(); + }); + } else { _audioPlayer.setReleaseMode(ReleaseMode.stop); } // set up listeners - _audioPlayer.onPositionChanged.listen((Duration duration) { - if(!_sliderMoving){ + _audioPlayer.onPositionChanged.listen((Duration duration) { + if (!_sliderMoving) { _audioPosition = duration; rebuild(); } @@ -139,7 +126,7 @@ class _ASoundPlayerState extends State { //_audioPosition = _audioTime; rebuild(); }); - _audioPlayer.onDurationChanged.listen((Duration duration) { + _audioPlayer.onDurationChanged.listen((Duration duration) { _audioTime = duration; rebuild(); }); @@ -151,20 +138,19 @@ class _ASoundPlayerState extends State { @override void dispose() { super.dispose(); - // _myPlayer.closeAudioSession(); + // _myPlayer.closeAudioSession(); _audioPlayer.release(); _audioPlayer.dispose(); - } @override Widget build(BuildContext context) { - if(_audio != widget.audio){ + if (_audio != widget.audio) { WidgetsBinding.instance.addPostFrameCallback((timeStamp) async { _audio = widget.audio; - if(_isLocalFile){ + if (_isLocalFile) { await _audioPlayer.setSourceDeviceFile(_audio); - }else{ + } else { await _audioPlayer.setSourceUrl(_audio); } _audioPlayer.seek(const Duration(milliseconds: 0)); @@ -172,34 +158,29 @@ class _ASoundPlayerState extends State { rebuild(); }); } - return Column( + return Column( crossAxisAlignment: CrossAxisAlignment.end, children: [ Row( children: [ - Material( - color: Colors.transparent, - child: _getAudioButton() - ), + Material(color: Colors.transparent, child: _getAudioButton()), Expanded( child: Slider( - value: _audioPosition?.inMilliseconds?.toDouble() ?? 0.0, - min: 0, - max: _audioTime?.inMilliseconds?.toDouble() ?? 60.0, - onChangeStart: (value){ - _sliderMoving = true; - }, - onChanged: (value){ - _audioPosition = Duration(milliseconds: value.round()); - rebuild(); - }, - onChangeEnd: (value){ - _sliderMoving = false; - _audioPlayer.seek(Duration(milliseconds: value.round())); - rebuild(); - } - - ), + value: _audioPosition?.inMilliseconds?.toDouble() ?? 0.0, + min: 0, + max: _audioTime?.inMilliseconds?.toDouble() ?? 60.0, + onChangeStart: (value) { + _sliderMoving = true; + }, + onChanged: (value) { + _audioPosition = Duration(milliseconds: value.round()); + rebuild(); + }, + onChangeEnd: (value) { + _sliderMoving = false; + _audioPlayer.seek(Duration(milliseconds: value.round())); + rebuild(); + }), ), ], ), @@ -212,12 +193,9 @@ class _ASoundPlayerState extends State { children: [ Text( "Failed to load", - style: Theme.of(context).textTheme.overline.copyWith( - color: AColors.red - ), + style: Theme.of(context).textTheme.overline.copyWith(color: AColors.red), textScaleFactor: AppStyle.getScaleFactor(context), ), - ], ), ), diff --git a/lib/views/widgets/speech_to_text/speech_to_text.dart b/lib/views/widgets/speech_to_text/speech_to_text.dart index 4d813d12..59b3d929 100644 --- a/lib/views/widgets/speech_to_text/speech_to_text.dart +++ b/lib/views/widgets/speech_to_text/speech_to_text.dart @@ -8,6 +8,7 @@ import 'package:test_sa/controllers/providers/settings/setting_provider.dart'; import 'package:test_sa/views/widgets/buttons/app_icon_button2.dart'; import 'package:test_sa/views/widgets/titles/app_sub_title.dart'; import 'package:test_sa/views/app_style/sizing.dart'; + class SpeechToTextButton extends StatefulWidget { final TextEditingController controller; final bool mini; diff --git a/lib/views/widgets/status/employee/assigned_to_mune.dart b/lib/views/widgets/status/employee/assigned_to_mune.dart index 8e4addf6..e07a9458 100644 --- a/lib/views/widgets/status/employee/assigned_to_mune.dart +++ b/lib/views/widgets/status/employee/assigned_to_mune.dart @@ -6,6 +6,7 @@ import 'package:test_sa/controllers/providers/settings/setting_provider.dart'; import 'package:test_sa/models/lookup.dart'; import 'package:test_sa/views/widgets/loaders/loading_manager.dart'; import 'package:test_sa/views/widgets/status/single_status_menu.dart'; + class AssignedToMenu extends StatelessWidget { final Function(Lookup) onSelect; final Lookup initialValue; @@ -22,16 +23,12 @@ class AssignedToMenu extends StatelessWidget { stateCode: menuProvider.stateCode, onRefresh: () async { menuProvider.reset(); - await menuProvider.getData( - user: userProvider.user, - host: settingProvider.host - ); + await menuProvider.getData(user: userProvider.user, host: settingProvider.host); }, child: SingleStatusMenu( initialStatus: initialValue, statuses: menuProvider.items, onSelect: onSelect, - ) - ); + )); } } diff --git a/lib/views/widgets/status/employee/engineers_mune.dart b/lib/views/widgets/status/employee/engineers_mune.dart index 93b1597d..cfd6b467 100644 --- a/lib/views/widgets/status/employee/engineers_mune.dart +++ b/lib/views/widgets/status/employee/engineers_mune.dart @@ -6,6 +6,7 @@ import 'package:test_sa/controllers/providers/settings/setting_provider.dart'; import 'package:test_sa/models/engineer.dart'; import 'package:test_sa/views/widgets/loaders/loading_manager.dart'; import 'package:test_sa/views/widgets/status/employee/single_type_menu.dart'; + class EngineersMenu extends StatelessWidget { final Function(Engineer) onSelect; final Engineer initialValue; @@ -22,16 +23,12 @@ class EngineersMenu extends StatelessWidget { stateCode: menuProvider.stateCode, onRefresh: () async { menuProvider.reset(); - await menuProvider.getData( - user: userProvider.user, - host: settingProvider.host - ); + await menuProvider.getData(user: userProvider.user, host: settingProvider.host); }, child: SingleEngineerMenu( initialStatus: initialValue, engineers: menuProvider.items, onSelect: onSelect, - ) - ); + )); } } diff --git a/lib/views/widgets/status/employee/single_type_menu.dart b/lib/views/widgets/status/employee/single_type_menu.dart index ccb46c0a..8c480a91 100644 --- a/lib/views/widgets/status/employee/single_type_menu.dart +++ b/lib/views/widgets/status/employee/single_type_menu.dart @@ -2,6 +2,7 @@ import 'package:flutter/material.dart'; import 'package:test_sa/models/engineer.dart'; import 'package:test_sa/views/app_style/colors.dart'; import 'package:test_sa/views/app_style/sizing.dart'; + class SingleEngineerMenu extends StatefulWidget { final List engineers; final Engineer initialStatus; @@ -13,16 +14,14 @@ class SingleEngineerMenu extends StatefulWidget { } class _SingleEngineerMenuState extends State { - Engineer _selectedStatus; @override void didUpdateWidget(covariant SingleEngineerMenu oldWidget) { - if(widget.initialStatus != null && widget.initialStatus.id != null){ - _selectedStatus = widget.engineers?.firstWhere( - (element) { - return element == widget.initialStatus; - }); + if (widget.initialStatus != null && widget.initialStatus.id != null) { + _selectedStatus = widget.engineers?.firstWhere((element) { + return element == widget.initialStatus; + }); widget.onSelect(_selectedStatus); } else { _selectedStatus = null; @@ -32,32 +31,25 @@ class _SingleEngineerMenuState extends State { @override void initState() { - if(widget.initialStatus != null && widget.initialStatus.id != null){ - _selectedStatus = widget.engineers?.firstWhere( - (element) { - return element == widget.initialStatus; - }); + if (widget.initialStatus != null && widget.initialStatus.id != null) { + _selectedStatus = widget.engineers?.firstWhere((element) { + return element == widget.initialStatus; + }); widget.onSelect(_selectedStatus); } super.initState(); } + @override Widget build(BuildContext context) { return Container( - padding: const EdgeInsets.symmetric( - horizontal: 16 - ), + padding: const EdgeInsets.symmetric(horizontal: 16), decoration: BoxDecoration( color: Colors.white, - border: Border.all(color:AColors.black), - borderRadius: BorderRadius.circular( - AppStyle.borderRadius * AppStyle.getScaleFactor(context) - ), - boxShadow: const [ - AppStyle.boxShadow - ] - ), + border: Border.all(color: AColors.black), + borderRadius: BorderRadius.circular(AppStyle.borderRadius * AppStyle.getScaleFactor(context)), + boxShadow: const [AppStyle.boxShadow]), child: DropdownButton( value: _selectedStatus, iconSize: 24, @@ -67,9 +59,7 @@ class _SingleEngineerMenuState extends State { "Select", style: Theme.of(context).textTheme.subtitle1, ), - style: TextStyle( - color: Theme.of(context).primaryColor - ), + style: TextStyle(color: Theme.of(context).primaryColor), underline: SizedBox.shrink(), onChanged: (Engineer newValue) { setState(() { @@ -77,21 +67,19 @@ class _SingleEngineerMenuState extends State { }); widget.onSelect(newValue); }, - items: widget.engineers - .map>((Engineer value) { + items: widget.engineers.map>((Engineer value) { return DropdownMenuItem( value: value, child: Text( - value.name, + value.name, style: Theme.of(context).textTheme.subtitle1.copyWith( - color: Theme.of(context).primaryColor, - fontSize: 11, - //fontWeight: FontWeight.bold - ), + color: Theme.of(context).primaryColor, + fontSize: 11, + //fontWeight: FontWeight.bold + ), ), ); - }) - .toList(), + }).toList(), ), ); } diff --git a/lib/views/widgets/status/gas_refill/gas_cylinder_size.dart b/lib/views/widgets/status/gas_refill/gas_cylinder_size.dart index 358226b0..acaec9a9 100644 --- a/lib/views/widgets/status/gas_refill/gas_cylinder_size.dart +++ b/lib/views/widgets/status/gas_refill/gas_cylinder_size.dart @@ -6,6 +6,7 @@ import 'package:test_sa/controllers/providers/settings/setting_provider.dart'; import 'package:test_sa/models/lookup.dart'; import 'package:test_sa/views/widgets/loaders/loading_manager.dart'; import 'package:test_sa/views/widgets/status/single_status_menu.dart'; + class GasCylinderSizeMenu extends StatelessWidget { final Function(Lookup) onSelect; final Lookup initialValue; @@ -22,16 +23,12 @@ class GasCylinderSizeMenu extends StatelessWidget { stateCode: menuProvider.stateCode, onRefresh: () async { menuProvider.reset(); - await menuProvider.getData( - user: userProvider.user, - host: settingProvider.host - ); + await menuProvider.getData(user: userProvider.user, host: settingProvider.host); }, child: SingleStatusMenu( initialStatus: initialValue, statuses: menuProvider.items, onSelect: onSelect, - ) - ); + )); } } diff --git a/lib/views/widgets/status/gas_refill/gas_cylinder_type.dart b/lib/views/widgets/status/gas_refill/gas_cylinder_type.dart index 9b2c264d..0b58d73a 100644 --- a/lib/views/widgets/status/gas_refill/gas_cylinder_type.dart +++ b/lib/views/widgets/status/gas_refill/gas_cylinder_type.dart @@ -6,6 +6,7 @@ import 'package:test_sa/controllers/providers/settings/setting_provider.dart'; import 'package:test_sa/models/lookup.dart'; import 'package:test_sa/views/widgets/loaders/loading_manager.dart'; import 'package:test_sa/views/widgets/status/single_status_menu.dart'; + class GasCylinderTypesMenu extends StatelessWidget { final Function(Lookup) onSelect; final Lookup initialValue; @@ -22,16 +23,12 @@ class GasCylinderTypesMenu extends StatelessWidget { stateCode: menuProvider.stateCode, onRefresh: () async { menuProvider.reset(); - await menuProvider.getData( - user: userProvider.user, - host: settingProvider.host - ); + await menuProvider.getData(user: userProvider.user, host: settingProvider.host); }, child: SingleStatusMenu( initialStatus: initialValue, statuses: menuProvider.items, onSelect: onSelect, - ) - ); + )); } } diff --git a/lib/views/widgets/status/gas_refill/gas_status.dart b/lib/views/widgets/status/gas_refill/gas_status.dart index 1dce0c71..c46e6508 100644 --- a/lib/views/widgets/status/gas_refill/gas_status.dart +++ b/lib/views/widgets/status/gas_refill/gas_status.dart @@ -6,6 +6,7 @@ import 'package:test_sa/controllers/providers/settings/setting_provider.dart'; import 'package:test_sa/models/lookup.dart'; import 'package:test_sa/views/widgets/loaders/loading_manager.dart'; import 'package:test_sa/views/widgets/status/single_status_menu.dart'; + class GasStatusMenu extends StatelessWidget { final Function(Lookup) onSelect; final Lookup initialValue; @@ -22,16 +23,12 @@ class GasStatusMenu extends StatelessWidget { stateCode: menuProvider.stateCode, onRefresh: () async { menuProvider.reset(); - await menuProvider.getData( - user: userProvider.user, - host: settingProvider.host - ); + await menuProvider.getData(user: userProvider.user, host: settingProvider.host); }, child: SingleStatusMenu( initialStatus: initialValue, statuses: menuProvider.items, onSelect: onSelect, - ) - ); + )); } } diff --git a/lib/views/widgets/status/gas_refill/gas_type.dart b/lib/views/widgets/status/gas_refill/gas_type.dart index 8d3b9e61..5f4c536e 100644 --- a/lib/views/widgets/status/gas_refill/gas_type.dart +++ b/lib/views/widgets/status/gas_refill/gas_type.dart @@ -6,6 +6,7 @@ import 'package:test_sa/controllers/providers/settings/setting_provider.dart'; import 'package:test_sa/models/lookup.dart'; import 'package:test_sa/views/widgets/loaders/loading_manager.dart'; import 'package:test_sa/views/widgets/status/single_status_menu.dart'; + class GasTypeMenu extends StatelessWidget { final Function(Lookup) onSelect; final Lookup initialValue; @@ -22,16 +23,12 @@ class GasTypeMenu extends StatelessWidget { stateCode: menuProvider.stateCode, onRefresh: () async { menuProvider.reset(); - await menuProvider.getData( - user: userProvider.user, - host: settingProvider.host - ); + await menuProvider.getData(user: userProvider.user, host: settingProvider.host); }, child: SingleStatusMenu( initialStatus: initialValue, statuses: menuProvider.items, onSelect: onSelect, - ) - ); + )); } } diff --git a/lib/views/widgets/status/multi_status_menu.dart b/lib/views/widgets/status/multi_status_menu.dart index 9d925df8..52330a62 100644 --- a/lib/views/widgets/status/multi_status_menu.dart +++ b/lib/views/widgets/status/multi_status_menu.dart @@ -4,6 +4,7 @@ import 'package:flutter_typeahead/flutter_typeahead.dart'; import 'package:test_sa/models/lookup.dart'; import 'package:test_sa/views/app_style/colors.dart'; import 'package:test_sa/views/app_style/sizing.dart'; + class MultiStatusMenu extends StatefulWidget { final List statuses; final List initialSelectedStatus; @@ -15,7 +16,6 @@ class MultiStatusMenu extends StatefulWidget { } class _MultiStatusMenuState extends State { - List _selectedStatus = []; TextEditingController _controller; @@ -31,101 +31,88 @@ class _MultiStatusMenuState extends State { _controller.clear(); super.dispose(); } + @override Widget build(BuildContext context) { - return - Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - Wrap( - crossAxisAlignment: WrapCrossAlignment.start, - alignment: WrapAlignment.start, - runAlignment: WrapAlignment.start, - children: List.generate( - _selectedStatus.length, - (index) { - final status = _selectedStatus[index]; - return Container( - height: 36 * AppStyle.getScaleFactor(context), - margin: EdgeInsets.all(4 * AppStyle.getScaleFactor(context)), - //padding: EdgeInsets.all(4 * AppStyle.getScaleFactor(context)), - decoration: BoxDecoration( - color: Theme.of(context).colorScheme.primary, - borderRadius: BorderRadius.circular(8) - ), - child: Row( - mainAxisSize: MainAxisSize.min, - children: [ - const SizedBox(width: 12,), - Text( - status.name, - style: Theme.of(context).textTheme.bodyText1.copyWith( - color:Theme.of(context).colorScheme.onPrimary, + return Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Wrap( + crossAxisAlignment: WrapCrossAlignment.start, + alignment: WrapAlignment.start, + runAlignment: WrapAlignment.start, + children: List.generate(_selectedStatus.length, (index) { + final status = _selectedStatus[index]; + return Container( + height: 36 * AppStyle.getScaleFactor(context), + margin: EdgeInsets.all(4 * AppStyle.getScaleFactor(context)), + //padding: EdgeInsets.all(4 * AppStyle.getScaleFactor(context)), + decoration: BoxDecoration(color: Theme.of(context).colorScheme.primary, borderRadius: BorderRadius.circular(8)), + child: Row( + mainAxisSize: MainAxisSize.min, + children: [ + const SizedBox( + width: 12, + ), + Text( + status.name, + style: Theme.of(context).textTheme.bodyText1.copyWith( + color: Theme.of(context).colorScheme.onPrimary, ), - ), - IconButton( - color:Theme.of(context).colorScheme.onPrimary, - onPressed: (){ - _selectedStatus.remove(status); - widget.onSelect(_selectedStatus); - setState(() {}); - }, - icon: const Icon(Icons.delete) - ) - ], - ) - ); - } - ), - ), - Container( - padding: const EdgeInsets.symmetric( - horizontal: 16 - ), - decoration: BoxDecoration( - color: Colors.white, - border: Border.all(color:AColors.black), - borderRadius: BorderRadius.circular( - AppStyle.borderRadius * AppStyle.getScaleFactor(context) - ), - boxShadow: const [ - AppStyle.boxShadow - ] - ), - child: TypeAheadField( - textFieldConfiguration: TextFieldConfiguration( - style: Theme.of(context).textTheme.subtitle1, - controller: _controller, - textAlign: TextAlign.center, - decoration: const InputDecoration( - border: InputBorder.none, - disabledBorder: InputBorder.none, - focusedBorder: InputBorder.none, - enabledBorder: InputBorder.none, - ), - textInputAction: TextInputAction.search, + ), + IconButton( + color: Theme.of(context).colorScheme.onPrimary, + onPressed: () { + _selectedStatus.remove(status); + widget.onSelect(_selectedStatus); + setState(() {}); + }, + icon: const Icon(Icons.delete)) + ], + )); + }), + ), + Container( + padding: const EdgeInsets.symmetric(horizontal: 16), + decoration: BoxDecoration( + color: Colors.white, + border: Border.all(color: AColors.black), + borderRadius: BorderRadius.circular(AppStyle.borderRadius * AppStyle.getScaleFactor(context)), + boxShadow: const [AppStyle.boxShadow]), + child: TypeAheadField( + textFieldConfiguration: TextFieldConfiguration( + style: Theme.of(context).textTheme.subtitle1, + controller: _controller, + textAlign: TextAlign.center, + decoration: const InputDecoration( + border: InputBorder.none, + disabledBorder: InputBorder.none, + focusedBorder: InputBorder.none, + enabledBorder: InputBorder.none, ), - suggestionsCallback: (vale) { - return widget.statuses.where((Lookup option) { - return option.name.toLowerCase().contains(_controller.text); - }); - }, - itemBuilder: (context, part) { - return ListTile( - title: Text(part.name), - ); - }, - onSuggestionSelected: (status) { - _controller.clear(); - if(!_selectedStatus.contains(status)){ - _selectedStatus.add(status); - widget.onSelect(_selectedStatus); - setState(() {}); - } - }, + textInputAction: TextInputAction.search, ), + suggestionsCallback: (vale) { + return widget.statuses.where((Lookup option) { + return option.name.toLowerCase().contains(_controller.text); + }); + }, + itemBuilder: (context, part) { + return ListTile( + title: Text(part.name), + ); + }, + onSuggestionSelected: (status) { + _controller.clear(); + if (!_selectedStatus.contains(status)) { + _selectedStatus.add(status); + widget.onSelect(_selectedStatus); + setState(() {}); + } + }, ), - ], - ); + ), + ], + ); } } diff --git a/lib/views/widgets/status/pentry/pentry_status_mune.dart b/lib/views/widgets/status/pentry/pentry_status_mune.dart index b0813f22..9f10c77c 100644 --- a/lib/views/widgets/status/pentry/pentry_status_mune.dart +++ b/lib/views/widgets/status/pentry/pentry_status_mune.dart @@ -6,6 +6,7 @@ import 'package:test_sa/controllers/providers/settings/setting_provider.dart'; import 'package:test_sa/models/lookup.dart'; import 'package:test_sa/views/widgets/loaders/loading_manager.dart'; import 'package:test_sa/views/widgets/status/single_status_menu.dart'; + class PentryStatusMenu extends StatelessWidget { final Function(Lookup) onSelect; final Lookup initialValue; @@ -22,16 +23,12 @@ class PentryStatusMenu extends StatelessWidget { stateCode: menuProvider.stateCode, onRefresh: () async { menuProvider.reset(); - await menuProvider.getData( - user: userProvider.user, - host: settingProvider.host - ); + await menuProvider.getData(user: userProvider.user, host: settingProvider.host); }, child: SingleStatusMenu( initialStatus: initialValue, statuses: menuProvider.items, onSelect: onSelect, - ) - ); + )); } } diff --git a/lib/views/widgets/status/pentry/pentry_task_status_mune.dart b/lib/views/widgets/status/pentry/pentry_task_status_mune.dart index 8564410d..6b438dc2 100644 --- a/lib/views/widgets/status/pentry/pentry_task_status_mune.dart +++ b/lib/views/widgets/status/pentry/pentry_task_status_mune.dart @@ -6,6 +6,7 @@ import 'package:test_sa/controllers/providers/settings/setting_provider.dart'; import 'package:test_sa/models/lookup.dart'; import 'package:test_sa/views/widgets/loaders/loading_manager.dart'; import 'package:test_sa/views/widgets/status/single_status_menu.dart'; + class PentryTaskStatusMenu extends StatelessWidget { final Function(Lookup) onSelect; final Lookup initialValue; @@ -22,16 +23,12 @@ class PentryTaskStatusMenu extends StatelessWidget { stateCode: menuProvider.stateCode, onRefresh: () async { menuProvider.reset(); - await menuProvider.getData( - user: userProvider.user, - host: settingProvider.host - ); + await menuProvider.getData(user: userProvider.user, host: settingProvider.host); }, child: SingleStatusMenu( initialStatus: initialValue, statuses: menuProvider.items, onSelect: onSelect, - ) - ); + )); } } diff --git a/lib/views/widgets/status/pentry/pentry_visit_status_mune.dart b/lib/views/widgets/status/pentry/pentry_visit_status_mune.dart index 4df17a49..d4941723 100644 --- a/lib/views/widgets/status/pentry/pentry_visit_status_mune.dart +++ b/lib/views/widgets/status/pentry/pentry_visit_status_mune.dart @@ -6,6 +6,7 @@ import 'package:test_sa/controllers/providers/settings/setting_provider.dart'; import 'package:test_sa/models/lookup.dart'; import 'package:test_sa/views/widgets/loaders/loading_manager.dart'; import 'package:test_sa/views/widgets/status/single_status_menu.dart'; + class PentryVisitsStatusMenu extends StatelessWidget { final Function(Lookup) onSelect; final Lookup initialValue; @@ -22,16 +23,12 @@ class PentryVisitsStatusMenu extends StatelessWidget { stateCode: menuProvider.stateCode, onRefresh: () async { menuProvider.reset(); - await menuProvider.getData( - user: userProvider.user, - host: settingProvider.host - ); + await menuProvider.getData(user: userProvider.user, host: settingProvider.host); }, child: SingleStatusMenu( initialStatus: initialValue, statuses: menuProvider.items, onSelect: onSelect, - ) - ); + )); } } diff --git a/lib/views/widgets/status/report/service_report_last_call.dart b/lib/views/widgets/status/report/service_report_last_call.dart index a3f59211..b6f29fb0 100644 --- a/lib/views/widgets/status/report/service_report_last_call.dart +++ b/lib/views/widgets/status/report/service_report_last_call.dart @@ -5,12 +5,12 @@ import 'package:test_sa/models/lookup.dart'; import 'package:test_sa/models/service_report.dart'; import 'package:test_sa/views/widgets/loaders/loading_manager.dart'; import 'package:test_sa/views/widgets/status/single_status_menu.dart'; + class ServiceReportLastCallsMenu extends StatelessWidget { final Function(Lookup) onSelect; final ServiceReport report; - const ServiceReportLastCallsMenu({ - Key key,@required this.onSelect,@required this.report}) : super(key: key); + const ServiceReportLastCallsMenu({Key key, @required this.onSelect, @required this.report}) : super(key: key); @override Widget build(BuildContext context) { ServiceReportLastCallsProvider _menuProvider = Provider.of(context); @@ -23,7 +23,6 @@ class ServiceReportLastCallsMenu extends StatelessWidget { initialStatus: report?.callLastSituation, statuses: _menuProvider.calls, onSelect: onSelect, - ) - ); + )); } } diff --git a/lib/views/widgets/status/report/service_report_reasons.dart b/lib/views/widgets/status/report/service_report_reasons.dart index dbdd48ef..18115724 100644 --- a/lib/views/widgets/status/report/service_report_reasons.dart +++ b/lib/views/widgets/status/report/service_report_reasons.dart @@ -6,6 +6,7 @@ import 'package:test_sa/controllers/providers/settings/setting_provider.dart'; import 'package:test_sa/models/lookup.dart'; import 'package:test_sa/views/widgets/loaders/loading_manager.dart'; import 'package:test_sa/views/widgets/status/single_status_menu.dart'; + class ServiceReportReasonsMenu extends StatelessWidget { final Lookup initialValue; final Function(Lookup) onSelect; @@ -25,14 +26,12 @@ class ServiceReportReasonsMenu extends StatelessWidget { await _menuProvider.getTypes( user: _userProvider.user, host: _settingProvider.host, - ); }, child: SingleStatusMenu( initialStatus: initialValue, statuses: _menuProvider.reasons, onSelect: onSelect, - ) - ); + )); } } diff --git a/lib/views/widgets/status/report/service_report_status.dart b/lib/views/widgets/status/report/service_report_status.dart index 12adf5d3..2effae6b 100644 --- a/lib/views/widgets/status/report/service_report_status.dart +++ b/lib/views/widgets/status/report/service_report_status.dart @@ -10,6 +10,7 @@ import 'package:test_sa/models/lookup.dart'; import 'package:test_sa/models/service_report.dart'; import 'package:test_sa/views/widgets/loaders/loading_manager.dart'; import 'package:test_sa/views/widgets/status/single_status_menu.dart'; + class ServiceReportStatusMenu extends StatefulWidget { final Function(Lookup) onSelect; final ServiceReport report; @@ -28,7 +29,7 @@ class _ServiceReportStatusMenuState extends State { UserProvider userProvider = Provider.of(context); ServiceReportStatusProvider menuProvider = Provider.of(context); ServiceReportLastCallsProvider callsLastSituationsProvider = Provider.of(context); - if(firstTime){ + if (firstTime) { callsLastSituationsProvider.reset(); firstTime = false; @@ -36,37 +37,24 @@ class _ServiceReportStatusMenuState extends State { return LoadingManager( isLoading: menuProvider.isLoading == true || callsLastSituationsProvider.isLoading == true, isFailedLoading: menuProvider.statuses == null || callsLastSituationsProvider.calls == null, - stateCode: menuProvider.stateCode == null || callsLastSituationsProvider.stateCode == null ? null: - max(menuProvider.stateCode ?? 0,callsLastSituationsProvider.stateCode ?? 0), + stateCode: menuProvider.stateCode == null || callsLastSituationsProvider.stateCode == null ? null : max(menuProvider.stateCode ?? 0, callsLastSituationsProvider.stateCode ?? 0), onRefresh: () async { - await callsLastSituationsProvider.getCalls( - user: userProvider.user, - host: settingProvider.host, - serviceStatus: widget.report.status?.id - ); - if(menuProvider.stateCode == null){ + await callsLastSituationsProvider.getCalls(user: userProvider.user, host: settingProvider.host, serviceStatus: widget.report.status?.id); + if (menuProvider.stateCode == null) { menuProvider.reset(); - await menuProvider.getTypes( - user: userProvider.user, - host: settingProvider.host - ); + await menuProvider.getTypes(user: userProvider.user, host: settingProvider.host); setState(() {}); } }, child: SingleStatusMenu( statuses: menuProvider.statuses, initialStatus: widget.report.status, - onSelect: (status){ + onSelect: (status) { widget.report.callLastSituation = null; - callsLastSituationsProvider.getCalls( - user: userProvider.user, - host: settingProvider.host, - serviceStatus: status.id - ); + callsLastSituationsProvider.getCalls(user: userProvider.user, host: settingProvider.host, serviceStatus: status.id); widget.onSelect(status); }, - ) - ); + )); } } diff --git a/lib/views/widgets/status/report/service_report_type.dart b/lib/views/widgets/status/report/service_report_type.dart index fb315747..99f66397 100644 --- a/lib/views/widgets/status/report/service_report_type.dart +++ b/lib/views/widgets/status/report/service_report_type.dart @@ -6,6 +6,7 @@ import 'package:test_sa/controllers/providers/settings/setting_provider.dart'; import 'package:test_sa/models/lookup.dart'; import 'package:test_sa/views/widgets/loaders/loading_manager.dart'; import 'package:test_sa/views/widgets/status/single_status_menu.dart'; + class ServiceReportTypeMenu extends StatelessWidget { final Function(Lookup) onSelect; final Lookup initialValue; @@ -22,17 +23,13 @@ class ServiceReportTypeMenu extends StatelessWidget { stateCode: menuProvider.stateCode, onRefresh: () async { menuProvider.reset(); - await menuProvider.getTypes( - user: userProvider.user, - host: settingProvider.host - ); + await menuProvider.getTypes(user: userProvider.user, host: settingProvider.host); onSelect(initialValue ?? menuProvider.types?.last); }, child: SingleStatusMenu( initialStatus: initialValue ?? menuProvider.types?.last, statuses: menuProvider.types, onSelect: onSelect, - ) - ); + )); } } diff --git a/lib/views/widgets/status/report/service_status.dart b/lib/views/widgets/status/report/service_status.dart index 3c4eb794..245e0997 100644 --- a/lib/views/widgets/status/report/service_status.dart +++ b/lib/views/widgets/status/report/service_status.dart @@ -6,6 +6,7 @@ import 'package:test_sa/controllers/providers/settings/setting_provider.dart'; import 'package:test_sa/models/lookup.dart'; import 'package:test_sa/views/widgets/loaders/loading_manager.dart'; import 'package:test_sa/views/widgets/status/single_status_menu.dart'; + class ServiceAssetTypeMenu extends StatelessWidget { final Function(Lookup) onSelect; final Lookup initialValue; @@ -22,16 +23,12 @@ class ServiceAssetTypeMenu extends StatelessWidget { stateCode: _menuProvider.stateCode, onRefresh: () async { _menuProvider.reset(); - await _menuProvider.getTypes( - user: _userProvider.user, - host: _settingProvider.host - ); + await _menuProvider.getTypes(user: _userProvider.user, host: _settingProvider.host); }, child: SingleStatusMenu( initialStatus: initialValue, statuses: _menuProvider.statuses, onSelect: onSelect, - ) - ); + )); } } diff --git a/lib/views/widgets/status/service_request/service_request_defect_types_mune.dart b/lib/views/widgets/status/service_request/service_request_defect_types_mune.dart index be02c54e..8607cffe 100644 --- a/lib/views/widgets/status/service_request/service_request_defect_types_mune.dart +++ b/lib/views/widgets/status/service_request/service_request_defect_types_mune.dart @@ -6,6 +6,7 @@ import 'package:test_sa/controllers/providers/settings/setting_provider.dart'; import 'package:test_sa/models/lookup.dart'; import 'package:test_sa/views/widgets/loaders/loading_manager.dart'; import 'package:test_sa/views/widgets/status/single_status_menu.dart'; + class ServiceRequestDefectTypesMenu extends StatelessWidget { final Function(Lookup) onSelect; final Lookup initialValue; @@ -22,16 +23,12 @@ class ServiceRequestDefectTypesMenu extends StatelessWidget { stateCode: menuProvider.stateCode, onRefresh: () async { menuProvider.reset(); - await menuProvider.getData( - user: userProvider.user, - host: settingProvider.host - ); + await menuProvider.getData(user: userProvider.user, host: settingProvider.host); }, child: SingleStatusMenu( initialStatus: initialValue, statuses: menuProvider.items, onSelect: onSelect, - ) - ); + )); } } diff --git a/lib/views/widgets/status/service_request/service_request_status_mune.dart b/lib/views/widgets/status/service_request/service_request_status_mune.dart index 8ac8d1c5..4cb7f730 100644 --- a/lib/views/widgets/status/service_request/service_request_status_mune.dart +++ b/lib/views/widgets/status/service_request/service_request_status_mune.dart @@ -6,6 +6,7 @@ import 'package:test_sa/controllers/providers/settings/setting_provider.dart'; import 'package:test_sa/models/lookup.dart'; import 'package:test_sa/views/widgets/loaders/loading_manager.dart'; import 'package:test_sa/views/widgets/status/single_status_menu.dart'; + class ServiceRequestStatusMenu extends StatelessWidget { final Function(Lookup) onSelect; final Lookup initialValue; @@ -22,16 +23,12 @@ class ServiceRequestStatusMenu extends StatelessWidget { stateCode: menuProvider.stateCode, onRefresh: () async { menuProvider.reset(); - await menuProvider.getData( - user: userProvider.user, - host: settingProvider.host - ); + await menuProvider.getData(user: userProvider.user, host: settingProvider.host); }, child: SingleStatusMenu( initialStatus: initialValue, statuses: menuProvider.items, onSelect: onSelect, - ) - ); + )); } } diff --git a/lib/views/widgets/status/service_request/service_request_through_mune.dart b/lib/views/widgets/status/service_request/service_request_through_mune.dart index 81a1c5b0..986a5953 100644 --- a/lib/views/widgets/status/service_request/service_request_through_mune.dart +++ b/lib/views/widgets/status/service_request/service_request_through_mune.dart @@ -6,6 +6,7 @@ import 'package:test_sa/controllers/providers/settings/setting_provider.dart'; import 'package:test_sa/models/lookup.dart'; import 'package:test_sa/views/widgets/loaders/loading_manager.dart'; import 'package:test_sa/views/widgets/status/single_status_menu.dart'; + class ServiceRequestedThroughMenu extends StatelessWidget { final Function(Lookup) onSelect; final Lookup initialValue; @@ -22,16 +23,12 @@ class ServiceRequestedThroughMenu extends StatelessWidget { stateCode: menuProvider.stateCode, onRefresh: () async { menuProvider.reset(); - await menuProvider.getData( - user: userProvider.user, - host: settingProvider.host - ); + await menuProvider.getData(user: userProvider.user, host: settingProvider.host); }, child: SingleStatusMenu( initialStatus: initialValue, statuses: menuProvider.items, onSelect: onSelect, - ) - ); + )); } } diff --git a/lib/views/widgets/status/service_request/service_request_types_mune.dart b/lib/views/widgets/status/service_request/service_request_types_mune.dart index 1cba8f6a..a588cb8b 100644 --- a/lib/views/widgets/status/service_request/service_request_types_mune.dart +++ b/lib/views/widgets/status/service_request/service_request_types_mune.dart @@ -6,6 +6,7 @@ import 'package:test_sa/controllers/providers/settings/setting_provider.dart'; import 'package:test_sa/models/lookup.dart'; import 'package:test_sa/views/widgets/loaders/loading_manager.dart'; import 'package:test_sa/views/widgets/status/single_status_menu.dart'; + class ServiceRequestTypesMenu extends StatelessWidget { final Function(Lookup) onSelect; final Lookup initialValue; @@ -22,16 +23,12 @@ class ServiceRequestTypesMenu extends StatelessWidget { stateCode: menuProvider.stateCode, onRefresh: () async { menuProvider.reset(); - await menuProvider.getData( - user: userProvider.user, - host: settingProvider.host - ); + await menuProvider.getData(user: userProvider.user, host: settingProvider.host); }, child: SingleStatusMenu( initialStatus: initialValue, statuses: menuProvider.items, onSelect: onSelect, - ) - ); + )); } } diff --git a/lib/views/widgets/status/single_status_menu.dart b/lib/views/widgets/status/single_status_menu.dart index ee179dc5..dbd2eb70 100644 --- a/lib/views/widgets/status/single_status_menu.dart +++ b/lib/views/widgets/status/single_status_menu.dart @@ -33,7 +33,7 @@ class _SingleStatusMenuState extends State { } else { _selectedStatus = null; } - if((widget.initialStatus?.id??"") != (_selectedStatus?.id??"")) { + if ((widget.initialStatus?.id ?? "") != (_selectedStatus?.id ?? "")) { widget.onSelect(_selectedStatus); } } else { diff --git a/lib/views/widgets/timer/app_timer.dart b/lib/views/widgets/timer/app_timer.dart index cbc75bc6..84c5e4e1 100644 --- a/lib/views/widgets/timer/app_timer.dart +++ b/lib/views/widgets/timer/app_timer.dart @@ -4,6 +4,7 @@ import 'package:flutter/material.dart'; import 'package:test_sa/models/timer_model.dart'; import 'package:test_sa/views/app_style/colors.dart'; import 'package:test_sa/views/app_style/sizing.dart'; + class AppTimer extends StatefulWidget { final TimerModel timer; final Future Function(TimerModel) onChange; @@ -26,17 +27,16 @@ class _AppTimerState extends State { int _delay = 0; bool _running = false; bool _loading = false; - final ValueNotifier _period = ValueNotifier("0:00:00"); + final ValueNotifier _period = ValueNotifier("0:00:00"); _startTimer() async { if (!_running) { final time = DateTime.now(); - bool result = await widget.onChange( - TimerModel(startAt: time,endAt: null,durationInSecond: _delay)); - if(!result) return; + bool result = await widget.onChange(TimerModel(startAt: time, endAt: null, durationInSecond: _delay)); + if (!result) return; _running = true; - if(_endAt != null){ + if (_endAt != null) { _delay += _endAt.difference(_startAt).inSeconds; } _startAt = time.subtract(Duration(seconds: _delay)); @@ -44,19 +44,16 @@ class _AppTimerState extends State { } _timer = Timer.periodic(const Duration(seconds: 1), (timer) { - if(_loading == true) return; - _period.value = (_endAt ?? DateTime.now()).difference( - _startAt - ).toString().split(".").first; + if (_loading == true) return; + _period.value = (_endAt ?? DateTime.now()).difference(_startAt).toString().split(".").first; }); } _stopTimer() async { final time = DateTime.now(); final tempStartAt = _startAt.add(Duration(seconds: _delay)); - bool result = await widget.onChange( - TimerModel(startAt: tempStartAt,endAt: time,durationInSecond: _delay)); - if(!result) return; + bool result = await widget.onChange(TimerModel(startAt: tempStartAt, endAt: time, durationInSecond: _delay)); + if (!result) return; _running = false; _endAt = time; _startAt = tempStartAt; @@ -66,9 +63,9 @@ class _AppTimerState extends State { _onPressed() async { _loading = true; setState(() {}); - if(!_running){ + if (!_running) { await _startTimer(); - }else{ + } else { await _stopTimer(); } _loading = false; @@ -81,17 +78,19 @@ class _AppTimerState extends State { _endAt = widget.timer?.endAt; _running = _startAt != null && _endAt == null; _delay = (widget.timer?.durationInSecond ?? 0); - final difference = _startAt == null ? 0: - (_endAt ?? DateTime.now())?.difference(_startAt)?.inSeconds ?? 0; + final difference = _startAt == null ? 0 : (_endAt ?? DateTime.now())?.difference(_startAt)?.inSeconds ?? 0; _period.value = Duration(seconds: _running ? difference : _delay + difference).toString().split(".").first; super.initState(); - if(_running){_startTimer();} + if (_running) { + _startTimer(); + } } @override void dispose() { super.dispose(); } + @override Widget build(BuildContext context) { return SizedBox( @@ -99,31 +98,31 @@ class _AppTimerState extends State { height: 28 * AppStyle.getScaleFactor(context), child: ElevatedButton( style: ElevatedButton.styleFrom( - minimumSize: const Size(1, 1), - padding: EdgeInsets.all(4 * AppStyle.getScaleFactor(context)), - backgroundColor: _running ? AColors.green[300] : AColors.grey, - foregroundColor: Colors.black - ), + minimumSize: const Size(1, 1), padding: EdgeInsets.all(4 * AppStyle.getScaleFactor(context)), backgroundColor: _running ? AColors.green[300] : AColors.grey, foregroundColor: Colors.black), onPressed: _loading ? null : _onPressed, - child: _loading ? const SizedBox.square( - dimension: 18,child: CircularProgressIndicator(color: Colors.white,)): - Row( - children: [ - Icon(_running ? Icons.pause : Icons.play_arrow), - Expanded( - child: Center( - child: ValueListenableBuilder( - valueListenable: _period, - builder: (context,value,_){ - return Text(value, - style: widget.style, - ); - } - ), + child: _loading + ? const SizedBox.square( + dimension: 18, + child: CircularProgressIndicator( + color: Colors.white, + )) + : Row( + children: [ + Icon(_running ? Icons.pause : Icons.play_arrow), + Expanded( + child: Center( + child: ValueListenableBuilder( + valueListenable: _period, + builder: (context, value, _) { + return Text( + value, + style: widget.style, + ); + }), + ), + ), + ], ), - ), - ], - ), ), ); } diff --git a/lib/views/widgets/timer/timer_manager.dart b/lib/views/widgets/timer/timer_manager.dart index e69de29b..8b137891 100644 --- a/lib/views/widgets/timer/timer_manager.dart +++ b/lib/views/widgets/timer/timer_manager.dart @@ -0,0 +1 @@ + diff --git a/lib/views/widgets/titles/app_sub_title.dart b/lib/views/widgets/titles/app_sub_title.dart index f5651c65..d1fc3786 100644 --- a/lib/views/widgets/titles/app_sub_title.dart +++ b/lib/views/widgets/titles/app_sub_title.dart @@ -1,11 +1,12 @@ import 'package:flutter/material.dart'; import 'package:test_sa/views/app_style/sizing.dart'; + class ASubTitle extends StatelessWidget { final String text; final EdgeInsets padding; final Color color; final double font; - const ASubTitle(this.text, {Key key,this.padding, this.color, this.font}) : super(key: key); + const ASubTitle(this.text, {Key key, this.padding, this.color, this.font}) : super(key: key); @override Widget build(BuildContext context) { return Padding( @@ -13,10 +14,9 @@ class ASubTitle extends StatelessWidget { child: Text( text, style: Theme.of(context).textTheme.bodyText1.copyWith( - // fontWeight: FontWeight.bold, - fontSize: font, - color: color - ), + // fontWeight: FontWeight.bold, + fontSize: font, + color: color), textScaleFactor: AppStyle.getScaleFactor(context), ), ); diff --git a/lib/views/widgets/titles/app_title.dart b/lib/views/widgets/titles/app_title.dart index e5dfbc9e..15e0c588 100644 --- a/lib/views/widgets/titles/app_title.dart +++ b/lib/views/widgets/titles/app_title.dart @@ -1,18 +1,17 @@ import 'package:flutter/material.dart'; import 'package:test_sa/views/app_style/sizing.dart'; + class ATitle extends StatelessWidget { final String text; final EdgeInsets padding; final bool center; - const ATitle(this.text, {Key key,this.padding,this.center= false}) : super(key: key); + const ATitle(this.text, {Key key, this.padding, this.center = false}) : super(key: key); @override Widget build(BuildContext context) { return Padding( - padding: padding ?? EdgeInsets.symmetric(horizontal: 16,vertical: 8), + padding: padding ?? EdgeInsets.symmetric(horizontal: 16, vertical: 8), child: Row( - mainAxisAlignment: center - ? MainAxisAlignment.center - : MainAxisAlignment.start, + mainAxisAlignment: center ? MainAxisAlignment.center : MainAxisAlignment.start, children: [ Text( text, diff --git a/lib/views/widgets/titles/expandable_info_row.dart b/lib/views/widgets/titles/expandable_info_row.dart index b5d24e62..318ca323 100644 --- a/lib/views/widgets/titles/expandable_info_row.dart +++ b/lib/views/widgets/titles/expandable_info_row.dart @@ -1,6 +1,7 @@ import 'package:flutter/material.dart'; import 'package:font_awesome_flutter/font_awesome_flutter.dart'; import 'package:test_sa/views/app_style/sizing.dart'; + class ExpandableInfoRow extends StatefulWidget { final IconData iconData; final String title; @@ -12,13 +13,12 @@ class ExpandableInfoRow extends StatefulWidget { _ExpandableInfoRowState createState() => _ExpandableInfoRowState(); } -class _ExpandableInfoRowState extends State - with TickerProviderStateMixin{ +class _ExpandableInfoRowState extends State with TickerProviderStateMixin { bool _isExpanded = false; @override Widget build(BuildContext context) { return InkWell( - onTap: (){ + onTap: () { _isExpanded = !_isExpanded; setState(() {}); }, @@ -26,18 +26,19 @@ class _ExpandableInfoRowState extends State children: [ Row( children: [ - widget.iconData != null ? - Padding( - padding: EdgeInsets.symmetric( - horizontal: 8 * AppStyle.getScaleFactor(context), - vertical: 2 * AppStyle.getScaleFactor(context), - ), - child: FaIcon( - widget.iconData, - color: Theme.of(context).primaryColor, - size: 20 * AppStyle.getScaleFactor(context), - ), - ):SizedBox.shrink(), + widget.iconData != null + ? Padding( + padding: EdgeInsets.symmetric( + horizontal: 8 * AppStyle.getScaleFactor(context), + vertical: 2 * AppStyle.getScaleFactor(context), + ), + child: FaIcon( + widget.iconData, + color: Theme.of(context).primaryColor, + size: 20 * AppStyle.getScaleFactor(context), + ), + ) + : SizedBox.shrink(), Expanded( flex: 2, child: Text( @@ -47,27 +48,20 @@ class _ExpandableInfoRowState extends State fontSize: 14, fontWeight: FontWeight.bold, ), - textScaleFactor: AppStyle.getScaleFactor(context), + textScaleFactor: AppStyle.getScaleFactor(context), ), ), AnimatedSwitcher( duration: Duration(milliseconds: 400), transitionBuilder: (Widget child, Animation animation) { return FadeTransition( - child: ScaleTransition( - child: child, - scale: animation - ), + child: ScaleTransition(child: child, scale: animation), opacity: animation, ); }, child: Icon( - _isExpanded - ? Icons.keyboard_arrow_up - : Icons.keyboard_arrow_down, - key: ValueKey(_isExpanded - ? "Icons.keyboard_arrow_up" - : "Icons.keyboard_arrow_down"), + _isExpanded ? Icons.keyboard_arrow_up : Icons.keyboard_arrow_down, + key: ValueKey(_isExpanded ? "Icons.keyboard_arrow_up" : "Icons.keyboard_arrow_down"), color: Theme.of(context).primaryColor, size: 24 * AppStyle.getScaleFactor(context), ), @@ -77,15 +71,18 @@ class _ExpandableInfoRowState extends State AnimatedSize( duration: Duration(milliseconds: 300), child: Visibility( - visible: _isExpanded, - child: Padding( - padding: EdgeInsets.symmetric(vertical: 8 * AppStyle.getScaleFactor(context)), - child: widget.child, - ) - ), + visible: _isExpanded, + child: Padding( + padding: EdgeInsets.symmetric(vertical: 8 * AppStyle.getScaleFactor(context)), + child: widget.child, + )), + ), + Divider( + height: 2 * AppStyle.getScaleFactor(context), + ), + SizedBox( + height: 8 * AppStyle.getScaleFactor(context), ), - Divider(height: 2 * AppStyle.getScaleFactor(context),), - SizedBox(height: 8 * AppStyle.getScaleFactor(context),), ], ), ); diff --git a/lib/views/widgets/visits/visit_status.dart b/lib/views/widgets/visits/visit_status.dart index 5fb31918..f582fe95 100644 --- a/lib/views/widgets/visits/visit_status.dart +++ b/lib/views/widgets/visits/visit_status.dart @@ -2,43 +2,36 @@ import 'package:flutter/material.dart'; import 'package:test_sa/models/visits/visit.dart'; import 'package:test_sa/views/app_style/colors.dart'; import 'package:test_sa/views/app_style/sizing.dart'; + class VisitStatusLabel extends StatelessWidget { final Visit visit; const VisitStatusLabel({Key key, this.visit}) : super(key: key); - Color getStatusColor(){ - switch(visit.status.id){ - case 0: return AColors.green; - case 1: return AColors.grey; - case 2: return AColors.grey; - default : return AColors.grey; + Color getStatusColor() { + switch (visit.status.id) { + case 0: + return AColors.green; + case 1: + return AColors.grey; + case 2: + return AColors.grey; + default: + return AColors.grey; } } @override Widget build(BuildContext context) { - return Container( - padding: EdgeInsets.symmetric(vertical: 2,horizontal: 8), + return Container( + padding: EdgeInsets.symmetric(vertical: 2, horizontal: 8), alignment: Alignment.center, - decoration: BoxDecoration( - color: getStatusColor(), - borderRadius: BorderRadius.circular( - AppStyle.getBorderRadius(context) - ), - boxShadow: [ - AppStyle.boxShadow - ] - ), + decoration: BoxDecoration(color: getStatusColor(), borderRadius: BorderRadius.circular(AppStyle.getBorderRadius(context)), boxShadow: [AppStyle.boxShadow]), child: Text( - visit.status.name == null - || visit.status.name.isEmpty - ? "no status" :visit.status.name, + visit.status.name == null || visit.status.name.isEmpty ? "no status" : visit.status.name, style: Theme.of(context).textTheme.subtitle2.copyWith( - color: getStatusColor().computeLuminance() > 0.5 - ? AColors.black : Colors.white, - ), - ) - ); + color: getStatusColor().computeLuminance() > 0.5 ? AColors.black : Colors.white, + ), + )); } } diff --git a/lib/views/widgets/visits/visits_list.dart b/lib/views/widgets/visits/visits_list.dart index ba688518..c8488921 100644 --- a/lib/views/widgets/visits/visits_list.dart +++ b/lib/views/widgets/visits/visits_list.dart @@ -7,19 +7,14 @@ import 'package:test_sa/views/pages/user/visits/visit_details.dart'; import 'package:test_sa/views/widgets/loaders/lazy_loading.dart'; import 'package:test_sa/views/widgets/loaders/no_item_found.dart'; import 'package:test_sa/views/widgets/visits/visit_item.dart'; + class VisitsList extends StatefulWidget { final List visits; final bool nextPage; final Future Function() onLazyLoad; final Function(List) onEditGroup; - const VisitsList({ - Key key, - this.visits, - this.nextPage, - this.onLazyLoad, - this.onEditGroup - }) : super(key: key); + const VisitsList({Key key, this.visits, this.nextPage, this.onLazyLoad, this.onEditGroup}) : super(key: key); @override _VisitsListState createState() => _VisitsListState(); @@ -32,11 +27,14 @@ class _VisitsListState extends State { _selectedVisits.clear(); super.initState(); } + @override Widget build(BuildContext context) { Subtitle _subtitle = AppLocalization.of(context).subtitle; - if(widget.visits.length == 0){ - return NoItemFound(message: _subtitle.noVisitsFound,); + if (widget.visits.length == 0) { + return NoItemFound( + message: _subtitle.noVisitsFound, + ); } return Stack( children: [ @@ -44,34 +42,33 @@ class _VisitsListState extends State { nextPage: widget.nextPage, onLazyLoad: widget.onLazyLoad, child: ListView.builder( - //physics: BouncingScrollPhysics(), - itemCount: widget.visits.length, - padding: EdgeInsets.symmetric(horizontal: 16,vertical: 8), - itemBuilder: (context,itemIndex){ - Visit _visit = widget.visits[itemIndex]; - bool _isSelected = _selectedVisits.contains(_visit); + //physics: BouncingScrollPhysics(), + itemCount: widget.visits.length, + padding: EdgeInsets.symmetric(horizontal: 16, vertical: 8), + itemBuilder: (context, itemIndex) { + Visit _visit = widget.visits[itemIndex]; + bool _isSelected = _selectedVisits.contains(_visit); return VisitItem( visit: _visit, isSelected: _isSelected, index: itemIndex, activeSelectMod: _selectedVisits.isNotEmpty, - onPressed: (visit){ - Navigator.of(context).push( - MaterialPageRoute( - builder: (_)=> VisitDetailsPage(visit: visit,) - ) - ); + onPressed: (visit) { + Navigator.of(context).push(MaterialPageRoute( + builder: (_) => VisitDetailsPage( + visit: visit, + ))); }, - onSelect: (visit){ - if(_isSelected){ + onSelect: (visit) { + if (_isSelected) { _selectedVisits.remove(visit); } else { _selectedVisits.add(visit); } setState(() {}); }, - onLongPress: (visit){ - if(_isSelected){ + onLongPress: (visit) { + if (_isSelected) { _selectedVisits.remove(visit); } else { _selectedVisits.add(visit); @@ -79,8 +76,7 @@ class _VisitsListState extends State { setState(() {}); }, ); - } - ), + }), ), Align( alignment: Alignment.bottomLeft, @@ -97,7 +93,7 @@ class _VisitsListState extends State { FloatingActionButton( heroTag: "cancel", child: Icon(Icons.cancel), - onPressed: (){ + onPressed: () { _selectedVisits.clear(); setState(() {}); }, @@ -105,8 +101,8 @@ class _VisitsListState extends State { FloatingActionButton( heroTag: "edit", child: Icon(Icons.edit), - onPressed: (){ - if(!widget.visits.contains(_selectedVisits.first)){ + onPressed: () { + if (!widget.visits.contains(_selectedVisits.first)) { _selectedVisits.clear(); setState(() {}); return; From 2a5a8f411f9eadb34d6ccb5662a5c5d211838f64 Mon Sep 17 00:00:00 2001 From: nextwo <1234> Date: Wed, 31 May 2023 11:20:12 +0300 Subject: [PATCH 038/181] implement searchWorkOrders api and edit on ui --- lib/views/pages/user/requests/request_details.dart | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/views/pages/user/requests/request_details.dart b/lib/views/pages/user/requests/request_details.dart index 1deaaca4..c79931e8 100644 --- a/lib/views/pages/user/requests/request_details.dart +++ b/lib/views/pages/user/requests/request_details.dart @@ -327,7 +327,7 @@ class RequestDetailsPage extends StatelessWidget { children: [ RequestInfoRow( title: _subtitle.callId, - content: workOrders[index].id.toString(), + content: serviceRequest.requestCode, ), RequestInfoRow( title: _subtitle.orderWorkNumber, From 5945756e6013fbf6a3e692d559ab0081cb497a02 Mon Sep 17 00:00:00 2001 From: zaid_daoud Date: Wed, 31 May 2023 11:27:48 +0300 Subject: [PATCH 039/181] New Work Order Done (Unable to upload Engineer Signature) --- assets/subtitles/ar_subtitle.json | 6 +- assets/subtitles/en_subtitle.json | 6 +- lib/controllers/api_routes/urls.dart | 1 + .../api/service_requests_provider.dart | 64 ++- ...rvice_report_repair_location_provider.dart | 69 +++ lib/main.dart | 2 + lib/models/service_report.dart | 64 ++- lib/models/subtitle.dart | 12 + .../report/create_service_report.dart | 478 +++++++++++------- .../service_report_repair_location.dart | 37 ++ 10 files changed, 524 insertions(+), 215 deletions(-) create mode 100644 lib/controllers/providers/api/status_drop_down/report/service_report_repair_location_provider.dart create mode 100644 lib/views/widgets/status/report/service_report_repair_location.dart diff --git a/assets/subtitles/ar_subtitle.json b/assets/subtitles/ar_subtitle.json index b4294845..6237d6c9 100644 --- a/assets/subtitles/ar_subtitle.json +++ b/assets/subtitles/ar_subtitle.json @@ -190,5 +190,9 @@ "duplicateAlertMessage": "هل أنت متأكد أنك تريد تكرار الطلب؟", "duplicateRequest": "تكرار الطلب", "comment" : "تعليق", - "updateServiceRequest" : "تعديل طلب الخدمة" + "updateServiceRequest" : "تعديل طلب الخدمة", + "repairLocation" : "موقع الإصلاح", + "travelingExpense" : "مصاريف التنقل", + "startDate" : "وقت البدء", + "endDate" : "وقت الانتهاء" } \ No newline at end of file diff --git a/assets/subtitles/en_subtitle.json b/assets/subtitles/en_subtitle.json index 3045e66e..3a88a991 100644 --- a/assets/subtitles/en_subtitle.json +++ b/assets/subtitles/en_subtitle.json @@ -190,5 +190,9 @@ "duplicateAlertMessage": "Are you sure you want to duplicate request?", "duplicateRequest": "Duplicate Request", "comment" : "Comment", - "updateServiceRequest" : "Update Service Request" + "updateServiceRequest" : "Update Service Request", + "repairLocation" : "Repair Location", + "travelingExpense": "Traveling Expense", + "startDate" : "Start Date", + "endDate" : "End Date" } \ No newline at end of file diff --git a/lib/controllers/api_routes/urls.dart b/lib/controllers/api_routes/urls.dart index 36f430fd..d641e31f 100644 --- a/lib/controllers/api_routes/urls.dart +++ b/lib/controllers/api_routes/urls.dart @@ -29,6 +29,7 @@ class URLs { static get getServiceFirstAction => "$_baseUrl/Lookups/GetLookup?lookupEnum=700"; // get static get getServiceRequestTypes => "$_baseUrl/Lookups/GetLookup?lookupEnum=604"; // get static get getServiceRequestStatus => "$_baseUrl/Lookups/GetLookup?lookupEnum=503"; + static get getRepairLocation => "$_baseUrl/Lookups/GetLookup?lookupEnum=504"; static get getPreventiveMaintenanceVisits => "$_baseUrl/return/user/calibrations"; // get static get updatePreventiveMaintenanceVisits => "$_baseUrl/Visit/UpdateVisits"; // get diff --git a/lib/controllers/providers/api/service_requests_provider.dart b/lib/controllers/providers/api/service_requests_provider.dart index bde8b2cf..3d0569ba 100644 --- a/lib/controllers/providers/api/service_requests_provider.dart +++ b/lib/controllers/providers/api/service_requests_provider.dart @@ -281,7 +281,68 @@ class ServiceRequestsProvider extends ChangeNotifier { }) async { Response response; try { - Map body = report.toMap(request); + Map body = { + "id": 0, + "parentWOId": null, + "workOrderNo": "", + "workOrderYear": null, + "workOrderSequennce": null, + "callRequest": { + "id": request.id, + }, + "assetType": report.assetType?.toMap(), + "assignedEmployee": {"id": report.engineer.id, "name": report.engineer.name}, + "visitDate": report.visitDate?.toIso8601String() ?? "", + // "assistantEmployees": [ + // {"id": report.engineer.id, "name": report.engineer.name}, + // ], + "supplier": null, + "vendorTicketNumber": null, + "contactPersonWorkOrders": [ + { + "id": 0, + // "employeeCode": "", + "name": user.userName, + "telephone": user.phoneNumber, + // "job": "", + "email": user.email, + // "land": "", + "contactUserId": user.id, + } + ], + "calllastSituation": report.callLastSituation?.toMap(), + "currentSituation": null, + "repairLocation": report.repairLocation?.toMap(), + "reason": report.reason?.toMap(), + "startofWorkTime": report.timer?.startAt?.toIso8601String() ?? "", + "endofWorkTime": report.timer?.endAt?.toIso8601String() ?? "", + "workingHours": report.timer?.durationInSecond, + "travelingHours": report.travelingHours, + "travelingExpenses": report.travelingExpense ?? 0, + "faultDescription": { + "id": report.faultDescriptionId ?? 0, + "defectName": report.type?.name, + "workPerformed": report.workPreformed, + "estimatedTime": report.operatingHours, + }, + "sparePartsWorkOrders": report.parts + ?.map( + (p) => { + "id": p.id, + "sparePart": {"id": p.reportPartID ?? 0, "partNo": p.code, "partName": p.name}, + "qty": p.quantity + }, + ) + ?.toList(), + "reviewComment": "", + "comment": report.comment, + "attachmentsWorkOrder": request.devicePhotos?.map((e) => {"name": e})?.toList(), + "equipmentStatus": report.status?.toMap(), + "suppEngineerWorkOrders": null, + "engSignature": report.signatureEngineer, + "nurseSignature": report.signatureNurse, + "woParentDto": null, + }; // body["uid"] = user.id; // body["token"] = user.token; response = await ApiManager.instance.post(URLs.createServiceReport, body: body); @@ -299,6 +360,7 @@ class ServiceRequestsProvider extends ChangeNotifier { } return response.statusCode; } catch (error) { + print(error); return -1; } } diff --git a/lib/controllers/providers/api/status_drop_down/report/service_report_repair_location_provider.dart b/lib/controllers/providers/api/status_drop_down/report/service_report_repair_location_provider.dart new file mode 100644 index 00000000..c357a121 --- /dev/null +++ b/lib/controllers/providers/api/status_drop_down/report/service_report_repair_location_provider.dart @@ -0,0 +1,69 @@ +import 'dart:convert'; + +import 'package:flutter/cupertino.dart'; +import 'package:flutter/material.dart'; +import 'package:http/http.dart'; +import 'package:test_sa/controllers/api_routes/api_manager.dart'; +import 'package:test_sa/controllers/api_routes/urls.dart'; +import 'package:test_sa/models/lookup.dart'; +import 'package:test_sa/models/user.dart'; + +class ServiceReportRepairLocationProvider extends ChangeNotifier { + //reset provider data + void reset() { + _reasons = null; + _stateCode = null; + } + + // state code of current request to defied error message + // like 400 customer request failed + // 500 service not available + int _stateCode; + int get stateCode => _stateCode; + + // contain user data + // when user not login or register _user = null + List _reasons; + List get reasons => _reasons; + + // when categories in-process _loading = true + // done _loading = true + // failed _loading = false + bool _loading; + bool get isLoading => _loading; + set isLoading(bool isLoading) { + _loading = isLoading; + notifyListeners(); + } + + /// return -2 if request in progress + /// return -1 if error happen when sending request + /// 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 getTypes({String host, User user}) async { + if (_loading == true) return -2; + _loading = true; + notifyListeners(); + Response response; + try { + response = await ApiManager.instance.get( + URLs.getRepairLocation, + ); + _stateCode = response.statusCode; + if (response.statusCode >= 200 && response.statusCode < 300) { + // client's request was successfully received + List categoriesListJson = json.decode(response.body)["data"]; + _reasons = categoriesListJson.map((type) => Lookup.fromJson(type)).toList(); + } + _loading = false; + notifyListeners(); + return response.statusCode; + } catch (error) { + _loading = false; + _stateCode = -1; + notifyListeners(); + return -1; + } + } +} diff --git a/lib/main.dart b/lib/main.dart index 60cea674..eef23138 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -51,6 +51,7 @@ import 'controllers/providers/api/preventive_maintenance_visits_provider.dart'; import 'controllers/providers/api/status_drop_down/pentry/pentry_status_provider.dart'; import 'controllers/providers/api/status_drop_down/report/service_report_last_calls_provider.dart'; import 'controllers/providers/api/status_drop_down/report/service_report_reasons_provider.dart'; +import 'controllers/providers/api/status_drop_down/report/service_report_repair_location_provider.dart'; import 'controllers/providers/api/status_drop_down/report/service_report_status_provider.dart'; import 'controllers/providers/api/status_drop_down/report/service_report_types_provider.dart'; import 'controllers/providers/api/status_drop_down/report/service_types_provider.dart'; @@ -115,6 +116,7 @@ class MyApp extends StatelessWidget { ChangeNotifierProvider(create: (_) => EngineersProvider()), ChangeNotifierProvider(create: (_) => ServiceLoanAvailabilityProvider()), ChangeNotifierProvider(create: (_) => ServiceFirstActionProvider()), + ChangeNotifierProvider(create: (_) => ServiceReportRepairLocationProvider()), ], child: GestureDetector( onTap: () { diff --git a/lib/models/service_report.dart b/lib/models/service_report.dart index 8abb1303..3e471b7a 100644 --- a/lib/models/service_report.dart +++ b/lib/models/service_report.dart @@ -15,6 +15,7 @@ class ServiceReport { DateTime endDate; Lookup assetType; Lookup callLastSituation; + Lookup repairLocation; Engineer engineer; Lookup status; Lookup type; @@ -33,36 +34,42 @@ class ServiceReport { TimerModel timer; String signatureNurse; String signatureEngineer; + String comment; Uint8List localNurseSignature; Uint8List localEngineerSignature; + int travelingExpense; - ServiceReport( - {this.id, - this.visitDate, - this.endDate, - this.assetType, - this.status, - this.type, - this.faultDescriptionId, - //this.workHours, - this.travelingHours, - this.parts, - this.engineer, - this.workPreformed, - this.reason, - this.operatingHours, - this.callLastSituation, - this.jobSheetNumber, - this.image, - this.device, - this.invoiceCode, - this.invoiceNumber, - this.quantity = "1", - this.timer, - this.signatureNurse, - this.signatureEngineer, - this.localNurseSignature, - this.localEngineerSignature}); + ServiceReport({ + this.id, + this.visitDate, + this.endDate, + this.assetType, + this.status, + this.type, + this.faultDescriptionId, + //this.workHours, + this.travelingHours, + this.parts, + this.engineer, + this.workPreformed, + this.reason, + this.operatingHours, + this.callLastSituation, + this.jobSheetNumber, + this.image, + this.device, + this.invoiceCode, + this.invoiceNumber, + this.quantity = "1", + this.timer, + this.signatureNurse, + this.signatureEngineer, + this.localNurseSignature, + this.localEngineerSignature, + this.comment, + this.repairLocation, + this.travelingExpense, + }); Map toMap(ServiceRequest request) { Map _map = {}; @@ -98,6 +105,7 @@ class ServiceReport { _map["callRequest"]["asset"]["invoiceNumber"] = invoiceNumber; } _map["AssignedEmployee"] = engineer?.toMap(); + _map["repairLocation"] = repairLocation?.toMap(); //if(quantity != null && quantity.isNotEmpty) _map["qty"] = quantity; //if(endDate != null) _map["end_date"] = (endDate.millisecondsSinceEpoch ~/ 1000).toString(); if (reason != null) _map["reason"] = reason.toMap(); @@ -113,6 +121,8 @@ class ServiceReport { } _map["nurseSignature"] = signatureNurse; _map["engSignature"] = signatureEngineer; + _map["comment"] = comment; + _map["travelingExpense"] = travelingExpense; return _map; } diff --git a/lib/models/subtitle.dart b/lib/models/subtitle.dart index 1a05ab65..afbc42e2 100644 --- a/lib/models/subtitle.dart +++ b/lib/models/subtitle.dart @@ -217,6 +217,10 @@ class Subtitle { String alert; String comment; String updateServiceRequest; + String repairLocation; + String travelingExpense; + String startDate; + String endDate; void setIssues(List issues) { issues.clear(); @@ -409,6 +413,10 @@ class Subtitle { @required this.duplicateAlert, @required this.duplicateAlertMessage, @required this.duplicateRequest, + @required this.repairLocation, + @required this.travelingExpense, + @required this.startDate, + @required this.endDate, }); factory Subtitle.fromJson(Map parsedJson) { @@ -594,6 +602,10 @@ class Subtitle { duplicateAlert: parsedJson["duplicateAlert"], duplicateAlertMessage: parsedJson["duplicateAlertMessage"], duplicateRequest: parsedJson["duplicateRequest"], + repairLocation: parsedJson["repairLocation"], + travelingExpense: parsedJson["travelingExpense"], + startDate: parsedJson["startDate"], + endDate: parsedJson["endDate"], ); } } diff --git a/lib/views/pages/user/requests/report/create_service_report.dart b/lib/views/pages/user/requests/report/create_service_report.dart index f077fbd7..5bd983ab 100644 --- a/lib/views/pages/user/requests/report/create_service_report.dart +++ b/lib/views/pages/user/requests/report/create_service_report.dart @@ -2,7 +2,6 @@ import 'dart:convert'; import 'dart:io'; import 'package:flutter/material.dart'; -import 'package:flutter/rendering.dart'; import 'package:fluttertoast/fluttertoast.dart'; import 'package:provider/provider.dart'; import 'package:test_sa/controllers/api_routes/http_status_manger.dart'; @@ -15,7 +14,6 @@ import 'package:test_sa/controllers/validator/validator.dart'; import 'package:test_sa/models/part.dart'; import 'package:test_sa/models/service_report.dart'; import 'package:test_sa/models/service_request/service_request.dart'; -import 'package:test_sa/models/lookup.dart'; import 'package:test_sa/models/subtitle.dart'; import 'package:test_sa/views/app_style/colors.dart'; import 'package:test_sa/views/app_style/sizing.dart'; @@ -33,22 +31,22 @@ import 'package:test_sa/views/widgets/status/employee/engineers_mune.dart'; import 'package:test_sa/views/widgets/status/report/service_report_last_call.dart'; import 'package:test_sa/views/widgets/status/report/service_report_reasons.dart'; import 'package:test_sa/views/widgets/status/report/service_report_status.dart'; -import 'package:test_sa/views/widgets/status/report/service_report_type.dart'; import 'package:test_sa/views/widgets/status/report/service_status.dart'; import 'package:test_sa/views/widgets/timer/app_timer.dart'; import 'package:test_sa/views/widgets/titles/app_sub_title.dart'; + +import '../../../../widgets/status/report/service_report_repair_location.dart'; + class CreateServiceReport extends StatefulWidget { static final String id = "/create-service-report"; - final ServiceRequest request ; + final ServiceRequest request; const CreateServiceReport({Key key, this.request}) : super(key: key); @override _CreateServiceReportState createState() => _CreateServiceReportState(); } -class _CreateServiceReportState extends State with TickerProviderStateMixin{ - - +class _CreateServiceReportState extends State with TickerProviderStateMixin { UserProvider _userProvider; SettingProvider _settingProvider; ServiceRequestsProvider _serviceRequestsProvider; @@ -67,11 +65,10 @@ class _CreateServiceReportState extends State with TickerPr @override void initState() { _serviceReport = ServiceReport( - visitDate: DateTime.now(), - //type: const Lookup(value: 2), - device: widget.request.device, - parts: [] - ); + visitDate: DateTime.now(), + //type: const Lookup(value: 2), + device: widget.request.device, + parts: []); super.initState(); } @@ -81,6 +78,7 @@ class _CreateServiceReportState extends State with TickerPr _workPreformedController.dispose(); super.dispose(); } + @override Widget build(BuildContext context) { _userProvider = Provider.of(context); @@ -102,52 +100,54 @@ class _CreateServiceReportState extends State with TickerPr ListView( children: [ //AppNameBar(), - const SizedBox(height: 16,), + const SizedBox( + height: 16, + ), Center( child: Padding( padding: const EdgeInsets.all(8.0), child: Text( _subtitle.newServiceReport, - style: Theme.of(context).textTheme.headline5.copyWith( - color: AColors.cyan, - fontSize: 28, - fontWeight: FontWeight.bold - ), + style: Theme.of(context).textTheme.headline5.copyWith(color: AColors.cyan, fontSize: 28, fontWeight: FontWeight.bold), ), ), ), Container( padding: const EdgeInsets.symmetric(horizontal: 16), - margin: const EdgeInsets.symmetric(horizontal: 16,vertical: 16), - decoration: BoxDecoration( + margin: const EdgeInsets.symmetric(horizontal: 16, vertical: 16), + decoration: BoxDecoration(color: AColors.grey, borderRadius: BorderRadius.circular(AppStyle.getBorderRadius(context)), boxShadow: [ + const BoxShadow( color: AColors.grey, - borderRadius: BorderRadius.circular(AppStyle.getBorderRadius(context)), - boxShadow: [ - const BoxShadow( - color: AColors.grey, - offset: Offset(0,-1), - ) - ] - ), + offset: Offset(0, -1), + ) + ]), child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ - const SizedBox(height: 8,), + const SizedBox( + height: 8, + ), Wrap( spacing: 10, children: [ - ASubTitle("${_subtitle.callId}: ${widget.request.requestCode}",font: 14,), - widget.request.deviceSerialNumber == null ? const SizedBox(): - ASubTitle("${_subtitle.deviceSN}: ${widget.request.deviceSerialNumber}",font: 14,), + ASubTitle( + "${_subtitle.callId}: ${widget.request.requestCode}", + font: 14, + ), + widget.request.deviceSerialNumber == null + ? const SizedBox() + : ASubTitle( + "${_subtitle.deviceSN}: ${widget.request.deviceSerialNumber}", + font: 14, + ), Text( "${_subtitle.customer}: ${widget.request.hospitalName}", style: Theme.of(context).textTheme.subtitle1.copyWith( - fontWeight: FontWeight.bold, - fontSize: 12, - ), + fontWeight: FontWeight.bold, + fontSize: 12, + ), textScaleFactor: AppStyle.getScaleFactor(context), ) - ], ), const Divider(), @@ -181,9 +181,12 @@ class _CreateServiceReportState extends State with TickerPr crossAxisAlignment: CrossAxisAlignment.start, children: [ ASubTitle(_subtitle.visitDate), - _validate && _serviceReport.visitDate == null ? - ASubTitle(_subtitle.requiredWord,color: Colors.red,): - const SizedBox.shrink(), + _validate && _serviceReport.visitDate == null + ? ASubTitle( + _subtitle.requiredWord, + color: Colors.red, + ) + : const SizedBox.shrink(), Row( children: [ Expanded( @@ -191,7 +194,7 @@ class _CreateServiceReportState extends State with TickerPr date: _serviceReport.visitDate, from: DateTime.now().subtract(const Duration(days: 365)), to: DateTime.now().add(const Duration(days: 365)), - onDatePicker: (date){ + onDatePicker: (date) { _serviceReport.visitDate = date; setState(() {}); }, @@ -202,10 +205,11 @@ class _CreateServiceReportState extends State with TickerPr ], ), ), - ], ), - const SizedBox(height: 8,), + const SizedBox( + height: 8, + ), // device sn Visibility( visible: widget.request.deviceSerialNumber == null, @@ -213,33 +217,47 @@ class _CreateServiceReportState extends State with TickerPr crossAxisAlignment: CrossAxisAlignment.start, children: [ ASubTitle(_subtitle.deviceSN), - _validate && _serviceReport.device?.id == null ? - ASubTitle(_subtitle.requiredWord,color: Colors.red,): - const SizedBox.shrink(), + _validate && _serviceReport.device?.id == null + ? ASubTitle( + _subtitle.requiredWord, + color: Colors.red, + ) + : const SizedBox.shrink(), AutoCompleteDeviceField( hospitalId: widget.request.hospitalId, initialValue: _serviceReport.device, - onPick: (id){ + onPick: (id) { _serviceReport.device.id = id; }, ), - const SizedBox(height: 8,), + const SizedBox( + height: 8, + ), ], ), ), - const SizedBox(height: 8,), + const SizedBox( + height: 8, + ), ASubTitle(_subtitle.serviceType), - _validate && _serviceReport.assetType == null ? - ASubTitle(_subtitle.requiredWord,color: Colors.red,): - const SizedBox.shrink(), - const SizedBox(height: 4,), + _validate && _serviceReport.assetType == null + ? ASubTitle( + _subtitle.requiredWord, + color: Colors.red, + ) + : const SizedBox.shrink(), + const SizedBox( + height: 4, + ), ServiceAssetTypeMenu( initialValue: _serviceReport.assetType, - onSelect: (status){ + onSelect: (status) { _serviceReport.assetType = status; }, ), - const SizedBox(height: 8,), + const SizedBox( + height: 8, + ), // Report status and Service Type Row( children: [ @@ -249,40 +267,51 @@ class _CreateServiceReportState extends State with TickerPr crossAxisAlignment: CrossAxisAlignment.start, children: [ ASubTitle(_subtitle.reportStatus), - _validate && _serviceReport.status == null ? - ASubTitle(_subtitle.requiredWord,color: Colors.red,): - const SizedBox.shrink(), - const SizedBox(height: 4,), + _validate && _serviceReport.status == null + ? ASubTitle( + _subtitle.requiredWord, + color: Colors.red, + ) + : const SizedBox.shrink(), + const SizedBox( + height: 4, + ), ServiceReportStatusMenu( report: _serviceReport, - onSelect: (status){ + onSelect: (status) { _serviceReport.status = status; }, ), ], ), ), - const SizedBox(width: 8,), + const SizedBox( + width: 8, + ), // Provider.of(context).isLoading == null // ? const SizedBox.shrink(): // Call's last Situation Consumer( builder: (_, provider, __) { - if(provider.isLoading == null) return const SizedBox.shrink(); - return Expanded( + if (provider.isLoading == null) return const SizedBox.shrink(); + return Expanded( child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ ASubTitle(_subtitle.callLastSituation), - _validate && _serviceReport.callLastSituation == null ? - ASubTitle(_subtitle.requiredWord,color: Colors.red,): - const SizedBox.shrink(), - const SizedBox(height: 4,), + _validate && _serviceReport.callLastSituation == null + ? ASubTitle( + _subtitle.requiredWord, + color: Colors.red, + ) + : const SizedBox.shrink(), + const SizedBox( + height: 4, + ), ServiceReportLastCallsMenu( report: _serviceReport, - onSelect: (status){ - if(status?.value == 12 - || _serviceReport.callLastSituation?.value == 12){ + onSelect: (status) { + if (status?.value == 12 || _serviceReport.callLastSituation?.value == 12) { _serviceReport.callLastSituation = status; setState(() {}); } else { @@ -297,70 +326,83 @@ class _CreateServiceReportState extends State with TickerPr ), ], ), - SizedBox(height: 8 * AppStyle.getScaleFactor(context),), - const ASubTitle("Assign Employee"), - const SizedBox(height: 8,), - _validate && _serviceReport.engineer == null ? - ASubTitle(_subtitle.requiredWord,color: Colors.red,): - const SizedBox.shrink(), - const SizedBox(height: 4,), + SizedBox( + height: 8 * AppStyle.getScaleFactor(context), + ), + const ASubTitle("Assigned Employee"), + const SizedBox( + height: 8, + ), + _validate && _serviceReport.engineer == null + ? ASubTitle( + _subtitle.requiredWord, + color: Colors.red, + ) + : const SizedBox.shrink(), + const SizedBox( + height: 4, + ), EngineersMenu( initialValue: _serviceReport.engineer, - onSelect: (engineer){ + onSelect: (engineer) { _serviceReport.engineer = engineer; }, ), - const SizedBox(height: 8,), + const SizedBox( + height: 8, + ), // invoice number & code - _serviceReport.callLastSituation?.id != 12 ? const SizedBox.shrink(): - Row( - children: [ - Expanded( - child: Column( - crossAxisAlignment: CrossAxisAlignment.start, + _serviceReport.callLastSituation?.id != 12 + ? const SizedBox.shrink() + : Row( children: [ - ASubTitle(_subtitle.invoiceNumber), - const SizedBox(height: 8,), - ATextFormField( - initialValue: _serviceReport?.invoiceNumber, - textAlign: TextAlign.center, - style: Theme.of(context).textTheme.subtitle1, - validator: (value) => - Validator.hasValue(value) - ? null : _subtitle.requiredWord, - textInputType: TextInputType.number, - onSaved: (value){ - _serviceReport.invoiceNumber = value; - }, + Expanded( + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + ASubTitle(_subtitle.invoiceNumber), + const SizedBox( + height: 8, + ), + ATextFormField( + initialValue: _serviceReport?.invoiceNumber, + textAlign: TextAlign.center, + style: Theme.of(context).textTheme.subtitle1, + validator: (value) => Validator.hasValue(value) ? null : _subtitle.requiredWord, + textInputType: TextInputType.number, + onSaved: (value) { + _serviceReport.invoiceNumber = value; + }, + ), + ], + ), ), - ], - ), - ), - const SizedBox(width: 8,), - Expanded( - child: Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - ASubTitle(_subtitle.invoiceCode), - const SizedBox(height: 4,), - ATextFormField( - initialValue: _serviceReport?.invoiceCode, - textAlign: TextAlign.center, - style: Theme.of(context).textTheme.subtitle1, - validator: (value) => - Validator.hasValue(value) - ? null : _subtitle.requiredWord, - textInputType: TextInputType.text, - onSaved: (value){ - _serviceReport.invoiceCode = value; - }, + const SizedBox( + width: 8, + ), + Expanded( + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + ASubTitle(_subtitle.invoiceCode), + const SizedBox( + height: 4, + ), + ATextFormField( + initialValue: _serviceReport?.invoiceCode, + textAlign: TextAlign.center, + style: Theme.of(context).textTheme.subtitle1, + validator: (value) => Validator.hasValue(value) ? null : _subtitle.requiredWord, + textInputType: TextInputType.text, + onSaved: (value) { + _serviceReport.invoiceCode = value; + }, + ), + ], + ), ), ], ), - ), - ], - ), - // const SizedBox(height: 8,), // Row( // children: [ @@ -421,7 +463,9 @@ class _CreateServiceReportState extends State with TickerPr // ), // const SizedBox(height: 8,), - const SizedBox(height: 8,), + const SizedBox( + height: 8, + ), Row( children: [ // reasons @@ -430,17 +474,21 @@ class _CreateServiceReportState extends State with TickerPr crossAxisAlignment: CrossAxisAlignment.start, children: [ ASubTitle(_subtitle.reasons), - const SizedBox(height: 4,), + const SizedBox( + height: 4, + ), ServiceReportReasonsMenu( initialValue: _serviceReport.reason, - onSelect: (status){ + onSelect: (status) { _serviceReport.reason = status; }, ), ], ), ), - const SizedBox(width: 8,), + const SizedBox( + width: 8, + ), Expanded( child: Column( crossAxisAlignment: CrossAxisAlignment.start, @@ -449,8 +497,8 @@ class _CreateServiceReportState extends State with TickerPr AMiniOneImagePicker( //error: _validate && _serviceReport.image == null, image: _image, - onPick: (image){ - _image =image; + onPick: (image) { + _image = image; _serviceReport.image = "${image.path.split("/").last}|${base64Encode(image.readAsBytesSync())}"; }, ), @@ -459,7 +507,49 @@ class _CreateServiceReportState extends State with TickerPr ), ], ), - const SizedBox(height: 8,), + const SizedBox( + height: 8, + ), + ASubTitle(_subtitle.repairLocation), + const SizedBox( + height: 4, + ), + ServiceReportRepairLocation( + initialValue: _serviceReport.repairLocation, + onSelect: (status) { + _serviceReport.repairLocation = status; + }, + ), + const SizedBox( + height: 16, + ), + ATextFormField( + initialValue: _serviceReport?.travelingExpense?.toString(), + hintText: _subtitle.travelingExpense, + textAlign: TextAlign.center, + style: Theme.of(context).textTheme.titleMedium, + textInputType: TextInputType.number, + onSaved: (value) { + _serviceReport.travelingExpense = int.tryParse(value) ?? 0; + }, + ), + const SizedBox( + height: 8, + ), + ATextFormField( + initialValue: _serviceReport?.comment, + hintText: _subtitle.comment, + textAlign: TextAlign.center, + style: Theme.of(context).textTheme.titleMedium, + textInputType: TextInputType.multiline, + onSaved: (value) { + _serviceReport.comment = value; + }, + ), + + const SizedBox( + height: 8, + ), // Traveling Hours & Working Hours Row( children: [ @@ -468,13 +558,15 @@ class _CreateServiceReportState extends State with TickerPr crossAxisAlignment: CrossAxisAlignment.start, children: [ ASubTitle(_subtitle.workingHours), - const SizedBox(height: 8,), + const SizedBox( + height: 8, + ), Row( children: [ Expanded( child: AppTimer( timer: _serviceReport.timer, - onChange: (timer) async{ + onChange: (timer) async { _serviceReport.timer = timer; return true; }, @@ -523,7 +615,9 @@ class _CreateServiceReportState extends State with TickerPr // ), ], ), - const SizedBox(height: 8,), + const SizedBox( + height: 8, + ), // Operating Hours and Job Sheet Number // Row( // children: [ @@ -570,30 +664,39 @@ class _CreateServiceReportState extends State with TickerPr // ), // ], // ), - //const SizedBox(height: 8,), - const SizedBox(height: 8,), + const SizedBox( + height: 8, + ), const ASubTitle("Nurse Signature"), ESignature( oldSignature: _serviceReport.signatureNurse, newSignature: _serviceReport.localNurseSignature, - onSaved: (signature){ - if(signature == null || signature.isEmpty) {return;} + onSaved: (signature) { + if (signature == null || signature.isEmpty) { + return; + } _serviceReport.localNurseSignature = signature; _serviceReport.signatureNurse = "${DateTime.now().toIso8601String()}.png|${base64Encode(signature)}"; }, ), - const SizedBox(height: 8,), + const SizedBox( + height: 8, + ), const ASubTitle("Engineer Signature"), ESignature( oldSignature: _serviceReport.signatureEngineer, newSignature: _serviceReport.localNurseSignature, - onSaved: (signature){ - if(signature == null || signature.isEmpty) {return;} + onSaved: (signature) { + if (signature == null || signature.isEmpty) { + return; + } _serviceReport.localNurseSignature = signature; _serviceReport.signatureEngineer = "${DateTime.now().toIso8601String()}.png|${base64Encode(signature)}"; }, ), - const SizedBox(height: 8,), + const SizedBox( + height: 8, + ), // Part Number and Quantity Row( children: [ @@ -603,45 +706,49 @@ class _CreateServiceReportState extends State with TickerPr crossAxisAlignment: CrossAxisAlignment.start, children: [ ASubTitle(_subtitle.partNumber), - _validate && _serviceReport.parts == null ? - ASubTitle(_subtitle.requiredWord,color: Colors.red,): - const SizedBox.shrink(), - const SizedBox(height: 4,), + _validate && _serviceReport.parts == null + ? ASubTitle( + _subtitle.requiredWord, + color: Colors.red, + ) + : const SizedBox.shrink(), + const SizedBox( + height: 4, + ), AutoCompletePartsField( - onPick: (part){ + onPick: (part) { _serviceReport.parts.add(part); }, ), ], ), ), - ], ), - SizedBox(height: 8*AppStyle.getScaleFactor(context),), + SizedBox( + height: 8 * AppStyle.getScaleFactor(context), + ), Row( children: [ - Expanded(flex:3,child: Text(_subtitle.number)), - Expanded(flex: 1,child: Text(_subtitle.quantity)), + Expanded(flex: 3, child: Text(_subtitle.number)), + Expanded(flex: 1, child: Text(_subtitle.quantity)), ], ), Column( - children: List.generate( - _serviceReport.parts.length, - (index) { - Part _part = _serviceReport.parts[index]; - return PartItem( - part: _part, - onDelete: (part){ - _serviceReport.parts.remove(part); - setState(() {}); - }, - ); - } - ), + children: List.generate(_serviceReport.parts.length, (index) { + Part _part = _serviceReport.parts[index]; + return PartItem( + part: _part, + onDelete: (part) { + _serviceReport.parts.remove(part); + setState(() {}); + }, + ); + }), + ), + const SizedBox( + height: 16, ), - const SizedBox(height: 16,), - ], ), ), @@ -651,47 +758,48 @@ class _CreateServiceReportState extends State with TickerPr text: _subtitle.submit, onPressed: () async { _validate = true; - if(!_formKey.currentState.validate()){ + print(1); + if (!_formKey.currentState.validate()) { + print(2); setState(() {}); return; } - if(!_serviceReport.validate()) return; + print(3); + if (!_serviceReport.validate()) return; + print(4); _formKey.currentState.save(); - - _isLoading =true; + print(5); + _isLoading = true; setState(() {}); - - int status = await _serviceRequestsProvider.createServiceReport( user: _userProvider.user, host: _settingProvider.host, report: _serviceReport, - request: widget.request + request: widget.request, ); - _isLoading =false; + print(6); + print(status); + _isLoading = false; setState(() {}); - if(status >= 200 && status < 300){ + if (status >= 200 && status < 300) { Fluttertoast.showToast( - msg: _subtitle.requestCompleteSuccessfully, + msg: _subtitle.requestCompleteSuccessfully, ); Navigator.of(context).pop(); Navigator.of(context).pop(); - }else{ - String errorMessage = HttpStatusManger.getStatusMessage( - status: status, subtitle: _subtitle); - ScaffoldMessenger.of(context).showSnackBar( - SnackBar( - content: Text( - errorMessage - ), - ) - ); + } else { + String errorMessage = HttpStatusManger.getStatusMessage(status: status, subtitle: _subtitle); + ScaffoldMessenger.of(context).showSnackBar(SnackBar( + content: Text(errorMessage), + )); } }, ), ), - const SizedBox(height: 300,) + const SizedBox( + height: 300, + ) ], ), const ABackButton(), diff --git a/lib/views/widgets/status/report/service_report_repair_location.dart b/lib/views/widgets/status/report/service_report_repair_location.dart new file mode 100644 index 00000000..4892a3a7 --- /dev/null +++ b/lib/views/widgets/status/report/service_report_repair_location.dart @@ -0,0 +1,37 @@ +import 'package:flutter/material.dart'; +import 'package:provider/provider.dart'; +import 'package:test_sa/controllers/providers/api/status_drop_down/report/service_report_repair_location_provider.dart'; +import 'package:test_sa/controllers/providers/api/user_provider.dart'; +import 'package:test_sa/controllers/providers/settings/setting_provider.dart'; +import 'package:test_sa/models/lookup.dart'; +import 'package:test_sa/views/widgets/loaders/loading_manager.dart'; +import 'package:test_sa/views/widgets/status/single_status_menu.dart'; + +class ServiceReportRepairLocation extends StatelessWidget { + final Lookup initialValue; + final Function(Lookup) onSelect; + + const ServiceReportRepairLocation({Key key, this.onSelect, this.initialValue}) : super(key: key); + @override + Widget build(BuildContext context) { + SettingProvider _settingProvider = Provider.of(context); + UserProvider _userProvider = Provider.of(context); + ServiceReportRepairLocationProvider _menuProvider = Provider.of(context); + return LoadingManager( + isLoading: _menuProvider.isLoading, + isFailedLoading: _menuProvider.reasons == null, + stateCode: _menuProvider.stateCode, + onRefresh: () async { + _menuProvider.reset(); + await _menuProvider.getTypes( + user: _userProvider.user, + host: _settingProvider.host, + ); + }, + child: SingleStatusMenu( + initialStatus: initialValue, + statuses: _menuProvider.reasons, + onSelect: onSelect, + )); + } +} From 4e89566d1fe12b0ffe40795f3f85d91a32019126 Mon Sep 17 00:00:00 2001 From: nextwo <1234> Date: Wed, 31 May 2023 12:05:09 +0300 Subject: [PATCH 040/181] implement searchWorkOrders api and edit on ui --- assets/subtitles/ar_subtitle.json | 4 +--- assets/subtitles/en_subtitle.json | 2 -- lib/models/user.dart | 9 +++----- .../report/future_service_report.dart | 21 ++++++++----------- 4 files changed, 13 insertions(+), 23 deletions(-) diff --git a/assets/subtitles/ar_subtitle.json b/assets/subtitles/ar_subtitle.json index cf09ef87..885647d2 100644 --- a/assets/subtitles/ar_subtitle.json +++ b/assets/subtitles/ar_subtitle.json @@ -137,7 +137,6 @@ "workPerformed": "العمل انجز", "actualDate": "تاريخ الفعلي", - "done": "تم الانتهاء", "expectDate": "التاريخ المتوقع", "images": "الصور", "imagesRequired": "الصور مطلوبة", @@ -195,8 +194,7 @@ "assetName": "اسم الاصل", "site": "الموقع", "maintenanceSituation": "موقع الصيانه", - "currentSituation": "الموقع الحالي" - "duplicateRequest": "تكرار الطلب", + "currentSituation": "الموقع الحالي", "comment" : "تعليق", "updateServiceRequest" : "تعديل طلب الخدمة" } \ No newline at end of file diff --git a/assets/subtitles/en_subtitle.json b/assets/subtitles/en_subtitle.json index 068fa16c..36162c41 100644 --- a/assets/subtitles/en_subtitle.json +++ b/assets/subtitles/en_subtitle.json @@ -136,7 +136,6 @@ "workPerformed": "Work Performed", "actualDate": "Actual Date", - "done": "Done", "expectDate": "Expect Date", "images": "Images", "imagesRequired": "Images Required", @@ -198,6 +197,5 @@ "duplicateRequest": "Duplicate Request", "comment" : "Comment", "updateServiceRequest" : "Update Service Request" - "duplicateRequest": "Duplicate Request" } \ No newline at end of file diff --git a/lib/models/user.dart b/lib/models/user.dart index 7cfcb713..880e4fce 100644 --- a/lib/models/user.dart +++ b/lib/models/user.dart @@ -76,7 +76,7 @@ class User { } UsersTypes get type { - switch (userRoles.first.name) { + switch (userRoles?.first?.name) { case "Engineer": return UsersTypes.engineer; case "Hospital": @@ -157,11 +157,8 @@ class User { password = json['password']; token = json['token']; roles = json['roles']; - if (json['userRoles'] != null) { - userRoles = []; - json['userRoles'].forEach((v) { - userRoles.add(UserRoles.fromJson(v)); - }); + if (userRoles != null) { + json['userRoles'] = userRoles.map((v) => v.toJson()).toList(); } tokenlife = json['tokenlife']; isAuthenticated = json['isAuthenticated']; diff --git a/lib/views/pages/user/requests/report/future_service_report.dart b/lib/views/pages/user/requests/report/future_service_report.dart index 15c792ea..1a987b0d 100644 --- a/lib/views/pages/user/requests/report/future_service_report.dart +++ b/lib/views/pages/user/requests/report/future_service_report.dart @@ -12,18 +12,18 @@ import 'package:test_sa/views/widgets/loaders/app_loading.dart'; import 'package:test_sa/views/widgets/loaders/failed_loading.dart'; import 'edit_service_report.dart'; + class FutureServiceReport extends StatefulWidget { final ServiceRequest request; final SearchWorkOrders workOrder; - const FutureServiceReport({Key key, this.request,this.workOrder}) : super(key: key); + const FutureServiceReport({Key key, this.request, this.workOrder}) : super(key: key); @override _FutureServiceReportState createState() => _FutureServiceReportState(); } class _FutureServiceReportState extends State { - UserProvider _userProvider; SettingProvider _settingProvider; @override @@ -33,19 +33,16 @@ class _FutureServiceReportState extends State { Subtitle _subtitle = AppLocalization.of(context).subtitle; return Scaffold( body: FutureBuilder( - future: ServiceRequestsProvider().getSingleServiceReport( - reportId: widget.workOrder.id, - user: _userProvider.user, - host: _settingProvider.host, - subtitle: _subtitle - ), - builder: (BuildContext context, AsyncSnapshot snapshot){ - if(snapshot.hasError) + future: ServiceRequestsProvider().getSingleServiceReport(reportId: widget.workOrder.id, user: _userProvider.user, host: _settingProvider.host, subtitle: _subtitle), + builder: (BuildContext context, AsyncSnapshot snapshot) { + if (snapshot.hasError) return FailedLoading( message: snapshot.error.toString(), - onReload: (){setState(() {});}, + onReload: () { + setState(() {}); + }, ); - if(snapshot.hasData){ + if (snapshot.hasData) { return EditServiceReport( report: snapshot.data, request: widget.request, From 5f7bc0cf6e6188bdae87d35f5e8f3096b0aeed49 Mon Sep 17 00:00:00 2001 From: zaid_daoud Date: Wed, 31 May 2023 15:18:23 +0300 Subject: [PATCH 041/181] Change service last calls API --- lib/controllers/api_routes/urls.dart | 2 +- .../service_report_last_calls_provider.dart | 31 +- .../report/create_service_report.dart | 1 + .../requests/report/edit_service_report.dart | 442 ++++++++++-------- .../status/report/service_report_status.dart | 36 +- 5 files changed, 296 insertions(+), 216 deletions(-) diff --git a/lib/controllers/api_routes/urls.dart b/lib/controllers/api_routes/urls.dart index d641e31f..643efb3e 100644 --- a/lib/controllers/api_routes/urls.dart +++ b/lib/controllers/api_routes/urls.dart @@ -53,7 +53,7 @@ class URLs { static get getServiceReportReasons => "$_baseUrl/Lookups/GetLookup?lookupEnum=522"; // get static get getServiceReportTypes => "$_baseUrl/Lookups/GetLookup?lookupEnum=501"; // get static get getServiceReportStatus => "$_baseUrl/Lookups/GetLookup?lookupEnum=521"; // get - static get getServiceReportLastCalls => "$_baseUrl/Lookups/GetLookup?lookupEnum=520"; // get + static get getServiceReportLastCalls => "$_baseUrl/WorkOrder/GetLookupCallLastSituationBasedOnCase"; // get static get getAssetTypes => "$_baseUrl/Lookups/GetLookup?lookupEnum=28"; // get static get getPartNumber => "$_baseUrl/PartCatalog/GetPartAutoComplete"; // get static get getServiceReportPriority => "$_baseUrl/Lookups/GetLookup?lookupEnum=602"; // get diff --git a/lib/controllers/providers/api/status_drop_down/report/service_report_last_calls_provider.dart b/lib/controllers/providers/api/status_drop_down/report/service_report_last_calls_provider.dart index 59fc821a..a6f39ab8 100644 --- a/lib/controllers/providers/api/status_drop_down/report/service_report_last_calls_provider.dart +++ b/lib/controllers/providers/api/status_drop_down/report/service_report_last_calls_provider.dart @@ -8,10 +8,9 @@ import 'package:test_sa/controllers/api_routes/urls.dart'; import 'package:test_sa/models/lookup.dart'; import 'package:test_sa/models/user.dart'; -class ServiceReportLastCallsProvider extends ChangeNotifier{ - +class ServiceReportLastCallsProvider extends ChangeNotifier { //reset provider data - void reset(){ + void reset() { _calls = null; _loading = null; _stateCode = null; @@ -33,7 +32,7 @@ class ServiceReportLastCallsProvider extends ChangeNotifier{ // failed _loading = false bool _loading; bool get isLoading => _loading; - set isLoading(bool isLoading){ + set isLoading(bool isLoading) { _loading = isLoading; notifyListeners(); } @@ -43,16 +42,22 @@ class ServiceReportLastCallsProvider 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 getCalls ({String host,User user,int serviceStatus}) async { - if(_loading == true) - return -2; + Future getCalls({ + String host, + User user, + int serviceStatus, + String woId, + int id, + String typeName, + }) async { + if (_loading == true) return -2; _loading = true; notifyListeners(); Response response; - try{ + try { // todo request new api from backend to make filter work response = await ApiManager.instance.get( - URLs.getServiceReportLastCalls, + "${URLs.getServiceReportLastCalls}?parentWOId=$woId&isAdd=true&id=${id ?? 0}&typeTransaction=$typeName", ); // response = await get( // Uri.parse( @@ -61,7 +66,7 @@ class ServiceReportLastCallsProvider extends ChangeNotifier{ // ), // ); _stateCode = response.statusCode; - if(response.statusCode >= 200 && response.statusCode < 300) { + if (response.statusCode >= 200 && response.statusCode < 300) { // client's request was successfully received List categoriesListJson = json.decode(response.body)["data"]; _calls = categoriesListJson.map((type) => Lookup.fromJson(type)).toList(); @@ -69,13 +74,11 @@ class ServiceReportLastCallsProvider extends ChangeNotifier{ _loading = false; notifyListeners(); return response.statusCode; - } catch(error) { + } catch (error) { _loading = false; _stateCode = -1; notifyListeners(); return -1; } - } - -} \ No newline at end of file +} diff --git a/lib/views/pages/user/requests/report/create_service_report.dart b/lib/views/pages/user/requests/report/create_service_report.dart index 5bd983ab..101be5b2 100644 --- a/lib/views/pages/user/requests/report/create_service_report.dart +++ b/lib/views/pages/user/requests/report/create_service_report.dart @@ -278,6 +278,7 @@ class _CreateServiceReportState extends State with TickerPr ), ServiceReportStatusMenu( report: _serviceReport, + request: widget.request, onSelect: (status) { _serviceReport.status = status; }, diff --git a/lib/views/pages/user/requests/report/edit_service_report.dart b/lib/views/pages/user/requests/report/edit_service_report.dart index bfc8f4f5..e92f4c7c 100644 --- a/lib/views/pages/user/requests/report/edit_service_report.dart +++ b/lib/views/pages/user/requests/report/edit_service_report.dart @@ -2,7 +2,6 @@ import 'dart:convert'; import 'dart:io'; import 'package:flutter/material.dart'; -import 'package:flutter/rendering.dart'; import 'package:fluttertoast/fluttertoast.dart'; import 'package:provider/provider.dart'; import 'package:test_sa/controllers/api_routes/http_status_manger.dart'; @@ -36,9 +35,10 @@ import 'package:test_sa/views/widgets/status/report/service_report_type.dart'; import 'package:test_sa/views/widgets/status/report/service_status.dart'; import 'package:test_sa/views/widgets/timer/app_timer.dart'; import 'package:test_sa/views/widgets/titles/app_sub_title.dart'; + class EditServiceReport extends StatefulWidget { static final String id = "/edit-service-report"; - final ServiceRequest request ; + final ServiceRequest request; final ServiceReport report; const EditServiceReport({Key key, this.request, this.report}) : super(key: key); @@ -46,9 +46,7 @@ class EditServiceReport extends StatefulWidget { _EditServiceReportState createState() => _EditServiceReportState(); } -class _EditServiceReportState extends State with TickerProviderStateMixin{ - - +class _EditServiceReportState extends State with TickerProviderStateMixin { UserProvider _userProvider; SettingProvider _settingProvider; ServiceRequestsProvider _serviceRequestsProvider; @@ -76,6 +74,7 @@ class _EditServiceReportState extends State with TickerProvid _workPreformedController.dispose(); super.dispose(); } + @override Widget build(BuildContext context) { _userProvider = Provider.of(context); @@ -97,52 +96,54 @@ class _EditServiceReportState extends State with TickerProvid ListView( children: [ //AppNameBar(), - const SizedBox(height: 16,), + const SizedBox( + height: 16, + ), Center( child: Padding( padding: const EdgeInsets.all(8.0), child: Text( _subtitle.editServiceReport, - style: Theme.of(context).textTheme.headline5.copyWith( - color: AColors.cyan, - fontSize: 28, - fontWeight: FontWeight.bold - ), + style: Theme.of(context).textTheme.headline5.copyWith(color: AColors.cyan, fontSize: 28, fontWeight: FontWeight.bold), ), ), ), Container( padding: const EdgeInsets.symmetric(horizontal: 16), - margin: const EdgeInsets.symmetric(horizontal: 16,vertical: 16), - decoration: BoxDecoration( + margin: const EdgeInsets.symmetric(horizontal: 16, vertical: 16), + decoration: BoxDecoration(color: AColors.grey, borderRadius: BorderRadius.circular(AppStyle.getBorderRadius(context)), boxShadow: [ + const BoxShadow( color: AColors.grey, - borderRadius: BorderRadius.circular(AppStyle.getBorderRadius(context)), - boxShadow: [ - const BoxShadow( - color: AColors.grey, - offset: Offset(0,-1), - ) - ] - ), + offset: Offset(0, -1), + ) + ]), child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ - const SizedBox(height: 8,), + const SizedBox( + height: 8, + ), Wrap( spacing: 10, children: [ - ASubTitle("${_subtitle.callId}: ${widget.request.requestCode}",font: 14,), - widget.request.deviceSerialNumber == null ? const SizedBox(): - ASubTitle("${_subtitle.deviceSN}: ${widget.request.deviceSerialNumber}",font: 14,), + ASubTitle( + "${_subtitle.callId}: ${widget.request.requestCode}", + font: 14, + ), + widget.request.deviceSerialNumber == null + ? const SizedBox() + : ASubTitle( + "${_subtitle.deviceSN}: ${widget.request.deviceSerialNumber}", + font: 14, + ), Text( "${_subtitle.customer}: ${widget.request.hospitalName}", style: Theme.of(context).textTheme.subtitle1.copyWith( - fontWeight: FontWeight.bold, - fontSize: 12, - ), + fontWeight: FontWeight.bold, + fontSize: 12, + ), textScaleFactor: AppStyle.getScaleFactor(context), ) - ], ), const Divider(), @@ -156,29 +157,39 @@ class _EditServiceReportState extends State with TickerProvid crossAxisAlignment: CrossAxisAlignment.start, children: [ ASubTitle(_subtitle.reportType), - _validate && _serviceReport.type == null ? - ASubTitle(_subtitle.requiredWord,color: Colors.red,): - const SizedBox.shrink(), - const SizedBox(height: 4,), + _validate && _serviceReport.type == null + ? ASubTitle( + _subtitle.requiredWord, + color: Colors.red, + ) + : const SizedBox.shrink(), + const SizedBox( + height: 4, + ), ServiceReportTypeMenu( initialValue: _serviceReport.type, - onSelect: (status){ + onSelect: (status) { _serviceReport.type = status; }, ), ], ), ), - const SizedBox(width: 8,), + const SizedBox( + width: 8, + ), // visit date Expanded( child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ ASubTitle(_subtitle.visitDate), - _validate && _serviceReport.visitDate == null ? - ASubTitle(_subtitle.requiredWord,color: Colors.red,): - const SizedBox.shrink(), + _validate && _serviceReport.visitDate == null + ? ASubTitle( + _subtitle.requiredWord, + color: Colors.red, + ) + : const SizedBox.shrink(), Row( children: [ Expanded( @@ -186,7 +197,7 @@ class _EditServiceReportState extends State with TickerProvid date: _serviceReport.visitDate, from: DateTime.now().subtract(const Duration(days: 365)), to: DateTime.now().add(const Duration(days: 365)), - onDatePicker: (date){ + onDatePicker: (date) { _serviceReport.visitDate = date; setState(() {}); }, @@ -197,58 +208,84 @@ class _EditServiceReportState extends State with TickerProvid ], ), ), - ], ), - const SizedBox(height: 8,), + const SizedBox( + height: 8, + ), // device sn Visibility( - visible: true,//widget.report.device == null, + visible: true, //widget.report.device == null, child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ ASubTitle(_subtitle.deviceSN), - _validate && _serviceReport.device?.id == null ? - ASubTitle(_subtitle.requiredWord,color: Colors.red,): - const SizedBox.shrink(), + _validate && _serviceReport.device?.id == null + ? ASubTitle( + _subtitle.requiredWord, + color: Colors.red, + ) + : const SizedBox.shrink(), AutoCompleteDeviceField( hospitalId: widget.request.hospitalId, initialValue: _serviceReport.device, - onPick: (id){ + onPick: (id) { _serviceReport.device.id = id; }, ), - const SizedBox(height: 8,), + const SizedBox( + height: 8, + ), ], ), ), - const SizedBox(height: 8,), + const SizedBox( + height: 8, + ), ASubTitle(_subtitle.serviceType), - _validate && _serviceReport.assetType == null ? - ASubTitle(_subtitle.requiredWord,color: Colors.red,): - const SizedBox.shrink(), - const SizedBox(height: 4,), + _validate && _serviceReport.assetType == null + ? ASubTitle( + _subtitle.requiredWord, + color: Colors.red, + ) + : const SizedBox.shrink(), + const SizedBox( + height: 4, + ), ServiceAssetTypeMenu( initialValue: _serviceReport.assetType, - onSelect: (status){ + onSelect: (status) { _serviceReport.assetType = status; }, ), - const SizedBox(height: 8,), - SizedBox(height: 8 * AppStyle.getScaleFactor(context),), + const SizedBox( + height: 8, + ), + SizedBox( + height: 8 * AppStyle.getScaleFactor(context), + ), const ASubTitle("Assign Employee"), - const SizedBox(height: 8,), - _validate && _serviceReport.engineer == null ? - ASubTitle(_subtitle.requiredWord,color: Colors.red,): - const SizedBox.shrink(), - const SizedBox(height: 4,), + const SizedBox( + height: 8, + ), + _validate && _serviceReport.engineer == null + ? ASubTitle( + _subtitle.requiredWord, + color: Colors.red, + ) + : const SizedBox.shrink(), + const SizedBox( + height: 4, + ), EngineersMenu( initialValue: _serviceReport.engineer, - onSelect: (engineer){ + onSelect: (engineer) { _serviceReport.engineer = engineer; }, ), - const SizedBox(height: 8,), + const SizedBox( + height: 8, + ), // Report status and Service Type Row( children: [ @@ -258,37 +295,49 @@ class _EditServiceReportState extends State with TickerProvid crossAxisAlignment: CrossAxisAlignment.start, children: [ ASubTitle(_subtitle.reportStatus), - _validate && _serviceReport.status == null ? - ASubTitle(_subtitle.requiredWord,color: Colors.red,): - const SizedBox.shrink(), - const SizedBox(height: 4,), + _validate && _serviceReport.status == null + ? ASubTitle( + _subtitle.requiredWord, + color: Colors.red, + ) + : const SizedBox.shrink(), + const SizedBox( + height: 4, + ), ServiceReportStatusMenu( report: _serviceReport, - onSelect: (status){ + request: widget.request, + onSelect: (status) { _serviceReport.status = status; }, ), ], ), ), - const SizedBox(width: 8,), + const SizedBox( + width: 8, + ), Consumer( builder: (_, provider, __) { - if(provider.isLoading == null) return const SizedBox.shrink(); - return Expanded( + if (provider.isLoading == null) return const SizedBox.shrink(); + return Expanded( child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ ASubTitle(_subtitle.callLastSituation), - _validate && _serviceReport.callLastSituation == null ? - ASubTitle(_subtitle.requiredWord,color: Colors.red,): - const SizedBox.shrink(), - const SizedBox(height: 4,), + _validate && _serviceReport.callLastSituation == null + ? ASubTitle( + _subtitle.requiredWord, + color: Colors.red, + ) + : const SizedBox.shrink(), + const SizedBox( + height: 4, + ), ServiceReportLastCallsMenu( report: _serviceReport, - onSelect: (status){ - if(status?.value == 12 - || _serviceReport.callLastSituation?.value == 12){ + onSelect: (status) { + if (status?.value == 12 || _serviceReport.callLastSituation?.value == 12) { _serviceReport.callLastSituation = status; setState(() {}); } else { @@ -303,56 +352,61 @@ class _EditServiceReportState extends State with TickerProvid ), ], ), - const SizedBox(height: 8,), + const SizedBox( + height: 8, + ), // invoice number & code - _serviceReport.callLastSituation?.value != 12 ? const SizedBox.shrink(): - Row( - children: [ - Expanded( - child: Column( - crossAxisAlignment: CrossAxisAlignment.start, + _serviceReport.callLastSituation?.value != 12 + ? const SizedBox.shrink() + : Row( children: [ - ASubTitle(_subtitle.invoiceNumber), - const SizedBox(height: 8,), - ATextFormField( - initialValue: _serviceReport?.invoiceNumber, - textAlign: TextAlign.center, - style: Theme.of(context).textTheme.subtitle1, - validator: (value) => - Validator.hasValue(value) - ? null : _subtitle.requiredWord, - textInputType: TextInputType.number, - onSaved: (value){ - _serviceReport.invoiceNumber = value; - }, + Expanded( + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + ASubTitle(_subtitle.invoiceNumber), + const SizedBox( + height: 8, + ), + ATextFormField( + initialValue: _serviceReport?.invoiceNumber, + textAlign: TextAlign.center, + style: Theme.of(context).textTheme.subtitle1, + validator: (value) => Validator.hasValue(value) ? null : _subtitle.requiredWord, + textInputType: TextInputType.number, + onSaved: (value) { + _serviceReport.invoiceNumber = value; + }, + ), + ], + ), ), - ], - ), - ), - const SizedBox(width: 8,), - Expanded( - child: Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - ASubTitle(_subtitle.invoiceCode), - const SizedBox(height: 4,), - ATextFormField( - initialValue: _serviceReport?.invoiceCode, - textAlign: TextAlign.center, - style: Theme.of(context).textTheme.subtitle1, - validator: (value) => - Validator.hasValue(value) - ? null : _subtitle.requiredWord, - textInputType: TextInputType.text, - onSaved: (value){ - _serviceReport.invoiceCode = value; - }, + const SizedBox( + width: 8, + ), + Expanded( + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + ASubTitle(_subtitle.invoiceCode), + const SizedBox( + height: 4, + ), + ATextFormField( + initialValue: _serviceReport?.invoiceCode, + textAlign: TextAlign.center, + style: Theme.of(context).textTheme.subtitle1, + validator: (value) => Validator.hasValue(value) ? null : _subtitle.requiredWord, + textInputType: TextInputType.text, + onSaved: (value) { + _serviceReport.invoiceCode = value; + }, + ), + ], + ), ), ], ), - ), - ], - ), // const SizedBox(height: 8,), // Row( @@ -414,7 +468,9 @@ class _EditServiceReportState extends State with TickerProvid // ), // const SizedBox(height: 8,), - const SizedBox(height: 8,), + const SizedBox( + height: 8, + ), Row( children: [ // reasons @@ -423,17 +479,21 @@ class _EditServiceReportState extends State with TickerProvid crossAxisAlignment: CrossAxisAlignment.start, children: [ ASubTitle(_subtitle.reasons), - const SizedBox(height: 4,), + const SizedBox( + height: 4, + ), ServiceReportReasonsMenu( initialValue: _serviceReport.reason, - onSelect: (status){ + onSelect: (status) { _serviceReport.reason = status; }, ), ], ), ), - const SizedBox(width: 8,), + const SizedBox( + width: 8, + ), Expanded( child: Column( crossAxisAlignment: CrossAxisAlignment.start, @@ -442,8 +502,8 @@ class _EditServiceReportState extends State with TickerProvid AMiniOneImagePicker( //error: _validate && _serviceReport.image == null, image: _image, - onPick: (image){ - _image =image; + onPick: (image) { + _image = image; _serviceReport.image = base64Encode(image.readAsBytesSync()); }, ), @@ -452,7 +512,9 @@ class _EditServiceReportState extends State with TickerProvid ), ], ), - const SizedBox(height: 8,), + const SizedBox( + height: 8, + ), // Traveling Hours & Working Hours Row( children: [ @@ -461,13 +523,15 @@ class _EditServiceReportState extends State with TickerProvid crossAxisAlignment: CrossAxisAlignment.start, children: [ ASubTitle(_subtitle.workingHours), - const SizedBox(height: 8,), + const SizedBox( + height: 8, + ), Row( children: [ Expanded( child: AppTimer( timer: _serviceReport.timer, - onChange: (timer) async{ + onChange: (timer) async { _serviceReport.timer = timer; return true; }, @@ -516,7 +580,9 @@ class _EditServiceReportState extends State with TickerProvid // ), ], ), - const SizedBox(height: 8,), + const SizedBox( + height: 8, + ), // Operating Hours and Job Sheet Number // Row( // children: [ @@ -564,29 +630,39 @@ class _EditServiceReportState extends State with TickerProvid // ], // ), //const SizedBox(height: 8,), - const SizedBox(height: 8,), + const SizedBox( + height: 8, + ), const ASubTitle("Nurse Signature"), ESignature( oldSignature: _serviceReport.signatureNurse, newSignature: _serviceReport.localNurseSignature, - onChange: (signature){ - if(signature == null || signature.isEmpty) {return;} + onChange: (signature) { + if (signature == null || signature.isEmpty) { + return; + } _serviceReport.localNurseSignature = signature; _serviceReport.signatureNurse = "${DateTime.now().toIso8601String()}.png|${base64Encode(signature)}"; }, ), - const SizedBox(height: 8,), + const SizedBox( + height: 8, + ), const ASubTitle("Engineer Signature"), ESignature( oldSignature: _serviceReport.signatureEngineer, newSignature: _serviceReport.localNurseSignature, - onChange: (signature){ - if(signature == null || signature.isEmpty) {return;} + onChange: (signature) { + if (signature == null || signature.isEmpty) { + return; + } _serviceReport.localNurseSignature = signature; _serviceReport.signatureEngineer = "${DateTime.now().toIso8601String()}.png|${base64Encode(signature)}"; }, ), - const SizedBox(height: 8,), + const SizedBox( + height: 8, + ), // Part Number and Quantity Row( children: [ @@ -596,12 +672,17 @@ class _EditServiceReportState extends State with TickerProvid crossAxisAlignment: CrossAxisAlignment.start, children: [ ASubTitle(_subtitle.partNumber), - _validate && _serviceReport.parts == null ? - ASubTitle(_subtitle.requiredWord,color: Colors.red,): - const SizedBox.shrink(), - const SizedBox(height: 4,), + _validate && _serviceReport.parts == null + ? ASubTitle( + _subtitle.requiredWord, + color: Colors.red, + ) + : const SizedBox.shrink(), + const SizedBox( + height: 4, + ), AutoCompletePartsField( - onPick: (part){ + onPick: (part) { _serviceReport.parts.add(part); setState(() {}); }, @@ -609,34 +690,33 @@ class _EditServiceReportState extends State with TickerProvid ], ), ), - ], ), - SizedBox(height: 8*AppStyle.getScaleFactor(context),), + SizedBox( + height: 8 * AppStyle.getScaleFactor(context), + ), Row( children: [ - Expanded(flex:3,child: Text(_subtitle.number)), - Expanded(flex: 1,child: Text(_subtitle.quantity)), + Expanded(flex: 3, child: Text(_subtitle.number)), + Expanded(flex: 1, child: Text(_subtitle.quantity)), ], ), Column( - children: List.generate( - _serviceReport.parts.length, - (index) { - Part _part = _serviceReport.parts[index]; - return PartItem( - part: _part, - onDelete: (part){ - _serviceReport.parts.remove(part); - setState(() {}); - }, - ); - } - ), + children: List.generate(_serviceReport.parts.length, (index) { + Part _part = _serviceReport.parts[index]; + return PartItem( + part: _part, + onDelete: (part) { + _serviceReport.parts.remove(part); + setState(() {}); + }, + ); + }), ), - const SizedBox(height: 16,), - + const SizedBox( + height: 16, + ), ], ), ), @@ -646,48 +726,40 @@ class _EditServiceReportState extends State with TickerProvid text: _subtitle.update, onPressed: () async { _validate = true; - if(!_formKey.currentState.validate()){ + if (!_formKey.currentState.validate()) { setState(() {}); return; } - if(!_serviceReport.validate()) { + if (!_serviceReport.validate()) { setState(() {}); return; } _formKey.currentState.save(); - _isLoading =true; + _isLoading = true; setState(() {}); - int status = await _serviceRequestsProvider.updateServiceReport( - user: _userProvider.user, - host: _settingProvider.host, - report: _serviceReport, - request: widget.request - ); - _isLoading =false; + int status = await _serviceRequestsProvider.updateServiceReport(user: _userProvider.user, host: _settingProvider.host, report: _serviceReport, request: widget.request); + _isLoading = false; setState(() {}); - if(status >= 200 && status < 300){ + if (status >= 200 && status < 300) { Fluttertoast.showToast( - msg: _subtitle.requestCompleteSuccessfully, + msg: _subtitle.requestCompleteSuccessfully, ); Navigator.of(context).pop(); Navigator.of(context).pop(); - }else{ - String errorMessage = HttpStatusManger.getStatusMessage( - status: status, subtitle: _subtitle); - ScaffoldMessenger.of(context).showSnackBar( - SnackBar( - content: Text( - errorMessage - ), - ) - ); + } else { + String errorMessage = HttpStatusManger.getStatusMessage(status: status, subtitle: _subtitle); + ScaffoldMessenger.of(context).showSnackBar(SnackBar( + content: Text(errorMessage), + )); } }, ), ), - const SizedBox(height: 300,) + const SizedBox( + height: 300, + ) ], ), const ABackButton(), diff --git a/lib/views/widgets/status/report/service_report_status.dart b/lib/views/widgets/status/report/service_report_status.dart index 12adf5d3..dae28e02 100644 --- a/lib/views/widgets/status/report/service_report_status.dart +++ b/lib/views/widgets/status/report/service_report_status.dart @@ -8,13 +8,16 @@ import 'package:test_sa/controllers/providers/api/user_provider.dart'; import 'package:test_sa/controllers/providers/settings/setting_provider.dart'; import 'package:test_sa/models/lookup.dart'; import 'package:test_sa/models/service_report.dart'; +import 'package:test_sa/models/service_request/service_request.dart'; import 'package:test_sa/views/widgets/loaders/loading_manager.dart'; import 'package:test_sa/views/widgets/status/single_status_menu.dart'; + class ServiceReportStatusMenu extends StatefulWidget { final Function(Lookup) onSelect; final ServiceReport report; + final ServiceRequest request; - const ServiceReportStatusMenu({Key key, this.onSelect, this.report}) : super(key: key); + const ServiceReportStatusMenu({Key key, this.onSelect, this.report, this.request}) : super(key: key); @override State createState() => _ServiceReportStatusMenuState(); @@ -28,7 +31,7 @@ class _ServiceReportStatusMenuState extends State { UserProvider userProvider = Provider.of(context); ServiceReportStatusProvider menuProvider = Provider.of(context); ServiceReportLastCallsProvider callsLastSituationsProvider = Provider.of(context); - if(firstTime){ + if (firstTime) { callsLastSituationsProvider.reset(); firstTime = false; @@ -36,37 +39,38 @@ class _ServiceReportStatusMenuState extends State { return LoadingManager( isLoading: menuProvider.isLoading == true || callsLastSituationsProvider.isLoading == true, isFailedLoading: menuProvider.statuses == null || callsLastSituationsProvider.calls == null, - stateCode: menuProvider.stateCode == null || callsLastSituationsProvider.stateCode == null ? null: - max(menuProvider.stateCode ?? 0,callsLastSituationsProvider.stateCode ?? 0), + stateCode: menuProvider.stateCode == null || callsLastSituationsProvider.stateCode == null ? null : max(menuProvider.stateCode ?? 0, callsLastSituationsProvider.stateCode ?? 0), onRefresh: () async { await callsLastSituationsProvider.getCalls( - user: userProvider.user, - host: settingProvider.host, - serviceStatus: widget.report.status?.id + user: userProvider.user, + host: settingProvider.host, + serviceStatus: widget.report.status?.id, + typeName: widget.report.type?.name, + id: widget.report.id, + woId: widget.request.id, ); - if(menuProvider.stateCode == null){ + if (menuProvider.stateCode == null) { menuProvider.reset(); - await menuProvider.getTypes( - user: userProvider.user, - host: settingProvider.host - ); + await menuProvider.getTypes(user: userProvider.user, host: settingProvider.host); setState(() {}); } }, child: SingleStatusMenu( statuses: menuProvider.statuses, initialStatus: widget.report.status, - onSelect: (status){ + onSelect: (status) { widget.report.callLastSituation = null; callsLastSituationsProvider.getCalls( user: userProvider.user, host: settingProvider.host, - serviceStatus: status.id + serviceStatus: status.id, + id: widget.report.id, + woId: widget.request.id, + typeName: widget.report.type.name, ); widget.onSelect(status); }, - ) - ); + )); } } From 37df63c86698d8ad3bb8248ed910225586bf55fd Mon Sep 17 00:00:00 2001 From: Sikander Saleem Date: Wed, 31 May 2023 15:25:59 +0300 Subject: [PATCH 042/181] user role parsing fix. --- lib/models/user.dart | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/lib/models/user.dart b/lib/models/user.dart index 880e4fce..c64c471f 100644 --- a/lib/models/user.dart +++ b/lib/models/user.dart @@ -157,8 +157,11 @@ class User { password = json['password']; token = json['token']; roles = json['roles']; - if (userRoles != null) { - json['userRoles'] = userRoles.map((v) => v.toJson()).toList(); + if (json['userRoles'] != null) { + userRoles = []; + json['userRoles'].forEach((v) { + userRoles.add(UserRoles.fromJson(v)); + }); } tokenlife = json['tokenlife']; isAuthenticated = json['isAuthenticated']; From 64cb5249172e13527bb697550d824a1eaa2bf731 Mon Sep 17 00:00:00 2001 From: zaid_daoud Date: Wed, 31 May 2023 15:57:50 +0300 Subject: [PATCH 043/181] Change service last calls API --- lib/views/widgets/status/report/service_report_status.dart | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/views/widgets/status/report/service_report_status.dart b/lib/views/widgets/status/report/service_report_status.dart index dae28e02..5d3f797a 100644 --- a/lib/views/widgets/status/report/service_report_status.dart +++ b/lib/views/widgets/status/report/service_report_status.dart @@ -66,7 +66,7 @@ class _ServiceReportStatusMenuState extends State { serviceStatus: status.id, id: widget.report.id, woId: widget.request.id, - typeName: widget.report.type.name, + typeName: widget.report.type?.name, ); widget.onSelect(status); From 934699062673df24de79ff3d57388800d0cc654b Mon Sep 17 00:00:00 2001 From: zaid_daoud Date: Wed, 31 May 2023 16:11:34 +0300 Subject: [PATCH 044/181] Enhancemnets --- .../api/service_requests_provider.dart | 4 +- lib/models/service_report.dart | 4 + .../report/create_service_report.dart | 171 ++++++++++++------ 3 files changed, 118 insertions(+), 61 deletions(-) diff --git a/lib/controllers/providers/api/service_requests_provider.dart b/lib/controllers/providers/api/service_requests_provider.dart index 3d0569ba..0019f661 100644 --- a/lib/controllers/providers/api/service_requests_provider.dart +++ b/lib/controllers/providers/api/service_requests_provider.dart @@ -314,8 +314,8 @@ class ServiceRequestsProvider extends ChangeNotifier { "currentSituation": null, "repairLocation": report.repairLocation?.toMap(), "reason": report.reason?.toMap(), - "startofWorkTime": report.timer?.startAt?.toIso8601String() ?? "", - "endofWorkTime": report.timer?.endAt?.toIso8601String() ?? "", + "startofWorkTime": report.startDate?.toIso8601String() ?? "", + "endofWorkTime": report.endDate?.toIso8601String() ?? "", "workingHours": report.timer?.durationInSecond, "travelingHours": report.travelingHours, "travelingExpenses": report.travelingExpense ?? 0, diff --git a/lib/models/service_report.dart b/lib/models/service_report.dart index 3e471b7a..60d4e4f2 100644 --- a/lib/models/service_report.dart +++ b/lib/models/service_report.dart @@ -13,6 +13,7 @@ class ServiceReport { String operatingHours; DateTime visitDate; DateTime endDate; + DateTime startDate; Lookup assetType; Lookup callLastSituation; Lookup repairLocation; @@ -69,6 +70,7 @@ class ServiceReport { this.comment, this.repairLocation, this.travelingExpense, + this.startDate, }); Map toMap(ServiceRequest request) { @@ -123,6 +125,8 @@ class ServiceReport { _map["engSignature"] = signatureEngineer; _map["comment"] = comment; _map["travelingExpense"] = travelingExpense; + _map["startofWorkTime"] = startDate; + _map["endofWorkTime"] = endDate; return _map; } diff --git a/lib/views/pages/user/requests/report/create_service_report.dart b/lib/views/pages/user/requests/report/create_service_report.dart index 101be5b2..b2c6cbc2 100644 --- a/lib/views/pages/user/requests/report/create_service_report.dart +++ b/lib/views/pages/user/requests/report/create_service_report.dart @@ -35,6 +35,7 @@ import 'package:test_sa/views/widgets/status/report/service_status.dart'; import 'package:test_sa/views/widgets/timer/app_timer.dart'; import 'package:test_sa/views/widgets/titles/app_sub_title.dart'; +import '../../../../widgets/speech_to_text/speech_to_text.dart'; import '../../../../widgets/status/report/service_report_repair_location.dart'; class CreateServiceReport extends StatefulWidget { @@ -330,6 +331,54 @@ class _CreateServiceReportState extends State with TickerPr SizedBox( height: 8 * AppStyle.getScaleFactor(context), ), + Row( + children: [ + Expanded( + child: Column( + crossAxisAlignment: CrossAxisAlignment.stretch, + children: [ + const ASubTitle("Start Date"), + SizedBox( + height: 8 * AppStyle.getScaleFactor(context), + ), + ADatePicker( + date: _serviceReport.startDate, + from: DateTime.now().subtract(const Duration(days: 365)), + to: DateTime.now().add(const Duration(days: 365)), + onDatePicker: (date) { + _serviceReport.startDate = date; + setState(() {}); + }, + ), + ], + ), + ), + const SizedBox(width: 8), + Expanded( + child: Column( + crossAxisAlignment: CrossAxisAlignment.stretch, + children: [ + const ASubTitle("End Date"), + SizedBox( + height: 8 * AppStyle.getScaleFactor(context), + ), + ADatePicker( + date: _serviceReport.endDate, + from: DateTime.now().subtract(const Duration(days: 365)), + to: DateTime.now().add(const Duration(days: 365)), + onDatePicker: (date) { + _serviceReport.endDate = date; + setState(() {}); + }, + ), + ], + ), + ), + ], + ), + SizedBox( + height: 8 * AppStyle.getScaleFactor(context), + ), const ASubTitle("Assigned Employee"), const SizedBox( height: 8, @@ -404,65 +453,69 @@ class _CreateServiceReportState extends State with TickerPr ), ], ), - // const SizedBox(height: 8,), - // Row( - // children: [ - // ASubTitle(_subtitle.faultDescription), - // Expanded( - // child: SizedBox( - // height: 32 * AppStyle.getScaleFactor(context), - // child: SpeechToTextButton( - // controller: _faultController, - // mini: true, - // ), - // ), - // ), - // ], - // ), - // const SizedBox(height: 4,), - // ATextFormField( - // initialValue: _serviceReport?.faultDescriptionId, - // textAlign: TextAlign.center, - // controller: _faultController, - // style: Theme.of(context).textTheme.subtitle1, - // validator: (value) => - // Validator.hasValue(value) - // ? null : _subtitle.requiredWord, - // textInputType: TextInputType.multiline, - // onSaved: (value){ - // _serviceReport.faultDescriptionId = value; - // }, - // ), - // const SizedBox(height: 8,), - // Row( - // children: [ - // ASubTitle(_subtitle.workPreformed), - // Expanded( - // child: SizedBox( - // height: 32 * AppStyle.getScaleFactor(context), - // child: SpeechToTextButton( - // controller: _workPreformedController, - // mini: true, - // ), - // ), - // ), - // ], - // ), - // const SizedBox(height: 4,), - // ATextFormField( - // initialValue: _serviceReport?.workPreformed, - // textAlign: TextAlign.center, - // controller: _workPreformedController, - // style: Theme.of(context).textTheme.subtitle1, - // validator: (value) => - // Validator.hasValue(value) - // ? null : _subtitle.requiredWord, - // textInputType: TextInputType.multiline, - // onSaved: (value){ - // _serviceReport.workPreformed = value; - // }, - // ), - // const SizedBox(height: 8,), + const SizedBox(height: 8), + Row( + children: [ + ASubTitle(_subtitle.faultDescription), + Expanded( + child: SizedBox( + height: 32 * AppStyle.getScaleFactor(context), + child: SpeechToTextButton( + controller: _faultController, + mini: true, + ), + ), + ), + ], + ), + const SizedBox( + height: 4, + ), + ATextFormField( + initialValue: _serviceReport?.faultDescriptionId?.toString(), + textAlign: TextAlign.center, + controller: _faultController, + style: Theme.of(context).textTheme.titleMedium, + validator: (value) => Validator.hasValue(value) ? null : _subtitle.requiredWord, + textInputType: TextInputType.multiline, + onSaved: (value) { + _serviceReport.faultDescriptionId = int.tryParse(value) ?? 0; + }, + ), + const SizedBox( + height: 8, + ), + Row( + children: [ + ASubTitle(_subtitle.workPreformed), + Expanded( + child: SizedBox( + height: 32 * AppStyle.getScaleFactor(context), + child: SpeechToTextButton( + controller: _workPreformedController, + mini: true, + ), + ), + ), + ], + ), + const SizedBox( + height: 4, + ), + ATextFormField( + initialValue: _serviceReport?.workPreformed, + textAlign: TextAlign.center, + controller: _workPreformedController, + style: Theme.of(context).textTheme.subtitle1, + validator: (value) => Validator.hasValue(value) ? null : _subtitle.requiredWord, + textInputType: TextInputType.multiline, + onSaved: (value) { + _serviceReport.workPreformed = value; + }, + ), + const SizedBox( + height: 8, + ), const SizedBox( height: 8, From 49147eab3df538a6222d15642643dd1ef5f82b35 Mon Sep 17 00:00:00 2001 From: Sikander Saleem Date: Wed, 31 May 2023 16:17:49 +0300 Subject: [PATCH 045/181] improvement. --- lib/views/pages/user/requests/request_details.dart | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/lib/views/pages/user/requests/request_details.dart b/lib/views/pages/user/requests/request_details.dart index c79931e8..8f77c34b 100644 --- a/lib/views/pages/user/requests/request_details.dart +++ b/lib/views/pages/user/requests/request_details.dart @@ -302,7 +302,7 @@ class RequestDetailsPage extends StatelessWidget { future: _serviceRequestsProvider.searchWorkOrders(callId: serviceRequest.requestCode), builder: (context, snap) { workOrders = snap.data as List; - if (snap.connectionState == ConnectionState.done && (snap.data?.length ?? 0) != 0) + if (snap.connectionState == ConnectionState.done && (snap.data?.length ?? 0) != 0) { return ListView.separated( padding: EdgeInsets.all(21), itemCount: workOrders.length, @@ -384,7 +384,7 @@ class RequestDetailsPage extends StatelessWidget { ); }, ); - else + } else { return _userProvider.user.type == UsersTypes.engineer ? Center( child: Padding( @@ -405,6 +405,7 @@ class RequestDetailsPage extends StatelessWidget { : Center( child: ASubTitle(_subtitle.noDateFound), ); + } }, ) ], From ecb8d1e1a7221e3bf03327b8fd3e4f01d7e036c7 Mon Sep 17 00:00:00 2001 From: Sikander Saleem Date: Thu, 1 Jun 2023 08:34:27 +0300 Subject: [PATCH 046/181] improvements --- lib/models/service_report.dart | 2 +- .../pages/user/requests/request_details.dart | 19 ++++++++++++------- 2 files changed, 13 insertions(+), 8 deletions(-) diff --git a/lib/models/service_report.dart b/lib/models/service_report.dart index 60d4e4f2..8f5b873a 100644 --- a/lib/models/service_report.dart +++ b/lib/models/service_report.dart @@ -154,7 +154,7 @@ class ServiceReport { factory ServiceReport.fromJson(Map parsedJson, int id) { List _parts = []; if (parsedJson["sparePartsWorkOrders"] != null) { - if (parsedJson["sparePartsWorkOrders"][0]["id"] != null) { + if ((parsedJson["sparePartsWorkOrders"]as List ).isNotEmpty && parsedJson["sparePartsWorkOrders"][0]["id"] != null) { List partsList = parsedJson["sparePartsWorkOrders"]; _parts = partsList.map((e) => Part.fromJson(e["sparePart"], reportJson: e)).toList(); } diff --git a/lib/views/pages/user/requests/request_details.dart b/lib/views/pages/user/requests/request_details.dart index 8f77c34b..0d17f864 100644 --- a/lib/views/pages/user/requests/request_details.dart +++ b/lib/views/pages/user/requests/request_details.dart @@ -12,6 +12,7 @@ import 'package:test_sa/models/service_request/service_request.dart'; import 'package:test_sa/models/subtitle.dart'; import 'package:test_sa/views/app_style/colors.dart'; import 'package:test_sa/views/app_style/sizing.dart'; +import 'package:test_sa/views/pages/user/requests/create_request.dart'; import 'package:test_sa/views/pages/user/requests/report/create_service_report.dart'; import 'package:test_sa/views/widgets/buttons/app_back_button.dart'; import 'package:test_sa/views/widgets/buttons/app_button.dart'; @@ -84,13 +85,16 @@ class RequestDetailsPage extends StatelessWidget { buttonSize: 42, backgroundColor: AColors.green, onPressed: () async { - showModalBottomSheet( - context: context, - builder: (context) { - return ServiceRequestsUpdateDialog( - request: serviceRequest, - ); - }); + Navigator.of(context).push( + MaterialPageRoute(builder: (_) => CreateRequestPage(serviceRequest: serviceRequest)), + ); + // showModalBottomSheet( + // context: context, + // builder: (context) { + // return ServiceRequestsUpdateDialog( + // request: serviceRequest, + // ); + // }); // DateTime picked = await showDatePicker( // context: context, // initialDate: DateTime.now(), @@ -302,6 +306,7 @@ class RequestDetailsPage extends StatelessWidget { future: _serviceRequestsProvider.searchWorkOrders(callId: serviceRequest.requestCode), builder: (context, snap) { workOrders = snap.data as List; + if (snap.connectionState == ConnectionState.waiting) return Center(child: CircularProgressIndicator()); if (snap.connectionState == ConnectionState.done && (snap.data?.length ?? 0) != 0) { return ListView.separated( padding: EdgeInsets.all(21), From e20e99bebe95d399abac8eee45d2e7e0aeae69b4 Mon Sep 17 00:00:00 2001 From: Sikander Saleem Date: Thu, 1 Jun 2023 11:06:04 +0300 Subject: [PATCH 047/181] through fix. --- lib/controllers/providers/api/service_requests_provider.dart | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/controllers/providers/api/service_requests_provider.dart b/lib/controllers/providers/api/service_requests_provider.dart index 9bab49f5..a30d12cf 100644 --- a/lib/controllers/providers/api/service_requests_provider.dart +++ b/lib/controllers/providers/api/service_requests_provider.dart @@ -147,7 +147,7 @@ class ServiceRequestsProvider extends ChangeNotifier { "priority": serviceRequest.priority.toMap(), "defectType": serviceRequest.defectType.toMap(), "typeofRequest": serviceRequest.type.toMap(), - "requestedThrough": serviceRequest.type.toMap(), + "requestedThrough": serviceRequest.requestedThrough.toMap(), "reviewComment": null, if (serviceRequest.audio != null) "voiceNote": serviceRequest.audio, "callSiteContactPerson": [ From c24353c9eac585731fab07f245b92c098e7b6dc3 Mon Sep 17 00:00:00 2001 From: Sikander Saleem Date: Thu, 1 Jun 2023 16:10:48 +0300 Subject: [PATCH 048/181] work order fixes. --- .../api/service_requests_provider.dart | 6 +- lib/models/service_report.dart | 16 +- .../service_request/service_request.dart | 15 +- .../pages/user/requests/create_request.dart | 37 +-- .../report/create_service_report.dart | 210 ++++++++++-------- .../pages/user/requests/request_details.dart | 2 +- .../widgets/date_and_time/time_picker.dart | 69 ++++++ .../requests/service_request_item.dart | 2 +- 8 files changed, 232 insertions(+), 125 deletions(-) create mode 100644 lib/views/widgets/date_and_time/time_picker.dart diff --git a/lib/controllers/providers/api/service_requests_provider.dart b/lib/controllers/providers/api/service_requests_provider.dart index 9bab49f5..b338d0ae 100644 --- a/lib/controllers/providers/api/service_requests_provider.dart +++ b/lib/controllers/providers/api/service_requests_provider.dart @@ -142,7 +142,7 @@ class ServiceRequestsProvider extends ChangeNotifier { "requestedDate": DateTime.now().toIso8601String(), "requestedTime": DateTime.now().toIso8601String(), "client": user.clientId, - "callComments": serviceRequest.maintenanceIssue, + "callComments": serviceRequest.callComments, if (serviceRequest.devicePhotos.isNotEmpty) "attachmentsCallRequest": serviceRequest.devicePhotos.map((e) => {"name": e}).toList(), "priority": serviceRequest.priority.toMap(), "defectType": serviceRequest.defectType.toMap(), @@ -248,13 +248,13 @@ class ServiceRequestsProvider extends ChangeNotifier { "contactUserId": user.id, }, ], - "callComments": request.maintenanceIssue, + "callComments": request.callComments, "noofFollowup": 0, // "status": null, "callLastSituation": null, "firstAction": request.firstAction?.toMap(), "loanAvailablity": request.loanAvailability?.toMap(), - "comments": request.comment, + "comments": request.reviewComment, "firstActionDate": serviceRequest['firstActionDate'], "visitDate": date?.toIso8601String() ?? "", "callReview": null, diff --git a/lib/models/service_report.dart b/lib/models/service_report.dart index 8f5b873a..7024bd49 100644 --- a/lib/models/service_report.dart +++ b/lib/models/service_report.dart @@ -23,6 +23,7 @@ class ServiceReport { Lookup reason; int faultDescriptionId; String workPreformed; + //String workHours; String travelingHours; String invoiceNumber; @@ -127,6 +128,7 @@ class ServiceReport { _map["travelingExpense"] = travelingExpense; _map["startofWorkTime"] = startDate; _map["endofWorkTime"] = endDate; + _map["workingHours"] = endDate?.difference(startDate)?.inHours ?? 0; return _map; } @@ -154,7 +156,7 @@ class ServiceReport { factory ServiceReport.fromJson(Map parsedJson, int id) { List _parts = []; if (parsedJson["sparePartsWorkOrders"] != null) { - if ((parsedJson["sparePartsWorkOrders"]as List ).isNotEmpty && parsedJson["sparePartsWorkOrders"][0]["id"] != null) { + if ((parsedJson["sparePartsWorkOrders"] as List).isNotEmpty && parsedJson["sparePartsWorkOrders"][0]["id"] != null) { List partsList = parsedJson["sparePartsWorkOrders"]; _parts = partsList.map((e) => Part.fromJson(e["sparePart"], reportJson: e)).toList(); } @@ -171,11 +173,11 @@ class ServiceReport { //invoiceCode: parsedJson["invoice_code"], //invoiceNumber: parsedJson["invoice_no"], //jobSheetNumber: parsedJson["job_sheet_no"], - //operatingHours: parsedJson["workingHours"], + operatingHours: parsedJson["workingHours"], engineer: Engineer.fromJson(parsedJson["assignedEmployee"]), parts: _parts, //quantity: parsedJson["nid"], - //travelingHours: parsedJson["traveling_hours"], + travelingHours: parsedJson["traveling_hours"], visitDate: DateTime.tryParse(parsedJson["visitDate"]), //workHours: parsedJson["working_hours"], timer: TimerModel( @@ -187,8 +189,8 @@ class ServiceReport { ); } - // static getDate(String date){ - // return date == null || date.isEmpty - // ? null : DateTime.fromMillisecondsSinceEpoch(int.tryParse(date) * 1000); - // } +// static getDate(String date){ +// return date == null || date.isEmpty +// ? null : DateTime.fromMillisecondsSinceEpoch(int.tryParse(date) * 1000); +// } } diff --git a/lib/models/service_request/service_request.dart b/lib/models/service_request/service_request.dart index 6ebc748b..a884da62 100644 --- a/lib/models/service_request/service_request.dart +++ b/lib/models/service_request/service_request.dart @@ -10,7 +10,7 @@ class ServiceRequest { String deviceArName; String deviceEnName; List devicePhotos; - String maintenanceIssue; + String callComments; String hospitalName; int hospitalId; String departmentName; @@ -19,7 +19,8 @@ class ServiceRequest { String audio; int statusValue; String statusLabel; - String comment; + String reviewComment; + String comments; bool viewReport; String engineerMobile; @@ -49,7 +50,7 @@ class ServiceRequest { this.devicePhotos, this.hospitalId, this.deviceSerialNumber, - this.maintenanceIssue, + this.callComments, this.statusLabel, this.statusValue, this.departmentName, @@ -71,7 +72,8 @@ class ServiceRequest { this.type, this.requestedThrough, this.device, - this.comment, + this.reviewComment, + this.comments, this.loanAvailability, this.firstAction, }); @@ -94,7 +96,8 @@ class ServiceRequest { devicePhotos: images, deviceSerialNumber: parsedJson["asset"]["assetSerialNo"], date: DateTime.tryParse(parsedJson["requestedDate"] ?? "").toString().split(" ").first, - maintenanceIssue: parsedJson["comments"], + callComments: parsedJson["callComments"], + comments: parsedJson["comments"], statusLabel: parsedJson["status"] == null ? null : parsedJson["status"]["name"], statusValue: parsedJson["status"] == null ? null : parsedJson["status"]["value"], departmentName: parsedJson["asset"]["department"] != null ? parsedJson["asset"]["department"]["name"] : "", @@ -110,7 +113,7 @@ class ServiceRequest { nextVisitDate: DateTime.tryParse(parsedJson["nextVisitDate"] ?? ""), workPerformed: parsedJson["workOrder"] != null ? parsedJson["workOrder"]["workPerformed"] : null, device: Device.fromJson(parsedJson["asset"]), - comment: parsedJson["reviewComment"], + reviewComment: parsedJson["reviewComment"], type: Lookup.fromJson(parsedJson['typeofRequest']), defectType: Lookup.fromJson(parsedJson['defectType']), loanAvailability: Lookup.fromJson(parsedJson['loanAvailability']), diff --git a/lib/views/pages/user/requests/create_request.dart b/lib/views/pages/user/requests/create_request.dart index fb676de4..3d2b6de8 100644 --- a/lib/views/pages/user/requests/create_request.dart +++ b/lib/views/pages/user/requests/create_request.dart @@ -39,6 +39,7 @@ import '../../../widgets/status/service_request/service_request_loan_availabilit class CreateRequestPage extends StatefulWidget { static const String id = "/create-request"; final ServiceRequest serviceRequest; + const CreateRequestPage({this.serviceRequest, Key key}) : super(key: key); @override @@ -199,7 +200,7 @@ class CreateRequestPageState extends State { height: 4, ), ServiceRequestedThroughMenu( - initialValue: const Lookup(name: "App", value: 375), + initialValue: _serviceRequest.requestedThrough, onSelect: (status) { _serviceRequest.requestedThrough = status; }, @@ -219,7 +220,7 @@ class CreateRequestPageState extends State { }, ), if (_serviceRequest.firstAction != null) 12.height, - if (_serviceRequest.firstAction != null) + if (_serviceRequest?.firstAction?.id == 405) ADatePicker( date: _dateTime, from: DateTime.now(), @@ -241,6 +242,22 @@ class CreateRequestPageState extends State { }, ), 12.height, + if (widget.serviceRequest != null) const ASubTitle("Comments"), + const SizedBox( + height: 4, + ), + if (widget.serviceRequest != null) + ATextFormField( + controller: _commentController, + initialValue: _serviceRequest.reviewComment, + hintText: _subtitle.comment, + style: Theme.of(context).textTheme.titleMedium, + textInputType: TextInputType.multiline, + onSaved: (value) { + _serviceRequest.reviewComment = value; + }, + ), + 12.height, MultiImagesPicker( label: _subtitle.deviceImages, images: _deviceImages, @@ -250,32 +267,20 @@ class CreateRequestPageState extends State { 12.height, ATextFormField( controller: _maintenanceController, - initialValue: _serviceRequest.maintenanceIssue, + initialValue: _serviceRequest.callComments, hintText: _subtitle.maintenanceIssue, prefixIconData: FontAwesomeIcons.triangleExclamation, style: Theme.of(context).textTheme.headline6, textInputType: TextInputType.multiline, validator: (value) => Validator.hasValue(value) ? null : _subtitle.maintenanceIssueRequired, onSaved: (value) { - _serviceRequest.maintenanceIssue = value; + _serviceRequest.callComments = value; }, ), 12.height, RecordSound(onRecord: (audio) { _serviceRequest.audio = audio; }), - 12.height, - if (widget.serviceRequest != null) - ATextFormField( - controller: _commentController, - initialValue: _serviceRequest.comment, - hintText: _subtitle.comment, - style: Theme.of(context).textTheme.titleMedium, - textInputType: TextInputType.multiline, - onSaved: (value) { - _serviceRequest.comment = value; - }, - ), ], ).paddingOnly(left: 20, right: 20), Padding( diff --git a/lib/views/pages/user/requests/report/create_service_report.dart b/lib/views/pages/user/requests/report/create_service_report.dart index f7ee46eb..477bba08 100644 --- a/lib/views/pages/user/requests/report/create_service_report.dart +++ b/lib/views/pages/user/requests/report/create_service_report.dart @@ -21,6 +21,7 @@ import 'package:test_sa/views/widgets/app_text_form_field.dart'; import 'package:test_sa/views/widgets/buttons/app_back_button.dart'; import 'package:test_sa/views/widgets/buttons/app_button.dart'; import 'package:test_sa/views/widgets/date_and_time/date_picker.dart'; +import 'package:test_sa/views/widgets/date_and_time/time_picker.dart'; import 'package:test_sa/views/widgets/e_signature/e_signature.dart'; import 'package:test_sa/views/widgets/equipment/auto_complete_devices_field.dart'; import 'package:test_sa/views/widgets/images/mini_one_image_picker.dart'; @@ -43,6 +44,7 @@ class CreateServiceReport extends StatefulWidget { final ServiceRequest request; const CreateServiceReport({Key key, this.request}) : super(key: key); + @override _CreateServiceReportState createState() => _CreateServiceReportState(); } @@ -337,15 +339,15 @@ class _CreateServiceReportState extends State with TickerPr child: Column( crossAxisAlignment: CrossAxisAlignment.stretch, children: [ - const ASubTitle("Start Date"), + const ASubTitle("Start of Work"), SizedBox( height: 8 * AppStyle.getScaleFactor(context), ), - ADatePicker( + ADateTimePicker( date: _serviceReport.startDate, from: DateTime.now().subtract(const Duration(days: 365)), to: DateTime.now().add(const Duration(days: 365)), - onDatePicker: (date) { + onDateTimePicker: (date) { _serviceReport.startDate = date; setState(() {}); }, @@ -358,15 +360,15 @@ class _CreateServiceReportState extends State with TickerPr child: Column( crossAxisAlignment: CrossAxisAlignment.stretch, children: [ - const ASubTitle("End Date"), + const ASubTitle("End of Work"), SizedBox( height: 8 * AppStyle.getScaleFactor(context), ), - ADatePicker( + ADateTimePicker( date: _serviceReport.endDate, from: DateTime.now().subtract(const Duration(days: 365)), to: DateTime.now().add(const Duration(days: 365)), - onDatePicker: (date) { + onDateTimePicker: (date) { _serviceReport.endDate = date; setState(() {}); }, @@ -376,31 +378,46 @@ class _CreateServiceReportState extends State with TickerPr ), ], ), - SizedBox( - height: 8 * AppStyle.getScaleFactor(context), - ), - const ASubTitle("Assigned Employee"), - const SizedBox( - height: 8, - ), - _validate && _serviceReport.engineer == null - ? ASubTitle( - _subtitle.requiredWord, - color: Colors.red, - ) - : const SizedBox.shrink(), - const SizedBox( - height: 4, - ), - EngineersMenu( - initialValue: _serviceReport.engineer, - onSelect: (engineer) { - _serviceReport.engineer = engineer; + ASubTitle(_subtitle.workingHours), + const SizedBox(height: 4), + ATextFormField( + initialValue: null, + textAlign: TextAlign.center, + hintText: _serviceReport.startDate == null ? "0" : _serviceReport?.endDate?.difference(_serviceReport?.startDate)?.inHours?.toString() ?? "0", + enable: false, + style: Theme.of(context).textTheme.subtitle1, + validator: (value) => Validator.isNumeric(value) ? null : _subtitle.requiredWord, + textInputType: TextInputType.number, + onSaved: (value) { + // _serviceReport.workHours = value; }, ), - const SizedBox( - height: 8, + + SizedBox( + height: 8 * AppStyle.getScaleFactor(context), ), + // const ASubTitle("Assigned Employee"), + // const SizedBox( + // height: 8, + // ), + // _validate && _serviceReport.engineer == null + // ? ASubTitle( + // _subtitle.requiredWord, + // color: Colors.red, + // ) + // : const SizedBox.shrink(), + // const SizedBox( + // height: 4, + // ), + // EngineersMenu( + // initialValue: _serviceReport.engineer, + // onSelect: (engineer) { + // _serviceReport.engineer = engineer; + // }, + // ), + // const SizedBox( + // height: 8, + // ), // invoice number & code _serviceReport.callLastSituation?.id != 12 ? const SizedBox.shrink() @@ -577,6 +594,10 @@ class _CreateServiceReportState extends State with TickerPr const SizedBox( height: 16, ), + ASubTitle(_subtitle.travelingExpense), + const SizedBox( + height: 4, + ), ATextFormField( initialValue: _serviceReport?.travelingExpense?.toString(), hintText: _subtitle.travelingExpense, @@ -587,19 +608,6 @@ class _CreateServiceReportState extends State with TickerPr _serviceReport.travelingExpense = int.tryParse(value) ?? 0; }, ), - const SizedBox( - height: 8, - ), - ATextFormField( - initialValue: _serviceReport?.comment, - hintText: _subtitle.comment, - textAlign: TextAlign.center, - style: Theme.of(context).textTheme.titleMedium, - textInputType: TextInputType.multiline, - onSaved: (value) { - _serviceReport.comment = value; - }, - ), const SizedBox( height: 8, @@ -607,66 +615,68 @@ class _CreateServiceReportState extends State with TickerPr // Traveling Hours & Working Hours Row( children: [ + // Expanded( + // child: Column( + // crossAxisAlignment: CrossAxisAlignment.start, + // children: [ + // ASubTitle(_subtitle.workingHours), + // const SizedBox( + // height: 8, + // ), + // Row( + // children: [ + // Expanded( + // child: AppTimer( + // timer: _serviceReport.timer, + // onChange: (timer) async { + // _serviceReport.timer = timer; + // return true; + // }, + // ), + // ), + // ], + // ), + // // ATextFormField( + // // initialValue: _serviceReport?.workHours, + // // textAlign: TextAlign.center, + // // hintText: "i.e 3, 3.5, 4", + // // style: Theme.of(context).textTheme.subtitle1, + // // validator: (value) => + // // Validator.isNumeric(value) + // // ? null : _subtitle.requiredWord, + // // textInputType: TextInputType.number, + // // onSaved: (value){ + // // _serviceReport.workHours = value; + // // }, + // // ), + // ], + // ), + // ), + // const SizedBox(width: 8,), Expanded( child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ - ASubTitle(_subtitle.workingHours), + ASubTitle(_subtitle.travelingHours), const SizedBox( - height: 8, + height: 4, ), - Row( - children: [ - Expanded( - child: AppTimer( - timer: _serviceReport.timer, - onChange: (timer) async { - _serviceReport.timer = timer; - return true; - }, - ), - ), - ], + ATextFormField( + initialValue: _serviceReport?.travelingHours, + textAlign: TextAlign.center, + hintText: "i.e 3, 3.5, 4", + style: Theme.of(context).textTheme.subtitle1, + // validator: (value) => + // Validator.isNumeric(value) + // ? null : _subtitle.requiredWord, + textInputType: TextInputType.number, + onSaved: (value) { + _serviceReport.travelingHours = value; + }, ), - // ATextFormField( - // initialValue: _serviceReport?.workHours, - // textAlign: TextAlign.center, - // hintText: "i.e 3, 3.5, 4", - // style: Theme.of(context).textTheme.subtitle1, - // validator: (value) => - // Validator.isNumeric(value) - // ? null : _subtitle.requiredWord, - // textInputType: TextInputType.number, - // onSaved: (value){ - // _serviceReport.workHours = value; - // }, - // ), ], ), ), - // const SizedBox(width: 8,), - // Expanded( - // child: Column( - // crossAxisAlignment: CrossAxisAlignment.start, - // children: [ - // ASubTitle(_subtitle.travelingHours), - // const SizedBox(height: 4,), - // ATextFormField( - // initialValue: _serviceReport?.travelingHours, - // textAlign: TextAlign.center, - // hintText: "i.e 3, 3.5, 4", - // style: Theme.of(context).textTheme.subtitle1, - // // validator: (value) => - // // Validator.isNumeric(value) - // // ? null : _subtitle.requiredWord, - // textInputType: TextInputType.number, - // onSaved: (value){ - // _serviceReport.travelingHours = value; - // }, - // ), - // ], - // ), - // ), ], ), const SizedBox( @@ -718,6 +728,24 @@ class _CreateServiceReportState extends State with TickerPr // ), // ], // ), + + const SizedBox( + height: 8, + ), + ASubTitle(_subtitle.comment), + const SizedBox( + height: 4, + ), + ATextFormField( + initialValue: _serviceReport?.comment, + hintText: "Technical Comment", + textAlign: TextAlign.center, + style: Theme.of(context).textTheme.titleMedium, + textInputType: TextInputType.multiline, + onSaved: (value) { + _serviceReport.comment = value; + }, + ), const SizedBox(height: 8), const ASubTitle("Nurse Signature"), ESignature( diff --git a/lib/views/pages/user/requests/request_details.dart b/lib/views/pages/user/requests/request_details.dart index 0d17f864..36f3f948 100644 --- a/lib/views/pages/user/requests/request_details.dart +++ b/lib/views/pages/user/requests/request_details.dart @@ -254,7 +254,7 @@ class RequestDetailsPage extends StatelessWidget { ), RequestInfoRow( title: _subtitle.maintenanceIssue, - content: serviceRequest.maintenanceIssue, + content: serviceRequest.callComments, ), if (serviceRequest.audio?.isNotEmpty == true) ASoundPlayer( diff --git a/lib/views/widgets/date_and_time/time_picker.dart b/lib/views/widgets/date_and_time/time_picker.dart new file mode 100644 index 00000000..036766e4 --- /dev/null +++ b/lib/views/widgets/date_and_time/time_picker.dart @@ -0,0 +1,69 @@ +import 'package:flutter/material.dart'; +import 'package:test_sa/views/app_style/sizing.dart'; + +class ADateTimePicker extends StatelessWidget { + final DateTime date; + final DateTime from; + final DateTime to; + final Function(DateTime) onDateTimePicker; + + const ADateTimePicker({Key key, this.date, this.onDateTimePicker, this.from, this.to}) : super(key: key); + + @override + Widget build(BuildContext context) { + return ElevatedButton( + style: ElevatedButton.styleFrom( + foregroundColor: Colors.white, + textStyle: Theme.of(context).textTheme.subtitle2, + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(12 * AppStyle.getScaleFactor(context)), + ), + ), + child: Text( + date == null ? "Pick Time" : date.toString().substring(0,date.toString().lastIndexOf(":")), + textScaleFactor: AppStyle.getScaleFactor(context), + ), + onPressed: () async { + // TimeOfDay picked = await showTimePicker(context: context, initialTime: TimeOfDay.now()); + onDateTimePicker(await showDateTimePicker(context: context, initialDate: date, firstDate: from, lastDate: to)); + }, + ); + } +} + +Future showDateTimePicker({ + BuildContext context, + DateTime initialDate, + DateTime firstDate, + DateTime lastDate, +}) async { + initialDate ??= DateTime.now(); + firstDate ??= initialDate.subtract(const Duration(days: 365 * 100)); + lastDate ??= firstDate.add(const Duration(days: 365 * 200)); + + final DateTime selectedDate = await showDatePicker( + context: context, + initialDate: initialDate, + firstDate: firstDate, + lastDate: lastDate, + ); + + if (selectedDate == null) return null; + + if (!context.mounted) return selectedDate; + + final TimeOfDay selectedTime = await showTimePicker( + context: context, + initialTime: TimeOfDay.fromDateTime(selectedDate), + ); + + return selectedTime == null + ? selectedDate + : DateTime( + selectedDate.year, + selectedDate.month, + selectedDate.day, + selectedTime.hour, + selectedTime.minute, + ); +} diff --git a/lib/views/widgets/requests/service_request_item.dart b/lib/views/widgets/requests/service_request_item.dart index 7977048d..2580deef 100644 --- a/lib/views/widgets/requests/service_request_item.dart +++ b/lib/views/widgets/requests/service_request_item.dart @@ -190,7 +190,7 @@ class ServiceRequestItem extends StatelessWidget { child: Padding( padding: const EdgeInsets.symmetric(horizontal: 8), child: Text( - request.maintenanceIssue ?? "No maintenance issue found", + request.callComments ?? "No maintenance issue found", style: Theme.of(context).textTheme.subtitle1.copyWith(color: onItemColor), textAlign: TextAlign.center, ), From 59ca4277a9fc2b8290edcba9c6e6890c1b5a86ae Mon Sep 17 00:00:00 2001 From: zaid_daoud Date: Sun, 4 Jun 2023 14:13:49 +0300 Subject: [PATCH 049/181] Enhancements --- .../pages/user/requests/create_request.dart | 8 +++-- .../report/create_service_report.dart | 31 +++++++++++-------- 2 files changed, 23 insertions(+), 16 deletions(-) diff --git a/lib/views/pages/user/requests/create_request.dart b/lib/views/pages/user/requests/create_request.dart index fb676de4..99ff8077 100644 --- a/lib/views/pages/user/requests/create_request.dart +++ b/lib/views/pages/user/requests/create_request.dart @@ -53,6 +53,7 @@ class CreateRequestPageState extends State { ServiceRequest _serviceRequest; final List _deviceImages = []; bool _isLoading = false; + bool _showDatePicker = false; Device _device; Subtitle _subtitle; final GlobalKey _formKey = GlobalKey(); @@ -215,11 +216,12 @@ class CreateRequestPageState extends State { onSelect: (status) { _dateTime = null; _serviceRequest.firstAction = status; + _showDatePicker = _serviceRequest.firstAction != null && _serviceRequest.firstAction.name == "Need a visit"; _serviceRequestsProvider.notifyListeners(); }, ), - if (_serviceRequest.firstAction != null) 12.height, - if (_serviceRequest.firstAction != null) + if (_showDatePicker) 12.height, + if (_showDatePicker) ADatePicker( date: _dateTime, from: DateTime.now(), @@ -288,7 +290,7 @@ class CreateRequestPageState extends State { Fluttertoast.showToast(msg: _subtitle.pickDevice); return; } - if (_serviceRequest.firstAction != null && _dateTime == null) { + if (_serviceRequest.firstAction != null && _serviceRequest.firstAction.name == "Need a visit" && _dateTime == null) { Fluttertoast.showToast(msg: _subtitle.noDateFound); return; } diff --git a/lib/views/pages/user/requests/report/create_service_report.dart b/lib/views/pages/user/requests/report/create_service_report.dart index b2c6cbc2..eeb512c7 100644 --- a/lib/views/pages/user/requests/report/create_service_report.dart +++ b/lib/views/pages/user/requests/report/create_service_report.dart @@ -55,6 +55,7 @@ class _CreateServiceReportState extends State with TickerPr bool _validate = false; ServiceReport _serviceReport; bool _isLoading = false; + bool _showCommentField = false; Subtitle _subtitle; File _image; @@ -282,6 +283,8 @@ class _CreateServiceReportState extends State with TickerPr request: widget.request, onSelect: (status) { _serviceReport.status = status; + _showCommentField = _serviceReport.status?.name == "Resolved"; + setState(() {}); }, ), ], @@ -328,6 +331,21 @@ class _CreateServiceReportState extends State with TickerPr ), ], ), + if (_showCommentField) + const SizedBox( + height: 8, + ), + if (_showCommentField) + ATextFormField( + initialValue: _serviceReport?.comment, + hintText: _subtitle.comment, + textAlign: TextAlign.center, + style: Theme.of(context).textTheme.titleMedium, + textInputType: TextInputType.multiline, + onSaved: (value) { + _serviceReport.comment = value; + }, + ), SizedBox( height: 8 * AppStyle.getScaleFactor(context), ), @@ -587,19 +605,6 @@ class _CreateServiceReportState extends State with TickerPr _serviceReport.travelingExpense = int.tryParse(value) ?? 0; }, ), - const SizedBox( - height: 8, - ), - ATextFormField( - initialValue: _serviceReport?.comment, - hintText: _subtitle.comment, - textAlign: TextAlign.center, - style: Theme.of(context).textTheme.titleMedium, - textInputType: TextInputType.multiline, - onSaved: (value) { - _serviceReport.comment = value; - }, - ), const SizedBox( height: 8, From 74b7fc4130b6b5c45b6fba3a1adc02c04a15b842 Mon Sep 17 00:00:00 2001 From: Sikander Saleem Date: Mon, 5 Jun 2023 09:15:58 +0300 Subject: [PATCH 050/181] add work order improvements. --- .../api/service_requests_provider.dart | 8 +- lib/models/service_report.dart | 6 +- .../report/create_service_report.dart | 1308 ++++++++--------- 3 files changed, 660 insertions(+), 662 deletions(-) diff --git a/lib/controllers/providers/api/service_requests_provider.dart b/lib/controllers/providers/api/service_requests_provider.dart index d8c01d6f..bdd12b03 100644 --- a/lib/controllers/providers/api/service_requests_provider.dart +++ b/lib/controllers/providers/api/service_requests_provider.dart @@ -319,11 +319,11 @@ class ServiceRequestsProvider extends ChangeNotifier { "reason": report.reason?.toMap(), "startofWorkTime": report.startDate?.toIso8601String() ?? "", "endofWorkTime": report.endDate?.toIso8601String() ?? "", - "workingHours": report.timer?.durationInSecond, + "workingHours": ((report?.endDate?.difference(report?.startDate)?.inMinutes ?? 0) / 60), "travelingHours": report.travelingHours, "travelingExpenses": report.travelingExpense ?? 0, "faultDescription": { - "id": report.faultDescriptionId ?? 0, + "id": report.faultDescriptionId, "defectName": report.type?.name, "workPerformed": report.workPreformed, "estimatedTime": report.operatingHours, @@ -331,8 +331,8 @@ class ServiceRequestsProvider extends ChangeNotifier { "sparePartsWorkOrders": report.parts ?.map( (p) => { - "id": p.id, - "sparePart": {"id": p.reportPartID ?? 0, "partNo": p.code, "partName": p.name}, + "id": p.reportPartID ?? 0, + "sparePart": {"id": p.id, "partNo": p.code, "partName": p.name}, "qty": p.quantity }, ) diff --git a/lib/models/service_report.dart b/lib/models/service_report.dart index 7024bd49..28b117d1 100644 --- a/lib/models/service_report.dart +++ b/lib/models/service_report.dart @@ -10,7 +10,7 @@ import 'package:test_sa/models/timer_model.dart'; class ServiceReport { int id; - String operatingHours; + double operatingHours; DateTime visitDate; DateTime endDate; DateTime startDate; @@ -25,7 +25,7 @@ class ServiceReport { String workPreformed; //String workHours; - String travelingHours; + double travelingHours; String invoiceNumber; String invoiceCode; List parts; @@ -89,7 +89,7 @@ class ServiceReport { _map["endofWorkTime"] = (timer.endAt ?? DateTime.now()).toIso8601String(); _map["workingHours"] = (timer.durationInSecond / 60 / 60).toStringAsFixed(5); } - if (travelingHours != null && travelingHours.isNotEmpty) _map["traveling_hours"] = travelingHours; + if (travelingHours != null && travelingHours.toString().isNotEmpty) _map["traveling_hours"] = travelingHours; // if(workPreformed != null && workPreformed.isNotEmpty){ // _map["faultDescription"] = { // //"id":faultDescriptionId ?? 0, diff --git a/lib/views/pages/user/requests/report/create_service_report.dart b/lib/views/pages/user/requests/report/create_service_report.dart index 477bba08..84d22d83 100644 --- a/lib/views/pages/user/requests/report/create_service_report.dart +++ b/lib/views/pages/user/requests/report/create_service_report.dart @@ -101,6 +101,7 @@ class _CreateServiceReportState extends State with TickerPr child: Stack( children: [ ListView( + padding: const EdgeInsets.all(16), children: [ //AppNameBar(), const SizedBox( @@ -115,22 +116,22 @@ class _CreateServiceReportState extends State with TickerPr ), ), ), - Container( - padding: const EdgeInsets.symmetric(horizontal: 16), - margin: const EdgeInsets.symmetric(horizontal: 16, vertical: 16), - decoration: BoxDecoration(color: AColors.grey, borderRadius: BorderRadius.circular(AppStyle.getBorderRadius(context)), boxShadow: [ - const BoxShadow( - color: AColors.grey, - offset: Offset(0, -1), - ) - ]), - child: Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - const SizedBox( - height: 8, - ), - Wrap( + Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + ASubTitle("Caller Info"), + const SizedBox(height: 8), + Container( + width: double.infinity, + padding: const EdgeInsets.all(16), + margin: const EdgeInsets.symmetric(vertical: 16), + decoration: BoxDecoration(color: AColors.grey, borderRadius: BorderRadius.circular(AppStyle.getBorderRadius(context)), boxShadow: const [ + BoxShadow( + color: AColors.grey, + offset: Offset(0, -1), + ) + ]), + child: Wrap( spacing: 10, children: [ ASubTitle( @@ -153,157 +154,138 @@ class _CreateServiceReportState extends State with TickerPr ) ], ), - const Divider(), + ), - // Report type and Reasons - Row( + ASubTitle("Work Order Details"), + Container( + width: double.infinity, + padding: const EdgeInsets.all(16), + margin: const EdgeInsets.symmetric(vertical: 16), + decoration: BoxDecoration(color: AColors.grey, borderRadius: BorderRadius.circular(AppStyle.getBorderRadius(context)), boxShadow: [ + BoxShadow( + color: AColors.grey, + offset: Offset(0, -1), + ), + ]), + child: Column( + mainAxisSize: MainAxisSize.min, children: [ - // Report Status - // Expanded( - // child: Column( - // crossAxisAlignment: CrossAxisAlignment.start, - // children: [ - // ASubTitle(_subtitle.reportType), - // _validate && _serviceReport.type == null ? - // ASubTitle(_subtitle.requiredWord,color: Colors.red,): - // const SizedBox.shrink(), - // const SizedBox(height: 4,), - // ServiceReportTypeMenu( - // initialValue: _serviceReport.type, - // onSelect: (status){ - // _serviceReport.type = status; - // }, - // ), - // ], - // ), - // ), - // const SizedBox(width: 8,), - // visit date - Expanded( - child: Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - ASubTitle(_subtitle.visitDate), - _validate && _serviceReport.visitDate == null - ? ASubTitle( - _subtitle.requiredWord, - color: Colors.red, - ) - : const SizedBox.shrink(), - Row( + // Report type and Reasons + Row( + children: [ + // Report Status + // Expanded( + // child: Column( + // crossAxisAlignment: CrossAxisAlignment.start, + // children: [ + // ASubTitle(_subtitle.reportType), + // _validate && _serviceReport.type == null ? + // ASubTitle(_subtitle.requiredWord,color: Colors.red,): + // const SizedBox.shrink(), + // const SizedBox(height: 4,), + // ServiceReportTypeMenu( + // initialValue: _serviceReport.type, + // onSelect: (status){ + // _serviceReport.type = status; + // }, + // ), + // ], + // ), + // ), + // const SizedBox(width: 8,), + // visit date + Expanded( + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, children: [ - Expanded( - child: ADatePicker( - date: _serviceReport.visitDate, - from: DateTime.now().subtract(const Duration(days: 365)), - to: DateTime.now().add(const Duration(days: 365)), - onDatePicker: (date) { - _serviceReport.visitDate = date; - setState(() {}); - }, - ), + ASubTitle(_subtitle.visitDate), + _validate && _serviceReport.visitDate == null + ? ASubTitle( + _subtitle.requiredWord, + color: Colors.red, + ) + : const SizedBox.shrink(), + Row( + children: [ + Expanded( + child: ADatePicker( + date: _serviceReport.visitDate, + from: DateTime.now().subtract(const Duration(days: 365)), + to: DateTime.now().add(const Duration(days: 365)), + onDatePicker: (date) { + _serviceReport.visitDate = date; + setState(() {}); + }, + ), + ), + ], ), ], ), - ], - ), + ), + ], ), - ], - ), - const SizedBox( - height: 8, - ), - // device sn - Visibility( - visible: widget.request.deviceSerialNumber == null, - child: Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - ASubTitle(_subtitle.deviceSN), - _validate && _serviceReport.device?.id == null - ? ASubTitle( - _subtitle.requiredWord, - color: Colors.red, - ) - : const SizedBox.shrink(), - AutoCompleteDeviceField( - hospitalId: widget.request.hospitalId, - initialValue: _serviceReport.device, - onPick: (id) { - _serviceReport.device.id = id; - }, - ), - const SizedBox( - height: 8, - ), - ], - ), - ), - const SizedBox( - height: 8, - ), - ASubTitle(_subtitle.serviceType), - _validate && _serviceReport.assetType == null - ? ASubTitle( - _subtitle.requiredWord, - color: Colors.red, - ) - : const SizedBox.shrink(), - const SizedBox( - height: 4, - ), - ServiceAssetTypeMenu( - initialValue: _serviceReport.assetType, - onSelect: (status) { - _serviceReport.assetType = status; - }, - ), - const SizedBox( - height: 8, - ), - // Report status and Service Type - Row( - children: [ - // report status - Expanded( + const SizedBox( + height: 8, + ), + // device sn + Visibility( + visible: widget.request.deviceSerialNumber == null, child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ - ASubTitle(_subtitle.reportStatus), - _validate && _serviceReport.status == null + ASubTitle(_subtitle.deviceSN), + _validate && _serviceReport.device?.id == null ? ASubTitle( _subtitle.requiredWord, color: Colors.red, ) : const SizedBox.shrink(), - const SizedBox( - height: 4, - ), - ServiceReportStatusMenu( - report: _serviceReport, - request: widget.request, - onSelect: (status) { - _serviceReport.status = status; + AutoCompleteDeviceField( + hospitalId: widget.request.hospitalId, + initialValue: _serviceReport.device, + onPick: (id) { + _serviceReport.device.id = id; }, ), + const SizedBox( + height: 8, + ), ], ), ), const SizedBox( - width: 8, - ), - // Provider.of(context).isLoading == null - // ? const SizedBox.shrink(): - // Call's last Situation - Consumer( - builder: (_, provider, __) { - if (provider.isLoading == null) return const SizedBox.shrink(); - return Expanded( + height: 8, + ), + ASubTitle(_subtitle.serviceType), + _validate && _serviceReport.assetType == null + ? ASubTitle( + _subtitle.requiredWord, + color: Colors.red, + ) + : const SizedBox.shrink(), + const SizedBox( + height: 4, + ), + ServiceAssetTypeMenu( + initialValue: _serviceReport.assetType, + onSelect: (status) { + _serviceReport.assetType = status; + }, + ), + const SizedBox( + height: 8, + ), + // Report status and Service Type + Row( + children: [ + // report status + Expanded( child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ - ASubTitle(_subtitle.callLastSituation), - _validate && _serviceReport.callLastSituation == null + ASubTitle(_subtitle.reportStatus), + _validate && _serviceReport.status == null ? ASubTitle( _subtitle.requiredWord, color: Colors.red, @@ -312,566 +294,582 @@ class _CreateServiceReportState extends State with TickerPr const SizedBox( height: 4, ), - ServiceReportLastCallsMenu( + ServiceReportStatusMenu( report: _serviceReport, + request: widget.request, onSelect: (status) { - if (status?.value == 12 || _serviceReport.callLastSituation?.value == 12) { - _serviceReport.callLastSituation = status; - setState(() {}); - } else { - _serviceReport.callLastSituation = status; - } + _serviceReport.status = status; }, ), ], ), - ); - }, + ), + const SizedBox( + width: 8, + ), + // Provider.of(context).isLoading == null + // ? const SizedBox.shrink(): + // Call's last Situation + Consumer( + builder: (_, provider, __) { + if (provider.isLoading == null) return const SizedBox.shrink(); + return Expanded( + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + ASubTitle(_subtitle.callLastSituation), + _validate && _serviceReport.callLastSituation == null + ? ASubTitle( + _subtitle.requiredWord, + color: Colors.red, + ) + : const SizedBox.shrink(), + const SizedBox( + height: 4, + ), + ServiceReportLastCallsMenu( + report: _serviceReport, + onSelect: (status) { + if (status?.value == 12 || _serviceReport.callLastSituation?.value == 12) { + _serviceReport.callLastSituation = status; + setState(() {}); + } else { + _serviceReport.callLastSituation = status; + } + }, + ), + ], + ), + ); + }, + ), + ], ), - ], - ), - SizedBox( - height: 8 * AppStyle.getScaleFactor(context), - ), - Row( - children: [ - Expanded( - child: Column( - crossAxisAlignment: CrossAxisAlignment.stretch, - children: [ - const ASubTitle("Start of Work"), - SizedBox( - height: 8 * AppStyle.getScaleFactor(context), - ), - ADateTimePicker( - date: _serviceReport.startDate, - from: DateTime.now().subtract(const Duration(days: 365)), - to: DateTime.now().add(const Duration(days: 365)), - onDateTimePicker: (date) { - _serviceReport.startDate = date; - setState(() {}); - }, - ), - ], - ), + SizedBox( + height: 8 * AppStyle.getScaleFactor(context), ), - const SizedBox(width: 8), - Expanded( - child: Column( - crossAxisAlignment: CrossAxisAlignment.stretch, - children: [ - const ASubTitle("End of Work"), - SizedBox( - height: 8 * AppStyle.getScaleFactor(context), + Row( + children: [ + Expanded( + child: Column( + crossAxisAlignment: CrossAxisAlignment.stretch, + children: [ + const ASubTitle("Start of Work"), + SizedBox( + height: 8 * AppStyle.getScaleFactor(context), + ), + ADateTimePicker( + date: _serviceReport.startDate, + from: DateTime.now().subtract(const Duration(days: 365)), + to: DateTime.now().add(const Duration(days: 365)), + onDateTimePicker: (date) { + _serviceReport.startDate = date; + setState(() {}); + }, + ), + ], ), - ADateTimePicker( - date: _serviceReport.endDate, - from: DateTime.now().subtract(const Duration(days: 365)), - to: DateTime.now().add(const Duration(days: 365)), - onDateTimePicker: (date) { - _serviceReport.endDate = date; - setState(() {}); - }, + ), + const SizedBox(width: 8), + Expanded( + child: Column( + crossAxisAlignment: CrossAxisAlignment.stretch, + children: [ + const ASubTitle("End of Work"), + SizedBox( + height: 8 * AppStyle.getScaleFactor(context), + ), + ADateTimePicker( + date: _serviceReport.endDate, + from: DateTime.now().subtract(const Duration(days: 365)), + to: DateTime.now().add(const Duration(days: 365)), + onDateTimePicker: (date) { + _serviceReport.endDate = date; + setState(() {}); + }, + ), + ], ), - ], - ), + ), + ], + ), + ASubTitle(_subtitle.workingHours), + const SizedBox(height: 4), + ATextFormField( + initialValue: null, + textAlign: TextAlign.center, + hintText: _serviceReport.startDate == null + ? "0" + : ((_serviceReport?.endDate?.difference(_serviceReport?.startDate)?.inMinutes ?? 0) / 60)?.toStringAsFixed(2)?.toString() ?? "0", + enable: false, + style: Theme.of(context).textTheme.subtitle1, + validator: (value) => Validator.isNumeric(value) ? null : _subtitle.requiredWord, + textInputType: TextInputType.number, + onSaved: (value) { + // _serviceReport.workHours = value; + }, ), - ], - ), - ASubTitle(_subtitle.workingHours), - const SizedBox(height: 4), - ATextFormField( - initialValue: null, - textAlign: TextAlign.center, - hintText: _serviceReport.startDate == null ? "0" : _serviceReport?.endDate?.difference(_serviceReport?.startDate)?.inHours?.toString() ?? "0", - enable: false, - style: Theme.of(context).textTheme.subtitle1, - validator: (value) => Validator.isNumeric(value) ? null : _subtitle.requiredWord, - textInputType: TextInputType.number, - onSaved: (value) { - // _serviceReport.workHours = value; - }, - ), - SizedBox( - height: 8 * AppStyle.getScaleFactor(context), - ), - // const ASubTitle("Assigned Employee"), - // const SizedBox( - // height: 8, - // ), - // _validate && _serviceReport.engineer == null - // ? ASubTitle( - // _subtitle.requiredWord, - // color: Colors.red, - // ) - // : const SizedBox.shrink(), - // const SizedBox( - // height: 4, - // ), - // EngineersMenu( - // initialValue: _serviceReport.engineer, - // onSelect: (engineer) { - // _serviceReport.engineer = engineer; - // }, - // ), - // const SizedBox( - // height: 8, - // ), - // invoice number & code - _serviceReport.callLastSituation?.id != 12 - ? const SizedBox.shrink() - : Row( - children: [ - Expanded( - child: Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - ASubTitle(_subtitle.invoiceNumber), - const SizedBox( - height: 8, + SizedBox( + height: 8 * AppStyle.getScaleFactor(context), + ), + const ASubTitle("Assigned Employee"), + const SizedBox(height: 8), + _validate && _serviceReport.engineer == null + ? ASubTitle( + _subtitle.requiredWord, + color: Colors.red, + ) + : const SizedBox.shrink(), + const SizedBox(height: 4), + EngineersMenu( + initialValue: _serviceReport.engineer, + onSelect: (engineer) { + _serviceReport.engineer = engineer; + }, + ), + const SizedBox(height: 8), + // invoice number & code + _serviceReport.callLastSituation?.id != 12 + ? const SizedBox.shrink() + : Row( + children: [ + Expanded( + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + ASubTitle(_subtitle.invoiceNumber), + const SizedBox( + height: 8, + ), + ATextFormField( + initialValue: _serviceReport?.invoiceNumber, + textAlign: TextAlign.center, + style: Theme.of(context).textTheme.subtitle1, + validator: (value) => Validator.hasValue(value) ? null : _subtitle.requiredWord, + textInputType: TextInputType.number, + onSaved: (value) { + _serviceReport.invoiceNumber = value; + }, + ), + ], ), - ATextFormField( - initialValue: _serviceReport?.invoiceNumber, - textAlign: TextAlign.center, - style: Theme.of(context).textTheme.subtitle1, - validator: (value) => Validator.hasValue(value) ? null : _subtitle.requiredWord, - textInputType: TextInputType.number, - onSaved: (value) { - _serviceReport.invoiceNumber = value; - }, + ), + const SizedBox(width: 8), + Expanded( + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + ASubTitle(_subtitle.invoiceCode), + const SizedBox(height: 4), + ATextFormField( + initialValue: _serviceReport?.invoiceCode, + textAlign: TextAlign.center, + style: Theme.of(context).textTheme.subtitle1, + validator: (value) => Validator.hasValue(value) ? null : _subtitle.requiredWord, + textInputType: TextInputType.text, + onSaved: (value) { + _serviceReport.invoiceCode = value; + }, + ), + ], ), - ], - ), - ), - const SizedBox( - width: 8, + ), + ], ), - Expanded( - child: Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - ASubTitle(_subtitle.invoiceCode), - const SizedBox( - height: 4, - ), - ATextFormField( - initialValue: _serviceReport?.invoiceCode, - textAlign: TextAlign.center, - style: Theme.of(context).textTheme.subtitle1, - validator: (value) => Validator.hasValue(value) ? null : _subtitle.requiredWord, - textInputType: TextInputType.text, - onSaved: (value) { - _serviceReport.invoiceCode = value; - }, - ), - ], + const SizedBox(height: 8), + Row( + children: [ + ASubTitle(_subtitle.faultDescription), + Expanded( + child: SizedBox( + height: 32 * AppStyle.getScaleFactor(context), + child: SpeechToTextButton( + controller: _faultController, + mini: true, ), ), - ], - ), - const SizedBox(height: 8), - Row( - children: [ - ASubTitle(_subtitle.faultDescription), - Expanded( - child: SizedBox( - height: 32 * AppStyle.getScaleFactor(context), - child: SpeechToTextButton( - controller: _faultController, - mini: true, ), - ), + ], ), - ], - ), - const SizedBox( - height: 4, - ), - ATextFormField( - initialValue: _serviceReport?.faultDescriptionId?.toString(), - textAlign: TextAlign.center, - controller: _faultController, - style: Theme.of(context).textTheme.titleMedium, - validator: (value) => Validator.hasValue(value) ? null : _subtitle.requiredWord, - textInputType: TextInputType.multiline, - onSaved: (value) { - _serviceReport.faultDescriptionId = int.tryParse(value) ?? 0; - }, - ), - const SizedBox( - height: 8, - ), - Row( - children: [ - ASubTitle(_subtitle.workPreformed), - Expanded( - child: SizedBox( - height: 32 * AppStyle.getScaleFactor(context), - child: SpeechToTextButton( - controller: _workPreformedController, - mini: true, + const SizedBox(height: 4), + ATextFormField( + initialValue: _serviceReport?.faultDescriptionId?.toString(), + textAlign: TextAlign.center, + controller: _faultController, + style: Theme.of(context).textTheme.titleMedium, + validator: (value) => Validator.hasValue(value) ? null : _subtitle.requiredWord, + textInputType: TextInputType.multiline, + onSaved: (value) { + _serviceReport.faultDescriptionId = int.tryParse(value) ?? 0; + }, + ), + const SizedBox(height: 8), + Row( + children: [ + ASubTitle(_subtitle.workPreformed), + Expanded( + child: SizedBox( + height: 32 * AppStyle.getScaleFactor(context), + child: SpeechToTextButton( + controller: _workPreformedController, + mini: true, + ), + ), ), - ), + ], ), - ], - ), - const SizedBox( - height: 4, - ), - ATextFormField( - initialValue: _serviceReport?.workPreformed, - textAlign: TextAlign.center, - controller: _workPreformedController, - style: Theme.of(context).textTheme.subtitle1, - validator: (value) => Validator.hasValue(value) ? null : _subtitle.requiredWord, - textInputType: TextInputType.multiline, - onSaved: (value) { - _serviceReport.workPreformed = value; - }, - ), - const SizedBox( - height: 8, - ), + const SizedBox(height: 4), + ATextFormField( + initialValue: _serviceReport?.workPreformed, + textAlign: TextAlign.center, + controller: _workPreformedController, + style: Theme.of(context).textTheme.subtitle1, + validator: (value) => Validator.hasValue(value) ? null : _subtitle.requiredWord, + textInputType: TextInputType.multiline, + onSaved: (value) { + _serviceReport.workPreformed = value; + }, + ), + const SizedBox(height: 8), - const SizedBox( - height: 8, - ), - Row( - children: [ - // reasons - Expanded( - child: Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - ASubTitle(_subtitle.reasons), - const SizedBox( - height: 4, + const SizedBox(height: 8), + Row( + children: [ + // reasons + Expanded( + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + ASubTitle(_subtitle.reasons), + const SizedBox(height: 4), + ServiceReportReasonsMenu( + initialValue: _serviceReport.reason, + onSelect: (status) { + _serviceReport.reason = status; + }, + ), + ], ), - ServiceReportReasonsMenu( - initialValue: _serviceReport.reason, - onSelect: (status) { - _serviceReport.reason = status; - }, + ), + const SizedBox(width: 8), + Expanded( + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + ASubTitle(_subtitle.attachImage), + AMiniOneImagePicker( + //error: _validate && _serviceReport.image == null, + image: _image, + onPick: (image) { + _image = image; + _serviceReport.image = "${image.path.split("/").last}|${base64Encode(image.readAsBytesSync())}"; + }, + ), + ], ), - ], - ), + ), + ], + ), + const SizedBox(height: 8), + ASubTitle(_subtitle.repairLocation), + const SizedBox(height: 4), + ServiceReportRepairLocation( + initialValue: _serviceReport.repairLocation, + onSelect: (status) { + _serviceReport.repairLocation = status; + }, ), + const SizedBox(height: 16), + ASubTitle(_subtitle.travelingExpense), const SizedBox( - width: 8, + height: 4, ), - Expanded( - child: Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - ASubTitle(_subtitle.attachImage), - AMiniOneImagePicker( - //error: _validate && _serviceReport.image == null, - image: _image, - onPick: (image) { - _image = image; - _serviceReport.image = "${image.path.split("/").last}|${base64Encode(image.readAsBytesSync())}"; - }, - ), - ], - ), + ATextFormField( + initialValue: _serviceReport?.travelingExpense?.toString(), + hintText: _subtitle.travelingExpense, + textAlign: TextAlign.center, + style: Theme.of(context).textTheme.titleMedium, + textInputType: TextInputType.number, + onSaved: (value) { + _serviceReport.travelingExpense = int.tryParse(value) ?? 0; + }, ), - ], - ), - const SizedBox( - height: 8, - ), - ASubTitle(_subtitle.repairLocation), - const SizedBox( - height: 4, - ), - ServiceReportRepairLocation( - initialValue: _serviceReport.repairLocation, - onSelect: (status) { - _serviceReport.repairLocation = status; - }, - ), - const SizedBox( - height: 16, - ), - ASubTitle(_subtitle.travelingExpense), - const SizedBox( - height: 4, - ), - ATextFormField( - initialValue: _serviceReport?.travelingExpense?.toString(), - hintText: _subtitle.travelingExpense, - textAlign: TextAlign.center, - style: Theme.of(context).textTheme.titleMedium, - textInputType: TextInputType.number, - onSaved: (value) { - _serviceReport.travelingExpense = int.tryParse(value) ?? 0; - }, - ), - const SizedBox( - height: 8, - ), - // Traveling Hours & Working Hours - Row( - children: [ - // Expanded( - // child: Column( - // crossAxisAlignment: CrossAxisAlignment.start, - // children: [ - // ASubTitle(_subtitle.workingHours), - // const SizedBox( - // height: 8, + const SizedBox( + height: 8, + ), + // Traveling Hours & Working Hours + Row( + children: [ + // Expanded( + // child: Column( + // crossAxisAlignment: CrossAxisAlignment.start, + // children: [ + // ASubTitle(_subtitle.workingHours), + // const SizedBox( + // height: 8, + // ), + // Row( + // children: [ + // Expanded( + // child: AppTimer( + // timer: _serviceReport.timer, + // onChange: (timer) async { + // _serviceReport.timer = timer; + // return true; + // }, + // ), + // ), + // ], + // ), + // // ATextFormField( + // // initialValue: _serviceReport?.workHours, + // // textAlign: TextAlign.center, + // // hintText: "i.e 3, 3.5, 4", + // // style: Theme.of(context).textTheme.subtitle1, + // // validator: (value) => + // // Validator.isNumeric(value) + // // ? null : _subtitle.requiredWord, + // // textInputType: TextInputType.number, + // // onSaved: (value){ + // // _serviceReport.workHours = value; + // // }, + // // ), + // ], + // ), + // ), + // const SizedBox(width: 8,), + Expanded( + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + ASubTitle(_subtitle.travelingHours), + const SizedBox( + height: 4, + ), + ATextFormField( + initialValue: _serviceReport?.travelingHours?.toString(), + textAlign: TextAlign.center, + hintText: "i.e 3, 3.5, 4", + style: Theme.of(context).textTheme.subtitle1, + // validator: (value) => + // Validator.isNumeric(value) + // ? null : _subtitle.requiredWord, + textInputType: TextInputType.number, + onSaved: (value) { + _serviceReport.travelingHours = double.tryParse(value) ?? 0.0; + }, + ), + ], + ), + ), + ], + ), + const SizedBox( + height: 8, + ), + // Operating Hours and Job Sheet Number + // Row( + // children: [ + // Expanded( + // child: Column( + // crossAxisAlignment: CrossAxisAlignment.start, + // children: [ + // ASubTitle(_subtitle.operatingHours), + // const SizedBox(height: 4,), + // ATextFormField( + // initialValue: _serviceReport?.operatingHours, + // textAlign: TextAlign.center, + // hintText: "i.e 3, 3.5, 4", + // style: Theme.of(context).textTheme.subtitle1, + // validator: (value) => + // Validator.isNumeric(value) + // ? null : _subtitle.requiredWord, + // textInputType: TextInputType.number, + // onSaved: (value){ + // _serviceReport.operatingHours = value; + // }, + // ), + // ], // ), - // Row( + // ), + // const SizedBox(width: 8,), + // Expanded( + // child: Column( + // crossAxisAlignment: CrossAxisAlignment.start, // children: [ - // Expanded( - // child: AppTimer( - // timer: _serviceReport.timer, - // onChange: (timer) async { - // _serviceReport.timer = timer; - // return true; - // }, - // ), + // ASubTitle(_subtitle.jobSheetNumber), + // const SizedBox(height: 4,), + // ATextFormField( + // initialValue: _serviceReport?.jobSheetNumber, + // textAlign: TextAlign.center, + // style: Theme.of(context).textTheme.subtitle1, + // textInputType: TextInputType.name, + // onSaved: (value){ + // _serviceReport.jobSheetNumber = value; + // }, // ), // ], // ), - // // ATextFormField( - // // initialValue: _serviceReport?.workHours, - // // textAlign: TextAlign.center, - // // hintText: "i.e 3, 3.5, 4", - // // style: Theme.of(context).textTheme.subtitle1, - // // validator: (value) => - // // Validator.isNumeric(value) - // // ? null : _subtitle.requiredWord, - // // textInputType: TextInputType.number, - // // onSaved: (value){ - // // _serviceReport.workHours = value; - // // }, - // // ), - // ], - // ), + // ), + // ], // ), - // const SizedBox(width: 8,), - Expanded( - child: Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - ASubTitle(_subtitle.travelingHours), - const SizedBox( - height: 4, - ), - ATextFormField( - initialValue: _serviceReport?.travelingHours, - textAlign: TextAlign.center, - hintText: "i.e 3, 3.5, 4", - style: Theme.of(context).textTheme.subtitle1, - // validator: (value) => - // Validator.isNumeric(value) - // ? null : _subtitle.requiredWord, - textInputType: TextInputType.number, - onSaved: (value) { - _serviceReport.travelingHours = value; - }, - ), - ], - ), + + const SizedBox(height: 8), + ASubTitle(_subtitle.comment), + const SizedBox(height: 4), + ATextFormField( + initialValue: _serviceReport?.comment, + hintText: "Technical Comment", + textAlign: TextAlign.center, + style: Theme.of(context).textTheme.titleMedium, + textInputType: TextInputType.multiline, + onSaved: (value) { + _serviceReport.comment = value; + }, + ), + const SizedBox(height: 8), + const ASubTitle("Nurse Signature"), + ESignature( + oldSignature: _serviceReport.signatureNurse, + newSignature: _serviceReport.localNurseSignature, + onSaved: (signature) { + if (signature == null || signature.isEmpty) { + return; + } + _serviceReport.localNurseSignature = signature; + _serviceReport.signatureNurse = "${DateTime.now().toIso8601String()}.png|${base64Encode(signature)}"; + }, + ), + const SizedBox(height: 8), + const ASubTitle("Engineer Signature"), + ESignature( + oldSignature: _serviceReport.signatureEngineer, + newSignature: _serviceReport.localNurseSignature, + onSaved: (signature) { + if (signature == null || signature.isEmpty) { + return; + } + _serviceReport.localNurseSignature = signature; + _serviceReport.signatureEngineer = "${DateTime.now().toIso8601String()}.png|${base64Encode(signature)}"; + }, + ), + const SizedBox( + height: 8, ), ], ), - const SizedBox( - height: 8, - ), - // Operating Hours and Job Sheet Number - // Row( - // children: [ - // Expanded( - // child: Column( - // crossAxisAlignment: CrossAxisAlignment.start, - // children: [ - // ASubTitle(_subtitle.operatingHours), - // const SizedBox(height: 4,), - // ATextFormField( - // initialValue: _serviceReport?.operatingHours, - // textAlign: TextAlign.center, - // hintText: "i.e 3, 3.5, 4", - // style: Theme.of(context).textTheme.subtitle1, - // validator: (value) => - // Validator.isNumeric(value) - // ? null : _subtitle.requiredWord, - // textInputType: TextInputType.number, - // onSaved: (value){ - // _serviceReport.operatingHours = value; - // }, - // ), - // ], - // ), - // ), - // const SizedBox(width: 8,), - // Expanded( - // child: Column( - // crossAxisAlignment: CrossAxisAlignment.start, - // children: [ - // ASubTitle(_subtitle.jobSheetNumber), - // const SizedBox(height: 4,), - // ATextFormField( - // initialValue: _serviceReport?.jobSheetNumber, - // textAlign: TextAlign.center, - // style: Theme.of(context).textTheme.subtitle1, - // textInputType: TextInputType.name, - // onSaved: (value){ - // _serviceReport.jobSheetNumber = value; - // }, - // ), - // ], - // ), - // ), - // ], - // ), + ), - const SizedBox( - height: 8, - ), - ASubTitle(_subtitle.comment), - const SizedBox( - height: 4, - ), - ATextFormField( - initialValue: _serviceReport?.comment, - hintText: "Technical Comment", - textAlign: TextAlign.center, - style: Theme.of(context).textTheme.titleMedium, - textInputType: TextInputType.multiline, - onSaved: (value) { - _serviceReport.comment = value; - }, - ), - const SizedBox(height: 8), - const ASubTitle("Nurse Signature"), - ESignature( - oldSignature: _serviceReport.signatureNurse, - newSignature: _serviceReport.localNurseSignature, - onSaved: (signature) { - if (signature == null || signature.isEmpty) { - return; - } - _serviceReport.localNurseSignature = signature; - _serviceReport.signatureNurse = "${DateTime.now().toIso8601String()}.png|${base64Encode(signature)}"; - }, - ), - const SizedBox( - height: 8, - ), - const ASubTitle("Engineer Signature"), - ESignature( - oldSignature: _serviceReport.signatureEngineer, - newSignature: _serviceReport.localNurseSignature, - onSaved: (signature) { - if (signature == null || signature.isEmpty) { - return; - } - _serviceReport.localNurseSignature = signature; - _serviceReport.signatureEngineer = "${DateTime.now().toIso8601String()}.png|${base64Encode(signature)}"; - }, - ), - const SizedBox( - height: 8, - ), - // Part Number and Quantity - Row( + // Part Number and Quantity + ASubTitle("Spare Parts"), + Container( + width: double.infinity, + padding: const EdgeInsets.all(16), + margin: const EdgeInsets.symmetric(vertical: 16), + decoration: BoxDecoration(color: AColors.grey, borderRadius: BorderRadius.circular(AppStyle.getBorderRadius(context)), boxShadow: [ + BoxShadow( + color: AColors.grey, + offset: Offset(0, -1), + ) + ]), + child: Column( + mainAxisSize: MainAxisSize.min, children: [ - Expanded( - flex: 3, - child: Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - ASubTitle(_subtitle.partNumber), - _validate && _serviceReport.parts == null - ? ASubTitle( - _subtitle.requiredWord, - color: Colors.red, - ) - : const SizedBox.shrink(), - const SizedBox( - height: 4, - ), - AutoCompletePartsField( - onPick: (part) { - _serviceReport.parts.add(part); - }, + Row( + children: [ + Expanded( + flex: 3, + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + ASubTitle(_subtitle.partNumber), + _validate && _serviceReport.parts == null + ? ASubTitle( + _subtitle.requiredWord, + color: Colors.red, + ) + : const SizedBox.shrink(), + const SizedBox( + height: 4, + ), + AutoCompletePartsField( + onPick: (part) { + _serviceReport.parts.add(part); + }, + ), + ], ), - ], - ), + ), + ], + ), + SizedBox( + height: 8 * AppStyle.getScaleFactor(context), + ), + Row( + children: [ + Expanded(flex: 3, child: Text(_subtitle.number)), + Expanded(flex: 1, child: Text(_subtitle.quantity)), + ], + ), + Column( + children: List.generate(_serviceReport.parts.length, (index) { + Part _part = _serviceReport.parts[index]; + return PartItem( + part: _part, + onDelete: (part) { + _serviceReport.parts.remove(part); + setState(() {}); + }, + ); + }), + ), + const SizedBox( + height: 16, ), ], ), - SizedBox( - height: 8 * AppStyle.getScaleFactor(context), - ), - Row( - children: [ - Expanded(flex: 3, child: Text(_subtitle.number)), - Expanded(flex: 1, child: Text(_subtitle.quantity)), - ], - ), - Column( - children: List.generate(_serviceReport.parts.length, (index) { - Part _part = _serviceReport.parts[index]; - return PartItem( - part: _part, - onDelete: (part) { - _serviceReport.parts.remove(part); - setState(() {}); - }, - ); - }), - ), - const SizedBox( - height: 16, - ), - ], - ), + ), + ], ), - Padding( - padding: const EdgeInsets.all(16.0), - child: AButton( - text: _subtitle.submit, - onPressed: () async { - _validate = true; - if (!_formKey.currentState.validate()) { - setState(() {}); - return; - } - if (!_serviceReport.validate()) return; - _formKey.currentState.save(); + AButton( + text: _subtitle.submit, + onPressed: () async { + _validate = true; + // if (!_formKey.currentState.validate()) { + // setState(() {}); + // return; + // } + if (!_serviceReport.validate()) return; + _formKey.currentState.save(); - _isLoading = true; - setState(() {}); + _isLoading = true; + setState(() {}); - int status = await _serviceRequestsProvider.createServiceReport( - user: _userProvider.user, - host: _settingProvider.host, - report: _serviceReport, - request: widget.request, + int status = await _serviceRequestsProvider.createServiceReport( + user: _userProvider.user, + host: _settingProvider.host, + report: _serviceReport, + request: widget.request, + ); + print(6); + print(status); + _isLoading = false; + setState(() {}); + if (status >= 200 && status < 300) { + Fluttertoast.showToast( + msg: _subtitle.requestCompleteSuccessfully, ); - print(6); - print(status); - _isLoading = false; - setState(() {}); - if (status >= 200 && status < 300) { - Fluttertoast.showToast( - msg: _subtitle.requestCompleteSuccessfully, - ); - Navigator.of(context).pop(); - Navigator.of(context).pop(); - } else { - String errorMessage = HttpStatusManger.getStatusMessage(status: status, subtitle: _subtitle); - ScaffoldMessenger.of(context).showSnackBar(SnackBar( - content: Text(errorMessage), - )); - } - }, - ), + Navigator.of(context).pop(); + Navigator.of(context).pop(); + } else { + String errorMessage = HttpStatusManger.getStatusMessage(status: status, subtitle: _subtitle); + ScaffoldMessenger.of(context).showSnackBar(SnackBar( + content: Text(errorMessage), + )); + } + }, ), const SizedBox( height: 300, From c0f801c1c1984568c61e35251cc3b5315c882852 Mon Sep 17 00:00:00 2001 From: zaid_daoud Date: Mon, 5 Jun 2023 10:15:44 +0300 Subject: [PATCH 051/181] Review Comment in Add Work Order Screen --- .../providers/api/service_requests_provider.dart | 4 ++-- lib/models/service_report.dart | 4 ++++ lib/views/pages/user/requests/create_request.dart | 7 +++---- .../pages/user/requests/report/create_service_report.dart | 8 +++----- 4 files changed, 12 insertions(+), 11 deletions(-) diff --git a/lib/controllers/providers/api/service_requests_provider.dart b/lib/controllers/providers/api/service_requests_provider.dart index d8c01d6f..9ed361c8 100644 --- a/lib/controllers/providers/api/service_requests_provider.dart +++ b/lib/controllers/providers/api/service_requests_provider.dart @@ -323,7 +323,7 @@ class ServiceRequestsProvider extends ChangeNotifier { "travelingHours": report.travelingHours, "travelingExpenses": report.travelingExpense ?? 0, "faultDescription": { - "id": report.faultDescriptionId ?? 0, + "id": report.faultDescriptionId, "defectName": report.type?.name, "workPerformed": report.workPreformed, "estimatedTime": report.operatingHours, @@ -337,7 +337,7 @@ class ServiceRequestsProvider extends ChangeNotifier { }, ) ?.toList(), - "reviewComment": "", + "reviewComment": report.reviewComment ?? "", "comment": report.comment, "attachmentsWorkOrder": request.devicePhotos?.map((e) => {"name": e})?.toList(), "equipmentStatus": report.status?.toMap(), diff --git a/lib/models/service_report.dart b/lib/models/service_report.dart index 7024bd49..1fca48b5 100644 --- a/lib/models/service_report.dart +++ b/lib/models/service_report.dart @@ -40,6 +40,7 @@ class ServiceReport { Uint8List localNurseSignature; Uint8List localEngineerSignature; int travelingExpense; + String reviewComment; ServiceReport({ this.id, @@ -72,6 +73,7 @@ class ServiceReport { this.repairLocation, this.travelingExpense, this.startDate, + this.reviewComment, }); Map toMap(ServiceRequest request) { @@ -129,6 +131,7 @@ class ServiceReport { _map["startofWorkTime"] = startDate; _map["endofWorkTime"] = endDate; _map["workingHours"] = endDate?.difference(startDate)?.inHours ?? 0; + _map["reviewComment"] = reviewComment; return _map; } @@ -186,6 +189,7 @@ class ServiceReport { device: Device.fromJson(parsedJson["callRequest"]["asset"]), signatureNurse: URLs.getFileUrl(parsedJson["nurseSignature"]), signatureEngineer: URLs.getFileUrl(parsedJson["engSignature"]), + reviewComment: parsedJson['reviewComment'], ); } diff --git a/lib/views/pages/user/requests/create_request.dart b/lib/views/pages/user/requests/create_request.dart index efe3959c..569eeff9 100644 --- a/lib/views/pages/user/requests/create_request.dart +++ b/lib/views/pages/user/requests/create_request.dart @@ -14,7 +14,6 @@ import 'package:test_sa/controllers/validator/validator.dart'; import 'package:test_sa/extensions/int_extensions.dart'; import 'package:test_sa/extensions/widget_extensions.dart'; import 'package:test_sa/models/device/device.dart'; -import 'package:test_sa/models/lookup.dart'; import 'package:test_sa/models/service_request/service_request.dart'; import 'package:test_sa/models/subtitle.dart'; import 'package:test_sa/views/app_style/colors.dart'; @@ -271,7 +270,7 @@ class CreateRequestPageState extends State { initialValue: _serviceRequest.callComments, hintText: _subtitle.maintenanceIssue, prefixIconData: FontAwesomeIcons.triangleExclamation, - style: Theme.of(context).textTheme.headline6, + style: Theme.of(context).textTheme.titleLarge, textInputType: TextInputType.multiline, validator: (value) => Validator.hasValue(value) ? null : _subtitle.maintenanceIssueRequired, onSaved: (value) { @@ -286,12 +285,12 @@ class CreateRequestPageState extends State { if (widget.serviceRequest != null) ATextFormField( controller: _commentController, - initialValue: _serviceRequest.comment, + initialValue: _serviceRequest.comments, hintText: _subtitle.comment, style: Theme.of(context).textTheme.titleMedium, textInputType: TextInputType.multiline, onSaved: (value) { - _serviceRequest.comment = value; + _serviceRequest.comments = value; }, ), ], diff --git a/lib/views/pages/user/requests/report/create_service_report.dart b/lib/views/pages/user/requests/report/create_service_report.dart index 0426001e..dfc0beca 100644 --- a/lib/views/pages/user/requests/report/create_service_report.dart +++ b/lib/views/pages/user/requests/report/create_service_report.dart @@ -28,12 +28,10 @@ import 'package:test_sa/views/widgets/images/mini_one_image_picker.dart'; import 'package:test_sa/views/widgets/loaders/loading_manager.dart'; import 'package:test_sa/views/widgets/parts/auto_complete_parts_field.dart'; import 'package:test_sa/views/widgets/parts/part_item.dart'; -import 'package:test_sa/views/widgets/status/employee/engineers_mune.dart'; import 'package:test_sa/views/widgets/status/report/service_report_last_call.dart'; import 'package:test_sa/views/widgets/status/report/service_report_reasons.dart'; import 'package:test_sa/views/widgets/status/report/service_report_status.dart'; import 'package:test_sa/views/widgets/status/report/service_status.dart'; -import 'package:test_sa/views/widgets/timer/app_timer.dart'; import 'package:test_sa/views/widgets/titles/app_sub_title.dart'; import '../../../../widgets/speech_to_text/speech_to_text.dart'; @@ -339,13 +337,13 @@ class _CreateServiceReportState extends State with TickerPr ), if (_showCommentField) ATextFormField( - initialValue: _serviceReport?.comment, - hintText: _subtitle.comment, + initialValue: _serviceReport?.reviewComment, + hintText: "Review Comment", textAlign: TextAlign.center, style: Theme.of(context).textTheme.titleMedium, textInputType: TextInputType.multiline, onSaved: (value) { - _serviceReport.comment = value; + _serviceReport.reviewComment = value; }, ), SizedBox( From a19bd39516456628fc9e5720b3405fb0e97ef684 Mon Sep 17 00:00:00 2001 From: zaid_daoud Date: Mon, 5 Jun 2023 11:19:17 +0300 Subject: [PATCH 052/181] Enhancements on Add Work Order Screen --- lib/controllers/providers/api/service_requests_provider.dart | 2 +- lib/models/service_report.dart | 4 ++-- .../pages/user/requests/report/create_service_report.dart | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/lib/controllers/providers/api/service_requests_provider.dart b/lib/controllers/providers/api/service_requests_provider.dart index 9ed361c8..1f6c5071 100644 --- a/lib/controllers/providers/api/service_requests_provider.dart +++ b/lib/controllers/providers/api/service_requests_provider.dart @@ -294,7 +294,7 @@ class ServiceRequestsProvider extends ChangeNotifier { "id": request.id, }, "assetType": report.assetType?.toMap(), - "assignedEmployee": {"id": report.engineer.id, "name": report.engineer.name}, + "assignedEmployee": {"id": report.engineer?.id, "name": report.engineer?.name ?? ""}, "visitDate": report.visitDate?.toIso8601String() ?? "", // "assistantEmployees": [ // {"id": report.engineer.id, "name": report.engineer.name}, diff --git a/lib/models/service_report.dart b/lib/models/service_report.dart index 1fca48b5..637de4e3 100644 --- a/lib/models/service_report.dart +++ b/lib/models/service_report.dart @@ -140,7 +140,7 @@ class ServiceReport { //if(serviceType == null) return false; if (status == null) return false; if (type == null && assetType == null) return false; - if (engineer == null) return false; + // if (engineer == null) return false; if (callLastSituation == null) return false; if (callLastSituation?.value == 12) { // if(invoiceCode != null || invoiceCode?.isEmpty == true) return false; @@ -148,7 +148,7 @@ class ServiceReport { } if (parts == null) return false; //if(endDate == null) return false; - //if(reason == null) return false; + if (reason == null) return false; //todo uncoment this line //if((device?.id == null || device.id.isEmpty) && type?.id != 1) return false; //if(quantity == null || quantity.isEmpty) return false; diff --git a/lib/views/pages/user/requests/report/create_service_report.dart b/lib/views/pages/user/requests/report/create_service_report.dart index dfc0beca..692027ca 100644 --- a/lib/views/pages/user/requests/report/create_service_report.dart +++ b/lib/views/pages/user/requests/report/create_service_report.dart @@ -402,7 +402,7 @@ class _CreateServiceReportState extends State with TickerPr hintText: _serviceReport.startDate == null ? "0" : _serviceReport?.endDate?.difference(_serviceReport?.startDate)?.inHours?.toString() ?? "0", enable: false, style: Theme.of(context).textTheme.subtitle1, - validator: (value) => Validator.isNumeric(value) ? null : _subtitle.requiredWord, + validator: (value) => Validator.isNumeric(value.isEmpty ? "0" : value) ? null : _subtitle.requiredWord, textInputType: TextInputType.number, onSaved: (value) { // _serviceReport.workHours = value; From 6d6c6c700c78dbe3c27c40a017eaa33c5b911fbe Mon Sep 17 00:00:00 2001 From: zaid_daoud Date: Mon, 5 Jun 2023 16:16:17 +0300 Subject: [PATCH 053/181] Enhancements --- .../providers/api/service_requests_provider.dart | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/lib/controllers/providers/api/service_requests_provider.dart b/lib/controllers/providers/api/service_requests_provider.dart index 1f6c5071..def74dc8 100644 --- a/lib/controllers/providers/api/service_requests_provider.dart +++ b/lib/controllers/providers/api/service_requests_provider.dart @@ -137,7 +137,7 @@ class ServiceRequestsProvider extends ChangeNotifier { var body = { "id": 0, "calNo": "", - "callCreatedBy": {"id": user.id, "name": user.userName ?? ""}, + "callCreatedBy": {"id": user.userID, "name": user.userName ?? ""}, "assets": serviceRequest.deviceId == null ? [] : [serviceRequest.deviceId], "requestedDate": DateTime.now().toIso8601String(), "requestedTime": DateTime.now().toIso8601String(), @@ -159,7 +159,7 @@ class ServiceRequestsProvider extends ChangeNotifier { // "job": "", "email": user.email, // "land": "", - "contactUserId": user.id, + "contactUserId": user.userID, }, ], "noofFollowup": 0, @@ -245,7 +245,7 @@ class ServiceRequestsProvider extends ChangeNotifier { "job": callSiteContactPerson['job'], "email": callSiteContactPerson['email'] ?? user.email, "land": callSiteContactPerson['land'], - "contactUserId": user.id, + "contactUserId": user.userID, }, ], "callComments": request.callComments, @@ -310,7 +310,7 @@ class ServiceRequestsProvider extends ChangeNotifier { // "job": "", "email": user.email, // "land": "", - "contactUserId": user.id, + "contactUserId": user.userID, } ], "calllastSituation": report.callLastSituation?.toMap(), From 29466092b020bae6723de41d5364c4daa923a1d9 Mon Sep 17 00:00:00 2001 From: zaid_daoud Date: Tue, 6 Jun 2023 09:59:09 +0300 Subject: [PATCH 054/181] Service Type Became Read Only --- lib/controllers/api_routes/urls.dart | 2 +- .../api/service_requests_provider.dart | 2 +- .../report/create_service_report.dart | 50 ++++++++++++++----- 3 files changed, 40 insertions(+), 14 deletions(-) diff --git a/lib/controllers/api_routes/urls.dart b/lib/controllers/api_routes/urls.dart index 30aed29d..be942bbc 100644 --- a/lib/controllers/api_routes/urls.dart +++ b/lib/controllers/api_routes/urls.dart @@ -55,7 +55,7 @@ class URLs { static get getServiceReportTypes => "$_baseUrl/Lookups/GetLookup?lookupEnum=501"; // get static get getServiceReportStatus => "$_baseUrl/Lookups/GetLookup?lookupEnum=521"; // get static get getServiceReportLastCalls => "$_baseUrl/WorkOrder/GetLookupCallLastSituationBasedOnCase"; // get - static get getAssetTypes => "$_baseUrl/Lookups/GetLookup?lookupEnum=28"; // get + static get getAssetTypes => "$_baseUrl/Lookups/GetLookup?lookupEnum=500"; // get static get getPartNumber => "$_baseUrl/PartCatalog/GetPartAutoComplete"; // get static get getServiceReportPriority => "$_baseUrl/Lookups/GetLookup?lookupEnum=602"; // get static get getServiceReportDefectTypes => "$_baseUrl/Lookups/GetLookup?lookupEnum=601"; // get diff --git a/lib/controllers/providers/api/service_requests_provider.dart b/lib/controllers/providers/api/service_requests_provider.dart index def74dc8..ee264d1d 100644 --- a/lib/controllers/providers/api/service_requests_provider.dart +++ b/lib/controllers/providers/api/service_requests_provider.dart @@ -294,7 +294,7 @@ class ServiceRequestsProvider extends ChangeNotifier { "id": request.id, }, "assetType": report.assetType?.toMap(), - "assignedEmployee": {"id": report.engineer?.id, "name": report.engineer?.name ?? ""}, + // "assignedEmployee": {"id": report.engineer?.id, "name": report.engineer?.name ?? ""}, "visitDate": report.visitDate?.toIso8601String() ?? "", // "assistantEmployees": [ // {"id": report.engineer.id, "name": report.engineer.name}, diff --git a/lib/views/pages/user/requests/report/create_service_report.dart b/lib/views/pages/user/requests/report/create_service_report.dart index 692027ca..ffb92ece 100644 --- a/lib/views/pages/user/requests/report/create_service_report.dart +++ b/lib/views/pages/user/requests/report/create_service_report.dart @@ -31,9 +31,9 @@ import 'package:test_sa/views/widgets/parts/part_item.dart'; import 'package:test_sa/views/widgets/status/report/service_report_last_call.dart'; import 'package:test_sa/views/widgets/status/report/service_report_reasons.dart'; import 'package:test_sa/views/widgets/status/report/service_report_status.dart'; -import 'package:test_sa/views/widgets/status/report/service_status.dart'; import 'package:test_sa/views/widgets/titles/app_sub_title.dart'; +import '../../../../../controllers/providers/api/status_drop_down/report/service_types_provider.dart'; import '../../../../widgets/speech_to_text/speech_to_text.dart'; import '../../../../widgets/status/report/service_report_repair_location.dart'; @@ -51,7 +51,7 @@ class _CreateServiceReportState extends State with TickerPr UserProvider _userProvider; SettingProvider _settingProvider; ServiceRequestsProvider _serviceRequestsProvider; - + ServiceStatusProvider _assetTypeProvider; bool _validate = false; ServiceReport _serviceReport; bool _isLoading = false; @@ -61,16 +61,18 @@ class _CreateServiceReportState extends State with TickerPr File _image; final GlobalKey _formKey = GlobalKey(); final GlobalKey _scaffoldKey = GlobalKey(); - TextEditingController _faultController = TextEditingController(); - TextEditingController _workPreformedController = TextEditingController(); + final TextEditingController _faultController = TextEditingController(); + final TextEditingController _workPreformedController = TextEditingController(); @override void initState() { _serviceReport = ServiceReport( - visitDate: DateTime.now(), - //type: const Lookup(value: 2), - device: widget.request.device, - parts: []); + visitDate: DateTime.now(), + //type: const Lookup(value: 2), + device: widget.request.device, + parts: [], + ); + super.initState(); } @@ -86,6 +88,11 @@ class _CreateServiceReportState extends State with TickerPr _userProvider = Provider.of(context); _settingProvider = Provider.of(context); _serviceRequestsProvider = Provider.of(context); + _assetTypeProvider = Provider.of(context); + _serviceReport.assetType = _assetTypeProvider.statuses?.firstWhere( + (element) => element.value == widget.request?.device?.hospital?.id, + orElse: () => null, + ); _subtitle = AppLocalization.of(context).subtitle; return Scaffold( key: _scaffoldKey, @@ -251,12 +258,31 @@ class _CreateServiceReportState extends State with TickerPr const SizedBox( height: 4, ), - ServiceAssetTypeMenu( - initialValue: _serviceReport.assetType, - onSelect: (status) { - _serviceReport.assetType = status; + LoadingManager( + isLoading: _assetTypeProvider.isLoading, + isFailedLoading: _assetTypeProvider.statuses == null, + stateCode: _assetTypeProvider.stateCode, + onRefresh: () async { + _assetTypeProvider.reset(); + await _assetTypeProvider.getTypes(user: _userProvider.user, host: _settingProvider.host); + _serviceReport?.assetType = _assetTypeProvider.statuses?.firstWhere( + (element) => element.value == widget.request?.device?.hospital?.id, + orElse: () => null, + ); }, + child: ATextFormField( + initialValue: _serviceReport?.assetType?.name ?? "NULL", + textAlign: TextAlign.center, + enable: false, + style: Theme.of(context).textTheme.titleMedium, + ), ), + // ServiceAssetTypeMenu( + // initialValue: _serviceReport.assetType, + // onSelect: (status) { + // _serviceReport.assetType = status; + // }, + // ), const SizedBox( height: 8, ), From 655f96049cb71fd230fd33093d59c42407543cf0 Mon Sep 17 00:00:00 2001 From: zaid_daoud Date: Tue, 6 Jun 2023 11:20:56 +0300 Subject: [PATCH 055/181] Fault Description Became a Dropdown Menu --- lib/controllers/api_routes/urls.dart | 1 + .../api/service_requests_provider.dart | 9 +- ...ice_report_fault_description_provider.dart | 70 +++++++++++ lib/main.dart | 2 + lib/models/fault_description.dart | 36 ++++++ lib/models/service_report.dart | 77 ++++++------ .../report/create_service_report.dart | 45 ++++--- .../status/report/fault_desc_menu.dart | 110 ++++++++++++++++++ .../service_report_fault_description.dart | 43 +++++++ 9 files changed, 324 insertions(+), 69 deletions(-) create mode 100644 lib/controllers/providers/api/status_drop_down/report/service_report_fault_description_provider.dart create mode 100644 lib/models/fault_description.dart create mode 100644 lib/views/widgets/status/report/fault_desc_menu.dart create mode 100644 lib/views/widgets/status/report/service_report_fault_description.dart diff --git a/lib/controllers/api_routes/urls.dart b/lib/controllers/api_routes/urls.dart index be942bbc..df430e8e 100644 --- a/lib/controllers/api_routes/urls.dart +++ b/lib/controllers/api_routes/urls.dart @@ -59,6 +59,7 @@ class URLs { static get getPartNumber => "$_baseUrl/PartCatalog/GetPartAutoComplete"; // get static get getServiceReportPriority => "$_baseUrl/Lookups/GetLookup?lookupEnum=602"; // get static get getServiceReportDefectTypes => "$_baseUrl/Lookups/GetLookup?lookupEnum=601"; // get + static get getServiceReportFaultDescription => "$_baseUrl/CallRequest/GetCallRequestForWorkOrder"; // get //gas refill static get getGasTypes => "$_baseUrl/Lookups/GetLookup?lookupEnum=606"; // get diff --git a/lib/controllers/providers/api/service_requests_provider.dart b/lib/controllers/providers/api/service_requests_provider.dart index ee264d1d..8f947e45 100644 --- a/lib/controllers/providers/api/service_requests_provider.dart +++ b/lib/controllers/providers/api/service_requests_provider.dart @@ -294,7 +294,7 @@ class ServiceRequestsProvider extends ChangeNotifier { "id": request.id, }, "assetType": report.assetType?.toMap(), - // "assignedEmployee": {"id": report.engineer?.id, "name": report.engineer?.name ?? ""}, + "assignedEmployee": {"id": report.engineer?.id, "name": report.engineer?.name ?? ""}, "visitDate": report.visitDate?.toIso8601String() ?? "", // "assistantEmployees": [ // {"id": report.engineer.id, "name": report.engineer.name}, @@ -322,12 +322,7 @@ class ServiceRequestsProvider extends ChangeNotifier { "workingHours": report.timer?.durationInSecond, "travelingHours": report.travelingHours, "travelingExpenses": report.travelingExpense ?? 0, - "faultDescription": { - "id": report.faultDescriptionId, - "defectName": report.type?.name, - "workPerformed": report.workPreformed, - "estimatedTime": report.operatingHours, - }, + if (report.faultDescription != null) "faultDescription": report.faultDescription.toJson(), "sparePartsWorkOrders": report.parts ?.map( (p) => { diff --git a/lib/controllers/providers/api/status_drop_down/report/service_report_fault_description_provider.dart b/lib/controllers/providers/api/status_drop_down/report/service_report_fault_description_provider.dart new file mode 100644 index 00000000..f50a5b1e --- /dev/null +++ b/lib/controllers/providers/api/status_drop_down/report/service_report_fault_description_provider.dart @@ -0,0 +1,70 @@ +import 'dart:convert'; + +import 'package:flutter/cupertino.dart'; +import 'package:flutter/material.dart'; +import 'package:http/http.dart'; +import 'package:test_sa/controllers/api_routes/api_manager.dart'; +import 'package:test_sa/controllers/api_routes/urls.dart'; +import 'package:test_sa/models/user.dart'; + +import '../../../../../models/fault_description.dart'; + +class ServiceRequestFaultDescriptionProvider extends ChangeNotifier { + //reset provider data + void reset() { + _items = null; + _stateCode = null; + } + + // state code of current request to defied error message + // like 400 customer request failed + // 500 service not available + int _stateCode; + int get stateCode => _stateCode; + + // contain user data + // when user not login or register _user = null + List _items; + List get items => _items; + + // when categories in-process _loading = true + // done _loading = true + // failed _loading = false + bool _loading; + bool get isLoading => _loading; + set isLoading(bool isLoading) { + _loading = isLoading; + notifyListeners(); + } + + /// return -2 if request in progress + /// return -1 if error happen when sending request + /// 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 getData({String host, User user, String requestId}) async { + if (_loading == true) return -2; + _loading = true; + notifyListeners(); + Response response; + try { + response = await ApiManager.instance.get( + URLs.getServiceReportFaultDescription + "?callId=$requestId", + ); + _stateCode = response.statusCode; + if (response.statusCode >= 200 && response.statusCode < 300) { + // client's request was successfully received + List listJson = json.decode(response.body)["data"]['asset']['modelDefinition']['modelDefRelatedDefects']; + _items = listJson.map((type) => FaultDescription.fromJson(type)).toList(); + } + _loading = false; + notifyListeners(); + return response.statusCode; + } catch (error) { + _loading = false; + _stateCode = -1; + notifyListeners(); + return -1; + } + } +} diff --git a/lib/main.dart b/lib/main.dart index eef23138..56bcee8c 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -49,6 +49,7 @@ import 'package:test_sa/views/widgets/equipment/single_device_picker.dart'; import 'controllers/providers/api/parts_provider.dart'; import 'controllers/providers/api/preventive_maintenance_visits_provider.dart'; import 'controllers/providers/api/status_drop_down/pentry/pentry_status_provider.dart'; +import 'controllers/providers/api/status_drop_down/report/service_report_fault_description_provider.dart'; import 'controllers/providers/api/status_drop_down/report/service_report_last_calls_provider.dart'; import 'controllers/providers/api/status_drop_down/report/service_report_reasons_provider.dart'; import 'controllers/providers/api/status_drop_down/report/service_report_repair_location_provider.dart'; @@ -117,6 +118,7 @@ class MyApp extends StatelessWidget { ChangeNotifierProvider(create: (_) => ServiceLoanAvailabilityProvider()), ChangeNotifierProvider(create: (_) => ServiceFirstActionProvider()), ChangeNotifierProvider(create: (_) => ServiceReportRepairLocationProvider()), + ChangeNotifierProvider(create: (_) => ServiceRequestFaultDescriptionProvider()), ], child: GestureDetector( onTap: () { diff --git a/lib/models/fault_description.dart b/lib/models/fault_description.dart new file mode 100644 index 00000000..02e67e92 --- /dev/null +++ b/lib/models/fault_description.dart @@ -0,0 +1,36 @@ +class FaultDescription { + FaultDescription({ + this.id, + this.defectName, + this.workPerformed, + this.estimatedTime,}); + + FaultDescription.fromJson(dynamic json) { + id = json['id']; + defectName = json['defectName']; + workPerformed = json['workPerformed']; + estimatedTime = json['estimatedTime']; + } + num id; + dynamic defectName; + String workPerformed; + String estimatedTime; +FaultDescription copyWith({ num id, + dynamic defectName, + String workPerformed, + String estimatedTime, +}) => FaultDescription( id: id ?? this.id, + defectName: defectName ?? this.defectName, + workPerformed: workPerformed ?? this.workPerformed, + estimatedTime: estimatedTime ?? this.estimatedTime, +); + Map toJson() { + final map = {}; + map['id'] = id; + map['defectName'] = defectName; + map['workPerformed'] = workPerformed; + map['estimatedTime'] = estimatedTime; + return map; + } + +} \ No newline at end of file diff --git a/lib/models/service_report.dart b/lib/models/service_report.dart index 637de4e3..f8f65e75 100644 --- a/lib/models/service_report.dart +++ b/lib/models/service_report.dart @@ -3,6 +3,7 @@ import 'dart:typed_data'; import 'package:test_sa/controllers/api_routes/urls.dart'; import 'package:test_sa/models/device/device.dart'; import 'package:test_sa/models/engineer.dart'; +import 'package:test_sa/models/fault_description.dart'; import 'package:test_sa/models/lookup.dart'; import 'package:test_sa/models/part.dart'; import 'package:test_sa/models/service_request/service_request.dart'; @@ -41,40 +42,41 @@ class ServiceReport { Uint8List localEngineerSignature; int travelingExpense; String reviewComment; + FaultDescription faultDescription; - ServiceReport({ - this.id, - this.visitDate, - this.endDate, - this.assetType, - this.status, - this.type, - this.faultDescriptionId, - //this.workHours, - this.travelingHours, - this.parts, - this.engineer, - this.workPreformed, - this.reason, - this.operatingHours, - this.callLastSituation, - this.jobSheetNumber, - this.image, - this.device, - this.invoiceCode, - this.invoiceNumber, - this.quantity = "1", - this.timer, - this.signatureNurse, - this.signatureEngineer, - this.localNurseSignature, - this.localEngineerSignature, - this.comment, - this.repairLocation, - this.travelingExpense, - this.startDate, - this.reviewComment, - }); + ServiceReport( + {this.id, + this.visitDate, + this.endDate, + this.assetType, + this.status, + this.type, + this.faultDescriptionId, + //this.workHours, + this.travelingHours, + this.parts, + this.engineer, + this.workPreformed, + this.reason, + this.operatingHours, + this.callLastSituation, + this.jobSheetNumber, + this.image, + this.device, + this.invoiceCode, + this.invoiceNumber, + this.quantity = "1", + this.timer, + this.signatureNurse, + this.signatureEngineer, + this.localNurseSignature, + this.localEngineerSignature, + this.comment, + this.repairLocation, + this.travelingExpense, + this.startDate, + this.reviewComment, + this.faultDescription}); Map toMap(ServiceRequest request) { Map _map = {}; @@ -92,12 +94,9 @@ class ServiceReport { _map["workingHours"] = (timer.durationInSecond / 60 / 60).toStringAsFixed(5); } if (travelingHours != null && travelingHours.isNotEmpty) _map["traveling_hours"] = travelingHours; - // if(workPreformed != null && workPreformed.isNotEmpty){ - // _map["faultDescription"] = { - // //"id":faultDescriptionId ?? 0, - // "workPerformed":workPreformed - // }; - // } + if (workPreformed != null && workPreformed.isNotEmpty) { + _map["faultDescription"] = faultDescription.toJson(); + } if (jobSheetNumber != null && jobSheetNumber.isNotEmpty) _map["job_sheet_no"] = jobSheetNumber; if (parts != null && parts.isNotEmpty) { _map["sparePartsWorkOrders"] = parts.map((e) => e.toJson()).toList(); diff --git a/lib/views/pages/user/requests/report/create_service_report.dart b/lib/views/pages/user/requests/report/create_service_report.dart index ffb92ece..e705d495 100644 --- a/lib/views/pages/user/requests/report/create_service_report.dart +++ b/lib/views/pages/user/requests/report/create_service_report.dart @@ -35,6 +35,7 @@ import 'package:test_sa/views/widgets/titles/app_sub_title.dart'; import '../../../../../controllers/providers/api/status_drop_down/report/service_types_provider.dart'; import '../../../../widgets/speech_to_text/speech_to_text.dart'; +import '../../../../widgets/status/report/service_report_fault_description.dart'; import '../../../../widgets/status/report/service_report_repair_location.dart'; class CreateServiceReport extends StatefulWidget { @@ -513,34 +514,32 @@ class _CreateServiceReportState extends State with TickerPr ], ), const SizedBox(height: 8), - Row( - children: [ - ASubTitle(_subtitle.faultDescription), - Expanded( - child: SizedBox( - height: 32 * AppStyle.getScaleFactor(context), - child: SpeechToTextButton( - controller: _faultController, - mini: true, - ), - ), - ), - ], - ), + ASubTitle(_subtitle.faultDescription), const SizedBox( height: 4, ), - ATextFormField( - initialValue: _serviceReport?.faultDescriptionId?.toString(), - textAlign: TextAlign.center, - controller: _faultController, - style: Theme.of(context).textTheme.titleMedium, - validator: (value) => Validator.hasValue(value) ? null : _subtitle.requiredWord, - textInputType: TextInputType.multiline, - onSaved: (value) { - _serviceReport.faultDescriptionId = int.tryParse(value) ?? 0; + ServiceReportFaultDescription( + requestId: widget.request.id, + initialValue: _serviceReport.faultDescription, + onSelect: (status) { + _serviceReport.faultDescription = status; + setState(() {}); }, ), + const SizedBox( + height: 4, + ), + // ATextFormField( + // initialValue: _serviceReport?.faultDescriptionId?.toString(), + // textAlign: TextAlign.center, + // controller: _faultController, + // style: Theme.of(context).textTheme.titleMedium, + // validator: (value) => Validator.hasValue(value) ? null : _subtitle.requiredWord, + // textInputType: TextInputType.multiline, + // onSaved: (value) { + // _serviceReport.faultDescriptionId = int.tryParse(value) ?? 0; + // }, + // ), const SizedBox( height: 8, ), diff --git a/lib/views/widgets/status/report/fault_desc_menu.dart b/lib/views/widgets/status/report/fault_desc_menu.dart new file mode 100644 index 00000000..4d9e2aed --- /dev/null +++ b/lib/views/widgets/status/report/fault_desc_menu.dart @@ -0,0 +1,110 @@ +import 'package:flutter/material.dart'; +import 'package:test_sa/models/fault_description.dart'; +import 'package:test_sa/views/app_style/colors.dart'; +import 'package:test_sa/views/app_style/sizing.dart'; + +class FaultDescriptionMenu extends StatefulWidget { + final List statuses; + final FaultDescription initialStatus; + final Function(FaultDescription) onSelect; + + const FaultDescriptionMenu({Key key, this.statuses, this.onSelect, this.initialStatus}) : super(key: key); + + @override + _SingleStatusMenuState createState() => _SingleStatusMenuState(); +} + +class _SingleStatusMenuState extends State { + FaultDescription _selectedStatus; + + @override + void setState(VoidCallback fn) { + if (mounted) super.setState(fn); + } + + @override + void didUpdateWidget(covariant FaultDescriptionMenu oldWidget) { + if (widget.initialStatus != null) { + final result = widget.statuses?.where((element) { + return element == widget.initialStatus; + }); + if (result.isNotEmpty) { + _selectedStatus = result.first; + } else { + _selectedStatus = null; + } + if ((widget.initialStatus?.id ?? "") != (_selectedStatus?.id ?? "")) { + widget.onSelect(_selectedStatus); + } + } else { + _selectedStatus = null; + } + super.didUpdateWidget(oldWidget); + } + + @override + void initState() { + if (widget.initialStatus != null) { + final result = widget.statuses?.where((element) { + return element == widget.initialStatus; + }); + if (result.isNotEmpty) _selectedStatus = result.first; + if (widget.initialStatus.id != _selectedStatus?.id) { + widget.onSelect(_selectedStatus); + } + } + + super.initState(); + } + + @override + Widget build(BuildContext context) { + return Container( + padding: const EdgeInsets.symmetric(horizontal: 16), + decoration: BoxDecoration( + color: AColors.inputFieldBackgroundColor, + border: Border.all( + color: Color(0xffefefef), + ), + borderRadius: BorderRadius.circular(AppStyle.borderRadius * AppStyle.getScaleFactor(context)), + // boxShadow: const [ + // AppStyle.boxShadow + // ] + ), + child: DropdownButton( + value: _selectedStatus, + iconSize: 24, + icon: const Icon(Icons.keyboard_arrow_down_rounded), + elevation: 0, + isExpanded: true, + hint: Text( + "Select", + style: Theme.of(context).textTheme.subtitle1, + ), + style: TextStyle(color: Theme.of(context).primaryColor), + underline: SizedBox.shrink(), + onChanged: (FaultDescription newValue) { + setState(() { + _selectedStatus = newValue; + }); + widget.onSelect(newValue); + }, + items: widget.statuses.map>( + (FaultDescription value) { + return DropdownMenuItem( + value: value, + child: Text( + value.defectName, + style: Theme.of(context).textTheme.subtitle1.copyWith( + color: Theme.of(context).primaryColor, + fontSize: 11, + //fontWeight: FontWeight.bold + ), + ), + ); + }, + ).toList(), + ), + ); + } +} diff --git a/lib/views/widgets/status/report/service_report_fault_description.dart b/lib/views/widgets/status/report/service_report_fault_description.dart new file mode 100644 index 00000000..3e92f5f4 --- /dev/null +++ b/lib/views/widgets/status/report/service_report_fault_description.dart @@ -0,0 +1,43 @@ +import 'package:flutter/material.dart'; +import 'package:provider/provider.dart'; +import 'package:test_sa/controllers/providers/api/status_drop_down/report/service_report_fault_description_provider.dart'; +import 'package:test_sa/controllers/providers/api/user_provider.dart'; +import 'package:test_sa/controllers/providers/settings/setting_provider.dart'; +import 'package:test_sa/models/fault_description.dart'; +import 'package:test_sa/views/widgets/loaders/loading_manager.dart'; +import 'package:test_sa/views/widgets/status/report/fault_desc_menu.dart'; + +import '../../app_text_form_field.dart'; + +class ServiceReportFaultDescription extends StatelessWidget { + final String requestId; + final Function(FaultDescription) onSelect; + final FaultDescription initialValue; + + const ServiceReportFaultDescription({Key key, this.requestId, this.onSelect, this.initialValue}) : super(key: key); + @override + Widget build(BuildContext context) { + SettingProvider settingProvider = Provider.of(context); + UserProvider userProvider = Provider.of(context); + ServiceRequestFaultDescriptionProvider menuProvider = Provider.of(context); + return LoadingManager( + isLoading: menuProvider.isLoading, + isFailedLoading: menuProvider.items == null, + stateCode: menuProvider.stateCode, + onRefresh: () async { + menuProvider.reset(); + await menuProvider.getData(user: userProvider.user, host: settingProvider.host, requestId: requestId); + }, + child: menuProvider.items.isEmpty + ? const ATextFormField( + initialValue: "NULL", + enable: false, + ) + : FaultDescriptionMenu( + initialStatus: initialValue, + statuses: menuProvider.items, + onSelect: onSelect, + ), + ); + } +} From c8f498db6ab5f8d03ab6507a06f9c584e28b4122 Mon Sep 17 00:00:00 2001 From: zaid_daoud Date: Tue, 6 Jun 2023 13:18:25 +0300 Subject: [PATCH 056/181] Merged with main_latest --- .../report/create_service_report.dart | 611 ++++++------------ .../service_report_fault_description.dart | 2 +- 2 files changed, 183 insertions(+), 430 deletions(-) diff --git a/lib/views/pages/user/requests/report/create_service_report.dart b/lib/views/pages/user/requests/report/create_service_report.dart index 310a9d18..c5f51b08 100644 --- a/lib/views/pages/user/requests/report/create_service_report.dart +++ b/lib/views/pages/user/requests/report/create_service_report.dart @@ -28,16 +28,14 @@ import 'package:test_sa/views/widgets/images/mini_one_image_picker.dart'; import 'package:test_sa/views/widgets/loaders/loading_manager.dart'; import 'package:test_sa/views/widgets/parts/auto_complete_parts_field.dart'; import 'package:test_sa/views/widgets/parts/part_item.dart'; -import 'package:test_sa/views/widgets/status/employee/engineers_mune.dart'; import 'package:test_sa/views/widgets/status/report/service_report_last_call.dart'; import 'package:test_sa/views/widgets/status/report/service_report_reasons.dart'; import 'package:test_sa/views/widgets/status/report/service_report_status.dart'; -import 'package:test_sa/views/widgets/status/report/service_status.dart'; -import 'package:test_sa/views/widgets/timer/app_timer.dart'; import 'package:test_sa/views/widgets/titles/app_sub_title.dart'; import '../../../../../controllers/providers/api/status_drop_down/report/service_types_provider.dart'; import '../../../../widgets/speech_to_text/speech_to_text.dart'; +import '../../../../widgets/status/report/service_report_fault_description.dart'; import '../../../../widgets/status/report/service_report_repair_location.dart'; class CreateServiceReport extends StatefulWidget { @@ -75,7 +73,6 @@ class _CreateServiceReportState extends State with TickerPr device: widget.request.device, parts: [], ); - super.initState(); } @@ -275,12 +272,31 @@ class _CreateServiceReportState extends State with TickerPr const SizedBox( height: 4, ), - ServiceAssetTypeMenu( - initialValue: _serviceReport.assetType, - onSelect: (status) { - _serviceReport.assetType = status; + LoadingManager( + isLoading: _assetTypeProvider.isLoading, + isFailedLoading: _assetTypeProvider.statuses == null, + stateCode: _assetTypeProvider.stateCode, + onRefresh: () async { + _assetTypeProvider.reset(); + await _assetTypeProvider.getTypes(user: _userProvider.user, host: _settingProvider.host); + _serviceReport?.assetType = _assetTypeProvider.statuses?.firstWhere( + (element) => element.value == widget.request?.device?.hospital?.id, + orElse: () => null, + ); }, + child: ATextFormField( + initialValue: _serviceReport?.assetType?.name ?? "NULL", + textAlign: TextAlign.center, + enable: false, + style: Theme.of(context).textTheme.titleMedium, + ), ), + // ServiceAssetTypeMenu( + // initialValue: _serviceReport.assetType, + // onSelect: (status) { + // _serviceReport.assetType = status; + // }, + // ), const SizedBox( height: 8, ), @@ -353,6 +369,21 @@ class _CreateServiceReportState extends State with TickerPr ), ], ), + if (_showCommentField) + const SizedBox( + height: 8, + ), + if (_showCommentField) + ATextFormField( + initialValue: _serviceReport?.reviewComment, + hintText: "Review Comment", + textAlign: TextAlign.center, + style: Theme.of(context).textTheme.titleMedium, + textInputType: TextInputType.multiline, + onSaved: (value) { + _serviceReport.reviewComment = value; + }, + ), SizedBox( height: 8 * AppStyle.getScaleFactor(context), ), @@ -417,176 +448,48 @@ class _CreateServiceReportState extends State with TickerPr // _serviceReport.workHours = value; }, ), - // Report type and Reasons - Row( - children: [ - // Report Status - // Expanded( - // child: Column( - // crossAxisAlignment: CrossAxisAlignment.start, - // children: [ - // ASubTitle(_subtitle.reportType), - // _validate && _serviceReport.type == null ? - // ASubTitle(_subtitle.requiredWord,color: Colors.red,): - // const SizedBox.shrink(), - // const SizedBox(height: 4,), - // ServiceReportTypeMenu( - // initialValue: _serviceReport.type, - // onSelect: (status){ - // _serviceReport.type = status; - // }, - // ), - // ], - // ), - // ), - // const SizedBox(width: 8,), - // visit date - Expanded( - child: Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - ASubTitle(_subtitle.visitDate), - _validate && _serviceReport.visitDate == null - ? ASubTitle( - _subtitle.requiredWord, - color: Colors.red, - ) - : const SizedBox.shrink(), - Row( - children: [ - Expanded( - child: ADatePicker( - date: _serviceReport.visitDate, - from: DateTime.now().subtract(const Duration(days: 365)), - to: DateTime.now().add(const Duration(days: 365)), - onDatePicker: (date) { - _serviceReport.visitDate = date; - setState(() {}); - }, - ), - ), - ], - ), - ], - ), + const SizedBox( + height: 8, ), - ], - ), - const SizedBox( - height: 8, - ), - // device sn - Visibility( - visible: widget.request.deviceSerialNumber == null, - child: Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - ASubTitle(_subtitle.deviceSN), - _validate && _serviceReport.device?.id == null - ? ASubTitle( - _subtitle.requiredWord, - color: Colors.red, - ) - : const SizedBox.shrink(), - AutoCompleteDeviceField( - hospitalId: widget.request.hospitalId, - initialValue: _serviceReport.device, - onPick: (id) { - _serviceReport.device.id = id; - }, - ), - const SizedBox( - height: 8, - ), - ], - ), - ), - const SizedBox( - height: 8, - ), - ASubTitle(_subtitle.serviceType), - _validate && _serviceReport.assetType == null - ? ASubTitle( - _subtitle.requiredWord, - color: Colors.red, - ) - : const SizedBox.shrink(), - const SizedBox( - height: 4, - ), - LoadingManager( - isLoading: _assetTypeProvider.isLoading, - isFailedLoading: _assetTypeProvider.statuses == null, - stateCode: _assetTypeProvider.stateCode, - onRefresh: () async { - _assetTypeProvider.reset(); - await _assetTypeProvider.getTypes(user: _userProvider.user, host: _settingProvider.host); - _serviceReport?.assetType = _assetTypeProvider.statuses?.firstWhere( - (element) => element.value == widget.request?.device?.hospital?.id, - orElse: () => null, - ); - }, - child: ATextFormField( - initialValue: _serviceReport?.assetType?.name ?? "NULL", - textAlign: TextAlign.center, - enable: false, - style: Theme.of(context).textTheme.titleMedium, - ), - ), - // ServiceAssetTypeMenu( - // initialValue: _serviceReport.assetType, - // onSelect: (status) { - // _serviceReport.assetType = status; - // }, - // ), - const SizedBox( - height: 8, - ), - // Report status and Service Type - Row( - children: [ - // report status - Expanded( + // device sn + Visibility( + visible: widget.request.deviceSerialNumber == null, child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ - ASubTitle(_subtitle.reportStatus), - _validate && _serviceReport.status == null + ASubTitle(_subtitle.deviceSN), + _validate && _serviceReport.device?.id == null ? ASubTitle( _subtitle.requiredWord, color: Colors.red, ) : const SizedBox.shrink(), - const SizedBox( - height: 4, - ), - ServiceReportStatusMenu( - report: _serviceReport, - request: widget.request, - onSelect: (status) { - _serviceReport.status = status; - _showCommentField = _serviceReport.status?.name == "Resolved"; - setState(() {}); + AutoCompleteDeviceField( + hospitalId: widget.request.hospitalId, + initialValue: _serviceReport.device, + onPick: (id) { + _serviceReport.device.id = id; }, ), + const SizedBox( + height: 8, + ), ], ), ), const SizedBox( - width: 8, + height: 8, ), - // Provider.of(context).isLoading == null - // ? const SizedBox.shrink(): - // Call's last Situation - Consumer( - builder: (_, provider, __) { - if (provider.isLoading == null) return const SizedBox.shrink(); - return Expanded( + // Report status and Service Type + Row( + children: [ + // report status + Expanded( child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ - ASubTitle(_subtitle.callLastSituation), - _validate && _serviceReport.callLastSituation == null + ASubTitle(_subtitle.reportStatus), + _validate && _serviceReport.status == null ? ASubTitle( _subtitle.requiredWord, color: Colors.red, @@ -595,121 +498,99 @@ class _CreateServiceReportState extends State with TickerPr const SizedBox( height: 4, ), - ServiceReportLastCallsMenu( + ServiceReportStatusMenu( report: _serviceReport, + request: widget.request, onSelect: (status) { - if (status?.value == 12 || _serviceReport.callLastSituation?.value == 12) { - _serviceReport.callLastSituation = status; - setState(() {}); - } else { - _serviceReport.callLastSituation = status; - } + _serviceReport.status = status; + _showCommentField = _serviceReport.status?.name == "Resolved"; + setState(() {}); }, ), ], ), - ); - }, + ), + const SizedBox( + width: 8, + ), + // Provider.of(context).isLoading == null + // ? const SizedBox.shrink(): + // Call's last Situation + Consumer( + builder: (_, provider, __) { + if (provider.isLoading == null) return const SizedBox.shrink(); + return Expanded( + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + ASubTitle(_subtitle.callLastSituation), + _validate && _serviceReport.callLastSituation == null + ? ASubTitle( + _subtitle.requiredWord, + color: Colors.red, + ) + : const SizedBox.shrink(), + const SizedBox( + height: 4, + ), + ServiceReportLastCallsMenu( + report: _serviceReport, + onSelect: (status) { + if (status?.value == 12 || _serviceReport.callLastSituation?.value == 12) { + _serviceReport.callLastSituation = status; + setState(() {}); + } else { + _serviceReport.callLastSituation = status; + } + }, + ), + ], + ), + ); + }, + ), + ], ), - ], - ), - if (_showCommentField) - const SizedBox( - height: 8, - ), - if (_showCommentField) - ATextFormField( - initialValue: _serviceReport?.reviewComment, - hintText: "Review Comment", - textAlign: TextAlign.center, - style: Theme.of(context).textTheme.titleMedium, - textInputType: TextInputType.multiline, - onSaved: (value) { - _serviceReport.reviewComment = value; - }, - ), - SizedBox( - height: 8 * AppStyle.getScaleFactor(context), - ), - Row( - children: [ - Expanded( - child: Column( - crossAxisAlignment: CrossAxisAlignment.stretch, - children: [ - const ASubTitle("Start of Work"), - SizedBox( - height: 8 * AppStyle.getScaleFactor(context), - ), - ADateTimePicker( - date: _serviceReport.startDate, - from: DateTime.now().subtract(const Duration(days: 365)), - to: DateTime.now().add(const Duration(days: 365)), - onDateTimePicker: (date) { - _serviceReport.startDate = date; - setState(() {}); - }, - ), - ], + if (_showCommentField) + const SizedBox( + height: 8, ), - ), - const SizedBox(width: 8), - Expanded( - child: Column( - crossAxisAlignment: CrossAxisAlignment.stretch, - children: [ - const ASubTitle("End of Work"), - SizedBox( - height: 8 * AppStyle.getScaleFactor(context), - ), - ADateTimePicker( - date: _serviceReport.endDate, - from: DateTime.now().subtract(const Duration(days: 365)), - to: DateTime.now().add(const Duration(days: 365)), - onDateTimePicker: (date) { - _serviceReport.endDate = date; - setState(() {}); - }, - ), - ], + if (_showCommentField) + ATextFormField( + initialValue: _serviceReport?.reviewComment, + hintText: "Review Comment", + textAlign: TextAlign.center, + style: Theme.of(context).textTheme.titleMedium, + textInputType: TextInputType.multiline, + onSaved: (value) { + _serviceReport.reviewComment = value; + }, ), - ), - ], - ), - ASubTitle(_subtitle.workingHours), - const SizedBox(height: 4), - ATextFormField( - initialValue: null, - textAlign: TextAlign.center, - hintText: _serviceReport.startDate == null ? "0" : _serviceReport?.endDate?.difference(_serviceReport?.startDate)?.inHours?.toString() ?? "0", - enable: false, - style: Theme.of(context).textTheme.subtitle1, - validator: (value) => Validator.isNumeric(value.isEmpty ? "0" : value) ? null : _subtitle.requiredWord, - textInputType: TextInputType.number, - onSaved: (value) { - // _serviceReport.workHours = value; - }, - ), - SizedBox( height: 8 * AppStyle.getScaleFactor(context), ), - const ASubTitle("Assigned Employee"), - const SizedBox(height: 8), - _validate && _serviceReport.engineer == null - ? ASubTitle( - _subtitle.requiredWord, - color: Colors.red, - ) - : const SizedBox.shrink(), - const SizedBox(height: 4), - EngineersMenu( - initialValue: _serviceReport.engineer, - onSelect: (engineer) { - _serviceReport.engineer = engineer; - }, - ), - const SizedBox(height: 8), + // const ASubTitle("Assigned Employee"), + // const SizedBox( + // height: 8, + // ), + // _validate && _serviceReport.engineer == null + // ? ASubTitle( + // _subtitle.requiredWord, + // color: Colors.red, + // ) + // : const SizedBox.shrink(), + // const SizedBox( + // height: 4, + // ), + // EngineersMenu( + // initialValue: _serviceReport.engineer, + // onSelect: (engineer) { + // _serviceReport.engineer = engineer; + // }, + // ), + // const SizedBox( + // height: 8, + // ), // invoice number & code _serviceReport.callLastSituation?.id != 12 ? const SizedBox.shrink() @@ -736,13 +617,17 @@ class _CreateServiceReportState extends State with TickerPr ], ), ), - const SizedBox(width: 8), + const SizedBox( + width: 8, + ), Expanded( child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ ASubTitle(_subtitle.invoiceCode), - const SizedBox(height: 4), + const SizedBox( + height: 4, + ), ATextFormField( initialValue: _serviceReport?.invoiceCode, textAlign: TextAlign.center, @@ -759,33 +644,35 @@ class _CreateServiceReportState extends State with TickerPr ], ), const SizedBox(height: 8), - Row( - children: [ - ASubTitle(_subtitle.faultDescription), - Expanded( - child: SizedBox( - height: 32 * AppStyle.getScaleFactor(context), - child: SpeechToTextButton( - controller: _faultController, - mini: true, - ), - ), - ), - ], + ASubTitle(_subtitle.faultDescription), + const SizedBox( + height: 4, ), - const SizedBox(height: 4), - ATextFormField( - initialValue: _serviceReport?.faultDescriptionId?.toString(), - textAlign: TextAlign.center, - controller: _faultController, - style: Theme.of(context).textTheme.titleMedium, - validator: (value) => Validator.hasValue(value) ? null : _subtitle.requiredWord, - textInputType: TextInputType.multiline, - onSaved: (value) { - _serviceReport.faultDescriptionId = int.tryParse(value) ?? 0; + ServiceReportFaultDescription( + requestId: widget.request?.id, + initialValue: _serviceReport.faultDescription, + onSelect: (status) { + _serviceReport.faultDescription = status; + setState(() {}); }, ), - const SizedBox(height: 8), + const SizedBox( + height: 4, + ), + // ATextFormField( + // initialValue: _serviceReport?.faultDescriptionId?.toString(), + // textAlign: TextAlign.center, + // controller: _faultController, + // style: Theme.of(context).textTheme.titleMedium, + // validator: (value) => Validator.hasValue(value) ? null : _subtitle.requiredWord, + // textInputType: TextInputType.multiline, + // onSaved: (value) { + // _serviceReport.faultDescriptionId = int.tryParse(value) ?? 0; + // }, + // ), + const SizedBox( + height: 8, + ), Row( children: [ ASubTitle(_subtitle.workPreformed), @@ -800,7 +687,9 @@ class _CreateServiceReportState extends State with TickerPr ), ], ), - const SizedBox(height: 4), + const SizedBox( + height: 4, + ), ATextFormField( initialValue: _serviceReport?.workPreformed, textAlign: TextAlign.center, @@ -812,145 +701,9 @@ class _CreateServiceReportState extends State with TickerPr _serviceReport.workPreformed = value; }, ), - const SizedBox(height: 8), - SizedBox( - height: 8 * AppStyle.getScaleFactor(context), - ), - // const ASubTitle("Assigned Employee"), - // const SizedBox( - // height: 8, - // ), - // _validate && _serviceReport.engineer == null - // ? ASubTitle( - // _subtitle.requiredWord, - // color: Colors.red, - // ) - // : const SizedBox.shrink(), - // const SizedBox( - // height: 4, - // ), - // EngineersMenu( - // initialValue: _serviceReport.engineer, - // onSelect: (engineer) { - // _serviceReport.engineer = engineer; - // }, - // ), - // const SizedBox( - // height: 8, - // ), - // invoice number & code - _serviceReport.callLastSituation?.id != 12 - ? const SizedBox.shrink() - : Row( - children: [ - Expanded( - child: Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - ASubTitle(_subtitle.invoiceNumber), - const SizedBox( - height: 8, - ), - ATextFormField( - initialValue: _serviceReport?.invoiceNumber, - textAlign: TextAlign.center, - style: Theme.of(context).textTheme.subtitle1, - validator: (value) => Validator.hasValue(value) ? null : _subtitle.requiredWord, - textInputType: TextInputType.number, - onSaved: (value) { - _serviceReport.invoiceNumber = value; - }, - ), - ], - ), - ), - const SizedBox( - width: 8, - ), - Expanded( - child: Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - ASubTitle(_subtitle.invoiceCode), - const SizedBox( - height: 4, - ), - ATextFormField( - initialValue: _serviceReport?.invoiceCode, - textAlign: TextAlign.center, - style: Theme.of(context).textTheme.subtitle1, - validator: (value) => Validator.hasValue(value) ? null : _subtitle.requiredWord, - textInputType: TextInputType.text, - onSaved: (value) { - _serviceReport.invoiceCode = value; - }, - ), - ], - ), - ), - ], - ), - const SizedBox(height: 8), - ASubTitle(_subtitle.faultDescription), - const SizedBox( - height: 4, - ), - ServiceReportFaultDescription( - requestId: widget.request.id, - initialValue: _serviceReport.faultDescription, - onSelect: (status) { - _serviceReport.faultDescription = status; - setState(() {}); - }, - ), - const SizedBox( - height: 4, - ), - // ATextFormField( - // initialValue: _serviceReport?.faultDescriptionId?.toString(), - // textAlign: TextAlign.center, - // controller: _faultController, - // style: Theme.of(context).textTheme.titleMedium, - // validator: (value) => Validator.hasValue(value) ? null : _subtitle.requiredWord, - // textInputType: TextInputType.multiline, - // onSaved: (value) { - // _serviceReport.faultDescriptionId = int.tryParse(value) ?? 0; - // }, - // ), - const SizedBox( - height: 8, - ), - Row( - children: [ - ASubTitle(_subtitle.workPreformed), - Expanded( - child: SizedBox( - height: 32 * AppStyle.getScaleFactor(context), - child: SpeechToTextButton( - controller: _workPreformedController, - mini: true, - ), - ), + const SizedBox( + height: 8, ), - ], - ), - const SizedBox( - height: 4, - ), - ATextFormField( - initialValue: _serviceReport?.workPreformed, - textAlign: TextAlign.center, - controller: _workPreformedController, - style: Theme.of(context).textTheme.subtitle1, - validator: (value) => Validator.hasValue(value) ? null : _subtitle.requiredWord, - textInputType: TextInputType.multiline, - onSaved: (value) { - _serviceReport.workPreformed = value; - }, - ), - const SizedBox( - height: 8, - ), const SizedBox(height: 8), Row( @@ -1263,8 +1016,8 @@ class _CreateServiceReportState extends State with TickerPr if (!_serviceReport.validate()) return; _formKey.currentState.save(); - _isLoading = true; - setState(() {}); + _isLoading = true; + setState(() {}); int status = await _serviceRequestsProvider.createServiceReport( user: _userProvider.user, diff --git a/lib/views/widgets/status/report/service_report_fault_description.dart b/lib/views/widgets/status/report/service_report_fault_description.dart index 3e92f5f4..c347fe42 100644 --- a/lib/views/widgets/status/report/service_report_fault_description.dart +++ b/lib/views/widgets/status/report/service_report_fault_description.dart @@ -28,7 +28,7 @@ class ServiceReportFaultDescription extends StatelessWidget { menuProvider.reset(); await menuProvider.getData(user: userProvider.user, host: settingProvider.host, requestId: requestId); }, - child: menuProvider.items.isEmpty + child: menuProvider.items?.isEmpty ?? true ? const ATextFormField( initialValue: "NULL", enable: false, From dd7c866e397652ca5e9fb553c30baad4a5574137 Mon Sep 17 00:00:00 2001 From: Sikander Saleem Date: Tue, 6 Jun 2023 13:27:29 +0300 Subject: [PATCH 057/181] improvements. --- .../report/create_service_report.dart | 63 ++++++++++--------- .../service_report_fault_description.dart | 4 +- 2 files changed, 34 insertions(+), 33 deletions(-) diff --git a/lib/views/pages/user/requests/report/create_service_report.dart b/lib/views/pages/user/requests/report/create_service_report.dart index c5f51b08..2f4b2efe 100644 --- a/lib/views/pages/user/requests/report/create_service_report.dart +++ b/lib/views/pages/user/requests/report/create_service_report.dart @@ -107,6 +107,7 @@ class _CreateServiceReportState extends State with TickerPr child: Stack( children: [ ListView( + padding: const EdgeInsets.all(16), children: [ //AppNameBar(), const SizedBox( @@ -673,37 +674,37 @@ class _CreateServiceReportState extends State with TickerPr const SizedBox( height: 8, ), - Row( - children: [ - ASubTitle(_subtitle.workPreformed), - Expanded( - child: SizedBox( - height: 32 * AppStyle.getScaleFactor(context), - child: SpeechToTextButton( - controller: _workPreformedController, - mini: true, - ), - ), - ), - ], - ), - const SizedBox( - height: 4, - ), - ATextFormField( - initialValue: _serviceReport?.workPreformed, - textAlign: TextAlign.center, - controller: _workPreformedController, - style: Theme.of(context).textTheme.subtitle1, - validator: (value) => Validator.hasValue(value) ? null : _subtitle.requiredWord, - textInputType: TextInputType.multiline, - onSaved: (value) { - _serviceReport.workPreformed = value; - }, - ), - const SizedBox( - height: 8, - ), + // Row( + // children: [ + // ASubTitle(_subtitle.workPreformed), + // Expanded( + // child: SizedBox( + // height: 32 * AppStyle.getScaleFactor(context), + // child: SpeechToTextButton( + // controller: _workPreformedController, + // mini: true, + // ), + // ), + // ), + // ], + // ), + // const SizedBox( + // height: 4, + // ), + // ATextFormField( + // initialValue: _serviceReport?.workPreformed, + // textAlign: TextAlign.center, + // controller: _workPreformedController, + // style: Theme.of(context).textTheme.subtitle1, + // validator: (value) => Validator.hasValue(value) ? null : _subtitle.requiredWord, + // textInputType: TextInputType.multiline, + // onSaved: (value) { + // _serviceReport.workPreformed = value; + // }, + // ), + // const SizedBox( + // height: 8, + // ), const SizedBox(height: 8), Row( diff --git a/lib/views/widgets/status/report/service_report_fault_description.dart b/lib/views/widgets/status/report/service_report_fault_description.dart index c347fe42..9b0d851f 100644 --- a/lib/views/widgets/status/report/service_report_fault_description.dart +++ b/lib/views/widgets/status/report/service_report_fault_description.dart @@ -28,9 +28,9 @@ class ServiceReportFaultDescription extends StatelessWidget { menuProvider.reset(); await menuProvider.getData(user: userProvider.user, host: settingProvider.host, requestId: requestId); }, - child: menuProvider.items?.isEmpty ?? true + child: (menuProvider.items?.isEmpty ?? true) ? const ATextFormField( - initialValue: "NULL", + initialValue: "", enable: false, ) : FaultDescriptionMenu( From f72d2cc41a50de9fe731541ddb5ecc456e24246b Mon Sep 17 00:00:00 2001 From: zaid_daoud Date: Tue, 6 Jun 2023 14:02:10 +0300 Subject: [PATCH 058/181] Minor Bug Fixed --- lib/views/pages/user/requests/create_request.dart | 1 + 1 file changed, 1 insertion(+) diff --git a/lib/views/pages/user/requests/create_request.dart b/lib/views/pages/user/requests/create_request.dart index 569eeff9..91b87bed 100644 --- a/lib/views/pages/user/requests/create_request.dart +++ b/lib/views/pages/user/requests/create_request.dart @@ -68,6 +68,7 @@ class CreateRequestPageState extends State { _serviceRequest = widget.serviceRequest; _device = _serviceRequest.device; _deviceImages.addAll(_serviceRequest.devicePhotos.map((e) => File(e)).toList()); + _showDatePicker = _serviceRequest.firstAction != null && _serviceRequest.firstAction.name == "Need a visit"; } else { _serviceRequest = ServiceRequest(); } From b4aac2a8b8a08e95832f4bca1d5672718c862f4b Mon Sep 17 00:00:00 2001 From: Sikander Saleem Date: Tue, 6 Jun 2023 17:03:42 +0300 Subject: [PATCH 059/181] new work order, service type, fault description fixes --- lib/controllers/api_routes/urls.dart | 3 +- .../api/service_requests_provider.dart | 23 + ...ice_report_fault_description_provider.dart | 4 +- .../call_request_for_work_order_model.dart | 541 ++++++++++++++++++ lib/models/fault_description.dart | 4 +- lib/models/service_report.dart | 2 +- .../service_request/search_work_order.dart | 2 +- .../report/create_service_report.dart | 94 +-- .../status/report/fault_desc_menu.dart | 2 +- .../service_report_fault_description.dart | 2 +- 10 files changed, 632 insertions(+), 45 deletions(-) create mode 100644 lib/models/call_request_for_work_order_model.dart diff --git a/lib/controllers/api_routes/urls.dart b/lib/controllers/api_routes/urls.dart index df430e8e..e52251cd 100644 --- a/lib/controllers/api_routes/urls.dart +++ b/lib/controllers/api_routes/urls.dart @@ -30,6 +30,7 @@ class URLs { static get getServiceRequestTypes => "$_baseUrl/Lookups/GetLookup?lookupEnum=604"; // get static get getServiceRequestStatus => "$_baseUrl/Lookups/GetLookup?lookupEnum=503"; static get getRepairLocation => "$_baseUrl/Lookups/GetLookup?lookupEnum=504"; + static get equipmentStatus => "$_baseUrl/Lookups/GetLookup?lookupEnum=601"; static get getPreventiveMaintenanceVisits => "$_baseUrl/return/user/calibrations"; // get static get updatePreventiveMaintenanceVisits => "$_baseUrl/Visit/UpdateVisits"; // get @@ -59,7 +60,7 @@ class URLs { static get getPartNumber => "$_baseUrl/PartCatalog/GetPartAutoComplete"; // get static get getServiceReportPriority => "$_baseUrl/Lookups/GetLookup?lookupEnum=602"; // get static get getServiceReportDefectTypes => "$_baseUrl/Lookups/GetLookup?lookupEnum=601"; // get - static get getServiceReportFaultDescription => "$_baseUrl/CallRequest/GetCallRequestForWorkOrder"; // get + static get getCallRequestForWorkOrder => "$_baseUrl/CallRequest/GetCallRequestForWorkOrder"; // get //gas refill static get getGasTypes => "$_baseUrl/Lookups/GetLookup?lookupEnum=606"; // get diff --git a/lib/controllers/providers/api/service_requests_provider.dart b/lib/controllers/providers/api/service_requests_provider.dart index e2a59b23..628cb254 100644 --- a/lib/controllers/providers/api/service_requests_provider.dart +++ b/lib/controllers/providers/api/service_requests_provider.dart @@ -5,6 +5,7 @@ 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/models/call_request_for_work_order_model.dart'; import 'package:test_sa/models/issue.dart'; import 'package:test_sa/models/service_report.dart'; import 'package:test_sa/models/service_request/service_request.dart'; @@ -363,6 +364,28 @@ class ServiceRequestsProvider extends ChangeNotifier { } } + CallRequestForWorkOrder callRequestForWorkOrder; + + Future getCallRequestForWorkOrder({String callId}) async { + Response response; + try { + 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"]; + callRequestForWorkOrder = CallRequestForWorkOrder.fromJson(listJson); + } + + notifyListeners(); + return callRequestForWorkOrder; + } catch (error) { + return null; + } + } + Future> searchWorkOrders({@required String callId}) async { Response response; diff --git a/lib/controllers/providers/api/status_drop_down/report/service_report_fault_description_provider.dart b/lib/controllers/providers/api/status_drop_down/report/service_report_fault_description_provider.dart index f50a5b1e..8946bd0a 100644 --- a/lib/controllers/providers/api/status_drop_down/report/service_report_fault_description_provider.dart +++ b/lib/controllers/providers/api/status_drop_down/report/service_report_fault_description_provider.dart @@ -42,14 +42,14 @@ class ServiceRequestFaultDescriptionProvider 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 getData({String host, User user, String requestId}) async { + Future getCallRequestForWorkOrder({String host, User user, String requestId}) async { if (_loading == true) return -2; _loading = true; notifyListeners(); Response response; try { response = await ApiManager.instance.get( - URLs.getServiceReportFaultDescription + "?callId=$requestId", + URLs.getCallRequestForWorkOrder + "?callId=$requestId", ); _stateCode = response.statusCode; if (response.statusCode >= 200 && response.statusCode < 300) { diff --git a/lib/models/call_request_for_work_order_model.dart b/lib/models/call_request_for_work_order_model.dart new file mode 100644 index 00000000..dd0ac5a3 --- /dev/null +++ b/lib/models/call_request_for_work_order_model.dart @@ -0,0 +1,541 @@ +class CallRequestForWorkOrder { + int id; + String callNo; + Asset asset; + AssignedEmployee assignedEmployee; + List callSiteContactPerson; + Status status; + Status callLastSituation; + Status defectType; + Status firstAction; + int assetType; + + CallRequestForWorkOrder( + {this.id, this.callNo, this.asset, this.assignedEmployee, this.callSiteContactPerson, this.status, this.callLastSituation, this.defectType, this.firstAction, this.assetType}); + + CallRequestForWorkOrder.fromJson(Map json) { + id = json['id']; + callNo = json['callNo']; + asset = json['asset'] != null ? new Asset.fromJson(json['asset']) : null; + assignedEmployee = json['assignedEmployee'] != null ? new AssignedEmployee.fromJson(json['assignedEmployee']) : null; + if (json['callSiteContactPerson'] != null) { + callSiteContactPerson = []; + json['callSiteContactPerson'].forEach((v) { + callSiteContactPerson.add(new CallSiteContactPerson.fromJson(v)); + }); + } + status = json['status'] != null ? new Status.fromJson(json['status']) : null; + callLastSituation = json['callLastSituation'] != null ? new Status.fromJson(json['callLastSituation']) : null; + defectType = json['defectType'] != null ? new Status.fromJson(json['defectType']) : null; + firstAction = json['firstAction'] != null ? new Status.fromJson(json['firstAction']) : null; + assetType = json['assetType']; + } + + Map toJson() { + final Map data = new Map(); + data['id'] = this.id; + data['callNo'] = this.callNo; + if (this.asset != null) { + data['asset'] = this.asset.toJson(); + } + if (this.assignedEmployee != null) { + data['assignedEmployee'] = this.assignedEmployee.toJson(); + } + if (this.callSiteContactPerson != null) { + data['callSiteContactPerson'] = this.callSiteContactPerson.map((v) => v.toJson()).toList(); + } + if (this.status != null) { + data['status'] = this.status.toJson(); + } + if (this.callLastSituation != null) { + data['callLastSituation'] = this.callLastSituation.toJson(); + } + if (this.defectType != null) { + data['defectType'] = this.defectType.toJson(); + } + if (this.firstAction != null) { + data['firstAction'] = this.firstAction.toJson(); + } + data['assetType'] = this.assetType; + return data; + } +} + +class Asset { + int id; + String assetSerialNo; + String systemID; + String assetNumber; + ModelDefinition modelDefinition; + String supplier; + String ipAddress; + String macAddress; + String portNumber; + String assetReplace; + String oldAsset; + bool isParent; + String parentAsset; + int assetType; + Site site; + Building building; + String floor; + Department department; + String room; + String testsDay; + String purchasingPrice; + String nbv; + String currency; + String poNo; + String invoiceNumber; + String invoiceDate; + String replacementDate; + Department originDepartment; + Site originSite; + String budgetYear; + String lastPOPrice; + String commissioningStatus; + String productionDate; + String edd; + String technicalInspectionDate; + String deliveryInspectionDate; + String endUserAcceptanceDate; + String receivingCommittee; + String siteWarrantyMonths; + String extendedWarrantyMonths; + String remainderWarrantyMonths; + String eomWarrantyMonthsNo; + String warrantyValue; + String warrantyEndDate; + String warrantyContractConditions; + List technicalGuidanceBooks; + String comment; + String tagCode; + + Asset( + {this.id, + this.assetSerialNo, + this.systemID, + this.assetNumber, + this.modelDefinition, + this.supplier, + this.ipAddress, + this.macAddress, + this.portNumber, + this.assetReplace, + this.oldAsset, + this.isParent, + this.parentAsset, + this.assetType, + this.site, + this.building, + this.floor, + this.department, + this.room, + this.testsDay, + this.purchasingPrice, + this.nbv, + this.currency, + this.poNo, + this.invoiceNumber, + this.invoiceDate, + this.replacementDate, + this.originDepartment, + this.originSite, + this.budgetYear, + this.lastPOPrice, + this.commissioningStatus, + this.productionDate, + this.edd, + this.technicalInspectionDate, + this.deliveryInspectionDate, + this.endUserAcceptanceDate, + this.receivingCommittee, + this.siteWarrantyMonths, + this.extendedWarrantyMonths, + this.remainderWarrantyMonths, + this.eomWarrantyMonthsNo, + this.warrantyValue, + this.warrantyEndDate, + this.warrantyContractConditions, + this.technicalGuidanceBooks, + this.comment, + this.tagCode}); + + Asset.fromJson(Map json) { + id = json['id']; + assetSerialNo = json['assetSerialNo']; + systemID = json['systemID']; + assetNumber = json['assetNumber']; + modelDefinition = json['modelDefinition'] != null ? new ModelDefinition.fromJson(json['modelDefinition']) : null; + supplier = json['supplier']; + ipAddress = json['ipAddress']; + macAddress = json['macAddress']; + portNumber = json['portNumber']; + assetReplace = json['assetReplace']; + oldAsset = json['oldAsset']; + isParent = json['isParent']; + parentAsset = json['parentAsset']; + assetType = json['assetType']; + site = json['site'] != null ? new Site.fromJson(json['site']) : null; + building = json['building']; + floor = json['floor']; + department = json['department'] != null ? new Department.fromJson(json['department']) : null; + room = json['room']; + testsDay = json['testsDay']; + purchasingPrice = json['purchasingPrice']; + nbv = json['nbv']; + currency = json['currency']; + poNo = json['poNo']; + invoiceNumber = json['invoiceNumber']; + invoiceDate = json['invoiceDate']; + replacementDate = json['replacementDate']; + originDepartment = json['originDepartment'] != null ? new Department.fromJson(json['originDepartment']) : null; + originSite = json['originSite'] != null ? new Site.fromJson(json['originSite']) : null; + budgetYear = json['budgetYear']; + lastPOPrice = json['lastPOPrice']; + commissioningStatus = json['commissioningStatus']; + productionDate = json['productionDate']; + edd = json['edd']; + technicalInspectionDate = json['technicalInspectionDate']; + deliveryInspectionDate = json['deliveryInspectionDate']; + endUserAcceptanceDate = json['endUserAcceptanceDate']; + receivingCommittee = json['receivingCommittee']; + siteWarrantyMonths = json['siteWarrantyMonths']; + extendedWarrantyMonths = json['extendedWarrantyMonths']; + remainderWarrantyMonths = json['remainderWarrantyMonths']; + eomWarrantyMonthsNo = json['eomWarrantyMonthsNo']; + warrantyValue = json['warrantyValue']; + warrantyEndDate = json['warrantyEndDate']; + warrantyContractConditions = json['warrantyContractConditions']; + if (json['technicalGuidanceBooks'] != null) { + technicalGuidanceBooks = []; + json['technicalGuidanceBooks'].forEach((v) { + //technicalGuidanceBooks.add(new Null.fromJson(v)); + }); + } + comment = json['comment']; + tagCode = json['tagCode']; + } + + Map toJson() { + final Map data = new Map(); + data['id'] = this.id; + data['assetSerialNo'] = this.assetSerialNo; + data['systemID'] = this.systemID; + data['assetNumber'] = this.assetNumber; + if (this.modelDefinition != null) { + data['modelDefinition'] = this.modelDefinition.toJson(); + } + data['supplier'] = this.supplier; + data['ipAddress'] = this.ipAddress; + data['macAddress'] = this.macAddress; + data['portNumber'] = this.portNumber; + data['assetReplace'] = this.assetReplace; + data['oldAsset'] = this.oldAsset; + data['isParent'] = this.isParent; + data['parentAsset'] = this.parentAsset; + data['assetType'] = this.assetType; + if (this.site != null) { + data['site'] = this.site.toJson(); + } + data['building'] = this.building; + data['floor'] = this.floor; + if (this.department != null) { + data['department'] = this.department.toJson(); + } + data['room'] = this.room; + data['testsDay'] = this.testsDay; + data['purchasingPrice'] = this.purchasingPrice; + data['nbv'] = this.nbv; + data['currency'] = this.currency; + data['poNo'] = this.poNo; + data['invoiceNumber'] = this.invoiceNumber; + data['invoiceDate'] = this.invoiceDate; + data['replacementDate'] = this.replacementDate; + if (this.originDepartment != null) { + data['originDepartment'] = this.originDepartment.toJson(); + } + if (this.originSite != null) { + data['originSite'] = this.originSite.toJson(); + } + data['budgetYear'] = this.budgetYear; + data['lastPOPrice'] = this.lastPOPrice; + data['commissioningStatus'] = this.commissioningStatus; + data['productionDate'] = this.productionDate; + data['edd'] = this.edd; + data['technicalInspectionDate'] = this.technicalInspectionDate; + data['deliveryInspectionDate'] = this.deliveryInspectionDate; + data['endUserAcceptanceDate'] = this.endUserAcceptanceDate; + data['receivingCommittee'] = this.receivingCommittee; + data['siteWarrantyMonths'] = this.siteWarrantyMonths; + data['extendedWarrantyMonths'] = this.extendedWarrantyMonths; + data['remainderWarrantyMonths'] = this.remainderWarrantyMonths; + data['eomWarrantyMonthsNo'] = this.eomWarrantyMonthsNo; + data['warrantyValue'] = this.warrantyValue; + data['warrantyEndDate'] = this.warrantyEndDate; + data['warrantyContractConditions'] = this.warrantyContractConditions; + if (this.technicalGuidanceBooks != null) { + data['technicalGuidanceBooks'] = this.technicalGuidanceBooks.map((v) => v.toJson()).toList(); + } + data['comment'] = this.comment; + data['tagCode'] = this.tagCode; + return data; + } +} + +class ModelDefinition { + int id; + String assetName; + String modelDefCode; + String modelName; + int manufacturerId; + String manufacturerName; + String supplierName; + String replacementDate; + int lifeSpan; + List modelDefRelatedDefects; + List suppliers; + + ModelDefinition( + {this.id, + this.assetName, + this.modelDefCode, + this.modelName, + this.manufacturerId, + this.manufacturerName, + this.supplierName, + this.replacementDate, + this.lifeSpan, + this.modelDefRelatedDefects, + this.suppliers}); + + ModelDefinition.fromJson(Map json) { + id = json['id']; + assetName = json['assetName']; + modelDefCode = json['modelDefCode']; + modelName = json['modelName']; + manufacturerId = json['manufacturerId']; + manufacturerName = json['manufacturerName']; + supplierName = json['supplierName']; + replacementDate = json['replacementDate']; + lifeSpan = json['lifeSpan']; + if (json['modelDefRelatedDefects'] != null) { + modelDefRelatedDefects = []; + json['modelDefRelatedDefects'].forEach((v) { + modelDefRelatedDefects.add(new ModelDefRelatedDefects.fromJson(v)); + }); + } + if (json['suppliers'] != null) { + suppliers = []; + json['suppliers'].forEach((v) { + // suppliers!.add(new Null.fromJson(v)); + }); + } + } + + Map toJson() { + final Map data = new Map(); + data['id'] = this.id; + data['assetName'] = this.assetName; + data['modelDefCode'] = this.modelDefCode; + data['modelName'] = this.modelName; + data['manufacturerId'] = this.manufacturerId; + data['manufacturerName'] = this.manufacturerName; + data['supplierName'] = this.supplierName; + data['replacementDate'] = this.replacementDate; + data['lifeSpan'] = this.lifeSpan; + if (this.modelDefRelatedDefects != null) { + data['modelDefRelatedDefects'] = this.modelDefRelatedDefects.map((v) => v.toJson()).toList(); + } + if (this.suppliers != null) { + data['suppliers'] = this.suppliers.map((v) => v.toJson()).toList(); + } + return data; + } +} + +class ModelDefRelatedDefects { + int id; + String defectName; + String workPerformed; + String estimatedTime; + + ModelDefRelatedDefects({this.id, this.defectName, this.workPerformed, this.estimatedTime}); + + ModelDefRelatedDefects.fromJson(Map json) { + id = json['id']; + defectName = json['defectName']; + workPerformed = json['workPerformed']; + estimatedTime = json['estimatedTime']; + } + + Map toJson() { + final Map data = new Map(); + data['id'] = this.id; + data['defectName'] = this.defectName; + data['workPerformed'] = this.workPerformed; + data['estimatedTime'] = this.estimatedTime; + return data; + } +} + +class Site { + int id; + int customerCode; + String custName; + List buildings; + + Site({this.id, this.customerCode, this.custName, this.buildings}); + + Site.fromJson(Map json) { + id = json['id']; + customerCode = json['customerCode']; + custName = json['custName']; + if (json['buildings'] != null) { + buildings = []; + json['buildings'].forEach((v) { + // buildings!.add(new Null.fromJson(v)); + }); + } + } + + Map toJson() { + final Map data = new Map(); + data['id'] = this.id; + data['customerCode'] = this.customerCode; + data['custName'] = this.custName; + if (this.buildings != null) { + data['buildings'] = this.buildings.map((v) => v.toJson()).toList(); + } + return data; + } +} + +class Department { + int id; + String departmentName; + String departmentCode; + String ntCode; + + Department({this.id, this.departmentName, this.departmentCode, this.ntCode}); + + Department.fromJson(Map json) { + id = json['id']; + departmentName = json['departmentName']; + departmentCode = json['departmentCode']; + ntCode = json['ntCode']; + } + + Map toJson() { + final Map data = new Map(); + data['id'] = this.id; + data['departmentName'] = this.departmentName; + data['departmentCode'] = this.departmentCode; + data['ntCode'] = this.ntCode; + return data; + } +} + +class AssignedEmployee { + String id; + String name; + + AssignedEmployee({this.id, this.name}); + + AssignedEmployee.fromJson(Map json) { + id = json['id']; + name = json['name']; + } + + Map toJson() { + final Map data = new Map(); + data['id'] = this.id; + data['name'] = this.name; + return data; + } +} + +class CallSiteContactPerson { + int id; + Null employeeCode; + String name; + String telephone; + String job; + String email; + Null land; + String contactUserId; + + CallSiteContactPerson({this.id, this.employeeCode, this.name, this.telephone, this.job, this.email, this.land, this.contactUserId}); + + CallSiteContactPerson.fromJson(Map json) { + id = json['id']; + employeeCode = json['employeeCode']; + name = json['name']; + telephone = json['telephone']; + job = json['job']; + email = json['email']; + land = json['land']; + contactUserId = json['contactUserId']; + } + + Map toJson() { + final Map data = new Map(); + data['id'] = this.id; + data['employeeCode'] = this.employeeCode; + data['name'] = this.name; + data['telephone'] = this.telephone; + data['job'] = this.job; + data['email'] = this.email; + data['land'] = this.land; + data['contactUserId'] = this.contactUserId; + return data; + } +} + +class Status { + int id; + String name; + int value; + + Status({this.id, this.name, this.value}); + + Status.fromJson(Map json) { + id = json['id']; + name = json['name']; + value = json['value']; + } + + Map toJson() { + final Map data = new Map(); + data['id'] = this.id; + data['name'] = this.name; + data['value'] = this.value; + return data; + } +} + +class Building { + int id; + String name; + int value; + var floor; + + Building({this.id, this.name, this.value,this.floor}); + + Building.fromJson(Map json) { + id = json['id']; + name = json['name']; + value = json['value']; + floor = json['floor']; + } + + Map toJson() { + final Map data = new Map(); + data['id'] = this.id; + data['name'] = this.name; + data['value'] = this.value; + data['floor'] = this.floor; + return data; + } +} + diff --git a/lib/models/fault_description.dart b/lib/models/fault_description.dart index 02e67e92..ecc99f7f 100644 --- a/lib/models/fault_description.dart +++ b/lib/models/fault_description.dart @@ -12,11 +12,11 @@ class FaultDescription { estimatedTime = json['estimatedTime']; } num id; - dynamic defectName; + String defectName; String workPerformed; String estimatedTime; FaultDescription copyWith({ num id, - dynamic defectName, + String defectName, String workPerformed, String estimatedTime, }) => FaultDescription( id: id ?? this.id, diff --git a/lib/models/service_report.dart b/lib/models/service_report.dart index e5d5c09d..52dbfac8 100644 --- a/lib/models/service_report.dart +++ b/lib/models/service_report.dart @@ -145,7 +145,7 @@ class ServiceReport { if (visitDate == null) return false; //if(serviceType == null) return false; if (status == null) return false; - if (type == null && assetType == null) return false; + //if (type == null && assetType == null) return false; // if (engineer == null) return false; if (callLastSituation == null) return false; if (callLastSituation?.value == 12) { diff --git a/lib/models/service_request/search_work_order.dart b/lib/models/service_request/search_work_order.dart index a130fee0..713e9125 100644 --- a/lib/models/service_request/search_work_order.dart +++ b/lib/models/service_request/search_work_order.dart @@ -237,7 +237,7 @@ class Asset { String oldAsset; String isParent; String parentAsset; - String assetType; + int assetType; Site site; String building; String floor; diff --git a/lib/views/pages/user/requests/report/create_service_report.dart b/lib/views/pages/user/requests/report/create_service_report.dart index 2f4b2efe..1336ae07 100644 --- a/lib/views/pages/user/requests/report/create_service_report.dart +++ b/lib/views/pages/user/requests/report/create_service_report.dart @@ -11,6 +11,8 @@ import 'package:test_sa/controllers/providers/api/status_drop_down/report/servic import 'package:test_sa/controllers/providers/api/user_provider.dart'; import 'package:test_sa/controllers/providers/settings/setting_provider.dart'; import 'package:test_sa/controllers/validator/validator.dart'; +import 'package:test_sa/models/call_request_for_work_order_model.dart'; +import 'package:test_sa/models/engineer.dart'; import 'package:test_sa/models/part.dart'; import 'package:test_sa/models/service_report.dart'; import 'package:test_sa/models/service_request/service_request.dart'; @@ -28,6 +30,7 @@ import 'package:test_sa/views/widgets/images/mini_one_image_picker.dart'; import 'package:test_sa/views/widgets/loaders/loading_manager.dart'; import 'package:test_sa/views/widgets/parts/auto_complete_parts_field.dart'; import 'package:test_sa/views/widgets/parts/part_item.dart'; +import 'package:test_sa/views/widgets/status/employee/engineers_mune.dart'; import 'package:test_sa/views/widgets/status/report/service_report_last_call.dart'; import 'package:test_sa/views/widgets/status/report/service_report_reasons.dart'; import 'package:test_sa/views/widgets/status/report/service_report_status.dart'; @@ -74,6 +77,7 @@ class _CreateServiceReportState extends State with TickerPr parts: [], ); super.initState(); + // _isLoading = true; } @override @@ -83,14 +87,29 @@ class _CreateServiceReportState extends State with TickerPr super.dispose(); } + CallRequestForWorkOrder _callRequestForWorkOrder; + + void getRequestForWorkOrder() async { + _isLoading = true; + setState(() {}); + _callRequestForWorkOrder = await _serviceRequestsProvider.getCallRequestForWorkOrder(callId: widget.request.id); + _serviceReport.engineer = Engineer.fromJson(_callRequestForWorkOrder.assignedEmployee?.toJson()); + await _assetTypeProvider.getTypes(user: _userProvider.user, host: _settingProvider.host); + _isLoading = false; + setState(() {}); + } + @override Widget build(BuildContext context) { _userProvider = Provider.of(context); _settingProvider = Provider.of(context); _serviceRequestsProvider = Provider.of(context); _assetTypeProvider = Provider.of(context); + if (_callRequestForWorkOrder == null) { + getRequestForWorkOrder(); + } _serviceReport.assetType = _assetTypeProvider.statuses?.firstWhere( - (element) => element.value == widget.request?.device?.hospital?.id, + (element) => element.value == _callRequestForWorkOrder?.assetType, orElse: () => null, ); _subtitle = AppLocalization.of(context).subtitle; @@ -273,6 +292,7 @@ class _CreateServiceReportState extends State with TickerPr const SizedBox( height: 4, ), + LoadingManager( isLoading: _assetTypeProvider.isLoading, isFailedLoading: _assetTypeProvider.statuses == null, @@ -281,7 +301,7 @@ class _CreateServiceReportState extends State with TickerPr _assetTypeProvider.reset(); await _assetTypeProvider.getTypes(user: _userProvider.user, host: _settingProvider.host); _serviceReport?.assetType = _assetTypeProvider.statuses?.firstWhere( - (element) => element.value == widget.request?.device?.hospital?.id, + (element) => element.value == _callRequestForWorkOrder.assetType, orElse: () => null, ); }, @@ -589,9 +609,9 @@ class _CreateServiceReportState extends State with TickerPr // _serviceReport.engineer = engineer; // }, // ), - // const SizedBox( - // height: 8, - // ), + const SizedBox( + height: 8, + ), // invoice number & code _serviceReport.callLastSituation?.id != 12 ? const SizedBox.shrink() @@ -674,37 +694,39 @@ class _CreateServiceReportState extends State with TickerPr const SizedBox( height: 8, ), - // Row( - // children: [ - // ASubTitle(_subtitle.workPreformed), - // Expanded( - // child: SizedBox( - // height: 32 * AppStyle.getScaleFactor(context), - // child: SpeechToTextButton( - // controller: _workPreformedController, - // mini: true, - // ), - // ), - // ), - // ], - // ), - // const SizedBox( - // height: 4, - // ), - // ATextFormField( - // initialValue: _serviceReport?.workPreformed, - // textAlign: TextAlign.center, - // controller: _workPreformedController, - // style: Theme.of(context).textTheme.subtitle1, - // validator: (value) => Validator.hasValue(value) ? null : _subtitle.requiredWord, - // textInputType: TextInputType.multiline, - // onSaved: (value) { - // _serviceReport.workPreformed = value; - // }, - // ), - // const SizedBox( - // height: 8, - // ), + Row( + children: [ + ASubTitle(_subtitle.workPreformed), + // Expanded( + // child: SizedBox( + // height: 32 * AppStyle.getScaleFactor(context), + // child: SpeechToTextButton( + // controller: _workPreformedController, + // mini: true, + // ), + // ), + // ), + ], + ), + const SizedBox( + height: 4, + ), + ATextFormField( + initialValue: _serviceReport?.workPreformed, + textAlign: TextAlign.center, + enable: false, + hintText: _serviceReport.faultDescription?.workPerformed ?? "", + controller: _workPreformedController, + style: Theme.of(context).textTheme.subtitle1, + validator: (value) => Validator.hasValue(value) ? null : _subtitle.requiredWord, + textInputType: TextInputType.multiline, + onSaved: (value) { + _serviceReport.workPreformed = value; + }, + ), + const SizedBox( + height: 8, + ), const SizedBox(height: 8), Row( diff --git a/lib/views/widgets/status/report/fault_desc_menu.dart b/lib/views/widgets/status/report/fault_desc_menu.dart index 4d9e2aed..9250c7dd 100644 --- a/lib/views/widgets/status/report/fault_desc_menu.dart +++ b/lib/views/widgets/status/report/fault_desc_menu.dart @@ -94,7 +94,7 @@ class _SingleStatusMenuState extends State { return DropdownMenuItem( value: value, child: Text( - value.defectName, + value.defectName ?? "", style: Theme.of(context).textTheme.subtitle1.copyWith( color: Theme.of(context).primaryColor, fontSize: 11, diff --git a/lib/views/widgets/status/report/service_report_fault_description.dart b/lib/views/widgets/status/report/service_report_fault_description.dart index 9b0d851f..544fcbb3 100644 --- a/lib/views/widgets/status/report/service_report_fault_description.dart +++ b/lib/views/widgets/status/report/service_report_fault_description.dart @@ -26,7 +26,7 @@ class ServiceReportFaultDescription extends StatelessWidget { stateCode: menuProvider.stateCode, onRefresh: () async { menuProvider.reset(); - await menuProvider.getData(user: userProvider.user, host: settingProvider.host, requestId: requestId); + await menuProvider.getCallRequestForWorkOrder(user: userProvider.user, host: settingProvider.host, requestId: requestId); }, child: (menuProvider.items?.isEmpty ?? true) ? const ATextFormField( From 79d987d49e2ec0594db58402c9c4b0c302364e6d Mon Sep 17 00:00:00 2001 From: Sikander Saleem Date: Tue, 6 Jun 2023 17:12:05 +0300 Subject: [PATCH 060/181] improvement --- .../report/create_service_report.dart | 100 +----------------- 1 file changed, 5 insertions(+), 95 deletions(-) diff --git a/lib/views/pages/user/requests/report/create_service_report.dart b/lib/views/pages/user/requests/report/create_service_report.dart index 1336ae07..76cbe43a 100644 --- a/lib/views/pages/user/requests/report/create_service_report.dart +++ b/lib/views/pages/user/requests/report/create_service_report.dart @@ -194,6 +194,7 @@ class _CreateServiceReportState extends State with TickerPr ]), child: Column( mainAxisSize: MainAxisSize.min, + crossAxisAlignment: CrossAxisAlignment.start, children: [ // Report type and Reasons Row( @@ -453,6 +454,7 @@ class _CreateServiceReportState extends State with TickerPr ), ], ), + const SizedBox(height: 8), ASubTitle(_subtitle.workingHours), const SizedBox(height: 4), ATextFormField( @@ -498,80 +500,9 @@ class _CreateServiceReportState extends State with TickerPr ], ), ), - const SizedBox( - height: 8, - ), + // Report status and Service Type - Row( - children: [ - // report status - Expanded( - child: Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - ASubTitle(_subtitle.reportStatus), - _validate && _serviceReport.status == null - ? ASubTitle( - _subtitle.requiredWord, - color: Colors.red, - ) - : const SizedBox.shrink(), - const SizedBox( - height: 4, - ), - ServiceReportStatusMenu( - report: _serviceReport, - request: widget.request, - onSelect: (status) { - _serviceReport.status = status; - _showCommentField = _serviceReport.status?.name == "Resolved"; - setState(() {}); - }, - ), - ], - ), - ), - const SizedBox( - width: 8, - ), - // Provider.of(context).isLoading == null - // ? const SizedBox.shrink(): - // Call's last Situation - Consumer( - builder: (_, provider, __) { - if (provider.isLoading == null) return const SizedBox.shrink(); - return Expanded( - child: Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - ASubTitle(_subtitle.callLastSituation), - _validate && _serviceReport.callLastSituation == null - ? ASubTitle( - _subtitle.requiredWord, - color: Colors.red, - ) - : const SizedBox.shrink(), - const SizedBox( - height: 4, - ), - ServiceReportLastCallsMenu( - report: _serviceReport, - onSelect: (status) { - if (status?.value == 12 || _serviceReport.callLastSituation?.value == 12) { - _serviceReport.callLastSituation = status; - setState(() {}); - } else { - _serviceReport.callLastSituation = status; - } - }, - ), - ], - ), - ); - }, - ), - ], - ), + if (_showCommentField) const SizedBox( height: 8, @@ -590,28 +521,7 @@ class _CreateServiceReportState extends State with TickerPr SizedBox( height: 8 * AppStyle.getScaleFactor(context), ), - // const ASubTitle("Assigned Employee"), - // const SizedBox( - // height: 8, - // ), - // _validate && _serviceReport.engineer == null - // ? ASubTitle( - // _subtitle.requiredWord, - // color: Colors.red, - // ) - // : const SizedBox.shrink(), - // const SizedBox( - // height: 4, - // ), - // EngineersMenu( - // initialValue: _serviceReport.engineer, - // onSelect: (engineer) { - // _serviceReport.engineer = engineer; - // }, - // ), - const SizedBox( - height: 8, - ), + // invoice number & code _serviceReport.callLastSituation?.id != 12 ? const SizedBox.shrink() From 13c5b3891aca4c561e05a5e477d384c04cd08d6f Mon Sep 17 00:00:00 2001 From: Sikander Saleem Date: Wed, 7 Jun 2023 08:41:24 +0300 Subject: [PATCH 061/181] equipment status added. --- .../api/service_requests_provider.dart | 2 +- ...vice_report_equipment_status_provider.dart | 75 ++++++++++++++++++ lib/main.dart | 2 + lib/models/service_report.dart | 10 +-- .../report/create_service_report.dart | 19 +++-- .../requests/report/edit_service_report.dart | 4 +- .../service_report_equipment_status.dart | 76 +++++++++++++++++++ .../status/report/service_report_status.dart | 4 +- 8 files changed, 177 insertions(+), 15 deletions(-) create mode 100644 lib/controllers/providers/api/status_drop_down/report/service_report_equipment_status_provider.dart create mode 100644 lib/views/widgets/status/report/service_report_equipment_status.dart diff --git a/lib/controllers/providers/api/service_requests_provider.dart b/lib/controllers/providers/api/service_requests_provider.dart index 628cb254..a044543d 100644 --- a/lib/controllers/providers/api/service_requests_provider.dart +++ b/lib/controllers/providers/api/service_requests_provider.dart @@ -336,7 +336,7 @@ class ServiceRequestsProvider extends ChangeNotifier { "reviewComment": report.reviewComment ?? "", "comment": report.comment, "attachmentsWorkOrder": request.devicePhotos?.map((e) => {"name": e})?.toList(), - "equipmentStatus": report.status?.toMap(), + "equipmentStatus": report.equipmentStatus?.toMap(), "suppEngineerWorkOrders": null, "engSignature": report.signatureEngineer, "nurseSignature": report.signatureNurse, diff --git a/lib/controllers/providers/api/status_drop_down/report/service_report_equipment_status_provider.dart b/lib/controllers/providers/api/status_drop_down/report/service_report_equipment_status_provider.dart new file mode 100644 index 00000000..82ac1f49 --- /dev/null +++ b/lib/controllers/providers/api/status_drop_down/report/service_report_equipment_status_provider.dart @@ -0,0 +1,75 @@ +import 'dart:convert'; + +import 'package:test_sa/controllers/api_routes/api_manager.dart'; +import 'package:test_sa/controllers/api_routes/urls.dart'; +import 'package:test_sa/models/lookup.dart'; +import 'package:test_sa/models/user.dart'; +import 'package:flutter/cupertino.dart'; +import 'package:flutter/material.dart'; +import 'package:http/http.dart'; +import 'package:test_sa/controllers/api_routes/urls.dart'; +import 'package:test_sa/models/lookup.dart'; +import 'package:test_sa/models/user.dart'; + +class ServiceReportEquipmentStatusProvider extends ChangeNotifier { + //reset provider data + void reset() { + _status = null; + _stateCode = null; + } + + // state code of current request to defied error message + // like 400 customer request failed + // 500 service not available + int _stateCode; + + int get stateCode => _stateCode; + + // contain user data + // when user not login or register _user = null + List _status; + + List get statuses => _status; + + // when categories in-process _loading = true + // done _loading = true + // failed _loading = false + bool _loading; + + bool get isLoading => _loading; + + set isLoading(bool isLoading) { + _loading = isLoading; + notifyListeners(); + } + + /// return -2 if request in progress + /// return -1 if error happen when sending request + /// 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 getTypes({String host, User user}) async { + if (_loading == true) return -2; + _loading = true; + notifyListeners(); + Response response; + try { + response = await ApiManager.instance.get(URLs.equipmentStatus); + + _stateCode = response.statusCode; + if (response.statusCode >= 200 && response.statusCode < 300) { + // client's request was successfully received + List categoriesListJson = json.decode(response.body)["data"]; + _status = categoriesListJson.map((type) => Lookup.fromJson(type)).toList(); + } + _loading = false; + notifyListeners(); + return response.statusCode; + } catch (error) { + _loading = false; + _stateCode = -1; + notifyListeners(); + return -1; + } + } +} diff --git a/lib/main.dart b/lib/main.dart index 56bcee8c..3d85f355 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -22,6 +22,7 @@ import 'package:test_sa/controllers/providers/api/status_drop_down/gas_refill/ga import 'package:test_sa/controllers/providers/api/status_drop_down/pentry/pentry_task_status_provider.dart'; import 'package:test_sa/controllers/providers/api/status_drop_down/pentry/pentry_visit_status_provider.dart'; import 'package:test_sa/controllers/providers/api/status_drop_down/report/service_report_defect_types_provider.dart'; +import 'package:test_sa/controllers/providers/api/status_drop_down/report/service_report_equipment_status_provider.dart'; import 'package:test_sa/controllers/providers/api/status_drop_down/report/service_report_priority_provider.dart'; import 'package:test_sa/controllers/providers/api/status_drop_down/service_reqest/service_request_first_action_provider.dart'; import 'package:test_sa/controllers/providers/api/status_drop_down/service_reqest/service_request_loan_availability_provider.dart'; @@ -96,6 +97,7 @@ class MyApp extends StatelessWidget { ChangeNotifierProvider(create: (_) => PartsProvider()), ChangeNotifierProvider(create: (_) => ServiceReportReasonsProvider()), ChangeNotifierProvider(create: (_) => ServiceReportStatusProvider()), + ChangeNotifierProvider(create: (_) => ServiceReportEquipmentStatusProvider()), ChangeNotifierProvider(create: (_) => ServiceReportTypesProvider()), ChangeNotifierProvider(create: (_) => ServiceStatusProvider()), ChangeNotifierProvider(create: (_) => ServiceReportLastCallsProvider()), diff --git a/lib/models/service_report.dart b/lib/models/service_report.dart index 52dbfac8..3b681d2a 100644 --- a/lib/models/service_report.dart +++ b/lib/models/service_report.dart @@ -19,7 +19,7 @@ class ServiceReport { Lookup callLastSituation; Lookup repairLocation; Engineer engineer; - Lookup status; + Lookup equipmentStatus; Lookup type; Lookup reason; int faultDescriptionId; @@ -49,7 +49,7 @@ class ServiceReport { this.visitDate, this.endDate, this.assetType, - this.status, + this.equipmentStatus, this.type, this.faultDescriptionId, //this.workHours, @@ -83,7 +83,7 @@ class ServiceReport { if (id != null) _map["id"] = id; if (visitDate != null) _map["visitDate"] = visitDate.toIso8601String(); //if(serviceType != null) _map["service_type"] = serviceType.id.toString(); - if (status != null) _map["status"] = status?.toMap(); + if (equipmentStatus != null) _map["status"] = equipmentStatus?.toMap(); if (type != null) _map["typeOfWO"] = type?.toMap(); if (assetType != null) _map["TypeOfWO"] = assetType?.toMap(); //if(faultDescriptionId != null && faultDescriptionId.isNotEmpty) _map["fault_description"] = faultDescriptionId; @@ -144,7 +144,7 @@ class ServiceReport { bool validate() { if (visitDate == null) return false; //if(serviceType == null) return false; - if (status == null) return false; + if (equipmentStatus == null) return false; //if (type == null && assetType == null) return false; // if (engineer == null) return false; if (callLastSituation == null) return false; @@ -175,7 +175,7 @@ class ServiceReport { assetType: Lookup.fromJson(parsedJson["assetType"]), callLastSituation: Lookup.fromJson(parsedJson["calllastSituation"]), reason: Lookup.fromJson(parsedJson["reason"]), - status: Lookup.fromJson(parsedJson["status"]), + equipmentStatus: Lookup.fromJson(parsedJson["status"]), type: Lookup.fromJson(parsedJson["typeOfWO"]), faultDescriptionId: parsedJson["fault_description"], endDate: DateTime.tryParse(parsedJson["endofWorkTime"]), diff --git a/lib/views/pages/user/requests/report/create_service_report.dart b/lib/views/pages/user/requests/report/create_service_report.dart index 76cbe43a..ad6647e6 100644 --- a/lib/views/pages/user/requests/report/create_service_report.dart +++ b/lib/views/pages/user/requests/report/create_service_report.dart @@ -31,6 +31,7 @@ import 'package:test_sa/views/widgets/loaders/loading_manager.dart'; import 'package:test_sa/views/widgets/parts/auto_complete_parts_field.dart'; import 'package:test_sa/views/widgets/parts/part_item.dart'; import 'package:test_sa/views/widgets/status/employee/engineers_mune.dart'; +import 'package:test_sa/views/widgets/status/report/service_report_equipment_status.dart'; import 'package:test_sa/views/widgets/status/report/service_report_last_call.dart'; import 'package:test_sa/views/widgets/status/report/service_report_reasons.dart'; import 'package:test_sa/views/widgets/status/report/service_report_status.dart'; @@ -330,8 +331,9 @@ class _CreateServiceReportState extends State with TickerPr child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ - ASubTitle(_subtitle.reportStatus), - _validate && _serviceReport.status == null + // ASubTitle(_subtitle.reportStatus), + ASubTitle("Equipment Status"), + _validate && _serviceReport.equipmentStatus == null ? ASubTitle( _subtitle.requiredWord, color: Colors.red, @@ -340,13 +342,20 @@ class _CreateServiceReportState extends State with TickerPr const SizedBox( height: 4, ), - ServiceReportStatusMenu( + // ServiceReportStatusMenu( + // report: _serviceReport, + // request: widget.request, + // onSelect: (status) { + // _serviceReport.status = status; + // }, + // ), + ServiceReportEquipmentStatusMenu( report: _serviceReport, request: widget.request, onSelect: (status) { - _serviceReport.status = status; + _serviceReport.equipmentStatus = status; }, - ), + ) ], ), ), diff --git a/lib/views/pages/user/requests/report/edit_service_report.dart b/lib/views/pages/user/requests/report/edit_service_report.dart index e92f4c7c..848fc4f2 100644 --- a/lib/views/pages/user/requests/report/edit_service_report.dart +++ b/lib/views/pages/user/requests/report/edit_service_report.dart @@ -295,7 +295,7 @@ class _EditServiceReportState extends State with TickerProvid crossAxisAlignment: CrossAxisAlignment.start, children: [ ASubTitle(_subtitle.reportStatus), - _validate && _serviceReport.status == null + _validate && _serviceReport.equipmentStatus == null ? ASubTitle( _subtitle.requiredWord, color: Colors.red, @@ -308,7 +308,7 @@ class _EditServiceReportState extends State with TickerProvid report: _serviceReport, request: widget.request, onSelect: (status) { - _serviceReport.status = status; + _serviceReport.equipmentStatus = status; }, ), ], diff --git a/lib/views/widgets/status/report/service_report_equipment_status.dart b/lib/views/widgets/status/report/service_report_equipment_status.dart new file mode 100644 index 00000000..1a0382b1 --- /dev/null +++ b/lib/views/widgets/status/report/service_report_equipment_status.dart @@ -0,0 +1,76 @@ +import 'dart:math'; + +import 'package:flutter/material.dart'; +import 'package:provider/provider.dart'; +import 'package:test_sa/controllers/providers/api/status_drop_down/report/service_report_last_calls_provider.dart'; +import 'package:test_sa/controllers/providers/api/status_drop_down/report/service_report_equipment_status_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/models/lookup.dart'; +import 'package:test_sa/models/service_report.dart'; +import 'package:test_sa/models/service_request/service_request.dart'; +import 'package:test_sa/views/widgets/loaders/loading_manager.dart'; +import 'package:test_sa/views/widgets/status/single_status_menu.dart'; + +class ServiceReportEquipmentStatusMenu extends StatefulWidget { + final Function(Lookup) onSelect; + final ServiceReport report; + final ServiceRequest request; + + const ServiceReportEquipmentStatusMenu({Key key, this.onSelect, this.report, this.request}) : super(key: key); + + @override + State createState() => _ServiceReportEquipmentStatusMenuState(); +} + +class _ServiceReportEquipmentStatusMenuState extends State { + bool firstTime = true; + @override + Widget build(BuildContext context) { + SettingProvider settingProvider = Provider.of(context); + UserProvider userProvider = Provider.of(context); + ServiceReportEquipmentStatusProvider menuProvider = Provider.of(context); + ServiceReportLastCallsProvider callsLastSituationsProvider = Provider.of(context); + if (firstTime) { + callsLastSituationsProvider.reset(); + + firstTime = false; + } + return LoadingManager( + isLoading: menuProvider.isLoading == true || callsLastSituationsProvider.isLoading == true, + isFailedLoading: menuProvider.statuses == null || callsLastSituationsProvider.calls == null, + stateCode: menuProvider.stateCode == null || callsLastSituationsProvider.stateCode == null ? null : max(menuProvider.stateCode ?? 0, callsLastSituationsProvider.stateCode ?? 0), + onRefresh: () async { + await callsLastSituationsProvider.getCalls( + user: userProvider.user, + host: settingProvider.host, + serviceStatus: widget.report.equipmentStatus?.id, + typeName: widget.report.type?.name, + id: widget.report.id, + woId: widget.request.id, + ); + if (menuProvider.stateCode == null) { + menuProvider.reset(); + await menuProvider.getTypes(user: userProvider.user, host: settingProvider.host); + setState(() {}); + } + }, + child: SingleStatusMenu( + statuses: menuProvider.statuses, + initialStatus: widget.report.equipmentStatus, + onSelect: (status) { + widget.report.callLastSituation = null; + callsLastSituationsProvider.getCalls( + user: userProvider.user, + host: settingProvider.host, + serviceStatus: status.id, + id: widget.report.id, + woId: widget.request.id, + typeName: widget.report.type?.name, + ); + + widget.onSelect(status); + }, + )); + } +} diff --git a/lib/views/widgets/status/report/service_report_status.dart b/lib/views/widgets/status/report/service_report_status.dart index 5d3f797a..b21057cb 100644 --- a/lib/views/widgets/status/report/service_report_status.dart +++ b/lib/views/widgets/status/report/service_report_status.dart @@ -44,7 +44,7 @@ class _ServiceReportStatusMenuState extends State { await callsLastSituationsProvider.getCalls( user: userProvider.user, host: settingProvider.host, - serviceStatus: widget.report.status?.id, + serviceStatus: widget.report.equipmentStatus?.id, typeName: widget.report.type?.name, id: widget.report.id, woId: widget.request.id, @@ -57,7 +57,7 @@ class _ServiceReportStatusMenuState extends State { }, child: SingleStatusMenu( statuses: menuProvider.statuses, - initialStatus: widget.report.status, + initialStatus: widget.report.equipmentStatus, onSelect: (status) { widget.report.callLastSituation = null; callsLastSituationsProvider.getCalls( From 333c684670090c32903001615b0ad28dbfdaae35 Mon Sep 17 00:00:00 2001 From: Sikander Saleem Date: Wed, 7 Jun 2023 16:59:48 +0300 Subject: [PATCH 062/181] improvements --- .../providers/api/device_transfer_provider.dart | 2 +- lib/controllers/providers/api/gas_refill_provider.dart | 3 ++- lib/controllers/providers/api/hospitals_provider.dart | 2 +- lib/controllers/providers/api/notifications_provider.dart | 2 +- lib/controllers/providers/api/parts_provider.dart | 2 +- lib/views/pages/user/visits/pantry/edit_pentry.dart | 8 ++++---- 6 files changed, 10 insertions(+), 9 deletions(-) diff --git a/lib/controllers/providers/api/device_transfer_provider.dart b/lib/controllers/providers/api/device_transfer_provider.dart index f3cd3a46..b0140531 100644 --- a/lib/controllers/providers/api/device_transfer_provider.dart +++ b/lib/controllers/providers/api/device_transfer_provider.dart @@ -10,7 +10,7 @@ import 'package:test_sa/models/user.dart'; class DeviceTransferProvider extends ChangeNotifier { // number of items call in each request - final pageItemNumber = 50; + final pageItemNumber = 12; //reset provider data void reset() { diff --git a/lib/controllers/providers/api/gas_refill_provider.dart b/lib/controllers/providers/api/gas_refill_provider.dart index ef9beedf..c293bf75 100644 --- a/lib/controllers/providers/api/gas_refill_provider.dart +++ b/lib/controllers/providers/api/gas_refill_provider.dart @@ -9,7 +9,7 @@ import 'package:test_sa/models/user.dart'; class GasRefillProvider extends ChangeNotifier { // number of items call in each request - final pageItemNumber = 50; + final pageItemNumber = 12; //reset provider data void reset() { @@ -50,6 +50,7 @@ class GasRefillProvider extends ChangeNotifier { Map body = {}; body["pageNumber"] = (items?.length ?? 0) ~/ pageItemNumber + 1; body["pageSize"] = pageItemNumber; + print("url:${ URLs.getGasRefill}:body:$body"); response = await ApiManager.instance.post( URLs.getGasRefill, diff --git a/lib/controllers/providers/api/hospitals_provider.dart b/lib/controllers/providers/api/hospitals_provider.dart index 9a54490c..38c1f1aa 100644 --- a/lib/controllers/providers/api/hospitals_provider.dart +++ b/lib/controllers/providers/api/hospitals_provider.dart @@ -10,7 +10,7 @@ import 'package:test_sa/models/user.dart'; class HospitalsProvider extends ChangeNotifier { // number of items call in each request - final pageItemNumber = 50; + final pageItemNumber = 12; //reset provider data void reset() { diff --git a/lib/controllers/providers/api/notifications_provider.dart b/lib/controllers/providers/api/notifications_provider.dart index 05ec6738..b7683ab5 100644 --- a/lib/controllers/providers/api/notifications_provider.dart +++ b/lib/controllers/providers/api/notifications_provider.dart @@ -8,7 +8,7 @@ import 'package:test_sa/models/user.dart'; class NotificationsProvider extends ChangeNotifier { // number of items call in each request - final pageItemNumber = 20; + final pageItemNumber = 12; //reset provider data void reset() { diff --git a/lib/controllers/providers/api/parts_provider.dart b/lib/controllers/providers/api/parts_provider.dart index 7f8cca4f..c0ae098c 100644 --- a/lib/controllers/providers/api/parts_provider.dart +++ b/lib/controllers/providers/api/parts_provider.dart @@ -10,7 +10,7 @@ import 'package:test_sa/models/user.dart'; class PartsProvider extends ChangeNotifier { // number of items call in each request - final pageItemNumber = 50; + final pageItemNumber = 20; //reset provider data void reset() { diff --git a/lib/views/pages/user/visits/pantry/edit_pentry.dart b/lib/views/pages/user/visits/pantry/edit_pentry.dart index d0df5e34..55d356b9 100644 --- a/lib/views/pages/user/visits/pantry/edit_pentry.dart +++ b/lib/views/pages/user/visits/pantry/edit_pentry.dart @@ -73,7 +73,7 @@ class _EditPentryState extends State with SingleTickerProviderStateM if (_pentry.pmKits.isEmpty) _pentry.pmKits.add(PMKit()); if (_pentry.calibrationTools.isEmpty) _pentry.calibrationTools.add(CalibrationTool()); if (_pentry.ppmCheckLists.isEmpty) _pentry.ppmCheckLists.add(PPMCheckList()); - _tabController = TabController(length: 4, vsync: this); + _tabController = TabController(length: 3, vsync: this); super.initState(); } @@ -113,9 +113,9 @@ class _EditPentryState extends State with SingleTickerProviderStateM Tab( text: "PPM Check List", ), - Tab( - text: "Calibration Tools", - ), + // Tab( + // text: "Calibration Tools", + // ), Tab( text: "PK Kits", ), From 8e2b21bd9dacd72187688f2033c5110bbe2049fe Mon Sep 17 00:00:00 2001 From: Sikander Saleem Date: Thu, 8 Jun 2023 10:36:53 +0300 Subject: [PATCH 063/181] gas refill cont. --- lib/controllers/api_routes/urls.dart | 5 + .../providers/api/gas_refill_provider.dart | 18 ++- .../providers/api/hospitals_provider.dart | 31 ++++ lib/models/customer.dart | 149 ++++++++++++++++++ lib/models/gas_refill/gas_refill_model.dart | 4 + lib/models/hospital.dart | 128 ++++++++++++++- .../user/gas_refill/request_gas_refill.dart | 94 +++++++++-- .../user/gas_refill/track_gas_refill.dart | 1 + .../gas_refill/building_type_menu.dart | 101 ++++++++++++ .../gas_refill/department_type_menu.dart | 101 ++++++++++++ .../widgets/gas_refill/floor_type_menu.dart | 101 ++++++++++++ .../hospital_auto_complete_field.dart | 9 ++ .../hospital_auto_complete_field_new.dart | 97 ++++++++++++ 13 files changed, 824 insertions(+), 15 deletions(-) create mode 100644 lib/models/customer.dart create mode 100644 lib/views/widgets/gas_refill/building_type_menu.dart create mode 100644 lib/views/widgets/gas_refill/department_type_menu.dart create mode 100644 lib/views/widgets/gas_refill/floor_type_menu.dart create mode 100644 lib/views/widgets/hospitals/hospital_auto_complete_field_new.dart diff --git a/lib/controllers/api_routes/urls.dart b/lib/controllers/api_routes/urls.dart index e52251cd..4dc9dc73 100644 --- a/lib/controllers/api_routes/urls.dart +++ b/lib/controllers/api_routes/urls.dart @@ -1,5 +1,6 @@ class URLs { URLs._(); + static const host2 = "http://194.163.164.213/atoms/api"; static const host1 = "https://atomsuat.hmg.com"; // uat url @@ -18,6 +19,8 @@ class URLs { static get register => "$_baseUrl/handle/create/user"; // post static get updateProfile => "$_baseUrl/update/user/profile"; // post static get getHospitals => "$_baseUrl/Customer/GetCustomers"; // get + static get getHospitalsAutoComplete => "$_baseUrl/Customer/GetCustomersAutoComplete"; // get + static get getDepartments => "$_baseUrl/Customer/GetDepartmentLookup"; // get static get getEquipment => "$_baseUrl/Asset/GetAssets"; // get ?client=208051 static get getModels => "$_baseUrl/ModelDefinition/GetModelDefinitionAsset"; // get ?client=2 @@ -29,7 +32,9 @@ class URLs { static get getServiceFirstAction => "$_baseUrl/Lookups/GetLookup?lookupEnum=700"; // get static get getServiceRequestTypes => "$_baseUrl/Lookups/GetLookup?lookupEnum=604"; // get static get getServiceRequestStatus => "$_baseUrl/Lookups/GetLookup?lookupEnum=503"; + static get getRepairLocation => "$_baseUrl/Lookups/GetLookup?lookupEnum=504"; + static get equipmentStatus => "$_baseUrl/Lookups/GetLookup?lookupEnum=601"; static get getPreventiveMaintenanceVisits => "$_baseUrl/return/user/calibrations"; // get diff --git a/lib/controllers/providers/api/gas_refill_provider.dart b/lib/controllers/providers/api/gas_refill_provider.dart index c293bf75..cb2c6bb6 100644 --- a/lib/controllers/providers/api/gas_refill_provider.dart +++ b/lib/controllers/providers/api/gas_refill_provider.dart @@ -5,6 +5,7 @@ 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/gas_refill/gas_refill_model.dart'; +import 'package:test_sa/models/hospital.dart'; import 'package:test_sa/models/user.dart'; class GasRefillProvider extends ChangeNotifier { @@ -16,6 +17,10 @@ class GasRefillProvider extends ChangeNotifier { items = null; nextPage = true; stateCode = null; + hospital = null; + building = null; + floor = null; + department = null; } // state code of current request to defied error message @@ -50,7 +55,7 @@ class GasRefillProvider extends ChangeNotifier { Map body = {}; body["pageNumber"] = (items?.length ?? 0) ~/ pageItemNumber + 1; body["pageSize"] = pageItemNumber; - print("url:${ URLs.getGasRefill}:body:$body"); + print("url:${URLs.getGasRefill}:body:$body"); response = await ApiManager.instance.post( URLs.getGasRefill, @@ -89,6 +94,11 @@ class GasRefillProvider extends ChangeNotifier { Map body = { "uid": user.id.toString(), "token": user.token ?? "", + "building": {"id": building?.id, "name": building?.name, "value": building?.value}, + "floor": {"id": floor.id, "name": floor.name, "value": floor.value}, + "expectedDate": "2023-06-08T07:03:07.866Z", + "expectedTime": "2023-06-08T07:03:07.866Z", + "department": {"id": department.id, "departmentName": department.name, "departmentCode": "", "ntCode": ""}, "GazRefillNo": "GR-${DateTime.now().toString().split(" ").first}", "status": model.status.toMap(), }; @@ -158,4 +168,10 @@ class GasRefillProvider extends ChangeNotifier { return -1; } } + + Hospital hospital; + Buildings building; + Floors floor; + Departments department; + DateTime expectedDateTime; } diff --git a/lib/controllers/providers/api/hospitals_provider.dart b/lib/controllers/providers/api/hospitals_provider.dart index 38c1f1aa..eb9e3ae9 100644 --- a/lib/controllers/providers/api/hospitals_provider.dart +++ b/lib/controllers/providers/api/hospitals_provider.dart @@ -114,4 +114,35 @@ class HospitalsProvider extends ChangeNotifier { return []; } } + + Future> getHospitalsListByVal({String searchVal=""}) async { + Response response; + try { + if(searchVal.isNotEmpty) { + searchVal = "?searchText=$searchVal"; + } + response = await ApiManager.instance.get(URLs.getHospitalsAutoComplete+searchVal); + // response = await get( + // Uri.parse(host + URLs.getHospitals + // + ( title == null || title.isEmpty ? "" : "?name=$title" )), + // headers: { + // "Content-Type":"application/json; charset=utf-8" + // } + // ); + _stateCode = response.statusCode; + + List _page = []; + if (response.statusCode >= 200 && response.statusCode < 300) { + // client's request was successfully received + List categoriesListJson = json.decode(response.body)["data"]; + _page = categoriesListJson.map((category) => Hospital.fromJson(category)).toList(); + } + return _page; + } catch (error) { + _loading = false; + _stateCode = -1; + notifyListeners(); + return []; + } + } } diff --git a/lib/models/customer.dart b/lib/models/customer.dart new file mode 100644 index 00000000..d075eff9 --- /dev/null +++ b/lib/models/customer.dart @@ -0,0 +1,149 @@ +class Customer { + List data; + String message; + String innerMessage; + int responseCode; + bool isSuccess; + + Customer({this.data, this.message, this.innerMessage, this.responseCode, this.isSuccess}); + + Customer.fromJson(Map json) { + if (json['data'] != null) { + data = []; + json['data'].forEach((v) { + data.add(new Data.fromJson(v)); + }); + } + message = json['message']; + innerMessage = json['innerMessage']; + responseCode = json['responseCode']; + isSuccess = json['isSuccess']; + } + + Map toJson() { + final Map data = new Map(); + if (this.data != null) { + data['data'] = this.data.map((v) => v.toJson()).toList(); + } + data['message'] = this.message; + data['innerMessage'] = this.innerMessage; + data['responseCode'] = this.responseCode; + data['isSuccess'] = this.isSuccess; + return data; + } +} + +class Data { + int id; + int customerCode; + String custName; + List buildings; + + Data({this.id, this.customerCode, this.custName, this.buildings}); + + Data.fromJson(Map json) { + id = json['id']; + customerCode = json['customerCode']; + custName = json['custName']; + if (json['buildings'] != null) { + buildings = new List(); + json['buildings'].forEach((v) { + buildings.add(new Buildings.fromJson(v)); + }); + } + } + + Map toJson() { + final Map data = new Map(); + data['id'] = this.id; + data['customerCode'] = this.customerCode; + data['custName'] = this.custName; + if (this.buildings != null) { + data['buildings'] = this.buildings.map((v) => v.toJson()).toList(); + } + return data; + } +} + +class Buildings { + int id; + String name; + int value; + List floors; + + Buildings({this.id, this.name, this.value, this.floors}); + + Buildings.fromJson(Map json) { + id = json['id']; + name = json['name']; + value = json['value']; + if (json['floors'] != null) { + floors = new List(); + json['floors'].forEach((v) { + floors.add(new Floors.fromJson(v)); + }); + } + } + + Map toJson() { + final Map data = new Map(); + data['id'] = this.id; + data['name'] = this.name; + data['value'] = this.value; + if (this.floors != null) { + data['floors'] = this.floors.map((v) => v.toJson()).toList(); + } + return data; + } +} + +class Floors { + int id; + String name; + int value; + List departments; + + Floors({this.id, this.name, this.value, this.departments}); + + Floors.fromJson(Map json) { + id = json['id']; + name = json['name']; + value = json['value']; + if (json['departments'] != null) { + departments = new List(); + json['departments'].forEach((v) { + departments.add(new Departments.fromJson(v)); + }); + } + } + + Map toJson() { + final Map data = new Map(); + data['id'] = this.id; + data['name'] = this.name; + data['value'] = this.value; + if (this.departments != null) { + data['departments'] = this.departments.map((v) => v.toJson()).toList(); + } + return data; + } +} + +class Departments { + int id; + String name; + + Departments({this.id, this.name}); + + Departments.fromJson(Map json) { + id = json['id']; + name = json['name']; + } + + Map toJson() { + final Map data = new Map(); + data['id'] = this.id; + data['name'] = this.name; + return data; + } +} diff --git a/lib/models/gas_refill/gas_refill_model.dart b/lib/models/gas_refill/gas_refill_model.dart index 4cc43203..f15dd4bc 100644 --- a/lib/models/gas_refill/gas_refill_model.dart +++ b/lib/models/gas_refill/gas_refill_model.dart @@ -7,6 +7,8 @@ class GasRefillModel { String clientName; String title; Lookup status; + Lookup building; + Lookup floor; List details; GasRefillModel({ @@ -21,6 +23,8 @@ class GasRefillModel { bool validate() { if (title == null) return false; if (status == null) return false; + if (building == null) return false; + if (floor == null) return false; if (details == null && details.isEmpty) return false; return true; } diff --git a/lib/models/hospital.dart b/lib/models/hospital.dart index d59eda18..d9c5cd34 100644 --- a/lib/models/hospital.dart +++ b/lib/models/hospital.dart @@ -2,7 +2,7 @@ class Hospital { int id; int customerCode; String name; - List buildings; + List buildings; Hospital({ this.id, @@ -12,7 +12,16 @@ class Hospital { }); factory Hospital.fromJson(Map parsedJson) { - return Hospital(id: parsedJson["id"], name: parsedJson["custName"], customerCode: parsedJson["customerCode"], buildings: parsedJson["buildings"]); + List buildings = []; + + if (parsedJson['buildings'] != null) { + buildings = []; + parsedJson['buildings'].forEach((v) { + buildings.add(new Buildings.fromJson(v)); + }); + } + + return Hospital(id: parsedJson["id"], name: parsedJson["custName"], customerCode: parsedJson["customerCode"], buildings: buildings); } factory Hospital.fromHospital(Hospital hospital) { @@ -23,3 +32,118 @@ class Hospital { return {'id': id, 'customerCode': customerCode, 'custName': name, "buildings": buildings}; } } + +// class Data { +// int id; +// int customerCode; +// String custName; +// List buildings; +// +// Data({this.id, this.customerCode, this.custName, this.buildings}); +// +// Data.fromJson(Map json) { +// id = json['id']; +// customerCode = json['customerCode']; +// custName = json['custName']; +// if (json['buildings'] != null) { +// buildings = new List(); +// json['buildings'].forEach((v) { +// buildings.add(new Buildings.fromJson(v)); +// }); +// } +// } +// +// Map toJson() { +// final Map data = new Map(); +// data['id'] = this.id; +// data['customerCode'] = this.customerCode; +// data['custName'] = this.custName; +// if (this.buildings != null) { +// data['buildings'] = this.buildings.map((v) => v.toJson()).toList(); +// } +// return data; +// } +// } + +class Buildings { + int id; + String name; + int value; + List floors; + + Buildings({this.id, this.name, this.value, this.floors}); + + Buildings.fromJson(Map json) { + id = json['id']; + name = json['name']; + value = json['value']; + if (json['floors'] != null) { + floors = new List(); + json['floors'].forEach((v) { + floors.add(new Floors.fromJson(v)); + }); + } + } + + Map toJson() { + final Map data = new Map(); + data['id'] = this.id; + data['name'] = this.name; + data['value'] = this.value; + if (this.floors != null) { + data['floors'] = this.floors.map((v) => v.toJson()).toList(); + } + return data; + } +} + +class Floors { + int id; + String name; + int value; + List departments; + + Floors({this.id, this.name, this.value, this.departments}); + + Floors.fromJson(Map json) { + id = json['id']; + name = json['name']; + value = json['value']; + if (json['departments'] != null) { + departments = new List(); + json['departments'].forEach((v) { + departments.add(new Departments.fromJson(v)); + }); + } + } + + Map toJson() { + final Map data = new Map(); + data['id'] = this.id; + data['name'] = this.name; + data['value'] = this.value; + if (this.departments != null) { + data['departments'] = this.departments.map((v) => v.toJson()).toList(); + } + return data; + } +} + +class Departments { + int id; + String name; + + Departments({this.id, this.name}); + + Departments.fromJson(Map json) { + id = json['id']; + name = json['name']; + } + + Map toJson() { + final Map data = new Map(); + data['id'] = this.id; + data['name'] = this.name; + return data; + } +} diff --git a/lib/views/pages/user/gas_refill/request_gas_refill.dart b/lib/views/pages/user/gas_refill/request_gas_refill.dart index 79a2320f..d3903a46 100644 --- a/lib/views/pages/user/gas_refill/request_gas_refill.dart +++ b/lib/views/pages/user/gas_refill/request_gas_refill.dart @@ -13,7 +13,12 @@ import 'package:test_sa/models/subtitle.dart'; import 'package:test_sa/views/app_style/sizing.dart'; import 'package:test_sa/views/widgets/app_text_form_field.dart'; import 'package:test_sa/views/widgets/buttons/app_button.dart'; +import 'package:test_sa/views/widgets/date_and_time/time_picker.dart'; +import 'package:test_sa/views/widgets/gas_refill/building_type_menu.dart'; +import 'package:test_sa/views/widgets/gas_refill/department_type_menu.dart'; +import 'package:test_sa/views/widgets/gas_refill/floor_type_menu.dart'; import 'package:test_sa/views/widgets/gas_refill/gas_refill_create_details_item.dart'; +import 'package:test_sa/views/widgets/hospitals/hospital_auto_complete_field_new.dart'; import 'package:test_sa/views/widgets/loaders/loading_manager.dart'; import 'package:test_sa/views/widgets/status/gas_refill/gas_cylinder_size.dart'; import 'package:test_sa/views/widgets/status/gas_refill/gas_cylinder_type.dart'; @@ -25,6 +30,7 @@ import '../../../../controllers/localization/localization.dart'; class RequestGasRefill extends StatefulWidget { static const String id = "/request-gas-refill"; + const RequestGasRefill({Key key}) : super(key: key); @override @@ -110,7 +116,11 @@ class _RequestGasRefillState extends State { _subtitle = AppLocalization.of(context).subtitle; _userProvider = Provider.of(context); _settingProvider = Provider.of(context); - _gasRefillProvider = Provider.of(context, listen: false); + if (_gasRefillProvider == null) { + _gasRefillProvider = Provider.of(context, listen: false); + _gasRefillProvider.reset(); + } + return Scaffold( key: _scaffoldKey, body: Form( @@ -174,25 +184,80 @@ class _RequestGasRefillState extends State { const SizedBox( height: 4, ), - const ASubTitle("Type"), - if (_validate && _currentDetails.type == null) - ASubTitle( - _subtitle.requiredWord, - color: Colors.red, - ), + HospitalAutoCompleteField( + initialValue: _gasRefillProvider.hospital?.name, + // onSave: (value){ + // _search.hospital = value; + // }, + onSearch: (value) { + _gasRefillProvider.hospital = value; + _gasRefillProvider.building = null; + _gasRefillProvider.floor = null; + _gasRefillProvider.department = null; + setState(() {}); + }, + ), const SizedBox( - height: 4, + height: 8, + ), + BuildingTypeMenu( + initialValue: _gasRefillProvider?.building, + building: _gasRefillProvider?.hospital?.buildings, + onSelect: (status) { + _gasRefillProvider.building = status; + setState(() {}); + }, + ), + const SizedBox(height: 8), + FloorTypeMenu( + initialValue: _gasRefillProvider?.floor, + floors: _gasRefillProvider?.building?.floors, + onSelect: (status) { + _gasRefillProvider.floor = status; + setState(() {}); + }, ), + const SizedBox(height: 8), + DepartmentTypeMenu( + initialValue: _gasRefillProvider?.department, + departments: _gasRefillProvider?.floor?.departments, + onSelect: (status) { + _gasRefillProvider.department = status; + setState(() {}); + }, + ), + const SizedBox(height: 8), + Column( + crossAxisAlignment: CrossAxisAlignment.stretch, + children: [ + const ASubTitle("Expected Date Time"), + SizedBox( + height: 8 * AppStyle.getScaleFactor(context), + ), + ADateTimePicker( + date: _gasRefillProvider.expectedDateTime, + from: DateTime.now().subtract(const Duration(days: 365)), + to: DateTime.now().add(const Duration(days: 365)), + onDateTimePicker: (date) { + _gasRefillProvider.expectedDateTime = date; + setState(() {}); + }, + ), + ], + ), + const SizedBox(height: 8), + Divider(color: Theme.of(context).colorScheme.primary), + const SizedBox(height: 4), + const ASubTitle("Type"), + if (_validate && _currentDetails.type == null) ASubTitle(_subtitle.requiredWord, color: Colors.red), + const SizedBox(height: 4), GasTypeMenu( initialValue: _currentDetails.type, onSelect: (status) { _currentDetails.type = status; }, ), - - const SizedBox( - height: 8, - ), + const SizedBox(height: 8), const ASubTitle("Cylinder Size"), if (_validate && _currentDetails.cylinderSize == null) ASubTitle( @@ -208,6 +273,10 @@ class _RequestGasRefillState extends State { _currentDetails.cylinderSize = status; }, ), + const SizedBox( + height: 8, + ), + const SizedBox( height: 8, ), @@ -254,6 +323,7 @@ class _RequestGasRefillState extends State { text: _subtitle.add, onPressed: _addNewModel, ), + if (_formModel.details.isNotEmpty) const ASubTitle("Gas Requests"), ListView.builder( key: _DetailsKey, diff --git a/lib/views/pages/user/gas_refill/track_gas_refill.dart b/lib/views/pages/user/gas_refill/track_gas_refill.dart index aa3141c1..c016fd62 100644 --- a/lib/views/pages/user/gas_refill/track_gas_refill.dart +++ b/lib/views/pages/user/gas_refill/track_gas_refill.dart @@ -23,6 +23,7 @@ class _TrackGasRefillPageState extends State with TickerProv GasRefillProvider _gasRefillProvider; UserProvider _userProvider; SettingProvider _settingProvider; + @override Widget build(BuildContext context) { _gasRefillProvider = Provider.of(context); diff --git a/lib/views/widgets/gas_refill/building_type_menu.dart b/lib/views/widgets/gas_refill/building_type_menu.dart new file mode 100644 index 00000000..2cfb901f --- /dev/null +++ b/lib/views/widgets/gas_refill/building_type_menu.dart @@ -0,0 +1,101 @@ +import 'package:flutter/material.dart'; +import 'package:flutter/widgets.dart'; +import 'package:provider/provider.dart'; +import 'package:test_sa/controllers/providers/api/status_drop_down/gas_refill/gas_types_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/models/hospital.dart'; +import 'package:test_sa/models/lookup.dart'; +import 'package:test_sa/views/app_style/colors.dart'; +import 'package:test_sa/views/app_style/sizing.dart'; +import 'package:test_sa/views/widgets/loaders/loading_manager.dart'; +import 'package:test_sa/views/widgets/status/single_status_menu.dart'; + +class BuildingTypeMenu extends StatefulWidget { + final Function(Buildings) onSelect; + Buildings initialValue; + List building; + + BuildingTypeMenu({Key key, this.onSelect, this.initialValue, this.building = const []}) : super(key: key); + + @override + _BuildingTypeMenuState createState() { + return _BuildingTypeMenuState(); + } +} + +class _BuildingTypeMenuState extends State { + Buildings _selectedBuilding; + List _building; + + @override + void initState() { + super.initState(); + _selectedBuilding = widget.initialValue; + _building = widget.building; + } + + @override + void didUpdateWidget(covariant BuildingTypeMenu oldWidget) { + if (oldWidget.building != widget.building) { + _building = widget.building; + _selectedBuilding = null; + } + super.didUpdateWidget(oldWidget); + } + + @override + void dispose() { + super.dispose(); + } + + @override + Widget build(BuildContext context) { + return Container( + padding: const EdgeInsets.symmetric(horizontal: 16), + decoration: BoxDecoration( + color: AColors.inputFieldBackgroundColor, + border: Border.all( + color: Color(0xffefefef), + ), + borderRadius: BorderRadius.circular(AppStyle.borderRadius * AppStyle.getScaleFactor(context)), + // boxShadow: const [ + // AppStyle.boxShadow + // ] + ), + child: DropdownButton( + value: _selectedBuilding, + iconSize: 24, + icon: const Icon(Icons.keyboard_arrow_down_rounded), + elevation: 0, + isExpanded: true, + hint: Text( + "Select Building", + style: Theme.of(context).textTheme.subtitle1, + ), + style: TextStyle(color: Theme.of(context).primaryColor), + underline: SizedBox.shrink(), + onChanged: (Buildings newValue) { + setState(() { + _selectedBuilding = newValue; + }); + widget.onSelect(newValue); + }, + items: _building?.map>((Buildings value) { + return DropdownMenuItem( + value: value, + child: Text( + value.name, + style: Theme.of(context).textTheme.subtitle1.copyWith( + color: Theme.of(context).primaryColor, + fontSize: 11, + //fontWeight: FontWeight.bold + ), + ), + ); + })?.toList() ?? + [], + ), + ); + } +} diff --git a/lib/views/widgets/gas_refill/department_type_menu.dart b/lib/views/widgets/gas_refill/department_type_menu.dart new file mode 100644 index 00000000..4014f570 --- /dev/null +++ b/lib/views/widgets/gas_refill/department_type_menu.dart @@ -0,0 +1,101 @@ +import 'package:flutter/material.dart'; +import 'package:flutter/widgets.dart'; +import 'package:provider/provider.dart'; +import 'package:test_sa/controllers/providers/api/status_drop_down/gas_refill/gas_types_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/models/hospital.dart'; +import 'package:test_sa/models/lookup.dart'; +import 'package:test_sa/views/app_style/colors.dart'; +import 'package:test_sa/views/app_style/sizing.dart'; +import 'package:test_sa/views/widgets/loaders/loading_manager.dart'; +import 'package:test_sa/views/widgets/status/single_status_menu.dart'; + +class DepartmentTypeMenu extends StatefulWidget { + final Function(Departments) onSelect; + Departments initialValue; + List departments; + + DepartmentTypeMenu({Key key, this.onSelect, this.initialValue, this.departments = const []}) : super(key: key); + + @override + _DepartmentTypeMenuState createState() { + return _DepartmentTypeMenuState(); + } +} + +class _DepartmentTypeMenuState extends State { + Departments _selected; + List _departments; + + @override + void initState() { + super.initState(); + _selected = widget.initialValue; + _departments = widget.departments; + } + + @override + void didUpdateWidget(covariant DepartmentTypeMenu oldWidget) { + if (oldWidget.departments != widget.departments) { + _departments = widget.departments; + _selected = null; + } + super.didUpdateWidget(oldWidget); + } + + @override + void dispose() { + super.dispose(); + } + + @override + Widget build(BuildContext context) { + return Container( + padding: const EdgeInsets.symmetric(horizontal: 16), + decoration: BoxDecoration( + color: AColors.inputFieldBackgroundColor, + border: Border.all( + color: Color(0xffefefef), + ), + borderRadius: BorderRadius.circular(AppStyle.borderRadius * AppStyle.getScaleFactor(context)), + // boxShadow: const [ + // AppStyle.boxShadow + // ] + ), + child: DropdownButton( + value: _selected, + iconSize: 24, + icon: const Icon(Icons.keyboard_arrow_down_rounded), + elevation: 0, + isExpanded: true, + hint: Text( + "Select Department", + style: Theme.of(context).textTheme.subtitle1, + ), + style: TextStyle(color: Theme.of(context).primaryColor), + underline: SizedBox.shrink(), + onChanged: (Departments newValue) { + setState(() { + _selected = newValue; + }); + widget.onSelect(newValue); + }, + items: widget?.departments?.map>((Departments value) { + return DropdownMenuItem( + value: value, + child: Text( + value.name, + style: Theme.of(context).textTheme.subtitle1.copyWith( + color: Theme.of(context).primaryColor, + fontSize: 11, + //fontWeight: FontWeight.bold + ), + ), + ); + })?.toList() ?? + [], + ), + ); + } +} diff --git a/lib/views/widgets/gas_refill/floor_type_menu.dart b/lib/views/widgets/gas_refill/floor_type_menu.dart new file mode 100644 index 00000000..9658b53f --- /dev/null +++ b/lib/views/widgets/gas_refill/floor_type_menu.dart @@ -0,0 +1,101 @@ +import 'package:flutter/material.dart'; +import 'package:flutter/widgets.dart'; +import 'package:provider/provider.dart'; +import 'package:test_sa/controllers/providers/api/status_drop_down/gas_refill/gas_types_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/models/hospital.dart'; +import 'package:test_sa/models/lookup.dart'; +import 'package:test_sa/views/app_style/colors.dart'; +import 'package:test_sa/views/app_style/sizing.dart'; +import 'package:test_sa/views/widgets/loaders/loading_manager.dart'; +import 'package:test_sa/views/widgets/status/single_status_menu.dart'; + +class FloorTypeMenu extends StatefulWidget { + final Function(Floors) onSelect; + Floors initialValue; + List floors; + + FloorTypeMenu({Key key, this.onSelect, this.initialValue, this.floors = const []}) : super(key: key); + + @override + _FloorTypeMenuState createState() { + return _FloorTypeMenuState(); + } +} + +class _FloorTypeMenuState extends State { + Floors _selected; + List _floors; + + @override + void initState() { + super.initState(); + _selected = widget.initialValue; + _floors = widget.floors; + } + + @override + void didUpdateWidget(covariant FloorTypeMenu oldWidget) { + if (oldWidget.floors != widget.floors) { + _floors = widget.floors; + _selected = null; + } + super.didUpdateWidget(oldWidget); + } + + @override + void dispose() { + super.dispose(); + } + + @override + Widget build(BuildContext context) { + return Container( + padding: const EdgeInsets.symmetric(horizontal: 16), + decoration: BoxDecoration( + color: AColors.inputFieldBackgroundColor, + border: Border.all( + color: Color(0xffefefef), + ), + borderRadius: BorderRadius.circular(AppStyle.borderRadius * AppStyle.getScaleFactor(context)), + // boxShadow: const [ + // AppStyle.boxShadow + // ] + ), + child: DropdownButton( + value: _selected, + iconSize: 24, + icon: const Icon(Icons.keyboard_arrow_down_rounded), + elevation: 0, + isExpanded: true, + hint: Text( + "Select Floor", + style: Theme.of(context).textTheme.subtitle1, + ), + style: TextStyle(color: Theme.of(context).primaryColor), + underline: SizedBox.shrink(), + onChanged: (Floors newValue) { + setState(() { + _selected = newValue; + }); + widget.onSelect(newValue); + }, + items: _floors?.map>((Floors value) { + return DropdownMenuItem( + value: value, + child: Text( + value.name, + style: Theme.of(context).textTheme.subtitle1.copyWith( + color: Theme.of(context).primaryColor, + fontSize: 11, + //fontWeight: FontWeight.bold + ), + ), + ); + })?.toList() ?? + [], + ), + ); + } +} diff --git a/lib/views/widgets/hospitals/hospital_auto_complete_field.dart b/lib/views/widgets/hospitals/hospital_auto_complete_field.dart index 40e1eb6a..ea4d662a 100644 --- a/lib/views/widgets/hospitals/hospital_auto_complete_field.dart +++ b/lib/views/widgets/hospitals/hospital_auto_complete_field.dart @@ -34,6 +34,15 @@ class _HospitalAutoCompleteFieldState extends State { super.initState(); } + @override + void didUpdateWidget(covariant HospitalAutoCompleteField oldWidget) { + super.didUpdateWidget(oldWidget); + + if (oldWidget.initialValue != widget.initialValue) { + _controller = TextEditingController(text: widget.initialValue); + } + } + @override void dispose() { _controller.dispose(); diff --git a/lib/views/widgets/hospitals/hospital_auto_complete_field_new.dart b/lib/views/widgets/hospitals/hospital_auto_complete_field_new.dart new file mode 100644 index 00000000..1bc29fd6 --- /dev/null +++ b/lib/views/widgets/hospitals/hospital_auto_complete_field_new.dart @@ -0,0 +1,97 @@ +import 'package:flutter/material.dart'; +import 'package:flutter_typeahead/flutter_typeahead.dart'; +import 'package:provider/provider.dart'; +import 'package:test_sa/controllers/localization/localization.dart'; +import 'package:test_sa/controllers/providers/api/hospitals_provider.dart'; +import 'package:test_sa/controllers/providers/settings/setting_provider.dart'; +import 'package:test_sa/models/hospital.dart'; +import 'package:test_sa/models/subtitle.dart'; +import 'package:test_sa/views/app_style/colors.dart'; +import 'package:test_sa/views/app_style/sizing.dart'; + +class HospitalAutoCompleteField extends StatefulWidget { + final String initialValue; + final Function(Hospital) onSearch; + + //final Function(Hospital) onSave; + + const HospitalAutoCompleteField({ + Key key, + this.onSearch, + this.initialValue, + }) : super(key: key); + + @override + _HospitalAutoCompleteFieldState createState() => _HospitalAutoCompleteFieldState(); +} + +class _HospitalAutoCompleteFieldState extends State { + SettingProvider _settingProvider; + TextEditingController _controller; + + @override + void initState() { + _controller = TextEditingController(text: widget.initialValue); + super.initState(); + } + + @override + void didUpdateWidget(covariant HospitalAutoCompleteField oldWidget) { + super.didUpdateWidget(oldWidget); + + if (oldWidget.initialValue != widget.initialValue) { + _controller = TextEditingController(text: widget.initialValue); + } + } + + @override + void dispose() { + _controller.dispose(); + super.dispose(); + } + + @override + Widget build(BuildContext context) { + _settingProvider = Provider.of(context); + Subtitle _subtitle = AppLocalization.of(context).subtitle; + return Container( + padding: EdgeInsets.symmetric(horizontal: 16), + decoration: BoxDecoration( + color: AColors.inputFieldBackgroundColor, + border: Border.all( + color: Color(0xffefefef), + ), + borderRadius: BorderRadius.circular(AppStyle.borderRadius * AppStyle.getScaleFactor(context)), + // boxShadow: [ + // AppStyle.boxShadow + // ] + ), + child: TypeAheadField( + textFieldConfiguration: TextFieldConfiguration( + style: Theme.of(context).textTheme.headline6, + controller: _controller, + textAlign: TextAlign.center, + decoration: InputDecoration( + hintText: _subtitle.hospital, + border: InputBorder.none, + disabledBorder: InputBorder.none, + focusedBorder: InputBorder.none, + enabledBorder: InputBorder.none, + ), + textInputAction: TextInputAction.search, + ), + suggestionsCallback: (vale) async { + return await HospitalsProvider().getHospitalsListByVal(searchVal: _controller.text); + }, + itemBuilder: (context, hospital) { + return ListTile( + title: Text(hospital.name), + ); + }, + onSuggestionSelected: (hospital) { + widget.onSearch(hospital); + }, + ), + ); + } +} From b51ee155c0c0a4c5763067da14f9ee7997142ff7 Mon Sep 17 00:00:00 2001 From: nextwo <1234> Date: Thu, 8 Jun 2023 13:11:51 +0300 Subject: [PATCH 064/181] track transfer complete --- assets/subtitles/ar_subtitle.json | 1 + assets/subtitles/en_subtitle.json | 1 + lib/models/subtitle.dart | 3 ++ .../device_transfer_details.dart | 28 +++++++++++++++++++ 4 files changed, 33 insertions(+) diff --git a/assets/subtitles/ar_subtitle.json b/assets/subtitles/ar_subtitle.json index 9e86e092..f9962db6 100644 --- a/assets/subtitles/ar_subtitle.json +++ b/assets/subtitles/ar_subtitle.json @@ -192,6 +192,7 @@ "assignedEmployee": "الموظف المعين", "assetSN": "رقم تسلسلي للاصل ", "assetName": "اسم الاصل", + "assetNumber": "رقم الاصل", "site": "الموقع", "maintenanceSituation": "موقع الصيانه", "currentSituation": "الموقع الحالي", diff --git a/assets/subtitles/en_subtitle.json b/assets/subtitles/en_subtitle.json index d66d2e7c..8f43f43d 100644 --- a/assets/subtitles/en_subtitle.json +++ b/assets/subtitles/en_subtitle.json @@ -187,6 +187,7 @@ "assignedEmployee": "Assigned Employee", "assetSN": "Asset S.N", "assetName": "Asset Name", + "assetNumber": "Asset Number", "site": "Site", "maintenanceSituation": "Maintenance Situation", "currentSituation": "Current Situation", diff --git a/lib/models/subtitle.dart b/lib/models/subtitle.dart index 47613fe2..f5eb3011 100644 --- a/lib/models/subtitle.dart +++ b/lib/models/subtitle.dart @@ -213,6 +213,7 @@ class Subtitle { String assignedEmployee; String assetSN; String assetName; + String assetNumber; String site; String maintenanceSituation; String currentSituation; @@ -431,6 +432,7 @@ class Subtitle { @required this.travelingExpense, @required this.startDate, @required this.endDate, + @required this.assetNumber }); factory Subtitle.fromJson(Map parsedJson) { @@ -620,6 +622,7 @@ class Subtitle { assignedEmployee: parsedJson["assignedEmployee"], assetSN: parsedJson["assetSN"], assetName: parsedJson["assetName"], + assetNumber: parsedJson["assetNumber"], site: parsedJson["site"], maintenanceSituation: parsedJson["maintenanceSituation"], currentSituation: parsedJson["currentSituation"], diff --git a/lib/views/pages/device_transfer/device_transfer_details.dart b/lib/views/pages/device_transfer/device_transfer_details.dart index 184cc4b2..9d48ad3a 100644 --- a/lib/views/pages/device_transfer/device_transfer_details.dart +++ b/lib/views/pages/device_transfer/device_transfer_details.dart @@ -93,6 +93,34 @@ class _DeviceTransferDetailsState extends State { title: _subtitle.device, info: widget.model.device.serialNumber, ), + RequestInfoRow( + title: _subtitle.assetNumber, + info: widget.model.device.number, + ), + RequestInfoRow( + title: "Destination Site", + info: widget.model.device.serialNumber, + ), + RequestInfoRow( + title: "Building", + info: widget.model.device.serialNumber, + ), + RequestInfoRow( + title: "Floor", + info: widget.model.device.serialNumber, + ), + RequestInfoRow( + title: "Department", + info: widget.model.device.serialNumber, + ), + RequestInfoRow( + title: "Room", + info: widget.model.device.serialNumber, + ), + RequestInfoRow( + title: "Actions", + info: widget.model.device.serialNumber, + ), const SizedBox(height: 8), Row( children: [ From ee4498a55ee2189347fa87e1578e6f9386046cdc Mon Sep 17 00:00:00 2001 From: zaid_daoud Date: Thu, 8 Jun 2023 15:40:41 +0300 Subject: [PATCH 065/181] Date Time Fields (Gas Refill) --- .../providers/api/gas_refill_provider.dart | 10 +- .../user/gas_refill/request_gas_refill.dart | 102 ++++++++++++++---- 2 files changed, 92 insertions(+), 20 deletions(-) diff --git a/lib/controllers/providers/api/gas_refill_provider.dart b/lib/controllers/providers/api/gas_refill_provider.dart index cb2c6bb6..a229b07a 100644 --- a/lib/controllers/providers/api/gas_refill_provider.dart +++ b/lib/controllers/providers/api/gas_refill_provider.dart @@ -96,8 +96,12 @@ class GasRefillProvider extends ChangeNotifier { "token": user.token ?? "", "building": {"id": building?.id, "name": building?.name, "value": building?.value}, "floor": {"id": floor.id, "name": floor.name, "value": floor.value}, - "expectedDate": "2023-06-08T07:03:07.866Z", - "expectedTime": "2023-06-08T07:03:07.866Z", + if (expectedDateTime != null) "expectedDate": expectedDateTime, + if (expectedDateTime != null) "expectedTime": expectedDateTime, + if (startDate != null) "startDate": startDate, + if (startDate != null) "startTime": startDate, + if (endDate != null) "endDate": endDate, + if (endDate != null) "endTime": endDate, "department": {"id": department.id, "departmentName": department.name, "departmentCode": "", "ntCode": ""}, "GazRefillNo": "GR-${DateTime.now().toString().split(" ").first}", "status": model.status.toMap(), @@ -174,4 +178,6 @@ class GasRefillProvider extends ChangeNotifier { Floors floor; Departments department; DateTime expectedDateTime; + DateTime startDate; + DateTime endDate; } diff --git a/lib/views/pages/user/gas_refill/request_gas_refill.dart b/lib/views/pages/user/gas_refill/request_gas_refill.dart index d3903a46..716a7e62 100644 --- a/lib/views/pages/user/gas_refill/request_gas_refill.dart +++ b/lib/views/pages/user/gas_refill/request_gas_refill.dart @@ -27,6 +27,7 @@ import 'package:test_sa/views/widgets/status/gas_refill/gas_type.dart'; import 'package:test_sa/views/widgets/titles/app_sub_title.dart'; import '../../../../controllers/localization/localization.dart'; +import '../../../../models/enums/user_types.dart'; class RequestGasRefill extends StatefulWidget { static const String id = "/request-gas-refill"; @@ -227,24 +228,89 @@ class _RequestGasRefillState extends State { }, ), const SizedBox(height: 8), - Column( - crossAxisAlignment: CrossAxisAlignment.stretch, - children: [ - const ASubTitle("Expected Date Time"), - SizedBox( - height: 8 * AppStyle.getScaleFactor(context), - ), - ADateTimePicker( - date: _gasRefillProvider.expectedDateTime, - from: DateTime.now().subtract(const Duration(days: 365)), - to: DateTime.now().add(const Duration(days: 365)), - onDateTimePicker: (date) { - _gasRefillProvider.expectedDateTime = date; - setState(() {}); - }, - ), - ], - ), + if (_userProvider.user?.type == UsersTypes.normal_user) + Column( + crossAxisAlignment: CrossAxisAlignment.stretch, + children: [ + const ASubTitle("Expected Date Time"), + SizedBox( + height: 8 * AppStyle.getScaleFactor(context), + ), + ADateTimePicker( + date: _gasRefillProvider.expectedDateTime, + from: DateTime.now().subtract(const Duration(days: 365)), + to: DateTime.now().add(const Duration(days: 365)), + onDateTimePicker: (date) { + _gasRefillProvider.expectedDateTime = date; + setState(() {}); + }, + ), + ], + ), + if (_userProvider.user?.type == UsersTypes.engineer) + Row( + children: [ + Expanded( + child: Column( + crossAxisAlignment: CrossAxisAlignment.stretch, + children: [ + const ASubTitle("Start of Work"), + SizedBox( + height: 8 * AppStyle.getScaleFactor(context), + ), + ADateTimePicker( + date: _gasRefillProvider.startDate, + from: DateTime.now().subtract(const Duration(days: 365)), + to: DateTime.now().add(const Duration(days: 365)), + onDateTimePicker: (date) { + _gasRefillProvider.startDate = date; + setState(() {}); + }, + ), + ], + ), + ), + const SizedBox(width: 8), + Expanded( + child: Column( + crossAxisAlignment: CrossAxisAlignment.stretch, + children: [ + const ASubTitle("End of Work"), + SizedBox( + height: 8 * AppStyle.getScaleFactor(context), + ), + ADateTimePicker( + date: _gasRefillProvider.endDate, + from: DateTime.now().subtract(const Duration(days: 365)), + to: DateTime.now().add(const Duration(days: 365)), + onDateTimePicker: (date) { + _gasRefillProvider.endDate = date; + setState(() {}); + }, + ), + ], + ), + ), + ], + ), + if (_userProvider.user?.type == UsersTypes.engineer) const SizedBox(height: 8), + if (_userProvider.user?.type == UsersTypes.engineer) ASubTitle(_subtitle.workingHours), + if (_userProvider.user?.type == UsersTypes.engineer) const SizedBox(height: 4), + if (_userProvider.user?.type == UsersTypes.engineer) + ATextFormField( + initialValue: null, + textAlign: TextAlign.center, + hintText: _gasRefillProvider.startDate == null + ? "0" + : ((_gasRefillProvider.endDate?.difference(_gasRefillProvider.startDate)?.inMinutes ?? 0) / 60)?.toStringAsFixed(2)?.toString() ?? "0", + enable: false, + style: Theme.of(context).textTheme.subtitle1, + validator: (value) => Validator.isNumeric(value) ? null : _subtitle.requiredWord, + textInputType: TextInputType.number, + onSaved: (value) { + // _serviceReport.workHours = value; + }, + ), const SizedBox(height: 8), Divider(color: Theme.of(context).colorScheme.primary), const SizedBox(height: 4), From 83bf02e69fcbc5792a68609c411502bb196ae710 Mon Sep 17 00:00:00 2001 From: zaid_daoud Date: Sun, 11 Jun 2023 13:43:38 +0300 Subject: [PATCH 066/181] Track Gaz Refill Done --- .../providers/api/gas_refill_provider.dart | 13 ++++ .../call_request_for_work_order_model.dart | 17 +++--- lib/models/gas_refill/gas_refill_model.dart | 31 +++++++++- lib/models/hospital.dart | 44 +++++++------- .../user/gas_refill/gas_refill_details.dart | 36 +++++++++-- .../user/gas_refill/request_gas_refill.dart | 60 +++++++++++++++---- .../gas_refill/building_type_menu.dart | 11 +--- .../gas_refill/department_type_menu.dart | 11 +--- .../widgets/gas_refill/floor_type_menu.dart | 11 +--- 9 files changed, 161 insertions(+), 73 deletions(-) diff --git a/lib/controllers/providers/api/gas_refill_provider.dart b/lib/controllers/providers/api/gas_refill_provider.dart index a229b07a..36c39c27 100644 --- a/lib/controllers/providers/api/gas_refill_provider.dart +++ b/lib/controllers/providers/api/gas_refill_provider.dart @@ -142,6 +142,19 @@ class GasRefillProvider extends ChangeNotifier { "id": newModel.id, "gazRefillNo": newModel.title ?? "", "status": newModel.status.toMap(), + "startDate": startDate?.toIso8601String(), + "startTime": startDate?.toIso8601String(), + "endDate": endDate?.toIso8601String(), + "endTime": endDate?.toIso8601String(), + // "workingHours": 0, + // "assignedEmployee": { + // "id": "string", + // "name": "string" + // }, + "site": hospital?.toMap(), + "building": building?.toJson(includeFloors: false), + "floor": floor?.toJson(includeDepartments: false), + "department": department?.toJson(), }; body["gazRefillDetails"] = newModel.details diff --git a/lib/models/call_request_for_work_order_model.dart b/lib/models/call_request_for_work_order_model.dart index dd0ac5a3..14572afa 100644 --- a/lib/models/call_request_for_work_order_model.dart +++ b/lib/models/call_request_for_work_order_model.dart @@ -328,7 +328,7 @@ class ModelDefinition { if (json['suppliers'] != null) { suppliers = []; json['suppliers'].forEach((v) { - // suppliers!.add(new Null.fromJson(v)); + // suppliers!.add(new Null.fromJson(v)); }); } } @@ -394,7 +394,7 @@ class Site { if (json['buildings'] != null) { buildings = []; json['buildings'].forEach((v) { - // buildings!.add(new Null.fromJson(v)); + // buildings!.add(new Null.fromJson(v)); }); } } @@ -427,11 +427,11 @@ class Department { } Map toJson() { - final Map data = new Map(); - data['id'] = this.id; - data['departmentName'] = this.departmentName; - data['departmentCode'] = this.departmentCode; - data['ntCode'] = this.ntCode; + final Map data = {}; + data['id'] = id; + data['departmentName'] = departmentName; + data['departmentCode'] = departmentCode; + data['ntCode'] = ntCode; return data; } } @@ -520,7 +520,7 @@ class Building { int value; var floor; - Building({this.id, this.name, this.value,this.floor}); + Building({this.id, this.name, this.value, this.floor}); Building.fromJson(Map json) { id = json['id']; @@ -538,4 +538,3 @@ class Building { return data; } } - diff --git a/lib/models/gas_refill/gas_refill_model.dart b/lib/models/gas_refill/gas_refill_model.dart index f15dd4bc..4effc27f 100644 --- a/lib/models/gas_refill/gas_refill_model.dart +++ b/lib/models/gas_refill/gas_refill_model.dart @@ -1,6 +1,8 @@ import 'package:test_sa/models/gas_refill/gas_refill_details.dart'; import 'package:test_sa/models/lookup.dart'; +import '../call_request_for_work_order_model.dart'; + class GasRefillModel { int id; //String userId; @@ -9,8 +11,10 @@ class GasRefillModel { Lookup status; Lookup building; Lookup floor; + Department department; List details; + DateTime startDate, endDate, expectedDate; GasRefillModel({ this.id, //this.userId, @@ -18,13 +22,22 @@ class GasRefillModel { this.title, this.status, this.details, + this.building, + this.floor, + this.startDate, + this.endDate, + this.expectedDate, + this.department, }); bool validate() { if (title == null) return false; if (status == null) return false; - if (building == null) return false; - if (floor == null) return false; + // if (building == null) return false; + // if (floor == null) return false; + // if (department == null) return false; + // if (startDate == null) return false; + // if (endDate == null) return false; if (details == null && details.isEmpty) return false; return true; } @@ -36,6 +49,12 @@ class GasRefillModel { title = model.title; status = Lookup.fromStatus(model.status); details = model.details.map((e) => GasRefillDetails.fromDetails(e)).toList(); + building = model.building; + floor = model.floor; + department = model.department; + startDate = model.startDate; + endDate = model.endDate; + expectedDate = model.expectedDate; } factory GasRefillModel.fromJson(Map parsedJson) { @@ -49,8 +68,14 @@ class GasRefillModel { //userId: parsedJson["uid"], title: parsedJson["gazRefillNo"], clientName: parsedJson["site"] == null ? null : parsedJson["site"]["custName"], - status: Lookup.fromJson(parsedJson["status"]), + status: Lookup.fromJson(parsedJson["status"] ?? {}), details: details, + building: Lookup.fromJson(parsedJson["building"] ?? {}), + floor: Lookup.fromJson(parsedJson["floor"] ?? {}), + department: Department.fromJson(parsedJson["department"] ?? {}), + startDate: DateTime.tryParse(parsedJson['startDate'] ?? ""), + endDate: DateTime.tryParse(parsedJson['endDate'] ?? ""), + expectedDate: DateTime.tryParse(parsedJson['expectedDate'] ?? ""), ); } } diff --git a/lib/models/hospital.dart b/lib/models/hospital.dart index d9c5cd34..f076ad6e 100644 --- a/lib/models/hospital.dart +++ b/lib/models/hospital.dart @@ -17,7 +17,7 @@ class Hospital { if (parsedJson['buildings'] != null) { buildings = []; parsedJson['buildings'].forEach((v) { - buildings.add(new Buildings.fromJson(v)); + buildings.add(Buildings.fromJson(v)); }); } @@ -78,20 +78,20 @@ class Buildings { name = json['name']; value = json['value']; if (json['floors'] != null) { - floors = new List(); + floors = List(); json['floors'].forEach((v) { - floors.add(new Floors.fromJson(v)); + floors.add(Floors.fromJson(v)); }); } } - Map toJson() { - final Map data = new Map(); - data['id'] = this.id; - data['name'] = this.name; - data['value'] = this.value; - if (this.floors != null) { - data['floors'] = this.floors.map((v) => v.toJson()).toList(); + Map toJson({bool includeFloors = true}) { + final Map data = {}; + data['id'] = id; + data['name'] = name; + data['value'] = value; + if (floors != null && includeFloors) { + data['floors'] = floors.map((v) => v.toJson()).toList(); } return data; } @@ -110,20 +110,20 @@ class Floors { name = json['name']; value = json['value']; if (json['departments'] != null) { - departments = new List(); + departments = List(); json['departments'].forEach((v) { - departments.add(new Departments.fromJson(v)); + departments.add(Departments.fromJson(v)); }); } } - Map toJson() { - final Map data = new Map(); - data['id'] = this.id; - data['name'] = this.name; - data['value'] = this.value; - if (this.departments != null) { - data['departments'] = this.departments.map((v) => v.toJson()).toList(); + Map toJson({bool includeDepartments = true}) { + final Map data = {}; + data['id'] = id; + data['name'] = name; + data['value'] = value; + if (departments != null && includeDepartments) { + data['departments'] = departments.map((v) => v.toJson()).toList(); } return data; } @@ -141,9 +141,9 @@ class Departments { } Map toJson() { - final Map data = new Map(); - data['id'] = this.id; - data['name'] = this.name; + final Map data = {}; + data['id'] = id; + data['name'] = name; return data; } } diff --git a/lib/views/pages/user/gas_refill/gas_refill_details.dart b/lib/views/pages/user/gas_refill/gas_refill_details.dart index 9171aea0..c9d9a65d 100644 --- a/lib/views/pages/user/gas_refill/gas_refill_details.dart +++ b/lib/views/pages/user/gas_refill/gas_refill_details.dart @@ -1,15 +1,16 @@ import 'package:flutter/material.dart'; import 'package:fluttertoast/fluttertoast.dart'; +import 'package:intl/intl.dart'; import 'package:provider/provider.dart'; import 'package:test_sa/controllers/api_routes/http_status_manger.dart'; import 'package:test_sa/controllers/localization/localization.dart'; import 'package:test_sa/controllers/providers/api/gas_refill_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/models/enums/user_types.dart'; import 'package:test_sa/models/gas_refill/gas_refill_model.dart'; import 'package:test_sa/models/subtitle.dart'; import 'package:test_sa/views/app_style/sizing.dart'; +import 'package:test_sa/views/pages/user/gas_refill/request_gas_refill.dart'; import 'package:test_sa/views/widgets/buttons/app_back_button.dart'; import 'package:test_sa/views/widgets/buttons/app_button.dart'; import 'package:test_sa/views/widgets/buttons/app_icon_button.dart'; @@ -20,6 +21,7 @@ import 'package:test_sa/views/widgets/requests/request_status.dart'; import 'package:test_sa/views/widgets/status/gas_refill/gas_status.dart'; import 'package:test_sa/views/widgets/titles/app_sub_title.dart'; +import '../../../../models/enums/user_types.dart'; import '../../../app_style/colors.dart'; class GasRefillDetails extends StatefulWidget { @@ -109,14 +111,24 @@ class _GasRefillDetailsState extends State { ), if (_userProvider.user.type == UsersTypes.engineer) AIconButton( - iconData: _enableEdit ? Icons.cancel : Icons.edit, + iconData: /*_enableEdit ? Icons.cancel :*/ Icons.edit, color: Theme.of(context).colorScheme.onPrimary, buttonSize: 42, backgroundColor: AColors.green, onPressed: () async { - _enableEdit = !_enableEdit; + // _enableEdit = !_enableEdit; + print(widget.model.startDate); _model.fromGasRefillModel(widget.model); - setState(() {}); + print(widget.model.startDate); + // setState(() {}); + Navigator.push( + context, + MaterialPageRoute( + builder: (context) => RequestGasRefill( + gasRefillModel: widget.model, + ), + ), + ); }, ), const SizedBox( @@ -139,6 +151,22 @@ class _GasRefillDetailsState extends State { title: _subtitle.hospital, info: _model.clientName, ), + RequestInfoRow( + title: "Building", + info: _model.building?.name, + ), + RequestInfoRow( + title: "Floor", + info: _model.floor?.name, + ), + RequestInfoRow( + title: _subtitle.startDate, + info: _model.startDate == null ? null : DateFormat.yMd().format(_model.startDate), + ), + RequestInfoRow( + title: _subtitle.endDate, + info: _model.endDate == null ? null : DateFormat.yMd().format(_model.endDate), + ), _enableEdit ? Column( crossAxisAlignment: CrossAxisAlignment.start, diff --git a/lib/views/pages/user/gas_refill/request_gas_refill.dart b/lib/views/pages/user/gas_refill/request_gas_refill.dart index 716a7e62..ec6ab810 100644 --- a/lib/views/pages/user/gas_refill/request_gas_refill.dart +++ b/lib/views/pages/user/gas_refill/request_gas_refill.dart @@ -27,12 +27,13 @@ import 'package:test_sa/views/widgets/status/gas_refill/gas_type.dart'; import 'package:test_sa/views/widgets/titles/app_sub_title.dart'; import '../../../../controllers/localization/localization.dart'; +import '../../../../controllers/providers/api/hospitals_provider.dart'; import '../../../../models/enums/user_types.dart'; class RequestGasRefill extends StatefulWidget { static const String id = "/request-gas-refill"; - - const RequestGasRefill({Key key}) : super(key: key); + final GasRefillModel gasRefillModel; + const RequestGasRefill({this.gasRefillModel, Key key}) : super(key: key); @override State createState() => _RequestGasRefillState(); @@ -47,10 +48,19 @@ class _RequestGasRefillState extends State { GasRefillProvider _gasRefillProvider; GasRefillDetails _currentDetails = GasRefillDetails(); final TextEditingController _requestedQuantityController = TextEditingController(); - final GasRefillModel _formModel = GasRefillModel(details: []); + GasRefillModel _formModel = GasRefillModel(details: []); final GlobalKey _formKey = GlobalKey(); final GlobalKey _DetailsKey = GlobalKey(); final GlobalKey _scaffoldKey = GlobalKey(); + bool _firstTime = true; + + @override + void initState() { + super.initState(); + if (widget.gasRefillModel != null) { + _formModel = widget.gasRefillModel; + } + } @override void setState(VoidCallback fn) { @@ -64,12 +74,26 @@ class _RequestGasRefillState extends State { _isLoading = true; setState(() {}); + if (widget.gasRefillModel != null) { + if (!_formModel.validate()) { + _isLoading = false; + setState(() {}); + return; + } + } - int status = await _gasRefillProvider.createModel( - user: _userProvider.user, - host: _settingProvider.host, - model: _formModel, - ); + int status = widget.gasRefillModel == null + ? await _gasRefillProvider.createModel( + user: _userProvider.user, + host: _settingProvider.host, + model: _formModel, + ) + : await _gasRefillProvider.updateModel( + user: _userProvider.user, + host: _settingProvider.host, + oldModel: widget.gasRefillModel, + newModel: _formModel, + ); _isLoading = false; setState(() {}); if (status >= 200 && status < 300) { @@ -121,7 +145,21 @@ class _RequestGasRefillState extends State { _gasRefillProvider = Provider.of(context, listen: false); _gasRefillProvider.reset(); } - + if (widget.gasRefillModel != null && _firstTime) { + _formModel = widget.gasRefillModel; + HospitalsProvider().getHospitalsListByVal(searchVal: widget.gasRefillModel.clientName).then((value) { + _gasRefillProvider.hospital = value?.firstWhere((element) => element.name == widget.gasRefillModel.clientName, orElse: () => null); + print(_gasRefillProvider.hospital?.buildings?.length); + print(widget.gasRefillModel?.building?.name); + _gasRefillProvider.building = _gasRefillProvider.hospital?.buildings?.firstWhere((element) => element.name == widget.gasRefillModel?.building?.name, orElse: () => null); + _gasRefillProvider.floor = _gasRefillProvider.building?.floors?.firstWhere((element) => element.name == widget.gasRefillModel?.floor?.name, orElse: () => null); + _gasRefillProvider.department = _gasRefillProvider.floor?.departments?.firstWhere((element) => element.name == widget.gasRefillModel?.department?.departmentName, orElse: () => null); + _gasRefillProvider.startDate = widget.gasRefillModel?.startDate; + _gasRefillProvider.endDate = widget.gasRefillModel?.endDate; + _firstTime = false; + setState(() {}); + }); + } return Scaffold( key: _scaffoldKey, body: Form( @@ -141,7 +179,7 @@ class _RequestGasRefillState extends State { child: Padding( padding: const EdgeInsets.all(8.0), child: Text( - "Request Gas Refill", + "${widget.gasRefillModel == null ? "Request" : "Update"} Gas Refill", style: Theme.of(context).textTheme.headline5.copyWith(color: Theme.of(context).primaryColor, fontSize: 28, fontWeight: FontWeight.bold), ), ), @@ -408,7 +446,7 @@ class _RequestGasRefillState extends State { }), const SizedBox(height: 16), AButton( - text: _subtitle.submit, + text: widget.gasRefillModel == null ? _subtitle.submit : _subtitle.update, onPressed: _onSubmit, ), const SizedBox( diff --git a/lib/views/widgets/gas_refill/building_type_menu.dart b/lib/views/widgets/gas_refill/building_type_menu.dart index 2cfb901f..2043f157 100644 --- a/lib/views/widgets/gas_refill/building_type_menu.dart +++ b/lib/views/widgets/gas_refill/building_type_menu.dart @@ -1,15 +1,7 @@ import 'package:flutter/material.dart'; -import 'package:flutter/widgets.dart'; -import 'package:provider/provider.dart'; -import 'package:test_sa/controllers/providers/api/status_drop_down/gas_refill/gas_types_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/models/hospital.dart'; -import 'package:test_sa/models/lookup.dart'; import 'package:test_sa/views/app_style/colors.dart'; import 'package:test_sa/views/app_style/sizing.dart'; -import 'package:test_sa/views/widgets/loaders/loading_manager.dart'; -import 'package:test_sa/views/widgets/status/single_status_menu.dart'; class BuildingTypeMenu extends StatefulWidget { final Function(Buildings) onSelect; @@ -41,6 +33,9 @@ class _BuildingTypeMenuState extends State { _building = widget.building; _selectedBuilding = null; } + if (oldWidget.initialValue != widget.initialValue && widget.initialValue != null) { + _selectedBuilding = widget.initialValue; + } super.didUpdateWidget(oldWidget); } diff --git a/lib/views/widgets/gas_refill/department_type_menu.dart b/lib/views/widgets/gas_refill/department_type_menu.dart index 4014f570..1b58c200 100644 --- a/lib/views/widgets/gas_refill/department_type_menu.dart +++ b/lib/views/widgets/gas_refill/department_type_menu.dart @@ -1,15 +1,7 @@ import 'package:flutter/material.dart'; -import 'package:flutter/widgets.dart'; -import 'package:provider/provider.dart'; -import 'package:test_sa/controllers/providers/api/status_drop_down/gas_refill/gas_types_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/models/hospital.dart'; -import 'package:test_sa/models/lookup.dart'; import 'package:test_sa/views/app_style/colors.dart'; import 'package:test_sa/views/app_style/sizing.dart'; -import 'package:test_sa/views/widgets/loaders/loading_manager.dart'; -import 'package:test_sa/views/widgets/status/single_status_menu.dart'; class DepartmentTypeMenu extends StatefulWidget { final Function(Departments) onSelect; @@ -41,6 +33,9 @@ class _DepartmentTypeMenuState extends State { _departments = widget.departments; _selected = null; } + if (oldWidget.initialValue != widget.initialValue && widget.initialValue != null) { + _selected = widget.initialValue; + } super.didUpdateWidget(oldWidget); } diff --git a/lib/views/widgets/gas_refill/floor_type_menu.dart b/lib/views/widgets/gas_refill/floor_type_menu.dart index 9658b53f..e8fe78f7 100644 --- a/lib/views/widgets/gas_refill/floor_type_menu.dart +++ b/lib/views/widgets/gas_refill/floor_type_menu.dart @@ -1,15 +1,7 @@ import 'package:flutter/material.dart'; -import 'package:flutter/widgets.dart'; -import 'package:provider/provider.dart'; -import 'package:test_sa/controllers/providers/api/status_drop_down/gas_refill/gas_types_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/models/hospital.dart'; -import 'package:test_sa/models/lookup.dart'; import 'package:test_sa/views/app_style/colors.dart'; import 'package:test_sa/views/app_style/sizing.dart'; -import 'package:test_sa/views/widgets/loaders/loading_manager.dart'; -import 'package:test_sa/views/widgets/status/single_status_menu.dart'; class FloorTypeMenu extends StatefulWidget { final Function(Floors) onSelect; @@ -41,6 +33,9 @@ class _FloorTypeMenuState extends State { _floors = widget.floors; _selected = null; } + if (oldWidget.initialValue != widget.initialValue && widget.initialValue != null) { + _selected = widget.initialValue; + } super.didUpdateWidget(oldWidget); } From 1381d54208c0126bf2e78c35c286d905850ee9b2 Mon Sep 17 00:00:00 2001 From: zaid_daoud Date: Sun, 11 Jun 2023 13:54:21 +0300 Subject: [PATCH 067/181] Create Gas Refill Bug Fixed --- .../providers/api/gas_refill_provider.dart | 21 +++++++++++-------- 1 file changed, 12 insertions(+), 9 deletions(-) diff --git a/lib/controllers/providers/api/gas_refill_provider.dart b/lib/controllers/providers/api/gas_refill_provider.dart index 36c39c27..e5c0fadd 100644 --- a/lib/controllers/providers/api/gas_refill_provider.dart +++ b/lib/controllers/providers/api/gas_refill_provider.dart @@ -91,22 +91,23 @@ class GasRefillProvider extends ChangeNotifier { @required User user, @required GasRefillModel model, }) async { + print("ss"); Map body = { "uid": user.id.toString(), "token": user.token ?? "", "building": {"id": building?.id, "name": building?.name, "value": building?.value}, - "floor": {"id": floor.id, "name": floor.name, "value": floor.value}, - if (expectedDateTime != null) "expectedDate": expectedDateTime, - if (expectedDateTime != null) "expectedTime": expectedDateTime, - if (startDate != null) "startDate": startDate, - if (startDate != null) "startTime": startDate, - if (endDate != null) "endDate": endDate, - if (endDate != null) "endTime": endDate, - "department": {"id": department.id, "departmentName": department.name, "departmentCode": "", "ntCode": ""}, + "floor": {"id": floor?.id, "name": floor?.name, "value": floor?.value}, + if (expectedDateTime != null) "expectedDate": expectedDateTime?.toIso8601String(), + if (expectedDateTime != null) "expectedTime": expectedDateTime?.toIso8601String(), + if (startDate != null) "startDate": startDate?.toIso8601String(), + if (startDate != null) "startTime": startDate?.toIso8601String(), + if (endDate != null) "endDate": endDate?.toIso8601String(), + if (endDate != null) "endTime": endDate?.toIso8601String(), + "department": {"id": department?.id, "departmentName": department?.name, "departmentCode": "", "ntCode": ""}, "GazRefillNo": "GR-${DateTime.now().toString().split(" ").first}", "status": model.status.toMap(), }; - + print("ss1"); body["gazRefillDetails"] = model.details .map((model) => { "gasType": model.type.toMap(), @@ -119,6 +120,7 @@ class GasRefillProvider extends ChangeNotifier { Response response; try { response = await ApiManager.instance.post(URLs.requestGasRefill, body: body); + print("ss2"); stateCode = response.statusCode; if (response.statusCode >= 200 && response.statusCode < 300) { if (items != null) { @@ -128,6 +130,7 @@ class GasRefillProvider extends ChangeNotifier { } return response.statusCode; } catch (error) { + print(error); return -1; } } From 7ed8f86ba2b5d6163ac1fa84e6b819d7391ae41e Mon Sep 17 00:00:00 2001 From: zaid_daoud Date: Sun, 11 Jun 2023 13:56:41 +0300 Subject: [PATCH 068/181] Create Gas Refill Bug Fixed --- lib/controllers/providers/api/gas_refill_provider.dart | 1 + 1 file changed, 1 insertion(+) diff --git a/lib/controllers/providers/api/gas_refill_provider.dart b/lib/controllers/providers/api/gas_refill_provider.dart index e5c0fadd..bd3cd270 100644 --- a/lib/controllers/providers/api/gas_refill_provider.dart +++ b/lib/controllers/providers/api/gas_refill_provider.dart @@ -95,6 +95,7 @@ class GasRefillProvider extends ChangeNotifier { Map body = { "uid": user.id.toString(), "token": user.token ?? "", + "site": hospital?.toMap(), "building": {"id": building?.id, "name": building?.name, "value": building?.value}, "floor": {"id": floor?.id, "name": floor?.name, "value": floor?.value}, if (expectedDateTime != null) "expectedDate": expectedDateTime?.toIso8601String(), From 7828e52c6431cf4aa89f325105a80d6c299123a6 Mon Sep 17 00:00:00 2001 From: zaid_daoud Date: Sun, 11 Jun 2023 15:27:44 +0300 Subject: [PATCH 069/181] Fixing --- lib/views/pages/user/gas_refill/request_gas_refill.dart | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/lib/views/pages/user/gas_refill/request_gas_refill.dart b/lib/views/pages/user/gas_refill/request_gas_refill.dart index ec6ab810..03a7255f 100644 --- a/lib/views/pages/user/gas_refill/request_gas_refill.dart +++ b/lib/views/pages/user/gas_refill/request_gas_refill.dart @@ -403,7 +403,7 @@ class _RequestGasRefillState extends State { height: 8, ), ASubTitle(_subtitle.quantity), - if (_validate && _currentDetails.requestedQuantity == null) + if (_validate && _currentDetails?.requestedQuantity == null) ASubTitle( _subtitle.requiredWord, color: Colors.red, @@ -418,8 +418,8 @@ class _RequestGasRefillState extends State { style: Theme.of(context).textTheme.subtitle1, validator: (value) => Validator.isNumeric(value) ? null : "allow numbers only", textInputType: TextInputType.number, - onSaved: (value) { - _currentDetails.requestedQuantity = double.tryParse(value); + onChange: (value) { + _currentDetails?.requestedQuantity = double.tryParse(value); }, ), const SizedBox(height: 16), From 8c0ef0acf082e8ec40ee0ecc846df4d6d874b4eb Mon Sep 17 00:00:00 2001 From: nextwo <1234> Date: Mon, 12 Jun 2023 12:39:37 +0300 Subject: [PATCH 070/181] transfer device + track transfer device --- assets/subtitles/ar_subtitle.json | 8 +- assets/subtitles/en_subtitle.json | 10 +- .../api/device_transfer_provider.dart | 58 +++++--- lib/models/device/device.dart | 15 +++ lib/models/device/device_transfer.dart | 7 + lib/models/device/device_transfer_info.dart | 3 + lib/models/subtitle.dart | 21 ++- .../device_transfer_details.dart | 24 ++-- .../request_device_transfer.dart | 124 ++++++++++++++---- .../device_transfer_info_section.dart | 4 + 10 files changed, 218 insertions(+), 56 deletions(-) diff --git a/assets/subtitles/ar_subtitle.json b/assets/subtitles/ar_subtitle.json index f9962db6..271c9c1b 100644 --- a/assets/subtitles/ar_subtitle.json +++ b/assets/subtitles/ar_subtitle.json @@ -201,5 +201,11 @@ "repairLocation" : "موقع الإصلاح", "travelingExpense" : "مصاريف التنقل", "startDate" : "وقت البدء", - "endDate" : "وقت الانتهاء" + "endDate" : "وقت الانتهاء", + "destinationSite": "موقع الوجهه", + "building": "بناء", + "floor": "طابق", + "department": "قسم", + "room": "غرفه", + "actions": "اجراءات" } \ No newline at end of file diff --git a/assets/subtitles/en_subtitle.json b/assets/subtitles/en_subtitle.json index 8f43f43d..ee7b0c25 100644 --- a/assets/subtitles/en_subtitle.json +++ b/assets/subtitles/en_subtitle.json @@ -201,5 +201,13 @@ "repairLocation" : "Repair Location", "travelingExpense": "Traveling Expense", "startDate" : "Start Date", - "endDate" : "End Date" + "endDate" : "End Date", + "destinationSite": "Destination Site", + "building": "Building", + "floor": "Floor", + "department": "Department", + "room": "Room", + "actions": "Actions" + + } \ No newline at end of file diff --git a/lib/controllers/providers/api/device_transfer_provider.dart b/lib/controllers/providers/api/device_transfer_provider.dart index b0140531..ace715d4 100644 --- a/lib/controllers/providers/api/device_transfer_provider.dart +++ b/lib/controllers/providers/api/device_transfer_provider.dart @@ -8,6 +8,8 @@ import 'package:test_sa/models/device/device_transfer.dart'; import 'package:test_sa/models/device/device_transfer_info.dart'; import 'package:test_sa/models/user.dart'; +import '../../../models/hospital.dart'; + class DeviceTransferProvider extends ChangeNotifier { // number of items call in each request final pageItemNumber = 12; @@ -17,6 +19,11 @@ class DeviceTransferProvider extends ChangeNotifier { items = null; nextPage = true; stateCode = null; + hospital = null; + building = null; + floor = null; + department = null; + room=""; } // state code of current request to defied error message @@ -35,6 +42,13 @@ class DeviceTransferProvider extends ChangeNotifier { // failed _loading = false bool isLoading; + + Hospital hospital; + Buildings building; + Floors floor; + Departments department; + String room; + /// return -2 if request in progress /// return -1 if error happen when sending request /// return state code if request complete may be 200, 404 or 403 @@ -46,21 +60,6 @@ class DeviceTransferProvider extends ChangeNotifier { }) async { if (isLoading == true) return -2; isLoading = true; - - // isLoading = false; - // stateCode = 200; - // items = []; - // items.addAll(List.generate(20, (index) => DeviceTransfer( - // title: "ddddd", - // id: "5", - // device: Device(id: "1",brand: "brand",model: "model"), - // destinationClient: Hospital(name: "hospital name",id: "1"), - // destinationDepartment: Department(id: "5",name: "destination Department"), - // senderDepartment: Department(id: "5",name: "sender Department"), - // userId: "5" - // ))); - // notifyListeners(); - // return 200; Response response; try { Map body = {}; @@ -103,12 +102,36 @@ class DeviceTransferProvider extends ChangeNotifier { @required DeviceTransfer model, }) async { Map body = { - // "uid": user.id.toString(), - // "token": user.token ?? "", + "id": 0, "assetId": model.device.id ?? "", "destSiteId": model.receiver.client.id ?? "", "destDepartmentId": model.receiver.department.id ?? "", "senderSiteId": model.receiver.client.id ?? "", + // "transferNo": 0, + // "transferCode": "string", + "destBuildingId": building?.id, + "destFloorId": floor.id, + "destRoom": room, + // "senderBuildingId": 0, + // "senderFloorId": 0, + // "senderDepartmentId": 0, + // "senderRoom": "string", + // "senderAssignedEmployeeId": "string", + // "senderMachineStatusId": 0, + // "senderComment": "string", + // "senderStartDate": "2023-06-11T09:21:56.453Z", + // "senderEndDate": "2023-06-11T09:21:56.453Z", + // "senderWorkingHours": "string", + // "senderTravelingHours": "string", + // "senderAttachmentName": "string", + // "receiverAssignedEmployeeId": "string", + // "receiverMachineStatusId": 0, + // "receiverComment": "string", + // "receiverStartDate": "2023-06-11T09:21:56.453Z", + // "receiverEndDate": "2023-06-11T09:21:56.453Z", + // "receiverWorkingHours": "string", + // "receiverTravelingHours": "string", + // "receiverAttachmentName": "string" }; Response response; @@ -118,6 +141,7 @@ class DeviceTransferProvider extends ChangeNotifier { if (response.statusCode >= 200 && response.statusCode < 300) { if (items != null) { items.insert(0, DeviceTransfer.fromJson(json.decode(utf8.decode(response.bodyBytes))[0])); + reset(); notifyListeners(); } } diff --git a/lib/models/device/device.dart b/lib/models/device/device.dart index 001289e2..72f9d120 100644 --- a/lib/models/device/device.dart +++ b/lib/models/device/device.dart @@ -7,6 +7,11 @@ class Device { int id; String serialNumber; String number; + String destBuildingName; + String destDepartmentName; + String destRoom; + String destFloor; + String destSiteName; // String brand; // String model; ModelDefinition modelDefinition; @@ -17,6 +22,11 @@ class Device { this.serialNumber, this.number, this.hospital, + this.destBuildingName, + this.destDepartmentName, + this.destRoom, + this.destFloor, + this.destSiteName, // this.brand, // this.model, this.modelDefinition, @@ -29,6 +39,11 @@ class Device { number: parsedJson["assetNumber"], modelDefinition: ModelDefinition.fromJson(parsedJson["modelDefinition"]), hospital: Hospital.fromJson(parsedJson["site"]), + destBuildingName: parsedJson["destBuildingName"], + destDepartmentName: parsedJson["destDepartmentName"], + destRoom: parsedJson["destRoom"], + destFloor: parsedJson["destFloor"], + destSiteName:parsedJson['destSiteName'] // parsedJson["modelDefinition"] == null ? "" : // parsedJson["modelDefinition"]["manufacturerName"], // model: parsedJson["modelDefinition"] == null ? "" : diff --git a/lib/models/device/device_transfer.dart b/lib/models/device/device_transfer.dart index acda1187..d4d062b4 100644 --- a/lib/models/device/device_transfer.dart +++ b/lib/models/device/device_transfer.dart @@ -49,6 +49,11 @@ class DeviceTransfer { id: parsedJson["assetId"], number: parsedJson["assetNumber"], serialNumber: parsedJson["assetSerialNo"], + destBuildingName: parsedJson["destBuildingName"], + destDepartmentName: parsedJson["destDepartmentName"], + destFloor: parsedJson["destFloor"], + destRoom: parsedJson["destRoom"], + destSiteName: parsedJson["destSiteName"] ), sender: DeviceTransferInfo( travelingHours: parsedJson["senderTravelingHours"], @@ -56,6 +61,7 @@ class DeviceTransfer { workingHours: parsedJson["senderWorkingHours"], userId: parsedJson["senderAssignedEmployeeId"], userName: parsedJson["senderAssignedEmployeeName"], + assignedEmployeeName: parsedJson["senderAssignedEmployeeName"], client: Hospital(id: parsedJson["senderSiteId"], name: parsedJson["senderSiteName"]), department: Department( id: parsedJson["senderDepartmentId"], @@ -74,6 +80,7 @@ class DeviceTransfer { workingHours: parsedJson["receiverWorkingHours"], userId: parsedJson["receiverAssignedEmployeeId"], userName: parsedJson["receiverAssignedEmployeeName"], + assignedEmployeeName: parsedJson["receiverAssignedEmployeeName"], client: Hospital(id: parsedJson["destSiteId"], name: parsedJson["destSiteName"]), department: Department( id: parsedJson["destDepartmentId"], diff --git a/lib/models/device/device_transfer_info.dart b/lib/models/device/device_transfer_info.dart index ca20907e..74365ce0 100644 --- a/lib/models/device/device_transfer_info.dart +++ b/lib/models/device/device_transfer_info.dart @@ -11,6 +11,7 @@ class DeviceTransferInfo { String travelingHours; String userName; String signature; + String assignedEmployeeName; Lookup status; DeviceTransferInfo({ @@ -23,6 +24,7 @@ class DeviceTransferInfo { this.workingHours, this.signature, this.status, + this.assignedEmployeeName }); Map toJson(bool isSender) { @@ -63,6 +65,7 @@ class DeviceTransferInfo { signature: parsedJson["${key}image"], userId: parsedJson["${key}id"], comment: parsedJson["${key}comment"], + assignedEmployeeName:parsedJson["${key}AssignedEmployeeName"], client: Hospital(id: parsedJson["${key}SiteId"], name: parsedJson["${key}SiteName"]), department: Department( id: parsedJson["${key}DepartmentId"], diff --git a/lib/models/subtitle.dart b/lib/models/subtitle.dart index f5eb3011..7b015170 100644 --- a/lib/models/subtitle.dart +++ b/lib/models/subtitle.dart @@ -229,6 +229,13 @@ class Subtitle { String travelingExpense; String startDate; String endDate; + String destinationSite; + String building; + String floor; + String department; + String room; + String actions; + void setIssues(List issues) { issues.clear(); @@ -432,7 +439,13 @@ class Subtitle { @required this.travelingExpense, @required this.startDate, @required this.endDate, - @required this.assetNumber + @required this.assetNumber, + @required this.destinationSite, + @required this.building, + @required this.floor, + @required this.department, + @required this.room, + @required this.actions, }); factory Subtitle.fromJson(Map parsedJson) { @@ -630,6 +643,12 @@ class Subtitle { travelingExpense: parsedJson["travelingExpense"], startDate: parsedJson["startDate"], endDate: parsedJson["endDate"], + destinationSite: parsedJson["destinationSite"], + building: parsedJson["building"], + floor: parsedJson["floor"], + department: parsedJson["department"], + room: parsedJson["room"], + actions: parsedJson["actions"], ); } } diff --git a/lib/views/pages/device_transfer/device_transfer_details.dart b/lib/views/pages/device_transfer/device_transfer_details.dart index 9d48ad3a..b7726ff6 100644 --- a/lib/views/pages/device_transfer/device_transfer_details.dart +++ b/lib/views/pages/device_transfer/device_transfer_details.dart @@ -98,28 +98,28 @@ class _DeviceTransferDetailsState extends State { info: widget.model.device.number, ), RequestInfoRow( - title: "Destination Site", - info: widget.model.device.serialNumber, + title: _subtitle.destinationSite, + info: widget.model.device.destSiteName, ), RequestInfoRow( - title: "Building", - info: widget.model.device.serialNumber, + title: _subtitle.building, + info: widget.model.device.destBuildingName, ), RequestInfoRow( - title: "Floor", - info: widget.model.device.serialNumber, + title: _subtitle.floor, + info: widget.model.device.destFloor, ), RequestInfoRow( - title: "Department", - info: widget.model.device.serialNumber, + title: _subtitle.department, + info: widget.model.device.destDepartmentName, ), RequestInfoRow( - title: "Room", - info: widget.model.device.serialNumber, + title: _subtitle.room, + info: widget.model.device.destRoom, ), RequestInfoRow( - title: "Actions", - info: widget.model.device.serialNumber, + title: _subtitle.actions, + info: "", ), const SizedBox(height: 8), Row( diff --git a/lib/views/pages/device_transfer/request_device_transfer.dart b/lib/views/pages/device_transfer/request_device_transfer.dart index 9deba1eb..3d0cb755 100644 --- a/lib/views/pages/device_transfer/request_device_transfer.dart +++ b/lib/views/pages/device_transfer/request_device_transfer.dart @@ -6,6 +6,7 @@ import 'package:test_sa/controllers/providers/api/device_transfer_provider.dart' import 'package:test_sa/controllers/providers/api/user_provider.dart'; import 'package:test_sa/controllers/providers/settings/setting_provider.dart'; import 'package:test_sa/extensions/int_extensions.dart'; +import 'package:test_sa/models/department.dart'; import 'package:test_sa/models/device/device_transfer.dart'; import 'package:test_sa/models/device/device_transfer_info.dart'; import 'package:test_sa/models/subtitle.dart'; @@ -18,6 +19,12 @@ import 'package:test_sa/views/widgets/loaders/loading_manager.dart'; import 'package:test_sa/views/widgets/titles/app_sub_title.dart'; import '../../../../controllers/localization/localization.dart'; +import '../../../controllers/validator/validator.dart'; +import '../../widgets/app_text_form_field.dart'; +import '../../widgets/gas_refill/building_type_menu.dart'; +import '../../widgets/gas_refill/department_type_menu.dart'; +import '../../widgets/gas_refill/floor_type_menu.dart'; +import '../../widgets/hospitals/hospital_auto_complete_field_new.dart'; class RequestDeviceTransfer extends StatefulWidget { static const String id = "/request-device-transfer"; @@ -84,6 +91,7 @@ class _RequestDeviceTransferState extends State { @override void dispose() { _requestedQuantityController.dispose(); + _deviceTransferProvider.reset(); super.dispose(); } @@ -158,36 +166,104 @@ class _RequestDeviceTransferState extends State { // setState(() {}); // }, // ), - 12.height, - const ASubTitle("Destination Client"), - if (_validate && _formModel.receiver.client == null) - ASubTitle( - _subtitle.requiredWord, - color: Colors.red, - ), - 6.height, - HospitalButton( - hospital: _formModel.receiver.client, - onHospitalPick: (hospital) { - _formModel.receiver.client = hospital; + // 12.height, + // const ASubTitle("Destination Client"), + // if (_validate && _formModel.receiver.client == null) + // ASubTitle( + // _subtitle.requiredWord, + // color: Colors.red, + // ), + // 6.height, + // HospitalButton( + // hospital: _formModel.receiver.client, + // onHospitalPick: (hospital) { + // _formModel.receiver.client = hospital; + // setState(() {}); + // }, + // ), + // 12.height, + // const ASubTitle("Destination Department"), + // if (_validate && _formModel.receiver.department == null) + // ASubTitle( + // _subtitle.requiredWord, + // color: Colors.red, + // ), + // 6.height, + // DepartmentButton( + // department: _formModel.receiver.department, + // onDepartmentPick: (department) { + // _formModel.receiver.department = department; + // setState(() {}); + // }, + // ), + const SizedBox( + height: 4, + ), + Divider( + color: Theme.of(context).colorScheme.primary, + ), + const SizedBox( + height: 4, + ), + HospitalAutoCompleteField( + initialValue: _deviceTransferProvider.hospital?.name, + // onSave: (value){ + // _search.hospital = value; + // }, + onSearch: (value) { + _deviceTransferProvider.hospital = value; + _deviceTransferProvider.building = null; + _deviceTransferProvider.floor = null; + _deviceTransferProvider.department = null; + _formModel.receiver.client = value; setState(() {}); }, ), - 12.height, - const ASubTitle("Destination Department"), - if (_validate && _formModel.receiver.department == null) - ASubTitle( - _subtitle.requiredWord, - color: Colors.red, - ), - 6.height, - DepartmentButton( - department: _formModel.receiver.department, - onDepartmentPick: (department) { - _formModel.receiver.department = department; + const SizedBox( + height: 8, + ), + BuildingTypeMenu( + initialValue: _deviceTransferProvider?.building, + building: _deviceTransferProvider?.hospital?.buildings, + onSelect: (status) { + _deviceTransferProvider.building = status; setState(() {}); }, ), + const SizedBox(height: 8), + FloorTypeMenu( + initialValue: _deviceTransferProvider?.floor, + floors: _deviceTransferProvider?.building?.floors, + onSelect: (status) { + _deviceTransferProvider.floor = status; + setState(() {}); + }, + ), + const SizedBox(height: 8), + DepartmentTypeMenu( + initialValue: _deviceTransferProvider?.department, + departments: _deviceTransferProvider?.floor?.departments, + onSelect: (status) { + _deviceTransferProvider.department = status; + _formModel.receiver.department = Department(id: status.id, name: status.name) ; + setState(() {}); + }, + ), + const SizedBox(height: 8), + ASubTitle("Room"), + SizedBox( + height: 4, + ), + ATextFormField( + textAlign: TextAlign.center, + controller: _requestedQuantityController, + style: Theme.of(context).textTheme.subtitle1, + validator: (value) => Validator.isNumeric(value) ? null : "allow numbers only", + textInputType: TextInputType.number, + onSaved: (value) { + _deviceTransferProvider.room=value; + }, + ), 12.height, AButton( text: _subtitle.submit, diff --git a/lib/views/widgets/device_trancfer/device_transfer_info_section.dart b/lib/views/widgets/device_trancfer/device_transfer_info_section.dart index 55e6b1d3..a311cb14 100644 --- a/lib/views/widgets/device_trancfer/device_transfer_info_section.dart +++ b/lib/views/widgets/device_trancfer/device_transfer_info_section.dart @@ -40,6 +40,10 @@ class DeviceTransferInfoSection extends StatelessWidget { title: "Comment", info: info.comment, ), + RequestInfoRow( + title: "Assigned FE", + info: info.assignedEmployeeName, + ), RequestInfoRow( title: "Signature", info: info.signature?.isEmpty != false ? subtitle.noDateFound : null, From c24fe473ff0f888f8c021812ae269fdf0866d9e3 Mon Sep 17 00:00:00 2001 From: zaid_daoud Date: Mon, 12 Jun 2023 14:46:04 +0300 Subject: [PATCH 071/181] Add Delivered Quantity Field --- assets/subtitles/ar_subtitle.json | 4 ++- assets/subtitles/en_subtitle.json | 4 ++- lib/models/subtitle.dart | 6 +++++ .../user/gas_refill/request_gas_refill.dart | 25 ++++++++++++++++++- .../gas_refill_create_details_item.dart | 2 +- 5 files changed, 37 insertions(+), 4 deletions(-) diff --git a/assets/subtitles/ar_subtitle.json b/assets/subtitles/ar_subtitle.json index 9e86e092..74e890ad 100644 --- a/assets/subtitles/ar_subtitle.json +++ b/assets/subtitles/ar_subtitle.json @@ -200,5 +200,7 @@ "repairLocation" : "موقع الإصلاح", "travelingExpense" : "مصاريف التنقل", "startDate" : "وقت البدء", - "endDate" : "وقت الانتهاء" + "endDate" : "وقت الانتهاء", + "requestedQuantity" : "الكمية المطلوبة", + "deliveredQuantity" : "الكمية المسلّمة" } \ No newline at end of file diff --git a/assets/subtitles/en_subtitle.json b/assets/subtitles/en_subtitle.json index d66d2e7c..d94d4296 100644 --- a/assets/subtitles/en_subtitle.json +++ b/assets/subtitles/en_subtitle.json @@ -200,5 +200,7 @@ "repairLocation" : "Repair Location", "travelingExpense": "Traveling Expense", "startDate" : "Start Date", - "endDate" : "End Date" + "endDate" : "End Date", + "requestedQuantity" : "Requested Quantity", + "deliveredQuantity" : "Delivered Quantity" } \ No newline at end of file diff --git a/lib/models/subtitle.dart b/lib/models/subtitle.dart index 47613fe2..8d3b4056 100644 --- a/lib/models/subtitle.dart +++ b/lib/models/subtitle.dart @@ -228,6 +228,8 @@ class Subtitle { String travelingExpense; String startDate; String endDate; + String requestedQuantity; + String deliveredQuantity; void setIssues(List issues) { issues.clear(); @@ -431,6 +433,8 @@ class Subtitle { @required this.travelingExpense, @required this.startDate, @required this.endDate, + @required this.requestedQuantity, + @required this.deliveredQuantity, }); factory Subtitle.fromJson(Map parsedJson) { @@ -627,6 +631,8 @@ class Subtitle { travelingExpense: parsedJson["travelingExpense"], startDate: parsedJson["startDate"], endDate: parsedJson["endDate"], + requestedQuantity: parsedJson["requestedQuantity"], + deliveredQuantity: parsedJson["deliveredQuantity"], ); } } diff --git a/lib/views/pages/user/gas_refill/request_gas_refill.dart b/lib/views/pages/user/gas_refill/request_gas_refill.dart index 03a7255f..da419033 100644 --- a/lib/views/pages/user/gas_refill/request_gas_refill.dart +++ b/lib/views/pages/user/gas_refill/request_gas_refill.dart @@ -48,6 +48,7 @@ class _RequestGasRefillState extends State { GasRefillProvider _gasRefillProvider; GasRefillDetails _currentDetails = GasRefillDetails(); final TextEditingController _requestedQuantityController = TextEditingController(); + final TextEditingController _deliveredQuantityController = TextEditingController(); GasRefillModel _formModel = GasRefillModel(details: []); final GlobalKey _formKey = GlobalKey(); final GlobalKey _DetailsKey = GlobalKey(); @@ -125,6 +126,7 @@ class _RequestGasRefillState extends State { _validate = false; Scrollable.ensureVisible(_DetailsKey.currentContext); _requestedQuantityController.clear(); + _deliveredQuantityController.clear(); _currentDetails = GasRefillDetails(); setState(() {}); return true; @@ -133,6 +135,7 @@ class _RequestGasRefillState extends State { @override void dispose() { _requestedQuantityController.dispose(); + _deliveredQuantityController.dispose(); super.dispose(); } @@ -402,7 +405,7 @@ class _RequestGasRefillState extends State { const SizedBox( height: 8, ), - ASubTitle(_subtitle.quantity), + ASubTitle(_subtitle.requestedQuantity), if (_validate && _currentDetails?.requestedQuantity == null) ASubTitle( _subtitle.requiredWord, @@ -422,6 +425,26 @@ class _RequestGasRefillState extends State { _currentDetails?.requestedQuantity = double.tryParse(value); }, ), + if (widget.gasRefillModel != null) const SizedBox(height: 16), + if (widget.gasRefillModel != null) ASubTitle(_subtitle.deliveredQuantity), + if (widget.gasRefillModel != null && _validate && _currentDetails?.deliveredQuantity == null) + ASubTitle( + _subtitle.requiredWord, + color: Colors.red, + ), + if (widget.gasRefillModel != null) const SizedBox(height: 4), + if (widget.gasRefillModel != null) + ATextFormField( + initialValue: (_currentDetails?.deliveredQuantity ?? "").toString(), + textAlign: TextAlign.center, + controller: _deliveredQuantityController, + style: Theme.of(context).textTheme.subtitle1, + validator: (value) => Validator.isNumeric(value) ? null : "allow numbers only", + textInputType: TextInputType.number, + onChange: (value) { + _currentDetails?.deliveredQuantity = double.tryParse(value); + }, + ), const SizedBox(height: 16), AButton( text: _subtitle.add, diff --git a/lib/views/widgets/gas_refill/gas_refill_create_details_item.dart b/lib/views/widgets/gas_refill/gas_refill_create_details_item.dart index 41d0806f..8fef555f 100644 --- a/lib/views/widgets/gas_refill/gas_refill_create_details_item.dart +++ b/lib/views/widgets/gas_refill/gas_refill_create_details_item.dart @@ -27,7 +27,7 @@ class GasRefillCreateDetailsItem extends StatelessWidget { if (model.deliveredQuantity != null) Row( children: [ - const Text("Delivered Quantity"), + const Text("Delivered Quantity: "), Text(model.deliveredQuantity.toStringAsFixed(0)), ], ), From 1b7c1a3692e18f6d7a754fdd6e450acec4a6a566 Mon Sep 17 00:00:00 2001 From: nextwo <1234> Date: Mon, 12 Jun 2023 18:02:51 +0300 Subject: [PATCH 072/181] editing in working hours in update transfer device --- .../api/device_transfer_provider.dart | 5 +- .../update_device_transfer.dart | 83 ++++++++++++++++--- 2 files changed, 76 insertions(+), 12 deletions(-) diff --git a/lib/controllers/providers/api/device_transfer_provider.dart b/lib/controllers/providers/api/device_transfer_provider.dart index ace715d4..f9ed081d 100644 --- a/lib/controllers/providers/api/device_transfer_provider.dart +++ b/lib/controllers/providers/api/device_transfer_provider.dart @@ -48,6 +48,8 @@ class DeviceTransferProvider extends ChangeNotifier { Floors floor; Departments department; String room; + DateTime startDate; + DateTime endDate; /// return -2 if request in progress /// return -1 if error happen when sending request @@ -207,8 +209,6 @@ class DeviceTransferProvider extends ChangeNotifier { }); } - print(body["senderWorkingHours"]); - body.addAll(newModel.toJson(isSender)); print(body); Response response; @@ -237,4 +237,5 @@ class DeviceTransferProvider extends ChangeNotifier { return -1; } } + } diff --git a/lib/views/pages/device_transfer/update_device_transfer.dart b/lib/views/pages/device_transfer/update_device_transfer.dart index ce0f827c..eaaafded 100644 --- a/lib/views/pages/device_transfer/update_device_transfer.dart +++ b/lib/views/pages/device_transfer/update_device_transfer.dart @@ -19,6 +19,8 @@ import 'package:test_sa/views/widgets/status/gas_refill/gas_status.dart'; import 'package:test_sa/views/widgets/titles/app_sub_title.dart'; import '../../../../controllers/localization/localization.dart'; +import '../../../controllers/validator/validator.dart'; +import '../../widgets/date_and_time/time_picker.dart'; class UpdateDeviceTransfer extends StatefulWidget { final DeviceTransfer model; @@ -66,10 +68,10 @@ class _UpdateDeviceTransferState extends State { } } - @override - void setState(VoidCallback fn) { - if (!mounted) super.setState(() {}); - } + // @override + // void setState(VoidCallback fn) { + // if (!mounted) super.setState(() {}); + // } @override void initState() { @@ -147,21 +149,82 @@ class _UpdateDeviceTransferState extends State { }, ), const SizedBox( - height: 8, + height: 16, ), - ASubTitle(_subtitle.workingHours), - const SizedBox( - height: 4, + Row( + children: [ + Expanded( + child: Column( + crossAxisAlignment: CrossAxisAlignment.stretch, + children: [ + const ASubTitle("Start of Work"), + SizedBox( + height: 8 * AppStyle.getScaleFactor(context), + ), + ADateTimePicker( + date: _deviceTransferProvider.startDate, + from: DateTime.now().subtract(const Duration(days: 365)), + to: DateTime.now().add(const Duration(days: 365)), + onDateTimePicker: (date) { + _deviceTransferProvider.startDate = date; + _formModel.workingHours=((_deviceTransferProvider.endDate?.difference(_deviceTransferProvider.startDate)?.inMinutes ?? 0) / 60)?.toStringAsFixed(2)?.toString() ?? 0; + setState(() {}); + }, + ), + ], + ), + ), + const SizedBox(width: 8), + Expanded( + child: Column( + crossAxisAlignment: CrossAxisAlignment.stretch, + children: [ + const ASubTitle("End of Work"), + SizedBox( + height: 8 * AppStyle.getScaleFactor(context), + ), + ADateTimePicker( + date: _deviceTransferProvider.endDate, + from: DateTime.now().subtract(const Duration(days: 365)), + to: DateTime.now().add(const Duration(days: 365)), + onDateTimePicker: (date) { + _deviceTransferProvider.endDate = date; + _formModel.workingHours=((_deviceTransferProvider.endDate?.difference(_deviceTransferProvider.startDate)?.inMinutes ?? 0) / 60)?.toStringAsFixed(2)?.toString() ?? 0; + setState(() {}); + }, + ), + ], + ), + ), + ], ), ATextFormField( - initialValue: _formModel?.workingHours, + initialValue: null, textAlign: TextAlign.center, + hintText: _deviceTransferProvider.startDate == null + ? "0" + : ((_deviceTransferProvider.endDate?.difference(_deviceTransferProvider.startDate)?.inMinutes ?? 0) / 60)?.toStringAsFixed(2)?.toString() ?? "0", + enable: false, style: Theme.of(context).textTheme.subtitle1, + //validator: (value) => Validator.isNumeric(value) ? null : _subtitle.requiredWord, textInputType: TextInputType.number, onSaved: (value) { - _formModel.workingHours = value; + // _serviceReport.workHours = value; }, ), + // ASubTitle(_subtitle.workingHours), + // const SizedBox( + // height: 4, + // ), + // ATextFormField( + // initialValue: _formModel?.workingHours, + // textAlign: TextAlign.center, + // style: Theme.of(context).textTheme.subtitle1, + // textInputType: TextInputType.number, + // onSaved: (value) { + // _formModel.workingHours = value; + // }, + // ), // const SizedBox(height: 8,), // const ASubTitle("Sender Department"), // if(_validate && _formModel.senderDepartment == null) From ffacf3949e3d9937dbcdb72832830a4cd384fa95 Mon Sep 17 00:00:00 2001 From: Sikander Saleem Date: Tue, 13 Jun 2023 11:32:57 +0300 Subject: [PATCH 073/181] startdate, end date & working hours fixed. --- .../api/device_transfer_provider.dart | 10 ++++++++++ lib/models/device/device_transfer.dart | 4 ++++ lib/models/device/device_transfer_info.dart | 10 ++++++++++ lib/models/engineer.dart | 3 ++- .../update_device_transfer.dart | 20 ++++++++++--------- .../report/create_service_report.dart | 2 +- 6 files changed, 38 insertions(+), 11 deletions(-) diff --git a/lib/controllers/providers/api/device_transfer_provider.dart b/lib/controllers/providers/api/device_transfer_provider.dart index f9ed081d..a534fbc0 100644 --- a/lib/controllers/providers/api/device_transfer_provider.dart +++ b/lib/controllers/providers/api/device_transfer_provider.dart @@ -24,6 +24,8 @@ class DeviceTransferProvider extends ChangeNotifier { floor = null; department = null; room=""; + startDate = null; + endDate = null; } // state code of current request to defied error message @@ -177,6 +179,8 @@ class DeviceTransferProvider extends ChangeNotifier { "senderMachineStatusId": newModel.status.id, "senderComment": newModel.comment, "senderWorkingHours": newModel.workingHours, + "senderStartDate": newModel.startDate?.toIso8601String(), + "senderEndDate": newModel.endDate?.toIso8601String(), "senderTravelingHours": newModel.travelingHours, "senderAttachmentName": "${newModel.signature}.png", "destSiteId": oldModel.receiver.client.id, @@ -185,6 +189,8 @@ class DeviceTransferProvider extends ChangeNotifier { "receiverMachineStatusId": oldModel.receiver.status.id ?? "", "receiverComment": oldModel.receiver.comment, "receiverWorkingHours": oldModel.receiver.workingHours, + "receiverStartDate": oldModel.receiver.startDate?.toIso8601String(), + "receiverEndDate": oldModel.receiver.endDate?.toIso8601String(), "receiverTravelingHours": oldModel.receiver.travelingHours, "receiverAttachmentName": "${oldModel.receiver.signature}.png", }); @@ -196,6 +202,8 @@ class DeviceTransferProvider extends ChangeNotifier { "senderMachineStatusId": oldModel.sender.status.id, "senderComment": oldModel.sender.comment, "senderWorkingHours": oldModel.sender.workingHours, + "senderStartDate": oldModel.sender.startDate?.toIso8601String(), + "senderEndDate": oldModel.sender.endDate?.toIso8601String(), "senderTravelingHours": oldModel.sender.travelingHours, "senderAttachmentName": "${oldModel.sender.signature}.png", "destSiteId": newModel.client.id, @@ -204,6 +212,8 @@ class DeviceTransferProvider extends ChangeNotifier { "receiverMachineStatusId": newModel.status?.id ?? "", "receiverComment": newModel.comment, "receiverWorkingHours": newModel.workingHours, + "receiverStartDate": newModel.startDate?.toIso8601String(), + "receiverEndDate": newModel.endDate?.toIso8601String(), "receiverTravelingHours": newModel.travelingHours, "receiverAttachmentName": "${newModel.signature}.png", }); diff --git a/lib/models/device/device_transfer.dart b/lib/models/device/device_transfer.dart index d4d062b4..a8202f42 100644 --- a/lib/models/device/device_transfer.dart +++ b/lib/models/device/device_transfer.dart @@ -59,6 +59,8 @@ class DeviceTransfer { travelingHours: parsedJson["senderTravelingHours"], comment: parsedJson["senderComment"], workingHours: parsedJson["senderWorkingHours"], + startDate: parsedJson["senderStartDate"]==null ? null:DateTime.parse(parsedJson["senderStartDate"]), + endDate: parsedJson["senderEndDate"]==null ? null:DateTime.parse(parsedJson["senderEndDate"]), userId: parsedJson["senderAssignedEmployeeId"], userName: parsedJson["senderAssignedEmployeeName"], assignedEmployeeName: parsedJson["senderAssignedEmployeeName"], @@ -78,6 +80,8 @@ class DeviceTransfer { travelingHours: parsedJson["receiverTravelingHours"], comment: parsedJson["receiverComment"], workingHours: parsedJson["receiverWorkingHours"], + startDate: parsedJson["receiverStartDate"]==null ? null:DateTime.parse(parsedJson["receiverStartDate"]), + endDate: parsedJson["receiverEndDate"]==null ? null:DateTime.parse(parsedJson["receiverEndDate"]), userId: parsedJson["receiverAssignedEmployeeId"], userName: parsedJson["receiverAssignedEmployeeName"], assignedEmployeeName: parsedJson["receiverAssignedEmployeeName"], diff --git a/lib/models/device/device_transfer_info.dart b/lib/models/device/device_transfer_info.dart index 74365ce0..41d0843a 100644 --- a/lib/models/device/device_transfer_info.dart +++ b/lib/models/device/device_transfer_info.dart @@ -8,6 +8,8 @@ class DeviceTransferInfo { Hospital client; Department department; String workingHours; + DateTime startDate; + DateTime endDate; String travelingHours; String userName; String signature; @@ -21,6 +23,8 @@ class DeviceTransferInfo { this.client, this.userName, this.travelingHours, + this.startDate, + this.endDate, this.workingHours, this.signature, this.status, @@ -33,6 +37,8 @@ class DeviceTransferInfo { if (comment != null && comment.isNotEmpty) body["${baseKey}comment"] = comment; if (workingHours != null && workingHours.isNotEmpty) body["${baseKey}working_hours"] = workingHours; + if (startDate != null) body["${baseKey}start_date"] = startDate?.toIso8601String(); + if (endDate != null) body["${baseKey}end_date"] = endDate?.toIso8601String(); if (travelingHours != null && travelingHours.isNotEmpty) body["${baseKey}travel_hours"] = travelingHours; if (status != null) body["${baseKey}status"] = status.id.toString(); if (signature != null && signature.isNotEmpty) body["${baseKey}image"] = signature; @@ -51,6 +57,8 @@ class DeviceTransferInfo { client = Hospital.fromHospital(old.client); department = Department.fromDepartment(old.department); workingHours = old.workingHours; + startDate = old.startDate; + endDate = old.endDate; travelingHours = old.travelingHours; comment = old.comment; if (withSignature) signature = old.signature; @@ -60,6 +68,8 @@ class DeviceTransferInfo { factory DeviceTransferInfo.fromJson(Map parsedJson, String key) { return DeviceTransferInfo( workingHours: parsedJson["${key}working_hours"], + startDate: parsedJson["${key}start_date"], + endDate: parsedJson["${key}end_date"], travelingHours: parsedJson["${key}travel_hours"], userName: parsedJson["${key}name"], signature: parsedJson["${key}image"], diff --git a/lib/models/engineer.dart b/lib/models/engineer.dart index 096dd316..ffedca72 100644 --- a/lib/models/engineer.dart +++ b/lib/models/engineer.dart @@ -8,8 +8,9 @@ class Engineer { }); factory Engineer.fromJson(Map parsedJson) { + if(parsedJson==null) return Engineer(); return Engineer( - id: parsedJson["userId"] ?? parsedJson["id"], + id: parsedJson["userId"] ?? parsedJson["id"], name: parsedJson["userName"] ?? parsedJson["name"], ); } diff --git a/lib/views/pages/device_transfer/update_device_transfer.dart b/lib/views/pages/device_transfer/update_device_transfer.dart index eaaafded..9b2c8033 100644 --- a/lib/views/pages/device_transfer/update_device_transfer.dart +++ b/lib/views/pages/device_transfer/update_device_transfer.dart @@ -25,6 +25,7 @@ import '../../widgets/date_and_time/time_picker.dart'; class UpdateDeviceTransfer extends StatefulWidget { final DeviceTransfer model; final bool isSender; + const UpdateDeviceTransfer({Key key, this.model, this.isSender}) : super(key: key); @override @@ -162,12 +163,12 @@ class _UpdateDeviceTransferState extends State { height: 8 * AppStyle.getScaleFactor(context), ), ADateTimePicker( - date: _deviceTransferProvider.startDate, + date: _formModel.startDate, from: DateTime.now().subtract(const Duration(days: 365)), to: DateTime.now().add(const Duration(days: 365)), onDateTimePicker: (date) { - _deviceTransferProvider.startDate = date; - _formModel.workingHours=((_deviceTransferProvider.endDate?.difference(_deviceTransferProvider.startDate)?.inMinutes ?? 0) / 60)?.toStringAsFixed(2)?.toString() ?? 0; + _formModel.startDate = date; + _formModel.workingHours = ((_formModel.endDate?.difference(_formModel.startDate)?.inMinutes ?? 0) / 60)?.toStringAsFixed(2)?.toString() ?? 0; setState(() {}); }, ), @@ -184,12 +185,12 @@ class _UpdateDeviceTransferState extends State { height: 8 * AppStyle.getScaleFactor(context), ), ADateTimePicker( - date: _deviceTransferProvider.endDate, + date: _formModel.endDate, from: DateTime.now().subtract(const Duration(days: 365)), to: DateTime.now().add(const Duration(days: 365)), onDateTimePicker: (date) { - _deviceTransferProvider.endDate = date; - _formModel.workingHours=((_deviceTransferProvider.endDate?.difference(_deviceTransferProvider.startDate)?.inMinutes ?? 0) / 60)?.toStringAsFixed(2)?.toString() ?? 0; + _formModel.endDate = date; + _formModel.workingHours = ((_formModel.endDate?.difference(_formModel.startDate)?.inMinutes ?? 0) / 60)?.toStringAsFixed(2)?.toString() ?? 0; setState(() {}); }, ), @@ -198,12 +199,13 @@ class _UpdateDeviceTransferState extends State { ), ], ), + const SizedBox(height: 4), + ASubTitle(_subtitle.workingHours), + const SizedBox(height: 4), ATextFormField( initialValue: null, textAlign: TextAlign.center, - hintText: _deviceTransferProvider.startDate == null - ? "0" - : ((_deviceTransferProvider.endDate?.difference(_deviceTransferProvider.startDate)?.inMinutes ?? 0) / 60)?.toStringAsFixed(2)?.toString() ?? "0", + hintText: _formModel.startDate == null ? "0" : ((_formModel.endDate?.difference(_formModel.startDate)?.inMinutes ?? 0) / 60)?.toStringAsFixed(2)?.toString() ?? "0", enable: false, style: Theme.of(context).textTheme.subtitle1, //validator: (value) => Validator.isNumeric(value) ? null : _subtitle.requiredWord, diff --git a/lib/views/pages/user/requests/report/create_service_report.dart b/lib/views/pages/user/requests/report/create_service_report.dart index ad6647e6..d94ddb69 100644 --- a/lib/views/pages/user/requests/report/create_service_report.dart +++ b/lib/views/pages/user/requests/report/create_service_report.dart @@ -94,7 +94,7 @@ class _CreateServiceReportState extends State with TickerPr _isLoading = true; setState(() {}); _callRequestForWorkOrder = await _serviceRequestsProvider.getCallRequestForWorkOrder(callId: widget.request.id); - _serviceReport.engineer = Engineer.fromJson(_callRequestForWorkOrder.assignedEmployee?.toJson()); + _serviceReport.engineer = Engineer.fromJson(_callRequestForWorkOrder?.assignedEmployee?.toJson()); await _assetTypeProvider.getTypes(user: _userProvider.user, host: _settingProvider.host); _isLoading = false; setState(() {}); From 08841c7859c99d0413619247f449333954d7b46f Mon Sep 17 00:00:00 2001 From: zaid_daoud Date: Tue, 13 Jun 2023 13:24:22 +0300 Subject: [PATCH 074/181] Update gas refill issue fixed --- lib/controllers/providers/api/gas_refill_provider.dart | 10 +++++----- lib/models/gas_refill/gas_refill_model.dart | 5 +++++ 2 files changed, 10 insertions(+), 5 deletions(-) diff --git a/lib/controllers/providers/api/gas_refill_provider.dart b/lib/controllers/providers/api/gas_refill_provider.dart index bd3cd270..cbd66b55 100644 --- a/lib/controllers/providers/api/gas_refill_provider.dart +++ b/lib/controllers/providers/api/gas_refill_provider.dart @@ -142,19 +142,19 @@ class GasRefillProvider extends ChangeNotifier { @required GasRefillModel oldModel, @required GasRefillModel newModel, }) async { + print("${oldModel?.id} assigned EEEEE ${oldModel?.assignedEmployee?.toJson()}"); Map body = { "id": newModel.id, "gazRefillNo": newModel.title ?? "", "status": newModel.status.toMap(), + "expectedDate": oldModel.expectedDate?.toIso8601String(), + "expectedTime": oldModel.expectedDate?.toIso8601String(), "startDate": startDate?.toIso8601String(), "startTime": startDate?.toIso8601String(), "endDate": endDate?.toIso8601String(), "endTime": endDate?.toIso8601String(), - // "workingHours": 0, - // "assignedEmployee": { - // "id": "string", - // "name": "string" - // }, + "workingHours": ((endDate?.difference(startDate)?.inMinutes ?? 0) / 60), + "assignedEmployee": oldModel?.assignedEmployee?.toJson(), "site": hospital?.toMap(), "building": building?.toJson(includeFloors: false), "floor": floor?.toJson(includeDepartments: false), diff --git a/lib/models/gas_refill/gas_refill_model.dart b/lib/models/gas_refill/gas_refill_model.dart index 4effc27f..ad2ebde2 100644 --- a/lib/models/gas_refill/gas_refill_model.dart +++ b/lib/models/gas_refill/gas_refill_model.dart @@ -13,6 +13,7 @@ class GasRefillModel { Lookup floor; Department department; List details; + AssignedEmployee assignedEmployee; DateTime startDate, endDate, expectedDate; GasRefillModel({ @@ -28,6 +29,7 @@ class GasRefillModel { this.endDate, this.expectedDate, this.department, + this.assignedEmployee, }); bool validate() { @@ -55,6 +57,7 @@ class GasRefillModel { startDate = model.startDate; endDate = model.endDate; expectedDate = model.expectedDate; + assignedEmployee = model.assignedEmployee; } factory GasRefillModel.fromJson(Map parsedJson) { @@ -63,6 +66,7 @@ class GasRefillModel { List list = parsedJson["gazRefillDetails"]; details = list.map((e) => GasRefillDetails.fromJson(e)).toList(); } + print("${parsedJson['assignedEmployee']}ddddd"); return GasRefillModel( id: parsedJson["id"], //userId: parsedJson["uid"], @@ -76,6 +80,7 @@ class GasRefillModel { startDate: DateTime.tryParse(parsedJson['startDate'] ?? ""), endDate: DateTime.tryParse(parsedJson['endDate'] ?? ""), expectedDate: DateTime.tryParse(parsedJson['expectedDate'] ?? ""), + assignedEmployee: AssignedEmployee.fromJson(parsedJson['assignedEmployee'] ?? {}), ); } } From d470a19befa10e857e6520323115306dc8c3e8a9 Mon Sep 17 00:00:00 2001 From: zaid_daoud Date: Tue, 13 Jun 2023 14:37:52 +0300 Subject: [PATCH 075/181] Need some enhancements --- .../providers/api/gas_refill_provider.dart | 1 - lib/models/gas_refill/gas_refill_details.dart | 2 + lib/models/gas_refill/gas_refill_model.dart | 1 - .../user/gas_refill/request_gas_refill.dart | 322 +++++++++--------- .../gas_refill_create_details_item.dart | 43 ++- 5 files changed, 210 insertions(+), 159 deletions(-) diff --git a/lib/controllers/providers/api/gas_refill_provider.dart b/lib/controllers/providers/api/gas_refill_provider.dart index cbd66b55..33c9fd61 100644 --- a/lib/controllers/providers/api/gas_refill_provider.dart +++ b/lib/controllers/providers/api/gas_refill_provider.dart @@ -142,7 +142,6 @@ class GasRefillProvider extends ChangeNotifier { @required GasRefillModel oldModel, @required GasRefillModel newModel, }) async { - print("${oldModel?.id} assigned EEEEE ${oldModel?.assignedEmployee?.toJson()}"); Map body = { "id": newModel.id, "gazRefillNo": newModel.title ?? "", diff --git a/lib/models/gas_refill/gas_refill_details.dart b/lib/models/gas_refill/gas_refill_details.dart index 02d31cf4..0c9afe0e 100644 --- a/lib/models/gas_refill/gas_refill_details.dart +++ b/lib/models/gas_refill/gas_refill_details.dart @@ -6,6 +6,7 @@ class GasRefillDetails { Lookup cylinderType; double requestedQuantity; double deliveredQuantity; + bool selectedForEditing; GasRefillDetails({ this.type, @@ -13,6 +14,7 @@ class GasRefillDetails { this.cylinderType, this.requestedQuantity, this.deliveredQuantity, + this.selectedForEditing, }); bool validate() { diff --git a/lib/models/gas_refill/gas_refill_model.dart b/lib/models/gas_refill/gas_refill_model.dart index ad2ebde2..13a6e6b8 100644 --- a/lib/models/gas_refill/gas_refill_model.dart +++ b/lib/models/gas_refill/gas_refill_model.dart @@ -66,7 +66,6 @@ class GasRefillModel { List list = parsedJson["gazRefillDetails"]; details = list.map((e) => GasRefillDetails.fromJson(e)).toList(); } - print("${parsedJson['assignedEmployee']}ddddd"); return GasRefillModel( id: parsedJson["id"], //userId: parsedJson["uid"], diff --git a/lib/views/pages/user/gas_refill/request_gas_refill.dart b/lib/views/pages/user/gas_refill/request_gas_refill.dart index da419033..7b745daa 100644 --- a/lib/views/pages/user/gas_refill/request_gas_refill.dart +++ b/lib/views/pages/user/gas_refill/request_gas_refill.dart @@ -289,168 +289,176 @@ class _RequestGasRefillState extends State { ], ), if (_userProvider.user?.type == UsersTypes.engineer) - Row( + Column( children: [ - Expanded( - child: Column( - crossAxisAlignment: CrossAxisAlignment.stretch, - children: [ - const ASubTitle("Start of Work"), - SizedBox( - height: 8 * AppStyle.getScaleFactor(context), + Row( + children: [ + Expanded( + child: Column( + crossAxisAlignment: CrossAxisAlignment.stretch, + children: [ + const ASubTitle("Start of Work"), + SizedBox( + height: 8 * AppStyle.getScaleFactor(context), + ), + ADateTimePicker( + date: _gasRefillProvider.startDate, + from: DateTime.now().subtract(const Duration(days: 365)), + to: DateTime.now().add(const Duration(days: 365)), + onDateTimePicker: (date) { + _gasRefillProvider.startDate = date; + setState(() {}); + }, + ), + ], ), - ADateTimePicker( - date: _gasRefillProvider.startDate, - from: DateTime.now().subtract(const Duration(days: 365)), - to: DateTime.now().add(const Duration(days: 365)), - onDateTimePicker: (date) { - _gasRefillProvider.startDate = date; - setState(() {}); - }, + ), + const SizedBox(width: 8), + Expanded( + child: Column( + crossAxisAlignment: CrossAxisAlignment.stretch, + children: [ + const ASubTitle("End of Work"), + SizedBox( + height: 8 * AppStyle.getScaleFactor(context), + ), + ADateTimePicker( + date: _gasRefillProvider.endDate, + from: DateTime.now().subtract(const Duration(days: 365)), + to: DateTime.now().add(const Duration(days: 365)), + onDateTimePicker: (date) { + _gasRefillProvider.endDate = date; + setState(() {}); + }, + ), + ], ), - ], + ), + ], + ), + const SizedBox(height: 8), + ASubTitle(_subtitle.workingHours), + const SizedBox(height: 4), + ATextFormField( + initialValue: null, + textAlign: TextAlign.center, + hintText: _gasRefillProvider.startDate == null + ? "0" + : ((_gasRefillProvider.endDate?.difference(_gasRefillProvider.startDate)?.inMinutes ?? 0) / 60)?.toStringAsFixed(2)?.toString() ?? "0", + enable: false, + style: Theme.of(context).textTheme.subtitle1, + validator: (value) => Validator.isNumeric(value) ? null : _subtitle.requiredWord, + textInputType: TextInputType.number, + onSaved: (value) { + // _serviceReport.workHours = value; + }, + ), + ], + ), + if (widget.gasRefillModel == null) + Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + const SizedBox(height: 8), + Divider(color: Theme.of(context).colorScheme.primary), + const SizedBox(height: 4), + const ASubTitle("Type"), + if (_validate && _currentDetails.type == null) ASubTitle(_subtitle.requiredWord, color: Colors.red), + const SizedBox(height: 4), + GasTypeMenu( + initialValue: _currentDetails.type, + onSelect: (status) { + _currentDetails.type = status; + }, + ), + const SizedBox(height: 8), + const ASubTitle("Cylinder Size"), + if (_validate && _currentDetails.cylinderSize == null) + ASubTitle( + _subtitle.requiredWord, + color: Colors.red, ), + const SizedBox( + height: 4, ), - const SizedBox(width: 8), - Expanded( - child: Column( - crossAxisAlignment: CrossAxisAlignment.stretch, - children: [ - const ASubTitle("End of Work"), - SizedBox( - height: 8 * AppStyle.getScaleFactor(context), - ), - ADateTimePicker( - date: _gasRefillProvider.endDate, - from: DateTime.now().subtract(const Duration(days: 365)), - to: DateTime.now().add(const Duration(days: 365)), - onDateTimePicker: (date) { - _gasRefillProvider.endDate = date; - setState(() {}); - }, - ), - ], + GasCylinderSizeMenu( + initialValue: _currentDetails.cylinderSize, + onSelect: (status) { + _currentDetails.cylinderSize = status; + }, + ), + const SizedBox( + height: 8, + ), + const SizedBox( + height: 8, + ), + const ASubTitle("Cylinder Type"), + if (_validate && _currentDetails.cylinderSize == null) + ASubTitle( + _subtitle.requiredWord, + color: Colors.red, + ), + const SizedBox( + height: 4, + ), + GasCylinderTypesMenu( + initialValue: _currentDetails.cylinderType, + onSelect: (status) { + _currentDetails.cylinderType = status; + }, + ), + const SizedBox( + height: 8, + ), + ASubTitle(_subtitle.requestedQuantity), + if (_validate && _currentDetails?.requestedQuantity == null) + ASubTitle( + _subtitle.requiredWord, + color: Colors.red, + ), + SizedBox( + height: 4, + ), + ATextFormField( + initialValue: (_currentDetails?.requestedQuantity ?? "").toString(), + textAlign: TextAlign.center, + controller: _requestedQuantityController, + style: Theme.of(context).textTheme.subtitle1, + validator: (value) => Validator.isNumeric(value) ? null : "allow numbers only", + textInputType: TextInputType.number, + onChange: (value) { + _currentDetails?.requestedQuantity = double.tryParse(value); + }, + ), + if (widget.gasRefillModel != null) const SizedBox(height: 16), + if (widget.gasRefillModel != null) ASubTitle(_subtitle.deliveredQuantity), + if (widget.gasRefillModel != null && _validate && _currentDetails?.deliveredQuantity == null) + ASubTitle( + _subtitle.requiredWord, + color: Colors.red, + ), + if (widget.gasRefillModel != null) const SizedBox(height: 4), + if (widget.gasRefillModel != null) + ATextFormField( + initialValue: (_currentDetails?.deliveredQuantity ?? "").toString(), + textAlign: TextAlign.center, + controller: _deliveredQuantityController, + style: Theme.of(context).textTheme.subtitle1, + validator: (value) => Validator.isNumeric(value) ? null : "allow numbers only", + textInputType: TextInputType.number, + onChange: (value) { + _currentDetails?.deliveredQuantity = double.tryParse(value); + }, ), + const SizedBox(height: 16), + AButton( + text: _subtitle.add, + onPressed: _addNewModel, ), ], ), - if (_userProvider.user?.type == UsersTypes.engineer) const SizedBox(height: 8), - if (_userProvider.user?.type == UsersTypes.engineer) ASubTitle(_subtitle.workingHours), - if (_userProvider.user?.type == UsersTypes.engineer) const SizedBox(height: 4), - if (_userProvider.user?.type == UsersTypes.engineer) - ATextFormField( - initialValue: null, - textAlign: TextAlign.center, - hintText: _gasRefillProvider.startDate == null - ? "0" - : ((_gasRefillProvider.endDate?.difference(_gasRefillProvider.startDate)?.inMinutes ?? 0) / 60)?.toStringAsFixed(2)?.toString() ?? "0", - enable: false, - style: Theme.of(context).textTheme.subtitle1, - validator: (value) => Validator.isNumeric(value) ? null : _subtitle.requiredWord, - textInputType: TextInputType.number, - onSaved: (value) { - // _serviceReport.workHours = value; - }, - ), - const SizedBox(height: 8), - Divider(color: Theme.of(context).colorScheme.primary), - const SizedBox(height: 4), - const ASubTitle("Type"), - if (_validate && _currentDetails.type == null) ASubTitle(_subtitle.requiredWord, color: Colors.red), - const SizedBox(height: 4), - GasTypeMenu( - initialValue: _currentDetails.type, - onSelect: (status) { - _currentDetails.type = status; - }, - ), - const SizedBox(height: 8), - const ASubTitle("Cylinder Size"), - if (_validate && _currentDetails.cylinderSize == null) - ASubTitle( - _subtitle.requiredWord, - color: Colors.red, - ), - const SizedBox( - height: 4, - ), - GasCylinderSizeMenu( - initialValue: _currentDetails.cylinderSize, - onSelect: (status) { - _currentDetails.cylinderSize = status; - }, - ), - const SizedBox( - height: 8, - ), - - const SizedBox( - height: 8, - ), - const ASubTitle("Cylinder Type"), - if (_validate && _currentDetails.cylinderSize == null) - ASubTitle( - _subtitle.requiredWord, - color: Colors.red, - ), - const SizedBox( - height: 4, - ), - GasCylinderTypesMenu( - initialValue: _currentDetails.cylinderType, - onSelect: (status) { - _currentDetails.cylinderType = status; - }, - ), - const SizedBox( - height: 8, - ), - ASubTitle(_subtitle.requestedQuantity), - if (_validate && _currentDetails?.requestedQuantity == null) - ASubTitle( - _subtitle.requiredWord, - color: Colors.red, - ), - SizedBox( - height: 4, - ), - ATextFormField( - initialValue: (_currentDetails?.requestedQuantity ?? "").toString(), - textAlign: TextAlign.center, - controller: _requestedQuantityController, - style: Theme.of(context).textTheme.subtitle1, - validator: (value) => Validator.isNumeric(value) ? null : "allow numbers only", - textInputType: TextInputType.number, - onChange: (value) { - _currentDetails?.requestedQuantity = double.tryParse(value); - }, - ), - if (widget.gasRefillModel != null) const SizedBox(height: 16), - if (widget.gasRefillModel != null) ASubTitle(_subtitle.deliveredQuantity), - if (widget.gasRefillModel != null && _validate && _currentDetails?.deliveredQuantity == null) - ASubTitle( - _subtitle.requiredWord, - color: Colors.red, - ), - if (widget.gasRefillModel != null) const SizedBox(height: 4), - if (widget.gasRefillModel != null) - ATextFormField( - initialValue: (_currentDetails?.deliveredQuantity ?? "").toString(), - textAlign: TextAlign.center, - controller: _deliveredQuantityController, - style: Theme.of(context).textTheme.subtitle1, - validator: (value) => Validator.isNumeric(value) ? null : "allow numbers only", - textInputType: TextInputType.number, - onChange: (value) { - _currentDetails?.deliveredQuantity = double.tryParse(value); - }, - ), const SizedBox(height: 16), - AButton( - text: _subtitle.add, - onPressed: _addNewModel, - ), - if (_formModel.details.isNotEmpty) const ASubTitle("Gas Requests"), ListView.builder( key: _DetailsKey, @@ -460,9 +468,15 @@ class _RequestGasRefillState extends State { itemBuilder: (context, index) { final model = _formModel.details[index]; return GasRefillCreateDetailsItem( + isUpdate: widget.gasRefillModel != null, model: model, - onDelete: () { - _formModel.details.remove(model); + onPressed: () { + if (widget.gasRefillModel != null) { + model.selectedForEditing = !(model.selectedForEditing ?? false); + } + if (widget.gasRefillModel == null) { + _formModel.details.remove(model); + } setState(() {}); }, ); diff --git a/lib/views/widgets/gas_refill/gas_refill_create_details_item.dart b/lib/views/widgets/gas_refill/gas_refill_create_details_item.dart index 8fef555f..317f7c2b 100644 --- a/lib/views/widgets/gas_refill/gas_refill_create_details_item.dart +++ b/lib/views/widgets/gas_refill/gas_refill_create_details_item.dart @@ -1,20 +1,29 @@ import 'package:flutter/material.dart'; import 'package:test_sa/models/gas_refill/gas_refill_details.dart'; import 'package:test_sa/views/app_style/colors.dart'; +import 'package:test_sa/views/widgets/app_text_form_field.dart'; + +import '../../../controllers/localization/localization.dart'; +import '../buttons/app_button.dart'; +import '../titles/app_sub_title.dart'; class GasRefillCreateDetailsItem extends StatelessWidget { final GasRefillDetails model; - final VoidCallback onDelete; + final VoidCallback onPressed; + final bool isUpdate; - const GasRefillCreateDetailsItem({Key key, this.model, this.onDelete}) : super(key: key); + const GasRefillCreateDetailsItem({Key key, this.isUpdate, this.model, this.onPressed}) : super(key: key); @override Widget build(BuildContext context) { + final subtitle = AppLocalization.of(context).subtitle; + final startEditing = isUpdate && (model.selectedForEditing ?? false); + String deliveredQuantity = "0"; return Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ Row( - children: [Expanded(child: Text(model.type.name)), IconButton(onPressed: onDelete, color: AColors.red, icon: const Icon(Icons.delete))], + children: [Expanded(child: Text(model.type.name)), IconButton(onPressed: onPressed, color: isUpdate ? AColors.cyan : AColors.red, icon: Icon(isUpdate ? Icons.edit : Icons.delete))], ), Wrap( spacing: 10, @@ -31,6 +40,34 @@ class GasRefillCreateDetailsItem extends StatelessWidget { Text(model.deliveredQuantity.toStringAsFixed(0)), ], ), + if (startEditing) const SizedBox(height: 16), + if (startEditing) ASubTitle(subtitle.deliveredQuantity), + if (startEditing) const SizedBox(height: 4), + if (startEditing) + ATextFormField( + initialValue: model.deliveredQuantity?.toString(), + textAlign: TextAlign.center, + // controller: deliveredQuantityController, + style: Theme.of(context).textTheme.subtitle1, + // validator: (value) => Validator.isNumeric(value) ? null : "allow numbers only", + textInputType: TextInputType.number, + onChange: (value) { + deliveredQuantity = value; + // _currentDetails?.deliveredQuantity = double.tryParse(value); + }, + ), + if (startEditing) const SizedBox(height: 8), + if (startEditing) + AButton( + text: subtitle.edit, + onPressed: () { + final value = double.tryParse(deliveredQuantity ?? ""); + if (value != null) { + model.deliveredQuantity = value; + onPressed(); + } + }, + ), const Divider(), ], ); From 79edef1d66fbaf6648de27e12062a4fcf6509f07 Mon Sep 17 00:00:00 2001 From: zaid_daoud Date: Tue, 13 Jun 2023 14:44:55 +0300 Subject: [PATCH 076/181] Update Gas Refill done --- .../widgets/gas_refill/gas_refill_create_details_item.dart | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lib/views/widgets/gas_refill/gas_refill_create_details_item.dart b/lib/views/widgets/gas_refill/gas_refill_create_details_item.dart index 317f7c2b..2704143a 100644 --- a/lib/views/widgets/gas_refill/gas_refill_create_details_item.dart +++ b/lib/views/widgets/gas_refill/gas_refill_create_details_item.dart @@ -18,7 +18,7 @@ class GasRefillCreateDetailsItem extends StatelessWidget { Widget build(BuildContext context) { final subtitle = AppLocalization.of(context).subtitle; final startEditing = isUpdate && (model.selectedForEditing ?? false); - String deliveredQuantity = "0"; + String deliveredQuantity = "0.0"; return Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ @@ -45,7 +45,7 @@ class GasRefillCreateDetailsItem extends StatelessWidget { if (startEditing) const SizedBox(height: 4), if (startEditing) ATextFormField( - initialValue: model.deliveredQuantity?.toString(), + initialValue: model.deliveredQuantity?.toString() ?? deliveredQuantity, textAlign: TextAlign.center, // controller: deliveredQuantityController, style: Theme.of(context).textTheme.subtitle1, From 10604b4f5cd73af3a0072c66542f663a07640242 Mon Sep 17 00:00:00 2001 From: zaid_daoud Date: Tue, 13 Jun 2023 15:05:26 +0300 Subject: [PATCH 077/181] Fixing Bug --- .../gas_refill/gas_refill_create_details_item.dart | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/lib/views/widgets/gas_refill/gas_refill_create_details_item.dart b/lib/views/widgets/gas_refill/gas_refill_create_details_item.dart index 2704143a..f64f0868 100644 --- a/lib/views/widgets/gas_refill/gas_refill_create_details_item.dart +++ b/lib/views/widgets/gas_refill/gas_refill_create_details_item.dart @@ -18,7 +18,7 @@ class GasRefillCreateDetailsItem extends StatelessWidget { Widget build(BuildContext context) { final subtitle = AppLocalization.of(context).subtitle; final startEditing = isUpdate && (model.selectedForEditing ?? false); - String deliveredQuantity = "0.0"; + double deliveredQuantity; return Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ @@ -45,14 +45,14 @@ class GasRefillCreateDetailsItem extends StatelessWidget { if (startEditing) const SizedBox(height: 4), if (startEditing) ATextFormField( - initialValue: model.deliveredQuantity?.toString() ?? deliveredQuantity, + initialValue: model.deliveredQuantity?.toString(), textAlign: TextAlign.center, // controller: deliveredQuantityController, style: Theme.of(context).textTheme.subtitle1, // validator: (value) => Validator.isNumeric(value) ? null : "allow numbers only", textInputType: TextInputType.number, onChange: (value) { - deliveredQuantity = value; + deliveredQuantity = double.tryParse(value ?? ""); // _currentDetails?.deliveredQuantity = double.tryParse(value); }, ), @@ -61,9 +61,8 @@ class GasRefillCreateDetailsItem extends StatelessWidget { AButton( text: subtitle.edit, onPressed: () { - final value = double.tryParse(deliveredQuantity ?? ""); - if (value != null) { - model.deliveredQuantity = value; + if (deliveredQuantity != null) { + model.deliveredQuantity = deliveredQuantity; onPressed(); } }, From dadc591fcf25f457dc07c3fc971ad3bd07671718 Mon Sep 17 00:00:00 2001 From: zaid_daoud Date: Tue, 13 Jun 2023 15:18:22 +0300 Subject: [PATCH 078/181] Fixing Bug --- lib/controllers/providers/api/gas_refill_provider.dart | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/controllers/providers/api/gas_refill_provider.dart b/lib/controllers/providers/api/gas_refill_provider.dart index 33c9fd61..e2401668 100644 --- a/lib/controllers/providers/api/gas_refill_provider.dart +++ b/lib/controllers/providers/api/gas_refill_provider.dart @@ -153,7 +153,7 @@ class GasRefillProvider extends ChangeNotifier { "endDate": endDate?.toIso8601String(), "endTime": endDate?.toIso8601String(), "workingHours": ((endDate?.difference(startDate)?.inMinutes ?? 0) / 60), - "assignedEmployee": oldModel?.assignedEmployee?.toJson(), + "assignedEmployee": oldModel?.assignedEmployee?.id == null ? null : oldModel?.assignedEmployee?.toJson(), "site": hospital?.toMap(), "building": building?.toJson(includeFloors: false), "floor": floor?.toJson(includeDepartments: false), From de7aff6b9ff9d00b68884e4178289ba124c3003a Mon Sep 17 00:00:00 2001 From: Sikander Saleem Date: Tue, 13 Jun 2023 16:08:26 +0300 Subject: [PATCH 079/181] imp --- .../user/gas_refill/track_gas_refill.dart | 6 +++- .../gas_refill_create_details_item.dart | 29 ++++++++++++++----- 2 files changed, 27 insertions(+), 8 deletions(-) diff --git a/lib/views/pages/user/gas_refill/track_gas_refill.dart b/lib/views/pages/user/gas_refill/track_gas_refill.dart index c016fd62..6dd1ca6d 100644 --- a/lib/views/pages/user/gas_refill/track_gas_refill.dart +++ b/lib/views/pages/user/gas_refill/track_gas_refill.dart @@ -26,7 +26,11 @@ class _TrackGasRefillPageState extends State with TickerProv @override Widget build(BuildContext context) { - _gasRefillProvider = Provider.of(context); + if (_gasRefillProvider == null) { + _gasRefillProvider = Provider.of(context); + //_gasRefillProvider?.isLoading = false; + _gasRefillProvider.reset(); + } _userProvider = Provider.of(context); _settingProvider = Provider.of(context); Subtitle _subtitle = AppLocalization.of(context).subtitle; diff --git a/lib/views/widgets/gas_refill/gas_refill_create_details_item.dart b/lib/views/widgets/gas_refill/gas_refill_create_details_item.dart index f64f0868..bd48bf25 100644 --- a/lib/views/widgets/gas_refill/gas_refill_create_details_item.dart +++ b/lib/views/widgets/gas_refill/gas_refill_create_details_item.dart @@ -8,11 +8,11 @@ import '../buttons/app_button.dart'; import '../titles/app_sub_title.dart'; class GasRefillCreateDetailsItem extends StatelessWidget { - final GasRefillDetails model; + GasRefillDetails model; final VoidCallback onPressed; final bool isUpdate; - const GasRefillCreateDetailsItem({Key key, this.isUpdate, this.model, this.onPressed}) : super(key: key); + GasRefillCreateDetailsItem({Key key, this.isUpdate, this.model, this.onPressed}) : super(key: key); @override Widget build(BuildContext context) { @@ -45,14 +45,27 @@ class GasRefillCreateDetailsItem extends StatelessWidget { if (startEditing) const SizedBox(height: 4), if (startEditing) ATextFormField( - initialValue: model.deliveredQuantity?.toString(), + initialValue: model.deliveredQuantity?.toString() ?? "0", textAlign: TextAlign.center, // controller: deliveredQuantityController, style: Theme.of(context).textTheme.subtitle1, // validator: (value) => Validator.isNumeric(value) ? null : "allow numbers only", textInputType: TextInputType.number, + // onSaved: (value) { + // print("value:$value"); + // deliveredQuantity = double.tryParse(value) ?? 0; + // print("valueAfter:$value"); + // // _currentDetails?.deliveredQuantity = double.tryParse(value); + // }, onChange: (value) { - deliveredQuantity = double.tryParse(value ?? ""); + if(value.isNotEmpty) { + model.deliveredQuantity = double.tryParse(value); + } else { + model.deliveredQuantity = 0; + } + print("value:$value"); + deliveredQuantity = double.tryParse(value) ?? 0; + print("valueAfter:$value"); // _currentDetails?.deliveredQuantity = double.tryParse(value); }, ), @@ -61,10 +74,12 @@ class GasRefillCreateDetailsItem extends StatelessWidget { AButton( text: subtitle.edit, onPressed: () { - if (deliveredQuantity != null) { - model.deliveredQuantity = deliveredQuantity; + // print("deliveredQuantity:$deliveredQuantity"); + // if (deliveredQuantity != null) { + // model.deliveredQuantity = deliveredQuantity; + // print("deliveredQuantity:${model.deliveredQuantity}"); onPressed(); - } + // } }, ), const Divider(), From 8c752c3a0500d95963180382398838fab254ca8f Mon Sep 17 00:00:00 2001 From: Sikander Saleem Date: Tue, 13 Jun 2023 16:22:55 +0300 Subject: [PATCH 080/181] merge fix. --- assets/subtitles/ar_subtitle.json | 2 +- assets/subtitles/en_subtitle.json | 4 +--- 2 files changed, 2 insertions(+), 4 deletions(-) diff --git a/assets/subtitles/ar_subtitle.json b/assets/subtitles/ar_subtitle.json index ba03022f..2ed3e577 100644 --- a/assets/subtitles/ar_subtitle.json +++ b/assets/subtitles/ar_subtitle.json @@ -202,7 +202,7 @@ "travelingExpense" : "مصاريف التنقل", "startDate" : "وقت البدء", "requestedQuantity" : "الكمية المطلوبة", - "deliveredQuantity" : "الكمية المسلّمة" + "deliveredQuantity" : "الكمية المسلّمة", "endDate" : "وقت الانتهاء", "destinationSite": "موقع الوجهه", "building": "بناء", diff --git a/assets/subtitles/en_subtitle.json b/assets/subtitles/en_subtitle.json index d15885e8..ed6f5917 100644 --- a/assets/subtitles/en_subtitle.json +++ b/assets/subtitles/en_subtitle.json @@ -202,7 +202,7 @@ "travelingExpense": "Traveling Expense", "startDate" : "Start Date", "requestedQuantity" : "Requested Quantity", - "deliveredQuantity" : "Delivered Quantity" + "deliveredQuantity" : "Delivered Quantity", "endDate" : "End Date", "destinationSite": "Destination Site", "building": "Building", @@ -210,6 +210,4 @@ "department": "Department", "room": "Room", "actions": "Actions" - - } \ No newline at end of file From 674a803189e4efea7146cd9e24fd9ad01fbd44f4 Mon Sep 17 00:00:00 2001 From: zaid_daoud Date: Wed, 14 Jun 2023 09:58:07 +0300 Subject: [PATCH 081/181] Fixing Bug --- .../equipment/single_device_picker.dart | 21 +-- .../gas_refill_create_details_item.dart | 133 +++++++++--------- 2 files changed, 79 insertions(+), 75 deletions(-) diff --git a/lib/views/widgets/equipment/single_device_picker.dart b/lib/views/widgets/equipment/single_device_picker.dart index ab36d5f4..e23d5b05 100644 --- a/lib/views/widgets/equipment/single_device_picker.dart +++ b/lib/views/widgets/equipment/single_device_picker.dart @@ -13,6 +13,7 @@ import 'package:test_sa/views/widgets/loaders/loading_manager.dart'; import 'package:test_sa/views/widgets/loaders/no_item_found.dart'; import '../app_text_form_field.dart'; +import '../qr/scan_qr.dart'; class SingleDevicePicker extends StatefulWidget { static final String id = "/single-device-Picker"; @@ -150,16 +151,16 @@ class _SingleDevicePickerState extends State { ], ), ), - // floatingActionButton: FloatingActionButton( - // heroTag: "some tag 2", - // child: const Icon(Icons.qr_code_scanner), - // onPressed: () async { - // String result = await Navigator.of(context).push( - // MaterialPageRoute(builder: (_)=> const ScanQr()), - // ) as String; - // _getDevice(result); - // }, - // ), + floatingActionButton: FloatingActionButton( + heroTag: "some tag 2", + child: const Icon(Icons.qr_code_scanner), + onPressed: () async { + String result = await Navigator.of(context).push( + MaterialPageRoute(builder: (_) => const ScanQr()), + ) as String; + _getDevice(result); + }, + ), ); } } diff --git a/lib/views/widgets/gas_refill/gas_refill_create_details_item.dart b/lib/views/widgets/gas_refill/gas_refill_create_details_item.dart index bd48bf25..3d913f65 100644 --- a/lib/views/widgets/gas_refill/gas_refill_create_details_item.dart +++ b/lib/views/widgets/gas_refill/gas_refill_create_details_item.dart @@ -7,83 +7,86 @@ import '../../../controllers/localization/localization.dart'; import '../buttons/app_button.dart'; import '../titles/app_sub_title.dart'; -class GasRefillCreateDetailsItem extends StatelessWidget { - GasRefillDetails model; +class GasRefillCreateDetailsItem extends StatefulWidget { + final GasRefillDetails model; final VoidCallback onPressed; final bool isUpdate; - GasRefillCreateDetailsItem({Key key, this.isUpdate, this.model, this.onPressed}) : super(key: key); + const GasRefillCreateDetailsItem({Key key, this.isUpdate, this.model, this.onPressed}) : super(key: key); + + @override + State createState() => _GasRefillCreateDetailsItemState(); +} + +class _GasRefillCreateDetailsItemState extends State { + GlobalKey _formKey; + + @override + void initState() { + super.initState(); + _formKey = GlobalKey(); + } @override Widget build(BuildContext context) { final subtitle = AppLocalization.of(context).subtitle; - final startEditing = isUpdate && (model.selectedForEditing ?? false); - double deliveredQuantity; - return Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - Row( - children: [Expanded(child: Text(model.type.name)), IconButton(onPressed: onPressed, color: isUpdate ? AColors.cyan : AColors.red, icon: Icon(isUpdate ? Icons.edit : Icons.delete))], - ), - Wrap( - spacing: 10, - children: [ - Text("Quantity: ${model.requestedQuantity.toStringAsFixed(0)}"), - Text("Cylinder Size: ${model.cylinderSize.name}"), - Text("Cylinder Type: ${model.cylinderType.name}"), - ], - ), - if (model.deliveredQuantity != null) + final startEditing = widget.isUpdate && (widget.model.selectedForEditing ?? false); + return Form( + key: _formKey, + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ Row( children: [ - const Text("Delivered Quantity: "), - Text(model.deliveredQuantity.toStringAsFixed(0)), + Expanded(child: Text(widget.model.type.name)), + IconButton(onPressed: widget.onPressed, color: widget.isUpdate ? AColors.cyan : AColors.red, icon: Icon(widget.isUpdate ? Icons.edit : Icons.delete)) ], ), - if (startEditing) const SizedBox(height: 16), - if (startEditing) ASubTitle(subtitle.deliveredQuantity), - if (startEditing) const SizedBox(height: 4), - if (startEditing) - ATextFormField( - initialValue: model.deliveredQuantity?.toString() ?? "0", - textAlign: TextAlign.center, - // controller: deliveredQuantityController, - style: Theme.of(context).textTheme.subtitle1, - // validator: (value) => Validator.isNumeric(value) ? null : "allow numbers only", - textInputType: TextInputType.number, - // onSaved: (value) { - // print("value:$value"); - // deliveredQuantity = double.tryParse(value) ?? 0; - // print("valueAfter:$value"); - // // _currentDetails?.deliveredQuantity = double.tryParse(value); - // }, - onChange: (value) { - if(value.isNotEmpty) { - model.deliveredQuantity = double.tryParse(value); - } else { - model.deliveredQuantity = 0; - } - print("value:$value"); - deliveredQuantity = double.tryParse(value) ?? 0; - print("valueAfter:$value"); - // _currentDetails?.deliveredQuantity = double.tryParse(value); - }, - ), - if (startEditing) const SizedBox(height: 8), - if (startEditing) - AButton( - text: subtitle.edit, - onPressed: () { - // print("deliveredQuantity:$deliveredQuantity"); - // if (deliveredQuantity != null) { - // model.deliveredQuantity = deliveredQuantity; - // print("deliveredQuantity:${model.deliveredQuantity}"); - onPressed(); - // } - }, + Wrap( + spacing: 10, + children: [ + Text("Quantity: ${widget.model.requestedQuantity.toStringAsFixed(0)}"), + Text("Cylinder Size: ${widget.model.cylinderSize.name}"), + Text("Cylinder Type: ${widget.model.cylinderType.name}"), + ], ), - const Divider(), - ], + if (widget.model.deliveredQuantity != null) + Row( + children: [ + const Text("Delivered Quantity: "), + Text(widget.model.deliveredQuantity.toStringAsFixed(0)), + ], + ), + if (startEditing) const SizedBox(height: 16), + if (startEditing) ASubTitle(subtitle.deliveredQuantity), + if (startEditing) const SizedBox(height: 4), + if (startEditing) + ATextFormField( + initialValue: widget.model.deliveredQuantity?.toString() ?? "0", + textAlign: TextAlign.center, + style: Theme.of(context).textTheme.titleMedium, + // validator: (value) => Validator.isNumeric(value) ? null : "allow numbers only", + textInputType: TextInputType.number, + onSaved: (value) { + if (value.isNotEmpty) { + widget.model.deliveredQuantity = double.tryParse(value); + } else { + widget.model.deliveredQuantity = 0; + } + }, + ), + if (startEditing) const SizedBox(height: 8), + if (startEditing) + AButton( + text: subtitle.edit, + onPressed: () { + _formKey.currentState?.save(); + widget.onPressed(); + }, + ), + const Divider(), + ], + ), ); } } From 33758f4cfde7d059fde5fdfd0c2911cbb987b286 Mon Sep 17 00:00:00 2001 From: zaid_daoud Date: Wed, 14 Jun 2023 15:34:19 +0300 Subject: [PATCH 082/181] Test --- lib/models/customer.dart | 6 +++--- lib/models/hospital.dart | 4 ++-- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/lib/models/customer.dart b/lib/models/customer.dart index d075eff9..5b0e1d8c 100644 --- a/lib/models/customer.dart +++ b/lib/models/customer.dart @@ -46,7 +46,7 @@ class Data { customerCode = json['customerCode']; custName = json['custName']; if (json['buildings'] != null) { - buildings = new List(); + buildings = []; json['buildings'].forEach((v) { buildings.add(new Buildings.fromJson(v)); }); @@ -78,7 +78,7 @@ class Buildings { name = json['name']; value = json['value']; if (json['floors'] != null) { - floors = new List(); + floors = []; json['floors'].forEach((v) { floors.add(new Floors.fromJson(v)); }); @@ -110,7 +110,7 @@ class Floors { name = json['name']; value = json['value']; if (json['departments'] != null) { - departments = new List(); + departments = []; json['departments'].forEach((v) { departments.add(new Departments.fromJson(v)); }); diff --git a/lib/models/hospital.dart b/lib/models/hospital.dart index f076ad6e..e0bf9506 100644 --- a/lib/models/hospital.dart +++ b/lib/models/hospital.dart @@ -78,7 +78,7 @@ class Buildings { name = json['name']; value = json['value']; if (json['floors'] != null) { - floors = List(); + floors = []; json['floors'].forEach((v) { floors.add(Floors.fromJson(v)); }); @@ -110,7 +110,7 @@ class Floors { name = json['name']; value = json['value']; if (json['departments'] != null) { - departments = List(); + departments = []; json['departments'].forEach((v) { departments.add(Departments.fromJson(v)); }); From 27d3a74d3b684a95323ef01f0a98eb07dc67a258 Mon Sep 17 00:00:00 2001 From: zaid_daoud Date: Sun, 18 Jun 2023 11:32:15 +0300 Subject: [PATCH 083/181] Search Sub Work Order Screen DONE --- assets/images/sub_workorder_icon.svg | 7 + lib/controllers/api_routes/urls.dart | 3 + .../api/service_requests_provider.dart | 45 ++++ ...report_maintenance_situation_provider.dart | 75 +++++++ .../report/service_report_users_provider.dart | 75 +++++++ ...e_report_visit_date_operator_provider.dart | 75 +++++++ lib/main.dart | 8 + .../sub_workorder/sub_workorder_page.dart | 207 ++++++++++++++++++ lib/views/pages/user/land_page.dart | 9 + .../pages/user/requests/request_details.dart | 201 ++++++++--------- .../widgets/land_page/land_page_item.dart | 25 ++- .../report/service_report_all_users.dart | 29 +++ .../service_report_maintenance_situation.dart | 30 +++ .../service_report_visit_date_operator.dart | 30 +++ lib/views/widgets/status/users_menu.dart | 109 +++++++++ pubspec.yaml | 1 + 16 files changed, 821 insertions(+), 108 deletions(-) create mode 100644 assets/images/sub_workorder_icon.svg create mode 100644 lib/controllers/providers/api/status_drop_down/report/service_report_maintenance_situation_provider.dart create mode 100644 lib/controllers/providers/api/status_drop_down/report/service_report_users_provider.dart create mode 100644 lib/controllers/providers/api/status_drop_down/report/service_report_visit_date_operator_provider.dart create mode 100644 lib/views/pages/sub_workorder/sub_workorder_page.dart create mode 100644 lib/views/widgets/status/report/service_report_all_users.dart create mode 100644 lib/views/widgets/status/report/service_report_maintenance_situation.dart create mode 100644 lib/views/widgets/status/report/service_report_visit_date_operator.dart create mode 100644 lib/views/widgets/status/users_menu.dart diff --git a/assets/images/sub_workorder_icon.svg b/assets/images/sub_workorder_icon.svg new file mode 100644 index 00000000..4400caae --- /dev/null +++ b/assets/images/sub_workorder_icon.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/lib/controllers/api_routes/urls.dart b/lib/controllers/api_routes/urls.dart index 4dc9dc73..86794228 100644 --- a/lib/controllers/api_routes/urls.dart +++ b/lib/controllers/api_routes/urls.dart @@ -36,6 +36,9 @@ class URLs { static get getRepairLocation => "$_baseUrl/Lookups/GetLookup?lookupEnum=504"; static get equipmentStatus => "$_baseUrl/Lookups/GetLookup?lookupEnum=601"; + static get getDateOperators => "$_baseUrl/Lookups/GetLookup?lookupEnum=200"; + static get getMaintenanceSituation => "$_baseUrl/Lookups/GetLookup?lookupEnum=502"; + static get getAllUsers => "http://109.123.243.118:5000/api/Account/GetAllUsers"; static get getPreventiveMaintenanceVisits => "$_baseUrl/return/user/calibrations"; // get static get updatePreventiveMaintenanceVisits => "$_baseUrl/Visit/UpdateVisits"; // get diff --git a/lib/controllers/providers/api/service_requests_provider.dart b/lib/controllers/providers/api/service_requests_provider.dart index a044543d..3334332b 100644 --- a/lib/controllers/providers/api/service_requests_provider.dart +++ b/lib/controllers/providers/api/service_requests_provider.dart @@ -7,6 +7,7 @@ import 'package:test_sa/controllers/api_routes/http_status_manger.dart'; import 'package:test_sa/controllers/api_routes/urls.dart'; import 'package:test_sa/models/call_request_for_work_order_model.dart'; import 'package:test_sa/models/issue.dart'; +import 'package:test_sa/models/lookup.dart'; import 'package:test_sa/models/service_report.dart'; import 'package:test_sa/models/service_request/service_request.dart'; import 'package:test_sa/models/service_request/service_request_search.dart'; @@ -557,4 +558,48 @@ class ServiceRequestsProvider extends ChangeNotifier { return {}; } } + + Future> searchForWorkOrders( + SearchWorkOrders 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, + if (search.assetType != null) "assetSerialNo": search.assetType, + if (search.id != null) "workOrderNo": search.id?.toString(), + if (search.calllastSituation != null) "callslastSituationWO": search.calllastSituation.toMap(), + if (search.assignedEmployee != null) + "assignedEmployees": [ + search.assignedEmployee.id, + ], + // "statusWO": [], + if (site?.isNotEmpty ?? false) "site": site, + if (search.visitDate != null && dateOperator != null) "visitDateSymbol": dateOperator?.toMap(), + if (search.visitDate != null && dateOperator != null) "visitDateFrom": search.visitDate, + }; + print(body); + response = await ApiManager.instance.post(URLs.searchWorkOrders, body: body); + stateCode = response.statusCode; + if (response.statusCode >= 200 && response.statusCode < 300) { + // client's request was successfully received + List workOrdersJson = json.decode(response.body)["data"]; + print(workOrdersJson); + workOrders = workOrdersJson.map((request) => SearchWorkOrders.fromJson(request)).toList(); + if (workOrders.length == pageItemNumber) { + nextPage = true; + } else { + nextPage = false; + } + } + return workOrders; + } catch (e) { + return []; + } + } } diff --git a/lib/controllers/providers/api/status_drop_down/report/service_report_maintenance_situation_provider.dart b/lib/controllers/providers/api/status_drop_down/report/service_report_maintenance_situation_provider.dart new file mode 100644 index 00000000..1041a2a2 --- /dev/null +++ b/lib/controllers/providers/api/status_drop_down/report/service_report_maintenance_situation_provider.dart @@ -0,0 +1,75 @@ +import 'dart:convert'; + +import 'package:flutter/cupertino.dart'; +import 'package:flutter/material.dart'; +import 'package:http/http.dart'; +import 'package:test_sa/controllers/api_routes/api_manager.dart'; +import 'package:test_sa/controllers/api_routes/urls.dart'; +import 'package:test_sa/models/lookup.dart'; + +class ServiceReportMaintenanceSituationProvider extends ChangeNotifier { + //reset provider data + void reset() { + _calls = null; + _loading = null; + _stateCode = null; + } + + // state code of current request to defied error message + // like 400 customer request failed + // 500 service not available + int _stateCode; + int get stateCode => _stateCode; + + // contain user data + // when user not login or register _user = null + List _calls; + List get operators => _calls; + + // when categories in-process _loading = true + // done _loading = true + // failed _loading = false + bool _loading; + bool get isLoading => _loading; + set isLoading(bool isLoading) { + _loading = isLoading; + notifyListeners(); + } + + /// return -2 if request in progress + /// return -1 if error happen when sending request + /// 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 getOperators() async { + if (_loading == true) return -2; + _loading = true; + notifyListeners(); + Response response; + try { + response = await ApiManager.instance.get( + "${URLs.getMaintenanceSituation}", + ); + // response = await get( + // Uri.parse( + // URLs.getServiceReportLastCalls + // +(serviceStatus == null ? "" : "?service_status=$serviceStatus") + // ), + // ); + _stateCode = response.statusCode; + if (response.statusCode >= 200 && response.statusCode < 300) { + // client's request was successfully received + List categoriesListJson = json.decode(response.body)["data"]; + _calls = categoriesListJson.map((type) => Lookup.fromJson(type)).toList(); + } + _loading = false; + notifyListeners(); + return response.statusCode; + } catch (error) { + _loading = false; + _stateCode = -1; + notifyListeners(); + return -1; + } + } +} diff --git a/lib/controllers/providers/api/status_drop_down/report/service_report_users_provider.dart b/lib/controllers/providers/api/status_drop_down/report/service_report_users_provider.dart new file mode 100644 index 00000000..42132b29 --- /dev/null +++ b/lib/controllers/providers/api/status_drop_down/report/service_report_users_provider.dart @@ -0,0 +1,75 @@ +import 'dart:convert'; + +import 'package:flutter/cupertino.dart'; +import 'package:flutter/material.dart'; +import 'package:http/http.dart'; +import 'package:test_sa/controllers/api_routes/api_manager.dart'; +import 'package:test_sa/controllers/api_routes/urls.dart'; +import 'package:test_sa/models/engineer.dart'; + +class ServiceReportUsersProvider extends ChangeNotifier { + //reset provider data + void reset() { + _calls = null; + _loading = null; + _stateCode = null; + } + + // state code of current request to defied error message + // like 400 customer request failed + // 500 service not available + int _stateCode; + int get stateCode => _stateCode; + + // contain user data + // when user not login or register _user = null + List _calls; + List get users => _calls; + + // when categories in-process _loading = true + // done _loading = true + // failed _loading = false + bool _loading; + bool get isLoading => _loading; + set isLoading(bool isLoading) { + _loading = isLoading; + notifyListeners(); + } + + /// return -2 if request in progress + /// return -1 if error happen when sending request + /// 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 getAllUsers() async { + if (_loading == true) return -2; + _loading = true; + notifyListeners(); + Response response; + try { + response = await ApiManager.instance.get( + "${URLs.getAllUsers}", + ); + // response = await get( + // Uri.parse( + // URLs.getServiceReportLastCalls + // +(serviceStatus == null ? "" : "?service_status=$serviceStatus") + // ), + // ); + _stateCode = response.statusCode; + if (response.statusCode >= 200 && response.statusCode < 300) { + // client's request was successfully received + List usersListJson = json.decode(response.body); + _calls = usersListJson.map((type) => Engineer.fromJson(type)).toList(); + } + _loading = false; + notifyListeners(); + return response.statusCode; + } catch (error) { + _loading = false; + _stateCode = -1; + notifyListeners(); + return -1; + } + } +} diff --git a/lib/controllers/providers/api/status_drop_down/report/service_report_visit_date_operator_provider.dart b/lib/controllers/providers/api/status_drop_down/report/service_report_visit_date_operator_provider.dart new file mode 100644 index 00000000..dc8d7855 --- /dev/null +++ b/lib/controllers/providers/api/status_drop_down/report/service_report_visit_date_operator_provider.dart @@ -0,0 +1,75 @@ +import 'dart:convert'; + +import 'package:flutter/cupertino.dart'; +import 'package:flutter/material.dart'; +import 'package:http/http.dart'; +import 'package:test_sa/controllers/api_routes/api_manager.dart'; +import 'package:test_sa/controllers/api_routes/urls.dart'; +import 'package:test_sa/models/lookup.dart'; + +class ServiceReportVisitOperatorProvider extends ChangeNotifier { + //reset provider data + void reset() { + _calls = null; + _loading = null; + _stateCode = null; + } + + // state code of current request to defied error message + // like 400 customer request failed + // 500 service not available + int _stateCode; + int get stateCode => _stateCode; + + // contain user data + // when user not login or register _user = null + List _calls; + List get operators => _calls; + + // when categories in-process _loading = true + // done _loading = true + // failed _loading = false + bool _loading; + bool get isLoading => _loading; + set isLoading(bool isLoading) { + _loading = isLoading; + notifyListeners(); + } + + /// return -2 if request in progress + /// return -1 if error happen when sending request + /// 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 getOperators() async { + if (_loading == true) return -2; + _loading = true; + notifyListeners(); + Response response; + try { + response = await ApiManager.instance.get( + "${URLs.getDateOperators}", + ); + // response = await get( + // Uri.parse( + // URLs.getServiceReportLastCalls + // +(serviceStatus == null ? "" : "?service_status=$serviceStatus") + // ), + // ); + _stateCode = response.statusCode; + if (response.statusCode >= 200 && response.statusCode < 300) { + // client's request was successfully received + List categoriesListJson = json.decode(response.body)["data"]; + _calls = categoriesListJson.map((type) => Lookup.fromJson(type)).toList(); + } + _loading = false; + notifyListeners(); + return response.statusCode; + } catch (error) { + _loading = false; + _stateCode = -1; + notifyListeners(); + return -1; + } + } +} diff --git a/lib/main.dart b/lib/main.dart index 3d85f355..c6ffff50 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -23,7 +23,10 @@ import 'package:test_sa/controllers/providers/api/status_drop_down/pentry/pentry import 'package:test_sa/controllers/providers/api/status_drop_down/pentry/pentry_visit_status_provider.dart'; import 'package:test_sa/controllers/providers/api/status_drop_down/report/service_report_defect_types_provider.dart'; import 'package:test_sa/controllers/providers/api/status_drop_down/report/service_report_equipment_status_provider.dart'; +import 'package:test_sa/controllers/providers/api/status_drop_down/report/service_report_maintenance_situation_provider.dart'; import 'package:test_sa/controllers/providers/api/status_drop_down/report/service_report_priority_provider.dart'; +import 'package:test_sa/controllers/providers/api/status_drop_down/report/service_report_users_provider.dart'; +import 'package:test_sa/controllers/providers/api/status_drop_down/report/service_report_visit_date_operator_provider.dart'; import 'package:test_sa/controllers/providers/api/status_drop_down/service_reqest/service_request_first_action_provider.dart'; import 'package:test_sa/controllers/providers/api/status_drop_down/service_reqest/service_request_loan_availability_provider.dart'; import 'package:test_sa/controllers/providers/api/status_drop_down/service_reqest/service_request_status_provider.dart'; @@ -33,6 +36,7 @@ import 'package:test_sa/views/app_style/colors.dart'; import 'package:test_sa/views/pages/login.dart'; import 'package:test_sa/views/pages/register.dart'; import 'package:test_sa/views/pages/splash_screen.dart'; +import 'package:test_sa/views/pages/sub_workorder/sub_workorder_page.dart'; import 'package:test_sa/views/pages/user/gas_refill/request_gas_refill.dart'; import 'package:test_sa/views/pages/user/gas_refill/track_gas_refill.dart'; import 'package:test_sa/views/pages/user/land_page.dart'; @@ -121,6 +125,9 @@ class MyApp extends StatelessWidget { ChangeNotifierProvider(create: (_) => ServiceFirstActionProvider()), ChangeNotifierProvider(create: (_) => ServiceReportRepairLocationProvider()), ChangeNotifierProvider(create: (_) => ServiceRequestFaultDescriptionProvider()), + ChangeNotifierProvider(create: (_) => ServiceReportVisitOperatorProvider()), + ChangeNotifierProvider(create: (_) => ServiceReportMaintenanceSituationProvider()), + ChangeNotifierProvider(create: (_) => ServiceReportUsersProvider()), ], child: GestureDetector( onTap: () { @@ -172,6 +179,7 @@ class MyApp extends StatelessWidget { TrackGasRefillPage.id: (_) => const TrackGasRefillPage(), RequestDeviceTransfer.id: (_) => const RequestDeviceTransfer(), TrackDeviceTransferPage.id: (_) => const TrackDeviceTransferPage(), + SubWorkOrderPage.id: (_) => const SubWorkOrderPage(), }, ), ), diff --git a/lib/views/pages/sub_workorder/sub_workorder_page.dart b/lib/views/pages/sub_workorder/sub_workorder_page.dart new file mode 100644 index 00000000..4aeaa1be --- /dev/null +++ b/lib/views/pages/sub_workorder/sub_workorder_page.dart @@ -0,0 +1,207 @@ +import 'package:flutter/material.dart'; +import 'package:fluttertoast/fluttertoast.dart'; +import 'package:provider/provider.dart'; +import 'package:test_sa/controllers/providers/api/service_requests_provider.dart'; +import 'package:test_sa/models/engineer.dart'; +import 'package:test_sa/models/lookup.dart'; +import 'package:test_sa/models/service_request/search_work_order.dart'; +import 'package:test_sa/models/subtitle.dart'; +import 'package:test_sa/views/widgets/app_text_form_field.dart'; +import 'package:test_sa/views/widgets/date_and_time/date_picker.dart'; + +import '../../../controllers/api_routes/http_status_manger.dart'; +import '../../../controllers/localization/localization.dart'; +import '../../app_style/colors.dart'; +import '../../widgets/buttons/app_back_button.dart'; +import '../../widgets/buttons/app_button.dart'; +import '../../widgets/loaders/app_loading.dart'; +import '../../widgets/status/report/service_report_all_users.dart'; +import '../../widgets/status/report/service_report_maintenance_situation.dart'; +import '../../widgets/status/report/service_report_visit_date_operator.dart'; +import '../../widgets/titles/app_sub_title.dart'; + +class SubWorkOrderPage extends StatefulWidget { + static String id = "/SubWorkOrderPage"; + const SubWorkOrderPage({Key key}) : super(key: key); + + @override + State createState() => _SubWorkOrderPageState(); +} + +class _SubWorkOrderPageState extends State { + final GlobalKey _formKey = GlobalKey(); + final SearchWorkOrders _searchWorkOrders = SearchWorkOrders(); + Subtitle _subtitle; + bool _isLoading = false; + String _callerId = "", _site = ""; + Lookup _dateOperator; + @override + Widget build(BuildContext context) { + _subtitle = AppLocalization.of(context).subtitle; + return Scaffold( + body: SafeArea( + child: SingleChildScrollView( + child: Column( + children: [ + Container( + color: AColors.primaryColor, + padding: const EdgeInsets.symmetric(horizontal: 0, vertical: 4), + child: Column( + children: [ + Row( + children: [ + const ABackButton(), + Expanded( + child: Center( + child: Text( + "Search Work Order", + style: Theme.of(context).textTheme.headline6.copyWith(color: AColors.white, fontStyle: FontStyle.italic), + ), + ), + ), + const SizedBox( + width: 48, + ) + ], + ), + ], + ), + ), + const SizedBox(height: 8), + Form( + key: _formKey, + child: Padding( + padding: const EdgeInsets.all(16.0), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + ATextFormField( + labelText: "Caller ID", + onSaved: (value) { + _callerId = value; + }, + ), + const SizedBox(height: 16), + ATextFormField( + labelText: "Asset S.N.", + textInputType: TextInputType.number, + onSaved: (value) { + _searchWorkOrders.assetType = value; + }, + ), + const SizedBox(height: 16), + ATextFormField( + labelText: "Work Order No.", + onSaved: (value) { + _searchWorkOrders.workOrderNo = value; + }, + ), + const SizedBox(height: 16), + ASubTitle(_subtitle.assignedEmployee), + const SizedBox(height: 4), + ServiceReportAllUsers( + initialValue: _searchWorkOrders.assignedEmployee == null ? null : Engineer(id: _searchWorkOrders.assignedEmployee.id, name: _searchWorkOrders.assignedEmployee.name), + onSelect: (engineer) { + _searchWorkOrders.assignedEmployee = AssignedEmployee(id: engineer.id, name: engineer.name); + }, + ), + const SizedBox(height: 16), + const ASubTitle("Maintenance Situation"), + const SizedBox(height: 4), + ServiceReportMaintenanceSituation( + initialValue: _searchWorkOrders.calllastSituation, + onSelect: (status) { + if (status?.value == 12 || _searchWorkOrders.calllastSituation?.value == 12) { + _searchWorkOrders.calllastSituation = status; + setState(() {}); + } else { + _searchWorkOrders.calllastSituation = status; + } + }, + ), + const SizedBox(height: 16), + ATextFormField( + labelText: "Site", + onSaved: (value) { + _site = value; + }, + ), + const SizedBox(height: 16), + ASubTitle(_subtitle.visitDate), + const SizedBox(height: 4), + ServiceReportVisitDateOperator( + initialValue: _dateOperator, + onSelect: (status) { + _dateOperator = status; + }, + ), + Row( + children: [ + Expanded( + child: ADatePicker( + date: DateTime.tryParse(_searchWorkOrders.visitDate ?? ""), + from: DateTime(1950), + onDatePicker: (date) { + _searchWorkOrders.visitDate = date?.toIso8601String(); + setState(() {}); + }, + ), + ), + ], + ), + ], + ), + ), + ), + const SizedBox(height: 100), + ], + ), + ), + ), + floatingActionButtonLocation: FloatingActionButtonLocation.centerFloat, + floatingActionButton: _isLoading + ? const ALoading() + : Padding( + padding: const EdgeInsets.symmetric(horizontal: 16), + child: AButton( + text: _subtitle.search, + onPressed: () async { + _isLoading = true; + setState(() {}); + if (_formKey.currentState?.validate() ?? false) {} + _formKey.currentState?.save(); + final serviceRequestsProvider = Provider.of(context, listen: false); + final List woList = await serviceRequestsProvider.searchForWorkOrders( + _searchWorkOrders, + _callerId, + _dateOperator, + _site, + ); + _isLoading = false; + setState(() {}); + if (serviceRequestsProvider.stateCode >= 200 && serviceRequestsProvider.stateCode < 300) { + Fluttertoast.showToast(msg: _subtitle.requestCompleteSuccessfully); + Navigator.push( + context, + MaterialPageRoute( + builder: (context) => Scaffold( + body: ListView.builder( + itemCount: woList.length, + shrinkWrap: true, + itemBuilder: (context, index) => Text( + woList[index].id?.toString(), + ), + ), + ), + ), + ); + } else { + String errorMessage = HttpStatusManger.getStatusMessage(status: serviceRequestsProvider.stateCode, subtitle: _subtitle); + ScaffoldMessenger.of(context).showSnackBar(SnackBar(content: Text(errorMessage))); + } + }, + ), + ), + ); + } +} diff --git a/lib/views/pages/user/land_page.dart b/lib/views/pages/user/land_page.dart index ba49b91b..d4a56737 100644 --- a/lib/views/pages/user/land_page.dart +++ b/lib/views/pages/user/land_page.dart @@ -23,6 +23,7 @@ import 'package:test_sa/views/app_style/colors.dart'; import 'package:test_sa/views/app_style/sizing.dart'; import 'package:test_sa/views/pages/device_transfer/request_device_transfer.dart'; import 'package:test_sa/views/pages/device_transfer/track_device_transfer.dart'; +import 'package:test_sa/views/pages/sub_workorder/sub_workorder_page.dart'; import 'package:test_sa/views/pages/user/gas_refill/request_gas_refill.dart'; import 'package:test_sa/views/pages/user/gas_refill/track_gas_refill.dart'; import 'package:test_sa/views/pages/user/requests/create_request.dart'; @@ -211,6 +212,14 @@ class _LandPageState extends State { Navigator.of(context).pushNamed(TrackDeviceTransferPage.id); }, ), + // if (_userProvider?.user != null && _userProvider?.user?.type != UsersTypes.engineer) + LandPageItem( + text: "Search Work Order", + svgPath: "assets/images/sub_workorder_icon.svg", + onPressed: () { + Navigator.of(context).pushNamed(SubWorkOrderPage.id); + }, + ), ], ), ], diff --git a/lib/views/pages/user/requests/request_details.dart b/lib/views/pages/user/requests/request_details.dart index 36f3f948..03a71d01 100644 --- a/lib/views/pages/user/requests/request_details.dart +++ b/lib/views/pages/user/requests/request_details.dart @@ -1,4 +1,3 @@ -import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; import 'package:intl/intl.dart'; import 'package:provider/provider.dart'; @@ -21,7 +20,6 @@ import 'package:test_sa/views/widgets/images/images_list.dart'; import 'package:test_sa/views/widgets/loaders/image_loader.dart'; import 'package:test_sa/views/widgets/requests/info_row.dart'; import 'package:test_sa/views/widgets/requests/request_status.dart'; -import 'package:test_sa/views/widgets/requests/service_request_update_dialog.dart'; import 'package:test_sa/views/widgets/sound/sound_player.dart'; import 'package:test_sa/views/widgets/titles/app_sub_title.dart'; @@ -308,111 +306,114 @@ class RequestDetailsPage extends StatelessWidget { workOrders = snap.data as List; if (snap.connectionState == ConnectionState.waiting) return Center(child: CircularProgressIndicator()); if (snap.connectionState == ConnectionState.done && (snap.data?.length ?? 0) != 0) { - return ListView.separated( - padding: EdgeInsets.all(21), - itemCount: workOrders.length, - separatorBuilder: (czt, index) => 21.height, - itemBuilder: (context, index) { - Color itemColor = index % 2 == 0 ? Theme.of(context).colorScheme.primary : Theme.of(context).colorScheme.onPrimary; - Color onItemColor = index % 2 != 0 ? Theme.of(context).colorScheme.primary : Theme.of(context).colorScheme.onPrimary; + return SingleChildScrollView( + child: Column( + children: [ + ListView.separated( + shrinkWrap: true, + physics: const NeverScrollableScrollPhysics(), + padding: EdgeInsets.all(21), + itemCount: workOrders.length, + separatorBuilder: (czt, index) => 21.height, + itemBuilder: (context, index) { + Color itemColor = index % 2 == 0 ? Theme.of(context).colorScheme.primary : Theme.of(context).colorScheme.onPrimary; + Color onItemColor = index % 2 != 0 ? Theme.of(context).colorScheme.primary : Theme.of(context).colorScheme.onPrimary; - return ElevatedButton( - style: ElevatedButton.styleFrom( - padding: EdgeInsets.symmetric(vertical: 8, horizontal: 8), - primary: itemColor.withOpacity(.7), - shape: RoundedRectangleBorder( - borderRadius: BorderRadius.circular(AppStyle.getBorderRadius(context)), - ), - ), - //padding: EdgeInsets.symmetric(vertical: 8,horizontal: 8), - onPressed: () { - // onPressed(request); - }, - child: Column( - children: [ - RequestInfoRow( - title: _subtitle.callId, - content: serviceRequest.requestCode, - ), - RequestInfoRow( - title: _subtitle.orderWorkNumber, - info: workOrders[index].workOrderNo.toString(), - ), - RequestInfoRow( - title: _subtitle.visitDate, - info: workOrders[index].visitDate, - ), - RequestInfoRow(title: _subtitle.assignedEmployee, info: workOrders[index].assignedEmployee.name), - RequestInfoRow( - title: _subtitle.assetSN, - info: workOrders[index].callRequest.asset.assetSerialNo, - ), - RequestInfoRow( - title: _subtitle.assetName, - info: workOrders[index].callRequest.asset.modelDefinition.assetName, - ), - RequestInfoRow( - title: _subtitle.model, - info: workOrders[index].callRequest.asset.modelDefinition.modelName, - ), - RequestInfoRow( - title: _subtitle.site, - info: workOrders[index].callRequest.asset.site.custName, - ), - RequestInfoRow( - title: _subtitle.maintenanceSituation, - info: workOrders[index].calllastSituation.name ?? '', - ), - RequestInfoRow( - title: _subtitle.currentSituation, - info: workOrders[index].currentSituation.name ?? '', - ), - _userProvider.user.type == UsersTypes.engineer && workOrders[index].workOrderNo != null - ? Padding( - padding: EdgeInsets.all(32), - child: AButton( - text: _subtitle.editServiceReport, - onPressed: () { - Navigator.of(context).push( - MaterialPageRoute( - builder: (_) => FutureServiceReport( - request: serviceRequest, - workOrder: workOrders[index], - )), - ); - }, - ), - ) - : SizedBox.shrink(), - ], - ), - ); - }, - ); - } else { - return _userProvider.user.type == UsersTypes.engineer - ? Center( - child: Padding( - padding: EdgeInsets.all(32), - child: AButton( - text: "Create Report", + return ElevatedButton( + style: ElevatedButton.styleFrom( + padding: EdgeInsets.symmetric(vertical: 8, horizontal: 8), + primary: itemColor.withOpacity(.7), + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(AppStyle.getBorderRadius(context)), + ), + ), + //padding: EdgeInsets.symmetric(vertical: 8,horizontal: 8), onPressed: () { - Navigator.of(context).push( - MaterialPageRoute( - builder: (_) => CreateServiceReport( - request: serviceRequest, - )), - ); + // onPressed(request); }, + child: Column( + children: [ + RequestInfoRow( + title: _subtitle.callId, + content: serviceRequest.requestCode, + ), + RequestInfoRow( + title: _subtitle.orderWorkNumber, + info: workOrders[index].workOrderNo.toString(), + ), + RequestInfoRow( + title: _subtitle.visitDate, + info: workOrders[index].visitDate, + ), + RequestInfoRow(title: _subtitle.assignedEmployee, info: workOrders[index].assignedEmployee.name), + RequestInfoRow( + title: _subtitle.assetSN, + info: workOrders[index].callRequest.asset.assetSerialNo, + ), + RequestInfoRow( + title: _subtitle.assetName, + info: workOrders[index].callRequest.asset.modelDefinition.assetName, + ), + RequestInfoRow( + title: _subtitle.model, + info: workOrders[index].callRequest.asset.modelDefinition.modelName, + ), + RequestInfoRow( + title: _subtitle.site, + info: workOrders[index].callRequest.asset.site.custName, + ), + RequestInfoRow( + title: _subtitle.maintenanceSituation, + info: workOrders[index].calllastSituation.name ?? '', + ), + RequestInfoRow( + title: _subtitle.currentSituation, + info: workOrders[index].currentSituation.name ?? '', + ), + _userProvider.user.type == UsersTypes.engineer && workOrders[index].workOrderNo != null + ? Padding( + padding: EdgeInsets.all(32), + child: AButton( + text: _subtitle.editServiceReport, + onPressed: () { + Navigator.of(context).push( + MaterialPageRoute( + builder: (_) => FutureServiceReport( + request: serviceRequest, + workOrder: workOrders[index], + )), + ); + }, + ), + ) + : SizedBox.shrink(), + ], + ), + ); + }, + ), + if (_userProvider.user.type == UsersTypes.engineer) + Center( + child: Padding( + padding: const EdgeInsets.all(32), + child: AButton( + text: "Create Report", + onPressed: () { + Navigator.of(context).push(MaterialPageRoute(builder: (_) => CreateServiceReport(request: serviceRequest))); + }, + ), ), ), - ) - : Center( - child: ASubTitle(_subtitle.noDateFound), - ); + ], + ), + ); + } else { + return Center( + child: ASubTitle(_subtitle.noDateFound), + ); } }, - ) + ), ], ), ), diff --git a/lib/views/widgets/land_page/land_page_item.dart b/lib/views/widgets/land_page/land_page_item.dart index a3085e65..10b7ff05 100644 --- a/lib/views/widgets/land_page/land_page_item.dart +++ b/lib/views/widgets/land_page/land_page_item.dart @@ -1,4 +1,5 @@ import 'package:flutter/material.dart'; +import 'package:flutter_svg/svg.dart'; import 'package:test_sa/views/app_style/colors.dart'; import 'package:test_sa/views/app_style/sizing.dart'; @@ -6,8 +7,8 @@ class LandPageItem extends StatelessWidget { final String text; final IconData icon; final VoidCallback onPressed; - - const LandPageItem({Key key, this.text, this.icon, this.onPressed}) : super(key: key); + final String svgPath; + const LandPageItem({Key key, this.svgPath, this.text, this.icon, this.onPressed}) : super(key: key); @override Widget build(BuildContext context) { @@ -30,12 +31,20 @@ class LandPageItem extends StatelessWidget { crossAxisAlignment: CrossAxisAlignment.start, mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ - Icon( - icon, - color: AColors.primaryColor, - size: 42 * AppStyle.getScaleFactor(context), - ), - Text(text, style: TextStyle(color: AColors.grey3A)), + if (icon != null) + Icon( + icon, + color: AColors.primaryColor, + size: 42 * AppStyle.getScaleFactor(context), + ), + if (svgPath != null) + SvgPicture.asset( + svgPath, + width: 42 * AppStyle.getScaleFactor(context), + height: 42 * AppStyle.getScaleFactor(context), + color: AColors.primaryColor, + ), + Text(text, style: const TextStyle(color: AColors.grey3A)), ], ), ), diff --git a/lib/views/widgets/status/report/service_report_all_users.dart b/lib/views/widgets/status/report/service_report_all_users.dart new file mode 100644 index 00000000..981806f8 --- /dev/null +++ b/lib/views/widgets/status/report/service_report_all_users.dart @@ -0,0 +1,29 @@ +import 'package:flutter/material.dart'; +import 'package:provider/provider.dart'; +import 'package:test_sa/controllers/providers/api/status_drop_down/report/service_report_users_provider.dart'; +import 'package:test_sa/models/engineer.dart'; +import 'package:test_sa/views/widgets/loaders/loading_manager.dart'; +import 'package:test_sa/views/widgets/status/users_menu.dart'; + +class ServiceReportAllUsers extends StatelessWidget { + final Function(Engineer) onSelect; + final Engineer initialValue; + const ServiceReportAllUsers({Key key, @required this.onSelect, this.initialValue}) : super(key: key); + @override + Widget build(BuildContext context) { + ServiceReportUsersProvider menuProvider = Provider.of(context); + return LoadingManager( + isLoading: menuProvider.isLoading, + isFailedLoading: menuProvider.users == null, + stateCode: menuProvider.stateCode, + onRefresh: () async { + menuProvider.getAllUsers(); + }, + child: UsersMenu( + initialStatus: initialValue, + statuses: menuProvider.users, + onSelect: onSelect, + ), + ); + } +} diff --git a/lib/views/widgets/status/report/service_report_maintenance_situation.dart b/lib/views/widgets/status/report/service_report_maintenance_situation.dart new file mode 100644 index 00000000..936a2284 --- /dev/null +++ b/lib/views/widgets/status/report/service_report_maintenance_situation.dart @@ -0,0 +1,30 @@ +import 'package:flutter/material.dart'; +import 'package:provider/provider.dart'; +import 'package:test_sa/controllers/providers/api/status_drop_down/report/service_report_maintenance_situation_provider.dart'; +import 'package:test_sa/models/lookup.dart'; +import 'package:test_sa/views/widgets/loaders/loading_manager.dart'; +import 'package:test_sa/views/widgets/status/single_status_menu.dart'; + +class ServiceReportMaintenanceSituation extends StatelessWidget { + final Function(Lookup) onSelect; + final Lookup initialValue; + + const ServiceReportMaintenanceSituation({Key key, @required this.onSelect, @required this.initialValue}) : super(key: key); + @override + Widget build(BuildContext context) { + ServiceReportMaintenanceSituationProvider menuProvider = Provider.of(context); + return LoadingManager( + isLoading: menuProvider.isLoading, + isFailedLoading: menuProvider.operators == null, + stateCode: menuProvider.stateCode, + onRefresh: () async { + menuProvider.getOperators(); + }, + child: SingleStatusMenu( + initialStatus: initialValue, + statuses: menuProvider.operators, + onSelect: onSelect, + ), + ); + } +} diff --git a/lib/views/widgets/status/report/service_report_visit_date_operator.dart b/lib/views/widgets/status/report/service_report_visit_date_operator.dart new file mode 100644 index 00000000..5148ffaa --- /dev/null +++ b/lib/views/widgets/status/report/service_report_visit_date_operator.dart @@ -0,0 +1,30 @@ +import 'package:flutter/material.dart'; +import 'package:provider/provider.dart'; +import 'package:test_sa/controllers/providers/api/status_drop_down/report/service_report_visit_date_operator_provider.dart'; +import 'package:test_sa/models/lookup.dart'; +import 'package:test_sa/views/widgets/loaders/loading_manager.dart'; +import 'package:test_sa/views/widgets/status/single_status_menu.dart'; + +class ServiceReportVisitDateOperator extends StatelessWidget { + final Function(Lookup) onSelect; + final Lookup initialValue; + + const ServiceReportVisitDateOperator({Key key, @required this.onSelect, @required this.initialValue}) : super(key: key); + @override + Widget build(BuildContext context) { + ServiceReportVisitOperatorProvider menuProvider = Provider.of(context); + return LoadingManager( + isLoading: menuProvider.isLoading, + isFailedLoading: menuProvider.operators == null, + stateCode: menuProvider.stateCode, + onRefresh: () async { + menuProvider.getOperators(); + }, + child: SingleStatusMenu( + initialStatus: initialValue, + statuses: menuProvider.operators, + onSelect: onSelect, + ), + ); + } +} diff --git a/lib/views/widgets/status/users_menu.dart b/lib/views/widgets/status/users_menu.dart new file mode 100644 index 00000000..8ffad745 --- /dev/null +++ b/lib/views/widgets/status/users_menu.dart @@ -0,0 +1,109 @@ +import 'package:flutter/material.dart'; +import 'package:test_sa/views/app_style/colors.dart'; +import 'package:test_sa/views/app_style/sizing.dart'; + +import '../../../models/engineer.dart'; + +class UsersMenu extends StatefulWidget { + final List statuses; + final Engineer initialStatus; + final Function(Engineer) onSelect; + + const UsersMenu({Key key, this.statuses, this.onSelect, this.initialStatus}) : super(key: key); + + @override + _SingleUsersMenuState createState() => _SingleUsersMenuState(); +} + +class _SingleUsersMenuState extends State { + Engineer _selectedStatus; + + @override + void setState(VoidCallback fn) { + if (mounted) super.setState(fn); + } + + @override + void didUpdateWidget(covariant UsersMenu oldWidget) { + if (widget.initialStatus != null) { + final result = widget.statuses?.where((element) { + return element == widget.initialStatus; + }); + if (result.isNotEmpty) { + _selectedStatus = result.first; + } else { + _selectedStatus = null; + } + if ((widget.initialStatus?.id ?? "") != (_selectedStatus?.id ?? "")) { + widget.onSelect(_selectedStatus); + } + } else { + _selectedStatus = null; + } + super.didUpdateWidget(oldWidget); + } + + @override + void initState() { + if (widget.initialStatus != null) { + final result = widget.statuses?.where((element) { + return element == widget.initialStatus; + }); + if (result.isNotEmpty) _selectedStatus = result.first; + if (widget.initialStatus.id != _selectedStatus?.id) { + widget.onSelect(_selectedStatus); + } + } + + super.initState(); + } + + @override + Widget build(BuildContext context) { + return Container( + padding: const EdgeInsets.symmetric(horizontal: 16), + decoration: BoxDecoration( + color: AColors.inputFieldBackgroundColor, + border: Border.all( + color: Color(0xffefefef), + ), + borderRadius: BorderRadius.circular(AppStyle.borderRadius * AppStyle.getScaleFactor(context)), + // boxShadow: const [ + // AppStyle.boxShadow + // ] + ), + child: DropdownButton( + value: _selectedStatus, + iconSize: 24, + icon: const Icon(Icons.keyboard_arrow_down_rounded), + elevation: 0, + isExpanded: true, + hint: Text( + "Select", + style: Theme.of(context).textTheme.subtitle1, + ), + style: TextStyle(color: Theme.of(context).primaryColor), + underline: SizedBox.shrink(), + onChanged: (Engineer newValue) { + setState(() { + _selectedStatus = newValue; + }); + widget.onSelect(newValue); + }, + items: widget.statuses.map>((Engineer value) { + return DropdownMenuItem( + value: value, + child: Text( + value.name, + style: Theme.of(context).textTheme.subtitle1.copyWith( + color: Theme.of(context).primaryColor, + fontSize: 11, + //fontWeight: FontWeight.bold + ), + ), + ); + }).toList(), + ), + ); + } +} diff --git a/pubspec.yaml b/pubspec.yaml index 99885208..4f82161b 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -60,6 +60,7 @@ dependencies: audioplayers: ^1.1.1 flare_flutter: ^3.0.2 signature: ^5.3.0 + flutter_svg: ^1.1.6 dev_dependencies: From d13bfa5f60596a6688696d8154ea19d78cbc8251 Mon Sep 17 00:00:00 2001 From: zaid_daoud Date: Mon, 19 Jun 2023 09:38:16 +0300 Subject: [PATCH 084/181] Wo Details Bottom Sheet & Spare Parts Bottom Sheet Design Done [without activating update buttons] --- lib/main.dart | 6 +- .../create_sub_workorder_page.dart | 120 ++++++++++++ ...ge.dart => search_sub_workorder_page.dart} | 12 +- .../spare_parts_details_bottom_sheet.dart | 130 +++++++++++++ .../work_order_details_bottom_sheet.dart | 181 ++++++++++++++++++ lib/views/pages/user/land_page.dart | 4 +- 6 files changed, 443 insertions(+), 10 deletions(-) create mode 100644 lib/views/pages/sub_workorder/create_sub_workorder_page.dart rename lib/views/pages/sub_workorder/{sub_workorder_page.dart => search_sub_workorder_page.dart} (95%) create mode 100644 lib/views/pages/sub_workorder/spare_parts_details_bottom_sheet.dart create mode 100644 lib/views/pages/sub_workorder/work_order_details_bottom_sheet.dart diff --git a/lib/main.dart b/lib/main.dart index c6ffff50..89f7489a 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -36,7 +36,8 @@ import 'package:test_sa/views/app_style/colors.dart'; import 'package:test_sa/views/pages/login.dart'; import 'package:test_sa/views/pages/register.dart'; import 'package:test_sa/views/pages/splash_screen.dart'; -import 'package:test_sa/views/pages/sub_workorder/sub_workorder_page.dart'; +import 'package:test_sa/views/pages/sub_workorder/create_sub_workorder_page.dart'; +import 'package:test_sa/views/pages/sub_workorder/search_sub_workorder_page.dart'; import 'package:test_sa/views/pages/user/gas_refill/request_gas_refill.dart'; import 'package:test_sa/views/pages/user/gas_refill/track_gas_refill.dart'; import 'package:test_sa/views/pages/user/land_page.dart'; @@ -179,7 +180,8 @@ class MyApp extends StatelessWidget { TrackGasRefillPage.id: (_) => const TrackGasRefillPage(), RequestDeviceTransfer.id: (_) => const RequestDeviceTransfer(), TrackDeviceTransferPage.id: (_) => const TrackDeviceTransferPage(), - SubWorkOrderPage.id: (_) => const SubWorkOrderPage(), + SearchSubWorkOrderPage.id: (_) => const SearchSubWorkOrderPage(), + CreateSubWorkOrderPage.id: (_) => const CreateSubWorkOrderPage(), }, ), ), diff --git a/lib/views/pages/sub_workorder/create_sub_workorder_page.dart b/lib/views/pages/sub_workorder/create_sub_workorder_page.dart new file mode 100644 index 00000000..a0a8889f --- /dev/null +++ b/lib/views/pages/sub_workorder/create_sub_workorder_page.dart @@ -0,0 +1,120 @@ +import 'package:flutter/material.dart'; +import 'package:test_sa/views/app_style/colors.dart'; +import 'package:test_sa/views/pages/sub_workorder/spare_parts_details_bottom_sheet.dart'; +import 'package:test_sa/views/pages/sub_workorder/work_order_details_bottom_sheet.dart'; + +import '../../../controllers/localization/localization.dart'; +import '../../../models/subtitle.dart'; +import '../../widgets/buttons/app_back_button.dart'; +import '../../widgets/buttons/app_button.dart'; + +class CreateSubWorkOrderPage extends StatelessWidget { + static const id = "/CreateSubWorkOrder"; + const CreateSubWorkOrderPage({Key key}) : super(key: key); + + @override + Widget build(BuildContext context) { + final Subtitle subtitle = AppLocalization.of(context).subtitle; + return Scaffold( + body: SafeArea( + child: SingleChildScrollView( + child: Column( + children: [ + Container( + color: AColors.primaryColor, + padding: const EdgeInsets.symmetric(horizontal: 0, vertical: 4), + child: Column( + children: [ + Row( + children: [ + const ABackButton(), + Expanded( + child: Center( + child: Text( + "New Work Order", + style: Theme.of(context).textTheme.headline6.copyWith(color: AColors.white, fontStyle: FontStyle.italic), + ), + ), + ), + const SizedBox( + width: 48, + ) + ], + ), + ], + ), + ), + Padding( + padding: const EdgeInsets.symmetric(horizontal: 8, vertical: 16), + child: Column( + children: [ + const SizedBox(height: 8), + InkWell( + onTap: () { + showModalBottomSheet( + context: context, + useSafeArea: true, + isScrollControlled: true, + backgroundColor: Colors.transparent, + builder: (context) => const WorkOrderDetailsBottomSheet(), + ); + }, + child: Card( + child: ListTile( + title: Row( + children: [ + Text( + "WO Details", + style: Theme.of(context).textTheme.bodyMedium, + ), + const Text("*", style: TextStyle(color: Colors.red)), + ], + ), + trailing: const Icon(Icons.arrow_forward_ios, size: 14, color: AColors.primaryColor), + ), + ), + ), + const SizedBox(height: 8), + InkWell( + onTap: () { + showModalBottomSheet( + context: context, + useSafeArea: true, + isScrollControlled: true, + backgroundColor: Colors.transparent, + builder: (context) => const SparePartsBottomSheet(), + ); + }, + child: Card( + child: ListTile( + title: Row( + children: [ + Text( + "Spare Parts", + style: Theme.of(context).textTheme.bodyMedium, + ), + const Text("*", style: TextStyle(color: Colors.red)), + ], + ), + trailing: const Icon(Icons.arrow_forward_ios, size: 14, color: AColors.primaryColor), + ), + ), + ), + ], + ), + ), + ], + ), + ), + ), + floatingActionButtonLocation: FloatingActionButtonLocation.centerDocked, + floatingActionButton: Padding( + padding: const EdgeInsets.all(16.0), + child: AButton( + text: subtitle.update, + onPressed: () {}, + ), + ), + ); + } +} diff --git a/lib/views/pages/sub_workorder/sub_workorder_page.dart b/lib/views/pages/sub_workorder/search_sub_workorder_page.dart similarity index 95% rename from lib/views/pages/sub_workorder/sub_workorder_page.dart rename to lib/views/pages/sub_workorder/search_sub_workorder_page.dart index 4aeaa1be..e7747ace 100644 --- a/lib/views/pages/sub_workorder/sub_workorder_page.dart +++ b/lib/views/pages/sub_workorder/search_sub_workorder_page.dart @@ -1,7 +1,6 @@ import 'package:flutter/material.dart'; import 'package:fluttertoast/fluttertoast.dart'; import 'package:provider/provider.dart'; -import 'package:test_sa/controllers/providers/api/service_requests_provider.dart'; import 'package:test_sa/models/engineer.dart'; import 'package:test_sa/models/lookup.dart'; import 'package:test_sa/models/service_request/search_work_order.dart'; @@ -11,6 +10,7 @@ import 'package:test_sa/views/widgets/date_and_time/date_picker.dart'; import '../../../controllers/api_routes/http_status_manger.dart'; import '../../../controllers/localization/localization.dart'; +import '../../../controllers/providers/api/service_requests_provider.dart'; import '../../app_style/colors.dart'; import '../../widgets/buttons/app_back_button.dart'; import '../../widgets/buttons/app_button.dart'; @@ -20,15 +20,15 @@ import '../../widgets/status/report/service_report_maintenance_situation.dart'; import '../../widgets/status/report/service_report_visit_date_operator.dart'; import '../../widgets/titles/app_sub_title.dart'; -class SubWorkOrderPage extends StatefulWidget { +class SearchSubWorkOrderPage extends StatefulWidget { static String id = "/SubWorkOrderPage"; - const SubWorkOrderPage({Key key}) : super(key: key); + const SearchSubWorkOrderPage({Key key}) : super(key: key); @override - State createState() => _SubWorkOrderPageState(); + State createState() => _SearchSubWorkOrderPageState(); } -class _SubWorkOrderPageState extends State { +class _SearchSubWorkOrderPageState extends State { final GlobalKey _formKey = GlobalKey(); final SearchWorkOrders _searchWorkOrders = SearchWorkOrders(); Subtitle _subtitle; @@ -55,7 +55,7 @@ class _SubWorkOrderPageState extends State { child: Center( child: Text( "Search Work Order", - style: Theme.of(context).textTheme.headline6.copyWith(color: AColors.white, fontStyle: FontStyle.italic), + style: Theme.of(context).textTheme.titleLarge.copyWith(color: AColors.white, fontStyle: FontStyle.italic), ), ), ), diff --git a/lib/views/pages/sub_workorder/spare_parts_details_bottom_sheet.dart b/lib/views/pages/sub_workorder/spare_parts_details_bottom_sheet.dart new file mode 100644 index 00000000..0af019bf --- /dev/null +++ b/lib/views/pages/sub_workorder/spare_parts_details_bottom_sheet.dart @@ -0,0 +1,130 @@ +import 'package:flutter/material.dart'; +import 'package:test_sa/views/app_style/colors.dart'; + +import '../../../controllers/localization/localization.dart'; +import '../../../models/subtitle.dart'; +import '../../widgets/app_text_form_field.dart'; +import '../../widgets/buttons/app_button.dart'; +import '../../widgets/titles/app_sub_title.dart'; + +class SparePartsBottomSheet extends StatefulWidget { + const SparePartsBottomSheet({Key key}) : super(key: key); + + @override + State createState() => _SparePartsBottomSheetState(); +} + +class _SparePartsBottomSheetState extends State { + final GlobalKey _formKey = GlobalKey(); + @override + Widget build(BuildContext context) { + final size = MediaQuery.of(context).size; + final Subtitle subtitle = AppLocalization.of(context).subtitle; + return Padding( + padding: EdgeInsets.only(bottom: MediaQuery.of(context).viewInsets.bottom), + child: ClipRRect( + borderRadius: const BorderRadius.only( + topLeft: Radius.circular(15), + topRight: Radius.circular(15), + ), + clipBehavior: Clip.antiAliasWithSaveLayer, + child: Container( + color: Colors.white, + height: size.height * 0.9, + padding: const EdgeInsets.symmetric(horizontal: 16, vertical: 20), + child: Form( + key: _formKey, + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + const ASubTitle("Spare Parts"), + const SizedBox(height: 8), + Expanded( + child: Padding( + padding: const EdgeInsets.all(8.0), + child: SingleChildScrollView( + child: SingleChildScrollView( + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + const SizedBox(height: 8), + ListView.builder( + itemCount: 1, + shrinkWrap: true, + physics: const NeverScrollableScrollPhysics(), + itemBuilder: (context, index) => Column( + children: [ + const ATextFormField(labelText: "Part No."), + const SizedBox(height: 8), + const ATextFormField( + labelText: "Description", + hintText: "Add Some Text", + textInputType: TextInputType.multiline, + ), + const SizedBox(height: 8), + const ATextFormField( + labelText: "Quantity", + textInputType: TextInputType.number, + ), + const SizedBox(height: 8), + InkWell( + onTap: () {}, + child: Row( + mainAxisAlignment: MainAxisAlignment.end, + children: [ + const Icon(Icons.delete, color: Colors.red), + Text( + "Remove this part", + style: Theme.of(context).textTheme.bodySmall, + ), + ], + ), + ), + const SizedBox(height: 8), + ], + ), + ), + const Divider(), + const SizedBox(height: 8), + InkWell( + onTap: () {}, + child: Container( + decoration: BoxDecoration( + color: AColors.primaryColor.withOpacity(0.15), + borderRadius: BorderRadius.circular(10), + border: Border.all(color: AColors.primaryColor), + ), + child: ListTile( + title: Text( + "Add Part", + style: Theme.of(context).textTheme.bodyMedium?.copyWith( + color: AColors.primaryColor, + ), + ), + trailing: const Icon( + Icons.add_circle, + color: AColors.primaryColor, + size: 20, + ), + ), + ), + ), + const SizedBox(height: 24), + ], + ), + ), + ), + ), + ), + AButton( + text: subtitle.update, + onPressed: () {}, + ), + ], + ), + ), + ), + ), + ); + } +} diff --git a/lib/views/pages/sub_workorder/work_order_details_bottom_sheet.dart b/lib/views/pages/sub_workorder/work_order_details_bottom_sheet.dart new file mode 100644 index 00000000..718f4348 --- /dev/null +++ b/lib/views/pages/sub_workorder/work_order_details_bottom_sheet.dart @@ -0,0 +1,181 @@ +import 'package:flutter/material.dart'; +import 'package:test_sa/models/subtitle.dart'; +import 'package:test_sa/views/widgets/app_text_form_field.dart'; +import 'package:test_sa/views/widgets/buttons/app_button.dart'; +import 'package:test_sa/views/widgets/status/report/service_report_maintenance_situation.dart'; +import 'package:test_sa/views/widgets/status/report/service_report_repair_location.dart'; + +import '../../../controllers/localization/localization.dart'; +import '../../app_style/sizing.dart'; +import '../../widgets/date_and_time/time_picker.dart'; +import '../../widgets/status/report/service_report_all_users.dart'; +import '../../widgets/titles/app_sub_title.dart'; + +class WorkOrderDetailsBottomSheet extends StatefulWidget { + const WorkOrderDetailsBottomSheet({Key key}) : super(key: key); + + @override + State createState() => _WorkOrderDetailsBottomSheetState(); +} + +class _WorkOrderDetailsBottomSheetState extends State { + final GlobalKey _formKey = GlobalKey(); + @override + Widget build(BuildContext context) { + final size = MediaQuery.of(context).size; + final Subtitle subtitle = AppLocalization.of(context).subtitle; + return Padding( + padding: EdgeInsets.only(bottom: MediaQuery.of(context).viewInsets.bottom), + child: ClipRRect( + borderRadius: const BorderRadius.only( + topLeft: Radius.circular(15), + topRight: Radius.circular(15), + ), + clipBehavior: Clip.antiAliasWithSaveLayer, + child: Container( + color: Colors.white, + height: size.height * 0.9, + padding: const EdgeInsets.symmetric(horizontal: 16, vertical: 20), + child: Form( + key: _formKey, + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + const ASubTitle("WO Details"), + const SizedBox(height: 8), + Expanded( + child: Padding( + padding: const EdgeInsets.all(8.0), + child: SingleChildScrollView( + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + const SizedBox(height: 8), + const ATextFormField(enable: false, hintText: "Assigned Employee: ${123}"), + const SizedBox(height: 8), + const ASubTitle("Assistant Employee"), + const SizedBox(height: 4), + ServiceReportAllUsers( + // initialValue: _searchWorkOrders.assignedEmployee == null ? null : Engineer(id: _searchWorkOrders.assignedEmployee.id, name: _searchWorkOrders.assignedEmployee.name), + onSelect: (engineer) { + // _searchWorkOrders.assignedEmployee = AssignedEmployee(id: engineer.id, name: engineer.name); + }, + ), + const SizedBox(height: 8), + Row( + children: [ + Expanded( + child: Column( + crossAxisAlignment: CrossAxisAlignment.stretch, + children: [ + const ASubTitle("Start of Work"), + SizedBox( + height: 8 * AppStyle.getScaleFactor(context), + ), + ADateTimePicker( + // date: _gasRefillProvider.startDate, + from: DateTime.now().subtract(const Duration(days: 365)), + to: DateTime.now().add(const Duration(days: 365)), + onDateTimePicker: (date) { + // _gasRefillProvider.startDate = date; + // setState(() {}); + }, + ), + ], + ), + ), + const SizedBox(width: 8), + Expanded( + child: Column( + crossAxisAlignment: CrossAxisAlignment.stretch, + children: [ + const ASubTitle("End of Work"), + SizedBox( + height: 8 * AppStyle.getScaleFactor(context), + ), + ADateTimePicker( + // date: _gasRefillProvider.endDate, + from: DateTime.now().subtract(const Duration(days: 365)), + to: DateTime.now().add(const Duration(days: 365)), + onDateTimePicker: (date) { + // _gasRefillProvider.endDate = date; + // setState(() {}); + }, + ), + ], + ), + ), + ], + ), + const SizedBox(height: 8), + ASubTitle(subtitle.workingHours), + const SizedBox(height: 4), + ATextFormField( + initialValue: null, + textAlign: TextAlign.center, + // hintText: _gasRefillProvider.startDate == null + // ? "0" + // : ((_gasRefillProvider.endDate?.difference(_gasRefillProvider.startDate)?.inMinutes ?? 0) / 60)?.toStringAsFixed(2)?.toString() ?? "0", + enable: false, + style: Theme.of(context).textTheme.subtitle1, + // validator: (value) => Validator.isNumeric(value) ? null : _subtitle.requiredWord, + textInputType: TextInputType.number, + onSaved: (value) { + // _serviceReport.workHours = value; + }, + ), + const SizedBox(height: 8), + const ATextFormField( + labelText: "Travel Hours", + ), + const SizedBox(height: 8), + const ATextFormField( + labelText: "Travel Expense", + ), + const SizedBox(height: 8), + ASubTitle(subtitle.callLastSituation), + const SizedBox(height: 4), + ServiceReportMaintenanceSituation( + initialValue: null /*_searchWorkOrders.calllastSituation*/, + onSelect: (status) { + // if (status?.value == 12 || _searchWorkOrders.calllastSituation?.value == 12) { + // _searchWorkOrders.calllastSituation = status; + // setState(() {}); + // } else { + // _searchWorkOrders.calllastSituation = status; + // } + }, + ), + const SizedBox(height: 8), + const ASubTitle("Repair Location"), + const SizedBox(height: 4), + ServiceReportRepairLocation( + // initialValue: _serviceReport.repairLocation, + onSelect: (status) { + // _serviceReport.repairLocation = status; + }, + ), + const SizedBox(height: 8), + const ATextFormField( + labelText: "Technical Comments", + hintText: "Add Some Text", + textInputType: TextInputType.multiline, + ), + const SizedBox(height: 24), + ], + ), + ), + ), + ), + AButton( + text: subtitle.update, + onPressed: () {}, + ), + ], + ), + ), + ), + ), + ); + } +} diff --git a/lib/views/pages/user/land_page.dart b/lib/views/pages/user/land_page.dart index d4a56737..1e90af98 100644 --- a/lib/views/pages/user/land_page.dart +++ b/lib/views/pages/user/land_page.dart @@ -23,7 +23,7 @@ import 'package:test_sa/views/app_style/colors.dart'; import 'package:test_sa/views/app_style/sizing.dart'; import 'package:test_sa/views/pages/device_transfer/request_device_transfer.dart'; import 'package:test_sa/views/pages/device_transfer/track_device_transfer.dart'; -import 'package:test_sa/views/pages/sub_workorder/sub_workorder_page.dart'; +import 'package:test_sa/views/pages/sub_workorder/search_sub_workorder_page.dart'; import 'package:test_sa/views/pages/user/gas_refill/request_gas_refill.dart'; import 'package:test_sa/views/pages/user/gas_refill/track_gas_refill.dart'; import 'package:test_sa/views/pages/user/requests/create_request.dart'; @@ -217,7 +217,7 @@ class _LandPageState extends State { text: "Search Work Order", svgPath: "assets/images/sub_workorder_icon.svg", onPressed: () { - Navigator.of(context).pushNamed(SubWorkOrderPage.id); + Navigator.of(context).pushNamed(SearchSubWorkOrderPage.id); }, ), ], From e2a21040871f9d874213b3a4b8df3a7e832b7624 Mon Sep 17 00:00:00 2001 From: zaid_daoud Date: Mon, 19 Jun 2023 09:52:12 +0300 Subject: [PATCH 085/181] Preparing the functionality [Still doesn't work] --- .../api/service_requests_provider.dart | 6 +-- .../create_sub_workorder_page.dart | 46 +++++++++++++++++-- .../spare_parts_details_bottom_sheet.dart | 33 ++++++++++++- .../work_order_details_bottom_sheet.dart | 35 +++++++++++++- 4 files changed, 111 insertions(+), 9 deletions(-) diff --git a/lib/controllers/providers/api/service_requests_provider.dart b/lib/controllers/providers/api/service_requests_provider.dart index 3334332b..755ffff0 100644 --- a/lib/controllers/providers/api/service_requests_provider.dart +++ b/lib/controllers/providers/api/service_requests_provider.dart @@ -445,10 +445,10 @@ class ServiceRequestsProvider extends ChangeNotifier { } Future updateServiceReport({ - @required String host, - @required User user, @required ServiceReport report, - @required ServiceRequest request, + String host, + User user, + ServiceRequest request, }) async { Response response; //Map body = report.toMap(request); diff --git a/lib/views/pages/sub_workorder/create_sub_workorder_page.dart b/lib/views/pages/sub_workorder/create_sub_workorder_page.dart index a0a8889f..203852b9 100644 --- a/lib/views/pages/sub_workorder/create_sub_workorder_page.dart +++ b/lib/views/pages/sub_workorder/create_sub_workorder_page.dart @@ -1,17 +1,27 @@ import 'package:flutter/material.dart'; +import 'package:fluttertoast/fluttertoast.dart'; +import 'package:provider/provider.dart'; +import 'package:test_sa/controllers/providers/api/service_requests_provider.dart'; import 'package:test_sa/views/app_style/colors.dart'; import 'package:test_sa/views/pages/sub_workorder/spare_parts_details_bottom_sheet.dart'; import 'package:test_sa/views/pages/sub_workorder/work_order_details_bottom_sheet.dart'; +import '../../../controllers/api_routes/http_status_manger.dart'; import '../../../controllers/localization/localization.dart'; import '../../../models/subtitle.dart'; import '../../widgets/buttons/app_back_button.dart'; import '../../widgets/buttons/app_button.dart'; -class CreateSubWorkOrderPage extends StatelessWidget { +class CreateSubWorkOrderPage extends StatefulWidget { static const id = "/CreateSubWorkOrder"; const CreateSubWorkOrderPage({Key key}) : super(key: key); + @override + State createState() => _CreateSubWorkOrderPageState(); +} + +class _CreateSubWorkOrderPageState extends State { + final GlobalKey _formKey = GlobalKey(); @override Widget build(BuildContext context) { final Subtitle subtitle = AppLocalization.of(context).subtitle; @@ -111,8 +121,38 @@ class CreateSubWorkOrderPage extends StatelessWidget { floatingActionButton: Padding( padding: const EdgeInsets.all(16.0), child: AButton( - text: subtitle.update, - onPressed: () {}, + text: subtitle.create, + onPressed: () async { + // validate = true; + // if (!_formKey.currentState.validate()) { + // setState(() {}); + // return; + // } + // if (!_serviceReport.validate()) return; + _formKey.currentState.save(); + + // _isLoading = true; + setState(() {}); + + int status = await Provider.of(context).createServiceReport( + // user: _userProvider.user, + // host: _settingProvider.host, + // report: _serviceReport, + // request: widget.request, + ); + // _isLoading = false; + setState(() {}); + if (status >= 200 && status < 300) { + Fluttertoast.showToast(msg: subtitle.requestCompleteSuccessfully); + Navigator.of(context).pop(); + Navigator.of(context).pop(); + } else { + String errorMessage = HttpStatusManger.getStatusMessage(status: status, subtitle: subtitle); + ScaffoldMessenger.of(context).showSnackBar(SnackBar( + content: Text(errorMessage), + )); + } + }, ), ), ); diff --git a/lib/views/pages/sub_workorder/spare_parts_details_bottom_sheet.dart b/lib/views/pages/sub_workorder/spare_parts_details_bottom_sheet.dart index 0af019bf..a1a7887a 100644 --- a/lib/views/pages/sub_workorder/spare_parts_details_bottom_sheet.dart +++ b/lib/views/pages/sub_workorder/spare_parts_details_bottom_sheet.dart @@ -1,7 +1,12 @@ import 'package:flutter/material.dart'; +import 'package:fluttertoast/fluttertoast.dart'; +import 'package:provider/provider.dart'; import 'package:test_sa/views/app_style/colors.dart'; +import '../../../controllers/api_routes/http_status_manger.dart'; import '../../../controllers/localization/localization.dart'; +import '../../../controllers/providers/api/service_requests_provider.dart'; +import '../../../models/service_report.dart'; import '../../../models/subtitle.dart'; import '../../widgets/app_text_form_field.dart'; import '../../widgets/buttons/app_button.dart'; @@ -118,7 +123,33 @@ class _SparePartsBottomSheetState extends State { ), AButton( text: subtitle.update, - onPressed: () {}, + onPressed: () async { + // _validate = true; + if (!_formKey.currentState.validate()) { + setState(() {}); + return; + } + // if (!_serviceReport.validate()) { + // setState(() {}); + // return; + // } + _formKey.currentState.save(); + + // _isLoading = true; + setState(() {}); + + int status = await Provider.of(context).updateServiceReport(report: ServiceReport()); + // _isLoading = false; + setState(() {}); + if (status >= 200 && status < 300) { + Fluttertoast.showToast(msg: subtitle.requestCompleteSuccessfully); + Navigator.of(context).pop(); + // Navigator.of(context).pop(); + } else { + String errorMessage = HttpStatusManger.getStatusMessage(status: status, subtitle: subtitle); + ScaffoldMessenger.of(context).showSnackBar(SnackBar(content: Text(errorMessage))); + } + }, ), ], ), diff --git a/lib/views/pages/sub_workorder/work_order_details_bottom_sheet.dart b/lib/views/pages/sub_workorder/work_order_details_bottom_sheet.dart index 718f4348..1efa95ba 100644 --- a/lib/views/pages/sub_workorder/work_order_details_bottom_sheet.dart +++ b/lib/views/pages/sub_workorder/work_order_details_bottom_sheet.dart @@ -1,11 +1,16 @@ import 'package:flutter/material.dart'; +import 'package:fluttertoast/fluttertoast.dart'; +import 'package:provider/provider.dart'; +import 'package:test_sa/controllers/providers/api/service_requests_provider.dart'; import 'package:test_sa/models/subtitle.dart'; import 'package:test_sa/views/widgets/app_text_form_field.dart'; import 'package:test_sa/views/widgets/buttons/app_button.dart'; import 'package:test_sa/views/widgets/status/report/service_report_maintenance_situation.dart'; import 'package:test_sa/views/widgets/status/report/service_report_repair_location.dart'; +import '../../../controllers/api_routes/http_status_manger.dart'; import '../../../controllers/localization/localization.dart'; +import '../../../models/service_report.dart'; import '../../app_style/sizing.dart'; import '../../widgets/date_and_time/time_picker.dart'; import '../../widgets/status/report/service_report_all_users.dart'; @@ -117,7 +122,7 @@ class _WorkOrderDetailsBottomSheetState extends State Validator.isNumeric(value) ? null : _subtitle.requiredWord, textInputType: TextInputType.number, onSaved: (value) { @@ -169,7 +174,33 @@ class _WorkOrderDetailsBottomSheetState extends State(context).updateServiceReport(report: ServiceReport()); + // _isLoading = false; + setState(() {}); + if (status >= 200 && status < 300) { + Fluttertoast.showToast(msg: subtitle.requestCompleteSuccessfully); + Navigator.of(context).pop(); + // Navigator.of(context).pop(); + } else { + String errorMessage = HttpStatusManger.getStatusMessage(status: status, subtitle: subtitle); + ScaffoldMessenger.of(context).showSnackBar(SnackBar(content: Text(errorMessage))); + } + }, ), ], ), From 4fac73cd67e26a2015239e29497d77631ca65c2f Mon Sep 17 00:00:00 2001 From: zaid_daoud Date: Mon, 19 Jun 2023 10:49:52 +0300 Subject: [PATCH 086/181] Preparing the functionality [Still doesn't work] --- .../service_request/search_work_order.dart | 8 ++ .../create_sub_workorder_page.dart | 8 +- .../search_sub_workorder_page.dart | 16 +++- .../spare_parts_details_bottom_sheet.dart | 88 +++++++++++-------- .../work_order_details_bottom_sheet.dart | 86 ++++++++++++------ 5 files changed, 133 insertions(+), 73 deletions(-) diff --git a/lib/models/service_request/search_work_order.dart b/lib/models/service_request/search_work_order.dart index 713e9125..0fc6907b 100644 --- a/lib/models/service_request/search_work_order.dart +++ b/lib/models/service_request/search_work_order.dart @@ -10,6 +10,8 @@ class SearchWorkOrders { String assetType; AssignedEmployee assignedEmployee; String visitDate; + String startDate; + String endDate; List assistantEmployees; String supplier; String vendorTicketNumber; @@ -44,6 +46,8 @@ class SearchWorkOrders { this.assetType, this.assignedEmployee, this.visitDate, + this.startDate, + this.endDate, this.assistantEmployees, this.supplier, this.vendorTicketNumber, @@ -79,6 +83,8 @@ class SearchWorkOrders { assetType = json['assetType']; assignedEmployee = json['assignedEmployee'] != null ? new AssignedEmployee.fromJson(json['assignedEmployee']) : AssignedEmployee(); visitDate = json['visitDate']; + startDate = json['startDate']; + endDate = json['endDate']; if (json['assistantEmployees'] != null) { assistantEmployees = json['assistantEmployees']; } @@ -127,6 +133,8 @@ class SearchWorkOrders { data['assignedEmployee'] = this.assignedEmployee.toJson(); } data['visitDate'] = this.visitDate; + data['startDate'] = this.startDate; + data['endDate'] = this.endDate; if (this.assistantEmployees != null) { data['assistantEmployees'] = this.assistantEmployees.map((v) => v.toJson()).toList(); } diff --git a/lib/views/pages/sub_workorder/create_sub_workorder_page.dart b/lib/views/pages/sub_workorder/create_sub_workorder_page.dart index 203852b9..1619e536 100644 --- a/lib/views/pages/sub_workorder/create_sub_workorder_page.dart +++ b/lib/views/pages/sub_workorder/create_sub_workorder_page.dart @@ -2,6 +2,7 @@ import 'package:flutter/material.dart'; import 'package:fluttertoast/fluttertoast.dart'; import 'package:provider/provider.dart'; import 'package:test_sa/controllers/providers/api/service_requests_provider.dart'; +import 'package:test_sa/models/service_request/search_work_order.dart'; import 'package:test_sa/views/app_style/colors.dart'; import 'package:test_sa/views/pages/sub_workorder/spare_parts_details_bottom_sheet.dart'; import 'package:test_sa/views/pages/sub_workorder/work_order_details_bottom_sheet.dart'; @@ -14,7 +15,8 @@ import '../../widgets/buttons/app_button.dart'; class CreateSubWorkOrderPage extends StatefulWidget { static const id = "/CreateSubWorkOrder"; - const CreateSubWorkOrderPage({Key key}) : super(key: key); + final SearchWorkOrders workOrder; + const CreateSubWorkOrderPage({this.workOrder, Key key}) : super(key: key); @override State createState() => _CreateSubWorkOrderPageState(); @@ -66,7 +68,7 @@ class _CreateSubWorkOrderPageState extends State { useSafeArea: true, isScrollControlled: true, backgroundColor: Colors.transparent, - builder: (context) => const WorkOrderDetailsBottomSheet(), + builder: (context) => WorkOrderDetailsBottomSheet(workOrder: widget.workOrder), ); }, child: Card( @@ -92,7 +94,7 @@ class _CreateSubWorkOrderPageState extends State { useSafeArea: true, isScrollControlled: true, backgroundColor: Colors.transparent, - builder: (context) => const SparePartsBottomSheet(), + builder: (context) => SparePartsBottomSheet(workOrder: widget.workOrder), ); }, child: Card( diff --git a/lib/views/pages/sub_workorder/search_sub_workorder_page.dart b/lib/views/pages/sub_workorder/search_sub_workorder_page.dart index e7747ace..6e9ae74a 100644 --- a/lib/views/pages/sub_workorder/search_sub_workorder_page.dart +++ b/lib/views/pages/sub_workorder/search_sub_workorder_page.dart @@ -5,6 +5,7 @@ import 'package:test_sa/models/engineer.dart'; import 'package:test_sa/models/lookup.dart'; import 'package:test_sa/models/service_request/search_work_order.dart'; import 'package:test_sa/models/subtitle.dart'; +import 'package:test_sa/views/pages/sub_workorder/create_sub_workorder_page.dart'; import 'package:test_sa/views/widgets/app_text_form_field.dart'; import 'package:test_sa/views/widgets/date_and_time/date_picker.dart'; @@ -14,7 +15,6 @@ import '../../../controllers/providers/api/service_requests_provider.dart'; import '../../app_style/colors.dart'; import '../../widgets/buttons/app_back_button.dart'; import '../../widgets/buttons/app_button.dart'; -import '../../widgets/loaders/app_loading.dart'; import '../../widgets/status/report/service_report_all_users.dart'; import '../../widgets/status/report/service_report_maintenance_situation.dart'; import '../../widgets/status/report/service_report_visit_date_operator.dart'; @@ -160,7 +160,7 @@ class _SearchSubWorkOrderPageState extends State { ), floatingActionButtonLocation: FloatingActionButtonLocation.centerFloat, floatingActionButton: _isLoading - ? const ALoading() + ? const CircularProgressIndicator() : Padding( padding: const EdgeInsets.symmetric(horizontal: 16), child: AButton( @@ -188,8 +188,16 @@ class _SearchSubWorkOrderPageState extends State { body: ListView.builder( itemCount: woList.length, shrinkWrap: true, - itemBuilder: (context, index) => Text( - woList[index].id?.toString(), + itemBuilder: (context, index) => InkWell( + onTap: () { + Navigator.push( + context, + MaterialPageRoute(builder: (context) => CreateSubWorkOrderPage(workOrder: woList[index])), + ); + }, + child: Text( + woList[index].id?.toString(), + ), ), ), ), diff --git a/lib/views/pages/sub_workorder/spare_parts_details_bottom_sheet.dart b/lib/views/pages/sub_workorder/spare_parts_details_bottom_sheet.dart index a1a7887a..048a6158 100644 --- a/lib/views/pages/sub_workorder/spare_parts_details_bottom_sheet.dart +++ b/lib/views/pages/sub_workorder/spare_parts_details_bottom_sheet.dart @@ -1,6 +1,7 @@ import 'package:flutter/material.dart'; import 'package:fluttertoast/fluttertoast.dart'; import 'package:provider/provider.dart'; +import 'package:test_sa/models/service_request/search_work_order.dart'; import 'package:test_sa/views/app_style/colors.dart'; import '../../../controllers/api_routes/http_status_manger.dart'; @@ -13,7 +14,8 @@ import '../../widgets/buttons/app_button.dart'; import '../../widgets/titles/app_sub_title.dart'; class SparePartsBottomSheet extends StatefulWidget { - const SparePartsBottomSheet({Key key}) : super(key: key); + final SearchWorkOrders workOrder; + const SparePartsBottomSheet({this.workOrder, Key key}) : super(key: key); @override State createState() => _SparePartsBottomSheetState(); @@ -21,6 +23,14 @@ class SparePartsBottomSheet extends StatefulWidget { class _SparePartsBottomSheetState extends State { final GlobalKey _formKey = GlobalKey(); + SearchWorkOrders _workOrder; + bool _isLoading = false; + @override + void initState() { + super.initState(); + _workOrder = widget.workOrder; + } + @override Widget build(BuildContext context) { final size = MediaQuery.of(context).size; @@ -53,42 +63,46 @@ class _SparePartsBottomSheetState extends State { crossAxisAlignment: CrossAxisAlignment.start, children: [ const SizedBox(height: 8), - ListView.builder( - itemCount: 1, - shrinkWrap: true, - physics: const NeverScrollableScrollPhysics(), - itemBuilder: (context, index) => Column( - children: [ - const ATextFormField(labelText: "Part No."), - const SizedBox(height: 8), - const ATextFormField( - labelText: "Description", - hintText: "Add Some Text", - textInputType: TextInputType.multiline, - ), - const SizedBox(height: 8), - const ATextFormField( - labelText: "Quantity", - textInputType: TextInputType.number, - ), - const SizedBox(height: 8), - InkWell( - onTap: () {}, - child: Row( - mainAxisAlignment: MainAxisAlignment.end, - children: [ - const Icon(Icons.delete, color: Colors.red), - Text( - "Remove this part", - style: Theme.of(context).textTheme.bodySmall, + if (_workOrder.sparePartsWorkOrders?.length != null) + ListView.builder( + itemCount: _workOrder.sparePartsWorkOrders?.length, + shrinkWrap: true, + physics: const NeverScrollableScrollPhysics(), + itemBuilder: (context, index) { + final wo = _workOrder.sparePartsWorkOrders[index]; + return Column( + children: [ + const ATextFormField(labelText: "Part No."), + const SizedBox(height: 8), + const ATextFormField( + labelText: "Description", + hintText: "Add Some Text", + textInputType: TextInputType.multiline, + ), + const SizedBox(height: 8), + const ATextFormField( + labelText: "Quantity", + textInputType: TextInputType.number, + ), + const SizedBox(height: 8), + InkWell( + onTap: () {}, + child: Row( + mainAxisAlignment: MainAxisAlignment.end, + children: [ + const Icon(Icons.delete, color: Colors.red), + Text( + "Remove this part", + style: Theme.of(context).textTheme.bodySmall, + ), + ], ), - ], - ), - ), - const SizedBox(height: 8), - ], + ), + const SizedBox(height: 8), + ], + ); + }, ), - ), const Divider(), const SizedBox(height: 8), InkWell( @@ -135,11 +149,11 @@ class _SparePartsBottomSheetState extends State { // } _formKey.currentState.save(); - // _isLoading = true; + _isLoading = true; setState(() {}); int status = await Provider.of(context).updateServiceReport(report: ServiceReport()); - // _isLoading = false; + _isLoading = false; setState(() {}); if (status >= 200 && status < 300) { Fluttertoast.showToast(msg: subtitle.requestCompleteSuccessfully); diff --git a/lib/views/pages/sub_workorder/work_order_details_bottom_sheet.dart b/lib/views/pages/sub_workorder/work_order_details_bottom_sheet.dart index 1efa95ba..12df4c57 100644 --- a/lib/views/pages/sub_workorder/work_order_details_bottom_sheet.dart +++ b/lib/views/pages/sub_workorder/work_order_details_bottom_sheet.dart @@ -2,6 +2,8 @@ import 'package:flutter/material.dart'; import 'package:fluttertoast/fluttertoast.dart'; import 'package:provider/provider.dart'; import 'package:test_sa/controllers/providers/api/service_requests_provider.dart'; +import 'package:test_sa/models/lookup.dart'; +import 'package:test_sa/models/service_request/search_work_order.dart'; import 'package:test_sa/models/subtitle.dart'; import 'package:test_sa/views/widgets/app_text_form_field.dart'; import 'package:test_sa/views/widgets/buttons/app_button.dart'; @@ -10,6 +12,7 @@ import 'package:test_sa/views/widgets/status/report/service_report_repair_locati import '../../../controllers/api_routes/http_status_manger.dart'; import '../../../controllers/localization/localization.dart'; +import '../../../models/engineer.dart'; import '../../../models/service_report.dart'; import '../../app_style/sizing.dart'; import '../../widgets/date_and_time/time_picker.dart'; @@ -17,7 +20,8 @@ import '../../widgets/status/report/service_report_all_users.dart'; import '../../widgets/titles/app_sub_title.dart'; class WorkOrderDetailsBottomSheet extends StatefulWidget { - const WorkOrderDetailsBottomSheet({Key key}) : super(key: key); + final SearchWorkOrders workOrder; + const WorkOrderDetailsBottomSheet({this.workOrder, Key key}) : super(key: key); @override State createState() => _WorkOrderDetailsBottomSheetState(); @@ -25,6 +29,15 @@ class WorkOrderDetailsBottomSheet extends StatefulWidget { class _WorkOrderDetailsBottomSheetState extends State { final GlobalKey _formKey = GlobalKey(); + SearchWorkOrders _workOrder; + bool _isLoading = false; + + @override + void initState() { + super.initState(); + _workOrder = widget.workOrder; + } + @override Widget build(BuildContext context) { final size = MediaQuery.of(context).size; @@ -56,14 +69,16 @@ class _WorkOrderDetailsBottomSheetState extends State Validator.isNumeric(value) ? null : _subtitle.requiredWord, textInputType: TextInputType.number, onSaved: (value) { - // _serviceReport.workHours = value; + _workOrder.workingHours = double.tryParse(value); }, ), const SizedBox(height: 8), - const ATextFormField( + ATextFormField( labelText: "Travel Hours", + initialValue: _workOrder.travelingHours?.toString(), + textInputType: TextInputType.number, + onSaved: (value) { + _workOrder.travelingHours = num.tryParse(value); + }, ), const SizedBox(height: 8), - const ATextFormField( + ATextFormField( labelText: "Travel Expense", + initialValue: _workOrder.travelingExpenses?.toString(), + textInputType: TextInputType.number, + onSaved: (value) { + _workOrder.travelingExpenses = num.tryParse(value); + }, ), const SizedBox(height: 8), ASubTitle(subtitle.callLastSituation), const SizedBox(height: 4), ServiceReportMaintenanceSituation( - initialValue: null /*_searchWorkOrders.calllastSituation*/, + initialValue: _workOrder.calllastSituation, onSelect: (status) { - // if (status?.value == 12 || _searchWorkOrders.calllastSituation?.value == 12) { - // _searchWorkOrders.calllastSituation = status; - // setState(() {}); - // } else { - // _searchWorkOrders.calllastSituation = status; - // } + if (status?.value == 12 || _workOrder.calllastSituation?.value == 12) { + _workOrder.calllastSituation = status; + setState(() {}); + } else { + _workOrder.calllastSituation = status; + } }, ), const SizedBox(height: 8), const ASubTitle("Repair Location"), const SizedBox(height: 4), ServiceReportRepairLocation( - // initialValue: _serviceReport.repairLocation, + initialValue: _workOrder.repairLocation != null ? Lookup(name: _workOrder.repairLocation) : null, onSelect: (status) { - // _serviceReport.repairLocation = status; + _workOrder.repairLocation = status.name; }, ), const SizedBox(height: 8), - const ATextFormField( + ATextFormField( labelText: "Technical Comments", - hintText: "Add Some Text", + initialValue: _workOrder.reviewComment, textInputType: TextInputType.multiline, + onSaved: (value) { + _workOrder.reviewComment = value; + }, ), const SizedBox(height: 24), ], @@ -186,11 +214,11 @@ class _WorkOrderDetailsBottomSheetState extends State(context).updateServiceReport(report: ServiceReport()); - // _isLoading = false; + _isLoading = false; setState(() {}); if (status >= 200 && status < 300) { Fluttertoast.showToast(msg: subtitle.requestCompleteSuccessfully); From 8646b8f1e9b4e4eadcf0562a001cf1b3b0e3b59a Mon Sep 17 00:00:00 2001 From: nextwo <1234> Date: Mon, 19 Jun 2023 12:12:33 +0300 Subject: [PATCH 087/181] work order --- .../sub_workorder/sub_workorder_page.dart | 39 +++++-- .../sub_workorder/workorder_details.dart | 63 +++++++++++ .../pages/sub_workorder/workorder_item.dart | 106 ++++++++++++++++++ .../pages/sub_workorder/workorder_list.dart | 40 +++++++ .../pages/sub_workorder/workorder_update.dart | 66 +++++++++++ 5 files changed, 307 insertions(+), 7 deletions(-) create mode 100644 lib/views/pages/sub_workorder/workorder_details.dart create mode 100644 lib/views/pages/sub_workorder/workorder_item.dart create mode 100644 lib/views/pages/sub_workorder/workorder_list.dart create mode 100644 lib/views/pages/sub_workorder/workorder_update.dart diff --git a/lib/views/pages/sub_workorder/sub_workorder_page.dart b/lib/views/pages/sub_workorder/sub_workorder_page.dart index 4aeaa1be..a935b9d2 100644 --- a/lib/views/pages/sub_workorder/sub_workorder_page.dart +++ b/lib/views/pages/sub_workorder/sub_workorder_page.dart @@ -6,6 +6,7 @@ import 'package:test_sa/models/engineer.dart'; import 'package:test_sa/models/lookup.dart'; import 'package:test_sa/models/service_request/search_work_order.dart'; import 'package:test_sa/models/subtitle.dart'; +import 'package:test_sa/views/pages/sub_workorder/workorder_list.dart'; import 'package:test_sa/views/widgets/app_text_form_field.dart'; import 'package:test_sa/views/widgets/date_and_time/date_picker.dart'; @@ -185,13 +186,37 @@ class _SubWorkOrderPageState extends State { context, MaterialPageRoute( builder: (context) => Scaffold( - body: ListView.builder( - itemCount: woList.length, - shrinkWrap: true, - itemBuilder: (context, index) => Text( - woList[index].id?.toString(), - ), - ), + body: SafeArea( + child: Column( + children: [ + Container( + color: AColors.primaryColor, + padding: const EdgeInsets.symmetric(horizontal: 0, vertical: 4), + child: Column( + children: [ + Row( + children: [ + ABackButton(), + Expanded( + child: Center( + child: Text( + "Work Order List", + style: Theme.of(context).textTheme.headline6.copyWith(color: AColors.white, fontStyle: FontStyle.italic), + ), + ), + ), + const SizedBox( + width: 48, + ) + ], + ), + ], + ), + ), + Expanded(child: WorkOrderList(items: woList, nextPage: true, onLazyLoad: (){}, )), + ], + ), + ) ), ), ); diff --git a/lib/views/pages/sub_workorder/workorder_details.dart b/lib/views/pages/sub_workorder/workorder_details.dart new file mode 100644 index 00000000..1d6fb311 --- /dev/null +++ b/lib/views/pages/sub_workorder/workorder_details.dart @@ -0,0 +1,63 @@ +import 'package:flutter/material.dart'; + +import '../../../models/service_request/search_work_order.dart'; +import '../../app_style/colors.dart'; +import '../../app_style/sizing.dart'; + +class WorkOrderDetails extends StatelessWidget { + final SearchWorkOrders item; + const WorkOrderDetails({@required this.item,Key key}) : super(key: key); + + @override + Widget build(BuildContext context) { + return Column( + children: [ + Container( + padding: EdgeInsets.all(10), + margin: EdgeInsets.all(10), + decoration: BoxDecoration( + color: AColors.inputFieldBackgroundColor, + border: Border.all( + color: Color(0xffefefef), + ), + borderRadius: BorderRadius.circular(AppStyle.borderRadius * AppStyle.getScaleFactor(context)), + // boxShadow: const [ + // AppStyle.boxShadow + // ] + ), + child: Column( + children: [ + _buildRow("call id", "", context), + _buildRow("call id", "", context), + _buildRow("call id", "", context), + _buildRow("call id", "", context), + _buildRow("call id", "", context), + _buildRow("call id", "", context), + _buildRow("call id", "", context), + _buildRow("call id", "", context), + _buildRow("call id", "", context), + ], + ), + ), + Container(child: _buildRow("call id", "", context),) + ], + ); + } + Widget _buildRow(String title, String value, BuildContext context){ + return Row( + children: [ + Expanded( + child: Text( + "Call Id", + style: Theme.of(context).textTheme.subtitle2.copyWith(), + ), + ), + //if (item.clientName != null) + Text( + '', + style: Theme.of(context).textTheme.subtitle2.copyWith(), + ), + ], + ); + } +} diff --git a/lib/views/pages/sub_workorder/workorder_item.dart b/lib/views/pages/sub_workorder/workorder_item.dart new file mode 100644 index 00000000..a6e2c706 --- /dev/null +++ b/lib/views/pages/sub_workorder/workorder_item.dart @@ -0,0 +1,106 @@ +import 'package:flutter/cupertino.dart'; +import 'package:flutter/material.dart'; +import 'package:test_sa/controllers/localization/localization.dart'; +import 'package:test_sa/models/subtitle.dart'; +import 'package:test_sa/views/app_style/colors.dart'; +import 'package:test_sa/views/app_style/sizing.dart'; +import 'package:test_sa/views/widgets/requests/request_status.dart'; + +import '../../../models/service_request/search_work_order.dart'; + +class WorkOrderItem extends StatelessWidget { + final int index; + final SearchWorkOrders item; + final Function(SearchWorkOrders) onPressed; + const WorkOrderItem({Key key, this.item, this.onPressed, this.index}) : super(key: key); + + @override + Widget build(BuildContext context) { + Subtitle _subtitle = AppLocalization.of(context).subtitle; + Color itemColor = index % 2 == 0 ? Theme.of(context).colorScheme.primary : Theme.of(context).colorScheme.onPrimary; + Color onItemColor = index % 2 != 0 ? Theme.of(context).colorScheme.primary : Theme.of(context).colorScheme.onPrimary; + + return Padding( + padding: const EdgeInsets.symmetric(vertical: 4), + child: ElevatedButton( + style: ElevatedButton.styleFrom( + padding: EdgeInsets.symmetric(vertical: 8, horizontal: 8), + backgroundColor: itemColor, + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(AppStyle.getBorderRadius(context)), + ), + ), + onPressed: () { + onPressed(item); + }, + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Row( + children: [ + Expanded( + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text( + item.callRequest.callNo ?? "-----", + style: Theme.of(context).textTheme.headline6.copyWith(color: onItemColor, fontSize: 16, fontWeight: FontWeight.bold), + ), + Text( + item.callRequest.asset.id.toString(), + style: Theme.of(context).textTheme.subtitle2.copyWith( + color: onItemColor, + ), + ), + Row( + children: [ + Expanded( + child: Text( + _subtitle.assetName, + style: Theme.of(context).textTheme.subtitle2.copyWith( + color: onItemColor, + ), + ), + ), + //if (item.clientName != null) + Text( + item.callRequest.asset.assetNumber, + style: Theme.of(context).textTheme.subtitle2.copyWith( + color: onItemColor, + ), + ), + ], + ), + Text( + item.calllastSituation.name, + style: Theme.of(context).textTheme.subtitle2.copyWith( + color: onItemColor, + ), + ), + Divider( + color: onItemColor, + ), + Row( + children: [ + Expanded( + child: Text( + _subtitle.status, + style: Theme.of(context).textTheme.subtitle2.copyWith( + color: onItemColor, + ), + ), + ), + if (item.callRequest.status?.id != null) StatusLabel(label: item.callRequest.status.name, color: AColors.getGasStatusColor(item.callRequest.status.id)), + ], + ), + ], + ), + ), + ], + ), + ], + ), + ), + ); + } +} diff --git a/lib/views/pages/sub_workorder/workorder_list.dart b/lib/views/pages/sub_workorder/workorder_list.dart new file mode 100644 index 00000000..5754678c --- /dev/null +++ b/lib/views/pages/sub_workorder/workorder_list.dart @@ -0,0 +1,40 @@ +import 'package:flutter/material.dart'; +import 'package:test_sa/views/pages/sub_workorder/workorder_update.dart'; +import 'package:test_sa/views/pages/sub_workorder/workorder_item.dart'; + +import '../../../controllers/localization/localization.dart'; +import '../../../models/service_request/search_work_order.dart'; +import '../../../models/subtitle.dart'; +import '../../widgets/loaders/lazy_loading.dart'; +import '../../widgets/loaders/no_item_found.dart'; + +class WorkOrderList extends StatelessWidget { + final List items; + final bool nextPage; + final Future Function() onLazyLoad; + WorkOrderList({Key key, this.items, this.nextPage, this.onLazyLoad}) : super(key: key); + + @override + Widget build(BuildContext context) { + + if (items.length == 0) { + Subtitle subtitle = AppLocalization.of(context).subtitle; + return NoItemFound( + message: subtitle.noServiceRequestFound, + ); + } + return LazyLoading( + nextPage: nextPage, + onLazyLoad: onLazyLoad, + child: ListView.builder( + itemCount: items.length, + padding: const EdgeInsets.symmetric(horizontal: 16, vertical: 8), + itemBuilder: (context, itemIndex) { + return WorkOrderItem(index: itemIndex, onPressed: (model){ + Navigator.of(context).push(MaterialPageRoute( + builder: (_) => WorkOrderUpdate(item: model,))); + }, item: items[itemIndex], ); + }), + ); + } +} diff --git a/lib/views/pages/sub_workorder/workorder_update.dart b/lib/views/pages/sub_workorder/workorder_update.dart new file mode 100644 index 00000000..71f589c5 --- /dev/null +++ b/lib/views/pages/sub_workorder/workorder_update.dart @@ -0,0 +1,66 @@ +import 'package:flutter/material.dart'; +import 'package:test_sa/views/pages/sub_workorder/workorder_details.dart'; + +import '../../../controllers/localization/localization.dart'; +import '../../../models/service_request/search_work_order.dart'; +import '../../../models/subtitle.dart'; +import '../../app_style/colors.dart'; +import '../../widgets/buttons/app_back_button.dart'; +import '../../widgets/loaders/loading_manager.dart'; + +class WorkOrderUpdate extends StatefulWidget { + final SearchWorkOrders item; + + const WorkOrderUpdate({@required this.item,Key key}) : super(key: key); + + @override + State createState() => _WorkOrderUpdateState(); +} + +class _WorkOrderUpdateState extends State { + final GlobalKey _formKey = GlobalKey(); + Subtitle _subtitle; + bool _isLoading = false; + + @override + Widget build(BuildContext context) { + _subtitle = AppLocalization.of(context).subtitle; + + return Scaffold( + body: SafeArea( + child: Form( + key: _formKey, + child: LoadingManager( + isLoading: _isLoading, + isFailedLoading: false, + stateCode: 200, + onRefresh: () async {}, + child: Column( + children: [ + Container( + color: Theme.of(context).colorScheme.primary, + padding: const EdgeInsets.symmetric(horizontal: 0, vertical: 4), + child: Row( + children: [ + const ABackButton(), + Expanded( + child: Center( + child: Text( + "Work Order", + style: Theme.of(context).textTheme.headline6.copyWith(color: AColors.white, fontStyle: FontStyle.italic), + ), + ), + ), + const SizedBox(width: 58), + ], + ), + ), + WorkOrderDetails(item: widget.item,) + ], + ), + ), + ), + ), + ); + } +} From b8ea1ab030fcde47c9c1e79a1331379e5e59a7f5 Mon Sep 17 00:00:00 2001 From: nextwo <1234> Date: Mon, 19 Jun 2023 13:22:32 +0300 Subject: [PATCH 088/181] work order --- .../create_sub_workorder_page.dart | 32 +++++++++++++++++++ .../search_sub_workorder_page.dart | 1 + .../sub_workorder/workorder_details.dart | 12 +++++-- .../pages/sub_workorder/workorder_list.dart | 9 ++++-- 4 files changed, 50 insertions(+), 4 deletions(-) diff --git a/lib/views/pages/sub_workorder/create_sub_workorder_page.dart b/lib/views/pages/sub_workorder/create_sub_workorder_page.dart index 1619e536..bbf8d7cf 100644 --- a/lib/views/pages/sub_workorder/create_sub_workorder_page.dart +++ b/lib/views/pages/sub_workorder/create_sub_workorder_page.dart @@ -6,12 +6,17 @@ import 'package:test_sa/models/service_request/search_work_order.dart'; import 'package:test_sa/views/app_style/colors.dart'; import 'package:test_sa/views/pages/sub_workorder/spare_parts_details_bottom_sheet.dart'; import 'package:test_sa/views/pages/sub_workorder/work_order_details_bottom_sheet.dart'; +import 'package:test_sa/views/pages/sub_workorder/workorder_details.dart'; import '../../../controllers/api_routes/http_status_manger.dart'; import '../../../controllers/localization/localization.dart'; import '../../../models/subtitle.dart'; import '../../widgets/buttons/app_back_button.dart'; import '../../widgets/buttons/app_button.dart'; +import '../../widgets/date_and_time/date_picker.dart'; +import '../../widgets/status/report/service_report_equipment_status.dart'; +import '../../widgets/status/report/service_report_reasons.dart'; +import '../../widgets/titles/app_sub_title.dart'; class CreateSubWorkOrderPage extends StatefulWidget { static const id = "/CreateSubWorkOrder"; @@ -32,6 +37,32 @@ class _CreateSubWorkOrderPageState extends State { child: SingleChildScrollView( child: Column( children: [ + // ServiceReportEquipmentStatusMenu( + // report: _serviceReport, + // request: widget.request, + // onSelect: (status) { + // _serviceReport.equipmentStatus = status; + // }, + // ), + // ADatePicker( + // // date: _from, + // // from: DateTime(1950), + // onDatePicker: (date) { + // // _from = date; + // // setState(() {}); + // // widget.onPickFrom(date); + // }, + // ), + // ASubTitle("_subtitle.reasons"), + // const SizedBox( + // height: 4, + // ), + // ServiceReportReasonsMenu( + // initialValue: _serviceReport.reason, + // onSelect: (status) { + // _serviceReport.reason = status; + // }, + // ), Container( color: AColors.primaryColor, padding: const EdgeInsets.symmetric(horizontal: 0, vertical: 4), @@ -60,6 +91,7 @@ class _CreateSubWorkOrderPageState extends State { padding: const EdgeInsets.symmetric(horizontal: 8, vertical: 16), child: Column( children: [ + WorkOrderDetails(), const SizedBox(height: 8), InkWell( onTap: () { diff --git a/lib/views/pages/sub_workorder/search_sub_workorder_page.dart b/lib/views/pages/sub_workorder/search_sub_workorder_page.dart index 8595bf45..f23c6364 100644 --- a/lib/views/pages/sub_workorder/search_sub_workorder_page.dart +++ b/lib/views/pages/sub_workorder/search_sub_workorder_page.dart @@ -6,6 +6,7 @@ import 'package:test_sa/models/engineer.dart'; import 'package:test_sa/models/lookup.dart'; import 'package:test_sa/models/service_request/search_work_order.dart'; import 'package:test_sa/models/subtitle.dart'; +import 'package:test_sa/views/pages/sub_workorder/workorder_list.dart'; import 'package:test_sa/views/widgets/app_text_form_field.dart'; import 'package:test_sa/views/widgets/date_and_time/date_picker.dart'; diff --git a/lib/views/pages/sub_workorder/workorder_details.dart b/lib/views/pages/sub_workorder/workorder_details.dart index 1d6fb311..23467b4a 100644 --- a/lib/views/pages/sub_workorder/workorder_details.dart +++ b/lib/views/pages/sub_workorder/workorder_details.dart @@ -14,7 +14,6 @@ class WorkOrderDetails extends StatelessWidget { children: [ Container( padding: EdgeInsets.all(10), - margin: EdgeInsets.all(10), decoration: BoxDecoration( color: AColors.inputFieldBackgroundColor, border: Border.all( @@ -39,7 +38,16 @@ class WorkOrderDetails extends StatelessWidget { ], ), ), - Container(child: _buildRow("call id", "", context),) + Container( + padding: EdgeInsets.all(10), + decoration: BoxDecoration( + color: AColors.inputFieldBackgroundColor, + border: Border.all( + color: Color(0xffefefef), + ), + borderRadius: BorderRadius.circular(AppStyle.borderRadius * AppStyle.getScaleFactor(context)), + ), + child: _buildRow("call id", "", context),) ], ); } diff --git a/lib/views/pages/sub_workorder/workorder_list.dart b/lib/views/pages/sub_workorder/workorder_list.dart index 5754678c..4875df49 100644 --- a/lib/views/pages/sub_workorder/workorder_list.dart +++ b/lib/views/pages/sub_workorder/workorder_list.dart @@ -7,6 +7,7 @@ import '../../../models/service_request/search_work_order.dart'; import '../../../models/subtitle.dart'; import '../../widgets/loaders/lazy_loading.dart'; import '../../widgets/loaders/no_item_found.dart'; +import 'create_sub_workorder_page.dart'; class WorkOrderList extends StatelessWidget { final List items; @@ -31,8 +32,12 @@ class WorkOrderList extends StatelessWidget { padding: const EdgeInsets.symmetric(horizontal: 16, vertical: 8), itemBuilder: (context, itemIndex) { return WorkOrderItem(index: itemIndex, onPressed: (model){ - Navigator.of(context).push(MaterialPageRoute( - builder: (_) => WorkOrderUpdate(item: model,))); + // Navigator.of(context).push(MaterialPageRoute( + // builder: (_) => WorkOrderUpdate(item: model,))); + Navigator.push( + context, + MaterialPageRoute(builder: (context) => CreateSubWorkOrderPage(workOrder:model)), + ); }, item: items[itemIndex], ); }), ); From ebd9297646c981fa6a14b689046c54fcd0eee9f8 Mon Sep 17 00:00:00 2001 From: zaid_daoud Date: Mon, 19 Jun 2023 14:55:40 +0300 Subject: [PATCH 089/181] Update Work order [Sub work orders] --- .../api/service_requests_provider.dart | 29 ++ .../service_request/search_work_order.dart | 398 +++++++++++------- .../spare_parts_details_bottom_sheet.dart | 101 +++-- .../work_order_details_bottom_sheet.dart | 62 +-- 4 files changed, 364 insertions(+), 226 deletions(-) diff --git a/lib/controllers/providers/api/service_requests_provider.dart b/lib/controllers/providers/api/service_requests_provider.dart index 755ffff0..0d0d397d 100644 --- a/lib/controllers/providers/api/service_requests_provider.dart +++ b/lib/controllers/providers/api/service_requests_provider.dart @@ -478,6 +478,35 @@ class ServiceRequestsProvider extends ChangeNotifier { } } + Future updateWorkOrderDetails({@required SearchWorkOrders workOrder}) async { + Response response; + //Map body = report.toMap(request); + // body["uid"] = user.id; + // body["token"] = user.token; + // body["job_id"] = request.id; + // body["report_id"] = request.reportID; + try { + Map body = workOrder.toJson(); + // body["uid"] = user.id; + // body["token"] = user.token; + response = await ApiManager.instance.put(URLs.updateServiceReport, body: body); + // response = await post( + // Uri.parse( + // host+URLs.updateServiceReport), + // body: body, + // ); + // stateCode = response.statusCode; + + if (response.statusCode >= 200 && response.statusCode < 300) { + reset(); + notifyListeners(); + } + return response.statusCode; + } catch (error) { + return -1; + } + } + Future updateServiceReportTimer({ @required String host, @required User user, diff --git a/lib/models/service_request/search_work_order.dart b/lib/models/service_request/search_work_order.dart index 0fc6907b..afe53d84 100644 --- a/lib/models/service_request/search_work_order.dart +++ b/lib/models/service_request/search_work_order.dart @@ -26,7 +26,7 @@ class SearchWorkOrders { num travelingHours; num travelingExpenses; ModelDefRelatedDefects faultDescription; - List sparePartsWorkOrders; + List sparePartsWorkOrders; String reviewComment; String comment; String attachmentsWorkOrder; @@ -79,9 +79,9 @@ class SearchWorkOrders { workOrderNo = json['workOrderNo']; workOrderYear = json['workOrderYear']; workOrderSequennce = json['workOrderSequennce']; - callRequest = json['callRequest'] != null ? new CallRequest.fromJson(json['callRequest']) : CallRequest(); + callRequest = json['callRequest'] != null ? CallRequest.fromJson(json['callRequest']) : CallRequest(); assetType = json['assetType']; - assignedEmployee = json['assignedEmployee'] != null ? new AssignedEmployee.fromJson(json['assignedEmployee']) : AssignedEmployee(); + assignedEmployee = json['assignedEmployee'] != null ? AssignedEmployee.fromJson(json['assignedEmployee']) : AssignedEmployee(); visitDate = json['visitDate']; startDate = json['startDate']; endDate = json['endDate']; @@ -93,8 +93,8 @@ class SearchWorkOrders { if (json['contactPersonWorkOrders'] != null) { contactPersonWorkOrders = json['contactPersonWorkOrders']; } - calllastSituation = json['calllastSituation'] != null ? new Lookup.fromJson(json['calllastSituation']) : Lookup(); - currentSituation = json['currentSituation'] != null ? new Lookup.fromJson(json['currentSituation']) : Lookup(); + calllastSituation = json['calllastSituation'] != null ? Lookup.fromJson(json['calllastSituation']) : const Lookup(); + currentSituation = json['currentSituation'] != null ? Lookup.fromJson(json['currentSituation']) : const Lookup(); repairLocation = json['repairLocation']; reason = json['reason']; startofWorkTime = json['startofWorkTime']; @@ -102,9 +102,12 @@ class SearchWorkOrders { workingHours = json['workingHours']; travelingHours = json['travelingHours']; travelingExpenses = json['travelingExpenses']; - faultDescription = json['faultDescription'] != null ? new ModelDefRelatedDefects.fromJson(json['faultDescription']) : ModelDefRelatedDefects(); + faultDescription = json['faultDescription'] != null ? ModelDefRelatedDefects.fromJson(json['faultDescription']) : ModelDefRelatedDefects(); if (json['sparePartsWorkOrders'] != null) { - sparePartsWorkOrders = json['sparePartsWorkOrders']; + sparePartsWorkOrders = []; + json['sparePartsWorkOrders'].forEach((v) { + sparePartsWorkOrders.add(SparePartWorkOrder.fromJson(v)); + }); } reviewComment = json['reviewComment']; comment = json['comment']; @@ -119,63 +122,148 @@ class SearchWorkOrders { } Map toJson() { - final Map data = new Map(); - data['id'] = this.id; - data['parentWOId'] = this.parentWOId; - data['workOrderNo'] = this.workOrderNo; - data['workOrderYear'] = this.workOrderYear; - data['workOrderSequennce'] = this.workOrderSequennce; - if (this.callRequest != null) { - data['callRequest'] = this.callRequest.toJson(); + final Map data = {}; + data['id'] = id; + data['parentWOId'] = parentWOId; + data['workOrderNo'] = workOrderNo; + data['workOrderYear'] = workOrderYear; + data['workOrderSequennce'] = workOrderSequennce; + if (callRequest != null) { + data['callRequest'] = callRequest.toJson(); } - data['assetType'] = this.assetType; - if (this.assignedEmployee != null) { - data['assignedEmployee'] = this.assignedEmployee.toJson(); + if (assetType != null) data['assetType'] = assetType; + if (assignedEmployee != null) { + data['assignedEmployee'] = assignedEmployee.toJson(); } - data['visitDate'] = this.visitDate; - data['startDate'] = this.startDate; - data['endDate'] = this.endDate; - if (this.assistantEmployees != null) { - data['assistantEmployees'] = this.assistantEmployees.map((v) => v.toJson()).toList(); + if (data['visitDate'] != null) data['visitDate'] = visitDate; + if (data['startDate'] != null) data['startDate'] = startDate; + if (data['endDate'] != null) data['endDate'] = endDate; + if (assistantEmployees != null) { + data['assistantEmployees'] = assistantEmployees.map((v) => v.toJson()).toList(); } - data['supplier'] = this.supplier; - data['vendorTicketNumber'] = this.vendorTicketNumber; - if (this.contactPersonWorkOrders != null) { - data['contactPersonWorkOrders'] = this.contactPersonWorkOrders.map((v) => v.toJson()).toList(); + if (supplier != null) data['supplier'] = supplier; + data['vendorTicketNumber'] = vendorTicketNumber; + if (contactPersonWorkOrders != null) { + data['contactPersonWorkOrders'] = contactPersonWorkOrders.map((v) => v.toJson()).toList(); } - if (this.calllastSituation != null) { - data['calllastSituation'] = this.calllastSituation.toMap(); + if (calllastSituation != null) { + data['calllastSituation'] = calllastSituation.toMap(); } - if (this.currentSituation != null) { - data['currentSituation'] = this.currentSituation.toMap(); + if (currentSituation != null) { + data['currentSituation'] = currentSituation.toMap(); } - data['repairLocation'] = this.repairLocation; - data['reason'] = this.reason; - data['startofWorkTime'] = this.startofWorkTime; - data['endofWorkTime'] = this.endofWorkTime; - data['workingHours'] = this.workingHours; - data['travelingHours'] = this.travelingHours; - data['travelingExpenses'] = this.travelingExpenses; - if (this.faultDescription != null) { - data['faultDescription'] = this.faultDescription.toJson(); + if (repairLocation != null) data['repairLocation'] = repairLocation; + if (reason != null) data['reason'] = reason; + if (startofWorkTime != null) data['startofWorkTime'] = startofWorkTime; + if (endofWorkTime != null) data['endofWorkTime'] = endofWorkTime; + if (workingHours != null) data['workingHours'] = workingHours; + if (travelingHours != null) data['travelingHours'] = travelingHours; + if (travelingExpenses != null) data['travelingExpenses'] = travelingExpenses; + if (faultDescription != null) { + data['faultDescription'] = faultDescription.toJson(); } - if (this.sparePartsWorkOrders != null) { - data['sparePartsWorkOrders'] = this.sparePartsWorkOrders.map((v) => v.toJson()).toList(); + if (sparePartsWorkOrders != null) { + data['sparePartsWorkOrders'] = sparePartsWorkOrders.map((v) => v.toJson()).toList(); } - data['reviewComment'] = this.reviewComment; - data['comment'] = this.comment; - data['attachmentsWorkOrder'] = this.attachmentsWorkOrder; - data['equipmentStatus'] = this.equipmentStatus; - if (this.suppEngineerWorkOrders != null) { - data['suppEngineerWorkOrders'] = this.suppEngineerWorkOrders.map((v) => v.toJson()).toList(); + data['reviewComment'] = reviewComment; + data['comment'] = comment; + data['attachmentsWorkOrder'] = attachmentsWorkOrder; + data['equipmentStatus'] = equipmentStatus; + if (suppEngineerWorkOrders != null) { + data['suppEngineerWorkOrders'] = suppEngineerWorkOrders.map((v) => v.toJson()).toList(); } - data['engSignature'] = this.engSignature; - data['nurseSignature'] = this.nurseSignature; - data['woParentDto'] = this.woParentDto; + data['engSignature'] = engSignature; + data['nurseSignature'] = nurseSignature; + data['woParentDto'] = woParentDto; return data; } } +class SparePart { + int id; + String partNo; + String partName; + SparePart({ + this.id, + this.partNo, + this.partName, + }); + + SparePart.fromJson(Map json) { + id = json['id']; + partNo = json['partNo']; + partName = json['partName']; + } + + SparePart copyWith({ + int id, + String partNo, + String partName, + }) => + SparePart( + id: id ?? this.id, + partNo: partNo ?? this.partNo, + partName: partName ?? this.partName, + ); + + Map toJson() { + final map = {}; + map['id'] = id ?? 0; + map['partNo'] = partNo; + map['partName'] = partName; + return map; + } +} + +class SparePartWorkOrder { + int id; + SparePart sparePart; + double qty; + double returnQty; + double installQty; + + SparePartWorkOrder({ + this.id, + this.sparePart, + this.qty, + this.returnQty, + this.installQty, + }); + + SparePartWorkOrder.fromJson(Map json) { + id = json['id']; + sparePart = SparePart.fromJson(json['sparePart'] ?? {}); + qty = json['qty']; + returnQty = json['returnQty']; + installQty = json['installQty']; + } + + SparePartWorkOrder copyWith({ + int id, + SparePart sparePart, + double qty, + double returnQty, + double installQty, + }) => + SparePartWorkOrder( + id: id ?? this.id, + sparePart: sparePart ?? this.sparePart, + qty: qty ?? this.qty, + returnQty: returnQty ?? this.returnQty, + installQty: installQty ?? this.installQty, + ); + + Map toJson() { + final map = {}; + map['id'] = id ?? 0; + map['sparePart'] = sparePart?.toJson(); + map['qty'] = qty; + map['returnQty'] = returnQty; + map['installQty'] = installQty; + return map; + } +} + class CallRequest { int id; String callNo; @@ -193,40 +281,40 @@ class CallRequest { CallRequest.fromJson(Map json) { id = json['id']; callNo = json['callNo']; - asset = json['asset'] != null ? new Asset.fromJson(json['asset']) : Asset(); - assignedEmployee = json['assignedEmployee'] != null ? new AssignedEmployee.fromJson(json['assignedEmployee']) : AssignedEmployee(); + asset = json['asset'] != null ? Asset.fromJson(json['asset']) : Asset(); + assignedEmployee = json['assignedEmployee'] != null ? AssignedEmployee.fromJson(json['assignedEmployee']) : AssignedEmployee(); if (json['callSiteContactPerson'] != null) { callSiteContactPerson = json['callSiteContactPerson']; } - status = json['status'] != null ? new Lookup.fromJson(json['status']) : Lookup(); - callLastSituation = json['callLastSituation'] != null ? new Lookup.fromJson(json['callLastSituation']) : Lookup(); + status = json['status'] != null ? Lookup.fromJson(json['status']) : const Lookup(); + callLastSituation = json['callLastSituation'] != null ? Lookup.fromJson(json['callLastSituation']) : const Lookup(); defectType = json['defectType']; firstAction = json['firstAction']; assetType = json['assetType']; } Map toJson() { - final Map data = new Map(); - data['id'] = this.id; - data['callNo'] = this.callNo; - if (this.asset != null) { - data['asset'] = this.asset.toJson(); + final Map data = {}; + data['id'] = id; + data['callNo'] = callNo; + if (asset != null) { + data['asset'] = asset.toJson(); } - if (this.assignedEmployee != null) { - data['assignedEmployee'] = this.assignedEmployee.toJson(); + if (assignedEmployee != null) { + data['assignedEmployee'] = assignedEmployee.toJson(); } - if (this.callSiteContactPerson != null) { - data['callSiteContactPerson'] = this.callSiteContactPerson.map((v) => v.toJson()).toList(); + if (callSiteContactPerson != null) { + data['callSiteContactPerson'] = callSiteContactPerson.map((v) => v.toJson()).toList(); } - if (this.status != null) { - data['status'] = this.status.toMap(); + if (status != null) { + data['status'] = status.toMap(); } - if (this.callLastSituation != null) { - data['callLastSituation'] = this.callLastSituation.toMap(); + if (callLastSituation != null) { + data['callLastSituation'] = callLastSituation.toMap(); } - data['defectType'] = this.defectType; - data['firstAction'] = this.firstAction; - data['assetType'] = this.assetType; + data['defectType'] = defectType; + data['firstAction'] = firstAction; + data['assetType'] = assetType; return data; } } @@ -336,7 +424,7 @@ class Asset { assetSerialNo = json['assetSerialNo']; systemID = json['systemID']; assetNumber = json['assetNumber']; - modelDefinition = json['modelDefinition'] != null ? new ModelDefinition.fromJson(json['modelDefinition']) : ModelDefinition(); + modelDefinition = json['modelDefinition'] != null ? ModelDefinition.fromJson(json['modelDefinition']) : ModelDefinition(); supplier = json['supplier']; ipAddress = json['ipAddress']; macAddress = json['macAddress']; @@ -346,70 +434,70 @@ class Asset { isParent = json['isParent']; parentAsset = json['parentAsset']; assetType = json['assetType']; - site = json['site'] != null ? new Site.fromJson(json['site']) : Site(); + site = json['site'] != null ? Site.fromJson(json['site']) : Site(); building = json['building']; floor = json['floor']; department = json['department']; } Map toJson() { - final Map data = new Map(); - data['id'] = this.id; - data['assetSerialNo'] = this.assetSerialNo; - data['systemID'] = this.systemID; - data['assetNumber'] = this.assetNumber; - if (this.modelDefinition != null) { - data['modelDefinition'] = this.modelDefinition.toJson(); + final Map data = {}; + data['id'] = id; + data['assetSerialNo'] = assetSerialNo; + data['systemID'] = systemID; + data['assetNumber'] = assetNumber; + if (modelDefinition != null) { + data['modelDefinition'] = modelDefinition.toJson(); } - data['supplier'] = this.supplier; - data['ipAddress'] = this.ipAddress; - data['macAddress'] = this.macAddress; - data['portNumber'] = this.portNumber; - data['assetReplace'] = this.assetReplace; - data['oldAsset'] = this.oldAsset; - data['isParent'] = this.isParent; - data['parentAsset'] = this.parentAsset; - data['assetType'] = this.assetType; - if (this.site != null) { - data['site'] = this.site.toJson(); + data['supplier'] = supplier; + data['ipAddress'] = ipAddress; + data['macAddress'] = macAddress; + data['portNumber'] = portNumber; + data['assetReplace'] = assetReplace; + data['oldAsset'] = oldAsset; + data['isParent'] = isParent; + data['parentAsset'] = parentAsset; + data['assetType'] = assetType; + if (site != null) { + data['site'] = site.toJson(); } - data['building'] = this.building; - data['floor'] = this.floor; - data['department'] = this.department; - data['room'] = this.room; - data['testsDay'] = this.testsDay; - data['purchasingPrice'] = this.purchasingPrice; - data['nbv'] = this.nbv; - data['currency'] = this.currency; - data['poNo'] = this.poNo; - data['invoiceNumber'] = this.invoiceNumber; - data['invoiceDate'] = this.invoiceDate; - data['replacementDate'] = this.replacementDate; - data['originDepartment'] = this.originDepartment; - if (this.originSite != null) { - data['originSite'] = this.originSite.toJson(); + data['building'] = building; + data['floor'] = floor; + data['department'] = department; + data['room'] = room; + data['testsDay'] = testsDay; + data['purchasingPrice'] = purchasingPrice; + data['nbv'] = nbv; + data['currency'] = currency; + data['poNo'] = poNo; + data['invoiceNumber'] = invoiceNumber; + data['invoiceDate'] = invoiceDate; + data['replacementDate'] = replacementDate; + data['originDepartment'] = originDepartment; + if (originSite != null) { + data['originSite'] = originSite.toJson(); } - data['budgetYear'] = this.budgetYear; - data['lastPOPrice'] = this.lastPOPrice; - data['commissioningStatus'] = this.commissioningStatus; - data['productionDate'] = this.productionDate; - data['edd'] = this.edd; - data['technicalInspectionDate'] = this.technicalInspectionDate; - data['deliveryInspectionDate'] = this.deliveryInspectionDate; - data['endUserAcceptanceDate'] = this.endUserAcceptanceDate; - data['receivingCommittee'] = this.receivingCommittee; - data['siteWarrantyMonths'] = this.siteWarrantyMonths; - data['extendedWarrantyMonths'] = this.extendedWarrantyMonths; - data['remainderWarrantyMonths'] = this.remainderWarrantyMonths; - data['eomWarrantyMonthsNo'] = this.eomWarrantyMonthsNo; - data['warrantyValue'] = this.warrantyValue; - data['warrantyEndDate'] = this.warrantyEndDate; - data['warrantyContractConditions'] = this.warrantyContractConditions; - if (this.technicalGuidanceBooks != null) { - data['technicalGuidanceBooks'] = this.technicalGuidanceBooks.map((v) => v.toJson()).toList(); + data['budgetYear'] = budgetYear; + data['lastPOPrice'] = lastPOPrice; + data['commissioningStatus'] = commissioningStatus; + data['productionDate'] = productionDate; + if (edd != null) data['edd'] = edd; + data['technicalInspectionDate'] = technicalInspectionDate; + data['deliveryInspectionDate'] = deliveryInspectionDate; + data['endUserAcceptanceDate'] = endUserAcceptanceDate; + data['receivingCommittee'] = receivingCommittee; + data['siteWarrantyMonths'] = siteWarrantyMonths; + data['extendedWarrantyMonths'] = extendedWarrantyMonths; + data['remainderWarrantyMonths'] = remainderWarrantyMonths; + data['eomWarrantyMonthsNo'] = eomWarrantyMonthsNo; + data['warrantyValue'] = warrantyValue; + data['warrantyEndDate'] = warrantyEndDate; + data['warrantyContractConditions'] = warrantyContractConditions; + if (technicalGuidanceBooks != null) { + data['technicalGuidanceBooks'] = technicalGuidanceBooks.map((v) => v.toJson()).toList(); } - data['comment'] = this.comment; - data['tagCode'] = this.tagCode; + data['comment'] = comment; + data['tagCode'] = tagCode; return data; } } @@ -453,7 +541,7 @@ class ModelDefinition { if (json['modelDefRelatedDefects'] != null) { modelDefRelatedDefects = []; json['modelDefRelatedDefects'].forEach((v) { - modelDefRelatedDefects.add(new ModelDefRelatedDefects.fromJson(v)); + modelDefRelatedDefects.add(ModelDefRelatedDefects.fromJson(v)); }); } if (json['suppliers'] != null) { @@ -462,21 +550,21 @@ class ModelDefinition { } Map toJson() { - final Map data = new Map(); - data['id'] = this.id; - data['assetName'] = this.assetName; - data['modelDefCode'] = this.modelDefCode; - data['modelName'] = this.modelName; - data['manufacturerId'] = this.manufacturerId; - data['manufacturerName'] = this.manufacturerName; - data['supplierName'] = this.supplierName; - data['replacementDate'] = this.replacementDate; - data['lifeSpan'] = this.lifeSpan; - if (this.modelDefRelatedDefects != null) { - data['modelDefRelatedDefects'] = this.modelDefRelatedDefects.map((v) => v.toJson()).toList(); + final Map data = {}; + data['id'] = id; + data['assetName'] = assetName; + data['modelDefCode'] = modelDefCode; + data['modelName'] = modelName; + data['manufacturerId'] = manufacturerId; + data['manufacturerName'] = manufacturerName; + data['supplierName'] = supplierName; + data['replacementDate'] = replacementDate; + data['lifeSpan'] = lifeSpan; + if (modelDefRelatedDefects != null) { + data['modelDefRelatedDefects'] = modelDefRelatedDefects.map((v) => v.toJson()).toList(); } - if (this.suppliers != null) { - data['suppliers'] = this.suppliers.map((v) => v.toJson()).toList(); + if (suppliers != null) { + data['suppliers'] = suppliers.map((v) => v.toJson()).toList(); } return data; } @@ -498,11 +586,11 @@ class ModelDefRelatedDefects { } Map toJson() { - final Map data = new Map(); - data['id'] = this.id; - data['defectName'] = this.defectName; - data['workPerformed'] = this.workPerformed; - data['estimatedTime'] = this.estimatedTime; + final Map data = {}; + data['id'] = id; + data['defectName'] = defectName; + data['workPerformed'] = workPerformed; + data['estimatedTime'] = estimatedTime; return data; } } @@ -525,12 +613,12 @@ class Site { } Map toJson() { - final Map data = new Map(); - data['id'] = this.id; - data['customerCode'] = this.customerCode; - data['custName'] = this.custName; - if (this.buildings != null) { - data['buildings'] = this.buildings.map((v) => v.toJson()).toList(); + final Map data = {}; + data['id'] = id; + data['customerCode'] = customerCode; + data['custName'] = custName; + if (buildings != null) { + data['buildings'] = buildings.map((v) => v.toJson()).toList(); } return data; } @@ -548,9 +636,9 @@ class AssignedEmployee { } Map toJson() { - final Map data = new Map(); - data['id'] = this.id; - data['name'] = this.name; + final Map data = {}; + data['id'] = id; + data['name'] = name; return data; } } diff --git a/lib/views/pages/sub_workorder/spare_parts_details_bottom_sheet.dart b/lib/views/pages/sub_workorder/spare_parts_details_bottom_sheet.dart index 048a6158..927a07bd 100644 --- a/lib/views/pages/sub_workorder/spare_parts_details_bottom_sheet.dart +++ b/lib/views/pages/sub_workorder/spare_parts_details_bottom_sheet.dart @@ -3,11 +3,11 @@ import 'package:fluttertoast/fluttertoast.dart'; import 'package:provider/provider.dart'; import 'package:test_sa/models/service_request/search_work_order.dart'; import 'package:test_sa/views/app_style/colors.dart'; +import 'package:test_sa/views/widgets/loaders/app_loading.dart'; import '../../../controllers/api_routes/http_status_manger.dart'; import '../../../controllers/localization/localization.dart'; import '../../../controllers/providers/api/service_requests_provider.dart'; -import '../../../models/service_report.dart'; import '../../../models/subtitle.dart'; import '../../widgets/app_text_form_field.dart'; import '../../widgets/buttons/app_button.dart'; @@ -72,21 +72,37 @@ class _SparePartsBottomSheetState extends State { final wo = _workOrder.sparePartsWorkOrders[index]; return Column( children: [ - const ATextFormField(labelText: "Part No."), - const SizedBox(height: 8), - const ATextFormField( - labelText: "Description", - hintText: "Add Some Text", - textInputType: TextInputType.multiline, + ATextFormField( + labelText: "Part No.", + onChange: (value) { + _workOrder.sparePartsWorkOrders[index].sparePart = SparePart(partNo: value); + }, ), + // const SizedBox(height: 8), + // ATextFormField( + // labelText: "Description", + // hintText: "Add Some Text", + // textInputType: TextInputType.multiline, + // onSaved: (value) { + // _workOrder.sparePartsWorkOrders[index].sparePart = value; + // }, + // ), const SizedBox(height: 8), - const ATextFormField( + ATextFormField( labelText: "Quantity", textInputType: TextInputType.number, + onSaved: (value) { + _workOrder.sparePartsWorkOrders[index].qty = double.tryParse(value ?? ""); + }, ), const SizedBox(height: 8), InkWell( - onTap: () {}, + onTap: () { + _workOrder.sparePartsWorkOrders.removeWhere( + (element) => (element.sparePart?.partNo == wo.sparePart?.partNo && element.id == wo.id), + ); + setState(() {}); + }, child: Row( mainAxisAlignment: MainAxisAlignment.end, children: [ @@ -106,7 +122,10 @@ class _SparePartsBottomSheetState extends State { const Divider(), const SizedBox(height: 8), InkWell( - onTap: () {}, + onTap: () { + _workOrder.sparePartsWorkOrders.add(SparePartWorkOrder()); + setState(() {}); + }, child: Container( decoration: BoxDecoration( color: AColors.primaryColor.withOpacity(0.15), @@ -116,9 +135,7 @@ class _SparePartsBottomSheetState extends State { child: ListTile( title: Text( "Add Part", - style: Theme.of(context).textTheme.bodyMedium?.copyWith( - color: AColors.primaryColor, - ), + style: Theme.of(context).textTheme.bodyMedium?.copyWith(color: AColors.primaryColor), ), trailing: const Icon( Icons.add_circle, @@ -135,36 +152,38 @@ class _SparePartsBottomSheetState extends State { ), ), ), - AButton( - text: subtitle.update, - onPressed: () async { - // _validate = true; - if (!_formKey.currentState.validate()) { - setState(() {}); - return; - } - // if (!_serviceReport.validate()) { - // setState(() {}); - // return; - // } - _formKey.currentState.save(); + _isLoading + ? const ALoading() + : AButton( + text: subtitle.update, + onPressed: () async { + // _validate = true; + if (!_formKey.currentState.validate()) { + setState(() {}); + return; + } + // if (!_serviceReport.validate()) { + // setState(() {}); + // return; + // } + _formKey.currentState.save(); - _isLoading = true; - setState(() {}); + _isLoading = true; + setState(() {}); - int status = await Provider.of(context).updateServiceReport(report: ServiceReport()); - _isLoading = false; - setState(() {}); - if (status >= 200 && status < 300) { - Fluttertoast.showToast(msg: subtitle.requestCompleteSuccessfully); - Navigator.of(context).pop(); - // Navigator.of(context).pop(); - } else { - String errorMessage = HttpStatusManger.getStatusMessage(status: status, subtitle: subtitle); - ScaffoldMessenger.of(context).showSnackBar(SnackBar(content: Text(errorMessage))); - } - }, - ), + int status = await Provider.of(context, listen: false).updateWorkOrderDetails(workOrder: _workOrder); + _isLoading = false; + setState(() {}); + if (status >= 200 && status < 300) { + Fluttertoast.showToast(msg: subtitle.requestCompleteSuccessfully); + Navigator.of(context).pop(); + // Navigator.of(context).pop(); + } else { + String errorMessage = HttpStatusManger.getStatusMessage(status: status, subtitle: subtitle); + ScaffoldMessenger.of(context).showSnackBar(SnackBar(content: Text(errorMessage))); + } + }, + ), ], ), ), diff --git a/lib/views/pages/sub_workorder/work_order_details_bottom_sheet.dart b/lib/views/pages/sub_workorder/work_order_details_bottom_sheet.dart index 12df4c57..31c8de92 100644 --- a/lib/views/pages/sub_workorder/work_order_details_bottom_sheet.dart +++ b/lib/views/pages/sub_workorder/work_order_details_bottom_sheet.dart @@ -7,13 +7,13 @@ import 'package:test_sa/models/service_request/search_work_order.dart'; import 'package:test_sa/models/subtitle.dart'; import 'package:test_sa/views/widgets/app_text_form_field.dart'; import 'package:test_sa/views/widgets/buttons/app_button.dart'; +import 'package:test_sa/views/widgets/loaders/app_loading.dart'; import 'package:test_sa/views/widgets/status/report/service_report_maintenance_situation.dart'; import 'package:test_sa/views/widgets/status/report/service_report_repair_location.dart'; import '../../../controllers/api_routes/http_status_manger.dart'; import '../../../controllers/localization/localization.dart'; import '../../../models/engineer.dart'; -import '../../../models/service_report.dart'; import '../../app_style/sizing.dart'; import '../../widgets/date_and_time/time_picker.dart'; import '../../widgets/status/report/service_report_all_users.dart'; @@ -135,7 +135,7 @@ class _WorkOrderDetailsBottomSheetState extends State Validator.isNumeric(value) ? null : _subtitle.requiredWord, @@ -200,36 +200,38 @@ class _WorkOrderDetailsBottomSheetState extends State(context).updateServiceReport(report: ServiceReport()); - _isLoading = false; - setState(() {}); - if (status >= 200 && status < 300) { - Fluttertoast.showToast(msg: subtitle.requestCompleteSuccessfully); - Navigator.of(context).pop(); - // Navigator.of(context).pop(); - } else { - String errorMessage = HttpStatusManger.getStatusMessage(status: status, subtitle: subtitle); - ScaffoldMessenger.of(context).showSnackBar(SnackBar(content: Text(errorMessage))); - } - }, - ), + int status = await Provider.of(context, listen: false).updateWorkOrderDetails(workOrder: _workOrder); + _isLoading = false; + setState(() {}); + if (status >= 200 && status < 300) { + Fluttertoast.showToast(msg: subtitle.requestCompleteSuccessfully); + Navigator.of(context).pop(); + // Navigator.of(context).pop(); + } else { + String errorMessage = HttpStatusManger.getStatusMessage(status: status, subtitle: subtitle); + ScaffoldMessenger.of(context).showSnackBar(SnackBar(content: Text(errorMessage))); + } + }, + ), ], ), ), From 19cee08954fb03dfebd06dc1fe786020c992ec08 Mon Sep 17 00:00:00 2001 From: zaid_daoud Date: Tue, 20 Jun 2023 09:27:41 +0300 Subject: [PATCH 090/181] Updating Search Work Order Model --- .../api/service_requests_provider.dart | 16 +- .../service_request/search_work_order.dart | 3201 ++++++++++++++--- .../create_sub_workorder_page.dart | 6 +- .../search_sub_workorder_page.dart | 63 +- .../spare_parts_details_bottom_sheet.dart | 6 +- .../work_order_details_bottom_sheet.dart | 46 +- .../sub_workorder/workorder_details.dart | 10 +- .../pages/sub_workorder/workorder_item.dart | 25 +- .../pages/sub_workorder/workorder_list.dart | 48 +- .../pages/sub_workorder/workorder_update.dart | 8 +- .../report/future_service_report.dart | 2 +- .../pages/user/requests/request_details.dart | 4 +- 12 files changed, 2803 insertions(+), 632 deletions(-) diff --git a/lib/controllers/providers/api/service_requests_provider.dart b/lib/controllers/providers/api/service_requests_provider.dart index 0d0d397d..1b64bb03 100644 --- a/lib/controllers/providers/api/service_requests_provider.dart +++ b/lib/controllers/providers/api/service_requests_provider.dart @@ -13,9 +13,9 @@ import 'package:test_sa/models/service_request/service_request.dart'; import 'package:test_sa/models/service_request/service_request_search.dart'; import 'package:test_sa/models/subtitle.dart'; import 'package:test_sa/models/timer_model.dart'; -import 'package:test_sa/models/user.dart'; import '../../../models/service_request/search_work_order.dart'; +import '../../../models/user.dart'; class ServiceRequestsProvider extends ChangeNotifier { // number of items call in each request @@ -38,7 +38,7 @@ class ServiceRequestsProvider extends ChangeNotifier { // list of user requests List serviceRequests; - List workOrders = []; + List workOrders = []; // when requests in-process _loading = true // done _loading = true @@ -387,7 +387,7 @@ class ServiceRequestsProvider extends ChangeNotifier { } } - Future> searchWorkOrders({@required String callId}) async { + Future> searchWorkOrders({@required String callId}) async { Response response; try { @@ -402,7 +402,7 @@ class ServiceRequestsProvider extends ChangeNotifier { // client's request was successfully received List workOrdersJson = json.decode(response.body)["data"]; print(workOrdersJson); - workOrders = workOrdersJson.map((request) => SearchWorkOrders.fromJson(request)).toList(); + workOrders = workOrdersJson.map((request) => SearchWorkOrder.fromJson(request)).toList(); if (workOrders.length == pageItemNumber) { nextPage = true; } else { @@ -478,7 +478,7 @@ class ServiceRequestsProvider extends ChangeNotifier { } } - Future updateWorkOrderDetails({@required SearchWorkOrders workOrder}) async { + Future updateWorkOrderDetails({@required SearchWorkOrder workOrder}) async { Response response; //Map body = report.toMap(request); // body["uid"] = user.id; @@ -588,8 +588,8 @@ class ServiceRequestsProvider extends ChangeNotifier { } } - Future> searchForWorkOrders( - SearchWorkOrders search, + Future> searchForWorkOrders( + SearchWorkOrder search, String callerId, Lookup dateOperator, String site, @@ -619,7 +619,7 @@ class ServiceRequestsProvider extends ChangeNotifier { // client's request was successfully received List workOrdersJson = json.decode(response.body)["data"]; print(workOrdersJson); - workOrders = workOrdersJson.map((request) => SearchWorkOrders.fromJson(request)).toList(); + workOrders = workOrdersJson.map((request) => SearchWorkOrder.fromJson(request)).toList(); if (workOrders.length == pageItemNumber) { nextPage = true; } else { diff --git a/lib/models/service_request/search_work_order.dart b/lib/models/service_request/search_work_order.dart index afe53d84..78a43616 100644 --- a/lib/models/service_request/search_work_order.dart +++ b/lib/models/service_request/search_work_order.dart @@ -1,644 +1,2805 @@ import 'package:test_sa/models/lookup.dart'; -class SearchWorkOrders { - int id; - String parentWOId; - String workOrderNo; - int workOrderYear; - int workOrderSequennce; - CallRequest callRequest; - String assetType; - AssignedEmployee assignedEmployee; - String visitDate; - String startDate; - String endDate; - List assistantEmployees; - String supplier; - String vendorTicketNumber; - List contactPersonWorkOrders; - Lookup calllastSituation; - Lookup currentSituation; - String repairLocation; - String reason; - String startofWorkTime; - String endofWorkTime; - double workingHours; - num travelingHours; - num travelingExpenses; - ModelDefRelatedDefects faultDescription; - List sparePartsWorkOrders; - String reviewComment; - String comment; - String attachmentsWorkOrder; - String equipmentStatus; - List suppEngineerWorkOrders; - String engSignature; - String nurseSignature; - String woParentDto; - - SearchWorkOrders( - {this.id, - this.parentWOId, - this.workOrderNo, - this.workOrderYear, - this.workOrderSequennce, - this.callRequest, - this.assetType, - this.assignedEmployee, - this.visitDate, - this.startDate, - this.endDate, - this.assistantEmployees, - this.supplier, - this.vendorTicketNumber, - this.contactPersonWorkOrders, - this.calllastSituation, - this.currentSituation, - this.repairLocation, - this.reason, - this.startofWorkTime, - this.endofWorkTime, - this.workingHours, - this.travelingHours, - this.travelingExpenses, - this.faultDescription, - this.sparePartsWorkOrders, - this.reviewComment, - this.comment, - this.attachmentsWorkOrder, - this.equipmentStatus, - this.suppEngineerWorkOrders, - this.engSignature, - this.nurseSignature, - this.woParentDto}); - - SearchWorkOrders.fromJson(Map json) { - print(json['callRequest']); +class SearchWorkOrder { + SearchWorkOrder({ + this.id, + this.parentWOId, + this.workOrderNo, + this.workOrderYear, + this.workOrderSequennce, + this.callRequest, + this.assetType, + this.assignedEmployee, + this.visitDate, + this.assistantEmployees, + this.supplier, + this.vendorTicketNumber, + this.contactPersonWorkOrders, + this.calllastSituation, + this.currentSituation, + this.repairLocation, + this.reason, + this.startofWorkTime, + this.endofWorkTime, + this.workingHours, + this.travelingHours, + this.travelingExpenses, + this.faultDescription, + this.sparePartsWorkOrders, + this.reviewComment, + this.comment, + this.attachmentsWorkOrder, + this.equipmentStatus, + this.suppEngineerWorkOrders, + this.engSignature, + this.nurseSignature, + this.woParentDto, + }); + + SearchWorkOrder.fromJson(dynamic json) { id = json['id']; parentWOId = json['parentWOId']; workOrderNo = json['workOrderNo']; workOrderYear = json['workOrderYear']; workOrderSequennce = json['workOrderSequennce']; - callRequest = json['callRequest'] != null ? CallRequest.fromJson(json['callRequest']) : CallRequest(); - assetType = json['assetType']; - assignedEmployee = json['assignedEmployee'] != null ? AssignedEmployee.fromJson(json['assignedEmployee']) : AssignedEmployee(); + callRequest = json['callRequest'] != null ? CallRequest.fromJson(json['callRequest']) : null; + assetType = json['assetType'] != null ? Lookup.fromJson(json['assetType']) : null; + assignedEmployee = json['assignedEmployee'] != null ? AssignedEmployee.fromJson(json['assignedEmployee']) : null; visitDate = json['visitDate']; - startDate = json['startDate']; - endDate = json['endDate']; if (json['assistantEmployees'] != null) { - assistantEmployees = json['assistantEmployees']; + assistantEmployees = []; + json['assistantEmployees'].forEach((v) { + assistantEmployees.add(AssistantEmployees.fromJson(v)); + }); } - supplier = json['supplier']; + supplier = json['supplier'] != null ? SupplierModel.fromJson(json['supplier']) : null; vendorTicketNumber = json['vendorTicketNumber']; if (json['contactPersonWorkOrders'] != null) { - contactPersonWorkOrders = json['contactPersonWorkOrders']; + contactPersonWorkOrders = []; + json['contactPersonWorkOrders'].forEach((v) { + contactPersonWorkOrders.add(ContactPersonWorkOrders.fromJson(v)); + }); } - calllastSituation = json['calllastSituation'] != null ? Lookup.fromJson(json['calllastSituation']) : const Lookup(); - currentSituation = json['currentSituation'] != null ? Lookup.fromJson(json['currentSituation']) : const Lookup(); - repairLocation = json['repairLocation']; - reason = json['reason']; + calllastSituation = json['calllastSituation'] != null ? Lookup.fromJson(json['calllastSituation']) : null; + currentSituation = json['currentSituation'] != null ? Lookup.fromJson(json['currentSituation']) : null; + repairLocation = json['repairLocation'] != null ? Lookup.fromJson(json['repairLocation']) : null; + reason = json['reason'] != null ? Reason.fromJson(json['reason']) : null; startofWorkTime = json['startofWorkTime']; endofWorkTime = json['endofWorkTime']; workingHours = json['workingHours']; travelingHours = json['travelingHours']; travelingExpenses = json['travelingExpenses']; - faultDescription = json['faultDescription'] != null ? ModelDefRelatedDefects.fromJson(json['faultDescription']) : ModelDefRelatedDefects(); + faultDescription = json['faultDescription'] != null ? FaultDescription.fromJson(json['faultDescription']) : null; if (json['sparePartsWorkOrders'] != null) { - sparePartsWorkOrders = []; + sparePartsWorkOrders = []; json['sparePartsWorkOrders'].forEach((v) { - sparePartsWorkOrders.add(SparePartWorkOrder.fromJson(v)); + sparePartsWorkOrders.add(SparePartsWorkOrders.fromJson(v)); }); } reviewComment = json['reviewComment']; comment = json['comment']; - attachmentsWorkOrder = json['attachmentsWorkOrder']; - equipmentStatus = json['equipmentStatus']; + if (json['attachmentsWorkOrder'] != null) { + attachmentsWorkOrder = []; + json['attachmentsWorkOrder'].forEach((v) { + attachmentsWorkOrder.add(AttachmentsWorkOrder.fromJson(v)); + }); + } + equipmentStatus = json['equipmentStatus'] != null ? Lookup.fromJson(json['equipmentStatus']) : null; if (json['suppEngineerWorkOrders'] != null) { - suppEngineerWorkOrders = json['suppEngineerWorkOrders']; + suppEngineerWorkOrders = []; + json['suppEngineerWorkOrders'].forEach((v) { + suppEngineerWorkOrders.add(SuppEngineerWorkOrders.fromJson(v)); + }); } engSignature = json['engSignature']; nurseSignature = json['nurseSignature']; - woParentDto = json['woParentDto']; + woParentDto = json['woParentDto'] != null ? WoParentDto.fromJson(json['woParentDto']) : null; } - + num id; + num parentWOId; + String workOrderNo; + num workOrderYear; + num workOrderSequennce; + CallRequest callRequest; + Lookup assetType; + AssignedEmployee assignedEmployee; + String visitDate; + List assistantEmployees; + SupplierModel supplier; + String vendorTicketNumber; + List contactPersonWorkOrders; + Lookup calllastSituation; + Lookup currentSituation; + Lookup repairLocation; + Reason reason; + String startofWorkTime; + String endofWorkTime; + num workingHours; + num travelingHours; + num travelingExpenses; + FaultDescription faultDescription; + List sparePartsWorkOrders; + String reviewComment; + String comment; + List attachmentsWorkOrder; + Lookup equipmentStatus; + List suppEngineerWorkOrders; + String engSignature; + String nurseSignature; + WoParentDto woParentDto; + SearchWorkOrder copyWith({ + num id, + num parentWOId, + String workOrderNo, + num workOrderYear, + num workOrderSequennce, + CallRequest callRequest, + Lookup assetType, + AssignedEmployee assignedEmployee, + String visitDate, + List assistantEmployees, + SupplierModel supplier, + String vendorTicketNumber, + List contactPersonWorkOrders, + Lookup calllastSituation, + Lookup currentSituation, + Lookup repairLocation, + Reason reason, + String startofWorkTime, + String endofWorkTime, + num workingHours, + num travelingHours, + num travelingExpenses, + FaultDescription faultDescription, + List sparePartsWorkOrders, + String reviewComment, + String comment, + List attachmentsWorkOrder, + Lookup equipmentStatus, + List suppEngineerWorkOrders, + String engSignature, + String nurseSignature, + WoParentDto woParentDto, + }) => + SearchWorkOrder( + id: id ?? this.id, + parentWOId: parentWOId ?? this.parentWOId, + workOrderNo: workOrderNo ?? this.workOrderNo, + workOrderYear: workOrderYear ?? this.workOrderYear, + workOrderSequennce: workOrderSequennce ?? this.workOrderSequennce, + callRequest: callRequest ?? this.callRequest, + assetType: assetType ?? this.assetType, + assignedEmployee: assignedEmployee ?? this.assignedEmployee, + visitDate: visitDate ?? this.visitDate, + assistantEmployees: assistantEmployees ?? this.assistantEmployees, + supplier: supplier ?? this.supplier, + vendorTicketNumber: vendorTicketNumber ?? this.vendorTicketNumber, + contactPersonWorkOrders: contactPersonWorkOrders ?? this.contactPersonWorkOrders, + calllastSituation: calllastSituation ?? this.calllastSituation, + currentSituation: currentSituation ?? this.currentSituation, + repairLocation: repairLocation ?? this.repairLocation, + reason: reason ?? this.reason, + startofWorkTime: startofWorkTime ?? this.startofWorkTime, + endofWorkTime: endofWorkTime ?? this.endofWorkTime, + workingHours: workingHours ?? this.workingHours, + travelingHours: travelingHours ?? this.travelingHours, + travelingExpenses: travelingExpenses ?? this.travelingExpenses, + faultDescription: faultDescription ?? this.faultDescription, + sparePartsWorkOrders: sparePartsWorkOrders ?? this.sparePartsWorkOrders, + reviewComment: reviewComment ?? this.reviewComment, + comment: comment ?? this.comment, + attachmentsWorkOrder: attachmentsWorkOrder ?? this.attachmentsWorkOrder, + equipmentStatus: equipmentStatus ?? this.equipmentStatus, + suppEngineerWorkOrders: suppEngineerWorkOrders ?? this.suppEngineerWorkOrders, + engSignature: engSignature ?? this.engSignature, + nurseSignature: nurseSignature ?? this.nurseSignature, + woParentDto: woParentDto ?? this.woParentDto, + ); Map toJson() { - final Map data = {}; - data['id'] = id; - data['parentWOId'] = parentWOId; - data['workOrderNo'] = workOrderNo; - data['workOrderYear'] = workOrderYear; - data['workOrderSequennce'] = workOrderSequennce; + final map = {}; + map['id'] = id; + map['parentWOId'] = parentWOId; + map['workOrderNo'] = workOrderNo; + map['workOrderYear'] = workOrderYear; + map['workOrderSequennce'] = workOrderSequennce; if (callRequest != null) { - data['callRequest'] = callRequest.toJson(); + map['callRequest'] = callRequest.toJson(); + } + if (assetType != null) { + map['assetType'] = assetType.toMap(); } - if (assetType != null) data['assetType'] = assetType; if (assignedEmployee != null) { - data['assignedEmployee'] = assignedEmployee.toJson(); + map['assignedEmployee'] = assignedEmployee.toJson(); } - if (data['visitDate'] != null) data['visitDate'] = visitDate; - if (data['startDate'] != null) data['startDate'] = startDate; - if (data['endDate'] != null) data['endDate'] = endDate; + map['visitDate'] = visitDate; if (assistantEmployees != null) { - data['assistantEmployees'] = assistantEmployees.map((v) => v.toJson()).toList(); + map['assistantEmployees'] = assistantEmployees.map((v) => v.toJson()).toList(); + } + if (supplier != null) { + map['supplier'] = supplier.toJson(); } - if (supplier != null) data['supplier'] = supplier; - data['vendorTicketNumber'] = vendorTicketNumber; + map['vendorTicketNumber'] = vendorTicketNumber; if (contactPersonWorkOrders != null) { - data['contactPersonWorkOrders'] = contactPersonWorkOrders.map((v) => v.toJson()).toList(); + map['contactPersonWorkOrders'] = contactPersonWorkOrders.map((v) => v.toJson()).toList(); } if (calllastSituation != null) { - data['calllastSituation'] = calllastSituation.toMap(); + map['calllastSituation'] = calllastSituation.toMap(); } if (currentSituation != null) { - data['currentSituation'] = currentSituation.toMap(); - } - if (repairLocation != null) data['repairLocation'] = repairLocation; - if (reason != null) data['reason'] = reason; - if (startofWorkTime != null) data['startofWorkTime'] = startofWorkTime; - if (endofWorkTime != null) data['endofWorkTime'] = endofWorkTime; - if (workingHours != null) data['workingHours'] = workingHours; - if (travelingHours != null) data['travelingHours'] = travelingHours; - if (travelingExpenses != null) data['travelingExpenses'] = travelingExpenses; + map['currentSituation'] = currentSituation.toMap(); + } + if (repairLocation != null) { + map['repairLocation'] = repairLocation.toMap(); + } + if (reason != null) { + map['reason'] = reason.toJson(); + } + map['startofWorkTime'] = startofWorkTime; + map['endofWorkTime'] = endofWorkTime; + map['workingHours'] = workingHours; + map['travelingHours'] = travelingHours; + map['travelingExpenses'] = travelingExpenses; if (faultDescription != null) { - data['faultDescription'] = faultDescription.toJson(); + map['faultDescription'] = faultDescription.toJson(); } if (sparePartsWorkOrders != null) { - data['sparePartsWorkOrders'] = sparePartsWorkOrders.map((v) => v.toJson()).toList(); + map['sparePartsWorkOrders'] = sparePartsWorkOrders.map((v) => v.toJson()).toList(); + } + map['reviewComment'] = reviewComment; + map['comment'] = comment; + if (attachmentsWorkOrder != null) { + map['attachmentsWorkOrder'] = attachmentsWorkOrder.map((v) => v.toJson()).toList(); + } + if (equipmentStatus != null) { + map['equipmentStatus'] = equipmentStatus.toMap(); } - data['reviewComment'] = reviewComment; - data['comment'] = comment; - data['attachmentsWorkOrder'] = attachmentsWorkOrder; - data['equipmentStatus'] = equipmentStatus; if (suppEngineerWorkOrders != null) { - data['suppEngineerWorkOrders'] = suppEngineerWorkOrders.map((v) => v.toJson()).toList(); + map['suppEngineerWorkOrders'] = suppEngineerWorkOrders.map((v) => v.toJson()).toList(); + } + map['engSignature'] = engSignature; + map['nurseSignature'] = nurseSignature; + if (woParentDto != null) { + map['woParentDto'] = woParentDto.toJson(); } - data['engSignature'] = engSignature; - data['nurseSignature'] = nurseSignature; - data['woParentDto'] = woParentDto; - return data; + return map; } } -class SparePart { - int id; - String partNo; - String partName; - SparePart({ +class WoParentDto { + WoParentDto({ + this.callLastSituation, + this.supplier, + this.assetType, + this.vendorTicketNumber, + this.callId, this.id, - this.partNo, - this.partName, + this.stepsWorkOrderDto, + this.suppEngineerWorkOrders, + this.equipmentStatus, + this.currentSituation, }); - SparePart.fromJson(Map json) { + WoParentDto.fromJson(dynamic json) { + callLastSituation = json['callLastSituation'] != null ? Lookup.fromJson(json['callLastSituation']) : null; + supplier = json['supplier'] != null ? SupplierModel.fromJson(json['supplier']) : null; + assetType = json['assetType'] != null ? Lookup.fromJson(json['assetType']) : null; + vendorTicketNumber = json['vendorTicketNumber']; + callId = json['callId']; id = json['id']; - partNo = json['partNo']; - partName = json['partName']; + stepsWorkOrderDto = json['stepsWorkOrderDto'] != null ? StepsWorkOrderDto.fromJson(json['stepsWorkOrderDto']) : null; + if (json['suppEngineerWorkOrders'] != null) { + suppEngineerWorkOrders = []; + json['suppEngineerWorkOrders'].forEach((v) { + suppEngineerWorkOrders.add(SuppEngineerWorkOrders.fromJson(v)); + }); + } + equipmentStatus = json['equipmentStatus'] != null ? Lookup.fromJson(json['equipmentStatus']) : null; + currentSituation = json['currentSituation'] != null ? Lookup.fromJson(json['currentSituation']) : null; } - - SparePart copyWith({ - int id, - String partNo, - String partName, + Lookup callLastSituation; + SupplierModel supplier; + Lookup assetType; + String vendorTicketNumber; + num callId; + num id; + StepsWorkOrderDto stepsWorkOrderDto; + List suppEngineerWorkOrders; + Lookup equipmentStatus; + Lookup currentSituation; + WoParentDto copyWith({ + Lookup callLastSituation, + SupplierModel supplier, + Lookup assetType, + String vendorTicketNumber, + num callId, + num id, + StepsWorkOrderDto stepsWorkOrderDto, + List suppEngineerWorkOrders, + Lookup equipmentStatus, + Lookup currentSituation, }) => - SparePart( + WoParentDto( + callLastSituation: callLastSituation ?? this.callLastSituation, + supplier: supplier ?? this.supplier, + assetType: assetType ?? this.assetType, + vendorTicketNumber: vendorTicketNumber ?? this.vendorTicketNumber, + callId: callId ?? this.callId, id: id ?? this.id, - partNo: partNo ?? this.partNo, - partName: partName ?? this.partName, + stepsWorkOrderDto: stepsWorkOrderDto ?? this.stepsWorkOrderDto, + suppEngineerWorkOrders: suppEngineerWorkOrders ?? this.suppEngineerWorkOrders, + equipmentStatus: equipmentStatus ?? this.equipmentStatus, + currentSituation: currentSituation ?? this.currentSituation, ); - Map toJson() { final map = {}; - map['id'] = id ?? 0; - map['partNo'] = partNo; - map['partName'] = partName; + if (callLastSituation != null) { + map['callLastSituation'] = callLastSituation.toMap(); + } + if (supplier != null) { + map['supplier'] = supplier.toJson(); + } + if (assetType != null) { + map['assetType'] = assetType.toMap(); + } + map['vendorTicketNumber'] = vendorTicketNumber; + map['callId'] = callId; + map['id'] = id; + if (stepsWorkOrderDto != null) { + map['stepsWorkOrderDto'] = stepsWorkOrderDto.toJson(); + } + if (suppEngineerWorkOrders != null) { + map['suppEngineerWorkOrders'] = suppEngineerWorkOrders.map((v) => v.toJson()).toList(); + } + if (equipmentStatus != null) { + map['equipmentStatus'] = equipmentStatus.toMap(); + } + if (currentSituation != null) { + map['currentSituation'] = currentSituation.toMap(); + } return map; } } -class SparePartWorkOrder { - int id; - SparePart sparePart; - double qty; - double returnQty; - double installQty; - - SparePartWorkOrder({ +class SuppEngineerWorkOrders { + SuppEngineerWorkOrders({ this.id, - this.sparePart, - this.qty, - this.returnQty, - this.installQty, + this.supplierContactId, + this.personName, + this.personRoleName, + this.contact, + this.externalEngCode, + this.email, }); - SparePartWorkOrder.fromJson(Map json) { + SuppEngineerWorkOrders.fromJson(dynamic json) { id = json['id']; - sparePart = SparePart.fromJson(json['sparePart'] ?? {}); - qty = json['qty']; - returnQty = json['returnQty']; - installQty = json['installQty']; + supplierContactId = json['supplierContactId']; + personName = json['personName']; + personRoleName = json['personRoleName']; + contact = json['contact']; + externalEngCode = json['externalEngCode']; + email = json['email']; } - - SparePartWorkOrder copyWith({ - int id, - SparePart sparePart, - double qty, - double returnQty, - double installQty, + num id; + num supplierContactId; + String personName; + String personRoleName; + String contact; + String externalEngCode; + String email; + SuppEngineerWorkOrders copyWith({ + num id, + num supplierContactId, + String personName, + String personRoleName, + String contact, + String externalEngCode, + String email, }) => - SparePartWorkOrder( + SuppEngineerWorkOrders( id: id ?? this.id, - sparePart: sparePart ?? this.sparePart, - qty: qty ?? this.qty, - returnQty: returnQty ?? this.returnQty, - installQty: installQty ?? this.installQty, + supplierContactId: supplierContactId ?? this.supplierContactId, + personName: personName ?? this.personName, + personRoleName: personRoleName ?? this.personRoleName, + contact: contact ?? this.contact, + externalEngCode: externalEngCode ?? this.externalEngCode, + email: email ?? this.email, ); - Map toJson() { final map = {}; - map['id'] = id ?? 0; - map['sparePart'] = sparePart?.toJson(); - map['qty'] = qty; - map['returnQty'] = returnQty; - map['installQty'] = installQty; + map['id'] = id; + map['supplierContactId'] = supplierContactId; + map['personName'] = personName; + map['personRoleName'] = personRoleName; + map['contact'] = contact; + map['externalEngCode'] = externalEngCode; + map['email'] = email; return map; } } -class CallRequest { - int id; - String callNo; - Asset asset; - AssignedEmployee assignedEmployee; - List callSiteContactPerson; - Lookup status; - Lookup callLastSituation; - String defectType; - String firstAction; - String assetType; - - CallRequest({this.id, this.callNo, this.asset, this.assignedEmployee, this.callSiteContactPerson, this.status, this.callLastSituation, this.defectType, this.firstAction, this.assetType}); +class StepsWorkOrderDto { + StepsWorkOrderDto({ + this.sequence, + this.id, + this.name, + this.statusValue, + this.typeTransaction, + this.processed, + this.parentWOId, + this.callId, + }); - CallRequest.fromJson(Map json) { + StepsWorkOrderDto.fromJson(dynamic json) { + sequence = json['sequence']; id = json['id']; - callNo = json['callNo']; - asset = json['asset'] != null ? Asset.fromJson(json['asset']) : Asset(); - assignedEmployee = json['assignedEmployee'] != null ? AssignedEmployee.fromJson(json['assignedEmployee']) : AssignedEmployee(); - if (json['callSiteContactPerson'] != null) { - callSiteContactPerson = json['callSiteContactPerson']; - } - status = json['status'] != null ? Lookup.fromJson(json['status']) : const Lookup(); - callLastSituation = json['callLastSituation'] != null ? Lookup.fromJson(json['callLastSituation']) : const Lookup(); - defectType = json['defectType']; - firstAction = json['firstAction']; - assetType = json['assetType']; + name = json['name']; + statusValue = json['statusValue']; + typeTransaction = json['typeTransaction']; + processed = json['processed']; + parentWOId = json['parentWOId']; + callId = json['callId']; } - + num sequence; + num id; + String name; + num statusValue; + String typeTransaction; + bool processed; + num parentWOId; + num callId; + StepsWorkOrderDto copyWith({ + num sequence, + num id, + String name, + num statusValue, + String typeTransaction, + bool processed, + num parentWOId, + num callId, + }) => + StepsWorkOrderDto( + sequence: sequence ?? this.sequence, + id: id ?? this.id, + name: name ?? this.name, + statusValue: statusValue ?? this.statusValue, + typeTransaction: typeTransaction ?? this.typeTransaction, + processed: processed ?? this.processed, + parentWOId: parentWOId ?? this.parentWOId, + callId: callId ?? this.callId, + ); Map toJson() { - final Map data = {}; - data['id'] = id; - data['callNo'] = callNo; - if (asset != null) { - data['asset'] = asset.toJson(); - } - if (assignedEmployee != null) { - data['assignedEmployee'] = assignedEmployee.toJson(); - } - if (callSiteContactPerson != null) { - data['callSiteContactPerson'] = callSiteContactPerson.map((v) => v.toJson()).toList(); - } - if (status != null) { - data['status'] = status.toMap(); - } - if (callLastSituation != null) { - data['callLastSituation'] = callLastSituation.toMap(); - } - data['defectType'] = defectType; - data['firstAction'] = firstAction; - data['assetType'] = assetType; - return data; + final map = {}; + map['sequence'] = sequence; + map['id'] = id; + map['name'] = name; + map['statusValue'] = statusValue; + map['typeTransaction'] = typeTransaction; + map['processed'] = processed; + map['parentWOId'] = parentWOId; + map['callId'] = callId; + return map; } } -class Asset { - int id; - String assetSerialNo; - String systemID; - String assetNumber; - ModelDefinition modelDefinition; - String supplier; - String ipAddress; - String macAddress; - String portNumber; - String assetReplace; - String oldAsset; - String isParent; - String parentAsset; - int assetType; - Site site; - String building; - String floor; - String department; - String room; - String testsDay; - String purchasingPrice; - String nbv; - String currency; - String poNo; - String invoiceNumber; - String invoiceDate; - String replacementDate; - String originDepartment; - Site originSite; - String budgetYear; - String lastPOPrice; - String commissioningStatus; - String productionDate; - String edd; - String technicalInspectionDate; - String deliveryInspectionDate; - String endUserAcceptanceDate; - String receivingCommittee; - String siteWarrantyMonths; - String extendedWarrantyMonths; - String remainderWarrantyMonths; - String eomWarrantyMonthsNo; - String warrantyValue; - String warrantyEndDate; - String warrantyContractConditions; - List technicalGuidanceBooks; - String comment; - String tagCode; +class SupplierModel { + SupplierModel({ + this.id, + this.suppliername, + this.name, + this.website, + this.email, + this.code, + this.suppNo, + this.suppStatusId, + this.cityId, + this.person, + this.comment, + this.zipcode, + this.contact, + this.telephones, + this.faxes, + this.addresses, + this.attachments, + this.suppPersons, + this.suppTCodes, + }); - Asset( - {this.id, - this.assetSerialNo, - this.systemID, - this.assetNumber, - this.modelDefinition, - this.supplier, - this.ipAddress, - this.macAddress, - this.portNumber, - this.assetReplace, - this.oldAsset, - this.isParent, - this.parentAsset, - this.assetType, - this.site, - this.building, - this.floor, - this.department, - this.room, - this.testsDay, - this.purchasingPrice, - this.nbv, - this.currency, - this.poNo, - this.invoiceNumber, - this.invoiceDate, - this.replacementDate, - this.originDepartment, - this.originSite, - this.budgetYear, - this.lastPOPrice, - this.commissioningStatus, - this.productionDate, - this.edd, - this.technicalInspectionDate, - this.deliveryInspectionDate, - this.endUserAcceptanceDate, - this.receivingCommittee, - this.siteWarrantyMonths, - this.extendedWarrantyMonths, - this.remainderWarrantyMonths, - this.eomWarrantyMonthsNo, - this.warrantyValue, - this.warrantyEndDate, - this.warrantyContractConditions, - this.technicalGuidanceBooks, - this.comment, - this.tagCode}); - - Asset.fromJson(Map json) { + SupplierModel.fromJson(dynamic json) { id = json['id']; - assetSerialNo = json['assetSerialNo']; - systemID = json['systemID']; - assetNumber = json['assetNumber']; - modelDefinition = json['modelDefinition'] != null ? ModelDefinition.fromJson(json['modelDefinition']) : ModelDefinition(); - supplier = json['supplier']; - ipAddress = json['ipAddress']; - macAddress = json['macAddress']; - portNumber = json['portNumber']; - assetReplace = json['assetReplace']; - oldAsset = json['oldAsset']; - isParent = json['isParent']; - parentAsset = json['parentAsset']; - assetType = json['assetType']; - site = json['site'] != null ? Site.fromJson(json['site']) : Site(); - building = json['building']; - floor = json['floor']; - department = json['department']; - } - - Map toJson() { - final Map data = {}; - data['id'] = id; - data['assetSerialNo'] = assetSerialNo; - data['systemID'] = systemID; - data['assetNumber'] = assetNumber; - if (modelDefinition != null) { - data['modelDefinition'] = modelDefinition.toJson(); - } - data['supplier'] = supplier; - data['ipAddress'] = ipAddress; - data['macAddress'] = macAddress; - data['portNumber'] = portNumber; - data['assetReplace'] = assetReplace; - data['oldAsset'] = oldAsset; - data['isParent'] = isParent; - data['parentAsset'] = parentAsset; - data['assetType'] = assetType; - if (site != null) { - data['site'] = site.toJson(); - } - data['building'] = building; - data['floor'] = floor; - data['department'] = department; - data['room'] = room; - data['testsDay'] = testsDay; - data['purchasingPrice'] = purchasingPrice; - data['nbv'] = nbv; - data['currency'] = currency; - data['poNo'] = poNo; - data['invoiceNumber'] = invoiceNumber; - data['invoiceDate'] = invoiceDate; - data['replacementDate'] = replacementDate; - data['originDepartment'] = originDepartment; - if (originSite != null) { - data['originSite'] = originSite.toJson(); - } - data['budgetYear'] = budgetYear; - data['lastPOPrice'] = lastPOPrice; - data['commissioningStatus'] = commissioningStatus; - data['productionDate'] = productionDate; - if (edd != null) data['edd'] = edd; - data['technicalInspectionDate'] = technicalInspectionDate; - data['deliveryInspectionDate'] = deliveryInspectionDate; - data['endUserAcceptanceDate'] = endUserAcceptanceDate; - data['receivingCommittee'] = receivingCommittee; - data['siteWarrantyMonths'] = siteWarrantyMonths; - data['extendedWarrantyMonths'] = extendedWarrantyMonths; - data['remainderWarrantyMonths'] = remainderWarrantyMonths; - data['eomWarrantyMonthsNo'] = eomWarrantyMonthsNo; - data['warrantyValue'] = warrantyValue; - data['warrantyEndDate'] = warrantyEndDate; - data['warrantyContractConditions'] = warrantyContractConditions; - if (technicalGuidanceBooks != null) { - data['technicalGuidanceBooks'] = technicalGuidanceBooks.map((v) => v.toJson()).toList(); + suppliername = json['suppliername']; + name = json['name']; + website = json['website']; + email = json['email']; + code = json['code']; + suppNo = json['suppNo']; + suppStatusId = json['suppStatusId']; + cityId = json['cityId']; + person = json['person']; + comment = json['comment']; + zipcode = json['zipcode']; + contact = json['contact']; + if (json['telephones'] != null) { + telephones = []; + json['telephones'].forEach((v) { + telephones.add(Telephones.fromJson(v)); + }); } - data['comment'] = comment; - data['tagCode'] = tagCode; - return data; - } -} - -class ModelDefinition { - int id; - String assetName; - String modelDefCode; - String modelName; - int manufacturerId; - String manufacturerName; - String supplierName; - String replacementDate; - int lifeSpan; - List modelDefRelatedDefects; - List suppliers; - - ModelDefinition( - {this.id, - this.assetName, - this.modelDefCode, - this.modelName, - this.manufacturerId, - this.manufacturerName, - this.supplierName, - this.replacementDate, - this.lifeSpan, - this.modelDefRelatedDefects, - this.suppliers}); - - ModelDefinition.fromJson(Map json) { - id = json['id']; - assetName = json['assetName']; - modelDefCode = json['modelDefCode']; - modelName = json['modelName']; - manufacturerId = json['manufacturerId']; - manufacturerName = json['manufacturerName']; - supplierName = json['supplierName']; - replacementDate = json['replacementDate']; - lifeSpan = json['lifeSpan']; - if (json['modelDefRelatedDefects'] != null) { - modelDefRelatedDefects = []; - json['modelDefRelatedDefects'].forEach((v) { - modelDefRelatedDefects.add(ModelDefRelatedDefects.fromJson(v)); + if (json['faxes'] != null) { + faxes = []; + json['faxes'].forEach((v) { + faxes.add(Faxes.fromJson(v)); }); } - if (json['suppliers'] != null) { - suppliers = json['suppliers']; + if (json['addresses'] != null) { + addresses = []; + json['addresses'].forEach((v) { + addresses.add(Addresses.fromJson(v)); + }); + } + if (json['attachments'] != null) { + attachments = []; + json['attachments'].forEach((v) { + attachments.add(Attachments.fromJson(v)); + }); + } + if (json['suppPersons'] != null) { + suppPersons = []; + json['suppPersons'].forEach((v) { + suppPersons.add(SuppPersons.fromJson(v)); + }); + } + if (json['suppTCodes'] != null) { + suppTCodes = []; + json['suppTCodes'].forEach((v) { + suppTCodes.add(SuppTCodes.fromJson(v)); + }); } } - + num id; + String suppliername; + String name; + String website; + String email; + String code; + num suppNo; + num suppStatusId; + num cityId; + String person; + String comment; + num zipcode; + String contact; + List telephones; + List faxes; + List addresses; + List attachments; + List suppPersons; + List suppTCodes; + SupplierModel copyWith({ + num id, + String suppliername, + String name, + String website, + String email, + String code, + num suppNo, + num suppStatusId, + num cityId, + String person, + String comment, + num zipcode, + String contact, + List telephones, + List faxes, + List addresses, + List attachments, + List suppPersons, + List suppTCodes, + }) => + SupplierModel( + id: id ?? this.id, + suppliername: suppliername ?? this.suppliername, + name: name ?? this.name, + website: website ?? this.website, + email: email ?? this.email, + code: code ?? this.code, + suppNo: suppNo ?? this.suppNo, + suppStatusId: suppStatusId ?? this.suppStatusId, + cityId: cityId ?? this.cityId, + person: person ?? this.person, + comment: comment ?? this.comment, + zipcode: zipcode ?? this.zipcode, + contact: contact ?? this.contact, + telephones: telephones ?? this.telephones, + faxes: faxes ?? this.faxes, + addresses: addresses ?? this.addresses, + attachments: attachments ?? this.attachments, + suppPersons: suppPersons ?? this.suppPersons, + suppTCodes: suppTCodes ?? this.suppTCodes, + ); Map toJson() { - final Map data = {}; - data['id'] = id; - data['assetName'] = assetName; - data['modelDefCode'] = modelDefCode; - data['modelName'] = modelName; - data['manufacturerId'] = manufacturerId; - data['manufacturerName'] = manufacturerName; - data['supplierName'] = supplierName; - data['replacementDate'] = replacementDate; - data['lifeSpan'] = lifeSpan; - if (modelDefRelatedDefects != null) { - data['modelDefRelatedDefects'] = modelDefRelatedDefects.map((v) => v.toJson()).toList(); + final map = {}; + map['id'] = id; + map['suppliername'] = suppliername; + map['name'] = name; + map['website'] = website; + map['email'] = email; + map['code'] = code; + map['suppNo'] = suppNo; + map['suppStatusId'] = suppStatusId; + map['cityId'] = cityId; + map['person'] = person; + map['comment'] = comment; + map['zipcode'] = zipcode; + map['contact'] = contact; + if (telephones != null) { + map['telephones'] = telephones.map((v) => v.toJson()).toList(); } - if (suppliers != null) { - data['suppliers'] = suppliers.map((v) => v.toJson()).toList(); + if (faxes != null) { + map['faxes'] = faxes.map((v) => v.toJson()).toList(); + } + if (addresses != null) { + map['addresses'] = addresses.map((v) => v.toJson()).toList(); + } + if (attachments != null) { + map['attachments'] = attachments.map((v) => v.toJson()).toList(); } - return data; + if (suppPersons != null) { + map['suppPersons'] = suppPersons.map((v) => v.toJson()).toList(); + } + if (suppTCodes != null) { + map['suppTCodes'] = suppTCodes.map((v) => v.toJson()).toList(); + } + return map; } } -class ModelDefRelatedDefects { - int id; - String defectName; - String workPerformed; - String estimatedTime; - - ModelDefRelatedDefects({this.id, this.defectName, this.workPerformed, this.estimatedTime}); +class SuppTCodes { + SuppTCodes({ + this.id, + this.supplierId, + this.codeTypeId, + this.codeValue, + }); - ModelDefRelatedDefects.fromJson(Map json) { + SuppTCodes.fromJson(dynamic json) { id = json['id']; - defectName = json['defectName']; - workPerformed = json['workPerformed']; - estimatedTime = json['estimatedTime']; + supplierId = json['supplierId']; + codeTypeId = json['codeTypeId']; + codeValue = json['codeValue']; } - + num id; + num supplierId; + num codeTypeId; + String codeValue; + SuppTCodes copyWith({ + num id, + num supplierId, + num codeTypeId, + String codeValue, + }) => + SuppTCodes( + id: id ?? this.id, + supplierId: supplierId ?? this.supplierId, + codeTypeId: codeTypeId ?? this.codeTypeId, + codeValue: codeValue ?? this.codeValue, + ); Map toJson() { - final Map data = {}; - data['id'] = id; - data['defectName'] = defectName; - data['workPerformed'] = workPerformed; - data['estimatedTime'] = estimatedTime; - return data; + final map = {}; + map['id'] = id; + map['supplierId'] = supplierId; + map['codeTypeId'] = codeTypeId; + map['codeValue'] = codeValue; + return map; } } -class Site { - int id; - int customerCode; - String custName; - List buildings; - - Site({this.id, this.customerCode, this.custName, this.buildings}); +class SuppPersons { + SuppPersons({ + this.id, + this.supplierId, + this.personName, + this.personRoleId, + this.contact, + this.externalEngCode, + this.email, + }); - Site.fromJson(Map json) { + SuppPersons.fromJson(dynamic json) { id = json['id']; - customerCode = json['customerCode']; - custName = json['custName']; - if (json['buildings'] != null) { - buildings = json['buildings']; - } + supplierId = json['supplierId']; + personName = json['personName']; + personRoleId = json['personRoleId']; + contact = json['contact']; + externalEngCode = json['externalEngCode']; + email = json['email']; } - + num id; + num supplierId; + String personName; + num personRoleId; + String contact; + String externalEngCode; + String email; + SuppPersons copyWith({ + num id, + num supplierId, + String personName, + num personRoleId, + String contact, + String externalEngCode, + String email, + }) => + SuppPersons( + id: id ?? this.id, + supplierId: supplierId ?? this.supplierId, + personName: personName ?? this.personName, + personRoleId: personRoleId ?? this.personRoleId, + contact: contact ?? this.contact, + externalEngCode: externalEngCode ?? this.externalEngCode, + email: email ?? this.email, + ); Map toJson() { - final Map data = {}; - data['id'] = id; - data['customerCode'] = customerCode; - data['custName'] = custName; + final map = {}; + map['id'] = id; + map['supplierId'] = supplierId; + map['personName'] = personName; + map['personRoleId'] = personRoleId; + map['contact'] = contact; + map['externalEngCode'] = externalEngCode; + map['email'] = email; + return map; + } +} + +class Attachments { + Attachments({ + this.id, + this.supplierId, + this.attachmentName, + this.attachmentURL, + }); + + Attachments.fromJson(dynamic json) { + id = json['id']; + supplierId = json['supplierId']; + attachmentName = json['attachmentName']; + attachmentURL = json['attachmentURL']; + } + num id; + num supplierId; + String attachmentName; + String attachmentURL; + Attachments copyWith({ + num id, + num supplierId, + String attachmentName, + String attachmentURL, + }) => + Attachments( + id: id ?? this.id, + supplierId: supplierId ?? this.supplierId, + attachmentName: attachmentName ?? this.attachmentName, + attachmentURL: attachmentURL ?? this.attachmentURL, + ); + Map toJson() { + final map = {}; + map['id'] = id; + map['supplierId'] = supplierId; + map['attachmentName'] = attachmentName; + map['attachmentURL'] = attachmentURL; + return map; + } +} + +class Addresses { + Addresses({ + this.id, + this.supplierId, + this.address, + }); + + Addresses.fromJson(dynamic json) { + id = json['id']; + supplierId = json['supplierId']; + address = json['address']; + } + num id; + num supplierId; + String address; + Addresses copyWith({ + num id, + num supplierId, + String address, + }) => + Addresses( + id: id ?? this.id, + supplierId: supplierId ?? this.supplierId, + address: address ?? this.address, + ); + Map toJson() { + final map = {}; + map['id'] = id; + map['supplierId'] = supplierId; + map['address'] = address; + return map; + } +} + +class Faxes { + Faxes({ + this.id, + this.supplierId, + this.fax, + }); + + Faxes.fromJson(dynamic json) { + id = json['id']; + supplierId = json['supplierId']; + fax = json['fax']; + } + num id; + num supplierId; + String fax; + Faxes copyWith({ + num id, + num supplierId, + String fax, + }) => + Faxes( + id: id ?? this.id, + supplierId: supplierId ?? this.supplierId, + fax: fax ?? this.fax, + ); + Map toJson() { + final map = {}; + map['id'] = id; + map['supplierId'] = supplierId; + map['fax'] = fax; + return map; + } +} + +class Telephones { + Telephones({ + this.id, + this.supplierId, + this.telephone, + }); + + Telephones.fromJson(dynamic json) { + id = json['id']; + supplierId = json['supplierId']; + telephone = json['telephone']; + } + num id; + num supplierId; + String telephone; + Telephones copyWith({ + num id, + num supplierId, + String telephone, + }) => + Telephones( + id: id ?? this.id, + supplierId: supplierId ?? this.supplierId, + telephone: telephone ?? this.telephone, + ); + Map toJson() { + final map = {}; + map['id'] = id; + map['supplierId'] = supplierId; + map['telephone'] = telephone; + return map; + } +} + +class AttachmentsWorkOrder { + AttachmentsWorkOrder({ + this.id, + this.name, + }); + + AttachmentsWorkOrder.fromJson(dynamic json) { + id = json['id']; + name = json['name']; + } + num id; + String name; + AttachmentsWorkOrder copyWith({ + num id, + String name, + }) => + AttachmentsWorkOrder( + id: id ?? this.id, + name: name ?? this.name, + ); + Map toJson() { + final map = {}; + map['id'] = id; + map['name'] = name; + return map; + } +} + +class SparePartsWorkOrders { + SparePartsWorkOrders({ + this.id, + this.sparePart, + this.qty, + this.returnQty, + this.installQty, + }); + + SparePartsWorkOrders.fromJson(dynamic json) { + id = json['id']; + sparePart = json['sparePart'] != null ? SparePart.fromJson(json['sparePart']) : null; + qty = json['qty']; + returnQty = json['returnQty']; + installQty = json['installQty']; + } + num id; + SparePart sparePart; + num qty; + num returnQty; + num installQty; + SparePartsWorkOrders copyWith({ + num id, + SparePart sparePart, + num qty, + num returnQty, + num installQty, + }) => + SparePartsWorkOrders( + id: id ?? this.id, + sparePart: sparePart ?? this.sparePart, + qty: qty ?? this.qty, + returnQty: returnQty ?? this.returnQty, + installQty: installQty ?? this.installQty, + ); + Map toJson() { + final map = {}; + map['id'] = id; + if (sparePart != null) { + map['sparePart'] = sparePart.toJson(); + } + map['qty'] = qty; + map['returnQty'] = returnQty; + map['installQty'] = installQty; + return map; + } +} + +class SparePart { + SparePart({ + this.id, + this.partNo, + this.partName, + }); + + SparePart.fromJson(dynamic json) { + id = json['id']; + partNo = json['partNo']; + partName = json['partName']; + } + num id; + String partNo; + String partName; + SparePart copyWith({ + num id, + String partNo, + String partName, + }) => + SparePart( + id: id ?? this.id, + partNo: partNo ?? this.partNo, + partName: partName ?? this.partName, + ); + Map toJson() { + final map = {}; + map['id'] = id; + map['partNo'] = partNo; + map['partName'] = partName; + return map; + } +} + +class FaultDescription { + FaultDescription({ + this.id, + this.defectName, + this.workPerformed, + this.estimatedTime, + }); + + FaultDescription.fromJson(dynamic json) { + id = json['id']; + defectName = json['defectName']; + workPerformed = json['workPerformed']; + estimatedTime = json['estimatedTime']; + } + num id; + String defectName; + String workPerformed; + String estimatedTime; + FaultDescription copyWith({ + num id, + String defectName, + String workPerformed, + String estimatedTime, + }) => + FaultDescription( + id: id ?? this.id, + defectName: defectName ?? this.defectName, + workPerformed: workPerformed ?? this.workPerformed, + estimatedTime: estimatedTime ?? this.estimatedTime, + ); + Map toJson() { + final map = {}; + map['id'] = id; + map['defectName'] = defectName; + map['workPerformed'] = workPerformed; + map['estimatedTime'] = estimatedTime; + return map; + } +} + +class Reason { + Reason({ + this.id, + this.name, + this.value, + }); + + Reason.fromJson(dynamic json) { + id = json['id']; + name = json['name']; + value = json['value']; + } + num id; + String name; + num value; + Reason copyWith({ + num id, + String name, + num value, + }) => + Reason( + id: id ?? this.id, + name: name ?? this.name, + value: value ?? this.value, + ); + Map toJson() { + final map = {}; + map['id'] = id; + map['name'] = name; + map['value'] = value; + return map; + } +} + +class ContactPersonWorkOrders { + ContactPersonWorkOrders({ + this.id, + this.employeeCode, + this.name, + this.telephone, + this.job, + this.email, + this.land, + this.contactUserId, + }); + + ContactPersonWorkOrders.fromJson(dynamic json) { + id = json['id']; + employeeCode = json['employeeCode']; + name = json['name']; + telephone = json['telephone']; + job = json['job']; + email = json['email']; + land = json['land']; + contactUserId = json['contactUserId']; + } + num id; + String employeeCode; + String name; + String telephone; + String job; + String email; + String land; + String contactUserId; + ContactPersonWorkOrders copyWith({ + num id, + String employeeCode, + String name, + String telephone, + String job, + String email, + String land, + String contactUserId, + }) => + ContactPersonWorkOrders( + id: id ?? this.id, + employeeCode: employeeCode ?? this.employeeCode, + name: name ?? this.name, + telephone: telephone ?? this.telephone, + job: job ?? this.job, + email: email ?? this.email, + land: land ?? this.land, + contactUserId: contactUserId ?? this.contactUserId, + ); + Map toJson() { + final map = {}; + map['id'] = id; + map['employeeCode'] = employeeCode; + map['name'] = name; + map['telephone'] = telephone; + map['job'] = job; + map['email'] = email; + map['land'] = land; + map['contactUserId'] = contactUserId; + return map; + } +} + +class AssistantEmployees { + AssistantEmployees({ + this.id, + this.user, + }); + + AssistantEmployees.fromJson(dynamic json) { + id = json['id']; + user = json['user'] != null ? UserModel.fromJson(json['user']) : null; + } + num id; + UserModel user; + AssistantEmployees copyWith({ + num id, + UserModel user, + }) => + AssistantEmployees( + id: id ?? this.id, + user: user ?? this.user, + ); + Map toJson() { + final map = {}; + map['id'] = id; + if (user != null) { + map['user'] = user.toJson(); + } + return map; + } +} + +class UserModel { + UserModel({ + this.id, + this.name, + }); + + UserModel.fromJson(dynamic json) { + id = json['id']; + name = json['name']; + } + String id; + String name; + UserModel copyWith({ + String id, + String name, + }) => + UserModel( + id: id ?? this.id, + name: name ?? this.name, + ); + Map toJson() { + final map = {}; + map['id'] = id; + map['name'] = name; + return map; + } +} + +class AssignedEmployee { + AssignedEmployee({ + this.id, + this.name, + }); + + AssignedEmployee.fromJson(dynamic json) { + id = json['id']; + name = json['name']; + } + String id; + String name; + AssignedEmployee copyWith({ + String id, + String name, + }) => + AssignedEmployee( + id: id ?? this.id, + name: name ?? this.name, + ); + Map toJson() { + final map = {}; + map['id'] = id; + map['name'] = name; + return map; + } +} + +class CallRequest { + CallRequest({ + this.id, + this.callNo, + this.callComments, + this.asset, + this.assignedEmployee, + this.callSiteContactPerson, + this.status, + this.callLastSituation, + this.defectType, + this.firstAction, + this.assetType, + }); + + CallRequest.fromJson(dynamic json) { + id = json['id']; + callNo = json['callNo']; + callComments = json['callComments']; + asset = json['asset'] != null ? Asset.fromJson(json['asset']) : null; + assignedEmployee = json['assignedEmployee'] != null ? AssignedEmployee.fromJson(json['assignedEmployee']) : null; + if (json['callSiteContactPerson'] != null) { + callSiteContactPerson = []; + json['callSiteContactPerson'].forEach((v) { + callSiteContactPerson.add(CallSiteContactPerson.fromJson(v)); + }); + } + status = json['status'] != null ? Status.fromJson(json['status']) : null; + callLastSituation = json['callLastSituation'] != null ? Lookup.fromJson(json['callLastSituation']) : null; + defectType = json['defectType'] != null ? DefectType.fromJson(json['defectType']) : null; + firstAction = json['firstAction'] != null ? FirstAction.fromJson(json['firstAction']) : null; + assetType = json['assetType']; + } + num id; + String callNo; + String callComments; + Asset asset; + AssignedEmployee assignedEmployee; + List callSiteContactPerson; + Status status; + Lookup callLastSituation; + DefectType defectType; + FirstAction firstAction; + num assetType; + CallRequest copyWith({ + num id, + String callNo, + String callComments, + Asset asset, + AssignedEmployee assignedEmployee, + List callSiteContactPerson, + Status status, + Lookup callLastSituation, + DefectType defectType, + FirstAction firstAction, + num assetType, + }) => + CallRequest( + id: id ?? this.id, + callNo: callNo ?? this.callNo, + callComments: callComments ?? this.callComments, + asset: asset ?? this.asset, + assignedEmployee: assignedEmployee ?? this.assignedEmployee, + callSiteContactPerson: callSiteContactPerson ?? this.callSiteContactPerson, + status: status ?? this.status, + callLastSituation: callLastSituation ?? this.callLastSituation, + defectType: defectType ?? this.defectType, + firstAction: firstAction ?? this.firstAction, + assetType: assetType ?? this.assetType, + ); + Map toJson() { + final map = {}; + map['id'] = id; + map['callNo'] = callNo; + map['callComments'] = callComments; + if (asset != null) { + map['asset'] = asset.toJson(); + } + if (assignedEmployee != null) { + map['assignedEmployee'] = assignedEmployee.toJson(); + } + if (callSiteContactPerson != null) { + map['callSiteContactPerson'] = callSiteContactPerson.map((v) => v.toJson()).toList(); + } + if (status != null) { + map['status'] = status.toJson(); + } + if (callLastSituation != null) { + map['callLastSituation'] = callLastSituation.toMap(); + } + if (defectType != null) { + map['defectType'] = defectType.toJson(); + } + if (firstAction != null) { + map['firstAction'] = firstAction.toJson(); + } + map['assetType'] = assetType; + return map; + } +} + +class FirstAction { + FirstAction({ + this.id, + this.name, + this.value, + }); + + FirstAction.fromJson(dynamic json) { + id = json['id']; + name = json['name']; + value = json['value']; + } + num id; + String name; + num value; + FirstAction copyWith({ + num id, + String name, + num value, + }) => + FirstAction( + id: id ?? this.id, + name: name ?? this.name, + value: value ?? this.value, + ); + Map toJson() { + final map = {}; + map['id'] = id; + map['name'] = name; + map['value'] = value; + return map; + } +} + +class DefectType { + DefectType({ + this.id, + this.name, + this.value, + }); + + DefectType.fromJson(dynamic json) { + id = json['id']; + name = json['name']; + value = json['value']; + } + num id; + String name; + num value; + DefectType copyWith({ + num id, + String name, + num value, + }) => + DefectType( + id: id ?? this.id, + name: name ?? this.name, + value: value ?? this.value, + ); + Map toJson() { + final map = {}; + map['id'] = id; + map['name'] = name; + map['value'] = value; + return map; + } +} + +class Status { + Status({ + this.id, + this.name, + this.value, + }); + + Status.fromJson(dynamic json) { + id = json['id']; + name = json['name']; + value = json['value']; + } + num id; + String name; + num value; + Status copyWith({ + num id, + String name, + num value, + }) => + Status( + id: id ?? this.id, + name: name ?? this.name, + value: value ?? this.value, + ); + Map toJson() { + final map = {}; + map['id'] = id; + map['name'] = name; + map['value'] = value; + return map; + } +} + +class CallSiteContactPerson { + CallSiteContactPerson({ + this.id, + this.employeeCode, + this.name, + this.telephone, + this.job, + this.email, + this.land, + this.contactUserId, + }); + + CallSiteContactPerson.fromJson(dynamic json) { + id = json['id']; + employeeCode = json['employeeCode']; + name = json['name']; + telephone = json['telephone']; + job = json['job']; + email = json['email']; + land = json['land']; + contactUserId = json['contactUserId']; + } + num id; + String employeeCode; + String name; + String telephone; + String job; + String email; + String land; + String contactUserId; + CallSiteContactPerson copyWith({ + num id, + String employeeCode, + String name, + String telephone, + String job, + String email, + String land, + String contactUserId, + }) => + CallSiteContactPerson( + id: id ?? this.id, + employeeCode: employeeCode ?? this.employeeCode, + name: name ?? this.name, + telephone: telephone ?? this.telephone, + job: job ?? this.job, + email: email ?? this.email, + land: land ?? this.land, + contactUserId: contactUserId ?? this.contactUserId, + ); + Map toJson() { + final map = {}; + map['id'] = id; + map['employeeCode'] = employeeCode; + map['name'] = name; + map['telephone'] = telephone; + map['job'] = job; + map['email'] = email; + map['land'] = land; + map['contactUserId'] = contactUserId; + return map; + } +} + +class Asset { + Asset({ + this.id, + this.assetSerialNo, + this.systemID, + this.assetNumber, + this.modelDefinition, + this.supplier, + this.ipAddress, + this.macAddress, + this.portNumber, + this.assetReplace, + this.oldAsset, + this.isParent, + this.parentAsset, + this.assetType, + this.site, + this.building, + this.floor, + this.department, + this.room, + this.testsDay, + this.purchasingPrice, + this.nbv, + this.currency, + this.poNo, + this.invoiceNumber, + this.invoiceDate, + this.replacementDate, + this.originDepartment, + this.originSite, + this.budgetYear, + this.lastPOPrice, + this.commissioningStatus, + this.productionDate, + this.edd, + this.technicalInspectionDate, + this.deliveryInspectionDate, + this.endUserAcceptanceDate, + this.receivingCommittee, + this.siteWarrantyMonths, + this.extendedWarrantyMonths, + this.remainderWarrantyMonths, + this.eomWarrantyMonthsNo, + this.warrantyValue, + this.warrantyEndDate, + this.warrantyContractConditions, + this.technicalGuidanceBooks, + this.comment, + this.tagCode, + }); + + Asset.fromJson(dynamic json) { + id = json['id']; + assetSerialNo = json['assetSerialNo']; + systemID = json['systemID']; + assetNumber = json['assetNumber']; + modelDefinition = json['modelDefinition'] != null ? ModelDefinition.fromJson(json['modelDefinition']) : null; + supplier = json['supplier'] != null ? SupplierModel.fromJson(json['supplier']) : null; + ipAddress = json['ipAddress']; + macAddress = json['macAddress']; + portNumber = json['portNumber']; + assetReplace = json['assetReplace'] != null ? AssetReplace.fromJson(json['assetReplace']) : null; + oldAsset = json['oldAsset'] != null ? OldAsset.fromJson(json['oldAsset']) : null; + isParent = json['isParent'] != null ? IsParent.fromJson(json['isParent']) : null; + parentAsset = json['parentAsset'] != null ? ParentAsset.fromJson(json['parentAsset']) : null; + assetType = json['assetType'] != null ? Lookup.fromJson(json['assetType']) : null; + site = json['site'] != null ? Site.fromJson(json['site']) : null; + building = json['building'] != null ? Building.fromJson(json['building']) : null; + floor = json['floor'] != null ? Floor.fromJson(json['floor']) : null; + department = json['department'] != null ? Department.fromJson(json['department']) : null; + room = json['room']; + testsDay = json['testsDay']; + purchasingPrice = json['purchasingPrice']; + nbv = json['nbv']; + currency = json['currency'] != null ? Currency.fromJson(json['currency']) : null; + poNo = json['poNo']; + invoiceNumber = json['invoiceNumber']; + invoiceDate = json['invoiceDate']; + replacementDate = json['replacementDate']; + originDepartment = json['originDepartment'] != null ? OriginDepartment.fromJson(json['originDepartment']) : null; + originSite = json['originSite'] != null ? OriginSite.fromJson(json['originSite']) : null; + budgetYear = json['budgetYear']; + lastPOPrice = json['lastPOPrice']; + commissioningStatus = json['commissioningStatus'] != null ? CommissioningStatus.fromJson(json['commissioningStatus']) : null; + productionDate = json['productionDate']; + edd = json['edd']; + technicalInspectionDate = json['technicalInspectionDate']; + deliveryInspectionDate = json['deliveryInspectionDate']; + endUserAcceptanceDate = json['endUserAcceptanceDate']; + receivingCommittee = json['receivingCommittee']; + siteWarrantyMonths = json['siteWarrantyMonths'] != null ? SiteWarrantyMonths.fromJson(json['siteWarrantyMonths']) : null; + extendedWarrantyMonths = json['extendedWarrantyMonths'] != null ? ExtendedWarrantyMonths.fromJson(json['extendedWarrantyMonths']) : null; + remainderWarrantyMonths = json['remainderWarrantyMonths'] != null ? RemainderWarrantyMonths.fromJson(json['remainderWarrantyMonths']) : null; + eomWarrantyMonthsNo = json['eomWarrantyMonthsNo']; + warrantyValue = json['warrantyValue']; + warrantyEndDate = json['warrantyEndDate']; + warrantyContractConditions = json['warrantyContractConditions']; + if (json['technicalGuidanceBooks'] != null) { + technicalGuidanceBooks = []; + json['technicalGuidanceBooks'].forEach((v) { + technicalGuidanceBooks.add(TechnicalGuidanceBooks.fromJson(v)); + }); + } + comment = json['comment']; + tagCode = json['tagCode']; + } + num id; + String assetSerialNo; + String systemID; + String assetNumber; + ModelDefinition modelDefinition; + SupplierModel supplier; + String ipAddress; + String macAddress; + String portNumber; + AssetReplace assetReplace; + OldAsset oldAsset; + IsParent isParent; + ParentAsset parentAsset; + Lookup assetType; + Site site; + Building building; + Floor floor; + Department department; + String room; + num testsDay; + num purchasingPrice; + String nbv; + Currency currency; + String poNo; + String invoiceNumber; + String invoiceDate; + String replacementDate; + OriginDepartment originDepartment; + OriginSite originSite; + num budgetYear; + num lastPOPrice; + CommissioningStatus commissioningStatus; + String productionDate; + String edd; + String technicalInspectionDate; + String deliveryInspectionDate; + String endUserAcceptanceDate; + String receivingCommittee; + SiteWarrantyMonths siteWarrantyMonths; + ExtendedWarrantyMonths extendedWarrantyMonths; + RemainderWarrantyMonths remainderWarrantyMonths; + num eomWarrantyMonthsNo; + num warrantyValue; + String warrantyEndDate; + String warrantyContractConditions; + List technicalGuidanceBooks; + String comment; + String tagCode; + Asset copyWith({ + num id, + String assetSerialNo, + String systemID, + String assetNumber, + ModelDefinition modelDefinition, + SupplierModel supplier, + String ipAddress, + String macAddress, + String portNumber, + AssetReplace assetReplace, + OldAsset oldAsset, + IsParent isParent, + ParentAsset parentAsset, + Lookup assetType, + Site site, + Building building, + Floor floor, + Department department, + String room, + num testsDay, + num purchasingPrice, + String nbv, + Currency currency, + String poNo, + String invoiceNumber, + String invoiceDate, + String replacementDate, + OriginDepartment originDepartment, + OriginSite originSite, + num budgetYear, + num lastPOPrice, + CommissioningStatus commissioningStatus, + String productionDate, + String edd, + String technicalInspectionDate, + String deliveryInspectionDate, + String endUserAcceptanceDate, + String receivingCommittee, + SiteWarrantyMonths siteWarrantyMonths, + ExtendedWarrantyMonths extendedWarrantyMonths, + RemainderWarrantyMonths remainderWarrantyMonths, + num eomWarrantyMonthsNo, + num warrantyValue, + String warrantyEndDate, + String warrantyContractConditions, + List technicalGuidanceBooks, + String comment, + String tagCode, + }) => + Asset( + id: id ?? this.id, + assetSerialNo: assetSerialNo ?? this.assetSerialNo, + systemID: systemID ?? this.systemID, + assetNumber: assetNumber ?? this.assetNumber, + modelDefinition: modelDefinition ?? this.modelDefinition, + supplier: supplier ?? this.supplier, + ipAddress: ipAddress ?? this.ipAddress, + macAddress: macAddress ?? this.macAddress, + portNumber: portNumber ?? this.portNumber, + assetReplace: assetReplace ?? this.assetReplace, + oldAsset: oldAsset ?? this.oldAsset, + isParent: isParent ?? this.isParent, + parentAsset: parentAsset ?? this.parentAsset, + assetType: assetType ?? this.assetType, + site: site ?? this.site, + building: building ?? this.building, + floor: floor ?? this.floor, + department: department ?? this.department, + room: room ?? this.room, + testsDay: testsDay ?? this.testsDay, + purchasingPrice: purchasingPrice ?? this.purchasingPrice, + nbv: nbv ?? this.nbv, + currency: currency ?? this.currency, + poNo: poNo ?? this.poNo, + invoiceNumber: invoiceNumber ?? this.invoiceNumber, + invoiceDate: invoiceDate ?? this.invoiceDate, + replacementDate: replacementDate ?? this.replacementDate, + originDepartment: originDepartment ?? this.originDepartment, + originSite: originSite ?? this.originSite, + budgetYear: budgetYear ?? this.budgetYear, + lastPOPrice: lastPOPrice ?? this.lastPOPrice, + commissioningStatus: commissioningStatus ?? this.commissioningStatus, + productionDate: productionDate ?? this.productionDate, + edd: edd ?? this.edd, + technicalInspectionDate: technicalInspectionDate ?? this.technicalInspectionDate, + deliveryInspectionDate: deliveryInspectionDate ?? this.deliveryInspectionDate, + endUserAcceptanceDate: endUserAcceptanceDate ?? this.endUserAcceptanceDate, + receivingCommittee: receivingCommittee ?? this.receivingCommittee, + siteWarrantyMonths: siteWarrantyMonths ?? this.siteWarrantyMonths, + extendedWarrantyMonths: extendedWarrantyMonths ?? this.extendedWarrantyMonths, + remainderWarrantyMonths: remainderWarrantyMonths ?? this.remainderWarrantyMonths, + eomWarrantyMonthsNo: eomWarrantyMonthsNo ?? this.eomWarrantyMonthsNo, + warrantyValue: warrantyValue ?? this.warrantyValue, + warrantyEndDate: warrantyEndDate ?? this.warrantyEndDate, + warrantyContractConditions: warrantyContractConditions ?? this.warrantyContractConditions, + technicalGuidanceBooks: technicalGuidanceBooks ?? this.technicalGuidanceBooks, + comment: comment ?? this.comment, + tagCode: tagCode ?? this.tagCode, + ); + Map toJson() { + final map = {}; + map['id'] = id; + map['assetSerialNo'] = assetSerialNo; + map['systemID'] = systemID; + map['assetNumber'] = assetNumber; + if (modelDefinition != null) { + map['modelDefinition'] = modelDefinition.toJson(); + } + if (supplier != null) { + map['supplier'] = supplier.toJson(); + } + map['ipAddress'] = ipAddress; + map['macAddress'] = macAddress; + map['portNumber'] = portNumber; + if (assetReplace != null) { + map['assetReplace'] = assetReplace.toJson(); + } + if (oldAsset != null) { + map['oldAsset'] = oldAsset.toJson(); + } + if (isParent != null) { + map['isParent'] = isParent.toJson(); + } + if (parentAsset != null) { + map['parentAsset'] = parentAsset.toJson(); + } + if (assetType != null) { + map['assetType'] = assetType.toMap(); + } + if (site != null) { + map['site'] = site.toJson(); + } + if (building != null) { + map['building'] = building.toJson(); + } + if (floor != null) { + map['floor'] = floor.toJson(); + } + if (department != null) { + map['department'] = department.toJson(); + } + map['room'] = room; + map['testsDay'] = testsDay; + map['purchasingPrice'] = purchasingPrice; + map['nbv'] = nbv; + if (currency != null) { + map['currency'] = currency.toJson(); + } + map['poNo'] = poNo; + map['invoiceNumber'] = invoiceNumber; + map['invoiceDate'] = invoiceDate; + map['replacementDate'] = replacementDate; + if (originDepartment != null) { + map['originDepartment'] = originDepartment.toJson(); + } + if (originSite != null) { + map['originSite'] = originSite.toJson(); + } + map['budgetYear'] = budgetYear; + map['lastPOPrice'] = lastPOPrice; + if (commissioningStatus != null) { + map['commissioningStatus'] = commissioningStatus.toJson(); + } + map['productionDate'] = productionDate; + map['edd'] = edd; + map['technicalInspectionDate'] = technicalInspectionDate; + map['deliveryInspectionDate'] = deliveryInspectionDate; + map['endUserAcceptanceDate'] = endUserAcceptanceDate; + map['receivingCommittee'] = receivingCommittee; + if (siteWarrantyMonths != null) { + map['siteWarrantyMonths'] = siteWarrantyMonths.toJson(); + } + if (extendedWarrantyMonths != null) { + map['extendedWarrantyMonths'] = extendedWarrantyMonths.toJson(); + } + if (remainderWarrantyMonths != null) { + map['remainderWarrantyMonths'] = remainderWarrantyMonths.toJson(); + } + map['eomWarrantyMonthsNo'] = eomWarrantyMonthsNo; + map['warrantyValue'] = warrantyValue; + map['warrantyEndDate'] = warrantyEndDate; + map['warrantyContractConditions'] = warrantyContractConditions; + if (technicalGuidanceBooks != null) { + map['technicalGuidanceBooks'] = technicalGuidanceBooks.map((v) => v.toJson()).toList(); + } + map['comment'] = comment; + map['tagCode'] = tagCode; + return map; + } +} + +class TechnicalGuidanceBooks { + TechnicalGuidanceBooks({ + this.id, + this.guidanceBook, + }); + + TechnicalGuidanceBooks.fromJson(dynamic json) { + id = json['id']; + guidanceBook = json['guidanceBook'] != null ? GuidanceBook.fromJson(json['guidanceBook']) : null; + } + num id; + GuidanceBook guidanceBook; + TechnicalGuidanceBooks copyWith({ + num id, + GuidanceBook guidanceBook, + }) => + TechnicalGuidanceBooks( + id: id ?? this.id, + guidanceBook: guidanceBook ?? this.guidanceBook, + ); + Map toJson() { + final map = {}; + map['id'] = id; + if (guidanceBook != null) { + map['guidanceBook'] = guidanceBook.toJson(); + } + return map; + } +} + +class GuidanceBook { + GuidanceBook({ + this.id, + this.name, + this.value, + }); + + GuidanceBook.fromJson(dynamic json) { + id = json['id']; + name = json['name']; + value = json['value']; + } + num id; + String name; + num value; + GuidanceBook copyWith({ + num id, + String name, + num value, + }) => + GuidanceBook( + id: id ?? this.id, + name: name ?? this.name, + value: value ?? this.value, + ); + Map toJson() { + final map = {}; + map['id'] = id; + map['name'] = name; + map['value'] = value; + return map; + } +} + +class RemainderWarrantyMonths { + RemainderWarrantyMonths({ + this.id, + this.name, + this.value, + }); + + RemainderWarrantyMonths.fromJson(dynamic json) { + id = json['id']; + name = json['name']; + value = json['value']; + } + num id; + String name; + num value; + RemainderWarrantyMonths copyWith({ + num id, + String name, + num value, + }) => + RemainderWarrantyMonths( + id: id ?? this.id, + name: name ?? this.name, + value: value ?? this.value, + ); + Map toJson() { + final map = {}; + map['id'] = id; + map['name'] = name; + map['value'] = value; + return map; + } +} + +class ExtendedWarrantyMonths { + ExtendedWarrantyMonths({ + this.id, + this.name, + this.value, + }); + + ExtendedWarrantyMonths.fromJson(dynamic json) { + id = json['id']; + name = json['name']; + value = json['value']; + } + num id; + String name; + num value; + ExtendedWarrantyMonths copyWith({ + num id, + String name, + num value, + }) => + ExtendedWarrantyMonths( + id: id ?? this.id, + name: name ?? this.name, + value: value ?? this.value, + ); + Map toJson() { + final map = {}; + map['id'] = id; + map['name'] = name; + map['value'] = value; + return map; + } +} + +class SiteWarrantyMonths { + SiteWarrantyMonths({ + this.id, + this.name, + this.value, + }); + + SiteWarrantyMonths.fromJson(dynamic json) { + id = json['id']; + name = json['name']; + value = json['value']; + } + num id; + String name; + num value; + SiteWarrantyMonths copyWith({ + num id, + String name, + num value, + }) => + SiteWarrantyMonths( + id: id ?? this.id, + name: name ?? this.name, + value: value ?? this.value, + ); + Map toJson() { + final map = {}; + map['id'] = id; + map['name'] = name; + map['value'] = value; + return map; + } +} + +class CommissioningStatus { + CommissioningStatus({ + this.id, + this.name, + this.value, + }); + + CommissioningStatus.fromJson(dynamic json) { + id = json['id']; + name = json['name']; + value = json['value']; + } + num id; + String name; + num value; + CommissioningStatus copyWith({ + num id, + String name, + num value, + }) => + CommissioningStatus( + id: id ?? this.id, + name: name ?? this.name, + value: value ?? this.value, + ); + Map toJson() { + final map = {}; + map['id'] = id; + map['name'] = name; + map['value'] = value; + return map; + } +} + +class OriginSite { + OriginSite({ + this.id, + this.customerCode, + this.custName, + this.buildings, + }); + + OriginSite.fromJson(dynamic json) { + id = json['id']; + customerCode = json['customerCode']; + custName = json['custName']; + if (json['buildings'] != null) { + buildings = []; + json['buildings'].forEach((v) { + buildings.add(Buildings.fromJson(v)); + }); + } + } + num id; + num customerCode; + String custName; + List buildings; + OriginSite copyWith({ + num id, + num customerCode, + String custName, + List buildings, + }) => + OriginSite( + id: id ?? this.id, + customerCode: customerCode ?? this.customerCode, + custName: custName ?? this.custName, + buildings: buildings ?? this.buildings, + ); + Map toJson() { + final map = {}; + map['id'] = id; + map['customerCode'] = customerCode; + map['custName'] = custName; + if (buildings != null) { + map['buildings'] = buildings.map((v) => v.toJson()).toList(); + } + return map; + } +} + +class Buildings { + Buildings({ + this.id, + this.name, + this.value, + this.floors, + }); + + Buildings.fromJson(dynamic json) { + id = json['id']; + name = json['name']; + value = json['value']; + if (json['floors'] != null) { + floors = []; + json['floors'].forEach((v) { + floors.add(Floors.fromJson(v)); + }); + } + } + num id; + String name; + num value; + List floors; + Buildings copyWith({ + num id, + String name, + num value, + List floors, + }) => + Buildings( + id: id ?? this.id, + name: name ?? this.name, + value: value ?? this.value, + floors: floors ?? this.floors, + ); + Map toJson() { + final map = {}; + map['id'] = id; + map['name'] = name; + map['value'] = value; + if (floors != null) { + map['floors'] = floors.map((v) => v.toJson()).toList(); + } + return map; + } +} + +class Floors { + Floors({ + this.id, + this.name, + this.value, + this.departments, + }); + + Floors.fromJson(dynamic json) { + id = json['id']; + name = json['name']; + value = json['value']; + if (json['departments'] != null) { + departments = []; + json['departments'].forEach((v) { + departments.add(Departments.fromJson(v)); + }); + } + } + num id; + String name; + num value; + List departments; + Floors copyWith({ + num id, + String name, + num value, + List departments, + }) => + Floors( + id: id ?? this.id, + name: name ?? this.name, + value: value ?? this.value, + departments: departments ?? this.departments, + ); + Map toJson() { + final map = {}; + map['id'] = id; + map['name'] = name; + map['value'] = value; + if (departments != null) { + map['departments'] = departments.map((v) => v.toJson()).toList(); + } + return map; + } +} + +class Departments { + Departments({ + this.id, + this.name, + }); + + Departments.fromJson(dynamic json) { + id = json['id']; + name = json['name']; + } + num id; + String name; + Departments copyWith({ + num id, + String name, + }) => + Departments( + id: id ?? this.id, + name: name ?? this.name, + ); + Map toJson() { + final map = {}; + map['id'] = id; + map['name'] = name; + return map; + } +} + +class OriginDepartment { + OriginDepartment({ + this.id, + this.departmentName, + this.departmentCode, + this.ntCode, + }); + + OriginDepartment.fromJson(dynamic json) { + id = json['id']; + departmentName = json['departmentName']; + departmentCode = json['departmentCode']; + ntCode = json['ntCode']; + } + num id; + String departmentName; + String departmentCode; + String ntCode; + OriginDepartment copyWith({ + num id, + String departmentName, + String departmentCode, + String ntCode, + }) => + OriginDepartment( + id: id ?? this.id, + departmentName: departmentName ?? this.departmentName, + departmentCode: departmentCode ?? this.departmentCode, + ntCode: ntCode ?? this.ntCode, + ); + Map toJson() { + final map = {}; + map['id'] = id; + map['departmentName'] = departmentName; + map['departmentCode'] = departmentCode; + map['ntCode'] = ntCode; + return map; + } +} + +class Currency { + Currency({ + this.id, + this.name, + this.value, + }); + + Currency.fromJson(dynamic json) { + id = json['id']; + name = json['name']; + value = json['value']; + } + num id; + String name; + num value; + Currency copyWith({ + num id, + String name, + num value, + }) => + Currency( + id: id ?? this.id, + name: name ?? this.name, + value: value ?? this.value, + ); + Map toJson() { + final map = {}; + map['id'] = id; + map['name'] = name; + map['value'] = value; + return map; + } +} + +class Department { + Department({ + this.id, + this.departmentName, + this.departmentCode, + this.ntCode, + }); + + Department.fromJson(dynamic json) { + id = json['id']; + departmentName = json['departmentName']; + departmentCode = json['departmentCode']; + ntCode = json['ntCode']; + } + num id; + String departmentName; + String departmentCode; + String ntCode; + Department copyWith({ + num id, + String departmentName, + String departmentCode, + String ntCode, + }) => + Department( + id: id ?? this.id, + departmentName: departmentName ?? this.departmentName, + departmentCode: departmentCode ?? this.departmentCode, + ntCode: ntCode ?? this.ntCode, + ); + Map toJson() { + final map = {}; + map['id'] = id; + map['departmentName'] = departmentName; + map['departmentCode'] = departmentCode; + map['ntCode'] = ntCode; + return map; + } +} + +class Floor { + Floor({ + this.id, + this.name, + this.value, + }); + + Floor.fromJson(dynamic json) { + id = json['id']; + name = json['name']; + value = json['value']; + } + num id; + String name; + num value; + Floor copyWith({ + num id, + String name, + num value, + }) => + Floor( + id: id ?? this.id, + name: name ?? this.name, + value: value ?? this.value, + ); + Map toJson() { + final map = {}; + map['id'] = id; + map['name'] = name; + map['value'] = value; + return map; + } +} + +class Building { + Building({ + this.id, + this.name, + this.value, + }); + + Building.fromJson(dynamic json) { + id = json['id']; + name = json['name']; + value = json['value']; + } + num id; + String name; + num value; + Building copyWith({ + num id, + String name, + num value, + }) => + Building( + id: id ?? this.id, + name: name ?? this.name, + value: value ?? this.value, + ); + Map toJson() { + final map = {}; + map['id'] = id; + map['name'] = name; + map['value'] = value; + return map; + } +} + +class Site { + Site({ + this.id, + this.customerCode, + this.custName, + this.buildings, + }); + + Site.fromJson(dynamic json) { + id = json['id']; + customerCode = json['customerCode']; + custName = json['custName']; + if (json['buildings'] != null) { + buildings = []; + json['buildings'].forEach((v) { + buildings.add(Buildings.fromJson(v)); + }); + } + } + num id; + num customerCode; + String custName; + List buildings; + Site copyWith({ + num id, + num customerCode, + String custName, + List buildings, + }) => + Site( + id: id ?? this.id, + customerCode: customerCode ?? this.customerCode, + custName: custName ?? this.custName, + buildings: buildings ?? this.buildings, + ); + Map toJson() { + final map = {}; + map['id'] = id; + map['customerCode'] = customerCode; + map['custName'] = custName; if (buildings != null) { - data['buildings'] = buildings.map((v) => v.toJson()).toList(); + map['buildings'] = buildings.map((v) => v.toJson()).toList(); } - return data; + return map; } } -class AssignedEmployee { - String id; +class ParentAsset { + ParentAsset({ + this.id, + this.assetSerialNo, + this.assetNumber, + this.tagCode, + this.systemId, + }); + + ParentAsset.fromJson(dynamic json) { + id = json['id']; + assetSerialNo = json['assetSerialNo']; + assetNumber = json['assetNumber']; + tagCode = json['tagCode']; + systemId = json['systemId']; + } + num id; + String assetSerialNo; + String assetNumber; + String tagCode; + String systemId; + ParentAsset copyWith({ + num id, + String assetSerialNo, + String assetNumber, + String tagCode, + String systemId, + }) => + ParentAsset( + id: id ?? this.id, + assetSerialNo: assetSerialNo ?? this.assetSerialNo, + assetNumber: assetNumber ?? this.assetNumber, + tagCode: tagCode ?? this.tagCode, + systemId: systemId ?? this.systemId, + ); + Map toJson() { + final map = {}; + map['id'] = id; + map['assetSerialNo'] = assetSerialNo; + map['assetNumber'] = assetNumber; + map['tagCode'] = tagCode; + map['systemId'] = systemId; + return map; + } +} + +class IsParent { + IsParent({ + this.id, + this.name, + this.value, + }); + + IsParent.fromJson(dynamic json) { + id = json['id']; + name = json['name']; + value = json['value']; + } + num id; String name; + num value; + IsParent copyWith({ + num id, + String name, + num value, + }) => + IsParent( + id: id ?? this.id, + name: name ?? this.name, + value: value ?? this.value, + ); + Map toJson() { + final map = {}; + map['id'] = id; + map['name'] = name; + map['value'] = value; + return map; + } +} + +class OldAsset { + OldAsset({ + this.id, + this.assetSerialNo, + this.assetNumber, + this.tagCode, + this.systemId, + }); + + OldAsset.fromJson(dynamic json) { + id = json['id']; + assetSerialNo = json['assetSerialNo']; + assetNumber = json['assetNumber']; + tagCode = json['tagCode']; + systemId = json['systemId']; + } + num id; + String assetSerialNo; + String assetNumber; + String tagCode; + String systemId; + OldAsset copyWith({ + num id, + String assetSerialNo, + String assetNumber, + String tagCode, + String systemId, + }) => + OldAsset( + id: id ?? this.id, + assetSerialNo: assetSerialNo ?? this.assetSerialNo, + assetNumber: assetNumber ?? this.assetNumber, + tagCode: tagCode ?? this.tagCode, + systemId: systemId ?? this.systemId, + ); + Map toJson() { + final map = {}; + map['id'] = id; + map['assetSerialNo'] = assetSerialNo; + map['assetNumber'] = assetNumber; + map['tagCode'] = tagCode; + map['systemId'] = systemId; + return map; + } +} - AssignedEmployee({this.id, this.name}); +class AssetReplace { + AssetReplace({ + this.id, + this.name, + this.value, + }); - AssignedEmployee.fromJson(Map json) { + AssetReplace.fromJson(dynamic json) { id = json['id']; name = json['name']; + value = json['value']; + } + num id; + String name; + num value; + AssetReplace copyWith({ + num id, + String name, + num value, + }) => + AssetReplace( + id: id ?? this.id, + name: name ?? this.name, + value: value ?? this.value, + ); + Map toJson() { + final map = {}; + map['id'] = id; + map['name'] = name; + map['value'] = value; + return map; + } +} + +class Supplier { + Supplier({ + this.id, + this.suppliername, + }); + + Supplier.fromJson(dynamic json) { + id = json['id']; + suppliername = json['suppliername']; + } + num id; + String suppliername; + SupplierModel copyWith({ + num id, + String suppliername, + }) => + SupplierModel( + id: id ?? this.id, + suppliername: suppliername ?? this.suppliername, + ); + Map toJson() { + final map = {}; + map['id'] = id; + map['suppliername'] = suppliername; + return map; + } +} + +class ModelDefinition { + ModelDefinition({ + this.id, + this.assetName, + this.modelDefCode, + this.modelName, + this.manufacturerId, + this.manufacturerName, + this.supplierName, + this.replacementDate, + this.essentialEquipement, + this.businessCritical, + this.lifeSpan, + this.modelDefRelatedDefects, + this.suppliers, + }); + + ModelDefinition.fromJson(dynamic json) { + id = json['id']; + assetName = json['assetName']; + modelDefCode = json['modelDefCode']; + modelName = json['modelName']; + manufacturerId = json['manufacturerId']; + manufacturerName = json['manufacturerName']; + supplierName = json['supplierName']; + replacementDate = json['replacementDate']; + essentialEquipement = json['essentialEquipement']; + businessCritical = json['businessCritical']; + lifeSpan = json['lifeSpan']; + if (json['modelDefRelatedDefects'] != null) { + modelDefRelatedDefects = []; + json['modelDefRelatedDefects'].forEach((v) { + modelDefRelatedDefects.add(ModelDefRelatedDefects.fromJson(v)); + }); + } + if (json['suppliers'] != null) { + suppliers = []; + json['suppliers'].forEach((v) { + suppliers.add(Suppliers.fromJson(v)); + }); + } + } + num id; + String assetName; + String modelDefCode; + String modelName; + num manufacturerId; + String manufacturerName; + String supplierName; + String replacementDate; + String essentialEquipement; + String businessCritical; + num lifeSpan; + List modelDefRelatedDefects; + List suppliers; + ModelDefinition copyWith({ + num id, + String assetName, + String modelDefCode, + String modelName, + num manufacturerId, + String manufacturerName, + String supplierName, + String replacementDate, + String essentialEquipement, + String businessCritical, + num lifeSpan, + List modelDefRelatedDefects, + List suppliers, + }) => + ModelDefinition( + id: id ?? this.id, + assetName: assetName ?? this.assetName, + modelDefCode: modelDefCode ?? this.modelDefCode, + modelName: modelName ?? this.modelName, + manufacturerId: manufacturerId ?? this.manufacturerId, + manufacturerName: manufacturerName ?? this.manufacturerName, + supplierName: supplierName ?? this.supplierName, + replacementDate: replacementDate ?? this.replacementDate, + essentialEquipement: essentialEquipement ?? this.essentialEquipement, + businessCritical: businessCritical ?? this.businessCritical, + lifeSpan: lifeSpan ?? this.lifeSpan, + modelDefRelatedDefects: modelDefRelatedDefects ?? this.modelDefRelatedDefects, + suppliers: suppliers ?? this.suppliers, + ); + Map toJson() { + final map = {}; + map['id'] = id; + map['assetName'] = assetName; + map['modelDefCode'] = modelDefCode; + map['modelName'] = modelName; + map['manufacturerId'] = manufacturerId; + map['manufacturerName'] = manufacturerName; + map['supplierName'] = supplierName; + map['replacementDate'] = replacementDate; + map['essentialEquipement'] = essentialEquipement; + map['businessCritical'] = businessCritical; + map['lifeSpan'] = lifeSpan; + if (modelDefRelatedDefects != null) { + map['modelDefRelatedDefects'] = modelDefRelatedDefects.map((v) => v.toJson()).toList(); + } + if (suppliers != null) { + map['suppliers'] = suppliers.map((v) => v.toJson()).toList(); + } + return map; } +} + +class Suppliers { + Suppliers({ + this.id, + this.suppliername, + }); + + Suppliers.fromJson(dynamic json) { + id = json['id']; + suppliername = json['suppliername']; + } + num id; + String suppliername; + Suppliers copyWith({ + num id, + String suppliername, + }) => + Suppliers( + id: id ?? this.id, + suppliername: suppliername ?? this.suppliername, + ); + Map toJson() { + final map = {}; + map['id'] = id; + map['suppliername'] = suppliername; + return map; + } +} + +class ModelDefRelatedDefects { + ModelDefRelatedDefects({ + this.id, + this.defectName, + this.workPerformed, + this.estimatedTime, + }); + ModelDefRelatedDefects.fromJson(dynamic json) { + id = json['id']; + defectName = json['defectName']; + workPerformed = json['workPerformed']; + estimatedTime = json['estimatedTime']; + } + num id; + String defectName; + String workPerformed; + String estimatedTime; + ModelDefRelatedDefects copyWith({ + num id, + String defectName, + String workPerformed, + String estimatedTime, + }) => + ModelDefRelatedDefects( + id: id ?? this.id, + defectName: defectName ?? this.defectName, + workPerformed: workPerformed ?? this.workPerformed, + estimatedTime: estimatedTime ?? this.estimatedTime, + ); Map toJson() { - final Map data = {}; - data['id'] = id; - data['name'] = name; - return data; + final map = {}; + map['id'] = id; + map['defectName'] = defectName; + map['workPerformed'] = workPerformed; + map['estimatedTime'] = estimatedTime; + return map; } } diff --git a/lib/views/pages/sub_workorder/create_sub_workorder_page.dart b/lib/views/pages/sub_workorder/create_sub_workorder_page.dart index bbf8d7cf..8a26ba40 100644 --- a/lib/views/pages/sub_workorder/create_sub_workorder_page.dart +++ b/lib/views/pages/sub_workorder/create_sub_workorder_page.dart @@ -13,14 +13,10 @@ import '../../../controllers/localization/localization.dart'; import '../../../models/subtitle.dart'; import '../../widgets/buttons/app_back_button.dart'; import '../../widgets/buttons/app_button.dart'; -import '../../widgets/date_and_time/date_picker.dart'; -import '../../widgets/status/report/service_report_equipment_status.dart'; -import '../../widgets/status/report/service_report_reasons.dart'; -import '../../widgets/titles/app_sub_title.dart'; class CreateSubWorkOrderPage extends StatefulWidget { static const id = "/CreateSubWorkOrder"; - final SearchWorkOrders workOrder; + final SearchWorkOrder workOrder; const CreateSubWorkOrderPage({this.workOrder, Key key}) : super(key: key); @override diff --git a/lib/views/pages/sub_workorder/search_sub_workorder_page.dart b/lib/views/pages/sub_workorder/search_sub_workorder_page.dart index f23c6364..afc41b9a 100644 --- a/lib/views/pages/sub_workorder/search_sub_workorder_page.dart +++ b/lib/views/pages/sub_workorder/search_sub_workorder_page.dart @@ -15,7 +15,6 @@ import '../../../controllers/localization/localization.dart'; import '../../app_style/colors.dart'; import '../../widgets/buttons/app_back_button.dart'; import '../../widgets/buttons/app_button.dart'; -import '../../widgets/loaders/app_loading.dart'; import '../../widgets/status/report/service_report_all_users.dart'; import '../../widgets/status/report/service_report_maintenance_situation.dart'; import '../../widgets/status/report/service_report_visit_date_operator.dart'; @@ -31,7 +30,7 @@ class SearchSubWorkOrderPage extends StatefulWidget { class _SearchSubWorkOrderPageState extends State { final GlobalKey _formKey = GlobalKey(); - final SearchWorkOrders _searchWorkOrders = SearchWorkOrders(); + final SearchWorkOrder _searchWorkOrders = SearchWorkOrder(); Subtitle _subtitle; bool _isLoading = false; String _callerId = "", _site = ""; @@ -87,7 +86,9 @@ class _SearchSubWorkOrderPageState extends State { labelText: "Asset S.N.", textInputType: TextInputType.number, onSaved: (value) { - _searchWorkOrders.assetType = value; + if (value != null) { + _searchWorkOrders.assetType = Lookup(name: value); + } }, ), const SizedBox(height: 16), @@ -172,7 +173,7 @@ class _SearchSubWorkOrderPageState extends State { if (_formKey.currentState?.validate() ?? false) {} _formKey.currentState?.save(); final serviceRequestsProvider = Provider.of(context, listen: false); - final List woList = await serviceRequestsProvider.searchForWorkOrders( + final List woList = await serviceRequestsProvider.searchForWorkOrders( _searchWorkOrders, _callerId, _dateOperator, @@ -187,37 +188,41 @@ class _SearchSubWorkOrderPageState extends State { MaterialPageRoute( builder: (context) => Scaffold( body: SafeArea( - child: Column( - children: [ - Container( - color: AColors.primaryColor, - padding: const EdgeInsets.symmetric(horizontal: 0, vertical: 4), - child: Column( + child: Column( + children: [ + Container( + color: AColors.primaryColor, + padding: const EdgeInsets.symmetric(horizontal: 0, vertical: 4), + child: Column( + children: [ + Row( children: [ - Row( - children: [ - ABackButton(), - Expanded( - child: Center( - child: Text( - "Work Order List", - style: Theme.of(context).textTheme.headline6.copyWith(color: AColors.white, fontStyle: FontStyle.italic), - ), - ), + ABackButton(), + Expanded( + child: Center( + child: Text( + "Work Order List", + style: Theme.of(context).textTheme.headline6.copyWith(color: AColors.white, fontStyle: FontStyle.italic), ), - const SizedBox( - width: 48, - ) - ], + ), ), + const SizedBox( + width: 48, + ) ], ), - ), - Expanded(child: WorkOrderList(items: woList, nextPage: true, onLazyLoad: (){}, )), - ], + ], + ), ), - ) - ), + Expanded( + child: WorkOrderList( + items: woList, + nextPage: true, + onLazyLoad: () {}, + )), + ], + ), + )), ), ); } else { diff --git a/lib/views/pages/sub_workorder/spare_parts_details_bottom_sheet.dart b/lib/views/pages/sub_workorder/spare_parts_details_bottom_sheet.dart index 927a07bd..444207ca 100644 --- a/lib/views/pages/sub_workorder/spare_parts_details_bottom_sheet.dart +++ b/lib/views/pages/sub_workorder/spare_parts_details_bottom_sheet.dart @@ -14,7 +14,7 @@ import '../../widgets/buttons/app_button.dart'; import '../../widgets/titles/app_sub_title.dart'; class SparePartsBottomSheet extends StatefulWidget { - final SearchWorkOrders workOrder; + final SearchWorkOrder workOrder; const SparePartsBottomSheet({this.workOrder, Key key}) : super(key: key); @override @@ -23,7 +23,7 @@ class SparePartsBottomSheet extends StatefulWidget { class _SparePartsBottomSheetState extends State { final GlobalKey _formKey = GlobalKey(); - SearchWorkOrders _workOrder; + SearchWorkOrder _workOrder; bool _isLoading = false; @override void initState() { @@ -123,7 +123,7 @@ class _SparePartsBottomSheetState extends State { const SizedBox(height: 8), InkWell( onTap: () { - _workOrder.sparePartsWorkOrders.add(SparePartWorkOrder()); + _workOrder.sparePartsWorkOrders.add(SparePartsWorkOrders()); setState(() {}); }, child: Container( diff --git a/lib/views/pages/sub_workorder/work_order_details_bottom_sheet.dart b/lib/views/pages/sub_workorder/work_order_details_bottom_sheet.dart index 31c8de92..d52ee389 100644 --- a/lib/views/pages/sub_workorder/work_order_details_bottom_sheet.dart +++ b/lib/views/pages/sub_workorder/work_order_details_bottom_sheet.dart @@ -2,7 +2,6 @@ import 'package:flutter/material.dart'; import 'package:fluttertoast/fluttertoast.dart'; import 'package:provider/provider.dart'; import 'package:test_sa/controllers/providers/api/service_requests_provider.dart'; -import 'package:test_sa/models/lookup.dart'; import 'package:test_sa/models/service_request/search_work_order.dart'; import 'package:test_sa/models/subtitle.dart'; import 'package:test_sa/views/widgets/app_text_form_field.dart'; @@ -13,14 +12,12 @@ import 'package:test_sa/views/widgets/status/report/service_report_repair_locati import '../../../controllers/api_routes/http_status_manger.dart'; import '../../../controllers/localization/localization.dart'; -import '../../../models/engineer.dart'; import '../../app_style/sizing.dart'; import '../../widgets/date_and_time/time_picker.dart'; -import '../../widgets/status/report/service_report_all_users.dart'; import '../../widgets/titles/app_sub_title.dart'; class WorkOrderDetailsBottomSheet extends StatefulWidget { - final SearchWorkOrders workOrder; + final SearchWorkOrder workOrder; const WorkOrderDetailsBottomSheet({this.workOrder, Key key}) : super(key: key); @override @@ -29,7 +26,7 @@ class WorkOrderDetailsBottomSheet extends StatefulWidget { class _WorkOrderDetailsBottomSheetState extends State { final GlobalKey _formKey = GlobalKey(); - SearchWorkOrders _workOrder; + SearchWorkOrder _workOrder; bool _isLoading = false; @override @@ -73,14 +70,14 @@ class _WorkOrderDetailsBottomSheetState extends State Validator.isNumeric(value) ? null : _subtitle.requiredWord, @@ -180,18 +180,18 @@ class _WorkOrderDetailsBottomSheetState extends State items; + final List items; final bool nextPage; final Future Function() onLazyLoad; - WorkOrderList({Key key, this.items, this.nextPage, this.onLazyLoad}) : super(key: key); + const WorkOrderList({Key key, this.items, this.nextPage, this.onLazyLoad}) : super(key: key); @override Widget build(BuildContext context) { - - if (items.length == 0) { + if (items.isEmpty) { Subtitle subtitle = AppLocalization.of(context).subtitle; return NoItemFound( message: subtitle.noServiceRequestFound, ); } return LazyLoading( - nextPage: nextPage, - onLazyLoad: onLazyLoad, - child: ListView.builder( - itemCount: items.length, - padding: const EdgeInsets.symmetric(horizontal: 16, vertical: 8), - itemBuilder: (context, itemIndex) { - return WorkOrderItem(index: itemIndex, onPressed: (model){ - // Navigator.of(context).push(MaterialPageRoute( - // builder: (_) => WorkOrderUpdate(item: model,))); - Navigator.push( - context, - MaterialPageRoute(builder: (context) => CreateSubWorkOrderPage(workOrder:model)), - ); - }, item: items[itemIndex], ); - }), - ); + nextPage: nextPage, + onLazyLoad: onLazyLoad, + child: ListView.builder( + itemCount: items.length, + padding: const EdgeInsets.symmetric(horizontal: 16, vertical: 8), + itemBuilder: (context, itemIndex) { + return WorkOrderItem( + index: itemIndex, + onPressed: (model) { + // Navigator.of(context).push(MaterialPageRoute( + // builder: (_) => WorkOrderUpdate(item: model,))); + log(model?.toJson()?.toString()); + Navigator.push( + context, + MaterialPageRoute(builder: (context) => CreateSubWorkOrderPage(workOrder: model)), + ); + }, + item: items[itemIndex], + ); + }, + ), + ); } } diff --git a/lib/views/pages/sub_workorder/workorder_update.dart b/lib/views/pages/sub_workorder/workorder_update.dart index 71f589c5..3970aeaa 100644 --- a/lib/views/pages/sub_workorder/workorder_update.dart +++ b/lib/views/pages/sub_workorder/workorder_update.dart @@ -9,9 +9,9 @@ import '../../widgets/buttons/app_back_button.dart'; import '../../widgets/loaders/loading_manager.dart'; class WorkOrderUpdate extends StatefulWidget { - final SearchWorkOrders item; + final SearchWorkOrder item; - const WorkOrderUpdate({@required this.item,Key key}) : super(key: key); + const WorkOrderUpdate({@required this.item, Key key}) : super(key: key); @override State createState() => _WorkOrderUpdateState(); @@ -55,7 +55,9 @@ class _WorkOrderUpdateState extends State { ], ), ), - WorkOrderDetails(item: widget.item,) + WorkOrderDetails( + item: widget.item, + ) ], ), ), diff --git a/lib/views/pages/user/requests/report/future_service_report.dart b/lib/views/pages/user/requests/report/future_service_report.dart index 1a987b0d..466ab8f2 100644 --- a/lib/views/pages/user/requests/report/future_service_report.dart +++ b/lib/views/pages/user/requests/report/future_service_report.dart @@ -15,7 +15,7 @@ import 'edit_service_report.dart'; class FutureServiceReport extends StatefulWidget { final ServiceRequest request; - final SearchWorkOrders workOrder; + final SearchWorkOrder workOrder; const FutureServiceReport({Key key, this.request, this.workOrder}) : super(key: key); diff --git a/lib/views/pages/user/requests/request_details.dart b/lib/views/pages/user/requests/request_details.dart index 03a71d01..70464935 100644 --- a/lib/views/pages/user/requests/request_details.dart +++ b/lib/views/pages/user/requests/request_details.dart @@ -37,7 +37,7 @@ class RequestDetailsPage extends StatelessWidget { Subtitle _subtitle = AppLocalization.of(context).subtitle; UserProvider _userProvider = Provider.of(context); SettingProvider _settingProvider = Provider.of(context); - List workOrders = []; + List workOrders = []; ServiceRequestsProvider _serviceRequestsProvider = Provider.of(context); return DefaultTabController( length: 2, @@ -303,7 +303,7 @@ class RequestDetailsPage extends StatelessWidget { FutureBuilder( future: _serviceRequestsProvider.searchWorkOrders(callId: serviceRequest.requestCode), builder: (context, snap) { - workOrders = snap.data as List; + workOrders = snap.data as List; if (snap.connectionState == ConnectionState.waiting) return Center(child: CircularProgressIndicator()); if (snap.connectionState == ConnectionState.done && (snap.data?.length ?? 0) != 0) { return SingleChildScrollView( From 73cc2143bc45b02af9cf3d90f7130ddc0bd98e53 Mon Sep 17 00:00:00 2001 From: nextwo <1234> Date: Tue, 20 Jun 2023 09:28:06 +0300 Subject: [PATCH 091/181] work order --- .../service_report_last_calls_provider.dart | 2 +- .../create_sub_workorder_page.dart | 141 ++++++++++++++---- .../sub_workorder/workorder_details.dart | 42 +++--- .../pages/sub_workorder/workorder_update.dart | 2 +- .../service_report_equipment_status.dart | 18 +-- 5 files changed, 147 insertions(+), 58 deletions(-) diff --git a/lib/controllers/providers/api/status_drop_down/report/service_report_last_calls_provider.dart b/lib/controllers/providers/api/status_drop_down/report/service_report_last_calls_provider.dart index a6f39ab8..3e4741b9 100644 --- a/lib/controllers/providers/api/status_drop_down/report/service_report_last_calls_provider.dart +++ b/lib/controllers/providers/api/status_drop_down/report/service_report_last_calls_provider.dart @@ -57,7 +57,7 @@ class ServiceReportLastCallsProvider extends ChangeNotifier { try { // todo request new api from backend to make filter work response = await ApiManager.instance.get( - "${URLs.getServiceReportLastCalls}?parentWOId=$woId&isAdd=true&id=${id ?? 0}&typeTransaction=$typeName", + "${URLs.getServiceReportLastCalls}?parentWOId=${woId??id}&isAdd=true&id=${id ?? 0}&typeTransaction=$typeName", ); // response = await get( // Uri.parse( diff --git a/lib/views/pages/sub_workorder/create_sub_workorder_page.dart b/lib/views/pages/sub_workorder/create_sub_workorder_page.dart index bbf8d7cf..1eec8f2f 100644 --- a/lib/views/pages/sub_workorder/create_sub_workorder_page.dart +++ b/lib/views/pages/sub_workorder/create_sub_workorder_page.dart @@ -2,6 +2,9 @@ import 'package:flutter/material.dart'; import 'package:fluttertoast/fluttertoast.dart'; import 'package:provider/provider.dart'; import 'package:test_sa/controllers/providers/api/service_requests_provider.dart'; +import 'package:test_sa/extensions/widget_extensions.dart'; +import 'package:test_sa/models/lookup.dart'; +import 'package:test_sa/models/service_report.dart'; import 'package:test_sa/models/service_request/search_work_order.dart'; import 'package:test_sa/views/app_style/colors.dart'; import 'package:test_sa/views/pages/sub_workorder/spare_parts_details_bottom_sheet.dart'; @@ -10,11 +13,16 @@ import 'package:test_sa/views/pages/sub_workorder/workorder_details.dart'; import '../../../controllers/api_routes/http_status_manger.dart'; import '../../../controllers/localization/localization.dart'; +import '../../../models/fault_description.dart'; import '../../../models/subtitle.dart'; +import '../../widgets/app_text_form_field.dart'; import '../../widgets/buttons/app_back_button.dart'; import '../../widgets/buttons/app_button.dart'; import '../../widgets/date_and_time/date_picker.dart'; +import '../../widgets/images/mini_one_image_picker.dart'; +import '../../widgets/status/report/fault_desc_menu.dart'; import '../../widgets/status/report/service_report_equipment_status.dart'; +import '../../widgets/status/report/service_report_fault_description.dart'; import '../../widgets/status/report/service_report_reasons.dart'; import '../../widgets/titles/app_sub_title.dart'; @@ -29,40 +37,18 @@ class CreateSubWorkOrderPage extends StatefulWidget { class _CreateSubWorkOrderPageState extends State { final GlobalKey _formKey = GlobalKey(); + SearchWorkOrders _searchWorkOrders =SearchWorkOrders(); + Lookup _serviceReportReason=Lookup(); + ServiceReport _serviceReport; @override Widget build(BuildContext context) { final Subtitle subtitle = AppLocalization.of(context).subtitle; + _serviceReport =ServiceReport(id: widget.workOrder.id, type: Lookup(name: widget.workOrder.assetType),equipmentStatus: Lookup(name: widget.workOrder.equipmentStatus) ); return Scaffold( body: SafeArea( child: SingleChildScrollView( child: Column( children: [ - // ServiceReportEquipmentStatusMenu( - // report: _serviceReport, - // request: widget.request, - // onSelect: (status) { - // _serviceReport.equipmentStatus = status; - // }, - // ), - // ADatePicker( - // // date: _from, - // // from: DateTime(1950), - // onDatePicker: (date) { - // // _from = date; - // // setState(() {}); - // // widget.onPickFrom(date); - // }, - // ), - // ASubTitle("_subtitle.reasons"), - // const SizedBox( - // height: 4, - // ), - // ServiceReportReasonsMenu( - // initialValue: _serviceReport.reason, - // onSelect: (status) { - // _serviceReport.reason = status; - // }, - // ), Container( color: AColors.primaryColor, padding: const EdgeInsets.symmetric(horizontal: 0, vertical: 4), @@ -91,7 +77,97 @@ class _CreateSubWorkOrderPageState extends State { padding: const EdgeInsets.symmetric(horizontal: 8, vertical: 16), child: Column( children: [ - WorkOrderDetails(), + WorkOrderDetails(item: widget.workOrder,), + const SizedBox(height: 8), + Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + ASubTitle("Equipment status"), + const SizedBox( + height: 4, + ), + ServiceReportEquipmentStatusMenu( + report: _serviceReport, + onSelect: (status) { + _searchWorkOrders.equipmentStatus=status.name; + _serviceReport.equipmentStatus=status; + }, + ), + ], + ), + const SizedBox(height: 8), + Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + ASubTitle("Return to Service"), + const SizedBox( + height: 4, + ), + Row( + children: [ + Expanded( + child: ADatePicker( + from: DateTime(1950), + onDatePicker: (date) { + setState(() {}); + }, + ), + ), + ], + ), + ], + ), + const SizedBox(height: 8), + Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + ASubTitle("Failure "+subtitle.reasons), + const SizedBox( + height: 4, + ), + ServiceReportReasonsMenu( + initialValue: _serviceReportReason, + onSelect: (status) { + _serviceReportReason=status; + _searchWorkOrders.reason = status.name; + }, + ), + ], + ), + const SizedBox(height: 8), + Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + ASubTitle(subtitle.faultDescription), + const SizedBox( + height: 4, + ), + ServiceReportFaultDescription( + requestId: widget.workOrder.id.toString(), + initialValue: FaultDescription(id: _searchWorkOrders?.faultDescription?.id, defectName: _searchWorkOrders?.faultDescription?.defectName, workPerformed: _searchWorkOrders?.faultDescription?.workPerformed, estimatedTime: _searchWorkOrders?.faultDescription?.estimatedTime), + onSelect: (status) { + _searchWorkOrders.faultDescription = ModelDefRelatedDefects(id: status?.id, defectName: status?.defectName, workPerformed: status?.workPerformed, estimatedTime: status?.estimatedTime); + }, + ), + ], + ), + const SizedBox(height: 8), + Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + ASubTitle("Solution"), + const SizedBox( + height: 4, + ), + ATextFormField( + labelText: "Add some text", + textInputType: TextInputType.multiline, + onSaved: (value) { + + }, + ), + ], + ), const SizedBox(height: 8), InkWell( onTap: () { @@ -144,6 +220,16 @@ class _CreateSubWorkOrderPageState extends State { ), ), ), + const SizedBox(height: 8), + AMiniOneImagePicker( + //error: _validate && _serviceReport.image == null, + //image: _image, + onPick: (image) { + //_image = image; + // _serviceReport.image = "${image.path.split("/").last}|${base64Encode(image.readAsBytesSync())}"; + }, + ), + const SizedBox(height: 50), ], ), ), @@ -157,6 +243,7 @@ class _CreateSubWorkOrderPageState extends State { child: AButton( text: subtitle.create, onPressed: () async { + _searchWorkOrders.parentWOId=widget.workOrder.id.toString(); // validate = true; // if (!_formKey.currentState.validate()) { // setState(() {}); diff --git a/lib/views/pages/sub_workorder/workorder_details.dart b/lib/views/pages/sub_workorder/workorder_details.dart index 23467b4a..4a67e10e 100644 --- a/lib/views/pages/sub_workorder/workorder_details.dart +++ b/lib/views/pages/sub_workorder/workorder_details.dart @@ -1,15 +1,19 @@ import 'package:flutter/material.dart'; +import '../../../controllers/localization/localization.dart'; import '../../../models/service_request/search_work_order.dart'; +import '../../../models/subtitle.dart'; import '../../app_style/colors.dart'; import '../../app_style/sizing.dart'; class WorkOrderDetails extends StatelessWidget { final SearchWorkOrders item; - const WorkOrderDetails({@required this.item,Key key}) : super(key: key); + WorkOrderDetails({@required this.item,Key key}) : super(key: key); + Subtitle _subtitle; @override Widget build(BuildContext context) { + _subtitle = AppLocalization.of(context).subtitle; return Column( children: [ Container( @@ -20,26 +24,25 @@ class WorkOrderDetails extends StatelessWidget { color: Color(0xffefefef), ), borderRadius: BorderRadius.circular(AppStyle.borderRadius * AppStyle.getScaleFactor(context)), - // boxShadow: const [ - // AppStyle.boxShadow - // ] ), child: Column( children: [ - _buildRow("call id", "", context), - _buildRow("call id", "", context), - _buildRow("call id", "", context), - _buildRow("call id", "", context), - _buildRow("call id", "", context), - _buildRow("call id", "", context), - _buildRow("call id", "", context), - _buildRow("call id", "", context), - _buildRow("call id", "", context), + _buildRow(_subtitle.callId, item.callRequest?.id?.toString()??"", context), + _buildRow(_subtitle.assetNumber, item.callRequest?.asset?.assetNumber??"", context), + _buildRow("WO No", item.workOrderNo, context), + _buildRow(_subtitle.assetName, item.callRequest?.asset?.assetNumber??'', context), + _buildRow(_subtitle.department, item.callRequest?.asset?.department??'', context), + _buildRow(_subtitle.assetSN, item.callRequest?.asset?.assetSerialNo??'', context), + _buildRow(_subtitle.model, item.callRequest?.asset?.modelDefinition?.modelName??"", context), + _buildRow("Manufacturer", item.callRequest?.asset?.modelDefinition?.manufacturerName??"", context), + _buildRow(_subtitle.site, item.callRequest?.asset?.site?.custName??"", context), ], ), ), + const SizedBox(height: 8), Container( padding: EdgeInsets.all(10), + height: 55, decoration: BoxDecoration( color: AColors.inputFieldBackgroundColor, border: Border.all( @@ -47,22 +50,21 @@ class WorkOrderDetails extends StatelessWidget { ), borderRadius: BorderRadius.circular(AppStyle.borderRadius * AppStyle.getScaleFactor(context)), ), - child: _buildRow("call id", "", context),) + child: _buildRow("Asset type", item.callRequest?.asset?.assetType??'', context),) ], ); } Widget _buildRow(String title, String value, BuildContext context){ return Row( + mainAxisAlignment: MainAxisAlignment.start, children: [ - Expanded( - child: Text( - "Call Id", - style: Theme.of(context).textTheme.subtitle2.copyWith(), - ), + Text( + title+" : ", + style: Theme.of(context).textTheme.subtitle2.copyWith(fontWeight: FontWeight.bold), ), //if (item.clientName != null) Text( - '', + value, style: Theme.of(context).textTheme.subtitle2.copyWith(), ), ], diff --git a/lib/views/pages/sub_workorder/workorder_update.dart b/lib/views/pages/sub_workorder/workorder_update.dart index 71f589c5..0697b182 100644 --- a/lib/views/pages/sub_workorder/workorder_update.dart +++ b/lib/views/pages/sub_workorder/workorder_update.dart @@ -55,7 +55,7 @@ class _WorkOrderUpdateState extends State { ], ), ), - WorkOrderDetails(item: widget.item,) + //WorkOrderDetails(item: widget.item,) ], ), ), diff --git a/lib/views/widgets/status/report/service_report_equipment_status.dart b/lib/views/widgets/status/report/service_report_equipment_status.dart index 1a0382b1..1af9ac9c 100644 --- a/lib/views/widgets/status/report/service_report_equipment_status.dart +++ b/lib/views/widgets/status/report/service_report_equipment_status.dart @@ -44,10 +44,10 @@ class _ServiceReportEquipmentStatusMenuState extends State Date: Tue, 20 Jun 2023 09:43:35 +0300 Subject: [PATCH 092/181] Fixing Bug --- lib/controllers/providers/api/service_requests_provider.dart | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/lib/controllers/providers/api/service_requests_provider.dart b/lib/controllers/providers/api/service_requests_provider.dart index 1b64bb03..d62ee9f5 100644 --- a/lib/controllers/providers/api/service_requests_provider.dart +++ b/lib/controllers/providers/api/service_requests_provider.dart @@ -600,7 +600,7 @@ class ServiceRequestsProvider extends ChangeNotifier { "pageSize": pageItemNumber, "pageNumber": ((workOrders?.length ?? 0) ~/ pageItemNumber) + 1, if (callerId?.isNotEmpty ?? false) "callId": callerId, - if (search.assetType != null) "assetSerialNo": search.assetType, + if (search.assetType != null) "assetSerialNo": search.assetType?.name, if (search.id != null) "workOrderNo": search.id?.toString(), if (search.calllastSituation != null) "callslastSituationWO": search.calllastSituation.toMap(), if (search.assignedEmployee != null) @@ -628,6 +628,7 @@ class ServiceRequestsProvider extends ChangeNotifier { } return workOrders; } catch (e) { + print(e); return []; } } From 1fa14c1a86cdd2289b43202c67e4666db3eef8c0 Mon Sep 17 00:00:00 2001 From: nextwo <1234> Date: Tue, 20 Jun 2023 09:43:53 +0300 Subject: [PATCH 093/181] work order --- .../service_request/search_work_order.dart | 84 ++----------------- .../create_sub_workorder_page.dart | 10 +-- 2 files changed, 11 insertions(+), 83 deletions(-) diff --git a/lib/models/service_request/search_work_order.dart b/lib/models/service_request/search_work_order.dart index 78a43616..2cdd3edd 100644 --- a/lib/models/service_request/search_work_order.dart +++ b/lib/models/service_request/search_work_order.dart @@ -1,5 +1,7 @@ import 'package:test_sa/models/lookup.dart'; +import '../fault_description.dart'; + class SearchWorkOrder { SearchWorkOrder({ this.id, @@ -63,7 +65,7 @@ class SearchWorkOrder { calllastSituation = json['calllastSituation'] != null ? Lookup.fromJson(json['calllastSituation']) : null; currentSituation = json['currentSituation'] != null ? Lookup.fromJson(json['currentSituation']) : null; repairLocation = json['repairLocation'] != null ? Lookup.fromJson(json['repairLocation']) : null; - reason = json['reason'] != null ? Reason.fromJson(json['reason']) : null; + reason = json['reason'] != null ? Lookup.fromJson(json['reason']) : null; startofWorkTime = json['startofWorkTime']; endofWorkTime = json['endofWorkTime']; workingHours = json['workingHours']; @@ -111,7 +113,7 @@ class SearchWorkOrder { Lookup calllastSituation; Lookup currentSituation; Lookup repairLocation; - Reason reason; + Lookup reason; String startofWorkTime; String endofWorkTime; num workingHours; @@ -144,7 +146,7 @@ class SearchWorkOrder { Lookup calllastSituation, Lookup currentSituation, Lookup repairLocation, - Reason reason, + Lookup reason, String startofWorkTime, String endofWorkTime, num workingHours, @@ -232,7 +234,7 @@ class SearchWorkOrder { map['repairLocation'] = repairLocation.toMap(); } if (reason != null) { - map['reason'] = reason.toJson(); + map['reason'] = reason.toMap(); } map['startofWorkTime'] = startofWorkTime; map['endofWorkTime'] = endofWorkTime; @@ -1004,80 +1006,6 @@ class SparePart { } } -class FaultDescription { - FaultDescription({ - this.id, - this.defectName, - this.workPerformed, - this.estimatedTime, - }); - - FaultDescription.fromJson(dynamic json) { - id = json['id']; - defectName = json['defectName']; - workPerformed = json['workPerformed']; - estimatedTime = json['estimatedTime']; - } - num id; - String defectName; - String workPerformed; - String estimatedTime; - FaultDescription copyWith({ - num id, - String defectName, - String workPerformed, - String estimatedTime, - }) => - FaultDescription( - id: id ?? this.id, - defectName: defectName ?? this.defectName, - workPerformed: workPerformed ?? this.workPerformed, - estimatedTime: estimatedTime ?? this.estimatedTime, - ); - Map toJson() { - final map = {}; - map['id'] = id; - map['defectName'] = defectName; - map['workPerformed'] = workPerformed; - map['estimatedTime'] = estimatedTime; - return map; - } -} - -class Reason { - Reason({ - this.id, - this.name, - this.value, - }); - - Reason.fromJson(dynamic json) { - id = json['id']; - name = json['name']; - value = json['value']; - } - num id; - String name; - num value; - Reason copyWith({ - num id, - String name, - num value, - }) => - Reason( - id: id ?? this.id, - name: name ?? this.name, - value: value ?? this.value, - ); - Map toJson() { - final map = {}; - map['id'] = id; - map['name'] = name; - map['value'] = value; - return map; - } -} - class ContactPersonWorkOrders { ContactPersonWorkOrders({ this.id, diff --git a/lib/views/pages/sub_workorder/create_sub_workorder_page.dart b/lib/views/pages/sub_workorder/create_sub_workorder_page.dart index 9c6eb283..9871ed31 100644 --- a/lib/views/pages/sub_workorder/create_sub_workorder_page.dart +++ b/lib/views/pages/sub_workorder/create_sub_workorder_page.dart @@ -43,7 +43,7 @@ class _CreateSubWorkOrderPageState extends State { @override Widget build(BuildContext context) { final Subtitle subtitle = AppLocalization.of(context).subtitle; - _serviceReport =ServiceReport(id: widget.workOrder.id, type: Lookup(name: widget.workOrder.assetType),equipmentStatus: Lookup(name: widget.workOrder.equipmentStatus) ); + _serviceReport =ServiceReport(id: widget.workOrder.id, type: widget.workOrder.assetType,equipmentStatus:widget.workOrder.equipmentStatus); return Scaffold( body: SafeArea( child: SingleChildScrollView( @@ -89,7 +89,7 @@ class _CreateSubWorkOrderPageState extends State { ServiceReportEquipmentStatusMenu( report: _serviceReport, onSelect: (status) { - _searchWorkOrders.equipmentStatus=status.name; + _searchWorkOrders.equipmentStatus=status; _serviceReport.equipmentStatus=status; }, ), @@ -129,7 +129,7 @@ class _CreateSubWorkOrderPageState extends State { initialValue: _serviceReportReason, onSelect: (status) { _serviceReportReason=status; - _searchWorkOrders.reason = status.name; + _searchWorkOrders.reason = status; }, ), ], @@ -146,7 +146,7 @@ class _CreateSubWorkOrderPageState extends State { requestId: widget.workOrder.id.toString(), initialValue: FaultDescription(id: _searchWorkOrders?.faultDescription?.id, defectName: _searchWorkOrders?.faultDescription?.defectName, workPerformed: _searchWorkOrders?.faultDescription?.workPerformed, estimatedTime: _searchWorkOrders?.faultDescription?.estimatedTime), onSelect: (status) { - _searchWorkOrders.faultDescription = ModelDefRelatedDefects(id: status?.id, defectName: status?.defectName, workPerformed: status?.workPerformed, estimatedTime: status?.estimatedTime); + _searchWorkOrders.faultDescription=status; }, ), ], @@ -243,7 +243,7 @@ class _CreateSubWorkOrderPageState extends State { child: AButton( text: subtitle.create, onPressed: () async { - _searchWorkOrders.parentWOId=widget.workOrder.id.toString(); + _searchWorkOrders.parentWOId=widget.workOrder.id; // validate = true; // if (!_formKey.currentState.validate()) { // setState(() {}); From 52eee5196f05a2d45937ea7595f142683848a051 Mon Sep 17 00:00:00 2001 From: nextwo <1234> Date: Tue, 20 Jun 2023 11:36:59 +0300 Subject: [PATCH 094/181] work order --- .../api/service_requests_provider.dart | 22 +++++ .../service_request/search_work_order.dart | 2 +- .../create_sub_workorder_page.dart | 94 +++++++++---------- 3 files changed, 70 insertions(+), 48 deletions(-) diff --git a/lib/controllers/providers/api/service_requests_provider.dart b/lib/controllers/providers/api/service_requests_provider.dart index d62ee9f5..d0dd0caf 100644 --- a/lib/controllers/providers/api/service_requests_provider.dart +++ b/lib/controllers/providers/api/service_requests_provider.dart @@ -365,6 +365,28 @@ class ServiceRequestsProvider extends ChangeNotifier { } } + Future createSubWorkOrder({ + @required SearchWorkOrder workOrder, + }) async { + Response response; + try { + Map body= workOrder.toJson(); + response = await ApiManager.instance.post(URLs.createServiceReport, body: body); + print(response.body); + + + stateCode = response.statusCode; + if (response.statusCode >= 200 && response.statusCode < 300) { + reset(); + notifyListeners(); + } + return response.statusCode; + } catch (error) { + print(error); + return -1; + } + } + CallRequestForWorkOrder callRequestForWorkOrder; Future getCallRequestForWorkOrder({String callId}) async { diff --git a/lib/models/service_request/search_work_order.dart b/lib/models/service_request/search_work_order.dart index 2cdd3edd..e2961414 100644 --- a/lib/models/service_request/search_work_order.dart +++ b/lib/models/service_request/search_work_order.dart @@ -250,7 +250,7 @@ class SearchWorkOrder { map['reviewComment'] = reviewComment; map['comment'] = comment; if (attachmentsWorkOrder != null) { - map['attachmentsWorkOrder'] = attachmentsWorkOrder.map((v) => v.toJson()).toList(); + map['attachmentsWorkOrder'] = attachmentsWorkOrder.map((v) => {"name": v.name})?.toList(); } if (equipmentStatus != null) { map['equipmentStatus'] = equipmentStatus.toMap(); diff --git a/lib/views/pages/sub_workorder/create_sub_workorder_page.dart b/lib/views/pages/sub_workorder/create_sub_workorder_page.dart index 9871ed31..ea5e6701 100644 --- a/lib/views/pages/sub_workorder/create_sub_workorder_page.dart +++ b/lib/views/pages/sub_workorder/create_sub_workorder_page.dart @@ -1,8 +1,11 @@ + +import 'dart:convert'; +import 'dart:io'; + import 'package:flutter/material.dart'; import 'package:fluttertoast/fluttertoast.dart'; import 'package:provider/provider.dart'; import 'package:test_sa/controllers/providers/api/service_requests_provider.dart'; -import 'package:test_sa/extensions/widget_extensions.dart'; import 'package:test_sa/models/lookup.dart'; import 'package:test_sa/models/service_report.dart'; import 'package:test_sa/models/service_request/search_work_order.dart'; @@ -20,7 +23,6 @@ import '../../widgets/buttons/app_back_button.dart'; import '../../widgets/buttons/app_button.dart'; import '../../widgets/date_and_time/date_picker.dart'; import '../../widgets/images/mini_one_image_picker.dart'; -import '../../widgets/status/report/fault_desc_menu.dart'; import '../../widgets/status/report/service_report_equipment_status.dart'; import '../../widgets/status/report/service_report_fault_description.dart'; import '../../widgets/status/report/service_report_reasons.dart'; @@ -37,9 +39,17 @@ class CreateSubWorkOrderPage extends StatefulWidget { class _CreateSubWorkOrderPageState extends State { final GlobalKey _formKey = GlobalKey(); - SearchWorkOrder _searchWorkOrders =SearchWorkOrder(); + SearchWorkOrder _subWorkOrders =SearchWorkOrder(); Lookup _serviceReportReason=Lookup(); ServiceReport _serviceReport; + File _image; + bool _isLoading = false; + + @override + void initState() { + + super.initState(); + } @override Widget build(BuildContext context) { final Subtitle subtitle = AppLocalization.of(context).subtitle; @@ -89,7 +99,7 @@ class _CreateSubWorkOrderPageState extends State { ServiceReportEquipmentStatusMenu( report: _serviceReport, onSelect: (status) { - _searchWorkOrders.equipmentStatus=status; + _subWorkOrders.equipmentStatus=status; _serviceReport.equipmentStatus=status; }, ), @@ -107,8 +117,10 @@ class _CreateSubWorkOrderPageState extends State { children: [ Expanded( child: ADatePicker( + date: DateTime.tryParse(_subWorkOrders.visitDate??""), from: DateTime(1950), onDatePicker: (date) { + _subWorkOrders.visitDate=date?.toIso8601String(); setState(() {}); }, ), @@ -129,7 +141,7 @@ class _CreateSubWorkOrderPageState extends State { initialValue: _serviceReportReason, onSelect: (status) { _serviceReportReason=status; - _searchWorkOrders.reason = status; + _subWorkOrders.reason = status; }, ), ], @@ -144,30 +156,30 @@ class _CreateSubWorkOrderPageState extends State { ), ServiceReportFaultDescription( requestId: widget.workOrder.id.toString(), - initialValue: FaultDescription(id: _searchWorkOrders?.faultDescription?.id, defectName: _searchWorkOrders?.faultDescription?.defectName, workPerformed: _searchWorkOrders?.faultDescription?.workPerformed, estimatedTime: _searchWorkOrders?.faultDescription?.estimatedTime), + initialValue: FaultDescription(id: _subWorkOrders?.faultDescription?.id, defectName: _subWorkOrders?.faultDescription?.defectName, workPerformed: _subWorkOrders?.faultDescription?.workPerformed, estimatedTime: _subWorkOrders?.faultDescription?.estimatedTime), onSelect: (status) { - _searchWorkOrders.faultDescription=status; + _subWorkOrders.faultDescription=status; }, ), ], ), const SizedBox(height: 8), - Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - ASubTitle("Solution"), - const SizedBox( - height: 4, - ), - ATextFormField( - labelText: "Add some text", - textInputType: TextInputType.multiline, - onSaved: (value) { - - }, - ), - ], - ), + // Column( + // crossAxisAlignment: CrossAxisAlignment.start, + // children: [ + // ASubTitle("Solution"), + // const SizedBox( + // height: 4, + // ), + // ATextFormField( + // labelText: "Add some text", + // textInputType: TextInputType.multiline, + // onSaved: (value) { + // + // }, + // ), + // ], + // ), const SizedBox(height: 8), InkWell( onTap: () { @@ -222,11 +234,10 @@ class _CreateSubWorkOrderPageState extends State { ), const SizedBox(height: 8), AMiniOneImagePicker( - //error: _validate && _serviceReport.image == null, - //image: _image, + image: _image, onPick: (image) { - //_image = image; - // _serviceReport.image = "${image.path.split("/").last}|${base64Encode(image.readAsBytesSync())}"; + _image = image; + _subWorkOrders.attachmentsWorkOrder.add(AttachmentsWorkOrder(name: "${image.path.split("/").last}|${base64Encode(image.readAsBytesSync())}")); }, ), const SizedBox(height: 50), @@ -243,32 +254,21 @@ class _CreateSubWorkOrderPageState extends State { child: AButton( text: subtitle.create, onPressed: () async { - _searchWorkOrders.parentWOId=widget.workOrder.id; - // validate = true; - // if (!_formKey.currentState.validate()) { - // setState(() {}); - // return; - // } - // if (!_serviceReport.validate()) return; - _formKey.currentState.save(); - - // _isLoading = true; + _subWorkOrders.parentWOId=widget.workOrder.id; + _isLoading = true; setState(() {}); - - int status = await Provider.of(context).createServiceReport( - // user: _userProvider.user, - // host: _settingProvider.host, - // report: _serviceReport, - // request: widget.request, - ); - // _isLoading = false; + if (_formKey.currentState?.validate() ?? false) {} + _formKey.currentState?.save(); + final serviceRequestsProvider = Provider.of(context, listen: false); + final status = await serviceRequestsProvider.createSubWorkOrder(workOrder: _subWorkOrders); + _isLoading = false; setState(() {}); - if (status >= 200 && status < 300) { + if (status>= 200 && status< 300) { Fluttertoast.showToast(msg: subtitle.requestCompleteSuccessfully); Navigator.of(context).pop(); Navigator.of(context).pop(); } else { - String errorMessage = HttpStatusManger.getStatusMessage(status: status, subtitle: subtitle); + String errorMessage = HttpStatusManger.getStatusMessage(status: serviceRequestsProvider.stateCode, subtitle: subtitle); ScaffoldMessenger.of(context).showSnackBar(SnackBar( content: Text(errorMessage), )); From ffaa340d9ddb9eef44aaff37a0e7c8b2d09bbde8 Mon Sep 17 00:00:00 2001 From: zaid_daoud Date: Tue, 20 Jun 2023 12:40:06 +0300 Subject: [PATCH 095/181] Enhancements --- ...e_report_assistants_employee_provider.dart | 76 ++++++++++++ .../report/service_report_users_provider.dart | 8 +- lib/main.dart | 2 + .../service_request/search_work_order.dart | 52 +++++++-- .../create_sub_workorder_page.dart | 87 +++++++------- .../spare_parts_details_bottom_sheet.dart | 54 +++------ .../work_order_details_bottom_sheet.dart | 67 +++-------- .../status/assistant_employee_menu.dart | 109 ++++++++++++++++++ .../report/service_report_all_users.dart | 4 +- ...ervice_report_assistant_employee_menu.dart | 31 +++++ 10 files changed, 344 insertions(+), 146 deletions(-) create mode 100644 lib/controllers/providers/api/status_drop_down/report/service_report_assistants_employee_provider.dart create mode 100644 lib/views/widgets/status/assistant_employee_menu.dart create mode 100644 lib/views/widgets/status/report/service_report_assistant_employee_menu.dart diff --git a/lib/controllers/providers/api/status_drop_down/report/service_report_assistants_employee_provider.dart b/lib/controllers/providers/api/status_drop_down/report/service_report_assistants_employee_provider.dart new file mode 100644 index 00000000..922242a9 --- /dev/null +++ b/lib/controllers/providers/api/status_drop_down/report/service_report_assistants_employee_provider.dart @@ -0,0 +1,76 @@ +import 'dart:convert'; + +import 'package:flutter/cupertino.dart'; +import 'package:flutter/material.dart'; +import 'package:http/http.dart'; +import 'package:test_sa/controllers/api_routes/api_manager.dart'; +import 'package:test_sa/controllers/api_routes/urls.dart'; +import 'package:test_sa/models/service_request/search_work_order.dart'; + +class ServiceReportAssistantsEmployeeProvider extends ChangeNotifier { + //reset provider data + void reset() { + _assistantEmployees = null; + _loading = null; + _stateCode = null; + } + + // state code of current request to defied error message + // like 400 customer request failed + // 500 service not available + int _stateCode; + int get stateCode => _stateCode; + + // contain user data + // when user not login or register _user = null + List _assistantEmployees; + List get assistantEmployees => _assistantEmployees; + + // when categories in-process _loading = true + // done _loading = true + // failed _loading = false + bool _loading; + bool get isLoading => _loading; + set isLoading(bool isLoading) { + _loading = isLoading; + notifyListeners(); + } + + /// return -2 if request in progress + /// return -1 if error happen when sending request + /// 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 getAssistantEmployees() async { + if (_loading == true) return -2; + _loading = true; + notifyListeners(); + Response response; + try { + response = await ApiManager.instance.get( + "${URLs.getEngineers}", + ); + // response = await get( + // Uri.parse( + // URLs.getServiceReportLastCalls + // +(serviceStatus == null ? "" : "?service_status=$serviceStatus") + // ), + // ); + _stateCode = response.statusCode; + if (response.statusCode >= 200 && response.statusCode < 300) { + // client's request was successfully received + List usersListJson = json.decode(response.body); + _assistantEmployees = []; + _assistantEmployees = usersListJson.map((type) => AssistantEmployees.fromJson(type ?? {})).toList(); + } + _loading = false; + notifyListeners(); + return response.statusCode; + } catch (error) { + _loading = false; + _stateCode = -1; + notifyListeners(); + return -1; + } + } +} diff --git a/lib/controllers/providers/api/status_drop_down/report/service_report_users_provider.dart b/lib/controllers/providers/api/status_drop_down/report/service_report_users_provider.dart index 42132b29..6fcd5f80 100644 --- a/lib/controllers/providers/api/status_drop_down/report/service_report_users_provider.dart +++ b/lib/controllers/providers/api/status_drop_down/report/service_report_users_provider.dart @@ -10,7 +10,7 @@ import 'package:test_sa/models/engineer.dart'; class ServiceReportUsersProvider extends ChangeNotifier { //reset provider data void reset() { - _calls = null; + _engineers = null; _loading = null; _stateCode = null; } @@ -23,8 +23,8 @@ class ServiceReportUsersProvider extends ChangeNotifier { // contain user data // when user not login or register _user = null - List _calls; - List get users => _calls; + List _engineers; + List get engineers => _engineers; // when categories in-process _loading = true // done _loading = true @@ -60,7 +60,7 @@ class ServiceReportUsersProvider extends ChangeNotifier { if (response.statusCode >= 200 && response.statusCode < 300) { // client's request was successfully received List usersListJson = json.decode(response.body); - _calls = usersListJson.map((type) => Engineer.fromJson(type)).toList(); + _engineers = usersListJson.map((type) => Engineer.fromJson(type)).toList(); } _loading = false; notifyListeners(); diff --git a/lib/main.dart b/lib/main.dart index 89f7489a..466e0528 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -55,6 +55,7 @@ import 'package:test_sa/views/widgets/equipment/single_device_picker.dart'; import 'controllers/providers/api/parts_provider.dart'; import 'controllers/providers/api/preventive_maintenance_visits_provider.dart'; import 'controllers/providers/api/status_drop_down/pentry/pentry_status_provider.dart'; +import 'controllers/providers/api/status_drop_down/report/service_report_assistants_employee_provider.dart'; import 'controllers/providers/api/status_drop_down/report/service_report_fault_description_provider.dart'; import 'controllers/providers/api/status_drop_down/report/service_report_last_calls_provider.dart'; import 'controllers/providers/api/status_drop_down/report/service_report_reasons_provider.dart'; @@ -129,6 +130,7 @@ class MyApp extends StatelessWidget { ChangeNotifierProvider(create: (_) => ServiceReportVisitOperatorProvider()), ChangeNotifierProvider(create: (_) => ServiceReportMaintenanceSituationProvider()), ChangeNotifierProvider(create: (_) => ServiceReportUsersProvider()), + ChangeNotifierProvider(create: (_) => ServiceReportAssistantsEmployeeProvider()), ], child: GestureDetector( onTap: () { diff --git a/lib/models/service_request/search_work_order.dart b/lib/models/service_request/search_work_order.dart index e2961414..d13626f6 100644 --- a/lib/models/service_request/search_work_order.dart +++ b/lib/models/service_request/search_work_order.dart @@ -1,7 +1,6 @@ +import 'package:test_sa/models/fault_description.dart'; import 'package:test_sa/models/lookup.dart'; -import '../fault_description.dart'; - class SearchWorkOrder { SearchWorkOrder({ this.id, @@ -97,6 +96,41 @@ class SearchWorkOrder { nurseSignature = json['nurseSignature']; woParentDto = json['woParentDto'] != null ? WoParentDto.fromJson(json['woParentDto']) : null; } + + void copyFrom(SearchWorkOrder wo) { + parentWOId = wo.parentWOId ?? parentWOId; + workOrderNo = wo.workOrderNo ?? workOrderNo; + workOrderYear = wo.workOrderYear ?? workOrderYear; + workOrderSequennce = wo.workOrderSequennce ?? workOrderSequennce; + callRequest = wo.callRequest ?? callRequest; + assetType = wo.assetType ?? assetType; + assignedEmployee = wo.assignedEmployee ?? assignedEmployee; + visitDate = wo.visitDate ?? visitDate; + assistantEmployees = wo.assistantEmployees ?? assistantEmployees; + supplier = wo.supplier ?? supplier; + vendorTicketNumber = wo.vendorTicketNumber ?? vendorTicketNumber; + contactPersonWorkOrders = wo.contactPersonWorkOrders ?? contactPersonWorkOrders; + calllastSituation = wo.calllastSituation ?? calllastSituation; + currentSituation = wo.currentSituation ?? currentSituation; + repairLocation = wo.repairLocation ?? repairLocation; + reason = wo.reason ?? reason; + startofWorkTime = wo.startofWorkTime ?? startofWorkTime; + endofWorkTime = wo.endofWorkTime ?? endofWorkTime; + workingHours = wo.workingHours ?? workingHours; + travelingHours = wo.travelingHours ?? travelingHours; + travelingExpenses = wo.travelingExpenses ?? travelingExpenses; + faultDescription = wo.faultDescription ?? faultDescription; + sparePartsWorkOrders = wo.sparePartsWorkOrders ?? sparePartsWorkOrders; + reviewComment = wo.reviewComment ?? reviewComment; + comment = wo.comment ?? comment; + attachmentsWorkOrder = wo.attachmentsWorkOrder ?? attachmentsWorkOrder; + equipmentStatus = wo.equipmentStatus ?? equipmentStatus; + suppEngineerWorkOrders = wo.suppEngineerWorkOrders ?? suppEngineerWorkOrders; + engSignature = wo.engSignature ?? engSignature; + nurseSignature = wo.nurseSignature ?? nurseSignature; + woParentDto = wo.woParentDto ?? woParentDto; + } + num id; num parentWOId; String workOrderNo; @@ -215,7 +249,7 @@ class SearchWorkOrder { } map['visitDate'] = visitDate; if (assistantEmployees != null) { - map['assistantEmployees'] = assistantEmployees.map((v) => v.toJson()).toList(); + map['assistantEmployees'] = assistantEmployees.map((v) => v?.user?.id).toList(); } if (supplier != null) { map['supplier'] = supplier.toJson(); @@ -250,7 +284,7 @@ class SearchWorkOrder { map['reviewComment'] = reviewComment; map['comment'] = comment; if (attachmentsWorkOrder != null) { - map['attachmentsWorkOrder'] = attachmentsWorkOrder.map((v) => {"name": v.name})?.toList(); + map['attachmentsWorkOrder'] = attachmentsWorkOrder.map((v) => v.toJson()).toList(); } if (equipmentStatus != null) { map['equipmentStatus'] = equipmentStatus.toMap(); @@ -961,7 +995,7 @@ class SparePartsWorkOrders { ); Map toJson() { final map = {}; - map['id'] = id; + map['id'] = id ?? 0; if (sparePart != null) { map['sparePart'] = sparePart.toJson(); } @@ -999,7 +1033,7 @@ class SparePart { ); Map toJson() { final map = {}; - map['id'] = id; + map['id'] = id ?? 0; map['partNo'] = partNo; map['partName'] = partName; return map; @@ -1078,7 +1112,7 @@ class AssistantEmployees { AssistantEmployees.fromJson(dynamic json) { id = json['id']; - user = json['user'] != null ? UserModel.fromJson(json['user']) : null; + user = json['user'] != null ? UserModel.fromJson(json['user']) : UserModel(name: json['userName'], id: json['userId']); } num id; UserModel user; @@ -1689,6 +1723,8 @@ class Asset { } if (supplier != null) { map['supplier'] = supplier.toJson(); + } else { + map['supplier'] = []; } map['ipAddress'] = ipAddress; map['macAddress'] = macAddress; @@ -1707,6 +1743,8 @@ class Asset { } if (assetType != null) { map['assetType'] = assetType.toMap(); + } else { + map['assetType'] = []; } if (site != null) { map['site'] = site.toJson(); diff --git a/lib/views/pages/sub_workorder/create_sub_workorder_page.dart b/lib/views/pages/sub_workorder/create_sub_workorder_page.dart index ea5e6701..f111c11e 100644 --- a/lib/views/pages/sub_workorder/create_sub_workorder_page.dart +++ b/lib/views/pages/sub_workorder/create_sub_workorder_page.dart @@ -1,5 +1,5 @@ - import 'dart:convert'; +import 'dart:developer'; import 'dart:io'; import 'package:flutter/material.dart'; @@ -16,7 +16,6 @@ import 'package:test_sa/views/pages/sub_workorder/workorder_details.dart'; import '../../../controllers/api_routes/http_status_manger.dart'; import '../../../controllers/localization/localization.dart'; -import '../../../models/fault_description.dart'; import '../../../models/subtitle.dart'; import '../../widgets/app_text_form_field.dart'; import '../../widgets/buttons/app_back_button.dart'; @@ -39,21 +38,21 @@ class CreateSubWorkOrderPage extends StatefulWidget { class _CreateSubWorkOrderPageState extends State { final GlobalKey _formKey = GlobalKey(); - SearchWorkOrder _subWorkOrders =SearchWorkOrder(); - Lookup _serviceReportReason=Lookup(); + final SearchWorkOrder _subWorkOrders = SearchWorkOrder(); + Lookup _serviceReportReason = const Lookup(); ServiceReport _serviceReport; File _image; bool _isLoading = false; @override void initState() { - super.initState(); } + @override Widget build(BuildContext context) { final Subtitle subtitle = AppLocalization.of(context).subtitle; - _serviceReport =ServiceReport(id: widget.workOrder.id, type: widget.workOrder.assetType,equipmentStatus:widget.workOrder.equipmentStatus); + _serviceReport = ServiceReport(id: widget.workOrder.id, type: widget.workOrder.assetType, equipmentStatus: widget.workOrder.equipmentStatus); return Scaffold( body: SafeArea( child: SingleChildScrollView( @@ -71,7 +70,7 @@ class _CreateSubWorkOrderPageState extends State { child: Center( child: Text( "New Work Order", - style: Theme.of(context).textTheme.headline6.copyWith(color: AColors.white, fontStyle: FontStyle.italic), + style: Theme.of(context).textTheme.titleLarge.copyWith(color: AColors.white, fontStyle: FontStyle.italic), ), ), ), @@ -87,20 +86,22 @@ class _CreateSubWorkOrderPageState extends State { padding: const EdgeInsets.symmetric(horizontal: 8, vertical: 16), child: Column( children: [ - WorkOrderDetails(item: widget.workOrder,), + WorkOrderDetails( + item: widget.workOrder, + ), const SizedBox(height: 8), Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ - ASubTitle("Equipment status"), + const ASubTitle("Equipment status"), const SizedBox( height: 4, ), ServiceReportEquipmentStatusMenu( report: _serviceReport, onSelect: (status) { - _subWorkOrders.equipmentStatus=status; - _serviceReport.equipmentStatus=status; + _subWorkOrders.equipmentStatus = status; + _serviceReport.equipmentStatus = status; }, ), ], @@ -109,7 +110,7 @@ class _CreateSubWorkOrderPageState extends State { Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ - ASubTitle("Return to Service"), + const ASubTitle("Return to Service"), const SizedBox( height: 4, ), @@ -117,10 +118,10 @@ class _CreateSubWorkOrderPageState extends State { children: [ Expanded( child: ADatePicker( - date: DateTime.tryParse(_subWorkOrders.visitDate??""), + date: DateTime.tryParse(_subWorkOrders.visitDate ?? ""), from: DateTime(1950), onDatePicker: (date) { - _subWorkOrders.visitDate=date?.toIso8601String(); + _subWorkOrders.visitDate = date?.toIso8601String(); setState(() {}); }, ), @@ -133,14 +134,14 @@ class _CreateSubWorkOrderPageState extends State { Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ - ASubTitle("Failure "+subtitle.reasons), + ASubTitle("Failure ${subtitle.reasons}"), const SizedBox( height: 4, ), ServiceReportReasonsMenu( initialValue: _serviceReportReason, onSelect: (status) { - _serviceReportReason=status; + _serviceReportReason = status; _subWorkOrders.reason = status; }, ), @@ -155,41 +156,40 @@ class _CreateSubWorkOrderPageState extends State { height: 4, ), ServiceReportFaultDescription( - requestId: widget.workOrder.id.toString(), - initialValue: FaultDescription(id: _subWorkOrders?.faultDescription?.id, defectName: _subWorkOrders?.faultDescription?.defectName, workPerformed: _subWorkOrders?.faultDescription?.workPerformed, estimatedTime: _subWorkOrders?.faultDescription?.estimatedTime), + requestId: widget.workOrder.callRequest.id.toString(), + initialValue: _subWorkOrders.faultDescription, onSelect: (status) { - _subWorkOrders.faultDescription=status; + _subWorkOrders.faultDescription = status; }, ), ], ), const SizedBox(height: 8), - // Column( - // crossAxisAlignment: CrossAxisAlignment.start, - // children: [ - // ASubTitle("Solution"), - // const SizedBox( - // height: 4, - // ), - // ATextFormField( - // labelText: "Add some text", - // textInputType: TextInputType.multiline, - // onSaved: (value) { - // - // }, - // ), - // ], - // ), + Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + const ASubTitle("Solution"), + const SizedBox( + height: 4, + ), + ATextFormField( + labelText: "Add some text", + textInputType: TextInputType.multiline, + onSaved: (value) {}, + ), + ], + ), const SizedBox(height: 8), InkWell( - onTap: () { - showModalBottomSheet( + onTap: () async { + await showModalBottomSheet( context: context, useSafeArea: true, isScrollControlled: true, backgroundColor: Colors.transparent, - builder: (context) => WorkOrderDetailsBottomSheet(workOrder: widget.workOrder), + builder: (context) => WorkOrderDetailsBottomSheet(subWorkOrder: _subWorkOrders), ); + log(_subWorkOrders?.toJson()?.toString()); }, child: Card( child: ListTile( @@ -208,14 +208,15 @@ class _CreateSubWorkOrderPageState extends State { ), const SizedBox(height: 8), InkWell( - onTap: () { - showModalBottomSheet( + onTap: () async { + await showModalBottomSheet( context: context, useSafeArea: true, isScrollControlled: true, backgroundColor: Colors.transparent, - builder: (context) => SparePartsBottomSheet(workOrder: widget.workOrder), + builder: (context) => SparePartsBottomSheet(subWorkOrder: _subWorkOrders), ); + log(_subWorkOrders?.toJson()?.toString()); }, child: Card( child: ListTile( @@ -254,7 +255,7 @@ class _CreateSubWorkOrderPageState extends State { child: AButton( text: subtitle.create, onPressed: () async { - _subWorkOrders.parentWOId=widget.workOrder.id; + _subWorkOrders.parentWOId = widget.workOrder.id; _isLoading = true; setState(() {}); if (_formKey.currentState?.validate() ?? false) {} @@ -263,7 +264,7 @@ class _CreateSubWorkOrderPageState extends State { final status = await serviceRequestsProvider.createSubWorkOrder(workOrder: _subWorkOrders); _isLoading = false; setState(() {}); - if (status>= 200 && status< 300) { + if (status >= 200 && status < 300) { Fluttertoast.showToast(msg: subtitle.requestCompleteSuccessfully); Navigator.of(context).pop(); Navigator.of(context).pop(); diff --git a/lib/views/pages/sub_workorder/spare_parts_details_bottom_sheet.dart b/lib/views/pages/sub_workorder/spare_parts_details_bottom_sheet.dart index 444207ca..dec9771b 100644 --- a/lib/views/pages/sub_workorder/spare_parts_details_bottom_sheet.dart +++ b/lib/views/pages/sub_workorder/spare_parts_details_bottom_sheet.dart @@ -1,21 +1,16 @@ import 'package:flutter/material.dart'; -import 'package:fluttertoast/fluttertoast.dart'; -import 'package:provider/provider.dart'; import 'package:test_sa/models/service_request/search_work_order.dart'; import 'package:test_sa/views/app_style/colors.dart'; -import 'package:test_sa/views/widgets/loaders/app_loading.dart'; -import '../../../controllers/api_routes/http_status_manger.dart'; import '../../../controllers/localization/localization.dart'; -import '../../../controllers/providers/api/service_requests_provider.dart'; import '../../../models/subtitle.dart'; import '../../widgets/app_text_form_field.dart'; import '../../widgets/buttons/app_button.dart'; import '../../widgets/titles/app_sub_title.dart'; class SparePartsBottomSheet extends StatefulWidget { - final SearchWorkOrder workOrder; - const SparePartsBottomSheet({this.workOrder, Key key}) : super(key: key); + final SearchWorkOrder subWorkOrder; + const SparePartsBottomSheet({this.subWorkOrder, Key key}) : super(key: key); @override State createState() => _SparePartsBottomSheetState(); @@ -24,11 +19,11 @@ class SparePartsBottomSheet extends StatefulWidget { class _SparePartsBottomSheetState extends State { final GlobalKey _formKey = GlobalKey(); SearchWorkOrder _workOrder; - bool _isLoading = false; + @override void initState() { super.initState(); - _workOrder = widget.workOrder; + _workOrder = widget.subWorkOrder; } @override @@ -123,6 +118,7 @@ class _SparePartsBottomSheetState extends State { const SizedBox(height: 8), InkWell( onTap: () { + _workOrder.sparePartsWorkOrders ??= []; _workOrder.sparePartsWorkOrders.add(SparePartsWorkOrders()); setState(() {}); }, @@ -152,38 +148,14 @@ class _SparePartsBottomSheetState extends State { ), ), ), - _isLoading - ? const ALoading() - : AButton( - text: subtitle.update, - onPressed: () async { - // _validate = true; - if (!_formKey.currentState.validate()) { - setState(() {}); - return; - } - // if (!_serviceReport.validate()) { - // setState(() {}); - // return; - // } - _formKey.currentState.save(); - - _isLoading = true; - setState(() {}); - - int status = await Provider.of(context, listen: false).updateWorkOrderDetails(workOrder: _workOrder); - _isLoading = false; - setState(() {}); - if (status >= 200 && status < 300) { - Fluttertoast.showToast(msg: subtitle.requestCompleteSuccessfully); - Navigator.of(context).pop(); - // Navigator.of(context).pop(); - } else { - String errorMessage = HttpStatusManger.getStatusMessage(status: status, subtitle: subtitle); - ScaffoldMessenger.of(context).showSnackBar(SnackBar(content: Text(errorMessage))); - } - }, - ), + AButton( + text: subtitle.submit, + onPressed: () async { + _formKey.currentState.save(); + widget.subWorkOrder.copyFrom(_workOrder); + Navigator.pop(context); + }, + ), ], ), ), diff --git a/lib/views/pages/sub_workorder/work_order_details_bottom_sheet.dart b/lib/views/pages/sub_workorder/work_order_details_bottom_sheet.dart index d52ee389..9f9f185c 100644 --- a/lib/views/pages/sub_workorder/work_order_details_bottom_sheet.dart +++ b/lib/views/pages/sub_workorder/work_order_details_bottom_sheet.dart @@ -1,24 +1,20 @@ import 'package:flutter/material.dart'; -import 'package:fluttertoast/fluttertoast.dart'; -import 'package:provider/provider.dart'; -import 'package:test_sa/controllers/providers/api/service_requests_provider.dart'; import 'package:test_sa/models/service_request/search_work_order.dart'; import 'package:test_sa/models/subtitle.dart'; import 'package:test_sa/views/widgets/app_text_form_field.dart'; import 'package:test_sa/views/widgets/buttons/app_button.dart'; -import 'package:test_sa/views/widgets/loaders/app_loading.dart'; +import 'package:test_sa/views/widgets/status/report/service_report_assistant_employee_menu.dart'; import 'package:test_sa/views/widgets/status/report/service_report_maintenance_situation.dart'; import 'package:test_sa/views/widgets/status/report/service_report_repair_location.dart'; -import '../../../controllers/api_routes/http_status_manger.dart'; import '../../../controllers/localization/localization.dart'; import '../../app_style/sizing.dart'; import '../../widgets/date_and_time/time_picker.dart'; import '../../widgets/titles/app_sub_title.dart'; class WorkOrderDetailsBottomSheet extends StatefulWidget { - final SearchWorkOrder workOrder; - const WorkOrderDetailsBottomSheet({this.workOrder, Key key}) : super(key: key); + final SearchWorkOrder subWorkOrder; + const WorkOrderDetailsBottomSheet({this.subWorkOrder, Key key}) : super(key: key); @override State createState() => _WorkOrderDetailsBottomSheetState(); @@ -27,12 +23,11 @@ class WorkOrderDetailsBottomSheet extends StatefulWidget { class _WorkOrderDetailsBottomSheetState extends State { final GlobalKey _formKey = GlobalKey(); SearchWorkOrder _workOrder; - bool _isLoading = false; @override void initState() { super.initState(); - _workOrder = widget.workOrder; + _workOrder = widget.subWorkOrder; } @override @@ -70,14 +65,12 @@ class _WorkOrderDetailsBottomSheetState extends State(context, listen: false).updateWorkOrderDetails(workOrder: _workOrder); - _isLoading = false; - setState(() {}); - if (status >= 200 && status < 300) { - Fluttertoast.showToast(msg: subtitle.requestCompleteSuccessfully); - Navigator.of(context).pop(); - // Navigator.of(context).pop(); - } else { - String errorMessage = HttpStatusManger.getStatusMessage(status: status, subtitle: subtitle); - ScaffoldMessenger.of(context).showSnackBar(SnackBar(content: Text(errorMessage))); - } - }, - ), + AButton( + text: subtitle.submit, + onPressed: () async { + _formKey.currentState.save(); + widget.subWorkOrder.copyFrom(_workOrder); + Navigator.pop(context); + }, + ), ], ), ), diff --git a/lib/views/widgets/status/assistant_employee_menu.dart b/lib/views/widgets/status/assistant_employee_menu.dart new file mode 100644 index 00000000..fa7d9ed8 --- /dev/null +++ b/lib/views/widgets/status/assistant_employee_menu.dart @@ -0,0 +1,109 @@ +import 'package:flutter/material.dart'; +import 'package:test_sa/views/app_style/colors.dart'; +import 'package:test_sa/views/app_style/sizing.dart'; + +import '../../../models/service_request/search_work_order.dart'; + +class AssistantEmployeeMenu extends StatefulWidget { + final List statuses; + final AssistantEmployees initialStatus; + final Function(AssistantEmployees) onSelect; + + const AssistantEmployeeMenu({Key key, this.statuses, this.onSelect, this.initialStatus}) : super(key: key); + + @override + _SingleAssistantEmployeeMenuState createState() => _SingleAssistantEmployeeMenuState(); +} + +class _SingleAssistantEmployeeMenuState extends State { + AssistantEmployees _selectedStatus; + + @override + void setState(VoidCallback fn) { + if (mounted) super.setState(fn); + } + + @override + void didUpdateWidget(covariant AssistantEmployeeMenu oldWidget) { + if (widget.initialStatus != null) { + final result = widget.statuses?.where((element) { + return element == widget.initialStatus; + }); + if (result.isNotEmpty) { + _selectedStatus = result.first; + } else { + _selectedStatus = null; + } + if ((widget.initialStatus?.user?.id ?? "") != (_selectedStatus?.user?.id ?? "")) { + widget.onSelect(_selectedStatus); + } + } else { + _selectedStatus = null; + } + super.didUpdateWidget(oldWidget); + } + + @override + void initState() { + if (widget.initialStatus != null) { + final result = widget.statuses?.where((element) { + return element == widget.initialStatus; + }); + if (result.isNotEmpty) _selectedStatus = result.first; + if (widget.initialStatus?.user?.id != _selectedStatus?.user?.id) { + widget.onSelect(_selectedStatus); + } + } + + super.initState(); + } + + @override + Widget build(BuildContext context) { + return Container( + padding: const EdgeInsets.symmetric(horizontal: 16), + decoration: BoxDecoration( + color: AColors.inputFieldBackgroundColor, + border: Border.all( + color: Color(0xffefefef), + ), + borderRadius: BorderRadius.circular(AppStyle.borderRadius * AppStyle.getScaleFactor(context)), + // boxShadow: const [ + // AppStyle.boxShadow + // ] + ), + child: DropdownButton( + value: _selectedStatus, + iconSize: 24, + icon: const Icon(Icons.keyboard_arrow_down_rounded), + elevation: 0, + isExpanded: true, + hint: Text( + "Select", + style: Theme.of(context).textTheme.subtitle1, + ), + style: TextStyle(color: Theme.of(context).primaryColor), + underline: const SizedBox.shrink(), + onChanged: (AssistantEmployees newValue) { + setState(() { + _selectedStatus = newValue; + }); + widget.onSelect(newValue); + }, + items: widget.statuses.map>((AssistantEmployees value) { + return DropdownMenuItem( + value: value, + child: Text( + value.user?.name ?? "NULL", + style: Theme.of(context).textTheme.titleMedium.copyWith( + color: Theme.of(context).primaryColor, + fontSize: 11, + //fontWeight: FontWeight.bold + ), + ), + ); + }).toList(), + ), + ); + } +} diff --git a/lib/views/widgets/status/report/service_report_all_users.dart b/lib/views/widgets/status/report/service_report_all_users.dart index 981806f8..c3098096 100644 --- a/lib/views/widgets/status/report/service_report_all_users.dart +++ b/lib/views/widgets/status/report/service_report_all_users.dart @@ -14,14 +14,14 @@ class ServiceReportAllUsers extends StatelessWidget { ServiceReportUsersProvider menuProvider = Provider.of(context); return LoadingManager( isLoading: menuProvider.isLoading, - isFailedLoading: menuProvider.users == null, + isFailedLoading: menuProvider.engineers == null, stateCode: menuProvider.stateCode, onRefresh: () async { menuProvider.getAllUsers(); }, child: UsersMenu( initialStatus: initialValue, - statuses: menuProvider.users, + statuses: menuProvider.engineers, onSelect: onSelect, ), ); diff --git a/lib/views/widgets/status/report/service_report_assistant_employee_menu.dart b/lib/views/widgets/status/report/service_report_assistant_employee_menu.dart new file mode 100644 index 00000000..24b0cb6c --- /dev/null +++ b/lib/views/widgets/status/report/service_report_assistant_employee_menu.dart @@ -0,0 +1,31 @@ +import 'package:flutter/material.dart'; +import 'package:provider/provider.dart'; +import 'package:test_sa/models/service_request/search_work_order.dart'; +import 'package:test_sa/views/widgets/loaders/loading_manager.dart'; +import 'package:test_sa/views/widgets/status/assistant_employee_menu.dart'; + +import '../../../../controllers/providers/api/status_drop_down/report/service_report_assistants_employee_provider.dart'; + +class ServiceReportAssistantEmployeeMenu extends StatelessWidget { + final Function(AssistantEmployees) onSelect; + final AssistantEmployees initialValue; + const ServiceReportAssistantEmployeeMenu({Key key, @required this.onSelect, this.initialValue}) : super(key: key); + @override + Widget build(BuildContext context) { + ServiceReportAssistantsEmployeeProvider menuProvider = Provider.of(context); + return LoadingManager( + isLoading: menuProvider.isLoading, + isFailedLoading: menuProvider.assistantEmployees == null, + stateCode: menuProvider.stateCode, + onRefresh: () async { + await menuProvider.getAssistantEmployees(); + print("ccccccccccccccc"); + }, + child: AssistantEmployeeMenu( + initialStatus: initialValue, + statuses: menuProvider.assistantEmployees, + onSelect: onSelect, + ), + ); + } +} From 6aab5e675027c644dcacc56e24f0bd3e1c56f57d Mon Sep 17 00:00:00 2001 From: zaid_daoud Date: Tue, 20 Jun 2023 14:00:47 +0300 Subject: [PATCH 096/181] Enhancements --- .../pages/user/requests/request_details.dart | 22 +++++++++++++++++-- ...ervice_report_assistant_employee_menu.dart | 1 - 2 files changed, 20 insertions(+), 3 deletions(-) diff --git a/lib/views/pages/user/requests/request_details.dart b/lib/views/pages/user/requests/request_details.dart index 70464935..cc9a9297 100644 --- a/lib/views/pages/user/requests/request_details.dart +++ b/lib/views/pages/user/requests/request_details.dart @@ -408,8 +408,26 @@ class RequestDetailsPage extends StatelessWidget { ), ); } else { - return Center( - child: ASubTitle(_subtitle.noDateFound), + return Column( + children: [ + Expanded( + child: Center( + child: ASubTitle(_subtitle.noDateFound), + ), + ), + if (_userProvider.user.type == UsersTypes.engineer) + Center( + child: Padding( + padding: const EdgeInsets.all(32), + child: AButton( + text: "Create Report", + onPressed: () { + Navigator.of(context).push(MaterialPageRoute(builder: (_) => CreateServiceReport(request: serviceRequest))); + }, + ), + ), + ), + ], ); } }, diff --git a/lib/views/widgets/status/report/service_report_assistant_employee_menu.dart b/lib/views/widgets/status/report/service_report_assistant_employee_menu.dart index 24b0cb6c..1bf2c491 100644 --- a/lib/views/widgets/status/report/service_report_assistant_employee_menu.dart +++ b/lib/views/widgets/status/report/service_report_assistant_employee_menu.dart @@ -19,7 +19,6 @@ class ServiceReportAssistantEmployeeMenu extends StatelessWidget { stateCode: menuProvider.stateCode, onRefresh: () async { await menuProvider.getAssistantEmployees(); - print("ccccccccccccccc"); }, child: AssistantEmployeeMenu( initialStatus: initialValue, From e0d2f8360eaebfe5f673df033ba1eabfa5287c4a Mon Sep 17 00:00:00 2001 From: zaid_daoud Date: Tue, 20 Jun 2023 14:01:55 +0300 Subject: [PATCH 097/181] Enhancements --- lib/views/pages/user/requests/request_details.dart | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/views/pages/user/requests/request_details.dart b/lib/views/pages/user/requests/request_details.dart index cc9a9297..de9cc066 100644 --- a/lib/views/pages/user/requests/request_details.dart +++ b/lib/views/pages/user/requests/request_details.dart @@ -412,7 +412,7 @@ class RequestDetailsPage extends StatelessWidget { children: [ Expanded( child: Center( - child: ASubTitle(_subtitle.noDateFound), + child: ASubTitle(_subtitle.dataNotFound), ), ), if (_userProvider.user.type == UsersTypes.engineer) From 3010458cd8ab263ffb25613881eb28d060dded87 Mon Sep 17 00:00:00 2001 From: zaid_daoud Date: Tue, 20 Jun 2023 15:34:50 +0300 Subject: [PATCH 098/181] Enhancements --- .../api/service_requests_provider.dart | 13 +- .../create_sub_workorder_page.dart | 3 +- .../search_sub_workorder_page.dart | 49 ++------ .../spare_parts_details_bottom_sheet.dart | 8 +- .../work_order_details_bottom_sheet.dart | 4 +- .../pages/sub_workorder/workorder_list.dart | 114 +++++++++++++----- .../pages/user/requests/requests_page.dart | 12 +- 7 files changed, 109 insertions(+), 94 deletions(-) diff --git a/lib/controllers/providers/api/service_requests_provider.dart b/lib/controllers/providers/api/service_requests_provider.dart index d0dd0caf..9fb46d7c 100644 --- a/lib/controllers/providers/api/service_requests_provider.dart +++ b/lib/controllers/providers/api/service_requests_provider.dart @@ -23,6 +23,7 @@ class ServiceRequestsProvider extends ChangeNotifier { //reset provider data void reset() { + workOrders = []; serviceRequests = null; nextPage = true; stateCode = null; @@ -52,11 +53,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 String host, - @required User user, - @required int hospitalId, - }) async { + Future getRequests({@required int hospitalId}) async { if (isLoading == true) return -2; isLoading = true; if (serviceRequests == null) notifyListeners(); @@ -370,11 +367,10 @@ class ServiceRequestsProvider extends ChangeNotifier { }) async { Response response; try { - Map body= workOrder.toJson(); + Map body = workOrder.toJson(); response = await ApiManager.instance.post(URLs.createServiceReport, body: body); print(response.body); - stateCode = response.statusCode; if (response.statusCode >= 200 && response.statusCode < 300) { reset(); @@ -641,7 +637,8 @@ class ServiceRequestsProvider extends ChangeNotifier { // client's request was successfully received List workOrdersJson = json.decode(response.body)["data"]; print(workOrdersJson); - workOrders = workOrdersJson.map((request) => SearchWorkOrder.fromJson(request)).toList(); + workOrders ??= []; + workOrders.addAll(workOrdersJson.map((request) => SearchWorkOrder.fromJson(request)).toList()); if (workOrders.length == pageItemNumber) { nextPage = true; } else { diff --git a/lib/views/pages/sub_workorder/create_sub_workorder_page.dart b/lib/views/pages/sub_workorder/create_sub_workorder_page.dart index f111c11e..670db44f 100644 --- a/lib/views/pages/sub_workorder/create_sub_workorder_page.dart +++ b/lib/views/pages/sub_workorder/create_sub_workorder_page.dart @@ -38,7 +38,7 @@ class CreateSubWorkOrderPage extends StatefulWidget { class _CreateSubWorkOrderPageState extends State { final GlobalKey _formKey = GlobalKey(); - final SearchWorkOrder _subWorkOrders = SearchWorkOrder(); + SearchWorkOrder _subWorkOrders; Lookup _serviceReportReason = const Lookup(); ServiceReport _serviceReport; File _image; @@ -46,6 +46,7 @@ class _CreateSubWorkOrderPageState extends State { @override void initState() { + _subWorkOrders = SearchWorkOrder(assignedEmployee: widget.workOrder.assignedEmployee); super.initState(); } diff --git a/lib/views/pages/sub_workorder/search_sub_workorder_page.dart b/lib/views/pages/sub_workorder/search_sub_workorder_page.dart index afc41b9a..279f8576 100644 --- a/lib/views/pages/sub_workorder/search_sub_workorder_page.dart +++ b/lib/views/pages/sub_workorder/search_sub_workorder_page.dart @@ -173,6 +173,7 @@ class _SearchSubWorkOrderPageState extends State { if (_formKey.currentState?.validate() ?? false) {} _formKey.currentState?.save(); final serviceRequestsProvider = Provider.of(context, listen: false); + serviceRequestsProvider.reset(); final List woList = await serviceRequestsProvider.searchForWorkOrders( _searchWorkOrders, _callerId, @@ -186,43 +187,17 @@ class _SearchSubWorkOrderPageState extends State { Navigator.push( context, MaterialPageRoute( - builder: (context) => Scaffold( - body: SafeArea( - child: Column( - children: [ - Container( - color: AColors.primaryColor, - padding: const EdgeInsets.symmetric(horizontal: 0, vertical: 4), - child: Column( - children: [ - Row( - children: [ - ABackButton(), - Expanded( - child: Center( - child: Text( - "Work Order List", - style: Theme.of(context).textTheme.headline6.copyWith(color: AColors.white, fontStyle: FontStyle.italic), - ), - ), - ), - const SizedBox( - width: 48, - ) - ], - ), - ], - ), - ), - Expanded( - child: WorkOrderList( - items: woList, - nextPage: true, - onLazyLoad: () {}, - )), - ], - ), - )), + builder: (context) => WorkOrderList( + items: woList, + onLazyLoading: () async { + return await serviceRequestsProvider.searchForWorkOrders( + _searchWorkOrders, + _callerId, + _dateOperator, + _site, + ); + }, + ), ), ); } else { diff --git a/lib/views/pages/sub_workorder/spare_parts_details_bottom_sheet.dart b/lib/views/pages/sub_workorder/spare_parts_details_bottom_sheet.dart index dec9771b..bf022cc0 100644 --- a/lib/views/pages/sub_workorder/spare_parts_details_bottom_sheet.dart +++ b/lib/views/pages/sub_workorder/spare_parts_details_bottom_sheet.dart @@ -18,12 +18,12 @@ class SparePartsBottomSheet extends StatefulWidget { class _SparePartsBottomSheetState extends State { final GlobalKey _formKey = GlobalKey(); - SearchWorkOrder _workOrder; + final SearchWorkOrder _workOrder = SearchWorkOrder(); @override void initState() { super.initState(); - _workOrder = widget.subWorkOrder; + _workOrder.copyFrom(widget.subWorkOrder); } @override @@ -68,7 +68,7 @@ class _SparePartsBottomSheetState extends State { return Column( children: [ ATextFormField( - labelText: "Part No.", + labelText: _workOrder?.sparePartsWorkOrders[index]?.sparePart?.partNo ?? "Part No.", onChange: (value) { _workOrder.sparePartsWorkOrders[index].sparePart = SparePart(partNo: value); }, @@ -84,7 +84,7 @@ class _SparePartsBottomSheetState extends State { // ), const SizedBox(height: 8), ATextFormField( - labelText: "Quantity", + labelText: _workOrder?.sparePartsWorkOrders[index]?.qty?.toString() ?? "Quantity", textInputType: TextInputType.number, onSaved: (value) { _workOrder.sparePartsWorkOrders[index].qty = double.tryParse(value ?? ""); diff --git a/lib/views/pages/sub_workorder/work_order_details_bottom_sheet.dart b/lib/views/pages/sub_workorder/work_order_details_bottom_sheet.dart index 9f9f185c..1896435c 100644 --- a/lib/views/pages/sub_workorder/work_order_details_bottom_sheet.dart +++ b/lib/views/pages/sub_workorder/work_order_details_bottom_sheet.dart @@ -22,12 +22,12 @@ class WorkOrderDetailsBottomSheet extends StatefulWidget { class _WorkOrderDetailsBottomSheetState extends State { final GlobalKey _formKey = GlobalKey(); - SearchWorkOrder _workOrder; + final SearchWorkOrder _workOrder = SearchWorkOrder(); @override void initState() { super.initState(); - _workOrder = widget.subWorkOrder; + _workOrder.copyFrom(widget.subWorkOrder); } @override diff --git a/lib/views/pages/sub_workorder/workorder_list.dart b/lib/views/pages/sub_workorder/workorder_list.dart index 96c7b529..c78054a8 100644 --- a/lib/views/pages/sub_workorder/workorder_list.dart +++ b/lib/views/pages/sub_workorder/workorder_list.dart @@ -1,50 +1,100 @@ import 'dart:developer'; import 'package:flutter/material.dart'; +import 'package:provider/provider.dart'; import 'package:test_sa/views/pages/sub_workorder/workorder_item.dart'; import '../../../controllers/localization/localization.dart'; +import '../../../controllers/providers/api/service_requests_provider.dart'; import '../../../models/service_request/search_work_order.dart'; import '../../../models/subtitle.dart'; +import '../../app_style/colors.dart'; +import '../../widgets/buttons/app_back_button.dart'; import '../../widgets/loaders/lazy_loading.dart'; import '../../widgets/loaders/no_item_found.dart'; import 'create_sub_workorder_page.dart'; -class WorkOrderList extends StatelessWidget { - final List items; - final bool nextPage; - final Future Function() onLazyLoad; - const WorkOrderList({Key key, this.items, this.nextPage, this.onLazyLoad}) : super(key: key); +class WorkOrderList extends StatefulWidget { + List items; + final Future> Function() onLazyLoading; + WorkOrderList({Key key, this.items, this.onLazyLoading}) : super(key: key); + + @override + State createState() => _WorkOrderListState(); +} + +class _WorkOrderListState extends State { + List _items; + @override + void initState() { + super.initState(); + _items = widget.items; + } @override Widget build(BuildContext context) { - if (items.isEmpty) { - Subtitle subtitle = AppLocalization.of(context).subtitle; - return NoItemFound( - message: subtitle.noServiceRequestFound, - ); - } - return LazyLoading( - nextPage: nextPage, - onLazyLoad: onLazyLoad, - child: ListView.builder( - itemCount: items.length, - padding: const EdgeInsets.symmetric(horizontal: 16, vertical: 8), - itemBuilder: (context, itemIndex) { - return WorkOrderItem( - index: itemIndex, - onPressed: (model) { - // Navigator.of(context).push(MaterialPageRoute( - // builder: (_) => WorkOrderUpdate(item: model,))); - log(model?.toJson()?.toString()); - Navigator.push( - context, - MaterialPageRoute(builder: (context) => CreateSubWorkOrderPage(workOrder: model)), - ); - }, - item: items[itemIndex], - ); - }, + final serviceRequestsProvider = Provider.of(context, listen: false); + Subtitle subtitle = AppLocalization.of(context).subtitle; + return Scaffold( + body: SafeArea( + child: Column( + children: [ + Container( + color: AColors.primaryColor, + padding: const EdgeInsets.symmetric(horizontal: 0, vertical: 4), + child: Column( + children: [ + Row( + children: [ + const ABackButton(), + Expanded( + child: Center( + child: Text( + "Work Order List", + style: Theme.of(context).textTheme.headline6.copyWith(color: AColors.white, fontStyle: FontStyle.italic), + ), + ), + ), + const SizedBox(width: 48), + ], + ), + ], + ), + ), + Expanded( + child: _items?.isEmpty ?? [] + ? NoItemFound( + message: subtitle.noServiceRequestFound, + ) + : LazyLoading( + nextPage: serviceRequestsProvider.nextPage, + onLazyLoad: () async { + _items = await widget.onLazyLoading(); + setState(() {}); + }, + child: ListView.builder( + itemCount: _items.length, + padding: const EdgeInsets.symmetric(horizontal: 16, vertical: 8), + itemBuilder: (context, itemIndex) { + return WorkOrderItem( + index: itemIndex, + onPressed: (model) { + // Navigator.of(context).push(MaterialPageRoute( + // builder: (_) => WorkOrderUpdate(item: model,))); + log(model?.toJson()?.toString()); + Navigator.push( + context, + MaterialPageRoute(builder: (context) => CreateSubWorkOrderPage(workOrder: model)), + ); + }, + item: _items[itemIndex], + ); + }, + ), + ), + ), + ], + ), ), ); } diff --git a/lib/views/pages/user/requests/requests_page.dart b/lib/views/pages/user/requests/requests_page.dart index 06160333..a21debef 100644 --- a/lib/views/pages/user/requests/requests_page.dart +++ b/lib/views/pages/user/requests/requests_page.dart @@ -44,11 +44,7 @@ class _ServiceRequestsPageState extends State with TickerPr stateCode: _serviceRequestsProvider.stateCode, onRefresh: () async { _serviceRequestsProvider.reset(); - await _serviceRequestsProvider.getRequests( - user: _userProvider.user, - host: _settingProvider.host, - hospitalId: _userProvider.user.clientId, - ); + await _serviceRequestsProvider.getRequests(hospitalId: _userProvider.user.clientId); }, child: Stack( children: [ @@ -104,11 +100,7 @@ class _ServiceRequestsPageState extends State with TickerPr child: ServiceRequestsList( nextPage: _serviceRequestsProvider.nextPage, onLazyLoad: () async { - await _serviceRequestsProvider.getRequests( - user: _userProvider.user, - host: _settingProvider.host, - hospitalId: _userProvider.user.clientId, - ); + await _serviceRequestsProvider.getRequests(hospitalId: _userProvider.user.clientId); }, requests: _serviceRequestsProvider.serviceRequests, ), From f97712e43453e9281126f1152f14f931b1dd3ff8 Mon Sep 17 00:00:00 2001 From: nextwo <1234> Date: Tue, 20 Jun 2023 15:35:06 +0300 Subject: [PATCH 099/181] work order --- .../service_request/search_work_order.dart | 107 ++--- .../create_sub_workorder_page.dart | 442 ++++++++++-------- 2 files changed, 302 insertions(+), 247 deletions(-) diff --git a/lib/models/service_request/search_work_order.dart b/lib/models/service_request/search_work_order.dart index d13626f6..38c75f4d 100644 --- a/lib/models/service_request/search_work_order.dart +++ b/lib/models/service_request/search_work_order.dart @@ -1,6 +1,7 @@ -import 'package:test_sa/models/fault_description.dart'; import 'package:test_sa/models/lookup.dart'; +import '../fault_description.dart'; + class SearchWorkOrder { SearchWorkOrder({ this.id, @@ -233,7 +234,7 @@ class SearchWorkOrder { ); Map toJson() { final map = {}; - map['id'] = id; + map['id'] = id??0; map['parentWOId'] = parentWOId; map['workOrderNo'] = workOrderNo; map['workOrderYear'] = workOrderYear; @@ -378,8 +379,8 @@ class WoParentDto { map['assetType'] = assetType.toMap(); } map['vendorTicketNumber'] = vendorTicketNumber; - map['callId'] = callId; - map['id'] = id; + map['callId'] = callId??0; + map['id'] = id??0; if (stepsWorkOrderDto != null) { map['stepsWorkOrderDto'] = stepsWorkOrderDto.toJson(); } @@ -443,7 +444,7 @@ class SuppEngineerWorkOrders { ); Map toJson() { final map = {}; - map['id'] = id; + map['id'] = id??0; map['supplierContactId'] = supplierContactId; map['personName'] = personName; map['personRoleName'] = personRoleName; @@ -507,7 +508,7 @@ class StepsWorkOrderDto { Map toJson() { final map = {}; map['sequence'] = sequence; - map['id'] = id; + map['id'] = id??0; map['name'] = name; map['statusValue'] = statusValue; map['typeTransaction'] = typeTransaction; @@ -542,7 +543,7 @@ class SupplierModel { }); SupplierModel.fromJson(dynamic json) { - id = json['id']; + id = json['id']??0; suppliername = json['suppliername']; name = json['name']; website = json['website']; @@ -633,7 +634,7 @@ class SupplierModel { List suppTCodes, }) => SupplierModel( - id: id ?? this.id, + id: id ?? this.id??0, suppliername: suppliername ?? this.suppliername, name: name ?? this.name, website: website ?? this.website, @@ -655,7 +656,7 @@ class SupplierModel { ); Map toJson() { final map = {}; - map['id'] = id; + map['id'] = id??0; map['suppliername'] = suppliername; map['name'] = name; map['website'] = website; @@ -715,14 +716,14 @@ class SuppTCodes { String codeValue, }) => SuppTCodes( - id: id ?? this.id, + id: id ?? this.id??0, supplierId: supplierId ?? this.supplierId, codeTypeId: codeTypeId ?? this.codeTypeId, codeValue: codeValue ?? this.codeValue, ); Map toJson() { final map = {}; - map['id'] = id; + map['id'] = id??0; map['supplierId'] = supplierId; map['codeTypeId'] = codeTypeId; map['codeValue'] = codeValue; @@ -777,7 +778,7 @@ class SuppPersons { ); Map toJson() { final map = {}; - map['id'] = id; + map['id'] = id??0; map['supplierId'] = supplierId; map['personName'] = personName; map['personRoleId'] = personRoleId; @@ -820,7 +821,7 @@ class Attachments { ); Map toJson() { final map = {}; - map['id'] = id; + map['id'] = id??0; map['supplierId'] = supplierId; map['attachmentName'] = attachmentName; map['attachmentURL'] = attachmentURL; @@ -855,7 +856,7 @@ class Addresses { ); Map toJson() { final map = {}; - map['id'] = id; + map['id'] = id??0; map['supplierId'] = supplierId; map['address'] = address; return map; @@ -889,7 +890,7 @@ class Faxes { ); Map toJson() { final map = {}; - map['id'] = id; + map['id'] = id??0; map['supplierId'] = supplierId; map['fax'] = fax; return map; @@ -923,7 +924,7 @@ class Telephones { ); Map toJson() { final map = {}; - map['id'] = id; + map['id'] = id??0; map['supplierId'] = supplierId; map['telephone'] = telephone; return map; @@ -952,7 +953,7 @@ class AttachmentsWorkOrder { ); Map toJson() { final map = {}; - map['id'] = id; + map['id'] = id??0; map['name'] = name; return map; } @@ -995,7 +996,7 @@ class SparePartsWorkOrders { ); Map toJson() { final map = {}; - map['id'] = id ?? 0; + map['id'] = id??0; if (sparePart != null) { map['sparePart'] = sparePart.toJson(); } @@ -1033,7 +1034,7 @@ class SparePart { ); Map toJson() { final map = {}; - map['id'] = id ?? 0; + map['id'] = id??0; map['partNo'] = partNo; map['partName'] = partName; return map; @@ -1092,7 +1093,7 @@ class ContactPersonWorkOrders { ); Map toJson() { final map = {}; - map['id'] = id; + map['id'] = id??0; map['employeeCode'] = employeeCode; map['name'] = name; map['telephone'] = telephone; @@ -1126,7 +1127,7 @@ class AssistantEmployees { ); Map toJson() { final map = {}; - map['id'] = id; + map['id'] = id??0; if (user != null) { map['user'] = user.toJson(); } @@ -1156,7 +1157,7 @@ class UserModel { ); Map toJson() { final map = {}; - map['id'] = id; + map['id'] = id??0; map['name'] = name; return map; } @@ -1184,7 +1185,7 @@ class AssignedEmployee { ); Map toJson() { final map = {}; - map['id'] = id; + map['id'] = id??0; map['name'] = name; return map; } @@ -1262,7 +1263,7 @@ class CallRequest { ); Map toJson() { final map = {}; - map['id'] = id; + map['id'] = id??0; map['callNo'] = callNo; map['callComments'] = callComments; if (asset != null) { @@ -1318,7 +1319,7 @@ class FirstAction { ); Map toJson() { final map = {}; - map['id'] = id; + map['id'] = id??0; map['name'] = name; map['value'] = value; return map; @@ -1352,7 +1353,7 @@ class DefectType { ); Map toJson() { final map = {}; - map['id'] = id; + map['id'] = id??0; map['name'] = name; map['value'] = value; return map; @@ -1386,7 +1387,7 @@ class Status { ); Map toJson() { final map = {}; - map['id'] = id; + map['id'] = id??0; map['name'] = name; map['value'] = value; return map; @@ -1445,7 +1446,7 @@ class CallSiteContactPerson { ); Map toJson() { final map = {}; - map['id'] = id; + map['id'] = id??0; map['employeeCode'] = employeeCode; map['name'] = name; map['telephone'] = telephone; @@ -1714,7 +1715,7 @@ class Asset { ); Map toJson() { final map = {}; - map['id'] = id; + map['id'] = id??0; map['assetSerialNo'] = assetSerialNo; map['systemID'] = systemID; map['assetNumber'] = assetNumber; @@ -1830,7 +1831,7 @@ class TechnicalGuidanceBooks { ); Map toJson() { final map = {}; - map['id'] = id; + map['id'] = id??0; if (guidanceBook != null) { map['guidanceBook'] = guidanceBook.toJson(); } @@ -1865,7 +1866,7 @@ class GuidanceBook { ); Map toJson() { final map = {}; - map['id'] = id; + map['id'] = id??0; map['name'] = name; map['value'] = value; return map; @@ -1899,7 +1900,7 @@ class RemainderWarrantyMonths { ); Map toJson() { final map = {}; - map['id'] = id; + map['id'] = id??0; map['name'] = name; map['value'] = value; return map; @@ -1933,7 +1934,7 @@ class ExtendedWarrantyMonths { ); Map toJson() { final map = {}; - map['id'] = id; + map['id'] = id??0; map['name'] = name; map['value'] = value; return map; @@ -1967,7 +1968,7 @@ class SiteWarrantyMonths { ); Map toJson() { final map = {}; - map['id'] = id; + map['id'] = id??0; map['name'] = name; map['value'] = value; return map; @@ -2001,7 +2002,7 @@ class CommissioningStatus { ); Map toJson() { final map = {}; - map['id'] = id; + map['id'] = id??0; map['name'] = name; map['value'] = value; return map; @@ -2045,7 +2046,7 @@ class OriginSite { ); Map toJson() { final map = {}; - map['id'] = id; + map['id'] = id??0; map['customerCode'] = customerCode; map['custName'] = custName; if (buildings != null) { @@ -2092,7 +2093,7 @@ class Buildings { ); Map toJson() { final map = {}; - map['id'] = id; + map['id'] = id??0; map['name'] = name; map['value'] = value; if (floors != null) { @@ -2139,7 +2140,7 @@ class Floors { ); Map toJson() { final map = {}; - map['id'] = id; + map['id'] = id??0; map['name'] = name; map['value'] = value; if (departments != null) { @@ -2171,7 +2172,7 @@ class Departments { ); Map toJson() { final map = {}; - map['id'] = id; + map['id'] = id??0; map['name'] = name; return map; } @@ -2202,7 +2203,7 @@ class OriginDepartment { String ntCode, }) => OriginDepartment( - id: id ?? this.id, + id: id ?? this.id??0, departmentName: departmentName ?? this.departmentName, departmentCode: departmentCode ?? this.departmentCode, ntCode: ntCode ?? this.ntCode, @@ -2244,7 +2245,7 @@ class Currency { ); Map toJson() { final map = {}; - map['id'] = id; + map['id'] = id??0; map['name'] = name; map['value'] = value; return map; @@ -2283,7 +2284,7 @@ class Department { ); Map toJson() { final map = {}; - map['id'] = id; + map['id'] = id??0; map['departmentName'] = departmentName; map['departmentCode'] = departmentCode; map['ntCode'] = ntCode; @@ -2318,7 +2319,7 @@ class Floor { ); Map toJson() { final map = {}; - map['id'] = id; + map['id'] = id??0; map['name'] = name; map['value'] = value; return map; @@ -2352,7 +2353,7 @@ class Building { ); Map toJson() { final map = {}; - map['id'] = id; + map['id'] = id??0; map['name'] = name; map['value'] = value; return map; @@ -2396,7 +2397,7 @@ class Site { ); Map toJson() { final map = {}; - map['id'] = id; + map['id'] = id??0; map['customerCode'] = customerCode; map['custName'] = custName; if (buildings != null) { @@ -2443,7 +2444,7 @@ class ParentAsset { ); Map toJson() { final map = {}; - map['id'] = id; + map['id'] = id??0; map['assetSerialNo'] = assetSerialNo; map['assetNumber'] = assetNumber; map['tagCode'] = tagCode; @@ -2479,7 +2480,7 @@ class IsParent { ); Map toJson() { final map = {}; - map['id'] = id; + map['id'] = id??0; map['name'] = name; map['value'] = value; return map; @@ -2515,7 +2516,7 @@ class OldAsset { String systemId, }) => OldAsset( - id: id ?? this.id, + id: id ?? this.id??0, assetSerialNo: assetSerialNo ?? this.assetSerialNo, assetNumber: assetNumber ?? this.assetNumber, tagCode: tagCode ?? this.tagCode, @@ -2559,7 +2560,7 @@ class AssetReplace { ); Map toJson() { final map = {}; - map['id'] = id; + map['id'] = id??0; map['name'] = name; map['value'] = value; return map; @@ -2588,7 +2589,7 @@ class Supplier { ); Map toJson() { final map = {}; - map['id'] = id; + map['id'] = id??0; map['suppliername'] = suppliername; return map; } @@ -2681,7 +2682,7 @@ class ModelDefinition { ); Map toJson() { final map = {}; - map['id'] = id; + map['id'] = id??0; map['assetName'] = assetName; map['modelDefCode'] = modelDefCode; map['modelName'] = modelName; @@ -2724,7 +2725,7 @@ class Suppliers { ); Map toJson() { final map = {}; - map['id'] = id; + map['id'] = id??0; map['suppliername'] = suppliername; return map; } @@ -2755,7 +2756,7 @@ class ModelDefRelatedDefects { String estimatedTime, }) => ModelDefRelatedDefects( - id: id ?? this.id, + id: id ?? this.id??0, defectName: defectName ?? this.defectName, workPerformed: workPerformed ?? this.workPerformed, estimatedTime: estimatedTime ?? this.estimatedTime, diff --git a/lib/views/pages/sub_workorder/create_sub_workorder_page.dart b/lib/views/pages/sub_workorder/create_sub_workorder_page.dart index f111c11e..8c1d3f4a 100644 --- a/lib/views/pages/sub_workorder/create_sub_workorder_page.dart +++ b/lib/views/pages/sub_workorder/create_sub_workorder_page.dart @@ -1,3 +1,4 @@ + import 'dart:convert'; import 'dart:developer'; import 'dart:io'; @@ -43,12 +44,13 @@ class _CreateSubWorkOrderPageState extends State { ServiceReport _serviceReport; File _image; bool _isLoading = false; + bool _validate = false; @override void initState() { + super.initState(); } - @override Widget build(BuildContext context) { final Subtitle subtitle = AppLocalization.of(context).subtitle; @@ -56,196 +58,220 @@ class _CreateSubWorkOrderPageState extends State { return Scaffold( body: SafeArea( child: SingleChildScrollView( - child: Column( - children: [ - Container( - color: AColors.primaryColor, - padding: const EdgeInsets.symmetric(horizontal: 0, vertical: 4), - child: Column( - children: [ - Row( - children: [ - const ABackButton(), - Expanded( - child: Center( - child: Text( - "New Work Order", - style: Theme.of(context).textTheme.titleLarge.copyWith(color: AColors.white, fontStyle: FontStyle.italic), + child: Form( + key: _formKey, + child: Column( + children: [ + Container( + color: AColors.primaryColor, + padding: const EdgeInsets.symmetric(horizontal: 0, vertical: 4), + child: Column( + children: [ + Row( + children: [ + const ABackButton(), + Expanded( + child: Center( + child: Text( + "New Work Order", + style: Theme.of(context).textTheme.titleLarge.copyWith(color: AColors.white, fontStyle: FontStyle.italic), + ), ), ), - ), - const SizedBox( - width: 48, - ) - ], - ), - ], + const SizedBox( + width: 48, + ) + ], + ), + ], + ), ), - ), - Padding( - padding: const EdgeInsets.symmetric(horizontal: 8, vertical: 16), - child: Column( - children: [ - WorkOrderDetails( - item: widget.workOrder, - ), - const SizedBox(height: 8), - Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - const ASubTitle("Equipment status"), - const SizedBox( - height: 4, - ), - ServiceReportEquipmentStatusMenu( - report: _serviceReport, - onSelect: (status) { - _subWorkOrders.equipmentStatus = status; - _serviceReport.equipmentStatus = status; - }, - ), - ], - ), - const SizedBox(height: 8), - Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - const ASubTitle("Return to Service"), - const SizedBox( - height: 4, - ), - Row( - children: [ - Expanded( - child: ADatePicker( - date: DateTime.tryParse(_subWorkOrders.visitDate ?? ""), - from: DateTime(1950), - onDatePicker: (date) { - _subWorkOrders.visitDate = date?.toIso8601String(); - setState(() {}); - }, - ), + Padding( + padding: const EdgeInsets.symmetric(horizontal: 8, vertical: 16), + child: Column( + children: [ + WorkOrderDetails( + item: widget.workOrder, + ), + const SizedBox(height: 8), + Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + const ASubTitle("Equipment status"), + if (_validate && _subWorkOrders?.equipmentStatus == null) + ASubTitle( + subtitle.requiredWord, + color: Colors.red, ), - ], - ), - ], - ), - const SizedBox(height: 8), - Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - ASubTitle("Failure ${subtitle.reasons}"), - const SizedBox( - height: 4, - ), - ServiceReportReasonsMenu( - initialValue: _serviceReportReason, - onSelect: (status) { - _serviceReportReason = status; - _subWorkOrders.reason = status; - }, - ), - ], - ), - const SizedBox(height: 8), - Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - ASubTitle(subtitle.faultDescription), - const SizedBox( - height: 4, - ), - ServiceReportFaultDescription( - requestId: widget.workOrder.callRequest.id.toString(), - initialValue: _subWorkOrders.faultDescription, - onSelect: (status) { - _subWorkOrders.faultDescription = status; - }, - ), - ], - ), - const SizedBox(height: 8), - Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - const ASubTitle("Solution"), - const SizedBox( - height: 4, - ), - ATextFormField( - labelText: "Add some text", - textInputType: TextInputType.multiline, - onSaved: (value) {}, - ), - ], - ), - const SizedBox(height: 8), - InkWell( - onTap: () async { - await showModalBottomSheet( - context: context, - useSafeArea: true, - isScrollControlled: true, - backgroundColor: Colors.transparent, - builder: (context) => WorkOrderDetailsBottomSheet(subWorkOrder: _subWorkOrders), - ); - log(_subWorkOrders?.toJson()?.toString()); - }, - child: Card( - child: ListTile( - title: Row( + const SizedBox( + height: 4, + ), + ServiceReportEquipmentStatusMenu( + report: _serviceReport, + onSelect: (status) { + _subWorkOrders.equipmentStatus = status; + _serviceReport.equipmentStatus = status; + }, + ), + ], + ), + const SizedBox(height: 8), + Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + const ASubTitle("Return to Service"), + if (_validate && _subWorkOrders.visitDate == null) + ASubTitle( + subtitle.requiredWord, + color: Colors.red, + ), + const SizedBox( + height: 4, + ), + Row( children: [ - Text( - "WO Details", - style: Theme.of(context).textTheme.bodyMedium, + Expanded( + child: ADatePicker( + date: DateTime.tryParse(_subWorkOrders.visitDate ?? ""), + from: DateTime(1950), + onDatePicker: (date) { + _subWorkOrders.visitDate = date?.toIso8601String(); + setState(() {}); + }, + ), ), - const Text("*", style: TextStyle(color: Colors.red)), ], ), - trailing: const Icon(Icons.arrow_forward_ios, size: 14, color: AColors.primaryColor), + ], + ), + const SizedBox(height: 8), + Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + ASubTitle("Failure ${subtitle.reasons}"), + if (_validate && _subWorkOrders.reason == null) + ASubTitle( + subtitle.requiredWord, + color: Colors.red, + ), + const SizedBox( + height: 4, + ), + ServiceReportReasonsMenu( + initialValue: _serviceReportReason, + onSelect: (status) { + _serviceReportReason = status; + _subWorkOrders.reason = status; + }, + ), + ], + ), + const SizedBox(height: 8), + Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + ASubTitle(subtitle.faultDescription), + if (_validate && _subWorkOrders.faultDescription == null) + ASubTitle( + subtitle.requiredWord, + color: Colors.red, + ), + const SizedBox( + height: 4, + ), + ServiceReportFaultDescription( + requestId: widget.workOrder.callRequest.id.toString(), + initialValue: _subWorkOrders.faultDescription, + onSelect: (status) { + _subWorkOrders.faultDescription = status; + setState(() {}); + }, + ), + ], + ), + const SizedBox(height: 8), + Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + ASubTitle("Solution"), + const SizedBox( + height: 4, + ), + ATextFormField( + labelText: _subWorkOrders.faultDescription?.workPerformed??"", + textInputType: TextInputType.multiline, + enable:false + ), + ], + ), + const SizedBox(height: 8), + InkWell( + onTap: () async { + await showModalBottomSheet( + context: context, + useSafeArea: true, + isScrollControlled: true, + backgroundColor: Colors.transparent, + builder: (context) => WorkOrderDetailsBottomSheet(subWorkOrder: _subWorkOrders), + ); + log(_subWorkOrders?.toJson()?.toString()); + }, + child: Card( + child: ListTile( + title: Row( + children: [ + Text( + "WO Details", + style: Theme.of(context).textTheme.bodyMedium, + ), + const Text("*", style: TextStyle(color: Colors.red)), + ], + ), + trailing: const Icon(Icons.arrow_forward_ios, size: 14, color: AColors.primaryColor), + ), ), ), - ), - const SizedBox(height: 8), - InkWell( - onTap: () async { - await showModalBottomSheet( - context: context, - useSafeArea: true, - isScrollControlled: true, - backgroundColor: Colors.transparent, - builder: (context) => SparePartsBottomSheet(subWorkOrder: _subWorkOrders), - ); - log(_subWorkOrders?.toJson()?.toString()); - }, - child: Card( - child: ListTile( - title: Row( - children: [ - Text( - "Spare Parts", - style: Theme.of(context).textTheme.bodyMedium, - ), - const Text("*", style: TextStyle(color: Colors.red)), - ], + const SizedBox(height: 8), + InkWell( + onTap: () async { + await showModalBottomSheet( + context: context, + useSafeArea: true, + isScrollControlled: true, + backgroundColor: Colors.transparent, + builder: (context) => SparePartsBottomSheet(subWorkOrder: _subWorkOrders), + ); + log(_subWorkOrders?.toJson()?.toString()); + }, + child: Card( + child: ListTile( + title: Row( + children: [ + Text( + "Spare Parts", + style: Theme.of(context).textTheme.bodyMedium, + ), + const Text("*", style: TextStyle(color: Colors.red)), + ], + ), + trailing: const Icon(Icons.arrow_forward_ios, size: 14, color: AColors.primaryColor), ), - trailing: const Icon(Icons.arrow_forward_ios, size: 14, color: AColors.primaryColor), ), ), - ), - const SizedBox(height: 8), - AMiniOneImagePicker( - image: _image, - onPick: (image) { - _image = image; - _subWorkOrders.attachmentsWorkOrder.add(AttachmentsWorkOrder(name: "${image.path.split("/").last}|${base64Encode(image.readAsBytesSync())}")); - }, - ), - const SizedBox(height: 50), - ], + const SizedBox(height: 8), + AMiniOneImagePicker( + image: _image, + onPick: (image) { + _image = image; + _subWorkOrders.attachmentsWorkOrder.add(AttachmentsWorkOrder(name: "${image.path.split("/").last}|${base64Encode(image.readAsBytesSync())}")); + }, + ), + const SizedBox(height: 50), + ], + ), ), - ), - ], + ], + ), ), ), ), @@ -255,28 +281,56 @@ class _CreateSubWorkOrderPageState extends State { child: AButton( text: subtitle.create, onPressed: () async { - _subWorkOrders.parentWOId = widget.workOrder.id; - _isLoading = true; - setState(() {}); - if (_formKey.currentState?.validate() ?? false) {} - _formKey.currentState?.save(); - final serviceRequestsProvider = Provider.of(context, listen: false); - final status = await serviceRequestsProvider.createSubWorkOrder(workOrder: _subWorkOrders); - _isLoading = false; + _subWorkOrders.parentWOId=widget.workOrder.id; + _validate = true; setState(() {}); - if (status >= 200 && status < 300) { - Fluttertoast.showToast(msg: subtitle.requestCompleteSuccessfully); - Navigator.of(context).pop(); - Navigator.of(context).pop(); - } else { - String errorMessage = HttpStatusManger.getStatusMessage(status: serviceRequestsProvider.stateCode, subtitle: subtitle); - ScaffoldMessenger.of(context).showSnackBar(SnackBar( - content: Text(errorMessage), - )); + if(validate()){ + if(_subWorkOrders.startofWorkTime == null) + { + Fluttertoast.showToast(msg: subtitle.startDate + " required"); + return; + } else + if(_subWorkOrders.endofWorkTime == null) + { + Fluttertoast.showToast(msg: subtitle.endDate + " required"); + return; + } else + if(_subWorkOrders.calllastSituation == null) + { + Fluttertoast.showToast(msg: subtitle.callLastSituation + " required"); + return; + } + _validate = false; + _isLoading = true; + setState(() {}); + if (_formKey.currentState?.validate() ?? false) {} + _formKey.currentState?.save(); + final serviceRequestsProvider = Provider.of(context, listen: false); + final status = await serviceRequestsProvider.createSubWorkOrder(workOrder: _subWorkOrders); + _isLoading = false; + setState(() {}); + if (status>= 200 && status< 300) { + Fluttertoast.showToast(msg: subtitle.requestCompleteSuccessfully); + Navigator.of(context).pop(); + Navigator.of(context).pop(); + } else { + String errorMessage = HttpStatusManger.getStatusMessage(status: serviceRequestsProvider.stateCode, subtitle: subtitle); + ScaffoldMessenger.of(context).showSnackBar(SnackBar( + content: Text(errorMessage), + )); + } } }, ), ), ); } + + bool validate(){ + if(_subWorkOrders.faultDescription == null || _subWorkOrders.reason == null || _subWorkOrders.equipmentStatus == null|| _subWorkOrders.visitDate == null) { + return false; + } else { + return true; + } + } } From 7d7594a3abdcff5332705a0deee5ee33819f2560 Mon Sep 17 00:00:00 2001 From: nextwo <1234> Date: Tue, 20 Jun 2023 15:52:13 +0300 Subject: [PATCH 100/181] work order --- .../pages/sub_workorder/create_sub_workorder_page.dart | 7 +++++-- lib/views/pages/sub_workorder/workorder_details.dart | 2 +- 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/lib/views/pages/sub_workorder/create_sub_workorder_page.dart b/lib/views/pages/sub_workorder/create_sub_workorder_page.dart index d243bf5d..cc7ac230 100644 --- a/lib/views/pages/sub_workorder/create_sub_workorder_page.dart +++ b/lib/views/pages/sub_workorder/create_sub_workorder_page.dart @@ -47,13 +47,14 @@ class _CreateSubWorkOrderPageState extends State { @override void initState() { + _subWorkOrders =SearchWorkOrder(assignedEmployee: widget.workOrder.assignedEmployee, callRequest: CallRequest()); + _serviceReport = ServiceReport(id: widget.workOrder.id, type: widget.workOrder.assetType, equipmentStatus: widget.workOrder.equipmentStatus); super.initState(); } @override Widget build(BuildContext context) { final Subtitle subtitle = AppLocalization.of(context).subtitle; - _serviceReport = ServiceReport(id: widget.workOrder.id, type: widget.workOrder.assetType, equipmentStatus: widget.workOrder.equipmentStatus); return Scaffold( body: SafeArea( child: SingleChildScrollView( @@ -110,6 +111,7 @@ class _CreateSubWorkOrderPageState extends State { onSelect: (status) { _subWorkOrders.equipmentStatus = status; _serviceReport.equipmentStatus = status; + setState(() {}); }, ), ], @@ -161,6 +163,7 @@ class _CreateSubWorkOrderPageState extends State { onSelect: (status) { _serviceReportReason = status; _subWorkOrders.reason = status; + setState(() {}); }, ), ], @@ -282,7 +285,7 @@ class _CreateSubWorkOrderPageState extends State { onPressed: () async { _subWorkOrders.parentWOId=widget.workOrder.id; _validate = true; - setState(() {}); + setState(() {}); if(validate()){ if(_subWorkOrders.startofWorkTime == null) { diff --git a/lib/views/pages/sub_workorder/workorder_details.dart b/lib/views/pages/sub_workorder/workorder_details.dart index 8f58eb9b..82cdb666 100644 --- a/lib/views/pages/sub_workorder/workorder_details.dart +++ b/lib/views/pages/sub_workorder/workorder_details.dart @@ -53,7 +53,7 @@ class WorkOrderDetails extends StatelessWidget { ), borderRadius: BorderRadius.circular(AppStyle.borderRadius * AppStyle.getScaleFactor(context)), ), - child: _buildRow("call id", "", context),) + child: _buildRow("Asset Type", item.assetType?.name??"", context),) ], ); } From 575005ebdd0571f601bd6e2947af205f9cd1393d Mon Sep 17 00:00:00 2001 From: zaid_daoud Date: Tue, 20 Jun 2023 16:31:17 +0300 Subject: [PATCH 101/181] Enhancements --- ...ice_report_fault_description_provider.dart | 2 +- .../service_request/search_work_order.dart | 110 +++++++++--------- .../create_sub_workorder_page.dart | 45 +++---- .../work_order_details_bottom_sheet.dart | 13 ++- 4 files changed, 82 insertions(+), 88 deletions(-) diff --git a/lib/controllers/providers/api/status_drop_down/report/service_report_fault_description_provider.dart b/lib/controllers/providers/api/status_drop_down/report/service_report_fault_description_provider.dart index 8946bd0a..bc47dfb8 100644 --- a/lib/controllers/providers/api/status_drop_down/report/service_report_fault_description_provider.dart +++ b/lib/controllers/providers/api/status_drop_down/report/service_report_fault_description_provider.dart @@ -55,7 +55,7 @@ class ServiceRequestFaultDescriptionProvider extends ChangeNotifier { if (response.statusCode >= 200 && response.statusCode < 300) { // client's request was successfully received List listJson = json.decode(response.body)["data"]['asset']['modelDefinition']['modelDefRelatedDefects']; - _items = listJson.map((type) => FaultDescription.fromJson(type)).toList(); + _items = listJson?.map((type) => FaultDescription.fromJson(type))?.toList() ?? []; } _loading = false; notifyListeners(); diff --git a/lib/models/service_request/search_work_order.dart b/lib/models/service_request/search_work_order.dart index 38c75f4d..735fedd4 100644 --- a/lib/models/service_request/search_work_order.dart +++ b/lib/models/service_request/search_work_order.dart @@ -234,7 +234,7 @@ class SearchWorkOrder { ); Map toJson() { final map = {}; - map['id'] = id??0; + map['id'] = id ?? 0; map['parentWOId'] = parentWOId; map['workOrderNo'] = workOrderNo; map['workOrderYear'] = workOrderYear; @@ -250,7 +250,7 @@ class SearchWorkOrder { } map['visitDate'] = visitDate; if (assistantEmployees != null) { - map['assistantEmployees'] = assistantEmployees.map((v) => v?.user?.id).toList(); + map['assistantEmployees'] = assistantEmployees.map((v) => v?.toJson()).toList(); } if (supplier != null) { map['supplier'] = supplier.toJson(); @@ -379,8 +379,8 @@ class WoParentDto { map['assetType'] = assetType.toMap(); } map['vendorTicketNumber'] = vendorTicketNumber; - map['callId'] = callId??0; - map['id'] = id??0; + map['callId'] = callId ?? 0; + map['id'] = id ?? 0; if (stepsWorkOrderDto != null) { map['stepsWorkOrderDto'] = stepsWorkOrderDto.toJson(); } @@ -444,7 +444,7 @@ class SuppEngineerWorkOrders { ); Map toJson() { final map = {}; - map['id'] = id??0; + map['id'] = id ?? 0; map['supplierContactId'] = supplierContactId; map['personName'] = personName; map['personRoleName'] = personRoleName; @@ -508,7 +508,7 @@ class StepsWorkOrderDto { Map toJson() { final map = {}; map['sequence'] = sequence; - map['id'] = id??0; + map['id'] = id ?? 0; map['name'] = name; map['statusValue'] = statusValue; map['typeTransaction'] = typeTransaction; @@ -543,7 +543,7 @@ class SupplierModel { }); SupplierModel.fromJson(dynamic json) { - id = json['id']??0; + id = json['id'] ?? 0; suppliername = json['suppliername']; name = json['name']; website = json['website']; @@ -634,7 +634,7 @@ class SupplierModel { List suppTCodes, }) => SupplierModel( - id: id ?? this.id??0, + id: id ?? this.id ?? 0, suppliername: suppliername ?? this.suppliername, name: name ?? this.name, website: website ?? this.website, @@ -656,7 +656,7 @@ class SupplierModel { ); Map toJson() { final map = {}; - map['id'] = id??0; + map['id'] = id ?? 0; map['suppliername'] = suppliername; map['name'] = name; map['website'] = website; @@ -716,14 +716,14 @@ class SuppTCodes { String codeValue, }) => SuppTCodes( - id: id ?? this.id??0, + id: id ?? this.id ?? 0, supplierId: supplierId ?? this.supplierId, codeTypeId: codeTypeId ?? this.codeTypeId, codeValue: codeValue ?? this.codeValue, ); Map toJson() { final map = {}; - map['id'] = id??0; + map['id'] = id ?? 0; map['supplierId'] = supplierId; map['codeTypeId'] = codeTypeId; map['codeValue'] = codeValue; @@ -778,7 +778,7 @@ class SuppPersons { ); Map toJson() { final map = {}; - map['id'] = id??0; + map['id'] = id ?? 0; map['supplierId'] = supplierId; map['personName'] = personName; map['personRoleId'] = personRoleId; @@ -821,7 +821,7 @@ class Attachments { ); Map toJson() { final map = {}; - map['id'] = id??0; + map['id'] = id ?? 0; map['supplierId'] = supplierId; map['attachmentName'] = attachmentName; map['attachmentURL'] = attachmentURL; @@ -856,7 +856,7 @@ class Addresses { ); Map toJson() { final map = {}; - map['id'] = id??0; + map['id'] = id ?? 0; map['supplierId'] = supplierId; map['address'] = address; return map; @@ -890,7 +890,7 @@ class Faxes { ); Map toJson() { final map = {}; - map['id'] = id??0; + map['id'] = id ?? 0; map['supplierId'] = supplierId; map['fax'] = fax; return map; @@ -924,7 +924,7 @@ class Telephones { ); Map toJson() { final map = {}; - map['id'] = id??0; + map['id'] = id ?? 0; map['supplierId'] = supplierId; map['telephone'] = telephone; return map; @@ -953,7 +953,7 @@ class AttachmentsWorkOrder { ); Map toJson() { final map = {}; - map['id'] = id??0; + map['id'] = id ?? 0; map['name'] = name; return map; } @@ -996,7 +996,7 @@ class SparePartsWorkOrders { ); Map toJson() { final map = {}; - map['id'] = id??0; + map['id'] = id ?? 0; if (sparePart != null) { map['sparePart'] = sparePart.toJson(); } @@ -1034,7 +1034,7 @@ class SparePart { ); Map toJson() { final map = {}; - map['id'] = id??0; + map['id'] = id ?? 0; map['partNo'] = partNo; map['partName'] = partName; return map; @@ -1093,7 +1093,7 @@ class ContactPersonWorkOrders { ); Map toJson() { final map = {}; - map['id'] = id??0; + map['id'] = id ?? 0; map['employeeCode'] = employeeCode; map['name'] = name; map['telephone'] = telephone; @@ -1127,7 +1127,7 @@ class AssistantEmployees { ); Map toJson() { final map = {}; - map['id'] = id??0; + map['id'] = id ?? 0; if (user != null) { map['user'] = user.toJson(); } @@ -1157,7 +1157,7 @@ class UserModel { ); Map toJson() { final map = {}; - map['id'] = id??0; + map['id'] = id ?? 0; map['name'] = name; return map; } @@ -1185,7 +1185,7 @@ class AssignedEmployee { ); Map toJson() { final map = {}; - map['id'] = id??0; + map['id'] = id ?? 0; map['name'] = name; return map; } @@ -1263,7 +1263,7 @@ class CallRequest { ); Map toJson() { final map = {}; - map['id'] = id??0; + map['id'] = id ?? 0; map['callNo'] = callNo; map['callComments'] = callComments; if (asset != null) { @@ -1319,7 +1319,7 @@ class FirstAction { ); Map toJson() { final map = {}; - map['id'] = id??0; + map['id'] = id ?? 0; map['name'] = name; map['value'] = value; return map; @@ -1353,7 +1353,7 @@ class DefectType { ); Map toJson() { final map = {}; - map['id'] = id??0; + map['id'] = id ?? 0; map['name'] = name; map['value'] = value; return map; @@ -1387,7 +1387,7 @@ class Status { ); Map toJson() { final map = {}; - map['id'] = id??0; + map['id'] = id ?? 0; map['name'] = name; map['value'] = value; return map; @@ -1446,7 +1446,7 @@ class CallSiteContactPerson { ); Map toJson() { final map = {}; - map['id'] = id??0; + map['id'] = id ?? 0; map['employeeCode'] = employeeCode; map['name'] = name; map['telephone'] = telephone; @@ -1516,7 +1516,7 @@ class Asset { systemID = json['systemID']; assetNumber = json['assetNumber']; modelDefinition = json['modelDefinition'] != null ? ModelDefinition.fromJson(json['modelDefinition']) : null; - supplier = json['supplier'] != null ? SupplierModel.fromJson(json['supplier']) : null; + supplier = json['supplier'] != null ? Supplier.fromJson(json['supplier']) : null; ipAddress = json['ipAddress']; macAddress = json['macAddress']; portNumber = json['portNumber']; @@ -1570,7 +1570,7 @@ class Asset { String systemID; String assetNumber; ModelDefinition modelDefinition; - SupplierModel supplier; + Supplier supplier; String ipAddress; String macAddress; String portNumber; @@ -1715,7 +1715,7 @@ class Asset { ); Map toJson() { final map = {}; - map['id'] = id??0; + map['id'] = id ?? 0; map['assetSerialNo'] = assetSerialNo; map['systemID'] = systemID; map['assetNumber'] = assetNumber; @@ -1831,7 +1831,7 @@ class TechnicalGuidanceBooks { ); Map toJson() { final map = {}; - map['id'] = id??0; + map['id'] = id ?? 0; if (guidanceBook != null) { map['guidanceBook'] = guidanceBook.toJson(); } @@ -1866,7 +1866,7 @@ class GuidanceBook { ); Map toJson() { final map = {}; - map['id'] = id??0; + map['id'] = id ?? 0; map['name'] = name; map['value'] = value; return map; @@ -1900,7 +1900,7 @@ class RemainderWarrantyMonths { ); Map toJson() { final map = {}; - map['id'] = id??0; + map['id'] = id ?? 0; map['name'] = name; map['value'] = value; return map; @@ -1934,7 +1934,7 @@ class ExtendedWarrantyMonths { ); Map toJson() { final map = {}; - map['id'] = id??0; + map['id'] = id ?? 0; map['name'] = name; map['value'] = value; return map; @@ -1968,7 +1968,7 @@ class SiteWarrantyMonths { ); Map toJson() { final map = {}; - map['id'] = id??0; + map['id'] = id ?? 0; map['name'] = name; map['value'] = value; return map; @@ -2002,7 +2002,7 @@ class CommissioningStatus { ); Map toJson() { final map = {}; - map['id'] = id??0; + map['id'] = id ?? 0; map['name'] = name; map['value'] = value; return map; @@ -2046,7 +2046,7 @@ class OriginSite { ); Map toJson() { final map = {}; - map['id'] = id??0; + map['id'] = id ?? 0; map['customerCode'] = customerCode; map['custName'] = custName; if (buildings != null) { @@ -2093,7 +2093,7 @@ class Buildings { ); Map toJson() { final map = {}; - map['id'] = id??0; + map['id'] = id ?? 0; map['name'] = name; map['value'] = value; if (floors != null) { @@ -2140,7 +2140,7 @@ class Floors { ); Map toJson() { final map = {}; - map['id'] = id??0; + map['id'] = id ?? 0; map['name'] = name; map['value'] = value; if (departments != null) { @@ -2172,7 +2172,7 @@ class Departments { ); Map toJson() { final map = {}; - map['id'] = id??0; + map['id'] = id ?? 0; map['name'] = name; return map; } @@ -2203,7 +2203,7 @@ class OriginDepartment { String ntCode, }) => OriginDepartment( - id: id ?? this.id??0, + id: id ?? this.id ?? 0, departmentName: departmentName ?? this.departmentName, departmentCode: departmentCode ?? this.departmentCode, ntCode: ntCode ?? this.ntCode, @@ -2245,7 +2245,7 @@ class Currency { ); Map toJson() { final map = {}; - map['id'] = id??0; + map['id'] = id ?? 0; map['name'] = name; map['value'] = value; return map; @@ -2284,7 +2284,7 @@ class Department { ); Map toJson() { final map = {}; - map['id'] = id??0; + map['id'] = id ?? 0; map['departmentName'] = departmentName; map['departmentCode'] = departmentCode; map['ntCode'] = ntCode; @@ -2319,7 +2319,7 @@ class Floor { ); Map toJson() { final map = {}; - map['id'] = id??0; + map['id'] = id ?? 0; map['name'] = name; map['value'] = value; return map; @@ -2353,7 +2353,7 @@ class Building { ); Map toJson() { final map = {}; - map['id'] = id??0; + map['id'] = id ?? 0; map['name'] = name; map['value'] = value; return map; @@ -2397,7 +2397,7 @@ class Site { ); Map toJson() { final map = {}; - map['id'] = id??0; + map['id'] = id ?? 0; map['customerCode'] = customerCode; map['custName'] = custName; if (buildings != null) { @@ -2444,7 +2444,7 @@ class ParentAsset { ); Map toJson() { final map = {}; - map['id'] = id??0; + map['id'] = id ?? 0; map['assetSerialNo'] = assetSerialNo; map['assetNumber'] = assetNumber; map['tagCode'] = tagCode; @@ -2480,7 +2480,7 @@ class IsParent { ); Map toJson() { final map = {}; - map['id'] = id??0; + map['id'] = id ?? 0; map['name'] = name; map['value'] = value; return map; @@ -2516,7 +2516,7 @@ class OldAsset { String systemId, }) => OldAsset( - id: id ?? this.id??0, + id: id ?? this.id ?? 0, assetSerialNo: assetSerialNo ?? this.assetSerialNo, assetNumber: assetNumber ?? this.assetNumber, tagCode: tagCode ?? this.tagCode, @@ -2560,7 +2560,7 @@ class AssetReplace { ); Map toJson() { final map = {}; - map['id'] = id??0; + map['id'] = id ?? 0; map['name'] = name; map['value'] = value; return map; @@ -2589,7 +2589,7 @@ class Supplier { ); Map toJson() { final map = {}; - map['id'] = id??0; + map['id'] = id ?? 0; map['suppliername'] = suppliername; return map; } @@ -2682,7 +2682,7 @@ class ModelDefinition { ); Map toJson() { final map = {}; - map['id'] = id??0; + map['id'] = id ?? 0; map['assetName'] = assetName; map['modelDefCode'] = modelDefCode; map['modelName'] = modelName; @@ -2725,7 +2725,7 @@ class Suppliers { ); Map toJson() { final map = {}; - map['id'] = id??0; + map['id'] = id ?? 0; map['suppliername'] = suppliername; return map; } @@ -2756,7 +2756,7 @@ class ModelDefRelatedDefects { String estimatedTime, }) => ModelDefRelatedDefects( - id: id ?? this.id??0, + id: id ?? this.id ?? 0, defectName: defectName ?? this.defectName, workPerformed: workPerformed ?? this.workPerformed, estimatedTime: estimatedTime ?? this.estimatedTime, diff --git a/lib/views/pages/sub_workorder/create_sub_workorder_page.dart b/lib/views/pages/sub_workorder/create_sub_workorder_page.dart index cc7ac230..79fcbef0 100644 --- a/lib/views/pages/sub_workorder/create_sub_workorder_page.dart +++ b/lib/views/pages/sub_workorder/create_sub_workorder_page.dart @@ -47,7 +47,7 @@ class _CreateSubWorkOrderPageState extends State { @override void initState() { - _subWorkOrders =SearchWorkOrder(assignedEmployee: widget.workOrder.assignedEmployee, callRequest: CallRequest()); + _subWorkOrders = SearchWorkOrder(assignedEmployee: widget.workOrder.assignedEmployee, callRequest: CallRequest()); _serviceReport = ServiceReport(id: widget.workOrder.id, type: widget.workOrder.assetType, equipmentStatus: widget.workOrder.equipmentStatus); super.initState(); } @@ -182,7 +182,7 @@ class _CreateSubWorkOrderPageState extends State { height: 4, ), ServiceReportFaultDescription( - requestId: widget.workOrder.callRequest.id.toString(), + requestId: widget.workOrder?.id?.toString(), initialValue: _subWorkOrders.faultDescription, onSelect: (status) { _subWorkOrders.faultDescription = status; @@ -195,15 +195,11 @@ class _CreateSubWorkOrderPageState extends State { Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ - ASubTitle("Solution"), + const ASubTitle("Solution"), const SizedBox( height: 4, ), - ATextFormField( - labelText: _subWorkOrders.faultDescription?.workPerformed??"", - textInputType: TextInputType.multiline, - enable:false - ), + ATextFormField(labelText: _subWorkOrders.faultDescription?.workPerformed ?? "", textInputType: TextInputType.multiline, enable: false), ], ), const SizedBox(height: 8), @@ -283,25 +279,20 @@ class _CreateSubWorkOrderPageState extends State { child: AButton( text: subtitle.create, onPressed: () async { - _subWorkOrders.parentWOId=widget.workOrder.id; + _subWorkOrders.parentWOId = widget.workOrder.id; _validate = true; - setState(() {}); - if(validate()){ - if(_subWorkOrders.startofWorkTime == null) - { - Fluttertoast.showToast(msg: subtitle.startDate + " required"); + setState(() {}); + if (validate()) { + if (_subWorkOrders.startofWorkTime == null) { + Fluttertoast.showToast(msg: "${subtitle.startDate} required"); + return; + } else if (_subWorkOrders.endofWorkTime == null) { + Fluttertoast.showToast(msg: "${subtitle.endDate} required"); return; - } else - if(_subWorkOrders.endofWorkTime == null) - { - Fluttertoast.showToast(msg: subtitle.endDate + " required"); + } else if (_subWorkOrders.calllastSituation == null) { + Fluttertoast.showToast(msg: "${subtitle.callLastSituation} required"); return; - } else - if(_subWorkOrders.calllastSituation == null) - { - Fluttertoast.showToast(msg: subtitle.callLastSituation + " required"); - return; - } + } _validate = false; _isLoading = true; setState(() {}); @@ -311,7 +302,7 @@ class _CreateSubWorkOrderPageState extends State { final status = await serviceRequestsProvider.createSubWorkOrder(workOrder: _subWorkOrders); _isLoading = false; setState(() {}); - if (status>= 200 && status< 300) { + if (status >= 200 && status < 300) { Fluttertoast.showToast(msg: subtitle.requestCompleteSuccessfully); Navigator.of(context).pop(); Navigator.of(context).pop(); @@ -328,8 +319,8 @@ class _CreateSubWorkOrderPageState extends State { ); } - bool validate(){ - if(_subWorkOrders.faultDescription == null || _subWorkOrders.reason == null || _subWorkOrders.equipmentStatus == null|| _subWorkOrders.visitDate == null) { + bool validate() { + if (_subWorkOrders.faultDescription == null || _subWorkOrders.reason == null || _subWorkOrders.equipmentStatus == null || _subWorkOrders.visitDate == null) { return false; } else { return true; diff --git a/lib/views/pages/sub_workorder/work_order_details_bottom_sheet.dart b/lib/views/pages/sub_workorder/work_order_details_bottom_sheet.dart index 1896435c..bb08dc43 100644 --- a/lib/views/pages/sub_workorder/work_order_details_bottom_sheet.dart +++ b/lib/views/pages/sub_workorder/work_order_details_bottom_sheet.dart @@ -85,7 +85,7 @@ class _WorkOrderDetailsBottomSheetState extends State Validator.isNumeric(value) ? null : _subtitle.requiredWord, textInputType: TextInputType.number, onSaved: (value) { - _workOrder.workingHours = double.tryParse(value); + _workOrder.workingHours = double.tryParse( + ((DateTime.tryParse(_workOrder.endofWorkTime ?? "")?.difference(DateTime.tryParse(_workOrder.startofWorkTime ?? ""))?.inMinutes ?? 0) / 60) + ?.toStringAsFixed(2) + ?.toString() ?? + "0"); }, ), const SizedBox(height: 8), From a1f2960fad17f202e6adc4b62ce3f4c475626987 Mon Sep 17 00:00:00 2001 From: zaid_daoud Date: Tue, 20 Jun 2023 23:33:18 +0300 Subject: [PATCH 102/181] Enhancements --- .../create_sub_workorder_page.dart | 7 +- .../spare_parts_details_bottom_sheet.dart | 173 +++++++++--------- lib/views/widgets/parts/part_item.dart | 107 +++++------ 3 files changed, 146 insertions(+), 141 deletions(-) diff --git a/lib/views/pages/sub_workorder/create_sub_workorder_page.dart b/lib/views/pages/sub_workorder/create_sub_workorder_page.dart index 79fcbef0..16481e6e 100644 --- a/lib/views/pages/sub_workorder/create_sub_workorder_page.dart +++ b/lib/views/pages/sub_workorder/create_sub_workorder_page.dart @@ -16,6 +16,7 @@ import 'package:test_sa/views/pages/sub_workorder/workorder_details.dart'; import '../../../controllers/api_routes/http_status_manger.dart'; import '../../../controllers/localization/localization.dart'; +import '../../../controllers/providers/api/status_drop_down/report/service_report_fault_description_provider.dart'; import '../../../models/subtitle.dart'; import '../../widgets/app_text_form_field.dart'; import '../../widgets/buttons/app_back_button.dart'; @@ -49,6 +50,9 @@ class _CreateSubWorkOrderPageState extends State { void initState() { _subWorkOrders = SearchWorkOrder(assignedEmployee: widget.workOrder.assignedEmployee, callRequest: CallRequest()); _serviceReport = ServiceReport(id: widget.workOrder.id, type: widget.workOrder.assetType, equipmentStatus: widget.workOrder.equipmentStatus); + if (context.mounted) { + Provider.of(context, listen: false).reset(); + } super.initState(); } @@ -182,7 +186,7 @@ class _CreateSubWorkOrderPageState extends State { height: 4, ), ServiceReportFaultDescription( - requestId: widget.workOrder?.id?.toString(), + requestId: widget.workOrder?.callRequest?.id?.toString(), initialValue: _subWorkOrders.faultDescription, onSelect: (status) { _subWorkOrders.faultDescription = status; @@ -261,6 +265,7 @@ class _CreateSubWorkOrderPageState extends State { image: _image, onPick: (image) { _image = image; + _subWorkOrders.attachmentsWorkOrder ??= []; _subWorkOrders.attachmentsWorkOrder.add(AttachmentsWorkOrder(name: "${image.path.split("/").last}|${base64Encode(image.readAsBytesSync())}")); }, ), diff --git a/lib/views/pages/sub_workorder/spare_parts_details_bottom_sheet.dart b/lib/views/pages/sub_workorder/spare_parts_details_bottom_sheet.dart index bf022cc0..d6586592 100644 --- a/lib/views/pages/sub_workorder/spare_parts_details_bottom_sheet.dart +++ b/lib/views/pages/sub_workorder/spare_parts_details_bottom_sheet.dart @@ -1,11 +1,14 @@ import 'package:flutter/material.dart'; +import 'package:test_sa/models/part.dart'; import 'package:test_sa/models/service_request/search_work_order.dart'; import 'package:test_sa/views/app_style/colors.dart'; import '../../../controllers/localization/localization.dart'; import '../../../models/subtitle.dart'; -import '../../widgets/app_text_form_field.dart'; +import '../../app_style/sizing.dart'; import '../../widgets/buttons/app_button.dart'; +import '../../widgets/parts/auto_complete_parts_field.dart'; +import '../../widgets/parts/part_item.dart'; import '../../widgets/titles/app_sub_title.dart'; class SparePartsBottomSheet extends StatefulWidget { @@ -19,6 +22,7 @@ class SparePartsBottomSheet extends StatefulWidget { class _SparePartsBottomSheetState extends State { final GlobalKey _formKey = GlobalKey(); final SearchWorkOrder _workOrder = SearchWorkOrder(); + bool _validate = false; @override void initState() { @@ -53,97 +57,92 @@ class _SparePartsBottomSheetState extends State { child: Padding( padding: const EdgeInsets.all(8.0), child: SingleChildScrollView( - child: SingleChildScrollView( - child: Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - const SizedBox(height: 8), - if (_workOrder.sparePartsWorkOrders?.length != null) - ListView.builder( - itemCount: _workOrder.sparePartsWorkOrders?.length, - shrinkWrap: true, - physics: const NeverScrollableScrollPhysics(), - itemBuilder: (context, index) { - final wo = _workOrder.sparePartsWorkOrders[index]; - return Column( - children: [ - ATextFormField( - labelText: _workOrder?.sparePartsWorkOrders[index]?.sparePart?.partNo ?? "Part No.", - onChange: (value) { - _workOrder.sparePartsWorkOrders[index].sparePart = SparePart(partNo: value); - }, - ), - // const SizedBox(height: 8), - // ATextFormField( - // labelText: "Description", - // hintText: "Add Some Text", - // textInputType: TextInputType.multiline, - // onSaved: (value) { - // _workOrder.sparePartsWorkOrders[index].sparePart = value; - // }, - // ), - const SizedBox(height: 8), - ATextFormField( - labelText: _workOrder?.sparePartsWorkOrders[index]?.qty?.toString() ?? "Quantity", - textInputType: TextInputType.number, - onSaved: (value) { - _workOrder.sparePartsWorkOrders[index].qty = double.tryParse(value ?? ""); - }, - ), - const SizedBox(height: 8), - InkWell( - onTap: () { - _workOrder.sparePartsWorkOrders.removeWhere( - (element) => (element.sparePart?.partNo == wo.sparePart?.partNo && element.id == wo.id), - ); - setState(() {}); - }, - child: Row( - mainAxisAlignment: MainAxisAlignment.end, - children: [ - const Icon(Icons.delete, color: Colors.red), - Text( - "Remove this part", - style: Theme.of(context).textTheme.bodySmall, - ), - ], - ), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Container( + width: double.infinity, + padding: const EdgeInsets.all(16), + margin: const EdgeInsets.symmetric(vertical: 16), + decoration: BoxDecoration(color: AColors.grey, borderRadius: BorderRadius.circular(AppStyle.getBorderRadius(context)), boxShadow: const [ + BoxShadow( + color: AColors.grey, + offset: Offset(0, -1), + ) + ]), + child: Column( + mainAxisSize: MainAxisSize.min, + children: [ + Row( + children: [ + Expanded( + flex: 3, + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + ASubTitle(subtitle.partNumber), + _validate && _workOrder.sparePartsWorkOrders == null + ? ASubTitle( + subtitle.requiredWord, + color: Colors.red, + ) + : const SizedBox.shrink(), + const SizedBox(height: 4), + AutoCompletePartsField( + onPick: (part) { + _workOrder.sparePartsWorkOrders ??= []; + _workOrder.sparePartsWorkOrders.add(SparePartsWorkOrders( + id: part.id, + qty: part.quantity, + sparePart: SparePart(id: part.reportPartID, partName: part.name, partNo: part.code), + )); + }, + ), + ], ), - const SizedBox(height: 8), - ], - ); - }, - ), - const Divider(), - const SizedBox(height: 8), - InkWell( - onTap: () { - _workOrder.sparePartsWorkOrders ??= []; - _workOrder.sparePartsWorkOrders.add(SparePartsWorkOrders()); - setState(() {}); - }, - child: Container( - decoration: BoxDecoration( - color: AColors.primaryColor.withOpacity(0.15), - borderRadius: BorderRadius.circular(10), - border: Border.all(color: AColors.primaryColor), + ), + ], + ), + SizedBox( + height: 8 * AppStyle.getScaleFactor(context), ), - child: ListTile( - title: Text( - "Add Part", - style: Theme.of(context).textTheme.bodyMedium?.copyWith(color: AColors.primaryColor), + if (_workOrder.sparePartsWorkOrders?.isNotEmpty ?? false) + Row( + children: [ + Expanded(flex: 3, child: Text(subtitle.number)), + Expanded(flex: 1, child: Text(subtitle.quantity)), + ], ), - trailing: const Icon( - Icons.add_circle, - color: AColors.primaryColor, - size: 20, + if (_workOrder.sparePartsWorkOrders?.isNotEmpty ?? false) + Column( + children: List.generate(_workOrder.sparePartsWorkOrders?.length, (index) { + final spare = _workOrder.sparePartsWorkOrders[index]; + Part part = Part( + id: spare.id, + reportPartID: spare.sparePart?.id, + code: spare.sparePart?.partNo, + name: spare.sparePart?.partName, + quantity: spare.qty, + ); + return PartItem( + part: part, + onDelete: (part) { + _workOrder.sparePartsWorkOrders.remove(SparePartsWorkOrders( + id: part.id, + qty: part.quantity, + sparePart: SparePart(id: part.reportPartID, partName: part.name, partNo: part.code), + )); + setState(() {}); + }, + ); + }), ), - ), - ), + const SizedBox(height: 16), + ], ), - const SizedBox(height: 24), - ], - ), + ), + const SizedBox(height: 24), + ], ), ), ), diff --git a/lib/views/widgets/parts/part_item.dart b/lib/views/widgets/parts/part_item.dart index 63d411e4..33575018 100644 --- a/lib/views/widgets/parts/part_item.dart +++ b/lib/views/widgets/parts/part_item.dart @@ -19,64 +19,65 @@ class _PartItemState extends State { //final _subtitle = AppLocalization.of(context).subtitle; return Column( children: [ - Divider(), + const Divider(), Row( children: [ Expanded( - child: Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - Row( - children: [ - Expanded( - child: Text( - widget.part.code, - style: Theme.of(context).textTheme.bodyText1.copyWith(fontSize: 12, fontWeight: FontWeight.bold), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Row( + children: [ + Expanded( + child: Text( + widget?.part?.code ?? "", + style: Theme.of(context).textTheme.bodyText1.copyWith(fontSize: 12, fontWeight: FontWeight.bold), + ), ), - ), - AIconButton2( - iconData: Icons.add, - color: Theme.of(context).primaryColor, - onPressed: () { - widget.part.quantity++; - setState(() {}); - }, - ), - AIconButton2( - iconData: Icons.remove, - color: Theme.of(context).primaryColor, - onPressed: widget.part.quantity < 2 - ? null - : () { - widget.part.quantity--; - setState(() {}); - }, - ), - SizedBox( - width: 8 * AppStyle.getScaleFactor(context), - ), - Text( - widget.part.quantity.toString(), - style: Theme.of(context).textTheme.headline6.copyWith( - //fontSize: 12, - //fontWeight: FontWeight.bold - ), - ), - SizedBox( - width: 8 * AppStyle.getScaleFactor(context), - ), - ], - ), - widget.part.name == null - ? SizedBox.shrink() - : Text( - widget.part.name, - style: Theme.of(context).textTheme.caption.copyWith(fontSize: 11, fontWeight: FontWeight.bold), - maxLines: 1, - overflow: TextOverflow.ellipsis, + AIconButton2( + iconData: Icons.add, + color: Theme.of(context).primaryColor, + onPressed: () { + widget.part.quantity++; + setState(() {}); + }, ), - ], - )), + AIconButton2( + iconData: Icons.remove, + color: Theme.of(context).primaryColor, + onPressed: widget.part.quantity < 2 + ? null + : () { + widget.part.quantity--; + setState(() {}); + }, + ), + SizedBox( + width: 8 * AppStyle.getScaleFactor(context), + ), + Text( + widget.part.quantity.toString(), + style: Theme.of(context).textTheme.headline6.copyWith( + //fontSize: 12, + //fontWeight: FontWeight.bold + ), + ), + SizedBox( + width: 8 * AppStyle.getScaleFactor(context), + ), + ], + ), + widget.part.name == null + ? const SizedBox.shrink() + : Text( + widget.part.name, + style: Theme.of(context).textTheme.caption.copyWith(fontSize: 11, fontWeight: FontWeight.bold), + maxLines: 1, + overflow: TextOverflow.ellipsis, + ), + ], + ), + ), AIconButton2( iconData: Icons.close, color: Colors.red, From 8f05983c1493594852a71f1b2216ca8580c11a65 Mon Sep 17 00:00:00 2001 From: zaid_daoud Date: Wed, 21 Jun 2023 12:11:36 +0300 Subject: [PATCH 103/181] Ready For Testing --- ...report_maintenance_situation_provider.dart | 4 +- .../service_request/search_work_order.dart | 56 +-- .../create_sub_workorder_page.dart | 437 +++++++++--------- .../search_sub_workorder_page.dart | 11 + .../spare_parts_details_bottom_sheet.dart | 56 ++- .../work_order_details_bottom_sheet.dart | 9 +- lib/views/widgets/parts/part_item.dart | 7 +- .../status/assistant_employee_menu.dart | 4 +- .../service_report_maintenance_situation.dart | 10 +- 9 files changed, 324 insertions(+), 270 deletions(-) diff --git a/lib/controllers/providers/api/status_drop_down/report/service_report_maintenance_situation_provider.dart b/lib/controllers/providers/api/status_drop_down/report/service_report_maintenance_situation_provider.dart index 1041a2a2..18720589 100644 --- a/lib/controllers/providers/api/status_drop_down/report/service_report_maintenance_situation_provider.dart +++ b/lib/controllers/providers/api/status_drop_down/report/service_report_maintenance_situation_provider.dart @@ -41,14 +41,14 @@ class ServiceReportMaintenanceSituationProvider 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 getOperators() async { + Future getOperators(String woId) async { if (_loading == true) return -2; _loading = true; notifyListeners(); Response response; try { response = await ApiManager.instance.get( - "${URLs.getMaintenanceSituation}", + woId == null ? "${URLs.getMaintenanceSituation}" : "${URLs.getServiceReportLastCalls}?parentWOId=$woId&isAdd=true&id=${0}&typeTransaction='Nothing'", ); // response = await get( // Uri.parse( diff --git a/lib/models/service_request/search_work_order.dart b/lib/models/service_request/search_work_order.dart index 735fedd4..39eca14a 100644 --- a/lib/models/service_request/search_work_order.dart +++ b/lib/models/service_request/search_work_order.dart @@ -104,29 +104,35 @@ class SearchWorkOrder { workOrderYear = wo.workOrderYear ?? workOrderYear; workOrderSequennce = wo.workOrderSequennce ?? workOrderSequennce; callRequest = wo.callRequest ?? callRequest; - assetType = wo.assetType ?? assetType; - assignedEmployee = wo.assignedEmployee ?? assignedEmployee; + if (wo.assetType != null) assetType = Lookup.fromJson((wo.assetType)?.toMap() ?? {}); + if (wo.assignedEmployee != null) assignedEmployee = AssignedEmployee.fromJson((wo.assignedEmployee)?.toJson() ?? {}); visitDate = wo.visitDate ?? visitDate; - assistantEmployees = wo.assistantEmployees ?? assistantEmployees; - supplier = wo.supplier ?? supplier; + assistantEmployees = (wo.assistantEmployees ?? assistantEmployees) + ?.map((e) => AssistantEmployees.fromJson({ + "id": e?.id, + "user": {"name": e?.user?.name, "id": (e?.user?.id) ?? "0"} + })) + ?.toList() ?? + []; + if (wo.supplier != null) supplier = SupplierModel.fromJson((wo.supplier)?.toJson() ?? {}); vendorTicketNumber = wo.vendorTicketNumber ?? vendorTicketNumber; - contactPersonWorkOrders = wo.contactPersonWorkOrders ?? contactPersonWorkOrders; - calllastSituation = wo.calllastSituation ?? calllastSituation; - currentSituation = wo.currentSituation ?? currentSituation; - repairLocation = wo.repairLocation ?? repairLocation; - reason = wo.reason ?? reason; + contactPersonWorkOrders = (wo.contactPersonWorkOrders ?? contactPersonWorkOrders)?.map((e) => ContactPersonWorkOrders.fromJson(e?.toJson() ?? {}))?.toList() ?? []; + calllastSituation = Lookup.fromJson((wo.calllastSituation ?? calllastSituation)?.toMap() ?? {}); + if (wo.currentSituation != null) currentSituation = Lookup.fromJson((wo.currentSituation)?.toMap() ?? {}); + repairLocation = Lookup.fromJson((wo.repairLocation ?? repairLocation)?.toMap() ?? {}); + reason = Lookup.fromJson((wo.reason ?? reason)?.toMap() ?? {}); startofWorkTime = wo.startofWorkTime ?? startofWorkTime; endofWorkTime = wo.endofWorkTime ?? endofWorkTime; workingHours = wo.workingHours ?? workingHours; travelingHours = wo.travelingHours ?? travelingHours; travelingExpenses = wo.travelingExpenses ?? travelingExpenses; - faultDescription = wo.faultDescription ?? faultDescription; - sparePartsWorkOrders = wo.sparePartsWorkOrders ?? sparePartsWorkOrders; + faultDescription = FaultDescription.fromJson((wo.faultDescription ?? faultDescription)?.toJson() ?? {}); + sparePartsWorkOrders = (wo.sparePartsWorkOrders ?? sparePartsWorkOrders)?.map((e) => SparePartsWorkOrders.fromJson(e?.toJson() ?? {}))?.toList() ?? []; reviewComment = wo.reviewComment ?? reviewComment; comment = wo.comment ?? comment; - attachmentsWorkOrder = wo.attachmentsWorkOrder ?? attachmentsWorkOrder; - equipmentStatus = wo.equipmentStatus ?? equipmentStatus; - suppEngineerWorkOrders = wo.suppEngineerWorkOrders ?? suppEngineerWorkOrders; + attachmentsWorkOrder = (wo.attachmentsWorkOrder ?? attachmentsWorkOrder)?.map((e) => AttachmentsWorkOrder.fromJson(e?.toJson() ?? {}))?.toList() ?? []; + equipmentStatus = Lookup.fromJson((wo.equipmentStatus ?? equipmentStatus)?.toMap() ?? {}); + suppEngineerWorkOrders = (wo.suppEngineerWorkOrders ?? suppEngineerWorkOrders)?.map((e) => SuppEngineerWorkOrders.fromJson(e?.toJson() ?? {}))?.toList() ?? []; engSignature = wo.engSignature ?? engSignature; nurseSignature = wo.nurseSignature ?? nurseSignature; woParentDto = wo.woParentDto ?? woParentDto; @@ -262,9 +268,7 @@ class SearchWorkOrder { if (calllastSituation != null) { map['calllastSituation'] = calllastSituation.toMap(); } - if (currentSituation != null) { - map['currentSituation'] = currentSituation.toMap(); - } + map['currentSituation'] = currentSituation?.toMap(); if (repairLocation != null) { map['repairLocation'] = repairLocation.toMap(); } @@ -1722,11 +1726,8 @@ class Asset { if (modelDefinition != null) { map['modelDefinition'] = modelDefinition.toJson(); } - if (supplier != null) { - map['supplier'] = supplier.toJson(); - } else { - map['supplier'] = []; - } + map['supplier'] = supplier?.toJson(); + map['ipAddress'] = ipAddress; map['macAddress'] = macAddress; map['portNumber'] = portNumber; @@ -1742,11 +1743,12 @@ class Asset { if (parentAsset != null) { map['parentAsset'] = parentAsset.toJson(); } - if (assetType != null) { - map['assetType'] = assetType.toMap(); - } else { - map['assetType'] = []; - } + + map['assetType'] = assetType?.toMap(); + print("supplier : ${supplier?.toJson()}"); + print("supplier 2 : ${map['supplier']}"); + print("asset type : ${assetType?.toMap()}"); + print("asset type 2: ${map['assetType']}"); if (site != null) { map['site'] = site.toJson(); } diff --git a/lib/views/pages/sub_workorder/create_sub_workorder_page.dart b/lib/views/pages/sub_workorder/create_sub_workorder_page.dart index 16481e6e..66941a76 100644 --- a/lib/views/pages/sub_workorder/create_sub_workorder_page.dart +++ b/lib/views/pages/sub_workorder/create_sub_workorder_page.dart @@ -6,6 +6,7 @@ import 'package:flutter/material.dart'; import 'package:fluttertoast/fluttertoast.dart'; import 'package:provider/provider.dart'; import 'package:test_sa/controllers/providers/api/service_requests_provider.dart'; +import 'package:test_sa/controllers/providers/api/status_drop_down/report/service_types_provider.dart'; import 'package:test_sa/models/lookup.dart'; import 'package:test_sa/models/service_report.dart'; import 'package:test_sa/models/service_request/search_work_order.dart'; @@ -13,6 +14,8 @@ import 'package:test_sa/views/app_style/colors.dart'; import 'package:test_sa/views/pages/sub_workorder/spare_parts_details_bottom_sheet.dart'; import 'package:test_sa/views/pages/sub_workorder/work_order_details_bottom_sheet.dart'; import 'package:test_sa/views/pages/sub_workorder/workorder_details.dart'; +import 'package:test_sa/views/widgets/loaders/app_loading.dart'; +import 'package:test_sa/views/widgets/status/service_request/service_request_defect_types_mune.dart'; import '../../../controllers/api_routes/http_status_manger.dart'; import '../../../controllers/localization/localization.dart'; @@ -23,7 +26,6 @@ import '../../widgets/buttons/app_back_button.dart'; import '../../widgets/buttons/app_button.dart'; import '../../widgets/date_and_time/date_picker.dart'; import '../../widgets/images/mini_one_image_picker.dart'; -import '../../widgets/status/report/service_report_equipment_status.dart'; import '../../widgets/status/report/service_report_fault_description.dart'; import '../../widgets/status/report/service_report_reasons.dart'; import '../../widgets/titles/app_sub_title.dart'; @@ -48,234 +50,249 @@ class _CreateSubWorkOrderPageState extends State { @override void initState() { - _subWorkOrders = SearchWorkOrder(assignedEmployee: widget.workOrder.assignedEmployee, callRequest: CallRequest()); + _subWorkOrders = SearchWorkOrder( + assignedEmployee: widget?.workOrder?.callRequest?.assignedEmployee, + callRequest: CallRequest(id: widget?.workOrder?.callRequest?.id), + currentSituation: null, + supplier: null, + ); _serviceReport = ServiceReport(id: widget.workOrder.id, type: widget.workOrder.assetType, equipmentStatus: widget.workOrder.equipmentStatus); - if (context.mounted) { - Provider.of(context, listen: false).reset(); - } super.initState(); } + Future getAssetType() async { + Provider.of(context, listen: false).reset(); + final assetTypesProvider = Provider.of(context, listen: false); + await assetTypesProvider.getTypes(); + _subWorkOrders?.assetType = assetTypesProvider.statuses?.firstWhere( + (element) => element.value == widget.workOrder?.callRequest?.assetType, + orElse: () => null, + ); + } + @override Widget build(BuildContext context) { final Subtitle subtitle = AppLocalization.of(context).subtitle; return Scaffold( body: SafeArea( - child: SingleChildScrollView( - child: Form( - key: _formKey, - child: Column( - children: [ - Container( - color: AColors.primaryColor, - padding: const EdgeInsets.symmetric(horizontal: 0, vertical: 4), - child: Column( - children: [ - Row( - children: [ - const ABackButton(), - Expanded( - child: Center( - child: Text( - "New Work Order", - style: Theme.of(context).textTheme.titleLarge.copyWith(color: AColors.white, fontStyle: FontStyle.italic), - ), - ), - ), - const SizedBox( - width: 48, - ) - ], - ), - ], - ), - ), - Padding( - padding: const EdgeInsets.symmetric(horizontal: 8, vertical: 16), - child: Column( - children: [ - WorkOrderDetails( - item: widget.workOrder, - ), - const SizedBox(height: 8), - Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - const ASubTitle("Equipment status"), - if (_validate && _subWorkOrders?.equipmentStatus == null) - ASubTitle( - subtitle.requiredWord, - color: Colors.red, - ), - const SizedBox( - height: 4, - ), - ServiceReportEquipmentStatusMenu( - report: _serviceReport, - onSelect: (status) { - _subWorkOrders.equipmentStatus = status; - _serviceReport.equipmentStatus = status; - setState(() {}); - }, - ), - ], - ), - const SizedBox(height: 8), - Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - const ASubTitle("Return to Service"), - if (_validate && _subWorkOrders.visitDate == null) - ASubTitle( - subtitle.requiredWord, - color: Colors.red, - ), - const SizedBox( - height: 4, - ), - Row( + child: FutureBuilder( + future: getAssetType(), + builder: (context, snap) => snap.connectionState == ConnectionState.waiting + ? const ALoading() + : SingleChildScrollView( + child: Form( + key: _formKey, + child: Column( + children: [ + Container( + color: AColors.primaryColor, + padding: const EdgeInsets.symmetric(horizontal: 0, vertical: 4), + child: Column( children: [ - Expanded( - child: ADatePicker( - date: DateTime.tryParse(_subWorkOrders.visitDate ?? ""), - from: DateTime(1950), - onDatePicker: (date) { - _subWorkOrders.visitDate = date?.toIso8601String(); - setState(() {}); - }, - ), + Row( + children: [ + const ABackButton(), + Expanded( + child: Center( + child: Text( + "New Work Order", + style: Theme.of(context).textTheme.titleLarge.copyWith(color: AColors.white, fontStyle: FontStyle.italic), + ), + ), + ), + const SizedBox( + width: 48, + ) + ], ), ], ), - ], - ), - const SizedBox(height: 8), - Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - ASubTitle("Failure ${subtitle.reasons}"), - if (_validate && _subWorkOrders.reason == null) - ASubTitle( - subtitle.requiredWord, - color: Colors.red, - ), - const SizedBox( - height: 4, - ), - ServiceReportReasonsMenu( - initialValue: _serviceReportReason, - onSelect: (status) { - _serviceReportReason = status; - _subWorkOrders.reason = status; - setState(() {}); - }, - ), - ], - ), - const SizedBox(height: 8), - Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - ASubTitle(subtitle.faultDescription), - if (_validate && _subWorkOrders.faultDescription == null) - ASubTitle( - subtitle.requiredWord, - color: Colors.red, - ), - const SizedBox( - height: 4, - ), - ServiceReportFaultDescription( - requestId: widget.workOrder?.callRequest?.id?.toString(), - initialValue: _subWorkOrders.faultDescription, - onSelect: (status) { - _subWorkOrders.faultDescription = status; - setState(() {}); - }, - ), - ], - ), - const SizedBox(height: 8), - Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - const ASubTitle("Solution"), - const SizedBox( - height: 4, - ), - ATextFormField(labelText: _subWorkOrders.faultDescription?.workPerformed ?? "", textInputType: TextInputType.multiline, enable: false), - ], - ), - const SizedBox(height: 8), - InkWell( - onTap: () async { - await showModalBottomSheet( - context: context, - useSafeArea: true, - isScrollControlled: true, - backgroundColor: Colors.transparent, - builder: (context) => WorkOrderDetailsBottomSheet(subWorkOrder: _subWorkOrders), - ); - log(_subWorkOrders?.toJson()?.toString()); - }, - child: Card( - child: ListTile( - title: Row( - children: [ - Text( - "WO Details", - style: Theme.of(context).textTheme.bodyMedium, - ), - const Text("*", style: TextStyle(color: Colors.red)), - ], - ), - trailing: const Icon(Icons.arrow_forward_ios, size: 14, color: AColors.primaryColor), - ), ), - ), - const SizedBox(height: 8), - InkWell( - onTap: () async { - await showModalBottomSheet( - context: context, - useSafeArea: true, - isScrollControlled: true, - backgroundColor: Colors.transparent, - builder: (context) => SparePartsBottomSheet(subWorkOrder: _subWorkOrders), - ); - log(_subWorkOrders?.toJson()?.toString()); - }, - child: Card( - child: ListTile( - title: Row( - children: [ - Text( - "Spare Parts", - style: Theme.of(context).textTheme.bodyMedium, + Padding( + padding: const EdgeInsets.symmetric(horizontal: 8, vertical: 16), + child: Column( + children: [ + WorkOrderDetails( + item: widget.workOrder, + ), + const SizedBox(height: 8), + Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + const ASubTitle("Equipment status"), + if (_validate && _subWorkOrders?.equipmentStatus == null) + ASubTitle( + subtitle.requiredWord, + color: Colors.red, + ), + const SizedBox( + height: 4, + ), + ServiceRequestDefectTypesMenu( + initialValue: _serviceReport.equipmentStatus, + onSelect: (status) { + _subWorkOrders.equipmentStatus = status; + _serviceReport.equipmentStatus = status; + setState(() {}); + }, + ), + ], + ), + const SizedBox(height: 8), + Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + const ASubTitle("Return to Service"), + if (_validate && _subWorkOrders.visitDate == null) + ASubTitle( + subtitle.requiredWord, + color: Colors.red, + ), + const SizedBox( + height: 4, + ), + Row( + children: [ + Expanded( + child: ADatePicker( + date: DateTime.tryParse(_subWorkOrders.visitDate ?? ""), + from: DateTime(1950), + onDatePicker: (date) { + _subWorkOrders.visitDate = date?.toIso8601String(); + setState(() {}); + }, + ), + ), + ], + ), + ], + ), + const SizedBox(height: 8), + Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + ASubTitle("Failure ${subtitle.reasons}"), + if (_validate && _subWorkOrders.reason == null) + ASubTitle( + subtitle.requiredWord, + color: Colors.red, + ), + const SizedBox( + height: 4, + ), + ServiceReportReasonsMenu( + initialValue: _serviceReportReason, + onSelect: (status) { + _serviceReportReason = status; + _subWorkOrders.reason = status; + setState(() {}); + }, + ), + ], + ), + const SizedBox(height: 8), + Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + ASubTitle(subtitle.faultDescription), + if (_validate && _subWorkOrders.faultDescription == null) + ASubTitle( + subtitle.requiredWord, + color: Colors.red, + ), + const SizedBox( + height: 4, + ), + ServiceReportFaultDescription( + requestId: widget.workOrder?.callRequest?.id?.toString(), + initialValue: _subWorkOrders?.faultDescription, + onSelect: (status) { + _subWorkOrders.faultDescription = status; + setState(() {}); + }, + ), + ], + ), + const SizedBox(height: 8), + Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + const ASubTitle("Solution"), + const SizedBox(height: 4), + ATextFormField(labelText: _subWorkOrders?.faultDescription?.workPerformed ?? "", textInputType: TextInputType.multiline, enable: false), + ], + ), + const SizedBox(height: 8), + InkWell( + onTap: () async { + await showModalBottomSheet( + context: context, + useSafeArea: true, + isScrollControlled: true, + backgroundColor: Colors.transparent, + builder: (context) => WorkOrderDetailsBottomSheet(subWorkOrder: _subWorkOrders), + ); + log(_subWorkOrders?.toJson()?.toString()); + }, + child: Card( + child: ListTile( + title: Row( + children: [ + Text( + "WO Details", + style: Theme.of(context).textTheme.bodyMedium, + ), + const Text("*", style: TextStyle(color: Colors.red)), + ], + ), + trailing: const Icon(Icons.arrow_forward_ios, size: 14, color: AColors.primaryColor), + ), + ), + ), + const SizedBox(height: 8), + InkWell( + onTap: () async { + await showModalBottomSheet( + context: context, + useSafeArea: true, + isScrollControlled: true, + backgroundColor: Colors.transparent, + builder: (context) => SparePartsBottomSheet(subWorkOrder: _subWorkOrders), + ); + log(_subWorkOrders?.toJson()?.toString()); + }, + child: Card( + child: ListTile( + title: Row( + children: [ + Text( + "Spare Parts", + style: Theme.of(context).textTheme.bodyMedium, + ), + const Text("*", style: TextStyle(color: Colors.red)), + ], + ), + trailing: const Icon(Icons.arrow_forward_ios, size: 14, color: AColors.primaryColor), + ), ), - const Text("*", style: TextStyle(color: Colors.red)), - ], - ), - trailing: const Icon(Icons.arrow_forward_ios, size: 14, color: AColors.primaryColor), + ), + const SizedBox(height: 8), + AMiniOneImagePicker( + image: _image, + onPick: (image) { + _image = image; + _subWorkOrders.attachmentsWorkOrder ??= []; + _subWorkOrders.attachmentsWorkOrder.add(AttachmentsWorkOrder(name: "${image.path.split("/").last}|${base64Encode(image.readAsBytesSync())}")); + }, + ), + const SizedBox(height: 50), + ], ), ), - ), - const SizedBox(height: 8), - AMiniOneImagePicker( - image: _image, - onPick: (image) { - _image = image; - _subWorkOrders.attachmentsWorkOrder ??= []; - _subWorkOrders.attachmentsWorkOrder.add(AttachmentsWorkOrder(name: "${image.path.split("/").last}|${base64Encode(image.readAsBytesSync())}")); - }, - ), - const SizedBox(height: 50), - ], + ], + ), ), ), - ], - ), - ), ), ), floatingActionButtonLocation: FloatingActionButtonLocation.centerDocked, diff --git a/lib/views/pages/sub_workorder/search_sub_workorder_page.dart b/lib/views/pages/sub_workorder/search_sub_workorder_page.dart index 279f8576..af4b0418 100644 --- a/lib/views/pages/sub_workorder/search_sub_workorder_page.dart +++ b/lib/views/pages/sub_workorder/search_sub_workorder_page.dart @@ -12,6 +12,7 @@ import 'package:test_sa/views/widgets/date_and_time/date_picker.dart'; import '../../../controllers/api_routes/http_status_manger.dart'; import '../../../controllers/localization/localization.dart'; +import '../../../controllers/providers/api/status_drop_down/report/service_report_maintenance_situation_provider.dart'; import '../../app_style/colors.dart'; import '../../widgets/buttons/app_back_button.dart'; import '../../widgets/buttons/app_button.dart'; @@ -35,6 +36,15 @@ class _SearchSubWorkOrderPageState extends State { bool _isLoading = false; String _callerId = "", _site = ""; Lookup _dateOperator; + + @override + void initState() { + super.initState(); + if (context.mounted) { + Provider.of(context, listen: false).reset(); + } + } + @override Widget build(BuildContext context) { _subtitle = AppLocalization.of(context).subtitle; @@ -120,6 +130,7 @@ class _SearchSubWorkOrderPageState extends State { _searchWorkOrders.calllastSituation = status; } }, + woId: _searchWorkOrders.id?.toString(), ), const SizedBox(height: 16), ATextFormField( diff --git a/lib/views/pages/sub_workorder/spare_parts_details_bottom_sheet.dart b/lib/views/pages/sub_workorder/spare_parts_details_bottom_sheet.dart index d6586592..5c9a8fa7 100644 --- a/lib/views/pages/sub_workorder/spare_parts_details_bottom_sheet.dart +++ b/lib/views/pages/sub_workorder/spare_parts_details_bottom_sheet.dart @@ -30,6 +30,12 @@ class _SparePartsBottomSheetState extends State { _workOrder.copyFrom(widget.subWorkOrder); } + @override + void dispose() { + _workOrder.sparePartsWorkOrders = widget.subWorkOrder.sparePartsWorkOrders; + super.dispose(); + } + @override Widget build(BuildContext context) { final size = MediaQuery.of(context).size; @@ -92,9 +98,9 @@ class _SparePartsBottomSheetState extends State { onPick: (part) { _workOrder.sparePartsWorkOrders ??= []; _workOrder.sparePartsWorkOrders.add(SparePartsWorkOrders( - id: part.id, + id: part.reportPartID, qty: part.quantity, - sparePart: SparePart(id: part.reportPartID, partName: part.name, partNo: part.code), + sparePart: SparePart(id: part.id, partName: part.name, partNo: part.code), )); }, ), @@ -115,27 +121,31 @@ class _SparePartsBottomSheetState extends State { ), if (_workOrder.sparePartsWorkOrders?.isNotEmpty ?? false) Column( - children: List.generate(_workOrder.sparePartsWorkOrders?.length, (index) { - final spare = _workOrder.sparePartsWorkOrders[index]; - Part part = Part( - id: spare.id, - reportPartID: spare.sparePart?.id, - code: spare.sparePart?.partNo, - name: spare.sparePart?.partName, - quantity: spare.qty, - ); - return PartItem( - part: part, - onDelete: (part) { - _workOrder.sparePartsWorkOrders.remove(SparePartsWorkOrders( - id: part.id, - qty: part.quantity, - sparePart: SparePart(id: part.reportPartID, partName: part.name, partNo: part.code), - )); - setState(() {}); - }, - ); - }), + children: List.generate( + _workOrder.sparePartsWorkOrders?.length, + (index) { + final spare = _workOrder.sparePartsWorkOrders[index]; + Part part = Part( + id: spare.sparePart?.id, + reportPartID: spare.id, + code: spare.sparePart?.partNo, + name: spare.sparePart?.partName, + quantity: spare.qty, + ); + return PartItem( + part: part, + onEdit: (qty) { + print("sss${spare.qty}"); + print(qty); + spare.qty = qty; + }, + onDelete: (part) { + _workOrder.sparePartsWorkOrders.remove(spare); + setState(() {}); + }, + ); + }, + ), ), const SizedBox(height: 16), ], diff --git a/lib/views/pages/sub_workorder/work_order_details_bottom_sheet.dart b/lib/views/pages/sub_workorder/work_order_details_bottom_sheet.dart index bb08dc43..c6ebd386 100644 --- a/lib/views/pages/sub_workorder/work_order_details_bottom_sheet.dart +++ b/lib/views/pages/sub_workorder/work_order_details_bottom_sheet.dart @@ -1,4 +1,5 @@ import 'package:flutter/material.dart'; +import 'package:provider/provider.dart'; import 'package:test_sa/models/service_request/search_work_order.dart'; import 'package:test_sa/models/subtitle.dart'; import 'package:test_sa/views/widgets/app_text_form_field.dart'; @@ -8,6 +9,7 @@ import 'package:test_sa/views/widgets/status/report/service_report_maintenance_s import 'package:test_sa/views/widgets/status/report/service_report_repair_location.dart'; import '../../../controllers/localization/localization.dart'; +import '../../../controllers/providers/api/status_drop_down/report/service_report_maintenance_situation_provider.dart'; import '../../app_style/sizing.dart'; import '../../widgets/date_and_time/time_picker.dart'; import '../../widgets/titles/app_sub_title.dart'; @@ -27,7 +29,11 @@ class _WorkOrderDetailsBottomSheetState extends State(context, listen: false).reset(); + } } @override @@ -66,7 +72,7 @@ class _WorkOrderDetailsBottomSheetState extends State _PartItemState(); @@ -38,7 +39,7 @@ class _PartItemState extends State { iconData: Icons.add, color: Theme.of(context).primaryColor, onPressed: () { - widget.part.quantity++; + widget.onEdit(++widget.part.quantity); setState(() {}); }, ), @@ -48,7 +49,7 @@ class _PartItemState extends State { onPressed: widget.part.quantity < 2 ? null : () { - widget.part.quantity--; + widget.onEdit(--widget.part.quantity); setState(() {}); }, ), diff --git a/lib/views/widgets/status/assistant_employee_menu.dart b/lib/views/widgets/status/assistant_employee_menu.dart index fa7d9ed8..45f2177b 100644 --- a/lib/views/widgets/status/assistant_employee_menu.dart +++ b/lib/views/widgets/status/assistant_employee_menu.dart @@ -27,7 +27,7 @@ class _SingleAssistantEmployeeMenuState extends State { void didUpdateWidget(covariant AssistantEmployeeMenu oldWidget) { if (widget.initialStatus != null) { final result = widget.statuses?.where((element) { - return element == widget.initialStatus; + return element?.user?.id == widget.initialStatus?.user?.id; }); if (result.isNotEmpty) { _selectedStatus = result.first; @@ -47,7 +47,7 @@ class _SingleAssistantEmployeeMenuState extends State { void initState() { if (widget.initialStatus != null) { final result = widget.statuses?.where((element) { - return element == widget.initialStatus; + return element?.user?.id == widget.initialStatus?.user?.id; }); if (result.isNotEmpty) _selectedStatus = result.first; if (widget.initialStatus?.user?.id != _selectedStatus?.user?.id) { diff --git a/lib/views/widgets/status/report/service_report_maintenance_situation.dart b/lib/views/widgets/status/report/service_report_maintenance_situation.dart index 936a2284..311581a0 100644 --- a/lib/views/widgets/status/report/service_report_maintenance_situation.dart +++ b/lib/views/widgets/status/report/service_report_maintenance_situation.dart @@ -8,8 +8,14 @@ import 'package:test_sa/views/widgets/status/single_status_menu.dart'; class ServiceReportMaintenanceSituation extends StatelessWidget { final Function(Lookup) onSelect; final Lookup initialValue; + final String woId; - const ServiceReportMaintenanceSituation({Key key, @required this.onSelect, @required this.initialValue}) : super(key: key); + const ServiceReportMaintenanceSituation({ + Key key, + @required this.onSelect, + @required this.initialValue, + @required this.woId, + }) : super(key: key); @override Widget build(BuildContext context) { ServiceReportMaintenanceSituationProvider menuProvider = Provider.of(context); @@ -18,7 +24,7 @@ class ServiceReportMaintenanceSituation extends StatelessWidget { isFailedLoading: menuProvider.operators == null, stateCode: menuProvider.stateCode, onRefresh: () async { - menuProvider.getOperators(); + menuProvider.getOperators(woId); }, child: SingleStatusMenu( initialStatus: initialValue, From 4d70fe2c36a49640c57ef1fb4f68ab58025b3548 Mon Sep 17 00:00:00 2001 From: Sikander Saleem Date: Thu, 22 Jun 2023 16:56:20 +0300 Subject: [PATCH 104/181] improvements --- lib/controllers/api_routes/api_manager.dart | 10 +- lib/views/pages/login.dart | 12 +- .../create_sub_workorder_page.dart | 506 +++++++++--------- .../search_sub_workorder_page.dart | 13 +- .../sub_workorder/workorder_details.dart | 29 +- lib/views/pages/user/land_page.dart | 2 +- 6 files changed, 304 insertions(+), 268 deletions(-) diff --git a/lib/controllers/api_routes/api_manager.dart b/lib/controllers/api_routes/api_manager.dart index f40b309c..54d0fc0d 100644 --- a/lib/controllers/api_routes/api_manager.dart +++ b/lib/controllers/api_routes/api_manager.dart @@ -2,6 +2,7 @@ import 'dart:convert'; import 'dart:developer'; import 'package:flutter/cupertino.dart'; +import 'package:flutter/foundation.dart'; import 'package:fluttertoast/fluttertoast.dart'; import 'package:http/http.dart' as http; import 'package:http/http.dart'; @@ -51,9 +52,12 @@ class ApiManager { headers.addAll(_headers); Uri _url = Uri.parse(url); - // print(_url); - // print(headers); - // log(json.encode(body)); + if (!kReleaseMode) { + print("URL:$_url"); + print("Headers:$headers"); + print("Body:$body"); + } + var request = http.Request('POST', _url); request.body = json.encode(body); request.headers.addAll(headers); diff --git a/lib/views/pages/login.dart b/lib/views/pages/login.dart index 65585b85..e77b67da 100644 --- a/lib/views/pages/login.dart +++ b/lib/views/pages/login.dart @@ -1,4 +1,5 @@ import 'package:flutter/material.dart'; +import 'package:fluttertoast/fluttertoast.dart'; import 'package:provider/provider.dart'; import 'package:test_sa/controllers/api_routes/http_status_manger.dart'; import 'package:test_sa/controllers/localization/localization.dart'; @@ -114,9 +115,16 @@ class _LoginState extends State { host: _settingProvider.host, ); if (status >= 200 && status < 300) { - _settingProvider.setUser(_userProvider.user); + if(_userProvider.user.isAuthenticated ?? false) { + _settingProvider.setUser(_userProvider.user); + Navigator.of(context).pushNamed(LandPage.id); + } else { + Fluttertoast.showToast(msg: _userProvider.user.message); + } + + // if (_userProvider.user.isActive) - Navigator.of(context).pushNamed(LandPage.id); + // else // Fluttertoast.showToast(msg: _subtitle.activationAlert); } else { diff --git a/lib/views/pages/sub_workorder/create_sub_workorder_page.dart b/lib/views/pages/sub_workorder/create_sub_workorder_page.dart index 66941a76..9b1ba0b9 100644 --- a/lib/views/pages/sub_workorder/create_sub_workorder_page.dart +++ b/lib/views/pages/sub_workorder/create_sub_workorder_page.dart @@ -7,6 +7,8 @@ import 'package:fluttertoast/fluttertoast.dart'; import 'package:provider/provider.dart'; import 'package:test_sa/controllers/providers/api/service_requests_provider.dart'; import 'package:test_sa/controllers/providers/api/status_drop_down/report/service_types_provider.dart'; +import 'package:test_sa/extensions/widget_extensions.dart'; +import 'package:test_sa/models/call_request_for_work_order_model.dart'; import 'package:test_sa/models/lookup.dart'; import 'package:test_sa/models/service_report.dart'; import 'package:test_sa/models/service_request/search_work_order.dart'; @@ -33,6 +35,7 @@ import '../../widgets/titles/app_sub_title.dart'; class CreateSubWorkOrderPage extends StatefulWidget { static const id = "/CreateSubWorkOrder"; final SearchWorkOrder workOrder; + const CreateSubWorkOrderPage({this.workOrder, Key key}) : super(key: key); @override @@ -57,286 +60,299 @@ class _CreateSubWorkOrderPageState extends State { supplier: null, ); _serviceReport = ServiceReport(id: widget.workOrder.id, type: widget.workOrder.assetType, equipmentStatus: widget.workOrder.equipmentStatus); + _isLoading = true; super.initState(); } + var assetTypesProvider; + CallRequestForWorkOrder _callRequestForWorkOrder; + Future getAssetType() async { + //if (assetTypesProvider == null) { Provider.of(context, listen: false).reset(); - final assetTypesProvider = Provider.of(context, listen: false); + assetTypesProvider = Provider.of(context, listen: false); + _callRequestForWorkOrder = await Provider.of(context).getCallRequestForWorkOrder(callId: widget.workOrder.callRequest.id.toString()); await assetTypesProvider.getTypes(); _subWorkOrders?.assetType = assetTypesProvider.statuses?.firstWhere( - (element) => element.value == widget.workOrder?.callRequest?.assetType, + (element) => element.value == _callRequestForWorkOrder.assetType, orElse: () => null, ); + setState(() { + _isLoading = false; + }); + //} } @override Widget build(BuildContext context) { + if (_callRequestForWorkOrder == null) { + getAssetType(); + } final Subtitle subtitle = AppLocalization.of(context).subtitle; + return Scaffold( body: SafeArea( - child: FutureBuilder( - future: getAssetType(), - builder: (context, snap) => snap.connectionState == ConnectionState.waiting - ? const ALoading() - : SingleChildScrollView( - child: Form( - key: _formKey, - child: Column( - children: [ - Container( - color: AColors.primaryColor, - padding: const EdgeInsets.symmetric(horizontal: 0, vertical: 4), - child: Column( - children: [ - Row( - children: [ - const ABackButton(), - Expanded( - child: Center( - child: Text( - "New Work Order", - style: Theme.of(context).textTheme.titleLarge.copyWith(color: AColors.white, fontStyle: FontStyle.italic), + child: _isLoading + ? const ALoading() + : Column( + children: [ + SingleChildScrollView( + child: Form( + key: _formKey, + child: Column( + children: [ + Container( + color: AColors.primaryColor, + padding: const EdgeInsets.symmetric(horizontal: 0, vertical: 4), + child: Column( + children: [ + Row( + children: [ + const ABackButton(), + Expanded( + child: Center( + child: Text( + "New Work Order", + style: Theme.of(context).textTheme.titleLarge.copyWith(color: AColors.white, fontStyle: FontStyle.italic), + ), ), ), - ), - const SizedBox( - width: 48, - ) - ], - ), - ], + const SizedBox( + width: 48, + ) + ], + ), + ], + ), ), - ), - Padding( - padding: const EdgeInsets.symmetric(horizontal: 8, vertical: 16), - child: Column( - children: [ - WorkOrderDetails( - item: widget.workOrder, - ), - const SizedBox(height: 8), - Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - const ASubTitle("Equipment status"), - if (_validate && _subWorkOrders?.equipmentStatus == null) - ASubTitle( - subtitle.requiredWord, - color: Colors.red, + Padding( + padding: const EdgeInsets.symmetric(horizontal: 8, vertical: 16), + child: Column( + children: [ + WorkOrderDetails(item: widget.workOrder, assetType: _subWorkOrders?.assetType), + const SizedBox(height: 8), + Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + const ASubTitle("Equipment status"), + if (_validate && _subWorkOrders?.equipmentStatus == null) + ASubTitle( + subtitle.requiredWord, + color: Colors.red, + ), + const SizedBox( + height: 4, ), - const SizedBox( - height: 4, - ), - ServiceRequestDefectTypesMenu( - initialValue: _serviceReport.equipmentStatus, - onSelect: (status) { - _subWorkOrders.equipmentStatus = status; - _serviceReport.equipmentStatus = status; - setState(() {}); - }, - ), - ], - ), - const SizedBox(height: 8), - Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - const ASubTitle("Return to Service"), - if (_validate && _subWorkOrders.visitDate == null) - ASubTitle( - subtitle.requiredWord, - color: Colors.red, + ServiceRequestDefectTypesMenu( + initialValue: _serviceReport.equipmentStatus, + onSelect: (status) { + _subWorkOrders.equipmentStatus = status; + _serviceReport.equipmentStatus = status; + setState(() {}); + }, ), - const SizedBox( - height: 4, - ), - Row( - children: [ - Expanded( - child: ADatePicker( - date: DateTime.tryParse(_subWorkOrders.visitDate ?? ""), - from: DateTime(1950), - onDatePicker: (date) { - _subWorkOrders.visitDate = date?.toIso8601String(); - setState(() {}); - }, - ), + ], + ), + const SizedBox(height: 8), + Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + const ASubTitle("Return to Service"), + if (_validate && _subWorkOrders.visitDate == null) + ASubTitle( + subtitle.requiredWord, + color: Colors.red, ), - ], - ), - ], - ), - const SizedBox(height: 8), - Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - ASubTitle("Failure ${subtitle.reasons}"), - if (_validate && _subWorkOrders.reason == null) - ASubTitle( - subtitle.requiredWord, - color: Colors.red, + const SizedBox( + height: 4, ), - const SizedBox( - height: 4, - ), - ServiceReportReasonsMenu( - initialValue: _serviceReportReason, - onSelect: (status) { - _serviceReportReason = status; - _subWorkOrders.reason = status; - setState(() {}); - }, - ), - ], - ), - const SizedBox(height: 8), - Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - ASubTitle(subtitle.faultDescription), - if (_validate && _subWorkOrders.faultDescription == null) - ASubTitle( - subtitle.requiredWord, - color: Colors.red, - ), - const SizedBox( - height: 4, - ), - ServiceReportFaultDescription( - requestId: widget.workOrder?.callRequest?.id?.toString(), - initialValue: _subWorkOrders?.faultDescription, - onSelect: (status) { - _subWorkOrders.faultDescription = status; - setState(() {}); - }, - ), - ], - ), - const SizedBox(height: 8), - Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - const ASubTitle("Solution"), - const SizedBox(height: 4), - ATextFormField(labelText: _subWorkOrders?.faultDescription?.workPerformed ?? "", textInputType: TextInputType.multiline, enable: false), - ], - ), - const SizedBox(height: 8), - InkWell( - onTap: () async { - await showModalBottomSheet( - context: context, - useSafeArea: true, - isScrollControlled: true, - backgroundColor: Colors.transparent, - builder: (context) => WorkOrderDetailsBottomSheet(subWorkOrder: _subWorkOrders), - ); - log(_subWorkOrders?.toJson()?.toString()); - }, - child: Card( - child: ListTile( - title: Row( + Row( children: [ - Text( - "WO Details", - style: Theme.of(context).textTheme.bodyMedium, + Expanded( + child: ADatePicker( + date: DateTime.tryParse(_subWorkOrders.visitDate ?? ""), + from: DateTime(1950), + onDatePicker: (date) { + _subWorkOrders.visitDate = date?.toIso8601String(); + setState(() {}); + }, + ), ), - const Text("*", style: TextStyle(color: Colors.red)), ], ), - trailing: const Icon(Icons.arrow_forward_ios, size: 14, color: AColors.primaryColor), + ], + ), + const SizedBox(height: 8), + Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + ASubTitle("Failure ${subtitle.reasons}"), + if (_validate && _subWorkOrders.reason == null) + ASubTitle( + subtitle.requiredWord, + color: Colors.red, + ), + const SizedBox( + height: 4, + ), + ServiceReportReasonsMenu( + initialValue: _serviceReportReason, + onSelect: (status) { + _serviceReportReason = status; + _subWorkOrders.reason = status; + setState(() {}); + }, + ), + ], + ), + const SizedBox(height: 8), + Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + ASubTitle(subtitle.faultDescription), + if (_validate && _subWorkOrders.faultDescription == null) + ASubTitle( + subtitle.requiredWord, + color: Colors.red, + ), + const SizedBox( + height: 4, + ), + ServiceReportFaultDescription( + requestId: widget.workOrder?.callRequest?.id?.toString(), + initialValue: _subWorkOrders?.faultDescription, + onSelect: (status) { + _subWorkOrders.faultDescription = status; + if(mounted) + setState(() {}); + }, + ), + ], + ), + const SizedBox(height: 8), + Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + const ASubTitle("Solution"), + const SizedBox(height: 4), + ATextFormField(labelText: _subWorkOrders?.faultDescription?.workPerformed ?? "", textInputType: TextInputType.multiline, enable: false), + ], + ), + const SizedBox(height: 8), + InkWell( + onTap: () async { + await showModalBottomSheet( + context: context, + useSafeArea: true, + isScrollControlled: true, + backgroundColor: Colors.transparent, + builder: (context) => WorkOrderDetailsBottomSheet(subWorkOrder: _subWorkOrders), + ); + log(_subWorkOrders?.toJson()?.toString()); + }, + child: Card( + child: ListTile( + title: Row( + children: [ + Text( + "WO Details", + style: Theme.of(context).textTheme.bodyMedium, + ), + const Text("*", style: TextStyle(color: Colors.red)), + ], + ), + trailing: const Icon(Icons.arrow_forward_ios, size: 14, color: AColors.primaryColor), + ), ), ), - ), - const SizedBox(height: 8), - InkWell( - onTap: () async { - await showModalBottomSheet( - context: context, - useSafeArea: true, - isScrollControlled: true, - backgroundColor: Colors.transparent, - builder: (context) => SparePartsBottomSheet(subWorkOrder: _subWorkOrders), - ); - log(_subWorkOrders?.toJson()?.toString()); - }, - child: Card( - child: ListTile( - title: Row( - children: [ - Text( - "Spare Parts", - style: Theme.of(context).textTheme.bodyMedium, - ), - const Text("*", style: TextStyle(color: Colors.red)), - ], + const SizedBox(height: 8), + InkWell( + onTap: () async { + await showModalBottomSheet( + context: context, + useSafeArea: true, + isScrollControlled: true, + backgroundColor: Colors.transparent, + builder: (context) => SparePartsBottomSheet(subWorkOrder: _subWorkOrders), + ); + log(_subWorkOrders?.toJson()?.toString()); + }, + child: Card( + child: ListTile( + title: Row( + children: [ + Text( + "Spare Parts", + style: Theme.of(context).textTheme.bodyMedium, + ), + const Text("*", style: TextStyle(color: Colors.red)), + ], + ), + trailing: const Icon(Icons.arrow_forward_ios, size: 14, color: AColors.primaryColor), ), - trailing: const Icon(Icons.arrow_forward_ios, size: 14, color: AColors.primaryColor), ), ), - ), - const SizedBox(height: 8), - AMiniOneImagePicker( - image: _image, - onPick: (image) { - _image = image; - _subWorkOrders.attachmentsWorkOrder ??= []; - _subWorkOrders.attachmentsWorkOrder.add(AttachmentsWorkOrder(name: "${image.path.split("/").last}|${base64Encode(image.readAsBytesSync())}")); - }, - ), - const SizedBox(height: 50), - ], + const SizedBox(height: 8), + AMiniOneImagePicker( + image: _image, + onPick: (image) { + _image = image; + _subWorkOrders.attachmentsWorkOrder ??= []; + _subWorkOrders.attachmentsWorkOrder.add(AttachmentsWorkOrder(name: "${image.path.split("/").last}|${base64Encode(image.readAsBytesSync())}")); + }, + ), + const SizedBox(height: 50), + ], + ), ), - ), - ], + ], + ), + ), + ).expanded, + Padding( + padding: const EdgeInsets.all(16.0), + child: AButton( + text: subtitle.create, + onPressed: () async { + _subWorkOrders.parentWOId = widget.workOrder.id; + _validate = true; + setState(() {}); + if (validate()) { + if (_subWorkOrders.startofWorkTime == null) { + Fluttertoast.showToast(msg: "${subtitle.startDate} required"); + return; + } else if (_subWorkOrders.endofWorkTime == null) { + Fluttertoast.showToast(msg: "${subtitle.endDate} required"); + return; + } else if (_subWorkOrders.calllastSituation == null) { + Fluttertoast.showToast(msg: "${subtitle.callLastSituation} required"); + return; + } + _validate = false; + _isLoading = true; + setState(() {}); + if (_formKey.currentState?.validate() ?? false) {} + _formKey.currentState?.save(); + final serviceRequestsProvider = Provider.of(context, listen: false); + final status = await serviceRequestsProvider.createSubWorkOrder(workOrder: _subWorkOrders); + _isLoading = false; + setState(() {}); + if (status >= 200 && status < 300) { + Fluttertoast.showToast(msg: subtitle.requestCompleteSuccessfully); + Navigator.of(context).pop(); + Navigator.of(context).pop(); + } else { + String errorMessage = HttpStatusManger.getStatusMessage(status: serviceRequestsProvider.stateCode, subtitle: subtitle); + ScaffoldMessenger.of(context).showSnackBar(SnackBar( + content: Text(errorMessage), + )); + } + } + }, ), ), - ), - ), - ), - floatingActionButtonLocation: FloatingActionButtonLocation.centerDocked, - floatingActionButton: Padding( - padding: const EdgeInsets.all(16.0), - child: AButton( - text: subtitle.create, - onPressed: () async { - _subWorkOrders.parentWOId = widget.workOrder.id; - _validate = true; - setState(() {}); - if (validate()) { - if (_subWorkOrders.startofWorkTime == null) { - Fluttertoast.showToast(msg: "${subtitle.startDate} required"); - return; - } else if (_subWorkOrders.endofWorkTime == null) { - Fluttertoast.showToast(msg: "${subtitle.endDate} required"); - return; - } else if (_subWorkOrders.calllastSituation == null) { - Fluttertoast.showToast(msg: "${subtitle.callLastSituation} required"); - return; - } - _validate = false; - _isLoading = true; - setState(() {}); - if (_formKey.currentState?.validate() ?? false) {} - _formKey.currentState?.save(); - final serviceRequestsProvider = Provider.of(context, listen: false); - final status = await serviceRequestsProvider.createSubWorkOrder(workOrder: _subWorkOrders); - _isLoading = false; - setState(() {}); - if (status >= 200 && status < 300) { - Fluttertoast.showToast(msg: subtitle.requestCompleteSuccessfully); - Navigator.of(context).pop(); - Navigator.of(context).pop(); - } else { - String errorMessage = HttpStatusManger.getStatusMessage(status: serviceRequestsProvider.stateCode, subtitle: subtitle); - ScaffoldMessenger.of(context).showSnackBar(SnackBar( - content: Text(errorMessage), - )); - } - } - }, - ), + ], + ), ), ); } diff --git a/lib/views/pages/sub_workorder/search_sub_workorder_page.dart b/lib/views/pages/sub_workorder/search_sub_workorder_page.dart index af4b0418..952c831e 100644 --- a/lib/views/pages/sub_workorder/search_sub_workorder_page.dart +++ b/lib/views/pages/sub_workorder/search_sub_workorder_page.dart @@ -9,6 +9,7 @@ import 'package:test_sa/models/subtitle.dart'; import 'package:test_sa/views/pages/sub_workorder/workorder_list.dart'; import 'package:test_sa/views/widgets/app_text_form_field.dart'; import 'package:test_sa/views/widgets/date_and_time/date_picker.dart'; +import 'package:test_sa/views/widgets/hospitals/hospital_auto_complete_field_new.dart'; import '../../../controllers/api_routes/http_status_manger.dart'; import '../../../controllers/localization/localization.dart'; @@ -133,10 +134,13 @@ class _SearchSubWorkOrderPageState extends State { woId: _searchWorkOrders.id?.toString(), ), const SizedBox(height: 16), - ATextFormField( - labelText: "Site", - onSaved: (value) { - _site = value; + HospitalAutoCompleteField( + initialValue:_site, + onSearch: (value) { + _site = value.name; + setState(() { + + }); }, ), const SizedBox(height: 16), @@ -194,7 +198,6 @@ class _SearchSubWorkOrderPageState extends State { _isLoading = false; setState(() {}); if (serviceRequestsProvider.stateCode >= 200 && serviceRequestsProvider.stateCode < 300) { - Fluttertoast.showToast(msg: _subtitle.requestCompleteSuccessfully); Navigator.push( context, MaterialPageRoute( diff --git a/lib/views/pages/sub_workorder/workorder_details.dart b/lib/views/pages/sub_workorder/workorder_details.dart index 82cdb666..6383f586 100644 --- a/lib/views/pages/sub_workorder/workorder_details.dart +++ b/lib/views/pages/sub_workorder/workorder_details.dart @@ -1,4 +1,5 @@ import 'package:flutter/material.dart'; +import 'package:test_sa/models/lookup.dart'; import '../../../controllers/localization/localization.dart'; import '../../../models/service_request/search_work_order.dart'; @@ -8,7 +9,9 @@ import '../../app_style/sizing.dart'; class WorkOrderDetails extends StatelessWidget { final SearchWorkOrder item; - WorkOrderDetails({@required this.item,Key key}) : super(key: key); + Lookup assetType; + + WorkOrderDetails({@required this.item, this.assetType, Key key}) : super(key: key); Subtitle _subtitle; @override @@ -30,15 +33,15 @@ class WorkOrderDetails extends StatelessWidget { ), child: Column( children: [ - _buildRow(_subtitle.callId, item.callRequest?.id?.toString()??"", context), - _buildRow(_subtitle.assetNumber, item.callRequest?.asset?.assetNumber??"", context), + _buildRow(_subtitle.callId, item.callRequest?.id?.toString() ?? "", context), + _buildRow(_subtitle.assetNumber, item.callRequest?.asset?.assetNumber ?? "", context), _buildRow("WO No", item.workOrderNo, context), - _buildRow(_subtitle.assetName, item.callRequest?.asset?.assetNumber??'', context), - _buildRow(_subtitle.department, item.callRequest?.asset?.department??'', context), - _buildRow(_subtitle.assetSN, item.callRequest?.asset?.assetSerialNo??'', context), - _buildRow(_subtitle.model, item.callRequest?.asset?.modelDefinition?.modelName??"", context), - _buildRow("Manufacturer", item.callRequest?.asset?.modelDefinition?.manufacturerName??"", context), - _buildRow(_subtitle.site, item.callRequest?.asset?.site?.custName??"", context), + _buildRow(_subtitle.assetName, item.callRequest?.asset?.assetNumber ?? '', context), + _buildRow(_subtitle.department, item.callRequest?.asset?.department ?? '', context), + _buildRow(_subtitle.assetSN, item.callRequest?.asset?.assetSerialNo ?? '', context), + _buildRow(_subtitle.model, item.callRequest?.asset?.modelDefinition?.modelName ?? "", context), + _buildRow("Manufacturer", item.callRequest?.asset?.modelDefinition?.manufacturerName ?? "", context), + _buildRow(_subtitle.site, item.callRequest?.asset?.site?.custName ?? "", context), ], ), ), @@ -53,16 +56,18 @@ class WorkOrderDetails extends StatelessWidget { ), borderRadius: BorderRadius.circular(AppStyle.borderRadius * AppStyle.getScaleFactor(context)), ), - child: _buildRow("Asset Type", item.assetType?.name??"", context),) + child: _buildRow("Asset Type", assetType?.name ?? (item.assetType?.name ?? ""), context), + ) ], ); } - Widget _buildRow(String title, String value, BuildContext context){ + + Widget _buildRow(String title, String value, BuildContext context) { return Row( mainAxisAlignment: MainAxisAlignment.start, children: [ Text( - title+" : ", + title + " : ", style: Theme.of(context).textTheme.subtitle2.copyWith(fontWeight: FontWeight.bold), ), //if (item.clientName != null) diff --git a/lib/views/pages/user/land_page.dart b/lib/views/pages/user/land_page.dart index 1e90af98..e6e9d608 100644 --- a/lib/views/pages/user/land_page.dart +++ b/lib/views/pages/user/land_page.dart @@ -212,7 +212,7 @@ class _LandPageState extends State { Navigator.of(context).pushNamed(TrackDeviceTransferPage.id); }, ), - // if (_userProvider?.user != null && _userProvider?.user?.type != UsersTypes.engineer) + if (_userProvider?.user != null && _userProvider?.user?.type != UsersTypes.normal_user) LandPageItem( text: "Search Work Order", svgPath: "assets/images/sub_workorder_icon.svg", From a2edcadc1ada403c73bc4fdf42a62743d30eeea1 Mon Sep 17 00:00:00 2001 From: Sikander Saleem Date: Thu, 22 Jun 2023 22:03:11 +0300 Subject: [PATCH 105/181] edit work order added. --- android/app/build.gradle | 21 +- lib/controllers/api_routes/api_manager.dart | 2 +- .../api/service_requests_provider.dart | 9 +- lib/models/service_report.dart | 57 +- .../requests/report/edit_service_report.dart | 1366 ++++++++++------- .../report/future_service_report.dart | 2 + .../pages/user/requests/request_details.dart | 2 +- .../status/report/fault_desc_menu.dart | 6 +- .../service_report_equipment_status.dart | 2 +- .../report/service_report_last_call.dart | 1 + 10 files changed, 913 insertions(+), 555 deletions(-) diff --git a/android/app/build.gradle b/android/app/build.gradle index e55e2b22..4f0659df 100644 --- a/android/app/build.gradle +++ b/android/app/build.gradle @@ -54,22 +54,25 @@ android { } signingConfigs { - release { - keyAlias keystoreProperties['keyAlias'] - keyPassword keystoreProperties['keyPassword'] - storeFile keystoreProperties['storeFile'] ? file(keystoreProperties['storeFile']) : null - storePassword keystoreProperties['storePassword'] - } +// release { +// keyAlias keystoreProperties['keyAlias'] +// keyPassword keystoreProperties['keyPassword'] +// storeFile keystoreProperties['storeFile'] ? file(keystoreProperties['storeFile']) : null +// storePassword keystoreProperties['storePassword'] +// } } buildTypes { debug { signingConfig signingConfigs.debug } release { - minifyEnabled true - shrinkResources true - signingConfig signingConfigs.release + signingConfig signingConfigs.debug } +// release { +// minifyEnabled true +// shrinkResources true +// signingConfig signingConfigs.release +// } } } diff --git a/lib/controllers/api_routes/api_manager.dart b/lib/controllers/api_routes/api_manager.dart index 54d0fc0d..3bbfed51 100644 --- a/lib/controllers/api_routes/api_manager.dart +++ b/lib/controllers/api_routes/api_manager.dart @@ -87,7 +87,7 @@ class ApiManager { headers.addAll(_headers); Uri _url = Uri.parse(url); - // print(_url); + print(_url); // print(headers); // log(json.encode(body)); var request = http.Request('PUT', _url); diff --git a/lib/controllers/providers/api/service_requests_provider.dart b/lib/controllers/providers/api/service_requests_provider.dart index 9fb46d7c..b621caed 100644 --- a/lib/controllers/providers/api/service_requests_provider.dart +++ b/lib/controllers/providers/api/service_requests_provider.dart @@ -474,7 +474,7 @@ class ServiceRequestsProvider extends ChangeNotifier { // body["token"] = user.token; // body["job_id"] = request.id; // body["report_id"] = request.reportID; - try { + // try { Map body = report.toMap(request); // body["uid"] = user.id; // body["token"] = user.token; @@ -491,9 +491,10 @@ class ServiceRequestsProvider extends ChangeNotifier { notifyListeners(); } return response.statusCode; - } catch (error) { - return -1; - } + // } catch (error) { + // print(error); + // return -1; + // } } Future updateWorkOrderDetails({@required SearchWorkOrder workOrder}) async { diff --git a/lib/models/service_report.dart b/lib/models/service_report.dart index 3b681d2a..03092c3c 100644 --- a/lib/models/service_report.dart +++ b/lib/models/service_report.dart @@ -17,6 +17,7 @@ class ServiceReport { DateTime startDate; Lookup assetType; Lookup callLastSituation; + Lookup currentSituation; Lookup repairLocation; Engineer engineer; Lookup equipmentStatus; @@ -25,7 +26,7 @@ class ServiceReport { int faultDescriptionId; String workPreformed; - //String workHours; + num workingHours; double travelingHours; String invoiceNumber; String invoiceCode; @@ -40,7 +41,7 @@ class ServiceReport { String comment; Uint8List localNurseSignature; Uint8List localEngineerSignature; - int travelingExpense; + num travelingExpense; String reviewComment; FaultDescription faultDescription; @@ -52,7 +53,7 @@ class ServiceReport { this.equipmentStatus, this.type, this.faultDescriptionId, - //this.workHours, + this.workingHours, this.travelingHours, this.parts, this.engineer, @@ -60,6 +61,7 @@ class ServiceReport { this.reason, this.operatingHours, this.callLastSituation, + this.currentSituation, this.jobSheetNumber, this.image, this.device, @@ -83,7 +85,7 @@ class ServiceReport { if (id != null) _map["id"] = id; if (visitDate != null) _map["visitDate"] = visitDate.toIso8601String(); //if(serviceType != null) _map["service_type"] = serviceType.id.toString(); - if (equipmentStatus != null) _map["status"] = equipmentStatus?.toMap(); + if (equipmentStatus != null) _map["equipmentStatus"] = equipmentStatus?.toMap(); if (type != null) _map["typeOfWO"] = type?.toMap(); if (assetType != null) _map["TypeOfWO"] = assetType?.toMap(); //if(faultDescriptionId != null && faultDescriptionId.isNotEmpty) _map["fault_description"] = faultDescriptionId; @@ -93,17 +95,19 @@ class ServiceReport { _map["endofWorkTime"] = (timer.endAt ?? DateTime.now()).toIso8601String(); _map["workingHours"] = (timer.durationInSecond / 60 / 60).toStringAsFixed(5); } - if (travelingHours != null && travelingHours.toString().isNotEmpty) _map["traveling_hours"] = travelingHours; + if (travelingHours != null && travelingHours.toString().isNotEmpty) _map["travelingHours"] = travelingHours; // if(workPreformed != null && workPreformed.isNotEmpty){ // _map["faultDescription"] = { - // //"id":faultDescriptionId ?? 0, + // "id":faultDescriptionId ?? 0, // "workPerformed":workPreformed // }; // } - if (travelingHours != null) _map["traveling_hours"] = travelingHours; - if (workPreformed != null && workPreformed.isNotEmpty) { - _map["faultDescription"] = faultDescription.toJson(); - } + _map["faultDescription"] = {"id": faultDescription?.id ?? 0, "workPerformed": faultDescription?.workPerformed}; + if (travelingHours != null) _map["travelingHours"] = travelingHours; + // if (workingHours != null) _map["workingHours"] = workingHours; + // if (workPreformed != null && workPreformed.isNotEmpty) { + // _map["faultDescription"] = faultDescription.toJson(); + // } if (jobSheetNumber != null && jobSheetNumber.isNotEmpty) _map["job_sheet_no"] = jobSheetNumber; if (parts != null && parts.isNotEmpty) { _map["sparePartsWorkOrders"] = parts.map((e) => e.toJson()).toList(); @@ -122,6 +126,7 @@ class ServiceReport { if (reason != null) _map["reason"] = reason.toMap(); //if(operatingHours != null && operatingHours.isNotEmpty) _map["operation_hours"] = operatingHours; if (callLastSituation != null) _map["calllastSituation"] = callLastSituation.toMap(); + if (currentSituation != null) _map["currentSituation"] = currentSituation.toMap(); //if(image != null) _map["image"] = image; //if(invoiceCode != null) _map["invoice_no"] = invoiceCode; //if(invoiceNumber != null) _map["invoice_code"] = invoiceNumber; @@ -133,15 +138,20 @@ class ServiceReport { _map["nurseSignature"] = signatureNurse; _map["engSignature"] = signatureEngineer; _map["comment"] = comment; - _map["travelingExpense"] = travelingExpense; - _map["startofWorkTime"] = startDate; - _map["endofWorkTime"] = endDate; + _map["travelingExpenses"] = travelingExpense; + _map["startofWorkTime"] = startDate.toIso8601String(); + _map["endofWorkTime"] = endDate.toIso8601String(); _map["workingHours"] = endDate?.difference(startDate)?.inHours ?? 0; _map["reviewComment"] = reviewComment; return _map; } bool validate() { + print("visitDate:$visitDate"); + print("equipmentStatus:$equipmentStatus"); + print("callLastSituation:${callLastSituation.toMap()}"); + print("parts:$parts"); + print("reason:${reason.toMap()}"); if (visitDate == null) return false; //if(serviceType == null) return false; if (equipmentStatus == null) return false; @@ -174,27 +184,34 @@ class ServiceReport { id: id, assetType: Lookup.fromJson(parsedJson["assetType"]), callLastSituation: Lookup.fromJson(parsedJson["calllastSituation"]), + currentSituation: Lookup.fromJson(parsedJson["currentSituation"]), + repairLocation: Lookup.fromJson(parsedJson["repairLocation"]), reason: Lookup.fromJson(parsedJson["reason"]), - equipmentStatus: Lookup.fromJson(parsedJson["status"]), + equipmentStatus: Lookup.fromJson(parsedJson["equipmentStatus"]), type: Lookup.fromJson(parsedJson["typeOfWO"]), - faultDescriptionId: parsedJson["fault_description"], - endDate: DateTime.tryParse(parsedJson["endofWorkTime"]), + faultDescription: parsedJson['faultDescription'] != null ? FaultDescription.fromJson(parsedJson['faultDescription']) : null, + + // faultDescription: parsedJson["faultDescription"], + startDate: DateTime.tryParse(parsedJson["startofWorkTime"]?? ""), + endDate: DateTime.tryParse(parsedJson["endofWorkTime"]??""), //invoiceCode: parsedJson["invoice_code"], //invoiceNumber: parsedJson["invoice_no"], //jobSheetNumber: parsedJson["job_sheet_no"], - operatingHours: parsedJson["workingHours"], + // workingHours: parsedJson["workingHours"], engineer: Engineer.fromJson(parsedJson["assignedEmployee"]), parts: _parts, //quantity: parsedJson["nid"], - travelingHours: parsedJson["traveling_hours"], + travelingHours: parsedJson["travelingHours"], + travelingExpense: parsedJson["travelingExpenses"], visitDate: DateTime.tryParse(parsedJson["visitDate"]), - //workHours: parsedJson["working_hours"], + workingHours: parsedJson["workingHours"], timer: TimerModel( - startAt: DateTime.tryParse(parsedJson["startofWorkTime"]), endAt: DateTime.tryParse(parsedJson["endofWorkTime"]), durationInSecond: ((parsedJson["workingHours"] ?? 0) * 60 * 60).toInt()), + startAt: DateTime.tryParse(parsedJson["startofWorkTime"]??""), endAt: DateTime.tryParse(parsedJson["endofWorkTime"]??""), durationInSecond: ((parsedJson["workingHours"] ?? 0) * 60 * 60).toInt()), //workPreformed: parsedJson["work_performed"], device: Device.fromJson(parsedJson["callRequest"]["asset"]), signatureNurse: URLs.getFileUrl(parsedJson["nurseSignature"]), signatureEngineer: URLs.getFileUrl(parsedJson["engSignature"]), + comment: parsedJson['comment'], reviewComment: parsedJson['reviewComment'], ); } diff --git a/lib/views/pages/user/requests/report/edit_service_report.dart b/lib/views/pages/user/requests/report/edit_service_report.dart index 848fc4f2..0db15bb7 100644 --- a/lib/views/pages/user/requests/report/edit_service_report.dart +++ b/lib/views/pages/user/requests/report/edit_service_report.dart @@ -8,9 +8,12 @@ import 'package:test_sa/controllers/api_routes/http_status_manger.dart'; import 'package:test_sa/controllers/localization/localization.dart'; import 'package:test_sa/controllers/providers/api/service_requests_provider.dart'; import 'package:test_sa/controllers/providers/api/status_drop_down/report/service_report_last_calls_provider.dart'; +import 'package:test_sa/controllers/providers/api/status_drop_down/report/service_types_provider.dart'; import 'package:test_sa/controllers/providers/api/user_provider.dart'; import 'package:test_sa/controllers/providers/settings/setting_provider.dart'; import 'package:test_sa/controllers/validator/validator.dart'; +import 'package:test_sa/models/call_request_for_work_order_model.dart'; +import 'package:test_sa/models/engineer.dart'; import 'package:test_sa/models/part.dart'; import 'package:test_sa/models/service_report.dart'; import 'package:test_sa/models/service_request/service_request.dart'; @@ -21,6 +24,7 @@ import 'package:test_sa/views/widgets/app_text_form_field.dart'; import 'package:test_sa/views/widgets/buttons/app_back_button.dart'; import 'package:test_sa/views/widgets/buttons/app_button.dart'; import 'package:test_sa/views/widgets/date_and_time/date_picker.dart'; +import 'package:test_sa/views/widgets/date_and_time/time_picker.dart'; import 'package:test_sa/views/widgets/e_signature/e_signature.dart'; import 'package:test_sa/views/widgets/equipment/auto_complete_devices_field.dart'; import 'package:test_sa/views/widgets/images/mini_one_image_picker.dart'; @@ -28,8 +32,11 @@ import 'package:test_sa/views/widgets/loaders/loading_manager.dart'; import 'package:test_sa/views/widgets/parts/auto_complete_parts_field.dart'; import 'package:test_sa/views/widgets/parts/part_item.dart'; import 'package:test_sa/views/widgets/status/employee/engineers_mune.dart'; +import 'package:test_sa/views/widgets/status/report/service_report_equipment_status.dart'; +import 'package:test_sa/views/widgets/status/report/service_report_fault_description.dart'; import 'package:test_sa/views/widgets/status/report/service_report_last_call.dart'; import 'package:test_sa/views/widgets/status/report/service_report_reasons.dart'; +import 'package:test_sa/views/widgets/status/report/service_report_repair_location.dart'; import 'package:test_sa/views/widgets/status/report/service_report_status.dart'; import 'package:test_sa/views/widgets/status/report/service_report_type.dart'; import 'package:test_sa/views/widgets/status/report/service_status.dart'; @@ -42,6 +49,7 @@ class EditServiceReport extends StatefulWidget { final ServiceReport report; const EditServiceReport({Key key, this.request, this.report}) : super(key: key); + @override _EditServiceReportState createState() => _EditServiceReportState(); } @@ -54,6 +62,7 @@ class _EditServiceReportState extends State with TickerProvid bool _validate = false; ServiceReport _serviceReport; bool _isLoading = false; + bool _showCommentField = false; Subtitle _subtitle; File _image; @@ -62,12 +71,26 @@ class _EditServiceReportState extends State with TickerProvid TextEditingController _faultController = TextEditingController(); TextEditingController _workPreformedController = TextEditingController(); + ServiceStatusProvider _assetTypeProvider; + + CallRequestForWorkOrder _callRequestForWorkOrder; + @override void initState() { _serviceReport = widget.report; super.initState(); } + void getRequestForWorkOrder() async { + _isLoading = true; + setState(() {}); + _callRequestForWorkOrder = await _serviceRequestsProvider.getCallRequestForWorkOrder(callId: widget.request.id); + _serviceReport.engineer = Engineer.fromJson(_callRequestForWorkOrder?.assignedEmployee?.toJson()); + await _assetTypeProvider.getTypes(user: _userProvider.user, host: _settingProvider.host); + _isLoading = false; + setState(() {}); + } + @override void dispose() { _faultController.dispose(); @@ -80,6 +103,15 @@ class _EditServiceReportState extends State with TickerProvid _userProvider = Provider.of(context); _settingProvider = Provider.of(context); _serviceRequestsProvider = Provider.of(context); + + _assetTypeProvider = Provider.of(context); + if (_callRequestForWorkOrder == null) { + getRequestForWorkOrder(); + } + _serviceReport.assetType = _assetTypeProvider.statuses?.firstWhere( + (element) => element.value == _callRequestForWorkOrder?.assetType, + orElse: () => null, + ); _subtitle = AppLocalization.of(context).subtitle; return Scaffold( key: _scaffoldKey, @@ -94,11 +126,9 @@ class _EditServiceReportState extends State with TickerProvid child: Stack( children: [ ListView( + padding: const EdgeInsets.all(16), children: [ - //AppNameBar(), - const SizedBox( - height: 16, - ), + const SizedBox(height: 16), Center( child: Padding( padding: const EdgeInsets.all(8.0), @@ -108,22 +138,22 @@ class _EditServiceReportState extends State with TickerProvid ), ), ), - Container( - padding: const EdgeInsets.symmetric(horizontal: 16), - margin: const EdgeInsets.symmetric(horizontal: 16, vertical: 16), - decoration: BoxDecoration(color: AColors.grey, borderRadius: BorderRadius.circular(AppStyle.getBorderRadius(context)), boxShadow: [ - const BoxShadow( - color: AColors.grey, - offset: Offset(0, -1), - ) - ]), - child: Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - const SizedBox( - height: 8, - ), - Wrap( + Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + ASubTitle("Caller Info"), + const SizedBox(height: 8), + Container( + width: double.infinity, + padding: const EdgeInsets.all(16), + margin: const EdgeInsets.symmetric(vertical: 16), + decoration: BoxDecoration(color: AColors.grey, borderRadius: BorderRadius.circular(AppStyle.getBorderRadius(context)), boxShadow: const [ + BoxShadow( + color: AColors.grey, + offset: Offset(0, -1), + ) + ]), + child: Wrap( spacing: 10, children: [ ASubTitle( @@ -146,186 +176,161 @@ class _EditServiceReportState extends State with TickerProvid ) ], ), - const Divider(), - - // Report type and Reasons - Row( + ), + const SizedBox(height: 8), + ASubTitle("Work Order Details"), + const SizedBox(height: 8), + Container( + width: double.infinity, + padding: const EdgeInsets.all(16), + margin: const EdgeInsets.symmetric(vertical: 16), + decoration: BoxDecoration(color: AColors.grey, borderRadius: BorderRadius.circular(AppStyle.getBorderRadius(context)), boxShadow: [ + const BoxShadow( + color: AColors.grey, + offset: Offset(0, -1), + ) + ]), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, children: [ - // Report Status - Expanded( - child: Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - ASubTitle(_subtitle.reportType), - _validate && _serviceReport.type == null - ? ASubTitle( - _subtitle.requiredWord, - color: Colors.red, - ) - : const SizedBox.shrink(), - const SizedBox( - height: 4, - ), - ServiceReportTypeMenu( - initialValue: _serviceReport.type, - onSelect: (status) { - _serviceReport.type = status; - }, - ), - ], - ), - ), - const SizedBox( - width: 8, - ), - // visit date - Expanded( - child: Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - ASubTitle(_subtitle.visitDate), - _validate && _serviceReport.visitDate == null - ? ASubTitle( - _subtitle.requiredWord, - color: Colors.red, - ) - : const SizedBox.shrink(), - Row( + // Report type and Reasons + Row( + children: [ + // Report Status + // Expanded( + // child: Column( + // crossAxisAlignment: CrossAxisAlignment.start, + // children: [ + // ASubTitle(_subtitle.reportType), + // _validate && _serviceReport.type == null + // ? ASubTitle( + // _subtitle.requiredWord, + // color: Colors.red, + // ) + // : const SizedBox.shrink(), + // const SizedBox( + // height: 4, + // ), + // ServiceReportTypeMenu( + // initialValue: _serviceReport.type, + // onSelect: (status) { + // _serviceReport.type = status; + // }, + // ), + // ], + // ), + // ), + // const SizedBox( + // width: 8, + // ), + // visit date + Expanded( + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, children: [ - Expanded( - child: ADatePicker( - date: _serviceReport.visitDate, - from: DateTime.now().subtract(const Duration(days: 365)), - to: DateTime.now().add(const Duration(days: 365)), - onDatePicker: (date) { - _serviceReport.visitDate = date; - setState(() {}); - }, - ), + ASubTitle(_subtitle.visitDate), + _validate && _serviceReport.visitDate == null + ? ASubTitle( + _subtitle.requiredWord, + color: Colors.red, + ) + : const SizedBox.shrink(), + Row( + children: [ + Expanded( + child: ADatePicker( + date: _serviceReport.visitDate, + from: DateTime.now().subtract(const Duration(days: 365)), + to: DateTime.now().add(const Duration(days: 365)), + onDatePicker: (date) { + _serviceReport.visitDate = date; + setState(() {}); + }, + ), + ), + ], ), ], ), - ], - ), + ), + ], ), - ], - ), - const SizedBox( - height: 8, - ), - // device sn - Visibility( - visible: true, //widget.report.device == null, - child: Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - ASubTitle(_subtitle.deviceSN), - _validate && _serviceReport.device?.id == null - ? ASubTitle( - _subtitle.requiredWord, - color: Colors.red, - ) - : const SizedBox.shrink(), - AutoCompleteDeviceField( - hospitalId: widget.request.hospitalId, - initialValue: _serviceReport.device, - onPick: (id) { - _serviceReport.device.id = id; - }, - ), - const SizedBox( - height: 8, - ), - ], - ), - ), - const SizedBox( - height: 8, - ), - ASubTitle(_subtitle.serviceType), - _validate && _serviceReport.assetType == null - ? ASubTitle( - _subtitle.requiredWord, - color: Colors.red, - ) - : const SizedBox.shrink(), - const SizedBox( - height: 4, - ), - ServiceAssetTypeMenu( - initialValue: _serviceReport.assetType, - onSelect: (status) { - _serviceReport.assetType = status; - }, - ), - const SizedBox( - height: 8, - ), - SizedBox( - height: 8 * AppStyle.getScaleFactor(context), - ), - const ASubTitle("Assign Employee"), - const SizedBox( - height: 8, - ), - _validate && _serviceReport.engineer == null - ? ASubTitle( - _subtitle.requiredWord, - color: Colors.red, - ) - : const SizedBox.shrink(), - const SizedBox( - height: 4, - ), - EngineersMenu( - initialValue: _serviceReport.engineer, - onSelect: (engineer) { - _serviceReport.engineer = engineer; - }, - ), - const SizedBox( - height: 8, - ), - // Report status and Service Type - Row( - children: [ - // report status - Expanded( + const SizedBox( + height: 8, + ), + // device sn + Visibility( + visible: widget.request.deviceSerialNumber == null, child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ - ASubTitle(_subtitle.reportStatus), - _validate && _serviceReport.equipmentStatus == null + ASubTitle(_subtitle.deviceSN), + _validate && _serviceReport.device?.id == null ? ASubTitle( _subtitle.requiredWord, color: Colors.red, ) : const SizedBox.shrink(), - const SizedBox( - height: 4, - ), - ServiceReportStatusMenu( - report: _serviceReport, - request: widget.request, - onSelect: (status) { - _serviceReport.equipmentStatus = status; + AutoCompleteDeviceField( + hospitalId: widget.request.hospitalId, + initialValue: _serviceReport.device, + onPick: (id) { + _serviceReport.device.id = id; }, ), + const SizedBox(height: 8), ], ), ), + const SizedBox(height: 8), + ASubTitle(_subtitle.serviceType), + _validate && _serviceReport.assetType == null + ? ASubTitle( + _subtitle.requiredWord, + color: Colors.red, + ) + : const SizedBox.shrink(), + const SizedBox( + height: 4, + ), + LoadingManager( + isLoading: _assetTypeProvider.isLoading, + isFailedLoading: _assetTypeProvider.statuses == null, + stateCode: _assetTypeProvider.stateCode, + onRefresh: () async { + _assetTypeProvider.reset(); + await _assetTypeProvider.getTypes(user: _userProvider.user, host: _settingProvider.host); + _serviceReport?.assetType = _assetTypeProvider.statuses?.firstWhere( + (element) => element.value == _callRequestForWorkOrder.assetType, + orElse: () => null, + ); + }, + child: ATextFormField( + initialValue: _serviceReport?.assetType?.name ?? "NULL", + textAlign: TextAlign.center, + enable: false, + style: Theme.of(context).textTheme.titleMedium, + ), + ), + // ServiceAssetTypeMenu( + // initialValue: _serviceReport.assetType, + // onSelect: (status) { + // _serviceReport.assetType = status; + // }, + // ), const SizedBox( - width: 8, + height: 8, ), - Consumer( - builder: (_, provider, __) { - if (provider.isLoading == null) return const SizedBox.shrink(); - return Expanded( + Row( + children: [ + // report status + Expanded( child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ - ASubTitle(_subtitle.callLastSituation), - _validate && _serviceReport.callLastSituation == null + // ASubTitle(_subtitle.reportStatus), + ASubTitle("Equipment Status"), + _validate && _serviceReport.equipmentStatus == null ? ASubTitle( _subtitle.requiredWord, color: Colors.red, @@ -334,336 +339,667 @@ class _EditServiceReportState extends State with TickerProvid const SizedBox( height: 4, ), - ServiceReportLastCallsMenu( + // ServiceReportStatusMenu( + // report: _serviceReport, + // request: widget.request, + // onSelect: (status) { + // _serviceReport.status = status; + // }, + // ), + ServiceReportEquipmentStatusMenu( report: _serviceReport, + request: widget.request, onSelect: (status) { - if (status?.value == 12 || _serviceReport.callLastSituation?.value == 12) { - _serviceReport.callLastSituation = status; - setState(() {}); - } else { - _serviceReport.callLastSituation = status; - } + _serviceReport.equipmentStatus = status; }, - ), + ) ], ), - ); - }, + ), + const SizedBox( + width: 8, + ), + // Provider.of(context).isLoading == null + // ? const SizedBox.shrink(): + // Call's last Situation + Consumer( + builder: (_, provider, __) { + if (provider.isLoading == null) return const SizedBox.shrink(); + return Expanded( + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + ASubTitle(_subtitle.callLastSituation), + _validate && _serviceReport.callLastSituation == null + ? ASubTitle( + _subtitle.requiredWord, + color: Colors.red, + ) + : const SizedBox.shrink(), + const SizedBox(height: 4), + ServiceReportLastCallsMenu( + report: _serviceReport, + onSelect: (status) { + if (status?.value == 12 || _serviceReport.callLastSituation?.value == 12) { + _serviceReport.callLastSituation = status; + setState(() {}); + } else { + _serviceReport.callLastSituation = status; + } + }, + ), + ], + ), + ); + }, + ), + ], ), - ], - ), - const SizedBox( - height: 8, - ), - // invoice number & code - _serviceReport.callLastSituation?.value != 12 - ? const SizedBox.shrink() - : Row( - children: [ - Expanded( - child: Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - ASubTitle(_subtitle.invoiceNumber), - const SizedBox( - height: 8, - ), - ATextFormField( - initialValue: _serviceReport?.invoiceNumber, - textAlign: TextAlign.center, - style: Theme.of(context).textTheme.subtitle1, - validator: (value) => Validator.hasValue(value) ? null : _subtitle.requiredWord, - textInputType: TextInputType.number, - onSaved: (value) { - _serviceReport.invoiceNumber = value; - }, - ), - ], - ), - ), - const SizedBox( - width: 8, - ), - Expanded( - child: Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - ASubTitle(_subtitle.invoiceCode), - const SizedBox( - height: 4, + if (_showCommentField) + const SizedBox( + height: 8, + ), + if (_showCommentField) + ATextFormField( + initialValue: _serviceReport?.reviewComment, + hintText: "Review Comment", + textAlign: TextAlign.center, + style: Theme.of(context).textTheme.titleMedium, + textInputType: TextInputType.multiline, + onSaved: (value) { + _serviceReport.reviewComment = value; + }, + ), + + SizedBox( + height: 8 * AppStyle.getScaleFactor(context), + ), + // const ASubTitle("Assign Employee"), + // const SizedBox( + // height: 8, + // ), + // _validate && _serviceReport.engineer == null + // ? ASubTitle( + // _subtitle.requiredWord, + // color: Colors.red, + // ) + // : const SizedBox.shrink(), + // const SizedBox( + // height: 4, + // ), + // EngineersMenu( + // initialValue: _serviceReport.engineer, + // onSelect: (engineer) { + // _serviceReport.engineer = engineer; + // }, + // ), + // const SizedBox( + // height: 8, + // ), + // Report status and Service Type + // Row( + // children: [ + // // report status + // Expanded( + // child: Column( + // crossAxisAlignment: CrossAxisAlignment.start, + // children: [ + // ASubTitle(_subtitle.reportStatus), + // _validate && _serviceReport.equipmentStatus == null + // ? ASubTitle( + // _subtitle.requiredWord, + // color: Colors.red, + // ) + // : const SizedBox.shrink(), + // const SizedBox( + // height: 4, + // ), + // ServiceReportStatusMenu( + // report: _serviceReport, + // request: widget.request, + // onSelect: (status) { + // _serviceReport.equipmentStatus = status; + // }, + // ), + // ], + // ), + // ), + // const SizedBox( + // width: 8, + // ), + // Consumer( + // builder: (_, provider, __) { + // if (provider.isLoading == null) return const SizedBox.shrink(); + // return Expanded( + // child: Column( + // crossAxisAlignment: CrossAxisAlignment.start, + // children: [ + // ASubTitle(_subtitle.callLastSituation), + // _validate && _serviceReport.callLastSituation == null + // ? ASubTitle( + // _subtitle.requiredWord, + // color: Colors.red, + // ) + // : const SizedBox.shrink(), + // const SizedBox( + // height: 4, + // ), + // ServiceReportLastCallsMenu( + // report: _serviceReport, + // onSelect: (status) { + // if (status?.value == 12 || _serviceReport.callLastSituation?.value == 12) { + // _serviceReport.callLastSituation = status; + // setState(() {}); + // } else { + // _serviceReport.callLastSituation = status; + // } + // }, + // ), + // ], + // ), + // ); + // }, + // ), + // ], + // ), + const SizedBox( + height: 8, + ), + // invoice number & code + _serviceReport.callLastSituation?.value != 12 + ? const SizedBox.shrink() + : Row( + children: [ + Expanded( + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + ASubTitle(_subtitle.invoiceNumber), + const SizedBox( + height: 8, + ), + ATextFormField( + initialValue: _serviceReport?.invoiceNumber, + textAlign: TextAlign.center, + style: Theme.of(context).textTheme.subtitle1, + validator: (value) => Validator.hasValue(value) ? null : _subtitle.requiredWord, + textInputType: TextInputType.number, + onSaved: (value) { + _serviceReport.invoiceNumber = value; + }, + ), + ], ), - ATextFormField( - initialValue: _serviceReport?.invoiceCode, - textAlign: TextAlign.center, - style: Theme.of(context).textTheme.subtitle1, - validator: (value) => Validator.hasValue(value) ? null : _subtitle.requiredWord, - textInputType: TextInputType.text, - onSaved: (value) { - _serviceReport.invoiceCode = value; - }, + ), + const SizedBox( + width: 8, + ), + Expanded( + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + ASubTitle(_subtitle.invoiceCode), + const SizedBox( + height: 4, + ), + ATextFormField( + initialValue: _serviceReport?.invoiceCode, + textAlign: TextAlign.center, + style: Theme.of(context).textTheme.subtitle1, + validator: (value) => Validator.hasValue(value) ? null : _subtitle.requiredWord, + textInputType: TextInputType.text, + onSaved: (value) { + _serviceReport.invoiceCode = value; + }, + ), + ], ), - ], - ), + ), + ], ), - ], - ), - - // const SizedBox(height: 8,), - // Row( - // children: [ - // ASubTitle(_subtitle.faultDescription), - // Expanded( - // child: SizedBox( - // height: 32 * AppStyle.getScaleFactor(context), - // child: SpeechToTextButton( - // controller: _faultController, - // mini: true, - // ), - // ), - // ), - // ], - // ), - // const SizedBox(height: 4,), - // ATextFormField( - // initialValue: _serviceReport?.faultDescriptionId, - // textAlign: TextAlign.center, - // controller: _faultController, - // style: Theme.of(context).textTheme.subtitle1, - // validator: (value) => - // Validator.hasValue(value) - // ? null : _subtitle.requiredWord, - // textInputType: TextInputType.multiline, - // onSaved: (value){ - // _serviceReport.faultDescriptionId = value; - // }, - // ), - // const SizedBox(height: 8,), - // Row( - // children: [ - // ASubTitle(_subtitle.workPreformed), - // Expanded( - // child: SizedBox( - // height: 32 * AppStyle.getScaleFactor(context), - // child: SpeechToTextButton( - // controller: _workPreformedController, - // mini: true, - // ), - // ), - // ), - // ], - // ), - // const SizedBox(height: 4,), - // ATextFormField( - // initialValue: _serviceReport?.workPreformed, - // textAlign: TextAlign.center, - // controller: _workPreformedController, - // style: Theme.of(context).textTheme.subtitle1, - // validator: (value) => - // Validator.hasValue(value) - // ? null : _subtitle.requiredWord, - // textInputType: TextInputType.multiline, - // onSaved: (value){ - // _serviceReport.workPreformed = value; - // }, - // ), - // const SizedBox(height: 8,), - const SizedBox( - height: 8, - ), - Row( - children: [ - // reasons - Expanded( - child: Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - ASubTitle(_subtitle.reasons), - const SizedBox( - height: 4, + // const SizedBox(height: 8,), + // Row( + // children: [ + // ASubTitle(_subtitle.faultDescription), + // Expanded( + // child: SizedBox( + // height: 32 * AppStyle.getScaleFactor(context), + // child: SpeechToTextButton( + // controller: _faultController, + // mini: true, + // ), + // ), + // ), + // ], + // ), + // const SizedBox(height: 4,), + // ATextFormField( + // initialValue: _serviceReport?.faultDescriptionId, + // textAlign: TextAlign.center, + // controller: _faultController, + // style: Theme.of(context).textTheme.subtitle1, + // validator: (value) => + // Validator.hasValue(value) + // ? null : _subtitle.requiredWord, + // textInputType: TextInputType.multiline, + // onSaved: (value){ + // _serviceReport.faultDescriptionId = value; + // }, + // ), + // const SizedBox(height: 8,), + // Row( + // children: [ + // ASubTitle(_subtitle.workPreformed), + // Expanded( + // child: SizedBox( + // height: 32 * AppStyle.getScaleFactor(context), + // child: SpeechToTextButton( + // controller: _workPreformedController, + // mini: true, + // ), + // ), + // ), + // ], + // ), + // const SizedBox(height: 4,), + // ATextFormField( + // initialValue: _serviceReport?.workPreformed, + // textAlign: TextAlign.center, + // controller: _workPreformedController, + // style: Theme.of(context).textTheme.subtitle1, + // validator: (value) => + // Validator.hasValue(value) + // ? null : _subtitle.requiredWord, + // textInputType: TextInputType.multiline, + // onSaved: (value){ + // _serviceReport.workPreformed = value; + // }, + // ), + // const SizedBox(height: 8,), + Row( + children: [ + Expanded( + child: Column( + crossAxisAlignment: CrossAxisAlignment.stretch, + children: [ + const ASubTitle("Start of Work"), + SizedBox( + height: 8 * AppStyle.getScaleFactor(context), + ), + ADateTimePicker( + date: _serviceReport.startDate, + from: DateTime.now().subtract(const Duration(days: 365)), + to: DateTime.now().add(const Duration(days: 365)), + onDateTimePicker: (date) { + _serviceReport.startDate = date; + setState(() {}); + }, + ), + ], ), - ServiceReportReasonsMenu( - initialValue: _serviceReport.reason, - onSelect: (status) { - _serviceReport.reason = status; - }, + ), + const SizedBox(width: 8), + Expanded( + child: Column( + crossAxisAlignment: CrossAxisAlignment.stretch, + children: [ + const ASubTitle("End of Work"), + SizedBox( + height: 8 * AppStyle.getScaleFactor(context), + ), + ADateTimePicker( + date: _serviceReport.endDate, + from: DateTime.now().subtract(const Duration(days: 365)), + to: DateTime.now().add(const Duration(days: 365)), + onDateTimePicker: (date) { + _serviceReport.endDate = date; + setState(() {}); + }, + ), + ], ), - ], - ), + ), + ], + ), + const SizedBox(height: 8), + ASubTitle(_subtitle.workingHours), + const SizedBox(height: 4), + ATextFormField( + initialValue: null, + textAlign: TextAlign.center, + hintText: _serviceReport.startDate == null + ? "0" + : ((_serviceReport?.endDate?.difference(_serviceReport?.startDate)?.inMinutes ?? 0) / 60)?.toStringAsFixed(2)?.toString() ?? "0", + enable: false, + style: Theme.of(context).textTheme.subtitle1, + validator: (value) => Validator.isNumeric(value) ? null : _subtitle.requiredWord, + textInputType: TextInputType.number, + onSaved: (value) { + // _serviceReport.workHours = value; + }, ), const SizedBox( - width: 8, + height: 8, ), - Expanded( - child: Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - ASubTitle(_subtitle.attachImage), - AMiniOneImagePicker( - //error: _validate && _serviceReport.image == null, - image: _image, - onPick: (image) { - _image = image; - _serviceReport.image = base64Encode(image.readAsBytesSync()); - }, - ), - ], + if (_showCommentField) + const SizedBox( + height: 8, + ), + if (_showCommentField) + ATextFormField( + initialValue: _serviceReport?.reviewComment, + hintText: "Review Comment", + textAlign: TextAlign.center, + style: Theme.of(context).textTheme.titleMedium, + textInputType: TextInputType.multiline, + onSaved: (value) { + _serviceReport.reviewComment = value; + }, ), + SizedBox( + height: 8 * AppStyle.getScaleFactor(context), ), - ], - ), - const SizedBox( - height: 8, - ), - // Traveling Hours & Working Hours - Row( - children: [ - Expanded( - child: Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - ASubTitle(_subtitle.workingHours), - const SizedBox( - height: 8, + const SizedBox(height: 8), + ASubTitle(_subtitle.faultDescription), + const SizedBox( + height: 4, + ), + ServiceReportFaultDescription( + requestId: widget.request?.id, + initialValue: _serviceReport.faultDescription, + onSelect: (status) { + print("faluttt:${status?.toJson()}"); + _serviceReport.faultDescription = status; + if(mounted) + setState(() {}); + }, + ), + const SizedBox(height: 8), + ASubTitle(_subtitle.workPreformed), + const SizedBox(height: 4), + ATextFormField( + initialValue: _serviceReport?.workPreformed, + textAlign: TextAlign.center, + enable: false, + hintText: _serviceReport.faultDescription?.workPerformed ?? "", + controller: _workPreformedController, + style: Theme.of(context).textTheme.subtitle1, + validator: (value) => Validator.hasValue(value) ? null : _subtitle.requiredWord, + textInputType: TextInputType.multiline, + onSaved: (value) { + // _serviceReport.workPreformed = value; + }, + ), + const SizedBox(height: 4), + Row( + children: [ + // reasons + Expanded( + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + ASubTitle(_subtitle.reasons), + const SizedBox( + height: 4, + ), + ServiceReportReasonsMenu( + initialValue: _serviceReport.reason, + onSelect: (status) { + _serviceReport.reason = status; + }, + ), + ], ), - Row( + ), + const SizedBox( + width: 8, + ), + Expanded( + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, children: [ - Expanded( - child: AppTimer( - timer: _serviceReport.timer, - onChange: (timer) async { - _serviceReport.timer = timer; - return true; - }, - ), + ASubTitle(_subtitle.attachImage), + AMiniOneImagePicker( + //error: _validate && _serviceReport.image == null, + image: _image, + onPick: (image) { + _image = image; + _serviceReport.image = base64Encode(image.readAsBytesSync()); + }, ), ], ), - // ATextFormField( - // initialValue: _serviceReport?.workHours, - // textAlign: TextAlign.center, - // hintText: "i.e 3, 3.5, 4", - // style: Theme.of(context).textTheme.subtitle1, - // validator: (value) => - // Validator.isNumeric(value) - // ? null : _subtitle.requiredWord, - // textInputType: TextInputType.number, - // onSaved: (value){ - // _serviceReport.workHours = value; - // }, - // ), - ], - ), + ), + ], ), - // const SizedBox(width: 8,), - // Expanded( - // child: Column( - // crossAxisAlignment: CrossAxisAlignment.start, - // children: [ - // ASubTitle(_subtitle.travelingHours), - // const SizedBox(height: 4,), - // ATextFormField( - // initialValue: _serviceReport?.travelingHours, - // textAlign: TextAlign.center, - // hintText: "i.e 3, 3.5, 4", - // style: Theme.of(context).textTheme.subtitle1, - // validator: (value) => - // Validator.isNumeric(value) - // ? null : _subtitle.requiredWord, - // textInputType: TextInputType.number, - // onSaved: (value){ - // _serviceReport.travelingHours = value; - // }, + const SizedBox( + height: 8, + ), + const SizedBox(height: 8), + ASubTitle(_subtitle.repairLocation), + const SizedBox(height: 4), + ServiceReportRepairLocation( + initialValue: _serviceReport.repairLocation, + onSelect: (status) { + _serviceReport.repairLocation = status; + }, + ), + const SizedBox(height: 16), + ASubTitle(_subtitle.travelingExpense), + const SizedBox( + height: 4, + ), + ATextFormField( + initialValue: _serviceReport?.travelingExpense?.toString(), + hintText: _subtitle.travelingExpense, + textAlign: TextAlign.center, + style: Theme.of(context).textTheme.titleMedium, + textInputType: TextInputType.number, + onSaved: (value) { + if (value != null && value.isEmpty) { + _serviceReport.travelingExpense = int.tryParse(_serviceReport?.travelingExpense?.toString() ?? "") ?? 0; + } else + _serviceReport.travelingExpense = int.tryParse(value) ?? 0; + }, + ), + + const SizedBox(height: 8), + ASubTitle(_subtitle.travelingHours), + const SizedBox(height: 4), + ATextFormField( + initialValue: _serviceReport?.travelingHours?.toString(), + textAlign: TextAlign.center, + hintText: "i.e 3, 3.5, 4", + style: Theme.of(context).textTheme.subtitle1, + // validator: (value) => + // Validator.isNumeric(value) + // ? null : _subtitle.requiredWord, + textInputType: TextInputType.number, + onSaved: (value) { + _serviceReport.travelingHours = double.tryParse(value) ?? 0.0; + }, + ), + // Traveling Hours & Working Hours + // Row( + // children: [ + // Expanded( + // child: Column( + // crossAxisAlignment: CrossAxisAlignment.start, + // children: [ + // ASubTitle(_subtitle.workingHours), + // const SizedBox( + // height: 8, + // ), + // Row( + // children: [ + // Expanded( + // child: AppTimer( + // timer: _serviceReport.timer, + // onChange: (timer) async { + // _serviceReport.timer = timer; + // return true; + // }, + // ), + // ), + // ], + // ), + // // ATextFormField( + // // initialValue: _serviceReport?.workHours, + // // textAlign: TextAlign.center, + // // hintText: "i.e 3, 3.5, 4", + // // style: Theme.of(context).textTheme.subtitle1, + // // validator: (value) => + // // Validator.isNumeric(value) + // // ? null : _subtitle.requiredWord, + // // textInputType: TextInputType.number, + // // onSaved: (value){ + // // _serviceReport.workHours = value; + // // }, + // // ), + // ], + // ), + // ), + // // const SizedBox(width: 8,), + // // Expanded( + // // child: Column( + // // crossAxisAlignment: CrossAxisAlignment.start, + // // children: [ + // // ASubTitle(_subtitle.travelingHours), + // // const SizedBox(height: 4,), + // // ATextFormField( + // // initialValue: _serviceReport?.travelingHours, + // // textAlign: TextAlign.center, + // // hintText: "i.e 3, 3.5, 4", + // // style: Theme.of(context).textTheme.subtitle1, + // // validator: (value) => + // // Validator.isNumeric(value) + // // ? null : _subtitle.requiredWord, + // // textInputType: TextInputType.number, + // // onSaved: (value){ + // // _serviceReport.travelingHours = value; + // // }, + // // ), + // // ], + // // ), + // // ), + // ], + // ), + // const SizedBox( + // height: 8, + // ), + // Operating Hours and Job Sheet Number + // Row( + // children: [ + // Expanded( + // child: Column( + // crossAxisAlignment: CrossAxisAlignment.start, + // children: [ + // ASubTitle(_subtitle.operatingHours), + // const SizedBox(height: 4,), + // ATextFormField( + // initialValue: _serviceReport?.operatingHours, + // textAlign: TextAlign.center, + // hintText: "i.e 3, 3.5, 4", + // style: Theme.of(context).textTheme.subtitle1, + // validator: (value) => + // Validator.isNumeric(value) + // ? null : _subtitle.requiredWord, + // textInputType: TextInputType.number, + // onSaved: (value){ + // _serviceReport.operatingHours = value; + // }, + // ), + // ], + // ), + // ), + // const SizedBox(width: 8,), + // Expanded( + // child: Column( + // crossAxisAlignment: CrossAxisAlignment.start, + // children: [ + // ASubTitle(_subtitle.jobSheetNumber), + // const SizedBox(height: 4,), + // ATextFormField( + // initialValue: _serviceReport?.jobSheetNumber, + // textAlign: TextAlign.center, + // style: Theme.of(context).textTheme.subtitle1, + // textInputType: TextInputType.name, + // onSaved: (value){ + // _serviceReport.jobSheetNumber = value; + // }, + // ), + // ], // ), - // ], - // ), + // ), + // ], // ), + //const SizedBox(height: 8,), + + const SizedBox(height: 8), + ASubTitle(_subtitle.comment), + const SizedBox(height: 4), + ATextFormField( + initialValue: _serviceReport?.comment, + hintText: "Technical Comment", + textAlign: TextAlign.center, + style: Theme.of(context).textTheme.titleMedium, + textInputType: TextInputType.multiline, + onSaved: (value) { + _serviceReport.comment = value; + }, + ), + const SizedBox(height: 8), + const ASubTitle("Nurse Signature"), + ESignature( + oldSignature: _serviceReport.signatureNurse, + newSignature: _serviceReport.localNurseSignature, + onSaved: (signature) { + if (signature == null || signature.isEmpty) { + return; + } + _serviceReport.localNurseSignature = signature; + _serviceReport.signatureNurse = "${DateTime.now().toIso8601String()}.png|${base64Encode(signature)}"; + }, + ), + const SizedBox( + height: 8, + ), + const ASubTitle("Engineer Signature"), + ESignature( + oldSignature: _serviceReport.signatureEngineer, + newSignature: _serviceReport.localNurseSignature, + onSaved: (signature) { + if (signature == null || signature.isEmpty) { + return; + } + _serviceReport.localNurseSignature = signature; + _serviceReport.signatureEngineer = "${DateTime.now().toIso8601String()}.png|${base64Encode(signature)}"; + }, + ), + const SizedBox( + height: 8, + ), + // Part Number and Quantity ], ), - const SizedBox( - height: 8, - ), - // Operating Hours and Job Sheet Number - // Row( - // children: [ - // Expanded( - // child: Column( - // crossAxisAlignment: CrossAxisAlignment.start, - // children: [ - // ASubTitle(_subtitle.operatingHours), - // const SizedBox(height: 4,), - // ATextFormField( - // initialValue: _serviceReport?.operatingHours, - // textAlign: TextAlign.center, - // hintText: "i.e 3, 3.5, 4", - // style: Theme.of(context).textTheme.subtitle1, - // validator: (value) => - // Validator.isNumeric(value) - // ? null : _subtitle.requiredWord, - // textInputType: TextInputType.number, - // onSaved: (value){ - // _serviceReport.operatingHours = value; - // }, - // ), - // ], - // ), - // ), - // const SizedBox(width: 8,), - // Expanded( - // child: Column( - // crossAxisAlignment: CrossAxisAlignment.start, - // children: [ - // ASubTitle(_subtitle.jobSheetNumber), - // const SizedBox(height: 4,), - // ATextFormField( - // initialValue: _serviceReport?.jobSheetNumber, - // textAlign: TextAlign.center, - // style: Theme.of(context).textTheme.subtitle1, - // textInputType: TextInputType.name, - // onSaved: (value){ - // _serviceReport.jobSheetNumber = value; - // }, - // ), - // ], - // ), - // ), - // ], - // ), - //const SizedBox(height: 8,), - const SizedBox( - height: 8, - ), - const ASubTitle("Nurse Signature"), - ESignature( - oldSignature: _serviceReport.signatureNurse, - newSignature: _serviceReport.localNurseSignature, - onChange: (signature) { - if (signature == null || signature.isEmpty) { - return; - } - _serviceReport.localNurseSignature = signature; - _serviceReport.signatureNurse = "${DateTime.now().toIso8601String()}.png|${base64Encode(signature)}"; - }, - ), - const SizedBox( - height: 8, - ), - const ASubTitle("Engineer Signature"), - ESignature( - oldSignature: _serviceReport.signatureEngineer, - newSignature: _serviceReport.localNurseSignature, - onChange: (signature) { - if (signature == null || signature.isEmpty) { - return; - } - _serviceReport.localNurseSignature = signature; - _serviceReport.signatureEngineer = "${DateTime.now().toIso8601String()}.png|${base64Encode(signature)}"; - }, - ), - const SizedBox( - height: 8, - ), - // Part Number and Quantity + ), + ], + ), + ASubTitle("Spare Parts"), + Container( + width: double.infinity, + padding: const EdgeInsets.all(16), + margin: const EdgeInsets.symmetric(vertical: 16), + decoration: BoxDecoration(color: AColors.grey, borderRadius: BorderRadius.circular(AppStyle.getBorderRadius(context)), boxShadow: [ + BoxShadow( + color: AColors.grey, + offset: Offset(0, -1), + ) + ]), + child: Column( + mainAxisSize: MainAxisSize.min, + children: [ Row( children: [ Expanded( @@ -713,53 +1049,49 @@ class _EditServiceReportState extends State with TickerProvid ); }), ), - const SizedBox( height: 16, ), ], ), ), - Padding( - padding: const EdgeInsets.all(16.0), - child: AButton( - text: _subtitle.update, - onPressed: () async { - _validate = true; - if (!_formKey.currentState.validate()) { - setState(() {}); - return; - } - if (!_serviceReport.validate()) { - setState(() {}); - return; - } - _formKey.currentState.save(); + AButton( + text: _subtitle.update, + onPressed: () async { + _validate = true; + print("jere1245"); + // if (!_formKey.currentState.validate()) { + // setState(() {}); + // return; + // } + // print("jere124"); + // if (!_serviceReport.validate()) { + // setState(() {}); + // return; + // } + // print("jere14"); + _formKey.currentState.save(); - _isLoading = true; - setState(() {}); + _isLoading = true; + setState(() {}); - int status = await _serviceRequestsProvider.updateServiceReport(user: _userProvider.user, host: _settingProvider.host, report: _serviceReport, request: widget.request); - _isLoading = false; - setState(() {}); - if (status >= 200 && status < 300) { - Fluttertoast.showToast( - msg: _subtitle.requestCompleteSuccessfully, - ); - Navigator.of(context).pop(); - Navigator.of(context).pop(); - } else { - String errorMessage = HttpStatusManger.getStatusMessage(status: status, subtitle: _subtitle); - ScaffoldMessenger.of(context).showSnackBar(SnackBar( - content: Text(errorMessage), - )); - } - }, - ), + int status = await _serviceRequestsProvider.updateServiceReport(user: _userProvider.user, host: _settingProvider.host, report: _serviceReport, request: widget.request); + _isLoading = false; + setState(() {}); + if (status >= 200 && status < 300) { + Fluttertoast.showToast( + msg: _subtitle.requestCompleteSuccessfully, + ); + Navigator.of(context).pop(); + Navigator.of(context).pop(); + } else { + String errorMessage = HttpStatusManger.getStatusMessage(status: status, subtitle: _subtitle); + ScaffoldMessenger.of(context).showSnackBar(SnackBar( + content: Text(errorMessage), + )); + } + }, ), - const SizedBox( - height: 300, - ) ], ), const ABackButton(), diff --git a/lib/views/pages/user/requests/report/future_service_report.dart b/lib/views/pages/user/requests/report/future_service_report.dart index 466ab8f2..c391b669 100644 --- a/lib/views/pages/user/requests/report/future_service_report.dart +++ b/lib/views/pages/user/requests/report/future_service_report.dart @@ -31,6 +31,8 @@ class _FutureServiceReportState extends State { _userProvider = Provider.of(context); _settingProvider = Provider.of(context); Subtitle _subtitle = AppLocalization.of(context).subtitle; + ServiceRequestsProvider().getSingleServiceReport(reportId: widget.workOrder.id, user: _userProvider.user, host: _settingProvider.host, subtitle: _subtitle) + ; return Scaffold( body: FutureBuilder( future: ServiceRequestsProvider().getSingleServiceReport(reportId: widget.workOrder.id, user: _userProvider.user, host: _settingProvider.host, subtitle: _subtitle), diff --git a/lib/views/pages/user/requests/request_details.dart b/lib/views/pages/user/requests/request_details.dart index de9cc066..03ef6573 100644 --- a/lib/views/pages/user/requests/request_details.dart +++ b/lib/views/pages/user/requests/request_details.dart @@ -345,7 +345,7 @@ class RequestDetailsPage extends StatelessWidget { title: _subtitle.visitDate, info: workOrders[index].visitDate, ), - RequestInfoRow(title: _subtitle.assignedEmployee, info: workOrders[index].assignedEmployee.name), + RequestInfoRow(title: _subtitle.assignedEmployee, info: workOrders[index].assignedEmployee?.name??""), RequestInfoRow( title: _subtitle.assetSN, info: workOrders[index].callRequest.asset.assetSerialNo, diff --git a/lib/views/widgets/status/report/fault_desc_menu.dart b/lib/views/widgets/status/report/fault_desc_menu.dart index 9250c7dd..5229aff5 100644 --- a/lib/views/widgets/status/report/fault_desc_menu.dart +++ b/lib/views/widgets/status/report/fault_desc_menu.dart @@ -26,7 +26,7 @@ class _SingleStatusMenuState extends State { void didUpdateWidget(covariant FaultDescriptionMenu oldWidget) { if (widget.initialStatus != null) { final result = widget.statuses?.where((element) { - return element == widget.initialStatus; + return element.id == widget.initialStatus.id; }); if (result.isNotEmpty) { _selectedStatus = result.first; @@ -44,9 +44,11 @@ class _SingleStatusMenuState extends State { @override void initState() { + if (widget.initialStatus != null) { final result = widget.statuses?.where((element) { - return element == widget.initialStatus; + + return element.id == widget.initialStatus.id; }); if (result.isNotEmpty) _selectedStatus = result.first; if (widget.initialStatus.id != _selectedStatus?.id) { diff --git a/lib/views/widgets/status/report/service_report_equipment_status.dart b/lib/views/widgets/status/report/service_report_equipment_status.dart index 1af9ac9c..95182977 100644 --- a/lib/views/widgets/status/report/service_report_equipment_status.dart +++ b/lib/views/widgets/status/report/service_report_equipment_status.dart @@ -63,7 +63,7 @@ class _ServiceReportEquipmentStatusMenuState extends State(context); + print("report?.callLastSituation:${report?.callLastSituation?.toMap()}"); return LoadingManager( isLoading: _menuProvider.isLoading, isFailedLoading: _menuProvider.calls == null, From da911ea7aee588480d35285892a0fccd634603a0 Mon Sep 17 00:00:00 2001 From: Sikander Saleem Date: Wed, 5 Jul 2023 09:40:33 +0300 Subject: [PATCH 106/181] fixes --- lib/controllers/providers/api/service_requests_provider.dart | 4 ++++ lib/models/service_request/service_request.dart | 3 +++ lib/views/pages/device_transfer/update_device_transfer.dart | 2 ++ 3 files changed, 9 insertions(+) diff --git a/lib/controllers/providers/api/service_requests_provider.dart b/lib/controllers/providers/api/service_requests_provider.dart index b621caed..2eb13ff6 100644 --- a/lib/controllers/providers/api/service_requests_provider.dart +++ b/lib/controllers/providers/api/service_requests_provider.dart @@ -235,6 +235,10 @@ class ServiceRequestsProvider extends ChangeNotifier { "voiceNote": request.audio, "assets": request.deviceId == null ? [] : [request.deviceId], "attachmentsCallRequest": request.devicePhotos?.map((e) => {"name": e})?.toList(), + "assignedEmployee": { + "id": request.engineerId, + "name": request.engineerName, + }, "callSiteContactPerson": [ { "id": callSiteContactPerson['id'] ?? 0, diff --git a/lib/models/service_request/service_request.dart b/lib/models/service_request/service_request.dart index a884da62..58fc2808 100644 --- a/lib/models/service_request/service_request.dart +++ b/lib/models/service_request/service_request.dart @@ -15,6 +15,7 @@ class ServiceRequest { int hospitalId; String departmentName; String engineerName; + String engineerId; String date; String audio; int statusValue; @@ -57,6 +58,7 @@ class ServiceRequest { this.deviceId, this.audio, this.engineerName, + this.engineerId, this.viewReport = false, this.deviceModel, this.engineerMobile, @@ -102,6 +104,7 @@ class ServiceRequest { statusValue: parsedJson["status"] == null ? null : parsedJson["status"]["value"], departmentName: parsedJson["asset"]["department"] != null ? parsedJson["asset"]["department"]["name"] : "", engineerName: parsedJson["assignedEmployee"] == null ? null : parsedJson["assignedEmployee"]["name"], + engineerId: parsedJson["assignedEmployee"] == null ? null : parsedJson["assignedEmployee"]["id"], hospitalId: parsedJson["asset"]["site"]["id"], reportID: parsedJson["workOrder"] != null ? parsedJson["workOrder"]["workOrderId"] : null, viewReport: parsedJson["workOrder"] != null, diff --git a/lib/views/pages/device_transfer/update_device_transfer.dart b/lib/views/pages/device_transfer/update_device_transfer.dart index 9b2c8033..5e8101f1 100644 --- a/lib/views/pages/device_transfer/update_device_transfer.dart +++ b/lib/views/pages/device_transfer/update_device_transfer.dart @@ -249,6 +249,8 @@ class _UpdateDeviceTransferState extends State { GasStatusMenu( initialValue: _formModel.status, onSelect: (status) { + if(status==null) + return; _formModel.status = status; setState(() {}); }, From 74dc2be238ce1b35aebdf43c1af51f8de36faf86 Mon Sep 17 00:00:00 2001 From: Sikander Saleem Date: Wed, 5 Jul 2023 09:52:05 +0300 Subject: [PATCH 107/181] add sub workorder fix --- lib/models/service_request/search_work_order.dart | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/lib/models/service_request/search_work_order.dart b/lib/models/service_request/search_work_order.dart index 39eca14a..a7d360c0 100644 --- a/lib/models/service_request/search_work_order.dart +++ b/lib/models/service_request/search_work_order.dart @@ -280,8 +280,9 @@ class SearchWorkOrder { map['workingHours'] = workingHours; map['travelingHours'] = travelingHours; map['travelingExpenses'] = travelingExpenses; - if (faultDescription != null) { - map['faultDescription'] = faultDescription.toJson(); + + if (faultDescription?.id != null ) { + map['faultDescription'] = faultDescription.toJson(); } if (sparePartsWorkOrders != null) { map['sparePartsWorkOrders'] = sparePartsWorkOrders.map((v) => v.toJson()).toList(); From 147351bd1076c64480d6e8ee4a850acc6c672321 Mon Sep 17 00:00:00 2001 From: Sikander Saleem Date: Wed, 5 Jul 2023 09:59:25 +0300 Subject: [PATCH 108/181] add sub workorder fix --- lib/controllers/providers/api/service_requests_provider.dart | 1 + 1 file changed, 1 insertion(+) diff --git a/lib/controllers/providers/api/service_requests_provider.dart b/lib/controllers/providers/api/service_requests_provider.dart index 2eb13ff6..e0dec352 100644 --- a/lib/controllers/providers/api/service_requests_provider.dart +++ b/lib/controllers/providers/api/service_requests_provider.dart @@ -624,6 +624,7 @@ class ServiceRequestsProvider extends ChangeNotifier { "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.toMap(), if (search.assignedEmployee != null) From 45b66e6b2a61f4260be6a5eacc3637c6558af479 Mon Sep 17 00:00:00 2001 From: zaid_daoud Date: Thu, 6 Jul 2023 11:38:49 +0300 Subject: [PATCH 109/181] Convert (Start Date & End Date) to Timer --- .../api/device_transfer_provider.dart | 22 ++- .../api/service_requests_provider.dart | 41 +++--- .../call_request_for_work_order_model.dart | 2 +- lib/models/device/device_transfer.dart | 36 +++-- lib/models/device/device_transfer_info.dart | 37 +++-- lib/models/pantry/pentry.dart | 7 +- lib/models/service_report.dart | 92 ++++++------ .../service_request/search_work_order.dart | 48 ++++--- lib/models/timer_model.dart | 3 +- .../update_device_transfer.dart | 106 +++----------- .../create_sub_workorder_page.dart | 12 +- .../spare_parts_details_bottom_sheet.dart | 2 - .../work_order_details_bottom_sheet.dart | 83 +++-------- .../user/gas_refill/request_gas_refill.dart | 134 +++++++++--------- .../report/create_service_report.dart | 83 +++-------- .../requests/report/edit_service_report.dart | 87 +++--------- lib/views/widgets/parts/part_item.dart | 12 +- lib/views/widgets/timer/app_timer.dart | 12 +- 18 files changed, 333 insertions(+), 486 deletions(-) diff --git a/lib/controllers/providers/api/device_transfer_provider.dart b/lib/controllers/providers/api/device_transfer_provider.dart index a534fbc0..43c5eced 100644 --- a/lib/controllers/providers/api/device_transfer_provider.dart +++ b/lib/controllers/providers/api/device_transfer_provider.dart @@ -23,7 +23,7 @@ class DeviceTransferProvider extends ChangeNotifier { building = null; floor = null; department = null; - room=""; + room = ""; startDate = null; endDate = null; } @@ -44,7 +44,6 @@ class DeviceTransferProvider extends ChangeNotifier { // failed _loading = false bool isLoading; - Hospital hospital; Buildings building; Floors floor; @@ -115,7 +114,7 @@ class DeviceTransferProvider extends ChangeNotifier { // "transferCode": "string", "destBuildingId": building?.id, "destFloorId": floor.id, - "destRoom": room, + "destRoom": room, // "senderBuildingId": 0, // "senderFloorId": 0, // "senderDepartmentId": 0, @@ -179,8 +178,8 @@ class DeviceTransferProvider extends ChangeNotifier { "senderMachineStatusId": newModel.status.id, "senderComment": newModel.comment, "senderWorkingHours": newModel.workingHours, - "senderStartDate": newModel.startDate?.toIso8601String(), - "senderEndDate": newModel.endDate?.toIso8601String(), + "senderStartDate": newModel.timer?.startAt?.toIso8601String(), + "senderEndDate": newModel.timer?.endAt?.toIso8601String(), "senderTravelingHours": newModel.travelingHours, "senderAttachmentName": "${newModel.signature}.png", "destSiteId": oldModel.receiver.client.id, @@ -189,8 +188,8 @@ class DeviceTransferProvider extends ChangeNotifier { "receiverMachineStatusId": oldModel.receiver.status.id ?? "", "receiverComment": oldModel.receiver.comment, "receiverWorkingHours": oldModel.receiver.workingHours, - "receiverStartDate": oldModel.receiver.startDate?.toIso8601String(), - "receiverEndDate": oldModel.receiver.endDate?.toIso8601String(), + "receiverStartDate": oldModel.receiver.timer?.startAt?.toIso8601String(), + "receiverEndDate": oldModel.receiver.timer?.endAt?.toIso8601String(), "receiverTravelingHours": oldModel.receiver.travelingHours, "receiverAttachmentName": "${oldModel.receiver.signature}.png", }); @@ -202,8 +201,8 @@ class DeviceTransferProvider extends ChangeNotifier { "senderMachineStatusId": oldModel.sender.status.id, "senderComment": oldModel.sender.comment, "senderWorkingHours": oldModel.sender.workingHours, - "senderStartDate": oldModel.sender.startDate?.toIso8601String(), - "senderEndDate": oldModel.sender.endDate?.toIso8601String(), + "senderStartDate": oldModel.sender.timer?.startAt?.toIso8601String(), + "senderEndDate": oldModel.sender.timer?.endAt?.toIso8601String(), "senderTravelingHours": oldModel.sender.travelingHours, "senderAttachmentName": "${oldModel.sender.signature}.png", "destSiteId": newModel.client.id, @@ -212,8 +211,8 @@ class DeviceTransferProvider extends ChangeNotifier { "receiverMachineStatusId": newModel.status?.id ?? "", "receiverComment": newModel.comment, "receiverWorkingHours": newModel.workingHours, - "receiverStartDate": newModel.startDate?.toIso8601String(), - "receiverEndDate": newModel.endDate?.toIso8601String(), + "receiverStartDate": newModel.timer?.startAt?.toIso8601String(), + "receiverEndDate": newModel.timer?.endAt?.toIso8601String(), "receiverTravelingHours": newModel.travelingHours, "receiverAttachmentName": "${newModel.signature}.png", }); @@ -247,5 +246,4 @@ class DeviceTransferProvider extends ChangeNotifier { return -1; } } - } diff --git a/lib/controllers/providers/api/service_requests_provider.dart b/lib/controllers/providers/api/service_requests_provider.dart index e0dec352..edf5a749 100644 --- a/lib/controllers/providers/api/service_requests_provider.dart +++ b/lib/controllers/providers/api/service_requests_provider.dart @@ -1,4 +1,5 @@ import 'dart:convert'; +import 'dart:developer'; import 'package:flutter/cupertino.dart'; import 'package:http/http.dart'; @@ -237,7 +238,7 @@ class ServiceRequestsProvider extends ChangeNotifier { "attachmentsCallRequest": request.devicePhotos?.map((e) => {"name": e})?.toList(), "assignedEmployee": { "id": request.engineerId, - "name": request.engineerName, + "name": request.engineerName, }, "callSiteContactPerson": [ { @@ -320,9 +321,9 @@ class ServiceRequestsProvider extends ChangeNotifier { "currentSituation": null, "repairLocation": report.repairLocation?.toMap(), "reason": report.reason?.toMap(), - "startofWorkTime": report.startDate?.toIso8601String() ?? "", - "endofWorkTime": report.endDate?.toIso8601String() ?? "", - "workingHours": ((report?.endDate?.difference(report?.startDate)?.inMinutes ?? 0) / 60), + "startofWorkTime": report.timer?.startAt?.toIso8601String() ?? "", + "endofWorkTime": report.timer?.endAt?.toIso8601String() ?? "", + "workingHours": report?.workingHours, "travelingHours": report.travelingHours, "travelingExpenses": report.travelingExpense ?? 0, if (report.faultDescription != null) "faultDescription": report.faultDescription.toJson(), @@ -399,12 +400,14 @@ class ServiceRequestsProvider extends ChangeNotifier { if (response.statusCode >= 200 && response.statusCode < 300) { // client's request was successfully received Map listJson = json.decode(response.body)["data"]; + log(listJson?.toString()); callRequestForWorkOrder = CallRequestForWorkOrder.fromJson(listJson); } notifyListeners(); return callRequestForWorkOrder; } catch (error) { + print(error); return null; } } @@ -479,22 +482,22 @@ class ServiceRequestsProvider extends ChangeNotifier { // body["job_id"] = request.id; // body["report_id"] = request.reportID; // try { - Map body = report.toMap(request); - // body["uid"] = user.id; - // body["token"] = user.token; - response = await ApiManager.instance.put(URLs.updateServiceReport, body: body); - // response = await post( - // Uri.parse( - // host+URLs.updateServiceReport), - // body: body, - // ); - // stateCode = response.statusCode; + Map body = report.toMap(request); + // body["uid"] = user.id; + // body["token"] = user.token; + response = await ApiManager.instance.put(URLs.updateServiceReport, body: body); + // response = await post( + // Uri.parse( + // host+URLs.updateServiceReport), + // body: body, + // ); + // stateCode = response.statusCode; - if (response.statusCode >= 200 && response.statusCode < 300) { - reset(); - notifyListeners(); - } - return response.statusCode; + if (response.statusCode >= 200 && response.statusCode < 300) { + reset(); + notifyListeners(); + } + return response.statusCode; // } catch (error) { // print(error); // return -1; diff --git a/lib/models/call_request_for_work_order_model.dart b/lib/models/call_request_for_work_order_model.dart index 14572afa..188edce4 100644 --- a/lib/models/call_request_for_work_order_model.dart +++ b/lib/models/call_request_for_work_order_model.dart @@ -82,7 +82,7 @@ class Asset { Department department; String room; String testsDay; - String purchasingPrice; + num purchasingPrice; String nbv; String currency; String poNo; diff --git a/lib/models/device/device_transfer.dart b/lib/models/device/device_transfer.dart index a8202f42..c585a8c0 100644 --- a/lib/models/device/device_transfer.dart +++ b/lib/models/device/device_transfer.dart @@ -5,6 +5,8 @@ import 'package:test_sa/models/device/device_transfer_info.dart'; import 'package:test_sa/models/hospital.dart'; import 'package:test_sa/models/lookup.dart'; +import '../timer_model.dart'; + class DeviceTransfer { int id; String userId; @@ -46,21 +48,26 @@ class DeviceTransfer { title: parsedJson["transferCode"], userId: parsedJson["uid"], device: Device( - id: parsedJson["assetId"], - number: parsedJson["assetNumber"], - serialNumber: parsedJson["assetSerialNo"], - destBuildingName: parsedJson["destBuildingName"], - destDepartmentName: parsedJson["destDepartmentName"], - destFloor: parsedJson["destFloor"], - destRoom: parsedJson["destRoom"], - destSiteName: parsedJson["destSiteName"] - ), + id: parsedJson["assetId"], + number: parsedJson["assetNumber"], + serialNumber: parsedJson["assetSerialNo"], + destBuildingName: parsedJson["destBuildingName"], + destDepartmentName: parsedJson["destDepartmentName"], + destFloor: parsedJson["destFloor"], + destRoom: parsedJson["destRoom"], + destSiteName: parsedJson["destSiteName"]), sender: DeviceTransferInfo( travelingHours: parsedJson["senderTravelingHours"], comment: parsedJson["senderComment"], workingHours: parsedJson["senderWorkingHours"], - startDate: parsedJson["senderStartDate"]==null ? null:DateTime.parse(parsedJson["senderStartDate"]), - endDate: parsedJson["senderEndDate"]==null ? null:DateTime.parse(parsedJson["senderEndDate"]), + timer: TimerModel( + startAt: DateTime.tryParse(parsedJson["senderStartDate"] ?? ""), + endAt: DateTime.tryParse(parsedJson["senderEndDate"] ?? ""), + durationInSecond: ((parsedJson["workingHours"] ?? 0) * 60 * 60).toInt(), + stopped: parsedJson["workingHours"] == null ? null : true, + ), + // startDate: parsedJson["senderStartDate"] == null ? null : DateTime.parse(parsedJson["senderStartDate"]), + // endDate: parsedJson["senderEndDate"] == null ? null : DateTime.parse(parsedJson["senderEndDate"]), userId: parsedJson["senderAssignedEmployeeId"], userName: parsedJson["senderAssignedEmployeeName"], assignedEmployeeName: parsedJson["senderAssignedEmployeeName"], @@ -80,8 +87,11 @@ class DeviceTransfer { travelingHours: parsedJson["receiverTravelingHours"], comment: parsedJson["receiverComment"], workingHours: parsedJson["receiverWorkingHours"], - startDate: parsedJson["receiverStartDate"]==null ? null:DateTime.parse(parsedJson["receiverStartDate"]), - endDate: parsedJson["receiverEndDate"]==null ? null:DateTime.parse(parsedJson["receiverEndDate"]), + timer: parsedJson["receiverStartDate"] != null || parsedJson["receiverEndDate"] != null + ? TimerModel(startAt: DateTime.tryParse(parsedJson["receiverStartDate"] ?? ""), endAt: DateTime.tryParse(parsedJson["receiverEndDate"] ?? "")) + : null, + // startDate: parsedJson["receiverStartDate"] == null ? null : DateTime.parse(parsedJson["receiverStartDate"]), + // endDate: parsedJson["receiverEndDate"] == null ? null : DateTime.parse(parsedJson["receiverEndDate"]), userId: parsedJson["receiverAssignedEmployeeId"], userName: parsedJson["receiverAssignedEmployeeName"], assignedEmployeeName: parsedJson["receiverAssignedEmployeeName"], diff --git a/lib/models/device/device_transfer_info.dart b/lib/models/device/device_transfer_info.dart index 41d0843a..00e1d387 100644 --- a/lib/models/device/device_transfer_info.dart +++ b/lib/models/device/device_transfer_info.dart @@ -2,19 +2,22 @@ import 'package:test_sa/models/department.dart'; import 'package:test_sa/models/hospital.dart'; import 'package:test_sa/models/lookup.dart'; +import '../timer_model.dart'; + class DeviceTransferInfo { String userId; String comment; Hospital client; Department department; String workingHours; - DateTime startDate; - DateTime endDate; + // DateTime startDate; + // DateTime endDate; String travelingHours; String userName; String signature; String assignedEmployeeName; Lookup status; + TimerModel timer; DeviceTransferInfo({ this.userId, @@ -23,12 +26,13 @@ class DeviceTransferInfo { this.client, this.userName, this.travelingHours, - this.startDate, - this.endDate, + // this.startDate, + // this.endDate, this.workingHours, this.signature, this.status, - this.assignedEmployeeName + this.assignedEmployeeName, + this.timer, }); Map toJson(bool isSender) { @@ -37,8 +41,10 @@ class DeviceTransferInfo { if (comment != null && comment.isNotEmpty) body["${baseKey}comment"] = comment; if (workingHours != null && workingHours.isNotEmpty) body["${baseKey}working_hours"] = workingHours; - if (startDate != null) body["${baseKey}start_date"] = startDate?.toIso8601String(); - if (endDate != null) body["${baseKey}end_date"] = endDate?.toIso8601String(); + // if (startDate != null) body["${baseKey}start_date"] = startDate?.toIso8601String(); + // if (endDate != null) body["${baseKey}end_date"] = endDate?.toIso8601String(); + if (timer?.startAt != null) body["${baseKey}start_date"] = timer?.startAt?.toIso8601String(); + if (timer?.endAt != null) body["${baseKey}end_date"] = timer?.endAt?.toIso8601String(); if (travelingHours != null && travelingHours.isNotEmpty) body["${baseKey}travel_hours"] = travelingHours; if (status != null) body["${baseKey}status"] = status.id.toString(); if (signature != null && signature.isNotEmpty) body["${baseKey}image"] = signature; @@ -57,8 +63,9 @@ class DeviceTransferInfo { client = Hospital.fromHospital(old.client); department = Department.fromDepartment(old.department); workingHours = old.workingHours; - startDate = old.startDate; - endDate = old.endDate; + // startDate = old.startDate; + // endDate = old.endDate; + timer = old.timer; travelingHours = old.travelingHours; comment = old.comment; if (withSignature) signature = old.signature; @@ -68,14 +75,20 @@ class DeviceTransferInfo { factory DeviceTransferInfo.fromJson(Map parsedJson, String key) { return DeviceTransferInfo( workingHours: parsedJson["${key}working_hours"], - startDate: parsedJson["${key}start_date"], - endDate: parsedJson["${key}end_date"], + // startDate: parsedJson["${key}start_date"], + // endDate: parsedJson["${key}end_date"], + timer: TimerModel( + startAt: DateTime.tryParse(parsedJson["${key}start_date"] ?? ""), + endAt: DateTime.tryParse(parsedJson["${key}end_date"] ?? ""), + durationInSecond: ((parsedJson["${key}working_hours"] ?? 0) * 60 * 60).toInt(), + stopped: parsedJson["${key}working_hours"] == null || (parsedJson["${key}working_hours"] as String).isEmpty ? null : true, + ), travelingHours: parsedJson["${key}travel_hours"], userName: parsedJson["${key}name"], signature: parsedJson["${key}image"], userId: parsedJson["${key}id"], comment: parsedJson["${key}comment"], - assignedEmployeeName:parsedJson["${key}AssignedEmployeeName"], + assignedEmployeeName: parsedJson["${key}AssignedEmployeeName"], client: Hospital(id: parsedJson["${key}SiteId"], name: parsedJson["${key}SiteName"]), department: Department( id: parsedJson["${key}DepartmentId"], diff --git a/lib/models/pantry/pentry.dart b/lib/models/pantry/pentry.dart index 82ef9fd6..45bd477b 100644 --- a/lib/models/pantry/pentry.dart +++ b/lib/models/pantry/pentry.dart @@ -117,7 +117,12 @@ class Pentry { actualVisitDate: DateTime.tryParse(map["actualDate"] ?? ""), expectedVisitDate: DateTime.tryParse(map["expectedDate"] ?? ""), travelingHours: map["travelingHours"], - timer: TimerModel(startAt: DateTime.tryParse(map["startDate"] ?? ""), endAt: DateTime.tryParse(map["endDate"] ?? ""), durationInSecond: (int.tryParse(map["workingHours"] ?? "") ?? 0) * 60 * 60), + timer: TimerModel( + startAt: DateTime.tryParse(map["startDate"] ?? ""), + endAt: DateTime.tryParse(map["endDate"] ?? ""), + durationInSecond: (int.tryParse(map["workingHours"] ?? "") ?? 0) * 60 * 60, + stopped: map["workingHours"] == null ? null : true, + ), // contacts: contacts, ppmCheckLists: ppmCheckLists, calibrationTools: calibrationTools, diff --git a/lib/models/service_report.dart b/lib/models/service_report.dart index 03092c3c..5b4ceca7 100644 --- a/lib/models/service_report.dart +++ b/lib/models/service_report.dart @@ -13,8 +13,8 @@ class ServiceReport { int id; double operatingHours; DateTime visitDate; - DateTime endDate; - DateTime startDate; + // DateTime endDate; + // DateTime startDate; Lookup assetType; Lookup callLastSituation; Lookup currentSituation; @@ -45,40 +45,41 @@ class ServiceReport { String reviewComment; FaultDescription faultDescription; - ServiceReport( - {this.id, - this.visitDate, - this.endDate, - this.assetType, - this.equipmentStatus, - this.type, - this.faultDescriptionId, - this.workingHours, - this.travelingHours, - this.parts, - this.engineer, - this.workPreformed, - this.reason, - this.operatingHours, - this.callLastSituation, - this.currentSituation, - this.jobSheetNumber, - this.image, - this.device, - this.invoiceCode, - this.invoiceNumber, - this.quantity = "1", - this.timer, - this.signatureNurse, - this.signatureEngineer, - this.localNurseSignature, - this.localEngineerSignature, - this.comment, - this.repairLocation, - this.travelingExpense, - this.startDate, - this.reviewComment, - this.faultDescription}); + ServiceReport({ + this.id, + this.visitDate, + // this.endDate, + this.assetType, + this.equipmentStatus, + this.type, + this.faultDescriptionId, + this.workingHours, + this.travelingHours, + this.parts, + this.engineer, + this.workPreformed, + this.reason, + this.operatingHours, + this.callLastSituation, + this.currentSituation, + this.jobSheetNumber, + this.image, + this.device, + this.invoiceCode, + this.invoiceNumber, + this.quantity = "1", + this.timer, + this.signatureNurse, + this.signatureEngineer, + this.localNurseSignature, + this.localEngineerSignature, + this.comment, + this.repairLocation, + this.travelingExpense, + // this.startDate, + this.reviewComment, + this.faultDescription, + }); Map toMap(ServiceRequest request) { Map _map = {}; @@ -139,9 +140,12 @@ class ServiceReport { _map["engSignature"] = signatureEngineer; _map["comment"] = comment; _map["travelingExpenses"] = travelingExpense; - _map["startofWorkTime"] = startDate.toIso8601String(); - _map["endofWorkTime"] = endDate.toIso8601String(); - _map["workingHours"] = endDate?.difference(startDate)?.inHours ?? 0; + // _map["startofWorkTime"] = startDate.toIso8601String(); + // _map["endofWorkTime"] = endDate.toIso8601String(); + // _map["workingHours"] = endDate?.difference(startDate)?.inHours ?? 0; + if (timer?.startAt != null) _map["startofWorkTime"] = timer?.startAt?.toIso8601String(); + if (timer?.endAt != null) _map["endofWorkTime"] = timer?.endAt?.toIso8601String(); + _map["workingHours"] = workingHours; _map["reviewComment"] = reviewComment; return _map; } @@ -192,8 +196,8 @@ class ServiceReport { faultDescription: parsedJson['faultDescription'] != null ? FaultDescription.fromJson(parsedJson['faultDescription']) : null, // faultDescription: parsedJson["faultDescription"], - startDate: DateTime.tryParse(parsedJson["startofWorkTime"]?? ""), - endDate: DateTime.tryParse(parsedJson["endofWorkTime"]??""), + // startDate: DateTime.tryParse(parsedJson["startofWorkTime"] ?? ""), + // endDate: DateTime.tryParse(parsedJson["endofWorkTime"] ?? ""), //invoiceCode: parsedJson["invoice_code"], //invoiceNumber: parsedJson["invoice_no"], //jobSheetNumber: parsedJson["job_sheet_no"], @@ -206,7 +210,11 @@ class ServiceReport { visitDate: DateTime.tryParse(parsedJson["visitDate"]), workingHours: parsedJson["workingHours"], timer: TimerModel( - startAt: DateTime.tryParse(parsedJson["startofWorkTime"]??""), endAt: DateTime.tryParse(parsedJson["endofWorkTime"]??""), durationInSecond: ((parsedJson["workingHours"] ?? 0) * 60 * 60).toInt()), + startAt: DateTime.tryParse(parsedJson["startofWorkTime"] ?? ""), + endAt: DateTime.tryParse(parsedJson["endofWorkTime"] ?? ""), + durationInSecond: ((parsedJson["workingHours"] ?? 0) * 60 * 60).toInt(), + stopped: parsedJson["workingHours"] == null ? null : true, + ), //workPreformed: parsedJson["work_performed"], device: Device.fromJson(parsedJson["callRequest"]["asset"]), signatureNurse: URLs.getFileUrl(parsedJson["nurseSignature"]), diff --git a/lib/models/service_request/search_work_order.dart b/lib/models/service_request/search_work_order.dart index a7d360c0..898fa0e9 100644 --- a/lib/models/service_request/search_work_order.dart +++ b/lib/models/service_request/search_work_order.dart @@ -1,4 +1,5 @@ import 'package:test_sa/models/lookup.dart'; +import 'package:test_sa/models/timer_model.dart'; import '../fault_description.dart'; @@ -21,8 +22,8 @@ class SearchWorkOrder { this.currentSituation, this.repairLocation, this.reason, - this.startofWorkTime, - this.endofWorkTime, + // this.startofWorkTime, + // this.endofWorkTime, this.workingHours, this.travelingHours, this.travelingExpenses, @@ -36,6 +37,7 @@ class SearchWorkOrder { this.engSignature, this.nurseSignature, this.woParentDto, + this.timer, }); SearchWorkOrder.fromJson(dynamic json) { @@ -66,8 +68,13 @@ class SearchWorkOrder { currentSituation = json['currentSituation'] != null ? Lookup.fromJson(json['currentSituation']) : null; repairLocation = json['repairLocation'] != null ? Lookup.fromJson(json['repairLocation']) : null; reason = json['reason'] != null ? Lookup.fromJson(json['reason']) : null; - startofWorkTime = json['startofWorkTime']; - endofWorkTime = json['endofWorkTime']; + // startofWorkTime = json['startofWorkTime']; + // endofWorkTime = json['endofWorkTime']; + if (json['startofWorkTime'] != null || json['endofWorkTime'] != null) { + timer = TimerModel(); + } + if (json['startofWorkTime'] != null) timer.startAt = DateTime.tryParse(json['startofWorkTime']); + if (json['endofWorkTime'] != null) timer.endAt = DateTime.tryParse(json['endofWorkTime']); workingHours = json['workingHours']; travelingHours = json['travelingHours']; travelingExpenses = json['travelingExpenses']; @@ -121,8 +128,9 @@ class SearchWorkOrder { if (wo.currentSituation != null) currentSituation = Lookup.fromJson((wo.currentSituation)?.toMap() ?? {}); repairLocation = Lookup.fromJson((wo.repairLocation ?? repairLocation)?.toMap() ?? {}); reason = Lookup.fromJson((wo.reason ?? reason)?.toMap() ?? {}); - startofWorkTime = wo.startofWorkTime ?? startofWorkTime; - endofWorkTime = wo.endofWorkTime ?? endofWorkTime; + // startofWorkTime = wo.startofWorkTime ?? startofWorkTime; + // endofWorkTime = wo.endofWorkTime ?? endofWorkTime; + timer = wo.timer ?? timer; workingHours = wo.workingHours ?? workingHours; travelingHours = wo.travelingHours ?? travelingHours; travelingExpenses = wo.travelingExpenses ?? travelingExpenses; @@ -155,8 +163,8 @@ class SearchWorkOrder { Lookup currentSituation; Lookup repairLocation; Lookup reason; - String startofWorkTime; - String endofWorkTime; + // String startofWorkTime; + // String endofWorkTime; num workingHours; num travelingHours; num travelingExpenses; @@ -170,6 +178,8 @@ class SearchWorkOrder { String engSignature; String nurseSignature; WoParentDto woParentDto; + TimerModel timer; + SearchWorkOrder copyWith({ num id, num parentWOId, @@ -188,8 +198,8 @@ class SearchWorkOrder { Lookup currentSituation, Lookup repairLocation, Lookup reason, - String startofWorkTime, - String endofWorkTime, + // String startofWorkTime, + // String endofWorkTime, num workingHours, num travelingHours, num travelingExpenses, @@ -203,6 +213,7 @@ class SearchWorkOrder { String engSignature, String nurseSignature, WoParentDto woParentDto, + TimerModel timer, }) => SearchWorkOrder( id: id ?? this.id, @@ -222,8 +233,8 @@ class SearchWorkOrder { currentSituation: currentSituation ?? this.currentSituation, repairLocation: repairLocation ?? this.repairLocation, reason: reason ?? this.reason, - startofWorkTime: startofWorkTime ?? this.startofWorkTime, - endofWorkTime: endofWorkTime ?? this.endofWorkTime, + // startofWorkTime: startofWorkTime ?? this.startofWorkTime, + // endofWorkTime: endofWorkTime ?? this.endofWorkTime, workingHours: workingHours ?? this.workingHours, travelingHours: travelingHours ?? this.travelingHours, travelingExpenses: travelingExpenses ?? this.travelingExpenses, @@ -237,6 +248,7 @@ class SearchWorkOrder { engSignature: engSignature ?? this.engSignature, nurseSignature: nurseSignature ?? this.nurseSignature, woParentDto: woParentDto ?? this.woParentDto, + timer: timer ?? this.timer, ); Map toJson() { final map = {}; @@ -269,20 +281,22 @@ class SearchWorkOrder { map['calllastSituation'] = calllastSituation.toMap(); } map['currentSituation'] = currentSituation?.toMap(); - if (repairLocation != null) { + if (repairLocation?.id != null) { map['repairLocation'] = repairLocation.toMap(); } if (reason != null) { map['reason'] = reason.toMap(); } - map['startofWorkTime'] = startofWorkTime; - map['endofWorkTime'] = endofWorkTime; + // map['startofWorkTime'] = startofWorkTime; + // map['endofWorkTime'] = endofWorkTime; + map['startofWorkTime'] = timer?.startAt?.toIso8601String(); + map['endofWorkTime'] = timer?.endAt?.toIso8601String(); map['workingHours'] = workingHours; map['travelingHours'] = travelingHours; map['travelingExpenses'] = travelingExpenses; - if (faultDescription?.id != null ) { - map['faultDescription'] = faultDescription.toJson(); + if (faultDescription?.id != null) { + map['faultDescription'] = faultDescription.toJson(); } if (sparePartsWorkOrders != null) { map['sparePartsWorkOrders'] = sparePartsWorkOrders.map((v) => v.toJson()).toList(); diff --git a/lib/models/timer_model.dart b/lib/models/timer_model.dart index c6434f93..907d006d 100644 --- a/lib/models/timer_model.dart +++ b/lib/models/timer_model.dart @@ -2,6 +2,7 @@ class TimerModel { DateTime startAt; DateTime endAt; int durationInSecond; + bool stopped; - TimerModel({this.startAt, this.endAt, this.durationInSecond}); + TimerModel({this.startAt, this.endAt, this.durationInSecond, this.stopped}); } diff --git a/lib/views/pages/device_transfer/update_device_transfer.dart b/lib/views/pages/device_transfer/update_device_transfer.dart index 5e8101f1..061b5d21 100644 --- a/lib/views/pages/device_transfer/update_device_transfer.dart +++ b/lib/views/pages/device_transfer/update_device_transfer.dart @@ -19,8 +19,7 @@ import 'package:test_sa/views/widgets/status/gas_refill/gas_status.dart'; import 'package:test_sa/views/widgets/titles/app_sub_title.dart'; import '../../../../controllers/localization/localization.dart'; -import '../../../controllers/validator/validator.dart'; -import '../../widgets/date_and_time/time_picker.dart'; +import '../../widgets/timer/app_timer.dart'; class UpdateDeviceTransfer extends StatefulWidget { final DeviceTransfer model; @@ -46,6 +45,13 @@ class _UpdateDeviceTransferState extends State { final GlobalKey _scaffoldKey = GlobalKey(); _update() async { + if (_formModel?.workingHours == null || _formModel.workingHours.isEmpty) { + await Fluttertoast.showToast(msg: "Working Hours Timer Isn't Started"); + return; + } else if ((_formModel?.timer?.stopped ?? false) == false) { + await Fluttertoast.showToast(msg: "Stop The Timer"); + return; + } _validate = true; if (!_formKey.currentState.validate()) { setState(() {}); @@ -152,96 +158,23 @@ class _UpdateDeviceTransferState extends State { const SizedBox( height: 16, ), + ASubTitle(_subtitle.workingHours), + const SizedBox(height: 8), Row( children: [ Expanded( - child: Column( - crossAxisAlignment: CrossAxisAlignment.stretch, - children: [ - const ASubTitle("Start of Work"), - SizedBox( - height: 8 * AppStyle.getScaleFactor(context), - ), - ADateTimePicker( - date: _formModel.startDate, - from: DateTime.now().subtract(const Duration(days: 365)), - to: DateTime.now().add(const Duration(days: 365)), - onDateTimePicker: (date) { - _formModel.startDate = date; - _formModel.workingHours = ((_formModel.endDate?.difference(_formModel.startDate)?.inMinutes ?? 0) / 60)?.toStringAsFixed(2)?.toString() ?? 0; - setState(() {}); - }, - ), - ], - ), - ), - const SizedBox(width: 8), - Expanded( - child: Column( - crossAxisAlignment: CrossAxisAlignment.stretch, - children: [ - const ASubTitle("End of Work"), - SizedBox( - height: 8 * AppStyle.getScaleFactor(context), - ), - ADateTimePicker( - date: _formModel.endDate, - from: DateTime.now().subtract(const Duration(days: 365)), - to: DateTime.now().add(const Duration(days: 365)), - onDateTimePicker: (date) { - _formModel.endDate = date; - _formModel.workingHours = ((_formModel.endDate?.difference(_formModel.startDate)?.inMinutes ?? 0) / 60)?.toStringAsFixed(2)?.toString() ?? 0; - setState(() {}); - }, - ), - ], + child: AppTimer( + timer: _formModel.timer, + onChange: (timer) async { + _formModel.timer = timer; + _formModel.workingHours = (((timer?.durationInSecond ?? 0) / 60) / 60)?.toStringAsFixed(2) ?? "0"; + return true; + }, ), ), ], ), - const SizedBox(height: 4), - ASubTitle(_subtitle.workingHours), - const SizedBox(height: 4), - ATextFormField( - initialValue: null, - textAlign: TextAlign.center, - hintText: _formModel.startDate == null ? "0" : ((_formModel.endDate?.difference(_formModel.startDate)?.inMinutes ?? 0) / 60)?.toStringAsFixed(2)?.toString() ?? "0", - enable: false, - style: Theme.of(context).textTheme.subtitle1, - //validator: (value) => Validator.isNumeric(value) ? null : _subtitle.requiredWord, - textInputType: TextInputType.number, - onSaved: (value) { - // _serviceReport.workHours = value; - }, - ), - // ASubTitle(_subtitle.workingHours), - // const SizedBox( - // height: 4, - // ), - // ATextFormField( - // initialValue: _formModel?.workingHours, - // textAlign: TextAlign.center, - // style: Theme.of(context).textTheme.subtitle1, - // textInputType: TextInputType.number, - // onSaved: (value) { - // _formModel.workingHours = value; - // }, - // ), - // const SizedBox(height: 8,), - // const ASubTitle("Sender Department"), - // if(_validate && _formModel.senderDepartment == null) - // ASubTitle(_subtitle.requiredWord,color: Colors.red,), - // const SizedBox(height: 4,), - // DepartmentButton( - // department: _formModel.senderDepartment, - // onDepartmentPick: (department){ - // _formModel.senderDepartment = department; - // setState(() {}); - // }, - // ), - const SizedBox( - height: 8, - ), + const SizedBox(height: 16), ASubTitle(_subtitle.status), const SizedBox( height: 4, @@ -249,8 +182,7 @@ class _UpdateDeviceTransferState extends State { GasStatusMenu( initialValue: _formModel.status, onSelect: (status) { - if(status==null) - return; + if (status == null) return; _formModel.status = status; setState(() {}); }, diff --git a/lib/views/pages/sub_workorder/create_sub_workorder_page.dart b/lib/views/pages/sub_workorder/create_sub_workorder_page.dart index 9b1ba0b9..fdfd67e5 100644 --- a/lib/views/pages/sub_workorder/create_sub_workorder_page.dart +++ b/lib/views/pages/sub_workorder/create_sub_workorder_page.dart @@ -74,7 +74,7 @@ class _CreateSubWorkOrderPageState extends State { _callRequestForWorkOrder = await Provider.of(context).getCallRequestForWorkOrder(callId: widget.workOrder.callRequest.id.toString()); await assetTypesProvider.getTypes(); _subWorkOrders?.assetType = assetTypesProvider.statuses?.firstWhere( - (element) => element.value == _callRequestForWorkOrder.assetType, + (element) => element.value == _callRequestForWorkOrder?.assetType, orElse: () => null, ); setState(() { @@ -223,8 +223,7 @@ class _CreateSubWorkOrderPageState extends State { initialValue: _subWorkOrders?.faultDescription, onSelect: (status) { _subWorkOrders.faultDescription = status; - if(mounted) - setState(() {}); + if (mounted) setState(() {}); }, ), ], @@ -318,11 +317,8 @@ class _CreateSubWorkOrderPageState extends State { _validate = true; setState(() {}); if (validate()) { - if (_subWorkOrders.startofWorkTime == null) { - Fluttertoast.showToast(msg: "${subtitle.startDate} required"); - return; - } else if (_subWorkOrders.endofWorkTime == null) { - Fluttertoast.showToast(msg: "${subtitle.endDate} required"); + if (_subWorkOrders.timer?.startAt == null || _subWorkOrders.timer?.endAt == null) { + Fluttertoast.showToast(msg: "Working hours required"); return; } else if (_subWorkOrders.calllastSituation == null) { Fluttertoast.showToast(msg: "${subtitle.callLastSituation} required"); diff --git a/lib/views/pages/sub_workorder/spare_parts_details_bottom_sheet.dart b/lib/views/pages/sub_workorder/spare_parts_details_bottom_sheet.dart index 5c9a8fa7..e7d5fc93 100644 --- a/lib/views/pages/sub_workorder/spare_parts_details_bottom_sheet.dart +++ b/lib/views/pages/sub_workorder/spare_parts_details_bottom_sheet.dart @@ -135,8 +135,6 @@ class _SparePartsBottomSheetState extends State { return PartItem( part: part, onEdit: (qty) { - print("sss${spare.qty}"); - print(qty); spare.qty = qty; }, onDelete: (part) { diff --git a/lib/views/pages/sub_workorder/work_order_details_bottom_sheet.dart b/lib/views/pages/sub_workorder/work_order_details_bottom_sheet.dart index c6ebd386..df6e58f0 100644 --- a/lib/views/pages/sub_workorder/work_order_details_bottom_sheet.dart +++ b/lib/views/pages/sub_workorder/work_order_details_bottom_sheet.dart @@ -1,4 +1,5 @@ import 'package:flutter/material.dart'; +import 'package:fluttertoast/fluttertoast.dart'; import 'package:provider/provider.dart'; import 'package:test_sa/models/service_request/search_work_order.dart'; import 'package:test_sa/models/subtitle.dart'; @@ -10,8 +11,7 @@ import 'package:test_sa/views/widgets/status/report/service_report_repair_locati import '../../../controllers/localization/localization.dart'; import '../../../controllers/providers/api/status_drop_down/report/service_report_maintenance_situation_provider.dart'; -import '../../app_style/sizing.dart'; -import '../../widgets/date_and_time/time_picker.dart'; +import '../../widgets/timer/app_timer.dart'; import '../../widgets/titles/app_sub_title.dart'; class WorkOrderDetailsBottomSheet extends StatefulWidget { @@ -78,75 +78,23 @@ class _WorkOrderDetailsBottomSheetState extends State Validator.isNumeric(value) ? null : _subtitle.requiredWord, - textInputType: TextInputType.number, - onSaved: (value) { - _workOrder.workingHours = double.tryParse( - ((DateTime.tryParse(_workOrder.endofWorkTime ?? "")?.difference(DateTime.tryParse(_workOrder.startofWorkTime ?? ""))?.inMinutes ?? 0) / 60) - ?.toStringAsFixed(2) - ?.toString() ?? - "0"); - }, - ), - const SizedBox(height: 8), + const SizedBox(height: 16), ATextFormField( labelText: "Travel Hours", initialValue: _workOrder.travelingHours?.toString(), @@ -206,6 +154,13 @@ class _WorkOrderDetailsBottomSheetState extends State { ), ], ), - if (_userProvider.user?.type == UsersTypes.engineer) - Column( - children: [ - Row( - children: [ - Expanded( - child: Column( - crossAxisAlignment: CrossAxisAlignment.stretch, - children: [ - const ASubTitle("Start of Work"), - SizedBox( - height: 8 * AppStyle.getScaleFactor(context), - ), - ADateTimePicker( - date: _gasRefillProvider.startDate, - from: DateTime.now().subtract(const Duration(days: 365)), - to: DateTime.now().add(const Duration(days: 365)), - onDateTimePicker: (date) { - _gasRefillProvider.startDate = date; - setState(() {}); - }, - ), - ], - ), - ), - const SizedBox(width: 8), - Expanded( - child: Column( - crossAxisAlignment: CrossAxisAlignment.stretch, - children: [ - const ASubTitle("End of Work"), - SizedBox( - height: 8 * AppStyle.getScaleFactor(context), - ), - ADateTimePicker( - date: _gasRefillProvider.endDate, - from: DateTime.now().subtract(const Duration(days: 365)), - to: DateTime.now().add(const Duration(days: 365)), - onDateTimePicker: (date) { - _gasRefillProvider.endDate = date; - setState(() {}); - }, - ), - ], - ), - ), - ], - ), - const SizedBox(height: 8), - ASubTitle(_subtitle.workingHours), - const SizedBox(height: 4), - ATextFormField( - initialValue: null, - textAlign: TextAlign.center, - hintText: _gasRefillProvider.startDate == null - ? "0" - : ((_gasRefillProvider.endDate?.difference(_gasRefillProvider.startDate)?.inMinutes ?? 0) / 60)?.toStringAsFixed(2)?.toString() ?? "0", - enable: false, - style: Theme.of(context).textTheme.subtitle1, - validator: (value) => Validator.isNumeric(value) ? null : _subtitle.requiredWord, - textInputType: TextInputType.number, - onSaved: (value) { - // _serviceReport.workHours = value; - }, - ), - ], - ), + // if (_userProvider.user?.type == UsersTypes.engineer) + // Column( + // children: [ + // Row( + // children: [ + // Expanded( + // child: Column( + // crossAxisAlignment: CrossAxisAlignment.stretch, + // children: [ + // const ASubTitle("Start of Work"), + // SizedBox( + // height: 8 * AppStyle.getScaleFactor(context), + // ), + // ADateTimePicker( + // date: _gasRefillProvider.startDate, + // from: DateTime.now().subtract(const Duration(days: 365)), + // to: DateTime.now().add(const Duration(days: 365)), + // onDateTimePicker: (date) { + // _gasRefillProvider.startDate = date; + // setState(() {}); + // }, + // ), + // ], + // ), + // ), + // const SizedBox(width: 8), + // Expanded( + // child: Column( + // crossAxisAlignment: CrossAxisAlignment.stretch, + // children: [ + // const ASubTitle("End of Work"), + // SizedBox( + // height: 8 * AppStyle.getScaleFactor(context), + // ), + // ADateTimePicker( + // date: _gasRefillProvider.endDate, + // from: DateTime.now().subtract(const Duration(days: 365)), + // to: DateTime.now().add(const Duration(days: 365)), + // onDateTimePicker: (date) { + // _gasRefillProvider.endDate = date; + // setState(() {}); + // }, + // ), + // ], + // ), + // ), + // ], + // ), + // const SizedBox(height: 8), + // ASubTitle(_subtitle.workingHours), + // const SizedBox(height: 4), + // ATextFormField( + // initialValue: null, + // textAlign: TextAlign.center, + // hintText: _gasRefillProvider.startDate == null + // ? "0" + // : ((_gasRefillProvider.endDate?.difference(_gasRefillProvider.startDate)?.inMinutes ?? 0) / 60)?.toStringAsFixed(2)?.toString() ?? "0", + // enable: false, + // style: Theme.of(context).textTheme.subtitle1, + // validator: (value) => Validator.isNumeric(value) ? null : _subtitle.requiredWord, + // textInputType: TextInputType.number, + // onSaved: (value) { + // // _serviceReport.workHours = value; + // }, + // ), + // ], + // ), if (widget.gasRefillModel == null) Column( crossAxisAlignment: CrossAxisAlignment.start, diff --git a/lib/views/pages/user/requests/report/create_service_report.dart b/lib/views/pages/user/requests/report/create_service_report.dart index d94ddb69..690bdc92 100644 --- a/lib/views/pages/user/requests/report/create_service_report.dart +++ b/lib/views/pages/user/requests/report/create_service_report.dart @@ -23,24 +23,21 @@ import 'package:test_sa/views/widgets/app_text_form_field.dart'; import 'package:test_sa/views/widgets/buttons/app_back_button.dart'; import 'package:test_sa/views/widgets/buttons/app_button.dart'; import 'package:test_sa/views/widgets/date_and_time/date_picker.dart'; -import 'package:test_sa/views/widgets/date_and_time/time_picker.dart'; import 'package:test_sa/views/widgets/e_signature/e_signature.dart'; import 'package:test_sa/views/widgets/equipment/auto_complete_devices_field.dart'; import 'package:test_sa/views/widgets/images/mini_one_image_picker.dart'; import 'package:test_sa/views/widgets/loaders/loading_manager.dart'; import 'package:test_sa/views/widgets/parts/auto_complete_parts_field.dart'; import 'package:test_sa/views/widgets/parts/part_item.dart'; -import 'package:test_sa/views/widgets/status/employee/engineers_mune.dart'; import 'package:test_sa/views/widgets/status/report/service_report_equipment_status.dart'; import 'package:test_sa/views/widgets/status/report/service_report_last_call.dart'; import 'package:test_sa/views/widgets/status/report/service_report_reasons.dart'; -import 'package:test_sa/views/widgets/status/report/service_report_status.dart'; import 'package:test_sa/views/widgets/titles/app_sub_title.dart'; import '../../../../../controllers/providers/api/status_drop_down/report/service_types_provider.dart'; -import '../../../../widgets/speech_to_text/speech_to_text.dart'; import '../../../../widgets/status/report/service_report_fault_description.dart'; import '../../../../widgets/status/report/service_report_repair_location.dart'; +import '../../../../widgets/timer/app_timer.dart'; class CreateServiceReport extends StatefulWidget { static final String id = "/create-service-report"; @@ -331,7 +328,7 @@ class _CreateServiceReportState extends State with TickerPr child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ - // ASubTitle(_subtitle.reportStatus), + // ASubTitle(_subtitle.reportStatus), ASubTitle("Equipment Status"), _validate && _serviceReport.equipmentStatus == null ? ASubTitle( @@ -418,71 +415,23 @@ class _CreateServiceReportState extends State with TickerPr SizedBox( height: 8 * AppStyle.getScaleFactor(context), ), + ASubTitle(_subtitle.workingHours), + const SizedBox(height: 8), Row( children: [ Expanded( - child: Column( - crossAxisAlignment: CrossAxisAlignment.stretch, - children: [ - const ASubTitle("Start of Work"), - SizedBox( - height: 8 * AppStyle.getScaleFactor(context), - ), - ADateTimePicker( - date: _serviceReport.startDate, - from: DateTime.now().subtract(const Duration(days: 365)), - to: DateTime.now().add(const Duration(days: 365)), - onDateTimePicker: (date) { - _serviceReport.startDate = date; - setState(() {}); - }, - ), - ], - ), - ), - const SizedBox(width: 8), - Expanded( - child: Column( - crossAxisAlignment: CrossAxisAlignment.stretch, - children: [ - const ASubTitle("End of Work"), - SizedBox( - height: 8 * AppStyle.getScaleFactor(context), - ), - ADateTimePicker( - date: _serviceReport.endDate, - from: DateTime.now().subtract(const Duration(days: 365)), - to: DateTime.now().add(const Duration(days: 365)), - onDateTimePicker: (date) { - _serviceReport.endDate = date; - setState(() {}); - }, - ), - ], + child: AppTimer( + timer: _serviceReport.timer, + onChange: (timer) async { + _serviceReport.timer = timer; + _serviceReport.workingHours = num.tryParse((((timer?.durationInSecond ?? 0) / 60) / 60)?.toStringAsFixed(2) ?? "0"); + return true; + }, ), ), ], ), - const SizedBox(height: 8), - ASubTitle(_subtitle.workingHours), - const SizedBox(height: 4), - ATextFormField( - initialValue: null, - textAlign: TextAlign.center, - hintText: _serviceReport.startDate == null - ? "0" - : ((_serviceReport?.endDate?.difference(_serviceReport?.startDate)?.inMinutes ?? 0) / 60)?.toStringAsFixed(2)?.toString() ?? "0", - enable: false, - style: Theme.of(context).textTheme.subtitle1, - validator: (value) => Validator.isNumeric(value) ? null : _subtitle.requiredWord, - textInputType: TextInputType.number, - onSaved: (value) { - // _serviceReport.workHours = value; - }, - ), - const SizedBox( - height: 8, - ), + const SizedBox(height: 16), // device sn Visibility( visible: widget.request.deviceSerialNumber == null, @@ -636,7 +585,7 @@ class _CreateServiceReportState extends State with TickerPr enable: false, hintText: _serviceReport.faultDescription?.workPerformed ?? "", controller: _workPreformedController, - style: Theme.of(context).textTheme.subtitle1, + style: Theme.of(context).textTheme.titleMedium, validator: (value) => Validator.hasValue(value) ? null : _subtitle.requiredWord, textInputType: TextInputType.multiline, onSaved: (value) { @@ -701,7 +650,7 @@ class _CreateServiceReportState extends State with TickerPr ), ATextFormField( initialValue: _serviceReport?.travelingExpense?.toString(), - hintText: _subtitle.travelingExpense, + hintText: "i.e 3, 3.5, 4", textAlign: TextAlign.center, style: Theme.of(context).textTheme.titleMedium, textInputType: TextInputType.number, @@ -929,9 +878,9 @@ class _CreateServiceReportState extends State with TickerPr ), Column( children: List.generate(_serviceReport.parts.length, (index) { - Part _part = _serviceReport.parts[index]; + Part part = _serviceReport.parts[index]; return PartItem( - part: _part, + part: part, onDelete: (part) { _serviceReport.parts.remove(part); setState(() {}); diff --git a/lib/views/pages/user/requests/report/edit_service_report.dart b/lib/views/pages/user/requests/report/edit_service_report.dart index 0db15bb7..4a30278e 100644 --- a/lib/views/pages/user/requests/report/edit_service_report.dart +++ b/lib/views/pages/user/requests/report/edit_service_report.dart @@ -24,22 +24,17 @@ import 'package:test_sa/views/widgets/app_text_form_field.dart'; import 'package:test_sa/views/widgets/buttons/app_back_button.dart'; import 'package:test_sa/views/widgets/buttons/app_button.dart'; import 'package:test_sa/views/widgets/date_and_time/date_picker.dart'; -import 'package:test_sa/views/widgets/date_and_time/time_picker.dart'; import 'package:test_sa/views/widgets/e_signature/e_signature.dart'; import 'package:test_sa/views/widgets/equipment/auto_complete_devices_field.dart'; import 'package:test_sa/views/widgets/images/mini_one_image_picker.dart'; import 'package:test_sa/views/widgets/loaders/loading_manager.dart'; import 'package:test_sa/views/widgets/parts/auto_complete_parts_field.dart'; import 'package:test_sa/views/widgets/parts/part_item.dart'; -import 'package:test_sa/views/widgets/status/employee/engineers_mune.dart'; import 'package:test_sa/views/widgets/status/report/service_report_equipment_status.dart'; import 'package:test_sa/views/widgets/status/report/service_report_fault_description.dart'; import 'package:test_sa/views/widgets/status/report/service_report_last_call.dart'; import 'package:test_sa/views/widgets/status/report/service_report_reasons.dart'; import 'package:test_sa/views/widgets/status/report/service_report_repair_location.dart'; -import 'package:test_sa/views/widgets/status/report/service_report_status.dart'; -import 'package:test_sa/views/widgets/status/report/service_report_type.dart'; -import 'package:test_sa/views/widgets/status/report/service_status.dart'; import 'package:test_sa/views/widgets/timer/app_timer.dart'; import 'package:test_sa/views/widgets/titles/app_sub_title.dart'; @@ -617,71 +612,25 @@ class _EditServiceReportState extends State with TickerProvid // }, // ), // const SizedBox(height: 8,), + const SizedBox(height: 8), + ASubTitle(_subtitle.workingHours), + const SizedBox(height: 8), Row( children: [ Expanded( - child: Column( - crossAxisAlignment: CrossAxisAlignment.stretch, - children: [ - const ASubTitle("Start of Work"), - SizedBox( - height: 8 * AppStyle.getScaleFactor(context), - ), - ADateTimePicker( - date: _serviceReport.startDate, - from: DateTime.now().subtract(const Duration(days: 365)), - to: DateTime.now().add(const Duration(days: 365)), - onDateTimePicker: (date) { - _serviceReport.startDate = date; - setState(() {}); - }, - ), - ], - ), - ), - const SizedBox(width: 8), - Expanded( - child: Column( - crossAxisAlignment: CrossAxisAlignment.stretch, - children: [ - const ASubTitle("End of Work"), - SizedBox( - height: 8 * AppStyle.getScaleFactor(context), - ), - ADateTimePicker( - date: _serviceReport.endDate, - from: DateTime.now().subtract(const Duration(days: 365)), - to: DateTime.now().add(const Duration(days: 365)), - onDateTimePicker: (date) { - _serviceReport.endDate = date; - setState(() {}); - }, - ), - ], + child: AppTimer( + timer: _serviceReport.timer, + enabled: false, + // onChange: (timer) async { + // _serviceReport.timer = timer; + // _serviceReport.workingHours = num.tryParse((((timer?.durationInSecond ?? 0) / 60) / 60)?.toStringAsFixed(2) ?? "0"); + // return true; + // }, ), ), ], ), - const SizedBox(height: 8), - ASubTitle(_subtitle.workingHours), - const SizedBox(height: 4), - ATextFormField( - initialValue: null, - textAlign: TextAlign.center, - hintText: _serviceReport.startDate == null - ? "0" - : ((_serviceReport?.endDate?.difference(_serviceReport?.startDate)?.inMinutes ?? 0) / 60)?.toStringAsFixed(2)?.toString() ?? "0", - enable: false, - style: Theme.of(context).textTheme.subtitle1, - validator: (value) => Validator.isNumeric(value) ? null : _subtitle.requiredWord, - textInputType: TextInputType.number, - onSaved: (value) { - // _serviceReport.workHours = value; - }, - ), - const SizedBox( - height: 8, - ), + const SizedBox(height: 16), if (_showCommentField) const SizedBox( height: 8, @@ -711,8 +660,7 @@ class _EditServiceReportState extends State with TickerProvid onSelect: (status) { print("faluttt:${status?.toJson()}"); _serviceReport.faultDescription = status; - if(mounted) - setState(() {}); + if (mounted) setState(() {}); }, ), const SizedBox(height: 8), @@ -1058,6 +1006,13 @@ class _EditServiceReportState extends State with TickerProvid AButton( text: _subtitle.update, onPressed: () async { + if (_serviceReport?.workingHours == null) { + await Fluttertoast.showToast(msg: "Working Hours Timer Isn't Started"); + return; + } else if ((_serviceReport?.timer?.stopped ?? false) == false) { + await Fluttertoast.showToast(msg: "Stop The Timer"); + return; + } _validate = true; print("jere1245"); // if (!_formKey.currentState.validate()) { @@ -1069,7 +1024,7 @@ class _EditServiceReportState extends State with TickerProvid // setState(() {}); // return; // } - // print("jere14"); + // print("jere14"); _formKey.currentState.save(); _isLoading = true; diff --git a/lib/views/widgets/parts/part_item.dart b/lib/views/widgets/parts/part_item.dart index 7f99f70d..c108d07e 100644 --- a/lib/views/widgets/parts/part_item.dart +++ b/lib/views/widgets/parts/part_item.dart @@ -39,7 +39,11 @@ class _PartItemState extends State { iconData: Icons.add, color: Theme.of(context).primaryColor, onPressed: () { - widget.onEdit(++widget.part.quantity); + if (widget.onEdit == null) { + ++widget.part.quantity; + } else { + widget.onEdit(++widget.part.quantity); + } setState(() {}); }, ), @@ -49,7 +53,11 @@ class _PartItemState extends State { onPressed: widget.part.quantity < 2 ? null : () { - widget.onEdit(--widget.part.quantity); + if (widget.onEdit == null) { + --widget.part.quantity; + } else { + widget.onEdit(--widget.part.quantity); + } setState(() {}); }, ), diff --git a/lib/views/widgets/timer/app_timer.dart b/lib/views/widgets/timer/app_timer.dart index 84c5e4e1..9e887905 100644 --- a/lib/views/widgets/timer/app_timer.dart +++ b/lib/views/widgets/timer/app_timer.dart @@ -9,11 +9,13 @@ class AppTimer extends StatefulWidget { final TimerModel timer; final Future Function(TimerModel) onChange; final TextStyle style; + final bool enabled; const AppTimer({ Key key, this.timer, this.onChange, this.style, + this.enabled = true, }) : super(key: key); @override @@ -32,7 +34,7 @@ class _AppTimerState extends State { _startTimer() async { if (!_running) { final time = DateTime.now(); - bool result = await widget.onChange(TimerModel(startAt: time, endAt: null, durationInSecond: _delay)); + bool result = await widget.onChange(TimerModel(startAt: time, endAt: null, durationInSecond: _delay, stopped: false)); if (!result) return; _running = true; @@ -52,7 +54,7 @@ class _AppTimerState extends State { _stopTimer() async { final time = DateTime.now(); final tempStartAt = _startAt.add(Duration(seconds: _delay)); - bool result = await widget.onChange(TimerModel(startAt: tempStartAt, endAt: time, durationInSecond: _delay)); + bool result = await widget.onChange(TimerModel(startAt: tempStartAt, endAt: time, durationInSecond: _delay, stopped: true)); if (!result) return; _running = false; _endAt = time; @@ -99,7 +101,7 @@ class _AppTimerState extends State { child: ElevatedButton( style: ElevatedButton.styleFrom( minimumSize: const Size(1, 1), padding: EdgeInsets.all(4 * AppStyle.getScaleFactor(context)), backgroundColor: _running ? AColors.green[300] : AColors.grey, foregroundColor: Colors.black), - onPressed: _loading ? null : _onPressed, + onPressed: _loading || widget.enabled == false ? null : _onPressed, child: _loading ? const SizedBox.square( dimension: 18, @@ -108,7 +110,7 @@ class _AppTimerState extends State { )) : Row( children: [ - Icon(_running ? Icons.pause : Icons.play_arrow), + if (widget.enabled) Icon(_running ? Icons.pause : Icons.play_arrow), Expanded( child: Center( child: ValueListenableBuilder( @@ -116,7 +118,7 @@ class _AppTimerState extends State { builder: (context, value, _) { return Text( value, - style: widget.style, + style: widget.enabled ? widget.style : widget.style?.copyWith(color: Colors.black54), ); }), ), From b97d6e42838f1519ff395407e478fbadb1739dbd Mon Sep 17 00:00:00 2001 From: zaid_daoud Date: Thu, 6 Jul 2023 11:48:17 +0300 Subject: [PATCH 110/181] - on deivce transfer list screen, add asset number. - on deivce transfer details screen, add asset name on 2nd position. - on deivce transfer details screen, add asset serial number. - on deivce transfer details screen, rename title to transfer id. - on deivce transfer details screen, name unit to department. --- .../pages/device_transfer/device_transfer_details.dart | 8 ++++++-- .../device_trancfer/device_transfer_info_section.dart | 2 +- .../widgets/device_trancfer/device_transfer_item.dart | 8 +++++++- 3 files changed, 14 insertions(+), 4 deletions(-) diff --git a/lib/views/pages/device_transfer/device_transfer_details.dart b/lib/views/pages/device_transfer/device_transfer_details.dart index b7726ff6..74ff48e7 100644 --- a/lib/views/pages/device_transfer/device_transfer_details.dart +++ b/lib/views/pages/device_transfer/device_transfer_details.dart @@ -86,11 +86,15 @@ class _DeviceTransferDetailsState extends State { crossAxisAlignment: CrossAxisAlignment.start, children: [ RequestInfoRow( - title: _subtitle.title, + title: "Id", + info: widget.model.id?.toString(), + ), + RequestInfoRow( + title: _subtitle.assetName, info: widget.model.title, ), RequestInfoRow( - title: _subtitle.device, + title: _subtitle.assetSN, info: widget.model.device.serialNumber, ), RequestInfoRow( diff --git a/lib/views/widgets/device_trancfer/device_transfer_info_section.dart b/lib/views/widgets/device_trancfer/device_transfer_info_section.dart index a311cb14..1a8da07b 100644 --- a/lib/views/widgets/device_trancfer/device_transfer_info_section.dart +++ b/lib/views/widgets/device_trancfer/device_transfer_info_section.dart @@ -21,7 +21,7 @@ class DeviceTransferInfoSection extends StatelessWidget { info: info.client.name, ), RequestInfoRow( - title: subtitle.unite, + title: subtitle.department, info: info.department.name, ), RequestInfoRow( diff --git a/lib/views/widgets/device_trancfer/device_transfer_item.dart b/lib/views/widgets/device_trancfer/device_transfer_item.dart index 9da46fad..20399463 100644 --- a/lib/views/widgets/device_trancfer/device_transfer_item.dart +++ b/lib/views/widgets/device_trancfer/device_transfer_item.dart @@ -1,4 +1,3 @@ -import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; import 'package:provider/provider.dart'; import 'package:test_sa/controllers/localization/localization.dart'; @@ -53,6 +52,13 @@ class DeviceTransferItem extends StatelessWidget { Divider( color: onItemColor, ), + Text( + item.device?.number ?? "-----", + style: Theme.of(context).textTheme.headline6.copyWith(color: onItemColor, fontSize: 16, fontWeight: FontWeight.bold), + ), + Divider( + color: onItemColor, + ), Row( children: [ Expanded( From 9cf9c7f30c91cc9beb82c7ed2f470b7c7ec09c90 Mon Sep 17 00:00:00 2001 From: zaid_daoud Date: Thu, 6 Jul 2023 12:15:15 +0300 Subject: [PATCH 111/181] - New Gas Refill -> Status Disabled With ("Open") default value. - Rename (Pentry) to (PM Entry) --- .../user/gas_refill/request_gas_refill.dart | 4 +++- .../pages/user/visits/pantry/edit_pentry.dart | 2 +- .../widgets/status/gas_refill/gas_status.dart | 4 +++- .../widgets/status/single_status_menu.dart | 21 +++++++++++-------- 4 files changed, 19 insertions(+), 12 deletions(-) diff --git a/lib/views/pages/user/gas_refill/request_gas_refill.dart b/lib/views/pages/user/gas_refill/request_gas_refill.dart index 06fed90e..a5f2e15e 100644 --- a/lib/views/pages/user/gas_refill/request_gas_refill.dart +++ b/lib/views/pages/user/gas_refill/request_gas_refill.dart @@ -150,6 +150,7 @@ class _RequestGasRefillState extends State { } if (widget.gasRefillModel != null && _firstTime) { _formModel = widget.gasRefillModel; + _formModel.status = const Lookup(value: 0); HospitalsProvider().getHospitalsListByVal(searchVal: widget.gasRefillModel.clientName).then((value) { _gasRefillProvider.hospital = value?.firstWhere((element) => element.name == widget.gasRefillModel.clientName, orElse: () => null); print(_gasRefillProvider.hospital?.buildings?.length); @@ -212,7 +213,8 @@ class _RequestGasRefillState extends State { height: 4, ), GasStatusMenu( - initialValue: _formModel.status ?? const Lookup(value: 1), + initialValue: _formModel.status ?? const Lookup(value: 0), + enabled: false, onSelect: (status) { _formModel.status = status; }, diff --git a/lib/views/pages/user/visits/pantry/edit_pentry.dart b/lib/views/pages/user/visits/pantry/edit_pentry.dart index 55d356b9..9a35facd 100644 --- a/lib/views/pages/user/visits/pantry/edit_pentry.dart +++ b/lib/views/pages/user/visits/pantry/edit_pentry.dart @@ -120,7 +120,7 @@ class _EditPentryState extends State with SingleTickerProviderStateM text: "PK Kits", ), Tab( - text: "Pentry", + text: "PM Entry", ), ]), ), diff --git a/lib/views/widgets/status/gas_refill/gas_status.dart b/lib/views/widgets/status/gas_refill/gas_status.dart index c46e6508..7e7cbac6 100644 --- a/lib/views/widgets/status/gas_refill/gas_status.dart +++ b/lib/views/widgets/status/gas_refill/gas_status.dart @@ -10,8 +10,9 @@ import 'package:test_sa/views/widgets/status/single_status_menu.dart'; class GasStatusMenu extends StatelessWidget { final Function(Lookup) onSelect; final Lookup initialValue; + final bool enabled; - const GasStatusMenu({Key key, this.onSelect, this.initialValue}) : super(key: key); + const GasStatusMenu({Key key, this.enabled = true, this.onSelect, this.initialValue}) : super(key: key); @override Widget build(BuildContext context) { final settingProvider = Provider.of(context); @@ -29,6 +30,7 @@ class GasStatusMenu extends StatelessWidget { initialStatus: initialValue, statuses: menuProvider.items, onSelect: onSelect, + enabled: enabled, )); } } diff --git a/lib/views/widgets/status/single_status_menu.dart b/lib/views/widgets/status/single_status_menu.dart index dbd2eb70..6a9a9908 100644 --- a/lib/views/widgets/status/single_status_menu.dart +++ b/lib/views/widgets/status/single_status_menu.dart @@ -7,8 +7,9 @@ class SingleStatusMenu extends StatefulWidget { final List statuses; final Lookup initialStatus; final Function(Lookup) onSelect; + final bool enabled; - const SingleStatusMenu({Key key, this.statuses, this.onSelect, this.initialStatus}) : super(key: key); + const SingleStatusMenu({Key key, this.enabled = true, this.statuses, this.onSelect, this.initialStatus}) : super(key: key); @override _SingleStatusMenuState createState() => _SingleStatusMenuState(); @@ -82,20 +83,22 @@ class _SingleStatusMenuState extends State { style: Theme.of(context).textTheme.subtitle1, ), style: TextStyle(color: Theme.of(context).primaryColor), - underline: SizedBox.shrink(), - onChanged: (Lookup newValue) { - setState(() { - _selectedStatus = newValue; - }); - widget.onSelect(newValue); - }, + underline: const SizedBox.shrink(), + onChanged: widget.enabled == false + ? null + : (Lookup newValue) { + setState(() { + _selectedStatus = newValue; + }); + widget.onSelect(newValue); + }, items: widget.statuses.map>((Lookup value) { return DropdownMenuItem( value: value, child: Text( value.name, style: Theme.of(context).textTheme.subtitle1.copyWith( - color: Theme.of(context).primaryColor, + color: widget.enabled ? Theme.of(context).primaryColor : Colors.grey, fontSize: 11, //fontWeight: FontWeight.bold ), From 77e2b7402b87e6f0c852c19e86e30c1810a68826 Mon Sep 17 00:00:00 2001 From: zaid_daoud Date: Thu, 6 Jul 2023 12:17:41 +0300 Subject: [PATCH 112/181] Rename (PK Kits) to (PM Kits) --- lib/views/pages/user/visits/pantry/edit_pentry.dart | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/views/pages/user/visits/pantry/edit_pentry.dart b/lib/views/pages/user/visits/pantry/edit_pentry.dart index 9a35facd..a6ec92be 100644 --- a/lib/views/pages/user/visits/pantry/edit_pentry.dart +++ b/lib/views/pages/user/visits/pantry/edit_pentry.dart @@ -117,7 +117,7 @@ class _EditPentryState extends State with SingleTickerProviderStateM // text: "Calibration Tools", // ), Tab( - text: "PK Kits", + text: "PM Kits", ), Tab( text: "PM Entry", From ccf329798aa471e0f0b51911e890141cc6e5a765 Mon Sep 17 00:00:00 2001 From: zaid_daoud Date: Sun, 9 Jul 2023 09:49:29 +0300 Subject: [PATCH 113/181] QR reader --- .../providers/api/devices_provider.dart | 54 +++++++++---------- lib/views/widgets/equipment/device_item.dart | 7 +++ .../equipment/single_device_picker.dart | 27 +++++----- 3 files changed, 47 insertions(+), 41 deletions(-) diff --git a/lib/controllers/providers/api/devices_provider.dart b/lib/controllers/providers/api/devices_provider.dart index 4bede208..2d55a2a7 100644 --- a/lib/controllers/providers/api/devices_provider.dart +++ b/lib/controllers/providers/api/devices_provider.dart @@ -147,31 +147,31 @@ class DevicesProvider extends ChangeNotifier { } } - /// return -2 if request in progress - /// return -1 if error happen when sending request - /// 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> getDevicesListBySN({@required String host, @required User user, @required int hospitalId, @required String sn}) async { - Response response; - try { - response = await get( - Uri.parse(URLs.getEquipment + "?client=$hospitalId" + (sn == null || sn.isEmpty ? "" : "&serial_qr=$sn")), - ); - - _stateCode = response.statusCode; - List _page = []; - if (response.statusCode >= 200 && response.statusCode < 300) { - // client's request was successfully received - List categoriesListJson = json.decode(utf8.decode(response.bodyBytes)); - _page = categoriesListJson.map((device) => Device.fromJson(device)).toList(); - } - return _page; - } catch (error) { - _loading = false; - _stateCode = -1; - notifyListeners(); - return []; - } - } + // /// return -2 if request in progress + // /// return -1 if error happen when sending request + // /// 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> getDevicesListBySN({@required String host, @required User user, @required int hospitalId, @required String sn}) async { + // Response response; + // try { + // response = await get( + // Uri.parse(URLs.getEquipment + "?client=$hospitalId" + (sn == null || sn.isEmpty ? "" : "&serial_qr=$sn")), + // ); + // + // _stateCode = response.statusCode; + // List _page = []; + // if (response.statusCode >= 200 && response.statusCode < 300) { + // // client's request was successfully received + // List categoriesListJson = json.decode(utf8.decode(response.bodyBytes)); + // _page = categoriesListJson.map((device) => Device.fromJson(device)).toList(); + // } + // return _page; + // } catch (error) { + // _loading = false; + // _stateCode = -1; + // notifyListeners(); + // return []; + // } + // } } diff --git a/lib/views/widgets/equipment/device_item.dart b/lib/views/widgets/equipment/device_item.dart index e9fb9043..0e3b20e3 100644 --- a/lib/views/widgets/equipment/device_item.dart +++ b/lib/views/widgets/equipment/device_item.dart @@ -33,6 +33,13 @@ class DeviceItem extends StatelessWidget { subtitle: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ + Divider( + color: Theme.of(context).scaffoldBackgroundColor, + ), + Text( + "${_subtitle.assetNumber} : ${device.number}", + style: Theme.of(context).textTheme.subtitle1.copyWith(color: AColors.white), + ), Divider( color: Theme.of(context).scaffoldBackgroundColor, ), diff --git a/lib/views/widgets/equipment/single_device_picker.dart b/lib/views/widgets/equipment/single_device_picker.dart index e23d5b05..5162b3e7 100644 --- a/lib/views/widgets/equipment/single_device_picker.dart +++ b/lib/views/widgets/equipment/single_device_picker.dart @@ -1,5 +1,4 @@ import 'package:flutter/material.dart'; -import 'package:fluttertoast/fluttertoast.dart'; import 'package:provider/provider.dart'; import 'package:test_sa/controllers/localization/localization.dart'; import 'package:test_sa/controllers/providers/api/devices_provider.dart'; @@ -33,20 +32,20 @@ class _SingleDevicePickerState extends State { TextEditingController numberController = TextEditingController(); TextEditingController snController = TextEditingController(); _getDevice(String result) async { + print(result); if (result == null) return; - showDialog( - barrierDismissible: false, - context: context, - builder: (dialogContext) { - return const Center(child: CircularProgressIndicator()); - }); - List devices = await _devicesProvider.getDevicesListBySN(host: _settingProvider.host, user: _userProvider.user, hospitalId: _userProvider.user.clientId, sn: result); - Navigator.of(context).pop(); - if (devices.isEmpty) { - Fluttertoast.showToast(msg: _subtitle.noDeviceFound); - return; - } - Navigator.of(context).pop(devices.first); + // List devices = await _devicesProvider.getDevicesListBySN(host: _settingProvider.host, user: _userProvider.user, hospitalId: _userProvider.user.clientId, sn: result); + _devicesProvider.reset(); + await _devicesProvider.getEquipment(user: _userProvider.user, host: _settingProvider.host, hospitalId: _userProvider.user.clientId, serialNumber: "", number: result); + _searchableList.clear(); + _searchableList.addAll(_devicesProvider.devices); + // Navigator.of(context).pop(); + // Navigator.of(context).pop(); + // if (devices.isEmpty) { + // Fluttertoast.showToast(msg: _subtitle.noDeviceFound); + // return; + // } + // Navigator.of(context).pop(devices.first); } @override From d4a1607392519c1fc07dbcbee2425e0bd22ad9c0 Mon Sep 17 00:00:00 2001 From: zaid_daoud Date: Sun, 9 Jul 2023 09:57:17 +0300 Subject: [PATCH 114/181] First Action Date --- lib/views/pages/user/requests/create_request.dart | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/views/pages/user/requests/create_request.dart b/lib/views/pages/user/requests/create_request.dart index 91b87bed..bcd45204 100644 --- a/lib/views/pages/user/requests/create_request.dart +++ b/lib/views/pages/user/requests/create_request.dart @@ -306,7 +306,7 @@ class CreateRequestPageState extends State { Fluttertoast.showToast(msg: _subtitle.pickDevice); return; } - if (_serviceRequest.firstAction != null && _dateTime == null) { + if (_serviceRequest.firstAction.name == "Need a visit" && _dateTime == null) { Fluttertoast.showToast(msg: _subtitle.noDateFound); return; } From c742dfaacc75a1528e61b76d7d9cb3b101fc2040 Mon Sep 17 00:00:00 2001 From: zaid_daoud Date: Sun, 9 Jul 2023 10:02:30 +0300 Subject: [PATCH 115/181] Asset name rather than asset serial number --- lib/views/widgets/equipment/device_item.dart | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/views/widgets/equipment/device_item.dart b/lib/views/widgets/equipment/device_item.dart index 0e3b20e3..0dd41e75 100644 --- a/lib/views/widgets/equipment/device_item.dart +++ b/lib/views/widgets/equipment/device_item.dart @@ -27,7 +27,7 @@ class DeviceItem extends StatelessWidget { }, child: ListTile( title: Text( - "${_subtitle.sn} : ${device.serialNumber}", + "${_subtitle.assetName} : \n${device.modelDefinition.assetName}", style: Theme.of(context).textTheme.headline6.copyWith(color: AColors.white), ), subtitle: Column( From 8e8cdb6bfe0c3f99b82c830ddc52a8cfa661e10f Mon Sep 17 00:00:00 2001 From: zaid_daoud Date: Sun, 9 Jul 2023 15:05:33 +0300 Subject: [PATCH 116/181] Dropdown issue --- .../pages/user/visits/pantry/edit_pentry.dart | 19 +- .../widgets/pentry/pentry_pm_kit_form.dart | 187 ++++++------------ 2 files changed, 69 insertions(+), 137 deletions(-) diff --git a/lib/views/pages/user/visits/pantry/edit_pentry.dart b/lib/views/pages/user/visits/pantry/edit_pentry.dart index a6ec92be..f0c1c887 100644 --- a/lib/views/pages/user/visits/pantry/edit_pentry.dart +++ b/lib/views/pages/user/visits/pantry/edit_pentry.dart @@ -14,7 +14,6 @@ import 'package:test_sa/models/visits/visit.dart'; import 'package:test_sa/views/widgets/buttons/app_small_button.dart'; import 'package:test_sa/views/widgets/loaders/loading_manager.dart'; import 'package:test_sa/views/widgets/pentry/pentry_calibration_tool_form.dart'; -import 'package:test_sa/views/widgets/pentry/pentry_info_form.dart'; import 'package:test_sa/views/widgets/pentry/pentry_pm_kit_form.dart'; import 'package:test_sa/views/widgets/pentry/pentry_ppm_check_list_form.dart'; @@ -113,15 +112,15 @@ class _EditPentryState extends State with SingleTickerProviderStateM Tab( text: "PPM Check List", ), - // Tab( - // text: "Calibration Tools", - // ), Tab( - text: "PM Kits", + text: "Calibration Tools", ), Tab( - text: "PM Entry", + text: "PM Kits", ), + // Tab( + // text: "PM Entry", + // ), ]), ), ), @@ -144,10 +143,10 @@ class _EditPentryState extends State with SingleTickerProviderStateM models: _pentry.pmKits, enableValidate: _validate, ), - PentryInfoForm( - model: _pentry, - enableValidate: _validate, - ) + // PentryInfoForm( + // model: _pentry, + // enableValidate: _validate, + // ) ], ), Align( diff --git a/lib/views/widgets/pentry/pentry_pm_kit_form.dart b/lib/views/widgets/pentry/pentry_pm_kit_form.dart index f6ac9b18..3fb154d7 100644 --- a/lib/views/widgets/pentry/pentry_pm_kit_form.dart +++ b/lib/views/widgets/pentry/pentry_pm_kit_form.dart @@ -26,133 +26,66 @@ class _PentryPMKitFormState extends State { Widget build(BuildContext context) { final subtitle = AppLocalization.of(context).subtitle; return ListView.builder( - padding: EdgeInsets.only( - top: 12 * AppStyle.getScaleFactor(context), left: 12 * AppStyle.getScaleFactor(context), right: 12 * AppStyle.getScaleFactor(context), bottom: 80 * AppStyle.getScaleFactor(context)), - itemCount: widget.models.length + 1, - itemBuilder: (context, index) { - if (index == widget.models.length) { - return AButton( - text: subtitle.add, - onPressed: () { - widget.models.add(PMKit()); - setState(() {}); - }, - ); - } - final model = widget.models[index]; - return ListView( - shrinkWrap: true, - physics: const ClampingScrollPhysics(), - children: [ - Row( - mainAxisAlignment: MainAxisAlignment.spaceBetween, - children: [ - ASubTitle("#${index + 1}"), - if (index != 0) - ASmallButton( - color: Theme.of(context).colorScheme.error, - text: subtitle.delete, - onPressed: () { - widget.models.remove(model); - setState(() {}); - }, - ), - ], - ), - const SizedBox( - height: 8, - ), - const ASubTitle("Item Code"), - const SizedBox( - height: 4, - ), - AutoCompletePartsField( - clearAfterPick: false, - initialValue: (model.itemCode?.name ?? "").toString(), - onPick: (part) { - model.itemCode = Lookup(id: part.id, name: part.code); - }, - ), - const SizedBox( - height: 8, - ), - // const ASubTitle("Item Name"), - // const SizedBox(height: 4,), - // ATextFormField( - // initialValue: (model.itemName ?? "").toString(), - // textAlign: TextAlign.center, - // style: Theme.of(context).textTheme.subtitle1, - // textInputType: TextInputType.text, - // onChange: (value){ - // model.itemName = value; - // }, - // ), - // const SizedBox(height: 8,), - // const ASubTitle("Preparation Time Frame"), - // const SizedBox(height: 4,), - // ATextFormField( - // initialValue: (model.preparationTimeFrame ?? "").toString(), - // textAlign: TextAlign.center, - // style: Theme.of(context).textTheme.subtitle1, - // textInputType: TextInputType.text, - // onChange: (value){ - // model.preparationTimeFrame = value; - // }, - // ), - // const SizedBox(height: 8,), - // const ASubTitle("kit Frequency Demand"), - // const SizedBox(height: 4,), - // ATextFormField( - // initialValue: (model.kitFrequencyDemand ?? "").toString(), - // textAlign: TextAlign.center, - // style: Theme.of(context).textTheme.subtitle1, - // textInputType: TextInputType.text, - // onChange: (value){ - // model.kitFrequencyDemand = value; - // }, - // ), - // const SizedBox(height: 8,), - // const ASubTitle("Availability"), - // const SizedBox(height: 4,), - // ATextFormField( - // initialValue: (model.availability ?? "").toString(), - // textAlign: TextAlign.center, - // style: Theme.of(context).textTheme.subtitle1, - // textInputType: TextInputType.text, - // onChange: (value){ - // model.availability = value; - // }, - // ), - // const SizedBox(height: 8,), - // const ASubTitle("Quantity Needed"), - // const SizedBox(height: 4,), - // ATextFormField( - // initialValue: (model.quantityNeeded ?? "").toString(), - // textAlign: TextAlign.center, - // style: Theme.of(context).textTheme.subtitle1, - // textInputType: TextInputType.number, - // onChange: (value){ - // model.quantityNeeded = value; - // }, - // ), - // const SizedBox(height: 8,), - // const ASubTitle("Quantity Reserved"), - // const SizedBox(height: 4,), - // ATextFormField( - // initialValue: (model.quantityReserved ?? "").toString(), - // textAlign: TextAlign.center, - // style: Theme.of(context).textTheme.subtitle1, - // textInputType: TextInputType.number, - // onChange: (value){ - // model.quantityReserved = value; - // }, - // ), - // const SizedBox(height: 8,), - Divider( - color: Theme.of(context).textTheme.titleMedium.color, - ), - ], + padding: EdgeInsets.only( + top: 12 * AppStyle.getScaleFactor(context), + left: 12 * AppStyle.getScaleFactor(context), + right: 12 * AppStyle.getScaleFactor(context), + bottom: 100 * AppStyle.getScaleFactor(context) + MediaQuery.of(context).padding.bottom, + ), + itemCount: widget.models.length + 1, + shrinkWrap: true, + itemBuilder: (context, index) { + if (index == widget.models.length) { + return AButton( + text: subtitle.add, + onPressed: () { + widget.models.add(PMKit()); + setState(() {}); + }, ); - }); + } + final model = widget.models[index]; + return Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + ASubTitle("#${index + 1}"), + if (index != 0) + ASmallButton( + color: Theme.of(context).colorScheme.error, + text: subtitle.delete, + onPressed: () { + widget.models.remove(model); + setState(() {}); + }, + ), + ], + ), + const SizedBox( + height: 8, + ), + const ASubTitle("Item Code"), + const SizedBox( + height: 4, + ), + AutoCompletePartsField( + clearAfterPick: false, + initialValue: (model.itemCode?.name ?? "").toString(), + onPick: (part) { + model.itemCode = Lookup(id: part.id, name: part.code); + }, + ), + const SizedBox( + height: 8, + ), + Divider( + color: Theme.of(context).textTheme.titleMedium.color, + ), + ], + ); + }, + ); } } From 53c1f83bac6770ecf789e27349f30f371e9c0d28 Mon Sep 17 00:00:00 2001 From: zaid_daoud Date: Mon, 10 Jul 2023 13:08:26 +0300 Subject: [PATCH 117/181] Enhancements --- lib/models/service_report.dart | 14 +- .../report/create_service_report.dart | 11 +- .../equipment/single_device_picker.dart | 148 +++++++++--------- 3 files changed, 94 insertions(+), 79 deletions(-) diff --git a/lib/models/service_report.dart b/lib/models/service_report.dart index 5b4ceca7..0ad3b7ad 100644 --- a/lib/models/service_report.dart +++ b/lib/models/service_report.dart @@ -1,5 +1,6 @@ import 'dart:typed_data'; +import 'package:fluttertoast/fluttertoast.dart'; import 'package:test_sa/controllers/api_routes/urls.dart'; import 'package:test_sa/models/device/device.dart'; import 'package:test_sa/models/engineer.dart'; @@ -150,13 +151,16 @@ class ServiceReport { return _map; } - bool validate() { + Future validate() async { print("visitDate:$visitDate"); - print("equipmentStatus:$equipmentStatus"); - print("callLastSituation:${callLastSituation.toMap()}"); + print("equipmentStatus:${equipmentStatus?.toMap()}"); + print("callLastSituation:${callLastSituation?.toMap()}"); print("parts:$parts"); - print("reason:${reason.toMap()}"); - if (visitDate == null) return false; + print("reason:${reason?.toMap()}"); + if (visitDate == null) { + await Fluttertoast.showToast(msg: "Visit Date Required"); + return false; + } //if(serviceType == null) return false; if (equipmentStatus == null) return false; //if (type == null && assetType == null) return false; diff --git a/lib/views/pages/user/requests/report/create_service_report.dart b/lib/views/pages/user/requests/report/create_service_report.dart index 690bdc92..23c96a74 100644 --- a/lib/views/pages/user/requests/report/create_service_report.dart +++ b/lib/views/pages/user/requests/report/create_service_report.dart @@ -605,6 +605,12 @@ class _CreateServiceReportState extends State with TickerPr crossAxisAlignment: CrossAxisAlignment.start, children: [ ASubTitle(_subtitle.reasons), + _validate && _serviceReport.reason?.id == null + ? ASubTitle( + _subtitle.requiredWord, + color: Colors.red, + ) + : const SizedBox.shrink(), const SizedBox(height: 4), ServiceReportReasonsMenu( initialValue: _serviceReport.reason, @@ -904,7 +910,10 @@ class _CreateServiceReportState extends State with TickerPr // setState(() {}); // return; // } - if (!_serviceReport.validate()) return; + if (!(await _serviceReport.validate())) { + setState(() {}); + return; + } _formKey.currentState.save(); _isLoading = true; diff --git a/lib/views/widgets/equipment/single_device_picker.dart b/lib/views/widgets/equipment/single_device_picker.dart index 5162b3e7..6166ea27 100644 --- a/lib/views/widgets/equipment/single_device_picker.dart +++ b/lib/views/widgets/equipment/single_device_picker.dart @@ -73,81 +73,83 @@ class _SingleDevicePickerState extends State { _subtitle = AppLocalization.of(context).subtitle; return Scaffold( resizeToAvoidBottomInset: false, - body: LoadingManager( - isLoading: _devicesProvider.isLoading, - stateCode: _devicesProvider.stateCode, - isFailedLoading: _devicesProvider.devices == null, - onRefresh: () async { - _devicesProvider.reset(); - await _devicesProvider.getEquipment(user: _userProvider.user, host: _settingProvider.host, hospitalId: _userProvider.user.clientId); - }, - child: Column( - children: [ - const SizedBox(height: 48), - Padding( - padding: const EdgeInsets.symmetric(vertical: 8, horizontal: 16), - child: Column( - children: [ - ATextFormField( - hintText: _subtitle.searchBySn, - controller: snController, - style: Theme.of(context).textTheme.subtitle1, - suffixIcon: const Icon(Icons.search_rounded), - textInputAction: TextInputAction.search, - onAction: () async { - _devicesProvider.reset(); - await _devicesProvider.getEquipment( - user: _userProvider.user, host: _settingProvider.host, hospitalId: _userProvider.user.clientId, serialNumber: snController.text, number: numberController.text); - _searchableList.clear(); - _searchableList.addAll(_devicesProvider.devices); - }, - ), - const SizedBox( - height: 8, - ), - ATextFormField( - hintText: "Search by Number", - controller: numberController, - style: Theme.of(context).textTheme.subtitle1, - suffixIcon: const Icon(Icons.search_rounded), - textInputAction: TextInputAction.search, - onAction: () async { - _devicesProvider.reset(); - await _devicesProvider.getEquipment( - user: _userProvider.user, host: _settingProvider.host, hospitalId: _userProvider.user.clientId, serialNumber: snController.text, number: numberController.text); - _searchableList.clear(); - _searchableList.addAll(_devicesProvider.devices); - }, - ), - ], + body: SafeArea( + child: LoadingManager( + isLoading: _devicesProvider.isLoading, + stateCode: _devicesProvider.stateCode, + isFailedLoading: _devicesProvider.devices == null, + onRefresh: () async { + _devicesProvider.reset(); + await _devicesProvider.getEquipment(user: _userProvider.user, host: _settingProvider.host, hospitalId: _userProvider.user.clientId); + }, + child: Column( + children: [ + const SizedBox(height: 16), + Padding( + padding: const EdgeInsets.symmetric(vertical: 8, horizontal: 16), + child: Column( + children: [ + ATextFormField( + hintText: _subtitle.searchBySn, + controller: snController, + style: Theme.of(context).textTheme.subtitle1, + suffixIcon: const Icon(Icons.search_rounded), + textInputAction: TextInputAction.search, + onAction: () async { + _devicesProvider.reset(); + await _devicesProvider.getEquipment( + user: _userProvider.user, host: _settingProvider.host, hospitalId: _userProvider.user.clientId, serialNumber: snController.text, number: numberController.text); + _searchableList.clear(); + _searchableList.addAll(_devicesProvider.devices); + }, + ), + const SizedBox( + height: 8, + ), + ATextFormField( + hintText: "Search by Number", + controller: numberController, + style: Theme.of(context).textTheme.subtitle1, + suffixIcon: const Icon(Icons.search_rounded), + textInputAction: TextInputAction.search, + onAction: () async { + _devicesProvider.reset(); + await _devicesProvider.getEquipment( + user: _userProvider.user, host: _settingProvider.host, hospitalId: _userProvider.user.clientId, serialNumber: snController.text, number: numberController.text); + _searchableList.clear(); + _searchableList.addAll(_devicesProvider.devices); + }, + ), + ], + ), ), - ), - Expanded( - child: _searchableList.isEmpty - ? NoItemFound( - message: _subtitle.noDeviceFound, - ) - : LazyLoading( - nextPage: _devicesProvider.nextPage, - onLazyLoad: () async { - await _devicesProvider.getDevicesList( - user: _userProvider.user, host: _settingProvider.host, hospitalId: _userProvider.user.clientId, serialNumber: snController.text, number: numberController.text); - }, - child: ListView.builder( - padding: EdgeInsets.zero, - shrinkWrap: true, - itemCount: _searchableList.length, - itemBuilder: (listContext, itemIndex) { - return DeviceItem( - device: _searchableList[itemIndex], - onPressed: (device) { - Navigator.of(context).pop(device); - }, - ); + Expanded( + child: _searchableList.isEmpty + ? NoItemFound( + message: _subtitle.noDeviceFound, + ) + : LazyLoading( + nextPage: _devicesProvider.nextPage, + onLazyLoad: () async { + await _devicesProvider.getDevicesList( + user: _userProvider.user, host: _settingProvider.host, hospitalId: _userProvider.user.clientId, serialNumber: snController.text, number: numberController.text); }, - ), - )), - ], + child: ListView.builder( + padding: EdgeInsets.zero, + shrinkWrap: true, + itemCount: _searchableList.length, + itemBuilder: (listContext, itemIndex) { + return DeviceItem( + device: _searchableList[itemIndex], + onPressed: (device) { + Navigator.of(context).pop(device); + }, + ); + }, + ), + )), + ], + ), ), ), floatingActionButton: FloatingActionButton( From 0563c545b5bf136232b2dec9c26c2894f5e93746 Mon Sep 17 00:00:00 2001 From: zaid_daoud Date: Tue, 11 Jul 2023 09:33:30 +0300 Subject: [PATCH 118/181] Add Engineer Signature & Nurse Signature to Update Gas Refill --- .../providers/api/gas_refill_provider.dart | 2 + lib/models/gas_refill/gas_refill_model.dart | 17 +++++++++ .../user/gas_refill/request_gas_refill.dart | 38 +++++++++++++++++-- 3 files changed, 54 insertions(+), 3 deletions(-) diff --git a/lib/controllers/providers/api/gas_refill_provider.dart b/lib/controllers/providers/api/gas_refill_provider.dart index e2401668..faf84d66 100644 --- a/lib/controllers/providers/api/gas_refill_provider.dart +++ b/lib/controllers/providers/api/gas_refill_provider.dart @@ -158,6 +158,8 @@ class GasRefillProvider extends ChangeNotifier { "building": building?.toJson(includeFloors: false), "floor": floor?.toJson(includeDepartments: false), "department": department?.toJson(), + "engSignature": newModel.signatureEngineer, + "nurseSignature": newModel.signatureNurse, }; body["gazRefillDetails"] = newModel.details diff --git a/lib/models/gas_refill/gas_refill_model.dart b/lib/models/gas_refill/gas_refill_model.dart index 13a6e6b8..291ee5ad 100644 --- a/lib/models/gas_refill/gas_refill_model.dart +++ b/lib/models/gas_refill/gas_refill_model.dart @@ -1,6 +1,9 @@ +import 'dart:typed_data'; + import 'package:test_sa/models/gas_refill/gas_refill_details.dart'; import 'package:test_sa/models/lookup.dart'; +import '../../controllers/api_routes/urls.dart'; import '../call_request_for_work_order_model.dart'; class GasRefillModel { @@ -14,6 +17,10 @@ class GasRefillModel { Department department; List details; AssignedEmployee assignedEmployee; + String signatureNurse; + String signatureEngineer; + Uint8List localNurseSignature; + Uint8List localEngineerSignature; DateTime startDate, endDate, expectedDate; GasRefillModel({ @@ -30,6 +37,10 @@ class GasRefillModel { this.expectedDate, this.department, this.assignedEmployee, + this.signatureNurse, + this.signatureEngineer, + this.localEngineerSignature, + this.localNurseSignature, }); bool validate() { @@ -58,6 +69,10 @@ class GasRefillModel { endDate = model.endDate; expectedDate = model.expectedDate; assignedEmployee = model.assignedEmployee; + localEngineerSignature = model.localEngineerSignature; + localNurseSignature = model.localNurseSignature; + signatureEngineer = model.signatureEngineer; + signatureNurse = model.signatureNurse; } factory GasRefillModel.fromJson(Map parsedJson) { @@ -80,6 +95,8 @@ class GasRefillModel { endDate: DateTime.tryParse(parsedJson['endDate'] ?? ""), expectedDate: DateTime.tryParse(parsedJson['expectedDate'] ?? ""), assignedEmployee: AssignedEmployee.fromJson(parsedJson['assignedEmployee'] ?? {}), + signatureEngineer: URLs.getFileUrl(parsedJson["engSignature"]), + signatureNurse: URLs.getFileUrl(parsedJson["nurseSignature"]), ); } } diff --git a/lib/views/pages/user/gas_refill/request_gas_refill.dart b/lib/views/pages/user/gas_refill/request_gas_refill.dart index a5f2e15e..cb186466 100644 --- a/lib/views/pages/user/gas_refill/request_gas_refill.dart +++ b/lib/views/pages/user/gas_refill/request_gas_refill.dart @@ -1,3 +1,5 @@ +import 'dart:convert'; + import 'package:flutter/material.dart'; import 'package:fluttertoast/fluttertoast.dart'; import 'package:provider/provider.dart'; @@ -29,6 +31,7 @@ import 'package:test_sa/views/widgets/titles/app_sub_title.dart'; import '../../../../controllers/localization/localization.dart'; import '../../../../controllers/providers/api/hospitals_provider.dart'; import '../../../../models/enums/user_types.dart'; +import '../../../widgets/e_signature/e_signature.dart'; class RequestGasRefill extends StatefulWidget { static const String id = "/request-gas-refill"; @@ -483,14 +486,43 @@ class _RequestGasRefillState extends State { }, ); }), + if (widget.gasRefillModel != null) const SizedBox(height: 16), + if (widget.gasRefillModel != null) const ASubTitle("Nurse Signature"), + if (widget.gasRefillModel != null) + ESignature( + oldSignature: _formModel.signatureNurse, + newSignature: _formModel.localNurseSignature, + onChange: (signature) { + if (signature == null || signature.isEmpty) { + return; + } + _formModel.localNurseSignature = signature; + _formModel.signatureNurse = "${DateTime.now().toIso8601String()}.png|${base64Encode(signature)}"; + }, + ), + if (widget.gasRefillModel != null) + const SizedBox( + height: 8, + ), + if (widget.gasRefillModel != null) const ASubTitle("Engineer Signature"), + if (widget.gasRefillModel != null) + ESignature( + oldSignature: _formModel.signatureEngineer, + newSignature: _formModel.localNurseSignature, + onChange: (signature) { + if (signature == null || signature.isEmpty) { + return; + } + _formModel.localNurseSignature = signature; + _formModel.signatureEngineer = "${DateTime.now().toIso8601String()}.png|${base64Encode(signature)}"; + }, + ), const SizedBox(height: 16), AButton( text: widget.gasRefillModel == null ? _subtitle.submit : _subtitle.update, onPressed: _onSubmit, ), - const SizedBox( - height: 100, - ) + const SizedBox(height: 100) ], ), ), From 0459ab14e2f74bb3ddcc5aa7125d703cd169c768 Mon Sep 17 00:00:00 2001 From: zaid_daoud Date: Tue, 11 Jul 2023 10:26:41 +0300 Subject: [PATCH 119/181] PPM Updates Done --- lib/models/pantry/pentry.dart | 4 +- .../pages/user/visits/pantry/edit_pentry.dart | 51 ++++++++++--------- .../pentry/pentry_calibration_tool_form.dart | 5 +- .../widgets/pentry/pentry_info_form.dart | 28 ++++++---- 4 files changed, 48 insertions(+), 40 deletions(-) diff --git a/lib/models/pantry/pentry.dart b/lib/models/pantry/pentry.dart index 45bd477b..40a9034e 100644 --- a/lib/models/pantry/pentry.dart +++ b/lib/models/pantry/pentry.dart @@ -58,7 +58,7 @@ class Pentry { Map toMap(int visitId) { Map map = {}; map["visitStatusId"] = ppmVisitStatus?.id.toString(); - //if(status != null) map["visitStatusId"] = status?.id.toString(); + if (status != null) map["deviceStatusId"] = status?.id.toString(); if (travelingHours != null) map["travelingHours"] = travelingHours; //if(imageFile != null) map["file_attachement"] = base64Encode(imageFile.readAsBytesSync()); map["actualDate"] = actualVisitDate.toIso8601String(); @@ -73,7 +73,7 @@ class Pentry { {"attachmentName": (imageFile.path.split("/").last + base64Encode(imageFile.readAsBytesSync()))} ]; } - + map["travelingHours"] = travelingHours; // if(contacts?.isNotEmpty == true) { // for(int i = 0;i with SingleTickerProviderStateM if (_pentry.pmKits.isEmpty) _pentry.pmKits.add(PMKit()); if (_pentry.calibrationTools.isEmpty) _pentry.calibrationTools.add(CalibrationTool()); if (_pentry.ppmCheckLists.isEmpty) _pentry.ppmCheckLists.add(PPMCheckList()); - _tabController = TabController(length: 3, vsync: this); + _tabController = TabController(length: 4, vsync: this); super.initState(); } @@ -103,25 +105,26 @@ class _EditPentryState extends State with SingleTickerProviderStateM child: Padding( padding: const EdgeInsets.all(2.0), child: TabBar( - controller: _tabController, - isScrollable: true, - onTap: (index) { - setState(() {}); - }, - tabs: const [ - Tab( - text: "PPM Check List", - ), - Tab( - text: "Calibration Tools", - ), - Tab( - text: "PM Kits", - ), - // Tab( - // text: "PM Entry", - // ), - ]), + controller: _tabController, + isScrollable: true, + onTap: (index) { + setState(() {}); + }, + tabs: const [ + Tab( + text: "PPM Check List", + ), + Tab( + text: "Calibration Tools", + ), + Tab( + text: "PM Kits", + ), + Tab( + text: "PM Entry", + ), + ], + ), ), ), Expanded( @@ -143,10 +146,10 @@ class _EditPentryState extends State with SingleTickerProviderStateM models: _pentry.pmKits, enableValidate: _validate, ), - // PentryInfoForm( - // model: _pentry, - // enableValidate: _validate, - // ) + PentryInfoForm( + model: _pentry, + enableValidate: _validate, + ), ], ), Align( diff --git a/lib/views/widgets/pentry/pentry_calibration_tool_form.dart b/lib/views/widgets/pentry/pentry_calibration_tool_form.dart index 048e113c..27033ba2 100644 --- a/lib/views/widgets/pentry/pentry_calibration_tool_form.dart +++ b/lib/views/widgets/pentry/pentry_calibration_tool_form.dart @@ -43,9 +43,8 @@ class _PentryCalibrationToolFormState extends State { ); } final model = widget.models[index]; - return ListView( - shrinkWrap: true, - physics: const ClampingScrollPhysics(), + return Column( + crossAxisAlignment: CrossAxisAlignment.start, children: [ Row( mainAxisAlignment: MainAxisAlignment.spaceBetween, diff --git a/lib/views/widgets/pentry/pentry_info_form.dart b/lib/views/widgets/pentry/pentry_info_form.dart index 290b873d..33ccd2ed 100644 --- a/lib/views/widgets/pentry/pentry_info_form.dart +++ b/lib/views/widgets/pentry/pentry_info_form.dart @@ -1,7 +1,6 @@ import 'dart:convert'; import 'package:flutter/material.dart'; -import 'package:flutter/services.dart'; import 'package:provider/provider.dart'; import 'package:test_sa/controllers/localization/localization.dart'; import 'package:test_sa/controllers/providers/api/user_provider.dart'; @@ -15,6 +14,8 @@ import 'package:test_sa/views/widgets/status/pentry/pentry_visit_status_mune.dar import 'package:test_sa/views/widgets/timer/app_timer.dart'; import 'package:test_sa/views/widgets/titles/app_sub_title.dart'; +import '../status/pentry/pentry_status_mune.dart'; + class PentryInfoForm extends StatefulWidget { final Pentry model; final bool enableValidate; @@ -79,16 +80,21 @@ class _PentryInfoFormState extends State { const SizedBox( height: 8, ), - // const ASubTitle("Status"), - // // if(widget.enableValidate && widget.model.status == null) - // // ASubTitle(subtitle.requiredWord,color: Colors.red,), - // const SizedBox(height: 4,), - // PentryStatusMenu( - // initialValue: widget.model.status, - // onSelect: (status){ - // widget.model.status = status; - // }, - // ), + const ASubTitle("Status"), + if (widget.enableValidate && widget.model.status == null) + ASubTitle( + subtitle.requiredWord, + color: Colors.red, + ), + const SizedBox( + height: 4, + ), + PentryStatusMenu( + initialValue: widget.model.status, + onSelect: (status) { + widget.model.status = status; + }, + ), const SizedBox( height: 8, ), From c58a86758c45a5bed3fde011bae0c8ddc4e4dbb0 Mon Sep 17 00:00:00 2001 From: nextwo <1234> Date: Tue, 11 Jul 2023 14:27:11 +0300 Subject: [PATCH 120/181] some edits --- assets/subtitles/ar_subtitle.json | 5 ++--- assets/subtitles/en_subtitle.json | 5 ++--- lib/models/subtitle.dart | 9 +++------ lib/models/visits/visit.dart | 4 ++-- .../sub_workorder/search_sub_workorder_page.dart | 2 +- .../user/requests/report/create_service_report.dart | 6 +++--- .../user/requests/report/edit_service_report.dart | 4 ++-- lib/views/pages/user/requests/request_details.dart | 4 ++-- lib/views/pages/user/visits/visit_details.dart | 11 ++++++----- lib/views/widgets/equipment/single_device_picker.dart | 8 ++++---- 10 files changed, 27 insertions(+), 31 deletions(-) diff --git a/assets/subtitles/ar_subtitle.json b/assets/subtitles/ar_subtitle.json index 2ed3e577..e08d914f 100644 --- a/assets/subtitles/ar_subtitle.json +++ b/assets/subtitles/ar_subtitle.json @@ -74,10 +74,9 @@ "details": "تفاصيل", "device": "جهاز", "deviceArName": "اسم الجهاز بعربي", - "deviceEnName": "اسم الجهاز بالانجليزية", + "deviceName": "اسم الجهاز", "deviceImages": "صور الجهاز", "deviceModel": "مركة الجهاز", - "deviceName": "اسم الجهاز", "deviceRequired": "الجهاز مطلوب", "deviceSN": "رقم تسلسلي للجهاز", "engineerName": "اسم المهندس", @@ -182,7 +181,7 @@ "reportType": "نوع التقرير", "callId": "رقم الطلب", "requiredWord": "مطلوب", - "serviceType": "نوع الخدمة", + "AssetType": "نوع الاصل", "workPreformed": "العمل المنجز", "alert": "تنبيه", "duplicateAlert": "تنبيه التكرار", diff --git a/assets/subtitles/en_subtitle.json b/assets/subtitles/en_subtitle.json index ed6f5917..44e03fa6 100644 --- a/assets/subtitles/en_subtitle.json +++ b/assets/subtitles/en_subtitle.json @@ -73,10 +73,9 @@ "details": "Details", "device": "Asset", "deviceArName": "Asset Ar Name", - "deviceEnName": "Asset En Name", + "deviceName": "Asset Name", "deviceImages": "Asset Images", "deviceModel": "Asset Model", - "deviceName": "Asset Name", "deviceRequired": "Asset Required", "deviceSN": "Asset SN", "engineerName": "Engineer Name", @@ -181,7 +180,7 @@ "reportType": "Report Type", "callId": "Call Id", "requiredWord": "required", - "serviceType": "Service Type", + "AssetType": "asset type", "workPreformed": "Work Preformed", "orderWorkNumber": "Order Work Number", "assignedEmployee": "Assigned Employee", diff --git a/lib/models/subtitle.dart b/lib/models/subtitle.dart index b5b84e48..8a2689ad 100644 --- a/lib/models/subtitle.dart +++ b/lib/models/subtitle.dart @@ -112,7 +112,6 @@ class Subtitle { String unite; String unitRequired; String deviceArName; - String deviceEnName; String details; String general; String serviceRequestInformation; @@ -197,7 +196,7 @@ class Subtitle { String customer; String reportType; String requiredWord; - String serviceType; + String AssetType; String reportStatus; String callLastSituation; String invoiceNumber; @@ -352,7 +351,6 @@ class Subtitle { @required this.twitter, @required this.add, @required this.code, - @required this.deviceEnName, @required this.deviceName, @required this.serialNumber, @required this.policy, @@ -424,7 +422,7 @@ class Subtitle { @required this.reasons, @required this.reportStatus, @required this.reportType, - @required this.serviceType, + @required this.AssetType, @required this.workPreformed, @required this.alert, @required this.duplicateAlert, @@ -522,7 +520,6 @@ class Subtitle { details: parsedJson["details"], device: parsedJson["device"], deviceArName: parsedJson["deviceArName"], - deviceEnName: parsedJson["deviceEnName"], deviceImages: parsedJson["deviceImages"], deviceModel: parsedJson["deviceModel"], deviceName: parsedJson["deviceName"], @@ -629,7 +626,7 @@ class Subtitle { reportType: parsedJson["reportType"], callId: parsedJson["callId"], requiredWord: parsedJson["requiredWord"], - serviceType: parsedJson["serviceType"], + AssetType: parsedJson["serviceType"], workPreformed: parsedJson["workPreformed"], alert: parsedJson["alert"], duplicateAlert: parsedJson["duplicateAlert"], diff --git a/lib/models/visits/visit.dart b/lib/models/visits/visit.dart index f3faed08..2ad5a3d6 100644 --- a/lib/models/visits/visit.dart +++ b/lib/models/visits/visit.dart @@ -61,8 +61,8 @@ class Visit { deviceSerialNumber: parsedJson["assetSerialNo"], deviceEnglishName: parsedJson["assetName"], deviceArabicName: parsedJson["assetName"], - employId: parsedJson["assignedToId"].toString(), - employName: parsedJson["assignedToName"], + employId: parsedJson["assignedEmployeeId"].toString(), + employName: parsedJson["assignedEmployeeName"], expectDate: parsedJson["expectedDate"].toString().split("T").first, actualDate: parsedJson["actualDate"].toString().split("T").first, modelAndBrand: "${parsedJson["modelName"]} / ${parsedJson["manufacturerName"]}", diff --git a/lib/views/pages/sub_workorder/search_sub_workorder_page.dart b/lib/views/pages/sub_workorder/search_sub_workorder_page.dart index 279f8576..78e0bfce 100644 --- a/lib/views/pages/sub_workorder/search_sub_workorder_page.dart +++ b/lib/views/pages/sub_workorder/search_sub_workorder_page.dart @@ -76,7 +76,7 @@ class _SearchSubWorkOrderPageState extends State { crossAxisAlignment: CrossAxisAlignment.start, children: [ ATextFormField( - labelText: "Caller ID", + labelText: "Call ID", onSaved: (value) { _callerId = value; }, diff --git a/lib/views/pages/user/requests/report/create_service_report.dart b/lib/views/pages/user/requests/report/create_service_report.dart index d94ddb69..7f1b31bd 100644 --- a/lib/views/pages/user/requests/report/create_service_report.dart +++ b/lib/views/pages/user/requests/report/create_service_report.dart @@ -284,7 +284,7 @@ class _CreateServiceReportState extends State with TickerPr const SizedBox( height: 8, ), - ASubTitle(_subtitle.serviceType), + ASubTitle(_subtitle.AssetType), _validate && _serviceReport.assetType == null ? ASubTitle( _subtitle.requiredWord, @@ -323,7 +323,7 @@ class _CreateServiceReportState extends State with TickerPr const SizedBox( height: 8, ), - // Report status and Service Type + // Report status and Asset Type Row( children: [ // report status @@ -510,7 +510,7 @@ class _CreateServiceReportState extends State with TickerPr ), ), - // Report status and Service Type + // Report status and Asset Type if (_showCommentField) const SizedBox( diff --git a/lib/views/pages/user/requests/report/edit_service_report.dart b/lib/views/pages/user/requests/report/edit_service_report.dart index 848fc4f2..7c4429c5 100644 --- a/lib/views/pages/user/requests/report/edit_service_report.dart +++ b/lib/views/pages/user/requests/report/edit_service_report.dart @@ -242,7 +242,7 @@ class _EditServiceReportState extends State with TickerProvid const SizedBox( height: 8, ), - ASubTitle(_subtitle.serviceType), + ASubTitle(_subtitle.AssetType), _validate && _serviceReport.assetType == null ? ASubTitle( _subtitle.requiredWord, @@ -286,7 +286,7 @@ class _EditServiceReportState extends State with TickerProvid const SizedBox( height: 8, ), - // Report status and Service Type + // Report status and Asset Type Row( children: [ // report status diff --git a/lib/views/pages/user/requests/request_details.dart b/lib/views/pages/user/requests/request_details.dart index de9cc066..d0b6de53 100644 --- a/lib/views/pages/user/requests/request_details.dart +++ b/lib/views/pages/user/requests/request_details.dart @@ -247,7 +247,7 @@ class RequestDetailsPage extends StatelessWidget { // content: serviceRequest.deviceArName, // ), RequestInfoRow( - title: _subtitle.deviceEnName, + title: _subtitle.deviceName, content: serviceRequest.deviceEnName, ), RequestInfoRow( @@ -420,7 +420,7 @@ class RequestDetailsPage extends StatelessWidget { child: Padding( padding: const EdgeInsets.all(32), child: AButton( - text: "Create Report", + text: "Create Work Order", onPressed: () { Navigator.of(context).push(MaterialPageRoute(builder: (_) => CreateServiceReport(request: serviceRequest))); }, diff --git a/lib/views/pages/user/visits/visit_details.dart b/lib/views/pages/user/visits/visit_details.dart index 145dd68c..a787be18 100644 --- a/lib/views/pages/user/visits/visit_details.dart +++ b/lib/views/pages/user/visits/visit_details.dart @@ -14,6 +14,8 @@ import 'package:test_sa/views/widgets/requests/info_row.dart'; import 'package:test_sa/views/widgets/visits/visit_status.dart'; import '../../../../controllers/providers/api/regular_visits_provider.dart'; +import '../../../../controllers/providers/api/user_provider.dart'; +import '../../../../models/enums/user_types.dart'; class VisitDetailsPage extends StatelessWidget { static final String id = "/visit-details"; @@ -24,6 +26,8 @@ class VisitDetailsPage extends StatelessWidget { Widget build(BuildContext context) { Subtitle _subtitle = AppLocalization.of(context).subtitle; final regularVisitsProvider = Provider.of(context); + UserProvider _userProvider = Provider.of(context); + return Scaffold( body: SafeArea( child: Column( @@ -42,6 +46,7 @@ class VisitDetailsPage extends StatelessWidget { ), ), ), + if (_userProvider?.user?.type == UsersTypes.engineer) AIconButton( iconData: Icons.edit, color: AColors.white, @@ -152,11 +157,7 @@ class VisitDetailsPage extends StatelessWidget { content: visit.hospitalName, ), RequestInfoRow( - title: _subtitle.deviceArName, - content: visit.deviceArabicName, - ), - RequestInfoRow( - title: _subtitle.deviceEnName, + title: _subtitle.deviceName, content: visit.deviceEnglishName, ), ], diff --git a/lib/views/widgets/equipment/single_device_picker.dart b/lib/views/widgets/equipment/single_device_picker.dart index e23d5b05..cd540cda 100644 --- a/lib/views/widgets/equipment/single_device_picker.dart +++ b/lib/views/widgets/equipment/single_device_picker.dart @@ -90,8 +90,8 @@ class _SingleDevicePickerState extends State { child: Column( children: [ ATextFormField( - hintText: _subtitle.searchBySn, - controller: snController, + hintText: "Search by Asset Number", + controller: numberController, style: Theme.of(context).textTheme.subtitle1, suffixIcon: const Icon(Icons.search_rounded), textInputAction: TextInputAction.search, @@ -107,8 +107,8 @@ class _SingleDevicePickerState extends State { height: 8, ), ATextFormField( - hintText: "Search by Number", - controller: numberController, + hintText: _subtitle.searchBySn, + controller: snController, style: Theme.of(context).textTheme.subtitle1, suffixIcon: const Icon(Icons.search_rounded), textInputAction: TextInputAction.search, From 44654e1e380f013eb0a500c74d4b17f755eb0e4f Mon Sep 17 00:00:00 2001 From: nextwo <1234> Date: Tue, 11 Jul 2023 14:53:14 +0300 Subject: [PATCH 121/181] some edits --- .../providers/api/hospitals_provider.dart | 6 +- .../service_report_last_calls_provider.dart | 2 +- lib/models/device/device.dart | 30 ++-- lib/models/engineer.dart | 4 +- lib/models/fault_description.dart | 33 +++-- lib/models/subtitle.dart | 1 - .../request_device_transfer.dart | 4 +- lib/views/pages/login.dart | 3 +- .../search_sub_workorder_page.dart | 6 +- .../pages/sub_workorder/workorder_update.dart | 4 +- lib/views/pages/user/land_page.dart | 16 +-- .../requests/report/edit_service_report.dart | 134 +++++++++--------- .../report/future_service_report.dart | 3 +- .../pages/user/requests/request_details.dart | 2 +- .../pages/user/visits/visit_details.dart | 26 ++-- .../widgets/date_and_time/time_picker.dart | 2 +- .../equipment/single_device_picker.dart | 4 +- .../status/report/fault_desc_menu.dart | 2 - 18 files changed, 140 insertions(+), 142 deletions(-) diff --git a/lib/controllers/providers/api/hospitals_provider.dart b/lib/controllers/providers/api/hospitals_provider.dart index eb9e3ae9..a52a750e 100644 --- a/lib/controllers/providers/api/hospitals_provider.dart +++ b/lib/controllers/providers/api/hospitals_provider.dart @@ -115,13 +115,13 @@ class HospitalsProvider extends ChangeNotifier { } } - Future> getHospitalsListByVal({String searchVal=""}) async { + Future> getHospitalsListByVal({String searchVal = ""}) async { Response response; try { - if(searchVal.isNotEmpty) { + if (searchVal.isNotEmpty) { searchVal = "?searchText=$searchVal"; } - response = await ApiManager.instance.get(URLs.getHospitalsAutoComplete+searchVal); + response = await ApiManager.instance.get(URLs.getHospitalsAutoComplete + searchVal); // response = await get( // Uri.parse(host + URLs.getHospitals // + ( title == null || title.isEmpty ? "" : "?name=$title" )), diff --git a/lib/controllers/providers/api/status_drop_down/report/service_report_last_calls_provider.dart b/lib/controllers/providers/api/status_drop_down/report/service_report_last_calls_provider.dart index 3e4741b9..7551ad57 100644 --- a/lib/controllers/providers/api/status_drop_down/report/service_report_last_calls_provider.dart +++ b/lib/controllers/providers/api/status_drop_down/report/service_report_last_calls_provider.dart @@ -57,7 +57,7 @@ class ServiceReportLastCallsProvider extends ChangeNotifier { try { // todo request new api from backend to make filter work response = await ApiManager.instance.get( - "${URLs.getServiceReportLastCalls}?parentWOId=${woId??id}&isAdd=true&id=${id ?? 0}&typeTransaction=$typeName", + "${URLs.getServiceReportLastCalls}?parentWOId=${woId ?? id}&isAdd=true&id=${id ?? 0}&typeTransaction=$typeName", ); // response = await get( // Uri.parse( diff --git a/lib/models/device/device.dart b/lib/models/device/device.dart index 72f9d120..113e928e 100644 --- a/lib/models/device/device.dart +++ b/lib/models/device/device.dart @@ -34,21 +34,21 @@ class Device { factory Device.fromJson(Map parsedJson) { return Device( - id: parsedJson["id"], - serialNumber: parsedJson["assetSerialNo"], - number: parsedJson["assetNumber"], - modelDefinition: ModelDefinition.fromJson(parsedJson["modelDefinition"]), - hospital: Hospital.fromJson(parsedJson["site"]), - destBuildingName: parsedJson["destBuildingName"], - destDepartmentName: parsedJson["destDepartmentName"], - destRoom: parsedJson["destRoom"], - destFloor: parsedJson["destFloor"], - destSiteName:parsedJson['destSiteName'] - // parsedJson["modelDefinition"] == null ? "" : - // parsedJson["modelDefinition"]["manufacturerName"], - // model: parsedJson["modelDefinition"] == null ? "" : - // parsedJson["modelDefinition"]["modelName"], - ); + id: parsedJson["id"], + serialNumber: parsedJson["assetSerialNo"], + number: parsedJson["assetNumber"], + modelDefinition: ModelDefinition.fromJson(parsedJson["modelDefinition"]), + hospital: Hospital.fromJson(parsedJson["site"]), + destBuildingName: parsedJson["destBuildingName"], + destDepartmentName: parsedJson["destDepartmentName"], + destRoom: parsedJson["destRoom"], + destFloor: parsedJson["destFloor"], + destSiteName: parsedJson['destSiteName'] + // parsedJson["modelDefinition"] == null ? "" : + // parsedJson["modelDefinition"]["manufacturerName"], + // model: parsedJson["modelDefinition"] == null ? "" : + // parsedJson["modelDefinition"]["modelName"], + ); } factory Device.fromDevice(Device device) { diff --git a/lib/models/engineer.dart b/lib/models/engineer.dart index ffedca72..e53b0af5 100644 --- a/lib/models/engineer.dart +++ b/lib/models/engineer.dart @@ -8,9 +8,9 @@ class Engineer { }); factory Engineer.fromJson(Map parsedJson) { - if(parsedJson==null) return Engineer(); + if (parsedJson == null) return Engineer(); return Engineer( - id: parsedJson["userId"] ?? parsedJson["id"], + id: parsedJson["userId"] ?? parsedJson["id"], name: parsedJson["userName"] ?? parsedJson["name"], ); } diff --git a/lib/models/fault_description.dart b/lib/models/fault_description.dart index ecc99f7f..4858e55f 100644 --- a/lib/models/fault_description.dart +++ b/lib/models/fault_description.dart @@ -1,9 +1,10 @@ class FaultDescription { FaultDescription({ - this.id, - this.defectName, - this.workPerformed, - this.estimatedTime,}); + this.id, + this.defectName, + this.workPerformed, + this.estimatedTime, + }); FaultDescription.fromJson(dynamic json) { id = json['id']; @@ -15,15 +16,18 @@ class FaultDescription { String defectName; String workPerformed; String estimatedTime; -FaultDescription copyWith({ num id, - String defectName, - String workPerformed, - String estimatedTime, -}) => FaultDescription( id: id ?? this.id, - defectName: defectName ?? this.defectName, - workPerformed: workPerformed ?? this.workPerformed, - estimatedTime: estimatedTime ?? this.estimatedTime, -); + FaultDescription copyWith({ + num id, + String defectName, + String workPerformed, + String estimatedTime, + }) => + FaultDescription( + id: id ?? this.id, + defectName: defectName ?? this.defectName, + workPerformed: workPerformed ?? this.workPerformed, + estimatedTime: estimatedTime ?? this.estimatedTime, + ); Map toJson() { final map = {}; map['id'] = id; @@ -32,5 +36,4 @@ FaultDescription copyWith({ num id, map['estimatedTime'] = estimatedTime; return map; } - -} \ No newline at end of file +} diff --git a/lib/models/subtitle.dart b/lib/models/subtitle.dart index 8a2689ad..09f6a4de 100644 --- a/lib/models/subtitle.dart +++ b/lib/models/subtitle.dart @@ -237,7 +237,6 @@ class Subtitle { String room; String actions; - void setIssues(List issues) { issues.clear(); issues.add(reason1); diff --git a/lib/views/pages/device_transfer/request_device_transfer.dart b/lib/views/pages/device_transfer/request_device_transfer.dart index 3d0cb755..5ec58012 100644 --- a/lib/views/pages/device_transfer/request_device_transfer.dart +++ b/lib/views/pages/device_transfer/request_device_transfer.dart @@ -245,7 +245,7 @@ class _RequestDeviceTransferState extends State { departments: _deviceTransferProvider?.floor?.departments, onSelect: (status) { _deviceTransferProvider.department = status; - _formModel.receiver.department = Department(id: status.id, name: status.name) ; + _formModel.receiver.department = Department(id: status.id, name: status.name); setState(() {}); }, ), @@ -261,7 +261,7 @@ class _RequestDeviceTransferState extends State { validator: (value) => Validator.isNumeric(value) ? null : "allow numbers only", textInputType: TextInputType.number, onSaved: (value) { - _deviceTransferProvider.room=value; + _deviceTransferProvider.room = value; }, ), 12.height, diff --git a/lib/views/pages/login.dart b/lib/views/pages/login.dart index e77b67da..a6fba23d 100644 --- a/lib/views/pages/login.dart +++ b/lib/views/pages/login.dart @@ -115,14 +115,13 @@ class _LoginState extends State { host: _settingProvider.host, ); if (status >= 200 && status < 300) { - if(_userProvider.user.isAuthenticated ?? false) { + if (_userProvider.user.isAuthenticated ?? false) { _settingProvider.setUser(_userProvider.user); Navigator.of(context).pushNamed(LandPage.id); } else { Fluttertoast.showToast(msg: _userProvider.user.message); } - // if (_userProvider.user.isActive) // else diff --git a/lib/views/pages/sub_workorder/search_sub_workorder_page.dart b/lib/views/pages/sub_workorder/search_sub_workorder_page.dart index 73d4618f..32fcec04 100644 --- a/lib/views/pages/sub_workorder/search_sub_workorder_page.dart +++ b/lib/views/pages/sub_workorder/search_sub_workorder_page.dart @@ -135,12 +135,10 @@ class _SearchSubWorkOrderPageState extends State { ), const SizedBox(height: 16), HospitalAutoCompleteField( - initialValue:_site, + initialValue: _site, onSearch: (value) { _site = value.name; - setState(() { - - }); + setState(() {}); }, ), const SizedBox(height: 16), diff --git a/lib/views/pages/sub_workorder/workorder_update.dart b/lib/views/pages/sub_workorder/workorder_update.dart index 9d9c5d6b..3970aeaa 100644 --- a/lib/views/pages/sub_workorder/workorder_update.dart +++ b/lib/views/pages/sub_workorder/workorder_update.dart @@ -55,7 +55,9 @@ class _WorkOrderUpdateState extends State { ], ), ), - WorkOrderDetails(item: widget.item,) + WorkOrderDetails( + item: widget.item, + ) ], ), ), diff --git a/lib/views/pages/user/land_page.dart b/lib/views/pages/user/land_page.dart index e6e9d608..3aa625e1 100644 --- a/lib/views/pages/user/land_page.dart +++ b/lib/views/pages/user/land_page.dart @@ -212,14 +212,14 @@ class _LandPageState extends State { Navigator.of(context).pushNamed(TrackDeviceTransferPage.id); }, ), - if (_userProvider?.user != null && _userProvider?.user?.type != UsersTypes.normal_user) - LandPageItem( - text: "Search Work Order", - svgPath: "assets/images/sub_workorder_icon.svg", - onPressed: () { - Navigator.of(context).pushNamed(SearchSubWorkOrderPage.id); - }, - ), + if (_userProvider?.user != null && _userProvider?.user?.type != UsersTypes.normal_user) + LandPageItem( + text: "Search Work Order", + svgPath: "assets/images/sub_workorder_icon.svg", + onPressed: () { + Navigator.of(context).pushNamed(SearchSubWorkOrderPage.id); + }, + ), ], ), ], diff --git a/lib/views/pages/user/requests/report/edit_service_report.dart b/lib/views/pages/user/requests/report/edit_service_report.dart index b0cc2bc4..7cd53f7a 100644 --- a/lib/views/pages/user/requests/report/edit_service_report.dart +++ b/lib/views/pages/user/requests/report/edit_service_report.dart @@ -104,7 +104,7 @@ class _EditServiceReportState extends State with TickerProvid getRequestForWorkOrder(); } _serviceReport.assetType = _assetTypeProvider.statuses?.firstWhere( - (element) => element.value == _callRequestForWorkOrder?.assetType, + (element) => element.value == _callRequestForWorkOrder?.assetType, orElse: () => null, ); _subtitle = AppLocalization.of(context).subtitle; @@ -158,15 +158,15 @@ class _EditServiceReportState extends State with TickerProvid widget.request.deviceSerialNumber == null ? const SizedBox() : ASubTitle( - "${_subtitle.deviceSN}: ${widget.request.deviceSerialNumber}", - font: 14, - ), + "${_subtitle.deviceSN}: ${widget.request.deviceSerialNumber}", + font: 14, + ), Text( "${_subtitle.customer}: ${widget.request.hospitalName}", style: Theme.of(context).textTheme.subtitle1.copyWith( - fontWeight: FontWeight.bold, - fontSize: 12, - ), + fontWeight: FontWeight.bold, + fontSize: 12, + ), textScaleFactor: AppStyle.getScaleFactor(context), ) ], @@ -226,9 +226,9 @@ class _EditServiceReportState extends State with TickerProvid ASubTitle(_subtitle.visitDate), _validate && _serviceReport.visitDate == null ? ASubTitle( - _subtitle.requiredWord, - color: Colors.red, - ) + _subtitle.requiredWord, + color: Colors.red, + ) : const SizedBox.shrink(), Row( children: [ @@ -262,9 +262,9 @@ class _EditServiceReportState extends State with TickerProvid ASubTitle(_subtitle.deviceSN), _validate && _serviceReport.device?.id == null ? ASubTitle( - _subtitle.requiredWord, - color: Colors.red, - ) + _subtitle.requiredWord, + color: Colors.red, + ) : const SizedBox.shrink(), AutoCompleteDeviceField( hospitalId: widget.request.hospitalId, @@ -281,9 +281,9 @@ class _EditServiceReportState extends State with TickerProvid ASubTitle(_subtitle.AssetType), _validate && _serviceReport.assetType == null ? ASubTitle( - _subtitle.requiredWord, - color: Colors.red, - ) + _subtitle.requiredWord, + color: Colors.red, + ) : const SizedBox.shrink(), const SizedBox( height: 4, @@ -296,7 +296,7 @@ class _EditServiceReportState extends State with TickerProvid _assetTypeProvider.reset(); await _assetTypeProvider.getTypes(user: _userProvider.user, host: _settingProvider.host); _serviceReport?.assetType = _assetTypeProvider.statuses?.firstWhere( - (element) => element.value == _callRequestForWorkOrder.assetType, + (element) => element.value == _callRequestForWorkOrder.assetType, orElse: () => null, ); }, @@ -327,9 +327,9 @@ class _EditServiceReportState extends State with TickerProvid ASubTitle("Equipment Status"), _validate && _serviceReport.equipmentStatus == null ? ASubTitle( - _subtitle.requiredWord, - color: Colors.red, - ) + _subtitle.requiredWord, + color: Colors.red, + ) : const SizedBox.shrink(), const SizedBox( height: 4, @@ -367,9 +367,9 @@ class _EditServiceReportState extends State with TickerProvid ASubTitle(_subtitle.callLastSituation), _validate && _serviceReport.callLastSituation == null ? ASubTitle( - _subtitle.requiredWord, - color: Colors.red, - ) + _subtitle.requiredWord, + color: Colors.red, + ) : const SizedBox.shrink(), const SizedBox(height: 4), ServiceReportLastCallsMenu( @@ -504,54 +504,54 @@ class _EditServiceReportState extends State with TickerProvid _serviceReport.callLastSituation?.value != 12 ? const SizedBox.shrink() : Row( - children: [ - Expanded( - child: Column( - crossAxisAlignment: CrossAxisAlignment.start, children: [ - ASubTitle(_subtitle.invoiceNumber), - const SizedBox( - height: 8, - ), - ATextFormField( - initialValue: _serviceReport?.invoiceNumber, - textAlign: TextAlign.center, - style: Theme.of(context).textTheme.subtitle1, - validator: (value) => Validator.hasValue(value) ? null : _subtitle.requiredWord, - textInputType: TextInputType.number, - onSaved: (value) { - _serviceReport.invoiceNumber = value; - }, + Expanded( + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + ASubTitle(_subtitle.invoiceNumber), + const SizedBox( + height: 8, + ), + ATextFormField( + initialValue: _serviceReport?.invoiceNumber, + textAlign: TextAlign.center, + style: Theme.of(context).textTheme.subtitle1, + validator: (value) => Validator.hasValue(value) ? null : _subtitle.requiredWord, + textInputType: TextInputType.number, + onSaved: (value) { + _serviceReport.invoiceNumber = value; + }, + ), + ], + ), ), - ], - ), - ), - const SizedBox( - width: 8, - ), - Expanded( - child: Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - ASubTitle(_subtitle.invoiceCode), const SizedBox( - height: 4, + width: 8, ), - ATextFormField( - initialValue: _serviceReport?.invoiceCode, - textAlign: TextAlign.center, - style: Theme.of(context).textTheme.subtitle1, - validator: (value) => Validator.hasValue(value) ? null : _subtitle.requiredWord, - textInputType: TextInputType.text, - onSaved: (value) { - _serviceReport.invoiceCode = value; - }, + Expanded( + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + ASubTitle(_subtitle.invoiceCode), + const SizedBox( + height: 4, + ), + ATextFormField( + initialValue: _serviceReport?.invoiceCode, + textAlign: TextAlign.center, + style: Theme.of(context).textTheme.subtitle1, + validator: (value) => Validator.hasValue(value) ? null : _subtitle.requiredWord, + textInputType: TextInputType.text, + onSaved: (value) { + _serviceReport.invoiceCode = value; + }, + ), + ], + ), ), ], ), - ), - ], - ), // const SizedBox(height: 8,), // Row( @@ -958,9 +958,9 @@ class _EditServiceReportState extends State with TickerProvid ASubTitle(_subtitle.partNumber), _validate && _serviceReport.parts == null ? ASubTitle( - _subtitle.requiredWord, - color: Colors.red, - ) + _subtitle.requiredWord, + color: Colors.red, + ) : const SizedBox.shrink(), const SizedBox( height: 4, diff --git a/lib/views/pages/user/requests/report/future_service_report.dart b/lib/views/pages/user/requests/report/future_service_report.dart index c391b669..cb39a6e3 100644 --- a/lib/views/pages/user/requests/report/future_service_report.dart +++ b/lib/views/pages/user/requests/report/future_service_report.dart @@ -31,8 +31,7 @@ class _FutureServiceReportState extends State { _userProvider = Provider.of(context); _settingProvider = Provider.of(context); Subtitle _subtitle = AppLocalization.of(context).subtitle; - ServiceRequestsProvider().getSingleServiceReport(reportId: widget.workOrder.id, user: _userProvider.user, host: _settingProvider.host, subtitle: _subtitle) - ; + ServiceRequestsProvider().getSingleServiceReport(reportId: widget.workOrder.id, user: _userProvider.user, host: _settingProvider.host, subtitle: _subtitle); return Scaffold( body: FutureBuilder( future: ServiceRequestsProvider().getSingleServiceReport(reportId: widget.workOrder.id, user: _userProvider.user, host: _settingProvider.host, subtitle: _subtitle), diff --git a/lib/views/pages/user/requests/request_details.dart b/lib/views/pages/user/requests/request_details.dart index cfe8ec93..18b4700f 100644 --- a/lib/views/pages/user/requests/request_details.dart +++ b/lib/views/pages/user/requests/request_details.dart @@ -345,7 +345,7 @@ class RequestDetailsPage extends StatelessWidget { title: _subtitle.visitDate, info: workOrders[index].visitDate, ), - RequestInfoRow(title: _subtitle.assignedEmployee, info: workOrders[index].assignedEmployee?.name??""), + RequestInfoRow(title: _subtitle.assignedEmployee, info: workOrders[index].assignedEmployee?.name ?? ""), RequestInfoRow( title: _subtitle.assetSN, info: workOrders[index].callRequest.asset.assetSerialNo, diff --git a/lib/views/pages/user/visits/visit_details.dart b/lib/views/pages/user/visits/visit_details.dart index a787be18..73cb60d4 100644 --- a/lib/views/pages/user/visits/visit_details.dart +++ b/lib/views/pages/user/visits/visit_details.dart @@ -47,19 +47,19 @@ class VisitDetailsPage extends StatelessWidget { ), ), if (_userProvider?.user?.type == UsersTypes.engineer) - AIconButton( - iconData: Icons.edit, - color: AColors.white, - buttonSize: 42, - backgroundColor: AColors.green, - onPressed: () async { - Navigator.of(context).push(MaterialPageRoute( - builder: (_) => EditPentry( - visit: visit, - pentry: visit.pentry, - ))); - }, - ), + AIconButton( + iconData: Icons.edit, + color: AColors.white, + buttonSize: 42, + backgroundColor: AColors.green, + onPressed: () async { + Navigator.of(context).push(MaterialPageRoute( + builder: (_) => EditPentry( + visit: visit, + pentry: visit.pentry, + ))); + }, + ), SizedBox(width: 42) ], ), diff --git a/lib/views/widgets/date_and_time/time_picker.dart b/lib/views/widgets/date_and_time/time_picker.dart index 036766e4..63648225 100644 --- a/lib/views/widgets/date_and_time/time_picker.dart +++ b/lib/views/widgets/date_and_time/time_picker.dart @@ -20,7 +20,7 @@ class ADateTimePicker extends StatelessWidget { ), ), child: Text( - date == null ? "Pick Time" : date.toString().substring(0,date.toString().lastIndexOf(":")), + date == null ? "Pick Time" : date.toString().substring(0, date.toString().lastIndexOf(":")), textScaleFactor: AppStyle.getScaleFactor(context), ), onPressed: () async { diff --git a/lib/views/widgets/equipment/single_device_picker.dart b/lib/views/widgets/equipment/single_device_picker.dart index 2fdecf87..722d2f21 100644 --- a/lib/views/widgets/equipment/single_device_picker.dart +++ b/lib/views/widgets/equipment/single_device_picker.dart @@ -106,7 +106,8 @@ class _SingleDevicePickerState extends State { ), const SizedBox( height: 8, - ),ATextFormField( + ), + ATextFormField( hintText: _subtitle.searchBySn, controller: snController, style: Theme.of(context).textTheme.subtitle1, @@ -120,7 +121,6 @@ class _SingleDevicePickerState extends State { _searchableList.addAll(_devicesProvider.devices); }, ), - ], ), ), diff --git a/lib/views/widgets/status/report/fault_desc_menu.dart b/lib/views/widgets/status/report/fault_desc_menu.dart index 5229aff5..a2b670de 100644 --- a/lib/views/widgets/status/report/fault_desc_menu.dart +++ b/lib/views/widgets/status/report/fault_desc_menu.dart @@ -44,10 +44,8 @@ class _SingleStatusMenuState extends State { @override void initState() { - if (widget.initialStatus != null) { final result = widget.statuses?.where((element) { - return element.id == widget.initialStatus.id; }); if (result.isNotEmpty) _selectedStatus = result.first; From f583151345d25cb7fefb1293316ea3f27d3905b9 Mon Sep 17 00:00:00 2001 From: nextwo <1234> Date: Wed, 12 Jul 2023 09:11:08 +0300 Subject: [PATCH 122/181] show images in the app + search list issue --- lib/views/pages/device_transfer/update_device_transfer.dart | 3 ++- lib/views/widgets/equipment/single_device_picker.dart | 3 +++ 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/lib/views/pages/device_transfer/update_device_transfer.dart b/lib/views/pages/device_transfer/update_device_transfer.dart index 061b5d21..bf722b0d 100644 --- a/lib/views/pages/device_transfer/update_device_transfer.dart +++ b/lib/views/pages/device_transfer/update_device_transfer.dart @@ -190,7 +190,8 @@ class _UpdateDeviceTransferState extends State { const SizedBox( height: 8, ), - const ASubTitle("Signature"), + //const ASubTitle("Signature"), + Text("widget.model.sender.signature"), // if(_validate && _formModel.signature == null) // ASubTitle(_subtitle.requiredWord,color: Colors.red,), const SizedBox( diff --git a/lib/views/widgets/equipment/single_device_picker.dart b/lib/views/widgets/equipment/single_device_picker.dart index 722d2f21..508601bd 100644 --- a/lib/views/widgets/equipment/single_device_picker.dart +++ b/lib/views/widgets/equipment/single_device_picker.dart @@ -27,6 +27,7 @@ class _SingleDevicePickerState extends State { UserProvider _userProvider; SettingProvider _settingProvider; List _searchableList = []; + List _initList = []; bool _firstTime = true; Subtitle _subtitle; @@ -58,6 +59,7 @@ class _SingleDevicePickerState extends State { void dispose() { numberController.dispose(); snController.dispose(); + _devicesProvider.reset(); super.dispose(); } @@ -70,6 +72,7 @@ class _SingleDevicePickerState extends State { if (_firstTime && _devicesProvider.devices != null) { _searchableList.clear(); _searchableList.addAll(_devicesProvider.devices); + _initList.addAll(_devicesProvider.devices); } _subtitle = AppLocalization.of(context).subtitle; return Scaffold( From d4ea2d4c58c8d603df705c8ac82a7261acf38f2e Mon Sep 17 00:00:00 2001 From: nextwo <1234> Date: Wed, 12 Jul 2023 09:36:21 +0300 Subject: [PATCH 123/181] show images in the app + search list issue --- lib/views/pages/device_transfer/update_device_transfer.dart | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/lib/views/pages/device_transfer/update_device_transfer.dart b/lib/views/pages/device_transfer/update_device_transfer.dart index bf722b0d..061b5d21 100644 --- a/lib/views/pages/device_transfer/update_device_transfer.dart +++ b/lib/views/pages/device_transfer/update_device_transfer.dart @@ -190,8 +190,7 @@ class _UpdateDeviceTransferState extends State { const SizedBox( height: 8, ), - //const ASubTitle("Signature"), - Text("widget.model.sender.signature"), + const ASubTitle("Signature"), // if(_validate && _formModel.signature == null) // ASubTitle(_subtitle.requiredWord,color: Colors.red,), const SizedBox( From be6a418bb63a00b28925c07d597b2e9fa224b058 Mon Sep 17 00:00:00 2001 From: Sikander Saleem Date: Wed, 12 Jul 2023 10:22:28 +0300 Subject: [PATCH 124/181] sender & receiver transfer edit login update & fixes --- assets/subtitles/ar_subtitle.json | 23 +++------ assets/subtitles/en_subtitle.json | 23 +++------ lib/models/subtitle.dart | 6 +-- .../device_transfer_details.dart | 51 ++++++++++--------- .../report/create_service_report.dart | 2 +- .../requests/report/edit_service_report.dart | 2 +- .../pages/user/requests/request_details.dart | 2 +- 7 files changed, 49 insertions(+), 60 deletions(-) diff --git a/assets/subtitles/ar_subtitle.json b/assets/subtitles/ar_subtitle.json index e08d914f..16cad068 100644 --- a/assets/subtitles/ar_subtitle.json +++ b/assets/subtitles/ar_subtitle.json @@ -3,8 +3,6 @@ "failed_request_message": "الفشل في إكمال الطلب", "successful_request_message": "تم إكمال الطلب بنجاح", "request_lock_message": "انتظر حتى إكمال الطلب", - - "cancel": "إلغاء", "confirm": "تاكيد", "done": "تم", @@ -13,7 +11,6 @@ "sign_out": "تسجيل الخروج", "logout_alert": "هل انت متاكد من رغبتك في تسجيل الخروج؟", "language": "اللغة", - "name": "الاسم", "email": "البريد الالكتروني", "phone_number": "رقم الهاتف", @@ -29,7 +26,6 @@ "confirm_password_validate_message": "كلمة المرور و تاكيد كلمة المرور غير متطابقان", "phone_number_validate_message": "رقم الهاتف غير صالح", "terms_and_conditions_validate_message": "موافقة علي الشروط والاحكام مطاوبة", - "update": "تحديث", "step": "خطوة", "forget_password_with_mark": "نسيت كلمة المرور؟", @@ -59,7 +55,6 @@ "title_not_found": "لا يوجد عنوان", "title_validate_message": "العنوان مطلوب", "url_not_found": "لا يوجد رابط", - "date": "تاريخ", "status": "الحالة", "code": "كود", @@ -134,7 +129,6 @@ "visitDate": "تاريخ الزيارة", "whatsApp": "واتساب", "workPerformed": "العمل انجز", - "actualDate": "تاريخ الفعلي", "expectDate": "التاريخ المتوقع", "images": "الصور", @@ -164,7 +158,6 @@ "requiredImage": "الصورة مطلوبة", "taskStatus": "حالة الطلب", "activationAlert": "الحساب قيد المراجعة يرجى الانتظار حتى يتم تفعيله", - "attachImage": "ارفق صورة", "callLastSituation": "اخر موقف للطلب", "customer": "العميل", @@ -195,14 +188,14 @@ "site": "الموقع", "maintenanceSituation": "موقع الصيانه", "currentSituation": "الموقع الحالي", - "comment" : "تعليق", - "updateServiceRequest" : "تعديل طلب الخدمة", - "repairLocation" : "موقع الإصلاح", - "travelingExpense" : "مصاريف التنقل", - "startDate" : "وقت البدء", - "requestedQuantity" : "الكمية المطلوبة", - "deliveredQuantity" : "الكمية المسلّمة", - "endDate" : "وقت الانتهاء", + "comment": "تعليق", + "updateServiceRequest": "تعديل طلب الخدمة", + "repairLocation": "موقع الإصلاح", + "travelingExpense": "مصاريف التنقل", + "startDate": "وقت البدء", + "requestedQuantity": "الكمية المطلوبة", + "deliveredQuantity": "الكمية المسلّمة", + "endDate": "وقت الانتهاء", "destinationSite": "موقع الوجهه", "building": "بناء", "floor": "طابق", diff --git a/assets/subtitles/en_subtitle.json b/assets/subtitles/en_subtitle.json index 44e03fa6..d1412bf5 100644 --- a/assets/subtitles/en_subtitle.json +++ b/assets/subtitles/en_subtitle.json @@ -3,7 +3,6 @@ "failed_request_message": "Failed to complete request", "successful_request_message": "Request complete successfully", "request_lock_message": "Wait until your request complete", - "cancel": "Cancel", "confirm": "Confirm", "done": "Done", @@ -12,7 +11,6 @@ "sign_out": "Sign Out", "logout_alert": "Are you sure you want to Sign Out?", "language": "English", - "name": "Name", "email": "Email", "phone_number": "Phone Number", @@ -28,7 +26,6 @@ "confirm_password_validate_message": "Password and confirm password not match", "phone_number_validate_message": "Not valid phone number", "terms_and_conditions_validate_message": "Accept terms and conditions is required", - "update": "Update", "step": "Step", "forget_password_with_mark": "Forget Password?", @@ -58,7 +55,6 @@ "title_not_found": "Title not found", "title_validate_message": "Title Can't be empty", "url_not_found": "URL not found", - "date": "Date", "status": "Status", "code": "Code", @@ -133,7 +129,6 @@ "visitDate": "Visit Date", "whatsApp": "WhatsApp", "workPerformed": "Work Performed", - "actualDate": "Actual Date", "expectDate": "Expect Date", "images": "Images", @@ -163,7 +158,6 @@ "requiredImage": "Image Required", "taskStatus": "Task Status", "activationAlert": "Account under reviewing please wait until be activated", - "attachImage": "Attach Image", "callLastSituation": "Call's Last Situation", "customer": "Customer", @@ -180,7 +174,7 @@ "reportType": "Report Type", "callId": "Call Id", "requiredWord": "required", - "AssetType": "asset type", + "AssetType": "Asset Type", "workPreformed": "Work Preformed", "orderWorkNumber": "Order Work Number", "assignedEmployee": "Assigned Employee", @@ -190,19 +184,18 @@ "site": "Site", "maintenanceSituation": "Maintenance Situation", "currentSituation": "Current Situation", - "alert": "Alert", "duplicateAlert": "Duplicate Alert", "duplicateAlertMessage": "Are you sure you want to duplicate request?", "duplicateRequest": "Duplicate Request", - "comment" : "Comment", - "updateServiceRequest" : "Update Service Request", - "repairLocation" : "Repair Location", + "comment": "Comment", + "updateServiceRequest": "Update Service Request", + "repairLocation": "Repair Location", "travelingExpense": "Traveling Expense", - "startDate" : "Start Date", - "requestedQuantity" : "Requested Quantity", - "deliveredQuantity" : "Delivered Quantity", - "endDate" : "End Date", + "startDate": "Start Date", + "requestedQuantity": "Requested Quantity", + "deliveredQuantity": "Delivered Quantity", + "endDate": "End Date", "destinationSite": "Destination Site", "building": "Building", "floor": "Floor", diff --git a/lib/models/subtitle.dart b/lib/models/subtitle.dart index 09f6a4de..4007a7cb 100644 --- a/lib/models/subtitle.dart +++ b/lib/models/subtitle.dart @@ -196,7 +196,7 @@ class Subtitle { String customer; String reportType; String requiredWord; - String AssetType; + String assetType; String reportStatus; String callLastSituation; String invoiceNumber; @@ -421,7 +421,7 @@ class Subtitle { @required this.reasons, @required this.reportStatus, @required this.reportType, - @required this.AssetType, + @required this.assetType, @required this.workPreformed, @required this.alert, @required this.duplicateAlert, @@ -625,7 +625,7 @@ class Subtitle { reportType: parsedJson["reportType"], callId: parsedJson["callId"], requiredWord: parsedJson["requiredWord"], - AssetType: parsedJson["serviceType"], + assetType: parsedJson["AssetType"], workPreformed: parsedJson["workPreformed"], alert: parsedJson["alert"], duplicateAlert: parsedJson["duplicateAlert"], diff --git a/lib/views/pages/device_transfer/device_transfer_details.dart b/lib/views/pages/device_transfer/device_transfer_details.dart index 74ff48e7..75892db3 100644 --- a/lib/views/pages/device_transfer/device_transfer_details.dart +++ b/lib/views/pages/device_transfer/device_transfer_details.dart @@ -18,6 +18,7 @@ import 'package:test_sa/views/widgets/requests/info_row.dart'; class DeviceTransferDetails extends StatefulWidget { final DeviceTransfer model; + const DeviceTransferDetails({Key key, this.model}) : super(key: key); @override @@ -47,8 +48,8 @@ class _DeviceTransferDetailsState extends State { _userProvider = Provider.of(context); _settingProvider = Provider.of(context); _deviceTransferProvider = Provider.of(context); - _isSender = _userProvider.user.id == widget.model.sender?.userId; - _isReceiver = _userProvider.user.id == widget.model.receiver?.userId; + _isSender = _userProvider.user.userID == widget.model.sender?.userId; + _isReceiver = _userProvider.user.userID == widget.model.receiver?.userId; return Scaffold( key: _scaffoldKey, body: SafeArea( @@ -131,17 +132,18 @@ class _DeviceTransferDetailsState extends State { Expanded( child: Text("Sender", style: Theme.of(context).textTheme.headline6), ), - if (_isSender || true) - ASmallButton( - text: _subtitle.edit, - onPressed: () { - Navigator.of(context).push(MaterialPageRoute( - builder: (_) => UpdateDeviceTransfer( - model: widget.model, - isSender: true, - ))); - }, - ), + ASmallButton( + text: _subtitle.edit, + onPressed: (_isSender || false) + ? () { + Navigator.of(context).push(MaterialPageRoute( + builder: (_) => UpdateDeviceTransfer( + model: widget.model, + isSender: true, + ))); + } + : null, + ), ], ), const SizedBox(height: 12), @@ -154,17 +156,18 @@ class _DeviceTransferDetailsState extends State { Expanded( child: Text("Receiver", style: Theme.of(context).textTheme.headline6), ), - if (_isReceiver || true) - ASmallButton( - text: _subtitle.edit, - onPressed: () { - Navigator.of(context).push(MaterialPageRoute( - builder: (_) => UpdateDeviceTransfer( - model: widget.model, - isSender: false, - ))); - }, - ), + ASmallButton( + text: _subtitle.edit, + onPressed: (_isReceiver || false) + ? () { + Navigator.of(context).push(MaterialPageRoute( + builder: (_) => UpdateDeviceTransfer( + model: widget.model, + isSender: false, + ))); + } + : null, + ), ], ), const SizedBox(height: 12), diff --git a/lib/views/pages/user/requests/report/create_service_report.dart b/lib/views/pages/user/requests/report/create_service_report.dart index b8fa12e9..8ff8b431 100644 --- a/lib/views/pages/user/requests/report/create_service_report.dart +++ b/lib/views/pages/user/requests/report/create_service_report.dart @@ -281,7 +281,7 @@ class _CreateServiceReportState extends State with TickerPr const SizedBox( height: 8, ), - ASubTitle(_subtitle.AssetType), + ASubTitle(_subtitle.assetType ??""), _validate && _serviceReport.assetType == null ? ASubTitle( _subtitle.requiredWord, diff --git a/lib/views/pages/user/requests/report/edit_service_report.dart b/lib/views/pages/user/requests/report/edit_service_report.dart index 7cd53f7a..5cba224b 100644 --- a/lib/views/pages/user/requests/report/edit_service_report.dart +++ b/lib/views/pages/user/requests/report/edit_service_report.dart @@ -278,7 +278,7 @@ class _EditServiceReportState extends State with TickerProvid ), ), const SizedBox(height: 8), - ASubTitle(_subtitle.AssetType), + ASubTitle(_subtitle.assetType), _validate && _serviceReport.assetType == null ? ASubTitle( _subtitle.requiredWord, diff --git a/lib/views/pages/user/requests/request_details.dart b/lib/views/pages/user/requests/request_details.dart index 18b4700f..61e835b2 100644 --- a/lib/views/pages/user/requests/request_details.dart +++ b/lib/views/pages/user/requests/request_details.dart @@ -397,7 +397,7 @@ class RequestDetailsPage extends StatelessWidget { child: Padding( padding: const EdgeInsets.all(32), child: AButton( - text: "Create Report", + text: "Create Work Order", onPressed: () { Navigator.of(context).push(MaterialPageRoute(builder: (_) => CreateServiceReport(request: serviceRequest))); }, From 5890835f7b65423ae68eb64fa299cb7e33f84694 Mon Sep 17 00:00:00 2001 From: zaid_daoud Date: Wed, 12 Jul 2023 15:25:07 +0300 Subject: [PATCH 125/181] Simple Changes --- lib/models/device/device_transfer.dart | 17 +++--- .../device_transfer_details.dart | 52 ++++++++++--------- .../pages/user/visits/visit_details.dart | 28 +++++----- .../device_transfer_info_section.dart | 6 ++- 4 files changed, 57 insertions(+), 46 deletions(-) diff --git a/lib/models/device/device_transfer.dart b/lib/models/device/device_transfer.dart index c585a8c0..9c0d3e28 100644 --- a/lib/models/device/device_transfer.dart +++ b/lib/models/device/device_transfer.dart @@ -48,14 +48,15 @@ class DeviceTransfer { title: parsedJson["transferCode"], userId: parsedJson["uid"], device: Device( - id: parsedJson["assetId"], - number: parsedJson["assetNumber"], - serialNumber: parsedJson["assetSerialNo"], - destBuildingName: parsedJson["destBuildingName"], - destDepartmentName: parsedJson["destDepartmentName"], - destFloor: parsedJson["destFloor"], - destRoom: parsedJson["destRoom"], - destSiteName: parsedJson["destSiteName"]), + id: parsedJson["assetId"], + number: parsedJson["assetNumber"], + serialNumber: parsedJson["assetSerialNo"], + destBuildingName: parsedJson["destBuildingName"], + destDepartmentName: parsedJson["destDepartmentName"], + destFloor: parsedJson["destFloorName"], + destRoom: parsedJson["destRoom"], + destSiteName: parsedJson["destSiteName"], + ), sender: DeviceTransferInfo( travelingHours: parsedJson["senderTravelingHours"], comment: parsedJson["senderComment"], diff --git a/lib/views/pages/device_transfer/device_transfer_details.dart b/lib/views/pages/device_transfer/device_transfer_details.dart index 75892db3..e9d0a93d 100644 --- a/lib/views/pages/device_transfer/device_transfer_details.dart +++ b/lib/views/pages/device_transfer/device_transfer_details.dart @@ -16,6 +16,8 @@ import 'package:test_sa/views/widgets/device_trancfer/device_transfer_info_secti import 'package:test_sa/views/widgets/loaders/loading_manager.dart'; import 'package:test_sa/views/widgets/requests/info_row.dart'; +import '../../../models/enums/user_types.dart'; + class DeviceTransferDetails extends StatefulWidget { final DeviceTransfer model; @@ -132,18 +134,19 @@ class _DeviceTransferDetailsState extends State { Expanded( child: Text("Sender", style: Theme.of(context).textTheme.headline6), ), - ASmallButton( - text: _subtitle.edit, - onPressed: (_isSender || false) - ? () { - Navigator.of(context).push(MaterialPageRoute( - builder: (_) => UpdateDeviceTransfer( - model: widget.model, - isSender: true, - ))); - } - : null, - ), + if (_userProvider.user?.type == UsersTypes.engineer) + ASmallButton( + text: _subtitle.edit, + onPressed: (_isSender || false) + ? () { + Navigator.of(context).push(MaterialPageRoute( + builder: (_) => UpdateDeviceTransfer( + model: widget.model, + isSender: true, + ))); + } + : null, + ), ], ), const SizedBox(height: 12), @@ -156,18 +159,19 @@ class _DeviceTransferDetailsState extends State { Expanded( child: Text("Receiver", style: Theme.of(context).textTheme.headline6), ), - ASmallButton( - text: _subtitle.edit, - onPressed: (_isReceiver || false) - ? () { - Navigator.of(context).push(MaterialPageRoute( - builder: (_) => UpdateDeviceTransfer( - model: widget.model, - isSender: false, - ))); - } - : null, - ), + if (_userProvider.user?.type == UsersTypes.engineer) + ASmallButton( + text: _subtitle.edit, + onPressed: (_isReceiver || false) + ? () { + Navigator.of(context).push(MaterialPageRoute( + builder: (_) => UpdateDeviceTransfer( + model: widget.model, + isSender: false, + ))); + } + : null, + ), ], ), const SizedBox(height: 12), diff --git a/lib/views/pages/user/visits/visit_details.dart b/lib/views/pages/user/visits/visit_details.dart index 73cb60d4..d6635358 100644 --- a/lib/views/pages/user/visits/visit_details.dart +++ b/lib/views/pages/user/visits/visit_details.dart @@ -73,19 +73,21 @@ class VisitDetailsPage extends StatelessWidget { ), MaterialButton( padding: EdgeInsets.zero, - onPressed: () { - Navigator.of(context).push(MaterialPageRoute( - builder: (_) => Scaffold( - body: InteractiveViewer( - child: Center( - child: ImageLoader( - url: visit.images.first, - boxFit: BoxFit.contain, - ), - ), - ), - ))); - }, + onPressed: visit.images.isEmpty || (visit.images?.first?.isEmpty ?? false) + ? () {} + : () { + Navigator.of(context).push(MaterialPageRoute( + builder: (_) => Scaffold( + body: InteractiveViewer( + child: Center( + child: ImageLoader( + url: visit.images.first, + boxFit: BoxFit.contain, + ), + ), + ), + ))); + }, child: SizedBox( height: 140 * AppStyle.getScaleFactor(context), width: MediaQuery.of(context).size.width, diff --git a/lib/views/widgets/device_trancfer/device_transfer_info_section.dart b/lib/views/widgets/device_trancfer/device_transfer_info_section.dart index 1a8da07b..9763feee 100644 --- a/lib/views/widgets/device_trancfer/device_transfer_info_section.dart +++ b/lib/views/widgets/device_trancfer/device_transfer_info_section.dart @@ -1,4 +1,5 @@ import 'package:flutter/material.dart'; +import 'package:provider/provider.dart'; import 'package:test_sa/controllers/localization/localization.dart'; import 'package:test_sa/models/device/device_transfer_info.dart'; import 'package:test_sa/views/app_style/colors.dart'; @@ -6,6 +7,8 @@ import 'package:test_sa/views/widgets/loaders/image_loader.dart'; import 'package:test_sa/views/widgets/requests/info_row.dart'; import 'package:test_sa/views/widgets/requests/request_status.dart'; +import '../../../controllers/providers/api/user_provider.dart'; + class DeviceTransferInfoSection extends StatelessWidget { final DeviceTransferInfo info; final VoidCallback onEdit; @@ -13,6 +16,7 @@ class DeviceTransferInfoSection extends StatelessWidget { @override Widget build(BuildContext context) { + UserProvider userProvider = Provider.of(context); final subtitle = AppLocalization.of(context).subtitle; return Column( children: [ @@ -26,7 +30,7 @@ class DeviceTransferInfoSection extends StatelessWidget { ), RequestInfoRow( title: subtitle.engineerName, - info: info.userName, + info: userProvider.user.username, ), RequestInfoRow( title: subtitle.workingHours, From 2a85d6b355a90cb408ebe874d93c5a785932c8a3 Mon Sep 17 00:00:00 2001 From: zaid_daoud Date: Wed, 12 Jul 2023 15:27:59 +0300 Subject: [PATCH 126/181] Simple Changes --- .../widgets/device_trancfer/device_transfer_info_section.dart | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lib/views/widgets/device_trancfer/device_transfer_info_section.dart b/lib/views/widgets/device_trancfer/device_transfer_info_section.dart index 9763feee..556cfec8 100644 --- a/lib/views/widgets/device_trancfer/device_transfer_info_section.dart +++ b/lib/views/widgets/device_trancfer/device_transfer_info_section.dart @@ -16,7 +16,7 @@ class DeviceTransferInfoSection extends StatelessWidget { @override Widget build(BuildContext context) { - UserProvider userProvider = Provider.of(context); + info.userName = Provider.of(context).user.username; final subtitle = AppLocalization.of(context).subtitle; return Column( children: [ @@ -30,7 +30,7 @@ class DeviceTransferInfoSection extends StatelessWidget { ), RequestInfoRow( title: subtitle.engineerName, - info: userProvider.user.username, + info: info.userName, ), RequestInfoRow( title: subtitle.workingHours, From 3066fe9cea23c148eacf221cfcfc99459ff1ce61 Mon Sep 17 00:00:00 2001 From: zaid_daoud Date: Wed, 12 Jul 2023 15:56:45 +0300 Subject: [PATCH 127/181] Simple Changes --- lib/views/pages/user/requests/create_request.dart | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/views/pages/user/requests/create_request.dart b/lib/views/pages/user/requests/create_request.dart index bcd45204..63c426e0 100644 --- a/lib/views/pages/user/requests/create_request.dart +++ b/lib/views/pages/user/requests/create_request.dart @@ -306,7 +306,7 @@ class CreateRequestPageState extends State { Fluttertoast.showToast(msg: _subtitle.pickDevice); return; } - if (_serviceRequest.firstAction.name == "Need a visit" && _dateTime == null) { + if (_serviceRequest.firstAction?.name == "Need a visit" && _dateTime == null) { Fluttertoast.showToast(msg: _subtitle.noDateFound); return; } From da286ea075ef32ac1ed6a308e9e13221a010f825 Mon Sep 17 00:00:00 2001 From: Sikander Saleem Date: Wed, 12 Jul 2023 17:33:04 +0300 Subject: [PATCH 128/181] fixes --- .../providers/api/service_requests_provider.dart | 6 +++--- lib/models/service_report.dart | 2 +- lib/models/service_request/service_request.dart | 2 ++ lib/views/pages/user/requests/create_request.dart | 2 +- 4 files changed, 7 insertions(+), 5 deletions(-) diff --git a/lib/controllers/providers/api/service_requests_provider.dart b/lib/controllers/providers/api/service_requests_provider.dart index edf5a749..eadd6340 100644 --- a/lib/controllers/providers/api/service_requests_provider.dart +++ b/lib/controllers/providers/api/service_requests_provider.dart @@ -227,8 +227,8 @@ class ServiceRequestsProvider extends ChangeNotifier { "id": request.id, "callNo": serviceRequest['callNo'], "callCreatedBy": serviceRequest['callCreatedBy'], - "requestedDate": date?.toIso8601String() ?? "", - "requestedTime": date?.toIso8601String() ?? "", + "requestedDate": request.date ?? "", + "requestedTime": request.date ?? "", "priority": request.priority?.toMap(), "defectType": request.defectType?.toMap(), "typeofRequest": request.type?.toMap(), @@ -259,7 +259,7 @@ class ServiceRequestsProvider extends ChangeNotifier { "firstAction": request.firstAction?.toMap(), "loanAvailablity": request.loanAvailability?.toMap(), "comments": request.reviewComment, - "firstActionDate": serviceRequest['firstActionDate'], + "firstActionDate": date?.toIso8601String(), "visitDate": date?.toIso8601String() ?? "", "callReview": null, "reviewComment": null, diff --git a/lib/models/service_report.dart b/lib/models/service_report.dart index 0ad3b7ad..a8284224 100644 --- a/lib/models/service_report.dart +++ b/lib/models/service_report.dart @@ -104,7 +104,7 @@ class ServiceReport { // "workPerformed":workPreformed // }; // } - _map["faultDescription"] = {"id": faultDescription?.id ?? 0, "workPerformed": faultDescription?.workPerformed}; + _map["faultDescription"] = faultDescription?.id ==null ? null :{"id": faultDescription?.id ?? 0, "workPerformed": faultDescription?.workPerformed}; if (travelingHours != null) _map["travelingHours"] = travelingHours; // if (workingHours != null) _map["workingHours"] = workingHours; // if (workPreformed != null && workPreformed.isNotEmpty) { diff --git a/lib/models/service_request/service_request.dart b/lib/models/service_request/service_request.dart index 58fc2808..36885189 100644 --- a/lib/models/service_request/service_request.dart +++ b/lib/models/service_request/service_request.dart @@ -82,6 +82,7 @@ class ServiceRequest { factory ServiceRequest.fromJson(Map parsedJson) { List images = []; + if(parsedJson["attachmentsCallRequest"]!=null) if (parsedJson["attachmentsCallRequest"] is List) { List list = parsedJson["attachmentsCallRequest"]; images = list.map((e) => URLs.getFileUrl(e["attachmentsCallRequest"])).toList(); @@ -98,6 +99,7 @@ class ServiceRequest { devicePhotos: images, deviceSerialNumber: parsedJson["asset"]["assetSerialNo"], date: DateTime.tryParse(parsedJson["requestedDate"] ?? "").toString().split(" ").first, + // todo. add requeste time param for time callComments: parsedJson["callComments"], comments: parsedJson["comments"], statusLabel: parsedJson["status"] == null ? null : parsedJson["status"]["name"], diff --git a/lib/views/pages/user/requests/create_request.dart b/lib/views/pages/user/requests/create_request.dart index bcd45204..63c426e0 100644 --- a/lib/views/pages/user/requests/create_request.dart +++ b/lib/views/pages/user/requests/create_request.dart @@ -306,7 +306,7 @@ class CreateRequestPageState extends State { Fluttertoast.showToast(msg: _subtitle.pickDevice); return; } - if (_serviceRequest.firstAction.name == "Need a visit" && _dateTime == null) { + if (_serviceRequest.firstAction?.name == "Need a visit" && _dateTime == null) { Fluttertoast.showToast(msg: _subtitle.noDateFound); return; } From b40727b92079442416dd22d282c0b48ed856f097 Mon Sep 17 00:00:00 2001 From: nextwo <1234> Date: Thu, 13 Jul 2023 08:20:24 +0300 Subject: [PATCH 129/181] review comment --- .../api/service_requests_provider.dart | 2 +- .../pages/user/requests/create_request.dart | 2 +- .../report/create_service_report.dart | 30 +++++++++---------- 3 files changed, 17 insertions(+), 17 deletions(-) diff --git a/lib/controllers/providers/api/service_requests_provider.dart b/lib/controllers/providers/api/service_requests_provider.dart index edf5a749..8f89d695 100644 --- a/lib/controllers/providers/api/service_requests_provider.dart +++ b/lib/controllers/providers/api/service_requests_provider.dart @@ -336,7 +336,7 @@ class ServiceRequestsProvider extends ChangeNotifier { }, ) ?.toList(), - "reviewComment": report.reviewComment ?? "", + "reviewComment": "", "comment": report.comment, "attachmentsWorkOrder": request.devicePhotos?.map((e) => {"name": e})?.toList(), "equipmentStatus": report.equipmentStatus?.toMap(), diff --git a/lib/views/pages/user/requests/create_request.dart b/lib/views/pages/user/requests/create_request.dart index bcd45204..63c426e0 100644 --- a/lib/views/pages/user/requests/create_request.dart +++ b/lib/views/pages/user/requests/create_request.dart @@ -306,7 +306,7 @@ class CreateRequestPageState extends State { Fluttertoast.showToast(msg: _subtitle.pickDevice); return; } - if (_serviceRequest.firstAction.name == "Need a visit" && _dateTime == null) { + if (_serviceRequest.firstAction?.name == "Need a visit" && _dateTime == null) { Fluttertoast.showToast(msg: _subtitle.noDateFound); return; } diff --git a/lib/views/pages/user/requests/report/create_service_report.dart b/lib/views/pages/user/requests/report/create_service_report.dart index 8ff8b431..4eac7042 100644 --- a/lib/views/pages/user/requests/report/create_service_report.dart +++ b/lib/views/pages/user/requests/report/create_service_report.dart @@ -397,21 +397,21 @@ class _CreateServiceReportState extends State with TickerPr ), ], ), - if (_showCommentField) - const SizedBox( - height: 8, - ), - if (_showCommentField) - ATextFormField( - initialValue: _serviceReport?.reviewComment, - hintText: "Review Comment", - textAlign: TextAlign.center, - style: Theme.of(context).textTheme.titleMedium, - textInputType: TextInputType.multiline, - onSaved: (value) { - _serviceReport.reviewComment = value; - }, - ), + // if (_showCommentField) + // const SizedBox( + // height: 8, + // ), + // if (_showCommentField) + // ATextFormField( + // initialValue: _serviceReport?.reviewComment, + // hintText: "Review Comment", + // textAlign: TextAlign.center, + // style: Theme.of(context).textTheme.titleMedium, + // textInputType: TextInputType.multiline, + // onSaved: (value) { + // _serviceReport.reviewComment = value; + // }, + // ), SizedBox( height: 8 * AppStyle.getScaleFactor(context), ), From 8ada0dd0af05c0aa00dcaf4d652055d0af858831 Mon Sep 17 00:00:00 2001 From: Sikander Saleem Date: Thu, 13 Jul 2023 08:46:25 +0300 Subject: [PATCH 130/181] fixes-1 --- lib/models/device/device.dart | 5 +++++ lib/models/device/device_transfer.dart | 1 + .../pages/device_transfer/device_transfer_details.dart | 6 +++--- 3 files changed, 9 insertions(+), 3 deletions(-) diff --git a/lib/models/device/device.dart b/lib/models/device/device.dart index 113e928e..40d2f92b 100644 --- a/lib/models/device/device.dart +++ b/lib/models/device/device.dart @@ -7,6 +7,7 @@ class Device { int id; String serialNumber; String number; + String assetName; String destBuildingName; String destDepartmentName; String destRoom; @@ -21,6 +22,7 @@ class Device { this.id, this.serialNumber, this.number, + this.assetName, this.hospital, this.destBuildingName, this.destDepartmentName, @@ -33,10 +35,12 @@ class Device { }); factory Device.fromJson(Map parsedJson) { + print("parsedJson:$parsedJson"); return Device( id: parsedJson["id"], serialNumber: parsedJson["assetSerialNo"], number: parsedJson["assetNumber"], + assetName: parsedJson["assetName"], modelDefinition: ModelDefinition.fromJson(parsedJson["modelDefinition"]), hospital: Hospital.fromJson(parsedJson["site"]), destBuildingName: parsedJson["destBuildingName"], @@ -66,6 +70,7 @@ class Device { 'id': id, 'assetSerialNo': serialNumber, 'assetNumber': number, + 'assetName': assetName, 'modelDefinition': modelDefinition.toJson(), 'site': hospital.toMap(), 'AssetType': assetType.toMap(), diff --git a/lib/models/device/device_transfer.dart b/lib/models/device/device_transfer.dart index 9c0d3e28..ec1d5bfb 100644 --- a/lib/models/device/device_transfer.dart +++ b/lib/models/device/device_transfer.dart @@ -50,6 +50,7 @@ class DeviceTransfer { device: Device( id: parsedJson["assetId"], number: parsedJson["assetNumber"], + assetName: parsedJson["assetName"], serialNumber: parsedJson["assetSerialNo"], destBuildingName: parsedJson["destBuildingName"], destDepartmentName: parsedJson["destDepartmentName"], diff --git a/lib/views/pages/device_transfer/device_transfer_details.dart b/lib/views/pages/device_transfer/device_transfer_details.dart index e9d0a93d..4d6e7e24 100644 --- a/lib/views/pages/device_transfer/device_transfer_details.dart +++ b/lib/views/pages/device_transfer/device_transfer_details.dart @@ -89,12 +89,12 @@ class _DeviceTransferDetailsState extends State { crossAxisAlignment: CrossAxisAlignment.start, children: [ RequestInfoRow( - title: "Id", - info: widget.model.id?.toString(), + title: "Transfer Id", + info: widget.model.title?.toString(), ), RequestInfoRow( title: _subtitle.assetName, - info: widget.model.title, + info: widget.model.device.assetName, ), RequestInfoRow( title: _subtitle.assetSN, From b8051a40fe75774b40c5150b7e0e35551f14a1ec Mon Sep 17 00:00:00 2001 From: Sikander Saleem Date: Thu, 13 Jul 2023 09:50:09 +0300 Subject: [PATCH 131/181] signature fixes --- lib/controllers/api_routes/urls.dart | 5 ++++- .../providers/api/device_transfer_provider.dart | 10 +++++----- .../pages/device_transfer/update_device_transfer.dart | 4 +++- lib/views/pages/user/requests/request_details.dart | 4 ++-- .../device_trancfer/device_transfer_info_section.dart | 1 + 5 files changed, 15 insertions(+), 9 deletions(-) diff --git a/lib/controllers/api_routes/urls.dart b/lib/controllers/api_routes/urls.dart index 86794228..b4cb7226 100644 --- a/lib/controllers/api_routes/urls.dart +++ b/lib/controllers/api_routes/urls.dart @@ -12,7 +12,7 @@ class URLs { set host(String value) => _host = value; - static String getFileUrl(String file) => file == null || file.isEmpty ? null : "$_host/attachment/$file"; + static String getFileUrl(String file) => (file == null || file.isEmpty) ? null : (file.contains("/") ? file : "$_host/attachment/$file"); // API Routes static get login => "$_baseUrl/MobileAuth/LoginIntegration"; // post @@ -36,8 +36,11 @@ class URLs { static get getRepairLocation => "$_baseUrl/Lookups/GetLookup?lookupEnum=504"; static get equipmentStatus => "$_baseUrl/Lookups/GetLookup?lookupEnum=601"; + static get getDateOperators => "$_baseUrl/Lookups/GetLookup?lookupEnum=200"; + static get getMaintenanceSituation => "$_baseUrl/Lookups/GetLookup?lookupEnum=502"; + static get getAllUsers => "http://109.123.243.118:5000/api/Account/GetAllUsers"; static get getPreventiveMaintenanceVisits => "$_baseUrl/return/user/calibrations"; // get diff --git a/lib/controllers/providers/api/device_transfer_provider.dart b/lib/controllers/providers/api/device_transfer_provider.dart index 43c5eced..ca5234ce 100644 --- a/lib/controllers/providers/api/device_transfer_provider.dart +++ b/lib/controllers/providers/api/device_transfer_provider.dart @@ -181,7 +181,7 @@ class DeviceTransferProvider extends ChangeNotifier { "senderStartDate": newModel.timer?.startAt?.toIso8601String(), "senderEndDate": newModel.timer?.endAt?.toIso8601String(), "senderTravelingHours": newModel.travelingHours, - "senderAttachmentName": "${newModel.signature}.png", + "senderAttachmentName": newModel?.signature ?? "", "destSiteId": oldModel.receiver.client.id, "destDepartmentId": oldModel.receiver.department.id, "receiverAssignedEmployeeId": oldModel.receiver.userId, @@ -191,7 +191,7 @@ class DeviceTransferProvider extends ChangeNotifier { "receiverStartDate": oldModel.receiver.timer?.startAt?.toIso8601String(), "receiverEndDate": oldModel.receiver.timer?.endAt?.toIso8601String(), "receiverTravelingHours": oldModel.receiver.travelingHours, - "receiverAttachmentName": "${oldModel.receiver.signature}.png", + "receiverAttachmentName": oldModel.receiver?.signature ?? "", }); } else { body.addAll({ @@ -204,7 +204,7 @@ class DeviceTransferProvider extends ChangeNotifier { "senderStartDate": oldModel.sender.timer?.startAt?.toIso8601String(), "senderEndDate": oldModel.sender.timer?.endAt?.toIso8601String(), "senderTravelingHours": oldModel.sender.travelingHours, - "senderAttachmentName": "${oldModel.sender.signature}.png", + "senderAttachmentName": oldModel.sender?.signature ?? "", "destSiteId": newModel.client.id, "destDepartmentId": newModel.department.id, "receiverAssignedEmployeeId": newModel.userId, @@ -214,11 +214,11 @@ class DeviceTransferProvider extends ChangeNotifier { "receiverStartDate": newModel.timer?.startAt?.toIso8601String(), "receiverEndDate": newModel.timer?.endAt?.toIso8601String(), "receiverTravelingHours": newModel.travelingHours, - "receiverAttachmentName": "${newModel.signature}.png", + "receiverAttachmentName": newModel?.signature ?? "", }); } - body.addAll(newModel.toJson(isSender)); + //body.addAll(newModel.toJson(isSender)); print(body); Response response; try { diff --git a/lib/views/pages/device_transfer/update_device_transfer.dart b/lib/views/pages/device_transfer/update_device_transfer.dart index 061b5d21..a2787979 100644 --- a/lib/views/pages/device_transfer/update_device_transfer.dart +++ b/lib/views/pages/device_transfer/update_device_transfer.dart @@ -202,7 +202,9 @@ class _UpdateDeviceTransferState extends State { onSaved: (signature) { _signature = signature; if (signature == null || signature.isEmpty) return; - _formModel.signature = base64Encode(signature); + _formModel.signature = + "${DateTime.now().toIso8601String()}.png|${base64Encode(signature)}"; + // base64Encode(signature); }, ), Padding( diff --git a/lib/views/pages/user/requests/request_details.dart b/lib/views/pages/user/requests/request_details.dart index 61e835b2..23bd5792 100644 --- a/lib/views/pages/user/requests/request_details.dart +++ b/lib/views/pages/user/requests/request_details.dart @@ -194,8 +194,8 @@ class RequestDetailsPage extends StatelessWidget { info: serviceRequest.deviceNumber, ), RequestInfoRow( - title: _subtitle.deviceSN, - info: serviceRequest.deviceSerialNumber, + title: _subtitle.assetName, + info: serviceRequest.deviceEnName, ), RequestInfoRow( title: _subtitle.deviceModel, diff --git a/lib/views/widgets/device_trancfer/device_transfer_info_section.dart b/lib/views/widgets/device_trancfer/device_transfer_info_section.dart index 556cfec8..ea699121 100644 --- a/lib/views/widgets/device_trancfer/device_transfer_info_section.dart +++ b/lib/views/widgets/device_trancfer/device_transfer_info_section.dart @@ -18,6 +18,7 @@ class DeviceTransferInfoSection extends StatelessWidget { Widget build(BuildContext context) { info.userName = Provider.of(context).user.username; final subtitle = AppLocalization.of(context).subtitle; + print("url:${info.signature}"); return Column( children: [ RequestInfoRow( From 8bc2275c35b83732e64489178cd85aaafa7eb0b6 Mon Sep 17 00:00:00 2001 From: Sikander Saleem Date: Thu, 13 Jul 2023 10:30:00 +0300 Subject: [PATCH 132/181] asset name added in device transfer list. --- .../widgets/device_trancfer/device_transfer_item.dart | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/lib/views/widgets/device_trancfer/device_transfer_item.dart b/lib/views/widgets/device_trancfer/device_transfer_item.dart index 20399463..b2a923b7 100644 --- a/lib/views/widgets/device_trancfer/device_transfer_item.dart +++ b/lib/views/widgets/device_trancfer/device_transfer_item.dart @@ -13,6 +13,7 @@ class DeviceTransferItem extends StatelessWidget { final int index; final DeviceTransfer item; final Function(DeviceTransfer) onPressed; + const DeviceTransferItem({Key key, this.item, this.onPressed, this.index}) : super(key: key); @override @@ -59,6 +60,13 @@ class DeviceTransferItem extends StatelessWidget { Divider( color: onItemColor, ), + Text( + item.device.assetName ?? "", + style: Theme.of(context).textTheme.headline6.copyWith(color: onItemColor, fontSize: 16, fontWeight: FontWeight.bold), + ), + Divider( + color: onItemColor, + ), Row( children: [ Expanded( From 4997e1e3df171c654183e6416ee5a92d6637b367 Mon Sep 17 00:00:00 2001 From: zaid_daoud Date: Thu, 13 Jul 2023 12:51:55 +0300 Subject: [PATCH 133/181] Timer Fixed --- lib/models/device/device_transfer.dart | 1 - lib/models/device/device_transfer_info.dart | 1 - lib/models/pantry/pentry.dart | 28 +++++++++++++++---- lib/models/service_report.dart | 11 ++++++-- lib/models/timer_model.dart | 4 +-- .../update_device_transfer.dart | 18 ++++++------ .../work_order_details_bottom_sheet.dart | 3 -- .../requests/report/edit_service_report.dart | 3 -- .../pages/user/visits/pantry/edit_pentry.dart | 2 +- .../widgets/pentry/pentry_info_form.dart | 1 + lib/views/widgets/timer/app_timer.dart | 4 +-- 11 files changed, 46 insertions(+), 30 deletions(-) diff --git a/lib/models/device/device_transfer.dart b/lib/models/device/device_transfer.dart index ec1d5bfb..84ab75c2 100644 --- a/lib/models/device/device_transfer.dart +++ b/lib/models/device/device_transfer.dart @@ -66,7 +66,6 @@ class DeviceTransfer { startAt: DateTime.tryParse(parsedJson["senderStartDate"] ?? ""), endAt: DateTime.tryParse(parsedJson["senderEndDate"] ?? ""), durationInSecond: ((parsedJson["workingHours"] ?? 0) * 60 * 60).toInt(), - stopped: parsedJson["workingHours"] == null ? null : true, ), // startDate: parsedJson["senderStartDate"] == null ? null : DateTime.parse(parsedJson["senderStartDate"]), // endDate: parsedJson["senderEndDate"] == null ? null : DateTime.parse(parsedJson["senderEndDate"]), diff --git a/lib/models/device/device_transfer_info.dart b/lib/models/device/device_transfer_info.dart index 00e1d387..093beb46 100644 --- a/lib/models/device/device_transfer_info.dart +++ b/lib/models/device/device_transfer_info.dart @@ -81,7 +81,6 @@ class DeviceTransferInfo { startAt: DateTime.tryParse(parsedJson["${key}start_date"] ?? ""), endAt: DateTime.tryParse(parsedJson["${key}end_date"] ?? ""), durationInSecond: ((parsedJson["${key}working_hours"] ?? 0) * 60 * 60).toInt(), - stopped: parsedJson["${key}working_hours"] == null || (parsedJson["${key}working_hours"] as String).isEmpty ? null : true, ), travelingHours: parsedJson["${key}travel_hours"], userName: parsedJson["${key}name"], diff --git a/lib/models/pantry/pentry.dart b/lib/models/pantry/pentry.dart index 40a9034e..5d3a4163 100644 --- a/lib/models/pantry/pentry.dart +++ b/lib/models/pantry/pentry.dart @@ -2,6 +2,7 @@ import 'dart:convert'; import 'dart:io'; import 'dart:typed_data'; +import 'package:fluttertoast/fluttertoast.dart'; import 'package:test_sa/controllers/api_routes/urls.dart'; import 'package:test_sa/models/lookup.dart'; import 'package:test_sa/models/pantry/calibration_tools.dart'; @@ -45,12 +46,28 @@ class Pentry { this.localNurseSignature, this.localEngineerSignature}); - bool validate() { - if (actualVisitDate == null) return false; - if (expectedVisitDate == null) return false; - if (timer == null && timer.endAt != null) return false; + Future validate() async { + if (actualVisitDate == null) { + await Fluttertoast.showToast(msg: "Actual visit date is Required"); + return false; + } + if (expectedVisitDate == null) { + await Fluttertoast.showToast(msg: "expected visit date is Required"); + return false; + } + if (timer?.startAt == null) { + await Fluttertoast.showToast(msg: "Working Hours Required"); + return false; + } + if (timer?.endAt == null) { + await Fluttertoast.showToast(msg: "Please Stop The Timer"); + return false; + } if (ppmVisitStatus == null) return false; - //if(status == null) return false; + if (status?.id == null) { + await Fluttertoast.showToast(msg: "Device Status is Required"); + return false; + } return true; } @@ -121,7 +138,6 @@ class Pentry { startAt: DateTime.tryParse(map["startDate"] ?? ""), endAt: DateTime.tryParse(map["endDate"] ?? ""), durationInSecond: (int.tryParse(map["workingHours"] ?? "") ?? 0) * 60 * 60, - stopped: map["workingHours"] == null ? null : true, ), // contacts: contacts, ppmCheckLists: ppmCheckLists, diff --git a/lib/models/service_report.dart b/lib/models/service_report.dart index a8284224..7abb59cb 100644 --- a/lib/models/service_report.dart +++ b/lib/models/service_report.dart @@ -104,7 +104,7 @@ class ServiceReport { // "workPerformed":workPreformed // }; // } - _map["faultDescription"] = faultDescription?.id ==null ? null :{"id": faultDescription?.id ?? 0, "workPerformed": faultDescription?.workPerformed}; + _map["faultDescription"] = faultDescription?.id == null ? null : {"id": faultDescription?.id ?? 0, "workPerformed": faultDescription?.workPerformed}; if (travelingHours != null) _map["travelingHours"] = travelingHours; // if (workingHours != null) _map["workingHours"] = workingHours; // if (workPreformed != null && workPreformed.isNotEmpty) { @@ -161,6 +161,14 @@ class ServiceReport { await Fluttertoast.showToast(msg: "Visit Date Required"); return false; } + if (timer?.startAt == null) { + await Fluttertoast.showToast(msg: "Working Hours Required"); + return false; + } + if (timer?.endAt == null) { + await Fluttertoast.showToast(msg: "Please Stop The Timer"); + return false; + } //if(serviceType == null) return false; if (equipmentStatus == null) return false; //if (type == null && assetType == null) return false; @@ -217,7 +225,6 @@ class ServiceReport { startAt: DateTime.tryParse(parsedJson["startofWorkTime"] ?? ""), endAt: DateTime.tryParse(parsedJson["endofWorkTime"] ?? ""), durationInSecond: ((parsedJson["workingHours"] ?? 0) * 60 * 60).toInt(), - stopped: parsedJson["workingHours"] == null ? null : true, ), //workPreformed: parsedJson["work_performed"], device: Device.fromJson(parsedJson["callRequest"]["asset"]), diff --git a/lib/models/timer_model.dart b/lib/models/timer_model.dart index 907d006d..1e68767d 100644 --- a/lib/models/timer_model.dart +++ b/lib/models/timer_model.dart @@ -2,7 +2,7 @@ class TimerModel { DateTime startAt; DateTime endAt; int durationInSecond; - bool stopped; + // bool stopped; - TimerModel({this.startAt, this.endAt, this.durationInSecond, this.stopped}); + TimerModel({this.startAt, this.endAt, this.durationInSecond}); } diff --git a/lib/views/pages/device_transfer/update_device_transfer.dart b/lib/views/pages/device_transfer/update_device_transfer.dart index a2787979..9a870ad9 100644 --- a/lib/views/pages/device_transfer/update_device_transfer.dart +++ b/lib/views/pages/device_transfer/update_device_transfer.dart @@ -45,12 +45,13 @@ class _UpdateDeviceTransferState extends State { final GlobalKey _scaffoldKey = GlobalKey(); _update() async { - if (_formModel?.workingHours == null || _formModel.workingHours.isEmpty) { - await Fluttertoast.showToast(msg: "Working Hours Timer Isn't Started"); - return; - } else if ((_formModel?.timer?.stopped ?? false) == false) { - await Fluttertoast.showToast(msg: "Stop The Timer"); - return; + if (_formModel?.timer?.startAt == null) { + await Fluttertoast.showToast(msg: "Working Hours Required"); + return false; + } + if (_formModel?.timer?.endAt == null) { + await Fluttertoast.showToast(msg: "Please Stop The Timer"); + return false; } _validate = true; if (!_formKey.currentState.validate()) { @@ -202,9 +203,8 @@ class _UpdateDeviceTransferState extends State { onSaved: (signature) { _signature = signature; if (signature == null || signature.isEmpty) return; - _formModel.signature = - "${DateTime.now().toIso8601String()}.png|${base64Encode(signature)}"; - // base64Encode(signature); + _formModel.signature = "${DateTime.now().toIso8601String()}.png|${base64Encode(signature)}"; + // base64Encode(signature); }, ), Padding( diff --git a/lib/views/pages/sub_workorder/work_order_details_bottom_sheet.dart b/lib/views/pages/sub_workorder/work_order_details_bottom_sheet.dart index df6e58f0..e91de02e 100644 --- a/lib/views/pages/sub_workorder/work_order_details_bottom_sheet.dart +++ b/lib/views/pages/sub_workorder/work_order_details_bottom_sheet.dart @@ -157,9 +157,6 @@ class _WorkOrderDetailsBottomSheetState extends State with TickerProvid if (_serviceReport?.workingHours == null) { await Fluttertoast.showToast(msg: "Working Hours Timer Isn't Started"); return; - } else if ((_serviceReport?.timer?.stopped ?? false) == false) { - await Fluttertoast.showToast(msg: "Stop The Timer"); - return; } _validate = true; print("jere1245"); diff --git a/lib/views/pages/user/visits/pantry/edit_pentry.dart b/lib/views/pages/user/visits/pantry/edit_pentry.dart index d2d52054..744c0a20 100644 --- a/lib/views/pages/user/visits/pantry/edit_pentry.dart +++ b/lib/views/pages/user/visits/pantry/edit_pentry.dart @@ -42,7 +42,7 @@ class _EditPentryState extends State with SingleTickerProviderStateM _onSubmit() async { _validate = true; - if (!_pentry.validate()) { + if (!(await _pentry.validate())) { setState(() {}); return; } diff --git a/lib/views/widgets/pentry/pentry_info_form.dart b/lib/views/widgets/pentry/pentry_info_form.dart index 33ccd2ed..37989014 100644 --- a/lib/views/widgets/pentry/pentry_info_form.dart +++ b/lib/views/widgets/pentry/pentry_info_form.dart @@ -72,6 +72,7 @@ class _PentryInfoFormState extends State { ), AppTimer( timer: widget.model.timer, + enabled: widget.model.timer.endAt == null, onChange: (timer) async { widget.model.timer = timer; return true; diff --git a/lib/views/widgets/timer/app_timer.dart b/lib/views/widgets/timer/app_timer.dart index 9e887905..e67a34ce 100644 --- a/lib/views/widgets/timer/app_timer.dart +++ b/lib/views/widgets/timer/app_timer.dart @@ -34,7 +34,7 @@ class _AppTimerState extends State { _startTimer() async { if (!_running) { final time = DateTime.now(); - bool result = await widget.onChange(TimerModel(startAt: time, endAt: null, durationInSecond: _delay, stopped: false)); + bool result = await widget.onChange(TimerModel(startAt: time, endAt: null, durationInSecond: _delay)); if (!result) return; _running = true; @@ -54,7 +54,7 @@ class _AppTimerState extends State { _stopTimer() async { final time = DateTime.now(); final tempStartAt = _startAt.add(Duration(seconds: _delay)); - bool result = await widget.onChange(TimerModel(startAt: tempStartAt, endAt: time, durationInSecond: _delay, stopped: true)); + bool result = await widget.onChange(TimerModel(startAt: tempStartAt, endAt: time, durationInSecond: _delay)); if (!result) return; _running = false; _endAt = time; From 5de7b1b75903d93348f768290690bc86d57c9816 Mon Sep 17 00:00:00 2001 From: Sikander Saleem Date: Thu, 13 Jul 2023 15:42:22 +0300 Subject: [PATCH 134/181] pm entry nurse & eng signature fix. --- lib/models/pantry/pentry.dart | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lib/models/pantry/pentry.dart b/lib/models/pantry/pentry.dart index 5d3a4163..28f1d8e6 100644 --- a/lib/models/pantry/pentry.dart +++ b/lib/models/pantry/pentry.dart @@ -101,8 +101,8 @@ class Pentry { map["vChecklists"] = ppmCheckLists.map((e) => e.toMap(visitId)).toList(); map["vCalibrationTools"] = calibrationTools.map((e) => e.toMap(visitId)).toList(); map["vKits"] = pmKits.map((e) => e.toMap(visitId)).toList(); - map["nurseSignature"] = "${DateTime.now().toIso8601String()}.png|$signatureNurse"; - map["engSignature"] = "${DateTime.now().toIso8601String()}.png|$signatureEngineer"; + map["nurseSignature"] = signatureNurse;//"${DateTime.now().toIso8601String()}.png|$signatureNurse"; + map["engSignature"] = signatureEngineer;//"${DateTime.now().toIso8601String()}.png|$signatureEngineer"; return map; } From 519d5a9f42248c3097981e117f152744de285f12 Mon Sep 17 00:00:00 2001 From: zaid_daoud Date: Thu, 13 Jul 2023 15:56:16 +0300 Subject: [PATCH 135/181] No Assigned Employee --- lib/views/pages/user/requests/create_request.dart | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/lib/views/pages/user/requests/create_request.dart b/lib/views/pages/user/requests/create_request.dart index 63c426e0..14d7eb36 100644 --- a/lib/views/pages/user/requests/create_request.dart +++ b/lib/views/pages/user/requests/create_request.dart @@ -310,6 +310,10 @@ class CreateRequestPageState extends State { Fluttertoast.showToast(msg: _subtitle.noDateFound); return; } + if (widget.serviceRequest != null && (_serviceRequest?.engineerId == null || (_serviceRequest?.engineerId?.isEmpty ?? false))) { + await Fluttertoast.showToast(msg: "No Assigned Employee"); + return; + } _formKey.currentState.save(); _serviceRequest.deviceId = _device?.id; _isLoading = true; From 0124918d29d42ec407fb917a2465f677a5775ff8 Mon Sep 17 00:00:00 2001 From: zaid_daoud Date: Thu, 13 Jul 2023 16:55:26 +0300 Subject: [PATCH 136/181] status added to update service request --- .../providers/api/service_requests_provider.dart | 6 +++++- lib/models/service_request/service_request.dart | 6 ++++-- 2 files changed, 9 insertions(+), 3 deletions(-) diff --git a/lib/controllers/providers/api/service_requests_provider.dart b/lib/controllers/providers/api/service_requests_provider.dart index a9ad27cd..ade9ef31 100644 --- a/lib/controllers/providers/api/service_requests_provider.dart +++ b/lib/controllers/providers/api/service_requests_provider.dart @@ -254,7 +254,11 @@ class ServiceRequestsProvider extends ChangeNotifier { ], "callComments": request.callComments, "noofFollowup": 0, - // "status": null, + "status": request.statusId == null + ? null + : { + "id": request.statusId, + }, "callLastSituation": null, "firstAction": request.firstAction?.toMap(), "loanAvailablity": request.loanAvailability?.toMap(), diff --git a/lib/models/service_request/service_request.dart b/lib/models/service_request/service_request.dart index 36885189..68a55eb8 100644 --- a/lib/models/service_request/service_request.dart +++ b/lib/models/service_request/service_request.dart @@ -19,6 +19,7 @@ class ServiceRequest { String date; String audio; int statusValue; + int statusId; String statusLabel; String reviewComment; String comments; @@ -54,6 +55,7 @@ class ServiceRequest { this.callComments, this.statusLabel, this.statusValue, + this.statusId, this.departmentName, this.deviceId, this.audio, @@ -82,8 +84,7 @@ class ServiceRequest { factory ServiceRequest.fromJson(Map parsedJson) { List images = []; - if(parsedJson["attachmentsCallRequest"]!=null) - if (parsedJson["attachmentsCallRequest"] is List) { + if (parsedJson["attachmentsCallRequest"] != null) if (parsedJson["attachmentsCallRequest"] is List) { List list = parsedJson["attachmentsCallRequest"]; images = list.map((e) => URLs.getFileUrl(e["attachmentsCallRequest"])).toList(); } @@ -104,6 +105,7 @@ class ServiceRequest { comments: parsedJson["comments"], statusLabel: parsedJson["status"] == null ? null : parsedJson["status"]["name"], statusValue: parsedJson["status"] == null ? null : parsedJson["status"]["value"], + statusId: parsedJson["status"] == null ? null : parsedJson["status"]["id"], departmentName: parsedJson["asset"]["department"] != null ? parsedJson["asset"]["department"]["name"] : "", engineerName: parsedJson["assignedEmployee"] == null ? null : parsedJson["assignedEmployee"]["name"], engineerId: parsedJson["assignedEmployee"] == null ? null : parsedJson["assignedEmployee"]["id"], From 32652141b2cc4fa83a40537fbfc8b5eb69f97cab Mon Sep 17 00:00:00 2001 From: Sikander Saleem Date: Thu, 13 Jul 2023 17:41:59 +0300 Subject: [PATCH 137/181] service status fix. --- lib/controllers/providers/api/service_requests_provider.dart | 2 ++ 1 file changed, 2 insertions(+) diff --git a/lib/controllers/providers/api/service_requests_provider.dart b/lib/controllers/providers/api/service_requests_provider.dart index ade9ef31..8b014f83 100644 --- a/lib/controllers/providers/api/service_requests_provider.dart +++ b/lib/controllers/providers/api/service_requests_provider.dart @@ -258,6 +258,8 @@ class ServiceRequestsProvider extends ChangeNotifier { ? null : { "id": request.statusId, + "name": request.statusLabel, + "value": request.statusValue, }, "callLastSituation": null, "firstAction": request.firstAction?.toMap(), From 914a9e0057ca919f88403ba9f8e36a28b58bef32 Mon Sep 17 00:00:00 2001 From: zaid_daoud Date: Tue, 1 Aug 2023 11:37:18 +0300 Subject: [PATCH 138/181] Add Asset Number and Asset Name in new service request after select pickup Asset --- ios/Podfile | 7 + ios/Podfile.lock | 216 ------------------ ios/Runner.xcodeproj/project.pbxproj | 19 +- .../widgets/equipment/device_button.dart | 14 ++ 4 files changed, 28 insertions(+), 228 deletions(-) delete mode 100644 ios/Podfile.lock diff --git a/ios/Podfile b/ios/Podfile index 2c068c40..8623e160 100644 --- a/ios/Podfile +++ b/ios/Podfile @@ -38,4 +38,11 @@ post_install do |installer| installer.pods_project.targets.each do |target| flutter_additional_ios_build_settings(target) end + installer.generated_projects.each do |project| + project.targets.each do |target| + target.build_configurations.each do |config| + config.build_settings['IPHONEOS_DEPLOYMENT_TARGET'] = '12.0' + end + end + end end diff --git a/ios/Podfile.lock b/ios/Podfile.lock deleted file mode 100644 index cbf76fea..00000000 --- a/ios/Podfile.lock +++ /dev/null @@ -1,216 +0,0 @@ -PODS: - - audioplayers_darwin (0.0.1): - - Flutter - - Firebase/CoreOnly (10.3.0): - - FirebaseCore (= 10.3.0) - - Firebase/Messaging (10.3.0): - - Firebase/CoreOnly - - FirebaseMessaging (~> 10.3.0) - - firebase_core (2.4.1): - - Firebase/CoreOnly (= 10.3.0) - - Flutter - - firebase_messaging (14.2.1): - - Firebase/Messaging (= 10.3.0) - - firebase_core - - Flutter - - FirebaseCore (10.3.0): - - FirebaseCoreInternal (~> 10.0) - - GoogleUtilities/Environment (~> 7.8) - - GoogleUtilities/Logger (~> 7.8) - - FirebaseCoreInternal (10.3.0): - - "GoogleUtilities/NSData+zlib (~> 7.8)" - - FirebaseInstallations (10.3.0): - - FirebaseCore (~> 10.0) - - GoogleUtilities/Environment (~> 7.8) - - GoogleUtilities/UserDefaults (~> 7.8) - - PromisesObjC (~> 2.1) - - FirebaseMessaging (10.3.0): - - FirebaseCore (~> 10.0) - - FirebaseInstallations (~> 10.0) - - GoogleDataTransport (~> 9.2) - - GoogleUtilities/AppDelegateSwizzler (~> 7.8) - - GoogleUtilities/Environment (~> 7.8) - - GoogleUtilities/Reachability (~> 7.8) - - GoogleUtilities/UserDefaults (~> 7.8) - - nanopb (< 2.30910.0, >= 2.30908.0) - - Flutter (1.0.0) - - flutter_keyboard_visibility (0.0.1): - - Flutter - - flutter_local_notifications (0.0.1): - - Flutter - - flutter_sound (9.2.13): - - Flutter - - flutter_sound_core (= 9.2.13) - - flutter_sound_core (9.2.13) - - fluttertoast (0.0.2): - - Flutter - - Toast - - FMDB (2.7.5): - - FMDB/standard (= 2.7.5) - - FMDB/standard (2.7.5) - - GoogleDataTransport (9.2.0): - - GoogleUtilities/Environment (~> 7.7) - - nanopb (< 2.30910.0, >= 2.30908.0) - - PromisesObjC (< 3.0, >= 1.2) - - GoogleUtilities/AppDelegateSwizzler (7.10.0): - - GoogleUtilities/Environment - - GoogleUtilities/Logger - - GoogleUtilities/Network - - GoogleUtilities/Environment (7.10.0): - - PromisesObjC (< 3.0, >= 1.2) - - GoogleUtilities/Logger (7.10.0): - - GoogleUtilities/Environment - - GoogleUtilities/Network (7.10.0): - - GoogleUtilities/Logger - - "GoogleUtilities/NSData+zlib" - - GoogleUtilities/Reachability - - "GoogleUtilities/NSData+zlib (7.10.0)" - - GoogleUtilities/Reachability (7.10.0): - - GoogleUtilities/Logger - - GoogleUtilities/UserDefaults (7.10.0): - - GoogleUtilities/Logger - - image_picker_ios (0.0.1): - - Flutter - - MTBBarcodeScanner (5.0.11) - - nanopb (2.30909.0): - - nanopb/decode (= 2.30909.0) - - nanopb/encode (= 2.30909.0) - - nanopb/decode (2.30909.0) - - nanopb/encode (2.30909.0) - - package_info (0.0.1): - - Flutter - - path_provider_ios (0.0.1): - - Flutter - - permission_handler_apple (9.0.4): - - Flutter - - PromisesObjC (2.1.1) - - qr_code_scanner (0.2.0): - - Flutter - - MTBBarcodeScanner - - share (0.0.1): - - Flutter - - shared_preferences_ios (0.0.1): - - Flutter - - speech_to_text (0.0.1): - - Flutter - - Try - - sqflite (0.0.2): - - Flutter - - FMDB (>= 2.7.5) - - Toast (4.0.0) - - Try (2.1.1) - - url_launcher_ios (0.0.1): - - Flutter - -DEPENDENCIES: - - audioplayers_darwin (from `.symlinks/plugins/audioplayers_darwin/ios`) - - firebase_core (from `.symlinks/plugins/firebase_core/ios`) - - firebase_messaging (from `.symlinks/plugins/firebase_messaging/ios`) - - Flutter (from `Flutter`) - - flutter_keyboard_visibility (from `.symlinks/plugins/flutter_keyboard_visibility/ios`) - - flutter_local_notifications (from `.symlinks/plugins/flutter_local_notifications/ios`) - - flutter_sound (from `.symlinks/plugins/flutter_sound/ios`) - - fluttertoast (from `.symlinks/plugins/fluttertoast/ios`) - - image_picker_ios (from `.symlinks/plugins/image_picker_ios/ios`) - - package_info (from `.symlinks/plugins/package_info/ios`) - - path_provider_ios (from `.symlinks/plugins/path_provider_ios/ios`) - - permission_handler_apple (from `.symlinks/plugins/permission_handler_apple/ios`) - - qr_code_scanner (from `.symlinks/plugins/qr_code_scanner/ios`) - - share (from `.symlinks/plugins/share/ios`) - - shared_preferences_ios (from `.symlinks/plugins/shared_preferences_ios/ios`) - - speech_to_text (from `.symlinks/plugins/speech_to_text/ios`) - - sqflite (from `.symlinks/plugins/sqflite/ios`) - - url_launcher_ios (from `.symlinks/plugins/url_launcher_ios/ios`) - -SPEC REPOS: - trunk: - - Firebase - - FirebaseCore - - FirebaseCoreInternal - - FirebaseInstallations - - FirebaseMessaging - - flutter_sound_core - - FMDB - - GoogleDataTransport - - GoogleUtilities - - MTBBarcodeScanner - - nanopb - - PromisesObjC - - Toast - - Try - -EXTERNAL SOURCES: - audioplayers_darwin: - :path: ".symlinks/plugins/audioplayers_darwin/ios" - firebase_core: - :path: ".symlinks/plugins/firebase_core/ios" - firebase_messaging: - :path: ".symlinks/plugins/firebase_messaging/ios" - Flutter: - :path: Flutter - flutter_keyboard_visibility: - :path: ".symlinks/plugins/flutter_keyboard_visibility/ios" - flutter_local_notifications: - :path: ".symlinks/plugins/flutter_local_notifications/ios" - flutter_sound: - :path: ".symlinks/plugins/flutter_sound/ios" - fluttertoast: - :path: ".symlinks/plugins/fluttertoast/ios" - image_picker_ios: - :path: ".symlinks/plugins/image_picker_ios/ios" - package_info: - :path: ".symlinks/plugins/package_info/ios" - path_provider_ios: - :path: ".symlinks/plugins/path_provider_ios/ios" - permission_handler_apple: - :path: ".symlinks/plugins/permission_handler_apple/ios" - qr_code_scanner: - :path: ".symlinks/plugins/qr_code_scanner/ios" - share: - :path: ".symlinks/plugins/share/ios" - shared_preferences_ios: - :path: ".symlinks/plugins/shared_preferences_ios/ios" - speech_to_text: - :path: ".symlinks/plugins/speech_to_text/ios" - sqflite: - :path: ".symlinks/plugins/sqflite/ios" - url_launcher_ios: - :path: ".symlinks/plugins/url_launcher_ios/ios" - -SPEC CHECKSUMS: - audioplayers_darwin: 877d9a4d06331c5c374595e46e16453ac7eafa40 - Firebase: f92fc551ead69c94168d36c2b26188263860acd9 - firebase_core: bf59c32d2e53814f558efa20840c1902fa2fe461 - firebase_messaging: ee597229fc260f8fa491fa8f2d4a32dfbfa406fa - FirebaseCore: 988754646ab3bd4bdcb740f1bfe26b9f6c0d5f2a - FirebaseCoreInternal: 29b76f784d607df8b2a1259d73c3f04f1210137b - FirebaseInstallations: e2f26126089dcf41e215f7b8925af8d953c7d602 - FirebaseMessaging: e345b219fd15d325f0cf2fef28cb8ce00d851b3f - Flutter: f04841e97a9d0b0a8025694d0796dd46242b2854 - flutter_keyboard_visibility: 0339d06371254c3eb25eeb90ba8d17dca8f9c069 - flutter_local_notifications: 0c0b1ae97e741e1521e4c1629a459d04b9aec743 - flutter_sound: c60effa2a350fb977885f0db2fbc4c1ad5160900 - flutter_sound_core: 26c10e5832e76aaacfae252d8925232281c486ae - fluttertoast: eb263d302cc92e04176c053d2385237e9f43fad0 - FMDB: 2ce00b547f966261cd18927a3ddb07cb6f3db82a - GoogleDataTransport: 1c8145da7117bd68bbbed00cf304edb6a24de00f - GoogleUtilities: bad72cb363809015b1f7f19beb1f1cd23c589f95 - image_picker_ios: b786a5dcf033a8336a657191401bfdf12017dabb - MTBBarcodeScanner: f453b33c4b7dfe545d8c6484ed744d55671788cb - nanopb: b552cce312b6c8484180ef47159bc0f65a1f0431 - package_info: 873975fc26034f0b863a300ad47e7f1ac6c7ec62 - path_provider_ios: 14f3d2fd28c4fdb42f44e0f751d12861c43cee02 - permission_handler_apple: 44366e37eaf29454a1e7b1b7d736c2cceaeb17ce - PromisesObjC: ab77feca74fa2823e7af4249b8326368e61014cb - qr_code_scanner: bb67d64904c3b9658ada8c402e8b4d406d5d796e - share: 0b2c3e82132f5888bccca3351c504d0003b3b410 - shared_preferences_ios: 548a61f8053b9b8a49ac19c1ffbc8b92c50d68ad - speech_to_text: b43a7d99aef037bd758ed8e45d79bbac035d2dfe - sqflite: 6d358c025f5b867b29ed92fc697fd34924e11904 - Toast: 91b396c56ee72a5790816f40d3a94dd357abc196 - Try: 5ef669ae832617b3cee58cb2c6f99fb767a4ff96 - url_launcher_ios: 839c58cdb4279282219f5e248c3321761ff3c4de - -PODFILE CHECKSUM: 4e8f8b2be68aeea4c0d5beb6ff1e79fface1d048 - -COCOAPODS: 1.11.3 diff --git a/ios/Runner.xcodeproj/project.pbxproj b/ios/Runner.xcodeproj/project.pbxproj index 5116f0d6..471a4caa 100644 --- a/ios/Runner.xcodeproj/project.pbxproj +++ b/ios/Runner.xcodeproj/project.pbxproj @@ -160,6 +160,7 @@ 97C146E61CF9000F007C117D /* Project object */ = { isa = PBXProject; attributes = { + BuildIndependentTargetsInParallel = YES; LastUpgradeCheck = 1300; ORGANIZATIONNAME = ""; TargetAttributes = { @@ -310,6 +311,7 @@ isa = XCBuildConfiguration; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ALLOW_NON_MODULAR_INCLUDES_IN_FRAMEWORK_MODULES = YES; CLANG_ANALYZER_NONNULL = YES; CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; CLANG_CXX_LIBRARY = "libc++"; @@ -363,6 +365,7 @@ baseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */; buildSettings = { ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + CLANG_ALLOW_NON_MODULAR_INCLUDES_IN_FRAMEWORK_MODULES = YES; CLANG_ENABLE_MODULES = YES; CODE_SIGN_ENTITLEMENTS = Runner/Runner.entitlements; CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)"; @@ -441,16 +444,12 @@ "-framework", "\"package_info\"", "-framework", - "\"path_provider_ios\"", - "-framework", "\"permission_handler_apple\"", "-framework", "\"qr_code_scanner\"", "-framework", "\"share\"", "-framework", - "\"shared_preferences_ios\"", - "-framework", "\"speech_to_text\"", "-framework", "\"sqflite\"", @@ -472,6 +471,7 @@ isa = XCBuildConfiguration; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ALLOW_NON_MODULAR_INCLUDES_IN_FRAMEWORK_MODULES = YES; CLANG_ANALYZER_NONNULL = YES; CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; CLANG_CXX_LIBRARY = "libc++"; @@ -529,6 +529,7 @@ isa = XCBuildConfiguration; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ALLOW_NON_MODULAR_INCLUDES_IN_FRAMEWORK_MODULES = YES; CLANG_ANALYZER_NONNULL = YES; CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; CLANG_CXX_LIBRARY = "libc++"; @@ -584,6 +585,7 @@ baseConfigurationReference = 9740EEB21CF90195004384FC /* Debug.xcconfig */; buildSettings = { ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + CLANG_ALLOW_NON_MODULAR_INCLUDES_IN_FRAMEWORK_MODULES = YES; CLANG_ENABLE_MODULES = YES; CODE_SIGN_ENTITLEMENTS = Runner/Runner.entitlements; CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)"; @@ -662,16 +664,12 @@ "-framework", "\"package_info\"", "-framework", - "\"path_provider_ios\"", - "-framework", "\"permission_handler_apple\"", "-framework", "\"qr_code_scanner\"", "-framework", "\"share\"", "-framework", - "\"shared_preferences_ios\"", - "-framework", "\"speech_to_text\"", "-framework", "\"sqflite\"", @@ -695,6 +693,7 @@ baseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */; buildSettings = { ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + CLANG_ALLOW_NON_MODULAR_INCLUDES_IN_FRAMEWORK_MODULES = YES; CLANG_ENABLE_MODULES = YES; CODE_SIGN_ENTITLEMENTS = Runner/Runner.entitlements; CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)"; @@ -773,16 +772,12 @@ "-framework", "\"package_info\"", "-framework", - "\"path_provider_ios\"", - "-framework", "\"permission_handler_apple\"", "-framework", "\"qr_code_scanner\"", "-framework", "\"share\"", "-framework", - "\"shared_preferences_ios\"", - "-framework", "\"speech_to_text\"", "-framework", "\"sqflite\"", diff --git a/lib/views/widgets/equipment/device_button.dart b/lib/views/widgets/equipment/device_button.dart index 824547d2..8a8b78c0 100644 --- a/lib/views/widgets/equipment/device_button.dart +++ b/lib/views/widgets/equipment/device_button.dart @@ -56,6 +56,20 @@ class DeviceButton extends StatelessWidget { subtitle: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ + Divider( + color: Theme.of(context).textTheme.subtitle1.color, + ), + Text( + "${_subtitle.assetNumber} : ${device.number}", + style: Theme.of(context).textTheme.subtitle2, + ), + Divider( + color: Theme.of(context).textTheme.subtitle1.color, + ), + Text( + "${_subtitle.assetName} : ${device.modelDefinition.assetName}", + style: Theme.of(context).textTheme.subtitle2, + ), Divider( color: Theme.of(context).textTheme.subtitle1.color, ), From 21f7986fa4d69d739dfad0e4a9a76d320bfd8b26 Mon Sep 17 00:00:00 2001 From: zaid_daoud Date: Tue, 1 Aug 2023 13:12:12 +0300 Subject: [PATCH 139/181] 1- Service Request Type for end user profile should be by default Maintenance Request and locked field. 2- Through field in new service request should be by default APP and locked or hidden. 3- Rename text to speech to speech to text. --- .../service_request_through_provider.dart | 4 +++ .../service_request_type_provider.dart | 4 +++ .../pages/user/requests/create_request.dart | 11 +++++-- .../speech_to_text/speech_to_text.dart | 4 +-- .../service_request_through_mune.dart | 6 ++-- .../service_request_types_mune.dart | 29 ++++++++++--------- 6 files changed, 38 insertions(+), 20 deletions(-) diff --git a/lib/controllers/providers/api/status_drop_down/service_reqest/service_request_through_provider.dart b/lib/controllers/providers/api/status_drop_down/service_reqest/service_request_through_provider.dart index cfc49f74..64106b31 100644 --- a/lib/controllers/providers/api/status_drop_down/service_reqest/service_request_through_provider.dart +++ b/lib/controllers/providers/api/status_drop_down/service_reqest/service_request_through_provider.dart @@ -66,4 +66,8 @@ class ServiceRequestedThroughProvider extends ChangeNotifier { return -1; } } + + Lookup getDefaultItem() { + return items?.firstWhere((element) => element.name.toLowerCase().contains("app")); + } } diff --git a/lib/controllers/providers/api/status_drop_down/service_reqest/service_request_type_provider.dart b/lib/controllers/providers/api/status_drop_down/service_reqest/service_request_type_provider.dart index a0c6cad2..e38d3e78 100644 --- a/lib/controllers/providers/api/status_drop_down/service_reqest/service_request_type_provider.dart +++ b/lib/controllers/providers/api/status_drop_down/service_reqest/service_request_type_provider.dart @@ -66,4 +66,8 @@ class ServiceRequestTypeProvider extends ChangeNotifier { return -1; } } + + Lookup getDefaultItem() { + return items?.firstWhere((element) => element.name.toLowerCase().contains("maintenance")); + } } diff --git a/lib/views/pages/user/requests/create_request.dart b/lib/views/pages/user/requests/create_request.dart index 14d7eb36..1989575d 100644 --- a/lib/views/pages/user/requests/create_request.dart +++ b/lib/views/pages/user/requests/create_request.dart @@ -31,6 +31,8 @@ import 'package:test_sa/views/widgets/status/service_request/service_request_thr import 'package:test_sa/views/widgets/status/service_request/service_request_types_mune.dart'; import 'package:test_sa/views/widgets/titles/app_sub_title.dart'; +import '../../../../controllers/providers/api/status_drop_down/service_reqest/service_request_through_provider.dart'; +import '../../../../controllers/providers/api/status_drop_down/service_reqest/service_request_type_provider.dart'; import '../../../widgets/date_and_time/date_picker.dart'; import '../../../widgets/status/service_request/service_request_first_action.dart'; import '../../../widgets/status/service_request/service_request_loan_availability.dart'; @@ -188,6 +190,7 @@ class CreateRequestPageState extends State { ), ServiceRequestTypesMenu( initialValue: _serviceRequest.type, + enabled: widget.serviceRequest != null, onSelect: (status) { _serviceRequest.type = status; }, @@ -201,9 +204,7 @@ class CreateRequestPageState extends State { ), ServiceRequestedThroughMenu( initialValue: _serviceRequest.requestedThrough, - onSelect: (status) { - _serviceRequest.requestedThrough = status; - }, + enabled: false, ), if (widget.serviceRequest != null) 12.height, if (widget.serviceRequest != null) const ASubTitle("First Action"), @@ -316,6 +317,10 @@ class CreateRequestPageState extends State { } _formKey.currentState.save(); _serviceRequest.deviceId = _device?.id; + if (widget.serviceRequest == null) { + _serviceRequest.requestedThrough = Provider.of(context, listen: false).getDefaultItem(); + _serviceRequest.type = Provider.of(context, listen: false).getDefaultItem(); + } _isLoading = true; setState(() {}); _serviceRequest.devicePhotos = _deviceImages.map((e) => "${e.path.split("/").last}|${base64Encode(e.readAsBytesSync())}").toList(); diff --git a/lib/views/widgets/speech_to_text/speech_to_text.dart b/lib/views/widgets/speech_to_text/speech_to_text.dart index 59b3d929..d1e8e12c 100644 --- a/lib/views/widgets/speech_to_text/speech_to_text.dart +++ b/lib/views/widgets/speech_to_text/speech_to_text.dart @@ -5,9 +5,9 @@ import 'package:speech_to_text/speech_recognition_error.dart'; import 'package:speech_to_text/speech_recognition_result.dart'; import 'package:speech_to_text/speech_to_text.dart'; import 'package:test_sa/controllers/providers/settings/setting_provider.dart'; +import 'package:test_sa/views/app_style/sizing.dart'; import 'package:test_sa/views/widgets/buttons/app_icon_button2.dart'; import 'package:test_sa/views/widgets/titles/app_sub_title.dart'; -import 'package:test_sa/views/app_style/sizing.dart'; class SpeechToTextButton extends StatefulWidget { final TextEditingController controller; @@ -86,7 +86,7 @@ class _SpeechToTextButtonState extends State { ), child: Row( children: [ - widget.mini ? SizedBox.shrink() : ASubTitle("Text To Speech"), + widget.mini ? const SizedBox.shrink() : const ASubTitle("Speech To Text"), widget.controller.text.isNotEmpty ? AIconButton2( iconData: Icons.delete, diff --git a/lib/views/widgets/status/service_request/service_request_through_mune.dart b/lib/views/widgets/status/service_request/service_request_through_mune.dart index 986a5953..1a735dc8 100644 --- a/lib/views/widgets/status/service_request/service_request_through_mune.dart +++ b/lib/views/widgets/status/service_request/service_request_through_mune.dart @@ -10,8 +10,9 @@ import 'package:test_sa/views/widgets/status/single_status_menu.dart'; class ServiceRequestedThroughMenu extends StatelessWidget { final Function(Lookup) onSelect; final Lookup initialValue; + final bool enabled; - const ServiceRequestedThroughMenu({Key key, this.onSelect, this.initialValue}) : super(key: key); + const ServiceRequestedThroughMenu({Key key, this.onSelect, this.initialValue, this.enabled = true}) : super(key: key); @override Widget build(BuildContext context) { final settingProvider = Provider.of(context); @@ -26,9 +27,10 @@ class ServiceRequestedThroughMenu extends StatelessWidget { await menuProvider.getData(user: userProvider.user, host: settingProvider.host); }, child: SingleStatusMenu( - initialStatus: initialValue, + initialStatus: enabled ? initialValue : menuProvider.getDefaultItem(), statuses: menuProvider.items, onSelect: onSelect, + enabled: enabled, )); } } diff --git a/lib/views/widgets/status/service_request/service_request_types_mune.dart b/lib/views/widgets/status/service_request/service_request_types_mune.dart index a588cb8b..7d561aca 100644 --- a/lib/views/widgets/status/service_request/service_request_types_mune.dart +++ b/lib/views/widgets/status/service_request/service_request_types_mune.dart @@ -10,25 +10,28 @@ import 'package:test_sa/views/widgets/status/single_status_menu.dart'; class ServiceRequestTypesMenu extends StatelessWidget { final Function(Lookup) onSelect; final Lookup initialValue; + final bool enabled; - const ServiceRequestTypesMenu({Key key, this.onSelect, this.initialValue}) : super(key: key); + const ServiceRequestTypesMenu({Key key, this.onSelect, this.initialValue, this.enabled = true}) : super(key: key); @override Widget build(BuildContext context) { final settingProvider = Provider.of(context); final userProvider = Provider.of(context); final menuProvider = Provider.of(context); return LoadingManager( - isLoading: menuProvider.isLoading, - isFailedLoading: menuProvider.items == null, - stateCode: menuProvider.stateCode, - onRefresh: () async { - menuProvider.reset(); - await menuProvider.getData(user: userProvider.user, host: settingProvider.host); - }, - child: SingleStatusMenu( - initialStatus: initialValue, - statuses: menuProvider.items, - onSelect: onSelect, - )); + isLoading: menuProvider.isLoading, + isFailedLoading: menuProvider.items == null, + stateCode: menuProvider.stateCode, + onRefresh: () async { + menuProvider.reset(); + await menuProvider.getData(user: userProvider.user, host: settingProvider.host); + }, + child: SingleStatusMenu( + initialStatus: enabled ? initialValue : menuProvider.getDefaultItem(), + statuses: menuProvider.items, + enabled: enabled, + onSelect: onSelect, + ), + ); } } From 54854ee9e8c313f329c3311f84d2380c688cb05f Mon Sep 17 00:00:00 2001 From: zaid_daoud Date: Tue, 1 Aug 2023 13:12:54 +0300 Subject: [PATCH 140/181] 1- Service Request Type for end user profile should be by default Maintenance Request and locked field. 2- Through field in new service request should be by default APP and locked or hidden. 3- Rename text to speech to speech to text. --- lib/views/pages/user/requests/create_request.dart | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/views/pages/user/requests/create_request.dart b/lib/views/pages/user/requests/create_request.dart index 1989575d..8d5b5340 100644 --- a/lib/views/pages/user/requests/create_request.dart +++ b/lib/views/pages/user/requests/create_request.dart @@ -318,9 +318,9 @@ class CreateRequestPageState extends State { _formKey.currentState.save(); _serviceRequest.deviceId = _device?.id; if (widget.serviceRequest == null) { - _serviceRequest.requestedThrough = Provider.of(context, listen: false).getDefaultItem(); _serviceRequest.type = Provider.of(context, listen: false).getDefaultItem(); } + _serviceRequest.requestedThrough = Provider.of(context, listen: false).getDefaultItem(); _isLoading = true; setState(() {}); _serviceRequest.devicePhotos = _deviceImages.map((e) => "${e.path.split("/").last}|${base64Encode(e.readAsBytesSync())}").toList(); From bb5cc8eda6822be286489fb0d5883da4db70c631 Mon Sep 17 00:00:00 2001 From: zaid_daoud Date: Tue, 1 Aug 2023 14:55:31 +0300 Subject: [PATCH 141/181] The speech to text in new service request is stop recording now Microphone permission issue on IOS has been fixed also the delete option is working in IOS version now --- ios/Podfile | 5 ++++ lib/views/widgets/sound/record_sound.dart | 9 ++++-- .../speech_to_text/speech_to_text.dart | 29 ++++++++++++------- 3 files changed, 29 insertions(+), 14 deletions(-) diff --git a/ios/Podfile b/ios/Podfile index 8623e160..2dff4172 100644 --- a/ios/Podfile +++ b/ios/Podfile @@ -42,6 +42,11 @@ post_install do |installer| project.targets.each do |target| target.build_configurations.each do |config| config.build_settings['IPHONEOS_DEPLOYMENT_TARGET'] = '12.0' + config.build_settings['GCC_PREPROCESSOR_DEFINITIONS'] ||= [ + '$(inherited)', + ## dart: PermissionGroup.microphone + 'PERMISSION_MICROPHONE=1', + ] end end end diff --git a/lib/views/widgets/sound/record_sound.dart b/lib/views/widgets/sound/record_sound.dart index 5ca797e4..ea2be0ea 100644 --- a/lib/views/widgets/sound/record_sound.dart +++ b/lib/views/widgets/sound/record_sound.dart @@ -1,6 +1,7 @@ import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; import 'package:flutter_sound/flutter_sound.dart'; +import 'package:fluttertoast/fluttertoast.dart'; import 'package:permission_handler/permission_handler.dart'; import 'package:rive/rive.dart'; import 'package:test_sa/views/widgets/buttons/app_icon_button2.dart'; @@ -71,6 +72,8 @@ class _RecordSoundState extends State { // await Permission.camera PermissionStatus status = await Permission.microphone.request(); if (!status.isGranted) { + PermissionStatus status = await Permission.microphone.request(); + Fluttertoast.showToast(msg: "Permission Denied"); return; } _rive.addController(SimpleAnimation('recording')); @@ -114,11 +117,11 @@ class _RecordSoundState extends State { @override Widget build(BuildContext context) { return Container( - padding: EdgeInsets.only(left: 12, right: 0), + padding: const EdgeInsets.only(left: 12, right: 0), decoration: BoxDecoration( - color: Color(0xfff5f5f5), + color: const Color(0xfff5f5f5), border: Border.all( - color: Color(0xffefefef), + color: const Color(0xffefefef), ), borderRadius: BorderRadius.circular(AppStyle.borderRadius * AppStyle.getScaleFactor(context)), ), diff --git a/lib/views/widgets/speech_to_text/speech_to_text.dart b/lib/views/widgets/speech_to_text/speech_to_text.dart index d1e8e12c..6ceb016f 100644 --- a/lib/views/widgets/speech_to_text/speech_to_text.dart +++ b/lib/views/widgets/speech_to_text/speech_to_text.dart @@ -16,13 +16,13 @@ class SpeechToTextButton extends StatefulWidget { const SpeechToTextButton({Key key, this.controller, this.mini = false}) : super(key: key); @override - _SpeechToTextButtonState createState() => _SpeechToTextButtonState(); + SpeechToTextButtonState createState() => SpeechToTextButtonState(); } -class _SpeechToTextButtonState extends State { +class SpeechToTextButtonState extends State { bool _speechEnabled = false; SettingProvider _settingProvider; - SpeechToText _speechToText = SpeechToText(); + final SpeechToText _speechToText = SpeechToText(); /// This has to happen only once per app void _initSpeech() async { @@ -63,12 +63,15 @@ class _SpeechToTextButtonState extends State { @override void initState() { _initSpeech(); + widget.controller.addListener(() { + setState(() {}); + }); super.initState(); } @override void setState(VoidCallback fn) { - if (!this.mounted) return; + if (!mounted) return; super.setState(fn); } @@ -76,11 +79,11 @@ class _SpeechToTextButtonState extends State { Widget build(BuildContext context) { _settingProvider = Provider.of(context); return Container( - padding: EdgeInsets.only(left: 12, right: 12), + padding: const EdgeInsets.only(left: 12, right: 12), decoration: BoxDecoration( - color: Color(0xfff5f5f5), + color: const Color(0xfff5f5f5), border: Border.all( - color: Color(0xffefefef), + color: const Color(0xffefefef), ), borderRadius: BorderRadius.circular(AppStyle.borderRadius * AppStyle.getScaleFactor(context)), ), @@ -95,8 +98,8 @@ class _SpeechToTextButtonState extends State { setState(() {}); }, ) - : SizedBox.shrink(), - Spacer(), + : const SizedBox.shrink(), + const Spacer(), TextButton( onPressed: () { if (_speechToText.isListening) return; @@ -110,7 +113,7 @@ class _SpeechToTextButtonState extends State { child: Text(_settingProvider.speechToText)), GestureDetector( child: _speechToText.isListening - ? Icon( + ? const Icon( Icons.fiber_manual_record, color: Colors.red, ) @@ -123,7 +126,11 @@ class _SpeechToTextButtonState extends State { Fluttertoast.showToast(msg: "microphone not available"); return; } - _startListening(); + if (_speechToText.isListening) { + _stopListening(); + } else { + _startListening(); + } }, ), ], From 64d9305b846ba65bc157121a4bcd05bc839de547 Mon Sep 17 00:00:00 2001 From: zaid_daoud Date: Tue, 1 Aug 2023 16:19:31 +0300 Subject: [PATCH 142/181] Site Field locked and the data retrieved from user info --- .../user/gas_refill/request_gas_refill.dart | 15 +++-- .../hospital_auto_complete_field_new.dart | 64 +++++++++++-------- 2 files changed, 46 insertions(+), 33 deletions(-) diff --git a/lib/views/pages/user/gas_refill/request_gas_refill.dart b/lib/views/pages/user/gas_refill/request_gas_refill.dart index cb186466..38f97f40 100644 --- a/lib/views/pages/user/gas_refill/request_gas_refill.dart +++ b/lib/views/pages/user/gas_refill/request_gas_refill.dart @@ -151,13 +151,13 @@ class _RequestGasRefillState extends State { _gasRefillProvider = Provider.of(context, listen: false); _gasRefillProvider.reset(); } - if (widget.gasRefillModel != null && _firstTime) { - _formModel = widget.gasRefillModel; - _formModel.status = const Lookup(value: 0); - HospitalsProvider().getHospitalsListByVal(searchVal: widget.gasRefillModel.clientName).then((value) { - _gasRefillProvider.hospital = value?.firstWhere((element) => element.name == widget.gasRefillModel.clientName, orElse: () => null); - print(_gasRefillProvider.hospital?.buildings?.length); - print(widget.gasRefillModel?.building?.name); + if (_firstTime) { + if (widget.gasRefillModel != null) { + _formModel = widget.gasRefillModel; + _formModel.status = const Lookup(value: 0); + } + HospitalsProvider().getHospitalsListByVal(searchVal: _userProvider.user?.clientName).then((value) { + _gasRefillProvider.hospital = value?.firstWhere((element) => element.name == _userProvider.user?.clientName, orElse: () => null); _gasRefillProvider.building = _gasRefillProvider.hospital?.buildings?.firstWhere((element) => element.name == widget.gasRefillModel?.building?.name, orElse: () => null); _gasRefillProvider.floor = _gasRefillProvider.building?.floors?.firstWhere((element) => element.name == widget.gasRefillModel?.floor?.name, orElse: () => null); _gasRefillProvider.department = _gasRefillProvider.floor?.departments?.firstWhere((element) => element.name == widget.gasRefillModel?.department?.departmentName, orElse: () => null); @@ -232,6 +232,7 @@ class _RequestGasRefillState extends State { height: 4, ), HospitalAutoCompleteField( + enabled: false, initialValue: _gasRefillProvider.hospital?.name, // onSave: (value){ // _search.hospital = value; diff --git a/lib/views/widgets/hospitals/hospital_auto_complete_field_new.dart b/lib/views/widgets/hospitals/hospital_auto_complete_field_new.dart index 1bc29fd6..6ca612a4 100644 --- a/lib/views/widgets/hospitals/hospital_auto_complete_field_new.dart +++ b/lib/views/widgets/hospitals/hospital_auto_complete_field_new.dart @@ -8,10 +8,12 @@ import 'package:test_sa/models/hospital.dart'; import 'package:test_sa/models/subtitle.dart'; import 'package:test_sa/views/app_style/colors.dart'; import 'package:test_sa/views/app_style/sizing.dart'; +import 'package:test_sa/views/widgets/loaders/app_loading.dart'; class HospitalAutoCompleteField extends StatefulWidget { final String initialValue; final Function(Hospital) onSearch; + final bool enabled; //final Function(Hospital) onSave; @@ -19,6 +21,7 @@ class HospitalAutoCompleteField extends StatefulWidget { Key key, this.onSearch, this.initialValue, + this.enabled = true, }) : super(key: key); @override @@ -66,32 +69,41 @@ class _HospitalAutoCompleteFieldState extends State { // AppStyle.boxShadow // ] ), - child: TypeAheadField( - textFieldConfiguration: TextFieldConfiguration( - style: Theme.of(context).textTheme.headline6, - controller: _controller, - textAlign: TextAlign.center, - decoration: InputDecoration( - hintText: _subtitle.hospital, - border: InputBorder.none, - disabledBorder: InputBorder.none, - focusedBorder: InputBorder.none, - enabledBorder: InputBorder.none, - ), - textInputAction: TextInputAction.search, - ), - suggestionsCallback: (vale) async { - return await HospitalsProvider().getHospitalsListByVal(searchVal: _controller.text); - }, - itemBuilder: (context, hospital) { - return ListTile( - title: Text(hospital.name), - ); - }, - onSuggestionSelected: (hospital) { - widget.onSearch(hospital); - }, - ), + child: widget.enabled + ? TypeAheadField( + textFieldConfiguration: TextFieldConfiguration( + style: Theme.of(context).textTheme.headline6, + controller: _controller, + textAlign: TextAlign.center, + decoration: InputDecoration( + hintText: _subtitle.hospital, + border: InputBorder.none, + disabledBorder: InputBorder.none, + focusedBorder: InputBorder.none, + enabledBorder: InputBorder.none, + ), + textInputAction: TextInputAction.search, + ), + suggestionsCallback: (vale) async { + return await HospitalsProvider().getHospitalsListByVal(searchVal: _controller.text); + }, + itemBuilder: (context, hospital) { + return ListTile( + title: Text(hospital.name), + ); + }, + onSuggestionSelected: (hospital) { + widget.onSearch(hospital); + }, + ) + : widget.initialValue == null + ? const Padding( + padding: EdgeInsets.all(8.0), + child: ALoading(), + ) + : ListTile( + title: Center(child: Text(widget.initialValue)), + ), ); } } From 8df2edd55f4be960c55d901c213b349edb2deb01 Mon Sep 17 00:00:00 2001 From: zaid_daoud Date: Tue, 1 Aug 2023 16:21:41 +0300 Subject: [PATCH 143/181] Rename Transfer Device to Transfer Asset --- .../pages/device_transfer/request_device_transfer.dart | 8 ++------ lib/views/pages/user/land_page.dart | 2 +- 2 files changed, 3 insertions(+), 7 deletions(-) diff --git a/lib/views/pages/device_transfer/request_device_transfer.dart b/lib/views/pages/device_transfer/request_device_transfer.dart index 5ec58012..9b9dc96c 100644 --- a/lib/views/pages/device_transfer/request_device_transfer.dart +++ b/lib/views/pages/device_transfer/request_device_transfer.dart @@ -1,7 +1,5 @@ import 'package:flutter/material.dart'; -import 'package:fluttertoast/fluttertoast.dart'; import 'package:provider/provider.dart'; -import 'package:test_sa/controllers/api_routes/http_status_manger.dart'; import 'package:test_sa/controllers/providers/api/device_transfer_provider.dart'; import 'package:test_sa/controllers/providers/api/user_provider.dart'; import 'package:test_sa/controllers/providers/settings/setting_provider.dart'; @@ -12,9 +10,7 @@ import 'package:test_sa/models/device/device_transfer_info.dart'; import 'package:test_sa/models/subtitle.dart'; import 'package:test_sa/views/app_style/sizing.dart'; import 'package:test_sa/views/widgets/buttons/app_button.dart'; -import 'package:test_sa/views/widgets/departments/department_button.dart'; import 'package:test_sa/views/widgets/equipment/device_button.dart'; -import 'package:test_sa/views/widgets/hospitals/hospital_button.dart'; import 'package:test_sa/views/widgets/loaders/loading_manager.dart'; import 'package:test_sa/views/widgets/titles/app_sub_title.dart'; @@ -120,7 +116,7 @@ class _RequestDeviceTransferState extends State { child: Padding( padding: const EdgeInsets.all(8.0), child: Text( - "Transfer Device", + "Transfer Asset", style: Theme.of(context).textTheme.headline5.copyWith(color: Theme.of(context).primaryColor, fontSize: 28, fontWeight: FontWeight.bold), ), ), @@ -140,7 +136,7 @@ class _RequestDeviceTransferState extends State { // }, // ), 12.height, - const ASubTitle("Device"), + const ASubTitle("Asset"), if (_validate && _formModel.device == null) ASubTitle( _subtitle.requiredWord, diff --git a/lib/views/pages/user/land_page.dart b/lib/views/pages/user/land_page.dart index 3aa625e1..3ab26e39 100644 --- a/lib/views/pages/user/land_page.dart +++ b/lib/views/pages/user/land_page.dart @@ -199,7 +199,7 @@ class _LandPageState extends State { }, ), LandPageItem( - text: "transfer Device", + text: "Transfer Asset", icon: FontAwesomeIcons.rightLeft, onPressed: () { Navigator.of(context).pushNamed(RequestDeviceTransfer.id); From 5941a421e29e6d1bc39425bfa29c5c1ef90d3a93 Mon Sep 17 00:00:00 2001 From: zaid_daoud Date: Wed, 2 Aug 2023 10:08:28 +0300 Subject: [PATCH 144/181] Not Required Solution --- .../request_device_transfer.dart | 36 +++++++++++++++---- 1 file changed, 30 insertions(+), 6 deletions(-) diff --git a/lib/views/pages/device_transfer/request_device_transfer.dart b/lib/views/pages/device_transfer/request_device_transfer.dart index 9b9dc96c..c476a455 100644 --- a/lib/views/pages/device_transfer/request_device_transfer.dart +++ b/lib/views/pages/device_transfer/request_device_transfer.dart @@ -1,3 +1,5 @@ +import 'dart:developer'; + import 'package:flutter/material.dart'; import 'package:provider/provider.dart'; import 'package:test_sa/controllers/providers/api/device_transfer_provider.dart'; @@ -15,7 +17,9 @@ import 'package:test_sa/views/widgets/loaders/loading_manager.dart'; import 'package:test_sa/views/widgets/titles/app_sub_title.dart'; import '../../../../controllers/localization/localization.dart'; +import '../../../controllers/providers/api/hospitals_provider.dart'; import '../../../controllers/validator/validator.dart'; +import '../../../models/hospital.dart'; import '../../widgets/app_text_form_field.dart'; import '../../widgets/gas_refill/building_type_menu.dart'; import '../../widgets/gas_refill/department_type_menu.dart'; @@ -145,9 +149,24 @@ class _RequestDeviceTransferState extends State { 6.height, DeviceButton( device: _formModel.device, - onDevicePick: (device) { + onDevicePick: (device) async { _formModel.device = device; + log(device?.hospital?.toMap().toString()); + // _deviceTransferProvider.building.name = device.destDepartmentName; + // _deviceTransferProvider.building?.name = device.destBuildingName; + _isLoading = true; setState(() {}); + HospitalsProvider().getHospitalsListByVal(searchVal: device.hospital.name).then((hos) { + _isLoading = false; + _setHospital(hos.firstWhere((element) => element.name == device.hospital.name)); + _deviceTransferProvider.department = _deviceTransferProvider.hospital.buildings + ?.firstWhere((element) => element.name == device.destBuildingName, orElse: () => null) + ?.floors + ?.firstWhere((element) => element.name == device.destFloor, orElse: () => null) + ?.departments + ?.firstWhere((element) => element.name == device.destDepartmentName, orElse: () => null); + setState(() {}); + }); }, ), // const SizedBox(height: 8,), @@ -202,16 +221,13 @@ class _RequestDeviceTransferState extends State { height: 4, ), HospitalAutoCompleteField( + enabled: false, initialValue: _deviceTransferProvider.hospital?.name, // onSave: (value){ // _search.hospital = value; // }, onSearch: (value) { - _deviceTransferProvider.hospital = value; - _deviceTransferProvider.building = null; - _deviceTransferProvider.floor = null; - _deviceTransferProvider.department = null; - _formModel.receiver.client = value; + _setHospital(value); setState(() {}); }, ), @@ -276,4 +292,12 @@ class _RequestDeviceTransferState extends State { ), ); } + + void _setHospital(Hospital hospital) { + _deviceTransferProvider.hospital = hospital; + _deviceTransferProvider.building = null; + _deviceTransferProvider.floor = null; + _deviceTransferProvider.department = null; + _formModel.receiver.client = hospital; + } } From fc52f7ec3023b97718078ab19f0d49e5b7736a53 Mon Sep 17 00:00:00 2001 From: zaid_daoud Date: Wed, 2 Aug 2023 10:29:55 +0300 Subject: [PATCH 145/181] View the site and department of picked asset --- .../request_device_transfer.dart | 81 +++++++++++-------- 1 file changed, 48 insertions(+), 33 deletions(-) diff --git a/lib/views/pages/device_transfer/request_device_transfer.dart b/lib/views/pages/device_transfer/request_device_transfer.dart index c476a455..61918a0c 100644 --- a/lib/views/pages/device_transfer/request_device_transfer.dart +++ b/lib/views/pages/device_transfer/request_device_transfer.dart @@ -1,5 +1,3 @@ -import 'dart:developer'; - import 'package:flutter/material.dart'; import 'package:provider/provider.dart'; import 'package:test_sa/controllers/providers/api/device_transfer_provider.dart'; @@ -17,9 +15,8 @@ import 'package:test_sa/views/widgets/loaders/loading_manager.dart'; import 'package:test_sa/views/widgets/titles/app_sub_title.dart'; import '../../../../controllers/localization/localization.dart'; -import '../../../controllers/providers/api/hospitals_provider.dart'; import '../../../controllers/validator/validator.dart'; -import '../../../models/hospital.dart'; +import '../../app_style/colors.dart'; import '../../widgets/app_text_form_field.dart'; import '../../widgets/gas_refill/building_type_menu.dart'; import '../../widgets/gas_refill/department_type_menu.dart'; @@ -45,7 +42,6 @@ class _RequestDeviceTransferState extends State { final DeviceTransfer _formModel = DeviceTransfer(receiver: DeviceTransferInfo(), sender: DeviceTransferInfo()); final GlobalKey _formKey = GlobalKey(); final GlobalKey _scaffoldKey = GlobalKey(); - @override void setState(VoidCallback fn) { if (mounted) super.setState(() {}); @@ -149,26 +145,50 @@ class _RequestDeviceTransferState extends State { 6.height, DeviceButton( device: _formModel.device, - onDevicePick: (device) async { + onDevicePick: (device) { _formModel.device = device; - log(device?.hospital?.toMap().toString()); - // _deviceTransferProvider.building.name = device.destDepartmentName; - // _deviceTransferProvider.building?.name = device.destBuildingName; - _isLoading = true; setState(() {}); - HospitalsProvider().getHospitalsListByVal(searchVal: device.hospital.name).then((hos) { - _isLoading = false; - _setHospital(hos.firstWhere((element) => element.name == device.hospital.name)); - _deviceTransferProvider.department = _deviceTransferProvider.hospital.buildings - ?.firstWhere((element) => element.name == device.destBuildingName, orElse: () => null) - ?.floors - ?.firstWhere((element) => element.name == device.destFloor, orElse: () => null) - ?.departments - ?.firstWhere((element) => element.name == device.destDepartmentName, orElse: () => null); - setState(() {}); - }); }, ), + if (_formModel.device != null) 8.height, + if (_formModel.device != null) const ASubTitle("Site"), + if (_formModel.device != null) + Container( + width: double.infinity, + alignment: Alignment.center, + padding: const EdgeInsets.symmetric(horizontal: 8, vertical: 16), + decoration: BoxDecoration( + color: AColors.inputFieldBackgroundColor, + border: Border.all( + color: const Color(0xffefefef), + ), + borderRadius: BorderRadius.circular(AppStyle.borderRadius * AppStyle.getScaleFactor(context)), + // boxShadow: const [ + // AppStyle.boxShadow + // ] + ), + child: ASubTitle(_formModel.device?.hospital?.name), + ), + if (_formModel.device != null) 4.height, + if (_formModel.device != null && _formModel.device.destDepartmentName != null) const ASubTitle("Department"), + if (_formModel.device != null && _formModel.device.destDepartmentName != null) + Container( + width: double.infinity, + alignment: Alignment.center, + padding: const EdgeInsets.symmetric(horizontal: 8, vertical: 16), + decoration: BoxDecoration( + color: AColors.inputFieldBackgroundColor, + border: Border.all( + color: const Color(0xffefefef), + ), + borderRadius: BorderRadius.circular(AppStyle.borderRadius * AppStyle.getScaleFactor(context)), + // boxShadow: const [ + // AppStyle.boxShadow + // ] + ), + child: ASubTitle(_formModel.device.destDepartmentName.toString()), + ), + if (_formModel.device != null) 8.height, // const SizedBox(height: 8,), // const ASubTitle("Sender Department"), // if(_validate && _formModel.senderDepartment == null) @@ -221,13 +241,16 @@ class _RequestDeviceTransferState extends State { height: 4, ), HospitalAutoCompleteField( - enabled: false, initialValue: _deviceTransferProvider.hospital?.name, // onSave: (value){ // _search.hospital = value; // }, onSearch: (value) { - _setHospital(value); + _deviceTransferProvider.hospital = value; + _deviceTransferProvider.building = null; + _deviceTransferProvider.floor = null; + _deviceTransferProvider.department = null; + _formModel.receiver.client = value; setState(() {}); }, ), @@ -262,8 +285,8 @@ class _RequestDeviceTransferState extends State { }, ), const SizedBox(height: 8), - ASubTitle("Room"), - SizedBox( + const ASubTitle("Room"), + const SizedBox( height: 4, ), ATextFormField( @@ -292,12 +315,4 @@ class _RequestDeviceTransferState extends State { ), ); } - - void _setHospital(Hospital hospital) { - _deviceTransferProvider.hospital = hospital; - _deviceTransferProvider.building = null; - _deviceTransferProvider.floor = null; - _deviceTransferProvider.department = null; - _formModel.receiver.client = hospital; - } } From ff9cb5102c302c53b8c814c0079a49d007941169 Mon Sep 17 00:00:00 2001 From: zaid_daoud Date: Wed, 2 Aug 2023 10:34:08 +0300 Subject: [PATCH 146/181] Solution #2 : View the site and department of picked asset --- .../request_device_transfer.dart | 80 ++++++++----------- 1 file changed, 32 insertions(+), 48 deletions(-) diff --git a/lib/views/pages/device_transfer/request_device_transfer.dart b/lib/views/pages/device_transfer/request_device_transfer.dart index 61918a0c..20adb9ec 100644 --- a/lib/views/pages/device_transfer/request_device_transfer.dart +++ b/lib/views/pages/device_transfer/request_device_transfer.dart @@ -1,3 +1,5 @@ +import 'dart:developer'; + import 'package:flutter/material.dart'; import 'package:provider/provider.dart'; import 'package:test_sa/controllers/providers/api/device_transfer_provider.dart'; @@ -15,8 +17,9 @@ import 'package:test_sa/views/widgets/loaders/loading_manager.dart'; import 'package:test_sa/views/widgets/titles/app_sub_title.dart'; import '../../../../controllers/localization/localization.dart'; +import '../../../controllers/providers/api/hospitals_provider.dart'; import '../../../controllers/validator/validator.dart'; -import '../../app_style/colors.dart'; +import '../../../models/hospital.dart'; import '../../widgets/app_text_form_field.dart'; import '../../widgets/gas_refill/building_type_menu.dart'; import '../../widgets/gas_refill/department_type_menu.dart'; @@ -42,6 +45,7 @@ class _RequestDeviceTransferState extends State { final DeviceTransfer _formModel = DeviceTransfer(receiver: DeviceTransferInfo(), sender: DeviceTransferInfo()); final GlobalKey _formKey = GlobalKey(); final GlobalKey _scaffoldKey = GlobalKey(); + @override void setState(VoidCallback fn) { if (mounted) super.setState(() {}); @@ -145,50 +149,26 @@ class _RequestDeviceTransferState extends State { 6.height, DeviceButton( device: _formModel.device, - onDevicePick: (device) { + onDevicePick: (device) async { _formModel.device = device; + log(device?.hospital?.toMap().toString()); + // _deviceTransferProvider.building.name = device.destDepartmentName; + // _deviceTransferProvider.building?.name = device.destBuildingName; + _isLoading = true; setState(() {}); + HospitalsProvider().getHospitalsListByVal(searchVal: device.hospital.name).then((hos) { + _isLoading = false; + _setHospital(hos.firstWhere((element) => element.name == device.hospital.name)); + _deviceTransferProvider.department = _deviceTransferProvider.hospital.buildings + ?.firstWhere((element) => element.name == device.destBuildingName, orElse: () => null) + ?.floors + ?.firstWhere((element) => element.name == device.destFloor, orElse: () => null) + ?.departments + ?.firstWhere((element) => element.name == device.destDepartmentName, orElse: () => null); + setState(() {}); + }); }, ), - if (_formModel.device != null) 8.height, - if (_formModel.device != null) const ASubTitle("Site"), - if (_formModel.device != null) - Container( - width: double.infinity, - alignment: Alignment.center, - padding: const EdgeInsets.symmetric(horizontal: 8, vertical: 16), - decoration: BoxDecoration( - color: AColors.inputFieldBackgroundColor, - border: Border.all( - color: const Color(0xffefefef), - ), - borderRadius: BorderRadius.circular(AppStyle.borderRadius * AppStyle.getScaleFactor(context)), - // boxShadow: const [ - // AppStyle.boxShadow - // ] - ), - child: ASubTitle(_formModel.device?.hospital?.name), - ), - if (_formModel.device != null) 4.height, - if (_formModel.device != null && _formModel.device.destDepartmentName != null) const ASubTitle("Department"), - if (_formModel.device != null && _formModel.device.destDepartmentName != null) - Container( - width: double.infinity, - alignment: Alignment.center, - padding: const EdgeInsets.symmetric(horizontal: 8, vertical: 16), - decoration: BoxDecoration( - color: AColors.inputFieldBackgroundColor, - border: Border.all( - color: const Color(0xffefefef), - ), - borderRadius: BorderRadius.circular(AppStyle.borderRadius * AppStyle.getScaleFactor(context)), - // boxShadow: const [ - // AppStyle.boxShadow - // ] - ), - child: ASubTitle(_formModel.device.destDepartmentName.toString()), - ), - if (_formModel.device != null) 8.height, // const SizedBox(height: 8,), // const ASubTitle("Sender Department"), // if(_validate && _formModel.senderDepartment == null) @@ -246,11 +226,7 @@ class _RequestDeviceTransferState extends State { // _search.hospital = value; // }, onSearch: (value) { - _deviceTransferProvider.hospital = value; - _deviceTransferProvider.building = null; - _deviceTransferProvider.floor = null; - _deviceTransferProvider.department = null; - _formModel.receiver.client = value; + _setHospital(value); setState(() {}); }, ), @@ -285,8 +261,8 @@ class _RequestDeviceTransferState extends State { }, ), const SizedBox(height: 8), - const ASubTitle("Room"), - const SizedBox( + ASubTitle("Room"), + SizedBox( height: 4, ), ATextFormField( @@ -315,4 +291,12 @@ class _RequestDeviceTransferState extends State { ), ); } + + void _setHospital(Hospital hospital) { + _deviceTransferProvider.hospital = hospital; + _deviceTransferProvider.building = null; + _deviceTransferProvider.floor = null; + _deviceTransferProvider.department = null; + _formModel.receiver.client = hospital; + } } From 4d548e1048739890ef5c29002a77d0192928cb2f Mon Sep 17 00:00:00 2001 From: zaid_daoud Date: Wed, 2 Aug 2023 11:20:33 +0300 Subject: [PATCH 147/181] In Asset Transfer request add Destination label under pick asset --- lib/models/device/device.dart | 8 +- .../request_device_transfer.dart | 82 +++++++++++-------- .../equipment/single_device_picker.dart | 1 - .../gas_refill/building_type_menu.dart | 2 +- .../widgets/gas_refill/floor_type_menu.dart | 2 +- 5 files changed, 56 insertions(+), 39 deletions(-) diff --git a/lib/models/device/device.dart b/lib/models/device/device.dart index 40d2f92b..6c1f5cfe 100644 --- a/lib/models/device/device.dart +++ b/lib/models/device/device.dart @@ -43,10 +43,10 @@ class Device { assetName: parsedJson["assetName"], modelDefinition: ModelDefinition.fromJson(parsedJson["modelDefinition"]), hospital: Hospital.fromJson(parsedJson["site"]), - destBuildingName: parsedJson["destBuildingName"], - destDepartmentName: parsedJson["destDepartmentName"], - destRoom: parsedJson["destRoom"], - destFloor: parsedJson["destFloor"], + destBuildingName: parsedJson["destBuildingName"] ?? parsedJson['building']['name'], + destDepartmentName: parsedJson["destDepartmentName"] ?? parsedJson['department']['departmentName'], + destRoom: parsedJson["destRoom"] ?? parsedJson['room'], + destFloor: parsedJson["destFloor"] ?? parsedJson['floor']['name'], destSiteName: parsedJson['destSiteName'] // parsedJson["modelDefinition"] == null ? "" : // parsedJson["modelDefinition"]["manufacturerName"], diff --git a/lib/views/pages/device_transfer/request_device_transfer.dart b/lib/views/pages/device_transfer/request_device_transfer.dart index 20adb9ec..8d6dbab0 100644 --- a/lib/views/pages/device_transfer/request_device_transfer.dart +++ b/lib/views/pages/device_transfer/request_device_transfer.dart @@ -1,5 +1,3 @@ -import 'dart:developer'; - import 'package:flutter/material.dart'; import 'package:provider/provider.dart'; import 'package:test_sa/controllers/providers/api/device_transfer_provider.dart'; @@ -17,9 +15,8 @@ import 'package:test_sa/views/widgets/loaders/loading_manager.dart'; import 'package:test_sa/views/widgets/titles/app_sub_title.dart'; import '../../../../controllers/localization/localization.dart'; -import '../../../controllers/providers/api/hospitals_provider.dart'; import '../../../controllers/validator/validator.dart'; -import '../../../models/hospital.dart'; +import '../../app_style/colors.dart'; import '../../widgets/app_text_form_field.dart'; import '../../widgets/gas_refill/building_type_menu.dart'; import '../../widgets/gas_refill/department_type_menu.dart'; @@ -45,7 +42,6 @@ class _RequestDeviceTransferState extends State { final DeviceTransfer _formModel = DeviceTransfer(receiver: DeviceTransferInfo(), sender: DeviceTransferInfo()); final GlobalKey _formKey = GlobalKey(); final GlobalKey _scaffoldKey = GlobalKey(); - @override void setState(VoidCallback fn) { if (mounted) super.setState(() {}); @@ -149,26 +145,50 @@ class _RequestDeviceTransferState extends State { 6.height, DeviceButton( device: _formModel.device, - onDevicePick: (device) async { + onDevicePick: (device) { _formModel.device = device; - log(device?.hospital?.toMap().toString()); - // _deviceTransferProvider.building.name = device.destDepartmentName; - // _deviceTransferProvider.building?.name = device.destBuildingName; - _isLoading = true; setState(() {}); - HospitalsProvider().getHospitalsListByVal(searchVal: device.hospital.name).then((hos) { - _isLoading = false; - _setHospital(hos.firstWhere((element) => element.name == device.hospital.name)); - _deviceTransferProvider.department = _deviceTransferProvider.hospital.buildings - ?.firstWhere((element) => element.name == device.destBuildingName, orElse: () => null) - ?.floors - ?.firstWhere((element) => element.name == device.destFloor, orElse: () => null) - ?.departments - ?.firstWhere((element) => element.name == device.destDepartmentName, orElse: () => null); - setState(() {}); - }); }, ), + if (_formModel.device != null) 8.height, + if (_formModel.device != null) const ASubTitle("Asset Site"), + if (_formModel.device != null) + Container( + width: double.infinity, + alignment: Alignment.center, + padding: const EdgeInsets.symmetric(horizontal: 8, vertical: 16), + decoration: BoxDecoration( + color: AColors.inputFieldBackgroundColor, + border: Border.all( + color: const Color(0xffefefef), + ), + borderRadius: BorderRadius.circular(AppStyle.borderRadius * AppStyle.getScaleFactor(context)), + // boxShadow: const [ + // AppStyle.boxShadow + // ] + ), + child: ASubTitle(_formModel.device?.hospital?.name), + ), + if (_formModel.device != null) 4.height, + if (_formModel.device != null && _formModel.device.destDepartmentName != null) const ASubTitle("Asset Department"), + if (_formModel.device != null && _formModel.device.destDepartmentName != null) + Container( + width: double.infinity, + alignment: Alignment.center, + padding: const EdgeInsets.symmetric(horizontal: 8, vertical: 16), + decoration: BoxDecoration( + color: AColors.inputFieldBackgroundColor, + border: Border.all( + color: const Color(0xffefefef), + ), + borderRadius: BorderRadius.circular(AppStyle.borderRadius * AppStyle.getScaleFactor(context)), + // boxShadow: const [ + // AppStyle.boxShadow + // ] + ), + child: ASubTitle(_formModel.device.destDepartmentName.toString()), + ), + if (_formModel.device != null) 8.height, // const SizedBox(height: 8,), // const ASubTitle("Sender Department"), // if(_validate && _formModel.senderDepartment == null) @@ -217,6 +237,8 @@ class _RequestDeviceTransferState extends State { Divider( color: Theme.of(context).colorScheme.primary, ), + const SizedBox(height: 8), + const ASubTitle("Destination"), const SizedBox( height: 4, ), @@ -226,7 +248,11 @@ class _RequestDeviceTransferState extends State { // _search.hospital = value; // }, onSearch: (value) { - _setHospital(value); + _deviceTransferProvider.hospital = value; + _deviceTransferProvider.building = null; + _deviceTransferProvider.floor = null; + _deviceTransferProvider.department = null; + _formModel.receiver.client = value; setState(() {}); }, ), @@ -261,8 +287,8 @@ class _RequestDeviceTransferState extends State { }, ), const SizedBox(height: 8), - ASubTitle("Room"), - SizedBox( + const ASubTitle("Room"), + const SizedBox( height: 4, ), ATextFormField( @@ -291,12 +317,4 @@ class _RequestDeviceTransferState extends State { ), ); } - - void _setHospital(Hospital hospital) { - _deviceTransferProvider.hospital = hospital; - _deviceTransferProvider.building = null; - _deviceTransferProvider.floor = null; - _deviceTransferProvider.department = null; - _formModel.receiver.client = hospital; - } } diff --git a/lib/views/widgets/equipment/single_device_picker.dart b/lib/views/widgets/equipment/single_device_picker.dart index 508601bd..3ae33b7d 100644 --- a/lib/views/widgets/equipment/single_device_picker.dart +++ b/lib/views/widgets/equipment/single_device_picker.dart @@ -1,5 +1,4 @@ import 'package:flutter/material.dart'; -import 'package:fluttertoast/fluttertoast.dart'; import 'package:provider/provider.dart'; import 'package:test_sa/controllers/localization/localization.dart'; import 'package:test_sa/controllers/providers/api/devices_provider.dart'; diff --git a/lib/views/widgets/gas_refill/building_type_menu.dart b/lib/views/widgets/gas_refill/building_type_menu.dart index 2043f157..afccd900 100644 --- a/lib/views/widgets/gas_refill/building_type_menu.dart +++ b/lib/views/widgets/gas_refill/building_type_menu.dart @@ -80,7 +80,7 @@ class _BuildingTypeMenuState extends State { return DropdownMenuItem( value: value, child: Text( - value.name, + value.name ?? "", style: Theme.of(context).textTheme.subtitle1.copyWith( color: Theme.of(context).primaryColor, fontSize: 11, diff --git a/lib/views/widgets/gas_refill/floor_type_menu.dart b/lib/views/widgets/gas_refill/floor_type_menu.dart index e8fe78f7..df5d3325 100644 --- a/lib/views/widgets/gas_refill/floor_type_menu.dart +++ b/lib/views/widgets/gas_refill/floor_type_menu.dart @@ -80,7 +80,7 @@ class _FloorTypeMenuState extends State { return DropdownMenuItem( value: value, child: Text( - value.name, + value.name ?? "", style: Theme.of(context).textTheme.subtitle1.copyWith( color: Theme.of(context).primaryColor, fontSize: 11, From 11f95b9578b76b3c27652f4b5c8151bd75fdb7a8 Mon Sep 17 00:00:00 2001 From: zaid_daoud Date: Wed, 2 Aug 2023 14:17:43 +0300 Subject: [PATCH 148/181] Search in service request, preventive maintenance, gas refill, and transfer to arrange the requests from most recent to earliestt --- .../api/device_transfer_provider.dart | 10 ++++ .../providers/api/devices_provider.dart | 6 +-- .../providers/api/gas_refill_provider.dart | 9 ++++ .../api/regular_visits_provider.dart | 7 +++ .../api/service_requests_provider.dart | 7 +++ lib/models/device/device.dart | 10 ++-- lib/models/device/device_transfer.dart | 4 ++ .../service_request_search.dart | 3 ++ lib/models/visits/visit.dart | 50 ++++++++++--------- lib/models/visits/visits_search.dart | 3 ++ .../track_device_transfer.dart | 17 +++++++ .../user/gas_refill/request_gas_refill.dart | 5 +- .../user/gas_refill/track_gas_refill.dart | 18 +++++++ .../search/service_request_search_bar.dart | 13 ++++- .../widgets/search/visits_search_bar.dart | 11 +++- lib/views/widgets/switch_button.dart | 44 ++++++++++++++++ 16 files changed, 179 insertions(+), 38 deletions(-) create mode 100644 lib/views/widgets/switch_button.dart diff --git a/lib/controllers/providers/api/device_transfer_provider.dart b/lib/controllers/providers/api/device_transfer_provider.dart index ca5234ce..453954be 100644 --- a/lib/controllers/providers/api/device_transfer_provider.dart +++ b/lib/controllers/providers/api/device_transfer_provider.dart @@ -60,9 +60,11 @@ class DeviceTransferProvider extends ChangeNotifier { Future getRequests({ @required String host, @required User user, + bool mostRecent, }) async { if (isLoading == true) return -2; isLoading = true; + notifyListeners(); Response response; try { Map body = {}; @@ -81,6 +83,7 @@ class DeviceTransferProvider extends ChangeNotifier { List itemsPage = listJson.map((request) => DeviceTransfer.fromJson(request)).toList(); items ??= []; items.addAll(itemsPage); + sortMostRecent(items, mostRecent); print(listJson); if (itemsPage.length == pageItemNumber) { nextPage = true; @@ -99,6 +102,13 @@ class DeviceTransferProvider extends ChangeNotifier { } } + void sortMostRecent(List transfer, bool mostRecent) { + if (mostRecent != null) { + transfer.sort((prev, next) => + (mostRecent ?? false) ? DateTime.tryParse(next.createdOn).compareTo(DateTime.tryParse(prev.createdOn)) : DateTime.tryParse(prev.createdOn).compareTo(DateTime.tryParse(next.createdOn))); + } + } + Future createRequest({ @required String host, @required User user, diff --git a/lib/controllers/providers/api/devices_provider.dart b/lib/controllers/providers/api/devices_provider.dart index 2d55a2a7..f3959586 100644 --- a/lib/controllers/providers/api/devices_provider.dart +++ b/lib/controllers/providers/api/devices_provider.dart @@ -70,7 +70,7 @@ class DevicesProvider extends ChangeNotifier { if (response.statusCode >= 200 && response.statusCode < 300) { // client's request was successfully received List equipmentListJson = json.decode(response.body)["data"]; - _devices.addAll(equipmentListJson.map((device) => Device.fromJson(device)).toList()); + _devices.addAll(equipmentListJson.map((device) => Device.fromJson(device, startKeyWithDest: false)).toList()); nextPage = true; } else { nextPage = false; @@ -111,8 +111,8 @@ class DevicesProvider extends ChangeNotifier { if (response.statusCode >= 200 && response.statusCode < 300) { // client's request was successfully received List equipmentListJson = json.decode(response.body)["data"]; - page = equipmentListJson.map((device) => Device.fromJson(device)).toList(); - _devices.addAll(equipmentListJson.map((device) => Device.fromJson(device)).toList()); + page = equipmentListJson.map((device) => Device.fromJson(device, startKeyWithDest: false)).toList(); + _devices.addAll(equipmentListJson.map((device) => Device.fromJson(device, startKeyWithDest: false)).toList()); notifyListeners(); } return page; diff --git a/lib/controllers/providers/api/gas_refill_provider.dart b/lib/controllers/providers/api/gas_refill_provider.dart index faf84d66..cadcf8eb 100644 --- a/lib/controllers/providers/api/gas_refill_provider.dart +++ b/lib/controllers/providers/api/gas_refill_provider.dart @@ -47,9 +47,11 @@ class GasRefillProvider extends ChangeNotifier { Future getRequests({ @required String host, @required User user, + bool mostRecent, }) async { if (isLoading == true) return -2; isLoading = true; + notifyListeners(); Response response; Map body = {}; @@ -68,6 +70,7 @@ class GasRefillProvider extends ChangeNotifier { List itemsPage = requestsListJson.map((request) => GasRefillModel.fromJson(request)).toList(); items ??= []; items.addAll(itemsPage); + sortMostRecent(items, mostRecent); if (itemsPage.length == pageItemNumber) { nextPage = true; } else { @@ -86,6 +89,12 @@ class GasRefillProvider extends ChangeNotifier { } } + void sortMostRecent(List models, bool mostRecent) { + if (mostRecent != null) { + models.sort((prev, next) => (mostRecent ?? false) ? next.title.compareTo(prev.title) : prev.title.compareTo(next.title)); + } + } + Future createModel({ @required String host, @required User user, diff --git a/lib/controllers/providers/api/regular_visits_provider.dart b/lib/controllers/providers/api/regular_visits_provider.dart index 42fb1dd9..25e330f7 100644 --- a/lib/controllers/providers/api/regular_visits_provider.dart +++ b/lib/controllers/providers/api/regular_visits_provider.dart @@ -79,6 +79,7 @@ class RegularVisitsProvider extends ChangeNotifier { List requestsListJson = json.decode(response.body)["data"]; List _visits = requestsListJson.map((request) => Visit.fromJson(request)).toList(); visits ??= []; + sortMostRecent(_visits); visits.addAll(_visits); if (_visits.length == pageItemNumber) { nextPage = true; @@ -98,6 +99,12 @@ class RegularVisitsProvider extends ChangeNotifier { return response.statusCode; } + void sortMostRecent(List visits) { + visits.sort((prev, next) => (visitsSearch.mostRecent ?? false) + ? DateTime.tryParse(next.createdOn).compareTo(DateTime.tryParse(prev.createdOn)) + : DateTime.tryParse(prev.createdOn).compareTo(DateTime.tryParse(next.createdOn))); + } + /// return -2 if request in progress /// return -1 if error happen when sending request /// return state code if request complete may be 200, 404 or 403 diff --git a/lib/controllers/providers/api/service_requests_provider.dart b/lib/controllers/providers/api/service_requests_provider.dart index 8b014f83..d255f7bc 100644 --- a/lib/controllers/providers/api/service_requests_provider.dart +++ b/lib/controllers/providers/api/service_requests_provider.dart @@ -76,6 +76,7 @@ class ServiceRequestsProvider extends ChangeNotifier { List requestsListJson = json.decode(response.body)["data"]; List serviceRequestsPage = requestsListJson.map((request) => ServiceRequest.fromJson(request)).toList(); serviceRequests ??= []; + sortMostRecent(serviceRequestsPage); serviceRequests.addAll(serviceRequestsPage); if (serviceRequestsPage.length == pageItemNumber) { nextPage = true; @@ -94,6 +95,12 @@ class ServiceRequestsProvider extends ChangeNotifier { } } + void sortMostRecent(List requests) { + requests.sort( + (prev, next) => (search.mostRecent ?? false) ? DateTime.tryParse(next.date).compareTo(DateTime.tryParse(prev.date)) : DateTime.tryParse(prev.date).compareTo(DateTime.tryParse(next.date)), + ); + } + Future getSingleServiceRequest({ @required String requestId, @required String host, diff --git a/lib/models/device/device.dart b/lib/models/device/device.dart index 6c1f5cfe..f877f778 100644 --- a/lib/models/device/device.dart +++ b/lib/models/device/device.dart @@ -34,7 +34,7 @@ class Device { this.modelDefinition, }); - factory Device.fromJson(Map parsedJson) { + factory Device.fromJson(Map parsedJson, {bool startKeyWithDest = true}) { print("parsedJson:$parsedJson"); return Device( id: parsedJson["id"], @@ -43,10 +43,10 @@ class Device { assetName: parsedJson["assetName"], modelDefinition: ModelDefinition.fromJson(parsedJson["modelDefinition"]), hospital: Hospital.fromJson(parsedJson["site"]), - destBuildingName: parsedJson["destBuildingName"] ?? parsedJson['building']['name'], - destDepartmentName: parsedJson["destDepartmentName"] ?? parsedJson['department']['departmentName'], - destRoom: parsedJson["destRoom"] ?? parsedJson['room'], - destFloor: parsedJson["destFloor"] ?? parsedJson['floor']['name'], + destBuildingName: startKeyWithDest ? parsedJson["destBuildingName"] : parsedJson['building']['name'], + destDepartmentName: startKeyWithDest ? parsedJson["destDepartmentName"] : parsedJson['department']['departmentName'], + destRoom: startKeyWithDest ? parsedJson["destRoom"] : parsedJson['room'], + destFloor: startKeyWithDest ? parsedJson["destFloor"] : parsedJson['floor']['name'], destSiteName: parsedJson['destSiteName'] // parsedJson["modelDefinition"] == null ? "" : // parsedJson["modelDefinition"]["manufacturerName"], diff --git a/lib/models/device/device_transfer.dart b/lib/models/device/device_transfer.dart index 84ab75c2..50b3c593 100644 --- a/lib/models/device/device_transfer.dart +++ b/lib/models/device/device_transfer.dart @@ -14,6 +14,7 @@ class DeviceTransfer { Device device; DeviceTransferInfo sender; DeviceTransferInfo receiver; + String createdOn; DeviceTransfer({ this.id, @@ -22,6 +23,7 @@ class DeviceTransfer { this.userId, this.sender, this.receiver, + this.createdOn, }); bool validate() { @@ -40,6 +42,7 @@ class DeviceTransfer { final receiver = DeviceTransferInfo(); receiver.fromDetails(old.receiver); this.receiver = receiver; + createdOn = old.createdOn; } factory DeviceTransfer.fromJson(Map parsedJson) { @@ -47,6 +50,7 @@ class DeviceTransfer { id: parsedJson["id"], title: parsedJson["transferCode"], userId: parsedJson["uid"], + createdOn: parsedJson['createdOn'], device: Device( id: parsedJson["assetId"], number: parsedJson["assetNumber"], diff --git a/lib/models/service_request/service_request_search.dart b/lib/models/service_request/service_request_search.dart index 53fca4ab..3366f043 100644 --- a/lib/models/service_request/service_request_search.dart +++ b/lib/models/service_request/service_request_search.dart @@ -8,6 +8,7 @@ class ServiceRequestSearch { Hospital hospital; String model; Lookup statusValue; + bool mostRecent; ServiceRequestSearch({ this.deviceSerialNumber, @@ -16,6 +17,7 @@ class ServiceRequestSearch { this.deviceName, this.model, this.hospital, + this.mostRecent, }); fromSearch(ServiceRequestSearch newSearch) { @@ -24,6 +26,7 @@ class ServiceRequestSearch { statusValue = newSearch.statusValue; hospital = newSearch.hospital; model = newSearch.model; + mostRecent = newSearch.mostRecent; } Map toMap() { diff --git a/lib/models/visits/visit.dart b/lib/models/visits/visit.dart index 2ad5a3d6..9d8ad663 100644 --- a/lib/models/visits/visit.dart +++ b/lib/models/visits/visit.dart @@ -6,6 +6,7 @@ class Visit { String serialNumber; String expectDate; String actualDate; + String createdOn; int hospitalId; String hospitalName; int deviceId; @@ -42,6 +43,7 @@ class Visit { this.images, this.assignTo, this.deviceNumber, + this.createdOn, }); factory Visit.fromJson(Map parsedJson) { @@ -51,28 +53,30 @@ class Visit { images = list.map((e) => e["attachmentURL"].toString()).toList(); } return Visit( - id: parsedJson["id"], - serialNumber: parsedJson["visitCode"], - ppmScheduleId: parsedJson["ppmScheduleId"], - hospitalId: parsedJson["siteId"], - deviceNumber: parsedJson["assetNumber"], - hospitalName: parsedJson["siteName"], - deviceId: parsedJson["assetId"], - deviceSerialNumber: parsedJson["assetSerialNo"], - deviceEnglishName: parsedJson["assetName"], - deviceArabicName: parsedJson["assetName"], - employId: parsedJson["assignedEmployeeId"].toString(), - employName: parsedJson["assignedEmployeeName"], - expectDate: parsedJson["expectedDate"].toString().split("T").first, - actualDate: parsedJson["actualDate"].toString().split("T").first, - modelAndBrand: "${parsedJson["modelName"]} / ${parsedJson["manufacturerName"]}", - // contactStatus: parsedJson["contactStatus"], - images: images, - status: Lookup( - id: parsedJson["visitStatusId"], // actual value (0,1,2) - name: parsedJson["visitStatusName"] // text value - ), - assignTo: parsedJson["assignedToName"], - pentry: Pentry.fromMap(parsedJson)); + id: parsedJson["id"], + serialNumber: parsedJson["visitCode"], + ppmScheduleId: parsedJson["ppmScheduleId"], + hospitalId: parsedJson["siteId"], + deviceNumber: parsedJson["assetNumber"], + hospitalName: parsedJson["siteName"], + deviceId: parsedJson["assetId"], + deviceSerialNumber: parsedJson["assetSerialNo"], + deviceEnglishName: parsedJson["assetName"], + deviceArabicName: parsedJson["assetName"], + employId: parsedJson["assignedEmployeeId"].toString(), + employName: parsedJson["assignedEmployeeName"], + expectDate: parsedJson["expectedDate"].toString().split("T").first, + actualDate: parsedJson["actualDate"].toString().split("T").first, + modelAndBrand: "${parsedJson["modelName"]} / ${parsedJson["manufacturerName"]}", + // contactStatus: parsedJson["contactStatus"], + images: images, + status: Lookup( + id: parsedJson["visitStatusId"], // actual value (0,1,2) + name: parsedJson["visitStatusName"] // text value + ), + assignTo: parsedJson["assignedToName"], + pentry: Pentry.fromMap(parsedJson), + createdOn: parsedJson['createdOn'], + ); } } diff --git a/lib/models/visits/visits_search.dart b/lib/models/visits/visits_search.dart index 5c3692bd..ee5045b0 100644 --- a/lib/models/visits/visits_search.dart +++ b/lib/models/visits/visits_search.dart @@ -12,6 +12,7 @@ class VisitsSearch { DateTime actualDateFrom; DateTime actualDateTo; Lookup statusValue; + bool mostRecent; VisitsSearch({ this.deviceSerialNumber, @@ -24,6 +25,7 @@ class VisitsSearch { this.contactStatus, this.expectedDateFrom, this.expectedDateTo, + this.mostRecent, }); fromSearch(VisitsSearch newSearch) { @@ -37,6 +39,7 @@ class VisitsSearch { expectedDateFrom = newSearch.expectedDateFrom; expectedDateTo = newSearch.expectedDateTo; statusValue = newSearch.statusValue; + mostRecent = newSearch.mostRecent; } Map toMap() { diff --git a/lib/views/pages/device_transfer/track_device_transfer.dart b/lib/views/pages/device_transfer/track_device_transfer.dart index d62943ef..87e4aaa7 100644 --- a/lib/views/pages/device_transfer/track_device_transfer.dart +++ b/lib/views/pages/device_transfer/track_device_transfer.dart @@ -9,6 +9,7 @@ import 'package:test_sa/views/app_style/colors.dart'; import 'package:test_sa/views/widgets/buttons/app_back_button.dart'; import 'package:test_sa/views/widgets/device_trancfer/device_transfer_list.dart'; import 'package:test_sa/views/widgets/loaders/loading_manager.dart'; +import 'package:test_sa/views/widgets/switch_button.dart'; class TrackDeviceTransferPage extends StatefulWidget { static const String id = "/track-device-transfer"; @@ -23,6 +24,7 @@ class _TrackDeviceTransferPageState extends State with DeviceTransferProvider _deviceTransferProvider; UserProvider _userProvider; SettingProvider _settingProvider; + bool mostRecent = false; @override Widget build(BuildContext context) { _deviceTransferProvider = Provider.of(context); @@ -71,6 +73,21 @@ class _TrackDeviceTransferPageState extends State with ], ), ), + Padding( + padding: const EdgeInsets.symmetric(horizontal: 16.0), + child: ASwitchButton( + title: "Most Recent", + value: mostRecent, + onChange: (value) async { + mostRecent = value; + await _deviceTransferProvider.getRequests( + user: _userProvider.user, + host: _settingProvider.host, + mostRecent: mostRecent, + ); + }, + ), + ), Expanded( child: DeviceTransferList( nextPage: _deviceTransferProvider.nextPage, diff --git a/lib/views/pages/user/gas_refill/request_gas_refill.dart b/lib/views/pages/user/gas_refill/request_gas_refill.dart index 38f97f40..331618d4 100644 --- a/lib/views/pages/user/gas_refill/request_gas_refill.dart +++ b/lib/views/pages/user/gas_refill/request_gas_refill.dart @@ -368,7 +368,7 @@ class _RequestGasRefillState extends State { const SizedBox(height: 8), Divider(color: Theme.of(context).colorScheme.primary), const SizedBox(height: 4), - const ASubTitle("Type"), + const ASubTitle("Gas Type"), if (_validate && _currentDetails.type == null) ASubTitle(_subtitle.requiredWord, color: Colors.red), const SizedBox(height: 4), GasTypeMenu( @@ -396,9 +396,6 @@ class _RequestGasRefillState extends State { const SizedBox( height: 8, ), - const SizedBox( - height: 8, - ), const ASubTitle("Cylinder Type"), if (_validate && _currentDetails.cylinderSize == null) ASubTitle( diff --git a/lib/views/pages/user/gas_refill/track_gas_refill.dart b/lib/views/pages/user/gas_refill/track_gas_refill.dart index 6dd1ca6d..c909d16b 100644 --- a/lib/views/pages/user/gas_refill/track_gas_refill.dart +++ b/lib/views/pages/user/gas_refill/track_gas_refill.dart @@ -10,6 +10,8 @@ import 'package:test_sa/views/widgets/buttons/app_back_button.dart'; import 'package:test_sa/views/widgets/gas_refill/gas_refill_list.dart'; import 'package:test_sa/views/widgets/loaders/loading_manager.dart'; +import '../../../widgets/switch_button.dart'; + class TrackGasRefillPage extends StatefulWidget { static const String id = "/track-gas-refill"; @@ -23,6 +25,7 @@ class _TrackGasRefillPageState extends State with TickerProv GasRefillProvider _gasRefillProvider; UserProvider _userProvider; SettingProvider _settingProvider; + bool mostRecent = false; @override Widget build(BuildContext context) { @@ -76,6 +79,21 @@ class _TrackGasRefillPageState extends State with TickerProv ], ), ), + Padding( + padding: const EdgeInsets.symmetric(horizontal: 16.0), + child: ASwitchButton( + title: "Most Recent", + value: mostRecent, + onChange: (value) async { + mostRecent = value; + await _gasRefillProvider.getRequests( + user: _userProvider.user, + host: _settingProvider.host, + mostRecent: mostRecent, + ); + }, + ), + ), Expanded( child: GasRefillList( nextPage: _gasRefillProvider.nextPage, diff --git a/lib/views/widgets/search/service_request_search_bar.dart b/lib/views/widgets/search/service_request_search_bar.dart index c5b31e29..9502d645 100644 --- a/lib/views/widgets/search/service_request_search_bar.dart +++ b/lib/views/widgets/search/service_request_search_bar.dart @@ -1,4 +1,3 @@ -import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; import 'package:test_sa/controllers/localization/localization.dart'; import 'package:test_sa/models/lookup.dart'; @@ -9,6 +8,7 @@ import 'package:test_sa/views/widgets/buttons/app_button.dart'; import 'package:test_sa/views/widgets/buttons/app_small_button.dart'; import 'package:test_sa/views/widgets/hospitals/hospital_auto_complete_field.dart'; import 'package:test_sa/views/widgets/status/service_request/service_request_status_mune.dart'; +import 'package:test_sa/views/widgets/switch_button.dart'; import 'package:test_sa/views/widgets/titles/app_sub_title.dart'; import '../app_text_form_field.dart'; @@ -90,6 +90,17 @@ class _ServiceRequestsSearchDialogState extends State with TickerProv ) ], ), + ASwitchButton( + title: "Most Recent", + value: _search.mostRecent ?? false, + onChange: (value) { + _search.mostRecent = value; + setState(() {}); + }, + ), ATextFormField( initialValue: _search.deviceSerialNumber, hintText: _subtitle.serialNumber, diff --git a/lib/views/widgets/switch_button.dart b/lib/views/widgets/switch_button.dart new file mode 100644 index 00000000..ccab66a4 --- /dev/null +++ b/lib/views/widgets/switch_button.dart @@ -0,0 +1,44 @@ +import 'package:flutter/material.dart'; +import 'package:test_sa/views/widgets/titles/app_sub_title.dart'; + +import '../app_style/colors.dart'; +import '../app_style/sizing.dart'; + +class ASwitchButton extends StatelessWidget { + final String title; + final bool value; + final void Function(bool) onChange; + + const ASwitchButton({ + @required this.title, + @required this.value, + @required this.onChange, + Key key, + }) : super(key: key); + + @override + Widget build(BuildContext context) { + return Container( + padding: const EdgeInsets.symmetric(horizontal: 16), + margin: const EdgeInsets.symmetric(vertical: 8), + decoration: BoxDecoration( + color: AColors.inputFieldBackgroundColor, + border: Border.all( + color: const Color(0xffefefef), + ), + borderRadius: BorderRadius.circular(AppStyle.borderRadius * AppStyle.getScaleFactor(context)), + ), + child: Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + ASubTitle(title), + Switch.adaptive( + value: value, + activeColor: AColors.primaryColor, + onChanged: onChange, + ), + ], + ), + ); + } +} From 96c9515e8747a855978cabf05f7f7524b4f4eacc Mon Sep 17 00:00:00 2001 From: zaid_daoud Date: Thu, 3 Aug 2023 10:24:45 +0300 Subject: [PATCH 149/181] Status for both sender and receiver is synchronized. --- lib/controllers/api_routes/api_manager.dart | 5 +- lib/controllers/api_routes/urls.dart | 1 + .../api/device_transfer_provider.dart | 17 ++ .../device_transfer_details.dart | 276 +++++++++--------- .../update_device_transfer.dart | 1 - .../device_trancfer/device_transfer_list.dart | 9 +- 6 files changed, 169 insertions(+), 140 deletions(-) diff --git a/lib/controllers/api_routes/api_manager.dart b/lib/controllers/api_routes/api_manager.dart index 3bbfed51..77adc8b5 100644 --- a/lib/controllers/api_routes/api_manager.dart +++ b/lib/controllers/api_routes/api_manager.dart @@ -1,7 +1,5 @@ import 'dart:convert'; -import 'dart:developer'; -import 'package:flutter/cupertino.dart'; import 'package:flutter/foundation.dart'; import 'package:fluttertoast/fluttertoast.dart'; import 'package:http/http.dart' as http; @@ -23,6 +21,7 @@ class ApiManager { Future get( String url, { Map headers, + enableToastMessage = true, }) async { headers ??= {}; @@ -34,7 +33,7 @@ class ApiManager { http.Response response = await http.get(_url, headers: headers); if (jsonDecode(response.body) is Map) { final message = jsonDecode(response.body)["message"]; - if (message != null && message.toString().isNotEmpty) { + if (message != null && message.toString().isNotEmpty && enableToastMessage) { Fluttertoast.showToast(msg: message ?? "", toastLength: Toast.LENGTH_LONG); } } diff --git a/lib/controllers/api_routes/urls.dart b/lib/controllers/api_routes/urls.dart index b4cb7226..ff44c03e 100644 --- a/lib/controllers/api_routes/urls.dart +++ b/lib/controllers/api_routes/urls.dart @@ -87,6 +87,7 @@ class URLs { static get requestDeviceTransfer => "$_baseUrl/AssetTransfer/AddAssetTransfer"; // get static get updateDeviceTransfer => "$_baseUrl/AssetTransfer/UpdateAssetTransfer"; // get static get getDeviceTransfer => "$_baseUrl/AssetTransfer/GetAssetTransfers"; // get + static get getAssetTransferById => "$_baseUrl/AssetTransfer/GetAssetTransferById"; // get // employee static get getEmployees => "$_baseUrl/Lookups/GetLookup?lookupEnum=33"; // get diff --git a/lib/controllers/providers/api/device_transfer_provider.dart b/lib/controllers/providers/api/device_transfer_provider.dart index 453954be..d4f55572 100644 --- a/lib/controllers/providers/api/device_transfer_provider.dart +++ b/lib/controllers/providers/api/device_transfer_provider.dart @@ -109,6 +109,23 @@ class DeviceTransferProvider extends ChangeNotifier { } } + Future getRequestById({int assetTransferId}) async { + Response response; + try { + response = await ApiManager.instance.get( + URLs.getAssetTransferById + "?assetTransferId=$assetTransferId", + enableToastMessage: false, + ); + if (response.statusCode >= 200 && response.statusCode < 300) { + return DeviceTransfer.fromJson(json.decode(response.body)["data"]); + } + return null; + } catch (error) { + print(error); + return null; + } + } + Future createRequest({ @required String host, @required User user, diff --git a/lib/views/pages/device_transfer/device_transfer_details.dart b/lib/views/pages/device_transfer/device_transfer_details.dart index 4d6e7e24..a116f1c2 100644 --- a/lib/views/pages/device_transfer/device_transfer_details.dart +++ b/lib/views/pages/device_transfer/device_transfer_details.dart @@ -5,7 +5,6 @@ import 'package:test_sa/controllers/providers/api/device_transfer_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/models/device/device_transfer.dart'; -import 'package:test_sa/models/device/device_transfer_info.dart'; import 'package:test_sa/models/subtitle.dart'; import 'package:test_sa/views/app_style/colors.dart'; import 'package:test_sa/views/app_style/sizing.dart'; @@ -13,6 +12,7 @@ import 'package:test_sa/views/pages/device_transfer/update_device_transfer.dart' import 'package:test_sa/views/widgets/buttons/app_back_button.dart'; import 'package:test_sa/views/widgets/buttons/app_small_button.dart'; import 'package:test_sa/views/widgets/device_trancfer/device_transfer_info_section.dart'; +import 'package:test_sa/views/widgets/loaders/app_loading.dart'; import 'package:test_sa/views/widgets/loaders/loading_manager.dart'; import 'package:test_sa/views/widgets/requests/info_row.dart'; @@ -28,7 +28,7 @@ class DeviceTransferDetails extends StatefulWidget { } class _DeviceTransferDetailsState extends State { - final DeviceTransferInfo _model = DeviceTransferInfo(); + DeviceTransfer _model; bool _isSender = false; bool _isReceiver = false; UserProvider _userProvider; @@ -41,151 +41,167 @@ class _DeviceTransferDetailsState extends State { @override void initState() { + _model = widget.model; super.initState(); } + Future _getDeviceTransfer() async { + print("====== object"); + _model = await Provider.of(context).getRequestById(assetTransferId: widget.model.id); + print("====== object2"); + } + @override Widget build(BuildContext context) { - _subtitle = AppLocalization.of(context).subtitle; - _userProvider = Provider.of(context); - _settingProvider = Provider.of(context); - _deviceTransferProvider = Provider.of(context); - _isSender = _userProvider.user.userID == widget.model.sender?.userId; - _isReceiver = _userProvider.user.userID == widget.model.receiver?.userId; return Scaffold( key: _scaffoldKey, body: SafeArea( - child: Form( - key: _formKey, - child: LoadingManager( - isLoading: _isLoading, - isFailedLoading: false, - stateCode: 200, - onRefresh: () async {}, - child: Column( - children: [ - Container( - color: Theme.of(context).colorScheme.primary, - padding: const EdgeInsets.symmetric(horizontal: 0, vertical: 4), - child: Row( - children: [ - const ABackButton(), - Expanded( - child: Center( - child: Text( - _subtitle.details, - style: Theme.of(context).textTheme.headline6.copyWith(color: AColors.white, fontStyle: FontStyle.italic), - ), - ), - ), - const SizedBox(width: 58), - ], - ), - ), - Expanded( - child: SingleChildScrollView( - padding: EdgeInsets.all(16 * AppStyle.getScaleFactor(context)), + child: FutureBuilder( + future: _getDeviceTransfer(), + builder: (context, snapshot) { + if (snapshot.connectionState == ConnectionState.waiting) { + return const ALoading(); + } else { + _subtitle = AppLocalization.of(context).subtitle; + _userProvider = Provider.of(context); + _settingProvider = Provider.of(context); + _deviceTransferProvider = Provider.of(context); + _isSender = _userProvider.user.userID == _model.sender?.userId; + _isReceiver = _userProvider.user.userID == _model.receiver?.userId; + return Form( + key: _formKey, + child: LoadingManager( + isLoading: _isLoading, + isFailedLoading: false, + stateCode: 200, + onRefresh: () async {}, child: Column( - crossAxisAlignment: CrossAxisAlignment.start, children: [ - RequestInfoRow( - title: "Transfer Id", - info: widget.model.title?.toString(), - ), - RequestInfoRow( - title: _subtitle.assetName, - info: widget.model.device.assetName, - ), - RequestInfoRow( - title: _subtitle.assetSN, - info: widget.model.device.serialNumber, - ), - RequestInfoRow( - title: _subtitle.assetNumber, - info: widget.model.device.number, - ), - RequestInfoRow( - title: _subtitle.destinationSite, - info: widget.model.device.destSiteName, - ), - RequestInfoRow( - title: _subtitle.building, - info: widget.model.device.destBuildingName, - ), - RequestInfoRow( - title: _subtitle.floor, - info: widget.model.device.destFloor, - ), - RequestInfoRow( - title: _subtitle.department, - info: widget.model.device.destDepartmentName, - ), - RequestInfoRow( - title: _subtitle.room, - info: widget.model.device.destRoom, - ), - RequestInfoRow( - title: _subtitle.actions, - info: "", - ), - const SizedBox(height: 8), - Row( - children: [ - Expanded( - child: Text("Sender", style: Theme.of(context).textTheme.headline6), - ), - if (_userProvider.user?.type == UsersTypes.engineer) - ASmallButton( - text: _subtitle.edit, - onPressed: (_isSender || false) - ? () { - Navigator.of(context).push(MaterialPageRoute( - builder: (_) => UpdateDeviceTransfer( - model: widget.model, - isSender: true, - ))); - } - : null, + Container( + color: Theme.of(context).colorScheme.primary, + padding: const EdgeInsets.symmetric(horizontal: 0, vertical: 4), + child: Row( + children: [ + const ABackButton(), + Expanded( + child: Center( + child: Text( + _subtitle.details, + style: Theme.of(context).textTheme.headline6.copyWith(color: AColors.white, fontStyle: FontStyle.italic), + ), + ), ), - ], - ), - const SizedBox(height: 12), - DeviceTransferInfoSection( - info: widget.model.sender, + const SizedBox(width: 58), + ], + ), ), - const SizedBox(height: 8), - Row( - children: [ - Expanded( - child: Text("Receiver", style: Theme.of(context).textTheme.headline6), + Expanded( + child: SingleChildScrollView( + padding: EdgeInsets.all(16 * AppStyle.getScaleFactor(context)), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + RequestInfoRow( + title: "Transfer Id", + info: _model.title?.toString(), + ), + RequestInfoRow( + title: _subtitle.assetName, + info: _model.device.assetName, + ), + RequestInfoRow( + title: _subtitle.assetSN, + info: _model.device.serialNumber, + ), + RequestInfoRow( + title: _subtitle.assetNumber, + info: _model.device.number, + ), + RequestInfoRow( + title: _subtitle.destinationSite, + info: _model.device.destSiteName, + ), + RequestInfoRow( + title: _subtitle.building, + info: _model.device.destBuildingName, + ), + RequestInfoRow( + title: _subtitle.floor, + info: _model.device.destFloor, + ), + RequestInfoRow( + title: _subtitle.department, + info: _model.device.destDepartmentName, + ), + RequestInfoRow( + title: _subtitle.room, + info: _model.device.destRoom, + ), + RequestInfoRow( + title: _subtitle.actions, + info: "", + ), + const SizedBox(height: 8), + Row( + children: [ + Expanded( + child: Text("Sender", style: Theme.of(context).textTheme.headline6), + ), + if (_userProvider.user?.type == UsersTypes.engineer) + ASmallButton( + text: _subtitle.edit, + onPressed: (_isSender || false) + ? () { + Navigator.of(context).push(MaterialPageRoute( + builder: (_) => UpdateDeviceTransfer( + model: _model, + isSender: true, + ))); + } + : null, + ), + ], + ), + const SizedBox(height: 12), + DeviceTransferInfoSection( + info: _model.sender, + ), + const SizedBox(height: 8), + Row( + children: [ + Expanded( + child: Text("Receiver", style: Theme.of(context).textTheme.headline6), + ), + if (_userProvider.user?.type == UsersTypes.engineer) + ASmallButton( + text: _subtitle.edit, + onPressed: (_isReceiver || false) + ? () async { + Navigator.of(context).push( + MaterialPageRoute( + builder: (_) => UpdateDeviceTransfer( + model: _model, + isSender: false, + ), + ), + ); + } + : null, + ), + ], + ), + const SizedBox(height: 12), + DeviceTransferInfoSection(info: _model.receiver), + ], ), - if (_userProvider.user?.type == UsersTypes.engineer) - ASmallButton( - text: _subtitle.edit, - onPressed: (_isReceiver || false) - ? () { - Navigator.of(context).push(MaterialPageRoute( - builder: (_) => UpdateDeviceTransfer( - model: widget.model, - isSender: false, - ))); - } - : null, - ), - ], - ), - const SizedBox(height: 12), - DeviceTransferInfoSection( - info: widget.model.receiver, + ), ), ], ), ), - ), - ], - ), - ), - ), + ); + } + }), ), ); } diff --git a/lib/views/pages/device_transfer/update_device_transfer.dart b/lib/views/pages/device_transfer/update_device_transfer.dart index 9a870ad9..1de29ad0 100644 --- a/lib/views/pages/device_transfer/update_device_transfer.dart +++ b/lib/views/pages/device_transfer/update_device_transfer.dart @@ -72,7 +72,6 @@ class _UpdateDeviceTransferState extends State { ); _validate = false; Navigator.of(context).pop(); - Navigator.of(context).pop(); } } diff --git a/lib/views/widgets/device_trancfer/device_transfer_list.dart b/lib/views/widgets/device_trancfer/device_transfer_list.dart index dd6f0212..a90c74aa 100644 --- a/lib/views/widgets/device_trancfer/device_transfer_list.dart +++ b/lib/views/widgets/device_trancfer/device_transfer_list.dart @@ -16,7 +16,7 @@ class DeviceTransferList extends StatelessWidget { @override Widget build(BuildContext context) { - if (items.length == 0) { + if (items.isEmpty) { Subtitle subtitle = AppLocalization.of(context).subtitle; return NoItemFound( message: subtitle.noServiceRequestFound, @@ -33,11 +33,8 @@ class DeviceTransferList extends StatelessWidget { return DeviceTransferItem( index: itemIndex, item: items[itemIndex], - onPressed: (model) { - Navigator.of(context).push(MaterialPageRoute( - builder: (_) => DeviceTransferDetails( - model: model, - ))); + onPressed: (model) async { + Navigator.of(context).push(MaterialPageRoute(builder: (_) => DeviceTransferDetails(model: model))); }, ); }), From ca114f5cf848b773c83fb897bd1bb22f444a95cb Mon Sep 17 00:00:00 2001 From: zaid_daoud Date: Thu, 3 Aug 2023 10:29:10 +0300 Subject: [PATCH 150/181] the receiver engineer can edit information for both sender and receiver --- lib/views/pages/device_transfer/device_transfer_details.dart | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/views/pages/device_transfer/device_transfer_details.dart b/lib/views/pages/device_transfer/device_transfer_details.dart index a116f1c2..802b1e0c 100644 --- a/lib/views/pages/device_transfer/device_transfer_details.dart +++ b/lib/views/pages/device_transfer/device_transfer_details.dart @@ -150,7 +150,7 @@ class _DeviceTransferDetailsState extends State { if (_userProvider.user?.type == UsersTypes.engineer) ASmallButton( text: _subtitle.edit, - onPressed: (_isSender || false) + onPressed: (_isSender || _isReceiver || false) ? () { Navigator.of(context).push(MaterialPageRoute( builder: (_) => UpdateDeviceTransfer( From 4d3c1281919f58f93f9337a1a135c8a560700e42 Mon Sep 17 00:00:00 2001 From: zaid_daoud Date: Thu, 3 Aug 2023 11:23:51 +0300 Subject: [PATCH 151/181] Remove Search Work Order Module and add the following filters in search service request: MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ○ Assigned Employee ○ Call ID ○ Call Date (Service Request Date) --- .../service_request_search.dart | 33 +- lib/views/pages/user/land_page.dart | 17 +- .../search/service_request_search_bar.dart | 394 +++++++++++------- 3 files changed, 275 insertions(+), 169 deletions(-) diff --git a/lib/models/service_request/service_request_search.dart b/lib/models/service_request/service_request_search.dart index 3366f043..6df51b1a 100644 --- a/lib/models/service_request/service_request_search.dart +++ b/lib/models/service_request/service_request_search.dart @@ -1,7 +1,10 @@ import 'package:test_sa/models/hospital.dart'; import 'package:test_sa/models/lookup.dart'; +import '../call_request_for_work_order_model.dart'; + class ServiceRequestSearch { + String callId; String deviceSerialNumber; String deviceNumber; String deviceName; @@ -9,6 +12,9 @@ class ServiceRequestSearch { String model; Lookup statusValue; bool mostRecent; + String from, to; + Lookup dateOperator; + AssignedEmployee assignedEmployee; ServiceRequestSearch({ this.deviceSerialNumber, @@ -18,6 +24,11 @@ class ServiceRequestSearch { this.model, this.hospital, this.mostRecent, + this.callId, + this.from, + this.to, + this.assignedEmployee, + this.dateOperator, }); fromSearch(ServiceRequestSearch newSearch) { @@ -27,6 +38,11 @@ class ServiceRequestSearch { hospital = newSearch.hospital; model = newSearch.model; mostRecent = newSearch.mostRecent; + callId = newSearch.callId; + from = newSearch.from; + to = newSearch.to; + assignedEmployee = newSearch.assignedEmployee; + dateOperator = newSearch.dateOperator; } Map toMap() { @@ -51,9 +67,24 @@ class ServiceRequestSearch { search["site"] = hospital.name; } - if (model != null) { + if (model != null && model.isNotEmpty) { search["modelDefinition"] = model; } + + if (callId != null && callId.isNotEmpty) { + search["callId"] = callId; + } + + if (dateOperator != null && from != null) { + search["requestedDateSymbol"] = dateOperator.toMap(); + search["requestedDateFrom"] = from; + } + if (dateOperator != null && to != null) { + search["requestedDateTo"] = to; + } + if (assignedEmployee != null) { + search["assignedEmployee"] = assignedEmployee.toJson(); + } return search; } } diff --git a/lib/views/pages/user/land_page.dart b/lib/views/pages/user/land_page.dart index 3ab26e39..f3f666ea 100644 --- a/lib/views/pages/user/land_page.dart +++ b/lib/views/pages/user/land_page.dart @@ -23,7 +23,6 @@ import 'package:test_sa/views/app_style/colors.dart'; import 'package:test_sa/views/app_style/sizing.dart'; import 'package:test_sa/views/pages/device_transfer/request_device_transfer.dart'; import 'package:test_sa/views/pages/device_transfer/track_device_transfer.dart'; -import 'package:test_sa/views/pages/sub_workorder/search_sub_workorder_page.dart'; import 'package:test_sa/views/pages/user/gas_refill/request_gas_refill.dart'; import 'package:test_sa/views/pages/user/gas_refill/track_gas_refill.dart'; import 'package:test_sa/views/pages/user/requests/create_request.dart'; @@ -212,14 +211,14 @@ class _LandPageState extends State { Navigator.of(context).pushNamed(TrackDeviceTransferPage.id); }, ), - if (_userProvider?.user != null && _userProvider?.user?.type != UsersTypes.normal_user) - LandPageItem( - text: "Search Work Order", - svgPath: "assets/images/sub_workorder_icon.svg", - onPressed: () { - Navigator.of(context).pushNamed(SearchSubWorkOrderPage.id); - }, - ), + // if (_userProvider?.user != null && _userProvider?.user?.type != UsersTypes.normal_user) + // LandPageItem( + // text: "Search Work Order", + // svgPath: "assets/images/sub_workorder_icon.svg", + // onPressed: () { + // Navigator.of(context).pushNamed(SearchSubWorkOrderPage.id); + // }, + // ), ], ), ], diff --git a/lib/views/widgets/search/service_request_search_bar.dart b/lib/views/widgets/search/service_request_search_bar.dart index 9502d645..3ff29b7a 100644 --- a/lib/views/widgets/search/service_request_search_bar.dart +++ b/lib/views/widgets/search/service_request_search_bar.dart @@ -11,7 +11,12 @@ import 'package:test_sa/views/widgets/status/service_request/service_request_sta import 'package:test_sa/views/widgets/switch_button.dart'; import 'package:test_sa/views/widgets/titles/app_sub_title.dart'; +import '../../../models/call_request_for_work_order_model.dart'; +import '../../../models/engineer.dart'; import '../app_text_form_field.dart'; +import '../date_and_time/date_picker.dart'; +import '../status/report/service_report_all_users.dart'; +import '../status/report/service_report_visit_date_operator.dart'; class ServiceRequestsSearchDialog extends StatefulWidget { final ServiceRequestSearch initialSearchValue; @@ -63,168 +68,239 @@ class _ServiceRequestsSearchDialogState extends State Date: Thu, 3 Aug 2023 12:21:42 +0300 Subject: [PATCH 152/181] In track gas refill summery to add Gas Type and Expected Date fields. --- .../widgets/gas_refill/gas_refill_item.dart | 56 ++++++++++++------- 1 file changed, 35 insertions(+), 21 deletions(-) diff --git a/lib/views/widgets/gas_refill/gas_refill_item.dart b/lib/views/widgets/gas_refill/gas_refill_item.dart index 0ad575c1..aaf49bc2 100644 --- a/lib/views/widgets/gas_refill/gas_refill_item.dart +++ b/lib/views/widgets/gas_refill/gas_refill_item.dart @@ -1,11 +1,7 @@ -import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; -import 'package:provider/provider.dart'; import 'package:test_sa/controllers/localization/localization.dart'; -import 'package:test_sa/controllers/providers/api/user_provider.dart'; import 'package:test_sa/models/gas_refill/gas_refill_model.dart'; import 'package:test_sa/models/subtitle.dart'; -import 'package:test_sa/models/user.dart'; import 'package:test_sa/views/app_style/colors.dart'; import 'package:test_sa/views/app_style/sizing.dart'; import 'package:test_sa/views/widgets/requests/request_status.dart'; @@ -18,8 +14,7 @@ class GasRefillItem extends StatelessWidget { @override Widget build(BuildContext context) { - Subtitle _subtitle = AppLocalization.of(context).subtitle; - User _user = Provider.of(context, listen: false).user; + Subtitle subtitle = AppLocalization.of(context).subtitle; Color itemColor = index % 2 == 0 ? Theme.of(context).colorScheme.primary : Theme.of(context).colorScheme.onPrimary; Color onItemColor = index % 2 != 0 ? Theme.of(context).colorScheme.primary : Theme.of(context).colorScheme.onPrimary; @@ -27,7 +22,7 @@ class GasRefillItem extends StatelessWidget { padding: const EdgeInsets.symmetric(vertical: 4), child: ElevatedButton( style: ElevatedButton.styleFrom( - padding: EdgeInsets.symmetric(vertical: 8, horizontal: 8), + padding: const EdgeInsets.symmetric(vertical: 8, horizontal: 8), backgroundColor: itemColor, shape: RoundedRectangleBorder( borderRadius: BorderRadius.circular(AppStyle.getBorderRadius(context)), @@ -48,14 +43,14 @@ class GasRefillItem extends StatelessWidget { children: [ Text( item.title ?? "-----", - style: Theme.of(context).textTheme.headline6.copyWith(color: onItemColor, fontSize: 16, fontWeight: FontWeight.bold), + style: Theme.of(context).textTheme.titleLarge.copyWith(color: onItemColor, fontSize: 16, fontWeight: FontWeight.bold), ), Row( children: [ Expanded( child: Text( - _subtitle.hospital, - style: Theme.of(context).textTheme.subtitle2.copyWith( + subtitle.hospital, + style: Theme.of(context).textTheme.titleSmall.copyWith( color: onItemColor, ), ), @@ -63,29 +58,48 @@ class GasRefillItem extends StatelessWidget { if (item.clientName != null) Text( item.clientName, - style: Theme.of(context).textTheme.subtitle2.copyWith( + style: Theme.of(context).textTheme.titleSmall.copyWith( color: onItemColor, ), ), ], ), - Divider( - color: onItemColor, - ), + Divider(color: onItemColor), Row( children: [ Expanded( - child: Text( - _subtitle.status, - style: Theme.of(context).textTheme.subtitle2.copyWith( - color: onItemColor, - ), - ), + child: Text(subtitle.status, style: Theme.of(context).textTheme.titleSmall.copyWith(color: onItemColor)), ), if (item.status?.id != null) StatusLabel(label: item.status.name, color: AColors.getGasStatusColor(item.status.id)), ], ), - //Divider(color: onItemColor,), + if (item?.expectedDate != null) Divider(color: onItemColor), + if (item?.expectedDate != null) + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Text("Visit Date", style: Theme.of(context).textTheme.titleSmall.copyWith(color: onItemColor)), + Text(item.expectedDate.toIso8601String().split("T").first, style: Theme.of(context).textTheme.titleSmall.copyWith(color: onItemColor)), + ], + ), + if (item?.details?.isNotEmpty ?? false) Divider(color: onItemColor), + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + if (item?.details?.isNotEmpty ?? false) Text("Gas Type", style: Theme.of(context).textTheme.titleSmall.copyWith(color: onItemColor)), + Column( + crossAxisAlignment: CrossAxisAlignment.end, + children: item.details + .map( + (gas) => gas?.type?.name?.isNotEmpty ?? false + ? Text(gas?.type?.name, style: Theme.of(context).textTheme.titleSmall.copyWith(color: onItemColor)) + : const SizedBox.shrink(), + ) + .toList(), + ) + ], + ), ], ), ), From 2592478ea69eae8864dd7f59ba6508b1abf190b9 Mon Sep 17 00:00:00 2001 From: zaid_daoud Date: Thu, 3 Aug 2023 12:28:35 +0300 Subject: [PATCH 153/181] In track gas refill summery to rename the title to Gas Refill Requests. --- lib/views/pages/user/gas_refill/track_gas_refill.dart | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lib/views/pages/user/gas_refill/track_gas_refill.dart b/lib/views/pages/user/gas_refill/track_gas_refill.dart index c909d16b..7a1d728b 100644 --- a/lib/views/pages/user/gas_refill/track_gas_refill.dart +++ b/lib/views/pages/user/gas_refill/track_gas_refill.dart @@ -62,11 +62,11 @@ class _TrackGasRefillPageState extends State with TickerProv children: [ Row( children: [ - ABackButton(), + const ABackButton(), Expanded( child: Center( child: Text( - _subtitle.serviceRequests, + "Gas Refill Requests", style: Theme.of(context).textTheme.headline6.copyWith(color: AColors.grey3A, fontStyle: FontStyle.italic), ), ), From 4b23db582ad5431008d351316e3b628a62e56229 Mon Sep 17 00:00:00 2001 From: zaid_daoud Date: Thu, 3 Aug 2023 12:51:25 +0300 Subject: [PATCH 154/181] Enhancement --- lib/controllers/providers/api/gas_refill_provider.dart | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/lib/controllers/providers/api/gas_refill_provider.dart b/lib/controllers/providers/api/gas_refill_provider.dart index cadcf8eb..251ac3ce 100644 --- a/lib/controllers/providers/api/gas_refill_provider.dart +++ b/lib/controllers/providers/api/gas_refill_provider.dart @@ -68,7 +68,11 @@ class GasRefillProvider extends ChangeNotifier { // client's request was successfully received List requestsListJson = json.decode(response.body)["data"]; List itemsPage = requestsListJson.map((request) => GasRefillModel.fromJson(request)).toList(); - items ??= []; + if (mostRecent != null) { + items = []; + } else { + items ??= []; + } items.addAll(itemsPage); sortMostRecent(items, mostRecent); if (itemsPage.length == pageItemNumber) { From c393f29829068ea185f5ff7079444ca81a230511 Mon Sep 17 00:00:00 2001 From: nextwo <1234> Date: Thu, 3 Aug 2023 14:10:52 +0300 Subject: [PATCH 155/181] some changes --- assets/subtitles/en_subtitle.json | 2 +- lib/models/visits/visits_search.dart | 6 +++ .../device_transfer_details.dart | 2 + .../pages/user/requests/request_details.dart | 2 +- .../pages/user/visits/visit_details.dart | 9 ++-- .../device_transfer_info_section.dart | 7 ++-- .../requests/service_request_item.dart | 7 ++++ .../search/service_request_search_bar.dart | 19 +++++++++ .../widgets/search/visits_search_bar.dart | 41 +++++++++++++++++++ lib/views/widgets/visits/visit_item.dart | 10 +++++ 10 files changed, 96 insertions(+), 9 deletions(-) diff --git a/assets/subtitles/en_subtitle.json b/assets/subtitles/en_subtitle.json index d1412bf5..4b5352f9 100644 --- a/assets/subtitles/en_subtitle.json +++ b/assets/subtitles/en_subtitle.json @@ -73,7 +73,7 @@ "deviceImages": "Asset Images", "deviceModel": "Asset Model", "deviceRequired": "Asset Required", - "deviceSN": "Asset SN", + "deviceSN": "Asset Serial Number", "engineerName": "Engineer Name", "engineerPhone": "Engineer Phone", "facebook": "facebook", diff --git a/lib/models/visits/visits_search.dart b/lib/models/visits/visits_search.dart index 5c3692bd..981b5c42 100644 --- a/lib/models/visits/visits_search.dart +++ b/lib/models/visits/visits_search.dart @@ -3,6 +3,8 @@ import 'package:test_sa/models/lookup.dart'; class VisitsSearch { String deviceSerialNumber; + String deviceName; + String deviceNumber; Hospital hospital; String brand; Lookup model; @@ -24,6 +26,8 @@ class VisitsSearch { this.contactStatus, this.expectedDateFrom, this.expectedDateTo, + this.deviceNumber, + this.deviceName }); fromSearch(VisitsSearch newSearch) { @@ -37,6 +41,8 @@ class VisitsSearch { expectedDateFrom = newSearch.expectedDateFrom; expectedDateTo = newSearch.expectedDateTo; statusValue = newSearch.statusValue; + deviceNumber=newSearch.deviceNumber; + deviceName=newSearch.deviceName; } Map toMap() { diff --git a/lib/views/pages/device_transfer/device_transfer_details.dart b/lib/views/pages/device_transfer/device_transfer_details.dart index 75892db3..7980f79c 100644 --- a/lib/views/pages/device_transfer/device_transfer_details.dart +++ b/lib/views/pages/device_transfer/device_transfer_details.dart @@ -149,6 +149,7 @@ class _DeviceTransferDetailsState extends State { const SizedBox(height: 12), DeviceTransferInfoSection( info: widget.model.sender, + isSender: true, ), const SizedBox(height: 8), Row( @@ -173,6 +174,7 @@ class _DeviceTransferDetailsState extends State { const SizedBox(height: 12), DeviceTransferInfoSection( info: widget.model.receiver, + isSender: false, ), ], ), diff --git a/lib/views/pages/user/requests/request_details.dart b/lib/views/pages/user/requests/request_details.dart index 61e835b2..8c15faf5 100644 --- a/lib/views/pages/user/requests/request_details.dart +++ b/lib/views/pages/user/requests/request_details.dart @@ -186,7 +186,7 @@ class RequestDetailsPage extends StatelessWidget { padding: EdgeInsets.symmetric(horizontal: 16), children: [ RequestInfoRow( - title: _subtitle.code, + title: _subtitle.callId, info: serviceRequest.requestCode, ), RequestInfoRow( diff --git a/lib/views/pages/user/visits/visit_details.dart b/lib/views/pages/user/visits/visit_details.dart index 73cb60d4..e75408cd 100644 --- a/lib/views/pages/user/visits/visit_details.dart +++ b/lib/views/pages/user/visits/visit_details.dart @@ -74,6 +74,7 @@ class VisitDetailsPage extends StatelessWidget { MaterialButton( padding: EdgeInsets.zero, onPressed: () { + if(visit.images.first != null) Navigator.of(context).push(MaterialPageRoute( builder: (_) => Scaffold( body: InteractiveViewer( @@ -115,6 +116,10 @@ class VisitDetailsPage extends StatelessWidget { title: "Asset Number", info: visit.deviceNumber, ), + RequestInfoRow( + title: _subtitle.deviceName, + content: visit.deviceEnglishName, + ), RequestInfoRow( title: _subtitle.deviceSN, info: visit.deviceSerialNumber, @@ -156,10 +161,6 @@ class VisitDetailsPage extends StatelessWidget { title: _subtitle.hospital, content: visit.hospitalName, ), - RequestInfoRow( - title: _subtitle.deviceName, - content: visit.deviceEnglishName, - ), ], ), ), diff --git a/lib/views/widgets/device_trancfer/device_transfer_info_section.dart b/lib/views/widgets/device_trancfer/device_transfer_info_section.dart index 1a8da07b..468354c4 100644 --- a/lib/views/widgets/device_trancfer/device_transfer_info_section.dart +++ b/lib/views/widgets/device_trancfer/device_transfer_info_section.dart @@ -8,8 +8,9 @@ import 'package:test_sa/views/widgets/requests/request_status.dart'; class DeviceTransferInfoSection extends StatelessWidget { final DeviceTransferInfo info; + final bool isSender; final VoidCallback onEdit; - const DeviceTransferInfoSection({Key key, this.info, this.onEdit}) : super(key: key); + const DeviceTransferInfoSection({Key key, this.info, this.onEdit, this.isSender}) : super(key: key); @override Widget build(BuildContext context) { @@ -25,7 +26,7 @@ class DeviceTransferInfoSection extends StatelessWidget { info: info.department.name, ), RequestInfoRow( - title: subtitle.engineerName, + title: isSender? "Sender Name " : "Receiver Name", info: info.userName, ), RequestInfoRow( @@ -41,7 +42,7 @@ class DeviceTransferInfoSection extends StatelessWidget { info: info.comment, ), RequestInfoRow( - title: "Assigned FE", + title: "Assigned Engineer", info: info.assignedEmployeeName, ), RequestInfoRow( diff --git a/lib/views/widgets/requests/service_request_item.dart b/lib/views/widgets/requests/service_request_item.dart index 2580deef..0b650427 100644 --- a/lib/views/widgets/requests/service_request_item.dart +++ b/lib/views/widgets/requests/service_request_item.dart @@ -133,6 +133,13 @@ class ServiceRequestItem extends StatelessWidget { Divider( color: onItemColor, ), + Text( + request.deviceNumber, + style: Theme.of(context).textTheme.subtitle2.copyWith(color: onItemColor, fontSize: 12, fontWeight: FontWeight.normal), + ), + Divider( + color: onItemColor, + ), Row( children: [ Expanded( diff --git a/lib/views/widgets/search/service_request_search_bar.dart b/lib/views/widgets/search/service_request_search_bar.dart index c5b31e29..e6b54022 100644 --- a/lib/views/widgets/search/service_request_search_bar.dart +++ b/lib/views/widgets/search/service_request_search_bar.dart @@ -90,6 +90,25 @@ class _ServiceRequestsSearchDialogState extends State with TickerProv ) ], ), + SizedBox( + height: 8.0 * AppStyle.getScaleFactor(context), + ), + ATextFormField( + initialValue: _search.deviceNumber, + hintText: _subtitle.assetNumber, + style: Theme.of(context).textTheme.headline6, + textInputAction: TextInputAction.search, + onAction: () { + if (!_formKey.currentState.validate()) { + return; + } + _formKey.currentState.save(); + Navigator.of(context).pop(_search); + }, + onSaved: (value) { + _search.deviceNumber = value; + }, + ), + SizedBox( + height: 8.0 * AppStyle.getScaleFactor(context), + ), + ATextFormField( + initialValue: _search.deviceName, + hintText: _subtitle.assetName, + style: Theme.of(context).textTheme.headline6, + textInputAction: TextInputAction.search, + onAction: () { + if (!_formKey.currentState.validate()) { + return; + } + _formKey.currentState.save(); + Navigator.of(context).pop(_search); + }, + onSaved: (value) { + _search.deviceName = value; + }, + ), + SizedBox( + height: 8.0 * AppStyle.getScaleFactor(context), + ), ATextFormField( initialValue: _search.deviceSerialNumber, hintText: _subtitle.serialNumber, diff --git a/lib/views/widgets/visits/visit_item.dart b/lib/views/widgets/visits/visit_item.dart index e6ca6676..31d0e9d0 100644 --- a/lib/views/widgets/visits/visit_item.dart +++ b/lib/views/widgets/visits/visit_item.dart @@ -82,6 +82,16 @@ class VisitItem extends StatelessWidget { Divider( color: onItemColor, ), + Text( + visit.deviceNumber ?? "", + style: Theme.of(context).textTheme.subtitle1.copyWith( + color: onItemColor, + fontSize: 14, + ), + ), + Divider( + color: onItemColor, + ), Row( children: [ Expanded( From 3e79091d7e0025585aacc7002b0376519c62c38f Mon Sep 17 00:00:00 2001 From: zaid_daoud Date: Sun, 6 Aug 2023 09:19:26 +0300 Subject: [PATCH 156/181] In Update gas refill : add expected Date field and enable the engineer to updated. --- lib/controllers/providers/api/gas_refill_provider.dart | 7 ++----- lib/views/pages/user/gas_refill/request_gas_refill.dart | 5 +++-- 2 files changed, 5 insertions(+), 7 deletions(-) diff --git a/lib/controllers/providers/api/gas_refill_provider.dart b/lib/controllers/providers/api/gas_refill_provider.dart index 251ac3ce..5097f742 100644 --- a/lib/controllers/providers/api/gas_refill_provider.dart +++ b/lib/controllers/providers/api/gas_refill_provider.dart @@ -104,7 +104,6 @@ class GasRefillProvider extends ChangeNotifier { @required User user, @required GasRefillModel model, }) async { - print("ss"); Map body = { "uid": user.id.toString(), "token": user.token ?? "", @@ -121,7 +120,6 @@ class GasRefillProvider extends ChangeNotifier { "GazRefillNo": "GR-${DateTime.now().toString().split(" ").first}", "status": model.status.toMap(), }; - print("ss1"); body["gazRefillDetails"] = model.details .map((model) => { "gasType": model.type.toMap(), @@ -134,7 +132,6 @@ class GasRefillProvider extends ChangeNotifier { Response response; try { response = await ApiManager.instance.post(URLs.requestGasRefill, body: body); - print("ss2"); stateCode = response.statusCode; if (response.statusCode >= 200 && response.statusCode < 300) { if (items != null) { @@ -159,8 +156,8 @@ class GasRefillProvider extends ChangeNotifier { "id": newModel.id, "gazRefillNo": newModel.title ?? "", "status": newModel.status.toMap(), - "expectedDate": oldModel.expectedDate?.toIso8601String(), - "expectedTime": oldModel.expectedDate?.toIso8601String(), + "expectedDate": newModel.expectedDate?.toIso8601String(), + "expectedTime": newModel.expectedDate?.toIso8601String(), "startDate": startDate?.toIso8601String(), "startTime": startDate?.toIso8601String(), "endDate": endDate?.toIso8601String(), diff --git a/lib/views/pages/user/gas_refill/request_gas_refill.dart b/lib/views/pages/user/gas_refill/request_gas_refill.dart index 331618d4..ecc9bc2e 100644 --- a/lib/views/pages/user/gas_refill/request_gas_refill.dart +++ b/lib/views/pages/user/gas_refill/request_gas_refill.dart @@ -153,8 +153,8 @@ class _RequestGasRefillState extends State { } if (_firstTime) { if (widget.gasRefillModel != null) { - _formModel = widget.gasRefillModel; _formModel.status = const Lookup(value: 0); + _gasRefillProvider.expectedDateTime = _formModel.expectedDate; } HospitalsProvider().getHospitalsListByVal(searchVal: _userProvider.user?.clientName).then((value) { _gasRefillProvider.hospital = value?.firstWhere((element) => element.name == _userProvider.user?.clientName, orElse: () => null); @@ -275,7 +275,7 @@ class _RequestGasRefillState extends State { }, ), const SizedBox(height: 8), - if (_userProvider.user?.type == UsersTypes.normal_user) + if (_userProvider.user?.type == UsersTypes.normal_user || widget.gasRefillModel != null) Column( crossAxisAlignment: CrossAxisAlignment.stretch, children: [ @@ -289,6 +289,7 @@ class _RequestGasRefillState extends State { to: DateTime.now().add(const Duration(days: 365)), onDateTimePicker: (date) { _gasRefillProvider.expectedDateTime = date; + _formModel.expectedDate = _gasRefillProvider.expectedDateTime; setState(() {}); }, ), From b8f2a72cad38be76637268b1af6fde70e25411bb Mon Sep 17 00:00:00 2001 From: zaid_daoud Date: Sun, 6 Aug 2023 10:02:15 +0300 Subject: [PATCH 157/181] Update Gas Refill : enable status menu --- lib/views/pages/user/gas_refill/request_gas_refill.dart | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/views/pages/user/gas_refill/request_gas_refill.dart b/lib/views/pages/user/gas_refill/request_gas_refill.dart index ecc9bc2e..9335cd04 100644 --- a/lib/views/pages/user/gas_refill/request_gas_refill.dart +++ b/lib/views/pages/user/gas_refill/request_gas_refill.dart @@ -217,7 +217,7 @@ class _RequestGasRefillState extends State { ), GasStatusMenu( initialValue: _formModel.status ?? const Lookup(value: 0), - enabled: false, + enabled: widget.gasRefillModel != null, onSelect: (status) { _formModel.status = status; }, From bec9c38269d139eb95544a191ab889911375284a Mon Sep 17 00:00:00 2001 From: zaid_daoud Date: Sun, 6 Aug 2023 11:47:21 +0300 Subject: [PATCH 158/181] In track gas refill update: - add timer for working hours. - enable the engineer to add start and end date. --- .../providers/api/gas_refill_provider.dart | 13 +++++++---- lib/models/gas_refill/gas_refill_model.dart | 6 ++++- .../user/gas_refill/request_gas_refill.dart | 23 ++++++++++++++++++- 3 files changed, 35 insertions(+), 7 deletions(-) diff --git a/lib/controllers/providers/api/gas_refill_provider.dart b/lib/controllers/providers/api/gas_refill_provider.dart index 5097f742..9fde956b 100644 --- a/lib/controllers/providers/api/gas_refill_provider.dart +++ b/lib/controllers/providers/api/gas_refill_provider.dart @@ -6,6 +6,7 @@ import 'package:test_sa/controllers/api_routes/api_manager.dart'; import 'package:test_sa/controllers/api_routes/urls.dart'; import 'package:test_sa/models/gas_refill/gas_refill_model.dart'; import 'package:test_sa/models/hospital.dart'; +import 'package:test_sa/models/timer_model.dart'; import 'package:test_sa/models/user.dart'; class GasRefillProvider extends ChangeNotifier { @@ -158,11 +159,12 @@ class GasRefillProvider extends ChangeNotifier { "status": newModel.status.toMap(), "expectedDate": newModel.expectedDate?.toIso8601String(), "expectedTime": newModel.expectedDate?.toIso8601String(), - "startDate": startDate?.toIso8601String(), - "startTime": startDate?.toIso8601String(), - "endDate": endDate?.toIso8601String(), - "endTime": endDate?.toIso8601String(), - "workingHours": ((endDate?.difference(startDate)?.inMinutes ?? 0) / 60), + "startDate": newModel.startDate?.toIso8601String(), + "startTime": newModel.startDate?.toIso8601String(), + "endDate": newModel.endDate?.toIso8601String(), + "endTime": newModel.endDate?.toIso8601String(), + // "workingHours": ((endDate?.difference(startDate)?.inMinutes ?? 0) / 60), + 'workingHours': newModel.workingHours, "assignedEmployee": oldModel?.assignedEmployee?.id == null ? null : oldModel?.assignedEmployee?.toJson(), "site": hospital?.toMap(), "building": building?.toJson(includeFloors: false), @@ -208,4 +210,5 @@ class GasRefillProvider extends ChangeNotifier { DateTime expectedDateTime; DateTime startDate; DateTime endDate; + TimerModel timer; } diff --git a/lib/models/gas_refill/gas_refill_model.dart b/lib/models/gas_refill/gas_refill_model.dart index 291ee5ad..7dbcaaa2 100644 --- a/lib/models/gas_refill/gas_refill_model.dart +++ b/lib/models/gas_refill/gas_refill_model.dart @@ -21,8 +21,9 @@ class GasRefillModel { String signatureEngineer; Uint8List localNurseSignature; Uint8List localEngineerSignature; - + num workingHours; DateTime startDate, endDate, expectedDate; + GasRefillModel({ this.id, //this.userId, @@ -41,6 +42,7 @@ class GasRefillModel { this.signatureEngineer, this.localEngineerSignature, this.localNurseSignature, + this.workingHours, }); bool validate() { @@ -73,6 +75,7 @@ class GasRefillModel { localNurseSignature = model.localNurseSignature; signatureEngineer = model.signatureEngineer; signatureNurse = model.signatureNurse; + workingHours = model.workingHours; } factory GasRefillModel.fromJson(Map parsedJson) { @@ -97,6 +100,7 @@ class GasRefillModel { assignedEmployee: AssignedEmployee.fromJson(parsedJson['assignedEmployee'] ?? {}), signatureEngineer: URLs.getFileUrl(parsedJson["engSignature"]), signatureNurse: URLs.getFileUrl(parsedJson["nurseSignature"]), + workingHours: parsedJson["workingHours"], ); } } diff --git a/lib/views/pages/user/gas_refill/request_gas_refill.dart b/lib/views/pages/user/gas_refill/request_gas_refill.dart index 9335cd04..c8c6c8fb 100644 --- a/lib/views/pages/user/gas_refill/request_gas_refill.dart +++ b/lib/views/pages/user/gas_refill/request_gas_refill.dart @@ -32,6 +32,7 @@ import '../../../../controllers/localization/localization.dart'; import '../../../../controllers/providers/api/hospitals_provider.dart'; import '../../../../models/enums/user_types.dart'; import '../../../widgets/e_signature/e_signature.dart'; +import '../../../widgets/timer/app_timer.dart'; class RequestGasRefill extends StatefulWidget { static const String id = "/request-gas-refill"; @@ -275,11 +276,31 @@ class _RequestGasRefillState extends State { }, ), const SizedBox(height: 8), + ASubTitle(_subtitle.workingHours), + if (widget.gasRefillModel != null) const SizedBox(height: 8), + if (widget.gasRefillModel != null) + Row( + children: [ + Expanded( + child: AppTimer( + timer: _gasRefillProvider.timer, + onChange: (timer) async { + _gasRefillProvider.timer = timer; + _formModel.startDate ??= timer.startAt; + _gasRefillProvider.endDate = timer.endAt; + _formModel.workingHours = num.tryParse((((timer?.durationInSecond ?? 0) / 60) / 60)?.toStringAsFixed(2) ?? "0"); + return true; + }, + ), + ), + ], + ), + const SizedBox(height: 8), if (_userProvider.user?.type == UsersTypes.normal_user || widget.gasRefillModel != null) Column( crossAxisAlignment: CrossAxisAlignment.stretch, children: [ - const ASubTitle("Expected Date Time"), + const ASubTitle("Expected Date"), SizedBox( height: 8 * AppStyle.getScaleFactor(context), ), From 60a2e372a3039f575471fb0b2b16a8222711d6e0 Mon Sep 17 00:00:00 2001 From: zaid_daoud Date: Tue, 8 Aug 2023 10:43:29 +0300 Subject: [PATCH 159/181] Change To Powered By Cloud Solutions, and remove engineer name from the track device transfer info, in addition to merge with majd's branch --- .../employee/engineers_provider.dart | 7 +- .../gas_refill/gas_status_provider.dart | 3 - .../gas_refill/gas_types_provider.dart | 3 - ...vice_report_equipment_status_provider.dart | 5 +- .../service_report_status_provider.dart | 5 +- .../providers/settings/setting_provider.dart | 5 +- lib/extensions/int_extensions.dart | 1 - lib/extensions/widget_extensions.dart | 1 - lib/models/pantry/pentry.dart | 4 +- lib/models/visits/visits_search.dart | 6 +- .../device_transfer_details.dart | 295 ++++++++---------- .../search_sub_workorder_page.dart | 1 - .../user/gas_refill/request_gas_refill.dart | 2 +- lib/views/pages/user/land_page.dart | 2 +- .../report/create_service_report.dart | 2 +- .../visits/update_visits_group_sheet.dart | 5 - .../pages/user/visits/visit_details.dart | 7 +- .../departments/department_button.dart | 1 - .../device_transfer_info_section.dart | 8 +- .../widgets/hospitals/hospital_button.dart | 1 - .../notifications/notification_item.dart | 1 - .../parts/auto_complete_parts_field.dart | 1 - .../requests/service_request_item.dart | 1 - .../search/service_request_search_bar.dart | 3 +- .../widgets/status/multi_status_menu.dart | 1 - .../service_report_equipment_status.dart | 2 +- lib/views/widgets/visits/visit_item.dart | 7 +- 27 files changed, 165 insertions(+), 215 deletions(-) diff --git a/lib/controllers/providers/api/status_drop_down/employee/engineers_provider.dart b/lib/controllers/providers/api/status_drop_down/employee/engineers_provider.dart index d6fe0011..c075faa5 100644 --- a/lib/controllers/providers/api/status_drop_down/employee/engineers_provider.dart +++ b/lib/controllers/providers/api/status_drop_down/employee/engineers_provider.dart @@ -1,13 +1,12 @@ import 'dart:convert'; +import 'package:flutter/cupertino.dart'; +import 'package:flutter/material.dart'; +import 'package:http/http.dart'; import 'package:test_sa/controllers/api_routes/api_manager.dart'; import 'package:test_sa/controllers/api_routes/urls.dart'; import 'package:test_sa/models/engineer.dart'; -import 'package:test_sa/models/lookup.dart'; import 'package:test_sa/models/user.dart'; -import 'package:flutter/cupertino.dart'; -import 'package:flutter/material.dart'; -import 'package:http/http.dart'; class EngineersProvider extends ChangeNotifier { //reset provider data diff --git a/lib/controllers/providers/api/status_drop_down/gas_refill/gas_status_provider.dart b/lib/controllers/providers/api/status_drop_down/gas_refill/gas_status_provider.dart index ce7332a7..7dc22e8d 100644 --- a/lib/controllers/providers/api/status_drop_down/gas_refill/gas_status_provider.dart +++ b/lib/controllers/providers/api/status_drop_down/gas_refill/gas_status_provider.dart @@ -1,8 +1,5 @@ import 'dart:convert'; -import 'package:test_sa/controllers/api_routes/urls.dart'; -import 'package:test_sa/models/lookup.dart'; -import 'package:test_sa/models/user.dart'; import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; import 'package:http/http.dart'; diff --git a/lib/controllers/providers/api/status_drop_down/gas_refill/gas_types_provider.dart b/lib/controllers/providers/api/status_drop_down/gas_refill/gas_types_provider.dart index e9b3836f..0050c4f5 100644 --- a/lib/controllers/providers/api/status_drop_down/gas_refill/gas_types_provider.dart +++ b/lib/controllers/providers/api/status_drop_down/gas_refill/gas_types_provider.dart @@ -1,8 +1,5 @@ import 'dart:convert'; -import 'package:test_sa/controllers/api_routes/urls.dart'; -import 'package:test_sa/models/lookup.dart'; -import 'package:test_sa/models/user.dart'; import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; import 'package:http/http.dart'; diff --git a/lib/controllers/providers/api/status_drop_down/report/service_report_equipment_status_provider.dart b/lib/controllers/providers/api/status_drop_down/report/service_report_equipment_status_provider.dart index 82ac1f49..1931d54c 100644 --- a/lib/controllers/providers/api/status_drop_down/report/service_report_equipment_status_provider.dart +++ b/lib/controllers/providers/api/status_drop_down/report/service_report_equipment_status_provider.dart @@ -1,12 +1,9 @@ import 'dart:convert'; -import 'package:test_sa/controllers/api_routes/api_manager.dart'; -import 'package:test_sa/controllers/api_routes/urls.dart'; -import 'package:test_sa/models/lookup.dart'; -import 'package:test_sa/models/user.dart'; import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; import 'package:http/http.dart'; +import 'package:test_sa/controllers/api_routes/api_manager.dart'; import 'package:test_sa/controllers/api_routes/urls.dart'; import 'package:test_sa/models/lookup.dart'; import 'package:test_sa/models/user.dart'; diff --git a/lib/controllers/providers/api/status_drop_down/report/service_report_status_provider.dart b/lib/controllers/providers/api/status_drop_down/report/service_report_status_provider.dart index fed9a24f..af3c9f86 100644 --- a/lib/controllers/providers/api/status_drop_down/report/service_report_status_provider.dart +++ b/lib/controllers/providers/api/status_drop_down/report/service_report_status_provider.dart @@ -1,12 +1,9 @@ import 'dart:convert'; -import 'package:test_sa/controllers/api_routes/api_manager.dart'; -import 'package:test_sa/controllers/api_routes/urls.dart'; -import 'package:test_sa/models/lookup.dart'; -import 'package:test_sa/models/user.dart'; import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; import 'package:http/http.dart'; +import 'package:test_sa/controllers/api_routes/api_manager.dart'; import 'package:test_sa/controllers/api_routes/urls.dart'; import 'package:test_sa/models/lookup.dart'; import 'package:test_sa/models/user.dart'; diff --git a/lib/controllers/providers/settings/setting_provider.dart b/lib/controllers/providers/settings/setting_provider.dart index 0e8db564..a38b20c1 100644 --- a/lib/controllers/providers/settings/setting_provider.dart +++ b/lib/controllers/providers/settings/setting_provider.dart @@ -1,10 +1,11 @@ import 'dart:async'; import 'dart:convert'; -import 'package:test_sa/controllers/api_routes/urls.dart'; -import 'package:test_sa/models/user.dart'; import 'package:flutter/foundation.dart'; import 'package:shared_preferences/shared_preferences.dart'; +import 'package:test_sa/controllers/api_routes/urls.dart'; +import 'package:test_sa/models/user.dart'; + import '../settings/app_settings.dart'; class SettingProvider extends ChangeNotifier { diff --git a/lib/extensions/int_extensions.dart b/lib/extensions/int_extensions.dart index 5f1e672e..d4d867ad 100644 --- a/lib/extensions/int_extensions.dart +++ b/lib/extensions/int_extensions.dart @@ -1,4 +1,3 @@ -import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; import 'package:test_sa/views/app_style/colors.dart'; diff --git a/lib/extensions/widget_extensions.dart b/lib/extensions/widget_extensions.dart index 5a8f3ce5..f88f8c08 100644 --- a/lib/extensions/widget_extensions.dart +++ b/lib/extensions/widget_extensions.dart @@ -1,5 +1,4 @@ import 'package:flutter/material.dart'; -import 'package:flutter/widgets.dart'; extension WidgetExtensions on Widget { Widget onPress(VoidCallback onTap) => InkWell(onTap: onTap, child: this); diff --git a/lib/models/pantry/pentry.dart b/lib/models/pantry/pentry.dart index 28f1d8e6..6bc88579 100644 --- a/lib/models/pantry/pentry.dart +++ b/lib/models/pantry/pentry.dart @@ -101,8 +101,8 @@ class Pentry { map["vChecklists"] = ppmCheckLists.map((e) => e.toMap(visitId)).toList(); map["vCalibrationTools"] = calibrationTools.map((e) => e.toMap(visitId)).toList(); map["vKits"] = pmKits.map((e) => e.toMap(visitId)).toList(); - map["nurseSignature"] = signatureNurse;//"${DateTime.now().toIso8601String()}.png|$signatureNurse"; - map["engSignature"] = signatureEngineer;//"${DateTime.now().toIso8601String()}.png|$signatureEngineer"; + map["nurseSignature"] = signatureNurse; //"${DateTime.now().toIso8601String()}.png|$signatureNurse"; + map["engSignature"] = signatureEngineer; //"${DateTime.now().toIso8601String()}.png|$signatureEngineer"; return map; } diff --git a/lib/models/visits/visits_search.dart b/lib/models/visits/visits_search.dart index a18bfa11..4e6159f2 100644 --- a/lib/models/visits/visits_search.dart +++ b/lib/models/visits/visits_search.dart @@ -28,7 +28,7 @@ class VisitsSearch { this.expectedDateFrom, this.expectedDateTo, this.deviceNumber, - this.deviceName + this.deviceName, this.mostRecent, }); @@ -44,8 +44,8 @@ class VisitsSearch { expectedDateTo = newSearch.expectedDateTo; statusValue = newSearch.statusValue; mostRecent = newSearch.mostRecent; - deviceNumber=newSearch.deviceNumber; - deviceName=newSearch.deviceName; + deviceNumber = newSearch.deviceNumber; + deviceName = newSearch.deviceName; } Map toMap() { diff --git a/lib/views/pages/device_transfer/device_transfer_details.dart b/lib/views/pages/device_transfer/device_transfer_details.dart index 22c33c99..c4ebb783 100644 --- a/lib/views/pages/device_transfer/device_transfer_details.dart +++ b/lib/views/pages/device_transfer/device_transfer_details.dart @@ -3,9 +3,7 @@ import 'package:provider/provider.dart'; import 'package:test_sa/controllers/localization/localization.dart'; import 'package:test_sa/controllers/providers/api/device_transfer_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/models/device/device_transfer.dart'; -import 'package:test_sa/models/device/device_transfer_info.dart'; import 'package:test_sa/models/subtitle.dart'; import 'package:test_sa/views/app_style/colors.dart'; import 'package:test_sa/views/app_style/sizing.dart'; @@ -54,171 +52,152 @@ class _DeviceTransferDetailsState extends State { key: _scaffoldKey, body: SafeArea( child: FutureBuilder( - future: _getDeviceTransfer(), - builder: (context, snapshot) { - if (snapshot.connectionState == ConnectionState.waiting) { - return const ALoading(); - } else { - _subtitle = AppLocalization - .of(context) - .subtitle; - _userProvider = Provider.of(context); - _settingProvider = Provider.of(context); - _deviceTransferProvider = Provider.of(context); - _isSender = _userProvider.user.userID == _model.sender?.userId; - _isReceiver = _userProvider.user.userID == _model.receiver?.userId; - return Form( - key: _formKey, - child: LoadingManager( - isLoading: _isLoading, - isFailedLoading: false, - stateCode: 200, - onRefresh: () async {}, - child: Column( - children: [ - Container( - color: Theme - .of(context) - .colorScheme - .primary, - padding: const EdgeInsets.symmetric(horizontal: 0, vertical: 4), - child: Row( - children: [ - const ABackButton(), - Expanded( - child: Center( - child: Text( - _subtitle.details, - style: Theme - .of(context) - .textTheme - .headline6 - .copyWith(color: AColors.white, fontStyle: FontStyle.italic), - ), + future: _getDeviceTransfer(), + builder: (context, snapshot) { + if (snapshot.connectionState == ConnectionState.waiting) { + return const ALoading(); + } else { + _subtitle = AppLocalization.of(context).subtitle; + _userProvider = Provider.of(context); + _isSender = _userProvider.user.userID == _model.sender?.userId; + _isReceiver = _userProvider.user.userID == _model.receiver?.userId; + return Form( + key: _formKey, + child: LoadingManager( + isLoading: _isLoading, + isFailedLoading: false, + stateCode: 200, + onRefresh: () async {}, + child: Column( + children: [ + Container( + color: Theme.of(context).colorScheme.primary, + padding: const EdgeInsets.symmetric(horizontal: 0, vertical: 4), + child: Row( + children: [ + const ABackButton(), + Expanded( + child: Center( + child: Text( + _subtitle.details, + style: Theme.of(context).textTheme.headline6.copyWith(color: AColors.white, fontStyle: FontStyle.italic), ), ), - const SizedBox(width: 58), - ], - ), + ), + const SizedBox(width: 58), + ], ), - Expanded( - child: SingleChildScrollView( - padding: EdgeInsets.all(16 * AppStyle.getScaleFactor(context)), - child: Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - RequestInfoRow( - title: "Transfer Id", - info: _model.title?.toString(), - ), - RequestInfoRow( - title: _subtitle.assetName, - info: _model.device.assetName, - ), - RequestInfoRow( - title: _subtitle.assetSN, - info: _model.device.serialNumber, - ), - RequestInfoRow( - title: _subtitle.assetNumber, - info: _model.device.number, - ), - RequestInfoRow( - title: _subtitle.destinationSite, - info: _model.device.destSiteName, - ), - RequestInfoRow( - title: _subtitle.building, - info: _model.device.destBuildingName, - ), - RequestInfoRow( - title: _subtitle.floor, - info: _model.device.destFloor, - ), - RequestInfoRow( - title: _subtitle.department, - info: _model.device.destDepartmentName, - ), - RequestInfoRow( - title: _subtitle.room, - info: _model.device.destRoom, - ), - RequestInfoRow( - title: _subtitle.actions, - info: "", - ), - const SizedBox(height: 8), - Row( - children: [ - Expanded( - child: Text("Sender", style: Theme - .of(context) - .textTheme - .headline6), + ), + Expanded( + child: SingleChildScrollView( + padding: EdgeInsets.all(16 * AppStyle.getScaleFactor(context)), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + RequestInfoRow( + title: "Transfer Id", + info: _model.title?.toString(), + ), + RequestInfoRow( + title: _subtitle.assetName, + info: _model.device.assetName, + ), + RequestInfoRow( + title: _subtitle.assetSN, + info: _model.device.serialNumber, + ), + RequestInfoRow( + title: _subtitle.assetNumber, + info: _model.device.number, + ), + RequestInfoRow( + title: _subtitle.destinationSite, + info: _model.device.destSiteName, + ), + RequestInfoRow( + title: _subtitle.building, + info: _model.device.destBuildingName, + ), + RequestInfoRow( + title: _subtitle.floor, + info: _model.device.destFloor, + ), + RequestInfoRow( + title: _subtitle.department, + info: _model.device.destDepartmentName, + ), + RequestInfoRow( + title: _subtitle.room, + info: _model.device.destRoom, + ), + RequestInfoRow( + title: _subtitle.actions, + info: "", + ), + const SizedBox(height: 8), + Row( + children: [ + Expanded( + child: Text("Sender", style: Theme.of(context).textTheme.headline6), + ), + if (_userProvider.user?.type == UsersTypes.engineer) + ASmallButton( + text: _subtitle.edit, + onPressed: (_isSender || _isReceiver || false) + ? () { + Navigator.of(context).push(MaterialPageRoute( + builder: (_) => UpdateDeviceTransfer( + model: _model, + isSender: true, + ))); + } + : null, ), - if (_userProvider.user?.type == UsersTypes.engineer) - ASmallButton( - text: _subtitle.edit, - onPressed: (_isSender || _isReceiver || false) - ? () { - Navigator.of(context).push(MaterialPageRoute( - builder: (_) => - UpdateDeviceTransfer( - model: _model, - isSender: true, - ))); - } - : null, - ), - ], - ), - const SizedBox(height: 12), - DeviceTransferInfoSection( - info: _model.sender, - isSender: true, - ), - const SizedBox(height: 8), - Row( - children: [ - Expanded( - child: Text("Receiver", style: Theme - .of(context) - .textTheme - .headline6), + ], + ), + const SizedBox(height: 12), + DeviceTransferInfoSection( + info: _model.sender, + isSender: true, + ), + const SizedBox(height: 8), + Row( + children: [ + Expanded( + child: Text("Receiver", style: Theme.of(context).textTheme.headline6), + ), + if (_userProvider.user?.type == UsersTypes.engineer) + ASmallButton( + text: _subtitle.edit, + onPressed: (_isReceiver || false) + ? () { + Navigator.of(context).push(MaterialPageRoute( + builder: (_) => UpdateDeviceTransfer( + model: _model, + isSender: false, + ))); + } + : null, ), - if (_userProvider.user?.type == UsersTypes.engineer) - ASmallButton( - text: _subtitle.edit, - onPressed: (_isReceiver || false) - ? () { - Navigator.of(context).push(MaterialPageRoute( - builder: (_) => - UpdateDeviceTransfer( - model: _model, - isSender: false, - ))); - } - : null, - ), - ], - ), - const SizedBox(height: 12), - DeviceTransferInfoSection( - info: _model.receiver, - isSender: false, - ), - ], - ), + ], + ), + const SizedBox(height: 12), + DeviceTransferInfoSection( + info: _model.receiver, + isSender: false, + ), + ], ), ), - ], - ), + ), + ], ), - ); - } + ), + ); } - ) - ) + }, + ), + ), ); } } diff --git a/lib/views/pages/sub_workorder/search_sub_workorder_page.dart b/lib/views/pages/sub_workorder/search_sub_workorder_page.dart index 32fcec04..41f3dc07 100644 --- a/lib/views/pages/sub_workorder/search_sub_workorder_page.dart +++ b/lib/views/pages/sub_workorder/search_sub_workorder_page.dart @@ -1,5 +1,4 @@ import 'package:flutter/material.dart'; -import 'package:fluttertoast/fluttertoast.dart'; import 'package:provider/provider.dart'; import 'package:test_sa/controllers/providers/api/service_requests_provider.dart'; import 'package:test_sa/models/engineer.dart'; diff --git a/lib/views/pages/user/gas_refill/request_gas_refill.dart b/lib/views/pages/user/gas_refill/request_gas_refill.dart index c8c6c8fb..abcb5efe 100644 --- a/lib/views/pages/user/gas_refill/request_gas_refill.dart +++ b/lib/views/pages/user/gas_refill/request_gas_refill.dart @@ -276,7 +276,7 @@ class _RequestGasRefillState extends State { }, ), const SizedBox(height: 8), - ASubTitle(_subtitle.workingHours), + if (widget.gasRefillModel != null) ASubTitle(_subtitle.workingHours), if (widget.gasRefillModel != null) const SizedBox(height: 8), if (widget.gasRefillModel != null) Row( diff --git a/lib/views/pages/user/land_page.dart b/lib/views/pages/user/land_page.dart index f3f666ea..f5947593 100644 --- a/lib/views/pages/user/land_page.dart +++ b/lib/views/pages/user/land_page.dart @@ -391,7 +391,7 @@ class _LandPageState extends State { mainAxisAlignment: MainAxisAlignment.center, children: [ Text( - "Powered By NewTrack", + "Powered By Cloud Solutions", style: Theme.of(context).textTheme.headline6.copyWith(fontWeight: FontWeight.w500, color: AColors.grey3A, fontSize: 12), textScaleFactor: AppStyle.getScaleFactor(context), ), diff --git a/lib/views/pages/user/requests/report/create_service_report.dart b/lib/views/pages/user/requests/report/create_service_report.dart index 4eac7042..f06c1c48 100644 --- a/lib/views/pages/user/requests/report/create_service_report.dart +++ b/lib/views/pages/user/requests/report/create_service_report.dart @@ -281,7 +281,7 @@ class _CreateServiceReportState extends State with TickerPr const SizedBox( height: 8, ), - ASubTitle(_subtitle.assetType ??""), + ASubTitle(_subtitle.assetType ?? ""), _validate && _serviceReport.assetType == null ? ASubTitle( _subtitle.requiredWord, diff --git a/lib/views/pages/user/visits/update_visits_group_sheet.dart b/lib/views/pages/user/visits/update_visits_group_sheet.dart index 7068b2aa..611671f2 100644 --- a/lib/views/pages/user/visits/update_visits_group_sheet.dart +++ b/lib/views/pages/user/visits/update_visits_group_sheet.dart @@ -1,10 +1,5 @@ -import 'package:flutter/material.dart'; -import 'dart:convert'; -import 'dart:io'; - import 'package:flutter/material.dart'; import 'package:test_sa/controllers/localization/localization.dart'; -import 'package:test_sa/models/lookup.dart'; import 'package:test_sa/models/subtitle.dart'; import 'package:test_sa/models/visits/visit.dart'; import 'package:test_sa/models/visits/visits_group.dart'; diff --git a/lib/views/pages/user/visits/visit_details.dart b/lib/views/pages/user/visits/visit_details.dart index 508b7665..72143a2d 100644 --- a/lib/views/pages/user/visits/visit_details.dart +++ b/lib/views/pages/user/visits/visit_details.dart @@ -73,11 +73,10 @@ class VisitDetailsPage extends StatelessWidget { ), MaterialButton( padding: EdgeInsets.zero, - onPressed:() { - if(visit.images.isEmpty || (visit.images?.first?.isEmpty ?? false)) { + onPressed: () { + if (visit.images.isEmpty || (visit.images?.first?.isEmpty ?? false)) { Navigator.of(context).push(MaterialPageRoute( - builder: (_) => - Scaffold( + builder: (_) => Scaffold( body: InteractiveViewer( child: Center( child: ImageLoader( diff --git a/lib/views/widgets/departments/department_button.dart b/lib/views/widgets/departments/department_button.dart index 47bc81ce..5aa8b0e4 100644 --- a/lib/views/widgets/departments/department_button.dart +++ b/lib/views/widgets/departments/department_button.dart @@ -1,5 +1,4 @@ import 'package:flutter/material.dart'; -import 'package:font_awesome_flutter/font_awesome_flutter.dart'; import 'package:test_sa/controllers/localization/localization.dart'; import 'package:test_sa/models/department.dart'; import 'package:test_sa/models/subtitle.dart'; diff --git a/lib/views/widgets/device_trancfer/device_transfer_info_section.dart b/lib/views/widgets/device_trancfer/device_transfer_info_section.dart index 5420d504..6cadd895 100644 --- a/lib/views/widgets/device_trancfer/device_transfer_info_section.dart +++ b/lib/views/widgets/device_trancfer/device_transfer_info_section.dart @@ -30,10 +30,10 @@ class DeviceTransferInfoSection extends StatelessWidget { title: subtitle.department, info: info.department.name, ), - RequestInfoRow( - title: isSender? "Sender Name " : "Receiver Name", - info: info.userName, - ), + // RequestInfoRow( + // title: subtitle.engineerName, + // info: info.userName, + // ), RequestInfoRow( title: subtitle.workingHours, info: info.workingHours, diff --git a/lib/views/widgets/hospitals/hospital_button.dart b/lib/views/widgets/hospitals/hospital_button.dart index 86fb867e..33ce319c 100644 --- a/lib/views/widgets/hospitals/hospital_button.dart +++ b/lib/views/widgets/hospitals/hospital_button.dart @@ -1,5 +1,4 @@ import 'package:flutter/material.dart'; -import 'package:font_awesome_flutter/font_awesome_flutter.dart'; import 'package:test_sa/controllers/localization/localization.dart'; import 'package:test_sa/models/hospital.dart'; import 'package:test_sa/models/subtitle.dart'; diff --git a/lib/views/widgets/notifications/notification_item.dart b/lib/views/widgets/notifications/notification_item.dart index c548f628..7661e55e 100644 --- a/lib/views/widgets/notifications/notification_item.dart +++ b/lib/views/widgets/notifications/notification_item.dart @@ -1,4 +1,3 @@ -import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; import 'package:test_sa/models/app_notification.dart'; import 'package:test_sa/views/app_style/colors.dart'; diff --git a/lib/views/widgets/parts/auto_complete_parts_field.dart b/lib/views/widgets/parts/auto_complete_parts_field.dart index d499b815..4a537cc7 100644 --- a/lib/views/widgets/parts/auto_complete_parts_field.dart +++ b/lib/views/widgets/parts/auto_complete_parts_field.dart @@ -7,7 +7,6 @@ import 'package:test_sa/controllers/providers/settings/setting_provider.dart'; import 'package:test_sa/models/part.dart'; import 'package:test_sa/views/app_style/colors.dart'; import 'package:test_sa/views/app_style/sizing.dart'; -import 'package:test_sa/views/widgets/loaders/loading_manager.dart'; class AutoCompletePartsField extends StatefulWidget { final String initialValue; diff --git a/lib/views/widgets/requests/service_request_item.dart b/lib/views/widgets/requests/service_request_item.dart index 0b650427..1827801d 100644 --- a/lib/views/widgets/requests/service_request_item.dart +++ b/lib/views/widgets/requests/service_request_item.dart @@ -1,4 +1,3 @@ -import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; import 'package:intl/intl.dart'; import 'package:provider/provider.dart'; diff --git a/lib/views/widgets/search/service_request_search_bar.dart b/lib/views/widgets/search/service_request_search_bar.dart index 1a82b0a2..adabc6d8 100644 --- a/lib/views/widgets/search/service_request_search_bar.dart +++ b/lib/views/widgets/search/service_request_search_bar.dart @@ -1,4 +1,3 @@ -import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; import 'package:test_sa/controllers/localization/localization.dart'; import 'package:test_sa/models/lookup.dart'; @@ -70,7 +69,7 @@ class _ServiceRequestsSearchDialogState extends State Date: Tue, 8 Aug 2023 13:58:36 +0300 Subject: [PATCH 160/181] Cloud logo --- assets/images/cloud_logo.png | Bin 0 -> 74567 bytes lib/views/pages/user/land_page.dart | 2 +- 2 files changed, 1 insertion(+), 1 deletion(-) create mode 100644 assets/images/cloud_logo.png diff --git a/assets/images/cloud_logo.png b/assets/images/cloud_logo.png new file mode 100644 index 0000000000000000000000000000000000000000..a1f1aaedb9b83aab0310ad17ea479ccbbeea3195 GIT binary patch literal 74567 zcmeFZ_dnJB|2Y1%%E(p}5+O=5vLZw!GlinW5f#}ZBkL$aGD3Dn7pI9+c19;;v{cF_ zq9l7{r_cTI#PxcAfBOCdSGVip^qBWOAE$6b11)C8ZHyR(F>4mP$MY1cjy z)eWiFKC15!qgwm8gYCa#vHyqw((oS<{v*PwQTR_1{*#3NB;h|7iTxKRfExTqg#U=J zY7PJYCBcGcBPJ!{X!7FCSEs+f?=Nq?x^(yJC&`>b{^h@_Ifd{4cKdhtIHdem2-u4s zsm>k%@qU3FM(}V`oD!`Ua-JIe9#Yk$sbiO{7Llr7;7`e4jntEvA*Oe^0!P2*)>=G% z@LBH2Vrll$)dIWOo%89d@V!3@5x)76vtPQu-)3EyuH1FG?!i{`eP)XctAYOyeE#hY zp#{b2J;F^-x53=;xsufjCM+R;=pE^JG`2H#j!tjsL%oQSRC`pf@9JJ}E_DAEbU%CJ z{rFGA*X~y+GwS{C@+w`pJk6LzTlIUBZu1`OLAb|f^Q}rf^(N2 z=Kf+8&-to$P2GOO)8Vn)w8n>bQ`>)suQBfy#ytiXW+E#|M-IGJe>Umnb2@hwocS0a`JBIdx@@b$EO< zgZlpxY7WS+9@OzD;Lgd#nlVAd980P8ZL4`V0{NJuNuZwipXS-VJviWp@gw7r0MJc! zF{_x$hUq5M;j~j1M=)d-Kl($5rT=iRB7C9~wU@>7c0wMSN&?}|iLYu?R_V-oVG#?& zxs3~f6gMJ+-q|lD;yIQh{04bL{jq#WBauAlF5*Mrh`JTX&&t!K+{&7EBwU|LaoJ7c zKtw0yUJjhE`OXjg-;!RBPY_1XeKEK)tvC+4Tmjf?rxkJ7Z{0-X_;l)bef%f2QNE-1 zx2i-JkXKopHyXl>shApk09Qa4?2i6={( z+s}-;#-PTQMSNCK0l|}<`|C>8HB7H{OiZf1bG5K>Ulj4K&}5V~ASvS_@OqRR?I0Q< z`U|enzshP>b&yH)9NgxFpO>xyWDc=kN(HLw5bt}Z zs&&(4YyRDDz@k?yifU4rlp|b$^_E$X;(G>{NQO8v>;E?G>08cQ*qE_*o7vEuO z|MgNEyAHGo>z}LX?!GHWrB2oH$YQq12s3XV^n01jq}P&wvswz*Apo4`;fhb1s#N!<(Y^)nygXnz5XQ;OEeNNjBXjcnZPDS9++j_W4ilT>lhrP9XkF1}c49UHTujQXMc z#3#A9@+gX|!6;>qOp|>#zSw>JV08=kk=9u;{JXMdC2$+ETp+E4ZzC)g-$3tRKtJ zxrTBwLd3;leSE7OC`Q7nAG*J$Ls-(&FTGbAJMJMMdKcCq4q0_t#anREh+bbT_8D2j zr9R znM6<+;{E^`&8A}D$C}O-{JS)JEe?o8@F#9V|ABZD%ZT73XTq1DzxU?7p2j`y;?qP3`GuTBLs6dJ$xLE2uGHjV@|egO#+KE9KG@xCi4mYg~a6Q8XE(wn?E=(-4Y zEfa>ZX~YIZ4I<}R=5Mh%eTchnqt{Tu-v5*WW4EfB6qSFExCWF9Uk!3Z@t^~Uft~)m zDZSpz6nP`c{`IAV!>78xgL{0k7eyn4G>bOG1eZh3)Au7RSl9T1Z&55oRCURs#gf8M zgkFNIIB^)6Djc1|a>)IJ!yuNp&O&1HeA>PwkD$hmlZaC9wbmGe$$G3Awnnu6{=e&~ z_e0D{6IY4bdX?_zizudjtA6+7qEgO`ug*|(@uNhgM@Wi#87%OqR?78p{K>h2cLxHC z({VH4jbcjhn<9UjDx_X?^o74;NCV+lox>fP*zfO1W*x}mQ7!->01fH(??jv1 zJ7X(H;cu9EI?xw{uJ|0wv4H7dl*UjLR~Oo|-9{^JC9STA*Ni$Auz7VT6(3S8Aw?W} zo-}Z=c|@NVRuYy$24H{L@*Xw2g8f$TnP>-!0e|j)RQT`}I^zBn?fcKhp>0XKa1u-y zmh;6*=p#8N^sGXmx%}s1b5{yNU4857(42PQ$l4Rou&9sQx}_`=w=|cO%w@?jg8%+!!G9K{_+yf**Cih z+vIV)%kO#n{uf(yk~~jdURf7ifqpqn2m>UE>;MYowxp=fpbT9l zL~}n%vkk;Y-OQi8<<_GWg++!t)(y#~{oO|xZ)0i=j`T%*sW9L)!rU-}T6K4MOD;5p>IlUqmgb+4H zMr||FPr=|flgBuv8TLsRb|0ee`_@<+d;eP;rFIZS^tkOq%hZ2MrmCiYuA+Z3mi&)P z`c5ezH*O#@snJy_Nx?;1JH`})UAAkq1-{G>$LAT4F`@(7819v3;Dz%Qa|iYZlS`^I z)HaBo7MCn5)`UA^kl5hxm~h0APiS`XXWNO4TP*x_msO}dOh9Z;MiAf!@k=wDjf;9& zX6kyTv6UX-x`SpN*GE%jL;X+pUP`@D>>GD4w$)(ILP~1cPB$k<30UV43gp<0tn1}k zw(1kj^&8K=mvkVUX*7y17!sl8ge7ef|3bnR7Zb8S*CtJD%9E*e6bc@d zlMUo=6e}|eE*F0vPG;51OHu7vxCMt0zaS%rs3O+GdY;2=e_^-PO=bBjwC{!Hj*BMY zFcY-bVZJ$=HPj!nSM>B*Rq9LZIBO(OCXLhlDWZ9s1&Lr=KFwC$lzi?H1qpLH#9Ty1 zbjz`)L;YE~7j$kE^U^%{DqA%$FD&KL(3=8_2)hv7sQ@9aLFr(Z-ir!G2ogs5Sy7h- z9NR~bcds6!s3z}UQJkx1a#KfAgTA|V`!#eA@$$cjysjrjUn-7&$lEcd&nQdUa_22C zP26Ly#IOpuNesn-IAPD%lA=S4<4$Hju-PQjvt=sA=?5thM>uK!I%SV|ZxZB#>k971 zU$iZsoKKyjQ{9i_9rrIh^e^`NtCZY{f7JWHrf0B>G9aJv2E>544@HKEvPl)Gq-d?; z+n-E0?z~lb|BVAbKxtjvr0k-eXYIaoL}VIQKAR(J1f^sv{krkXnD5TpR63A9DfT-c z#blFpUWmRqpMm0ez(k6HK)FvlpZBOW)+qoL@c$#YmFpDjaAYSIs8DG}==PD*3d z7ue^(yS(>^NdIj~-vpZr_(c|n*DuP(iMwgV&bGY9Qz%m$Bp-hZz@-_c)1ryggre{- zec}aDRV_MY=3~e06@Fcml$_*43bA77wLigjU*dT@8Rhf zlM0>?uutSie8l}aF1a@28x_p0)c;cc zFKgBY&CYWnY(4EG_ZW~hEAI7;*aTuzSkgTQE4aUG9O?gX zf^*+_83u?Qr+WhS3f8Zb$0oD;G4_%r-5l zGQXGzbh=u7ag(DLpT>O2_uQ6u=H_namd?YyPu2z6X7u9Nxi4`MS_yK6-6O~DE<~q9 ze<%Zn$G*Ix{uC@;hCVs-Do)(ZYaAdxd0RJS`6a-}UQ$L$M?j80dD?n(i8VDL-P%e2 z*tb16Xu9hrTzSrC)3HyHkCi(oE3!s^(8T?tK@+z`ir%=@d?Q!W+)Ig}X>)>`{YL<5 z1x2BZ^M?*l4BiUGK0X=!wEYHG65svO0Y^dBVe97lf=ziek9vRdTKse!6FY!}$58Ij zsxu+W^}EUs3dO!VR)3oB9i6Dr!Mb~L4>uI=I_TA9;*q^&7#He)ZJ_++ijN-BH-v?P zMpIHPWCA=m%SPH}CZ(+?iLfp@33*0v_S0;{`mht(2o(p=|HVUqEh>P{|zm(uv)Pc0%D^Jjcy%>Kc5iUt!rE+3&Q2Mzgbf^rsSbbh43_ z6Ok)s?>f0+Cv8)WIJIBLTkszLG!yH{ANY|mjxguvtalOdPrVp-Cu;jQdf!gch_!!n zsw!)==PiHuwC8nJMR|XfC;pX!+-tJTCL@e2#cT>0JV9|h4 zbA5A1E05dlsvhSO#Vq<$S7f;p!_HA*#N2f&&g9Q1nC8PRC9Bza_leKt#%L#64GR!J zCc)*)XOnmk_++^?+udu{Z@LgiiY`eA%ZE5bN`J3Xz$@YF;I^D4qy|LzeXd;6Vc^__ zppr)&3FKb=`lR)Rl}h$Y?Ckbd)pl)MVd5TjZ?3myVqVa04htxe;~D@-6iR}y-(uZ^ zEZ69#=(t@nGkwKa-?uDeam|m}(W^v5Y=hB+VuUUt6lM3C-=zeWJ#Fg9Zf%v8@OjbO zwER+Er6FUj&_j zpf3o&*y7J`(#!in&Dq=uauK+uN$TGvHRz>RIcS97`h9I4Tq?m!~U0COS?u1+QedcohDn(Q=FF=yCna3SAFDD}KcB51o zA`Bv<(zhEDu&k77V{=SY{x3&v75gno<~fww83pkCX_>3mZuhj(D`6)$Y(fZZwNY-* zSvgZ3y`V-OgO$ybD71i}-jHQY(u@Z{ab%f|JIDkBnYbNgE!csx-u~WKO7Octv_~}D^W3>4Z~#S_VEJv zdTo_Sw8Sgmn7K7d3m=f#mjr{qYS4RuATc}6)ydFc>Q!(TMlpWHR-FY)nH38jkWcsu z23v-}a15#pV^T+?^+lz3^An47jdWDcnzfahnYt+#c0c{T0VA#!P9K)B$6;i;!7W>h zFRCyOeg$qNp8`M^fI}E&8y$v` z_nmCl9>9<%3KOsai5qOS!q|vjbA1F`^*{W?yF(iEB@j?|z+{^w!Ybymw5Sq9CxlR} z?WsF2rd*UEdM6B$Q9=X)N<9kp55QsNB|tj2WynDtP}Yw%yz_oSc?zU5&u-1u<)v0u zNHrGP4eGiV$5qKkFHU=Ggb_=Y&Y_+95E-X40&3%cC$tTX+RgQ6m8sR8J`FcVMg~b# z@OO+=p91nZZKQ;@)0DO8~_FdBb-*xJMU1dlBB{2 z?{J<;n#=poXa-`U;*~cJb{uSY-3j1209~KpRB9`R7_aCTrk5tgG39;{a!~@R@M9GD z$nhVlc5vqxswBlj3b_@D3Q!aenv#?;d7#D_W75T}FtF%&YgM?f3U1f5PI0 zD~tV$AI98u)oFYRbxC3?p17yZJ{;=5W3nOBkQA?;{(b}s0TnpC+p>Mt-fqma5l`_e zY>c`4Cu>ws9Cn??nVdTCfET+=;NTt@s;vT~e&JVg&vCEgb5)_RJE#(Npd<(* z>hoy*%{XI*U5<&WEGub`5vlKieK+xaqKdyZ5Id4iQu}Zy(X0duvCZxy%ma2Rvp*>4`ZqXeSCookvCk6xzSBSBuxFr4K!O;=4AW4! zqi&go2&_Miq`_MdKa6G9DRyi{NGwRDvS=Sv3}nz;ZxN(uJ!VI+`Qf(IJ@q~6>0rm7 z$-&(!Xw$^De&zzBJ@nXLf)2v~%ImOwILsFP6+`{kH`5XWON;qpP;DHmK;ikXUNJ@j zXWfwS;HfQG6-09bL%IGy&hL0+uP;C+LJ>_%F`&jQb@HPX5;jc97ItSLzM_^TMl|VC z@UI|)9hNZC*>OAyF+v0vc#||UIc%O}|Axj41-n=RUed96?ZJVWW)Ag_&ZpSj-J!g( z7){}|m({5#ByT0N{~N7F8+z^(U0dGdIM@b-CQ}p@W8MtS+8Dt{6ojd#4d`#GhftM( zXd3elB1N-;irH^yS9%7jK*sHxX~K{&HsJ=+7r-(C$V)(^2UlAiV8EXIc>Vm4ClV1d zEl&7NVC`oi2q$p~Z&i`^_vm8Ao`C)9oc#Ue zs)jtD56JT>B>CVwD2v@^P<}!}WpK<7LNtu<2ao|NwZXx??*wH9v(1>PG9twqROxPT zsKbq&&N~F0N5Rbc;U&PNxwe@Ta18HwT>BOI7hfD{=caNv+3;dE#z z`VE^2jQEJ2!{X0#%^2Ct!XBZ7Q(np%*x``mjS{JcxCM|s4eqV@8}gu73=WdiV%N;% zdmW5&3Wx;$V-}sJE_Ig{D@GZ``T*>voI;X_HQ+vhC%W9{LBM8=pqrw~_`hL%-@Y^M zu+9ya2sn-G@6`egPGTC`p6L`-PDSi?89~KSGe}o4^=`z`?$Y8h7#YCj?h1@koRZj} zI;Y-(;4$1+-;GhC_WSciS1i0>t3ECm4FB1J7Gn*KbDn_AqYIx^u@OT?<@}4BHK4-u zf_x!tQO)_jvmgw_a|>flYJUsoF~gv&(Tblm$BXm@#-A`^1CWdNb0zXc=n_W9QdPH` zf>ZNOXFxaJ7Zar-R>=9MWmw1cra`WqNDmu2}U7dZaORWUKD2IhK2a2h5qxe8Yu+(^8d-S1LI9@r5)al#ZB zOp(E7xq-s!IVq~(I8`{o(PHFHNMb*u!1>OS4qAy>&i6nqSKWkGMCuR(B?l{ik)o^8 zgHCU)iDj#X`U!V`zF_d&DKPBBEjVp*k+!N_YtZtUuPyW7fpx^$EX@z>8+NF zmg+XEkqjM{OCiR)6c}UzQ8;*BR>6v*Fymg*P(Sxe2*oGVz(hZQHY~j$a-a@^J1ijr z%oe9w+GAm(r*J+0(*PBb8zKY6gNaWT&1rFMA=0f}2m&f?i>fE;MH*2-5d>;{E3bJ= z&n?Q1foKSHyf+r=eU+kW5yDnyCnAu$9dN3|i4c9(mw5rwkNv?D8FX5m6`w8W`v%!G z)C#*z4rpv7*!9Q%18l9$_DmZfdTlo$0CzeQE=21F^MnrlaBN9Y4H#_3req4c zkI?u1Ns#=N-|qr<&F{x7cJnu0Q4JaQA!tWc0GIJnB*P(w%{(4FnbhmiO?(eQmJ|Z~%S4AMF!vBZb3n&RZ z3wcAEK(0x$>9J0cclkIo>9p{7(}TNqBB&F;YUeUJu5rl7F&!OC4=62LH~?%X{j}MV zYVPbS#58dQ*b%}O@Xo;pGMP*1zCjm&k1?b>D%=GcV~C<;WS@5nidoe={kV2pdWR32 z0w%W&)tM*8ZwV}3NHP7Uw9Qn9bem5Cz4yT_E4r~*_`N<~nYLAMPVICZ>5Cg~}AAj7YsS&U}L@0&m1(lax;`?@`q%ny1#(c0ku zL&gc}=%Lb-VXkQJ(+4Pf0KwA@C)nof&Nm*}&`ND{87xS+{)Kx6|CjO;%yaHkjaMM5 ziJ&8^0+E8*0`@s*hlo%V-th++Y3OO8UiSZ}^WJ)~uZl=ZU}8)$n3AjJ=rz;qtknMM z?s+PF6S5ivR0cNIFg#hAYIYc`PVww3tSv#~ew<$$<`7{a4bDiuPzgB21#g@-E-Jd}e)DBQbKI%-j` zZ;il|Y=48eV^ASiZPOt>Ni(kCU+UNI&l-IXYv0bBOBDt(J90o`gy|922z*mWh^nCr zN~(~x2?ihZ{msp(OZ+SIFjy}M=QH{##Vo`@v{Tv=w_M|JzR`}puW+dU%F)&h4$0a; z9IP3c!iLkE1k)mpVWN%7=`Wlrt}oYr@KmrnA5Ny-EdtpK)`0rhJNEV8#`;|`Zm^gm z%oH2`&gafo_efA3M#uOdCo|Gxec=6%YGyg&5SWV(t_r%G3F_bR`Gv(q2(#LfCy%9q zslHB%-sN&*S)0f2og=+l`ztr{nke!A-2c(yl2upe8@6i5bXn^K z(iQyu9{8WY7~O3&PtQsQe_(a=5|jvf9tI@Drcj&mYFEeb-RFTak+lI>{F~s|R^NRR zL5tZB2I6wTLp7imc7y`eP__V2OTsn=bvYKt-yOHC8b?2PUefGjxROZ?CcXKv8l2~e zoFq9Qdg$&Q$L9KeQgmwzPv-7xvA;W@va(I16j0-@3l9Ll(+OUdd=?~=_<52Q0u=`GK=wpE;}@N;Mj6>dfdI+~(r?0*ex9+6lgHew_^EjA8=D2^wzCQ@r&n_b zvT{9uurI|JxfvEDP8Lp^v=N4%XC_}SQb}nUKJ&LWodTY=R&$6QZ>}F^tKL_<1t3{M zki1D{)y~W1#VlQIPk8K&t|JnJ!ic$c>(Ho&%= z$%=vNyKpd@Be+w_EV?v(moQatPS2UA4i&6|T`Z1XXO=Y789&;v0bRgzJE)`lw{R zSGRKY%X8 z6hFSN2f^&U&Z8kyEp54S@;O_z&u9c@^y4Qa2E=zz$HU}!qD$k$!L8AH1RxNtbKV>-pg|vk=f1TwZ}Qd#SNm)DvLip$^+4!B!Y~Hec4st ziIIEH=S0gdn#8@Kp=3fSK9etUIrPRw%Mc60*D z&BYp_7#KRlcLi$`m9CzFl%N?(f`H35u#iNKTSnReP=+|lhLumXyguIJYotTyfY>|o zc9|oHwka#9t<;r*hr%VE9K>^gNo2^rI=fLOj1Hm>m5yV8a4WJDMi+K7U}cJhoUdHW zH|Uu|m(dlXK0I3|iZ9y0E~t&6Ak1Je zi$>jvW#rh2I%{V>YuXEn1<^q6#|TKJi2m}b=B+=W8sx8R#Al?FiIHG<6@-Q_7j9}h zjj~~7GL834XE(owA{=0Vl6G~ci&|Z2ir+R68N99IZVHP9Y2Z;m`2bKSCeBx@3zL$L zIw~G#eJfJ}Kk*5QB?i7t&pQ$D$!oD1-~o-7wyBHb`H1PexfW)ufdahgk)x+%Lu-N% zd*mbECE5#H|5iqllU!33#ENzSN0O`8?ZMZpK(r{9#{4kO7p;koWYnx<^Bt z)J}zo>bPK1dk4|8M*?~*Mc{Tispn?@n+m<@rUXM}hhDI&Qx*t@l4hb~xx=DjoiOXE z?Zj|jYnljAo@+Aa+D`vFy_hr9AHI1bCaNw)d%+DQ9+cRs5<`r#Mdb#YL35ZL(Sg}f z;i$8goy?)Rfdln}&n6$_4Nv|v)L(R$R;&}8>+s9TF8i9ExQ%=n74lsR@eQ4d;;y#k zVEvamT7mNfRLAlUYV6dMh}Znn%aQ1WkdeqCSTY+pEoVNVd2Ul zy(zi=7k}O9vjjTE4*W4wSK2;u!N0D-#kTx0TeX00t+1u+ioy$4M+JkIis0fhXXW0V zNRioMZ;A4sBXBT<6sApl0+?1QFMQn-4C{N;m*+lsdi6h5virsGT{fBIP!;-6??BJR z<>vtS`BhcOCUoJJLJ*8m~T;Mp+k^s5=wv5&$0_<6?v zGxSepwu9&g;~lSrJ6F!E*r%8<>b~cTD>gd48GX^37=n;~j*!mry8gGK#@>%xV}2*U z&khOk`oRwFOv1I;>YSMV^GtEt=>-`iGX`DH?4f?1c$HHNy`ZlNDEw$Sq(^PDmtV;} zy-}`8->NZpC+kg@6HC-wdWI*f3fMFfU;fjT%B1_AKd$%+{u&y!_Av`xJ!-v|3oKuQ zR??it8fcpS;k?t+9bmb1fa@nz9x}5Db|*he-aqC4&f+;~GO3Wss<8z*D*RypW}yjp z?(5#~mpFN4j7e8?{K+hx*ayc^Cc_|e(y4=km1G-bFl>zI>jqWmy9Q5m;JR1FJw6f= z$qz`;+)hWgXc?X)&+w(zoKSefmf%ot!pw?lT{(y%yK99h!r7@emN+~2S~c!(e+(w- zwfw7x8r8AyR<+|a(yByIRU?`2{~QYz!Sh_d$S3~%jBclwsN*l+%j#3HYTS@*?Yuq0 zmjH0*qiU3e27plq@dD=yJH?$6$x+R08c+P$bz-OmUmL%ken7Tat&B`SLWh|qB+(|N zd`d3}7D={WoM+QeoRyqwpusmBIe)c8juQWQqC!NX(HQF2CmOT6TdFX+ z$9+YIOs5WH-1nP=wZo`GdG*PZQzw+wb#^XOk+Ml_2BxuDTz76MxI16Aj9_@4=TD^* zA64F-|5K1j_f-Ed)R73N*!pYoQ>KmI>EBRQPkP|B*{RFV)GhwyZ)0cZDJ?3Fy^5}m z)t1i6)+;jTN(~XYG^D6l_3kOus4;iMhgKC*qwr%rIjR!Y`}XT^0ooqUNY120S~Utl zD}qUP3Q9p|Ol7u4pYJ&TWu;?cm?w!zw`%X7KZB}+_TbgpM8WV($nCN-R-&TIyOgf7Ib$9su~}MwzutPS*Z)(!UI!Sb-N7T5y`^#PQryZ=K@46d#Lr&Y`+cHk+Z?@Xqd)sw9-!Cn>)Ru$){;s zP3%|bpx4C4>E*j}15Ox*s^Ljxc8fnZHmWmpDJ~b!;Q&1YPblM)w^aNG9xGJGzL4|h zt9iD>mj}*)&}7)9~iAhGGlr78iy_-rvxS1lTC;E^MV*e z_Q`I)J*)NID!de`C=V=92}dy4XuOV2r;q>39$-#MlyXBT*=E>J%~+CC=aejy?qwCB zcPI6K9s`}iFKE6)B<~OwUuok^6I-N<<3xdHeW=mHqKK#zkOGupXEAkoFy`{5S2PFQ27$#G4S6vwm9cR2l=mTN*e*F)m zXlwNjM%{!Tb*^Q6J_YnMovxO-vq(TgY_j|3EA|A5A4}OX z;XR(;N~%RoeVpL@M|c@hr;k2i)c166`Ns$m37-~yQtPW>pL1=Iu_Pf>y(B(DSvK(` zUt8l{MOiw+nP3r1m+T{Dv?AqCq4;Aa82w%FIw&dDwiTz%O@HMwPG4)|lYRZ^ULn0VwvMd0J5vEW_Awv1LJA(p?y@&*RJl9+Mnz48;Ue${( z5R72Tc%@pW_uS8N$V{m9&b_h<&&)R0DCs^RIdE)$6FV@x2x*r(1Iy^Q_jkG6`pH-C zgor?IL_nsLMZV^QZMmF*xY9!(xDz8Gk6@TQX?kms({)y7rBVyVj zR^g2_A;8UHjqN%~7FX`B@&H-nOlonVGM)}6KWAVbkNtgkUtpTeOus_F-`-^6(9gyf z1uufobK5pC5DImxPttO!-mSmE35+FSGT%s679(0YqFWN6z2?`@d!UWD-^{V87q|NuEm6PC9&Bi@eUTp^a1gy!G+-GN%~U)9Z>-v$ z<7L>#EbtwrnW*}JH_=B;tKVnyO8$LH)4uT0omzINNc=u|AdwUuRW9E4!4pbrUPbwu z7olsxsBS5KFk?F@dMBs8#k)a}KMC|WN!`rAbHcXHOLxWUJcIH#@68S77ddsEYK2WE zI@E9fAf=kW+y2$uMutgGPX^?%1wGa*RrtC&a$A z<@-~~4E(;TnI5heb&}wQzdNz$w>-s)Wo{b!8O`UE`L;SXVkSzvP1ySN^bBd1uGgpk zT@zRoto;U?WJ#g1wVoT46JEB&@9jReOHC+a@3xvTc{r6a?r5>6jswNN%xl;%tzZ(!ZR{yNsl1uFi0 zmOE90*;HTbko3`0INUjN$vX-&t?qIkS3EIspIHD!<9fATfh!C5E2*)hQjd5&wU=7b zJ@dR@H~S>KERs58oy4Uv|E1@`;6M5HEshXUc~o>BN_l-H>E5%>nc*Tk;oui)rgRwU)=4P8pV-g}ShX+qw1A5C5$>^`cfJLcbl$*Y2h+a? z+4qi|w+DGBa5kGFd<7z^crCRa_JS8Qv&nxA}r1gQD$U~#5QsyS3yM|Mr zc@mc4-LaiT;*q?%X<*F94XA7sE0AR+2q9p71b--72V3=p(P4l$2j#}`R=+rP(ia_V zmFvHfB{KFTZ*`XcQni6Hmc4UkyW^o#e5Xy4q<=vfEVi116SD41LuAEd;=zsfEP0$# zmiSg@WubSA%FV@z`+!fa-}s|3H#wIzs*_q(odS&BP54;b)Q0kh*s=yp{my`F$ zg|zc0mbQI{ey2%uz3bI)T3=JCFv<+_N2GE6KHoN_#T!RHMQUd3@+pNtl&Auw0ryR( zxA0v*nKkoU!C>36`O+CkY2)!7`8Rf2y$ACuqfoU|K6s*0bu^7ZMBTtZPrFSipXtuF zUCpSnP~SU$fEFX7*WH+&CG(-il@FeBDh3wtrr@EM#`tIJlr1zdA)sP!T^tlVU%M*Y z(fv3cWC!Xabr2D2XwRR9)UEZ&Sz%*K)^nx ziiK5^KCuNltWzjo#U8;F{kXuS~4?y;i~F*7)qEuo_Ak9YHx z^R1i6`>h&vXhkY?P)Y=G-beyKMd--ey+rjGR&pdrylWLTq_b*_@OJF|au|5NdK7~$ zC)IoV_8L;OlOCC~IyU5TY67jXf$1~T1J7t%Cd-7;TOxjBEcL$f#CM%0M>~BhaIcQN zq||~vh$Ro0NjDFlzlWd4ix?aZkFuinv}q|kX}m!mU?Od#GT}_{dpYO$T0XRi0$74AeCdVKUX}dOlY*^=>2BLB!>>jatIc%yddowFlhq)ZH6w_x#~4 z**k-*#yqNM{Wjc53~4JrDL3ZhAc)ioTJ z8Q4B!Z_{r{8pU97y=Qt*k&5^Z1pvl2)e1%3NtyH_+qJ%%(h$Eu1l0u*lra=2Oz8XK z4#L9U$k-X%Uc(oPMg2ofu&}ZUZ{1J~B}qGa!81Nkc-sfUqW((M&1gwF^4X1VicyS2 zACX`YBz5FH^&$KMbP#@`aB9aK0Iy?M!4QgomnT$PX*1N9NuLncP%D5sKN+>0v6Vf| z2t}jF@DP#ynas!Vb~n?MbCYg`B-sc=I7EMaVO31KzT+W=FUiMD-N091##R~#GB=m= zK!3tPr zq4SvI-uTtY9y+%Hm%MtN%jdWG)p<96C=axv8ycRMqND21hjvr9!b*01nccZo@xltn zMcZrK{e#W(3+^eZvz`?~j?ZtiDkoOS*9|uQaW;RW&*%kGdkNKEyr1sv`5Xn!oKd#r z=BS$3$se;>sW-@J(DiT`Pz;s|=&m|D{j58?!6xmZhokPVJ5WRbducbiqz-Rdc{6Y^GJcH?GKxy zs$-Y9wk@XZREC5H@`@n158GY20P!lV__wsPwr@3Q+D(DMouv!9oRnzTxRGP!~| zRK!)~ndShUW#WlrQ=j|0K6AKgUnpivK+h3QEFFl0K96Mj!V;b{;*TB3p7!**=bP&_ zm1!QgtD6dm23cipB9mFKqtg)a!?bGT=o+2j~1JsH(QsIdh&%nfyH~q%T?aruS;wwKDR+z~*L;I;kPk z_}X|C*&O^)|QBOC(EGg_ymV9$sSYSE`CRyLbJ%ozdh}#XWYwTp*)KGNnrSapft!&JUz%=W9f2P?QP!AYdmv z78sB|*`Kv|ithJfTKNh3B&vcKwHmda=UdRUcP%R;_!ew}tg?N;TEr^0f!}mRIVy~& z!y_SIfbh&sp|;5r9Nv~)h%wj%k&onU=^EK{t5vOV=(25d;|G#+{RJw$SK)W5G2$x* z5MvDM(o7oIW9^k->DC$>@l;+jwV3IQ0L9wC1QLt2gIq$h^veU@1?0zHmrvA8HE_?x zZnn&Hn;iBdLu5tfSq0sB;Hl(b*`AGayu;J-LMxw(Xp_QZdBOBV`27C@b#kRwukT%tlU2pY{6V}7DBPt{(iOaKDXwgf&LF9-E+D` z>LL7b7#s4w;0WaTkJR%1Hch!3<}JW(O&;*DZ64FhV@i@ou$U5Wqxu^b7^>|#{UCMk zZ_|g8LI!m--K6oni+*?2v)o#1miTkyaGq5=8Bp(}^Ye;S+&9_|wVkv&xY zrUTx@KyOeOXN0liNEAD}Z&7QOdf=_TSkn0W%lis=_jOZ&m|FDUVhGG}+eS!NWd2x*~i< z$<*zPuOQlJvbqtz+t3je#?-AXI)0TeB(6pzu?Y3Hv4o+GU(o%#J%sgSn9j0K>K>la zOnrYtezesB#0N9o!jE4J`=4`(CFeG=yYjJL(*Jtyiv@)3n71U(@XXzssVqCcRi4YJ zbme>B&Lb(!0--aOZU7Dy0-&2?!X}Gc?7Q^8-u+?$vV@t&uVNdSrN5DVvYbD^MUiDt zSjZp}Jzn~k-XP1{*?m1LuGaOz9?H&DOm=T_yvomB+5Lleb(sI(;cZ%Xm(Q1!g}N%j za+iqJD?+mLt&b7jI8BEEWOid`&htSwhJE3{h3BHPZS$eS%TD)w?y0$v2h7nu58knQ z!s9jU0VPZS$JU<1we?y0An6sMXzV5nC@4mOrV3E=Z^0XhmjJj8U$`}Xs{4IS#6&5t zjh;y&?Ki``*gvv59^mgNd`yPnw|8)eq`as_o>X^+&AZz+m*Jqky^YH#I(4d^wWV)5 z*H!WKZUB?=d6lsRa)ovy22r^v9&6U7M`Qtb@lX6s?vP#Oi2HX#){cs7daT5h1 z@(3weXv7ShZ7mtwd=3l&L38zJv)3E%{w*r!vQ?2#<7NHEpCEfgiL6i++Pp2{ulUzJ zN3|eKN?Aj4f1#bqh@Z8Wc$YvK({(u43Yast{n<#KaP&f2c@|G72&}yju10S^eIPxZ zu8HctAoQG1LaE3q9&DP`;fk*lQ*|tAyYO>=t(_ZJFFoU#zyL;6O;O^$SV*vT)$f-- z#Xt)Aap5I+P93}PbyR}W(|?cYH*#9!?)`dhsUJ^(Iip7Q7^94Aay$?f=H;1?%u_Cv zc0l41C+Nq~+6+$dmHTk}9>QK=x{q2LQbtUy19+=gIHcnBHK>TEqmZB7h*4%Vviso; z`Ex(=cEfQ@=-&;7oEx_@mN(N@YEM434O!b?+uXBNYlc1n*1X|C&rY$o@7o#$ z1*&S&&PDehoC=HHqx??hor6b`FYr43&?-Lwi`_GVxKI=>RDAwGYGwb}M2@)zpij{L zi@@`gpGh0MAF54REtKg@nQsoBqD6e7`gg(9M%K%7;z99 zR6RDX{rf!bv*NEGs^|>kH7VrXI6zLCq%1dO=@0rCb6rt>Qi;v6Nl;;#XK<7-!;;Fd zc`?(I`CSh$=Fc8b(I7(t{A-Q$)&tBcP5R`4w?RHvqAu^Fa3Z1`GOx;m)2)i2L?2Fe zZq3x-O}|_XeW}v>9IK8;g~~I?K=!DcU*)%O{t~iO?L76KJl&Y?wB07&{r+A#+0!7z zo8p!&eEBVY9soa+2#g{seZ>7(67NoWf=``G%LNvGspGS=-;0I5ovS+S0WcHfJy!Mh zf^D3dC*|^T$4vLrj`wdqkRJ1e5q$6^Th=rRSa4@?rw|K&Y*Wn#(x0$-Q(yj5#}IPb zvd~6`Bpj@2T{q=&Wq6qT&Vv`NU(8ZJX?rJ@7LlbNT2OTo!!ByC3JzxwhiPTJrbzka zgFdRVt=7AQdRW2ABY1T1%i!M`;@F+MF(~#o2O2!N3W1VqDf4iFh_Q^%tdp$MHIaTX zK5H_#+5P^ko0>ksvI>Tx^7BMM)4fXGB zoQP?MSLHBGG3@%gV`WC+hK(K-d6gL5bB2UlRC|};+Xi*GI!`1{vbijqI0PuM(e^&9 zGi-eLNdE>!qpauX;eGI8l|rgqocbOCUK@L$r<$hN(9KtuFsD3c+i;ccK7yK8*lkrng6!?kA3 zUI8Hnt~cZtG&jcgeFaz69^uC9_}sg18XK0o;ddOVlj$ymAdwO5MMEgt+!Z08s9}{3 zf=XNIjOsnmMZ;T@%I90>G|T)f3|hRM`59*6Sr-eAx@>}0XIfrX&L08r-D7`hNw^LE zTR>%aD{rX$T<3}OWxo%t7NOxweC+i|5uSWveZ&O1bX+racIUVA%vP}tTqS?8ViAX*}cDDMH{Uf8Dfm9IVZ-cK88 zOK11{rPn){zz@8^8T|HemQ`$LPuJzfu^5_6$-2xtM>1`C>I_`rrNe=Tm0&+AZXrRV zY#K;jFjCsz_9m1sQHhr3%{@(qczb(|uSRlhk1DY{^CDhhoIj|sUNZ~-g{dRoK_WyY z1US;7chZSo-JDTxnWu$#dYbM@X!y4BuLBeg!@NK_e=n;*`CZW&OQyrWPd|zX^KXJ? zoyr~D>o9`BIuWbk`y24~YjYbtEQ7)O{hA@IWT8@*W< zhZlbh$idugCMse*7As@t-D!1x#k*-iO~*6|N1^cUdzZge%n6F~=TDs7O&90lkSeb; zpJ!ob+sv224-ehgad8UYRWT<%~J8Hs+|ih4{t(jCV=B* zr_`{~rAwcjZSkCsvY$aaFOfyW&)(TKPSO%`5!^@-&hS<2Jxb12Wzn`uiESDxI%z-V z_5_@0*AZmH2tqgHBRBqN3^*80U{GJURcV%S_l#uxuJ$)g$>9Aq}l#ty%Y|fZ~acSDR{l2xoPkKxf9%ihf&AdW+;df0$HmiW@?X~f; zFVkj?)?Hv8{Z;|qHaptr}|=MlA2%NFvn8Y%EwcV<%MCyE#mng7zVS(26Iiz~rM3<`fq=#+>#% zC$`2b@}}4;W9(Y)P{y&UHaYdXe->vj<0Mo^va>!ah_obSm{%Z#rZ`|pDI}7jd^En#T22)5dro}Q7*wwclzX{b513dtOoNNM| zZ#H)p*r|!W%nho&c&Y$32fO*x_r6yB`+YohlygB!YRva%PT#;V6`3>#2o+5-}>$OzRVk5I`V!4!krU&$j}=8moM)pP`#)b)YeaF*aWxn zqX8ZiMbB)gq9~^6JldW0N)+^Fs4i-Au&H-kBholw#XNhr<_?+kT;GYFUu>;0Fg};F z08dmHJ5ia>!W1!M65vAF$R1|QGaV=P7Sl>2yOSPFOjH`JFoEi{- zGqzyWN}^bHOZx-MmvD5pOB>J2JhX=q2E2LQHQ`%!s3s}JkqEw zu7|ITG7au&1fa)A_0^|MY2wXU7iUjcuu+z)mYup7VVg4=nT|O-_+0}`Lcd!Nzk&#K%L`K9uHZee%5Y` zP~!>+%^3>W8Iaf1=_lqLxEoA*KfC>((PGI87Vq4w27ZAbag~&^W4SQCiiCOmuiO%m z*qj&*7-$naoEneYx|1y81Np5A*33bRKb+52A^Ir}<=9Rqh2U^7pu`PWk>f1Gh&cfJ zE!ZnABJQ(K`&W|0%0)c~I1S20!TKcB`<8&&tIVIffE+>Px4Hc109fJrCetM_s1^BhYB{k$Z^pga)fFgq55qa zr~5wi?7%0kOZB?QC9X<9Pym)z)m6?y@kZy&bgj>4azEap>|m~8!#qo)-Bl0FCr{(D zgttI>P-2ISl;${*?VF%rQ!jV2+3MZ}!AX265Auum>SeWlcSf2GPX@-uN~RcK$V{;e zm0s}ObNthC@LRj#)#cr(_pB0))%)y5SJ)Ok$iRL!Xb&4Z3$>0BaLajDJ7% zyuUZ35mWV+$*0jmVR4rX_t+J*###I9-|METsBLY_)o=PgEh!<5fvs^S%|8QgiH+ds zSrVphYTicXXi^YRN6j>KQ8k-D2c5pN#CqPRk)Q`ozO%r}zwUe}KB(;;P@-+YZoYL+ zo8Uz>z4gJWveX-5BfkGL63boAKZVa_>epX`G!3x;A=(81hVwLa{1@D*VW@#Mnd{D! zrv~rRwMMhs@c{)MZ!*_fu5fecycu;S22IvD-YOZ`EPFI=0vob!t~JR<7W=f5w;522 z%~^pH-rg35IQ@CGOD1Bu=;ki(oHeH?ZX_6WbrsYe3b2N!(?{<{Tw5CpgRWORZE!cF z@ndUT?dDO&4VCSPDv(MR#Lequz2oXi4iEW{bixF&UVU4Ts`Ko3KlJC;b(sW!1?wO^ zD!z5tWYO=~0CD(WL&YJz<*xuawZh?OgN+<)m$SsfXS1^5}>@#Sj-zca8DIQ50Xeb)vHUFKrpR3x zYI;6m4a!R&=!Fuwd-wnI-*J|8{@*1}`l=t61QSes@#d+QBYk_$j@6G3aaE%h?DpJ? z#43~;yU#bp%{$zb9(s?g`rU437?`l;=y;L*u11MNor|6p_=FlyU_^jg!*ZAwtnK%$ zafh2ntTd^MdZR^yo_L)JIpY{|sCP5&syC`kTQfC zVbjta5XuXli_$~dc+HP7Q+>XZBzIfjNh^^q6Z&Xq|B-h*1G77Jcm4p>Z41_*_Vy#UGbrHO_(_%7g@;S_DW9A z&-L|e{}Dc?C*&@ipV zYCl{wU5kL(H6Jp^7v%L0oRdxINYEH$=p&!1akK84`F5eWn- z;=DUPA`mY@viF(pROndhZrg6ZqskS^@+eAfA1vC9$vx~lT}Q)9 zZz9∾Ocwun#IX_5a|%a3pQtc;wIBJG}M&JBX&`Zo|v*#7eC``r`)G)&z&GWfL`d z|8=X2#4@MoN58ZizLCbsC87ZXqOdeGdtEP_TiiGu^0GK~4p|(=%t9u`sK^B{e zVe;(+1gS&Y4%o)9jS~Dc7?I z!?wSG^1x_gHfh|^Y%2hrWCkD#4!jDdKGKY4>vt^=8;t|hQh1}b4m`tbgA-i}yB{(I zZpPc10ooX_u3bCpDEP!_tGh&ghQ07|^S zt2R*fll795PuCBWLC`<%r6EP!k!Fa`a?iSOE*F>%(7pgm4ircyFbzU^jn`{=;~{(3 z_QPNN-mGZ3rF%}Of&oY?@*egox(hlDlC0HN+NB<5gRv(LTp1V%(cwDOLeiZU^uTcc zyUZykN!i}zWIsizJsKFIWGX5@`Z51)V3&=4^0!C4ArT2}kk5Mj1*FsgD+5cK>#3mMPLZ>Nufw+B<(? z25+w?AhpJqW!MA_nlTcnVLy*zrWX1V)|hq{m~k+}S>XNN5GyWcK^m_4$(r3wDK+`7 zykMTvuswjD+$_u>lX+{0U=RN0x2#Z=UwHwdPip%%Jk1m#1WSQt7c5pI@YavS^O!A} zQ_k%?`IO+yHIqS;mp?#`gq>=cbB2%8&8C1@uCWdza~?=7q@gVfoCdn@;VlCU>5sjU zzy-ur7UO>RsuITZM<8S3QaGozQi9^$`|?}X!Z9IMIi*HnZj~Qk0U_)<(bEVeRx1K& z&8i`J@OrJ}<5E^a^p6P*IV}- zJ@0_2CSs?$7mQTzQBZ@iyjMW0mt$GZldKw^t`t$Q)=(g}Dl-KPsLIn{4-?fxLgN$T>bcTsNi>%eu=S|Y3J-y%D+;{8FF1OdI5q)Ib%~v>vsO!w*BHh zWrpn~Ur}&j&FR;K#SF}v(oitOW316YS&ETa+DBAP3j+0?tlaf|71ArvL})y6?f)If z+@D);u`gD3-fOM=cU6&LUoXvu+9xo?zokN26Kd!!c!M5e7&U<8trXd!>HbNTo+;Vl zHxQhrA+bUw^d8y%1E8#icePb*yOSd&bBfp+7Sy}3)EO^KMhxJ9I&2$Dqb|+lsVn|; z?ROugGZYI1@hCNoDov54BVXHHtx0VCQ=1Q~!w6|M4U?Phv?jn*eUqcKtS0so!xrCg zi5hUc1>&!eZ%yxyIj?oTsK))DQmhi1NC0Znkhdnl3<^bWO$*H}X0F}gExf}6()A-1 zbA3K-mEu0T>feFpcYMOuv{*h`v@0L^r^ebGtR4;d?BzH~<*I$|gSm*U(xS|NA^ytO zO~IuRwuO9dF9{U=KEUI(0HJ`BV1t2WfWp!(+TFnzub5he<{MA^Di{rD#^b>kWY{9L zk`tlE$uv6l6}ScGWVqt3CO^)ZZ)|32`RBl|)9kP;Jf~53GcDjMaJPd1@bk zB16i=CMrOpbsT>PkLo;JwISY58M}9xVIb1%dNY^<9~QbmG2)xZ_Ff<<426`45m1D3 zX}@=~`kpvDz~6#r;Onrd8z@Gy5ec?~yN{m9B}n0(j0u)D`uZu%yU`Mq7SV)9$QVFt zLZy?PGMK`&D+^8CtKe9=x{Mh7A*eTQt$mjD{GKQ4bjG_e=X8*fhURfh{>h9felL4T zvq-jqDadmi)ZOuHUwi@|CatwgM`q1fp8%_?)D3>nk%?WlZ(>2BEvqCJB9}OQ-y>S1 zEzD>avVK>EkE#7?^)~e_{XPgH17JDuvGoV!4$nYQhV6kv8Ojy?5Kdz6&ZmUw&kwU6 zfN1ld5bIdr*GK!kGG--15a$j84kYz4iAW_(B?zRf0@Ktp2+KQev2;H7{f}8A3EqzE zb5GkN-zVg8yaIV|h%XfeJkX#3AL4KN@2VSXH}_J3lI~Ai_b1IzvODYC6Bh5bCR01y&D?-7@YG0&icU8 zji#G-Vwts-y=juZqSd# zC!pd8#tZi3igc1n+O_R>Z^aS$uPT#JGNx-q5m#N*&$4L&QrNL3Af=4v!m|)wtgwwe+M6bXfSqTiMZK|Hc*r>kED! zJs^4lG{gV~0nk(+ZZ1etkQ`ZzWjXf>Vo_XLLe8lbl{vg^V}?aDyrVKPlw;N3%Kbt(VMMiN)MDM&8}42~-1L zK2gVwI|K)us|e?7FP)?sxWE@;SoaA*EF#6fFA!^Ff+m6+{qDiI8`A%~;aM2(fPk0x zD&?XgusG+iwCZ6|Kd_mvfoC_?h$LqV7K<#GwmVq;fFsBpN04>`(4`8C_ECI2H~Ao= zXWU?cvT!{S(77eO;pmO+C*3)$FS#s2=0Jyl;2Oxcp(_8ekkFg%3bQPD5{lKJF=ccz zX*8gD02}>*DvFg=zXN4lM8QVgr00Te#QWPlo3<2hjGilki*VK3LP7w7D0eQM4i|lE zR5?j)eR)7W&W1Je*(T!vc|1u3KF=hH*;K^rExlCMYiD3I`_{zV4e^kPTbM{ zpgeFr+Eh=cptoYVJrvt*fzHG!iV*lQ(~d_~&_m-%vN$6Qh4!^*{(! zvUfcZzGBt&p?1QfVn!Oc779{|LP&Y=DO&S4w%q+RSozkt+=2^`k%v3*CJOLG1Q>Q> zRS6*3o|`t8u;=jz;d)5Wl7FQVcj1*=#c{j^#tGzxg2e<{M;^}~k2rA?KZdVn0L3%#pAxotX-h0WI1*kTv@)(Ly_fnj zaag$(%Y}g=g87XmH@!jn zU7^^z4z&%wgII9#zh3r^fLjvBC~Q6*r2bb*WR7M*Wg$)#4`x6tjt_fDQ%$=QH*bRG zH6842m;S;oycFB0GttN6$K^Q|93tg#u=;f?5Wcs z7&=raPV)Dvs)#zpiLih>xZKnCZE|HcP|| zyNF6Fgz7`f$G}#g3Oq^xOdjGWX0Q6;G@>k$TkNj%|K-tV|H^#Z6F`q)Dvj4n; zzxdY<@b34WuhMHl63mjYIN%^WWW&=}XwWKdDhED#iw)$VtVE^uCpCkhb_LK0t{HB? zZgSOe?B4t^%v%*4Pi#u<7|w_0-Es$vl>UkGl!E=>piwHq{nFX9XR_Ys>q z*|p+!_`p4I2+_aK>I1L-1i0pZAADr1g8k1^MJ!R^um8%3*gw(wIH`i)?1kZm_}G&V zvtSI@1(Wstld&|Mx z#?KzcPdWdeiRtkIrhvvk@B>I4XFvv)u5sqC_=;Y!5r#i~i&KEC`@o}DzCAZz4Ffqy zNey=s8xZ`k(!6(9qQUAGc)S&yM1e|VuN^#@1z{H!oB#KzE{JwHIU{Wf8iR~=d|9(=a9Wz9$Qy~?kdX%kpAP!A z#-}6lgA?J1LY3*p-O-9m4Ua+nWrsNqwBs>xd6otEZAGyPeJ=s&@qc(EovuFdTH)< zi~KvB=C<{ZeLBXed+fO6v?yaDCh@ETKUMYYZh54d{N(&!b8j`6SorZTRMh=Bk@iE& zE2@%&9{%Eipc(GE<;DM9CG-N>{>@0zr%b-yRqO^_63t}6hh619QJt9LoYz)^3EqFw zhYTguNCC$}yC2d$6c)pFBO1w>b#-$RYQUbb#cMVme`%B7T}br#S!jwj<4)rwUHto6uwL48X%7SC1TN>j&DoL5pjHQ=3~_!4 zagj}feG5)7oGFMR1GLP(%ip@O8uavcjY=Ny^lPW@m4)j%jRU%|Kk5B;sa16aeM{N@yxjTUh`&+!uU)mvKAts&?=WX& z4tlc3b>P;mY+MM9Cej@%0>=osQ!b8VrEBS*VS8$-+SI-W!rg4tHu{HVaoP)ekaWO3 zBS5y@82ekCXU6^Z14>-GNNzPVqjAOQ@>gLN0S z#-dBbDrV2RJx2gkKrm52d~dLefTo~7FSHMgf-c@NN}6M=7Q_$QXqhY{%G%3U@ z(n>-rZSJuf=L~TDpeOL~K`k|eti;Vrpcpj5EQa*)zla`i7CFoW0w;MfWS&X&nGY7g zwKH9Wkif?RMTP`QXOQjNOgw;?4zCD*yWy|QmFEl12FGk|zcOO`y#$# z6MyFtE7X^y=SVao(eOVP9)(fYlZc*`_Mf^$q5%KXWteTgbLT_dn-ouzyhlauNlN{L z9NR@hu4;U5&Sq9-SL(UuO;&=W;Z)rde{NGol?}5{dAjWAYCqjcyBy7iz9!NUNoKYL zXJ}L@=p?H&*(-^@LFN^M6lf>J0g!d7^sj9>2Tuz4!cNbrY#39-kM;a~ke=O6RV2_} zB;TPlFR^cPKebkBS7J>iSBDc!$F57??J~@!yP>+buFMRZf`OlmT6qr*1<{CZkd5~_ zd|}y5kG`)f^1rCVio3YEsFmqUJSFS12CqC>zd&`u1#lvBAGWO%?k=1Ta1_6Xf#EKvEI^0(Eyv#;}!)miiPysVEg7dD>1@eNW zq?`|Yt5;<(0$=;2b+10(K8UihRh$JdEEoPUx=ph~{Wp?Hbj^$@ZapRW?Vv{RnXl3P zWWMwUziwC;>@Mv^*>u*Ng$fx=f4+jyE#`mEh%MH1=w7Y`*wQ z)JpQIycDIO%02G~=bAB-hiK&c)?Gi!%hE=pzg{Y-)tNLMvaUEn;H+SPFI==b1msX2 zpr%%R)->kpfdghBN+Ba8rdU5pF6%6vWZj*PrN-hfyR0u-g*7LMut*$O0! z94-9?Dl`!r0jdq;yM%(W*A}IqL{HtxYkoS07yEV}5EWE2qa|K*(C;6(3xRk7E28Te zY6dHcG(3shof)|bin$WBy!PzmF`_TEtIdl3pp&UoYGQkGyF4_3HGtoE}UjNBuQTcR1$ADn3 z6Nu?r)KWpNLG~~iUHjJjD|tl{FQs*49z?5mt-kr6sw68V4KAerX-w_@t`QSe zC_2ifbF{&}Fj4AaCektH4y{*H3-E`{RDIxcpc^yB=YF;dmV8f^H3b9^f-q7_`LT1c z&(DkNZimh1`QFlFfSge!9=el8)!B|6gfF@Axwo#TJ(4mZ-viYG*i!^4`GHt7O`nuV zgRnRYNhCCd&wID9o^LRznaEg3Jyr99_!s>#^-i1l?k%JMmt8v&1!Rsn{B< zb~jMHq1TsDFde9VM8j==ZcNw@;uT$@Ur{z1ePFg2eK$7Hv`gZx*^wQgd;1B8a=?W) z6^ckXfs^r_jNBdbl9>37LuF{*8#B-$0@0EGy`c{jV(^XeXmtP1%q1KS5)de_qQq_SiB z;w5+FAf<;mD-I1kg6g9M;piSgjCC;(N_-jgJxRrF&GkeQL%07WjnF|`)I#^t18S|x z2%*=wjb0GyY!Yc4tfimN9+%z)@=Fg~1F8h)N1)|14u!se|foU}eh-i(%rEBV_R>+AY;0~Vb8u4hPD(u?tyfG3C3(V`-%>jq ze8e1F(7DQ#PXo$Euq5~;ywy$E8c$8!<9<%f>6vusoA{GsS<19@M&Dz74>ngV$k3^J z5_uXybPv;gB3nxnoCl{J6zHt}<;PweGk=oAea3(u#kk7H( zeZ6V3xguoydb4etiFZMDkB=X^uW7^1@5Sz~Wnw>${8mKs=?7m3?VGuW=8gNhk1l#8)K03~d@4HmHBUQ}o!dn;1 zC=DrsCO1bja<7=*J_ii}L3J@X*R1MQqVHbR0C@TXo}S1XC$o9#-o&?q4t8FBy07Qb zsof6bi5`Oew$)FDSV#l{oThlq>gJnYFL+YSy3%ub^63a!o4cNa5M_l@vn?houNd4R zbO#vgf{Uo;-z&Sv=>C}ieW|;?Y`5n_Ic9eX(-7~Gig%7|93keA;nhRxDW1T>$w6QX zlJ&#G@gkQIqM44u<|VYP)Tol@x|80KD;9z32XK}n7f!8QW#FX@Q1iHNqN!w<)zn!D1`Vz8D1%|3k4pcDp9)~aMwja zi~wuaQJT%|nWn6MDYU$?`9!SBBlo||X;3M1)wRa1-AF1Vl;G3h0dC>z=iL+GBKh-C z319X~erJp3Pz&H8SCq5nbbaWQxhLsWoNTGwGu!7t2M!CI>e-iZ|Kq8ita-qlFT?TG z-RYD2kooJmZ`7o7mxI*upVtx@1xOfHaD)dxiR@+)XgsEU*$Nfv0Z$pOzpcfO`0+}A z`;{9AB|2)qlH*-a6ct*3($471qOV{oT!EQ48hvFJp7XhNfb4gxnt`!alFVZ8V_{Y5 z6FiAE56Hrn`mmrWEs}!DiDOrz4srcg`%E`#{KlikC*zyLIL(YM&yG}9 z&8&H|@$SV{SQ3J6lQ_G#Zjv~xtn_3i;K3;USB^}ryj0&AV9)A;MB0sw5`6)#QsqE4 z_qF?M0*Iio&U6ckUz|9Mp5Hw7zZ^usGbkXm!w5cNVhU2H6F572T88 zJ@6O=*y7H8wimgXz{SD1afB%4Iz43KvNq=CI_cWT$nBZU_<1$wPvhLr`*nV7GXh(O zQ2VGtDPG$HyT@gkR?`ov9ZVIr&k6?6n&jO78!wW7{B^E(qGjpnUG`K@bLvOJdK`wO z^HUW&D$ujXp!bMQk&!G;NO&=>5FGM)JlaEu`tzsMqrR+xYd_?A#Cz`NmxI>|GPQiF zZ4xdW9Tk6RY?^m>YW8LkKH%%-$Uf2R5YWU7I{na2ApC{7I+*C2AhF%!ViriP9aQ2l%?7@e#@1@E9(mTbv)vbsnJ>d1|Jd5ofG3N zZ@;uDp(sM9Zbc{XGi)&F>(Esl+MPAYiy0L?J`4m&UK&B_U#W=j`l#xoKaJO9J3jw1 zMha!Xy@!8)Jn=t~xWoP?ks&>L&0PG=tB_9zqxnm|-@lSkp+`z;7JL{B3i6s$Z4VEP zVi>7n1Dwjnz#~E_VvF-`?&Jp-@<2!NNHyDRP+zu%L5im}9iKr(lg#Y4X4c%5e22P` zE%J!ES&L4N2L{A#%DE@sGrNaA>lTcQ{^?t&{PT`go=$*tcBLmfZ7zuY0v&S3k)1}RI{XBi|s)^I1?=*6W^%w?;kLonwq3(bI)jC=J zQO02}AW^)McemjQFhO^cDhoQq?G3LX)XvVOX?Zw|+jn3hh?RY*nzY-?Ql6R|U!`O+%V?h_jwb=kKmgYk8-nt^@U7rD|G zdT#bS0>u}-ZZhc~lEidrACsdpNaBu~@&AR#7dY&BT#BpALNJ;^wITK?(EY*8S6$si z{^a=Fmlzx0+4H;y%w!7eddZDlDsHe;XhgBGvEvN+ZG(dA->n~%CFXj3Tb=C16iZ8D z0urD!_e3I%cX)OL&}%qj-4+}t8S&7_c=8E%3H^pr2S#%>2{FZ=?T7ce8YEf-dhj7z zc+`C>F}$>!0yhR1#&psNZ~yFMD6oGpd(d!E@p?eLjhBN|Bov{?Q%~FL0&p9Q(~+7O zIaaaXXEN+ahRY@ByNzOq`SeaJ?Ta2ayn`Z48tS7*fi({M28iODkVhm(7&G6o)QmL0tXD0rS?(Z{Pn2XcplGt6QK4ngpm7_(Xh@ zrHU3c@Jb4#vVbRi4_m5_T91R-7S9k2Ef~Q)cTif%n=={?CWDgpf?%VC99+TtJ6#Xb z!&E+{s?e16CDOQLDkKYpB7~>%9ys}(+q*lRfXS!*Jgfi^qFMVh9dz0K?&}Hs#C!b- zk62?h>_a&#+6{t80kcrv6zTKb2;SY+^8sqQNiIK&2=2R<{aQZnl;)y~Nx_3`CDEWr zm~(KeSrkHEg7pUo#+av|A(|lmyRd--?dU zQ=UIZONY){HeLK}7!M{BUH;|1QWz#zxjSFEopx8WqMt>%NlkEDjS8mW z@>>Yix=k(Q$>IAMY{a*VhFSWlo8VQ+9R;n9Y$NmgWxJt`r7`jSnL}kvL7!G!Z}QnG z0sjPO+*C6N)SfGN_}M4DyP}f5bvn7YCaV2-><2hNZYbj;vYj~30YY5?;hB=jfl+t0 zCi9Rai%m`ct)$~V{oY4Y*7g&P?#gDz!Yc8zAq6$zu>|OAaSmLSCnmfvh-M~qJbw>x)Lb7PtSWxzA1zSS*{98$S=#CP+mDTU&A@!p$bBYe7zlgEjhpUb=`p$o>g6mbCz zu8JhUgc`$ZTwVNL$XH{4pzw!xU}(JpFS?=WM>xae8gpEY-_PDcacZdVO(IfF_gr(Y%Du7Dy>5=M4ch|4ogQ58%>RR!2^8DJK)Vuat?ULi2c~I zBb!j|pNUPUdus*5W)#x})b^x_0T(g)J5tc2#jo>R%T-_AlQa(07X@njwd?^qmlvN-JE_Ird|R+N)EanN+Z7i))Wrv&1L>-m{Zjad zd)X^$fr>C)*%W#n*O`FTHCvLHG4hzl!$sl^w*p8@nT+;bLsv{xSzbuYJ4`nFP~4n8 z0OI^4R79=lrWfnb=kAQ-(&H1V&WJOU!MhzitpoX8V=mX=QAWddSz87CflYv<;T!&a zR@)S?ob-XuH|g!5R<1LxUY}fU8x7Ba+mKZHrZ%71sYbF?`(TEw}vYd_me82QjY_$0kP5D&j2c!9s z_76lC=JD$XRuVT3H^mlPI`?WiBgcC^Y1U$WBX$)wSEZj6)LXEb>Yl>$If2gs_ztg$xQ|!t&OXW-l~5`E0G&g6knB_^6t;f#NSWVx#X8 zcx+FWB;00wmt_5*;Bo>TFQH<@GgCCvILYwYmP&umpJDb%zCAv07YR6h3V4IpW#cK0 ztf>I*(HO2rblcxMC(AOjFiS&hhtzC1v=b((_+|R-7lUSp4c+hrmuAv)Q;`jWGJ;9C zsEeuxDF{?VbLhbP6nqMI(Z2gl0vtE8;=X3pmHN=peFrvDM-%mmd~N!@cxjHgD><=x z*ar`5KSg`YfR{4&T{7L!QVZ8>FfA!?pp_U-mu(!ZzRK%jNx)p?^uh91gG5|Xa!BM# zh$d0PlQFUwiXXb+uP{AUbwb=h>Jw2<`z3!boJ?HOQ>7Dt7s(?CSgNNS0{pVsw9cC& zk5)BH-d@xf*x!G1q3agHjFM$TG=L^Rjp&P3Anj#G2I?F?pO4L*rYEAlt=jFwJ0Oh% zq5FY(N7XgaSIIgxuV!Y)9?2D4MR!RY^*vxo`5f@NQ?fsEVvSSNxtGiZku>2zTQ|`n9zLvYgx>`IE^f*wRYj|VXnJ<=NrsKE< zIEY@>@bztTD2e#SU+aYfv4mX_a`NGcGIHO|J4YuM1%jWqSy)|*SP`~tiC!u1E+8%p z?R>aj!{Nsh@vU{E)?#PEvg;5&D*VM~(%>Es6)#Mo2FPdA)i`a^J~6UMHuFbt%r{ zu2w=RAEOMmQZCVdtaXRW*SO=B&=)j2mR!P@GzO`8OAKp+*31WA-wRETnPePW7#(o{ zEfNsw&3+jH+#jb@Y#mdoSp1S9=T?ces>F~0)m_~sj|dyM1p~SSLqQ0wZB#lESu3!P2`QA0#BuNf_a9&n+-eqPqp~?FLfpz}Y{u(`)h%EvVCrB<2_bJ|bofcH96I>W z`JJkCaJubfNuG?AjHGDO&t)%aw|jOjaW&rtblwoN zuj7CR#KX3AAgy`~9eVXBVxLW%Jh`vOcsa+75Qx8nM6ntRNTT&EEog=N9lBu#EbN!z zeu>vL*bXfeo{Xcxr;G&BSXTE9XJwVQ+>Kn#v@a4rmtHJB{5ko|H4eC0dX)_j9vODp z!ksEv{qqJZ@P!SlJ6!RJZC%I=~_c9NCm9$ze)weLbGrQQ^exFUX>HAv+Y8ZV?!!P zRR5^O|8ZZ< zzdbX2zxS@!u(YCL7gRZPVQxcA(!lPbtX}AjDBewaK6wHUx_?~RV#2~g&Fqh35OnfI|fd5VN5T<^d7@0T`NiJ z{XBJUXdD3L`SaQS6wSjdR%&#Z#evJdb336T-IWbuwtlbR>$l)7xl?PT6(SWo&tLdB z$=WadP$2kq%Wm1ZWI_F+&j^Ag0WZ*D0x-t|8ik2QpFbMCLkKwoQdZ71a@7Mww=!4T z3sqhP3|F}qu)NwG;(idU6{z+h{OrkS_yM0LtSGNxAA_pn6&M8+{_1PH!F^HlYgxM~ zwPDe?!(Vr~ORVv)YHz_LRl;57+UJB<2vBA$)>(7MnIM*wFu;49@>I@kW&@_-0=8VN z;xz8eaczfLX;<0G3^S0f_4Dw>+KKk%xui%#bU>-3JKIUEGT77st_S)9I+vUVojHm@ z1!RbiNWAt+*i1jPy9`LSyPH(mU&I+Cb4B(jHa)ht6y7odDZ!;y)Su?|LMrmrV38M@ z%A`uYz{vr*>cd~GdQn_YI(u8(KJe4d!~c2#mX6tPFtoA(6&lp9T`7!(y#XY@Kb-1! zVm(O!{R9xEbEIRTIoXGX=eK%J5nhlbFgr%H%9K^TMxDdIc}m|^Fm;Sjw|+a`E9p6= zZb5IZKW2p|&;}P>m97DnONo|mw<(au1bLaMR3D!av5WaimL5$lLOQ%HX*)I|!eG=o zWEp>hQm+Zw?r?-LxM=iOw00<5+>sL|h5+X6IyxhFRlhvAy}Xy_2h?(zh{&`BsiNId z@Y$$!*^j32QfezZU&LWr#Kk1@C#G`G=uN$>_@52-4#DdvLI|@G_wt^ebc1ah_Vo?0 z>)&e+cSsuco$0?C19&q9g6jV+@x~pB1iwWI!^I%nYyAw6l7FvSTw5Ic4$b)gqrs;I zt6)$I8nLml8_6<4|1k(f6LK-S<^!LbKE-Rf#eBXnP#d|TBZAk4+tC09 zqR_E>Ooz|a%0l@@j$21qI%+z)w}%ep4f8Kz1OWe;q4Eh~01UiEzL6kt8YBLK({Y826bS_>En zMv|rzzpH?93LAU*>6tcoUp^Y8)v=_&_f<^n`p^^3TtP_?`9;#%rdnK>e~uZ@%YzCf zL~na4N;vdJyt?60Zqh}loo{(!D+kVMEs5#>R)e5_#J5{XRTEWDyITp7!np>f5Gl1% zwz`I!Ka&U}yN{bNy2(0KSHBR!rD|7>bBSy$hkPqFS9S;M@}DU4=sg3nOU3)yaww2f3oT7DD+k@06t4a#}P);{KSwg3Lv2|7@G z>pAwBa$?Kf&*0n;y*X2CckArCf^#qCIKQgk_- z=n*o@wDU`fPR(uoj3}9FIAKjyGZ5!5sTA=%;|FZ1+n*u_qdz_NM%>vpqk9|-+iuTB}~Y83%cEvA~~S&x&=*(RC01kplwUl8Ht@6 zx$0N54r_oUj57&&u1=U{5hCYci^Fh^qjs&i;1N%gYS&Fn8<*6J$A80eyLEn(U60Ni z+f|Ly+4v9(kYv$vSY(E0%f6;c+V^nw0LHfw%;sEOkJZEGGo=e+EhLLo%r+!Z1< zA{M=H`=?hJ%QGi|YT3CL8~p3#5PQ4IQN8|pUhYl?X&eQ@f4Pn?$hKM0cQ`*Fu{OV?U&yC0*@)!>>au4 z0Q|U)N6Wq7MYi-ax+Ev99WHhwK-6~d&7!G~ezI#MaD`ldvzD@7>Rxn}9J&N6l*pyr z%9OW*Dne%uV}>L?{?#w!QaJZ*>2bpSB=mhelu&@J4F%#P4jJyR6F9q-ge1LtJ1@E+ zPr&tKw0Ro;XD{W;f3JC4=2D;1O~OI6}0aoRDUu1z*)@7q-}038B{#d?7GFL6-|U#z zLf50Y0^3JH*6V=!C3j1crnO`Pl;K7>F;C4Cs>9pfIphft!Q9#iGIW@SAHU{aP&O!u;*7O8MlbG=p+8y(NQ8i zCji|n-^|e!F?FUVDwbrWr+01vL3S8oTgbbV5^r#p>6}GvxMjmL#b-=Bo?Xl3)Snfk z<*Pz2yAGL2>X~?Us6-Voqu|r`fZ$MHr-&YK>2Ls#lgp0X;`u_{$5U{-J|nl(GTW6j zdd^a?G^mQYv`gKFu3=M8QB01Xh}M~m+3@+z~yS&!C6FEav`xpsNn9M-jtj%d^7}mV72h;(X%5Qdanb_GarVM7DqPe z+VX4Z`JG2gpnp73j;l*zHP1X7S@@X!zE>}~N2G=`y}C0gbBEDAoayyKM;M?zPW(l`J#Z+0`sKpr3-tg)r0k#}DZ(YoLu>Mgs)M6b13N=Zw4L$DspBSW62E#WUpPw+0l zQEW6d`yJ4<6S`uLWH!^?iDi&tdGmv7XQlW{5}qBgT<1tzSZ$PG_yfC`=$rwb%>cC) z?uzy~>j#!Je4(?bj?~pf?8I_}yam z+uQ?LXe7Ddk0FHYGFJ&L{4woC94$T)mL6RLqCZS}j>c2&ckP0=F6wd9aGB|v8C6SM z;ki`Om&@>MHX5_vx4UBbL1N*z5V7Y${;-1&RcYQ8`b z=(eCmh{YRAYhhq-+`!%SY8a~%zL}Z?XJ27EV-H!W!PU>=nVZ`sBBZtq9eF1*{DOjy zh8pMSpYiD!km+&y(2^fZLu%Z(iOrIazOjli&z*sA__Ea{- z^_j=h4Nbv!UduMR*VeW_pBKSrk_X@)snf8eE?Drpuj(epQ&)bVxfNR-mPQTY0!BH? z)II4IjT6m7Pg|Nd)a;e_BnI_JL)D8KRKP48i3-nV2o~2{)8^>?b?cctTNF6Oc`@GA zn0TS)r0=0B>MRlkOZRt@<3kHq2;Aa_VT@&G==}DBY|brfXcRIHu_w$=^?Z7ExtN~U zS8kmnet>7|j9e>s$>thQywU?ZG4iAx&R836Aat7(Vv^~Dn!!omUIRhz$$r{0>?gKp zsKbxP1ov+u*JnDGwSzX}3B4S}C=HdlHPr0C-m79E;wHN6H+=Gny*gy}gLb zq`L%Bx*HTk8VLbu1f@f|yOB~ry1TpKuI=~tJoi7iukIeafH64xthHu;=3H~$^05@i zOqF7eY#>6bH4tA;tfmV53qytO4v`f8mDUO)`}jOJJM|BxL~=ux+u;?RRj+CwJl!Zz z9+k7UH|dS~LyyQ8p|KwXQ~em-Hv7*3p(z(F_Z`8(o=%m?B`0~gp46}D zVAu(CX@vwTy9}nR)1BdxkYWf^V8L_+m_qAmJtJpXp9J_87)Cs%9?-k#fL`nzmHrNV z=YeIqxmBJgZ`i6@NPi2Q{qb7c+c;Qo>Yo0YdyCR!Hyg&b7O@J<2omHpU@EgO-^bFm z`(wn5n63DfP<<1^Xbg=#)q4L0Gf}nIK8J{zn=z_Cxx+AOi+;Gse*gNKWRDw&&RU}- zs-P>-eg^C$nnvf9c7|L-m1xGsO^y3fj8GwE#fxD}!_4t&fQX*vZ>V#2D z;=U8t7+ETpzJjjSz7&69aMU<(~F%$>wR0)PS^5gT^mRg-{^;u^D+9 z{IrkuQD=Os$XoaZu6A3ste)KZ^mD;;l^vS`Y?6spUs7Ng8$*&~sMKf8{}FB|fETW< z%~H7!yR%W#v@qS@Q~_0;Jb0AR4`aC;IhV|%RN?opFu$qfrTR@GhvVC5Jr}A%eauR# zn_*6I#;2N!?Ee`Gf;>T$@$mJTmI)r-p*p7A=ebZ?uvSJfl4d+c8id8WJ;w~TPfn&% z>4qKt4#^q^W*M`OFuPTy8CX30oZT~mXkd_MA#R$uLR_ET!F+hnAFEXwn8X!AWS_lM z*_$?(<0=X`;YH|qhhR{+2D1q!kQWwB)XnK3;GlGS>?6YV{-u-g8EH&7O>^nbLwE`0 zGZ?^nswy+*u0`lZz7Te;9Lnw8B=c1QS4Bh*DgVvGN;Mm5Cox#YSr* z{l<^?Y$yUG7@2`u=kT1v8tZ|f$^t3c2JMpi%zRuY&+h1k$jX!)l z-k*dvt7%=L!VEXc=NU=*!}vB(fi}>#ZGPcnn%*U6&+dNJHm>HEgQF>v@9tMQFHQGE7ZIDS_@nNGF+D*(OX}g& z5R~d!T%8p=Oj+rK0>6zCize;G0hlzTe+Whaw0-`ntMmUu_EeFY>PcX^D4=`n_Hz z*qp0oDW!EgtP(#zX``(2`0jSIGSX=Ow8Yzmi-T%;o?v*iyI2EB%lE?mAGW@aY60Ba z#06(_<24%^i=N66At8RaywvuSl*}tmHwfMAsKzQlKn>zNmHBR>3Ip+2>oxX<$=YVi zonhOV?=oUPjM7rl;*+r&1C4(*T(78ZTEsR}`Jdg{q=QNaoOXJx5G4*fUG&f1fc^ad zAPp4zF%2m1#INGCwG^0xZfrQETr4ZpA{VH6!FDBy-V#r@+?o%Gv4t}LCcgkUKd1EM z5pa*NSQL*E(UwgK6(Z)b>=e)zc{JTkc*A>7XnnC1cX=~h`MH$W55NA&@t6o3>|P_m znlw0=Hga}uOm!$f^JB)Om+4KD44{6PVwKVUQ5vvOQ*AY$!lAXEA)NgCNV?Y z^{X6OV@dwTY`xtm(#+#tQY%&G^Vsk~;NJ(Gfg8VLD2T(FySw@Y zGRyG0J7qj4*B7n@_&n_jU%r2`@xbgTH``U*op-$DKBl67Yi{O@s&L0e|KQJ9t>}K* zYqqMm&6}i_|DrpA;==IOtve=oT>J>tgJ7$$xkGXJURL*r!d}9(Q)0m%ex2PC4T?1I?>p{!q z*$e#)>_s<_H)9lx%8aQrL;_J#ReJ4Uc$E;1MBl$-WAv8b3|&eUy~1`YYuNC)yxXDt z1iW7nG4yK>Sn}^5)ed;vf*4I4Y?(StCjEW@ZDCz@IAm3J^eK?hKNOmi{wbCh(W}W8 z^*jYr#ipSjI8Wm9<*JXE=IHdhsyr6O-dIlkxn~Vs+Wt#)u>O}e+SNCFm#LnsK$(#9hWbP*Tn!4BFbxzDZjTrgE zc=@JY@1u8qu<23^#*zixGO5_o)qC#&LAfKh-SlE;}G)K*8$&ap=$Q?^xaWp$M^24!948>cd;Bm6EkA%-E{ZHah`9HNvh3i!9r? z`xA+oCtrn8z%-$P+(P!^ql4Ccg>$x&a_krpg8o~(ZlAbhY@cGeDXv(p1Bt?!_@8{g^>05G)bT(O>F*Y-c(UmLDJ z>riHlJx)HOlBnY$`XWVSI*cvfQCo?Sa@?C@DC`xIEL_w-vXx0&mz+wJ;P(3Qy|gxb z+vk~)wg-7hPHk1NSFE*O4Tp>NV6%c$+H$7pY)uYs7@l-yKmS^{$uK@<4ET$+ zFL&);sTD-VDpAw4a_Lq{R=9IQm!o**R4(2fs}LvK`Zz)1%0Q!j$$2-h`{`!6<}VY# z0V(X4Yp1T9rq~^NAQ-nmW-kX^bMmJ4w#2@BW}^9(OK)%>bSI9|c@{0a&EvCl5F&Pl zNmq7ZB!0@Px62$KH!G@j)X0U^u=K@NT^gFrJ-W<2KU=w^q!2yG<%rGDuB0cQwnJ8E z8isEtTT0>CO}siadjl4*=yT-Tn(kM&bIpqSa&0$E#X%27!VCo-EQbLmdkCSE7`$vu zS~yxSgMwM8WUp!O*4HtSWGN-23A($fc;~3nO*Qa#eKq5(794TclMSDx)col(2O)&q z?o5A?g}ikD_4zTc6yex~$F*LO{oVF8)_eQ)p;s)m+BsX@LIAoXudbPx0nnP>nqc=K zZ#-E&`Z<`x0j)rXI4R+X-=qow*gi6cT>2Dz4J(akla?N9s|#VpBc7_d-m&YyO9~n> z&*1F#wYm0wwc?RV6xn}tUw$Q^#105_z?bcpDAZQ#$|n%48uzmL7A9e;m*mm>tw5e- zXwt?(%$sU@f}LK|=@AZ(0*rJaKv7YO|DH9kBQ~@X>UiA#_&C4x<8bFH zB0@w&=-4ZwM^3iCu5W-oAiCT8m6F~}Ay-cYBRYr&J%}oz-?H3CnaG4-l%uE!&bLORb)oOG* z?DpteaS|2mrebfDyCq0{I`wWJ@{U~g+RbwAOjXj^5vcWIKh}Vb& zSPYt9RdtI;MSaUQvN84D>3X`K5D}DGe9*%S=mE?t?yML-)MI@E!_kBGahGO0OVM< zlHxbaVl}KB)iha@aAuT}bzKSwfw>68@O`}dPBBplx%G8yAf?}YPzl@V zn?;Uo#DT=1VnCisL2y|H@Nb{h`{Ufj)A7dOngn_a-uzp{WhtsT z=HF<>fgiq&lJD05aHIOI`rBVTM3}MOIE)A+P&0pH+-uS=KsfoRdGRd`YQq@Jt5eaO zJYY)Wj27|g1|61=!q8QCiBS+f!6#!MhyGF3ZY=XMIjC&Y0ck#@ly=d z0-bbA(D7g3yi3W2E-lU^H#?S

rO9dMHv1nRrY4fWjXdutQA}>?0d|*7QLCDA_$D zXx^_GI&5@?xc>jt0*J7l75WvMTgV5(WvPovte4u;TxuR+M*t~Hx^A+eqYS<$8zK_l z20k&_ZjzFasmJ|1k6?CJ7w#uQr{W0#KCBTxWHBn@C_m8-8@=(0y!&T^Plkp-!6uXI z?j>Ks5DLcJ(7a-@u1vuraGlJm?EI}G=Z=G0nduv*b8@iCMX~Ey#QDcWEju93{FLI| zxPBSo(B1p7$6(2L8KB(vAos$a<;NC1BofV8Kw6?)zw4pd zvYcXaUGGAZjT>y5>lN_1YAeY}i%4F}Kk50R9t5~gTkfXe#(>dlTPES0{Glc*#$4dR z25^)eFr81908-1@G!Y1g@jzwLA{OF@8pY*`i4lt48K-Z8itYr9g@gtj(TZPKV`s#V zThagkJ8JcZ`uT@42YntZpKrUreg}$dDgf_=KS@JswD?m{=XF~;@1$9(7}KZB7#SpC znw}A73U&<17~shv0#li8q(d#r*DpM#{xCAjTJ;{El<<@}Fz~Y_ z#*Jy{GsK75eOKD0dFo`7u{y2_r7VS5B}d9Ir?^3dhqcKEG(7UypvD)V@GY#$nk1~S zs~Ne3qU#eDz5AR<&hb$2zZ2g3xoR1qI=gbTabUcwp#|(gpEiYSiABcU?Z{$4r|^H- z-aDFBv=1uWCVY;-L>ZR;*|NcmLB}kFTi+i2P`WKac!!EKvGkSqwTX+XHQSeR9+m>G z%mcoW33l|GPrxe2wk-qGV4qTj=Lr;R5)jnUjuue!<@FXR1|MPjSE$AdjxRL{^D{<{k6P4gkX==^SL^{Wnid4>Iei%n$sZ*`wb zBgoV;Ci|&uFn|JK7i)%TopNo$O`*f!bsFz#n|I{Z9c;g5|I0CA%Dy-I38jXv5AGFq zEHr9g@i>bQv4ZMyP}NXEy3=ug;$q|toJK0W{lcTkZHm}#V6jGv{J!9v;TAII%mfo)ZXIu0|?wJEf za8zZ65=wleC%@hYTCoa<*(g+PGtieQ1nlC|)NaBeAg`YMps%|uv6yKv59K=>~>x4Uvjo;R8;4RbKhBBu>drp zJCgBnUDfi{?YxA$ysbf07ftbB6&6Lu1Rc3ww<6mW3GNr3ZdUQyQfw(%%u+7VVI&-r zNtaW)?Ikr~HraPqATBweMCwTaRSx#|Ttcga3_%#Y+GMxmy|RS|2ONtNWSaV(*x9=x zBNDx~-Zr(r_dYgd6Up`1umhf)>VRzr2ks{s1>?-BN?UU4JCZivIRf{kc!bk(Zu_`+ za?!;n(rEF%WVsmwb`KSe5Reu&`P#K%j(3I1I>tC!6ij1w-R}flgSvwtvs)CG08H)oB9gB?_*goxBfM(SbP#%=DN5$7V*V-~K}Su1 zfWmB#du8$i`lsKhr-Oot4a0mJJGEpI8@kE~Tg877fWnrqVL_ouNcS?|NCJ=|i7F6V zQ5%_@o`yX)y8ZD+{fCePVxwHC(VY!@Kc>;A-Gw>&IxV$g#V&Gg^JG(n&nZl9;KI6s znwhzBKp^t|dS&0^@2}eXOP1G>VLeb^vK6*fI0OFcQeR-|!d`Xbm?)^ROQ%}|#Rz1^ zk7geL{Tk6v2QDrA*+T;Wsg>4qVzs9ES2@W3>>%ot_y`mxWs@DlRiC&!^&_&(2Ekgn zN{X37SXF>;j{9tXPdfk86Aon$R=S^`I}a9}!Tz1a3d`8ogd5|4vDqtT8jskY z^5COCQsl3WYe;Gu72cgUL_Q&RGy{D~a_zZoBdHAFmGV&Y1*nmazsN4*RsPVjHHq=< zNk0=BSiO*j{3!Jb+z1)3>q*Y_rEvN!+LN(!O||q8gn!MM~p z(KNX*&fD?Jk!qpi0beTx$e)1Py;0y2q$bB{B>i3Q0Z@V;Ws9pbZR@qiL2}#2GE-jIy$D+E&53joWMvO3?(cz3MvgI6V1?xX3&>qI7#3$IKI0guZt0TaRF%Y zzt2!%cu;LVDct?Ea*MuHNAqdShg)Q$WpG3T@+aOsHl|FK6K~brMP{%glb2sisENwz zpy(iEfWkQcom^!^_V!TO7^40QJBEwLK~Fpst!p8NQw{9SC~RF|3}6|x zbu(AKrTO3Ov6!W;?FCbi)Psk{M;J1lOxc>LfcD|03p^>?T`wqOr=D@;a9iU_rJXS3 zELdose}KFx0NrXUTGNa#0L_U26M{5C(kJZCYWhC6tt(vb;zHOQOA{8}5-={Z^ctX< z#b@f%yNH+cwSeG2-X+Gt=>{M_>5XdM#i%eRh)cv`Y@jr+e;iAZ$|xR|{)4!KI07a& zFgAo!4J3!tj%j40ys?Q=4?DG~Zu#xwPXtH| zT`$s}g1TIcz0^O93hA_}QbuY*=X*T*anYltxr?gE;yXjDiyNQYuiwtt`pA|VMl z(q>8ijSpq4?gCGER07CceEfB4pYn<{!|BlXKt{?-tl*gAA9EbS57X!psM-FT1$7j? zwDmUDqSRw*7P^C(r;HdbRVZ*Fl=&^Euf-iGI-nP>zL;7(h4nyv@>Xa%$MDxd@<=W< zemI+>^YCRxpiDL&O~O>*xmiVhCMP1sG9%9Oc{T5$Mv$F?NmxQVbtvnwkuMl2SGkWNSyT216@^>L{~0JI5xb zW?Mdji*kzW;jRT0V&$gSpNcwMLl1FB8C0d#@!nNJ+2G+MyK%URMQIY&VgOUaR z6P9&sc4-$pwd&-BZC5g|TJR<&#E_q6WkEv*0 zmRbJ|3p6ySG0YivWzoosh_9W+evmaHY!eDIzJa!50u-t8&Z1LhinwzZl9gJ5u2tU! z`X=5{HYYsQi&Xhty=%+sh6*Eu9!LjdKk0PkXB@~N12i7e?Bae4S~t)fXqpOl3S#~H z49hI`9F&6iGJ05_%;&=Ezw1xiI)n@3`nUThmBB-dL77N^!cW4_z&2Y->4|Gn_$pf% zfQ}CwWN;Tx99!?vE_%w4h7_(B8NdOPgKorRgAe*sp_M+0M#9(1=BRYiw+hunc7E|< zjO&Uzn#(p%^r5}DxNSN#t%mD0fMcR_wFmEAOiKpaEjKw_3($M5dME8M;@LP~9^mopw%Gv=f zgD551|B+I z2MBAl%R-JH#;5kz7|ux1&`ch=2~E?I0crY;k7&dHwipB>_kpvh#+Y482T;Rc5t!cf;C!yH-c zrh+`eGC7k^>;nMePj!gGB!(cyR?3UVKZQN!168CZl~>z=XUBkIN>#_v4;T*kpV)l_ zgJT96v`Lu?xZ1J{4H;d<{Q$v?WeyvVVX{!a47}KlV3*joQV+)B9!cxijjk7881$cc zPYsWtoqt$ft82x{aW!B`NrtUJr#u=v6YQdant@L#5&I#VaU>$DkU9@`1g^$l8}p9a zu;mc*+E_~tISg}H%pku9mCnL|e#RTN6f_&ptpo6|Gd#k14i2j0+8*@IvMKkmR&rm0 zL~TH4Hi2BvVFNynr9 z$4n{)nh$+Aw(S4`-jq+|wycnvFu%qK3NTO zNLp>(;N#fV%nS|G)c>(_}z?#?`-CgmBHQ(sN*S$&yv>V>B9f@M;z!_K(V$H@0gh!Z zIJowjwHxGrM+b}M2bg=H$iQoOJ`O0X{lEV&7#UT(i>YC~JoN)|ww?d=06waUA1$cH zdu&|%hmiu9keI2CyyZu0| z4p~mqkx*{`OJt&tO7RF+8Mlj{7zEyMe)1k{WwvXJVFIV>#5uzj}^e^=PE@5jCSp}AScN{5Qu z_B8#|dt32NM0SnM`kn`hn#Mm7mkCKqTHH}u*|-X+-BGyN(65x^I}mfH3tLo_99ch; zb6FW?r|m80W;r$@Cz8TNf2A~w=`GrjIDWcRc)WVFOv9Y~ zl~#zDdy6(UPEEEMzm=WO`dj>+l*4&KRaFnJd_uL15=n)x(3m^SpUw^0=agbGym2z3 z{Ft)#!41W>+5E9?sxNeXxlr3kCNZ<=G_Ec5^#jPkMUkIL2&VaQX&ka>D*03`ZrPQ; zG7K5qAaRAX+fl4u^4}TCILQYh{vQ{e{8nC8)su!7iVXphgs058F*L0scfjQb1Pv`N z^8ZF+_%A`ZvAl9bvN|9$5~T0kVr!UNRx50Rb~{mxc^-=ovA@$a&3KLz@n>Z!wZjYl ze;*+82+9y9-K)0kBvFZ<{=#32(!TK`vNLsNYH*!zLc^U5)g%z1p9|;J(ia)QpRyvyFhD1+%a3AaM4>{pYsRNq!bMd-UF;E^)jGgXuh5F^dGAu_aE&XAN2 z)W`naL-k+MfM}3IPSv%cib&C8-+a1sHt>V+{6#2kXR2jV>i+DhX|XhXN`A)E+&=5t zOnF&4#Hlr9?_SW>Li4MBeeA2cby&+hq+rDbU734rP>6QqZ9CWd0hwIk8G*s%mhKjg z1`H|c!@sLwVDfd&Vj_`Q3s=n{#&3tr z0n7fG{ZCYv5T1hJK#O96u1vj-^~vb>E6;;tOnNqbw3hT$B~s|k=Tfur%u)RPAV(q1 z(VN+9n#_u`dZ`?3_#JDtO^oA?l;lI)7N7XVXRrPQU;(aOPa^bJz>G70mOfPRLI2E@ zy|?y5_xfnnZ$y78$Q=Wt`(ST*X6$ae(#D@g&wg0M6eb^5E-qR}k^d+;%HbO;o1Vo?z7!EAK8`piZN@uoSY{7chWVQVodGSM>zI~OANFfS(|MdSnGspON2hoe z?#Qu~IQ`QGe6c(x9pJO~Gwnomv9J~Z1HhC$dGvH2Ox}Z5 z-}F;Ihyt72|JTZR>IzSQnQ@Jy_x<0q@5Zqs?&4rQni$eH`|CW7B-nzXM~bboA^7vGDp=&!tR(9#%_LF{h*y-H;KO9`w2 zPk3zg>~hq`ULuQZu3$i=e9zlFS@i$D;r;eYz)sS!V9Q8WQ$2^b$F!Op>WRz;4Fe~I zoTg+iK1wsSKJV22tZo^AxBeb+X$NR&O2X1Hr5s@lm!N*w>WUA9^TdV9-Nl%DuJQwdrys34aC^kXS)7DlL@}tfvlb3NM%-rdg1zG(TEP5^8;~)v@`|nhUu$T9FMB8U5 z!=;P>v)%VqlAH=nEyb4gTIml37{2xnWhlZMEb>1cAc^||>B7nJ;PUOxo41JFWj4SH z46Nf5Enn!oHtUW``R--)zu?@cxWLb_E1z@$0Vrof!V2qDN*QkJFPqPZY6i65xx_jx zWbG-d^@VQeC#C;js6Nd4b4c@JXe`1Or}sK$dOlj*esf;|<_-a=E1+#xOXzFT5AcH?3-OIBwm(%fKTM<%ohou+SRfDH~_fP8L zwJ)!nIfETDR8|n48vM=)Tr^=#%1zfz?dmW+8(1i&A|#c~ zv=-h>=sL9?_`z{%i+z1C?*oBJj7m`InZfr=Vb}%~ zvk_2JHu(%*C>rU8hQB0nTJCNeHs$n#{T1fwW*5L+cz%8fM2vZxG45h@|C?zAuCh1US)9fqhpFyN`sVoH+NW{qiKh7xCx!gN8^^uy zg*gG$5rgl6QbQJtv+(@zeY-0BzfGPEexDaTQi*4jTD;Q+WfHRkTef^=l3^JE=}kV@ zYjp?`G!H!N5Bg6{ZC8IwJWpIv2)=IcE2R3KFxSSXnR{mh6lW5UsUM2ULC9lzRu)Y~ zJws)U*hs_ejocP%Hh#@(f?_EJS^?W?KN)Zf@92L2W^+wR4DT}Hts^GEcV)kmEhK*2 z$bN$Nhek6@6_$YjdempIGZex^f6w`mXiho0T}GeSIJ2?%?B4;e%m9*~-KWRLY>h}A z#sox+g2arMFCx!tiAUZ9rxg)|I6Y+(Q2d!b*(g!!60EsKobwUBW!tz1hYdr+L<#6A zyJpROyEq93M~ShUnos`VX82;?h>=EcKENX0WwOUKID&m`T5WnVEf^o$b_x3EN0FW^jhs8 zxMq1`#TI&MXpChI+cMO;FdxFc8g}yO)E4g3!&oBY_NzsozhdPmFS zZ5bGLCsXxIT9K@(G6P#IdQ+2QG>j8hWKGt^9kG->i@fmk9yI;92cmvvgu>JI zjfoSjIsF5iRW^%w>c;=pUs5x)TK8nNA6;xXlSEj|!dEHmQC!EolAw)B%=HZ`OIhjb z&kpBVO5UFY#bCqGef7A!xcK)j4r?H^nGM^cuAi&E)NwApjPa<(+bzqi#cLxfF%3g@ zEga_Rt<~7V?yFM>xpa5a?21fD?Uwqawn~J|W zsDKix5xpLi;z412u|#vW*CD-M5U4rX7!K$lrr!td;kD7}IW;DxTg)&RkLgh$xxVFj zOhrV(m{+Yo(4?;YP|yv>+hjZ0mVn?n+wE|1XhpfLj>jH;3E1t5*XU_uI!n<2#{6j?=z7_E`9F znE24?@U^B;Y@8|=N24%2UZ=a2%%sg1=;OL=Es7@3_~pw=dymG%={a1O5QIxuu(Zt#lo($RN+IWC=QKkXD;JRp3TBG>*?(0!%7q% zRad5mNQdAr59H#%)e(UH%UUD=HTi{Yp2%T_u)X|^R8jO7g*=7tzeJHSAm zH8aLnNp^X}|KaOXujMEp0YVGsFKlH@Y(ghP+Unxir5PUFiH4LeWks7F_`GvDc4lyP z@SrHz@^~N51;>zC7M_LQnTicH(#jomf(vubR)YwzSzvl#^4?Zj#Lh&T=57#ayO7#5 zi3jG!*SUcxp6Lbe#X0*GK8#NX{TPY$@^hMQ_0q+rw$?TuOrCu|OFmq4aEOq{i2b9i zu&<0au#5WSL9aGZf%rGVn^3z^}?CG5Rp#FF=flN2F*cP`gQ^Squ5x3qQfDUS;E z;I`N#MONmP4}j7;Vd-+x&6h41DckmGopAgp@ITwm*A7ALNVfr zu-Z#+>G$+xQ1F%P1d~vK0_OaM;M;z}N$I&I^B-AZ-5SoPJtNy2uVZh-21to4Yzx&G z5E$mD=Epl9o_DTg;oMlZ>dm}*NnSOk#7pdO>sXEH_AtKiQ^uK0fJuefa_4-B-|O?p z(W(iXCtd#EdaW98=skW4wOD83z)qmro!l&|>&ykV!*QhDUxm&LEGGABbqj}HxAx+P zh;MCo%Zgr`uV*R1Lpq}qkmj!5S~@f6IK9*GB#6@#$yf zHS;k#Zg|tPA_fCATSKk1b@;1y{H|Ka+6cxEq0Qy|meQ0K%QnO~vn*s?LtD!98#I7Z z9`7#%8zNzm}QyEirr;X|sW@uojs(LNfy-6`T zi2jM#9Ka#KDmysSUGmnMefjxILkkN<8zI9_+~@l2mjx>94iDQ=y!NqQrDBoRIIC4j zE|t56hRgTeJ)a@jpGD3LD+$JrRyW4{2Bu*Z)d@{_dA(Bs1Oc?ToGCnAN~QKWR|aehF2N=Sb_vn?h* z27yMII_~4?C|GYmt+}O`KIdB920{xM2m%my)6RkP;y&@cC6oO(Z?J`zCC?qaJq}Jw zRy3tL`JOj3*)to|HW&^#y}kU^vbl5`RgWGYSHaLNjtuwRm;e@@c5#_31+zX%RHJG+ z{POhiEQ+T2g`4}!Sxedl@zCKOW+{51=o4v6I@n(*JF_4Tw2}d{$9`WS3#0au`>kZ#YQ2WmyYLy^83Rlq6Q7)GtXPAKbdAw_kNp;f6TKLE9l`uI&Jgl&XC}E zn@-RCR@(hSm=slOd&sVMT1zadMUHS0*XhG9E+c|J1$4N38XHZ!Dh|X!dplKaAsPm&V+zjt{a?iVkz>KdUR`r^^T7z?#q1+p5S$0eBwY&E`kvJ)> zGwYJf4+`(KdZ(r`u?HxyUc3bn#Ipfl{mb$a2Gk;9S^LIefo$iUbdrrsBNiE!b#XUl zsdb2a_@3Ag2v+pU<{AYkC2g5#sUH5)5P}mxq?6vz{rp8{-Y{+0Q zmscMatOa+q2F{ZU&3+UzR!{>o-o1aZMATQAniW&@MZELQE&{hIiG-MY?ZJ8#_2gs> zYw_N7Ks$R_cdf?Z+-387Wl}zqCIpx;gzMZyXH9nPnU-ucH>r6HQ&3o9Ezwj@IPt>m zt~2!zMK6J|Pp_#tFF*Yy``SUJu${q3O)wXI`APE(F~8Q3n{24?G(b|eBL&mt1tuQt ziZl?Ne`qIBKpyqoVXUg-w)K7?K~6~zS`uMERPyb~?-~Ds5LrtHY%~<00<#=07Tids_JZbDmZwzC9@K(F~4`$eNnt*%}1d<*wvwin;AQgAMRCU2M zQZQ=v!=YSEyN$npbK1;V{auxQdyx9fP0Kh78xlT_on@dv-e_ppsf!OHnAmbOXSgXBu-Iyb6jilPIu&T z2hABJ=svf5Um98n)KBPuUQ_91VifomhpivvvsP;u=W4S)Yg3h&Yi4JVLF zH1Bq1Fv|cPyw`#a8-gLh7LsohA1on0rb|GAjUI}Zpui3Y%CdIK!(>VruvK~moZ8e0z%nrDb%-2?!q8I149&T;4R1q16P#`dRu zOk!Gd*SYy~jF4jvbrQ|Z){f)WII22$G(iI&Naq%HZ1p&4eGbT@GNr)2ktxsmJjg=p zMkmD(d^k-0(Ud3^PGneSqD}hNc;Yp#y(vJu$Jc)l@?zIymTb79TckHVAO>L2<#H=(fR9hY?rU&+&Gizp>69K6>jBl6`mxfS1 z4i218$uG2yF<~TpfchD{xU828p)nacui3IHy1!#$9hjU0>^GocfFS6K zFf-<}DJO<@G0Av5GcR`}6^Z4>qz6IhFS4nT%s}!d>m)x64L~<&=m^8m<8Mr#@d=+W zR+;qmnLj-{ND^aaw+jHDzsSHz;a|oS6&`Z%ZKV56JM>k5Y{KcV%3k{6vT4EREQqEjx?j|>5zV*bn;#^4iN-qTnEQO#*Rm&b`k7BIQiz}D z24c<1tc&YuJHN;XB-ihfiZn|df>GQ3^IjA%VedMD-lLLga;e$LXNpkBrhvdP5EvPK4P-KAS*Qw>c&ER^^!fdDL(jRv)-4+tA z2f$h!Gp95jy+1&5!=-0&ZC(SOz>)F<$2T_AkPt7kTdw=ciH}sd(qFp4e%fSA@nc77 z_B>r_YCft?xng{ZElnnQIM^Tu#)bex#{lP9$4e^EdshkMXw{>te_;a%`gf1u*KuZRtBXW?(Si9lv61Sahhnf0><~o8}*s za-%KL`^xFcd7(ztaAo}&vKM<1fpxJh!2tZFSCrB_o!J6fT>9<)QlpIE*2J~JY>r~0 zxfd-p7E4W7?W#Z*0x(_+k`Q~qL-}T0s$&uiGihf#S@U8?IXgzppEi}gPo%u@YtwDV z4a((BZ3sQ()*ZPX7_IHK5(#}`|E}}1xSqvs4`AE-Di5QT-q_GOvfd;c8!)~LQjT!I zj4xacpC1-7ufOCvj`ji!erMhPP{>u?P0;>jFw+CI?yf-78qS~3x)KV1(aL4jk3^z> zDyQSel@sGlfWf{(UPTP?bv>0=O=@F5bD~GjZL0P&5tXfso>q^>)Hp52#HBfHwNjwS+S4D}GCv_pk>MoyF`hw74Q_$;B=|U|}^LwieD+_^F zIv~A=_WVbh3Y?N$`mAf+_Tn9G0)r%83>V-mGw%@=`^3GaQ{hUD@jZ-BkraYiPnl>lA86%%W`f|E`1Z#KAuBaEx5h;AbJo=trRMfug64UHsMQ#U zMbY2WW8mZbpev7ug%p`0_!s@##!z2xYa-wn$(Tn=Dr>e=n#AAogDK&@@ zKWN4bF^0$3YQBHd75g0H({Bk1y!ucW{MKca7Ynunp)}F)Rt(;zCFj}Rk<=lCuO2;r zc@fo0A&_?s*?IT)BLE(q)7j@;B!4_+zN%y5v3kz{uL(bVuI&Xw?(pcab~nde#MM(r z{Fh0C{UngNpu?_p`)^hN8 zgiy{(IE0LzYwMMHP$PHfymZ^WdEENB1ebQi161mQ{17ayO+K zR*D(=YQ)66HrJGNf#@;d0VoH~EL(9~Lgh^5IXs&;RHinHv`5)-edgiH)TO+sEXCkF z8C)NKooUR_Im%MXTON-S66uFTl<;_ z3Ga4Zulh3QqOj3cxRMwN(TYakfDV|^1dyq9XOpQw!mg)!8s^$)R9J`Fqc=m0O%Sl} zQr$qsdeQb9BSFMU@VkD8$aErT4@nQP%7XC7cdyISpTpbgXmZ7xQuLIzNCf!@*Gty^ z*-ca+YEa~I2Pa@}q0f@X7Q>AK8lgg8<^SS2jg8+bTXpapKQ5&Xs$B6qGo%)2O+?0i zujR0Cj`7tk(U%!`SH!aln%(g!@81@f^~J-$Lb?8pW_X;WSiJy+csCuT*JGu! zx5tjj8)xgzkpZ`u6Wfn1x(@xTh@Y|I=C|_Rt;8c2i^1C=Z#@CfYPaX#XExH0r(OXMPhwzvNrFE9faGYt)rn~WG2!Wn&tIndDAT*hIR0^rO_kNw)^+`VVY5Dx~NxMZ(=fngw#KV z^_L8l>U`;Kqn2|0`8Yp+P=4F^Cti^mVz-j+?I?h11fWUR0G64Bfkm zh=yjJGd5*kcubzvKJ}&oO=|_5#}9PbANC|$-CV2TFK;f&(=?VGo;VTAI6YR`XVWyN zVhuST82LV5&7aP|zt=Id!!@{`w>a1B9eKSb|>WOhzX6|b4+vJ_h0aQ zKF^D%dC`mc=s3^$9pB&nJC5&b@rHM5ty%cV_nO_U@rhY@mx$nZI(_PGmEv4%Sp7|9 zy7ddqA_8rjUo)W1Q@vT=P4Kx>J0~9{`>hS*!v`vbQfMU6Os@oSS_5K>M46LJWxz6NNI~9iJf0ji4tDtsX| z@yt;~RsItB4rCOwygW`(ko7abTaa3;!&h9OThxhHV7?o~N8k>bcgc;W9znC$L)s1=)gI;4r{!kHp@xrIwIP@*{nylY(x5}3_ zN9Z9L>YNU+?UF2vfj^vQz2G8Sdtg1-w0y2qlco%SQt=T*P3cnCGHhfW$InO^|NuX ze0%e1@q2o$jj<#2d_gE`g>Jg(r7jQwriW+- zF#Z^^D+kA-u%Kd6B-A9(;>oJFaS@jII3eD8zz_M-@*ulw>NcZtsX3Ou0cv8m9Y zx4vrWs|4;HqM7qmQtPR#onxPEG;A*A;JV5VeWK20gRPDy1Q#<-_|%>XI7p7h*81Fr zf7=7(w(bs(6uvw{rgrq*k1k~WNT8hYWb67g-17Y~-*;xHC+%R)oVpcfB5m|dGb8K8 zSuEQJ2NMrUE$if>0-J2N{76|38ZU0w&f*awayjoDGBg^bKu@(OMe#v6eT^#4%Kw8zX{OA|3aY?`3Z{KIP za{1kNv(GQtE%t>VaZBns3m}RdWYUK02HqzpV_lCd#S+;eStGM)Czu2*9Ht#VbQj-_ zH*0LG+1~;x=-=MGvpY9|RO!3H?SW%&WKM+A&Zn~^u4Z(9f4ng_$+S}1UpFkizbE5X zX-Wr_JlU#-8s> zVTCa7FChQf-HDA-(cSalV#vzgd`dk2STjFV1ejSR4-X+uq0I+`mBpX@S``&vbdqNl zbfSCxW6>Qj;TruTcBgIovGUy!ja&BF`dZH(lj?>MpTDGZA7>YyhYmyblYvsa)V&Lm zap+t;`JpxMe!Q_kJ~8(6q!?*nS;?u=x!Q1d>1mj+f438m@0>?3x^Q}qLP7~DHA{sy zA)Jd(TzvWbSj$ac=7e({gx;i>_a{=xc{BD7MS^RuR4njJNORyF?@~@BPq7M(Ok& z>`OZY$U>_$g6fkDI)_BTHD8NAP8w{=N29i0PgwA=$#0Db;^xI~yYfjyXb>$s;Rj93 zNzc5eHv&F)&0joJ_M)WCM;@k^JwM*>y?r);yne@hD5H-1`(vwY!lyebcQ#i1f$3c) z0?r>CEjU>+vR~<{@&Ge ztfj>(b_L^5F&uNk(ldo(LF+v@o_Z--0@7ECVv1H*r5Qam;4D(qJI zaf}27?a-WA{Xo@_Tb(S*qp4qW_j4>|uL*H$SlPFcvr|j4dDlb$Oy9`m*|Ms)sNsGU#9bwb0pt z5RH1OM>|5(eYoJ2-97&jmFs4RQp7*t&$z24R`Np?Q`4Rb z{^Jv`=v8@V5X2pg>$-dKPh~>^tZT=Uif6sIi$ZpESwgi^5WbDRe)tax_lJX@BwKLM zD;xahId(=>^V#y9|Kdwb>x4U=4(%xh4jxOZ9^%c9YU{c|KSx$|dB!A(%#c2P^sqCk z1nA%ytFfV^;$?5SMwp%(Kj6B>qE~!Ay0}jccMgO=`lo*fi`J1+JBr`sM#~D99ZcE> zSfwp?BOj67j!JmXTqW|}m>7>iGr@#;4NtE3z-~SGT5Lo{BEM%od)^X>8Z)(FHby7gYj(mnJ_6) zZ)%< z#n^Pc5OY5h{JdJ2o(E6?oP;#hZWt};UL>aCT?O?xUZM|G0|5?aN zV1M8AcxkA^ow#cwsrV*O?{o5ebA=rm$(X96ui2&r1=p)m~FD5NlTumFjq-dA^b^i ziDGJ-x;w$Uca`X7#WU(|yjM8%i(dRzG#Zap7-v-{?6entz(y8?a4^9_wJiTi+|@|! zmJA$?LASkw;^=y1pgg#iz2BkP3+aj{ z(d5fG1aqQ$>2md^krn>-_s5X_IT{S+Y~&MClRC&)%Yt{UQA2rQI6_S9-^M!lI~j-n zC9J!l{Ji3G^MZrFeY^wkQ_TvKY%IY%&9pcIu~Lsi0qYwj#o{e(qrPO-j?65M0@^|m zbi|)W+L-?WHWwK_m7Q#&sd~*uqDpLL;n9yV&7{+xhed+O7}VcSpNJY!{dzO*P3m=v zx2dptzC$g)d96ViDYDIkm{_JA$e?XwY~RS!ZF{oRm7sF>3|Jt=@l~ICCMSP*9*Xky z`Qew{vh?zufTb~&J*JR7Q3&lFL*#~QDSE9-EY=M>U67SW9+iaRuF@nX+5xL7wAwg_ zZF@TrgSKMqacx8d|IqH}c!kSjuxghO*C3Fq5Y`U)6@SgED_0}I<@ngATU`bmZk4_g z@06T62!*FSUmv0s0>EX$k%{g8#moW6B?p^{k>s>UJ7@OyLhnc zQC77+oHAwtFp~!1-djEOy8&YEV zO152R`?B|l>8po-m&;MiLYyRvUvm8}N%q$S#S2okX0mR1tP+QGM+HJ*U zdVrU+q2;fg!>M>(3`TCE&7~28AyJ5A_gBi~EQE_L-TFd0qL4$~c4Ssrd1b+JiDWH% z%IIqvd+F?hB-ku(uR*uJAmmA%9e|))U&o($R^_&-^MsYpdS3N+s9SrJ$Iz37tvBnf zS}oK*@~w1XZqyqGtepE%Vx;=fX*iRTR{lf3%=ok4AFn)+7i#5#hB#^RH#4Z+tj1vK zC1DT7T=#13^3*REI}0#q0kDXr$+`A`1y3?;*{xrjNX2Why?&-M$?sb&i%RqC+ge)p zRFIT=!|zs!s!@=&VAQq`I|Nx!Tb>~Had1+skL>@RY@yK2SI(o`7#m3FK1Fm+SS{bc zs85+jaDB1@XYj$6HXFIU%&t$hw@<5 zLeFWVuf_8sruZ+4_Sf$IRFvy{t3;<9OZ%@kUhtHAbi}zZF=XmA#7w_xV}R<;U{sO% znl(0#o)sb1ofQf9$fb0&Vk4*s-i9Z)5p0&Kq6AM*5>`HC>AT;gPRT&^=zg_D0 zTvXO#vs(J|7r^}U+nKavsF!_v=%iSPyyk?#;Fh+Yk@Phuh!ap5{NwsXm`B-ItbV6g zQfqwURuOyBE-tL@t>Xo#=NN5Y1wl+X41T%3aX-HI-=@+M(L3#bL;P5|P4LYPrcAE2 z=S(2zGIXnr-GgzNwnAd{Dl0Z}H&~uS8ZQ~Wpw>2oT;~J&=DJ!{gr3t2&8h)&jR3vIt;SUywT6V^CJj@|dxWDbr|8t*MYZaIum` z6?FjFBDln=x_$gU(7m$vAkmts{w=cIxqg6!fc?J*Q$PjT42?-jNCSb(D5qQs^$5&icK_2ui$sl3D^u zb--w9gp63sEHvu+DK@mupEvsH%RIL`Ho8ReRM^9Yyg#pds3mDniBAaNXef6m?~zhe z%MJ&3ot6dMoUg#LdUL!eDx;S!TZi*b#y3Ptcs_|@p#`%RXgu(Me;P3BT2&(i8ODRS z`jVJ{o@rlZd~IH{sGB}4(oOE}Th!Rjam+y@a~rt1;47fd1dqTZ@|5s-P+nm$-;Is; zEK3;=40@#p6Q?P_y^6G!$i7tm{I-ME#1!tLLf)|HycBNDlysu%ND*Uc&E-u{p8SC$X#H)l zyZhC~E?mBFK@eeXq%cl)k-l=BJve^18m5Q82!eB*_WY&vD!K@*@QPWpgo%Hc|EGKw zARM?N`BbOI_%m|aBH^SeS{-@UIB=BGmJqsSx5m zU~#W6!(WVfM8so4jHf&}-7mae7BGoI5qOmzV`Whbx?fv>+v~Tni-TLOvzW0bkm3^1ntDJcizJMUwJh!zW?- z6P$ZSo=0g-wF_0ZWK^*{ur9a&TJ#?Jm!;qY{2UR^GeWhL_TIy*MBoiLXBIk=p2$b) zYl8dk9VPOibS}4tRiCP)@}2*Tf&2 zdB!)h@Pb@bHzYQ1t(+O3_h1Ss`B^eXunF}9YeyeMJwy$G`2oAS;*Vxl42#T#4UU`3 z{(QL{530Q_nt|=%BT8+9LSM|bHwLra*BZNHZx>EY8Pt)*0_hHyj4Hl{Wu93{27$-r z^Z+e)1qXpLa}P%a2d7(^@mB}(9vpOn5hLJeQiw=_KJG>C`$i< z>5O{G3?hE4DBRXMO)I7Q5y_=?&DoeK^9C%RHcAf~9Ht}Ou4p)~l$`i<Xsz_V_cC z6EmqX0i%_7;Z}V69CF)l^$ZW1wkbDF%~H^Tt*y#p3BT zTc1tJ(;_IhGi?g9y|sUsg=L zEJ2rz^5@RS$em5c+t1x-U>X^XXsTHzuVc_;BhDr!39ywG`wrSfcH`pr zp|CJUj|}=C_TBYmqU<2(?m{gq3A}(9#~_J^Ue4G>)pQb89;?%A(s4(2|pghN5#y#Cx zE16aM!cs~L!^*`cqfJ;`rR6sLJ?I>(3XAD{&pj`}MK9JxmX=QN31x3qEpfXY9rRH$ zIZF|J(JjLER|awQJ}{>X^Fqz;Lv)!@c*NeN(&_6S)!WCTGKPO%uR5_(Af;HUod!=; zWPZIAPIfPwS(v03HP*Iprje=A^c+$$EDWA@`nnBs&N~0)LZX|yGKI2Nc**m6D36;A} zEI7H!`ES+=W5KmQn2y92tG-Kxvm`*uH8eF!Lt1~_3bK5GWA=L2; zcycXjyXo6?Ht0Ha1_FW%UE{p-b1e6KUq5ZlQY^vUx@+8DA8j%?IJlcE{-2Q`m zYtl!A{<@zls7r!{b%$x%c6tAc{otwH8K%XBN*x14>B`MC(c~0yOBtRW_ZK$5@9U&! z@qx5$l|6Y;BpGy3?((11+1Qa#M4vdO(BfOYUGFO>xpD$mb}_x__`LUaCE1 zO-VCy*)Sl+u6XsD^#spw&GB<)jGCdZhA`fER7o@%<+aH&`oUXnVCu|?3we#&z;!%(tdx<+FbR!YUc7dB&M@Y&LmU=Xs1Gb$CcRBLtfNo)S)J|t2U zf+y)TM3kJ4e&`_=(lh049-+}Bpx5PLl`oR3+=*e{PXSAVli1+*2H68Unk_yeDQUV? zT4LX57)iWWq-a^ayJBiEf6vw5$0+pnFVp?TZ6&3H{k@0Aa@V#U72td4`1O2xD4Fp_ zheRjppENW(?U#LWNWB4lqMjG0ew3$8R7F*(f#v&ON~KhaVes7uRU<(&x$!pCg8lE* z1FLeVmZD!V6y#7g%l7;4z(02Ge zh-+2;rwb=T|2H-C=SwO${s@FB1?UeLs8aX?2C5YPfZ?|k{(#{R82&H#&0r74P6(oZ pNu34wgR4K`2NeVVZ@uj}_E2>mp`!s|d6xPzn(Df0B`Vg>{|^gJEmQyi literal 0 HcmV?d00001 diff --git a/lib/views/pages/user/land_page.dart b/lib/views/pages/user/land_page.dart index f5947593..b0255d3c 100644 --- a/lib/views/pages/user/land_page.dart +++ b/lib/views/pages/user/land_page.dart @@ -396,7 +396,7 @@ class _LandPageState extends State { textScaleFactor: AppStyle.getScaleFactor(context), ), 6.width, - Image.asset("assets/images/qr.jpeg", width: 32, height: 32, color: AColors.grey3A) + Image.asset("assets/images/cloud_logo.png", width: 32, height: 32) ], ).paddingOnly(left: 20, right: 20, top: 8, bottom: 8), ], From 6caab581717d5db951c0a0a271977dcac80baeb7 Mon Sep 17 00:00:00 2001 From: zaid_daoud Date: Wed, 9 Aug 2023 12:05:44 +0300 Subject: [PATCH 161/181] Merge With Majd [part #2] --- lib/controllers/api_routes/api_manager.dart | 5 +- lib/controllers/api_routes/urls.dart | 1 + .../api/device_transfer_provider.dart | 27 +++++++ .../providers/api/devices_provider.dart | 6 +- .../providers/api/gas_refill_provider.dart | 35 ++++++--- .../providers/api/parts_provider.dart | 11 +-- .../api/regular_visits_provider.dart | 7 ++ .../api/service_requests_provider.dart | 7 ++ lib/models/device/device.dart | 10 +-- lib/models/device/device_transfer.dart | 4 + lib/models/gas_refill/gas_refill_model.dart | 5 +- lib/models/service_report.dart | 73 +++++++++---------- .../device_transfer_details.dart | 24 +++--- .../request_device_transfer.dart | 52 +++++++++++-- .../track_device_transfer.dart | 18 ++++- .../update_device_transfer.dart | 1 - .../user/gas_refill/request_gas_refill.dart | 18 ++--- .../user/gas_refill/track_gas_refill.dart | 22 +++++- lib/views/pages/user/land_page.dart | 19 +++-- .../pages/user/requests/create_request.dart | 11 ++- .../requests/report/edit_service_report.dart | 3 +- .../widgets/equipment/device_button.dart | 14 ++++ .../equipment/single_device_picker.dart | 1 - .../gas_refill/building_type_menu.dart | 2 +- .../widgets/gas_refill/floor_type_menu.dart | 2 +- .../widgets/gas_refill/gas_refill_item.dart | 56 ++++++++------ .../hospital_auto_complete_field_new.dart | 64 +++++++++------- .../search/service_request_search_bar.dart | 27 +++---- lib/views/widgets/sound/record_sound.dart | 9 ++- .../speech_to_text/speech_to_text.dart | 29 +++++--- .../service_request_priority_mune.dart | 1 - .../service_request_through_mune.dart | 3 +- lib/views/widgets/switch_button.dart | 44 +++++++++++ 33 files changed, 418 insertions(+), 193 deletions(-) create mode 100644 lib/views/widgets/switch_button.dart diff --git a/lib/controllers/api_routes/api_manager.dart b/lib/controllers/api_routes/api_manager.dart index 3bbfed51..77adc8b5 100644 --- a/lib/controllers/api_routes/api_manager.dart +++ b/lib/controllers/api_routes/api_manager.dart @@ -1,7 +1,5 @@ import 'dart:convert'; -import 'dart:developer'; -import 'package:flutter/cupertino.dart'; import 'package:flutter/foundation.dart'; import 'package:fluttertoast/fluttertoast.dart'; import 'package:http/http.dart' as http; @@ -23,6 +21,7 @@ class ApiManager { Future get( String url, { Map headers, + enableToastMessage = true, }) async { headers ??= {}; @@ -34,7 +33,7 @@ class ApiManager { http.Response response = await http.get(_url, headers: headers); if (jsonDecode(response.body) is Map) { final message = jsonDecode(response.body)["message"]; - if (message != null && message.toString().isNotEmpty) { + if (message != null && message.toString().isNotEmpty && enableToastMessage) { Fluttertoast.showToast(msg: message ?? "", toastLength: Toast.LENGTH_LONG); } } diff --git a/lib/controllers/api_routes/urls.dart b/lib/controllers/api_routes/urls.dart index b4cb7226..ff44c03e 100644 --- a/lib/controllers/api_routes/urls.dart +++ b/lib/controllers/api_routes/urls.dart @@ -87,6 +87,7 @@ class URLs { static get requestDeviceTransfer => "$_baseUrl/AssetTransfer/AddAssetTransfer"; // get static get updateDeviceTransfer => "$_baseUrl/AssetTransfer/UpdateAssetTransfer"; // get static get getDeviceTransfer => "$_baseUrl/AssetTransfer/GetAssetTransfers"; // get + static get getAssetTransferById => "$_baseUrl/AssetTransfer/GetAssetTransferById"; // get // employee static get getEmployees => "$_baseUrl/Lookups/GetLookup?lookupEnum=33"; // get diff --git a/lib/controllers/providers/api/device_transfer_provider.dart b/lib/controllers/providers/api/device_transfer_provider.dart index ca5234ce..d4f55572 100644 --- a/lib/controllers/providers/api/device_transfer_provider.dart +++ b/lib/controllers/providers/api/device_transfer_provider.dart @@ -60,9 +60,11 @@ class DeviceTransferProvider extends ChangeNotifier { Future getRequests({ @required String host, @required User user, + bool mostRecent, }) async { if (isLoading == true) return -2; isLoading = true; + notifyListeners(); Response response; try { Map body = {}; @@ -81,6 +83,7 @@ class DeviceTransferProvider extends ChangeNotifier { List itemsPage = listJson.map((request) => DeviceTransfer.fromJson(request)).toList(); items ??= []; items.addAll(itemsPage); + sortMostRecent(items, mostRecent); print(listJson); if (itemsPage.length == pageItemNumber) { nextPage = true; @@ -99,6 +102,30 @@ class DeviceTransferProvider extends ChangeNotifier { } } + void sortMostRecent(List transfer, bool mostRecent) { + if (mostRecent != null) { + transfer.sort((prev, next) => + (mostRecent ?? false) ? DateTime.tryParse(next.createdOn).compareTo(DateTime.tryParse(prev.createdOn)) : DateTime.tryParse(prev.createdOn).compareTo(DateTime.tryParse(next.createdOn))); + } + } + + Future getRequestById({int assetTransferId}) async { + Response response; + try { + response = await ApiManager.instance.get( + URLs.getAssetTransferById + "?assetTransferId=$assetTransferId", + enableToastMessage: false, + ); + if (response.statusCode >= 200 && response.statusCode < 300) { + return DeviceTransfer.fromJson(json.decode(response.body)["data"]); + } + return null; + } catch (error) { + print(error); + return null; + } + } + Future createRequest({ @required String host, @required User user, diff --git a/lib/controllers/providers/api/devices_provider.dart b/lib/controllers/providers/api/devices_provider.dart index a169b8c7..4908b573 100644 --- a/lib/controllers/providers/api/devices_provider.dart +++ b/lib/controllers/providers/api/devices_provider.dart @@ -75,7 +75,7 @@ class DevicesProvider extends ChangeNotifier { if (response.statusCode >= 200 && response.statusCode < 300) { // client's request was successfully received List equipmentListJson = json.decode(response.body)["data"]; - _devices.addAll(equipmentListJson.map((device) => Device.fromJson(device)).toList()); + _devices.addAll(equipmentListJson.map((device) => Device.fromJson(device, startKeyWithDest: false)).toList()); nextPage = true; } else { nextPage = false; @@ -116,8 +116,8 @@ class DevicesProvider extends ChangeNotifier { if (response.statusCode >= 200 && response.statusCode < 300) { // client's request was successfully received List equipmentListJson = json.decode(response.body)["data"]; - page = equipmentListJson.map((device) => Device.fromJson(device)).toList(); - _devices.addAll(equipmentListJson.map((device) => Device.fromJson(device)).toList()); + page = equipmentListJson.map((device) => Device.fromJson(device, startKeyWithDest: false)).toList(); + _devices.addAll(equipmentListJson.map((device) => Device.fromJson(device, startKeyWithDest: false)).toList()); notifyListeners(); } return page; diff --git a/lib/controllers/providers/api/gas_refill_provider.dart b/lib/controllers/providers/api/gas_refill_provider.dart index faf84d66..9fde956b 100644 --- a/lib/controllers/providers/api/gas_refill_provider.dart +++ b/lib/controllers/providers/api/gas_refill_provider.dart @@ -6,6 +6,7 @@ import 'package:test_sa/controllers/api_routes/api_manager.dart'; import 'package:test_sa/controllers/api_routes/urls.dart'; import 'package:test_sa/models/gas_refill/gas_refill_model.dart'; import 'package:test_sa/models/hospital.dart'; +import 'package:test_sa/models/timer_model.dart'; import 'package:test_sa/models/user.dart'; class GasRefillProvider extends ChangeNotifier { @@ -47,9 +48,11 @@ class GasRefillProvider extends ChangeNotifier { Future getRequests({ @required String host, @required User user, + bool mostRecent, }) async { if (isLoading == true) return -2; isLoading = true; + notifyListeners(); Response response; Map body = {}; @@ -66,8 +69,13 @@ class GasRefillProvider extends ChangeNotifier { // client's request was successfully received List requestsListJson = json.decode(response.body)["data"]; List itemsPage = requestsListJson.map((request) => GasRefillModel.fromJson(request)).toList(); - items ??= []; + if (mostRecent != null) { + items = []; + } else { + items ??= []; + } items.addAll(itemsPage); + sortMostRecent(items, mostRecent); if (itemsPage.length == pageItemNumber) { nextPage = true; } else { @@ -86,12 +94,17 @@ class GasRefillProvider extends ChangeNotifier { } } + void sortMostRecent(List models, bool mostRecent) { + if (mostRecent != null) { + models.sort((prev, next) => (mostRecent ?? false) ? next.title.compareTo(prev.title) : prev.title.compareTo(next.title)); + } + } + Future createModel({ @required String host, @required User user, @required GasRefillModel model, }) async { - print("ss"); Map body = { "uid": user.id.toString(), "token": user.token ?? "", @@ -108,7 +121,6 @@ class GasRefillProvider extends ChangeNotifier { "GazRefillNo": "GR-${DateTime.now().toString().split(" ").first}", "status": model.status.toMap(), }; - print("ss1"); body["gazRefillDetails"] = model.details .map((model) => { "gasType": model.type.toMap(), @@ -121,7 +133,6 @@ class GasRefillProvider extends ChangeNotifier { Response response; try { response = await ApiManager.instance.post(URLs.requestGasRefill, body: body); - print("ss2"); stateCode = response.statusCode; if (response.statusCode >= 200 && response.statusCode < 300) { if (items != null) { @@ -146,13 +157,14 @@ class GasRefillProvider extends ChangeNotifier { "id": newModel.id, "gazRefillNo": newModel.title ?? "", "status": newModel.status.toMap(), - "expectedDate": oldModel.expectedDate?.toIso8601String(), - "expectedTime": oldModel.expectedDate?.toIso8601String(), - "startDate": startDate?.toIso8601String(), - "startTime": startDate?.toIso8601String(), - "endDate": endDate?.toIso8601String(), - "endTime": endDate?.toIso8601String(), - "workingHours": ((endDate?.difference(startDate)?.inMinutes ?? 0) / 60), + "expectedDate": newModel.expectedDate?.toIso8601String(), + "expectedTime": newModel.expectedDate?.toIso8601String(), + "startDate": newModel.startDate?.toIso8601String(), + "startTime": newModel.startDate?.toIso8601String(), + "endDate": newModel.endDate?.toIso8601String(), + "endTime": newModel.endDate?.toIso8601String(), + // "workingHours": ((endDate?.difference(startDate)?.inMinutes ?? 0) / 60), + 'workingHours': newModel.workingHours, "assignedEmployee": oldModel?.assignedEmployee?.id == null ? null : oldModel?.assignedEmployee?.toJson(), "site": hospital?.toMap(), "building": building?.toJson(includeFloors: false), @@ -198,4 +210,5 @@ class GasRefillProvider extends ChangeNotifier { DateTime expectedDateTime; DateTime startDate; DateTime endDate; + TimerModel timer; } diff --git a/lib/controllers/providers/api/parts_provider.dart b/lib/controllers/providers/api/parts_provider.dart index 0b026f2a..fbe7a319 100644 --- a/lib/controllers/providers/api/parts_provider.dart +++ b/lib/controllers/providers/api/parts_provider.dart @@ -93,17 +93,18 @@ class PartsProvider extends ChangeNotifier { Future> getPartsList({String host, User user, String title}) async { Response response; try { - if (int.tryParse(title) != null) + if (int.tryParse(title) != null) { response = await ApiManager.instance.post(URLs.getPartNumber, body: {if (title != null && title.isNotEmpty) "partNo": title}); - else + } else { response = await ApiManager.instance.post(URLs.getPartNumber, body: {if (title != null && title.isNotEmpty) "partName": title}); - List _page = []; + } + List page = []; if (response.statusCode >= 200 && response.statusCode < 300) { // client's request was successfully received List categoriesListJson = json.decode(response.body)["data"]; - _page = categoriesListJson.map((part) => Part.fromJson(part)).toList(); + page = categoriesListJson.map((part) => Part.fromJson(part)).toList(); } - return _page; + return page; } catch (error) { return []; } diff --git a/lib/controllers/providers/api/regular_visits_provider.dart b/lib/controllers/providers/api/regular_visits_provider.dart index 42fb1dd9..25e330f7 100644 --- a/lib/controllers/providers/api/regular_visits_provider.dart +++ b/lib/controllers/providers/api/regular_visits_provider.dart @@ -79,6 +79,7 @@ class RegularVisitsProvider extends ChangeNotifier { List requestsListJson = json.decode(response.body)["data"]; List _visits = requestsListJson.map((request) => Visit.fromJson(request)).toList(); visits ??= []; + sortMostRecent(_visits); visits.addAll(_visits); if (_visits.length == pageItemNumber) { nextPage = true; @@ -98,6 +99,12 @@ class RegularVisitsProvider extends ChangeNotifier { return response.statusCode; } + void sortMostRecent(List visits) { + visits.sort((prev, next) => (visitsSearch.mostRecent ?? false) + ? DateTime.tryParse(next.createdOn).compareTo(DateTime.tryParse(prev.createdOn)) + : DateTime.tryParse(prev.createdOn).compareTo(DateTime.tryParse(next.createdOn))); + } + /// return -2 if request in progress /// return -1 if error happen when sending request /// return state code if request complete may be 200, 404 or 403 diff --git a/lib/controllers/providers/api/service_requests_provider.dart b/lib/controllers/providers/api/service_requests_provider.dart index 8b014f83..d255f7bc 100644 --- a/lib/controllers/providers/api/service_requests_provider.dart +++ b/lib/controllers/providers/api/service_requests_provider.dart @@ -76,6 +76,7 @@ class ServiceRequestsProvider extends ChangeNotifier { List requestsListJson = json.decode(response.body)["data"]; List serviceRequestsPage = requestsListJson.map((request) => ServiceRequest.fromJson(request)).toList(); serviceRequests ??= []; + sortMostRecent(serviceRequestsPage); serviceRequests.addAll(serviceRequestsPage); if (serviceRequestsPage.length == pageItemNumber) { nextPage = true; @@ -94,6 +95,12 @@ class ServiceRequestsProvider extends ChangeNotifier { } } + void sortMostRecent(List requests) { + requests.sort( + (prev, next) => (search.mostRecent ?? false) ? DateTime.tryParse(next.date).compareTo(DateTime.tryParse(prev.date)) : DateTime.tryParse(prev.date).compareTo(DateTime.tryParse(next.date)), + ); + } + Future getSingleServiceRequest({ @required String requestId, @required String host, diff --git a/lib/models/device/device.dart b/lib/models/device/device.dart index 58f6f488..1866c26c 100644 --- a/lib/models/device/device.dart +++ b/lib/models/device/device.dart @@ -35,7 +35,7 @@ class Device { this.modelDefinition, }); - factory Device.fromJson(Map parsedJson) { + factory Device.fromJson(Map parsedJson, {bool startKeyWithDest = true}) { print("parsedJson:$parsedJson"); return Device( id: parsedJson["id"], @@ -44,10 +44,10 @@ class Device { assetName: parsedJson["assetName"], modelDefinition: ModelDefinition.fromJson(parsedJson["modelDefinition"]), hospital: Hospital.fromJson(parsedJson["site"]), - destBuildingName: parsedJson["destBuildingName"], - destDepartmentName: parsedJson["destDepartmentName"], - destRoom: parsedJson["destRoom"], - destFloor: parsedJson["destFloor"], + destBuildingName: startKeyWithDest ? parsedJson["destBuildingName"] : parsedJson['building']['name'], + destDepartmentName: startKeyWithDest ? parsedJson["destDepartmentName"] : parsedJson['department']['departmentName'], + destRoom: startKeyWithDest ? parsedJson["destRoom"] : parsedJson['room'], + destFloor: startKeyWithDest ? parsedJson["destFloor"] : parsedJson['floor']['name'], destSiteName: parsedJson['destSiteName'] // parsedJson["modelDefinition"] == null ? "" : // parsedJson["modelDefinition"]["manufacturerName"], diff --git a/lib/models/device/device_transfer.dart b/lib/models/device/device_transfer.dart index 84ab75c2..50b3c593 100644 --- a/lib/models/device/device_transfer.dart +++ b/lib/models/device/device_transfer.dart @@ -14,6 +14,7 @@ class DeviceTransfer { Device device; DeviceTransferInfo sender; DeviceTransferInfo receiver; + String createdOn; DeviceTransfer({ this.id, @@ -22,6 +23,7 @@ class DeviceTransfer { this.userId, this.sender, this.receiver, + this.createdOn, }); bool validate() { @@ -40,6 +42,7 @@ class DeviceTransfer { final receiver = DeviceTransferInfo(); receiver.fromDetails(old.receiver); this.receiver = receiver; + createdOn = old.createdOn; } factory DeviceTransfer.fromJson(Map parsedJson) { @@ -47,6 +50,7 @@ class DeviceTransfer { id: parsedJson["id"], title: parsedJson["transferCode"], userId: parsedJson["uid"], + createdOn: parsedJson['createdOn'], device: Device( id: parsedJson["assetId"], number: parsedJson["assetNumber"], diff --git a/lib/models/gas_refill/gas_refill_model.dart b/lib/models/gas_refill/gas_refill_model.dart index 4643d6f9..aeed1b85 100644 --- a/lib/models/gas_refill/gas_refill_model.dart +++ b/lib/models/gas_refill/gas_refill_model.dart @@ -22,7 +22,7 @@ class GasRefillModel { String signatureEngineer; Uint8List localNurseSignature; Uint8List localEngineerSignature; - + num workingHours; DateTime startDate, endDate, expectedDate; GasRefillModel({ @@ -43,6 +43,7 @@ class GasRefillModel { this.signatureEngineer, this.localEngineerSignature, this.localNurseSignature, + this.workingHours, }); bool validate() { @@ -75,6 +76,7 @@ class GasRefillModel { localNurseSignature = model.localNurseSignature; signatureEngineer = model.signatureEngineer; signatureNurse = model.signatureNurse; + workingHours = model.workingHours; } factory GasRefillModel.fromJson(Map parsedJson) { @@ -99,6 +101,7 @@ class GasRefillModel { assignedEmployee: AssignedEmployee.fromJson(parsedJson['assignedEmployee'] ?? {}), signatureEngineer: URLs.getFileUrl(parsedJson["engSignature"]), signatureNurse: URLs.getFileUrl(parsedJson["nurseSignature"]), + workingHours: parsedJson["workingHours"], ); } } diff --git a/lib/models/service_report.dart b/lib/models/service_report.dart index 7176da74..275c8929 100644 --- a/lib/models/service_report.dart +++ b/lib/models/service_report.dart @@ -48,42 +48,41 @@ class ServiceReport { String reviewComment; FaultDescription faultDescription; - ServiceReport({ - this.id, - this.visitDate, - // this.endDate, - this.assetType, - this.equipmentStatus, - this.type, - this.faultDescriptionId, - this.workingHours, - this.travelingHours, - this.parts, - this.engineer, - this.workPreformed, - this.reason, - this.operatingHours, - this.callLastSituation, - this.currentSituation, - this.jobSheetNumber, - this.image, - this.device, - this.invoiceCode, - this.invoiceNumber, - this.quantity = "1", - this.timer, - this.signatureNurse, - this.signatureEngineer, - this.localNurseSignature, - this.localEngineerSignature, - this.comment, - this.repairLocation, - this.travelingExpense, - // this.startDate, - this.reviewComment, - this.faultDescription, - this.returnToService - }); + ServiceReport( + {this.id, + this.visitDate, + // this.endDate, + this.assetType, + this.equipmentStatus, + this.type, + this.faultDescriptionId, + this.workingHours, + this.travelingHours, + this.parts, + this.engineer, + this.workPreformed, + this.reason, + this.operatingHours, + this.callLastSituation, + this.currentSituation, + this.jobSheetNumber, + this.image, + this.device, + this.invoiceCode, + this.invoiceNumber, + this.quantity = "1", + this.timer, + this.signatureNurse, + this.signatureEngineer, + this.localNurseSignature, + this.localEngineerSignature, + this.comment, + this.repairLocation, + this.travelingExpense, + // this.startDate, + this.reviewComment, + this.faultDescription, + this.returnToService}); Map toMap(ServiceRequest request) { Map _map = {}; @@ -228,7 +227,7 @@ class ServiceReport { travelingHours: parsedJson["travelingHours"], travelingExpense: parsedJson["travelingExpenses"], visitDate: DateTime.tryParse(parsedJson["visitDate"]), - returnToService: DateTime.tryParse(parsedJson["replacementDate"]??""), + returnToService: DateTime.tryParse(parsedJson["replacementDate"] ?? ""), workingHours: parsedJson["workingHours"], timer: TimerModel( startAt: DateTime.tryParse(parsedJson["startofWorkTime"] ?? ""), diff --git a/lib/views/pages/device_transfer/device_transfer_details.dart b/lib/views/pages/device_transfer/device_transfer_details.dart index c22e6d32..c4ebb783 100644 --- a/lib/views/pages/device_transfer/device_transfer_details.dart +++ b/lib/views/pages/device_transfer/device_transfer_details.dart @@ -145,12 +145,12 @@ class _DeviceTransferDetailsState extends State { text: _subtitle.edit, onPressed: (_isSender || _isReceiver || false) ? () { - Navigator.of(context).push(MaterialPageRoute( - builder: (_) => UpdateDeviceTransfer( - model: _model, - isSender: true, - ))); - } + Navigator.of(context).push(MaterialPageRoute( + builder: (_) => UpdateDeviceTransfer( + model: _model, + isSender: true, + ))); + } : null, ), ], @@ -171,12 +171,12 @@ class _DeviceTransferDetailsState extends State { text: _subtitle.edit, onPressed: (_isReceiver || false) ? () { - Navigator.of(context).push(MaterialPageRoute( - builder: (_) => UpdateDeviceTransfer( - model: _model, - isSender: false, - ))); - } + Navigator.of(context).push(MaterialPageRoute( + builder: (_) => UpdateDeviceTransfer( + model: _model, + isSender: false, + ))); + } : null, ), ], diff --git a/lib/views/pages/device_transfer/request_device_transfer.dart b/lib/views/pages/device_transfer/request_device_transfer.dart index 0cf534c4..4de1be00 100644 --- a/lib/views/pages/device_transfer/request_device_transfer.dart +++ b/lib/views/pages/device_transfer/request_device_transfer.dart @@ -1,7 +1,5 @@ import 'package:flutter/material.dart'; -import 'package:fluttertoast/fluttertoast.dart'; import 'package:provider/provider.dart'; -import 'package:test_sa/controllers/api_routes/http_status_manger.dart'; import 'package:test_sa/controllers/providers/api/device_transfer_provider.dart'; import 'package:test_sa/controllers/providers/api/user_provider.dart'; import 'package:test_sa/controllers/providers/settings/setting_provider.dart'; @@ -12,14 +10,13 @@ import 'package:test_sa/models/device/device_transfer_info.dart'; import 'package:test_sa/models/subtitle.dart'; import 'package:test_sa/views/app_style/sizing.dart'; import 'package:test_sa/views/widgets/buttons/app_button.dart'; -import 'package:test_sa/views/widgets/departments/department_button.dart'; import 'package:test_sa/views/widgets/equipment/device_button.dart'; -import 'package:test_sa/views/widgets/hospitals/hospital_button.dart'; import 'package:test_sa/views/widgets/loaders/loading_manager.dart'; import 'package:test_sa/views/widgets/titles/app_sub_title.dart'; import '../../../../controllers/localization/localization.dart'; import '../../../controllers/validator/validator.dart'; +import '../../app_style/colors.dart'; import '../../widgets/app_text_form_field.dart'; import '../../widgets/gas_refill/building_type_menu.dart'; import '../../widgets/gas_refill/department_type_menu.dart'; @@ -141,7 +138,7 @@ class _RequestDeviceTransferState extends State { // }, // ), 12.height, - const ASubTitle("Device"), + const ASubTitle("Asset"), if (_validate && _formModel.device == null) ASubTitle( _subtitle.requiredWord, @@ -155,6 +152,45 @@ class _RequestDeviceTransferState extends State { setState(() {}); }, ), + if (_formModel.device != null) 8.height, + if (_formModel.device != null) const ASubTitle("Asset Site"), + if (_formModel.device != null) + Container( + width: double.infinity, + alignment: Alignment.center, + padding: const EdgeInsets.symmetric(horizontal: 8, vertical: 16), + decoration: BoxDecoration( + color: AColors.inputFieldBackgroundColor, + border: Border.all( + color: const Color(0xffefefef), + ), + borderRadius: BorderRadius.circular(AppStyle.borderRadius * AppStyle.getScaleFactor(context)), + // boxShadow: const [ + // AppStyle.boxShadow + // ] + ), + child: ASubTitle(_formModel.device?.hospital?.name), + ), + if (_formModel.device != null) 4.height, + if (_formModel.device != null && _formModel.device.destDepartmentName != null) const ASubTitle("Asset Department"), + if (_formModel.device != null && _formModel.device.destDepartmentName != null) + Container( + width: double.infinity, + alignment: Alignment.center, + padding: const EdgeInsets.symmetric(horizontal: 8, vertical: 16), + decoration: BoxDecoration( + color: AColors.inputFieldBackgroundColor, + border: Border.all( + color: const Color(0xffefefef), + ), + borderRadius: BorderRadius.circular(AppStyle.borderRadius * AppStyle.getScaleFactor(context)), + // boxShadow: const [ + // AppStyle.boxShadow + // ] + ), + child: ASubTitle(_formModel.device.destDepartmentName.toString()), + ), + if (_formModel.device != null) 8.height, // const SizedBox(height: 8,), // const ASubTitle("Sender Department"), // if(_validate && _formModel.senderDepartment == null) @@ -203,6 +239,8 @@ class _RequestDeviceTransferState extends State { Divider( color: Theme.of(context).colorScheme.primary, ), + const SizedBox(height: 8), + const ASubTitle("Destination"), const SizedBox( height: 4, ), @@ -251,8 +289,8 @@ class _RequestDeviceTransferState extends State { }, ), const SizedBox(height: 8), - ASubTitle("Room"), - SizedBox( + const ASubTitle("Room"), + const SizedBox( height: 4, ), ATextFormField( diff --git a/lib/views/pages/device_transfer/track_device_transfer.dart b/lib/views/pages/device_transfer/track_device_transfer.dart index aeaca51e..87e4aaa7 100644 --- a/lib/views/pages/device_transfer/track_device_transfer.dart +++ b/lib/views/pages/device_transfer/track_device_transfer.dart @@ -9,6 +9,7 @@ import 'package:test_sa/views/app_style/colors.dart'; import 'package:test_sa/views/widgets/buttons/app_back_button.dart'; import 'package:test_sa/views/widgets/device_trancfer/device_transfer_list.dart'; import 'package:test_sa/views/widgets/loaders/loading_manager.dart'; +import 'package:test_sa/views/widgets/switch_button.dart'; class TrackDeviceTransferPage extends StatefulWidget { static const String id = "/track-device-transfer"; @@ -23,7 +24,7 @@ class _TrackDeviceTransferPageState extends State with DeviceTransferProvider _deviceTransferProvider; UserProvider _userProvider; SettingProvider _settingProvider; - + bool mostRecent = false; @override Widget build(BuildContext context) { _deviceTransferProvider = Provider.of(context); @@ -72,6 +73,21 @@ class _TrackDeviceTransferPageState extends State with ], ), ), + Padding( + padding: const EdgeInsets.symmetric(horizontal: 16.0), + child: ASwitchButton( + title: "Most Recent", + value: mostRecent, + onChange: (value) async { + mostRecent = value; + await _deviceTransferProvider.getRequests( + user: _userProvider.user, + host: _settingProvider.host, + mostRecent: mostRecent, + ); + }, + ), + ), Expanded( child: DeviceTransferList( nextPage: _deviceTransferProvider.nextPage, diff --git a/lib/views/pages/device_transfer/update_device_transfer.dart b/lib/views/pages/device_transfer/update_device_transfer.dart index 9a870ad9..1de29ad0 100644 --- a/lib/views/pages/device_transfer/update_device_transfer.dart +++ b/lib/views/pages/device_transfer/update_device_transfer.dart @@ -72,7 +72,6 @@ class _UpdateDeviceTransferState extends State { ); _validate = false; Navigator.of(context).pop(); - Navigator.of(context).pop(); } } diff --git a/lib/views/pages/user/gas_refill/request_gas_refill.dart b/lib/views/pages/user/gas_refill/request_gas_refill.dart index 68c59acc..abcb5efe 100644 --- a/lib/views/pages/user/gas_refill/request_gas_refill.dart +++ b/lib/views/pages/user/gas_refill/request_gas_refill.dart @@ -89,16 +89,16 @@ class _RequestGasRefillState extends State { int status = widget.gasRefillModel == null ? await _gasRefillProvider.createModel( - user: _userProvider.user, - host: _settingProvider.host, - model: _formModel, - ) + user: _userProvider.user, + host: _settingProvider.host, + model: _formModel, + ) : await _gasRefillProvider.updateModel( - user: _userProvider.user, - host: _settingProvider.host, - oldModel: widget.gasRefillModel, - newModel: _formModel, - ); + user: _userProvider.user, + host: _settingProvider.host, + oldModel: widget.gasRefillModel, + newModel: _formModel, + ); _isLoading = false; setState(() {}); if (status >= 200 && status < 300) { diff --git a/lib/views/pages/user/gas_refill/track_gas_refill.dart b/lib/views/pages/user/gas_refill/track_gas_refill.dart index 6dd1ca6d..7a1d728b 100644 --- a/lib/views/pages/user/gas_refill/track_gas_refill.dart +++ b/lib/views/pages/user/gas_refill/track_gas_refill.dart @@ -10,6 +10,8 @@ import 'package:test_sa/views/widgets/buttons/app_back_button.dart'; import 'package:test_sa/views/widgets/gas_refill/gas_refill_list.dart'; import 'package:test_sa/views/widgets/loaders/loading_manager.dart'; +import '../../../widgets/switch_button.dart'; + class TrackGasRefillPage extends StatefulWidget { static const String id = "/track-gas-refill"; @@ -23,6 +25,7 @@ class _TrackGasRefillPageState extends State with TickerProv GasRefillProvider _gasRefillProvider; UserProvider _userProvider; SettingProvider _settingProvider; + bool mostRecent = false; @override Widget build(BuildContext context) { @@ -59,11 +62,11 @@ class _TrackGasRefillPageState extends State with TickerProv children: [ Row( children: [ - ABackButton(), + const ABackButton(), Expanded( child: Center( child: Text( - _subtitle.serviceRequests, + "Gas Refill Requests", style: Theme.of(context).textTheme.headline6.copyWith(color: AColors.grey3A, fontStyle: FontStyle.italic), ), ), @@ -76,6 +79,21 @@ class _TrackGasRefillPageState extends State with TickerProv ], ), ), + Padding( + padding: const EdgeInsets.symmetric(horizontal: 16.0), + child: ASwitchButton( + title: "Most Recent", + value: mostRecent, + onChange: (value) async { + mostRecent = value; + await _gasRefillProvider.getRequests( + user: _userProvider.user, + host: _settingProvider.host, + mostRecent: mostRecent, + ); + }, + ), + ), Expanded( child: GasRefillList( nextPage: _gasRefillProvider.nextPage, diff --git a/lib/views/pages/user/land_page.dart b/lib/views/pages/user/land_page.dart index 4b46f391..b0255d3c 100644 --- a/lib/views/pages/user/land_page.dart +++ b/lib/views/pages/user/land_page.dart @@ -23,7 +23,6 @@ import 'package:test_sa/views/app_style/colors.dart'; import 'package:test_sa/views/app_style/sizing.dart'; import 'package:test_sa/views/pages/device_transfer/request_device_transfer.dart'; import 'package:test_sa/views/pages/device_transfer/track_device_transfer.dart'; -import 'package:test_sa/views/pages/sub_workorder/search_sub_workorder_page.dart'; import 'package:test_sa/views/pages/user/gas_refill/request_gas_refill.dart'; import 'package:test_sa/views/pages/user/gas_refill/track_gas_refill.dart'; import 'package:test_sa/views/pages/user/requests/create_request.dart'; @@ -199,7 +198,7 @@ class _LandPageState extends State { }, ), LandPageItem( - text: "transfer Device", + text: "Transfer Asset", icon: FontAwesomeIcons.rightLeft, onPressed: () { Navigator.of(context).pushNamed(RequestDeviceTransfer.id); @@ -212,14 +211,14 @@ class _LandPageState extends State { Navigator.of(context).pushNamed(TrackDeviceTransferPage.id); }, ), - if (_userProvider?.user != null && _userProvider?.user?.type != UsersTypes.normal_user) - LandPageItem( - text: "Search Work Order", - svgPath: "assets/images/sub_workorder_icon.svg", - onPressed: () { - Navigator.of(context).pushNamed(SearchSubWorkOrderPage.id); - }, - ), + // if (_userProvider?.user != null && _userProvider?.user?.type != UsersTypes.normal_user) + // LandPageItem( + // text: "Search Work Order", + // svgPath: "assets/images/sub_workorder_icon.svg", + // onPressed: () { + // Navigator.of(context).pushNamed(SearchSubWorkOrderPage.id); + // }, + // ), ], ), ], diff --git a/lib/views/pages/user/requests/create_request.dart b/lib/views/pages/user/requests/create_request.dart index 121d24d2..48344fbe 100644 --- a/lib/views/pages/user/requests/create_request.dart +++ b/lib/views/pages/user/requests/create_request.dart @@ -31,6 +31,8 @@ import 'package:test_sa/views/widgets/status/service_request/service_request_thr import 'package:test_sa/views/widgets/status/service_request/service_request_types_mune.dart'; import 'package:test_sa/views/widgets/titles/app_sub_title.dart'; +import '../../../../controllers/providers/api/status_drop_down/service_reqest/service_request_through_provider.dart'; +import '../../../../controllers/providers/api/status_drop_down/service_reqest/service_request_type_provider.dart'; import '../../../widgets/date_and_time/date_picker.dart'; import '../../../widgets/status/service_request/service_request_first_action.dart'; import '../../../widgets/status/service_request/service_request_loan_availability.dart'; @@ -205,10 +207,7 @@ class CreateRequestPageState extends State { ), ServiceRequestedThroughMenu( initialValue: _serviceRequest.requestedThrough, - onSelect: (status) { - _serviceRequest.requestedThrough = status; - }, - enabled: widget.serviceRequest == null ? true : false, + enabled: false, ), if (widget.serviceRequest != null) 12.height, if (widget.serviceRequest != null) const ASubTitle("First Action"), @@ -330,6 +329,10 @@ class CreateRequestPageState extends State { } _formKey.currentState.save(); _serviceRequest.deviceId = _device?.id; + if (widget.serviceRequest == null) { + _serviceRequest.type = Provider.of(context, listen: false).getDefaultItem(); + } + _serviceRequest.requestedThrough = Provider.of(context, listen: false).getDefaultItem(); _isLoading = true; setState(() {}); _serviceRequest.devicePhotos = _deviceImages.map((e) => "${e.path.split("/").last}|${base64Encode(e.readAsBytesSync())}").toList(); diff --git a/lib/views/pages/user/requests/report/edit_service_report.dart b/lib/views/pages/user/requests/report/edit_service_report.dart index b98abae7..f10c6548 100644 --- a/lib/views/pages/user/requests/report/edit_service_report.dart +++ b/lib/views/pages/user/requests/report/edit_service_report.dart @@ -26,7 +26,6 @@ import 'package:test_sa/views/widgets/buttons/app_button.dart'; import 'package:test_sa/views/widgets/date_and_time/date_picker.dart'; import 'package:test_sa/views/widgets/e_signature/e_signature.dart'; import 'package:test_sa/views/widgets/equipment/auto_complete_devices_field.dart'; -import 'package:test_sa/views/widgets/images/mini_one_image_picker.dart'; import 'package:test_sa/views/widgets/loaders/loading_manager.dart'; import 'package:test_sa/views/widgets/parts/auto_complete_parts_field.dart'; import 'package:test_sa/views/widgets/parts/part_item.dart'; @@ -722,7 +721,7 @@ class _EditServiceReportState extends State with TickerProvid }, ), const SizedBox(height: 8), - ASubTitle("Solutions"), + ASubTitle(_subtitle.workPreformed), const SizedBox(height: 4), ATextFormField( initialValue: _serviceReport?.workPreformed, diff --git a/lib/views/widgets/equipment/device_button.dart b/lib/views/widgets/equipment/device_button.dart index 824547d2..8a8b78c0 100644 --- a/lib/views/widgets/equipment/device_button.dart +++ b/lib/views/widgets/equipment/device_button.dart @@ -56,6 +56,20 @@ class DeviceButton extends StatelessWidget { subtitle: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ + Divider( + color: Theme.of(context).textTheme.subtitle1.color, + ), + Text( + "${_subtitle.assetNumber} : ${device.number}", + style: Theme.of(context).textTheme.subtitle2, + ), + Divider( + color: Theme.of(context).textTheme.subtitle1.color, + ), + Text( + "${_subtitle.assetName} : ${device.modelDefinition.assetName}", + style: Theme.of(context).textTheme.subtitle2, + ), Divider( color: Theme.of(context).textTheme.subtitle1.color, ), diff --git a/lib/views/widgets/equipment/single_device_picker.dart b/lib/views/widgets/equipment/single_device_picker.dart index 2097ac7b..d8627652 100644 --- a/lib/views/widgets/equipment/single_device_picker.dart +++ b/lib/views/widgets/equipment/single_device_picker.dart @@ -1,5 +1,4 @@ import 'package:flutter/material.dart'; -import 'package:fluttertoast/fluttertoast.dart'; import 'package:provider/provider.dart'; import 'package:test_sa/controllers/localization/localization.dart'; import 'package:test_sa/controllers/providers/api/devices_provider.dart'; diff --git a/lib/views/widgets/gas_refill/building_type_menu.dart b/lib/views/widgets/gas_refill/building_type_menu.dart index 2043f157..afccd900 100644 --- a/lib/views/widgets/gas_refill/building_type_menu.dart +++ b/lib/views/widgets/gas_refill/building_type_menu.dart @@ -80,7 +80,7 @@ class _BuildingTypeMenuState extends State { return DropdownMenuItem( value: value, child: Text( - value.name, + value.name ?? "", style: Theme.of(context).textTheme.subtitle1.copyWith( color: Theme.of(context).primaryColor, fontSize: 11, diff --git a/lib/views/widgets/gas_refill/floor_type_menu.dart b/lib/views/widgets/gas_refill/floor_type_menu.dart index e8fe78f7..df5d3325 100644 --- a/lib/views/widgets/gas_refill/floor_type_menu.dart +++ b/lib/views/widgets/gas_refill/floor_type_menu.dart @@ -80,7 +80,7 @@ class _FloorTypeMenuState extends State { return DropdownMenuItem( value: value, child: Text( - value.name, + value.name ?? "", style: Theme.of(context).textTheme.subtitle1.copyWith( color: Theme.of(context).primaryColor, fontSize: 11, diff --git a/lib/views/widgets/gas_refill/gas_refill_item.dart b/lib/views/widgets/gas_refill/gas_refill_item.dart index d4e3be5f..724341f1 100644 --- a/lib/views/widgets/gas_refill/gas_refill_item.dart +++ b/lib/views/widgets/gas_refill/gas_refill_item.dart @@ -1,11 +1,7 @@ -import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; -import 'package:provider/provider.dart'; import 'package:test_sa/controllers/localization/localization.dart'; -import 'package:test_sa/controllers/providers/api/user_provider.dart'; import 'package:test_sa/models/gas_refill/gas_refill_model.dart'; import 'package:test_sa/models/subtitle.dart'; -import 'package:test_sa/models/user.dart'; import 'package:test_sa/views/app_style/colors.dart'; import 'package:test_sa/views/app_style/sizing.dart'; import 'package:test_sa/views/widgets/requests/request_status.dart'; @@ -19,8 +15,7 @@ class GasRefillItem extends StatelessWidget { @override Widget build(BuildContext context) { - Subtitle _subtitle = AppLocalization.of(context).subtitle; - User _user = Provider.of(context, listen: false).user; + Subtitle subtitle = AppLocalization.of(context).subtitle; Color itemColor = index % 2 == 0 ? Theme.of(context).colorScheme.primary : Theme.of(context).colorScheme.onPrimary; Color onItemColor = index % 2 != 0 ? Theme.of(context).colorScheme.primary : Theme.of(context).colorScheme.onPrimary; @@ -28,7 +23,7 @@ class GasRefillItem extends StatelessWidget { padding: const EdgeInsets.symmetric(vertical: 4), child: ElevatedButton( style: ElevatedButton.styleFrom( - padding: EdgeInsets.symmetric(vertical: 8, horizontal: 8), + padding: const EdgeInsets.symmetric(vertical: 8, horizontal: 8), backgroundColor: itemColor, shape: RoundedRectangleBorder( borderRadius: BorderRadius.circular(AppStyle.getBorderRadius(context)), @@ -49,14 +44,14 @@ class GasRefillItem extends StatelessWidget { children: [ Text( item.title ?? "-----", - style: Theme.of(context).textTheme.headline6.copyWith(color: onItemColor, fontSize: 16, fontWeight: FontWeight.bold), + style: Theme.of(context).textTheme.titleLarge.copyWith(color: onItemColor, fontSize: 16, fontWeight: FontWeight.bold), ), Row( children: [ Expanded( child: Text( - _subtitle.hospital, - style: Theme.of(context).textTheme.subtitle2.copyWith( + subtitle.hospital, + style: Theme.of(context).textTheme.titleSmall.copyWith( color: onItemColor, ), ), @@ -64,29 +59,48 @@ class GasRefillItem extends StatelessWidget { if (item.clientName != null) Text( item.clientName, - style: Theme.of(context).textTheme.subtitle2.copyWith( + style: Theme.of(context).textTheme.titleSmall.copyWith( color: onItemColor, ), ), ], ), - Divider( - color: onItemColor, - ), + Divider(color: onItemColor), Row( children: [ Expanded( - child: Text( - _subtitle.status, - style: Theme.of(context).textTheme.subtitle2.copyWith( - color: onItemColor, - ), - ), + child: Text(subtitle.status, style: Theme.of(context).textTheme.titleSmall.copyWith(color: onItemColor)), ), if (item.status?.id != null) StatusLabel(label: item.status.name, color: AColors.getGasStatusColor(item.status.id)), ], ), - //Divider(color: onItemColor,), + if (item?.expectedDate != null) Divider(color: onItemColor), + if (item?.expectedDate != null) + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Text("Visit Date", style: Theme.of(context).textTheme.titleSmall.copyWith(color: onItemColor)), + Text(item.expectedDate.toIso8601String().split("T").first, style: Theme.of(context).textTheme.titleSmall.copyWith(color: onItemColor)), + ], + ), + if (item?.details?.isNotEmpty ?? false) Divider(color: onItemColor), + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + if (item?.details?.isNotEmpty ?? false) Text("Gas Type", style: Theme.of(context).textTheme.titleSmall.copyWith(color: onItemColor)), + Column( + crossAxisAlignment: CrossAxisAlignment.end, + children: item.details + .map( + (gas) => gas?.type?.name?.isNotEmpty ?? false + ? Text(gas?.type?.name, style: Theme.of(context).textTheme.titleSmall.copyWith(color: onItemColor)) + : const SizedBox.shrink(), + ) + .toList(), + ) + ], + ), ], ), ), diff --git a/lib/views/widgets/hospitals/hospital_auto_complete_field_new.dart b/lib/views/widgets/hospitals/hospital_auto_complete_field_new.dart index 1bc29fd6..6ca612a4 100644 --- a/lib/views/widgets/hospitals/hospital_auto_complete_field_new.dart +++ b/lib/views/widgets/hospitals/hospital_auto_complete_field_new.dart @@ -8,10 +8,12 @@ import 'package:test_sa/models/hospital.dart'; import 'package:test_sa/models/subtitle.dart'; import 'package:test_sa/views/app_style/colors.dart'; import 'package:test_sa/views/app_style/sizing.dart'; +import 'package:test_sa/views/widgets/loaders/app_loading.dart'; class HospitalAutoCompleteField extends StatefulWidget { final String initialValue; final Function(Hospital) onSearch; + final bool enabled; //final Function(Hospital) onSave; @@ -19,6 +21,7 @@ class HospitalAutoCompleteField extends StatefulWidget { Key key, this.onSearch, this.initialValue, + this.enabled = true, }) : super(key: key); @override @@ -66,32 +69,41 @@ class _HospitalAutoCompleteFieldState extends State { // AppStyle.boxShadow // ] ), - child: TypeAheadField( - textFieldConfiguration: TextFieldConfiguration( - style: Theme.of(context).textTheme.headline6, - controller: _controller, - textAlign: TextAlign.center, - decoration: InputDecoration( - hintText: _subtitle.hospital, - border: InputBorder.none, - disabledBorder: InputBorder.none, - focusedBorder: InputBorder.none, - enabledBorder: InputBorder.none, - ), - textInputAction: TextInputAction.search, - ), - suggestionsCallback: (vale) async { - return await HospitalsProvider().getHospitalsListByVal(searchVal: _controller.text); - }, - itemBuilder: (context, hospital) { - return ListTile( - title: Text(hospital.name), - ); - }, - onSuggestionSelected: (hospital) { - widget.onSearch(hospital); - }, - ), + child: widget.enabled + ? TypeAheadField( + textFieldConfiguration: TextFieldConfiguration( + style: Theme.of(context).textTheme.headline6, + controller: _controller, + textAlign: TextAlign.center, + decoration: InputDecoration( + hintText: _subtitle.hospital, + border: InputBorder.none, + disabledBorder: InputBorder.none, + focusedBorder: InputBorder.none, + enabledBorder: InputBorder.none, + ), + textInputAction: TextInputAction.search, + ), + suggestionsCallback: (vale) async { + return await HospitalsProvider().getHospitalsListByVal(searchVal: _controller.text); + }, + itemBuilder: (context, hospital) { + return ListTile( + title: Text(hospital.name), + ); + }, + onSuggestionSelected: (hospital) { + widget.onSearch(hospital); + }, + ) + : widget.initialValue == null + ? const Padding( + padding: EdgeInsets.all(8.0), + child: ALoading(), + ) + : ListTile( + title: Center(child: Text(widget.initialValue)), + ), ); } } diff --git a/lib/views/widgets/search/service_request_search_bar.dart b/lib/views/widgets/search/service_request_search_bar.dart index 98e30e30..adabc6d8 100644 --- a/lib/views/widgets/search/service_request_search_bar.dart +++ b/lib/views/widgets/search/service_request_search_bar.dart @@ -306,21 +306,22 @@ class _ServiceRequestsSearchDialogState extends State { // await Permission.camera PermissionStatus status = await Permission.microphone.request(); if (!status.isGranted) { + PermissionStatus status = await Permission.microphone.request(); + Fluttertoast.showToast(msg: "Permission Denied"); return; } _rive.addController(SimpleAnimation('recording')); @@ -115,11 +118,11 @@ class _RecordSoundState extends State { @override Widget build(BuildContext context) { return Container( - padding: EdgeInsets.only(left: 12, right: 0), + padding: const EdgeInsets.only(left: 12, right: 0), decoration: BoxDecoration( - color: Color(0xfff5f5f5), + color: const Color(0xfff5f5f5), border: Border.all( - color: Color(0xffefefef), + color: const Color(0xffefefef), ), borderRadius: BorderRadius.circular(AppStyle.borderRadius * AppStyle.getScaleFactor(context)), ), diff --git a/lib/views/widgets/speech_to_text/speech_to_text.dart b/lib/views/widgets/speech_to_text/speech_to_text.dart index de1b3888..7d9e1d55 100644 --- a/lib/views/widgets/speech_to_text/speech_to_text.dart +++ b/lib/views/widgets/speech_to_text/speech_to_text.dart @@ -5,9 +5,9 @@ import 'package:speech_to_text/speech_recognition_error.dart'; import 'package:speech_to_text/speech_recognition_result.dart'; import 'package:speech_to_text/speech_to_text.dart'; import 'package:test_sa/controllers/providers/settings/setting_provider.dart'; +import 'package:test_sa/views/app_style/sizing.dart'; import 'package:test_sa/views/widgets/buttons/app_icon_button2.dart'; import 'package:test_sa/views/widgets/titles/app_sub_title.dart'; -import 'package:test_sa/views/app_style/sizing.dart'; class SpeechToTextButton extends StatefulWidget { final TextEditingController controller; @@ -23,7 +23,7 @@ class SpeechToTextButton extends StatefulWidget { class _SpeechToTextButtonState extends State { bool _speechEnabled = false; SettingProvider _settingProvider; - SpeechToText _speechToText = SpeechToText(); + final SpeechToText _speechToText = SpeechToText(); /// This has to happen only once per app void _initSpeech() async { @@ -64,12 +64,15 @@ class _SpeechToTextButtonState extends State { @override void initState() { _initSpeech(); + widget.controller.addListener(() { + setState(() {}); + }); super.initState(); } @override void setState(VoidCallback fn) { - if (!this.mounted) return; + if (!mounted) return; super.setState(fn); } @@ -77,17 +80,17 @@ class _SpeechToTextButtonState extends State { Widget build(BuildContext context) { _settingProvider = Provider.of(context); return Container( - padding: EdgeInsets.only(left: 12, right: 12), + padding: const EdgeInsets.only(left: 12, right: 12), decoration: BoxDecoration( - color: Color(0xfff5f5f5), + color: const Color(0xfff5f5f5), border: Border.all( - color: Color(0xffefefef), + color: const Color(0xffefefef), ), borderRadius: BorderRadius.circular(AppStyle.borderRadius * AppStyle.getScaleFactor(context)), ), child: Row( children: [ - widget.mini ? SizedBox.shrink() : ASubTitle("Text To Speech"), + widget.mini ? const SizedBox.shrink() : const ASubTitle("Speech To Text"), widget.controller.text.isNotEmpty && widget.enabled ? AIconButton2( iconData: Icons.delete, @@ -96,8 +99,8 @@ class _SpeechToTextButtonState extends State { setState(() {}); }, ) - : SizedBox.shrink(), - Spacer(), + : const SizedBox.shrink(), + const Spacer(), TextButton( onPressed: widget.enabled ? () { @@ -113,7 +116,7 @@ class _SpeechToTextButtonState extends State { child: Text(_settingProvider.speechToText)), GestureDetector( child: _speechToText.isListening - ? Icon( + ? const Icon( Icons.fiber_manual_record, color: Colors.red, ) @@ -127,7 +130,11 @@ class _SpeechToTextButtonState extends State { Fluttertoast.showToast(msg: "microphone not available"); return; } - _startListening(); + if (_speechToText.isListening) { + _stopListening(); + } else { + _startListening(); + } } : null, ), diff --git a/lib/views/widgets/status/service_request/service_request_priority_mune.dart b/lib/views/widgets/status/service_request/service_request_priority_mune.dart index 62ca7d5e..7cd90242 100644 --- a/lib/views/widgets/status/service_request/service_request_priority_mune.dart +++ b/lib/views/widgets/status/service_request/service_request_priority_mune.dart @@ -12,7 +12,6 @@ class ServiceRequestPriorityMenu extends StatelessWidget { final Lookup initialValue; final bool enabled; - const ServiceRequestPriorityMenu({Key key, this.onSelect, this.initialValue, this.enabled}) : super(key: key); @override Widget build(BuildContext context) { diff --git a/lib/views/widgets/status/service_request/service_request_through_mune.dart b/lib/views/widgets/status/service_request/service_request_through_mune.dart index fae0f68a..1a735dc8 100644 --- a/lib/views/widgets/status/service_request/service_request_through_mune.dart +++ b/lib/views/widgets/status/service_request/service_request_through_mune.dart @@ -13,7 +13,6 @@ class ServiceRequestedThroughMenu extends StatelessWidget { final bool enabled; const ServiceRequestedThroughMenu({Key key, this.onSelect, this.initialValue, this.enabled = true}) : super(key: key); - @override Widget build(BuildContext context) { final settingProvider = Provider.of(context); @@ -28,7 +27,7 @@ class ServiceRequestedThroughMenu extends StatelessWidget { await menuProvider.getData(user: userProvider.user, host: settingProvider.host); }, child: SingleStatusMenu( - initialStatus: initialValue, + initialStatus: enabled ? initialValue : menuProvider.getDefaultItem(), statuses: menuProvider.items, onSelect: onSelect, enabled: enabled, diff --git a/lib/views/widgets/switch_button.dart b/lib/views/widgets/switch_button.dart new file mode 100644 index 00000000..ccab66a4 --- /dev/null +++ b/lib/views/widgets/switch_button.dart @@ -0,0 +1,44 @@ +import 'package:flutter/material.dart'; +import 'package:test_sa/views/widgets/titles/app_sub_title.dart'; + +import '../app_style/colors.dart'; +import '../app_style/sizing.dart'; + +class ASwitchButton extends StatelessWidget { + final String title; + final bool value; + final void Function(bool) onChange; + + const ASwitchButton({ + @required this.title, + @required this.value, + @required this.onChange, + Key key, + }) : super(key: key); + + @override + Widget build(BuildContext context) { + return Container( + padding: const EdgeInsets.symmetric(horizontal: 16), + margin: const EdgeInsets.symmetric(vertical: 8), + decoration: BoxDecoration( + color: AColors.inputFieldBackgroundColor, + border: Border.all( + color: const Color(0xffefefef), + ), + borderRadius: BorderRadius.circular(AppStyle.borderRadius * AppStyle.getScaleFactor(context)), + ), + child: Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + ASubTitle(title), + Switch.adaptive( + value: value, + activeColor: AColors.primaryColor, + onChanged: onChange, + ), + ], + ), + ); + } +} From 66100c36a4a1cb2b52e767eadd57ac860fd2ff4a Mon Sep 17 00:00:00 2001 From: zaid_daoud Date: Wed, 9 Aug 2023 16:22:25 +0300 Subject: [PATCH 162/181] Enhancements --- lib/controllers/api_routes/urls.dart | 1 + .../call_request_for_work_order_model.dart | 4 +- lib/models/service_report.dart | 5 - .../requests/report/edit_service_report.dart | 138 +++++++++--------- .../report/future_service_report.dart | 14 +- .../widgets/gas_refill/gas_refill_item.dart | 2 +- 6 files changed, 81 insertions(+), 83 deletions(-) diff --git a/lib/controllers/api_routes/urls.dart b/lib/controllers/api_routes/urls.dart index ff44c03e..b672ee62 100644 --- a/lib/controllers/api_routes/urls.dart +++ b/lib/controllers/api_routes/urls.dart @@ -12,6 +12,7 @@ class URLs { set host(String value) => _host = value; + // static String getFileUrl(String file) => (file == null || file.isEmpty) ? null : (file.contains("/") ? file : "$_host/Files/DownloadFile?fileName=$file"); static String getFileUrl(String file) => (file == null || file.isEmpty) ? null : (file.contains("/") ? file : "$_host/attachment/$file"); // API Routes diff --git a/lib/models/call_request_for_work_order_model.dart b/lib/models/call_request_for_work_order_model.dart index 188edce4..a6c2d5a5 100644 --- a/lib/models/call_request_for_work_order_model.dart +++ b/lib/models/call_request_for_work_order_model.dart @@ -457,12 +457,12 @@ class AssignedEmployee { class CallSiteContactPerson { int id; - Null employeeCode; + String employeeCode; String name; String telephone; String job; String email; - Null land; + String land; String contactUserId; CallSiteContactPerson({this.id, this.employeeCode, this.name, this.telephone, this.job, this.email, this.land, this.contactUserId}); diff --git a/lib/models/service_report.dart b/lib/models/service_report.dart index 275c8929..bf2f53d4 100644 --- a/lib/models/service_report.dart +++ b/lib/models/service_report.dart @@ -155,11 +155,6 @@ class ServiceReport { } Future validate() async { - print("visitDate:$visitDate"); - print("equipmentStatus:${equipmentStatus?.toMap()}"); - print("callLastSituation:${callLastSituation?.toMap()}"); - print("parts:$parts"); - print("reason:${reason?.toMap()}"); if (visitDate == null) { await Fluttertoast.showToast(msg: "Visit Date Required"); return false; diff --git a/lib/views/pages/user/requests/report/edit_service_report.dart b/lib/views/pages/user/requests/report/edit_service_report.dart index f10c6548..07619f16 100644 --- a/lib/views/pages/user/requests/report/edit_service_report.dart +++ b/lib/views/pages/user/requests/report/edit_service_report.dart @@ -185,8 +185,8 @@ class _EditServiceReportState extends State with TickerProvid width: double.infinity, padding: const EdgeInsets.all(16), margin: const EdgeInsets.symmetric(vertical: 16), - decoration: BoxDecoration(color: AColors.grey, borderRadius: BorderRadius.circular(AppStyle.getBorderRadius(context)), boxShadow: [ - const BoxShadow( + decoration: BoxDecoration(color: AColors.grey, borderRadius: BorderRadius.circular(AppStyle.getBorderRadius(context)), boxShadow: const [ + BoxShadow( color: AColors.grey, offset: Offset(0, -1), ) @@ -195,70 +195,70 @@ class _EditServiceReportState extends State with TickerProvid crossAxisAlignment: CrossAxisAlignment.start, children: [ // Report type and Reasons - Row( - children: [ - // Report Status - // Expanded( - // child: Column( - // crossAxisAlignment: CrossAxisAlignment.start, - // children: [ - // ASubTitle(_subtitle.reportType), - // _validate && _serviceReport.type == null - // ? ASubTitle( - // _subtitle.requiredWord, - // color: Colors.red, - // ) - // : const SizedBox.shrink(), - // const SizedBox( - // height: 4, - // ), - // ServiceReportTypeMenu( - // initialValue: _serviceReport.type, - // onSelect: (status) { - // _serviceReport.type = status; - // }, - // ), - // ], - // ), - // ), - // const SizedBox( - // width: 8, - // ), - // visit date - Expanded( - child: Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - ASubTitle(_subtitle.visitDate), - _validate && _serviceReport.visitDate == null - ? ASubTitle( - _subtitle.requiredWord, - color: Colors.red, - ) - : const SizedBox.shrink(), - Row( - children: [ - Expanded( - child: ADatePicker( - date: _serviceReport.visitDate, - from: DateTime.now().subtract(const Duration(days: 365)), - to: DateTime.now().add(const Duration(days: 365)), - onDatePicker: (date) { - _serviceReport.visitDate = date; - setState(() {}); - }, - ), - ), - ], - ), - ], - ), - ), - ], - ), - const SizedBox( - height: 8, - ), + // Row( + // children: [ + // // Report Status + // // Expanded( + // // child: Column( + // // crossAxisAlignment: CrossAxisAlignment.start, + // // children: [ + // // ASubTitle(_subtitle.reportType), + // // _validate && _serviceReport.type == null + // // ? ASubTitle( + // // _subtitle.requiredWord, + // // color: Colors.red, + // // ) + // // : const SizedBox.shrink(), + // // const SizedBox( + // // height: 4, + // // ), + // // ServiceReportTypeMenu( + // // initialValue: _serviceReport.type, + // // onSelect: (status) { + // // _serviceReport.type = status; + // // }, + // // ), + // // ], + // // ), + // // ), + // // const SizedBox( + // // width: 8, + // // ), + // // visit date + // Expanded( + // child: Column( + // crossAxisAlignment: CrossAxisAlignment.start, + // children: [ + // ASubTitle(_subtitle.visitDate), + // _validate && _serviceReport.visitDate == null + // ? ASubTitle( + // _subtitle.requiredWord, + // color: Colors.red, + // ) + // : const SizedBox.shrink(), + // Row( + // children: [ + // Expanded( + // child: ADatePicker( + // date: _serviceReport.visitDate, + // from: DateTime.now().subtract(const Duration(days: 365)), + // to: DateTime.now().add(const Duration(days: 365)), + // onDatePicker: (date) { + // _serviceReport.visitDate = date; + // setState(() {}); + // }, + // ), + // ), + // ], + // ), + // ], + // ), + // ), + // ], + // ), + // const SizedBox( + // height: 8, + // ), // device sn Visibility( visible: widget.request.deviceSerialNumber == null, @@ -400,7 +400,7 @@ class _EditServiceReportState extends State with TickerProvid const SizedBox( height: 8, ), - ASubTitle("Return to Service"), + const ASubTitle("Return to Service"), Row( children: [ Expanded( @@ -721,7 +721,7 @@ class _EditServiceReportState extends State with TickerProvid }, ), const SizedBox(height: 8), - ASubTitle(_subtitle.workPreformed), + const ASubTitle("Solutions"), const SizedBox(height: 4), ATextFormField( initialValue: _serviceReport?.workPreformed, @@ -930,7 +930,7 @@ class _EditServiceReportState extends State with TickerProvid //const SizedBox(height: 8,), const SizedBox(height: 8), - ASubTitle("technical comment"), + const ASubTitle("Technical comment"), const SizedBox(height: 4), ATextFormField( initialValue: _serviceReport?.comment, diff --git a/lib/views/pages/user/requests/report/future_service_report.dart b/lib/views/pages/user/requests/report/future_service_report.dart index ceb23207..258a857b 100644 --- a/lib/views/pages/user/requests/report/future_service_report.dart +++ b/lib/views/pages/user/requests/report/future_service_report.dart @@ -31,26 +31,28 @@ class _FutureServiceReportState extends State { Widget build(BuildContext context) { _userProvider = Provider.of(context); _settingProvider = Provider.of(context); - Subtitle _subtitle = AppLocalization.of(context).subtitle; - ServiceRequestsProvider().getSingleServiceReport(reportId: widget.workOrder.id, user: _userProvider.user, host: _settingProvider.host, subtitle: _subtitle); + Subtitle subtitle = AppLocalization.of(context).subtitle; + ServiceRequestsProvider().getSingleServiceReport(reportId: widget.workOrder.id, user: _userProvider.user, host: _settingProvider.host, subtitle: subtitle); return Scaffold( body: FutureBuilder( - future: ServiceRequestsProvider().getSingleServiceReport(reportId: widget.workOrder.id, user: _userProvider.user, host: _settingProvider.host, subtitle: _subtitle), + future: ServiceRequestsProvider().getSingleServiceReport(reportId: widget.workOrder.id, user: _userProvider.user, host: _settingProvider.host, subtitle: subtitle), builder: (BuildContext context, AsyncSnapshot snapshot) { - if (snapshot.hasError) + if (snapshot.hasError) { return FailedLoading( message: snapshot.error.toString(), onReload: () { setState(() {}); }, ); - if (snapshot.hasData) { + } + if (snapshot.connectionState == ConnectionState.done) { + print("object"); return EditServiceReport( report: snapshot.data, request: widget.request, ); } - return Center(child: ALoading()); + return const Center(child: ALoading()); }, ), ); diff --git a/lib/views/widgets/gas_refill/gas_refill_item.dart b/lib/views/widgets/gas_refill/gas_refill_item.dart index 724341f1..17b2f38a 100644 --- a/lib/views/widgets/gas_refill/gas_refill_item.dart +++ b/lib/views/widgets/gas_refill/gas_refill_item.dart @@ -79,7 +79,7 @@ class GasRefillItem extends StatelessWidget { Row( mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ - Text("Visit Date", style: Theme.of(context).textTheme.titleSmall.copyWith(color: onItemColor)), + Text("Expected Date", style: Theme.of(context).textTheme.titleSmall.copyWith(color: onItemColor)), Text(item.expectedDate.toIso8601String().split("T").first, style: Theme.of(context).textTheme.titleSmall.copyWith(color: onItemColor)), ], ), From 99c16197f27dc88181e56e7c9eb023ba6d47170b Mon Sep 17 00:00:00 2001 From: zaid_daoud Date: Thu, 10 Aug 2023 09:07:00 +0300 Subject: [PATCH 163/181] Service Request Type for end user profile should be by default Maintenance Request and locked field. --- lib/views/pages/user/requests/create_request.dart | 3 ++- .../status/service_request/service_request_types_mune.dart | 5 +++-- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/lib/views/pages/user/requests/create_request.dart b/lib/views/pages/user/requests/create_request.dart index 48344fbe..d139c9c4 100644 --- a/lib/views/pages/user/requests/create_request.dart +++ b/lib/views/pages/user/requests/create_request.dart @@ -196,7 +196,8 @@ class CreateRequestPageState extends State { onSelect: (status) { _serviceRequest.type = status; }, - enabled: widget.serviceRequest == null ? true : false, + enabled: false, + withDefaultItem: widget.serviceRequest == null, ), const SizedBox( height: 8, diff --git a/lib/views/widgets/status/service_request/service_request_types_mune.dart b/lib/views/widgets/status/service_request/service_request_types_mune.dart index 7d561aca..7f9e5428 100644 --- a/lib/views/widgets/status/service_request/service_request_types_mune.dart +++ b/lib/views/widgets/status/service_request/service_request_types_mune.dart @@ -11,8 +11,9 @@ class ServiceRequestTypesMenu extends StatelessWidget { final Function(Lookup) onSelect; final Lookup initialValue; final bool enabled; + final bool withDefaultItem; - const ServiceRequestTypesMenu({Key key, this.onSelect, this.initialValue, this.enabled = true}) : super(key: key); + const ServiceRequestTypesMenu({Key key, this.onSelect, this.initialValue, this.withDefaultItem = false, this.enabled = true}) : super(key: key); @override Widget build(BuildContext context) { final settingProvider = Provider.of(context); @@ -27,7 +28,7 @@ class ServiceRequestTypesMenu extends StatelessWidget { await menuProvider.getData(user: userProvider.user, host: settingProvider.host); }, child: SingleStatusMenu( - initialStatus: enabled ? initialValue : menuProvider.getDefaultItem(), + initialStatus: enabled || !withDefaultItem ? initialValue : menuProvider.getDefaultItem(), statuses: menuProvider.items, enabled: enabled, onSelect: onSelect, From c14aaceb5e156aef7ff136b8a25c598e33210971 Mon Sep 17 00:00:00 2001 From: Sikander Saleem Date: Thu, 10 Aug 2023 09:25:10 +0300 Subject: [PATCH 164/181] rename device with asset --- lib/views/pages/device_transfer/request_device_transfer.dart | 2 +- lib/views/pages/device_transfer/track_device_transfer.dart | 2 +- lib/views/pages/user/land_page.dart | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/lib/views/pages/device_transfer/request_device_transfer.dart b/lib/views/pages/device_transfer/request_device_transfer.dart index 4de1be00..0c0d8903 100644 --- a/lib/views/pages/device_transfer/request_device_transfer.dart +++ b/lib/views/pages/device_transfer/request_device_transfer.dart @@ -118,7 +118,7 @@ class _RequestDeviceTransferState extends State { child: Padding( padding: const EdgeInsets.all(8.0), child: Text( - "Transfer Device", + "Transfer Asset", style: Theme.of(context).textTheme.headline5.copyWith(color: Theme.of(context).primaryColor, fontSize: 28, fontWeight: FontWeight.bold), ), ), diff --git a/lib/views/pages/device_transfer/track_device_transfer.dart b/lib/views/pages/device_transfer/track_device_transfer.dart index 87e4aaa7..1ce0e2fa 100644 --- a/lib/views/pages/device_transfer/track_device_transfer.dart +++ b/lib/views/pages/device_transfer/track_device_transfer.dart @@ -60,7 +60,7 @@ class _TrackDeviceTransferPageState extends State with Expanded( child: Center( child: Text( - "Device Transfer", + "Asset Transfer", style: Theme.of(context).textTheme.headline6.copyWith(color: AColors.white, fontStyle: FontStyle.italic), ), ), diff --git a/lib/views/pages/user/land_page.dart b/lib/views/pages/user/land_page.dart index b0255d3c..a1405506 100644 --- a/lib/views/pages/user/land_page.dart +++ b/lib/views/pages/user/land_page.dart @@ -205,7 +205,7 @@ class _LandPageState extends State { }, ), LandPageItem( - text: "Track Device Transfer", + text: "Track Asset Transfer", icon: FontAwesomeIcons.peopleCarryBox, onPressed: () { Navigator.of(context).pushNamed(TrackDeviceTransferPage.id); From 5bab5c92a6ee16cafb3708074abecf4b5d1953ef Mon Sep 17 00:00:00 2001 From: Sikander Saleem Date: Thu, 10 Aug 2023 09:28:14 +0300 Subject: [PATCH 165/181] improvement. --- .../status/service_request/service_request_types_mune.dart | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/views/widgets/status/service_request/service_request_types_mune.dart b/lib/views/widgets/status/service_request/service_request_types_mune.dart index 7f9e5428..4f5e34a7 100644 --- a/lib/views/widgets/status/service_request/service_request_types_mune.dart +++ b/lib/views/widgets/status/service_request/service_request_types_mune.dart @@ -28,7 +28,7 @@ class ServiceRequestTypesMenu extends StatelessWidget { await menuProvider.getData(user: userProvider.user, host: settingProvider.host); }, child: SingleStatusMenu( - initialStatus: enabled || !withDefaultItem ? initialValue : menuProvider.getDefaultItem(), + initialStatus: (enabled || !withDefaultItem) ? initialValue : menuProvider.getDefaultItem(), statuses: menuProvider.items, enabled: enabled, onSelect: onSelect, From 8184632ce727dc3741256342b65a105c8c33cd41 Mon Sep 17 00:00:00 2001 From: zaid_daoud Date: Thu, 10 Aug 2023 09:47:27 +0300 Subject: [PATCH 166/181] Improvements --- lib/controllers/providers/api/device_transfer_provider.dart | 2 +- lib/controllers/providers/api/gas_refill_provider.dart | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/lib/controllers/providers/api/device_transfer_provider.dart b/lib/controllers/providers/api/device_transfer_provider.dart index d4f55572..f09e1642 100644 --- a/lib/controllers/providers/api/device_transfer_provider.dart +++ b/lib/controllers/providers/api/device_transfer_provider.dart @@ -64,7 +64,7 @@ class DeviceTransferProvider extends ChangeNotifier { }) async { if (isLoading == true) return -2; isLoading = true; - notifyListeners(); + if (items?.isEmpty ?? true) notifyListeners(); Response response; try { Map body = {}; diff --git a/lib/controllers/providers/api/gas_refill_provider.dart b/lib/controllers/providers/api/gas_refill_provider.dart index 9fde956b..1c567e31 100644 --- a/lib/controllers/providers/api/gas_refill_provider.dart +++ b/lib/controllers/providers/api/gas_refill_provider.dart @@ -52,7 +52,7 @@ class GasRefillProvider extends ChangeNotifier { }) async { if (isLoading == true) return -2; isLoading = true; - notifyListeners(); + if (items?.isEmpty ?? true) notifyListeners(); Response response; Map body = {}; From af1874600ab3c31431543a938d535e64c9b66ea4 Mon Sep 17 00:00:00 2001 From: zaid_daoud Date: Thu, 10 Aug 2023 11:55:31 +0300 Subject: [PATCH 167/181] Improvements --- .../providers/api/device_transfer_provider.dart | 15 ++++++++------- lib/models/device/device.dart | 9 +++++++++ .../device_transfer/request_device_transfer.dart | 5 ++++- 3 files changed, 21 insertions(+), 8 deletions(-) diff --git a/lib/controllers/providers/api/device_transfer_provider.dart b/lib/controllers/providers/api/device_transfer_provider.dart index f09e1642..ac0e975c 100644 --- a/lib/controllers/providers/api/device_transfer_provider.dart +++ b/lib/controllers/providers/api/device_transfer_provider.dart @@ -134,18 +134,19 @@ class DeviceTransferProvider extends ChangeNotifier { Map body = { "id": 0, "assetId": model.device.id ?? "", - "destSiteId": model.receiver.client.id ?? "", - "destDepartmentId": model.receiver.department.id ?? "", - "senderSiteId": model.receiver.client.id ?? "", + "destSiteId": hospital.id ?? "", + "destDepartmentId": department.id ?? "", + "senderSiteId": model.sender.client.id ?? "", // "transferNo": 0, // "transferCode": "string", "destBuildingId": building?.id, "destFloorId": floor.id, "destRoom": room, - // "senderBuildingId": 0, - // "senderFloorId": 0, - // "senderDepartmentId": 0, - // "senderRoom": "string", + ///// + "senderBuildingId": model.device.destBuildingId, + "senderFloorId": model.device.destFloorId, + "senderDepartmentId": model.device.destDepartmentId, + "senderRoom": model.device.destRoom, // "senderAssignedEmployeeId": "string", // "senderMachineStatusId": 0, // "senderComment": "string", diff --git a/lib/models/device/device.dart b/lib/models/device/device.dart index 1866c26c..c348d2f8 100644 --- a/lib/models/device/device.dart +++ b/lib/models/device/device.dart @@ -9,9 +9,12 @@ class Device { String number; String assetName; String destBuildingName; + int destBuildingId; String destDepartmentName; + int destDepartmentId; String destRoom; String destFloor; + int destFloorId; String destSiteName; // String brand; @@ -33,6 +36,9 @@ class Device { // this.brand, // this.model, this.modelDefinition, + this.destFloorId, + this.destDepartmentId, + this.destBuildingId, }); factory Device.fromJson(Map parsedJson, {bool startKeyWithDest = true}) { @@ -45,9 +51,12 @@ class Device { modelDefinition: ModelDefinition.fromJson(parsedJson["modelDefinition"]), hospital: Hospital.fromJson(parsedJson["site"]), destBuildingName: startKeyWithDest ? parsedJson["destBuildingName"] : parsedJson['building']['name'], + destBuildingId: startKeyWithDest ? parsedJson["destBuildingName"] : parsedJson['building']['id'], destDepartmentName: startKeyWithDest ? parsedJson["destDepartmentName"] : parsedJson['department']['departmentName'], + destDepartmentId: startKeyWithDest ? parsedJson["destDepartmentName"] : parsedJson['department']['id'], destRoom: startKeyWithDest ? parsedJson["destRoom"] : parsedJson['room'], destFloor: startKeyWithDest ? parsedJson["destFloor"] : parsedJson['floor']['name'], + destFloorId: startKeyWithDest ? null : parsedJson['floor']['id'], destSiteName: parsedJson['destSiteName'] // parsedJson["modelDefinition"] == null ? "" : // parsedJson["modelDefinition"]["manufacturerName"], diff --git a/lib/views/pages/device_transfer/request_device_transfer.dart b/lib/views/pages/device_transfer/request_device_transfer.dart index 0c0d8903..16eb104d 100644 --- a/lib/views/pages/device_transfer/request_device_transfer.dart +++ b/lib/views/pages/device_transfer/request_device_transfer.dart @@ -64,7 +64,7 @@ class _RequestDeviceTransferState extends State { _isLoading = true; setState(() {}); - _formModel.sender?.client?.id = _userProvider.user?.clientId; + // _formModel.sender?.client?.id = _userProvider.user?.clientId; int status = await _deviceTransferProvider.createRequest( user: _userProvider.user, host: _settingProvider.host, @@ -149,6 +149,9 @@ class _RequestDeviceTransferState extends State { device: _formModel.device, onDevicePick: (device) { _formModel.device = device; + _formModel.sender.client = device.hospital; + print("device : ${device.hospital.id}"); + print("_formModel : ${_formModel.sender.client.id}"); setState(() {}); }, ), From b16ca9ce77de2acdb635c20dfca747f2021ed255 Mon Sep 17 00:00:00 2001 From: zaid_daoud Date: Thu, 10 Aug 2023 12:29:25 +0300 Subject: [PATCH 168/181] Improvements --- lib/controllers/providers/api/device_transfer_provider.dart | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/lib/controllers/providers/api/device_transfer_provider.dart b/lib/controllers/providers/api/device_transfer_provider.dart index ac0e975c..c5677c75 100644 --- a/lib/controllers/providers/api/device_transfer_provider.dart +++ b/lib/controllers/providers/api/device_transfer_provider.dart @@ -82,8 +82,9 @@ class DeviceTransferProvider extends ChangeNotifier { List listJson = json.decode(response.body)["data"]; List itemsPage = listJson.map((request) => DeviceTransfer.fromJson(request)).toList(); items ??= []; - items.addAll(itemsPage); + items.addAll(itemsPage.toSet().toList()); sortMostRecent(items, mostRecent); + print(listJson); if (itemsPage.length == pageItemNumber) { nextPage = true; From ac38159b0a29c0e6351ff00a59e157d86667ef21 Mon Sep 17 00:00:00 2001 From: zaid_daoud Date: Mon, 14 Aug 2023 13:17:45 +0300 Subject: [PATCH 169/181] User Model Change --- .../providers/api/user_provider.dart | 1 + lib/models/user.dart | 18 +++++++++++++---- lib/views/pages/register.dart | 20 +++++++++---------- lib/views/pages/user/profile_page.dart | 18 ++++++++--------- 4 files changed, 32 insertions(+), 25 deletions(-) diff --git a/lib/controllers/providers/api/user_provider.dart b/lib/controllers/providers/api/user_provider.dart index bce2ce22..bf96f4e7 100644 --- a/lib/controllers/providers/api/user_provider.dart +++ b/lib/controllers/providers/api/user_provider.dart @@ -63,6 +63,7 @@ class UserProvider extends ChangeNotifier { notifyListeners(); return response.statusCode; } catch (error) { + print(error); _loading = false; notifyListeners(); return -1; diff --git a/lib/models/user.dart b/lib/models/user.dart index c64c471f..ee567784 100644 --- a/lib/models/user.dart +++ b/lib/models/user.dart @@ -4,8 +4,8 @@ import 'package:test_sa/models/enums/user_types.dart'; class User { int clientId; String clientName; - int departmentId; - String departmentName; + List departmentId; + List departmentName; String message; String username; String userID; @@ -148,8 +148,18 @@ class User { User.fromJson(dynamic json) { clientId = json['client_id']; clientName = json['client_name']; - departmentId = json['department_id']; - departmentName = json['department_name']; + if (json['department_id'] != null) { + departmentId = []; + json['department_id'].forEach((v) { + departmentId.add(v); + }); + } + if (json['department_name'] != null) { + departmentId = []; + json['department_name'].forEach((v) { + departmentId.add(v); + }); + } message = json['message']; username = json['username']; userID = json['userID']; diff --git a/lib/views/pages/register.dart b/lib/views/pages/register.dart index ab370de9..1246fff3 100644 --- a/lib/views/pages/register.dart +++ b/lib/views/pages/register.dart @@ -6,14 +6,12 @@ import 'package:test_sa/controllers/localization/localization.dart'; import 'package:test_sa/controllers/providers/api/user_provider.dart'; import 'package:test_sa/controllers/providers/settings/setting_provider.dart'; import 'package:test_sa/controllers/validator/validator.dart'; -import 'package:test_sa/models/department.dart'; import 'package:test_sa/models/hospital.dart'; import 'package:test_sa/models/subtitle.dart'; import 'package:test_sa/models/user.dart'; import 'package:test_sa/views/widgets/app_text_form_field.dart'; import 'package:test_sa/views/widgets/buttons/app_back_button.dart'; import 'package:test_sa/views/widgets/buttons/app_button.dart'; -import 'package:test_sa/views/widgets/departments/department_button.dart'; import 'package:test_sa/views/widgets/hospitals/hospital_button.dart'; import 'package:test_sa/views/widgets/loaders/loading_manager.dart'; @@ -131,15 +129,15 @@ class _RegisterState extends State { setState(() {}); }, ), - const SizedBox(height: 12), - DepartmentButton( - department: Department(id: _user.departmentId, name: _user.departmentName), - onDepartmentPick: (department) { - _user.departmentId = department.id; - _user.departmentName = department.name; - setState(() {}); - }, - ), + // const SizedBox(height: 12), + // DepartmentButton( + // department: Department(id: _user.departmentId, name: _user.departmentName), + // onDepartmentPick: (department) { + // _user.departmentId = department.id; + // _user.departmentName = department.name; + // setState(() {}); + // }, + // ), const SizedBox(height: 12), ATextFormField( initialValue: _user.phoneNumber, diff --git a/lib/views/pages/user/profile_page.dart b/lib/views/pages/user/profile_page.dart index 79732e4e..d5c014de 100644 --- a/lib/views/pages/user/profile_page.dart +++ b/lib/views/pages/user/profile_page.dart @@ -5,7 +5,6 @@ import 'package:test_sa/controllers/localization/localization.dart'; import 'package:test_sa/controllers/providers/api/user_provider.dart'; import 'package:test_sa/controllers/providers/settings/setting_provider.dart'; import 'package:test_sa/controllers/validator/validator.dart'; -import 'package:test_sa/models/department.dart'; import 'package:test_sa/models/hospital.dart'; import 'package:test_sa/models/subtitle.dart'; import 'package:test_sa/models/user.dart'; @@ -14,7 +13,6 @@ import 'package:test_sa/views/app_style/sizing.dart'; import 'package:test_sa/views/widgets/app_text_form_field.dart'; import 'package:test_sa/views/widgets/buttons/app_back_button.dart'; import 'package:test_sa/views/widgets/buttons/app_button.dart'; -import 'package:test_sa/views/widgets/departments/department_button.dart'; import 'package:test_sa/views/widgets/hospitals/hospital_button.dart'; import 'package:test_sa/views/widgets/loaders/loading_manager.dart'; @@ -121,14 +119,14 @@ class _ProfilePageState extends State { SizedBox( height: 8, ), - DepartmentButton( - department: Department(name: _user.departmentName, id: _user.departmentId), - onDepartmentPick: (department) { - _user.departmentName = department.name; - _user.departmentId = department.id; - setState(() {}); - }, - ), + // DepartmentButton( + // department: Department(name: _user.departmentName, id: _user.departmentId), + // onDepartmentPick: (department) { + // _user.departmentName = department.name; + // _user.departmentId = department.id; + // setState(() {}); + // }, + // ), SizedBox( height: 8, ), From 383c634c505a357305688a934b3718d89ddfce03 Mon Sep 17 00:00:00 2001 From: zaid_daoud Date: Mon, 14 Aug 2023 14:51:31 +0300 Subject: [PATCH 170/181] User departments in create new service request --- .../providers/api/user_provider.dart | 82 +++++++++---------- lib/views/pages/user/profile_page.dart | 47 ++++++----- .../pages/user/requests/create_request.dart | 40 +++++++-- 3 files changed, 97 insertions(+), 72 deletions(-) diff --git a/lib/controllers/providers/api/user_provider.dart b/lib/controllers/providers/api/user_provider.dart index bf96f4e7..5f539f05 100644 --- a/lib/controllers/providers/api/user_provider.dart +++ b/lib/controllers/providers/api/user_provider.dart @@ -113,45 +113,45 @@ class UserProvider extends ChangeNotifier { /// return state code if request complete may be 200, 404 or 403 /// for more details about state codes check http state manager /// lib\controllers\http_status_manger\http_status_manger.dart - Future updateProfile({ - @required String host, - @required User user, - }) async { - if (_loading == true) return -2; - _loading = true; - notifyListeners(); - Response response; - - Map jsonObject = {}; - jsonObject["uid"] = user.id; - jsonObject["token"] = user.token; - if (user.departmentId != _user.departmentId) jsonObject["department"] = user.departmentId; - // if (user.whatsApp != _user.whatsApp) jsonObject["whatsapp"] = user.whatsApp; - if (user.phoneNumber != _user.phoneNumber) jsonObject["phone"] = user.phoneNumber; - try { - response = response = await ApiManager.instance.post( - URLs.login, - body: jsonObject, - ); - } catch (error) { - _loading = false; - notifyListeners(); - return -1; - } - - _loading = false; - notifyListeners(); - - if (response.statusCode >= 200 && response.statusCode < 300) { - // client's request was successfully received - _user = User.fromJson(jsonDecode(utf8.decode(response.bodyBytes))[0]); - _user.clientId = user.clientId; - _user.clientName = user.clientName; - _user.departmentName = user.departmentName; - _user.departmentId = user.departmentId; - notifyListeners(); - return response.statusCode; - } - return response.statusCode; - } + // Future updateProfile({ + // @required String host, + // @required User user, + // }) async { + // if (_loading == true) return -2; + // _loading = true; + // notifyListeners(); + // Response response; + // + // Map jsonObject = {}; + // jsonObject["uid"] = user.id; + // jsonObject["token"] = user.token; + // if (user.departmentId != _user.departmentId) jsonObject["department"] = user.departmentId; + // // if (user.whatsApp != _user.whatsApp) jsonObject["whatsapp"] = user.whatsApp; + // if (user.phoneNumber != _user.phoneNumber) jsonObject["phone"] = user.phoneNumber; + // try { + // response = response = await ApiManager.instance.post( + // URLs.login, + // body: jsonObject, + // ); + // } catch (error) { + // _loading = false; + // notifyListeners(); + // return -1; + // } + // + // _loading = false; + // notifyListeners(); + // + // if (response.statusCode >= 200 && response.statusCode < 300) { + // // client's request was successfully received + // _user = User.fromJson(jsonDecode(utf8.decode(response.bodyBytes))[0]); + // _user.clientId = user.clientId; + // _user.clientName = user.clientName; + // _user.departmentName = user.departmentName; + // _user.departmentId = user.departmentId; + // notifyListeners(); + // return response.statusCode; + // } + // return response.statusCode; + // } } diff --git a/lib/views/pages/user/profile_page.dart b/lib/views/pages/user/profile_page.dart index d5c014de..a5b88dae 100644 --- a/lib/views/pages/user/profile_page.dart +++ b/lib/views/pages/user/profile_page.dart @@ -1,6 +1,5 @@ import 'package:flutter/material.dart'; import 'package:provider/provider.dart'; -import 'package:test_sa/controllers/api_routes/http_status_manger.dart'; import 'package:test_sa/controllers/localization/localization.dart'; import 'package:test_sa/controllers/providers/api/user_provider.dart'; import 'package:test_sa/controllers/providers/settings/setting_provider.dart'; @@ -170,29 +169,29 @@ class _ProfilePageState extends State { child: AButton( text: _subtitle.update, onPressed: () async { - if (!_formKey.currentState.validate()) return; - _formKey.currentState.save(); - if (_user.departmentId == null) { - ScaffoldMessenger.of(context).showSnackBar(SnackBar( - content: Text(_subtitle.unitRequired), - )); - return; - } - int status = await _userProvider.updateProfile( - user: _user, - host: _settingProvider.host, - ); - if (status >= 200 && status < 300) { - _settingProvider.setUser(_userProvider.user); - ScaffoldMessenger.of(context).showSnackBar(SnackBar( - content: Text(_subtitle.requestCompleteSuccessfully), - )); - } else { - String errorMessage = HttpStatusManger.getStatusMessage(status: status, subtitle: _subtitle); - ScaffoldMessenger.of(context).showSnackBar(SnackBar( - content: Text(errorMessage), - )); - } + // if (!_formKey.currentState.validate()) return; + // _formKey.currentState.save(); + // if (_user.departmentId == null) { + // ScaffoldMessenger.of(context).showSnackBar(SnackBar( + // content: Text(_subtitle.unitRequired), + // )); + // return; + // } + // int status = await _userProvider.updateProfile( + // user: _user, + // host: _settingProvider.host, + // ); + // if (status >= 200 && status < 300) { + // _settingProvider.setUser(_userProvider.user); + // ScaffoldMessenger.of(context).showSnackBar(SnackBar( + // content: Text(_subtitle.requestCompleteSuccessfully), + // )); + // } else { + // String errorMessage = HttpStatusManger.getStatusMessage(status: status, subtitle: _subtitle); + // ScaffoldMessenger.of(context).showSnackBar(SnackBar( + // content: Text(errorMessage), + // )); + // } }, ), ), diff --git a/lib/views/pages/user/requests/create_request.dart b/lib/views/pages/user/requests/create_request.dart index d139c9c4..4aaf65bc 100644 --- a/lib/views/pages/user/requests/create_request.dart +++ b/lib/views/pages/user/requests/create_request.dart @@ -33,6 +33,7 @@ import 'package:test_sa/views/widgets/titles/app_sub_title.dart'; import '../../../../controllers/providers/api/status_drop_down/service_reqest/service_request_through_provider.dart'; import '../../../../controllers/providers/api/status_drop_down/service_reqest/service_request_type_provider.dart'; +import '../../../app_style/sizing.dart'; import '../../../widgets/date_and_time/date_picker.dart'; import '../../../widgets/status/service_request/service_request_first_action.dart'; import '../../../widgets/status/service_request/service_request_loan_availability.dart'; @@ -138,14 +139,39 @@ class CreateRequestPageState extends State { style: Theme.of(context).textTheme.subtitle1, ), 12.height, - _userProvider.user.departmentId == null + _userProvider.user.departmentId == null || (_userProvider.user?.departmentId?.isEmpty ?? false) ? const SizedBox.shrink() - : ATextFormField( - enable: false, - initialValue: _userProvider.user.departmentName ?? _subtitle.noUniteFound, - hintText: _subtitle.unite, - prefixIconData: FontAwesomeIcons.hospitalUser, - style: Theme.of(context).textTheme.subtitle1, + : Container( + padding: const EdgeInsets.all(12), + decoration: BoxDecoration( + color: const Color(0xfff5f5f5), + border: Border.all( + color: const Color(0xffefefef), + ), + borderRadius: BorderRadius.circular(AppStyle.borderRadius * AppStyle.getScaleFactor(context)), + ), + child: Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: _userProvider.user.departmentName + ?.map( + (e) => Text( + e?.trim() ?? "", + style: Theme.of(context).textTheme.titleMedium.copyWith(color: AColors.black), + ), + ) + ?.toList() ?? + [], + ), + Icon( + FontAwesomeIcons.hospitalUser, + size: 20 * AppStyle.getScaleFactor(context), + color: const Color(0xff2e303a), + ), + ], + ), ), 12.height, DeviceButton( From bd299e2a6d28b3cd85dc72c8a2baa96bee6b99ba Mon Sep 17 00:00:00 2001 From: zaid_daoud Date: Tue, 15 Aug 2023 16:14:21 +0300 Subject: [PATCH 171/181] Some changes on work orders model attributes & change File Base Url (Still under testing) --- lib/controllers/api_routes/urls.dart | 4 ++-- lib/models/call_request_for_work_order_model.dart | 14 ++++++++------ .../user/requests/report/edit_service_report.dart | 3 +-- 3 files changed, 11 insertions(+), 10 deletions(-) diff --git a/lib/controllers/api_routes/urls.dart b/lib/controllers/api_routes/urls.dart index b672ee62..a587fb7f 100644 --- a/lib/controllers/api_routes/urls.dart +++ b/lib/controllers/api_routes/urls.dart @@ -12,8 +12,8 @@ class URLs { set host(String value) => _host = value; - // static String getFileUrl(String file) => (file == null || file.isEmpty) ? null : (file.contains("/") ? file : "$_host/Files/DownloadFile?fileName=$file"); - static String getFileUrl(String file) => (file == null || file.isEmpty) ? null : (file.contains("/") ? file : "$_host/attachment/$file"); + static String getFileUrl(String file) => (file == null || file.isEmpty) ? null : (file.contains("/") ? file : "$_host/Files/DownloadFile?fileName=$file"); + // static String getFileUrl(String file) => (file == null || file.isEmpty) ? null : (file.contains("/") ? file : "$_host/attachment/$file"); // API Routes static get login => "$_baseUrl/MobileAuth/LoginIntegration"; // post diff --git a/lib/models/call_request_for_work_order_model.dart b/lib/models/call_request_for_work_order_model.dart index a6c2d5a5..35b34551 100644 --- a/lib/models/call_request_for_work_order_model.dart +++ b/lib/models/call_request_for_work_order_model.dart @@ -1,3 +1,5 @@ +import 'package:test_sa/models/lookup.dart'; + class CallRequestForWorkOrder { int id; String callNo; @@ -71,11 +73,11 @@ class Asset { String ipAddress; String macAddress; String portNumber; - String assetReplace; + Lookup assetReplace; String oldAsset; - bool isParent; + Lookup isParent; String parentAsset; - int assetType; + Lookup assetType; Site site; Building building; String floor; @@ -171,11 +173,11 @@ class Asset { ipAddress = json['ipAddress']; macAddress = json['macAddress']; portNumber = json['portNumber']; - assetReplace = json['assetReplace']; + assetReplace = json['assetReplace'] != null ? Lookup.fromJson(json['assetReplace']) : null; oldAsset = json['oldAsset']; - isParent = json['isParent']; + isParent = json['isParent'] != null ? Lookup.fromJson(json['isParent']) : null; parentAsset = json['parentAsset']; - assetType = json['assetType']; + assetType = json['assetType'] != null ? Lookup.fromJson(json['assetType']) : null; site = json['site'] != null ? new Site.fromJson(json['site']) : null; building = json['building']; floor = json['floor']; diff --git a/lib/views/pages/user/requests/report/edit_service_report.dart b/lib/views/pages/user/requests/report/edit_service_report.dart index 07619f16..8191fc4d 100644 --- a/lib/views/pages/user/requests/report/edit_service_report.dart +++ b/lib/views/pages/user/requests/report/edit_service_report.dart @@ -416,7 +416,7 @@ class _EditServiceReportState extends State with TickerProvid ), ], ), - if (_serviceReport.callLastSituation.value == 2) + if (_serviceReport?.callLastSituation?.value == 2) Column( children: [ const SizedBox( @@ -1056,7 +1056,6 @@ class _EditServiceReportState extends State with TickerProvid return; } _validate = true; - print("jere1245"); // if (!_formKey.currentState.validate()) { // setState(() {}); // return; From 349ac7dba4dd2f59787c2fe86f0ca3553bc5670e Mon Sep 17 00:00:00 2001 From: zaid_daoud Date: Fri, 18 Aug 2023 11:30:01 +0300 Subject: [PATCH 172/181] Simple Updates --- assets/subtitles/ar_subtitle.json | 2 +- assets/subtitles/en_subtitle.json | 2 +- .../api/service_requests_provider.dart | 2 +- lib/models/service_report.dart | 2 +- lib/models/subtitle.dart | 6 +- .../spare_parts_details_bottom_sheet.dart | 2 +- .../user/gas_refill/gas_refill_details.dart | 2 +- .../report/create_service_report.dart | 128 +++++++++--------- .../requests/report/edit_service_report.dart | 2 +- 9 files changed, 74 insertions(+), 74 deletions(-) diff --git a/assets/subtitles/ar_subtitle.json b/assets/subtitles/ar_subtitle.json index 16cad068..b9a51fd7 100644 --- a/assets/subtitles/ar_subtitle.json +++ b/assets/subtitles/ar_subtitle.json @@ -167,7 +167,7 @@ "newServiceReport": "تقرير خدمة جديد", "number": "رقم", "operatingHours": "ساعات العمل", - "partNumber": "رقم القطعة", + "partNumberName": "رقم/اسم القطعة", "quantity": "كمية", "reasons": "الاسباب", "reportStatus": "حالة التقرير", diff --git a/assets/subtitles/en_subtitle.json b/assets/subtitles/en_subtitle.json index 4b5352f9..fc57c444 100644 --- a/assets/subtitles/en_subtitle.json +++ b/assets/subtitles/en_subtitle.json @@ -167,7 +167,7 @@ "newServiceReport": "New Work Order", "number": "Number", "operatingHours": "Operating Hours", - "partNumber": "Part Number", + "partNumberName": "Part Number/Name", "quantity": "Quantity", "reasons": "Reasons", "reportStatus": "Report Status", diff --git a/lib/controllers/providers/api/service_requests_provider.dart b/lib/controllers/providers/api/service_requests_provider.dart index d255f7bc..ea03c7ee 100644 --- a/lib/controllers/providers/api/service_requests_provider.dart +++ b/lib/controllers/providers/api/service_requests_provider.dart @@ -312,7 +312,7 @@ class ServiceRequestsProvider extends ChangeNotifier { }, "assetType": report.assetType?.toMap(), "assignedEmployee": {"id": report.engineer?.id, "name": report.engineer?.name ?? ""}, - "visitDate": report.visitDate?.toIso8601String() ?? "", + "visitDate": report.returnToService?.toIso8601String() ?? "", // "assistantEmployees": [ // {"id": report.engineer.id, "name": report.engineer.name}, // ], diff --git a/lib/models/service_report.dart b/lib/models/service_report.dart index bf2f53d4..a5fed419 100644 --- a/lib/models/service_report.dart +++ b/lib/models/service_report.dart @@ -160,7 +160,7 @@ class ServiceReport { return false; } if (returnToService == null) { - await Fluttertoast.showToast(msg: "return To Service Date Required"); + await Fluttertoast.showToast(msg: "Return To Service Date Required"); return false; } if (timer?.startAt == null) { diff --git a/lib/models/subtitle.dart b/lib/models/subtitle.dart index 4007a7cb..6786ddd1 100644 --- a/lib/models/subtitle.dart +++ b/lib/models/subtitle.dart @@ -205,7 +205,7 @@ class Subtitle { String reasons; String attachImage; String operatingHours; - String partNumber; + String partNumberName; String number; String quantity; String orderWorkNumber; @@ -417,7 +417,7 @@ class Subtitle { @required this.newServiceReport, @required this.number, @required this.operatingHours, - @required this.partNumber, + @required this.partNumberName, @required this.reasons, @required this.reportStatus, @required this.reportType, @@ -618,7 +618,7 @@ class Subtitle { newServiceReport: parsedJson["newServiceReport"], number: parsedJson["number"], operatingHours: parsedJson["operatingHours"], - partNumber: parsedJson["partNumber"], + partNumberName: parsedJson["partNumberName"], quantity: parsedJson["quantity"], reasons: parsedJson["reasons"], reportStatus: parsedJson["reportStatus"], diff --git a/lib/views/pages/sub_workorder/spare_parts_details_bottom_sheet.dart b/lib/views/pages/sub_workorder/spare_parts_details_bottom_sheet.dart index feac7419..9cb43482 100644 --- a/lib/views/pages/sub_workorder/spare_parts_details_bottom_sheet.dart +++ b/lib/views/pages/sub_workorder/spare_parts_details_bottom_sheet.dart @@ -87,7 +87,7 @@ class _SparePartsBottomSheetState extends State { child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ - ASubTitle(subtitle.partNumber), + ASubTitle(subtitle.partNumberName), _validate && _workOrder.sparePartsWorkOrders == null ? ASubTitle( subtitle.requiredWord, diff --git a/lib/views/pages/user/gas_refill/gas_refill_details.dart b/lib/views/pages/user/gas_refill/gas_refill_details.dart index 943776ea..bc6f49a0 100644 --- a/lib/views/pages/user/gas_refill/gas_refill_details.dart +++ b/lib/views/pages/user/gas_refill/gas_refill_details.dart @@ -106,7 +106,7 @@ class _GasRefillDetailsState extends State { Expanded( child: Center( child: Text( - _subtitle.details, + "Gas Refill Request", style: Theme.of(context).textTheme.headline6.copyWith(color: AColors.white, fontStyle: FontStyle.italic), ), ), diff --git a/lib/views/pages/user/requests/report/create_service_report.dart b/lib/views/pages/user/requests/report/create_service_report.dart index 6187418a..89fdf8da 100644 --- a/lib/views/pages/user/requests/report/create_service_report.dart +++ b/lib/views/pages/user/requests/report/create_service_report.dart @@ -22,7 +22,6 @@ import 'package:test_sa/views/app_style/sizing.dart'; import 'package:test_sa/views/widgets/app_text_form_field.dart'; import 'package:test_sa/views/widgets/buttons/app_back_button.dart'; import 'package:test_sa/views/widgets/buttons/app_button.dart'; -import 'package:test_sa/views/widgets/date_and_time/date_picker.dart'; import 'package:test_sa/views/widgets/e_signature/e_signature.dart'; import 'package:test_sa/views/widgets/equipment/auto_complete_devices_field.dart'; import 'package:test_sa/views/widgets/images/mini_one_image_picker.dart'; @@ -35,6 +34,7 @@ import 'package:test_sa/views/widgets/status/report/service_report_reasons.dart' import 'package:test_sa/views/widgets/titles/app_sub_title.dart'; import '../../../../../controllers/providers/api/status_drop_down/report/service_types_provider.dart'; +import '../../../../widgets/date_and_time/date_picker.dart'; import '../../../../widgets/status/report/service_report_fault_description.dart'; import '../../../../widgets/status/report/service_report_repair_location.dart'; import '../../../../widgets/timer/app_timer.dart'; @@ -69,7 +69,7 @@ class _CreateServiceReportState extends State with TickerPr @override void initState() { _serviceReport = ServiceReport( - visitDate: DateTime.now(), + returnToService: DateTime.now(), //type: const Lookup(value: 2), device: widget.request.device, parts: [], @@ -200,63 +200,6 @@ class _CreateServiceReportState extends State with TickerPr crossAxisAlignment: CrossAxisAlignment.start, children: [ // Report type and Reasons - Row( - children: [ - // Report Status - // Expanded( - // child: Column( - // crossAxisAlignment: CrossAxisAlignment.start, - // children: [ - // ASubTitle(_subtitle.reportType), - // _validate && _serviceReport.type == null ? - // ASubTitle(_subtitle.requiredWord,color: Colors.red,): - // const SizedBox.shrink(), - // const SizedBox(height: 4,), - // ServiceReportTypeMenu( - // initialValue: _serviceReport.type, - // onSelect: (status){ - // _serviceReport.type = status; - // }, - // ), - // ], - // ), - // ), - // const SizedBox(width: 8,), - // visit date - Expanded( - child: Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - ASubTitle(_subtitle.visitDate), - _validate && _serviceReport.visitDate == null - ? ASubTitle( - _subtitle.requiredWord, - color: Colors.red, - ) - : const SizedBox.shrink(), - Row( - children: [ - Expanded( - child: ADatePicker( - date: _serviceReport.visitDate, - from: DateTime.now().subtract(const Duration(days: 365)), - to: DateTime.now().add(const Duration(days: 365)), - onDatePicker: (date) { - _serviceReport.visitDate = date; - setState(() {}); - }, - ), - ), - ], - ), - ], - ), - ), - ], - ), - const SizedBox( - height: 8, - ), // device sn Visibility( visible: widget.request.deviceSerialNumber == null, @@ -420,6 +363,63 @@ class _CreateServiceReportState extends State with TickerPr SizedBox( height: 8 * AppStyle.getScaleFactor(context), ), + Row( + children: [ + // Report Status + // Expanded( + // child: Column( + // crossAxisAlignment: CrossAxisAlignment.start, + // children: [ + // ASubTitle(_subtitle.reportType), + // _validate && _serviceReport.type == null ? + // ASubTitle(_subtitle.requiredWord,color: Colors.red,): + // const SizedBox.shrink(), + // const SizedBox(height: 4,), + // ServiceReportTypeMenu( + // initialValue: _serviceReport.type, + // onSelect: (status){ + // _serviceReport.type = status; + // }, + // ), + // ], + // ), + // ), + // const SizedBox(width: 8,), + // visit date + Expanded( + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + const ASubTitle("Return to Service"), + _validate && _serviceReport.returnToService == null + ? ASubTitle( + _subtitle.requiredWord, + color: Colors.red, + ) + : const SizedBox.shrink(), + Row( + children: [ + Expanded( + child: ADatePicker( + date: _serviceReport.returnToService, + from: DateTime.now().subtract(const Duration(days: 365)), + to: DateTime.now().add(const Duration(days: 365)), + onDatePicker: (date) { + _serviceReport.returnToService = date; + setState(() {}); + }, + ), + ), + ], + ), + ], + ), + ), + ], + ), + const SizedBox( + height: 8, + ), ASubTitle(_subtitle.workingHours), const SizedBox(height: 8), Row( @@ -569,7 +569,7 @@ class _CreateServiceReportState extends State with TickerPr ), Row( children: [ - ASubTitle(_subtitle.workPreformed), + const ASubTitle("Solutions"), // Expanded( // child: SizedBox( // height: 32 * AppStyle.getScaleFactor(context), @@ -609,7 +609,7 @@ class _CreateServiceReportState extends State with TickerPr child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ - ASubTitle(_subtitle.reasons), + const ASubTitle("Failure Reason"), _validate && _serviceReport.reason?.id == null ? ASubTitle( _subtitle.requiredWord, @@ -655,7 +655,7 @@ class _CreateServiceReportState extends State with TickerPr }, ), const SizedBox(height: 16), - ASubTitle(_subtitle.travelingExpense), + const ASubTitle("Travel Expenses"), const SizedBox( height: 4, ), @@ -791,7 +791,7 @@ class _CreateServiceReportState extends State with TickerPr // ), const SizedBox(height: 8), - ASubTitle(_subtitle.comment), + const ASubTitle("Technical comment"), const SizedBox(height: 4), ATextFormField( initialValue: _serviceReport?.comment, @@ -858,7 +858,7 @@ class _CreateServiceReportState extends State with TickerPr child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ - ASubTitle(_subtitle.partNumber), + ASubTitle(_subtitle.partNumberName), _validate && _serviceReport.parts == null ? ASubTitle( _subtitle.requiredWord, diff --git a/lib/views/pages/user/requests/report/edit_service_report.dart b/lib/views/pages/user/requests/report/edit_service_report.dart index 8191fc4d..b783e5a6 100644 --- a/lib/views/pages/user/requests/report/edit_service_report.dart +++ b/lib/views/pages/user/requests/report/edit_service_report.dart @@ -1000,7 +1000,7 @@ class _EditServiceReportState extends State with TickerProvid child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ - ASubTitle(_subtitle.partNumber), + ASubTitle(_subtitle.partNumberName), _validate && _serviceReport.parts == null ? ASubTitle( _subtitle.requiredWord, From 13d4b7112869a5d4bcff547ef7f2c0d60156b7d1 Mon Sep 17 00:00:00 2001 From: zaid_daoud Date: Fri, 18 Aug 2023 11:38:42 +0300 Subject: [PATCH 173/181] sender & receiver issue --- lib/views/pages/device_transfer/device_transfer_details.dart | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lib/views/pages/device_transfer/device_transfer_details.dart b/lib/views/pages/device_transfer/device_transfer_details.dart index c4ebb783..2e807ec9 100644 --- a/lib/views/pages/device_transfer/device_transfer_details.dart +++ b/lib/views/pages/device_transfer/device_transfer_details.dart @@ -143,7 +143,7 @@ class _DeviceTransferDetailsState extends State { if (_userProvider.user?.type == UsersTypes.engineer) ASmallButton( text: _subtitle.edit, - onPressed: (_isSender || _isReceiver || false) + onPressed: (_isSender) ? () { Navigator.of(context).push(MaterialPageRoute( builder: (_) => UpdateDeviceTransfer( @@ -169,7 +169,7 @@ class _DeviceTransferDetailsState extends State { if (_userProvider.user?.type == UsersTypes.engineer) ASmallButton( text: _subtitle.edit, - onPressed: (_isReceiver || false) + onPressed: (_isReceiver) ? () { Navigator.of(context).push(MaterialPageRoute( builder: (_) => UpdateDeviceTransfer( From d80e28f7062d259a6084ffc2cb6a33e1f3204949 Mon Sep 17 00:00:00 2001 From: zaid_daoud Date: Fri, 18 Aug 2023 15:26:34 +0300 Subject: [PATCH 174/181] gaz refill timer --- .../providers/api/gas_refill_provider.dart | 58 ++++++------- .../user/gas_refill/request_gas_refill.dart | 11 ++- .../gas_refill/building_type_menu.dart | 78 +++++++++-------- .../gas_refill/department_type_menu.dart | 79 +++++++++-------- .../widgets/gas_refill/floor_type_menu.dart | 84 +++++++++++-------- 5 files changed, 178 insertions(+), 132 deletions(-) diff --git a/lib/controllers/providers/api/gas_refill_provider.dart b/lib/controllers/providers/api/gas_refill_provider.dart index 1c567e31..40a96203 100644 --- a/lib/controllers/providers/api/gas_refill_provider.dart +++ b/lib/controllers/providers/api/gas_refill_provider.dart @@ -1,4 +1,5 @@ import 'dart:convert'; +import 'dart:developer'; import 'package:flutter/cupertino.dart'; import 'package:http/http.dart'; @@ -113,10 +114,10 @@ class GasRefillProvider extends ChangeNotifier { "floor": {"id": floor?.id, "name": floor?.name, "value": floor?.value}, if (expectedDateTime != null) "expectedDate": expectedDateTime?.toIso8601String(), if (expectedDateTime != null) "expectedTime": expectedDateTime?.toIso8601String(), - if (startDate != null) "startDate": startDate?.toIso8601String(), - if (startDate != null) "startTime": startDate?.toIso8601String(), - if (endDate != null) "endDate": endDate?.toIso8601String(), - if (endDate != null) "endTime": endDate?.toIso8601String(), + if (timer?.startAt != null) "startDate": timer.startAt.toIso8601String(), + if (timer?.startAt != null) "startTime": timer.startAt.toIso8601String(), + if (timer?.endAt != null) "endDate": timer.endAt.toIso8601String(), + if (timer?.endAt != null) "endTime": timer.endAt.toIso8601String(), "department": {"id": department?.id, "departmentName": department?.name, "departmentCode": "", "ntCode": ""}, "GazRefillNo": "GR-${DateTime.now().toString().split(" ").first}", "status": model.status.toMap(), @@ -159,12 +160,12 @@ class GasRefillProvider extends ChangeNotifier { "status": newModel.status.toMap(), "expectedDate": newModel.expectedDate?.toIso8601String(), "expectedTime": newModel.expectedDate?.toIso8601String(), - "startDate": newModel.startDate?.toIso8601String(), - "startTime": newModel.startDate?.toIso8601String(), - "endDate": newModel.endDate?.toIso8601String(), - "endTime": newModel.endDate?.toIso8601String(), + if (timer?.startAt != null) "startDate": timer.startAt.toIso8601String(), + if (timer?.startAt != null) "startTime": timer.startAt.toIso8601String(), + if (timer?.endAt != null) "endDate": timer.endAt.toIso8601String(), + if (timer?.endAt != null) "endTime": timer.endAt.toIso8601String(), // "workingHours": ((endDate?.difference(startDate)?.inMinutes ?? 0) / 60), - 'workingHours': newModel.workingHours, + 'workingHours': timer.durationInSecond != null ? timer.durationInSecond / 60 / 60 : newModel.workingHours, "assignedEmployee": oldModel?.assignedEmployee?.id == null ? null : oldModel?.assignedEmployee?.toJson(), "site": hospital?.toMap(), "building": building?.toJson(includeFloors: false), @@ -183,24 +184,25 @@ class GasRefillProvider extends ChangeNotifier { "deliverdQty": model.deliveredQuantity, }) .toList(); - - Response response; - try { - response = await ApiManager.instance.put(URLs.updateGasRefill, body: body); - // response = await post( - // Uri.parse("$host${URLs.updateGasRefill}/${newModel.id}"), - // body: body, - // ); - - stateCode = response.statusCode; - if (response.statusCode >= 200 && response.statusCode < 300) { - oldModel.fromGasRefillModel(newModel); - notifyListeners(); - } - return response.statusCode; - } catch (error) { - return -1; - } + log(body.toString()); + return -1; + // Response response; + // try { + // response = await ApiManager.instance.put(URLs.updateGasRefill, body: body); + // // response = await post( + // // Uri.parse("$host${URLs.updateGasRefill}/${newModel.id}"), + // // body: body, + // // ); + // + // stateCode = response.statusCode; + // if (response.statusCode >= 200 && response.statusCode < 300) { + // oldModel.fromGasRefillModel(newModel); + // notifyListeners(); + // } + // return response.statusCode; + // } catch (error) { + // return -1; + // } } Hospital hospital; @@ -208,7 +210,5 @@ class GasRefillProvider extends ChangeNotifier { Floors floor; Departments department; DateTime expectedDateTime; - DateTime startDate; - DateTime endDate; TimerModel timer; } diff --git a/lib/views/pages/user/gas_refill/request_gas_refill.dart b/lib/views/pages/user/gas_refill/request_gas_refill.dart index abcb5efe..1278df23 100644 --- a/lib/views/pages/user/gas_refill/request_gas_refill.dart +++ b/lib/views/pages/user/gas_refill/request_gas_refill.dart @@ -12,6 +12,7 @@ import 'package:test_sa/models/gas_refill/gas_refill_details.dart'; import 'package:test_sa/models/gas_refill/gas_refill_model.dart'; import 'package:test_sa/models/lookup.dart'; import 'package:test_sa/models/subtitle.dart'; +import 'package:test_sa/models/timer_model.dart'; import 'package:test_sa/views/app_style/sizing.dart'; import 'package:test_sa/views/widgets/app_text_form_field.dart'; import 'package:test_sa/views/widgets/buttons/app_button.dart'; @@ -156,14 +157,15 @@ class _RequestGasRefillState extends State { if (widget.gasRefillModel != null) { _formModel.status = const Lookup(value: 0); _gasRefillProvider.expectedDateTime = _formModel.expectedDate; + _gasRefillProvider.timer = TimerModel(startAt: widget.gasRefillModel?.startDate, endAt: widget.gasRefillModel?.endDate); + } else { + _gasRefillProvider.timer = null; } HospitalsProvider().getHospitalsListByVal(searchVal: _userProvider.user?.clientName).then((value) { _gasRefillProvider.hospital = value?.firstWhere((element) => element.name == _userProvider.user?.clientName, orElse: () => null); _gasRefillProvider.building = _gasRefillProvider.hospital?.buildings?.firstWhere((element) => element.name == widget.gasRefillModel?.building?.name, orElse: () => null); _gasRefillProvider.floor = _gasRefillProvider.building?.floors?.firstWhere((element) => element.name == widget.gasRefillModel?.floor?.name, orElse: () => null); _gasRefillProvider.department = _gasRefillProvider.floor?.departments?.firstWhere((element) => element.name == widget.gasRefillModel?.department?.departmentName, orElse: () => null); - _gasRefillProvider.startDate = widget.gasRefillModel?.startDate; - _gasRefillProvider.endDate = widget.gasRefillModel?.endDate; _firstTime = false; setState(() {}); }); @@ -252,6 +254,7 @@ class _RequestGasRefillState extends State { BuildingTypeMenu( initialValue: _gasRefillProvider?.building, building: _gasRefillProvider?.hospital?.buildings, + enabled: widget.gasRefillModel == null, onSelect: (status) { _gasRefillProvider.building = status; setState(() {}); @@ -261,6 +264,7 @@ class _RequestGasRefillState extends State { FloorTypeMenu( initialValue: _gasRefillProvider?.floor, floors: _gasRefillProvider?.building?.floors, + enabled: widget.gasRefillModel == null, onSelect: (status) { _gasRefillProvider.floor = status; setState(() {}); @@ -270,6 +274,7 @@ class _RequestGasRefillState extends State { DepartmentTypeMenu( initialValue: _gasRefillProvider?.department, departments: _gasRefillProvider?.floor?.departments, + enabled: widget.gasRefillModel == null, onSelect: (status) { _gasRefillProvider.department = status; setState(() {}); @@ -286,8 +291,6 @@ class _RequestGasRefillState extends State { timer: _gasRefillProvider.timer, onChange: (timer) async { _gasRefillProvider.timer = timer; - _formModel.startDate ??= timer.startAt; - _gasRefillProvider.endDate = timer.endAt; _formModel.workingHours = num.tryParse((((timer?.durationInSecond ?? 0) / 60) / 60)?.toStringAsFixed(2) ?? "0"); return true; }, diff --git a/lib/views/widgets/gas_refill/building_type_menu.dart b/lib/views/widgets/gas_refill/building_type_menu.dart index afccd900..7509fe4d 100644 --- a/lib/views/widgets/gas_refill/building_type_menu.dart +++ b/lib/views/widgets/gas_refill/building_type_menu.dart @@ -3,12 +3,15 @@ import 'package:test_sa/models/hospital.dart'; import 'package:test_sa/views/app_style/colors.dart'; import 'package:test_sa/views/app_style/sizing.dart'; +import '../loaders/app_loading.dart'; + class BuildingTypeMenu extends StatefulWidget { final Function(Buildings) onSelect; Buildings initialValue; List building; + bool enabled; - BuildingTypeMenu({Key key, this.onSelect, this.initialValue, this.building = const []}) : super(key: key); + BuildingTypeMenu({Key key, this.onSelect, this.initialValue, this.building = const [], this.enabled = true}) : super(key: key); @override _BuildingTypeMenuState createState() { @@ -51,46 +54,55 @@ class _BuildingTypeMenuState extends State { decoration: BoxDecoration( color: AColors.inputFieldBackgroundColor, border: Border.all( - color: Color(0xffefefef), + color: const Color(0xffefefef), ), borderRadius: BorderRadius.circular(AppStyle.borderRadius * AppStyle.getScaleFactor(context)), // boxShadow: const [ // AppStyle.boxShadow // ] ), - child: DropdownButton( - value: _selectedBuilding, - iconSize: 24, - icon: const Icon(Icons.keyboard_arrow_down_rounded), - elevation: 0, - isExpanded: true, - hint: Text( - "Select Building", - style: Theme.of(context).textTheme.subtitle1, - ), - style: TextStyle(color: Theme.of(context).primaryColor), - underline: SizedBox.shrink(), - onChanged: (Buildings newValue) { - setState(() { - _selectedBuilding = newValue; - }); - widget.onSelect(newValue); - }, - items: _building?.map>((Buildings value) { - return DropdownMenuItem( - value: value, - child: Text( - value.name ?? "", - style: Theme.of(context).textTheme.subtitle1.copyWith( - color: Theme.of(context).primaryColor, - fontSize: 11, - //fontWeight: FontWeight.bold + child: widget.enabled + ? DropdownButton( + value: _selectedBuilding, + iconSize: 24, + icon: const Icon(Icons.keyboard_arrow_down_rounded), + elevation: 0, + isExpanded: true, + hint: Text( + "Select Building", + style: Theme.of(context).textTheme.subtitle1, + ), + style: TextStyle(color: Theme.of(context).primaryColor), + underline: const SizedBox.shrink(), + onChanged: (Buildings newValue) { + setState(() { + _selectedBuilding = newValue; + }); + widget.onSelect(newValue); + }, + items: _building?.map>((Buildings value) { + return DropdownMenuItem( + value: value, + child: Text( + value.name ?? "", + style: Theme.of(context).textTheme.subtitle1.copyWith( + color: Theme.of(context).primaryColor, + fontSize: 11, + //fontWeight: FontWeight.bold + ), ), + ); + })?.toList() ?? + [], + ) + : widget.initialValue == null + ? const Padding( + padding: EdgeInsets.all(8.0), + child: ALoading(), + ) + : ListTile( + title: Center(child: Text(widget.initialValue.name)), ), - ); - })?.toList() ?? - [], - ), ); } } diff --git a/lib/views/widgets/gas_refill/department_type_menu.dart b/lib/views/widgets/gas_refill/department_type_menu.dart index 1b58c200..bd887c74 100644 --- a/lib/views/widgets/gas_refill/department_type_menu.dart +++ b/lib/views/widgets/gas_refill/department_type_menu.dart @@ -3,12 +3,21 @@ import 'package:test_sa/models/hospital.dart'; import 'package:test_sa/views/app_style/colors.dart'; import 'package:test_sa/views/app_style/sizing.dart'; +import '../loaders/app_loading.dart'; + class DepartmentTypeMenu extends StatefulWidget { final Function(Departments) onSelect; Departments initialValue; List departments; + bool enabled; - DepartmentTypeMenu({Key key, this.onSelect, this.initialValue, this.departments = const []}) : super(key: key); + DepartmentTypeMenu({ + Key key, + this.onSelect, + this.initialValue, + this.departments = const [], + this.enabled = true, + }) : super(key: key); @override _DepartmentTypeMenuState createState() { @@ -58,39 +67,43 @@ class _DepartmentTypeMenuState extends State { // AppStyle.boxShadow // ] ), - child: DropdownButton( - value: _selected, - iconSize: 24, - icon: const Icon(Icons.keyboard_arrow_down_rounded), - elevation: 0, - isExpanded: true, - hint: Text( - "Select Department", - style: Theme.of(context).textTheme.subtitle1, - ), - style: TextStyle(color: Theme.of(context).primaryColor), - underline: SizedBox.shrink(), - onChanged: (Departments newValue) { - setState(() { - _selected = newValue; - }); - widget.onSelect(newValue); - }, - items: widget?.departments?.map>((Departments value) { - return DropdownMenuItem( - value: value, - child: Text( - value.name, - style: Theme.of(context).textTheme.subtitle1.copyWith( - color: Theme.of(context).primaryColor, - fontSize: 11, - //fontWeight: FontWeight.bold + child: widget.enabled + ? DropdownButton( + value: _selected, + iconSize: 24, + icon: const Icon(Icons.keyboard_arrow_down_rounded), + elevation: 0, + isExpanded: true, + hint: Text( + "Select Department", + style: Theme.of(context).textTheme.subtitle1, + ), + style: TextStyle(color: Theme.of(context).primaryColor), + underline: SizedBox.shrink(), + onChanged: (Departments newValue) { + setState(() { + _selected = newValue; + }); + widget.onSelect(newValue); + }, + items: widget?.departments?.map>((Departments value) { + return DropdownMenuItem( + value: value, + child: Text( + value.name, + style: Theme.of(context).textTheme.subtitle1.copyWith( + color: Theme.of(context).primaryColor, + fontSize: 11, + //fontWeight: FontWeight.bold + ), ), - ), - ); - })?.toList() ?? - [], - ), + ); + })?.toList() ?? + [], + ) + : widget.initialValue == null + ? const Padding(padding: EdgeInsets.all(8.0), child: ALoading()) + : ListTile(title: Center(child: Text(widget.initialValue.name))), ); } } diff --git a/lib/views/widgets/gas_refill/floor_type_menu.dart b/lib/views/widgets/gas_refill/floor_type_menu.dart index df5d3325..5c29fac1 100644 --- a/lib/views/widgets/gas_refill/floor_type_menu.dart +++ b/lib/views/widgets/gas_refill/floor_type_menu.dart @@ -3,12 +3,21 @@ import 'package:test_sa/models/hospital.dart'; import 'package:test_sa/views/app_style/colors.dart'; import 'package:test_sa/views/app_style/sizing.dart'; +import '../loaders/app_loading.dart'; + class FloorTypeMenu extends StatefulWidget { final Function(Floors) onSelect; Floors initialValue; List floors; + bool enabled; - FloorTypeMenu({Key key, this.onSelect, this.initialValue, this.floors = const []}) : super(key: key); + FloorTypeMenu({ + Key key, + this.onSelect, + this.initialValue, + this.floors = const [], + this.enabled = true, + }) : super(key: key); @override _FloorTypeMenuState createState() { @@ -51,46 +60,55 @@ class _FloorTypeMenuState extends State { decoration: BoxDecoration( color: AColors.inputFieldBackgroundColor, border: Border.all( - color: Color(0xffefefef), + color: const Color(0xffefefef), ), borderRadius: BorderRadius.circular(AppStyle.borderRadius * AppStyle.getScaleFactor(context)), // boxShadow: const [ // AppStyle.boxShadow // ] ), - child: DropdownButton( - value: _selected, - iconSize: 24, - icon: const Icon(Icons.keyboard_arrow_down_rounded), - elevation: 0, - isExpanded: true, - hint: Text( - "Select Floor", - style: Theme.of(context).textTheme.subtitle1, - ), - style: TextStyle(color: Theme.of(context).primaryColor), - underline: SizedBox.shrink(), - onChanged: (Floors newValue) { - setState(() { - _selected = newValue; - }); - widget.onSelect(newValue); - }, - items: _floors?.map>((Floors value) { - return DropdownMenuItem( - value: value, - child: Text( - value.name ?? "", - style: Theme.of(context).textTheme.subtitle1.copyWith( - color: Theme.of(context).primaryColor, - fontSize: 11, - //fontWeight: FontWeight.bold + child: widget.enabled + ? DropdownButton( + value: _selected, + iconSize: 24, + icon: const Icon(Icons.keyboard_arrow_down_rounded), + elevation: 0, + isExpanded: true, + hint: Text( + "Select Floor", + style: Theme.of(context).textTheme.subtitle1, + ), + style: TextStyle(color: Theme.of(context).primaryColor), + underline: const SizedBox.shrink(), + onChanged: (Floors newValue) { + setState(() { + _selected = newValue; + }); + widget.onSelect(newValue); + }, + items: _floors?.map>((Floors value) { + return DropdownMenuItem( + value: value, + child: Text( + value.name ?? "", + style: Theme.of(context).textTheme.subtitle1.copyWith( + color: Theme.of(context).primaryColor, + fontSize: 11, + //fontWeight: FontWeight.bold + ), ), + ); + })?.toList() ?? + [], + ) + : widget.initialValue == null + ? const Padding( + padding: EdgeInsets.all(8.0), + child: ALoading(), + ) + : ListTile( + title: Center(child: Text(widget.initialValue.name)), ), - ); - })?.toList() ?? - [], - ), ); } } From 614426853b53ca720019c1ca89e739dd0d8ac1a3 Mon Sep 17 00:00:00 2001 From: zaid_daoud Date: Sun, 20 Aug 2023 11:10:04 +0300 Subject: [PATCH 175/181] [API doesn't support the required parameters] add search dialog to track asset transfer --- .../api/device_transfer_provider.dart | 7 +- lib/models/device/device_transfer_search.dart | 49 +++++ .../track_device_transfer.dart | 54 ++--- .../search/asset_transfer_search_dialog.dart | 202 ++++++++++++++++++ .../search/service_request_search_bar.dart | 2 +- 5 files changed, 287 insertions(+), 27 deletions(-) create mode 100644 lib/models/device/device_transfer_search.dart create mode 100644 lib/views/widgets/search/asset_transfer_search_dialog.dart diff --git a/lib/controllers/providers/api/device_transfer_provider.dart b/lib/controllers/providers/api/device_transfer_provider.dart index c5677c75..cdd685bd 100644 --- a/lib/controllers/providers/api/device_transfer_provider.dart +++ b/lib/controllers/providers/api/device_transfer_provider.dart @@ -6,6 +6,7 @@ import 'package:test_sa/controllers/api_routes/api_manager.dart'; import 'package:test_sa/controllers/api_routes/urls.dart'; import 'package:test_sa/models/device/device_transfer.dart'; import 'package:test_sa/models/device/device_transfer_info.dart'; +import 'package:test_sa/models/device/device_transfer_search.dart'; import 'package:test_sa/models/user.dart'; import '../../../models/hospital.dart'; @@ -14,6 +15,8 @@ class DeviceTransferProvider extends ChangeNotifier { // number of items call in each request final pageItemNumber = 12; + DeviceTransferSearch deviceTransferSearch = DeviceTransferSearch(); + //reset provider data void reset() { items = null; @@ -60,7 +63,6 @@ class DeviceTransferProvider extends ChangeNotifier { Future getRequests({ @required String host, @required User user, - bool mostRecent, }) async { if (isLoading == true) return -2; isLoading = true; @@ -70,6 +72,7 @@ class DeviceTransferProvider extends ChangeNotifier { Map body = {}; body["pageNumber"] = (items?.length ?? 0) ~/ pageItemNumber + 1; body["pageSize"] = pageItemNumber; + body.addAll(deviceTransferSearch.toMap()); response = await ApiManager.instance.post( URLs.getDeviceTransfer, @@ -83,7 +86,7 @@ class DeviceTransferProvider extends ChangeNotifier { List itemsPage = listJson.map((request) => DeviceTransfer.fromJson(request)).toList(); items ??= []; items.addAll(itemsPage.toSet().toList()); - sortMostRecent(items, mostRecent); + sortMostRecent(items, deviceTransferSearch.mostRecent); print(listJson); if (itemsPage.length == pageItemNumber) { diff --git a/lib/models/device/device_transfer_search.dart b/lib/models/device/device_transfer_search.dart new file mode 100644 index 00000000..14cf6956 --- /dev/null +++ b/lib/models/device/device_transfer_search.dart @@ -0,0 +1,49 @@ +import '../lookup.dart'; + +class DeviceTransferSearch { + String assetName, assetNumber, site; + bool mostRecent; + Lookup dateOperator; + String from, to; + + DeviceTransferSearch({ + this.assetName, + this.assetNumber, + this.site, + this.mostRecent, + this.dateOperator, + this.from, + this.to, + }); + + Map toMap() { + Map search = {}; + if (assetName != null && assetName.isNotEmpty) { + search["assetName"] = assetName; + } + if (assetNumber != null && assetNumber.isNotEmpty) { + search["assetNumber"] = assetNumber; + } + if (site != null && site.isNotEmpty) { + search["site"] = site; + } + if (dateOperator != null && from != null) { + search["requestedDateSymbol"] = dateOperator.toMap(); + search["requestedDateFrom"] = from; + } + if (dateOperator != null && to != null) { + search["requestedDateTo"] = to; + } + return search; + } + + void fromSearch(DeviceTransferSearch newSearch) { + assetName = newSearch.assetName; + assetNumber = newSearch.assetNumber; + site = newSearch.site; + mostRecent = newSearch.mostRecent; + from = newSearch.from; + to = newSearch.to; + dateOperator = newSearch.dateOperator; + } +} diff --git a/lib/views/pages/device_transfer/track_device_transfer.dart b/lib/views/pages/device_transfer/track_device_transfer.dart index 1ce0e2fa..1610640c 100644 --- a/lib/views/pages/device_transfer/track_device_transfer.dart +++ b/lib/views/pages/device_transfer/track_device_transfer.dart @@ -1,15 +1,16 @@ import 'package:flutter/material.dart'; import 'package:provider/provider.dart'; -import 'package:test_sa/controllers/localization/localization.dart'; import 'package:test_sa/controllers/providers/api/device_transfer_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/models/subtitle.dart'; +import 'package:test_sa/models/device/device_transfer_search.dart'; import 'package:test_sa/views/app_style/colors.dart'; import 'package:test_sa/views/widgets/buttons/app_back_button.dart'; import 'package:test_sa/views/widgets/device_trancfer/device_transfer_list.dart'; import 'package:test_sa/views/widgets/loaders/loading_manager.dart'; -import 'package:test_sa/views/widgets/switch_button.dart'; +import 'package:test_sa/views/widgets/search/asset_transfer_search_dialog.dart'; + +import '../../widgets/buttons/app_icon_button.dart'; class TrackDeviceTransferPage extends StatefulWidget { static const String id = "/track-device-transfer"; @@ -24,13 +25,12 @@ class _TrackDeviceTransferPageState extends State with DeviceTransferProvider _deviceTransferProvider; UserProvider _userProvider; SettingProvider _settingProvider; - bool mostRecent = false; + @override Widget build(BuildContext context) { _deviceTransferProvider = Provider.of(context); _userProvider = Provider.of(context); _settingProvider = Provider.of(context); - Subtitle _subtitle = AppLocalization.of(context).subtitle; return Scaffold( body: SafeArea( @@ -56,7 +56,7 @@ class _TrackDeviceTransferPageState extends State with children: [ Row( children: [ - ABackButton(), + const ABackButton(), Expanded( child: Center( child: Text( @@ -65,29 +65,35 @@ class _TrackDeviceTransferPageState extends State with ), ), ), - const SizedBox( - width: 48, - ) + AIconButton( + iconData: Icons.search, + color: AColors.secondaryColor, + buttonSize: 42, + backgroundColor: AColors.white, + onPressed: () async { + DeviceTransferSearch temp = await showModalBottomSheet( + context: context, + isScrollControlled: true, + builder: (context) { + return AssetTransferSearchDialog(initialSearchValue: _deviceTransferProvider.deviceTransferSearch); + }); + if (temp != null) { + _deviceTransferProvider.deviceTransferSearch = temp; + _deviceTransferProvider.reset(); + setState(() {}); + await _deviceTransferProvider.getRequests( + user: _userProvider.user, + host: _settingProvider.host, + ); + } + }, + ), + const SizedBox(width: 16), ], ), ], ), ), - Padding( - padding: const EdgeInsets.symmetric(horizontal: 16.0), - child: ASwitchButton( - title: "Most Recent", - value: mostRecent, - onChange: (value) async { - mostRecent = value; - await _deviceTransferProvider.getRequests( - user: _userProvider.user, - host: _settingProvider.host, - mostRecent: mostRecent, - ); - }, - ), - ), Expanded( child: DeviceTransferList( nextPage: _deviceTransferProvider.nextPage, diff --git a/lib/views/widgets/search/asset_transfer_search_dialog.dart b/lib/views/widgets/search/asset_transfer_search_dialog.dart new file mode 100644 index 00000000..59539238 --- /dev/null +++ b/lib/views/widgets/search/asset_transfer_search_dialog.dart @@ -0,0 +1,202 @@ +import 'package:flutter/material.dart'; +import 'package:test_sa/controllers/localization/localization.dart'; +import 'package:test_sa/models/device/device_transfer_search.dart'; +import 'package:test_sa/models/subtitle.dart'; +import 'package:test_sa/views/app_style/sizing.dart'; +import 'package:test_sa/views/widgets/buttons/app_button.dart'; +import 'package:test_sa/views/widgets/buttons/app_small_button.dart'; + +import '../app_text_form_field.dart'; +import '../date_and_time/date_picker.dart'; +import '../status/report/service_report_visit_date_operator.dart'; +import '../switch_button.dart'; +import '../titles/app_sub_title.dart'; + +class AssetTransferSearchDialog extends StatefulWidget { + final DeviceTransferSearch initialSearchValue; + final bool expandedSearch; + final Function(DeviceTransferSearch) onSearch; + + const AssetTransferSearchDialog({Key key, this.initialSearchValue, this.expandedSearch, this.onSearch}) : super(key: key); + @override + AssetTransferSearchDialogState createState() => AssetTransferSearchDialogState(); +} + +class AssetTransferSearchDialogState extends State with TickerProviderStateMixin { + DeviceTransferSearch _search; + final GlobalKey _formKey = GlobalKey(); + + @override + void initState() { + super.initState(); + _search = DeviceTransferSearch(); + _search.fromSearch(widget.initialSearchValue); + } + + @override + Widget build(BuildContext context) { + Subtitle subtitle = AppLocalization.of(context).subtitle; + return SizedBox( + height: MediaQuery.of(context).size.height / 1.3, + child: Form( + key: _formKey, + child: ListView( + padding: const EdgeInsets.symmetric(vertical: 8, horizontal: 16), + children: [ + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + ASmallButton( + text: subtitle.cancel, + onPressed: () { + Navigator.of(context).pop(); + }, + ), + ASmallButton( + text: subtitle.search, + onPressed: () { + if (!_formKey.currentState.validate()) { + return; + } + _formKey.currentState.save(); + Navigator.of(context).pop(_search); + }, + ) + ], + ), + ASwitchButton( + title: "Most Recent", + value: _search.mostRecent ?? false, + onChange: (value) { + _search.mostRecent = value; + setState(() {}); + }, + ), + SizedBox( + height: 8.0 * AppStyle.getScaleFactor(context), + ), + ATextFormField( + initialValue: _search.assetNumber, + hintText: subtitle.assetNumber, + style: Theme.of(context).textTheme.headline6, + textInputAction: TextInputAction.search, + onAction: () { + if (!_formKey.currentState.validate()) { + return; + } + _formKey.currentState.save(); + Navigator.of(context).pop(_search); + }, + onSaved: (value) { + _search.assetNumber = value; + }, + ), + SizedBox( + height: 8.0 * AppStyle.getScaleFactor(context), + ), + ATextFormField( + initialValue: _search.assetName, + hintText: subtitle.assetName, + style: Theme.of(context).textTheme.headline6, + textInputAction: TextInputAction.search, + onAction: () { + if (!_formKey.currentState.validate()) { + return; + } + _formKey.currentState.save(); + Navigator.of(context).pop(_search); + }, + onSaved: (value) { + _search.site = value; + }, + ), + SizedBox( + height: 8.0 * AppStyle.getScaleFactor(context), + ), + ATextFormField( + initialValue: _search.site, + hintText: subtitle.site, + style: Theme.of(context).textTheme.headline6, + textInputAction: TextInputAction.search, + onAction: () { + if (!_formKey.currentState.validate()) { + return; + } + _formKey.currentState.save(); + Navigator.of(context).pop(_search); + }, + onSaved: (value) { + _search.assetName = value; + }, + ), + SizedBox( + height: 8.0 * AppStyle.getScaleFactor(context), + ), + const ASubTitle("Request Date"), + const SizedBox(height: 4), + ServiceReportVisitDateOperator( + initialValue: _search.dateOperator, + onSelect: (status) { + _search.dateOperator = status; + setState(() {}); + }, + ), + Row( + children: [ + Expanded( + child: Column( + crossAxisAlignment: CrossAxisAlignment.stretch, + children: [ + if (_search?.dateOperator?.name?.toLowerCase()?.contains("between") ?? false) const ASubTitle("From"), + ADatePicker( + date: DateTime.tryParse(_search.from ?? ""), + from: DateTime(1950), + onDatePicker: (date) { + _search.from = date?.toIso8601String(); + setState(() {}); + }, + ), + ], + ), + ), + if (_search?.dateOperator?.name?.toLowerCase()?.contains("between") ?? false) const SizedBox(width: 16), + if (_search?.dateOperator?.name?.toLowerCase()?.contains("between") ?? false) + Expanded( + child: Column( + crossAxisAlignment: CrossAxisAlignment.stretch, + children: [ + const ASubTitle("To"), + ADatePicker( + date: DateTime.tryParse(_search.to ?? ""), + from: DateTime(1950), + onDatePicker: (date) { + _search.to = date?.toIso8601String(); + setState(() {}); + }, + ), + ], + ), + ), + ], + ), + const SizedBox(width: 16), + Visibility( + visible: _search.toMap().isNotEmpty, + child: Padding( + padding: const EdgeInsets.symmetric(vertical: 8, horizontal: 16), + child: AButton( + padding: EdgeInsets.zero, + text: subtitle.clearSearch, + onPressed: () { + _search = DeviceTransferSearch(); + Navigator.of(context).pop(_search); + }, + ), + ), + ), + ], + ), + ), + ); + } +} diff --git a/lib/views/widgets/search/service_request_search_bar.dart b/lib/views/widgets/search/service_request_search_bar.dart index adabc6d8..682b4177 100644 --- a/lib/views/widgets/search/service_request_search_bar.dart +++ b/lib/views/widgets/search/service_request_search_bar.dart @@ -244,7 +244,7 @@ class _ServiceRequestsSearchDialogState extends State Date: Sun, 20 Aug 2023 12:00:29 +0300 Subject: [PATCH 176/181] in ppm summery if no employee found it will be empty --- .../pages/user/visits/visit_details.dart | 46 ++++---- lib/views/widgets/visits/visit_item.dart | 100 +++++++----------- lib/views/widgets/visits/visits_list.dart | 28 ++--- 3 files changed, 76 insertions(+), 98 deletions(-) diff --git a/lib/views/pages/user/visits/visit_details.dart b/lib/views/pages/user/visits/visit_details.dart index 72143a2d..7fb05200 100644 --- a/lib/views/pages/user/visits/visit_details.dart +++ b/lib/views/pages/user/visits/visit_details.dart @@ -13,20 +13,18 @@ import 'package:test_sa/views/widgets/loaders/image_loader.dart'; import 'package:test_sa/views/widgets/requests/info_row.dart'; import 'package:test_sa/views/widgets/visits/visit_status.dart'; -import '../../../../controllers/providers/api/regular_visits_provider.dart'; import '../../../../controllers/providers/api/user_provider.dart'; import '../../../../models/enums/user_types.dart'; class VisitDetailsPage extends StatelessWidget { - static final String id = "/visit-details"; + static const String id = "/visit-details"; final Visit visit; const VisitDetailsPage({Key key, this.visit}) : super(key: key); @override Widget build(BuildContext context) { - Subtitle _subtitle = AppLocalization.of(context).subtitle; - final regularVisitsProvider = Provider.of(context); - UserProvider _userProvider = Provider.of(context); + Subtitle subtitle = AppLocalization.of(context).subtitle; + UserProvider userProvider = Provider.of(context); return Scaffold( body: SafeArea( @@ -37,16 +35,16 @@ class VisitDetailsPage extends StatelessWidget { padding: const EdgeInsets.symmetric(horizontal: 0, vertical: 4), child: Row( children: [ - ABackButton(), + const ABackButton(), Expanded( child: Center( child: Text( - _subtitle.visitInformation, - style: Theme.of(context).textTheme.headline6.copyWith(color: AColors.white, fontStyle: FontStyle.italic), + subtitle.visitInformation, + style: Theme.of(context).textTheme.titleLarge.copyWith(color: AColors.white, fontStyle: FontStyle.italic), ), ), ), - if (_userProvider?.user?.type == UsersTypes.engineer) + if (userProvider?.user?.type == UsersTypes.engineer) AIconButton( iconData: Icons.edit, color: AColors.white, @@ -60,15 +58,15 @@ class VisitDetailsPage extends StatelessWidget { ))); }, ), - SizedBox(width: 42) + const SizedBox(width: 42) ], ), ), Expanded( child: ListView( - padding: EdgeInsets.symmetric(horizontal: 16), + padding: const EdgeInsets.symmetric(horizontal: 16), children: [ - SizedBox( + const SizedBox( height: 8, ), MaterialButton( @@ -97,7 +95,7 @@ class VisitDetailsPage extends StatelessWidget { ), ), ), - SizedBox( + const SizedBox( height: 8, ), SizedBox( @@ -106,11 +104,11 @@ class VisitDetailsPage extends StatelessWidget { images: visit.images, ), ), - SizedBox( + const SizedBox( height: 8, ), RequestInfoRow( - title: _subtitle.code, + title: subtitle.code, info: visit.serialNumber, ), RequestInfoRow( @@ -118,27 +116,27 @@ class VisitDetailsPage extends StatelessWidget { info: visit.deviceNumber, ), RequestInfoRow( - title: _subtitle.deviceName, + title: subtitle.deviceName, content: visit.deviceEnglishName, ), RequestInfoRow( - title: _subtitle.deviceSN, + title: subtitle.deviceSN, info: visit.deviceSerialNumber, ), RequestInfoRow( - title: _subtitle.expectDate, + title: subtitle.expectDate, info: visit.expectDate, ), RequestInfoRow( - title: _subtitle.actualDate, + title: subtitle.actualDate, info: visit.actualDate, ), Row( children: [ Expanded( child: Text( - "${_subtitle.status} : ", - style: Theme.of(context).textTheme.subtitle1.copyWith(fontWeight: FontWeight.bold), + "${subtitle.status} : ", + style: Theme.of(context).textTheme.titleMedium.copyWith(fontWeight: FontWeight.bold), textScaleFactor: AppStyle.getScaleFactor(context), ), ), @@ -151,15 +149,15 @@ class VisitDetailsPage extends StatelessWidget { color: Theme.of(context).primaryColor, ), RequestInfoRow( - title: _subtitle.contactStatus, + title: subtitle.contactStatus, info: visit.assignTo, ), RequestInfoRow( - title: _subtitle.engineerName, + title: subtitle.engineerName, info: visit.employName, ), RequestInfoRow( - title: _subtitle.hospital, + title: subtitle.hospital, content: visit.hospitalName, ), ], diff --git a/lib/views/widgets/visits/visit_item.dart b/lib/views/widgets/visits/visit_item.dart index 995a0498..fc8e2052 100644 --- a/lib/views/widgets/visits/visit_item.dart +++ b/lib/views/widgets/visits/visit_item.dart @@ -21,27 +21,28 @@ class VisitItem extends StatelessWidget { @override Widget build(BuildContext context) { - UserProvider _userProvider = Provider.of(context); + UserProvider userProvider = Provider.of(context); Color itemColor = index % 2 == 0 ? Theme.of(context).colorScheme.primary : Theme.of(context).colorScheme.onPrimary; Color onItemColor = index % 2 != 0 ? Theme.of(context).colorScheme.primary : Theme.of(context).colorScheme.onPrimary; - Subtitle _subtitle = AppLocalization.of(context).subtitle; + Subtitle subtitle = AppLocalization.of(context).subtitle; return Padding( padding: const EdgeInsets.symmetric(vertical: 4), child: ElevatedButton( style: ElevatedButton.styleFrom( - padding: EdgeInsets.symmetric(vertical: 8, horizontal: 8), - primary: itemColor, + padding: const EdgeInsets.symmetric(vertical: 8, horizontal: 8), + backgroundColor: itemColor, shape: RoundedRectangleBorder( borderRadius: BorderRadius.circular(AppStyle.getBorderRadius(context)), ), ), onPressed: () { - if (activeSelectMod && _userProvider.user.type == UsersTypes.engineer) + if (activeSelectMod && userProvider.user.type == UsersTypes.engineer) { onSelect(visit); - else + } else { onPressed(visit); + } }, - onLongPress: _userProvider.user.type == UsersTypes.engineer + onLongPress: userProvider.user.type == UsersTypes.engineer ? () { onLongPress(visit); } @@ -53,12 +54,12 @@ class VisitItem extends StatelessWidget { children: [ Expanded( child: Text( - "S.N: " + visit.deviceSerialNumber ?? "No serial number", - style: Theme.of(context).textTheme.headline6.copyWith(color: onItemColor, fontSize: 16, fontWeight: FontWeight.bold), + "S.N: ${visit.deviceSerialNumber}" ?? "No serial number", + style: Theme.of(context).textTheme.titleLarge.copyWith(color: onItemColor, fontSize: 16, fontWeight: FontWeight.bold), ), ), AnimatedSwitcher( - duration: Duration(milliseconds: 400), + duration: const Duration(milliseconds: 400), child: Visibility( key: ValueKey(activeSelectMod), visible: activeSelectMod, @@ -83,10 +84,7 @@ class VisitItem extends StatelessWidget { ), Text( visit.deviceNumber ?? "", - style: Theme.of(context).textTheme.subtitle1.copyWith( - color: onItemColor, - fontSize: 14, - ), + style: Theme.of(context).textTheme.titleMedium.copyWith(color: onItemColor, fontSize: 14), ), Divider( color: onItemColor, @@ -96,7 +94,7 @@ class VisitItem extends StatelessWidget { Expanded( child: Text( visit.hospitalName ?? "No client found", - style: Theme.of(context).textTheme.subtitle1.copyWith( + style: Theme.of(context).textTheme.titleMedium.copyWith( color: onItemColor, fontSize: 14, ), @@ -106,29 +104,30 @@ class VisitItem extends StatelessWidget { ), Text( visit.modelAndBrand ?? "", - style: Theme.of(context).textTheme.subtitle1.copyWith( + style: Theme.of(context).textTheme.titleMedium.copyWith( color: onItemColor, fontSize: 14, ), ), - Divider(color: onItemColor), - Row( - children: [ - Expanded( - child: Text( - visit.employName ?? "No employ found", - style: Theme.of(context).textTheme.headline6.copyWith(color: onItemColor, fontSize: 14, fontWeight: FontWeight.bold), + if (visit.employName != null && visit.employName.isNotEmpty) Divider(color: onItemColor), + if (visit.employName != null && visit.employName.isNotEmpty) + Row( + children: [ + Expanded( + child: Text( + visit.employName ?? "No employ found", + style: Theme.of(context).textTheme.titleLarge.copyWith(color: onItemColor, fontSize: 14, fontWeight: FontWeight.bold), + ), ), - ), - // Text( - // visit.contactStatus ?? "", - // style: Theme.of(context).textTheme.subtitle1.copyWith( - // color: onItemColor, - // fontSize: 14, - // ), - // ), - ], - ), + // Text( + // visit.contactStatus ?? "", + // style: Theme.of(context).textTheme.subtitle1.copyWith( + // color: onItemColor, + // fontSize: 14, + // ), + // ), + ], + ), Divider( color: onItemColor, ), @@ -139,18 +138,12 @@ class VisitItem extends StatelessWidget { crossAxisAlignment: CrossAxisAlignment.start, children: [ Text( - _subtitle.expectDate, - style: Theme.of(context).textTheme.headline6.copyWith( - color: onItemColor, - fontSize: 14, - ), + subtitle.expectDate, + style: Theme.of(context).textTheme.titleLarge.copyWith(color: onItemColor, fontSize: 14), ), Text( - visit.expectDate ?? _subtitle.noDateFound, - style: Theme.of(context).textTheme.headline6.copyWith( - color: onItemColor, - fontSize: 14, - ), + visit.expectDate ?? subtitle.noDateFound, + style: Theme.of(context).textTheme.titleLarge.copyWith(color: onItemColor, fontSize: 14), ), ], ), @@ -159,25 +152,12 @@ class VisitItem extends StatelessWidget { crossAxisAlignment: CrossAxisAlignment.start, children: [ Text( - _subtitle.actualDate, - style: Theme.of(context).textTheme.headline6.copyWith( - color: onItemColor, - fontSize: 14, - ), + subtitle.actualDate, + style: Theme.of(context).textTheme.titleLarge.copyWith(color: onItemColor, fontSize: 14), ), Text( - visit.actualDate ?? _subtitle.noDateFound, - style: Theme.of(context).textTheme.headline6.copyWith( - color: onItemColor, - fontSize: 14, - ), - // Text( - // visit.contactStatus ?? "", - // style: Theme.of(context).textTheme.subtitle1.copyWith( - // color: onItemColor, - // fontSize: 14, - // ), - // ), + visit.actualDate ?? subtitle.noDateFound, + style: Theme.of(context).textTheme.titleLarge.copyWith(color: onItemColor, fontSize: 14), ), ], ), diff --git a/lib/views/widgets/visits/visits_list.dart b/lib/views/widgets/visits/visits_list.dart index d4a867c8..bb327679 100644 --- a/lib/views/widgets/visits/visits_list.dart +++ b/lib/views/widgets/visits/visits_list.dart @@ -21,7 +21,7 @@ class VisitsList extends StatefulWidget { } class _VisitsListState extends State { - List _selectedVisits = []; + final List _selectedVisits = []; @override void initState() { @@ -31,10 +31,10 @@ class _VisitsListState extends State { @override Widget build(BuildContext context) { - Subtitle _subtitle = AppLocalization.of(context).subtitle; - if (widget.visits.length == 0) { + Subtitle subtitle = AppLocalization.of(context).subtitle; + if (widget.visits.isEmpty) { return NoItemFound( - message: _subtitle.noVisitsFound, + message: subtitle.noVisitsFound, ); } return Stack( @@ -45,13 +45,13 @@ class _VisitsListState extends State { child: ListView.builder( //physics: BouncingScrollPhysics(), itemCount: widget.visits.length, - padding: EdgeInsets.symmetric(horizontal: 16, vertical: 8), + padding: const EdgeInsets.symmetric(horizontal: 16, vertical: 8), itemBuilder: (context, itemIndex) { - Visit _visit = widget.visits[itemIndex]; - bool _isSelected = _selectedVisits.contains(_visit); + Visit visit = widget.visits[itemIndex]; + bool isSelected = _selectedVisits.contains(visit); return VisitItem( - visit: _visit, - isSelected: _isSelected, + visit: visit, + isSelected: isSelected, index: itemIndex, activeSelectMod: _selectedVisits.isNotEmpty, onPressed: (visit) { @@ -61,7 +61,7 @@ class _VisitsListState extends State { ))); }, onSelect: (visit) { - if (_isSelected) { + if (isSelected) { _selectedVisits.remove(visit); } else { _selectedVisits.add(visit); @@ -69,7 +69,7 @@ class _VisitsListState extends State { setState(() {}); }, onLongPress: (visit) { - if (_isSelected) { + if (isSelected) { _selectedVisits.remove(visit); } else { _selectedVisits.add(visit); @@ -84,7 +84,7 @@ class _VisitsListState extends State { child: Padding( padding: EdgeInsets.all(8.0 * AppStyle.getScaleFactor(context)), child: AnimatedSwitcher( - duration: Duration(milliseconds: 400), + duration: const Duration(milliseconds: 400), child: Visibility( key: ValueKey(_selectedVisits.isNotEmpty), visible: _selectedVisits.isNotEmpty, @@ -93,7 +93,7 @@ class _VisitsListState extends State { children: [ FloatingActionButton( heroTag: "cancel", - child: Icon(Icons.cancel), + child: const Icon(Icons.cancel), onPressed: () { _selectedVisits.clear(); setState(() {}); @@ -101,7 +101,7 @@ class _VisitsListState extends State { ), FloatingActionButton( heroTag: "edit", - child: Icon(Icons.edit), + child: const Icon(Icons.edit), onPressed: () { if (!widget.visits.contains(_selectedVisits.first)) { _selectedVisits.clear(); From 311c8c974d65ad549744154025b7f493c5ab6ab9 Mon Sep 17 00:00:00 2001 From: Sikander Saleem Date: Sun, 20 Aug 2023 12:34:09 +0300 Subject: [PATCH 177/181] gaz refill status fix, when change from web. --- lib/views/pages/user/gas_refill/request_gas_refill.dart | 2 +- lib/views/pages/user/requests/request_details.dart | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/lib/views/pages/user/gas_refill/request_gas_refill.dart b/lib/views/pages/user/gas_refill/request_gas_refill.dart index abcb5efe..5300a3ee 100644 --- a/lib/views/pages/user/gas_refill/request_gas_refill.dart +++ b/lib/views/pages/user/gas_refill/request_gas_refill.dart @@ -154,7 +154,7 @@ class _RequestGasRefillState extends State { } if (_firstTime) { if (widget.gasRefillModel != null) { - _formModel.status = const Lookup(value: 0); + _formModel.status = widget.gasRefillModel?.status ?? const Lookup(value: 0); _gasRefillProvider.expectedDateTime = _formModel.expectedDate; } HospitalsProvider().getHospitalsListByVal(searchVal: _userProvider.user?.clientName).then((value) { diff --git a/lib/views/pages/user/requests/request_details.dart b/lib/views/pages/user/requests/request_details.dart index 75a69aa0..a794e5f5 100644 --- a/lib/views/pages/user/requests/request_details.dart +++ b/lib/views/pages/user/requests/request_details.dart @@ -27,7 +27,7 @@ import '../../../../models/service_request/search_work_order.dart'; import 'report/future_service_report.dart'; class RequestDetailsPage extends StatelessWidget { - static final String id = "/call-details"; + static const String id = "/call-details"; final ServiceRequest serviceRequest; const RequestDetailsPage({Key key, this.serviceRequest}) : super(key: key); From 7a02b2e715fb66f540b4f3c8b85d34590e12facf Mon Sep 17 00:00:00 2001 From: zaid_daoud Date: Sun, 20 Aug 2023 12:38:24 +0300 Subject: [PATCH 178/181] fault description is disabled when create new work order --- .../user/requests/report/create_service_report.dart | 1 + .../status/report/service_report_fault_description.dart | 9 +++++---- 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/lib/views/pages/user/requests/report/create_service_report.dart b/lib/views/pages/user/requests/report/create_service_report.dart index 89fdf8da..ff09c44c 100644 --- a/lib/views/pages/user/requests/report/create_service_report.dart +++ b/lib/views/pages/user/requests/report/create_service_report.dart @@ -545,6 +545,7 @@ class _CreateServiceReportState extends State with TickerPr ServiceReportFaultDescription( requestId: widget.request?.id, initialValue: _serviceReport.faultDescription, + enabled: false, onSelect: (status) { _serviceReport.faultDescription = status; setState(() {}); diff --git a/lib/views/widgets/status/report/service_report_fault_description.dart b/lib/views/widgets/status/report/service_report_fault_description.dart index 544fcbb3..facda9dd 100644 --- a/lib/views/widgets/status/report/service_report_fault_description.dart +++ b/lib/views/widgets/status/report/service_report_fault_description.dart @@ -13,8 +13,9 @@ class ServiceReportFaultDescription extends StatelessWidget { final String requestId; final Function(FaultDescription) onSelect; final FaultDescription initialValue; + final bool enabled; - const ServiceReportFaultDescription({Key key, this.requestId, this.onSelect, this.initialValue}) : super(key: key); + const ServiceReportFaultDescription({Key key, this.requestId, this.onSelect, this.initialValue, this.enabled = true}) : super(key: key); @override Widget build(BuildContext context) { SettingProvider settingProvider = Provider.of(context); @@ -28,9 +29,9 @@ class ServiceReportFaultDescription extends StatelessWidget { menuProvider.reset(); await menuProvider.getCallRequestForWorkOrder(user: userProvider.user, host: settingProvider.host, requestId: requestId); }, - child: (menuProvider.items?.isEmpty ?? true) - ? const ATextFormField( - initialValue: "", + child: ((menuProvider.items?.isEmpty ?? true) || (!enabled)) + ? ATextFormField( + initialValue: (!enabled) ? initialValue?.defectName ?? "" : "", enable: false, ) : FaultDescriptionMenu( From 799c9a50bda162195e6a1db445ec0cc10eab82a6 Mon Sep 17 00:00:00 2001 From: zaid_daoud Date: Sun, 20 Aug 2023 15:01:37 +0300 Subject: [PATCH 179/181] nothing --- lib/views/widgets/sound/record_sound.dart | 16 ++++++---------- 1 file changed, 6 insertions(+), 10 deletions(-) diff --git a/lib/views/widgets/sound/record_sound.dart b/lib/views/widgets/sound/record_sound.dart index b56c1a5e..d10119e6 100644 --- a/lib/views/widgets/sound/record_sound.dart +++ b/lib/views/widgets/sound/record_sound.dart @@ -24,7 +24,6 @@ class _RecordSoundState extends State { FlutterSoundRecorder _myRecorder = FlutterSoundRecorder(); bool _recorderIsOpened = false; bool _recording = false; - bool _fastTab = false; String _record; Artboard _rive; @@ -69,13 +68,14 @@ class _RecordSoundState extends State { } _startRecording() async { - _fastTab = false; // await Permission.camera PermissionStatus status = await Permission.microphone.request(); if (!status.isGranted) { PermissionStatus status = await Permission.microphone.request(); - Fluttertoast.showToast(msg: "Permission Denied"); - return; + if (!status.isGranted) { + Fluttertoast.showToast(msg: "Permission Denied"); + return; + } } _rive.addController(SimpleAnimation('recording')); if (!_recorderIsOpened) { @@ -91,7 +91,6 @@ class _RecordSoundState extends State { _stopRecording() async { if (!_recording) { - _fastTab = true; setState(() {}); return; } @@ -182,11 +181,6 @@ class _RecordSoundState extends State { color: Colors.transparent, child: GestureDetector( //key: ValueKey("voice"), - child: const Padding( - padding: EdgeInsets.all(12.0), - child: Icon(Icons.mic), - ), - onTapDown: widget.enabled ? (TapDownDetails details) async { _startRecording(); @@ -202,6 +196,8 @@ class _RecordSoundState extends State { _cancelRecording(); } : null, + //key: ValueKey("voice"), + child: const Padding(padding: EdgeInsets.all(12.0), child: Icon(Icons.mic)), ), ), ], From 591e1513a209bb4e43d5f3839e8dfe999647ca77 Mon Sep 17 00:00:00 2001 From: Sikander Saleem Date: Sun, 20 Aug 2023 15:43:35 +0300 Subject: [PATCH 180/181] enable sub workorder & name to create --- lib/views/pages/user/land_page.dart | 17 +++++++++-------- 1 file changed, 9 insertions(+), 8 deletions(-) diff --git a/lib/views/pages/user/land_page.dart b/lib/views/pages/user/land_page.dart index a1405506..e249206d 100644 --- a/lib/views/pages/user/land_page.dart +++ b/lib/views/pages/user/land_page.dart @@ -23,6 +23,7 @@ import 'package:test_sa/views/app_style/colors.dart'; import 'package:test_sa/views/app_style/sizing.dart'; import 'package:test_sa/views/pages/device_transfer/request_device_transfer.dart'; import 'package:test_sa/views/pages/device_transfer/track_device_transfer.dart'; +import 'package:test_sa/views/pages/sub_workorder/search_sub_workorder_page.dart'; import 'package:test_sa/views/pages/user/gas_refill/request_gas_refill.dart'; import 'package:test_sa/views/pages/user/gas_refill/track_gas_refill.dart'; import 'package:test_sa/views/pages/user/requests/create_request.dart'; @@ -211,14 +212,14 @@ class _LandPageState extends State { Navigator.of(context).pushNamed(TrackDeviceTransferPage.id); }, ), - // if (_userProvider?.user != null && _userProvider?.user?.type != UsersTypes.normal_user) - // LandPageItem( - // text: "Search Work Order", - // svgPath: "assets/images/sub_workorder_icon.svg", - // onPressed: () { - // Navigator.of(context).pushNamed(SearchSubWorkOrderPage.id); - // }, - // ), + if (_userProvider?.user != null && _userProvider?.user?.type != UsersTypes.normal_user) + LandPageItem( + text: "Create Sub Work Order", + svgPath: "assets/images/sub_workorder_icon.svg", + onPressed: () { + Navigator.of(context).pushNamed(SearchSubWorkOrderPage.id); + }, + ), ], ), ], From a3264f4f1c29ccf985561fe9c4ebda806188f031 Mon Sep 17 00:00:00 2001 From: zaid_daoud Date: Mon, 21 Aug 2023 09:29:05 +0300 Subject: [PATCH 181/181] Multiple types of attachments --- assets/images/doc.png | Bin 0 -> 4330 bytes assets/images/excel.png | Bin 0 -> 8159 bytes assets/images/pdf.png | Bin 0 -> 21118 bytes assets/subtitles/ar_subtitle.json | 3 +- assets/subtitles/en_subtitle.json | 3 +- ios/Runner/Info.plist | 4 + lib/models/subtitle.dart | 3 + .../pages/user/requests/create_request.dart | 6 +- .../requests/report/edit_service_report.dart | 4 +- .../widgets/images/multi_image_picker.dart | 83 +++++++++++------- .../images/multi_image_picker_item.dart | 81 ++++++++++------- pubspec.yaml | 2 +- 12 files changed, 114 insertions(+), 75 deletions(-) create mode 100644 assets/images/doc.png create mode 100644 assets/images/excel.png create mode 100644 assets/images/pdf.png diff --git a/assets/images/doc.png b/assets/images/doc.png new file mode 100644 index 0000000000000000000000000000000000000000..e7418db8b7b4ea6e468a4ce306456523e612bfa4 GIT binary patch literal 4330 zcmeH~X;f3!7RS%MTs0^HA+1uOGH9i(R%o>{$S6UeU}J?4AqCesII{PJGb$~yV&|K9uT zbM84e=j5*bJaFdpInxnBGlPTJYY@WWCyp3Xp?Q&YPY(@|z9KlB0iUgm_wH z2$}z6{9;85&27N=PDa4mjIfjq8RB(m>ycP2Uc50`m>#z-b^YR$w1ksGo^uegObBNC zg=c*`*kve85J&$!GCDRiG;n#-sxU=$d0B8d{l3GsISxTp;X7Z+B2Hs0XQtJe+xyCD z<996%n17m19lL57z?wH9I6WRPqwMUpU4q-;2an)%#AhKzcvq&lKlAmv2WubHwT&(> zO>fnXyqXbnyvx1cz5jXflIYv2wB~Rp)wc7?^ur2LNa}^8=4(bn{vVJ|T3KP8Fxi%_m`1r!4M#FK9(lwkGYG2=)yY{fcGm5@7AuDK!alm^$ zvDCFgj|uxzXhOO=kMu&fH z&)bsJ$E~SO<8UX}x#n1(N>6ZB=<=rt$8OKybGAnil&3D6cdm6pA{sv@)6kXu=z*K~ zHSw^+EbgUvruk_=4$$IC{vx{!#g43NXnZk{IwWMr#qnAk{wFR;M#Spl5i}m$MgB`PFH(Y)8-}Wnj z@q+T3DV1DdXSkL2e46bv7YAJ6baVVYTKyoZ4Nd(4bO)4~wzY4NEBXQok!D3&vg}dj z%OffiDVAnST{o2uc3#$>&}cQPCDQF+*$0*kt&duQyQCJFSbu<370V4HDwdR)YD+Op zrIih%EpKy0T*wv#wZ;=vgsSjMqx&b|&cv#U#tIjNG;$_Q48OZcnU;vp zLexYqn)*4~w4u%?it8-&GO>0qH5E_UgBM0<;~V+2g3!#ob(BPatX?3p0}OLT34lUP}g&I#^+gAk_LpCWV^c^H?%W=RNOv)D2kC|9YE}#vdQMJNsp+D<|ObRn13mZ5DxSUCO1AbtM4IDt|*mNc} z*N9AP;2_`}CbigzR@i_qLZL+rfelo3gN^u>2!%P}9lH<;vd6P941KeLcqE zBsBSqQv~u|z_jEb^qm!U8{iYBWe5NZJ3t`hXb;8odNM5o5PF)!_BF#0HR*&qG7yRh zB|=LO5~Mo{?tmwsg&leip^g&9vH9TC%BKDWPMLv3=-1#h%BJE0U#=uVcK{BvsmG>( zfyDk3fRk)05zu@ku^)!h+Y2f*4sMq|6 zmLfn;Kv1s*5G}^ot!!$$Q4J<+_W?GrsU{PdO!?Dp36pK6=x$%#tcH)SKB!$L!h`3M=G7rd1IZ}`i6 z1oABeN_oQ-S>BN-g>*!cRIVvgj8-PNe1S`MkM-IV-qZ0U*9n72?Qf%F<wOg3nNu%kZm*kS1l1#x8_(}{Rachdi01>SzCgrS+>}lc;tU$a{m(IabJS&>hcsP zX!>XdENDNmPp7&#wj-o=03og&4 zGRAe|HliM$LAB)Asd~GYlhe(OYa!>E!lu#*RZR(eW83V{vfk|O{$J~M(}pv#o4qip z`xAYUinS*Qj%#t_7gQ{C>=3O>xm@DHh7(!fVz(}Muccqi+-|2?=75%^%S%Y(jzn%% zI(@f9soUpZg-%8esYuO%Kdh4#HcFjpo-yCxc9jWoJJnjVbs-!PyT&VLqtw;%K0Xui z>uYsz3OKK5gMPws!9p8h=_aVfB<-V~gQ(-iN3*@xM0<5erXoXTPFLE)qx?ea58;g3 zWH3O19nR{fgAD0rQO<1%h79-U(%KT2_-HM*Q*5X+$P_Yu8xnB5V_n}B4|eZyLd&0M z+oCu~(B^$#LbaPpiz^moUm+U;=LkHTBD?McMip9nU{#0uhJ;*Q84RMM#z$^b?*x5< z*=Afb%o~fdLi19UNlz@m*945NrCS@wWH{MMi(fQ{xr#W|F&|IG1+@`Jx?{PcH6<8z z#GBV6d2InnW?)tPn_W@2HZ(_ZZ7R>9r;gfBPc~L=E9YA=+3+*2{EesN`-oDUW*g<~Bcj zq%7m7c*Spm>&)wyzx%J!Jmdwep+`O)-4#ME6qa;Xf;sLxI{yJ(WD61Ke?~e?XtV_=#=`~t+#QHuWyO^ZQ#dKQ#`c3JMXx77fbv#vtcX)Q=Sx9lf5V|=d zMZrJfeOGe*9zz=N#2`S)z3y7BE?1+C zt5Lq-)pS-?&pqsms-M=keHkOXR4SL(H<2+st`nbwyTzZA$?9dp!(@Jbq57lQlF}P+ z)2Ph;&L@IX5zPZO(B-Qf5{<>RR{`$qm84LB0x)Z_i8)41l=!*3(QCx^dC+(R9@^%I55 z)55;rbBg!GiATTfp1gl{sOyd@$!utH_g6lN>v6@5Y67!;($Pk}k4Y#nX|G7nO*kt= z%+Zrg@ThY%6D@gR8H~zWBH-v~$q`3H?-=faibSKXwx0HlmMVcCUqozH2$*z>@(}tc zO^yA5V)fPX4 znxO8Qy#`7@g;u;dvMZA&njefdo2TOXFR)Gt9oWHkmk+q2P9$u^1pYw`|Ng35j?qTq z8HfVT${U`FGV4uYX9$g+h~8p^!dXb-+0LbK8!@^JWXE?`BKIMLEhXn%&g@)oUQ@bc_SLk_ zdqboU(teGPLr-llAt@tI1f_t_Am)3u!$`lTHX-^sZohB)!&tk~d65vGXAX6KCJfPz z?={>f5=)q+VK;t`CE@6Kxc*CUZPM*5G3=zUvg^_hk>4MC*AH5Uj7ojIz&j8DzTF$> ziP1*YoyrKtRNmlm^DyK*Az{Cnr!eSII+LO+TQ&9c+_QT}O9eROQ&%Wq?!V^<#}L!s za6;*r1EmE@`>{CO2kXp$)TQFSJ~8~(M#0knfl@&Z`MWErA5lGobD0t0-;uiqh6cE_ z1W=LUiYv1s%=HO|j^L2j>>;Da<-ZKEU+)bZ5Rb5IiNWzo&_UEc5c+D?V#@mw8& z?Gfy0s}w8HZm!d#8yLAhxj*nH9sle;ZK>&G5_F3I_T78t#a9^x8z1vVY<-M4woQu6 z{XJ`_>$!%=0M@}VDyIq$_WmH6zDGfRA}-IqiDHVKyse|;I#TI9=^jWCq$Xl`$0R_q zON^*;^me7HM0qQ6caXOz%A;k>`_=v0(N(z@{t>4@vLnsobVFWa17g~cm27(m z5sUIC>!{EHPCNM=!?j@T5GfYlTNOgy#bZNLsf)F*SPvW-vhqD#$cc;LQ1`X4T&j~99xGCsP=UPjY$IqXg{tbFJ2g7|J2Qx16 zK(bg_UT(MK$T(c;)m(E_33EoglAaz-LqCQ~J+l{ER%ZX5is)^FGOm`GqtKDY%hv%M?7Cl=UK*V|Wg}bW7CMD196$7`_re?ErPSe;ByA2KPuPg&jd;LZ3ag zO0KG`9T^#Fd&6LBNvGV~D{?Jja-EfvZ}P%?Em4_v8&`3u$-qWl;DWSwXuX zAsUa_^YTsviyd~ay*<|`ol*9xd{V#Ww5sbf-TGCEB6d?)CiFKeg_Zi+gaE~UJ_O_( z2YNgt8>D^Pfu&w%tj2t-=?Xh`@7pvUY+_v3NyINrl{rCr{(M7BS^&9|7)Y)<4CL+) z9AHM^0w?esr8%|1?Aw|?^le%@Y1faxL6AZeeVD?J{c*7)kGb{yQ;zsc40oX{$J~`# z1;?g5djrNXtrypgi+)@C&o$lDv}00C?L78k1x*gJ-#k=$l|dJoQrjHO4Vx(-=8}^S zgZ4=gbhy9S{6nbyN~}qbdEdtU5V{j>`z}NF{b?@pq6^=qUXVMsEMCI@ye(-#FI{!? zEjtCnTXRI3IGJ4An}?%!Lzm3v#|mdAuvn=J)3(P;tr)U%_FQD&A`A9c#Qet{-o4kN zI){+R+>n*jtJEF(LmYE=YnKl?Khn)q*v@}FrrNT8)-M*5U5+phRU-3!jy>>z_cu9}DTs(3w;<&&uIck@G3>7~XLNKp@JZ!@nUp&UAmT z#m|O?Hc{>f4*Aa3L-sEqd)!hEg%|5nG&S=k_{Z`mC+ghX{!t(FyW^b0F14wuqDjZh`C)_TD%VmG55SiP0KVB*jtE-0ry zF_@UX;({RC@nG}R_h=0|Ul4ZiwDjxa;kFI_-sFpZM^ahiD18%5h^bzS#Tco&w;dC2 zBmKQ11;9XuR;b;Ge|YU^57Rn$eFGvRc>wleFHI=PuUj%OJ)ni+OM8Rioz(-N^aJ%_ zZB#Llne!=Jo=K^gq+Y=w0PrY=kuyr81}?VWB(7x4LLY_h1z5z}+`7Q->kQ(GpwrfN zS2#4#$_W5;aj!!Ql+*nOH+|cQ<8XjLO03^RfP*GOf6A3DlcY_xFOa3AK{o^#m zP8uf_*sxxxomZKx(qmF2SVt`r0T6nKw=5fx)l5=cOzhM2W6~z5SKJOmE1#NwuXc5aTwkrsCcBEQQ_V4uL$2Z)zR4T823~N)`4KJ7+Kr(;$2SZ-uD9oSz{C{ zXHib@7R2~zewfin#IL@J?^-8TbO>_+t&?Jw<*Qe1HJSb5Iq|2V(qRzuM7ZTbN8OE- z<;R&O2K+wglX4v3R#LUN?Gh2)q8g@a;6kEUeS-=dnJR8zu{X8_(^k{syDA~@Dgg0k zbo>V$!q@4S6StSFWU@aHC*?PxsC*MMWu#x92DfbheOo450fK8F__ImGK-3Ech5i0q z8|7T~1yz>V(-;8G+>PiV4nG_`puV2`sV;RV;tzh!RAd3L;Fi^xSHK{xby)iKm>Osj z2n0>m>8A+*oRE+Z&Q}O-3sn|X%_%65&h~Rfp>`3K75umWU>8yIVyai$++vDR#zrz} zHYgMll05}rSguDTYF?1$y=9!KrpwBTZ_6hTVln)!(g3WU+lqRqKS|SIR?a&#uH?kG z@pDK*^@blTA6W8OT1+{wrXY+$X8T=6p=4O6lc7=O9tCr+D{E{_G#e#d@+48?yRs$h z#ts2clZSsuH4O8aeIOmpDAagmvROoFUY<%F{IP|Z|v#W?lLFb@DfELil{C2Bql73rZ*tG|kT(f7O{A2-Ko!Z>=3 zA&{FI!h97|tH3(?BMkt%BH24c_nE8b)yA`=gR5=fsb)qOfcH1WY(MyIuxp0(n&hlV zzk7)l?^hs~ncu%0jcR=Bc#TwRb90?uP^>J}I05$ZgSq^M>fdS`Sq>%!DU;MM$uPY6 z2EIs(uair8!@MjET)H8uB1Fxp#LQ=~Ke2T*RZnG?>N8|(E^q*?ZpzBk7bEs$gLJ4` z_R<2yD#&{Ww`#d_LnCm`F*od7_R>cPy$7Ka2F62k!=lyV0po9I*JM26F$da>0O$yj zA*``zRegxtTke(yF3nnSROL6aG3*^FVhd5{B;U&0D> zzItPQ7XcS+FkML?B#cw*yWu*op4Fk({KnHn<#P(${0*k-;nXDc3AC3GtUybJYDbS> zD0ll!kMGJyp^Cnd^8KJ<_l(g!O|3QK5m(g+dAad73ka?#hN0AsDN=&r_L!>KqVkt} zUlR1XoVJ$64#mGUXWj7ALGf;-D&=fHPZX-a7kxGs3hH0pzhtDbR<#&SFGNMfca;zb z^j1>-1xWVCzd_{vc}*{pA=I5>l8i#3Y@sArnEvWk?5O_d;6%H+&zDt&Et%|}DAe*K z)oh>bZayvZa~tO9u&Hq;(a@Pp)@+=~!n0}l9iobiz}|#s)(?Kf!t9>ADPb417XZsE z{|3@jm+5`=s*!vdne1o^MpqSjtJz|pduw9r{?=SxLvteYrHN0p@D;JU!16o1mC>r$ z4VvnO)pe5|5_VHTb{x(sF(npNTN;z>xtI8DeE1C+6p$kxWhtdGiWDmm`I{L}V^4CyQ@HDH`u5IC#J=*$u{ zhf4dBiaSX%+2XfR{^1P6S(q;!2__NIKLc&5ZS{Kgm>6j06X>5QDFe>|cH!!Sp79fNvq?3qbSgrcxhnN5!nowlJd^zv-KcuQRH%ewTZ#ZIJNsMOf5;9f5U2cL|lB+nZ?h%CKJ_6$`ydV zi+Ep}yV1H~?Ke`9SWFMoGjMTdAc<>7Ku5sD`5Gw}*Fc|@QT4A3xyC2PiQ{5%Dd*rW zle6wsI5mi5MNlB`as9IAMCmcOiN4i>4V!(Z{{P_r8YA?)!2mwS}oa%u8vtS1QO0>%^9%p{(K_wMHun5LXC<<7hW|67AwP7HYA=Vq+0 z^@lAM?N|%eJQYt1KPS_ewR{gMfBHahUyj(PG}%ga`K76@ba)SaECH1otXU|V$M<=r zV04==O(efD)SRFhQF|OV{|H@vNa45Z_)ls0zp}vpu?lg`EvwF-ov~1(scELixjVe*KRtNcM%iWeUgN=! z%L;_dbF9dO&Y|j$(@pB`ZFjsW6yKCENE&k0Iz-NnjO!N8YQSnPx`ex2f>* zdfMkdkXHX@{Euqe#X9@N{Wd$^O$wd#pCA6%1QWVQIn>a7>wDkD<)qo)+u1RVj)Cm+ zEIy$l99n~e4)msxUFf7ZND{=3$yGuEjmqAhOJ05L$~)+f1}AyI0N(1q$CUqiiw-Z@ zduFC+c>cPoWjaOCvQajM(zoQWJrUDapPr~Ouryj;z@4Cx@IOP<`T;YFC>E`+^YWH8)#+eGIj$#<&rJVw-MVEejwzDLNj&~d9Y^7<9I-p zFNg!*kS8>aII$zEqeejcHU2x21A8yQ-i5&fvGS0y7!L4NR)9Sq2ZWcUh|)m5#kFk2 zc4N0z=3?g#!~0vIG2{4`R8;p~H@5O5c2kH~tHR7|ev3=xjBkYE6 z3_Kxks_fHT)7y*9MS0sYc;G2pb6l)rAAB9qmK;jPaDuOmZecsKucdcs$(#*e(t&@J zge%5&l+EABl)D1dXFuPjiW$o`BX?onnajT5RwgR4BFs;~uF3tjLcJ_l1Atv#_L@=M zge1VncGc`?X>T*bPJvA%J%7g?sUIwZir8|T!^cLek7_@$-NPkBOlaInsT$g_-Dy`FPRYw;g8K@qA#hiaOS4~zTKFY z5p_i4@ZOFUf^8FPl9q_kIS1RAS(z6lSzKUGzU%Qfm@5SkGPcpz^5RGz?9q}{tItL! z)t!JGq=3y0RH!1v{9&AV5y^UDej3=cL=t@^H+_z14eEQl9QSYSg$n%1F&Ebr_KTkb z%w{1(%eH)Doc%e6vs;qb)woNNaIHW3jYc>6DDfEW0)F6@Az6D2an7e53`_Ypk;xoH zz0$|0RSX7=c8-XCf{`A~!bG;r7@otg}#*n!C{ly8nVD*6h8fl3D*vZE_<#$nG z&=pb?2lQb$iV$Ep3hLHx_#EUof!}Un$1YMu5HhUzfRUr*f$PR4TUOfYahSbe{#Fn7 zwo>Y5Uox-|)U#c@W;UIP=uE`y)B3zFNieEc=tCx8uBk1EVf~fDJ0E}eN<04|kFpPZ z%UE}9Ny2zC1ZE8YU*jX4zNP~yhS4|=Un7n)1_IKJkq@{h@SSZGPN72Xi$4`jQWG(I zv{VSZquYkHaTuLye(+ey_de2fRCD_JBk;6=lGL#{pQQ2$kGWR8s6f8|GcZNpSlstP z)+&6<0J?c8nFYbOkE;f{FiuK7JO^5R`lFg9{7G^Wp8p_s+i|U5)$XfK+f0G|z3#{Y zJTACTO~U>%Lk39d3Mkj-ZKpXjqKwAyf5uhrmOrx6A7CFzSC^9rfG-1YTdj{Ft;Hio zOBP=JHk{Z;zIBOF#Ymd#!DK`z!qqrCOx8as4)<9Q7cK^TMQ3viw*s=3TIVcw73Lp7 z`FkB#V7;9asJq&z?{ew4()eRzRIXl@K6F@VYvo!N{e|}!kqTEty8Yc`y~lQS8*KU`iSWk zA*H!@tJ{w>$HYt}r16xM@SH9*pBbD1HJ7h@vX!n>VI{-L#iq z<1FGZ2gon;?Y*;BP1N82^W*0B8j-WZAb{pV5>lRfea)o~XQ9bDjy-)xOh#1Pn)Iyx zp7Qx-#cg zqEqkY)6QXWHBiT(N!uW|(U>>bC+6204|e5N1758b=^7=cU9Tqz%j#v&-pL;ub_}5z zeQdFWhZfkiz@=6Frna@xLLp!hw={ii{vA%}HRkZGLMqPhPS!xn6q9XuJkUCjak)^1 zqoeI#r!xjrOh!qFUd&Fj`4tv{zGvp`k~Q#q%K0whS-TY;a|pJRB2QsRTj^v0^Xs#3JL5>JnrlqX(?L h>(PP}V&6N~*j(7ID^Yd7U>61eeVv=y#aHYe{TJ+OS4RK< literal 0 HcmV?d00001 diff --git a/assets/images/pdf.png b/assets/images/pdf.png new file mode 100644 index 0000000000000000000000000000000000000000..3102284f5ba086a43aeb4f773ff33cc81ffe7246 GIT binary patch literal 21118 zcmeHvc{tVG_vkh&l!FkJxfGRSo}F?~ZwgH`(vhK%L@DEGcy(l~h^U+>2_;3!T!f0y zU>=G>%1mbGuKhXh@80{|=ef^wpZnZ@e!u(re$U(a?9bY3uf6u#Yp-daQ0pBQLW`vq zBZP#uZlUf(i2DgbJp1^0p(SADC>j3YcG5MJ=owpmaS3;&N<^x!%|HnCf&n|7aV`Q3gl{^;qz z$sw!L6WRqIp70B*t6k)LD){0;@(Z+>Cf0SwH946i6Y7?{kZkq2JTO$?#gSEF;qvP? z9VJDZ37e6GdCbL|kITXy@)edGl;%ZtmX{0UX?LNy;dq zSwg3``z1*_7Uj&fNLhnJ0HKeoX&lymoZ<-GvnuCge&$w1sEUsyK>sKLq9bcURYiYo zE#*Y?08%zmUWvPmS^(f~0&oom6vluh7;qB-C<=gv1mMtJhE|yv61z$VNqh4|P5#7U z=)j3FGj*ZEVgfS_V_tzfT)~*FF=pk}0QeeXX1PcSaRKa*o`U&FI z-j&NqolAkL4a8$8%&JcxL&hsZ<73P{`di#6MKr47Mq;3cxKWpATnCMj1mqdqC`k+? zfg1_PGy3ZCLBc?xhax6>;0zVW$sv}>=K{>DmER5_$^+c^HzwTY8W0|{h-eH2!b6G1 zi_mzFXw1X2xk5BvhsI0n#+4+J%O$`Twr;h9RNFF=K-iqn-i$Bt2ELCKgpi)5q2USz z1%;5lNDYN9Clc9tF?w!ZO4AoJb{NR(4DuStZPfpWqD^I{O8L6VWEP&t<@dHR&TgfK zCvei&kBDzZ$U(nIw(zzv-3!xO>I0J3v<^>o%Xy$eoSJQUPnjl^z=?=nUj*d4_+W)&?%=81vn=PN;EvbUK+`SU^d0b8)A0I6OBgq; zWZomNS>2J57pMFrc-8@&P$FdEoFepM5WQldmk80z1ppVZ0fCP^YcL6BvNR5{cnm1^ zHvn2=Kx;(+CQu^uq$5g46@=NMC+u<*pbK<~PS z|HpS~IcJp|o~^PpNkG;GPkWVYzxL0-f+aLGNJpRU8DM0RVd8!RQR0XiePY zaJ@{Ss~V89#eS~&2yji&0{1(s2+(8AF2}sL3 z(8xnHeul=CY{>Q_Brj+DD2Ip0sk{rs`dq@4)ENW!`1nD1(0~$+Bj+a37zB;dnD^*5 zK;{s_UI+V`B27Tv21rX{uhgBB7cUhf8ruQV@*2_I=(2hFITHE37xssXBi7{!9*gNF z1hS8#)eKz&cxi%{4}DaiaTtbUDxyJwevQJbOZNeU#LVvjAOEt#i?k)Fa|eG+0s**` z?=piYCWiP9a%}w#njxEt>8gSkxxceRUc1#EXXb*sk*?^&Tly3yHreT}>O>kTc zG=ta;3~0Rq0Jji;*?{pI!K*ib@oxg77+@45Fj^nvvnYQFOk_*2SgXe7a?VpbFtN(U zB!Ma|%p2wks;X=rF{x4EZ2Cchb??jokPtm(830^H0Nw&X9X6l{01}*gHvq>`r5Gh0 zx1&2GQZFbc#lP?nvM`tkLHe*TNni`Hj-_QVvr`1@0;oSlGYsh94X2Upay%h)V00Xa z;3lSoHM^w&9-0oCy)=iQ%oVn?r8LpFHxwEPD&qM`0&I0o4+YW)b&lc%p^;GM^tZT? z4GD)OTb|dY;{gQLxM&E()Gaui}G{8JhnQoJHZDdv(-6e4X~Y1=g8*@ zG!p8ZvIfW@)H(7=02&Dir|1CTggQq)VbDmZbBYc?66zfJw89>Kyq3O~n6TyLi}GD< zFn@9OBb+U+1e#JGpw){I2umH309zl^#iks59l{7^?(}kift-nM_dpvhum?I$RsBk0 z1Av+fCd4Bejxh#5!N8nQJ31C9$|zM;S&wKk6wYRr6Fo*ZmtVL>u)Io?B=FZ3Vo5!h zgfqhAyXsTvrwArhrK~Y8=aHjrT1yQ59aN|iu`QxODaWvpcZAwmpClF+l=7zY#4NB< z=260$11n{*Xo3n*%GPRZKt%u~Fk+?5LtwN9r7XtASZ^ej-IK^UiVYOR6r`$FkqP3T z>dL}*CE~j}DO>h3F_CxXxca0!9O{AeRaDVO{J)Fb(VCO^L)*>OdE>1sUD`mM6M7kqxT1 z&9wZ&T0#RdpWO&y@a!Vwh0?oTh$OIjJ3;lJos_&dTZ&QpGfk>$JYlz?e79pTA30+2 zd^$gZ5IGUwEu-!OE&ot&j0a##v04!x-~b^3rQ-(xsXL+k(J?%LJE7*#PyBt3&^_qm zQyAS`$al2} zXIBw>5MA*wr_QaWs-ChWc-|!~ND5oQUKh~SrwF@?4!W8x=?HYSye}aipsT|U5~9Yu z#jDVj&uD5CyGN*d`lu9xVIRUU>tX}ykixzbL(>^%Y)J=gEl*hE2()#WBJmPyYqkM` zKwF#bB>Fmd^U8PG%F(V8$1Q5Qwji9ng)L&Bu-_1tIH9oFmN){1{e~_7bWqrq0>rY# zGZq*x)aAt!FPtFgrH4v|Gs&AB}yRsqXXBYT6&J{qrMUG zxkxu_G<J-kp3RS{`5u7*_RN**=oq+r?;li(mge zGP6e@E?`f2@+ZU6KHU+B@GN z%aauhnXU%JtIt%`mJb(0pA)_KNnzS!lw^-`6+p4dygb>%kl`wT;pjEO*{%XhWm7E+ zvDK?WRZXqFczNwPhi_dr1(a<$M=JK12zZ;-| zX(lgzy^EvlQYe0Hd7km+(zz#Uazt+rSsGbxm2wV&of$z@-QTlm^EQGEeM)(<(kj{T zZFpejMXGAWk5{ku5;%MS$KG=ePs|7$hZJeqW~;>9Z=8i=vs6Q>8tm87z3(MqW!qV73WBF%CRheN9J4qfS7!|8cF5BiYF@wVR86K&0KNn z$tiOJ!&=eoQx)gmkq8Ve=H>55d~4Sbom>q_Dr;6SR}jL-bc9YPPl~L;jHOhD+J$;M zh^!_a8X0zrysbr)*bngL6h%Z4Ka}Q>vPHf-D6$7SwuYuuaefQIKnSR1i*(5EG;*bqm@`L^qf+DoU42LRV*DS+_XGFzHIw>;vr{Cc>-t3_G`q0 zWi&%;D{mqqL4@R{68`ibFemv2amk|^1OkTyhF#*3@DgHn=+keZ4Dk)q zPZ<*~A!i9?gtnAt%Qqw~{}x4n%aY|AWER;G8x4W4ySbDQF8b$KV_K}f1HlQ(ju?Gf ztoA<-A7Zp=vFiWvCRUvmyWv0H#BQL)uKVXX5#xA2&5KlVi{+C||4?JHxs?*dh$ptGCtxgz<{~9>| z#jW3eZKMAq+X$S5y1=oa{APZ$&#qKWsjKrNNj9F;y;&CF5oX$&E1HL`%j-@aH8o9K z=#7w8I8daYkkLqm1lCdb$9tl`YVYGKJ)^SL%svx?%KNMV|I4>6x?lr%tT| zQiLBhW%<68RW_b;)4elylYZ=9Psbb9^MASo zx+*`7Fb$sZc5jkw4iTz9m}g9Lug>P^)jfM@kHOFh?kNFIaZ17N4APh5yI1|OjeXeW z=Gi1!^JCIttoTR$!D7RN$qtE{))P?`G9^#HxVbM8wRz}1GxNTrqb)c$krf;fVdmXF zQ`L|a<=&oO)!@N!uQ9dp-+na1*5bMIK&nZW-SV1P6@>%Y>QC!!D#ehp5Ql*57yp6g zXUX|T^U^jndpu*Edw#}4^F)DyluoBegmj!)cSWbgdrWS z#$7{+pyVQcc`|0QvO;IRG*agieig1HT{*iX-pC;RnTv&Li_?47ebulYuBGNng{pQPyTlCmK z*-PzC_>~+q;0d48HYGheS0CAXZbZy(;K9?*2On;c<~Qo9&e)%{t4`NR{xhcH_`CWU z?f37ofHUI5{6?+rqDGgE*UT&l{E%AWs-5E14fFVsmAvrY-faGz{kbr8RCjashI+tt zI5*Fo7WYao+rF-+^Yk;)mc!cmQn_Or!|R7wo}V`qsU~-*T^U;x?%h?D>{SM2kB@G* zFDYCHlDt8;@)dRHh;K(bzvbt5JieVzw_h#UlvT><@N69ySAFp3tHkGEw!As3w}9-| zpQkh5piZy3qr1)~@bw-1Ay4%>KD7GWO`8zUk19{L zLpIq^lBd}iTqvft=ho7w5uKPQdP-*8e;z>M5Z{&gV?X8pnINv^+LRw=EkkW&CH z%w^g{EGR6A!k>zv6O3=7#l#57%{f9(_Qbw=)n_tShd&HIqvLV*q?89qB*)&{LmnZh z^abRsOONiJ>`-wI{y9b-N*<$qy>DSLKI1D-3G?$$8H#qP_$_KI9knpAj67yK6xDy& zzljGm$#V$M*FN0Pq2(Od(>;=wbXa&kcOT*^y3 zOV+LP?vdn0IA}-zV|e#>p_+5>$TRY!MQ2p;#XHWz4zK+tn+==;zh4|l%gAEvlVL@r z4L;AXLGaOou_-are+%#6WeK~sP zx6gqS>EBmZ6V~XM{}b=~s<~q?zvb4U>q(N&N*3Jj<~nWgXXlj;t{YO^XfZ_Pm<2kww~1G_$pmfW?F`7wLmayrW^*2tw`o{K zHQO7=rEe3L21v-II7kiZ`aAZ_E+{z%4_r#CzT>gf;oVG9uw8Y**WdBe3zJl*9>I%< z@(Q-OWv5W@x62i6-X9qK-7+qM4*h-^B%f-zJk; zb-hwtuC+Xakp|_zvx3(;vnJzGTpp|x;zVX=gLF91r$_4E=G6-=i^#(Xw$fa#i3_Gl z(qkL+f#~rNMo0Q4BwGpd{%HNEB9k>Y89!YdJo0Uj(z@IE1LG#^PZoJHe8?R3KQ9OU z7Nirly!)CM6|paAo=S~+pv(;PiyM^ouAMz1SUBey!GZL?4Ndo!KEb<^Ouckfeu-qG$3s^tzpfAhTmj+r8vc9hsHCPH@~m% z2w(0QoKf4sMK6bi``+7g%0U({a9^|Yc`|*;ZP#_=?v<65zc&V~PR?swg>Zg>9$@4( z@WQlu;bX6YUq%JePi1)?mh|4Sa2)up#*6NqlmWpWO`SYu6}o&VAW@DU+3(-*irm}U z8U8M%XE_&2g?ub!LyhiWME&gdHOo2s(m*6D+B9~A-C4QHQ4kTCV!c4#U!l!OvqyJ3 z*FNQ`v-zSF<~X?gf!XP|Cn^yAXZ{=r#>+sF)^kUy=f2Jgari6*Jo^+$o}BFr?Z4v> z27GGw%O-C0y}9&#WN0y0(s6!f_qs8emEI-u5oyLJd>s)b4&t@nJF24s)RMDmg(;PL z#H*w99^4lB(jEu>aqdHQ61G5Pc(C6^Ir`v1isv)go?Cxv(l&H_kwkTmdhJD#HTT6z z83`kUK?i=Ofkb`l32E=**+*%E`5*vw5xs{o1SrG!kq^Pz+;v3)KL?&i=yfibkGq%L zCL`vj+5*rs%Dj>1ymrT_Vu-Mxx6g#@JqR#b_sm6_3+Yeaa^pmcQ}#zJXU!}zK!1Sc3Wh8kyF3AC3<`%afx&?)RTLPoC9~iAviY&Vg1!u-{tuqNi~KKc$fn zRoEJ2ZiMqOl#vtiQM!hHs|ub$Kk2y#I_0I?qO`dY&X!X~c4v^gw`b*XsjYVo8aJ&k z7%~n)bnSjEj_7M(THP6Bd4o;G%O}svn>MfV45v{l_{`8aV&{=(whQtFBnKm-5rg zta(ozmi%JyH7)B-n*wd ztvXRUc6uzu<<(r8YP^h*fH>8uz#}>T(+-=PELXlvCa*oKC5_b;M?TXrT_Ky)t4pW8 zaO8|%GT|3~JNO9xjQ@UND!6L0Lh|gJZ7J$%4vE^*XWw)#w)2_m)yrs<8L{1G`Fqa| zeDF3OyWH38RoS<1yeVzNK9Mg<1+Z(n`hcIL*ekca-LW3%Z#*bnGb;o8)pFXW{tU%aJ|`~ERwB5UC?LscWh`p8RwohjEa;?>snT~&yL zJ^3Bn=-9Ejg;YD=aTQv(f2Rx>qMKTntg2q=^PAslFEJbV_?|Y^ofLW6qC|f0&}m90 z>$0QccnmAFr+rdV*+!#t>_ggM?qxaTAOc3A;?Ry~l138-*@K>k#cK=(b1KCqO1_>< zlA~r@EeA_!_N`L(NFYn6Va3@knSp~O^4vq#m5TLwQfrg~1Ie=jNh8``C>|^k*(2Zv zylGL0ifnlkC*`=#>I|F-MgBuh{O`O6U;ONmTxeUA{inG$D)+L?GKDokS_zZubu2m4 zqgsueS4^6lqEc$s&+RDsx%)ti9V^Q7N;b>rz2vUC+3<_ul(kwX?8HrF=8tCT4M#T( z=LcVDF^d!X6DRfk&DW7iv(t@cu#Fc%hVqmbUkgLX(?5@)#S_S9(#{{VV5olPl@;ud zs0b}SBLnl|Q#+4JYqvN_?dIjB^;no3S-e+|i zWc&{vb!(JzypYbPs>SI(Sg5WqrC>krm#Np+OrDz-RcO^c8nYqIaK?t*J>aPYDh)E$ zRd*pU^rj+@l_9q}&G%=qIsH+UwmajSRgiXr@vk~bgJ13!eO`U-ELxXdFmRk7NnWP& zMDKExm{Y9yVALrrT36s>qCgQym^2ZVj`Tl}8T`X7#p{;`@6W!_hf*3HlP3&NsV>OL z3h9{=nMilnCgDfMKaHGc`ee><%Wipr!6%fm()vo zXr7%*j6f(6QrTkVO;I1THVdp9>oIfcFf^q|YYqj=Hp~yGq?~zc6;Z#sXm&t4uvWiG z7!6BchcxZb+^4D#aPQw;?_3f^=FHjp{D@;Ft5T<;X}O7}d1AHhg02Eor5!FyL`+$o ztHfS>6XN>gtySrTKj}KOveu53DV+vo;vRLgF>B0*L??B)k>Q*aD2O-M*)jhI)J@y5 z+n`evvrpVZZK|b2gY&YY8f7D_D=Ehw$jS zQtwY(aqo_ntMDH^@HJIfKeahrh&8t%i~n|dak1ptAMbyoe?Tcx5oz|52Moef)IB3f z%Al|!U;@L|edccgh{B75O9OAL;$ium7u z&qNwfS$Ate#-Z-QTDPWPi2Pc2op-MkN4}47%kYgnGfkw;m z0Ysfq?)xmp-Kd~~#HWxL}FR#G%|zYOeZ zoVJmug% z7ssj9->a;gu>+9QKD}U)`Yla!5RP)@x4YZx|zaWO1g~ zIRQD#q`ON4HJ_gTB}m>hztQh5=|4Kx+bD!T*q_T`c^&i&d3>Z+l9v47ky61qX*qNs z^73MqPA5zGyB{`spii#jpFJ(+^BSdT7rMeM(@->URZzfAwdqx^c}A4$oh%s?Caa%YLV{k`U;fIAy#u&NUND(h?6 zs1PjT`|Wv29Bi-?+*<~EN6+&){!R`Ps_&m(SZk%uiE!D_N>^WU%anT$?XNLoxR@;BeTjnJMa!^zx7RsoQ0hMGZ|OjhHgA+G0ZUvV-m+Xm40 zgHEsJ`htIM6Rd}G@S|?%VnWX4`uXW;?wnux*e$l^?8D&iy&qw}>RmXYv5d8qhaO>|WG)Ch;&eLFiT_ zPF!7TKE79|J{e3I>hn{va-kV4^*l+UO=IXh+Ss`-0bXVsb2w_}OW5#3hW`XpA z4R|f_X=M4sW{md7){612lulmlXBvdgbEKwBfEvU;rD%m=)0G=EL0r#%(BPmLW833TaIoIY62AoU>bpTd zHY)U=Hl;*ro;c`yX=FoBUgrm3PPZN~=jZIMLj9?qpzT_I*h+GoO7$v>Fqa&n1GFcue|Iu z((-%W-mq$y=9$51bNY(o9YL2dXmEHQiPQSR0Yy=yc!t&yToOMK$_npa6{TaI7=GLP z4oUWM0z`6~tG0ks6_LH{@Od7}+QI8Ua+Ofk>)W)71Dz|lvd$i(MoCmXALD(o@XJk* z<6MkWec`Xcw87$X@dN$~P0rGwF`zQ6)Ti_8@6o31-}>VvEXMWM=e5F-8&RchO4*?m z*SXOlB1PQ=D?vlwztE?%<~*K>Sh8nk5RL1_n-dM=UX_lc=YjfDVI66wJ6K67nr^`MZHdjtR@Uz zBIEq|zMBR*>smdfjaofr;3I)Q5C}-guk0>-eLTU*w2XYFVjnDtn;%cZi*;j$oyaArNn_>Sqer^ss*-lLtJa|kty#rRLEF_z{y+4>2?rf!rc0P zxckNd$L}ikI^1HTe1*p@j_f}4k;^*Z&H$<^iWr)wP}?&!nbCztCjveMBU}qhc^q-) zPZ9Pr0ayAIebj4udjyI(4{uIr4dokzEXv8hX0)Op(yZEmrH_iH_yq^){1o*-qoUqEkrh`rglo3+b1 z|6*c!tJpOLcRQ|tFv;42OA{sJX>1I!Z{8S+(+79r5Jk!m&!^8xN{0z~25i%`&CKD6 zp*lUMYdyYuM4FIn^fG(IXeeqXw-K+TXh+PQEgzfq^_GXQ#-20$$|S9O z!oGME{e9BVm`i}Z^Pp%vqJIv*J)P1t+~CWwrHre#z2)z&YVhL`M@lbNt8t*U%k_SK zZ#p?=pdi(?EaniX|I07(n0QYh=CI#(M3M4!r~!Y-!twjP>mD3bDz$b)6m|i~9Y4o{ zfLmQaL;M-g8}5b+x5=P%D$v5c{P&I#b?@|iUcxM}$XRA!-)F`#Dh%ANa1O)GwaJIV z)$aHyBxLMu=Ad`kO8}uicVZXz4G)M1F9|D%<}=Soh$j+2*Onafun!NdCGpTozm$KyE9{||9~dHM!nuD&+OaPsDZJ%= z+;Xn?n0FVZZQ4&?m8-Zav~*V37yV@lGQS>lgJ@aOOqS&QtD9g}2s?b7SrU*=+OIbR zdVXv@VKJyFMYIkvu8NjOfzzRoyjO!?%?U^60g5$)027pdJDk$l@jghVY)ybt#RvU0 z$@Oadb=uhJ;eT}NvgeC>pd8AoDZdhGBxm2gfvn6!$dI{oK&KVn`njf-l~ge2sh9t!Uj_XIW#q~)-OuVCkDFIL-g`*cQR1*zbHA23N2(di#zN|@*+l2`oC;J2 z1Kiz;?K&0%PgRo7H2<(+HE)!cUQS-DHZWs9C$Es>x2j~&7bG5TAJUWGKXq-JxtwNy z`t;|ZAg9k83*-})&a{ciW`})*pig?3uNF0|-*&zQc=T)kD=+~+9?VvkYU~sSQ4__9 z%887uiG6!<#C(3SLQb03`$r(hAHiaW8wt_7z=5iNF(2vL=Ce)n#9Sa465 zEbc}xcb*$hNoFz1z;c4K~a;4K3j2A z31|bAiuxGEy{kktIu`btTE6Pb+X1lve6xYV$Ie=gl*q4J=4iQdEYbjnEg;B(tMuyz z1*&gLRNV5sBNp5IES$^(0hc6*eiGg}#JSlCh6Ueo_ku^{R9Wfeq4h&SwGimA0E+>6 z*z8j?=?Ushv}yOSb+oK+T3Q?F9j4TH(oSGe=4f3~xPT_+re$?8ujGcVd9#-fm90y+lA zR}fl#f2i~UWM7J5xd&XswI8x~-hDarbtC8kWZ6{OStQ>R@QY>UGCSI3-v;A2}1bZrB6;7|{$yM{ASe?pVO`aArWr*N4Y`(7X+ z2LW6;PWKX;o6n#PMg=P$KD`B^yN>hsjCYP zsOCrPYjeSm_D8%5o+^kRd7NkF^vB)br>?2F*KEGA5%=E=EBp1T1jDM$1Twp(HtlXp z9ewsc!cozCE0IItFHupr@SFY9w8f=xcAy@|aCWcb{dwW4XMjqAZ`(0;=nq++GHUgZ z*68@tfa5muei^(!uetw7hv=*XOpmy<_g8wpYn)`jCu!POC&*q;O5c009W-o$-E@d{ z;%k3QcM1CJki^Bx;tey9Y)S54X8Y+bY)snka2Y9xX%+>MIS^%Jk8@4^ip~t5G8Gqye(Tx0kFH zzZ{1MIvxAI5Ue3VVTrc()-6zB!8Q@uP|@D87AEUv?wme3ZZf2YEq)wWQeGA{*$Za6 zA7t~>AvA!)1Mm?wDllwN)7u5d7I}2S6BcGQzAF{)9D7qE*`;zNcK>ia#%^Ex6-Hsc zVNmRm>{8$%6ypsiNcM=wP-K<5BPu0sf$Xw*WWGDY<|q8uA5xAsH^~a?G+fM`8Zy(W zXSz*#Yam2CUH{A>X!rAd!bW4g7EZGsDgUHa48)r%d`mWhbL9&0YrH1P_Xy`8wY_TV zn#!iAjcVM;(k5yVR3*rH!lv@8GdJh%M?+FOHXyY_&5zQ9$f@2 z#N|{qvs{%Rl61$yMzAFWQ6F)gC6x(IX7)FsO0&<$D-eANzMSH44b$<9wJ?FJQ~(k( zy0CHYLIQ|MooAcZg_f?1mkc9@PZCByjKrV$zXl+;&H75h_V^?XF%CiOB0S|f*A)X zQ4xG=+S(6iQD$^jNYoe%sY4RH$_2L`cXYWe`s?tVI+VAH^kB^xv#W??nlyaQ7De-6 zEqnjdi-A8)Qw_f6^E!<%l~bh$_&JbrY&}bFeS;AT7omS=fJ=s~7dOA#ll`rIC<4gG zfcVxNbNIN)OGWMCUqxV3yoTJmDaQHt7cfCWSly1~nR%8LFZzzJeN#p>6Uj4=KGFId zldeEO&L2@e;B!*!FVK=;jT(c&61c?xZii!FImoqOhf!Lgb80U&<%lp*B>}(Bknx4~ z{Xl2v)!N&_HOo{6I1mp$grlu$oWtjb_L0Zm*5bOZ-_VYiKiVKyU}NOnsK9knB_(eq z5q826dTCQIcSUkxyf-=M%NGzT5iC?&4iu5#FqAH{U)Zl1Z1ct1c7e?%5p%C^3YiuY=5R5I<*go z7e!yKFsjt;-KmL=<2gf>eUr5eBH4=)@h!EwJ-}P+t&sg@CR2hYa(OwRULC*is_`ER z%a*Yh&h@U1YT1}ID!vIh5MrR84CxjdgP}P|gUPuxR*(KgIM?u;>%^h>4+rvXSU+o% zAvl*Za=A5}ll>b9rT4&BGn==ywHSyixiS-5(lWj-BR`Lq6AfU?L9N&iD)XSg%`I4T z!YwOoMyn(gTdJCg&pD7jzPR?41T}{BFTD0)OL0Q_L^!xmxKOLg+&r8M5tqrB_dpdS z!=ON+OtROf_4O})G`O~b3p?~uNB+GaH&O)q8!4x`A5~14Y?FXY8O||M#~v4?cvar6 zFU02P84HjA$wjD&2X>*Xr&NUNGwfE3NRjZrJ^(Y6I|3Tg2l717^w^aXSRN%>21uO)4eVxh9EKczh3d(rsdo_CEUa?I)t(i-nYP zN1Mxv<>j^K_1v^|cJox{pJotZM)35bqI?dsC5>>7Se)+beEbnqdk)P^&=VjCW2cI}> zTH#$yUZM@kxh`Al}dYKvxhHw4pIUxgyia;|HxcpV%Tss8EfV}_mGch8e0 z^MAtJvWgn6@`C!xAOEThis app requires permission to access photo gallery to allow user to attach images NSSpeechRecognitionUsageDescription This app requires permission for Speech Recognition for speech to text functionality. + LSSupportsOpeningDocumentsInPlace + + UISupportsDocumentBrowser + UIBackgroundModes fetch diff --git a/lib/models/subtitle.dart b/lib/models/subtitle.dart index 6786ddd1..fe71b3c3 100644 --- a/lib/models/subtitle.dart +++ b/lib/models/subtitle.dart @@ -84,6 +84,7 @@ class Subtitle { String hospital; String device; String deviceImages; + String deviceFiles; String pickDevice; String maintenanceIssue; String create; @@ -359,6 +360,7 @@ class Subtitle { @required this.createServiceRequest, @required this.delete, @required this.deviceImages, + @required this.deviceFiles, @required this.deviceRequired, @required this.general, @required this.maintenanceIssueRequired, @@ -520,6 +522,7 @@ class Subtitle { device: parsedJson["device"], deviceArName: parsedJson["deviceArName"], deviceImages: parsedJson["deviceImages"], + deviceFiles: parsedJson["deviceFiles"], deviceModel: parsedJson["deviceModel"], deviceName: parsedJson["deviceName"], deviceRequired: parsedJson["deviceRequired"], diff --git a/lib/views/pages/user/requests/create_request.dart b/lib/views/pages/user/requests/create_request.dart index 4aaf65bc..9201149b 100644 --- a/lib/views/pages/user/requests/create_request.dart +++ b/lib/views/pages/user/requests/create_request.dart @@ -291,9 +291,9 @@ class CreateRequestPageState extends State { enable: widget.serviceRequest != null ? false : true, ), 12.height, - MultiImagesPicker( - label: _subtitle.deviceImages, - images: _deviceImages, + MultiFilesPicker( + label: _subtitle.deviceFiles, + files: _deviceImages, enabled: widget.serviceRequest == null ? true : false, ), 12.height, diff --git a/lib/views/pages/user/requests/report/edit_service_report.dart b/lib/views/pages/user/requests/report/edit_service_report.dart index b783e5a6..828e6b11 100644 --- a/lib/views/pages/user/requests/report/edit_service_report.dart +++ b/lib/views/pages/user/requests/report/edit_service_report.dart @@ -754,9 +754,9 @@ class _EditServiceReportState extends State with TickerProvid const SizedBox( height: 4, ), - MultiImagesPicker( + MultiFilesPicker( label: "", - images: _images, + files: _images, ), // AMiniOneImagePicker( // //error: _validate && _serviceReport.image == null, diff --git a/lib/views/widgets/images/multi_image_picker.dart b/lib/views/widgets/images/multi_image_picker.dart index fe200bd9..784c42b2 100644 --- a/lib/views/widgets/images/multi_image_picker.dart +++ b/lib/views/widgets/images/multi_image_picker.dart @@ -1,5 +1,6 @@ import 'dart:io'; +import 'package:file_picker/file_picker.dart'; import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; import 'package:fluttertoast/fluttertoast.dart'; @@ -13,31 +14,31 @@ import 'package:test_sa/views/widgets/buttons/app_flat_button.dart'; import 'multi_image_picker_item.dart'; -class MultiImagesPicker extends StatefulWidget { +class MultiFilesPicker extends StatefulWidget { final String label; final bool error; - final List images; + final List files; final bool enabled; - const MultiImagesPicker({Key key, this.images, this.label, this.error = false, this.enabled = true}) : super(key: key); + const MultiFilesPicker({Key key, this.files, this.label, this.error = false, this.enabled = true}) : super(key: key); @override - _MultiImagesPickerState createState() => _MultiImagesPickerState(); + _MultiFilesPickerState createState() => _MultiFilesPickerState(); } -class _MultiImagesPickerState extends State with TickerProviderStateMixin { +class _MultiFilesPickerState extends State with TickerProviderStateMixin { Size _size; @override Widget build(BuildContext context) { _size = MediaQuery.of(context).size; - Subtitle _subtitle = AppLocalization.of(context).subtitle; + Subtitle subtitle = AppLocalization.of(context).subtitle; return Container( - padding: EdgeInsets.all(12), + padding: const EdgeInsets.all(12), decoration: BoxDecoration( - color: Color(0xfff5f5f5), + color: const Color(0xfff5f5f5), border: Border.all( - color: Color(0xffefefef), + color: const Color(0xffefefef), ), borderRadius: BorderRadius.circular(AppStyle.borderRadius * AppStyle.getScaleFactor(context)), ), @@ -49,7 +50,7 @@ class _MultiImagesPickerState extends State with TickerProvid children: [ Expanded( child: Text( - widget.label ?? _subtitle.images, + widget.label ?? subtitle.images, style: Theme.of(context).textTheme.headline6.copyWith( fontSize: 14, ), @@ -57,10 +58,11 @@ class _MultiImagesPickerState extends State with TickerProvid ), ), AFlatButton( - text: _subtitle.add, + text: subtitle.add, onPressed: widget.enabled ? () { - onImagePick(_subtitle); + // onImagePick(_subtitle); + onFilePicker(subtitle); } : null, ), @@ -68,14 +70,14 @@ class _MultiImagesPickerState extends State with TickerProvid ), 12.height, AnimatedSize( - duration: Duration(milliseconds: 400), + duration: const Duration(milliseconds: 400), child: !widget.error - ? SizedBox.shrink() + ? const SizedBox.shrink() : Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ Text( - _subtitle.imagesRequired, + subtitle.imagesRequired, style: Theme.of(context).textTheme.headline6.copyWith( fontSize: 14, color: AColors.red, @@ -89,9 +91,9 @@ class _MultiImagesPickerState extends State with TickerProvid ), ), AnimatedSwitcher( - duration: Duration(milliseconds: 400), + duration: const Duration(milliseconds: 400), child: Container( - key: ValueKey(widget.images.length), + key: ValueKey(widget.files.length), width: _size.width, height: 200 * AppStyle.getScaleFactor(context), padding: EdgeInsets.all( @@ -102,16 +104,17 @@ class _MultiImagesPickerState extends State with TickerProvid border: Border.all(color: Theme.of(context).primaryColor, width: 2), borderRadius: BorderRadius.circular(8 * AppStyle.getScaleFactor(context)), ), - child: widget.images.isEmpty + child: widget.files.isEmpty ? MaterialButton( onPressed: widget.enabled ? () { - onImagePick(_subtitle); + // onImagePick(_subtitle); + onFilePicker(subtitle); } : null, child: Center( child: Icon( - Icons.add_a_photo_outlined, + Icons.file_upload, size: 48 * AppStyle.getScaleFactor(context), color: Theme.of(context).primaryColor, )), @@ -122,12 +125,12 @@ class _MultiImagesPickerState extends State with TickerProvid scrollDirection: Axis.horizontal, mainAxisSpacing: 10, crossAxisSpacing: 10, - children: List.generate(widget.images.length, (index) { - File _image = widget.images[index]; - return MultiImagesPickerItem( - image: _image, + children: List.generate(widget.files.length, (index) { + File _image = widget.files[index]; + return MultiFilesPickerItem( + file: _image, onRemoveTap: (image) { - widget.images.remove(image); + widget.files.remove(image); setState(() {}); }, ); @@ -140,9 +143,23 @@ class _MultiImagesPickerState extends State with TickerProvid ); } - onImagePick(Subtitle _subtitle) async { - if (widget.images.length >= 5) { - Fluttertoast.showToast(msg: _subtitle.maxImagesNumberIs5); + onFilePicker(Subtitle subtitle) async { + FilePickerResult result = await FilePicker.platform.pickFiles( + type: FileType.custom, + allowMultiple: true, + allowedExtensions: ['jpg', 'png', 'pdf', 'doc', 'docx', 'xlsx', 'pptx'], + ); + if (result != null) { + for (var path in result.paths) { + widget.files.insert(0, File(path)); + } + setState(() {}); + } + } + + onImagePick(Subtitle subtitle) async { + if (widget.files.length >= 5) { + Fluttertoast.showToast(msg: subtitle.maxImagesNumberIs5); return; } ImageSource source = await showDialog( @@ -150,13 +167,13 @@ class _MultiImagesPickerState extends State with TickerProvid builder: (dialogContext) => CupertinoAlertDialog( actions: [ TextButton( - child: Text(_subtitle.pickFromCamera), + child: Text(subtitle.pickFromCamera), onPressed: () { Navigator.of(dialogContext).pop(ImageSource.camera); }, ), TextButton( - child: Text(_subtitle.pickFromGallery), + child: Text(subtitle.pickFromGallery), onPressed: () { Navigator.of(dialogContext).pop(ImageSource.gallery); }, @@ -168,9 +185,9 @@ class _MultiImagesPickerState extends State with TickerProvid final pickedFile = await ImagePicker().pickImage(source: source, imageQuality: 70, maxWidth: 800, maxHeight: 800); if (pickedFile != null) { - File _fileImage = File(pickedFile.path); - if (_fileImage != null) { - widget.images.insert(0, _fileImage); + File fileImage = File(pickedFile.path); + if (fileImage != null) { + widget.files.insert(0, fileImage); setState(() {}); } } diff --git a/lib/views/widgets/images/multi_image_picker_item.dart b/lib/views/widgets/images/multi_image_picker_item.dart index e540cc2b..3f1d5805 100644 --- a/lib/views/widgets/images/multi_image_picker_item.dart +++ b/lib/views/widgets/images/multi_image_picker_item.dart @@ -5,54 +5,67 @@ import 'package:test_sa/views/app_style/colors.dart'; import 'package:test_sa/views/app_style/sizing.dart'; import 'package:test_sa/views/widgets/buttons/app_back_button.dart'; -class MultiImagesPickerItem extends StatelessWidget { - final File image; +class MultiFilesPickerItem extends StatelessWidget { + final File file; final Function(File) onRemoveTap; - const MultiImagesPickerItem({Key key, this.image, this.onRemoveTap}) : super(key: key); + const MultiFilesPickerItem({Key key, this.file, this.onRemoveTap}) : super(key: key); @override Widget build(BuildContext context) { + var isImage = file.path.split(".").last.toLowerCase() == "png" || file.path.split(".").last.toLowerCase() == "jpg"; + var isPdf = file.path.split(".").last.toLowerCase() == "pdf"; + var isExcel = file.path.split(".").last.toLowerCase() == "xlsx"; return Container( width: 80 * AppStyle.getScaleFactor(context), height: 80 * AppStyle.getScaleFactor(context), - decoration: - BoxDecoration(boxShadow: [BoxShadow(color: Colors.black38, blurRadius: 2)], image: DecorationImage(image: FileImage(image), fit: BoxFit.cover), borderRadius: BorderRadius.circular(8)), + decoration: BoxDecoration( + boxShadow: [BoxShadow(color: isImage ? Colors.black38 : AColors.cyan.withOpacity(0.5), blurRadius: 2)], + image: DecorationImage( + image: isImage + ? FileImage(file) + : AssetImage("assets/images/${isPdf ? "pdf" : isExcel ? "excel" : "doc"}.png"), + fit: BoxFit.cover, + ), + borderRadius: BorderRadius.circular(8), + ), child: MaterialButton( padding: EdgeInsets.zero, onPressed: () { - Navigator.of(context).push(MaterialPageRoute( - builder: (_) => Scaffold( - body: SafeArea( - child: Stack( - children: [ - Center( - child: InteractiveViewer( - child: Image( - image: FileImage(image), - )), - ), - ABackButton(), - ], - ), + if (isImage) { + Navigator.of(context).push( + MaterialPageRoute( + builder: (_) => Scaffold( + body: SafeArea( + child: Stack( + children: [ + Center(child: isImage ? InteractiveViewer(child: Image(image: FileImage(file))) : const SizedBox.shrink()), + const ABackButton(), + ], ), - ))); + ), + ), + ), + ); + } }, child: Align( - alignment: Alignment.topRight, - child: IconButton( - padding: const EdgeInsets.all(2.0), - icon: Container( - padding: EdgeInsets.all(1), - decoration: BoxDecoration(color: Theme.of(context).scaffoldBackgroundColor.withOpacity(.3), borderRadius: BorderRadius.circular(8)), - child: Icon( - Icons.remove_circle, - color: AColors.red, - )), - onPressed: () { - onRemoveTap(image); - }, - )), + alignment: Alignment.topRight, + child: IconButton( + padding: const EdgeInsets.all(2.0), + icon: Container( + padding: const EdgeInsets.all(1), + decoration: BoxDecoration(color: Theme.of(context).scaffoldBackgroundColor.withOpacity(.3), borderRadius: BorderRadius.circular(8)), + child: const Icon( + Icons.remove_circle, + color: AColors.red, + ), + ), + onPressed: () { + onRemoveTap(file); + }, + ), + ), ), ); } diff --git a/pubspec.yaml b/pubspec.yaml index 4f82161b..076379b6 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -61,7 +61,7 @@ dependencies: flare_flutter: ^3.0.2 signature: ^5.3.0 flutter_svg: ^1.1.6 - + file_picker: ^5.2.5 dev_dependencies: flutter_test: