BookStackApp/BookStack · error · Error

Table Element Not Found

Error message

Table Element Not Found

What it means

$getElementForTableNode fetches the table's DOM element via editor.getElementByKey(tableNode.getKey()). If the editor has no rendered element for that node key (headless editor, element removed from the DOM, or wrong editor instance), it returns null and this function throws 'Table Element Not Found'.

Source

Thrown at resources/js/wysiwyg/lexical/table/LexicalTableNode.ts:315

  }

  canSelectBefore(): true {
    return true;
  }

  canIndent(): false {
    return false;
  }
}

export function $getElementForTableNode(
  editor: LexicalEditor,
  tableNode: TableNode,
): TableDOMTable {
  const tableElement = editor.getElementByKey(tableNode.getKey());

  if (tableElement == null) {
    throw new Error('Table Element Not Found');
  }

  return getTable(tableElement);
}

export function $convertTableElement(element: HTMLElement): DOMConversionOutput {
  const node = $createTableNode();
  setCommonBlockPropsFromElement(element, node);

  const colWidths = getTableColumnWidths(element as HTMLTableElement);
  node.setColWidths(colWidths);
  node.setStyles(extractStyleMapFromElement(element));

  return {node};
}

export function $createTableNode(): TableNode {
  return $applyNodeReplacement(new TableNode());

View on GitHub (pinned to 18f8469a1c)

Solutions

  1. Ensure the editor is attached to a real DOM (not createHeadlessEditor) and the table element is mounted before querying.
  2. Confirm the TableNode belongs to the same editor you pass in (compare node's key existence via editor.getElementByKey first).
  3. Call within an editor.update()/read() while the node is still attached; check $isTableNode(tableNode) and that it's part of the document root.
  4. Wrap the call in try/catch and rebuild the DOM data lazily if the element may be transiently absent.

Example fix

// before
const table = $getElementForTableNode(editor, tableNode); // throws if unmounted

// after
const el = editor.getElementByKey(tableNode.getKey());
if (!el) return null;
const table = getTable(el);
Defensive patterns

Strategy: validation

Validate before calling

function $hasElementFor(editor: LexicalEditor, node: LexicalNode): boolean {
  return editor.getElementByKey(node.getKey()) != null;
}

Type guard

function $canGetTableDOM(editor: LexicalEditor, tableNode: TableNode): boolean {
  return $isTableNode(tableNode) && editor.getElementByKey(tableNode.getKey()) !== null;
}

Try / catch

try {
  const table = $getElementForTableNode(editor, tableNode);
} catch (e) {
  if (e instanceof Error && e.message === 'Table Element Not Found') return null;
  throw e;
}

Prevention

When it happens

Trigger: Calling $getElementForTableNode with a headless editor or an editor whose table element is not mounted in the document; passing a TableNode from a different editor instance; calling outside an active reconciliation window after the node was removed.

Common situations: Programmatic table inspection in tests without rendering; accessing table DOM data after the table was deleted; using the wrong LexicalEditor's getElementByKey in multi-editor setups.

Related errors


AI-assisted analysis of BookStackApp/BookStack@18f8469a1c (2026-09-02). Data as JSON: /api/errors/1e863809621e5fb5. Report an issue: GitHub.