diff --git a/lib/controllers/api_routes/api_manager.dart b/lib/controllers/api_routes/api_manager.dart new file mode 100644 index 00000000..1a0a125c --- /dev/null +++ b/lib/controllers/api_routes/api_manager.dart @@ -0,0 +1,150 @@ +import 'dart:convert'; +import 'dart:developer'; + +import 'package:flutter/cupertino.dart'; +import 'package:fluttertoast/fluttertoast.dart'; +import 'package:http/http.dart' as http; +import 'package:http/http.dart'; +import 'package:test_sa/models/user.dart'; + +class ApiManager { + + ApiManager._(); + + Map get _headers => { + 'Content-Type': 'application/json', + if(user != null) 'Authorization': 'Bearer ${user.token}', + }; + + static ApiManager instance = ApiManager._(); + + User user; + + Future get( + String url, + {Map headers,} + ) async{ + + headers ??= {}; + + headers.addAll(_headers); + + Uri _url = Uri.parse(url); + // print(_url); + // print(headers); + http.Response response = await http.get(_url,headers: headers); + if(jsonDecode(response.body) is Map){ + final message = jsonDecode(response.body)["message"]; + if(message != null && message.toString().isNotEmpty){ + Fluttertoast.showToast(msg: message ?? "",toastLength: Toast.LENGTH_LONG); + } + } + + 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); + // log(json.encode(body)); + var request = http.Request('POST', _url); + request.body = json.encode(body); + request.headers.addAll(headers); + + http.StreamedResponse _streamedResponse = await request.send(); + http.Response response = await http.Response.fromStream(_streamedResponse); +// print(response.statusCode); +// log(response.body); + + if(jsonDecode(response.body) is Map){ + final message = jsonDecode(response.body)["message"]; + if(message != null && message.toString().isNotEmpty){ + Fluttertoast.showToast(msg: message ?? "",toastLength: Toast.LENGTH_LONG); + } + } + + 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); + // log(json.encode(body)); + var request = http.Request('PUT', _url); + request.body = json.encode(body); + request.headers.addAll(headers); + + http.StreamedResponse streamedResponse = await request.send(); + http.Response response = await http.Response.fromStream(streamedResponse); + // print(response.statusCode); + // log(response.body); + if(jsonDecode(response.body) is Map){ + final message = jsonDecode(response.body)["message"]; + if(message != null && message.toString().isNotEmpty){ + Fluttertoast.showToast(msg: message ?? "",toastLength: Toast.LENGTH_LONG); + } + } + 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); + // log(response.body); + if(jsonDecode(response.body) is Map){ + final message = jsonDecode(response.body)["message"]; + if(message != null && message.toString().isNotEmpty){ + Fluttertoast.showToast(msg: message ?? "",toastLength: Toast.LENGTH_LONG); + } + } + 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 99% rename from lib/controllers/http_status_manger/http_status_manger.dart rename to lib/controllers/api_routes/http_status_manger.dart index 012a9a23..0bfb2170 100644 --- a/lib/controllers/http_status_manger/http_status_manger.dart +++ b/lib/controllers/api_routes/http_status_manger.dart @@ -1,5 +1,5 @@ -import 'package:test_sa/models/subtitle.dart'; import 'package:meta/meta.dart'; +import 'package:test_sa/models/subtitle.dart'; class HttpStatusManger{ static String getStatusMessage({ diff --git a/lib/controllers/api_routes/urls.dart b/lib/controllers/api_routes/urls.dart index 58c41d6f..95b6027c 100644 --- a/lib/controllers/api_routes/urls.dart +++ b/lib/controllers/api_routes/urls.dart @@ -1,68 +1,87 @@ class URLs{ URLs._(); static const host2 = "http://194.163.164.213/atoms/api"; - // static const host1 = "https://atoms.hmg.com/api"; // production url - static const host1 = "https://atomsdev.hmg.com/api"; // uat url + // static const host1 = "https://atomsdev.hmg.com/api"; // uat url + + 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 const getPreventiveMaintenanceVisits = "/return/user/calibrations"; // get - static const updatePreventiveMaintenanceVisits = "/update/user/calibrations"; // get - - static const getRegularVisits = "/return/user/ppm"; // get - static const updateRegularVisits = "/update/user/ppm"; // 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 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 get getPreventiveMaintenanceVisits => "$_baseUrl/return/user/calibrations"; // get + static get updatePreventiveMaintenanceVisits => "$_baseUrl/Visit/UpdateVisits"; // get + + static get getRegularVisits => "$_baseUrl/Visit/GetVisits"; // get + static get updateRegularVisits => "$_baseUrl/Visit/UpdateVisits"; // 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 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 createServiceReport => "$_baseUrl/WorkOrder/AddWorkOrder"; // get + static get updateServiceReport => "$_baseUrl/WorkOrder/UpdateWorkOrder"; // get + static get getServiceReport => "$_baseUrl/WorkOrder/GetWorkOrderById"; // get + static get createDuplicatedReport => "$_baseUrl/handle/duplicate/request"; // get + + static get getServiceReportReasons => "$_baseUrl/Lookups/GetLookup?lookupEnum=522"; // get + static get getServiceReportTypes => "$_baseUrl/Lookups/GetLookup?lookupEnum=501"; // get + static get getServiceReportStatus => "$_baseUrl/Lookups/GetLookup?lookupEnum=521"; // get + static get getServiceReportLastCalls => "$_baseUrl/Lookups/GetLookup?lookupEnum=520"; // get + static get getAssetTypes => "$_baseUrl/Lookups/GetLookup?lookupEnum=28"; // get + static get getPartNumber => "$_baseUrl/PartCatalog/GetPartAutoComplete"; // get + static get getServiceReportPriority => "$_baseUrl/Lookups/GetLookup?lookupEnum=602"; // get + static get getServiceReportDefectTypes => "$_baseUrl/Lookups/GetLookup?lookupEnum=601"; // get //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 0bcd0f02..27146791 100644 --- a/lib/controllers/providers/api/departments_provider.dart +++ b/lib/controllers/providers/api/departments_provider.dart @@ -2,6 +2,7 @@ import 'dart:convert'; import 'package:flutter/cupertino.dart'; import 'package:http/http.dart'; +import 'package:test_sa/controllers/api_routes/api_manager.dart'; import 'package:test_sa/controllers/api_routes/urls.dart'; import 'package:test_sa/models/department.dart'; @@ -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 1d433c11..faebf334 100644 --- a/lib/controllers/providers/api/device_transfer_provider.dart +++ b/lib/controllers/providers/api/device_transfer_provider.dart @@ -2,6 +2,7 @@ import 'dart:convert'; import 'package:flutter/cupertino.dart'; import 'package:http/http.dart'; +import 'package:test_sa/controllers/api_routes/api_manager.dart'; import 'package:test_sa/controllers/api_routes/urls.dart'; import 'package:test_sa/models/device/device_transfer.dart'; import 'package:test_sa/models/device/device_transfer_info.dart'; @@ -64,19 +65,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 ??= []; @@ -106,20 +107,20 @@ 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) { @@ -145,24 +146,59 @@ 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) { reset(); diff --git a/lib/controllers/providers/api/devices_provider.dart b/lib/controllers/providers/api/devices_provider.dart index b55d1733..458ed9de 100644 --- a/lib/controllers/providers/api/devices_provider.dart +++ b/lib/controllers/providers/api/devices_provider.dart @@ -2,8 +2,10 @@ import 'dart:convert'; import 'package:flutter/cupertino.dart'; import 'package:http/http.dart'; +import 'package:test_sa/controllers/api_routes/api_manager.dart'; import 'package:test_sa/controllers/api_routes/urls.dart'; import 'package:test_sa/models/device/device.dart'; +import 'package:test_sa/models/lookup.dart'; import 'package:test_sa/models/user.dart'; class DevicesProvider extends ChangeNotifier{ @@ -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,23 +87,59 @@ 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) { + 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) { @@ -105,6 +148,7 @@ class DevicesProvider extends ChangeNotifier{ } + /// return -2 if request in progress /// return -1 if error happen when sending request /// return state code if request complete may be 200, 404 or 403 @@ -113,7 +157,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 7dba6a8c..2f460a0a 100644 --- a/lib/controllers/providers/api/gas_refill_provider.dart +++ b/lib/controllers/providers/api/gas_refill_provider.dart @@ -2,6 +2,7 @@ import 'dart:convert'; import 'package:flutter/cupertino.dart'; import 'package:http/http.dart'; +import 'package:test_sa/controllers/api_routes/api_manager.dart'; import 'package:test_sa/controllers/api_routes/urls.dart'; import 'package:test_sa/models/gas_refill/gas_refill_model.dart'; import 'package:test_sa/models/user.dart'; @@ -47,20 +48,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 ??= []; @@ -71,6 +71,7 @@ class GasRefillProvider extends ChangeNotifier{ nextPage = false; } } + try{ isLoading = false; notifyListeners(); return response.statusCode; @@ -92,33 +93,27 @@ 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(); } } @@ -137,25 +132,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 df70994f..bdcb9fa7 100644 --- a/lib/controllers/providers/api/hospitals_provider.dart +++ b/lib/controllers/providers/api/hospitals_provider.dart @@ -3,6 +3,7 @@ import 'dart:convert'; import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; import 'package:http/http.dart'; +import 'package:test_sa/controllers/api_routes/api_manager.dart'; import 'package:test_sa/controllers/api_routes/urls.dart'; import 'package:test_sa/models/hospital.dart'; import 'package:test_sa/models/user.dart'; @@ -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 d21ec77b..0f216a0a 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..8603c860 100644 --- a/lib/controllers/providers/api/parts_provider.dart +++ b/lib/controllers/providers/api/parts_provider.dart @@ -1,11 +1,12 @@ import 'dart:convert'; -import 'package:test_sa/controllers/api_routes/urls.dart'; -import 'package:test_sa/models/part.dart'; -import 'package:test_sa/models/user.dart'; import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; import 'package:http/http.dart'; +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'; class PartsProvider extends ChangeNotifier{ @@ -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,20 +97,16 @@ 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; diff --git a/lib/controllers/providers/api/preventive_maintenance_visits_provider.dart b/lib/controllers/providers/api/preventive_maintenance_visits_provider.dart index 14103fd6..feb64cd4 100644 --- a/lib/controllers/providers/api/preventive_maintenance_visits_provider.dart +++ b/lib/controllers/providers/api/preventive_maintenance_visits_provider.dart @@ -1,12 +1,13 @@ import 'dart:convert'; +import 'package:flutter/cupertino.dart'; +import 'package:http/http.dart'; +import 'package:test_sa/controllers/api_routes/api_manager.dart'; import 'package:test_sa/controllers/api_routes/urls.dart'; import 'package:test_sa/models/user.dart'; import 'package:test_sa/models/visits/visit.dart'; import 'package:test_sa/models/visits/visits_group.dart'; import 'package:test_sa/models/visits/visits_search.dart'; -import 'package:flutter/cupertino.dart'; -import 'package:http/http.dart'; class PreventiveMaintenanceVisitsProvider extends ChangeNotifier{ @@ -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..39119490 100644 --- a/lib/controllers/providers/api/regular_visits_provider.dart +++ b/lib/controllers/providers/api/regular_visits_provider.dart @@ -1,18 +1,20 @@ import 'dart:convert'; +import 'package:flutter/cupertino.dart'; +import 'package:http/http.dart'; +import 'package:logger/logger.dart'; +import 'package:test_sa/controllers/api_routes/api_manager.dart'; import 'package:test_sa/controllers/api_routes/urls.dart'; import 'package:test_sa/models/pantry/pentry.dart'; import 'package:test_sa/models/user.dart'; import 'package:test_sa/models/visits/visit.dart'; import 'package:test_sa/models/visits/visits_group.dart'; import 'package:test_sa/models/visits/visits_search.dart'; -import 'package:flutter/cupertino.dart'; -import 'package:http/http.dart'; class 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,15 +161,24 @@ 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["ppmScheduleId"] = visit.ppmScheduleId; + // 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; diff --git a/lib/controllers/providers/api/service_requests_provider.dart b/lib/controllers/providers/api/service_requests_provider.dart index 040ed855..35bda175 100644 --- a/lib/controllers/providers/api/service_requests_provider.dart +++ b/lib/controllers/providers/api/service_requests_provider.dart @@ -2,8 +2,9 @@ import 'dart:convert'; import 'package:flutter/cupertino.dart'; import 'package:http/http.dart'; +import 'package:test_sa/controllers/api_routes/api_manager.dart'; +import 'package:test_sa/controllers/api_routes/http_status_manger.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/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; @@ -144,25 +142,29 @@ 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) { @@ -232,7 +234,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; @@ -250,16 +252,20 @@ class ServiceRequestsProvider extends ChangeNotifier{ @required ServiceRequest request, }) async { Response response; - Map body = report.toMap(); - body["uid"] = user.id; - body["token"] = user.token; - body["job_id"] = request.id; + try{ - response = await post( - Uri.parse( - host+URLs.createServiceReport), - body: body, + Map body = report.toMap(request); + // body["uid"] = user.id; + // body["token"] = user.token; + response = await ApiManager.instance.post( + URLs.createServiceReport, + body: body ); + // response = await post( + // Uri.parse( + // host+URLs.createServiceReport), + // body: body, + // ); stateCode = response.statusCode; if(response.statusCode >= 200 && response.statusCode < 300) { @@ -269,7 +275,6 @@ class ServiceRequestsProvider extends ChangeNotifier{ return response.statusCode; } catch(error) { - return -1; } @@ -317,18 +322,25 @@ class ServiceRequestsProvider extends ChangeNotifier{ @required ServiceRequest request, }) async { Response response; - Map body = report.toMap(); - body["uid"] = user.id; - body["token"] = user.token; - body["job_id"] = request.id; - body["report_id"] = request.reportID; + //Map body = report.toMap(request); + // body["uid"] = user.id; + // body["token"] = user.token; + // body["job_id"] = request.id; + // body["report_id"] = request.reportID; try{ - response = await post( - Uri.parse( - host+URLs.updateServiceReport), - body: body, + Map body = report.toMap(request); + // body["uid"] = user.id; + // body["token"] = user.token; + response = await ApiManager.instance.put( + URLs.updateServiceReport, + body: body ); - stateCode = response.statusCode; + // response = await post( + // Uri.parse( + // host+URLs.updateServiceReport), + // body: body, + // ); + // stateCode = response.statusCode; if(response.statusCode >= 200 && response.statusCode < 300) { reset(); @@ -337,7 +349,6 @@ class ServiceRequestsProvider extends ChangeNotifier{ return response.statusCode; } catch(error) { - return -1; } @@ -350,7 +361,7 @@ class ServiceRequestsProvider extends ChangeNotifier{ @required ServiceRequest request, }) async { Response response; - Map body = {}; + Map body = {}; body["uid"] = user.id; body["token"] = user.token; body["job_id"] = request.id; @@ -380,26 +391,17 @@ class ServiceRequestsProvider extends ChangeNotifier{ } Future getSingleServiceReport({ - @required String reportId, + @required int reportId, @required String host, @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( @@ -410,7 +412,7 @@ class ServiceRequestsProvider extends ChangeNotifier{ if (response.statusCode >= 200 && response.statusCode < 300){ // If the call to the server was successful, parse the JSON. return ServiceReport.fromJson( - json.decode(utf8.decode(response.bodyBytes)),reportId); + json.decode(response.body)["data"],reportId); }else{ throw(HttpStatusManger.getStatusMessage( status: response.statusCode, subtitle: subtitle)); diff --git a/lib/controllers/providers/api/status_drop_down/employee/employee_provider.dart b/lib/controllers/providers/api/status_drop_down/employee/assigned_to_provider.dart similarity index 87% 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 04f6d5b6..f0ff7e05 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 @@ -3,11 +3,12 @@ import 'dart:convert'; import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; import 'package:http/http.dart'; +import 'package:test_sa/controllers/api_routes/api_manager.dart'; import 'package:test_sa/controllers/api_routes/urls.dart'; import 'package:test_sa/models/lookup.dart'; import 'package:test_sa/models/user.dart'; -class EmployeesProvider extends ChangeNotifier{ +class AssignedToProvider extends ChangeNotifier{ //reset provider data void reset(){ @@ -48,21 +49,19 @@ 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) { - _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..af47a022 --- /dev/null +++ b/lib/controllers/providers/api/status_drop_down/employee/engineers_provider.dart @@ -0,0 +1,73 @@ +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) { + _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 b4112034..7952a2f6 100644 --- a/lib/controllers/providers/api/status_drop_down/gas_refill/gas_cylinder_size_provider.dart +++ b/lib/controllers/providers/api/status_drop_down/gas_refill/gas_cylinder_size_provider.dart @@ -3,6 +3,7 @@ import 'dart:convert'; import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; import 'package:http/http.dart'; +import 'package:test_sa/controllers/api_routes/api_manager.dart'; import 'package:test_sa/controllers/api_routes/urls.dart'; import 'package:test_sa/models/lookup.dart'; import 'package:test_sa/models/user.dart'; @@ -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..370370c1 --- /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:flutter/cupertino.dart'; +import 'package:flutter/material.dart'; +import 'package:http/http.dart'; +import 'package:test_sa/controllers/api_routes/api_manager.dart'; +import 'package:test_sa/controllers/api_routes/urls.dart'; +import 'package:test_sa/models/lookup.dart'; +import 'package:test_sa/models/user.dart'; + +class 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 24b4e018..dacc96d0 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 @@ -6,6 +6,10 @@ import 'package:test_sa/models/user.dart'; import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; import 'package:http/http.dart'; +import 'package:test_sa/controllers/api_routes/api_manager.dart'; +import 'package:test_sa/controllers/api_routes/urls.dart'; +import 'package:test_sa/models/lookup.dart'; +import 'package:test_sa/models/user.dart'; class GasStatusProvider extends ChangeNotifier{ @@ -48,13 +52,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 f444c233..78e206f0 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 @@ -6,6 +6,10 @@ import 'package:test_sa/models/user.dart'; import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; import 'package:http/http.dart'; +import 'package:test_sa/controllers/api_routes/api_manager.dart'; +import 'package:test_sa/controllers/api_routes/urls.dart'; +import 'package:test_sa/models/lookup.dart'; +import 'package:test_sa/models/user.dart'; class GasTypesProvider extends ChangeNotifier{ @@ -48,13 +52,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 8e3168d9..335aae1d 100644 --- a/lib/controllers/providers/api/status_drop_down/pentry/pentry_status_provider.dart +++ b/lib/controllers/providers/api/status_drop_down/pentry/pentry_status_provider.dart @@ -3,6 +3,7 @@ import 'dart:convert'; import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; import 'package:http/http.dart'; +import 'package:test_sa/controllers/api_routes/api_manager.dart'; import 'package:test_sa/controllers/api_routes/urls.dart'; import 'package:test_sa/models/lookup.dart'; import 'package:test_sa/models/user.dart'; @@ -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 03370135..5690aa83 100644 --- a/lib/controllers/providers/api/status_drop_down/pentry/pentry_task_status_provider.dart +++ b/lib/controllers/providers/api/status_drop_down/pentry/pentry_task_status_provider.dart @@ -3,6 +3,7 @@ import 'dart:convert'; import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; import 'package:http/http.dart'; +import 'package:test_sa/controllers/api_routes/api_manager.dart'; import 'package:test_sa/controllers/api_routes/urls.dart'; import 'package:test_sa/models/lookup.dart'; import 'package:test_sa/models/user.dart'; @@ -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 09b52cbb..f86f15b0 100644 --- a/lib/controllers/providers/api/status_drop_down/pentry/pentry_visit_status_provider.dart +++ b/lib/controllers/providers/api/status_drop_down/pentry/pentry_visit_status_provider.dart @@ -3,6 +3,7 @@ import 'dart:convert'; import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; import 'package:http/http.dart'; +import 'package:test_sa/controllers/api_routes/api_manager.dart'; import 'package:test_sa/controllers/api_routes/urls.dart'; import 'package:test_sa/models/lookup.dart'; import 'package:test_sa/models/user.dart'; @@ -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 50efd414..775dd106 100644 --- a/lib/controllers/providers/api/status_drop_down/report/service_report_defect_types_provider.dart +++ b/lib/controllers/providers/api/status_drop_down/report/service_report_defect_types_provider.dart @@ -3,6 +3,7 @@ import 'dart:convert'; import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; import 'package:http/http.dart'; +import 'package:test_sa/controllers/api_routes/api_manager.dart'; import 'package:test_sa/controllers/api_routes/urls.dart'; import 'package:test_sa/models/lookup.dart'; import 'package:test_sa/models/user.dart'; @@ -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 50de291f..59fc821a 100644 --- a/lib/controllers/providers/api/status_drop_down/report/service_report_last_calls_provider.dart +++ b/lib/controllers/providers/api/status_drop_down/report/service_report_last_calls_provider.dart @@ -3,6 +3,7 @@ import 'dart:convert'; import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; import 'package:http/http.dart'; +import 'package:test_sa/controllers/api_routes/api_manager.dart'; import 'package:test_sa/controllers/api_routes/urls.dart'; import 'package:test_sa/models/lookup.dart'; import 'package:test_sa/models/user.dart'; @@ -42,24 +43,28 @@ class ServiceReportLastCallsProvider extends ChangeNotifier{ /// return state code if request complete may be 200, 404 or 403 /// for more details check http state manager /// lib\controllers\http_status_manger\http_status_manger.dart - Future getCalls ({String host,User user,String serviceStatus}) async { + Future getCalls ({String host,User user,int serviceStatus}) async { if(_loading == true) return -2; _loading = true; 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 58fc2d98..d25644c9 100644 --- a/lib/controllers/providers/api/status_drop_down/report/service_report_priority_provider.dart +++ b/lib/controllers/providers/api/status_drop_down/report/service_report_priority_provider.dart @@ -3,6 +3,7 @@ import 'dart:convert'; import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; import 'package:http/http.dart'; +import 'package:test_sa/controllers/api_routes/api_manager.dart'; import 'package:test_sa/controllers/api_routes/urls.dart'; import 'package:test_sa/models/lookup.dart'; import 'package:test_sa/models/user.dart'; @@ -48,16 +49,15 @@ 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(); 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 bac49f9f..6a4808f2 100644 --- a/lib/controllers/providers/api/status_drop_down/report/service_report_reasons_provider.dart +++ b/lib/controllers/providers/api/status_drop_down/report/service_report_reasons_provider.dart @@ -3,6 +3,7 @@ import 'dart:convert'; import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; import 'package:http/http.dart'; +import 'package:test_sa/controllers/api_routes/api_manager.dart'; import 'package:test_sa/controllers/api_routes/urls.dart'; import 'package:test_sa/models/lookup.dart'; import 'package:test_sa/models/user.dart'; @@ -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 89cb100f..a05aa23a 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,9 @@ import 'dart:convert'; +import 'package:test_sa/controllers/api_routes/api_manager.dart'; +import 'package:test_sa/controllers/api_routes/urls.dart'; +import 'package:test_sa/models/lookup.dart'; +import 'package:test_sa/models/user.dart'; import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; import 'package:http/http.dart'; @@ -48,15 +52,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 a8b07c08..084daf1c 100644 --- a/lib/controllers/providers/api/status_drop_down/report/service_report_types_provider.dart +++ b/lib/controllers/providers/api/status_drop_down/report/service_report_types_provider.dart @@ -3,6 +3,7 @@ import 'dart:convert'; import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; import 'package:http/http.dart'; +import 'package:test_sa/controllers/api_routes/api_manager.dart'; import 'package:test_sa/controllers/api_routes/urls.dart'; import 'package:test_sa/models/lookup.dart'; import 'package:test_sa/models/user.dart'; @@ -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 a5bcb0a5..48da78f4 100644 --- a/lib/controllers/providers/api/status_drop_down/report/service_types_provider.dart +++ b/lib/controllers/providers/api/status_drop_down/report/service_types_provider.dart @@ -3,6 +3,7 @@ import 'dart:convert'; import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; import 'package:http/http.dart'; +import 'package:test_sa/controllers/api_routes/api_manager.dart'; import 'package:test_sa/controllers/api_routes/urls.dart'; import 'package:test_sa/models/lookup.dart'; import 'package:test_sa/models/user.dart'; @@ -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.getAssetTypes, ); _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..91b7d4ca --- /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:flutter/cupertino.dart'; +import 'package:flutter/material.dart'; +import 'package:http/http.dart'; +import 'package:test_sa/controllers/api_routes/api_manager.dart'; +import 'package:test_sa/controllers/api_routes/urls.dart'; +import 'package:test_sa/models/lookup.dart'; +import 'package:test_sa/models/user.dart'; + +class 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..ec2e6720 --- /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:flutter/cupertino.dart'; +import 'package:flutter/material.dart'; +import 'package:http/http.dart'; +import 'package:test_sa/controllers/api_routes/api_manager.dart'; +import 'package:test_sa/controllers/api_routes/urls.dart'; +import 'package:test_sa/models/lookup.dart'; +import 'package:test_sa/models/user.dart'; + +class 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..76e6c7c4 --- /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:flutter/cupertino.dart'; +import 'package:flutter/material.dart'; +import 'package:http/http.dart'; +import 'package:test_sa/controllers/api_routes/api_manager.dart'; +import 'package:test_sa/controllers/api_routes/urls.dart'; +import 'package:test_sa/models/lookup.dart'; +import 'package:test_sa/models/user.dart'; + +class 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..35634708 100644 --- a/lib/controllers/providers/api/user_provider.dart +++ b/lib/controllers/providers/api/user_provider.dart @@ -1,15 +1,17 @@ import 'dart:convert'; -import 'package:test_sa/controllers/api_routes/urls.dart'; -import 'package:test_sa/models/user.dart'; import 'package:flutter/material.dart'; import 'package:http/http.dart'; +import 'package:test_sa/controllers/api_routes/api_manager.dart'; +import 'package:test_sa/controllers/api_routes/urls.dart'; +import 'package:test_sa/models/user.dart'; class UserProvider extends ChangeNotifier{ //reset provider data void reset(){ _user = null; + ApiManager.instance.user = user; _loading = false; } @@ -19,6 +21,7 @@ class UserProvider extends ChangeNotifier{ User get user => _user; set user(User user) { _user = user; + ApiManager.instance.user = user; notifyListeners(); } @@ -48,17 +51,15 @@ 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)); + ApiManager.instance.user = _user; return response.statusCode; } notifyListeners(); @@ -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 dea92839..26805518 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -1,3 +1,6 @@ +import 'package:flutter/material.dart'; +import 'package:flutter_localizations/flutter_localizations.dart'; +import 'package:provider/provider.dart'; import 'dart:io'; import 'package:firebase_core/firebase_core.dart'; @@ -13,14 +16,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'; @@ -92,16 +100,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..5bcecd50 100644 --- a/lib/models/device/device.dart +++ b/lib/models/device/device.dart @@ -1,43 +1,44 @@ +import 'package:test_sa/models/hospital.dart'; +import 'package:test_sa/models/lookup.dart'; + +import 'model.dart'; + class Device{ - String id; + int id; String serialNumber; String number; - String brand; - String model; - DateTime productionDate; - DateTime supplyDate; - DateTime installDate; - DateTime receivingDate; - DateTime operationDate; - DateTime warrantyDate; + // String brand; + // String model; + ModelDefinition modelDefinition; + Hospital hospital; + Device({ this.id, this.serialNumber, this.number, - this.brand, - this.model, - this.productionDate, - this.supplyDate, - this.installDate, - this.receivingDate, - this.operationDate, - this.warrantyDate, + this.hospital, + // this.brand, + // this.model, + this.modelDefinition, + }); + + + factory Device.fromJson(Map parsedJson){ + return Device( - id: parsedJson["nid"] ?? parsedJson["id"], - serialNumber: parsedJson["sn"] ?? parsedJson["value"], - number: parsedJson["asset_no"], - brand: parsedJson["brand"].toString(), - model: parsedJson["model"].toString(), - productionDate: getDateFromString(parsedJson["production_date"]), - supplyDate: getDateFromString(parsedJson["supply_date "]), - installDate: getDateFromString(parsedJson["install_date "]), - receivingDate: getDateFromString(parsedJson["receving_date "]), - operationDate: getDateFromString(parsedJson["operation_date "]), - warrantyDate: getDateFromString(parsedJson["warranty_date "]), + id: parsedJson["id"], + serialNumber: parsedJson["assetSerialNo"], + number: parsedJson["assetNumber"], + modelDefinition:ModelDefinition.fromJson(parsedJson["modelDefinition"]), + hospital:Hospital.fromJson(parsedJson["site"]), + // parsedJson["modelDefinition"] == null ? "" : + // parsedJson["modelDefinition"]["manufacturerName"], + // model: parsedJson["modelDefinition"] == null ? "" : + // parsedJson["modelDefinition"]["modelName"], ); } @@ -46,21 +47,19 @@ class Device{ id: device.id, serialNumber: device.serialNumber, number: device.number, - brand: device.brand, - model: device.model, - productionDate: device.productionDate, - supplyDate: device.supplyDate, - installDate: device.installDate, - receivingDate: device.receivingDate, - operationDate: device.operationDate, - warrantyDate: device.warrantyDate, + // brand: device.brand, + // model: device.model, ); } -} -DateTime getDateFromString(String unixDate){ - if(unixDate == null) - return null; - return DateTime.fromMillisecondsSinceEpoch( - int.parse(unixDate)); + Map toMap(Lookup assetType) { + return { + 'id': id, + 'assetSerialNo': serialNumber, + 'assetNumber': number, + 'modelDefinition': modelDefinition.toJson(), + 'site': hospital.toMap(), + 'AssetType':assetType.toMap(), + }; + } } \ No newline at end of file diff --git a/lib/models/device/device_transfer.dart b/lib/models/device/device_transfer.dart index d62913ab..d76728bf 100644 --- a/lib/models/device/device_transfer.dart +++ b/lib/models/device/device_transfer.dart @@ -1,8 +1,12 @@ +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'; +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; @@ -39,11 +43,55 @@ class DeviceTransfer{ factory DeviceTransfer.fromJson(Map parsedJson){ 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 d3645b9d..05e877f5 100644 --- a/lib/models/device/device_transfer_info.dart +++ b/lib/models/device/device_transfer_info.dart @@ -9,7 +9,7 @@ class DeviceTransferInfo{ Department department; String workingHours; String travelingHours; - String name; + String userName; String signature; Lookup status; @@ -18,7 +18,7 @@ class DeviceTransferInfo{ this.comment, this.department, this.client, - this.name, + this.userName, this.travelingHours, this.workingHours, this.signature, @@ -45,7 +45,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; @@ -59,13 +59,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/device/model.dart b/lib/models/device/model.dart new file mode 100644 index 00000000..bd49b250 --- /dev/null +++ b/lib/models/device/model.dart @@ -0,0 +1,47 @@ +class ModelDefinition { + int id; + String assetName; + String modelDefCode; + String modelName; + String manufacturerName; + String supplierName; + String replacementDate; + int lifeSpan; + + ModelDefinition( + {this.id, + this.assetName, + this.modelDefCode, + this.modelName, + this.manufacturerName, + this.supplierName, + this.replacementDate, + this.lifeSpan,}); + + Map toJson() { + final Map data = {}; + data['id'] = id; + data['assetName'] = assetName; + data['modelDefCode'] = modelDefCode; + data['modelName'] = modelName; + data['manufacturerName'] = manufacturerName; + data['supplierName'] = supplierName; + data['replacementDate'] = replacementDate; + data['lifeSpan'] = lifeSpan; + return data; + } + + factory ModelDefinition.fromJson(Map map) { + if(map == null) return null; + return ModelDefinition( + id: map['id'] as int, + assetName: map['assetName'] as String, + modelDefCode: map['modelDefCode'] as String, + modelName: map['modelName'] as String, + manufacturerName: map['manufacturerName'] as String, + supplierName: map['supplierName'] as String, + replacementDate: map['replacementDate'] as String, + lifeSpan: map['lifeSpan'] as int, + ); + } +} \ No newline at end of file diff --git a/lib/models/engineer.dart b/lib/models/engineer.dart new file mode 100644 index 00000000..d8b15f07 --- /dev/null +++ b/lib/models/engineer.dart @@ -0,0 +1,41 @@ +class Engineer{ + String id; + String name; + + Engineer({ + this.id, + this.name, + }); + + + + factory Engineer.fromJson(Map parsedJson){ + return Engineer( + id: parsedJson["userId"] ?? parsedJson["id"], + name: parsedJson["userName"] ?? parsedJson["name"], + ); + } + 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; + + Map toMap() { + return { + 'id': id, + 'name': name, + }; + } + +} \ 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..71cde19d 100644 --- a/lib/models/hospital.dart +++ b/lib/models/hospital.dart @@ -1,16 +1,23 @@ class Hospital{ - String id; + int id; + int customerCode; String name; + List buildings; Hospital({ this.id, + this.customerCode, this.name, + this.buildings, }); + factory Hospital.fromJson(Map parsedJson){ return Hospital( - id: parsedJson["nid"] ?? parsedJson["id"], - name: parsedJson["client_name"] ?? parsedJson["value"], + id: parsedJson["id"], + name: parsedJson["custName"], + customerCode: parsedJson["customerCode"], + buildings: parsedJson["buildings"] ); } @@ -18,6 +25,17 @@ class Hospital{ return Hospital( id: hospital?.id, name: hospital?.name, + customerCode: hospital?.customerCode, + buildings:hospital?.buildings ); } + + Map toMap() { + return { + 'id': id, + 'customerCode': customerCode, + 'custName': name, + "buildings":buildings + }; + } } \ No newline at end of file diff --git a/lib/models/lookup.dart b/lib/models/lookup.dart index 93e1f9ec..e69de29b 100644 --- a/lib/models/lookup.dart +++ b/lib/models/lookup.dart @@ -1,47 +0,0 @@ -class Lookup{ - - final String label; - final String key; - final int id; - - const Lookup({ - this.label, - this.key, - this.id, - }); - - @override - bool operator == (Object other) => - identical(this, other) || other is Lookup && - key == other.key && - id == other.id; - - - @override - int get hashCode => id.hashCode; - - factory Lookup.fromStatus(Lookup old){ - return Lookup( - label: old.label, - id: old.id, - key: old.key, - ); - } - - factory Lookup.fromJson(Map parsedJson){ - if(parsedJson["id"] == null && parsedJson["uid"] == null) return null; - return Lookup( - label: 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"], - id: parsedJson["id"], - ); - } -} \ No newline at end of file diff --git a/lib/models/pantry/calibration_tools.dart b/lib/models/pantry/calibration_tools.dart index 2c70c6d2..4207c99b 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 ?? 0, + "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 ebd855dc..0f7e1cfa 100644 --- a/lib/models/pantry/pentry.dart +++ b/lib/models/pantry/pentry.dart @@ -1,6 +1,8 @@ import 'dart:convert'; import 'dart:io'; +import 'dart:typed_data'; +import 'package:test_sa/controllers/api_routes/urls.dart'; import 'package:test_sa/models/lookup.dart'; import 'package:test_sa/models/pantry/calibration_tools.dart'; import 'package:test_sa/models/pantry/pm_kit.dart'; @@ -12,6 +14,7 @@ class Pentry{ Lookup status; TimerModel timer; DateTime actualVisitDate; + DateTime expectedVisitDate; String travelingHours; String image; File imageFile; @@ -19,6 +22,10 @@ class Pentry{ List ppmCheckLists; List calibrationTools; List pmKits; + String signatureNurse; + String signatureEngineer; + Uint8List localNurseSignature; + Uint8List localEngineerSignature; Pentry({ this.travelingHours, @@ -26,16 +33,22 @@ class Pentry{ this.status, this.ppmVisitStatus, this.actualVisitDate, + this.expectedVisitDate, this.image, this.imageFile, // this.contacts, this.ppmCheckLists, this.calibrationTools, this.pmKits, + this.signatureNurse, + this.signatureEngineer, + this.localNurseSignature, + this.localEngineerSignature }); bool validate(){ if(actualVisitDate == null) return false; + if(expectedVisitDate == null) return false; if(timer == null && timer.endAt != null) return false; if(ppmVisitStatus == null) return false; //if(status == null) return false; @@ -43,18 +56,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["nurseSignature"] = signatureNurse; + map["engSignature"] = signatureEngineer; return map; } @@ -77,44 +103,74 @@ 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, + signatureNurse: URLs.getFileUrl(map["nurseSignature"]) , + signatureEngineer:URLs.getFileUrl(map["engSignature"]), ); } - 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 signatureNurse, + String signatureEngineer, + }) { + return Pentry( + ppmVisitStatus: ppmVisitStatus ?? this.ppmVisitStatus, + status: status ?? this.status, + timer: timer ?? this.timer, + actualVisitDate: actualVisitDate ?? this.actualVisitDate, + expectedVisitDate: expectedVisitDate ?? this.expectedVisitDate, + travelingHours: travelingHours ?? this.travelingHours, + image: image ?? this.image, + imageFile: imageFile ?? this.imageFile, + ppmCheckLists: ppmCheckLists ?? this.ppmCheckLists?.map((e) => e.copyWith())?.toList(), + calibrationTools: calibrationTools ?? this.calibrationTools?.map((e) => e.copyWith())?.toList(), + pmKits: pmKits ?? this.pmKits.map((e) => e.copyWith()).toList(), + signatureNurse: signatureNurse ?? this.signatureNurse, + signatureEngineer: signatureEngineer ?? this.signatureEngineer + ); } } \ No newline at end of file diff --git a/lib/models/pantry/pm_kit.dart b/lib/models/pantry/pm_kit.dart index 0a008e5f..40bcf514 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 ?? 0, + "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(id:map['partCatalogItemId'],name:map["partNumber"]), 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..3ed03dae 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 ?? 0, + "visitId": visitId, + if(status != null) 'taskStatusId': status?.id.toString(), + if(title != null) 'task': title, + if(comment != null) 'taskComment': comment, if(measuredValue != null) 'measuredValue': measuredValue, }; } 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..298f4359 100644 --- a/lib/models/part.dart +++ b/lib/models/part.dart @@ -1,23 +1,37 @@ class Part{ - String id; + int id; + int reportPartID; String code; String name; int quantity; Part({ this.id, + this.reportPartID, this.code, this.name, this.quantity = 1, }); - factory Part.fromJson(Map parsedJson){ + Map toJson(){ + return { + "id": reportPartID ?? 0, + "sparePart":{ + "id":id, + "partNo": code, + "partName":name + }, + "qty":quantity + }; + } + + factory Part.fromJson(Map parsedJson,{Map reportJson}){ return Part( - id: parsedJson["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"], + reportPartID: reportJson != null ? reportJson["id"] : null, + code: parsedJson["partNo"], + name: parsedJson["partName"], + quantity: reportJson != null ? (reportJson["qty"] ?? 1).toInt() : 1, ); } } \ No newline at end of file diff --git a/lib/models/service_report.dart b/lib/models/service_report.dart index 81047ec1..58eb2c98 100644 --- a/lib/models/service_report.dart +++ b/lib/models/service_report.dart @@ -1,21 +1,25 @@ -import 'dart:convert'; +import 'dart:typed_data'; +import 'package:test_sa/controllers/api_routes/urls.dart'; import 'package:test_sa/models/device/device.dart'; +import 'package:test_sa/models/engineer.dart'; import 'package:test_sa/models/lookup.dart'; import 'package:test_sa/models/part.dart'; +import 'package:test_sa/models/service_request/service_request.dart'; import 'package:test_sa/models/timer_model.dart'; class ServiceReport { - String id; + int id; String operatingHours; DateTime visitDate; DateTime endDate; - Lookup serviceType; + Lookup assetType; Lookup callLastSituation; + Engineer engineer; Lookup status; Lookup type; Lookup reason; - String faultDescription; + int faultDescriptionId; String workPreformed; //String workHours; String travelingHours; @@ -27,18 +31,23 @@ class ServiceReport { String quantity; String jobSheetNumber; TimerModel timer; + String signatureNurse; + String signatureEngineer; + Uint8List localNurseSignature; + Uint8List localEngineerSignature; ServiceReport({ this.id, this.visitDate, this.endDate, - this.serviceType, + this.assetType, this.status, this.type, - this.faultDescription, + this.faultDescriptionId, //this.workHours, this.travelingHours, this.parts, + this.engineer, this.workPreformed, this.reason, this.operatingHours, @@ -50,100 +59,128 @@ class ServiceReport { this.invoiceNumber, this.quantity = "1", this.timer, + this.signatureNurse, + this.signatureEngineer, + this.localNurseSignature, + this.localEngineerSignature }); - Map toMap(){ - Map _map = {}; + Map toMap(ServiceRequest request){ + Map _map = {}; if(id != null) _map["id"] = id; - if(visitDate != null) _map["visit_date"] = (visitDate.millisecondsSinceEpoch ~/ 1000).toString(); - if(serviceType != null) _map["service_type"] = serviceType.id.toString(); - if(status != null) _map["status"] = status.id.toString(); - if(type != null) _map["service_report_type"] = type.id.toString(); - if(faultDescription != null && faultDescription.isNotEmpty) _map["fault_description"] = faultDescription; + if(visitDate != null) _map["visitDate"] = visitDate.toIso8601String(); + //if(serviceType != null) _map["service_type"] = serviceType.id.toString(); + if(status != null) _map["status"] = status?.toMap(); + if(type != null) _map["typeOfWO"] = type?.toMap(); + if(assetType != null) _map["TypeOfWO"] = assetType?.toMap(); + //if(faultDescriptionId != null && faultDescriptionId.isNotEmpty) _map["fault_description"] = faultDescriptionId; //if(workHours != null && workHours.isNotEmpty) _map["working_hours"] = workHours; if(timer != null){ - _map["start_time"] = (timer.startAt.millisecondsSinceEpoch / 1000).toStringAsFixed(0); - _map["end_time"] = ((timer.endAt ?? DateTime.now()).millisecondsSinceEpoch / 1000).toStringAsFixed(0); - _map["working_hours"] = (timer.durationInSecond / 60 / 60).toStringAsFixed(5); + _map["startofWorkTime"] = timer.startAt.toIso8601String(); + _map["endofWorkTime"] = (timer.endAt ?? DateTime.now()).toIso8601String(); + _map["workingHours"] = (timer.durationInSecond / 60 / 60).toStringAsFixed(5); } if(travelingHours != null && travelingHours.isNotEmpty) _map["traveling_hours"] = travelingHours; - if(workPreformed != null && workPreformed.isNotEmpty) _map["work_performed"] = workPreformed; + // if(workPreformed != null && workPreformed.isNotEmpty){ + // _map["faultDescription"] = { + // //"id":faultDescriptionId ?? 0, + // "workPerformed":workPreformed + // }; + // } if(jobSheetNumber != null && jobSheetNumber.isNotEmpty) _map["job_sheet_no"] = jobSheetNumber; if(parts != null && parts.isNotEmpty){ - Map _partsMap = {}; - parts.forEach((part) { - if(part.id.isNotEmpty) - _partsMap[part.id] = part.quantity; - }); - _map["parts"] = json.encode(_partsMap); + _map["sparePartsWorkOrders"] = parts.map((e) => e.toJson()).toList(); } - 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(operatingHours != null && operatingHours.isNotEmpty) _map["operation_hours"] = operatingHours; - if(callLastSituation != null) _map["call_last_situtation"] = callLastSituation.id.toString(); - if(image != null) _map["image"] = image; - if(invoiceCode != null) _map["invoice_no"] = invoiceCode; - if(invoiceNumber != null) _map["invoice_code"] = invoiceNumber; + if(device != null && device.id != null){ + _map["callRequest"] = { + "id":request.id, + "asset":device?.toMap(assetType), + }; + _map["callRequest"]["asset"]["invoiceNumber"] = invoiceNumber; + } + _map["AssignedEmployee"] = engineer?.toMap(); + //if(quantity != null && quantity.isNotEmpty) _map["qty"] = quantity; + //if(endDate != null) _map["end_date"] = (endDate.millisecondsSinceEpoch ~/ 1000).toString(); + if(reason != null) _map["reason"] = reason.toMap(); + //if(operatingHours != null && operatingHours.isNotEmpty) _map["operation_hours"] = operatingHours; + if(callLastSituation != null) _map["calllastSituation"] = callLastSituation.toMap(); + //if(image != null) _map["image"] = image; + //if(invoiceCode != null) _map["invoice_no"] = invoiceCode; + //if(invoiceNumber != null) _map["invoice_code"] = invoiceNumber; + if(image != null){ + _map["attachmentsWorkOrder"]=[{ + "name":image + }]; + } + _map["nurseSignature"] = signatureNurse; + _map["engSignature"] = signatureEngineer; return _map; } bool validate(){ if(visitDate == null) return false; - if(serviceType == null) return false; + //if(serviceType == null) return false; if(status == null) return false; if(type == null) return false; + if(engineer == null) return false; if(callLastSituation == null) return false; - if(callLastSituation?.id == 12){ - if(invoiceCode != null || invoiceCode?.isEmpty == true) return false; + if(callLastSituation?.value == 12){ + // if(invoiceCode != null || invoiceCode?.isEmpty == true) return false; if(invoiceNumber != null || invoiceNumber?.isEmpty== true ) return false; } if(parts == null) return false; //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; } - factory ServiceReport.fromJson(Map parsedJson,String id){ + factory ServiceReport.fromJson(Map parsedJson,int id){ List _parts = []; - if(parsedJson["parts"] != null){ - if(parsedJson["parts"][0]["id"] != null){ - List partsList = parsedJson["parts"]; - _parts = partsList.map((e) => Part.fromJson(e)).toList(); + if(parsedJson["sparePartsWorkOrders"] != null){ + if(parsedJson["sparePartsWorkOrders"][0]["id"] != null){ + List partsList = parsedJson["sparePartsWorkOrders"]; + _parts = partsList.map((e) => Part.fromJson( + e["sparePart"],reportJson: e)).toList(); } } return ServiceReport( id: id, - serviceType: Lookup.fromJson(parsedJson["service_type"]), - callLastSituation: Lookup.fromJson(parsedJson["call_last_situtation"]), - reason: Lookup.fromJson(parsedJson["reasons"]), - status: Lookup.fromJson(parsedJson["service_report_status"]), - type: Lookup.fromJson(parsedJson["service_report_type"]), - faultDescription: parsedJson["fault_description"], - endDate:getDate(parsedJson["end_date"]), - invoiceCode: parsedJson["invoice_code"], - invoiceNumber: parsedJson["invoice_no"], - jobSheetNumber: parsedJson["job_sheet_no"], - operatingHours: parsedJson["operation_hours"], + assetType: Lookup.fromJson(parsedJson["assetType"]), + callLastSituation: Lookup.fromJson(parsedJson["calllastSituation"]), + reason: Lookup.fromJson(parsedJson["reason"]), + status: Lookup.fromJson(parsedJson["status"]), + type: Lookup.fromJson(parsedJson["typeOfWO"]), + //faultDescriptionId: parsedJson["fault_description"], + endDate:DateTime.tryParse(parsedJson["endofWorkTime"]), + //invoiceCode: parsedJson["invoice_code"], + //invoiceNumber: parsedJson["invoice_no"], + //jobSheetNumber: parsedJson["job_sheet_no"], + //operatingHours: parsedJson["workingHours"], + engineer: Engineer.fromJson(parsedJson["assignedEmployee"]), parts: _parts, - quantity: parsedJson["nid"], - travelingHours: parsedJson["traveling_hours"], - visitDate: getDate(parsedJson["visit_date"]), + //quantity: parsedJson["nid"], + //travelingHours: parsedJson["traveling_hours"], + visitDate: DateTime.tryParse(parsedJson["visitDate"]), //workHours: parsedJson["working_hours"], timer: TimerModel( - durationInSecond: (int.tryParse(parsedJson["working_hours"] ?? "") ?? 0) * 60 *60), - workPreformed: parsedJson["work_performed"], - device: parsedJson["eq_nid"] == null ? null : Device(id: parsedJson["eq_nid"],serialNumber: parsedJson["eq_serial"]) + startAt: DateTime.tryParse(parsedJson["startofWorkTime"]), + endAt: DateTime.tryParse(parsedJson["endofWorkTime"]), + durationInSecond: ((parsedJson["workingHours"] ?? 0) * 60 *60).toInt() + ), + //workPreformed: parsedJson["work_performed"], + device: Device.fromJson(parsedJson["callRequest"]["asset"]), + signatureNurse: URLs.getFileUrl(parsedJson["nurseSignature"]) , + signatureEngineer:URLs.getFileUrl(parsedJson["engSignature"]), ); } - static getDate(String date){ - return date == null || date.isEmpty - ? null : DateTime.fromMillisecondsSinceEpoch(int.tryParse(date) * 1000); - } + // static getDate(String date){ + // return date == null || date.isEmpty + // ? null : DateTime.fromMillisecondsSinceEpoch(int.tryParse(date) * 1000); + // } } \ No newline at end of file diff --git a/lib/models/service_request/service_request.dart b/lib/models/service_request/service_request.dart index edf66852..434f8de7 100644 --- a/lib/models/service_request/service_request.dart +++ b/lib/models/service_request/service_request.dart @@ -1,16 +1,18 @@ +import 'package:test_sa/controllers/api_routes/urls.dart'; +import 'package:test_sa/models/device/device.dart'; import 'package:test_sa/models/lookup.dart'; class ServiceRequest{ 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; @@ -26,10 +28,13 @@ class ServiceRequest{ String visitDate; DateTime nextVisitDate; String jobSheetNumber; - String reportID; + int reportID; String deviceNumber; Lookup priority; Lookup defectType; + Lookup type; + Lookup requestedThrough; + Device device; ServiceRequest({ this.id, @@ -61,42 +66,54 @@ class ServiceRequest{ this.defectType, this.priority, this.deviceNumber, - + this.type, + this.requestedThrough, + this.device, }); 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"] != null ? + parsedJson["workOrder"]["workOrderId"] : null, + viewReport: parsedJson["workOrder"] != null, + deviceModel: parsedJson["asset"]["modelDefinition"]["modelName"], + engineerMobile: parsedJson["assignedEmployee"] == null ? null : + parsedJson["assignedEmployee"]["phone"], + faultDescription: parsedJson["workOrder"] != null ? + parsedJson["workOrder"]["faultDescription"] : null, + jobSheetNumber: parsedJson["workOrder"] != null ? + parsedJson["workOrder"]["jobSheetNumber"] :null, + visitDate: DateTime.tryParse(parsedJson["visitDate"] ?? "").toString().split(" ").first, + nextVisitDate: DateTime.tryParse(parsedJson["nextVisitDate"] ?? ""), + workPerformed: parsedJson["workOrder"] != null ? + parsedJson["workOrder"]["workPerformed"] : null, + device: Device.fromJson(parsedJson["asset"]) ); } } \ No newline at end of file diff --git a/lib/models/service_request/service_request_search.dart b/lib/models/service_request/service_request_search.dart index 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 caa9e7fb..aea639a8 100644 --- a/lib/models/user.dart +++ b/lib/models/user.dart @@ -3,12 +3,11 @@ import 'package:test_sa/models/department.dart'; import 'package:test_sa/models/enums/user_types.dart'; import 'package:test_sa/models/hospital.dart'; -class User { +class User{ String id; String userName; String password; String email; - String image; Hospital hospital; Department department; UsersTypes type; @@ -16,96 +15,108 @@ class User { String whatsApp; String token; bool isActive; + DateTime tokenLife; - User( - {this.id, - this.userName = "", - this.email = "", - this.password = "", - this.phoneNumber = "", - this.hospital, - this.image, - this.department, - this.type, - this.whatsApp, - this.token, - this.isActive = false}); + + User({ + this.id, + this.userName = "", + this.email = "", + this.password = "", + this.phoneNumber = "", + this.hospital, + this.department, + this.type, + this.whatsApp, + this.token, + this.tokenLife, + this.isActive = false + }); Future> toLoginJson() async { - if (FirebaseNotificationManger.token == null) await FirebaseNotificationManger.getToken(); + if(FirebaseNotificationManger.token == null) + await FirebaseNotificationManger.getToken(); return { - "username": userName, - "pass": password, + "username":userName, + "password":password, "firebase_token": FirebaseNotificationManger?.token ?? "", }; } - Map toUpdateProfileJson() { - Map jsonObject = {}; - if (department?.id != null && department.id.isNotEmpty) jsonObject["department"] = department.id; - if (whatsApp != null && whatsApp.isNotEmpty) jsonObject["whatsapp"] = whatsApp; - if (phoneNumber != null && phoneNumber.isNotEmpty) jsonObject["phone"] = phoneNumber; + Map toUpdateProfileJson(){ + Map jsonObject ={}; + if(department?.id != null) + jsonObject["department"] = department.id; + if(whatsApp != null && whatsApp.isNotEmpty) + jsonObject["whatsapp"] = whatsApp; + if(phoneNumber != null && phoneNumber.isNotEmpty) + jsonObject["phone"] = phoneNumber; return jsonObject; } Future> toRegisterJson() async { - if (FirebaseNotificationManger.token == null) await FirebaseNotificationManger.getToken(); + if(FirebaseNotificationManger.token == null) + await FirebaseNotificationManger.getToken(); return { "username": userName, - "email": email, - "whatsapp": whatsApp, - "client": hospital.id, - "department": department?.id, - "phone": phoneNumber, - "pass": password, + "email":email, + "whatsapp":whatsApp, + "client":hospital.id, + "department":department?.id, + "phone":phoneNumber, + "pass":password, "firebase_token": FirebaseNotificationManger?.token ?? "", }; } - Map toJson() { + Map toJson(){ return { - "uid": id, - "name": userName, - "email": email, - "token": token, - "phone": phoneNumber, - "whatsapp": whatsApp, - "client": hospital?.id, - "client_name": hospital?.name, - "department": department?.id, - "department_name": department?.name, - "password": password, - "picture": image, - "active": isActive ? 1 : 0, - "role": type == UsersTypes.engineer ? "field_engineer" : "normal_user", - // "token":token, pass is token + "userID":id, + "username": userName, + "email":email, + "token":token, + "phoneNumber":phoneNumber, + "whatsapp":whatsApp, + "client_id":hospital?.id, + "client_name":hospital?.name, + "department_id":department?.id, + "department_name":department?.name, + //"password":password, + "tokenlife":tokenLife.toIso8601String(), + "active":isActive, + "userRoles": type == UsersTypes.engineer + ? "value: R-6" : "value: R-5" , + // "token":token, pass is token }; } - factory User.fromJson(Map parsedJson) { + 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; } return User( - id: parsedJson["uid"], - userName: parsedJson["name"] ?? parsedJson["title"], - email: parsedJson["mail"] ?? parsedJson["email"], - hospital: Hospital(id: parsedJson["client"], name: parsedJson["client_name"]), - department: Department( - id: parsedJson["department"], - name: parsedJson["department_name"], - ), - image: parsedJson["picture"], - phoneNumber: parsedJson["phone"], - whatsApp: parsedJson["whatsapp"], - token: parsedJson["token"], - isActive: parsedJson["active"] == "1", - type: type); + id: parsedJson["userID"], + userName: parsedJson["username"], + email: parsedJson["email"], + hospital: Hospital( + id: parsedJson["client_id"], + name: parsedJson["client_name"] + ), + department: Department( + id: parsedJson["department_id"], + name: parsedJson["department_name"], + ), + phoneNumber: parsedJson["phoneNumber"], + whatsApp: parsedJson["phoneNumber"], + token: parsedJson["token"], + isActive: parsedJson["isAuthenticated"], + tokenLife: DateTime.tryParse(parsedJson["tokenlife"]??""), + type:type + ); } -} +} \ No newline at end of file diff --git a/lib/models/visits/visit.dart b/lib/models/visits/visit.dart index b6562e4c..10717be1 100644 --- a/lib/models/visits/visit.dart +++ b/lib/models/visits/visit.dart @@ -1,20 +1,22 @@ import 'package:test_sa/models/lookup.dart'; +import 'package:test_sa/models/pantry/pentry.dart'; class Visit{ - String id; + int id; String serialNumber; String expectDate; String actualDate; - String hospitalId; + int hospitalId; String hospitalName; - String deviceId; + int deviceId; + int ppmScheduleId; String deviceSerialNumber; String deviceArabicName; String deviceEnglishName; String employId; String employName; String modelAndBrand; - String contactStatus; + Pentry pentry; Lookup status; String assignTo; String deviceNumber; @@ -22,6 +24,7 @@ class Visit{ Visit({ this.id, + this.ppmScheduleId, this.serialNumber, this.hospitalId, this.hospitalName, @@ -35,35 +38,42 @@ 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"], + ppmScheduleId: parsedJson["ppmScheduleId"], + hospitalId: parsedJson["siteId"], + deviceNumber: parsedJson["assetNumber"], + hospitalName: parsedJson["siteName"], + deviceId: parsedJson["assetId"], + deviceSerialNumber: parsedJson["assetSerialNo"], + deviceEnglishName: parsedJson["assetName"], + deviceArabicName: parsedJson["assetName"], + employId: parsedJson["assignedToId"].toString(), + employName: parsedJson["assignedToName"], + expectDate: parsedJson["expectedDate"].toString().split("T").first, + actualDate: parsedJson["actualDate"].toString().split("T").first, + modelAndBrand: "${parsedJson["modelName"]} / ${parsedJson["manufacturerName"]}", + // contactStatus: parsedJson["contactStatus"], + images: images, status: Lookup( - id: 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..57f377ae 100644 --- a/lib/models/visits/visits_group.dart +++ b/lib/models/visits/visits_group.dart @@ -1,43 +1,46 @@ -import 'package:test_sa/models/lookup.dart'; +import 'package:test_sa/models/engineer.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/app_style/colors.dart b/lib/views/app_style/colors.dart index b6200b0e..9e4ad36f 100644 --- a/lib/views/app_style/colors.dart +++ b/lib/views/app_style/colors.dart @@ -1,5 +1,4 @@ import 'package:flutter/material.dart'; -import 'package:test_sa/models/lookup.dart'; class AColors { AColors._(); static const Color white = Color(0xffffffff); diff --git a/lib/views/pages/device_transfer/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 eaaed184..6eb86d08 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'; @@ -35,7 +35,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(); @@ -59,7 +59,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..d3e3e479 100644 --- a/lib/views/pages/device_transfer/update_device_transfer.dart +++ b/lib/views/pages/device_transfer/update_device_transfer.dart @@ -4,7 +4,6 @@ import 'package:flutter/foundation.dart'; import 'package:flutter/material.dart'; import 'package:fluttertoast/fluttertoast.dart'; import 'package:provider/provider.dart'; -import 'package:test_sa/controllers/http_status_manger/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 +68,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 +196,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 33372b50..4d872ac9 100644 --- a/lib/views/pages/login.dart +++ b/lib/views/pages/login.dart @@ -1,7 +1,6 @@ import 'package:flutter/material.dart'; -import 'package:fluttertoast/fluttertoast.dart'; import 'package:provider/provider.dart'; -import 'package:test_sa/controllers/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'; @@ -9,7 +8,6 @@ import 'package:test_sa/controllers/validator/validator.dart'; import 'package:test_sa/models/subtitle.dart'; import 'package:test_sa/models/user.dart'; import 'package:test_sa/views/app_style/sizing.dart'; -import 'package:test_sa/views/pages/register.dart'; import 'package:test_sa/views/pages/user/land_page.dart'; import 'package:test_sa/views/widgets/app_text_form_field.dart'; import 'package:test_sa/views/widgets/buttons/app_button.dart'; @@ -119,11 +117,13 @@ class _LoginState extends State { ); if (status >= 200 && status < 300) { _settingProvider.setUser(_userProvider.user); - if (_userProvider.user.isActive) + // if (_userProvider.user.isActive) Navigator.of(context).pushNamed(LandPage.id); - else - Fluttertoast.showToast(msg: _subtitle.activationAlert); + // else + // Fluttertoast.showToast(msg: _subtitle.activationAlert); } else { + if(status >= 400 && status < 500) return; + String errorMessage = status == 400 ? _subtitle.wrongEmailOrPassword : HttpStatusManger.getStatusMessage(status: status, subtitle: _subtitle); ScaffoldMessenger.of(context).showSnackBar(SnackBar( content: Text(errorMessage), diff --git a/lib/views/pages/register.dart b/lib/views/pages/register.dart index af5f83cd..22cd7d91 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 a7bfa347..bd7a770f 100644 --- a/lib/views/pages/splash_screen.dart +++ b/lib/views/pages/splash_screen.dart @@ -1,7 +1,6 @@ import 'dart:convert'; import 'package:firebase_core/firebase_core.dart'; -import 'package:firebase_messaging/firebase_messaging.dart'; import 'package:flare_flutter/flare_actor.dart'; import 'package:flutter/material.dart'; import 'package:provider/provider.dart'; @@ -28,9 +27,11 @@ class _SplashScreenState extends State { UserProvider _userProvider; _goToUserScreen(User user){ - _userProvider.user = user; - // Navigator.of(context).pushNamed(Login.id); - Navigator.of(context).pushNamed(LandPage.id); + 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 @@ -67,7 +68,6 @@ class _SplashScreenState extends State { fit: BoxFit.contain, animation: "splash", callback: (animation) async { - print(await FirebaseMessaging.instance.getToken()); Navigator.of(context).pushNamed(Login.id); if(_settingProvider.isLoaded && _settingProvider.user != null){ _goToUserScreen(_settingProvider.user); diff --git a/lib/views/pages/user/gas_refill/gas_refill_details.dart b/lib/views/pages/user/gas_refill/gas_refill_details.dart index d1d41eac..bed4999d 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'; @@ -176,7 +176,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 8e1f05ca..6dfcb72e 100644 --- a/lib/views/pages/user/gas_refill/request_gas_refill.dart +++ b/lib/views/pages/user/gas_refill/request_gas_refill.dart @@ -1,13 +1,14 @@ 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'; @@ -15,6 +16,7 @@ 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'; @@ -155,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) @@ -180,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) @@ -206,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: 16), diff --git a/lib/views/pages/user/land_page.dart b/lib/views/pages/user/land_page.dart index dd37a8af..eb4a57e6 100644 --- a/lib/views/pages/user/land_page.dart +++ b/lib/views/pages/user/land_page.dart @@ -26,7 +26,6 @@ import 'package:test_sa/views/pages/device_transfer/request_device_transfer.dart import 'package:test_sa/views/pages/device_transfer/track_device_transfer.dart'; import 'package:test_sa/views/pages/user/gas_refill/request_gas_refill.dart'; import 'package:test_sa/views/pages/user/gas_refill/track_gas_refill.dart'; -import 'package:test_sa/views/pages/user/notifications/notifications_page.dart'; import 'package:test_sa/views/pages/user/requests/create_request.dart'; import 'package:test_sa/views/pages/user/visits/regular_visits_page.dart'; import 'package:test_sa/views/widgets/buttons/app_back_button.dart'; @@ -235,6 +234,7 @@ class _LandPageState extends State { _regularVisitsProvider.reset(); _preventiveMaintenanceVisitsProvider.reset(); _settingProvider.resetSettings(); + _userProvider.reset(); Navigator.of(context).pop(); } }, diff --git a/lib/views/pages/user/notifications/notifications_list.dart b/lib/views/pages/user/notifications/notifications_list.dart index 2df3171d..6034f1aa 100644 --- a/lib/views/pages/user/notifications/notifications_list.dart +++ b/lib/views/pages/user/notifications/notifications_list.dart @@ -1,3 +1,4 @@ +import 'package:flutter/material.dart'; import 'package:test_sa/controllers/localization/localization.dart'; import 'package:test_sa/models/app_notification.dart'; import 'package:test_sa/models/subtitle.dart'; @@ -5,7 +6,6 @@ import 'package:test_sa/views/pages/user/requests/future_request_service_details import 'package:test_sa/views/widgets/loaders/lazy_loading.dart'; import 'package:test_sa/views/widgets/loaders/no_item_found.dart'; import 'package:test_sa/views/widgets/notifications/notification_item.dart'; -import 'package:flutter/material.dart'; class NotificationsList extends StatelessWidget { final List notifications; final bool nextPage; diff --git a/lib/views/pages/user/profile_page.dart b/lib/views/pages/user/profile_page.dart index 514655e9..0b3757a0 100644 --- a/lib/views/pages/user/profile_page.dart +++ b/lib/views/pages/user/profile_page.dart @@ -1,4 +1,7 @@ -import 'package:test_sa/controllers/http_status_manger/http_status_manger.dart'; +import 'package:flutter/material.dart'; +import 'package:font_awesome_flutter/font_awesome_flutter.dart'; +import 'package:provider/provider.dart'; +import 'package:test_sa/controllers/api_routes/http_status_manger.dart'; import 'package:test_sa/controllers/localization/localization.dart'; import 'package:test_sa/controllers/providers/api/user_provider.dart'; import 'package:test_sa/controllers/providers/settings/setting_provider.dart'; @@ -13,9 +16,6 @@ import 'package:test_sa/views/widgets/buttons/app_button.dart'; import 'package:test_sa/views/widgets/departments/department_button.dart'; import 'package:test_sa/views/widgets/hospitals/hospital_button.dart'; import 'package:test_sa/views/widgets/loaders/loading_manager.dart'; -import 'package:flutter/material.dart'; -import 'package:font_awesome_flutter/font_awesome_flutter.dart'; -import 'package:provider/provider.dart'; class ProfilePage extends StatefulWidget { static final String id = "/user/profile"; @override diff --git a/lib/views/pages/user/requests/create_request.dart b/lib/views/pages/user/requests/create_request.dart index 86b819e8..b5c71478 100644 --- a/lib/views/pages/user/requests/create_request.dart +++ b/lib/views/pages/user/requests/create_request.dart @@ -5,7 +5,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/service_requests_provider.dart'; import 'package:test_sa/controllers/providers/api/user_provider.dart'; @@ -14,6 +14,7 @@ import 'package:test_sa/controllers/validator/validator.dart'; import 'package:test_sa/extensions/int_extensions.dart'; import 'package:test_sa/extensions/widget_extensions.dart'; import 'package:test_sa/models/device/device.dart'; +import 'package:test_sa/models/lookup.dart'; import 'package:test_sa/models/service_request/service_request.dart'; import 'package:test_sa/models/subtitle.dart'; import 'package:test_sa/views/app_style/colors.dart'; @@ -27,8 +28,9 @@ 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"; @@ -153,6 +155,25 @@ class _CreateRequestPageState extends State { }, ), 12.height, + 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; + }, + ), + 12.height, MultiImagesPicker( label: _subtitle.deviceImages, images: _deviceImages, @@ -189,10 +210,11 @@ class _CreateRequestPageState extends State { _serviceRequest.deviceId = _device?.id ?? ""; _isLoading = true; setState(() {}); - _serviceRequest.devicePhotos = _deviceImages.map((e) => base64Encode(e.readAsBytesSync())).toList(); - if (_serviceRequest.audio != null) { + _serviceRequest.devicePhotos = _deviceImages.map( + (e) => "${e.path.split("/").last}|${base64Encode(e.readAsBytesSync())}").toList(); + if(_serviceRequest.audio != null){ final file = File(_serviceRequest.audio); - _serviceRequest.audio = 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/future_request_service_details.dart b/lib/views/pages/user/requests/future_request_service_details.dart index 7f56dd5f..1c2dbe38 100644 --- a/lib/views/pages/user/requests/future_request_service_details.dart +++ b/lib/views/pages/user/requests/future_request_service_details.dart @@ -1,3 +1,5 @@ +import 'package:flutter/material.dart'; +import 'package:provider/provider.dart'; import 'package:test_sa/controllers/localization/localization.dart'; import 'package:test_sa/controllers/providers/api/service_requests_provider.dart'; import 'package:test_sa/controllers/providers/api/user_provider.dart'; @@ -7,8 +9,6 @@ import 'package:test_sa/models/subtitle.dart'; import 'package:test_sa/views/pages/user/requests/request_details.dart'; import 'package:test_sa/views/widgets/loaders/app_loading.dart'; import 'package:test_sa/views/widgets/loaders/failed_loading.dart'; -import 'package:flutter/material.dart'; -import 'package:provider/provider.dart'; class FutureRequestServiceDetails extends StatefulWidget { static final String id = "/service-request-details"; diff --git a/lib/views/pages/user/requests/report/create_service_report.dart b/lib/views/pages/user/requests/report/create_service_report.dart index b9f353be..2c1c2b43 100644 --- a/lib/views/pages/user/requests/report/create_service_report.dart +++ b/lib/views/pages/user/requests/report/create_service_report.dart @@ -1,14 +1,17 @@ import 'dart:convert'; import 'dart:io'; -import 'package:test_sa/controllers/http_status_manger/http_status_manger.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter/rendering.dart'; +import 'package:fluttertoast/fluttertoast.dart'; +import 'package:provider/provider.dart'; +import 'package:test_sa/controllers/api_routes/http_status_manger.dart'; import 'package:test_sa/controllers/localization/localization.dart'; -import 'package:test_sa/controllers/providers/api/status_drop_down/report/service_report_last_calls_provider.dart'; import 'package:test_sa/controllers/providers/api/service_requests_provider.dart'; +import 'package:test_sa/controllers/providers/api/status_drop_down/report/service_report_last_calls_provider.dart'; import 'package:test_sa/controllers/providers/api/user_provider.dart'; import 'package:test_sa/controllers/providers/settings/setting_provider.dart'; import 'package:test_sa/controllers/validator/validator.dart'; -import 'package:test_sa/models/device/device.dart'; import 'package:test_sa/models/part.dart'; import 'package:test_sa/models/service_report.dart'; import 'package:test_sa/models/service_request/service_request.dart'; @@ -20,12 +23,13 @@ import 'package:test_sa/views/widgets/app_text_form_field.dart'; import 'package:test_sa/views/widgets/buttons/app_back_button.dart'; import 'package:test_sa/views/widgets/buttons/app_button.dart'; import 'package:test_sa/views/widgets/date_and_time/date_picker.dart'; +import 'package:test_sa/views/widgets/e_signature/e_signature.dart'; import 'package:test_sa/views/widgets/equipment/auto_complete_devices_field.dart'; import 'package:test_sa/views/widgets/images/mini_one_image_picker.dart'; import 'package:test_sa/views/widgets/loaders/loading_manager.dart'; import 'package:test_sa/views/widgets/parts/auto_complete_parts_field.dart'; import 'package:test_sa/views/widgets/parts/part_item.dart'; -import 'package:test_sa/views/widgets/speech_to_text/speech_to_text.dart'; +import 'package:test_sa/views/widgets/status/employee/engineers_mune.dart'; import 'package:test_sa/views/widgets/status/report/service_report_last_call.dart'; import 'package:test_sa/views/widgets/status/report/service_report_reasons.dart'; import 'package:test_sa/views/widgets/status/report/service_report_status.dart'; @@ -33,10 +37,6 @@ import 'package:test_sa/views/widgets/status/report/service_report_type.dart'; import 'package:test_sa/views/widgets/status/report/service_status.dart'; import 'package:test_sa/views/widgets/timer/app_timer.dart'; import 'package:test_sa/views/widgets/titles/app_sub_title.dart'; -import 'package:flutter/material.dart'; -import 'package:flutter/rendering.dart'; -import 'package:fluttertoast/fluttertoast.dart'; -import 'package:provider/provider.dart'; class CreateServiceReport extends StatefulWidget { static final String id = "/create-service-report"; final ServiceRequest request ; @@ -68,11 +68,8 @@ class _CreateServiceReportState extends State with TickerPr void initState() { _serviceReport = ServiceReport( visitDate: DateTime.now(), - type: const Lookup(id: 2), - device: Device( - id: widget.request.deviceId, - serialNumber: widget.request.deviceSerialNumber, - ), + //type: const Lookup(value: 2), + device: widget.request.device, parts: [] ); super.initState(); @@ -232,14 +229,14 @@ class _CreateServiceReportState extends State with TickerPr ), const SizedBox(height: 8,), ASubTitle(_subtitle.serviceType), - _validate && _serviceReport.serviceType == null ? + _validate && _serviceReport.assetType == null ? ASubTitle(_subtitle.requiredWord,color: Colors.red,): const SizedBox.shrink(), const SizedBox(height: 4,), - ServiceStatusMenu( - initialValue: _serviceReport.serviceType, + ServiceAssetTypeMenu( + initialValue: _serviceReport.assetType, onSelect: (status){ - _serviceReport.serviceType = status; + _serviceReport.assetType = status; }, ), const SizedBox(height: 8,), @@ -266,36 +263,53 @@ class _CreateServiceReportState extends State with TickerPr ), ), const SizedBox(width: 8,), - Provider.of(context).isLoading == null - ? const SizedBox.shrink(): + // Provider.of(context).isLoading == null + // ? const SizedBox.shrink(): // Call's last Situation - Expanded( - child: Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - - ASubTitle(_subtitle.callLastSituation), - _validate && _serviceReport.callLastSituation == null ? - ASubTitle(_subtitle.requiredWord,color: Colors.red,): - const SizedBox.shrink(), - const SizedBox(height: 4,), - ServiceReportLastCallsMenu( - report: _serviceReport, - onSelect: (status){ - if(status?.id == 12 - || _serviceReport.callLastSituation?.id == 12){ - _serviceReport.callLastSituation = status; - setState(() {}); - } else { - _serviceReport.callLastSituation = status; - } - }, + Consumer( + builder: (_, provider, __) { + if(provider.isLoading == null) return const SizedBox.shrink(); + return Expanded( + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + ASubTitle(_subtitle.callLastSituation), + _validate && _serviceReport.callLastSituation == null ? + ASubTitle(_subtitle.requiredWord,color: Colors.red,): + const SizedBox.shrink(), + const SizedBox(height: 4,), + ServiceReportLastCallsMenu( + report: _serviceReport, + onSelect: (status){ + if(status?.value == 12 + || _serviceReport.callLastSituation?.value == 12){ + _serviceReport.callLastSituation = status; + setState(() {}); + } else { + _serviceReport.callLastSituation = status; + } + }, + ), + ], ), - ], - ), + ); + }, ), ], ), + SizedBox(height: 8 * AppStyle.getScaleFactor(context),), + const ASubTitle("Assign Employee"), + const SizedBox(height: 8,), + _validate && _serviceReport.engineer == null ? + ASubTitle(_subtitle.requiredWord,color: Colors.red,): + const SizedBox.shrink(), + const SizedBox(height: 4,), + EngineersMenu( + initialValue: _serviceReport.engineer, + onSelect: (engineer){ + _serviceReport.engineer = engineer; + }, + ), const SizedBox(height: 8,), // invoice number & code _serviceReport.callLastSituation?.id != 12 ? const SizedBox.shrink(): @@ -347,65 +361,65 @@ class _CreateServiceReportState extends State with TickerPr ], ), - const SizedBox(height: 8,), - Row( - children: [ - ASubTitle(_subtitle.faultDescription), - Expanded( - child: SizedBox( - height: 32 * AppStyle.getScaleFactor(context), - child: SpeechToTextButton( - controller: _faultController, - mini: true, - ), - ), - ), - ], - ), - const SizedBox(height: 4,), - ATextFormField( - initialValue: _serviceReport?.faultDescription, - textAlign: TextAlign.center, - controller: _faultController, - style: Theme.of(context).textTheme.subtitle1, - validator: (value) => - Validator.hasValue(value) - ? null : _subtitle.requiredWord, - textInputType: TextInputType.multiline, - onSaved: (value){ - _serviceReport.faultDescription = value; - }, - ), - const SizedBox(height: 8,), - Row( - children: [ - ASubTitle(_subtitle.workPreformed), - Expanded( - child: SizedBox( - height: 32 * AppStyle.getScaleFactor(context), - child: SpeechToTextButton( - controller: _workPreformedController, - mini: true, - ), - ), - ), - ], - ), - const SizedBox(height: 4,), - ATextFormField( - initialValue: _serviceReport?.workPreformed, - textAlign: TextAlign.center, - controller: _workPreformedController, - style: Theme.of(context).textTheme.subtitle1, - validator: (value) => - Validator.hasValue(value) - ? null : _subtitle.requiredWord, - textInputType: TextInputType.multiline, - onSaved: (value){ - _serviceReport.workPreformed = value; - }, - ), - const SizedBox(height: 8,), + // const SizedBox(height: 8,), + // Row( + // children: [ + // ASubTitle(_subtitle.faultDescription), + // Expanded( + // child: SizedBox( + // height: 32 * AppStyle.getScaleFactor(context), + // child: SpeechToTextButton( + // controller: _faultController, + // mini: true, + // ), + // ), + // ), + // ], + // ), + // const SizedBox(height: 4,), + // ATextFormField( + // initialValue: _serviceReport?.faultDescriptionId, + // textAlign: TextAlign.center, + // controller: _faultController, + // style: Theme.of(context).textTheme.subtitle1, + // validator: (value) => + // Validator.hasValue(value) + // ? null : _subtitle.requiredWord, + // textInputType: TextInputType.multiline, + // onSaved: (value){ + // _serviceReport.faultDescriptionId = value; + // }, + // ), + // const SizedBox(height: 8,), + // Row( + // children: [ + // ASubTitle(_subtitle.workPreformed), + // Expanded( + // child: SizedBox( + // height: 32 * AppStyle.getScaleFactor(context), + // child: SpeechToTextButton( + // controller: _workPreformedController, + // mini: true, + // ), + // ), + // ), + // ], + // ), + // const SizedBox(height: 4,), + // ATextFormField( + // initialValue: _serviceReport?.workPreformed, + // textAlign: TextAlign.center, + // controller: _workPreformedController, + // style: Theme.of(context).textTheme.subtitle1, + // validator: (value) => + // Validator.hasValue(value) + // ? null : _subtitle.requiredWord, + // textInputType: TextInputType.multiline, + // onSaved: (value){ + // _serviceReport.workPreformed = value; + // }, + // ), + // const SizedBox(height: 8,), const SizedBox(height: 8,), Row( @@ -437,7 +451,7 @@ class _CreateServiceReportState extends State with TickerPr image: _image, onPick: (image){ _image =image; - _serviceReport.image = base64Encode(image.readAsBytesSync()); + _serviceReport.image = "${image.path.split("/").last}|${base64Encode(image.readAsBytesSync())}"; }, ), ], @@ -455,12 +469,18 @@ class _CreateServiceReportState extends State with TickerPr children: [ ASubTitle(_subtitle.workingHours), const SizedBox(height: 8,), - AppTimer( - timer: _serviceReport.timer, - onChange: (timer) async{ - _serviceReport.timer = timer; - return true; - }, + Row( + children: [ + Expanded( + child: AppTimer( + timer: _serviceReport.timer, + onChange: (timer) async{ + _serviceReport.timer = timer; + return true; + }, + ), + ), + ], ), // ATextFormField( // initialValue: _serviceReport?.workHours, @@ -478,79 +498,102 @@ class _CreateServiceReportState extends State with TickerPr ], ), ), - const SizedBox(width: 8,), - Expanded( - child: Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - ASubTitle(_subtitle.travelingHours), - const SizedBox(height: 4,), - ATextFormField( - initialValue: _serviceReport?.travelingHours, - textAlign: TextAlign.center, - hintText: "i.e 3, 3.5, 4", - style: Theme.of(context).textTheme.subtitle1, - // validator: (value) => - // Validator.isNumeric(value) - // ? null : _subtitle.requiredWord, - textInputType: TextInputType.number, - onSaved: (value){ - _serviceReport.travelingHours = value; - }, - ), - ], - ), - ), - ], - ), - const SizedBox(height: 8,), - // Operating Hours and Job Sheet Number - Row( - children: [ + // const SizedBox(width: 8,), // Expanded( // child: Column( // crossAxisAlignment: CrossAxisAlignment.start, // children: [ - // ASubTitle(_subtitle.operatingHours), + // ASubTitle(_subtitle.travelingHours), // const SizedBox(height: 4,), // ATextFormField( - // initialValue: _serviceReport?.operatingHours, + // initialValue: _serviceReport?.travelingHours, // textAlign: TextAlign.center, // hintText: "i.e 3, 3.5, 4", // style: Theme.of(context).textTheme.subtitle1, - // validator: (value) => - // Validator.isNumeric(value) - // ? null : _subtitle.requiredWord, + // // validator: (value) => + // // Validator.isNumeric(value) + // // ? null : _subtitle.requiredWord, // textInputType: TextInputType.number, // onSaved: (value){ - // _serviceReport.operatingHours = value; + // _serviceReport.travelingHours = value; // }, // ), // ], // ), // ), - // const SizedBox(width: 8,), - Expanded( - child: Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - ASubTitle(_subtitle.jobSheetNumber), - const SizedBox(height: 4,), - ATextFormField( - initialValue: _serviceReport?.jobSheetNumber, - textAlign: TextAlign.center, - style: Theme.of(context).textTheme.subtitle1, - textInputType: TextInputType.name, - onSaved: (value){ - _serviceReport.jobSheetNumber = value; - }, - ), - ], - ), - ), ], ), const SizedBox(height: 8,), + // Operating Hours and Job Sheet Number + // Row( + // children: [ + // Expanded( + // child: Column( + // crossAxisAlignment: CrossAxisAlignment.start, + // children: [ + // ASubTitle(_subtitle.operatingHours), + // const SizedBox(height: 4,), + // ATextFormField( + // initialValue: _serviceReport?.operatingHours, + // textAlign: TextAlign.center, + // hintText: "i.e 3, 3.5, 4", + // style: Theme.of(context).textTheme.subtitle1, + // validator: (value) => + // Validator.isNumeric(value) + // ? null : _subtitle.requiredWord, + // textInputType: TextInputType.number, + // onSaved: (value){ + // _serviceReport.operatingHours = value; + // }, + // ), + // ], + // ), + // ), + // const SizedBox(width: 8,), + // Expanded( + // child: Column( + // crossAxisAlignment: CrossAxisAlignment.start, + // children: [ + // ASubTitle(_subtitle.jobSheetNumber), + // const SizedBox(height: 4,), + // ATextFormField( + // initialValue: _serviceReport?.jobSheetNumber, + // textAlign: TextAlign.center, + // style: Theme.of(context).textTheme.subtitle1, + // textInputType: TextInputType.name, + // onSaved: (value){ + // _serviceReport.jobSheetNumber = value; + // }, + // ), + // ], + // ), + // ), + // ], + // ), + //const SizedBox(height: 8,), + const SizedBox(height: 8,), + const ASubTitle("Nurse Signature"), + ESignature( + oldSignature: _serviceReport.signatureNurse, + newSignature: _serviceReport.localNurseSignature, + onChange: (signature){ + if(signature == null || signature.isEmpty) {return;} + _serviceReport.localNurseSignature = signature; + _serviceReport.signatureNurse = "${DateTime.now().toIso8601String()}.png|${base64Encode(signature)}"; + }, + ), + const SizedBox(height: 8,), + const ASubTitle("Engineer Signature"), + ESignature( + oldSignature: _serviceReport.signatureEngineer, + newSignature: _serviceReport.localNurseSignature, + onChange: (signature){ + if(signature == null || signature.isEmpty) {return;} + _serviceReport.localNurseSignature = signature; + _serviceReport.signatureEngineer = "${DateTime.now().toIso8601String()}.png|${base64Encode(signature)}"; + }, + ), + const SizedBox(height: 8,), // Part Number and Quantity Row( children: [ @@ -597,7 +640,6 @@ class _CreateServiceReportState extends State with TickerPr } ), ), - const SizedBox(height: 16,), ], diff --git a/lib/views/pages/user/requests/report/edit_service_report.dart b/lib/views/pages/user/requests/report/edit_service_report.dart index 0b268fc7..bfc8f4f5 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'; @@ -22,12 +22,13 @@ import 'package:test_sa/views/widgets/app_text_form_field.dart'; import 'package:test_sa/views/widgets/buttons/app_back_button.dart'; import 'package:test_sa/views/widgets/buttons/app_button.dart'; import 'package:test_sa/views/widgets/date_and_time/date_picker.dart'; +import 'package:test_sa/views/widgets/e_signature/e_signature.dart'; import 'package:test_sa/views/widgets/equipment/auto_complete_devices_field.dart'; import 'package:test_sa/views/widgets/images/mini_one_image_picker.dart'; import 'package:test_sa/views/widgets/loaders/loading_manager.dart'; import 'package:test_sa/views/widgets/parts/auto_complete_parts_field.dart'; import 'package:test_sa/views/widgets/parts/part_item.dart'; -import 'package:test_sa/views/widgets/speech_to_text/speech_to_text.dart'; +import 'package:test_sa/views/widgets/status/employee/engineers_mune.dart'; import 'package:test_sa/views/widgets/status/report/service_report_last_call.dart'; import 'package:test_sa/views/widgets/status/report/service_report_reasons.dart'; import 'package:test_sa/views/widgets/status/report/service_report_status.dart'; @@ -223,14 +224,28 @@ class _EditServiceReportState extends State with TickerProvid ), const SizedBox(height: 8,), ASubTitle(_subtitle.serviceType), - _validate && _serviceReport.serviceType == null ? + _validate && _serviceReport.assetType == null ? ASubTitle(_subtitle.requiredWord,color: Colors.red,): const SizedBox.shrink(), const SizedBox(height: 4,), - ServiceStatusMenu( - initialValue: _serviceReport.serviceType, + ServiceAssetTypeMenu( + initialValue: _serviceReport.assetType, onSelect: (status){ - _serviceReport.serviceType = status; + _serviceReport.assetType = status; + }, + ), + const SizedBox(height: 8,), + SizedBox(height: 8 * AppStyle.getScaleFactor(context),), + const ASubTitle("Assign Employee"), + const SizedBox(height: 8,), + _validate && _serviceReport.engineer == null ? + ASubTitle(_subtitle.requiredWord,color: Colors.red,): + const SizedBox.shrink(), + const SizedBox(height: 4,), + EngineersMenu( + initialValue: _serviceReport.engineer, + onSelect: (engineer){ + _serviceReport.engineer = engineer; }, ), const SizedBox(height: 8,), @@ -257,39 +272,40 @@ class _EditServiceReportState extends State with TickerProvid ), ), const SizedBox(width: 8,), - Provider.of(context).isLoading == null - ? const SizedBox.shrink(): - // Call's last Situation - Expanded( - child: Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - - ASubTitle(_subtitle.callLastSituation), - _validate && _serviceReport.callLastSituation == null ? - ASubTitle(_subtitle.requiredWord,color: Colors.red,): - const SizedBox.shrink(), - const SizedBox(height: 4,), - ServiceReportLastCallsMenu( - report: _serviceReport, - onSelect: (status){ - if(status?.id == 12 - || _serviceReport.callLastSituation?.id == 12){ - _serviceReport.callLastSituation = status; - setState(() {}); - } else { - _serviceReport.callLastSituation = status; - } - }, + Consumer( + builder: (_, provider, __) { + if(provider.isLoading == null) return const SizedBox.shrink(); + return Expanded( + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + ASubTitle(_subtitle.callLastSituation), + _validate && _serviceReport.callLastSituation == null ? + ASubTitle(_subtitle.requiredWord,color: Colors.red,): + const SizedBox.shrink(), + const SizedBox(height: 4,), + ServiceReportLastCallsMenu( + report: _serviceReport, + onSelect: (status){ + if(status?.value == 12 + || _serviceReport.callLastSituation?.value == 12){ + _serviceReport.callLastSituation = status; + setState(() {}); + } else { + _serviceReport.callLastSituation = status; + } + }, + ), + ], ), - ], - ), + ); + }, ), ], ), const SizedBox(height: 8,), // invoice number & code - _serviceReport.callLastSituation?.id != 12 ? const SizedBox.shrink(): + _serviceReport.callLastSituation?.value != 12 ? const SizedBox.shrink(): Row( children: [ Expanded( @@ -338,65 +354,65 @@ class _EditServiceReportState extends State with TickerProvid ], ), - const SizedBox(height: 8,), - Row( - children: [ - ASubTitle(_subtitle.faultDescription), - Expanded( - child: SizedBox( - height: 32 * AppStyle.getScaleFactor(context), - child: SpeechToTextButton( - controller: _faultController, - mini: true, - ), - ), - ), - ], - ), - const SizedBox(height: 4,), - ATextFormField( - initialValue: _serviceReport?.faultDescription, - textAlign: TextAlign.center, - controller: _faultController, - style: Theme.of(context).textTheme.subtitle1, - validator: (value) => - Validator.hasValue(value) - ? null : _subtitle.requiredWord, - textInputType: TextInputType.multiline, - onSaved: (value){ - _serviceReport.faultDescription = value; - }, - ), - const SizedBox(height: 8,), - Row( - children: [ - ASubTitle(_subtitle.workPreformed), - Expanded( - child: SizedBox( - height: 32 * AppStyle.getScaleFactor(context), - child: SpeechToTextButton( - controller: _workPreformedController, - mini: true, - ), - ), - ), - ], - ), - const SizedBox(height: 4,), - ATextFormField( - initialValue: _serviceReport?.workPreformed, - textAlign: TextAlign.center, - controller: _workPreformedController, - style: Theme.of(context).textTheme.subtitle1, - validator: (value) => - Validator.hasValue(value) - ? null : _subtitle.requiredWord, - textInputType: TextInputType.multiline, - onSaved: (value){ - _serviceReport.workPreformed = value; - }, - ), - const SizedBox(height: 8,), + // const SizedBox(height: 8,), + // Row( + // children: [ + // ASubTitle(_subtitle.faultDescription), + // Expanded( + // child: SizedBox( + // height: 32 * AppStyle.getScaleFactor(context), + // child: SpeechToTextButton( + // controller: _faultController, + // mini: true, + // ), + // ), + // ), + // ], + // ), + // const SizedBox(height: 4,), + // ATextFormField( + // initialValue: _serviceReport?.faultDescriptionId, + // textAlign: TextAlign.center, + // controller: _faultController, + // style: Theme.of(context).textTheme.subtitle1, + // validator: (value) => + // Validator.hasValue(value) + // ? null : _subtitle.requiredWord, + // textInputType: TextInputType.multiline, + // onSaved: (value){ + // _serviceReport.faultDescriptionId = value; + // }, + // ), + // const SizedBox(height: 8,), + // Row( + // children: [ + // ASubTitle(_subtitle.workPreformed), + // Expanded( + // child: SizedBox( + // height: 32 * AppStyle.getScaleFactor(context), + // child: SpeechToTextButton( + // controller: _workPreformedController, + // mini: true, + // ), + // ), + // ), + // ], + // ), + // const SizedBox(height: 4,), + // ATextFormField( + // initialValue: _serviceReport?.workPreformed, + // textAlign: TextAlign.center, + // controller: _workPreformedController, + // style: Theme.of(context).textTheme.subtitle1, + // validator: (value) => + // Validator.hasValue(value) + // ? null : _subtitle.requiredWord, + // textInputType: TextInputType.multiline, + // onSaved: (value){ + // _serviceReport.workPreformed = value; + // }, + // ), + // const SizedBox(height: 8,), const SizedBox(height: 8,), Row( @@ -446,12 +462,18 @@ class _EditServiceReportState extends State with TickerProvid children: [ ASubTitle(_subtitle.workingHours), const SizedBox(height: 8,), - AppTimer( - timer: _serviceReport.timer, - onChange: (timer) async{ - _serviceReport.timer = timer; - return true; - }, + Row( + children: [ + Expanded( + child: AppTimer( + timer: _serviceReport.timer, + onChange: (timer) async{ + _serviceReport.timer = timer; + return true; + }, + ), + ), + ], ), // ATextFormField( // initialValue: _serviceReport?.workHours, @@ -469,77 +491,100 @@ class _EditServiceReportState extends State with TickerProvid ], ), ), - const SizedBox(width: 8,), - Expanded( - child: Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - ASubTitle(_subtitle.travelingHours), - const SizedBox(height: 4,), - ATextFormField( - initialValue: _serviceReport?.travelingHours, - textAlign: TextAlign.center, - hintText: "i.e 3, 3.5, 4", - style: Theme.of(context).textTheme.subtitle1, - validator: (value) => - Validator.isNumeric(value) - ? null : _subtitle.requiredWord, - textInputType: TextInputType.number, - onSaved: (value){ - _serviceReport.travelingHours = value; - }, - ), - ], - ), - ), + // const SizedBox(width: 8,), + // Expanded( + // child: Column( + // crossAxisAlignment: CrossAxisAlignment.start, + // children: [ + // ASubTitle(_subtitle.travelingHours), + // const SizedBox(height: 4,), + // ATextFormField( + // initialValue: _serviceReport?.travelingHours, + // textAlign: TextAlign.center, + // hintText: "i.e 3, 3.5, 4", + // style: Theme.of(context).textTheme.subtitle1, + // validator: (value) => + // Validator.isNumeric(value) + // ? null : _subtitle.requiredWord, + // textInputType: TextInputType.number, + // onSaved: (value){ + // _serviceReport.travelingHours = value; + // }, + // ), + // ], + // ), + // ), ], ), const SizedBox(height: 8,), // Operating Hours and Job Sheet Number - Row( - children: [ - Expanded( - child: Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - ASubTitle(_subtitle.operatingHours), - const SizedBox(height: 4,), - ATextFormField( - initialValue: _serviceReport?.operatingHours, - textAlign: TextAlign.center, - hintText: "i.e 3, 3.5, 4", - style: Theme.of(context).textTheme.subtitle1, - validator: (value) => - Validator.isNumeric(value) - ? null : _subtitle.requiredWord, - textInputType: TextInputType.number, - onSaved: (value){ - _serviceReport.operatingHours = value; - }, - ), - ], - ), - ), - const SizedBox(width: 8,), - Expanded( - child: Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - ASubTitle(_subtitle.jobSheetNumber), - const SizedBox(height: 4,), - ATextFormField( - initialValue: _serviceReport?.jobSheetNumber, - textAlign: TextAlign.center, - style: Theme.of(context).textTheme.subtitle1, - textInputType: TextInputType.name, - onSaved: (value){ - _serviceReport.jobSheetNumber = value; - }, - ), - ], - ), - ), - ], + // Row( + // children: [ + // Expanded( + // child: Column( + // crossAxisAlignment: CrossAxisAlignment.start, + // children: [ + // ASubTitle(_subtitle.operatingHours), + // const SizedBox(height: 4,), + // ATextFormField( + // initialValue: _serviceReport?.operatingHours, + // textAlign: TextAlign.center, + // hintText: "i.e 3, 3.5, 4", + // style: Theme.of(context).textTheme.subtitle1, + // validator: (value) => + // Validator.isNumeric(value) + // ? null : _subtitle.requiredWord, + // textInputType: TextInputType.number, + // onSaved: (value){ + // _serviceReport.operatingHours = value; + // }, + // ), + // ], + // ), + // ), + // const SizedBox(width: 8,), + // Expanded( + // child: Column( + // crossAxisAlignment: CrossAxisAlignment.start, + // children: [ + // ASubTitle(_subtitle.jobSheetNumber), + // const SizedBox(height: 4,), + // ATextFormField( + // initialValue: _serviceReport?.jobSheetNumber, + // textAlign: TextAlign.center, + // style: Theme.of(context).textTheme.subtitle1, + // textInputType: TextInputType.name, + // onSaved: (value){ + // _serviceReport.jobSheetNumber = value; + // }, + // ), + // ], + // ), + // ), + // ], + // ), + //const SizedBox(height: 8,), + const SizedBox(height: 8,), + const ASubTitle("Nurse Signature"), + ESignature( + oldSignature: _serviceReport.signatureNurse, + newSignature: _serviceReport.localNurseSignature, + onChange: (signature){ + if(signature == null || signature.isEmpty) {return;} + _serviceReport.localNurseSignature = signature; + _serviceReport.signatureNurse = "${DateTime.now().toIso8601String()}.png|${base64Encode(signature)}"; + }, + ), + const SizedBox(height: 8,), + const ASubTitle("Engineer Signature"), + ESignature( + oldSignature: _serviceReport.signatureEngineer, + newSignature: _serviceReport.localNurseSignature, + onChange: (signature){ + if(signature == null || signature.isEmpty) {return;} + _serviceReport.localNurseSignature = signature; + _serviceReport.signatureEngineer = "${DateTime.now().toIso8601String()}.png|${base64Encode(signature)}"; + }, ), const SizedBox(height: 8,), // Part Number and Quantity diff --git a/lib/views/pages/user/requests/request_details.dart b/lib/views/pages/user/requests/request_details.dart index 2ada571e..d45692d8 100644 --- a/lib/views/pages/user/requests/request_details.dart +++ b/lib/views/pages/user/requests/request_details.dart @@ -2,7 +2,6 @@ import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; import 'package:intl/intl.dart'; import 'package:provider/provider.dart'; -import 'package:test_sa/controllers/http_status_manger/http_status_manger.dart'; import 'package:test_sa/controllers/localization/localization.dart'; import 'package:test_sa/controllers/providers/api/service_requests_provider.dart'; import 'package:test_sa/controllers/providers/api/user_provider.dart'; @@ -16,7 +15,6 @@ import 'package:test_sa/views/pages/user/requests/report/create_service_report.d import 'package:test_sa/views/widgets/buttons/app_back_button.dart'; import 'package:test_sa/views/widgets/buttons/app_button.dart'; import 'package:test_sa/views/widgets/buttons/app_icon_button.dart'; -import 'package:test_sa/views/widgets/dialogs/dialog.dart'; import 'package:test_sa/views/widgets/images/images_list.dart'; import 'package:test_sa/views/widgets/loaders/image_loader.dart'; import 'package:test_sa/views/widgets/requests/info_row.dart'; @@ -25,7 +23,6 @@ import 'package:test_sa/views/widgets/requests/service_request_update_dialog.dar import 'package:test_sa/views/widgets/sound/sound_player.dart'; import 'package:test_sa/views/widgets/titles/app_sub_title.dart'; -import '../report_issues_page.dart'; import 'report/future_service_report.dart'; class RequestDetailsPage extends StatelessWidget { static final String id = "/call-details"; @@ -61,61 +58,60 @@ 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,) + // ) + // ); + // }, + // ) + const SizedBox(width: 48,) + : AIconButton( + iconData: Icons.edit, + color: AColors.white, + buttonSize: 42, + backgroundColor: AColors.green, + onPressed: () async { + showModalBottomSheet( context: context, builder: (context){ return ServiceRequestsUpdateDialog(request: serviceRequest,); }); - // DateTime picked = await showDatePicker( - // context: context, - // initialDate: DateTime.now(), - // firstDate: DateTime.now(), - // lastDate: DateTime.now().add(Duration(days: 182)) - // ); - // if(picked == null){return;} - // showDialog( - // context: context, - // barrierDismissible: false, - // builder: (BuildContext context) { - // return CupertinoAlertDialog( - // title: Text(_subtitle.updatingDots), - // content: Center(child: CircularProgressIndicator()), - // ); - // }, - // ); - // int status = await _serviceRequestsProvider.updateDate( - // user: _userProvider.user, - // host: _settingProvider.host, - // request: serviceRequest, - // newDate: picked.toString().split(" ").first - // ); - // Navigator.of(context).pop(); - // Fluttertoast.showToast( - // msg: HttpStatusManger.getStatusMessage(status: status, subtitle: _subtitle), - // ); - }, - ), - 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,) ], @@ -249,44 +245,45 @@ class RequestDetailsPage extends StatelessWidget { ASoundPlayer( audio: serviceRequest.audio, ), - Center( - child: Padding( - padding: EdgeInsets.all(32), - child: AButton( - text: _subtitle.duplicateRequest, - onPressed: () async { - bool result = await showDialog( - context: context, - builder: (_) => AAlertDialog( - title: _subtitle.duplicateAlert, - content: _subtitle.duplicateAlertMessage, - ) - ); - if(result == true){ - showDialog( - context: context, - builder: (context){ - return Center(child: CircularProgressIndicator()); - } - ); - int status = await _serviceRequestsProvider.createDuplicatedReport( - host: _settingProvider.host, - user: _userProvider.user, - request: serviceRequest - ); - Navigator.of(context).pop(); - ScaffoldMessenger.of(context).showSnackBar( - SnackBar( - content: Text( - HttpStatusManger.getStatusMessage(status: status, subtitle: _subtitle) - ) - ) - ); - } - }, - ), - ), - ) + // + // Center( + // child: Padding( + // padding: EdgeInsets.all(32), + // child: AButton( + // text: _subtitle.duplicateRequest, + // onPressed: () async { + // bool result = await showDialog( + // context: context, + // builder: (_) => AAlertDialog( + // title: _subtitle.duplicateAlert, + // content: _subtitle.duplicateAlertMessage, + // ) + // ); + // if(result == true){ + // showDialog( + // context: context, + // builder: (context){ + // return Center(child: CircularProgressIndicator()); + // } + // ); + // int status = await _serviceRequestsProvider.createDuplicatedReport( + // host: _settingProvider.host, + // user: _userProvider.user, + // request: serviceRequest + // ); + // Navigator.of(context).pop(); + // ScaffoldMessenger.of(context).showSnackBar( + // SnackBar( + // content: Text( + // HttpStatusManger.getStatusMessage(status: status, subtitle: _subtitle) + // ) + // ) + // ); + // } + // }, + // ), + // ), + // ) ], ), serviceRequest.viewReport ? @@ -309,7 +306,8 @@ class RequestDetailsPage extends StatelessWidget { title: _subtitle.jobSheetNumber, info: serviceRequest.jobSheetNumber, ), - _userProvider.user.type == UsersTypes.engineer ? + _userProvider.user.type == UsersTypes.engineer + && serviceRequest.reportID != null? Padding( padding: EdgeInsets.all(32), child: AButton( diff --git a/lib/views/pages/user/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..a758bb93 100644 --- a/lib/views/pages/user/visits/pantry/edit_pentry.dart +++ b/lib/views/pages/user/visits/pantry/edit_pentry.dart @@ -1,12 +1,14 @@ import 'package:flutter/material.dart'; import 'package:fluttertoast/fluttertoast.dart'; import 'package:provider/provider.dart'; -import 'package:test_sa/controllers/http_status_manger/http_status_manger.dart'; import 'package:test_sa/controllers/localization/localization.dart'; import 'package:test_sa/controllers/providers/api/regular_visits_provider.dart'; 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'; @@ -59,19 +61,23 @@ class _EditPentryState extends State with SingleTickerProviderStateM Fluttertoast.showToast( msg: _subtitle.requestCompleteSuccessfully, ); - // Navigator.of(context).pop(); + Navigator.of(context).pop(); + Navigator.of(context).pop(); }else{ - String errorMessage = HttpStatusManger.getStatusMessage( - status: status, subtitle: _subtitle); - 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..8b0368ec 100644 --- a/lib/views/pages/user/visits/update_visits_group_sheet.dart +++ b/lib/views/pages/user/visits/update_visits_group_sheet.dart @@ -1,3 +1,4 @@ +import 'package:flutter/material.dart'; import 'dart:convert'; import 'dart:io'; @@ -9,12 +10,9 @@ import 'package:test_sa/models/visits/visit.dart'; import 'package:test_sa/models/visits/visits_group.dart'; import 'package:test_sa/views/app_style/colors.dart'; import 'package:test_sa/views/app_style/sizing.dart'; -import 'package:test_sa/views/widgets/app_text_form_field.dart'; import 'package:test_sa/views/widgets/buttons/app_button.dart'; import 'package:test_sa/views/widgets/buttons/app_small_button.dart'; -import 'package:test_sa/views/widgets/date_and_time/date_picker.dart'; -import 'package:test_sa/views/widgets/images/one_image_picker.dart'; -import 'package:test_sa/views/widgets/search/filter_item.dart'; +import 'package:test_sa/views/widgets/status/employee/engineers_mune.dart'; import 'package:test_sa/views/widgets/visits/visit_status.dart'; class UpdateVisitsGroupSheet extends StatefulWidget { final List visits; @@ -26,25 +24,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 +76,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; + EngineersMenu( + initialValue: _group.engineer, + onSelect: (engineer){ + _group.engineer = engineer; }, ), 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], - ); - } - - ), - ), - ), + // 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 +245,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 e191cf67..c2e70372 100644 --- a/lib/views/pages/user/visits/visit_details.dart +++ b/lib/views/pages/user/visits/visit_details.dart @@ -5,7 +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/future_edit_pently.dart'; +import 'package:test_sa/views/pages/user/visits/pantry/edit_pentry.dart'; import 'package:test_sa/views/widgets/buttons/app_back_button.dart'; import 'package:test_sa/views/widgets/buttons/app_icon_button.dart'; import 'package:test_sa/views/widgets/images/images_list.dart'; @@ -15,7 +15,6 @@ import 'package:test_sa/views/widgets/visits/visit_status.dart'; import '../../../../controllers/providers/api/regular_visits_provider.dart'; - class VisitDetailsPage extends StatelessWidget { static final String id = "/visit-details"; final Visit visit; @@ -25,7 +24,6 @@ class VisitDetailsPage extends StatelessWidget { Widget build(BuildContext context) { Subtitle _subtitle = AppLocalization.of(context).subtitle; final regularVisitsProvider = Provider.of(context); - return Scaffold( body: SafeArea( child: Column( @@ -54,11 +52,11 @@ 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,)) ); }, ), - SizedBox(width: 16,) + SizedBox(width: 42) ], ), ), diff --git a/lib/views/widgets/buttons/app_flat_button.dart b/lib/views/widgets/buttons/app_flat_button.dart index 903b05e2..f8df57b6 100644 --- a/lib/views/widgets/buttons/app_flat_button.dart +++ b/lib/views/widgets/buttons/app_flat_button.dart @@ -1,5 +1,5 @@ -import 'package:test_sa/views/app_style/sizing.dart'; import 'package:flutter/material.dart'; +import 'package:test_sa/views/app_style/sizing.dart'; class AFlatButton extends StatelessWidget { final String text; diff --git a/lib/views/widgets/buttons/app_icon_button2.dart b/lib/views/widgets/buttons/app_icon_button2.dart index 1a9bc78e..bce63196 100644 --- a/lib/views/widgets/buttons/app_icon_button2.dart +++ b/lib/views/widgets/buttons/app_icon_button2.dart @@ -1,6 +1,6 @@ -import 'package:test_sa/views/app_style/sizing.dart'; import 'package:flutter/material.dart'; import 'package:font_awesome_flutter/font_awesome_flutter.dart'; +import 'package:test_sa/views/app_style/sizing.dart'; class AIconButton2 extends StatelessWidget { final IconData iconData; diff --git a/lib/views/widgets/buttons/app_small_button.dart b/lib/views/widgets/buttons/app_small_button.dart index b2f71626..10c103f6 100644 --- a/lib/views/widgets/buttons/app_small_button.dart +++ b/lib/views/widgets/buttons/app_small_button.dart @@ -1,5 +1,5 @@ -import 'package:test_sa/views/app_style/sizing.dart'; import 'package:flutter/material.dart'; +import 'package:test_sa/views/app_style/sizing.dart'; class ASmallButton extends StatelessWidget { final String text; diff --git a/lib/views/widgets/date_and_time/date_picker.dart b/lib/views/widgets/date_and_time/date_picker.dart index ee68b716..a3136342 100644 --- a/lib/views/widgets/date_and_time/date_picker.dart +++ b/lib/views/widgets/date_and_time/date_picker.dart @@ -24,7 +24,6 @@ class ADatePicker extends StatelessWidget { child: Text( date == null ? "Pick Date" : date.toString().split(" ").first, - style: Theme.of(context).textTheme.subtitle2, textScaleFactor: AppStyle.getScaleFactor(context), ), onPressed: () async { diff --git a/lib/views/widgets/departments/department_button.dart b/lib/views/widgets/departments/department_button.dart index 5aa8b0e4..cf859874 100644 --- a/lib/views/widgets/departments/department_button.dart +++ b/lib/views/widgets/departments/department_button.dart @@ -1,11 +1,11 @@ import 'package:flutter/material.dart'; +import 'package:font_awesome_flutter/font_awesome_flutter.dart'; import 'package:test_sa/controllers/localization/localization.dart'; import 'package:test_sa/models/department.dart'; import 'package:test_sa/models/subtitle.dart'; import 'package:test_sa/views/app_style/colors.dart'; import 'package:test_sa/views/app_style/sizing.dart'; import 'package:test_sa/views/widgets/departments/single_department_picker.dart'; - class DepartmentButton extends StatelessWidget { final Function(Department) onDepartmentPick; final Department department; 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 169e16f1..03e694c4 100644 --- a/lib/views/widgets/device_trancfer/device_transfer_info_section.dart +++ b/lib/views/widgets/device_trancfer/device_transfer_info_section.dart @@ -25,7 +25,7 @@ class DeviceTransferInfoSection extends StatelessWidget { ), RequestInfoRow( title: subtitle.engineerName, - info: info.name, + info: info.userName, ), RequestInfoRow( title: subtitle.workingHours, @@ -51,7 +51,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..4b2d78ce 100644 --- a/lib/views/widgets/device_trancfer/device_transfer_item.dart +++ b/lib/views/widgets/device_trancfer/device_transfer_item.dart @@ -1,21 +1,14 @@ +import 'package:flutter/cupertino.dart'; +import 'package:flutter/material.dart'; +import 'package:provider/provider.dart'; import 'package:test_sa/controllers/localization/localization.dart'; import 'package:test_sa/controllers/providers/api/user_provider.dart'; import 'package:test_sa/models/device/device_transfer.dart'; -import 'package:test_sa/models/enums/user_types.dart'; -import 'package:test_sa/models/gas_refill/gas_refill_model.dart'; -import 'package:test_sa/models/service_request/service_request.dart'; import 'package:test_sa/models/subtitle.dart'; import 'package:test_sa/models/user.dart'; import 'package:test_sa/views/app_style/colors.dart'; import 'package:test_sa/views/app_style/sizing.dart'; -import 'package:test_sa/views/pages/user/requests/report/create_service_report.dart'; -import 'package:test_sa/views/pages/user/requests/report/future_service_report.dart'; -import 'package:test_sa/views/widgets/loaders/image_loader.dart'; import 'package:test_sa/views/widgets/requests/request_status.dart'; -import 'package:flutter/cupertino.dart'; -import 'package:flutter/material.dart'; -import 'package:intl/intl.dart'; -import 'package:provider/provider.dart'; class DeviceTransferItem extends StatelessWidget { final int index; final DeviceTransfer item; @@ -79,7 +72,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 +92,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 +112,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 +132,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/dialogs/dialog.dart b/lib/views/widgets/dialogs/dialog.dart index fa20a8f3..7bb08f20 100644 --- a/lib/views/widgets/dialogs/dialog.dart +++ b/lib/views/widgets/dialogs/dialog.dart @@ -1,7 +1,7 @@ -import 'package:test_sa/controllers/localization/localization.dart'; -import 'package:test_sa/models/subtitle.dart'; import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; +import 'package:test_sa/controllers/localization/localization.dart'; +import 'package:test_sa/models/subtitle.dart'; class AAlertDialog extends StatelessWidget { final String title; final String content; diff --git a/lib/views/widgets/e_signature/e_signature.dart b/lib/views/widgets/e_signature/e_signature.dart index c48ce9b5..1136a0a3 100644 --- a/lib/views/widgets/e_signature/e_signature.dart +++ b/lib/views/widgets/e_signature/e_signature.dart @@ -9,7 +9,8 @@ class ESignature extends StatefulWidget { final String oldSignature; final Uint8List newSignature; final Function(Uint8List) onSaved; - const ESignature({Key key, this.oldSignature, this.onSaved, this.newSignature}) : super(key: key); + final Function(Uint8List) onChange; + const ESignature({Key key, this.oldSignature, this.onSaved,this.onChange, this.newSignature}) : super(key: key); @override State createState() => _ESignatureState(); @@ -102,6 +103,7 @@ class _ESignatureState extends State { const Spacer(), IconButton(onPressed: () async { signature = await _controller.toPngBytes(); + widget.onChange(signature); setState(() {}); }, icon: const Icon(Icons.check)), ], diff --git a/lib/views/widgets/equipment/auto_complete_devices_field.dart b/lib/views/widgets/equipment/auto_complete_devices_field.dart index 0756bc70..85abcaec 100644 --- a/lib/views/widgets/equipment/auto_complete_devices_field.dart +++ b/lib/views/widgets/equipment/auto_complete_devices_field.dart @@ -9,8 +9,8 @@ import 'package:test_sa/views/app_style/colors.dart'; import 'package:test_sa/views/app_style/sizing.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); @@ -42,52 +42,65 @@ class _AutoCompleteDeviceFieldState extends State { _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) + return LoadingManager( + isLoading: _devicesProvider.isLoading, + isFailedLoading: _devicesProvider.devices == null, + stateCode: _devicesProvider.stateCode, + onRefresh: () async { + _devicesProvider.reset(); + await _devicesProvider.getEquipment( + host: _settingProvider.host, + user: _userProvider.user, + hospitalId: widget.hospitalId + ); + }, + child: Container( + padding: const EdgeInsets.symmetric( + horizontal: 16 + ), + decoration: BoxDecoration( + color: Colors.white, + border: Border.all(color:AColors.black), + borderRadius: BorderRadius.circular( + AppStyle.borderRadius * AppStyle.getScaleFactor(context) + ), + boxShadow: [ + AppStyle.boxShadow + ] ), - boxShadow: [ - AppStyle.boxShadow - ] - ), - child: TypeAheadField( - textFieldConfiguration: TextFieldConfiguration( - style: Theme.of(context).textTheme.headline6, - controller: _controller, - textAlign: TextAlign.center, - decoration: const InputDecoration( - border: InputBorder.none, - disabledBorder: InputBorder.none, - focusedBorder: InputBorder.none, - enabledBorder: InputBorder.none, + child: TypeAheadField( + textFieldConfiguration: TextFieldConfiguration( + style: Theme.of(context).textTheme.headline6, + controller: _controller, + textAlign: TextAlign.center, + decoration: const InputDecoration( + border: InputBorder.none, + disabledBorder: InputBorder.none, + focusedBorder: InputBorder.none, + enabledBorder: InputBorder.none, + ), + textInputAction: TextInputAction.search, ), - textInputAction: TextInputAction.search, + suggestionsCallback: (value) async { + return await _devicesProvider.getDevicesList( + host: _settingProvider.host, + user: _userProvider.user, + hospitalId: widget.hospitalId ?? _userProvider.user.hospital.id, + serialNumber: value, + ); + }, + itemBuilder: (context, device) { + return ListTile( + title: Text(device.serialNumber), + subtitle: Text("${device.modelDefinition.modelName}/${device.modelDefinition.manufacturerName}"), + ); + }, + onSuggestionSelected: (device) { + _controller.text = device.serialNumber; + widget.onPick(device.id); + }, + ), ), - suggestionsCallback: (value) async { - return await _devicesProvider.getDevicesList( - host: _settingProvider.host, - user: _userProvider.user, - hospitalId: widget.hospitalId, - serialNumber: value, - ); - }, - itemBuilder: (context, device) { - return ListTile( - title: Text(device.serialNumber), - subtitle: Text(device.model+"/"+device.brand), - ); - }, - onSuggestionSelected: (device) { - _controller.text = device.serialNumber; - widget.onPick(device.id); - }, - ), ); } } diff --git a/lib/views/widgets/equipment/auto_complete_models_field.dart b/lib/views/widgets/equipment/auto_complete_models_field.dart new file mode 100644 index 00000000..7f776b91 --- /dev/null +++ b/lib/views/widgets/equipment/auto_complete_models_field.dart @@ -0,0 +1,90 @@ +import 'package:flutter/material.dart'; +import 'package:flutter_typeahead/flutter_typeahead.dart'; +import 'package:provider/provider.dart'; +import 'package:test_sa/controllers/providers/api/devices_provider.dart'; +import 'package:test_sa/controllers/providers/api/user_provider.dart'; +import 'package:test_sa/controllers/providers/settings/setting_provider.dart'; +import 'package:test_sa/models/lookup.dart'; +import 'package:test_sa/views/app_style/colors.dart'; +import 'package:test_sa/views/app_style/sizing.dart'; +class AutoCompleteModelField extends StatefulWidget { + final Lookup initialValue; + final Function(Lookup) onPick; + + const AutoCompleteModelField({Key key, this.initialValue, this.onPick,}) : super(key: key); + + @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/device_button.dart b/lib/views/widgets/equipment/device_button.dart index 571a0b02..0177179e 100644 --- a/lib/views/widgets/equipment/device_button.dart +++ b/lib/views/widgets/equipment/device_button.dart @@ -1,11 +1,11 @@ import 'package:flutter/material.dart'; +import 'package:font_awesome_flutter/font_awesome_flutter.dart'; import 'package:test_sa/controllers/localization/localization.dart'; import 'package:test_sa/models/device/device.dart'; import 'package:test_sa/models/subtitle.dart'; import 'package:test_sa/views/app_style/colors.dart'; import 'package:test_sa/views/app_style/sizing.dart'; import 'package:test_sa/views/widgets/equipment/single_device_picker.dart'; - class DeviceButton extends StatelessWidget { final Function(Device) onDevicePick; final Device device; @@ -27,6 +27,11 @@ class DeviceButton extends StatelessWidget { ), child: Row( children: [ + FaIcon( + FontAwesomeIcons.hardDrive, + size: 28, + color: AColors.black, + ), device == null ? Expanded( child: Padding( diff --git a/lib/views/widgets/equipment/device_item.dart b/lib/views/widgets/equipment/device_item.dart index df07096b..0ead41ef 100644 --- a/lib/views/widgets/equipment/device_item.dart +++ b/lib/views/widgets/equipment/device_item.dart @@ -28,7 +28,7 @@ class DeviceItem extends StatelessWidget { onPressed(device); }, child: ListTile( - title: Text("${_subtitle.sn} : " + device.serialNumber, + title: Text("${_subtitle.sn} : ${device.serialNumber}", style: Theme.of(context).textTheme.headline6.copyWith( color: AColors.white ), @@ -38,13 +38,13 @@ class DeviceItem extends StatelessWidget { crossAxisAlignment: CrossAxisAlignment.start, children: [ Divider(color: Theme.of(context).scaffoldBackgroundColor,), - Text("${_subtitle.brand} : " + device.brand, + Text("${_subtitle.brand} : ${device.modelDefinition.manufacturerName}", style: Theme.of(context).textTheme.subtitle1.copyWith( color: AColors.white ), ), Divider(color: Theme.of(context).scaffoldBackgroundColor,), - Text("${_subtitle.model} : " + device.model, + Text("${_subtitle.model} : ${device.modelDefinition.modelName}", style: Theme.of(context).textTheme.subtitle1.copyWith( color: AColors.white ), diff --git a/lib/views/widgets/equipment/single_device_picker.dart b/lib/views/widgets/equipment/single_device_picker.dart index bc8bf527..a31be4df 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..47af778b 100644 --- a/lib/views/widgets/gas_refill/gas_refill_item.dart +++ b/lib/views/widgets/gas_refill/gas_refill_item.dart @@ -1,20 +1,14 @@ +import 'package:flutter/cupertino.dart'; +import 'package:flutter/material.dart'; +import 'package:provider/provider.dart'; import 'package:test_sa/controllers/localization/localization.dart'; import 'package:test_sa/controllers/providers/api/user_provider.dart'; -import 'package:test_sa/models/enums/user_types.dart'; import 'package:test_sa/models/gas_refill/gas_refill_model.dart'; -import 'package:test_sa/models/service_request/service_request.dart'; import 'package:test_sa/models/subtitle.dart'; import 'package:test_sa/models/user.dart'; import 'package:test_sa/views/app_style/colors.dart'; import 'package:test_sa/views/app_style/sizing.dart'; -import 'package:test_sa/views/pages/user/requests/report/create_service_report.dart'; -import 'package:test_sa/views/pages/user/requests/report/future_service_report.dart'; -import 'package:test_sa/views/widgets/loaders/image_loader.dart'; import 'package:test_sa/views/widgets/requests/request_status.dart'; -import 'package:flutter/cupertino.dart'; -import 'package:flutter/material.dart'; -import 'package:intl/intl.dart'; -import 'package:provider/provider.dart'; class GasRefillItem extends StatelessWidget { final int index; final GasRefillModel item; @@ -75,6 +69,7 @@ class GasRefillItem extends StatelessWidget { ), ), ), + if(item.clientName != null) Text( item.clientName, style: Theme.of(context).textTheme.subtitle2.copyWith( @@ -95,7 +90,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 0ccd9e45..aa9804cb 100644 --- a/lib/views/widgets/gas_refill/gas_refill_update_details_item.dart +++ b/lib/views/widgets/gas_refill/gas_refill_update_details_item.dart @@ -21,10 +21,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", @@ -47,14 +47,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 863ebc08..ca0df0f2 100644 --- a/lib/views/widgets/hospitals/hospital_auto_complete_field.dart +++ b/lib/views/widgets/hospitals/hospital_auto_complete_field.dart @@ -8,20 +8,19 @@ import 'package:test_sa/models/hospital.dart'; import 'package:test_sa/models/subtitle.dart'; import 'package:test_sa/views/app_style/colors.dart'; import 'package:test_sa/views/app_style/sizing.dart'; -import 'package:test_sa/views/widgets/hospitals/hospital_item.dart'; - 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(); } class _HospitalAutoCompleteFieldState extends State { + SettingProvider _settingProvider; TextEditingController _controller; @@ -55,8 +54,7 @@ class _HospitalAutoCompleteFieldState extends State { ), child: TypeAheadField( textFieldConfiguration: TextFieldConfiguration( - style: Theme.of(context).textTheme.headline6, - onSubmitted: widget.onSave, + style: Theme.of(context).textTheme.headline6, controller: _controller, textAlign: TextAlign.center, decoration: InputDecoration( @@ -67,19 +65,17 @@ class _HospitalAutoCompleteFieldState extends State { enabledBorder: InputBorder.none, ), textInputAction: TextInputAction.search, - onEditingComplete: () { - widget.onSearch(_controller.text); - }), + ), suggestionsCallback: (vale) async { return await HospitalsProvider().getHospitalsList(host: _settingProvider.host, title: vale); }, 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/hospitals/hospital_button.dart b/lib/views/widgets/hospitals/hospital_button.dart index 0abefbe4..2990aca7 100644 --- a/lib/views/widgets/hospitals/hospital_button.dart +++ b/lib/views/widgets/hospitals/hospital_button.dart @@ -1,11 +1,11 @@ import 'package:flutter/material.dart'; +import 'package:font_awesome_flutter/font_awesome_flutter.dart'; import 'package:test_sa/controllers/localization/localization.dart'; import 'package:test_sa/models/hospital.dart'; import 'package:test_sa/models/subtitle.dart'; import 'package:test_sa/views/app_style/colors.dart'; import 'package:test_sa/views/app_style/sizing.dart'; import 'package:test_sa/views/widgets/hospitals/single_hospital_picker.dart'; - class HospitalButton extends StatelessWidget { final Function(Hospital) onHospitalPick; final Hospital hospital; diff --git a/lib/views/widgets/hospitals/hospital_item.dart b/lib/views/widgets/hospitals/hospital_item.dart index 523dace6..3ee5b699 100644 --- a/lib/views/widgets/hospitals/hospital_item.dart +++ b/lib/views/widgets/hospitals/hospital_item.dart @@ -1,7 +1,7 @@ +import 'package:flutter/material.dart'; import 'package:test_sa/models/hospital.dart'; import 'package:test_sa/views/app_style/colors.dart'; import 'package:test_sa/views/app_style/sizing.dart'; -import 'package:flutter/material.dart'; class HospitalItem extends StatelessWidget { final Hospital hospital; final Function(Hospital) onPressed; diff --git a/lib/views/widgets/loaders/loading_manager.dart b/lib/views/widgets/loaders/loading_manager.dart index 8ed322e0..d2a5273d 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'; @@ -48,7 +48,7 @@ class _LoadingManagerState extends State { Subtitle subtitle = AppLocalization.of(context).subtitle; Widget placeHolder; // to load data if load not start - if(widget.isLoading == false && widget.stateCode == null){ + if(widget.isLoading != true && widget.stateCode == null){ WidgetsBinding.instance.addPostFrameCallback((timeStamp) { widget.onRefresh(); }); diff --git a/lib/views/widgets/notifications/notification_item.dart b/lib/views/widgets/notifications/notification_item.dart index e29cc3c4..f505b5d3 100644 --- a/lib/views/widgets/notifications/notification_item.dart +++ b/lib/views/widgets/notifications/notification_item.dart @@ -1,8 +1,8 @@ +import 'package:flutter/cupertino.dart'; +import 'package:flutter/material.dart'; import 'package:test_sa/models/app_notification.dart'; import 'package:test_sa/views/app_style/colors.dart'; import 'package:test_sa/views/app_style/sizing.dart'; -import 'package:flutter/cupertino.dart'; -import 'package:flutter/material.dart'; class NotificationItem extends StatelessWidget { final AppNotification notification; final Function(AppNotification) onPressed; diff --git a/lib/views/widgets/parts/auto_complete_parts_field.dart b/lib/views/widgets/parts/auto_complete_parts_field.dart index 9c31d01e..2f4582f6 100644 --- a/lib/views/widgets/parts/auto_complete_parts_field.dart +++ b/lib/views/widgets/parts/auto_complete_parts_field.dart @@ -10,6 +10,7 @@ import 'package:test_sa/views/app_style/sizing.dart'; import 'package:test_sa/views/widgets/loaders/loading_manager.dart'; class AutoCompletePartsField extends StatefulWidget { final String initialValue; + final bool clearAfterPick; final Function(Part) onPick; final bool clearAfterPick; @@ -70,16 +71,16 @@ class _AutoCompletePartsFieldState extends State { ), child: TypeAheadField( textFieldConfiguration: TextFieldConfiguration( - style: Theme.of(context).textTheme.subtitle1, - controller: _controller, - textAlign: TextAlign.center, - decoration: const InputDecoration( - border: InputBorder.none, - disabledBorder: InputBorder.none, - focusedBorder: InputBorder.none, - enabledBorder: InputBorder.none, - ), - textInputAction: TextInputAction.search, + style: Theme.of(context).textTheme.subtitle1, + controller: _controller, + textAlign: TextAlign.center, + decoration: const InputDecoration( + border: InputBorder.none, + disabledBorder: InputBorder.none, + focusedBorder: InputBorder.none, + enabledBorder: InputBorder.none, + ), + textInputAction: TextInputAction.search, ), suggestionsCallback: (vale) async { return await _partsProvider.getPartsList( diff --git a/lib/views/widgets/parts/part_item.dart b/lib/views/widgets/parts/part_item.dart index 354e4302..a82809bc 100644 --- a/lib/views/widgets/parts/part_item.dart +++ b/lib/views/widgets/parts/part_item.dart @@ -1,7 +1,7 @@ +import 'package:flutter/material.dart'; import 'package:test_sa/models/part.dart'; import 'package:test_sa/views/app_style/sizing.dart'; import 'package:test_sa/views/widgets/buttons/app_icon_button2.dart'; -import 'package:flutter/material.dart'; class PartItem extends StatefulWidget { final Part part; diff --git a/lib/views/widgets/pentry/auto_complete_fields/auto_complete_devices_field.dart b/lib/views/widgets/pentry/auto_complete_fields/auto_complete_devices_field.dart index ea2228cd..bf18fd66 100644 --- a/lib/views/widgets/pentry/auto_complete_fields/auto_complete_devices_field.dart +++ b/lib/views/widgets/pentry/auto_complete_fields/auto_complete_devices_field.dart @@ -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..b5daf4ae 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,8 +9,8 @@ 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'; import 'package:test_sa/views/widgets/timer/app_timer.dart'; import 'package:test_sa/views/widgets/titles/app_sub_title.dart'; @@ -23,7 +26,6 @@ class PentryInfoForm extends StatefulWidget { } class _PentryInfoFormState extends State { - @override Widget build(BuildContext context) { final subtitle = AppLocalization.of(context).subtitle; @@ -62,16 +64,16 @@ class _PentryInfoFormState extends State { }, ), const SizedBox(height: 8,), - const ASubTitle("Status"), - // if(widget.enableValidate && widget.model.status == null) - // ASubTitle(subtitle.requiredWord,color: Colors.red,), - const SizedBox(height: 4,), - PentryStatusMenu( - initialValue: widget.model.status, - onSelect: (status){ - widget.model.status = status; - }, - ), + // const ASubTitle("Status"), + // // if(widget.enableValidate && widget.model.status == null) + // // ASubTitle(subtitle.requiredWord,color: Colors.red,), + // const SizedBox(height: 4,), + // PentryStatusMenu( + // initialValue: widget.model.status, + // onSelect: (status){ + // widget.model.status = status; + // }, + // ), const SizedBox(height: 8,), const ASubTitle("Actual Visit Date"), if(widget.enableValidate && widget.model.actualVisitDate == null) @@ -87,6 +89,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 +124,28 @@ class _PentryInfoFormState extends State { }, ), const SizedBox(height: 8,), + const ASubTitle("Nurse Signature"), + ESignature( + oldSignature: widget.model.signatureNurse, + newSignature: widget.model.localNurseSignature, + onChange: (signature){ + if(signature == null || signature.isEmpty) {return;} + widget.model.localNurseSignature = signature; + widget.model.signatureNurse = "${DateTime.now().toIso8601String()}.png|${base64Encode(signature)}"; + }, + ), + const SizedBox(height: 8,), + const ASubTitle("Engineer Signature"), + ESignature( + oldSignature: widget.model.signatureEngineer, + newSignature: widget.model.localNurseSignature, + onChange: (signature){ + if(signature == null || signature.isEmpty) {return;} + widget.model.localNurseSignature = signature; + widget.model.signatureEngineer = "${DateTime.now().toIso8601String()}.png|${base64Encode(signature)}"; + }, + ), + const SizedBox(height: 8,), ], ); } diff --git a/lib/views/widgets/pentry/pentry_pm_kit_form.dart b/lib/views/widgets/pentry/pentry_pm_kit_form.dart index 6fdd3b43..c9194466 100644 --- a/lib/views/widgets/pentry/pentry_pm_kit_form.dart +++ b/lib/views/widgets/pentry/pentry_pm_kit_form.dart @@ -3,7 +3,6 @@ import 'package:test_sa/controllers/localization/localization.dart'; import 'package:test_sa/models/lookup.dart'; import 'package:test_sa/models/pantry/pm_kit.dart'; import 'package:test_sa/views/app_style/sizing.dart'; -import 'package:test_sa/views/widgets/app_text_form_field.dart'; import 'package:test_sa/views/widgets/buttons/app_button.dart'; import 'package:test_sa/views/widgets/buttons/app_small_button.dart'; import 'package:test_sa/views/widgets/parts/auto_complete_parts_field.dart'; @@ -67,84 +66,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 448cb53e..e46eed9d 100644 --- a/lib/views/widgets/requests/service_request_item.dart +++ b/lib/views/widgets/requests/service_request_item.dart @@ -1,4 +1,7 @@ -import 'package:fluttertoast/fluttertoast.dart'; +import 'package:flutter/cupertino.dart'; +import 'package:flutter/material.dart'; +import 'package:intl/intl.dart'; +import 'package:provider/provider.dart'; import 'package:test_sa/controllers/localization/localization.dart'; import 'package:test_sa/controllers/providers/api/service_requests_provider.dart'; import 'package:test_sa/controllers/providers/api/user_provider.dart'; @@ -10,16 +13,8 @@ import 'package:test_sa/models/user.dart'; import 'package:test_sa/views/app_style/colors.dart'; import 'package:test_sa/views/app_style/sizing.dart'; import 'package:test_sa/views/pages/user/requests/report/create_service_report.dart'; -import 'package:test_sa/views/pages/user/requests/report/future_service_report.dart'; import 'package:test_sa/views/widgets/loaders/image_loader.dart'; import 'package:test_sa/views/widgets/requests/request_status.dart'; -import 'package:flutter/cupertino.dart'; -import 'package:flutter/material.dart'; -import 'package:intl/intl.dart'; -import 'package:provider/provider.dart'; -import 'package:test_sa/views/widgets/timer/app_timer.dart'; - -import '../../../controllers/http_status_manger/http_status_manger.dart'; class ServiceRequestItem extends StatelessWidget { final int index; final ServiceRequest request; @@ -64,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 bde17432..6b5ce0d8 100644 --- a/lib/views/widgets/requests/service_request_update_dialog.dart +++ b/lib/views/widgets/requests/service_request_update_dialog.dart @@ -1,19 +1,19 @@ 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'; import 'package:test_sa/controllers/providers/settings/setting_provider.dart'; -import 'package:test_sa/models/service_request/service_request.dart'; -import 'package:test_sa/models/service_request/service_request_search.dart'; import 'package:test_sa/models/lookup.dart'; +import 'package:test_sa/models/service_request/service_request.dart'; import 'package:test_sa/models/subtitle.dart'; import 'package:test_sa/views/app_style/sizing.dart'; -import 'package:test_sa/views/widgets/buttons/app_button.dart'; import 'package:test_sa/views/widgets/buttons/app_small_button.dart'; import 'package:test_sa/views/widgets/date_and_time/date_picker.dart'; +import 'package:test_sa/views/widgets/status/employee/assigned_to_mune.dart'; import 'package:test_sa/views/widgets/hospitals/hospital_auto_complete_field.dart'; import 'package:flutter/material.dart'; import 'package:test_sa/views/widgets/status/employee/employee_mune.dart'; @@ -131,7 +131,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..a3f8b96d 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,9 +8,10 @@ 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/titles/app_sub_title.dart'; import '../app_text_form_field.dart'; -import 'filter_item.dart'; class ServiceRequestsSearchDialog extends StatefulWidget { final ServiceRequestSearch initialSearchValue; final bool expandedSearch; @@ -29,12 +31,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 +57,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/sound/record_sound.dart b/lib/views/widgets/sound/record_sound.dart index 5ca797e4..3170fe94 100644 --- a/lib/views/widgets/sound/record_sound.dart +++ b/lib/views/widgets/sound/record_sound.dart @@ -95,7 +95,7 @@ class _RecordSoundState extends State { _record = path; widget.onRecord(path); _recording = false; - setState(() {}); + setState(() { }); } _cancelRecording() async { @@ -107,7 +107,7 @@ class _RecordSoundState extends State { // rebuild(); _recording = false; await Future.delayed(const Duration(seconds: 1)); - if (!_recording) setState(() {}); + if(!_recording) setState(() { }); // _message.memoryAudio.; } diff --git a/lib/views/widgets/sound/sound_player.dart b/lib/views/widgets/sound/sound_player.dart index 1422f24e..7793f54b 100644 --- a/lib/views/widgets/sound/sound_player.dart +++ b/lib/views/widgets/sound/sound_player.dart @@ -1,5 +1,3 @@ -import 'dart:typed_data'; - import 'package:audioplayers/audioplayers.dart'; import 'package:flutter/material.dart'; import 'package:test_sa/views/app_style/sizing.dart'; @@ -81,6 +79,7 @@ class _ASoundPlayerState extends State { icon: const Icon( Icons.replay_rounded), onPressed: () async { _failedToLoad = false; + try { _audioPlayer.seek(const Duration(milliseconds: 0)); _audioPlayer.stop(); diff --git a/lib/views/widgets/speech_to_text/speech_to_text.dart b/lib/views/widgets/speech_to_text/speech_to_text.dart index 7d4b96d7..4d813d12 100644 --- a/lib/views/widgets/speech_to_text/speech_to_text.dart +++ b/lib/views/widgets/speech_to_text/speech_to_text.dart @@ -5,10 +5,9 @@ import 'package:speech_to_text/speech_recognition_error.dart'; import 'package:speech_to_text/speech_recognition_result.dart'; import 'package:speech_to_text/speech_to_text.dart'; import 'package:test_sa/controllers/providers/settings/setting_provider.dart'; -import 'package:test_sa/views/app_style/sizing.dart'; import 'package:test_sa/views/widgets/buttons/app_icon_button2.dart'; import 'package:test_sa/views/widgets/titles/app_sub_title.dart'; - +import 'package:test_sa/views/app_style/sizing.dart'; class SpeechToTextButton extends StatefulWidget { final TextEditingController controller; final bool mini; 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..ccb46c0a --- /dev/null +++ b/lib/views/widgets/status/employee/single_type_menu.dart @@ -0,0 +1,98 @@ +import 'package:flutter/material.dart'; +import 'package:test_sa/models/engineer.dart'; +import 'package:test_sa/views/app_style/colors.dart'; +import 'package:test_sa/views/app_style/sizing.dart'; +class SingleEngineerMenu extends StatefulWidget { + final List engineers; + final Engineer initialStatus; + 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..9b2c264d --- /dev/null +++ b/lib/views/widgets/status/gas_refill/gas_cylinder_type.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/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..12adf5d3 100644 --- a/lib/views/widgets/status/report/service_report_status.dart +++ b/lib/views/widgets/status/report/service_report_status.dart @@ -24,44 +24,46 @@ class _ServiceReportStatusMenuState extends State { bool firstTime = true; @override Widget build(BuildContext context) { - SettingProvider _settingProvider = Provider.of(context); - UserProvider _userProvider = Provider.of(context); - ServiceReportStatusProvider _menuProvider = Provider.of(context); - ServiceReportLastCallsProvider _callsLastSituationsProvider = Provider.of(context,listen: false); + SettingProvider settingProvider = Provider.of(context); + UserProvider userProvider = Provider.of(context); + ServiceReportStatusProvider menuProvider = Provider.of(context); + ServiceReportLastCallsProvider callsLastSituationsProvider = Provider.of(context); if(firstTime){ - _callsLastSituationsProvider.reset(); + callsLastSituationsProvider.reset(); firstTime = false; } return LoadingManager( - isLoading: _menuProvider.isLoading == true || _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 || callsLastSituationsProvider.isLoading == true, + isFailedLoading: menuProvider.statuses == null || callsLastSituationsProvider.calls == null, + stateCode: menuProvider.stateCode == null || callsLastSituationsProvider.stateCode == null ? null: + max(menuProvider.stateCode ?? 0,callsLastSituationsProvider.stateCode ?? 0), onRefresh: () async { - if(_menuProvider.stateCode == null){ - _menuProvider.reset(); - await _menuProvider.getTypes( - user: _userProvider.user, - host: _settingProvider.host + await callsLastSituationsProvider.getCalls( + user: userProvider.user, + host: settingProvider.host, + serviceStatus: widget.report.status?.id + ); + if(menuProvider.stateCode == null){ + menuProvider.reset(); + await menuProvider.getTypes( + user: userProvider.user, + host: settingProvider.host ); + setState(() {}); } - await _callsLastSituationsProvider.getCalls( - user: _userProvider.user, - host: _settingProvider.host, - serviceStatus: widget.report.status?.id.toString() - ); }, child: SingleStatusMenu( - statuses: _menuProvider.statuses, + statuses: menuProvider.statuses, initialStatus: widget.report.status, onSelect: (status){ - _callsLastSituationsProvider.getCalls( - user: _userProvider.user, - host: _settingProvider.host, - serviceStatus: status.id.toString() - ); widget.report.callLastSituation = null; + callsLastSituationsProvider.getCalls( + user: userProvider.user, + host: settingProvider.host, + serviceStatus: status.id + ); + widget.onSelect(status); }, ) diff --git a/lib/views/widgets/status/report/service_status.dart b/lib/views/widgets/status/report/service_status.dart index 37eb554e..3c4eb794 100644 --- a/lib/views/widgets/status/report/service_status.dart +++ b/lib/views/widgets/status/report/service_status.dart @@ -6,11 +6,11 @@ import 'package:test_sa/controllers/providers/settings/setting_provider.dart'; import 'package:test_sa/models/lookup.dart'; import 'package:test_sa/views/widgets/loaders/loading_manager.dart'; import 'package:test_sa/views/widgets/status/single_status_menu.dart'; -class ServiceStatusMenu extends StatelessWidget { +class ServiceAssetTypeMenu extends StatelessWidget { final Function(Lookup) onSelect; final Lookup initialValue; - const ServiceStatusMenu({Key key, this.onSelect, this.initialValue}) : super(key: key); + const ServiceAssetTypeMenu({Key key, this.onSelect, this.initialValue}) : super(key: key); @override Widget build(BuildContext context) { SettingProvider _settingProvider = Provider.of(context); diff --git a/lib/views/widgets/status/service_request/service_request_status_mune.dart b/lib/views/widgets/status/service_request/service_request_status_mune.dart new file mode 100644 index 00000000..8ac8d1c5 --- /dev/null +++ b/lib/views/widgets/status/service_request/service_request_status_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/service_reqest/service_request_status_provider.dart'; +import 'package:test_sa/controllers/providers/api/user_provider.dart'; +import 'package:test_sa/controllers/providers/settings/setting_provider.dart'; +import 'package:test_sa/models/lookup.dart'; +import 'package:test_sa/views/widgets/loaders/loading_manager.dart'; +import 'package:test_sa/views/widgets/status/single_status_menu.dart'; +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..81a1c5b0 --- /dev/null +++ b/lib/views/widgets/status/service_request/service_request_through_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/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..1cba8f6a --- /dev/null +++ b/lib/views/widgets/status/service_request/service_request_types_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/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 212cd1c8..6b99d975 100644 --- a/lib/views/widgets/status/single_status_menu.dart +++ b/lib/views/widgets/status/single_status_menu.dart @@ -2,7 +2,6 @@ import 'package:flutter/material.dart'; import 'package:test_sa/models/lookup.dart'; import 'package:test_sa/views/app_style/colors.dart'; import 'package:test_sa/views/app_style/sizing.dart'; - class SingleStatusMenu extends StatefulWidget { final List statuses; final Lookup initialStatus; @@ -15,14 +14,29 @@ class SingleStatusMenu extends StatefulWidget { } 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) { - _selectedStatus = widget.statuses?.firstWhere((element) { - return element?.id == widget.initialStatus.id; - }); + if(widget.initialStatus != null ){ + final result = widget.statuses?.where( + (element) { + return element == widget.initialStatus; + }); + if(result.isNotEmpty) { + _selectedStatus =result.first; + }else{ + _selectedStatus =null; + } + if(widget.initialStatus.id != _selectedStatus.id) { + widget.onSelect(_selectedStatus); + } } else { _selectedStatus = null; } @@ -31,10 +45,15 @@ class _SingleStatusMenuState extends State { @override void initState() { - if (widget.initialStatus != null) { - _selectedStatus = widget.statuses?.firstWhere((element) { - return element?.id == widget.initialStatus.id; - }); + if(widget.initialStatus != null){ + final result = widget.statuses?.where( + (element) { + return element == widget.initialStatus; + }); + if(result.isNotEmpty) _selectedStatus = result.first; + if(widget.initialStatus.id != _selectedStatus.id) { + widget.onSelect(_selectedStatus); + } } super.initState(); @@ -72,12 +91,17 @@ class _SingleStatusMenuState extends State { }); widget.onSelect(newValue); }, - items: widget.statuses.map>((Lookup value) { + items: widget.statuses + .map>((Lookup value) { return DropdownMenuItem( value: value, child: Text( - value.label, - style: Theme.of(context).textTheme.subtitle1.copyWith(color: Theme.of(context).primaryColor, fontWeight: FontWeight.w600), + 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/timer/app_timer.dart b/lib/views/widgets/timer/app_timer.dart index 95f4fbe7..cbc75bc6 100644 --- a/lib/views/widgets/timer/app_timer.dart +++ b/lib/views/widgets/timer/app_timer.dart @@ -4,7 +4,6 @@ import 'package:flutter/material.dart'; import 'package:test_sa/models/timer_model.dart'; import 'package:test_sa/views/app_style/colors.dart'; import 'package:test_sa/views/app_style/sizing.dart'; -import 'package:test_sa/views/widgets/loaders/app_loading.dart'; class AppTimer extends StatefulWidget { final TimerModel timer; final Future Function(TimerModel) onChange; diff --git a/lib/views/widgets/titles/app_title.dart b/lib/views/widgets/titles/app_title.dart index e97f8b9d..e5dfbc9e 100644 --- a/lib/views/widgets/titles/app_title.dart +++ b/lib/views/widgets/titles/app_title.dart @@ -1,5 +1,5 @@ -import 'package:test_sa/views/app_style/sizing.dart'; import 'package:flutter/material.dart'; +import 'package:test_sa/views/app_style/sizing.dart'; class ATitle extends StatelessWidget { final String text; final EdgeInsets padding; diff --git a/lib/views/widgets/visits/visit_item.dart b/lib/views/widgets/visits/visit_item.dart index bd456d19..910c1648 100644 --- a/lib/views/widgets/visits/visit_item.dart +++ b/lib/views/widgets/visits/visit_item.dart @@ -102,9 +102,7 @@ class VisitItem extends StatelessWidget { fontSize: 14, ), ), - Divider( - color: onItemColor, - ), + Divider(color: onItemColor), Row( children: [ Expanded( @@ -164,6 +162,13 @@ class VisitItem extends StatelessWidget { color: onItemColor, fontSize: 14, ), + // Text( + // visit.contactStatus ?? "", + // style: Theme.of(context).textTheme.subtitle1.copyWith( + // color: onItemColor, + // fontSize: 14, + // ), + // ), ), ], ), 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/lib/views/widgets/visits/visits_list.dart b/lib/views/widgets/visits/visits_list.dart index a5b05966..ba688518 100644 --- a/lib/views/widgets/visits/visits_list.dart +++ b/lib/views/widgets/visits/visits_list.dart @@ -1,3 +1,4 @@ +import 'package:flutter/material.dart'; import 'package:test_sa/controllers/localization/localization.dart'; import 'package:test_sa/models/subtitle.dart'; import 'package:test_sa/models/visits/visit.dart'; @@ -6,7 +7,6 @@ import 'package:test_sa/views/pages/user/visits/visit_details.dart'; import 'package:test_sa/views/widgets/loaders/lazy_loading.dart'; import 'package:test_sa/views/widgets/loaders/no_item_found.dart'; import 'package:test_sa/views/widgets/visits/visit_item.dart'; -import 'package:flutter/material.dart'; class VisitsList extends StatefulWidget { final List visits; final bool nextPage; diff --git a/pubspec.lock b/pubspec.lock index 414df867..85b52829 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -588,7 +588,7 @@ packages: sha256: "5076f09225f91dc49289a4ccb92df2eeea9ea01cf7c26d49b3a1f04c6a49eec1" url: "https://pub.dev" source: hosted - version: "1.1.0" + version: "1.3.0" matcher: dependency: transitive description: