10 SerializedTableRowNode,
12 } from "@lexical/table";
13 import {NodeKey} from "lexical/LexicalNode";
14 import {extractStyleMapFromElement, StyleMap} from "../utils/dom";
16 export type SerializedCustomTableRowNode = Spread<{
17 styles: Record<string, string>,
18 }, SerializedTableRowNode>
20 export class CustomTableRowNode extends TableRowNode {
21 __styles: StyleMap = new Map();
23 constructor(key?: NodeKey) {
27 static getType(): string {
28 return 'custom-table-row';
31 static clone(node: CustomTableRowNode): CustomTableRowNode {
32 const cellNode = new CustomTableRowNode(node.__key);
34 cellNode.__styles = new Map(node.__styles);
38 getStyles(): StyleMap {
39 const self = this.getLatest();
40 return new Map(self.__styles);
43 setStyles(styles: StyleMap): void {
44 const self = this.getWritable();
45 self.__styles = new Map(styles);
48 createDOM(config: EditorConfig): HTMLElement {
49 const element = super.createDOM(config);
51 for (const [name, value] of this.__styles.entries()) {
52 element.style.setProperty(name, value);
58 updateDOM(prevNode: CustomTableRowNode): boolean {
59 return super.updateDOM(prevNode)
60 || this.__styles !== prevNode.__styles;
63 static importDOM(): DOMConversionMap | null {
65 tr: (node: Node) => ({
66 conversion: $convertTableRowElement,
72 static importJSON(serializedNode: SerializedCustomTableRowNode): CustomTableRowNode {
73 const node = $createCustomTableRowNode();
75 node.setStyles(new Map(Object.entries(serializedNode.styles)));
80 exportJSON(): SerializedCustomTableRowNode {
82 ...super.exportJSON(),
84 type: 'custom-table-row',
85 styles: Object.fromEntries(this.__styles),
90 export function $convertTableRowElement(domNode: Node): DOMConversionOutput {
91 const rowNode = $createCustomTableRowNode();
93 if (domNode instanceof HTMLElement) {
94 rowNode.setStyles(extractStyleMapFromElement(domNode));
97 return {node: rowNode};
100 export function $createCustomTableRowNode(): CustomTableRowNode {
101 return new CustomTableRowNode();
104 export function $isCustomTableRowNode(node: LexicalNode | null | undefined): node is CustomTableRowNode {
105 return node instanceof CustomTableRowNode;