import 'dart:convert'; import 'package:farm_tpf/custom_model/Harvest.dart'; import 'package:farm_tpf/custom_model/Packing.dart'; import 'package:farm_tpf/data/api/app_exception.dart'; import 'package:farm_tpf/data/repository/repository.dart'; import 'package:farm_tpf/presentation/custom_widgets/bloc/media_helper_bloc.dart'; import 'package:farm_tpf/presentation/custom_widgets/widget_loading.dart'; import 'package:farm_tpf/presentation/custom_widgets/widget_media_picker.dart'; import 'package:farm_tpf/presentation/custom_widgets/widget_utils.dart'; import 'package:farm_tpf/presentation/screens/actions/bloc/action_detail_bloc.dart'; import 'package:farm_tpf/presentation/screens/actions/bloc_get_harvest.dart'; import 'package:farm_tpf/presentation/screens/actions/state_management_helper/change_file_controller.dart'; import 'package:farm_tpf/utils/const_common.dart'; import 'package:farm_tpf/utils/const_string.dart'; import 'package:farm_tpf/utils/const_style.dart'; import 'package:farm_tpf/utils/pref.dart'; import 'package:flutter/material.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; import 'package:flutter_datetime_picker/flutter_datetime_picker.dart'; import 'package:get/get.dart'; import 'package:intl/intl.dart'; import 'package:keyboard_dismisser/keyboard_dismisser.dart'; import 'package:pattern_formatter/pattern_formatter.dart'; import 'package:farm_tpf/utils/formatter.dart'; import '../util_action.dart'; class EditActionPackingScreen extends StatefulWidget { final int cropId; final bool isEdit; final int activityId; final int harvestId; EditActionPackingScreen( {@required this.cropId, this.isEdit = false, this.activityId, this.harvestId}); @override _EditActionPackingScreenState createState() => _EditActionPackingScreenState(); } class _EditActionPackingScreenState extends State { final GlobalKey _scaffoldKey = new GlobalKey(); final _repository = Repository(); GlobalKey _formKey = GlobalKey(); bool _autoValidate = false; Packing _packing = Packing(); TextEditingController _l1Controller = TextEditingController(); TextEditingController _l2Controller = TextEditingController(); TextEditingController _l3Controller = TextEditingController(); TextEditingController _removedQuantityController = TextEditingController(); TextEditingController _descriptionController = TextEditingController(); final _executeByController = TextEditingController(); var pref = LocalPref(); List _harvests = List(); Harvest harvestValue; String executeTimeView; DateTime executeTime = DateTime.now(); List filePaths = List(); var changeFileController = Get.put(ChangeFileController()); Future getSharedPrefs() async { var currentFullName = await pref.getString(DATA_CONST.CURRENT_FULL_NAME); _executeByController.text = currentFullName ?? ""; } @override void initState() { super.initState(); getSharedPrefs(); changeFileController.initValue(); var parsedExecuteDate = DateFormat("yyyy-MM-dd'T'HH:mm:ss'Z'").format(executeTime); _packing.executeDate = "$parsedExecuteDate"; executeTimeView = DateFormat("dd/MM/yyyy HH:mm").format(executeTime); _packing.cropId = widget.cropId; if (!widget.isEdit) { getHarvestBloc.getHarvests((data) { _harvests = data; for (var item in _harvests) { if (item.id == widget.harvestId) { harvestValue = item; break; } } }, (err) {}); } } _validateInputs() async { if (_formKey.currentState.validate()) { _formKey.currentState.save(); LoadingDialog.showLoadingDialog(context); filePaths = Get.find().files; try { var activityPacking = jsonEncode(_packing.toJson()).toString(); //ADD NEW if (_packing.activityId == null) { _repository.createAction((value) { LoadingDialog.hideLoadingDialog(context); Get.back(result: value); Utils.showSnackBarSuccess(message: label_add_success); }, (error) { LoadingDialog.hideLoadingDialog(context); Utils.showSnackBarError(message: AppException.handleError(error)); }, apiAddAction: ConstCommon.apiAddPacking, paramActivity: ConstCommon.paramsActionPacking, activityAction: activityPacking, filePaths: filePaths); } else { //UPDATE _repository.updateAction((value) { LoadingDialog.hideLoadingDialog(context); Get.back(result: value); Utils.showSnackBarSuccess(message: label_update_success); }, (error) { LoadingDialog.hideLoadingDialog(context); Utils.showSnackBarError(message: AppException.handleError(error)); }, apiUpdateAction: ConstCommon.apiUpdatePacking, paramActivity: ConstCommon.paramsActionPacking, activityAction: activityPacking, filePaths: filePaths); } } catch (e) { LoadingDialog.hideLoadingDialog(context); print(e.toString()); } } else { _autoValidate = true; } } List> _buildDropMenu(List actions) { return actions .map((action) => DropdownMenuItem( child: Text("Mã thu hoạch " + action.id.toString()), value: action, )) .toList(); } Widget _dropdownHarvest() { return StreamBuilder( stream: getHarvestBloc.actions, builder: (context, AsyncSnapshot snapshot) { if (snapshot.hasData) { return DropdownButtonFormField( value: harvestValue, hint: Text("Mã thu hoạch *"), onChanged: (Harvest newValue) { setState(() { harvestValue = newValue; _packing.harvestId = newValue.id; }); }, validator: (value) => value == null ? "Mã thu hoạch" : null, isExpanded: true, items: _buildDropMenu(_harvests)); } else { return Center( child: CircularProgressIndicator(), ); } }, ); } Widget _btnExecuteTimePicker() { return FlatButton( padding: EdgeInsets.only(top: 0.0, right: 0.0, bottom: 0.0, left: 0.0), onPressed: () { DatePicker.showDateTimePicker(context, showTitleActions: true, onChanged: (date) {}, onConfirm: (date) { setState(() { var parsedDate = DateFormat("yyyy-MM-dd'T'HH:mm:ss'Z'").format(date); _packing.executeDate = "$parsedDate"; executeTimeView = DateFormat("dd/MM/yyyy HH:mm").format(date); }); }, currentTime: executeTime, locale: LocaleType.vi); }, child: Container( padding: EdgeInsets.only(top: 0.0, right: 0.0, bottom: 10.5, left: 0.0), decoration: BoxDecoration( border: kBorderTextField, ), child: Row( children: [ Expanded( child: Text( //TODO: check condition executeTimeView == null ? "$executeTime" : executeTimeView, style: TextStyle(fontSize: 14.0, color: Colors.black87), )), Icon( Icons.date_range, color: Colors.blue, ), ], ))); } Widget _l1Field() { return TextFormField( keyboardType: TextInputType.numberWithOptions(decimal: true), inputFormatters: [ ThousandsFormatter( formatter: NumberFormat("#,###.##", "es"), allowFraction: true) ], decoration: InputDecoration(labelText: "Số lượng/khối lượng loại 1"), controller: _l1Controller, onSaved: (newValue) { _packing.quantityLv1 = newValue.parseDoubleThousand(); }, ); } Widget _l2Field() { return TextFormField( keyboardType: TextInputType.numberWithOptions(decimal: true), inputFormatters: [ ThousandsFormatter( formatter: NumberFormat("#,###.##", "es"), allowFraction: true) ], decoration: InputDecoration(labelText: "Số lượng/khối lượng loại 2"), controller: _l2Controller, onSaved: (newValue) { _packing.quantityLv2 = newValue.parseDoubleThousand(); }, ); } Widget _l3Field() { return TextFormField( keyboardType: TextInputType.numberWithOptions(decimal: true), inputFormatters: [ ThousandsFormatter( formatter: NumberFormat("#,###.##", "es"), allowFraction: true) ], decoration: InputDecoration(labelText: "Số lượng/khối lượng loại 3"), controller: _l3Controller, onSaved: (newValue) { _packing.quantityLv3 = newValue.parseDoubleThousand(); }, ); } Widget _removedQuantityField() { return TextFormField( keyboardType: TextInputType.numberWithOptions(decimal: true), inputFormatters: [ ThousandsFormatter( formatter: NumberFormat("#,###.##", "es"), allowFraction: true) ], decoration: InputDecoration(labelText: "Số lượng/khối lượng loại bỏ"), controller: _removedQuantityController, onSaved: (newValue) { _packing.removedQuantity = newValue.parseDoubleThousand(); }, ); } Widget _descriptionField() { return TextFormField( keyboardType: TextInputType.text, decoration: InputDecoration(labelText: "Ghi chú"), controller: _descriptionController, onSaved: (newValue) { _packing.description = newValue; }, ); } Widget _executeByField() { return TextFormField( keyboardType: TextInputType.text, decoration: InputDecoration(labelText: "Người thực hiện"), enabled: false, controller: _executeByController, onSaved: (newValue) {}, ); } _actionAppBar() { IconButton iconButton; if (1 == 1) { iconButton = IconButton( icon: Icon( Icons.done, color: Colors.black, ), onPressed: () { FocusScopeNode currentFocus = FocusScope.of(context); if (!currentFocus.hasPrimaryFocus) { currentFocus.unfocus(); } _validateInputs(); }, ); return [iconButton]; } return [Container()]; } @override Widget build(BuildContext context) => KeyboardDismisser( gestures: [ GestureType.onTap, GestureType.onPanUpdateDownDirection, ], child: Scaffold( key: _scaffoldKey, appBar: AppBar( centerTitle: true, title: Text(plot_action_packing), actions: _actionAppBar()), body: KeyboardDismisser( child: MultiBlocProvider( providers: [ BlocProvider( create: (context) => ActionDetailBloc(repository: Repository()) ..add(FetchData( isNeedFetchData: widget.isEdit, apiActivity: ConstCommon.apiDetailPacking, activityId: widget.activityId))), BlocProvider( create: (context) => MediaHelperBloc()..add(ChangeListMedia(items: [])), ) ], child: Form( key: _formKey, autovalidate: _autoValidate, child: SingleChildScrollView( padding: EdgeInsets.all(8.0), child: BlocConsumer( listener: (context, state) async { if (state is ActionDetailFailure) { LoadingDialog.hideLoadingDialog(context); } else if (state is ActionDetailSuccess) { LoadingDialog.hideLoadingDialog(context); print(state.item); _packing = Packing.fromJson(state.item); _packing.activityId = widget.activityId; _l1Controller.text = _packing.quantityLv1.formatNumtoStringDecimal(); _l2Controller.text = _packing.quantityLv2.formatNumtoStringDecimal(); _l3Controller.text = _packing.quantityLv3.formatNumtoStringDecimal(); _removedQuantityController.text = _packing .removedQuantity .formatNumtoStringDecimal(); _descriptionController.text = _packing.description ?? ""; _executeByController.text = _packing.executeBy; //select harvest getHarvestBloc.getHarvests((data) { _harvests = data; for (var item in _harvests) { if (item.id == _packing.harvestId) { harvestValue = item; break; } } }, (err) {}); try { executeTime = DateFormat("yyyy-MM-dd'T'HH:mm:ss'Z'") .parse(_packing.executeDate); executeTimeView = DateFormat("dd/MM/yyyy HH:mm") .format(executeTime); } catch (_) {} //Show media if (_packing.media != null) { await UtilAction.cacheFiles(_packing.media) .then((value) { BlocProvider.of(context) .add(ChangeListMedia(items: value)); }).whenComplete(() { print("completed"); }); } } else if (state is ActionDetailInitial) { } else if (state is ActionDetailLoading) { LoadingDialog.showLoadingDialog(context); } }, builder: (context, state) { return Column( children: [ Container( width: double.infinity, child: Text( "Ngày thực hiện *", style: TextStyle( color: Colors.black54, fontSize: 13.0), ), ), _btnExecuteTimePicker(), SizedBox( height: 8.0, ), _dropdownHarvest(), SizedBox( height: 8.0, ), _l1Field(), SizedBox( height: 8.0, ), _l2Field(), SizedBox( height: 8.0, ), _l3Field(), SizedBox( height: 8.0, ), _removedQuantityField(), SizedBox( height: 8.0, ), _descriptionField(), SizedBox( height: 8.0, ), _executeByField(), SizedBox( height: 8.0, ), BlocBuilder( builder: (context, state) { if (state is MediaHelperSuccess) { return WidgetMediaPicker( currentItems: state.items, onChangeFiles: (filePaths) async { Get.find() .addAllFile(filePaths); }); } else { return Center( child: CircularProgressIndicator()); } }), ], ); }, ), )), )))); @override void dispose() { _l1Controller.dispose(); _l2Controller.dispose(); _l3Controller.dispose(); _removedQuantityController.dispose(); _descriptionController.dispose(); _executeByController.dispose(); super.dispose(); } }