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.

140 lines
4.9KB

  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/loading_list_page.dart';
  10. import 'cubit/task_detail_cubit.dart';
  11. import 'package:farm_tpf/utils/formatter.dart';
  12. class TaskDetailPage extends StatefulWidget {
  13. final int taskId;
  14. const TaskDetailPage({super.key, required this.taskId});
  15. @override
  16. State<TaskDetailPage> createState() => _TaskDetailPageState();
  17. }
  18. class _TaskDetailPageState extends State<TaskDetailPage> {
  19. var bloc = TaskDetailCubit();
  20. @override
  21. void initState() {
  22. super.initState();
  23. bloc.preparedData(widget.taskId);
  24. }
  25. @override
  26. Widget build(BuildContext context) {
  27. return Scaffold(
  28. appBar: AppBarWidget(),
  29. body: Padding(
  30. padding: const EdgeInsets.all(8.0),
  31. child: Column(
  32. children: [
  33. Expanded(
  34. child: BlocBuilder<TaskDetailCubit, TaskDetailState>(
  35. bloc: bloc,
  36. builder: (context, state) {
  37. if (state is TaskDetailLoading) {
  38. return Center(
  39. child: LoadingListPage(),
  40. );
  41. } else if (state is TaskDetailFailure) {
  42. return Center(child: Text(state.errorMessage));
  43. } else if (state is TaskDetailSuccessful) {
  44. return SingleChildScrollView(
  45. child: Column(
  46. crossAxisAlignment: CrossAxisAlignment.start,
  47. children: [
  48. _itemTaskDetail(
  49. title: '',
  50. detail: state.task.title ?? '',
  51. titleStyle: StylesText.body1,
  52. detailStyle: StylesText.body1.copyWith(
  53. color: Colors.blue,
  54. ),
  55. ),
  56. _itemTaskDetail(title: 'Hạn chót : ', detail: state.task.dueDate?.format_DDMMYY().toString() ?? ''),
  57. (state.task.isCompleted ?? false)
  58. ? _itemTaskDetail(title: 'Thời gian hoàn thành : ', detail: state.task.executeDate?.format_DDMMYY().toString() ?? '')
  59. : const SizedBox.shrink(),
  60. Padding(
  61. padding: const EdgeInsets.symmetric(vertical: 4, horizontal: 8),
  62. child: Text(
  63. 'Mô tả công việc :',
  64. style: StylesText.body2,
  65. ),
  66. ),
  67. Padding(
  68. padding: const EdgeInsets.symmetric(vertical: 4, horizontal: 8),
  69. child: Text(
  70. state.task.description ?? '',
  71. style: StylesText.body3,
  72. ),
  73. ),
  74. Padding(
  75. padding: const EdgeInsets.symmetric(vertical: 4, horizontal: 8),
  76. child: CheckboxWidget(
  77. title: 'Hoàn thành',
  78. style: StylesText.body2,
  79. isChecked: state.task.isCompleted ?? false,
  80. onChange: (status) {
  81. bloc.updateStatusTask(
  82. RequestTaskUpdate(
  83. id: widget.taskId,
  84. completed: status,
  85. ),
  86. );
  87. },
  88. ),
  89. ),
  90. const SizedBox(
  91. height: 8,
  92. ),
  93. ],
  94. ),
  95. );
  96. }
  97. return const SizedBox.shrink();
  98. },
  99. )),
  100. const SizedBox(
  101. height: 8,
  102. ),
  103. ],
  104. ),
  105. ),
  106. );
  107. }
  108. Widget _itemTaskDetail({
  109. required String title,
  110. required String detail,
  111. TextStyle? titleStyle,
  112. TextStyle? detailStyle,
  113. }) {
  114. return Padding(
  115. padding: const EdgeInsets.symmetric(vertical: 4, horizontal: 8),
  116. child: Row(
  117. crossAxisAlignment: CrossAxisAlignment.start,
  118. children: [
  119. Text(
  120. title,
  121. style: titleStyle ?? StylesText.body2,
  122. ),
  123. Expanded(
  124. child: Text(
  125. '$detail',
  126. style: detailStyle ?? StylesText.body3,
  127. ),
  128. )
  129. ],
  130. ),
  131. );
  132. }
  133. }