diff --git a/src/common/index.ts b/src/common/index.ts index b5ac979e5..df4ff0e61 100644 --- a/src/common/index.ts +++ b/src/common/index.ts @@ -35,3 +35,7 @@ export class Model extends export class Collection extends Backbone.Collection {} export class View extends Backbone.View {} + +export type PickMatching = { [K in keyof T as T[K] extends V ? K : never]: T[K] }; + +export type ExtractMethods = PickMatching; diff --git a/src/dom_components/index.ts b/src/dom_components/index.ts index 0aa642878..e3ee3fe76 100644 --- a/src/dom_components/index.ts +++ b/src/dom_components/index.ts @@ -54,9 +54,9 @@ */ import { isEmpty, isObject, isArray, isFunction, isString, result, debounce } from 'underscore'; import defaults, { DomComponentsConfig } from './config/config'; -import Component, { keyUpdate, keyUpdateInside } from './model/Component'; +import Component, { IComponent, keyUpdate, keyUpdateInside } from './model/Component'; import Components from './model/Components'; -import ComponentView from './view/ComponentView'; +import ComponentView, { IComponentView } from './view/ComponentView'; import ComponentWrapperView from './view/ComponentWrapperView'; import ComponentsView from './view/ComponentsView'; import ComponentTableCell from './model/ComponentTableCell'; @@ -97,7 +97,7 @@ import ComponentFrame from './model/ComponentFrame'; import ComponentFrameView from './view/ComponentFrameView'; import { ItemManagerModule } from '../abstract/Module'; import EditorModel from '../editor/model/Editor'; -import { ComponentAdd } from './model/types'; +import { ComponentAdd, ComponentDefinitionDefined } from './model/types'; export type ComponentEvent = | 'component:create' @@ -117,6 +117,25 @@ export type ComponentEvent = | 'component:drag' | 'component:drag:end'; +export interface ComponentModelDefinition extends IComponent { + defaults?: ComponentDefinitionDefined; + [key: string]: any; +} + +export interface ComponentViewDefinition extends IComponentView { + [key: string]: any; +} + +export interface AddComponentTypeOptions { + isComponent?: (el: HTMLElement) => boolean | ComponentDefinitionDefined | undefined; + model?: Partial & ThisType; + view?: Partial & ThisType; + extend?: string; + extendView?: string; + extendFn?: string[]; + extendFnView?: string[]; +} + export default class ComponentManager extends ItemManagerModule { componentTypes = [ { @@ -433,12 +452,12 @@ export default class ComponentManager extends ItemManagerModule 0), } ); + // @ts-ignore Object.defineProperty(methods.model.prototype, 'defaults', { value: { ...(result(modelToExt.prototype, 'defaults') || {}), @@ -489,8 +510,9 @@ export default class ComponentManager extends ItemManagerModule {} + const escapeRegExp = (str: string) => { return str.replace(/[|\\{}()[\]^$+*?.]/g, '\\$&'); }; diff --git a/src/dom_components/view/ComponentView.ts b/src/dom_components/view/ComponentView.ts index d5bf6e7fa..6a11ec45c 100644 --- a/src/dom_components/view/ComponentView.ts +++ b/src/dom_components/view/ComponentView.ts @@ -5,7 +5,7 @@ import ComponentsView from './ComponentsView'; import Selectors from '../../selector_manager/model/Selectors'; import { replaceWith } from '../../utils/dom'; import { setViewEl } from '../../utils/mixins'; -import { ObjectAny, View } from '../../common'; +import { ExtractMethods, ObjectAny, View } from '../../common'; import { ComponentOptions } from '../model/types'; import EditorModel from '../../editor/model/Editor'; import { DomComponentsConfig } from '../config/config'; @@ -20,6 +20,8 @@ interface Rect { right?: number; } +export interface IComponentView extends ExtractMethods {} + export default class ComponentView extends View