Skip to content
代码片段 群组 项目
提交 77dd7e6e 编辑于 作者: ling zhang's avatar ling zhang 提交者: Neil Wang
浏览文件

fix: #291 @ 删除不再弹起指派人列表

上级 42f2bb49
No related branches found
No related tags found
无相关合并请求
...@@ -27,6 +27,7 @@ class MarkdownInputBox extends StatefulWidget { ...@@ -27,6 +27,7 @@ class MarkdownInputBox extends StatefulWidget {
class _MarkdownInputBoxState extends State<MarkdownInputBox> with TickerProviderStateMixin { class _MarkdownInputBoxState extends State<MarkdownInputBox> with TickerProviderStateMixin {
int _selectedTabBarIndex = 0; int _selectedTabBarIndex = 0;
UploadedFileInfo? _uploadedFileInfo; UploadedFileInfo? _uploadedFileInfo;
int _lastSelectionOffset = 0;
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
...@@ -106,7 +107,7 @@ class _MarkdownInputBoxState extends State<MarkdownInputBox> with TickerProvider ...@@ -106,7 +107,7 @@ class _MarkdownInputBoxState extends State<MarkdownInputBox> with TickerProvider
onChanged: (text) async { onChanged: (text) async {
if (text == '') return; if (text == '') return;
var index = widget.controller.selection.base.offset; var index = widget.controller.selection.base.offset;
if (text[index - 1] == '@') { if (text[index - 1] == '@' && index >= _lastSelectionOffset) {
List<Member> result = await _openMemberSelector(); List<Member> result = await _openMemberSelector();
if (result.isNotEmpty) { if (result.isNotEmpty) {
var selectedUsername = '${result[0].username} '; var selectedUsername = '${result[0].username} ';
...@@ -118,6 +119,7 @@ class _MarkdownInputBoxState extends State<MarkdownInputBox> with TickerProvider ...@@ -118,6 +119,7 @@ class _MarkdownInputBoxState extends State<MarkdownInputBox> with TickerProvider
); );
} }
} }
_lastSelectionOffset = index;
setState(() {}); setState(() {});
}, },
style: textTheme.bodyMedium, style: textTheme.bodyMedium,
......
...@@ -29,7 +29,7 @@ class _IssueCreationViewState extends State<IssueCreationView> { ...@@ -29,7 +29,7 @@ class _IssueCreationViewState extends State<IssueCreationView> {
child: Column(crossAxisAlignment: CrossAxisAlignment.start, children: [ child: Column(crossAxisAlignment: CrossAxisAlignment.start, children: [
InputFieldWithTitle(title: 'Title (required)', placeHolder: 'Write a issue title', controller: widget.issueTitleController), InputFieldWithTitle(title: 'Title (required)', placeHolder: 'Write a issue title', controller: widget.issueTitleController),
_buildTitle("Description"), _buildTitle("Description"),
_buildDescriptionSelector(), _buildDescriptionTemplatesSelector(),
MarkdownInputBox(projectId: widget.projectId, controller: widget.issueDescriptionController), MarkdownInputBox(projectId: widget.projectId, controller: widget.issueDescriptionController),
// _buildTitle("Assignees"), // _buildTitle("Assignees"),
// _buildAssigneeSelector(), // _buildAssigneeSelector(),
...@@ -166,7 +166,7 @@ class _IssueCreationViewState extends State<IssueCreationView> { ...@@ -166,7 +166,7 @@ class _IssueCreationViewState extends State<IssueCreationView> {
return AvatarAndName(username: member.username, avatarUrl: member.avatarUrl); return AvatarAndName(username: member.username, avatarUrl: member.avatarUrl);
} }
Widget _buildDescriptionSelector() { Widget _buildDescriptionTemplatesSelector() {
var iconButton = IconButton( var iconButton = IconButton(
key: const Key("goto-description-selector"), key: const Key("goto-description-selector"),
onPressed: () async { onPressed: () async {
......
...@@ -5,8 +5,8 @@ import 'package:jihu_gitlab_app/core/widgets/avatar/avatar.dart'; ...@@ -5,8 +5,8 @@ import 'package:jihu_gitlab_app/core/widgets/avatar/avatar.dart';
import 'package:jihu_gitlab_app/core/widgets/avatar_and_name.dart'; import 'package:jihu_gitlab_app/core/widgets/avatar_and_name.dart';
import 'package:jihu_gitlab_app/core/widgets/common_app_bar.dart'; import 'package:jihu_gitlab_app/core/widgets/common_app_bar.dart';
import 'package:jihu_gitlab_app/core/widgets/loading_button.dart'; import 'package:jihu_gitlab_app/core/widgets/loading_button.dart';
import 'package:jihu_gitlab_app/core/widgets/toast.dart';
import 'package:jihu_gitlab_app/core/widgets/selector/selector.dart'; import 'package:jihu_gitlab_app/core/widgets/selector/selector.dart';
import 'package:jihu_gitlab_app/core/widgets/toast.dart';
import 'package:jihu_gitlab_app/domain/discussions.dart'; import 'package:jihu_gitlab_app/domain/discussions.dart';
import 'package:jihu_gitlab_app/domain/note.dart'; import 'package:jihu_gitlab_app/domain/note.dart';
import 'package:jihu_gitlab_app/modules/todo_list/todo_param.dart'; import 'package:jihu_gitlab_app/modules/todo_list/todo_param.dart';
...@@ -30,6 +30,7 @@ class _DiscussionsPageState extends State<DiscussionsPage> { ...@@ -30,6 +30,7 @@ class _DiscussionsPageState extends State<DiscussionsPage> {
FocusNode commentFocusNode = FocusNode(); FocusNode commentFocusNode = FocusNode();
final DiscussionsModel _model = DiscussionsModel(); final DiscussionsModel _model = DiscussionsModel();
String placeholder = "Write a comment ..."; String placeholder = "Write a comment ...";
int inputTextLength = 0;
@override @override
void initState() { void initState() {
...@@ -135,15 +136,16 @@ class _DiscussionsPageState extends State<DiscussionsPage> { ...@@ -135,15 +136,16 @@ class _DiscussionsPageState extends State<DiscussionsPage> {
decoration: const BoxDecoration(color: Color(0xF8F8FAFF), border: Border(top: BorderSide(width: 0.2, color: Color(0xFFCECECE)))), decoration: const BoxDecoration(color: Color(0xF8F8FAFF), border: Border(top: BorderSide(width: 0.2, color: Color(0xFFCECECE)))),
child: Row(children: [ child: Row(children: [
Flexible(child: _buildInputView()), Flexible(child: _buildInputView()),
TextButton( IconButton(
onPressed: () async { icon: const Icon(Icons.alternate_email),
List<Member> result = await _openMemberSelector(); onPressed: () async {
if (result.isNotEmpty) { List<Member> result = await _openMemberSelector();
var selectedUsername = result[0].username; if (result.isNotEmpty) {
_commentController.text = "${_commentController.text}@$selectedUsername "; var selectedUsername = result[0].username;
} _commentController.text = "${_commentController.text}@$selectedUsername ";
}, }
child: const Text("@", style: TextStyle(color: Color(0xFF66696D), fontSize: 20, fontWeight: FontWeight.bold))), },
),
_buildAddCommentButton() _buildAddCommentButton()
]), ]),
), ),
...@@ -161,7 +163,7 @@ class _DiscussionsPageState extends State<DiscussionsPage> { ...@@ -161,7 +163,7 @@ class _DiscussionsPageState extends State<DiscussionsPage> {
controller: _commentController, controller: _commentController,
focusNode: commentFocusNode, focusNode: commentFocusNode,
onChanged: (text) async { onChanged: (text) async {
if (text.endsWith("@")) { if (text.endsWith("@") && text.length > inputTextLength) {
List<Member> result = await _openMemberSelector(); List<Member> result = await _openMemberSelector();
if (result.isNotEmpty) { if (result.isNotEmpty) {
var selectedUsername = result[0].username; var selectedUsername = result[0].username;
...@@ -171,6 +173,7 @@ class _DiscussionsPageState extends State<DiscussionsPage> { ...@@ -171,6 +173,7 @@ class _DiscussionsPageState extends State<DiscussionsPage> {
setState(() { setState(() {
_model.submittable = text.isNotEmpty; _model.submittable = text.isNotEmpty;
}); });
inputTextLength = text.length;
}, },
cursorColor: const Color(0xFFFC6D26), cursorColor: const Color(0xFFFC6D26),
decoration: InputDecoration(hintText: placeholder, border: InputBorder.none, hintStyle: const TextStyle(fontSize: 12, fontWeight: FontWeight.w400)), decoration: InputDecoration(hintText: placeholder, border: InputBorder.none, hintStyle: const TextStyle(fontSize: 12, fontWeight: FontWeight.w400)),
......
...@@ -78,10 +78,45 @@ void main() { ...@@ -78,10 +78,45 @@ void main() {
)); ));
await tester.pumpAndSettle(); await tester.pumpAndSettle();
await tester.tap(find.widgetWithText(TextButton, '@')); await tester.tap(find.byIcon(Icons.alternate_email));
await tester.pumpAndSettle(); await tester.pumpAndSettle();
expect(find.byKey(const Key('member-selector')), findsOneWidget); expect(find.byKey(const Key('member-selector')), findsOneWidget);
}); });
testWidgets('Should be able display the member selector when enter the @ symbol', (WidgetTester tester) async {
TokenProvider().reset(Tester.token());
UserProvider().reset(Tester.user());
when(client.get<List<dynamic>>("/api/v4/projects/72936/issues/265567/discussions")).thenAnswer((_) => Future(() => Response.of<List<dynamic>>(discussionsData)));
when(client.get<Map<String, dynamic>>("/api/v4/projects/72936/issues/265567")).thenAnswer((_) => Future(() => Response.of<Map<String, dynamic>>(issueData)));
when(client.get<Map<String, dynamic>>("/api/v4/projects/72936")).thenAnswer((_) => Future(() => Response.of<Map<String, dynamic>>(projectData)));
when(client.get<List<dynamic>>("/api/v4/projects/72936/members/all?page=1&per_page=50")).thenAnswer((_) async => Future.value(Response.of(members)));
HttpClient.setInstance(client);
await tester.pumpWidget(MaterialApp(
home: Scaffold(
body: DiscussionsPage(param: TodoParam(72936, 6, 265567, "ultimate-plan/jihu-gitlab-app/demo-mr-test")),
),
));
await tester.pumpAndSettle();
expect(find.byType(TextField), findsOneWidget);
await tester.enterText(find.byType(TextField), "@");
// await tester.tap(find.byIcon(Icons.alternate_email));
await tester.pumpAndSettle();
expect(find.byKey(const Key('member-selector')), findsOneWidget);
expect(find.byType(BackButton), findsOneWidget);
await tester.tap(find.byType(BackButton));
await tester.pumpAndSettle();
// await tester.enterText(find.byType(TextField), "a");
var finder = find.byType(TextField);
var textField = finder.evaluate().single.widget as TextField;
expect(textField.controller?.text, "@");
textField.controller?.text = "@a";
textField.controller?.text = "@";
expect(find.byKey(const Key('member-selector')), findsNothing);
});
} }
List<dynamic> discussionsData = [ List<dynamic> discussionsData = [
......
0% 加载中 .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册