UNPKG

devextreme

Version:

HTML5 JavaScript Component Suite for Responsive Web Development

167 lines (166 loc) 5.97 kB
/** * DevExtreme (esm/animation/transition_executor/transition_executor.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 $ from "../../core/renderer"; import Class from "../../core/class"; import { extend } from "../../core/utils/extend"; import { executeAsync } from "../../core/utils/common"; import { isFunction, isPlainObject } from "../../core/utils/type"; import { map } from "../../core/utils/iterator"; import fx from "../fx"; import { presets } from "../presets/presets"; import { when, Deferred } from "../../core/utils/deferred"; var directionPostfixes = { forward: " dx-forward", backward: " dx-backward", none: " dx-no-direction", undefined: " dx-no-direction" }; var DX_ANIMATING_CLASS = "dx-animating"; export var TransitionExecutor = Class.inherit({ ctor: function() { this._accumulatedDelays = { enter: 0, leave: 0 }; this._animations = []; this.reset() }, _createAnimations: function($elements, initialConfig, configModifier, type) { var that = this; var result = []; configModifier = configModifier || {}; var animationConfig = this._prepareElementAnimationConfig(initialConfig, configModifier, type); if (animationConfig) { $elements.each((function() { var animation = that._createAnimation($(this), animationConfig, configModifier); if (animation) { animation.element.addClass(DX_ANIMATING_CLASS); animation.setup(); result.push(animation) } })) } return result }, _prepareElementAnimationConfig: function(config, configModifier, type) { var result; if ("string" === typeof config) { var presetName = config; config = presets.getPreset(presetName) } if (!config) { result = void 0 } else if (isFunction(config[type])) { result = config[type] } else { result = extend({ skipElementInitialStyles: true, cleanupWhen: this._completePromise }, config, configModifier); if (!result.type || "css" === result.type) { var cssClass = "dx-" + type; var extraCssClasses = (result.extraCssClasses ? " " + result.extraCssClasses : "") + directionPostfixes[result.direction]; result.type = "css"; result.from = (result.from || cssClass) + extraCssClasses; result.to = result.to || cssClass + "-active" } result.staggerDelay = result.staggerDelay || 0; result.delay = result.delay || 0; if (result.staggerDelay) { result.delay += this._accumulatedDelays[type]; this._accumulatedDelays[type] += result.staggerDelay } } return result }, _createAnimation: function($element, animationConfig, configModifier) { var result; if (isPlainObject(animationConfig)) { result = fx.createAnimation($element, animationConfig) } else if (isFunction(animationConfig)) { result = animationConfig($element, configModifier) } return result }, _startAnimations: function() { var animations = this._animations; for (var i = 0; i < animations.length; i++) { animations[i].start() } }, _stopAnimations: function(jumpToEnd) { var animations = this._animations; for (var i = 0; i < animations.length; i++) { animations[i].stop(jumpToEnd) } }, _clearAnimations: function() { var animations = this._animations; for (var i = 0; i < animations.length; i++) { animations[i].element.removeClass(DX_ANIMATING_CLASS) } this._animations.length = 0 }, reset: function() { this._accumulatedDelays.enter = 0; this._accumulatedDelays.leave = 0; this._clearAnimations(); this._completeDeferred = new Deferred; this._completePromise = this._completeDeferred.promise() }, enter: function($elements, animationConfig, configModifier) { var animations = this._createAnimations($elements, animationConfig, configModifier, "enter"); this._animations.push.apply(this._animations, animations) }, leave: function($elements, animationConfig, configModifier) { var animations = this._createAnimations($elements, animationConfig, configModifier, "leave"); this._animations.push.apply(this._animations, animations) }, start: function() { var that = this; var result; if (!this._animations.length) { that.reset(); result = (new Deferred).resolve().promise() } else { var animationDeferreds = map(this._animations, (function(animation) { var result = new Deferred; animation.deferred.always((function() { result.resolve() })); return result.promise() })); result = when.apply($, animationDeferreds).always((function() { that._completeDeferred.resolve(); that.reset() })); executeAsync((function() { that._startAnimations() })) } return result }, stop: function(jumpToEnd) { this._stopAnimations(jumpToEnd) } });