/**
* Generates the Element Tree
*
* @class MODx.tree.Element
* @extends MODx.tree.Tree
* @param {Object} config An object of options.
* @xtype modx-tree-element
*/
MODx.tree.Element = function(config) {
config = config || {};
Ext.applyIf(config,{
rootVisible: false
,enableDD: !Ext.isEmpty(MODx.config.enable_dragdrop) ? true : false
,ddGroup: 'modx-treedrop-elements-dd'
,title: ''
,url: MODx.config.connector_url
,action: 'element/getnodes'
,sortAction: 'element/sort'
,useDefaultToolbar: false
,baseParams: {
currentElement: MODx.request.id || 0
,currentAction: MODx.request.a || 0
}
,tbar: [{
cls: 'tree-new-template'
,tooltip: {text: _('new')+' '+_('template')}
,handler: function() {
this.redirect('?a=element/template/create');
}
,scope: this
,hidden: MODx.perm.new_template ? false : true
},{
cls: 'tree-new-tv'
,tooltip: {text: _('new')+' '+_('tv')}
,handler: function() {
this.redirect('?a=element/tv/create');
}
,scope: this
,hidden: MODx.perm.new_tv ? false : true
},{
cls: 'tree-new-chunk'
,tooltip: {text: _('new')+' '+_('chunk')}
,handler: function() {
this.redirect('?a=element/chunk/create');
}
,scope: this
,hidden: MODx.perm.new_chunk ? false : true
},{
cls: 'tree-new-snippet'
,tooltip: {text: _('new')+' '+_('snippet')}
,handler: function() {
this.redirect('?a=element/snippet/create');
}
,scope: this
,hidden: MODx.perm.new_snippet ? false : true
},{
cls: 'tree-new-plugin'
,tooltip: {text: _('new')+' '+_('plugin')}
,handler: function() {
this.redirect('?a=element/plugin/create');
}
,scope: this
,hidden: MODx.perm.new_plugin ? false : true
},{
cls: 'tree-new-category'
,tooltip: {text: _('new_category')}
,handler: function() {
this.createCategory(null,{target: this.getEl()});
}
,scope: this
,hidden: MODx.perm.new_category ? false : true
}]
});
MODx.tree.Element.superclass.constructor.call(this,config);
this.on('afterSort',this.afterSort);
};
Ext.extend(MODx.tree.Element,MODx.tree.Tree,{
forms: {}
,windows: {}
,stores: {}
,createCategory: function(n,e) {
var r = {};
if (this.cm.activeNode && this.cm.activeNode.attributes.data) {
r['parent'] = this.cm.activeNode.attributes.data.id;
}
var w = MODx.load({
xtype: 'modx-window-category-create'
,record: r
,listeners: {
success: {
fn: function() {
var node = (this.cm.activeNode) ? this.cm.activeNode.id : 'n_category'
,self = node.indexOf('_category_') !== -1;
this.refreshNode(node, self);
}
,scope: this
}
,hide: {
fn: function() {
this.destroy();
}
}
}
});
w.show(e.target);
}
,renameCategory: function(itm,e) {
var r = this.cm.activeNode.attributes.data;
var w = MODx.load({
xtype: 'modx-window-category-rename'
,record: r
,listeners: {
'success':{fn:function(r) {
var c = r.a.result.object;
var n = this.cm.activeNode;
n.setText(c.category+' ('+c.id+')');
Ext.get(n.getUI().getEl()).frame();
n.attributes.data.id = c.id;
n.attributes.data.category = c.category;
},scope:this}
,'hide':{fn:function() {this.destroy();}}
}
});
w.show(e.target);
}
,removeCategory: function(itm,e) {
var id = this.cm.activeNode.attributes.data.id;
MODx.msg.confirm({
title: _('warning')
,text: _('category_confirm_delete')
,url: MODx.config.connector_url
,params: {
action: 'element/category/remove'
,id: id
}
,listeners: {
'success': {fn:function() {
this.cm.activeNode.remove();
},scope:this}
}
});
}
,duplicateElement: function(itm,e,id,type) {
MODx.Ajax.request({
url: MODx.config.connector_url
,params: {
action: 'element/' + type + '/get'
,id: id
}
,listeners: {
'success': {fn:function(results) {
var r = {
id: id
,type: type
,name: _('duplicate_of',{name: this.cm.activeNode.attributes.name})
,caption: _('duplicate_of',{name: this.cm.activeNode.attributes.caption})
,category: results.object.category
,source: results.object.source
,static: results.object.static
,static_file: results.object.static_file
};
var w = MODx.load({
xtype: 'modx-window-element-duplicate'
,record: r
,listeners: {
'success': {fn:function() {this.refreshNode(this.cm.activeNode.id);},scope:this}
,'hide':{fn:function() {this.destroy();}}
}
});
w.show(e.target);
},scope:this}
}
});
}
,removeElement: function(itm,e) {
var id = this.cm.activeNode.id.substr(2);
var oar = id.split('_');
MODx.msg.confirm({
title: _('warning')
,text: _('remove_this_confirm',{
type: _(oar[0])
,name: this.cm.activeNode.attributes.name
})
,url: MODx.config.connector_url
,params: {
action: 'element/'+oar[0]+'/remove'
,id: oar[2]
}
,listeners: {
'success': {fn:function() {
this.cm.activeNode.remove();
/* if editing the element being removed */
if (MODx.request.a == 'element/'+oar[0]+'/update' && MODx.request.id == oar[2]) {
MODx.loadPage('welcome');
}
},scope:this}
}
});
}
,activatePlugin: function(itm,e) {
var id = this.cm.activeNode.id.substr(2);
var oar = id.split('_');
MODx.Ajax.request({
url: MODx.config.connector_url
,params: {
action: 'element/plugin/activate'
,id: oar[2]
}
,listeners: {
'success': {fn:function() {
this.refreshParentNode();
},scope:this}
}
});
}
,deactivatePlugin: function(itm,e) {
var id = this.cm.activeNode.id.substr(2);
var oar = id.split('_');
MODx.Ajax.request({
url: MODx.config.connector_url
,params: {
action: 'element/plugin/deactivate'
,id: oar[2]
}
,listeners: {
'success': {fn:function() {
this.refreshParentNode();
},scope:this}
}
});
}
,quickCreate: function(itm,e,type) {
var r = {
category: this.cm.activeNode.attributes.pk || ''
};
var w = MODx.load({
xtype: 'modx-window-quick-create-'+type
,record: r
,listeners: {
success: {
fn: function() {
this.refreshNode(this.cm.activeNode.id, true);
}
,scope: this
}
,hide: {
fn: function() {
this.destroy();
}
}
}
});
w.setValues(r);
w.show(e.target);
}
,quickUpdate: function(itm,e,type) {
MODx.Ajax.request({
url: MODx.config.connector_url
,params: {
action: 'element/'+type+'/get'
,id: this.cm.activeNode.attributes.pk
}
,listeners: {
'success': {fn:function(r) {
var nameField = (type == 'template') ? 'templatename' : 'name';
var w = MODx.load({
xtype: 'modx-window-quick-update-'+type
,record: r.object
,listeners: {
'success':{fn:function(r) {
this.refreshNode(this.cm.activeNode.id);
var newTitle = '' + r.f.findField(nameField).getValue() + ' (' + w.record.id + ')';
w.setTitle(w.title.replace(//, newTitle));
},scope:this}
,'hide':{fn:function() {this.destroy();}}
}
});
w.title += ': ' + w.record[nameField] + ' ('+ w.record.id + ')';
w.setValues(r.object);
w.show(e.target);
},scope:this}
}
});
}
,_createElement: function(itm,e,t) {
var id = this.cm.activeNode.id.substr(2);
var oar = id.split('_');
var type = oar[0] == 'type' ? oar[1] : oar[0];
var cat_id = oar[0] == 'type' ? 0 : (oar[1] == 'category' ? oar[2] : oar[3]);
var a = 'element/'+type+'/create';
this.redirect('?a='+a+'&category='+cat_id);
this.cm.hide();
return false;
}
,afterSort: function(o) {
var tn = o.event.target.attributes;
if (tn.type == 'category') {
var dn = o.event.dropNode.attributes;
if (tn.id != 'n_category' && dn.type == 'category') {
o.event.target.expand();
} else {
this.refreshNode(o.event.target.attributes.id,true);
this.refreshNode('n_type_'+o.event.dropNode.attributes.type,true);
}
}
}
,_handleDrop: function(e) {
var target = e.target;
if (e.point == 'above' || e.point == 'below') {return false;}
if (target.attributes.classKey != 'modCategory' && target.attributes.classKey != 'root') { return false; }
if (!this.isCorrectType(e.dropNode,target)) {return false;}
if (target.attributes.type == 'category' && e.point == 'append') {return true;}
return target.getDepth() > 0;
}
,isCorrectType: function(dropNode,targetNode) {
var r = false;
/* types must be the same */
if(targetNode.attributes.type == dropNode.attributes.type) {
/* do not allow anything to be dropped on an element */
if(!(targetNode.parentNode &&
((dropNode.attributes.cls == 'folder'
&& targetNode.attributes.cls == 'folder'
&& dropNode.parentNode.id == targetNode.parentNode.id
) || targetNode.attributes.cls == 'file'))) {
r = true;
}
}
return r;
}
/**
* Shows the current context menu.
* @param {Ext.tree.TreeNode} n The current node
* @param {Ext.EventObject} e The event object run.
*/
,_showContextMenu: function(n,e) {
this.cm.activeNode = n;
this.cm.removeAll();
if (n.attributes.menu && n.attributes.menu.items) {
this.addContextMenuItem(n.attributes.menu.items);
this.cm.show(n.getUI().getEl(),'t?');
} else {
var m = [];
switch (n.attributes.classKey) {
case 'root':
m = this._getRootMenu(n);
break;
case 'modCategory':
m = this._getCategoryMenu(n);
break;
default:
m = this._getElementMenu(n);
break;
}
this.addContextMenuItem(m);
this.cm.showAt(e.xy);
}
e.stopEvent();
}
,_getQuickCreateMenu: function(n,m) {
var ui = n.getUI();
var mn = [];
var types = ['template','tv','chunk','snippet','plugin'];
var t;
for (var i=0;i'+a.text+''
,handler: function() { return false; }
,header: true
});
m.push('-');
if (ui.hasClass('pedit')) {
m.push({
text: _('edit_'+a.type)
,type: a.type
,pk: a.pk
,handler: function(itm,e) {
MODx.loadPage('element/'+itm.type+'/update',
'id='+itm.pk);
}
});
m.push({
text: _('quick_update_'+a.type)
,type: a.type
,handler: function(itm,e) {
this.quickUpdate(itm,e,itm.type);
}
});
if (a.classKey == 'modPlugin') {
if (a.active) {
m.push({
text: _('plugin_deactivate')
,type: a.type
,handler: this.deactivatePlugin
});
} else {
m.push({
text: _('plugin_activate')
,type: a.type
,handler: this.activatePlugin
});
}
}
}
if (ui.hasClass('pnew')) {
m.push({
text: _('duplicate_'+a.type)
,pk: a.pk
,type: a.type
,handler: function(itm,e) {
this.duplicateElement(itm,e,itm.pk,itm.type);
}
});
}
if (ui.hasClass('pdelete')) {
m.push({
text: _('remove_'+a.type)
,handler: this.removeElement
});
}
m.push('-');
if (ui.hasClass('pnew')) {
m.push({
text: _('add_to_category_'+a.type)
,handler: this._createElement
});
}
if (ui.hasClass('pnewcat')) {
m.push({
text: _('new_category')
,handler: this.createCategory
});
}
return m;
}
,_getCategoryMenu: function(n) {
var a = n.attributes;
var ui = n.getUI();
var m = [];
m.push({
text: ''+a.text+''
,handler: function() { return false; }
,header: true
});
m.push('-');
if (ui.hasClass('pnewcat')) {
m.push({
text: _('category_create')
,handler: this.createCategory
});
}
if (ui.hasClass('peditcat')) {
m.push({
text: _('category_rename')
,handler: this.renameCategory
});
}
if (m.length > 2) {m.push('-');}
if (a.elementType) {
m.push({
text: _('add_to_category_'+a.type)
,handler: this._createElement
});
}
this._getQuickCreateMenu(n,m);
if (ui.hasClass('pdelcat')) {
m.push('-');
m.push({
text: _('category_remove')
,handler: this.removeCategory
});
}
return m;
}
,_getRootMenu: function(n) {
var a = n.attributes;
var ui = n.getUI();
var m = [];
if (ui.hasClass('pnew')) {
m.push({
text: _('new_'+a.type)
,handler: this._createElement
});
m.push({
text: _('quick_create_'+a.type)
,type: a.type
,handler: function(itm,e) {
this.quickCreate(itm,e,itm.type);
}
});
}
if (ui.hasClass('pnewcat')) {
if (ui.hasClass('pnew')) {m.push('-');}
m.push({
text: _('new_category')
,handler: this.createCategory
});
}
return m;
}
,handleCreateClick: function(node){
this.cm.activeNode = node;
var type = this.cm.activeNode.id.substr(2).split('_');
if (type[0] != 'category') {
this._createElement(null, null, null);
} else {
this.createCategory(null, {target: this});
}
}
});
Ext.reg('modx-tree-element',MODx.tree.Element);