import 'package:flutter/material.dart'; import 'package:provider/provider.dart'; import 'package:test_sa/extensions/context_extension.dart'; import 'package:test_sa/extensions/int_extensions.dart'; import 'package:test_sa/extensions/string_extensions.dart'; import 'package:test_sa/extensions/text_extensions.dart'; import 'package:test_sa/extensions/widget_extensions.dart'; import 'package:test_sa/modules/cm_module/views/components/action_button/footer_action_button.dart'; import 'package:test_sa/modules/medical_gas_inspection/models/delivery_notes_form_model.dart'; import 'package:test_sa/modules/medical_gas_inspection/models/medical_gas_data_model.dart'; import 'package:test_sa/modules/medical_gas_inspection/providers/medical_gas_inspection_provider.dart'; import 'package:test_sa/new_views/app_style/app_color.dart'; import 'package:test_sa/new_views/common_widgets/app_filled_button.dart'; import 'package:test_sa/new_views/common_widgets/app_lazy_loading.dart'; import 'package:test_sa/new_views/common_widgets/app_text_form_field.dart'; import 'package:test_sa/new_views/common_widgets/default_app_bar.dart'; import 'package:test_sa/new_views/common_widgets/multiple_item_drop_down_menu.dart'; import 'package:test_sa/providers/loading_list_notifier.dart'; import 'package:test_sa/views/widgets/date_and_time/date_picker.dart'; import 'package:test_sa/views/widgets/images/multi_image_picker.dart'; class UpdateDeliveryNotes extends StatefulWidget { final MedicalGasDataModel? dataModel; UpdateDeliveryNotes({Key? key, required this.dataModel}) : super(key: key); @override _UpdateDeliveryNotesState createState() { return _UpdateDeliveryNotesState(); } } class _UpdateDeliveryNotesState extends State { DeliveryNotesFormModel formModel = DeliveryNotesFormModel(); late MedicalGasInspectionProvider medicalGasInspectionProvider; bool pressureTestAcknowledgement = false; bool leakTestAcknowledgement = false; List selectedItemList = []; @override void initState() { super.initState(); medicalGasInspectionProvider = Provider.of(context, listen: false); _populateFormData(); } @override void dispose() { super.dispose(); } _populateFormData() { if (widget.dataModel != null) { MedicalGasDataModel dataModel = widget.dataModel!; formModel = DeliveryNotesFormModel( id: dataModel.id, deliveredItemList: dataModel.requestDetailDtos, isInspectedGasLeak: dataModel.isInspectedGasLeak, isPressureChecked: dataModel.isPressureChecked, deliveredDate: dataModel.deliveredDate, attachments: dataModel.deliveryNoteAttachmentDto, isSubmitted: dataModel.isSubmitted, deliveryNoteNumber: dataModel.deliveryNote); //Need to Confirm this condition selectedItemList = dataModel.requestDetailDtos.where((item) => item.deliveredQuantity != null && item.deliveredQuantity! > 0).toList(); setState(() {}); } } @override Widget build(BuildContext context) { return Scaffold( appBar: const DefaultAppBar( title: "Upload Delivery Note", // onWillPopScope: () { // _update(context: context); // }, ), body: SafeArea( child: Column( children: [ ListView( padding: const EdgeInsets.all(16), children: [ Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ ADatePicker( label: "Delivered Date", hideShadow: true, backgroundColor: AppColor.fieldBgColor(context), from: DateTime.now().subtract(const Duration(days: 365 * 3)), date: formModel.deliveredDate, formatDateWithTime: true, onDatePicker: (selectedDate) { showTimePicker( context: context, initialTime: TimeOfDay.now(), ).then((selectedTime) { if (selectedTime != null) { formModel.deliveredDate = DateTime(selectedDate.year, selectedDate.month, selectedDate.day, selectedTime.hour, selectedTime.minute); setState(() {}); } }); }, ), 16.height, MultipleItemDropDownMenu( context: context, showAsBottomSheet: true, backgroundColor: AppColor.neutral100, showShadow: false, showCancel: true, requestById: context.userProvider.user?.clientId, title: 'Delivered Items'.addTranslation, staticData: formModel.deliveredItemList, initialValue: selectedItemList, onSelect: (value) { if ((value ?? []).isNotEmpty) { WidgetsBinding.instance.addPostFrameCallback((_) { if (!mounted) return; setState(() { selectedItemList = value ?? []; }); }); } }, ), if (selectedItemList.isNotEmpty) ...[ 8.height, ListView.separated( separatorBuilder: (_, __) => 12.height, itemCount: selectedItemList.length, shrinkWrap: true, physics: const NeverScrollableScrollPhysics(), itemBuilder: (context, index) { MedicalGasRequestDetailModel model = selectedItemList[index]; return AppTextFormField( labelText: '${model.name} (Req Qty =${model.requestedQuantity})', hintText: 'Enter Delivered Quantity'.addTranslation, backgroundColor: AppColor.fieldBgColor(context), initialValue: model.deliveredQuantity != null ? model.deliveredQuantity?.toInt().toString() : '', textAlign: TextAlign.center, enable: true, textInputType: TextInputType.number, labelStyle: AppTextStyles.textFieldLabelStyle, showShadow: false, onChange: (value) { if (value.isNotEmpty) { model.deliveredQuantity = double.tryParse(value); } }, style: Theme.of(context).textTheme.titleMedium, ); }, ) ], 16.height, AppTextFormField( initialValue: formModel.deliveryNoteNumber, labelText: "Delivery Notes", validator: (value) { if ((value ?? "").isEmpty) return "Mandatory"; return null; }, backgroundColor: AppColor.fieldBgColor(context), labelStyle: AppTextStyles.textFieldLabelStyle.copyWith(color: AppColor.textColor(context)), floatingLabelStyle: AppTextStyles.textFieldLabelStyle.copyWith(color: AppColor.textColor(context)), showShadow: false, textInputType: TextInputType.multiline, makeMultiLinesNull: true, onChange: (value) { formModel.deliveryNoteNumber = value; }, ), 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, 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( // cxt: context, // onSave: () { // _update(context: context); // }); } void _update({required BuildContext context, bool isSubmitted = false}) async { formModel.gasDeliveredQuantityDtos = []; formModel.isSubmitted = isSubmitted; for (var item in selectedItemList) { formModel.gasDeliveredQuantityDtos.add(GasDeliveredQuantityModel( id: widget.dataModel != null ? item.id : 0, medicalGasAttributeId: item.medicalGasAttributeId ?? item.id, deliveredQuantity: item.deliveredQuantity, )); } showDialog(context: context, barrierDismissible: false, builder: (context) => const AppLazyLoading()); await medicalGasInspectionProvider.updatedDeliveryNotes(model: formModel).then((status) async { Navigator.pop(context); if (status) { Navigator.pop(context, true); } }); } }