From 75fedf395ee2266bd60d1be037a6733b451a9f60 Mon Sep 17 00:00:00 2001 From: MaximusAshraf <50173497+MaximusAshraf@users.noreply.github.com> Date: Tue, 4 Apr 2023 22:25:25 +0200 Subject: [PATCH] new server edits --- lib/controllers/api_routes/api_manager.dart | 138 +++++++++ .../http_status_manger.dart | 0 lib/controllers/api_routes/urls.dart | 109 +++++--- .../providers/api/departments_provider.dart | 14 +- .../api/device_transfer_provider.dart | 88 ++++-- .../providers/api/devices_provider.dart | 78 ++++-- .../providers/api/gas_refill_provider.dart | 85 +++--- .../providers/api/hospitals_provider.dart | 39 +-- .../providers/api/notifications_provider.dart | 2 +- .../providers/api/parts_provider.dart | 36 +-- ...reventive_maintenance_visits_provider.dart | 23 +- .../api/regular_visits_provider.dart | 70 ++--- .../api/service_requests_provider.dart | 90 +++--- ...rovider.dart => assigned_to_provider.dart} | 12 +- .../employee/engineers_provider.dart | 74 +++++ .../gas_cylinder_size_provider.dart | 7 +- .../gas_cylinder_type_provider.dart | 74 +++++ .../gas_refill/gas_status_provider.dart | 7 +- .../gas_refill/gas_types_provider.dart | 7 +- .../pentry/pentry_status_provider.dart | 10 +- .../pentry/pentry_task_status_provider.dart | 10 +- .../pentry/pentry_visit_status_provider.dart | 10 +- .../service_report_defect_types_provider.dart | 11 +- .../service_report_last_calls_provider.dart | 19 +- .../service_report_priority_provider.dart | 11 +- .../service_report_reasons_provider.dart | 10 +- .../service_report_status_provider.dart | 11 +- .../report/service_report_types_provider.dart | 11 +- .../report/service_types_provider.dart | 11 +- .../service_request_status_provider.dart | 74 +++++ .../service_request_through_provider.dart | 74 +++++ .../service_request_type_provider.dart | 74 +++++ .../providers/api/user_provider.dart | 27 +- lib/main.dart | 14 +- lib/models/department.dart | 6 +- lib/models/device/device.dart | 14 +- lib/models/device/device_transfer.dart | 58 +++- lib/models/device/device_transfer_info.dart | 23 +- lib/models/engineer.dart | 31 +++ lib/models/gas_refill/gas_refill_details.dart | 19 +- lib/models/gas_refill/gas_refill_model.dart | 19 +- lib/models/hospital.dart | 6 +- lib/models/lookup.dart | 50 +++- lib/models/pantry/calibration_tools.dart | 26 +- lib/models/pantry/lookups/contact_person.dart | 2 +- lib/models/pantry/lookups/contact_title.dart | 2 +- lib/models/pantry/pentry.dart | 105 +++++-- lib/models/pantry/pm_kit.dart | 45 ++- lib/models/pantry/ppm_check_list.dart | 35 ++- lib/models/part.dart | 12 +- lib/models/service_report.dart | 21 +- .../service_request/service_request.dart | 77 +++--- .../service_request_search.dart | 36 ++- lib/models/user.dart | 62 +++-- lib/models/visits/visit.dart | 55 ++-- lib/models/visits/visits_group.dart | 64 +++-- lib/models/visits/visits_search.dart | 44 +-- .../device_transfer_details.dart | 4 +- .../request_device_transfer.dart | 6 +- .../update_device_transfer.dart | 16 +- lib/views/pages/login.dart | 15 +- lib/views/pages/register.dart | 2 +- lib/views/pages/splash_screen.dart | 9 +- .../user/gas_refill/gas_refill_details.dart | 5 +- .../user/gas_refill/request_gas_refill.dart | 67 +++-- lib/views/pages/user/land_page.dart | 15 +- lib/views/pages/user/profile_page.dart | 2 +- .../pages/user/requests/create_request.dart | 30 +- .../report/create_service_report.dart | 2 +- .../requests/report/edit_service_report.dart | 8 +- .../pages/user/requests/request_details.dart | 102 ++++--- .../pages/user/requests/requests_page.dart | 2 +- .../pages/user/visits/pantry/edit_pentry.dart | 20 +- .../preventive_maintenance_visits_page.dart | 4 +- .../user/visits/regular_visits_page.dart | 6 +- .../visits/update_visits_group_sheet.dart | 261 +++++++++--------- .../pages/user/visits/visit_details.dart | 3 +- .../device_transfer_info_section.dart | 4 +- .../device_trancfer/device_transfer_item.dart | 6 +- .../auto_complete_devices_field.dart | 6 +- .../equipment/auto_complete_models_field.dart | 92 ++++++ .../equipment/single_device_picker.dart | 65 +++-- .../gas_refill_create_details_item.dart | 9 +- .../widgets/gas_refill/gas_refill_item.dart | 4 +- .../gas_refill_update_details_item.dart | 8 +- .../hospital_auto_complete_field.dart | 16 +- .../widgets/loaders/loading_manager.dart | 2 +- .../auto_complete_devices_field.dart | 6 +- .../pentry/pentry_calibration_tool_form.dart | 2 +- .../widgets/pentry/pentry_info_form.dart | 33 ++- .../widgets/pentry/pentry_pm_kit_form.dart | 148 +++++----- .../requests/service_request_item.dart | 2 +- .../service_request_update_dialog.dart | 6 +- lib/views/widgets/search/filter_item.dart | 2 +- .../search/service_request_search_bar.dart | 98 ++++--- .../widgets/search/visits_search_bar.dart | 200 ++++++++------ ...ployee_mune.dart => assigned_to_mune.dart} | 8 +- .../status/employee/engineers_mune.dart | 37 +++ .../status/employee/single_type_menu.dart | 99 +++++++ .../status/gas_refill/gas_cylinder_type.dart | 38 +++ .../widgets/status/multi_status_menu.dart | 6 +- .../status/report/service_report_status.dart | 21 +- .../service_request_status_mune.dart | 40 +++ .../service_request_through_mune.dart | 38 +++ .../service_request_types_mune.dart | 39 +++ .../widgets/status/single_status_menu.dart | 17 +- lib/views/widgets/visits/visit_item.dart | 14 +- lib/views/widgets/visits/visit_status.dart | 6 +- pubspec.lock | 2 +- 109 files changed, 2610 insertions(+), 1185 deletions(-) create mode 100644 lib/controllers/api_routes/api_manager.dart rename lib/controllers/{http_status_manger => api_routes}/http_status_manger.dart (100%) rename lib/controllers/providers/api/status_drop_down/employee/{employee_provider.dart => assigned_to_provider.dart} (86%) create mode 100644 lib/controllers/providers/api/status_drop_down/employee/engineers_provider.dart create mode 100644 lib/controllers/providers/api/status_drop_down/gas_refill/gas_cylinder_type_provider.dart create mode 100644 lib/controllers/providers/api/status_drop_down/service_reqest/service_request_status_provider.dart create mode 100644 lib/controllers/providers/api/status_drop_down/service_reqest/service_request_through_provider.dart create mode 100644 lib/controllers/providers/api/status_drop_down/service_reqest/service_request_type_provider.dart create mode 100644 lib/models/engineer.dart create mode 100644 lib/views/widgets/equipment/auto_complete_models_field.dart rename lib/views/widgets/status/employee/{employee_mune.dart => assigned_to_mune.dart} (83%) create mode 100644 lib/views/widgets/status/employee/engineers_mune.dart create mode 100644 lib/views/widgets/status/employee/single_type_menu.dart create mode 100644 lib/views/widgets/status/gas_refill/gas_cylinder_type.dart create mode 100644 lib/views/widgets/status/service_request/service_request_status_mune.dart create mode 100644 lib/views/widgets/status/service_request/service_request_through_mune.dart create mode 100644 lib/views/widgets/status/service_request/service_request_types_mune.dart diff --git a/lib/controllers/api_routes/api_manager.dart b/lib/controllers/api_routes/api_manager.dart new file mode 100644 index 00000000..ae4eae9c --- /dev/null +++ b/lib/controllers/api_routes/api_manager.dart @@ -0,0 +1,138 @@ +import 'dart:convert'; + +import 'package:flutter/cupertino.dart'; +import 'package:fluttertoast/fluttertoast.dart'; +import 'package:http/http.dart' as http; +import 'package:http/http.dart'; + +class ApiManager { + + ApiManager._(); + + final Map _headers = {'Content-Type': 'application/json',}; + + static ApiManager instance = ApiManager._(); + + Future get( + String url, + {Map headers,} + ) async{ + + Uri _url = Uri.parse(url); + print(_url); + http.Response response = await http.get(_url,headers: headers); + if(response.body is! List){ + final message = jsonDecode(response.body)["message"]; + if(message != null && message.toString().isNotEmpty){ + Fluttertoast.showToast(msg: message ?? "",toastLength: Toast.LENGTH_LONG); + } + } + + return response; + } + + Future post( + String url, { + Map headers, + @required Map body, + } + ) async{ + + headers ??= {}; + + headers.addAll(_headers); + + Uri _url = Uri.parse(url); + print(_url); + print(headers); + print(json.encode(body)); + var request = http.Request('POST', _url); + request.body = json.encode(body); + request.headers.addAll(headers); + + http.StreamedResponse _streamedResponse = await request.send(); + http.Response response = await http.Response.fromStream(_streamedResponse); + print(response.statusCode); + print(response.body); + + if(response.body is! List){ + final message = jsonDecode(response.body)["message"]; + if(message != null && message.toString().isNotEmpty){ + Fluttertoast.showToast(msg: message ?? "",toastLength: Toast.LENGTH_LONG); + } + } + + return response; + } + + Future put( + String url, { + Map headers, + @required Map body, + } + ) async{ + + headers ??= {}; + + headers.addAll(_headers); + + Uri _url = Uri.parse(url); + print(_url); + print(headers); + print(json.encode(body)); + var request = http.Request('PUT', _url); + request.body = json.encode(body); + request.headers.addAll(headers); + + http.StreamedResponse streamedResponse = await request.send(); + http.Response response = await http.Response.fromStream(streamedResponse); + print(response.statusCode); + print(response.body); + if(response.body is! List){ + final message = jsonDecode(response.body)["message"]; + if(message != null && message.toString().isNotEmpty){ + Fluttertoast.showToast(msg: message ?? "",toastLength: Toast.LENGTH_LONG); + } + } + return response; + } + + Future multiPart( + String url, { + Map headers, + @required Map body, + @required List> files, + }) async{ + Map _headers = const {'Content-Type': 'multipart/form-data',}; + + headers ??= {}; + + headers.addAll(_headers); + + Uri _url = Uri.parse(url); + print(_url); + print(_headers); + print(json.encode(body)); + var request = http.MultipartRequest('POST', _url); + request.fields.addAll(body); + request.headers.addAll(_headers); + + for (var element in files) { + request.files.add(await element); + } + + //request.files.addAll(_files); + print(request.files); + http.StreamedResponse streamedResponse = await request.send(); + http.Response response = await http.Response.fromStream(streamedResponse); + print(response.statusCode); + print(response.body); + if(response.body is! List){ + final message = jsonDecode(response.body)["message"]; + if(message != null && message.toString().isNotEmpty){ + Fluttertoast.showToast(msg: message ?? "",toastLength: Toast.LENGTH_LONG); + } + } + return response; + } +} \ No newline at end of file diff --git a/lib/controllers/http_status_manger/http_status_manger.dart b/lib/controllers/api_routes/http_status_manger.dart similarity index 100% rename from lib/controllers/http_status_manger/http_status_manger.dart rename to lib/controllers/api_routes/http_status_manger.dart diff --git a/lib/controllers/api_routes/urls.dart b/lib/controllers/api_routes/urls.dart index be346745..70dca275 100644 --- a/lib/controllers/api_routes/urls.dart +++ b/lib/controllers/api_routes/urls.dart @@ -1,68 +1,85 @@ class URLs{ URLs._(); static const host2 = "http://194.163.164.213/atoms/api"; - static const host1 = "http://194.163.164.213/atoms/api"; + static const host1 = "http://109.123.243.118:9000"; + + static String _baseUrl = "$_host/mobile"; + + static String _host = host1; + + set host(String value) => _host = value; + + static String getFileUrl(String file) => file == null || file.isEmpty + ? null : "$_host/attachment/$file"; // API Routes - static const login = "/handle/user/login"; // post - static const register = "/handle/create/user"; // post - static const updateProfile = "/update/user/profile"; // post - static const getHospitals = "/handle/return/all/clients"; // get - static const getDepartments = "/handle/return/all/departments"; // get - static const getEquipment = "/handle/return/all/client/equipments"; // get ?client=208051 - static const getServiceRequests = "/return/user/calls"; // get + static get login => "$_baseUrl/MobileAuth/Login"; // post + static get register => "$_baseUrl/handle/create/user"; // post + static get updateProfile => "$_baseUrl/update/user/profile"; // post + static get getHospitals => "$_baseUrl/Customer/GetCustomers"; // get + static get getDepartments => "$_baseUrl/Customer/GetDepartmentLookup"; // get + static get getEquipment => "$_baseUrl/Asset/GetAssets"; // get ?client=208051 + static get getModels => "$_baseUrl/ModelDefinition/GetModelDefinitionAsset"; // get ?client=2 + // 08051 + static get getServiceRequests => "$_baseUrl/CallRequest/GetCallRequests"; // get + static get getServiceRequestThrough => "$_baseUrl/Lookups/GetLookup?lookupEnum=603"; // get + static get getServiceRequestTypes => "$_baseUrl/Lookups/GetLookup?lookupEnum=604"; // get + static get getServiceRequestStatus => "$_baseUrl/Lookups/GetLookup?lookupEnum=503"; - static const getPreventiveMaintenanceVisits = "/return/user/calibrations"; // get - static const updatePreventiveMaintenanceVisits = "/update/user/calibrations"; // get + static get getPreventiveMaintenanceVisits => "$_baseUrl/return/user/calibrations"; // get + static get updatePreventiveMaintenanceVisits => "$_baseUrl/Visit/UpdateVisits"; // get - static const getRegularVisits = "/return/user/ppm"; // get - static const updateRegularVisits = "/update/user/ppm"; // get + static get getRegularVisits => "$_baseUrl/Visit/GetVisits"; // get + static get updateRegularVisits => "$_baseUrl/Visit/UpdateVisits"; // get - static const getSingleServiceRequest = "/return/call/information"; // get - static const getNotifications = "/return/user/notification"; // get - static const getRecentNotifications = "/return/user/recent/notification"; // get - static const createRequest = "/handle/create/request"; // get - static const createReport = "/handle/create/report/issue"; // get - static const updateRequestDate = "/handle/update/request"; // get + static get getSingleServiceRequest => "$_baseUrl/return/call/information"; // get + static get getNotifications => "$_baseUrl/return/user/notification"; // get + static get getRecentNotifications => "$_baseUrl/return/user/recent/notification"; // get + static get createRequest => "$_baseUrl/CallRequest/AddCallRequest"; // get + static get createReport => "$_baseUrl/handle/create/report/issue"; // get + static get updateRequestDate => "$_baseUrl/handle/update/request"; // get // service report - static const createServiceReport = "/handle/create/service/report"; // get - static const updateServiceReport = "/handle/update/service/report"; // get - static const getServiceReport = "/handle/view/service/report"; // get - static const createDuplicatedReport = "/handle/duplicate/request"; // get + static get createServiceReport => "$_baseUrl/handle/create/service/report"; // get + static get updateServiceReport => "$_baseUrl/handle/update/service/report"; // get + static get getServiceReport => "$_baseUrl/WorkOrder/GetWorkOrderById"; // get + static get createDuplicatedReport => "$_baseUrl/handle/duplicate/request"; // get - static const getServiceReportReasons = "/return/service/report/reasons"; // get - static const getServiceReportTypes = "/return/service/report/type"; // get - static const getServiceReportStatus = "/return/service/report/status"; // get - static const getServiceReportLastCalls = "/return/call/last/situation"; // get - static const getServiceTypes = "/return/service/type"; // get - static const getPartNumber = "/handle/return/all/parts"; // get - static const getServiceReportPriority = "/return/call/priority/list"; // get - static const getServiceReportDefectTypes = "/return/call/defect/type/list"; // get + static get getServiceReportReasons => "$_baseUrl/Lookups/GetLookup?lookupEnum=522"; // get + static get getServiceReportTypes => "$_baseUrl/Lookups/GetLookup?lookupEnum=34"; // get + static get getServiceReportStatus => "$_baseUrl/Lookups/GetLookup?lookupEnum=521"; // get + static get getServiceReportLastCalls => "$_baseUrl/Lookups/GetLookup?lookupEnum=520"; // get + static get getServiceTypes => "$_baseUrl/Lookups/GetLookup?lookupEnum=604"; // get + static get getPartNumber => "$_baseUrl/PartCatalog/GetPartAutoComplete"; // get + static get getServiceReportPriority => "$_baseUrl/Lookups/GetLookup?lookupEnum=602"; // get + static get getServiceReportDefectTypes => "$_baseUrl/Lookups/GetLookup?lookupEnum=601"; // get //gas refill - static const getGasTypes = "/return/gas/refill/types"; // get - static const getGasCylinderSize = "/return/gas/refill/size/cylinder"; // get - static const getGasStatus = "/return/gas/refill/status"; // get - static const requestGasRefill = "/create/gas/refill"; // get - static const updateGasRefill = "/update/gas/refill/"; // get - static const getGasRefill = "/search/gas/refill"; // get + static get getGasTypes => "$_baseUrl/Lookups/GetLookup?lookupEnum=606"; // get + // todo check edits with backend + static get getGasCylinderSize => "$_baseUrl/Lookups/GetLookup?lookupEnum=608"; // get + static get getGasCylinderType => "$_baseUrl/Lookups/GetLookup?lookupEnum=607"; // get + static get getGasStatus => "$_baseUrl/Lookups/GetLookup?lookupEnum=609"; // get + static get requestGasRefill => "$_baseUrl/GazRefill/AddGazRefill"; // get + static get updateGasRefill => "$_baseUrl/GazRefill/UpdateGazRefill"; // get + static get getGasRefill => "$_baseUrl/GazRefill/GetGazRefills"; // get //device transfer - static const requestDeviceTransfer = "/create/transfer/asset"; // get - static const updateDeviceTransfer = "/update/transfer/asset"; // get - static const getDeviceTransfer = "/search/transfer/asset"; // get + static get requestDeviceTransfer => "$_baseUrl/AssetTransfer/AddAssetTransfer"; // get + static get updateDeviceTransfer => "$_baseUrl/AssetTransfer/UpdateAssetTransfer"; // get + static get getDeviceTransfer => "$_baseUrl/AssetTransfer/GetAssetTransfers"; // get // employee - static const getEmployees = "/return/assigned/employee"; // get + static get getEmployees => "$_baseUrl/Lookups/GetLookup?lookupEnum=33"; // get + static get getEngineers => "$_baseUrl/Account/GetUserByRoleValue?value=R-6"; // get // pentry - static const getPentry = "/return/pentry/details"; // get - static const updatePentry = "/update/pentry/details"; // get - static const getPentryTaskStatus = "/return/pentry/task/status"; // get - static const getPentryVisitStatus = "/return/pentry/visit/status/list"; // get - static const getPentryStatus = "/return/pentry/status/list"; // get + static get getPentry => "$_baseUrl/return/pentry/details"; // get + static get updatePentry => "$_baseUrl/Visit/UpdateVisit"; // get + static get getPentryTaskStatus => "$_baseUrl/Lookups/GetLookup?lookupEnum=403"; // get + static get getPentryVisitStatus => "$_baseUrl/Lookups/GetLookup?lookupEnum=402"; // get + static get getPentryStatus => "$_baseUrl/Lookups/GetLookup?lookupEnum=401"; // get // contacts - static const getPentryContacts = "/handle/return/all/contacts"; // get + static get getPentryContacts => "$_baseUrl/handle/return/all/contacts"; // get } \ No newline at end of file diff --git a/lib/controllers/providers/api/departments_provider.dart b/lib/controllers/providers/api/departments_provider.dart index 1b66771d..07b0a57b 100644 --- a/lib/controllers/providers/api/departments_provider.dart +++ b/lib/controllers/providers/api/departments_provider.dart @@ -1,5 +1,6 @@ import 'dart:convert'; +import 'package:test_sa/controllers/api_routes/api_manager.dart'; import 'package:test_sa/controllers/api_routes/urls.dart'; import 'package:test_sa/models/department.dart'; import 'package:flutter/cupertino.dart'; @@ -41,11 +42,12 @@ class DepartmentsProvider extends ChangeNotifier{ notifyListeners(); Response response; try{ - response = await get( - Uri.parse(host + URLs.getDepartments), - headers: { - "Content-Type":"application/json; charset=utf-8" - } + response = await ApiManager.instance.post( + URLs.getDepartments, + body: { + "pageSize":50, + // if(title != null && title.isNotEmpty) "name":title, + } ); } catch(error) { isLoading = false; @@ -56,7 +58,7 @@ class DepartmentsProvider extends ChangeNotifier{ stateCode = response.statusCode; if(response.statusCode >= 200 && response.statusCode < 300) { // client's request was successfully received - List listJson = json.decode(utf8.decode(response.bodyBytes).replaceAll("\\", "")); + List listJson = json.decode(response.body)["data"]; departments = listJson.map((department) => Department.fromJson(department)).toList(); } isLoading = false; diff --git a/lib/controllers/providers/api/device_transfer_provider.dart b/lib/controllers/providers/api/device_transfer_provider.dart index 907ae2ff..ff1b77f3 100644 --- a/lib/controllers/providers/api/device_transfer_provider.dart +++ b/lib/controllers/providers/api/device_transfer_provider.dart @@ -1,7 +1,8 @@ import 'dart:convert'; +import 'package:test_sa/controllers/api_routes/api_manager.dart'; import 'package:test_sa/controllers/api_routes/urls.dart'; -import 'package:test_sa/controllers/http_status_manger/http_status_manger.dart'; +import 'package:test_sa/controllers/api_routes/http_status_manger.dart'; import 'package:test_sa/models/department.dart'; import 'package:test_sa/models/device/device_transfer.dart'; import 'package:test_sa/models/device/device.dart'; @@ -74,19 +75,19 @@ class DeviceTransferProvider extends ChangeNotifier{ // return 200; Response response; try{ - response = await get( - Uri.parse( - "$host${URLs.getDeviceTransfer}?uid=${user.id}" - "&token=${user.token}&page=${(items?.length ?? 0) ~/pageItemNumber}" - ), - headers: { - "Content-Type":"application/json; charset=utf-8" - } + Map body = {}; + body["pageNumber"] = (items?.length ?? 0) ~/pageItemNumber + 1; + body["pageSize"] = pageItemNumber; + + response = await ApiManager.instance.post( + URLs.getDeviceTransfer, + body: body, ); + stateCode = response.statusCode; if(stateCode >= 200 && stateCode < 300) { // client's request was successfully received - List listJson = json.decode(utf8.decode(response.bodyBytes).replaceAll("\\", "")); + List listJson = json.decode(response.body)["data"]; List itemsPage = listJson.map( (request) => DeviceTransfer.fromJson(request)).toList(); items ??= []; @@ -116,23 +117,22 @@ class DeviceTransferProvider extends ChangeNotifier{ @required DeviceTransfer model, }) async { Map body = { - "uid": user.id.toString(), - "token": user.token ?? "", - "serial_id": model.device.id ?? "", - "destination_client": model.receiver.client.id ?? "", - "destination_department": model.receiver.department.id ?? "", + // "uid": user.id.toString(), + // "token": user.token ?? "", + "assetId": model.device.id ?? "", + "destSiteId": model.receiver.client.id ?? "", + "destDepartmentId": model.receiver.department.id ?? "", + "senderSiteId": model.receiver.client.id ?? "", }; Response response; try{ - response = await post( - Uri.parse( - host+URLs.requestDeviceTransfer), - body: body, + response = await ApiManager.instance.post( + URLs.requestDeviceTransfer, + body: body ); - stateCode = response.statusCode; if(response.statusCode >= 200 && response.statusCode < 300) { if(items != null) { items.insert( @@ -156,24 +156,58 @@ class DeviceTransferProvider extends ChangeNotifier{ @required String host, @required User user, @required bool isSender, - @required String requestId, + @required int requestId, @required DeviceTransfer oldModel, @required DeviceTransferInfo newModel, }) async { Map body = { - "uid": user.id.toString(), - "token": user.token ?? "", - "current_user": user.id ?? "", + "id": oldModel.id, + "assetId": oldModel.device.id ?? "", + "senderSiteId": oldModel.sender.client.id, + "destSiteId": oldModel.receiver.client.id, + "destDepartmentId": oldModel.receiver.department.id, }; + + if(isSender){ + body.addAll( + { + //"senderSiteId": newModel.client.id, + //"senderDepartmentId": newModel.department.id, + "senderAssignedEmployeeId": newModel.userId, + "senderMachineStatusId": newModel.status.id, + "senderComment": newModel.comment, + "senderWorkingHours": newModel.workingHours, + "senderTravelingHours": newModel.travelingHours, + "senderAttachmentName": "${DateTime.now().toIso8601String()}.png|${newModel.signature}", + } + ); + }else{ + body.addAll( + { + //"destSiteId": newModel.client.id, + //"destDepartmentId": newModel.department.id, + "receiverAssignedEmployeeId": newModel.userId, + "receiverMachineStatusId": newModel.status.id, + "receiverComment": newModel.comment, + "receiverWorkingHours": newModel.workingHours, + "receiverTravelingHours": newModel.travelingHours, + "receiverAttachmentName": "${DateTime.now().toIso8601String()}.png|${newModel.signature}", + } + ); + } body.addAll(newModel.toJson(isSender)); Response response; try{ - response = await post( - Uri.parse("$host${URLs.updateDeviceTransfer}/$requestId"), - body: body, + response = await ApiManager.instance.put( + URLs.updateDeviceTransfer, + body: body ); + // response = await post( + // Uri.parse("$host${URLs.updateDeviceTransfer}/$requestId"), + // body: body, + // ); stateCode = response.statusCode; if(response.statusCode >= 200 && response.statusCode < 300) { diff --git a/lib/controllers/providers/api/devices_provider.dart b/lib/controllers/providers/api/devices_provider.dart index d434551f..e957cb17 100644 --- a/lib/controllers/providers/api/devices_provider.dart +++ b/lib/controllers/providers/api/devices_provider.dart @@ -1,7 +1,9 @@ import 'dart:convert'; +import 'package:test_sa/controllers/api_routes/api_manager.dart'; import 'package:test_sa/controllers/api_routes/urls.dart'; import 'package:test_sa/models/device/device.dart'; +import 'package:test_sa/models/lookup.dart'; import 'package:test_sa/models/user.dart'; import 'package:flutter/cupertino.dart'; import 'package:http/http.dart'; @@ -41,7 +43,9 @@ class DevicesProvider extends ChangeNotifier{ Future getEquipment ({ @required String host, @required User user, - @required String hospitalId + @required int hospitalId, + String serialNumber, + String number, }) async { if(_loading == true) return -2; @@ -49,11 +53,14 @@ class DevicesProvider extends ChangeNotifier{ notifyListeners(); Response response; try{ - response = await get( - Uri.parse(host + URLs.getEquipment+"?client=$hospitalId"), - headers: { - "Content-Type":"application/json; charset=utf-8" - } + response = await ApiManager.instance.post( + URLs.getEquipment, + body: { + "pageSize":50, + "siteId":hospitalId, + if(serialNumber?.isEmpty == false) "assetSerialNumber":serialNumber, + if(number?.isEmpty == false) "assetNo":number, + } ); } catch(error) { _loading = false; @@ -64,7 +71,7 @@ class DevicesProvider extends ChangeNotifier{ _stateCode = response.statusCode; if(response.statusCode >= 200 && response.statusCode < 300) { // client's request was successfully received - List equipmentListJson = json.decode(utf8.decode(response.bodyBytes)); + List equipmentListJson = json.decode(response.body)["data"]; _devices = equipmentListJson.map((device) => Device.fromJson(device)).toList(); } _loading = false; @@ -80,31 +87,70 @@ class DevicesProvider extends ChangeNotifier{ Future> getDevicesList ({ @required String host, @required User user, - @required String hospitalId, + @required int hospitalId, String serialNumber, String number, }) async { Response response; try{ - response = await get( - Uri.parse("$host${URLs.getEquipment}?client=$hospitalId" - "${serialNumber?.isEmpty == false ? "&name=$serialNumber" :""}" - "${number?.isEmpty == false ? "&number=$number" : ""}" - ), + response = await ApiManager.instance.post( + URLs.getEquipment, + body: { + "pageSize":50, + "siteId":hospitalId, + if(serialNumber?.isEmpty == false) "assetSerialNumber":serialNumber, + if(number?.isEmpty == false) "assetNo":number, + } ); + // response = await get( + // Uri.parse("$host${URLs.getEquipment}?siteId=$hospitalId" + // "${serialNumber?.isEmpty == false ? "&assetSerialNumber=$serialNumber" :""}" + // "${number?.isEmpty == false ? "&assetNo=$number" : ""}" + // ), + // ); List page = []; if(response.statusCode >= 200 && response.statusCode < 300) { // client's request was successfully received - List categoriesListJson = json.decode(utf8.decode(response.bodyBytes)); - page = categoriesListJson.map((device) => Device.fromJson(device)).toList(); + List equipmentListJson = json.decode(response.body)["data"]; + page = equipmentListJson.map((device) => Device.fromJson(device)).toList(); + } + return page; + } catch(error) { + print(error); + return []; + } + + } + + Future> getModels({ + String code, + }) async { + Response response; + try{ + response = await ApiManager.instance.get( + URLs.getModels+"?code=$code", + ); + List page = []; + if(response.statusCode >= 200 && response.statusCode < 300) { + // client's request was successfully received + List categoriesListJson = json.decode(response.body)["data"]; + page = categoriesListJson.map((json) => + Lookup( + name: json["modelDefCode"], + id: json["id"], + value: json["id"], + ) + ).toList(); } return page; } catch(error) { + print(error); return []; } } + /// return -2 if request in progress /// return -1 if error happen when sending request /// return state code if request complete may be 200, 404 or 403 @@ -113,7 +159,7 @@ class DevicesProvider extends ChangeNotifier{ Future> getDevicesListBySN ({ @required String host, @required User user, - @required String hospitalId, + @required int hospitalId, @required String sn }) async { Response response; diff --git a/lib/controllers/providers/api/gas_refill_provider.dart b/lib/controllers/providers/api/gas_refill_provider.dart index 5297ae06..da3b6077 100644 --- a/lib/controllers/providers/api/gas_refill_provider.dart +++ b/lib/controllers/providers/api/gas_refill_provider.dart @@ -1,7 +1,8 @@ import 'dart:convert'; +import 'package:test_sa/controllers/api_routes/api_manager.dart'; import 'package:test_sa/controllers/api_routes/urls.dart'; -import 'package:test_sa/controllers/http_status_manger/http_status_manger.dart'; +import 'package:test_sa/controllers/api_routes/http_status_manger.dart'; import 'package:test_sa/models/gas_refill/gas_refill_model.dart'; import 'package:test_sa/models/issue.dart'; import 'package:test_sa/models/service_report.dart'; @@ -53,20 +54,19 @@ class GasRefillProvider extends ChangeNotifier{ return -2; isLoading = true; Response response; - try{ - response = await get( - Uri.parse( - "$host${URLs.getGasRefill}?uid=${user.id}" - "&token=${user.token}&page=${(items?.length ?? 0) ~/pageItemNumber}" - ), - headers: { - "Content-Type":"application/json; charset=utf-8" - } + + Map body = {}; + body["pageNumber"] = (items?.length ?? 0) ~/pageItemNumber + 1; + body["pageSize"] = pageItemNumber; + + response = await ApiManager.instance.post( + URLs.getGasRefill, + body: body, ); stateCode = response.statusCode; if(stateCode >= 200 && stateCode < 300) { // client's request was successfully received - List requestsListJson = json.decode(utf8.decode(response.bodyBytes)); + List requestsListJson = json.decode(response.body)["data"]; List itemsPage = requestsListJson.map( (request) => GasRefillModel.fromJson(request)).toList(); items ??= []; @@ -77,11 +77,13 @@ class GasRefillProvider extends ChangeNotifier{ nextPage = false; } } + try{ isLoading = false; notifyListeners(); return response.statusCode; } catch(error) { + print(error); isLoading = false; stateCode = -1; notifyListeners(); @@ -98,39 +100,34 @@ class GasRefillProvider extends ChangeNotifier{ Map body = { "uid": user.id.toString(), "token": user.token ?? "", - "title": model.title ?? "", - "status": "0",//model.status.value.toString(), + "GazRefillNo": "GR-${DateTime.now().toString().split(" ").first}", + "status": model.status.toMap(), }; - body["details"] = jsonEncode(model.details.map((model) => { - "type": model.type.id?.toString(), - "size": model.cylinderSize?.id.toString(), - "requsted_qty": model.requestedQuantity.toString(), - }).toList()); + body["gazRefillDetails"] = model.details.map((model) => { + "gasType": model.type.toMap(), + "cylinderSize": model.cylinderSize.toMap(), + "cylinderType": model.cylinderType.toMap(), + "requestedQty": model.requestedQuantity, + }).toList(); Response response; try{ - response = await post( - Uri.parse( - host+URLs.requestGasRefill), - body: body, + response = await ApiManager.instance.post( + URLs.requestGasRefill, + body: body ); - stateCode = response.statusCode; if(response.statusCode >= 200 && response.statusCode < 300) { if(items != null) { - items.insert( - 0, - GasRefillModel.fromJson( - json.decode(utf8.decode(response.bodyBytes))[0] - ) - ); + reset(); notifyListeners(); } } return response.statusCode; } catch(error) { + print(error); return -1; } @@ -143,25 +140,29 @@ class GasRefillProvider extends ChangeNotifier{ @required GasRefillModel newModel, }) async { Map body = { - "uid": user.id.toString(), - "token": user.token ?? "", - "title": newModel.title ?? "", - "status": newModel.status.id.toString(), + "id":newModel.id, + "gazRefillNo": newModel.title ?? "", + "status": newModel.status.toMap(), }; - body["details"] = jsonEncode(newModel.details.map((model) => { - "type": model.type.id.toString(), - "size": model.cylinderSize.id.toString(), - "requsted_qty": model.requestedQuantity.toString(), - "deliverd_qty": model.deliveredQuantity.toString(), - }).toList()); + body["gazRefillDetails"] = newModel.details.map((model) => { + "gasType": model.type.toMap(), + "cylinderSize": model.cylinderSize.toMap(), + "cylinderType": model.cylinderType.toMap(), + "requestedQty": model.requestedQuantity, + "deliverdQty": model.deliveredQuantity, + }).toList(); Response response; try{ - response = await post( - Uri.parse("$host${URLs.updateGasRefill}/${newModel.id}"), - body: body, + response = await ApiManager.instance.put( + URLs.updateGasRefill, + body: body ); + // response = await post( + // Uri.parse("$host${URLs.updateGasRefill}/${newModel.id}"), + // body: body, + // ); stateCode = response.statusCode; if(response.statusCode >= 200 && response.statusCode < 300) { diff --git a/lib/controllers/providers/api/hospitals_provider.dart b/lib/controllers/providers/api/hospitals_provider.dart index 5e3c4509..7b19a6e1 100644 --- a/lib/controllers/providers/api/hospitals_provider.dart +++ b/lib/controllers/providers/api/hospitals_provider.dart @@ -1,5 +1,6 @@ import 'dart:convert'; +import 'package:test_sa/controllers/api_routes/api_manager.dart'; import 'package:test_sa/controllers/api_routes/urls.dart'; import 'package:test_sa/models/hospital.dart'; import 'package:test_sa/models/user.dart'; @@ -55,20 +56,18 @@ class HospitalsProvider extends ChangeNotifier{ notifyListeners(); Response response; try{ - response = await get( - Uri.parse( - host + URLs.getHospitals - + "?page=${(_hospitals?.length ?? 0) ~/pageItemNumber}" - + ( title == null || title.isEmpty ? "" : "&name=$title" ) - ), - headers: { - "Content-Type":"application/json; charset=utf-8" - } + response = await ApiManager.instance.post( + URLs.getHospitals, + body: { + "pageNumber":(hospitals?.length ?? 0) ~/pageItemNumber + 1, + "pageSize":50, + if(title != null && title.isNotEmpty) "name":title, + } ); _stateCode = response.statusCode; if(response.statusCode >= 200 && response.statusCode < 300) { // client's request was successfully received - List categoriesListJson = json.decode(utf8.decode(response.bodyBytes)); + List categoriesListJson = json.decode(response.body)["data"]; List _page = categoriesListJson.map((category) => Hospital.fromJson(category)).toList(); if(hospitals == null) _hospitals = []; @@ -95,20 +94,26 @@ class HospitalsProvider extends ChangeNotifier{ Future> getHospitalsList ({String host,User user,String title}) async { Response response; try{ - - response = await get( - Uri.parse(host + URLs.getHospitals - + ( title == null || title.isEmpty ? "" : "?name=$title" )), - headers: { - "Content-Type":"application/json; charset=utf-8" + response = await ApiManager.instance.post( + URLs.getHospitals, + body: { + "pageSize":50, + if(title != null && title.isNotEmpty) "name":title, } ); + // response = await get( + // Uri.parse(host + URLs.getHospitals + // + ( title == null || title.isEmpty ? "" : "?name=$title" )), + // headers: { + // "Content-Type":"application/json; charset=utf-8" + // } + // ); _stateCode = response.statusCode; List _page = []; if(response.statusCode >= 200 && response.statusCode < 300) { // client's request was successfully received - List categoriesListJson = json.decode(utf8.decode(response.bodyBytes)); + List categoriesListJson = json.decode(response.body)["data"]; _page = categoriesListJson.map((category) => Hospital.fromJson(category)).toList(); } return _page; diff --git a/lib/controllers/providers/api/notifications_provider.dart b/lib/controllers/providers/api/notifications_provider.dart index 0bea5f26..36abef10 100644 --- a/lib/controllers/providers/api/notifications_provider.dart +++ b/lib/controllers/providers/api/notifications_provider.dart @@ -43,7 +43,7 @@ class NotificationsProvider extends ChangeNotifier{ Future getNotifications ({ @required String host, @required User user, - @required String hospitalId, + @required int hospitalId, }) async { if(isLoading == true) return -2; diff --git a/lib/controllers/providers/api/parts_provider.dart b/lib/controllers/providers/api/parts_provider.dart index 6f763f77..864adaeb 100644 --- a/lib/controllers/providers/api/parts_provider.dart +++ b/lib/controllers/providers/api/parts_provider.dart @@ -1,5 +1,6 @@ import 'dart:convert'; +import 'package:test_sa/controllers/api_routes/api_manager.dart'; import 'package:test_sa/controllers/api_routes/urls.dart'; import 'package:test_sa/models/part.dart'; import 'package:test_sa/models/user.dart'; @@ -55,16 +56,12 @@ class PartsProvider extends ChangeNotifier{ notifyListeners(); Response response; try{ - response = await get( - Uri.parse( - host + URLs.getPartNumber - + "?page=${(_parts?.length ?? 0) ~/pageItemNumber}" - + ( title == null || title.isEmpty ? "" : "&name=$title" ) - ), - headers: { - "Content-Type":"application/json; charset=utf-8" - } - ); + response = await ApiManager.instance.post( + URLs.getPartNumber, + body: { + if(title != null && title.isNotEmpty) + "partName":title + }); _stateCode = response.statusCode; if(response.statusCode >= 200 && response.statusCode < 300) { // client's request was successfully received @@ -100,24 +97,21 @@ class PartsProvider extends ChangeNotifier{ Future> getPartsList ({String host,User user,String title}) async { Response response; try{ - - response = await get( - Uri.parse( - host + URLs.getPartNumber - + ( title == null || title.isEmpty ? "" : "?name=$title" ) - ), - headers: { - "Content-Type":"application/json; charset=utf-8" - } - ); + response = await ApiManager.instance.post( + URLs.getPartNumber, + body: { + if(title != null && title.isNotEmpty) + "partName":title + }); List _page = []; if(response.statusCode >= 200 && response.statusCode < 300) { // client's request was successfully received - List categoriesListJson = json.decode(utf8.decode(response.bodyBytes)); + List categoriesListJson = json.decode(response.body)["data"]; _page = categoriesListJson.map((part) => Part.fromJson(part)).toList(); } return _page; } catch(error) { + print(error); return []; } diff --git a/lib/controllers/providers/api/preventive_maintenance_visits_provider.dart b/lib/controllers/providers/api/preventive_maintenance_visits_provider.dart index 14103fd6..9d209fec 100644 --- a/lib/controllers/providers/api/preventive_maintenance_visits_provider.dart +++ b/lib/controllers/providers/api/preventive_maintenance_visits_provider.dart @@ -1,5 +1,6 @@ import 'dart:convert'; +import 'package:test_sa/controllers/api_routes/api_manager.dart'; import 'package:test_sa/controllers/api_routes/urls.dart'; import 'package:test_sa/models/user.dart'; import 'package:test_sa/models/visits/visit.dart'; @@ -60,7 +61,7 @@ class PreventiveMaintenanceVisitsProvider extends ChangeNotifier{ +"?uid=${user.id}" "&token=${user.token}" "&page=${(visits?.length ?? 0) ~/pageItemNumber}" - +visitsSearch?.toSearchString() ?? "" + // +visitsSearch?.toMap() ?? "" ), headers: { "Content-Type":"application/json; charset=utf-8" @@ -104,24 +105,20 @@ class PreventiveMaintenanceVisitsProvider extends ChangeNotifier{ }) async { Response response; Map body = group.toJson(); - body["token"] = user.token ?? ""; - body["uid"] = user.id; + // body["token"] = user.token ?? ""; + // body["uid"] = user.id; //userId = 397.toString(); // testing id to view data try{ - response = await post( - Uri.parse( - host+URLs.updatePreventiveMaintenanceVisits - ), - body: body, - ); + response = await ApiManager.instance.put( + URLs.updatePreventiveMaintenanceVisits, body: body); stateCode = response.statusCode; if(response.statusCode >= 200 && response.statusCode < 300) { // client's request was successfully received - group.visits.forEach((visit) { - visit.status = group.status; - visit.actualDate = group.date.toString().split(" ").first; - }); + // group.visits.forEach((visit) { + // visit.status = group.status; + // visit.actualDate = group.date.toString().split(" ").first; + // }); group.visits.clear(); notifyListeners(); } diff --git a/lib/controllers/providers/api/regular_visits_provider.dart b/lib/controllers/providers/api/regular_visits_provider.dart index 03737f73..d9baaec1 100644 --- a/lib/controllers/providers/api/regular_visits_provider.dart +++ b/lib/controllers/providers/api/regular_visits_provider.dart @@ -1,5 +1,6 @@ import 'dart:convert'; +import 'package:test_sa/controllers/api_routes/api_manager.dart'; import 'package:test_sa/controllers/api_routes/urls.dart'; import 'package:test_sa/models/pantry/pentry.dart'; import 'package:test_sa/models/user.dart'; @@ -8,11 +9,12 @@ import 'package:test_sa/models/visits/visits_group.dart'; import 'package:test_sa/models/visits/visits_search.dart'; import 'package:flutter/cupertino.dart'; import 'package:http/http.dart'; +import 'package:logger/logger.dart'; class RegularVisitsProvider extends ChangeNotifier{ // number of items call in each request - final pageItemNumber = 50; + final pageItemNumber = 20; //reset provider data void reset(){ @@ -52,20 +54,19 @@ class RegularVisitsProvider extends ChangeNotifier{ if(isLoading == true) return -2; isLoading = true; + if(visits == null) notifyListeners(); Response response; //userId = 397.toString(); // testing id to view data + try{ - response = await get( - Uri.parse( - host+URLs.getRegularVisits - +"?uid=${user.id}" - "&token=${user.token}" - "&page=${(visits?.length ?? 0) ~/pageItemNumber}" - +visitsSearch?.toSearchString() ?? "" - ), - headers: { - "Content-Type":"application/json; charset=utf-8" - } + Map body = {}; + body.addAll(visitsSearch.toMap()); + body["pageNumber"] = (visits?.length ?? 0) ~/pageItemNumber +1; + body["pageSize"] = pageItemNumber; + + response = await ApiManager.instance.post( + URLs.getRegularVisits, + body: body, ); } catch(error) { isLoading = false; @@ -77,12 +78,11 @@ class RegularVisitsProvider extends ChangeNotifier{ if(response.statusCode >= 200 && response.statusCode < 300) { // client's request was successfully received try{ - List requestsListJson = json.decode(utf8.decode(response.bodyBytes).replaceAll("\\", "")); + List requestsListJson = json.decode(response.body)["data"]; List _visits = requestsListJson.map( (request) => Visit.fromJson(request) ).toList(); - if(visits == null) - visits = []; + visits ??= []; visits.addAll(_visits); if(_visits.length == pageItemNumber){ nextPage = true; @@ -90,12 +90,12 @@ class RegularVisitsProvider extends ChangeNotifier{ nextPage = false; } }catch(error){ + Logger().e(error); isLoading = false; stateCode = -1; notifyListeners(); return -1; } - } isLoading = false; notifyListeners(); @@ -113,14 +113,13 @@ class RegularVisitsProvider extends ChangeNotifier{ VisitsGroup group, }) async { Response response; - Map body = group.toJson(); - body["token"] = user.token ?? ""; - body["uid"] = user.id; - //userId = 397.toString(); // testing id to view data + try{ - response = await post( - Uri.parse(host+URLs.updateRegularVisits), - body: body, + Map body = group.toJson(); + + response = await ApiManager.instance.post( + URLs.getRegularVisits, + body: body, ); stateCode = response.statusCode; if(response.statusCode >= 200 && response.statusCode < 300) { @@ -138,7 +137,7 @@ class RegularVisitsProvider extends ChangeNotifier{ } } - Future getPently({String host,User user,String id}) async { + Future getPently({String host,User user,int id}) async { Response response; response = await get( Uri.parse("$host${URLs.getPentry}/$id"), @@ -162,20 +161,29 @@ class RegularVisitsProvider extends ChangeNotifier{ }) async { try{ Response response; - Map body = pentry.toMap(); - body["uid"] = user.id; - body["token"] = user.token; - response = await post( - Uri.parse(host+URLs.updatePentry + "/${visit.id}"), - body: body, + Map body = pentry.toMap(visit.id); + body["id"] = visit.id; + body["assetId"] = visit.deviceId; + // body["token"] = user.token; + // body["vChecklists"]?.addAll({}); + // body["vCalibrationTools"]?.addAll({"visitId": visit.id,}); + // body["vKits"]?.add({"visitId": visit.id,}); + response = await ApiManager.instance.put( + URLs.updatePentry, body: body ); + + // response = await post( + // Uri.parse(host+URLs.updatePentry + "/${visit.id}"), + // body: body, + // ); if(response.statusCode >= 200 && response.statusCode < 300) { - visit.status = pentry.ppmVisitStatus; + reset();//visit.status = pentry.ppmVisitStatus; notifyListeners(); } return response.statusCode; } catch(error) { + print(error); return -1; } diff --git a/lib/controllers/providers/api/service_requests_provider.dart b/lib/controllers/providers/api/service_requests_provider.dart index cb62d06b..67f7f5ab 100644 --- a/lib/controllers/providers/api/service_requests_provider.dart +++ b/lib/controllers/providers/api/service_requests_provider.dart @@ -1,7 +1,8 @@ import 'dart:convert'; +import 'package:test_sa/controllers/api_routes/api_manager.dart'; import 'package:test_sa/controllers/api_routes/urls.dart'; -import 'package:test_sa/controllers/http_status_manger/http_status_manger.dart'; +import 'package:test_sa/controllers/api_routes/http_status_manger.dart'; import 'package:test_sa/models/issue.dart'; import 'package:test_sa/models/lookup.dart'; import 'package:test_sa/models/service_report.dart'; @@ -51,36 +52,33 @@ class ServiceRequestsProvider extends ChangeNotifier{ Future getRequests ({ @required String host, @required User user, - @required String hospitalId, + @required int hospitalId, }) async { if(isLoading == true) return -2; isLoading = true; + if(serviceRequests == null) notifyListeners(); Response response; try{ - response = await get( - Uri.parse( - host+URLs.getServiceRequests - +"?uid=${user.id}" - +(hospitalId == null? "" :"&client_nid=$hospitalId") - +"&token=${user.token}" - "&page=${(serviceRequests?.length ?? 0) ~/pageItemNumber}" - +search?.toSearchString() ?? "" - ), - headers: { - "Content-Type":"application/json; charset=utf-8" - } + Map body = {}; + body.addAll(search.toMap()); + body["pageNumber"] = (serviceRequests?.length ?? 0) ~/pageItemNumber + 1; + body["pageSize"] = pageItemNumber; + + response = await ApiManager.instance.post( + URLs.getServiceRequests, + body: body, ); + stateCode = response.statusCode; if(response.statusCode >= 200 && response.statusCode < 300) { // client's request was successfully received - List requestsListJson = json.decode(utf8.decode(response.bodyBytes).replaceAll("\\", "")); - List _serviceRequestsPage = requestsListJson.map( + List requestsListJson = json.decode(response.body)["data"]; + List serviceRequestsPage = requestsListJson.map( (request) => ServiceRequest.fromJson(request)).toList(); - if(serviceRequests == null) - serviceRequests = []; - serviceRequests.addAll(_serviceRequestsPage); - if(_serviceRequestsPage.length == pageItemNumber){ + serviceRequests ??= []; + serviceRequests.addAll(serviceRequestsPage); + if(serviceRequestsPage.length == pageItemNumber){ nextPage = true; }else{ nextPage = false; @@ -91,6 +89,7 @@ class ServiceRequestsProvider extends ChangeNotifier{ return response.statusCode; } catch(error) { + print(error); isLoading = false; stateCode = -1; notifyListeners(); @@ -144,26 +143,31 @@ class ServiceRequestsProvider extends ChangeNotifier{ }) async { var body = { - "uid": user.id, - "token": user.token ?? "", - "sn_id": serviceRequest.deviceId ?? "", - "date": (DateTime.now().millisecondsSinceEpoch).toString(), - "client": user.hospital.id ?? '', - "complaint": serviceRequest.maintenanceIssue, - "image": json.encode(serviceRequest.devicePhotos), - "priority": (serviceRequest.priority?.id).toString(), - "defect_types": (serviceRequest.defectType?.id).toString(), + "callCreatedBy": { + "id":user.id, + "name":user.userName + }, + "assets":serviceRequest.deviceId == null ? [] : [serviceRequest.deviceId], + "requestedDate": DateTime.now().toIso8601String(), + "requestedTime": DateTime.now().toIso8601String(), + "client": user.hospital?.id ?? '', + "callComments": serviceRequest.maintenanceIssue, + "attachmentsCallRequest": serviceRequest.devicePhotos.map((e) => {"name":e}).toList(), + "priority": serviceRequest.priority.toMap(), + "defectType": serviceRequest.defectType.toMap(), + "typeofRequest":serviceRequest.type.toMap(), + "requestedThrough":serviceRequest.type.toMap(), }; if(serviceRequest.audio != null){ - body["audio"] = serviceRequest.audio; + body["voiceNote"] = serviceRequest.audio; } Response response; try{ - response = await post( - Uri.parse( - host+URLs.createRequest), - body: body, + response = await ApiManager.instance.post( + URLs.createRequest, + body: body ); + stateCode = response.statusCode; if(response.statusCode >= 200 && response.statusCode < 300) { if(serviceRequests != null) @@ -178,6 +182,7 @@ class ServiceRequestsProvider extends ChangeNotifier{ return response.statusCode; } catch(error) { + print(error); return -1; } @@ -232,7 +237,7 @@ class ServiceRequestsProvider extends ChangeNotifier{ ); stateCode = response.statusCode; if(response.statusCode >= 200 && response.statusCode < 300) { - request.engineerName = employee.label; + request.engineerName = employee.name; notifyListeners(); } return response.statusCode; @@ -385,21 +390,12 @@ class ServiceRequestsProvider extends ChangeNotifier{ @required User user, @required Subtitle subtitle, }) async { - String userData = ''; - if(user != null){ - userData += "&uid="+user.id; - userData += "&token="+user.token; - } Response response; try{ - - response = await get( - Uri.parse( - host+URLs.getServiceReport - +'?report_id=$reportId' - '$userData',) - ); + response = await ApiManager.instance.get( + URLs.getServiceReport + "?workOrderId=$reportId", + ); }catch(error){ throw(HttpStatusManger.getStatusMessage( diff --git a/lib/controllers/providers/api/status_drop_down/employee/employee_provider.dart b/lib/controllers/providers/api/status_drop_down/employee/assigned_to_provider.dart similarity index 86% rename from lib/controllers/providers/api/status_drop_down/employee/employee_provider.dart rename to lib/controllers/providers/api/status_drop_down/employee/assigned_to_provider.dart index e21f7180..757b13f9 100644 --- a/lib/controllers/providers/api/status_drop_down/employee/employee_provider.dart +++ b/lib/controllers/providers/api/status_drop_down/employee/assigned_to_provider.dart @@ -1,5 +1,6 @@ import 'dart:convert'; +import 'package:test_sa/controllers/api_routes/api_manager.dart'; import 'package:test_sa/controllers/api_routes/urls.dart'; import 'package:test_sa/models/lookup.dart'; import 'package:test_sa/models/user.dart'; @@ -7,7 +8,7 @@ import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; import 'package:http/http.dart'; -class EmployeesProvider extends ChangeNotifier{ +class AssignedToProvider extends ChangeNotifier{ //reset provider data void reset(){ @@ -48,21 +49,20 @@ class EmployeesProvider extends ChangeNotifier{ notifyListeners(); Response response; try{ - response = await get( - Uri.parse( - host + URLs.getEmployees), + response = await ApiManager.instance.get( + URLs.getEmployees, ); _stateCode = response.statusCode; if(response.statusCode >= 200 && response.statusCode < 300) { // client's request was successfully received - List categoriesListJson = json.decode(utf8.decode(response.bodyBytes)); + List categoriesListJson = json.decode(response.body)["data"]; _items = categoriesListJson.map((type) => Lookup.fromJson(type)).toList(); } _loading = false; notifyListeners(); return response.statusCode; } catch(error) { - + print(error); _loading = false; _stateCode = -1; notifyListeners(); diff --git a/lib/controllers/providers/api/status_drop_down/employee/engineers_provider.dart b/lib/controllers/providers/api/status_drop_down/employee/engineers_provider.dart new file mode 100644 index 00000000..67c10b26 --- /dev/null +++ b/lib/controllers/providers/api/status_drop_down/employee/engineers_provider.dart @@ -0,0 +1,74 @@ +import 'dart:convert'; + +import 'package:test_sa/controllers/api_routes/api_manager.dart'; +import 'package:test_sa/controllers/api_routes/urls.dart'; +import 'package:test_sa/models/engineer.dart'; +import 'package:test_sa/models/lookup.dart'; +import 'package:test_sa/models/user.dart'; +import 'package:flutter/cupertino.dart'; +import 'package:flutter/material.dart'; +import 'package:http/http.dart'; + +class EngineersProvider extends ChangeNotifier{ + + //reset provider data + void reset(){ + _items = null; + _stateCode = null; + } + + // state code of current request to defied error message + // like 400 customer request failed + // 500 service not available + int _stateCode; + int get stateCode => _stateCode; + + // contain user data + // when user not login or register _user = null + List _items; + List get items => _items; + + // when categories in-process _loading = true + // done _loading = true + // failed _loading = false + bool _loading; + bool get isLoading => _loading; + set isLoading(bool isLoading){ + _loading = isLoading; + notifyListeners(); + } + + /// return -2 if request in progress + /// return -1 if error happen when sending request + /// return state code if request complete may be 200, 404 or 403 + /// for more details check http state manager + /// lib\controllers\http_status_manger\http_status_manger.dart + Future getData ({String host,User user}) async { + if(_loading == true) return -2; + _loading = true; + notifyListeners(); + Response response; + try{ + response = await ApiManager.instance.get( + URLs.getEngineers, + ); + _stateCode = response.statusCode; + if(response.statusCode >= 200 && response.statusCode < 300) { + // client's request was successfully received + List categoriesListJson = json.decode(response.body); + _items = categoriesListJson.map((type) => Engineer.fromJson(type)).toList(); + } + _loading = false; + notifyListeners(); + return response.statusCode; + } catch(error) { + print(error); + _loading = false; + _stateCode = -1; + notifyListeners(); + return -1; + } + + } + +} \ No newline at end of file diff --git a/lib/controllers/providers/api/status_drop_down/gas_refill/gas_cylinder_size_provider.dart b/lib/controllers/providers/api/status_drop_down/gas_refill/gas_cylinder_size_provider.dart index 5ea49fa9..ecf5a0c7 100644 --- a/lib/controllers/providers/api/status_drop_down/gas_refill/gas_cylinder_size_provider.dart +++ b/lib/controllers/providers/api/status_drop_down/gas_refill/gas_cylinder_size_provider.dart @@ -1,5 +1,6 @@ import 'dart:convert'; +import 'package:test_sa/controllers/api_routes/api_manager.dart'; import 'package:test_sa/controllers/api_routes/urls.dart'; import 'package:test_sa/models/lookup.dart'; import 'package:test_sa/models/user.dart'; @@ -49,13 +50,13 @@ class GasCylinderSizesProvider extends ChangeNotifier{ notifyListeners(); Response response; try{ - response = await get( - Uri.parse(host + URLs.getGasCylinderSize), + response = await ApiManager.instance.get( + URLs.getGasCylinderSize, ); _stateCode = response.statusCode; if(response.statusCode >= 200 && response.statusCode < 300) { // client's request was successfully received - List categoriesListJson = json.decode(utf8.decode(response.bodyBytes)); + List categoriesListJson = json.decode(response.body)["data"]; _items = categoriesListJson.map((item) => Lookup.fromJson(item)).toList(); } _loading = false; diff --git a/lib/controllers/providers/api/status_drop_down/gas_refill/gas_cylinder_type_provider.dart b/lib/controllers/providers/api/status_drop_down/gas_refill/gas_cylinder_type_provider.dart new file mode 100644 index 00000000..0d1a1e0a --- /dev/null +++ b/lib/controllers/providers/api/status_drop_down/gas_refill/gas_cylinder_type_provider.dart @@ -0,0 +1,74 @@ +import 'dart:convert'; + +import 'package:test_sa/controllers/api_routes/api_manager.dart'; +import 'package:test_sa/controllers/api_routes/urls.dart'; +import 'package:test_sa/models/lookup.dart'; +import 'package:test_sa/models/user.dart'; +import 'package:flutter/cupertino.dart'; +import 'package:flutter/material.dart'; +import 'package:http/http.dart'; + +class GasCylinderTypesProvider extends ChangeNotifier{ + + //reset provider data + void reset(){ + _items = null; + _loading = null; + _stateCode = null; + } + + // state code of current request to defied error message + // like 400 customer request failed + // 500 service not available + int _stateCode; + int get stateCode => _stateCode; + + // contain user data + // when user not login or register _user = null + List _items; + List get items => _items; + + // when categories in-process _loading = true + // done _loading = true + // failed _loading = false + bool _loading; + bool get isLoading => _loading; + set isLoading(bool isLoading){ + _loading = isLoading; + notifyListeners(); + } + + /// return -2 if request in progress + /// return -1 if error happen when sending request + /// return state code if request complete may be 200, 404 or 403 + /// for more details check http state manager + /// lib\controllers\http_status_manger\http_status_manger.dart + Future getData ({String host,User user,}) async { + if(_loading == true) + return -2; + _loading = true; + notifyListeners(); + Response response; + try{ + response = await ApiManager.instance.get( + URLs.getGasCylinderType, + ); + _stateCode = response.statusCode; + if(response.statusCode >= 200 && response.statusCode < 300) { + // client's request was successfully received + List categoriesListJson = json.decode(response.body)["data"]; + _items = categoriesListJson.map((item) => Lookup.fromJson(item)).toList(); + } + _loading = false; + notifyListeners(); + return response.statusCode; + } catch(error) { + _loading = false; + _stateCode = -1; + notifyListeners(); + return -1; + } + + } + +} \ No newline at end of file diff --git a/lib/controllers/providers/api/status_drop_down/gas_refill/gas_status_provider.dart b/lib/controllers/providers/api/status_drop_down/gas_refill/gas_status_provider.dart index a6fcbc5a..6073c9fe 100644 --- a/lib/controllers/providers/api/status_drop_down/gas_refill/gas_status_provider.dart +++ b/lib/controllers/providers/api/status_drop_down/gas_refill/gas_status_provider.dart @@ -1,5 +1,6 @@ import 'dart:convert'; +import 'package:test_sa/controllers/api_routes/api_manager.dart'; import 'package:test_sa/controllers/api_routes/urls.dart'; import 'package:test_sa/models/lookup.dart'; import 'package:test_sa/models/user.dart'; @@ -48,13 +49,13 @@ class GasStatusProvider extends ChangeNotifier{ notifyListeners(); Response response; try{ - response = await get( - Uri.parse(host + URLs.getGasStatus), + response = await ApiManager.instance.get( + URLs.getGasStatus, ); _stateCode = response.statusCode; if(response.statusCode >= 200 && response.statusCode < 300) { // client's request was successfully received - List categoriesListJson = json.decode(utf8.decode(response.bodyBytes)); + List categoriesListJson = json.decode(response.body)["data"]; _items = categoriesListJson.map((item) => Lookup.fromJson(item)).toList(); } _loading = false; diff --git a/lib/controllers/providers/api/status_drop_down/gas_refill/gas_types_provider.dart b/lib/controllers/providers/api/status_drop_down/gas_refill/gas_types_provider.dart index 80e0d531..3286ea00 100644 --- a/lib/controllers/providers/api/status_drop_down/gas_refill/gas_types_provider.dart +++ b/lib/controllers/providers/api/status_drop_down/gas_refill/gas_types_provider.dart @@ -1,5 +1,6 @@ import 'dart:convert'; +import 'package:test_sa/controllers/api_routes/api_manager.dart'; import 'package:test_sa/controllers/api_routes/urls.dart'; import 'package:test_sa/models/lookup.dart'; import 'package:test_sa/models/user.dart'; @@ -48,13 +49,13 @@ class GasTypesProvider extends ChangeNotifier{ notifyListeners(); Response response; try{ - response = await get( - Uri.parse(host + URLs.getGasTypes), + response = await ApiManager.instance.get( + URLs.getGasTypes, ); _stateCode = response.statusCode; if(response.statusCode >= 200 && response.statusCode < 300) { // client's request was successfully received - List categoriesListJson = json.decode(utf8.decode(response.bodyBytes)); + List categoriesListJson = json.decode(response.body)["data"]; _items = categoriesListJson.map((item) => Lookup.fromJson(item)).toList(); } _loading = false; diff --git a/lib/controllers/providers/api/status_drop_down/pentry/pentry_status_provider.dart b/lib/controllers/providers/api/status_drop_down/pentry/pentry_status_provider.dart index 75d18783..e5d769ac 100644 --- a/lib/controllers/providers/api/status_drop_down/pentry/pentry_status_provider.dart +++ b/lib/controllers/providers/api/status_drop_down/pentry/pentry_status_provider.dart @@ -1,5 +1,6 @@ import 'dart:convert'; +import 'package:test_sa/controllers/api_routes/api_manager.dart'; import 'package:test_sa/controllers/api_routes/urls.dart'; import 'package:test_sa/models/lookup.dart'; import 'package:test_sa/models/user.dart'; @@ -48,16 +49,15 @@ class PentryStatusProvider extends ChangeNotifier{ notifyListeners(); Response response; try{ - response = await get( - Uri.parse( - host + URLs.getPentryStatus), + response = await ApiManager.instance.get( + URLs.getPentryStatus, ); _stateCode = response.statusCode; if(response.statusCode >= 200 && response.statusCode < 300) { // client's request was successfully received - List listJson = json.decode(utf8.decode(response.bodyBytes)); - _items = listJson.map((type) => Lookup.fromIntIdJson(type)).toList(); + List listJson = json.decode(response.body)["data"]; + _items = listJson.map((type) => Lookup.fromJson(type)).toList(); } _loading = false; notifyListeners(); diff --git a/lib/controllers/providers/api/status_drop_down/pentry/pentry_task_status_provider.dart b/lib/controllers/providers/api/status_drop_down/pentry/pentry_task_status_provider.dart index 900671e1..689f357d 100644 --- a/lib/controllers/providers/api/status_drop_down/pentry/pentry_task_status_provider.dart +++ b/lib/controllers/providers/api/status_drop_down/pentry/pentry_task_status_provider.dart @@ -1,5 +1,6 @@ import 'dart:convert'; +import 'package:test_sa/controllers/api_routes/api_manager.dart'; import 'package:test_sa/controllers/api_routes/urls.dart'; import 'package:test_sa/models/lookup.dart'; import 'package:test_sa/models/user.dart'; @@ -48,16 +49,15 @@ class PentryTaskStatusProvider extends ChangeNotifier{ notifyListeners(); Response response; try{ - response = await get( - Uri.parse( - host + URLs.getPentryTaskStatus), + response = await ApiManager.instance.get( + URLs.getPentryTaskStatus, ); _stateCode = response.statusCode; if(response.statusCode >= 200 && response.statusCode < 300) { // client's request was successfully received - List categoriesListJson = json.decode(utf8.decode(response.bodyBytes)); - _items = categoriesListJson.map((type) => Lookup.fromIntIdJson(type)).toList(); + List categoriesListJson = json.decode(response.body)["data"]; + _items = categoriesListJson.map((type) => Lookup.fromJson(type)).toList(); } _loading = false; notifyListeners(); diff --git a/lib/controllers/providers/api/status_drop_down/pentry/pentry_visit_status_provider.dart b/lib/controllers/providers/api/status_drop_down/pentry/pentry_visit_status_provider.dart index c8562f25..c616d746 100644 --- a/lib/controllers/providers/api/status_drop_down/pentry/pentry_visit_status_provider.dart +++ b/lib/controllers/providers/api/status_drop_down/pentry/pentry_visit_status_provider.dart @@ -1,5 +1,6 @@ import 'dart:convert'; +import 'package:test_sa/controllers/api_routes/api_manager.dart'; import 'package:test_sa/controllers/api_routes/urls.dart'; import 'package:test_sa/models/lookup.dart'; import 'package:test_sa/models/user.dart'; @@ -48,16 +49,15 @@ class PentryVisitStatusProvider extends ChangeNotifier{ notifyListeners(); Response response; try{ - response = await get( - Uri.parse( - host + URLs.getPentryVisitStatus), + response = await ApiManager.instance.get( + URLs.getPentryVisitStatus, ); _stateCode = response.statusCode; if(response.statusCode >= 200 && response.statusCode < 300) { // client's request was successfully received - List listJson = json.decode(utf8.decode(response.bodyBytes)); - _items = listJson.map((type) => Lookup.fromIntIdJson(type)).toList(); + List listJson = json.decode(response.body)["data"]; + _items = listJson.map((type) => Lookup.fromJson(type)).toList(); } _loading = false; notifyListeners(); diff --git a/lib/controllers/providers/api/status_drop_down/report/service_report_defect_types_provider.dart b/lib/controllers/providers/api/status_drop_down/report/service_report_defect_types_provider.dart index a61b1e76..563ba8d8 100644 --- a/lib/controllers/providers/api/status_drop_down/report/service_report_defect_types_provider.dart +++ b/lib/controllers/providers/api/status_drop_down/report/service_report_defect_types_provider.dart @@ -1,5 +1,6 @@ import 'dart:convert'; +import 'package:test_sa/controllers/api_routes/api_manager.dart'; import 'package:test_sa/controllers/api_routes/urls.dart'; import 'package:test_sa/models/lookup.dart'; import 'package:test_sa/models/user.dart'; @@ -48,16 +49,14 @@ class ServiceRequestDefectTypesProvider extends ChangeNotifier{ notifyListeners(); Response response; try{ - response = await get( - Uri.parse( - host + URLs.getServiceReportDefectTypes), + response = await ApiManager.instance.get( + URLs.getServiceReportDefectTypes, ); - _stateCode = response.statusCode; if(response.statusCode >= 200 && response.statusCode < 300) { // client's request was successfully received - List listJson = json.decode(utf8.decode(response.bodyBytes)); - _items = listJson.map((type) => Lookup.fromIntIdJson(type)).toList(); + List listJson = json.decode(response.body)["data"]; + _items = listJson.map((type) => Lookup.fromJson(type)).toList(); } _loading = false; notifyListeners(); diff --git a/lib/controllers/providers/api/status_drop_down/report/service_report_last_calls_provider.dart b/lib/controllers/providers/api/status_drop_down/report/service_report_last_calls_provider.dart index 20e9f7be..b76938fd 100644 --- a/lib/controllers/providers/api/status_drop_down/report/service_report_last_calls_provider.dart +++ b/lib/controllers/providers/api/status_drop_down/report/service_report_last_calls_provider.dart @@ -1,5 +1,6 @@ import 'dart:convert'; +import 'package:test_sa/controllers/api_routes/api_manager.dart'; import 'package:test_sa/controllers/api_routes/urls.dart'; import 'package:test_sa/models/lookup.dart'; import 'package:test_sa/models/user.dart'; @@ -49,17 +50,21 @@ class ServiceReportLastCallsProvider extends ChangeNotifier{ notifyListeners(); Response response; try{ - response = await get( - Uri.parse( - host + URLs.getServiceReportLastCalls - +(serviceStatus == null ? "" : "?service_status=$serviceStatus") - ), + // todo request new api from backend to make filter work + response = await ApiManager.instance.get( + URLs.getServiceReportLastCalls, ); + // response = await get( + // Uri.parse( + // URLs.getServiceReportLastCalls + // +(serviceStatus == null ? "" : "?service_status=$serviceStatus") + // ), + // ); _stateCode = response.statusCode; if(response.statusCode >= 200 && response.statusCode < 300) { // client's request was successfully received - List categoriesListJson = json.decode(utf8.decode(response.bodyBytes)); - _calls = categoriesListJson.map((type) => Lookup.fromIntIdJson(type)).toList(); + List categoriesListJson = json.decode(response.body)["data"]; + _calls = categoriesListJson.map((type) => Lookup.fromJson(type)).toList(); } _loading = false; notifyListeners(); diff --git a/lib/controllers/providers/api/status_drop_down/report/service_report_priority_provider.dart b/lib/controllers/providers/api/status_drop_down/report/service_report_priority_provider.dart index beb18280..a9c566e0 100644 --- a/lib/controllers/providers/api/status_drop_down/report/service_report_priority_provider.dart +++ b/lib/controllers/providers/api/status_drop_down/report/service_report_priority_provider.dart @@ -1,5 +1,6 @@ import 'dart:convert'; +import 'package:test_sa/controllers/api_routes/api_manager.dart'; import 'package:test_sa/controllers/api_routes/urls.dart'; import 'package:test_sa/models/lookup.dart'; import 'package:test_sa/models/user.dart'; @@ -48,21 +49,21 @@ class ServiceRequestPriorityProvider extends ChangeNotifier{ notifyListeners(); Response response; try{ - response = await get( - Uri.parse( - host + URLs.getServiceReportPriority), + response = await ApiManager.instance.get( + URLs.getServiceReportPriority, ); _stateCode = response.statusCode; if(response.statusCode >= 200 && response.statusCode < 300) { // client's request was successfully received - List listJson = json.decode(utf8.decode(response.bodyBytes)); - _items = listJson.map((type) => Lookup.fromIntIdJson(type)).toList(); + List listJson = json.decode(response.body)["data"]; + _items = listJson.map((type) => Lookup.fromJson(type)).toList(); } _loading = false; notifyListeners(); return response.statusCode; } catch(error) { + print(error); _loading = false; _stateCode = -1; notifyListeners(); diff --git a/lib/controllers/providers/api/status_drop_down/report/service_report_reasons_provider.dart b/lib/controllers/providers/api/status_drop_down/report/service_report_reasons_provider.dart index b1f86f54..7df11d8d 100644 --- a/lib/controllers/providers/api/status_drop_down/report/service_report_reasons_provider.dart +++ b/lib/controllers/providers/api/status_drop_down/report/service_report_reasons_provider.dart @@ -1,5 +1,6 @@ import 'dart:convert'; +import 'package:test_sa/controllers/api_routes/api_manager.dart'; import 'package:test_sa/controllers/api_routes/urls.dart'; import 'package:test_sa/models/lookup.dart'; import 'package:test_sa/models/user.dart'; @@ -48,15 +49,14 @@ class ServiceReportReasonsProvider extends ChangeNotifier{ notifyListeners(); Response response; try{ - response = await get( - Uri.parse( - host + URLs.getServiceReportReasons), + response = await ApiManager.instance.get( + URLs.getServiceReportReasons, ); _stateCode = response.statusCode; if(response.statusCode >= 200 && response.statusCode < 300) { // client's request was successfully received - List categoriesListJson = json.decode(utf8.decode(response.bodyBytes)); - _reasons = categoriesListJson.map((type) => Lookup.fromIntIdJson(type)).toList(); + List categoriesListJson = json.decode(response.body)["data"]; + _reasons = categoriesListJson.map((type) => Lookup.fromJson(type)).toList(); } _loading = false; notifyListeners(); diff --git a/lib/controllers/providers/api/status_drop_down/report/service_report_status_provider.dart b/lib/controllers/providers/api/status_drop_down/report/service_report_status_provider.dart index 6e98367c..93209606 100644 --- a/lib/controllers/providers/api/status_drop_down/report/service_report_status_provider.dart +++ b/lib/controllers/providers/api/status_drop_down/report/service_report_status_provider.dart @@ -1,5 +1,6 @@ import 'dart:convert'; +import 'package:test_sa/controllers/api_routes/api_manager.dart'; import 'package:test_sa/controllers/api_routes/urls.dart'; import 'package:test_sa/models/lookup.dart'; import 'package:test_sa/models/user.dart'; @@ -48,15 +49,15 @@ class ServiceReportStatusProvider extends ChangeNotifier{ notifyListeners(); Response response; try{ - response = await get( - Uri.parse( - host + URLs.getServiceReportStatus), + response = await ApiManager.instance.get( + URLs.getServiceReportStatus, ); + _stateCode = response.statusCode; if(response.statusCode >= 200 && response.statusCode < 300) { // client's request was successfully received - List categoriesListJson = json.decode(utf8.decode(response.bodyBytes)); - _status = categoriesListJson.map((type) => Lookup.fromIntIdJson(type)).toList(); + List categoriesListJson = json.decode(response.body)["data"]; + _status = categoriesListJson.map((type) => Lookup.fromJson(type)).toList(); } _loading = false; notifyListeners(); diff --git a/lib/controllers/providers/api/status_drop_down/report/service_report_types_provider.dart b/lib/controllers/providers/api/status_drop_down/report/service_report_types_provider.dart index 358440a1..f385c27e 100644 --- a/lib/controllers/providers/api/status_drop_down/report/service_report_types_provider.dart +++ b/lib/controllers/providers/api/status_drop_down/report/service_report_types_provider.dart @@ -1,5 +1,6 @@ import 'dart:convert'; +import 'package:test_sa/controllers/api_routes/api_manager.dart'; import 'package:test_sa/controllers/api_routes/urls.dart'; import 'package:test_sa/models/lookup.dart'; import 'package:test_sa/models/user.dart'; @@ -48,16 +49,14 @@ class ServiceReportTypesProvider extends ChangeNotifier{ notifyListeners(); Response response; try{ - - response = await get( - Uri.parse( - host + URLs.getServiceReportTypes), + response = await ApiManager.instance.get( + URLs.getServiceReportTypes, ); _stateCode = response.statusCode; if(response.statusCode >= 200 && response.statusCode < 300) { // client's request was successfully received - List categoriesListJson = json.decode(utf8.decode(response.bodyBytes)); - _types = categoriesListJson.map((type) => Lookup.fromIntIdJson(type)).toList(); + List categoriesListJson = json.decode(response.body)["data"]; + _types = categoriesListJson.map((type) => Lookup.fromJson(type)).toList(); } _loading = false; notifyListeners(); diff --git a/lib/controllers/providers/api/status_drop_down/report/service_types_provider.dart b/lib/controllers/providers/api/status_drop_down/report/service_types_provider.dart index 3fa2ddb3..9e25f2eb 100644 --- a/lib/controllers/providers/api/status_drop_down/report/service_types_provider.dart +++ b/lib/controllers/providers/api/status_drop_down/report/service_types_provider.dart @@ -1,5 +1,6 @@ import 'dart:convert'; +import 'package:test_sa/controllers/api_routes/api_manager.dart'; import 'package:test_sa/controllers/api_routes/urls.dart'; import 'package:test_sa/models/lookup.dart'; import 'package:test_sa/models/user.dart'; @@ -48,16 +49,14 @@ class ServiceStatusProvider extends ChangeNotifier{ notifyListeners(); Response response; try{ - - response = await get( - Uri.parse( - host + URLs.getServiceTypes), + response = await ApiManager.instance.get( + URLs.getServiceTypes, ); _stateCode = response.statusCode; if(response.statusCode >= 200 && response.statusCode < 300) { // client's request was successfully received - List categoriesListJson = json.decode(utf8.decode(response.bodyBytes)); - _statuses = categoriesListJson.map((e) => Lookup.fromIntIdJson(e)).toList(); + List categoriesListJson = json.decode(response.body)["data"]; + _statuses = categoriesListJson.map((e) => Lookup.fromJson(e)).toList(); } _loading = false; diff --git a/lib/controllers/providers/api/status_drop_down/service_reqest/service_request_status_provider.dart b/lib/controllers/providers/api/status_drop_down/service_reqest/service_request_status_provider.dart new file mode 100644 index 00000000..4ead90e0 --- /dev/null +++ b/lib/controllers/providers/api/status_drop_down/service_reqest/service_request_status_provider.dart @@ -0,0 +1,74 @@ +import 'dart:convert'; + +import 'package:test_sa/controllers/api_routes/api_manager.dart'; +import 'package:test_sa/controllers/api_routes/urls.dart'; +import 'package:test_sa/models/lookup.dart'; +import 'package:test_sa/models/user.dart'; +import 'package:flutter/cupertino.dart'; +import 'package:flutter/material.dart'; +import 'package:http/http.dart'; + +class ServiceRequestStatusProvider extends ChangeNotifier{ + + //reset provider data + void reset(){ + _statuses = null; + _stateCode = null; + } + + // state code of current request to defied error message + // like 400 customer request failed + // 500 service not available + int _stateCode; + int get stateCode => _stateCode; + + // contain user data + // when user not login or register _user = null + List _statuses; + List get items => _statuses; + + // when categories in-process _loading = true + // done _loading = true + // failed _loading = false + bool _loading; + bool get isLoading => _loading; + set isLoading(bool isLoading){ + _loading = isLoading; + notifyListeners(); + } + + /// return -2 if request in progress + /// return -1 if error happen when sending request + /// return state code if request complete may be 200, 404 or 403 + /// for more details check http state manager + /// lib\controllers\http_status_manger\http_status_manger.dart + Future getData ({String host,User user}) async { + if(_loading == true) + return -2; + _loading = true; + notifyListeners(); + Response response; + try{ + response = await ApiManager.instance.get( + URLs.getServiceRequestStatus, + ); + _stateCode = response.statusCode; + if(response.statusCode >= 200 && response.statusCode < 300) { + // client's request was successfully received + List categoriesListJson = json.decode(response.body)["data"]; + _statuses = categoriesListJson.map((e) => Lookup.fromJson(e)).toList(); + + } + _loading = false; + notifyListeners(); + return response.statusCode; + } catch(error) { + _loading = false; + _stateCode = -1; + notifyListeners(); + return -1; + } + + } + +} \ No newline at end of file diff --git a/lib/controllers/providers/api/status_drop_down/service_reqest/service_request_through_provider.dart b/lib/controllers/providers/api/status_drop_down/service_reqest/service_request_through_provider.dart new file mode 100644 index 00000000..592ec4dc --- /dev/null +++ b/lib/controllers/providers/api/status_drop_down/service_reqest/service_request_through_provider.dart @@ -0,0 +1,74 @@ +import 'dart:convert'; + +import 'package:test_sa/controllers/api_routes/api_manager.dart'; +import 'package:test_sa/controllers/api_routes/urls.dart'; +import 'package:test_sa/models/lookup.dart'; +import 'package:test_sa/models/user.dart'; +import 'package:flutter/cupertino.dart'; +import 'package:flutter/material.dart'; +import 'package:http/http.dart'; + +class ServiceRequestedThroughProvider extends ChangeNotifier{ + + //reset provider data + void reset(){ + _statuses = null; + _stateCode = null; + } + + // state code of current request to defied error message + // like 400 customer request failed + // 500 service not available + int _stateCode; + int get stateCode => _stateCode; + + // contain user data + // when user not login or register _user = null + List _statuses; + List get items => _statuses; + + // when categories in-process _loading = true + // done _loading = true + // failed _loading = false + bool _loading; + bool get isLoading => _loading; + set isLoading(bool isLoading){ + _loading = isLoading; + notifyListeners(); + } + + /// return -2 if request in progress + /// return -1 if error happen when sending request + /// return state code if request complete may be 200, 404 or 403 + /// for more details check http state manager + /// lib\controllers\http_status_manger\http_status_manger.dart + Future getData ({String host,User user}) async { + if(_loading == true) + return -2; + _loading = true; + notifyListeners(); + Response response; + try{ + response = await ApiManager.instance.get( + URLs.getServiceRequestThrough, + ); + _stateCode = response.statusCode; + if(response.statusCode >= 200 && response.statusCode < 300) { + // client's request was successfully received + List categoriesListJson = json.decode(response.body)["data"]; + _statuses = categoriesListJson.map((e) => Lookup.fromJson(e)).toList(); + + } + _loading = false; + notifyListeners(); + return response.statusCode; + } catch(error) { + _loading = false; + _stateCode = -1; + notifyListeners(); + return -1; + } + + } + +} \ No newline at end of file diff --git a/lib/controllers/providers/api/status_drop_down/service_reqest/service_request_type_provider.dart b/lib/controllers/providers/api/status_drop_down/service_reqest/service_request_type_provider.dart new file mode 100644 index 00000000..bcc01b4a --- /dev/null +++ b/lib/controllers/providers/api/status_drop_down/service_reqest/service_request_type_provider.dart @@ -0,0 +1,74 @@ +import 'dart:convert'; + +import 'package:test_sa/controllers/api_routes/api_manager.dart'; +import 'package:test_sa/controllers/api_routes/urls.dart'; +import 'package:test_sa/models/lookup.dart'; +import 'package:test_sa/models/user.dart'; +import 'package:flutter/cupertino.dart'; +import 'package:flutter/material.dart'; +import 'package:http/http.dart'; + +class ServiceRequestTypeProvider extends ChangeNotifier{ + + //reset provider data + void reset(){ + _statuses = null; + _stateCode = null; + } + + // state code of current request to defied error message + // like 400 customer request failed + // 500 service not available + int _stateCode; + int get stateCode => _stateCode; + + // contain user data + // when user not login or register _user = null + List _statuses; + List get items => _statuses; + + // when categories in-process _loading = true + // done _loading = true + // failed _loading = false + bool _loading; + bool get isLoading => _loading; + set isLoading(bool isLoading){ + _loading = isLoading; + notifyListeners(); + } + + /// return -2 if request in progress + /// return -1 if error happen when sending request + /// return state code if request complete may be 200, 404 or 403 + /// for more details check http state manager + /// lib\controllers\http_status_manger\http_status_manger.dart + Future getData ({String host,User user}) async { + if(_loading == true) + return -2; + _loading = true; + notifyListeners(); + Response response; + try{ + response = await ApiManager.instance.get( + URLs.getServiceRequestTypes, + ); + _stateCode = response.statusCode; + if(response.statusCode >= 200 && response.statusCode < 300) { + // client's request was successfully received + List categoriesListJson = json.decode(response.body)["data"]; + _statuses = categoriesListJson.map((e) => Lookup.fromJson(e)).toList(); + + } + _loading = false; + notifyListeners(); + return response.statusCode; + } catch(error) { + _loading = false; + _stateCode = -1; + notifyListeners(); + return -1; + } + + } + +} \ No newline at end of file diff --git a/lib/controllers/providers/api/user_provider.dart b/lib/controllers/providers/api/user_provider.dart index 843746c9..55788923 100644 --- a/lib/controllers/providers/api/user_provider.dart +++ b/lib/controllers/providers/api/user_provider.dart @@ -1,5 +1,7 @@ import 'dart:convert'; +import 'package:fluttertoast/fluttertoast.dart'; +import 'package:test_sa/controllers/api_routes/api_manager.dart'; import 'package:test_sa/controllers/api_routes/urls.dart'; import 'package:test_sa/models/user.dart'; import 'package:flutter/material.dart'; @@ -48,22 +50,21 @@ class UserProvider extends ChangeNotifier{ notifyListeners(); Response response; try{ - response = await post( - Uri.parse( - host+URLs.login), - body: await user.toLoginJson(), + response = await ApiManager.instance.post( + URLs.login, + body: await user.toLoginJson(), ); _loading = false; if(response.statusCode >= 200 && response.statusCode < 300) { // client's request was successfully received - _user = User.fromJson(jsonDecode(utf8.decode(response.bodyBytes))[0]); - + _user = User.fromJson(jsonDecode(response.body)); return response.statusCode; } notifyListeners(); return response.statusCode; } catch(error) { + print(error); _loading = false; notifyListeners(); return -1; @@ -86,10 +87,9 @@ class UserProvider extends ChangeNotifier{ notifyListeners(); Response response; try{ - response = await post( - Uri.parse( - host+URLs.register), - body: await user.toRegisterJson() + response = await ApiManager.instance.post( + URLs.register, + body: await user.toLoginJson(), ); } catch(error) { _loading = false; @@ -134,10 +134,9 @@ class UserProvider extends ChangeNotifier{ if(user.phoneNumber != _user.phoneNumber) jsonObject["phone"] = user.phoneNumber; try{ - response = await post( - Uri.parse( - host+URLs.updateProfile), - body: jsonObject + response = response = await ApiManager.instance.post( + URLs.login, + body: jsonObject, ); } catch(error) { _loading = false; diff --git a/lib/main.dart b/lib/main.dart index 0be3e414..f21c35b5 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -7,14 +7,19 @@ import 'package:test_sa/controllers/providers/api/hospitals_provider.dart'; import 'package:test_sa/controllers/providers/api/notifications_provider.dart'; import 'package:test_sa/controllers/providers/api/regular_visits_provider.dart'; import 'package:test_sa/controllers/providers/api/service_requests_provider.dart'; -import 'package:test_sa/controllers/providers/api/status_drop_down/employee/employee_provider.dart'; +import 'package:test_sa/controllers/providers/api/status_drop_down/employee/assigned_to_provider.dart'; +import 'package:test_sa/controllers/providers/api/status_drop_down/employee/engineers_provider.dart'; import 'package:test_sa/controllers/providers/api/status_drop_down/gas_refill/gas_cylinder_size_provider.dart'; +import 'package:test_sa/controllers/providers/api/status_drop_down/gas_refill/gas_cylinder_type_provider.dart'; import 'package:test_sa/controllers/providers/api/status_drop_down/gas_refill/gas_status_provider.dart'; import 'package:test_sa/controllers/providers/api/status_drop_down/gas_refill/gas_types_provider.dart'; import 'package:test_sa/controllers/providers/api/status_drop_down/pentry/pentry_task_status_provider.dart'; import 'package:test_sa/controllers/providers/api/status_drop_down/pentry/pentry_visit_status_provider.dart'; import 'package:test_sa/controllers/providers/api/status_drop_down/report/service_report_defect_types_provider.dart'; import 'package:test_sa/controllers/providers/api/status_drop_down/report/service_report_priority_provider.dart'; +import 'package:test_sa/controllers/providers/api/status_drop_down/service_reqest/service_request_status_provider.dart'; +import 'package:test_sa/controllers/providers/api/status_drop_down/service_reqest/service_request_through_provider.dart'; +import 'package:test_sa/controllers/providers/api/status_drop_down/service_reqest/service_request_type_provider.dart'; import 'package:test_sa/views/app_style/colors.dart'; import 'package:test_sa/views/pages/login.dart'; import 'package:test_sa/views/pages/register.dart'; @@ -80,16 +85,21 @@ class MyApp extends StatelessWidget { ChangeNotifierProvider(create: (_) => ServiceStatusProvider()), ChangeNotifierProvider(create: (_) => ServiceReportLastCallsProvider()), ChangeNotifierProvider(create: (_) => GasCylinderSizesProvider()), + ChangeNotifierProvider(create: (_) => GasCylinderTypesProvider()), ChangeNotifierProvider(create: (_) => GasStatusProvider()), ChangeNotifierProvider(create: (_) => GasTypesProvider()), ChangeNotifierProvider(create: (_) => GasRefillProvider()), ChangeNotifierProvider(create: (_) => DeviceTransferProvider()), - ChangeNotifierProvider(create: (_) => EmployeesProvider()), + ChangeNotifierProvider(create: (_) => AssignedToProvider()), ChangeNotifierProvider(create: (_) => PentryTaskStatusProvider()), ChangeNotifierProvider(create: (_) => PentryVisitStatusProvider()), ChangeNotifierProvider(create: (_) => PentryStatusProvider()), ChangeNotifierProvider(create: (_) => ServiceRequestPriorityProvider()), ChangeNotifierProvider(create: (_) => ServiceRequestDefectTypesProvider()), + ChangeNotifierProvider(create: (_) => ServiceRequestTypeProvider()), + ChangeNotifierProvider(create: (_) => ServiceRequestedThroughProvider()), + ChangeNotifierProvider(create: (_) => ServiceRequestStatusProvider()), + ChangeNotifierProvider(create: (_) => EngineersProvider()), ], child: GestureDetector( onTap: () { diff --git a/lib/models/department.dart b/lib/models/department.dart index 27df7b06..4dfe4cd0 100644 --- a/lib/models/department.dart +++ b/lib/models/department.dart @@ -1,5 +1,5 @@ class Department{ - String id; + int id; String name; Department({ @@ -9,8 +9,8 @@ class Department{ factory Department.fromJson(Map parsedJson){ return Department( - id: parsedJson["nid"] ?? parsedJson["id"], - name: parsedJson["dept_name"] ?? parsedJson["value"], + id: parsedJson["id"], + name: parsedJson["name"], ); } factory Department.fromDepartment(Department department){ diff --git a/lib/models/device/device.dart b/lib/models/device/device.dart index b84b8715..cf6eed07 100644 --- a/lib/models/device/device.dart +++ b/lib/models/device/device.dart @@ -1,5 +1,5 @@ class Device{ - String id; + int id; String serialNumber; String number; String brand; @@ -27,11 +27,13 @@ class Device{ factory Device.fromJson(Map parsedJson){ return Device( - id: parsedJson["nid"] ?? parsedJson["id"], - serialNumber: parsedJson["sn"] ?? parsedJson["value"], - number: parsedJson["asset_no"], - brand: parsedJson["brand"].toString(), - model: parsedJson["model"].toString(), + id: parsedJson["id"], + serialNumber: parsedJson["assetSerialNo"], + number: parsedJson["assetNumber"], + brand: parsedJson["modelDefinition"] == null ? "" : + parsedJson["modelDefinition"]["manufacturerName"], + model: parsedJson["modelDefinition"] == null ? "" : + parsedJson["modelDefinition"]["modelName"], productionDate: getDateFromString(parsedJson["production_date"]), supplyDate: getDateFromString(parsedJson["supply_date "]), installDate: getDateFromString(parsedJson["install_date "]), diff --git a/lib/models/device/device_transfer.dart b/lib/models/device/device_transfer.dart index 27379344..d2e18572 100644 --- a/lib/models/device/device_transfer.dart +++ b/lib/models/device/device_transfer.dart @@ -1,4 +1,5 @@ import 'package:http/http.dart'; +import 'package:test_sa/controllers/api_routes/urls.dart'; import 'package:test_sa/models/department.dart'; import 'package:test_sa/models/device/device.dart'; import 'package:test_sa/models/device/device_transfer_info.dart'; @@ -6,7 +7,7 @@ import 'package:test_sa/models/hospital.dart'; import 'package:test_sa/models/lookup.dart'; class DeviceTransfer{ - String id; + int id; String userId; String title; Device device; @@ -41,13 +42,60 @@ class DeviceTransfer{ } factory DeviceTransfer.fromJson(Map parsedJson){ + print(parsedJson["id"],); + print(URLs.getFileUrl(parsedJson["senderAttachmentName"]),); + print(URLs.getFileUrl(parsedJson["receiverAttachmentName"]),); return DeviceTransfer( id: parsedJson["id"], - title: parsedJson["title"], + title: parsedJson["transferCode"], userId: parsedJson["uid"], - device: Device.fromJson(parsedJson["eq_sn"]), - sender: DeviceTransferInfo.fromJson(parsedJson,"sender_"), - receiver: DeviceTransferInfo.fromJson(parsedJson,"receiver_"), + device: Device( + id: parsedJson["assetId"], + number: parsedJson["assetNumber"], + serialNumber: parsedJson["assetSerialNo"], + ), + sender: DeviceTransferInfo( + travelingHours: parsedJson["senderTravelingHours"], + comment: parsedJson["senderComment"], + workingHours: parsedJson["senderWorkingHours"], + userId: parsedJson["senderAssignedEmployeeId"], + userName: parsedJson["senderAssignedEmployeeName"], + client: Hospital( + id: parsedJson["senderSiteId"], + name: parsedJson["senderSiteName"] + ), + department: Department( + id: parsedJson["senderDepartmentId"], + name: parsedJson["senderDepartmentName"], + ), + // todo add segnature + signature: URLs.getFileUrl(parsedJson["senderAttachmentName"]), + status: Lookup( + id: parsedJson["senderMachineStatusId"], + name: parsedJson["senderMachineStatusName"], + ), + ), + receiver: DeviceTransferInfo( + travelingHours: parsedJson["receiverTravelingHours"], + comment: parsedJson["receiverComment"], + workingHours: parsedJson["receiverWorkingHours"], + userId: parsedJson["receiverAssignedEmployeeId"], + userName: parsedJson["receiverAssignedEmployeeName"], + client: Hospital( + id: parsedJson["destSiteId"], + name: parsedJson["destSiteName"] + ), + department: Department( + id: parsedJson["destDepartmentId"], + name: parsedJson["destDepartmentName"], + ), + // todo add segnature + signature: URLs.getFileUrl(parsedJson["receiverAttachmentName"]), + status: Lookup( + id: parsedJson["receiverMachineStatusId"], + name: parsedJson["receiverMachineStatusName"], + ), + ), ); } } diff --git a/lib/models/device/device_transfer_info.dart b/lib/models/device/device_transfer_info.dart index 3e8d0f8f..4475b085 100644 --- a/lib/models/device/device_transfer_info.dart +++ b/lib/models/device/device_transfer_info.dart @@ -11,7 +11,7 @@ class DeviceTransferInfo{ Department department; String workingHours; String travelingHours; - String name; + String userName; String signature; Lookup status; @@ -20,7 +20,7 @@ class DeviceTransferInfo{ this.comment, this.department, this.client, - this.name, + this.userName, this.travelingHours, this.workingHours, this.signature, @@ -47,7 +47,7 @@ class DeviceTransferInfo{ fromDetails(DeviceTransferInfo old,{bool withSignature = true}){ userId = old.userId; - name = old.name; + userName = old.userName; client = Hospital.fromHospital(old.client); department = Department.fromDepartment(old.department); workingHours = old.workingHours; @@ -61,13 +61,22 @@ class DeviceTransferInfo{ return DeviceTransferInfo( workingHours: parsedJson["${key}working_hours"], travelingHours: parsedJson["${key}travel_hours"], - name: parsedJson["${key}name"], + userName: parsedJson["${key}name"], signature: parsedJson["${key}image"], userId: parsedJson["${key}id"], comment: parsedJson["${key}comment"], - client: Hospital.fromJson(parsedJson["${key}client"]), - department: Department.fromJson(parsedJson["${key}department"]), - status: Lookup.fromJson(parsedJson["${key}status"]), + client: Hospital( + id: parsedJson["${key}SiteId"], + name: parsedJson["${key}SiteName"] + ), + department: Department( + id: parsedJson["${key}DepartmentId"], + name: parsedJson["${key}DepartmentName"], + ), + status: Lookup( + id: parsedJson["${key}status"], + name: parsedJson["${key}status"], + ), ); } } diff --git a/lib/models/engineer.dart b/lib/models/engineer.dart new file mode 100644 index 00000000..74916e45 --- /dev/null +++ b/lib/models/engineer.dart @@ -0,0 +1,31 @@ +class Engineer{ + String id; + String name; + + Engineer({ + this.id, + this.name, + }); + + factory Engineer.fromJson(Map parsedJson){ + return Engineer( + id: parsedJson["userId"], + name: parsedJson["userName"], + ); + } + factory Engineer.fromEngineer(Engineer department){ + return Engineer( + id: department?.id, + name: department?.name, + ); + } + + @override + bool operator == (Object other) => + identical(this, other) || other is Engineer && + id == other.id; + + + @override + int get hashCode => id.hashCode; +} \ No newline at end of file diff --git a/lib/models/gas_refill/gas_refill_details.dart b/lib/models/gas_refill/gas_refill_details.dart index f150e150..2f8d55ff 100644 --- a/lib/models/gas_refill/gas_refill_details.dart +++ b/lib/models/gas_refill/gas_refill_details.dart @@ -3,12 +3,14 @@ import 'package:test_sa/models/lookup.dart'; class GasRefillDetails{ Lookup type; Lookup cylinderSize; - int requestedQuantity; - int deliveredQuantity; + Lookup cylinderType; + double requestedQuantity; + double deliveredQuantity; GasRefillDetails({ this.type, this.cylinderSize, + this.cylinderType, this.requestedQuantity, this.deliveredQuantity, }); @@ -21,13 +23,11 @@ class GasRefillDetails{ } factory GasRefillDetails.fromJson(Map parsedJson){ return GasRefillDetails( - type: Lookup.fromJson(parsedJson["type"]), - - cylinderSize: Lookup.fromJson(parsedJson["size"]), - requestedQuantity: parsedJson["requsted_qty"] == null - ? 0 : int.tryParse(parsedJson["requsted_qty"].toString()) ?? 0, - deliveredQuantity: parsedJson["deliverd_qty"] == null - ? 0 : int.tryParse(parsedJson["deliverd_qty"].toString()) ?? 0, + type: Lookup.fromJson(parsedJson["gasType"]), + cylinderSize: Lookup.fromJson(parsedJson["cylinderSize"]), + cylinderType: Lookup.fromJson(parsedJson["cylinderType"]), + requestedQuantity: parsedJson["requestedQty"], + deliveredQuantity: parsedJson["deliverdQty"], ); } @@ -35,6 +35,7 @@ class GasRefillDetails{ return GasRefillDetails( type: Lookup.fromStatus(details.type), cylinderSize:Lookup.fromStatus(details.cylinderSize), + cylinderType:Lookup.fromStatus(details.cylinderType), requestedQuantity: details.requestedQuantity, deliveredQuantity: details.deliveredQuantity, ); diff --git a/lib/models/gas_refill/gas_refill_model.dart b/lib/models/gas_refill/gas_refill_model.dart index 28773fac..ae3331fb 100644 --- a/lib/models/gas_refill/gas_refill_model.dart +++ b/lib/models/gas_refill/gas_refill_model.dart @@ -2,8 +2,8 @@ import 'package:test_sa/models/gas_refill/gas_refill_details.dart'; import 'package:test_sa/models/lookup.dart'; class GasRefillModel{ - String id; - String userId; + int id; + //String userId; String clientName; String title; Lookup status; @@ -11,7 +11,7 @@ class GasRefillModel{ GasRefillModel({ this.id, - this.userId, + //this.userId, this.clientName, this.title, this.status, @@ -27,7 +27,7 @@ class GasRefillModel{ fromGasRefillModel(GasRefillModel model){ id = model.id; - userId = model.userId; + //userId = model.userId; clientName = model.clientName; title = model.title; status = Lookup.fromStatus(model.status); @@ -36,15 +36,16 @@ class GasRefillModel{ factory GasRefillModel.fromJson(Map parsedJson){ List details = []; - if(parsedJson["details"] != null){ - List list = parsedJson["details"]; + if(parsedJson["gazRefillDetails"] != null){ + List list = parsedJson["gazRefillDetails"]; details = list.map((e) => GasRefillDetails.fromJson(e)).toList(); } return GasRefillModel( id: parsedJson["id"], - userId: parsedJson["uid"], - title: parsedJson["title"], - clientName: parsedJson["client"], + //userId: parsedJson["uid"], + title: parsedJson["gazRefillNo"], + clientName: parsedJson["site"] == null ? null: + parsedJson["site"]["custName"], status: Lookup.fromJson(parsedJson["status"]), details: details, ); diff --git a/lib/models/hospital.dart b/lib/models/hospital.dart index 34e2e3a9..432b1748 100644 --- a/lib/models/hospital.dart +++ b/lib/models/hospital.dart @@ -1,5 +1,5 @@ class Hospital{ - String id; + int id; String name; Hospital({ @@ -9,8 +9,8 @@ class Hospital{ factory Hospital.fromJson(Map parsedJson){ return Hospital( - id: parsedJson["nid"] ?? parsedJson["id"], - name: parsedJson["client_name"] ?? parsedJson["value"], + id: parsedJson["id"], + name: parsedJson["custName"], ); } diff --git a/lib/models/lookup.dart b/lib/models/lookup.dart index a52a1698..dd0ba990 100644 --- a/lib/models/lookup.dart +++ b/lib/models/lookup.dart @@ -1,46 +1,66 @@ class Lookup{ - final String label; - final String key; + //old name label + final String name; + // old name key + final int value; final int id; const Lookup({ - this.label, - this.key, + this.name, + this.value, this.id, }); @override bool operator == (Object other) => identical(this, other) || other is Lookup && - key == other.key && - id == other.id; + ((value != null && value == other.value) + || ( id != null && id == other.id )) ; @override - int get hashCode => id.hashCode; + int get hashCode => id?.hashCode ?? value?.hashCode; + + toMap(){ + return { + "id": id, + "name": name, + "value": value + }; + } factory Lookup.fromStatus(Lookup old){ + if(old == null) return null; return Lookup( - label: old.label, + name: old.name, id: old.id, - key: old.key, + value: old.value, ); } factory Lookup.fromJson(Map parsedJson){ - if(parsedJson["id"] == null && parsedJson["uid"] == null) return null; + if(parsedJson == null) return null; return Lookup( - label: parsedJson["value"], - id: parsedJson["id"] is int - ? parsedJson["id"] - : int.tryParse(parsedJson["id"] ?? parsedJson["uid"]), + name: parsedJson["name"], + id: parsedJson["id"], + value: parsedJson["value"] ?? parsedJson["id"], ); } + // factory Lookup.fromJson(Map parsedJson){ + // if(parsedJson["id"] == null && parsedJson["uid"] == null) return null; + // return Lookup( + // name: parsedJson["value"], + // id: parsedJson["id"] is int + // ? parsedJson["id"] + // : int.tryParse(parsedJson["id"] ?? parsedJson["uid"]), + // ); + // } + factory Lookup.fromIntIdJson(Map parsedJson){ return Lookup( - label: parsedJson["value"], + name: parsedJson["value"], id: parsedJson["id"], ); } diff --git a/lib/models/pantry/calibration_tools.dart b/lib/models/pantry/calibration_tools.dart index 2c70c6d2..9e006eac 100644 --- a/lib/models/pantry/calibration_tools.dart +++ b/lib/models/pantry/calibration_tools.dart @@ -1,26 +1,40 @@ import 'package:test_sa/models/lookup.dart'; class CalibrationTool{ + int id; Lookup assetsNumber; DateTime dataOfTesting; CalibrationTool({ + this.id, this.assetsNumber, this.dataOfTesting, }); - Map toMap() { + Map toMap(int visitId) { return { - if(assetsNumber != null) 'assetsSN': (assetsNumber?.id).toString(), - if(dataOfTesting != null) 'dataOfTesting': (dataOfTesting.millisecondsSinceEpoch ~/ 1000).toString(), + "id":id, + "visitId": visitId, + if(assetsNumber != null) 'assetId': (assetsNumber?.id).toString(), + if(dataOfTesting != null) 'calibrationDateOfTesters': dataOfTesting.toIso8601String(), }; } factory CalibrationTool.fromMap(Map map) { return CalibrationTool( - assetsNumber: Lookup.fromJson(map['assetsSN']), - dataOfTesting: map['dataOfTesting'] == null || map['dataOfTesting'] == "" ? null : - DateTime.fromMillisecondsSinceEpoch(int.tryParse(map['dataOfTesting']) * 1000), + assetsNumber: Lookup(id: map["assetId"],name: map['assetSerialNo']), + dataOfTesting: DateTime.tryParse(map['calibrationDateOfTesters'] ?? ""), + ); + } + + CalibrationTool copyWith({ + Lookup assetsNumber, + DateTime dataOfTesting, + }) { + return CalibrationTool( + id: id, + assetsNumber: assetsNumber ?? this.assetsNumber, + dataOfTesting: dataOfTesting ?? this.dataOfTesting, ); } } \ No newline at end of file diff --git a/lib/models/pantry/lookups/contact_person.dart b/lib/models/pantry/lookups/contact_person.dart index 5231712c..156a2086 100644 --- a/lib/models/pantry/lookups/contact_person.dart +++ b/lib/models/pantry/lookups/contact_person.dart @@ -4,7 +4,7 @@ class ContactTitle extends Lookup { ContactTitle({ int id, String label - }):super(id: id,label: label); + }):super(id: id,name: label); factory ContactTitle.fromMap(Map parsedJson){ return ContactTitle( diff --git a/lib/models/pantry/lookups/contact_title.dart b/lib/models/pantry/lookups/contact_title.dart index 5231712c..156a2086 100644 --- a/lib/models/pantry/lookups/contact_title.dart +++ b/lib/models/pantry/lookups/contact_title.dart @@ -4,7 +4,7 @@ class ContactTitle extends Lookup { ContactTitle({ int id, String label - }):super(id: id,label: label); + }):super(id: id,name: label); factory ContactTitle.fromMap(Map parsedJson){ return ContactTitle( diff --git a/lib/models/pantry/pentry.dart b/lib/models/pantry/pentry.dart index cee31181..e624f9e6 100644 --- a/lib/models/pantry/pentry.dart +++ b/lib/models/pantry/pentry.dart @@ -1,5 +1,6 @@ import 'dart:convert'; import 'dart:io'; +import 'dart:typed_data'; import 'package:test_sa/models/lookup.dart'; import 'package:test_sa/models/pantry/calibration_tools.dart'; @@ -13,6 +14,7 @@ class Pentry{ Lookup status; TimerModel timer; DateTime actualVisitDate; + DateTime expectedVisitDate; String travelingHours; String image; File imageFile; @@ -20,6 +22,8 @@ class Pentry{ List ppmCheckLists; List calibrationTools; List pmKits; + String signature; + Uint8List localSignature; Pentry({ this.travelingHours, @@ -27,16 +31,20 @@ class Pentry{ this.status, this.ppmVisitStatus, this.actualVisitDate, + this.expectedVisitDate, this.image, this.imageFile, // this.contacts, this.ppmCheckLists, this.calibrationTools, this.pmKits, + this.signature, + this.localSignature }); bool validate(){ if(actualVisitDate == null) return false; + if(expectedVisitDate == null) return false; if(timer == null && timer.endAt != null) return false; if(ppmVisitStatus == null) return false; //if(status == null) return false; @@ -44,18 +52,29 @@ class Pentry{ return true; } - Map toMap() { - Map map = {}; - map["visit_status"] = ppmVisitStatus?.id.toString(); - if(status != null) map["pentry_status"] = status?.id.toString(); - if(travelingHours != null) map["traveling_hours"] = travelingHours; - if(imageFile != null) map["file_attachement"] = base64Encode(imageFile.readAsBytesSync()); - map["actual_date"] = (actualVisitDate.millisecondsSinceEpoch / 1000).toStringAsFixed(0); + + + Map toMap(int visitId) { + Map map = {}; + map["visitStatusId"] = ppmVisitStatus?.id.toString(); + if(status != null) map["visitStatusId"] = status?.id.toString(); + if(travelingHours != null) map["travelingHours"] = travelingHours; + //if(imageFile != null) map["file_attachement"] = base64Encode(imageFile.readAsBytesSync()); + map["actualDate"] = actualVisitDate.toIso8601String(); + map["expectedDate"] = expectedVisitDate.toIso8601String(); if(timer != null){ - map["start_date"] = (timer.startAt.millisecondsSinceEpoch / 1000).toStringAsFixed(0); - map["end_date"] = ((timer.endAt ?? DateTime.now()).millisecondsSinceEpoch / 1000).toStringAsFixed(0); - map["working_hours"] = (timer.durationInSecond / 60 / 60).toStringAsFixed(5); + map["startDate"] = timer.startAt.toIso8601String(); + map["endDate"] = timer.endAt?.toIso8601String() ?? DateTime.now().toIso8601String(); + map["workingHours"] = (timer.durationInSecond / 60 / 60).toStringAsFixed(5); + } + if(imageFile !=null){ + map["vAttachments"]=[ + { + "attachmentName":(imageFile.path.split("/").last+base64Encode(imageFile.readAsBytesSync())) + } + ]; } + // if(contacts?.isNotEmpty == true) { // for(int i = 0;i e.toMap()).toList()); - map["calibrationTools"] = jsonEncode(calibrationTools.map((e) => e.toMap()).toList()); - map["pmKits"] = jsonEncode(pmKits.map((e) => e.toMap()).toList()); + map["vChecklists"] = ppmCheckLists.map((e) => e.toMap(visitId)).toList(); + map["vCalibrationTools"] = calibrationTools.map((e) => e.toMap(visitId)).toList(); + map["vKits"] = pmKits.map((e) => e.toMap(visitId)).toList(); + map["signature"] = signature; return map; } @@ -78,44 +98,71 @@ class Pentry{ // } List pmKits = []; - if(map['pmKits'] != null){ - pmKits =(map['pmKits'] as List) + if(map['vKits'] != null){ + pmKits =(map['vKits'] as List) .map((e) => PMKit.fromMap(e as Map)) .toList(); } List ppmCheckLists = []; - if(map['ppmCheckLists'] != null){ - ppmCheckLists =(map['ppmCheckLists'] as List) + if(map['vChecklists'] != null){ + ppmCheckLists =(map['vChecklists'] as List) .map((e) => PPMCheckList.fromMap(e as Map)) .toList(); } List calibrationTools = []; - if(map['calibrationTools'] != null){ - calibrationTools =(map['calibrationTools'] as List) + if(map['vCalibrationTools'] != null){ + calibrationTools =(map['vCalibrationTools'] as List) .map((e) => CalibrationTool.fromMap(e as Map)) .toList(); } return Pentry( - status: Lookup.fromJson(map["pentry_status"]), - ppmVisitStatus: Lookup.fromJson(map["visit_status"]), - actualVisitDate: getDate(map["actual_date"]), - travelingHours: map["traveling_hours"], + status: Lookup(id: map["taskStatusId"],name: map["taskStatusName"]), + ppmVisitStatus: Lookup(id: map["visitStatusId"],name: map["visitStatusName"]), + actualVisitDate: DateTime.tryParse(map["actualDate"] ?? ""), + expectedVisitDate: DateTime.tryParse(map["expectedDate"] ?? ""), + travelingHours: map["travelingHours"], timer: TimerModel( - startAt: getDate(map["start_date"]), - endAt: getDate(map["end_date"]), - durationInSecond: (int.tryParse(map["working_hours"] ?? "") ?? 0) * 60 *60 + startAt: DateTime.tryParse(map["startDate"] ?? ""), + endAt: DateTime.tryParse(map["endDate"] ?? ""), + durationInSecond: (int.tryParse(map["workingHours"] ?? "") ?? 0) * 60 *60 ), // contacts: contacts, ppmCheckLists: ppmCheckLists, calibrationTools: calibrationTools, pmKits: pmKits, + signature: map["signature"], ); } - static getDate(String date){ - return date == null || date.isEmpty - ? null : DateTime.fromMillisecondsSinceEpoch(int.tryParse(date) * 1000); + Pentry copyWith({ + Lookup ppmVisitStatus, + Lookup status, + TimerModel timer, + DateTime actualVisitDate, + DateTime expectedVisitDate, + String travelingHours, + String image, + File imageFile, + List ppmCheckLists, + List calibrationTools, + List pmKits, + String signature + }) { + return Pentry( + ppmVisitStatus: ppmVisitStatus ?? this.ppmVisitStatus, + status: status ?? this.status, + timer: timer ?? this.timer, + actualVisitDate: actualVisitDate ?? this.actualVisitDate, + expectedVisitDate: expectedVisitDate ?? this.expectedVisitDate, + travelingHours: travelingHours ?? this.travelingHours, + image: image ?? this.image, + imageFile: imageFile ?? this.imageFile, + ppmCheckLists: ppmCheckLists ?? this.ppmCheckLists?.map((e) => e.copyWith())?.toList(), + calibrationTools: calibrationTools ?? this.calibrationTools?.map((e) => e.copyWith())?.toList(), + pmKits: pmKits ?? this.pmKits.map((e) => e.copyWith()).toList(), + signature: signature ?? this.signature + ); } } \ No newline at end of file diff --git a/lib/models/pantry/pm_kit.dart b/lib/models/pantry/pm_kit.dart index 0a008e5f..ddb75a40 100644 --- a/lib/models/pantry/pm_kit.dart +++ b/lib/models/pantry/pm_kit.dart @@ -1,6 +1,7 @@ import 'package:test_sa/models/lookup.dart'; class PMKit{ + int id; Lookup itemCode; String itemName; String preparationTimeFrame; @@ -10,6 +11,7 @@ class PMKit{ String quantityReserved; PMKit({ + this.id, this.itemCode, this.itemName, this.preparationTimeFrame, @@ -19,21 +21,24 @@ class PMKit{ this.quantityReserved }); - Map toMap() { + Map toMap(int visitId) { return { - if(itemCode != null) 'itemCode': (itemCode?.id).toString(), - if(itemName != null) 'itemName': itemName, - if(preparationTimeFrame != null) 'preparationTimeFrame': preparationTimeFrame, - if(kitFrequencyDemand != null) 'kitFrequencyDemand': kitFrequencyDemand, - if(availability != null) 'availability': availability, - if(quantityNeeded != null) 'quantityNeeded': quantityNeeded, - if(quantityReserved != null) 'quantityReserved': quantityReserved, + "id":id, + "visitId": visitId, + if(itemCode != null) 'partCatalogItemId': (itemCode?.id).toString(), + // if(itemName != null) 'itemName': itemName, + // if(preparationTimeFrame != null) 'preparationTimeFrame': preparationTimeFrame, + // if(kitFrequencyDemand != null) 'kitFrequencyDemand': kitFrequencyDemand, + // if(availability != null) 'availability': availability, + // if(quantityNeeded != null) 'quantityNeeded': quantityNeeded, + // if(quantityReserved != null) 'quantityReserved': quantityReserved, }; } factory PMKit.fromMap(Map map) { return PMKit( - itemCode: Lookup.fromJson(map['itemCode']), + id: map['id'], + //itemCode: Lookup.fromJson(map['itemCode']), itemName: map['itemName'] as String, preparationTimeFrame: map['preparationTimeFrame'] as String, kitFrequencyDemand: map['kitFrequencyDemand'] as String, @@ -42,4 +47,26 @@ class PMKit{ quantityReserved: map['quantityReserved'] as String, ); } + + PMKit copyWith({ + int id, + Lookup itemCode, + String itemName, + String preparationTimeFrame, + String kitFrequencyDemand, + String availability, + String quantityNeeded, + String quantityReserved, + }) { + return PMKit( + id: id ?? this.id, + itemCode: itemCode ?? this.itemCode, + itemName: itemName ?? this.itemName, + preparationTimeFrame: preparationTimeFrame ?? this.preparationTimeFrame, + kitFrequencyDemand: kitFrequencyDemand ?? this.kitFrequencyDemand, + availability: availability ?? this.availability, + quantityNeeded: quantityNeeded ?? this.quantityNeeded, + quantityReserved: quantityReserved ?? this.quantityReserved, + ); + } } \ No newline at end of file diff --git a/lib/models/pantry/ppm_check_list.dart b/lib/models/pantry/ppm_check_list.dart index 8f1a14d7..cbf750bc 100644 --- a/lib/models/pantry/ppm_check_list.dart +++ b/lib/models/pantry/ppm_check_list.dart @@ -1,33 +1,54 @@ import 'package:test_sa/models/lookup.dart'; class PPMCheckList{ + int id; Lookup status; String title; String comment; String measuredValue; PPMCheckList({ + this.id, this.title, this.status, this.comment, this.measuredValue, }); - Map toMap() { + Map toMap(int visitId) { return { - if(status != null) 'status': status?.id.toString(), - if(title != null) 'title': title, - if(comment != null) 'comment': comment, + 'id': id, + "visitId": visitId, + if(status != null) 'taskStatusId': status?.id.toString(), + if(title != null) 'task': title, + if(comment != null) 'taskComment': comment, if(measuredValue != null) 'measuredValue': measuredValue, }; } factory PPMCheckList.fromMap(Map map) { return PPMCheckList( - status: Lookup.fromJson(map['status']), - title: map['title'] as String, - comment: map['comment'] as String, + id: map['id'] as int, + status: Lookup(id: map["taskStatusId"],name: map["taskStatusName"]), + title: map['task'] as String, + comment: map['taskComment'] as String, measuredValue: map['measuredValue'] as String, ); } + + PPMCheckList copyWith({ + int id, + Lookup status, + String title, + String comment, + String measuredValue, + }) { + return PPMCheckList( + id: id ?? this.id, + status: status ?? this.status, + title: title ?? this.title, + comment: comment ?? this.comment, + measuredValue: measuredValue ?? this.measuredValue, + ); + } } \ No newline at end of file diff --git a/lib/models/part.dart b/lib/models/part.dart index d75bb493..5589d9b0 100644 --- a/lib/models/part.dart +++ b/lib/models/part.dart @@ -1,5 +1,5 @@ class Part{ - String id; + int id; String code; String name; int quantity; @@ -13,11 +13,11 @@ class Part{ factory Part.fromJson(Map parsedJson){ return Part( - id: parsedJson["nid"] ?? parsedJson["id"], - code: parsedJson["part_code"] ?? parsedJson["name"], - name: parsedJson["part_name"], - quantity: parsedJson["qty"] == null - ? 1 : int.tryParse(parsedJson["qty"].toString()) ?? 1, + id: parsedJson["id"], + code: parsedJson["partNo"], + name: parsedJson["partName"], + quantity: parsedJson["partQuantity"] == null + ? 1 : int.tryParse(parsedJson["partQuantity"].toString()) ?? 1, ); } } \ No newline at end of file diff --git a/lib/models/service_report.dart b/lib/models/service_report.dart index 33bb2fd2..01b75bec 100644 --- a/lib/models/service_report.dart +++ b/lib/models/service_report.dart @@ -52,12 +52,12 @@ class ServiceReport { this.timer, }); - Map toMap(){ + Map toMap(){ Map _map = {}; if(id != null) _map["id"] = id; if(visitDate != null) _map["visit_date"] = (visitDate.millisecondsSinceEpoch ~/ 1000).toString(); if(serviceType != null) _map["service_type"] = serviceType.id.toString(); - if(status != null) _map["status"] = status.id.toString(); + if(status != null) _map["status"] = status.toMap(); if(type != null) _map["service_report_type"] = type.id.toString(); if(faultDescription != null && faultDescription.isNotEmpty) _map["fault_description"] = faultDescription; //if(workHours != null && workHours.isNotEmpty) _map["working_hours"] = workHours; @@ -71,18 +71,18 @@ class ServiceReport { if(jobSheetNumber != null && jobSheetNumber.isNotEmpty) _map["job_sheet_no"] = jobSheetNumber; if(parts != null && parts.isNotEmpty){ Map _partsMap = {}; - parts.forEach((part) { - if(part.id.isNotEmpty) - _partsMap[part.id] = part.quantity; - }); + // parts.forEach((part) { + // if(part.id == null) + // _partsMap[part.id] = part.quantity; + // }); _map["parts"] = json.encode(_partsMap); } - if(device?.id != null && device.id != null) _map["eq_id"] = device.id; + //if(device?.id != null && device.id != null) _map["eq_id"] = device.id; if(quantity != null && quantity.isNotEmpty) _map["qty"] = quantity; if(endDate != null) _map["end_date"] = (endDate.millisecondsSinceEpoch ~/ 1000).toString(); - if(reason != null) _map["reasons"] = reason.id.toString(); + if(reason != null) _map["reasons"] = reason.toMap(); if(operatingHours != null && operatingHours.isNotEmpty) _map["operation_hours"] = operatingHours; - if(callLastSituation != null) _map["call_last_situtation"] = callLastSituation.id.toString(); + if(callLastSituation != null) _map["calllastSituation"] = callLastSituation.id.toString(); if(image != null) _map["image"] = image; if(invoiceCode != null) _map["invoice_no"] = invoiceCode; if(invoiceNumber != null) _map["invoice_code"] = invoiceNumber; @@ -102,7 +102,8 @@ class ServiceReport { if(parts == null) return false; //if(endDate == null) return false; //if(reason == null) return false; - if((device?.id == null || device.id.isEmpty) && type?.id != 1) return false; + //todo uncoment this line + //if((device?.id == null || device.id.isEmpty) && type?.id != 1) return false; //if(quantity == null || quantity.isEmpty) return false; //if(image == null) return false; return true; diff --git a/lib/models/service_request/service_request.dart b/lib/models/service_request/service_request.dart index ae6f9370..23f178a8 100644 --- a/lib/models/service_request/service_request.dart +++ b/lib/models/service_request/service_request.dart @@ -1,3 +1,4 @@ +import 'package:test_sa/controllers/api_routes/urls.dart'; import 'package:test_sa/models/lookup.dart'; import '../timer_model.dart'; @@ -6,13 +7,13 @@ class ServiceRequest{ String id; String requestCode; String deviceSerialNumber; - String deviceId; + int deviceId; String deviceArName; String deviceEnName; List devicePhotos; String maintenanceIssue; String hospitalName; - String hospitalId; + int hospitalId; String departmentName; String engineerName; String date; @@ -32,6 +33,8 @@ class ServiceRequest{ String deviceNumber; Lookup priority; Lookup defectType; + Lookup type; + Lookup requestedThrough; ServiceRequest({ this.id, @@ -63,42 +66,48 @@ class ServiceRequest{ this.defectType, this.priority, this.deviceNumber, - + this.type, + this.requestedThrough, }); factory ServiceRequest.fromJson(Map parsedJson){ + List images = []; + if(parsedJson["attachmentsCallRequest"] is List){ + List list = parsedJson["attachmentsCallRequest"]; + images = list.map((e) => URLs.getFileUrl(e["attachmentsCallRequest"])).toList(); + } return ServiceRequest( - id: parsedJson["nid"], - requestCode: parsedJson["call_id"] ?? parsedJson["jobcode"] , - hospitalName: parsedJson["call_client"], - deviceNumber: parsedJson["device_no"], - deviceId: parsedJson["deviceid"], - audio: parsedJson["audio"] ?? "", - deviceArName: parsedJson["equipment_arabic_name"] == false - ? "No Name found" : parsedJson["equipment_arabic_name"], - deviceEnName: parsedJson["equipment_english_name"] == false - ? "No Name found" : parsedJson["equipment_english_name"], - devicePhotos: List.from(parsedJson["image"]), - deviceSerialNumber: parsedJson["call_sn"], - date: parsedJson["call_data"], - maintenanceIssue: parsedJson["call_complaint"] ?? parsedJson["complaint"], - statusLabel: parsedJson["status_value"], - statusValue: int.tryParse(parsedJson["status"]??"-1"), - departmentName: parsedJson["department_name"], - engineerName: parsedJson["employee_name"], - hospitalId: parsedJson["client"], - reportID: parsedJson["service_report_nid"] is String - ? parsedJson["service_report_nid"] - : null , - viewReport: parsedJson["service_report_nid"] is bool ? false : true, - deviceModel: parsedJson["device_model"], - engineerMobile: parsedJson["engineer_mobile"], - faultDescription: parsedJson["fault_desc"], - jobSheetNumber: parsedJson["job_sheet_number"], - visitDate: parsedJson["visit_date"], - nextVisitDate:parsedJson["next_visit_date"] == null - ? null : DateTime.fromMillisecondsSinceEpoch(int.tryParse(parsedJson["next_visit_date"]) * 1000), - workPerformed: parsedJson["work_performed"], + id: parsedJson["id"].toString(), + requestCode: parsedJson["callNo"].toString(), + hospitalName: parsedJson["asset"]["site"]["custName"], + deviceNumber: parsedJson["asset"]["assetNumber"].toString(), + deviceId: parsedJson["asset"]["id"], + audio: URLs.getFileUrl(parsedJson["voiceNote"] ?? ""), + deviceArName: parsedJson["asset"]["modelDefinition"]["assetName"] ?? "", + deviceEnName: parsedJson["asset"]["modelDefinition"]["assetName"] ?? "", + devicePhotos: images, + deviceSerialNumber: parsedJson["asset"]["assetSerialNo"], + date: DateTime.tryParse(parsedJson["requestedDate"] ?? "").toString().split(" ").first, + maintenanceIssue: parsedJson["comments"], + statusLabel: parsedJson["status"] == null ? null : + parsedJson["status"]["name"], + statusValue: parsedJson["status"] == null ? null : + parsedJson["status"]["value"], + departmentName: parsedJson["asset"]["department"] != null ? + parsedJson["asset"]["department"]["name"] : "", + engineerName: parsedJson["assignedEmployee"] == null ? null : + parsedJson["assignedEmployee"]["name"], + hospitalId: parsedJson["asset"]["site"]["id"], + reportID: parsedJson["workOrder"]["id"].toString(), + viewReport: parsedJson["workOrder"] != null, + deviceModel: parsedJson["asset"]["modelDefinition"]["modelName"], + engineerMobile: parsedJson["assignedEmployee"] == null ? null : + parsedJson["assignedEmployee"]["phone"], + faultDescription: parsedJson["workOrder"]["faultDescription"], + jobSheetNumber: parsedJson["workOrder"]["jobSheetNumber"], + visitDate: DateTime.tryParse(parsedJson["visitDate"] ?? "").toString().split(" ").first, + nextVisitDate: DateTime.tryParse(parsedJson["nextVisitDate"] ?? ""), + workPerformed: parsedJson["workOrder"]["workPerformed"], ); } } \ No newline at end of file diff --git a/lib/models/service_request/service_request_search.dart b/lib/models/service_request/service_request_search.dart index 257f25f5..cd2adf04 100644 --- a/lib/models/service_request/service_request_search.dart +++ b/lib/models/service_request/service_request_search.dart @@ -1,13 +1,18 @@ +import 'package:test_sa/models/hospital.dart'; +import 'package:test_sa/models/lookup.dart'; + class ServiceRequestSearch{ String deviceSerialNumber; + String deviceNumber; String deviceName; - String hospital; + Hospital hospital; String model; - int statusValue; + Lookup statusValue; ServiceRequestSearch({ this.deviceSerialNumber, + this.deviceNumber, this.statusValue, this.deviceName, this.model, @@ -16,31 +21,38 @@ class ServiceRequestSearch{ fromSearch(ServiceRequestSearch newSearch){ deviceSerialNumber = newSearch.deviceSerialNumber; + deviceNumber = newSearch.deviceNumber; statusValue = newSearch.statusValue; hospital = newSearch.hospital; model = newSearch.model; } - String toSearchString(){ - String _search = ""; + Map toMap(){ + Map search = {}; if(deviceSerialNumber != null && deviceSerialNumber.isNotEmpty){ - _search += "&sn_id=$deviceSerialNumber"; + search["assetSerialNumber"] = deviceSerialNumber; + } + + if(deviceNumber != null && deviceNumber.isNotEmpty){ + search["assetNo"] = deviceNumber; } if(statusValue != null){ - _search += "&status=$statusValue"; + search["status"] = statusValue.toMap(); } if(deviceName != null && deviceName.isNotEmpty){ - _search += "&equipment_en_name=$deviceName"; + search["assetName"] = deviceName; + } - if(hospital != null && hospital.isNotEmpty){ - _search += "&client=$hospital"; + if(hospital != null){ + search["site"] = hospital.name; } - if(model != null && model.isNotEmpty){ - _search += "&model=$model"; + + if(model != null){ + search["modelDefinition"] = model; } - return _search; + return search; } } \ No newline at end of file diff --git a/lib/models/user.dart b/lib/models/user.dart index b091856f..6aabf108 100644 --- a/lib/models/user.dart +++ b/lib/models/user.dart @@ -8,7 +8,6 @@ class User{ String userName; String password; String email; - String image; Hospital hospital; Department department; UsersTypes type; @@ -16,6 +15,7 @@ class User{ String whatsApp; String token; bool isActive; + DateTime tokenLife; User({ @@ -25,11 +25,11 @@ class User{ this.password = "", this.phoneNumber = "", this.hospital, - this.image, this.department, this.type, this.whatsApp, this.token, + this.tokenLife, this.isActive = false }); @@ -38,14 +38,14 @@ class User{ await FirebaseNotificationManger.getToken(); return { "username":userName, - "pass":password, + "password":password, "firebase_token": FirebaseNotificationManger?.token ?? "", }; } Map toUpdateProfileJson(){ Map jsonObject ={}; - if(department?.id != null && department.id.isNotEmpty) + if(department?.id != null) jsonObject["department"] = department.id; if(whatsApp != null && whatsApp.isNotEmpty) jsonObject["whatsapp"] = whatsApp; @@ -71,48 +71,52 @@ class User{ Map toJson(){ return { - "uid":id, - "name": userName, + "userID":id, + "username": userName, "email":email, "token":token, - "phone":phoneNumber, + "phoneNumber":phoneNumber, "whatsapp":whatsApp, - "client":hospital?.id, + "client_id":hospital?.id, "client_name":hospital?.name, - "department":department?.id, + "department_id":department?.id, "department_name":department?.name, - "password":password, - "picture":image, - "active":isActive ? 1 : 0, - "role": type == UsersTypes.engineer - ? "field_engineer" : "normal_user" , + //"password":password, + "tokenlife":tokenLife.toIso8601String(), + "active":isActive, + "userRoles": type == UsersTypes.engineer + ? "value: R-6" : "value: R-5" , // "token":token, pass is token }; } factory User.fromJson(Map parsedJson){ UsersTypes type; - switch(parsedJson["role"]){ - case "field_engineer": type = UsersTypes.engineer; break; - default: type = UsersTypes.normal_user; break; + if(parsedJson["userRoles"].toString().contains("value: R-4") + || parsedJson["userRoles"].toString().contains("value: R-5") + || parsedJson["userRoles"].toString().contains("value: R-7")){ + type = UsersTypes.normal_user; + } else { + type = UsersTypes.engineer; } + print(parsedJson); return User( - id: parsedJson["uid"], - userName: parsedJson["name"] ?? parsedJson["title"], - email: parsedJson["mail"] ?? parsedJson["email"], - hospital: Hospital( - id: parsedJson["client"], - name: parsedJson["client_name"] - ), + id: parsedJson["userID"], + userName: parsedJson["username"], + email: parsedJson["email"], + // hospital: Hospital( + // id: parsedJson["client_id"], + // name: parsedJson["client_name"] + // ), department: Department( - id: parsedJson["department"], + id: parsedJson["department_id"], name: parsedJson["department_name"], ), - image: parsedJson["picture"], - phoneNumber: parsedJson["phone"], - whatsApp: parsedJson["whatsapp"], + phoneNumber: parsedJson["phoneNumber"], + whatsApp: parsedJson["phoneNumber"], token: parsedJson["token"], - isActive: parsedJson["active"] == "1", + isActive: parsedJson["isAuthenticated"], + tokenLife: DateTime.tryParse(parsedJson["tokenlife"]??""), type:type ); } diff --git a/lib/models/visits/visit.dart b/lib/models/visits/visit.dart index da3a2143..7554ecd4 100644 --- a/lib/models/visits/visit.dart +++ b/lib/models/visits/visit.dart @@ -1,21 +1,22 @@ import 'package:test_sa/models/lookup.dart'; +import 'package:test_sa/models/pantry/pentry.dart'; import 'package:test_sa/models/timer_model.dart'; class Visit{ - String id; + int id; String serialNumber; String expectDate; String actualDate; - String hospitalId; + int hospitalId; String hospitalName; - String deviceId; + int deviceId; String deviceSerialNumber; String deviceArabicName; String deviceEnglishName; String employId; String employName; String modelAndBrand; - String contactStatus; + Pentry pentry; Lookup status; String assignTo; String deviceNumber; @@ -36,35 +37,41 @@ class Visit{ this.actualDate, this.status, this.modelAndBrand, - this.contactStatus, + this.pentry, this.images, this.assignTo, this.deviceNumber, }); factory Visit.fromJson(Map parsedJson){ + List images = []; + if(parsedJson["vAttachments"] is List){ + List list = parsedJson["vAttachments"]; + images = list.map((e) => e["attachmentURL"].toString()).toList(); + } return Visit( - id: parsedJson["nid"], - serialNumber: parsedJson["title"], - hospitalId: parsedJson["client"], - deviceNumber: parsedJson["device_no"], - hospitalName: parsedJson["client_name"], - deviceId: parsedJson["medical_equipment_nid"], - deviceSerialNumber: parsedJson["medical_equipment"], - deviceEnglishName: parsedJson["equipment_english_name"], - deviceArabicName: parsedJson["equipment_arabic_name"], - employId: parsedJson["assigned_employee"], - employName: parsedJson["assigned_employee_name"], - expectDate: parsedJson["expected_date"], - actualDate: parsedJson["actual_date"], - modelAndBrand: parsedJson["mode_brand"], - contactStatus: parsedJson["contactStatus"], - images: List.from(parsedJson["images"] ?? []), + id: parsedJson["id"], + serialNumber: parsedJson["visitCode"], + hospitalId: parsedJson["siteId"], + deviceNumber: parsedJson["assetNumber"], + hospitalName: parsedJson["siteName"], + deviceId: parsedJson["assetId"], + deviceSerialNumber: parsedJson["assetSerialNo"], + deviceEnglishName: parsedJson["assetName"], + deviceArabicName: parsedJson["assetName"], + employId: parsedJson["assignedToId"].toString(), + employName: parsedJson["assignedToName"], + expectDate: parsedJson["expectedDate"].toString().split("T").first, + actualDate: parsedJson["actualDate"].toString().split("T").first, + modelAndBrand: "${parsedJson["modelName"]} / ${parsedJson["manufacturerName"]}", + // contactStatus: parsedJson["contactStatus"], + images: images, status: Lookup( - id: int.tryParse(parsedJson["status"] ?? "-1"), // actual value (0,1,2) - label: parsedJson["status_value"] // text value + id: parsedJson["visitStatusId"], // actual value (0,1,2) + name: parsedJson["visitStatusName"] // text value ), - assignTo: parsedJson["assigned_to"], + assignTo: parsedJson["assignedToName"], + pentry: Pentry.fromMap(parsedJson) ); } } \ No newline at end of file diff --git a/lib/models/visits/visits_group.dart b/lib/models/visits/visits_group.dart index abe6dfc0..3f47b8cf 100644 --- a/lib/models/visits/visits_group.dart +++ b/lib/models/visits/visits_group.dart @@ -1,43 +1,47 @@ +import 'package:test_sa/models/engineer.dart'; import 'package:test_sa/models/lookup.dart'; import 'package:test_sa/models/visits/visit.dart'; class VisitsGroup{ - String userId; - String workingHours; - String travelingHours; - String jobSheetNumber; - String image; - Lookup status; - Lookup taskStatus; - DateTime date; + // String userId; + // String workingHours; + // String travelingHours; + // String jobSheetNumber; + // String image; + // Lookup status; + // Lookup taskStatus; + // DateTime date; + Engineer engineer; List visits; VisitsGroup({ - this.userId, - this.status, - this.date, - this.jobSheetNumber, - this.travelingHours, - this.workingHours, - this.visits, - this.image, - this.taskStatus, + // this.userId, + // this.status, + // this.date, + // this.jobSheetNumber, + // this.travelingHours, + // this.workingHours, + this.visits, + this.engineer, + // this.image, + // this.taskStatus, }); - Map toJson(){ - Map jsonObject = {}; - jsonObject["nids"] = visits.map((e) => e.id).toList().join(','); - if(status != null) jsonObject["status"] = status.id.toString(); - if(date != null) jsonObject["date"] = date.toString().split(" ").first; - if(jobSheetNumber != null && jobSheetNumber.isNotEmpty) - jsonObject["job_sheet_no"] = jobSheetNumber; - if(travelingHours != null && travelingHours.isNotEmpty) - jsonObject["traveling_hours"] = travelingHours; - if(workingHours != null && workingHours.isNotEmpty) - jsonObject["working_hours"] = workingHours; - if(image != null) jsonObject["image"] = image; - if(taskStatus != null) jsonObject["task_status"] = taskStatus.id.toString(); + Map toJson(){ + Map jsonObject = {}; + jsonObject["ids"] = visits.map((e) => e.id).toList(); + jsonObject["assignedEmployeeId"] = engineer?.id; + // if(status != null) jsonObject["taskStatusId"] = status.id.toString(); + // if(date != null) jsonObject["actualDate"] = date.toIso8601String(); + // if(jobSheetNumber != null && jobSheetNumber.isNotEmpty) + // jsonObject["jobSheetNo"] = jobSheetNumber; + // if(travelingHours != null && travelingHours.isNotEmpty) + // jsonObject["travelingHours"] = travelingHours; + // if(workingHours != null && workingHours.isNotEmpty) + // jsonObject["workingHours"] = workingHours; + // if(image != null) jsonObject["image"] = image; + // if(taskStatus != null) jsonObject["task_status"] = taskStatus.id.toString(); return jsonObject; } diff --git a/lib/models/visits/visits_search.dart b/lib/models/visits/visits_search.dart index 7cfd4ceb..737277f8 100644 --- a/lib/models/visits/visits_search.dart +++ b/lib/models/visits/visits_search.dart @@ -1,20 +1,23 @@ +import 'package:test_sa/models/hospital.dart'; +import 'package:test_sa/models/lookup.dart'; + class VisitsSearch{ String deviceSerialNumber; - String hospitalName; + Hospital hospital; String brand; - String model; - String contactStatus; + Lookup model; + Lookup contactStatus; DateTime expectedDateFrom; DateTime expectedDateTo; DateTime actualDateFrom; DateTime actualDateTo; - int statusValue; + Lookup statusValue; VisitsSearch({ this.deviceSerialNumber, this.statusValue, this.brand, - this.hospitalName, + this.hospital, this.actualDateTo, this.actualDateFrom, this.model, @@ -26,7 +29,7 @@ class VisitsSearch{ fromSearch(VisitsSearch newSearch){ deviceSerialNumber = newSearch.deviceSerialNumber; brand = newSearch.brand; - hospitalName = newSearch.hospitalName; + hospital = newSearch.hospital; actualDateTo = newSearch.actualDateTo; actualDateFrom = newSearch.actualDateFrom; model = newSearch.model; @@ -36,46 +39,47 @@ class VisitsSearch{ statusValue = newSearch.statusValue; } - String toSearchString(){ - String _search = ""; + Map toMap(){ + Map _search = {}; if(deviceSerialNumber != null && deviceSerialNumber.isNotEmpty){ - _search += "&sn_id=$deviceSerialNumber"; + _search["assetId"]= deviceSerialNumber; } - if(hospitalName != null && hospitalName.isNotEmpty){ - _search += "&client=$hospitalName"; + if(hospital != null){ + _search["siteId"]= hospital.id; } if(brand != null && brand.isNotEmpty){ - _search += "&brand=$brand"; + // todo get new key + _search[""]= brand; } - if(model != null && model.isNotEmpty){ - _search += "&model=$model"; + if(model != null){ + _search["modelId"]= model.id; } if(expectedDateFrom != null){ - _search += "&expected_date_from=${expectedDateFrom.millisecondsSinceEpoch ~/ 1000}"; + _search["expectedDateFrom"]= expectedDateFrom.toIso8601String(); } if(expectedDateTo != null){ - _search += "&expected_date_to=${expectedDateTo.millisecondsSinceEpoch~/1000}"; + _search["expectedDateTo"]= expectedDateTo.toIso8601String(); } if(actualDateFrom != null){ - _search += "&actual_date_from=${actualDateFrom.millisecondsSinceEpoch ~/ 1000}"; + _search["actualDateFrom"]= actualDateFrom.toIso8601String(); } if(actualDateTo != null){ - _search += "&actual_date_to=${actualDateTo.millisecondsSinceEpoch~/1000}"; + _search["actualDateTo"]= actualDateTo.toIso8601String(); } if(statusValue != null){ - _search += "&status=$statusValue"; + _search["visitStatusId"]= statusValue.id; } if(contactStatus != null){ - _search += "&assigned_to=$contactStatus"; + _search["assignedToId"]= contactStatus.id; } return _search; } diff --git a/lib/views/pages/device_transfer/device_transfer_details.dart b/lib/views/pages/device_transfer/device_transfer_details.dart index 7b36058c..6975304b 100644 --- a/lib/views/pages/device_transfer/device_transfer_details.dart +++ b/lib/views/pages/device_transfer/device_transfer_details.dart @@ -108,7 +108,7 @@ class _DeviceTransferDetailsState extends State { style: Theme.of(context).textTheme.headline6 ), ), - if(_isSender) + if(_isSender || true) ASmallButton( text: _subtitle.edit, onPressed: (){ @@ -134,7 +134,7 @@ class _DeviceTransferDetailsState extends State { style: Theme.of(context).textTheme.headline6 ), ), - if(_isReceiver) + if(_isReceiver || true) ASmallButton( text: _subtitle.edit, onPressed: (){ diff --git a/lib/views/pages/device_transfer/request_device_transfer.dart b/lib/views/pages/device_transfer/request_device_transfer.dart index aa5562b9..30c9310a 100644 --- a/lib/views/pages/device_transfer/request_device_transfer.dart +++ b/lib/views/pages/device_transfer/request_device_transfer.dart @@ -1,7 +1,7 @@ import 'package:flutter/material.dart'; import 'package:fluttertoast/fluttertoast.dart'; import 'package:provider/provider.dart'; -import 'package:test_sa/controllers/http_status_manger/http_status_manger.dart'; +import 'package:test_sa/controllers/api_routes/http_status_manger.dart'; import 'package:test_sa/controllers/providers/api/device_transfer_provider.dart'; import 'package:test_sa/controllers/providers/api/user_provider.dart'; import 'package:test_sa/controllers/providers/settings/setting_provider.dart'; @@ -33,7 +33,7 @@ class _RequestDeviceTransferState extends State { SettingProvider _settingProvider; DeviceTransferProvider _deviceTransferProvider; final TextEditingController _requestedQuantityController = TextEditingController(); - final DeviceTransfer _formModel = DeviceTransfer(receiver: DeviceTransferInfo()); + final DeviceTransfer _formModel = DeviceTransfer(receiver: DeviceTransferInfo(),sender: DeviceTransferInfo()); final GlobalKey _formKey = GlobalKey(); final GlobalKey _scaffoldKey = GlobalKey(); @@ -57,7 +57,7 @@ class _RequestDeviceTransferState extends State { _isLoading = true; setState(() {}); - + _formModel.sender.client.id = _userProvider.user.hospital?.id; int status = await _deviceTransferProvider.createRequest( user: _userProvider.user, host: _settingProvider.host, diff --git a/lib/views/pages/device_transfer/update_device_transfer.dart b/lib/views/pages/device_transfer/update_device_transfer.dart index 2b407a48..7604e2ce 100644 --- a/lib/views/pages/device_transfer/update_device_transfer.dart +++ b/lib/views/pages/device_transfer/update_device_transfer.dart @@ -4,7 +4,7 @@ import 'package:flutter/foundation.dart'; import 'package:flutter/material.dart'; import 'package:fluttertoast/fluttertoast.dart'; import 'package:provider/provider.dart'; -import 'package:test_sa/controllers/http_status_manger/http_status_manger.dart'; +import 'package:test_sa/controllers/api_routes/http_status_manger.dart'; import 'package:test_sa/controllers/providers/api/device_transfer_provider.dart'; import 'package:test_sa/controllers/providers/api/user_provider.dart'; import 'package:test_sa/controllers/providers/settings/setting_provider.dart'; @@ -69,22 +69,12 @@ class _UpdateDeviceTransferState extends State { _validate = false; Navigator.of(context).pop(); Navigator.of(context).pop(); - }else{ - String errorMessage = HttpStatusManger.getStatusMessage( - status: status, subtitle: _subtitle); - ScaffoldMessenger.of(context).showSnackBar( - SnackBar( - content: Text( - errorMessage - ), - ) - ); } } @override void setState(VoidCallback fn){ - if(mounted) super.setState(() {}); + if(!mounted) super.setState(() {}); } @override @@ -207,7 +197,9 @@ class _UpdateDeviceTransferState extends State { newSignature: _signature, onSaved: (signature){ _signature = signature; + if(signature == null || signature.isEmpty) return; _formModel.signature = base64Encode(signature); + }, ), Padding( diff --git a/lib/views/pages/login.dart b/lib/views/pages/login.dart index ad8554cd..35e0570c 100644 --- a/lib/views/pages/login.dart +++ b/lib/views/pages/login.dart @@ -1,5 +1,5 @@ import 'package:test_sa/controllers/api_routes/urls.dart'; -import 'package:test_sa/controllers/http_status_manger/http_status_manger.dart'; +import 'package:test_sa/controllers/api_routes/http_status_manger.dart'; import 'package:test_sa/controllers/localization/localization.dart'; import 'package:test_sa/controllers/notification/notification_manger.dart'; import 'package:test_sa/controllers/providers/api/user_provider.dart'; @@ -119,13 +119,16 @@ class _LoginState extends State { user: _user, host: _settingProvider.host, ); - if(status >= 200 && status < 300){ + if(status >= 200 && status < 300 ){ _settingProvider.setUser(_userProvider.user); - if(_userProvider.user.isActive) - Navigator.of(context).pushNamed(LandPage.id); - else - Fluttertoast.showToast(msg: _subtitle.activationAlert); + Navigator.of(context).pushNamed(LandPage.id); + // if(_userProvider.user.isActive) + // Navigator.of(context).pushNamed(LandPage.id); + // else + // Fluttertoast.showToast(msg: _subtitle.activationAlert); }else{ + if(status >= 400 && status < 500) return; + String errorMessage = status == 400 ? _subtitle.wrongEmailOrPassword : HttpStatusManger.getStatusMessage( diff --git a/lib/views/pages/register.dart b/lib/views/pages/register.dart index 016fedf1..fe347039 100644 --- a/lib/views/pages/register.dart +++ b/lib/views/pages/register.dart @@ -2,7 +2,7 @@ import 'package:flutter/material.dart'; import 'package:fluttertoast/fluttertoast.dart'; import 'package:font_awesome_flutter/font_awesome_flutter.dart'; import 'package:provider/provider.dart'; -import 'package:test_sa/controllers/http_status_manger/http_status_manger.dart'; +import 'package:test_sa/controllers/api_routes/http_status_manger.dart'; import 'package:test_sa/controllers/localization/localization.dart'; import 'package:test_sa/controllers/providers/api/user_provider.dart'; import 'package:test_sa/controllers/providers/settings/setting_provider.dart'; diff --git a/lib/views/pages/splash_screen.dart b/lib/views/pages/splash_screen.dart index aea53176..9892b126 100644 --- a/lib/views/pages/splash_screen.dart +++ b/lib/views/pages/splash_screen.dart @@ -27,9 +27,12 @@ class _SplashScreenState extends State { UserProvider _userProvider; _goToUserScreen(User user){ - _userProvider.user = user; - // Navigator.of(context).pushNamed(Login.id); - Navigator.of(context).pushNamed(LandPage.id); + print(user.toJson()); + if(user.tokenLife != null && user.tokenLife.isAfter(DateTime.now())){ + _userProvider.user = user; + // Navigator.of(context).pushNamed(Login.id); + Navigator.of(context).pushNamed(LandPage.id); + } } @override diff --git a/lib/views/pages/user/gas_refill/gas_refill_details.dart b/lib/views/pages/user/gas_refill/gas_refill_details.dart index 33dd686a..8b053b6b 100644 --- a/lib/views/pages/user/gas_refill/gas_refill_details.dart +++ b/lib/views/pages/user/gas_refill/gas_refill_details.dart @@ -1,7 +1,7 @@ import 'package:flutter/material.dart'; import 'package:fluttertoast/fluttertoast.dart'; import 'package:provider/provider.dart'; -import 'package:test_sa/controllers/http_status_manger/http_status_manger.dart'; +import 'package:test_sa/controllers/api_routes/http_status_manger.dart'; import 'package:test_sa/controllers/localization/localization.dart'; import 'package:test_sa/controllers/providers/api/gas_refill_provider.dart'; import 'package:test_sa/controllers/providers/api/user_provider.dart'; @@ -177,7 +177,8 @@ class _GasRefillDetailsState extends State { textScaleFactor: AppStyle.getScaleFactor(context), ), ), - StatusLabel(label: _model.status.label, + if(_model.status?.id != null) + StatusLabel(label: _model.status.name, color: AColors.getGasStatusColor(_model.status.id) ), ], diff --git a/lib/views/pages/user/gas_refill/request_gas_refill.dart b/lib/views/pages/user/gas_refill/request_gas_refill.dart index 5f41ec48..0f4f3c41 100644 --- a/lib/views/pages/user/gas_refill/request_gas_refill.dart +++ b/lib/views/pages/user/gas_refill/request_gas_refill.dart @@ -1,19 +1,23 @@ import 'package:flutter/material.dart'; import 'package:fluttertoast/fluttertoast.dart'; import 'package:provider/provider.dart'; -import 'package:test_sa/controllers/http_status_manger/http_status_manger.dart'; +import 'package:test_sa/controllers/api_routes/http_status_manger.dart'; import 'package:test_sa/controllers/providers/api/gas_refill_provider.dart'; import 'package:test_sa/controllers/providers/api/user_provider.dart'; import 'package:test_sa/controllers/providers/settings/setting_provider.dart'; import 'package:test_sa/controllers/validator/validator.dart'; import 'package:test_sa/models/gas_refill/gas_refill_details.dart'; import 'package:test_sa/models/gas_refill/gas_refill_model.dart'; +import 'package:test_sa/models/lookup.dart'; import 'package:test_sa/models/subtitle.dart'; import 'package:test_sa/views/app_style/sizing.dart'; import 'package:test_sa/views/widgets/app_text_form_field.dart'; import 'package:test_sa/views/widgets/buttons/app_button.dart'; import 'package:test_sa/views/widgets/gas_refill/gas_refill_create_details_item.dart'; import 'package:test_sa/views/widgets/loaders/loading_manager.dart'; +import 'package:test_sa/views/widgets/status/gas_refill/gas_cylinder_size.dart'; +import 'package:test_sa/views/widgets/status/gas_refill/gas_cylinder_type.dart'; +import 'package:test_sa/views/widgets/status/gas_refill/gas_status.dart'; import 'package:test_sa/views/widgets/status/gas_refill/gas_type.dart'; import 'package:test_sa/views/widgets/titles/app_sub_title.dart'; @@ -153,19 +157,21 @@ class _RequestGasRefillState extends State { // _formModel.title = value; // }, // ), - // // const SizedBox(height: 8,), - // ASubTitle(_subtitle.status), - // if(_validate && _formModel.status == null) - // ASubTitle(_subtitle.requiredWord,color: Colors.red,), - // const SizedBox(height: 4,), - // GasStatusMenu( - // initialValue: _formModel.status, - // onSelect: (status){ - // _formModel.status = status; - // }, - // ), // const SizedBox(height: 8,), - // Divider(color: Theme.of(context).colorScheme.primary,), + ASubTitle(_subtitle.status), + if(_validate && _formModel.status == null) + ASubTitle(_subtitle.requiredWord,color: Colors.red,), + const SizedBox(height: 4,), + GasStatusMenu( + initialValue: _formModel.status ?? const Lookup( + value: 1 + ), + onSelect: (status){ + _formModel.status = status; + }, + ), + const SizedBox(height: 8,), + Divider(color: Theme.of(context).colorScheme.primary,), const SizedBox(height: 4,), const ASubTitle("Type"), if(_validate && _currentDetails.type == null) @@ -178,17 +184,28 @@ class _RequestGasRefillState extends State { }, ), - // const SizedBox(height: 8,), - // const ASubTitle("Cylinder Size"), - // if(_validate && _currentDetails.cylinderSize == null) - // ASubTitle(_subtitle.requiredWord,color: Colors.red,), - // const SizedBox(height: 4,), - // GasCylinderSizeMenu( - // initialValue: _currentDetails.cylinderSize, - // onSelect: (status){ - // _currentDetails.cylinderSize = status; - // }, - // ), + const SizedBox(height: 8,), + const ASubTitle("Cylinder Size"), + if(_validate && _currentDetails.cylinderSize == null) + ASubTitle(_subtitle.requiredWord,color: Colors.red,), + const SizedBox(height: 4,), + GasCylinderSizeMenu( + initialValue: _currentDetails.cylinderSize, + onSelect: (status){ + _currentDetails.cylinderSize = status; + }, + ), + const SizedBox(height: 8,), + const ASubTitle("Cylinder Type"), + if(_validate && _currentDetails.cylinderSize == null) + ASubTitle(_subtitle.requiredWord,color: Colors.red,), + const SizedBox(height: 4,), + GasCylinderTypesMenu( + initialValue: _currentDetails.cylinderType, + onSelect: (status){ + _currentDetails.cylinderType = status; + }, + ), const SizedBox(height: 8,), ASubTitle(_subtitle.quantity), if(_validate && _currentDetails.requestedQuantity == null) @@ -204,7 +221,7 @@ class _RequestGasRefillState extends State { ? null : "allow numbers only", textInputType: TextInputType.number, onSaved: (value){ - _currentDetails.requestedQuantity = int.tryParse(value); + _currentDetails.requestedQuantity = double.tryParse(value); }, ), const SizedBox(height: 8,), diff --git a/lib/views/pages/user/land_page.dart b/lib/views/pages/user/land_page.dart index d173219d..5bf91817 100644 --- a/lib/views/pages/user/land_page.dart +++ b/lib/views/pages/user/land_page.dart @@ -366,12 +366,17 @@ class _LandPageState extends State { child: Icon(Icons.person,size: 72,color: Theme.of(context).colorScheme.primary,), ), ), - Text( - _userProvider.user.userName, - style: Theme.of(context).textTheme.headline6.copyWith( - fontWeight: FontWeight.normal, + Padding( + padding: const EdgeInsets.all(8.0), + child: FittedBox( + child: Text( + _userProvider.user?.userName ?? "??", + style: Theme.of(context).textTheme.headline6.copyWith( + fontWeight: FontWeight.normal, + ), + textScaleFactor: AppStyle.getScaleFactor(context), + ), ), - textScaleFactor: AppStyle.getScaleFactor(context), ), ], ), diff --git a/lib/views/pages/user/profile_page.dart b/lib/views/pages/user/profile_page.dart index f22b09f6..0b3757a0 100644 --- a/lib/views/pages/user/profile_page.dart +++ b/lib/views/pages/user/profile_page.dart @@ -1,7 +1,7 @@ import 'package:flutter/material.dart'; import 'package:font_awesome_flutter/font_awesome_flutter.dart'; import 'package:provider/provider.dart'; -import 'package:test_sa/controllers/http_status_manger/http_status_manger.dart'; +import 'package:test_sa/controllers/api_routes/http_status_manger.dart'; import 'package:test_sa/controllers/localization/localization.dart'; import 'package:test_sa/controllers/providers/api/user_provider.dart'; import 'package:test_sa/controllers/providers/settings/setting_provider.dart'; diff --git a/lib/views/pages/user/requests/create_request.dart b/lib/views/pages/user/requests/create_request.dart index 8e0a5b78..715a1488 100644 --- a/lib/views/pages/user/requests/create_request.dart +++ b/lib/views/pages/user/requests/create_request.dart @@ -5,13 +5,15 @@ import 'package:flutter/material.dart'; import 'package:fluttertoast/fluttertoast.dart'; import 'package:font_awesome_flutter/font_awesome_flutter.dart'; import 'package:provider/provider.dart'; -import 'package:test_sa/controllers/http_status_manger/http_status_manger.dart'; +import 'package:test_sa/controllers/api_routes/http_status_manger.dart'; import 'package:test_sa/controllers/localization/localization.dart'; import 'package:test_sa/controllers/providers/api/service_requests_provider.dart'; +import 'package:test_sa/controllers/providers/api/status_drop_down/service_reqest/service_request_through_provider.dart'; import 'package:test_sa/controllers/providers/api/user_provider.dart'; import 'package:test_sa/controllers/providers/settings/setting_provider.dart'; import 'package:test_sa/controllers/validator/validator.dart'; import 'package:test_sa/models/device/device.dart'; +import 'package:test_sa/models/lookup.dart'; import 'package:test_sa/models/service_request/service_request.dart'; import 'package:test_sa/models/subtitle.dart'; import 'package:test_sa/views/app_style/colors.dart'; @@ -26,6 +28,8 @@ import 'package:test_sa/views/widgets/sound/record_sound.dart'; import 'package:test_sa/views/widgets/speech_to_text/speech_to_text.dart'; import 'package:test_sa/views/widgets/status/service_request/service_request_defect_types_mune.dart'; import 'package:test_sa/views/widgets/status/service_request/service_request_priority_mune.dart'; +import 'package:test_sa/views/widgets/status/service_request/service_request_through_mune.dart'; +import 'package:test_sa/views/widgets/status/service_request/service_request_types_mune.dart'; import 'package:test_sa/views/widgets/titles/app_sub_title.dart'; class CreateRequestPage extends StatefulWidget { static final String id = "/create-request"; @@ -163,6 +167,24 @@ class _CreateRequestPageState extends State { _serviceRequest.defectType = status; }, ), + const SizedBox(height: 8,), + const ASubTitle("Type"), + const SizedBox(height: 4,), + ServiceRequestTypesMenu( + initialValue: _serviceRequest.type, + onSelect: (status){ + _serviceRequest.type = status; + }, + ), + const SizedBox(height: 8,), + const ASubTitle("Through"), + const SizedBox(height: 4,), + ServiceRequestedThroughMenu( + initialValue: const Lookup(name: "App",value: 3), + onSelect: (status){ + _serviceRequest.requestedThrough = status; + }, + ), MultiImagesPicker( label: _subtitle.deviceImages, images: _deviceImages, @@ -204,14 +226,14 @@ class _CreateRequestPageState extends State { if(!_formKey.currentState.validate()) return; _formKey.currentState.save(); - _serviceRequest.deviceId = _device?.id ?? ""; + _serviceRequest.deviceId = _device?.id; _isLoading =true; setState(() {}); _serviceRequest.devicePhotos = _deviceImages.map( - (e) => base64Encode(e.readAsBytesSync())).toList(); + (e) => "${e.path.split("/").last}|${base64Encode(e.readAsBytesSync())}").toList(); if(_serviceRequest.audio != null){ final file = File(_serviceRequest.audio); - _serviceRequest.audio = base64Encode(file.readAsBytesSync()); + _serviceRequest.audio = "${file.path.split("/").last}|${base64Encode(file.readAsBytesSync())}"; } int status = await _serviceRequestsProvider.createRequest( user: _userProvider.user, diff --git a/lib/views/pages/user/requests/report/create_service_report.dart b/lib/views/pages/user/requests/report/create_service_report.dart index 33638f92..2d65c34b 100644 --- a/lib/views/pages/user/requests/report/create_service_report.dart +++ b/lib/views/pages/user/requests/report/create_service_report.dart @@ -5,7 +5,7 @@ import 'package:flutter/material.dart'; import 'package:flutter/rendering.dart'; import 'package:fluttertoast/fluttertoast.dart'; import 'package:provider/provider.dart'; -import 'package:test_sa/controllers/http_status_manger/http_status_manger.dart'; +import 'package:test_sa/controllers/api_routes/http_status_manger.dart'; import 'package:test_sa/controllers/localization/localization.dart'; import 'package:test_sa/controllers/providers/api/service_requests_provider.dart'; import 'package:test_sa/controllers/providers/api/status_drop_down/report/service_report_last_calls_provider.dart'; diff --git a/lib/views/pages/user/requests/report/edit_service_report.dart b/lib/views/pages/user/requests/report/edit_service_report.dart index 0b268fc7..4a7be338 100644 --- a/lib/views/pages/user/requests/report/edit_service_report.dart +++ b/lib/views/pages/user/requests/report/edit_service_report.dart @@ -5,7 +5,7 @@ import 'package:flutter/material.dart'; import 'package:flutter/rendering.dart'; import 'package:fluttertoast/fluttertoast.dart'; import 'package:provider/provider.dart'; -import 'package:test_sa/controllers/http_status_manger/http_status_manger.dart'; +import 'package:test_sa/controllers/api_routes/http_status_manger.dart'; import 'package:test_sa/controllers/localization/localization.dart'; import 'package:test_sa/controllers/providers/api/service_requests_provider.dart'; import 'package:test_sa/controllers/providers/api/status_drop_down/report/service_report_last_calls_provider.dart'; @@ -273,8 +273,8 @@ class _EditServiceReportState extends State with TickerProvid ServiceReportLastCallsMenu( report: _serviceReport, onSelect: (status){ - if(status?.id == 12 - || _serviceReport.callLastSituation?.id == 12){ + if(status?.value == 12 + || _serviceReport.callLastSituation?.value == 12){ _serviceReport.callLastSituation = status; setState(() {}); } else { @@ -289,7 +289,7 @@ class _EditServiceReportState extends State with TickerProvid ), const SizedBox(height: 8,), // invoice number & code - _serviceReport.callLastSituation?.id != 12 ? const SizedBox.shrink(): + _serviceReport.callLastSituation?.value != 12 ? const SizedBox.shrink(): Row( children: [ Expanded( diff --git a/lib/views/pages/user/requests/request_details.dart b/lib/views/pages/user/requests/request_details.dart index 2ada571e..c052fb68 100644 --- a/lib/views/pages/user/requests/request_details.dart +++ b/lib/views/pages/user/requests/request_details.dart @@ -2,7 +2,7 @@ import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; import 'package:intl/intl.dart'; import 'package:provider/provider.dart'; -import 'package:test_sa/controllers/http_status_manger/http_status_manger.dart'; +import 'package:test_sa/controllers/api_routes/http_status_manger.dart'; import 'package:test_sa/controllers/localization/localization.dart'; import 'package:test_sa/controllers/providers/api/service_requests_provider.dart'; import 'package:test_sa/controllers/providers/api/user_provider.dart'; @@ -61,61 +61,59 @@ class RequestDetailsPage extends StatelessWidget { ), ), ), - Visibility( - visible: _userProvider.user.type == UsersTypes.normal_user, - replacement: AIconButton( - iconData: Icons.edit, - color: AColors.white, - buttonSize: 42, - backgroundColor: AColors.green, - onPressed: () async { - showModalBottomSheet( + _userProvider.user.type == UsersTypes.normal_user ? + AIconButton( + iconData: Icons.warning_amber_rounded, + color: AColors.white, + buttonSize: 42, + backgroundColor: AColors.deepOrange, + onPressed: (){ + Navigator.of(context).push( + MaterialPageRoute( + builder: (_) => ReportIssuesPage(serviceRequest: serviceRequest,) + ) + ); + }, + ) + : AIconButton( + iconData: Icons.edit, + color: AColors.white, + buttonSize: 42, + backgroundColor: AColors.green, + onPressed: () async { + showModalBottomSheet( context: context, builder: (context){ return ServiceRequestsUpdateDialog(request: serviceRequest,); }); - // DateTime picked = await showDatePicker( - // context: context, - // initialDate: DateTime.now(), - // firstDate: DateTime.now(), - // lastDate: DateTime.now().add(Duration(days: 182)) - // ); - // if(picked == null){return;} - // showDialog( - // context: context, - // barrierDismissible: false, - // builder: (BuildContext context) { - // return CupertinoAlertDialog( - // title: Text(_subtitle.updatingDots), - // content: Center(child: CircularProgressIndicator()), - // ); - // }, - // ); - // int status = await _serviceRequestsProvider.updateDate( - // user: _userProvider.user, - // host: _settingProvider.host, - // request: serviceRequest, - // newDate: picked.toString().split(" ").first - // ); - // Navigator.of(context).pop(); - // Fluttertoast.showToast( - // msg: HttpStatusManger.getStatusMessage(status: status, subtitle: _subtitle), - // ); - }, - ), - child: AIconButton( - iconData: Icons.warning_amber_rounded, - color: AColors.white, - buttonSize: 42, - backgroundColor: AColors.deepOrange, - onPressed: (){ - Navigator.of(context).push( - MaterialPageRoute( - builder: (_) => ReportIssuesPage(serviceRequest: serviceRequest,) - ) - ); - }, - ), + // DateTime picked = await showDatePicker( + // context: context, + // initialDate: DateTime.now(), + // firstDate: DateTime.now(), + // lastDate: DateTime.now().add(Duration(days: 182)) + // ); + // if(picked == null){return;} + // showDialog( + // context: context, + // barrierDismissible: false, + // builder: (BuildContext context) { + // return CupertinoAlertDialog( + // title: Text(_subtitle.updatingDots), + // content: Center(child: CircularProgressIndicator()), + // ); + // }, + // ); + // int status = await _serviceRequestsProvider.updateDate( + // user: _userProvider.user, + // host: _settingProvider.host, + // request: serviceRequest, + // newDate: picked.toString().split(" ").first + // ); + // Navigator.of(context).pop(); + // Fluttertoast.showToast( + // msg: HttpStatusManger.getStatusMessage(status: status, subtitle: _subtitle), + // ); + }, ), SizedBox(width: 16,) ], diff --git a/lib/views/pages/user/requests/requests_page.dart b/lib/views/pages/user/requests/requests_page.dart index e535d03b..6c04d822 100644 --- a/lib/views/pages/user/requests/requests_page.dart +++ b/lib/views/pages/user/requests/requests_page.dart @@ -47,7 +47,7 @@ class _ServiceRequestsPageState extends State await _serviceRequestsProvider.getRequests( user: _userProvider.user, host: _settingProvider.host, - hospitalId: _userProvider.user.hospital.id, + hospitalId: _userProvider.user.hospital?.id, ); }, child: Stack( diff --git a/lib/views/pages/user/visits/pantry/edit_pentry.dart b/lib/views/pages/user/visits/pantry/edit_pentry.dart index 7c9201b1..39971677 100644 --- a/lib/views/pages/user/visits/pantry/edit_pentry.dart +++ b/lib/views/pages/user/visits/pantry/edit_pentry.dart @@ -1,12 +1,15 @@ import 'package:flutter/material.dart'; import 'package:fluttertoast/fluttertoast.dart'; import 'package:provider/provider.dart'; -import 'package:test_sa/controllers/http_status_manger/http_status_manger.dart'; +import 'package:test_sa/controllers/api_routes/http_status_manger.dart'; import 'package:test_sa/controllers/localization/localization.dart'; import 'package:test_sa/controllers/providers/api/regular_visits_provider.dart'; import 'package:test_sa/controllers/providers/api/user_provider.dart'; import 'package:test_sa/controllers/providers/settings/setting_provider.dart'; +import 'package:test_sa/models/pantry/calibration_tools.dart'; import 'package:test_sa/models/pantry/pentry.dart'; +import 'package:test_sa/models/pantry/pm_kit.dart'; +import 'package:test_sa/models/pantry/ppm_check_list.dart'; import 'package:test_sa/models/subtitle.dart'; import 'package:test_sa/models/visits/visit.dart'; import 'package:test_sa/views/widgets/buttons/app_small_button.dart'; @@ -61,17 +64,20 @@ class _EditPentryState extends State with SingleTickerProviderStateM ); // Navigator.of(context).pop(); }else{ - String errorMessage = HttpStatusManger.getStatusMessage( - status: status, subtitle: _subtitle); - Fluttertoast.showToast( - msg: errorMessage, - ); + // String errorMessage = HttpStatusManger.getStatusMessage( + // status: status, subtitle: _subtitle); + // Fluttertoast.showToast( + // msg: errorMessage, + // ); } } @override void initState() { - _pentry = widget.pentry; + _pentry = widget.pentry.copyWith(); + if(_pentry.pmKits.isEmpty) _pentry.pmKits.add(PMKit()); + if(_pentry.calibrationTools.isEmpty) _pentry.calibrationTools.add(CalibrationTool()); + if(_pentry.ppmCheckLists.isEmpty) _pentry.ppmCheckLists.add(PPMCheckList()); _tabController = TabController(length: 4, vsync: this); super.initState(); } diff --git a/lib/views/pages/user/visits/preventive_maintenance_visits_page.dart b/lib/views/pages/user/visits/preventive_maintenance_visits_page.dart index 7c1c57c2..d61c9841 100644 --- a/lib/views/pages/user/visits/preventive_maintenance_visits_page.dart +++ b/lib/views/pages/user/visits/preventive_maintenance_visits_page.dart @@ -2,7 +2,7 @@ import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; import 'package:fluttertoast/fluttertoast.dart'; import 'package:provider/provider.dart'; -import 'package:test_sa/controllers/http_status_manger/http_status_manger.dart'; +import 'package:test_sa/controllers/api_routes/http_status_manger.dart'; import 'package:test_sa/controllers/localization/localization.dart'; import 'package:test_sa/controllers/providers/api/preventive_maintenance_visits_provider.dart'; import 'package:test_sa/controllers/providers/api/user_provider.dart'; @@ -109,7 +109,7 @@ class _PreventiveMaintenanceVisitsPageState extends State ), ), Visibility( - visible: _visitsProvider.visitsSearch.toSearchString().isNotEmpty, + visible: _visitsProvider.visitsSearch.toMap().isNotEmpty, child: Padding( padding: const EdgeInsets.all(8.0), child: AButton( @@ -156,7 +156,7 @@ class _RegularVisitsPageState extends State Navigator.of(context).pop(); if(status >= 200 && status < 300){ Fluttertoast.showToast( - msg: _subtitle.regularVisitsUpdatedSuccessfully, + msg: _subtitle.preventiveMaintenanceUpdatedSuccessfully, toastLength: Toast.LENGTH_LONG, gravity: ToastGravity.BOTTOM, ); diff --git a/lib/views/pages/user/visits/update_visits_group_sheet.dart b/lib/views/pages/user/visits/update_visits_group_sheet.dart index 724f4657..ae8d66cb 100644 --- a/lib/views/pages/user/visits/update_visits_group_sheet.dart +++ b/lib/views/pages/user/visits/update_visits_group_sheet.dart @@ -15,6 +15,7 @@ import 'package:test_sa/views/widgets/buttons/app_small_button.dart'; import 'package:test_sa/views/widgets/date_and_time/date_picker.dart'; import 'package:test_sa/views/widgets/images/one_image_picker.dart'; import 'package:test_sa/views/widgets/search/filter_item.dart'; +import 'package:test_sa/views/widgets/status/employee/engineers_mune.dart'; import 'package:test_sa/views/widgets/visits/visit_status.dart'; class UpdateVisitsGroupSheet extends StatefulWidget { final List visits; @@ -26,25 +27,25 @@ class UpdateVisitsGroupSheet extends StatefulWidget { } class _UpdateVisitsGroupSheetState extends State { - List status = [ - Lookup(label: "Done", id: 0,), - Lookup(label: "Not Yet", id: 1), - Lookup(label: "On Hold", id: 2,), - ]; - - List taskStatus = [ - Lookup(label: "Passed", id: 0,), - Lookup(label: "Failed", id: 1), - ]; + // List status = [ + // Lookup(name: "Done", id: 0,), + // Lookup(name: "Not Yet", id: 1), + // Lookup(name: "On Hold", id: 2,), + // ]; + // + // List taskStatus = [ + // Lookup(name: "Passed", id: 0,), + // Lookup(name: "Failed", id: 1), + // ]; VisitsGroup _group = VisitsGroup(); - File _image; + // File _image; Subtitle _subtitle; @override void initState() { super.initState(); _group.visits = widget.visits; - _group.date = DateTime.now(); + //_group.date = DateTime.now(); } @override @@ -78,123 +79,130 @@ class _UpdateVisitsGroupSheetState extends State { ), ], ), - - AOneImagePicker( - image: _image, - onPick: (image){ - _image =image; - _group.image = base64Encode(image.readAsBytesSync()); - }, - ), - SizedBox(height: 12 * AppStyle.getScaleFactor(context),), - ATextFormField( - initialValue: _group.jobSheetNumber, - hintText: _subtitle.jobSheetNumber, - style: Theme.of(context).textTheme.headline6, - onSaved: (value){ - _group.jobSheetNumber = value; - }, - ), - SizedBox(height: 8 * AppStyle.getScaleFactor(context),), - ATextFormField( - initialValue: _group.workingHours, - hintText: _subtitle.workingHours, - style: Theme.of(context).textTheme.headline6, - onSaved: (value){ - _group.workingHours = value; - }, - ), SizedBox(height: 8 * AppStyle.getScaleFactor(context),), - ATextFormField( - initialValue: _group.travelingHours, - hintText: _subtitle.travelingHours, - style: Theme.of(context).textTheme.headline6, - onSaved: (value){ - _group.travelingHours = value; + EngineersMenu( + initialValue: _group.engineer, + onSelect: (engineer){ + _group.engineer = engineer; }, ), SizedBox(height: 8 * AppStyle.getScaleFactor(context),), - Row( - children: [ - Expanded( - child: Text( - "${_subtitle.date} :", - style: Theme.of(context).textTheme.subtitle1, - textScaleFactor: AppStyle.getScaleFactor(context), - ), - ), - ADatePicker( - date: _group.date ?? DateTime.now(), - onDatePicker: (date){ - _group.date = date; - setState(() {}); - }, - ), - ], - ), - // SizedBox(height: 8 * AStyling.getScaleFactor(context),), - Text( - "${_subtitle.status} :", - style: Theme.of(context).textTheme.subtitle1, - textScaleFactor: AppStyle.getScaleFactor(context), - ), - SizedBox(height: 8 * AppStyle.getScaleFactor(context),), - Center( - child: Wrap( - spacing: 10, - runSpacing: 10, - children: List.generate( - status.length, - (index) { - bool isSelected = _group.status == status[index]; - return FilterItem( - isSelected: isSelected, - onSelected: (){ - if(isSelected) - _group.status = null; - else - _group.status = status[index]; - - setState(() {}); - }, - status: status[index], - ); - } - - ), - ), - ), - Text( - "${_subtitle.taskStatus} :", - style: Theme.of(context).textTheme.subtitle1, - textScaleFactor: AppStyle.getScaleFactor(context), - ), - SizedBox(height: 8 * AppStyle.getScaleFactor(context),), - Center( - child: Wrap( - spacing: 10, - runSpacing: 10, - children: List.generate( - taskStatus.length, - (index) { - bool isSelected = _group.taskStatus == taskStatus[index]; - return FilterItem( - isSelected: isSelected, - onSelected: (){ - if(isSelected) - _group.taskStatus = null; - else - _group.taskStatus = taskStatus[index]; - - setState(() {}); - }, - status: taskStatus[index], - ); - } - - ), - ), - ), + // AOneImagePicker( + // image: _image, + // onPick: (image){ + // _image =image; + // _group.image = base64Encode(image.readAsBytesSync()); + // }, + // ), + // SizedBox(height: 12 * AppStyle.getScaleFactor(context),), + // ATextFormField( + // initialValue: _group.jobSheetNumber, + // hintText: _subtitle.jobSheetNumber, + // style: Theme.of(context).textTheme.headline6, + // onSaved: (value){ + // _group.jobSheetNumber = value; + // }, + // ), + // SizedBox(height: 8 * AppStyle.getScaleFactor(context),), + // ATextFormField( + // initialValue: _group.workingHours, + // hintText: _subtitle.workingHours, + // style: Theme.of(context).textTheme.headline6, + // onSaved: (value){ + // _group.workingHours = value; + // }, + // ), + // SizedBox(height: 8 * AppStyle.getScaleFactor(context),), + // ATextFormField( + // initialValue: _group.travelingHours, + // hintText: _subtitle.travelingHours, + // style: Theme.of(context).textTheme.headline6, + // onSaved: (value){ + // _group.travelingHours = value; + // }, + // ), + // SizedBox(height: 8 * AppStyle.getScaleFactor(context),), + // Row( + // children: [ + // Expanded( + // child: Text( + // "${_subtitle.date} :", + // style: Theme.of(context).textTheme.subtitle1, + // textScaleFactor: AppStyle.getScaleFactor(context), + // ), + // ), + // ADatePicker( + // date: _group.date ?? DateTime.now(), + // onDatePicker: (date){ + // _group.date = date; + // setState(() {}); + // }, + // ), + // ], + // ), + // // SizedBox(height: 8 * AStyling.getScaleFactor(context),), + // Text( + // "${_subtitle.status} :", + // style: Theme.of(context).textTheme.subtitle1, + // textScaleFactor: AppStyle.getScaleFactor(context), + // ), + // SizedBox(height: 8 * AppStyle.getScaleFactor(context),), + // Center( + // child: Wrap( + // spacing: 10, + // runSpacing: 10, + // children: List.generate( + // status.length, + // (index) { + // bool isSelected = _group.status == status[index]; + // return FilterItem( + // isSelected: isSelected, + // onSelected: (){ + // if(isSelected) + // _group.status = null; + // else + // _group.status = status[index]; + // + // setState(() {}); + // }, + // status: status[index], + // ); + // } + // + // ), + // ), + // ), + // Text( + // "${_subtitle.taskStatus} :", + // style: Theme.of(context).textTheme.subtitle1, + // textScaleFactor: AppStyle.getScaleFactor(context), + // ), + // SizedBox(height: 8 * AppStyle.getScaleFactor(context),), + // Center( + // child: Wrap( + // spacing: 10, + // runSpacing: 10, + // children: List.generate( + // taskStatus.length, + // (index) { + // bool isSelected = _group.taskStatus == taskStatus[index]; + // return FilterItem( + // isSelected: isSelected, + // onSelected: (){ + // if(isSelected) + // _group.taskStatus = null; + // else + // _group.taskStatus = taskStatus[index]; + // + // setState(() {}); + // }, + // status: taskStatus[index], + // ); + // } + // + // ), + // ), + // ), SizedBox(height: 8 * AppStyle.getScaleFactor(context),), Expanded( child: ListView.builder( @@ -240,10 +248,7 @@ class _UpdateVisitsGroupSheetState extends State { ), ], ), - Align( - alignment: Alignment.topRight, - ), ], ), ); diff --git a/lib/views/pages/user/visits/visit_details.dart b/lib/views/pages/user/visits/visit_details.dart index f2b06be0..ca876b77 100644 --- a/lib/views/pages/user/visits/visit_details.dart +++ b/lib/views/pages/user/visits/visit_details.dart @@ -5,6 +5,7 @@ import 'package:test_sa/models/subtitle.dart'; import 'package:test_sa/models/visits/visit.dart'; import 'package:test_sa/views/app_style/colors.dart'; import 'package:test_sa/views/app_style/sizing.dart'; +import 'package:test_sa/views/pages/user/visits/pantry/edit_pentry.dart'; import 'package:test_sa/views/pages/user/visits/pantry/future_edit_pently.dart'; import 'package:test_sa/views/widgets/buttons/app_back_button.dart'; import 'package:test_sa/views/widgets/buttons/app_icon_button.dart'; @@ -52,7 +53,7 @@ class VisitDetailsPage extends StatelessWidget { backgroundColor: AColors.green, onPressed: () async { Navigator.of(context).push( - MaterialPageRoute(builder: (_)=> FutureEditPentry(visit: visit,)) + MaterialPageRoute(builder: (_)=> EditPentry(visit: visit,pentry: visit.pentry,)) ); }, ), diff --git a/lib/views/widgets/device_trancfer/device_transfer_info_section.dart b/lib/views/widgets/device_trancfer/device_transfer_info_section.dart index a042d72f..8360ba23 100644 --- a/lib/views/widgets/device_trancfer/device_transfer_info_section.dart +++ b/lib/views/widgets/device_trancfer/device_transfer_info_section.dart @@ -26,7 +26,7 @@ class DeviceTransferInfoSection extends StatelessWidget { ), RequestInfoRow( title: subtitle.engineerName, - info: info.name, + info: info.userName, ), RequestInfoRow( title: subtitle.workingHours, @@ -52,7 +52,7 @@ class DeviceTransferInfoSection extends StatelessWidget { RequestInfoRow( title: subtitle.status, infoWidget: StatusLabel( - label: info.status?.label, + label: info.status?.name, color: AColors.getGasStatusColor(info.status?.id) ), ), diff --git a/lib/views/widgets/device_trancfer/device_transfer_item.dart b/lib/views/widgets/device_trancfer/device_transfer_item.dart index 0cd2adbf..ea426523 100644 --- a/lib/views/widgets/device_trancfer/device_transfer_item.dart +++ b/lib/views/widgets/device_trancfer/device_transfer_item.dart @@ -79,7 +79,7 @@ class DeviceTransferItem extends StatelessWidget { ), StatusLabel( color: AColors.getRequestStatusColor(item.sender.status?.id), - label: item.sender.status?.label, + label: item.sender.status?.name, ) ], @@ -99,6 +99,7 @@ class DeviceTransferItem extends StatelessWidget { ], ), + if(item.sender.department.id != null) Text( item.sender.department.name, style: Theme.of(context).textTheme.bodySmall.copyWith( @@ -118,7 +119,7 @@ class DeviceTransferItem extends StatelessWidget { ), StatusLabel( color: AColors.getRequestStatusColor(item.receiver.status?.id), - label: item.receiver.status?.label, + label: item.receiver.status?.name, ) ], @@ -138,6 +139,7 @@ class DeviceTransferItem extends StatelessWidget { ], ), + if(item.receiver.department.id != null) Text( item.receiver.department.name, style: Theme.of(context).textTheme.bodySmall.copyWith( diff --git a/lib/views/widgets/equipment/auto_complete_devices_field.dart b/lib/views/widgets/equipment/auto_complete_devices_field.dart index ec91ae17..95952765 100644 --- a/lib/views/widgets/equipment/auto_complete_devices_field.dart +++ b/lib/views/widgets/equipment/auto_complete_devices_field.dart @@ -10,8 +10,8 @@ import 'package:flutter_typeahead/flutter_typeahead.dart'; import 'package:provider/provider.dart'; class AutoCompleteDeviceField extends StatefulWidget { final Device initialValue; - final String hospitalId; - final Function(String) onPick; + final int hospitalId; + final Function(int) onPick; const AutoCompleteDeviceField({Key key, this.initialValue, this.onPick, this.hospitalId}) : super(key: key); @@ -74,7 +74,7 @@ class _AutoCompleteDeviceFieldState extends State { return await _devicesProvider.getDevicesList( host: _settingProvider.host, user: _userProvider.user, - hospitalId: widget.hospitalId, + hospitalId: widget.hospitalId ?? _userProvider.user.hospital.id, serialNumber: value, ); }, diff --git a/lib/views/widgets/equipment/auto_complete_models_field.dart b/lib/views/widgets/equipment/auto_complete_models_field.dart new file mode 100644 index 00000000..1c40a544 --- /dev/null +++ b/lib/views/widgets/equipment/auto_complete_models_field.dart @@ -0,0 +1,92 @@ +import 'package:test_sa/controllers/providers/api/devices_provider.dart'; +import 'package:test_sa/controllers/providers/api/user_provider.dart'; +import 'package:test_sa/controllers/providers/settings/setting_provider.dart'; +import 'package:test_sa/models/device/device.dart'; +import 'package:test_sa/models/lookup.dart'; +import 'package:test_sa/views/app_style/colors.dart'; +import 'package:test_sa/views/app_style/sizing.dart'; +import 'package:test_sa/views/widgets/loaders/loading_manager.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter_typeahead/flutter_typeahead.dart'; +import 'package:provider/provider.dart'; +class AutoCompleteModelField extends StatefulWidget { + final Lookup initialValue; + final Function(Lookup) onPick; + + const AutoCompleteModelField({Key key, this.initialValue, this.onPick,}) : super(key: key); + + @override + _AutoCompleteModelFieldState createState() => _AutoCompleteModelFieldState(); +} + +class _AutoCompleteModelFieldState extends State { + + SettingProvider _settingProvider; + DevicesProvider _devicesProvider; + UserProvider _userProvider; + TextEditingController _controller; + + @override + void initState() { + _controller = TextEditingController(text: widget.initialValue?.name); + super.initState(); + } + + @override + void dispose() { + _controller.dispose(); + super.dispose(); + } + @override + Widget build(BuildContext context) { + _settingProvider = Provider.of(context); + _userProvider = Provider.of(context); + _devicesProvider = Provider.of(context); + //Subtitle _subtitle = AppLocalization.of(context).subtitle; + return Container( + padding: const EdgeInsets.symmetric( + horizontal: 16 + ), + decoration: BoxDecoration( + color: Colors.white, + border: Border.all(color:AColors.black), + borderRadius: BorderRadius.circular( + AppStyle.borderRadius * AppStyle.getScaleFactor(context) + ), + boxShadow: [ + AppStyle.boxShadow + ] + ), + child: TypeAheadField( + textFieldConfiguration: TextFieldConfiguration( + style: Theme.of(context).textTheme.headline6, + controller: _controller, + textAlign: TextAlign.center, + + decoration: const InputDecoration( + hintText: "Model", + border: InputBorder.none, + disabledBorder: InputBorder.none, + focusedBorder: InputBorder.none, + enabledBorder: InputBorder.none, + ), + textInputAction: TextInputAction.search, + ), + suggestionsCallback: (value) async { + return await _devicesProvider.getModels( + code: value, + ); + }, + itemBuilder: (context, lookup) { + return ListTile( + title: Text(lookup.name), + ); + }, + onSuggestionSelected: (lookup) { + _controller.text = lookup.name; + widget.onPick(lookup); + }, + ), + ); + } +} diff --git a/lib/views/widgets/equipment/single_device_picker.dart b/lib/views/widgets/equipment/single_device_picker.dart index aac06ff1..031ab2c1 100644 --- a/lib/views/widgets/equipment/single_device_picker.dart +++ b/lib/views/widgets/equipment/single_device_picker.dart @@ -28,6 +28,8 @@ class _SingleDevicePickerState extends State { bool _firstTime = true; Subtitle _subtitle; + TextEditingController numberController = TextEditingController(); + TextEditingController snController = TextEditingController(); _getDevice(String result) async { if(result == null) return; showDialog( @@ -58,6 +60,8 @@ class _SingleDevicePickerState extends State { @override void dispose() { + numberController.dispose(); + snController.dispose(); super.dispose(); } @@ -68,6 +72,7 @@ class _SingleDevicePickerState extends State { _settingProvider = Provider.of(context); if(_firstTime && _devicesProvider.devices != null){ + _searchableList.clear(); _searchableList.addAll(_devicesProvider.devices); _firstTime = false; } @@ -83,7 +88,7 @@ class _SingleDevicePickerState extends State { await _devicesProvider.getEquipment( user: _userProvider.user, host: _settingProvider.host, - hospitalId: _userProvider.user.hospital.id + hospitalId: _userProvider.user.hospital?.id ); }, child: Column( @@ -95,31 +100,41 @@ class _SingleDevicePickerState extends State { children: [ ATextFormField( hintText: _subtitle.searchBySn, + controller: snController, style: Theme.of(context).textTheme.subtitle1, suffixIcon: const Icon(Icons.search_rounded), - onChange: (value){ + textInputAction: TextInputAction.search, + onAction: () async { + _devicesProvider.reset(); + await _devicesProvider.getEquipment( + user: _userProvider.user, + host: _settingProvider.host, + hospitalId: _userProvider.user.hospital?.id, + serialNumber: snController.text, + number: numberController.text + ); _searchableList.clear(); - _searchableList.addAll(_devicesProvider.devices.where( - (element) => element.serialNumber.toLowerCase().contains( - value.toLowerCase() - ) - ).toList()); - setState(() {}); + _searchableList.addAll(_devicesProvider.devices); }, ), const SizedBox(height: 8,), ATextFormField( hintText: "Search by Number", + controller: numberController, style: Theme.of(context).textTheme.subtitle1, suffixIcon: const Icon(Icons.search_rounded), - onChange: (value){ + textInputAction: TextInputAction.search, + onAction: () async { + _devicesProvider.reset(); + await _devicesProvider.getEquipment( + user: _userProvider.user, + host: _settingProvider.host, + hospitalId: _userProvider.user.hospital?.id, + serialNumber: snController.text, + number: numberController.text + ); _searchableList.clear(); - _searchableList.addAll(_devicesProvider.devices.where( - (element) => element.number.toLowerCase().contains( - value.toLowerCase() - ) - ).toList()); - setState(() {}); + _searchableList.addAll(_devicesProvider.devices); }, ), ], @@ -145,16 +160,16 @@ class _SingleDevicePickerState extends State { ], ), ), - floatingActionButton: FloatingActionButton( - heroTag: "some tag 2", - child: const Icon(Icons.qr_code_scanner), - onPressed: () async { - String result = await Navigator.of(context).push( - MaterialPageRoute(builder: (_)=> const ScanQr()), - ) as String; - _getDevice(result); - }, - ), + // floatingActionButton: FloatingActionButton( + // heroTag: "some tag 2", + // child: const Icon(Icons.qr_code_scanner), + // onPressed: () async { + // String result = await Navigator.of(context).push( + // MaterialPageRoute(builder: (_)=> const ScanQr()), + // ) as String; + // _getDevice(result); + // }, + // ), ); } } diff --git a/lib/views/widgets/gas_refill/gas_refill_create_details_item.dart b/lib/views/widgets/gas_refill/gas_refill_create_details_item.dart index d246d05d..375a1b1c 100644 --- a/lib/views/widgets/gas_refill/gas_refill_create_details_item.dart +++ b/lib/views/widgets/gas_refill/gas_refill_create_details_item.dart @@ -15,7 +15,7 @@ class GasRefillCreateDetailsItem extends StatelessWidget { children: [ Row( children: [ - Expanded(child: Text(model.type.label)), + Expanded(child: Text(model.type.name)), IconButton( onPressed: onDelete, color: AColors.red, @@ -23,9 +23,12 @@ class GasRefillCreateDetailsItem extends StatelessWidget { ) ], ), - Row( + Wrap( + spacing: 10, children: [ - Text(model.requestedQuantity.toStringAsFixed(0)), + Text("Quantity: ${model.requestedQuantity.toStringAsFixed(0)}"), + Text("Cylinder Size: ${model.cylinderSize.name}"), + Text("Cylinder Type: ${model.cylinderType.name}"), ], ), if(model.deliveredQuantity != null) diff --git a/lib/views/widgets/gas_refill/gas_refill_item.dart b/lib/views/widgets/gas_refill/gas_refill_item.dart index e9bf3d02..e6ab7477 100644 --- a/lib/views/widgets/gas_refill/gas_refill_item.dart +++ b/lib/views/widgets/gas_refill/gas_refill_item.dart @@ -75,6 +75,7 @@ class GasRefillItem extends StatelessWidget { ), ), ), + if(item.clientName != null) Text( item.clientName, style: Theme.of(context).textTheme.subtitle2.copyWith( @@ -95,7 +96,8 @@ class GasRefillItem extends StatelessWidget { ), ), ), - StatusLabel(label: item.status.label, + if(item.status?.id != null) + StatusLabel(label: item.status.name, color: AColors.getGasStatusColor(item.status.id) ), ], diff --git a/lib/views/widgets/gas_refill/gas_refill_update_details_item.dart b/lib/views/widgets/gas_refill/gas_refill_update_details_item.dart index 2a94a9ba..dc41e11d 100644 --- a/lib/views/widgets/gas_refill/gas_refill_update_details_item.dart +++ b/lib/views/widgets/gas_refill/gas_refill_update_details_item.dart @@ -22,10 +22,10 @@ class GasRefillUpdateDetailsItem extends StatelessWidget { return Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ - ATitle(details.type.label), + ATitle(details.type.name), RequestInfoRow( title: "Cylinder Size", - info: details.cylinderSize.label, + info: details.cylinderSize.name, ), RequestInfoRow( title: "Requested Quantity", @@ -48,14 +48,14 @@ class GasRefillUpdateDetailsItem extends StatelessWidget { ? null : "allow numbers only", textInputType: TextInputType.number, onSaved: (value){ - details.deliveredQuantity = int.tryParse(value); + details.deliveredQuantity = double.tryParse(value); }, ), ], ): RequestInfoRow( title: "Delivered Quantity", - info: details.deliveredQuantity.toStringAsFixed(0), + info: details.deliveredQuantity?.toStringAsFixed(0), ), //SizedBox(height: 16,) ], diff --git a/lib/views/widgets/hospitals/hospital_auto_complete_field.dart b/lib/views/widgets/hospitals/hospital_auto_complete_field.dart index ba860745..68444be0 100644 --- a/lib/views/widgets/hospitals/hospital_auto_complete_field.dart +++ b/lib/views/widgets/hospitals/hospital_auto_complete_field.dart @@ -11,10 +11,10 @@ import 'package:flutter_typeahead/flutter_typeahead.dart'; import 'package:provider/provider.dart'; class HospitalAutoCompleteField extends StatefulWidget { final String initialValue; - final Function(String) onSearch; - final Function(String) onSave; + final Function(Hospital) onSearch; + //final Function(Hospital) onSave; - const HospitalAutoCompleteField({Key key, this.onSearch, this.initialValue, this.onSave}) : super(key: key); + const HospitalAutoCompleteField({Key key, this.onSearch, this.initialValue, }) : super(key: key); @override _HospitalAutoCompleteFieldState createState() => _HospitalAutoCompleteFieldState(); @@ -58,7 +58,6 @@ class _HospitalAutoCompleteFieldState extends State { child: TypeAheadField( textFieldConfiguration: TextFieldConfiguration( style: Theme.of(context).textTheme.headline6, - onSubmitted: widget.onSave, controller: _controller, textAlign: TextAlign.center, decoration: InputDecoration( @@ -69,9 +68,6 @@ class _HospitalAutoCompleteFieldState extends State { enabledBorder: InputBorder.none, ), textInputAction: TextInputAction.search, - onEditingComplete:(){ - widget.onSearch(_controller.text); - } ), suggestionsCallback: (vale) async { return await HospitalsProvider().getHospitalsList( @@ -80,12 +76,12 @@ class _HospitalAutoCompleteFieldState extends State { ); }, itemBuilder: (context, hospital) { - return HospitalItem( - hospital: hospital, + return ListTile( + title: Text(hospital.name), ); }, onSuggestionSelected: (hospital) { - widget.onSearch(hospital.name); + widget.onSearch(hospital); }, ), ); diff --git a/lib/views/widgets/loaders/loading_manager.dart b/lib/views/widgets/loaders/loading_manager.dart index 8ed322e0..b0002ae1 100644 --- a/lib/views/widgets/loaders/loading_manager.dart +++ b/lib/views/widgets/loaders/loading_manager.dart @@ -1,5 +1,5 @@ import 'package:flutter/material.dart'; -import 'package:test_sa/controllers/http_status_manger/http_status_manger.dart'; +import 'package:test_sa/controllers/api_routes/http_status_manger.dart'; import 'package:test_sa/controllers/localization/localization.dart'; import 'package:test_sa/models/subtitle.dart'; diff --git a/lib/views/widgets/pentry/auto_complete_fields/auto_complete_devices_field.dart b/lib/views/widgets/pentry/auto_complete_fields/auto_complete_devices_field.dart index ea2228cd..e516bb3c 100644 --- a/lib/views/widgets/pentry/auto_complete_fields/auto_complete_devices_field.dart +++ b/lib/views/widgets/pentry/auto_complete_fields/auto_complete_devices_field.dart @@ -10,7 +10,7 @@ import 'package:test_sa/views/app_style/colors.dart'; import 'package:test_sa/views/app_style/sizing.dart'; class AutoCompleteDeviceNumberField extends StatefulWidget { final Lookup initialValue; - final String hospitalId; + final int hospitalId; final Function(Lookup) onPick; const AutoCompleteDeviceNumberField({Key key, this.initialValue, this.onPick, this.hospitalId}) : super(key: key); @@ -28,7 +28,7 @@ class _AutoCompleteDeviceNumberFieldState extends State { const SizedBox(height: 4,), AutoCompleteDeviceNumberField( initialValue: model.assetsNumber, - hospitalId: userProvider.user.hospital.id, + hospitalId: userProvider.user.hospital?.id, onPick: (number){ model.assetsNumber = number; }, diff --git a/lib/views/widgets/pentry/pentry_info_form.dart b/lib/views/widgets/pentry/pentry_info_form.dart index 1fadc1c9..da9434e5 100644 --- a/lib/views/widgets/pentry/pentry_info_form.dart +++ b/lib/views/widgets/pentry/pentry_info_form.dart @@ -1,4 +1,7 @@ +import 'dart:convert'; + import 'package:flutter/material.dart'; +import 'package:flutter/services.dart'; import 'package:provider/provider.dart'; import 'package:test_sa/controllers/localization/localization.dart'; import 'package:test_sa/controllers/providers/api/user_provider.dart'; @@ -6,6 +9,7 @@ import 'package:test_sa/models/pantry/pentry.dart'; import 'package:test_sa/views/app_style/sizing.dart'; import 'package:test_sa/views/widgets/app_text_form_field.dart'; import 'package:test_sa/views/widgets/date_and_time/date_picker.dart'; +import 'package:test_sa/views/widgets/e_signature/e_signature.dart'; import 'package:test_sa/views/widgets/images/mini_one_image_picker.dart'; import 'package:test_sa/views/widgets/status/pentry/pentry_status_mune.dart'; import 'package:test_sa/views/widgets/status/pentry/pentry_visit_status_mune.dart'; @@ -23,7 +27,6 @@ class PentryInfoForm extends StatefulWidget { } class _PentryInfoFormState extends State { - @override Widget build(BuildContext context) { final subtitle = AppLocalization.of(context).subtitle; @@ -87,6 +90,20 @@ class _PentryInfoFormState extends State { }, ), const SizedBox(height: 8,), + const ASubTitle("Expected Visit Date"), + if(widget.enableValidate && widget.model.expectedVisitDate == null) + ASubTitle(subtitle.requiredWord,color: Colors.red,), + const SizedBox(height: 4,), + ADatePicker( + date: widget.model.expectedVisitDate, + from: DateTime.now().subtract(const Duration(days: 30)), + onDatePicker: (date){ + if(date == null) return; + widget.model.expectedVisitDate = date; + setState(() {}); + }, + ), + const SizedBox(height: 8,), const ASubTitle("Traveling Hours"), const SizedBox(height: 4,), ATextFormField( @@ -108,6 +125,20 @@ class _PentryInfoFormState extends State { }, ), const SizedBox(height: 8,), + const ASubTitle("Signature"), + ESignature( + oldSignature: widget.model.signature, + newSignature: widget.model.localSignature, + onSaved: (signature){ + widget.model.localSignature = signature; + if(signature == null || signature.isEmpty) { + widget.model.signature = null; + return; + } + widget.model.signature = "${DateTime.now().toIso8601String()}.png|${base64Encode(signature)}"; + }, + ), + const SizedBox(height: 8,), ], ); } diff --git a/lib/views/widgets/pentry/pentry_pm_kit_form.dart b/lib/views/widgets/pentry/pentry_pm_kit_form.dart index 6fdd3b43..e0345597 100644 --- a/lib/views/widgets/pentry/pentry_pm_kit_form.dart +++ b/lib/views/widgets/pentry/pentry_pm_kit_form.dart @@ -67,84 +67,84 @@ class _PentryPMKitFormState extends State { const SizedBox(height: 4,), AutoCompletePartsField( clearAfterPick: false, - initialValue: (model.itemCode?.label ?? "").toString(), + initialValue: (model.itemCode?.name ?? "").toString(), onPick: (part){ - model.itemCode = Lookup(id: int.tryParse(part.id),label: part.code); - }, - ), - const SizedBox(height: 8,), - const ASubTitle("Item Name"), - const SizedBox(height: 4,), - ATextFormField( - initialValue: (model.itemName ?? "").toString(), - textAlign: TextAlign.center, - style: Theme.of(context).textTheme.subtitle1, - textInputType: TextInputType.text, - onChange: (value){ - model.itemName = value; - }, - ), - const SizedBox(height: 8,), - const ASubTitle("Preparation Time Frame"), - const SizedBox(height: 4,), - ATextFormField( - initialValue: (model.preparationTimeFrame ?? "").toString(), - textAlign: TextAlign.center, - style: Theme.of(context).textTheme.subtitle1, - textInputType: TextInputType.text, - onChange: (value){ - model.preparationTimeFrame = value; - }, - ), - const SizedBox(height: 8,), - const ASubTitle("kit Frequency Demand"), - const SizedBox(height: 4,), - ATextFormField( - initialValue: (model.kitFrequencyDemand ?? "").toString(), - textAlign: TextAlign.center, - style: Theme.of(context).textTheme.subtitle1, - textInputType: TextInputType.text, - onChange: (value){ - model.kitFrequencyDemand = value; - }, - ), - const SizedBox(height: 8,), - const ASubTitle("Availability"), - const SizedBox(height: 4,), - ATextFormField( - initialValue: (model.availability ?? "").toString(), - textAlign: TextAlign.center, - style: Theme.of(context).textTheme.subtitle1, - textInputType: TextInputType.text, - onChange: (value){ - model.availability = value; - }, - ), - const SizedBox(height: 8,), - const ASubTitle("Quantity Needed"), - const SizedBox(height: 4,), - ATextFormField( - initialValue: (model.quantityNeeded ?? "").toString(), - textAlign: TextAlign.center, - style: Theme.of(context).textTheme.subtitle1, - textInputType: TextInputType.number, - onChange: (value){ - model.quantityNeeded = value; - }, - ), - const SizedBox(height: 8,), - const ASubTitle("Quantity Reserved"), - const SizedBox(height: 4,), - ATextFormField( - initialValue: (model.quantityReserved ?? "").toString(), - textAlign: TextAlign.center, - style: Theme.of(context).textTheme.subtitle1, - textInputType: TextInputType.number, - onChange: (value){ - model.quantityReserved = value; + model.itemCode = Lookup(id: part.id,name: part.code); }, ), const SizedBox(height: 8,), + // const ASubTitle("Item Name"), + // const SizedBox(height: 4,), + // ATextFormField( + // initialValue: (model.itemName ?? "").toString(), + // textAlign: TextAlign.center, + // style: Theme.of(context).textTheme.subtitle1, + // textInputType: TextInputType.text, + // onChange: (value){ + // model.itemName = value; + // }, + // ), + // const SizedBox(height: 8,), + // const ASubTitle("Preparation Time Frame"), + // const SizedBox(height: 4,), + // ATextFormField( + // initialValue: (model.preparationTimeFrame ?? "").toString(), + // textAlign: TextAlign.center, + // style: Theme.of(context).textTheme.subtitle1, + // textInputType: TextInputType.text, + // onChange: (value){ + // model.preparationTimeFrame = value; + // }, + // ), + // const SizedBox(height: 8,), + // const ASubTitle("kit Frequency Demand"), + // const SizedBox(height: 4,), + // ATextFormField( + // initialValue: (model.kitFrequencyDemand ?? "").toString(), + // textAlign: TextAlign.center, + // style: Theme.of(context).textTheme.subtitle1, + // textInputType: TextInputType.text, + // onChange: (value){ + // model.kitFrequencyDemand = value; + // }, + // ), + // const SizedBox(height: 8,), + // const ASubTitle("Availability"), + // const SizedBox(height: 4,), + // ATextFormField( + // initialValue: (model.availability ?? "").toString(), + // textAlign: TextAlign.center, + // style: Theme.of(context).textTheme.subtitle1, + // textInputType: TextInputType.text, + // onChange: (value){ + // model.availability = value; + // }, + // ), + // const SizedBox(height: 8,), + // const ASubTitle("Quantity Needed"), + // const SizedBox(height: 4,), + // ATextFormField( + // initialValue: (model.quantityNeeded ?? "").toString(), + // textAlign: TextAlign.center, + // style: Theme.of(context).textTheme.subtitle1, + // textInputType: TextInputType.number, + // onChange: (value){ + // model.quantityNeeded = value; + // }, + // ), + // const SizedBox(height: 8,), + // const ASubTitle("Quantity Reserved"), + // const SizedBox(height: 4,), + // ATextFormField( + // initialValue: (model.quantityReserved ?? "").toString(), + // textAlign: TextAlign.center, + // style: Theme.of(context).textTheme.subtitle1, + // textInputType: TextInputType.number, + // onChange: (value){ + // model.quantityReserved = value; + // }, + // ), + // const SizedBox(height: 8,), Divider(color: Theme.of(context).textTheme.titleMedium.color,), ], ); diff --git a/lib/views/widgets/requests/service_request_item.dart b/lib/views/widgets/requests/service_request_item.dart index 0c63f2ff..e46eed9d 100644 --- a/lib/views/widgets/requests/service_request_item.dart +++ b/lib/views/widgets/requests/service_request_item.dart @@ -59,7 +59,7 @@ class ServiceRequestItem extends StatelessWidget { child: Column( mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ - request.devicePhotos.isEmpty ? SizedBox.shrink(): + request.devicePhotos?.isEmpty != false ? SizedBox.shrink(): Column( children: [ SizedBox( diff --git a/lib/views/widgets/requests/service_request_update_dialog.dart b/lib/views/widgets/requests/service_request_update_dialog.dart index 71dd67cc..57237c10 100644 --- a/lib/views/widgets/requests/service_request_update_dialog.dart +++ b/lib/views/widgets/requests/service_request_update_dialog.dart @@ -2,7 +2,7 @@ import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; import 'package:fluttertoast/fluttertoast.dart'; import 'package:provider/provider.dart'; -import 'package:test_sa/controllers/http_status_manger/http_status_manger.dart'; +import 'package:test_sa/controllers/api_routes/http_status_manger.dart'; import 'package:test_sa/controllers/localization/localization.dart'; import 'package:test_sa/controllers/providers/api/service_requests_provider.dart'; import 'package:test_sa/controllers/providers/api/user_provider.dart'; @@ -13,7 +13,7 @@ import 'package:test_sa/models/subtitle.dart'; import 'package:test_sa/views/app_style/sizing.dart'; import 'package:test_sa/views/widgets/buttons/app_small_button.dart'; import 'package:test_sa/views/widgets/date_and_time/date_picker.dart'; -import 'package:test_sa/views/widgets/status/employee/employee_mune.dart'; +import 'package:test_sa/views/widgets/status/employee/assigned_to_mune.dart'; class ServiceRequestsUpdateDialog extends StatefulWidget { final ServiceRequest request; @@ -126,7 +126,7 @@ class _ServiceRequestsUpdateDialogState extends State 0.5 ? AColors.black : Colors.white, diff --git a/lib/views/widgets/search/service_request_search_bar.dart b/lib/views/widgets/search/service_request_search_bar.dart index a1f78945..5bb981bd 100644 --- a/lib/views/widgets/search/service_request_search_bar.dart +++ b/lib/views/widgets/search/service_request_search_bar.dart @@ -1,3 +1,4 @@ +import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; import 'package:test_sa/controllers/localization/localization.dart'; import 'package:test_sa/models/lookup.dart'; @@ -7,6 +8,9 @@ import 'package:test_sa/views/app_style/sizing.dart'; import 'package:test_sa/views/widgets/buttons/app_button.dart'; import 'package:test_sa/views/widgets/buttons/app_small_button.dart'; import 'package:test_sa/views/widgets/hospitals/hospital_auto_complete_field.dart'; +import 'package:test_sa/views/widgets/status/service_request/service_request_status_mune.dart'; +import 'package:test_sa/views/widgets/status/service_request/service_request_types_mune.dart'; +import 'package:test_sa/views/widgets/titles/app_sub_title.dart'; import '../app_text_form_field.dart'; import 'filter_item.dart'; @@ -29,12 +33,12 @@ class _ServiceRequestsSearchDialogState extends State status = [ - Lookup(label: "New", id: 4,), + Lookup(name: "New", id: 4,), - Lookup(label: "Repaired", id: 6,), - Lookup(label: "Repeated", id: 8), - Lookup(label: "Closed", id: 9,), - Lookup(label: "Under Repair", id: 5,), + Lookup(name: "Repaired", id: 6,), + Lookup(name: "Repeated", id: 8), + Lookup(name: "Closed", id: 9,), + Lookup(name: "Under Repair", id: 5,), ]; final GlobalKey _formKey = GlobalKey(); @@ -55,6 +59,7 @@ class _ServiceRequestsSearchDialogState extends State with TickerProviderStateMixin{ VisitsSearch _search; List status = [ - Lookup(label: "Done", id: 0,), - Lookup(label: "Not Yet", id: 1), - Lookup(label: "On Hold", id: 2,), + Lookup(name: "Done", id: 0,), + Lookup(name: "Not Yet", id: 1), + Lookup(name: "On Hold", id: 2,), ]; List contactStatus = [ - Lookup(label: "Hospital Employee", key: "H",), - Lookup(label: "Under Warranty", key: "CW"), - Lookup(label: "Under Maintenance Contract", key: "CC",), + // Lookup(name: "Hospital Employee", value: "H",), + // Lookup(name: "Under Warranty", value: "CW"), + // Lookup(name: "Under Maintenance Contract", value: "CC",), ]; @@ -61,6 +64,8 @@ class _VisitsSearchDialogState extends State child: Form( key: _formKey, child: ListView( + // shrinkWrap: true, + // physics: const ClampingScrollPhysics(), padding: const EdgeInsets.symmetric(vertical: 8,horizontal: 16), children: [ Row( @@ -76,8 +81,9 @@ class _VisitsSearchDialogState extends State ASmallButton( text: _subtitle.search, onPressed: (){ - if(!_formKey.currentState.validate()) + if(!_formKey.currentState.validate()) { return; + } _formKey.currentState.save(); Navigator.of(context).pop(_search); }, @@ -90,8 +96,9 @@ class _VisitsSearchDialogState extends State style: Theme.of(context).textTheme.headline6, textInputAction: TextInputAction.search, onAction: (){ - if(!_formKey.currentState.validate()) + if(!_formKey.currentState.validate()) { return; + } _formKey.currentState.save(); Navigator.of(context).pop(_search); }, @@ -101,99 +108,122 @@ class _VisitsSearchDialogState extends State ), SizedBox(height: 8.0 * AppStyle.getScaleFactor(context),), HospitalAutoCompleteField( - initialValue: _search.hospitalName, - onSave: (value){ - _search.hospitalName = value; - }, + initialValue: _search.hospital?.name, + // onSave: (value){ + // _search.hospital = value; + // }, onSearch: (value){ - _search.hospitalName = value; + _search.hospital = value; Navigator.of(context).pop(_search); }, ), + // SizedBox(height: 8.0 * AppStyle.getScaleFactor(context),), + // ATextFormField( + // initialValue: _search.brand, + // hintText: _subtitle.brand, + // style: Theme.of(context).textTheme.headline6, + // textInputAction: TextInputAction.search, + // onAction: (){ + // if(!_formKey.currentState.validate()) { + // return; + // } + // _formKey.currentState.save(); + // Navigator.of(context).pop(_search); + // }, + // onSaved: (value){ + // _search.brand = value; + // }, + // ), SizedBox(height: 8.0 * AppStyle.getScaleFactor(context),), - ATextFormField( - initialValue: _search.brand, - hintText: _subtitle.brand, - style: Theme.of(context).textTheme.headline6, - textInputAction: TextInputAction.search, - onAction: (){ - if(!_formKey.currentState.validate()) - return; - _formKey.currentState.save(); - Navigator.of(context).pop(_search); - }, - onSaved: (value){ - _search.brand = value; - }, - ), - SizedBox(height: 8.0 * AppStyle.getScaleFactor(context),), - ATextFormField( + AutoCompleteModelField( initialValue: _search.model, - hintText: _subtitle.model, - style: Theme.of(context).textTheme.headline6, - textInputAction: TextInputAction.search, - onAction: (){ - if(!_formKey.currentState.validate()) - return; - _formKey.currentState.save(); + onPick: (lookup){ + _search.model = lookup; Navigator.of(context).pop(_search); }, - onSaved: (value){ - _search.model = value; - }, ), + // ATextFormField( + // initialValue: _search.model, + // hintText: _subtitle.model, + // style: Theme.of(context).textTheme.headline6, + // textInputAction: TextInputAction.search, + // onAction: (){ + // if(!_formKey.currentState.validate()) { + // return; + // } + // _formKey.currentState.save(); + // Navigator.of(context).pop(_search); + // }, + // onSaved: (value){ + // _search.model = value; + // }, + // ), SizedBox(height: 8.0 * AppStyle.getScaleFactor(context),), ASubTitle(_subtitle.status), SizedBox(height: 4.0 * AppStyle.getScaleFactor(context),), - Wrap( - spacing: 10, - runSpacing: 10, - children: List.generate( - status.length, - (index) { - bool isSelected = _search.statusValue == status[index].id; - return FilterItem( - isSelected: isSelected, - onSelected: (){ - if(isSelected) - _search.statusValue = null; - else - _search.statusValue = status[index].id; - - setState(() {}); - }, - status: status[index], - ); - } - - ), + PentryVisitsStatusMenu( + initialValue: _search.statusValue, + onSelect: (status){ + _search.statusValue = status; + }, ), + // Wrap( + // spacing: 10, + // runSpacing: 10, + // children: List.generate( + // status.length, + // (index) { + // bool isSelected = _search.statusValue == status[index].id; + // return FilterItem( + // isSelected: isSelected, + // onSelected: (){ + // if(isSelected) { + // _search.statusValue = null; + // } else { + // _search.statusValue = status[index].id; + // } + // + // setState(() {}); + // }, + // status: status[index], + // ); + // } + // + // ), + // ), SizedBox(height: 8.0 * AppStyle.getScaleFactor(context),), ASubTitle(_subtitle.contactStatus), SizedBox(height: 4.0 * AppStyle.getScaleFactor(context),), - Wrap( - spacing: 10, - runSpacing: 10, - children: List.generate( - contactStatus.length, - (index) { - bool isSelected = _search.contactStatus == contactStatus[index].key; - return FilterItem( - isSelected: isSelected, - onSelected: (){ - if(isSelected) - _search.contactStatus = null; - else - _search.contactStatus = contactStatus[index].key; - - setState(() {}); - }, - status: contactStatus[index], - ); - } - - ), + AssignedToMenu( + initialValue: _search.contactStatus, + onSelect: (status){ + _search.contactStatus = status; + }, ), + // Wrap( + // spacing: 10, + // runSpacing: 10, + // children: List.generate( + // contactStatus.length, + // (index) { + // bool isSelected = _search.contactStatus == contactStatus[index]; + // return FilterItem( + // isSelected: isSelected, + // onSelected: (){ + // if(isSelected) { + // _search.contactStatus = null; + // } else { + // _search.contactStatus = contactStatus[index]; + // } + // + // setState(() {}); + // }, + // status: contactStatus[index], + // ); + // } + // + // ), + // ), SizedBox(height: 8.0 * AppStyle.getScaleFactor(context),), ASubTitle(_subtitle.actualDate), SizedBox(height: 4.0 * AppStyle.getScaleFactor(context),), @@ -221,7 +251,7 @@ class _VisitsSearchDialogState extends State }, ), Visibility( - visible: _search.toSearchString().isNotEmpty, + visible: _search.toMap().isNotEmpty, child: Padding( padding: const EdgeInsets.symmetric(vertical: 8,horizontal: 16), child: AButton( diff --git a/lib/views/widgets/status/employee/employee_mune.dart b/lib/views/widgets/status/employee/assigned_to_mune.dart similarity index 83% rename from lib/views/widgets/status/employee/employee_mune.dart rename to lib/views/widgets/status/employee/assigned_to_mune.dart index 5ea741d4..8e4addf6 100644 --- a/lib/views/widgets/status/employee/employee_mune.dart +++ b/lib/views/widgets/status/employee/assigned_to_mune.dart @@ -1,21 +1,21 @@ import 'package:flutter/material.dart'; import 'package:provider/provider.dart'; -import 'package:test_sa/controllers/providers/api/status_drop_down/employee/employee_provider.dart'; +import 'package:test_sa/controllers/providers/api/status_drop_down/employee/assigned_to_provider.dart'; import 'package:test_sa/controllers/providers/api/user_provider.dart'; import 'package:test_sa/controllers/providers/settings/setting_provider.dart'; import 'package:test_sa/models/lookup.dart'; import 'package:test_sa/views/widgets/loaders/loading_manager.dart'; import 'package:test_sa/views/widgets/status/single_status_menu.dart'; -class EmployeeMenu extends StatelessWidget { +class AssignedToMenu extends StatelessWidget { final Function(Lookup) onSelect; final Lookup initialValue; - const EmployeeMenu({Key key, this.onSelect, this.initialValue}) : super(key: key); + const AssignedToMenu({Key key, this.onSelect, this.initialValue}) : super(key: key); @override Widget build(BuildContext context) { final settingProvider = Provider.of(context); final userProvider = Provider.of(context); - final menuProvider = Provider.of(context); + final menuProvider = Provider.of(context); return LoadingManager( isLoading: menuProvider.isLoading, isFailedLoading: menuProvider.items == null, diff --git a/lib/views/widgets/status/employee/engineers_mune.dart b/lib/views/widgets/status/employee/engineers_mune.dart new file mode 100644 index 00000000..93b1597d --- /dev/null +++ b/lib/views/widgets/status/employee/engineers_mune.dart @@ -0,0 +1,37 @@ +import 'package:flutter/material.dart'; +import 'package:provider/provider.dart'; +import 'package:test_sa/controllers/providers/api/status_drop_down/employee/engineers_provider.dart'; +import 'package:test_sa/controllers/providers/api/user_provider.dart'; +import 'package:test_sa/controllers/providers/settings/setting_provider.dart'; +import 'package:test_sa/models/engineer.dart'; +import 'package:test_sa/views/widgets/loaders/loading_manager.dart'; +import 'package:test_sa/views/widgets/status/employee/single_type_menu.dart'; +class EngineersMenu extends StatelessWidget { + final Function(Engineer) onSelect; + final Engineer initialValue; + + const EngineersMenu({Key key, this.onSelect, this.initialValue}) : super(key: key); + @override + Widget build(BuildContext context) { + final settingProvider = Provider.of(context); + final userProvider = Provider.of(context); + final menuProvider = Provider.of(context); + return LoadingManager( + isLoading: menuProvider.isLoading, + isFailedLoading: menuProvider.items == null, + stateCode: menuProvider.stateCode, + onRefresh: () async { + menuProvider.reset(); + await menuProvider.getData( + user: userProvider.user, + host: settingProvider.host + ); + }, + child: SingleEngineerMenu( + initialStatus: initialValue, + engineers: menuProvider.items, + onSelect: onSelect, + ) + ); + } +} diff --git a/lib/views/widgets/status/employee/single_type_menu.dart b/lib/views/widgets/status/employee/single_type_menu.dart new file mode 100644 index 00000000..4ee21b7d --- /dev/null +++ b/lib/views/widgets/status/employee/single_type_menu.dart @@ -0,0 +1,99 @@ +import 'package:flutter/material.dart'; +import 'package:test_sa/models/engineer.dart'; +import 'package:test_sa/models/lookup.dart'; +import 'package:test_sa/views/app_style/colors.dart'; +import 'package:test_sa/views/app_style/sizing.dart'; +class SingleEngineerMenu extends StatefulWidget { + final List engineers; + final Engineer initialStatus; + final Function(Engineer) onSelect; + + const SingleEngineerMenu({Key key, this.engineers, this.onSelect, this.initialStatus}) : super(key: key); + @override + _SingleEngineerMenuState createState() => _SingleEngineerMenuState(); +} + +class _SingleEngineerMenuState extends State { + + Engineer _selectedStatus; + + @override + void didUpdateWidget(covariant SingleEngineerMenu oldWidget) { + if(widget.initialStatus != null && widget.initialStatus.id != null){ + _selectedStatus = widget.engineers?.firstWhere( + (element) { + return element == widget.initialStatus; + }); + widget.onSelect(_selectedStatus); + } else { + _selectedStatus = null; + } + super.didUpdateWidget(oldWidget); + } + + @override + void initState() { + if(widget.initialStatus != null && widget.initialStatus.id != null){ + _selectedStatus = widget.engineers?.firstWhere( + (element) { + return element == widget.initialStatus; + }); + widget.onSelect(_selectedStatus); + } + + super.initState(); + } + @override + Widget build(BuildContext context) { + return Container( + padding: const EdgeInsets.symmetric( + horizontal: 16 + ), + decoration: BoxDecoration( + color: Colors.white, + border: Border.all(color:AColors.black), + borderRadius: BorderRadius.circular( + AppStyle.borderRadius * AppStyle.getScaleFactor(context) + ), + boxShadow: const [ + AppStyle.boxShadow + ] + ), + child: DropdownButton( + value: _selectedStatus, + iconSize: 24, + elevation: 16, + isExpanded: true, + hint: Text( + "Select", + style: Theme.of(context).textTheme.subtitle1, + ), + style: TextStyle( + color: Theme.of(context).primaryColor + ), + underline: SizedBox.shrink(), + onChanged: (Engineer newValue) { + setState(() { + _selectedStatus = newValue; + }); + widget.onSelect(newValue); + }, + items: widget.engineers + .map>((Engineer value) { + return DropdownMenuItem( + value: value, + child: Text( + value.name, + style: Theme.of(context).textTheme.subtitle1.copyWith( + color: Theme.of(context).primaryColor, + fontSize: 11, + //fontWeight: FontWeight.bold + ), + ), + ); + }) + .toList(), + ), + ); + } +} diff --git a/lib/views/widgets/status/gas_refill/gas_cylinder_type.dart b/lib/views/widgets/status/gas_refill/gas_cylinder_type.dart new file mode 100644 index 00000000..7402e3a7 --- /dev/null +++ b/lib/views/widgets/status/gas_refill/gas_cylinder_type.dart @@ -0,0 +1,38 @@ +import 'package:flutter/material.dart'; +import 'package:provider/provider.dart'; +import 'package:test_sa/controllers/providers/api/status_drop_down/gas_refill/gas_cylinder_size_provider.dart'; +import 'package:test_sa/controllers/providers/api/status_drop_down/gas_refill/gas_cylinder_type_provider.dart'; +import 'package:test_sa/controllers/providers/api/user_provider.dart'; +import 'package:test_sa/controllers/providers/settings/setting_provider.dart'; +import 'package:test_sa/models/lookup.dart'; +import 'package:test_sa/views/widgets/loaders/loading_manager.dart'; +import 'package:test_sa/views/widgets/status/single_status_menu.dart'; +class GasCylinderTypesMenu extends StatelessWidget { + final Function(Lookup) onSelect; + final Lookup initialValue; + + const GasCylinderTypesMenu({Key key, this.onSelect, this.initialValue}) : super(key: key); + @override + Widget build(BuildContext context) { + final settingProvider = Provider.of(context); + final userProvider = Provider.of(context); + final menuProvider = Provider.of(context); + return LoadingManager( + isLoading: menuProvider.isLoading, + isFailedLoading: menuProvider.items == null, + stateCode: menuProvider.stateCode, + onRefresh: () async { + menuProvider.reset(); + await menuProvider.getData( + user: userProvider.user, + host: settingProvider.host + ); + }, + child: SingleStatusMenu( + initialStatus: initialValue, + statuses: menuProvider.items, + onSelect: onSelect, + ) + ); + } +} diff --git a/lib/views/widgets/status/multi_status_menu.dart b/lib/views/widgets/status/multi_status_menu.dart index 99a52a87..9d925df8 100644 --- a/lib/views/widgets/status/multi_status_menu.dart +++ b/lib/views/widgets/status/multi_status_menu.dart @@ -58,7 +58,7 @@ class _MultiStatusMenuState extends State { children: [ const SizedBox(width: 12,), Text( - status.label, + status.name, style: Theme.of(context).textTheme.bodyText1.copyWith( color:Theme.of(context).colorScheme.onPrimary, ), @@ -107,12 +107,12 @@ class _MultiStatusMenuState extends State { ), suggestionsCallback: (vale) { return widget.statuses.where((Lookup option) { - return option.label.toLowerCase().contains(_controller.text); + return option.name.toLowerCase().contains(_controller.text); }); }, itemBuilder: (context, part) { return ListTile( - title: Text(part.label), + title: Text(part.name), ); }, onSuggestionSelected: (status) { diff --git a/lib/views/widgets/status/report/service_report_status.dart b/lib/views/widgets/status/report/service_report_status.dart index 8a4d1c98..c0f0633e 100644 --- a/lib/views/widgets/status/report/service_report_status.dart +++ b/lib/views/widgets/status/report/service_report_status.dart @@ -34,10 +34,9 @@ class _ServiceReportStatusMenuState extends State { firstTime = false; } return LoadingManager( - isLoading: _menuProvider.isLoading == true || _callsLastSituationsProvider.isLoading == true, - isFailedLoading: _menuProvider.statuses == null || _callsLastSituationsProvider.calls == null, - stateCode: _menuProvider.stateCode == null || _callsLastSituationsProvider.stateCode == null ? null: - max(_menuProvider.stateCode ?? 0,_callsLastSituationsProvider.stateCode ?? 0), + isLoading: _menuProvider.isLoading == true, + isFailedLoading: _menuProvider.statuses == null, + stateCode: _menuProvider.stateCode, onRefresh: () async { if(_menuProvider.stateCode == null){ _menuProvider.reset(); @@ -46,7 +45,7 @@ class _ServiceReportStatusMenuState extends State { host: _settingProvider.host ); } - await _callsLastSituationsProvider.getCalls( + _callsLastSituationsProvider.getCalls( user: _userProvider.user, host: _settingProvider.host, serviceStatus: widget.report.status?.id.toString() @@ -56,12 +55,12 @@ class _ServiceReportStatusMenuState extends State { statuses: _menuProvider.statuses, initialStatus: widget.report.status, onSelect: (status){ - _callsLastSituationsProvider.getCalls( - user: _userProvider.user, - host: _settingProvider.host, - serviceStatus: status.id.toString() - ); - widget.report.callLastSituation = null; + // _callsLastSituationsProvider.getCalls( + // user: _userProvider.user, + // host: _settingProvider.host, + // serviceStatus: status.id.toString() + // ); + //widget.report.callLastSituation = null; widget.onSelect(status); }, ) diff --git a/lib/views/widgets/status/service_request/service_request_status_mune.dart b/lib/views/widgets/status/service_request/service_request_status_mune.dart new file mode 100644 index 00000000..b856f6c6 --- /dev/null +++ b/lib/views/widgets/status/service_request/service_request_status_mune.dart @@ -0,0 +1,40 @@ +import 'package:flutter/material.dart'; +import 'package:provider/provider.dart'; +import 'package:test_sa/controllers/providers/api/status_drop_down/report/service_report_priority_provider.dart'; +import 'package:test_sa/controllers/providers/api/status_drop_down/service_reqest/service_request_status_provider.dart'; +import 'package:test_sa/controllers/providers/api/status_drop_down/service_reqest/service_request_through_provider.dart'; +import 'package:test_sa/controllers/providers/api/status_drop_down/service_reqest/service_request_type_provider.dart'; +import 'package:test_sa/controllers/providers/api/user_provider.dart'; +import 'package:test_sa/controllers/providers/settings/setting_provider.dart'; +import 'package:test_sa/models/lookup.dart'; +import 'package:test_sa/views/widgets/loaders/loading_manager.dart'; +import 'package:test_sa/views/widgets/status/single_status_menu.dart'; +class ServiceRequestStatusMenu extends StatelessWidget { + final Function(Lookup) onSelect; + final Lookup initialValue; + + const ServiceRequestStatusMenu({Key key, this.onSelect, this.initialValue}) : super(key: key); + @override + Widget build(BuildContext context) { + final settingProvider = Provider.of(context); + final userProvider = Provider.of(context); + final menuProvider = Provider.of(context); + return LoadingManager( + isLoading: menuProvider.isLoading, + isFailedLoading: menuProvider.items == null, + stateCode: menuProvider.stateCode, + onRefresh: () async { + menuProvider.reset(); + await menuProvider.getData( + user: userProvider.user, + host: settingProvider.host + ); + }, + child: SingleStatusMenu( + initialStatus: initialValue, + statuses: menuProvider.items, + onSelect: onSelect, + ) + ); + } +} diff --git a/lib/views/widgets/status/service_request/service_request_through_mune.dart b/lib/views/widgets/status/service_request/service_request_through_mune.dart new file mode 100644 index 00000000..4612250a --- /dev/null +++ b/lib/views/widgets/status/service_request/service_request_through_mune.dart @@ -0,0 +1,38 @@ +import 'package:flutter/material.dart'; +import 'package:provider/provider.dart'; +import 'package:test_sa/controllers/providers/api/status_drop_down/report/service_report_priority_provider.dart'; +import 'package:test_sa/controllers/providers/api/status_drop_down/service_reqest/service_request_through_provider.dart'; +import 'package:test_sa/controllers/providers/api/user_provider.dart'; +import 'package:test_sa/controllers/providers/settings/setting_provider.dart'; +import 'package:test_sa/models/lookup.dart'; +import 'package:test_sa/views/widgets/loaders/loading_manager.dart'; +import 'package:test_sa/views/widgets/status/single_status_menu.dart'; +class ServiceRequestedThroughMenu extends StatelessWidget { + final Function(Lookup) onSelect; + final Lookup initialValue; + + const ServiceRequestedThroughMenu({Key key, this.onSelect, this.initialValue}) : super(key: key); + @override + Widget build(BuildContext context) { + final settingProvider = Provider.of(context); + final userProvider = Provider.of(context); + final menuProvider = Provider.of(context); + return LoadingManager( + isLoading: menuProvider.isLoading, + isFailedLoading: menuProvider.items == null, + stateCode: menuProvider.stateCode, + onRefresh: () async { + menuProvider.reset(); + await menuProvider.getData( + user: userProvider.user, + host: settingProvider.host + ); + }, + child: SingleStatusMenu( + initialStatus: initialValue, + statuses: menuProvider.items, + onSelect: onSelect, + ) + ); + } +} diff --git a/lib/views/widgets/status/service_request/service_request_types_mune.dart b/lib/views/widgets/status/service_request/service_request_types_mune.dart new file mode 100644 index 00000000..223a5725 --- /dev/null +++ b/lib/views/widgets/status/service_request/service_request_types_mune.dart @@ -0,0 +1,39 @@ +import 'package:flutter/material.dart'; +import 'package:provider/provider.dart'; +import 'package:test_sa/controllers/providers/api/status_drop_down/report/service_report_priority_provider.dart'; +import 'package:test_sa/controllers/providers/api/status_drop_down/service_reqest/service_request_through_provider.dart'; +import 'package:test_sa/controllers/providers/api/status_drop_down/service_reqest/service_request_type_provider.dart'; +import 'package:test_sa/controllers/providers/api/user_provider.dart'; +import 'package:test_sa/controllers/providers/settings/setting_provider.dart'; +import 'package:test_sa/models/lookup.dart'; +import 'package:test_sa/views/widgets/loaders/loading_manager.dart'; +import 'package:test_sa/views/widgets/status/single_status_menu.dart'; +class ServiceRequestTypesMenu extends StatelessWidget { + final Function(Lookup) onSelect; + final Lookup initialValue; + + const ServiceRequestTypesMenu({Key key, this.onSelect, this.initialValue}) : super(key: key); + @override + Widget build(BuildContext context) { + final settingProvider = Provider.of(context); + final userProvider = Provider.of(context); + final menuProvider = Provider.of(context); + return LoadingManager( + isLoading: menuProvider.isLoading, + isFailedLoading: menuProvider.items == null, + stateCode: menuProvider.stateCode, + onRefresh: () async { + menuProvider.reset(); + await menuProvider.getData( + user: userProvider.user, + host: settingProvider.host + ); + }, + child: SingleStatusMenu( + initialStatus: initialValue, + statuses: menuProvider.items, + onSelect: onSelect, + ) + ); + } +} diff --git a/lib/views/widgets/status/single_status_menu.dart b/lib/views/widgets/status/single_status_menu.dart index 6640bf19..fdf2b78d 100644 --- a/lib/views/widgets/status/single_status_menu.dart +++ b/lib/views/widgets/status/single_status_menu.dart @@ -16,13 +16,19 @@ class _SingleStatusMenuState extends State { Lookup _selectedStatus; + @override + void setState(VoidCallback fn) { + if(mounted) super.setState(fn); + } + @override void didUpdateWidget(covariant SingleStatusMenu oldWidget) { - if(widget.initialStatus != null){ + if(widget.initialStatus != null && widget.initialStatus.value != null){ _selectedStatus = widget.statuses?.firstWhere( (element) { - return element?.id == widget.initialStatus.id; + return element == widget.initialStatus; }); + widget.onSelect(_selectedStatus); } else { _selectedStatus = null; } @@ -31,11 +37,12 @@ class _SingleStatusMenuState extends State { @override void initState() { - if(widget.initialStatus != null){ + if(widget.initialStatus != null && widget.initialStatus.value != null){ _selectedStatus = widget.statuses?.firstWhere( (element) { - return element?.id == widget.initialStatus.id; + return element == widget.initialStatus; }); + widget.onSelect(_selectedStatus); } super.initState(); @@ -80,7 +87,7 @@ class _SingleStatusMenuState extends State { return DropdownMenuItem( value: value, child: Text( - value.label, + value.name, style: Theme.of(context).textTheme.subtitle1.copyWith( color: Theme.of(context).primaryColor, fontSize: 11, diff --git a/lib/views/widgets/visits/visit_item.dart b/lib/views/widgets/visits/visit_item.dart index a57016e6..54d9a64a 100644 --- a/lib/views/widgets/visits/visit_item.dart +++ b/lib/views/widgets/visits/visit_item.dart @@ -130,13 +130,13 @@ class VisitItem extends StatelessWidget { ), ), ), - Text( - visit.contactStatus ?? "", - style: Theme.of(context).textTheme.subtitle1.copyWith( - color: onItemColor, - fontSize: 14, - ), - ), + // Text( + // visit.contactStatus ?? "", + // style: Theme.of(context).textTheme.subtitle1.copyWith( + // color: onItemColor, + // fontSize: 14, + // ), + // ), ], ), Divider(color: onItemColor,), diff --git a/lib/views/widgets/visits/visit_status.dart b/lib/views/widgets/visits/visit_status.dart index 871287fe..5fb31918 100644 --- a/lib/views/widgets/visits/visit_status.dart +++ b/lib/views/widgets/visits/visit_status.dart @@ -31,9 +31,9 @@ class VisitStatusLabel extends StatelessWidget { ] ), child: Text( - visit.status.label == null - || visit.status.label.isEmpty - ? "no status" :visit.status.label, + visit.status.name == null + || visit.status.name.isEmpty + ? "no status" :visit.status.name, style: Theme.of(context).textTheme.subtitle2.copyWith( color: getStatusColor().computeLuminance() > 0.5 ? AColors.black : Colors.white, diff --git a/pubspec.lock b/pubspec.lock index 6dc640b6..5e3764cb 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -531,7 +531,7 @@ packages: name: logger url: "https://pub.dartlang.org" source: hosted - version: "1.1.0" + version: "1.3.0" matcher: dependency: transitive description: