Skip to content

Базовые классы

Базовыми классами для работы редактора, его моделей и событий служат EventManager и BaseModel. От BaseModel наследуются все остальные модели, включая BlockModel, ToolModel, ActionModel, ExtensionModel и FileActionModel.

BaseModel

Базовый класс модели, предоставляющий основную функциональность, управление событиями и хуки жизненного цикла.

Методы базовой модели

ФункцияСигнатураОписание
Конструкторpublic constructor(editor: Texditor)Создаёт новый экземпляр базовой модели.
getEventIdpublic getEventId(): stringВозвращает уникальный идентификатор для экземпляра слушателя событий.
getConfigpublic getConfig<K extends keyof BaseModelConfig>(key: K, defaultValue?: BaseModelConfig[K]): BaseModelConfig[K]Получает значение конфигурации по ключу.
getOptionpublic getOption<T = unknown>(key: string, defaultValue?: T): T | nullПолучает значение опции по ключу.
setOptionpublic setOption(key: string, value: unknown): voidУстанавливает значение опции.
setOptionspublic setOptions(options: Record<string, unknown>): voidУстанавливает несколько опций (объединяет с существующими).
getOptionspublic getOptions(): Record<string, unknown>Возвращает копию всех опций.
removeOptionpublic removeOption(key: string): booleanУдаляет опцию по ключу. Возвращает true, если опция существовала и была удалена.
clearOptionspublic clearOptions(): voidОчищает все опции.
setStorepublic setStore(key: string, value: unknown): thisУстанавливает значение в хранилище. Возвращает текущий экземпляр для цепочки вызовов.
getStorepublic getStore(key: string | null): unknownПолучает значение из хранилища. Если key равен null, возвращает всё хранилище.
getNamepublic getName(): stringВозвращает имя модели.
getElementTagNamepublic getElementTagName(): stringВозвращает имя тега элемента модели.
getIdpublic getId(): stringВозвращает уникальный идентификатор модели.
getElementpublic getElement(): TElementВозвращает DOM-элемент модели.
getClassNamepublic getClassName(): stringВозвращает имя CSS-класса.
getRootClassNamepublic getRootClassName(): stringВозвращает корневое имя CSS-класса.
getTranslationpublic getTranslation(): stringВозвращает переведённую строку для локализации.
getIconpublic getIcon(): RenderIconContentВозвращает содержимое иконки для кнопки модели.
getIconWidthpublic getIconWidth(): numberВозвращает ширину иконки в пикселях.
getIconHeightpublic getIconHeight(): numberВозвращает высоту иконки в пикселях.
getModelCodepublic getModelCode(): stringВозвращает код модели.
isVisibleTitlepublic isVisibleTitle(): booleanПроверяет, виден ли заголовок всегда.
isAttributeTitlepublic isAttributeTitle(): booleanПроверяет, виден ли атрибут заголовка.
isVisibleIconpublic isVisibleIcon(): booleanПроверяет, видна ли иконка всегда.
isActivepublic isActive(): booleanПроверяет, активна ли модель.
isVisiblepublic isVisible(): booleanПроверяет, видна ли модель.
destroypublic destroy(): voidУничтожает экземпляр и очищает ресурсы.

Защищённые и статические методы базовой модели

ФункцияСигнатураОписание
setuppublic static setup(config: Partial<BaseModelConfig>): ModelConstructorУстанавливает глобальную конфигурацию для модели.
createElementprotected createElement(): TElementСоздаёт DOM-элемент модели.
onCreateElementprotected onCreateElement(_el: TElement): voidХук, вызываемый после создания элемента модели.
parentOnCreateElementprotected parentOnCreateElement(_el: TElement): voidРодительский хук, вызываемый после создания элемента модели.
onLoadprotected onLoad(): voidХук, вызываемый при загрузке модели.
onClickprotected onClick(_evt: MouseEvent): voidХук, вызываемый при клике на элемент модели.
parentOnClickprotected parentOnClick(evt: MouseEvent): voidРодительский хук, вызываемый после клика на элемент модели.
onMountprotected onMount(_el: TElement): voidХук, вызываемый после монтирования в DOM.
parentOnMountprotected parentOnMount(_el: TElement): voidРодительский хук, вызываемый после монтирования в DOM.
onConstructprotected onConstruct(_editor: Texditor): voidХук, вызываемый во время создания конструктора.
parentConfigprotected parentConfig(): Partial<BaseModelConfig>Возвращает конфигурацию родительской модели.
configureprotected configure(): Partial<BaseModelConfig>Настраивает конфигурацию модели.
parentDestroyprotected parentDestroy(): voidРодительский хук, вызываемый перед уничтожением элемента.

