|
|
@ -1,7 +1,6 @@ |
|
|
import 'package:common_utils/common_utils.dart'; |
|
|
import 'package:common_utils/common_utils.dart'; |
|
|
import 'package:fleather/fleather.dart'; |
|
|
import 'package:fleather/fleather.dart'; |
|
|
import 'package:flutter/material.dart'; |
|
|
import 'package:flutter/material.dart'; |
|
|
import 'package:flutter_markdown/flutter_markdown.dart'; |
|
|
|
|
|
import 'package:flutter_screenutil/flutter_screenutil.dart'; |
|
|
import 'package:flutter_screenutil/flutter_screenutil.dart'; |
|
|
import 'package:get/get.dart'; |
|
|
import 'package:get/get.dart'; |
|
|
import 'package:parchment/codecs.dart'; |
|
|
import 'package:parchment/codecs.dart'; |
|
|
@ -32,9 +31,25 @@ class _SummaryTabState extends State<SummaryTab> { |
|
|
final GlobalKey<EditorState> _editorKey = GlobalKey(); |
|
|
final GlobalKey<EditorState> _editorKey = GlobalKey(); |
|
|
FleatherController? _fleatherController; |
|
|
FleatherController? _fleatherController; |
|
|
|
|
|
|
|
|
|
|
|
bool _hasFocus = false; |
|
|
|
|
|
|
|
|
@override |
|
|
@override |
|
|
void initState() { |
|
|
void initState() { |
|
|
super.initState(); |
|
|
super.initState(); |
|
|
|
|
|
_initController(); |
|
|
|
|
|
_addressController.addListener(_handleAddressChanged); |
|
|
|
|
|
_personnelController.addListener(_handlePersonnelChanged); |
|
|
|
|
|
_focusNode.addListener(() { |
|
|
|
|
|
setState(() { |
|
|
|
|
|
_hasFocus = _focusNode.hasFocus; |
|
|
|
|
|
}); |
|
|
|
|
|
}); |
|
|
|
|
|
ever(_controller.personnelNumberModifications, (value) { |
|
|
|
|
|
_initController(); |
|
|
|
|
|
}); |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
void _initController() { |
|
|
_addressController.text = _addressPrefix + |
|
|
_addressController.text = _addressPrefix + |
|
|
(_controller.meetingDetails.value.address.isNotEmpty |
|
|
(_controller.meetingDetails.value.address.isNotEmpty |
|
|
? _controller.meetingDetails.value.address |
|
|
? _controller.meetingDetails.value.address |
|
|
@ -43,9 +58,9 @@ class _SummaryTabState extends State<SummaryTab> { |
|
|
(_controller.meetingDetails.value.personnel.isNotEmpty |
|
|
(_controller.meetingDetails.value.personnel.isNotEmpty |
|
|
? _controller.meetingDetails.value.personnel |
|
|
? _controller.meetingDetails.value.personnel |
|
|
: '[输入与会人员]'); |
|
|
: '[输入与会人员]'); |
|
|
_addressController.addListener(_handleAddressChanged); |
|
|
final markdown = const ParchmentMarkdownCodec() |
|
|
_personnelController.addListener(_handlePersonnelChanged); |
|
|
.decode(_controller.meetingDetails.value.summary); |
|
|
_initController(); |
|
|
_fleatherController = FleatherController(document: markdown); |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
void _handleAddressChanged() { |
|
|
void _handleAddressChanged() { |
|
|
@ -108,14 +123,24 @@ class _SummaryTabState extends State<SummaryTab> { |
|
|
} |
|
|
} |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
Future<void> _initController() async { |
|
|
void _saveSummary() async { |
|
|
final markdown = const ParchmentMarkdownCodec() |
|
|
final markdown = |
|
|
.decode(_controller.meetingDetails.value.summary); |
|
|
const ParchmentMarkdownCodec().encode(_fleatherController!.document); |
|
|
_fleatherController = FleatherController(document: markdown); |
|
|
if (markdown != _controller.meetingDetails.value.summary) { |
|
|
|
|
|
SqfliteApi.editMeeting( |
|
|
|
|
|
_controller.id, |
|
|
|
|
|
{'summary': markdown}, |
|
|
|
|
|
); |
|
|
|
|
|
_controller.meetingDetails.value.summary = markdown; |
|
|
|
|
|
_controller.summaryNumberModifications.value++; |
|
|
|
|
|
} |
|
|
|
|
|
_focusNode.dispose(); |
|
|
|
|
|
_fleatherController?.dispose(); |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
@override |
|
|
@override |
|
|
void dispose() { |
|
|
void dispose() { |
|
|
|
|
|
_saveSummary(); |
|
|
_addressController.dispose(); |
|
|
_addressController.dispose(); |
|
|
_personnelController.dispose(); |
|
|
_personnelController.dispose(); |
|
|
super.dispose(); |
|
|
super.dispose(); |
|
|
@ -292,67 +317,51 @@ class _SummaryTabState extends State<SummaryTab> { |
|
|
), |
|
|
), |
|
|
Padding( |
|
|
Padding( |
|
|
padding: EdgeInsets.only(top: 10.w), |
|
|
padding: EdgeInsets.only(top: 10.w), |
|
|
child: MarkdownBody( |
|
|
child: FleatherEditor( |
|
|
data: _controller.meetingDetails.value.summary, |
|
|
controller: _fleatherController!, |
|
|
|
|
|
focusNode: _focusNode, |
|
|
|
|
|
editorKey: _editorKey, |
|
|
), |
|
|
), |
|
|
), |
|
|
), |
|
|
], |
|
|
], |
|
|
), |
|
|
), |
|
|
), |
|
|
), |
|
|
), |
|
|
), |
|
|
Obx( |
|
|
if (!_hasFocus) |
|
|
() => Positioned( |
|
|
Obx( |
|
|
bottom: 20.w, |
|
|
() => Positioned( |
|
|
left: 0, |
|
|
bottom: 20.w, |
|
|
right: 0, |
|
|
left: 0, |
|
|
child: Row( |
|
|
right: 0, |
|
|
mainAxisAlignment: MainAxisAlignment.center, |
|
|
child: Row( |
|
|
children: [ |
|
|
mainAxisAlignment: MainAxisAlignment.center, |
|
|
if (_controller.meetingDetails.value.tasktype >= 3) |
|
|
children: [ |
|
|
_button( |
|
|
if (_controller.meetingDetails.value.tasktype >= 3) |
|
|
Icons.supervisor_account, |
|
|
_button( |
|
|
'编辑发言者', |
|
|
Icons.supervisor_account, |
|
|
() { |
|
|
'编辑发言者', |
|
|
Get.bottomSheet( |
|
|
() { |
|
|
const SpeakerAllBottomSheet(), |
|
|
Get.bottomSheet( |
|
|
isScrollControlled: true, |
|
|
const SpeakerAllBottomSheet(), |
|
|
backgroundColor: Colors.grey[100], |
|
|
isScrollControlled: true, |
|
|
shape: RoundedRectangleBorder( |
|
|
backgroundColor: Colors.grey[100], |
|
|
borderRadius: BorderRadius.vertical( |
|
|
shape: RoundedRectangleBorder( |
|
|
top: Radius.circular(12.r), |
|
|
borderRadius: BorderRadius.vertical( |
|
|
), |
|
|
top: Radius.circular(12.r), |
|
|
), |
|
|
), |
|
|
); |
|
|
|
|
|
}, |
|
|
|
|
|
), |
|
|
|
|
|
if (_controller.meetingDetails.value.tasktype >= 3) |
|
|
|
|
|
_button( |
|
|
|
|
|
Icons.auto_awesome, |
|
|
|
|
|
'Ask AI', |
|
|
|
|
|
() { |
|
|
|
|
|
Get.bottomSheet( |
|
|
|
|
|
const AIBottomSheet(), |
|
|
|
|
|
isScrollControlled: true, |
|
|
|
|
|
backgroundColor: Colors.white, |
|
|
|
|
|
shape: RoundedRectangleBorder( |
|
|
|
|
|
borderRadius: BorderRadius.vertical( |
|
|
|
|
|
top: Radius.circular(12.r), |
|
|
|
|
|
), |
|
|
), |
|
|
), |
|
|
); |
|
|
); |
|
|
}, |
|
|
}, |
|
|
), |
|
|
), |
|
|
if (_controller.meetingDetails.value.tasktype >= 3) |
|
|
if (_controller.meetingDetails.value.tasktype == 0) |
|
|
_button( |
|
|
SizedBox( |
|
|
|
|
|
width: 150.w, |
|
|
|
|
|
child: _button( |
|
|
|
|
|
Icons.auto_awesome, |
|
|
Icons.auto_awesome, |
|
|
'生成', |
|
|
'Ask AI', |
|
|
() { |
|
|
() { |
|
|
Get.bottomSheet( |
|
|
Get.bottomSheet( |
|
|
const GenerateBottomSheet(), |
|
|
const AIBottomSheet(), |
|
|
isScrollControlled: true, |
|
|
isScrollControlled: true, |
|
|
backgroundColor: Colors.grey[100], |
|
|
backgroundColor: Colors.white, |
|
|
shape: RoundedRectangleBorder( |
|
|
shape: RoundedRectangleBorder( |
|
|
borderRadius: BorderRadius.vertical( |
|
|
borderRadius: BorderRadius.vertical( |
|
|
top: Radius.circular(12.r), |
|
|
top: Radius.circular(12.r), |
|
|
@ -361,25 +370,45 @@ class _SummaryTabState extends State<SummaryTab> { |
|
|
); |
|
|
); |
|
|
}, |
|
|
}, |
|
|
), |
|
|
), |
|
|
), |
|
|
if (_controller.meetingDetails.value.tasktype == 0) |
|
|
], |
|
|
SizedBox( |
|
|
|
|
|
width: 150.w, |
|
|
|
|
|
child: _button( |
|
|
|
|
|
Icons.auto_awesome, |
|
|
|
|
|
'生成', |
|
|
|
|
|
() { |
|
|
|
|
|
Get.bottomSheet( |
|
|
|
|
|
const GenerateBottomSheet(), |
|
|
|
|
|
isScrollControlled: true, |
|
|
|
|
|
backgroundColor: Colors.grey[100], |
|
|
|
|
|
shape: RoundedRectangleBorder( |
|
|
|
|
|
borderRadius: BorderRadius.vertical( |
|
|
|
|
|
top: Radius.circular(12.r), |
|
|
|
|
|
), |
|
|
|
|
|
), |
|
|
|
|
|
); |
|
|
|
|
|
}, |
|
|
|
|
|
), |
|
|
|
|
|
), |
|
|
|
|
|
], |
|
|
|
|
|
), |
|
|
), |
|
|
), |
|
|
), |
|
|
), |
|
|
), |
|
|
if (_hasFocus) |
|
|
Positioned( |
|
|
Positioned( |
|
|
bottom: 0, |
|
|
bottom: 0, |
|
|
left: -12.w, |
|
|
left: -12.w, |
|
|
right: -12.w, |
|
|
right: -12.w, |
|
|
child: Container( |
|
|
child: Container( |
|
|
height: 40, |
|
|
height: 40, |
|
|
color: Colors.white, |
|
|
color: Colors.white, |
|
|
alignment: Alignment.center, |
|
|
alignment: Alignment.center, |
|
|
child: FleatherToolbar.basic( |
|
|
child: FleatherToolbar.basic( |
|
|
controller: _fleatherController!, |
|
|
controller: _fleatherController!, |
|
|
editorKey: _editorKey, |
|
|
editorKey: _editorKey, |
|
|
|
|
|
), |
|
|
), |
|
|
), |
|
|
), |
|
|
), |
|
|
), |
|
|
|
|
|
], |
|
|
], |
|
|
); |
|
|
); |
|
|
} |
|
|
} |
|
|
|