ajaxmenu.js 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311
  1. $(function()
  2. {
  3. var currentModule = startMenu['module'],
  4. currentMethod = startMenu['method'],
  5. $navbar = $('#navbar'),
  6. $subNavbar = $('#subNavbar'),
  7. $mainMenu = $('#mainMenu'),
  8. $loadingIcon = $('#loadingIcon'),
  9. $menuEditor = $('#menuEditor'),
  10. menuConfig =
  11. {
  12. 'main': null,
  13. 'module': {},
  14. 'feature': {}
  15. };
  16. var updateConfig = function($menu)
  17. {
  18. var moduleName = $menu.data('module'), methodName = $menu.data('method');
  19. var menu = [];
  20. $menu.children('.nav').children('li:not(.drag-shadow)').each(function()
  21. {
  22. var $e = $(this);
  23. var item = $e.children('a').data('menu');
  24. item.order = $e.attr('data-order');
  25. menu.push(item);
  26. });
  27. if(moduleName === 'main') menuConfig.main = menu;
  28. else if(methodName) menuConfig['feature'][moduleName][methodName] = menu;
  29. else menuConfig['module'][moduleName] = menu;
  30. }
  31. var updateMenu = function(moduleName, methodName, items)
  32. {
  33. var $menu = moduleName === 'main' ? $navbar : (methodName ? $mainMenu : $subNavbar);
  34. var items = items || (moduleName === 'main' ? menuConfig.main : (methodName ? menuConfig['feature'][moduleName][methodName] : menuConfig['module'][moduleName]));
  35. $menu.data({'module': moduleName, 'method': methodName});
  36. if(items)
  37. {
  38. var $nav = $('<ul class="nav nav-default"/>');
  39. $.each(items, function(idx, item)
  40. {
  41. if(!item.text || item.fixed) return;
  42. var $a = $('<a href="#"/>').append(item.text);
  43. $a.data('menu', item).append('<i class="item-hidden-icon icon icon-eye-off"></i>');
  44. var hidden = !!item.hidden;
  45. if(item.subMenu)
  46. {
  47. hidden = true;
  48. $a.addClass('dropdown dropdown-hover').append("<span class='caret'></span><ul class='dropdown-menu'></ul>");
  49. var $dropmenu = $a.find('.dropdown-menu');
  50. $.each(item.subMenu, function(subIdx, subItem)
  51. {
  52. subItem.order = subIdx + 1;
  53. var $subA = $('<a href="#"/>').append(subItem.text);
  54. $subA.data('menu', subItem).append('<i class="item-hidden-icon icon icon-eye-off"></i>');
  55. $('<li/>').attr('data-id', subItem.name).toggleClass('right', subItem.float === 'right').toggleClass('menu-hidden', !!subItem.hidden).append($subA).appendTo($dropmenu);
  56. hidden = subItem.hidden && hidden;
  57. });
  58. var $aInner = $a.children('a');
  59. if ($aInner.length)
  60. {
  61. $aInner.replaceWith($('<span>' + $aInner.text() + ' <span class="caret"></span></span>'));
  62. $a.addClass('dropdown-hover');
  63. }
  64. if(!$dropmenu.children().length)
  65. {
  66. $a.removeClass('dropdown dropdown-hover').find('.caret').remove();
  67. $dropmenu.remove();
  68. }
  69. }
  70. $('<li/>').attr('data-id', item.name).toggleClass('right', item.float === 'right').toggleClass('menu-hidden', hidden).append($a).appendTo($nav);
  71. });
  72. $nav.sortable({finish: function(e)
  73. {
  74. updateConfig(e.element.closest('nav'));
  75. }});
  76. $menu.children('ul').replaceWith($nav);
  77. }
  78. else
  79. {
  80. $menu.children('ul').empty();
  81. }
  82. };
  83. var activeCurrent = function(moduleName, methodName)
  84. {
  85. currentModule = moduleName;
  86. currentMethod = methodName;
  87. $navbar.find('li.active').removeClass('active');
  88. $navbar.find('li[data-id="' + moduleName + '"]:not(.right)').addClass('active');
  89. $subNavbar.find('li.active').removeClass('active');
  90. $subNavbar.find('li[data-id="' + methodName + '"]:not(.right)').addClass('active');
  91. };
  92. var loadData = function(moduleName, methodName, type, callback)
  93. {
  94. type = type || '';
  95. var link = createLink('custom', 'ajaxGetMenu', 'module=' + moduleName + '&method=' + methodName + '&type=' + type, 'json');
  96. $loadingIcon.addClass('active');
  97. $.get(link, function(data)
  98. {
  99. if(data.result === 'success' && data.menu)
  100. {
  101. var menu = data.menu;
  102. if(menu['main'] && !menuConfig['main'])
  103. {
  104. menuConfig['main'] = menu['main'];
  105. }
  106. if(menu['module'] && !menuConfig['module'][moduleName])
  107. {
  108. menuConfig['module'][moduleName] = menu['module'];
  109. }
  110. if(menu['feature'] !== undefined && (!menuConfig['feature'][moduleName] || menuConfig['feature'][moduleName][methodName] === undefined))
  111. {
  112. if(!menuConfig['feature'][moduleName]) menuConfig['feature'][moduleName] = {};
  113. menuConfig['feature'][moduleName][methodName] = menu['feature'];
  114. }
  115. activeCurrent(moduleName, methodName);
  116. callback && callback(true, data);
  117. }
  118. else
  119. {
  120. callback && callback(false, data);
  121. }
  122. $loadingIcon.removeClass('active');
  123. }, 'json');
  124. };
  125. var formatMenuConfig = function(items)
  126. {
  127. var dataList = [];
  128. $.each(items, function(idx, item)
  129. {
  130. var data = {name: item.name, order: parseInt(item.order)};
  131. if(item.hidden) data.hidden = true;
  132. if(item.float) data.float = item.float;
  133. if(item.subMenu)
  134. {
  135. var subMenu = [];
  136. $.each(item.subMenu, function(sIdx, subItem)
  137. {
  138. var subData = {name: subItem.name, order: parseInt(subItem.order)};
  139. if(subItem.hidden) subData.hidden = true;
  140. if(subItem.float) subData.float = subItem.float;
  141. subMenu.push(subData);
  142. });
  143. data.subMenu = subMenu;
  144. }
  145. dataList.push(data);
  146. });
  147. return dataList;
  148. };
  149. $menuEditor.on('mouseenter', '.nav > li:not(.drag-shadow) > a', function()
  150. {
  151. var $a = $(this);
  152. var item = $a.data('menu');
  153. var $menu = $a.closest('nav');
  154. if($menu.is('#navbar'))
  155. {
  156. var moduleName = item.name;
  157. if(moduleName !== currentModule)
  158. {
  159. var methodName = item.link['method'];
  160. if(menuConfig['module'][moduleName])
  161. {
  162. updateMenu(moduleName);
  163. if(menuConfig['feature'][moduleName] && menuConfig['feature'][moduleName][methodName] !== undefined)
  164. {
  165. updateMenu(moduleName, methodName);
  166. activeCurrent(moduleName, methodName);
  167. }
  168. else
  169. {
  170. loadData(moduleName, methodName, 'all', function(result)
  171. {
  172. if(result)
  173. {
  174. updateMenu(moduleName, methodName);
  175. activeCurrent(moduleName, methodName);
  176. }
  177. });
  178. }
  179. }
  180. else
  181. {
  182. loadData(moduleName, methodName, 'all', function(result)
  183. {
  184. if(result)
  185. {
  186. updateMenu(moduleName);
  187. updateMenu(moduleName, methodName);
  188. activeCurrent(moduleName, methodName);
  189. }
  190. });
  191. }
  192. }
  193. }
  194. else if($menu.is('#subNavbar'))
  195. {
  196. var moduleName = item.link ? item.link['module'] : $menu.data('module');
  197. var methodName = item.link ? item.link['method'] : item.name;
  198. if(methodName !== currentMethod)
  199. {
  200. if(menuConfig['feature'][moduleName] && menuConfig['feature'][moduleName][methodName] !== undefined)
  201. {
  202. updateMenu(moduleName, methodName);
  203. activeCurrent($menu.data('module'), item.name);
  204. }
  205. else
  206. {
  207. loadData(moduleName, methodName, 'all', function(result)
  208. {
  209. if(result)
  210. {
  211. updateMenu(moduleName, methodName);
  212. activeCurrent($menu.data('module'), item.name);
  213. }
  214. });
  215. }
  216. }
  217. }
  218. }).on('click', '.nav>li>a,.dropdown-menu>li>a', function(e)
  219. {
  220. var $a = $(this);
  221. var item = $a.data('menu');
  222. if(!item) return;
  223. if($a.find('.dropdown-menu').length) return;
  224. var $menu = $a.closest('nav');
  225. var moduleName = item.link && item.link['module'] ? item.link['module'] : item.name;
  226. var methodName = item.link && item.link['method'] ? item.link['method'] : '';
  227. item.hidden = !item.hidden;
  228. if($menu.is('#subNavbar'))
  229. {
  230. moduleName = currentModule;
  231. methodName = item.name;
  232. }
  233. $a.parent().toggleClass('menu-hidden', item.hidden);
  234. /* Update parent menu by sub menu. */
  235. if($a.parent().parent().hasClass('dropdown-menu'))
  236. {
  237. var hidden = true;
  238. $a.parent().parent().children().each(function()
  239. {
  240. hidden = $(this).hasClass('menu-hidden') && hidden;
  241. });
  242. $a.parent().parent().parent().parent().toggleClass('menu-hidden', hidden);
  243. }
  244. updateConfig($menu);
  245. e.stopPropagation();
  246. });
  247. $('#saveMenuBtn').click(function()
  248. {
  249. var postData = [{'module': 'main', value: formatMenuConfig(menuConfig.main)}];
  250. $.each(menuConfig['module'], function(moduleName, items)
  251. {
  252. postData.push({'module': moduleName, value: formatMenuConfig(items)});
  253. });
  254. $.each(menuConfig['feature'], function(moduleName, feature)
  255. {
  256. if(!feature) return;
  257. $.each(feature, function(methodName, items)
  258. {
  259. if(items) postData.push({'module': moduleName, 'method': methodName, value: formatMenuConfig(items)});
  260. });
  261. });
  262. postData = $.map(postData, JSON.stringify);
  263. setPublic = $('#setPublic1').prop('checked') ? 1 : 0;
  264. $.post(createLink('custom', 'ajaxSetMenu'), {menus: postData, setPublic: setPublic}, function(data)
  265. {
  266. if(data.result === 'success') window.parent.location.reload()
  267. if(data.message) alert(data.message);
  268. }, 'json').error(function(e) {alert(lang.timeout);});
  269. }).on('mouseenter', function() {$menuEditor.addClass('preview')})
  270. .on('mouseout', function() {$menuEditor.removeClass('preview')});
  271. loadData(currentModule, currentMethod, 'all', function(result)
  272. {
  273. if(result)
  274. {
  275. updateMenu('main');
  276. updateMenu(currentModule);
  277. updateMenu(currentModule, currentMethod);
  278. activeCurrent(currentModule, currentMethod);
  279. }
  280. });
  281. $('#closeModalBtn').click(function()
  282. {
  283. window.parent.$.closeModal();
  284. });
  285. $('#resetMenuBtn').click(function()
  286. {
  287. var setPublic = $('#setPublic1').prop('checked') ? 1 : 0;
  288. hiddenwin.location.href = createLink('custom', 'ajaxRestoreMenu', "public=" + setPublic);
  289. });
  290. });