mirror of
https://github.com/silverstripe/silverstripe-reports
synced 2024-10-22 11:05:53 +02:00
7f4dd7279b
(merged from branches/gsoc) git-svn-id: svn://svn.silverstripe.com/silverstripe/open/modules/cms/trunk@42061 467b73ca-7a2a-4603-9d3b-597d59a354a9
409 lines
12 KiB
JavaScript
Executable File
409 lines
12 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 st = $('sitetree');
|
|
// BUGFIX: If there is nothing in the left tree we need to add a Newsletter type first to prevent errors
|
|
if(typeof st.lastTreeNode() == 'undefined') {
|
|
$('sitetree').addTypeNode('New newsletter type', $('Form_EditForm_ID').value );
|
|
}
|
|
// BUGFIX: If no selection is made in the left tree, and a draft is added, parentID won't be set,
|
|
// so we need to use the value from the Draft edit form.
|
|
parentID = $('Form_EditForm_ParentID').value;
|
|
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 );
|
|
// Change the 'Create...' drop-down to 'Add a draft' since this will be the logical next action after a Newsletter type is created
|
|
$('add_type').value = 'draft';
|
|
}
|
|
}
|
|
|
|
|
|
/**
|
|
* 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) {
|
|
if(confirm("Do you really want to these Newsletter items?")) {
|
|
$('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('button')[0].onclick();
|
|
}
|
|
} else {
|
|
alert("Please select at least 1 Newsletter item.");
|
|
}
|
|
|
|
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() {
|
|
// Change the 'Create...' drop-down to 'Add a draft' whenever a selection is made in the left tree
|
|
$('add_type').value = 'draft';
|
|
$('sitetree').changeCurrentTo(this);
|
|
if($('sitetree').notify('SelectionChanged', this)) {
|
|
autoSave(true, this.getPageFromServer.bind(this));
|
|
}
|
|
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, numEmails ) {
|
|
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 newsletter to mailing list. Sent ' + numEmails + ' emails successfully.', 'good');
|
|
}
|
|
|
|
function resent_ok( newsletterID, sentID, numEmails ) {
|
|
statusMessage('Resent newsletter to mailing list. Sent ' + numEmails + ' emails successfully.', '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('button')[0].onclick = function() {
|
|
var st = $('sitetree');
|
|
if (st) {
|
|
// Select 'Add new draft' if the left tree is not empty,
|
|
// because, most likely, the user will want to add a new draft if they already have a newsletter type
|
|
if (typeof st.lastTreeNode() != 'undefined') {
|
|
$('add_type').value = 'draft';
|
|
} else {
|
|
$('add_type').value = 'type';
|
|
}
|
|
} else {
|
|
$('add_type').value = 'type';
|
|
}
|
|
}
|
|
$(_HANDLER_FORMS[this.id]).onsubmit = this.form_submit;
|
|
},
|
|
|
|
form_submit : function() {
|
|
var st = $('sitetree');
|
|
if (st) {
|
|
if( st.selected && st.selected.length ) {
|
|
selectedNode = st.selected[0];
|
|
} else {
|
|
selectedNode = st.selected;
|
|
}
|
|
} else {
|
|
var selectedNode = null;
|
|
}
|
|
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 {
|
|
if (this.elements) {
|
|
this.elements.ParentID.value = parentID;
|
|
}
|
|
|
|
var type = 'draft';
|
|
var selectIDPrefix = 'draft_' + parentID + '_';
|
|
|
|
if( $('add_type').value == 'type' ) {
|
|
type = 'type';
|
|
selectIDPrefix = 'mailtype_';
|
|
}
|
|
// Call either addtype or adddraft
|
|
var request = new Ajax.Request( this.action + type + '?ajax=1' + '&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('button')[0].onclick = function() {return false;};
|
|
$('deletedrafts_options').onsubmit = deletedraft.form_submit;
|
|
}
|
|
}); |