93 lines
		
	
	
		
			2.8 KiB
		
	
	
	
		
			TypeScript
		
	
	
	
	
	
		
		
			
		
	
	
			93 lines
		
	
	
		
			2.8 KiB
		
	
	
	
		
			TypeScript
		
	
	
	
	
	
|  | import { expect, tap } from '@git.zone/tstest/tapbundle'; | ||
|  | import { DeesContextmenu } from '../ts_web/elements/dees-contextmenu.js'; | ||
|  | 
 | ||
|  | tap.test('should close all parent menus when clicking action in nested submenu', async () => { | ||
|  |   let actionCalled = false; | ||
|  |    | ||
|  |   // Create a test element
 | ||
|  |   const testDiv = document.createElement('div'); | ||
|  |   testDiv.style.width = '300px'; | ||
|  |   testDiv.style.height = '300px'; | ||
|  |   testDiv.style.background = '#f0f0f0'; | ||
|  |   testDiv.innerHTML = 'Right-click for nested menu test'; | ||
|  |   document.body.appendChild(testDiv); | ||
|  |    | ||
|  |   // Simulate right-click to open context menu
 | ||
|  |   const contextMenuEvent = new MouseEvent('contextmenu', { | ||
|  |     clientX: 150, | ||
|  |     clientY: 150, | ||
|  |     bubbles: true, | ||
|  |     cancelable: true | ||
|  |   }); | ||
|  |    | ||
|  |   // Open context menu with nested structure
 | ||
|  |   DeesContextmenu.openContextMenuWithOptions(contextMenuEvent, [ | ||
|  |     { | ||
|  |       name: 'Parent Item', | ||
|  |       iconName: 'folder', | ||
|  |       action: async () => {}, // Parent items with submenus need an action
 | ||
|  |       submenu: [ | ||
|  |         { | ||
|  |           name: 'Child Item', | ||
|  |           iconName: 'file', | ||
|  |           action: async () => { | ||
|  |             actionCalled = true; | ||
|  |             console.log('Child action called'); | ||
|  |           } | ||
|  |         }, | ||
|  |         { | ||
|  |           name: 'Another Child', | ||
|  |           iconName: 'fileText', | ||
|  |           action: async () => console.log('Another child') | ||
|  |         } | ||
|  |       ] | ||
|  |     }, | ||
|  |     { | ||
|  |       name: 'Regular Item', | ||
|  |       iconName: 'box', | ||
|  |       action: async () => console.log('Regular item') | ||
|  |     } | ||
|  |   ]); | ||
|  |    | ||
|  |   // Wait for main menu to appear
 | ||
|  |   await new Promise(resolve => setTimeout(resolve, 150)); | ||
|  |    | ||
|  |   // Check main menu exists
 | ||
|  |   const mainMenu = document.querySelector('dees-contextmenu'); | ||
|  |   expect(mainMenu).toBeInstanceOf(DeesContextmenu); | ||
|  |    | ||
|  |   // Hover over "Parent Item" to trigger submenu
 | ||
|  |   const parentItem = mainMenu!.shadowRoot!.querySelector('.menuitem'); | ||
|  |   expect(parentItem).toBeTruthy(); | ||
|  |   parentItem!.dispatchEvent(new MouseEvent('mouseenter', { bubbles: true })); | ||
|  |    | ||
|  |   // Wait for submenu to appear
 | ||
|  |   await new Promise(resolve => setTimeout(resolve, 300)); | ||
|  |    | ||
|  |   // Check submenu exists
 | ||
|  |   const allMenus = document.querySelectorAll('dees-contextmenu'); | ||
|  |   expect(allMenus.length).toEqual(2); // Main menu and submenu
 | ||
|  |    | ||
|  |   const submenu = allMenus[1]; | ||
|  |   expect(submenu).toBeTruthy(); | ||
|  |    | ||
|  |   // Click on "Child Item" in submenu
 | ||
|  |   const childItem = submenu.shadowRoot!.querySelector('.menuitem'); | ||
|  |   expect(childItem).toBeTruthy(); | ||
|  |   childItem!.click(); | ||
|  |    | ||
|  |   // Wait for menus to close
 | ||
|  |   await new Promise(resolve => setTimeout(resolve, 200)); | ||
|  |    | ||
|  |   // Verify action was called
 | ||
|  |   expect(actionCalled).toEqual(true); | ||
|  |    | ||
|  |   // Verify all menus are closed
 | ||
|  |   const remainingMenus = document.querySelectorAll('dees-contextmenu'); | ||
|  |   expect(remainingMenus.length).toEqual(0); | ||
|  |    | ||
|  |   // Clean up
 | ||
|  |   testDiv.remove(); | ||
|  | }); | ||
|  | 
 | ||
|  | export default tap.start(); |