Типы и интерфейсы базовой модели

typescript
/**
 * Интерфейс DOM-элемента, расширяющий HTMLElement с ссылкой на базовую модель.
 */
export interface BaseElement extends HTMLElement {
 /** Ссылка на экземпляр базовой модели */
 baseModel: BaseModel;
}

/**
 * Интерфейс конфигурации модели.
 * @property name - Имя модели
 * @property elementTagName - Имя тега элемента модели
 * @property translation - Ключ перевода для локализации
 * @property icon - Содержимое иконки для кнопки
 * @property visibleIcon - Видна ли иконка
 * @property iconWidth - Ширина иконки в пикселях
 * @property iconHeight - Высота иконки в пикселях
 * @property className - Имя CSS-класса
 * @property attributeTitle - Виден ли атрибут заголовка
 * @property visibleTitle - Виден ли заголовок
 * @property __modelCode - Уникальный код модели
 */
export interface BaseModelConfig {
 name: string;
 elementTagName: string;
 translation: string;
 icon: RenderIconContent;
 visibleIcon: boolean;
 iconWidth: number;
 iconHeight: number;
 className: string;
 attributeTitle: boolean;
 visibleTitle: boolean;
 __modelCode: string;
 [key: string]: unknown;
}

/**
 * Универсальный интерфейс конструктора модели.
 * @template T - Тип интерфейса модели, расширяющий BaseModel
 * @template C - Тип конфигурации модели, расширяющий BaseModelConfig
 */
export interface ModelConstructor<T extends BaseModel = BaseModel, C extends BaseModelConfig = BaseModelConfig> {
 /**
  * Создаёт новый экземпляр модели.
  * @param editor - Экземпляр редактора
  * @returns Экземпляр модели типа T
  */
 new (editor: Texditor): T;
 /**
  * Устанавливает глобальную конфигурацию для модели.
  * @param config - Объект конфигурации
  * @returns Конструктор модели
  */
 setup?(config: Partial<C>): ModelConstructor<T, C>;
}

/**
 * Тип конструктора базовой модели.
 */
export type BaseModelConstructor = ModelConstructor<BaseModel, BaseModelConfig>;

/**
 * Интерфейс базовой модели.
 */
export interface BaseModel<TElement extends BaseElement = BaseElement> extends EventManager {
 getEventId(): string;
 getName(): string;
 getElementTagName(): string;
 getId(): string;
 getElement(): TElement;
 getClassName(): string;
 getRootClassName(): string;
 getTranslation(): string;
 getIcon(): RenderIconContent;
 getIconWidth(): number;
 getIconHeight(): number;
 getModelCode(): string;
 isVisibleTitle(): boolean;
 isAttributeTitle(): boolean;
 isVisibleIcon(): boolean;
 isActive(): boolean;
 isVisible(): boolean;
 destroy(): void;
 getConfig<K extends keyof BaseModelConfig>(key: K, defaultValue?: BaseModelConfig[K]): BaseModelConfig[K];
 getConfig(key: string, defaultValue: unknown): unknown;
 getOption<T = unknown>(key: string, defaultValue?: T): T | null;
 setOption(key: string, value: unknown): void;
 setOptions(options: Record<string, unknown>): void;
 getOptions(): Record<string, unknown>;
 removeOption(key: string): boolean;
 clearOptions(): void;
 setStore(key: string, value: unknown): this;
 getStore(key: string | null): unknown;
}

Пример расширения класса базовой модели

