Skip to content

Observatório de Infrações, melhorias no CicloDados, Contagens, Sinistros Fatais e Vias Inseguras - #165

Open
dvalenca wants to merge 127 commits into
mainfrom
fix-db-api-frontend-mods
Open

Observatório de Infrações, melhorias no CicloDados, Contagens, Sinistros Fatais e Vias Inseguras#165
dvalenca wants to merge 127 commits into
mainfrom
fix-db-api-frontend-mods

Conversation

@dvalenca

@dvalenca dvalenca commented Jun 4, 2026

Copy link
Copy Markdown
Collaborator

O Observatório de Infrações vai ficar fora por enqunato que estamos finalizando os dados, mas há uma necessidade de atualização da contagem.

Observatório de Infrações de Trânsito (nova página)

  • Página /dados/infracoes com visão geral (total, período, tipos, ruas, fiscalização eletrônica)
  • Seções: Onde Acontecem (mapa + tabela de ruas), Quando Acontecem (gráficos anual, mensal, dia da semana, hora), Quem Fiscaliza (breakdown por agente), Infrações por classificação (cards por categoria com link para subpágina)
  • Subpáginas /dados/infracoes/:category com análise aprofundada por categoria
  • Mapa com gradação de cor e espessura baseada em quartis de concentração
  • Seletor de ano (pill buttons em desktop, dropdown em mobile)
  • Filtro por infração via checkbox na tabela principal, propagado para todos os blocos
  • Tabelas colapsáveis com filtro por coluna
  • Marcado como "Em breve" — cards, navbar e sidebar do CicloDados desativados, endpoints apontando para Atlas
    CicloDados
  • Sinistros com vítima usando dados SAMU (5 filtros por categoria, severidade por proporção)
  • Camada de infrações de trânsito no mapa
  • Navbar padrão da Ameciclo substituindo header customizado
  • Sidebar inicia com todas as seções colapsadas, seções reordenadas
  • Correções: NaN nos markers, acesso a lngLat, olho invertido nos toggles
    Contagens
  • Radares de fluxo com seletor de hora e modo percentual
  • Gráfico de ciclistas por hora com múltiplas séries
  • Coluna de coordenadas na tabela com zoom no mapa
  • Rota de comparação com múltiplos slugs (/contagens/compare/:slugs)
  • Agrupamento por local com expand/colapse
  • Slugs human-readable (countId-data-nome)
    Sinistros Fatais
  • Barra fixa de filtros com seleção de cidade e ano início/fim
  • Ranking com destaque da cidade selecionada e sumário de filtros
  • Agrupamento de faixas etárias em 5 categorias
  • Correções: matriz de colisão, gráfico de evolução, causas secundárias
  • DATASUS API apontando para traffic-deaths.atlas.ameciclo.org
    Vias Inseguras
  • Liberado do coming soon, rota renomeada para /vias-inseguras
  • Tratamento de dados mock sem extensão em km e sem geometrias
    Execução Cicloviária
  • Camadas do mapa separadas por status_type (designado/não designado)
  • Cards de tipologia no Observatório Cicloviário
    LOA / DOM
  • Migração para novas APIs de orçamento
    Infraestrutura geral
  • Centralização de todas as URLs de API em app/servers.ts
  • Migração de fetch manual para TanStack Query
  • Compatibilidade com novo formato da API SAMU

dvalenca added 30 commits May 20, 2026 14:50
- Remove normalizações de dados (validos, por_sexo, por_faixa_etaria,
  por_categoria) que corrompiam dados já no formato correto
- Usa display_name do backend para exibir nomes de municípios com
  acentos e capitalização correta
- Remove fallback de mock data (lança erro se API falhar)
- Adiciona accent normalization no matching do mapa coroplético
- Adiciona ranking e rmr às interfaces de tipo
- Adiciona safeNormalize() para comparar nomes de cidades ignorando
  acentos (Jaboatão vs JABOATAO)
- Aplica nas 3 funções de matching: RMR filter, evolução, perfis
- Remove dependência da API externa SAMU_CALLS_PROFILES; agrega dados
  de perfil (sexo, idade, categoria) localmente somando os anos do
  intervalo selecionado
