add stepper to prescription generator

This commit is contained in:
2025-06-09 12:49:08 +02:00
parent 503580066d
commit 39ea6566f5
3 changed files with 123 additions and 106 deletions

View File

@@ -36,11 +36,9 @@ class _MihNumericStepperState extends State<MihNumericStepper> {
@override @override
void initState() { void initState() {
super.initState(); super.initState();
setState(() {
_currentValue = _currentValue =
int.tryParse(widget.controller.text) ?? widget.minValue ?? 0; int.tryParse(widget.controller.text) ?? widget.minValue ?? 0;
widget.controller.text = _currentValue.toString(); widget.controller.text = _currentValue.toString();
});
print("Current Value: $_currentValue"); print("Current Value: $_currentValue");
} }

View File

@@ -1,10 +1,12 @@
import 'dart:convert'; import 'dart:convert';
import 'package:mzansi_innovation_hub/main.dart'; import 'package:mzansi_innovation_hub/main.dart';
import 'package:mzansi_innovation_hub/mih_apis/mih_alert_services.dart';
import 'package:mzansi_innovation_hub/mih_components/mih_package_components/mih_button.dart'; import 'package:mzansi_innovation_hub/mih_components/mih_package_components/mih_button.dart';
import 'package:mzansi_innovation_hub/mih_components/mih_package_components/mih_form.dart';
import 'package:mzansi_innovation_hub/mih_components/mih_package_components/mih_numeric_stepper.dart';
import 'package:mzansi_innovation_hub/mih_components/mih_package_components/mih_search_bar.dart'; import 'package:mzansi_innovation_hub/mih_components/mih_package_components/mih_search_bar.dart';
import 'package:mzansi_innovation_hub/mih_packages/patient_profile/pat_profile/components/medicine_search.dart'; import 'package:mzansi_innovation_hub/mih_packages/patient_profile/pat_profile/components/medicine_search.dart';
import 'package:mzansi_innovation_hub/mih_components/mih_inputs_and_buttons/mih_dropdown_input.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_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_loading_circle.dart';
import 'package:mzansi_innovation_hub/mih_components/mih_pop_up_messages/mih_success_message.dart'; import 'package:mzansi_innovation_hub/mih_components/mih_pop_up_messages/mih_success_message.dart';
@@ -16,7 +18,6 @@ import 'package:mzansi_innovation_hub/mih_objects/business_user.dart';
import 'package:mzansi_innovation_hub/mih_objects/patients.dart'; import 'package:mzansi_innovation_hub/mih_objects/patients.dart';
import 'package:mzansi_innovation_hub/mih_objects/perscription.dart'; import 'package:mzansi_innovation_hub/mih_objects/perscription.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:flutter/services.dart';
import 'package:supertokens_flutter/http.dart' as http; import 'package:supertokens_flutter/http.dart' as http;
class PrescripInput extends StatefulWidget { class PrescripInput extends StatefulWidget {
@@ -55,6 +56,7 @@ class PrescripInput extends StatefulWidget {
class _PrescripInputState extends State<PrescripInput> { class _PrescripInputState extends State<PrescripInput> {
final FocusNode _focusNode = FocusNode(); final FocusNode _focusNode = FocusNode();
final FocusNode _searchFocusNode = FocusNode(); final FocusNode _searchFocusNode = FocusNode();
final _formKey = GlobalKey<FormState>();
List<Perscription> perscriptionObjOutput = []; List<Perscription> perscriptionObjOutput = [];
late double width; late double width;
late double height; late double height;
@@ -214,12 +216,7 @@ class _PrescripInputState extends State<PrescripInput> {
} }
bool isFieldsFilled() { bool isFieldsFilled() {
if (widget.medicineController.text.isEmpty || if (widget.medicineController.text.isEmpty) {
// widget.quantityController.text.isEmpty ||
widget.dosageController.text.isEmpty ||
widget.timesDailyController.text.isEmpty ||
widget.noDaysController.text.isEmpty ||
widget.noRepeatsController.text.isEmpty) {
return false; return false;
} else { } else {
return true; return true;
@@ -351,13 +348,15 @@ class _PrescripInputState extends State<PrescripInput> {
Widget displayMedInput() { Widget displayMedInput() {
return Column( return Column(
children: [ children: [
//const SizedBox(height: 25.0), MihForm(
formKey: _formKey,
formFields: [
MihSearchBar( MihSearchBar(
controller: widget.medicineController, controller: widget.medicineController,
hintText: "Search Medicine", hintText: "Search Medicine",
prefixIcon: Icons.search, prefixIcon: Icons.search,
fillColor: MzanziInnovationHub.of(context)!.theme.secondaryColor(), fillColor:
MzanziInnovationHub.of(context)!.theme.secondaryColor(),
hintColor: MzanziInnovationHub.of(context)!.theme.primaryColor(), hintColor: MzanziInnovationHub.of(context)!.theme.primaryColor(),
onPrefixIconTap: () { onPrefixIconTap: () {
getMedsPopUp(widget.medicineController); getMedsPopUp(widget.medicineController);
@@ -368,75 +367,97 @@ class _PrescripInputState extends State<PrescripInput> {
searchFocusNode: _searchFocusNode, searchFocusNode: _searchFocusNode,
), ),
const SizedBox(height: 10.0), const SizedBox(height: 10.0),
MihNumericStepper(
MIHDropdownField(
controller: widget.dosageController, controller: widget.dosageController,
fillColor:
MzanziInnovationHub.of(context)!.theme.secondaryColor(),
inputColor: MzanziInnovationHub.of(context)!.theme.primaryColor(),
hintText: "Dosage", hintText: "Dosage",
dropdownOptions: numberOptions, requiredText: true,
required: true, minValue: 1,
editable: true, // maxValue: 5,
enableSearch: false, validationOn: true,
), ),
const SizedBox(height: 10.0), const SizedBox(height: 10.0),
MIHDropdownField( MihNumericStepper(
controller: widget.timesDailyController, controller: widget.timesDailyController,
fillColor:
MzanziInnovationHub.of(context)!.theme.secondaryColor(),
inputColor: MzanziInnovationHub.of(context)!.theme.primaryColor(),
hintText: "Times Daily", hintText: "Times Daily",
dropdownOptions: numberOptions, requiredText: true,
required: true, minValue: 1,
editable: true, // maxValue: 5,
enableSearch: false, validationOn: true,
), ),
const SizedBox(height: 10.0), const SizedBox(height: 10.0),
MIHDropdownField( MihNumericStepper(
controller: widget.noDaysController, controller: widget.noDaysController,
fillColor:
MzanziInnovationHub.of(context)!.theme.secondaryColor(),
inputColor: MzanziInnovationHub.of(context)!.theme.primaryColor(),
hintText: "No. Days", hintText: "No. Days",
dropdownOptions: numberOptions, requiredText: true,
required: true, minValue: 1,
editable: true, // maxValue: 5,
enableSearch: false, validationOn: true,
), ),
const SizedBox(height: 10.0), const SizedBox(height: 10.0),
MIHDropdownField( MihNumericStepper(
controller: widget.noRepeatsController, controller: widget.noRepeatsController,
fillColor:
MzanziInnovationHub.of(context)!.theme.secondaryColor(),
inputColor: MzanziInnovationHub.of(context)!.theme.primaryColor(),
hintText: "No.Repeats", hintText: "No.Repeats",
dropdownOptions: numberOptions, requiredText: true,
required: true, minValue: 0,
editable: true, // maxValue: 5,
enableSearch: false, validationOn: true,
), ),
const SizedBox(height: 15.0), const SizedBox(height: 15.0),
MihButton( Center(
child: MihButton(
onPressed: () { onPressed: () {
if (_formKey.currentState!.validate()) {
if (isFieldsFilled()) { if (isFieldsFilled()) {
setState(() { setState(() {
updatePerscriptionList(); updatePerscriptionList();
widget.medicineController.clear(); widget.medicineController.clear();
widget.quantityController.clear(); widget.quantityController.text = "1";
widget.dosageController.clear(); widget.dosageController.text = "1";
widget.timesDailyController.clear(); widget.timesDailyController.text = "1";
widget.noDaysController.clear(); widget.noDaysController.text = "1";
widget.noRepeatsController.clear(); widget.noRepeatsController.text = "0";
}); });
} else { } else {
showDialog( showDialog(
context: context, context: context,
builder: (context) { builder: (context) {
return const MIHErrorMessage(errorType: "Input Error"); return const MIHErrorMessage(
errorType: "Input Error");
}, },
); );
} }
} else {
MihAlertServices().formNotFilledCompletely(context);
}
}, },
buttonColor: MzanziInnovationHub.of(context)!.theme.secondaryColor(), buttonColor:
MzanziInnovationHub.of(context)!.theme.secondaryColor(),
width: 300, width: 300,
child: Text( child: Text(
"Add", "Add",
style: TextStyle( style: TextStyle(
color: MzanziInnovationHub.of(context)!.theme.primaryColor(), color:
MzanziInnovationHub.of(context)!.theme.primaryColor(),
fontSize: 20, fontSize: 20,
fontWeight: FontWeight.bold, fontWeight: FontWeight.bold,
), ),
), ),
), ),
),
],
)
], ],
); );
} }
@@ -543,10 +564,8 @@ class _PrescripInputState extends State<PrescripInput> {
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
var size = MediaQuery.of(context).size; var size = MediaQuery.of(context).size;
setState(() {
width = size.width; width = size.width;
height = size.height; height = size.height;
});
return Wrap( return Wrap(
direction: Axis.horizontal, direction: Axis.horizontal,
alignment: WrapAlignment.center, alignment: WrapAlignment.center,

View File

@@ -344,11 +344,11 @@ class _PatientDocumentsState extends State<PatientDocuments> {
windowTitle: "Create Prescription", windowTitle: "Create Prescription",
onWindowTapClose: () { onWindowTapClose: () {
medicineController.clear(); medicineController.clear();
quantityController.clear(); quantityController.text = "1";
dosageController.clear(); dosageController.text = "1";
timesDailyController.clear(); timesDailyController.text = "1";
noDaysController.clear(); noDaysController.text = "1";
noRepeatsController.clear(); noRepeatsController.text = "0";
Navigator.pop(context); Navigator.pop(context);
}, },
windowBody: Column( windowBody: Column(