mirror of
https://github.com/fsolla/teqo.git
synced 2026-11-15 18:53:06 +00:00
Root cause of the prod-build React #130 on /campanha/municipios: the md:hidden mobile-cards tree still hydrated ~25 rows x ~5 sheet controls (~125 eager Drawer/DrawerCloseButton instances) even on wide viewports. Filtered ?q=... routes failed more often only because they exercise the list with filters active — the search param itself was not the bug. CampaignListSheetProvider hosts a single bottom Drawer for the whole mobile section; CampaignCellEditOverlay sheet cells portal their body/footer into it while keeping per-cell open state and autosave scaffolds. Footers with DrawerCloseButton are only created once a sheet actually opens. Desktop popover path is unchanged; per-cell Drawer remains the fallback for surfaces without the provider. Also: DrawerCloseButton (function render prop, avoids base-ui element render in prod bundles) replaces the DrawerClose render={<Button/>} pattern across call sites; stale e2e selectors refreshed; e2e affected script + playwright github/list reporters for CI; use-mobile reverted (no consumers of the gate remain). Guardrail filed as issue #52.
55 lines
2.4 KiB
TypeScript
55 lines
2.4 KiB
TypeScript
import { WIZARD_MUNICIPALITY_STEP_TITLE } from '../../src/lib/campaignWizardCopy.js'
|
|
import { expect, test } from './fixtures/campaignE2EFixtures.js'
|
|
|
|
test.use({ viewport: { width: 390, height: 844 } })
|
|
|
|
test.describe('Wizard — header mobile (B75)', () => {
|
|
test('entry step shows wizard flow title and dismiss without sidebar trigger', async ({
|
|
campaign,
|
|
page,
|
|
}) => {
|
|
const { fixtures } = campaign
|
|
const coordinator = await fixtures.createCampaignUser('coordinator', {
|
|
name: fixtures.value('Coordenadora Geral'),
|
|
})
|
|
|
|
await campaign.login(page, coordinator.email!, coordinator.password)
|
|
await page.goto('/campanha/acoes/atualizar-votos')
|
|
|
|
const topBar = page.locator('[data-slot="campaign-mobile-top-bar"][data-mode="wizard"]')
|
|
await expect(topBar).toBeVisible()
|
|
await expect(topBar.getByText('Ajustar votos', { exact: true })).toBeVisible()
|
|
await expect(page.getByRole('heading', { name: WIZARD_MUNICIPALITY_STEP_TITLE })).toBeVisible()
|
|
await expect(page.getByRole('link', { name: 'Sair da ação' })).toBeVisible()
|
|
await expect(page.getByRole('link', { name: /Voltar/ })).toHaveCount(0)
|
|
|
|
await page.getByRole('link', { name: 'Sair da ação' }).click()
|
|
await page.waitForURL(/\/campanha\/?$/)
|
|
})
|
|
|
|
test('continue step shows back control and municipality in wizard header', async ({
|
|
campaign,
|
|
page,
|
|
}) => {
|
|
const { fixtures } = campaign
|
|
const coordinator = await fixtures.createCampaignUser('coordinator', {
|
|
name: fixtures.value('Coordenadora Geral'),
|
|
})
|
|
|
|
await campaign.login(page, coordinator.email!, coordinator.password)
|
|
await page.goto('/campanha/acoes/atualizar-votos?municipio=cairu')
|
|
|
|
await expect(page.getByRole('heading', { name: 'Ajustar votos estimados' })).toBeVisible({
|
|
timeout: 15000,
|
|
})
|
|
|
|
const topBar = page.locator('[data-slot="campaign-mobile-top-bar"][data-mode="wizard"]')
|
|
await expect(topBar.getByText('Ajustar votos', { exact: true })).toBeVisible()
|
|
await expect(topBar.getByLabel(/Município em atualização: Cairu/i)).toBeVisible()
|
|
await expect(page.getByRole('link', { name: /Voltar/ })).toBeVisible()
|
|
|
|
await page.getByRole('link', { name: /Voltar/ }).click()
|
|
await page.waitForURL(/\/campanha\/acoes\/atualizar-votos\/?$/)
|
|
await expect(page.getByRole('heading', { name: WIZARD_MUNICIPALITY_STEP_TITLE })).toBeVisible()
|
|
})
|
|
})
|