From 392d6c8ce4df671e6f8efe2b1fa3612b469693fe Mon Sep 17 00:00:00 2001 From: Artur Arseniev Date: Wed, 4 Dec 2024 13:37:21 -0300 Subject: [PATCH 1/6] Improve custom RTE by passing the view (#6339) --- .../dom_components/view/ComponentTextView.ts | 5 ++-- .../src/rich_text_editor/config/config.ts | 12 +++++++--- packages/core/src/rich_text_editor/index.ts | 23 +++++++++---------- 3 files changed, 23 insertions(+), 17 deletions(-) diff --git a/packages/core/src/dom_components/view/ComponentTextView.ts b/packages/core/src/dom_components/view/ComponentTextView.ts index 2c8c9bf02..adc9cc4a1 100644 --- a/packages/core/src/dom_components/view/ComponentTextView.ts +++ b/packages/core/src/dom_components/view/ComponentTextView.ts @@ -71,7 +71,7 @@ export default class ComponentTextView { /** * If true, the returned HTML content will be parsed into Components, allowing @@ -11,16 +17,16 @@ export interface CustomRTE { /** * Create or enable the custom RTE. */ - enable: (el: HTMLElement, rte: T | undefined) => T | Promise; + enable: (el: HTMLElement, rte: T | undefined, opts: CustomRteOptions) => T | Promise; /** * Disable the custom RTE. */ - disable: (el: HTMLElement, rte: T) => any | Promise; + disable: (el: HTMLElement, rte: T, opts: CustomRteOptions) => any | Promise; /** * Get HTML content from the custom RTE. * If not specified, it will use the innerHTML of the element (passed also as `content` in options). */ - getContent?: (el: HTMLElement, rte: T | undefined) => string | Promise; + getContent?: (el: HTMLElement, rte: T | undefined, opts: CustomRteOptions) => string | Promise; /** * Destroy the custom RTE. * Will be triggered on editor destroy. diff --git a/packages/core/src/rich_text_editor/index.ts b/packages/core/src/rich_text_editor/index.ts index 05fe6fe93..10e246051 100644 --- a/packages/core/src/rich_text_editor/index.ts +++ b/packages/core/src/rich_text_editor/index.ts @@ -40,14 +40,14 @@ import { debounce, isFunction, isString } from 'underscore'; import { Module } from '../abstract'; import { Debounced, DisableOptions, Model } from '../common'; -import ComponentView from '../dom_components/view/ComponentView'; import EditorModel from '../editor/model/Editor'; import { createEl, cx, on, removeEl } from '../utils/dom'; import { hasWin, isDef } from '../utils/mixins'; -import defConfig, { CustomRTE, RichTextEditorConfig } from './config/config'; +import defConfig, { CustomRTE, CustomRteOptions, RichTextEditorConfig } from './config/config'; import RichTextEditor, { RichTextEditorAction } from './model/RichTextEditor'; import CanvasEvents from '../canvas/types'; import { ComponentsEvents } from '../dom_components/types'; +import ComponentTextView from '../dom_components/view/ComponentTextView'; export type RichTextEditorEvent = 'rte:enable' | 'rte:disable' | 'rte:custom'; @@ -64,7 +64,7 @@ const events = { }; interface ModelRTE { - currentView?: ComponentView; + currentView?: ComponentTextView; } export interface RteDisableResult { @@ -360,13 +360,13 @@ export default class RichTextEditorModule extends Module Date: Wed, 4 Dec 2024 17:44:41 +0100 Subject: [PATCH 2/6] fix: ensure the pointer-init class is removed when updating the "locked" state (#6312) fix: ensure the pointer init class is removed when updating locked status --- .../src/dom_components/view/ComponentView.ts | 2 +- .../specs/dom_components/view/ComponentView.ts | 16 ++++++++++++++++ 2 files changed, 17 insertions(+), 1 deletion(-) diff --git a/packages/core/src/dom_components/view/ComponentView.ts b/packages/core/src/dom_components/view/ComponentView.ts index 0b17c9560..610213f81 100644 --- a/packages/core/src/dom_components/view/ComponentView.ts +++ b/packages/core/src/dom_components/view/ComponentView.ts @@ -241,7 +241,7 @@ TComp> { const hoveredCls = `${ppfx}hovered`; const noPointerCls = `${ppfx}no-pointer`; const pointerInitCls = `${ppfx}pointer-init`; - const toRemove = [selectedCls, selectedParentCls, freezedCls, hoveredCls, noPointerCls]; + const toRemove = [selectedCls, selectedParentCls, freezedCls, hoveredCls, noPointerCls, pointerInitCls]; const selCls = extHl && !opts.noExtHl ? '' : selectedCls; this.$el.removeClass(toRemove.join(' ')); const actualCls = el.getAttribute('class') || ''; diff --git a/packages/core/test/specs/dom_components/view/ComponentView.ts b/packages/core/test/specs/dom_components/view/ComponentView.ts index 37de21f7d..8f0ae1e20 100644 --- a/packages/core/test/specs/dom_components/view/ComponentView.ts +++ b/packages/core/test/specs/dom_components/view/ComponentView.ts @@ -143,4 +143,20 @@ describe('ComponentView', () => { const result = model.getAttributes(); expect(result.class).toEqual(undefined); }); + + test('updateStatus removes previous classes and adds new ones', () => { + model.addClass('selected'); + + model.set('locked', true); + view.updateStatus(); + expect(view.el.getAttribute('class')).toEqual('no-pointer'); + + model.set('locked', false); + view.updateStatus(); + expect(view.el.getAttribute('class')).toEqual('pointer-init'); + + model.set('locked'); + view.updateStatus(); + expect(view.el.getAttribute('class')).toEqual(''); + }); }); From 0db672914aa1feb4d145e0be5e9b9da816ca9aaf Mon Sep 17 00:00:00 2001 From: Artur Arseniev Date: Wed, 4 Dec 2024 15:34:55 -0300 Subject: [PATCH 3/6] Fix getComponentsFromDefs (#6340) --- packages/core/src/dom_components/model/Components.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/core/src/dom_components/model/Components.ts b/packages/core/src/dom_components/model/Components.ts index a8d225412..11a158275 100644 --- a/packages/core/src/dom_components/model/Components.ts +++ b/packages/core/src/dom_components/model/Components.ts @@ -64,7 +64,7 @@ const getComponentsFromDefs = ( } if (components) { - const newComponents = getComponentsFromDefs(components, all); + const newComponents = getComponentsFromDefs(components, all, opts); if (isFunction(result.components)) { const cmps = result.components(); From b833ae9d7502fdd89e71cd4436d2c38e0cb1ffd8 Mon Sep 17 00:00:00 2001 From: Artur Arseniev Date: Wed, 4 Dec 2024 16:04:37 -0300 Subject: [PATCH 4/6] Prevent infinite request loop with srcset in image (#6341) Prevent infinite request loop with srcset in image. Closes #6332 --- .../core/src/dom_components/view/ComponentImageView.ts | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/packages/core/src/dom_components/view/ComponentImageView.ts b/packages/core/src/dom_components/view/ComponentImageView.ts index d127bfc99..19d9de56b 100644 --- a/packages/core/src/dom_components/view/ComponentImageView.ts +++ b/packages/core/src/dom_components/view/ComponentImageView.ts @@ -95,9 +95,12 @@ export default class ComponentImageView Date: Thu, 5 Dec 2024 17:05:43 -0300 Subject: [PATCH 5/6] Additional fixes to getComponentsFromDefs (#6342) --- packages/core/src/dom_components/model/Components.ts | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/packages/core/src/dom_components/model/Components.ts b/packages/core/src/dom_components/model/Components.ts index 11a158275..26b609155 100644 --- a/packages/core/src/dom_components/model/Components.ts +++ b/packages/core/src/dom_components/model/Components.ts @@ -63,15 +63,20 @@ const getComponentsFromDefs = ( } } + // Here `result` might be a Component + const cmp = isFunction(result.components) ? (result as unknown as Component) : null; + if (components) { const newComponents = getComponentsFromDefs(components, all, opts); - if (isFunction(result.components)) { - const cmps = result.components(); - cmps.length > 0 && cmps.reset(newComponents, opts); + if (cmp) { + cmp.components().reset(newComponents, opts); } else { result.components = newComponents; } + } else if (cmp) { + // The component already exists but the parsed one is without components + cmp.components().reset([], opts); } return result; From a85d4140f7bd910e38c459c9a9e9b9e8578b724d Mon Sep 17 00:00:00 2001 From: Artur Arseniev Date: Thu, 5 Dec 2024 17:15:11 -0300 Subject: [PATCH 6/6] Release GrapesJS core latest: v0.22.4 (#6344) --- packages/core/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/core/package.json b/packages/core/package.json index 0006d1dcc..4ceaf21e9 100644 --- a/packages/core/package.json +++ b/packages/core/package.json @@ -1,7 +1,7 @@ { "name": "grapesjs", "description": "Free and Open Source Web Builder Framework", - "version": "0.22.3", + "version": "0.22.4", "author": "Artur Arseniev", "license": "BSD-3-Clause", "homepage": "http://grapesjs.com",