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); } } } }