From ed7fb30932402cf1b21e1f9ba8e9a4822738d33f Mon Sep 17 00:00:00 2001 From: Yasien Mac Mini Date: Thu, 10 Apr 2025 08:09:28 +0200 Subject: [PATCH 01/13] add speed dial package --- Frontend/pubspec.lock | 8 ++++++++ Frontend/pubspec.yaml | 3 ++- 2 files changed, 10 insertions(+), 1 deletion(-) diff --git a/Frontend/pubspec.lock b/Frontend/pubspec.lock index d41ac5d6..2e16827a 100644 --- a/Frontend/pubspec.lock +++ b/Frontend/pubspec.lock @@ -470,6 +470,14 @@ packages: url: "https://pub.dev" source: hosted version: "2.0.27" + flutter_speed_dial: + dependency: "direct main" + description: + name: flutter_speed_dial + sha256: "698a037274a66dbae8697c265440e6acb6ab6cae9ac5f95c749e7944d8f28d41" + url: "https://pub.dev" + source: hosted + version: "7.0.0" flutter_swipe_detector: dependency: "direct main" description: diff --git a/Frontend/pubspec.yaml b/Frontend/pubspec.yaml index b1e71c3d..b62cb026 100644 --- a/Frontend/pubspec.yaml +++ b/Frontend/pubspec.yaml @@ -73,7 +73,8 @@ dependencies: flutter_chat_types: ^3.6.2 uuid: ^4.5.1 flutter_tts: ^4.2.2 - + flutter_speed_dial: ^7.0.0 + dev_dependencies: flutter_test: sdk: flutter From 88fd92be794634fb02792f421432c1c99e1b8900 Mon Sep 17 00:00:00 2001 From: Yasien Mac Mini Date: Thu, 10 Apr 2025 08:09:42 +0200 Subject: [PATCH 02/13] xreate custome speed dial --- .../mih_package_components/mih_app.dart | 4 ++ .../mih_floating_menu.dart | 40 ++++++++++++++++++ .../test/package_test.dart | 42 +++++++++++++++++++ 3 files changed, 86 insertions(+) create mode 100644 Frontend/lib/mih_components/mih_package_components/mih_floating_menu.dart diff --git a/Frontend/lib/mih_components/mih_package_components/mih_app.dart b/Frontend/lib/mih_components/mih_package_components/mih_app.dart index 01cda197..6a557eea 100644 --- a/Frontend/lib/mih_components/mih_package_components/mih_app.dart +++ b/Frontend/lib/mih_components/mih_package_components/mih_app.dart @@ -1,3 +1,4 @@ +import 'package:mzansi_innovation_hub/mih_components/mih_package_components/mih_floating_menu.dart'; import 'package:mzansi_innovation_hub/mih_packages/mih_home/components/mih_app_drawer.dart'; import 'package:mzansi_innovation_hub/mih_components/mih_package_components/mih_app_tools.dart'; import 'package:flutter/material.dart'; @@ -9,6 +10,7 @@ class MihApp extends StatefulWidget { final MihAppTools appTools; final List appBody; final MIHAppDrawer? actionDrawer; + final MihFloatingMenu? appFloatingMenu; int selectedbodyIndex; final Function(int) onIndexChange; MihApp({ @@ -19,6 +21,7 @@ class MihApp extends StatefulWidget { this.actionDrawer, required this.selectedbodyIndex, required this.onIndexChange, + this.appFloatingMenu, }); @override @@ -63,6 +66,7 @@ class _MihAppState extends State { onTap: unfocusAll, child: Scaffold( drawer: widget.actionDrawer, + floatingActionButton: widget.appFloatingMenu, body: SafeArea( child: Container( width: screenSize.width, diff --git a/Frontend/lib/mih_components/mih_package_components/mih_floating_menu.dart b/Frontend/lib/mih_components/mih_package_components/mih_floating_menu.dart new file mode 100644 index 00000000..31eb3c1b --- /dev/null +++ b/Frontend/lib/mih_components/mih_package_components/mih_floating_menu.dart @@ -0,0 +1,40 @@ +import 'package:flutter/material.dart'; +import 'package:flutter_speed_dial/flutter_speed_dial.dart'; +import 'package:mzansi_innovation_hub/main.dart'; + +class MihFloatingMenu extends StatefulWidget { + final List children; + const MihFloatingMenu({ + super.key, + required this.children, + }); + + @override + State createState() => _MihFloatingMenuState(); +} + +class _MihFloatingMenuState extends State { + @override + Widget build(BuildContext context) { + return Padding( + padding: const EdgeInsets.only( + right: 5.0, + bottom: 5.0, + ), + child: SpeedDial( + animatedIcon: AnimatedIcons.menu_close, + activeIcon: Icons.close, + backgroundColor: + MzanziInnovationHub.of(context)!.theme.secondaryColor(), + activeBackgroundColor: + MzanziInnovationHub.of(context)!.theme.errorColor(), + foregroundColor: MzanziInnovationHub.of(context)!.theme.primaryColor(), + overlayColor: Colors.black, + overlayOpacity: 0, + children: widget.children, + onOpen: () => debugPrint('OPENING DIAL'), + onClose: () => debugPrint('DIAL CLOSED'), + ), + ); + } +} diff --git a/Frontend/lib/mih_components/mih_package_components/test/package_test.dart b/Frontend/lib/mih_components/mih_package_components/test/package_test.dart index 4679bf8a..054332f6 100644 --- a/Frontend/lib/mih_components/mih_package_components/test/package_test.dart +++ b/Frontend/lib/mih_components/mih_package_components/test/package_test.dart @@ -1,3 +1,4 @@ +import 'package:flutter_speed_dial/flutter_speed_dial.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_app.dart'; @@ -6,6 +7,7 @@ import 'package:mzansi_innovation_hub/mih_components/mih_package_components/mih_ import 'package:mzansi_innovation_hub/mih_components/mih_package_components/mih_app_tools.dart'; import 'package:mzansi_innovation_hub/mih_components/mih_package_components/mih_app_window.dart'; import 'package:mzansi_innovation_hub/mih_components/mih_package_components/mih-app_tool_body.dart'; +import 'package:mzansi_innovation_hub/mih_components/mih_package_components/mih_floating_menu.dart'; import 'package:mzansi_innovation_hub/mih_components/mih_package_components/mih_icons.dart'; import 'package:mzansi_innovation_hub/mih_objects/arguments.dart'; import 'package:flutter/material.dart'; @@ -183,6 +185,24 @@ class _PackageTestState extends State { ), ), const SizedBox(height: 10), + MihFloatingMenu(children: [ + SpeedDialChild( + child: Icon( + Icons.add, + color: + MzanziInnovationHub.of(context)!.theme.primaryColor(), + ), + label: "Add", + labelBackgroundColor: + MzanziInnovationHub.of(context)!.theme.secondaryColor(), + labelStyle: TextStyle( + color: + MzanziInnovationHub.of(context)!.theme.primaryColor(), + ), + backgroundColor: + MzanziInnovationHub.of(context)!.theme.secondaryColor(), + ) + ]), Container( color: Colors.black, width: 200, @@ -231,6 +251,28 @@ class _PackageTestState extends State { appTools: getTools(), appBody: getToolBody(), selectedbodyIndex: _selcetedIndex, + appFloatingMenu: MihFloatingMenu( + children: [ + SpeedDialChild( + child: Icon( + Icons.add, + color: MzanziInnovationHub.of(context)!.theme.primaryColor(), + ), + label: "Add", + labelBackgroundColor: + MzanziInnovationHub.of(context)!.theme.secondaryColor(), + labelStyle: TextStyle( + fontWeight: FontWeight.bold, + color: MzanziInnovationHub.of(context)!.theme.primaryColor(), + ), + backgroundColor: + MzanziInnovationHub.of(context)!.theme.secondaryColor(), + onTap: () { + showFullScreenWindow(); + }, + ) + ], + ), onIndexChange: (newValue) { setState(() { _selcetedIndex = newValue; From 4accaaef47683c1aa93c3dd6f77b163bfc5faf95 Mon Sep 17 00:00:00 2001 From: yaso Date: Thu, 10 Apr 2025 12:39:12 +0200 Subject: [PATCH 03/13] remove floating action in MIH App widget --- .../lib/mih_components/mih_package_components/mih_app.dart | 4 ---- 1 file changed, 4 deletions(-) diff --git a/Frontend/lib/mih_components/mih_package_components/mih_app.dart b/Frontend/lib/mih_components/mih_package_components/mih_app.dart index 6a557eea..01cda197 100644 --- a/Frontend/lib/mih_components/mih_package_components/mih_app.dart +++ b/Frontend/lib/mih_components/mih_package_components/mih_app.dart @@ -1,4 +1,3 @@ -import 'package:mzansi_innovation_hub/mih_components/mih_package_components/mih_floating_menu.dart'; import 'package:mzansi_innovation_hub/mih_packages/mih_home/components/mih_app_drawer.dart'; import 'package:mzansi_innovation_hub/mih_components/mih_package_components/mih_app_tools.dart'; import 'package:flutter/material.dart'; @@ -10,7 +9,6 @@ class MihApp extends StatefulWidget { final MihAppTools appTools; final List appBody; final MIHAppDrawer? actionDrawer; - final MihFloatingMenu? appFloatingMenu; int selectedbodyIndex; final Function(int) onIndexChange; MihApp({ @@ -21,7 +19,6 @@ class MihApp extends StatefulWidget { this.actionDrawer, required this.selectedbodyIndex, required this.onIndexChange, - this.appFloatingMenu, }); @override @@ -66,7 +63,6 @@ class _MihAppState extends State { onTap: unfocusAll, child: Scaffold( drawer: widget.actionDrawer, - floatingActionButton: widget.appFloatingMenu, body: SafeArea( child: Container( width: screenSize.width, From 2067ce27a4fe89f4cf9f83c02da3b17a43ee44f1 Mon Sep 17 00:00:00 2001 From: yaso Date: Thu, 10 Apr 2025 12:39:25 +0200 Subject: [PATCH 04/13] update test package --- .../test/package_test.dart | 23 +------ .../test/package_tools/package_tool_one.dart | 60 +++++++++++++++++++ 2 files changed, 61 insertions(+), 22 deletions(-) create mode 100644 Frontend/lib/mih_components/mih_package_components/test/package_tools/package_tool_one.dart diff --git a/Frontend/lib/mih_components/mih_package_components/test/package_test.dart b/Frontend/lib/mih_components/mih_package_components/test/package_test.dart index 054332f6..9069f807 100644 --- a/Frontend/lib/mih_components/mih_package_components/test/package_test.dart +++ b/Frontend/lib/mih_components/mih_package_components/test/package_test.dart @@ -201,6 +201,7 @@ class _PackageTestState extends State { ), backgroundColor: MzanziInnovationHub.of(context)!.theme.secondaryColor(), + onTap: () {}, ) ]), Container( @@ -251,28 +252,6 @@ class _PackageTestState extends State { appTools: getTools(), appBody: getToolBody(), selectedbodyIndex: _selcetedIndex, - appFloatingMenu: MihFloatingMenu( - children: [ - SpeedDialChild( - child: Icon( - Icons.add, - color: MzanziInnovationHub.of(context)!.theme.primaryColor(), - ), - label: "Add", - labelBackgroundColor: - MzanziInnovationHub.of(context)!.theme.secondaryColor(), - labelStyle: TextStyle( - fontWeight: FontWeight.bold, - color: MzanziInnovationHub.of(context)!.theme.primaryColor(), - ), - backgroundColor: - MzanziInnovationHub.of(context)!.theme.secondaryColor(), - onTap: () { - showFullScreenWindow(); - }, - ) - ], - ), onIndexChange: (newValue) { setState(() { _selcetedIndex = newValue; diff --git a/Frontend/lib/mih_components/mih_package_components/test/package_tools/package_tool_one.dart b/Frontend/lib/mih_components/mih_package_components/test/package_tools/package_tool_one.dart new file mode 100644 index 00000000..73b857c1 --- /dev/null +++ b/Frontend/lib/mih_components/mih_package_components/test/package_tools/package_tool_one.dart @@ -0,0 +1,60 @@ +import 'package:flutter/material.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-app_tool_body.dart'; +import 'package:mzansi_innovation_hub/mih_components/mih_package_components/mih_icons.dart'; + +class PackageToolOne extends StatefulWidget { + const PackageToolOne({super.key}); + + @override + State createState() => _PackageToolOneState(); +} + +class _PackageToolOneState extends State { + @override + Widget build(BuildContext context) { + return MihAppToolBody( + borderOn: true, + bodyItem: getBody(), + ); + } + + Widget getBody() { + return MihAppToolBody( + borderOn: true, + bodyItem: MihSingleChildScroll( + child: Column( + mainAxisAlignment: MainAxisAlignment.start, + mainAxisSize: MainAxisSize.max, + children: [ + Text( + "Hello", + textAlign: TextAlign.center, + style: TextStyle( + fontSize: 25, + fontWeight: FontWeight.bold, + color: MzanziInnovationHub.of(context)!.theme.secondaryColor(), + ), + ), + const SizedBox(height: 10), + Container( + color: Colors.black, + width: 200, + height: 200, + padding: EdgeInsets.zero, + alignment: Alignment.center, + child: IconButton.filled( + onPressed: () {}, + icon: Icon( + MihIcons.mihLogo, + color: MzanziInnovationHub.of(context)!.theme.primaryColor(), + ), + ), + ) + ], + ), + ), + ); + } +} From c23d908d0add2aee43403a4c81bcf14a6621a920 Mon Sep 17 00:00:00 2001 From: yaso Date: Thu, 10 Apr 2025 12:39:33 +0200 Subject: [PATCH 05/13] config --- Frontend/lib/mih_env/env.dart | 12 +++--- Frontend/pubspec.lock | 74 +++++++++++++++++------------------ 2 files changed, 43 insertions(+), 43 deletions(-) diff --git a/Frontend/lib/mih_env/env.dart b/Frontend/lib/mih_env/env.dart index c96e44e0..f86f1312 100644 --- a/Frontend/lib/mih_env/env.dart +++ b/Frontend/lib/mih_env/env.dart @@ -15,13 +15,13 @@ abstract class AppEnviroment { case Enviroment.dev: { //================= Android Dev Urls ================= - baseApiUrl = "http://10.0.2.2:8080"; - baseFileUrl = "http://10.0.2.2:9000"; - baseAiUrl = "http://10.0.2.2:11434"; + // baseApiUrl = "http://10.0.2.2:8080"; + // baseFileUrl = "http://10.0.2.2:9000"; + // baseAiUrl = "http://10.0.2.2:11434"; //================= Web Dev Urls ================= - // baseApiUrl = "http://localhost:8080"; - // baseFileUrl = "http://localhost:9000"; - // baseAiUrl = "http://localhost:11434"; + baseApiUrl = "http://localhost:8080"; + baseFileUrl = "http://localhost:9000"; + baseAiUrl = "http://localhost:11434"; whatsappAccessToken = "EAAPINXuNFdYBOzBjTcvZA2iPXEHbHRF9uNXyP3ihkPRUcBqKNru5g9NKRRKkFaiaITEzO3BMo6CjdUmlDH4qYTW2mzDrZB4Q21ZCEZBgECZCu27vfaOXJZCYQLNxwoXkrZBRYv8ZAP37f69r3z9JxLQxdxn9gwqA3oNZAlBBRapJQzxOr6pZBTdI3bbjbu17ZBIwRcF4JCqPDCNLEZCI3bmHwEd2i2niNMYZD"; //fingerPrintPluginKey = 'h5X7a5j14iUZCobI1ZeX'; diff --git a/Frontend/pubspec.lock b/Frontend/pubspec.lock index 2e16827a..f7f7c1af 100644 --- a/Frontend/pubspec.lock +++ b/Frontend/pubspec.lock @@ -45,10 +45,10 @@ packages: dependency: transitive description: name: async - sha256: d2872f9c19731c2e5f10444b14686eb7cc85c76274bd6c16e1816bff9a3bab63 + sha256: "947bfcf187f74dbc5e146c9eb9c0f10c9f8b30743e341481c1e2ed3ecc18c20c" url: "https://pub.dev" source: hosted - version: "2.12.0" + version: "2.11.0" barcode: dependency: transitive description: @@ -85,10 +85,10 @@ packages: dependency: transitive description: name: boolean_selector - sha256: "8aab1771e1243a5063b8b0ff68042d67334e3feab9e95b9490f9a6ebf73b42ea" + sha256: "6cfb5af12253eaf2b368f07bacc5a80d1301a071c73360d746b7f2e32d762c66" url: "https://pub.dev" source: hosted - version: "2.1.2" + version: "2.1.1" buffer: dependency: transitive description: @@ -181,10 +181,10 @@ packages: dependency: transitive description: name: characters - sha256: f71061c654a3380576a52b451dd5532377954cf9dbd272a78fc8479606670803 + sha256: "04a925763edad70e8443c99234dc3328f442e811f1d8fd1a72f1c8ad0f69a605" url: "https://pub.dev" source: hosted - version: "1.4.0" + version: "1.3.0" charcode: dependency: transitive description: @@ -213,10 +213,10 @@ packages: dependency: transitive description: name: clock - sha256: fddb70d9b5277016c77a80201021d40a2247104d9f4aa7bab7157b7e3f05b84b + sha256: cb6d7f03e1de671e34607e909a7213e31d7752be4fb66a86d29fe1eb14bfb5cf url: "https://pub.dev" source: hosted - version: "1.1.2" + version: "1.1.1" code_builder: dependency: transitive description: @@ -229,10 +229,10 @@ packages: dependency: transitive description: name: collection - sha256: "2f5709ae4d3d59dd8f7cd309b4e023046b57d8a6c82130785d2b0e5868084e76" + sha256: a1ace0a119f20aabc852d165077c036cd864315bd99b7eaa10a60100341941bf url: "https://pub.dev" source: hosted - version: "1.19.1" + version: "1.19.0" convert: dependency: transitive description: @@ -333,10 +333,10 @@ packages: dependency: transitive description: name: fake_async - sha256: "6a95e56b2449df2273fd8c45a662d6947ce1ebb7aafe80e550a3f68297f3cacc" + sha256: "511392330127add0b769b75a987850d136345d9227c6b94c96a04cf4a391bf78" url: "https://pub.dev" source: hosted - version: "1.3.2" + version: "1.3.1" fetch_api: dependency: transitive description: @@ -684,18 +684,18 @@ packages: dependency: transitive description: name: leak_tracker - sha256: c35baad643ba394b40aac41080300150a4f08fd0fd6a10378f8f7c6bc161acec + sha256: "7bb2830ebd849694d1ec25bf1f44582d6ac531a57a365a803a6034ff751d2d06" url: "https://pub.dev" source: hosted - version: "10.0.8" + version: "10.0.7" leak_tracker_flutter_testing: dependency: transitive description: name: leak_tracker_flutter_testing - sha256: f8b613e7e6a13ec79cfdc0e97638fddb3ab848452eff057653abd3edba760573 + sha256: "9491a714cca3667b60b5c420da8217e6de0d1ba7a5ec322fab01758f6998f379" url: "https://pub.dev" source: hosted - version: "3.0.9" + version: "3.0.8" leak_tracker_testing: dependency: transitive description: @@ -772,10 +772,10 @@ packages: dependency: transitive description: name: matcher - sha256: dc58c723c3c24bf8d3e2d3ad3f2f9d7bd9cf43ec6feaa64181775e60190153f2 + sha256: d2323aa2060500f906aa31a895b4030b6da3ebdcc5619d14ce1aada65cd161cb url: "https://pub.dev" source: hosted - version: "0.12.17" + version: "0.12.16+1" material_color_utilities: dependency: transitive description: @@ -796,10 +796,10 @@ packages: dependency: transitive description: name: meta - sha256: e3641ec5d63ebf0d9b41bd43201a66e3fc79a65db5f61fc181f04cd27aab950c + sha256: bdb68674043280c3428e9ec998512fb681678676b3c54e773629ffe74419f8c7 url: "https://pub.dev" source: hosted - version: "1.16.0" + version: "1.15.0" mime: dependency: transitive description: @@ -852,10 +852,10 @@ packages: dependency: transitive description: name: path - sha256: "75cca69d1490965be98c73ceaea117e8a04dd21217b37b292c9ddbec0d955bc5" + sha256: "087ce49c3f0dc39180befefc60fdb4acd8f8620e5682fe2476afd0b3688bb4af" url: "https://pub.dev" source: hosted - version: "1.9.1" + version: "1.9.0" path_parsing: dependency: transitive description: @@ -1097,10 +1097,10 @@ packages: dependency: transitive description: name: source_span - sha256: "254ee5351d6cb365c859e20ee823c3bb479bf4a293c22d17a9f1bf144ce86f7c" + sha256: "53e943d4206a5e30df338fd4c6e7a077e02254531b138a15aec3bd143c1a8b3c" url: "https://pub.dev" source: hosted - version: "1.10.1" + version: "1.10.0" sprintf: dependency: transitive description: @@ -1113,18 +1113,18 @@ packages: dependency: transitive description: name: stack_trace - sha256: "8b27215b45d22309b5cddda1aa2b19bdfec9df0e765f2de506401c071d38d1b1" + sha256: "9f47fd3630d76be3ab26f0ee06d213679aa425996925ff3feffdec504931c377" url: "https://pub.dev" source: hosted - version: "1.12.1" + version: "1.12.0" stream_channel: dependency: transitive description: name: stream_channel - sha256: "969e04c80b8bcdf826f8f16579c7b14d780458bd97f56d107d3950fdbeef059d" + sha256: ba2aa5d8cc609d96bbb2899c28934f9e1af5cddbd60a827822ea467161eb54e7 url: "https://pub.dev" source: hosted - version: "2.1.4" + version: "2.1.2" stream_transform: dependency: transitive description: @@ -1137,10 +1137,10 @@ packages: dependency: transitive description: name: string_scanner - sha256: "921cd31725b72fe181906c6a94d987c78e3b98c2e205b397ea399d4054872b43" + sha256: "688af5ed3402a4bde5b3a6c15fd768dbf2621a614950b17f04626c431ab3c4c3" url: "https://pub.dev" source: hosted - version: "1.4.1" + version: "1.3.0" supertokens_flutter: dependency: "direct main" description: @@ -1225,18 +1225,18 @@ packages: dependency: transitive description: name: term_glyph - sha256: "7f554798625ea768a7518313e58f83891c7f5024f88e46e7182a4558850a4b8e" + sha256: a29248a84fbb7c79282b40b8c72a1209db169a2e0542bce341da992fe1bc7e84 url: "https://pub.dev" source: hosted - version: "1.2.2" + version: "1.2.1" test_api: dependency: transitive description: name: test_api - sha256: fb31f383e2ee25fbbfe06b40fe21e1e458d14080e3c67e7ba0acfde4df4e0bbd + sha256: "664d3a9a64782fcdeb83ce9c6b39e78fd2971d4e37827b9b06c3aa1edc5e760c" url: "https://pub.dev" source: hosted - version: "0.7.4" + version: "0.7.3" timing: dependency: transitive description: @@ -1369,10 +1369,10 @@ packages: dependency: transitive description: name: vm_service - sha256: "0968250880a6c5fe7edc067ed0a13d4bae1577fe2771dcf3010d52c4a9d3ca14" + sha256: f6be3ed8bd01289b34d679c2b62226f63c0e69f9fd2e50a6b3c1c729a961041b url: "https://pub.dev" source: hosted - version: "14.3.1" + version: "14.3.0" watcher: dependency: transitive description: @@ -1494,5 +1494,5 @@ packages: source: hosted version: "3.1.1" sdks: - dart: ">=3.7.0-0 <3.9.0" + dart: ">=3.6.0 <3.9.0" flutter: ">=3.27.0" From c456b084ef38e6beba6be91732023c0e3768f91a Mon Sep 17 00:00:00 2001 From: yaso Date: Thu, 10 Apr 2025 12:47:23 +0200 Subject: [PATCH 06/13] Add floating menu to Mzansi Wallet --- .../package_tools/mih_cards.dart | 38 +++++++++++-------- 1 file changed, 22 insertions(+), 16 deletions(-) diff --git a/Frontend/lib/mih_packages/mzansi_wallet/package_tools/mih_cards.dart b/Frontend/lib/mih_packages/mzansi_wallet/package_tools/mih_cards.dart index 649379f6..14e3cb32 100644 --- a/Frontend/lib/mih_packages/mzansi_wallet/package_tools/mih_cards.dart +++ b/Frontend/lib/mih_packages/mzansi_wallet/package_tools/mih_cards.dart @@ -1,3 +1,4 @@ +import 'package:flutter_speed_dial/flutter_speed_dial.dart'; import 'package:mzansi_innovation_hub/main.dart'; import 'package:mzansi_innovation_hub/mih_apis/mih_mzansi_wallet_apis.dart'; import 'package:mzansi_innovation_hub/mih_components/mih_inputs_and_buttons/mih_button.dart'; @@ -7,6 +8,7 @@ import 'package:mzansi_innovation_hub/mih_components/mih_inputs_and_buttons/mih_ import 'package:mzansi_innovation_hub/mih_components/mih_layout/mih_single_child_scroll.dart'; import 'package:mzansi_innovation_hub/mih_components/mih_layout/mih_window.dart'; import 'package:mzansi_innovation_hub/mih_components/mih_package_components/mih-app_tool_body.dart'; +import 'package:mzansi_innovation_hub/mih_components/mih_package_components/mih_floating_menu.dart'; import 'package:mzansi_innovation_hub/mih_components/mih_pop_up_messages/mih_error_message.dart'; import 'package:mzansi_innovation_hub/mih_components/mih_pop_up_messages/mih_loading_circle.dart'; import 'package:mzansi_innovation_hub/mih_objects/app_user.dart'; @@ -316,24 +318,28 @@ class _MihCardsState extends State { ), ), Positioned( - right: 0, - bottom: 0, - child: Container( - decoration: BoxDecoration( - borderRadius: BorderRadius.circular(50), - color: MzanziInnovationHub.of(context)!.theme.secondaryColor(), - ), - child: IconButton( + right: 0, + bottom: 0, + child: MihFloatingMenu(children: [ + SpeedDialChild( + child: Icon( + Icons.add, color: MzanziInnovationHub.of(context)!.theme.primaryColor(), - onPressed: () { - addCardWindow(context); - }, - icon: const Icon( - Icons.add_card, - size: 50, - ), ), - )) + label: "Add", + labelBackgroundColor: + MzanziInnovationHub.of(context)!.theme.secondaryColor(), + labelStyle: TextStyle( + color: MzanziInnovationHub.of(context)!.theme.primaryColor(), + ), + backgroundColor: + MzanziInnovationHub.of(context)!.theme.secondaryColor(), + onTap: () { + addCardWindow(context); + }, + ) + ]), + ) ], ); } From 4b343128417fdb22361881920aab62545f9ef7fb Mon Sep 17 00:00:00 2001 From: yaso Date: Thu, 10 Apr 2025 14:36:34 +0200 Subject: [PATCH 07/13] Add Share_plus package --- .../Flutter/GeneratedPluginRegistrant.swift | 4 ++ Frontend/pubspec.lock | 40 +++++++++++++++++++ Frontend/pubspec.yaml | 1 + .../flutter/generated_plugin_registrant.cc | 3 ++ .../windows/flutter/generated_plugins.cmake | 1 + 5 files changed, 49 insertions(+) diff --git a/Frontend/macos/Flutter/GeneratedPluginRegistrant.swift b/Frontend/macos/Flutter/GeneratedPluginRegistrant.swift index 9ed45910..cea5ee1a 100644 --- a/Frontend/macos/Flutter/GeneratedPluginRegistrant.swift +++ b/Frontend/macos/Flutter/GeneratedPluginRegistrant.swift @@ -11,7 +11,9 @@ import flutter_tts import geolocator_apple import local_auth_darwin import mobile_scanner +import path_provider_foundation import printing +import share_plus import shared_preferences_foundation import syncfusion_pdfviewer_macos import url_launcher_macos @@ -24,7 +26,9 @@ func RegisterGeneratedPlugins(registry: FlutterPluginRegistry) { GeolocatorPlugin.register(with: registry.registrar(forPlugin: "GeolocatorPlugin")) FLALocalAuthPlugin.register(with: registry.registrar(forPlugin: "FLALocalAuthPlugin")) MobileScannerPlugin.register(with: registry.registrar(forPlugin: "MobileScannerPlugin")) + PathProviderPlugin.register(with: registry.registrar(forPlugin: "PathProviderPlugin")) PrintingPlugin.register(with: registry.registrar(forPlugin: "PrintingPlugin")) + SharePlusMacosPlugin.register(with: registry.registrar(forPlugin: "SharePlusMacosPlugin")) SharedPreferencesPlugin.register(with: registry.registrar(forPlugin: "SharedPreferencesPlugin")) SyncfusionFlutterPdfViewerPlugin.register(with: registry.registrar(forPlugin: "SyncfusionFlutterPdfViewerPlugin")) UrlLauncherPlugin.register(with: registry.registrar(forPlugin: "UrlLauncherPlugin")) diff --git a/Frontend/pubspec.lock b/Frontend/pubspec.lock index f7f7c1af..ed6ab1a0 100644 --- a/Frontend/pubspec.lock +++ b/Frontend/pubspec.lock @@ -864,6 +864,30 @@ packages: url: "https://pub.dev" source: hosted version: "1.1.0" + path_provider: + dependency: transitive + description: + name: path_provider + sha256: "50c5dd5b6e1aaf6fb3a78b33f6aa3afca52bf903a8a5298f53101fdaee55bbcd" + url: "https://pub.dev" + source: hosted + version: "2.1.5" + path_provider_android: + dependency: transitive + description: + name: path_provider_android + sha256: "0ca7359dad67fd7063cb2892ab0c0737b2daafd807cf1acecd62374c8fae6c12" + url: "https://pub.dev" + source: hosted + version: "2.2.16" + path_provider_foundation: + dependency: transitive + description: + name: path_provider_foundation + sha256: "4843174df4d288f5e29185bd6e72a6fbdf5a4a4602717eed565497429f179942" + url: "https://pub.dev" + source: hosted + version: "2.4.1" path_provider_linux: dependency: transitive description: @@ -1000,6 +1024,22 @@ packages: url: "https://pub.dev" source: hosted version: "3.0.1" + share_plus: + dependency: "direct main" + description: + name: share_plus + sha256: fce43200aa03ea87b91ce4c3ac79f0cecd52e2a7a56c7a4185023c271fbfa6da + url: "https://pub.dev" + source: hosted + version: "10.1.4" + share_plus_platform_interface: + dependency: transitive + description: + name: share_plus_platform_interface + sha256: cc012a23fc2d479854e6c80150696c4a5f5bb62cb89af4de1c505cf78d0a5d0b + url: "https://pub.dev" + source: hosted + version: "5.0.2" shared_preferences: dependency: transitive description: diff --git a/Frontend/pubspec.yaml b/Frontend/pubspec.yaml index b62cb026..8051ccc2 100644 --- a/Frontend/pubspec.yaml +++ b/Frontend/pubspec.yaml @@ -74,6 +74,7 @@ dependencies: uuid: ^4.5.1 flutter_tts: ^4.2.2 flutter_speed_dial: ^7.0.0 + share_plus: ^10.1.4 dev_dependencies: flutter_test: diff --git a/Frontend/windows/flutter/generated_plugin_registrant.cc b/Frontend/windows/flutter/generated_plugin_registrant.cc index 67aa4f33..cd68881b 100644 --- a/Frontend/windows/flutter/generated_plugin_registrant.cc +++ b/Frontend/windows/flutter/generated_plugin_registrant.cc @@ -11,6 +11,7 @@ #include #include #include +#include #include #include @@ -25,6 +26,8 @@ void RegisterPlugins(flutter::PluginRegistry* registry) { registry->GetRegistrarForPlugin("LocalAuthPlugin")); PrintingPluginRegisterWithRegistrar( registry->GetRegistrarForPlugin("PrintingPlugin")); + SharePlusWindowsPluginCApiRegisterWithRegistrar( + registry->GetRegistrarForPlugin("SharePlusWindowsPluginCApi")); SyncfusionPdfviewerWindowsPluginRegisterWithRegistrar( registry->GetRegistrarForPlugin("SyncfusionPdfviewerWindowsPlugin")); UrlLauncherWindowsRegisterWithRegistrar( diff --git a/Frontend/windows/flutter/generated_plugins.cmake b/Frontend/windows/flutter/generated_plugins.cmake index 524b0632..339c6add 100644 --- a/Frontend/windows/flutter/generated_plugins.cmake +++ b/Frontend/windows/flutter/generated_plugins.cmake @@ -8,6 +8,7 @@ list(APPEND FLUTTER_PLUGIN_LIST geolocator_windows local_auth_windows printing + share_plus syncfusion_pdfviewer_windows url_launcher_windows ) From 762d4302ef0bd8468fbcf6e8b6cb33f5f01f478b Mon Sep 17 00:00:00 2001 From: yaso Date: Thu, 10 Apr 2025 14:36:53 +0200 Subject: [PATCH 08/13] udpate widget param with icons --- .../mih_package_components/mih_floating_menu.dart | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/Frontend/lib/mih_components/mih_package_components/mih_floating_menu.dart b/Frontend/lib/mih_components/mih_package_components/mih_floating_menu.dart index 31eb3c1b..eea4ff96 100644 --- a/Frontend/lib/mih_components/mih_package_components/mih_floating_menu.dart +++ b/Frontend/lib/mih_components/mih_package_components/mih_floating_menu.dart @@ -3,9 +3,13 @@ import 'package:flutter_speed_dial/flutter_speed_dial.dart'; import 'package:mzansi_innovation_hub/main.dart'; class MihFloatingMenu extends StatefulWidget { + final IconData? icon; + final AnimatedIconData? animatedIcon; final List children; const MihFloatingMenu({ super.key, + this.icon, + this.animatedIcon, required this.children, }); @@ -22,7 +26,8 @@ class _MihFloatingMenuState extends State { bottom: 5.0, ), child: SpeedDial( - animatedIcon: AnimatedIcons.menu_close, + icon: widget.icon, + animatedIcon: widget.animatedIcon, activeIcon: Icons.close, backgroundColor: MzanziInnovationHub.of(context)!.theme.secondaryColor(), @@ -30,7 +35,7 @@ class _MihFloatingMenuState extends State { MzanziInnovationHub.of(context)!.theme.errorColor(), foregroundColor: MzanziInnovationHub.of(context)!.theme.primaryColor(), overlayColor: Colors.black, - overlayOpacity: 0, + overlayOpacity: 0.5, children: widget.children, onOpen: () => debugPrint('OPENING DIAL'), onClose: () => debugPrint('DIAL CLOSED'), From c5b421b32281b6137d32bc7a241b3360c55e8fef Mon Sep 17 00:00:00 2001 From: yaso Date: Thu, 10 Apr 2025 14:37:42 +0200 Subject: [PATCH 09/13] Add Floating Menu on Mzansi Wallet & About MIH --- .../about_mih/package_tools/mih_info.dart | 294 ++++++++++++------ .../package_tools/mih_cards.dart | 43 +-- 2 files changed, 218 insertions(+), 119 deletions(-) diff --git a/Frontend/lib/mih_packages/about_mih/package_tools/mih_info.dart b/Frontend/lib/mih_packages/about_mih/package_tools/mih_info.dart index 4795ea74..a7b2b586 100644 --- a/Frontend/lib/mih_packages/about_mih/package_tools/mih_info.dart +++ b/Frontend/lib/mih_packages/about_mih/package_tools/mih_info.dart @@ -1,3 +1,4 @@ +import 'package:flutter_speed_dial/flutter_speed_dial.dart'; import 'package:mzansi_innovation_hub/main.dart'; import 'package:mzansi_innovation_hub/mih_components/mih_inputs_and_buttons/mih_button.dart'; import 'package:mzansi_innovation_hub/mih_components/mih_layout/mih_single_child_scroll.dart'; @@ -6,9 +7,11 @@ import 'package:mzansi_innovation_hub/mih_components/mih_package_components/mih- import 'package:flutter/foundation.dart'; import 'package:flutter/material.dart'; import 'package:font_awesome_flutter/font_awesome_flutter.dart'; +import 'package:mzansi_innovation_hub/mih_components/mih_package_components/mih_floating_menu.dart'; import 'package:mzansi_innovation_hub/mih_components/mih_package_components/mih_icons.dart'; import "package:universal_html/js.dart" as js; import 'package:url_launcher/url_launcher.dart'; +import 'package:share_plus/share_plus.dart'; class MihInfo extends StatefulWidget { const MihInfo({super.key}); @@ -581,6 +584,13 @@ class _MihInfoState extends State { } } + void shareMIHLink(BuildContext context, String message, String link) { + String shareText = "$message: $link"; + Share.share( + shareText, + ); + } + @override Widget build(BuildContext context) { return MihAppToolBody( @@ -590,112 +600,196 @@ class _MihInfoState extends State { } Widget getBody() { - return MihSingleChildScroll( - child: Column( - children: [ - SizedBox( - width: 165, - child: FittedBox( - child: Icon( - MihIcons.mihLogo, - color: MzanziInnovationHub.of(context)!.theme.secondaryColor(), + return Stack( + children: [ + MihSingleChildScroll( + child: Column( + children: [ + SizedBox( + width: 165, + child: FittedBox( + child: Icon( + MihIcons.mihLogo, + color: + MzanziInnovationHub.of(context)!.theme.secondaryColor(), + ), + ), ), - ), - ), - const SizedBox( - height: 10, - ), - const Text( - "Mzansi Innovation Hub", - style: TextStyle( - fontWeight: FontWeight.bold, - fontSize: 30, - ), - ), - const Padding( - padding: EdgeInsets.symmetric(vertical: 10.0), - child: Divider(), - ), - // const SizedBox( - // height: 10, - // ), - Wrap( - alignment: WrapAlignment.start, - crossAxisAlignment: WrapCrossAlignment.start, - spacing: 10, - runSpacing: 10, - children: [ - ourVision(), - ourMission(), + const SizedBox( + height: 10, + ), + const Text( + "Mzansi Innovation Hub", + style: TextStyle( + fontWeight: FontWeight.bold, + fontSize: 30, + ), + ), + const Padding( + padding: EdgeInsets.symmetric(vertical: 10.0), + child: Divider(), + ), + // const SizedBox( + // height: 10, + // ), + Wrap( + alignment: WrapAlignment.start, + crossAxisAlignment: WrapCrossAlignment.start, + spacing: 10, + runSpacing: 10, + children: [ + ourVision(), + ourMission(), + ], + ), + const SizedBox( + height: 10, + ), + Wrap( + alignment: WrapAlignment.start, + crossAxisAlignment: WrapCrossAlignment.start, + spacing: 10, + runSpacing: 10, + children: [ + SizedBox( + width: 300, + height: 50, + child: MIHButton( + onTap: () { + installMihTrigger(); + }, + buttonText: getInstallButtonText(), + buttonColor: MzanziInnovationHub.of(context)! + .theme + .secondaryColor(), + textColor: MzanziInnovationHub.of(context)! + .theme + .primaryColor(), + ), + ), + SizedBox( + width: 300, + height: 50, + child: MIHButton( + onTap: () { + launchSocialUrl( + Uri.parse( + "https://www.youtube.com/playlist?list=PLuT35kJIui0H5kXjxNOZlHoOPZbQLr4qh", + ), + ); + }, + buttonText: "MIH Beginners Guide", + buttonColor: MzanziInnovationHub.of(context)! + .theme + .secondaryColor(), + textColor: MzanziInnovationHub.of(context)! + .theme + .primaryColor(), + ), + ), + ]), + const SizedBox( + height: 10, + ), + const Padding( + padding: EdgeInsets.symmetric(vertical: 10.0), + child: Divider(), + ), + Column( + mainAxisAlignment: MainAxisAlignment.center, + crossAxisAlignment: CrossAxisAlignment.center, + mainAxisSize: MainAxisSize.max, + // spacing: 10, + // runSpacing: 10, + children: [ + founderTitle(), + founderBio(), + ], + ), + const Padding( + padding: EdgeInsets.symmetric(vertical: 10.0), + child: Divider(), + ), + mihSocials(), ], ), - const SizedBox( - height: 10, - ), - Wrap( - alignment: WrapAlignment.start, - crossAxisAlignment: WrapCrossAlignment.start, - spacing: 10, - runSpacing: 10, - children: [ - SizedBox( - width: 300, - height: 50, - child: MIHButton( - onTap: () { - installMihTrigger(); - }, - buttonText: getInstallButtonText(), - buttonColor: - MzanziInnovationHub.of(context)!.theme.secondaryColor(), - textColor: - MzanziInnovationHub.of(context)!.theme.primaryColor(), - ), - ), - SizedBox( - width: 300, - height: 50, - child: MIHButton( - onTap: () { - launchSocialUrl( - Uri.parse( - "https://www.youtube.com/playlist?list=PLuT35kJIui0H5kXjxNOZlHoOPZbQLr4qh", - ), - ); - }, - buttonText: "MIH Beginners Guide", - buttonColor: - MzanziInnovationHub.of(context)!.theme.secondaryColor(), - textColor: - MzanziInnovationHub.of(context)!.theme.primaryColor(), - ), - ), - ]), - const SizedBox( - height: 10, - ), - const Padding( - padding: EdgeInsets.symmetric(vertical: 10.0), - child: Divider(), - ), - Column( - mainAxisAlignment: MainAxisAlignment.center, - crossAxisAlignment: CrossAxisAlignment.center, - mainAxisSize: MainAxisSize.max, - // spacing: 10, - // runSpacing: 10, + ), + Positioned( + right: 0, + bottom: 0, + child: MihFloatingMenu( + icon: Icons.share, children: [ - founderTitle(), - founderBio(), + SpeedDialChild( + child: Icon( + Icons.vpn_lock, + color: MzanziInnovationHub.of(context)!.theme.primaryColor(), + ), + label: "MIH - Web", + labelBackgroundColor: + MzanziInnovationHub.of(context)!.theme.successColor(), + labelStyle: TextStyle( + color: MzanziInnovationHub.of(context)!.theme.primaryColor(), + fontWeight: FontWeight.bold, + ), + backgroundColor: + MzanziInnovationHub.of(context)!.theme.successColor(), + onTap: () { + shareMIHLink( + context, + "Check out the MIH app on the Web", + "https://app.mzansi-innovation-hub.co.za/", + ); + }, + ), + SpeedDialChild( + child: Icon( + Icons.apple, + color: MzanziInnovationHub.of(context)!.theme.primaryColor(), + ), + label: "MIH - iOS", + labelBackgroundColor: + MzanziInnovationHub.of(context)!.theme.successColor(), + labelStyle: TextStyle( + color: MzanziInnovationHub.of(context)!.theme.primaryColor(), + fontWeight: FontWeight.bold, + ), + backgroundColor: + MzanziInnovationHub.of(context)!.theme.successColor(), + onTap: () { + shareMIHLink( + context, + "Check out the MIH app on the App Store", + "https://apps.apple.com/za/app/mzansi-innovation-hub/id6743310890", + ); + }, + ), + SpeedDialChild( + child: Icon( + Icons.android, + color: MzanziInnovationHub.of(context)!.theme.primaryColor(), + ), + label: "MIH - Android", + labelBackgroundColor: + MzanziInnovationHub.of(context)!.theme.successColor(), + labelStyle: TextStyle( + color: MzanziInnovationHub.of(context)!.theme.primaryColor(), + fontWeight: FontWeight.bold, + ), + backgroundColor: + MzanziInnovationHub.of(context)!.theme.successColor(), + onTap: () { + shareMIHLink( + context, + "Check out the MIH app on the Play Store", + "https://play.google.com/store/apps/details?id=za.co.mzansiinnovationhub.mih", + ); + }, + ), ], ), - const Padding( - padding: EdgeInsets.symmetric(vertical: 10.0), - child: Divider(), - ), - mihSocials(), - ], - ), + ) + ], ); } } diff --git a/Frontend/lib/mih_packages/mzansi_wallet/package_tools/mih_cards.dart b/Frontend/lib/mih_packages/mzansi_wallet/package_tools/mih_cards.dart index 14e3cb32..f1cab19d 100644 --- a/Frontend/lib/mih_packages/mzansi_wallet/package_tools/mih_cards.dart +++ b/Frontend/lib/mih_packages/mzansi_wallet/package_tools/mih_cards.dart @@ -320,25 +320,30 @@ class _MihCardsState extends State { Positioned( right: 0, bottom: 0, - child: MihFloatingMenu(children: [ - SpeedDialChild( - child: Icon( - Icons.add, - color: MzanziInnovationHub.of(context)!.theme.primaryColor(), - ), - label: "Add", - labelBackgroundColor: - MzanziInnovationHub.of(context)!.theme.secondaryColor(), - labelStyle: TextStyle( - color: MzanziInnovationHub.of(context)!.theme.primaryColor(), - ), - backgroundColor: - MzanziInnovationHub.of(context)!.theme.secondaryColor(), - onTap: () { - addCardWindow(context); - }, - ) - ]), + child: MihFloatingMenu( + animatedIcon: AnimatedIcons.menu_close, + children: [ + SpeedDialChild( + child: Icon( + Icons.add, + color: + MzanziInnovationHub.of(context)!.theme.primaryColor(), + ), + label: "Add Card", + labelBackgroundColor: + MzanziInnovationHub.of(context)!.theme.successColor(), + labelStyle: TextStyle( + color: + MzanziInnovationHub.of(context)!.theme.primaryColor(), + fontWeight: FontWeight.bold, + ), + backgroundColor: + MzanziInnovationHub.of(context)!.theme.successColor(), + onTap: () { + addCardWindow(context); + }, + ) + ]), ) ], ); From ab95f808090dec0408ee085c3edb70de773e79d3 Mon Sep 17 00:00:00 2001 From: Yasien Mac Mini Date: Fri, 11 Apr 2025 09:49:49 +0200 Subject: [PATCH 10/13] Add floating action to Mzansi AI --- .../mzansi_ai/package_tools/ai_chat.dart | 239 ++++++++++++------ 1 file changed, 158 insertions(+), 81 deletions(-) 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 0294008b..b8762cb1 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 @@ -1,11 +1,13 @@ import 'dart:async'; import 'dart:convert'; +import 'package:flutter_speed_dial/flutter_speed_dial.dart'; import 'package:mzansi_innovation_hub/main.dart'; import 'package:mzansi_innovation_hub/mih_components/mih_inputs_and_buttons/mih_dropdown_input.dart'; import 'package:mzansi_innovation_hub/mih_components/mih_inputs_and_buttons/mih_text_input.dart'; import 'package:mzansi_innovation_hub/mih_components/mih_package_components/mih-app_tool_body.dart'; import 'package:mzansi_innovation_hub/mih_components/mih_package_components/mih_app_window.dart'; +import 'package:mzansi_innovation_hub/mih_components/mih_package_components/mih_floating_menu.dart'; import 'package:mzansi_innovation_hub/mih_components/mih_pop_up_messages/mih_loading_circle.dart'; import 'package:mzansi_innovation_hub/mih_env/env.dart'; import 'package:mzansi_innovation_hub/mih_objects/app_user.dart'; @@ -69,6 +71,7 @@ class _AiChatState extends State { } void _handleSendPressed(types.PartialText message) { + FocusScope.of(context).unfocus(); final textMessage = types.TextMessage( author: _user, createdAt: DateTime.now().millisecondsSinceEpoch, @@ -349,7 +352,7 @@ class _AiChatState extends State { return Visibility( visible: value, child: Padding( - padding: const EdgeInsets.all(5.0), + padding: const EdgeInsets.all(10.0), child: Align( alignment: Alignment.centerLeft, child: FittedBox( @@ -615,95 +618,169 @@ class _AiChatState extends State { Widget build(BuildContext context) { return MihAppToolBody( borderOn: false, - bodyItem: Column( - mainAxisAlignment: MainAxisAlignment.spaceEvenly, - mainAxisSize: MainAxisSize.max, - children: [ - Row( - mainAxisAlignment: MainAxisAlignment.center, + bodyItem: getBody(), + ); + } + + Widget getBody() { + return Stack( + children: [ + Column( + mainAxisAlignment: MainAxisAlignment.spaceEvenly, + mainAxisSize: MainAxisSize.max, + children: [ + Row( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + // Visibility( + // visible: _showModelOptions.value == true, + // child: IconButton.filled( + // iconSize: 20, + // onPressed: () { + // if (_showModelOptions.value == true) { + // setState(() { + // _showModelOptions.value = false; + // }); + // } else { + // setState(() { + // _showModelOptions.value = true; + // }); + // } + // }, + // icon: const Icon( + // Icons.settings, + // ), + // ), + // ), + Expanded( + child: Text( + "Mzansi AI", + textAlign: TextAlign.center, + style: TextStyle( + fontSize: 25, + fontWeight: FontWeight.bold, + color: MzanziInnovationHub.of(context)! + .theme + .secondaryColor(), + ), + ), + ), + // Expanded( + // child: Container( + // alignment: Alignment.centerRight, + // child: IconButton( + // onPressed: () { + // _resetChat(); + // }, + // icon: const Icon(Icons.refresh), + // ), + // ), + // ), + ], + ), + _getSettings(), + Expanded( + child: GestureDetector( + onTap: () { + if (_showModelOptions.value == true) { + setState(() { + _showModelOptions.value = false; + }); + } + }, + child: Chat( + messages: _messages, + // onAttachmentPressed: _handleAttachmentPressed, + // onMessageTap: _handleMessageTap, + // onPreviewDataFetched: _handlePreviewDataFetched, + onSendPressed: _handleSendPressed, + showUserAvatars: false, + showUserNames: false, + user: _user, + theme: getChatTheme(), + ), + ), + ) + ], + ), + Positioned( + left: 0, + top: 0, + child: Visibility( + visible: _showModelOptions.value == true, + child: IconButton.filled( + iconSize: 20, + onPressed: () { + if (_showModelOptions.value == true) { + setState(() { + _showModelOptions.value = false; + }); + } else { + setState(() { + _showModelOptions.value = true; + }); + } + }, + icon: const Icon( + Icons.settings, + ), + ), + ), + ), + Positioned( + right: 0, + bottom: 70, + child: MihFloatingMenu( + animatedIcon: AnimatedIcons.menu_close, children: [ - Expanded( - child: Container( - alignment: Alignment.centerLeft, - child: Row( - children: [ - Visibility( - visible: _showModelOptions.value == false, - child: IconButton( - onPressed: () { - if (_showModelOptions.value == true) { - setState(() { - _showModelOptions.value = false; - }); - } else { - setState(() { - _showModelOptions.value = true; - }); - } - }, - icon: const Icon(Icons.settings), - ), - ), - Visibility( - visible: _showModelOptions.value == true, - child: IconButton.filled( - onPressed: () { - if (_showModelOptions.value == true) { - setState(() { - _showModelOptions.value = false; - }); - } else { - setState(() { - _showModelOptions.value = true; - }); - } - }, - icon: const Icon(Icons.settings), - ), - ), - ], - ), + SpeedDialChild( + child: Icon( + Icons.refresh, + color: MzanziInnovationHub.of(context)!.theme.primaryColor(), ), - ), - Text( - "Mzansi AI", - textAlign: TextAlign.center, - style: TextStyle( - fontSize: 25, + label: "New Chat", + labelBackgroundColor: + MzanziInnovationHub.of(context)!.theme.successColor(), + labelStyle: TextStyle( + color: MzanziInnovationHub.of(context)!.theme.primaryColor(), fontWeight: FontWeight.bold, - color: - MzanziInnovationHub.of(context)!.theme.secondaryColor(), ), + backgroundColor: + MzanziInnovationHub.of(context)!.theme.successColor(), + onTap: () { + _resetChat(); + }, ), - Expanded( - child: Container( - alignment: Alignment.centerRight, - child: IconButton( - onPressed: () { - _resetChat(); - }, - icon: const Icon(Icons.refresh), - ), + SpeedDialChild( + child: Icon( + Icons.settings, + color: MzanziInnovationHub.of(context)!.theme.primaryColor(), ), + label: "Settings", + labelBackgroundColor: + MzanziInnovationHub.of(context)!.theme.successColor(), + labelStyle: TextStyle( + color: MzanziInnovationHub.of(context)!.theme.primaryColor(), + fontWeight: FontWeight.bold, + ), + backgroundColor: + MzanziInnovationHub.of(context)!.theme.successColor(), + onTap: () { + if (_showModelOptions.value == true) { + setState(() { + _showModelOptions.value = false; + }); + } else { + setState(() { + _showModelOptions.value = true; + }); + } + }, ), ], ), - _getSettings(), - Expanded( - child: Chat( - messages: _messages, - // onAttachmentPressed: _handleAttachmentPressed, - // onMessageTap: _handleMessageTap, - // onPreviewDataFetched: _handlePreviewDataFetched, - onSendPressed: _handleSendPressed, - showUserAvatars: false, - showUserNames: false, - user: _user, - theme: getChatTheme(), - ), - ) - ], - ), + ), + ], ); } } From fe1a79480ebe54a81d9e6d73cfaddb2da9afcb2c Mon Sep 17 00:00:00 2001 From: Yasien Mac Mini Date: Fri, 11 Apr 2025 09:54:54 +0200 Subject: [PATCH 11/13] Add floating action to calendar --- .../calendar/package_tools/appointments.dart | 43 ++++++++++++------- 1 file changed, 27 insertions(+), 16 deletions(-) diff --git a/Frontend/lib/mih_packages/calendar/package_tools/appointments.dart b/Frontend/lib/mih_packages/calendar/package_tools/appointments.dart index a2530d90..9469fbc0 100644 --- a/Frontend/lib/mih_packages/calendar/package_tools/appointments.dart +++ b/Frontend/lib/mih_packages/calendar/package_tools/appointments.dart @@ -1,3 +1,4 @@ +import 'package:flutter_speed_dial/flutter_speed_dial.dart'; import 'package:mzansi_innovation_hub/mih_apis/mih_mzansi_calendar_apis.dart'; import 'package:mzansi_innovation_hub/mih_components/mih_inputs_and_buttons/mih_button.dart'; import 'package:mzansi_innovation_hub/mih_components/mih_inputs_and_buttons/mih_date_input.dart'; @@ -7,6 +8,7 @@ import 'package:mzansi_innovation_hub/mih_components/mih_inputs_and_buttons/mih_ import 'package:mzansi_innovation_hub/mih_components/mih_layout/mih_single_child_scroll.dart'; import 'package:mzansi_innovation_hub/mih_components/mih_layout/mih_window.dart'; import 'package:mzansi_innovation_hub/mih_components/mih_package_components/mih-app_tool_body.dart'; +import 'package:mzansi_innovation_hub/mih_components/mih_package_components/mih_floating_menu.dart'; import 'package:mzansi_innovation_hub/mih_components/mih_pop_up_messages/mih_error_message.dart'; import 'package:mzansi_innovation_hub/mih_objects/appointment.dart'; import 'package:mzansi_innovation_hub/mih_objects/business.dart'; @@ -300,24 +302,33 @@ class _PatientAccessRequestState extends State { ), ), Positioned( - right: 0, - bottom: 0, - child: Container( - decoration: BoxDecoration( - borderRadius: BorderRadius.circular(50), - color: MzanziInnovationHub.of(context)!.theme.secondaryColor(), - ), - child: IconButton( - color: MzanziInnovationHub.of(context)!.theme.primaryColor(), - onPressed: () { + right: 0, + bottom: 0, + child: MihFloatingMenu( + icon: Icons.add, + animatedIcon: AnimatedIcons.menu_close, + children: [ + SpeedDialChild( + child: Icon( + Icons.add, + color: MzanziInnovationHub.of(context)!.theme.primaryColor(), + ), + label: "Add Card", + labelBackgroundColor: + MzanziInnovationHub.of(context)!.theme.successColor(), + labelStyle: TextStyle( + color: MzanziInnovationHub.of(context)!.theme.primaryColor(), + fontWeight: FontWeight.bold, + ), + backgroundColor: + MzanziInnovationHub.of(context)!.theme.successColor(), + onTap: () { addAppointmentWindow(); }, - icon: const Icon( - Icons.add, - size: 50, - ), - ), - )) + ) + ], + ), + ), ], ); } From 9b12ad70b97133b734d3b40f791feaec414e7144 Mon Sep 17 00:00:00 2001 From: Yasien Mac Mini Date: Fri, 11 Apr 2025 10:57:49 +0200 Subject: [PATCH 12/13] remnove dev apps --- .../package_tools/mih_personal_home.dart | 42 ++++++++++--------- 1 file changed, 22 insertions(+), 20 deletions(-) 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 b1574e53..837e0e3c 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 @@ -128,27 +128,29 @@ class _MihPersonalHomeState extends State { //=============== About MIH =============== temp.add({"About MIH": AboutMihTile(packageSize: packageSize)}); //=============== Dev =============== - temp.add({ - "test": MihAppTile( - onTap: () { - Navigator.of(context).pushNamed( - '/package-dev', - //arguments: widget.signedInUser, - ); - }, - appName: "Test", - appIcon: Container( - padding: const EdgeInsets.all(0.5), - child: Icon( - Icons.warning_amber_rounded, - color: MzanziInnovationHub.of(context)!.theme.primaryColor(), + if (widget.isDevActive) { + temp.add({ + "test": MihAppTile( + onTap: () { + Navigator.of(context).pushNamed( + '/package-dev', + //arguments: widget.signedInUser, + ); + }, + appName: "Test", + appIcon: Container( + padding: const EdgeInsets.all(0.5), + child: Icon( + Icons.warning_amber_rounded, + color: MzanziInnovationHub.of(context)!.theme.primaryColor(), + ), ), - ), - iconSize: packageSize, - primaryColor: MzanziInnovationHub.of(context)!.theme.secondaryColor(), - secondaryColor: MzanziInnovationHub.of(context)!.theme.primaryColor(), - ) - }); + iconSize: packageSize, + primaryColor: MzanziInnovationHub.of(context)!.theme.secondaryColor(), + secondaryColor: MzanziInnovationHub.of(context)!.theme.primaryColor(), + ) + }); + } return temp; } From 27af9fde33775dc2f672387f06b8c145ea721504 Mon Sep 17 00:00:00 2001 From: Yasien Mac Mini Date: Fri, 11 Apr 2025 10:58:10 +0200 Subject: [PATCH 13/13] Add floating action to Patient Profile and manager --- Frontend/lib/mih_env/env.dart | 12 +- .../patient_claim_or_statement.dart | 124 ++++++++---- .../package_tools/patient_consultation.dart | 119 +++++++---- .../package_tools/patient_documents.dart | 188 ++++++++++++++---- .../package_tools/patient_info.dart | 123 +++++++----- Frontend/pubspec.lock | 74 +++---- 6 files changed, 445 insertions(+), 195 deletions(-) diff --git a/Frontend/lib/mih_env/env.dart b/Frontend/lib/mih_env/env.dart index f86f1312..c96e44e0 100644 --- a/Frontend/lib/mih_env/env.dart +++ b/Frontend/lib/mih_env/env.dart @@ -15,13 +15,13 @@ abstract class AppEnviroment { case Enviroment.dev: { //================= Android Dev Urls ================= - // baseApiUrl = "http://10.0.2.2:8080"; - // baseFileUrl = "http://10.0.2.2:9000"; - // baseAiUrl = "http://10.0.2.2:11434"; + baseApiUrl = "http://10.0.2.2:8080"; + baseFileUrl = "http://10.0.2.2:9000"; + baseAiUrl = "http://10.0.2.2:11434"; //================= Web Dev Urls ================= - baseApiUrl = "http://localhost:8080"; - baseFileUrl = "http://localhost:9000"; - baseAiUrl = "http://localhost:11434"; + // baseApiUrl = "http://localhost:8080"; + // baseFileUrl = "http://localhost:9000"; + // baseAiUrl = "http://localhost:11434"; whatsappAccessToken = "EAAPINXuNFdYBOzBjTcvZA2iPXEHbHRF9uNXyP3ihkPRUcBqKNru5g9NKRRKkFaiaITEzO3BMo6CjdUmlDH4qYTW2mzDrZB4Q21ZCEZBgECZCu27vfaOXJZCYQLNxwoXkrZBRYv8ZAP37f69r3z9JxLQxdxn9gwqA3oNZAlBBRapJQzxOr6pZBTdI3bbjbu17ZBIwRcF4JCqPDCNLEZCI3bmHwEd2i2niNMYZD"; //fingerPrintPluginKey = 'h5X7a5j14iUZCobI1ZeX'; diff --git a/Frontend/lib/mih_packages/patient_profile/pat_profile/package_tools/patient_claim_or_statement.dart b/Frontend/lib/mih_packages/patient_profile/pat_profile/package_tools/patient_claim_or_statement.dart index 48e09a18..c5b95028 100644 --- a/Frontend/lib/mih_packages/patient_profile/pat_profile/package_tools/patient_claim_or_statement.dart +++ b/Frontend/lib/mih_packages/patient_profile/pat_profile/package_tools/patient_claim_or_statement.dart @@ -1,6 +1,8 @@ +import 'package:flutter_speed_dial/flutter_speed_dial.dart'; import 'package:mzansi_innovation_hub/main.dart'; import 'package:mzansi_innovation_hub/mih_apis/mih_claim_statement_generation_api.dart'; import 'package:mzansi_innovation_hub/mih_components/mih_package_components/mih-app_tool_body.dart'; +import 'package:mzansi_innovation_hub/mih_components/mih_package_components/mih_floating_menu.dart'; import 'package:mzansi_innovation_hub/mih_components/mih_pop_up_messages/mih_loading_circle.dart'; import 'package:mzansi_innovation_hub/mih_objects/app_user.dart'; import 'package:mzansi_innovation_hub/mih_objects/business.dart'; @@ -110,42 +112,92 @@ class _PatientClaimOrStatementState extends State { } Widget getBody() { - return FutureBuilder( - future: futueFiles, - builder: (context, snapshot) { - if (snapshot.connectionState == ConnectionState.waiting) { - return const Center( - child: Mihloadingcircle(), - ); - } else if (snapshot.hasData) { - final filesList = snapshot.data!; - return Column( - children: [ - Row( - mainAxisAlignment: MainAxisAlignment.center, - children: setIcons(), - ), - Divider( - color: - MzanziInnovationHub.of(context)!.theme.secondaryColor()), - const SizedBox(height: 10), - //const Placeholder(), - BuildClaimStatementFileList( - files: filesList, - signedInUser: widget.signedInUser, - selectedPatient: widget.selectedPatient, - business: widget.business, - businessUser: widget.businessUser, - type: widget.type, - ), - ], - ); - } else { - return const Center( - child: Text("Error Loading Notes"), - ); - } - }, + return Stack( + children: [ + FutureBuilder( + future: futueFiles, + builder: (context, snapshot) { + if (snapshot.connectionState == ConnectionState.waiting) { + return const Center( + child: Mihloadingcircle(), + ); + } else if (snapshot.hasData) { + final filesList = snapshot.data!; + return Column( + children: [ + Row( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + Text( + "Claims/ Statements", + textAlign: TextAlign.center, + style: TextStyle( + fontSize: 25, + fontWeight: FontWeight.bold, + color: MzanziInnovationHub.of(context)! + .theme + .secondaryColor(), + ), + ), + ], + ), + Divider( + color: MzanziInnovationHub.of(context)! + .theme + .secondaryColor()), + const SizedBox(height: 10), + //const Placeholder(), + BuildClaimStatementFileList( + files: filesList, + signedInUser: widget.signedInUser, + selectedPatient: widget.selectedPatient, + business: widget.business, + businessUser: widget.businessUser, + type: widget.type, + ), + ], + ); + } else { + return const Center( + child: Text("Error Loading Notes"), + ); + } + }, + ), + Visibility( + visible: widget.type != "personal", + child: Positioned( + right: 0, + bottom: 0, + child: MihFloatingMenu( + icon: Icons.file_copy, + animatedIcon: AnimatedIcons.menu_close, + children: [ + SpeedDialChild( + child: Icon( + Icons.add, + color: + MzanziInnovationHub.of(context)!.theme.primaryColor(), + ), + label: "Generate Claim/ Statement", + labelBackgroundColor: + MzanziInnovationHub.of(context)!.theme.successColor(), + labelStyle: TextStyle( + color: + MzanziInnovationHub.of(context)!.theme.primaryColor(), + fontWeight: FontWeight.bold, + ), + backgroundColor: + MzanziInnovationHub.of(context)!.theme.successColor(), + onTap: () { + claimOrStatementWindow(); + }, + ) + ], + ), + ), + ), + ], ); } } diff --git a/Frontend/lib/mih_packages/patient_profile/pat_profile/package_tools/patient_consultation.dart b/Frontend/lib/mih_packages/patient_profile/pat_profile/package_tools/patient_consultation.dart index 39d0fa92..a30c3d0b 100644 --- a/Frontend/lib/mih_packages/patient_profile/pat_profile/package_tools/patient_consultation.dart +++ b/Frontend/lib/mih_packages/patient_profile/pat_profile/package_tools/patient_consultation.dart @@ -1,4 +1,5 @@ import 'dart:convert'; +import 'package:flutter_speed_dial/flutter_speed_dial.dart'; import 'package:mzansi_innovation_hub/main.dart'; import 'package:mzansi_innovation_hub/mih_components/mih_inputs_and_buttons/mih_button.dart'; import 'package:mzansi_innovation_hub/mih_components/mih_inputs_and_buttons/mih_multiline_text_input.dart'; @@ -6,6 +7,7 @@ import 'package:mzansi_innovation_hub/mih_components/mih_inputs_and_buttons/mih_ import 'package:mzansi_innovation_hub/mih_components/mih_layout/mih_single_child_scroll.dart'; import 'package:mzansi_innovation_hub/mih_components/mih_layout/mih_window.dart'; import 'package:mzansi_innovation_hub/mih_components/mih_package_components/mih-app_tool_body.dart'; +import 'package:mzansi_innovation_hub/mih_components/mih_package_components/mih_floating_menu.dart'; import 'package:mzansi_innovation_hub/mih_components/mih_pop_up_messages/mih_error_message.dart'; import 'package:mzansi_innovation_hub/mih_components/mih_pop_up_messages/mih_loading_circle.dart'; import 'package:mzansi_innovation_hub/mih_components/mih_pop_up_messages/mih_success_message.dart'; @@ -321,41 +323,88 @@ class _PatientConsultationState extends State { } Widget getBody() { - return MihSingleChildScroll( - child: FutureBuilder( - future: futueNotes, - builder: (context, snapshot) { - if (snapshot.connectionState == ConnectionState.waiting) { - return const Center( - child: Mihloadingcircle(), - ); - } else if (snapshot.hasData) { - final notesList = snapshot.data!; - return Column(children: [ - Row( - mainAxisAlignment: MainAxisAlignment.center, - children: setIcons(), - ), - Divider( - color: - MzanziInnovationHub.of(context)!.theme.secondaryColor()), - const SizedBox(height: 10), - BuildNotesList( - notes: notesList, - signedInUser: widget.signedInUser, - selectedPatient: widget.selectedPatient, - business: widget.business, - businessUser: widget.businessUser, - type: widget.type, - ), - ]); - } else { - return const Center( - child: Text("Error Loading Notes"), - ); - } - }, - ), + return Stack( + children: [ + MihSingleChildScroll( + child: FutureBuilder( + future: futueNotes, + builder: (context, snapshot) { + if (snapshot.connectionState == ConnectionState.waiting) { + return const Center( + child: Mihloadingcircle(), + ); + } else if (snapshot.hasData) { + final notesList = snapshot.data!; + return Column(children: [ + Row( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + Text( + "Consultation Notes", + textAlign: TextAlign.center, + style: TextStyle( + fontSize: 25, + fontWeight: FontWeight.bold, + color: MzanziInnovationHub.of(context)! + .theme + .secondaryColor()), + ), + ], + ), + Divider( + color: MzanziInnovationHub.of(context)! + .theme + .secondaryColor()), + const SizedBox(height: 10), + BuildNotesList( + notes: notesList, + signedInUser: widget.signedInUser, + selectedPatient: widget.selectedPatient, + business: widget.business, + businessUser: widget.businessUser, + type: widget.type, + ), + ]); + } else { + return const Center( + child: Text("Error Loading Notes"), + ); + } + }, + ), + ), + Visibility( + visible: widget.type != "personal", + child: Positioned( + right: 0, + bottom: 0, + child: MihFloatingMenu( + icon: Icons.add, + animatedIcon: AnimatedIcons.menu_close, + children: [ + SpeedDialChild( + child: Icon( + Icons.add, + color: + MzanziInnovationHub.of(context)!.theme.primaryColor(), + ), + label: "Add Note", + labelBackgroundColor: + MzanziInnovationHub.of(context)!.theme.successColor(), + labelStyle: TextStyle( + color: + MzanziInnovationHub.of(context)!.theme.primaryColor(), + fontWeight: FontWeight.bold, + ), + backgroundColor: + MzanziInnovationHub.of(context)!.theme.successColor(), + onTap: () {}, + ) + ], + ), + ), + ), + ], ); } } diff --git a/Frontend/lib/mih_packages/patient_profile/pat_profile/package_tools/patient_documents.dart b/Frontend/lib/mih_packages/patient_profile/pat_profile/package_tools/patient_documents.dart index 740273a0..fd31970a 100644 --- a/Frontend/lib/mih_packages/patient_profile/pat_profile/package_tools/patient_documents.dart +++ b/Frontend/lib/mih_packages/patient_profile/pat_profile/package_tools/patient_documents.dart @@ -1,5 +1,6 @@ import 'dart:convert'; +import 'package:flutter_speed_dial/flutter_speed_dial.dart'; import 'package:mzansi_innovation_hub/main.dart'; import 'package:mzansi_innovation_hub/mih_components/med_cert_input.dart'; import 'package:mzansi_innovation_hub/mih_components/mih_inputs_and_buttons/mih_button.dart'; @@ -7,6 +8,7 @@ import 'package:mzansi_innovation_hub/mih_components/mih_inputs_and_buttons/mih_ import 'package:mzansi_innovation_hub/mih_components/mih_layout/mih_single_child_scroll.dart'; import 'package:mzansi_innovation_hub/mih_components/mih_layout/mih_window.dart'; import 'package:mzansi_innovation_hub/mih_components/mih_package_components/mih-app_tool_body.dart'; +import 'package:mzansi_innovation_hub/mih_components/mih_package_components/mih_floating_menu.dart'; import 'package:mzansi_innovation_hub/mih_components/mih_pop_up_messages/mih_error_message.dart'; import 'package:mzansi_innovation_hub/mih_components/mih_pop_up_messages/mih_loading_circle.dart'; import 'package:mzansi_innovation_hub/mih_components/mih_pop_up_messages/mih_success_message.dart'; @@ -372,6 +374,104 @@ class _PatientDocumentsState extends State { } } + Widget getMenu() { + if (widget.type == "personal") { + return Positioned( + right: 0, + bottom: 0, + child: MihFloatingMenu( + icon: Icons.add, + animatedIcon: AnimatedIcons.menu_close, + children: [ + SpeedDialChild( + child: Icon( + Icons.attach_file, + color: MzanziInnovationHub.of(context)!.theme.primaryColor(), + ), + label: "Attach Document", + labelBackgroundColor: + MzanziInnovationHub.of(context)!.theme.successColor(), + labelStyle: TextStyle( + color: MzanziInnovationHub.of(context)!.theme.primaryColor(), + fontWeight: FontWeight.bold, + ), + backgroundColor: + MzanziInnovationHub.of(context)!.theme.successColor(), + onTap: () { + uploudFilePopUp(); + }, + ) + ], + ), + ); + } else { + return Positioned( + right: 0, + bottom: 0, + child: MihFloatingMenu( + icon: Icons.add, + animatedIcon: AnimatedIcons.menu_close, + children: [ + SpeedDialChild( + child: Icon( + Icons.attach_file, + color: MzanziInnovationHub.of(context)!.theme.primaryColor(), + ), + label: "Add Document", + labelBackgroundColor: + MzanziInnovationHub.of(context)!.theme.successColor(), + labelStyle: TextStyle( + color: MzanziInnovationHub.of(context)!.theme.primaryColor(), + fontWeight: FontWeight.bold, + ), + backgroundColor: + MzanziInnovationHub.of(context)!.theme.successColor(), + onTap: () { + uploudFilePopUp(); + }, + ), + SpeedDialChild( + child: Icon( + Icons.sick_outlined, + color: MzanziInnovationHub.of(context)!.theme.primaryColor(), + ), + label: "Generate Medical Certificate", + labelBackgroundColor: + MzanziInnovationHub.of(context)!.theme.successColor(), + labelStyle: TextStyle( + color: MzanziInnovationHub.of(context)!.theme.primaryColor(), + fontWeight: FontWeight.bold, + ), + backgroundColor: + MzanziInnovationHub.of(context)!.theme.successColor(), + onTap: () { + medCertPopUp(); + }, + ), + SpeedDialChild( + child: Icon( + Icons.medication, + color: MzanziInnovationHub.of(context)!.theme.primaryColor(), + ), + label: "Generate Prescription", + labelBackgroundColor: + MzanziInnovationHub.of(context)!.theme.successColor(), + labelStyle: TextStyle( + color: MzanziInnovationHub.of(context)!.theme.primaryColor(), + fontWeight: FontWeight.bold, + ), + backgroundColor: + MzanziInnovationHub.of(context)!.theme.successColor(), + onTap: () { + prescritionPopUp(); + }, + ), + ], + ), + ); + } + } + List setIcons() { if (widget.type == "personal") { return [ @@ -488,41 +588,59 @@ class _PatientDocumentsState extends State { } Widget getBody() { - return MihSingleChildScroll( - child: FutureBuilder( - future: futueFiles, - builder: (context, snapshot) { - if (snapshot.connectionState == ConnectionState.waiting) { - return const Center( - child: Mihloadingcircle(), - ); - } else if (snapshot.hasData) { - final filesList = snapshot.data!; - return Column(children: [ - Row( - mainAxisAlignment: MainAxisAlignment.center, - children: setIcons(), - ), - Divider( - color: - MzanziInnovationHub.of(context)!.theme.secondaryColor()), - const SizedBox(height: 10), - BuildFilesList( - files: filesList, - signedInUser: widget.signedInUser, - selectedPatient: widget.selectedPatient, - business: widget.business, - businessUser: widget.businessUser, - type: widget.type, - ), - ]); - } else { - return const Center( - child: Text("Error Loading Notes"), - ); - } - }, - ), + return Stack( + children: [ + MihSingleChildScroll( + child: FutureBuilder( + future: futueFiles, + builder: (context, snapshot) { + if (snapshot.connectionState == ConnectionState.waiting) { + return const Center( + child: Mihloadingcircle(), + ); + } else if (snapshot.hasData) { + final filesList = snapshot.data!; + return Column(children: [ + Row( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + Text( + "Documents", + textAlign: TextAlign.center, + style: TextStyle( + fontSize: 25, + fontWeight: FontWeight.bold, + color: MzanziInnovationHub.of(context)! + .theme + .secondaryColor(), + ), + ), + ], + ), + Divider( + color: MzanziInnovationHub.of(context)! + .theme + .secondaryColor()), + const SizedBox(height: 10), + BuildFilesList( + files: filesList, + signedInUser: widget.signedInUser, + selectedPatient: widget.selectedPatient, + business: widget.business, + businessUser: widget.businessUser, + type: widget.type, + ), + ]); + } else { + return const Center( + child: Text("Error Loading Notes"), + ); + } + }, + ), + ), + getMenu(), + ], ); } } diff --git a/Frontend/lib/mih_packages/patient_profile/pat_profile/package_tools/patient_info.dart b/Frontend/lib/mih_packages/patient_profile/pat_profile/package_tools/patient_info.dart index 68669501..d435be7e 100644 --- a/Frontend/lib/mih_packages/patient_profile/pat_profile/package_tools/patient_info.dart +++ b/Frontend/lib/mih_packages/patient_profile/pat_profile/package_tools/patient_info.dart @@ -1,7 +1,9 @@ +import 'package:flutter_speed_dial/flutter_speed_dial.dart'; import 'package:mzansi_innovation_hub/main.dart'; import 'package:mzansi_innovation_hub/mih_components/mih_inputs_and_buttons/mih_text_input.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-app_tool_body.dart'; +import 'package:mzansi_innovation_hub/mih_components/mih_package_components/mih_floating_menu.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_objects/patients.dart'; @@ -237,58 +239,87 @@ class _PatientInfoState extends State { } Widget getBody() { - return MihSingleChildScroll( - child: Column( - children: [ - Row( - mainAxisAlignment: MainAxisAlignment.center, - //crossAxisAlignment: , - children: [ - Text( - "Personal Details", - textAlign: TextAlign.center, - style: TextStyle( - fontSize: 25, - fontWeight: FontWeight.bold, - color: - MzanziInnovationHub.of(context)!.theme.secondaryColor(), - ), + return Stack( + children: [ + MihSingleChildScroll( + child: Column( + children: [ + Row( + mainAxisAlignment: MainAxisAlignment.center, + //crossAxisAlignment: , + children: [ + Text( + "Personal Details", + textAlign: TextAlign.center, + style: TextStyle( + fontSize: 25, + fontWeight: FontWeight.bold, + color: MzanziInnovationHub.of(context)! + .theme + .secondaryColor(), + ), + ), + ]), + Divider( + color: + MzanziInnovationHub.of(context)!.theme.secondaryColor()), + const SizedBox(height: 10), + getPatientDetailsField(), + const SizedBox(height: 10), + Text( + "Medical Aid Details", + textAlign: TextAlign.center, + style: TextStyle( + fontSize: 25, + fontWeight: FontWeight.bold, + color: + MzanziInnovationHub.of(context)!.theme.secondaryColor(), ), - Visibility( - visible: widget.type == "personal", - child: IconButton( - icon: const Icon(Icons.edit), - alignment: Alignment.topRight, + ), + Divider( + color: + MzanziInnovationHub.of(context)!.theme.secondaryColor()), + const SizedBox(height: 10), + getMedAidDetailsFields(), + ], + ), + ), + Visibility( + visible: widget.type == "personal", + child: Positioned( + right: 0, + bottom: 0, + child: MihFloatingMenu( + icon: Icons.add, + animatedIcon: AnimatedIcons.menu_close, + children: [ + SpeedDialChild( + child: Icon( + Icons.edit, color: - MzanziInnovationHub.of(context)!.theme.secondaryColor(), - onPressed: () { - Navigator.of(context).pushNamed('/patient-profile/edit', - arguments: PatientEditArguments( - widget.signedInUser, widget.selectedPatient)); - }, + MzanziInnovationHub.of(context)!.theme.primaryColor(), ), + label: "Edit Profile", + labelBackgroundColor: + MzanziInnovationHub.of(context)!.theme.successColor(), + labelStyle: TextStyle( + color: + MzanziInnovationHub.of(context)!.theme.primaryColor(), + fontWeight: FontWeight.bold, + ), + backgroundColor: + MzanziInnovationHub.of(context)!.theme.successColor(), + onTap: () { + Navigator.of(context).pushNamed('/patient-profile/edit', + arguments: PatientEditArguments( + widget.signedInUser, widget.selectedPatient)); + }, ) - ]), - Divider( - color: MzanziInnovationHub.of(context)!.theme.secondaryColor()), - const SizedBox(height: 10), - getPatientDetailsField(), - const SizedBox(height: 10), - Text( - "Medical Aid Details", - textAlign: TextAlign.center, - style: TextStyle( - fontSize: 25, - fontWeight: FontWeight.bold, - color: MzanziInnovationHub.of(context)!.theme.secondaryColor(), + ], ), ), - Divider( - color: MzanziInnovationHub.of(context)!.theme.secondaryColor()), - const SizedBox(height: 10), - getMedAidDetailsFields(), - ], - ), + ), + ], ); } } diff --git a/Frontend/pubspec.lock b/Frontend/pubspec.lock index ed6ab1a0..ee9ca4cb 100644 --- a/Frontend/pubspec.lock +++ b/Frontend/pubspec.lock @@ -45,10 +45,10 @@ packages: dependency: transitive description: name: async - sha256: "947bfcf187f74dbc5e146c9eb9c0f10c9f8b30743e341481c1e2ed3ecc18c20c" + sha256: d2872f9c19731c2e5f10444b14686eb7cc85c76274bd6c16e1816bff9a3bab63 url: "https://pub.dev" source: hosted - version: "2.11.0" + version: "2.12.0" barcode: dependency: transitive description: @@ -85,10 +85,10 @@ packages: dependency: transitive description: name: boolean_selector - sha256: "6cfb5af12253eaf2b368f07bacc5a80d1301a071c73360d746b7f2e32d762c66" + sha256: "8aab1771e1243a5063b8b0ff68042d67334e3feab9e95b9490f9a6ebf73b42ea" url: "https://pub.dev" source: hosted - version: "2.1.1" + version: "2.1.2" buffer: dependency: transitive description: @@ -181,10 +181,10 @@ packages: dependency: transitive description: name: characters - sha256: "04a925763edad70e8443c99234dc3328f442e811f1d8fd1a72f1c8ad0f69a605" + sha256: f71061c654a3380576a52b451dd5532377954cf9dbd272a78fc8479606670803 url: "https://pub.dev" source: hosted - version: "1.3.0" + version: "1.4.0" charcode: dependency: transitive description: @@ -213,10 +213,10 @@ packages: dependency: transitive description: name: clock - sha256: cb6d7f03e1de671e34607e909a7213e31d7752be4fb66a86d29fe1eb14bfb5cf + sha256: fddb70d9b5277016c77a80201021d40a2247104d9f4aa7bab7157b7e3f05b84b url: "https://pub.dev" source: hosted - version: "1.1.1" + version: "1.1.2" code_builder: dependency: transitive description: @@ -229,10 +229,10 @@ packages: dependency: transitive description: name: collection - sha256: a1ace0a119f20aabc852d165077c036cd864315bd99b7eaa10a60100341941bf + sha256: "2f5709ae4d3d59dd8f7cd309b4e023046b57d8a6c82130785d2b0e5868084e76" url: "https://pub.dev" source: hosted - version: "1.19.0" + version: "1.19.1" convert: dependency: transitive description: @@ -333,10 +333,10 @@ packages: dependency: transitive description: name: fake_async - sha256: "511392330127add0b769b75a987850d136345d9227c6b94c96a04cf4a391bf78" + sha256: "6a95e56b2449df2273fd8c45a662d6947ce1ebb7aafe80e550a3f68297f3cacc" url: "https://pub.dev" source: hosted - version: "1.3.1" + version: "1.3.2" fetch_api: dependency: transitive description: @@ -684,18 +684,18 @@ packages: dependency: transitive description: name: leak_tracker - sha256: "7bb2830ebd849694d1ec25bf1f44582d6ac531a57a365a803a6034ff751d2d06" + sha256: c35baad643ba394b40aac41080300150a4f08fd0fd6a10378f8f7c6bc161acec url: "https://pub.dev" source: hosted - version: "10.0.7" + version: "10.0.8" leak_tracker_flutter_testing: dependency: transitive description: name: leak_tracker_flutter_testing - sha256: "9491a714cca3667b60b5c420da8217e6de0d1ba7a5ec322fab01758f6998f379" + sha256: f8b613e7e6a13ec79cfdc0e97638fddb3ab848452eff057653abd3edba760573 url: "https://pub.dev" source: hosted - version: "3.0.8" + version: "3.0.9" leak_tracker_testing: dependency: transitive description: @@ -772,10 +772,10 @@ packages: dependency: transitive description: name: matcher - sha256: d2323aa2060500f906aa31a895b4030b6da3ebdcc5619d14ce1aada65cd161cb + sha256: dc58c723c3c24bf8d3e2d3ad3f2f9d7bd9cf43ec6feaa64181775e60190153f2 url: "https://pub.dev" source: hosted - version: "0.12.16+1" + version: "0.12.17" material_color_utilities: dependency: transitive description: @@ -796,10 +796,10 @@ packages: dependency: transitive description: name: meta - sha256: bdb68674043280c3428e9ec998512fb681678676b3c54e773629ffe74419f8c7 + sha256: e3641ec5d63ebf0d9b41bd43201a66e3fc79a65db5f61fc181f04cd27aab950c url: "https://pub.dev" source: hosted - version: "1.15.0" + version: "1.16.0" mime: dependency: transitive description: @@ -852,10 +852,10 @@ packages: dependency: transitive description: name: path - sha256: "087ce49c3f0dc39180befefc60fdb4acd8f8620e5682fe2476afd0b3688bb4af" + sha256: "75cca69d1490965be98c73ceaea117e8a04dd21217b37b292c9ddbec0d955bc5" url: "https://pub.dev" source: hosted - version: "1.9.0" + version: "1.9.1" path_parsing: dependency: transitive description: @@ -1137,10 +1137,10 @@ packages: dependency: transitive description: name: source_span - sha256: "53e943d4206a5e30df338fd4c6e7a077e02254531b138a15aec3bd143c1a8b3c" + sha256: "254ee5351d6cb365c859e20ee823c3bb479bf4a293c22d17a9f1bf144ce86f7c" url: "https://pub.dev" source: hosted - version: "1.10.0" + version: "1.10.1" sprintf: dependency: transitive description: @@ -1153,18 +1153,18 @@ packages: dependency: transitive description: name: stack_trace - sha256: "9f47fd3630d76be3ab26f0ee06d213679aa425996925ff3feffdec504931c377" + sha256: "8b27215b45d22309b5cddda1aa2b19bdfec9df0e765f2de506401c071d38d1b1" url: "https://pub.dev" source: hosted - version: "1.12.0" + version: "1.12.1" stream_channel: dependency: transitive description: name: stream_channel - sha256: ba2aa5d8cc609d96bbb2899c28934f9e1af5cddbd60a827822ea467161eb54e7 + sha256: "969e04c80b8bcdf826f8f16579c7b14d780458bd97f56d107d3950fdbeef059d" url: "https://pub.dev" source: hosted - version: "2.1.2" + version: "2.1.4" stream_transform: dependency: transitive description: @@ -1177,10 +1177,10 @@ packages: dependency: transitive description: name: string_scanner - sha256: "688af5ed3402a4bde5b3a6c15fd768dbf2621a614950b17f04626c431ab3c4c3" + sha256: "921cd31725b72fe181906c6a94d987c78e3b98c2e205b397ea399d4054872b43" url: "https://pub.dev" source: hosted - version: "1.3.0" + version: "1.4.1" supertokens_flutter: dependency: "direct main" description: @@ -1265,18 +1265,18 @@ packages: dependency: transitive description: name: term_glyph - sha256: a29248a84fbb7c79282b40b8c72a1209db169a2e0542bce341da992fe1bc7e84 + sha256: "7f554798625ea768a7518313e58f83891c7f5024f88e46e7182a4558850a4b8e" url: "https://pub.dev" source: hosted - version: "1.2.1" + version: "1.2.2" test_api: dependency: transitive description: name: test_api - sha256: "664d3a9a64782fcdeb83ce9c6b39e78fd2971d4e37827b9b06c3aa1edc5e760c" + sha256: fb31f383e2ee25fbbfe06b40fe21e1e458d14080e3c67e7ba0acfde4df4e0bbd url: "https://pub.dev" source: hosted - version: "0.7.3" + version: "0.7.4" timing: dependency: transitive description: @@ -1409,10 +1409,10 @@ packages: dependency: transitive description: name: vm_service - sha256: f6be3ed8bd01289b34d679c2b62226f63c0e69f9fd2e50a6b3c1c729a961041b + sha256: "0968250880a6c5fe7edc067ed0a13d4bae1577fe2771dcf3010d52c4a9d3ca14" url: "https://pub.dev" source: hosted - version: "14.3.0" + version: "14.3.1" watcher: dependency: transitive description: @@ -1534,5 +1534,5 @@ packages: source: hosted version: "3.1.1" sdks: - dart: ">=3.6.0 <3.9.0" + dart: ">=3.7.0-0 <3.9.0" flutter: ">=3.27.0"