Lexical: Added basic list button/support

This commit is contained in:
Dan Brown 2024-06-19 16:14:20 +01:00
parent 9e43e03db4
commit e2409a5fab
No known key found for this signature in database
GPG Key ID: 46D9F943C24A2EF9
6 changed files with 43 additions and 7 deletions

1
package-lock.json generated
View File

@ -21,6 +21,7 @@
"@lexical/history": "^0.15.0",
"@lexical/html": "^0.15.0",
"@lexical/link": "^0.15.0",
"@lexical/list": "^0.15.0",
"@lexical/rich-text": "^0.15.0",
"@lexical/selection": "^0.15.0",
"@lexical/utils": "^0.15.0",

View File

@ -45,6 +45,7 @@
"@lexical/history": "^0.15.0",
"@lexical/html": "^0.15.0",
"@lexical/link": "^0.15.0",
"@lexical/list": "^0.15.0",
"@lexical/rich-text": "^0.15.0",
"@lexical/selection": "^0.15.0",
"@lexical/utils": "^0.15.0",

View File

@ -5,6 +5,7 @@ import {CustomParagraphNode} from "./custom-paragraph";
import {LinkNode} from "@lexical/link";
import {ImageNode} from "./image";
import {DetailsNode, SummaryNode} from "./details";
import {ListItemNode, ListNode} from "@lexical/list";
/**
* Load the nodes for lexical.
@ -14,6 +15,8 @@ export function getNodesForPageEditor(): (KlassConstructor<typeof LexicalNode> |
CalloutNode, // Todo - Create custom
HeadingNode, // Todo - Create custom
QuoteNode, // Todo - Create custom
ListNode, // Todo - Create custom
ListItemNode,
ImageNode,
DetailsNode, SummaryNode,
CustomParagraphNode,

View File

@ -1,11 +1,11 @@
import {EditorBasicButtonDefinition, EditorButtonDefinition} from "../framework/buttons";
import {
$createNodeSelection,
$createParagraphNode, $getRoot, $getSelection, $insertNodes,
$createParagraphNode, $getRoot, $getSelection,
$isParagraphNode, $isTextNode, $setSelection,
BaseSelection, ElementNode, FORMAT_TEXT_COMMAND,
LexicalNode,
REDO_COMMAND, TextFormatType, TextNode,
REDO_COMMAND, TextFormatType,
UNDO_COMMAND
} from "lexical";
import {
@ -23,12 +23,12 @@ import {
HeadingNode,
HeadingTagType
} from "@lexical/rich-text";
import {$isLinkNode, $toggleLink, LinkNode} from "@lexical/link";
import {$isLinkNode, LinkNode} from "@lexical/link";
import {EditorUiContext} from "../framework/core";
import {$isImageNode, ImageNode} from "../../nodes/image";
import {$createDetailsNode, $isDetailsNode} from "../../nodes/details";
import {$insertNodeToNearestRoot} from "@lexical/utils";
import {getEditorContentAsHtml} from "../../actions";
import {$isListNode, insertList, ListNode, ListType, removeList} from "@lexical/list";
export const undo: EditorButtonDefinition = {
label: 'Undo',
@ -155,6 +155,31 @@ export const clearFormating: EditorButtonDefinition = {
}
};
function buildListButton(label: string, type: ListType): EditorButtonDefinition {
return {
label,
action(context: EditorUiContext) {
context.editor.getEditorState().read(() => {
const selection = $getSelection();
if (this.isActive(selection)) {
removeList(context.editor);
} else {
insertList(context.editor, type);
}
});
},
isActive(selection: BaseSelection|null): boolean {
return selectionContainsNodeType(selection, (node: LexicalNode | null | undefined): boolean => {
return $isListNode(node) && (node as ListNode).getListType() === type;
});
}
};
}
export const bulletList: EditorButtonDefinition = buildListButton('Bullet list', 'bullet');
export const numberList: EditorButtonDefinition = buildListButton('Numbered list', 'number');
export const taskList: EditorButtonDefinition = buildListButton('Task list', 'check');
export const link: EditorButtonDefinition = {
label: 'Insert/edit link',

View File

@ -1,11 +1,11 @@
import {EditorButton} from "./framework/buttons";
import {
blockquote, bold, clearFormating, code,
blockquote, bold, bulletList, clearFormating, code,
dangerCallout, details,
h2, h3, h4, h5, highlightColor, image,
infoCallout, italic, link, paragraph,
infoCallout, italic, link, numberList, paragraph,
redo, source, strikethrough, subscript,
successCallout, superscript, textColor, underline,
successCallout, superscript, taskList, textColor, underline,
undo,
warningCallout
} from "./defaults/button-definitions";
@ -53,6 +53,11 @@ export function getMainEditorFullToolbar(): EditorContainerUiElement {
new EditorButton(code),
new EditorButton(clearFormating),
// Lists
new EditorButton(bulletList),
new EditorButton(numberList),
new EditorButton(taskList),
// Insert types
new EditorButton(link),
new EditorButton(image),

View File

@ -6,6 +6,7 @@
// Main UI elements
.editor-toolbar-main {
display: flex;
flex-wrap: wrap;
}
// Buttons