1
0
mirror of https://github.com/BookStackApp/BookStack.git synced 2025-08-07 23:03:00 +03:00

Lexical: Improved list tab handling, Improved test utils

- Made tab work on empty list items
- Improved select preservation on single list item tab
- Altered test context creation for more standard testing
This commit is contained in:
Dan Brown
2024-12-17 14:44:10 +00:00
parent e50cd33277
commit ace8af077d
4 changed files with 154 additions and 70 deletions

View File

@@ -1,4 +1,4 @@
import {$getSelection, BaseSelection, LexicalEditor} from "lexical";
import {$createTextNode, $getSelection, BaseSelection, LexicalEditor, TextNode} from "lexical";
import {$getBlockElementNodesInSelection, $selectNodes, $toggleSelection} from "./selection";
import {nodeHasInset} from "./nodes";
import {$createListItemNode, $createListNode, $isListItemNode, $isListNode, ListItemNode} from "@lexical/list";
@@ -93,6 +93,7 @@ function $reduceDedupeListItems(listItems: (ListItemNode|null)[]): ListItemNode[
export function $setInsetForSelection(editor: LexicalEditor, change: number): void {
const selection = $getSelection();
const selectionBounds = selection?.getStartEndPoints();
const listItemsInSelection = getListItemsForSelection(selection);
const isListSelection = listItemsInSelection.length > 0 && !listItemsInSelection.includes(null);
@@ -110,7 +111,19 @@ export function $setInsetForSelection(editor: LexicalEditor, change: number): vo
alteredListItems.reverse();
}
$selectNodes(alteredListItems);
if (alteredListItems.length === 1 && selectionBounds) {
// Retain selection range if moving just one item
const listItem = alteredListItems[0] as ListItemNode;
let child = listItem.getChildren()[0] as TextNode;
if (!child) {
child = $createTextNode('');
listItem.append(child);
}
child.select(selectionBounds[0].offset, selectionBounds[1].offset);
} else {
$selectNodes(alteredListItems);
}
return;
}