| @@ -3,23 +3,23 @@ import 'dart:convert'; | |||
| import 'package:farm_tpf/custom_model/End.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/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_description.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/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:farm_tpf/utils/validators.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:farm_tpf/utils/formatter.dart'; | |||
| @@ -117,36 +117,12 @@ class _EditActionEndScreenState extends State<EditActionEndScreen> { | |||
| }); | |||
| } | |||
| _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() { | |||
| 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() { | |||
| @@ -166,11 +142,22 @@ class _EditActionEndScreenState extends State<EditActionEndScreen> { | |||
| GestureType.onPanUpdateDownDirection, | |||
| ], | |||
| child: Scaffold( | |||
| backgroundColor: Colors.white, | |||
| 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( | |||
| child: MultiBlocProvider( | |||
| providers: [ | |||
| @@ -189,76 +176,117 @@ class _EditActionEndScreenState extends State<EditActionEndScreen> { | |||
| child: Form( | |||
| key: _formKey, | |||
| 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()); | |||
| } | |||
| }), | |||
| ], | |||
| ); | |||
| }, | |||
| ], | |||
| ); | |||
| }, | |||
| ), | |||
| ), | |||
| )), | |||
| )))); | |||