mirror of
https://github.com/AppFlowy-IO/AppFlowy.git
synced 2025-11-09 15:08:28 +00:00
fix: insert the pasted nodes after current selection if they start with a non-delta node (#6441)
* fix: pasting in-app json on a line with text can cause corrupt blocks * chore: update editor * fix: paste multiple nodes test
This commit is contained in:
parent
46e45c3715
commit
6e48f02d25
@ -3,6 +3,7 @@ import 'dart:io';
|
|||||||
import 'package:appflowy/generated/locale_keys.g.dart';
|
import 'package:appflowy/generated/locale_keys.g.dart';
|
||||||
import 'package:appflowy/plugins/document/presentation/editor_plugins/block_menu/block_menu_button.dart';
|
import 'package:appflowy/plugins/document/presentation/editor_plugins/block_menu/block_menu_button.dart';
|
||||||
import 'package:appflowy/plugins/document/presentation/editor_plugins/copy_and_paste/clipboard_service.dart';
|
import 'package:appflowy/plugins/document/presentation/editor_plugins/copy_and_paste/clipboard_service.dart';
|
||||||
|
import 'package:appflowy/plugins/document/presentation/editor_plugins/image/custom_image_block_component/custom_image_block_component.dart';
|
||||||
import 'package:appflowy/plugins/document/presentation/editor_plugins/link_preview/custom_link_preview.dart';
|
import 'package:appflowy/plugins/document/presentation/editor_plugins/link_preview/custom_link_preview.dart';
|
||||||
import 'package:appflowy/startup/startup.dart';
|
import 'package:appflowy/startup/startup.dart';
|
||||||
import 'package:appflowy_editor/appflowy_editor.dart';
|
import 'package:appflowy_editor/appflowy_editor.dart';
|
||||||
@ -388,6 +389,59 @@ void main() {
|
|||||||
},
|
},
|
||||||
);
|
);
|
||||||
|
|
||||||
|
testWidgets(
|
||||||
|
'paste the nodes start with non-delta node',
|
||||||
|
(tester) async {
|
||||||
|
await tester.pasteContent((_) {});
|
||||||
|
const text = 'Hello World';
|
||||||
|
final editorState = tester.editor.getCurrentEditorState();
|
||||||
|
final transaction = editorState.transaction;
|
||||||
|
// [image_block]
|
||||||
|
// [paragraph_block]
|
||||||
|
transaction.insertNodes([
|
||||||
|
0,
|
||||||
|
], [
|
||||||
|
customImageNode(url: ''),
|
||||||
|
paragraphNode(text: text),
|
||||||
|
]);
|
||||||
|
await editorState.apply(transaction);
|
||||||
|
await tester.pumpAndSettle();
|
||||||
|
|
||||||
|
await tester.editor.tapLineOfEditorAt(0);
|
||||||
|
// select all and copy
|
||||||
|
await tester.simulateKeyEvent(
|
||||||
|
LogicalKeyboardKey.keyA,
|
||||||
|
isControlPressed:
|
||||||
|
UniversalPlatform.isLinux || UniversalPlatform.isWindows,
|
||||||
|
isMetaPressed: UniversalPlatform.isMacOS,
|
||||||
|
);
|
||||||
|
await tester.simulateKeyEvent(
|
||||||
|
LogicalKeyboardKey.keyC,
|
||||||
|
isControlPressed:
|
||||||
|
UniversalPlatform.isLinux || UniversalPlatform.isWindows,
|
||||||
|
isMetaPressed: UniversalPlatform.isMacOS,
|
||||||
|
);
|
||||||
|
|
||||||
|
// put the cursor to the end of the paragraph block
|
||||||
|
await tester.editor.tapLineOfEditorAt(0);
|
||||||
|
|
||||||
|
// paste the content
|
||||||
|
await tester.simulateKeyEvent(
|
||||||
|
LogicalKeyboardKey.keyV,
|
||||||
|
isControlPressed:
|
||||||
|
UniversalPlatform.isLinux || UniversalPlatform.isWindows,
|
||||||
|
isMetaPressed: UniversalPlatform.isMacOS,
|
||||||
|
);
|
||||||
|
await tester.pumpAndSettle();
|
||||||
|
|
||||||
|
// expect the image and the paragraph block are inserted below the cursor
|
||||||
|
expect(editorState.getNodeAtPath([0])!.type, CustomImageBlockKeys.type);
|
||||||
|
expect(editorState.getNodeAtPath([1])!.type, ParagraphBlockKeys.type);
|
||||||
|
expect(editorState.getNodeAtPath([2])!.type, CustomImageBlockKeys.type);
|
||||||
|
expect(editorState.getNodeAtPath([3])!.type, ParagraphBlockKeys.type);
|
||||||
|
},
|
||||||
|
);
|
||||||
|
|
||||||
testWidgets('paste the url without protocol', (tester) async {
|
testWidgets('paste the url without protocol', (tester) async {
|
||||||
// paste the image that from local file
|
// paste the image that from local file
|
||||||
const plainText = '1.jpg';
|
const plainText = '1.jpg';
|
||||||
|
|||||||
@ -44,7 +44,10 @@ class EditorOperations {
|
|||||||
Future<void> tapLineOfEditorAt(int index) async {
|
Future<void> tapLineOfEditorAt(int index) async {
|
||||||
final textBlocks = find.byType(AppFlowyRichText);
|
final textBlocks = find.byType(AppFlowyRichText);
|
||||||
index = index.clamp(0, textBlocks.evaluate().length - 1);
|
index = index.clamp(0, textBlocks.evaluate().length - 1);
|
||||||
await tester.tapAt(tester.getTopRight(textBlocks.at(index)));
|
final center = tester.getCenter(textBlocks.at(index));
|
||||||
|
final right = tester.getTopRight(textBlocks.at(index));
|
||||||
|
final centerRight = Offset(right.dx, center.dy);
|
||||||
|
await tester.tapAt(centerRight);
|
||||||
await tester.pumpAndSettle();
|
await tester.pumpAndSettle();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -53,8 +53,8 @@ packages:
|
|||||||
dependency: "direct main"
|
dependency: "direct main"
|
||||||
description:
|
description:
|
||||||
path: "."
|
path: "."
|
||||||
ref: c5de9ed
|
ref: "3bbdccd"
|
||||||
resolved-ref: c5de9ed84dbc7461e5542ce598d803e37838a65a
|
resolved-ref: "3bbdccd9b1b583027c2ac9121de04b8c76bfef73"
|
||||||
url: "https://github.com/AppFlowy-IO/appflowy-editor.git"
|
url: "https://github.com/AppFlowy-IO/appflowy-editor.git"
|
||||||
source: git
|
source: git
|
||||||
version: "3.3.0"
|
version: "3.3.0"
|
||||||
|
|||||||
@ -170,7 +170,7 @@ dependency_overrides:
|
|||||||
appflowy_editor:
|
appflowy_editor:
|
||||||
git:
|
git:
|
||||||
url: https://github.com/AppFlowy-IO/appflowy-editor.git
|
url: https://github.com/AppFlowy-IO/appflowy-editor.git
|
||||||
ref: "c5de9ed"
|
ref: "3bbdccd"
|
||||||
|
|
||||||
appflowy_editor_plugins:
|
appflowy_editor_plugins:
|
||||||
git:
|
git:
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user