import 'dart:io'; import 'package:connectivity_plus/connectivity_plus.dart'; import 'package:dotted_line/dotted_line.dart'; import 'package:dropdown_button2/dropdown_button2.dart'; import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; import 'package:flutter_svg/svg.dart'; import 'package:generp/Notifiers/crmProvider/addNewLeadsandProspectsProvider.dart'; import 'package:generp/Utils/app_colors.dart'; import 'package:generp/Utils/commonServices.dart'; import 'package:generp/Utils/commonWidgets.dart'; import 'package:generp/Utils/dropdownTheme.dart'; import 'package:provider/provider.dart'; import '../../Models/crmModels/GetDistrictOnStateResponse.dart'; import '../../Models/crmModels/GetSegmentOnTeamResponse.dart'; import '../../Models/crmModels/GetSourceOnReferenceResponse.dart'; import '../../Models/crmModels/GetSubLocOnDistrictResponse.dart'; import '../../Models/crmModels/crmNewLeadsProspectsViewResponse.dart'; import 'addLeadProductScreen.dart'; class Addleadsprospectsscreen extends StatefulWidget { const Addleadsprospectsscreen({super.key}); @override State createState() => _AddleadsprospectsscreenState(); } class _AddleadsprospectsscreenState extends State { Dropdowntheme ddtheme = Dropdowntheme(); List focusNodes = List.generate(20, (index) => FocusNode()); int _currentStep = 0; final _formKey = GlobalKey(); Map _source = {ConnectivityResult.mobile: true}; final MyConnectivity _connectivity = MyConnectivity.instance; // Controllers to store form data final _nameController = TextEditingController(); final _emailController = TextEditingController(); final _addressController = TextEditingController(); @override void dispose() { _nameController.dispose(); _emailController.dispose(); _addressController.dispose(); focusNodes.map((e) => e.dispose(),); super.dispose(); } void _nextStep() { if (_formKey.currentState!.validate()) { if (_currentStep < 2) { setState(() { _currentStep += 1; }); } else { // Submit form data _submitForm(); } } } void _previousStep() { if (_currentStep > 0) { setState(() { _currentStep -= 1; }); } } void _submitForm() { // Simulate form submission (e.g., print data or send to server) print('Form Submitted:'); print('Name: ${_nameController.text}'); print('Email: ${_emailController.text}'); print('Address: ${_addressController.text}'); ScaffoldMessenger.of(context).showSnackBar( const SnackBar(content: Text('Form submitted successfully!')), ); } Future onBackPressed(BuildContext context) async { if (_currentStep > 0) { _previousStep(); return false; } else { return true; } } @override void initState() { super.initState(); _connectivity.initialise(); _connectivity.myStream.listen((source) { setState(() => _source = source); }); WidgetsBinding.instance.addPostFrameCallback((_) async { final provider = Provider.of( context, listen: false, ); provider.resetForm(); provider.crmAddLeadsView(context); }); } @override Widget build(BuildContext context) { switch (_source.keys.toList()[0]) { case ConnectivityResult.mobile: connection = 'Online'; break; case ConnectivityResult.wifi: connection = 'Online'; break; case ConnectivityResult.none: default: connection = 'Offline'; } return (connection == "Online") ? Platform.isAndroid ? WillPopScope( onWillPop: () => onBackPressed(context), child: SafeArea( top: false, bottom: true, child: _scaffold(context), ), ) : _scaffold(context) : NoNetwork(context); } Widget _scaffold(BuildContext context) { return Consumer( builder: (context, provider, child) { return SafeArea( top: false, bottom: Platform.isIOS ? false : true, child: Scaffold( resizeToAvoidBottomInset: true, backgroundColor: AppColors.scaffold_bg_color, appBar: appbar2New( context, "Add Leads and Prospect", provider.resetForm, const SizedBox(width: 0), 0xFFFFFFFF, ), // body: Form( key: _formKey, child: Stepper( margin: EdgeInsets.symmetric(horizontal: 0, vertical: 0), type: StepperType.horizontal, currentStep: _currentStep, onStepContinue: _nextStep, onStepCancel: _previousStep, onStepTapped: (value) { print(value); // setState(() { // // if(value==0){ // _currentStep = value; // } // if(_currentStep==1 && value==0){ // _currentStep = value; // } // if(_currentStep==2 && value == 1){ // _currentStep = value; // } // if (value == 1) { // if(provider.validateStep1()){ // _currentStep = value; // } // // } else if (value == 2) { // if(provider.validateStep2()){ // _currentStep = value; // } // // } // else { // _currentStep = value; // } // }); setState(() { if (value == 1 && !provider.validateStep1()) { return; } if (value == 2 && !provider.validateStep2()) { return; } if (value < _currentStep) { _currentStep = value; } else if (value > _currentStep) { _currentStep = value; } }); }, connectorColor: WidgetStatePropertyAll(AppColors.app_blue), stepIconBuilder: (stepIndex, stepState) { return CircleAvatar( radius: 12, backgroundColor: stepIndex <= _currentStep ? AppColors.app_blue : Colors.grey[300], ); }, steps: [ Step( label: Text("Step 1", style: TextStyle(fontSize: 12)), title: const Text(''), isActive: _currentStep >= 0, content: Container( padding: EdgeInsets.symmetric( horizontal: 10, vertical: 10, ), decoration: BoxDecoration( color: Colors.white, borderRadius: BorderRadius.circular(16), ), child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ TextWidget(context, "Salutation"), DropdownButtonHideUnderline( child: Row( children: [ Expanded( child: DropdownButton2( isExpanded: true, hint: const Row( children: [ Expanded( child: Text( 'Select Salutation', style: TextStyle(fontSize: 14), overflow: TextOverflow.ellipsis, ), ), ], ), items: provider.salutationList .map( (slist) => DropdownMenuItem( value: slist, child: Text( slist ?? '', style: const TextStyle( fontSize: 14, ), overflow: TextOverflow .ellipsis, ), ), ) .toList(), value: provider.selectedSalutation, onChanged: (value) { if (value != null) { provider.selectedSalutation = value; provider.salutationError = null; } }, buttonStyleData: ddtheme.buttonStyleData, iconStyleData: ddtheme.iconStyleData, menuItemStyleData: ddtheme.menuItemStyleData, dropdownStyleData: ddtheme.dropdownStyleData, ), ), ], ), ), errorWidget(context, provider.salutationError), textControllerWidget( context, provider.companyNameController, "Company Name", "Enter Company Name", provider.onChangeCompanyName, TextInputType.name, false, null, focusNodes[0], focusNodes[1], TextInputAction.next ), errorWidget(context, provider.companynameError), textControllerWidget( context, provider.contactPersonNameController, "Contact Person Name", "Enter Name", provider.onChangeContactPersonName, TextInputType.name, false, null, focusNodes[1], focusNodes[2], TextInputAction.next ), errorWidget(context, provider.nameError), textControllerWidget( context, provider.mobileController, "Mobile Number", "Enter Mobile Number", provider.onChangemobile, TextInputType.phone, false, FilteringTextInputFormatter.digitsOnly, focusNodes[2], focusNodes[3], TextInputAction.done, 10, ), errorWidget(context, provider.mobileError), textControllerWidget( context, provider.customerMailIdController, "Customer Email Id", "Enter Email Id", provider.onChangemailId, TextInputType.emailAddress, false, null,focusNodes[3], focusNodes[4], TextInputAction.next, ), errorWidget(context, provider.mailIdError), textControllerWidget( context, provider.designationController, "Customer Designation", "Enter Designation", provider.onChangedesignation, TextInputType.text, false, null, focusNodes[4], null, TextInputAction.done, ), errorWidget(context, provider.designationError), ], ), ), ), Step( label: Text("Step 2", style: TextStyle(fontSize: 12)), title: const Text(''), isActive: _currentStep >= 1, content: Container( padding: EdgeInsets.symmetric( horizontal: 10, vertical: 10, ), decoration: BoxDecoration( color: Colors.white, borderRadius: BorderRadius.circular(16), ), child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ textControllerWidget( context, provider.alternateMobileController, "Alternate Mobile Number", "Enter Alternate Mobile Number", provider.onChangeAlternatemobile, TextInputType.phone, false, FilteringTextInputFormatter.digitsOnly, focusNodes[5], focusNodes[6], TextInputAction.next, 10, ), errorWidget(context, provider.AlternatemobileError), textControllerWidget( context, provider.telephoneController, "Telephone Number", "Enter Telephone Number", provider.onChangeTelephone, TextInputType.phone, false, FilteringTextInputFormatter.digitsOnly, focusNodes[6], null, TextInputAction.done, ), errorWidget(context, provider.TelephoneError), TextWidget(context, "Source"), DropdownButtonHideUnderline( child: Row( children: [ Expanded( child: DropdownButton2( hint: Text( "Select Source", style: TextStyle(fontSize: 14), ), items: provider.sourcesList .map( (slist) => DropdownMenuItem( value: slist, child: Text( slist.name!, style: TextStyle( fontSize: 14, ), ), ), ) .toList(), // value: provider.selectedSources, value: provider.sourcesList.isNotEmpty?provider.selectedSources!=null? provider.sourcesList.firstWhere((element) => element.id==provider.selectedSourcesId, orElse: () => provider.sourcesList[0], ):null:null, onChanged: (Sources? value) { if (value != null) { if (provider.sourcesList.isNotEmpty) { provider.selectedSources = value; provider.selectedSourcesId = value!.id!; provider.selectedSourcesValue = value!.name!; if(provider.referencesList.isNotEmpty){ provider.referencesList.clear(); provider.selectedReferenceId = null; provider.selectedReferenceValue = null; } provider .crmLeadListSourceOnReferenceAPIFunction( context, "", provider.selectedSourcesId, ); } } }, isExpanded: true, dropdownSearchData: DropdownSearchData( searchInnerWidgetHeight: 50, searchController: provider .sourceSearchController, searchInnerWidget: Padding( padding: const EdgeInsets.all( 8, ), child: TextFormField( controller: provider .sourceSearchController, decoration: InputDecoration( isDense: true, contentPadding: const EdgeInsets.symmetric( horizontal: 10, vertical: 8, ), hintText: 'Search Source...', border: OutlineInputBorder( borderRadius: BorderRadius.circular( 8, ), ), ), ), ), searchMatchFn: ( item, searchValue, ) { return item.value?.name ?.toLowerCase() .contains( searchValue .toLowerCase(), ) ?? false; }, ), onMenuStateChange: (isOpen) { if (!isOpen) { provider.sourceSearchController.clear(); } }, buttonStyleData: ddtheme.buttonStyleData, iconStyleData: ddtheme.iconStyleData, menuItemStyleData: ddtheme.menuItemStyleData, dropdownStyleData: ddtheme.dropdownStyleData, ), ), ], ), ), errorWidget(context, provider.sourceError), TextWidget(context, "Reference"), DropdownButtonHideUnderline( child: Row( children: [ Expanded( child: DropdownButton2( hint: Text( "Select Reference", style: TextStyle(fontSize: 14), ), items: provider.referencesList .map( (slist) => DropdownMenuItem< References >( value: slist, child: Text( slist.name!, style: TextStyle( fontSize: 14, ), ), ), ) .toList(), // value: provider.selectedReference, value: provider.referencesList.isNotEmpty?provider.selectedReference!=null? provider.referencesList.firstWhere((element) => element.id==provider.selectedReferenceId, orElse: () => provider.referencesList[0], ):null:null, onChanged: (References? value) { if (value != null) { if (provider .referencesList .isNotEmpty) { provider.selectedReference = value; provider.selectedReferenceId = value!.id!; provider.selectedReferenceValue = value!.name!; } } }, isExpanded: true, dropdownSearchData: DropdownSearchData( searchInnerWidgetHeight: 50, searchController: provider .referenceSearchController, searchInnerWidget: Padding( padding: const EdgeInsets.all( 8, ), child: TextFormField( controller: provider .referenceSearchController, decoration: InputDecoration( isDense: true, contentPadding: const EdgeInsets.symmetric( horizontal: 10, vertical: 8, ), hintText: 'Search Reference...', border: OutlineInputBorder( borderRadius: BorderRadius.circular( 8, ), ), ), ), ), searchMatchFn: ( item, searchValue, ) { return item.value?.name ?.toLowerCase() .contains( searchValue .toLowerCase(), ) ?? false; }, ), onMenuStateChange: (isOpen) { if (!isOpen) { provider.referenceSearchController.clear(); } }, buttonStyleData: ddtheme.buttonStyleData, iconStyleData: ddtheme.iconStyleData, menuItemStyleData: ddtheme.menuItemStyleData, dropdownStyleData: ddtheme.dropdownStyleData, ), ), ], ), ), errorWidget(context, provider.referenceError), TextWidget(context, "Team"), DropdownButtonHideUnderline( child: Row( children: [ Expanded( child: DropdownButton2( hint: Text( "Select Team", style: TextStyle(fontSize: 14), ), items: provider.teamsList .map( (slist) => DropdownMenuItem( value: slist, child: Text( slist.name!, style: TextStyle( fontSize: 14, ), ), ), ) .toList(), // value: provider.selectedTeams, value: provider.teamsList.isNotEmpty?provider.selectedTeams!=null? provider.teamsList.firstWhere((element) => element.id==provider.selectedTeamsId, orElse: () => provider.teamsList[0], ):null:null, onChanged: (Teams? value) { if (value != null) { if (provider.teamsList.isNotEmpty) { provider.selectedTeams = value; provider.selectedTeamsId = value!.id!; provider.selectedTeamsValue = value!.name!; if(provider.segmentsList.isNotEmpty){ provider.segmentsList.clear(); provider.selectedSegmentId = null; provider.selectedSegmentValue = null; } provider .crmLeadListSegmentOnTeamAPIFunction( context, "", provider.selectedTeamsId, ); } } }, isExpanded: true, dropdownSearchData: DropdownSearchData( searchInnerWidgetHeight: 50, searchController: provider .teamSearchController, searchInnerWidget: Padding( padding: const EdgeInsets.all( 8, ), child: TextFormField( controller: provider .teamSearchController, decoration: InputDecoration( isDense: true, contentPadding: const EdgeInsets.symmetric( horizontal: 10, vertical: 8, ), hintText: 'Search Team...', border: OutlineInputBorder( borderRadius: BorderRadius.circular( 8, ), ), ), ), ), searchMatchFn: ( item, searchValue, ) { return item.value?.name ?.toLowerCase() .contains( searchValue .toLowerCase(), ) ?? false; }, ), onMenuStateChange: (isOpen) { if (!isOpen) { provider.teamSearchController.clear(); } }, buttonStyleData: ddtheme.buttonStyleData, iconStyleData: ddtheme.iconStyleData, menuItemStyleData: ddtheme.menuItemStyleData, dropdownStyleData: ddtheme.dropdownStyleData, ), ), ], ), ), errorWidget(context, provider.teamsError), TextWidget(context, "Segment"), DropdownButtonHideUnderline( child: Row( children: [ Expanded( child: DropdownButton2( hint: Text( "Select Segment", style: TextStyle(fontSize: 14), ), items: provider.segmentsList .map( (slist) => DropdownMenuItem( value: slist, child: Text( slist.name!, style: TextStyle( fontSize: 14, ), ), ), ) .toList(), // value: provider.selectedSegment, value: provider.segmentsList.isNotEmpty?provider.selectedSegment!=null? provider.segmentsList.firstWhere((element) => element.id==provider.selectedSegmentId, orElse: () => provider.segmentsList[0], ):null:null, onChanged: (Segments? value) { if (value != null) { if (provider .segmentsList .isNotEmpty) { provider.selectedSegment = value; provider.selectedSegmentId = value!.id!; provider.selectedSegmentValue = value!.name!; } } }, isExpanded: true, dropdownSearchData: DropdownSearchData( searchInnerWidgetHeight: 50, searchController: provider .segmentSearchController, searchInnerWidget: Padding( padding: const EdgeInsets.all( 8, ), child: TextFormField( controller: provider .segmentSearchController, decoration: InputDecoration( isDense: true, contentPadding: const EdgeInsets.symmetric( horizontal: 10, vertical: 8, ), hintText: 'Search Segment...', border: OutlineInputBorder( borderRadius: BorderRadius.circular( 8, ), ), ), ), ), searchMatchFn: ( item, searchValue, ) { return item.value?.name ?.toLowerCase() .contains( searchValue .toLowerCase(), ) ?? false; }, ), onMenuStateChange: (isOpen) { if (!isOpen) { provider.segmentSearchController.clear(); } }, buttonStyleData: ddtheme.buttonStyleData, iconStyleData: ddtheme.iconStyleData, menuItemStyleData: ddtheme.menuItemStyleData, dropdownStyleData: ddtheme.dropdownStyleData, ), ), ], ), ), errorWidget(context, provider.segmentsError), ], ), ), ), Step( label: Text("Step 3", style: TextStyle(fontSize: 12)), title: const Text(''), isActive: _currentStep >= 2, content: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ Container( padding: EdgeInsets.symmetric( horizontal: 10, vertical: 10, ), decoration: BoxDecoration( color: Colors.white, borderRadius: BorderRadius.circular(16), ), child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ InkResponse( onTap: () async { var res = await Navigator.push( context, MaterialPageRoute( builder: (context) => Addleadproductscreen( type: "Add", ), settings: RouteSettings( name: 'Generatequotationaddeditproduct', ), ), ); if (res != null) { print("result ${res}"); } }, 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.productRows.isNotEmpty) ...[ const SizedBox(height: 10), SizedBox( height: 125, child: ListView.builder( scrollDirection: Axis.horizontal, itemCount: provider.productRows.length, itemBuilder: (context, index) { final product = provider.productRows[index]; final productName = provider.productsList .firstWhere( (p) => p.id == product['product_id'], orElse: () => Products( id: '', name: 'Unknown', ), ) .name; final prodPrice = product['price'] ?? '-'; final prodQty = product['qty'] ?? '-'; final totalPrice = product['net_price'] ?? '-'; return InkResponse( onTap: () async { var res = await Navigator.push( context, MaterialPageRoute( builder: (context) => Addleadproductscreen( type: "Edit", editIndex: index, ), settings: RouteSettings( name: 'Generatequotationaddeditproduct', ), ), ); if (res != null) { print("result ${res}"); } }, child: Container( width: MediaQuery.of( context, ).size.width * 0.8, margin: EdgeInsets.only( left: index == 0 ? 10 : 5, right: index == provider .productRows .length - 1 ? 10 : 5, bottom: 5, ), padding: EdgeInsets.symmetric( horizontal: 10, vertical: 8, ), decoration: BoxDecoration( color: Color(0xFFE6F6FF), borderRadius: BorderRadius.circular(14), ), child: Row( mainAxisAlignment: MainAxisAlignment.start, crossAxisAlignment: CrossAxisAlignment.start, children: [ Expanded( flex: 1, child: SvgPicture.asset( "assets/svg/crm/product_details_ic.svg", ), ), SizedBox(width: 10), Expanded( flex: 6, child: Column( crossAxisAlignment: CrossAxisAlignment .start, mainAxisAlignment: MainAxisAlignment.start, children: [ Row( children: [ Expanded( flex: 4, child: Text( productName ?? "-", maxLines: 2, overflow: TextOverflow .ellipsis, style: TextStyle( fontFamily: "JakartaMedium", fontSize: 14, color: AppColors .semi_black, ), ), ), Expanded( flex: 3, child: Text( textAlign: TextAlign .right, "₹$prodPrice", style: TextStyle( fontFamily: "JakartaMedium", fontSize: 14, color: AppColors .semi_black, ), ), ), ], ), Text( "x $prodQty", style: TextStyle( fontFamily: "JakartaMedium", fontSize: 14, color: AppColors .grey_semi, ), ), SizedBox(height: 5), DottedLine( dashGapLength: 4, dashGapColor: Colors.white, dashColor: AppColors.grey_semi, dashLength: 2, lineThickness: 0.5, ), SizedBox(height: 5), Row( mainAxisAlignment: MainAxisAlignment .spaceBetween, children: [ Text( "₹$totalPrice", style: TextStyle( fontFamily: "JakartaMedium", fontSize: 14, color: AppColors .semi_black, ), ), ], ), ], ), ), ], ), ), ); }, ), ), ], if(provider.productRows.isEmpty)...[ if(provider.productsEmptyError!=null)...[ errorWidget(context, provider.productsEmptyError) ] ] ], ), ), SizedBox(height: 10), Container( padding: EdgeInsets.symmetric( horizontal: 10, vertical: 10, ), decoration: BoxDecoration( color: Colors.white, borderRadius: BorderRadius.circular(16), ), child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ TextWidget(context, "State"), DropdownButtonHideUnderline( child: Row( children: [ Expanded( child: DropdownButton2( hint: Text( "Select State", style: TextStyle(fontSize: 14), ), items: provider.statesList .map( (slist) => DropdownMenuItem< States >( value: slist, child: Text( slist.name!, style: TextStyle( fontSize: 14, ), ), ), ) .toList(), // value: provider.selectedStates, value: provider.statesList.isNotEmpty ? provider.selectedStates != null ? provider.statesList!.firstWhere( (ord) => ord.id == provider .selectedStatesId, orElse: () => provider .statesList![0]!, ) : null : null, onChanged: (States? value) { if (value != null) { if (provider .statesList .isNotEmpty) { provider.selectedStates = value; provider.selectedStatesId = value!.id!; provider.selectedStatesValue = value!.name!; provider .crmLeadListDistrictsOnStateAPIFunction( context, "", value!.id!, ); if (provider .districtsList .isNotEmpty) { provider.districtsList .clear(); provider.subLocationsList.clear(); // provider.selectedDistricts = null; provider.selectedDistrictId = null; provider.selectedDistrictValue = ""; provider.selectedSubLocationId = null; provider.selectedSubLocationValue = ""; } } } }, isExpanded: true, buttonStyleData: ddtheme.buttonStyleData, iconStyleData: ddtheme.iconStyleData, menuItemStyleData: ddtheme.menuItemStyleData, dropdownStyleData: ddtheme.dropdownStyleData, ), ), ], ), ), errorWidget(context, provider.statesError), TextWidget(context, "District"), DropdownButtonHideUnderline( child: Row( children: [ Expanded( child: DropdownButton2( hint: Text( "Select District", style: TextStyle(fontSize: 14), ), items: provider.districtsList .map( (slist) => DropdownMenuItem< Districts >( value: slist, child: Text( slist.district!, style: TextStyle( fontSize: 14, ), ), ), ) .toList(), // value: provider.selectedDistricts, value: provider.districtsList.isNotEmpty ? provider.selectedDistricts != null ? provider.districtsList! .firstWhere( (ord) => ord.id == provider .selectedDistrictId, orElse: () => provider .districtsList![0]!, ) : null : null, onChanged: (Districts? value) { if (value != null) { if (provider .districtsList .isNotEmpty) { provider.selectedDistricts = value; provider.selectedDistrictId = value!.id!; provider.selectedDistrictValue = value!.district!; provider .crmLeadListSubLocOnDistrictAPIFunction( context, "", value!.id!, ); if (provider .subLocationsList .isNotEmpty) { provider.subLocationsList .clear(); // provider.selectedSubLocations = // null; provider.selectedSubLocationId = null; provider.selectedSubLocationValue = ""; } } } }, isExpanded: true, buttonStyleData: ddtheme.buttonStyleData, iconStyleData: ddtheme.iconStyleData, menuItemStyleData: ddtheme.menuItemStyleData, dropdownStyleData: ddtheme.dropdownStyleData, ), ), ], ), ), errorWidget(context, provider.districtsError), TextWidget(context, "Sub Location"), DropdownButtonHideUnderline( child: Row( children: [ Expanded( child: DropdownButton2( hint: Text( "Select Sub Location", style: TextStyle(fontSize: 14), ), items: provider.subLocationsList .map( (slist) => DropdownMenuItem< SubLocations >( value: slist, child: Text( slist.subLocality!, style: TextStyle( fontSize: 14, ), ), ), ) .toList(), // value: provider.selectedSubLocations, value: provider .subLocationsList .isNotEmpty ? provider.selectedSubLocations != null ? provider .subLocationsList! .firstWhere( (ord) => ord.id == provider .selectedSubLocationId, orElse: () => provider .subLocationsList![0]!, ) : null : null, onChanged: (SubLocations? value) { if (value != null) { if (provider .subLocationsList .isNotEmpty) { provider.selectedSubLocations = value; provider.selectedSubLocationId = value!.id!; provider.selectedSubLocationValue = value!.subLocality!; } } }, isExpanded: true, buttonStyleData: ddtheme.buttonStyleData, iconStyleData: ddtheme.iconStyleData, menuItemStyleData: ddtheme.menuItemStyleData, dropdownStyleData: ddtheme.dropdownStyleData, ), ), ], ), ), errorWidget(context, provider.subLocError), TextWidget(context, "Lead Status"), DropdownButtonHideUnderline( child: Row( children: [ Expanded( child: DropdownButton2( isExpanded: true, hint: const Row( children: [ Expanded( child: Text( 'Select Lead Status', style: TextStyle( fontSize: 14, ), overflow: TextOverflow.ellipsis, ), ), ], ), items: ['Cold', 'Hot', 'Warm'] .map( (value) => DropdownMenuItem< String >( value: value, child: Text( value ?? '', style: const TextStyle( fontSize: 14, ), overflow: TextOverflow .ellipsis, ), ), ) .toList(), value: provider.selectedLeadStatus, onChanged: (String? newValue) { setState(() { provider.selectedLeadStatus = newValue!; }); }, buttonStyleData: ddtheme.buttonStyleData, iconStyleData: ddtheme.iconStyleData, menuItemStyleData: ddtheme.menuItemStyleData, dropdownStyleData: ddtheme.dropdownStyleData, ), ), ], ), ), errorWidget(context, provider.leadStatusError), textControllerWidget( context, provider.addressController, "Address", "Enter Address ", provider.onChangeaddress, TextInputType.streetAddress, false, null, focusNodes[7], null, TextInputAction.done, ), errorWidget(context, provider.addressError), ], ), ), ], ), ), ], controlsBuilder: (context, details) { // return Row( // children: [ // ElevatedButton( // onPressed: () { // setState(() { // if (_currentStep == 0) { // _currentStep = 1; // } else if (_currentStep == 1) { // _currentStep = 2; // } else { // _currentStep = 0; // } // }); // details.onStepContinue; // }, // child: Text(_currentStep == 2 ? 'Submit' : 'Next'), // ), // const SizedBox(width: 10), // if (_currentStep > 0) // TextButton( // onPressed: () { // setState(() { // if (_currentStep == 2) { // _currentStep = 1; // } else if (_currentStep == 1) { // _currentStep = 0; // } else { // _currentStep = 2; // } // }); // details.onStepCancel; // }, // child: const Text('Back'), // ), // ], // ); return Column( children: [ if (_currentStep == 2) ...[ InkResponse( onTap: () { HapticFeedback.selectionClick(); if (provider.validateStep3()) { if(provider.productRows.isNotEmpty){ provider.crmAddNewLeadsAndProspectsAPIFunction( context, "", provider.selectedEmployeesId, provider.selectedSalutation, provider.selectedDistrictId, provider.selectedStatesId, provider.selectedSegmentId, provider.selectedSourcesId, provider.selectedReferenceId, provider.selectedReferenceId, provider.selectedSubLocationId, provider.selectedLeadStatus, provider.getJsonEncodedProducts(), ); }else{ toast(context, "Add min. 1 product"); } } details.onStepContinue; }, child: Container( height: 45, alignment: Alignment.center, margin: EdgeInsets.symmetric( horizontal: 10, vertical: 10, ), padding: EdgeInsets.symmetric( horizontal: 10, vertical: 5, ), decoration: BoxDecoration( color: AppColors.app_blue, borderRadius: BorderRadius.circular(15), ), child: Text( "Submit", style: TextStyle( fontSize: 15, fontFamily: "JakartaMedium", color: Colors.white, ), ), ), ), ] else ...[ InkResponse( onTap: () { HapticFeedback.selectionClick(); setState(() { if (_currentStep == 0) { if (provider.validateStep1()) { _currentStep = 1; } } else if (_currentStep == 1) { if (provider.validateStep2()) { _currentStep = 2; } } else { _currentStep = 0; } }); details.onStepContinue; }, child: Container( height: 45, alignment: Alignment.center, margin: EdgeInsets.symmetric( horizontal: 10, vertical: 10, ), padding: EdgeInsets.symmetric( horizontal: 10, vertical: 5, ), decoration: BoxDecoration( color: AppColors.app_blue, borderRadius: BorderRadius.circular(15), ), child: Text( "Proceed to Next Step", textAlign: TextAlign.start, style: TextStyle( fontSize: 15, fontFamily: "JakartaMedium", color: Colors.white, ), ), ), ), ], if (_currentStep > 0) ...[ TextButton( onPressed: () { setState(() { if (_currentStep == 2) { _currentStep = 1; } else if (_currentStep == 1) { _currentStep = 0; } else { _currentStep = 2; } }); details.onStepCancel; }, child: Text( 'Back', style: TextStyle( color: AppColors.app_blue, fontSize: 14, ), ), ), ], ], ); }, ), ), ), ); }, ); } }