Add new mih text form field to Calc: Tip

This commit is contained in:
2025-06-06 15:33:20 +02:00
parent d772b3b25b
commit 4976911b25

View File

@@ -1,11 +1,13 @@
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_apis/mih_validation_services.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_dropdown_input.dart';
import 'package:mzansi_innovation_hub/mih_components/mih_inputs_and_buttons/mih_number_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_single_child_scroll.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_package_tool_body.dart'; import 'package:mzansi_innovation_hub/mih_components/mih_package_components/mih_package_tool_body.dart';
import 'package:mzansi_innovation_hub/mih_components/mih_package_components/mih_package_window.dart'; import 'package:mzansi_innovation_hub/mih_components/mih_package_components/mih_package_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_package_components/mih_text_form_field.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:font_awesome_flutter/font_awesome_flutter.dart'; import 'package:font_awesome_flutter/font_awesome_flutter.dart';
import 'package:math_expressions/math_expressions.dart'; import 'package:math_expressions/math_expressions.dart';
@@ -23,9 +25,11 @@ class _TipCalcState extends State<TipCalc> {
TextEditingController splitBillController = TextEditingController(); TextEditingController splitBillController = TextEditingController();
TextEditingController noPeopleController = TextEditingController(); TextEditingController noPeopleController = TextEditingController();
final ValueNotifier<String> splitValue = ValueNotifier(""); final ValueNotifier<String> splitValue = ValueNotifier("");
final _formKey = GlobalKey<FormState>();
String tip = ""; String tip = "";
String total = ""; String total = "";
String amountPerPerson = ""; String amountPerPerson = "";
String temp = "";
void splitSelected() { void splitSelected() {
if (splitBillController.text.isNotEmpty) { if (splitBillController.text.isNotEmpty) {
splitValue.value = splitBillController.text; splitValue.value = splitBillController.text;
@@ -35,38 +39,7 @@ class _TipCalcState extends State<TipCalc> {
} }
void validateInput() async { void validateInput() async {
bool valid = false; calculatePressed();
if (splitBillController.text.isNotEmpty &&
splitBillController.text == "Yes") {
if (billAmountController.text.isEmpty ||
tipPercentageController.text.isEmpty ||
noPeopleController.text.isEmpty) {
valid = false;
} else {
valid = true;
}
} else if (splitBillController.text.isNotEmpty &&
splitBillController.text == "No") {
if (billAmountController.text.isEmpty ||
tipPercentageController.text.isEmpty) {
valid = false;
} else {
valid = true;
}
} else {
valid = false;
}
print("Is input valid: $valid");
if (valid) {
calculatePressed();
} else {
showDialog(
context: context,
builder: (context) {
return const MIHErrorMessage(errorType: "Input Error");
},
);
}
} }
void calculatePressed() { void calculatePressed() {
@@ -262,104 +235,175 @@ class _TipCalcState extends State<TipCalc> {
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
double screenWidth = MediaQuery.of(context).size.width;
return MihPackageToolBody( return MihPackageToolBody(
borderOn: false, borderOn: false,
innerHorizontalPadding: 10, innerHorizontalPadding: 10,
bodyItem: getBody(), bodyItem: getBody(screenWidth),
); );
} }
Widget getBody() { Widget getBody(double width) {
return MihSingleChildScroll( return MihSingleChildScroll(
child: Column( child: Padding(
mainAxisSize: MainAxisSize.max, padding: MzanziInnovationHub.of(context)!.theme.screenType == "desktop"
children: <Widget>[ ? EdgeInsets.symmetric(horizontal: width * 0.2)
MIHNumberField( : EdgeInsets.symmetric(horizontal: width * 0.075),
controller: billAmountController, child: Column(
hintText: "Bill Amount", mainAxisSize: MainAxisSize.max,
editable: true, children: <Widget>[
required: true, MihForm(
enableDecimal: true, formKey: _formKey,
), formFields: [
const SizedBox(height: 10), MihTextFormField(
MIHNumberField( fillColor:
controller: tipPercentageController, MzanziInnovationHub.of(context)!.theme.secondaryColor(),
hintText: "Tip %", inputColor:
editable: true, MzanziInnovationHub.of(context)!.theme.primaryColor(),
required: true, controller: billAmountController,
enableDecimal: false, multiLineInput: false,
), requiredText: true,
const SizedBox(height: 10), hintText: "Bill Amount",
MIHDropdownField( numberMode: true,
controller: splitBillController, validator: (value) {
hintText: "Split Bill", return MihValidationServices().isEmpty(value);
dropdownOptions: const ["Yes", "No"], },
required: true,
editable: true,
enableSearch: false,
),
const SizedBox(height: 10),
ValueListenableBuilder(
valueListenable: splitValue,
builder: (BuildContext context, String value, Widget? child) {
return Visibility(
visible: value == "Yes",
child: Column(
children: [
MIHNumberField(
controller: noPeopleController,
hintText: "No. of People",
editable: true,
required: true,
enableDecimal: false,
),
const SizedBox(height: 10),
],
), ),
); // MIHNumberField(
}, // controller: billAmountController,
), // hintText: "Bill Amount",
Wrap( // editable: true,
spacing: 10, // required: true,
runSpacing: 10, // enableDecimal: true,
children: [ // ),
MihButton( const SizedBox(height: 10),
onPressed: () { MihTextFormField(
validateInput(); fillColor:
}, MzanziInnovationHub.of(context)!.theme.secondaryColor(),
buttonColor: inputColor:
MzanziInnovationHub.of(context)!.theme.successColor(), MzanziInnovationHub.of(context)!.theme.primaryColor(),
width: 300, controller: tipPercentageController,
child: Text( multiLineInput: false,
"Calculate", requiredText: true,
style: TextStyle( hintText: "Tip Percentage",
color: numberMode: true,
MzanziInnovationHub.of(context)!.theme.primaryColor(), validator: (value) {
fontSize: 20, return MihValidationServices().isEmpty(value);
fontWeight: FontWeight.bold, },
),
// MIHNumberField(
// controller: tipPercentageController,
// hintText: "Tip %",
// editable: true,
// required: true,
// enableDecimal: false,
// ),
const SizedBox(height: 20),
MIHDropdownField(
controller: splitBillController,
hintText: "Split Bill",
dropdownOptions: const ["Yes", "No"],
required: true,
editable: true,
enableSearch: false,
),
const SizedBox(height: 10),
ValueListenableBuilder(
valueListenable: splitValue,
builder: (BuildContext context, String value, Widget? child) {
temp = value;
return Visibility(
visible: temp == "Yes",
child: Column(
children: [
MihTextFormField(
fillColor: MzanziInnovationHub.of(context)!
.theme
.secondaryColor(),
inputColor: MzanziInnovationHub.of(context)!
.theme
.primaryColor(),
controller: noPeopleController,
multiLineInput: false,
requiredText: temp == "Yes",
hintText: "No. of People",
numberMode: true,
validator: (validationValue) {
if (temp == "Yes") {
return MihValidationServices()
.isEmpty(validationValue);
} else {
return null;
}
},
),
// MIHNumberField(
// controller: noPeopleController,
// hintText: "No. of People",
// editable: true,
// required: true,
// enableDecimal: false,
// ),
const SizedBox(height: 10),
],
),
);
},
),
const SizedBox(height: 10),
Center(
child: Wrap(
spacing: 10,
runSpacing: 10,
children: [
MihButton(
onPressed: () {
if (_formKey.currentState!.validate()) {
validateInput();
} else {
MihAlertServices().formNotFilledCompletely(context);
}
},
buttonColor: MzanziInnovationHub.of(context)!
.theme
.successColor(),
width: 300,
child: Text(
"Calculate",
style: TextStyle(
color: MzanziInnovationHub.of(context)!
.theme
.primaryColor(),
fontSize: 20,
fontWeight: FontWeight.bold,
),
),
),
MihButton(
onPressed: () {
clearInput();
},
buttonColor:
MzanziInnovationHub.of(context)!.theme.errorColor(),
width: 300,
child: Text(
"Clear",
style: TextStyle(
color: MzanziInnovationHub.of(context)!
.theme
.primaryColor(),
fontSize: 20,
fontWeight: FontWeight.bold,
),
),
),
],
), ),
), ),
), ],
MihButton( ),
onPressed: () { ],
clearInput(); ),
},
buttonColor:
MzanziInnovationHub.of(context)!.theme.errorColor(),
width: 300,
child: Text(
"Clear",
style: TextStyle(
color:
MzanziInnovationHub.of(context)!.theme.primaryColor(),
fontSize: 20,
fontWeight: FontWeight.bold,
),
),
),
],
),
],
), ),
); );
} }