Commit graph

2327 commits

Author SHA1 Message Date
Francisco Solla
a4d7b88375
Merge pull request #535 from fsolla/D6-push-no-dispositivo-funcionando-de-ponta-a-ponta-notifica
fix(D6): push no device ponta a ponta — SW dinâmico, subscribe idempotente, check-push-chain
2026-08-10 00:27:47 -03:00
Francisco Solla
cd41b44de4 feat(C105): tags no sheet da agenda + rótulo no evento + prefill no "Mais detalhes"
O filtro por tag na omnibox já existia (C94); o C105 completa a superfície da
agenda: campo de tags no overlay de criação inline (chips, sugestões das tags
já usadas), rótulo leve #tag no evento do calendário (oculto no mês/mobile) e
tags via prefill do "Mais detalhes" (params repetidos, parse fail-closed).

- ActivityTagInput extraído do ActivityForm (compartilhado, aria-label novo)
- "Mais detalhes" espelha estado vivo (horários editados + tags)
- popover do sheet com max-h --radix-popper-available-height (shift-before-flip
  do Radix clipava os campos do topo em viewports baixos)
- submit lê tags do estado espelho (fonte única), 4 KB cap p/ responsáveisJson
- limites mantidos 20/80 (C14), sem migration/access/Consent

Impl: docs/plans/agenda-tags-eventos-impl.md (aprovado no gate humano)
2026-08-10 00:21:20 -03:00
Francisco Solla
2c4d2cfde9
Merge pull request #534 from fsolla/plans/plan-issue-18
docs(B191,B192): planos de intenção — ações rápidas e follow-ups no chat Sollinha
2026-08-10 00:12:05 -03:00
Francisco Solla
944cb6bac1 docs(B191,B192): planos de intenção — ações rápidas de abertura no chat Sollinha (chips no estado vazio) e follow-ups na própria resposta (bloco no prompt, extraído pela UI, slot acima do input) 2026-08-10 00:08:45 -03:00
Francisco Solla
c2ddbf6006 refactor(D6): simplify — find endpoint-only no subscribe, sslmode verify-full, guards no check-push-chain 2026-08-10 00:01:46 -03:00
Francisco Solla
f1c61b6fbd
Merge pull request #530 from fsolla/plans/plan-issue-18
docs: planos de intenção — Sollinha gestão (B185,B186,B189,B190) + links visíveis (B187) + contexto por sessão (B188)
2026-08-09 23:41:02 -03:00
Francisco Solla
f4873b8b3f fix(D6): push no device ponta a ponta — SW dinâmico, subscribe idempotente, check-push-chain
- /campanha/sw.js force-dynamic: buildId VERCEL_DEPLOYMENT_ID em runtime
  (deploys CLI --prebuilt não têm envs de build; prod servia campanha-dev)
- subscribeCampaignPush find-before-create (endpoint UNIQUE — 2º toque
  estourava com erro falso)
- scripts/check-push-chain.mjs + pnpm db:check:push-chain (read-only,
  veredito por elo: SW/envs/consent/inscrições/eventos)
- VAPID envs adicionadas no Vercel production (ops)
- impl plan + CHANGELOG-AGENTS
2026-08-09 23:41:00 -03:00
Francisco Solla
7576a3489e docs(B185,B186,B189,B190): formatação prettier dos planos 2026-08-09 23:37:04 -03:00
Francisco Solla
1e9693410b docs(B185,B186,B187,B188,B189,B190): planos de intenção — Sollinha gestão (lideranças pendentes, prioridades do momento, cobertura de atualização e de dobradinhas) + links com aparência de link + contexto por sessão da janela 2026-08-09 23:34:57 -03:00
Francisco Solla
8ab4c5a326
Merge pull request #523 from fsolla/plans/plan-issue-17
docs(C108,D6): planos de intenção — sino de notificações (ler ao abrir + modal desktop) e push no device em produção
2026-08-09 23:13:16 -03:00
Francisco Solla
7fedf45cd7 docs(C108,D6): planos de intenção — sino de notificações (ler ao abrir + modal desktop) e push no device em produção 2026-08-09 23:10:52 -03:00
Francisco Solla
8896dcb952
Merge pull request #520 from fsolla/plans/plan-issue-16
docs: plano C107 — atualizações mobile sheet de criação usável
2026-08-09 22:56:03 -03:00
Francisco Solla
28c7ef8b2b docs(C107): plano de intenção — atualizações mobile sheet de criação usável (altura auto até o topo, form sem labels com divisórias, placeholders, polaridade em toggle, checks à direita) 2026-08-09 22:52:31 -03:00
Francisco Solla
a7dce2c716
Merge pull request #516 from fsolla/C101-agenda-mobile-calendario-com-cara-de-app-nativo-context
C101 — Agenda mobile: calendário com cara de app nativo (contexto no header, navegação por arrasto, filtro sticky, dia na hora atual)
2026-08-09 22:43:12 -03:00
Francisco Solla
8ee500c3d7
Merge pull request #518 from fsolla/plans/plan-issue-15
docs(plans): C106 — atualizações mobile sem moldura (feed, omnibox sticky, criar no header)
2026-08-09 22:39:00 -03:00
Francisco Solla
505b2f8c85 docs(C106): plano de intenção — atualizações mobile sem moldura (omnibox sticky sem label, criar no header, cards edge-to-edge) 2026-08-09 22:35:30 -03:00
Francisco Solla
32851d90d6
Merge pull request #515 from fsolla/plans/plan-issue-14
docs(B184): plano de intenção — municípios mobile sem moldura
2026-08-09 22:30:22 -03:00
Francisco Solla
c6f13fc6a7 docs(B184): plano de intenção — municípios mobile sem moldura (omnibox sticky, X no input, salvar no header) 2026-08-09 22:28:04 -03:00
Francisco Solla
de205c61e4 style(C101): format 2026-08-09 22:23:18 -03:00
Francisco Solla
1d326a72ab fix(C101): e2e mobile mira o primeiro .activity-agenda (FC mantém grids stale em transições) 2026-08-09 22:22:12 -03:00
Francisco Solla
51fb715ec7 feat(C101): agenda mobile com cara de app nativo — contexto no header, swipe, filtro sticky, dia na hora atual
- toolbar do FullCalendar some no mobile; título do header mostra o período
  ("9 Agosto", "3–9 Agosto", "Agosto", "Agenda") e tap volta ao hoje
- navegação por arrasto horizontal (useAgendaSwipeNavigation): limiar 48px,
  claim 12px com preventDefault, touchcancel sintético contra o long-press
  do FC, dateClick do dia suprimido (C91/C15 intactos)
- filtro vira strip edge-to-edge sem rótulo, sticky sob a barra do app
  (containing block via :has no padding do scroll container)
- visão de dia com scroll interno (height fixa), 08:00 na abertura,
  cabeçalho do dia fixo, scroll preservado ao trocar de dia
- desktop inalterado; impl plan + plano pós-critique (C101-ux)
2026-08-09 22:09:47 -03:00
Francisco Solla
a598319acc
Merge pull request #513 from fsolla/C99-identidade-toda-pessoa-da-campanha-tem-uma-ficha-contact
docs(C99): triage pós-merge — defers com gatilho no impl plan
2026-08-09 22:08:19 -03:00
Francisco Solla
cde4d4107b docs(C99): registra defers com gatilho e explicitamente fora do impl plan (triage pós-merge) 2026-08-09 22:06:38 -03:00
Francisco Solla
457aad5a21
Merge pull request #510 from fsolla/C102-mobile-sem-botao-sheet-de-sidebar-navegacao-pela-barra-
C102 — Mobile: sem botão/sheet de sidebar — navegação pela barra inferior + Mais
2026-08-09 19:56:07 -03:00
Francisco Solla
aa7da74c22
Merge pull request #511 from fsolla/C99-identidade-toda-pessoa-da-campanha-tem-uma-ficha-contact
C99 — Identidade: toda pessoa da campanha tem uma ficha Contact
2026-08-09 19:28:45 -03:00
Francisco Solla
f0dff330bd feat(C102): sem hamburger/sheet de sidebar no mobile staff — navegação pela barra + Mais
No mobile (<768px) staff perde o botão de abrir sidebar na top bar
(CampaignMobileTopBar role-gated via useCampaignPageChromeRole +
isStaffCampaignRole; leader mantém) e o sheet de navegação deixa de
montar (CampaignSidebar early-return quando isMobile && staff).
Filtros salvos de Municípios (B18) migram para o drawer Mais
(MunicipalityNavSavedFilters variant 'overflow', mesma store,
apagar/desfazer/sucessão de foco; drawer ganha overflow-y-auto).

