fix: allow delete menu clicks in drag regions
This commit is contained in:
@@ -23,6 +23,9 @@ function DragRegionHarness() {
|
||||
<div data-testid="no-drag-card" data-no-drag>
|
||||
<button type="button">Action</button>
|
||||
</div>
|
||||
<div role="menu" aria-label="Note actions">
|
||||
<div role="menuitem">Delete this note</div>
|
||||
</div>
|
||||
</div>
|
||||
)
|
||||
}
|
||||
@@ -68,6 +71,15 @@ describe('useDragRegion', () => {
|
||||
expect(invoke).not.toHaveBeenCalled()
|
||||
})
|
||||
|
||||
it('does not start dragging from menu items rendered inside drag surfaces', () => {
|
||||
render(<DragRegionHarness />)
|
||||
|
||||
fireEvent.mouseDown(screen.getByRole('menuitem', { name: 'Delete this note' }), { button: 0 })
|
||||
|
||||
expect(startDragging).not.toHaveBeenCalled()
|
||||
expect(invoke).not.toHaveBeenCalled()
|
||||
})
|
||||
|
||||
it('ignores non-primary mouse buttons', () => {
|
||||
render(<DragRegionHarness />)
|
||||
|
||||
|
||||
@@ -2,7 +2,17 @@ import { invoke } from '@tauri-apps/api/core'
|
||||
import { getCurrentWindow } from '@tauri-apps/api/window'
|
||||
import { useCallback } from 'react'
|
||||
|
||||
const NO_DRAG_SELECTOR = 'button, input, select, a, [data-no-drag]'
|
||||
const NO_DRAG_SELECTOR = [
|
||||
'button',
|
||||
'input',
|
||||
'select',
|
||||
'a',
|
||||
'[role="menu"]',
|
||||
'[role="menuitem"]',
|
||||
'[role="menuitemcheckbox"]',
|
||||
'[role="menuitemradio"]',
|
||||
'[data-no-drag]',
|
||||
].join(', ')
|
||||
|
||||
function isDragDisabledTarget(target: EventTarget | null): boolean {
|
||||
return target instanceof Element && target.closest(NO_DRAG_SELECTOR) !== null
|
||||
|
||||
@@ -27,7 +27,10 @@ test.describe('responsive note deletion', () => {
|
||||
const handlers = window.__mockHandlers
|
||||
if (!handlers) throw new Error('Mock handlers unavailable for delete override')
|
||||
const delayedDelete = (args?: { paths?: string[] }) =>
|
||||
new Promise((resolve) => window.setTimeout(() => resolve(args?.paths ?? []), 3_000))
|
||||
new Promise((resolve) => {
|
||||
const testWindow = window as typeof window & { __resolveDelete?: () => void }
|
||||
testWindow.__resolveDelete = () => resolve(args?.paths ?? [])
|
||||
})
|
||||
handlers.batch_delete_notes = delayedDelete
|
||||
handlers.batch_delete_notes_async = delayedDelete
|
||||
})
|
||||
@@ -49,7 +52,28 @@ test.describe('responsive note deletion', () => {
|
||||
|
||||
await expect(page.getByRole('heading', { name: 'Note B', level: 1 })).toBeVisible({ timeout: 5_000 })
|
||||
await expect(progressNotice).toBeVisible()
|
||||
await page.evaluate(() => {
|
||||
const { __resolveDelete: resolveDelete } = window as typeof window & { __resolveDelete?: () => void }
|
||||
if (!resolveDelete) throw new Error('Delete resolver was not registered')
|
||||
resolveDelete()
|
||||
})
|
||||
await expect(progressNotice).toHaveCount(0, { timeout: 5_000 })
|
||||
await expect(page.getByText('Note permanently deleted')).toBeVisible({ timeout: 5_000 })
|
||||
})
|
||||
|
||||
test('breadcrumb delete menu responds to a single pointer click @smoke', async ({ page }) => {
|
||||
await openFixtureVaultDesktopHarness(page, tempVaultDir)
|
||||
await page.getByText('Alpha Project', { exact: true }).first().click()
|
||||
await expect(page.getByRole('heading', { name: 'Alpha Project', level: 1 })).toBeVisible({ timeout: 5_000 })
|
||||
|
||||
await page.getByRole('button', { name: 'More note actions' }).click()
|
||||
const menu = page.getByRole('menu')
|
||||
const deleteItem = menu.getByRole('menuitem', { name: 'Delete this note' })
|
||||
await expect(deleteItem).toBeVisible({ timeout: 5_000 })
|
||||
|
||||
await deleteItem.click()
|
||||
|
||||
await expect(page.getByTestId('confirm-delete-dialog')).toBeVisible({ timeout: 5_000 })
|
||||
await expect(page.getByTestId('confirm-delete-btn')).toBeFocused()
|
||||
})
|
||||
})
|
||||
|
||||
Reference in New Issue
Block a user