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

Lexical: Merged list nodes

This commit is contained in:
Dan Brown
2024-12-03 19:03:52 +00:00
parent 36a4d79120
commit ebd4604f21
10 changed files with 111 additions and 492 deletions

View File

@@ -1,22 +1,21 @@
import {$createCustomListItemNode, $isCustomListItemNode, CustomListItemNode} from "../nodes/custom-list-item";
import {$createCustomListNode, $isCustomListNode} from "../nodes/custom-list";
import {$getSelection, BaseSelection, LexicalEditor} from "lexical";
import {$getBlockElementNodesInSelection, $selectNodes, $toggleSelection} from "./selection";
import {nodeHasInset} from "./nodes";
import {$createListItemNode, $createListNode, $isListItemNode, $isListNode, ListItemNode} from "@lexical/list";
export function $nestListItem(node: CustomListItemNode): CustomListItemNode {
export function $nestListItem(node: ListItemNode): ListItemNode {
const list = node.getParent();
if (!$isCustomListNode(list)) {
if (!$isListNode(list)) {
return node;
}
const listItems = list.getChildren() as CustomListItemNode[];
const listItems = list.getChildren() as ListItemNode[];
const nodeIndex = listItems.findIndex((n) => n.getKey() === node.getKey());
const isFirst = nodeIndex === 0;
const newListItem = $createCustomListItemNode();
const newList = $createCustomListNode(list.getListType());
const newListItem = $createListItemNode();
const newList = $createListNode(list.getListType());
newList.append(newListItem);
newListItem.append(...node.getChildren());
@@ -31,11 +30,11 @@ export function $nestListItem(node: CustomListItemNode): CustomListItemNode {
return newListItem;
}
export function $unnestListItem(node: CustomListItemNode): CustomListItemNode {
export function $unnestListItem(node: ListItemNode): ListItemNode {
const list = node.getParent();
const parentListItem = list?.getParent();
const outerList = parentListItem?.getParent();
if (!$isCustomListNode(list) || !$isCustomListNode(outerList) || !$isCustomListItemNode(parentListItem)) {
if (!$isListNode(list) || !$isListNode(outerList) || !$isListItemNode(parentListItem)) {
return node;
}
@@ -51,19 +50,19 @@ export function $unnestListItem(node: CustomListItemNode): CustomListItemNode {
return node;
}
function getListItemsForSelection(selection: BaseSelection|null): (CustomListItemNode|null)[] {
function getListItemsForSelection(selection: BaseSelection|null): (ListItemNode|null)[] {
const nodes = selection?.getNodes() || [];
const listItemNodes = [];
outer: for (const node of nodes) {
if ($isCustomListItemNode(node)) {
if ($isListItemNode(node)) {
listItemNodes.push(node);
continue;
}
const parents = node.getParents();
for (const parent of parents) {
if ($isCustomListItemNode(parent)) {
if ($isListItemNode(parent)) {
listItemNodes.push(parent);
continue outer;
}
@@ -75,8 +74,8 @@ function getListItemsForSelection(selection: BaseSelection|null): (CustomListIte
return listItemNodes;
}
function $reduceDedupeListItems(listItems: (CustomListItemNode|null)[]): CustomListItemNode[] {
const listItemMap: Record<string, CustomListItemNode> = {};
function $reduceDedupeListItems(listItems: (ListItemNode|null)[]): ListItemNode[] {
const listItemMap: Record<string, ListItemNode> = {};
for (const item of listItems) {
if (item === null) {