Skip to content
GitLab
Menu
Projects
Groups
Snippets
Loading...
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Sign in / Register
Toggle navigation
Menu
Open sidebar
Sai Srinivas
GEN_ERP_2025
Commits
a6df6bb5
Commit
a6df6bb5
authored
Jun 26, 2025
by
Sai Srinivas
Browse files
23-06-2025 By Sai Srinivas
CRM Module - Prospect List and Filter.
parent
fb928cfe
Changes
4
Hide whitespace changes
Inline
Side-by-side
lib/Models/crmModels/ProspectListViewResponse.dart
0 → 100644
View file @
a6df6bb5
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
;
}
}
lib/Models/crmModels/SubmitProspectListFilterResponse.dart
0 → 100644
View file @
a6df6bb5
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
;
}
}
lib/Notifiers/crmProvider/ProspectListProvider.dart
0 → 100644
View file @
a6df6bb5
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
();
}
}
lib/screens/crm/ProspectListByMode.dart
0 → 100644
View file @
a6df6bb5
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
,
),
),
),
)
],
),
),
);
},
),
);
},
);
},
);
}
}
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
.
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment