jquery.nestable++.js 5.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201
  1. /*jslint browser: true, devel: true, white: true, eqeq: true, plusplus: true, sloppy: true, vars: true*/
  2. /*global $ */
  3. /*************** General ***************/
  4. var updateOutput = function (e) {
  5. var list = e.length ? e : $(e.target),
  6. output = list.data('output');
  7. if (window.JSON) {
  8. if (output) {
  9. output.val(window.JSON.stringify(list.nestable('serialize')));
  10. }
  11. } else {
  12. alert('JSON browser support required for this page.');
  13. }
  14. };
  15. var nestableList = $(".dd.nestable > .dd-list");
  16. /***************************************/
  17. /*************** Delete ***************/
  18. var deleteFromMenuHelper = function (target) {
  19. /**
  20. if (target.data('new') == 1) {
  21. // if it's not yet saved in the database, just remove it from DOM
  22. target.fadeOut(function () {
  23. target.remove();
  24. updateOutput($('.dd.nestable').data('output', $('#json-output')));
  25. });
  26. } else {
  27. // otherwise hide and mark it for deletion
  28. target.appendTo(nestableList); // if children, move to the top level
  29. target.data('deleted', '1');
  30. target.fadeOut();
  31. }
  32. **/
  33. target.remove();
  34. updateOutput($('.dd.nestable').data('output', $('#json-output')));
  35. };
  36. var deleteFromMenu = function () {
  37. var targetId = $(this).data('owner-id');
  38. var target = $('[data-id="' + targetId + '"]');
  39. var result = confirm("Delete " + target.data('name') + " and all its subitems ?");
  40. if (!result) {
  41. return;
  42. }
  43. // Remove children (if any)
  44. target.find("li").each(function () {
  45. deleteFromMenuHelper($(this));
  46. });
  47. // Remove parent
  48. deleteFromMenuHelper(target);
  49. // update JSON
  50. updateOutput($('.dd.nestable').data('output', $('#json-output')));
  51. };
  52. /***************************************/
  53. /*************** Edit ***************/
  54. var menuAdd = $("#menu-add");
  55. var menuEditor = $("#menu-editor");
  56. var editButton = $("#editButton");
  57. var editInputName = $("#editInputName");
  58. var editInputSlug = $("#editInputSlug");
  59. var editInputTarget = $("#editInputTarget");
  60. var editInputClass = $("#editInputClass");
  61. var currentEditName = $("#currentEditName");
  62. // Prepares and shows the Edit Form
  63. var prepareEdit = function () {
  64. var targetId = $(this).data('owner-id');
  65. var target = $('[data-id="' + targetId + '"]');
  66. editInputName.val(target.data("name"));
  67. editInputSlug.val(target.data("slug"));
  68. editInputTarget.val(target.data("target"));
  69. editInputClass.val(target.data("class"));
  70. currentEditName.html(target.data("name"));
  71. editButton.data("owner-id", target.data("id"));
  72. console.log("[INFO] Editing Menu Item " + editButton.data("owner-id"));
  73. menuEditor.fadeIn('fast');
  74. menuAdd.fadeOut('fast');
  75. };
  76. // Edits the Menu item and hides the Edit Form
  77. var editMenuItem = function () {
  78. var targetId = $(this).data('owner-id');
  79. var target = $('[data-id="' + targetId + '"]');
  80. var newName = editInputName.val();
  81. var newSlug = editInputSlug.val();
  82. var newTarget = editInputTarget.val();
  83. var newClass = editInputClass.val();
  84. target.data("name", newName);
  85. target.data("slug", newSlug);
  86. target.data("target", newTarget);
  87. target.data("class", newClass);
  88. target.find("> .dd-handle").html(newName);
  89. menuEditor.fadeOut('fast');
  90. menuAdd.fadeIn('fast');
  91. // update JSON
  92. updateOutput($('.dd.nestable').data('output', $('#json-output')));
  93. };
  94. /***************************************/
  95. /*************** Add ***************/
  96. var newIdCount = new Date().getTime();
  97. var addToMenu = function () {
  98. var newName = $("#addInputName").val();
  99. var newSlug = $("#addInputSlug").val();
  100. var newTarget = $("#addInputTarget").val();
  101. var newClass = $("#addInputClass").val();
  102. var newId = newIdCount;
  103. nestableList.append(
  104. '<li class="dd-item" ' +
  105. 'data-class="' + newClass + '" ' +
  106. 'data-id="' + newId + '" ' +
  107. 'data-name="' + newName + '" ' +
  108. 'data-target="' + newTarget + '" ' +
  109. 'data-slug="' + newSlug + '">' +
  110. '<div class="dd-handle">' + newName + '</div> ' +
  111. '<span class="button-delete button-delete-' + newId + ' btn btn-danger btn-xs" ' +
  112. 'data-owner-id="' + newId + '"> ' +
  113. 'Delete' +
  114. '</span>' +
  115. '<span class="button-edit button-edit-' + newId + ' btn btn-primary btn-xs" ' +
  116. 'data-owner-id="' + newId + '">' +
  117. 'Edit' +
  118. '</span>' +
  119. '</li>'
  120. );
  121. newIdCount++;
  122. // update JSON
  123. updateOutput($('.dd.nestable').data('output', $('#json-output')));
  124. // set events
  125. $(".dd.nestable .button-delete-"+newId).on("click", deleteFromMenu);
  126. $(".dd.nestable .button-edit-"+newId).on("click", prepareEdit);
  127. // clear input
  128. $("#addInputName").val('');
  129. $("#addInputSlug").val('');
  130. $("#addInputTarget").val('');
  131. $("#addInputClass").val('');
  132. };
  133. /***************************************/
  134. $(function () {
  135. // output initial serialised data
  136. updateOutput($('.dd.nestable').data('output', $('#json-output')));
  137. // set onclick events
  138. editButton.on("click", editMenuItem);
  139. $(".dd.nestable .button-delete").on("click", deleteFromMenu);
  140. $(".dd.nestable .button-edit").on("click", prepareEdit);
  141. $("#menu-editor").submit(function (e) {
  142. e.preventDefault();
  143. });
  144. $("#menu-add").submit(function (e) {
  145. e.preventDefault();
  146. addToMenu();
  147. });
  148. });