mirror of
https://github.com/silverstripe/silverstripe-cms
synced 2024-10-22 08:05:56 +02:00
1eca17e0a9
Includes the removal of all tabs and submit action buttons when 'Drafts' or 'Sent Items' are clicked and the addition of an 'add one' link on 'Drafts' folder page. For more information see: http://www.elijahlofgren.com/silverstripe/newletter-tree-and-tab-row-are-confusing/ Includes a few fixes for undefined variables. (merged from branches/gsoc) git-svn-id: svn://svn.silverstripe.com/silverstripe/open/modules/cms/trunk@41772 467b73ca-7a2a-4603-9d3b-597d59a354a9
385 lines
11 KiB
JavaScript
Executable File
385 lines
11 KiB
JavaScript
Executable File
if(typeof SiteTreeHandlers == 'undefined') SiteTreeHandlers = {};
|
|
SiteTreeHandlers.showNLDraft_url = 'admin/newsletter/shownewsletter/';
|
|
SiteTreeHandlers.showNLType_url = 'admin/newsletter/showtype/';
|
|
SiteTreeHandlers.controller_url = 'admin/newsletter';
|
|
|
|
SiteTree.prototype = {
|
|
castAsTreeNode: function(li) {
|
|
behaveAs(li, SiteTreeNode, this.options);
|
|
},
|
|
|
|
getIdxOf : function(treeNode) {
|
|
if(treeNode && treeNode.id)
|
|
return treeNode.id;
|
|
},
|
|
|
|
getTreeNodeByIdx : function(idx) {
|
|
if(!idx) idx = "0";
|
|
return document.getElementById(idx);
|
|
},
|
|
|
|
initialise: function() {
|
|
this.observeMethod('SelectionChanged', this.changeCurrentTo);
|
|
},
|
|
|
|
createTreeNode : function(idx, title, pageType, secondIdx) {
|
|
var i;
|
|
var node = document.createElement('li');
|
|
node.className = pageType;
|
|
|
|
var aTag = document.createElement('a');
|
|
|
|
node.id = idx;
|
|
|
|
if( pageType == 'Draft' ) {
|
|
aTag.href = SiteTreeHandlers.showNLDraft_url + idx;
|
|
} else {
|
|
aTag.href = SiteTreeHandlers.showNLType_url + idx;
|
|
}
|
|
|
|
aTag.innerHTML = title;
|
|
node.appendChild(aTag);
|
|
|
|
SiteTreeNode.create(node, this.options);
|
|
|
|
return node;
|
|
},
|
|
|
|
addDraftNode: function( title, parentID, draftID ) {
|
|
var draftNode = this.createTreeNode( 'draft_' + parentID + '_' + draftID, title, 'Draft', parentID );
|
|
this.getTreeNodeByIdx('drafts_' + parentID).appendTreeNode( draftNode );
|
|
this.changeCurrentTo( draftNode );
|
|
},
|
|
|
|
addTypeNode: function( title, parentID ) {
|
|
var typeNode = this.createTreeNode( 'mailtype_' + parentID, title, 'MailType' );
|
|
var draftsNode = this.createTreeNode( 'drafts_' + parentID, 'Drafts', 'DraftFolder' );
|
|
var sentItemsNode = this.createTreeNode( 'sent_' + parentID, 'Sent Items', 'SentFolder' );
|
|
var mailingListNode = this.createTreeNode( 'recipients_' + parentID, 'Mailing List', 'Recipients' );
|
|
typeNode.appendTreeNode( draftsNode );
|
|
Element.addClassName( draftsNode, 'nodelete');
|
|
typeNode.appendTreeNode( sentItemsNode );
|
|
Element.addClassName(sentItemsNode,'nodelete');
|
|
typeNode.appendTreeNode( mailingListNode );
|
|
Element.addClassName(mailingListNode,'nodelete');
|
|
this.appendTreeNode( typeNode );
|
|
this.changeCurrentTo( typeNode );
|
|
}
|
|
}
|
|
|
|
|
|
/**
|
|
* Delete pages action
|
|
*/
|
|
deletedraft = {
|
|
button_onclick : function() {
|
|
if(treeactions.toggleSelection(this)) {
|
|
deletedraft.o1 = $('sitetree').observeMethod('SelectionChanged', deletedraft.treeSelectionChanged);
|
|
deletedraft.o2 = $('deletedrafts_options').observeMethod('Close', deletedraft.popupClosed);
|
|
addClass($('sitetree'),'multiselect');
|
|
|
|
var sel = $('sitetree').firstSelected();
|
|
|
|
if(sel) {
|
|
var selIdx = $('sitetree').getIdxOf(sel);
|
|
deletedraft.selectedNodes = { };
|
|
deletedraft.selectedNodes[selIdx] = true;
|
|
sel.removeNodeClass('current');
|
|
sel.addNodeClass('selected');
|
|
}
|
|
}
|
|
return false;
|
|
},
|
|
|
|
treeSelectionChanged : function(selectedNode) {
|
|
var idx = $('sitetree').getIdxOf(selectedNode);
|
|
|
|
if(selectedNode.selected) {
|
|
selectedNode.removeNodeClass('selected');
|
|
selectedNode.selected = false;
|
|
deletedraft.selectedNodes[idx] = false;
|
|
|
|
} else {
|
|
selectedNode.addNodeClass('selected');
|
|
selectedNode.selected = true;
|
|
deletedraft.selectedNodes[idx] = true;
|
|
}
|
|
|
|
return false;
|
|
},
|
|
|
|
popupClosed : function() {
|
|
removeClass($('sitetree'),'multiselect');
|
|
$('sitetree').stopObserving(deletedraft.o1);
|
|
$('deletedrafts_options').stopObserving(deletedraft.o2);
|
|
|
|
for(var idx in deletedraft.selectedNodes) {
|
|
if(deletedraft.selectedNodes[idx]) {
|
|
node = $('sitetree').getTreeNodeByIdx(idx);
|
|
if(node) {
|
|
node.removeNodeClass('selected');
|
|
node.selected = false;
|
|
}
|
|
}
|
|
}
|
|
},
|
|
|
|
form_submit : function() {
|
|
var csvIDs = "";
|
|
for(var idx in deletedraft.selectedNodes) {
|
|
if(deletedraft.selectedNodes[idx]) csvIDs += (csvIDs ? "," : "") + idx;
|
|
}
|
|
|
|
if(csvIDs) {
|
|
$('deletedrafts_options').elements.csvIDs.value = csvIDs;
|
|
|
|
Ajax.SubmitForm('deletedrafts_options', null, {
|
|
onSuccess : function(response) {
|
|
Ajax.Evaluator(response);
|
|
|
|
var sel;
|
|
if((sel = $('sitetree').selected) && sel.parentNode) sel.addNodeClass('current');
|
|
// else $('Form_EditForm').innerHTML = "";
|
|
|
|
treeactions.closeSelection($('deletedrafts'));
|
|
},
|
|
onFailure : function(response) {
|
|
errorMessage('Error deleting drafts', response);
|
|
}
|
|
});
|
|
|
|
$('deletedrafts').getElementsByTagName('a')[0].onclick();
|
|
|
|
} else {
|
|
alert("Please select at least 1 page.");
|
|
}
|
|
|
|
return false;
|
|
},
|
|
|
|
treeSelectionChanged : function(selectedNode) {
|
|
var idx = $('sitetree').getIdxOf(selectedNode);
|
|
|
|
if( !deletedraft.selectedNodes )
|
|
deletedraft.selectedNodes = {};
|
|
|
|
if(selectedNode.className.indexOf('nodelete') == -1) {
|
|
if(selectedNode.selected) {
|
|
selectedNode.removeNodeClass('selected');
|
|
selectedNode.selected = false;
|
|
deletedraft.selectedNodes[idx] = false;
|
|
|
|
} else {
|
|
selectedNode.addNodeClass('selected');
|
|
selectedNode.selected = true;
|
|
deletedraft.selectedNodes[idx] = true;
|
|
}
|
|
}
|
|
|
|
return false;
|
|
}
|
|
}
|
|
|
|
SiteTreeNode.prototype.onselect = function() {
|
|
$('sitetree').changeCurrentTo(this);
|
|
if($('sitetree').notify('SelectionChanged', this)) {
|
|
if(typeof save != 'undefined'){
|
|
autoSave(true, this.getPageFromServer.bind(this));
|
|
}
|
|
else {
|
|
this.getPageFromServer();
|
|
}
|
|
}
|
|
return false;
|
|
};
|
|
|
|
SiteTreeNode.prototype.getPageFromServer = function() {
|
|
|
|
var match = this.id.match(/(mailtype|drafts|draft|sent|recipients)_([\d]+)$/);
|
|
var openTabName = null;
|
|
var currentPageID = null;
|
|
|
|
if( $('Form_EditForm_ID') )
|
|
currentPageID = $('Form_EditForm_ID').value;
|
|
|
|
var newPageID = null;
|
|
var otherID = null;
|
|
var type = null;
|
|
|
|
if( match ) {
|
|
|
|
newPageID = match[2];
|
|
type = match[1];
|
|
} else if(this.id.match(/(mailtype|drafts|draft|sent|recipients)_([\d]+)_([\d]+)$/)) {
|
|
newPageID = RegExp.$2;
|
|
type = RegExp.$1;
|
|
otherID = RegExp.$3;
|
|
}
|
|
$('Form_EditForm').getPageFromServer(newPageID, type, otherID, openTabName);
|
|
};
|
|
|
|
function draft_sent_ok( newsletterID, draftID ) {
|
|
var draftsListNode = $('drafts_' + newsletterID);
|
|
var sentListNode = $('sent_' + newsletterID);
|
|
var draftNode = $('draft_' + newsletterID + '_' + draftID );
|
|
|
|
draftsListNode.removeTreeNode( draftNode );
|
|
draftNode.id = 'sent_' + newsletterID + '_' + draftID;
|
|
sentListNode.appendTreeNode( draftNode, null );
|
|
statusMessage('Sent email to mailing list', 'good');
|
|
}
|
|
|
|
function resent_ok( newsletterID, sentID ) {
|
|
statusMessage('Resent email to mailing list', 'good');
|
|
}
|
|
|
|
function reloadSiteTree() {
|
|
|
|
new Ajax.Request( 'admin/newsletter/getsitetree', {
|
|
method: get,
|
|
onSuccess: function( response ) {
|
|
$('sitetree_holder').innerHTML = response.responseText;
|
|
},
|
|
onFailure: function( response ) {
|
|
|
|
}
|
|
});
|
|
|
|
}
|
|
|
|
_HANDLER_FORMS['addtype'] = 'addtype_options';
|
|
_HANDLER_FORMS['deletedrafts'] = 'deletedrafts_options';
|
|
|
|
AddForm = Class.extend('addpage');
|
|
AddForm.applyTo('#addtype');
|
|
AddForm.prototype = {
|
|
initialize: function () {
|
|
Observable.applyTo($(_HANDLER_FORMS[this.id]));
|
|
this.getElementsByTagName('a')[0].onclick = returnFalse;
|
|
$(_HANDLER_FORMS[this.id]).onsubmit = this.form_submit;
|
|
},
|
|
|
|
form_submit : function() {
|
|
var st = $('sitetree');
|
|
|
|
if( st.selected.length )
|
|
selectedNode = st.selected[0];
|
|
else
|
|
selectedNode = st.selected;
|
|
|
|
var parentID = null;
|
|
|
|
while( selectedNode && !parentID ) {
|
|
if( selectedNode && selectedNode.id && selectedNode.id.match(/mailtype_([0-9a-z\-]+)$/) )
|
|
parentID = RegExp.$1;
|
|
else
|
|
selectedNode = selectedNode.parentNode;
|
|
}
|
|
|
|
if(parentID && parentID.substr(0,3) == 'new') {
|
|
alert("You have to save a page before adding children underneath it");
|
|
|
|
} else {
|
|
|
|
this.elements.ParentID.value = parentID;
|
|
|
|
var type = 'draft';
|
|
var selectIDPrefix = 'draft_' + parentID + '_';
|
|
|
|
if( $('add_type').value == 'type' ) {
|
|
type = 'type';
|
|
selectIDPrefix = 'mailtype_';
|
|
}
|
|
|
|
var request = new Ajax.Request( this.action + '?ajax=1&PageType=' + type + '&ParentID=' + parentID, {
|
|
method: 'get',
|
|
asynchronous: true,
|
|
onSuccess : function( response ) {
|
|
|
|
$('Form_EditForm').loadNewPage(response.responseText);
|
|
|
|
// create a new node and add it to the site tree
|
|
if( type == 'draft' ) {
|
|
$('sitetree').addDraftNode('New draft newsletter', parentID, $('Form_EditForm_ID').value );
|
|
} else {
|
|
$('sitetree').addTypeNode('New newsletter type', $('Form_EditForm_ID').value );
|
|
}
|
|
|
|
statusMessage('Added new ' + type);
|
|
},
|
|
|
|
onFailure : function(response) {
|
|
alert(response.responseText);
|
|
statusMessage('Could not add new ' + type );
|
|
}
|
|
});
|
|
}
|
|
|
|
return false;
|
|
},
|
|
|
|
reloadSiteTree: function( response ) {
|
|
statusMessage('Added new newsletter type', 'good' );
|
|
$('sitetree_holder').innerHTML = response.responseText;
|
|
Behaviour.apply( $('sitetree_holder') );
|
|
},
|
|
|
|
button_onclick : function() {
|
|
if(treeactions.toggleSelection(this)) {
|
|
var selectedNode = $('sitetree').firstSelected();
|
|
if(selectedNode) {
|
|
while(selectedNode.parentTreeNode && !selectedNode.hints.defaultChild) {
|
|
$('sitetree').changeCurrentTo(selectedNode.parentTreeNode);
|
|
selectedNode = selectedNode.parentTreeNode;
|
|
}
|
|
}
|
|
|
|
this.o1 = $('sitetree').observeMethod('SelectionChanged', this.treeSelectionChanged.bind(this));
|
|
this.o2 = $(_HANDLER_FORMS[this.id]).observeMethod('Close', this.popupClosed.bind(this));
|
|
}
|
|
return false;
|
|
},
|
|
|
|
treeSelectionChanged: function( treeNode ) {
|
|
this.selected = treeNode;
|
|
},
|
|
|
|
popupClosed: function() {
|
|
$('sitetree').stopObserving(this.o1);
|
|
$(_HANDLER_FORMS.addtype).stopObserving(this.o2);
|
|
}
|
|
}
|
|
|
|
function removeTreeNodeByIdx( tree, nodeID ) {
|
|
var node = tree.getTreeNodeByIdx( nodeID );
|
|
if( node )
|
|
if( node.parentTreeNode )
|
|
node.parentTreeNode.removeTreeNode( node );
|
|
else
|
|
$('sitetree').removeTreeNode( node );
|
|
}
|
|
|
|
/**
|
|
* Initialisation function to set everything up
|
|
*/
|
|
Behaviour.addLoader(function () {
|
|
// Set up add draft
|
|
Observable.applyTo($('addtype_options'));
|
|
|
|
if( $('addtype') ) {
|
|
if( AddForm.button_click )
|
|
$('addtype').getElementsByTagName('a')[0].onclick = function() {return false;};
|
|
if( AddForm.button_click )
|
|
$('addtype_options').onsubmit = AddForm.form_submit;
|
|
}
|
|
// Set up delete drafts
|
|
Observable.applyTo($('deletedrafts_options'));
|
|
|
|
var deleteDrafts = $('deletedrafts');
|
|
|
|
if( deleteDrafts ) {
|
|
deleteDrafts.onclick = deletedraft.button_onclick;
|
|
deleteDrafts.getElementsByTagName('a')[0].onclick = function() {return false;};
|
|
$('deletedrafts_options').onsubmit = deletedraft.form_submit;
|
|
}
|
|
}); |