| import 'package:farm_tpf/custom_model/End.dart'; | import 'package:farm_tpf/custom_model/End.dart'; | ||||
| import 'package:farm_tpf/data/api/app_exception.dart'; | import 'package:farm_tpf/data/api/app_exception.dart'; | ||||
| import 'package:farm_tpf/data/repository/repository.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/bloc/media_helper_bloc.dart'; | ||||
| import 'package:farm_tpf/presentation/custom_widgets/button_widget.dart'; | |||||
| import 'package:farm_tpf/presentation/custom_widgets/widget_field_time_picker.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_loading.dart'; | ||||
| import 'package:farm_tpf/presentation/custom_widgets/widget_media_picker.dart'; | import 'package:farm_tpf/presentation/custom_widgets/widget_media_picker.dart'; | ||||
| import 'package:farm_tpf/presentation/custom_widgets/widget_text_field_description.dart'; | |||||
| import 'package:farm_tpf/presentation/custom_widgets/widget_utils.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/action_detail_bloc.dart'; | ||||
| import 'package:farm_tpf/presentation/screens/actions/state_management_helper/change_file_controller.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_common.dart'; | ||||
| import 'package:farm_tpf/utils/const_string.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:farm_tpf/utils/pref.dart'; | ||||
| import 'package:farm_tpf/utils/validators.dart'; | import 'package:farm_tpf/utils/validators.dart'; | ||||
| import 'package:flutter/material.dart'; | import 'package:flutter/material.dart'; | ||||
| import 'package:flutter_bloc/flutter_bloc.dart'; | import 'package:flutter_bloc/flutter_bloc.dart'; | ||||
| import 'package:flutter_datetime_picker/flutter_datetime_picker.dart'; | |||||
| import 'package:get/get.dart'; | import 'package:get/get.dart'; | ||||
| import 'package:intl/intl.dart'; | |||||
| import 'package:keyboard_dismisser/keyboard_dismisser.dart'; | import 'package:keyboard_dismisser/keyboard_dismisser.dart'; | ||||
| import 'package:farm_tpf/utils/formatter.dart'; | import 'package:farm_tpf/utils/formatter.dart'; | ||||
| }); | }); | ||||
| } | } | ||||
| _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 <Widget>[iconButton]; | |||||
| } | |||||
| return <Widget>[Container()]; | |||||
| } | |||||
| Widget _descriptionField() { | Widget _descriptionField() { | ||||
| return TextFormField( | |||||
| keyboardType: TextInputType.text, | |||||
| decoration: InputDecoration(labelText: "Ghi chú"), | |||||
| controller: _descriptionController, | |||||
| onSaved: (newValue) { | |||||
| _end.description = newValue; | |||||
| }, | |||||
| ); | |||||
| return TextFieldDescriptionWidget( | |||||
| controller: _descriptionController, | |||||
| onSaved: (newValue) { | |||||
| _end.description = newValue; | |||||
| }); | |||||
| } | } | ||||
| Widget _executeByField() { | Widget _executeByField() { | ||||
| GestureType.onPanUpdateDownDirection, | GestureType.onPanUpdateDownDirection, | ||||
| ], | ], | ||||
| child: Scaffold( | child: Scaffold( | ||||
| backgroundColor: Colors.white, | |||||
| key: _scaffoldKey, | key: _scaffoldKey, | ||||
| appBar: AppBar( | |||||
| centerTitle: true, | |||||
| title: Text(plot_action_finish), | |||||
| actions: _actionAppBar()), | |||||
| appBar: AppBarWidget( | |||||
| isBack: true, | |||||
| action: InkWell( | |||||
| child: Text( | |||||
| 'Huỷ', | |||||
| style: TextStyle( | |||||
| color: Colors.red, fontWeight: FontWeight.normal), | |||||
| ), | |||||
| onTap: () { | |||||
| if (Get.isSnackbarOpen) Get.back(); | |||||
| Get.back(); | |||||
| }, | |||||
| ), | |||||
| ), | |||||
| body: KeyboardDismisser( | body: KeyboardDismisser( | ||||
| child: MultiBlocProvider( | child: MultiBlocProvider( | ||||
| providers: [ | providers: [ | ||||
| child: Form( | child: Form( | ||||
| key: _formKey, | key: _formKey, | ||||
| autovalidate: _autoValidate, | autovalidate: _autoValidate, | ||||
| child: SingleChildScrollView( | |||||
| padding: EdgeInsets.all(8.0), | |||||
| child: BlocConsumer<ActionDetailBloc, ActionDetailState>( | |||||
| listener: (context, state) async { | |||||
| if (state is ActionDetailFailure) { | |||||
| LoadingDialog.hideLoadingDialog(context); | |||||
| } else if (state is ActionDetailSuccess) { | |||||
| LoadingDialog.hideLoadingDialog(context); | |||||
| _end = End.fromJson(state.item); | |||||
| _end.activityId = widget.activityId; | |||||
| _descriptionController.text = | |||||
| _end.description ?? ""; | |||||
| _executeByController.text = _end.createdByName; | |||||
| child: SafeArea( | |||||
| child: SingleChildScrollView( | |||||
| child: | |||||
| BlocConsumer<ActionDetailBloc, ActionDetailState>( | |||||
| listener: (context, state) async { | |||||
| if (state is ActionDetailFailure) { | |||||
| LoadingDialog.hideLoadingDialog(context); | |||||
| } else if (state is ActionDetailSuccess) { | |||||
| LoadingDialog.hideLoadingDialog(context); | |||||
| _end = End.fromJson(state.item); | |||||
| _end.activityId = widget.activityId; | |||||
| _descriptionController.text = | |||||
| _end.description ?? ""; | |||||
| _executeByController.text = _end.createdByName; | |||||
| Get.find<ChangeDateTimePicker>().change(_end | |||||
| .executeDate | |||||
| .convertStringServerDateTimeToLocalDateTime()); | |||||
| //Show media | |||||
| if (Validators.stringNotNullOrEmpty(_end.media)) { | |||||
| BlocProvider.of<MediaHelperBloc>(context).add( | |||||
| ChangeListMedia( | |||||
| items: UtilAction.convertFilePathToMedia( | |||||
| _end.media))); | |||||
| Get.find<ChangeDateTimePicker>().change(_end | |||||
| .executeDate | |||||
| .convertStringServerDateTimeToLocalDateTime()); | |||||
| //Show media | |||||
| if (Validators.stringNotNullOrEmpty(_end.media)) { | |||||
| BlocProvider.of<MediaHelperBloc>(context).add( | |||||
| ChangeListMedia( | |||||
| items: | |||||
| UtilAction.convertFilePathToMedia( | |||||
| _end.media))); | |||||
| } | |||||
| } else if (state is ActionDetailInitial) { | |||||
| } else if (state is ActionDetailLoading) { | |||||
| LoadingDialog.showLoadingDialog(context); | |||||
| } | } | ||||
| } else if (state is ActionDetailInitial) { | |||||
| } else if (state is ActionDetailLoading) { | |||||
| LoadingDialog.showLoadingDialog(context); | |||||
| } | |||||
| }, | |||||
| builder: (context, state) { | |||||
| return Column( | |||||
| children: <Widget>[ | |||||
| Container( | |||||
| width: double.infinity, | |||||
| child: Text( | |||||
| "Ngày thực hiện *", | |||||
| style: TextStyle( | |||||
| color: Colors.black54, fontSize: 13.0), | |||||
| }, | |||||
| builder: (context, state) { | |||||
| return Column( | |||||
| children: [ | |||||
| Padding( | |||||
| padding: const EdgeInsets.all(8.0), | |||||
| child: Column( | |||||
| crossAxisAlignment: | |||||
| CrossAxisAlignment.start, | |||||
| children: <Widget>[ | |||||
| Text( | |||||
| plot_action_finish, | |||||
| style: TextStyle( | |||||
| fontWeight: FontWeight.w500, | |||||
| fontSize: 22), | |||||
| ), | |||||
| SizedBox( | |||||
| height: 8.0, | |||||
| ), | |||||
| 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, | |||||
| ), | |||||
| _descriptionField(), | |||||
| SizedBox( | |||||
| height: 8.0, | |||||
| ), | |||||
| _executeByField(), | |||||
| SizedBox( | |||||
| height: 8.0, | |||||
| ), | |||||
| ], | |||||
| ), | |||||
| ), | |||||
| Container( | |||||
| width: double.infinity, | |||||
| height: 16, | |||||
| color: Colors.grey[200], | |||||
| ), | |||||
| BlocBuilder<MediaHelperBloc, MediaHelperState>( | |||||
| builder: (context, state) { | |||||
| if (state is MediaHelperSuccess) { | |||||
| return WidgetMediaPicker( | |||||
| currentItems: state.items, | |||||
| onChangeFiles: (newPathFiles, | |||||
| deletePathFiles) async { | |||||
| Get.find<ChangeFileController>() | |||||
| .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(); | |||||
| }), | |||||
| ), | ), | ||||
| ), | |||||
| _btnExecuteTimePicker(), | |||||
| SizedBox( | |||||
| height: 8.0, | |||||
| ), | |||||
| _descriptionField(), | |||||
| SizedBox( | |||||
| height: 8.0, | |||||
| ), | |||||
| _executeByField(), | |||||
| SizedBox( | |||||
| height: 8.0, | |||||
| ), | |||||
| BlocBuilder<MediaHelperBloc, MediaHelperState>( | |||||
| builder: (context, state) { | |||||
| if (state is MediaHelperSuccess) { | |||||
| return WidgetMediaPicker( | |||||
| currentItems: state.items, | |||||
| onChangeFiles: (newPathFiles, | |||||
| deletePathFiles) async { | |||||
| Get.find<ChangeFileController>().change( | |||||
| newPathFiles, deletePathFiles); | |||||
| }); | |||||
| } else { | |||||
| return Center( | |||||
| child: CircularProgressIndicator()); | |||||
| } | |||||
| }), | |||||
| ], | |||||
| ); | |||||
| }, | |||||
| ], | |||||
| ); | |||||
| }, | |||||
| ), | |||||
| ), | ), | ||||
| )), | )), | ||||
| )))); | )))); |