typescript
import { type BaseModelConfig } from "texditor";
import { BaseModel } from "texditor/core/base";

export default class CustomModel extends BaseModel {
 protected onClick(evt: MouseEvent): void {
  console.log('CustomModel кликнута!', evt);
 }

 protected configure(): Partial<BaseModelConfig> {
  return {
   __modelCode: 'custom', // Обязательный уникальный внутренний код модели
   name: 'CustomModel',
   icon: '<svg>...</svg>',
   className: 'custom-model-class',
  };
 }
}
javascript
import { BaseModel } from "texditor/core/base";

export default class CustomModel extends BaseModel {
 onClick(evt) {
  console.log('CustomModel кликнута!', evt);
 }

 configure() {
  return {
   __modelCode: 'custom', // Обязательный уникальный внутренний код модели
   name: 'CustomModel',
   icon: '<svg>...</svg>',
   className: 'custom-model-class',
  };
 }
}

EventManager

Класс для управления событиями.

Методы управления событиями

ФункцияСигнатураОписание
onpublic on(name: string, callback: CallableFunction): voidДобавляет обработчик события.
hasEventpublic hasEvent(name: string): booleanПроверяет, существует ли обработчик события.
offpublic off(name: string, id?: string): booleanУдаляет обработчик события. Возвращает true, если удаление прошло успешно.
triggerpublic trigger(name: string, params?: TexditorEventBase): voidВызывает все обработчики для события.

Типы и интерфейсы управления событиями

typescript
/**
 * Структура хранения триггеров событий.
 * Сопоставляет имена событий с коллекциями функций обратного вызова с уникальными идентификаторами.
 */
export type EventTriggerObject = {
 [name: string]: {
  [id: string]: CallableFunction;
 };
};

/**
 * Базовый интерфейс события редактора.
 * @property type - Тип события
 */
export interface TexditorEventBase {
 type: string;
 [key: string]: unknown;
}

/**
 * Интерфейс для управления событиями.
 */
export interface EventManager {
 on(name: string, callback: CallableFunction): void;
 hasEvent(name: string): boolean;
 off(name: string, id?: string): boolean;
 trigger(name: string, params?: TexditorEventBase): void;
}

Пример расширения менеджера событий

Так как менеджер событий это абстрактный класс, рассмотрим его на примере пользовательской модели, которая расширяет класс BaseModel, а тот, в свою очередь, расширяет класс EventManager.

typescript
import {
 BaseElement,
 type TexditorEvent,
 type BaseModelConfig
} from "texditor";
import { BaseModel } from "texditor/core/base";

// BaseModel уже имеет все методы EventManager
export default class CustomModel extends BaseModel {
 protected onClick(evt: MouseEvent): void {
  // Создаем триггер 
  this.trigger('customClicked', {
   domEvent: evt,
   // любой свободный параметр или параметры события редактора
  });
 }

 protected configure(): Partial<BaseModelConfig> {
  return {
   __modelCode: 'custom',
   name: 'CustomModel',
   icon: '<svg>...</svg>',
   className: 'custom-model-class',
  };
 }

 protected onLoad(): void {
  this.on('customMount', (evt: TexditorEvent) => {
   console.log('Подписались на событие customMount');
  });
 }

 protected onMount(el: BaseElement): void {
  this.trigger('customClicked');
 }
}
javascript
import { BaseElement } from "texditor";
import { BaseModel } from "texditor/core/base";

// BaseModel уже имеет все методы EventManager
export default class CustomModel extends BaseModel {
 onClick(evt) {
  // Создаем триггер 
  this.trigger('customClicked', {
   domEvent: evt,
   // любой свободный параметр или параметры события редактора
  });
 }

 configure() {
  return {
   __modelCode: 'custom',
   name: 'CustomModel',
   icon: '<svg>...</svg>',
   className: 'custom-model-class',
  };
 }

 onLoad() {
  this.on('customMount', (evt) => {
   console.log('Подписались на событие customMount');
  });
 }

 onMount(el) {
  this.trigger('customClicked');
 }
}

dev@priveted.com | priveted.com