import 'package:electronic_assistant/base/base_page.dart'; import 'package:electronic_assistant/module/agenda/task_item_view.dart'; import 'package:electronic_assistant/resource/colors.gen.dart'; import 'package:electronic_assistant/resource/string.gen.dart'; import 'package:electronic_assistant/router/app_pages.dart'; import 'package:electronic_assistant/utils/expand.dart'; import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; import 'package:flutter_screenutil/flutter_screenutil.dart'; import 'package:flutter_smart_dialog/flutter_smart_dialog.dart'; import 'package:get/get.dart'; import 'package:pull_to_refresh/pull_to_refresh.dart'; import '../../data/bean/agenda.dart'; import '../../data/repositories/account_repository.dart'; import '../../popup/common_popup.dart'; import '../../popup/template_utils.dart'; import '../../resource/assets.gen.dart'; import '../chat/view.dart'; import 'controller.dart'; class AgendaPage extends BasePage { const AgendaPage({super.key}); @override Widget buildBody(BuildContext context) { return Stack( children: [ buildBgBox(), buildTopGradient(), Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ AppBar( systemOverlayStyle: SystemUiOverlayStyle.dark, backgroundColor: Colors.transparent, leading: IconButton( icon: SizedBox( width: 24.w, height: 24.w, child: Assets.images.iconBack.image()), // Custom icon onPressed: () { Get.back(); }, ), title: Text(StringName.taskTitle.tr, style: TextStyle( fontSize: 17.sp, fontWeight: FontWeight.bold, color: ColorName.primaryTextColor)), centerTitle: true, ), // Row( // children: [ // Expanded( // child: Padding( // padding: EdgeInsets.only(left: 12.w), // child: CupertinoSearchTextField( // enabled: false, // onTap: () { // Get.toNamed(RoutePath.taskSearch); // }, // placeholder: StringName.searchHint.tr, // prefixIcon: ImageIcon(Assets.images.iconSearch.provider(), // size: 20.w), // backgroundColor: Colors.white, // style: TextStyle( // fontSize: 14.w, color: ColorName.primaryTextColor), // placeholderStyle: TextStyle( // fontSize: 14.w, color: const Color(0xFFAFAFAF)), // ), // )), // GestureDetector( // onTap: () {}, // child: Column( // mainAxisAlignment: MainAxisAlignment.center, // children: [ // Container( // margin: EdgeInsets.symmetric(horizontal: 16.w), // width: 20.w, // height: 20.w, // child: Assets.images.iconSift.image()), // // Replace with your image asset // SizedBox(height: 2.h), // // Add some space between the image and text // Text( // StringName.agendaSift.tr, // style: TextStyle( // fontSize: 10.sp, color: ColorName.primaryTextColor), // ), // ], // ), // ) // ], // ), // SizedBox(height: 12.h), // Container( // margin: EdgeInsets.only(left: 12.w), // padding: EdgeInsets.symmetric(horizontal: 8.w, vertical: 4.h), // decoration: BoxDecoration( // color: const Color(0xFFE9E9E9), // borderRadius: BorderRadius.circular(8.w)), // child: IntrinsicWidth( // child: Row( // children: [ // Text(controller.filterTxt, // style: TextStyle( // fontSize: 13.sp, // color: ColorName.secondaryTextColor)), // SizedBox(width: 6.w), // Opacity( // opacity: 0.7, // child: ImageIcon( // Assets.images.iconTaskFilterClose.provider(), // size: 16.w)) // ], // ), // ), // ), SizedBox(width: 7.h), Expanded( child: SmartRefresher( footer: const ClassicFooter( noDataText: '', ), onLoading: controller.onLoadMoreDoneData, enablePullDown: false, enablePullUp: true, controller: controller.refreshController, child: CustomScrollView(slivers: [ SliverToBoxAdapter( child: Obx(() { return taskGroupItem( StringName.taskItemTodo.tr, controller.agendaTodoList.length, controller.todoIsExpanded.value, itemClick: () { controller.onClickTodoGroup(); }); }), ), Obx(() { return SliverList.builder( itemBuilder: _buildTodoItem, itemCount: controller.todoIsExpanded.value ? controller.agendaTodoList.length : 0); }), SliverToBoxAdapter( child: Obx(() { return taskGroupItem( StringName.taskItemDone.tr, controller.doneSize.value, controller.doneIsExpanded.value, itemClick: () { controller.onClickDoneGroup(); }); }), ), Obx(() { return SliverList.builder( itemBuilder: _buildDoneItem, itemCount: controller.doneIsExpanded.value ? controller.agendaDoneList.length : 0); }) ]), )) ], ) ], ); } Widget _buildTodoItem(BuildContext context, int index) { Agenda item = controller.agendaTodoList[index]; return Builder(builder: (context) { return GestureDetector( onLongPressStart: (details) { if (!accountRepository.isLogin.value) { return; } showCommonPopup(details.globalPosition, Alignment.bottomRight, _buildListUpdatePopupView(item, controller.agendaDetailPopupTag), tag: controller.agendaDetailPopupTag); }, child: taskItemView( item, onCheckClick: () { controller.agendaComplete(item, true); }, onThinkingClick: () { ChatPage.startByTalkId(item.talkId, agenda: item); }, ), ); }); } List _buildListUpdatePopupView(Agenda item, String tag) { return [ createNormalPopupItem(StringName.agendaDetailPopupCancel.tr, onItemClick: () { SmartDialog.dismiss(tag: tag); controller.onAgendaCancel(item); }), createPopupDivider(), createNormalPopupItem(StringName.agendaDetailPopupUpdate.tr, onItemClick: () { SmartDialog.dismiss(tag: tag); controller.onAgendaUpdate(item); }), ]; } Widget _buildDoneItem(BuildContext context, int index) { Agenda item = controller.agendaDoneList[index]; return taskItemView(item, onCheckClick: () { controller.agendaComplete(item, false); }, isShowAnalyse: false); } Container buildTopGradient() { return Container( width: 1.sw, height: 112.h, decoration: BoxDecoration( gradient: LinearGradient( colors: ['#E8EBFF'.toColor(), '#00E8EBFF'.toColor()], begin: Alignment.topCenter, end: Alignment.bottomCenter, stops: const [0.3, 1.0], ), ) // 其他子小部件 ); } DecoratedBox buildBgBox() { return DecoratedBox( decoration: BoxDecoration(color: '#F6F6F6'.toColor()), child: Container( height: double.infinity, )); } @override bool immersive() { return true; } Widget taskGroupItem(String groupName, int count, bool isExpanded, {VoidCallback? itemClick}) { return GestureDetector( onTap: itemClick, child: Container( color: Colors.transparent, padding: EdgeInsets.symmetric(vertical: 12.h, horizontal: 12.w), child: Row( crossAxisAlignment: CrossAxisAlignment.center, children: [ Text(groupName, style: TextStyle( fontSize: 14.sp, color: ColorName.secondaryTextColor)), //占位填充 const Spacer(), Row( children: [ Text('$count${StringName.taskItemDesc.tr}', style: TextStyle( fontSize: 12.sp, color: ColorName.secondaryTextColor)), SizedBox(width: 4.w), SizedBox( width: 16.w, height: 16.h, child: isExpanded ? Assets.images.iconTalkExpand.image() : Assets.images.iconTalkCollapse.image()) ], ) ], ), ), ); } }