validation added for forms

design_3.0_medical_gas
WaseemAbbasi22 1 month ago
parent 20b362142c
commit 1df25cc9dd

@ -45,6 +45,7 @@ class _CreateMedicalGasRequestPageState extends State<CreateMedicalGasRequestPag
MedicalGasFormModel _medicalGasFormModel = MedicalGasFormModel(); MedicalGasFormModel _medicalGasFormModel = MedicalGasFormModel();
MedicalGasSupplierModel? medicalGasInfo; MedicalGasSupplierModel? medicalGasInfo;
late MedicalGasInspectionProvider medicalGasInspectionProvider; late MedicalGasInspectionProvider medicalGasInspectionProvider;
late SiteProvider siteProvider;
bool isGasInfoLoading = false; bool isGasInfoLoading = false;
@override @override
@ -52,10 +53,14 @@ class _CreateMedicalGasRequestPageState extends State<CreateMedicalGasRequestPag
super.initState(); super.initState();
// Provider.of<MedicalGasSupplierProvider>(context, listen: false).reset(); // Provider.of<MedicalGasSupplierProvider>(context, listen: false).reset();
medicalGasInspectionProvider = Provider.of<MedicalGasInspectionProvider>(context, listen: false); medicalGasInspectionProvider = Provider.of<MedicalGasInspectionProvider>(context, listen: false);
siteProvider = Provider.of<SiteProvider>(context, listen: false);
_populateFormData(); _populateFormData();
} }
_populateFormData() { _populateFormData() {
if (siteProvider.items.isEmpty) {
siteProvider.reset();
}
if (widget.dataModel != null) { if (widget.dataModel != null) {
MedicalGasDataModel dataModel = widget.dataModel!; MedicalGasDataModel dataModel = widget.dataModel!;
_medicalGasFormModel = MedicalGasFormModel( _medicalGasFormModel = MedicalGasFormModel(
@ -97,7 +102,7 @@ class _CreateMedicalGasRequestPageState extends State<CreateMedicalGasRequestPag
context: context, context: context,
title: "Order Type", title: "Order Type",
validator: (value) { validator: (value) {
if (value == null) return "Mandatory"; if (value == null) return "Please select order type";
return null; return null;
}, },
initialValue: _medicalGasFormModel.orderType, initialValue: _medicalGasFormModel.orderType,
@ -113,7 +118,7 @@ class _CreateMedicalGasRequestPageState extends State<CreateMedicalGasRequestPag
context: context, context: context,
title: "Item Type", title: "Item Type",
validator: (value) { validator: (value) {
if (value == null) return "Mandatory"; if (value == null) return "Please select item type";
return null; return null;
}, },
initialValue: _medicalGasFormModel.itemType, initialValue: _medicalGasFormModel.itemType,
@ -238,25 +243,25 @@ class _CreateMedicalGasRequestPageState extends State<CreateMedicalGasRequestPag
labelText: model.itemName, labelText: model.itemName,
hintText: 'Enter Quantity'.addTranslation, hintText: 'Enter Quantity'.addTranslation,
backgroundColor: AppColor.fieldBgColor(context), backgroundColor: AppColor.fieldBgColor(context),
initialValue: model.requestedQuantity != null ? model.requestedQuantity.toString() : '', initialValue: model.requestedQuantity != null ? model.requestedQuantity?.toStringAsFixed(0) : '',
// initialValue: model.value != null ? model.value.toString() : '', // initialValue: model.value != null ? model.value.toString() : '',
textAlign: TextAlign.center, textAlign: TextAlign.center,
validator: (value) { // validator: (value) {
if (value == null || value.trim().isEmpty) { // if (value == null || value.trim().isEmpty) {
return "This field is required"; // return "This field is required";
} // }
//
final intVal = int.tryParse(value); // final intVal = int.tryParse(value);
if (intVal == null) { // if (intVal == null) {
return "Enter a valid number"; // return "Enter a valid number";
} // }
//
if (intVal <= 0) { // if (intVal <= 0) {
return "Value must be greater than 0"; // return "Value must be greater than 0";
} // }
//
return null; // return null;
}, // },
textInputType: TextInputType.number, textInputType: TextInputType.number,
labelStyle: AppTextStyles.textFieldLabelStyle, labelStyle: AppTextStyles.textFieldLabelStyle,
showShadow: false, showShadow: false,

@ -36,6 +36,8 @@ class _UpdateDeliveryNotesState extends State<UpdateDeliveryNotes> {
late MedicalGasInspectionProvider medicalGasInspectionProvider; late MedicalGasInspectionProvider medicalGasInspectionProvider;
bool pressureTestAcknowledgement = false; bool pressureTestAcknowledgement = false;
bool leakTestAcknowledgement = false; bool leakTestAcknowledgement = false;
final GlobalKey<FormState> _formKey = GlobalKey<FormState>();
final GlobalKey<ScaffoldState> _scaffoldKey = GlobalKey<ScaffoldState>();
// List<MedicalGasRequestDetailModel> selectedItemList = []; // List<MedicalGasRequestDetailModel> selectedItemList = [];
@ -56,7 +58,7 @@ class _UpdateDeliveryNotesState extends State<UpdateDeliveryNotes> {
MedicalGasDataModel dataModel = widget.dataModel!; MedicalGasDataModel dataModel = widget.dataModel!;
formModel = DeliveryNotesFormModel( formModel = DeliveryNotesFormModel(
id: dataModel.id, id: dataModel.id,
deliveredItemList: dataModel.requestDetailDtos, deliveredItemList: dataModel.requestDetailDtos.where((item) => item.requestedQuantity! > 0).toList(),
isInspectedGasLeak: dataModel.isInspectedGasLeak, isInspectedGasLeak: dataModel.isInspectedGasLeak,
isPressureChecked: dataModel.isPressureChecked, isPressureChecked: dataModel.isPressureChecked,
deliveredDate: dataModel.deliveredDate, deliveredDate: dataModel.deliveredDate,
@ -79,207 +81,210 @@ class _UpdateDeliveryNotesState extends State<UpdateDeliveryNotes> {
// }, // },
), ),
body: SafeArea( body: SafeArea(
child: Column( child: Form(
children: [ key: _formKey,
ListView( child: Column(
padding: const EdgeInsets.all(16), children: [
children: [ ListView(
Column( padding: const EdgeInsets.all(16),
crossAxisAlignment: CrossAxisAlignment.start, children: [
children: [ Column(
ADatePicker( crossAxisAlignment: CrossAxisAlignment.start,
label: "Delivered Date", children: [
hideShadow: true, ADatePicker(
backgroundColor: AppColor.fieldBgColor(context), label: "Delivered Date",
from: DateTime.now().subtract(const Duration(days: 365 * 3)), hideShadow: true,
date: formModel.deliveredDate, backgroundColor: AppColor.fieldBgColor(context),
formatDateWithTime: true, from: DateTime.now().subtract(const Duration(days: 365 * 3)),
onDatePicker: (selectedDate) { date: formModel.deliveredDate,
showTimePicker( formatDateWithTime: true,
context: context, onDatePicker: (selectedDate) {
initialTime: TimeOfDay.now(), showTimePicker(
).then((selectedTime) { context: context,
if (selectedTime != null) { initialTime: TimeOfDay.now(),
formModel.deliveredDate = DateTime(selectedDate.year, selectedDate.month, selectedDate.day, selectedTime.hour, selectedTime.minute); ).then((selectedTime) {
setState(() {}); if (selectedTime != null) {
} formModel.deliveredDate = DateTime(selectedDate.year, selectedDate.month, selectedDate.day, selectedTime.hour, selectedTime.minute);
}); setState(() {});
}, }
), });
16.height, },
AppTextFormField( ),
initialValue: formModel.deliveryNoteNumber, 16.height,
labelText: "Delivery Notes", AppTextFormField(
validator: (value) { initialValue: formModel.deliveryNoteNumber,
if ((value ?? "").isEmpty) return "Mandatory"; labelText: "Delivery Notes",
return null; // validator: (value) {
}, // if ((value ?? "").isEmpty) return "Delivery Notes Required";
backgroundColor: AppColor.fieldBgColor(context), // return null;
labelStyle: AppTextStyles.textFieldLabelStyle.copyWith(color: AppColor.textColor(context)), // },
floatingLabelStyle: AppTextStyles.textFieldLabelStyle.copyWith(color: AppColor.textColor(context)), backgroundColor: AppColor.fieldBgColor(context),
showShadow: false, labelStyle: AppTextStyles.textFieldLabelStyle.copyWith(color: AppColor.textColor(context)),
textInputType: TextInputType.multiline, floatingLabelStyle: AppTextStyles.textFieldLabelStyle.copyWith(color: AppColor.textColor(context)),
makeMultiLinesNull: true, showShadow: false,
onChange: (value) { textInputType: TextInputType.multiline,
formModel.deliveryNoteNumber = value; makeMultiLinesNull: true,
}, onChange: (value) {
), formModel.deliveryNoteNumber = value;
16.height, },
),
16.height,
//Older design code //Older design code
// MultipleItemDropDownMenu<MedicalGasRequestDetailModel, NullableLoadingProvider>( // MultipleItemDropDownMenu<MedicalGasRequestDetailModel, NullableLoadingProvider>(
// context: context, // context: context,
// showAsBottomSheet: true, // showAsBottomSheet: true,
// backgroundColor: AppColor.neutral100, // backgroundColor: AppColor.neutral100,
// showShadow: false, // showShadow: false,
// showCancel: true, // showCancel: true,
// requestById: context.userProvider.user?.clientId, // requestById: context.userProvider.user?.clientId,
// title: 'Delivered Items'.addTranslation, // title: 'Delivered Items'.addTranslation,
// staticData: formModel.deliveredItemList, // staticData: formModel.deliveredItemList,
// initialValue: selectedItemList, // initialValue: selectedItemList,
// onSelect: (value) { // onSelect: (value) {
// if ((value ?? []).isNotEmpty) { // if ((value ?? []).isNotEmpty) {
// WidgetsBinding.instance.addPostFrameCallback((_) { // WidgetsBinding.instance.addPostFrameCallback((_) {
// if (!mounted) return; // if (!mounted) return;
// setState(() { // setState(() {
// selectedItemList = value ?? []; // selectedItemList = value ?? [];
// }); // });
// }); // });
// } // }
// }, // },
// ), // ),
// if (selectedItemList.isNotEmpty) ...[ // if (selectedItemList.isNotEmpty) ...[
// 8.height, // 8.height,
// ListView.separated( // ListView.separated(
// separatorBuilder: (_, __) => 12.height, // separatorBuilder: (_, __) => 12.height,
// itemCount: selectedItemList.length, // itemCount: selectedItemList.length,
// shrinkWrap: true, // shrinkWrap: true,
// physics: const NeverScrollableScrollPhysics(), // physics: const NeverScrollableScrollPhysics(),
// itemBuilder: (context, index) { // itemBuilder: (context, index) {
// MedicalGasRequestDetailModel model = selectedItemList[index]; // MedicalGasRequestDetailModel model = selectedItemList[index];
// return AppTextFormField( // return AppTextFormField(
// labelText: '${model.name} (Req Qty =${model.requestedQuantity})', // labelText: '${model.name} (Req Qty =${model.requestedQuantity})',
// hintText: 'Enter Delivered Quantity'.addTranslation, // hintText: 'Enter Delivered Quantity'.addTranslation,
// backgroundColor: AppColor.fieldBgColor(context), // backgroundColor: AppColor.fieldBgColor(context),
// initialValue: model.deliveredQuantity != null ? model.deliveredQuantity?.toInt().toString() : '', // initialValue: model.deliveredQuantity != null ? model.deliveredQuantity?.toInt().toString() : '',
// textAlign: TextAlign.center, // textAlign: TextAlign.center,
// enable: true, // enable: true,
// textInputType: TextInputType.number, // textInputType: TextInputType.number,
// labelStyle: AppTextStyles.textFieldLabelStyle, // labelStyle: AppTextStyles.textFieldLabelStyle,
// showShadow: false, // showShadow: false,
// onChange: (value) { // onChange: (value) {
// if (value.isNotEmpty) { // if (value.isNotEmpty) {
// model.deliveredQuantity = double.tryParse(value); // model.deliveredQuantity = double.tryParse(value);
// } // }
// }, // },
// style: Theme.of(context).textTheme.titleMedium, // style: Theme.of(context).textTheme.titleMedium,
// ); // );
// }, // },
// ) // )
// ], // ],
if (formModel.deliveredItemList.isNotEmpty) ...[ if (formModel.deliveredItemList.isNotEmpty) ...[
_ItemRowLayout( _ItemRowLayout(
left: 'Items'.addTranslation.bodyText(context).custom(color: AppColor.textColor(context)), left: 'Items'.addTranslation.bodyText(context).custom(color: AppColor.textColor(context)),
right: 'Delivered Qty'.addTranslation.bodyText(context).custom(color: AppColor.textColor(context)), right: 'Delivered Qty'.addTranslation.bodyText(context).custom(color: AppColor.textColor(context)),
),
8.height,
ListView.separated(
separatorBuilder: (_, __) => 12.height,
itemCount: formModel.deliveredItemList.length,
shrinkWrap: true,
physics: const NeverScrollableScrollPhysics(),
itemBuilder: (context, index) {
MedicalGasRequestDetailModel model = formModel.deliveredItemList[index];
return itemQuantityFieldWidget(index: index, model: model, context: context);
},
)
],
16.height,
AttachmentPicker(
label: 'Upload Attachment',
attachment: formModel.attachments,
buttonColor: AppColor.primary10,
// showAsListView: true,
onlyImages: false,
buttonIcon: 'attachment_icon'.toSvgAsset(
color: AppColor.primary10,
),
),
16.height,
//should create a reusable widget.
Row(
children: [
Checkbox(
value: formModel.isPressureChecked,
visualDensity: const VisualDensity(horizontal: -4.0, vertical: -4.0),
activeColor: AppColor.blueStatus(context),
materialTapTargetSize: MaterialTapTargetSize.shrinkWrap,
onChanged: (value) {
setState(() {
formModel.isPressureChecked = value!;
});
}),
12.width,
"I Acknowledge that the received medical gases cylinders have been tested for pressure."
.addTranslation
.bodyText(context)
.custom(color: context.isDark ? AppColor.primary50 : AppColor.neutral120)
.expanded,
],
), ),
8.height, 8.height,
ListView.separated( Row(
separatorBuilder: (_, __) => 12.height, // mainAxisAlignment: MainAxisAlignment.start,
itemCount: formModel.deliveredItemList.length, crossAxisAlignment: CrossAxisAlignment.start,
shrinkWrap: true, children: [
physics: const NeverScrollableScrollPhysics(), Checkbox(
itemBuilder: (context, index) { value: formModel.isInspectedGasLeak,
MedicalGasRequestDetailModel model = formModel.deliveredItemList[index]; visualDensity: const VisualDensity(horizontal: -4.0, vertical: -4.0),
return itemQuantityFieldWidget(index: index, model: model, context: context); activeColor: AppColor.blueStatus(context),
}, materialTapTargetSize: MaterialTapTargetSize.shrinkWrap,
) onChanged: (value) {
setState(() {
formModel.isInspectedGasLeak = value!;
});
}),
12.width,
"I Acknowledge that the received medical gases cylinders have been inspected for leak test."
.addTranslation
.bodyText(context)
.custom(color: context.isDark ? AppColor.primary50 : AppColor.neutral120)
.expanded,
],
),
], ],
16.height, ).toShadowContainer(context, padding: 12),
],
AttachmentPicker( ).expanded,
label: 'Upload Attachment', FooterActionButton.footerContainer(
attachment: formModel.attachments, context: context,
child: Row(
children: [
AppFilledButton(
buttonColor: AppColor.primary10, buttonColor: AppColor.primary10,
// showAsListView: true, label: 'Save'.addTranslation,
onlyImages: false, onPressed: () {
buttonIcon: 'attachment_icon'.toSvgAsset( _update(context: context);
color: AppColor.primary10, },
), // buttonColor: AppColor.primary10,
), ).expanded,
16.height, 8.width,
//should create a reusable widget. AppFilledButton(
Row( buttonColor: AppColor.primary10,
children: [ label: 'Submit'.addTranslation,
Checkbox( onPressed: () {
value: formModel.isPressureChecked, _update(context: context, isSubmitted: true);
visualDensity: const VisualDensity(horizontal: -4.0, vertical: -4.0), },
activeColor: AppColor.blueStatus(context), // buttonColor: AppColor.primary10,
materialTapTargetSize: MaterialTapTargetSize.shrinkWrap, ).expanded,
onChanged: (value) {
setState(() {
formModel.isPressureChecked = value!;
});
}),
12.width,
"I Acknowledge that the received medical gases cylinders have been tested for pressure."
.addTranslation
.bodyText(context)
.custom(color: context.isDark ? AppColor.primary50 : AppColor.neutral120)
.expanded,
],
),
8.height,
Row(
// mainAxisAlignment: MainAxisAlignment.start,
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Checkbox(
value: formModel.isInspectedGasLeak,
visualDensity: const VisualDensity(horizontal: -4.0, vertical: -4.0),
activeColor: AppColor.blueStatus(context),
materialTapTargetSize: MaterialTapTargetSize.shrinkWrap,
onChanged: (value) {
setState(() {
formModel.isInspectedGasLeak = value!;
});
}),
12.width,
"I Acknowledge that the received medical gases cylinders have been inspected for leak test."
.addTranslation
.bodyText(context)
.custom(color: context.isDark ? AppColor.primary50 : AppColor.neutral120)
.expanded,
],
),
], ],
).toShadowContainer(context, padding: 12), ),
],
).expanded,
FooterActionButton.footerContainer(
context: context,
child: Row(
children: [
AppFilledButton(
buttonColor: AppColor.primary10,
label: 'Save'.addTranslation,
onPressed: () {
_update(context: context);
},
// buttonColor: AppColor.primary10,
).expanded,
8.width,
AppFilledButton(
buttonColor: AppColor.primary10,
label: 'Submit'.addTranslation,
onPressed: () {
_update(context: context, isSubmitted: true);
},
// buttonColor: AppColor.primary10,
).expanded,
],
), ),
), ],
], ),
), ),
)); ));
// .handlePopScope( // .handlePopScope(
@ -290,6 +295,24 @@ class _UpdateDeliveryNotesState extends State<UpdateDeliveryNotes> {
} }
void _update({required BuildContext context, bool isSubmitted = false}) async { void _update({required BuildContext context, bool isSubmitted = false}) async {
if (!_formKey.currentState!.validate()) return;
if (formModel.deliveredDate == null) {
'Delivered Date Required'.addTranslation.showToast;
return;
}
if (formModel.deliveryNoteNumber == null) {
'Delivery Notes Required'.addTranslation.showToast;
return;
}
if (formModel.isPressureChecked == null || formModel.isPressureChecked == false) {
'Please acknowledge cylinders are tested for pressure'.addTranslation.showToast;
return;
}
if (formModel.isInspectedGasLeak == null || formModel.isInspectedGasLeak == false) {
'Please acknowledge cylinders have been inspected for leak test'.addTranslation.showToast;
return;
}
_formKey.currentState?.save();
formModel.gasDeliveredQuantityDtos = []; formModel.gasDeliveredQuantityDtos = [];
formModel.isSubmitted = isSubmitted; formModel.isSubmitted = isSubmitted;
for (var item in formModel.deliveredItemList) { for (var item in formModel.deliveredItemList) {
@ -331,7 +354,7 @@ class _UpdateDeliveryNotesState extends State<UpdateDeliveryNotes> {
color: context.isDark ? Colors.white : AppColor.white936, color: context.isDark ? Colors.white : AppColor.white936,
fontWeight: FontWeight.w500, fontWeight: FontWeight.w500,
), ),
'Req Qty ${model.requestedQuantity}'.bodyText2(context).custom( 'Req Qty ${model.requestedQuantity?.toStringAsFixed(0)}'.bodyText2(context).custom(
color: context.isDark ? Colors.white : AppColor.white936, color: context.isDark ? Colors.white : AppColor.white936,
fontWeight: FontWeight.w500, fontWeight: FontWeight.w500,
), ),
@ -357,16 +380,32 @@ class _UpdateDeliveryNotesState extends State<UpdateDeliveryNotes> {
return null; return null;
}, },
decoration: InputDecoration( decoration: InputDecoration(
contentPadding: EdgeInsets.symmetric(horizontal: 5.toScreenWidth), isDense: true,
contentPadding: EdgeInsets.symmetric(
horizontal: 5.toScreenWidth,
vertical: 6, // keeps normal height ~30
),
filled: true, filled: true,
fillColor: AppColor.fieldBgColor(context), fillColor: AppColor.fieldBgColor(context),
constraints: BoxConstraints(
maxHeight: 30.toScreenHeight,
),
border: border, border: border,
enabledBorder: border, enabledBorder: border,
focusedBorder: border, focusedBorder: border,
errorStyle: const TextStyle(
height: 1.2, // controls extra height when error appears
fontSize: 12,
),
), ),
// decoration: InputDecoration(
// contentPadding: EdgeInsets.symmetric(horizontal: 5.toScreenWidth),
// filled: true,
// fillColor: AppColor.fieldBgColor(context),
// constraints: BoxConstraints(
// maxHeight: 40.toScreenHeight,
// ),
// border: border,
// enabledBorder: border,
// focusedBorder: border,
// ),
onChanged: (value) { onChanged: (value) {
model.deliveredQuantity = int.tryParse(value); model.deliveredQuantity = int.tryParse(value);
}, },
@ -387,7 +426,7 @@ class _ItemRowLayout extends StatelessWidget {
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
return Row( return Row(
crossAxisAlignment: CrossAxisAlignment.center, crossAxisAlignment: CrossAxisAlignment.start,
children: [ children: [
Expanded(child: left), // Items column Expanded(child: left), // Items column
SizedBox( SizedBox(

Loading…
Cancel
Save