view.dart 10 KB

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