Ext.define('school.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({ bind: { store: '{store_navigationMenu}' }, 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: '.menuitem', listeners: { boxready: function(view, width, height, eOpts) { me.menuBoxReady(view, width, height, eOpts); }, itemclick: me.menuItemClick } }); var menu = Ext.create('Ext.menu.Menu', { navView: navView, navItem: navItem, id: menuId, width: 200, 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(); } } }, menuBoxReady: function (view, width, height, eOpts) { var me = this; 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(); }); }, menuItemClick: function(view, record, item, index, e, eOpts) { var viewType = record.get('view'); var tabTitle = record.get('text'); var tabId = record.get('id'); var config = record.get('config') || []; var menu = view.up('menu'); var op = record.get('op') || 'tab'; if(op == 'tab') { school.util.BaseUtil.openTab(viewType, tabTitle, tabId, config); }else if(op == 'blank') { window.open('http://localhost:8080'); } menu.hide(); } });