説明なし

menu.js 6.4KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241
  1. ;
  2. spa_define(function() {
  3. return $.use(["util", "form", "dict", "spa", "code", "form"], function(util, form, dict, spa, code, form) {
  4. var ahref = { an: "href", av: "javascript:;" };
  5. return {
  6. modal: function(data) {
  7. var root = spa.findInModal(".sys_user_menu"),
  8. g_max_menu_code = 1;
  9. root.find(".modal-ctrl .icon-times").on("click", function() {
  10. spa.closeModal();
  11. });
  12. var treeCnt = root.find(".main .nav"),
  13. menuData = data.children,
  14. reses = data.reses;
  15. hand = code.parseCode(root.find(".info")),
  16. editForm = {};
  17. var findByCode = function(c, items) {
  18. var ret;
  19. for(var i = 0; i < items.length; ++i) {
  20. var item = items[i];
  21. if(item.code === c) return item;
  22. if(item.children && item.children.length) {
  23. ret = findByCode(c, item.children);
  24. if(ret) return ret;
  25. }
  26. }
  27. };
  28. var paint = function(ul, items, pc) {
  29. items.forEach(function(item) {
  30. if(item.code > g_max_menu_code) {
  31. g_max_menu_code = item.code;
  32. }
  33. var li = { tn: "li" },
  34. attrs = li.attrs = [{ an: "class", av: "leaf-item" }];
  35. chs = li.chs = [];
  36. ul.chs.push(li);
  37. attrs.push({ an: "code", av: item.code });
  38. attrs.push({ an: "pcode", av: pc || "" });
  39. var icon = {
  40. tn: "i",
  41. attrs: [{ an: "class", av: "icon icon-" + item.icon }]
  42. };
  43. chs.push(icon);
  44. chs.push({ tn: "a", attrs: [ahref], chs: [item.caption] });
  45. if(item.children && item.children.length) {
  46. li.attrs[0].av = "branch-item";
  47. var cul = { tn: "ul", chs: [] };
  48. chs.push(cul);
  49. paint(cul, item.children, item.code);
  50. }
  51. });
  52. };
  53. var refreshTree = function() {
  54. var ul = { tn: "ul", chs: [] };
  55. paint(ul, menuData);
  56. treeCnt.empty();
  57. util.appendChild(treeCnt[0], ul);
  58. hand.empty();
  59. editForm.oc = null;
  60. editForm.pc = null;
  61. editForm.form = null;
  62. };
  63. var findParentArray = function(pc) {
  64. if(pc) {
  65. var items = findByCode(pc, menuData);
  66. return items ? (items.children ? items.children : null) : null;
  67. }
  68. return menuData;
  69. };
  70. var movePrev = function() {
  71. if(editForm.oc) {
  72. var items = findParentArray(editForm.pc);
  73. if(items) {
  74. var i = 0;
  75. for(; i < items.length; ++i) {
  76. if(items[i].code === editForm.oc) {
  77. break;
  78. }
  79. }
  80. if(i > 0 && i < items.length) {
  81. var item1 = items[i],
  82. item0 = items[i - 1];
  83. items.splice(i - 1, 2, item1, item0);
  84. refreshTree();
  85. }
  86. }
  87. }
  88. };
  89. var moveNext = function() {
  90. if(editForm.oc) {
  91. var items = findParentArray(editForm.pc);
  92. if(items) {
  93. var i = 0;
  94. for(; i < items.length; ++i) {
  95. if(items[i].code === editForm.oc) {
  96. break;
  97. }
  98. }
  99. if(i < (items.length - 1)) {
  100. var item1 = items[i],
  101. item0 = items[i + 1];
  102. items.splice(i, 2, item0, item1);
  103. refreshTree();
  104. }
  105. }
  106. }
  107. };
  108. var deleteItem = function(pc, oc) {
  109. if(editForm.oc) {
  110. var items = findParentArray(editForm.pc);
  111. if(items) {
  112. var i = 0;
  113. for(; i < items.length; ++i) {
  114. if(items[i].code === editForm.oc) {
  115. break;
  116. }
  117. }
  118. if(i < items.length) {
  119. items.splice(i, 1);
  120. refreshTree();
  121. }
  122. }
  123. }
  124. };
  125. var fillEdit = function(pc, di) {
  126. if(pc && typeof pc === "string") {
  127. pc = parseInt(pc);
  128. }
  129. hand.val();
  130. editForm.form = form.build(root.find(".info"), { res: { ready: true, items: reses } });
  131. editForm.pc = pc;
  132. editForm.oc = di.code;
  133. editForm.form.val(di);
  134. };
  135. root.on("click", ".nav li", function(evt) {
  136. var $this = $(this);
  137. if($this.hasClass("branch-item")) {
  138. $this.toggleClass("open");
  139. }
  140. var di = findByCode(parseInt($this.attr("code")), menuData);
  141. if(di) {
  142. fillEdit($this.attr("pcode"), di);
  143. }
  144. evt.stopPropagation();
  145. });
  146. root.on("click", ".opt-newroot", function() {
  147. fillEdit("", {});
  148. });
  149. root.on("click", ".opt-new", function() {
  150. fillEdit(editForm.oc, {});
  151. });
  152. root.on("click", ".opt-prev", function() {
  153. movePrev();
  154. });
  155. root.on("click", ".opt-next", function() {
  156. moveNext();
  157. });
  158. root.on("click", ".opt-del", function() {
  159. deleteItem();
  160. });
  161. root.on("click", ".opt-ok", function() {
  162. if(editForm.form.validate()) {
  163. var item = editForm.form.val();
  164. if(editForm.oc) {
  165. di = findByCode(editForm.oc, menuData);
  166. if(di) {
  167. di.caption = item.caption;
  168. di.modal = false;
  169. if(item.res) {
  170. di.res = item.res;
  171. di.icon = item.icon || "book";
  172. } else {
  173. di.res = null;
  174. di.icon = item.icon || "branch";
  175. }
  176. refreshTree();
  177. }
  178. } else {
  179. var items = menuData;
  180. if(editForm.pc) {
  181. items = findByCode(editForm.pc, menuData);
  182. if(items) {
  183. if(items.children) {
  184. items = items.children;
  185. } else {
  186. items = items.children = [];
  187. }
  188. } else {
  189. items = menuData;
  190. }
  191. }
  192. ++g_max_menu_code;
  193. var di = { code: g_max_menu_code, caption: item.caption, modal: false };
  194. if(item.res) {
  195. di.res = item.res;
  196. di.icon = item.icon || "book";
  197. } else {
  198. di.res = null;
  199. di.icon = item.icon || "branch";
  200. }
  201. items.push(di);
  202. refreshTree();
  203. }
  204. }
  205. });
  206. var cloneMenu = function(src, dest) {
  207. src.forEach(function(item) {
  208. var di = {};
  209. di.icon = item.icon;
  210. if(item.res) {
  211. di.res = item.res;
  212. }
  213. di.modal = false;
  214. di.caption = item.caption;
  215. dest.push(di);
  216. if(item.children && item.children.length) {
  217. var chs = di.children = [];
  218. cloneMenu(item.children, chs);
  219. }
  220. });
  221. }
  222. root.find(".opt-save").on("click", function() {
  223. var pd = [];
  224. cloneMenu(menuData,pd);
  225. util.put("../ajax/user/config/menu", pd, function() {
  226. spa.closeModal();
  227. if(data.hand) {
  228. data.hand();
  229. }
  230. }, {});
  231. });
  232. refreshTree();
  233. }
  234. };
  235. });
  236. });