Skip to content

Commit 63244e0

Browse files
authored
fix: paste issue with the nested image (#7857)
* chore: replace delete button style * chore: replace textfield in settings page * fix: icon text align issue in database * fix: member count is 0 * fix: invite member issue on mobile * fix: checklist item align issue on Windows * fix: integration test * fix: support converting paragraph to markdown * chore: update editor version * fix: delete command in simple table cell * feat: use new password error code
1 parent 64dff44 commit 63244e0

File tree

21 files changed

+146
-127
lines changed

21 files changed

+146
-127
lines changed

frontend/appflowy_flutter/integration_test/shared/settings.dart

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,6 @@ import 'package:appflowy/workspace/presentation/settings/settings_dialog.dart';
99
import 'package:appflowy/workspace/presentation/settings/widgets/settings_menu_element.dart';
1010
import 'package:appflowy/workspace/presentation/widgets/toggle/toggle.dart';
1111
import 'package:easy_localization/easy_localization.dart';
12-
import 'package:flowy_infra_ui/style_widget/text_field.dart';
1312
import 'package:flutter/material.dart';
1413
import 'package:flutter_test/flutter_test.dart';
1514

@@ -86,7 +85,7 @@ extension AppFlowySettings on WidgetTester {
8685

8786
final userNameFinder = find.descendant(
8887
of: find.byType(AccountUserProfile),
89-
matching: find.byType(FlowyTextField),
88+
matching: find.byType(TextField),
9089
);
9190
await enterText(userNameFinder, name);
9291
await pumpAndSettle();

frontend/appflowy_flutter/lib/mobile/presentation/home/shared/mobile_page_card.dart

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -200,7 +200,9 @@ class MobileViewPage extends StatelessWidget {
200200
const WidgetSpan(child: HSpace(8.0)),
201201
],
202202
TextSpan(
203-
text: name,
203+
text: name.orDefault(
204+
LocaleKeys.menuAppHeader_defaultNewPageName.tr(),
205+
),
204206
style: Theme.of(context).textTheme.bodyMedium!.copyWith(
205207
fontSize: 16.0,
206208
fontWeight: FontWeight.w600,

frontend/appflowy_flutter/lib/mobile/presentation/setting/workspace/invite_members_screen.dart

Lines changed: 26 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -108,31 +108,33 @@ class _InviteMemberPageState extends State<_InviteMemberPage> {
108108
child: BlocConsumer<WorkspaceMemberBloc, WorkspaceMemberState>(
109109
listener: _onListener,
110110
builder: (context, state) {
111-
return Column(
112-
children: [
113-
if (state.myRole.isOwner) ...[
114-
Container(
115-
width: double.infinity,
116-
padding: EdgeInsets.all(theme.spacing.xl),
117-
child: const MInviteMemberByLink(),
118-
),
119-
VSpace(theme.spacing.m),
111+
return SingleChildScrollView(
112+
child: Column(
113+
children: [
114+
if (state.myRole.isOwner) ...[
115+
Container(
116+
width: double.infinity,
117+
padding: EdgeInsets.all(theme.spacing.xl),
118+
child: const MInviteMemberByLink(),
119+
),
120+
VSpace(theme.spacing.m),
121+
],
122+
if (state.members.isNotEmpty) ...[
123+
const AFDivider(),
124+
VSpace(theme.spacing.xl),
125+
MobileMemberList(
126+
members: state.members,
127+
userProfile: userProfile,
128+
myRole: state.myRole,
129+
),
130+
],
131+
if (state.myRole.isMember) ...[
132+
Spacer(),
133+
const _LeaveWorkspaceButton(),
134+
],
135+
const VSpace(48),
120136
],
121-
if (state.members.isNotEmpty) ...[
122-
const AFDivider(),
123-
VSpace(theme.spacing.xl),
124-
MobileMemberList(
125-
members: state.members,
126-
userProfile: userProfile,
127-
myRole: state.myRole,
128-
),
129-
],
130-
if (state.myRole.isMember) ...[
131-
Spacer(),
132-
const _LeaveWorkspaceButton(),
133-
],
134-
const VSpace(48),
135-
],
137+
),
136138
);
137139
},
138140
),

frontend/appflowy_flutter/lib/mobile/presentation/setting/workspace/workspace_setting_group.dart

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
import 'package:appflowy/generated/locale_keys.g.dart';
22
import 'package:appflowy/mobile/presentation/setting/widgets/mobile_setting_trailing.dart';
33
import 'package:appflowy/workspace/application/user/user_workspace_bloc.dart';
4+
import 'package:collection/collection.dart';
45
import 'package:easy_localization/easy_localization.dart';
56
import 'package:flutter/material.dart';
67
import 'package:flutter_bloc/flutter_bloc.dart';
@@ -18,14 +19,22 @@ class WorkspaceSettingGroup extends StatelessWidget {
1819
Widget build(BuildContext context) {
1920
return BlocBuilder<UserWorkspaceBloc, UserWorkspaceState>(
2021
builder: (context, state) {
21-
final currentWorkspace = state.currentWorkspace;
22+
final currentWorkspace = state.workspaces.firstWhereOrNull(
23+
(e) => e.workspaceId == state.currentWorkspace?.workspaceId,
24+
);
25+
final memberCount = currentWorkspace?.memberCount;
26+
String memberCountText = '';
27+
// if the member count is greater than 0, show the member count
28+
if (memberCount != null && memberCount > 0) {
29+
memberCountText = memberCount.toString();
30+
}
2231
return MobileSettingGroup(
2332
groupTitle: LocaleKeys.settings_appearance_members_label.tr(),
2433
settingItemList: [
2534
MobileSettingItem(
2635
name: LocaleKeys.settings_appearance_members_label.tr(),
2736
trailing: MobileSettingTrailing(
28-
text: currentWorkspace?.memberCount.toString() ?? '',
37+
text: memberCountText,
2938
),
3039
onTap: () {
3140
context.push(InviteMembersScreen.routeName);

frontend/appflowy_flutter/lib/plugins/database/widgets/cell_editor/checklist_cell_editor.dart

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -280,6 +280,7 @@ class _ChecklistItemState extends State<ChecklistItem> {
280280
child: ChecklistCellTextfield(
281281
textController: textController,
282282
focusNode: textFieldFocusNode,
283+
lineHeight: Platform.isWindows ? 1.2 : 1.1,
283284
onChanged: () {
284285
_debounceOnChanged.call(() {
285286
if (!isComposing) {

frontend/appflowy_flutter/lib/plugins/database/widgets/cell_editor/checklist_cell_textfield.dart

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -46,20 +46,25 @@ class ChecklistCellTextfield extends StatelessWidget {
4646
horizontal: 2,
4747
),
4848
this.onSubmitted,
49+
this.lineHeight,
4950
});
5051

5152
final TextEditingController textController;
5253
final FocusNode focusNode;
5354
final EdgeInsetsGeometry contentPadding;
5455
final VoidCallback? onSubmitted;
5556
final VoidCallback? onChanged;
57+
final double? lineHeight;
5658

5759
@override
5860
Widget build(BuildContext context) {
61+
final textStyle = Theme.of(context).textTheme.bodyMedium;
5962
return TextField(
6063
controller: textController,
6164
focusNode: focusNode,
62-
style: Theme.of(context).textTheme.bodyMedium,
65+
style: textStyle?.copyWith(
66+
height: lineHeight,
67+
),
6368
maxLines: null,
6469
decoration: InputDecoration(
6570
border: InputBorder.none,

frontend/appflowy_flutter/lib/plugins/document/presentation/editor_plugins/base/backtick_character_command.dart

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -31,15 +31,22 @@ Future<bool> _convertBacktickToCodeBlock({
3131
}
3232

3333
// only active when the backtick is at the beginning of the line
34+
final keyword = '``';
3435
final plainText = delta.toPlainText();
35-
if (plainText != '``') {
36+
if (!plainText.startsWith(keyword)) {
3637
return false;
3738
}
3839

3940
final transaction = editorState.transaction;
40-
transaction.insertNode(
41+
final deltaWithoutKeyword = delta.compose(Delta()..delete(keyword.length));
42+
transaction.insertNodes(
4143
selection.end.path,
42-
codeBlockNode(),
44+
[
45+
codeBlockNode(
46+
delta: deltaWithoutKeyword,
47+
),
48+
if (node.children.isNotEmpty) ...node.children.map((e) => e.copyWith()),
49+
],
4350
);
4451
transaction.deleteNode(node);
4552
transaction.afterSelection = Selection.collapsed(

frontend/appflowy_flutter/lib/plugins/document/presentation/editor_plugins/shortcuts/custom_delete_command.dart

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
import 'package:appflowy/plugins/document/presentation/editor_plugins/simple_table/simple_table_block_component.dart';
2+
import 'package:appflowy/plugins/document/presentation/editor_plugins/simple_table/simple_table_cell_block_component.dart';
23
import 'package:appflowy_editor/appflowy_editor.dart';
34
import 'package:flutter/material.dart';
45

@@ -96,7 +97,13 @@ CommandShortcutEventHandler _deleteInNotCollapsedSelection = (editorState) {
9697
if (selection == null || selection.isCollapsed) {
9798
return KeyEventResult.ignored;
9899
}
99-
editorState.deleteSelection(selection);
100+
editorState.deleteSelection(
101+
selection,
102+
ignoreNodeTypes: [
103+
SimpleTableCellBlockKeys.type,
104+
TableCellBlockKeys.type,
105+
],
106+
);
100107
return KeyEventResult.handled;
101108
};
102109

frontend/appflowy_flutter/lib/user/application/password/password_http_service.dart

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
import 'dart:convert';
22

33
import 'package:appflowy_backend/log.dart';
4+
import 'package:appflowy_backend/protobuf/flowy-error/code.pbenum.dart';
45
import 'package:appflowy_backend/protobuf/flowy-error/errors.pb.dart';
56
import 'package:appflowy_result/appflowy_result.dart';
67
import 'package:http/http.dart' as http;
@@ -207,8 +208,15 @@ class PasswordHttpService {
207208
'${endpoint.name} request failed: ${response.statusCode}, $errorBody ',
208209
);
209210

211+
ErrorCode errorCode = ErrorCode.Internal;
212+
213+
if (response.statusCode == 422) {
214+
errorCode = ErrorCode.NewPasswordTooWeak;
215+
}
216+
210217
return FlowyResult.failure(
211218
FlowyError(
219+
code: errorCode,
212220
msg: errorBody['msg'] ?? errorMessage,
213221
),
214222
);

frontend/appflowy_flutter/lib/user/presentation/screens/sign_in_screen/widgets/continue_with/set_new_password.dart

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ import 'package:appflowy/user/presentation/screens/sign_in_screen/widgets/contin
55
import 'package:appflowy/user/presentation/screens/sign_in_screen/widgets/continue_with/title_logo.dart';
66
import 'package:appflowy/user/presentation/screens/sign_in_screen/widgets/continue_with/verifying_button.dart';
77
import 'package:appflowy/workspace/presentation/widgets/dialogs.dart';
8+
import 'package:appflowy_backend/protobuf/flowy-error/code.pbenum.dart';
89
import 'package:appflowy_ui/appflowy_ui.dart';
910
import 'package:easy_localization/easy_localization.dart';
1011
import 'package:flowy_infra_ui/widget/spacing.dart';
@@ -60,9 +61,15 @@ class _SetNewPasswordWidgetState extends State<SetNewPasswordWidget> {
6061
});
6162
},
6263
(error) {
63-
newPasswordKey.currentState?.syncError(
64-
errorText: error.msg,
65-
);
64+
if (error.code == ErrorCode.NewPasswordTooWeak) {
65+
newPasswordKey.currentState?.syncError(
66+
errorText: LocaleKeys.signIn_passwordMustContain.tr(),
67+
);
68+
} else {
69+
newPasswordKey.currentState?.syncError(
70+
errorText: error.msg,
71+
);
72+
}
6673
},
6774
);
6875
}

0 commit comments

Comments
 (0)