Browse Source

environment update with different layout

smf
daivp 4 years ago
parent
commit
0017a3a006
5 changed files with 506 additions and 22 deletions
  1. +6
    -6
      ios/Runner.xcodeproj/project.pbxproj
  2. +460
    -0
      lib/presentation/screens/actions/environment_update/sc_edit_action_environment_update.dart
  3. +17
    -8
      lib/presentation/screens/plot_detail/sc_plot_action.dart
  4. +17
    -8
      lib/presentation/screens/plot_detail/sc_plot_history.dart
  5. +6
    -0
      lib/utils/const_common.dart

+ 6
- 6
ios/Runner.xcodeproj/project.pbxproj View File

@@ -361,7 +361,7 @@
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
CLANG_ENABLE_MODULES = YES;
CODE_SIGN_ENTITLEMENTS = Runner/Runner.entitlements;
CURRENT_PROJECT_VERSION = 5;
CURRENT_PROJECT_VERSION = 6;
DEVELOPMENT_TEAM = C3DTD2JH94;
ENABLE_BITCODE = NO;
FRAMEWORK_SEARCH_PATHS = (
@@ -377,7 +377,7 @@
"$(inherited)",
"$(PROJECT_DIR)/Flutter",
);
MARKETING_VERSION = 1.0.2;
MARKETING_VERSION = 1.0.3;
PRODUCT_BUNDLE_IDENTIFIER = vn.azteam.farmdemo;
PRODUCT_NAME = "$(TARGET_NAME)";
SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h";
@@ -500,7 +500,7 @@
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
CLANG_ENABLE_MODULES = YES;
CODE_SIGN_ENTITLEMENTS = Runner/Runner.entitlements;
CURRENT_PROJECT_VERSION = 5;
CURRENT_PROJECT_VERSION = 6;
DEVELOPMENT_TEAM = C3DTD2JH94;
ENABLE_BITCODE = NO;
FRAMEWORK_SEARCH_PATHS = (
@@ -516,7 +516,7 @@
"$(inherited)",
"$(PROJECT_DIR)/Flutter",
);
MARKETING_VERSION = 1.0.2;
MARKETING_VERSION = 1.0.3;
PRODUCT_BUNDLE_IDENTIFIER = vn.azteam.farmdemo;
PRODUCT_NAME = "$(TARGET_NAME)";
SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h";
@@ -533,7 +533,7 @@
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
CLANG_ENABLE_MODULES = YES;
CODE_SIGN_ENTITLEMENTS = Runner/Runner.entitlements;
CURRENT_PROJECT_VERSION = 5;
CURRENT_PROJECT_VERSION = 6;
DEVELOPMENT_TEAM = C3DTD2JH94;
ENABLE_BITCODE = NO;
FRAMEWORK_SEARCH_PATHS = (
@@ -549,7 +549,7 @@
"$(inherited)",
"$(PROJECT_DIR)/Flutter",
);
MARKETING_VERSION = 1.0.2;
MARKETING_VERSION = 1.0.3;
PRODUCT_BUNDLE_IDENTIFIER = vn.azteam.farmdemo;
PRODUCT_NAME = "$(TARGET_NAME)";
SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h";

+ 460
- 0
lib/presentation/screens/actions/environment_update/sc_edit_action_environment_update.dart View File

@@ -0,0 +1,460 @@
import 'dart:convert';

import 'package:farm_tpf/custom_model/Environment.dart';
import 'package:farm_tpf/custom_model/RequestEnvironment.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_form_field.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/presentation/screens/actions/util_action.dart';
import 'package:farm_tpf/utils/const_common.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';

class EditActionEnvironmentUpdate extends StatefulWidget {
final int cropId;
final bool isEdit;
final int activityId;
EditActionEnvironmentUpdate(
{@required this.cropId, this.isEdit = false, this.activityId});
@override
_EditActionEnvironmentUpdateState createState() =>
_EditActionEnvironmentUpdateState();
}

