1 import {EditorContainerUiElement} from "../core";
2 import {el} from "../../../utils/dom";
3 import {EditorFormField} from "../forms";
4 import {$getAllNodesOfType} from "../../../utils/nodes";
5 import {uniqueIdSmall} from "../../../../services/util";
6 import {$isHeadingNode, HeadingNode} from "@lexical/rich-text/LexicalHeadingNode";
8 export class LinkField extends EditorContainerUiElement {
9 protected input: EditorFormField;
10 protected headerMap = new Map<string, HeadingNode>();
12 constructor(input: EditorFormField) {
18 buildDOM(): HTMLElement {
19 const listId = 'editor-form-datalist-' + this.input.getName() + '-' + Date.now();
20 const inputOuterDOM = this.input.getDOMElement();
21 const inputFieldDOM = inputOuterDOM.querySelector('input');
22 inputFieldDOM?.setAttribute('list', listId);
23 inputFieldDOM?.setAttribute('autocomplete', 'off');
24 const datalist = el('datalist', {id: listId});
26 const container = el('div', {
27 class: 'editor-link-field-container',
28 }, [inputOuterDOM, datalist]);
30 inputFieldDOM?.addEventListener('focusin', () => {
31 this.updateDataList(datalist);
34 inputFieldDOM?.addEventListener('input', () => {
35 const value = inputFieldDOM.value;
36 const header = this.headerMap.get(value);
38 this.updateFormFromHeader(header);
45 updateFormFromHeader(header: HeadingNode) {
46 this.getHeaderIdAndText(header).then(({id, text}) => {
47 console.log('updating form', id, text);
48 const modal = this.getContext().manager.getActiveModal('link');
50 modal.getForm().setValues({
59 getHeaderIdAndText(header: HeadingNode): Promise<{id: string, text: string}> {
60 return new Promise((res) => {
61 this.getContext().editor.update(() => {
62 let id = header.getId();
63 console.log('header', id, header.__id);
65 id = 'header-' + uniqueIdSmall();
69 const text = header.getTextContent();
75 updateDataList(listEl: HTMLElement) {
76 this.getContext().editor.getEditorState().read(() => {
77 const headers = $getAllNodesOfType($isHeadingNode) as HeadingNode[];
79 this.headerMap.clear();
80 const listEls: HTMLElement[] = [];
82 for (const header of headers) {
83 const key = 'header-' + header.getKey();
84 this.headerMap.set(key, header);
85 listEls.push(el('option', {
87 label: header.getTextContent().substring(0, 54),
91 listEl.innerHTML = '';
92 listEl.append(...listEls);