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.

266 lines
9.3KB

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