Ext.define('saas.view.main.Navigation', { extend: 'Ext.panel.Panel', xtype: 'main-navigation', ui: 'nav', reference: 'navigationTreeList', width: 180, navCollapsed: false, cls: 'x-navpanel', menuPadding: 0, initComponent: function () { var me = this; var view = new Ext.DataView({ store: Ext.create('Ext.data.Store', { autoLoad: true, fields: ['text', 'iconCls'], proxy: { type: 'ajax', url: 'resources/json/navigation.json', reader: { type: 'json' } } }), tpl: new Ext.XTemplate(''), trackOver: true, overItemCls: 'x-navitem-over', selectedItemCls: 'x-navitem-selected', singleSelect: true, itemSelector: '.x-navitem', listeners: { itemmouseenter: me.showNavMenu, itemmouseleave: me.hideNavMenu, itemClick: me.clickNavMenu, scope: me } }); Ext.apply(me, { items: [view] }); me.view = view; me.callParent(); }, clickNavMenu: function (view, record, item, index, e, eOpts) { var me = this; this.showNavMenu(view, record, item, index, e, eOpts); }, showNavMenu: function (navView, record, navItem, index, e, eOpts) { var me = this, recData = record.data, menuItems = recData.items || [], itemBox = navItem.getBoundingClientRect(), pos = [itemBox.left + itemBox.width, itemBox.top], id = recData.id, menuId = 'navMenu-' + id, menu = Ext.getCmp(menuId); if (!menu) { var view = new Ext.DataView({ store: Ext.create('Ext.data.Store', { fields: ['id', 'text', 'addType', 'viewType', 'ctype'], data: menuItems }), tpl: new Ext.XTemplate('
', '', '
'), trackOver: true, overItemCls: 'menuitem-over', selectedItemCls: 'menuitem-selected', singleSelect: true, itemSelector: 'menu', listeners: { boxready: function (view, width, height, eOpts) { var menu = view.up('menu'), menuView = view.el.dom.getElementsByClassName('x-navitem-menu')[0], menuBox = menuView.getBoundingClientRect(), menuViewWidth = menuBox.width + me.menuPadding * 2, menuViewHeight = menuBox.height + me.menuPadding * 2, menuItem = menuView.getElementsByClassName('menuitem'); menu.setWidth(menuViewWidth); menu.setHeight(menuViewHeight); menu.updateLayout(); view.el.dom.addEventListener('mouseenter', function (e) { menu.show(); menu.navItem.classList.add(menu.navView.overItemCls); }); view.el.dom.addEventListener('mouseleave', function (e) { menu.navItem.classList.remove(menu.navView.overItemCls); menu.hide(); // var ex = e.clientX, // ey = e.clientY, // box = menuView.getBoundingClientRect(), // navItem = menu.navItem, // navBox = navItem.getBoundingClientRect(); // if ((ex <= box.left && (ey <= (navBox.top - 5) || ey >= (navBox.top + navBox.height))) || ey <= (box.top - 5) || ex >= (box.left + box.width + 5) || ey >= (box.top + box.height + 5)) { // menu.navItem.classList.remove(menu.navView.overItemCls); // menu.hide(); // } }); Ext.Array.each(menuItem, function (mi) { var menuItemText = mi.getElementsByClassName('item-text'); var menuItemIcon = mi.getElementsByClassName('item-icon'); Ext.Array.each(menuItemText, function (item) { item.addEventListener('click', function (e) { var target = e.target, dataset = target.dataset, viewType = dataset.viewtype, type = dataset.type, text = dataset.text, config = dataset.config, id = dataset.id, componentType = dataset.ctype || 'Tab'; var tabTitle = text, tabId = 'maintab-' + type + '-' + id; menu.navItem.classList.remove(menu.navView.overItemCls); // saas.util.BaseUtil.openTab(viewType, tabTitle, tabId,config); saas.util.BaseUtil['open' + componentType](viewType, tabTitle, tabId,config); menu.hide(); }); }); Ext.Array.each(menuItemIcon, function (item) { item.addEventListener('click', function (e) { var target = e.target, dataset = target.dataset, viewType = dataset.viewtype, type = dataset.type, text = dataset.text, id = dataset.id, componentType = dataset.ctype || 'Tab'; var tabTitle ='新增' + text, tabId = viewType + '-add'; menu.navItem.classList.remove(menu.navView.overItemCls); // saas.util.BaseUtil.openTab(viewType, tabTitle, tabId); saas.util.BaseUtil['open' + componentType](viewType, tabTitle, tabId); menu.hide(); }); }); }); }, } }); var menu = Ext.create('Ext.menu.Menu', { navView: navView, navItem: navItem, id: menuId, width: window.innerWidth, cls: 'x-nav-menu', layout: 'fit', shadow: 'drop', bodyPadding: me.menuPadding, items: [view] }); } menu.showAt(pos); }, hideNavMenu: function (view, record, item, index, e, eOpts) { var recData = record.data, cx = e.browserEvent.clientX, cy = e.browserEvent.clientY, itemBox = item.getBoundingClientRect(), id = recData.id, menuId = 'navMenu-' + id, menu = Ext.getCmp(menuId); if (cx <= itemBox.left || cy <= itemBox.top || (cy >= (itemBox.top + itemBox.height) && cx <= (itemBox.left + itemBox.width - 10))) { if (menu) { menu.hide(); } } } });