docs: add B69/B70 leadership model and wizard plans
Register roadmap items for leadership simplification (exclusive flag, field cleanup) and the A4 update-leadership wizard grid flow.
This commit is contained in:
parent
7a3728a3d4
commit
ee746b1240
4 changed files with 274 additions and 19 deletions
|
|
@ -129,19 +129,18 @@ Chrome: seta **Voltar** só mobile (**B59**). Também passo embutido de A1.
|
|||
|
||||
## Fluxo A4 — Atualizar liderança
|
||||
|
||||
Cobre o pacote Cairu sem exigir que ele ache a ficha da pessoa primeiro.
|
||||
Cobre o pacote Cairu sem exigir que ele ache a ficha da pessoa primeiro. Modelo: **B69** (`exclusive` default true; sem org/setor/`consentNote`). UI: **B70**.
|
||||
|
||||
| Passo | Pergunta | Nota |
|
||||
| ----- | -------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------- |
|
||||
| 1 | Em qual município? | |
|
||||
| 2 | O que você quer fazer? | **Trocar quem coordena** · **Mudar status de apoio** · **Anotar votos que a pessoa declara** · **Incluir nova liderança** |
|
||||
| 3a | Quem? | Busca no município; se não achar → nome + telefone (create mínimo) |
|
||||
| 3b | (ramo status) Novo status? | Engajado / … (labels atuais, plain language) |
|
||||
| 3c | (ramo votos) Quantos votos essa pessoa declara? | `declaredVotes`; staff pode seguir com estimativa se quiser — **estimativa nunca como passo da liderança** |
|
||||
| 3d | (ramo troca) Quem deixa de ser o principal / quem entra? | Observação interna (“mordeu a isca”, “secundário”) |
|
||||
| 4 | Resumo → **Registrar** | |
|
||||
| Passo | Pergunta | UI / nota |
|
||||
| ----- | ------------------ | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
|
||||
| 1 | Em qual município? | Busca só municípios (**B60**; pular se veio de A1) |
|
||||
| 2 | Quem? | Grid de tiles (2/3/4 cols) + tile **Adicionar**; status no canto; info/hover = `notes`; nome truncado por palavra; telefone∥e-mail (**B70**). Skip “Pular atualização de liderança →” se origem ≠ A4 |
|
||||
| 3 | Editar / criar | Form curto: nome, celular, e-mail, status de apoio, observação, **apoio exclusivo**. Salvar → volta ao grid; se dirty, **Continuar** inferior direito. Focus no input principal ao abrir. Sem pledge aqui |
|
||||
| 4 | Continuar / fim | Avança fluxo pai ou Início + toast (standalone) |
|
||||
|
||||
**Corte 03/08:** ramos “status” + “observação / papel” + busca; create completo e pledge rico podem ser v1.1.
|
||||
**“Liderança é a dobradinha”:** reusar ficha `stateDeputy` + chips `stateDeputies` (B31 ✓) — sem campo novo. **Estimativa nunca neste fluxo.**
|
||||
|
||||
**Corte 03/08:** grid + form curto (status/obs/exclusivo/create); pledge rico e atalho criar-dobradinha ficam fora.
|
||||
|
||||
---
|
||||
|
||||
|
|
@ -222,10 +221,13 @@ Não competir com os botões.
|
|||
5. **B61** Ajuste votos (média→pessimista→otimista + atalhos + coerência) — [ajuste-votos-wizard.md](ajuste-votos-wizard.md)
|
||||
6. **B62** Simplificar modelo de sinal (tipo+texto; labels mesa) — [simplificar-modelo-sinal.md](simplificar-modelo-sinal.md)
|
||||
7. **B63** Wizard sinal (grid tipo + texto + pular) — [wizard-registro-sinal.md](wizard-registro-sinal.md)
|
||||
8. **A1** wiring (orquestrar B60+B61 + “quer também?” sinal/tendência + resumo/CTA)
|
||||
7b. **B64** Wizard tendência — [wizard-mudar-tendencia.md](wizard-mudar-tendencia.md)
|
||||
7c. **B69** Simplificar modelo de liderança (`exclusive` + limpeza) — [simplificar-modelo-lideranca.md](simplificar-modelo-lideranca.md)
|
||||
7d. **B70** Wizard atualizar liderança (grid + form) — [wizard-atualizar-lideranca.md](wizard-atualizar-lideranca.md)
|
||||
8. **A1** wiring (orquestrar B60+B61 + “quer também?” sinal/tendência/liderança + resumo/CTA)
|
||||
9. **A6** — atalho já em B45 (`uncovered-municipalities`)
|
||||
10. **A2** standalone = B60+B63 (se não ficou bom só embutido em A1)
|
||||
11. **A4** curto · **A5** + edição de demanda · E11 → wizards · A3 standalone
|
||||
11. **A4** = B60+B70 · **A5** + edição de demanda · E11 → wizards · A3 standalone = B60+B64
|
||||
|
||||
---
|
||||
|
||||
|
|
|
|||
114
docs/plans/simplificar-modelo-lideranca.md
Normal file
114
docs/plans/simplificar-modelo-lideranca.md
Normal file
|
|
@ -0,0 +1,114 @@
|
|||
# Simplificar modelo de liderança (exclusivo + limpeza)
|
||||
|
||||
Status: rascunho
|
||||
Atualizado em: 2026-07-29
|
||||
Item do roadmap: [docs/roadmap.md](../roadmap.md) (Trilha B, item B69 — UX-1 / A4)
|
||||
Impeccable: B — schema + forms/lista/convite existentes; UI de grid do wizard = **B70**
|
||||
Appetite: ~1–1,25 dia eng; uma migration (drop + `exclusive`); zod/collection/UI lista/forms/invite; access `OwnLeadership`
|
||||
Responsável: —
|
||||
|
||||
## Design (Impeccable)
|
||||
|
||||
Âncoras: `PRODUCT.md` / `DESIGN.md` · tema `campaign`. Superfícies tocadas = ficha/lista/convite já no Field Desk — craft compacto, não shape de rota nova.
|
||||
|
||||
Na implementação: craft compacto → critique → polish.
|
||||
|
||||
Brief compacto (B, direção clara):
|
||||
|
||||
- **Persona:** CG/assessor atualizando rede no ritual A4; formulário longo = abandono.
|
||||
- **Job principal:** gravar só o que a mesa usa no dia a dia — contato, status, observação, exclusividade — sem setor/org/consentimento externo.
|
||||
- **Estratégia de cor:** Restrained.
|
||||
- **Edit where you see:** sim nas superfícies existentes (B32 status; forms `/liderancas`); exclusividade entra nos forms internos + no form do **B70**.
|
||||
- **Anti-goals:** segundo cadastro de pessoa; dropar Consent do **convite** LGPD; inventar join exclusividade×município nesta fatia.
|
||||
|
||||
## Dados → decisão → apresentação
|
||||
|
||||
Dados: N/A como métrica nova — boolean categórico + remoção de campos. Decisão = “esta liderança ainda articula **só** conosco?” (sim/não) e menos atrito de cadastro.
|
||||
|
||||
## Contexto
|
||||
|
||||
`leadership` (`src/collections/Leadership.ts`) carrega hoje: `organizations`, `sector`/`sectorNotes`, `consentNote` (“Registro de consentimento **externo**”), além de `supportStatus`, `notes`, `stateDeputies`, municípios e o trio de Consent do **convite** (`consent` / `consentContentHash` / `consentedAt`).
|
||||
|
||||
Pedido de produto (2026-07-29), no pacote A4 / Cairu ([fluxos-acao-primeiro-inicio.md](fluxos-acao-primeiro-inicio.md)):
|
||||
|
||||
1. Conceito de parceria **exclusiva** (default = exclusivo): liderança que era a articuladora principal e passa a dividir votos com outro candidato deixa de ser exclusiva — e pode voltar. Não é “principal vs secundária” na v1 (ranking implícito); é **exclusividade do apoio**.
|
||||
2. Remover da mesa os conceitos pouco usados: **organização**, **setor** (e notas de setor), **registro de consentimento externo** (`consentNote`).
|
||||
3. “A própria liderança é a dobradinha” — `stateDeputy` hoje é entidade por **nome** (sem `Contact`); `leadership` tem `Contact` único. Não unificar collections neste item.
|
||||
|
||||
Lista `/campanha/liderancas` já filtra/ordena por `sector` (B29 ✓); coluna Organizações é texto morto. Invite autofill ainda pede `sector`/`sectorNotes`.
|
||||
|
||||
## Objetivos
|
||||
|
||||
- Migration `pnpm migrate:create simplify_leadership_fields` (nome sugerido):
|
||||
- **DROP** `organizations` (tabela de join), `sector`, `sector_notes`, `consent_note`.
|
||||
- **ADD** `exclusive` boolean **NOT NULL DEFAULT true** (backfill implícito = todos nascem exclusivos — honesto com o default de produto).
|
||||
- Collection + zod (`src/lib/schemas/leadership.ts`): espelhar; `exclusive` staff-managed como `supportStatus`/`notes`.
|
||||
- Remover de create/internal forms, list columns/filters/sort de setor, badges de org no `MunicipalityLeadershipsPanel`, `organizationNames` / `organizationIDs` do view model.
|
||||
- Invite: dropar `sector`/`sectorNotes` do schema + `CampaignInviteForm` + redemption profile write (não tocar `consent*` do LGPD do convite).
|
||||
- Access: `getOwnEngagedLeadership` deixa de selecionar/expor `organizationIDs` (`municipalities.ts`); qualquer leitor de org via liderança engajada ajusta ou morre.
|
||||
- `organizationData` counts “lideranças da org” → **zero path** ou remover a métrica se só existia via esse join (verificar call sites; não inventar proxy).
|
||||
- Labels: `exclusive` → “Apoio exclusivo”; false → leitura “Não exclusivo” / badge discreto na lista (opcional neste item; B70 mostra no tile/form).
|
||||
- Sem Consent novo. Sem UI de grid do wizard (**B70**).
|
||||
- Unit/int: create default `exclusive: true`; update para `false`; filtros de setor removidos; invite sem setor.
|
||||
|
||||
## Decisões travadas
|
||||
|
||||
- **Campo `exclusive: boolean`, default `true`, no documento `leadership`.** **Rejeitado:** `principal`/`prioritaria` (sugerem ranking 1º/2º, não o relato “dividiu apoio”); exclusividade por par liderança×município nesta fatia (caro — join/metadata; o relato do CG é sobre a parceria com a campanha, não nuance A vs B). Gatilho abaixo se a mesma pessoa precisar ser exclusiva em um município e não em outro.
|
||||
- **Dropar `organizations`, `sector`, `sectorNotes`, `consentNote`.** **Rejeitado:** deixar opcionais “por se acaso” (pedido: simplificar; campos mortos travam atualização); dropar o trio `consent*` do **convite** (é LGPD `lideranca-autopreenchimento`, Onda 0 — distinto do `consentNote` externo).
|
||||
- **“Liderança é a dobradinha” = reusar `stateDeputy` + `leadership.stateDeputies`.** Criar/vincular a ficha de dobradinha com o nome da pessoa; chips B31 ✓ já expressam a rede. **Rejeitado:** collection unificada; `Contact` obrigatório em `stateDeputy` agora; flag `actsAsStateDeputy` sem entity (segunda verdade). Atalho “criar dobradinha a partir desta liderança” → Adiado.
|
||||
- **i18n:** identifier `exclusive`; copy “Apoio exclusivo” / “Não exclusivo”.
|
||||
|
||||
## Questões em aberto
|
||||
|
||||
- **Badge “Não exclusivo” na lista `/liderancas` neste item ou só no B70?** **Opções:** A lista + forms | B só forms/wizard. **Recomendação:** A — coluna ou chip discreto na lista (1 célula), senão o campo some da varredura. _(assumido)_
|
||||
- **Exclusividade por município?** **Opções:** A documento (v1) | B join. **Recomendação:** A; revisitação no Adiado. _(assumido — validar com produto se Cairu tiver o mesmo nome em dois municípios com papéis diferentes)_
|
||||
|
||||
## Abordagem proposta
|
||||
|
||||
```mermaid
|
||||
flowchart LR
|
||||
Mig["migration DROP + exclusive"] --> Zod["zod + Leadership.ts"]
|
||||
Zod --> UI["forms + lista + invite"]
|
||||
Zod --> Access["OwnLeadership sem orgs"]
|
||||
Zod --> Orgs["organizationData counts"]
|
||||
```
|
||||
|
||||
Componentes:
|
||||
|
||||
- Migration + `Leadership.ts` + `src/lib/schemas/leadership.ts` (+ invite schema se setor sair).
|
||||
- `LeadershipForm` / `LeadershipInternalForm` — remover org/setor/consentNote; toggle `exclusive` (default on).
|
||||
- `liderancas/page.tsx` + `leadershipListUrl` / filters — dropar `sector`; opcional coluna/filtro `exclusive`.
|
||||
- `leadershipData.ts` — view models sem org/setor; incluir `exclusive`.
|
||||
- `CampaignInviteForm` + redemption — sem setor.
|
||||
- `municipalities.ts` `getOwnEngagedLeadership` — só municípios.
|
||||
- **Migration:** sim (drop + add boolean default true).
|
||||
|
||||
## Dependências
|
||||
|
||||
- Nenhuma de outro plano aberto. Soft: B29 ✓ / B31 ✓ / B32 ✓ (superfícies a limpar). Desbloqueia **B70**.
|
||||
|
||||
## Não escopo
|
||||
|
||||
- Grid de tiles + form do wizard A4 → **B70**.
|
||||
- Wiring “quer também liderança?” no A1 → fatia A1.
|
||||
- Unificar `stateDeputy` com `Contact` / atalho criar-dobradinha → Adiado.
|
||||
- Collection `organization` em si (vertical `/campanha/organizacoes` permanece; só some o vínculo na liderança).
|
||||
|
||||
## Rabbit holes
|
||||
|
||||
- **Exclusividade por município + histórico de mudanças.** **Mitigação:** boolean no doc; nota em `notes` se precisar matizar.
|
||||
- **Reescrever access de leader via organizações.** **Mitigação:** remover o ramo; leader continua lockdown em contatos — confirmar que `organizationIDs` não alimenta rota staff crítica antes de dropar.
|
||||
- **Backfill `exclusive: false` a partir de texto em `notes`.** **Mitigação:** não — default true; mesa corrige no wizard.
|
||||
|
||||
## Adiado com gatilho
|
||||
|
||||
- **Exclusividade por município.** Revisitar quando a mesma liderança tiver papéis opostos em ≥2 municípios no mesmo ritual.
|
||||
- **Atalho “Criar / vincular dobradinha” a partir da ficha/wizard.** Revisitar quando B70 shippar e a mesa pedir o gesto ≥2× na mesma semana.
|
||||
- **`stateDeputy.contact` opcional.** Revisitar se dedupe nome↔pessoa virar dor (E4R / onboarding).
|
||||
|
||||
## Referências
|
||||
|
||||
- [fluxos-acao-primeiro-inicio.md](fluxos-acao-primeiro-inicio.md) (A4) · [simplificar-modelo-sinal.md](simplificar-modelo-sinal.md) (precedente B62) · [autosave-status-lista-liderancas.md](autosave-status-lista-liderancas.md) · [ordenacao-filtros-lista-liderancas.md](ordenacao-filtros-lista-liderancas.md)
|
||||
- `src/collections/Leadership.ts` · `src/lib/schemas/leadership.ts` · `src/utilities/leadership/*` · `src/utilities/access/municipalities.ts` · `CampaignInviteForm.tsx`
|
||||
- AGENTS.md — migrations; Contact único; Consent por chave (convite intacto)
|
||||
- `PRODUCT.md` / `DESIGN.md`
|
||||
132
docs/plans/wizard-atualizar-lideranca.md
Normal file
132
docs/plans/wizard-atualizar-lideranca.md
Normal file
|
|
@ -0,0 +1,132 @@
|
|||
# Wizard atualizar liderança — grid + formulário curto
|
||||
|
||||
Status: rascunho
|
||||
Atualizado em: 2026-07-29
|
||||
Item do roadmap: [docs/roadmap.md](../roadmap.md) (Trilha B, item B70 — UX-1 wizards / A4)
|
||||
Impeccable: C — UI nova (grid de lideranças + formulário de edição/criação no chassis B59)
|
||||
Appetite: ~1,25–1,5 dia eng; 2 “modos” no B59 (grid → form); writes via actions `leadership` existentes; focus + skip + Continuar
|
||||
Responsável: —
|
||||
|
||||
## Design (Impeccable)
|
||||
|
||||
Âncoras: `PRODUCT.md` / `DESIGN.md` · `Drawer`/`Tooltip` shadcn · tema `campaign` · sibling visual **B63**/**B64** (tiles) · focus policy do Field Desk.
|
||||
|
||||
Na implementação: shape → craft → critique → polish.
|
||||
|
||||
Brief compacto:
|
||||
|
||||
- **Persona:** CG/assessor no polegar (pacote Cairu); veio de “Atualizar liderança” ou do “Quer ajustar liderança?” do A1; Zap pode interromper.
|
||||
- **Job principal:** ver a rede do município num grid, abrir a ficha curta de quem mudou (ou criar), gravar, e **continuar** o fluxo pai — ou pular se a liderança não era o motivo.
|
||||
- **Estratégia de cor:** Restrained — tiles como B63 (fundo transparente / borda); status de apoio no canto (badge outline / cor já usada em `SupportStatusBadge`); “Não exclusivo” como exceção visual discreta (não competir com status).
|
||||
- **Edit where you see:** não no grid (toque = abrir form); no form, **Salvar** explícito (exceção nota/confirmação). Sem spreadsheet mode.
|
||||
- **Anti-goals:** formulário longo (org/setor/consentNote — mortos no **B69**); abrir `/liderancas/[id]/editar` no meio do ritual; auto-save silencioso no form do wizard; esconder “Adicionar” atrás de menu.
|
||||
|
||||
## Dados → decisão → apresentação
|
||||
|
||||
Dados: N/A como métrica — catálogo de pessoas do município + campos de ficha. Decisão = quem atualizar / criar / pular; exclusividade e status são leitura+escrita no form (**B69**).
|
||||
|
||||
## Contexto
|
||||
|
||||
Ação **A4** ([fluxos-acao-primeiro-inicio.md](fluxos-acao-primeiro-inicio.md)) e passo 7 opcional de A1. Catálogo B45 ✓ já tem `update-leadership`. Chassis **B59**; município via **B60** (standalone) ou pré-escolhido (embutido). Modelo limpo + `exclusive` em **B69**.
|
||||
|
||||
Pedido (2026-07-29) — substitui o rascunho A4 “ramos de intenção” por:
|
||||
|
||||
**Tela 1 — grid de lideranças do município**
|
||||
|
||||
- Grid: **2 col mobile / 3 tablet / 4 desktop**.
|
||||
- Cada liderança = botão **quadrado grande**, cantos arredondados:
|
||||
- **Status** (supportStatus) no canto **superior esquerdo**.
|
||||
- Ícone/botão **informação** no canto **superior direito** → conteúdo de `notes` (observação); no **hover** do tile inteiro (e nos do mesmo tipo), o mesmo conteúdo do info (Tooltip fine / long-press ou title pattern já usado na strip — não só no ícone).
|
||||
- **Título** = nome (cortar na última palavra que couber inteira — ellipsis por palavra, não mid-word).
|
||||
- Abaixo, discreto: **telefone** (prioridade) ou e-mail se sem telefone.
|
||||
- Um tile = **Adicionar nova** → form vazio.
|
||||
- Clique no tile de pessoa → form de edição (fluxo raro vs. só olhar; ainda assim é o caminho de escrita).
|
||||
- Topo direito: **“Pular atualização de liderança →”** quando a origem ≠ `update-leadership` (mesma regra de B63).
|
||||
- Após Salvar no form com mudança: volta ao grid e aparece **“Continuar”** no canto **inferior direito** (avança o fluxo pai / commit do bloco). Sem dirty → sem Continuar (ou Continuar desabilitado — preferir **oculto** até dirty).
|
||||
|
||||
**Tela 2 — formulário único (editar / criar)**
|
||||
|
||||
- Campos: **Nome**, **Celular**, **E-mail**, **Status de apoio**, **Observação** (`notes`), **Apoio exclusivo** (`exclusive` — B69).
|
||||
- Salvar → volta ao grid; create vincula ao município corrente (piso ≥1 município).
|
||||
- Focus: ao abrir o form (e ao montar qualquer view nova do wizard com input), **focar automaticamente o input principal** (Nome no create; primeiro campo editável no edit — tipicamente Nome ou Status se nome read-only por access). Mesma regra ao abrir Drawer/modal de info se houver campo — senão foco no título do drawer (precedente B42).
|
||||
|
||||
Município sticky (**B59**) após escolha.
|
||||
|
||||
## Objetivos
|
||||
|
||||
- Passos no shell B59: `WizardLeadershipGridStep` + `WizardLeadershipFormStep` (ou um client island com modo `grid | form`).
|
||||
- Loader: lideranças do município no escopo do ator (`loadMunicipalityLeaderships` / select enxuto: id, contact name/phone/email, supportStatus, notes, exclusive).
|
||||
- Info/hover: `notes` truncado com scroll no Drawer se longo; empty = “Sem observação.”
|
||||
- Truncamento de nome: helper puro em `lib/` (word-boundary ellipsis) + unit.
|
||||
- Skip: trailing slot B59; **hidden** se `entryAction === 'update-leadership'`.
|
||||
- Salvar edit: `updateLeadershipInternal` / action existente (contact name/phone/email + supportStatus + notes + exclusive); create: `createLeadership` mínimo + município atual.
|
||||
- Dirty → `Continuar` no grid; Continuar **não** grava de novo — só avança (writes já no Salvar do form).
|
||||
- Pending nos botões Salvar/Continuar (Feel the action).
|
||||
- Sem migration (B69 já migrou). Sem Consent novo.
|
||||
- Unit: truncamento; skip oculto no entry; dirty gate do Continuar. E2e smoke: grid → form → save → Continuar; add new foca Nome.
|
||||
|
||||
## Decisões travadas
|
||||
|
||||
- **Grid-first (não árvore de intenções do rascunho A4).** **Rejeitado:** passo “O que você quer fazer?” (trocar quem coordena / status / votos / incluir) — atrito extra; o tile + form curto cobrem status/obs/exclusivo/create; votos declarados ficam fora deste wizard (pledge = outro passo / lista).
|
||||
- **Skip só se origem ≠ `update-leadership`.** **Rejeitado:** sempre (permitiria ação Início sem atualizar); nunca (quebra “quer também?” do A1).
|
||||
- **Continuar só após dirty save.** **Rejeitado:** Continuar sempre (avança sem registro); auto-avançar no Salvar sem voltar ao grid (impede atualizar 2ª liderança no mesmo município — pacote Cairu).
|
||||
- **Form curto = 6 campos (incl. exclusive).** **Rejeitado:** form completo da ficha interna; pledge/estimativa neste passo.
|
||||
- **Focus automático no input principal ao entrar na view.** **Rejeitado:** só no create; depender de focus nativo do browser sem `autoFocus`/`requestFocus` no mount.
|
||||
- **i18n:** `entryAction`, `exclusive`; copy “Pular atualização de liderança →” / “Continuar” / “Adicionar liderança”.
|
||||
|
||||
## Questões em aberto
|
||||
|
||||
- **Após Continuar no standalone A4: Início ou resumo?** **Opções:** A Início + toast | B tela resumo A1-like. **Recomendação:** A no v1; B quando o wiring A1 unificar commit. _(assumido)_
|
||||
- **Nome do contact é editável no wizard para staff?** **Opções:** A sim (pedido) | B só admin Payload. **Recomendação:** A via action staff que já atualiza Contact nos forms internos — reusar o mesmo caminho; se access bloquear, falhar fechado com mensagem. _(assumido)_
|
||||
|
||||
## Abordagem proposta
|
||||
|
||||
```mermaid
|
||||
flowchart TB
|
||||
Entry["origem: update-leadership | embutido A1"] --> Grid["grid lideranças + Adicionar"]
|
||||
Grid -->|info/hover| Notes["notes"]
|
||||
Grid -->|tile pessoa| Form["form curto"]
|
||||
Grid -->|Adicionar| FormEmpty["form vazio"]
|
||||
Form & FormEmpty -->|Salvar| Action["create/update leadership"]
|
||||
Action --> GridDirty["grid + Continuar"]
|
||||
Grid & Form -->|skip se permitido| Skip["próximo / Início"]
|
||||
GridDirty -->|Continuar| Next["fluxo pai / Início"]
|
||||
```
|
||||
|
||||
Componentes:
|
||||
|
||||
- **`WizardLeadershipGridStep` / `WizardLeadershipFormStep`** em `components/campaign/leadership/` (ou `shared/` se o tile virar 3º call site com B63 — **não** extrair tile genérico no 2º; depth check: copiar padrão B63 até o 3º).
|
||||
- **`truncateNameAtWordBoundary`** em `src/lib/` + unit.
|
||||
- Reuso: B59 trailing skip + sticky município; `SupportStatusBadge` / labels; actions em `campanha/actions/leadership.ts`; Drawer info.
|
||||
- Focus helper: `useFocusOnMount(ref)` se já existir no campaign shell; senão um hook mínimo no passo (não lib global prematura).
|
||||
- **Migration:** Sem migration (depende de B69).
|
||||
|
||||
## Dependências
|
||||
|
||||
- Dura: **B59**, **B69**. Soft: **B60** (município standalone). Soft: B45 ✓ (`update-leadership`). Soft: B32 ✓ (labels/status).
|
||||
|
||||
## Não escopo
|
||||
|
||||
- Schema exclusive + drop org/setor/consentNote → **B69**.
|
||||
- DeclaredVotes / estimativa no wizard → lista de pledges / passo futuro; **estimativa nunca neste fluxo**.
|
||||
- Wiring completo A1 “Registrar atualização” → fatia A1.
|
||||
- Abrir ficha completa `/liderancas/[id]`.
|
||||
|
||||
## Rabbit holes
|
||||
|
||||
- **Tile genérico compartilhado B63/B64/B70.** **Mitigação:** terceiro call site = gatilho; até lá copiar o padrão visual.
|
||||
- **Optimistic multi-edit sem Salvar.** **Mitigação:** Salvar explícito no form; Continuar só navega.
|
||||
- **Busca no grid quando N > ~20.** **Mitigação:** v1 sem busca; Adiado se município com rede grande doer.
|
||||
|
||||
## Adiado com gatilho
|
||||
|
||||
- **Busca/filtro no grid.** Revisitar se municipio típico do CG tiver >12 lideranças no loader.
|
||||
- **Ramo “anotar votos declarados”.** Revisitar quando A1 pedir pledge no mesmo ritual (hoje fora do form curto).
|
||||
- **Extrair `WizardChoiceTile`.** Revisitar no 3º grid irmão (já há B63+B64; este é o 3º — **pode** extrair neste item se o diff medir ≥~80 linhas duplicadas; senão defer explícito no `/simplify`).
|
||||
|
||||
## Referências
|
||||
|
||||
- [simplificar-modelo-lideranca.md](simplificar-modelo-lideranca.md) · [wizard-registro-sinal.md](wizard-registro-sinal.md) · [wizard-mudar-tendencia.md](wizard-mudar-tendencia.md) · [chassis-wizard-campanha.md](chassis-wizard-campanha.md) · [fluxos-acao-primeiro-inicio.md](fluxos-acao-primeiro-inicio.md) · [catalogo-acoes-inicio-por-persona.md](catalogo-acoes-inicio-por-persona.md)
|
||||
- `campaignHomeActions.ts` (`update-leadership`) · `actions/leadership.ts` · `leadershipData.ts` · `LeadershipForm.tsx`
|
||||
- AGENTS.md — `overrideAccess: false`; Contact; Feel the action
|
||||
- `PRODUCT.md` / `DESIGN.md` · focus / B42 `initialFocus`
|
||||
File diff suppressed because one or more lines are too long
Loading…
Reference in a new issue