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.

268 lines
9.4KB

  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(child: Text("Không có dữ liệu lịch sử canh tác"));
  90. }
  91. List<Activities> currentItems = List<Activities>.from(state.items);
  92. return SafeArea(
  93. child: Scaffold(
  94. body: RefreshIndicator(
  95. child: ListView.builder(
  96. padding: EdgeInsets.all(8),
  97. physics: AlwaysScrollableScrollPhysics(),
  98. itemBuilder: (BuildContext context, int index) {
  99. return index >= state.items.length
  100. ? BottomLoader()
  101. : ItemInfinityWidget(
  102. currentItems: currentItems,
  103. item: state.items[index],
  104. index: index,
  105. currentPage: state.page,
  106. currentReachedMax: state.hasReachedMax);
  107. },
  108. itemCount: state.hasReachedMax
  109. ? state.items.length
  110. : state.items.length + 1,
  111. controller: _scrollController,
  112. ),
  113. onRefresh: () async {
  114. plotDetailBloc.add(OnRefresh(
  115. cropId: widget.cropId, cropCode: widget.cropCode));
  116. }),
  117. ),
  118. );
  119. }
  120. return Center(
  121. child: LoadingListPage(),
  122. );
  123. },
  124. );
  125. }
  126. @override
  127. void dispose() {
  128. _scrollController.dispose();
  129. super.dispose();
  130. }
  131. }
  132. class ItemInfinityWidget extends StatelessWidget {
  133. final List<Activities> currentItems;
  134. final Activities item;
  135. final int currentPage;
  136. final bool currentReachedMax;
  137. final int index;
  138. const ItemInfinityWidget(
  139. {Key key,
  140. @required this.currentItems,
  141. @required this.item,
  142. @required this.currentPage,
  143. @required this.currentReachedMax,
  144. @required this.index})
  145. : super(key: key);
  146. @override
  147. Widget build(BuildContext context) {
  148. return GestureDetector(
  149. child: WidgetRowPlotInfo(
  150. color: index % 2 == 0
  151. ? AppColors.DEFAULT.withOpacity(0.3)
  152. : AppColors.DEFAULT.withOpacity(0.1),
  153. name: '${item.activityTypeDescription ?? ''}',
  154. value: item.executeDate.format_DDMMYY_HHmm() ?? ''),
  155. onTap: () {
  156. if (item.activityTypeName == "ACTIVE_TYPE_NURSERY") {
  157. Get.to(EditActionNurseryScreen(
  158. cropId: item.cropId,
  159. activityId: item.id,
  160. isEdit: true,
  161. ));
  162. } else if (item.activityTypeName == "ACTIVE_TYPE_STATUS_CROP") {
  163. Get.to(EditActionCropStatusScreen(
  164. cropId: item.cropId,
  165. activityId: item.id,
  166. isEdit: true,
  167. ));
  168. } else if (item.activityTypeName == "ACTIVE_TYPE_UPDATE_ENV") {
  169. Get.to(EditActionEnvironmentUpdate(
  170. cropId: item.cropId,
  171. activityId: item.id,
  172. isEdit: true,
  173. ));
  174. } else if (item.activityTypeName ==
  175. "ACTIVE_TYPE_PESTS_INVESTIGATION") {
  176. Get.to(EditActionDiseaseScreen(
  177. cropId: item.cropId,
  178. activityId: item.id,
  179. isEdit: true,
  180. ));
  181. } else if (item.activityTypeName == "ACTIVE_TYPE_USE_WATER") {
  182. Get.to(EditActionUseWaterScreen(
  183. cropId: item.cropId,
  184. activityId: item.id,
  185. isEdit: true,
  186. ));
  187. } else if (item.activityTypeName == "ACTIVE_TYPE_HARVEST") {
  188. Get.to(EditActionHarvestScreen(
  189. cropId: item.cropId,
  190. activityId: item.id,
  191. isEdit: true,
  192. ));
  193. } else if (item.activityTypeName == "ACTIVE_TYPE_PACKING") {
  194. Get.to(EditActionPackingScreen(
  195. cropId: item.cropId,
  196. activityId: item.id,
  197. isEdit: true,
  198. ));
  199. } else if (item.activityTypeName == "ACTIVE_TYPE_SELL") {
  200. Get.to(EditActionSellScreen(
  201. cropId: item.cropId,
  202. activityId: item.id,
  203. isEdit: true,
  204. ));
  205. } else if (item.activityTypeName == "ACTIVE_TYPE_END") {
  206. Get.to(EditActionEndScreen(
  207. cropId: item.cropId,
  208. activityId: item.id,
  209. isEdit: true,
  210. ));
  211. } else if (item.activityTypeName == "ACTIVE_TYPE_STATUS_GROW") {
  212. Get.to(EditActionPlantScreen(
  213. cropId: item.cropId,
  214. activityId: item.id,
  215. isEdit: true,
  216. ));
  217. } else if (item.activityTypeName == "ACTIVE_TYPE_MANURING") {
  218. Get.to(EditActionDungScreen(
  219. cropId: item.cropId,
  220. activityId: item.id,
  221. isEdit: true,
  222. ));
  223. } else if (item.activityTypeName == "ACTIVE_TYPE_SPRAY") {
  224. Get.to(EditActionSprayingScreen(
  225. cropId: item.cropId,
  226. activityId: item.id,
  227. isEdit: true,
  228. ));
  229. } else if (item.activityTypeName == "ACTIVE_TYPE_PROCESS") {
  230. Get.to(EditActionHarvestProcessScreen(
  231. cropId: item.cropId,
  232. activityId: item.id,
  233. isEdit: true,
  234. ));
  235. } else {
  236. Get.to(EditActionOtherScreen(
  237. cropId: item.cropId,
  238. activityId: item.id,
  239. isEdit: true,
  240. ));
  241. }
  242. });
  243. }
  244. }
  245. class ActionType {
  246. Widget listScreen;
  247. String actionName;
  248. ActionType(String actionName, Widget listScreen) {
  249. this.actionName = actionName;
  250. this.listScreen = listScreen;
  251. }
  252. }