diff --git a/lib/controller/directory/add_contact_controller.dart b/lib/controller/directory/add_contact_controller.dart index d5b9d91..d3fdb92 100644 --- a/lib/controller/directory/add_contact_controller.dart +++ b/lib/controller/directory/add_contact_controller.dart @@ -94,8 +94,9 @@ class AddContactController extends GetxController { required List> phones, required String address, required String description, + String? designation, }) async { - if (isSubmitting.value) return; + if (isSubmitting.value) return; isSubmitting.value = true; final categoryId = categoriesMap[selectedCategory.value]; @@ -156,6 +157,8 @@ class AddContactController extends GetxController { if (phones.isNotEmpty) "contactPhones": phones, if (address.trim().isNotEmpty) "address": address.trim(), if (description.trim().isNotEmpty) "description": description.trim(), + if (designation != null && designation.trim().isNotEmpty) + "designation": designation.trim(), }; logSafe("${id != null ? 'Updating' : 'Creating'} contact"); diff --git a/lib/model/directory/add_contact_bottom_sheet.dart b/lib/model/directory/add_contact_bottom_sheet.dart index 943ac2e..02e400a 100644 --- a/lib/model/directory/add_contact_bottom_sheet.dart +++ b/lib/model/directory/add_contact_bottom_sheet.dart @@ -24,6 +24,7 @@ class _AddContactBottomSheetState extends State { final nameCtrl = TextEditingController(); final orgCtrl = TextEditingController(); + final designationCtrl = TextEditingController(); final addrCtrl = TextEditingController(); final descCtrl = TextEditingController(); final tagCtrl = TextEditingController(); @@ -49,6 +50,7 @@ class _AddContactBottomSheetState extends State { if (c != null) { nameCtrl.text = c.name; orgCtrl.text = c.organization; + designationCtrl.text = c.designation ?? ''; addrCtrl.text = c.address; descCtrl.text = c.description; @@ -109,6 +111,7 @@ class _AddContactBottomSheetState extends State { void dispose() { nameCtrl.dispose(); orgCtrl.dispose(); + designationCtrl.dispose(); addrCtrl.dispose(); descCtrl.dispose(); tagCtrl.dispose(); @@ -118,6 +121,20 @@ class _AddContactBottomSheetState extends State { super.dispose(); } + Widget _labelWithStar(String label, {bool required = false}) { + return Row( + mainAxisSize: MainAxisSize.min, + children: [ + MyText.labelMedium(label), + if (required) + const Text( + " *", + style: TextStyle(color: Colors.red, fontSize: 14), + ), + ], + ); + } + InputDecoration _inputDecoration(String hint) => InputDecoration( hintText: hint, hintStyle: MyTextStyle.bodySmall(xMuted: true), @@ -145,7 +162,7 @@ class _AddContactBottomSheetState extends State { return Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ - MyText.labelMedium(label), + _labelWithStar(label, required: required), MySpacing.height(8), TextFormField( controller: ctrl, @@ -386,6 +403,7 @@ class _AddContactBottomSheetState extends State { phones: phones, address: addrCtrl.text.trim(), description: descCtrl.text.trim(), + designation: designationCtrl.text.trim(), ); } @@ -412,7 +430,7 @@ class _AddContactBottomSheetState extends State { MySpacing.height(16), _textField("Organization", orgCtrl, required: true), MySpacing.height(16), - MyText.labelMedium(" Bucket"), + _labelWithStar("Bucket", required: true), MySpacing.height(8), Stack( children: [ @@ -477,19 +495,62 @@ class _AddContactBottomSheetState extends State { icon: const Icon(Icons.add), label: const Text("Add Phone"), ), - MySpacing.height(16), - MyText.labelMedium("Category"), - MySpacing.height(8), - _popupSelector(controller.selectedCategory, - controller.categories, "Choose Category"), - MySpacing.height(16), - MyText.labelMedium("Tags"), - MySpacing.height(8), - _tagInput(), - MySpacing.height(16), - _textField("Address", addrCtrl), - MySpacing.height(16), - _textField("Description", descCtrl), + Obx(() => showAdvanced.value + ? Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + // ✅ Move Designation field here + _textField("Designation", designationCtrl), + MySpacing.height(16), + + _dynamicList( + emailCtrls, + emailLabels, + "Email", + ["Office", "Personal", "Other"], + TextInputType.emailAddress, + ), + TextButton.icon( + onPressed: () { + emailCtrls.add(TextEditingController()); + emailLabels.add("Office".obs); + }, + icon: const Icon(Icons.add), + label: const Text("Add Email"), + ), + _dynamicList( + phoneCtrls, + phoneLabels, + "Phone", + ["Work", "Mobile", "Other"], + TextInputType.phone, + ), + TextButton.icon( + onPressed: () { + phoneCtrls.add(TextEditingController()); + phoneLabels.add("Work".obs); + }, + icon: const Icon(Icons.add), + label: const Text("Add Phone"), + ), + MyText.labelMedium("Category"), + MySpacing.height(8), + _popupSelector( + controller.selectedCategory, + controller.categories, + "Choose Category", + ), + MySpacing.height(16), + MyText.labelMedium("Tags"), + MySpacing.height(8), + _tagInput(), + MySpacing.height(16), + _textField("Address", addrCtrl), + MySpacing.height(16), + _textField("Description", descCtrl), + ], + ) + : const SizedBox.shrink()), ], ) : const SizedBox.shrink()), diff --git a/lib/model/directory/contact_model.dart b/lib/model/directory/contact_model.dart index e03e61b..16f39cd 100644 --- a/lib/model/directory/contact_model.dart +++ b/lib/model/directory/contact_model.dart @@ -2,6 +2,7 @@ class ContactModel { final String id; final List? projectIds; final String name; + final String? designation; final List contactPhones; final List contactEmails; final ContactCategory? contactCategory; @@ -15,6 +16,7 @@ class ContactModel { required this.id, required this.projectIds, required this.name, + this.designation, required this.contactPhones, required this.contactEmails, required this.contactCategory, @@ -30,6 +32,7 @@ class ContactModel { id: json['id'], projectIds: (json['projectIds'] as List?)?.map((e) => e as String).toList(), name: json['name'], + designation: json['designation'], contactPhones: (json['contactPhones'] as List) .map((e) => ContactPhone.fromJson(e)) .toList(), @@ -48,6 +51,7 @@ class ContactModel { } } + class ContactPhone { final String id; final String label;