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.

283 lines
10.0KB

  1. import 'package:farm_tpf/custom_model/CropPlot.dart';
  2. import 'package:farm_tpf/data/repository/repository.dart';
  3. import 'package:farm_tpf/presentation/custom_widgets/bloc/widget_row_plot_info.dart';
  4. import 'package:farm_tpf/presentation/custom_widgets/bottom_loader.dart';
  5. import 'package:farm_tpf/presentation/custom_widgets/loading_list_page.dart';
  6. import 'package:farm_tpf/presentation/screens/actions/crop_status/sc_edit_action_crop_status.dart';
  7. import 'package:farm_tpf/presentation/screens/actions/disease/sc_edit_action_disease.dart';
  8. import 'package:farm_tpf/presentation/screens/actions/dung/sc_edit_action_dung.dart';
  9. import 'package:farm_tpf/presentation/screens/actions/end/sc_edit_action_end.dart';
  10. import 'package:farm_tpf/presentation/screens/actions/environment_update/sc_edit_action_environment_update.dart';
  11. import 'package:farm_tpf/presentation/screens/actions/harvest/sc_edit_action_harvest.dart';
  12. import 'package:farm_tpf/presentation/screens/actions/harvest_process/sc_edit_action_harvest_process.dart';
  13. import 'package:farm_tpf/presentation/screens/actions/nursery/sc_edit_action_nursery.dart';
  14. import 'package:farm_tpf/presentation/screens/actions/other/sc_edit_action_other.dart';
  15. import 'package:farm_tpf/presentation/screens/actions/packing/sc_edit_action_packing.dart';
  16. import 'package:farm_tpf/presentation/screens/actions/plant/sc_edit_action_plant.dart';
  17. import 'package:farm_tpf/presentation/screens/actions/sell/sc_edit_action_sell.dart';
  18. import 'package:farm_tpf/presentation/screens/actions/spraying/sc_edit_action_spraying.dart';
  19. import 'package:farm_tpf/presentation/screens/actions/use_water/sc_edit_action_user_water.dart';
  20. import 'package:farm_tpf/utils/const_color.dart';
  21. import 'package:flutter/material.dart';
  22. import 'package:flutter_bloc/flutter_bloc.dart';
  23. import 'package:get/get.dart';
  24. import 'package:farm_tpf/utils/formatter.dart';
  25. import 'bloc/plot_detail_bloc.dart';
  26. class PlotHistoryScreen extends StatefulWidget {
  27. int cropId;
  28. String cropCode;
  29. int cropType;
  30. PlotHistoryScreen({this.cropId, this.cropCode, this.cropType});
  31. @override
  32. _PlotHistoryScreenState createState() => _PlotHistoryScreenState();
  33. }
  34. class _PlotHistoryScreenState extends State<PlotHistoryScreen>
  35. with AutomaticKeepAliveClientMixin {
  36. @override
  37. void initState() {
  38. super.initState();
  39. }
  40. @override
  41. void dispose() {
  42. super.dispose();
  43. }
  44. @override
  45. Widget build(BuildContext context) {
  46. return InfinityView(
  47. cropId: widget.cropId,
  48. cropCode: widget.cropCode,
  49. );
  50. }
  51. @override
  52. bool get wantKeepAlive => true;
  53. }
  54. class InfinityView extends StatefulWidget {
  55. int cropId;
  56. String cropCode;
  57. InfinityView({this.cropId, this.cropCode});
  58. @override
  59. _InfinityViewState createState() => _InfinityViewState();
  60. }
  61. class _InfinityViewState extends State<InfinityView> {
  62. var plotDetailBloc = PlotDetailBloc(repository: Repository());
  63. final _scrollController = ScrollController();
  64. final _scrollThreshold = 250.0;
  65. @override
  66. void initState() {
  67. plotDetailBloc
  68. .add(DataFetched(cropId: widget.cropId, cropCode: widget.cropCode));
  69. _scrollController.addListener(() {
  70. final maxScroll = _scrollController.position.maxScrollExtent;
  71. final currentScroll = _scrollController.position.pixels;
  72. if (maxScroll - currentScroll < _scrollThreshold) {
  73. plotDetailBloc
  74. .add(DataFetched(cropId: widget.cropId, cropCode: widget.cropCode));
  75. }
  76. });
  77. super.initState();
  78. }
  79. @override
  80. Widget build(BuildContext context) {
  81. return BlocBuilder<PlotDetailBloc, PlotDetailState>(
  82. cubit: plotDetailBloc,
  83. builder: (context, state) {
  84. if (state is PlotDetailFailure) {
  85. return Center(child: Text(state.errorString));
  86. }
  87. if (state is PlotDetailSuccess) {
  88. if (state.items.isEmpty) {
  89. return Center(
  90. child: Column(
  91. mainAxisSize: MainAxisSize.max,
  92. crossAxisAlignment: CrossAxisAlignment.center,
  93. mainAxisAlignment: MainAxisAlignment.center,
  94. children: [
  95. Text("Không có dữ liệu lịch sử canh tác"),
  96. OutlineButton(
  97. onPressed: () {
  98. plotDetailBloc.add(OnRefresh(
  99. cropId: widget.cropId, cropCode: widget.cropCode));
  100. },
  101. child: Text('Tải lại'),
  102. )
  103. ],
  104. ));
  105. }
  106. List<Activities> currentItems = List<Activities>.from(state.items);
  107. return SafeArea(
  108. child: Scaffold(
  109. body: RefreshIndicator(
  110. child: ListView.builder(
  111. padding: EdgeInsets.all(8),
  112. physics: AlwaysScrollableScrollPhysics(),
  113. itemBuilder: (BuildContext context, int index) {
  114. return index >= state.items.length
  115. ? BottomLoader()
  116. : ItemInfinityWidget(
  117. currentItems: currentItems,
  118. item: state.items[index],
  119. index: index,
  120. currentPage: state.page,
  121. currentReachedMax: state.hasReachedMax);
  122. },
  123. itemCount: state.hasReachedMax
  124. ? state.items.length
  125. : state.items.length + 1,
  126. controller: _scrollController,
  127. ),
  128. onRefresh: () async {
  129. plotDetailBloc.add(OnRefresh(
  130. cropId: widget.cropId, cropCode: widget.cropCode));
  131. }),
  132. ),
  133. );
  134. }
  135. return Center(
  136. child: LoadingListPage(),
  137. );
  138. },
  139. );
  140. }
  141. @override
  142. void dispose() {
  143. _scrollController.dispose();
  144. super.dispose();
  145. }
  146. }
  147. class ItemInfinityWidget extends StatelessWidget {
  148. final List<Activities> currentItems;
  149. final Activities item;
  150. final int currentPage;
  151. final bool currentReachedMax;
  152. final int index;
  153. const ItemInfinityWidget(
  154. {Key key,
  155. @required this.currentItems,
  156. @required this.item,
  157. @required this.currentPage,
  158. @required this.currentReachedMax,
  159. @required this.index})
  160. : super(key: key);
  161. @override
  162. Widget build(BuildContext context) {
  163. return GestureDetector(
  164. child: WidgetRowPlotInfo(
  165. color: index % 2 == 0
  166. ? AppColors.DEFAULT.withOpacity(0.3)
  167. : AppColors.DEFAULT.withOpacity(0.1),
  168. name: '${item.activityTypeDescription ?? ''}',
  169. value: item.executeDate.format_DDMMYY_HHmm() ?? ''),
  170. onTap: () {
  171. if (item.activityTypeName == "ACTIVE_TYPE_NURSERY") {
  172. Get.to(EditActionNurseryScreen(
  173. cropId: item.cropId,
  174. activityId: item.id,
  175. isEdit: true,
  176. ));
  177. } else if (item.activityTypeName == "ACTIVE_TYPE_STATUS_CROP") {
  178. Get.to(EditActionCropStatusScreen(
  179. cropId: item.cropId,
  180. activityId: item.id,
  181. isEdit: true,
  182. ));
  183. } else if (item.activityTypeName == "ACTIVE_TYPE_UPDATE_ENV") {
  184. Get.to(EditActionEnvironmentUpdate(
  185. cropId: item.cropId,
  186. activityId: item.id,
  187. isEdit: true,
  188. ));
  189. } else if (item.activityTypeName ==
  190. "ACTIVE_TYPE_PESTS_INVESTIGATION") {
  191. Get.to(EditActionDiseaseScreen(
  192. cropId: item.cropId,
  193. activityId: item.id,
  194. isEdit: true,
  195. ));
  196. } else if (item.activityTypeName == "ACTIVE_TYPE_USE_WATER") {
  197. Get.to(EditActionUseWaterScreen(
  198. cropId: item.cropId,
  199. activityId: item.id,
  200. isEdit: true,
  201. ));
  202. } else if (item.activityTypeName == "ACTIVE_TYPE_HARVEST") {
  203. Get.to(EditActionHarvestScreen(
  204. cropId: item.cropId,
  205. activityId: item.id,
  206. isEdit: true,
  207. ));
  208. } else if (item.activityTypeName == "ACTIVE_TYPE_PACKING") {
  209. Get.to(EditActionPackingScreen(
  210. cropId: item.cropId,
  211. activityId: item.id,
  212. isEdit: true,
  213. ));
  214. } else if (item.activityTypeName == "ACTIVE_TYPE_SELL") {
  215. Get.to(EditActionSellScreen(
  216. cropId: item.cropId,
  217. activityId: item.id,
  218. isEdit: true,
  219. ));
  220. } else if (item.activityTypeName == "ACTIVE_TYPE_END") {
  221. Get.to(EditActionEndScreen(
  222. cropId: item.cropId,
  223. activityId: item.id,
  224. isEdit: true,
  225. ));
  226. } else if (item.activityTypeName == "ACTIVE_TYPE_STATUS_GROW") {
  227. Get.to(EditActionPlantScreen(
  228. cropId: item.cropId,
  229. activityId: item.id,
  230. isEdit: true,
  231. ));
  232. } else if (item.activityTypeName == "ACTIVE_TYPE_MANURING") {
  233. Get.to(EditActionDungScreen(
  234. cropId: item.cropId,
  235. activityId: item.id,
  236. isEdit: true,
  237. ));
  238. } else if (item.activityTypeName == "ACTIVE_TYPE_SPRAY") {
  239. Get.to(EditActionSprayingScreen(
  240. cropId: item.cropId,
  241. activityId: item.id,
  242. isEdit: true,
  243. ));
  244. } else if (item.activityTypeName == "ACTIVE_TYPE_PROCESS") {
  245. Get.to(EditActionHarvestProcessScreen(
  246. cropId: item.cropId,
  247. activityId: item.id,
  248. isEdit: true,
  249. ));
  250. } else {
  251. Get.to(EditActionOtherScreen(
  252. cropId: item.cropId,
  253. activityId: item.id,
  254. isEdit: true,
  255. ));
  256. }
  257. });
  258. }
  259. }
  260. class ActionType {
  261. Widget listScreen;
  262. String actionName;
  263. ActionType(String actionName, Widget listScreen) {
  264. this.actionName = actionName;
  265. this.listScreen = listScreen;
  266. }
  267. }