UI enhancement

This commit is contained in:
Manish 2025-11-21 17:36:56 +05:30
parent 17d1a66e1b
commit 83e1686778
3 changed files with 53 additions and 86 deletions

View File

@ -204,9 +204,7 @@ class _AssignTaskBottomSheetState extends State<AssignTaskBottomSheet> {
const Icon(Icons.arrow_drop_down, color: Colors.grey),
],
)
),
)),
),
MySpacing.height(8),
@ -381,7 +379,6 @@ class _AssignTaskBottomSheetState extends State<AssignTaskBottomSheet> {
color: Colors.white,
borderRadius: BorderRadius.vertical(top: Radius.circular(20)),
),
child: MultipleSelectRoleBottomSheet(
projectId: selectedProjectId!,
organizationId: selectedOrganization?.id,
@ -397,8 +394,8 @@ class _AssignTaskBottomSheetState extends State<AssignTaskBottomSheet> {
);
if (result != null) {
controller.selectedEmployees.assignAll(result);
controller.updateSelectedEmployees();
controller.selectedEmployees
.assignAll(result); // RxList updates UI automatically
}
}

View File

@ -68,13 +68,18 @@ class _EmployeeSelectionBottomSheetState
.toList();
// ------------------------------------------------------
// 🔥 Auto-move selected employees to top
// Auto-move selected employees to top
// ------------------------------------------------------
results.sort((a, b) {
if (widget.multipleSelection) {
// Only move selected employees to top in multi-select
final aSel = _selectedEmployees.contains(a) ? 0 : 1;
final bSel = _selectedEmployees.contains(b) ? 0 : 1;
if (aSel != bSel) return aSel.compareTo(bSel);
}
// Otherwise, keep original order (or alphabetically if needed)
return a.name.toLowerCase().compareTo(b.name.toLowerCase());
});

View File

@ -63,7 +63,6 @@ class _MultipleSelectRoleBottomSheetState
employees.where((emp) => emp.jobRoleID == widget.roleId).toList();
}
// Selected first
employees.sort((a, b) {
final aSel = _selected.any((e) => e.id == a.id) ? 0 : 1;
final bSel = _selected.any((e) => e.id == b.id) ? 0 : 1;
@ -92,7 +91,6 @@ class _MultipleSelectRoleBottomSheetState
);
}
// Selected on top
_filtered.sort((a, b) {
final aSel = _selected.any((e) => e.id == a.id) ? 0 : 1;
final bSel = _selected.any((e) => e.id == b.id) ? 0 : 1;
@ -110,8 +108,8 @@ class _MultipleSelectRoleBottomSheetState
_selected.add(emp);
}
} else {
_selected.assignAll([emp]);
Get.back(result: _selected);
// Single selection return immediately
Get.back(result: [emp]);
}
_onSearch(_searchController.text.trim());
@ -150,49 +148,17 @@ class _MultipleSelectRoleBottomSheetState
),
);
/// NEW Chips showing selected employees
Widget _selectedChips() {
return Obx(() {
if (_selected.isEmpty) return const SizedBox();
return Wrap(
spacing: 8,
runSpacing: 8,
children: _selected.map((emp) {
return Chip(
label: Text(emp.name),
deleteIcon: const Icon(Icons.close),
onDeleted: () {
_selected.remove(emp);
_onSearch(_searchController.text.trim());
},
backgroundColor: Colors.blue.shade50,
);
}).toList(),
);
});
}
@override
Widget build(BuildContext context) {
return BaseBottomSheet(
title: widget.title,
onCancel: () => Get.back(),
onSubmit: () => Get.back(result: _selected),
onSubmit: () => Get.back(result: _selected.toList()), // Return plain list
child: SizedBox(
height: MediaQuery.of(context).size.height * 0.55,
child: Column(
children: [
_searchBar(),
/// Chips shown right below search bar
Padding(
padding: const EdgeInsets.symmetric(horizontal: 8),
child: _selectedChips(),
),
const SizedBox(height: 6),
Expanded(
child: Obx(() {
if (_isLoading.value) {
@ -228,13 +194,12 @@ class _MultipleSelectRoleBottomSheetState
fillColor:
MaterialStateProperty.resolveWith<Color>((states) {
if (states.contains(MaterialState.selected)) {
return Colors.blueAccent; // Selected color
return Colors.blueAccent;
}
return Colors.white; // Unselected square color
return Colors.white;
}),
checkColor: Colors.white, // Check mark color
side: const BorderSide(
color: Colors.grey), // Outline for unselected
checkColor: Colors.white,
side: const BorderSide(color: Colors.grey),
),
contentPadding: const EdgeInsets.symmetric(
horizontal: 4,