Correção de bug pré-existente (D4): o Toaster vivia dentro do wrapper
[contain:layout_paint] do painel da AI, que vira containing block para
position:fixed e stacking context próprio — toasts com ação (ex.
Desfazer) ficavam inalcançáveis sob os portais z-50 de drawer/sheet.
Movido para o root layout (campaign).

Testes: unit top bar (staff sem trigger / leader com trigger) + e2e
(staff sem trigger/dialog, leader com sheet, B18 no drawer completo).
2026-08-09 19:13:43 -03:00
Francisco Solla
27daa1339e feat(C99): toda conta campaignUser aponta para uma ficha Contact; lideranças ganham assessores responsáveis 2026-08-09 19:12:35 -03:00
Francisco Solla
7af76b9f68
Merge pull request #509 from fsolla/B183-pwa-ios-foco-em-inputs-aplica-auto-zoom-que-nao-volta-f
fix(campanha): impede auto-zoom do iOS em inputs do PWA (B183)
2026-08-09 19:10:58 -03:00
Francisco Solla
12d339cf7f
Merge pull request #508 from fsolla/B182-pwa-ios-tela-ampliada-e-com-as-bordas-cortadas-desde-o-
fix(B182): PWA iOS — heal do zoom preso do visual viewport no standalone
2026-08-09 19:04:49 -03:00
Francisco Solla
e835108324 fix(campanha): impede auto-zoom do iOS em inputs do PWA (B183)
Regra CSS única em styles.css — @media (pointer: coarse) and (hover: none)
+ [data-theme='campaign'] :is(input, select, textarea, [contenteditable]) a
16px (limiar do Safari iOS). Cobre omnibox B127, Command search, native-select
e textareas em qualquer orientação do iPhone; desktop intocado.

E2E campaignIosInputZoom: emulação iPhone 13 pina 16px na omnibox de
/campanha/municipios; control desktop pina 14px.

Closes #501
2026-08-09 18:54:33 -03:00
Francisco Solla
dff940681d fix(B182): PWA iOS — heal do zoom preso do visual viewport no standalone
Motor client-side (standalone-iOS only, no-op em aba/desktop):
heal imediato no install + launch/bfcache/resume/pós-teclado/resize,
scrollTo(0,0) + re-measure nudge, retry ≤3×250ms por episódio,
pinça preservada (janela renovada por gesture*/touch ≥2), debug
global para verificação em aparelho, fallback maximum-scale off.

