Navigation.js 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323
  1. Ext.define('saas.view.main.Navigation', {
  2. extend: 'Ext.panel.Panel',
  3. xtype: 'main-navigation',
  4. ui: 'nav',
  5. reference: 'navigationTreeList',
  6. navCollapsed: false,
  7. cls: 'x-navpanel',
  8. initComponent: function() {
  9. var me = this;
  10. var view = new Ext.DataView({
  11. store : Ext.create('Ext.data.Store', {
  12. fields: ['text', 'iconCls'],
  13. data: [{
  14. text: '采购',
  15. iconCls: 'x-fa fa-shopping-basket',
  16. items: [{
  17. text: '制单',
  18. items: [{
  19. id: 'purchase',
  20. text: '采购单',
  21. addType:'purchase-purchase-formpanel',
  22. viewType: 'purchase-purchase-querypanel'
  23. }, {
  24. id: 'purchaseIn',
  25. text: '采购验收单',
  26. addType:'purchase-purchaseIn-formpanel',
  27. viewType: 'purchase-purchaseIn-querypanel'
  28. },{
  29. id: 'purchaseOut',
  30. text: '采购验退单',
  31. addType:'purchase-purchaseOut-formpanel',
  32. viewType: 'purchase-purchaseOut-querypanel'
  33. },{
  34. id: 'form1',
  35. text: '测试-采购单明细界面',
  36. addType: 'test-order-formpanel'
  37. }, {
  38. id: 'myform',
  39. text: '测试-明细界面',
  40. addType: 'test-myform-formpanel'
  41. }, {
  42. id: 'myquerytest',
  43. text: '测试-采购单查询界面',
  44. viewType: 'test-query-querypanel',
  45. }]
  46. }, {
  47. text: '报表',
  48. items: [{
  49. text: '采购明细表'
  50. }, {
  51. text: '采购付款一览表'
  52. }]
  53. }]
  54. },{
  55. text: '资料',
  56. iconCls: 'x-fa fa-book',
  57. items: [
  58. {
  59. text: '基础资料',
  60. items: [
  61. {
  62. text: '客户资料',
  63. viewType: 'mainlist',
  64. leaf: true
  65. },
  66. {
  67. text: '供应商管理',
  68. viewType: 'mainlist',
  69. leaf: true
  70. },
  71. {
  72. text: '商品管理',
  73. viewType: 'mainlist',
  74. leaf: true
  75. },
  76. {
  77. text: '仓库管理',
  78. viewType: 'mainlist',
  79. leaf: true
  80. },
  81. {
  82. text: '职员管理',
  83. viewType: 'mainlist',
  84. leaf: true
  85. },
  86. {
  87. text: '账户管理',
  88. viewType: 'mainlist',
  89. leaf: true
  90. },
  91. {
  92. text: '发货地址管理',
  93. viewType: 'mainlist',
  94. leaf: true
  95. },
  96. {
  97. text: '新手导航',
  98. viewType: 'mainlist',
  99. leaf: true
  100. }
  101. ]
  102. },
  103. {
  104. text: '辅助资料',
  105. items: [
  106. {
  107. text: '客户类别',
  108. viewType: 'document-kind',
  109. leaf: true
  110. },
  111. {
  112. text: '供应商类别',
  113. viewType: 'document-kind',
  114. leaf: true
  115. },
  116. {
  117. text: '商品类别',
  118. viewType: 'document-kind',
  119. leaf: true
  120. },
  121. {
  122. text: '支出类别',
  123. viewType: 'document-kind',
  124. leaf: true
  125. },
  126. {
  127. text: '收入类别',
  128. viewType: 'document-kind',
  129. leaf: true
  130. },
  131. {
  132. text: '计量单位',
  133. viewType: 'mainlist',
  134. leaf: true
  135. },
  136. {
  137. text: '结算方式',
  138. viewType: 'mainlist',
  139. leaf: true
  140. },
  141. {
  142. text: '辅助属性',
  143. viewType: 'mainlist',
  144. leaf: true
  145. },
  146. {
  147. text: '客户物料编码',
  148. viewType: 'mainlist',
  149. leaf: true
  150. },
  151. {
  152. text: '单据编码规则',
  153. viewType: 'mainlist',
  154. leaf: true
  155. }
  156. ]
  157. }
  158. ]
  159. }]
  160. }),
  161. tpl : new Ext.XTemplate('<ul class="x-navlist">',
  162. '<tpl for=".">',
  163. '<li class="x-navitem">',
  164. '<div class="x-navitem-body">',
  165. '<div class="nav-inner-wrap" style="margin-left: 0px;">',
  166. '<div class="nav-inner-icon {iconCls}"></div>',
  167. '<div class="nav-inner-text">{text}</div>',
  168. '</div>',
  169. '</li>',
  170. '</tpl>',
  171. '</ul>'),
  172. trackOver: true,
  173. overItemCls : 'x-navitem-over',
  174. selectedClass : 'x-navitem-selected',
  175. singleSelect : true,
  176. itemSelector : '.x-navitem',
  177. listeners: {
  178. itemmouseenter: me.showNavMenu,
  179. itemmouseleave: me.hideNavMenu,
  180. itemClick: me.clickNavMenu,
  181. scope: me
  182. }
  183. });
  184. Ext.apply(me, {
  185. items: [view]
  186. });
  187. me.view = view;
  188. me.callParent();
  189. },
  190. clickNavMenu: function(view, record, item, index, e, eOpts) {
  191. var me = this;
  192. this.showNavMenu(view, record, item, index, e, eOpts);
  193. },
  194. showNavMenu: function(view, record, item, index, e, eOpts) {
  195. var recData = record.data,
  196. menuItems = recData.items || [],
  197. itemBox = item.getBoundingClientRect(),
  198. pos = [itemBox.left + itemBox.width, itemBox.top],
  199. id = recData.id,
  200. menuId = 'navMenu-' + id,
  201. menu = Ext.getCmp(menuId);
  202. if(!menu) {
  203. var view = new Ext.DataView({
  204. store : Ext.create('Ext.data.Store', {
  205. fields: ['id', 'text', 'addType', 'viewType'],
  206. data: menuItems
  207. }),
  208. tpl: new Ext.XTemplate('<div class="x-navitem-menu">',
  209. '<div class="nav-menu-body">',
  210. '<tpl for=".">',
  211. '<div class="menu">',
  212. '<h3 class="menu-title">{text}</h3>',
  213. '<div class="menu-content">',
  214. '<tpl for="items">',
  215. '<div class="menuitem">',
  216. '<div class="item-text" title="{text}" data-id="{id}" data-text="{text}" data-type="query" data-viewType="{viewType}">',
  217. '{text}',
  218. '</div>',
  219. '<tpl if="{addType}">',
  220. '<div class="item-icon" data-id="{id}" data-text="{text}" data-type="form" data-viewType="{addType}">新增</div>',
  221. '</tpl>',
  222. '</div>',
  223. '</tpl>',
  224. '</div>',
  225. '</div>',
  226. '</tpl>',
  227. '</div>',
  228. '</div>'),
  229. trackOver: true,
  230. overItemCls : 'menuitem-over',
  231. selectedClass : 'menuitem-selected',
  232. singleSelect : true,
  233. itemSelector : 'menu',
  234. listeners: {
  235. boxready: function(view, width, height, eOpts) {
  236. var menu = view.up('menu'),
  237. menuView = view.el.dom.getElementsByClassName('x-navitem-menu')[0],
  238. menuBox = menuView.getBoundingClientRect(),
  239. menuViewWidth = menuBox.width,
  240. menuViewHeight = menuBox.height,
  241. menuItem = menuView.getElementsByClassName('menuitem');
  242. menu.setWidth(menuViewWidth);
  243. menu.setHeight(menuViewHeight);
  244. menu.updateLayout();
  245. view.el.dom.addEventListener('mouseleave', function(e) {
  246. var ex = e.clientX,
  247. ey = e.clientY,
  248. box = menuView.getBoundingClientRect();
  249. if(ey <= box.top || ex >= (box.left + box.width) || ey >= (box.top + box.height) || (ex <= box.left && ey >= (box.top + 64))) {
  250. menu.hide();
  251. }
  252. });
  253. Ext.Array.each(menuItem, function(mi) {
  254. var menuItemText = mi.getElementsByClassName('item-text');
  255. var menuItemIcon = mi.getElementsByClassName('item-icon');
  256. Ext.Array.each(menuItemText, function(item) {
  257. item.addEventListener('click', function(e) {
  258. var target = e.target,
  259. dataset = target.dataset;
  260. mainView = Ext.getCmp('mainView'),
  261. controller = mainView.getController();
  262. controller.setActiveTab(dataset);
  263. menu.hide();
  264. });
  265. });
  266. Ext.Array.each(menuItemIcon, function(item) {
  267. item.addEventListener('click', function(e) {
  268. var target = e.target,
  269. dataset = target.dataset;
  270. mainView = Ext.getCmp('mainView'),
  271. controller = mainView.getController();
  272. controller.setActiveTab(dataset);
  273. menu.hide();
  274. });
  275. });
  276. });
  277. },
  278. }
  279. });
  280. var menu = Ext.create('Ext.menu.Menu', {
  281. id: menuId,
  282. width: window.innerWidth,
  283. style: {
  284. borderTopRightRadius: '4px',
  285. borderBottomRightRadius: '4px'
  286. },
  287. items: [view]
  288. });
  289. }
  290. menu.showAt(pos);
  291. },
  292. hideNavMenu: function(view, record, item, index, e, eOpts) {
  293. var recData = record.data,
  294. cx = e.browserEvent.clientX,
  295. cy = e.browserEvent.clientY,
  296. itemBox = item.getBoundingClientRect(),
  297. id = recData.id,
  298. menuId = 'navMenu-' + id,
  299. menu = Ext.getCmp(menuId);
  300. if(cx <= itemBox.left || cy <= itemBox.top || cy >= (itemBox.top + itemBox.height)) {
  301. if(menu) {
  302. menu.hide();
  303. }
  304. }
  305. }
  306. });