You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

324 lines
14KB

  1. import 'package:farm_tpf/custom_model/action_form/ActionUIField.dart';
  2. import 'package:farm_tpf/custom_model/action_form/ActionUIForm.dart';
  3. import 'package:farm_tpf/data/repository/repository.dart';
  4. import 'package:farm_tpf/presentation/custom_widgets/app_bar_widget.dart';
  5. import 'package:farm_tpf/presentation/custom_widgets/bloc/media_helper_bloc.dart';
  6. import 'package:farm_tpf/presentation/custom_widgets/button_widget.dart';
  7. import 'package:farm_tpf/presentation/custom_widgets/dropdown_supply_widget.dart';
  8. import 'package:farm_tpf/presentation/custom_widgets/widget_action_field_date.dart';
  9. import 'package:farm_tpf/presentation/custom_widgets/widget_field_time_picker.dart';
  10. import 'package:farm_tpf/presentation/custom_widgets/widget_loading.dart';
  11. import 'package:farm_tpf/presentation/custom_widgets/widget_media_picker.dart';
  12. import 'package:farm_tpf/presentation/custom_widgets/widget_text_field_area.dart';
  13. import 'package:farm_tpf/presentation/custom_widgets/widget_text_form_field.dart';
  14. import 'package:farm_tpf/presentation/screens/actions/cubit/action_ui_cubit.dart';
  15. import 'package:farm_tpf/utils/pref.dart';
  16. import 'package:farm_tpf/utils/validators.dart';
  17. import 'package:flutter/material.dart';
  18. import 'package:flutter_bloc/flutter_bloc.dart';
  19. import 'package:get/get.dart';
  20. import 'package:keyboard_dismisser/keyboard_dismisser.dart';
  21. import 'state_management_helper/change_file_controller.dart';
  22. class ActionScreen extends StatefulWidget {
  23. final int idAction;
  24. final String title;
  25. ActionScreen({@required this.idAction, @required this.title});
  26. @override
  27. _ActionScreenState createState() => _ActionScreenState();
  28. }
  29. class _ActionScreenState extends State<ActionScreen> {
  30. final _scaffoldKey = GlobalKey<ScaffoldState>();
  31. var _formKey = GlobalKey<FormState>();
  32. var pref = LocalPref();
  33. final _executeByController = TextEditingController();
  34. DateTime executeTime = DateTime.now();
  35. List<String> filePaths = List<String>();
  36. var changeFileController = Get.put(ChangeFileController());
  37. Map<String, TextEditingController> textFieldControllers = {};
  38. Future<Null> getSharedPrefs() async {
  39. var currentFullName = await pref.getString(DATA_CONST.CURRENT_FULL_NAME);
  40. _executeByController.text = currentFullName ?? "";
  41. }
  42. @override
  43. void initState() {
  44. super.initState();
  45. getSharedPrefs();
  46. }
  47. _validateInputs() async {
  48. if (_formKey.currentState.validate()) {
  49. _formKey.currentState.save();
  50. LoadingDialog.showLoadingDialog(context);
  51. filePaths = Get.find<ChangeFileController>().newFiles;
  52. //Create request general model
  53. try {
  54. LoadingDialog.hideLoadingDialog(context);
  55. //ADD NEW
  56. //Update
  57. textFieldControllers.forEach((key, value) {
  58. print(textFieldControllers[key].text);
  59. });
  60. } catch (e) {
  61. LoadingDialog.hideLoadingDialog(context);
  62. print(e.toString());
  63. }
  64. } else {
  65. //
  66. }
  67. }
  68. Widget _btnExecuteTimePicker() {
  69. return WidgetFieldDateTimePicker(
  70. initDateTime: executeTime,
  71. onUpdateDateTime: (selectedDate) {
  72. //
  73. });
  74. }
  75. Widget _executeByField() {
  76. return TextFormField(
  77. keyboardType: TextInputType.text,
  78. decoration: InputDecoration(labelText: "Người thực hiện"),
  79. enabled: false,
  80. controller: _executeByController,
  81. onSaved: (newValue) {},
  82. );
  83. }
  84. //
  85. // GENERATE DYNAMIC FORM
  86. //
  87. Widget generateTextField(List<ActionUIField> fields) {
  88. return Wrap(
  89. children: [
  90. ListView.separated(
  91. shrinkWrap: true,
  92. physics: NeverScrollableScrollPhysics(),
  93. itemCount: fields.length,
  94. separatorBuilder: (context, index) {
  95. return SizedBox(
  96. height: 8,
  97. );
  98. },
  99. itemBuilder: (context, index) {
  100. var field = fields[index];
  101. if (field.tbControlTypeName == 'text') {
  102. return TextFormField(
  103. keyboardType: TextInputType.text,
  104. decoration: InputDecoration(labelText: field.description),
  105. controller: textFieldControllers[field.id.toString()],
  106. onSaved: (newValue) {},
  107. validator: field.isMandatory
  108. ? (String value) {
  109. return Validators.validateNotNullOrEmpty(
  110. value, 'Vui lòng nhập ${field.description}');
  111. }
  112. : null,
  113. );
  114. } else if (field.tbControlTypeName == 'number') {
  115. return WidgetTextFormFieldNumber(
  116. hintValue: field.description,
  117. textController: textFieldControllers[field.id.toString()],
  118. onSaved: (newValue) {},
  119. validator: field.isMandatory
  120. ? (String value) {
  121. return Validators.validNumberOrEmpty(
  122. value, 'Vui lòng nhập ${field.description}');
  123. }
  124. : null,
  125. );
  126. } else if (field.tbControlTypeName == 'textarea') {
  127. return TextFieldAreaWidget(
  128. hint: field.description,
  129. controller: textFieldControllers[field.id.toString()],
  130. onSaved: (newValue) {});
  131. } else if (field.tbControlTypeName == 'dropdown') {
  132. return DropdownSupplyWidget(
  133. titleName: field.description ?? '',
  134. tbSupply: field.tbActivityExtendTypeExternalTable ?? '',
  135. tag: field.name,
  136. value: field.description,
  137. hint:
  138. '${field.description} ${field.isMandatory ? '*' : ''}',
  139. condition: field.tbActivityExtendTypeCondition,
  140. invalidMessage: '',
  141. onPressed: (commonData) {
  142. print(commonData.name);
  143. });
  144. } else if (field.tbControlTypeName == 'date') {
  145. return FieldDateWidget(
  146. tag: field.name,
  147. value: field.description,
  148. hint:
  149. '${field.description} ${field.isMandatory ? '*' : ''}',
  150. invalidMessage: '',
  151. onPressed: (selectedDate) {
  152. print(selectedDate.day);
  153. });
  154. } else if (field.tbControlTypeName == 'radiobutton') {
  155. return DropdownSupplyWidget(
  156. titleName: field.description ?? '',
  157. tbSupply: field.tbActivityExtendTypeExternalTable ?? '',
  158. tag: field.name,
  159. value: field.description,
  160. hint:
  161. '${field.description} ${field.isMandatory ? '*' : ''}',
  162. condition: field.tbActivityExtendTypeCondition,
  163. invalidMessage: '',
  164. onPressed: (commonData) {
  165. print(commonData.name);
  166. });
  167. } else {
  168. return Container();
  169. }
  170. })
  171. ],
  172. );
  173. }
  174. @override
  175. Widget build(BuildContext context) => KeyboardDismisser(
  176. gestures: [
  177. GestureType.onTap,
  178. GestureType.onPanUpdateDownDirection,
  179. ],
  180. child: Scaffold(
  181. backgroundColor: Colors.white,
  182. key: _scaffoldKey,
  183. appBar: AppBarWidget(
  184. isBack: true,
  185. action: InkWell(
  186. child: Text(
  187. 'Lưu',
  188. style: TextStyle(
  189. color: Colors.red, fontWeight: FontWeight.normal),
  190. ),
  191. onTap: () {
  192. FocusScopeNode currentFocus = FocusScope.of(context);
  193. if (!currentFocus.hasPrimaryFocus) {
  194. currentFocus.unfocus();
  195. }
  196. _validateInputs();
  197. },
  198. ),
  199. ),
  200. body: KeyboardDismisser(
  201. child: MultiBlocProvider(
  202. providers: [
  203. BlocProvider<ActionUiCubit>(
  204. create: (context) =>
  205. ActionUiCubit(repository: Repository())
  206. ..getActionUIForm(widget.idAction)),
  207. BlocProvider<MediaHelperBloc>(
  208. create: (context) =>
  209. MediaHelperBloc()..add(ChangeListMedia(items: [])),
  210. )
  211. ],
  212. child: Form(
  213. key: _formKey,
  214. child: SafeArea(
  215. child: SingleChildScrollView(
  216. child: BlocBuilder<ActionUiCubit, ActionUiState>(
  217. builder: (context, state) {
  218. if (state is ActionUiLoading) {
  219. print('loading...');
  220. return Center(child: CircularProgressIndicator());
  221. } else if (state is ActionUiSuccess) {
  222. var actionUiForm = state.item as ActionUIForm;
  223. actionUiForm.objectParameterDTOList
  224. .forEach((element) {
  225. var textEditingController =
  226. new TextEditingController();
  227. textFieldControllers.putIfAbsent(
  228. element.id.toString(),
  229. () => textEditingController);
  230. });
  231. return Column(
  232. children: [
  233. Padding(
  234. padding: const EdgeInsets.all(8.0),
  235. child: Column(
  236. children: <Widget>[
  237. Container(
  238. width: double.infinity,
  239. child: Text(
  240. "Ngày thực hiện *",
  241. style: TextStyle(
  242. color: Colors.black54,
  243. fontSize: 13.0),
  244. ),
  245. ),
  246. _btnExecuteTimePicker(),
  247. SizedBox(
  248. height: 8.0,
  249. ),
  250. generateTextField(actionUiForm
  251. .objectParameterDTOList),
  252. _executeByField(),
  253. SizedBox(
  254. height: 8.0,
  255. ),
  256. ],
  257. ),
  258. ),
  259. Container(
  260. width: double.infinity,
  261. height: 16,
  262. color: Colors.grey[200],
  263. ),
  264. BlocBuilder<MediaHelperBloc,
  265. MediaHelperState>(
  266. builder: (context, state) {
  267. if (state is MediaHelperSuccess) {
  268. return WidgetMediaPicker(
  269. currentItems: state.items,
  270. onChangeFiles: (newPathFiles,
  271. deletePathFiles) async {
  272. Get.find<ChangeFileController>()
  273. .change(newPathFiles,
  274. deletePathFiles);
  275. });
  276. } else {
  277. return Center(
  278. child: CircularProgressIndicator());
  279. }
  280. }),
  281. Padding(
  282. padding: const EdgeInsets.all(8.0),
  283. child: ButtonWidget(
  284. title: 'CẬP NHẬT',
  285. onPressed: () {
  286. FocusScopeNode currentFocus =
  287. FocusScope.of(context);
  288. if (!currentFocus.hasPrimaryFocus) {
  289. currentFocus.unfocus();
  290. }
  291. _validateInputs();
  292. }),
  293. ),
  294. ],
  295. );
  296. } else if (state is ActionUiFailure) {
  297. print('error');
  298. return Text(state.errorString);
  299. // LoadingDialog.hideLoadingDialog(context);
  300. }
  301. },
  302. ),
  303. ),
  304. )),
  305. ))));
  306. @override
  307. void dispose() {
  308. _executeByController.dispose();
  309. super.dispose();
  310. }
  311. }