UNPKG

devextreme

Version:

HTML5 JavaScript Component Suite for Responsive Web Development

152 lines (151 loc) 4.68 kB
/** * DevExtreme (esm/events/core/emitter.feedback.js) * Version: 21.1.4 * Build date: Mon Jun 21 2021 * * Copyright (c) 2012 - 2021 Developer Express Inc. ALL RIGHTS RESERVED * Read about DevExtreme licensing here: https://js.devexpress.com/Licensing/ */ import Class from "../../core/class"; import { noop, ensureDefined } from "../../core/utils/common"; import { contains } from "../../core/utils/dom"; import devices from "../../core/devices"; import { isMouseEvent } from "../utils/index"; import pointerEvents from "../pointer"; import Emitter from "./emitter"; import registerEmitter from "./emitter_registrator"; var ACTIVE_EVENT_NAME = "dxactive"; var INACTIVE_EVENT_NAME = "dxinactive"; var ACTIVE_TIMEOUT = 30; var INACTIVE_TIMEOUT = 400; var FeedbackEvent = Class.inherit({ ctor: function(timeout, fire) { this._timeout = timeout; this._fire = fire }, start: function() { var that = this; this._schedule((function() { that.force() })) }, _schedule: function(fn) { this.stop(); this._timer = setTimeout(fn, this._timeout) }, stop: function() { clearTimeout(this._timer) }, force: function() { if (this._fired) { return } this.stop(); this._fire(); this._fired = true }, fired: function() { return this._fired } }); var activeFeedback; var FeedbackEmitter = Emitter.inherit({ ctor: function() { this.callBase.apply(this, arguments); this._active = new FeedbackEvent(0, noop); this._inactive = new FeedbackEvent(0, noop) }, configure: function(data, eventName) { switch (eventName) { case ACTIVE_EVENT_NAME: data.activeTimeout = data.timeout; break; case INACTIVE_EVENT_NAME: data.inactiveTimeout = data.timeout } this.callBase(data) }, start: function(e) { if (activeFeedback) { var activeChildExists = contains(this.getElement().get(0), activeFeedback.getElement().get(0)); var childJustActivated = !activeFeedback._active.fired(); if (activeChildExists && childJustActivated) { this._cancel(); return } activeFeedback._inactive.force() } activeFeedback = this; this._initEvents(e); this._active.start() }, _initEvents: function(e) { var that = this; var eventTarget = this._getEmitterTarget(e); var mouseEvent = isMouseEvent(e); var isSimulator = devices.isSimulator(); var deferFeedback = isSimulator || !mouseEvent; var activeTimeout = ensureDefined(this.activeTimeout, ACTIVE_TIMEOUT); var inactiveTimeout = ensureDefined(this.inactiveTimeout, INACTIVE_TIMEOUT); this._active = new FeedbackEvent(deferFeedback ? activeTimeout : 0, (function() { that._fireEvent(ACTIVE_EVENT_NAME, e, { target: eventTarget }) })); this._inactive = new FeedbackEvent(deferFeedback ? inactiveTimeout : 0, (function() { that._fireEvent(INACTIVE_EVENT_NAME, e, { target: eventTarget }); activeFeedback = null })) }, cancel: function(e) { this.end(e) }, end: function(e) { var skipTimers = e.type !== pointerEvents.up; if (skipTimers) { this._active.stop() } else { this._active.force() } this._inactive.start(); if (skipTimers) { this._inactive.force() } }, dispose: function() { this._active.stop(); this._inactive.stop(); if (activeFeedback === this) { activeFeedback = null } this.callBase() }, lockInactive: function() { this._active.force(); this._inactive.stop(); activeFeedback = null; this._cancel(); return this._inactive.force.bind(this._inactive) } }); FeedbackEmitter.lock = function(deferred) { var lockInactive = activeFeedback ? activeFeedback.lockInactive() : noop; deferred.done(lockInactive) }; registerEmitter({ emitter: FeedbackEmitter, events: [ACTIVE_EVENT_NAME, INACTIVE_EVENT_NAME] }); export var lock = FeedbackEmitter.lock; export { ACTIVE_EVENT_NAME as active, INACTIVE_EVENT_NAME as inactive };