2 * Copyright (c) Meta Platforms, Inc. and affiliates.
4 * This source code is licensed under the MIT license found in the
5 * LICENSE file in the root directory of this source tree.
9 import type {Spread} from 'lexical';
11 import {addClassNamesToElement} from '@lexical/utils';
13 $applyNodeReplacement,
20 SerializedElementNode,
23 import {PIXEL_VALUE_REG_EXP} from './constants';
25 export type SerializedTableRowNode = Spread<
33 export class TableRowNode extends ElementNode {
37 static getType(): string {
41 static clone(node: TableRowNode): TableRowNode {
42 return new TableRowNode(node.__height, node.__key);
45 static importDOM(): DOMConversionMap | null {
47 tr: (node: Node) => ({
48 conversion: $convertTableRowElement,
54 static importJSON(serializedNode: SerializedTableRowNode): TableRowNode {
55 return $createTableRowNode(serializedNode.height);
58 constructor(height?: number, key?: NodeKey) {
60 this.__height = height;
63 exportJSON(): SerializedTableRowNode {
65 ...super.exportJSON(),
66 ...(this.getHeight() && {height: this.getHeight()}),
72 createDOM(config: EditorConfig): HTMLElement {
73 const element = document.createElement('tr');
76 element.style.height = `${this.__height}px`;
79 addClassNamesToElement(element, config.theme.tableRow);
84 isShadowRoot(): boolean {
88 setHeight(height: number): number | null | undefined {
89 const self = this.getWritable();
90 self.__height = height;
94 getHeight(): number | undefined {
95 return this.getLatest().__height;
98 updateDOM(prevNode: TableRowNode): boolean {
99 return prevNode.__height !== this.__height;
102 canBeEmpty(): false {
111 export function $convertTableRowElement(domNode: Node): DOMConversionOutput {
112 const domNode_ = domNode as HTMLTableCellElement;
113 let height: number | undefined = undefined;
115 if (PIXEL_VALUE_REG_EXP.test(domNode_.style.height)) {
116 height = parseFloat(domNode_.style.height);
119 return {node: $createTableRowNode(height)};
122 export function $createTableRowNode(height?: number): TableRowNode {
123 return $applyNodeReplacement(new TableRowNode(height));
126 export function $isTableRowNode(
127 node: LexicalNode | null | undefined,
128 ): node is TableRowNode {
129 return node instanceof TableRowNode;