import {registerTableSelectionHandler} from "./ui/framework/helpers/table-selection-handler";
import {el} from "./utils/dom";
import {registerShortcuts} from "./services/shortcuts";
-import {registerNodeResizer} from "./ui/framework/helpers/image-resizer";
+import {registerNodeResizer} from "./ui/framework/helpers/node-resizer";
export function createPageEditorInstance(container: HTMLElement, htmlContent: string, options: Record<string, any> = {}): SimpleWysiwygEditorInterface {
const config: CreateEditorArgs = {
ElementNode,
LexicalEditor,
LexicalNode,
- SerializedElementNode, Spread
+ Spread
} from 'lexical';
import type {EditorConfig} from "lexical/LexicalEditor";
-import {el, sizeToPixels} from "../utils/dom";
+import {el, setOrRemoveAttribute, sizeToPixels} from "../utils/dom";
import {
CommonBlockAlignment,
SerializedCommonBlockNode,
setCommonBlockPropsFromElement,
updateElementWithCommonBlockProps
} from "./_common";
-import {elem} from "../../services/dom";
import {$selectSingleNode} from "../utils/selection";
export type MediaNodeTag = 'iframe' | 'embed' | 'object' | 'video' | 'audio';
return wrap;
}
- updateDOM(prevNode: unknown, dom: HTMLElement) {
- return true;
+ updateDOM(prevNode: MediaNode, dom: HTMLElement): boolean {
+ if (prevNode.__tag !== this.__tag) {
+ return true;
+ }
+
+ if (JSON.stringify(prevNode.__sources) !== JSON.stringify(this.__sources)) {
+ return true;
+ }
+
+ if (JSON.stringify(prevNode.__attributes) !== JSON.stringify(this.__attributes)) {
+ return true;
+ }
+
+ const mediaEl = dom.firstElementChild as HTMLElement;
+
+ if (prevNode.__id !== this.__id) {
+ setOrRemoveAttribute(mediaEl, 'id', this.__id);
+ }
+
+ if (prevNode.__alignment !== this.__alignment) {
+ if (prevNode.__alignment) {
+ dom.classList.remove(`align-${prevNode.__alignment}`);
+ mediaEl.classList.remove(`align-${prevNode.__alignment}`);
+ }
+ if (this.__alignment) {
+ dom.classList.add(`align-${this.__alignment}`);
+ mediaEl.classList.add(`align-${this.__alignment}`);
+ }
+ }
+
+ return false;
}
static importDOM(): DOMConversionMap|null {
if (templateId) {
insertTemplateToEditor(editor, templateId, event);
event.preventDefault();
+ event.stopPropagation();
return true;
}
$insertNodesAtEvent(newNodes, event, editor);
});
event.preventDefault();
+ event.stopPropagation();
return true;
}
const handled = handleMediaInsert(event.dataTransfer, context);
if (handled) {
event.preventDefault();
+ event.stopPropagation();
return true;
}
}
const unregisterDrop = context.editor.registerCommand(DROP_COMMAND, dropListener, COMMAND_PRIORITY_HIGH);
const unregisterPaste = context.editor.registerCommand(PASTE_COMMAND, pasteListener, COMMAND_PRIORITY_HIGH);
+ context.scrollDOM.addEventListener('drop', dropListener);
return () => {
unregisterDrop();
unregisterPaste();
+ context.scrollDOM.removeEventListener('drop', dropListener);
};
}
\ No newline at end of file
## Bugs
-- Template drag/drop not handled when outside core editor area (ignored in margin area).
\ No newline at end of file
+//
\ No newline at end of file
return;
}
- const nodeDOMBounds = nodeDOM.getBoundingClientRect();
- this.dom.style.left = nodeDOM.offsetLeft + 'px';
- this.dom.style.top = nodeDOM.offsetTop + 'px';
- this.dom.style.width = nodeDOMBounds.width + 'px';
- this.dom.style.height = nodeDOMBounds.height + 'px';
+ const scrollAreaRect = this.scrollContainer.getBoundingClientRect();
+ const nodeRect = nodeDOM.getBoundingClientRect();
+ const top = nodeRect.top - (scrollAreaRect.top - this.scrollContainer.scrollTop);
+ const left = nodeRect.left - scrollAreaRect.left;
+
+ this.dom.style.top = `${top}px`;
+ this.dom.style.left = `${left}px`;
+ this.dom.style.width = nodeRect.width + 'px';
+ this.dom.style.height = nodeRect.height + 'px';
}
protected updateDOMSize(width: number, height: number): void {
}
return map;
+}
+
+export function setOrRemoveAttribute(element: HTMLElement, name: string, value: string|null|undefined) {
+ if (value) {
+ element.setAttribute(name, value);
+ } else {
+ element.removeAttribute(name);
+ }
}
\ No newline at end of file
}
.editor-media-wrap {
+ display: inline-block;
cursor: not-allowed;
iframe {
pointer-events: none;
}
+ &.align-left {
+ float: left;
+ }
+ &.align-right {
+ float: right;
+ }
+ &.align-center {
+ display: block;
+ margin-inline: auto;
+ }
}
/**