/**
* @class Ext.LoadMask
* A simple utility class for generically masking elements while loading data. If the {@link #store}
* config option is specified, the masking will be automatically synchronized with the store's loading
* process and the mask element will be cached for reuse.
* Example usage:
*
// Basic mask:
var myMask = new Ext.LoadMask(Ext.getBody(), {msg:"Please wait..."});
myMask.show();
* @constructor
* Create a new LoadMask
* @param {Mixed} el The element or DOM node, or its id
* @param {Object} config The config object
*/
Ext.define('Ext.LoadMask', {
/* Begin Definitions */
mixins: {
observable: 'Ext.util.Observable'
},
requires: ['Ext.data.StoreMgr'],
/* End Definitions */
/**
* @cfg {Ext.data.Store} store
* Optional Store to which the mask is bound. The mask is displayed when a load request is issued, and
* hidden on either load success, or load fail.
*/
/**
* @cfg {String} msg
* The text to display in a centered loading message box (defaults to 'Loading...')
*/
msg : 'Loading...',
/**
* @cfg {String} msgCls
* The CSS class to apply to the loading message element (defaults to "x-mask-loading")
*/
msgCls : Ext.baseCSSPrefix + 'mask-loading',
/**
* Read-only. True if the mask is currently disabled so that it will not be displayed (defaults to false)
* @type Boolean
*/
disabled: false,
constructor : function(el, config) {
var me = this;
me.el = Ext.get(el);
Ext.apply(me, config);
me.addEvents('beforeshow', 'show', 'hide');
if (me.store) {
me.bindStore(me.store, true);
}
me.mixins.observable.constructor.call(me, config);
},
/**
* Changes the data store bound to this LoadMask.
* @param {Store} store The store to bind to this LoadMask
*/
bindStore : function(store, initial) {
var me = this;
if (!initial && me.store) {
me.mun(me.store, {
scope: me,
beforeload: me.onBeforeLoad,
load: me.onLoad,
exception: me.onLoad
});
if(!store) {
me.store = null;
}
}
if (store) {
store = Ext.data.StoreMgr.lookup(store);
me.mon(store, {
scope: me,
beforeload: me.onBeforeLoad,
load: me.onLoad,
exception: me.onLoad
});
}
me.store = store;
if (store && store.isLoading()) {
me.onBeforeLoad();
}
},
/**
* Disables the mask to prevent it from being displayed
*/
disable : function() {
var me = this;
me.disabled = true;
if (me.loading) {
me.onLoad();
}
},
/**
* Enables the mask so that it can be displayed
*/
enable : function() {
this.disabled = false;
},
/**
* Method to determine whether this LoadMask is currently disabled.
* @return {Boolean} the disabled state of this LoadMask.
*/
isDisabled : function() {
return this.disabled;
},
// private
onLoad : function() {
var me = this;
me.loading = false;
me.el.unmask();
me.fireEvent('hide', me, me.el, me.store);
},
// private
onBeforeLoad : function() {
var me = this;
if (!me.disabled && !me.loading && me.fireEvent('beforeshow', me, me.el, me.store) !== false) {
me.el.mask(me.msg, me.msgCls, false);
me.fireEvent('show', me, me.el, me.store);
me.loading = true;
}
},
/**
* Show this LoadMask over the configured Element.
*/
show: function() {
this.onBeforeLoad();
},
/**
* Hide this LoadMask.
*/
hide: function() {
this.onLoad();
},
// private
destroy : function() {
this.hide();
this.clearListeners();
}
});