Navigation.js 19 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432
  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. formType:'purchase-purchase-formpanel',
  22. queryType: 'purchase-purchase-querypanel'
  23. }, {
  24. id: 'purchaseIn',
  25. text: '采购验收单',
  26. formType:'purchase-purchaseIn-formpanel',
  27. queryType: 'purchase-purchaseIn-querypanel'
  28. },{
  29. id: 'purchaseOut',
  30. text: '采购验退单',
  31. formType:'purchase-purchaseOut-formpanel',
  32. queryType: 'purchase-purchaseOut-querypanel'
  33. },{
  34. id: 'inquiry',
  35. text: '采购询价单',
  36. formType:'purchase-inquiry-formpanel',
  37. queryType: 'purchase-inquiry-querypanel'
  38. }
  39. // ,{
  40. // id: 'form1',
  41. // text: '测试-采购单明细界面',
  42. // formType: 'test-order-formpanel'
  43. // }, {
  44. // id: 'myform',
  45. // text: '测试-明细界面',
  46. // formType: 'test-myform-formpanel'
  47. // }, {
  48. // id: 'myquerytest',
  49. // text: '测试-采购单查询界面',
  50. // queryType: 'test-query-querypanel',
  51. // }
  52. ]
  53. }, {
  54. text: '报表',
  55. items: [{
  56. text: '采购明细表'
  57. }, {
  58. text: '采购付款一览表'
  59. }]
  60. }]
  61. }, {
  62. text: '销售',
  63. iconCls: 'x-fa fa-shopping-cart',
  64. items: [{
  65. text: '制单',
  66. items: [{
  67. id: 'sale',
  68. text: '销售订单',
  69. formType:'sale-sale-formpanel',
  70. queryType: 'sale-sale-querypanel'
  71. },{
  72. id: 'saleOut',
  73. text: '销售出货单',
  74. formType:'sale-saleOut-formpanel',
  75. queryType: 'sale-saleOut-querypanel'
  76. },{
  77. id: 'saleIn',
  78. text: '销售退货单',
  79. formType:'sale-saleIn-formpanel',
  80. queryType: 'sale-saleIn-querypanel'
  81. },{
  82. id: 'saleToPur',
  83. text: '以销定购',
  84. formType:'sale-saleToPur-formpanel',
  85. queryType: 'sale-saleToPur-querypanel'
  86. }]
  87. }, {
  88. text: '报表',
  89. items: [{
  90. text: '销售明细表'
  91. },{
  92. text: '销售收款一览表'
  93. },{
  94. text: '销售利润表'
  95. }]
  96. }]
  97. }, {
  98. text: '库存',
  99. iconCls: 'x-fa fa-shopping-cart',
  100. items: [{
  101. text: '制单',
  102. items: [{
  103. id: 'appropriationInOut',
  104. text: '调拨单',
  105. formType:'stock-appropriationInOut-formpanel',
  106. queryType: 'stock-appropriationInOut-querypanel'
  107. },{
  108. id: 'make',
  109. text: '制造单',
  110. formType:'stock-make-formpanel',
  111. queryType: 'stock-make-querypanel'
  112. },{
  113. id: 'otherIn',
  114. text: '其它入库单',
  115. formType:'stock-otherIn-formpanel',
  116. queryType: 'stock-otherIn-querypanel'
  117. },{
  118. id: 'otherOut',
  119. text: '其它出库单',
  120. formType:'stock-otherOut-formpanel',
  121. queryType: 'stock-otherOut-querypanel'
  122. },{
  123. id: 'inventory',
  124. text: '盘点单',
  125. formType:'stock-inventory-formpanel',
  126. queryType: 'stock-inventory-querypanel'
  127. }]
  128. }, {
  129. text: '报表',
  130. items: [{
  131. text: '物料出入库明细表'
  132. },{
  133. text: '物料收发汇总表'
  134. },{
  135. text: '物料库存数量金额表'
  136. }]
  137. }]
  138. }, {
  139. text: '资金',
  140. iconCls: 'x-fa fa-shopping-cart',
  141. items: [{
  142. text: '制单',
  143. items: [{
  144. id: 'payBalance',
  145. text: '付款单',
  146. formType:'money-payBalance-formpanel',
  147. queryType: 'money-payBalance-querypanel'
  148. },{
  149. id: 'recBbalance',
  150. text: '收款单',
  151. formType:'money-recBbalance-formpanel',
  152. queryType: 'money-recBbalance-querypanel'
  153. },{
  154. id: 'verification',
  155. text: '核销单',
  156. formType:'money-verification-formpanel',
  157. queryType: 'money-verification-querypanel'
  158. },{
  159. id: 'othReceipts',
  160. text: '其它收支单',
  161. formType:'money-othReceipts-formpanel',
  162. queryType: 'money-othReceipts-querypanel'
  163. },{
  164. id: 'fundTransfer',
  165. text: '资金转存',
  166. formType:'money-fundTransfer-formpanel',
  167. queryType: 'money-fundTransfer-querypanel'
  168. }]
  169. }, {
  170. text: '报表',
  171. items: [{
  172. text: '供应商对账单'
  173. },{
  174. text: '应付账款明细表'
  175. },{
  176. text: '客户对账单'
  177. },{
  178. text: '应收款明细表'
  179. },{
  180. text: '资金账户余额表'
  181. }]
  182. }]
  183. }, {
  184. text: '资料',
  185. iconCls: 'x-fa fa-shopping-cart',
  186. items: [{
  187. text: '基础资料',
  188. items: [{
  189. id: 'vendor',
  190. text: '供应商资料',
  191. formType:'document-vendor-formpanel',
  192. queryType: 'document-vendor-querypanel'
  193. },{
  194. id: 'customer',
  195. text: '客户资料',
  196. formType:'document-customer-formpanel',
  197. queryType: 'document-customer-querypanel'
  198. },{
  199. id: 'product',
  200. text: '物料资料',
  201. formType:'document-product-formpanel',
  202. queryType: 'document-product-querypanel'
  203. },{
  204. id: 'warehouse',
  205. text: '仓库资料',
  206. formType:'document-warehouse-formpanel',
  207. queryType: 'document-warehouse-querypanel'
  208. },{
  209. id: 'bom',
  210. text: 'BOM资料',
  211. formType:'document-bom-formpanel',
  212. queryType: 'document-bom-querypanel'
  213. },{
  214. id: 'moneyAccount',
  215. text: '资金账户',
  216. formType:'document-moneyAccount-formpanel',
  217. queryType: 'document-moneyAccount-querypanel'
  218. },{
  219. id: 'employee',
  220. text: '人员资料',
  221. formType:'document-employee-formpanel',
  222. queryType: 'document-employee-querypanel'
  223. }]
  224. }, {
  225. text: '辅助资料',
  226. items: [{
  227. id: 'vendorType',
  228. text: '供应商类型',
  229. formType:'document-vendorType-formpanel',
  230. queryType: 'document-vendorType-querypanel'
  231. },{
  232. id: 'purcAddress',
  233. text: '采购交货地址',
  234. formType:'document-purcAddress-formpanel',
  235. queryType: 'document-purcAddress-querypanel'
  236. },{
  237. id: 'customerType',
  238. text: '客户类型',
  239. formType:'document-customerType-formpanel',
  240. queryType: 'document-customerType-querypanel'
  241. },{
  242. id: 'unit',
  243. text: '计量单位',
  244. formType:'document-unit-formpanel',
  245. queryType: 'document-unit-querypanel'
  246. },{
  247. id: 'productType',
  248. text: '物料类型',
  249. formType:'document-productType-formpanel',
  250. queryType: 'document-productType-querypanel'
  251. },{
  252. id: 'productBrand',
  253. text: '物料品牌',
  254. formType:'document-productBrand-formpanel',
  255. queryType: 'document-productBrand-querypanel'
  256. },{
  257. id: 'moneyinoutType',
  258. text: '收支类别',
  259. formType:'document-moneyinoutType-formpanel',
  260. queryType: 'document-moneyinoutType-querypanel'
  261. },{
  262. id: 'role',
  263. text: '用户角色',
  264. formType:'document-role-formpanel',
  265. queryType: 'document-role-querypanel'
  266. }]
  267. }]
  268. }],
  269. }),
  270. tpl : new Ext.XTemplate('<ul class="x-navlist">',
  271. '<tpl for=".">',
  272. '<li class="x-navitem">',
  273. '<div class="x-navitem-body">',
  274. '<div class="nav-inner-wrap" style="margin-left: 0px;">',
  275. '<div class="nav-inner-icon {iconCls}"></div>',
  276. '<div class="nav-inner-text">{text}</div>',
  277. '</div>',
  278. '</li>',
  279. '</tpl>',
  280. '</ul>'),
  281. trackOver: true,
  282. overItemCls : 'x-navitem-over',
  283. selectedClass : 'x-navitem-selected',
  284. singleSelect : true,
  285. itemSelector : '.x-navitem',
  286. listeners: {
  287. itemmouseenter: me.showNavMenu,
  288. itemmouseleave: me.hideNavMenu,
  289. itemClick: me.clickNavMenu,
  290. scope: me
  291. }
  292. });
  293. Ext.apply(me, {
  294. items: [view]
  295. });
  296. me.view = view;
  297. me.callParent();
  298. },
  299. clickNavMenu: function(view, record, item, index, e, eOpts) {
  300. var me = this;
  301. this.showNavMenu(view, record, item, index, e, eOpts);
  302. },
  303. showNavMenu: function(view, record, item, index, e, eOpts) {
  304. var recData = record.data,
  305. menuItems = recData.items || [],
  306. itemBox = item.getBoundingClientRect(),
  307. pos = [itemBox.left + itemBox.width, itemBox.top],
  308. id = recData.id,
  309. menuId = 'navMenu-' + id,
  310. menu = Ext.getCmp(menuId);
  311. if(!menu) {
  312. var view = new Ext.DataView({
  313. store : Ext.create('Ext.data.Store', {
  314. fields: ['id', 'text', 'formType', 'queryType'],
  315. data: menuItems
  316. }),
  317. tpl: new Ext.XTemplate('<div class="x-navitem-menu">',
  318. '<div class="nav-menu-body">',
  319. '<tpl for=".">',
  320. '<div class="menu">',
  321. '<h3 class="menu-title">{text}</h3>',
  322. '<div class="menu-content">',
  323. '<tpl for="items">',
  324. '<div class="menuitem">',
  325. '<div class="item-text" title="{text}" data-id="{id}" data-text="{text}" data-type="query" data-queryType="{queryType}">',
  326. '{text}',
  327. '</div>',
  328. '<tpl if="{formType}">',
  329. '<div class="item-icon" data-id="{id}" data-text="{text}" data-type="form" data-formType="{formType}">新增</div>',
  330. '</tpl>',
  331. '</div>',
  332. '</tpl>',
  333. '</div>',
  334. '</div>',
  335. '</tpl>',
  336. '</div>',
  337. '</div>'),
  338. trackOver: true,
  339. overItemCls : 'menuitem-over',
  340. selectedClass : 'menuitem-selected',
  341. singleSelect : true,
  342. itemSelector : 'menu',
  343. listeners: {
  344. boxready: function(view, width, height, eOpts) {
  345. var menu = view.up('menu'),
  346. menuView = view.el.dom.getElementsByClassName('x-navitem-menu')[0],
  347. menuBox = menuView.getBoundingClientRect(),
  348. menuViewWidth = menuBox.width,
  349. menuViewHeight = menuBox.height,
  350. menuItem = menuView.getElementsByClassName('menuitem');
  351. menu.setWidth(menuViewWidth);
  352. menu.setHeight(menuViewHeight);
  353. menu.updateLayout();
  354. view.el.dom.addEventListener('mouseleave', function(e) {
  355. var ex = e.clientX,
  356. ey = e.clientY,
  357. box = menuView.getBoundingClientRect();
  358. if(ey <= box.top || ex >= (box.left + box.width) || ey >= (box.top + box.height) || (ex <= box.left && ey >= (box.top + 64))) {
  359. menu.hide();
  360. }
  361. });
  362. Ext.Array.each(menuItem, function(mi) {
  363. var menuItemText = mi.getElementsByClassName('item-text');
  364. var menuItemIcon = mi.getElementsByClassName('item-icon');
  365. Ext.Array.each(menuItemText, function(item) {
  366. item.addEventListener('click', function(e) {
  367. var target = e.target,
  368. dataset = target.dataset;
  369. mainView = Ext.getCmp('mainView'),
  370. controller = mainView.getController();
  371. controller.setActiveTab(dataset);
  372. menu.hide();
  373. });
  374. });
  375. Ext.Array.each(menuItemIcon, function(item) {
  376. item.addEventListener('click', function(e) {
  377. var target = e.target,
  378. dataset = target.dataset;
  379. mainView = Ext.getCmp('mainView'),
  380. controller = mainView.getController();
  381. controller.setActiveTab(dataset);
  382. menu.hide();
  383. });
  384. });
  385. });
  386. },
  387. }
  388. });
  389. var menu = Ext.create('Ext.menu.Menu', {
  390. id: menuId,
  391. width: window.innerWidth,
  392. style: {
  393. borderTopRightRadius: '4px',
  394. borderBottomRightRadius: '4px'
  395. },
  396. items: [view]
  397. });
  398. }
  399. menu.showAt(pos);
  400. },
  401. hideNavMenu: function(view, record, item, index, e, eOpts) {
  402. var recData = record.data,
  403. cx = e.browserEvent.clientX,
  404. cy = e.browserEvent.clientY,
  405. itemBox = item.getBoundingClientRect(),
  406. id = recData.id,
  407. menuId = 'navMenu-' + id,
  408. menu = Ext.getCmp(menuId);
  409. if(cx <= itemBox.left || cy <= itemBox.top || cy >= (itemBox.top + itemBox.height)) {
  410. if(menu) {
  411. menu.hide();
  412. }
  413. }
  414. }
  415. });