You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

472 lines
16 KiB

// (c) Copyright by authors of the Tiki Wiki CMS Groupware Project
//
// All Rights Reserved. See copyright.txt for details and a complete list of authors.
// Licensed under the GNU LESSER GENERAL PUBLIC LICENSE. See license.txt for details.
// $Id$
$(document).ready(function () {
var dirty = false,
$options = $("#options");
var setupAdminOptions = function () {
var setDirty = function () {
if ($(".save_menu.disabled").length) {
$(".save_menu").removeClass("disabled").prop("disabled", false);
dirty = true;
}
};
$(".save_menu").addClass("disabled").prop("disabled", true);
$options.find("li").each(function () {
var parent = $(this).data("parent");
if (parent) {
$("#node_" + parent).find(".child-options:first").append(this);
}
});
var sortableOptions = {
group: {
name: 'shared',
},
dataIdAttr: 'data-id',
handle: '.drag-handle',
dragClass: 'dragging-options',
animation: 150,
// invertSwap: true,
// invertedSwapThreshold: 1,
swapThreshold: 0.65,
direction: 'vertical',
forceFallback: true,
fallbackOnBody: true,
// Called when dragging element changes position
onEnd: function(event) {
var parentId = $(event.item).parents('li:first').data('id');
if (!parentId) parentId = 0;
$(event.item).data('parent', parentId);
setDirty();
}
};
var sortable = new Sortable(document.querySelector('#options'), sortableOptions);
document.querySelectorAll('.child-options').forEach(function(el) {
new Sortable(el, sortableOptions);
});
// $options.nestedSortable({
// disableNesting: 'no-nest',
// forcePlaceholderSize: true,
// handle: 'div',
// helper: 'clone',
// items: 'li',
// maxLevels: 4,
// opacity: .6,
// tabSize: 20,
// tolerance: 'pointer',
// toleranceElement: '> div',
// placeholder: "ui-state-highlight",
// rootID: "root",
// // connectWith:"#page_list_container",
// stop: function (event, ui) {
// setDirty();
// $(this).removeClass("ui-state-active");
// },
// start: function (event, ui) {
// $(this).addClass("ui-state-active");
// }
// })
// .droppable({
// classes: {
// "ui-droppable-hover": "ui-state-active"
// },
// drop: function (event, ui) {
// // new option dropped?
// var $dropped = $(ui.draggable).clone();
// if ($dropped.hasClass("new")) {
// $dropped.find(".hidden").removeClass("hidden");
// $dropped.find(".field-label")
// .prop("readonly", false)
// .attr("placeholder", tr("Label"));
// $(ui.helper).hide();
// var element = null,
// $target = [],
// y = event.clientY;
// do {
// element = document.elementFromPoint(event.clientX, y);
// $target = $(element);
// if (! $target.is("li")) {
// $target = $target.parents("li:first");
// }
// y -= 10;
// } while (y > $options.offset().top && ! element);
// $dropped
// .removeClass("new")
// .addClass("option-added")
// .show()
// .attr("id", "node_new_" + $(".option-added", $options).length);
// if ($target.length) {
// $target.after($dropped);
// } else {
// $options.prepend($dropped); // add new one to the top if all else fails
// }
// $dropped.find(".icon-edit").parent()
// .prop("disabled", true)
// .attr("title", "|" + tr("Save all options to enable extended properties editing."))
// .addClass("tips")
// .css("opacity", 0.5)
// .parent()
// .tiki_popover();
// $dropped.find(".field-label").focus();
// setDirty();
// }
// }
// })
// .disableSelection();
new Sortable(document.getElementsByClassName("new-option")[0], {
group: {
name: 'shared',
pull: 'clone',
put: false // Do not allow items to be put into this list
},
handle: '.drag-handle',
dragClass: 'dragging-options',
animation: 150,
// invertSwap: true,
// invertedSwapThreshold: 1,
swapThreshold: 0.65,
direction: 'vertical',
forceFallback: true,
fallbackOnBody: true,
// Called when dragging element changes position
onEnd: function(event) {
// Sets ids
var parentId = $(event.item).parents('li:first').data('id');
if (!parentId) parentId = 0;
// $(event.item).data('id', 0);
$(event.item).data('parent', parentId);
// Additional logic
var $dropped = $(event.item);
$dropped.find(".hidden").removeClass("hidden");
$dropped.find(".field-label")
.prop("readonly", false)
.attr("placeholder", tr("Label"));
$dropped.find(".icon-edit").parent()
.prop("disabled", true)
.attr("title", "|" + tr("Save all options to enable extended properties editing."))
.addClass("tips")
.css("opacity", 0.5)
.parent()
.tiki_popover();
$dropped.find(".field-label").focus();
setDirty();
}
});
// $("#node_new").draggable({
// connectToSortable:"#options",
// revert:"invalid",
// helper:"clone",
// start:function (event, ui) {
// $(ui.helper)
// .css({
// zIndex: 10000,
// width: "800px"
// })
// .find(".hidden").removeClass("hidden")
// ;
// $options.mouseover(function () {
// $options.addClass("over");
// }).mouseout(function () {
// $options.removeClass("over");
// });
// },
// stop:function (event, ui) {
// $(ui.helper).css("z-index", "auto");
// $options.off("mouseover").off("mouseout");
// }
// }).disableSelection();
$options.on("click", ".option-remove", function () {
if (confirm(tr("Are you sure you want to remove this option?"))) {
$(this).parents("li:first").remove();
setDirty();
}
return false;
});
$options.find("input").change(function () {
setDirty();
});
var $previewForm = $("form.preview"),
$previewDiv = $(".preview-menu");
$previewForm
.off("submit")
.submit(function () {
$previewDiv.tikiModal(" ");
var $this = $(this);
$previewDiv.load(
$this.attr("action"),
$this.serialize(),
function () {
$previewDiv.tikiModal();
}
);
return false;
})
.submit()
.find("input,select").change(function () {
$previewForm.submit();
}).trigger("change.select2");
$("#col1").tikiModal();
$(".deploy_menu").click(function () {
window.showModuleEditForm (null, {
modName: "menu",
modPos: $("#preview_position").val(),
modOrd: 1,
dropped: false,
modId: 0,
formVals: {
assign_params: {
id: $("input[name=menuId]").val(),
type: $("#preview_type").val(),
css: $("#preview_css:checked").length ? "y" : "n",
bootstrap: $("#preview_bootstrap:checked").length ? "y" : "n"
}
}
});
/* $.openModal({
remote: "tiki-admin_modules.php?edit_module=true&assign_name=menu&preview=true&assign_params~id=" + $("input[name=menuId]").val() +
"&assign_params~type=" + $("#preview_type").val() +
"&assign_params~css=" + ($("#preview_css:checked").length ? "y" : "n") +
"&assign_params~bootstrap=" + ($("#preview_bootstrap:checked").length ? "y" : "n")+
"&assign_position=" + $("#preview_position").val(),
open: function () {
$("#module_params", this).tabs();
}
});*/
return false;
});
};
$(window).on("beforeunload", function () {
if (dirty) {
return tr("You have unsaved changes to your menu, are you sure you want to continue?");
}
});
$("a.confirm").click(function () {
if (dirty) {
if (confirm(tr("You have unsaved changes to your menu, are you sure you want to continue?"))) {
dirty = false;
return true;
} else {
return false;
}
}
return true;
});
// $(".save_menu").click(function () {
// $options.tikiModal(tr("Saving..."));
// var option, options, $row, saveOptions = [], saveOption, position = 0,
// hasChildren = function (id, options) {
// for (var opt = 0; opt < options.length; opt++) {
// if (options[opt].parent_id === id) {
// return true;
// }
// }
// return false;
// };
// options = $options.nestedSortable('toArray', {startDepthCount: 0, listType: "ol"});
// for (var i = 0; i < options.length; i++) {
// option = options[i];
// saveOption = {};
// if (option.item_id !== "root") {
// $row = $options.find("li#node_" + option.item_id);
// if (! $row.length) {
// $row = $options.find("li#node_new_" + option.item_id);
// saveOption.optionId = 0;
// } else {
// saveOption.optionId = option.item_id;
// }
// if ($row.find("input.samepos:first:checked").length === 0) { // items with samepos checked are alternatives
// position++;
// }
// saveOption.position = position;
// saveOption.name = $row.find("input.field-label").val();
// saveOption.url = $row.find("input.field-url").val();
// switch (option.depth) {
// case 0:
// case 1:
// saveOption.type = 's';
// break;
// default:
// if (hasChildren(option.item_id, options)) {
// saveOption.type = option.depth - 1;
// } else if (saveOption.name && saveOption.name !== "---") {
// saveOption.type = 'o';
// } else {
// saveOption.type = '-';
// }
// }
// saveOptions.push(saveOption);
// }
// }
// // $.post($.service("menu", "save"), {
// // data: $.toJSON(saveOptions),
// // menuId: $("input[name=menuId]").val(),
// // ticket: $("input[name=ticket]").val(),
// // }, function (data) {
// // $options.tikiModal();
// // dirty = false;
// // location.href = location.href;
// // }, "json").always(function () {
// // $options.tikiModal();
// // });
// return false;
// });
$(".save_menu").click(function () {
var lisArr = $('#options li').toArray();
var parentIds = lisArr.map(el => $(el).data('parent')).filter(val => val > 0);
var dataArr = [];
// Type values:
// 's' (0 level),
// 'o' (option without children)
// or levels of numbers 1, 2...etc (with children)
var prevSectionLevel = 0;
var position = 0;
lisArr.forEach(function(el, index) {
position++;
var obj = {
optionId: $(el).data('id'),
parentId: $(el).data('parent'),
position: null,
name: $(el).find('input.field-label').val(),
url: $(el).find('input.field-url').val(),
sectionLevel: null,
type: null
};
var firstOccurrenceObj = getFirstOccurrenceObjByParentId(obj.parentId, dataArr);
var lastObj = getLastObj(dataArr);
if (obj.parentId === 0) {
obj.sectionLevel = 0;
obj.type = 's';
} else if (firstOccurrenceObj) {
obj.sectionLevel = firstOccurrenceObj.sectionLevel;
obj.type = firstOccurrenceObj.sectionLevel;
} else {
obj.sectionLevel = lastObj.sectionLevel + 1;
obj.type = lastObj.sectionLevel + 1;
}
if (!isParent(obj.optionId, parentIds) && obj.parentId !== 0) {
obj.type = 'o';
}
if ((obj.sectionLevel < prevSectionLevel) && obj.type !== 's') {
var levelsBack = prevSectionLevel - obj.sectionLevel;
for (var i = 0; i < levelsBack; i++) {
dataArr.push({
optionId: null,
position: position,
name: 'separator',
url: '',
type: '-'
});
position++;
}
}
prevSectionLevel = obj.sectionLevel;
obj.position = position;
dataArr.push(obj);
});
// console.log(parentIds,dataArr,$("input[name=ticket]").val());
$.post($.service("menu", "save"), {
data: $.toJSON(dataArr),
menuId: $("input[name=menuId]").val(),
ticket: $("input[name=ticket]").val(),
}, function (data) {
$options.tikiModal();
dirty = false;
location.reload();
}, "json").always(function () {
$options.tikiModal();
});
return false;
});
function getFirstOccurrenceObjByParentId(id, arr) {
return arr.find(el => el.parentId === id);
}
function getLastObj(arr) {
return arr[arr.length - 1];
}
function isParent(id, parentIds) {
return parentIds.findIndex(parentId => parentId === id) !== -1;
}
$("#col1").tikiModal(tr("Loading..."));
setTimeout(function () {
setupAdminOptions();
}, 100);
});