Skip to content

Commit 5f1f536

Browse files
authored
feat: support editing name when creating a new page on mobile (#6501)
* feat: support editing name when creating a new page on mobile * chore: add defaultName in layout extension * test: add cover title test on mobile * fix: cover title test on mobile * feat: add integration runner 4 * chore: update translations * chore: disable subpage feature
1 parent ba59514 commit 5f1f536

File tree

28 files changed

+306
-125
lines changed

28 files changed

+306
-125
lines changed

.github/actions/flutter_integration_test/action.yml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -52,7 +52,7 @@ runs:
5252
sudo wget -qO /etc/apt/trusted.gpg.d/dart_linux_signing_key.asc https://dl-ssl.google.com/linux/linux_signing_key.pub
5353
sudo wget -qO /etc/apt/sources.list.d/dart_stable.list https://storage.googleapis.com/download.dartlang.org/linux/debian/dart_stable.list
5454
sudo apt-get update
55-
sudo apt-get install -y dart curl build-essential libssl-dev clang cmake ninja-build pkg-config libgtk-3-dev keybinder-3.0 libnotify-dev network-manager libmpv-dev mpv
55+
sudo apt-get install -y dart curl build-essential libssl-dev clang cmake ninja-build pkg-config libgtk-3-dev keybinder-3.0 libnotify-dev network-manager
5656
shell: bash
5757

5858
- name: Enable Flutter Desktop
@@ -75,4 +75,4 @@ runs:
7575
sudo Xvfb -ac :99 -screen 0 1280x1024x24 > /dev/null 2>&1 &
7676
sudo apt-get install network-manager
7777
flutter test ${{ inputs.test_path }} -d Linux --coverage
78-
shell: bash
78+
shell: bash

.github/workflows/flutter_ci.yaml

Lines changed: 39 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,7 @@ jobs:
3939
strategy:
4040
fail-fast: true
4141
matrix:
42-
os: [ ubuntu-latest ]
42+
os: [ubuntu-latest]
4343
include:
4444
- os: ubuntu-latest
4545
flutter_profile: development-linux-x86_64
@@ -73,7 +73,7 @@ jobs:
7373
strategy:
7474
fail-fast: true
7575
matrix:
76-
os: [ windows-2019 ]
76+
os: [windows-2019]
7777
include:
7878
- os: windows-2019
7979
flutter_profile: development-windows-x86
@@ -100,7 +100,7 @@ jobs:
100100
strategy:
101101
fail-fast: true
102102
matrix:
103-
os: [ macos-latest ]
103+
os: [macos-latest]
104104
include:
105105
- os: macos-latest
106106
flutter_profile: development-mac-x86_64
@@ -122,12 +122,12 @@ jobs:
122122
flutter_profile: ${{ matrix.flutter_profile }}
123123

124124
unit_test:
125-
needs: [ prepare-linux ]
125+
needs: [prepare-linux]
126126
if: github.event.pull_request.draft != true
127127
strategy:
128128
fail-fast: false
129129
matrix:
130-
os: [ ubuntu-latest ]
130+
os: [ubuntu-latest]
131131
include:
132132
- os: ubuntu-latest
133133
flutter_profile: development-linux-x86_64
@@ -173,7 +173,7 @@ jobs:
173173
sudo wget -qO /etc/apt/trusted.gpg.d/dart_linux_signing_key.asc https://dl-ssl.google.com/linux/linux_signing_key.pub
174174
sudo wget -qO /etc/apt/sources.list.d/dart_stable.list https://storage.googleapis.com/download.dartlang.org/linux/debian/dart_stable.list
175175
sudo apt-get update
176-
sudo apt-get install -y dart curl build-essential libssl-dev clang cmake ninja-build pkg-config libgtk-3-dev keybinder-3.0 libnotify-dev libmpv-dev mpv
176+
sudo apt-get install -y dart curl build-essential libssl-dev clang cmake ninja-build pkg-config libgtk-3-dev keybinder-3.0 libnotify-dev
177177
fi
178178
shell: bash
179179

@@ -216,11 +216,11 @@ jobs:
216216
shell: bash
217217

218218
cloud_integration_test:
219-
needs: [ prepare-linux ]
219+
needs: [prepare-linux]
220220
strategy:
221221
fail-fast: false
222222
matrix:
223-
os: [ ubuntu-latest ]
223+
os: [ubuntu-latest]
224224
include:
225225
- os: ubuntu-latest
226226
flutter_profile: development-linux-x86_64
@@ -292,7 +292,7 @@ jobs:
292292
sudo wget -qO /etc/apt/trusted.gpg.d/dart_linux_signing_key.asc https://dl-ssl.google.com/linux/linux_signing_key.pub
293293
sudo wget -qO /etc/apt/sources.list.d/dart_stable.list https://storage.googleapis.com/download.dartlang.org/linux/debian/dart_stable.list
294294
sudo apt-get update
295-
sudo apt-get install -y dart curl build-essential libssl-dev clang cmake ninja-build pkg-config libgtk-3-dev keybinder-3.0 libnotify-dev libmpv-dev mpv
295+
sudo apt-get install -y dart curl build-essential libssl-dev clang cmake ninja-build pkg-config libgtk-3-dev keybinder-3.0 libnotify-dev
296296
shell: bash
297297

298298
- name: Enable Flutter Desktop
@@ -325,12 +325,12 @@ jobs:
325325

326326
# split the integration tests into different machines to minimize the time
327327
integration_test_1:
328-
needs: [ prepare-linux ]
328+
needs: [prepare-linux]
329329
if: github.event.pull_request.draft != true
330330
strategy:
331331
fail-fast: false
332332
matrix:
333-
os: [ ubuntu-latest ]
333+
os: [ubuntu-latest]
334334
include:
335335
- os: ubuntu-latest
336336
target: "x86_64-unknown-linux-gnu"
@@ -339,12 +339,6 @@ jobs:
339339
- name: Checkout source code
340340
uses: actions/checkout@v4
341341

342-
- name: Install video dependency
343-
run: |
344-
sudo apt-get update
345-
sudo apt-get -y install libmpv-dev mpv
346-
shell: bash
347-
348342
- name: Flutter Integration Test 1
349343
uses: ./.github/actions/flutter_integration_test
350344
with:
@@ -355,12 +349,12 @@ jobs:
355349
rust_target: ${{ matrix.target }}
356350

357351
integration_test_2:
358-
needs: [ prepare-linux ]
352+
needs: [prepare-linux]
359353
if: github.event.pull_request.draft != true
360354
strategy:
361355
fail-fast: false
362356
matrix:
363-
os: [ ubuntu-latest ]
357+
os: [ubuntu-latest]
364358
include:
365359
- os: ubuntu-latest
366360
target: "x86_64-unknown-linux-gnu"
@@ -369,12 +363,6 @@ jobs:
369363
- name: Checkout source code
370364
uses: actions/checkout@v4
371365

372-
- name: Install video dependency
373-
run: |
374-
sudo apt-get update
375-
sudo apt-get -y install libmpv-dev mpv
376-
shell: bash
377-
378366
- name: Flutter Integration Test 2
379367
uses: ./.github/actions/flutter_integration_test
380368
with:
@@ -385,12 +373,12 @@ jobs:
385373
rust_target: ${{ matrix.target }}
386374

387375
integration_test_3:
388-
needs: [ prepare-linux ]
376+
needs: [prepare-linux]
389377
if: github.event.pull_request.draft != true
390378
strategy:
391379
fail-fast: false
392380
matrix:
393-
os: [ ubuntu-latest ]
381+
os: [ubuntu-latest]
394382
include:
395383
- os: ubuntu-latest
396384
target: "x86_64-unknown-linux-gnu"
@@ -399,12 +387,6 @@ jobs:
399387
- name: Checkout source code
400388
uses: actions/checkout@v4
401389

402-
- name: Install video dependency
403-
run: |
404-
sudo apt-get update
405-
sudo apt-get -y install libmpv-dev mpv
406-
shell: bash
407-
408390
- name: Flutter Integration Test 3
409391
uses: ./.github/actions/flutter_integration_test
410392
with:
@@ -413,3 +395,27 @@ jobs:
413395
rust_toolchain: ${{ env.RUST_TOOLCHAIN }}
414396
cargo_make_version: ${{ env.CARGO_MAKE_VERSION }}
415397
rust_target: ${{ matrix.target }}
398+
399+
integration_test_4:
400+
needs: [prepare-linux]
401+
if: github.event.pull_request.draft != true
402+
strategy:
403+
fail-fast: false
404+
matrix:
405+
os: [ubuntu-latest]
406+
include:
407+
- os: ubuntu-latest
408+
target: "x86_64-unknown-linux-gnu"
409+
runs-on: ${{ matrix.os }}
410+
steps:
411+
- name: Checkout source code
412+
uses: actions/checkout@v4
413+
414+
- name: Flutter Integration Test 4
415+
uses: ./.github/actions/flutter_integration_test
416+
with:
417+
test_path: integration_test/desktop_runner_4.dart
418+
flutter_version: ${{ env.FLUTTER_VERSION }}
419+
rust_toolchain: ${{ env.RUST_TOOLCHAIN }}
420+
cargo_make_version: ${{ env.CARGO_MAKE_VERSION }}
421+
rust_target: ${{ matrix.target }}

.github/workflows/release.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -368,7 +368,7 @@ jobs:
368368
sudo apt-get update
369369
sudo apt-get install -y build-essential libsqlite3-dev libssl-dev clang cmake ninja-build pkg-config libgtk-3-dev
370370
sudo apt-get install keybinder-3.0
371-
sudo apt-get install -y alien libnotify-dev libmpv-dev mpv
371+
sudo apt-get install -y alien libnotify-dev
372372
source $HOME/.cargo/env
373373
cargo install --force cargo-make
374374
cargo install --force duckscript_cli

frontend/appflowy_flutter/integration_test/desktop/document/document_test_runner.dart renamed to frontend/appflowy_flutter/integration_test/desktop/document/document_test_runner_1.dart

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@ import 'document_with_outline_block_test.dart' as document_with_outline_block;
2424
import 'document_with_toggle_list_test.dart' as document_with_toggle_list_test;
2525
import 'edit_document_test.dart' as document_edit_test;
2626

27-
void startTesting() {
27+
void main() {
2828
IntegrationTestWidgetsFlutterBinding.ensureInitialized();
2929

3030
// Document integration tests
@@ -47,4 +47,6 @@ void startTesting() {
4747
document_more_actions_test.main();
4848
document_with_file_test.main();
4949
document_shortcuts_test.main();
50+
51+
// Don't add new tests here. Add them to document_test_runner_2.dart
5052
}
Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
import 'package:integration_test/integration_test.dart';
2+
3+
import 'document_app_lifecycle_test.dart' as document_app_lifecycle_test;
4+
import 'document_title_test.dart' as document_title_test;
5+
6+
void main() {
7+
IntegrationTestWidgetsFlutterBinding.ensureInitialized();
8+
9+
// Document integration tests
10+
document_title_test.main();
11+
// Disable subPage test temporarily, enable it in version 0.7.2
12+
// document_sub_page_test.main();
13+
document_app_lifecycle_test.main();
14+
}

frontend/appflowy_flutter/integration_test/desktop_runner_1.dart

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
import 'package:integration_test/integration_test.dart';
22

3-
import 'desktop/document/document_test_runner.dart' as document_test_runner;
3+
import 'desktop/document/document_test_runner_1.dart' as document_test_runner;
44
import 'desktop/uncategorized/empty_test.dart' as first_test;
55
import 'desktop/uncategorized/switch_folder_test.dart' as switch_folder_test;
66

@@ -15,7 +15,7 @@ Future<void> runIntegration1OnDesktop() async {
1515
first_test.main();
1616

1717
switch_folder_test.main();
18-
document_test_runner.startTesting();
18+
document_test_runner.main();
1919

20-
// DON'T add more tests here. This is the first test runner for desktop.
20+
// DON'T add more tests here.
2121
}

frontend/appflowy_flutter/integration_test/desktop_runner_3.dart

Lines changed: 3 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -3,16 +3,12 @@ import 'package:integration_test/integration_test.dart';
33
import 'desktop/board/board_test_runner.dart' as board_test_runner;
44
import 'desktop/database/database_row_cover_test.dart'
55
as database_row_cover_test;
6-
import 'desktop/document/document_title_test.dart' as document_title_test;
7-
import 'desktop/document/document_app_lifecycle_test.dart'
8-
as document_app_lifecycle_test;
9-
import 'desktop/document/document_sub_page_test.dart' as document_sub_page_test;
6+
import 'desktop/grid/grid_edit_row_test.dart' as grid_edit_row_test_runner;
107
import 'desktop/grid/grid_filter_and_sort_test.dart'
118
as grid_filter_and_sort_test_runner;
129
import 'desktop/grid/grid_reopen_test.dart' as grid_reopen_test_runner;
1310
import 'desktop/grid/grid_reorder_row_test.dart'
1411
as grid_reorder_row_test_runner;
15-
import 'desktop/grid/grid_edit_row_test.dart' as grid_edit_row_test_runner;
1612
import 'desktop/grid/grid_row_test.dart' as grid_create_row_test_runner;
1713
import 'desktop/settings/settings_runner.dart' as settings_test_runner;
1814
import 'desktop/sidebar/sidebar_test_runner.dart' as sidebar_test_runner;
@@ -51,7 +47,6 @@ Future<void> runIntegration3OnDesktop() async {
5147
grid_filter_and_sort_test_runner.main();
5248
grid_edit_row_test_runner.main();
5349
zoom_in_out_test.main();
54-
document_title_test.main();
55-
document_sub_page_test.main();
56-
document_app_lifecycle_test.main();
50+
51+
// DON'T add more tests here. Add them to desktop_runner_4.dart
5752
}
Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
import 'package:integration_test/integration_test.dart';
2+
3+
import 'desktop/document/document_test_runner_2.dart' as document_test_runner_2;
4+
import 'desktop/uncategorized/empty_test.dart' as first_test;
5+
6+
Future<void> main() async {
7+
await runIntegration4OnDesktop();
8+
}
9+
10+
Future<void> runIntegration4OnDesktop() async {
11+
IntegrationTestWidgetsFlutterBinding.ensureInitialized();
12+
13+
// This test must be run first, otherwise the CI will fail.
14+
first_test.main();
15+
16+
document_test_runner_2.main();
17+
}
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
import 'package:integration_test/integration_test.dart';
2+
3+
import 'page_style_test.dart' as page_style_test;
4+
import 'title_test.dart' as title_test;
5+
6+
void main() {
7+
IntegrationTestWidgetsFlutterBinding.ensureInitialized();
8+
9+
// Document integration tests
10+
title_test.main();
11+
page_style_test.main();
12+
}
Lines changed: 76 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,76 @@
1+
// ignore_for_file: unused_import
2+
3+
import 'dart:io';
4+
5+
import 'package:appflowy/env/cloud_env.dart';
6+
import 'package:appflowy/generated/flowy_svgs.g.dart';
7+
import 'package:appflowy/generated/locale_keys.g.dart';
8+
import 'package:appflowy/mobile/application/page_style/document_page_style_bloc.dart';
9+
import 'package:appflowy/mobile/presentation/base/app_bar/app_bar_actions.dart';
10+
import 'package:appflowy/mobile/presentation/base/view_page/app_bar_buttons.dart';
11+
import 'package:appflowy/mobile/presentation/bottom_sheet/bottom_sheet_buttons.dart';
12+
import 'package:appflowy/mobile/presentation/home/home.dart';
13+
import 'package:appflowy/mobile/presentation/home/section_folder/mobile_home_section_folder_header.dart';
14+
import 'package:appflowy/mobile/presentation/presentation.dart';
15+
import 'package:appflowy/plugins/document/presentation/editor_page.dart';
16+
import 'package:appflowy/plugins/document/presentation/editor_plugins/cover/document_immersive_cover.dart';
17+
import 'package:appflowy/plugins/document/presentation/editor_plugins/cover/document_immersive_cover_bloc.dart';
18+
import 'package:appflowy/plugins/document/presentation/editor_plugins/page_style/_page_style_layout.dart';
19+
import 'package:appflowy/startup/startup.dart';
20+
import 'package:appflowy/user/application/auth/af_cloud_mock_auth_service.dart';
21+
import 'package:appflowy/user/application/auth/auth_service.dart';
22+
import 'package:appflowy/user/presentation/screens/sign_in_screen/widgets/widgets.dart';
23+
import 'package:appflowy/workspace/application/settings/prelude.dart';
24+
import 'package:appflowy/workspace/application/view/view_ext.dart';
25+
import 'package:appflowy/workspace/presentation/settings/widgets/setting_appflowy_cloud.dart';
26+
import 'package:appflowy_backend/protobuf/flowy-folder/view.pb.dart';
27+
import 'package:appflowy_editor/appflowy_editor.dart';
28+
import 'package:easy_localization/easy_localization.dart';
29+
import 'package:flowy_infra/uuid.dart';
30+
import 'package:flutter/material.dart';
31+
import 'package:flutter_test/flutter_test.dart';
32+
import 'package:integration_test/integration_test.dart';
33+
import 'package:path/path.dart' as p;
34+
35+
import '../../shared/dir.dart';
36+
import '../../shared/mock/mock_file_picker.dart';
37+
import '../../shared/util.dart';
38+
39+
void main() {
40+
IntegrationTestWidgetsFlutterBinding.ensureInitialized();
41+
42+
group('document title:', () {
43+
testWidgets('create a new page, the title should be empty', (tester) async {
44+
await tester.launchInAnonymousMode();
45+
46+
final createPageButton = find.byKey(
47+
BottomNavigationBarItemType.add.valueKey,
48+
);
49+
await tester.tapButton(createPageButton);
50+
expect(find.byType(MobileDocumentScreen), findsOneWidget);
51+
52+
final title = tester.editor.findDocumentTitle('');
53+
expect(title, findsOneWidget);
54+
final textField = tester.widget<TextField>(title);
55+
expect(textField.focusNode!.hasFocus, isTrue);
56+
57+
// input new name and press done button
58+
const name = 'test document';
59+
await tester.enterText(title, name);
60+
await tester.testTextInput.receiveAction(TextInputAction.done);
61+
await tester.pumpAndSettle();
62+
final newTitle = tester.editor.findDocumentTitle(name);
63+
expect(newTitle, findsOneWidget);
64+
expect(textField.controller!.text, name);
65+
66+
// the document should get focus
67+
final editor = tester.widget<AppFlowyEditorPage>(
68+
find.byType(AppFlowyEditorPage),
69+
);
70+
expect(
71+
editor.editorState.selection,
72+
Selection.collapsed(Position(path: [0])),
73+
);
74+
});
75+
});
76+
}

0 commit comments

Comments
 (0)