import 'dart:io'; import 'package:dropdown_button2/dropdown_button2.dart'; import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; import 'package:flutter_svg/flutter_svg.dart'; import 'package:generp/Utils/dropdownTheme.dart'; import 'package:provider/provider.dart'; import '../../Models/crmModels/crmLeadDetailsGenerateQuotationViewResponse.dart'; import '../../Notifiers/crmProvider/crmGenerateQuotationProvider.dart'; import '../../Utils/app_colors.dart'; import '../../Utils/commonWidgets.dart'; class Generatequotationscreen extends StatefulWidget { final leadId; const Generatequotationscreen({super.key, required this.leadId}); @override State createState() => _GeneratequotationscreenState(); } class _GeneratequotationscreenState extends State { Dropdowntheme ddtheme = Dropdowntheme(); @override void initState() { super.initState(); WidgetsBinding.instance.addPostFrameCallback((_) async { final provider = Provider.of( context, listen: false, ); await provider.crmLeadDetailsGenerateQuoteViewAPIFunction( context, widget.leadId, ); // Initialize controllers and dropdowns after API call provider.initializeForm(context); }); } @override Widget build(BuildContext context) { return Consumer( builder: (context, provider, child) { return WillPopScope( onWillPop: () async { // provider.resetForm(); return true; }, child: SafeArea( top: false, bottom: Platform.isIOS?false:true, child: Scaffold( resizeToAvoidBottomInset: true, backgroundColor: AppColors.scaffold_bg_color, appBar: appbar2( context, "Generate Quotation", provider.resetForm, const SizedBox(width: 0), ), body: Container( decoration: BoxDecoration(color: AppColors.white), padding: const EdgeInsets.symmetric(horizontal: 10), child: SingleChildScrollView( child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ textControllerWidget( context, provider.mailIdController, "Email Id", "Enter Email Id", provider.onChangemailId, TextInputType.emailAddress, false, null, ), errorWidget(context, provider.mailIdError), textControllerWidget( context, provider.mobileController, "Mobile Number", "Enter Mobile Number", provider.onChangemobile, TextInputType.phone, false, FilteringTextInputFormatter.digitsOnly, ), errorWidget(context, provider.mobileError), textControllerWidget( context, provider.subjectsController, "Subject", "Enter Subject", provider.onChangesubjects, TextInputType.text, false, null, ), errorWidget(context, provider.subjectsError), InkResponse( onTap: () { provider.editAddNewRow(); }, child: Container( margin: const EdgeInsets.symmetric(vertical: 10), height: 45, width: MediaQuery.of(context).size.width, decoration: BoxDecoration( color: const Color(0xFFE6F6FF), borderRadius: BorderRadius.circular(12), border: Border.all( color: AppColors.app_blue, width: 0.5, ), ), child: Center( child: Text( "+ Add Product", style: TextStyle( fontFamily: "JakartaMedium", color: AppColors.app_blue, ), ), ), ), ), if (provider.leadProductsList.isNotEmpty || provider.editProductPriceControllers.isNotEmpty) ...[ ListView.builder( itemCount: provider.editProductPriceControllers.length, physics: const NeverScrollableScrollPhysics(), shrinkWrap: true, itemBuilder: (context, j) { return Container( padding: const EdgeInsets.symmetric( horizontal: 10, vertical: 10, ), margin: const EdgeInsets.symmetric(vertical: 10), decoration: BoxDecoration( color: Colors.white, borderRadius: BorderRadius.circular(20), ), child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ TextWidget(context, "Product"), DropdownButtonHideUnderline( child: Row( children: [ Expanded( child: DropdownButton2( isExpanded: true, hint: const Text( 'Select Product', style: TextStyle(fontSize: 14), overflow: TextOverflow.ellipsis, ), items: provider.leadProductsList .map( (ord) => DropdownMenuItem< LeadProducts >( value: ord, child: Text( "(Product Name: ${ord.productName})", style: const TextStyle( fontSize: 14, ), overflow: TextOverflow .ellipsis, ), ), ) .toList(), value: provider.selectedProductIds[j] != null ? provider.leadProductsList .firstWhere( (ord) => ord.id == provider .selectedProductIds[j], orElse: () => provider .leadProductsList[0], ) : null, onChanged: (LeadProducts? value) { if (value != null) { provider.updateSelectedProductIds( j, value, ); provider.selectedProductIds[j] = value.id?.toString() ?? ''; provider.updateTotalAmount(j); } }, buttonStyleData: ddtheme.buttonStyleData, iconStyleData: ddtheme.iconStyleData, menuItemStyleData: ddtheme.menuItemStyleData, dropdownStyleData: ddtheme.dropdownStyleData, ), ), ], ), ), const SizedBox(height: 10), Row( children: [ Expanded( flex: 2, child: textControllerWidget( context, provider.editProductPriceControllers[j], "Product Price", "Enter Product Price", (value) => provider.updateTotalAmount(j), TextInputType.number, false, FilteringTextInputFormatter.digitsOnly, ), ), ], ), const SizedBox(height: 10), Row( children: [ Expanded( flex: 2, child: textControllerWidget( context, provider.editQuantityControllers[j], "Quantity", "Enter Quantity", (value) => provider.updateTotalAmount(j), TextInputType.number, false, FilteringTextInputFormatter.digitsOnly, ), ), ], ), const SizedBox(height: 10), Row( children: [ Expanded( flex: 2, child: textControllerWidget( context, provider.editTotalAmountControllers[j], "Amount", "Total Amount", (_) {}, TextInputType.number, true, FilteringTextInputFormatter.digitsOnly, ), ), ], ), // IconButton( // icon: const Icon(Icons.delete), // onPressed: provider.editProductPriceControllers.length > 1 // ? () => provider.editRemoveRow(j) // : null, // ), ], ), ); }, ), ], textControllerWidget( context, provider.taxesController, "Taxes", "Enter Taxes", provider.onChangetaxes, TextInputType.text, false, null, ), errorWidget(context, provider.taxesError), textControllerWidget( context, provider.SpecialNoteController, "Special Note", "Enter Special Note", provider.onChangeSpecialNote, TextInputType.text, false, null, ), errorWidget(context, provider.SpecialNoteError), textControllerWidget( context, provider.forController, "FOR", "Enter FOR", provider.onChangefor, TextInputType.text, false, null, ), errorWidget(context, provider.forError), textControllerWidget( context, provider.paymentTermsController, "Payment Terms", "Enter Payment Terms", provider.onChangepaymentTerms, TextInputType.text, false, null, ), errorWidget(context, provider.paymentTermsError), ], ), ), ), floatingActionButtonLocation: FloatingActionButtonLocation.centerFloat, bottomNavigationBar: Material( elevation: 10, shadowColor: Colors.black54, child: Container( decoration: BoxDecoration( color: Colors.white, boxShadow: [ BoxShadow( color: Colors.black26, blurRadius: 10, offset: Offset(0, -2), ), ], ), child: Row( mainAxisAlignment: MainAxisAlignment.center, children: [ Expanded( child: InkResponse( onTap: provider.submitLoading ? null : () { //genquotedown final insertedData = provider.getFormData(); provider .crmLeadDetailsGenerateQuoteSubmitAPIFunction( context, widget.leadId, insertedData, "genquotedown", ); }, child: Container( height: 45, alignment: Alignment.center, margin: const EdgeInsets.symmetric( horizontal: 10, vertical: 15, ), padding: const EdgeInsets.symmetric( horizontal: 10, vertical: 5, ), decoration: BoxDecoration( // color: AppColors.app_blue, borderRadius: BorderRadius.circular(10), ), child: provider.submitLoading ? CircularProgressIndicator.adaptive( valueColor: AlwaysStoppedAnimation( AppColors.app_blue, ), ) : SvgPicture.asset("assets/svg/download_quote.svg"), ), ), ), SizedBox(width: 10), Expanded( child: InkResponse( onTap: provider.submitLoading ? null : () { //genquotemail, final insertedData = provider.getFormData(); provider .crmLeadDetailsGenerateQuoteSubmitAPIFunction( context, widget.leadId, insertedData, "genquotemail", ); }, child: Container( height: 45, alignment: Alignment.center, margin: const EdgeInsets.symmetric( horizontal: 10, vertical: 15, ), padding: const EdgeInsets.symmetric( horizontal: 10, vertical: 5, ), decoration: BoxDecoration( // color: AppColors.app_blue, borderRadius: BorderRadius.circular(10), ), child: provider.submitLoading ? CircularProgressIndicator.adaptive( valueColor: AlwaysStoppedAnimation( AppColors.app_blue, ), ) : SvgPicture.asset("assets/svg/mail_quote.svg") ), ), ), SizedBox(width: 10), Expanded( child: InkResponse( onTap: provider.submitLoading ? null : () { //genquotewhatsapp, final insertedData = provider.getFormData(); provider .crmLeadDetailsGenerateQuoteSubmitAPIFunction( context, widget.leadId, insertedData, "genquotewhatsapp", ); }, child: Container( height: 45, alignment: Alignment.center, margin: const EdgeInsets.symmetric( horizontal: 10, vertical: 15, ), padding: const EdgeInsets.symmetric( horizontal: 10, vertical: 5, ), decoration: BoxDecoration( // color: AppColors.app_blue, borderRadius: BorderRadius.circular(10), ), child: provider.submitLoading ? CircularProgressIndicator.adaptive( valueColor: AlwaysStoppedAnimation( AppColors.app_blue, ), ) : SvgPicture.asset("assets/svg/whatsapp_quote.svg") ), ), ), SizedBox(width: 10), Expanded( child: InkResponse( onTap: provider.submitLoading ? null : () { //genquotewhatsappbymynum, final insertedData = provider.getFormData(); provider .crmLeadDetailsGenerateQuoteSubmitAPIFunction( context, widget.leadId, insertedData, "genquotewhatsappbymynum", ); }, child: Container( height: 45, alignment: Alignment.center, margin: const EdgeInsets.symmetric( horizontal: 10, vertical: 15, ), padding: const EdgeInsets.symmetric( horizontal: 10, vertical: 5, ), decoration: BoxDecoration( // color: AppColors.app_blue, borderRadius: BorderRadius.circular(10), ), child: provider.submitLoading ? CircularProgressIndicator.adaptive( valueColor: AlwaysStoppedAnimation( AppColors.app_blue, ), ) :SvgPicture.asset("assets/svg/whatsapp_quote_self.svg") ), ), ), ], ), ), ), ), ), ); }, ); } }