diff --git a/packages/devextreme/js/__internal/core/events_strategy.ts b/packages/devextreme/js/__internal/core/events_strategy.ts new file mode 100644 index 000000000000..fc3ef62ca88d --- /dev/null +++ b/packages/devextreme/js/__internal/core/events_strategy.ts @@ -0,0 +1,104 @@ +import { each } from '@js/core/utils/iterator'; +import { isFunction, isPlainObject } from '@js/core/utils/type'; +import { Callbacks } from '@ts/core/utils/m_callbacks'; + +type EventHandler = Function; + +type EventHandlers = Record; + +interface EventCallbacks { + add: (fn?: EventHandler) => void; + originalAdd?: (fn?: EventHandler) => void; + remove: (fn?: EventHandler) => void; + has: () => boolean; + empty: () => void; + fireWith: (context: unknown, args?: ArrayLike) => void; +} + +export interface EventsStrategyOptions { + syncStrategy?: boolean; +} + +export interface EventsStrategyInterface { + on: (eventName: string | EventHandlers, eventHandler?: EventHandler) => void; + off: (eventName: string, eventHandler?: EventHandler) => void; + fireEvent: (eventName: string, eventArgs?: ArrayLike) => unknown; + hasEvent: (eventName: string) => boolean; + dispose: () => void; +} + +export class EventsStrategy implements EventsStrategyInterface { + _events: Record; + + _owner: unknown; + + _options: EventsStrategyOptions; + + constructor(owner: unknown, options: EventsStrategyOptions = {}) { + this._events = {}; + this._owner = owner; + this._options = options; + } + + static create( + owner: unknown, + strategy?: EventsStrategyInterface | ((owner: unknown) => EventsStrategyInterface), + ): EventsStrategyInterface { + if (strategy) { + return isFunction(strategy) ? strategy(owner) : strategy; + } + return new EventsStrategy(owner); + } + + hasEvent(eventName: string): boolean { + const callbacks = this._events[eventName]; + return callbacks ? callbacks.has() : false; + } + + fireEvent(eventName: string, eventArgs?: ArrayLike): unknown { + const callbacks = this._events[eventName]; + if (callbacks) { + callbacks.fireWith(this._owner, eventArgs); + } + return this._owner; + } + + on(eventName: string | EventHandlers, eventHandler?: EventHandler): void { + if (isPlainObject(eventName)) { + each(eventName, (e, h) => { + this.on(e, h); + }); + } else { + let callbacks = this._events[eventName]; + + if (!callbacks) { + callbacks = Callbacks({ + syncStrategy: this._options.syncStrategy, + }); + this._events[eventName] = callbacks; + } + + const addFn = callbacks.originalAdd || callbacks.add; + addFn.call(callbacks, eventHandler); + } + } + + off(eventName: string, eventHandler?: EventHandler): void { + const callbacks = this._events[eventName]; + if (callbacks) { + if (isFunction(eventHandler)) { + callbacks.remove(eventHandler); + } else { + callbacks.empty(); + } + } + } + + dispose(): void { + each(this._events, (eventName, event) => { + event.empty(); + }); + + this._owner = null; + } +} diff --git a/packages/devextreme/js/__internal/core/m_events_strategy.ts b/packages/devextreme/js/__internal/core/m_events_strategy.ts deleted file mode 100644 index 8a5e59ab5192..000000000000 --- a/packages/devextreme/js/__internal/core/m_events_strategy.ts +++ /dev/null @@ -1,76 +0,0 @@ -import Callbacks from '@js/core/utils/callbacks'; -import { each } from '@js/core/utils/iterator'; -import { isFunction, isPlainObject } from '@js/core/utils/type'; - -export class EventsStrategy { - _events: any; - - _owner: any; - - _options: any; - - constructor(owner, options = {}) { - this._events = {}; - this._owner = owner; - this._options = options; - } - - static create(owner, strategy) { - if (strategy) { - return isFunction(strategy) ? strategy(owner) : strategy; - } - return new EventsStrategy(owner); - } - - hasEvent(eventName) { - const callbacks = this._events[eventName]; - return callbacks ? callbacks.has() : false; - } - - fireEvent(eventName, eventArgs) { - const callbacks = this._events[eventName]; - if (callbacks) { - callbacks.fireWith(this._owner, eventArgs); - } - return this._owner; - } - - on(eventName, eventHandler) { - if (isPlainObject(eventName)) { - each(eventName, (e, h) => { - this.on(e, h); - }); - } else { - let callbacks = this._events[eventName]; - - if (!callbacks) { - callbacks = Callbacks({ - syncStrategy: this._options.syncStrategy, - }); - this._events[eventName] = callbacks; - } - - const addFn = callbacks.originalAdd || callbacks.add; - addFn.call(callbacks, eventHandler); - } - } - - off(eventName, eventHandler) { - const callbacks = this._events[eventName]; - if (callbacks) { - if (isFunction(eventHandler)) { - callbacks.remove(eventHandler); - } else { - callbacks.empty(); - } - } - } - - dispose() { - each(this._events, (eventName, event) => { - event.empty(); - }); - - this._owner = null; - } -} diff --git a/packages/devextreme/js/__internal/integration/knockout/validation.ts b/packages/devextreme/js/__internal/integration/knockout/validation.ts index 945c78a188ed..ccdd10307bd4 100644 --- a/packages/devextreme/js/__internal/integration/knockout/validation.ts +++ b/packages/devextreme/js/__internal/integration/knockout/validation.ts @@ -1,6 +1,6 @@ +import { EventsStrategy } from '@ts/core/events_strategy'; import { Guid } from '@ts/core/guid'; import Class from '@ts/core/m_class'; -import { EventsStrategy } from '@ts/core/m_events_strategy'; import { Deferred } from '@ts/core/utils/m_deferred'; import { extend } from '@ts/core/utils/m_extend'; import { each, map } from '@ts/core/utils/m_iterator'; diff --git a/packages/devextreme/js/core/events_strategy.js b/packages/devextreme/js/core/events_strategy.js index d28bcbfc9214..dd556120ee5f 100644 --- a/packages/devextreme/js/core/events_strategy.js +++ b/packages/devextreme/js/core/events_strategy.js @@ -1,2 +1,2 @@ // deprecated -export { EventsStrategy } from '../__internal/core/m_events_strategy'; +export { EventsStrategy } from '../__internal/core/events_strategy';