class _EditActionEnvironmentUpdateState
extends State<EditActionEnvironmentUpdate> {
final GlobalKey<ScaffoldState> _scaffoldKey = new GlobalKey<ScaffoldState>();
final _repository = Repository();
GlobalKey<FormState> _formKey = GlobalKey();
bool _autoValidate = false;
Environment _environment = Environment();
var pref = LocalPref();
TextEditingController _ecController = TextEditingController();
TextEditingController _phController = TextEditingController();
TextEditingController _ocddController = TextEditingController();
TextEditingController _temperatureController = TextEditingController();
TextEditingController _doController = TextEditingController();
TextEditingController _llnController = TextEditingController();
final _executeByController = TextEditingController();

DateTime executeTime = DateTime.now();
List<String> filePaths = <String>[];
var changeFileController = Get.put(ChangeFileController());

Future<Null> getSharedPrefs() async {
var currentFullName = await pref.getString(DATA_CONST.CURRENT_FULL_NAME);
_executeByController.text = currentFullName ?? "";
}

@override
void initState() {
super.initState();
getSharedPrefs();
changeFileController.initValue();
_environment.cropId = widget.cropId;
}

_validateInputs() async {
if (_formKey.currentState.validate()) {
_formKey.currentState.save();
LoadingDialog.showLoadingDialog(context);
filePaths = Get.find<ChangeFileController>().newFiles;
//Create request general model
try {
RequestEnvironment requestEnvironment = RequestEnvironment()
..cropId = _environment.cropId
..activityId = _environment.activityId
..executeDate = _environment.executeDate;
var envDetail = <EnvDetail>[];
envDetail.add(EnvDetail()
..name = "EC"
..index = _environment.ec);
envDetail.add(EnvDetail()
..name = "pH"
..index = _environment.pH);
envDetail.add(EnvDetail()
..name = "OCDD"
..index = _environment.ocdd);
envDetail.add(EnvDetail()
..name = "TEMPERATURE"
..index = _environment.temperature);
envDetail.add(EnvDetail()
..name = "DO"
..index = _environment.dodo);
envDetail.add(EnvDetail()
..name = "LLN"
..index = _environment.lln);
requestEnvironment.envDetail = envDetail;
requestEnvironment.mediaDel =
Get.find<ChangeFileController>().deleteFiles;
var activityEnvironmentUpdate =
jsonEncode(requestEnvironment.toJson()).toString();
//ADD NEW
if (_environment.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.apiAddEnvUpdate,
paramActivity: ConstCommon.paramsActionEnvUpdate,
activityAction: activityEnvironmentUpdate,
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.apiUpdateEnvUpdate,
paramActivity: ConstCommon.paramsActionEnvUpdate,
activityAction: activityEnvironmentUpdate,
filePaths: filePaths);
}
} catch (e) {
LoadingDialog.hideLoadingDialog(context);
print(e.toString());
}
} else {
_autoValidate = true;
}
}

Widget _btnExecuteTimePicker() {
return WidgetFieldDateTimePicker(
initDateTime: executeTime,
onUpdateDateTime: (selectedDate) {
_environment.executeDate =
selectedDate.convertLocalDateTimeToStringUtcDateTime();
});
}

Widget _ecField() {
return WidgetTextFormFieldNumber(
hintValue: "EC",
labelText: 'EC',
textController: _ecController,
onSaved: (newValue) {
_environment.ec = newValue;
},
);
}

Widget _phField() {
return WidgetTextFormFieldNumber(
hintValue: "pH",
labelText: 'pH',
textController: _phController,
onSaved: (newValue) {
_environment.pH = newValue;
},
);
}

Widget _ocddField() {
return WidgetTextFormFieldNumber(
hintValue: "Nhiệt độ dung dịch",
labelText: 'Nhiệt độ dung dịch',
textController: _ocddController,
onSaved: (newValue) {
_environment.ocdd = newValue;
},
);
}

Widget _temperatureField() {
return WidgetTextFormFieldNumber(
hintValue: "Nhiệt độ môi trường",
labelText: 'Nhiệt độ môi trường',
textController: _temperatureController,
onSaved: (newValue) {
_environment.temperature = newValue;
},
);
}

