manager/assets/modext/core/modx.view.js
/**
* Abstract class for Ext.DataView creation in MODx
*
* This is primarily used for the media browser
* but in untestable cases also in a modx-package-browser-thumbs-view
* in the package browser (when a node in the tree has the attribute "templated")
*
* @class MODx.DataView
* @extends Ext.DataView
* @constructor
* @param {Object} config An object of options.
* @xtype modx-dataview
*/
MODx.DataView = function(config) {
config = config || {};
this._loadStore(config);
Ext.applyIf(config.listeners || {},{
'loadexception': {fn:this.onLoadException, scope: this}
,'beforeselect': {fn:function(view){ return view.store.getRange().length > 0;}}
,'contextmenu': {fn:this._showContextMenu, scope: this}
});
Ext.applyIf(config,{
store: this.store
,singleSelect: true
,overClass: 'x-view-over'
,emptyText: '<div style="padding:10px;">'+_('file_err_filter')+'</div>'
,closeAction: 'hide'
});
MODx.DataView.superclass.constructor.call(this,config);
this.config = config;
this.cm = new Ext.menu.Menu();
};
Ext.extend(MODx.DataView,Ext.DataView,{
lookup: {}
,onLoadException: function(){
this.getEl().update('<div style="padding:10px;">'+_('data_err_load')+'</div>');
}
/**
* Add context menu items to the dataview.
* @param {Object, Array} items Either an Object config or array of Object configs.
*/
,_addContextMenuItem: function(items) {
var a = items, l = a.length;
for(var i=0;i<l;i=i+1) {
var options = a[i];
if (options === '-') {
this.cm.add('-');
continue;
}
var h = Ext.emptyFn;
if (options.handler) {
h = eval(options.handler);
} else {
h = function(itm,e) {
var o = itm.options;
var id = this.cm.activeNode.id.split('_'); id = id[1];
var w = Ext.get('modx_content');
if (o.confirm) {
Ext.Msg.confirm('',o.confirm,function(e) {
if (e === 'yes') {
var a = Ext.urlEncode(o.params || {action: o.action});
var s = '?id='+id+'&'+a;
if (w === null) {
location.href = s;
} else { w.dom.src = s; }
}
},this);
} else {
var a = Ext.urlEncode(o.params);
var s = '?id='+id+'&'+a;
if (w === null) {
location.href = s;
} else { w.dom.src = s; }
}
};
}
this.cm.add({
id: options.id
,text: options.text
,scope: this
,options: options
,handler: h
});
}
}
,_loadStore: function(config) {
this.store = new Ext.data.JsonStore({
url: config.url
,baseParams: config.baseParams || {
action: 'browser/directory/getList'
,wctx: config.wctx || MODx.ctx
,dir: config.openTo || ''
,source: config.source || 0
}
,root: config.root || 'results'
,fields: config.fields
,totalProperty: 'total'
,listeners: {
'load': {fn:function(){ this.select(0); }, scope:this, single:true}
}
});
this.store.load();
}
,_showContextMenu: function(v,i,n,e) {
e.preventDefault();
var data = this.lookup[n.id];
var m = this.cm;
m.removeAll();
if (data.menu) {
this._addContextMenuItem(data.menu);
m.showAt(e.xy);
}
m.activeNode = n;
}
});
Ext.reg('modx-dataview',MODx.DataView);