Navigation.js 9.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239
  1. Ext.define('saas.view.main.Navigation', {
  2. extend: 'Ext.view.View',
  3. xtype: 'main-navigation',
  4. reference: 'navigationTreeList',
  5. width: 180,
  6. navCollapsed: false,
  7. cls: 'x-navpanel',
  8. menuPadding: 0,
  9. bind: {
  10. store: '{navMenu}'
  11. },
  12. renderTpl: [
  13. '<div id="{id}-innerCt" data-ref="innerCt" role="presentation">',
  14. '{%this.renderContent(out,values)%}',
  15. '</div>'
  16. ],
  17. tpl: ['<ul class="x-navlist">',
  18. '<tpl for=".">',
  19. '<li class="x-navitem">',
  20. '<div class="x-navitem-body">',
  21. '<div class="nav-inner-wrap" style="margin-left: 0px;">',
  22. '<div class="nav-inner-icon {iconCls}"></div>',
  23. '<div class="nav-inner-text">{text}</div>',
  24. '</div>',
  25. '</div>',
  26. '</li>',
  27. '</tpl>',
  28. '</ul>'
  29. ],
  30. overItemCls: 'x-navitem-over',
  31. selectedItemCls: 'x-navitem-selected',
  32. singleSelect: true,
  33. itemSelector: '.x-navitem',
  34. initComponent: function () {
  35. var me = this;
  36. Ext.apply(me, {
  37. listeners: {
  38. itemmouseenter: function(navView, record, navItem, index, e, eOpts) {
  39. window.clearTimeout(me.Timer);
  40. me.Timer = setTimeout(function() {
  41. me.showNavMenu(navView, record, navItem, index, e, eOpts);
  42. }, 80);
  43. },
  44. itemmouseleave: function(view, record, item, index, e, eOpts) {
  45. window.clearTimeout(me.Timer);
  46. me.hideNavMenu(view, record, item, index, e, eOpts);
  47. },
  48. itemClick: function(navView, record, navItem, index, e, eOpts) {
  49. window.clearTimeout(me.Timer);
  50. me.Timer = setTimeout(function() {
  51. me.showNavMenu(navView, record, navItem, index, e, eOpts);
  52. }, 20);
  53. },
  54. scope: me
  55. }
  56. });
  57. me.callParent(arguments);
  58. },
  59. showNavMenu: function (navView, record, navItem, index, e, eOpts) {
  60. var me = this,
  61. recData = record.data,
  62. d = recData.items || [],
  63. menuItems = JSON.parse(JSON.stringify(d)),
  64. itemBox = navItem.getBoundingClientRect(),
  65. pos = [itemBox.left + itemBox.width, itemBox.top],
  66. menuId = 'navMenu-' + record.get('id'),
  67. menu = Ext.getCmp(menuId);
  68. //获取b2b权限
  69. var enableB2B = me.ownerCt.ownerCt.getViewModel().get('enableB2B');
  70. Ext.each(menuItems,function(item,index){
  71. if(item.items.length>0){
  72. var l = item.items.length;
  73. for(var i = 0;i<l;i++){
  74. if(item.items[i].hasOwnProperty('b2b')){
  75. if(((!enableB2B || enableB2B == '0') && item.items[i].b2b == true) || (!!enableB2B && item.items[i].b2b == false)) {
  76. item.items.splice(i--,1);
  77. l--;
  78. }
  79. }
  80. };
  81. }
  82. })
  83. if (!menu) {
  84. view = new Ext.DataView({
  85. store: Ext.create('Ext.data.Store', {
  86. fields: ['id', 'text', 'addType', 'viewType'],
  87. data: menuItems
  88. }),
  89. tpl: new Ext.XTemplate('<div class="x-navitem-menu">',
  90. '<div class="nav-menu-body">',
  91. '<tpl for=".">',
  92. '<div class="menu">',
  93. '<div class="menu-title">',
  94. '<span class="menu-title-text">{text}</span>',
  95. '</div>',
  96. '<div class="menu-content">',
  97. '<tpl for="items">',
  98. '<div class="menuitem">',
  99. '<div data-boundView="{id}" data-recordId="{id}" class="item-text" data-config="{config}" data-id="{id}" data-text="{text}" data-type="query" data-viewType="{viewType}">',
  100. '{text}',
  101. '</div>',
  102. '<tpl if="this.hasAddType(addType)">',
  103. '<div class="item-icon" data-id="{id}" data-text="{text}" data-type="form" data-viewType="{addType}">新增</div>',
  104. '</tpl>',
  105. '</div>',
  106. '</tpl>',
  107. '</div>',
  108. '</div>',
  109. '</tpl>',
  110. '</div>',
  111. '</div>', {
  112. disableFormats: true,
  113. hasAddType: function(addType) {
  114. return !!addType;
  115. }
  116. }),
  117. trackOver: true,
  118. overItemCls: 'menuitem-over',
  119. selectedItemCls: 'menuitem-selected',
  120. singleSelect: true,
  121. itemSelector: '.menu',
  122. /** override */
  123. updateIndexes: function(startIndex, endIndex) {
  124. var self = this,
  125. menu = self.up('menu'),
  126. nodes = self.all.elements,
  127. records = self.getViewRange(),
  128. selModel = self.getSelectionModel(),
  129. myId = self.id,
  130. i, j;
  131. startIndex = startIndex || 0;
  132. endIndex = endIndex || ((endIndex === 0) ? 0 : (nodes.length - 1));
  133. for (i = startIndex; i <= endIndex; i++) {
  134. let node = nodes[i];
  135. let record = records[i];
  136. let cnodes = node.children[1].children;
  137. for(j = 0; j < cnodes.length; j++) {
  138. let cnode = cnodes[j];
  139. let crecord = record.data.items[j];
  140. !!Ext.get(cnode.children[0]) && Ext.get(cnode.children[0]).on('click', function() {
  141. me.openTab('', crecord);
  142. menu.hide();
  143. });
  144. !!Ext.get(cnode.children[1]) && Ext.get(cnode.children[1]).on('click', function() {
  145. me.openTab('add', crecord);
  146. menu.hide();
  147. });
  148. }
  149. }
  150. },
  151. });
  152. var menu = Ext.create('Ext.menu.Menu', {
  153. navView: navView,
  154. navItem: navItem,
  155. id: menuId,
  156. width: window.innerWidth,
  157. cls: 'x-nav-menu',
  158. layout: 'fit',
  159. shadow: 'drop',
  160. bodyPadding: me.menuPadding,
  161. items: [view]
  162. });
  163. }
  164. menu.items.items[0].store.removeAll();
  165. menu.items.items[0].store.loadData(menuItems);
  166. menu.showAt(pos);
  167. me.refreshMenu(menu.items.items[0], pos)
  168. },
  169. openTab: function(type, data) {
  170. var viewType = data.viewType,
  171. text = data.text,
  172. config = data.config,
  173. id = data.id,
  174. addType = data.addType;
  175. saas.util.BaseUtil.openTab(type == 'add' ? addType : viewType, text, 'maintab-' + type + '-' + id, config);
  176. },
  177. refreshMenu: function (view, pos) {
  178. var me = this;
  179. var menu = view.up('menu'),
  180. menuView = view.el.dom.getElementsByClassName('x-navitem-menu')[0],
  181. menuBox = menuView.getBoundingClientRect(),
  182. menuViewWidth = menuBox.width + me.menuPadding * 2,
  183. menuViewHeight = menuBox.height + me.menuPadding * 2,
  184. menuItem = menuView.getElementsByClassName('menuitem');
  185. menu.setX(pos[0]);
  186. menu.setWidth(menuViewWidth);
  187. menu.setHeight(menuViewHeight);
  188. menu.updateLayout();
  189. view.el.dom.addEventListener('mouseenter', function (e) {
  190. menu.show();
  191. menu.navItem.classList.add(menu.navView.overItemCls);
  192. });
  193. view.el.dom.addEventListener('mouseleave', function (e) {
  194. menu.navItem.classList.remove(menu.navView.overItemCls);
  195. menu.hide();
  196. });
  197. },
  198. hideNavMenu: function (view, record, item, index, e, eOpts) {
  199. var recData = record.data,
  200. id = recData.id,
  201. menuId = 'navMenu-' + id,
  202. menu = Ext.getCmp(menuId),
  203. cx, cy, itemBox;
  204. if (menu) {
  205. cx = e.browserEvent.clientX,
  206. cy = e.browserEvent.clientY,
  207. itemBox = item.getBoundingClientRect();
  208. if (cx <= itemBox.left || cy <= itemBox.top || (cy >= (itemBox.top + itemBox.height) && cx <= (itemBox.left + itemBox.width - 10))) {
  209. menu.hide();
  210. }
  211. }
  212. }
  213. });