Widget _doField() {
return WidgetTextFormFieldNumber(
hintValue: "Độ ẩm",
labelText: 'Độ ẩm',
textController: _doController,
onSaved: (newValue) {
_environment.dodo = newValue;
},
);
}

Widget _llnField() {
return WidgetTextFormFieldNumber(
hintValue: "Lưu lượng nước",
labelText: 'Lưu lượng nước',
textController: _llnController,
onSaved: (newValue) {
_environment.lln = newValue;
},
);
}

Widget _executeByField() {
return TextFormField(
keyboardType: TextInputType.text,
decoration: InputDecoration(labelText: "Người thực hiện"),
enabled: false,
controller: _executeByController,
onSaved: (newValue) {},
);
}

@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<ActionDetailBloc>(
create: (context) =>
ActionDetailBloc(repository: Repository())
..add(FetchData(
isNeedFetchData: widget.isEdit,
apiActivity: ConstCommon.apiDetailEnvUpdate,
activityId: widget.activityId))),
BlocProvider<MediaHelperBloc>(
create: (context) =>
MediaHelperBloc()..add(ChangeListMedia(items: [])),
)
],
child: Form(
key: _formKey,
autovalidate: _autoValidate,
child: SafeArea(
child: SingleChildScrollView(
child:
BlocConsumer<ActionDetailBloc, ActionDetailState>(
listener: (context, state) async {
if (state is ActionDetailFailure) {
print("fail");
LoadingDialog.hideLoadingDialog(context);
} else if (state is ActionDetailSuccess) {
LoadingDialog.hideLoadingDialog(context);
print("success");
print(state.item);
_environment = Environment.fromJson(state.item);
//Parse theo API :')
_environment.environmentUpdates
.forEach((envDetail) {
switch (envDetail.tbEnvironmentalName) {
case "EC":
_environment.ec =
envDetail.index.toString();
break;
case "pH":
_environment.pH =
envDetail.index.toString();
break;
case "OCDD":
_environment.ocdd =
envDetail.index.toString();
break;
case "TEMPERATURE":
_environment.temperature =
envDetail.index.toString();
break;
case "DO":
_environment.dodo =
envDetail.index.toString();
break;
case "LLN":
_environment.lln =
envDetail.index.toString();
break;
default:
break;
}
});
_environment.activityId = widget.activityId;
_ecController.text =
_environment.ec.formatStringToStringDecimal();
_phController.text =
_environment.pH.formatStringToStringDecimal();
_ocddController.text = _environment.ocdd
.formatStringToStringDecimal();
_temperatureController.text = _environment
.temperature
.formatStringToStringDecimal();
_doController.text = _environment.dodo
.formatStringToStringDecimal();
_llnController.text = _environment.lln
.formatStringToStringDecimal();
_executeByController.text =
_environment.executeBy;

Get.find<ChangeDateTimePicker>().change(_environment
.executeDate
.convertStringServerDateTimeToLocalDateTime());
//Show media
if (Validators.stringNotNullOrEmpty(
_environment.media)) {
BlocProvider.of<MediaHelperBloc>(context).add(
ChangeListMedia(
items:
UtilAction.convertFilePathToMedia(
_environment.media)));
}
} else if (state is ActionDetailInitial) {
print("init");
} else if (state is ActionDetailLoading) {
print("loading");
LoadingDialog.showLoadingDialog(context);
}
},
builder: (context, state) {
return Column(
children: [
Padding(
padding: const EdgeInsets.all(8.0),
child: Column(
crossAxisAlignment:
CrossAxisAlignment.start,
children: <Widget>[
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,
),
_ecField(),
SizedBox(
height: 8.0,
),
_phField(),
SizedBox(
height: 8.0,
),
_ocddField(),
SizedBox(
height: 8.0,
),
_temperatureField(),
SizedBox(
height: 8.0,
),
_doField(),
SizedBox(
height: 8.0,
),
_llnField(),
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();
}),
),
],
);
},
),
),
)),
))));
@override
void dispose() {
_ecController.dispose();
_phController.dispose();
_ocddController.dispose();
_temperatureController.dispose();
_doController.dispose();
_llnController.dispose();
_executeByController.dispose();
super.dispose();
}
}

