mirror of
https://github.com/fsolla/teqo.git
synced 2026-11-13 06:43:06 +00:00
Merge pull request #700 from fsolla/plans/plan-issue-38
docs(plans): C128–C132 — ajustes de Pessoas (capacidades, legenda, tabela, Salvador, criação rápida)
This commit is contained in:
commit
1ed585a084
5 changed files with 347 additions and 0 deletions
69
docs/plans/pessoas-criacao-rapida-na-lista.md
Normal file
69
docs/plans/pessoas-criacao-rapida-na-lista.md
Normal file
|
|
@ -0,0 +1,69 @@
|
|||
# Pessoas: criação rápida de pessoa na lista (linha nova no topo com botão Salvar)
|
||||
|
||||
Status: rascunho
|
||||
Atualizado em: 2026-08-11
|
||||
Issue: #699
|
||||
Priority: P1
|
||||
Model: composer-2.5
|
||||
Impeccable: B — encaixe na tabela/omnibox de `/campanha/pessoas` (botão ao lado do seletor de colunas + linha-draft)
|
||||
Canvas UI: /home/fsolla/.cursor/projects/home-fsolla-Code-teqo/canvases/plan-pessoas-ajustes-ui-draft.canvas.tsx (seção "Criação rápida de pessoa")
|
||||
Appetite: ~0,5–1 dia eng; uma linha-draft + ação de criação
|
||||
Responsável: —
|
||||
|
||||
## Intenção
|
||||
|
||||
Cadastrar uma pessoa nova exige hoje sair da lista (fluxo de criação das listas especializadas). A mesa quer criar direto em `/campanha/pessoas`: um botão "Nova pessoa" ao lado do seletor de colunas abre uma **linha em branco no topo da lista**, onde nome/telefone/capacidades são preenchidos inline e um botão de **Salvar** (na coluna de ações) confirma a criação.
|
||||
|
||||
## Persona e fluxo
|
||||
|
||||
- **Persona / contexto:** coordenador/candidato (e assessor na carteira dele) cadastrando contato novo durante atendimento.
|
||||
- **Job principal:** criar a ficha da pessoa e já amarrar a primeira capacidade (cidade assessorada/liderada/onde dobra) sem trocar de tela.
|
||||
- **Fluxo desejado:** clico em "Nova pessoa" → uma linha vazia aparece no topo da lista (nome e telefone em branco, capacidades vazias) → digito nome e telefone → adiciono a primeira cidade de uma capacidade (com C128, a pessoa nasce naquela tabela) → clico em "Salvar" → a linha vira uma pessoa de verdade na lista. "Descartar" (X) remove a linha sem salvar.
|
||||
- **Anti-goals de produto:** não é modal/formulário novo (a linha é a superfície); não é segundo cadastro paralelo de pessoa (ficha continua `Contact`); não substitui os fluxos ricos das listas especializadas.
|
||||
|
||||
## Objetivo e aceite
|
||||
|
||||
- Botão **"Nova pessoa"** visível ao lado do seletor de colunas (barra de filtros) para quem pode criar (staff; escopo de carteira preservado para assessor).
|
||||
- Clicar abre **uma linha-draft no topo da lista**, destacada, com: Nome e Contato (telefone) editáveis inline, as três colunas de capacidade vazias, e na coluna de ações um botão **Salvar** (+ descartar).
|
||||
- **Salvar** cria a ficha (e, com C128, os vínculos de capacidade já adicionados na linha) e a pessoa aparece na lista; **Descartar** fecha a linha sem escrever nada.
|
||||
- Salvar sem nome (ou só com nome, sem capacidade) não quebra a lista: pessoa sem capacidade continua fora da lista (regra C100) — a linha avisa quando isso acontecer em vez de "sumir" com a pessoa.
|
||||
- A linha-draft respeita os mesmos limites das células normais (escopo de acesso, chips de território, "Salvador" agregado de C131).
|
||||
- Sem regressão nas linhas normais: a linha-draft nunca conta como linha real (ordenação, filtros, paginação, facetas não a incluem).
|
||||
|
||||
## Dados (intenção)
|
||||
|
||||
- **Vou apresentar dados?** Não — cadastro, sem métrica.
|
||||
|
||||
## Direção no codebase (hipótese)
|
||||
|
||||
- **Áreas prováveis:** `src/app/(campaign)/campanha/(app)/pessoas/page.tsx` (botão na barra de filtros, linha-draft no topo da tabela), células de capacidade em modo `draft` (as células de município já têm contrato de draft local), ação de criação de pessoa no estilo das ações de domínio existentes (`src/app/(campaign)/campanha/actions/…`), escrita transacional Contact + capacidades.
|
||||
- **Precedente a olhar:** C128 (criação de entidade pela primeira cidade), criação de liderança/dobradinha/contato nas listas especializadas (findOrCreate de Contact + entidade, transação), células `draft` (`MunicipalityPortfolioCell.draft`), C116 (células sempre-input).
|
||||
- **Risco de acoplamento:** a linha-draft lida com "pessoa que ainda não existe" — toda célula que hoje parte de `ownerId` existente precisa do caminho de criação; a regra C100 (sem capacidade não há linha) determina o que acontece ao salvar.
|
||||
|
||||
## Dependências
|
||||
|
||||
- **C128** (ordem/forte) — sem o ciclo de vida "primeira cidade cria a entidade", a linha-draft não consegue amarrar capacidades no momento da criação.
|
||||
- Suave com C130 (a linha-draft usa as mesmas colunas/larguras da tabela ajustada).
|
||||
|
||||
## Fora de escopo
|
||||
|
||||
- Wizard rico de criação (telefones múltiplos, partido, organizações, convite) — a linha é o cadastro mínimo; o resto segue nas fichas.
|
||||
- Edição de dados da linha-draft além de nome/telefone/capacidades (e-mail fica para depois da criação).
|
||||
- Criação a partir do mobile (cards) no v1 — a pedido é o botão ao lado de Colunas (desktop).
|
||||
|
||||
## Rabbit holes de produto
|
||||
|
||||
- **Linha-draft vira mini-wizard**: se cada capacidade pedir seu próprio fluxo de criação na linha, a superfície explode. **Corte:** a linha só repete o comportamento das células normais (com C128 criando as entidades); sem campos extras além de nome/telefone.
|
||||
- **"Salvar sem capacidade some a pessoa"**: a regra C100 confunde se a linha apenas "desaparece". **Corte:** aviso claro na linha ao salvar sem capacidade ("a pessoa não aparece na lista enquanto não tiver uma capacidade") + manter o cadastro feito (a ficha existe para o admin).
|
||||
- **Duas linhas-draft simultâneas**: só uma linha de criação por vez (abrir outra descarta/fecha a atual sem salvar).
|
||||
|
||||
## Questões em aberto (produto)
|
||||
|
||||
- **Salvar pessoa sem nenhuma capacidade?** **Opções:** (a) salva a ficha e avisa que ela não aparece na lista (regra C100 mantida); (b) bloqueia o Salvar até ter uma capacidade. **Recomendação:** (a) — cadastro não deve ser impedido, mas o destino fica explícito no aviso. _(assumido — validar no gate)_
|
||||
- **Quem pode usar "Nova pessoa"?** **Opções:** (a) todo staff da página (assessor cria na carteira dele); (b) só coordenação/candidato. **Recomendação:** (a) — com escopo de carteira igual às células; coordenação continua vendo tudo. _(assumido — validar no gate)_
|
||||
|
||||
## Referências
|
||||
|
||||
- Canvas UI (gate): plan-pessoas-ajustes-ui-draft.canvas.tsx (seção C132)
|
||||
- Planos: [pessoas-qualquer-capacidade-para-toda-pessoa.md](pessoas-qualquer-capacidade-para-toda-pessoa.md) (C128 — criação pela primeira cidade), [pessoas-lista-unificada.md](pessoas-lista-unificada.md) (C100 — regra de visibilidade por capacidade), [pessoas-edicao-inplace-lista.md](pessoas-edicao-inplace-lista.md) (C116)
|
||||
- `AGENTS.md` — transações multi-coleção, escopo de acesso por capacidade
|
||||
66
docs/plans/pessoas-nome-de-legenda-dobradinha.md
Normal file
66
docs/plans/pessoas-nome-de-legenda-dobradinha.md
Normal file
|
|
@ -0,0 +1,66 @@
|
|||
# Pessoas: nome de legenda da dobradinha (campo + display discreto sob o nome)
|
||||
|
||||
Status: rascunho
|
||||
Atualizado em: 2026-08-11
|
||||
Issue: #696
|
||||
Priority: P2
|
||||
Model: composer-2.5
|
||||
Impeccable: B — encaixe na célula de Nome de `/campanha/pessoas` (e nas superfícies de dobradinha que mostram o nome)
|
||||
Canvas UI: /home/fsolla/.cursor/projects/home-fsolla-Code-teqo/canvases/plan-pessoas-ajustes-ui-draft.canvas.tsx (seção "Depois — tabela desktop ajustada")
|
||||
Appetite: ~0,5–1 dia eng; campo novo + display em 1–2 superfícies
|
||||
Responsável: —
|
||||
|
||||
## Intenção
|
||||
|
||||
A dobradinha tem um **nome real** (ficha) e pode ter um **nome de legenda** (como vai aparecer na urna — ex. apelido/abreviação usado na campanha). Hoje só existe o nome real; a mesa precisa registrar e ver o nome de legenda com destaque discreto, sem confundir com o nome real.
|
||||
|
||||
## Persona e fluxo
|
||||
|
||||
- **Persona / contexto:** coordenador/candidato e assessores olhando a tabela de pessoas no desktop.
|
||||
- **Job principal:** reconhecer a dobradinha de relance pelo nome de legenda, com o nome real ao lado.
|
||||
- **Fluxo desejado:** abro `/campanha/pessoas` → na linha da dobradinha, vejo o nome real e, logo abaixo, discreto, o nome de legenda (quando houver). Posso editar o nome de legenda onde ele aparece.
|
||||
- **Anti-goals de produto:** o nome de legenda não substitui o nome real; não vira segunda linha com peso visual de nome; não é campo livre genérico fora da dobradinha.
|
||||
|
||||
## Objetivo e aceite
|
||||
|
||||
- A dobradinha ganha um campo **nome de legenda** (opcional), separado do nome real da ficha.
|
||||
- Na tabela de `/campanha/pessoas`, a linha da pessoa com dobradinha mostra o nome real e, embaixo, **discreto** (mesma família tipográfica, menor/atenuado), o nome de legenda — quando preenchido.
|
||||
- O nome de legenda é **editável nas superfícies onde já se edita dado de dobradinha** (ex.: lista de Dobradinhas, onde hoje se edita nome/partido/telefone) — **não** inline na célula de Nome de `/campanha/pessoas` (decisão do gate 2026-08-11: dois inputs na mesma célula não funciona bem; display-only lá).
|
||||
- Sem nome de legenda, nada muda na linha (sem linha vazia, sem traço).
|
||||
- O nome real continua sendo o nome da pessoa em toda parte (busca, ordenação, link da ficha).
|
||||
|
||||
## Dados (intenção)
|
||||
|
||||
- **Vou apresentar dados?** Não — é texto de identidade, não métrica.
|
||||
|
||||
## Direção no codebase (hipótese)
|
||||
|
||||
- **Áreas prováveis:** `src/collections/StateDeputy.ts` (campo novo na entidade dobradinha), `src/utilities/people/peopleData.ts` (levar o valor ao modelo de linha), `src/app/(campaign)/campanha/(app)/pessoas/page.tsx` (célula de Nome com segunda linha), e a superfície de edição inline correspondente.
|
||||
- **Precedente a olhar:** C116 (célula de Nome com link + input invisível, campo `party` como sufixo do nome), C118 (seção de dobradinha na ficha da pessoa), lista de Dobradinhas (`/campanha/dobradinhas`, mostra nome + partido).
|
||||
- **Risco de acoplamento:** a regra "segunda linha = nome de legenda OU base" é compartilhada com C130 — o executor deve manter a precedência combinada (legenda sobrepõe base).
|
||||
|
||||
## Dependências
|
||||
|
||||
- Suave com **C130** (a segunda linha do Nome abriga legenda e base na mesma posição; as duas entregas podem ser construídas em qualquer ordem, mas a regra final da segunda linha deve ser uma só).
|
||||
|
||||
## Fora de escopo
|
||||
|
||||
- Nome de legenda para liderança/staff (a pedido atual é só dobradinha).
|
||||
- Uso do nome de legenda em buscas/ordenação/facets (o nome real continua sendo a chave).
|
||||
|
||||
## Rabbit holes de produto
|
||||
|
||||
- **"E na lista de Dobradinhas?"**: o nome de legenda naturalmente também ajuda lá, mas a pedido atual é a tabela de pessoas. **Corte:** exibir também onde o nome da dobradinha aparece (lista/ficha de dobradinhas) se for barato; não redesenhar essas superfícies.
|
||||
|
||||
## Questões em aberto (produto)
|
||||
|
||||
_Decididas no gate 2026-08-11 (não reabrir sem evidência nova):_
|
||||
|
||||
- **Onde mais o nome de legenda aparece?** **Decidido:** tabela de pessoas (2ª linha do Nome) + lista/ficha de Dobradinhas (mesmo padrão "discreto sob o nome").
|
||||
- **Onde o nome de legenda é editado?** **Decidido:** onde hoje se edita dado de dobradinha (lista de Dobradinhas — precedente B163), display-only na tabela de pessoas.
|
||||
|
||||
## Referências
|
||||
|
||||
- Canvas UI (gate): plan-pessoas-ajustes-ui-draft.canvas.tsx (seção C130 — mesma célula de Nome)
|
||||
- Planos: [pessoas-edicao-inplace-lista.md](pessoas-edicao-inplace-lista.md) (C116), [pessoas-lista-unificada.md](pessoas-lista-unificada.md) (C100 — coluna Nome com partido), [pessoas-detalhe-por-capacidades.md](pessoas-detalhe-por-capacidades.md) (C118)
|
||||
- `AGENTS.md` — naming: identificadores em inglês, labels pt-BR
|
||||
73
docs/plans/pessoas-qualquer-capacidade-para-toda-pessoa.md
Normal file
73
docs/plans/pessoas-qualquer-capacidade-para-toda-pessoa.md
Normal file
|
|
@ -0,0 +1,73 @@
|
|||
# Pessoas: qualquer pessoa pode assessorar, liderar e/ou dobrar — ciclo de vida nas tabelas pela lista
|
||||
|
||||
Status: rascunho
|
||||
Atualizado em: 2026-08-11
|
||||
Issue: #695
|
||||
Priority: P1
|
||||
Model: cursor-grok-4.5-medium
|
||||
Impeccable: B — encaixe nas células de capacidade de `/campanha/pessoas` (mesma superfície da C116)
|
||||
Canvas UI: /home/fsolla/.cursor/projects/home-fsolla-Code-teqo/canvases/plan-pessoas-ajustes-ui-draft.canvas.tsx (seção "Qualquer pessoa pode ganhar qualquer capacidade")
|
||||
Appetite: ~2–3 dias eng; ciclo de vida completo das três capacidades num único recorte
|
||||
Responsável: —
|
||||
|
||||
## Intenção
|
||||
|
||||
Hoje, na lista de pessoas, só dá para **adicionar municípios** de uma capacidade se a pessoa **já existe** naquela tabela: a célula "Assessora" só edita quem já tem conta staff; "Lidera" só quem já é liderança; "Dobra em" só quem já é dobradinha. A mesa precisa tratar a **pessoa** como o dado central — qualquer pessoa pode ganhar qualquer capacidade, e o vínculo com a tabela nasce/morre com a primeira/última cidade.
|
||||
|
||||
## Persona e fluxo
|
||||
|
||||
- **Persona / contexto:** coordenador/candidato na mesa (a criação de conta staff é restrita a eles); assessor continua vendo/validando a carteira dele.
|
||||
- **Job principal:** dar o primeiro município de uma capacidade a uma pessoa (ou tirar o último) sem sair de `/campanha/pessoas` — o cadastro na tabela correspondente acontece sozinho.
|
||||
- **Fluxo desejado:** abro `/campanha/pessoas` → vejo a pessoa → adiciono a primeira cidade em "Dobra em" → a pessoa passa a existir na tabela de Dobradinhas (e o chip da coluna aparece). Removo a última cidade de "Lidera" → a pessoa sai da tabela de Lideranças (com confirmação se houver votos declarados).
|
||||
- **Anti-goals de produto:** não é um cadastro genérico de pessoa novo (a ficha continua `Contact`); não cria fluxo de criação "de pessoa do zero" na lista (sem capacidade a pessoa não tem linha); não é segundo caminho para convidar/invitar — o convite de cadastro continua o fluxo existente.
|
||||
|
||||
## Objetivo e aceite
|
||||
|
||||
- As três colunas de capacidade (Assessora, Lidera, Dobra em) ficam **editáveis para toda pessoa visível**, independente de a capacidade já existir — o texto de "sem permissão"/read-only desaparece dessas células (o escopo de acesso por ator continua valendo).
|
||||
- **Primeira cidade adicionada → a pessoa é criada na tabela da capacidade:** primeira cidade em Assessora → vira Assessor (conta staff com a carteira); primeira em Lidera → entra em Lideranças; primeira em Dobra em → entra em Dobradinhas.
|
||||
- **Última cidade removida → a pessoa é apagada daquela tabela:** sai de Assessores (conta staff), sai de Lideranças, sai de Dobradinhas — sem violar regras de "mínimo de 1 município".
|
||||
- A saída destrutiva (votos declarados da liderança, conta de acesso) pede **confirmação explícita** que lista o que será removido — precedente da cascata de "Apagar pessoa".
|
||||
- Uma pessoa pode ter as três capacidades ao mesmo tempo; as colunas continuam independentes (criar/remover uma não toca as outras).
|
||||
- A mesma regra de acesso de hoje permanece: criação/remoção de Assessor (conta staff) é coordenação/candidato; assessor edita só o que está na carteira dele.
|
||||
- As listas especializadas (`/liderancas`, `/dobradinhas`, `/assessores`) continuam funcionando como hoje (o piso de 1 município da liderança passa a ser garantido pelo ciclo de vida, não pela célula).
|
||||
|
||||
## Dados (intenção)
|
||||
|
||||
- **Vou apresentar dados?** Não — as colunas expressam vínculos (território), não métricas.
|
||||
|
||||
## Direção no codebase (hipótese)
|
||||
|
||||
- **Áreas prováveis:** `src/app/(campaign)/campanha/(app)/pessoas/page.tsx` (matriz de editabilidade C116 e células `PeopleMunicipalityCell`), `src/app/(campaign)/campanha/actions/person.ts` (escritas por capacidade), `src/utilities/people/peopleData.ts` (merge por Contact), utilitários de domínio (leadership/stateDeputy/advisor), cascata de apagar pessoa (`personDelete.ts`) como mapa de referência das relações.
|
||||
- **Precedente a olhar:** C116 (matriz de edição), C100 (merge por Contact, decisões de capacidade), C99 (vínculo conta staff → Contact), cascata de apagar conta (`campaignUser` beforeDelete).
|
||||
- **Risco de acoplamento:** a criação de conta staff é auth (sessões, acesso ao `/campanha`) — o executor precisa preservar todos os guardrails existentes (acesso por coleção, lockdown de leader); a remoção de última cidade de Liderança destrói votos declarados — nada pode ser apagado sem confirmação explícita.
|
||||
|
||||
## Dependências
|
||||
|
||||
- Nenhuma dura. Encaixa na mesma superfície de C129/C130/C131 (sem dependência de ordem).
|
||||
|
||||
## Fora de escopo
|
||||
|
||||
- Incluir pessoas sem nenhuma capacidade na lista (decisão C100 "não no v1" permanece) — continua-se entrando por uma capacidade existente ou pelas listas especializadas.
|
||||
- Fluxo de convite/invite generalizado; ferramenta de "mesclar pessoas"; alterações nas listas especializadas além do mínimo para não quebrar com o ciclo de vida.
|
||||
- Pessoas com mais de uma conta staff seguem sem edição da célula Assessora (ambiguidade de "qual conta") — igual hoje.
|
||||
|
||||
## Rabbit holes de produto
|
||||
|
||||
- **Cascata de apagar dobradinha**: a dobradinha é referenciada por lideranças (`leadership.stateDeputies`) e municípios; remover a última cidade precisa limpar os vínculos sem destruir nada além da dobradinha. **Corte:** limpeza automática dos vínculos na mesma transação, sem confirmação extra (não há dado de campanha próprio da dobradinha além dela).
|
||||
- **Contas staff existentes com carteira vazia**: decisão C100 diz que staff com carteira vazia ainda é capacidade. **Corte:** o ciclo de vida só vale para mudanças feitas pelas células; contas vazias pré-existentes continuam como estão (removíveis pelo fluxo "Apagar pessoa").
|
||||
- **"Primeira cidade" em lote**: o chip de território/ZE adiciona várias cidades de uma vez — a criação da entidade dispara na primeira do lote, e a remoção na última. **Corte:** o lote inteiro é uma transação única; se a entidade for criada e depois o lote falhar, nada fica pela metade.
|
||||
- **Pergunta de onde nasce a pessoa**: se a lista só mostra quem já tem capacidade, "adicionar a primeira capacidade" só vale para quem entrou por outra capacidade — o executor não deve inventar busca de Contatos sem capacidade. **Corte:** v1 sem.
|
||||
|
||||
## Questões em aberto (produto)
|
||||
|
||||
_Decididas no gate 2026-08-11 (não reabrir sem evidência nova):_
|
||||
|
||||
- **Conta staff ao nascer Assessor: já nasce com login?** **Decidido:** conta criada sem e-mail/username utilizáveis — aparece em Assessores, login é provisionado depois (fluxo à parte).
|
||||
- **Remover a última cidade de Liderança com votos declarados?** **Decidido:** permitir com diálogo de confirmação listando os votos que serão removidos — o gesto "remover a última cidade" é intenção explícita de encerrar a liderança (precedente da cascata de apagar).
|
||||
- **Criação de Assessor exige papel fixo?** **Decidido:** sempre `advisor` — a célula diz "Assessora"; papel diferente é provisionamento à parte.
|
||||
|
||||
## Referências
|
||||
|
||||
- Canvas UI (gate): plan-pessoas-ajustes-ui-draft.canvas.tsx (seção C128)
|
||||
- Planos: [pessoas-lista-unificada.md](pessoas-lista-unificada.md) (C100), [pessoas-edicao-inplace-lista.md](pessoas-edicao-inplace-lista.md) (C116), [pessoas-identidade-contact.md](pessoas-identidade-contact.md) (C99)
|
||||
- `AGENTS.md` — modelo Municípios, roles, leader lockdown, transações multi-coleção
|
||||
66
docs/plans/pessoas-salvador-completa-dropdown.md
Normal file
66
docs/plans/pessoas-salvador-completa-dropdown.md
Normal file
|
|
@ -0,0 +1,66 @@
|
|||
# Pessoas: "Salvador" como opção no dropdown de municípios (agregado das 19 zonas)
|
||||
|
||||
Status: rascunho
|
||||
Atualizado em: 2026-08-11
|
||||
Issue: #698
|
||||
Priority: P2
|
||||
Model: composer-2.5
|
||||
Impeccable: B — encaixe no dropdown/combobox de adição de municípios das células de capacidade
|
||||
Canvas UI: /home/fsolla/.cursor/projects/home-fsolla-Code-teqo/canvases/plan-pessoas-ajustes-ui-draft.canvas.tsx (seção "Dropdown de municípios")
|
||||
Appetite: ~0,25–0,5 dia eng; uma opção agregada no mecanismo de busca existente
|
||||
Responsável: —
|
||||
|
||||
## Intenção
|
||||
|
||||
Adicionar cidades a uma pessoa (Assessora/Lidera/Dobra em) exige hoje adicionar as 19 zonas de Salvador uma a uma quando o vínculo é com a capital inteira. A mesa quer uma opção única **"Salvador"** no dropdown, que liga o agregado das 19 zonas de uma vez — o mesmo conceito do chip "Salvador (19)" que já existe na exibição.
|
||||
|
||||
## Persona e fluxo
|
||||
|
||||
- **Persona / contexto:** coordenador/assessor editando municípios de uma pessoa na tabela de `/campanha/pessoas` (e demais superfícies que usam o mesmo dropdown).
|
||||
- **Job principal:** vincular a pessoa a Salvador inteiro num gesto só, sem digitar/eleger 19 zonas.
|
||||
- **Fluxo desejado:** abro o dropdown de adição de municípios → digito "salvador" → vejo "Salvador — Todas as zonas" como opção → seleciono → as 19 zonas entram de uma vez (chip "Salvador (19)"). Remover funciona igual ao chip agregado de hoje (remove as 19).
|
||||
- **Anti-goals de produto:** não é uma cidade virtual nova (não entra no catálogo, não vira linha na lista de municípios, não pode ser filtrada como município único); não muda o modelo — é atalho de seleção.
|
||||
|
||||
## Objetivo e aceite
|
||||
|
||||
- O dropdown de adição de municípios oferece **"Salvador"** (descrição **"Todas as zonas"**) como opção buscável por "salvador", junto das opções individuais (Salvador — ZE 1…).
|
||||
- Selecionar o agregado adiciona as 19 zonas de uma vez na capacidade em edição; a exibição colapsa no chip "Salvador (19)" como hoje.
|
||||
- A opção soma com o que já está selecionado: se 5 zonas já estão ligadas, o agregado liga as outras 14 (e o chip aparece quando as 19 estiverem completas).
|
||||
- Funciona nas três células de capacidade da tabela de pessoas; demais superfícies que usam o mesmo dropdown herdam o atalho sem trabalho extra (sem mudança de comportamento nelas).
|
||||
- Respeita o escopo de acesso: para assessor, a opção só aparece/age dentro da carteira (nunca adiciona zona fora do que ele administra).
|
||||
|
||||
## Dados (intenção)
|
||||
|
||||
- **Vou apresentar dados?** Não — seleção de território, sem métrica.
|
||||
|
||||
## Direção no codebase (hipótese)
|
||||
|
||||
- **Áreas prováveis:** `src/lib/municipalityPortfolio.ts` (busca `searchMunicipalityPortfolio` — hoje não há hit agregado de cidade-zona, só município/território/ZE), `src/components/campaign/shared/MunicipalityPortfolioCell.tsx` e `RelationChipCell` (consumidor do hit).
|
||||
- **Precedente a olhar:** B178 (Salvador agregado: chip "Salvador (19)" e colapso `kind: 'city'` em `buildMunicipalityPortfolioChips`), B159 (chips de relação).
|
||||
- **Risco de acoplamento:** a busca de municípios é compartilhada por várias listas (lideranças, dobradinhas, municípios, atividades…) — qualquer opção nova no dropdown vale para todas; o executor deve preservar o contrato de "um toque = um lote de municípios na mesma transação".
|
||||
|
||||
## Dependências
|
||||
|
||||
- Nenhuma. Encosta na mesma superfície de C128/C130 sem depender deles.
|
||||
|
||||
## Fora de escopo
|
||||
|
||||
- Salvador como entidade única em filtros/ordenação (facet de município continua pelas 19 zonas).
|
||||
- Agregado "Camaçari" (já é um município único no catálogo) ou outros agregados de cidade-zona.
|
||||
|
||||
## Rabbit holes de produto
|
||||
|
||||
- **Mais cidades-zona no futuro**: o catálogo só tem Salvador com 19 zonas. **Corte:** a opção agregada é derivada do catálogo (lista `ZONE_MUNICIPALITY_CITIES`) — se um dia outra cidade-zona existir, o mecanismo cobre sem trabalho novo.
|
||||
|
||||
## Questões em aberto (produto)
|
||||
|
||||
_Decididas no gate 2026-08-11 (não reabrir sem evidência nova):_
|
||||
|
||||
- **Label da opção:** **Decidido:** "Salvador" como linha principal e "Todas as zonas" como segunda linha (descrição do hit) — mesma estrutura dos demais hits ("Município", "Território · N municípios").
|
||||
- **Opção aparece só na busca ou sempre visível?** **Decidido:** só quando a busca casa (padrão atual — sem lista de sugestões com query vazia).
|
||||
|
||||
## Referências
|
||||
|
||||
- Canvas UI (gate): plan-pessoas-ajustes-ui-draft.canvas.tsx
|
||||
- Planos: [pessoas-lista-unificada.md](pessoas-lista-unificada.md) (C100 — células de município), B178 (`docs/plans/` — Salvador agregado), [generalizar-colunas-relacao-municipios.md](generalizar-colunas-relacao-municipios.md) (máquina compartilhada de relação)
|
||||
- `AGENTS.md` — catálogo de municípios, ZE de Salvador
|
||||
73
docs/plans/pessoas-tabela-desktop-ajustes.md
Normal file
73
docs/plans/pessoas-tabela-desktop-ajustes.md
Normal file
|
|
@ -0,0 +1,73 @@
|
|||
# Pessoas: ajustes da tabela desktop (larguras, base sob o nome, caret, tooltips, "Dobra em")
|
||||
|
||||
Status: rascunho
|
||||
Atualizado em: 2026-08-11
|
||||
Issue: #697
|
||||
Priority: P1
|
||||
Model: composer-2.5
|
||||
Impeccable: B — encaixe na tabela desktop de `/campanha/pessoas`; sem rota nova
|
||||
Canvas UI: /home/fsolla/.cursor/projects/home-fsolla-Code-teqo/canvases/plan-pessoas-ajustes-ui-draft.canvas.tsx (seção "Depois — tabela desktop ajustada")
|
||||
Appetite: ~0,5–1 dia eng; cinco ajustes de leitura/edição na mesma superfície
|
||||
Responsável: —
|
||||
|
||||
## Intenção
|
||||
|
||||
A mesa trabalha a tabela de pessoas no desktop e está perdendo tempo (e errando) por problemas de leitura e edição: o telefone aparece cortado, a coluna Base espremida não serve, o caret some ao digitar o nome, e os botões de ação não explicam o que fazem. São ajustes de superfície — nada de fluxo novo.
|
||||
|
||||
## Persona e fluxo
|
||||
|
||||
- **Persona / contexto:** coordenador/assessor no desktop, varrendo a tabela de pessoas.
|
||||
- **Job principal:** ler telefone e base completos, reconhecer a pessoa pela linha do nome, e entender (por tooltip) o que cada botão de ação faz — inclusive quando está desabilitado.
|
||||
- **Fluxo desejado:** abro `/campanha/pessoas` → leio o telefone inteiro na coluna Contato → identifico a pessoa pela linha do Nome (2ª linha discreta: nome de legenda ou base) → passo o mouse nas ações e vejo o tooltip → edito o nome digitando e vejo o caret piscar.
|
||||
- **Anti-goals de produto:** não é redesign da tabela; não muda o mobile (cards) além do mínimo de consistência de nome; não muda o modelo de dados.
|
||||
|
||||
## Objetivo e aceite
|
||||
|
||||
- **Contato completo:** a coluna Contato mostra o telefone inteiro (sem cortar) — a tabela não pode espremer essa coluna; quando houver muito conteúdo, quem sofre é o restante, não o telefone.
|
||||
- **Coluna Base removida; base vira 2ª linha do Nome:** a cidade do `Contact` aparece discreta sob o nome, **sem label** (só o nome da cidade) — **exceto** quando há nome de legenda (C129), que ocupa a 2ª linha no lugar dela (legenda tem precedência sobre base).
|
||||
- **Nome com largura máxima:** nomes outliers truncam com reticências em vez de esticarem a coluna Nome (a edição continua funcionando; o truncamento é só de exibição).
|
||||
- **Caret visível:** ao editar o nome na célula, o cursor de texto (caret) aparece — hoje ele some quando se começa a digitar.
|
||||
- **"Aliada em" → "Dobra em":** o cabeçalho da coluna passa a dizer "Dobra em" em todos os lugares que nomeiam a coluna (tabela, cards mobile, menu de ordenação, seletor de colunas) — sem mudar a chave de URL/ordenação.
|
||||
- **Colunas de município estreitas quando vazias:** Assessora/Lidera/Dobra em vazias ocupam pouco espaço (não podem ser as colunas mais largas da tabela); a largura acompanha o conteúdo (chips).
|
||||
- **Tooltip em todas as ações:** toda ação da coluna Ações (Convidar, WhatsApp, Apagar) mostra tooltip no hover — inclusive quando o botão está desabilitado (ex.: "WhatsApp indisponível — sem celular"), que hoje não tem tooltip nenhum.
|
||||
- **Filtro e ordenação por Base permanecem** (decisão do gate 2026-08-11): com a coluna removida, o facet de ausência "Sem base" e a ordenação por base continuam disponíveis (facet = filtro rápido de ausência na omnibox, ex. "Sem base" = fichas sem cidade).
|
||||
- **Filtro e ordenação por Partido (novos):** a omnibox ganha filtro por partido (lista dos partidos presentes no recorte, padrão do facet de status) e o menu de ordenação ganha a chave "Partido" (o partido segue exibido como sufixo do nome, sem coluna própria).
|
||||
|
||||
## Dados (intenção)
|
||||
|
||||
- **Vou apresentar dados?** Não — vínculos e texto, sem métrica.
|
||||
|
||||
## Direção no codebase (hipótese)
|
||||
|
||||
- **Áreas prováveis:** `src/app/(campaign)/campanha/(app)/pessoas/page.tsx` (definições de coluna, célula de Nome e Ações, cards mobile), `src/components/campaign/shared/CampaignInlineEditableCell.tsx` (caret do nome — input invisível com caret transparente hoje), `src/components/campaign/shared/CampaignHoverTooltip.tsx` (tooltip em ações desabilitadas), `src/utilities/people/peopleListUrl.ts` (chaves de ordenação — sem renomear `aliada`).
|
||||
- **Precedente a olhar:** C116 (células sempre-input, tooltips nas ações), B17 (seletor de colunas — "Base" sai da definição), C117 (sort/absence — o facet "Sem base" permanece).
|
||||
- **Risco de acoplamento:** a remoção da coluna Base afeta o seletor de colunas, a ordenação e os filtros de ausência — decidir o que fica (facet "Sem base" continua; ordenação por base vira questão aberta); a 2ª linha do Nome é compartilhada com C129.
|
||||
|
||||
## Dependências
|
||||
|
||||
- Suave com **C129** (regra da 2ª linha do Nome: legenda sobrepõe base — se C130 sair antes, a base ocupa a posição e C129 a substitui quando houver legenda).
|
||||
|
||||
## Fora de escopo
|
||||
|
||||
- Redesign dos cards mobile (só o rótulo "Aliada em" muda lá, por consistência de nome).
|
||||
- Mudanças de modelo de dados (não há — colunas de exibição e larguras).
|
||||
- O dropdown de municípios (C131) e o ciclo de vida de capacidades (C128).
|
||||
|
||||
## Rabbit holes de produto
|
||||
|
||||
- **Tabela-fixa vs larguras por coluna**: mexer no layout da tabela pode afetar todas as outras listas que usam o mesmo sistema de tabela. **Corte:** ajuste localizado nas colunas de pessoas; se precisar de mecanismo novo (ex. largura por coluna), generalizar só com 2º consumidor.
|
||||
- **Ordenação por Base**: com a coluna removida, ordenar por um dado invisível confunde. **Corte:** remover a chave de ordenação "Base" do menu (a chave de URL pode morrer junto — dados antigos de URL são rejeitados com redirect).
|
||||
|
||||
## Questões em aberto (produto)
|
||||
|
||||
_Decididas no gate 2026-08-11 (não reabrir sem evidência nova):_
|
||||
|
||||
- **Facet de ausência "Sem base" e ordenação por Base?** **Decidido:** os dois permanecem — o facet responde "quem está sem dado" e a ordenação continua útil mesmo sem coluna.
|
||||
- **Filtro e ordenação por Partido?** **Decidido:** adicionar — filtro na omnibox (facets de partidos presentes) + chave "Partido" na ordenação; partido continua exibido como sufixo do nome.
|
||||
- **Tooltip em ações desabilitadas?** **Decidido:** sim, com copy de indisponibilidade ("WhatsApp indisponível — sem celular").
|
||||
|
||||
## Referências
|
||||
|
||||
- Canvas UI (gate): plan-pessoas-ajustes-ui-draft.canvas.tsx
|
||||
- Planos: [pessoas-edicao-inplace-lista.md](pessoas-edicao-inplace-lista.md) (C116), [pessoas-lista-unificada.md](pessoas-lista-unificada.md) (C100 — definição das colunas), [pessoas-nome-de-legenda-dobradinha.md](pessoas-nome-de-legenda-dobradinha.md) (C129)
|
||||
- `AGENTS.md` — sistema de listas, padrão B18/B17
|
||||
Loading…
Reference in a new issue