Keep Kanban open for toast actions (#2602)

This commit is contained in:
Neil 2026-05-21 22:53:12 -07:00 committed by GitHub
parent fdf293e4a3
commit fb863590cd
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
2 changed files with 55 additions and 0 deletions

View File

@ -0,0 +1,54 @@
import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest'
import { isWorkspaceBoardKeepOpenTarget } from './use-workspace-kanban-outside-dismiss'
class FakeNode {
parentElement: FakeElement | null = null
}
class FakeElement extends FakeNode {
private readonly attributes: ReadonlySet<string>
constructor(attributes: readonly string[] = [], parentElement: FakeElement | null = null) {
super()
this.attributes = new Set(attributes)
this.parentElement = parentElement
}
closest(selector: string): FakeElement | null {
if (this.matches(selector)) {
return this
}
return this.parentElement?.closest(selector) ?? null
}
private matches(selector: string): boolean {
return selector
.split(',')
.map((part) => part.trim())
.some((part) => this.attributes.has(part))
}
}
describe('workspace kanban outside dismiss keep-open targets', () => {
beforeEach(() => {
vi.stubGlobal('Node', FakeNode)
vi.stubGlobal('Element', FakeElement)
})
afterEach(() => {
vi.unstubAllGlobals()
})
it('keeps the board open when a Sonner toast action is clicked', () => {
const toast = new FakeElement(['[data-sonner-toast]'])
const action = new FakeElement([], toast)
expect(isWorkspaceBoardKeepOpenTarget(action as unknown as EventTarget)).toBe(true)
})
it('does not keep the board open for generic outside content', () => {
const target = new FakeElement()
expect(isWorkspaceBoardKeepOpenTarget(target as unknown as EventTarget)).toBe(false)
})
})

View File

@ -11,6 +11,7 @@ const WORKSPACE_BOARD_KEEP_OPEN_SELECTOR = [
'[data-slot="popover-content"]',
'[data-slot="dialog-content"]',
'[data-slot="dialog-overlay"]',
'[data-sonner-toast]',
'[role="dialog"][data-state="open"]',
'[role="alertdialog"][data-state="open"]',
'[role="menu"][data-state="open"]'