3 KiB
Escala e DRY pós-B197 (picker de colunas de assessores)
Status: concluído (Issue #642, impl aprovado e executado 2026-08-11) Atualizado em: 2026-08-11 Item do roadmap: fill-in B197+ pós-#627 Impeccable: A — sem superfície UI nova (DRY/estrutura) Appetite: ~0,5 dia eng Responsável: —
Contexto
O B197 entregou o seletor de colunas na lista de assessores — a primeira lista do
mecanismo B17 que não usa CampaignTable. A tabela (AdvisorsTable.tsx) é
client-side com <th> escritos à mão, então o menu do picker
(advisorPickerColumns em assessores/page.tsx) é um array estático que
espelha os cabeçalhos da tabela: Nome/E-mail/Celular/Municípios/Ações.
O espelho é coberto por comentário, mas nada impede um item futuro de adicionar
uma coluna na tabela e esquecer o menu — a coluna nasceria fora do picker (nem
ocultável, nem listada), silenciosamente.
Já resolvido no simplify/critique (não reabrir): nada — o achado foi registrado direto do gate pós-entrega (nenhum outro follow-up do B197 ficou).
Explicitamente fora: conversão do AdvisorsTable para CampaignTable
(rejeitada no impl do B197 — redesenho de superfície fora do pedido; o shell
não modela a linha-draft de criação nem a edição inline por célula).
Objetivos
- O menu do picker de assessores nasce da mesma fonte que os
<th>da tabela — adicionar coluna num lugar atualiza o outro de graça. - Sem mudança de comportamento: mesmos ids (
namemandatory,email,phone,municipalities,actions), mesmos labels, exceção do draft intacta.
Decisões travadas
- Opção A — fonte única serializável no módulo da tabela (recomendada).
AdvisorsTable.tsx(client) passa a declarar as colunas como dados (id/label/mandatory) e exporta uma versão serializável (toCampaignColumnPickerColumnsjá existe no lib B17); o<th>renderiza delabel, eassessores/page.tsximporta a mesma fonte para o picker. Cliente-para-servidor vale para constantes serializáveis (mesmo padrão desupporterPickerColumnsemSupporterList.tsx). - Opção B — status quo (comentário). Rejeitada: o comentário já existe e o achado é exatamente que ele é insuficiente para um time de agentes paralelos.
- Gatilho de execução: a qualquer momento como fill-in (~0,5 dia); se C112
(telefones) tocar o
AdvisorsTableantes, executar junto (mesma superfície).
Fases verificáveis
- Extrair a fonte única no
AdvisorsTable+ export serializável;<th>porlabel. assessores/page.tsxconsome a fonte; removeradvisorPickerColumns.- Gates:
tsc,lint, unit do lib, e2ecampaignColumnPicker(assessores),format:check.
Rabbit holes / Não escopo
- Não portar para
CampaignTable(decisão travada do B197). - Não mexer em labels/ordem/ids das colunas — contrato do cookie
campaign_columns. - Não criar coluna nova nenhuma — só o DRY do menu.