view.dart 10.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290
  1. import 'package:electronic_assistant/base/base_page.dart';
  2. import 'package:electronic_assistant/module/agenda/task_item_view.dart';
  3. import 'package:electronic_assistant/resource/colors.gen.dart';
  4. import 'package:electronic_assistant/resource/string.gen.dart';
  5. import 'package:electronic_assistant/utils/expand.dart';
  6. import 'package:flutter/cupertino.dart';
  7. import 'package:flutter/material.dart';
  8. import 'package:flutter/services.dart';
  9. import 'package:flutter_screenutil/flutter_screenutil.dart';
  10. import 'package:flutter_smart_dialog/flutter_smart_dialog.dart';
  11. import 'package:get/get.dart';
  12. import 'package:pull_to_refresh/pull_to_refresh.dart';
  13. import '../../data/bean/agenda.dart';
  14. import '../../data/repositories/account_repository.dart';
  15. import '../../popup/common_popup.dart';
  16. import '../../popup/template_utils.dart';
  17. import '../../resource/assets.gen.dart';
  18. import '../../router/app_pages.dart';
  19. import '../chat/view.dart';
  20. import 'controller.dart';
  21. class AgendaPage extends BasePage<AgendaController> {
  22. const AgendaPage({super.key});
  23. @override
  24. Widget buildBody(BuildContext context) {
  25. return Stack(
  26. children: [
  27. buildBgBox(),
  28. buildTopGradient(),
  29. Column(
  30. crossAxisAlignment: CrossAxisAlignment.start,
  31. children: [
  32. AppBar(
  33. systemOverlayStyle: SystemUiOverlayStyle.dark,
  34. backgroundColor: Colors.transparent,
  35. leading: IconButton(
  36. icon: SizedBox(
  37. width: 24.w,
  38. height: 24.w,
  39. child: Assets.images.iconBack.image()),
  40. // Custom icon
  41. onPressed: () {
  42. Get.back();
  43. },
  44. ),
  45. title: Text(StringName.taskTitle.tr,
  46. style: TextStyle(
  47. fontSize: 17.sp,
  48. fontWeight: FontWeight.bold,
  49. color: ColorName.primaryTextColor)),
  50. centerTitle: true,
  51. ),
  52. Row(
  53. children: [
  54. Expanded(
  55. child: Container(
  56. height: 36.h,
  57. margin: EdgeInsets.only(left: 12.w),
  58. decoration: BoxDecoration(
  59. color: ColorName.white,
  60. borderRadius: BorderRadius.circular(8.w)),
  61. padding: EdgeInsets.only(left: 12.w),
  62. child: Row(
  63. children: [
  64. Assets.images.iconSearch.image(width: 20.w, height: 20.w),
  65. SizedBox(width: 6.w),
  66. Text(
  67. StringName.searchHint.tr,
  68. style: TextStyle(
  69. fontSize: 14.sp,
  70. color: ColorName.tertiaryTextColor),
  71. )
  72. ],
  73. ),
  74. )),
  75. GestureDetector(
  76. onTap: () {},
  77. child: Column(
  78. mainAxisAlignment: MainAxisAlignment.center,
  79. children: [
  80. Container(
  81. margin: EdgeInsets.symmetric(horizontal: 16.w),
  82. width: 20.w,
  83. height: 20.w,
  84. child: Assets.images.iconSift.image()),
  85. // Replace with your image asset
  86. SizedBox(height: 2.h),
  87. // Add some space between the image and text
  88. Text(
  89. StringName.agendaSift.tr,
  90. style: TextStyle(
  91. fontSize: 10.sp, color: ColorName.primaryTextColor),
  92. ),
  93. ],
  94. ),
  95. )
  96. ],
  97. ),
  98. SizedBox(height: 12.h),
  99. Container(
  100. margin: EdgeInsets.only(left: 12.w),
  101. padding: EdgeInsets.symmetric(horizontal: 8.w, vertical: 4.h),
  102. decoration: BoxDecoration(
  103. color: const Color(0xFFE9E9E9),
  104. borderRadius: BorderRadius.circular(8.w)),
  105. child: IntrinsicWidth(
  106. child: Row(
  107. children: [
  108. Text(controller.filterTxt,
  109. style: TextStyle(
  110. fontSize: 13.sp,
  111. color: ColorName.secondaryTextColor)),
  112. SizedBox(width: 6.w),
  113. Opacity(
  114. opacity: 0.7,
  115. child: ImageIcon(
  116. Assets.images.iconTaskFilterClose.provider(),
  117. size: 16.w))
  118. ],
  119. ),
  120. ),
  121. ),
  122. SizedBox(width: 7.h),
  123. Expanded(
  124. child: SmartRefresher(
  125. onLoading: controller.onLoadMoreDoneData,
  126. enablePullDown: false,
  127. enablePullUp: true,
  128. controller: controller.refreshController,
  129. child: CustomScrollView(slivers: [
  130. SliverToBoxAdapter(
  131. child: Obx(() {
  132. return taskGroupItem(
  133. StringName.taskItemTodo.tr,
  134. controller.agendaTodoList.length,
  135. controller.todoIsExpanded.value, itemClick: () {
  136. controller.onClickTodoGroup();
  137. });
  138. }),
  139. ),
  140. Obx(() {
  141. return SliverList.builder(
  142. itemBuilder: _buildTodoItem,
  143. itemCount: controller.todoIsExpanded.value
  144. ? controller.agendaTodoList.length
  145. : 0);
  146. }),
  147. SliverToBoxAdapter(
  148. child: Obx(() {
  149. return taskGroupItem(
  150. StringName.taskItemDone.tr,
  151. controller.doneSize.value,
  152. controller.doneIsExpanded.value, itemClick: () {
  153. controller.onClickDoneGroup();
  154. });
  155. }),
  156. ),
  157. Obx(() {
  158. return SliverList.builder(
  159. itemBuilder: _buildDoneItem,
  160. itemCount: controller.doneIsExpanded.value
  161. ? controller.agendaDoneList.length
  162. : 0);
  163. })
  164. ]),
  165. ))
  166. ],
  167. )
  168. ],
  169. );
  170. }
  171. Widget _buildTodoItem(BuildContext context, int index) {
  172. Agenda item = controller.agendaTodoList[index];
  173. return Builder(builder: (context) {
  174. return GestureDetector(
  175. onLongPressStart: (details) {
  176. if (!accountRepository.isLogin.value) {
  177. return;
  178. }
  179. showCommonPopup(null, details.globalPosition, Alignment.bottomRight,
  180. _buildListUpdatePopupView(item, controller.agendaDetailPopupTag),
  181. tag: controller.agendaDetailPopupTag);
  182. },
  183. child: taskItemView(
  184. item,
  185. onCheckClick: () {
  186. controller.agendaComplete(item, true);
  187. },
  188. onThinkingClick: () {
  189. ChatPage.startByTalkId(
  190. item.isExample == true
  191. ? ChatFromType.fromTalkExample
  192. : ChatFromType.fromAnalysisBtn,
  193. item.talkId,
  194. agenda: item);
  195. },
  196. ),
  197. );
  198. });
  199. }
  200. List<Widget> _buildListUpdatePopupView(Agenda item, String tag) {
  201. return [
  202. createNormalPopupItem(StringName.agendaDetailPopupCancel.tr,
  203. onItemClick: () {
  204. SmartDialog.dismiss(tag: tag);
  205. controller.onAgendaCancel(item);
  206. }),
  207. createPopupDivider(),
  208. createNormalPopupItem(StringName.agendaDetailPopupUpdate.tr,
  209. onItemClick: () {
  210. SmartDialog.dismiss(tag: tag);
  211. controller.onAgendaUpdate(item);
  212. }),
  213. ];
  214. }
  215. Widget _buildDoneItem(BuildContext context, int index) {
  216. Agenda item = controller.agendaDoneList[index];
  217. return taskItemView(item, onCheckClick: () {
  218. controller.agendaComplete(item, false);
  219. }, isShowAnalyse: false);
  220. }
  221. Container buildTopGradient() {
  222. return Container(
  223. width: 1.sw,
  224. height: 112.h,
  225. decoration: BoxDecoration(
  226. gradient: LinearGradient(
  227. colors: ['#E8EBFF'.toColor(), '#00E8EBFF'.toColor()],
  228. begin: Alignment.topCenter,
  229. end: Alignment.bottomCenter,
  230. stops: const [0.3, 1.0],
  231. ),
  232. ) // 其他子小部件
  233. );
  234. }
  235. DecoratedBox buildBgBox() {
  236. return DecoratedBox(
  237. decoration: BoxDecoration(color: '#F6F6F6'.toColor()),
  238. child: Container(
  239. height: double.infinity,
  240. ));
  241. }
  242. @override
  243. bool immersive() {
  244. return true;
  245. }
  246. Widget taskGroupItem(String groupName, int count, bool isExpanded,
  247. {VoidCallback? itemClick}) {
  248. return GestureDetector(
  249. onTap: itemClick,
  250. child: Container(
  251. color: Colors.transparent,
  252. padding: EdgeInsets.symmetric(vertical: 12.h, horizontal: 12.w),
  253. child: Row(
  254. crossAxisAlignment: CrossAxisAlignment.center,
  255. children: [
  256. Text(groupName,
  257. style: TextStyle(
  258. fontSize: 14.sp, color: ColorName.secondaryTextColor)),
  259. //占位填充
  260. const Spacer(),
  261. Row(
  262. children: [
  263. Text('$count${StringName.taskItemDesc.tr}',
  264. style: TextStyle(
  265. fontSize: 12.sp, color: ColorName.secondaryTextColor)),
  266. SizedBox(width: 4.w),
  267. SizedBox(
  268. width: 16.w,
  269. height: 16.h,
  270. child: isExpanded
  271. ? Assets.images.iconTalkExpand.image()
  272. : Assets.images.iconTalkCollapse.image())
  273. ],
  274. )
  275. ],
  276. ),
  277. ),
  278. );
  279. }
  280. }