view.dart 11 KB

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