40 testes unit (jsdom) pinam detecção, guards, retry e teardown.
2026-08-09 18:50:00 -03:00
Francisco Solla
df842ae246
Merge pull request #507 from fsolla/plans/plan-issue-13
plan(C103/C104/C105): agenda mobile — form de criação usável, todo o dia, tags
2026-08-09 18:37:21 -03:00
Francisco Solla
fc8cecb427 plan(C103/C104/C105): agenda mobile — form de criação usável, todo o dia, tags (planos de intenção) 2026-08-09 18:35:33 -03:00
Francisco Solla
44f4f3b96a
Merge pull request #503 from fsolla/plans/plan-issue-12
plan(B182/B183): status dos planos → ready
2026-08-09 18:10:48 -03:00
Francisco Solla
1f0bcdb2df plan(B182/B183): promote status → ready (planos em main) 2026-08-09 18:09:10 -03:00
Francisco Solla
e938a0e0d2
Merge pull request #502 from fsolla/plans/plan-issue-12
plan(B182/B183): PWA iOS — zoom preso no viewport + auto-zoom de inputs (planos de intenção)
2026-08-09 18:08:38 -03:00
Francisco Solla
a6f15bc81d plan(B182/B183): PWA iOS — zoom preso no viewport + auto-zoom de inputs (planos de intenção) 2026-08-09 18:06:22 -03:00
Francisco Solla
c3e447f135
Merge pull request #499 from fsolla/plans/plan-issue-11
plan(C101/C102): agenda mobile nativa + sem sidebar mobile (planos de intenção)
2026-08-09 17:52:48 -03:00
Francisco Solla
3b652dd7d9 plan(C101/C102): agenda mobile nativa + sem sidebar mobile (planos de intenção) 2026-08-09 17:49:44 -03:00
Francisco Solla
3f7f0cc552
Merge pull request #496 from fsolla/plans/plan-issue-10
plan(C99/C100): identidade de pessoas via Contact + lista unificada
2026-08-09 17:21:13 -03:00
Francisco Solla
79885a715d plan(C99/C100): identidade de pessoas via Contact + lista unificada de pessoas (planos de intenção) 2026-08-09 17:19:32 -03:00
Francisco Solla
97e5fd19ae
Merge pull request #493 from fsolla/C98-link-de-import-da-agenda-habilitar-sem-filtros-e-garanti
feat(C98): verify calendar import link generation end-to-end (env fix + e2e)
2026-08-09 17:06:57 -03:00
Francisco Solla
3fea9e5920 style(C98): format (prettier) 2026-08-09 16:54:24 -03:00
Francisco Solla
a75228fd34 test(C98): detect CI=true (GitHub Actions) for the prod-mode e2e skip
GitHub Actions injects CI=true (not CI=1), so the full feed flow ran on
the prod build in CI and the create failed with
'NEXT_PUBLIC_SITE_URL precisa usar HTTPS em produção.' — the canonical
fail-closed rejecting the localhost test env. Accept '1' and 'true'.
2026-08-09 16:53:46 -03:00
Francisco Solla
d03da6d49a test(C98): skip full feed flow when e2e runs the prod build
CI and `pnpm push` boot the production build with
NEXT_PUBLIC_SITE_URL=http://localhost:3000, which getCampaignInviteBaseURL
rejects at runtime (fail-closed: feed URLs must be canonical public DNS),
so the generate step of the e2e can only run against the dev server. The
prod-mode CI still covers the unlocked dialog (C93 component unit) and the
filterless feed content (C93 int tests).
2026-08-09 16:20:59 -03:00
Francisco Solla
65ed945b27 feat(C98): verify calendar import link generation end-to-end (env fix + e2e)
Production feed generation failed with a generic message because
NEXT_PUBLIC_SITE_URL was missing on Vercel production: buildFeedUrl calls
getCampaignInviteBaseURL(), which throws in NODE_ENV=production without the
env (intentional fail-closed), so the action catch returned 'Não foi
possível criar o feed de calendário.' and nothing was created. The local
real-flow verification (login -> agenda without filters -> header icon ->
name -> generate -> link /campanha/agenda/ical/<secret> -> iCal 200 with
the activity) proved C92/C93 work; the divergence was the environment.
Configured NEXT_PUBLIC_SITE_URL=https://pt.jorgesolla.com.br in Production
(+ checked Preview) and redeployed.

New e2e campaignAgendaFeed pins the real flow: desktop (header -> dialog
-> generate -> link responds iCal with the fixture activity) and mobile
(FAB -> sheet -> generate). The e2e fixture now owns calendarFeed rows
(createdBy NOT NULL made the campaignUser cleanup transaction abort).

AGENTS.md deploy checklist notes NEXT_PUBLIC_SITE_URL as mandatory in
Production.

Closes #483
2026-08-09 16:20:59 -03:00
Francisco Solla
c13e84af5e
Merge pull request #492 from fsolla/C97-agenda-seletor-de-dia-horario-shadcn-no-popover-de-criac
C97 — Agenda: seletor de dia + horário (shadcn) no popover de criação rápida
2026-08-09 15:27:33 -03:00
Francisco Solla
fdedfa9ad4 feat(C97): seletor shadcn de dia+horário 24h no popover de criação rápida da agenda
Troca o datetime-local nativo (AM/PM no idioma do browser, horário pouco
confiável) por ActivityDateTimeField: trigger com rótulo civil
dd/mm/aaaa às hh:mm + popover com Calendar (react-day-picker 9.7,
timeZone America/Bahia, locale pt-BR) e selects Hora 00-23 / Minuto
em passos de 15. Contrato de valor e submit inalterados; prefill do
slot mantido. Novo ui/Calendar.tsx (variante radix-nova), helpers
puros em campaignTime.ts. Sem migration. Closes #482 (PR).
2026-08-09 15:13:15 -03:00
Francisco Solla
59466d4a51
Merge pull request #491 from fsolla/B180-sollinha-travar-tools-eleitorais-legadas-gettopdeputies
feat(B180): gate fail-closed de leader nas tools eleitorais legadas do Sollinha
2026-08-09 15:07:09 -03:00
Francisco Solla
ff53e15e7e feat(B180): gate fail-closed de leader nas tools eleitorais legadas do Sollinha (getTopDeputies/getMunicipalityVotes)
ElectionDataGate compartilhado (3 call sites) + refactor da B177 para o helper.
2026-08-09 14:54:31 -03:00