Skip to content
Open
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
83 changes: 83 additions & 0 deletions packages/react/src/SelectPanel/SelectPanel.test.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -1536,7 +1536,7 @@
// Select all (which is just the one visible item)
await user.click(screen.getByRole('checkbox', {name: 'Select all'}))

// The visible item should be selected

Check failure on line 1539 in packages/react/src/SelectPanel/SelectPanel.test.tsx

View workflow job for this annotation

GitHub Actions / lint

'ThemeProvider' is not defined

Check failure on line 1539 in packages/react/src/SelectPanel/SelectPanel.test.tsx

View workflow job for this annotation

GitHub Actions / test

src/SelectPanel/SelectPanel.test.tsx > Event propagation > should prevent event propagation when using keyboard while focusing on an item

ReferenceError: ThemeProvider is not defined ❯ EventSelectPanel src/SelectPanel/SelectPanel.test.tsx:1539:9 ❯ renderWithHooks ../../node_modules/react-dom/cjs/react-dom.development.js:15486:17 ❯ mountIndeterminateComponent ../../node_modules/react-dom/cjs/react-dom.development.js:20103:12 ❯ beginWork ../../node_modules/react-dom/cjs/react-dom.development.js:21626:15 ❯ beginWork$1 ../../node_modules/react-dom/cjs/react-dom.development.js:27465:13 ❯ performUnitOfWork ../../node_modules/react-dom/cjs/react-dom.development.js:26599:11 ❯ workLoopSync ../../node_modules/react-dom/cjs/react-dom.development.js:26505:4 ❯ renderRootSync ../../node_modules/react-dom/cjs/react-dom.development.js:26473:6 ❯ recoverFromConcurrentError ../../node_modules/react-dom/cjs/react-dom.development.js:25889:19 ❯ performConcurrentWorkOnRoot ../../node_modules/react-dom/cjs/react-dom.development.js:25789:21

Check failure on line 1539 in packages/react/src/SelectPanel/SelectPanel.test.tsx

View workflow job for this annotation

GitHub Actions / test

src/SelectPanel/SelectPanel.test.tsx > Event propagation > should prevent event propagation when using keyboard while focusing on an item

ReferenceError: ThemeProvider is not defined ❯ EventSelectPanel src/SelectPanel/SelectPanel.test.tsx:1539:9 ❯ renderWithHooks ../../node_modules/react-dom/cjs/react-dom.development.js:15486:17 ❯ mountIndeterminateComponent ../../node_modules/react-dom/cjs/react-dom.development.js:20103:12 ❯ beginWork ../../node_modules/react-dom/cjs/react-dom.development.js:21626:15 ❯ beginWork$1 ../../node_modules/react-dom/cjs/react-dom.development.js:27465:13 ❯ performUnitOfWork ../../node_modules/react-dom/cjs/react-dom.development.js:26599:11 ❯ workLoopSync ../../node_modules/react-dom/cjs/react-dom.development.js:26505:4 ❯ renderRootSync ../../node_modules/react-dom/cjs/react-dom.development.js:26473:6 ❯ recoverFromConcurrentError ../../node_modules/react-dom/cjs/react-dom.development.js:25889:19 ❯ performConcurrentWorkOnRoot ../../node_modules/react-dom/cjs/react-dom.development.js:25789:21
expect(screen.getByRole('option', {name: 'item one'})).toHaveAttribute('aria-selected', 'true')

// Clear the filter
Expand All @@ -1555,4 +1555,87 @@
})
})
})

describe('Event propagation', () => {
function EventSelectPanel() {
const [selected, setSelected] = React.useState<SelectPanelProps['items']>([])
const [filter, setFilter] = React.useState('')
const [open, setOpen] = React.useState(false)

const onSelectedChange = (selected: SelectPanelProps['items']) => {
setSelected(selected)
}

return (
<ThemeProvider>
<div
onKeyDown={(e: React.KeyboardEvent<HTMLDivElement>) => {
const isAlphabetKey = e.key.length === 1 && /[a-z\d]/i.test(e.key)
const container = e.currentTarget

if (!isAlphabetKey) return
container.setAttribute('data-keydown-called', 'true')
}}
data-keydown-called="false"
>
<button type="button" onClick={() => setOpen(!open)}>
Toggle SelectPanel
</button>
<SelectPanel
title="test title"
subtitle="test subtitle"
items={items}
placeholder="Select items"
placeholderText="Filter items"
selected={selected}
onSelectedChange={onSelectedChange}
filterValue={filter}
onFilterChange={value => {
setFilter(value)
}}
open={open}
onOpenChange={isOpen => {
setOpen(isOpen)
}}
/>
</div>
</ThemeProvider>
)
}

it('should prevent event propagation when using keyboard while focusing on an item', async () => {
const user = userEvent.setup()

renderWithFlag(<EventSelectPanel />, true)

const toggleButton = screen.getByRole('button', {name: 'Toggle SelectPanel'})
const container = toggleButton.parentElement as HTMLDivElement

await user.click(toggleButton)

expect(screen.getByText('Select items')).toBeInTheDocument()

const listbox = screen.getByRole('listbox')
expect(listbox).toBeInTheDocument()
expect(listbox).toHaveAttribute('aria-multiselectable', 'true')

const options = screen.getAllByRole('option')
expect(options).toHaveLength(3)

const firstOption = options[0]
expect(firstOption).toHaveTextContent('item one')

await user.keyboard('{ArrowDown}')

expect(firstOption).toHaveFocus()

await user.keyboard('{ArrowDown}')

// Trigger alphabet key that should not propagate
await user.keyboard('A')

expect(options[1]).toHaveFocus()
expect(container.getAttribute('data-keydown-called')).toBe('false')
})
})
}
Loading