Skip to content

Commit f75d061

Browse files
committed
Merge branch 'main' into fix/desktop/link
2 parents ea1e0f7 + 63244e0 commit f75d061

File tree

29 files changed

+376
-241
lines changed

29 files changed

+376
-241
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/application/cell/bloc/date_cell_editor_bloc.dart

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -55,10 +55,11 @@ class DateCellEditorBloc
5555
didReceiveCellUpdate: (DateCellDataPB? cellData) {
5656
final dateCellData = DateCellData.fromPB(cellData);
5757

58-
ReminderOption reminderOption = ReminderOption.none;
58+
ReminderOption reminderOption = state.reminderOption;
5959

6060
if (dateCellData.reminderId.isNotEmpty &&
61-
dateCellData.dateTime != null) {
61+
dateCellData.dateTime != null &&
62+
reminderOption != ReminderOption.none) {
6263
final reminder = _reminderBloc.state.reminders
6364
.firstWhereOrNull((r) => r.id == dateCellData.reminderId);
6465
if (reminder != null) {
@@ -119,6 +120,7 @@ class DateCellEditorBloc
119120
await _clearDate();
120121
},
121122
setReminderOption: (ReminderOption option) async {
123+
emit(state.copyWith(reminderOption: option));
122124
await _setReminderOption(option);
123125
},
124126
);
@@ -246,9 +248,7 @@ class DateCellEditorBloc
246248
void _updateReminderIfNecessary(
247249
DateTime? dateTime,
248250
) {
249-
if (state.reminderId.isEmpty ||
250-
state.reminderOption == ReminderOption.none ||
251-
dateTime == null) {
251+
if (state.reminderId.isEmpty || dateTime == null) {
252252
return;
253253
}
254254

@@ -400,7 +400,7 @@ class DateCellEditorState with _$DateCellEditorState {
400400
ReminderOption reminderOption = ReminderOption.none;
401401

402402
if (dateCellData.reminderId.isNotEmpty && dateCellData.dateTime != null) {
403-
final reminder = reminderBloc.state.reminders
403+
final reminder = reminderBloc.state.allReminders
404404
.firstWhereOrNull((r) => r.id == dateCellData.reminderId);
405405
if (reminder != null) {
406406
final eventDate = dateCellData.includeTime

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/desktop_toolbar/link/link_search_text_field.dart

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -78,11 +78,12 @@ class LinkSearchTextField {
7878
focusNode: focusNode,
7979
textAlign: TextAlign.left,
8080
controller: textEditingController,
81-
style: textStyle ?? TextStyle(
82-
fontSize: 14,
83-
height: 20 / 14,
84-
fontWeight: FontWeight.w400,
85-
),
81+
style: textStyle ??
82+
TextStyle(
83+
fontSize: 14,
84+
height: 20 / 14,
85+
fontWeight: FontWeight.w400,
86+
),
8687
onChanged: (text) {
8788
if (text.isEmpty) {
8889
searchedViews.clear();

frontend/appflowy_flutter/lib/plugins/document/presentation/editor_plugins/mention/mention_date_block.dart

Lines changed: 20 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -63,11 +63,12 @@ class _MentionDateBlockState extends State<MentionDateBlock> {
6363
late bool _includeTime = widget.includeTime;
6464
late DateTime? parsedDate = DateTime.tryParse(widget.date);
6565
late String? _reminderId = widget.reminderId;
66+
late ReminderOption _reminderOption = widget.reminderOption;
6667

6768
ReminderPB? getReminder(BuildContext context) {
68-
if (!context.mounted) return null;
69+
if (!context.mounted || _reminderId == null) return null;
6970
final reminderBloc = context.read<ReminderBloc?>();
70-
return reminderBloc?.state.serverReminders
71+
return reminderBloc?.state.allReminders
7172
.firstWhereOrNull((r) => r.id == _reminderId);
7273
}
7374

@@ -115,11 +116,11 @@ class _MentionDateBlockState extends State<MentionDateBlock> {
115116
includeTime: _includeTime,
116117
dateFormat: appearance.dateFormat,
117118
timeFormat: appearance.timeFormat,
118-
selectedReminderOption: widget.reminderOption,
119+
selectedReminderOption: _reminderOption,
119120
onIncludeTimeChanged: (includeTime, dateTime, _) {
120121
_includeTime = includeTime;
121122

122-
if (widget.reminderOption != ReminderOption.none) {
123+
if (_reminderOption != ReminderOption.none) {
123124
_updateReminder(
124125
widget.reminderOption,
125126
context,
@@ -136,18 +137,26 @@ class _MentionDateBlockState extends State<MentionDateBlock> {
136137
onDaySelected: (selectedDay) {
137138
parsedDate = selectedDay;
138139

139-
if (widget.reminderOption != ReminderOption.none) {
140+
if (_reminderOption != ReminderOption.none) {
140141
_updateReminder(
141-
widget.reminderOption,
142+
_reminderOption,
142143
context,
143144
_includeTime,
144145
);
145146
} else {
147+
final rootContext = widget.editorState.document.root.context;
148+
if (rootContext != null && _reminderId != null) {
149+
rootContext
150+
.read<ReminderBloc?>()
151+
?.add(ReminderEvent.remove(reminderId: _reminderId!));
152+
}
146153
_updateBlock(selectedDay, includeTime: _includeTime);
147154
}
148155
},
149-
onReminderSelected: (reminderOption) =>
150-
_updateReminder(reminderOption, context, _includeTime),
156+
onReminderSelected: (reminderOption) {
157+
_reminderOption = reminderOption;
158+
_updateReminder(reminderOption, context, _includeTime);
159+
},
151160
);
152161

153162
Color? color;
@@ -245,7 +254,7 @@ class _MentionDateBlockState extends State<MentionDateBlock> {
245254
if (parsedDate == null || rootContext == null) {
246255
return;
247256
}
248-
final reminder = getReminder(context);
257+
final reminder = getReminder(rootContext);
249258
if (reminder != null) {
250259
_updateBlock(
251260
parsedDate!,
@@ -273,8 +282,8 @@ class _MentionDateBlockState extends State<MentionDateBlock> {
273282
);
274283
}
275284

276-
final reminderId = nanoid();
277-
_reminderId = reminderId;
285+
_reminderId ??= nanoid();
286+
final reminderId = _reminderId;
278287
_updateBlock(
279288
parsedDate!,
280289
includeTime: includeTime,

0 commit comments

Comments
 (0)