From edbde7e29bc3e391e716fa2531e2f4f7129bc579 Mon Sep 17 00:00:00 2001 From: Yasien Mac Mini Date: Mon, 17 Mar 2025 14:05:38 +0200 Subject: [PATCH] new app tools --- .../app_tools/patient_consultation.dart | 361 ++++++++++++ .../app_tools/patient_documents.dart | 525 ++++++++++++++++++ .../pat_profile/app_tools/patient_info.dart | 294 ++++++++++ 3 files changed, 1180 insertions(+) create mode 100644 Frontend/lib/mih_packages/patient_profile/pat_profile/app_tools/patient_consultation.dart create mode 100644 Frontend/lib/mih_packages/patient_profile/pat_profile/app_tools/patient_documents.dart create mode 100644 Frontend/lib/mih_packages/patient_profile/pat_profile/app_tools/patient_info.dart diff --git a/Frontend/lib/mih_packages/patient_profile/pat_profile/app_tools/patient_consultation.dart b/Frontend/lib/mih_packages/patient_profile/pat_profile/app_tools/patient_consultation.dart new file mode 100644 index 00000000..f3e0e8aa --- /dev/null +++ b/Frontend/lib/mih_packages/patient_profile/pat_profile/app_tools/patient_consultation.dart @@ -0,0 +1,361 @@ +import 'dart:convert'; +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'; +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_layout/mih_window.dart'; +import 'package:Mzansi_Innovation_Hub/mih_components/mih_package/mih-app_tool_body.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'; +import 'package:Mzansi_Innovation_Hub/mih_env/env.dart'; +import 'package:Mzansi_Innovation_Hub/mih_objects/app_user.dart'; +import 'package:Mzansi_Innovation_Hub/mih_objects/business.dart'; +import 'package:Mzansi_Innovation_Hub/mih_objects/business_user.dart'; +import 'package:Mzansi_Innovation_Hub/mih_objects/notes.dart'; +import 'package:Mzansi_Innovation_Hub/mih_objects/patients.dart'; +import 'package:Mzansi_Innovation_Hub/mih_packages/patient_profile/pat_profile/list_builders/build_notes_list.dart'; +import 'package:flutter/material.dart'; +import 'package:supertokens_flutter/http.dart' as http; + +class PatientConsultation extends StatefulWidget { + final String patientAppId; + final Patient selectedPatient; + final AppUser signedInUser; + final Business? business; + final BusinessUser? businessUser; + final String type; + const PatientConsultation({ + super.key, + required this.patientAppId, + required this.selectedPatient, + required this.signedInUser, + required this.business, + required this.businessUser, + required this.type, + }); + + @override + State createState() => _PatientConsultationState(); +} + +class _PatientConsultationState extends State { + late Future> futueNotes; + final titleController = TextEditingController(); + final noteTextController = TextEditingController(); + final officeController = TextEditingController(); + final dateController = TextEditingController(); + final doctorController = TextEditingController(); + final ValueNotifier _counter = ValueNotifier(0); + String endpoint = "${AppEnviroment.baseApiUrl}/notes/patients/"; + + Future> fetchNotes(String endpoint) async { + final response = await http.get(Uri.parse( + "${AppEnviroment.baseApiUrl}/notes/patients/${widget.selectedPatient.app_id}")); + if (response.statusCode == 200) { + Iterable l = jsonDecode(response.body); + List notes = + List.from(l.map((model) => Note.fromJson(model))); + //print("Here notes"); + return notes; + } else { + internetConnectionPopUp(); + throw Exception('failed to load patients'); + } + } + + void addNotePopUp() { + DateTime now = new DateTime.now(); + DateTime date = new DateTime(now.year, now.month, now.day); + var title = ""; + print("Business User: ${widget.businessUser}"); + if (widget.businessUser?.title == "Doctor") { + title = "Dr."; + } + setState(() { + officeController.text = widget.business!.Name; + doctorController.text = + "$title ${widget.signedInUser.fname} ${widget.signedInUser.lname}"; + dateController.text = date.toString().substring(0, 10); + }); + showDialog( + context: context, + barrierDismissible: false, + builder: (context) => MIHWindow( + fullscreen: false, + windowTitle: "Add Note", + windowTools: const [], + onWindowTapClose: () { + Navigator.pop(context); + titleController.clear(); + noteTextController.clear(); + }, + windowBody: [ + MIHTextField( + controller: officeController, + hintText: "Office", + editable: false, + required: true, + ), + const SizedBox(height: 10.0), + MIHTextField( + controller: doctorController, + hintText: "Created By", + editable: false, + required: true, + ), + const SizedBox(height: 10.0), + MIHTextField( + controller: dateController, + hintText: "Created Date", + editable: false, + required: true, + ), + const SizedBox(height: 10.0), + MIHTextField( + controller: titleController, + hintText: "Note Title", + editable: true, + required: true, + ), + const SizedBox(height: 10.0), + SizedBox( + //width: 700, + height: 250, + child: MIHMLTextField( + controller: noteTextController, + hintText: "Note Details", + editable: true, + required: true, + ), + ), + SizedBox( + height: 15, + child: ValueListenableBuilder( + builder: (BuildContext context, int value, Widget? child) { + return Row( + mainAxisSize: MainAxisSize.max, + mainAxisAlignment: MainAxisAlignment.end, + children: [ + Text( + "$value", + style: TextStyle( + color: getNoteDetailLimitColor(), + ), + ), + const SizedBox(width: 5), + Text( + "/512", + style: TextStyle( + color: getNoteDetailLimitColor(), + ), + ), + ], + ); + }, + valueListenable: _counter, + ), + ), + const SizedBox(height: 15.0), + SizedBox( + width: 300, + height: 50, + child: MIHButton( + onTap: () { + if (isFieldsFilled()) { + addPatientNoteAPICall(); + Navigator.pop(context); + } else { + showDialog( + context: context, + builder: (context) { + return const MIHErrorMessage(errorType: "Input Error"); + }, + ); + } + }, + buttonText: "Add Note", + buttonColor: + MzanziInnovationHub.of(context)!.theme.secondaryColor(), + textColor: MzanziInnovationHub.of(context)!.theme.primaryColor(), + ), + ) + ], + ), + ); + } + + Future addPatientNoteAPICall() async { + // String title = ""; + // if (widget.businessUser!.title == "Doctor") { + // title = "Dr."; + // } + var response = await http.post( + Uri.parse("${AppEnviroment.baseApiUrl}/notes/insert/"), + headers: { + "Content-Type": "application/json; charset=UTF-8" + }, + body: jsonEncode({ + "note_name": titleController.text, + "note_text": noteTextController.text, + "doc_office": officeController.text, + "doctor": doctorController.text, + "app_id": widget.selectedPatient.app_id, + }), + ); + if (response.statusCode == 201) { + setState(() { + futueNotes = fetchNotes(endpoint + widget.patientAppId.toString()); + }); + // Navigator.of(context) + // .pushNamed('/patient-manager', arguments: widget.userEmail); + String message = + "Your note has been successfully added to the patients medical record. You can now view it alongside their other important information."; + successPopUp(message); + } else { + internetConnectionPopUp(); + } + } + + bool isFieldsFilled() { + if (titleController.text.isEmpty || + noteTextController.text.isEmpty || + _counter.value >= 512) { + return false; + } else { + return true; + } + } + + Color getNoteDetailLimitColor() { + if (_counter.value <= 512) { + return MzanziInnovationHub.of(context)!.theme.secondaryColor(); + } else { + return MzanziInnovationHub.of(context)!.theme.errorColor(); + } + } + + List setIcons() { + if (widget.type == "personal") { + return [ + Text( + "Consultation Notes", + textAlign: TextAlign.center, + style: TextStyle( + fontSize: 25, + fontWeight: FontWeight.bold, + color: MzanziInnovationHub.of(context)!.theme.secondaryColor()), + ), + ]; + } else { + return [ + Text( + "Consultation Notes", + textAlign: TextAlign.center, + style: TextStyle( + fontSize: 25, + fontWeight: FontWeight.bold, + color: MzanziInnovationHub.of(context)!.theme.secondaryColor()), + ), + IconButton( + onPressed: () { + // addConsultationNotePopUp(); + addNotePopUp(); + }, + icon: Icon(Icons.add, + color: MzanziInnovationHub.of(context)!.theme.secondaryColor()), + ) + ]; + } + } + + void successPopUp(String message) { + showDialog( + context: context, + builder: (context) { + return MIHSuccessMessage( + successType: "Success", + successMessage: message, + ); + }, + ); + } + + void internetConnectionPopUp() { + showDialog( + context: context, + builder: (context) { + return const MIHErrorMessage(errorType: "Internet Connection"); + }, + ); + } + + @override + void dispose() { + titleController.dispose(); + noteTextController.dispose(); + doctorController.dispose(); + dateController.dispose(); + officeController.dispose(); + super.dispose(); + } + + @override + void initState() { + futueNotes = fetchNotes(endpoint + widget.patientAppId); + noteTextController.addListener(() { + setState(() { + _counter.value = noteTextController.text.characters.length; + }); + }); + super.initState(); + } + + @override + Widget build(BuildContext context) { + return MihAppToolBody( + borderOn: true, + bodyItem: getBody(), + ); + } + + 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"), + ); + } + }, + ), + ); + } +} diff --git a/Frontend/lib/mih_packages/patient_profile/pat_profile/app_tools/patient_documents.dart b/Frontend/lib/mih_packages/patient_profile/pat_profile/app_tools/patient_documents.dart new file mode 100644 index 00000000..1270c3c5 --- /dev/null +++ b/Frontend/lib/mih_packages/patient_profile/pat_profile/app_tools/patient_documents.dart @@ -0,0 +1,525 @@ +import 'dart:convert'; + +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'; +import 'package:Mzansi_Innovation_Hub/mih_components/mih_inputs_and_buttons/mih_file_input.dart'; +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/mih-app_tool_body.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'; +import 'package:Mzansi_Innovation_Hub/mih_env/env.dart'; +import 'package:Mzansi_Innovation_Hub/mih_objects/app_user.dart'; +import 'package:Mzansi_Innovation_Hub/mih_objects/business.dart'; +import 'package:Mzansi_Innovation_Hub/mih_objects/business_user.dart'; +import 'package:Mzansi_Innovation_Hub/mih_objects/files.dart'; +import 'package:Mzansi_Innovation_Hub/mih_objects/patients.dart'; +import 'package:Mzansi_Innovation_Hub/mih_packages/patient_profile/pat_profile/components/prescip_input.dart'; +import 'package:Mzansi_Innovation_Hub/mih_packages/patient_profile/pat_profile/list_builders/build_files_list.dart'; +import 'package:file_picker/file_picker.dart'; +import 'package:flutter/material.dart'; +import 'package:supertokens_flutter/supertokens.dart'; +import 'package:supertokens_flutter/http.dart' as http; +import 'package:http/http.dart' as http2; + +class PatientDocuments extends StatefulWidget { + final int patientIndex; + final Patient selectedPatient; + final AppUser signedInUser; + final Business? business; + final BusinessUser? businessUser; + final String type; + const PatientDocuments({ + super.key, + required this.patientIndex, + required this.selectedPatient, + required this.signedInUser, + required this.business, + required this.businessUser, + required this.type, + }); + + @override + State createState() => _PatientDocumentsState(); +} + +class _PatientDocumentsState extends State { + late Future> futueFiles; + final selectedFileController = TextEditingController(); + final startDateController = TextEditingController(); + final endDateTextController = TextEditingController(); + final retDateTextController = TextEditingController(); + final medicineController = TextEditingController(); + final quantityController = TextEditingController(); + final dosageController = TextEditingController(); + final timesDailyController = TextEditingController(); + final noDaysController = TextEditingController(); + final noRepeatsController = TextEditingController(); + final outputController = TextEditingController(); + late PlatformFile selected; + + Future> fetchFiles() async { + final response = await http.get(Uri.parse( + "${AppEnviroment.baseApiUrl}/files/patients/${widget.selectedPatient.app_id}")); + //print(response.statusCode); + //print(response.body); + if (response.statusCode == 200) { + Iterable l = jsonDecode(response.body); + List files = + List.from(l.map((model) => PFile.fromJson(model))); + return files; + } else { + internetConnectionPopUp(); + throw Exception('failed to load patients'); + } + } + + Future uploadSelectedFile(PlatformFile file) async { + //var strem = new http.ByteStream.fromBytes(file.bytes.) + //start loading circle + showDialog( + context: context, + builder: (context) { + return const Mihloadingcircle(); + }, + ); + var token = await SuperTokens.getAccessToken(); + //print(t); + //print("here1"); + var request = http2.MultipartRequest( + 'POST', Uri.parse("${AppEnviroment.baseApiUrl}/minio/upload/file/")); + request.headers['accept'] = 'application/json'; + request.headers['Authorization'] = 'Bearer $token'; + request.headers['Content-Type'] = 'multipart/form-data'; + request.fields['app_id'] = widget.selectedPatient.app_id; + request.fields['folder'] = "patient_files"; + request.files.add(await http2.MultipartFile.fromBytes('file', file.bytes!, + filename: file.name.replaceAll(RegExp(r' '), '-'))); + //print("here2"); + var response1 = await request.send(); + //print("here3"); + //print(response1.statusCode); + //print(response1.toString()); + if (response1.statusCode == 200) { + //print("here3"); + var fname = file.name.replaceAll(RegExp(r' '), '-'); + var filePath = "${widget.selectedPatient.app_id}/patient_files/$fname"; + var response2 = await http.post( + Uri.parse("${AppEnviroment.baseApiUrl}/files/insert/"), + headers: { + "Content-Type": "application/json; charset=UTF-8" + }, + body: jsonEncode({ + "file_path": filePath, + "file_name": fname, + "app_id": widget.selectedPatient.app_id + }), + ); + //print("here5"); + //print(response2.statusCode); + if (response2.statusCode == 201) { + setState(() { + selectedFileController.clear(); + futueFiles = fetchFiles(); + }); + // end loading circle + Navigator.of(context).pop(); + String message = + "The file ${file.name.replaceAll(RegExp(r' '), '-')} has been successfully generated and added to ${widget.selectedPatient.first_name} ${widget.selectedPatient.last_name}'s record. You can now access and download it for their use."; + successPopUp(message); + } else { + internetConnectionPopUp(); + } + } else { + internetConnectionPopUp(); + } + } + + Future generateMedCert() async { + //start loading circle + showDialog( + context: context, + builder: (context) { + return const Mihloadingcircle(); + }, + ); + var response1 = await http.post( + Uri.parse("${AppEnviroment.baseApiUrl}/minio/generate/med-cert/"), + headers: { + "Content-Type": "application/json; charset=UTF-8" + }, + body: jsonEncode({ + "app_id": widget.selectedPatient.app_id, + "fullName": + "${widget.selectedPatient.first_name} ${widget.selectedPatient.last_name}", + "id_no": widget.selectedPatient.id_no, + "docfname": + "DR. ${widget.signedInUser.fname} ${widget.signedInUser.lname}", + "startDate": startDateController.text, + "busName": widget.business!.Name, + "busAddr": "*TO BE ADDED IN THE FUTURE*", + "busNo": widget.business!.contact_no, + "busEmail": widget.business!.bus_email, + "endDate": endDateTextController.text, + "returnDate": retDateTextController.text, + "logo_path": widget.business!.logo_path, + "sig_path": widget.businessUser!.sig_path, + }), + ); + //print(response1.statusCode); + DateTime now = new DateTime.now(); + DateTime date = new DateTime(now.year, now.month, now.day); + String fileName = + "Med-Cert-${widget.selectedPatient.first_name} ${widget.selectedPatient.last_name}-${date.toString().substring(0, 10)}.pdf"; + if (response1.statusCode == 200) { + var response2 = await http.post( + Uri.parse("${AppEnviroment.baseApiUrl}/files/insert/"), + headers: { + "Content-Type": "application/json; charset=UTF-8" + }, + body: jsonEncode({ + "file_path": + "${widget.selectedPatient.app_id}/patient_files/$fileName", + "file_name": fileName, + "app_id": widget.selectedPatient.app_id + }), + ); + //print(response2.statusCode); + if (response2.statusCode == 201) { + setState(() { + startDateController.clear(); + endDateTextController.clear(); + retDateTextController.clear(); + futueFiles = fetchFiles(); + }); + // end loading circle + Navigator.of(context).pop(); + Navigator.of(context).pop(); + String message = + "The medical certificate $fileName has been successfully generated and added to ${widget.selectedPatient.first_name} ${widget.selectedPatient.last_name}'s record. You can now access and download it for their use."; + successPopUp(message); + } else { + internetConnectionPopUp(); + } + } else { + internetConnectionPopUp(); + } + } + + void uploudFilePopUp() { + showDialog( + context: context, + barrierDismissible: false, + builder: (context) => MIHWindow( + fullscreen: false, + windowTitle: "Upload File", + windowTools: const [], + onWindowTapClose: () { + Navigator.pop(context); + }, + windowBody: [ + MIHFileField( + controller: selectedFileController, + hintText: "Select File", + editable: false, + required: true, + onPressed: () async { + FilePickerResult? result = await FilePicker.platform.pickFiles( + type: FileType.custom, + allowedExtensions: ['jpg', 'png', 'pdf'], + ); + if (result == null) return; + final selectedFile = result.files.first; + setState(() { + selected = selectedFile; + }); + setState(() { + selectedFileController.text = selectedFile.name; + }); + }, + ), + const SizedBox(height: 15), + SizedBox( + width: 300, + height: 50, + child: MIHButton( + buttonText: "Add File", + buttonColor: + MzanziInnovationHub.of(context)!.theme.secondaryColor(), + textColor: MzanziInnovationHub.of(context)!.theme.primaryColor(), + onTap: () { + if (isFileFieldsFilled()) { + uploadSelectedFile(selected); + Navigator.pop(context); + } else { + showDialog( + context: context, + builder: (context) { + return const MIHErrorMessage(errorType: "Input Error"); + }, + ); + } + }, + ), + ) + ], + ), + ); + } + + void medCertPopUp() { + showDialog( + context: context, + barrierDismissible: false, + builder: (context) => MIHWindow( + fullscreen: false, + windowTitle: "Create Medical Certificate", + windowTools: const [], + onWindowTapClose: () { + Navigator.pop(context); + }, + windowBody: [ + Medcertinput( + startDateController: startDateController, + endDateTextController: endDateTextController, + retDateTextController: retDateTextController, + ), + const SizedBox(height: 15.0), + SizedBox( + width: 300, + height: 50, + child: MIHButton( + buttonText: "Generate", + buttonColor: + MzanziInnovationHub.of(context)!.theme.secondaryColor(), + textColor: MzanziInnovationHub.of(context)!.theme.primaryColor(), + onTap: () async { + if (isMedCertFieldsFilled()) { + await generateMedCert(); + //Navigator.pop(context); + } else { + showDialog( + context: context, + builder: (context) { + return const MIHErrorMessage(errorType: "Input Error"); + }, + ); + } + }, + ), + ) + ], + ), + ); + } + + void prescritionPopUp() { + showDialog( + context: context, + barrierDismissible: false, + builder: (context) => MIHWindow( + fullscreen: false, + windowTitle: "Create Prescription", + windowTools: const [], + onWindowTapClose: () { + medicineController.clear(); + quantityController.clear(); + dosageController.clear(); + timesDailyController.clear(); + noDaysController.clear(); + noRepeatsController.clear(); + Navigator.pop(context); + }, + windowBody: [ + PrescripInput( + medicineController: medicineController, + quantityController: quantityController, + dosageController: dosageController, + timesDailyController: timesDailyController, + noDaysController: noDaysController, + noRepeatsController: noRepeatsController, + outputController: outputController, + selectedPatient: widget.selectedPatient, + signedInUser: widget.signedInUser, + business: widget.business, + businessUser: widget.businessUser, + ), + ], + ), + ); + } + + bool isFileFieldsFilled() { + if (selectedFileController.text.isEmpty) { + return false; + } else { + return true; + } + } + + bool isMedCertFieldsFilled() { + if (startDateController.text.isEmpty || + endDateTextController.text.isEmpty || + retDateTextController.text.isEmpty) { + return false; + } else { + return true; + } + } + + List setIcons() { + if (widget.type == "personal") { + return [ + Text( + "Documents", + textAlign: TextAlign.center, + style: TextStyle( + fontSize: 25, + fontWeight: FontWeight.bold, + color: MzanziInnovationHub.of(context)!.theme.secondaryColor(), + ), + ), + IconButton( + onPressed: () { + uploudFilePopUp(); + }, + icon: Icon( + Icons.add, + color: MzanziInnovationHub.of(context)!.theme.secondaryColor(), + ), + ) + ]; + } else { + return [ + Text( + "Documents", + textAlign: TextAlign.center, + style: TextStyle( + fontSize: 25, + fontWeight: FontWeight.bold, + color: MzanziInnovationHub.of(context)!.theme.secondaryColor(), + ), + ), + IconButton( + onPressed: () { + medCertPopUp(); + }, + icon: Icon( + Icons.sick_outlined, + color: MzanziInnovationHub.of(context)!.theme.secondaryColor(), + ), + ), + IconButton( + onPressed: () { + prescritionPopUp(); + }, + icon: Icon( + Icons.medication_outlined, + color: MzanziInnovationHub.of(context)!.theme.secondaryColor(), + ), + ), + IconButton( + onPressed: () { + uploudFilePopUp(); + }, + icon: Icon( + Icons.add, + color: MzanziInnovationHub.of(context)!.theme.secondaryColor(), + ), + ) + ]; + } + } + + void successPopUp(String message) { + showDialog( + context: context, + builder: (context) { + return MIHSuccessMessage( + successType: "Success", + successMessage: message, + ); + }, + ); + } + + void internetConnectionPopUp() { + showDialog( + context: context, + builder: (context) { + return const MIHErrorMessage(errorType: "Internet Connection"); + }, + ); + } + + @override + void dispose() { + startDateController.dispose(); + endDateTextController.dispose(); + retDateTextController.dispose(); + selectedFileController.dispose(); + medicineController.dispose(); + quantityController.dispose(); + dosageController.dispose(); + timesDailyController.dispose(); + noDaysController.dispose(); + noRepeatsController.dispose(); + outputController.dispose(); + super.dispose(); + } + + @override + void initState() { + futueFiles = fetchFiles(); + super.initState(); + } + + @override + Widget build(BuildContext context) { + return MihAppToolBody( + borderOn: true, + bodyItem: getBody(), + ); + } + + 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"), + ); + } + }, + ), + ); + } +} diff --git a/Frontend/lib/mih_packages/patient_profile/pat_profile/app_tools/patient_info.dart b/Frontend/lib/mih_packages/patient_profile/pat_profile/app_tools/patient_info.dart new file mode 100644 index 00000000..5b1f1697 --- /dev/null +++ b/Frontend/lib/mih_packages/patient_profile/pat_profile/app_tools/patient_info.dart @@ -0,0 +1,294 @@ +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/mih-app_tool_body.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'; +import 'package:flutter/material.dart'; + +class PatientInfo extends StatefulWidget { + final AppUser signedInUser; + final Patient selectedPatient; + final String type; + const PatientInfo({ + super.key, + required this.signedInUser, + required this.selectedPatient, + required this.type, + }); + + @override + State createState() => _PatientInfoState(); +} + +class _PatientInfoState extends State { + final idController = TextEditingController(); + final fnameController = TextEditingController(); + final lnameController = TextEditingController(); + final cellController = TextEditingController(); + final emailController = TextEditingController(); + final medNoController = TextEditingController(); + final medNameController = TextEditingController(); + final medSchemeController = TextEditingController(); + final addressController = TextEditingController(); + final medAidController = TextEditingController(); + final medMainMemController = TextEditingController(); + final medAidCodeController = TextEditingController(); + double textFieldWidth = 400.0; + late String medAid; + + Widget getPatientDetailsField() { + return Wrap( + spacing: 15, + runSpacing: 10, + children: [ + SizedBox( + width: textFieldWidth, + child: MIHTextField( + controller: idController, + hintText: "ID No.", + editable: false, + required: false), + ), + SizedBox( + width: textFieldWidth, + child: MIHTextField( + controller: fnameController, + hintText: "Name", + editable: false, + required: false), + ), + SizedBox( + width: textFieldWidth, + child: MIHTextField( + controller: lnameController, + hintText: "Surname", + editable: false, + required: false), + ), + SizedBox( + width: textFieldWidth, + child: MIHTextField( + controller: cellController, + hintText: "Cell No.", + editable: false, + required: false), + ), + SizedBox( + width: textFieldWidth, + child: MIHTextField( + controller: emailController, + hintText: "Email", + editable: false, + required: false), + ), + SizedBox( + width: textFieldWidth, + child: MIHTextField( + controller: addressController, + hintText: "Address", + editable: false, + required: false), + ), + ], + ); + } + + Widget getMedAidDetailsFields() { + List medAidDet = []; + medAidDet.add(SizedBox( + width: textFieldWidth, + child: MIHTextField( + controller: medAidController, + hintText: "Medical Aid", + editable: false, + required: false), + )); + bool req; + if (medAid == "Yes") { + req = true; + } else { + req = false; + } + medAidDet.addAll([ + Visibility( + visible: req, + child: SizedBox( + width: textFieldWidth, + child: MIHTextField( + controller: medMainMemController, + hintText: "Main Member", + editable: false, + required: false), + ), + ), + //const SizedBox(height: 10.0), + Visibility( + visible: req, + child: SizedBox( + width: textFieldWidth, + child: MIHTextField( + controller: medNoController, + hintText: "No.", + editable: false, + required: false), + ), + ), + //const SizedBox(height: 10.0), + Visibility( + visible: req, + child: SizedBox( + width: textFieldWidth, + child: MIHTextField( + controller: medAidCodeController, + hintText: "Code", + editable: false, + required: false), + ), + ), + //const SizedBox(height: 10.0), + Visibility( + visible: req, + child: SizedBox( + width: textFieldWidth, + child: MIHTextField( + controller: medNameController, + hintText: "Name", + editable: false, + required: false), + ), + ), + //const SizedBox(height: 10.0), + Visibility( + visible: req, + child: SizedBox( + width: textFieldWidth, + child: MIHTextField( + controller: medSchemeController, + hintText: "Scheme", + editable: false, + required: false), + ), + ), + //), + ]); + return Wrap( + spacing: 10, + runSpacing: 10, + children: medAidDet, + ); + } + + @override + void dispose() { + idController.dispose(); + fnameController.dispose(); + lnameController.dispose(); + cellController.dispose(); + emailController.dispose(); + medNameController.dispose(); + medNoController.dispose(); + medSchemeController.dispose(); + addressController.dispose(); + medAidController.dispose(); + medMainMemController.dispose(); + medAidCodeController.dispose(); + super.dispose(); + } + + @override + void initState() { + setState(() { + idController.value = TextEditingValue(text: widget.selectedPatient.id_no); + fnameController.value = + TextEditingValue(text: widget.selectedPatient.first_name); + lnameController.value = + TextEditingValue(text: widget.selectedPatient.last_name); + cellController.value = + TextEditingValue(text: widget.selectedPatient.cell_no); + emailController.value = + TextEditingValue(text: widget.selectedPatient.email); + medNameController.value = + TextEditingValue(text: widget.selectedPatient.medical_aid_name); + medNoController.value = + TextEditingValue(text: widget.selectedPatient.medical_aid_no); + medSchemeController.value = + TextEditingValue(text: widget.selectedPatient.medical_aid_scheme); + addressController.value = + TextEditingValue(text: widget.selectedPatient.address); + medAidController.value = + TextEditingValue(text: widget.selectedPatient.medical_aid); + medMainMemController.value = TextEditingValue( + text: widget.selectedPatient.medical_aid_main_member); + medAidCodeController.value = + TextEditingValue(text: widget.selectedPatient.medical_aid_code); + medAid = widget.selectedPatient.medical_aid; + }); + super.initState(); + } + + @override + Widget build(BuildContext context) { + return MihAppToolBody( + borderOn: true, + bodyItem: getBody(), + ); + } + + 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(), + ), + ), + Visibility( + visible: widget.type == "personal", + child: IconButton( + icon: const Icon(Icons.edit), + alignment: Alignment.topRight, + color: + MzanziInnovationHub.of(context)!.theme.secondaryColor(), + onPressed: () { + 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(), + ], + ), + ); + } +}