diff --git a/lib/modules/meeting/controllers/meeting_details_controller.dart b/lib/modules/meeting/controllers/meeting_details_controller.dart index 5e6500734..aaf4eb6f7 100644 --- a/lib/modules/meeting/controllers/meeting_details_controller.dart +++ b/lib/modules/meeting/controllers/meeting_details_controller.dart @@ -69,6 +69,10 @@ class MeetingDetailsController extends GetxController RxBool isDownload = false.obs; RxDouble downloadProgress = 0.0.obs; + List categoryTemplateList = []; + Map editTemplate = {}; + int deleteTemplateId = 0; + @override void onInit() { super.onInit(); diff --git a/lib/modules/meeting/views/bottomSheet/generate_bottom_sheet.dart b/lib/modules/meeting/views/bottomSheet/generate_bottom_sheet.dart index 05eceaf72..e929fdfcf 100644 --- a/lib/modules/meeting/views/bottomSheet/generate_bottom_sheet.dart +++ b/lib/modules/meeting/views/bottomSheet/generate_bottom_sheet.dart @@ -46,7 +46,6 @@ class _GenerateBottomSheetState extends State { 'auto_fix_high': Icons.auto_fix_high, }; - List _categoryTemplateList = []; List _originalTemplate = []; Map _templateData = {}; @@ -60,10 +59,13 @@ class _GenerateBottomSheetState extends State { } void _getTemplate() async { - _categoryTemplateList = await SqfliteApi.getMeetingCategoryTemplateList(); + _controller.categoryTemplateList = + await SqfliteApi.getMeetingCategoryTemplateList(); + _controller.editTemplate = {}; + _controller.deleteTemplateId = 0; _lastTemplateData = _storage.read("meeting_last_template_Data") ?? {}; _originalTemplate = _storage.read("meeting_template_list") ?? - _categoryTemplateList[0]['template']; + _controller.categoryTemplateList[0]['template']; if (_lastTemplateData.isNotEmpty) { _templateData = _lastTemplateData; } else { @@ -162,7 +164,6 @@ class _GenerateBottomSheetState extends State { () => TemplateView( _templateData, _lastTemplateData['id'] ?? 0, - _categoryTemplateList, ), preventDuplicates: false, ); @@ -182,6 +183,34 @@ class _GenerateBottomSheetState extends State { _templateList = list; }); } + if (_controller.editTemplate.isNotEmpty) { + Map? editMap = _templateList.firstWhere( + (element) => + element['id'] == _controller.editTemplate['id'], + orElse: () => null); + if (editMap != null) { + editMap['name'] = _controller.editTemplate['name']; + editMap['desc'] = _controller.editTemplate['desc']; + editMap['prompt'] = _controller.editTemplate['prompt']; + } + if (_controller.editTemplate['id'] == _templateData['id']) { + _templateData['name'] = _controller.editTemplate['name']; + _templateData['desc'] = _controller.editTemplate['desc']; + _templateData['prompt'] = + _controller.editTemplate['prompt']; + } + setState(() {}); + } + if (_controller.deleteTemplateId != 0) { + _templateList.removeWhere((element) => + element['id'] == _controller.deleteTemplateId); + if (_controller.deleteTemplateId == _templateData['id']) { + _templateData = _templateList[0]; + } + setState(() {}); + _storage.write("meeting_last_template_Data", {}); + _storage.write("meeting_template_list", _templateList); + } }, child: Row( children: [ diff --git a/lib/modules/meeting/views/template/template_all_view.dart b/lib/modules/meeting/views/template/template_all_view.dart index 7100e20b6..22c5285bf 100644 --- a/lib/modules/meeting/views/template/template_all_view.dart +++ b/lib/modules/meeting/views/template/template_all_view.dart @@ -3,6 +3,8 @@ import 'package:flutter_screenutil/flutter_screenutil.dart'; import 'package:get/get.dart'; import '../../../../data/services/db/sqflite_api.dart'; +import '../../controllers/meeting_details_controller.dart'; +import 'template_details_view.dart'; class TemplateAllView extends StatefulWidget { final String title; @@ -19,6 +21,8 @@ class TemplateAllView extends StatefulWidget { } class _TemplateAllViewState extends State { + final _controller = Get.find(); + final Map _icons = { 'auto_stories': Icons.auto_stories, 'auto_graph': Icons.auto_graph, @@ -47,7 +51,7 @@ class _TemplateAllViewState extends State { _getTemplate(); } - void _getTemplate() async { + Future _getTemplate() async { List list = await SqfliteApi.getMeetingTemplateList(widget.categoryid); List templateList = []; for (var element in list) { @@ -245,6 +249,39 @@ class _TemplateAllViewState extends State { ), ), ), + Positioned( + top: 0, + right: 0, + child: GestureDetector( + onTap: () async { + await Get.to(() => TemplateDetailsView(template, + isEdit: widget.title == '自定义')); + if (_controller.editTemplate.isNotEmpty) { + await _getTemplate(); + if (_controller.editTemplate['id'] == _templateData['id']) { + _templateData['name'] = _controller.editTemplate['name']; + _templateData['desc'] = _controller.editTemplate['desc']; + _templateData['prompt'] = + _controller.editTemplate['prompt']; + } + } + if (_controller.deleteTemplateId != 0) { + await _getTemplate(); + if (_controller.deleteTemplateId == _templateData['id']) { + _templateData = {}; + } + } + }, + child: Padding( + padding: EdgeInsets.all(10.w), + child: Icon( + Icons.fullscreen, + color: Colors.grey[600], + size: 26.w, + ), + ), + ), + ), if (widget.lastTemplateId == template['id']) Positioned( top: 0, diff --git a/lib/modules/meeting/views/template/template_details_view.dart b/lib/modules/meeting/views/template/template_details_view.dart index 4150e1c70..fc517e280 100644 --- a/lib/modules/meeting/views/template/template_details_view.dart +++ b/lib/modules/meeting/views/template/template_details_view.dart @@ -3,10 +3,31 @@ import 'package:flutter_markdown/flutter_markdown.dart'; import 'package:flutter_screenutil/flutter_screenutil.dart'; import 'package:get/get.dart'; -class TemplateDetailsView extends StatelessWidget { +import '../../../../data/services/db/sqflite_api.dart'; +import '../../../../data/services/network/api.dart'; +import '../../controllers/meeting_details_controller.dart'; +import 'template_edit_view.dart'; + +class TemplateDetailsView extends StatefulWidget { final Map data; + final bool isEdit; + + const TemplateDetailsView(this.data, {super.key, this.isEdit = false}); + + @override + State createState() => _TemplateDetailsViewState(); +} + +class _TemplateDetailsViewState extends State { + final _controller = Get.find(); + + Map _templateData = {}; - const TemplateDetailsView(this.data, {super.key}); + @override + void initState() { + super.initState(); + _templateData = widget.data; + } @override Widget build(BuildContext context) { @@ -55,7 +76,7 @@ class TemplateDetailsView extends StatelessWidget { Padding( padding: EdgeInsets.only(top: 20.w), child: Text( - data['name'], + _templateData['name'], style: TextStyle( fontSize: 20.sp, fontWeight: FontWeight.bold, @@ -75,7 +96,7 @@ class TemplateDetailsView extends StatelessWidget { Wrap( spacing: 5.w, children: List.generate( - data['tag'].length, + _templateData['tag'].length, (int idx) { return Container( padding: @@ -85,7 +106,7 @@ class TemplateDetailsView extends StatelessWidget { borderRadius: BorderRadius.circular(4.r), ), child: Text( - data['tag'][idx], + _templateData['tag'][idx], style: TextStyle( fontSize: 10.sp, color: Colors.grey[600], @@ -106,7 +127,7 @@ class TemplateDetailsView extends StatelessWidget { ), ), Text( - data['desc'], + _templateData['desc'], style: TextStyle( fontSize: 14.sp, color: Colors.grey[600], @@ -123,61 +144,130 @@ class TemplateDetailsView extends StatelessWidget { ), ), MarkdownBody( - data: data['prompt'], + data: _templateData['prompt'], ), ], ), ), - Padding( - padding: EdgeInsets.symmetric(horizontal: 12.w, vertical: 20.w), - child: Row( - children: [ - Expanded( - child: GestureDetector( - onTap: () {}, - child: Container( - height: 48.w, - alignment: Alignment.center, - decoration: BoxDecoration( - borderRadius: BorderRadius.circular(12.r), - border: Border.all( - color: Colors.black, + if (widget.isEdit) + Padding( + padding: EdgeInsets.symmetric(horizontal: 12.w, vertical: 20.w), + child: Row( + children: [ + Expanded( + child: GestureDetector( + onTap: () async { + var result = await Get.to( + () => TemplateEditView(data: _templateData)); + if (result != null) { + setState(() { + _templateData['name'] = result['name']; + _templateData['desc'] = result['desc']; + _templateData['prompt'] = result['prompt']; + }); + } + }, + child: Container( + height: 48.w, + alignment: Alignment.center, + decoration: BoxDecoration( + borderRadius: BorderRadius.circular(12.r), + border: Border.all( + color: Colors.black, + ), ), - ), - child: Text( - '修改', - style: TextStyle( - fontSize: 16.sp, - color: Colors.black, + child: Text( + '修改', + style: TextStyle( + fontSize: 16.sp, + color: Colors.black, + ), ), ), ), ), - ), - 15.horizontalSpace, - Expanded( - child: GestureDetector( - onTap: () {}, - child: Container( - height: 48.w, - alignment: Alignment.center, - decoration: BoxDecoration( - color: Colors.red, - borderRadius: BorderRadius.circular(12.r), - ), - child: Text( - '删除', - style: TextStyle( - fontSize: 16.sp, - color: Colors.white, + 15.horizontalSpace, + Expanded( + child: GestureDetector( + onTap: () { + Get.dialog( + AlertDialog( + backgroundColor: + isDarkMode ? Colors.grey[900] : Colors.white, + title: Text( + '删除模版', + style: TextStyle( + color: isDarkMode ? Colors.white : Colors.black87, + ), + ), + content: Text( + '确定要删除当前模版吗?', + style: TextStyle( + color: isDarkMode + ? Colors.grey[400] + : Colors.grey[600], + ), + ), + actions: [ + TextButton( + onPressed: () => Get.back(), + child: Text( + 'cancel'.tr, + style: TextStyle( + color: isDarkMode + ? Colors.grey[400] + : Colors.grey[600], + ), + ), + ), + TextButton( + onPressed: () async { + Get.back(); + var response = await Api.delEchomeetTemplates({ + 'ids': [_templateData['id']], + }); + if (response != null) { + await SqfliteApi.deleteMeetingTemplate( + _templateData['id']); + _controller.categoryTemplateList = + await SqfliteApi + .getMeetingCategoryTemplateList(); + _controller.deleteTemplateId = + _templateData['id']; + Get.back(); + } + }, + child: Text( + 'confirm'.tr, + style: const TextStyle( + color: Colors.red, + ), + ), + ), + ], + ), + ); + }, + child: Container( + height: 48.w, + alignment: Alignment.center, + decoration: BoxDecoration( + color: Colors.red, + borderRadius: BorderRadius.circular(12.r), + ), + child: Text( + '删除', + style: TextStyle( + fontSize: 16.sp, + color: Colors.white, + ), ), ), ), ), - ), - ], + ], + ), ), - ), ], ); } diff --git a/lib/modules/meeting/views/template/template_edit_view.dart b/lib/modules/meeting/views/template/template_edit_view.dart index 79426d117..6c69d3596 100644 --- a/lib/modules/meeting/views/template/template_edit_view.dart +++ b/lib/modules/meeting/views/template/template_edit_view.dart @@ -2,18 +2,25 @@ import 'package:flutter/material.dart'; import 'package:flutter_easyloading/flutter_easyloading.dart'; import 'package:flutter_screenutil/flutter_screenutil.dart'; import 'package:get/get.dart'; +import 'package:get_storage/get_storage.dart'; import '../../../../data/services/db/sqflite_api.dart'; import '../../../../data/services/network/api.dart'; +import '../../controllers/meeting_details_controller.dart'; class TemplateEditView extends StatefulWidget { - const TemplateEditView({super.key}); + final Map? data; + final int? categoryid; + + const TemplateEditView({super.key, this.data, this.categoryid}); @override State createState() => _TemplateEditViewState(); } class _TemplateEditViewState extends State { + final _controller = Get.find(); + final TextEditingController _nameController = TextEditingController(); final TextEditingController _descController = TextEditingController(); final TextEditingController _promptController = TextEditingController(); @@ -23,6 +30,11 @@ class _TemplateEditViewState extends State { @override void initState() { super.initState(); + if (widget.data != null) { + _nameController.text = widget.data?['name']; + _descController.text = widget.data?['desc']; + _promptController.text = widget.data?['prompt']; + } } @override @@ -61,7 +73,7 @@ class _TemplateEditViewState extends State { onPressed: () => Get.back(), ), title: Text( - '创建模版', + widget.data != null ? '编辑模版' : '创建模版', style: TextStyle( fontSize: 17.sp, fontWeight: FontWeight.w600, @@ -204,7 +216,7 @@ class _TemplateEditViewState extends State { void _submit() async { EasyLoading.show(); Map data = { - "template": { + "template": { 'ttype': '自定义', 'tags': '', 'icon': 'auto_fix_high', @@ -214,11 +226,71 @@ class _TemplateEditViewState extends State { 'template': _promptController.text, }, }; - var response = await Api.addEchomeetTemplates(data); - if (response != null) { - print('----$response--------'); - // await SqfliteApi.insertMeetingTemplate(data['template']); + if (widget.data != null) { + data['template']['id'] = widget.data?['id']; + var response = await Api.updateEchomeetTemplates(data); + if (response != null) { + await SqfliteApi.editMeetingTemplate(widget.data?['id'], { + 'name': _nameController.text, + 'desc': _descController.text, + 'prompt': _promptController.text, + }); + _controller.editTemplate = { + 'id': widget.data?['id'], + 'name': _nameController.text, + 'desc': _descController.text, + 'prompt': _promptController.text, + }; + final GetStorage storage = GetStorage(); + Map lastTemplateData = storage.read("meeting_last_template_Data") ?? {}; + List originalTemplate = storage.read("meeting_template_list") ?? []; + if (lastTemplateData.isNotEmpty && + lastTemplateData['id'] == widget.data?['id']) { + lastTemplateData['name'] = _nameController.text; + lastTemplateData['desc'] = _descController.text; + lastTemplateData['prompt'] = _promptController.text; + storage.write("meeting_last_template_Data", lastTemplateData); + } + if (originalTemplate.isNotEmpty) { + Map? originalMap = originalTemplate.firstWhere( + (element) => element['id'] == widget.data?['id'], + orElse: () => null); + if (originalMap != null) { + originalMap['name'] = _nameController.text; + originalMap['desc'] = _descController.text; + originalMap['prompt'] = _promptController.text; + storage.write("meeting_template_list", originalTemplate); + } + } + } + } else { + var response = await Api.addEchomeetTemplates(data); + if (response != null) { + await SqfliteApi.insertMeetingTemplate({ + "id": response['template']['id'], + 'categoryid': widget.categoryid, + 'name': _nameController.text, + 'icon': 'auto_fix_high', + 'tag': '', + 'desc': _descController.text, + 'outline': '您将扮演一名会议事件归纳专家,能准确抓住会议中事件的关键点,并每个事件只需一句话精简总结。', + 'prompt': _promptController.text, + }); + _controller.editTemplate = { + 'id': response['template']['id'], + 'name': _nameController.text, + 'desc': _descController.text, + 'prompt': _promptController.text, + }; + } } + _controller.categoryTemplateList = + await SqfliteApi.getMeetingCategoryTemplateList(); + Get.back(result: { + 'name': _nameController.text, + 'desc': _descController.text, + 'prompt': _promptController.text, + }); EasyLoading.dismiss(); } } diff --git a/lib/modules/meeting/views/template/template_view.dart b/lib/modules/meeting/views/template/template_view.dart index 2a476f7e5..84fd2fb2e 100644 --- a/lib/modules/meeting/views/template/template_view.dart +++ b/lib/modules/meeting/views/template/template_view.dart @@ -2,6 +2,7 @@ import 'package:flutter/material.dart'; import 'package:flutter_screenutil/flutter_screenutil.dart'; import 'package:get/get.dart'; +import '../../controllers/meeting_details_controller.dart'; import 'template_all_view.dart'; import 'template_details_view.dart'; import 'template_edit_view.dart'; @@ -9,16 +10,16 @@ import 'template_edit_view.dart'; class TemplateView extends StatefulWidget { final Map templateData; final int lastTemplateId; - final List categoryList; - const TemplateView(this.templateData, this.lastTemplateId, this.categoryList, - {super.key}); + const TemplateView(this.templateData, this.lastTemplateId, {super.key}); @override State createState() => _TemplateViewState(); } class _TemplateViewState extends State { + final _controller = Get.find(); + final Map _icons = { 'auto_stories': Icons.auto_stories, 'auto_graph': Icons.auto_graph, @@ -38,7 +39,7 @@ class _TemplateViewState extends State { 'auto_fix_high': Icons.auto_fix_high, }; - final List _categoryTemplateList = []; + List _categoryTemplateList = []; Map _templateData = {}; @override @@ -47,8 +48,9 @@ class _TemplateViewState extends State { _getTemplate(); } - void _getTemplate() async { - for (var element in widget.categoryList) { + void _getTemplate() { + _categoryTemplateList = []; + for (var element in _controller.categoryTemplateList) { List templateList = []; bool isAdd = false; if (element['id'] == widget.templateData['categoryid']) { @@ -71,7 +73,28 @@ class _TemplateViewState extends State { 'template': templateList, }); } - _templateData = widget.templateData; + setState(() { + _templateData = widget.templateData; + }); + } + + void _returnCallback() { + if (_controller.editTemplate.isNotEmpty) { + _getTemplate(); + if (_controller.editTemplate['id'] == _templateData['id']) { + _templateData['name'] = _controller.editTemplate['name']; + _templateData['desc'] = _controller.editTemplate['desc']; + _templateData['prompt'] = _controller.editTemplate['prompt']; + } + } + if (_controller.deleteTemplateId != 0) { + _getTemplate(); + if (_controller.deleteTemplateId == _templateData['id']) { + _templateData = {}; + } + _categoryTemplateList.last['template'].removeWhere( + (element) => element['id'] == _controller.deleteTemplateId); + } } @override @@ -127,13 +150,15 @@ class _TemplateViewState extends State { padding: EdgeInsets.symmetric(horizontal: 12.w, vertical: 20.w), child: GestureDetector( onTap: () { - Get.back(result: _templateData); + if (_templateData.isNotEmpty) { + Get.back(result: _templateData); + } }, child: Container( height: 48.w, alignment: Alignment.center, decoration: BoxDecoration( - color: Colors.black, + color: _templateData.isNotEmpty ? Colors.black : Colors.grey, borderRadius: BorderRadius.circular(12.r), ), child: Text( @@ -155,13 +180,14 @@ class _TemplateViewState extends State { crossAxisAlignment: CrossAxisAlignment.start, children: [ GestureDetector( - onTap: () { - Get.to(() => TemplateAllView( + onTap: () async { + await Get.to(() => TemplateAllView( data['name'], data['id'], _templateData, widget.lastTemplateId, )); + _returnCallback(); }, child: Padding( padding: EdgeInsets.symmetric(horizontal: 20.w, vertical: 10.w), @@ -189,7 +215,7 @@ class _TemplateViewState extends State { child: isLast && data['template'].length == 0 ? Padding( padding: EdgeInsets.symmetric(horizontal: 8.w), - child: _createTemplate(), + child: _createTemplate(data['id']), ) : ListView.builder( itemCount: data['template'].length, @@ -200,11 +226,11 @@ class _TemplateViewState extends State { return isLast && index == 0 ? Row( children: [ - _createTemplate(), - _template(template), + _createTemplate(data['id']), + _template(template, true), ], ) - : _template(template); + : _template(template, false); }, ), ), @@ -212,7 +238,7 @@ class _TemplateViewState extends State { ); } - Widget _template(Map template) { + Widget _template(Map template, bool isEdit) { return Container( width: 200.w, margin: EdgeInsets.symmetric(horizontal: 4.w), @@ -309,8 +335,10 @@ class _TemplateViewState extends State { top: 0, right: 0, child: GestureDetector( - onTap: () { - Get.to(() => TemplateDetailsView(template)); + onTap: () async { + await Get.to( + () => TemplateDetailsView(template, isEdit: isEdit)); + _returnCallback(); }, child: Padding( padding: EdgeInsets.all(10.w), @@ -371,10 +399,13 @@ class _TemplateViewState extends State { ); } - Widget _createTemplate() { + Widget _createTemplate(int categoryid) { return GestureDetector( - onTap: () { - Get.to(() => const TemplateEditView()); + onTap: () async { + await Get.to(() => TemplateEditView(categoryid: categoryid)); + if (_controller.editTemplate.isNotEmpty) { + _getTemplate(); + } }, child: Container( width: 200.w,