From 2fa6e7298ad041df8f67720607c0b12432f60626 Mon Sep 17 00:00:00 2001 From: Cursor Agent Date: Sat, 1 Aug 2026 17:56:27 +0000 Subject: [PATCH] =?UTF-8?q?B104=20=E2=80=94=20Wizard:=20label=20gen=C3=A9r?= =?UTF-8?q?ica=20"Pular"=20nas=20a=C3=A7=C3=B5es=20encadeadas?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Substitui as quatro labels longas de skip (votos, tendência, sinal, liderança) por uma constante compartilhada WIZARD_CHAIN_SKIP_LABEL. Resolvers e condições de exibição permanecem intactos (B96/B98). Closes #131 Co-authored-by: Francisco Solla --- src/lib/campaignWizardCopy.ts | 6 ++---- src/lib/politicalTrendWizardUi.ts | 5 ++--- src/lib/wizardLeadershipContract.ts | 4 ++-- src/lib/wizardSignalUi.ts | 5 ++--- tests/e2e/campaignHomeActions.e2e.spec.ts | 4 ++-- tests/unit/campaignMobileTopBar.unit.spec.tsx | 4 ++-- tests/unit/campaignWizardCopy.unit.spec.ts | 13 +++++++++++++ tests/unit/politicalTrendWizardUi.unit.spec.ts | 4 ++-- tests/unit/wizardExpectedVotesStep.unit.spec.tsx | 2 +- tests/unit/wizardLeadershipStep.unit.spec.ts | 4 ++-- tests/unit/wizardSignalUi.unit.spec.ts | 11 ++++------- 11 files changed, 34 insertions(+), 28 deletions(-) diff --git a/src/lib/campaignWizardCopy.ts b/src/lib/campaignWizardCopy.ts index b351aee5..f340ff64 100644 --- a/src/lib/campaignWizardCopy.ts +++ b/src/lib/campaignWizardCopy.ts @@ -32,7 +32,7 @@ export const WIZARD_MUNICIPALITY_SEARCH_EMPTY = 'Nenhum município encontrado.' export const WIZARD_VOTES_SAVED_MESSAGE = 'Votos estimados atualizados.' as const -const WIZARD_VOTES_SKIP_LABEL = 'Pular ajuste de votos →' as const +export const WIZARD_CHAIN_SKIP_LABEL = 'Pular' as const export const WIZARD_VOTES_FINAL_CTA_LABEL = 'Salvar estimativas →' as const @@ -52,7 +52,7 @@ export const resolveWizardVotesSkip = ( ): WizardVotesSkipAction | undefined => shouldShowWizardVotesSkip(entryAction) ? { - label: WIZARD_VOTES_SKIP_LABEL, + label: WIZARD_CHAIN_SKIP_LABEL, href: wizardChainContinueHref( resolveWizardChainEntry(entryAction, 'update-votes'), 'update-votes', @@ -77,8 +77,6 @@ export const WIZARD_LEADERSHIP_FORM_CREATE_TITLE = 'Nova liderança' as const export const WIZARD_LEADERSHIP_FORM_EDIT_TITLE = 'Atualizar liderança' as const -export const WIZARD_LEADERSHIP_SKIP_LABEL = 'Pular atualização de liderança →' as const - export const WIZARD_LEADERSHIP_CONTINUE_LABEL = 'Continuar' as const export const WIZARD_LEADERSHIP_ADD_TILE_LABEL = 'Adicionar liderança' as const diff --git a/src/lib/politicalTrendWizardUi.ts b/src/lib/politicalTrendWizardUi.ts index 5c33dfae..75a81f66 100644 --- a/src/lib/politicalTrendWizardUi.ts +++ b/src/lib/politicalTrendWizardUi.ts @@ -1,4 +1,5 @@ import type { CampaignWizardActionId } from '@/lib/campaignActionRoutes' +import { WIZARD_CHAIN_SKIP_LABEL } from '@/lib/campaignWizardCopy' import { politicalTrendStatuses, type PoliticalTrendStatusValue } from '@/lib/schemas/municipality' import { municipalitySignalTypeLabels, @@ -12,8 +13,6 @@ const politicalTrendDisplayLabels: Record = { desfavoravel: 'Desfavorável', } -export const WIZARD_TREND_SKIP_LABEL = 'Pular mudança de tendência →' as const - export const WIZARD_TREND_SAVE_LABEL = 'Salvar' as const export const WIZARD_TREND_CLEAR_LABEL = 'Limpar' as const @@ -73,7 +72,7 @@ export const resolveWizardTrendSkip = ( ): WizardTrendSkipAction | undefined => shouldShowWizardTrendSkip(entryAction) ? { - label: WIZARD_TREND_SKIP_LABEL, + label: WIZARD_CHAIN_SKIP_LABEL, href: wizardChainContinueHref( resolveWizardChainEntry(entryAction, 'change-trend'), 'change-trend', diff --git a/src/lib/wizardLeadershipContract.ts b/src/lib/wizardLeadershipContract.ts index 7d936dbd..158b51ed 100644 --- a/src/lib/wizardLeadershipContract.ts +++ b/src/lib/wizardLeadershipContract.ts @@ -1,5 +1,5 @@ import type { CampaignWizardActionId } from '@/lib/campaignActionRoutes' -import { WIZARD_LEADERSHIP_SKIP_LABEL } from '@/lib/campaignWizardCopy' +import { WIZARD_CHAIN_SKIP_LABEL } from '@/lib/campaignWizardCopy' import type { SupportStatus } from '@/lib/schemas/leadership' import { resolveWizardChainEntry, wizardChainContinueHref } from '@/lib/wizardActionChain' @@ -30,7 +30,7 @@ export const resolveWizardLeadershipSkip = ( ): WizardLeadershipSkipAction | undefined => showLeadershipWizardSkip(entryAction) ? { - label: WIZARD_LEADERSHIP_SKIP_LABEL, + label: WIZARD_CHAIN_SKIP_LABEL, href: wizardChainContinueHref( resolveWizardChainEntry(entryAction, 'update-leadership'), 'update-leadership', diff --git a/src/lib/wizardSignalUi.ts b/src/lib/wizardSignalUi.ts index d561af99..c1c5d9e3 100644 --- a/src/lib/wizardSignalUi.ts +++ b/src/lib/wizardSignalUi.ts @@ -1,12 +1,11 @@ import type { CampaignWizardActionId } from '@/lib/campaignActionRoutes' +import { WIZARD_CHAIN_SKIP_LABEL } from '@/lib/campaignWizardCopy' import { resolveWizardChainEntry, wizardChainContinueHref } from '@/lib/wizardActionChain' export const WIZARD_SIGNAL_TYPE_STEP_TITLE = 'Que tipo de sinal?' as const export const WIZARD_SIGNAL_BODY_STEP_TITLE_PREFIX = 'Detalhar sinal' as const -export const WIZARD_SIGNAL_SKIP_LABEL = 'Pular registro de sinal' as const - export const WIZARD_SIGNAL_SAVE_LABEL = 'Salvar' as const export const WIZARD_SIGNAL_SAVED_MESSAGE = 'Sinal registrado.' as const @@ -26,7 +25,7 @@ export const resolveWizardSignalSkip = ( ): WizardSignalSkipAction | undefined => shouldShowWizardSignalSkip(entryAction) ? { - label: WIZARD_SIGNAL_SKIP_LABEL, + label: WIZARD_CHAIN_SKIP_LABEL, href: wizardChainContinueHref( resolveWizardChainEntry(entryAction, 'register-signal'), 'register-signal', diff --git a/tests/e2e/campaignHomeActions.e2e.spec.ts b/tests/e2e/campaignHomeActions.e2e.spec.ts index 3f4d943b..881bc132 100644 --- a/tests/e2e/campaignHomeActions.e2e.spec.ts +++ b/tests/e2e/campaignHomeActions.e2e.spec.ts @@ -333,7 +333,7 @@ test.describe('Wizard — registrar sinal (B63)', () => { await expect(page.getByRole('heading', { name: 'Que tipo de sinal?' })).toBeVisible({ timeout: 15000, }) - await expect(page.getByRole('link', { name: 'Pular registro de sinal' })).toHaveCount(0) + await expect(page.getByRole('link', { name: 'Pular' })).toHaveCount(0) await page.getByRole('link', { name: /Invasão/i }).click() await page.waitForURL(/signalType=invasao/) @@ -387,7 +387,7 @@ test.describe('Wizard — registrar sinal (B63)', () => { `/campanha/acoes/registrar-sinal?municipio=${municipality.slug}&entry=update-votes`, ) - const skip = page.getByRole('link', { name: 'Pular registro de sinal' }) + const skip = page.getByRole('link', { name: 'Pular' }) await expect(skip).toBeVisible({ timeout: 15000 }) await expect(skip).toHaveAttribute( 'href', diff --git a/tests/unit/campaignMobileTopBar.unit.spec.tsx b/tests/unit/campaignMobileTopBar.unit.spec.tsx index dbfab634..841070e2 100644 --- a/tests/unit/campaignMobileTopBar.unit.spec.tsx +++ b/tests/unit/campaignMobileTopBar.unit.spec.tsx @@ -99,12 +99,12 @@ describe('CampaignMobileTopBar', () => { previousHref: '/campanha/acoes/atualizar-votos?municipio=cairu', dismissHref: '/campanha', skip: { - label: 'Pular registro de sinal', + label: 'Pular', href: '/campanha/acoes/mudar-tendencia?municipio=cairu', }, }) - expect(screen.getByRole('link', { name: 'Pular registro de sinal' }).getAttribute('href')).toBe( + expect(screen.getByRole('link', { name: 'Pular' }).getAttribute('href')).toBe( '/campanha/acoes/mudar-tendencia?municipio=cairu', ) expect(screen.queryByRole('link', { name: 'Sair da ação' })).toBeNull() diff --git a/tests/unit/campaignWizardCopy.unit.spec.ts b/tests/unit/campaignWizardCopy.unit.spec.ts index 5ba27e48..c428c35d 100644 --- a/tests/unit/campaignWizardCopy.unit.spec.ts +++ b/tests/unit/campaignWizardCopy.unit.spec.ts @@ -1,6 +1,9 @@ import { describe, expect, it } from 'vitest' +import { CAMPAIGN_ACTIONS_HOME } from '@/lib/campaignActionRoutes' import { + resolveWizardVotesSkip, + WIZARD_CHAIN_SKIP_LABEL, WIZARD_DISMISS_ARIA_LABEL, wizardFlowChromeAriaLabel, wizardFlowTitleForSlug, @@ -19,4 +22,14 @@ describe('campaignWizardCopy', () => { expect(wizardMunicipalityChromeAriaLabel('Cairu')).toBe('Município em atualização: Cairu') expect(WIZARD_DISMISS_ARIA_LABEL).toBe('Sair da ação') }) + + it('uses the shared chain skip label for embedded vote adjustments', () => { + expect(WIZARD_CHAIN_SKIP_LABEL).toBe('Pular') + expect(resolveWizardVotesSkip(undefined, 'cairu')).toBeUndefined() + expect(resolveWizardVotesSkip('update-votes', 'cairu')).toBeUndefined() + expect(resolveWizardVotesSkip('change-trend', 'cairu')).toEqual({ + label: WIZARD_CHAIN_SKIP_LABEL, + href: `${CAMPAIGN_ACTIONS_HOME}/atualizar-lideranca?municipio=cairu&entry=change-trend`, + }) + }) }) diff --git a/tests/unit/politicalTrendWizardUi.unit.spec.ts b/tests/unit/politicalTrendWizardUi.unit.spec.ts index 699dd68e..93e863a1 100644 --- a/tests/unit/politicalTrendWizardUi.unit.spec.ts +++ b/tests/unit/politicalTrendWizardUi.unit.spec.ts @@ -1,6 +1,7 @@ import { describe, expect, it } from 'vitest' import { CAMPAIGN_ACTIONS_HOME } from '@/lib/campaignActionRoutes' +import { WIZARD_CHAIN_SKIP_LABEL } from '@/lib/campaignWizardCopy' import { politicalTrendWizardMeta, politicalTrendWizardMetaByStatus, @@ -12,7 +13,6 @@ import { resolveWizardTrendSkip, selectablePoliticalTrendStatuses, shouldShowWizardTrendSkip, - WIZARD_TREND_SKIP_LABEL, WIZARD_TREND_UNREGISTERED_TITLE, wizardTrendChoiceStepTitle, } from '@/lib/politicalTrendWizardUi' @@ -47,7 +47,7 @@ describe('politicalTrendWizardUi', () => { expect(shouldShowWizardTrendSkip('update-votes')).toBe(true) expect(shouldShowWizardTrendSkip('register-signal')).toBe(true) expect(resolveWizardTrendSkip('update-votes', 'cairu')).toEqual({ - label: WIZARD_TREND_SKIP_LABEL, + label: WIZARD_CHAIN_SKIP_LABEL, href: `${CAMPAIGN_ACTIONS_HOME}/registrar-sinal?municipio=cairu&entry=update-votes`, }) }) diff --git a/tests/unit/wizardExpectedVotesStep.unit.spec.tsx b/tests/unit/wizardExpectedVotesStep.unit.spec.tsx index ab980709..3295c970 100644 --- a/tests/unit/wizardExpectedVotesStep.unit.spec.tsx +++ b/tests/unit/wizardExpectedVotesStep.unit.spec.tsx @@ -114,7 +114,7 @@ describe('WizardExpectedVotesStep', () => { it('shows skip to the next chain step when votes is chained', () => { renderVotesStep({ ...defaultProps, entryAction: 'register-signal' }) - const skip = screen.getByRole('link', { name: /Pular ajuste de votos/i }) + const skip = screen.getByRole('link', { name: /^Pular$/i }) expect(skip.getAttribute('href')).toBe( `${CAMPAIGN_ACTIONS_HOME}/atualizar-lideranca?municipio=cairu&entry=register-signal`, ) diff --git a/tests/unit/wizardLeadershipStep.unit.spec.ts b/tests/unit/wizardLeadershipStep.unit.spec.ts index d30de245..b60b9623 100644 --- a/tests/unit/wizardLeadershipStep.unit.spec.ts +++ b/tests/unit/wizardLeadershipStep.unit.spec.ts @@ -1,7 +1,7 @@ import { describe, expect, it } from 'vitest' import { CAMPAIGN_HOME } from '@/lib/campaignPaths' -import { WIZARD_LEADERSHIP_SKIP_LABEL } from '@/lib/campaignWizardCopy' +import { WIZARD_CHAIN_SKIP_LABEL } from '@/lib/campaignWizardCopy' import { resolveWizardLeadershipSkip, showLeadershipWizardSkip, @@ -30,7 +30,7 @@ describe('resolveWizardLeadershipSkip', () => { it('points skip to Início when leadership is the last chained step', () => { // In the v1 matrix, leadership is always the final chained elo. expect(resolveWizardLeadershipSkip('update-votes', 'cairu')).toEqual({ - label: WIZARD_LEADERSHIP_SKIP_LABEL, + label: WIZARD_CHAIN_SKIP_LABEL, href: CAMPAIGN_HOME, }) }) diff --git a/tests/unit/wizardSignalUi.unit.spec.ts b/tests/unit/wizardSignalUi.unit.spec.ts index 53eda322..6be07cf3 100644 --- a/tests/unit/wizardSignalUi.unit.spec.ts +++ b/tests/unit/wizardSignalUi.unit.spec.ts @@ -1,16 +1,13 @@ import { describe, expect, it } from 'vitest' import { CAMPAIGN_ACTIONS_HOME } from '@/lib/campaignActionRoutes' +import { WIZARD_CHAIN_SKIP_LABEL } from '@/lib/campaignWizardCopy' import { municipalitySignalTypeMeta, municipalitySignalTypeMetaByType, } from '@/lib/municipalitySignalTypeMeta' import { municipalitySignalTypes } from '@/lib/schemas/municipalityUpdate' -import { - resolveWizardSignalSkip, - shouldShowWizardSignalSkip, - WIZARD_SIGNAL_SKIP_LABEL, -} from '@/lib/wizardSignalUi' +import { resolveWizardSignalSkip, shouldShowWizardSignalSkip } from '@/lib/wizardSignalUi' describe('wizardSignalUi', () => { it('hides skip for standalone register-signal entry', () => { @@ -24,11 +21,11 @@ describe('wizardSignalUi', () => { expect(shouldShowWizardSignalSkip('update-votes')).toBe(true) expect(shouldShowWizardSignalSkip('change-trend')).toBe(true) expect(resolveWizardSignalSkip('update-votes', 'cairu')).toEqual({ - label: WIZARD_SIGNAL_SKIP_LABEL, + label: WIZARD_CHAIN_SKIP_LABEL, href: `${CAMPAIGN_ACTIONS_HOME}/atualizar-lideranca?municipio=cairu&entry=update-votes`, }) expect(resolveWizardSignalSkip('change-trend', 'cairu')).toEqual({ - label: WIZARD_SIGNAL_SKIP_LABEL, + label: WIZARD_CHAIN_SKIP_LABEL, href: `${CAMPAIGN_ACTIONS_HOME}/atualizar-votos?municipio=cairu&entry=change-trend`, }) })