Commit fb928cfe authored by Sai Srinivas's avatar Sai Srinivas
Browse files

23-06-2025 By Sai Srinivas

CRM Module - lead list, lead details, generate quotations, add and edit, Nearby Leads.
parent b9d7c024
......@@ -123,6 +123,9 @@ Dropdowntheme ddtheme = Dropdowntheme();
floatingActionButton: Align(
alignment: Alignment.bottomCenter,
child: InkWell(
onTap: () {
_showAddAppointmentSheet(context);
},
child: Container(
alignment: Alignment.bottomCenter,
height: 45,
......
......@@ -5,6 +5,7 @@ import 'package:generp/screens/crm/AppointmentDetails.dart';
import 'package:generp/screens/crm/FollowUpDetails.dart';
import 'package:generp/screens/crm/QuotationDetails.dart';
import 'package:generp/screens/crm/contactDetails.dart';
import 'package:generp/screens/crm/editAccountDetails.dart';
import 'package:generp/screens/crm/productDetails.dart';
import 'package:provider/provider.dart';
......@@ -19,9 +20,9 @@ class LeadDetailsByMode extends StatefulWidget {
const LeadDetailsByMode({
super.key,
this.mode,
this.pageTitleName,
this.leadId,
required this.mode,
required this.pageTitleName,
required this.leadId,
});
@override
......@@ -57,9 +58,7 @@ class _LeadDetailsByModeState extends State<LeadDetailsByMode> {
provider.resetAll,
InkResponse(
onTap: () {
_showOptionsSheet(
context
);
_showOptionsSheet(context);
},
child: SvgPicture.asset("assets/svg/ic_more.svg", height: 30),
),
......@@ -112,7 +111,37 @@ class _LeadDetailsByModeState extends State<LeadDetailsByMode> {
),
),
),
SizedBox(width: 10),
Expanded(
flex: 1,
child: InkResponse(
onTap: () async {
var res = await Navigator.push(
context,
MaterialPageRoute(
builder:
(context) => EditAccountDetails(
leadID: leadDetails.id,
mode: widget.mode,
accountID: leadDetails.accId,
companyName:leadDetails.name,
),
),
);
if(res==true){
provider.crmLeadDetailsAPIFunction(context, widget.leadId, widget.mode);
}
},
child: Container(
height: 32,
width: 30,
padding: EdgeInsets.all(8.0),
child: SvgPicture.asset(
"assets/svg/crm_contact_edit.svg",
),
),
),
),
],
),
Divider(thickness: 0.5, color: Color(0xFFD7D7D7)),
......@@ -134,30 +163,36 @@ class _LeadDetailsByModeState extends State<LeadDetailsByMode> {
),
Expanded(
child: InkResponse(
child:provider.Headings[j]=="Lead Age"? Tooltip(
triggerMode: TooltipTriggerMode.tap,
child:
provider.Headings[j] == "Lead Age"
? Tooltip(
triggerMode: TooltipTriggerMode.tap,
message: "${provider.leadDetails.createdDatetime}",
child:Text(
provider.subHeadings[j] == ""
? "-"
: provider.subHeadings[j],
style: TextStyle(
fontSize: 14,
color: Color(0xFF818181),
decorationColor: AppColors.grey_semi,
decoration: TextDecoration.underline
),
),
):Text(
provider.subHeadings[j] == ""
? "-"
: provider.subHeadings[j],
style: TextStyle(
fontSize: 14,
color: Color(0xFF818181),
),
),
message:
"${provider.leadDetails.createdDatetime}",
child: Text(
provider.subHeadings[j] == ""
? "-"
: provider.subHeadings[j],
style: TextStyle(
fontSize: 14,
color: Color(0xFF818181),
decorationColor:
AppColors.grey_semi,
decoration:
TextDecoration.underline,
),
),
)
: Text(
provider.subHeadings[j] == ""
? "-"
: provider.subHeadings[j],
style: TextStyle(
fontSize: 14,
color: Color(0xFF818181),
),
),
),
),
],
......@@ -225,23 +260,58 @@ class _LeadDetailsByModeState extends State<LeadDetailsByMode> {
];
return ListTile(
onTap: () {
switch(index){
switch (index) {
case 0:
Navigator.push(context, MaterialPageRoute(builder: (context) => Productdetails(),));
Navigator.push(
context,
MaterialPageRoute(
builder: (context) => Productdetails(
leadID: provider.leadDetails.id,
mode: widget.mode,
),
),
);
break;
case 1:
Navigator.push(context, MaterialPageRoute(builder: (context) => Contactdetails(
accID:provider.leadDetails.accId
),));
Navigator.push(
context,
MaterialPageRoute(
builder:
(context) => Contactdetails(
accID: provider.leadDetails.accId,
),
),
);
break;
case 2:
Navigator.push(context, MaterialPageRoute(builder: (context) => FollowUpDetails(),));
Navigator.push(
context,
MaterialPageRoute(
builder: (context) => FollowUpDetails(),
),
);
break;
case 3:
Navigator.push(context, MaterialPageRoute(builder: (context) => AppointmentDetails(leadID:provider.leadDetails.id ,),));
Navigator.push(
context,
MaterialPageRoute(
builder:
(context) => AppointmentDetails(
leadID: provider.leadDetails.id,
),
),
);
break;
case 4:
Navigator.push(context, MaterialPageRoute(builder: (context) => QuotationDetails(),));
Navigator.push(
context,
MaterialPageRoute(
builder:
(context) => QuotationDetails(
leadID: provider.leadDetails.id,
),
),
);
default:
print("object");
}
......
......@@ -228,7 +228,7 @@ class _LeadlistbymodeState extends State<Leadlistbymode> {
),
Expanded(
child: Text(
subHeadings[j]!,
subHeadings[j]??"-",
style: TextStyle(
fontSize: 14,
color: Color(0xFF818181),
......@@ -374,7 +374,11 @@ class _LeadlistbymodeState extends State<Leadlistbymode> {
),
)
.toList(),
value: provider.selectedEmployees,
value:provider.employeesList.contains(provider.selectedEmployees)
? provider.selectedEmployees
: null,
// value: provider.selectedEmployees,
onChanged: (Employees? value) {
if (value != null) {
if(provider.employeesList.isNotEmpty){
......
import 'package:dropdown_button2/dropdown_button2.dart';
import 'package:flutter/foundation.dart';
import 'package:flutter/gestures.dart';
import 'package:flutter/material.dart';
import 'package:flutter_svg/svg.dart';
import 'package:generp/Notifiers/NearByGeneratorsProvider.dart';
import 'package:generp/Utils/app_colors.dart';
import 'package:generp/Utils/commonWidgets.dart';
import 'package:google_maps_flutter/google_maps_flutter.dart';
import 'package:interactive_slider/interactive_slider.dart';
import 'package:provider/provider.dart';
import '../../Notifiers/crmProvider/crmNearbyOpenLeadsProvider.dart';
import '../../Utils/dropdownTheme.dart';
class NearbyOpenLeads extends StatefulWidget {
const NearbyOpenLeads({super.key});
@override
State<NearbyOpenLeads> createState() => _NearbyOpenLeadsState();
}
class _NearbyOpenLeadsState extends State<NearbyOpenLeads> {
Dropdowntheme ddtheme = Dropdowntheme();
@override
void initState() {
// TODO: implement initState
super.initState();
WidgetsBinding.instance.addPostFrameCallback((_) {
final provider = Provider.of<crmNearbyOpenLeadsProvider>(context,listen: false);
provider.getLocationPermission(context);
},);
}
@override
Widget build(BuildContext context) {
debugPrint("Nearbygenerators widget rebuilt");
return Consumer<crmNearbyOpenLeadsProvider>(builder: (context, provider, child) {
var sendWidget = GestureDetector(
onTap: () {
_showFilterBottomSheet(context);
},
child: SvgPicture.asset("assets/svg/filter_ic.svg",height: 25,));
return WillPopScope(
onWillPop: () => onBackPressed(context),
child: Scaffold(
resizeToAvoidBottomInset: true,
appBar: appbar2(context, "Nearby Leads (Open)",provider.resetAll,SizedBox(width: 0,)),
backgroundColor: AppColors.scaffold_bg_color,
body: SafeArea(
child: Container(
child: SingleChildScrollView(
child:Column(
children: [
ClipRRect(
// Apply border radius using ClipRRect
borderRadius: BorderRadius.only(
topLeft: Radius.circular(30.0),
topRight: Radius.circular(30.0),
),
// padding: EdgeInsets.fromLTRB(10, 20, 10, 20),
child: Container(
height: MediaQuery.of(context).size.height,
child: Stack(children: [
GoogleMap(
myLocationEnabled: true,
zoomGesturesEnabled: true,
zoomControlsEnabled: true,
gestureRecognizers: {
Factory<OneSequenceGestureRecognizer>(() => EagerGestureRecognizer()),
Factory<PanGestureRecognizer>(() => PanGestureRecognizer()),
Factory<ScaleGestureRecognizer>(() => ScaleGestureRecognizer()), // Prioritize pinch-to-zoom
},
initialCameraPosition: CameraPosition(
target: provider.startLocation,
zoom:14.0
),
markers:provider.markers.toSet(),
mapType: MapType.normal,
onMapCreated: (controller) {
setState(() {
provider.mapController = controller;
});
},
onCameraMove: (position) {
provider.onCameraMove(context,position);
},
),
]),
),
),
],
),
),
),
),
),
);
},);
}
Future<void> _showFilterBottomSheet(BuildContext context) {
return showModalBottomSheet(
useSafeArea: true,
isDismissible: true,
isScrollControlled: true,
showDragHandle: true,
enableDrag: true,
context: context,
builder: (context) {
return StatefulBuilder(
builder: (context, setState) {
return SafeArea(
child: Consumer<Nearbygeneratorsprovider>(
builder: (context,provider,child) {
return Container(
margin: EdgeInsets.only(
bottom: 15,
left: 15,
right: 15,
top: 15,
),
child: SingleChildScrollView(
child: Column(
mainAxisSize: MainAxisSize.min,
children: [
Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Text(
"Filter",
style: TextStyle(
color: AppColors.app_blue,
fontFamily: "JakartaSemiBold",
fontSize: 16,
),
),
SizedBox(height: 15),
Align(
alignment: Alignment.centerLeft,
child: Text(
'Status',
style: TextStyle(
fontSize: 18.0,
fontWeight: FontWeight.w500,
),
),
),
DropdownButtonHideUnderline(
child: Row(
children: [
Expanded(
child: DropdownButton2<String>(
isExpanded: true,
hint: const Row(
children: [
Expanded(
child: Text(
'Select Complaint Status',
style: TextStyle(
fontSize: 14,
),
overflow: TextOverflow.ellipsis,
),
),
],
),
items: <String>[
'Active',
'Inactive',
'Suspense',
].map(
(value) =>
DropdownMenuItem<String>(
value: value,
child: Text(
value ?? '',
style: const TextStyle(
fontSize: 14,
),
overflow: TextOverflow.ellipsis,
),
)).toList(),
value: provider.selectedItem,
onChanged: (String? newValue) {
setState(() {
provider.selectedItem = newValue!;
});
},
buttonStyleData: ddtheme.buttonStyleData,
iconStyleData: ddtheme.iconStyleData,
menuItemStyleData: ddtheme.menuItemStyleData,
dropdownStyleData: ddtheme.dropdownStyleData,
),
),
],
),
),
Row(
children: [
Text(
"Radius",
style: TextStyle(
fontSize: 18.0,
fontWeight: FontWeight.w500,
),
),
Spacer(),
Text(
'${provider.currentValue.toStringAsFixed(2)} KM',
style: TextStyle(
fontSize: 18.0,
fontWeight: FontWeight.w500,
),
),
],
),
InteractiveSlider(
min: 1.0,
max: 100.0,
enabled: true,
// backgroundColor: AppColors.app_blue,
foregroundColor: AppColors.app_blue,
segmentDividerColor:Color(0xFFF6F6F8),
onChanged: (value) {
provider.currentValue = value;
provider.debounce(() {
provider.LoadNearbyGeneratorsAPI(context);
}, Duration(milliseconds: 200));
},
),
// Slider(
// value: provider.currentValue,
// max: 100,
// divisions: 100,
//
// label: provider.currentValue.toStringAsFixed(2),
// inactiveColor: Color(0xFFD7D7D7),
// activeColor: AppColors.cyan_blue,
// onChanged: (value) {
// provider.currentValue = value;
// provider.debounce(() {
// provider.LoadNearbyGeneratorsAPI(context);
// }, Duration(milliseconds: 200));
// },
// ),
SizedBox(height: 30.0),
Container(
child: InkWell(
onTap: () {
provider.debounce(() {
provider.LoadNearbyGeneratorsAPI(context);
Navigator.pop(context);
}, Duration(milliseconds: 500));
},
child: Container(
alignment: Alignment.center,
height: 45,
margin: EdgeInsets.only(
left: 15.0,
right: 15.0,
),
decoration: BoxDecoration(
borderRadius: BorderRadius.circular(14.0),
color: AppColors.app_blue
),
child: Text(
"Search",
textAlign: TextAlign.center,
style: TextStyle(
fontFamily: 'JakartaMedium',
color: Colors.white
),
),
),
),
),
],
),
],
),
),
);
}
),
);
},
);
},
);
}
}
import 'package:flutter/material.dart';
import 'package:generp/screens/crm/generateQuotationScreen.dart';
import 'package:provider/provider.dart';
import '../../Notifiers/crmProvider/crmLeadDetailsProvider.dart';
import '../../Utils/app_colors.dart';
import '../../Utils/commonWidgets.dart';
class QuotationDetails extends StatefulWidget {
const QuotationDetails({super.key});
final leadID;
const QuotationDetails({super.key,required this.leadID});
@override
State<QuotationDetails> createState() => _QuotationDetailsState();
......@@ -51,14 +52,13 @@ class _QuotationDetailsState extends State<QuotationDetails> {
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
...List.generate(5, (j) {
final textheads = [
"Id",
"Employee Name",
"Quotation",
"Info",
"Date"
"Date",
];
final textSubheads = [
quotationDetails[index].id ?? "-",
......@@ -75,7 +75,7 @@ class _QuotationDetailsState extends State<QuotationDetails> {
),
child: Row(
crossAxisAlignment:
CrossAxisAlignment.start,
CrossAxisAlignment.start,
children: [
Expanded(
child: Text(
......@@ -90,10 +90,16 @@ class _QuotationDetailsState extends State<QuotationDetails> {
maxLines: 2,
overflow: TextOverflow.ellipsis,
style: TextStyle(
color: textSubheads[j]=="View File"?AppColors.app_blue:
Color(0xFF818181),
decoration:textSubheads[j]=="View File"? TextDecoration.underline:TextDecoration.none,
decorationColor: AppColors.app_blue
color:
textSubheads[j] == "View File"
? AppColors.app_blue
: Color(0xFF818181),
decoration:
textSubheads[j] == "View File"
? TextDecoration.underline
: TextDecoration.none,
decorationColor:
AppColors.app_blue,
),
),
),
......@@ -116,13 +122,20 @@ class _QuotationDetailsState extends State<QuotationDetails> {
floatingActionButton: Align(
alignment: Alignment.bottomCenter,
child: InkWell(
onTap: () {
Navigator.push(
context,
MaterialPageRoute(
builder:
(context) =>
Generatequotationscreen(leadId: widget.leadID),
),
);
},
child: Container(
alignment: Alignment.bottomCenter,
height: 45,
width: MediaQuery
.of(context)
.size
.width,
width: MediaQuery.of(context).size.width,
margin: EdgeInsets.symmetric(horizontal: 10),
decoration: BoxDecoration(
color: AppColors.app_blue,
......@@ -130,7 +143,7 @@ class _QuotationDetailsState extends State<QuotationDetails> {
),
child: Center(
child: Text(
"Followup Details",
"Generate Quotation",
textAlign: TextAlign.center,
style: TextStyle(
color: Colors.white,
......@@ -142,7 +155,7 @@ class _QuotationDetailsState extends State<QuotationDetails> {
),
),
floatingActionButtonLocation:
FloatingActionButtonLocation.centerFloat,
FloatingActionButtonLocation.centerFloat,
),
);
},
......
import 'package:flutter/material.dart';
import 'package:flutter_svg/svg.dart';
import 'package:generp/screens/crm/NearbyOpenLeads.dart';
import 'package:generp/screens/crm/ProspectListByMode.dart';
import 'package:provider/provider.dart';
import '../../Notifiers/crmProvider/crmDashboardProvider.dart';
......@@ -47,9 +49,16 @@ class _CrmdashboardScreenState extends State<CrmdashboardScreen> {
// final icons = ["comm_ic_1", "comm_ic_2"];
Widget? SvgIcon;
if (gridPages[index].pageName!.contains("Lead List")) {
if (gridPages[index].pageName!.contains("Lead List"))
{
SvgIcon = SvgPicture.asset("assets/svg/fin_lv1.svg");
} else {
}
else if (gridPages[index].pageName=="Nearby Leads")
{
SvgIcon = SvgPicture.asset("assets/svg/home_icons_5.svg",height: 18,width: 18,);
}
else
{
SvgIcon = SvgPicture.asset("assets/svg/fin_ic.svg");
}
return InkResponse(
......@@ -66,7 +75,20 @@ class _CrmdashboardScreenState extends State<CrmdashboardScreen> {
),
),
);
} else {}
} else if (gridPages[index].pageName!.contains("Prospect List")) {
Navigator.push(
context,
MaterialPageRoute(
builder:
(context) => ProspectListByMode(
mode: gridPages[index].mode,
pageTitleName: gridPages[index].pageName,
),
),
);
}else if(gridPages[index].pageName=="Nearby Leads"){
Navigator.push(context, MaterialPageRoute(builder: (context) => NearbyOpenLeads(),));
}
// switch (gridPages[index].pageName!) {
// case "Lead List":
// Navigator.push(
......
import 'package:dropdown_button2/dropdown_button2.dart';
import 'package:flutter/material.dart';
import 'package:provider/provider.dart';
import '../../Models/crmModels/GetSegmentOnTeamResponse.dart';
import '../../Models/crmModels/crmLeadDetailsEditAccountViewResponse.dart';
import '../../Notifiers/crmProvider/editCrmAccountDetailsProvider.dart';
import '../../Utils/app_colors.dart';
import '../../Utils/commonWidgets.dart';
import '../../Utils/dropdownTheme.dart';
class EditAccountDetails extends StatefulWidget {
final leadID;
final mode;
final accountID;
final companyName;
const EditAccountDetails({super.key,required this.leadID,required this.mode,required this.accountID,required this.companyName});
@override
State<EditAccountDetails> createState() => _EditAccountDetailsState();
}
class _EditAccountDetailsState extends State<EditAccountDetails> {
Dropdowntheme ddtheme = Dropdowntheme();
@override
void initState() {
// TODO: implement initState
super.initState();
WidgetsBinding.instance.addPostFrameCallback((timeStamp) {
final provider = Provider.of<Editcrmaccountdetailsprovider>(
context,
listen: false,
);
provider.editCompanyNameController.text = widget.companyName!;
provider.crmLeadDetailsEditAccountAPIFunction(context, widget.leadID, widget.mode);
});
}
@override
Widget build(BuildContext context) {
return Consumer<Editcrmaccountdetailsprovider>(
builder: (context, provider, child) {
return WillPopScope(
onWillPop: () => onBackPressed(context),
child: Scaffold(
resizeToAvoidBottomInset: true,
appBar: appbar(context, "Edit Account"),
backgroundColor: AppColors.scaffold_bg_color,
body: SafeArea(
child: Container(
padding: EdgeInsets.symmetric(horizontal: 10,vertical: 10),
margin: EdgeInsets.symmetric(horizontal: 10,vertical: 5),
decoration: BoxDecoration(
color: Colors.white,
borderRadius: BorderRadius.circular(12.0),
),
child: SingleChildScrollView(
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
mainAxisSize: MainAxisSize.min,
children: [
textControllerWidget(
context,
provider.editCompanyNameController,
"Enter Name",
provider.onChangedCompanyName,
TextInputType.text,
false,
null,
),
errorWidget(context, provider.companyNameError),
TextWidget(context, "Team"),
DropdownButtonHideUnderline(
child: Row(
children: [
Expanded(
child: DropdownButton2<Teams>(
hint: Text(
"Select Team",
style: TextStyle(fontSize: 14),
),
items:
provider.teamsList
.map(
(slist) =>
DropdownMenuItem<Teams>(
value: slist,
child: Text(
slist.name!,
style: TextStyle(
fontSize: 14,
),
),
),
)
.toList(),
value: provider.selectedTeams,
onChanged: (Teams? value) {
if (value != null) {
if(provider.teamsList.isNotEmpty){
provider.selectedTeams = value;
provider.selectedTeamId = value!.id!;
provider.selectedTeamValue = value!.name!;
provider.crmLeadListSegmentOnTeamAPIFunction(context, widget.mode, provider.selectedTeamId);
}
}
},
isExpanded: true,
buttonStyleData: ddtheme.buttonStyleData,
iconStyleData: ddtheme.iconStyleData,
menuItemStyleData: ddtheme.menuItemStyleData,
dropdownStyleData: ddtheme.dropdownStyleData,
),
),
],
),
),
TextWidget(context, "Segment"),
DropdownButtonHideUnderline(
child: Row(
children: [
Expanded(
child: DropdownButton2<Segments>(
hint: Text(
"Select Segment",
style: TextStyle(fontSize: 14),
),
items:
provider.segmentsList
.map(
(slist) =>
DropdownMenuItem<Segments>(
value: slist,
child: Text(
slist.name!,
style: TextStyle(
fontSize: 14,
),
),
),
)
.toList(),
value: provider.selectedSegments,
onChanged: (Segments? value) {
if (value != null) {
if(provider.segmentsList.isNotEmpty){
provider.selectedSegments = value;
provider.selectedSegmentId = value!.id!;
provider.selectedSegmentValue = value!.name!;
}
}
},
isExpanded: true,
buttonStyleData: ddtheme.buttonStyleData,
iconStyleData: ddtheme.iconStyleData,
menuItemStyleData: ddtheme.menuItemStyleData,
dropdownStyleData: ddtheme.dropdownStyleData,
),
),
],
),
),
SizedBox(height: 25,),
InkWell(
onTap: provider.isLoading?null:(){
provider.isLoading = true;
provider.crmLeadDetailsEditAccountSubmitAPIFunction(context, widget.accountID, provider.selectedSegmentId, provider.selectedTeamId);
},
child: Container(
alignment: Alignment.center,
height: 45,
margin: EdgeInsets.only(
left: 5.0,
right: 5.0,
top: 5.0,
bottom: 5.0,
),
decoration: BoxDecoration(
color: AppColors.app_blue, //1487C9
borderRadius: BorderRadius.circular(14.0),
),
child: Center(
child: provider.isLoading?CircularProgressIndicator.adaptive(valueColor: AlwaysStoppedAnimation(AppColors.white),):Text(
"Submit",
textAlign: TextAlign.center,
style: TextStyle(color: Colors.white),
),
),
),
),
],
),
),
),
),
),
);
},
);
}
}
This diff is collapsed.
This diff is collapsed.
import 'package:flutter/material.dart';
import 'package:flutter_svg/svg.dart';
import 'package:generp/screens/crm/editProductsList.dart';
import 'package:provider/provider.dart';
import '../../Notifiers/crmProvider/crmLeadDetailsProvider.dart';
......@@ -7,13 +8,26 @@ import '../../Utils/app_colors.dart';
import '../../Utils/commonWidgets.dart';
class Productdetails extends StatefulWidget {
const Productdetails({super.key});
final leadID;
final mode;
const Productdetails({super.key,required this.leadID,required this.mode});
@override
State<Productdetails> createState() => _ProductdetailsState();
}
class _ProductdetailsState extends State<Productdetails> {
@override
void initState() {
// TODO: implement initState
super.initState();
WidgetsBinding.instance.addPostFrameCallback((timeStamp) {
final provider = Provider.of<crmLeadDetailsProvider>(context,listen: false);
provider.crmLeadDetailsAPIFunction(context, widget.leadID, widget.mode);
},);
}
@override
Widget build(BuildContext context) {
return Consumer<crmLeadDetailsProvider>(
......@@ -104,7 +118,14 @@ class _ProductdetailsState extends State<Productdetails> {
floatingActionButton: Align(
alignment: Alignment.bottomCenter,
child: InkWell(
onTap: () async {
var res = await Navigator.push(context, MaterialPageRoute(builder: (context) => EditProductsList(
leadID: widget.leadID,
),));
if(res==true){
provider.crmLeadDetailsAPIFunction(context, widget.leadID, widget.mode);
}
},
child: Container(
alignment: Alignment.bottomCenter,
height: 45,
......@@ -116,7 +137,7 @@ class _ProductdetailsState extends State<Productdetails> {
),
child: Center(
child: Text(
"Followup Details",
"Edit Products",
textAlign: TextAlign.center,
style: TextStyle(color: Colors.white,
fontFamily: "JakartaMedium"),
......
......@@ -1006,6 +1006,49 @@ class _PaymentrequestionlistdetailsState
}
}
},
dropdownSearchData: DropdownSearchData(
searchInnerWidgetHeight: 50,
searchController:
provider
.paymentAccountSearchController,
searchInnerWidget: Padding(
padding: const EdgeInsets.all(8),
child: TextFormField(
controller:
provider
.paymentAccountSearchController,
decoration: InputDecoration(
isDense: true,
contentPadding:
const EdgeInsets.symmetric(
horizontal: 10,
vertical: 8,
),
hintText: 'Search account...',
border: OutlineInputBorder(
borderRadius:
BorderRadius.circular(8),
),
),
),
),
searchMatchFn: (item, searchValue) {
return item.value?.name
?.toLowerCase()
.contains(
searchValue.toLowerCase(),
) ??
false;
},
// Optional: clear search text when dropdown closes
),
onMenuStateChange: (isOpen) {
if (!isOpen) {
provider.paymentAccountSearchController
.clear();
}
},
buttonStyleData: ddtheme.buttonStyleData,
iconStyleData: ddtheme.iconStyleData,
menuItemStyleData:
......@@ -1181,8 +1224,9 @@ class _PaymentrequestionlistdetailsState
.paymentrequisitionProcessSubmitAPIFunction(
context,
widget.mode,
paymentID,
paymentReferenceNumber.text,
paymentID,
provider.selectedID,
remarks.text,
provider.imagePath,
);
......
......@@ -43,4 +43,10 @@ export 'package:generp/Notifiers/ordersProvider/editPaymentProvider.dart';
export 'package:generp/Notifiers/crmProvider/crmDashboardProvider.dart';
export 'package:generp/Notifiers/crmProvider/LeadListProvider.dart';
export 'package:generp/Notifiers/crmProvider/crmLeadDetailsProvider.dart';
export 'package:generp/Notifiers/crmProvider/editCrmAccountDetailsProvider.dart';
export 'package:generp/Notifiers/crmProvider/editProductListProvider.dart';
export 'package:generp/Notifiers/crmProvider/ProspectListProvider.dart';
export 'package:generp/Notifiers/crmProvider/crmProspectDetailsProvider.dart';
export 'package:generp/Notifiers/crmProvider/crmNearbyOpenLeadsProvider.dart';
export 'package:generp/Notifiers/crmProvider/crmGenerateQuotationProvider.dart';
This diff is collapsed.
......@@ -124,21 +124,35 @@ const crmLeadListViewUrl = "${baseUrl_test}crm_lead_list_view";
const crmLeadListFilterSubmitUrl = "${baseUrl_test}submit_crm_lead_list_filter";
const crmLeadListSourceOnReferenceUrl = "${baseUrl_test}get_source_on_reference";
const crmLeadListSegmentOnTeamUrl = "${baseUrl_test}get_segment_on_team";
const crmLeadListDistrictOnStateUrl = "${baseUrl_test}get_segment_on_team";
const crmLeadListDistrictOnStateUrl = "${baseUrl_test}get_district_on_state";
const crmLeadListSubLocOnDistrictUrl = "${baseUrl_test}get_sublocation_on_district";
const crmLeadListContactPopUpUrl = "${baseUrl_test}crm_lead_list_contact_popup";
const crmLeadDetailsUrl = "${baseUrl_test}crm_lead_details";
const crmLeadDetailsEditAccountViewUrl = "${baseUrl_test}crm_lead_details_edit_account_view";
const crmLeadDetailsEditProductsUrl = "${baseUrl_test}crm_lead_details_edit_products";
const crmLeadDetailsEditProductsViewUrl = "${baseUrl_test}crm_lead_details_edit_products_view";
const crmLeadDetailsEditAccountUrl = "${baseUrl_test}crm_lead_details_edit_account";
const crmLeadDetailsAddContactUrl = "${baseUrl_test}crm_lead_details_add_account";
const crmLeadDetailsEditContactUrl = "${baseUrl_test}crm_lead_details_edit_contact";
const crmLeadDetailsAddAppointmentUrl = "${baseUrl_test}crm_lead_details_add_appointment";
const crmLeadDetailsGenerateQuotationViewUrl = "${baseUrl_test}crm_lead_details_generate_quotation_view";
const crmLeadDetailsGenerateQuotationSubmitUrl = "${baseUrl_test}crm_lead_details_generate_quotation_submit";
const crmProspectListViewUrl = "${baseUrl_test}crm_prospect_list_view";
const crmProspectListFilterSubmitUrl = "${baseUrl_test}crm_prospect_list_filter_submit";
const crmProspectDetailsUrl = "${baseUrl_test}crm_prospect_details";
const crmProspectDetailsTransferAccountUrl = "${baseUrl_test}crm_prospect_details_transfer_account_submit";
const crmProspectDetailsEditAccountViewUrl = "${baseUrl_test}crm_prospect_details_edit_account_view";
const crmProspectDetailsEditAccountSubmitUrl = "${baseUrl_test}crm_prospect_details_edit_account_submit";
const crmProspectDetailsAddLeadViewUrl = "${baseUrl_test}crm_prospect_details_add_lead_view";
const crmProspectDetailsAddLeadSubmitUrl = "${baseUrl_test}crm_prospect_details_add_lead_submit";
const crmProspectDetailsAddAccountUrl = "${baseUrl_test}crm_prospect_details_add_account";
const crmProspectDetailsEditContactUrl = "${baseUrl_test}crm_prospect_details_edit_contact";
const crmProspectDetailsFollowupNextAppointmentUrl = "${baseUrl_test}crm_lead_details_add_followup_next_appointment";
const crmCheckAccountFieldsUrl = "${baseUrl_test}check_crm_add_account_fields";
const crmNewProspectLeadSubmitUrl = "${baseUrl_test}crm_add_new_lead_prospect_submit";
const crmNewProspectListEditGstUrl = "${baseUrl_test}crm_prospect_list_edit_gst";
const crmNearbyOpenLeadsUrl = "${baseUrl_test}nearby_crm_open_leads";
......
......@@ -37,10 +37,10 @@ packages:
dependency: transitive
description:
name: async
sha256: "758e6d74e971c3e5aceb4110bfd6698efc7f501675bcfe0c775459a8140750eb"
sha256: d2872f9c19731c2e5f10444b14686eb7cc85c76274bd6c16e1816bff9a3bab63
url: "https://pub.dev"
source: hosted
version: "2.13.0"
version: "2.12.0"
barcode:
dependency: transitive
description:
......@@ -285,10 +285,10 @@ packages:
dependency: transitive
description:
name: fake_async
sha256: "5368f224a74523e8d2e7399ea1638b37aecfca824a3cc4dfdf77bf1fa905ac44"
sha256: "6a95e56b2449df2273fd8c45a662d6947ce1ebb7aafe80e550a3f68297f3cacc"
url: "https://pub.dev"
source: hosted
version: "1.3.3"
version: "1.3.2"
ffi:
dependency: transitive
description:
......@@ -932,26 +932,26 @@ packages:
dependency: transitive
description:
name: leak_tracker
sha256: "8dcda04c3fc16c14f48a7bb586d4be1f0d1572731b6d81d51772ef47c02081e0"
sha256: c35baad643ba394b40aac41080300150a4f08fd0fd6a10378f8f7c6bc161acec
url: "https://pub.dev"
source: hosted
version: "11.0.1"
version: "10.0.8"
leak_tracker_flutter_testing:
dependency: transitive
description:
name: leak_tracker_flutter_testing
sha256: "1dbc140bb5a23c75ea9c4811222756104fbcd1a27173f0c34ca01e16bea473c1"
sha256: f8b613e7e6a13ec79cfdc0e97638fddb3ab848452eff057653abd3edba760573
url: "https://pub.dev"
source: hosted
version: "3.0.10"
version: "3.0.9"
leak_tracker_testing:
dependency: transitive
description:
name: leak_tracker_testing
sha256: "8d5a2d49f4a66b49744b23b018848400d23e54caf9463f4eb20df3eb8acb2eb1"
sha256: "6ba465d5d76e67ddf503e1161d1f4a6bc42306f9d66ca1e8f079a47290fb06d3"
url: "https://pub.dev"
source: hosted
version: "3.0.2"
version: "3.0.1"
lints:
dependency: transitive
description:
......@@ -1657,10 +1657,10 @@ packages:
dependency: transitive
description:
name: vm_service
sha256: ddfa8d30d89985b96407efce8acbdd124701f96741f2d981ca860662f1c0dc02
sha256: "0968250880a6c5fe7edc067ed0a13d4bae1577fe2771dcf3010d52c4a9d3ca14"
url: "https://pub.dev"
source: hosted
version: "15.0.0"
version: "14.3.1"
web:
dependency: transitive
description:
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment