diff --git a/Frontend/patient_manager/lib/components/buildPatientList.dart b/Frontend/patient_manager/lib/components/buildPatientList.dart index d811f6c4..60db4301 100644 --- a/Frontend/patient_manager/lib/components/buildPatientList.dart +++ b/Frontend/patient_manager/lib/components/buildPatientList.dart @@ -3,12 +3,12 @@ import 'package:patient_manager/objects/patients.dart'; class BuildPatientsList extends StatefulWidget { final List patients; - final searchString; + //final searchString; const BuildPatientsList({ super.key, required this.patients, - required this.searchString, + //required this.searchString, }); @override @@ -16,6 +16,22 @@ class BuildPatientsList extends StatefulWidget { } class _BuildPatientsListState extends State { + Widget isMainMember(int index) { + if (widget.patients[index].medical_aid_main_member == "Yes") { + return Row( + mainAxisSize: MainAxisSize.max, + children: [ + const Icon(Icons.star_border_rounded), + Text( + "${widget.patients[index].first_name} ${widget.patients[index].last_name}"), + ], + ); + } else { + return Text( + "${widget.patients[index].first_name} ${widget.patients[index].last_name}"); + } + } + @override Widget build(BuildContext context) { return ListView.separated( @@ -26,20 +42,18 @@ class _BuildPatientsListState extends State { itemBuilder: (context, index) { //final patient = widget.patients[index].id_no.contains(widget.searchString); //print(index); - return widget.patients[index].id_no.contains(widget.searchString) - ? ListTile( - title: Text( - "${widget.patients[index].first_name} ${widget.patients[index].last_name}"), - subtitle: Text(widget.patients[index].id_no), - onTap: () { - setState(() { - Navigator.of(context).pushNamed('/patient-manager/patient', - arguments: widget.patients[index]); - }); - }, - trailing: const Icon(Icons.arrow_forward), - ) - : null; + return ListTile( + title: isMainMember(index), + subtitle: Text( + "ID No.: ${widget.patients[index].id_no}\nMedical Aid No.: ${widget.patients[index].medical_aid_no}"), + onTap: () { + setState(() { + Navigator.of(context).pushNamed('/patient-manager/patient', + arguments: widget.patients[index]); + }); + }, + trailing: const Icon(Icons.arrow_forward), + ); }, ); } diff --git a/Frontend/patient_manager/lib/components/myDropdownInput.dart b/Frontend/patient_manager/lib/components/myDropdownInput.dart index 9c8cc1b6..065aea86 100644 --- a/Frontend/patient_manager/lib/components/myDropdownInput.dart +++ b/Frontend/patient_manager/lib/components/myDropdownInput.dart @@ -5,7 +5,7 @@ class MyDropdownField extends StatefulWidget { final String hintText; final bool required; final List dropdownOptions; - + final void Function(String?)? onSelect; //final bool editable; const MyDropdownField({ @@ -14,6 +14,7 @@ class MyDropdownField extends StatefulWidget { required this.hintText, required this.dropdownOptions, required this.required, + this.onSelect, }); @override @@ -89,6 +90,7 @@ class _MyDropdownFieldState extends State { return Padding( padding: const EdgeInsets.symmetric(horizontal: 25.0), child: DropdownMenu( + //onSelected: widget.onSelect, menuHeight: 300, controller: widget.controller, expandedInsets: EdgeInsets.zero, diff --git a/Frontend/patient_manager/lib/components/patManAppDrawer.dart b/Frontend/patient_manager/lib/components/patManAppDrawer.dart index 5f5dae72..fa54225b 100644 --- a/Frontend/patient_manager/lib/components/patManAppDrawer.dart +++ b/Frontend/patient_manager/lib/components/patManAppDrawer.dart @@ -16,14 +16,14 @@ class PatManAppDrawer extends StatefulWidget { class _PatManAppDrawerState extends State { String endpointUserData = "http://localhost:80/users/profile/"; - late AppUser signedInUser; + late Future signedInUser; Future getUserDetails() async { //print("pat man drawer: " + endpointUserData + widget.userEmail); var response = await http.get(Uri.parse(endpointUserData + widget.userEmail)); - //print(response.statusCode); - //print(response.body); + print(response.statusCode); + print(response.body); if (response.statusCode == 200) { return AppUser.fromJson( jsonDecode(response.body) as Map); @@ -34,14 +34,14 @@ class _PatManAppDrawerState extends State { @override void initState() { - //signedInUser = getUserDetails(); + signedInUser = getUserDetails(); super.initState(); } @override Widget build(BuildContext context) { return FutureBuilder( - future: getUserDetails(), + future: signedInUser, builder: (BuildContext context, AsyncSnapshot snapshot) { return Drawer( child: ListView( @@ -51,61 +51,80 @@ class _PatManAppDrawerState extends State { decoration: const BoxDecoration( color: Colors.blueAccent, ), - child: Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - const Text( - "Signed Is As:", - style: TextStyle( - fontWeight: FontWeight.bold, - fontSize: 20.0, - ), - ), - const SizedBox( - height: 50.0, - ), - Row( + child: SizedBox( + height: 400, + child: Expanded( + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + mainAxisSize: MainAxisSize.min, children: [ const Text( - "Name: ", - style: TextStyle(fontWeight: FontWeight.bold), + "Signed Is As:", + style: TextStyle( + fontWeight: FontWeight.bold, + fontSize: 20.0, + ), + ), + const SizedBox( + height: 50.0, + ), + Expanded( + child: Row( + mainAxisSize: MainAxisSize.max, + children: [ + const Text( + "Name: ", + style: TextStyle(fontWeight: FontWeight.bold), + ), + const SizedBox(width: 15), + Text( + "${snapshot.data?.fname} ${snapshot.data?.lname}"), + ], + ), + ), + Expanded( + child: Row( + mainAxisSize: MainAxisSize.max, + children: [ + const Text( + "Email: ", + style: TextStyle(fontWeight: FontWeight.bold), + ), + const SizedBox(width: 16), + Text("${snapshot.data?.email}"), + ], + ), ), - const SizedBox(width: 15), - Text("${snapshot.data?.fname} ${snapshot.data?.lname}"), ], ), - Row( - children: [ - const Text( - "Email: ", - style: TextStyle(fontWeight: FontWeight.bold), - ), - const SizedBox(width: 16), - Text("${snapshot.data?.email}"), - ], - ), - ], + ), ), ), ListTile( - title: const Row( - children: [ - Icon(Icons.home_outlined), - SizedBox(width: 25.0), - Text("Home"), - ], + title: const Expanded( + child: Row( + mainAxisSize: MainAxisSize.max, + children: [ + Icon(Icons.home_outlined), + SizedBox(width: 25.0), + Text("Home"), + ], + ), ), onTap: () { Navigator.of(context).pushNamed('/home'); }, ), ListTile( - title: const Row( - children: [ - Icon(Icons.perm_identity), - SizedBox(width: 25.0), - Text("Profile"), - ], + title: const Expanded( + child: Row( + mainAxisSize: MainAxisSize.max, + children: [ + Icon(Icons.perm_identity), + SizedBox(width: 25.0), + Text("Profile"), + ], + ), ), onTap: () { //signedInUser = snapshot.data!; @@ -115,12 +134,15 @@ class _PatManAppDrawerState extends State { }, ), ListTile( - title: const Row( - children: [ - Icon(Icons.logout), - SizedBox(width: 25.0), - Text("Sign Out"), - ], + title: const Expanded( + child: Row( + mainAxisSize: MainAxisSize.max, + children: [ + Icon(Icons.logout), + SizedBox(width: 25.0), + Text("Sign Out"), + ], + ), ), onTap: () { client.auth.signOut(); diff --git a/Frontend/patient_manager/lib/components/patientDetails.dart b/Frontend/patient_manager/lib/components/patientDetails.dart index d82312ae..2d86dd30 100644 --- a/Frontend/patient_manager/lib/components/patientDetails.dart +++ b/Frontend/patient_manager/lib/components/patientDetails.dart @@ -20,6 +20,9 @@ class _PatientDetailsState extends State { final medNameController = TextEditingController(); final medSchemeController = TextEditingController(); final addressController = TextEditingController(); + final medAidController = TextEditingController(); + final medMainMemController = TextEditingController(); + final medAidCodeController = TextEditingController(); double? headingFontSize = 35.0; double? bodyFonstSize = 20.0; @@ -43,6 +46,12 @@ class _PatientDetailsState extends State { 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); }); super.initState(); } @@ -157,6 +166,20 @@ class _PatientDetailsState extends State { children: [ Row( children: [ + Expanded( + child: MyTextField( + controller: medAidController, + hintText: "Has Medical Aid", + editable: false, + required: false), + ), + Expanded( + child: MyTextField( + controller: medMainMemController, + hintText: "Main Member", + editable: false, + required: false), + ), Expanded( child: MyTextField( controller: medNoController, @@ -164,6 +187,18 @@ class _PatientDetailsState extends State { editable: false, required: false), ), + ], + ), + const SizedBox(height: 10), + Row( + children: [ + Expanded( + child: MyTextField( + controller: medAidCodeController, + hintText: "Code", + editable: false, + required: false), + ), Expanded( child: MyTextField( controller: medNameController, @@ -178,18 +213,6 @@ class _PatientDetailsState extends State { editable: false, required: false), ), - // PatientDetailItem( - // category: "No. ", - // value: widget.selectedPatient.medical_aid_no, - // ), - // PatientDetailItem( - // category: "Name ", - // value: widget.selectedPatient.medical_aid_name, - // ), - // PatientDetailItem( - // category: "Scheme ", - // value: widget.selectedPatient.medical_aid_scheme, - // ), ], ), ], diff --git a/Frontend/patient_manager/lib/objects/patients.dart b/Frontend/patient_manager/lib/objects/patients.dart index 0c48627d..074ca073 100644 --- a/Frontend/patient_manager/lib/objects/patients.dart +++ b/Frontend/patient_manager/lib/objects/patients.dart @@ -5,8 +5,11 @@ class Patient { final String last_name; final String email; final String cell_no; + final String medical_aid; final String medical_aid_name; final String medical_aid_no; + final String medical_aid_main_member; + final String medical_aid_code; final String medical_aid_scheme; final String address; final int doc_office_id; @@ -18,8 +21,11 @@ class Patient { required this.last_name, required this.email, required this.cell_no, + required this.medical_aid, required this.medical_aid_name, required this.medical_aid_no, + required this.medical_aid_main_member, + required this.medical_aid_code, required this.medical_aid_scheme, required this.address, required this.doc_office_id, @@ -34,8 +40,11 @@ class Patient { 'last_name': String last_name, 'email': String email, 'cell_no': String cell_no, + 'medical_aid': String medical_aid, 'medical_aid_name': String medical_aid_name, 'medical_aid_no': String medical_aid_no, + 'medical_aid_main_member': String medical_aid_main_member, + 'medical_aid_code': String medical_aid_code, 'medical_aid_scheme': String medical_aid_scheme, 'address': String address, 'doc_office_id': int doc_office_id, @@ -47,8 +56,11 @@ class Patient { last_name: last_name, email: email, cell_no: cell_no, + medical_aid: medical_aid, medical_aid_name: medical_aid_name, medical_aid_no: medical_aid_no, + medical_aid_main_member: medical_aid_main_member, + medical_aid_code: medical_aid_code, medical_aid_scheme: medical_aid_scheme, address: address, doc_office_id: doc_office_id, diff --git a/Frontend/patient_manager/lib/pages/patientAdd.dart b/Frontend/patient_manager/lib/pages/patientAdd.dart index 646fc66e..404182fe 100644 --- a/Frontend/patient_manager/lib/pages/patientAdd.dart +++ b/Frontend/patient_manager/lib/pages/patientAdd.dart @@ -1,6 +1,7 @@ import 'dart:convert'; import 'package:flutter/material.dart'; +import 'package:patient_manager/components/myDropdownInput.dart'; import 'package:patient_manager/components/myErrorMessage.dart'; import 'package:patient_manager/components/mySuccessMessage.dart'; import 'package:patient_manager/components/myTextInput.dart'; @@ -31,9 +32,14 @@ class _AddPatientState extends State { final medNameController = TextEditingController(); final medSchemeController = TextEditingController(); final addressController = TextEditingController(); + final medAidController = TextEditingController(); + final medMainMemController = TextEditingController(); + final medAidCodeController = TextEditingController(); + final docOfficeIdApiUrl = "http://localhost:80/users/profile/"; final apiUrl = "http://localhost:80/patients/insert/"; late int futureDocOfficeId; + late bool medRequired; Future getOfficeIdByUser(String endpoint) async { final response = await http.get(Uri.parse(endpoint)); @@ -52,18 +58,35 @@ class _AddPatientState extends State { } bool isFieldsFilled() { - if (idController.text.isEmpty || - fnameController.text.isEmpty || - lnameController.text.isEmpty || - cellController.text.isEmpty || - emailController.text.isEmpty || - medNoController.text.isEmpty || - medNameController.text.isEmpty || - medSchemeController.text.isEmpty || - addressController.text.isEmpty) { - return false; + if (medRequired) { + if (idController.text.isEmpty || + fnameController.text.isEmpty || + lnameController.text.isEmpty || + cellController.text.isEmpty || + emailController.text.isEmpty || + medNoController.text.isEmpty || + medNameController.text.isEmpty || + medSchemeController.text.isEmpty || + addressController.text.isEmpty || + medAidController.text.isEmpty || + medMainMemController.text.isEmpty || + medAidCodeController.text.isEmpty) { + return false; + } else { + return true; + } } else { - return true; + if (idController.text.isEmpty || + fnameController.text.isEmpty || + lnameController.text.isEmpty || + cellController.text.isEmpty || + emailController.text.isEmpty || + addressController.text.isEmpty || + medAidController.text.isEmpty) { + return false; + } else { + return true; + } } } @@ -81,8 +104,11 @@ class _AddPatientState extends State { "last_name": lnameController.text, "email": emailController.text, "cell_no": cellController.text, - "medical_aid_name": medNameController.text, + "medical_aid": medAidController.text, + "medical_aid_main_member": medMainMemController.text, "medical_aid_no": medNoController.text, + "medical_aid_code": medAidCodeController.text, + "medical_aid_name": medNameController.text, "medical_aid_scheme": medSchemeController.text, "address": addressController.text, "doc_office_id": futureDocOfficeId, @@ -131,182 +157,252 @@ class _AddPatientState extends State { ); } - @override - Widget build(BuildContext context) { - return Scaffold( - appBar: const MyAppBar(barTitle: "Add Patient"), - body: Padding( - padding: const EdgeInsets.all(15.0), - child: SingleChildScrollView( - child: Column( - children: [ - const Text( - "Personal Details", - textAlign: TextAlign.center, - style: TextStyle( - fontWeight: FontWeight.bold, - fontSize: 25.0, - //color: Colors.blueAccent, + void isRequired() { + //print("listerner triggered"); + if (medAidController.text == "Yes") { + setState(() { + medRequired = true; + }); + } else { + setState(() { + medRequired = false; + }); + } + } + + Widget displayForm() { + return Padding( + padding: const EdgeInsets.all(15.0), + child: SingleChildScrollView( + child: Column( + children: [ + const Text( + "Personal Details", + textAlign: TextAlign.center, + style: TextStyle( + fontWeight: FontWeight.bold, + fontSize: 25.0, + //color: Colors.blueAccent, + ), + ), + Row( + children: [ + Expanded( + child: MyTextField( + controller: idController, + hintText: "13 digit ID Number or Passport", + editable: true, + required: true, + ), ), - ), - Row( - children: [ - Expanded( - child: MyTextField( - controller: idController, - hintText: "13 digit ID Number or Passport", - editable: true, - required: true, - ), + ], + ), + const SizedBox(height: 10.0), + Row( + children: [ + Expanded( + child: MyTextField( + controller: fnameController, + hintText: "First Name", + editable: true, + required: true, ), - ], - ), - const SizedBox(height: 10.0), - Row( - children: [ - Expanded( - child: MyTextField( - controller: fnameController, - hintText: "First Name", - editable: true, - required: true, - ), - ), - ], - ), - const SizedBox(height: 10.0), - Row( - children: [ - Expanded( - child: MyTextField( - controller: lnameController, - hintText: "Last Name", - editable: true, - required: true, - ), - ), - ], - ), - const SizedBox(height: 10.0), - Row( - children: [ - Expanded( - child: MyTextField( - controller: cellController, - hintText: "Cell Number", - editable: true, - required: true, - ), - ), - ], - ), - const SizedBox(height: 10.0), - Row( - children: [ - Expanded( - child: MyTextField( - controller: emailController, - hintText: "Email", - editable: true, - required: true, - ), - ), - ], - ), - const SizedBox(height: 10.0), - Row( - children: [ - Expanded( - child: MyTextField( - controller: addressController, - hintText: "Address", - editable: true, - required: true, - ), - ), - ], - ), - const SizedBox(height: 15.0), - const Text( - "Medical Aid Details", - textAlign: TextAlign.center, - style: TextStyle( - fontWeight: FontWeight.bold, - fontSize: 25.0, - //color: Colors.blueAccent, ), - ), - const SizedBox(height: 10.0), - Row( - children: [ - Expanded( - child: MyTextField( - controller: medNoController, - hintText: "Medical Aid No.", - editable: true, - required: true, - ), + ], + ), + const SizedBox(height: 10.0), + Row( + children: [ + Expanded( + child: MyTextField( + controller: lnameController, + hintText: "Last Name", + editable: true, + required: true, ), - ], - ), - const SizedBox(height: 10.0), - Row( - children: [ - Expanded( - child: MyTextField( - controller: medNameController, - hintText: "Medical Aid Name", - editable: true, - required: true, - ), + ), + ], + ), + const SizedBox(height: 10.0), + Row( + children: [ + Expanded( + child: MyTextField( + controller: cellController, + hintText: "Cell Number", + editable: true, + required: true, ), - ], - ), - const SizedBox(height: 10.0), - Row( - children: [ - Expanded( - child: MyTextField( - controller: medSchemeController, - hintText: "Medical Aid Scheme", - editable: true, - required: true, - ), + ), + ], + ), + const SizedBox(height: 10.0), + Row( + children: [ + Expanded( + child: MyTextField( + controller: emailController, + hintText: "Email", + editable: true, + required: true, ), - ], - ), - //const SizedBox(height: 10.0), - Row( - mainAxisAlignment: MainAxisAlignment.center, - children: [ - SizedBox( - width: 500.0, - height: 100.0, - child: MyButton( - onTap: () { - if (isFieldsFilled()) { - addPatientAPICall(); - } else { - showDialog( - context: context, - builder: (context) { - return const MyErrorMessage( - errorType: "Input Error"); - }, - ); - } - }, - buttonText: "Add", - buttonColor: Colors.blueAccent, - textColor: Colors.white, - ), + ), + ], + ), + const SizedBox(height: 10.0), + Row( + children: [ + Expanded( + child: MyTextField( + controller: addressController, + hintText: "Address", + editable: true, + required: true, ), - ], + ), + ], + ), + const SizedBox(height: 15.0), + const Text( + "Medical Aid Details", + textAlign: TextAlign.center, + style: TextStyle( + fontWeight: FontWeight.bold, + fontSize: 25.0, + //color: Colors.blueAccent, ), - ], - ), + ), + const SizedBox(height: 10.0), + Row( + children: [ + Expanded( + child: MyDropdownField( + controller: medAidController, + hintText: "Has Medical Aid", + //editable: true, + onSelect: (_) { + isRequired(); + }, + required: true, + dropdownOptions: const ["Yes", "No"], + ), + ), + ], + ), + const SizedBox(height: 10.0), + Row( + children: [ + Expanded( + child: MyDropdownField( + controller: medMainMemController, + hintText: "Main Member", + //editable: true, + required: medRequired, + dropdownOptions: const ["Yes", "No"], + ), + ), + ], + ), + const SizedBox(height: 10.0), + Row( + children: [ + Expanded( + child: MyTextField( + controller: medNoController, + hintText: "Medical Aid No.", + editable: true, + required: medRequired, + ), + ), + ], + ), + const SizedBox(height: 10.0), + Row( + children: [ + Expanded( + child: MyTextField( + controller: medAidCodeController, + hintText: "Medical Aid Code", + editable: true, + required: medRequired, + ), + ), + ], + ), + const SizedBox(height: 10.0), + Row( + children: [ + Expanded( + child: MyTextField( + controller: medNameController, + hintText: "Medical Aid Name", + editable: true, + required: medRequired, + ), + ), + ], + ), + const SizedBox(height: 10.0), + Row( + children: [ + Expanded( + child: MyTextField( + controller: medSchemeController, + hintText: "Medical Aid Scheme", + editable: true, + required: medRequired, + ), + ), + ], + ), + //const SizedBox(height: 10.0), + Row( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + SizedBox( + width: 500.0, + height: 100.0, + child: MyButton( + onTap: () { + if (isFieldsFilled()) { + addPatientAPICall(); + } else { + showDialog( + context: context, + builder: (context) { + return const MyErrorMessage( + errorType: "Input Error"); + }, + ); + } + }, + buttonText: "Add", + buttonColor: Colors.blueAccent, + textColor: Colors.white, + ), + ), + ], + ), + ], ), ), ); } + + @override + void initState() { + medAidController.addListener(isRequired); + setState(() { + medAidController.text = "No"; + }); + super.initState(); + } + + @override + Widget build(BuildContext context) { + return Scaffold( + appBar: const MyAppBar(barTitle: "Add Patient"), + body: displayForm(), + ); + } } diff --git a/Frontend/patient_manager/lib/pages/patientEdit.dart b/Frontend/patient_manager/lib/pages/patientEdit.dart index 64fb69e2..4b91f428 100644 --- a/Frontend/patient_manager/lib/pages/patientEdit.dart +++ b/Frontend/patient_manager/lib/pages/patientEdit.dart @@ -1,6 +1,7 @@ import 'dart:convert'; import 'package:flutter/material.dart'; +import 'package:patient_manager/components/myDropdownInput.dart'; import 'package:patient_manager/components/myErrorMessage.dart'; import 'package:patient_manager/components/mySuccessMessage.dart'; import 'package:patient_manager/components/myTextInput.dart'; @@ -33,11 +34,16 @@ class _EditPatientState extends State { final medNameController = TextEditingController(); final medSchemeController = TextEditingController(); final addressController = TextEditingController(); + final medAidController = TextEditingController(); + final medMainMemController = TextEditingController(); + final medAidCodeController = TextEditingController(); + final docOfficeIdApiUrl = "http://localhost:80/users/profile/"; final apiUrlEdit = "http://localhost:80/patients/update/"; final apiUrlDelete = "http://localhost:80/patients/delete/"; late int futureDocOfficeId; late String userEmail; + late bool medRequired; Future getOfficeIdByUser(String endpoint) async { final response = await http.get(Uri.parse(endpoint)); @@ -74,8 +80,11 @@ class _EditPatientState extends State { "last_name": lnameController.text, "email": emailController.text, "cell_no": cellController.text, - "medical_aid_name": medNameController.text, + "medical_aid": medAidController.text, + "medical_aid_main_member": medMainMemController.text, "medical_aid_no": medNoController.text, + "medical_aid_code": medAidCodeController.text, + "medical_aid_name": medNameController.text, "medical_aid_scheme": medSchemeController.text, "address": addressController.text, "doc_office_id": futureDocOfficeId, @@ -271,24 +280,286 @@ class _EditPatientState extends State { } bool isFieldsFilled() { - if (idController.text.isEmpty || - fnameController.text.isEmpty || - lnameController.text.isEmpty || - cellController.text.isEmpty || - emailController.text.isEmpty || - medNoController.text.isEmpty || - medNameController.text.isEmpty || - medSchemeController.text.isEmpty || - addressController.text.isEmpty) { - return false; + if (medRequired) { + if (idController.text.isEmpty || + fnameController.text.isEmpty || + lnameController.text.isEmpty || + cellController.text.isEmpty || + emailController.text.isEmpty || + medNoController.text.isEmpty || + medNameController.text.isEmpty || + medSchemeController.text.isEmpty || + addressController.text.isEmpty || + medAidController.text.isEmpty || + medMainMemController.text.isEmpty || + medAidCodeController.text.isEmpty) { + return false; + } else { + return true; + } } else { - return true; + if (idController.text.isEmpty || + fnameController.text.isEmpty || + lnameController.text.isEmpty || + cellController.text.isEmpty || + emailController.text.isEmpty || + addressController.text.isEmpty || + medAidController.text.isEmpty) { + return false; + } else { + return true; + } } } + void isRequired() { + //print("listerner triggered"); + if (medAidController.text == "Yes") { + setState(() { + medRequired = true; + }); + } else { + setState(() { + medRequired = false; + }); + } + } + + Widget displayForm() { + return Padding( + padding: const EdgeInsets.all(15.0), + child: SingleChildScrollView( + child: Column( + children: [ + Row( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + const Text( + "Personal Details", + textAlign: TextAlign.center, + style: TextStyle( + fontWeight: FontWeight.bold, + fontSize: 25.0, + //color: Colors.blueAccent, + ), + ), + IconButton( + icon: const Icon(Icons.delete), + alignment: Alignment.topRight, + onPressed: () { + deletePatientPopUp(); + }, + ) + ], + ), + Row( + children: [ + Expanded( + child: MyTextField( + controller: idController, + hintText: "13 digit ID Number or Passport", + editable: false, + required: true, + ), + ), + ], + ), + const SizedBox(height: 10.0), + Row( + children: [ + Expanded( + child: MyTextField( + controller: fnameController, + hintText: "First Name", + editable: true, + required: true, + ), + ), + ], + ), + const SizedBox(height: 10.0), + Row( + children: [ + Expanded( + child: MyTextField( + controller: lnameController, + hintText: "Last Name", + editable: true, + required: true, + ), + ), + ], + ), + const SizedBox(height: 10.0), + Row( + children: [ + Expanded( + child: MyTextField( + controller: cellController, + hintText: "Cell Number", + editable: true, + required: true, + ), + ), + ], + ), + const SizedBox(height: 10.0), + Row( + children: [ + Expanded( + child: MyTextField( + controller: emailController, + hintText: "Email", + editable: true, + required: true, + ), + ), + ], + ), + const SizedBox(height: 10.0), + Row( + children: [ + Expanded( + child: MyTextField( + controller: addressController, + hintText: "Address", + editable: true, + required: true, + ), + ), + ], + ), + const SizedBox(height: 15.0), + const Text( + "Medical Aid Details", + textAlign: TextAlign.center, + style: TextStyle( + fontWeight: FontWeight.bold, + fontSize: 25.0, + //color: Colors.blueAccent, + ), + ), + const SizedBox(height: 10.0), + Row( + children: [ + Expanded( + child: MyDropdownField( + controller: medAidController, + hintText: "Has Medical Aid", + onSelect: (_) { + isRequired(); + }, + //editable: true, + required: true, + dropdownOptions: const ["Yes", "No"], + ), + ), + ], + ), + const SizedBox(height: 10.0), + Row( + children: [ + Expanded( + child: MyDropdownField( + controller: medMainMemController, + hintText: "Main Member.", + //editable: true, + required: medRequired, + dropdownOptions: const ["Yes", "No"], + ), + ), + ], + ), + const SizedBox(height: 10.0), + Row( + children: [ + Expanded( + child: MyTextField( + controller: medNoController, + hintText: "Medical Aid No.", + editable: true, + required: medRequired, + ), + ), + ], + ), + const SizedBox(height: 10.0), + Row( + children: [ + Expanded( + child: MyTextField( + controller: medAidCodeController, + hintText: "Medical Aid Code", + editable: true, + required: medRequired, + ), + ), + ], + ), + const SizedBox(height: 10.0), + Row( + children: [ + Expanded( + child: MyTextField( + controller: medNameController, + hintText: "Medical Aid Name", + editable: true, + required: medRequired, + ), + ), + ], + ), + const SizedBox(height: 10.0), + Row( + children: [ + Expanded( + child: MyTextField( + controller: medSchemeController, + hintText: "Medical Aid Scheme", + editable: true, + required: medRequired, + ), + ), + ], + ), + //const SizedBox(height: 10.0), + Row( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + SizedBox( + width: 500.0, + height: 100.0, + child: MyButton( + onTap: () { + if (isFieldsFilled()) { + updatePatientApiCall(); + } else { + showDialog( + context: context, + builder: (context) { + return const MyErrorMessage( + errorType: "Input Error"); + }, + ); + } + }, + buttonText: "Update", + buttonColor: Colors.blueAccent, + textColor: Colors.white, + ), + ), + ], + ), + ], + ), + ), + ); + } + @override void initState() { getLoginUserEmail(); + medAidController.addListener(isRequired); setState(() { idController.value = TextEditingValue(text: widget.selectedPatient.id_no); fnameController.value = @@ -307,7 +578,14 @@ class _EditPatientState extends State { 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); }); + super.initState(); } @@ -315,190 +593,7 @@ class _EditPatientState extends State { Widget build(BuildContext context) { return Scaffold( appBar: const MyAppBar(barTitle: "Edit Patient"), - body: Padding( - padding: const EdgeInsets.all(15.0), - child: SingleChildScrollView( - child: Column( - children: [ - Row( - mainAxisAlignment: MainAxisAlignment.center, - children: [ - const Text( - "Personal Details", - textAlign: TextAlign.center, - style: TextStyle( - fontWeight: FontWeight.bold, - fontSize: 25.0, - //color: Colors.blueAccent, - ), - ), - IconButton( - icon: const Icon(Icons.delete), - alignment: Alignment.topRight, - onPressed: () { - deletePatientPopUp(); - }, - ) - ], - ), - Row( - children: [ - Expanded( - child: MyTextField( - controller: idController, - hintText: "13 digit ID Number or Passport", - editable: false, - required: true, - ), - ), - ], - ), - const SizedBox(height: 10.0), - Row( - children: [ - Expanded( - child: MyTextField( - controller: fnameController, - hintText: "First Name", - editable: true, - required: true, - ), - ), - ], - ), - const SizedBox(height: 10.0), - Row( - children: [ - Expanded( - child: MyTextField( - controller: lnameController, - hintText: "Last Name", - editable: true, - required: true, - ), - ), - ], - ), - const SizedBox(height: 10.0), - Row( - children: [ - Expanded( - child: MyTextField( - controller: cellController, - hintText: "Cell Number", - editable: true, - required: true, - ), - ), - ], - ), - const SizedBox(height: 10.0), - Row( - children: [ - Expanded( - child: MyTextField( - controller: emailController, - hintText: "Email", - editable: true, - required: true, - ), - ), - ], - ), - const SizedBox(height: 10.0), - Row( - children: [ - Expanded( - child: MyTextField( - controller: addressController, - hintText: "Address", - editable: true, - required: true, - ), - ), - ], - ), - const SizedBox(height: 15.0), - const Text( - "Medical Aid Details", - textAlign: TextAlign.center, - style: TextStyle( - fontWeight: FontWeight.bold, - fontSize: 25.0, - //color: Colors.blueAccent, - ), - ), - const SizedBox(height: 10.0), - Row( - children: [ - Expanded( - child: MyTextField( - controller: medNoController, - hintText: "Medical Aid No.", - editable: true, - required: true, - ), - ), - ], - ), - const SizedBox(height: 10.0), - Row( - children: [ - Expanded( - child: MyTextField( - controller: medNameController, - hintText: "Medical Aid Name", - editable: true, - required: true, - ), - ), - ], - ), - const SizedBox(height: 10.0), - Row( - children: [ - Expanded( - child: MyTextField( - controller: medSchemeController, - hintText: "Medical Aid Scheme", - editable: true, - required: true, - ), - ), - ], - ), - //const SizedBox(height: 10.0), - Row( - mainAxisAlignment: MainAxisAlignment.center, - children: [ - SizedBox( - width: 500.0, - height: 100.0, - child: MyButton( - onTap: () { - if (isFieldsFilled()) { - updatePatientApiCall(); - } else { - showDialog( - context: context, - builder: (context) { - return const MyErrorMessage( - errorType: "Input Error"); - }, - ); - } - }, - buttonText: "Update", - buttonColor: Colors.blueAccent, - textColor: Colors.white, - ), - ), - ], - ), - ], - ), - ), - ), + body: displayForm(), ); } } diff --git a/Frontend/patient_manager/lib/pages/patientManager.dart b/Frontend/patient_manager/lib/pages/patientManager.dart index 304c090b..5de422bf 100644 --- a/Frontend/patient_manager/lib/pages/patientManager.dart +++ b/Frontend/patient_manager/lib/pages/patientManager.dart @@ -31,11 +31,17 @@ class _PatientManagerState extends State { Future> fetchPatients(String endpoint) async { //print("Patien manager page: $endpoint"); final response = await http.get(Uri.parse(endpoint)); - //print(response.statusCode); + // print("Here"); + // print(response.body); + // print(response.statusCode); if (response.statusCode == 200) { + //print("Here1"); Iterable l = jsonDecode(response.body); + //print("Here2"); List patients = List.from(l.map((model) => Patient.fromJson(model))); + // print("Here3"); + // print(patients); return patients; } else { throw Exception('failed to load patients'); @@ -43,9 +49,16 @@ class _PatientManagerState extends State { } List filterSearchResults(List mainList, String query) { - return mainList - .where((tempList) => tempList.id_no.contains(query.toLowerCase())) - .toList(); + List templist = []; + //print(query); + for (var item in mainList) { + if (item.id_no.contains(searchString) || + item.medical_aid_no.contains(searchString)) { + //print(item.medical_aid_no); + templist.add(item); + } + } + return templist; } Widget displayList(List patientsList, String searchString) { @@ -57,6 +70,7 @@ class _PatientManagerState extends State { bottom: 25, ), child: Container( + height: 500, decoration: BoxDecoration( color: Colors.white, borderRadius: BorderRadius.circular(25.0), @@ -64,7 +78,7 @@ class _PatientManagerState extends State { ), child: BuildPatientsList( patients: patientsList, - searchString: searchString, + //searchString: searchString, ), ), ); @@ -76,6 +90,7 @@ class _PatientManagerState extends State { bottom: 25, ), child: Container( + height: 500, decoration: BoxDecoration( color: Colors.white, borderRadius: BorderRadius.circular(25.0), @@ -83,7 +98,7 @@ class _PatientManagerState extends State { ), child: const Center( child: Text( - "Enter ID of Patient", + "Enter ID or Medical Aid No. of Patient", style: TextStyle(fontSize: 25, color: Colors.grey), textAlign: TextAlign.center, ), @@ -92,46 +107,53 @@ class _PatientManagerState extends State { ); } - Widget patientSearch() { - return Column(children: [ - //spacer - const SizedBox(height: 10), - MySearchField( - controller: searchController, - hintText: "ID Search", - required: false, - editable: true, - onTap: () {}, - onChanged: (value) { - setState(() { - searchString = value; - }); - }, - ), - //spacer - const SizedBox(height: 10), - FutureBuilder( - future: futurePatients, - builder: (context, snapshot) { - if (snapshot.connectionState == ConnectionState.waiting) { - return const Center(child: CircularProgressIndicator()); - } else if (snapshot.hasData) { - List patientsList; - if (searchString == "") { - patientsList = snapshot.data!; - } else { - patientsList = filterSearchResults(snapshot.data!, searchString); - } + Widget patientSearch(double w, double h) { + return SizedBox( + width: w, + height: h, + child: Column(mainAxisSize: MainAxisSize.max, children: [ + //spacer + const SizedBox(height: 10), + MySearchField( + controller: searchController, + hintText: "ID or Medical Aid No. Search", + required: false, + editable: true, + onTap: () {}, + onChanged: (value) { + setState(() { + searchString = value; + }); + }, + ), + //spacer + const SizedBox(height: 10), + FutureBuilder( + future: futurePatients, + builder: (context, snapshot) { + //print("patient Liust ${snapshot.data}"); + if (snapshot.connectionState == ConnectionState.waiting) { + return const Center(child: CircularProgressIndicator()); + } else if (snapshot.hasData) { + List patientsList; + if (searchString == "") { + patientsList = []; + } else { + patientsList = + filterSearchResults(snapshot.data!, searchString); + //print(patientsList); + } - return Expanded( - child: displayList(patientsList, searchString), - ); - } else { - return const PatManAppDrawer(userEmail: "Error pulling email"); - } - }, - ), - ]); + return Expanded( + child: displayList(patientsList, searchString), + ); + } else { + return const Center(child: Text("Error pulling email")); + } + }, + ), + ]), + ); } @override @@ -142,6 +164,8 @@ class _PatientManagerState extends State { @override Widget build(BuildContext context) { + final screenWidth = MediaQuery.of(context).size.width; + final screenHeight = MediaQuery.of(context).size.height; return Scaffold( appBar: const MyAppBar(barTitle: "Patient Manager"), drawer: PatManAppDrawer(userEmail: widget.userEmail), @@ -167,13 +191,7 @@ class _PatientManagerState extends State { ), ), ), - body: Row( - children: [ - Expanded( - child: patientSearch(), - ), - ], - ), + body: patientSearch(screenWidth, screenHeight), ); } } diff --git a/Frontend/patient_manager/lib/theme/mihTheme.dart b/Frontend/patient_manager/lib/theme/mihTheme.dart new file mode 100644 index 00000000..e69de29b diff --git a/backend/routers/__pycache__/patients.cpython-310.pyc b/backend/routers/__pycache__/patients.cpython-310.pyc index 3b7aafc7..f0d0b5f0 100644 Binary files a/backend/routers/__pycache__/patients.cpython-310.pyc and b/backend/routers/__pycache__/patients.cpython-310.pyc differ diff --git a/database/#ib_16384_0.dblwr b/database/#ib_16384_0.dblwr index eb4a249c..93fb184a 100644 Binary files a/database/#ib_16384_0.dblwr and b/database/#ib_16384_0.dblwr differ diff --git a/database/#innodb_redo/#ib_redo18 b/database/#innodb_redo/#ib_redo18 index a922d98a..2e156b66 100644 Binary files a/database/#innodb_redo/#ib_redo18 and b/database/#innodb_redo/#ib_redo18 differ diff --git a/database/binlog.000056 b/database/binlog.000056 index b2c5bcf4..a585d9aa 100644 Binary files a/database/binlog.000056 and b/database/binlog.000056 differ diff --git a/database/ibdata1 b/database/ibdata1 index d5367271..83c82d56 100644 Binary files a/database/ibdata1 and b/database/ibdata1 differ diff --git a/database/mysql.ibd b/database/mysql.ibd index a66c88f1..058a85cf 100644 Binary files a/database/mysql.ibd and b/database/mysql.ibd differ diff --git a/database/patient_manager/patient_notes.ibd b/database/patient_manager/patient_notes.ibd index 0729785a..3553490f 100644 Binary files a/database/patient_manager/patient_notes.ibd and b/database/patient_manager/patient_notes.ibd differ diff --git a/database/patient_manager/patients.ibd b/database/patient_manager/patients.ibd index 5a94b035..a2f62ba7 100644 Binary files a/database/patient_manager/patients.ibd and b/database/patient_manager/patients.ibd differ diff --git a/database/undo_001 b/database/undo_001 index fb92627e..3f239df9 100644 Binary files a/database/undo_001 and b/database/undo_001 differ diff --git a/database/undo_002 b/database/undo_002 index 134c4e05..ad00193a 100644 Binary files a/database/undo_002 and b/database/undo_002 differ