From 6b5808543495e97ef08035de7d4bf97dbcc97538 Mon Sep 17 00:00:00 2001 From: Manish Date: Mon, 24 Nov 2025 15:00:52 +0530 Subject: [PATCH] reenhancement of employee selector --- .../expense/add_expense_controller.dart | 15 ++++- .../expense/add_expense_bottom_sheet.dart | 60 ++++++++++++------- 2 files changed, 52 insertions(+), 23 deletions(-) diff --git a/lib/controller/expense/add_expense_controller.dart b/lib/controller/expense/add_expense_controller.dart index 32e53fd..efdc423 100644 --- a/lib/controller/expense/add_expense_controller.dart +++ b/lib/controller/expense/add_expense_controller.dart @@ -1,5 +1,6 @@ import 'dart:convert'; import 'dart:io'; +import 'dart:async'; import 'package:file_picker/file_picker.dart'; import 'package:flutter/material.dart'; @@ -50,10 +51,22 @@ class AddExpenseController extends GetxController { final isEditMode = false.obs; final isSearchingEmployees = false.obs; +// --- Paid By (Single + Multi Selection Support) --- + +// single selection + final selectedPaidBy = Rxn(); + + + +// helper setters + void setSelectedPaidBy(EmployeeModel? emp) { + selectedPaidBy.value = emp; + } + // --- Dropdown Selections & Data --- final selectedPaymentMode = Rxn(); final selectedExpenseType = Rxn(); - final selectedPaidBy = Rxn(); + // final selectedPaidBy = Rxn(); final selectedProject = ''.obs; final selectedTransactionDate = Rxn(); diff --git a/lib/model/expense/add_expense_bottom_sheet.dart b/lib/model/expense/add_expense_bottom_sheet.dart index 1f6711a..5aa2984 100644 --- a/lib/model/expense/add_expense_bottom_sheet.dart +++ b/lib/model/expense/add_expense_bottom_sheet.dart @@ -5,13 +5,14 @@ import 'package:on_field_work/controller/expense/add_expense_controller.dart'; import 'package:on_field_work/helpers/utils/mixins/ui_mixin.dart'; import 'package:on_field_work/model/expense/expense_type_model.dart'; import 'package:on_field_work/model/expense/payment_types_model.dart'; -import 'package:on_field_work/model/expense/employee_selector_bottom_sheet.dart'; import 'package:on_field_work/helpers/utils/base_bottom_sheet.dart'; import 'package:on_field_work/helpers/utils/validators.dart'; import 'package:on_field_work/helpers/widgets/my_spacing.dart'; import 'package:on_field_work/helpers/widgets/my_snackbar.dart'; import 'package:on_field_work/helpers/widgets/my_confirmation_dialog.dart'; import 'package:on_field_work/helpers/widgets/expense/expense_form_widgets.dart'; +import 'package:on_field_work/model/employees/employee_model.dart'; +import 'package:on_field_work/model/employees/multiple_select_bottomsheet.dart'; /// Show bottom sheet wrapper Future showAddExpenseBottomSheet({ @@ -52,24 +53,36 @@ class _AddExpenseBottomSheetState extends State<_AddExpenseBottomSheet> /// Show employee list Future _showEmployeeList() async { - await showModalBottomSheet( + final result = await showModalBottomSheet( context: context, isScrollControlled: true, backgroundColor: Colors.transparent, shape: const RoundedRectangleBorder( borderRadius: BorderRadius.vertical(top: Radius.circular(16)), ), - builder: (_) => ReusableEmployeeSelectorBottomSheet( - searchController: controller.employeeSearchController, - searchResults: controller.employeeSearchResults, - isSearching: controller.isSearchingEmployees, - onSearch: controller.searchEmployees, - onSelect: (emp) => controller.selectedPaidBy.value = emp, + builder: (_) => EmployeeSelectionBottomSheet( + initiallySelected: controller.selectedPaidBy.value != null + ? [controller.selectedPaidBy.value!] + : [], + multipleSelection: false, + title: "Select Paid By", ), ); - controller.employeeSearchController.clear(); - controller.employeeSearchResults.clear(); + if (result == null) return; + + // result will be EmployeeModel or [EmployeeModel] + if (result is EmployeeModel) { + controller.setSelectedPaidBy(result); + } else if (result is List && result.isNotEmpty) { + controller.setSelectedPaidBy(result.first as EmployeeModel); + } + + // cleanup + try { + controller.employeeSearchController.clear(); + controller.employeeSearchResults.clear(); + } catch (_) {} } /// Generic option list @@ -343,23 +356,26 @@ class _AddExpenseBottomSheetState extends State<_AddExpenseBottomSheet> const SectionTitle( icon: Icons.person_outline, title: "Paid By", requiredField: true), MySpacing.height(6), + // Main tile: tap to choose mode + selection sheet GestureDetector( onTap: _showEmployeeList, child: TileContainer( - child: Row( - mainAxisAlignment: MainAxisAlignment.spaceBetween, - children: [ - Text( - controller.selectedPaidBy.value == null - ? "Select Paid By" - : '${controller.selectedPaidBy.value?.firstName ?? ''} ${controller.selectedPaidBy.value?.lastName ?? ''}', - style: const TextStyle(fontSize: 14), + child: Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Expanded( + child: Text( + controller.selectedPaidBy.value?.name ?? "Select Paid By", + style: TextStyle(fontSize: 15), + overflow: TextOverflow.ellipsis, ), - const Icon(Icons.arrow_drop_down, size: 22), - ], - ), - ), + ), + Icon(Icons.arrow_drop_down, size: 22), + ], + )), ), + // small helper: long-press to quickly open multi-select directly (optional) + const SizedBox(height: 6), ], ); }