From e0ed594072c17ac6b54071bf071e5fb3e5378c3a Mon Sep 17 00:00:00 2001 From: WaseemAbbasi22 Date: Thu, 22 Jan 2026 16:47:07 +0300 Subject: [PATCH] API's implemented --- lib/controllers/api_routes/urls.dart | 10 +- .../widgets/request_category_list.dart | 4 + lib/extensions/enum_extensions.dart | 34 ++- lib/main.dart | 2 +- lib/models/enums/demo_request_step.dart | 6 + lib/models/lookup.dart | 8 +- .../action_button/footer_action_button.dart | 113 ++++++++ .../demo_module/create_demo_request_page.dart | 116 ++++---- .../demo_module/demo_activities_page.dart | 21 +- .../demo_module/demo_detail_view_page.dart | 214 +++++++-------- .../demo_extension_bottom_sheet.dart | 182 ++++++------- .../demo_module/demo_request_item_view.dart | 91 +++++++ .../models/demo_attachment_model.dart | 27 ++ .../demo_module/models/demo_form_model.dart | 142 +++------- .../models/demo_request_model.dart | 127 +++++++++ .../demo_period_lookup_provider.dart | 6 +- .../demo_module/provider/demo_provider.dart | 65 ++++- .../update_request_detail_view.dart | 257 ++++++++++++++++++ lib/new_views/app_style/app_color.dart | 26 ++ .../requests/request_paginated_listview.dart | 8 +- .../widgets/request_item_view_list.dart | 5 + 21 files changed, 1065 insertions(+), 399 deletions(-) create mode 100644 lib/models/enums/demo_request_step.dart create mode 100644 lib/modules/demo_module/demo_request_item_view.dart create mode 100644 lib/modules/demo_module/models/demo_attachment_model.dart create mode 100644 lib/modules/demo_module/models/demo_request_model.dart rename lib/modules/demo_module/{ => provider}/demo_period_lookup_provider.dart (85%) create mode 100644 lib/modules/demo_module/update_request_detail_view.dart diff --git a/lib/controllers/api_routes/urls.dart b/lib/controllers/api_routes/urls.dart index eed578cf..aa711bab 100644 --- a/lib/controllers/api_routes/urls.dart +++ b/lib/controllers/api_routes/urls.dart @@ -8,10 +8,10 @@ class URLs { // 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 + static final String _baseUrl = "$_host/v2/mobile"; // new V2 apis // static final String _baseUrl = "$_host/mobile"; // host local UAT and for internal audit dev // static final String _baseUrl = "$_host/v3/mobile"; // v3 for production CM,PM,TM - static final String _baseUrl = "$_host/v4/mobile"; // v4 for Demo module + // static final String _baseUrl = "$_host/v4/mobile"; // v4 for Demo module // static final String _baseUrl = "$_host/v5/mobile"; // v5 for data segregation static const String chatHubUrl = "https://apiderichat.hmg.com/chathub"; @@ -451,6 +451,12 @@ class URLs { static get getMedicalGasById => "$_baseUrl/MedicalGas/GetMedicalGasRequestByIdAsync"; static get updateDeliveryNote => "$_baseUrl/MedicalGas/MedicalGasRequestDeliveryNotesAsync"; +//Demo Request... + static get addDemoRequest => "$_baseUrl/DemoRequest/AddDemoRequest"; + static get updateDemoRequest => "$_baseUrl/DemoRequest/UpdateDemoRequest"; + static get getDemoRequestById => "$_baseUrl/DemoRequest"; + static get updateDemoRequestByAssessor => "$_baseUrl/DemoRequest/UpdateDemoRequestByAssessor"; + static get updateDemoPeriodByRequester => "$_baseUrl/DemoRequest/UpdateDemoPeriodByRequester"; } diff --git a/lib/dashboard_latest/widgets/request_category_list.dart b/lib/dashboard_latest/widgets/request_category_list.dart index 9ae0e6ce..a0117592 100644 --- a/lib/dashboard_latest/widgets/request_category_list.dart +++ b/lib/dashboard_latest/widgets/request_category_list.dart @@ -4,6 +4,7 @@ import 'package:test_sa/extensions/widget_extensions.dart'; import 'package:test_sa/models/new_models/dashboard_detail.dart'; import 'package:test_sa/modules/asset_delivery_module/pages/asset_delivery_item_view.dart'; 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/tm_module/tasks/task_request_item_view.dart'; import 'package:test_sa/modules/traf_module/traf_request_item_view.dart'; @@ -65,6 +66,9 @@ class RequestCategoryList extends StatelessWidget { return EquipmentInternalAuditItemView(requestData: request); case 13: return AssetDeliveryItemView(requestData: request); + //Todo need to verify this... + case 15: + return DemoRequestItemView(requestData: request); default: return Container( height: 100, diff --git a/lib/extensions/enum_extensions.dart b/lib/extensions/enum_extensions.dart index 24d0a479..da884bcc 100644 --- a/lib/extensions/enum_extensions.dart +++ b/lib/extensions/enum_extensions.dart @@ -1,4 +1,5 @@ import 'package:test_sa/app_strings/app_asset.dart'; +import 'package:test_sa/models/enums/demo_request_step.dart'; import 'package:test_sa/models/enums/recurrent_task_inspection_data_type.dart'; import 'package:test_sa/models/enums/swipe_type.dart'; import 'package:test_sa/models/enums/work_order_next_step.dart'; @@ -68,9 +69,9 @@ extension IntExtensionsWorkOrder on int { return WorkOrderNextStepEnum.assetRetirementManagementApproval; case 31: return WorkOrderNextStepEnum.waitingForRequesterToConfirm; - case 35: + case 35: return WorkOrderNextStepEnum.eFixRemotely; - case 36: + case 36: return WorkOrderNextStepEnum.eNeedVisit; default: return WorkOrderNextStepEnum.assignToMe; @@ -95,9 +96,27 @@ extension IntExtensionsWorkOrder on int { } } +extension IntExtensionsDemoRequest on int { + DemoRequestStepEnum toDemoRequestStepEnum() { + //Todo need to check exact stages + switch (this) { + case 4: + return DemoRequestStepEnum.extendDemoPeriod; + case 2: + return DemoRequestStepEnum.qAuditorRejectAccept; + case 3: + return DemoRequestStepEnum.updateRequest; + case 5: + return DemoRequestStepEnum.viewOnly; + case 6: + return DemoRequestStepEnum.extendDemoPeriod; + default: + return DemoRequestStepEnum.viewOnly; + } + } +} - -extension EnumExtensionsSwipeType on SwipeTypeEnum { +extension EnumExtensionsSwipeType on SwipeTypeEnum { int getIntFromSwipeTypeEnum() { switch (this) { case SwipeTypeEnum.NFC: @@ -109,7 +128,8 @@ extension EnumExtensionsSwipeType on SwipeTypeEnum { } } } -extension StringExtensionsRecurrentTaskInpesctionDataType on String { + +extension StringExtensionsRecurrentTaskInpesctionDataType on String { RecurrentTaskInspectionDataTypeEnum toRecurrentTaskInspectionDataTypeEnum() { switch (this) { case 'bool': @@ -122,7 +142,6 @@ extension StringExtensionsRecurrentTaskInpesctionDataType on String { } } - extension IntExtensionsAssetDeliveryStage on int { AssetDeliveryStageEnum toAssetDeliveryStageEnum() { switch (this) { @@ -138,17 +157,16 @@ extension IntExtensionsAssetDeliveryStage on int { } } - enum DropDownMatchType { identifier, name, } - enum CostCenterType { costCenter, serialNumber, } + enum AssetDeliveryStageEnum { deliveryInspection, technicalInspection, diff --git a/lib/main.dart b/lib/main.dart index e87ba503..11d789a4 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -38,7 +38,7 @@ import 'package:test_sa/modules/cm_module/cm_detail_provider.dart'; import 'package:test_sa/modules/cm_module/create_cm_request.dart'; import 'package:test_sa/modules/cx_module/chat/chat_provider.dart'; import 'package:test_sa/modules/demo_module/create_demo_request_page.dart'; -import 'package:test_sa/modules/demo_module/demo_period_lookup_provider.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/internal_audit_module/pages/equipment_internal_audit/create_equipment_internal_audit_form.dart'; import 'package:test_sa/modules/internal_audit_module/pages/system_internal_audit/create_system_internal_audit_form.dart'; diff --git a/lib/models/enums/demo_request_step.dart b/lib/models/enums/demo_request_step.dart new file mode 100644 index 00000000..669076a6 --- /dev/null +++ b/lib/models/enums/demo_request_step.dart @@ -0,0 +1,6 @@ +enum DemoRequestStepEnum { + qAuditorRejectAccept, // quality auditor accept reject + updateRequest, // quality auditor edit reject, // 5 + extendDemoPeriod, // extent + viewOnly, // need to check when show view only +} diff --git a/lib/models/lookup.dart b/lib/models/lookup.dart index 1af16028..579c8b52 100644 --- a/lib/models/lookup.dart +++ b/lib/models/lookup.dart @@ -1,16 +1,21 @@ +import 'dart:developer'; + import 'package:test_sa/extensions/enum_extensions.dart'; +import 'package:test_sa/models/enums/demo_request_step.dart'; import 'package:test_sa/models/enums/work_order_next_step.dart'; import 'base.dart'; +//Need to change this to accept generic enum model.. class Lookup extends Base { int? id; // Now nullable int? value; // Now nullable WorkOrderNextStepEnum? workOrderNextStepEnum; // Now nullable AssetDeliveryStageEnum? assetDeliveryStageEnum; // Now nullable + DemoRequestStepEnum? demoRequestStepEnum; // Now nullable String? name; // Now nullable - Lookup({this.id, this.value, this.name, this.workOrderNextStepEnum, this.assetDeliveryStageEnum}) : super(identifier: id?.toString(), name: name); + Lookup({this.id, this.value, this.name, this.workOrderNextStepEnum, this.assetDeliveryStageEnum, this.demoRequestStepEnum}) : super(identifier: id?.toString(), name: name); @override bool operator ==(Object other) => identical(this, other) || other is Lookup && ((value != null && value == other.value) || (id != null && id == other.id)); @@ -44,6 +49,7 @@ class Lookup extends Base { name: parsedJson["name"], workOrderNextStepEnum: parsedJson["value"] == null ? null : (parsedJson["value"] as int).toWorkOrderNextStepEnum(), assetDeliveryStageEnum: parsedJson["value"] == null ? null : (parsedJson["value"] as int).toAssetDeliveryStageEnum(), + demoRequestStepEnum: parsedJson["value"] == null ? null : (parsedJson["value"] as int).toDemoRequestStepEnum(), id: parsedJson["id"], value: parsedJson["value"], ); 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 7a09e803..b40f6f22 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 @@ -1,3 +1,5 @@ +import 'dart:developer'; + import 'package:flutter/material.dart'; import 'package:provider/provider.dart'; import 'package:test_sa/controllers/providers/api/user_provider.dart'; @@ -6,6 +8,8 @@ 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/enums/demo_request_step.dart'; import 'package:test_sa/models/enums/user_types.dart'; import 'package:test_sa/models/enums/work_order_next_step.dart'; import 'package:test_sa/models/helper_data_models/workorder/work_order_helper_models.dart'; @@ -16,6 +20,10 @@ import 'package:test_sa/modules/cm_module/views/components/activities_list_view. import 'package:test_sa/modules/cm_module/views/components/bottom_sheets/service_request_bottomsheet.dart'; import 'package:test_sa/modules/cm_module/views/components/verify_arrival_view.dart'; import 'package:test_sa/modules/cm_module/views/forms/asset_retired/verify_asset_detail.dart'; +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/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'; @@ -358,4 +366,109 @@ class FooterActionButton { } return const SizedBox(); } + + static Widget demoRequestDetailsFooterWidget({ + required BuildContext context, + Lookup? status, + required DemoRequestModel dataModel, + required DemoRequestStepEnum demoRequestStage, + required Function(bool status) refreshData, + }) { + 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) { + switch (demoRequestStage) { + case DemoRequestStepEnum.qAuditorRejectAccept: + return footerContainer( + context: context, + child: Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + mainAxisSize: MainAxisSize.min, + children: [ + AppFilledButton( + label: context.translation.reject, + maxWidth: true, + buttonColor: AppColor.background(context), + textColor: AppColor.red30, + showBorder: true, + onPressed: () async { + Utils.showLoading(context); + bool responseStatus = await demoProvider.acceptRejectRequest(requestId: dataModel.id!, status: false); + Utils.hideLoading(context); + if (responseStatus) { + Navigator.pop(context); + } + }, + ).expanded, + const SizedBox( + width: 20, + ), + AppFilledButton( + label: context.translation.accept, + maxWidth: true, + buttonColor: AppColor.green70, + onPressed: () async { + Utils.showLoading(context); + bool responseStatus = await demoProvider.acceptRejectRequest(requestId: dataModel.id!, status: true); + Utils.hideLoading(context); + if (responseStatus) { + refreshData(true); + } + }, + ).expanded, + ], + )); + case DemoRequestStepEnum.updateRequest: + return footerContainer( + context: context, + child: AppFilledButton( + label: context.translation.updateRequest, + // maxWidth: true, + buttonColor: AppColor.primary10, + onPressed: () async { + bool? isRefresh = await Navigator.push( + context, + MaterialPageRoute( + builder: (context) => UpdateRequestView( + dataModel: dataModel, + ))); + if (isRefresh == true) { + refreshData(true); + } + }, + ), + ); + case DemoRequestStepEnum.viewOnly: + return const SizedBox(); + case DemoRequestStepEnum.extendDemoPeriod: + return footerContainer( + context: context, + child: AppFilledButton( + buttonColor: AppColor.primary10, + label: "Extension Request", + onPressed: () async { + final bool? isRefresh = await showModalBottomSheet( + context: context, + useSafeArea: true, + backgroundColor: Colors.transparent, + isScrollControlled: true, + builder: (_) => DemoExtensionBottomSheet( + requestId: dataModel.id!, + ), + ); + if (isRefresh == true) { + refreshData(true); + } + }, + ), + ); + } + } else { + if (demoRequestStage == DemoRequestStepEnum.viewOnly) { + return const SizedBox(); + } + } + return const SizedBox(); + } } diff --git a/lib/modules/demo_module/create_demo_request_page.dart b/lib/modules/demo_module/create_demo_request_page.dart index 353798fc..5a7b2211 100644 --- a/lib/modules/demo_module/create_demo_request_page.dart +++ b/lib/modules/demo_module/create_demo_request_page.dart @@ -1,4 +1,5 @@ import 'dart:convert'; +import 'dart:developer'; import 'dart:io'; import 'package:flutter/material.dart'; @@ -19,10 +20,13 @@ 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/demo_period_lookup_provider.dart'; +import 'package:test_sa/modules/demo_module/models/demo_attachment_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'; @@ -55,15 +59,16 @@ class _CreateDemoRequestPageState extends State with Tick final List attachments = []; final GlobalKey _formKey = GlobalKey(); final GlobalKey _scaffoldKey = GlobalKey(); - TaskType? selectedType; final DemoFormModel _demoFormModel = DemoFormModel(); + TextEditingController vendorEmailController = TextEditingController(); + TextEditingController vendorPhoneController = TextEditingController(); - TextEditingController commentController = TextEditingController(); - - SupplierDetails? supplier; - - Lookup? demoPeriodLookup; - + @override + void dispose() { + vendorEmailController.dispose(); + vendorPhoneController.dispose(); + super.dispose(); + } @override void initState() { @@ -284,6 +289,24 @@ class _CreateDemoRequestPageState extends State with Tick return [ 'Asset Details'.addTranslation.bodyText(context).custom(color: AppColor.black10), 8.height, + AppTextFormField( + labelText: "Asset 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)), + 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", validator: (value) { @@ -324,7 +347,7 @@ class _CreateDemoRequestPageState extends State with Tick context: context, height: 56.toScreenHeight, title: "Demo Period", - initialValue: demoPeriodLookup, + initialValue: _demoFormModel.demoPeriod, showShadow: false, validator: (value) { if (value == null) return "Mandatory"; @@ -333,7 +356,7 @@ class _CreateDemoRequestPageState extends State with Tick backgroundColor: AppColor.fieldBgColor(context), showAsBottomSheet: true, onSelect: (value) { - demoPeriodLookup = value; + _demoFormModel.demoPeriod = value; setState(() {}); }, ), @@ -344,44 +367,48 @@ class _CreateDemoRequestPageState extends State with Tick return [ 'Vendor Details'.addTranslation.bodyText(context).custom(color: AppColor.black10), 8.height, - AppTextFormField( - initialValue: "", - labelText: "Name", - validator: (value) { - if ((value ?? "").isEmpty) return "Mandatory"; - return null; - }, - style: Theme.of(context).textTheme.titleMedium, + SingleItemDropDownMenu( + context: context, + title: 'Vendor Name'.addTranslation, backgroundColor: AppColor.fieldBgColor(context), - labelStyle: AppTextStyles.textFieldLabelStyle.copyWith(color: AppColor.textColor(context)), + initialValue: _demoFormModel.vendor, + showAsBottomSheet: true, showShadow: false, - textInputType: TextInputType.name, - textInputAction: TextInputAction.next, - onChange: (value) { - _demoFormModel.vendorName = value; + showCancel: true, + onSelect: (person) { + _demoFormModel.vendor = person; + _demoFormModel.supEngineer = null; + vendorPhoneController.text = person?.contact ?? ''; + vendorEmailController.text = person?.email ?? ''; + setState(() {}); }, ), 8.height, - AppTextFormField( - initialValue: "", - labelText: "Representative 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)), + SingleItemDropDownMenu( + context: context, + backgroundColor: _demoFormModel.vendor?.suppliername == null + ? context.isDark + ? AppColor.neutral20 + : AppColor.neutral40 + : AppColor.fieldBgColor(context), + title: "Representative Name".addTranslation, showShadow: false, - textInputType: TextInputType.name, - textInputAction: TextInputAction.next, - onChange: (value) { - _demoFormModel.vendorRepresentativeName = value; + 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( - initialValue: "", + controller: vendorPhoneController, + enable: false, labelText: "Contact Number", validator: (value) { if ((value ?? "").isEmpty) return "Mandatory"; @@ -399,8 +426,9 @@ class _CreateDemoRequestPageState extends State with Tick ), 8.height, AppTextFormField( - initialValue: "", labelText: "Email", + controller: vendorEmailController, + enable: false, validator: (value) { if ((value ?? "").isEmpty) { return "Mandatory"; @@ -425,20 +453,14 @@ class _CreateDemoRequestPageState extends State with Tick 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)); } Utils.showLoading(context); - LoanProvider loanProvider = Provider.of(context, listen: false); - Map body = _demoFormModel.toJson(); - body["id"] = 0; - // body["LoanTypeId"] = 0; - // body["requestorUserID"] = context.userProvider.user!.userID; - - bool isSuccess = await loanProvider.addLoanRequest(body); + DemoProvider demoProvider = Provider.of(context, listen: false); + bool isSuccess = await demoProvider.addDemoRequest(_demoFormModel.toJson()); Utils.hideLoading(context); if (isSuccess) { Navigator.pop(context); diff --git a/lib/modules/demo_module/demo_activities_page.dart b/lib/modules/demo_module/demo_activities_page.dart index 5b422148..c4252970 100644 --- a/lib/modules/demo_module/demo_activities_page.dart +++ b/lib/modules/demo_module/demo_activities_page.dart @@ -87,7 +87,10 @@ class DemoActivitiesPage extends StatelessWidget { child: AppFilledButton( buttonColor: AppColor.primary10, label: "Extension Request", - onPressed: () => _extensionRequest(context), + // onPressed: () => _extensionRequest(context), + onPressed: () { + + }, ), ), ], @@ -96,12 +99,12 @@ class DemoActivitiesPage extends StatelessWidget { )); } - void _extensionRequest(context) { - showModalBottomSheet( - context: context, - useSafeArea: true, - backgroundColor: Colors.transparent, - builder: (context) => const DemoExtensionBottomSheet(), - ); - } + // void _extensionRequest(context) { + // showModalBottomSheet( + // context: context, + // useSafeArea: true, + // backgroundColor: Colors.transparent, + // builder: (context) => DemoExtensionBottomSheet(), + // ); + // } } diff --git a/lib/modules/demo_module/demo_detail_view_page.dart b/lib/modules/demo_module/demo_detail_view_page.dart index c0d6c769..718fdc0b 100644 --- a/lib/modules/demo_module/demo_detail_view_page.dart +++ b/lib/modules/demo_module/demo_detail_view_page.dart @@ -4,12 +4,15 @@ 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/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'; +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/loan_module/models/loan_attachment_model.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/views/widgets/loaders/no_data_found.dart'; import '../../controllers/api_routes/urls.dart'; import '../../extensions/text_extensions.dart'; @@ -32,12 +35,36 @@ class DemoDetailViewPage extends StatefulWidget { } class _DemoDetailViewPageState extends State { + bool isLoading = false; + + DemoRequestModel? dataModel; + DemoProvider? demoProvider; + List allAttachments = []; + + //Todo need to check about attachments. + + bool loading = false; + @override void initState() { + demoProvider = Provider.of(context, listen: false); + WidgetsBinding.instance.addPostFrameCallback((_) { + getDetailsById(); + }); super.initState(); } - List allAttachments = []; + Future getDetailsById() async { + setState(() { + loading = true; + }); + // dataModel = await demoProvider?.getDemoById(widget.demoId) ?? DemoRequestModel(); + dataModel = await demoProvider?.getDemoById(11) ?? DemoRequestModel(); + // _attachments = dataModel.demoAttachments.toList() ?? []; + setState(() { + loading = false; + }); + } @override void dispose() { @@ -48,138 +75,107 @@ class _DemoDetailViewPageState extends State { Widget build(BuildContext context) { return Scaffold( appBar: const DefaultAppBar(title: "Request Details"), - body: Column( - children: [ - // FutureBuilder( - // future: Provider.of(context, listen: false).getLoanById(widget.demoId), - // builder: (BuildContext context, AsyncSnapshot snapshot) { - // if (snapshot.connectionState == ConnectionState.waiting) return const CircularProgressIndicator(color: AppColor.primary10).center; - // if (snapshot.data == null) return const NoDataFound().center; - // - // List allAttachments = snapshot.data!.loanAttachments!; - // - // return - - SingleChildScrollView( - padding: const EdgeInsets.all(16), - child: Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - // Row( - // crossAxisAlignment: CrossAxisAlignment.start, - // children: [ - // StatusLabel( - // label: snapshot.data!.loanStatusName!, - // textColor: AppColor.getRequestStatusTextColorByName(context, snapshot.data!.loanStatusName!), - // backgroundColor: AppColor.getRequestStatusColorByName(context, snapshot.data!.loanStatusName!), - // ), - // 1.width.expanded, - // Text( - // snapshot.data!.createdDate?.toServiceRequestCardFormat ?? "-", - // textAlign: TextAlign.end, - // style: AppTextStyles.tinyFont.copyWith(color: context.isDark ? AppColor.neutral10 : AppColor.neutral50), - // ), - // ], - // ), - // 12.height, - ...requesterDetails(context, LoanRequestModel()), - 12.height, - ...requestDetails(context, LoanRequestModel()), - 12.height, - ...doctorDetails(context, LoanRequestModel()), - 12.height, - ...assetDetails(context, LoanRequestModel()), - 12.height, - ...vendorDetails(context, LoanRequestModel()), - if (allAttachments.isNotEmpty) ...[ - const Divider().defaultStyle(context), - Text( - "Attachments".addTranslation, - style: AppTextStyles.heading4.copyWith(color: context.isDark ? AppColor.neutral30 : AppColor.neutral50), - ), - FilesList(images: allAttachments.map((e) => URLs.getFileUrl(e.attachmentName ?? '') ?? '').toList() ?? []), - ], - ], - ).toShadowContainer(context, padding: 12), - ) - // ; - // } - // - // ) - - .expanded, - FooterActionButton.footerContainer( - context: context, - child: AppFilledButton( - buttonColor: AppColor.primary10, - label: "Activities", - onPressed: () { - Navigator.of(context).push(MaterialPageRoute(builder: (_) => DemoActivitiesPage())); - }, - ), - ), - FooterActionButton.footerContainer( - context: context, - child: AppFilledButton( - buttonColor: AppColor.primary10, - label: context.translation.update, - onPressed: _update, - ), - ), - ], - )); + body: loading + ? const CircularProgressIndicator(color: AppColor.primary10).center + : dataModel == null + ? const NoDataFound().center + : Column( + children: [ + SingleChildScrollView( + padding: const EdgeInsets.all(16), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + if (dataModel?.status != null) ...[ + StatusLabel( + label: dataModel?.status?.name, + id: dataModel?.status?.value, + radius: 4, + textColor: AppColor.demoRequestStatusTextColor(context, dataModel!.status!.value!), + backgroundColor: AppColor.demoRequestStatus(context, dataModel!.status!.value!), + ), + 8.height, + ], + ...requesterDetails(context, dataModel), + 12.height, + ...requestDetails(context, dataModel), + 12.height, + ...doctorDetails(context, dataModel), + 12.height, + ...assetDetails(context, dataModel), + 12.height, + ...vendorDetails(context, dataModel), + if (allAttachments.isNotEmpty) ...[ + const Divider().defaultStyle(context), + Text( + "Attachments".addTranslation, + style: AppTextStyles.heading4.copyWith(color: context.isDark ? AppColor.neutral30 : AppColor.neutral50), + ), + FilesList(images: allAttachments.map((e) => URLs.getFileUrl(e.name ?? '') ?? '').toList() ?? []), + ], + ], + ).toShadowContainer(context, padding: 12), + ).expanded, + FooterActionButton.demoRequestDetailsFooterWidget( + demoRequestStage: dataModel!.status!.demoRequestStepEnum!, + dataModel: dataModel!, + status: dataModel!.status!, + context: context, + refreshData: (status) { + if (status) { + getDetailsById(); + } + }).toShadowContainer(context, padding: 0, showShadow: false, borderRadius: 0), + ], + )); } - List requestDetails(BuildContext context, LoanRequestModel loanData) { + List requestDetails(BuildContext context, DemoRequestModel? model) { return [ Text("Request Details", style: AppTextStyles.heading4.copyWith(color: context.isDark ? AppColor.neutral30 : AppColor.neutral50)), - // 'Loan Type: ${loanData.loanTypeName ?? "-"}'.bodyText(context), - 'Demo No: ${loanData.reqCode ?? "-"}'.bodyText(context), - 'Demo Period: ${loanData.loanPeriodName ?? "-"}'.bodyText(context), - '${context.translation.site}: ${loanData.siteName ?? "-"}'.bodyText(context), - '${context.translation.department}: ${loanData.departmentName ?? "-"}'.bodyText(context), - 'Item Description: ${loanData.itemDescription ?? "-"}'.bodyText(context), - 'Request Description: ${loanData.requestDescription ?? "-"}'.bodyText(context), + // 'Demo No: ${model. ?? "-"}'.bodyText(context), + 'Demo Period: ${model?.demoPeriod?.name ?? "-"}'.bodyText(context), + '${context.translation.site}: ${model?.site?.custName ?? "-"}'.bodyText(context), + '${context.translation.department}: ${model?.department?.name ?? "-"}'.bodyText(context), + 'Item Description: ${model?.itemDescription ?? "-"}'.bodyText(context), + 'Request Description: ${model?.requestDescription ?? "-"}'.bodyText(context), ]; } - List vendorDetails(BuildContext context, LoanRequestModel loanData) { + List vendorDetails(BuildContext context, DemoRequestModel? model) { return [ Text("Vendor Information", style: AppTextStyles.heading4.copyWith(color: context.isDark ? AppColor.neutral30 : AppColor.neutral50)), - 'Name: ${loanData.vendorName ?? "-"}'.bodyText(context), - 'Representative Name: ${loanData.vendorRepName ?? "-"}'.bodyText(context), - 'Contact: ${loanData.vendorContact ?? "-"}'.bodyText(context), - 'Email: ${loanData.vendorEmail ?? "-"}'.bodyText(context), + 'Name: ${model?.supplier?.name ?? "-"}'.bodyText(context), + 'Representative Name: ${model?.suppPerson?.name ?? "-"}'.bodyText(context), + 'Contact: ${model?.supplier?.contact ?? "-"}'.bodyText(context), + 'Email: ${model?.supplier?.email ?? "-"}'.bodyText(context), ]; } - List assetDetails(BuildContext context, LoanRequestModel loanData) { + List assetDetails(BuildContext context, DemoRequestModel? model) { return [ Text("Asset Information", style: AppTextStyles.heading4.copyWith(color: context.isDark ? AppColor.neutral30 : AppColor.neutral50)), - // '${context.translation.assetName}: ${loanData.assetName ?? "-"}'.bodyText(context), - // '${context.translation.assetNo}: ${loanData.assetNumber ?? "-"}'.bodyText(context), - // '${context.translation.serialNumber}: ${loanData.assetSerialNumber ?? "-"}'.bodyText(context), - '${context.translation.manufacture}: ${loanData.manufacturer ?? "-"}'.bodyText(context), - '${context.translation.model}: ${loanData.model ?? "-"}'.bodyText(context), - 'Estimated Delivery Date: 29 October, 2025'.bodyText(context), + '${context.translation.assetName}: ${model?.assetName ?? "-"}'.bodyText(context), + '${context.translation.manufacture}: ${model?.manufacturer ?? "-"}'.bodyText(context), + '${context.translation.model}: ${model?.model ?? "-"}'.bodyText(context), ]; } - List doctorDetails(BuildContext context, LoanRequestModel loanData) { + List doctorDetails(BuildContext context, DemoRequestModel? model) { return [ Text("Doctor Information", style: AppTextStyles.heading4.copyWith(color: context.isDark ? AppColor.neutral30 : AppColor.neutral50)), - 'Name: ${loanData.doctorName ?? "-"}'.bodyText(context), - 'Contact: ${loanData.doctorContact ?? "-"}'.bodyText(context), - 'Email: ${loanData.doctorEmail ?? "-"}'.bodyText(context), + 'Name: ${model?.doctorName ?? "-"}'.bodyText(context), + 'Contact: ${model?.doctorContactNumber ?? "-"}'.bodyText(context), + 'Email: ${model?.doctorContactEmail ?? "-"}'.bodyText(context), ]; } - List requesterDetails(BuildContext context, LoanRequestModel loanData) { + List requesterDetails(BuildContext context, DemoRequestModel? model) { return [ Text("Requester Information", style: AppTextStyles.heading4.copyWith(color: context.isDark ? AppColor.neutral30 : AppColor.neutral50)), - 'Name: ${loanData.requestorUserIdForDisplay ?? "-"}'.bodyText(context), - 'Email: ${loanData.requestorUserEmail ?? "-"}'.bodyText(context), - 'Contact: ${loanData.requestorUserMobileNumber ?? "-"}'.bodyText(context), + 'Name: ${model?.requesterUser?.requesterName ?? "-"}'.bodyText(context), + 'Email: ${model?.requesterUser?.requesterEmail ?? "-"}'.bodyText(context), + 'Contact: ${model?.requesterUser?.requesterMobile ?? "-"}'.bodyText(context), // 'Extension: ${loanData.requesterExtensionNo ?? "-"}'.bodyText(context), ]; } diff --git a/lib/modules/demo_module/demo_extension_bottom_sheet.dart b/lib/modules/demo_module/demo_extension_bottom_sheet.dart index 29c2eabf..6fbdaf50 100644 --- a/lib/modules/demo_module/demo_extension_bottom_sheet.dart +++ b/lib/modules/demo_module/demo_extension_bottom_sheet.dart @@ -10,6 +10,8 @@ import 'package:test_sa/extensions/widget_extensions.dart'; import 'package:test_sa/helper/utils.dart'; import 'package:test_sa/models/lookup.dart'; import 'package:test_sa/models/site_contact_info_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/common_widgets/single_item_drop_down_menu.dart'; import 'package:test_sa/views/widgets/loaders/no_data_found.dart'; import 'package:url_launcher/url_launcher_string.dart'; @@ -19,8 +21,18 @@ import '../../new_views/common_widgets/app_filled_button.dart'; import '../cm_module/views/components/action_button/footer_action_button.dart'; import '../loan_module/provider/loan_period_provider.dart'; -class DemoExtensionBottomSheet extends StatelessWidget { - const DemoExtensionBottomSheet({Key? key}) : super(key: key); +class DemoExtensionBottomSheet extends StatefulWidget { + int requestId; + + DemoExtensionBottomSheet({Key? key, required this.requestId}) : super(key: key); + + @override + State createState() => _DemoExtensionBottomSheetState(); +} + +class _DemoExtensionBottomSheetState extends State { + Lookup? demoPeriod; + final GlobalKey _formKey = GlobalKey(); @override Widget build(BuildContext context) { @@ -36,108 +48,76 @@ class DemoExtensionBottomSheet extends StatelessWidget { ), padding: EdgeInsets.symmetric(horizontal: 16.toScreenWidth, vertical: 8.toScreenHeight), child: SafeArea( - child: Column( - mainAxisSize: MainAxisSize.min, - children: [ - Container( - width: 40.toScreenWidth, - height: 5.toScreenHeight, - decoration: BoxDecoration(color: AppColor.neutral40, borderRadius: BorderRadius.circular(30)), - ), - 16.height, - Align( - alignment: AlignmentDirectional.centerStart, - child: Text( - "Select Demo Period", - style: AppTextStyles.heading3.copyWith(fontWeight: FontWeight.w600, color: context.isDark ? AppColor.neutral30 : AppColor.neutral50), + child: Form( + key: _formKey, + child: Column( + mainAxisSize: MainAxisSize.min, + children: [ + Container( + width: 40.toScreenWidth, + height: 5.toScreenHeight, + decoration: BoxDecoration(color: AppColor.neutral40, borderRadius: BorderRadius.circular(30)), + ), + 16.height, + Align( + alignment: AlignmentDirectional.centerStart, + child: Text( + "Select Demo Period", + style: AppTextStyles.heading5.copyWith(fontWeight: FontWeight.w600, color: context.isDark ? AppColor.neutral30 : AppColor.neutral50), + ), + ), + 16.height, + SingleItemDropDownMenu( + context: context, + height: 56.toScreenHeight, + title: "Demo Period", + initialValue: demoPeriod, + showShadow: false, + validator: (value) { + if (value == null) return "Mandatory"; + return null; + }, + backgroundColor: AppColor.fieldBgColor(context), + showAsBottomSheet: true, + onSelect: (value) { + demoPeriod = value; + setState(() {}); + }, + ), + 36.height, + Row( + children: [ + AppFilledButton( + label: context.translation.cancel, + buttonColor: AppColor.white60, + textColor: AppColor.black10, + loading: false, + onPressed: () async { + Navigator.pop(context,false); + }, + ).expanded, + 16.width, + AppFilledButton( + buttonColor: AppColor.primary10, + label: context.translation.submit, + onPressed: () async { + if (_formKey.currentState!.validate()) { + Utils.showLoading(context); + DemoProvider demoProvider = Provider.of(context, listen: false); + bool isSuccess = await demoProvider.updateDemoPeriod(requestId: widget.requestId, demoPeriodId: demoPeriod!.id!, isUpdateRequired: true); + Utils.hideLoading(context); + if (isSuccess) { + Navigator.pop(context, true); + } + } + }, + ).expanded, + ], ), - ), - 16.height, - SingleItemDropDownMenu( - context: context, - height: 56.toScreenHeight, - title: 'Demo Period'.addTranslation, - showShadow: false, - validator: (value) { - if (value == null) return "Please select loan period"; - return null; - }, - backgroundColor: AppColor.fieldBgColor(context), - showAsBottomSheet: true, - // initialValue: _loanFormModel.loanProvided, - onSelect: (status) { - // if (status != null) { - // _loanFormModel.loanProvided = status; - // setState(() {}); - // } - }, - ), - 36.height, - Row( - children: [ - AppFilledButton( - label: context.translation.cancel, - buttonColor: AppColor.white60, - textColor: AppColor.black10, - loading: false, - onPressed: () async { - Navigator.pop(context); - }, - ).expanded, - 16.width, - AppFilledButton( - buttonColor: AppColor.primary10, - label: context.translation.submit, - onPressed: () { - Utils.showLoading(context); - Future.delayed(Duration(milliseconds: 500), () { - // api call to submits - Utils.hideLoading(context); - Navigator.pop(context); - // api call to get fresh data - }); - }, - ).expanded, - ], - ), - ], + ], + ), ), ), ); } - - void _launchWhatsapp(String number) async { - var whatsappUrl = "https://wa.me/$number/?text=${Uri.parse("Hi, I need some help")}"; - try { - if (await canLaunchUrlString(whatsappUrl)) { - await launchUrlString(whatsappUrl); - } else { - throw 'Could not launch $whatsappUrl'; - } - } catch (e) { - print('Error launching WhatsApp: $e'); - } - } - - Widget contactItem(BuildContext context, bool isDark, String iconName, String title, String subtitle) { - return Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - SvgPicture.asset( - "assets/images/$iconName.svg", - width: 32.toScreenWidth, - color: isDark ? AppColor.primary40 : AppColor.primary70, - ), - 30.height, - Text( - title, - style: AppTextStyles.heading6.copyWith(color: isDark ? AppColor.neutral30 : AppColor.neutral50), - ), - Text( - subtitle, - style: AppTextStyles.bodyText.copyWith(color: isDark ? AppColor.neutral10 : AppColor.neutral20), - ), - ], - ).toShadowContainer(context); - } } diff --git a/lib/modules/demo_module/demo_request_item_view.dart b/lib/modules/demo_module/demo_request_item_view.dart new file mode 100644 index 00000000..afb6b9e4 --- /dev/null +++ b/lib/modules/demo_module/demo_request_item_view.dart @@ -0,0 +1,91 @@ +import 'package:flutter/material.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/models/all_requests_and_count_model.dart'; +import 'package:test_sa/models/new_models/dashboard_detail.dart'; +import 'package:test_sa/modules/asset_delivery_module/pages/asset_delivery_page.dart'; +import 'package:test_sa/modules/asset_inventory_module/pages/asset_inventory_page.dart'; +import 'package:test_sa/modules/demo_module/demo_detail_view_page.dart'; +import 'package:test_sa/new_views/app_style/app_color.dart'; +import 'package:test_sa/views/widgets/requests/request_status.dart'; + +class DemoRequestItemView extends StatelessWidget { + final Data? requestData; + final RequestsDetails? requestDetails; + final bool showShadow; + + const DemoRequestItemView({Key? key, this.requestData, this.requestDetails, this.showShadow = true}) : super(key: key); + + @override + Widget build(BuildContext context) { + if (requestData != null) { + 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), + // infoWidget(label: 'No of Sites'.addTranslation, value: requestData?.numberOfSites != null ? requestData?.numberOfSites.toString() : '-', context: context), + 8.height, + Row( + mainAxisSize: MainAxisSize.min, + children: [ + Text( + context.translation.viewDetails, + style: AppTextStyles.bodyText.copyWith(color: AppColor.blueStatus(context)), + ), + 4.width, + Icon(Icons.arrow_forward, color: AppColor.blueStatus(context), size: 14) + ], + ), + ], + ).toShadowContainer(context, withShadow: showShadow).onPress(() async { + Navigator.of(context).push(MaterialPageRoute( + builder: (_) => DemoDetailViewPage( + demoId: requestData!.id!, + ))); + }); + } + 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( + mainAxisSize: MainAxisSize.min, + children: [ + Text( + context.translation.viewDetails, + style: AppTextStyles.bodyText.copyWith(color: AppColor.blueStatus(context)), + ), + 4.width, + Icon(Icons.arrow_forward, color: AppColor.blueStatus(context), size: 14) + ], + ), + ], + ).toShadowContainer(context, withShadow: showShadow).onPress(() async { + Navigator.of(context).push(MaterialPageRoute( + builder: (_) => DemoDetailViewPage( + demoId: requestDetails!.id!, + ))); + }); + } + + Widget infoWidget({required String label, String? value, required BuildContext context}) { + if (value != null && value.isNotEmpty) { + return '$label: $value'.bodyText(context); + } + return const SizedBox(); + } +} diff --git a/lib/modules/demo_module/models/demo_attachment_model.dart b/lib/modules/demo_module/models/demo_attachment_model.dart new file mode 100644 index 00000000..069209a5 --- /dev/null +++ b/lib/modules/demo_module/models/demo_attachment_model.dart @@ -0,0 +1,27 @@ +class DemoAttachments { + int? id; + num? demoRequestId; + num? attachmentTypeId; + String? attachmentName; + String? originalName; + + DemoAttachments({this.id, this.attachmentTypeId, this.attachmentName, this.demoRequestId, this.originalName}); + + DemoAttachments.fromJson(dynamic json) { + id = json['id']; + attachmentTypeId = json['attachmentTypeId']; + demoRequestId = json['demoRequestId']; + attachmentName = json['attachmentName']; + originalName = json['originalName']; + } + + Map toJson() { + final map = {}; + map['id'] = id; + map['attachmentTypeId'] = attachmentTypeId; + map['attachmentName'] = attachmentName; + map['demoRequestId'] = demoRequestId; + map['originalName'] = originalName; + return map; + } +} \ No newline at end of file diff --git a/lib/modules/demo_module/models/demo_form_model.dart b/lib/modules/demo_module/models/demo_form_model.dart index af27e5ab..73911bc2 100644 --- a/lib/modules/demo_module/models/demo_form_model.dart +++ b/lib/modules/demo_module/models/demo_form_model.dart @@ -1,157 +1,81 @@ import 'package:test_sa/models/lookup.dart'; -import 'package:test_sa/models/new_models/building.dart'; -import 'package:test_sa/models/new_models/department.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/demo_module/models/demo_attachment_model.dart'; import 'package:test_sa/modules/loan_module/models/medical_department_model.dart'; class DemoFormModel { String? docName; + int? id; String? docNumber; String? docEmail; String? itemDescription; String? requestDescription; String? model; + String? assetName; String? manufacturer; - Lookup? loanProvided; - String? vendorName; + Lookup? demoPeriod; String? vendorRepresentativeName; String? vendorNumber; String? vendorEmail; Site? site; + SuppEngineerWorkOrders? supEngineer; + SupplierDetails? vendor; MedicalDepartmentModel? department; List? demoAttachment; DemoFormModel({ + this.id, this.docName, this.docNumber, this.docEmail, this.itemDescription, this.requestDescription, this.model, + this.assetName, this.manufacturer, - this.loanProvided, - this.vendorName, + this.demoPeriod, this.vendorRepresentativeName, this.vendorNumber, this.vendorEmail, this.demoAttachment, this.site, + this.vendor, + this.supEngineer, this.department, }); - //{ - // "id": 0, - // "employeeId": "fa29a9de-1337-4729-b823-68c6ecffdd33", - // "requestorUserID": "fa29a9de-1337-4729-b823-68c6ecffdd33", - // "employeeName": "engineer-dev", - // "employeeEmail": "Engineer_Dev@yahoo.com", - // "positionName": "High", - // "requesterExtensionNumber": "7726", - // "requesterContactNumber": "72132197", - // "siteId": 1, - // "departmentId": 5, - // "loanTypeId": 6448, - // "doctorName": "Doctor A", - // "doctorContact": "0561432451", - // "doctorEmail": "doctor@test.com", - // "itemDescription": "Test item", - // "requestDescription": "Test request", - // "loanPeriodId": 6453, - // "assetId": null, - // "assetNumber": "", - // "assetName": "", - // "assetSerialNumber": "", - // "model": "Model A", - // "manufacturer": "Siemens", - // "vendorName": "Vendor A", - // "vendorRepName": "Vendor Rep A", - // "vendorContact": "0561432455", - // "vendorEmail": "vendor@test.com", - // "loanStatusId": 1, - // "loanAttachments": [], - // "submittedAt": "2025-11-13T12:11:12.673Z", - // "updatedAt": null, - // "cMWOItemId": null - // } - Map toJson() { - var abc = { - "id": 0, - "siteId": 0, - "buildingId": 0, - "floorId": 0, - "departmentId": 0, - "assetName": "string", - "model": "string", - "manufacturer": "string", - "doctorName": "string", - "doctorContactNumber": "string", - "doctorContactEmail": "string", - "itemDescription": "string", - "requestDescription": "string", - "demoPeriodId": 0, - "supplierId": 0, - "suppPersonId": 0, - "isSubmit": true, - "demoAttachments": [ - { - "id": 0, - "attachmentName": "string", - "originalName": "string", - "demoRequestId": 0, - "attachmentTypeId": 0 - } - ] - }; - - return { + "id": 0, + 'siteId': site?.id, + 'departmentId': department?.id, + "buildingId": 0, + "floorId": 0, + "assetName": assetName, + "isSubmit": true, "doctorName": docName, - "doctorContact": docNumber, - "doctorEmail": docEmail, + "doctorContactNumber": docNumber, + "doctorContactEmail": docEmail, "itemDescription": itemDescription, "requestDescription": requestDescription, "model": model, "manufacturer": manufacturer, - "demoPeriodId": loanProvided?.id, - "vendorName": vendorName, - "vendorRepresentativeName": vendorRepresentativeName, - "vendorRepName": vendorRepresentativeName, - "vendorNumber": vendorNumber, - "vendorContact": vendorNumber, - "vendorEmail": vendorEmail, - 'siteId': site?.id, - 'departmentId': department?.id, + "demoPeriodId": demoPeriod?.id, + "supplierId": vendor?.id, + "suppPersonId": supEngineer?.id, + // "vendorEmail": vendorEmail, "demoAttachments": demoAttachment != null ? demoAttachment!.map((v) => v.toJson()).toList() : [], }; } -} - -class DemoAttachments { - num? id; - num? demoRequestId; - num? attachmentTypeId; - String? attachmentName; - String? originalName; - - DemoAttachments({this.id, this.attachmentTypeId, this.attachmentName, this.demoRequestId, this.originalName}); - - DemoAttachments.fromJson(dynamic json) { - id = json['id']; - attachmentTypeId = json['attachmentTypeId']; - demoRequestId = json['demoRequestId']; - attachmentName = json['attachmentName']; - originalName = json['originalName']; - } - Map toJson() { - final map = {}; - map['id'] = id; - map['attachmentTypeId'] = attachmentTypeId; - map['attachmentName'] = attachmentName; - map['demoRequestId'] = demoRequestId; - map['originalName'] = originalName; - return map; + Map toUpdateJson() { + return { + "id": id, + "supplierId": vendor?.id, + "suppPersonId": supEngineer?.id, + "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 new file mode 100644 index 00000000..8f871f80 --- /dev/null +++ b/lib/modules/demo_module/models/demo_request_model.dart @@ -0,0 +1,127 @@ +import 'package:test_sa/models/device/asset_by_id_model.dart'; +import 'package:test_sa/models/lookup.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/demo_module/models/demo_attachment_model.dart'; +import 'package:test_sa/modules/loan_module/models/medical_department_model.dart'; + +class DemoRequestModel { + int? id; + RequesterUserModel? requesterUser; + Site? site; + Lookup? building; + Lookup? floor; + MedicalDepartmentModel? department; + String? assetName; + String? model; + String? manufacturer; + String? doctorName; + String? doctorContactNumber; + String? doctorContactEmail; + String? itemDescription; + String? requestDescription; + Lookup? demoPeriod; + SupplierDetails? supplier; + SuppEngineerWorkOrders? suppPerson; + Lookup? status; + List? demoAttachments; + dynamic demoAsset; + dynamic demoInstallationTaskJob; + dynamic demoPullOutTaskJob; + bool? isDemoPeriodExpired; + + DemoRequestModel({ + this.id, + this.requesterUser, + this.site, + this.building, + this.floor, + this.department, + this.assetName, + this.model, + this.manufacturer, + this.doctorName, + this.doctorContactNumber, + this.doctorContactEmail, + this.itemDescription, + this.requestDescription, + this.demoPeriod, + this.supplier, + this.suppPerson, + this.status, + this.demoAttachments, + this.demoAsset, + this.demoInstallationTaskJob, + this.demoPullOutTaskJob, + this.isDemoPeriodExpired, + }); + + DemoRequestModel.fromJson(Map json) { + id = json['id']; + requesterUser = json['requesterUser'] != null ? (RequesterUserModel()..fromJson(json['requesterUser'])) : null; + site = json['site'] != null ? (Site.fromJson(json['site'])) : null; + building = json['building'] != null ? (Lookup.fromJson(json['building'])) : null; + floor = json['floor'] != null ? (Lookup.fromJson(json['floor'])) : null; + department = json['department'] != null ? (MedicalDepartmentModel.fromJson(json['department'])) : null; + assetName = json['assetName']; + model = json['model']; + manufacturer = json['manufacturer']; + doctorName = json['doctorName']; + doctorContactNumber = json['doctorContactNumber']; + doctorContactEmail = json['doctorContactEmail']; + itemDescription = json['itemDescription']; + requestDescription = json['requestDescription']; + 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; + status = json['status'] != null ? (Lookup.fromJson(json['status'])) : null; + demoAttachments = json['demoAttachments'] != null ? (json['demoAttachments'] as List).map((e) => DemoAttachments.fromJson(e)).toList() : null; + demoAsset = json['demoAsset']; + demoInstallationTaskJob = json['demoInstallationTaskJob']; + demoPullOutTaskJob = json['demoPullOutTaskJob']; + isDemoPeriodExpired = json['isDemoPeriodExpired']; + } + + Map toJson() { + return { + "id": 0, + 'siteId': site?.id, + 'departmentId': department?.id, + "buildingId": 0, + "floorId": 0, + "assetName": assetName, + "isSubmit": true, + "itemDescription": itemDescription, + "requestDescription": requestDescription, + "model": model, + "manufacturer": manufacturer, + "demoPeriodId": demoPeriod?.id, + "supplierId": supplier?.id, + "suppPersonId": suppPerson?.id, + "demoAttachments": demoAttachments != null ? demoAttachments!.map((v) => v.toJson()).toList() : [], + }; + } +} + +class RequesterUserModel { + String? requesterUserId; + String? requesterName; + String? requesterEmail; + String? requesterMobile; + + RequesterUserModel(); + + void fromJson(Map json) { + requesterUserId = json['requesterUserId']; + requesterName = json['requesterName']; + requesterEmail = json['requesterEmail']; + requesterMobile = json['requesterMobile']; + } + + Map toJson() => { + 'requesterUserId': requesterUserId, + 'requesterName': requesterName, + 'requesterEmail': requesterEmail, + 'requesterMobile': requesterMobile, + }; +} diff --git a/lib/modules/demo_module/demo_period_lookup_provider.dart b/lib/modules/demo_module/provider/demo_period_lookup_provider.dart similarity index 85% rename from lib/modules/demo_module/demo_period_lookup_provider.dart rename to lib/modules/demo_module/provider/demo_period_lookup_provider.dart index 35f0e027..fca27947 100644 --- a/lib/modules/demo_module/demo_period_lookup_provider.dart +++ b/lib/modules/demo_module/provider/demo_period_lookup_provider.dart @@ -3,9 +3,9 @@ import 'dart:convert'; import 'package:http/http.dart'; import 'package:test_sa/providers/loading_list_notifier.dart'; -import '../../controllers/api_routes/api_manager.dart'; -import '../../controllers/api_routes/urls.dart'; -import '../../models/lookup.dart'; +import '../../../controllers/api_routes/api_manager.dart'; +import '../../../controllers/api_routes/urls.dart'; +import '../../../models/lookup.dart'; class DemoPeriodLookupProvider extends LoadingListNotifier { @override diff --git a/lib/modules/demo_module/provider/demo_provider.dart b/lib/modules/demo_module/provider/demo_provider.dart index 18e64600..6703b1be 100644 --- a/lib/modules/demo_module/provider/demo_provider.dart +++ b/lib/modules/demo_module/provider/demo_provider.dart @@ -3,13 +3,14 @@ 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/modules/demo_module/models/demo_request_model.dart'; import 'package:test_sa/modules/loan_module/models/loan_request_model.dart'; import 'dart:convert'; class DemoProvider extends ChangeNotifier { - Future addLoanRequest(Map body) async { + Future addDemoRequest(Map body) async { try { - Response response = await ApiManager.instance.post(URLs.addLoan, body: body, showToast: false); + 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"] ?? ""); Fluttertoast.showToast(msg: message ?? "", toastLength: Toast.LENGTH_LONG); @@ -23,16 +24,66 @@ class DemoProvider extends ChangeNotifier { bool isLoading = false; - Future getLoanById(int id) async { - LoanRequestModel? loanData; + Future getDemoById(int id) async { + DemoRequestModel? demoRequestModel; try { - Response response = await ApiManager.instance.get(URLs.getLoanById + "?loanId=$id"); + Response response = await ApiManager.instance.get(URLs.getDemoRequestById + "/$id"); if (response.statusCode >= 200 && response.statusCode < 300) { - loanData = LoanRequestModel.fromJson(json.decode(response.body)["data"]); + demoRequestModel = DemoRequestModel.fromJson(json.decode(response.body)["data"]); } } catch (error) { print(error); } - return loanData; + return demoRequestModel; + } + + Future acceptRejectRequest({required int requestId, required bool status}) async { + + try { + 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"] ?? ""); + Fluttertoast.showToast(msg: message ?? "", toastLength: Toast.LENGTH_LONG); + return true; + } + return false; + } catch (error) { + return false; + } + } + Future updateDemoRequest(Map body) async { + try { + Response response = await ApiManager.instance.post(URLs.updateDemoRequest, body: body, showToast: false); + if (response.statusCode >= 200 && response.statusCode < 300) { + String message = (jsonDecode(response.body)["data"] ?? "") + " " + (jsonDecode(response.body)["message"] ?? ""); + Fluttertoast.showToast(msg: message ?? "", toastLength: Toast.LENGTH_LONG); + return true; + } + return false; + } catch (error) { + return false; + } + } + Future updateDemoPeriod({required int demoPeriodId, required int requestId,required bool isUpdateRequired}) async { + try { + 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"] ?? ""); + Fluttertoast.showToast(msg: message ?? "", toastLength: Toast.LENGTH_LONG); + return true; + } + return false; + } catch (error) { + return false; + } } } diff --git a/lib/modules/demo_module/update_request_detail_view.dart b/lib/modules/demo_module/update_request_detail_view.dart new file mode 100644 index 00000000..50cd4e0a --- /dev/null +++ b/lib/modules/demo_module/update_request_detail_view.dart @@ -0,0 +1,257 @@ +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.vendorNumber = 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.vendorNumber = 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 8f2ab1c6..5732ba51 100644 --- a/lib/new_views/app_style/app_color.dart +++ b/lib/new_views/app_style/app_color.dart @@ -259,6 +259,20 @@ class AppColor { return blueStatus(context); } } + static Color demoRequestStatus(BuildContext context, int id) { + switch (id) { + case 1: + return blueStatus(context); + case 2: + return yellowStatus(context); + case 3: + return greenStatus(context); + case 4: + return yellowStatus(context); + default: + return blueStatus(context); + } + } static Color getRequestStatusTextColor(BuildContext context, int id) { switch (id) { @@ -272,6 +286,18 @@ class AppColor { return Colors.white; } } + static Color demoRequestStatusTextColor(BuildContext context, int id) { + switch (id) { + case 2: + return orange60; + case 4: + return Colors.white; + case 9: + return orange60; + default: + return Colors.white; + } + } static Color getPriorityStatusTextColor(BuildContext context, int id) { switch (id) { 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 f4d83656..89e1bdd3 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 @@ -2,6 +2,7 @@ import 'package:flutter/material.dart'; import 'package:test_sa/extensions/int_extensions.dart'; import 'package:test_sa/models/new_models/dashboard_detail.dart'; import 'package:test_sa/modules/asset_delivery_module/pages/asset_delivery_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/internal_audit_module/pages/system_internal_audit/system_internal_audit_item_view.dart'; import 'package:test_sa/modules/asset_inventory_module/pages/inventory_session_item_view.dart'; @@ -77,10 +78,13 @@ class RequestPaginatedListview extends StatelessWidget { return SystemInternalAuditItemView(requestData: request); case 12: return LoanEquipmentItemView(requestData: request); - case 13: + case 13: return AssetDeliveryItemView(requestData: request); - case 14: + case 14: return MedicalGasInspectionItemView(requestData: request); + //TODO need to change number + case 15: + return DemoRequestItemView(requestData: request); default: return Container( height: 100, 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 10339da7..d6d89811 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 @@ -7,6 +7,7 @@ import 'package:test_sa/extensions/int_extensions.dart'; import 'package:test_sa/extensions/widget_extensions.dart'; import 'package:test_sa/models/all_requests_and_count_model.dart'; import 'package:test_sa/modules/asset_delivery_module/pages/asset_delivery_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/internal_audit_module/pages/system_internal_audit/system_internal_audit_item_view.dart'; import 'package:test_sa/modules/asset_inventory_module/pages/inventory_session_item_view.dart'; @@ -71,6 +72,9 @@ 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: @@ -78,6 +82,7 @@ class RequestItemViewList extends StatelessWidget { case 14: return MedicalGasInspectionItemView(requestDetails: list[index]); + default: Container( height: 100,