Skip to content

Commit 9b2520a

Browse files
committed
WYSIWYG: Fixed list indenting selection & display bugs
- Fixed selection breaking on multiple indent changes - Fixed multi-indent showing numbers on empty child list until the nodes are fully re-rendered.
1 parent 346b88a commit 9b2520a

File tree

3 files changed

+19
-12
lines changed

3 files changed

+19
-12
lines changed

resources/js/wysiwyg/nodes/custom-list-item.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -55,6 +55,8 @@ export class CustomListItemNode extends ListItemNode {
5555
if ($isListNode(parent) && parent.getListType() === 'check') {
5656
updateListItemChecked(dom, this);
5757
}
58+
59+
dom.style.listStyle = $hasNestedListWithoutLabel(this) ? 'none' : '';
5860
// @ts-expect-error - this is always HTMLListItemElement
5961
dom.value = this.__value;
6062

resources/js/wysiwyg/todo.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,4 +20,4 @@
2020

2121
## Bugs
2222

23-
- List selection can get lost on nesting/unnesting
23+
//

resources/js/wysiwyg/utils/lists.ts

Lines changed: 16 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,14 @@
11
import {$createCustomListItemNode, $isCustomListItemNode, CustomListItemNode} from "../nodes/custom-list-item";
22
import {$createCustomListNode, $isCustomListNode} from "../nodes/custom-list";
3-
import {BaseSelection, LexicalEditor} from "lexical";
4-
import {$getBlockElementNodesInSelection, $selectNodes, $toggleSelection, getLastSelection} from "./selection";
3+
import {$getSelection, BaseSelection, LexicalEditor} from "lexical";
4+
import {$getBlockElementNodesInSelection, $selectNodes, $toggleSelection} from "./selection";
55
import {nodeHasInset} from "./nodes";
66

77

8-
export function $nestListItem(node: CustomListItemNode) {
8+
export function $nestListItem(node: CustomListItemNode): CustomListItemNode {
99
const list = node.getParent();
1010
if (!$isCustomListNode(list)) {
11-
return;
11+
return node;
1212
}
1313

1414
const listItems = list.getChildren() as CustomListItemNode[];
@@ -27,14 +27,16 @@ export function $nestListItem(node: CustomListItemNode) {
2727
prevListItem.append(newList);
2828
node.remove();
2929
}
30+
31+
return newListItem;
3032
}
3133

32-
export function $unnestListItem(node: CustomListItemNode) {
34+
export function $unnestListItem(node: CustomListItemNode): CustomListItemNode {
3335
const list = node.getParent();
3436
const parentListItem = list?.getParent();
3537
const outerList = parentListItem?.getParent();
3638
if (!$isCustomListNode(list) || !$isCustomListNode(outerList) || !$isCustomListItemNode(parentListItem)) {
37-
return;
39+
return node;
3840
}
3941

4042
parentListItem.insertAfter(node);
@@ -45,6 +47,8 @@ export function $unnestListItem(node: CustomListItemNode) {
4547
if (parentListItem.getChildren().length === 0) {
4648
parentListItem.remove();
4749
}
50+
51+
return node;
4852
}
4953

5054
function getListItemsForSelection(selection: BaseSelection|null): (CustomListItemNode|null)[] {
@@ -89,24 +93,25 @@ function $reduceDedupeListItems(listItems: (CustomListItemNode|null)[]): CustomL
8993
}
9094

9195
export function $setInsetForSelection(editor: LexicalEditor, change: number): void {
92-
const selection = getLastSelection(editor);
93-
96+
const selection = $getSelection();
9497
const listItemsInSelection = getListItemsForSelection(selection);
9598
const isListSelection = listItemsInSelection.length > 0 && !listItemsInSelection.includes(null);
9699

97100
if (isListSelection) {
101+
const alteredListItems = [];
98102
const listItems = $reduceDedupeListItems(listItemsInSelection);
99103
if (change > 0) {
100104
for (const listItem of listItems) {
101-
$nestListItem(listItem);
105+
alteredListItems.push($nestListItem(listItem));
102106
}
103107
} else if (change < 0) {
104108
for (const listItem of [...listItems].reverse()) {
105-
$unnestListItem(listItem);
109+
alteredListItems.push($unnestListItem(listItem));
106110
}
111+
alteredListItems.reverse();
107112
}
108113

109-
$selectNodes(listItems);
114+
$selectNodes(alteredListItems);
110115
return;
111116
}
112117

0 commit comments

Comments
 (0)