Browse Source

add action (nursery)

smf
daivp 4 years ago
parent
commit
9a078a9e8e
6 changed files with 202 additions and 58 deletions
  1. +38
    -7
      lib/custom_model/action_form/RequestActivity.dart
  2. +46
    -0
      lib/data/repository/repository.dart
  3. +10
    -18
      lib/presentation/screens/actions/controller/ChangeWorker.dart
  4. +11
    -6
      lib/presentation/screens/actions/nursery/widget_worker.dart
  5. +89
    -19
      lib/presentation/screens/actions/sc_action.dart
  6. +8
    -8
      lib/presentation/screens/plot_detail/sc_plot_action.dart

+ 38
- 7
lib/custom_model/action_form/RequestActivity.dart View File

String executeDate; String executeDate;
String externalTable; String externalTable;
String description; String description;
List<TbObjectUpdateDTOList> tbObjectUpdateDTOList;
List<TbObjectUpdateDTO> tbObjectUpdateDTOList;
List<TbSuppliesUsingDetailsDTOs> tbSuppliesUsingDetailsDTOs; List<TbSuppliesUsingDetailsDTOs> tbSuppliesUsingDetailsDTOs;
List<TbNurseryDetailsDTO> tbNurseryDetailsDTOList;


RequestActivity( RequestActivity(
{this.tbActivityTypeId, {this.tbActivityTypeId,
this.externalTable, this.externalTable,
this.description, this.description,
this.tbObjectUpdateDTOList, this.tbObjectUpdateDTOList,
this.tbSuppliesUsingDetailsDTOs});
this.tbSuppliesUsingDetailsDTOs,
this.tbNurseryDetailsDTOList});


RequestActivity.fromJson(Map<String, dynamic> json) { RequestActivity.fromJson(Map<String, dynamic> json) {
tbActivityTypeId = json['tbActivityTypeId']; tbActivityTypeId = json['tbActivityTypeId'];
externalTable = json['externalTable']; externalTable = json['externalTable'];
description = json['description']; description = json['description'];
if (json['tbObjectUpdateDTOList'] != null) { if (json['tbObjectUpdateDTOList'] != null) {
tbObjectUpdateDTOList = new List<TbObjectUpdateDTOList>();
tbObjectUpdateDTOList = new List<TbObjectUpdateDTO>();
json['tbObjectUpdateDTOList'].forEach((v) { json['tbObjectUpdateDTOList'].forEach((v) {
tbObjectUpdateDTOList.add(new TbObjectUpdateDTOList.fromJson(v));
tbObjectUpdateDTOList.add(new TbObjectUpdateDTO.fromJson(v));
}); });
} }
if (json['tbSuppliesUsingDetailsDTOs'] != null) { if (json['tbSuppliesUsingDetailsDTOs'] != null) {
.add(new TbSuppliesUsingDetailsDTOs.fromJson(v)); .add(new TbSuppliesUsingDetailsDTOs.fromJson(v));
}); });
} }
if (json['tbNurseryDetailsDTOList'] != null) {
tbNurseryDetailsDTOList = new List<TbNurseryDetailsDTO>();
json['tbNurseryDetailsDTOList'].forEach((v) {
tbNurseryDetailsDTOList.add(new TbNurseryDetailsDTO.fromJson(v));
});
}
} }


Map<String, dynamic> toJson() { Map<String, dynamic> toJson() {
data['tbSuppliesUsingDetailsDTOs'] = data['tbSuppliesUsingDetailsDTOs'] =
this.tbSuppliesUsingDetailsDTOs.map((v) => v.toJson()).toList(); this.tbSuppliesUsingDetailsDTOs.map((v) => v.toJson()).toList();
} }
if (this.tbNurseryDetailsDTOList != null) {
data['tbNurseryDetailsDTOList'] =
this.tbNurseryDetailsDTOList.map((v) => v.toJson()).toList();
}
return data; return data;
} }
} }


class TbObjectUpdateDTOList {
class TbObjectUpdateDTO {
int tbObjectParameterId; int tbObjectParameterId;
String index; String index;


TbObjectUpdateDTOList({this.tbObjectParameterId, this.index});
TbObjectUpdateDTO({this.tbObjectParameterId, this.index});


TbObjectUpdateDTOList.fromJson(Map<String, dynamic> json) {
TbObjectUpdateDTO.fromJson(Map<String, dynamic> json) {
tbObjectParameterId = json['tbObjectParameterId']; tbObjectParameterId = json['tbObjectParameterId'];
index = json['index']; index = json['index'];
} }
return data; return data;
} }
} }

