feat(bucket): add search functionality to Manage Buckets screen

This commit is contained in:
Vaibhav Surve 2025-07-15 10:52:36 +05:30
parent f9ab336eb0
commit 9c28dc05dd

View File

@ -23,7 +23,17 @@ class _ManageBucketsScreenState extends State<ManageBucketsScreen> {
final ManageBucketController manageBucketController = final ManageBucketController manageBucketController =
Get.put(ManageBucketController()); Get.put(ManageBucketController());
final ProjectController projectController = Get.find(); final ProjectController projectController = Get.find();
final Map<String, bool> _expandedMap = {}; final Map<String, bool> _expandedMap = {};
final TextEditingController searchController = TextEditingController();
String searchText = '';
void _clearSearch() {
searchController.clear();
setState(() {
searchText = '';
});
}
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
@ -55,8 +65,7 @@ class _ManageBucketsScreenState extends State<ManageBucketsScreen> {
MyText.titleLarge('Manage Buckets', MyText.titleLarge('Manage Buckets',
fontWeight: 700, color: Colors.black), fontWeight: 700, color: Colors.black),
MySpacing.height(2), MySpacing.height(2),
GetBuilder<ProjectController>( GetBuilder<ProjectController>(builder: (_) {
builder: (_) {
final projectName = final projectName =
projectController.selectedProject?.name ?? projectController.selectedProject?.name ??
'Select Project'; 'Select Project';
@ -75,18 +84,63 @@ class _ManageBucketsScreenState extends State<ManageBucketsScreen> {
), ),
], ],
); );
}),
],
),
),
],
),
),
),
),
body: Column(
children: [
Padding(
padding: MySpacing.xy(16, 12),
child: SizedBox(
height: 38,
child: TextField(
controller: searchController,
onChanged: (value) {
setState(() {
searchText = value.toLowerCase();
});
}, },
decoration: InputDecoration(
contentPadding:
const EdgeInsets.symmetric(horizontal: 12, vertical: 0),
prefixIcon: const Icon(Icons.search,
size: 18, color: Colors.grey),
suffixIcon: searchText.isNotEmpty
? IconButton(
icon: const Icon(Icons.close, color: Colors.grey),
onPressed: _clearSearch,
)
: null,
hintText: 'Search buckets...',
filled: true,
fillColor: Colors.white,
border: OutlineInputBorder(
borderRadius: BorderRadius.circular(10),
borderSide: BorderSide(color: Colors.grey.shade300),
), ),
], enabledBorder: OutlineInputBorder(
), borderRadius: BorderRadius.circular(10),
), borderSide: BorderSide(color: Colors.grey.shade300),
],
), ),
), ),
), ),
), ),
body: Obx(() { ),
final buckets = directoryController.contactBuckets; Expanded(
child: Obx(() {
final buckets = directoryController.contactBuckets.where((bucket) {
return bucket.name.toLowerCase().contains(searchText) ||
bucket.description.toLowerCase().contains(searchText) ||
bucket.numberOfContacts
.toString()
.contains(searchText);
}).toList();
if (directoryController.isLoading.value || if (directoryController.isLoading.value ||
manageBucketController.isLoading.value) { manageBucketController.isLoading.value) {
@ -108,19 +162,18 @@ class _ManageBucketsScreenState extends State<ManageBucketsScreen> {
} }
return ListView.separated( return ListView.separated(
padding: MySpacing.fromLTRB(16, 20, 16, 24), padding: MySpacing.fromLTRB(16, 0, 16, 24),
itemCount: buckets.length, itemCount: buckets.length,
separatorBuilder: (_, __) => MySpacing.height(16), separatorBuilder: (_, __) => MySpacing.height(16),
itemBuilder: (context, index) { itemBuilder: (context, index) {
final bucket = buckets[index]; final bucket = buckets[index];
final isOwner = final isOwner = currentUserId != null &&
currentUserId != null && bucket.createdBy.id == currentUserId; bucket.createdBy.id == currentUserId;
final canEdit = isOwner || final canEdit = isOwner ||
widget.permissionController widget.permissionController
.hasPermission(Permissions.directoryAdmin) || .hasPermission(Permissions.directoryAdmin) ||
widget.permissionController widget.permissionController
.hasPermission(Permissions.directoryManager); .hasPermission(Permissions.directoryManager);
final isExpanded = _expandedMap[bucket.id] ?? false; final isExpanded = _expandedMap[bucket.id] ?? false;
return Row( return Row(
@ -128,8 +181,8 @@ class _ManageBucketsScreenState extends State<ManageBucketsScreen> {
children: [ children: [
const Padding( const Padding(
padding: EdgeInsets.only(top: 4), padding: EdgeInsets.only(top: 4),
child: child: Icon(Icons.label_outline,
Icon(Icons.label_outline, size: 26, color: Colors.indigo), size: 26, color: Colors.indigo),
), ),
MySpacing.width(12), MySpacing.width(12),
Expanded( Expanded(
@ -153,10 +206,11 @@ class _ManageBucketsScreenState extends State<ManageBucketsScreen> {
padding: EdgeInsets.zero, padding: EdgeInsets.zero,
constraints: const BoxConstraints(), constraints: const BoxConstraints(),
onPressed: () { onPressed: () {
final matchedEmployees = manageBucketController final matchedEmployees =
.allEmployees manageBucketController.allEmployees
.where((emp) => .where((emp) =>
bucket.employeeIds.contains(emp.id)) bucket.employeeIds
.contains(emp.id))
.toList(); .toList();
TeamMembersBottomSheet.show( TeamMembersBottomSheet.show(
context, matchedEmployees); context, matchedEmployees);
@ -178,10 +232,11 @@ class _ManageBucketsScreenState extends State<ManageBucketsScreen> {
MySpacing.width(12), MySpacing.width(12),
GestureDetector( GestureDetector(
onTap: () { onTap: () {
final matchedEmployees = manageBucketController final matchedEmployees =
.allEmployees manageBucketController.allEmployees
.where((emp) => .where((emp) =>
bucket.employeeIds.contains(emp.id)) bucket.employeeIds
.contains(emp.id))
.toList(); .toList();
TeamMembersBottomSheet.show( TeamMembersBottomSheet.show(
context, matchedEmployees); context, matchedEmployees);
@ -222,7 +277,8 @@ class _ManageBucketsScreenState extends State<ManageBucketsScreen> {
final hasOverflow = tp.didExceedMaxLines; final hasOverflow = tp.didExceedMaxLines;
return Column( return Column(
crossAxisAlignment: CrossAxisAlignment.start, crossAxisAlignment:
CrossAxisAlignment.start,
children: [ children: [
MyText.bodySmall( MyText.bodySmall(
bucket.description, bucket.description,
@ -236,11 +292,13 @@ class _ManageBucketsScreenState extends State<ManageBucketsScreen> {
GestureDetector( GestureDetector(
onTap: () { onTap: () {
setState(() { setState(() {
_expandedMap[bucket.id] = !isExpanded; _expandedMap[bucket.id] =
!isExpanded;
}); });
}, },
child: Padding( child: Padding(
padding: const EdgeInsets.only(top: 4), padding: const EdgeInsets.only(
top: 4),
child: MyText.labelSmall( child: MyText.labelSmall(
isExpanded isExpanded
? "Show less" ? "Show less"
@ -263,6 +321,9 @@ class _ManageBucketsScreenState extends State<ManageBucketsScreen> {
}, },
); );
}), }),
),
],
),
); );
} }
} }