From 543930fc4b6631de4957541551ec4d9105a7bec1 Mon Sep 17 00:00:00 2001 From: yaso-meth Date: Mon, 1 Jul 2024 15:00:47 +0200 Subject: [PATCH] required modifications --- .../lib/components/medCertInput.dart | 5 +- .../lib/components/myDateInput.dart | 67 +++++++++++++++-- .../lib/components/myMLTextInput.dart | 70 ++++++++++++++++-- .../lib/components/myPassInput.dart | 59 ++++++++++++++- .../lib/components/myTextInput.dart | 72 +++++++++++++++++-- .../lib/components/patientFiles.dart | 14 ++-- .../lib/components/patientNotes.dart | 2 + .../patient_manager/lib/pages/patientAdd.dart | 11 ++- .../lib/pages/patientEdit.dart | 11 ++- .../patient_manager/lib/pages/register.dart | 4 ++ .../patient_manager/lib/pages/signin.dart | 2 + 11 files changed, 294 insertions(+), 23 deletions(-) diff --git a/Frontend/patient_manager/lib/components/medCertInput.dart b/Frontend/patient_manager/lib/components/medCertInput.dart index 0d98a7da..a09991d9 100644 --- a/Frontend/patient_manager/lib/components/medCertInput.dart +++ b/Frontend/patient_manager/lib/components/medCertInput.dart @@ -20,7 +20,7 @@ class _MedcertinputState extends State { @override Widget build(BuildContext context) { return SizedBox( - height: 250, + height: 325, child: Column( children: [ const SizedBox(height: 50.0), @@ -29,6 +29,7 @@ class _MedcertinputState extends State { child: MyDateField( controller: widget.startDateController, LableText: "From", + required: true, ), ), const SizedBox(height: 25.0), @@ -37,6 +38,7 @@ class _MedcertinputState extends State { child: MyDateField( controller: widget.endDateTextController, LableText: "Up to Including", + required: true, ), ), const SizedBox(height: 25.0), @@ -45,6 +47,7 @@ class _MedcertinputState extends State { child: MyDateField( controller: widget.retDateTextController, LableText: "Return", + required: true, ), ), ], diff --git a/Frontend/patient_manager/lib/components/myDateInput.dart b/Frontend/patient_manager/lib/components/myDateInput.dart index 0fe8e24e..777be665 100644 --- a/Frontend/patient_manager/lib/components/myDateInput.dart +++ b/Frontend/patient_manager/lib/components/myDateInput.dart @@ -3,13 +3,13 @@ import 'package:flutter/material.dart'; class MyDateField extends StatefulWidget { final controller; final String LableText; - //final bool editable; + final bool required; const MyDateField({ super.key, required this.controller, required this.LableText, - //required this.editable, + required this.required, }); @override @@ -17,6 +17,8 @@ class MyDateField extends StatefulWidget { } class _MyDateFieldState extends State { + FocusNode _focus = FocusNode(); + bool startup = true; // bool makeEditable() { Future _selectDate(BuildContext context) async { DateTime? picked = await showDatePicker( @@ -33,6 +35,53 @@ class _MyDateFieldState extends State { } } + Widget setRequiredText() { + if (widget.required) { + return Row( + children: [ + const Text( + "*", + style: TextStyle(color: Colors.red), + ), + const SizedBox( + width: 8.0, + ), + Text(widget.LableText, + style: const TextStyle(color: Colors.blueAccent)), + ], + ); + } else { + return Text(widget.LableText, + style: const TextStyle(color: Colors.blueAccent)); + } + } + + void _onFocusChange() { + setState(() { + startup = false; + }); + } + + String? get _errorText { + final text = widget.controller.text; + if (startup) { + return null; + } + if (!widget.required) { + return null; + } + if (text.isEmpty) { + return "${widget.LableText} is required"; + } + return null; + } + + @override + void initState() { + _focus.addListener(_onFocusChange); + super.initState(); + } + @override Widget build(BuildContext context) { return Padding( @@ -41,9 +90,19 @@ class _MyDateFieldState extends State { controller: widget.controller, readOnly: true, obscureText: false, + focusNode: _focus, + onChanged: (_) => setState(() { + startup = false; + }), decoration: InputDecoration( - labelText: widget.LableText, - prefixIcon: const Icon(Icons.calendar_today), + errorText: _errorText, + label: setRequiredText(), + //labelText: widget.LableText, + //labelStyle: const TextStyle(color: Colors.blueAccent), + prefixIcon: const Icon( + Icons.calendar_today, + color: Colors.blueAccent, + ), fillColor: Colors.white, filled: true, //hintText: hintText, diff --git a/Frontend/patient_manager/lib/components/myMLTextInput.dart b/Frontend/patient_manager/lib/components/myMLTextInput.dart index 783cc0bc..1927386f 100644 --- a/Frontend/patient_manager/lib/components/myMLTextInput.dart +++ b/Frontend/patient_manager/lib/components/myMLTextInput.dart @@ -1,25 +1,82 @@ import 'package:flutter/material.dart'; -class MyMLTextField extends StatelessWidget { +class MyMLTextField extends StatefulWidget { final controller; final String hintText; final bool editable; + final bool required; const MyMLTextField({ super.key, required this.controller, required this.hintText, required this.editable, + required this.required, }); + @override + State createState() => _MyMLTextFieldState(); +} + +class _MyMLTextFieldState extends State { + bool startup = true; + FocusNode _focus = FocusNode(); + bool makeEditable() { - if (editable) { + if (widget.editable) { return false; } else { return true; } } + String? get _errorText { + final text = widget.controller.text; + if (startup) { + return null; + } + if (!widget.required) { + return null; + } + if (text.isEmpty) { + return "${widget.hintText} is required"; + } + return null; + } + + void _onFocusChange() { + setState(() { + startup = false; + }); + } + + Widget setRequiredText() { + if (widget.required) { + return Row( + children: [ + const Text( + "*", + style: TextStyle(color: Colors.red), + ), + const SizedBox( + width: 8.0, + ), + Text(widget.hintText, + style: const TextStyle(color: Colors.blueAccent)), + ], + ); + } else { + return Text(widget.hintText, + style: const TextStyle(color: Colors.blueAccent)); + } + } + + @override + void initState() { + _focus.addListener(_onFocusChange); + super.initState(); + } + @override Widget build(BuildContext context) { return Padding( @@ -29,11 +86,16 @@ class MyMLTextField extends StatelessWidget { textAlignVertical: TextAlignVertical.top, expands: true, maxLines: null, - controller: controller, + controller: widget.controller, readOnly: makeEditable(), obscureText: false, + focusNode: _focus, + onChanged: (_) => setState(() { + startup = false; + }), decoration: InputDecoration( - label: Text(hintText), + label: setRequiredText(), + errorText: _errorText, labelStyle: const TextStyle(color: Colors.blueAccent), alignLabelWithHint: true, fillColor: Colors.white, diff --git a/Frontend/patient_manager/lib/components/myPassInput.dart b/Frontend/patient_manager/lib/components/myPassInput.dart index 567b0569..ddc19663 100644 --- a/Frontend/patient_manager/lib/components/myPassInput.dart +++ b/Frontend/patient_manager/lib/components/myPassInput.dart @@ -3,11 +3,13 @@ import 'package:flutter/material.dart'; class MyPassField extends StatefulWidget { final controller; final String hintText; + final bool required; const MyPassField({ super.key, required this.controller, required this.hintText, + required this.required, }); @override @@ -15,6 +17,7 @@ class MyPassField extends StatefulWidget { } class _MyPassFieldState extends State { + bool startup = true; final textFieldFocusNode = FocusNode(); bool _obscured = true; @@ -29,6 +32,53 @@ class _MyPassFieldState extends State { }); } + String? get _errorText { + final text = widget.controller.text; + if (startup) { + return null; + } + if (!widget.required) { + return null; + } + if (text.isEmpty) { + return "${widget.hintText} is required"; + } + return null; + } + + Widget setRequiredText() { + if (widget.required) { + return Row( + children: [ + const Text( + "*", + style: TextStyle(color: Colors.red), + ), + const SizedBox( + width: 8.0, + ), + Text(widget.hintText, + style: const TextStyle(color: Colors.blueAccent)), + ], + ); + } else { + return Text(widget.hintText, + style: const TextStyle(color: Colors.blueAccent)); + } + } + + void _onFocusChange() { + setState(() { + startup = false; + }); + } + + @override + void initState() { + textFieldFocusNode.addListener(_onFocusChange); + super.initState(); + } + @override Widget build(BuildContext context) { return Padding( @@ -36,11 +86,16 @@ class _MyPassFieldState extends State { child: TextField( controller: widget.controller, obscureText: _obscured, + focusNode: textFieldFocusNode, + onChanged: (_) => setState(() { + startup = false; + }), decoration: InputDecoration( fillColor: Colors.white, filled: true, - label: Text(widget.hintText), - labelStyle: const TextStyle(color: Colors.blueAccent), + label: setRequiredText(), + //labelStyle: const TextStyle(color: Colors.blueAccent), + errorText: _errorText, //hintText: widget.hintText, //hintStyle: TextStyle(color: Colors.blueGrey[400]), enabledBorder: const OutlineInputBorder( diff --git a/Frontend/patient_manager/lib/components/myTextInput.dart b/Frontend/patient_manager/lib/components/myTextInput.dart index a2be3649..e65ff485 100644 --- a/Frontend/patient_manager/lib/components/myTextInput.dart +++ b/Frontend/patient_manager/lib/components/myTextInput.dart @@ -1,38 +1,100 @@ import 'package:flutter/material.dart'; -class MyTextField extends StatelessWidget { +class MyTextField extends StatefulWidget { final controller; final String hintText; final bool editable; + final bool required; const MyTextField({ super.key, required this.controller, required this.hintText, required this.editable, + required this.required, }); + @override + State createState() => _MyTextFieldState(); +} + +class _MyTextFieldState extends State { + bool startup = true; + FocusNode _focus = FocusNode(); + bool makeEditable() { - if (editable) { + if (widget.editable) { return false; } else { return true; } } + String? get _errorText { + final text = widget.controller.text; + if (startup) { + return null; + } + if (!widget.required) { + return null; + } + if (text.isEmpty) { + return "${widget.hintText} is required"; + } + return null; + } + + void _onFocusChange() { + setState(() { + startup = false; + }); + } + + Widget setRequiredText() { + if (widget.required) { + return Row( + children: [ + const Text( + "*", + style: TextStyle(color: Colors.red), + ), + const SizedBox( + width: 8.0, + ), + Text(widget.hintText, + style: const TextStyle(color: Colors.blueAccent)), + ], + ); + } else { + return Text(widget.hintText, + style: const TextStyle(color: Colors.blueAccent)); + } + } + + @override + void initState() { + _focus.addListener(_onFocusChange); + super.initState(); + } + @override Widget build(BuildContext context) { return Padding( padding: const EdgeInsets.symmetric(horizontal: 25.0), child: TextField( - controller: controller, + controller: widget.controller, + focusNode: _focus, readOnly: makeEditable(), obscureText: false, + onChanged: (_) => setState(() { + startup = false; + }), decoration: InputDecoration( - label: Text(hintText), - labelStyle: const TextStyle(color: Colors.blueAccent), + label: setRequiredText(), + //labelStyle: const TextStyle(color: Colors.blueAccent), fillColor: Colors.white, filled: true, + errorText: _errorText, //hintText: hintText, //hintStyle: TextStyle(color: Colors.blueGrey[400]), enabledBorder: const OutlineInputBorder( diff --git a/Frontend/patient_manager/lib/components/patientFiles.dart b/Frontend/patient_manager/lib/components/patientFiles.dart index ae30574b..5f50d387 100644 --- a/Frontend/patient_manager/lib/components/patientFiles.dart +++ b/Frontend/patient_manager/lib/components/patientFiles.dart @@ -1,6 +1,5 @@ import 'dart:async'; import 'dart:convert'; -import 'dart:typed_data'; import 'package:file_picker/file_picker.dart'; import 'package:flutter/material.dart'; @@ -9,7 +8,7 @@ import 'package:patient_manager/components/medCertInput.dart'; import 'package:patient_manager/components/myTextInput.dart'; import 'package:patient_manager/components/mybutton.dart'; import 'package:patient_manager/main.dart'; -import 'package:patient_manager/objects/AppUser.dart'; +import 'package:patient_manager/objects/appUser.dart'; import 'package:patient_manager/objects/files.dart'; import 'package:http/http.dart' as http; @@ -207,6 +206,9 @@ class _PatientFilesState extends State { ), TextButton( onPressed: () { + startDateController.clear(); + endDateTextController.clear(); + retDateTextController.clear(); Navigator.pop(context); }, child: const Text("Cancel"), @@ -255,9 +257,11 @@ class _PatientFilesState extends State { buttonText: "Select File"), ), MyTextField( - controller: selectedFileController, - hintText: "Selected FIle", - editable: false) + controller: selectedFileController, + hintText: "Selected FIle", + editable: false, + required: true, + ) ], ), ), diff --git a/Frontend/patient_manager/lib/components/patientNotes.dart b/Frontend/patient_manager/lib/components/patientNotes.dart index 0174359b..9e749077 100644 --- a/Frontend/patient_manager/lib/components/patientNotes.dart +++ b/Frontend/patient_manager/lib/components/patientNotes.dart @@ -132,6 +132,7 @@ class _PatientNotesState extends State { controller: titleController, hintText: "Title of Note", editable: true, + required: true, ), ), const SizedBox( @@ -142,6 +143,7 @@ class _PatientNotesState extends State { controller: noteTextController, hintText: "Note Details", editable: true, + required: true, ), ), ], diff --git a/Frontend/patient_manager/lib/pages/patientAdd.dart b/Frontend/patient_manager/lib/pages/patientAdd.dart index 3d060e73..9e0b8c4d 100644 --- a/Frontend/patient_manager/lib/pages/patientAdd.dart +++ b/Frontend/patient_manager/lib/pages/patientAdd.dart @@ -3,9 +3,9 @@ import 'dart:convert'; import 'package:flutter/material.dart'; import 'package:patient_manager/components/myTextInput.dart'; import 'package:patient_manager/components/mybutton.dart'; +import 'package:patient_manager/objects/appUser.dart'; import '../components/myAppBar.dart'; import 'package:http/http.dart' as http; -import '../objects/AppUser.dart'; class AddPatient extends StatefulWidget { final String userEmail; @@ -116,6 +116,7 @@ class _AddPatientState extends State { controller: idController, hintText: "13 digit ID Number or Passport", editable: true, + required: true, ), ), ], @@ -128,6 +129,7 @@ class _AddPatientState extends State { controller: fnameController, hintText: "First Name", editable: true, + required: false, ), ), ], @@ -140,6 +142,7 @@ class _AddPatientState extends State { controller: lnameController, hintText: "Last Name", editable: true, + required: true, ), ), ], @@ -152,6 +155,7 @@ class _AddPatientState extends State { controller: cellController, hintText: "Cell Number", editable: true, + required: true, ), ), ], @@ -164,6 +168,7 @@ class _AddPatientState extends State { controller: emailController, hintText: "Email", editable: true, + required: true, ), ), ], @@ -176,6 +181,7 @@ class _AddPatientState extends State { controller: addressController, hintText: "Address", editable: true, + required: true, ), ), ], @@ -198,6 +204,7 @@ class _AddPatientState extends State { controller: medNoController, hintText: "Medical Aid No.", editable: true, + required: true, ), ), ], @@ -210,6 +217,7 @@ class _AddPatientState extends State { controller: medNameController, hintText: "Medical Aid Name", editable: true, + required: true, ), ), ], @@ -222,6 +230,7 @@ class _AddPatientState extends State { controller: medSchemeController, hintText: "Medical Aid Scheme", editable: true, + required: true, ), ), ], diff --git a/Frontend/patient_manager/lib/pages/patientEdit.dart b/Frontend/patient_manager/lib/pages/patientEdit.dart index e0785825..6cbf5aa0 100644 --- a/Frontend/patient_manager/lib/pages/patientEdit.dart +++ b/Frontend/patient_manager/lib/pages/patientEdit.dart @@ -3,10 +3,10 @@ import 'dart:convert'; import 'package:flutter/material.dart'; import 'package:patient_manager/components/myTextInput.dart'; import 'package:patient_manager/components/mybutton.dart'; +import 'package:patient_manager/objects/appUser.dart'; import 'package:supabase_flutter/supabase_flutter.dart'; import '../components/myAppBar.dart'; import 'package:http/http.dart' as http; -import '../objects/AppUser.dart'; import '../objects/patients.dart'; class EditPatient extends StatefulWidget { @@ -234,6 +234,7 @@ class _EditPatientState extends State { controller: idController, hintText: "13 digit ID Number or Passport", editable: false, + required: true, ), ), ], @@ -246,6 +247,7 @@ class _EditPatientState extends State { controller: fnameController, hintText: "First Name", editable: true, + required: true, ), ), ], @@ -258,6 +260,7 @@ class _EditPatientState extends State { controller: lnameController, hintText: "Last Name", editable: true, + required: true, ), ), ], @@ -270,6 +273,7 @@ class _EditPatientState extends State { controller: cellController, hintText: "Cell Number", editable: true, + required: true, ), ), ], @@ -282,6 +286,7 @@ class _EditPatientState extends State { controller: emailController, hintText: "Email", editable: true, + required: true, ), ), ], @@ -294,6 +299,7 @@ class _EditPatientState extends State { controller: addressController, hintText: "Address", editable: true, + required: true, ), ), ], @@ -316,6 +322,7 @@ class _EditPatientState extends State { controller: medNoController, hintText: "Medical Aid No.", editable: true, + required: true, ), ), ], @@ -328,6 +335,7 @@ class _EditPatientState extends State { controller: medNameController, hintText: "Medical Aid Name", editable: true, + required: true, ), ), ], @@ -340,6 +348,7 @@ class _EditPatientState extends State { controller: medSchemeController, hintText: "Medical Aid Scheme", editable: true, + required: true, ), ), ], diff --git a/Frontend/patient_manager/lib/pages/register.dart b/Frontend/patient_manager/lib/pages/register.dart index 610f5fd7..4d6d34fe 100644 --- a/Frontend/patient_manager/lib/pages/register.dart +++ b/Frontend/patient_manager/lib/pages/register.dart @@ -96,6 +96,7 @@ class _RegisterState extends State { controller: officeID, hintText: 'OfficeID', editable: true, + required: true, ), ), //spacer @@ -107,6 +108,7 @@ class _RegisterState extends State { controller: emailController, hintText: 'Email', editable: true, + required: true, ), ), //spacer @@ -117,6 +119,7 @@ class _RegisterState extends State { child: MyPassField( controller: passwordController, hintText: 'Password', + required: true, ), ), //spacer @@ -127,6 +130,7 @@ class _RegisterState extends State { child: MyPassField( controller: confirmPasswordController, hintText: 'Confirm Password', + required: true, ), ), //spacer diff --git a/Frontend/patient_manager/lib/pages/signin.dart b/Frontend/patient_manager/lib/pages/signin.dart index 5859f38e..6c37e822 100644 --- a/Frontend/patient_manager/lib/pages/signin.dart +++ b/Frontend/patient_manager/lib/pages/signin.dart @@ -87,6 +87,7 @@ class _SignInState extends State { controller: emailController, hintText: 'Email', editable: true, + required: true, ), ), //spacer @@ -97,6 +98,7 @@ class _SignInState extends State { child: MyPassField( controller: passwordController, hintText: 'Password', + required: true, ), ), //spacer