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

23-06-2025 By Sai Srinivas

CRM Module - Prospect List and Filter.
parent fb928cfe
class ProspectListViewResponse {
List<Employees>? employees;
String? error;
String? message;
ProspectListViewResponse({this.employees, this.error, this.message});
ProspectListViewResponse.fromJson(Map<String, dynamic> json) {
if (json['employees'] != null) {
employees = <Employees>[];
json['employees'].forEach((v) {
employees!.add(new Employees.fromJson(v));
});
}
error = json['error'];
message = json['message'];
}
Map<String, dynamic> toJson() {
final Map<String, dynamic> data = new Map<String, dynamic>();
if (this.employees != null) {
data['employees'] = this.employees!.map((v) => v.toJson()).toList();
}
data['error'] = this.error;
data['message'] = this.message;
return data;
}
}
class Employees {
String? id;
String? name;
Employees({this.id, this.name});
Employees.fromJson(Map<String, dynamic> json) {
id = json['id'];
name = json['name'];
}
Map<String, dynamic> toJson() {
final Map<String, dynamic> data = new Map<String, dynamic>();
data['id'] = this.id;
data['name'] = this.name;
return data;
}
}
class SubmitProspectListFilterResponse {
List<AccountsList>? accountsList;
String? error;
String? message;
SubmitProspectListFilterResponse(
{this.accountsList, this.error, this.message});
SubmitProspectListFilterResponse.fromJson(Map<String, dynamic> json) {
if (json['accounts_list'] != null) {
accountsList = <AccountsList>[];
json['accounts_list'].forEach((v) {
accountsList!.add(new AccountsList.fromJson(v));
});
}
error = json['error'];
message = json['message'];
}
Map<String, dynamic> toJson() {
final Map<String, dynamic> data = new Map<String, dynamic>();
if (this.accountsList != null) {
data['accounts_list'] =
this.accountsList!.map((v) => v.toJson()).toList();
}
data['error'] = this.error;
data['message'] = this.message;
return data;
}
}
class AccountsList {
String? gstNumber;
String? adate;
String? accman;
String? mob1;
String? cname;
String? address;
String? aid;
String? aname;
String? age;
AccountsList(
{this.gstNumber,
this.adate,
this.accman,
this.mob1,
this.cname,
this.address,
this.aid,
this.aname,
this.age});
AccountsList.fromJson(Map<String, dynamic> json) {
gstNumber = json['gst_number'];
adate = json['adate'];
accman = json['accman'];
mob1 = json['mob1'];
cname = json['cname'];
address = json['address'];
aid = json['aid'];
aname = json['aname'];
age = json['age'];
}
Map<String, dynamic> toJson() {
final Map<String, dynamic> data = new Map<String, dynamic>();
data['gst_number'] = this.gstNumber;
data['adate'] = this.adate;
data['accman'] = this.accman;
data['mob1'] = this.mob1;
data['cname'] = this.cname;
data['address'] = this.address;
data['aid'] = this.aid;
data['aname'] = this.aname;
data['age'] = this.age;
return data;
}
}
import 'package:flutter/cupertino.dart';
import 'package:flutter/foundation.dart';
import 'package:provider/provider.dart';
import '../../Models/crmModels/ProspectListViewResponse.dart';
import '../../Models/crmModels/SubmitProspectListFilterResponse.dart';
import '../../services/api_calling.dart';
import '../HomeScreenNotifier.dart';
class ProspectListProvider extends ChangeNotifier {
TextEditingController mobileNumberController = TextEditingController();
TextEditingController companyNameController = TextEditingController(
text: "a",
);
bool _isLoading = true;
List<Employees> _employeesList = [];
List<AccountsList> _accountList = [];
Employees? _selectedEmployees;
String? _selectedEmployeeId;
String? _selectedEmployeeValue;
bool get isLoading => _isLoading;
List<Employees> get employeesList => _employeesList;
List<AccountsList> get accountList => _accountList;
Employees? get selectedEmployees => _selectedEmployees;
String? get selectedEmployeeId => _selectedEmployeeId;
String? get selectedEmployeeValue => _selectedEmployeeValue;
set isLoading(bool value) {
_isLoading = value;
notifyListeners();
}
set selectedEmployees(Employees? value) {
_selectedEmployees = value;
_selectedEmployeeId = value!.id!;
_selectedEmployeeValue = value.name;
notifyListeners();
}
set selectedEmployeeId(String? value) {
_selectedEmployeeId = value;
notifyListeners();
}
set selectedEmployeeValue(String? value) {
_selectedEmployeeValue = value;
notifyListeners();
}
Future<void> crmProspectListViewAPIFunction(context, mode) async {
try {
var HomeProv = Provider.of<HomescreenNotifier>(context, listen: false);
final data = await ApiCalling.crmProspectListViewAPI(
HomeProv.empId,
HomeProv.session,
mode,
);
if (data != null) {
print(data.error);
if (data.error == "0") {
_employeesList = data.employees!;
checkDropDownValues();
// print(_leadStatusList);
notifyListeners();
}
}
} catch (e, s) {}
}
Future<void> crmProspectListAPIFunction(
context,
mode,
employeeID,
) async {
try {
_accountList.clear();
notifyListeners();
var HomeProv = Provider.of<HomescreenNotifier>(context, listen: false);
final data = await ApiCalling.crmProspectListFilterSubmitAPI(
HomeProv.empId,
HomeProv.session,
mode,
employeeID,
mobileNumberController.text,
companyNameController.text,
);
if (data != null) {
_isLoading = true;
notifyListeners();
if (data.error == "0") {
_accountList = data.accountsList!;
_isLoading = false;
checkDropDownValues();
notifyListeners();
} else {
_isLoading = false;
notifyListeners();
}
} else {
_isLoading = false;
notifyListeners();
}
} catch (e, s) {
_isLoading = false;
notifyListeners();
}
}
onChangedLeadId(value) {
notifyListeners();
}
onChangedMobileNum(value) {
notifyListeners();
}
onChangedCompanyName(value) {
notifyListeners();
}
void resetForm() {
_isLoading = false;
mobileNumberController.clear();
companyNameController.clear();
companyNameController.text = "a";
_selectedEmployees = null;
_selectedEmployeeId = null;
_selectedEmployeeValue = null;
checkDropDownValues();
notifyListeners();
}
void checkDropDownValues() {
if (!_employeesList.contains(_selectedEmployees) &&
_selectedEmployees != null) {
_selectedEmployeeId = null;
_selectedEmployeeValue = null;
}
notifyListeners();
}
}
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/Utils/dropdownTheme.dart';
import 'package:provider/provider.dart';
import '../../Models/crmModels/ProspectListViewResponse.dart';
import '../../Notifiers/crmProvider/ProspectListProvider.dart';
import '../../Utils/app_colors.dart';
import '../../Utils/commonWidgets.dart';
import 'ProspectDetailsByMode.dart';
class ProspectListByMode extends StatefulWidget {
final pageTitleName;
final mode;
const ProspectListByMode({super.key, this.pageTitleName, this.mode});
@override
State<ProspectListByMode> createState() => _ProspectListByModeState();
}
class _ProspectListByModeState extends State<ProspectListByMode> {
Dropdowntheme ddtheme = Dropdowntheme();
@override
void initState() {
// TODO: implement initState
super.initState();
WidgetsBinding.instance.addPostFrameCallback((timeStamp) {
final provider = Provider.of<ProspectListProvider>(context, listen: false);
provider.crmProspectListViewAPIFunction(context, widget.mode);
provider.crmProspectListAPIFunction(
context,
widget.mode,
"",
);
});
}
@override
Widget build(BuildContext context) {
return Consumer<ProspectListProvider>(
builder: (context, provider, child) {
final crmLists = provider.accountList;
return WillPopScope(
onWillPop: () {
return onBackPressed(context);
},
child: Scaffold(
resizeToAvoidBottomInset: true,
appBar: appbar2(
context,
widget.pageTitleName,
provider.resetForm,
Row(
children: [
InkResponse(
onTap: () async {
_showFilterSheet(context);
},
child: SvgPicture.asset(
"assets/svg/filter_ic.svg",
height: 25,
),
),
],
),
),
backgroundColor: AppColors.scaffold_bg_color,
body: SafeArea(
child:
provider.isLoading
? Center(
child: CircularProgressIndicator.adaptive(
valueColor: AlwaysStoppedAnimation<Color>(
AppColors.app_blue,
),
),
)
: crmLists.isNotEmpty
? SizedBox(
child: Scrollbar(
thumbVisibility: false,
child: ListView.builder(
itemCount: crmLists.length,
shrinkWrap: true,
physics: AlwaysScrollableScrollPhysics(),
itemBuilder: (context, index) {
if (crmLists.isEmpty) {
return SizedBox(
child: Center(
child: Text("No Data Available"),
),
);
}
return Container(
padding: EdgeInsets.symmetric(
horizontal: 10,
vertical: 10,
),
margin: EdgeInsets.symmetric(
horizontal: 10,
vertical: 10,
),
decoration: BoxDecoration(
color: Colors.white,
borderRadius: BorderRadius.circular(16),
),
child: Column(
children: [
Row(
children: [
Expanded(
flex: 1,
child: Container(
height: 50,
width: 35,
padding: EdgeInsets.all(8.0),
decoration: BoxDecoration(
color: Color(0xFFE6F6FF),
borderRadius:
BorderRadius.circular(8),
),
child: SvgPicture.asset(
"assets/svg/se_block_head.svg",
),
),
),
SizedBox(width: 10),
Expanded(
flex: 4,
child: SizedBox(
child: Column(
crossAxisAlignment:
CrossAxisAlignment.start,
children: [
Text(
crmLists[index].aname!,
style: TextStyle(
fontFamily: "JakartaMedium",
fontSize: 14,
color: AppColors.semi_black,
),
),
],
),
),
),
],
),
Divider(
thickness: 0.5,
color: Color(0xFFD7D7D7),
),
...List.generate(6, (j) {
final headings = [
"Account Manager",
"Contact Person",
"Mobile Number",
"Address",
"Account Age",
"GST Number",
];
final subHeadings = [
crmLists[index].accman,
crmLists[index].cname,
crmLists[index].mob1,
crmLists[index].address,
"${crmLists[index].age} days old",
crmLists[index].gstNumber,
];
return Container(
padding: EdgeInsets.symmetric(
vertical: 5,
),
child: Row(
crossAxisAlignment:
CrossAxisAlignment.start,
children: [
Expanded(
child: Text(
headings[j],
style: TextStyle(
fontFamily: "JakartaMedium",
fontSize: 14,
color: AppColors.semi_black,
),
),
),
Expanded(
child: Text(
subHeadings[j]!,
style: TextStyle(
fontSize: 14,
color: Color(0xFF818181),
),
),
),
],
),
);
}),
InkResponse(
onTap: () async {
Navigator.push(
context,
MaterialPageRoute(
builder:
(context) =>
ProspectDetailsByMode(
pageTitleName:
widget
.pageTitleName,
mode: widget.mode,
leadId:provider.accountList[index].aid,
),
),
);
},
child: Container(
padding: EdgeInsets.symmetric(
vertical: 5,
),
child: Row(
crossAxisAlignment:
CrossAxisAlignment.center,
mainAxisAlignment:
MainAxisAlignment.start,
children: [
Text(
"View Details",
style: TextStyle(
fontFamily: "JakartaMedium",
fontSize: 14,
color: AppColors.app_blue,
),
),
SizedBox(width: 5),
SvgPicture.asset(
"assets/svg/next_button.svg",
),
],
),
),
),
],
),
);
},
),
),
)
:
Emptywidget(context),)
),
);
},
);
}
Future<void> _showFilterSheet(BuildContext context) {
return showModalBottomSheet(
useSafeArea: true,
isDismissible: true,
isScrollControlled: true,
showDragHandle: true,
backgroundColor: Colors.white,
enableDrag: true,
context: context,
builder: (context) {
return StatefulBuilder(
builder: (context, setState) {
return SafeArea(
child: Consumer<ProspectListProvider>(
builder: (context, provider, child) {
return Container(
margin: EdgeInsets.only(
bottom: 15,
left: 15,
right: 15,
top: 10,
),
child: SingleChildScrollView(
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
mainAxisSize: MainAxisSize.min,
children: [
SizedBox(height: 15),
Row(
children: [
Expanded(
child: Text(
"Filter",
style: TextStyle(
color: AppColors.app_blue,
fontSize: 14,
),
),
),
],
),
if(widget.mode!="executive")...[
TextWidget(context, "Employee"),
DropdownButtonHideUnderline(
child: Row(
children: [
Expanded(
child: DropdownButton2<Employees>(
hint: Text(
"Select Source",
style: TextStyle(fontSize: 14),
),
items:
provider.employeesList
.map(
(slist) =>
DropdownMenuItem<Employees>(
value: slist,
child: Text(
slist.name!,
style: TextStyle(
fontSize: 14,
),
),
),
)
.toList(),
value:provider.employeesList.contains(provider.selectedEmployees)
? provider.selectedEmployees
: null,
// value: provider.selectedEmployees,
onChanged: (Employees? value) {
if (value != null) {
if(provider.employeesList.isNotEmpty){
provider.selectedEmployees = value;
provider.selectedEmployeeId = value!.id!;
provider.selectedEmployeeValue = value!.name!;
}
}
},
isExpanded: true,
buttonStyleData: ddtheme.buttonStyleData,
iconStyleData: ddtheme.iconStyleData,
menuItemStyleData: ddtheme.menuItemStyleData,
dropdownStyleData: ddtheme.dropdownStyleData,
),
),
],
),
),
],
textControllerWidget(
context,
provider.mobileNumberController,
"Mobile Number",
provider.onChangedMobileNum,
TextInputType.number,
false,
FilteringTextInputFormatter.digitsOnly,
),
textControllerWidget(
context,
provider.companyNameController,
"Company Name",
provider.onChangedCompanyName,
TextInputType.text,
false,
null,
),
InkResponse(
onTap: () {
provider.crmProspectListAPIFunction(context,widget.mode, provider.selectedEmployeeId);
Navigator.pop(context);
},
child: Container(
height: 45,
alignment: Alignment.center,
margin: EdgeInsets.symmetric(horizontal: 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,
),
),
),
)
],
),
),
);
},
),
);
},
);
},
);
}
}
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