From e9b97a4e1121260c24d04a9909ac8456bd7c8f8c Mon Sep 17 00:00:00 2001 From: Yasien Mac Mini Date: Mon, 2 Jun 2025 10:33:34 +0200 Subject: [PATCH 1/5] Ask Mzansi Activates chat --- .../mih_search_bar.dart | 4 + Frontend/lib/mih_objects/arguments.dart | 10 ++ .../mih_home/mih_home_legacy.dart | 10 +- .../package_tools/mih_business_home.dart | 119 ++++++++++------- .../package_tools/mih_personal_home.dart | 121 +++++++++++------- .../lib/mih_packages/mzansi_ai/mzansi_ai.dart | 15 ++- .../package_tiles/mzansi_ai_tile.dart | 6 +- .../mzansi_ai/package_tools/ai_chat.dart | 8 ++ Frontend/lib/mih_router/routeGenerator.dart | 4 +- 9 files changed, 197 insertions(+), 100 deletions(-) diff --git a/Frontend/lib/mih_components/mih_package_components/mih_search_bar.dart b/Frontend/lib/mih_components/mih_package_components/mih_search_bar.dart index 0be979f2..ab47262f 100644 --- a/Frontend/lib/mih_components/mih_package_components/mih_search_bar.dart +++ b/Frontend/lib/mih_components/mih_package_components/mih_search_bar.dart @@ -124,6 +124,10 @@ class _MihSearchBarState extends State { child: TextField( controller: widget.controller, // Assign the controller focusNode: widget.searchFocusNode, + onSubmitted: (value) { + widget.onPrefixIconTap + ?.call(); // Call the prefix icon tap handler + }, style: TextStyle( color: widget.hintColor, fontWeight: FontWeight.w600, diff --git a/Frontend/lib/mih_objects/arguments.dart b/Frontend/lib/mih_objects/arguments.dart index 0f67f2c2..49cf9a18 100644 --- a/Frontend/lib/mih_objects/arguments.dart +++ b/Frontend/lib/mih_objects/arguments.dart @@ -207,3 +207,13 @@ class WalletArguments { this.index, ); } + +class MzansiAiArguments { + final AppUser signedInUser; + final String? startUpQuestion; + + MzansiAiArguments( + this.signedInUser, + this.startUpQuestion, + ); +} diff --git a/Frontend/lib/mih_packages/mih_home/mih_home_legacy.dart b/Frontend/lib/mih_packages/mih_home/mih_home_legacy.dart index 940aa5a4..1e3a417c 100644 --- a/Frontend/lib/mih_packages/mih_home/mih_home_legacy.dart +++ b/Frontend/lib/mih_packages/mih_home/mih_home_legacy.dart @@ -229,7 +229,10 @@ class _MIHHomeLegacyState extends State { onTap: () { Navigator.of(context).pushNamed( '/mzansi-ai', - arguments: widget.signedInUser, + arguments: MzansiAiArguments( + widget.signedInUser, + "", + ), ); }, tileName: "Mzansi AI", @@ -464,7 +467,10 @@ class _MIHHomeLegacyState extends State { onTap: () { Navigator.of(context).pushNamed( '/mzansi-ai', - arguments: widget.signedInUser, + arguments: MzansiAiArguments( + widget.signedInUser, + "", + ), ); }, tileName: "Mzansi AI", diff --git a/Frontend/lib/mih_packages/mih_home/package_tools/mih_business_home.dart b/Frontend/lib/mih_packages/mih_home/package_tools/mih_business_home.dart index 26cf0922..b91f9314 100644 --- a/Frontend/lib/mih_packages/mih_home/package_tools/mih_business_home.dart +++ b/Frontend/lib/mih_packages/mih_home/package_tools/mih_business_home.dart @@ -1,3 +1,4 @@ +import 'package:flutter/services.dart'; import 'package:mzansi_innovation_hub/main.dart'; import 'package:mzansi_innovation_hub/mih_components/mih_layout/mih_single_child_scroll.dart'; import 'package:mzansi_innovation_hub/mih_components/mih_package_components/mih_icons.dart'; @@ -45,6 +46,7 @@ class _MihBusinessHomeState extends State late final AnimationController _marqueeController; late final ScrollController _scrollController; final FocusNode _searchFocusNode = FocusNode(); + final FocusNode _focusNode = FocusNode(); final String maintenanceMsg = "\tHeads up! We're doing maintenance on Thur, 15 May 2025 at 10 PM (CAT). MIH may be unavailable briefly."; @@ -202,52 +204,79 @@ class _MihBusinessHomeState extends State Widget getBody(double width, double height) { return MihSingleChildScroll( - child: Column( - children: [ - const SizedBox(height: 10), - Padding( - padding: EdgeInsets.symmetric(horizontal: width / 20), - child: MihSearchBar( - controller: searchController, - hintText: "Ask Mzansi", - prefixIcon: Icons.search, - prefixAltIcon: MihIcons.mzansiAi, - fillColor: - MzanziInnovationHub.of(context)!.theme.secondaryColor(), - hintColor: MzanziInnovationHub.of(context)!.theme.primaryColor(), - onPrefixIconTap: () { - print("Search Text: ${searchController.text}"); - }, - searchFocusNode: _searchFocusNode, - ), - ), - const SizedBox(height: 10), - ValueListenableBuilder( - valueListenable: searchPackageName, - builder: (context, value, child) { - List filteredPackages = value - .where((package) => package.keys.first - .toLowerCase() - .contains(searchController.text.toLowerCase())) - .map((package) => package.values.first) - .toList(); - return GridView.builder( - physics: const NeverScrollableScrollPhysics(), - shrinkWrap: true, - padding: getPadding(width, height), - // shrinkWrap: true, - itemCount: filteredPackages.length, - gridDelegate: SliverGridDelegateWithMaxCrossAxisExtent( - maxCrossAxisExtent: packageSize, - crossAxisSpacing: 5, - ), - itemBuilder: (context, index) { - return filteredPackages[index]; + child: KeyboardListener( + focusNode: _focusNode, + autofocus: true, + onKeyEvent: (event) async { + if (event is KeyDownEvent && + event.logicalKey == LogicalKeyboardKey.enter) { + Navigator.of(context).pushNamed( + '/mzansi-ai', + arguments: MzansiAiArguments( + widget.signedInUser, + searchController.text.isEmpty ? null : searchController.text, + ), + ); + searchController.clear(); + } + }, + child: Column( + children: [ + const SizedBox(height: 10), + Padding( + padding: EdgeInsets.symmetric(horizontal: width / 20), + child: MihSearchBar( + controller: searchController, + hintText: "Ask Mzansi", + prefixIcon: Icons.search, + prefixAltIcon: MihIcons.mzansiAi, + fillColor: + MzanziInnovationHub.of(context)!.theme.secondaryColor(), + hintColor: + MzanziInnovationHub.of(context)!.theme.primaryColor(), + onPrefixIconTap: () { + Navigator.of(context).pushNamed( + '/mzansi-ai', + arguments: MzansiAiArguments( + widget.signedInUser, + searchController.text.isEmpty + ? null + : searchController.text, + ), + ); + searchController.clear(); }, - ); - }, - ), - ], + searchFocusNode: _searchFocusNode, + ), + ), + const SizedBox(height: 10), + ValueListenableBuilder( + valueListenable: searchPackageName, + builder: (context, value, child) { + List filteredPackages = value + .where((package) => package.keys.first + .toLowerCase() + .contains(searchController.text.toLowerCase())) + .map((package) => package.values.first) + .toList(); + return GridView.builder( + physics: const NeverScrollableScrollPhysics(), + shrinkWrap: true, + padding: getPadding(width, height), + // shrinkWrap: true, + itemCount: filteredPackages.length, + gridDelegate: SliverGridDelegateWithMaxCrossAxisExtent( + maxCrossAxisExtent: packageSize, + crossAxisSpacing: 5, + ), + itemBuilder: (context, index) { + return filteredPackages[index]; + }, + ); + }, + ), + ], + ), ), ); } diff --git a/Frontend/lib/mih_packages/mih_home/package_tools/mih_personal_home.dart b/Frontend/lib/mih_packages/mih_home/package_tools/mih_personal_home.dart index 8da7e898..86a9b2a6 100644 --- a/Frontend/lib/mih_packages/mih_home/package_tools/mih_personal_home.dart +++ b/Frontend/lib/mih_packages/mih_home/package_tools/mih_personal_home.dart @@ -1,3 +1,4 @@ +import 'package:flutter/services.dart'; import 'package:mzansi_innovation_hub/main.dart'; import 'package:mzansi_innovation_hub/mih_components/mih_layout/mih_single_child_scroll.dart'; import 'package:mzansi_innovation_hub/mih_components/mih_package_components/mih_icons.dart'; @@ -53,6 +54,7 @@ class _MihPersonalHomeState extends State late final AnimationController _marqueeController; late final ScrollController _scrollController; final FocusNode _searchFocusNode = FocusNode(); + final FocusNode _focusNode = FocusNode(); final String maintenanceMsg = "\tHeads up! We're doing maintenance on Thur, 15 May 2025 at 10 PM (CAT). MIH may be unavailable briefly."; @@ -245,53 +247,80 @@ class _MihPersonalHomeState extends State Widget getBody(double width, double height) { return MihSingleChildScroll( - child: Column( - children: [ - const SizedBox(height: 10), - Padding( - padding: EdgeInsets.symmetric(horizontal: width / 20), - child: MihSearchBar( - controller: searchController, - hintText: "Ask Mzansi", - prefixIcon: Icons.search, - prefixAltIcon: MihIcons.mzansiAi, - fillColor: - MzanziInnovationHub.of(context)!.theme.secondaryColor(), - hintColor: MzanziInnovationHub.of(context)!.theme.primaryColor(), - onPrefixIconTap: () { - print("Search Text: ${searchController.text}"); - }, - searchFocusNode: _searchFocusNode, - ), - ), - const SizedBox(height: 10), - ValueListenableBuilder( - valueListenable: searchPackageName, - builder: (context, value, child) { - List filteredPackages = value - .where((package) => package.keys.first - .toLowerCase() - .contains(searchController.text.toLowerCase())) - .map((package) => package.values.first) - .toList(); - return GridView.builder( - physics: const NeverScrollableScrollPhysics(), - shrinkWrap: true, - padding: getPadding(width, height), - // shrinkWrap: true, - itemCount: filteredPackages.length, - gridDelegate: SliverGridDelegateWithMaxCrossAxisExtent( - maxCrossAxisExtent: packageSize, - crossAxisSpacing: 5, - ), - itemBuilder: (context, index) { - return filteredPackages[index]; - // return personalPackages[index]; + child: KeyboardListener( + focusNode: _focusNode, + autofocus: true, + onKeyEvent: (event) async { + if (event is KeyDownEvent && + event.logicalKey == LogicalKeyboardKey.enter) { + Navigator.of(context).pushNamed( + '/mzansi-ai', + arguments: MzansiAiArguments( + widget.signedInUser, + searchController.text.isEmpty ? null : searchController.text, + ), + ); + searchController.clear(); + } + }, + child: Column( + children: [ + const SizedBox(height: 10), + Padding( + padding: EdgeInsets.symmetric(horizontal: width / 20), + child: MihSearchBar( + controller: searchController, + hintText: "Ask Mzansi", + prefixIcon: Icons.search, + prefixAltIcon: MihIcons.mzansiAi, + fillColor: + MzanziInnovationHub.of(context)!.theme.secondaryColor(), + hintColor: + MzanziInnovationHub.of(context)!.theme.primaryColor(), + onPrefixIconTap: () { + Navigator.of(context).pushNamed( + '/mzansi-ai', + arguments: MzansiAiArguments( + widget.signedInUser, + searchController.text.isEmpty + ? null + : searchController.text, + ), + ); + searchController.clear(); }, - ); - }, - ), - ], + searchFocusNode: _searchFocusNode, + ), + ), + const SizedBox(height: 10), + ValueListenableBuilder( + valueListenable: searchPackageName, + builder: (context, value, child) { + List filteredPackages = value + .where((package) => package.keys.first + .toLowerCase() + .contains(searchController.text.toLowerCase())) + .map((package) => package.values.first) + .toList(); + return GridView.builder( + physics: const NeverScrollableScrollPhysics(), + shrinkWrap: true, + padding: getPadding(width, height), + // shrinkWrap: true, + itemCount: filteredPackages.length, + gridDelegate: SliverGridDelegateWithMaxCrossAxisExtent( + maxCrossAxisExtent: packageSize, + crossAxisSpacing: 5, + ), + itemBuilder: (context, index) { + return filteredPackages[index]; + // return personalPackages[index]; + }, + ); + }, + ), + ], + ), ), ); } diff --git a/Frontend/lib/mih_packages/mzansi_ai/mzansi_ai.dart b/Frontend/lib/mih_packages/mzansi_ai/mzansi_ai.dart index a3b080cf..66778d83 100644 --- a/Frontend/lib/mih_packages/mzansi_ai/mzansi_ai.dart +++ b/Frontend/lib/mih_packages/mzansi_ai/mzansi_ai.dart @@ -1,15 +1,19 @@ import 'package:mzansi_innovation_hub/mih_components/mih_package_components/mih_package.dart'; import 'package:mzansi_innovation_hub/mih_components/mih_package_components/mih_package_action.dart'; import 'package:mzansi_innovation_hub/mih_components/mih_package_components/mih_package_tools.dart'; -import 'package:mzansi_innovation_hub/mih_objects/app_user.dart'; +import 'package:mzansi_innovation_hub/mih_objects/arguments.dart'; import 'package:mzansi_innovation_hub/mih_packages/mzansi_ai/package_tools/ai_chat.dart'; import 'package:flutter/material.dart'; class MzansiAi extends StatefulWidget { - final AppUser signedInUser; + // final AppUser signedInUser; + // final String? startUpQuestion; + final MzansiAiArguments arguments; const MzansiAi({ super.key, - required this.signedInUser, + required this.arguments, + // required this.signedInUser, + // this.startUpQuestion, }); @override @@ -46,7 +50,10 @@ class _MzansiAiState extends State { List getToolBody() { List toolBodies = [ - AiChat(signedInUser: widget.signedInUser), + AiChat( + signedInUser: widget.arguments.signedInUser, + startUpQuestion: widget.arguments.startUpQuestion, + ), ]; return toolBodies; } diff --git a/Frontend/lib/mih_packages/mzansi_ai/package_tiles/mzansi_ai_tile.dart b/Frontend/lib/mih_packages/mzansi_ai/package_tiles/mzansi_ai_tile.dart index 3bdba607..e45ba497 100644 --- a/Frontend/lib/mih_packages/mzansi_ai/package_tiles/mzansi_ai_tile.dart +++ b/Frontend/lib/mih_packages/mzansi_ai/package_tiles/mzansi_ai_tile.dart @@ -3,6 +3,7 @@ import 'package:mzansi_innovation_hub/mih_components/mih_package_components/mih_ import 'package:mzansi_innovation_hub/mih_components/mih_package_components/mih_icons.dart'; import 'package:mzansi_innovation_hub/mih_objects/app_user.dart'; import 'package:flutter/material.dart'; +import 'package:mzansi_innovation_hub/mih_objects/arguments.dart'; class MzansiAiTile extends StatefulWidget { final AppUser signedInUser; @@ -25,7 +26,10 @@ class _MzansiAiTileState extends State { onTap: () { Navigator.of(context).pushNamed( '/mzansi-ai', - arguments: widget.signedInUser, + arguments: MzansiAiArguments( + widget.signedInUser, + "", + ), ); }, appName: "Mzansi AI", diff --git a/Frontend/lib/mih_packages/mzansi_ai/package_tools/ai_chat.dart b/Frontend/lib/mih_packages/mzansi_ai/package_tools/ai_chat.dart index bb4b0cfc..96f7c2fe 100644 --- a/Frontend/lib/mih_packages/mzansi_ai/package_tools/ai_chat.dart +++ b/Frontend/lib/mih_packages/mzansi_ai/package_tools/ai_chat.dart @@ -21,9 +21,11 @@ import 'package:uuid/uuid.dart'; class AiChat extends StatefulWidget { final AppUser signedInUser; + final String? startUpQuestion; const AiChat({ super.key, required this.signedInUser, + this.startUpQuestion, }); @override @@ -593,6 +595,12 @@ class _AiChatState extends State { _loadMessages(); initTTS(); _ttsVoiceController.addListener(voiceSelected); + if (widget.startUpQuestion != null && widget.startUpQuestion!.isNotEmpty) { + final partialText = types.PartialText(text: widget.startUpQuestion!); + WidgetsBinding.instance.addPostFrameCallback((_) { + _handleSendPressed(partialText); + }); + } } @override diff --git a/Frontend/lib/mih_router/routeGenerator.dart b/Frontend/lib/mih_router/routeGenerator.dart index b95680d6..fb40437a 100644 --- a/Frontend/lib/mih_router/routeGenerator.dart +++ b/Frontend/lib/mih_router/routeGenerator.dart @@ -331,11 +331,11 @@ class RouteGenerator { //Mzansi AI case '/mzansi-ai': - if (args is AppUser) { + if (args is MzansiAiArguments) { return MaterialPageRoute( settings: settings, builder: (_) => MzansiAi( - signedInUser: args, + arguments: args, ), ); } From dfb4fb6b77b721fb7c5181edc55069829e71c577 Mon Sep 17 00:00:00 2001 From: Yasien Mac Mini Date: Mon, 2 Jun 2025 10:44:13 +0200 Subject: [PATCH 2/5] display message when no packages found --- .../package_tools/mih_business_home.dart | 57 +++++++++++++----- .../package_tools/mih_personal_home.dart | 59 ++++++++++++++----- 2 files changed, 87 insertions(+), 29 deletions(-) diff --git a/Frontend/lib/mih_packages/mih_home/package_tools/mih_business_home.dart b/Frontend/lib/mih_packages/mih_home/package_tools/mih_business_home.dart index b91f9314..294f313e 100644 --- a/Frontend/lib/mih_packages/mih_home/package_tools/mih_business_home.dart +++ b/Frontend/lib/mih_packages/mih_home/package_tools/mih_business_home.dart @@ -259,20 +259,49 @@ class _MihBusinessHomeState extends State .contains(searchController.text.toLowerCase())) .map((package) => package.values.first) .toList(); - return GridView.builder( - physics: const NeverScrollableScrollPhysics(), - shrinkWrap: true, - padding: getPadding(width, height), - // shrinkWrap: true, - itemCount: filteredPackages.length, - gridDelegate: SliverGridDelegateWithMaxCrossAxisExtent( - maxCrossAxisExtent: packageSize, - crossAxisSpacing: 5, - ), - itemBuilder: (context, index) { - return filteredPackages[index]; - }, - ); + if (filteredPackages.isNotEmpty) { + return GridView.builder( + physics: const NeverScrollableScrollPhysics(), + shrinkWrap: true, + padding: getPadding(width, height), + // shrinkWrap: true, + itemCount: filteredPackages.length, + gridDelegate: SliverGridDelegateWithMaxCrossAxisExtent( + maxCrossAxisExtent: packageSize, + crossAxisSpacing: 5, + ), + itemBuilder: (context, index) { + return filteredPackages[index]; + }, + ); + } else { + return Column( + mainAxisAlignment: MainAxisAlignment.center, + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + Icon( + MihIcons.mzansiAi, + size: 165, + color: MzanziInnovationHub.of(context)! + .theme + .secondaryColor(), + ), + const SizedBox(height: 10), + Text( + "Mzansi AI is here to help you!", + textAlign: TextAlign.center, + overflow: TextOverflow.visible, + style: TextStyle( + fontSize: 25, + fontWeight: FontWeight.bold, + color: MzanziInnovationHub.of(context)! + .theme + .secondaryColor(), + ), + ), + ], + ); + } }, ), ], diff --git a/Frontend/lib/mih_packages/mih_home/package_tools/mih_personal_home.dart b/Frontend/lib/mih_packages/mih_home/package_tools/mih_personal_home.dart index 86a9b2a6..3880abdf 100644 --- a/Frontend/lib/mih_packages/mih_home/package_tools/mih_personal_home.dart +++ b/Frontend/lib/mih_packages/mih_home/package_tools/mih_personal_home.dart @@ -302,21 +302,50 @@ class _MihPersonalHomeState extends State .contains(searchController.text.toLowerCase())) .map((package) => package.values.first) .toList(); - return GridView.builder( - physics: const NeverScrollableScrollPhysics(), - shrinkWrap: true, - padding: getPadding(width, height), - // shrinkWrap: true, - itemCount: filteredPackages.length, - gridDelegate: SliverGridDelegateWithMaxCrossAxisExtent( - maxCrossAxisExtent: packageSize, - crossAxisSpacing: 5, - ), - itemBuilder: (context, index) { - return filteredPackages[index]; - // return personalPackages[index]; - }, - ); + if (filteredPackages.isNotEmpty) { + return GridView.builder( + physics: const NeverScrollableScrollPhysics(), + shrinkWrap: true, + padding: getPadding(width, height), + // shrinkWrap: true, + itemCount: filteredPackages.length, + gridDelegate: SliverGridDelegateWithMaxCrossAxisExtent( + maxCrossAxisExtent: packageSize, + crossAxisSpacing: 5, + ), + itemBuilder: (context, index) { + return filteredPackages[index]; + // return personalPackages[index]; + }, + ); + } else { + return Column( + mainAxisAlignment: MainAxisAlignment.center, + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + Icon( + MihIcons.mzansiAi, + size: 165, + color: MzanziInnovationHub.of(context)! + .theme + .secondaryColor(), + ), + const SizedBox(height: 10), + Text( + "Mzansi AI is here to help you!", + textAlign: TextAlign.center, + overflow: TextOverflow.visible, + style: TextStyle( + fontSize: 25, + fontWeight: FontWeight.bold, + color: MzanziInnovationHub.of(context)! + .theme + .secondaryColor(), + ), + ), + ], + ); + } }, ), ], From d53e45d2e9f49545c5c36590c71700c73c953f91 Mon Sep 17 00:00:00 2001 From: Yasien Mac Mini Date: Mon, 2 Jun 2025 10:57:43 +0200 Subject: [PATCH 3/5] remove duplicate enter trigger --- .../package_tools/mih_business_home.dart | 175 ++++++++--------- .../package_tools/mih_personal_home.dart | 177 ++++++++---------- .../mih_business_user_search.dart | 117 +++++------- .../package_tools/my_patient_list.dart | 132 ++++++------- 4 files changed, 267 insertions(+), 334 deletions(-) diff --git a/Frontend/lib/mih_packages/mih_home/package_tools/mih_business_home.dart b/Frontend/lib/mih_packages/mih_home/package_tools/mih_business_home.dart index 294f313e..45cbb990 100644 --- a/Frontend/lib/mih_packages/mih_home/package_tools/mih_business_home.dart +++ b/Frontend/lib/mih_packages/mih_home/package_tools/mih_business_home.dart @@ -46,7 +46,6 @@ class _MihBusinessHomeState extends State late final AnimationController _marqueeController; late final ScrollController _scrollController; final FocusNode _searchFocusNode = FocusNode(); - final FocusNode _focusNode = FocusNode(); final String maintenanceMsg = "\tHeads up! We're doing maintenance on Thur, 15 May 2025 at 10 PM (CAT). MIH may be unavailable briefly."; @@ -204,108 +203,90 @@ class _MihBusinessHomeState extends State Widget getBody(double width, double height) { return MihSingleChildScroll( - child: KeyboardListener( - focusNode: _focusNode, - autofocus: true, - onKeyEvent: (event) async { - if (event is KeyDownEvent && - event.logicalKey == LogicalKeyboardKey.enter) { - Navigator.of(context).pushNamed( - '/mzansi-ai', - arguments: MzansiAiArguments( - widget.signedInUser, - searchController.text.isEmpty ? null : searchController.text, - ), - ); - searchController.clear(); - } - }, - child: Column( - children: [ - const SizedBox(height: 10), - Padding( - padding: EdgeInsets.symmetric(horizontal: width / 20), - child: MihSearchBar( - controller: searchController, - hintText: "Ask Mzansi", - prefixIcon: Icons.search, - prefixAltIcon: MihIcons.mzansiAi, - fillColor: - MzanziInnovationHub.of(context)!.theme.secondaryColor(), - hintColor: - MzanziInnovationHub.of(context)!.theme.primaryColor(), - onPrefixIconTap: () { - Navigator.of(context).pushNamed( - '/mzansi-ai', - arguments: MzansiAiArguments( - widget.signedInUser, - searchController.text.isEmpty - ? null - : searchController.text, - ), - ); - searchController.clear(); - }, - searchFocusNode: _searchFocusNode, - ), + child: Column( + children: [ + const SizedBox(height: 10), + Padding( + padding: EdgeInsets.symmetric(horizontal: width / 20), + child: MihSearchBar( + controller: searchController, + hintText: "Ask Mzansi", + prefixIcon: Icons.search, + prefixAltIcon: MihIcons.mzansiAi, + fillColor: + MzanziInnovationHub.of(context)!.theme.secondaryColor(), + hintColor: MzanziInnovationHub.of(context)!.theme.primaryColor(), + onPrefixIconTap: () { + Navigator.of(context).pushNamed( + '/mzansi-ai', + arguments: MzansiAiArguments( + widget.signedInUser, + searchController.text.isEmpty + ? null + : searchController.text, + ), + ); + searchController.clear(); + }, + searchFocusNode: _searchFocusNode, ), - const SizedBox(height: 10), - ValueListenableBuilder( - valueListenable: searchPackageName, - builder: (context, value, child) { - List filteredPackages = value - .where((package) => package.keys.first - .toLowerCase() - .contains(searchController.text.toLowerCase())) - .map((package) => package.values.first) - .toList(); - if (filteredPackages.isNotEmpty) { - return GridView.builder( - physics: const NeverScrollableScrollPhysics(), - shrinkWrap: true, - padding: getPadding(width, height), - // shrinkWrap: true, - itemCount: filteredPackages.length, - gridDelegate: SliverGridDelegateWithMaxCrossAxisExtent( - maxCrossAxisExtent: packageSize, - crossAxisSpacing: 5, + ), + const SizedBox(height: 10), + ValueListenableBuilder( + valueListenable: searchPackageName, + builder: (context, value, child) { + List filteredPackages = value + .where((package) => package.keys.first + .toLowerCase() + .contains(searchController.text.toLowerCase())) + .map((package) => package.values.first) + .toList(); + if (filteredPackages.isNotEmpty) { + return GridView.builder( + physics: const NeverScrollableScrollPhysics(), + shrinkWrap: true, + padding: getPadding(width, height), + // shrinkWrap: true, + itemCount: filteredPackages.length, + gridDelegate: SliverGridDelegateWithMaxCrossAxisExtent( + maxCrossAxisExtent: packageSize, + crossAxisSpacing: 5, + ), + itemBuilder: (context, index) { + return filteredPackages[index]; + }, + ); + } else { + return Column( + mainAxisAlignment: MainAxisAlignment.center, + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + Icon( + MihIcons.mzansiAi, + size: 165, + color: MzanziInnovationHub.of(context)! + .theme + .secondaryColor(), ), - itemBuilder: (context, index) { - return filteredPackages[index]; - }, - ); - } else { - return Column( - mainAxisAlignment: MainAxisAlignment.center, - crossAxisAlignment: CrossAxisAlignment.center, - children: [ - Icon( - MihIcons.mzansiAi, - size: 165, + const SizedBox(height: 10), + Text( + "Mzansi AI is here to help you!", + textAlign: TextAlign.center, + overflow: TextOverflow.visible, + style: TextStyle( + fontSize: 25, + fontWeight: FontWeight.bold, color: MzanziInnovationHub.of(context)! .theme .secondaryColor(), ), - const SizedBox(height: 10), - Text( - "Mzansi AI is here to help you!", - textAlign: TextAlign.center, - overflow: TextOverflow.visible, - style: TextStyle( - fontSize: 25, - fontWeight: FontWeight.bold, - color: MzanziInnovationHub.of(context)! - .theme - .secondaryColor(), - ), - ), - ], - ); - } - }, - ), - ], - ), + ), + ], + ); + } + }, + ), + ], ), ); } diff --git a/Frontend/lib/mih_packages/mih_home/package_tools/mih_personal_home.dart b/Frontend/lib/mih_packages/mih_home/package_tools/mih_personal_home.dart index 3880abdf..6838837b 100644 --- a/Frontend/lib/mih_packages/mih_home/package_tools/mih_personal_home.dart +++ b/Frontend/lib/mih_packages/mih_home/package_tools/mih_personal_home.dart @@ -54,7 +54,6 @@ class _MihPersonalHomeState extends State late final AnimationController _marqueeController; late final ScrollController _scrollController; final FocusNode _searchFocusNode = FocusNode(); - final FocusNode _focusNode = FocusNode(); final String maintenanceMsg = "\tHeads up! We're doing maintenance on Thur, 15 May 2025 at 10 PM (CAT). MIH may be unavailable briefly."; @@ -247,109 +246,91 @@ class _MihPersonalHomeState extends State Widget getBody(double width, double height) { return MihSingleChildScroll( - child: KeyboardListener( - focusNode: _focusNode, - autofocus: true, - onKeyEvent: (event) async { - if (event is KeyDownEvent && - event.logicalKey == LogicalKeyboardKey.enter) { - Navigator.of(context).pushNamed( - '/mzansi-ai', - arguments: MzansiAiArguments( - widget.signedInUser, - searchController.text.isEmpty ? null : searchController.text, - ), - ); - searchController.clear(); - } - }, - child: Column( - children: [ - const SizedBox(height: 10), - Padding( - padding: EdgeInsets.symmetric(horizontal: width / 20), - child: MihSearchBar( - controller: searchController, - hintText: "Ask Mzansi", - prefixIcon: Icons.search, - prefixAltIcon: MihIcons.mzansiAi, - fillColor: - MzanziInnovationHub.of(context)!.theme.secondaryColor(), - hintColor: - MzanziInnovationHub.of(context)!.theme.primaryColor(), - onPrefixIconTap: () { - Navigator.of(context).pushNamed( - '/mzansi-ai', - arguments: MzansiAiArguments( - widget.signedInUser, - searchController.text.isEmpty - ? null - : searchController.text, - ), - ); - searchController.clear(); - }, - searchFocusNode: _searchFocusNode, - ), + child: Column( + children: [ + const SizedBox(height: 10), + Padding( + padding: EdgeInsets.symmetric(horizontal: width / 20), + child: MihSearchBar( + controller: searchController, + hintText: "Ask Mzansi", + prefixIcon: Icons.search, + prefixAltIcon: MihIcons.mzansiAi, + fillColor: + MzanziInnovationHub.of(context)!.theme.secondaryColor(), + hintColor: MzanziInnovationHub.of(context)!.theme.primaryColor(), + onPrefixIconTap: () { + Navigator.of(context).pushNamed( + '/mzansi-ai', + arguments: MzansiAiArguments( + widget.signedInUser, + searchController.text.isEmpty + ? null + : searchController.text, + ), + ); + searchController.clear(); + }, + searchFocusNode: _searchFocusNode, ), - const SizedBox(height: 10), - ValueListenableBuilder( - valueListenable: searchPackageName, - builder: (context, value, child) { - List filteredPackages = value - .where((package) => package.keys.first - .toLowerCase() - .contains(searchController.text.toLowerCase())) - .map((package) => package.values.first) - .toList(); - if (filteredPackages.isNotEmpty) { - return GridView.builder( - physics: const NeverScrollableScrollPhysics(), - shrinkWrap: true, - padding: getPadding(width, height), - // shrinkWrap: true, - itemCount: filteredPackages.length, - gridDelegate: SliverGridDelegateWithMaxCrossAxisExtent( - maxCrossAxisExtent: packageSize, - crossAxisSpacing: 5, + ), + const SizedBox(height: 10), + ValueListenableBuilder( + valueListenable: searchPackageName, + builder: (context, value, child) { + List filteredPackages = value + .where((package) => package.keys.first + .toLowerCase() + .contains(searchController.text.toLowerCase())) + .map((package) => package.values.first) + .toList(); + if (filteredPackages.isNotEmpty) { + return GridView.builder( + physics: const NeverScrollableScrollPhysics(), + shrinkWrap: true, + padding: getPadding(width, height), + // shrinkWrap: true, + itemCount: filteredPackages.length, + gridDelegate: SliverGridDelegateWithMaxCrossAxisExtent( + maxCrossAxisExtent: packageSize, + crossAxisSpacing: 5, + ), + itemBuilder: (context, index) { + return filteredPackages[index]; + // return personalPackages[index]; + }, + ); + } else { + return Column( + mainAxisAlignment: MainAxisAlignment.center, + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + Icon( + MihIcons.mzansiAi, + size: 165, + color: MzanziInnovationHub.of(context)! + .theme + .secondaryColor(), ), - itemBuilder: (context, index) { - return filteredPackages[index]; - // return personalPackages[index]; - }, - ); - } else { - return Column( - mainAxisAlignment: MainAxisAlignment.center, - crossAxisAlignment: CrossAxisAlignment.center, - children: [ - Icon( - MihIcons.mzansiAi, - size: 165, + const SizedBox(height: 10), + Text( + "Mzansi AI is here to help you!", + textAlign: TextAlign.center, + overflow: TextOverflow.visible, + style: TextStyle( + fontSize: 25, + fontWeight: FontWeight.bold, color: MzanziInnovationHub.of(context)! .theme .secondaryColor(), ), - const SizedBox(height: 10), - Text( - "Mzansi AI is here to help you!", - textAlign: TextAlign.center, - overflow: TextOverflow.visible, - style: TextStyle( - fontSize: 25, - fontWeight: FontWeight.bold, - color: MzanziInnovationHub.of(context)! - .theme - .secondaryColor(), - ), - ), - ], - ); - } - }, - ), - ], - ), + ), + ], + ); + } + }, + ), + ], ), ); } diff --git a/Frontend/lib/mih_packages/mzansi_profile/business_profile/package_tools/mih_business_user_search.dart b/Frontend/lib/mih_packages/mzansi_profile/business_profile/package_tools/mih_business_user_search.dart index 90522dbd..a7f11b56 100644 --- a/Frontend/lib/mih_packages/mzansi_profile/business_profile/package_tools/mih_business_user_search.dart +++ b/Frontend/lib/mih_packages/mzansi_profile/business_profile/package_tools/mih_business_user_search.dart @@ -24,7 +24,6 @@ class MihBusinessUserSearch extends StatefulWidget { } class _MihBusinessUserSearchState extends State { - final FocusNode _focusNode = FocusNode(); final TextEditingController searchController = TextEditingController(); late Future> userSearchResults; final FocusNode _searchFocusNode = FocusNode(); @@ -101,72 +100,60 @@ class _MihBusinessUserSearchState extends State { Widget getBody(double width) { return MihSingleChildScroll( - child: KeyboardListener( - focusNode: _focusNode, - autofocus: true, - onKeyEvent: (event) async { - if (event is KeyDownEvent && - event.logicalKey == LogicalKeyboardKey.enter) { - submitUserForm(); - } - }, - child: Column(mainAxisSize: MainAxisSize.max, children: [ - Padding( - padding: EdgeInsets.symmetric(horizontal: width / 20), - child: MihSearchBar( - controller: searchController, - hintText: "Search Users", - prefixIcon: Icons.search, - fillColor: - MzanziInnovationHub.of(context)!.theme.secondaryColor(), - hintColor: MzanziInnovationHub.of(context)!.theme.primaryColor(), - onPrefixIconTap: () { - submitUserForm(); - }, - onClearIconTap: () { - setState(() { - searchController.clear(); - userSearch = ""; - }); - submitUserForm(); - }, - searchFocusNode: _searchFocusNode, - ), - ), - const SizedBox(height: 10), - FutureBuilder( - future: userSearchResults, - builder: (context, snapshot) { - //print("patient Liust ${snapshot.data}"); - if (snapshot.connectionState == ConnectionState.waiting) { - return const Mihloadingcircle(); - } else if (snapshot.connectionState == ConnectionState.done && - snapshot.hasData) { - List patientsList; - if (userSearch == "") { - patientsList = []; - } else { - patientsList = snapshot.data!; - //print(patientsList); - } - return displayUserList(patientsList); - } else { - return Center( - child: Text( - "$errorCode: Error pulling Patients Data\n/patients/search/$userSearch\n$errorBody", - style: TextStyle( - fontSize: 25, - color: MzanziInnovationHub.of(context)! - .theme - .errorColor()), - textAlign: TextAlign.center, - ), - ); - } + child: Column(mainAxisSize: MainAxisSize.max, children: [ + Padding( + padding: EdgeInsets.symmetric(horizontal: width / 20), + child: MihSearchBar( + controller: searchController, + hintText: "Search Users", + prefixIcon: Icons.search, + fillColor: MzanziInnovationHub.of(context)!.theme.secondaryColor(), + hintColor: MzanziInnovationHub.of(context)!.theme.primaryColor(), + onPrefixIconTap: () { + submitUserForm(); }, + onClearIconTap: () { + setState(() { + searchController.clear(); + userSearch = ""; + }); + submitUserForm(); + }, + searchFocusNode: _searchFocusNode, ), - ]), - ), + ), + const SizedBox(height: 10), + FutureBuilder( + future: userSearchResults, + builder: (context, snapshot) { + //print("patient Liust ${snapshot.data}"); + if (snapshot.connectionState == ConnectionState.waiting) { + return const Mihloadingcircle(); + } else if (snapshot.connectionState == ConnectionState.done && + snapshot.hasData) { + List patientsList; + if (userSearch == "") { + patientsList = []; + } else { + patientsList = snapshot.data!; + //print(patientsList); + } + return displayUserList(patientsList); + } else { + return Center( + child: Text( + "$errorCode: Error pulling Patients Data\n/patients/search/$userSearch\n$errorBody", + style: TextStyle( + fontSize: 25, + color: + MzanziInnovationHub.of(context)!.theme.errorColor()), + textAlign: TextAlign.center, + ), + ); + } + }, + ), + ]), ); } } diff --git a/Frontend/lib/mih_packages/patient_profile/pat_manager/package_tools/my_patient_list.dart b/Frontend/lib/mih_packages/patient_profile/pat_manager/package_tools/my_patient_list.dart index 207e7304..324064a1 100644 --- a/Frontend/lib/mih_packages/patient_profile/pat_manager/package_tools/my_patient_list.dart +++ b/Frontend/lib/mih_packages/patient_profile/pat_manager/package_tools/my_patient_list.dart @@ -42,82 +42,66 @@ class _MyPatientListState extends State { Widget myPatientListTool(double width) { return MihSingleChildScroll( - child: KeyboardListener( - focusNode: _focusNode, - autofocus: true, - onKeyEvent: (event) async { - if (event is KeyDownEvent && - event.logicalKey == LogicalKeyboardKey.enter) { - setState(() { - _myPatientIdSearchString = _myPatientSearchController.text; - _myPatientList = MIHApiCalls.getPatientAccessListOfBusiness( - widget.business!.business_id); - }); - } - }, - child: Column(mainAxisSize: MainAxisSize.max, children: [ - Padding( - padding: EdgeInsets.symmetric(horizontal: width / 20), - child: MihSearchBar( - controller: _myPatientSearchController, - hintText: "Search Patient ID", - prefixIcon: Icons.search, - fillColor: - MzanziInnovationHub.of(context)!.theme.secondaryColor(), - hintColor: MzanziInnovationHub.of(context)!.theme.primaryColor(), - onPrefixIconTap: () { - setState(() { - _myPatientIdSearchString = _myPatientSearchController.text; - _myPatientList = MIHApiCalls.getPatientAccessListOfBusiness( - widget.business!.business_id); - }); - }, - onClearIconTap: () { - setState(() { - _myPatientSearchController.clear(); - _myPatientIdSearchString = ""; - }); - getMyPatientList(); - }, - searchFocusNode: _searchFocusNode, - ), - ), - //spacer - const SizedBox(height: 10), - FutureBuilder( - future: _myPatientList, - builder: (context, snapshot) { - //print("patient Liust ${snapshot.data}"); - if (snapshot.connectionState == ConnectionState.waiting) { - return const Mihloadingcircle(); - } else if (snapshot.connectionState == ConnectionState.done && - snapshot.hasData) { - List patientsAccessList; - if (_myPatientIdSearchString == "") { - patientsAccessList = snapshot.data!; - } else { - patientsAccessList = filterAccessResults( - snapshot.data!, _myPatientIdSearchString); - //print(patientsList); - } - return displayMyPatientList(patientsAccessList); - } else { - return Center( - child: Text( - "Error pulling Patient Access Data\n$baseUrl/access-requests/business/patient/${widget.business!.business_id}", - style: TextStyle( - fontSize: 25, - color: MzanziInnovationHub.of(context)! - .theme - .errorColor()), - textAlign: TextAlign.center, - ), - ); - } + child: Column(mainAxisSize: MainAxisSize.max, children: [ + Padding( + padding: EdgeInsets.symmetric(horizontal: width / 20), + child: MihSearchBar( + controller: _myPatientSearchController, + hintText: "Search Patient ID", + prefixIcon: Icons.search, + fillColor: MzanziInnovationHub.of(context)!.theme.secondaryColor(), + hintColor: MzanziInnovationHub.of(context)!.theme.primaryColor(), + onPrefixIconTap: () { + setState(() { + _myPatientIdSearchString = _myPatientSearchController.text; + _myPatientList = MIHApiCalls.getPatientAccessListOfBusiness( + widget.business!.business_id); + }); }, + onClearIconTap: () { + setState(() { + _myPatientSearchController.clear(); + _myPatientIdSearchString = ""; + }); + getMyPatientList(); + }, + searchFocusNode: _searchFocusNode, ), - ]), - ), + ), + //spacer + const SizedBox(height: 10), + FutureBuilder( + future: _myPatientList, + builder: (context, snapshot) { + //print("patient Liust ${snapshot.data}"); + if (snapshot.connectionState == ConnectionState.waiting) { + return const Mihloadingcircle(); + } else if (snapshot.connectionState == ConnectionState.done && + snapshot.hasData) { + List patientsAccessList; + if (_myPatientIdSearchString == "") { + patientsAccessList = snapshot.data!; + } else { + patientsAccessList = filterAccessResults( + snapshot.data!, _myPatientIdSearchString); + //print(patientsList); + } + return displayMyPatientList(patientsAccessList); + } else { + return Center( + child: Text( + "Error pulling Patient Access Data\n$baseUrl/access-requests/business/patient/${widget.business!.business_id}", + style: TextStyle( + fontSize: 25, + color: + MzanziInnovationHub.of(context)!.theme.errorColor()), + textAlign: TextAlign.center, + ), + ); + } + }, + ), + ]), ); } From d0ebb5989e6e1bfec3d31521261b767309e56eaa Mon Sep 17 00:00:00 2001 From: Yasien Mac Mini Date: Mon, 2 Jun 2025 11:02:30 +0200 Subject: [PATCH 4/5] remove double enter trigger --- .../components/Claim_Statement_Window.dart | 44 +++++++------------ .../pat_profile/components/prescip_input.dart | 34 +++++--------- 2 files changed, 27 insertions(+), 51 deletions(-) diff --git a/Frontend/lib/mih_packages/patient_profile/pat_profile/components/Claim_Statement_Window.dart b/Frontend/lib/mih_packages/patient_profile/pat_profile/components/Claim_Statement_Window.dart index a13a7de1..6efd0697 100644 --- a/Frontend/lib/mih_packages/patient_profile/pat_profile/components/Claim_Statement_Window.dart +++ b/Frontend/lib/mih_packages/patient_profile/pat_profile/components/Claim_Statement_Window.dart @@ -66,7 +66,6 @@ class _ClaimStatementWindowState extends State { final ValueNotifier medAid = ValueNotifier(""); List icd10codeList = []; final FocusNode _searchFocusNode = FocusNode(); - final FocusNode _focusNode = FocusNode(); void icd10SearchWindow(List codeList) { showDialog( @@ -189,35 +188,22 @@ class _ClaimStatementWindowState extends State { }, ), //const SizedBox(height: 10), - KeyboardListener( - focusNode: _focusNode, - autofocus: true, - onKeyEvent: (event) async { - if (event is KeyDownEvent && - event.logicalKey == LogicalKeyboardKey.enter) { - MIHIcd10CodeApis.getIcd10Codes(_icd10CodeController.text, context) - .then((result) { - icd10SearchWindow(result); - }); - } + MihSearchBar( + controller: _icd10CodeController, + hintText: "ICD-10 Code & Description", + prefixIcon: Icons.search, + fillColor: MzanziInnovationHub.of(context)!.theme.secondaryColor(), + hintColor: MzanziInnovationHub.of(context)!.theme.primaryColor(), + onPrefixIconTap: () { + MIHIcd10CodeApis.getIcd10Codes(_icd10CodeController.text, context) + .then((result) { + icd10SearchWindow(result); + }); }, - child: MihSearchBar( - controller: _icd10CodeController, - hintText: "ICD-10 Code & Description", - prefixIcon: Icons.search, - fillColor: MzanziInnovationHub.of(context)!.theme.secondaryColor(), - hintColor: MzanziInnovationHub.of(context)!.theme.primaryColor(), - onPrefixIconTap: () { - MIHIcd10CodeApis.getIcd10Codes(_icd10CodeController.text, context) - .then((result) { - icd10SearchWindow(result); - }); - }, - onClearIconTap: () { - _icd10CodeController.clear(); - }, - searchFocusNode: _searchFocusNode, - ), + onClearIconTap: () { + _icd10CodeController.clear(); + }, + searchFocusNode: _searchFocusNode, ), const SizedBox(height: 10), MIHTextField( diff --git a/Frontend/lib/mih_packages/patient_profile/pat_profile/components/prescip_input.dart b/Frontend/lib/mih_packages/patient_profile/pat_profile/components/prescip_input.dart index 5f55396d..acbb6da4 100644 --- a/Frontend/lib/mih_packages/patient_profile/pat_profile/components/prescip_input.dart +++ b/Frontend/lib/mih_packages/patient_profile/pat_profile/components/prescip_input.dart @@ -353,29 +353,19 @@ class _PrescripInputState extends State { children: [ //const SizedBox(height: 25.0), - KeyboardListener( - focusNode: _focusNode, - autofocus: true, - onKeyEvent: (event) async { - if (event is KeyDownEvent && - event.logicalKey == LogicalKeyboardKey.enter) { - getMedsPopUp(widget.medicineController); - } + MihSearchBar( + controller: widget.medicineController, + hintText: "Search Medicine", + prefixIcon: Icons.search, + fillColor: MzanziInnovationHub.of(context)!.theme.secondaryColor(), + hintColor: MzanziInnovationHub.of(context)!.theme.primaryColor(), + onPrefixIconTap: () { + getMedsPopUp(widget.medicineController); }, - child: MihSearchBar( - controller: widget.medicineController, - hintText: "Search Medicine", - prefixIcon: Icons.search, - fillColor: MzanziInnovationHub.of(context)!.theme.secondaryColor(), - hintColor: MzanziInnovationHub.of(context)!.theme.primaryColor(), - onPrefixIconTap: () { - getMedsPopUp(widget.medicineController); - }, - onClearIconTap: () { - widget.medicineController.clear(); - }, - searchFocusNode: _searchFocusNode, - ), + onClearIconTap: () { + widget.medicineController.clear(); + }, + searchFocusNode: _searchFocusNode, ), const SizedBox(height: 10.0), From 9aa9aca4cf0f58d03f5994790c0206ea8f65b331 Mon Sep 17 00:00:00 2001 From: Yasien Mac Mini Date: Mon, 2 Jun 2025 11:04:25 +0200 Subject: [PATCH 5/5] again removing --- .../package_tools/mih_patient_search.dart | 129 ++++++++---------- 1 file changed, 56 insertions(+), 73 deletions(-) diff --git a/Frontend/lib/mih_packages/patient_profile/pat_manager/package_tools/mih_patient_search.dart b/Frontend/lib/mih_packages/patient_profile/pat_manager/package_tools/mih_patient_search.dart index 71da39d2..e96716ec 100644 --- a/Frontend/lib/mih_packages/patient_profile/pat_manager/package_tools/mih_patient_search.dart +++ b/Frontend/lib/mih_packages/patient_profile/pat_manager/package_tools/mih_patient_search.dart @@ -42,81 +42,64 @@ class _MihPatientSearchState extends State { Widget getPatientSearch(double width) { return MihSingleChildScroll( - child: KeyboardListener( - focusNode: _focusNode, - autofocus: true, - onKeyEvent: (event) async { - if (event is KeyDownEvent && - event.logicalKey == LogicalKeyboardKey.enter) { - // submitPatientForm(); - submitPatientSearch(); - //To-Do: Implement the search function - // print("To-Do: Implement the search function"); - } - }, - child: Column(mainAxisSize: MainAxisSize.max, children: [ - Padding( - padding: EdgeInsets.symmetric(horizontal: width / 20), - child: MihSearchBar( - controller: _mihPatientSearchController, - hintText: "Search Patient ID/ Aid No.", - prefixIcon: Icons.search, - fillColor: - MzanziInnovationHub.of(context)!.theme.secondaryColor(), - hintColor: MzanziInnovationHub.of(context)!.theme.primaryColor(), - onPrefixIconTap: () { - submitPatientSearch(); - print("Search Text: ${_mihPatientSearchController.text}"); - }, - onClearIconTap: () { - setState(() { - _mihPatientSearchController.clear(); - _mihPatientSearchString = ""; - }); - submitPatientSearch(); - //To-Do: Implement the search function - // print("To-Do: Implement the search function"); - }, - searchFocusNode: _searchFocusNode, - ), - ), - //spacer - const SizedBox(height: 10), - FutureBuilder( - future: _mihPatientSearchResults, - builder: (context, snapshot) { - //print("patient Liust ${snapshot.data}"); - if (snapshot.connectionState == ConnectionState.waiting) { - return const Mihloadingcircle(); - } else if (snapshot.connectionState == ConnectionState.done && - snapshot.hasData) { - List patientsList; - if (_mihPatientSearchString == "") { - patientsList = []; - } else { - patientsList = filterSearchResults( - snapshot.data!, _mihPatientSearchString); - //print(patientsList); - } - return displayPatientList( - patientsList, _mihPatientSearchString); - } else { - return Center( - child: Text( - "Error pulling Patients Data\n$baseUrl/patients/search/$_mihPatientSearchString", - style: TextStyle( - fontSize: 25, - color: MzanziInnovationHub.of(context)! - .theme - .errorColor()), - textAlign: TextAlign.center, - ), - ); - } + child: Column(mainAxisSize: MainAxisSize.max, children: [ + Padding( + padding: EdgeInsets.symmetric(horizontal: width / 20), + child: MihSearchBar( + controller: _mihPatientSearchController, + hintText: "Search Patient ID/ Aid No.", + prefixIcon: Icons.search, + fillColor: MzanziInnovationHub.of(context)!.theme.secondaryColor(), + hintColor: MzanziInnovationHub.of(context)!.theme.primaryColor(), + onPrefixIconTap: () { + submitPatientSearch(); }, + onClearIconTap: () { + setState(() { + _mihPatientSearchController.clear(); + _mihPatientSearchString = ""; + }); + submitPatientSearch(); + //To-Do: Implement the search function + // print("To-Do: Implement the search function"); + }, + searchFocusNode: _searchFocusNode, ), - ]), - ), + ), + //spacer + const SizedBox(height: 10), + FutureBuilder( + future: _mihPatientSearchResults, + builder: (context, snapshot) { + //print("patient Liust ${snapshot.data}"); + if (snapshot.connectionState == ConnectionState.waiting) { + return const Mihloadingcircle(); + } else if (snapshot.connectionState == ConnectionState.done && + snapshot.hasData) { + List patientsList; + if (_mihPatientSearchString == "") { + patientsList = []; + } else { + patientsList = filterSearchResults( + snapshot.data!, _mihPatientSearchString); + //print(patientsList); + } + return displayPatientList(patientsList, _mihPatientSearchString); + } else { + return Center( + child: Text( + "Error pulling Patients Data\n$baseUrl/patients/search/$_mihPatientSearchString", + style: TextStyle( + fontSize: 25, + color: + MzanziInnovationHub.of(context)!.theme.errorColor()), + textAlign: TextAlign.center, + ), + ); + } + }, + ), + ]), ); }