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] 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"