+ 17
- 8
lib/presentation/screens/plot_detail/sc_plot_action.dart View File

@@ -3,6 +3,7 @@ import 'package:cached_network_image/cached_network_image.dart';
import 'package:farm_tpf/custom_model/ActionType.dart';
import 'package:farm_tpf/data/repository/repository.dart';
import 'package:farm_tpf/presentation/custom_widgets/loading_list_page.dart';
import 'package:farm_tpf/presentation/screens/actions/environment_update/sc_edit_action_environment_update.dart';
import 'package:farm_tpf/presentation/screens/actions/sc_action.dart';
import 'package:farm_tpf/presentation/screens/plot_detail/bloc/cubit/plot_action_type_cubit.dart';
import 'package:farm_tpf/utils/const_assets.dart';
@@ -38,14 +39,22 @@ class _PlotActionScreenState extends State<PlotActionScreen>
Widget _createActionButtons(ActionType actionType, BuildContext _context) {
return GestureDetector(
onTap: () {
Get.to(ActionScreen(
cropId: widget.cropId,
idAction: actionType.id,
title: actionType.description,
activityType: actionType.name,
activityId: -1,
isEdit: false,
));
if (actionType.name == 'ACTIVE_TYPE_UPDATE_ENV') {
Get.to(EditActionEnvironmentUpdate(
cropId: widget.cropId,
activityId: -1,
isEdit: false,
));
} else {
Get.to(ActionScreen(
cropId: widget.cropId,
idAction: actionType.id,
title: actionType.description,
activityType: actionType.name,
activityId: -1,
isEdit: false,
));
}
},
child: Container(
margin: EdgeInsets.all(8),

+ 17
- 8
lib/presentation/screens/plot_detail/sc_plot_history.dart View File

@@ -3,6 +3,7 @@ import 'package:farm_tpf/data/repository/repository.dart';
import 'package:farm_tpf/presentation/custom_widgets/bloc/widget_row_plot_info.dart';
import 'package:farm_tpf/presentation/custom_widgets/bottom_loader.dart';
import 'package:farm_tpf/presentation/custom_widgets/loading_list_page.dart';
import 'package:farm_tpf/presentation/screens/actions/environment_update/sc_edit_action_environment_update.dart';
import 'package:farm_tpf/presentation/screens/actions/sc_action.dart';
import 'package:farm_tpf/utils/const_color.dart';
import 'package:flutter/material.dart';
@@ -169,14 +170,22 @@ class ItemInfinityWidget extends StatelessWidget {
name: '${item.activityTypeDescription ?? ''}',
value: item.executeDate.format_DDMMYY_HHmm() ?? ''),
onTap: () {
Get.to(ActionScreen(
isEdit: true,
cropId: item.cropId,
activityId: item.id,
activityType: item.activityTypeName,
title: 'ActionScreen',
idAction: item.activityTypeId,
));
if (item.activityTypeName == 'ACTIVE_TYPE_UPDATE_ENV') {
Get.to(EditActionEnvironmentUpdate(
cropId: item.cropId,
activityId: item.id,
isEdit: true,
));
} else {
Get.to(ActionScreen(
isEdit: true,
cropId: item.cropId,
activityId: item.id,
activityType: item.activityTypeName,
title: 'ActionScreen',
idAction: item.activityTypeId,
));
}
});
}
}

+ 6
- 0
lib/utils/const_common.dart View File

@@ -11,6 +11,12 @@ class ConstCommon {
static const String supplyTypeSubStrate = "GIATHE";
static const String supplyTypeProtectPlant = "THUOCBVTV";
static const String supplyTypeAll = "ALL";

//Environment Update
static const String apiDetailEnvUpdate = "api/activity-environment-update";
static const String paramsActionEnvUpdate = "activityEnv";
static const String apiUpdateEnvUpdate = "api/updateEnv";
static const String apiAddEnvUpdate = "api/createEnv";
}

enum CRUDStatus { unknown, add, edit, delete }

Loading…
Cancel
Save