diff --git a/lib/controllers/api_routes/urls.dart b/lib/controllers/api_routes/urls.dart index 124f300a..14e4d6a2 100644 --- a/lib/controllers/api_routes/urls.dart +++ b/lib/controllers/api_routes/urls.dart @@ -4,8 +4,8 @@ class URLs { static const String appReleaseBuildNumber = "32"; // static const host1 = "https://atomsm.hmg.com"; // production url - static const host1 = "https://atomsmdev.hmg.com"; // local DEV url - // static const host1 = "https://atomsmuat.hmg.com"; // local UAT url + // static const host1 = "https://atomsmdev.hmg.com"; // local DEV url + static const host1 = "https://atomsmuat.hmg.com"; // local UAT url // static final String _baseUrl = "$_host/mobile"; // host local UAT // static final String _baseUrl = "$_host/v2/mobile"; // new V2 apis diff --git a/lib/controllers/providers/api/all_requests_provider.dart b/lib/controllers/providers/api/all_requests_provider.dart index 86579328..69c74827 100644 --- a/lib/controllers/providers/api/all_requests_provider.dart +++ b/lib/controllers/providers/api/all_requests_provider.dart @@ -135,7 +135,7 @@ class AllRequestsProvider extends ChangeNotifier { List list = [1, 2, 3, 4]; if (context.userProvider.isAssessor) { - list = [9]; + list = [9,15]; return list; } if (context.userProvider.isQualityUser) { diff --git a/lib/dashboard_latest/widgets/request_category_list.dart b/lib/dashboard_latest/widgets/request_category_list.dart index a0117592..9cea85b3 100644 --- a/lib/dashboard_latest/widgets/request_category_list.dart +++ b/lib/dashboard_latest/widgets/request_category_list.dart @@ -1,3 +1,5 @@ +import 'dart:developer'; + import 'package:flutter/material.dart'; import 'package:test_sa/extensions/int_extensions.dart'; import 'package:test_sa/extensions/widget_extensions.dart'; @@ -6,6 +8,7 @@ import 'package:test_sa/modules/asset_delivery_module/pages/asset_delivery_item_ import 'package:test_sa/modules/asset_inventory_module/pages/inventory_session_item_view.dart'; import 'package:test_sa/modules/demo_module/demo_request_item_view.dart'; import 'package:test_sa/modules/internal_audit_module/pages/equipment_internal_audit/equipment_internal_audit_item_view.dart'; +import 'package:test_sa/modules/medical_gas_inspection/medical_gas_inspection_item_view.dart'; import 'package:test_sa/modules/tm_module/tasks/task_request_item_view.dart'; import 'package:test_sa/modules/traf_module/traf_request_item_view.dart'; import 'package:test_sa/new_views/app_style/app_color.dart'; @@ -40,6 +43,7 @@ class RequestCategoryList extends StatelessWidget { } Widget _buildRequestItem(Data request) { + log('here with no ${request.transactionNo}'); switch (request.transactionNo) { case 1: return ServiceRequestItemView(requestData: request); @@ -59,14 +63,14 @@ class RequestCategoryList extends StatelessWidget { return InventorySessionItemView(requestData: request); case 9: return TrafRequestItemView(requestData: request); - //TODO need to verify this ... case 10: return EquipmentInternalAuditItemView(requestData: request); case 11: return EquipmentInternalAuditItemView(requestData: request); case 13: return AssetDeliveryItemView(requestData: request); - //Todo need to verify this... + case 14: + return MedicalGasInspectionItemView(requestData: request); case 15: return DemoRequestItemView(requestData: request); default: diff --git a/lib/extensions/enum_extensions.dart b/lib/extensions/enum_extensions.dart index da884bcc..36c824e5 100644 --- a/lib/extensions/enum_extensions.dart +++ b/lib/extensions/enum_extensions.dart @@ -100,18 +100,38 @@ extension IntExtensionsDemoRequest on int { DemoRequestStepEnum toDemoRequestStepEnum() { //Todo need to check exact stages switch (this) { - case 4: - return DemoRequestStepEnum.extendDemoPeriod; - case 2: + // { "id": 7690, "name": "Pending Assessor Acceptance", "value": 5 }, + // + // update request details + // + // + // { "id": 7692, "name": "Assessor Audit Doc Pending", "value": 7 }, + // + // Update request details + // + // + // { "id": 7766, "name": "Demo Period Expired", "value": 15 } + // + // request for extention + // + // + // { "id": 7769, "name": "Awaiting MD Evaluation", "value": 18 }, + // + // evaluation + + + case 5: return DemoRequestStepEnum.qAuditorRejectAccept; - case 3: + case 7: return DemoRequestStepEnum.updateRequest; case 5: + return DemoRequestStepEnum.updateRequest; return DemoRequestStepEnum.viewOnly; - case 6: + case 15: return DemoRequestStepEnum.extendDemoPeriod; default: - return DemoRequestStepEnum.viewOnly; + // return DemoRequestStepEnum.viewOnly; + return DemoRequestStepEnum.updateRequest; } } } diff --git a/lib/models/all_requests_and_count_model.dart b/lib/models/all_requests_and_count_model.dart index 95f19030..09bfc03f 100644 --- a/lib/models/all_requests_and_count_model.dart +++ b/lib/models/all_requests_and_count_model.dart @@ -110,6 +110,7 @@ class RequestsDetails { String? nameOfType; String? priority; String? status; + int? statusValue; String? assetName; String? assetNo; String? assetSN; @@ -139,6 +140,7 @@ class RequestsDetails { this.nameOfType, this.priority, this.status, + this.statusValue, this.assetName, this.assetNo, this.assetSN, @@ -168,6 +170,7 @@ class RequestsDetails { nameOfType = json['nameOfType']; priority = json['priority']; status = json['status']; + statusValue = json['statusValue']; assetName = json['assetName']; assetNo = json['assetNo']; assetSN = json['assetSN']; @@ -199,6 +202,7 @@ class RequestsDetails { data['nameOfType'] = nameOfType; data['priority'] = priority; data['status'] = status; + data['statusValue'] = statusValue; data['assetName'] = assetName; data['assetNo'] = assetNo; data['assetSN'] = assetSN; diff --git a/lib/models/enums/demo_request_step.dart b/lib/models/enums/demo_request_step.dart index 669076a6..603c0930 100644 --- a/lib/models/enums/demo_request_step.dart +++ b/lib/models/enums/demo_request_step.dart @@ -1,6 +1,7 @@ enum DemoRequestStepEnum { - qAuditorRejectAccept, // quality auditor accept reject - updateRequest, // quality auditor edit reject, // 5 - extendDemoPeriod, // extent + qAuditorRejectAccept, // 5 quality auditor accept reject + updateRequest, //7 + extendDemoPeriod, //15 extent viewOnly, // need to check when show view only + submitEvaluation, //18 } diff --git a/lib/models/new_models/dashboard_detail.dart b/lib/models/new_models/dashboard_detail.dart index 93c868a1..d351337f 100644 --- a/lib/models/new_models/dashboard_detail.dart +++ b/lib/models/new_models/dashboard_detail.dart @@ -47,6 +47,7 @@ class Data { String? typeTransaction; String? transactionDate; String? statusName; + int? statusValue; String? priorityName; bool? isHighPriority; String? assetName; @@ -69,6 +70,7 @@ class Data { this.nameOfType, this.transactionDate, this.statusName, + this.statusValue, this.numberOfAssets, this.numberOfSites, this.sessionType, @@ -88,6 +90,7 @@ class Data { typeTransaction = json['typeTransaction']; transactionDate = json['transactionDate']; statusName = json['statusName']; + statusValue = json['statusValue']; priorityName = json['priorityName']; isHighPriority = json['isHighPriority']; assetName = json['assetName']; @@ -111,6 +114,7 @@ class Data { data['typeTransaction'] = typeTransaction; data['transactionDate'] = transactionDate; data['statusName'] = statusName; + data['statusValue'] = statusValue; data['priorityName'] = priorityName; data['isHighPriority'] = isHighPriority; data['assetName'] = assetName; diff --git a/lib/modules/cm_module/views/components/action_button/footer_action_button.dart b/lib/modules/cm_module/views/components/action_button/footer_action_button.dart index b40f6f22..808afad2 100644 --- a/lib/modules/cm_module/views/components/action_button/footer_action_button.dart +++ b/lib/modules/cm_module/views/components/action_button/footer_action_button.dart @@ -23,7 +23,7 @@ import 'package:test_sa/modules/cm_module/views/forms/asset_retired/verify_asset import 'package:test_sa/modules/demo_module/demo_extension_bottom_sheet.dart'; import 'package:test_sa/modules/demo_module/models/demo_request_model.dart'; import 'package:test_sa/modules/demo_module/provider/demo_provider.dart'; -import 'package:test_sa/modules/demo_module/update_request_detail_view.dart'; +import 'package:test_sa/modules/demo_module/update_demo-request_view.dart'; import 'package:test_sa/new_views/app_style/app_color.dart'; import 'package:test_sa/new_views/common_widgets/app_filled_button.dart'; import 'package:test_sa/new_views/common_widgets/app_lazy_loading.dart'; @@ -376,8 +376,8 @@ class FooterActionButton { }) { DemoProvider demoProvider = Provider.of(context, listen: false); UserProvider userProvider = Provider.of(context, listen: false); -//Todo use this only for quality auditor user... - if (userProvider.user?.type == UsersTypes.normal_user) { + + if (userProvider.user?.type == UsersTypes.assessor) { switch (demoRequestStage) { case DemoRequestStepEnum.qAuditorRejectAccept: return footerContainer( @@ -430,7 +430,27 @@ class FooterActionButton { bool? isRefresh = await Navigator.push( context, MaterialPageRoute( - builder: (context) => UpdateRequestView( + builder: (context) => UpdateDemoRequestView( + dataModel: dataModel, + ))); + if (isRefresh == true) { + refreshData(true); + } + }, + ), + ); + case DemoRequestStepEnum.submitEvaluation: + return footerContainer( + context: context, + child: AppFilledButton( + label: 'Submit Evaluation'.addTranslation, + // maxWidth: true, + buttonColor: AppColor.primary10, + onPressed: () async { + bool? isRefresh = await Navigator.push( + context, + MaterialPageRoute( + builder: (context) => UpdateDemoRequestView( dataModel: dataModel, ))); if (isRefresh == true) { diff --git a/lib/modules/demo_module/create_demo_request_page.dart b/lib/modules/demo_module/create_demo_request_page.dart index de422a0c..23b71afb 100644 --- a/lib/modules/demo_module/create_demo_request_page.dart +++ b/lib/modules/demo_module/create_demo_request_page.dart @@ -548,8 +548,8 @@ class _CreateDemoRequestPageState extends State with Tick _demoFormModel.demoAttachment = []; for (var item in attachments) { String fileName = CMRequestUtils.isLocalUrl(item.name ?? '') ? ("${item.name ?? ''.split("/").last}|${base64Encode(File(item.name ?? '').readAsBytesSync())}") : item.name ?? ''; - //Todo need to change from static attachmentTypeId... - _demoFormModel.demoAttachment?.add(DemoAttachments(id: 0, attachmentName: fileName, demoRequestId: 0,attachmentTypeId: 5)); + //Todo need to change from static attachmentTypeId lookUp value from lookup 4104... + _demoFormModel.demoAttachment?.add(DemoAttachments(id: 0, attachmentName: fileName, demoRequestId: 0,documentTypeId: 7748)); } Utils.showLoading(context); DemoProvider demoProvider = Provider.of(context, listen: false); diff --git a/lib/modules/demo_module/demo_detail_view_page.dart b/lib/modules/demo_module/demo_detail_view_page.dart index 718fdc0b..0bb1d6db 100644 --- a/lib/modules/demo_module/demo_detail_view_page.dart +++ b/lib/modules/demo_module/demo_detail_view_page.dart @@ -4,6 +4,7 @@ import 'package:test_sa/extensions/context_extension.dart'; import 'package:test_sa/extensions/int_extensions.dart'; import 'package:test_sa/extensions/string_extensions.dart'; import 'package:test_sa/extensions/widget_extensions.dart'; +import 'package:test_sa/models/enums/demo_request_step.dart'; import 'package:test_sa/models/helper_data_models/workorder/work_order_helper_models.dart'; import 'package:test_sa/modules/cm_module/views/components/action_button/footer_action_button.dart'; import 'package:test_sa/modules/demo_module/demo_extension_bottom_sheet.dart'; @@ -58,8 +59,8 @@ class _DemoDetailViewPageState extends State { setState(() { loading = true; }); - // dataModel = await demoProvider?.getDemoById(widget.demoId) ?? DemoRequestModel(); - dataModel = await demoProvider?.getDemoById(11) ?? DemoRequestModel(); + dataModel = await demoProvider?.getDemoById(widget.demoId) ?? DemoRequestModel(); + // _attachments = dataModel.demoAttachments.toList() ?? []; setState(() { loading = false; @@ -118,6 +119,7 @@ class _DemoDetailViewPageState extends State { ).expanded, FooterActionButton.demoRequestDetailsFooterWidget( demoRequestStage: dataModel!.status!.demoRequestStepEnum!, + // demoRequestStage: DemoRequestStepEnum.updateRequest, dataModel: dataModel!, status: dataModel!.status!, context: context, diff --git a/lib/modules/demo_module/demo_request_item_view.dart b/lib/modules/demo_module/demo_request_item_view.dart index afb6b9e4..6d4bd7c3 100644 --- a/lib/modules/demo_module/demo_request_item_view.dart +++ b/lib/modules/demo_module/demo_request_item_view.dart @@ -25,12 +25,26 @@ class DemoRequestItemView extends StatelessWidget { return Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ - 8.height, - // (requestData?.typeTransaction ?? 'Demo Request').heading5(context), - ('Demo Request').heading5(context), - //TODO need to replace this with exact values need to show here.. - infoWidget(label: 'PO Internal'.addTranslation, value: requestData?.poInternal ?? '-', context: context), - infoWidget(label: 'PO External'.addTranslation, value: requestData?.poExternal ?? '-', context: context), + Row( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + StatusLabel( + label: requestData!.statusName!, + textColor: AppColor.demoRequestStatusTextColor(context, requestData?.statusValue ?? 0), + backgroundColor: AppColor.demoRequestStatus(context, requestData?.statusValue ?? 0), + ), + 1.width.expanded, + Text( + requestData!.transactionDate?.toServiceRequestCardFormat ?? "", + textAlign: TextAlign.end, + style: AppTextStyles.tinyFont.copyWith(color: context.isDark ? AppColor.neutral10 : AppColor.neutral50), + ), + ], + ), + // 8.height, + (requestData?.typeTransaction ?? 'Demo Request').heading5(context), + infoWidget(label: 'Request No'.addTranslation, value: requestData?.requestNo ?? '-', context: context), + infoWidget(label: context.translation.requestType, value: requestData?.requestTypeName, context: context), // infoWidget(label: 'No of Sites'.addTranslation, value: requestData?.numberOfSites != null ? requestData?.numberOfSites.toString() : '-', context: context), 8.height, Row( @@ -55,13 +69,27 @@ class DemoRequestItemView extends StatelessWidget { return Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ - 8.height, - ('Demo Request').heading5(context), - // (requestDetails?.nameOfType ?? 'Demo Request').heading5(context), - //TODO need to replace this with exact values need to show here.. - infoWidget(label: 'PO Internal'.addTranslation, value: requestDetails?.poInternal ?? '-', context: context), - infoWidget(label: 'PO External'.addTranslation, value: requestDetails?.poExternal ?? '-', context: context), - 8.height, + Row( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + StatusLabel( + label: requestDetails!.status!, + textColor: AppColor.demoRequestStatusTextColor(context, requestDetails?.statusValue ?? 0), + backgroundColor: AppColor.demoRequestStatus(context, requestDetails?.statusValue ?? 0), + ), + 1.width.expanded, + Text( + requestDetails!.date?.toServiceRequestCardFormat ?? "", + textAlign: TextAlign.end, + style: AppTextStyles.tinyFont.copyWith(color: context.isDark ? AppColor.neutral10 : AppColor.neutral50), + ), + ], + ), + // 8.height, + (requestDetails?.nameOfType ?? 'Demo Request').heading5(context), + // infoWidget(label: context.translation.requestType, value: requestDetails!.requestType, context: context), + infoWidget(label: context.translation.requestNo, value: requestDetails!.requestNo, context: context), + infoWidget(label: context.translation.site, value: requestDetails!.site, context: context), Row( mainAxisSize: MainAxisSize.min, children: [ diff --git a/lib/modules/demo_module/models/demo_attachment_model.dart b/lib/modules/demo_module/models/demo_attachment_model.dart index 069209a5..024cde6e 100644 --- a/lib/modules/demo_module/models/demo_attachment_model.dart +++ b/lib/modules/demo_module/models/demo_attachment_model.dart @@ -1,15 +1,15 @@ class DemoAttachments { int? id; num? demoRequestId; - num? attachmentTypeId; + num? documentTypeId; String? attachmentName; String? originalName; - DemoAttachments({this.id, this.attachmentTypeId, this.attachmentName, this.demoRequestId, this.originalName}); + DemoAttachments({this.id, this.documentTypeId, this.attachmentName, this.demoRequestId, this.originalName}); DemoAttachments.fromJson(dynamic json) { id = json['id']; - attachmentTypeId = json['attachmentTypeId']; + documentTypeId = json['documentTypeId']; demoRequestId = json['demoRequestId']; attachmentName = json['attachmentName']; originalName = json['originalName']; @@ -18,7 +18,7 @@ class DemoAttachments { Map toJson() { final map = {}; map['id'] = id; - map['attachmentTypeId'] = attachmentTypeId; + map['documentTypeId'] = documentTypeId; map['attachmentName'] = attachmentName; map['demoRequestId'] = demoRequestId; map['originalName'] = originalName; diff --git a/lib/modules/demo_module/models/demo_form_model.dart b/lib/modules/demo_module/models/demo_form_model.dart index 57bafbc6..eea60628 100644 --- a/lib/modules/demo_module/models/demo_form_model.dart +++ b/lib/modules/demo_module/models/demo_form_model.dart @@ -77,8 +77,8 @@ class DemoFormModel { "vendorRepresentativeName": vendorRepresentativeName, "manufacturer": manufacturer, "demoPeriodId": demoPeriod?.id, - "supplierId": 0, - "suppPersonId": 0, + "supplierId": vendor?.id, + "suppPersonId": supEngineer?.id, // "vendorEmail": vendorEmail, "demoAttachments": demoAttachment != null ? demoAttachment!.map((v) => v.toJson()).toList() : [], }; diff --git a/lib/modules/demo_module/models/demo_request_model.dart b/lib/modules/demo_module/models/demo_request_model.dart index 8f871f80..363a712e 100644 --- a/lib/modules/demo_module/models/demo_request_model.dart +++ b/lib/modules/demo_module/models/demo_request_model.dart @@ -20,6 +20,10 @@ class DemoRequestModel { String? doctorContactEmail; String? itemDescription; String? requestDescription; + String? vendorName; + String? vendorRepresentativeName; + String? vendorContactNumber; + String? vendorEmail; Lookup? demoPeriod; SupplierDetails? supplier; SuppEngineerWorkOrders? suppPerson; @@ -45,6 +49,10 @@ class DemoRequestModel { this.doctorContactEmail, this.itemDescription, this.requestDescription, + this.vendorName, + this.vendorRepresentativeName, + this.vendorEmail, + this.vendorContactNumber, this.demoPeriod, this.supplier, this.suppPerson, @@ -71,6 +79,10 @@ class DemoRequestModel { doctorContactEmail = json['doctorContactEmail']; itemDescription = json['itemDescription']; requestDescription = json['requestDescription']; + vendorName = json['vendorName']; + vendorRepresentativeName = json['vendorRepresentativeName']; + vendorContactNumber = json['vendorContactNumber']; + vendorEmail = json['vendorEmail']; demoPeriod = json['demoPeriod'] != null ? (Lookup.fromJson(json['demoPeriod'])) : null; supplier = json['supplier'] != null ? (SupplierDetails.fromJson(json['supplier'])) : null; suppPerson = json['suppPerson'] != null ? (SuppEngineerWorkOrders.fromJson(json['suppPerson'])) : null; diff --git a/lib/modules/demo_module/provider/demo_provider.dart b/lib/modules/demo_module/provider/demo_provider.dart index 601fbd33..065ef0b1 100644 --- a/lib/modules/demo_module/provider/demo_provider.dart +++ b/lib/modules/demo_module/provider/demo_provider.dart @@ -1,19 +1,27 @@ +import 'dart:developer'; + import 'package:flutter/cupertino.dart'; import 'package:fluttertoast/fluttertoast.dart'; import 'package:http/http.dart'; import 'package:test_sa/controllers/api_routes/api_manager.dart'; import 'package:test_sa/controllers/api_routes/urls.dart'; +import 'package:test_sa/models/new_models/building.dart'; +import 'package:test_sa/models/new_models/floor.dart'; +import 'package:test_sa/models/new_models/site.dart'; +import 'package:test_sa/modules/demo_module/models/demo_form_model.dart'; import 'package:test_sa/modules/demo_module/models/demo_request_model.dart'; import 'package:test_sa/modules/loan_module/models/loan_request_model.dart'; import 'dart:convert'; +import '../../../models/new_models/department.dart'; + class DemoProvider extends ChangeNotifier { Future addDemoRequest(Map body) async { try { Response response = await ApiManager.instance.post(URLs.addDemoRequest, body: body, showToast: false); if (response.statusCode >= 200 && response.statusCode < 300) { // String message = (jsonDecode(response.body)["data"] ?? "") + " " + (jsonDecode(response.body)["message"] ?? ""); - String message = (jsonDecode(response.body)["message"] ?? ""); + String message = (jsonDecode(response.body)["message"] ?? ""); Fluttertoast.showToast(msg: message ?? "", toastLength: Toast.LENGTH_LONG); return true; } @@ -24,6 +32,7 @@ class DemoProvider extends ChangeNotifier { } bool isLoading = false; + bool isSiteLoading = false; Future getDemoById(int id) async { DemoRequestModel? demoRequestModel; @@ -39,12 +48,8 @@ class DemoProvider extends ChangeNotifier { } Future acceptRejectRequest({required int requestId, required bool status}) async { - try { - Map payload = { - "demoRequestId": requestId, - "isApproved": status - }; + Map payload = {"demoRequestId": requestId, "isApproved": status}; Response response = await ApiManager.instance.post(URLs.updateDemoRequestByAssessor, body: payload, showToast: false); if (response.statusCode >= 200 && response.statusCode < 300) { String message = (jsonDecode(response.body)["data"] ?? "") + " " + (jsonDecode(response.body)["message"] ?? ""); @@ -56,6 +61,7 @@ class DemoProvider extends ChangeNotifier { return false; } } + Future updateDemoRequest(Map body) async { try { Response response = await ApiManager.instance.post(URLs.updateDemoRequest, body: body, showToast: false); @@ -69,13 +75,10 @@ class DemoProvider extends ChangeNotifier { return false; } } - Future updateDemoPeriod({required int demoPeriodId, required int requestId,required bool isUpdateRequired}) async { + + Future updateDemoPeriod({required int demoPeriodId, required int requestId, required bool isUpdateRequired}) async { try { - Map payload ={ - "demoRequestId": requestId, - "demoPeriodId": demoPeriodId, - "isDemoPeriodExtentionRequired": isUpdateRequired - }; + Map payload = {"demoRequestId": requestId, "demoPeriodId": demoPeriodId, "isDemoPeriodExtentionRequired": isUpdateRequired}; Response response = await ApiManager.instance.post(URLs.updateDemoPeriodByRequester, body: payload, showToast: false); if (response.statusCode >= 200 && response.statusCode < 300) { String message = (jsonDecode(response.body)["data"] ?? "") + " " + (jsonDecode(response.body)["message"] ?? ""); @@ -87,4 +90,73 @@ class DemoProvider extends ChangeNotifier { return false; } } + + Future getSiteData({required num? siteId}) async { + Site siteObj = Site(); + isSiteLoading = true; + notifyListeners(); + + try { + final response = await ApiManager.instance.get( + "${URLs.getSiteAutoCompleteWithoutConditionSites}?id=$siteId", + ); + + if (response.statusCode >= 200 && response.statusCode < 300) { + final List? siteData = json.decode(response.body)["data"]; + if (siteData != null && siteData.isNotEmpty) { + siteObj = Site.fromJson(siteData.first); + } + } + } catch (_) {} + + isSiteLoading = false; + notifyListeners(); + return siteObj; + } + +// Future getSiteData({ +// required num? siteId, +// }) async { +// isSiteLoading = true; +// DemoFormModel model=DemoFormModel(); +// notifyListeners(); +// +// try { +// final response = await ApiManager.instance.get( +// "${URLs.getSiteAutoCompleteWithoutConditionSites}?id=$siteId", +// ); +// +// if (response.statusCode >= 200 && response.statusCode < 300) { +// final List? siteData = json.decode(response.body)["data"]; +// +// if (siteData != null && siteData.isNotEmpty) { +// model.site = Site.fromJson(siteData.first); +// } +// +// model.building = model.site?.buildings?.firstWhere( +// (e) => e.value == model.building?.value, +// orElse: () => Building(), +// ); +// +// model.floor = model.building?.floors?.firstWhere( +// (e) => e.value == model.floor?.value, +// orElse: () => Floor(), +// ); +// +// model.department = model.floor?.departments?.firstWhere( +// (e) => e.departmentName == model.department?.departmentName, +// orElse: () => Department(), +// ); +// +// } +// +// isSiteLoading = false; +// notifyListeners(); +// return model; +// } catch (e) { +// isSiteLoading = false; +// notifyListeners(); +// return model; +// } +// } } diff --git a/lib/modules/demo_module/update_demo-request_view.dart b/lib/modules/demo_module/update_demo-request_view.dart new file mode 100644 index 00000000..d22a68e9 --- /dev/null +++ b/lib/modules/demo_module/update_demo-request_view.dart @@ -0,0 +1,597 @@ +import 'dart:convert'; +import 'dart:developer'; +import 'dart:io'; + +import 'package:flutter/material.dart'; +import 'package:provider/provider.dart'; +import 'package:test_sa/controllers/validator/validator.dart'; +import 'package:test_sa/extensions/context_extension.dart'; +import 'package:test_sa/extensions/int_extensions.dart'; +import 'package:test_sa/extensions/string_extensions.dart'; +import 'package:test_sa/extensions/text_extensions.dart'; +import 'package:test_sa/extensions/widget_extensions.dart'; +import 'package:test_sa/helper/utils.dart'; +import 'package:test_sa/models/generic_attachment_model.dart'; +import 'package:test_sa/models/lookup.dart'; +import 'package:test_sa/models/new_models/building.dart'; +import 'package:test_sa/models/new_models/floor.dart'; +import 'package:test_sa/models/new_models/site.dart'; +import 'package:test_sa/models/service_request/supp_engineer_work_orders.dart'; +import 'package:test_sa/models/service_request/supplier_details.dart'; +import 'package:test_sa/modules/cm_module/cm_request_utils.dart'; +import 'package:test_sa/modules/cm_module/views/components/action_button/footer_action_button.dart'; +import 'package:test_sa/modules/demo_module/models/demo_attachment_model.dart'; +import 'package:test_sa/modules/demo_module/models/demo_request_model.dart'; +import 'package:test_sa/modules/demo_module/provider/demo_period_lookup_provider.dart'; +import 'package:test_sa/modules/demo_module/provider/demo_provider.dart'; +import 'package:test_sa/new_views/app_style/app_color.dart'; +import 'package:test_sa/new_views/common_widgets/app_filled_button.dart'; +import 'package:test_sa/new_views/common_widgets/app_text_form_field.dart'; +import 'package:test_sa/new_views/common_widgets/single_item_drop_down_menu.dart'; +import 'package:test_sa/providers/gas_request_providers/site_provider.dart'; +import 'package:test_sa/providers/loading_list_notifier.dart'; +import 'package:test_sa/providers/work_order/vendor_provider.dart'; +import 'package:test_sa/views/widgets/images/multi_image_picker.dart'; +import '../../../../../../new_views/common_widgets/default_app_bar.dart'; +import '../../models/new_models/department.dart'; +import 'models/demo_form_model.dart'; + +class UpdateDemoRequestView extends StatefulWidget { + static const String id = "/update-demo-request"; + DemoRequestModel dataModel; + + UpdateDemoRequestView({Key? key, required this.dataModel}) : super(key: key); + + @override + _UpdateDemoRequestViewState createState() => _UpdateDemoRequestViewState(); +} + +class _UpdateDemoRequestViewState extends State with TickerProviderStateMixin { + final List attachments = []; + final GlobalKey _formKey = GlobalKey(); + final GlobalKey _scaffoldKey = GlobalKey(); + DemoFormModel _demoFormModel = DemoFormModel(); + + late TextEditingController doctorName; + late TextEditingController doctorPhone; + late TextEditingController doctorEmail; + late TextEditingController assetName; + late TextEditingController model; + late TextEditingController manufacturer; + late TextEditingController itemDesc; + late TextEditingController requestDesc; + late TextEditingController vendorPhone; + late TextEditingController vendorEmail; + late SiteProvider siteProvider; + late DemoProvider demoProvider; + bool isLoading = true; + + @override + void initState() { + super.initState(); + doctorName = TextEditingController(); + doctorPhone = TextEditingController(); + doctorEmail = TextEditingController(); + assetName = TextEditingController(); + model = TextEditingController(); + manufacturer = TextEditingController(); + itemDesc = TextEditingController(); + requestDesc = TextEditingController(); + vendorPhone = TextEditingController(); + vendorEmail = TextEditingController(); + siteProvider = Provider.of(context, listen: false); + demoProvider = Provider.of(context, listen: false); + WidgetsBinding.instance.addPostFrameCallback((_) { + fillData(); + }); + } + + void fillData() async { + final vendorProvider = Provider.of(context, listen: false); + if (vendorProvider.items.isEmpty) { + if (mounted) { + await vendorProvider.getData(); + } + } + final d = widget.dataModel; + + if (d.site?.id != null) { + _demoFormModel.site = await demoProvider.getSiteData( + siteId: d.site?.id, + ); + _demoFormModel.building = _demoFormModel.site?.buildings?.firstWhere( + (e) => e.id == d.building?.id, + orElse: () => Building(), + ); + + _demoFormModel.floor = _demoFormModel.building?.floors?.firstWhere( + (e) => e.id == d.floor?.id, + orElse: () => Floor(), + ); + + _demoFormModel.department = _demoFormModel.floor?.departments?.firstWhere( + (e) => e.id == d.department?.id, + orElse: () => Department(), + ); + } + + doctorName.text = d.doctorName ?? ''; + doctorPhone.text = d.doctorContactNumber ?? ''; + doctorEmail.text = d.doctorContactEmail ?? ''; + assetName.text = d.assetName ?? ''; + model.text = d.model ?? ''; + manufacturer.text = d.manufacturer ?? ''; + itemDesc.text = d.itemDescription ?? ''; + requestDesc.text = d.requestDescription ?? ''; + vendorPhone.text = d.supplier?.contact ?? d.vendorContactNumber ?? ''; + vendorEmail.text = d.supplier?.email ?? d.vendorEmail ?? ''; + _demoFormModel + ..docName = d.doctorName + ..docNumber = d.doctorContactNumber + ..docEmail = d.doctorContactEmail + ..assetName = d.assetName + ..model = d.model + ..manufacturer = d.manufacturer + ..itemDescription = d.itemDescription + ..requestDescription = d.requestDescription + ..vendor = d.supplier + ..vendorName = d.vendorName + ..vendorRepresentativeName = d.vendorRepresentativeName + ..vendorEmail = d.vendorEmail + ..vendorContactNumber = d.vendorContactNumber; + _demoFormModel.id = widget.dataModel.id; + _demoFormModel.demoPeriod = widget.dataModel.demoPeriod; + if (d.supplier != null) { + final supplier = d.supplier; + _demoFormModel.vendor = supplier; + final selectedVendor = vendorProvider.items.firstWhere( + (element) => element.id == supplier?.id, + orElse: () => SupplierDetails(), + ); + _demoFormModel.vendor?.suppPersons = selectedVendor.suppPersons; + _demoFormModel.supEngineer = widget.dataModel.suppPerson; + _demoFormModel.vendorEmail = supplier?.email; + _demoFormModel.vendorContactNumber = supplier?.contact; + vendorPhone.text = supplier?.email ?? ''; + vendorEmail.text = supplier?.contact ?? ''; + } + + attachments.clear(); + if (widget.dataModel.demoAttachments?.isNotEmpty ?? false) { + for (final item in widget.dataModel.demoAttachments!) { + if ((item.attachmentName ?? '').isNotEmpty) { + attachments.add( + GenericAttachmentModel(name: item.attachmentName, id: item.id ?? 0, originalName: item.originalName), + ); + } + } + } + + setState(() { + isLoading = false; + }); + } + + @override + Widget build(BuildContext context) { + return Scaffold( + key: _scaffoldKey, + appBar: DefaultAppBar(title: 'Update Request'.addTranslation), + body: isLoading + ? const CircularProgressIndicator(color: AppColor.primary10).center + : Form( + key: _formKey, + child: Column( + children: [ + SingleChildScrollView( + padding: const EdgeInsets.all(16), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + mainAxisSize: MainAxisSize.min, + children: [ + ...siteSection(), + 16.height, + ...doctorInfoSection(), + 16.height, + ...assetSection(), + 16.height, + ...vendorDetailsSection(), + 16.height, + AttachmentPicker( + label: context.translation.attachments, + attachment: attachments, + buttonColor: AppColor.black10, + onlyImages: false, + showAsListView: true, + buttonIcon: 'image-plus'.toSvgAsset(color: context.isDark ? AppColor.primary10 : AppColor.neutral120), + ), + ], + ).toShadowContainer(context, borderRadius: 20), + ).expanded, + FooterActionButton.footerContainer( + context: context, + child: AppFilledButton( + buttonColor: AppColor.primary10, + label: context.translation.update, + onPressed: _update, + // buttonColor: AppColor.primary10, + ), + ), + ], + ), + ), + ); + } + + List siteSection() { + return [ + 'Site Details'.addTranslation.bodyText(context).custom(color: AppColor.black10), + 8.height, + SingleItemDropDownMenu( + context: context, + title: context.translation.site, + initialValue: _demoFormModel.site, + showShadow: false, + validator: (value) { + if (value == null) return "Please select a site"; + return null; + }, + backgroundColor: AppColor.fieldBgColor(context), + showAsBottomSheet: true, + onSelect: (value) { + _demoFormModel.site = value; + setState(() {}); + }, + ), + 8.height, + SingleItemDropDownMenu( + context: context, + title: context.translation.building, + initialValue: _demoFormModel.building, + showShadow: false, + showAsBottomSheet: true, + validator: (value) { + if (value == null) return "Please select a building"; + return null; + }, + backgroundColor: AppColor.fieldBgColor(context), + enabled: _demoFormModel.site?.buildings?.isNotEmpty ?? false, + staticData: _demoFormModel.site?.buildings ?? [], + onSelect: (value) { + _demoFormModel.building = value; + _demoFormModel.floor = null; + _demoFormModel.department = null; + setState(() {}); + }, + ), + 8.height, + SingleItemDropDownMenu( + context: context, + title: context.translation.floor, + showShadow: false, + showAsBottomSheet: true, + initialValue: _demoFormModel.floor, + backgroundColor: AppColor.fieldBgColor(context), + enabled: _demoFormModel.building?.floors?.isNotEmpty ?? false, + staticData: _demoFormModel.building?.floors ?? [], + validator: (value) { + if (value == null) return "Please select a floor"; + return null; + }, + onSelect: (value) { + _demoFormModel.floor = value; + _demoFormModel.department = null; + setState(() {}); + }, + ), + 8.height, + SingleItemDropDownMenu( + context: context, + title: context.translation.department, + showShadow: false, + showAsBottomSheet: true, + initialValue: _demoFormModel.department, + backgroundColor: AppColor.fieldBgColor(context), + enabled: _demoFormModel.floor?.departments?.isNotEmpty ?? false, + validator: (value) { + if (value == null) return "Please select a department"; + return null; + }, + staticData: _demoFormModel.floor?.departments ?? [], + onSelect: (value) { + _demoFormModel.department = value; + _demoFormModel.room = null; + setState(() {}); + }, + ), + ]; + } + + List doctorInfoSection() { + return [ + "Doctor Details".bodyText(context).custom(color: AppColor.black10), + 8.height, + AppTextFormField( + controller: doctorName, + labelText: "Name", + validator: (value) { + if ((value ?? "").isEmpty) return "Mandatory"; + return null; + }, + style: Theme.of(context).textTheme.titleMedium, + backgroundColor: AppColor.fieldBgColor(context), + labelStyle: AppTextStyles.textFieldLabelStyle.copyWith(color: AppColor.textColor(context)), + showShadow: false, + textInputType: TextInputType.text, + onChange: (value) { + _demoFormModel.docName = value; + }, + ), + 8.height, + AppTextFormField( + controller: doctorPhone, + labelText: "Contact Number", + validator: (value) { + if ((value ?? "").isEmpty) return "Mandatory"; + return null; + }, + style: Theme.of(context).textTheme.titleMedium, + backgroundColor: AppColor.fieldBgColor(context), + labelStyle: AppTextStyles.textFieldLabelStyle.copyWith(color: AppColor.textColor(context)), + showShadow: false, + textInputType: TextInputType.phone, + onChange: (value) { + _demoFormModel.docNumber = value; + }, + ), + 8.height, + AppTextFormField( + controller: doctorEmail, + labelText: "Email", + validator: (value) { + if ((value ?? "").isEmpty) { + return "Mandatory"; + } else { + return Validator.isEmail(value!) ? null : context.translation.emailValidateMessage; + } + }, + style: Theme.of(context).textTheme.titleMedium, + backgroundColor: AppColor.fieldBgColor(context), + labelStyle: AppTextStyles.textFieldLabelStyle.copyWith(color: AppColor.textColor(context)), + showShadow: false, + textInputType: TextInputType.emailAddress, + onChange: (value) { + _demoFormModel.docEmail = value; + }, + ), + 8.height, + AppTextFormField( + controller: itemDesc, + labelText: "Item Description", + validator: (value) { + if ((value ?? "").isEmpty) return "Mandatory"; + return null; + }, + style: Theme.of(context).textTheme.titleMedium, + backgroundColor: AppColor.fieldBgColor(context), + labelStyle: AppTextStyles.textFieldLabelStyle.copyWith(color: AppColor.textColor(context)), + floatingLabelStyle: AppTextStyles.textFieldLabelStyle.copyWith(color: AppColor.textColor(context)), + showShadow: false, + textInputType: TextInputType.text, + textInputAction: TextInputAction.next, + onChange: (value) { + _demoFormModel.itemDescription = value; + }, + ), + 8.height, + AppTextFormField( + controller: requestDesc, + labelText: "Request Description", + // validator: (value) { + // if ((value ?? "").isEmpty) return "Mandatory"; + // return null; + // }, + style: Theme.of(context).textTheme.titleMedium, + backgroundColor: AppColor.fieldBgColor(context), + labelStyle: AppTextStyles.textFieldLabelStyle.copyWith(color: AppColor.textColor(context)), + floatingLabelStyle: AppTextStyles.textFieldLabelStyle.copyWith(color: AppColor.textColor(context)), + showShadow: false, + textInputType: TextInputType.text, + textInputAction: TextInputAction.next, + onChange: (value) { + _demoFormModel.requestDescription = value; + }, + ), + ]; + } + + List assetSection() { + return [ + 'Asset Details'.addTranslation.bodyText(context).custom(color: AppColor.black10), + 8.height, + AppTextFormField( + labelText: "Asset Name", + controller: assetName, + validator: (value) { + if ((value ?? "").isEmpty) return "Mandatory"; + return null; + }, + style: Theme.of(context).textTheme.titleMedium, + backgroundColor: AppColor.fieldBgColor(context), + labelStyle: AppTextStyles.textFieldLabelStyle.copyWith(color: AppColor.textColor(context)), + floatingLabelStyle: AppTextStyles.textFieldLabelStyle.copyWith(color: AppColor.textColor(context)), + showShadow: false, + textInputType: TextInputType.text, + textInputAction: TextInputAction.next, + onChange: (value) { + _demoFormModel.assetName = value; + }, + ), + 8.height, + AppTextFormField( + labelText: "Model", + controller: model, + validator: (value) { + if ((value ?? "").isEmpty) return "Mandatory"; + return null; + }, + style: Theme.of(context).textTheme.titleMedium, + backgroundColor: AppColor.fieldBgColor(context), + labelStyle: AppTextStyles.textFieldLabelStyle.copyWith(color: AppColor.textColor(context)), + floatingLabelStyle: AppTextStyles.textFieldLabelStyle.copyWith(color: AppColor.textColor(context)), + showShadow: false, + textInputType: TextInputType.text, + textInputAction: TextInputAction.next, + onChange: (value) { + _demoFormModel.model = value; + }, + ), + 8.height, + AppTextFormField( + labelText: "Manufacturer", + controller: manufacturer, + validator: (value) { + if ((value ?? "").isEmpty) return "Mandatory"; + return null; + }, + style: Theme.of(context).textTheme.titleMedium, + backgroundColor: AppColor.fieldBgColor(context), + labelStyle: AppTextStyles.textFieldLabelStyle.copyWith(color: AppColor.textColor(context)), + floatingLabelStyle: AppTextStyles.textFieldLabelStyle.copyWith(color: AppColor.textColor(context)), + showShadow: false, + textInputType: TextInputType.text, + textInputAction: TextInputAction.next, + onChange: (value) { + _demoFormModel.manufacturer = value; + }, + ), + 8.height, + SingleItemDropDownMenu( + context: context, + height: 56.toScreenHeight, + title: "Demo Period", + initialValue: _demoFormModel.demoPeriod, + showShadow: false, + validator: (value) { + if (value == null) return "Mandatory"; + return null; + }, + backgroundColor: AppColor.fieldBgColor(context), + showAsBottomSheet: true, + onSelect: (value) { + _demoFormModel.demoPeriod = value; + setState(() {}); + }, + ), + ]; + } + + List vendorDetailsSection() { + return [ + 'Vendor Details'.addTranslation.bodyText(context).custom(color: AppColor.black10), + //TODO show this only if supplier id and suppler person id is null.. + if (_demoFormModel.vendor == null) ...[ + 8.height, + Text( + '${'Vendor Name'.addTranslation}: ${_demoFormModel.vendorName?.cleanupWhitespace.capitalizeFirstOfEach}', + style: AppTextStyles.bodyText.copyWith(color: context.isDark ? AppColor.neutral10 : AppColor.neutral120), + ), + 8.height, + Text( + '${'Representative Name'.addTranslation}: ${_demoFormModel.vendorRepresentativeName?.cleanupWhitespace.capitalizeFirstOfEach}', + style: AppTextStyles.bodyText.copyWith(color: context.isDark ? AppColor.neutral10 : AppColor.neutral120), + ), + ], + + 8.height, + SingleItemDropDownMenu( + context: context, + title: 'Vendor Name'.addTranslation, + backgroundColor: AppColor.fieldBgColor(context), + initialValue: _demoFormModel.vendor, + showAsBottomSheet: true, + showShadow: false, + showCancel: true, + onSelect: (person) { + _demoFormModel.vendor = person; + _demoFormModel.supEngineer = null; + vendorPhone.text = person?.contact ?? ''; + vendorEmail.text = person?.email ?? ''; + setState(() {}); + }, + ), + 8.height, + SingleItemDropDownMenu( + context: context, + backgroundColor: _demoFormModel.vendor?.suppliername == null + ? context.isDark + ? AppColor.neutral20 + : AppColor.neutral40 + : AppColor.fieldBgColor(context), + title: "Representative Name".addTranslation, + showShadow: false, + enabled: _demoFormModel.vendor?.suppPersons?.isNotEmpty ?? false, + staticData: _demoFormModel.vendor?.suppPersons, + showAsBottomSheet: true, + initialValue: _demoFormModel.supEngineer == null ? null : SuppPersons.fromJson(_demoFormModel.supEngineer?.toJson()), + onSelect: (suppPerson) { + if (suppPerson != null) { + _demoFormModel.supEngineer = SuppEngineerWorkOrders.fromJson(suppPerson.toJson()); + + setState(() {}); + } + }, + ), + 8.height, + AppTextFormField( + controller: vendorPhone, + enable: false, + labelText: "Contact Number", + style: Theme.of(context).textTheme.titleMedium, + backgroundColor: AppColor.fieldBgColor(context), + labelStyle: AppTextStyles.textFieldLabelStyle.copyWith(color: AppColor.textColor(context)), + showShadow: false, + textInputType: TextInputType.phone, + textInputAction: TextInputAction.next, + onChange: (value) { + _demoFormModel.vendorContactNumber = value; + }, + ), + 8.height, + AppTextFormField( + labelText: "Email", + controller: vendorEmail, + enable: false, + style: Theme.of(context).textTheme.titleMedium, + backgroundColor: AppColor.fieldBgColor(context), + labelStyle: AppTextStyles.textFieldLabelStyle.copyWith(color: AppColor.textColor(context)), + showShadow: false, + textInputType: TextInputType.emailAddress, + textInputAction: TextInputAction.next, + onChange: (value) { + _demoFormModel.vendorEmail = value; + }, + ), + ]; + } + + Future _update() async { + FocusScope.of(context).unfocus(); + if (_formKey.currentState!.validate()) { + _formKey.currentState!.save(); + _demoFormModel.demoAttachment = []; + for (var item in attachments) { + String fileName = CMRequestUtils.isLocalUrl(item.name ?? '') ? ("${item.name ?? ''.split("/").last}|${base64Encode(File(item.name ?? '').readAsBytesSync())}") : item.name ?? ''; + //Todo need to pass attachmentType id as well. + _demoFormModel.demoAttachment?.add(DemoAttachments(id: item.id, demoRequestId: _demoFormModel.id ?? 0, attachmentName: fileName)); + } + Utils.showLoading(context); + DemoProvider demoProvider = Provider.of(context, listen: false); + bool isSuccess = await demoProvider.updateDemoRequest(_demoFormModel.toJson()); + Utils.hideLoading(context); + if (isSuccess) { + Navigator.pop(context, true); + } + } + } +} diff --git a/lib/modules/demo_module/update_request_detail_view.dart b/lib/modules/demo_module/update_request_detail_view.dart deleted file mode 100644 index 51740a68..00000000 --- a/lib/modules/demo_module/update_request_detail_view.dart +++ /dev/null @@ -1,257 +0,0 @@ -import 'dart:convert'; -import 'dart:developer'; -import 'dart:io'; - -import 'package:flutter/material.dart'; -import 'package:provider/provider.dart'; -import 'package:test_sa/controllers/providers/api/device_transfer_provider.dart'; -import 'package:test_sa/controllers/validator/validator.dart'; -import 'package:test_sa/dashboard_latest/dashboard_provider.dart'; -import 'package:test_sa/extensions/context_extension.dart'; -import 'package:test_sa/extensions/int_extensions.dart'; -import 'package:test_sa/extensions/string_extensions.dart'; -import 'package:test_sa/extensions/text_extensions.dart'; -import 'package:test_sa/extensions/widget_extensions.dart'; -import 'package:test_sa/helper/utils.dart'; -import 'package:test_sa/models/device/asset.dart'; -import 'package:test_sa/models/enums/user_types.dart'; -import 'package:test_sa/models/generic_attachment_model.dart'; -import 'package:test_sa/models/lookup.dart'; -import 'package:test_sa/models/new_models/site.dart'; -import 'package:test_sa/models/new_models/task_request/task_type_model.dart'; -import 'package:test_sa/models/new_models/work_order_detail_model.dart'; -import 'package:test_sa/models/service_request/supp_engineer_work_orders.dart'; -import 'package:test_sa/models/service_request/supplier_details.dart'; -import 'package:test_sa/modules/cm_module/cm_request_utils.dart'; -import 'package:test_sa/modules/cm_module/views/components/action_button/footer_action_button.dart'; -import 'package:test_sa/modules/demo_module/models/demo_attachment_model.dart'; -import 'package:test_sa/modules/demo_module/models/demo_request_model.dart'; -import 'package:test_sa/modules/demo_module/provider/demo_period_lookup_provider.dart'; -import 'package:test_sa/modules/demo_module/provider/demo_provider.dart'; -import 'package:test_sa/modules/loan_module/models/loan_form_model.dart'; -import 'package:test_sa/modules/loan_module/models/medical_department_model.dart'; -import 'package:test_sa/modules/loan_module/provider/loan_period_provider.dart'; -import 'package:test_sa/modules/loan_module/provider/loan_provider.dart'; -import 'package:test_sa/modules/loan_module/provider/loan_provider.dart'; -import 'package:test_sa/modules/loan_module/provider/medical_department_provider.dart'; -import 'package:test_sa/new_views/app_style/app_color.dart'; -import 'package:test_sa/new_views/common_widgets/app_filled_button.dart'; -import 'package:test_sa/new_views/common_widgets/app_text_form_field.dart'; -import 'package:test_sa/new_views/common_widgets/single_item_drop_down_menu.dart'; -import 'package:test_sa/providers/department_provider.dart'; -import 'package:test_sa/providers/gas_request_providers/site_provider.dart'; -import 'package:test_sa/providers/loading_list_notifier.dart'; -import 'package:test_sa/providers/work_order/vendor_provider.dart'; -import 'package:test_sa/views/widgets/images/multi_image_picker.dart'; -import '../../../../../../new_views/common_widgets/default_app_bar.dart'; -import 'demo_detail_view_page.dart'; -import 'models/demo_form_model.dart'; - -class UpdateRequestView extends StatefulWidget { - static const String id = "/update-demo-request"; - DemoRequestModel dataModel; - - UpdateRequestView({Key? key, required this.dataModel}) : super(key: key); - - @override - _UpdateRequestViewState createState() => _UpdateRequestViewState(); -} - -class _UpdateRequestViewState extends State with TickerProviderStateMixin { - final List attachments = []; - final GlobalKey _formKey = GlobalKey(); - final GlobalKey _scaffoldKey = GlobalKey(); - final DemoFormModel _demoFormModel = DemoFormModel(); - TextEditingController vendorEmailController = TextEditingController(); - TextEditingController vendorPhoneController = TextEditingController(); - - @override - void dispose() { - vendorEmailController.dispose(); - vendorPhoneController.dispose(); - super.dispose(); - } - - @override - void initState() { - super.initState(); - fillData(); - } - - void fillData() async { - final vendorProvider = Provider.of(context, listen: false); - if (vendorProvider.items.isEmpty) { - if (mounted) { - await vendorProvider.getData(); - } - } - - final supplier = widget.dataModel.supplier; - _demoFormModel.vendor = supplier; - final selectedVendor = vendorProvider.items.firstWhere( - (element) => element.id == supplier?.id, - orElse: () => SupplierDetails(), - ); - _demoFormModel.id = widget.dataModel.id; - _demoFormModel.vendor?.suppPersons = selectedVendor.suppPersons; - _demoFormModel.supEngineer = widget.dataModel.suppPerson; - _demoFormModel.vendorEmail = supplier?.email; - _demoFormModel.vendorContactNumber = supplier?.contact; - - vendorEmailController.text = supplier?.email ?? ''; - vendorPhoneController.text = supplier?.contact ?? ''; - // ✅ PREFILL ATTACHMENTS - attachments.clear(); - if (widget.dataModel.demoAttachments?.isNotEmpty ?? false) { - for (final item in widget.dataModel.demoAttachments!) { - if ((item.attachmentName ?? '').isNotEmpty) { - attachments.add( - GenericAttachmentModel(name: item.attachmentName, id: item.id ?? 0, originalName: item.originalName), - ); - } - } - } - - setState(() {}); - } - - @override - Widget build(BuildContext context) { - return Scaffold( - key: _scaffoldKey, - appBar: DefaultAppBar(title: 'Update Request'.addTranslation), - body: Form( - key: _formKey, - child: Column( - children: [ - SingleChildScrollView( - padding: const EdgeInsets.all(16), - child: Column( - crossAxisAlignment: CrossAxisAlignment.start, - mainAxisSize: MainAxisSize.min, - children: [ - ...vendorDetailsSection(), - 16.height, - AttachmentPicker( - label: context.translation.attachments, - attachment: attachments, - buttonColor: AppColor.black10, - onlyImages: false, - showAsListView: true, - buttonIcon: 'image-plus'.toSvgAsset(color: context.isDark ? AppColor.primary10 : AppColor.neutral120), - ), - ], - ).toShadowContainer(context, borderRadius: 20), - ).expanded, - FooterActionButton.footerContainer( - context: context, - child: AppFilledButton( - buttonColor: AppColor.primary10, - label: context.translation.update, - onPressed: _update, - // buttonColor: AppColor.primary10, - ), - ), - ], - ), - ), - ); - } - - List vendorDetailsSection() { - return [ - 'Vendor Details'.addTranslation.bodyText(context).custom(color: AppColor.black10), - 8.height, - SingleItemDropDownMenu( - key: ValueKey(_demoFormModel.vendor?.id), - context: context, - title: 'Vendor Name'.addTranslation, - backgroundColor: AppColor.fieldBgColor(context), - initialValue: _demoFormModel.vendor, - showAsBottomSheet: true, - showShadow: false, - showCancel: true, - onSelect: (person) { - _demoFormModel.vendor = person; - _demoFormModel.supEngineer = null; - vendorPhoneController.text = person?.contact ?? ''; - vendorEmailController.text = person?.email ?? ''; - setState(() {}); - }, - ), - 8.height, - SingleItemDropDownMenu( - key: ValueKey(_demoFormModel.supEngineer?.id), - context: context, - backgroundColor: _demoFormModel.vendor?.suppliername == null - ? context.isDark - ? AppColor.neutral20 - : AppColor.neutral40 - : AppColor.fieldBgColor(context), - title: "Representative Name".addTranslation, - showShadow: false, - enabled: _demoFormModel.vendor?.suppPersons?.isNotEmpty ?? false, - staticData: _demoFormModel.vendor?.suppPersons, - showAsBottomSheet: true, - initialValue: _demoFormModel.supEngineer == null ? null : SuppPersons.fromJson(_demoFormModel.supEngineer?.toJson()), - onSelect: (suppPerson) { - if (suppPerson != null) { - _demoFormModel.supEngineer = SuppEngineerWorkOrders.fromJson(suppPerson.toJson()); - - setState(() {}); - } - }, - ), - 8.height, - AppTextFormField( - controller: vendorPhoneController, - enable: false, - labelText: "Contact Number", - style: Theme.of(context).textTheme.titleMedium, - backgroundColor: AppColor.fieldBgColor(context), - labelStyle: AppTextStyles.textFieldLabelStyle.copyWith(color: AppColor.textColor(context)), - showShadow: false, - textInputType: TextInputType.phone, - textInputAction: TextInputAction.next, - onChange: (value) { - _demoFormModel.vendorContactNumber = value; - }, - ), - 8.height, - AppTextFormField( - labelText: "Email", - controller: vendorEmailController, - enable: false, - style: Theme.of(context).textTheme.titleMedium, - backgroundColor: AppColor.fieldBgColor(context), - labelStyle: AppTextStyles.textFieldLabelStyle.copyWith(color: AppColor.textColor(context)), - showShadow: false, - textInputType: TextInputType.emailAddress, - textInputAction: TextInputAction.next, - onChange: (value) { - _demoFormModel.vendorEmail = value; - }, - ), - ]; - } - - Future _update() async { - FocusScope.of(context).unfocus(); - if (_formKey.currentState!.validate()) { - _formKey.currentState!.save(); - _demoFormModel.demoAttachment = []; - for (var item in attachments) { - String fileName = CMRequestUtils.isLocalUrl(item.name ?? '') ? ("${item.name ?? ''.split("/").last}|${base64Encode(File(item.name ?? '').readAsBytesSync())}") : item.name ?? ''; - _demoFormModel.demoAttachment?.add(DemoAttachments(id: 0, attachmentName: fileName, demoRequestId: 0)); - _demoFormModel.demoAttachment?.add(DemoAttachments(id: item.id, demoRequestId: _demoFormModel.id ?? 0, attachmentName: fileName)); - } - Utils.showLoading(context); - DemoProvider demoProvider = Provider.of(context, listen: false); - bool isSuccess = await demoProvider.updateDemoRequest(_demoFormModel.toUpdateJson()); - Utils.hideLoading(context); - if (isSuccess) { - Navigator.pop(context, true); - } - } - } -} diff --git a/lib/new_views/app_style/app_color.dart b/lib/new_views/app_style/app_color.dart index 5732ba51..e29401cf 100644 --- a/lib/new_views/app_style/app_color.dart +++ b/lib/new_views/app_style/app_color.dart @@ -205,7 +205,7 @@ class AppColor { return orange30; case "reviewed": return orange30; - case "returned for correction": + case "returned for correction": return orange30; default: return Colors.white; @@ -259,7 +259,8 @@ class AppColor { return blueStatus(context); } } - static Color demoRequestStatus(BuildContext context, int id) { + + static Color demoRequestStatus(BuildContext context, int id) { switch (id) { case 1: return blueStatus(context); @@ -270,7 +271,7 @@ class AppColor { case 4: return yellowStatus(context); default: - return blueStatus(context); + return yellowStatus(context); } } @@ -286,16 +287,17 @@ class AppColor { return Colors.white; } } + static Color demoRequestStatusTextColor(BuildContext context, int id) { switch (id) { case 2: return orange60; case 4: - return Colors.white; + return orange60; case 9: return orange60; default: - return Colors.white; + return orange60; } } diff --git a/lib/new_views/pages/land_page/my_request/all_requests_filter_page.dart b/lib/new_views/pages/land_page/my_request/all_requests_filter_page.dart index c96053b5..5fe5d4b2 100644 --- a/lib/new_views/pages/land_page/my_request/all_requests_filter_page.dart +++ b/lib/new_views/pages/land_page/my_request/all_requests_filter_page.dart @@ -79,9 +79,9 @@ class _AllRequestsFilterPageState extends State { if (isEngineer) { types[context.translation.recurrentWo] = 5; - if (context.settingProvider.isUserFlowMedical) types["Equipment Internal Audit".addTranslation] = 10; - if (context.settingProvider.isUserFlowMedical) types["System Internal Audit".addTranslation] = 11; - if (context.settingProvider.isUserFlowMedical) types["Medical Gas Inspection".addTranslation] = 11; + if (context.settingProvider.isUserFlowMedical) types["Equipment Internal Audit".addTranslation] = 10; + if (context.settingProvider.isUserFlowMedical) types["System Internal Audit".addTranslation] = 11; + if (context.settingProvider.isUserFlowMedical) types["Medical Gas Inspection".addTranslation] = 11; } if (context.settingProvider.isUserFlowMedical && isEngineer) { @@ -104,8 +104,8 @@ class _AllRequestsFilterPageState extends State { // } if (context.userProvider.isQualityUser) { if (context.settingProvider.isUserFlowMedical) types = {'Recall and Alert': 7}; - if (context.settingProvider.isUserFlowMedical) types['Equipment Internal Audit'] = 10; - if (context.settingProvider.isUserFlowMedical) types['System Internal Audit'] = 11; + if (context.settingProvider.isUserFlowMedical) types['Equipment Internal Audit'] = 10; + if (context.settingProvider.isUserFlowMedical) types['System Internal Audit'] = 11; } if (context.userProvider.isCommissioningEngineer) { ///TODO need to check what other requests type needed here. @@ -113,7 +113,13 @@ class _AllRequestsFilterPageState extends State { 'Asset Delivery': 13, }; } + ///TODO need add accessor filter as well. + if (context.userProvider.isAssessor) { + types = { + 'Demo Request': 15, + }; + } final statuses = { "All WO": 0, diff --git a/lib/new_views/pages/land_page/my_request/my_requests_page.dart b/lib/new_views/pages/land_page/my_request/my_requests_page.dart index 350167b5..66ea1661 100644 --- a/lib/new_views/pages/land_page/my_request/my_requests_page.dart +++ b/lib/new_views/pages/land_page/my_request/my_requests_page.dart @@ -75,8 +75,6 @@ class _MyRequestsPageState extends State { } requestsList.add(Request(12, "Loan Equipment")); - //Todo need to remove this only for accessor - requestsList.add(Request(15, "Demo Request")); if (context.userProvider.isAssessor) { requestsList = [ Request(null, context.translation.allWorkOrder), diff --git a/lib/new_views/pages/land_page/requests/request_paginated_listview.dart b/lib/new_views/pages/land_page/requests/request_paginated_listview.dart index 89e1bdd3..06bdc701 100644 --- a/lib/new_views/pages/land_page/requests/request_paginated_listview.dart +++ b/lib/new_views/pages/land_page/requests/request_paginated_listview.dart @@ -82,7 +82,6 @@ class RequestPaginatedListview extends StatelessWidget { return AssetDeliveryItemView(requestData: request); case 14: return MedicalGasInspectionItemView(requestData: request); - //TODO need to change number case 15: return DemoRequestItemView(requestData: request); default: diff --git a/lib/new_views/pages/land_page/widgets/request_item_view_list.dart b/lib/new_views/pages/land_page/widgets/request_item_view_list.dart index d6d89811..537b75c6 100644 --- a/lib/new_views/pages/land_page/widgets/request_item_view_list.dart +++ b/lib/new_views/pages/land_page/widgets/request_item_view_list.dart @@ -38,14 +38,14 @@ class RequestItemViewList extends StatelessWidget { shrinkWrap: true, itemBuilder: (cxt, index) { if (isLoading) return const SizedBox().toRequestShimmer(cxt, isLoading); - // if (list[index].transactionType == null) { - // return EquipmentInternalAuditItemView(requestDetails: list[index]); - // // return Container( - // // height: 100, - // // width: double.infinity, - // // color: AppColor.neutral40, - // // ); - // } + if (list[index].transactionType == 12) { + return DemoRequestItemView(requestDetails: list[index]);; + // return Container( + // height: 100, + // width: double.infinity, + // color: AppColor.neutral40, + // ); + } switch (list[index].transactionType) { case 1: return ServiceRequestItemView(requestDetails: list[index]); @@ -72,17 +72,14 @@ class RequestItemViewList extends StatelessWidget { return EquipmentInternalAuditItemView(requestDetails: list[index]); case 11: return SystemInternalAuditItemView(requestDetails: list[index]); - //TODO need to correct this after testing... - case 12: - return DemoRequestItemView(requestDetails: list[index]); case 12: return LoanEquipmentItemView(requestDetails: list[index]); case 13: return AssetDeliveryItemView(requestDetails: list[index]); case 14: return MedicalGasInspectionItemView(requestDetails: list[index]); - - + case 15: + return DemoRequestItemView(requestDetails: list[index]); default: Container( height: 100,