class TbNurseryDetailsDTO {
String workerName;
String trayNumber;

TbNurseryDetailsDTO({this.workerName, this.trayNumber});

TbNurseryDetailsDTO.fromJson(Map<String, dynamic> json) {
workerName = json['workerName'];
trayNumber = json['trayNumber'];
}

Map<String, dynamic> toJson() {
final Map<String, dynamic> data = new Map<String, dynamic>();
data['workerName'] = this.workerName;
data['trayNumber'] = this.trayNumber;
return data;
}
}

+ 46
- 0
lib/data/repository/repository.dart View File

.toList(); .toList();
return value; return value;
} }

Future<void> createActionCommon(
Function(dynamic) onSuccess, Function(dynamic) onError,
{@required String activityType,
@required String activityData,
List<String> filePaths}) async {
var formData = FormData();
filePaths.forEach((f) {
formData.files.add(MapEntry('images', MultipartFile.fromFileSync(f)));
});
formData.fields.add(MapEntry('tbCommonActivityDTO', activityData));
try {
await dio
.post(
"${ConstCommon.baseUrl}/api/create-common-activity/$activityType",
data: formData)
.then((value) {
onSuccess(value.data);
});
} on DioError catch (e) {
onError(e);
}
}

Future<void> updateActionCommon(
Function(dynamic) onSuccess, Function(dynamic) onError,
{String activityType,
String activityAction,
List<String> filePaths}) async {
var formData = FormData();
filePaths.forEach((f) {
formData.files.add(MapEntry('images', MultipartFile.fromFileSync(f)));
});
formData.fields.add(MapEntry('tbCommonActivityDTO', activityAction));
try {
await dio
.put(
"${ConstCommon.baseUrl}/api/update-common-activity/$activityType",
data: formData)
.then((value) {
onSuccess(value.data);
});
} on DioError catch (e) {
onError(e);
}
}
} }

+ 10
- 18
lib/presentation/screens/actions/controller/ChangeWorker.dart View File

import 'package:farm_tpf/custom_model/NurseryDetail.dart';
import 'package:farm_tpf/custom_model/action_form/RequestActivity.dart';
import 'package:get/get_state_manager/get_state_manager.dart'; import 'package:get/get_state_manager/get_state_manager.dart';


class ChangeWorker extends GetxController { class ChangeWorker extends GetxController {
List<NurseryDetail> currentItems;
NurseryDetail currentItem;
List<TbNurseryDetailsDTO> currentItems;
TbNurseryDetailsDTO currentItem;
int currentIndex; int currentIndex;
void init(List<NurseryDetail> initItems) {
void init(List<TbNurseryDetailsDTO> initItems) {
currentItems = initItems ?? []; currentItems = initItems ?? [];
currentItem = NurseryDetail();
currentItem = TbNurseryDetailsDTO();
currentIndex = -1; currentIndex = -1;
update(); update();
} }
update(); update();
} }


void changeInitList(List<NurseryDetail> initListWorkers) {
void changeInitList(List<TbNurseryDetailsDTO> initListWorkers) {
currentItems = initListWorkers; currentItems = initListWorkers;
update(); update();
} }


void addSupply(NurseryDetail nurseryDetail) {
void addNurseryDetail(TbNurseryDetailsDTO nurseryDetail) {
currentItems.insert(0, nurseryDetail); currentItems.insert(0, nurseryDetail);
currentItem = NurseryDetail();
currentItem = TbNurseryDetailsDTO();
update(); update();
} }


void deleteSupply(int index) {
void deleteNurseryDetail(int index) {
currentItems.removeAt(index); currentItems.removeAt(index);
currentItem = NurseryDetail();
update();
}

void editSupply(int index, NurseryDetail supplyUsing) {
var newSup = supplyUsing;
newSup.id = currentItems[index].id;
currentItems[index] = newSup;
currentItem = NurseryDetail();
currentItem = TbNurseryDetailsDTO();
update(); update();
} }
} }

+ 11
- 6
lib/presentation/screens/actions/nursery/widget_worker.dart View File

import 'package:farm_tpf/custom_model/NurseryDetail.dart';
import 'package:farm_tpf/custom_model/action_form/RequestActivity.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/controller/ChangeWorker.dart'; import 'package:farm_tpf/presentation/screens/actions/controller/ChangeWorker.dart';
import 'package:farm_tpf/utils/const_string.dart'; import 'package:farm_tpf/utils/const_string.dart';
import 'package:get/get_state_manager/get_state_manager.dart'; import 'package:get/get_state_manager/get_state_manager.dart';


