import 'dart:convert'; import 'package:farm_tpf/custom_model/SuppliesUsing.dart'; import 'package:farm_tpf/custom_model/action_form/ActionUIField.dart'; import 'package:farm_tpf/custom_model/action_form/ActionUIForm.dart'; import 'package:farm_tpf/custom_model/action_form/RequestActivity.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/app_bar_widget.dart'; import 'package:farm_tpf/presentation/custom_widgets/bloc/media_helper_bloc.dart'; import 'package:farm_tpf/presentation/custom_widgets/button_widget.dart'; import 'package:farm_tpf/presentation/custom_widgets/dropdown_supply_widget.dart'; import 'package:farm_tpf/presentation/custom_widgets/widget_action_field_date.dart'; import 'package:farm_tpf/presentation/custom_widgets/widget_field_time_picker.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_text_field_area.dart'; import 'package:farm_tpf/presentation/custom_widgets/widget_text_form_field.dart'; import 'package:farm_tpf/presentation/custom_widgets/widget_utils.dart'; import 'package:farm_tpf/presentation/screens/actions/cubit/action_ui_cubit.dart'; import 'package:farm_tpf/utils/const_string.dart'; import 'package:farm_tpf/utils/pref.dart'; import 'package:farm_tpf/utils/validators.dart'; import 'package:flutter/material.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; import 'package:get/get.dart'; import 'package:keyboard_dismisser/keyboard_dismisser.dart'; import 'package:farm_tpf/utils/formatter.dart'; import 'dung/widget_dung_supply.dart'; import 'nursery/widget_worker.dart'; import 'plant/widget_plant_supply.dart'; import 'spraying/widget_spraying_supply.dart'; import 'state_management_helper/change_file_controller.dart'; class ActionScreen extends StatefulWidget { final int cropId; final int idAction; final String activityType; final String title; ActionScreen( {@required this.cropId, @required this.idAction, @required this.title, @required this.activityType}); @override _ActionScreenState createState() => _ActionScreenState(); } class _ActionScreenState extends State { final _scaffoldKey = GlobalKey(); var _formKey = GlobalKey(); var pref = LocalPref(); final _executeByController = TextEditingController(); DateTime executeTime = DateTime.now(); List filePaths = []; var changeFileController = Get.put(ChangeFileController()); Map textFieldControllers = {}; Map valueObjects = {}; var _requestActivity = RequestActivity(); final _repository = Repository(); var _actionUIForm = ActionUIForm(); var _nurseryDetails = []; var _supplyUsings = []; Future getSharedPrefs() async { var currentFullName = await pref.getString(DATA_CONST.CURRENT_FULL_NAME); _executeByController.text = currentFullName ?? ""; } @override void initState() { super.initState(); getSharedPrefs(); changeFileController.initValue(); } _validateInputs() async { if (_formKey.currentState.validate()) { _formKey.currentState.save(); try { LoadingDialog.showLoadingDialog(context); filePaths = Get.find().newFiles; //Create request general model _requestActivity ..tbActivityTypeId = widget.idAction ..tbCropId = widget.cropId; if (_actionUIForm.activityExtendTypeDTOList.isNotEmpty) { _requestActivity ..externalTable = _actionUIForm ?.activityExtendTypeDTOList?.first?.externalTable ?? ''; } filePaths = Get.find().newFiles; textFieldControllers.forEach((key, value) { print(textFieldControllers[key].text); valueObjects[key] = textFieldControllers[key].text; }); //tbObjectUpdateDTOList var _objectPrameters = []; valueObjects.forEach((key, value) { var objectUpdate = TbObjectUpdateDTO() ..tbObjectParameterId = int.tryParse(key) ..index = value; _objectPrameters.add(objectUpdate); }); _requestActivity.tbObjectUpdateDTOList = _objectPrameters; //CHECK NURSERY if (widget.activityType == 'ACTIVE_TYPE_NURSERY') { _requestActivity.tbNurseryDetailsDTOList = _nurseryDetails; } else if (widget.activityType == 'ACTIVE_TYPE_PLANTING') { var _listSupplyUsingDetail = []; _supplyUsings.forEach((element) { var usingSupplyDetail = TbSuppliesUsingDetailsDTOs() ..tbSuppliesInWarehouseId = element.tbSuppliesInWarehouseId ..dosage = element.dosage ..quantity = element.quantity; _listSupplyUsingDetail.add(usingSupplyDetail); }); _requestActivity.tbSuppliesUsingDetailsDTOs = _listSupplyUsingDetail; } else if (widget.activityType == 'ACTIVE_TYPE_FERTILIZE' || widget.activityType == 'ACTIVE_TYPE_SPRAYING_PESTICIDES') { var _listSupplyUsingDetail = []; _supplyUsings.forEach((element) { var usingSupplyDetail = TbSuppliesUsingDetailsDTOs() ..tbSuppliesInWarehouseId = element.tbSuppliesInWarehouseId ..dosage = element.dosage ..quantity = element.quantity ..howToUse = element.howToUse ?? '' ..tbEquipmentOfCustomerId = element.equipmentOfCustomerId; _listSupplyUsingDetail.add(usingSupplyDetail); }); _requestActivity.tbSuppliesUsingDetailsDTOs = _listSupplyUsingDetail; } //convert data to json var activityCommonData = jsonEncode(_requestActivity.toJson()).toString(); print(activityCommonData); _repository.createActionCommon((data) { LoadingDialog.hideLoadingDialog(context); Get.back(result: 'ok'); Utils.showSnackBarSuccess(message: label_add_success); }, (error) { LoadingDialog.hideLoadingDialog(context); Utils.showSnackBarError(message: AppException.handleError(error)); }, activityType: widget.activityType, activityData: activityCommonData, filePaths: filePaths); //ADD NEW //Update } catch (e) { LoadingDialog.hideLoadingDialog(context); print(e.toString()); } } else { // } } Widget _btnExecuteTimePicker() { return WidgetFieldDateTimePicker( initDateTime: executeTime, onUpdateDateTime: (selectedDate) { _requestActivity.executeDate = selectedDate.convertLocalDateTimeToStringUtcDateTime(); }); } Widget _executeByField() { return TextFormField( keyboardType: TextInputType.text, decoration: InputDecoration(labelText: "Người thực hiện"), enabled: false, controller: _executeByController, onSaved: (newValue) {}, ); } // // GENERATE DYNAMIC FORM // Widget generateTextField(List fields) { return Wrap( children: [ ListView.separated( shrinkWrap: true, physics: NeverScrollableScrollPhysics(), itemCount: fields.length, separatorBuilder: (context, index) { return SizedBox( height: 8, ); }, itemBuilder: (context, index) { var field = fields[index]; if (field.tbControlTypeName == 'text') { return TextFormField( keyboardType: TextInputType.text, decoration: InputDecoration(labelText: field.description), controller: textFieldControllers[field.id.toString()], onSaved: (newValue) {}, validator: field.isMandatory ? (String value) { return Validators.validateNotNullOrEmpty( value, 'Vui lòng nhập ${field.description}'); } : null, ); } else if (field.tbControlTypeName == 'number') { return WidgetTextFormFieldNumber( hintValue: field.description, textController: textFieldControllers[field.id.toString()], onSaved: (newValue) {}, validator: field.isMandatory ? (String value) { return Validators.validNumberOrEmpty( value, 'Vui lòng nhập ${field.description}'); } : null, ); } else if (field.tbControlTypeName == 'textarea') { return TextFieldAreaWidget( hint: field.description, controller: textFieldControllers[field.id.toString()], onSaved: (newValue) {}); } else if (field.tbControlTypeName == 'dropdown' || field.tbControlTypeName == 'radiobutton') { return DropdownSupplyWidget( titleName: field.description ?? '', tbSupply: field.tbActivityExtendTypeExternalTable ?? '', tag: field.name, value: field.description, hint: '${field.description} ${field.isMandatory ? '*' : ''}', condition: field.tbActivityExtendTypeCondition, invalidMessage: '', onPressed: (commonData) { valueObjects[field.id.toString()] = commonData.id.toString(); }); } else if (field.tbControlTypeName == 'date') { return FieldDateWidget( tag: field.name, value: field.description, hint: '${field.description} ${field.isMandatory ? '*' : ''}', invalidMessage: '', onPressed: (selectedDate) { valueObjects[field.id.toString()] = selectedDate .convertLocalDateTimeToStringUtcDateTime(); }); } else { return Container(); } }) ], ); } // // GENERATE SUPPLY // Widget generateSupply(String activityType) { switch (activityType) { case 'ACTIVE_TYPE_NURSERY': return WidgetWorker(onChangeWorkers: (nurseryDetails) { _nurseryDetails = nurseryDetails; }); break; case 'ACTIVE_TYPE_PLANTING': return Column( children: [ Container( width: double.infinity, height: 16, color: Colors.grey[200], ), WidgetPlantSupply( currentItems: [], onChangeSupplies: (value) { _supplyUsings = value; }), ], ); break; case 'ACTIVE_TYPE_FERTILIZE': return Column( children: [ Container( width: double.infinity, height: 16, color: Colors.grey[200], ), WidgetDungSupply( currentItems: [], onChangeSupplies: (value) { _supplyUsings = value; }), ], ); break; case 'ACTIVE_TYPE_SPRAYING_PESTICIDES': return Column( children: [ Container( width: double.infinity, height: 16, color: Colors.grey[200], ), WidgetSprayingSupply( currentItems: [], onChangeSupplies: (value) { _supplyUsings = value; }), ], ); break; default: return Container(); break; } } @override Widget build(BuildContext context) => KeyboardDismisser( gestures: [ GestureType.onTap, GestureType.onPanUpdateDownDirection, ], child: Scaffold( backgroundColor: Colors.white, key: _scaffoldKey, appBar: AppBarWidget( isBack: true, action: InkWell( child: Text( 'Lưu', style: TextStyle( color: Colors.red, fontWeight: FontWeight.normal), ), onTap: () { FocusScopeNode currentFocus = FocusScope.of(context); if (!currentFocus.hasPrimaryFocus) { currentFocus.unfocus(); } _validateInputs(); }, ), ), body: KeyboardDismisser( child: MultiBlocProvider( providers: [ BlocProvider( create: (context) => ActionUiCubit(repository: Repository()) ..getActionUIForm(widget.idAction)), BlocProvider( create: (context) => MediaHelperBloc()..add(ChangeListMedia(items: [])), ) ], child: Form( key: _formKey, child: SafeArea( child: SingleChildScrollView( child: BlocBuilder( builder: (context, state) { if (state is ActionUiLoading) { print('loading...'); return Center(child: CircularProgressIndicator()); } else if (state is ActionUiSuccess) { _actionUIForm = state.item as ActionUIForm; _actionUIForm.objectParameterDTOList .forEach((element) { //generate controller if (element.tbControlTypeName == 'text' || element.tbControlTypeName == 'number' || element.tbControlTypeName == 'textarea') { var textEditingController = new TextEditingController(); textFieldControllers.putIfAbsent( element.id.toString(), () => textEditingController); } // generate value each parameter valueObjects.putIfAbsent( element.id.toString(), () => ''); }); return Column( children: [ Padding( padding: const EdgeInsets.all(8.0), child: 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, ), generateTextField(_actionUIForm .objectParameterDTOList), _executeByField(), SizedBox( height: 8.0, ), ], ), ), generateSupply(widget.activityType), Container( width: double.infinity, height: 16, color: Colors.grey[200], ), BlocBuilder( builder: (context, state) { if (state is MediaHelperSuccess) { return WidgetMediaPicker( currentItems: state.items, onChangeFiles: (newPathFiles, deletePathFiles) async { Get.find() .change(newPathFiles, deletePathFiles); }); } else { return Center( child: CircularProgressIndicator()); } }), Padding( padding: const EdgeInsets.all(8.0), child: ButtonWidget( title: 'CẬP NHẬT', onPressed: () { FocusScopeNode currentFocus = FocusScope.of(context); if (!currentFocus.hasPrimaryFocus) { currentFocus.unfocus(); } _validateInputs(); }), ), ], ); } else if (state is ActionUiFailure) { print('error'); return Text(state.errorString); // LoadingDialog.hideLoadingDialog(context); } }, ), ), )), )))); @override void dispose() { _executeByController.dispose(); textFieldControllers.forEach((key, value) { textFieldControllers[key].dispose(); }); super.dispose(); } }