view.dart 8.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243
  1. import 'package:electronic_assistant/base/base_page.dart';
  2. import 'package:electronic_assistant/resource/colors.gen.dart';
  3. import 'package:electronic_assistant/resource/string.gen.dart';
  4. import 'package:electronic_assistant/utils/expand.dart';
  5. import 'package:flutter/material.dart';
  6. import 'package:flutter_screenutil/flutter_screenutil.dart';
  7. import 'package:get/get.dart';
  8. import '../../../data/bean/agenda.dart';
  9. import '../../../data/bean/talks.dart';
  10. import '../../../resource/assets.gen.dart';
  11. import '../../../utils/common_style.dart';
  12. import '../common_view.dart';
  13. import 'controller.dart';
  14. class TodoView extends BasePage<TodoController> {
  15. final String? talkId;
  16. TodoView(this.talkId, {super.key}) {
  17. Get.lazyPut(() => TodoController(talkId), tag: talkId);
  18. }
  19. @override
  20. get controller => Get.find<TodoController>(tag: talkId);
  21. @override
  22. Widget buildBody(BuildContext context) {
  23. return Obx(() {
  24. return _buildTodoStatusView();
  25. });
  26. }
  27. @override
  28. bool immersive() {
  29. return true;
  30. }
  31. _buildAllTaskView() {
  32. return Padding(
  33. padding: EdgeInsets.only(top: 6.h, bottom: 16.h),
  34. child: Column(
  35. crossAxisAlignment: CrossAxisAlignment.start,
  36. children: [
  37. Text(StringName.talkTodoAll.tr,
  38. style: TextStyle(
  39. fontSize: 14.sp, color: ColorName.secondaryTextColor)),
  40. SizedBox(height: 12.h),
  41. _buildAddAgendaView(),
  42. buildAllTodoView(),
  43. ],
  44. ),
  45. );
  46. }
  47. Widget buildAllTodoView() {
  48. return Obx(() {
  49. return Column(
  50. children: controller.agendaAllList.map((agenda) {
  51. return Padding(
  52. padding: EdgeInsets.only(bottom: 8.h),
  53. child: controller.isEditModel
  54. ? getTodoItemView(
  55. agenda,
  56. (list) => getTalkAgendaEditModelList(list,
  57. removeCallback: (agenda) {
  58. controller.removeTalkAgenda(list, agenda);
  59. }))
  60. : getTodoItemView(
  61. agenda,
  62. (list) => getTalkAgendaSettingList(list, itemClick: (agenda) {
  63. controller.agendaTodo(agenda);
  64. })),
  65. );
  66. }).toList());
  67. });
  68. }
  69. Widget _buildMineTodoList() {
  70. return Builder(builder: (context) {
  71. return Theme(
  72. data: Theme.of(context).copyWith(
  73. splashFactory: NoSplash.splashFactory,
  74. ),
  75. child: Obx(() {
  76. return Visibility(
  77. visible: !controller.isEditModel,
  78. child: ExpansionTile(
  79. initiallyExpanded: true,
  80. onExpansionChanged: (value) {
  81. controller.mineAgendaIsExpanded.value = value;
  82. },
  83. shape: RoundedRectangleBorder(
  84. borderRadius: BorderRadius.circular(4.0),
  85. side: const BorderSide(color: Colors.transparent),
  86. ),
  87. collapsedShape: RoundedRectangleBorder(
  88. borderRadius: BorderRadius.circular(4.0),
  89. side: const BorderSide(color: Colors.transparent),
  90. ),
  91. minTileHeight: 46.h,
  92. showTrailingIcon: false,
  93. childrenPadding: EdgeInsets.zero,
  94. tilePadding: EdgeInsets.zero,
  95. title: Row(
  96. children: [
  97. Text(StringName.talkTabMyTask.tr,
  98. style: TextStyle(
  99. fontSize: 14.sp,
  100. color: ColorName.secondaryTextColor)),
  101. const Spacer(),
  102. Obx(() {
  103. return Row(
  104. children: [
  105. Text(
  106. '${controller.agendaMineList.length}${StringName.talkTodoItem.tr}',
  107. style: TextStyle(
  108. fontSize: 15.sp,
  109. color: ColorName.secondaryTextColor),
  110. ),
  111. SizedBox(width: 3.w),
  112. SizedBox(
  113. width: 16.w,
  114. height: 16.w,
  115. child: controller.mineAgendaIsExpanded.value
  116. ? Assets.images.iconTalkExpand.image()
  117. : Assets.images.iconTalkCollapse.image()),
  118. ],
  119. );
  120. }),
  121. SizedBox(width: 12.w),
  122. ],
  123. ),
  124. children: controller.agendaMineList.map((agenda) {
  125. return _buildMineItem(agenda);
  126. }).toList(),
  127. ),
  128. );
  129. }),
  130. );
  131. });
  132. }
  133. Widget _buildMineItem(Agenda agenda) {
  134. return Container(
  135. margin: EdgeInsets.only(bottom: 8.w),
  136. decoration: BoxDecoration(
  137. borderRadius: BorderRadius.circular(8.0),
  138. border: Border.all(
  139. color: '#F6F6F6'.toColor(),
  140. width: 2,
  141. ),
  142. ),
  143. padding: EdgeInsets.symmetric(vertical: 17.w, horizontal: 12.w),
  144. child: Row(
  145. children: [
  146. Expanded(
  147. child: Padding(
  148. padding: const EdgeInsets.only(right: 12).w,
  149. child: Text(agenda.content ?? '',
  150. maxLines: 1,
  151. overflow: TextOverflow.ellipsis,
  152. style: TextStyle(
  153. fontSize: 15.sp,
  154. fontWeight: FontWeight.bold,
  155. color: ColorName.primaryTextColor)),
  156. ),
  157. ),
  158. GestureDetector(
  159. onTap: () {
  160. controller.onClickThinking(agenda);
  161. },
  162. child: Container(
  163. decoration: getAIBtnDecoration(6.w),
  164. padding: const EdgeInsets.symmetric(horizontal: 9, vertical: 4).w,
  165. child: Text(
  166. StringName.homeTalkThinking.tr,
  167. style:
  168. TextStyle(fontSize: 13.sp, color: ColorName.colorPrimary),
  169. ),
  170. ),
  171. )
  172. ],
  173. ),
  174. );
  175. }
  176. Widget _buildTodoStatusView() {
  177. if (controller.talkBean.value?.status.value == TalkStatus.analysisFail) {
  178. return getTalkFailView();
  179. } else if (controller.talkBean.value?.status.value ==
  180. TalkStatus.analysing ||
  181. controller.talkBean.value?.status.value == TalkStatus.waitAnalysis ||
  182. controller.talkBean.value?.status.value == TalkStatus.notAnalysis) {
  183. return getTalkAnalyseView(
  184. controller.talkController.isUploading.value == true &&
  185. controller.talkController.talkBean.value?.status.value ==
  186. TalkStatus.notAnalysis
  187. ? StringName.talkUploadingFileTip.tr
  188. : controller
  189. .talkController.talkBean.value?.progressContent.value ??
  190. '',
  191. controller.talkController.isUploading.value == true &&
  192. controller.talkController.talkBean.value?.status.value ==
  193. TalkStatus.notAnalysis
  194. ? controller.talkController.uploadProgress.value
  195. : controller.talkController.talkBean.value?.progress.value
  196. ?.toDouble() ??
  197. 0.0);
  198. } else if (controller.talkBean.value?.status.value ==
  199. TalkStatus.analysisSuccess) {
  200. return _buildTodoContent();
  201. } else {
  202. return Container();
  203. }
  204. }
  205. Widget _buildTodoContent() {
  206. if (controller.agendaAllList.isEmpty && !controller.isEditModel) {
  207. return buildAgendaEmptyView(110.h);
  208. }
  209. return ListView(
  210. padding: EdgeInsets.only(left: 12.w, right: 12.w, bottom: 150.w),
  211. children: [_buildMineTodoList(), _buildAllTaskView()],
  212. );
  213. }
  214. Widget _buildAddAgendaView() {
  215. return Obx(() {
  216. if (controller.isEditModel) {
  217. return Container(
  218. margin: EdgeInsets.only(bottom: 8.h),
  219. child: Builder(builder: (context) {
  220. return getAddAgendaView(StringName.talkAddAgendaProject.tr,
  221. onClick: () {
  222. controller.showAddAgendaDialog(context);
  223. });
  224. }),
  225. );
  226. } else {
  227. return Container();
  228. }
  229. });
  230. }
  231. }