mirror of
https://github.com/BookStackApp/BookStack.git
synced 2025-08-09 10:22:51 +03:00
Lexical: Fixed media resize handling
- Updating height/width setting to clear any inline CSS width/height rules which would override and prevent resizes showing. This was common when switching media from old editor. Added test to cover. - Updated resizer to track node so that it is retained & displayed across node DOM changes, which was previously causing the resizer/focus to disappear.
This commit is contained in:
@@ -8,7 +8,7 @@ import {
|
||||
} from 'lexical';
|
||||
import type {EditorConfig} from "lexical/LexicalEditor";
|
||||
|
||||
import {el, setOrRemoveAttribute, sizeToPixels} from "../../utils/dom";
|
||||
import {el, setOrRemoveAttribute, sizeToPixels, styleMapToStyleString, styleStringToStyleMap} from "../../utils/dom";
|
||||
import {
|
||||
CommonBlockAlignment, deserializeCommonBlockNode,
|
||||
setCommonBlockPropsFromElement,
|
||||
@@ -46,6 +46,19 @@ function filterAttributes(attributes: Record<string, string>): Record<string, st
|
||||
return filtered;
|
||||
}
|
||||
|
||||
function removeStyleFromAttributes(attributes: Record<string, string>, styleName: string): Record<string, string> {
|
||||
const attrCopy = Object.assign({}, attributes);
|
||||
if (!attributes.style) {
|
||||
return attrCopy;
|
||||
}
|
||||
|
||||
const map = styleStringToStyleMap(attributes.style);
|
||||
map.delete(styleName);
|
||||
|
||||
attrCopy.style = styleMapToStyleString(map);
|
||||
return attrCopy;
|
||||
}
|
||||
|
||||
function domElementToNode(tag: MediaNodeTag, element: HTMLElement): MediaNode {
|
||||
const node = $createMediaNode(tag);
|
||||
|
||||
@@ -118,7 +131,7 @@ export class MediaNode extends ElementNode {
|
||||
|
||||
getAttributes(): Record<string, string> {
|
||||
const self = this.getLatest();
|
||||
return self.__attributes;
|
||||
return Object.assign({}, self.__attributes);
|
||||
}
|
||||
|
||||
setSources(sources: MediaNodeSource[]) {
|
||||
@@ -132,7 +145,7 @@ export class MediaNode extends ElementNode {
|
||||
}
|
||||
|
||||
setSrc(src: string): void {
|
||||
const attrs = Object.assign({}, this.getAttributes());
|
||||
const attrs = this.getAttributes();
|
||||
if (this.__tag ==='object') {
|
||||
attrs.data = src;
|
||||
} else {
|
||||
@@ -142,11 +155,13 @@ export class MediaNode extends ElementNode {
|
||||
}
|
||||
|
||||
setWidthAndHeight(width: string, height: string): void {
|
||||
const attrs = Object.assign(
|
||||
{},
|
||||
let attrs: Record<string, string> = Object.assign(
|
||||
this.getAttributes(),
|
||||
{width, height},
|
||||
);
|
||||
|
||||
attrs = removeStyleFromAttributes(attrs, 'width');
|
||||
attrs = removeStyleFromAttributes(attrs, 'height');
|
||||
this.setAttributes(attrs);
|
||||
}
|
||||
|
||||
@@ -185,8 +200,8 @@ export class MediaNode extends ElementNode {
|
||||
return;
|
||||
}
|
||||
|
||||
const attrs = Object.assign({}, this.getAttributes(), {height});
|
||||
this.setAttributes(attrs);
|
||||
const attrs = Object.assign(this.getAttributes(), {height});
|
||||
this.setAttributes(removeStyleFromAttributes(attrs, 'height'));
|
||||
}
|
||||
|
||||
getHeight(): number {
|
||||
@@ -195,8 +210,9 @@ export class MediaNode extends ElementNode {
|
||||
}
|
||||
|
||||
setWidth(width: number): void {
|
||||
const attrs = Object.assign({}, this.getAttributes(), {width});
|
||||
this.setAttributes(attrs);
|
||||
const existingAttrs = this.getAttributes();
|
||||
const attrs: Record<string, string> = Object.assign(existingAttrs, {width});
|
||||
this.setAttributes(removeStyleFromAttributes(attrs, 'width'));
|
||||
}
|
||||
|
||||
getWidth(): number {
|
||||
|
Reference in New Issue
Block a user