$.fn.reverse = [].reverse; function escape(data) { return data.replace(";", "%3B").replace("|", "%7C") } function stopRKey(evt) { var evt = (evt) ? evt : ((event) ? event : null); var node = (evt.target) ? evt.target : ((evt.srcElement) ? evt.srcElement : null); if ((evt.keyCode == 13) && (node.type=="text")) {return false;} } document.onkeypress = stopRKey; var currenttempid = -1 var undoArray = [] var redoArray = [] var pending = [] function setAction(action, rollback) { undoArray.push({"actions": $('#id_actions').val(), "rollback": rollback}); $("#undo").show(); $('#id_actions').val($('#id_actions').val() + action); if ($('#id_actions').val()) window.onbeforeunload = confirmExit; else window.onbeforeunload = null; } function undo() { if (undoArray.length > 0) { redoArray.push({"actions": $('#id_actions').val(), "rollback": $.jstree._reference($("#tree")).get_rollback()}); var u = undoArray.pop(); $('#id_actions').val(u["actions"]); $.jstree.rollback(u["rollback"]); if (undoArray.length == 0) $("#undo").hide(); $("#redo").show(); } if ($('#id_actions').val()) window.onbeforeunload = confirmExit; else window.onbeforeunload = null; return false; } function redo() { if (redoArray.length > 0) { undoArray.push({"actions": $('#id_actions').val(), "rollback": $.jstree._reference($("#tree")).get_rollback()}); var u = redoArray.pop(); $('#id_actions').val(u["actions"]); $.jstree.rollback(u["rollback"]); if (redoArray.length == 0) $("#redo").hide(); $("#undo").show(); } if ($('#id_actions').val()) window.onbeforeunload = confirmExit; else window.onbeforeunload = null; return false; } $("#tree").delegate("li input", "dblclick", function(event){ return False; }); $("#tree").delegate("li", "dblclick", function(event){ var tree = $.jstree._reference($("#tree")) var obj = tree._get_node(this) $("#tree").jstree("rename", obj); event.stopPropagation(); }); $("#tree") .bind("loaded.jstree", function (event, data) { $("#tree").jstree("open_all"); }) .jstree({ "plugins" : [ "themes", "html_data", "ui", "crrm", "contextmenu", "types", "dnd" ], "types" : { "types": { "default" : { "icon" : { "image" : "{{ STATIC_URL }}images/tree/section.png" } } } }, "crrm" : { "input_width_limit" : 400 }, "dnd" : { // prevent copy: make the copy key bogus "copy_modifier" : "bogus" }, "contextmenu": { "select_node": true, "items" : function(obj) { items = { "remove" : false, "create" : false, "ccp": false, "rename" : { "separator_before" : false, "separator_after" : false, "label" : "{% trans "Rename" %}", "action" : function (obj) { this.rename(obj); } }, // add an item of our own "add_section" : { "label" : "{% trans "Add section" %}", "icon" : "create", "action" : function (obj) { var rollback = $.jstree._reference($("#tree")).get_rollback() obj = this._get_node(obj); var newnode = this.create(obj, 'last', {data: 'New section',attr: {'id': currenttempid}}, false, true); currenttempid -= 1; var action = 'add|'+ obj.attr('id') + '|section'; pending.push({'action': action, 'rollback': rollback}) this.rename(newnode); }, "separator_before" : true } } obj = this._get_node(obj); if (parseInt(obj.attr('id')) < 0) { items.remove = { "separator_before" : false, "icon" : false, "separator_after" : false, "label" : "{% trans "Delete" %}", "action" : function (obj) { this.remove(obj); } } } return items } } }) .bind('move_node.jstree', function (e, data) { var action = 'move|' + data.rslt.o.attr('id') + '|' + data.rslt.r.attr('id') + '|' + data.rslt.p + ';'; setAction(action, data.rlbk); }) .bind('rename.jstree', function (e, data) { if (pending.length > 0) { p = pending.pop(); var action = p.action + '|' + escape(data.rslt.new_name) + ';' var rollback = p.rollback; } else { var action = 'rename|'+ data.rslt.obj.attr('id') + '|' + escape(data.rslt.new_name) + ';'; var rollback = data.rlbk; } setAction(action, rollback); }) .bind('delete_node.jstree', function (e, data) { var action = 'delete|'+ data.rslt.obj.attr('id') + ';'; var rollback = data.rlbk; setAction(action, rollback); }); $('table.edittable').hide(); $('#undo').click(undo); $('#redo').click(redo); $('#undo').hide(); $('#redo').hide();