diff --git a/lib/model/dailyTaskPlanning/assign_task_bottom_sheet .dart b/lib/model/dailyTaskPlanning/assign_task_bottom_sheet .dart index 2abbdf9..903dc2d 100644 --- a/lib/model/dailyTaskPlanning/assign_task_bottom_sheet .dart +++ b/lib/model/dailyTaskPlanning/assign_task_bottom_sheet .dart @@ -166,47 +166,45 @@ class _AssignTaskBottomSheetState extends State { GestureDetector( onTap: _openEmployeeSelectionSheet, child: Container( - padding: const EdgeInsets.symmetric(horizontal: 12, vertical: 12), - decoration: BoxDecoration( - border: Border.all(color: Colors.grey.shade300), - borderRadius: BorderRadius.circular(6), - ), - child: Row( - children: [ - const Icon(Icons.group, color: Colors.black54), - const SizedBox(width: 10), + padding: const EdgeInsets.symmetric(horizontal: 12, vertical: 12), + decoration: BoxDecoration( + border: Border.all(color: Colors.grey.shade300), + borderRadius: BorderRadius.circular(6), + ), + child: Row( + children: [ + const Icon(Icons.group, color: Colors.black54), + const SizedBox(width: 10), - // Expanded name area - Expanded( - child: Obx(() { - final count = controller.selectedEmployees.length; - if (count == 0) { - return MyText( - "Select team members", - color: Colors.grey.shade700, - maxLines: 1, - overflow: TextOverflow.ellipsis, - ); - } + // Expanded name area + Expanded( + child: Obx(() { + final count = controller.selectedEmployees.length; + if (count == 0) { + return MyText( + "Select team members", + color: Colors.grey.shade700, + maxLines: 1, + overflow: TextOverflow.ellipsis, + ); + } - final names = controller.selectedEmployees - .map((e) => e.name) - .join(", "); + final names = controller.selectedEmployees + .map((e) => e.name) + .join(", "); - return Text( - names, - maxLines: 2, - overflow: TextOverflow.ellipsis, - style: const TextStyle(fontSize: 14), - ); - }), - ), + return Text( + names, + maxLines: 2, + overflow: TextOverflow.ellipsis, + style: const TextStyle(fontSize: 14), + ); + }), + ), - const Icon(Icons.arrow_drop_down, color: Colors.grey), - ], -) - - ), + const Icon(Icons.arrow_drop_down, color: Colors.grey), + ], + )), ), MySpacing.height(8), @@ -381,7 +379,6 @@ class _AssignTaskBottomSheetState extends State { 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 { ); if (result != null) { - controller.selectedEmployees.assignAll(result); - controller.updateSelectedEmployees(); + controller.selectedEmployees + .assignAll(result); // RxList updates UI automatically } } diff --git a/lib/model/employees/multiple_select_bottomsheet.dart b/lib/model/employees/multiple_select_bottomsheet.dart index 984aeff..f3be00c 100644 --- a/lib/model/employees/multiple_select_bottomsheet.dart +++ b/lib/model/employees/multiple_select_bottomsheet.dart @@ -68,13 +68,18 @@ class _EmployeeSelectionBottomSheetState .toList(); // ------------------------------------------------------ - // 🔥 Auto-move selected employees to top + // Auto-move selected employees to top // ------------------------------------------------------ results.sort((a, b) { - final aSel = _selectedEmployees.contains(a) ? 0 : 1; - final bSel = _selectedEmployees.contains(b) ? 0 : 1; + 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); + if (aSel != bSel) return aSel.compareTo(bSel); + } + + // Otherwise, keep original order (or alphabetically if needed) return a.name.toLowerCase().compareTo(b.name.toLowerCase()); }); diff --git a/lib/model/employees/multiple_select_role_bottomsheet.dart b/lib/model/employees/multiple_select_role_bottomsheet.dart index e317e26..d51f378 100644 --- a/lib/model/employees/multiple_select_role_bottomsheet.dart +++ b/lib/model/employees/multiple_select_role_bottomsheet.dart @@ -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((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,