Bläddra i källkod

[new]增加待办编辑入口

zk 1 år sedan
förälder
incheckning
1202375956

BIN
assets/images/icon_talk_add_adenda.webp


BIN
assets/images/icon_talk_edit.webp


BIN
assets/images/icon_talk_edit_cancel.webp


BIN
assets/images/icon_talk_remove_agenda.webp


+ 1 - 0
assets/string/base/string.xml

@@ -104,4 +104,5 @@
     <string name="agenda_detail_edit_title">编辑待办</string>
     <string name="agenda_detail_popup_cancel">取消我的待办</string>
     <string name="agenda_detail_popup_update">编辑</string>
+    <string name="talk_add_agenda">补充待办</string>
 </resources>

+ 17 - 7
lib/module/agenda/controller.dart

@@ -18,7 +18,7 @@ class AgendaController extends BaseController {
   final doneIsExpanded = true.obs;
   final refreshController = RefreshController(initialRefresh: false);
 
-  RxList<Agenda> get agendaTodoList => agendaRepository.agendaList;
+  final RxList<Agenda> agendaTodoList = <Agenda>[].obs;
   final RxList<Agenda> agendaDoneList = <Agenda>[].obs;
 
   final int limit = 10;
@@ -26,14 +26,14 @@ class AgendaController extends BaseController {
   @override
   void onReady() {
     refreshTodoTaskList();
-    agendaPage(0, limit, isClearAll: true);
+    agendaDonePage(0, limit, isClearAll: true);
   }
 
   void onLoadMoreDoneData() {
-    agendaPage(agendaDoneList.length, limit);
+    agendaDonePage(agendaDoneList.length, limit);
   }
 
-  agendaPage(int offset, int limit, {bool? isClearAll}) {
+  agendaDonePage(int offset, int limit, {bool? isClearAll}) {
     agendaRepository
         .agendaPage(offset, limit, completeStatus: TaskStatus.DONE)
         .then((response) {
@@ -58,8 +58,16 @@ class AgendaController extends BaseController {
   }
 
   refreshTodoTaskList() {
-    agendaRepository.requestAgendaPagePaginate(0, 999,
-        completeStatus: TaskStatus.TODO, isClearAll: true);
+    agendaRepository
+        .agendaPage(0, 999, completeStatus: TaskStatus.TODO)
+        .then((response) {
+      agendaTodoList.clear();
+      if (response.list != null) {
+        agendaTodoList.addAll(response.list!);
+      }
+    }).catchError((error) {
+      ErrorHandler.toastError(error);
+    });
   }
 
   void onClickTodoGroup() {
@@ -72,6 +80,7 @@ class AgendaController extends BaseController {
 
   void agendaComplete(Agenda item, bool isComplete) {
     agendaRepository.agendaFinish(item.id, isComplete).then((data) {
+      agendaRepository.requestHomeAgendaData();
       _refreshData();
     }).catchError((error) {
       ErrorHandler.toastError(error);
@@ -86,11 +95,12 @@ class AgendaController extends BaseController {
     } else {
       size = agendaDoneList.length;
     }
-    agendaPage(0, size, isClearAll: true);
+    agendaDonePage(0, size, isClearAll: true);
   }
 
   void onAgendaCancel(Agenda item) {
     agendaRepository.agendaTodo(item.id, false).then((value) {
+      agendaRepository.requestHomeAgendaData();
       _refreshData();
     }).catchError((error) {
       ErrorHandler.toastError(error);

+ 33 - 2
lib/module/talk/common_view.dart

@@ -70,7 +70,7 @@ Widget getTalkFailView() {
 
 typedef TodoItemBuilder = List<Widget> Function(List<Agenda>? list);
 
-Widget getTodoItemView(AgendaListAllBean agenda, TodoItemBuilder builder) {
+Widget getTodoItemView(AgendaListAllBean agenda, TodoItemBuilder todoBuilder) {
   return Container(
     decoration: BoxDecoration(
       color: ColorName.colorPrimary,
@@ -138,7 +138,7 @@ Widget getTodoItemView(AgendaListAllBean agenda, TodoItemBuilder builder) {
                 SizedBox(width: 12.w),
               ],
             ),
-            children: builder(agenda.list),
+            children: todoBuilder(agenda.list),
           ),
         ),
       );
@@ -214,6 +214,37 @@ List<Widget> getTalkAgendaSettingList(List<Agenda>? list,
       [];
 }
 
+List<Widget> getTalkAgendaEditModelList(List<Agenda>? list,
+    {void Function(Agenda agenda)? removeCallback}) {
+  return list?.map((agenda) {
+        return GestureDetector(
+          onTap: () {
+            removeCallback?.call(agenda);
+          },
+          child: Padding(
+            padding: EdgeInsets.only(
+                left: 12.w, right: 12.w, top: 2.h, bottom: 10.h),
+            child: Row(
+              crossAxisAlignment: CrossAxisAlignment.start,
+              children: [
+                SizedBox(
+                    width: 18.w,
+                    height: 18.w,
+                    child: Assets.images.iconTalkRemoveAgenda.image()),
+                SizedBox(width: 4.w),
+                Expanded(
+                  child: Text(agenda.content.orEmpty,
+                      style: TextStyle(
+                          fontSize: 14.sp, color: ColorName.primaryTextColor)),
+                ),
+              ],
+            ),
+          ),
+        );
+      }).toList() ??
+      [];
+}
+
 List<Widget> getTalkAgendaNormalList(List<Agenda>? list) {
   return list?.map((agenda) {
         return Padding(

+ 31 - 2
lib/module/talk/controller.dart

@@ -14,6 +14,7 @@ import 'package:electronic_assistant/utils/error_handler.dart';
 import 'package:electronic_assistant/utils/expand.dart';
 import 'package:electronic_assistant/utils/mmkv_util.dart';
 import 'package:flutter/cupertino.dart';
+import 'package:flutter/material.dart';
 import 'package:flutter_screenutil/flutter_screenutil.dart';
 import 'package:get/get.dart';
 import 'package:connectivity_plus/connectivity_plus.dart';
@@ -51,14 +52,24 @@ class TalkController extends BaseController {
 
   final audioDuration = Duration.zero.obs;
 
+  final agendaOriginalAllList = <AgendaListAllBean>[];
+
   final agendaAllList = <AgendaListAllBean>[].obs;
 
+  final _isEditModel = false.obs;
+
+  final tabIndex = 0.obs;
+
   final List<String> tabBeans = [
     StringName.talkTabSummary.tr,
     StringName.talkTabMyTask.tr,
     StringName.talkTabOriginal.tr
   ];
 
+  bool get isEditModel => _isEditModel.value;
+
+  RxBool get isEditModelRx => _isEditModel;
+
   final _audioPlayer = AudioPlayer();
 
   StreamSubscription? _talkBeanListener;
@@ -302,13 +313,16 @@ class TalkController extends BaseController {
     });
   }
 
-  void refreshAgendaAllData() {
+  void refreshAgendaAllData({bool isForceRefresh = false}) {
     String? id = talkBean.value?.id;
-    if (id == null || agendaAllList.isNotEmpty) {
+    if (id == null || (!isForceRefresh && agendaAllList.isNotEmpty)) {
       return;
     }
     agendaRepository.agendaListAll(id).then((agenda) {
+      agendaAllList.clear();
+      agendaOriginalAllList.clear();
       if (agenda.list != null) {
+        agendaOriginalAllList.addAll(agenda.list!);
         agendaAllList.value = agenda.list!;
       }
     });
@@ -333,6 +347,21 @@ class TalkController extends BaseController {
       isShowElectricLow.value = false;
     });
   }
+
+  void onEditModelClick() {
+    _isEditModel.value = true;
+  }
+
+  void updateTabIndex(int index) {
+    tabIndex.value = index;
+  }
+
+  void onEditCancel() {
+    _isEditModel.value = false;
+    agendaAllList.assignAll(agendaOriginalAllList);
+  }
+
+  void onEditDoneClick() {}
 }
 
 Future<File?> getFileByTalk(String? talkId, int? uploadType) async {

+ 11 - 1
lib/module/talk/summary/controller.dart

@@ -1,9 +1,10 @@
 import 'dart:async';
 
 import 'package:electronic_assistant/base/base_controller.dart';
+import 'package:electronic_assistant/data/bean/agenda.dart';
 import 'package:electronic_assistant/data/bean/talks.dart';
-import 'package:electronic_assistant/data/repositories/account_repository.dart';
 import 'package:electronic_assistant/data/repositories/talk_repository.dart';
+import 'package:flutter/cupertino.dart';
 import 'package:get/get.dart';
 import '../../../data/bean/agenda_list_all_bean.dart';
 import '../controller.dart';
@@ -17,6 +18,10 @@ class SummaryController extends BaseController {
 
   RxList<AgendaListAllBean> get agendaAllList => talkController.agendaAllList;
 
+  RxBool get _isEditModel => talkController.isEditModelRx;
+
+  bool get isEditModel => _isEditModel.value;
+
   @override
   void onReady() {
     super.onReady();
@@ -42,6 +47,11 @@ class SummaryController extends BaseController {
     talkController.refreshAgendaAllData();
   }
 
+  void removeTalkAgenda(List<Agenda>? list, Agenda agenda) {
+    list?.remove(agenda);
+    agendaAllList.refresh();
+  }
+
   @override
   void onClose() {
     super.onClose();

+ 44 - 5
lib/module/talk/summary/view.dart

@@ -1,4 +1,5 @@
 import 'package:electronic_assistant/base/base_page.dart';
+import 'package:electronic_assistant/resource/assets.gen.dart';
 import 'package:electronic_assistant/resource/colors.gen.dart';
 import 'package:electronic_assistant/resource/string.gen.dart';
 import 'package:electronic_assistant/utils/expand.dart';
@@ -73,23 +74,31 @@ class SummaryView extends BasePage<SummaryController> {
                   color: ColorName.primaryTextColor,
                   fontSize: 15.sp)),
           SizedBox(height: 12.h),
-          buildTodoView()
+          _buildAddTaskView(),
+          buildAllTaskList()
         ],
       ),
     );
   }
 
-  Widget buildTodoView() {
+  Widget buildAllTaskList() {
     return Obx(() {
       if (controller.agendaAllList.isEmpty) {
         return buildAgendaEmptyView(65.h);
       } else {
         return Column(
-            children: controller.agendaAllList.map((agenda) {
+            children: controller.agendaAllList.map((item) {
           return Padding(
               padding: EdgeInsets.only(bottom: 8.h),
-              child: getTodoItemView(
-                  agenda, (list) => getTalkAgendaNormalList(list)));
+              child: controller.isEditModel
+                  ? getTodoItemView(
+                      item,
+                      (list) => getTalkAgendaEditModelList(list,
+                              removeCallback: (agenda) {
+                            controller.removeTalkAgenda(list, agenda);
+                          }))
+                  : getTodoItemView(
+                      item, (list) => getTalkAgendaNormalList(list)));
         }).toList());
       }
     });
@@ -121,4 +130,34 @@ class SummaryView extends BasePage<SummaryController> {
       }
     });
   }
+
+  Widget _buildAddTaskView() {
+    return Obx(() {
+      return Visibility(
+        visible: controller.isEditModel,
+        child: Container(
+          decoration: BoxDecoration(
+              color: "#F6F5F8".toColor(),
+              border: Border.all(color: '#EAE5EF'.toColor(), width: 1),
+              borderRadius: BorderRadius.circular(8.w)),
+          margin: EdgeInsets.only(bottom: 8.h, top: 6.h),
+          padding: EdgeInsets.symmetric(horizontal: 14.w, vertical: 11.w),
+          child: Row(
+            children: [
+              SizedBox(
+                  width: 22.w,
+                  height: 22.w,
+                  child: Assets.images.iconTalkAddAdenda.image()),
+              SizedBox(width: 8.w),
+              Text(
+                StringName.talkAddAgenda.tr,
+                style: TextStyle(
+                    fontSize: 14.sp, color: ColorName.primaryTextColor),
+              )
+            ],
+          ),
+        ),
+      );
+    });
+  }
 }

+ 125 - 58
lib/module/talk/view.dart

@@ -23,71 +23,81 @@ class TalkPage extends BasePage<TalkController> {
 
   @override
   Widget buildBody(BuildContext context) {
-    return DefaultTabController(
-      length: controller.tabBeans.length,
-      child: Stack(
-        children: [
-          buildTopGradient(),
-          Scaffold(
-            backgroundColor: Colors.transparent,
-            appBar: AppBar(
-              systemOverlayStyle: SystemUiOverlayStyle.dark,
+    return WillPopScope(
+      onWillPop: () async {
+        if (controller.isEditModel) {
+          controller.onEditCancel();
+          return false;
+        }
+        return true;
+      },
+      child: DefaultTabController(
+        initialIndex: controller.tabIndex.value,
+        length: controller.tabBeans.length,
+        child: Stack(
+          children: [
+            buildTopGradient(),
+            Scaffold(
               backgroundColor: Colors.transparent,
-              leading: IconButton(
-                icon: SizedBox(
-                    width: 24.w,
-                    height: 24.w,
-                    child: Assets.images.iconBack.image()),
-                // Custom icon
-                onPressed: () {
-                  Get.back();
-                },
+              appBar: AppBar(
+                actions: [
+                  _buildEditBtnView(),
+                ],
+                systemOverlayStyle: SystemUiOverlayStyle.dark,
+                backgroundColor: Colors.transparent,
+                leading: _buildAppbarBackView(),
               ),
+              body: Builder(builder: (context) {
+                return Column(
+                  crossAxisAlignment: CrossAxisAlignment.start,
+                  children: [
+                    Padding(
+                      padding: EdgeInsets.symmetric(horizontal: 12.w),
+                      child: Obx(() {
+                        return Column(
+                          crossAxisAlignment: CrossAxisAlignment.start,
+                          children: [
+                            SizedBox(height: 8.h),
+                            Text(controller.talkBean.value?.title.value ?? '',
+                                style: TextStyle(
+                                    fontSize: 22.sp,
+                                    fontWeight: FontWeight.bold,
+                                    color: ColorName.primaryTextColor)),
+                            SizedBox(height: 4.h),
+                            Text(controller.talkBean.value?.createTime ?? '',
+                                style: TextStyle(
+                                    fontSize: 12.sp,
+                                    color: ColorName.secondaryTextColor)),
+                            SizedBox(height: 14.h),
+                          ],
+                        );
+                      }),
+                    ),
+                    buildTabBar(context),
+                    Divider(
+                        height: 1,
+                        color: const Color(0xFFf6f6f6),
+                        indent: 12.w,
+                        endIndent: 12.w),
+                    SizedBox(height: 8.h),
+                    buildTalkContentView()
+                  ],
+                );
+              }),
             ),
-            body: Column(
-              crossAxisAlignment: CrossAxisAlignment.start,
-              children: [
-                Padding(
-                  padding: EdgeInsets.symmetric(horizontal: 12.w),
-                  child: Obx(() {
-                    return Column(
-                      crossAxisAlignment: CrossAxisAlignment.start,
-                      children: [
-                        SizedBox(height: 8.h),
-                        Text(controller.talkBean.value?.title.value ?? '',
-                            style: TextStyle(
-                                fontSize: 22.sp,
-                                fontWeight: FontWeight.bold,
-                                color: ColorName.primaryTextColor)),
-                        SizedBox(height: 4.h),
-                        Text(controller.talkBean.value?.createTime ?? '',
-                            style: TextStyle(
-                                fontSize: 12.sp,
-                                color: ColorName.secondaryTextColor)),
-                        SizedBox(height: 14.h),
-                      ],
-                    );
-                  }),
-                ),
-                buildTabBar(),
-                Divider(
-                    height: 1,
-                    color: const Color(0xFFf6f6f6),
-                    indent: 12.w,
-                    endIndent: 12.w),
-                SizedBox(height: 8.h),
-                buildTalkContentView()
-              ],
-            ),
-          ),
-          buildBottomView(),
-          buildAIAnalysisView()
-        ],
+            buildBottomView(),
+            buildAIAnalysisView()
+          ],
+        ),
       ),
     );
   }
 
-  Container buildTabBar() {
+  Container buildTabBar(BuildContext context) {
+    TabController tabController = DefaultTabController.of(context);
+    tabController.addListener(() {
+      controller.updateTabIndex(tabController.index);
+    });
     return Container(
       decoration: const BoxDecoration(
           color: Colors.white,
@@ -353,6 +363,63 @@ class TalkPage extends BasePage<TalkController> {
       ),
     );
   }
+
+  Widget _buildAppbarBackView() {
+    return Obx(() {
+      return controller.isEditModel
+          ? IconButton(
+              icon: SizedBox(
+                  width: 24.w,
+                  height: 24.w,
+                  child: Assets.images.iconTalkEditCancel.image()),
+              // Custom icon
+              onPressed: () {
+                controller.onEditCancel();
+              },
+            )
+          : IconButton(
+              icon: SizedBox(
+                  width: 24.w,
+                  height: 24.w,
+                  child: Assets.images.iconBack.image()),
+              // Custom icon
+              onPressed: () {
+                Get.back();
+              },
+            );
+    });
+  }
+
+  Widget _buildEditBtnView() {
+    return Obx(() {
+      return Visibility(
+        visible: controller.talkBean.value?.status.value ==
+                TalkStatus.analysisSuccess &&
+            controller.tabIndex.value != 2,
+        child: controller.isEditModel
+            ? GestureDetector(
+                onTap: () {
+                  controller.onEditDoneClick();
+                },
+                child: Padding(
+                  padding: EdgeInsets.symmetric(horizontal: 12.w),
+                  child: Text(StringName.done.tr,
+                      style: TextStyle(
+                          fontSize: 17.sp, color: ColorName.primaryTextColor)),
+                ),
+              )
+            : IconButton(
+                icon: SizedBox(
+                    width: 24.w,
+                    height: 24.w,
+                    child: Assets.images.iconTalkEdit.image()),
+                onPressed: () {
+                  controller.onEditModelClick();
+                },
+              ),
+      );
+    });
+  }
 }
 
 class CustomTrackShape extends RoundedRectSliderTrackShape {

+ 0 - 3
lib/popup/talk_popup.dart

@@ -2,13 +2,10 @@ import 'dart:ui';
 
 import 'package:electronic_assistant/popup/template_utils.dart';
 import 'package:electronic_assistant/resource/string.gen.dart';
-import 'package:electronic_assistant/utils/expand.dart';
 import 'package:flutter/cupertino.dart';
 import 'package:flutter/material.dart';
-import 'package:flutter_screenutil/flutter_screenutil.dart';
 import 'package:flutter_smart_dialog/flutter_smart_dialog.dart';
 import 'package:get/get.dart';
-
 import 'common_popup.dart';
 
 void showTalkPopup(Offset offset, Alignment alignment,