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.

180 lines
6.6KB

  1. import 'package:farm_tpf/presentation/custom_widgets/checkbox/checkbox_widget.dart';
  2. import 'package:farm_tpf/presentation/screens/task/models/task_update_request.dart';
  3. import 'package:flutter/material.dart';
  4. import 'package:flutter/src/widgets/framework.dart';
  5. import 'package:flutter/src/widgets/placeholder.dart';
  6. import 'package:flutter_bloc/flutter_bloc.dart';
  7. import '../../../themes/styles_text.dart';
  8. import '../../custom_widgets/app_bar_widget.dart';
  9. import '../../custom_widgets/button_widget.dart';
  10. import '../../custom_widgets/loading_list_page.dart';
  11. import '../../custom_widgets/textfield/text_field_normal.dart';
  12. import '../codes/widgets/item_column.dart';
  13. import 'cubit/task_detail_cubit.dart';
  14. import 'package:farm_tpf/utils/formatter.dart';
  15. class TaskDetailPage extends StatefulWidget {
  16. final int taskId;
  17. const TaskDetailPage({super.key, required this.taskId});
  18. @override
  19. State<TaskDetailPage> createState() => _TaskDetailPageState();
  20. }
  21. class _TaskDetailPageState extends State<TaskDetailPage> {
  22. var bloc = TaskDetailCubit();
  23. @override
  24. void initState() {
  25. super.initState();
  26. bloc.preparedData(widget.taskId);
  27. }
  28. @override
  29. void dispose() {
  30. bloc.dispose();
  31. super.dispose();
  32. }
  33. @override
  34. Widget build(BuildContext context) {
  35. return Scaffold(
  36. appBar: AppBarWidget(),
  37. body: Padding(
  38. padding: const EdgeInsets.all(8.0),
  39. child: Column(
  40. children: [
  41. Expanded(
  42. child: BlocBuilder<TaskDetailCubit, TaskDetailState>(
  43. bloc: bloc,
  44. builder: (context, state) {
  45. if (state is TaskDetailLoading) {
  46. return Center(
  47. child: LoadingListPage(),
  48. );
  49. } else if (state is TaskDetailFailure) {
  50. return Center(child: Text(state.errorMessage));
  51. } else if (state is TaskDetailSuccessful) {
  52. return SingleChildScrollView(
  53. child: Column(
  54. crossAxisAlignment: CrossAxisAlignment.start,
  55. children: [
  56. _itemTaskDetail(
  57. title: '',
  58. detail: state.task.title ?? '',
  59. titleStyle: StylesText.body1,
  60. detailStyle: StylesText.body1.copyWith(
  61. color: Colors.blue,
  62. ),
  63. ),
  64. _itemTaskDetail(title: 'Hạn chót : ', detail: state.task.dueDate?.format_DDMMYY().toString() ?? ''),
  65. (state.task.isCompleted ?? false)
  66. ? _itemTaskDetail(title: 'Thời gian hoàn thành : ', detail: state.task.executeDate?.format_DDMMYY().toString() ?? '')
  67. : const SizedBox.shrink(),
  68. Padding(
  69. padding: const EdgeInsets.symmetric(vertical: 4, horizontal: 8),
  70. child: Text(
  71. 'Mô tả công việc :',
  72. style: StylesText.body2,
  73. ),
  74. ),
  75. Padding(
  76. padding: const EdgeInsets.symmetric(vertical: 4, horizontal: 8),
  77. child: Text(
  78. state.task.description ?? '',
  79. style: StylesText.body3,
  80. ),
  81. ),
  82. ValueListenableBuilder<bool>(
  83. valueListenable: bloc.isCompleted,
  84. builder: (context, isCompleted, _) {
  85. return Padding(
  86. padding: const EdgeInsets.symmetric(vertical: 4, horizontal: 8),
  87. child: CheckboxWidget(
  88. title: 'Hoàn thành',
  89. style: StylesText.body2,
  90. isChecked: isCompleted,
  91. onChange: (status) {
  92. bloc.isCompleted.value = status;
  93. // bloc.updateStatusTask(
  94. // RequestTaskUpdate(
  95. // id: widget.taskId,
  96. // completed: status,
  97. // ),
  98. // );
  99. },
  100. ),
  101. );
  102. },
  103. ),
  104. const SizedBox(
  105. height: 8,
  106. ),
  107. ItemColumnWidget(
  108. title: 'Mô tả công việc',
  109. child: TextFieldNormal(
  110. controller: bloc.detailCtl,
  111. maxLines: 3,
  112. hint: 'Mô tả',
  113. ),
  114. ),
  115. ],
  116. ),
  117. );
  118. }
  119. return const SizedBox.shrink();
  120. },
  121. ),
  122. ),
  123. // const SizedBox(
  124. // height: 8,
  125. // ),
  126. Padding(
  127. padding: const EdgeInsets.all(8.0),
  128. child: ButtonWidget(
  129. title: 'Cập nhật hoàn thành',
  130. onPressed: () {
  131. bloc.updateStatusTask(
  132. RequestTaskUpdate(
  133. id: widget.taskId,
  134. completed: bloc.isCompleted.value,
  135. completedDetail: bloc.detailCtl.text,
  136. ),
  137. );
  138. },
  139. ),
  140. ),
  141. ],
  142. ),
  143. ),
  144. );
  145. }
  146. Widget _itemTaskDetail({
  147. required String title,
  148. required String detail,
  149. TextStyle? titleStyle,
  150. TextStyle? detailStyle,
  151. }) {
  152. return Padding(
  153. padding: const EdgeInsets.symmetric(vertical: 4, horizontal: 8),
  154. child: Row(
  155. crossAxisAlignment: CrossAxisAlignment.start,
  156. children: [
  157. Text(
  158. title,
  159. style: titleStyle ?? StylesText.body2,
  160. ),
  161. Expanded(
  162. child: Text(
  163. '$detail',
  164. style: detailStyle ?? StylesText.body3,
  165. ),
  166. )
  167. ],
  168. ),
  169. );
  170. }
  171. }