- Adiciona tentativa de chamar /v1/calls/profiles quando range é
  selecionado (selectedEndYear)
- Se API falhar, cai no fallback de agregação local
- Para ano único, continua usando dados locais (mais rápido)
…ros visível

- Usa municipio_samu como id dos cards do ranking para matching
  correto com selectedCity inicial (RECIFE)
- Adiciona selectedCityName (display_name) para exibição amigável
- Adiciona getFilterSummary() mostrando cidade + período como
  subtítulo nas seções Ranking, Evolução e Perfis
- Remove texto 'Período selecionado' redundante junto aos botões de ano
…ico e corrige filtro de modo nas causas secundárias
…iciona cards de tipologia no Observatório Cicloviário
…ve categorias e tooltip, corrige olho invertido
…o por Infrações por classificação com subpáginas clicáveis por categoria
… endpoints

- Corrige bug do SelectColumnFilter (controlled/uncontrolled switch)
- Reordena colunas das tabelas de ruas e infrações com width customizado
- Suporte a column.width no componente Table
- Ajusta título 'Infrações registradas' dentro da tabela
- Corrige endpoint do geojson de /v1/dashboard/geojson para /v1/streets/geojson
- Remove colunas excedentes das tabelas de ruas
- layersConf agora usa useMemo com breakpoints calculados via quartis (Q1/Q2/Q3) dos total_violations reais do GeoJSON
- interpolate no line-color (amarelo→laranja→vermelho→vinho) e line-width (2px→3px→5px→8px)
- mesma gradação aplicada nos mapas principal e por categoria
dvalenca added 29 commits July 27, 2026 16:24
…sca de ruas

- searchStreets: usar GET /v1/streets/search em vez de Nominatim
- getStreetDetails: usar GET /v1/streets/:id em vez de mock
- getStreetDataSummary: usar GET /v1/streets/:id/data-summary em vez de mock
- MapView: ao clicar na sugestao, buscar geometria via getStreetDetails
  para obter bounds quando indisponivel na busca
