From 61b49569b2b3a8d4f0071e7182a28fbca03802ca Mon Sep 17 00:00:00 2001 From: Artur Arseniev Date: Fri, 24 Oct 2025 15:23:21 +0400 Subject: [PATCH] Move editor events --- packages/core/src/block_manager/types.ts | 7 +++ packages/core/src/editor/index.ts | 73 ++++++++++-------------- packages/core/src/editor/types.ts | 45 +++++++++++++++ 3 files changed, 82 insertions(+), 43 deletions(-) diff --git a/packages/core/src/block_manager/types.ts b/packages/core/src/block_manager/types.ts index 13f74cdef..9cce17c82 100644 --- a/packages/core/src/block_manager/types.ts +++ b/packages/core/src/block_manager/types.ts @@ -1,4 +1,5 @@ import { ItemsByCategory } from '../abstract/ModuleCategory'; +import { AddOptions, RemoveOptions } from '../common'; import Block from './model/Block'; export interface BlocksByCategory extends ItemsByCategory {} @@ -77,5 +78,11 @@ export enum BlocksEvents { } /**{END_EVENTS}*/ +export interface BlocksEventCallback { + [BlocksEvents.add]: [Block, AddOptions]; + [BlocksEvents.remove]: [Block, RemoveOptions]; + [BlocksEvents.update]: [Block, AddOptions]; +} + // need this to avoid the TS documentation generator to break export default BlocksEvents; diff --git a/packages/core/src/editor/index.ts b/packages/core/src/editor/index.ts index 20d738360..24fb7a9b3 100644 --- a/packages/core/src/editor/index.ts +++ b/packages/core/src/editor/index.ts @@ -44,43 +44,49 @@ */ import { IBaseModule } from '../abstract/Module'; import AssetManager from '../asset_manager'; -import { AssetEvent } from '../asset_manager/types'; -import BlockManager, { BlockEvent } from '../block_manager'; -import CanvasModule, { CanvasEvent } from '../canvas'; +import BlockManager from '../block_manager'; +import CanvasModule from '../canvas'; import CodeManagerModule from '../code_manager'; -import CommandsModule, { CommandEvent } from '../commands'; -import { AddOptions, EventHandler, LiteralUnion } from '../common'; +import CommandsModule from '../commands'; +import { AddOptions, EventHandler } from '../common'; import CssComposer from '../css_composer'; import CssRule from '../css_composer/model/CssRule'; import CssRules from '../css_composer/model/CssRules'; import DataSourceManager from '../data_sources'; import DeviceManager from '../device_manager'; -import ComponentManager, { ComponentEvent } from '../dom_components'; +import ComponentManager from '../dom_components'; import Component from '../dom_components/model/Component'; import Components from '../dom_components/model/Components'; import ComponentWrapper from '../dom_components/model/ComponentWrapper'; import { AddComponentsOption, ComponentAdd, DragMode } from '../dom_components/model/types'; import StyleableModel from '../domain_abstract/model/StyleableModel'; import I18nModule from '../i18n'; -import KeymapsModule, { KeymapEvent } from '../keymaps'; -import ModalModule, { ModalEvent } from '../modal_dialog'; +import KeymapsModule from '../keymaps'; +import ModalModule from '../modal_dialog'; import LayerManager from '../navigator'; import PageManager from '../pages'; import PanelManager from '../panels'; import ParserModule from '../parser'; import { CustomParserCss } from '../parser/config/config'; -import RichTextEditorModule, { RichTextEditorEvent } from '../rich_text_editor'; +import RichTextEditorModule from '../rich_text_editor'; import { CustomRTE } from '../rich_text_editor/config/config'; -import SelectorManager, { SelectorEvent } from '../selector_manager'; -import StorageManager, { ProjectData, StorageEvent, StorageOptions } from '../storage_manager'; -import StyleManager, { StyleManagerEvent } from '../style_manager'; +import SelectorManager from '../selector_manager'; +import StorageManager, { ProjectData, StorageOptions } from '../storage_manager'; +import StyleManager from '../style_manager'; import TraitManager from '../trait_manager'; import UndoManagerModule from '../undo_manager'; import UtilsModule from '../utils'; import html from '../utils/html'; import defConfig, { EditorConfig, EditorConfigKeys } from './config/config'; import EditorModel, { EditorLoadOptions } from './model/Editor'; -import { EditorEvents } from './types'; +import { + EditorConfigType, + EditorEvent, + EditorEventCallbacks, + EditorEventHandler, + EditorEvents, + EditorModelParam, +} from './types'; import EditorView from './view/EditorView'; export type ParsedRule = { @@ -90,28 +96,6 @@ export type ParsedRule = { params?: string; }; -type GeneralEvent = 'canvasScroll' | 'undo' | 'redo' | 'load' | 'update'; - -type EditorBuiltInEvents = - | ComponentEvent - | BlockEvent - | AssetEvent - | KeymapEvent - | StyleManagerEvent - | StorageEvent - | CanvasEvent - | SelectorEvent - | RichTextEditorEvent - | ModalEvent - | CommandEvent - | GeneralEvent; - -type EditorEvent = LiteralUnion; - -type EditorConfigType = EditorConfig & { pStylePrefix?: string }; - -type EditorModelParam = Parameters[N]; - export type EditorParam = Parameters[N]; export default class Editor implements IBaseModule { @@ -733,8 +717,8 @@ export default class Editor implements IBaseModule { * @param {Function} callback Callback function * @return {this} */ - on(event: EditorEvent, callback: EventHandler) { - this.em.on(event, callback); + on(event: E, callback: EditorEventHandler) { + this.em.on(event as string, callback); return this; } @@ -744,8 +728,8 @@ export default class Editor implements IBaseModule { * @param {Function} callback Callback function * @return {this} */ - once(event: EditorEvent, callback: EventHandler) { - this.em.once(event, callback); + once(event: E, callback: EditorEventHandler) { + this.em.once(event as string, callback); return this; } @@ -755,8 +739,8 @@ export default class Editor implements IBaseModule { * @param {Function} callback Callback function * @return {this} */ - off(event: EditorEvent, callback: EventHandler) { - this.em.off(event, callback); + off(event: E, callback: EditorEventHandler) { + this.em.off(event as string, callback); return this; } @@ -765,8 +749,11 @@ export default class Editor implements IBaseModule { * @param {string} event Event to trigger * @return {this} */ - trigger(event: EditorEvent, ...args: any[]) { - this.em.trigger.apply(this.em, [event, ...args]); + trigger( + event: E, + ...args: E extends keyof EditorEventCallbacks ? EditorEventCallbacks[E] : any[] + ) { + this.em.trigger.apply(this.em, [event as string, ...args]); return this; } diff --git a/packages/core/src/editor/types.ts b/packages/core/src/editor/types.ts index 9c4a70955..8bb7dfe2a 100644 --- a/packages/core/src/editor/types.ts +++ b/packages/core/src/editor/types.ts @@ -1,3 +1,48 @@ +import { AssetEvent } from '../asset_manager/types'; +import { BlockEvent } from '../block_manager'; +import { BlocksEventCallback } from '../block_manager/types'; +import { CanvasEvent } from '../canvas'; +import { CommandEvent } from '../commands'; +import { LiteralUnion } from '../common'; +import { ComponentEvent } from '../dom_components'; +import { KeymapEvent } from '../keymaps'; +import { ModalEvent } from '../modal_dialog'; +import { RichTextEditorEvent } from '../rich_text_editor'; +import { SelectorEvent } from '../selector_manager'; +import { StyleManagerEvent } from '../style_manager'; +import { EditorConfig } from './config/config'; +import EditorModel from './model/Editor'; + +type GeneralEvent = 'canvasScroll' | 'undo' | 'redo' | 'load' | 'update'; + +type EditorBuiltInEvents = + | ComponentEvent + | BlockEvent + | AssetEvent + | KeymapEvent + | StyleManagerEvent + | StorageEvent + | CanvasEvent + | SelectorEvent + | RichTextEditorEvent + | ModalEvent + | CommandEvent + | GeneralEvent; + +export type EditorEvent = LiteralUnion; + +export type EditorConfigType = EditorConfig & { pStylePrefix?: string }; + +export type EditorModelParam = Parameters[N]; + +export interface EditorEventCallbacks extends BlocksEventCallback { + [key: string]: any[]; +} + +export type EditorEventHandler = E extends keyof EditorEventCallbacks + ? (...args: EditorEventCallbacks[E]) => void + : (...args: any[]) => void; + /**{START_EVENTS}*/ export enum EditorEvents { /**