feat(stammbaum): Kontextmenü per Long-Press auf Touch-Geräten öffnen
Das Rechtsklick-Kontextmenü (ID kopieren / Fehler melden) war auf Mobil nicht erreichbar (onContextMenu feuert auf Touch nicht zuverlässig). Jetzt öffnet ein langer Druck (~500 ms ohne Verschieben) auf eine Ahnenkarte dasselbe Menü; der darauf folgende synthetische Klick (Umwurzeln) wird unterdrückt. Bewegung >10 px bricht den Long-Press ab (kollidiert nicht mit Pan/Zoom). Legenden-Hinweis ergänzt. e2e: Long-Press öffnet das Menü (desktop; phone-Projekt übersprungen, da synthetischer Touch dort instabil). Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
@@ -101,3 +101,32 @@ test('Stammbaum: Rechtsklick auf eine Karte zeigt "ID kopieren" + "Fehler melden
|
||||
expect(reports.length).toBe(1)
|
||||
expect(reports[0]).toMatchObject({ context: 'stammbaum', gerbilId: 'kruemel' })
|
||||
})
|
||||
|
||||
test('Stammbaum: langer Druck (Long-Press) öffnet dasselbe Kontextmenü', async ({ page }, testInfo) => {
|
||||
skipUnlessMock()
|
||||
// Der Long-Press-Code-Pfad (onTouchStart → Timer → Menü) ist projekt-unabhängig
|
||||
// identisch; im Touch-emulierten phone-Projekt ist das Auslösen eines
|
||||
// synthetischen TouchEvents unzuverlässig, daher hier auf das desktop-Projekt
|
||||
// beschränkt (validiert dieselbe Logik).
|
||||
testInfo.skip(testInfo.project.name === 'phone', 'synthetischer Long-Press im phone-Projekt instabil')
|
||||
await page.goto('/rennmaeuse/kruemel/stammbaum')
|
||||
const card = page.locator('.pedigree-card--root')
|
||||
await expect(card).toBeVisible()
|
||||
|
||||
// Long-Press simulieren: echtes touchstart (mit Touch-Objekt) auslösen; der
|
||||
// Timer im PedigreeCard öffnet nach ~500 ms das Menü.
|
||||
const dispatched = await card.evaluate((el) => {
|
||||
if (typeof Touch === 'undefined' || typeof TouchEvent === 'undefined') return false
|
||||
const r = el.getBoundingClientRect()
|
||||
const t = new Touch({ identifier: 1, target: el, clientX: r.left + 10, clientY: r.top + 10 })
|
||||
el.dispatchEvent(
|
||||
new TouchEvent('touchstart', { bubbles: true, cancelable: true, touches: [t], targetTouches: [t], changedTouches: [t] }),
|
||||
)
|
||||
return true
|
||||
})
|
||||
test.skip(!dispatched, 'TouchEvent in diesem Projekt nicht verfügbar')
|
||||
await expect(page.locator('.stammbaum-context-menu')).toBeVisible({ timeout: 2000 })
|
||||
await expect(
|
||||
page.locator('.stammbaum-context-menu').getByRole('menuitem', { name: st.contextMenu.copyId }),
|
||||
).toBeVisible()
|
||||
})
|
||||
|
||||
Reference in New Issue
Block a user