fix(richtext-lexical): improve keyboard navigation on DecoratorNodes (#11022)

Fixes #8506



https://github.com/user-attachments/assets/a5e26f18-2557-4f19-bd89-73f246200fa5
This commit is contained in:
Germán Jabloñski
2025-02-10 16:22:25 -03:00
committed by GitHub
parent 91a0f90649
commit fa18923317
2 changed files with 309 additions and 15 deletions

View File

@@ -1519,4 +1519,84 @@ describe('lexicalMain', () => {
await monacoCode.click()
await expect(decoratorLocator).toBeHidden()
})
test('arrow keys', async () => {
// utils
const selectedDecorator = page.locator('.decorator-selected')
const topLevelDecorator = page.locator(
'[data-lexical-decorator="true"]:not([data-lexical-decorator="true"] [data-lexical-decorator="true"])',
)
const selectedNthDecorator = async (nth: number) => {
await expect(selectedDecorator).toBeVisible()
const areSame = await selectedDecorator.evaluateHandle(
(el1, el2) => el1 === el2,
await topLevelDecorator.nth(nth).elementHandle(),
)
await expect.poll(async () => await areSame.jsonValue()).toBe(true)
}
// test
await navigateToLexicalFields()
const textNode = page.getByText('Upload Node:', { exact: true })
await textNode.click()
await expect(selectedDecorator).toBeHidden()
await page.keyboard.press('ArrowDown')
await selectedNthDecorator(0)
await page.keyboard.press('ArrowDown')
await selectedNthDecorator(1)
await page.keyboard.press('ArrowDown')
await selectedNthDecorator(2)
await page.keyboard.press('ArrowDown')
await selectedNthDecorator(3)
await page.keyboard.press('ArrowDown')
await selectedNthDecorator(4)
await page.keyboard.press('ArrowDown')
await selectedNthDecorator(5)
await page.keyboard.press('ArrowDown')
await page.keyboard.press('ArrowDown')
await selectedNthDecorator(6)
await page.keyboard.press('ArrowDown')
await selectedNthDecorator(7)
await page.keyboard.press('ArrowDown')
await page.keyboard.press('ArrowDown')
await selectedNthDecorator(8)
await page.keyboard.press('ArrowDown')
await page.keyboard.press('ArrowDown')
await selectedNthDecorator(9)
await page.keyboard.press('ArrowDown')
await selectedNthDecorator(10)
await page.keyboard.press('ArrowDown')
await selectedNthDecorator(10)
await page.keyboard.press('ArrowUp')
await selectedNthDecorator(9)
await page.keyboard.press('ArrowUp')
await page.keyboard.press('ArrowUp')
await selectedNthDecorator(8)
await page.keyboard.press('ArrowUp')
await page.keyboard.press('ArrowUp')
await selectedNthDecorator(7)
await page.keyboard.press('ArrowUp')
await selectedNthDecorator(6)
await page.keyboard.press('ArrowUp')
await page.keyboard.press('ArrowUp')
await selectedNthDecorator(5)
await page.keyboard.press('ArrowUp')
await selectedNthDecorator(4)
await page.keyboard.press('ArrowUp')
await selectedNthDecorator(3)
await page.keyboard.press('ArrowUp')
await selectedNthDecorator(2)
await page.keyboard.press('ArrowUp')
await selectedNthDecorator(1)
await page.keyboard.press('ArrowUp')
await selectedNthDecorator(0)
await page.keyboard.press('ArrowUp')
await selectedNthDecorator(0)
// TODO: It would be nice to add tests with lists and nested lists
// before and after decoratorNodes and paragraphs. Tested manually,
// but these are complex cases.
})
})