780 lines
22 KiB
JavaScript
780 lines
22 KiB
JavaScript
|
/*##################################################|*/
|
||
|
/* #CMS# */
|
||
|
(function($) {
|
||
|
// CMS.$ will be passed for $
|
||
|
$(document).ready(function () {
|
||
|
/*!
|
||
|
* TreeManager
|
||
|
* Handles treeview
|
||
|
* TODO this will be refactored in 3.1
|
||
|
*/
|
||
|
CMS.TreeManager = new CMS.Class({
|
||
|
|
||
|
options: {
|
||
|
'lang': {}
|
||
|
},
|
||
|
|
||
|
initialize: function (options) {
|
||
|
this.options = $.extend(true, {}, this.options, options);
|
||
|
|
||
|
// load internal functions
|
||
|
if(!this.options.settings.filtered) {
|
||
|
this.setupFunctions();
|
||
|
this.setupTreePublishing();
|
||
|
this.setupUIHacks();
|
||
|
this.setupGlobals();
|
||
|
this.setupTree();
|
||
|
|
||
|
// init tree component
|
||
|
initTree();
|
||
|
} else {
|
||
|
// when filtered is active, prevent tree actions
|
||
|
this.setupUIHacks();
|
||
|
}
|
||
|
},
|
||
|
|
||
|
setupFunctions: function () {
|
||
|
var that = this;
|
||
|
|
||
|
$.syncCols = function(){
|
||
|
$('#sitemap .col-softroot').syncWidth(0);
|
||
|
$('#sitemap .col-apphook').syncWidth(0);
|
||
|
$('#sitemap .col-language').syncWidth(0);
|
||
|
$('#sitemap .col-navigation').syncWidth(0);
|
||
|
$('#sitemap .col-actions').syncWidth(0);
|
||
|
$('#sitemap .col-info').syncWidth(0);
|
||
|
|
||
|
that.refreshColumns.call($('ul.tree-default li'));
|
||
|
};
|
||
|
|
||
|
/* Colums width sync */
|
||
|
$.fn.syncWidth = function(max) {
|
||
|
var visible = false;
|
||
|
|
||
|
$(this).each(function() {
|
||
|
if($(this).is(':visible')) {
|
||
|
visible = true;
|
||
|
var val= $(this).width();
|
||
|
if(val > max){
|
||
|
max = val;
|
||
|
}
|
||
|
}
|
||
|
});
|
||
|
if (visible && max > 0) {
|
||
|
$(this).each(function() {
|
||
|
$(this).css('width', max);
|
||
|
});
|
||
|
}
|
||
|
};
|
||
|
|
||
|
// jquery.functional
|
||
|
$.curry = function(fn) {
|
||
|
if (arguments.length < 2) return fn;
|
||
|
args = $.makeArray(arguments).slice(1, arguments.length);
|
||
|
return function() {
|
||
|
return fn.apply(this, args.concat($.makeArray(arguments)));
|
||
|
}
|
||
|
};
|
||
|
|
||
|
$.__callbackPool = {};
|
||
|
|
||
|
$.callbackRegister = function(name, fn /*, arg0, arg1, ..*/){
|
||
|
if (arguments.length > 2) {
|
||
|
// create curried function
|
||
|
fn = $.curry.apply(this, $.makeArray(arguments).slice(1, arguments.length));
|
||
|
}
|
||
|
$.__callbackPool[name] = fn;
|
||
|
return name;
|
||
|
};
|
||
|
|
||
|
$.callbackCall = function(name/*, extra arg0, extra arg1, ..*/){
|
||
|
if (!name || !name in $.__callbackPool) {
|
||
|
throw "No callback registered with name: " + name;
|
||
|
}
|
||
|
$.__callbackPool[name].apply(this, $.makeArray(arguments).slice(1, arguments.length));
|
||
|
$.callbackRemove(name);
|
||
|
return name;
|
||
|
};
|
||
|
|
||
|
$.callbackRemove = function(name) {
|
||
|
delete $.__callbackPool[name];
|
||
|
};
|
||
|
|
||
|
// very simple yellow fade plugin..
|
||
|
$.fn.yft = function(){
|
||
|
this.effect("highlight", {}, 1000);
|
||
|
};
|
||
|
|
||
|
// jquery replace plugin :)
|
||
|
$.fn.replace = function(o) {
|
||
|
return this.after(o).remove().end();
|
||
|
};
|
||
|
|
||
|
},
|
||
|
|
||
|
setupTreePublishing: function () {
|
||
|
// ADD DIRECT PUBLISHING
|
||
|
var that = this;
|
||
|
var tree = $('.tree');
|
||
|
var langTrigger = '.col-language .trigger-tooltip span';
|
||
|
var langTooltips = '.language-tooltip';
|
||
|
var langTimer = function () {};
|
||
|
var langDelay = 100;
|
||
|
var langFadeDuration = 200;
|
||
|
|
||
|
// show the tooltip
|
||
|
tree.delegate(langTrigger, 'mouseenter', function () {
|
||
|
var el = $(this).closest('.col-language').find('.language-tooltip');
|
||
|
var anchors = el.find('a');
|
||
|
var span = $(this);
|
||
|
|
||
|
// clear timer
|
||
|
clearTimeout(langTimer);
|
||
|
|
||
|
// cancel if tooltip already visible
|
||
|
if(el.is(':visible')) return false;
|
||
|
|
||
|
// set correct position
|
||
|
el.css('right', 20 + $(this).position().left);
|
||
|
|
||
|
// figure out what should be shown
|
||
|
anchors.hide();
|
||
|
if(span.hasClass('unpublished') || span.hasClass('unpublishedparent')) anchors.eq(1).show();
|
||
|
if(span.hasClass('published')) anchors.eq(0).show();
|
||
|
if(span.hasClass('dirty')) anchors.show().parent().addClass('language-tooltip-multiple');
|
||
|
|
||
|
// hide all elements
|
||
|
$(langTooltips).fadeOut(langDelay);
|
||
|
|
||
|
// use a timeout to display the tooltip
|
||
|
langTimer = setTimeout(function () {
|
||
|
el.stop(true, true).fadeIn(langFadeDuration);
|
||
|
}, langDelay);
|
||
|
});
|
||
|
// hide the tooltip when leaving the area
|
||
|
tree.delegate(langTrigger, 'mouseleave', function () {
|
||
|
// clear timer
|
||
|
clearTimeout(langTimer);
|
||
|
// hide all elements
|
||
|
langTimer = setTimeout(function () {
|
||
|
$(langTooltips).fadeOut(langFadeDuration);
|
||
|
}, langDelay * 2);
|
||
|
});
|
||
|
// reset hiding when entering the tooltip itself
|
||
|
tree.delegate(langTooltips, 'mouseover', function () {
|
||
|
// clear timer
|
||
|
clearTimeout(langTimer);
|
||
|
});
|
||
|
tree.delegate(langTooltips, 'mouseleave', function () {
|
||
|
// hide all elements
|
||
|
langTimer = setTimeout(function () {
|
||
|
$(langTooltips).fadeOut(langFadeDuration);
|
||
|
}, langDelay * 2);
|
||
|
});
|
||
|
// attach double check event if publish or unpublish should be triggered
|
||
|
tree.delegate('.language-tooltip a', 'click', function (e) {
|
||
|
e.preventDefault();
|
||
|
|
||
|
// cancel if not confirmed
|
||
|
if(!confirm(that.options.lang.publish.replace('§', $(this).text().toLowerCase()))) return false;
|
||
|
|
||
|
// publish page and update
|
||
|
window.location.href = $(this).attr('href');
|
||
|
});
|
||
|
},
|
||
|
|
||
|
setupUIHacks: function () {
|
||
|
// enables tab click on title entry to open in new window
|
||
|
$('.tree').delegate('.col1 .title', 'click', function (e) {
|
||
|
if(!e.metaKey) {
|
||
|
window.top.location.href = $(this).attr('href');
|
||
|
} else {
|
||
|
window.open($(this).attr('href'), '_blank');
|
||
|
}
|
||
|
});
|
||
|
|
||
|
// adds functionality to the filter
|
||
|
$('#changelist-filter-button').bind('click', function () {
|
||
|
$("#changelist-filter").toggle();
|
||
|
});
|
||
|
|
||
|
// set correct active entry
|
||
|
if(window.parent && window.parent.CMS && window.parent.CMS.config) {
|
||
|
var page_id = window.parent.CMS.config.request.page_id;
|
||
|
|
||
|
$('div[data-page_id="'+page_id+'"]').addClass('cont-active');
|
||
|
}
|
||
|
},
|
||
|
|
||
|
setupGlobals: function () {
|
||
|
var that = this;
|
||
|
var msg = '';
|
||
|
var parent = null;
|
||
|
|
||
|
window.moveSuccess = function(node){
|
||
|
$.syncCols();
|
||
|
|
||
|
msg = $('<span class="success">'+that.options.lang.success+'</span>');
|
||
|
parent = window.parent;
|
||
|
|
||
|
node.after(msg);
|
||
|
node.parent().find('.col2').hide();
|
||
|
msg.fadeOut(1000, function () {
|
||
|
node.parent().find('.col2').show()
|
||
|
});
|
||
|
// check for reload changes
|
||
|
if(window.self !== window.top) {
|
||
|
window.parent.CMS.API.Helpers.reloadBrowser(false, false, true);
|
||
|
window.parent.CMS.API.Toolbar.openMessage(that.options.lang.changes, false, 0);
|
||
|
}
|
||
|
};
|
||
|
|
||
|
window.moveError = function(node,message){
|
||
|
if(message && message !== 'error') {
|
||
|
msg = $('<span class="success">'+message+'</span>');
|
||
|
}
|
||
|
else {
|
||
|
msg = $('<span class="success">'+that.options.lang.error+'</span>');
|
||
|
}
|
||
|
node.parent().find('.col2').hide();
|
||
|
node.after(msg);
|
||
|
};
|
||
|
|
||
|
},
|
||
|
|
||
|
setupTree: function () {
|
||
|
var that = this;
|
||
|
var tree;
|
||
|
// global initTree function
|
||
|
initTree = function(){
|
||
|
tree = new tree_component();
|
||
|
var options = {
|
||
|
rules: {
|
||
|
clickable: "all",
|
||
|
renameable: "none",
|
||
|
deletable: "all",
|
||
|
creatable: "all",
|
||
|
draggable: "all",
|
||
|
dragrules: "all",
|
||
|
droppable: "all",
|
||
|
metadata : "mdata",
|
||
|
use_inline: true
|
||
|
//droppable : ["tree_drop"]
|
||
|
},
|
||
|
path: false,
|
||
|
ui: {
|
||
|
dots: true,
|
||
|
rtl: false,
|
||
|
animation: 0,
|
||
|
hover_mode: true,
|
||
|
//theme_path: script_url_path() + "/../jstree/themes/",
|
||
|
a_class: "title"
|
||
|
},
|
||
|
cookies : {
|
||
|
prefix: "djangocms_nodes"
|
||
|
},
|
||
|
callback: {
|
||
|
beforemove : function(what, where, position) {
|
||
|
item_id = what.id.split("page_")[1];
|
||
|
target_id = where.id.split("page_")[1];
|
||
|
old_node = what;
|
||
|
|
||
|
if($(what).parent().children("li").length > 1){
|
||
|
if($(what).next("li").length){
|
||
|
old_target = $(what).next("li")[0];
|
||
|
old_position = "right";
|
||
|
}
|
||
|
if($(what).prev("li").length){
|
||
|
old_target = $(what).prev("li")[0];
|
||
|
old_position = "left";
|
||
|
}
|
||
|
}else{
|
||
|
if($(what).attr("rel") != "topnode"){
|
||
|
old_target = $(what).parent().parent()[0];
|
||
|
old_position = "inside";
|
||
|
}
|
||
|
}
|
||
|
|
||
|
addUndo(what, where, position);
|
||
|
return true;
|
||
|
},
|
||
|
onmove: function(what, where, position){
|
||
|
item_id = what.id.split("page_")[1];
|
||
|
target_id = where.id.split("page_")[1];
|
||
|
|
||
|
if (position == "before") {
|
||
|
position = "left";
|
||
|
}else if (position == "after") {
|
||
|
position = "right";
|
||
|
}else if(position == "inside"){
|
||
|
position = "last-child";
|
||
|
}
|
||
|
moveTreeItem(what, item_id, target_id, position, false);
|
||
|
},
|
||
|
|
||
|
onload: function () {
|
||
|
setTimeout(function () {
|
||
|
reCalc();
|
||
|
}, 250);
|
||
|
}
|
||
|
|
||
|
}
|
||
|
};
|
||
|
|
||
|
if (!$($("div.tree").get(0)).hasClass('root_allow_children')){
|
||
|
// disalow possibility for adding subnodes to main tree, user doesn't
|
||
|
// have permissions for this
|
||
|
options.rules.dragrules = ["node inside topnode", "topnode inside topnode", "node * node"];
|
||
|
}
|
||
|
|
||
|
tree.init($("div.tree"), options);
|
||
|
};
|
||
|
|
||
|
selected_page = false;
|
||
|
action = false;
|
||
|
|
||
|
var _oldAjax = $.ajax;
|
||
|
|
||
|
$.ajax = function(s){
|
||
|
// just override ajax function, so the loader message gets displayed
|
||
|
// always
|
||
|
$('#loader-message').show();
|
||
|
|
||
|
callback = s.success || false;
|
||
|
s.success = function(data, status){
|
||
|
if (callback) {
|
||
|
callback(data, status);
|
||
|
}
|
||
|
$('#loader-message').hide();
|
||
|
};
|
||
|
|
||
|
// just for debuging!!
|
||
|
/*s.complete = function(xhr, status) {
|
||
|
if (status == "error" && that.options.settings.debug) {
|
||
|
$('body').before(xhr.responseText);
|
||
|
}
|
||
|
}*/
|
||
|
// end just for debuging
|
||
|
|
||
|
// TODO: add error state!
|
||
|
return _oldAjax(s);
|
||
|
};
|
||
|
|
||
|
function refresh(){
|
||
|
window.location = window.location.href;
|
||
|
}
|
||
|
|
||
|
function refreshIfChildren(pageId){
|
||
|
return $('#page_' + pageId).find('li[id^=page_]').length ? refresh : function(){ return true; };
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Loads remote dialog to dialogs div.
|
||
|
*
|
||
|
* @param {String} url
|
||
|
* @param {Object} data Data to be send over post
|
||
|
* @param {Function} noDialogCallback Gets called when response is empty.
|
||
|
* @param {Function} callback Standard callback function.
|
||
|
*/
|
||
|
function loadDialog(url, data, noDialogCallback, callback){
|
||
|
if (data === undefined) data = {};
|
||
|
$.post(url, data, function(response) {
|
||
|
if (response == '' && noDialogCallback) noDialogCallback();
|
||
|
$('#dialogs').empty().append(response);
|
||
|
if (callback) callback(response);
|
||
|
});
|
||
|
}
|
||
|
|
||
|
// let's start event delegation
|
||
|
$('#changelist li').click(function(e) {
|
||
|
// I want a link to check the class
|
||
|
if(e.target.tagName == 'IMG' || e.target.tagName == 'SPAN') {
|
||
|
target = e.target.parentNode;
|
||
|
} else {
|
||
|
target = e.target;
|
||
|
}
|
||
|
var jtarget = $(target);
|
||
|
if(jtarget.hasClass("move")) {
|
||
|
// prepare tree for move / cut paste
|
||
|
var id = e.target.id.split("move-link-")[1];
|
||
|
if(id==null){
|
||
|
id = e.target.parentNode.id.split("move-link-")[1];
|
||
|
}
|
||
|
var page_id = id;
|
||
|
selected_page = page_id;
|
||
|
action = "move";
|
||
|
$('span.move-target-container, span.line, a.move-target').show();
|
||
|
$('#page_'+page_id).addClass("selected");
|
||
|
$('#page_'+page_id+' span.move-target-container').hide();
|
||
|
e.stopPropagation();
|
||
|
return false;
|
||
|
}
|
||
|
|
||
|
if(jtarget.hasClass("copy")) {
|
||
|
// prepare tree for copy
|
||
|
id = e.target.id.split("copy-link-")[1];
|
||
|
if(id==null){
|
||
|
id = e.target.parentNode.id.split("copy-link-")[1];
|
||
|
}
|
||
|
selected_page = id;
|
||
|
action = mark_copy_node(id);
|
||
|
e.stopPropagation();
|
||
|
return false;
|
||
|
}
|
||
|
|
||
|
if(jtarget.hasClass("viewpage")) {
|
||
|
var view_page_url = $('#' + target.id + '-select').val();
|
||
|
if(view_page_url){
|
||
|
window.open(view_page_url);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
if(jtarget.hasClass("addlink")) {
|
||
|
if (!/#$/g.test(jtarget.attr('href'))) {
|
||
|
// if there is url instead of # inside href, follow this url
|
||
|
// used if user haves add_page
|
||
|
return true;
|
||
|
}
|
||
|
|
||
|
$("tr").removeClass("target");
|
||
|
$("#changelist table").removeClass("table-selected");
|
||
|
page_id = target.id.split("add-link-")[1];
|
||
|
selected_page = page_id;
|
||
|
action = "add";
|
||
|
$('tr').removeClass("selected");
|
||
|
$('#page-row-'+page_id).addClass("selected");
|
||
|
$('.move-target-container').hide();
|
||
|
$('a.move-target, span.line, #move-target-'+page_id).show();
|
||
|
e.stopPropagation();
|
||
|
return false;
|
||
|
}
|
||
|
|
||
|
// don't assume admin site is root-level
|
||
|
// grab base url to construct full absolute URLs
|
||
|
admin_base_url = document.URL.split("/cms/page/")[0] + "/";
|
||
|
|
||
|
// in navigation
|
||
|
if(jtarget.hasClass('navigation-checkbox')) {
|
||
|
e.stopPropagation();
|
||
|
|
||
|
var pageId = jtarget.attr('name').split('navigation-')[1];
|
||
|
var language = jtarget.closest('.cont').find('a[lang]').attr('lang') || '';
|
||
|
|
||
|
// if I don't put data in the post, django doesn't get it
|
||
|
reloadItem(jtarget, admin_base_url + 'cms/page/' + pageId + '/change-navigation/?language=' + language, { 1:1 });
|
||
|
}
|
||
|
|
||
|
// lazy load descendants on tree open
|
||
|
if(jtarget.hasClass("closed")) {
|
||
|
// only load them once
|
||
|
if(jtarget.find('ul > li').length == 0 && !jtarget.hasClass("loading")) {
|
||
|
// keeps this event from firing multiple times before
|
||
|
// the dom as changed. it still needs to propagate for
|
||
|
// the other click event on this element to fire
|
||
|
jtarget.addClass("loading");
|
||
|
var pageId = $(jtarget).attr("id").split("page_")[1];
|
||
|
var language = $(jtarget).children('div.cont').children('div.col1').children('.title').attr('lang')
|
||
|
$.get(admin_base_url + "cms/page/" + pageId + "/" + language + "/descendants/", {}, function(r, status) {
|
||
|
jtarget.children('ul').append(r);
|
||
|
// show move targets if needed
|
||
|
if($('span.move-target-container:visible').length > 0) {
|
||
|
jtarget.children('ul').find('a.move-target, span.move-target-container, span.line').show();
|
||
|
}
|
||
|
reCalc();
|
||
|
});
|
||
|
} else{
|
||
|
reCalc();
|
||
|
}
|
||
|
}
|
||
|
|
||
|
if(jtarget.hasClass("move-target")) {
|
||
|
if(jtarget.hasClass("left")){
|
||
|
position = "left";
|
||
|
}
|
||
|
if(jtarget.hasClass("right")){
|
||
|
position = "right";
|
||
|
}
|
||
|
if(jtarget.hasClass("last-child")){
|
||
|
position = "last-child";
|
||
|
}
|
||
|
target_id = target.parentNode.id.split("move-target-")[1];
|
||
|
|
||
|
if(action=="move") {
|
||
|
moveTreeItem(null, selected_page, target_id, position, tree);
|
||
|
$('.move-target-container').hide();
|
||
|
}else if(action=="copy") {
|
||
|
site = $('#site-select')[0].value;
|
||
|
copyTreeItem(selected_page, target_id, position, site);
|
||
|
$('.move-target-container').hide();
|
||
|
}else if(action=="add") {
|
||
|
site = $('#site-select')[0].value;
|
||
|
window.location.href = window.location.href.split("?")[0].split("#")[0] + 'add/?target='+target_id+"&position="+position+"&site="+site;
|
||
|
}
|
||
|
e.stopPropagation();
|
||
|
return false;
|
||
|
}
|
||
|
return true;
|
||
|
});
|
||
|
$("div#sitemap").show();
|
||
|
|
||
|
function reCalc(){
|
||
|
$.syncCols();
|
||
|
}
|
||
|
|
||
|
$(window).bind('resize', reCalc);
|
||
|
/* Site Selector */
|
||
|
$('#site-select').change(function(){
|
||
|
var form = $(this).closest('form');
|
||
|
// add correct value for copy
|
||
|
if(action === 'copy') $('#site-copy').val(selected_page);
|
||
|
// submit form
|
||
|
form.submit();
|
||
|
});
|
||
|
|
||
|
//
|
||
|
// If an A element has a data-attribute 'alt-class'. At this time,
|
||
|
// this is only the edit button in the page-tree, but could be
|
||
|
// more in future. It is important that the CSS be written in such
|
||
|
// a manner that the alt-class is defined after the normal class,
|
||
|
// so that it can be overridden when the alt-key is depressed.
|
||
|
//
|
||
|
// NOTE: This 'preview' part of the 'alt-click to [alternative
|
||
|
// function]' feature may not work in some environments (Windows
|
||
|
// in a some virtual machine environments, notably), but is only a
|
||
|
// nice-'extra', not a requirement for the feature.
|
||
|
//
|
||
|
$(document).on('keydown keyup', function(evt){
|
||
|
if (evt.which === 18) {
|
||
|
$('a[data-alt-class]').each(function(){
|
||
|
var self = $(this);
|
||
|
self.toggleClass(self.data('alt-class'), evt.type === 'keydown');
|
||
|
})
|
||
|
}
|
||
|
});
|
||
|
|
||
|
//
|
||
|
// If the A-element has a data-attribute 'alt-href', then this
|
||
|
// click-handler uses that instead of the normal href attribute as
|
||
|
// the click-destination. Again, currently this is only on the
|
||
|
// edit button, but could be more in future.
|
||
|
//
|
||
|
$('a[data-alt-href]').on('click', function(evt){
|
||
|
var href;
|
||
|
evt.preventDefault();
|
||
|
if (evt.shiftKey) {
|
||
|
href = $(this).data('alt-href');
|
||
|
}
|
||
|
else {
|
||
|
href = $(this).attr('href');
|
||
|
}
|
||
|
window.location = href;
|
||
|
});
|
||
|
|
||
|
var copy_splits = window.location.href.split("copy=");
|
||
|
if(copy_splits.length > 1){
|
||
|
var id = copy_splits[1].split("&")[0];
|
||
|
var action = mark_copy_node(id);
|
||
|
selected_page = id;
|
||
|
}
|
||
|
|
||
|
function copyTreeItem(item_id, target_id, position, site){
|
||
|
if (that.options.settings.permission) {
|
||
|
return loadDialog('./' + item_id + '/dialog/copy/', {
|
||
|
position:position,
|
||
|
target:target_id,
|
||
|
site:site,
|
||
|
callback: $.callbackRegister("_copyTreeItem", _copyTreeItem, item_id, target_id, position, site)
|
||
|
});
|
||
|
}
|
||
|
return _copyTreeItem(item_id, target_id, position, site);
|
||
|
}
|
||
|
|
||
|
function _copyTreeItem(item_id, target_id, position, site, options) {
|
||
|
var data = {
|
||
|
position:position,
|
||
|
target:target_id,
|
||
|
site:site
|
||
|
};
|
||
|
data = $.extend(data, options);
|
||
|
|
||
|
$.post("./" + item_id + "/copy-page/", data, function(decoded) {
|
||
|
response = decoded.content;
|
||
|
status = decoded.status;
|
||
|
if(status==200) {
|
||
|
// reload tree
|
||
|
window.location = window.location.href;
|
||
|
}else{
|
||
|
alert(response);
|
||
|
moveError($('#page_'+item_id + " div.col1:eq(0)"),response);
|
||
|
}
|
||
|
});
|
||
|
}
|
||
|
|
||
|
function mark_copy_node(id){
|
||
|
$('a.move-target, span.move-target-container, span.line').show();
|
||
|
$('#page_'+id).addClass("selected");
|
||
|
$('#page_'+id).parent().parent().children('div.cont').find('a.move-target.first-child, span.second').hide();
|
||
|
$('#page_'+id).parent().parent().children('ul').children('li').children('div.cont').find('a.move-target.left, a.move-target.right, span.first, span.second').hide();
|
||
|
return "copy";
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Reloads tree item (one line). If some filtering is found, adds
|
||
|
* filtered variable into posted data.
|
||
|
*
|
||
|
* @param {HTMLElement} el Any child element of tree item
|
||
|
* @param {String} url Requested url
|
||
|
* @param {Object} data Optional posted data
|
||
|
* @param {Function} callback Optional calback function
|
||
|
*/
|
||
|
function reloadItem(el, url, data, callback, errorCallback) {
|
||
|
if (data === undefined) data = {};
|
||
|
|
||
|
if (/\/\?/ig.test(window.location.href)) {
|
||
|
// probably some filter here, tell backend, we need a filtered
|
||
|
// version of item
|
||
|
data['fitlered'] = 1;
|
||
|
}
|
||
|
|
||
|
function onSuccess(response, textStatus) {
|
||
|
var status = true;
|
||
|
var target = null;
|
||
|
|
||
|
if(callback) status = callback(response, textStatus);
|
||
|
if(status) {
|
||
|
if (/page_\d+/.test($(el).attr('id'))) {
|
||
|
// one level higher
|
||
|
target = $(el).find('div.cont:first');
|
||
|
} else {
|
||
|
target = $(el).parents('div.cont:first');
|
||
|
}
|
||
|
|
||
|
var parent = target.parent();
|
||
|
|
||
|
// remove the element if something went wrong
|
||
|
if(response == 'NotFound') return parent.remove();
|
||
|
|
||
|
var origin = $('.messagelist');
|
||
|
target.replace(response);
|
||
|
|
||
|
var messages = $(parent).find('.messagelist');
|
||
|
if(messages.length) {
|
||
|
origin.remove();
|
||
|
messages.insertAfter('.breadcrumbs');
|
||
|
}
|
||
|
parent.find('div.cont:first').yft();
|
||
|
|
||
|
// ensure after removal everything is aligned again
|
||
|
$(window).trigger('resize');
|
||
|
}
|
||
|
}
|
||
|
|
||
|
$.ajax({
|
||
|
'type': 'POST',
|
||
|
'data': data,
|
||
|
'url': url,
|
||
|
'success': onSuccess,
|
||
|
'error': function (XMLHttpRequest, textStatus, errorThrown) {
|
||
|
// errorCallback is passed through the reloadItem function
|
||
|
if(errorCallback) errorCallback(XMLHttpRequest, textStatus, errorThrown);
|
||
|
},
|
||
|
'xhr': (window.ActiveXObject) ? function(){try {return new window.ActiveXObject("Microsoft.XMLHTTP");} catch(e) {}} : function() {return new window.XMLHttpRequest();}
|
||
|
});
|
||
|
}
|
||
|
|
||
|
function moveTreeItem(jtarget, item_id, target_id, position, tree){
|
||
|
reloadItem(
|
||
|
jtarget, "./" + item_id + "/move-page/",
|
||
|
|
||
|
{ position: position, target: target_id },
|
||
|
|
||
|
// on success
|
||
|
function(decoded,textStatus){
|
||
|
response = decoded.content;
|
||
|
status = decoded.status;
|
||
|
if(status==200) {
|
||
|
if (tree) {
|
||
|
var tree_pos = {'left': 'before', 'right': 'after'}[position] || 'inside';
|
||
|
tree.moved("#page_" + item_id, $("#page_" + target_id + " a.title")[0], tree_pos, false, false);
|
||
|
} else {
|
||
|
moveSuccess($('#page_'+item_id + " div.col1:eq(0)"));
|
||
|
}
|
||
|
return false;
|
||
|
}
|
||
|
else {
|
||
|
moveError($('#page_'+item_id + " div.col1:eq(0)"),response);
|
||
|
return false;
|
||
|
}
|
||
|
}
|
||
|
);
|
||
|
}
|
||
|
|
||
|
var undos = [];
|
||
|
|
||
|
function addUndo(node, target, position){
|
||
|
undos.push({node:node, target:target, position:position});
|
||
|
}
|
||
|
},
|
||
|
|
||
|
refreshColumns: function () {
|
||
|
$('div.col2').children('div').each(function(index, item){
|
||
|
$(item).css('display', 'block');
|
||
|
});
|
||
|
var min_width = 100000;
|
||
|
var max_col2_width = 0;
|
||
|
var max_col2 = null;
|
||
|
$(this).each(function() {
|
||
|
var cont = $(this).children('div.cont');
|
||
|
if (!cont.is(':visible')) {
|
||
|
return;
|
||
|
}
|
||
|
var col1 = cont.children('div.col1');
|
||
|
var col2 = cont.children('div.col2');
|
||
|
var col1_width = col1.outerWidth(true);
|
||
|
var col2_width = col2.outerWidth(true);
|
||
|
var total_width = cont.outerWidth(true);
|
||
|
|
||
|
var dif = total_width - col1_width;
|
||
|
if(dif < min_width){
|
||
|
min_width = dif;
|
||
|
}
|
||
|
if(col2_width > max_col2_width){
|
||
|
max_col2_width = col2_width;
|
||
|
max_col2 = col2
|
||
|
}
|
||
|
});
|
||
|
|
||
|
var offset = 50;
|
||
|
var w = 0;
|
||
|
var hidden_count = 0;
|
||
|
var max_reached = false;
|
||
|
if(max_col2){
|
||
|
max_col2.children('div').each(function(){
|
||
|
if(!max_reached){
|
||
|
w += $(this).outerWidth(true);
|
||
|
}
|
||
|
|
||
|
if(max_reached || w > (min_width - offset)){
|
||
|
hidden_count = hidden_count + 1;
|
||
|
max_reached = true
|
||
|
}
|
||
|
});
|
||
|
|
||
|
if(hidden_count){
|
||
|
$(this).each(function() {
|
||
|
$(this).children('div.cont').children('div.col2').children('div').slice(-hidden_count).each(function(){
|
||
|
$(this).css('display', 'none');
|
||
|
})
|
||
|
});
|
||
|
$('div#sitemap ul.header div.col2').children().slice(-hidden_count).each(function(){
|
||
|
$(this).css('display','none');
|
||
|
})
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
});
|
||
|
|
||
|
});
|
||
|
})(CMS.$);
|