import 'package:farm_tpf/custom_model/SuppliesUsing.dart'; import 'package:farm_tpf/custom_model/Supply.dart'; import 'package:farm_tpf/presentation/screens/actions/state_management_helper/change_supply.dart'; import 'package:farm_tpf/presentation/screens/actions/util_action.dart'; import 'package:farm_tpf/presentation/screens/resources/sc_resource_helper.dart'; import 'package:farm_tpf/utils/const_color.dart'; import 'package:farm_tpf/utils/const_common.dart'; import 'package:farm_tpf/utils/const_style.dart'; import 'package:flutter/material.dart'; import 'package:get/get.dart'; import 'package:farm_tpf/utils/formatter.dart'; import 'package:intl/intl.dart'; import 'package:pattern_formatter/pattern_formatter.dart'; class WidgetPlantSupply extends StatefulWidget { final List currentItems; final Function(List supplyChanges) onChangeSupplies; WidgetPlantSupply({this.currentItems, @required this.onChangeSupplies}); @override _WidgetPlantSupplyState createState() => _WidgetPlantSupplyState(); } class _WidgetPlantSupplyState extends State { final _dosageController = TextEditingController(); final _quantityController = TextEditingController(); final changeSelectedSupply = Get.put(ChangeSupply()); final changeSupplyUsing = Get.put(ChangeSupplyUsing()); final changeUnit = Get.put(ChangeUnit()); final changeQuantity = Get.put(ChangeValueQuantity()); final changeButton = Get.put(ChangeButtonInForm()); @override void initState() { super.initState(); changeSelectedSupply.initValue(); changeSupplyUsing.init(widget.currentItems); changeUnit.initValue(); changeQuantity.changeQuantity(""); changeButton.resetValue(); } Widget _buildListSupply() { return GetBuilder(builder: (value) { widget.onChangeSupplies(value.currentItems); if (value.currentItems.isEmpty) { return Container(); } else { return Container( height: 80, child: ListView.builder( physics: ClampingScrollPhysics(), scrollDirection: Axis.horizontal, shrinkWrap: true, itemCount: value.currentItems.length, itemBuilder: (context, index) { return GestureDetector( onTap: () { print("edit"); changeSupplyUsing.changeIndexEdit(index); changeButton.updateToEdit(true); var editedSupplyUsing = value.currentItems[index]; var editedSupply = Supply() ..id = editedSupplyUsing.tbSuppliesInWarehouseId ..tbSuppliesName = editedSupplyUsing.supplyName ..unit = editedSupplyUsing.supplyUnit; changeSelectedSupply.change(editedSupply); changeQuantity.changeQuantity(editedSupplyUsing.quantity .formatNumtoStringDecimal()); changeUnit .updateListByUnitName(editedSupplyUsing.supplyUnit); changeUnit.updateSelected(editedSupplyUsing.supplyUnit); _dosageController.text = editedSupplyUsing.dosage; }, child: Card( child: Stack( alignment: Alignment.bottomCenter, overflow: Overflow.visible, children: [ Positioned( child: ClipRRect( borderRadius: BorderRadius.circular(8), child: Container( padding: EdgeInsets.all(4), width: 150, child: Column( children: [ SizedBox( height: 12.0, ), Flexible( child: Text( value.currentItems[index].supplyName ?? "", overflow: TextOverflow.ellipsis, maxLines: 1), ), Flexible( child: Text( "${value.currentItems[index].dosage ?? ""}")), Flexible( child: Text( "${value.currentItems[index].quantity.formatNumtoStringDecimal() ?? ""} ${value.currentItems[index].supplyUnit ?? ""}")), ], ), ), )), Positioned( top: -10, right: -10, child: IconButton( icon: Icon( Icons.cancel, color: Colors.redAccent, ), onPressed: () { print("Delete"); changeSupplyUsing.deleteSupply(index); }), ) ], ))); })); } }); } Widget _btnSelectSubstrates() { return GetBuilder(builder: (data) { return FlatButton( padding: EdgeInsets.only(top: 0.0, right: 0.0, bottom: 0.0, left: 0.0), onPressed: () { Navigator.of(context) .push(MaterialPageRoute( builder: (_) => ResourceHelperScreen( titleName: "Hoá chất xử lý", type: ConstCommon.supplyTypeAll, selectedId: changeSelectedSupply.selectedSupplyId), fullscreenDialog: false)) .then((value) { if (value != null) { var result = value as Supply; changeSelectedSupply.change(result); changeUnit.updateListByUnitName(result.unit); } }); }, child: Container( padding: EdgeInsets.only( top: 0.0, right: 0.0, bottom: 10.5, left: 0.0), decoration: BoxDecoration( border: kBorderTextField, ), child: Row( children: [ GetBuilder( builder: (_) => Expanded( child: Text( changeSelectedSupply.selectedSupplyName ?? "Hoá chất xử lý", style: TextStyle( fontSize: 14.0, color: Colors.black87)))), Icon( Icons.arrow_drop_down, color: Colors.grey, ), ], ))); }); } Widget _dropdownUnitTypes() { return GetBuilder(builder: (data) { return DropdownButtonFormField( itemHeight: 100, value: data.selectedUnit.isEmpty ? null : data.selectedUnit, items: data.currentUnits .map((label) => DropdownMenuItem( child: Text(label), value: label, )) .toList(), onChanged: (value) { var currentQuantity = _quantityController.text; changeQuantity.changeQuantity(currentQuantity); num assignValue = changeQuantity.quantity.parseDoubleThousand(); if (assignValue != null) { var oldSelected = data.selectedUnit; if (oldSelected == value) { } else { assignValue = UtilAction.convertUnit( inputValue: assignValue, oldUnit: oldSelected, newUnit: value); } changeQuantity .changeQuantity(assignValue.formatNumtoStringDecimal()); } changeUnit.updateSelected(value); }, ); }); } _quantityField() { return GetBuilder(builder: (_) { WidgetsBinding.instance.addPostFrameCallback((timeStamp) { var quantityValue = changeQuantity.quantity; _quantityController.text = quantityValue; }); return TextFormField( keyboardType: TextInputType.numberWithOptions(decimal: true), inputFormatters: [ ThousandsFormatter( formatter: NumberFormat("#,###.##", "es"), allowFraction: true) ], decoration: InputDecoration(labelText: "Tổng lượng sử dụng"), controller: _quantityController, ); }); } _buttonInForm() { return GetBuilder(builder: (_) { return Align( alignment: Alignment.centerRight, child: Row( mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ _.isEdit ? OutlineButton( shape: RoundedRectangleBorder( borderRadius: new BorderRadius.circular(8.0)), child: Text("Huỷ"), onPressed: () { changeButton.resetValue(); _resetForm(); _hidenKeyboard(context); }) : SizedBox(), _.isEdit ? FlatButton( color: COLOR_CONST.DEFAULT, shape: RoundedRectangleBorder( borderRadius: new BorderRadius.circular(8.0)), onPressed: () { var currentSupply = changeSelectedSupply.currentSupply; changeQuantity.changeQuantity(_quantityController.text); var quantityWithCurrentSupplyUnit = UtilAction.convertUnit( inputValue: changeQuantity.quantity.parseDoubleThousand(), oldUnit: changeUnit.selectedUnit, newUnit: changeSelectedSupply.currentSupply.unit); if (currentSupply.id != null) { SuppliesUsing newSup = SuppliesUsing() ..dosage = _dosageController.text ..quantity = quantityWithCurrentSupplyUnit ..tbSuppliesInWarehouseId = currentSupply.id ..suppliesInWarehouseId = currentSupply.id ..supplyName = currentSupply.tbSuppliesName ..supplyUnit = currentSupply.unit ..unit = currentSupply.unit; changeSupplyUsing.editSupply( changeSupplyUsing.currentIndex, newSup); _resetForm(); _hidenKeyboard(context); } }, child: Text( "Sửa", style: TextStyle(color: Colors.white), )) : FlatButton( color: COLOR_CONST.DEFAULT, shape: RoundedRectangleBorder( borderRadius: new BorderRadius.circular(8.0)), onPressed: () { var currentSupply = changeSelectedSupply.currentSupply; if (currentSupply.id != null) { changeQuantity.changeQuantity(_quantityController.text); var quantityWithCurrentSupplyUnit = UtilAction.convertUnit( inputValue: changeQuantity.quantity .parseDoubleThousand(), oldUnit: changeUnit.selectedUnit, newUnit: changeSelectedSupply.currentSupply.unit); SuppliesUsing newSup = SuppliesUsing() ..dosage = _dosageController.text ..quantity = quantityWithCurrentSupplyUnit ..tbSuppliesInWarehouseId = currentSupply.id ..suppliesInWarehouseId = currentSupply.id ..supplyName = currentSupply.tbSuppliesName ..supplyUnit = currentSupply.unit ..unit = currentSupply.unit; changeSupplyUsing.addSupply(newSup); _resetForm(); _hidenKeyboard(context); } }, child: Text( "Thêm", style: TextStyle(color: Colors.white), )) ], ), ); }); } Widget _formEdit() { return Container( padding: EdgeInsets.all(8.0), decoration: BoxDecoration( shape: BoxShape.rectangle, borderRadius: BorderRadius.circular(10), color: Colors.white, border: Border.all(color: COLOR_CONST.DEFAULT)), child: Column( children: [ Container( width: double.infinity, child: Text( "Hoá chất xử lý", style: TextStyle(color: Colors.black54, fontSize: 13.0), ), ), _btnSelectSubstrates(), TextFormField( keyboardType: TextInputType.text, controller: _dosageController, decoration: InputDecoration(labelText: "Liều lượng"), onSaved: (newValue) {}, ), Row( mainAxisSize: MainAxisSize.min, mainAxisAlignment: MainAxisAlignment.spaceEvenly, crossAxisAlignment: CrossAxisAlignment.center, children: [ Expanded( flex: 2, child: Container( height: 70, child: _quantityField(), ), ), SizedBox( width: 16.0, ), Expanded( flex: 1, child: Align( alignment: Alignment.bottomCenter, child: _dropdownUnitTypes(), )), ]), _buttonInForm() ], )); } _resetForm() { changeSupplyUsing.changeIndexEdit(-1); changeButton.resetValue(); _dosageController.text = ""; _quantityController.text = ""; changeUnit.initValue(); changeSelectedSupply.initValue(); changeQuantity.changeQuantity(""); } _hidenKeyboard(BuildContext context) { FocusScopeNode currentFocus = FocusScope.of(context); if (!currentFocus.hasPrimaryFocus) { currentFocus.unfocus(); } } @override Widget build(BuildContext context) { return Column( children: [_formEdit(), _buildListSupply()], ); } } class ChangeUnit extends GetxController { List currentUnits; String selectedUnit; initValue() { currentUnits = []; selectedUnit = ""; update(); } updateListByUnitName(String unitName) { if (unitName == "kg" || unitName == "g") { currentUnits = ["kg", "g"]; selectedUnit = unitName; } else if (unitName == "l" || unitName == "m") { currentUnits = ["l", "ml"]; selectedUnit = unitName; } else if (unitName == "m" || unitName == "cm" || unitName == "mm") { currentUnits = ["m", "cm", "mm"]; selectedUnit = unitName; } else { currentUnits = []; } update(); } updateSelected(String selected) { selectedUnit = selected; update(); } } class ChangeValueQuantity extends GetxController { String quantity = ""; void changeQuantity(String newQuantity) { quantity = newQuantity; update(); } } class ChangeButtonInForm extends GetxController { bool isEdit; void resetValue() { isEdit = false; update(); } void updateToEdit(bool isChangeEdit) { isEdit = isChangeEdit; update(); } } class ChangeSupplyUsing extends GetxController { List currentItems; SuppliesUsing currentSupplyUsing; int currentIndex; void init(List initItems) { currentItems = initItems; currentSupplyUsing = SuppliesUsing(); currentIndex = -1; update(); } void changeIndexEdit(int index) { currentIndex = index; update(); } void changeInitList(List sups) { currentItems = sups; update(); } void addSupply(SuppliesUsing supplyUsing) { currentItems.insert(0, supplyUsing); currentSupplyUsing = SuppliesUsing(); update(); } void deleteSupply(int index) { currentItems.removeAt(index); currentSupplyUsing = SuppliesUsing(); update(); } void editSupply(int index, SuppliesUsing supplyUsing) { currentItems[index] = supplyUsing; currentSupplyUsing = SuppliesUsing(); update(); } }