| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277 |
- /**
- * DevExtreme (ui/scroll_view/ui.scroll_view.js)
- * Version: 19.1.16
- * Build date: Tue Oct 18 2022
- *
- * Copyright (c) 2012 - 2022 Developer Express Inc. ALL RIGHTS RESERVED
- * Read about DevExtreme licensing here: https://js.devexpress.com/Licensing/
- */
- "use strict";
- var $ = require("../../core/renderer");
- var devices = require("../../core/devices");
- var windowUtils = require("../../core/utils/window");
- var messageLocalization = require("../../localization/message");
- var registerComponent = require("../../core/component_registrator");
- var getPublicElement = require("../../core/utils/dom").getPublicElement;
- var extend = require("../../core/utils/extend").extend;
- var noop = require("../../core/utils/common").noop;
- var PullDownStrategy = require("./ui.scroll_view.native.pull_down");
- var SwipeDownStrategy = require("./ui.scroll_view.native.swipe_down");
- var SlideDownStrategy = require("./ui.scroll_view.native.slide_down");
- var SimulatedStrategy = require("./ui.scroll_view.simulated");
- var Scrollable = require("./ui.scrollable");
- var LoadIndicator = require("../load_indicator");
- var themes = require("./../themes");
- var LoadPanel = require("../load_panel");
- var SCROLLVIEW_CLASS = "dx-scrollview";
- var SCROLLVIEW_CONTENT_CLASS = SCROLLVIEW_CLASS + "-content";
- var SCROLLVIEW_TOP_POCKET_CLASS = SCROLLVIEW_CLASS + "-top-pocket";
- var SCROLLVIEW_BOTTOM_POCKET_CLASS = SCROLLVIEW_CLASS + "-bottom-pocket";
- var SCROLLVIEW_PULLDOWN_CLASS = SCROLLVIEW_CLASS + "-pull-down";
- var SCROLLVIEW_REACHBOTTOM_CLASS = SCROLLVIEW_CLASS + "-scrollbottom";
- var SCROLLVIEW_REACHBOTTOM_INDICATOR_CLASS = SCROLLVIEW_REACHBOTTOM_CLASS + "-indicator";
- var SCROLLVIEW_REACHBOTTOM_TEXT_CLASS = SCROLLVIEW_REACHBOTTOM_CLASS + "-text";
- var SCROLLVIEW_LOADPANEL = SCROLLVIEW_CLASS + "-loadpanel";
- var refreshStrategies = {
- pullDown: PullDownStrategy,
- swipeDown: SwipeDownStrategy,
- slideDown: SlideDownStrategy,
- simulated: SimulatedStrategy
- };
- var isServerSide = !windowUtils.hasWindow();
- var scrollViewServerConfig = {
- finishLoading: noop,
- release: noop,
- refresh: noop,
- _optionChanged: function(args) {
- if ("onUpdated" !== args.name) {
- return this.callBase.apply(this, arguments)
- }
- }
- };
- var ScrollView = Scrollable.inherit(isServerSide ? scrollViewServerConfig : {
- _getDefaultOptions: function() {
- return extend(this.callBase(), {
- pullingDownText: messageLocalization.format("dxScrollView-pullingDownText"),
- pulledDownText: messageLocalization.format("dxScrollView-pulledDownText"),
- refreshingText: messageLocalization.format("dxScrollView-refreshingText"),
- reachBottomText: messageLocalization.format("dxScrollView-reachBottomText"),
- onPullDown: null,
- onReachBottom: null,
- refreshStrategy: "pullDown"
- })
- },
- _defaultOptionsRules: function() {
- return this.callBase().concat([{
- device: function() {
- var realDevice = devices.real();
- return "android" === realDevice.platform
- },
- options: {
- refreshStrategy: "swipeDown"
- }
- }, {
- device: function() {
- return "win" === devices.real().platform
- },
- options: {
- refreshStrategy: "slideDown"
- }
- }, {
- device: function() {
- return themes.isMaterial()
- },
- options: {
- pullingDownText: "",
- pulledDownText: "",
- refreshingText: "",
- reachBottomText: ""
- }
- }])
- },
- _init: function() {
- this.callBase();
- this._loadingIndicatorEnabled = true
- },
- _initScrollableMarkup: function() {
- this.callBase();
- this.$element().addClass(SCROLLVIEW_CLASS);
- this._initContent();
- this._initTopPocket();
- this._initBottomPocket();
- this._initLoadPanel()
- },
- _initContent: function() {
- var $content = $("<div>").addClass(SCROLLVIEW_CONTENT_CLASS);
- this._$content.wrapInner($content)
- },
- _initTopPocket: function() {
- var $topPocket = this._$topPocket = $("<div>").addClass(SCROLLVIEW_TOP_POCKET_CLASS);
- var $pullDown = this._$pullDown = $("<div>").addClass(SCROLLVIEW_PULLDOWN_CLASS);
- $topPocket.append($pullDown);
- this._$content.prepend($topPocket)
- },
- _initBottomPocket: function() {
- var $bottomPocket = this._$bottomPocket = $("<div>").addClass(SCROLLVIEW_BOTTOM_POCKET_CLASS);
- var $reachBottom = this._$reachBottom = $("<div>").addClass(SCROLLVIEW_REACHBOTTOM_CLASS);
- var $loadContainer = $("<div>").addClass(SCROLLVIEW_REACHBOTTOM_INDICATOR_CLASS);
- var $loadIndicator = new LoadIndicator($("<div>")).$element();
- var $text = this._$reachBottomText = $("<div>").addClass(SCROLLVIEW_REACHBOTTOM_TEXT_CLASS);
- this._updateReachBottomText();
- $reachBottom.append($loadContainer.append($loadIndicator)).append($text);
- $bottomPocket.append($reachBottom);
- this._$content.append($bottomPocket)
- },
- _initLoadPanel: function() {
- var $loadPanelElement = $("<div>").addClass(SCROLLVIEW_LOADPANEL).appendTo(this.$element());
- var loadPanelOptions = {
- shading: false,
- delay: 400,
- message: this.option("refreshingText"),
- position: {
- of: this.$element()
- }
- };
- this._loadPanel = this._createComponent($loadPanelElement, LoadPanel, loadPanelOptions)
- },
- _updateReachBottomText: function() {
- this._$reachBottomText.text(this.option("reachBottomText"))
- },
- _createStrategy: function() {
- var strategyName = this.option("useNative") ? this.option("refreshStrategy") : "simulated";
- var strategyClass = refreshStrategies[strategyName];
- if (!strategyClass) {
- throw Error("E1030", this.option("refreshStrategy"))
- }
- this._strategy = new strategyClass(this);
- this._strategy.pullDownCallbacks.add(this._pullDownHandler.bind(this));
- this._strategy.releaseCallbacks.add(this._releaseHandler.bind(this));
- this._strategy.reachBottomCallbacks.add(this._reachBottomHandler.bind(this))
- },
- _createActions: function() {
- this.callBase();
- this._pullDownAction = this._createActionByOption("onPullDown");
- this._reachBottomAction = this._createActionByOption("onReachBottom");
- this._tryRefreshPocketState()
- },
- _tryRefreshPocketState: function() {
- this._pullDownEnable(this.hasActionSubscription("onPullDown"));
- this._reachBottomEnable(this.hasActionSubscription("onReachBottom"))
- },
- on: function(eventName) {
- var result = this.callBase.apply(this, arguments);
- if ("pullDown" === eventName || "reachBottom" === eventName) {
- this._tryRefreshPocketState()
- }
- return result
- },
- _pullDownEnable: function(enabled) {
- if (0 === arguments.length) {
- return this._pullDownEnabled
- }
- if (this._$pullDown && this._strategy) {
- this._$pullDown.toggle(enabled);
- this._strategy.pullDownEnable(enabled);
- this._pullDownEnabled = enabled
- }
- },
- _reachBottomEnable: function(enabled) {
- if (0 === arguments.length) {
- return this._reachBottomEnabled
- }
- if (this._$reachBottom && this._strategy) {
- this._$reachBottom.toggle(enabled);
- this._strategy.reachBottomEnable(enabled);
- this._reachBottomEnabled = enabled
- }
- },
- _pullDownHandler: function() {
- this._loadingIndicator(false);
- this._pullDownLoading()
- },
- _loadingIndicator: function(value) {
- if (arguments.length < 1) {
- return this._loadingIndicatorEnabled
- }
- this._loadingIndicatorEnabled = value
- },
- _pullDownLoading: function() {
- this.startLoading();
- this._pullDownAction()
- },
- _reachBottomHandler: function() {
- this._loadingIndicator(false);
- this._reachBottomLoading()
- },
- _reachBottomLoading: function() {
- this.startLoading();
- this._reachBottomAction()
- },
- _releaseHandler: function() {
- this.finishLoading();
- this._loadingIndicator(true)
- },
- _optionChanged: function(args) {
- switch (args.name) {
- case "onPullDown":
- case "onReachBottom":
- this._createActions();
- break;
- case "pullingDownText":
- case "pulledDownText":
- case "refreshingText":
- case "refreshStrategy":
- this._invalidate();
- break;
- case "reachBottomText":
- this._updateReachBottomText();
- break;
- default:
- this.callBase(args)
- }
- },
- isEmpty: function() {
- return !$(this.content()).children().length
- },
- content: function() {
- return getPublicElement(this._$content.children().eq(1))
- },
- release: function(preventReachBottom) {
- if (void 0 !== preventReachBottom) {
- this.toggleLoading(!preventReachBottom)
- }
- return this._strategy.release()
- },
- toggleLoading: function(showOrHide) {
- this._reachBottomEnable(showOrHide)
- },
- isFull: function() {
- return $(this.content()).height() > this._$container.height()
- },
- refresh: function() {
- if (!this.hasActionSubscription("onPullDown")) {
- return
- }
- this._strategy.pendingRelease();
- this._pullDownLoading()
- },
- startLoading: function() {
- if (this._loadingIndicator() && this.$element().is(":visible")) {
- this._loadPanel.show()
- }
- this._lock()
- },
- finishLoading: function() {
- this._loadPanel.hide();
- this._unlock()
- },
- _dispose: function() {
- this._strategy.dispose();
- this.callBase();
- if (this._loadPanel) {
- this._loadPanel.$element().remove()
- }
- }
- });
- registerComponent("dxScrollView", ScrollView);
- module.exports = ScrollView;
|