diff --git a/Frontend/lib/mih_packages/mzansi_profile/business_profile/builders/build_employee_list.dart b/Frontend/lib/mih_packages/mzansi_profile/business_profile/builders/build_employee_list.dart new file mode 100644 index 00000000..96306024 --- /dev/null +++ b/Frontend/lib/mih_packages/mzansi_profile/business_profile/builders/build_employee_list.dart @@ -0,0 +1,285 @@ +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_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_layout/mih_window.dart'; +import 'package:Mzansi_Innovation_Hub/mih_components/mih_pop_up_messages/mih_delete_message.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/arguments.dart'; +import 'package:Mzansi_Innovation_Hub/mih_objects/business_employee.dart'; +import 'package:flutter/material.dart'; +import 'package:supertokens_flutter/http.dart' as http; + +class BuildEmployeeList extends StatefulWidget { + final List employees; + final BusinessArguments arguments; + + const BuildEmployeeList({ + super.key, + required this.employees, + required this.arguments, + }); + + @override + State createState() => _BuildEmployeeListState(); +} + +class _BuildEmployeeListState extends State { + TextEditingController accessController = TextEditingController(); + TextEditingController typeController = TextEditingController(); + TextEditingController fnameController = TextEditingController(); + TextEditingController lnameController = TextEditingController(); + + final baseAPI = AppEnviroment.baseApiUrl; + + Future updateEmployeeAPICall(int index) async { + showDialog( + context: context, + builder: (context) { + return const Mihloadingcircle(); + }, + ); + + var response = await http.put( + Uri.parse("$baseAPI/business-user/employees/update/"), + headers: { + "Content-Type": "application/json; charset=UTF-8" + }, + body: jsonEncode({ + "business_id": widget.employees[index].business_id, + "app_id": widget.employees[index].app_id, + "title": typeController.text, + "access": accessController.text, + }), + ); + if (response.statusCode == 200) { + Navigator.of(context).pop(); + Navigator.of(context).pop(); + Navigator.of(context).pop(); + //setState(() {}); + Navigator.of(context).pushNamed( + '/business-profile/manage', + arguments: BusinessArguments( + widget.arguments.signedInUser, + widget.arguments.businessUser, + widget.arguments.business, + ), + ); + String message = "Your employees details have been updated."; + successPopUp(message); + } else { + internetConnectionPopUp(); + } + } + + Future deleteNoteApiCall(int index) async { + var response = await http.delete( + Uri.parse("$baseAPI/business-user/employees/delete/"), + headers: { + "Content-Type": "application/json; charset=UTF-8" + }, + body: jsonEncode({ + "business_id": widget.employees[index].business_id, + "app_id": widget.employees[index].app_id, + }), + ); + //print("Here4"); + //print(response.statusCode); + if (response.statusCode == 200) { + Navigator.of(context).pop(); + Navigator.of(context).pop(); + Navigator.of(context).pop(); + Navigator.of(context).pushNamed( + '/business-profile/manage', + arguments: BusinessArguments( + widget.arguments.signedInUser, + widget.arguments.businessUser, + widget.arguments.business, + ), + ); + String message = + "The employee has been deleted successfully. This means it will no longer have access to your business profile"; + successPopUp(message); + } else { + internetConnectionPopUp(); + } + } + + void internetConnectionPopUp() { + showDialog( + context: context, + builder: (context) { + return const MIHErrorMessage(errorType: "Internet Connection"); + }, + ); + } + + void successPopUp(String message) { + showDialog( + context: context, + builder: (context) { + return MIHSuccessMessage( + successType: "Success", + successMessage: message, + ); + }, + ); + } + + bool isRequiredFieldsCaptured() { + if (accessController.text.isEmpty || typeController.text.isEmpty) { + return false; + } else { + return true; + } + } + + void updateEmployeePopUp(int index) { + setState(() { + accessController.text = widget.employees[index].access; + typeController.text = widget.employees[index].title; + fnameController.text = widget.employees[index].fname; + lnameController.text = widget.employees[index].lname; + }); + showDialog( + context: context, + barrierDismissible: false, + builder: (context) => MIHWindow( + fullscreen: false, + windowTitle: "Employee Details", + windowTools: [ + IconButton( + onPressed: () { + showDeleteWarning(index); + }, + icon: Icon( + Icons.delete, + color: MzanziInnovationHub.of(context)!.theme.secondaryColor(), + size: 35, + ), + ), + ], + onWindowTapClose: () { + Navigator.pop(context); + }, + windowBody: [ + MIHTextField( + controller: fnameController, + hintText: "First Name", + editable: false, + required: true, + ), + const SizedBox(height: 10.0), + MIHTextField( + controller: lnameController, + hintText: "Surname", + editable: false, + required: true, + ), + const SizedBox(height: 10.0), + MIHDropdownField( + controller: typeController, + hintText: "Title", + dropdownOptions: const ["Doctor", "Assistant"], + required: true, + editable: true, + enableSearch: false, + ), + const SizedBox(height: 10.0), + MIHDropdownField( + controller: accessController, + hintText: "Access", + dropdownOptions: const ["Full", "Partial"], + required: true, + editable: true, + enableSearch: false, + ), + const SizedBox(height: 15.0), + SizedBox( + width: 300, + height: 50, + child: MIHButton( + buttonText: "Update", + buttonColor: + MzanziInnovationHub.of(context)!.theme.secondaryColor(), + textColor: MzanziInnovationHub.of(context)!.theme.primaryColor(), + onTap: () { + if (isRequiredFieldsCaptured()) { + updateEmployeeAPICall(index); + } else { + showDialog( + context: context, + builder: (context) { + return const MIHErrorMessage(errorType: "Input Error"); + }, + ); + } + }, + ), + ) + ], + ), + ); + } + + void showDeleteWarning(int index) { + showDialog( + context: context, + barrierDismissible: false, + builder: (context) => MIHDeleteMessage( + deleteType: "Employee", + onTap: () { + deleteNoteApiCall(index); + })); + } + + @override + void dispose() { + accessController.dispose(); + typeController.dispose(); + fnameController.dispose(); + lnameController.dispose(); + super.dispose(); + } + + @override + Widget build(BuildContext context) { + return ListView.separated( + shrinkWrap: true, + physics: const NeverScrollableScrollPhysics(), + separatorBuilder: (BuildContext context, index) { + return Divider( + color: MzanziInnovationHub.of(context)!.theme.secondaryColor(), + ); + }, + itemCount: widget.employees.length, + itemBuilder: (context, index) { + //final patient = widget.patients[index].id_no.contains(widget.searchString); + //print(index); + var isMe = ""; + if (widget.arguments.signedInUser.app_id == + widget.employees[index].app_id) { + isMe = "(You)"; + } + return ListTile( + title: Text( + "${widget.employees[index].fname} ${widget.employees[index].lname} - ${widget.employees[index].title} $isMe"), + subtitle: Text( + "${widget.employees[index].username}\n${widget.employees[index].email}\nAccess: ${widget.employees[index].access}", + style: TextStyle( + color: MzanziInnovationHub.of(context)!.theme.secondaryColor(), + ), + ), + onTap: () { + updateEmployeePopUp(index); + }, + ); + }, + ); + } +} diff --git a/Frontend/lib/mih_packages/mzansi_profile/business_profile/builders/build_user_list.dart b/Frontend/lib/mih_packages/mzansi_profile/business_profile/builders/build_user_list.dart new file mode 100644 index 00000000..faffb8f4 --- /dev/null +++ b/Frontend/lib/mih_packages/mzansi_profile/business_profile/builders/build_user_list.dart @@ -0,0 +1,237 @@ +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_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_layout/mih_window.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/arguments.dart'; +import 'package:flutter/material.dart'; +import 'package:supertokens_flutter/http.dart' as http; + +class BuildUserList extends StatefulWidget { + final List users; + final BusinessArguments arguments; + + const BuildUserList({ + super.key, + required this.users, + required this.arguments, + }); + + @override + State createState() => _BuildUserListState(); +} + +class _BuildUserListState extends State { + TextEditingController accessController = TextEditingController(); + TextEditingController typeController = TextEditingController(); + TextEditingController fnameController = TextEditingController(); + TextEditingController lnameController = TextEditingController(); + + final baseAPI = AppEnviroment.baseApiUrl; + + Future createBusinessUserAPICall(int index) async { + showDialog( + context: context, + builder: (context) { + return const Mihloadingcircle(); + }, + ); + var response = await http.post( + Uri.parse("$baseAPI/business-user/insert/"), + headers: { + "Content-Type": "application/json; charset=UTF-8" + }, + body: jsonEncode({ + "business_id": widget.arguments.business!.business_id, + "app_id": widget.users[index].app_id, + "signature": "", + "sig_path": "", + "title": typeController.text, + "access": accessController.text, + }), + ); + if (response.statusCode == 201) { + Navigator.of(context).pop(); + Navigator.of(context).pop(); + Navigator.of(context).pop(); + Navigator.of(context).pushNamed( + '/business-profile/manage', + arguments: BusinessArguments( + widget.arguments.signedInUser, + widget.arguments.businessUser, + widget.arguments.business, + ), + ); + String message = + "${widget.users[index].username} is now apart of your team with ${accessController.text} access to ${widget.arguments.business!.Name}"; + successPopUp(message); + } else { + internetConnectionPopUp(); + } + } + + bool isRequiredFieldsCaptured() { + if (accessController.text.isEmpty || typeController.text.isEmpty) { + return false; + } else { + return true; + } + } + + void internetConnectionPopUp() { + showDialog( + context: context, + builder: (context) { + return const MIHErrorMessage(errorType: "Internet Connection"); + }, + ); + } + + void successPopUp(String message) { + showDialog( + context: context, + builder: (context) { + return MIHSuccessMessage( + successType: "Success", + successMessage: message, + ); + }, + ); + } + + String hideEmail(String email) { + var firstLetter = email[0]; + var end = email.split("@")[1]; + return "$firstLetter********@$end"; + } + + void addEmployeePopUp(int index) { + setState(() { + //accessController.text = widget.users[index].access; + //typeController.text = widget.users[index].title; + // var fnameInitial = widget.users[index].fname[0]; + // var lnameInitial = widget.users[index].lname[0]; + fnameController.text = widget.users[index].username; + lnameController.text = hideEmail(widget.users[index].email); + }); + showDialog( + context: context, + barrierDismissible: false, + builder: (context) => MIHWindow( + fullscreen: false, + windowTitle: "Add Employee", + windowBody: [ + const SizedBox(height: 10.0), + MIHTextField( + controller: fnameController, + hintText: "Username Name", + editable: false, + required: true, + ), + const SizedBox(height: 10.0), + MIHTextField( + controller: lnameController, + hintText: "Email", + editable: false, + required: true, + ), + const SizedBox(height: 10.0), + MIHDropdownField( + controller: typeController, + hintText: "Title", + dropdownOptions: const ["Doctor", "Assistant"], + required: true, + editable: true, + enableSearch: false, + ), + const SizedBox(height: 10.0), + MIHDropdownField( + controller: accessController, + hintText: "Access", + dropdownOptions: const ["Full", "Partial"], + required: true, + editable: true, + enableSearch: false, + ), + const SizedBox(height: 15.0), + SizedBox( + width: 300, + height: 50, + child: MIHButton( + buttonText: "Add", + buttonColor: + MzanziInnovationHub.of(context)!.theme.secondaryColor(), + textColor: + MzanziInnovationHub.of(context)!.theme.primaryColor(), + onTap: () { + if (isRequiredFieldsCaptured()) { + createBusinessUserAPICall(index); + } else { + showDialog( + context: context, + builder: (context) { + return const MIHErrorMessage( + errorType: "Input Error"); + }, + ); + } + }, + ), + ), + const SizedBox(height: 10.0), + ], + windowTools: [], + onWindowTapClose: () { + Navigator.pop(context); + })); + } + + @override + void dispose() { + accessController.dispose(); + typeController.dispose(); + fnameController.dispose(); + lnameController.dispose(); + super.dispose(); + } + + @override + Widget build(BuildContext context) { + return ListView.separated( + shrinkWrap: true, + physics: const NeverScrollableScrollPhysics(), + separatorBuilder: (BuildContext context, index) { + return Divider( + color: MzanziInnovationHub.of(context)!.theme.secondaryColor(), + ); + }, + itemCount: widget.users.length, + itemBuilder: (context, index) { + var isYou = ""; + if (widget.arguments.signedInUser.app_id == + widget.users[index].app_id) { + isYou = "(You)"; + } + return ListTile( + title: Text("@${widget.users[index].username} $isYou"), + subtitle: Text( + "Email: ${hideEmail(widget.users[index].email)}", + style: TextStyle( + color: MzanziInnovationHub.of(context)!.theme.secondaryColor(), + ), + ), + onTap: () { + addEmployeePopUp(index); + }, + ); + }, + ); + } +}