- pieMarker: adicionado parametro ringColor (5o), stroke deixa de ser white hardcoded
- MapView: constante YEAR_COLORS mapeia 2018→teal, 2021→violet, 2024→purple
- MapView: survey_year do ponto usado para obter ringColor
- MapView: borda do wrapper div tambem usa a cor do ano + bg-white
- 2021: #7c3aed (violet) → #f97316 (orange) para diferenciar de 2024
- Slider: gradiente com 3 stops (#0d9488, #f97316 50%, #8B5CF6)
- Remove Marker com CSS transform (translate(-50%, -50%)) que causava deslocamento
- Usa Source geojson + Layer circle com raio em pixels calculado do viewport.zoom
- Posicionamento preciso via pipeline de renderizacao nativa do mapa
- servers.ts: POINT_CICLO_NEARBY aceita streetId opcional → /nearby?street=
- useCicloDadosMap: autoOpenPopup inclui streetId, passado no handleZoomToStreet
- MapView: showPointInfo inclui streetId, propagate no autoOpenPopup e PointInfoPopup
- PointInfoPopup: usa POINT_CICLO_NEARBY(lat, lng, 200, streetId)
- Remove selectedCircles (círculo hachurado redundante) de MapView e AmecicloMap
…dicional do MuralView

- LeftSidebar: toggle Map/LayoutGrid acima de Camadas de dados
- Route: viewMode e onViewModeChange passados a LeftSidebar
- Route: renderiza MuralView quando viewMode === 'mural'
- Route: MapView + RightSidebar so renderizam em viewMode === 'map'
… do /v1/nearby

- PointData: adicionar interface traffic_tickets (total, by_year, top_violations, vulnerable_violations)
- tabs: nova tab Infracoes com icone AlertTriangle
- Render: total de infracoes, top violacoes com barra de progresso, infracoes contra ciclistas com Bike icon
- Render: grafico SVG de evolucao anual + link para /dados/infracoes
- Evolucao anual movida para logo apos o total, com valores em cima das barras e ano completo embaixo
- Periodo do total descrito (ex: 2007 a 2025)
- Infracoes contra ciclistas renomeado para Infracoes contra Pedestres e ciclistas
- Estado vazio quando total=0: explica que dados sao das top 250 vias
- SVG com width=100% e preserveAspectRatio centralizado
- Barras proporcionais preenchendo todo o espaco disponivel
…oPopup

- Card com fundo vermelho claro, icone AlertTriangle, total de infracoes
- Adicionado ao hasData check para exibicao condicional
…separada

- Visao Geral agora inclui coordenadas, via mais proxima, nome popular, distancia e extensao
- Tab Localizacao removida do array tabs e do bloco de renderizacao
…ireita

- Contagem em text-lg font-bold com localeString e label infracoes embaixo
- Mesmo padrao dos cards de top infracoes
… especifica

- Cada card agora tem cursor-pointer e onClick que chama setActiveTab
- Emergencias→safety, Contagens→counts, Perfis→profile, Infraestrutura/BikePE/Bicicletarios→infrastructure, Infracoes→violations
- Card de Infracoes agora usa bg-white como os demais
- Icones com cores distintas para cada card (vermelho, azul, verde, roxo, laranja, teal)
…es dos cards

- Cada tab agora tem cor propria: Visao Geral azul, Seguranca vermelho, Infraestrutura teal, Contagens verde, Perfil roxo, Infracoes vermelho, Analises azul
- Borda inferior e texto da tab ativa seguem a cor do card correspondente na Visao Geral
- Icones das abas ativas tambem coloridos
…tagens e Perfil

- useEffect auto-expande a contagem mais recente (por data) na tab Contagens
- useEffect auto-expande a edicao mais recente (por ano) na tab Perfil
- Usa refs separados para controlar se ja expandiu cada secao
…s do early return

- useRef e useEffect de auto-expand movidos para antes de 'if (!data && !extraData) return null'
- Remove duplicata das hooks que estava apos o early return
- Usa 'data' em vez de 'finalData' pois finalData so e definido depois do early return
- useRef colocados junto aos outros useRef no topo do componente
- useEffect colocado apos definicao de data, antes de todos os returns (loading, error, no-data)
- Garante que todos os hooks sao registrados na mesma ordem em qualquer renderizacao
… PointInfoPopup

- Seguranca: link atualizado para /dados/sinistros
- Infraestrutura: link para /dados/execucao-cicloviaria
- Contagens: link para /dados/contagens
- Perfil: link para /dados/perfil
- Analises: link para /dados/ciclodados
- Infracoes: ja existia link para /dados/infracoes
- Todos os links seguem o mesmo padrao visual (teal, ArrowRight)
- parsePageData: use plataforma-cover.jpg as universal fallback for dados pages
- dados.index: fallback cover when Strapi cover is null
- PointInfoPopup: fix crash when nearest_street is null (outside Recife),
  show coordinates instead; add 'Dados brutos' copy/download bar
- vite.config: use Cloudflare plugin only during build, not dev,
  fixing SSR fetch to localhost backends
- ideciclo routes: remove redundant cover fallbacks
- Move infracoes overview data fetching from SSR to client-side lazy load
- Add fetchOverviewClient and infracoesOverviewQueryOptions to queries
- Lazy-load InfracoesClientSide component on infracoes page
- Fix Tailwind/Maplibre CSS imports to use URL pattern (?url)
- Show loading state while overview data loads on client
…tabela

- Adiciona gráfico de evolução anual agregado para toda a RMR com tipos de desfecho
- NumberCards (ranking RMR) agora reagem ao intervalo de anos selecionado
- Tabela 'Lista completa das cidades' agora reflete o período selecionado no título e dados
- Corrige subtítulo da evolução por cidade para mostrar apenas o nome da cidade
- Adiciona indicador de período nos cards de ranking
- Ajusta IS_DEV/STRAPI_DEV para usar variáveis de ambiente
@dvalenca

Copy link
Copy Markdown
Collaborator Author

Resumo
Branch com melhorias em múltiplas páginas de dados da plataforma, com foco em CicloDados (sidebar, popups, infrações no mapa, perfil, mural, assistente de documentos), Infrações de Trânsito (página completa com mapas, gráficos empilhados e filtros), Chamados de Emergência (SAMU) (filtros por período, evolução RMR) e ajustes de infraestrutura (servers.ts, env vars, correções de SSR).
CicloDados

  • Sidebar: seções colapsadas por padrão, toggle Mapa/Mural, infrações de trânsito na sidebar, busca de ruas usando APIs próprias do CicloDados (substitui Nominatim)
  • PointInfoPopup: cards de infrações na visão geral, abas clicáveis com cores combinando aos ícones, tab Infrações com /v1/nearby, auto-expand do dado mais recente, "Ver dados completos" em todas as abas
  • Mapa: pie markers de perfil censitário, slider de anos com slider crossing, legenda de cores, infrações tracejadas com toggle individual, periculosidade nos sinistros, severidade por proporção, correção de NaN nos markers
  • Perfil: renda, escolaridade, raça/cor no "Colorir por", anel SVG com cor do ano
  • Mural: renderização condicional com toggle Mapa/Mural
  • Contagens: slugs human-readable, agrupamento por local com expand/colapse, rota de comparação multi-slug, gráfico horário com seletor e paleta unificada, radares de fluxo
  • Assistente de documentos: prompt builder, templates JSON, melhorias de UI
  • Gráficos: correção de tooltip (label em vez de índice), destaque do ano selecionado em teal, padding superior para não cortar labels, largura total no modal
    Infrações de Trânsito
  • Página principal com mapa (gradação de cor/espessura por quartis), tabela lado a lado, skeleton/loading
  • Gráficos: evolução anual com empilhamento por categoria e agente, 12 meses garantidos com zero, stacking por law_code
  • Filtros: seletor de ano (dropdown mobile, pills desktop), seleção de infrações via checkbox na tabela, filtro por lei (/v1/law-stats), links internos via search params
  • Subpáginas de categoria com tabela clicável, barras destacadas, ordenação numérica corrigida
  • InfracoesStatisticsBox com Intl client-side, compacto sem filtro, percentuais calculados no frontend
  • ApiStatusIndicator trocado para usar /health real
  • Defer de overview fetch para client-side, correção de CSS imports
    Chamados de Emergência (SAMU)
  • Evolução anual da RMR: novo gráfico de barras empilhadas agregando todas as cidades metropolitanas por tipo de desfecho
  • Filtro por período: NumberCards (ranking RMR) e tabela "Lista completa das cidades" agora reagem ao intervalo de anos selecionado, somando historico_anual no período
  • Tabela: título agora inclui o período (ex: "Lista completa das cidades — 2020 a 2024")
  • Evolução por cidade: subtítulo corrigido para mostrar apenas o nome da cidade (o gráfico sempre mostra todos os anos)
  • Indicador de período nos cards de ranking
  • Correção SSR: gráfico RMR usa useState/useEffect para não quebrar no servidor (Highcharts client-only)
    Vias Inseguras
  • Página liberada do "coming soon", rota renomeada para /vias-inseguras
  • Parse de datas na tabela, total RMR no gráfico, último dado na evolução anual
  • Tratamento de dados mock sem extensão km e sem geometrias
    Execução Cicloviária
  • Documentos do Strapi como fonte primária, hardcoded como fallback
    Infraestrutura
  • servers.ts: centralização de todas as URLs de API, IS_DEV e STRAPI_DEV agora lidos de variáveis de ambiente em vez de hardcoded
  • CMS: atualização de URLs do Strapi, flag STRAPI_DEV, page data padronizada com PLATAFORMA_DADOS_PAGE_DATA e parsePageData
  • Navbar: remove IDECICLO, adiciona Infrações, fecha submenu ao navegar, corrige captura de cliques durante animação
  • SSR: correções de cover fallback, dev SSR, fetch de contagens movido para client-side

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant