diff --git a/package-lock.json b/package-lock.json index 81f5eeb77..405322e37 100644 --- a/package-lock.json +++ b/package-lock.json @@ -12654,9 +12654,9 @@ } }, "node_modules/recast": { - "version": "0.23.19", - "resolved": "https://registry.npmjs.org/recast/-/recast-0.23.19.tgz", - "integrity": "sha512-T98lym7kH+pnZmRaD8yDRdaNqyUbwnbEBx0MuchrzMFOEMray4AO3ZJoTUZ5r78Ao78X/OhzW0DL8GB85w/I2w==", + "version": "0.23.20", + "resolved": "https://registry.npmjs.org/recast/-/recast-0.23.20.tgz", + "integrity": "sha512-VtSf75pThDqsIUpdaYrTdQvkw10/+yP0i7+Cax7h+K9SRvYjrJURZcRlcHMrH6TMzV275Q8a2A8+G7y7W9zqsg==", "dev": true, "license": "MIT", "dependencies": { @@ -12667,7 +12667,7 @@ "tslib": "^2.0.1" }, "engines": { - "node": ">= 4" + "node": ">= 22" } }, "node_modules/redent": { diff --git a/src/components/menu/Menu.test.ts b/src/components/menu/Menu.test.ts index a7fdd8a3f..18949881e 100644 --- a/src/components/menu/Menu.test.ts +++ b/src/components/menu/Menu.test.ts @@ -81,4 +81,21 @@ describe('solid-ui-menu syncItems', () => { document.body.removeChild(menu) }) + + it('propagates disabled state to dropdown items', async () => { + const menu = createMenu() + + const child = document.createElement('div') + child.textContent = 'Disabled Item' + child.setAttribute('disabled', '') + menu.appendChild(child) + + document.body.appendChild(menu) + await menu.updateComplete + + const dropdownItem = menu.shadowRoot?.querySelector('wa-dropdown-item') as HTMLElement & { disabled?: boolean } + expect(dropdownItem?.disabled).toBe(true) + + document.body.removeChild(menu) + }) }) diff --git a/src/components/menu/Menu.ts b/src/components/menu/Menu.ts index ce479b9d2..fe4263b8a 100644 --- a/src/components/menu/Menu.ts +++ b/src/components/menu/Menu.ts @@ -24,7 +24,7 @@ export default class Menu extends WebComponent { private accessor dropdown: WaDropdown | null = null; @state() - private accessor items: { slot: string; }[] = [] + private accessor items: { slot: string; disabled: boolean }[] = [] private observer: MutationObserver = new MutationObserver(() => this.syncItems()) @@ -32,7 +32,12 @@ export default class Menu extends WebComponent { super.connectedCallback() this.syncItems() - this.observer.observe(this, { childList: true }) + this.observer.observe(this, { + childList: true, + attributes: true, + subtree: true, + attributeFilter: ['disabled', 'slot'] + }) } disconnectedCallback () { @@ -52,7 +57,7 @@ export default class Menu extends WebComponent { ${this.items.map( (item) => - html` + html` ` )} @@ -69,12 +74,13 @@ export default class Menu extends WebComponent { this.items = items.map((item, index) => { const slotName = `menu-item-${index}` + const disabled = item.hasAttribute('disabled') if (item.getAttribute('slot') !== slotName) { item.setAttribute('slot', slotName) } - return { slot: slotName } + return { slot: slotName, disabled } }) } diff --git a/src/lib/file-explorer/context.ts b/src/lib/file-explorer/context.ts index 69592ebb5..12fcd5c7d 100644 --- a/src/lib/file-explorer/context.ts +++ b/src/lib/file-explorer/context.ts @@ -16,6 +16,8 @@ export interface FileExplorerContext { soloPane?: boolean onBack?: () => void + refresh?: () => void + deleteTargetUri?: string openPane?: (subject: NamedNode, paneName: string) => void handleSharingClick?: () => void