From 1ad089c36fbefaf47ca1cd4c38e2965b264db005 Mon Sep 17 00:00:00 2001 From: Yasien Mac Mini Date: Thu, 31 Jul 2025 14:59:56 +0200 Subject: [PATCH] fix search text alignemnt --- .../package_tools/mih_search_mzansi.dart | 218 ++++++++++++++---- 1 file changed, 173 insertions(+), 45 deletions(-) diff --git a/Frontend/lib/mih_packages/mzansi_directory/package_tools/mih_search_mzansi.dart b/Frontend/lib/mih_packages/mzansi_directory/package_tools/mih_search_mzansi.dart index 9383a861..d3527ce0 100644 --- a/Frontend/lib/mih_packages/mzansi_directory/package_tools/mih_search_mzansi.dart +++ b/Frontend/lib/mih_packages/mzansi_directory/package_tools/mih_search_mzansi.dart @@ -2,6 +2,8 @@ import 'package:flutter/material.dart'; import 'package:mzansi_innovation_hub/main.dart'; import 'package:mzansi_innovation_hub/mih_components/mih_objects/app_user.dart'; import 'package:mzansi_innovation_hub/mih_components/mih_objects/business.dart'; +import 'package:mzansi_innovation_hub/mih_components/mih_package_components/mih_button.dart'; +import 'package:mzansi_innovation_hub/mih_components/mih_package_components/mih_dropdwn_field.dart'; import 'package:mzansi_innovation_hub/mih_components/mih_package_components/mih_icons.dart'; import 'package:mzansi_innovation_hub/mih_components/mih_package_components/mih_package_tool_body.dart'; import 'package:mzansi_innovation_hub/mih_components/mih_package_components/mih_search_bar.dart'; @@ -9,6 +11,7 @@ import 'package:mzansi_innovation_hub/mih_components/mih_package_components/mih_ import 'package:mzansi_innovation_hub/mih_components/mih_pop_up_messages/mih_loading_circle.dart'; import 'package:mzansi_innovation_hub/mih_packages/mzansi_directory/builders/build_business_search_resultsList.dart'; import 'package:mzansi_innovation_hub/mih_packages/mzansi_directory/builders/build_user_search_results_list.dart'; +import 'package:mzansi_innovation_hub/mih_services/mih_alert_services.dart'; import 'package:mzansi_innovation_hub/mih_services/mih_business_details_services.dart'; import 'package:mzansi_innovation_hub/mih_services/mih_user_services.dart'; @@ -29,12 +32,62 @@ class MihSearchMzansi extends StatefulWidget { class _MihSearchMzansiState extends State { final TextEditingController mzansiSearchController = TextEditingController(); + final TextEditingController businessTypeController = TextEditingController(); final FocusNode searchFocusNode = FocusNode(); late bool userSearch; Future?> futureUserSearchResults = Future.value(); Future?> futureBusinessSearchResults = Future.value(); List userSearchResults = []; List businessSearchResults = []; + late Future> availableBusinessTypes; + bool filterOn = false; + + void swapPressed() { + setState(() { + userSearch = !userSearch; + if (filterOn) { + filterOn = !filterOn; + } + }); + if (businessTypeController.text.isNotEmpty) { + setState(() { + futureBusinessSearchResults = Future.value(); + businessTypeController.clear(); + }); + } + searchPressed(); + } + + void clearAll() { + setState(() { + futureUserSearchResults = Future.value(); + futureBusinessSearchResults = Future.value(); + mzansiSearchController.clear(); + businessSearchResults.clear(); + }); + } + + void searchPressed() { + setState(() { + // userSearch = !userSearch; + if (userSearch && mzansiSearchController.text.isNotEmpty) { + futureUserSearchResults = + MihUserServices().searchUsers(mzansiSearchController.text, context); + } else { + if ( + // mzansiSearchController.text.isNotEmpty && + businessTypeController.text.isNotEmpty) { + futureBusinessSearchResults = MihBusinessDetailsServices() + .searchBusinesses(mzansiSearchController.text, + businessTypeController.text, context); + } else if (mzansiSearchController.text.isNotEmpty) { + futureBusinessSearchResults = MihBusinessDetailsServices() + .searchBusinesses(mzansiSearchController.text, + businessTypeController.text, context); + } + } + }); + } @override void dispose() { @@ -48,12 +101,16 @@ class _MihSearchMzansiState extends State { setState(() { userSearch = widget.personalSearch; mzansiSearchController.text = widget.startUpSearch ?? ""; + // businessTypeController.text = "All"; + availableBusinessTypes = + MihBusinessDetailsServices().fetchAllBusinessTypes(); if (userSearch) { futureUserSearchResults = MihUserServices().searchUsers(mzansiSearchController.text, context); } else { futureBusinessSearchResults = MihBusinessDetailsServices() - .searchBusinesses(mzansiSearchController.text, context); + .searchBusinesses(mzansiSearchController.text, + businessTypeController.text, context); } }); } @@ -74,62 +131,133 @@ class _MihSearchMzansiState extends State { children: [ Padding( padding: EdgeInsets.symmetric(horizontal: width / 20), - child: MihSearchBar( - controller: mzansiSearchController, - hintText: "Search Mzansi", - prefixIcon: Icons.search, - prefixAltIcon: userSearch ? Icons.person : Icons.business, - suffixTools: [ - IconButton( + child: Row( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + Expanded( + child: MihSearchBar( + controller: mzansiSearchController, + hintText: "Search Mzansi", + prefixIcon: Icons.search, + prefixAltIcon: userSearch ? Icons.person : Icons.business, + suffixTools: [ + IconButton( + onPressed: () { + swapPressed(); + }, + icon: Icon( + Icons.swap_horiz_rounded, + size: 35, + color: MzansiInnovationHub.of(context)! + .theme + .primaryColor(), + ), + ), + ], + fillColor: + MzansiInnovationHub.of(context)!.theme.secondaryColor(), + hintColor: + MzansiInnovationHub.of(context)!.theme.primaryColor(), + onPrefixIconTap: () { + searchPressed(); + }, + onClearIconTap: () { + clearAll(); + }, + searchFocusNode: searchFocusNode, + ), + ), + Visibility( + visible: !userSearch, + child: const SizedBox(width: 10), + ), + Visibility( + visible: !userSearch, + child: IconButton( onPressed: () { setState(() { - // searchTypeVisibility = !searchTypeVisibility; - userSearch = !userSearch; - if (userSearch) { - futureUserSearchResults = MihUserServices() - .searchUsers( - mzansiSearchController.text, context); + filterOn = !filterOn; + if (filterOn) { + businessTypeController.text = ""; } else { - futureBusinessSearchResults = - MihBusinessDetailsServices().searchBusinesses( - mzansiSearchController.text, context); + businessTypeController.clear(); } }); }, icon: Icon( - Icons.swap_horiz_rounded, + !filterOn + ? Icons.filter_list_rounded + : Icons.filter_list_off_rounded, size: 35, - color: - MzansiInnovationHub.of(context)!.theme.primaryColor(), - )) + color: MzansiInnovationHub.of(context)! + .theme + .secondaryColor(), + ), + ), + ), ], - fillColor: - MzansiInnovationHub.of(context)!.theme.secondaryColor(), - hintColor: MzansiInnovationHub.of(context)!.theme.primaryColor(), - onPrefixIconTap: () { - if (userSearch) { - setState(() { - futureUserSearchResults = MihUserServices() - .searchUsers(mzansiSearchController.text, context); - }); - } else { - setState(() { - futureBusinessSearchResults = MihBusinessDetailsServices() - .searchBusinesses(mzansiSearchController.text, context); - }); - } - }, - onClearIconTap: () { - setState(() { - futureUserSearchResults = Future.value(); - futureBusinessSearchResults = Future.value(); - mzansiSearchController.clear(); - }); - }, - searchFocusNode: searchFocusNode, ), ), const SizedBox(height: 10), + FutureBuilder( + future: availableBusinessTypes, + builder: (context, asyncSnapshot) { + List options = []; + if (asyncSnapshot.connectionState == ConnectionState.done) { + options.addAll(asyncSnapshot.data!); + } + return Visibility( + visible: filterOn, + child: Padding( + padding: EdgeInsets.symmetric(horizontal: width / 20), + child: Row( + mainAxisAlignment: MainAxisAlignment.center, + crossAxisAlignment: CrossAxisAlignment.end, + children: [ + Expanded( + child: MihDropdownField( + controller: businessTypeController, + hintText: "Business Type Filter", + dropdownOptions: options, + requiredText: true, + editable: true, + enableSearch: true, + ), + ), + const SizedBox(width: 10), + MihButton( + onPressed: () { + if (businessTypeController.text.isNotEmpty) { + searchPressed(); + } else { + MihAlertServices().errorAlert( + "Business Type Not Selected", + "Please ensure you have selected a Business Type before seareching for Businesses of Mzansi", + context, + ); + } + }, + buttonColor: MzansiInnovationHub.of(context)! + .theme + .successColor(), + elevation: 10, + child: Text( + "Search", + style: TextStyle( + color: MzansiInnovationHub.of(context)! + .theme + .primaryColor(), + fontSize: 20, + fontWeight: FontWeight.bold, + ), + ), + ), + ], + ), + ), + ); + }), + const SizedBox(height: 10), displaySearchResults(userSearch, widget.myLocation ?? ""), ], ),