class WidgetWorker extends StatefulWidget { class WidgetWorker extends StatefulWidget {
final Function(List<TbNurseryDetailsDTO>) onChangeWorkers;
const WidgetWorker({@required this.onChangeWorkers});

@override @override
_WidgetWorkerState createState() => _WidgetWorkerState(); _WidgetWorkerState createState() => _WidgetWorkerState();
} }


Widget _buildListWorker() { Widget _buildListWorker() {
return GetBuilder<ChangeWorker>(builder: (data) { return GetBuilder<ChangeWorker>(builder: (data) {
widget.onChangeWorkers(data.currentItems);
if (data.currentItems.length == 0) { if (data.currentItems.length == 0) {
return Container(); return Container();
} else { } else {
color: Colors.redAccent, color: Colors.redAccent,
), ),
onPressed: () { onPressed: () {
controller.deleteSupply(index);
controller.deleteNurseryDetail(index);
print("Delete worker"); print("Delete worker");
}), }),
) )
_formWorkerKey.currentState.save(); _formWorkerKey.currentState.save();
if (Validators.stringNotNullOrEmpty( if (Validators.stringNotNullOrEmpty(
_workerNameController.text)) { _workerNameController.text)) {
NurseryDetail _nurseryDetail = NurseryDetail()
..workerName = _workerNameController.text
..trayNumber = _trayNumberController.text;
controller.addSupply(_nurseryDetail);
TbNurseryDetailsDTO _nurseryDetail =
TbNurseryDetailsDTO()
..workerName = _workerNameController.text
..trayNumber = _trayNumberController.text;
controller.addNurseryDetail(_nurseryDetail);
_workerNameController.clear(); _workerNameController.clear();
_trayNumberController.clear(); _trayNumberController.clear();
} else { } else {

+ 89
- 19
lib/presentation/screens/actions/sc_action.dart View File

import 'dart:convert';

import 'package:farm_tpf/custom_model/NurseryDetail.dart';
import 'package:farm_tpf/custom_model/action_form/ActionUIField.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/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/data/repository/repository.dart';
import 'package:farm_tpf/presentation/custom_widgets/app_bar_widget.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/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_area.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_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/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/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:get/get.dart'; import 'package:get/get.dart';
import 'package:keyboard_dismisser/keyboard_dismisser.dart'; import 'package:keyboard_dismisser/keyboard_dismisser.dart';
import 'package:farm_tpf/utils/formatter.dart';


import 'dung/widget_dung_supply.dart'; import 'dung/widget_dung_supply.dart';
import 'nursery/widget_worker.dart'; import 'nursery/widget_worker.dart';
import 'state_management_helper/change_file_controller.dart'; import 'state_management_helper/change_file_controller.dart';


class ActionScreen extends StatefulWidget { class ActionScreen extends StatefulWidget {
final int cropId;
final int idAction; final int idAction;
final String activityType; final String activityType;
final String title; final String title;
ActionScreen( ActionScreen(
{@required this.idAction,
{@required this.cropId,
@required this.idAction,
@required this.title, @required this.title,
@required this.activityType}); @required this.activityType});


var pref = LocalPref(); var pref = LocalPref();
final _executeByController = TextEditingController(); final _executeByController = TextEditingController();
DateTime executeTime = DateTime.now(); DateTime executeTime = DateTime.now();
List<String> filePaths = List<String>();
List<String> filePaths = <String>[];
var changeFileController = Get.put(ChangeFileController()); var changeFileController = Get.put(ChangeFileController());
Map<String, TextEditingController> textFieldControllers = {}; Map<String, TextEditingController> textFieldControllers = {};
Map<String, String> valueObjects = {};
var _requestActivity = RequestActivity();
final _repository = Repository();

var _actionUIForm = ActionUIForm();
var _nurseryDetails = <TbNurseryDetailsDTO>[];


Future<Null> getSharedPrefs() async { Future<Null> getSharedPrefs() async {
var currentFullName = await pref.getString(DATA_CONST.CURRENT_FULL_NAME); var currentFullName = await pref.getString(DATA_CONST.CURRENT_FULL_NAME);
void initState() { void initState() {
super.initState(); super.initState();
getSharedPrefs(); getSharedPrefs();
changeFileController.initValue();
} }


_validateInputs() async { _validateInputs() async {
if (_formKey.currentState.validate()) { if (_formKey.currentState.validate()) {
_formKey.currentState.save(); _formKey.currentState.save();
LoadingDialog.showLoadingDialog(context);
filePaths = Get.find<ChangeFileController>().newFiles;
//Create request general model

try { try {
LoadingDialog.hideLoadingDialog(context);
//ADD NEW
//Update
LoadingDialog.showLoadingDialog(context);
filePaths = Get.find<ChangeFileController>().newFiles;
//Create request general model
_requestActivity
..tbActivityTypeId = widget.idAction
..tbCropId = widget.cropId
..externalTable =
_actionUIForm?.activityExtendTypeDTOList?.first?.externalTable ??
'';
filePaths = Get.find<ChangeFileController>().newFiles;
textFieldControllers.forEach((key, value) { textFieldControllers.forEach((key, value) {
print(textFieldControllers[key].text); print(textFieldControllers[key].text);
valueObjects[key] = textFieldControllers[key].text;
}); });
//tbObjectUpdateDTOList
var _objectPrameters = <TbObjectUpdateDTO>[];
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;
}
//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) { } catch (e) {
LoadingDialog.hideLoadingDialog(context); LoadingDialog.hideLoadingDialog(context);
print(e.toString()); print(e.toString());
return WidgetFieldDateTimePicker( return WidgetFieldDateTimePicker(
initDateTime: executeTime, initDateTime: executeTime,
onUpdateDateTime: (selectedDate) { onUpdateDateTime: (selectedDate) {
//
_requestActivity.executeDate =
selectedDate.convertLocalDateTimeToStringUtcDateTime();
}); });
} }


condition: field.tbActivityExtendTypeCondition, condition: field.tbActivityExtendTypeCondition,
invalidMessage: '', invalidMessage: '',
onPressed: (commonData) { onPressed: (commonData) {
print(commonData.name);
valueObjects[field.id.toString()] =
commonData.id.toString();
print(valueObjects[field.id.toString()]);
}); });
} else if (field.tbControlTypeName == 'date') { } else if (field.tbControlTypeName == 'date') {
return FieldDateWidget( return FieldDateWidget(
Widget generateSupply(String activityType) { Widget generateSupply(String activityType) {
switch (activityType) { switch (activityType) {
case 'ACTIVE_TYPE_NURSERY': case 'ACTIVE_TYPE_NURSERY':
return WidgetWorker();
return WidgetWorker(onChangeWorkers: (nurseryDetails) {
_nurseryDetails = nurseryDetails;
});
break; break;
case 'ACTIVE_TYPE_PLANTING': case 'ACTIVE_TYPE_PLANTING':
return Column( return Column(
print('loading...'); print('loading...');
return Center(child: CircularProgressIndicator()); return Center(child: CircularProgressIndicator());
} else if (state is ActionUiSuccess) { } else if (state is ActionUiSuccess) {
var actionUiForm = state.item as ActionUIForm;
actionUiForm.objectParameterDTOList
_actionUIForm = state.item as ActionUIForm;
_actionUIForm.objectParameterDTOList
.forEach((element) { .forEach((element) {
var textEditingController =
new TextEditingController();
textFieldControllers.putIfAbsent(
element.id.toString(),
() => textEditingController);
//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( return Column(
children: [ children: [
SizedBox( SizedBox(
height: 8.0, height: 8.0,
), ),
generateTextField(actionUiForm
generateTextField(_actionUIForm
.objectParameterDTOList), .objectParameterDTOList),
_executeByField(), _executeByField(),
SizedBox( SizedBox(
@override @override
void dispose() { void dispose() {
_executeByController.dispose(); _executeByController.dispose();
textFieldControllers.forEach((key, value) {
textFieldControllers[key].dispose();
});
super.dispose(); super.dispose();
} }
} }

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

import 'package:get/get.dart'; import 'package:get/get.dart';


class PlotActionScreen extends StatefulWidget { class PlotActionScreen extends StatefulWidget {
int cropId;
String cropCode;
int cropType;
final int cropId;
final String cropCode;
final int cropType;
PlotActionScreen({this.cropId, this.cropCode, this.cropType}); PlotActionScreen({this.cropId, this.cropCode, this.cropType});
@override @override
_PlotActionScreenState createState() => _PlotActionScreenState(); _PlotActionScreenState createState() => _PlotActionScreenState();


class _PlotActionScreenState extends State<PlotActionScreen> class _PlotActionScreenState extends State<PlotActionScreen>
with AutomaticKeepAliveClientMixin { with AutomaticKeepAliveClientMixin {
List<ActionType> actions = new List<ActionType>();
List<ActionType> actions = <ActionType>[];


@override @override
void initState() { void initState() {
return GestureDetector( return GestureDetector(
onTap: () { onTap: () {
Get.to(ActionScreen( Get.to(ActionScreen(
idAction: actionType.id,
title: actionType.description,
activityType: actionType.name,
));
cropId: widget.cropId,
idAction: actionType.id,
title: actionType.description,
activityType: actionType.name));
}, },
child: Container( child: Container(
margin: EdgeInsets.all(8), margin: EdgeInsets.all(8),

Loading…
Cancel
Save