-import {$createCustomListItemNode, $isCustomListItemNode, CustomListItemNode} from "../nodes/custom-list-item";
-import {$createCustomListNode, $isCustomListNode} from "../nodes/custom-list";
-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";
-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());
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;
}
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;
}
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) {
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);
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;
}