teqo/src/lib
Francisco Solla 1daaaf9f4e feat(C139): domínio de contatos — URL state, loader com vínculos e invariante de nome
Fase 2 do plano aprovado. Três módulos em src/utilities/contacts/:
- contactListUrl: contrato de params (q|gender|state|city|ausencia|vinculo|sort|dir|page),
  canonicalize, hrefs de sort e where de fonte com 'phones.value' like (ILIKE verificado
  no Postgres local).
- contactListData: loader com UM find em contact (user threadado, overrideAccess false),
  vínculos (liderancas/dobradinhas/assessores/equipe) como facets sobre o conjunto
  legível, filtro/sort/paginação em memória, nulos no fim (precedente B15).
- contactNameInvariant: lock contact-name:{normalized} + prefilter ILIKE + veredito
  exato em memória; mensagem de conflito pt-BR.

38 testes unit novos; format + tsc limpos.
2026-08-13 14:05:24 -03:00
..
ai feat(B198): drawer mobile do Sollinha fecha ao navegar por link interno 2026-08-11 14:29:29 -03:00
electionAggregates B13: escala relativa no mapa dos Municipios (quantis/LQ/posicao) + artefato TSE v3 2026-07-26 04:22:56 -03:00
geometries B8+: escala das malhas em unidades reais, contrato do map key e degradacao 2026-07-27 01:59:36 -03:00
schemas C130: ajustes da tabela desktop de pessoas (contato completo, base sob o nome, caret, tooltips, Dobra em, filtro/ordenação por partido) 2026-08-12 16:01:25 -03:00
activityAllDay.ts feat(C104): compromisso 'Todo o dia' na criação rápida da agenda (só datas, multi-dia) 2026-08-10 01:13:12 -03:00
activityDescription.ts feat(C114): agenda da campanha espelhada no Google Calendar com notificação (push Teqo → Google) 2026-08-11 13:53:51 -03:00
activityOverlayMessages.ts feat(C123): agenda — overlay modal central como única superfície de criação/edição de atividade (Closes #667) 2026-08-12 14:16:20 -03:00
activityQuickActions.ts feat(C123): agenda — overlay modal central como única superfície de criação/edição de atividade (Closes #667) 2026-08-12 14:16:20 -03:00
bahiaElectionAggregates.ts B13: escala relativa no mapa dos Municipios (quantis/LQ/posicao) + artefato TSE v3 2026-07-26 04:22:56 -03:00
bahiaGeometries.ts B8 F2: polígonos das ZE de Salvador e re-keying do coroplético por map key 2026-07-26 23:08:09 -03:00
bahiaGeometriesTypes.ts refactor(B5): reuse BahiaFeature type and drop wrapper casts 2026-07-31 01:41:00 +00:00
bahiaGeometryModuleFactory.ts style: prettier bahiaGeometryModuleFactory 2026-07-31 01:42:01 +00:00
bahiaMapStyle.ts B8+: escala das malhas em unidades reais, contrato do map key e degradacao 2026-07-27 01:59:36 -03:00
bahiaMunicipalityCodes.ts Add static Bahia municipality and territory geometries for the campaign map. 2026-07-18 22:07:41 -03:00
bahiaMunicipalityDemographics.ts Deliver A8 IBGE voter profile on Eleitorado tab with post-simplify scale plan. 2026-07-19 23:05:27 -03:00
bahiaMunicipalityGeometries.ts refactor(B5): reuse BahiaFeature type and drop wrapper casts 2026-07-31 01:41:00 +00:00
bahiaMunicipalityZoneGeometries.ts B8+: escala das malhas em unidades reais, contrato do map key e degradacao 2026-07-27 01:59:36 -03:00
bahiaTerritories.ts Tooling: prettier como autoridade de formatacao (organize-imports deterministico, scripts format/format:check, normalizacao mecanica de 312 arquivos; artefatos gerados e migrations excluidos via .prettierignore) 2026-07-25 17:22:20 -03:00
bahiaTerritoryGeometries.ts refactor(B5): reuse BahiaFeature type and drop wrapper casts 2026-07-31 01:41:00 +00:00
bahiaTseCityCodes.ts Deliver A7 Fase 2 cityCode TSE geography filters and absorb simplify debts. 2026-07-19 22:48:08 -03:00
bahiaTseZones.ts Add opt-in TSE zone and territory suggestion chips for nuclei. 2026-07-18 20:04:04 -03:00
campaignActionRoutes.ts feat(B195): finalizar wizard Registrar pedido — campo único + título derivado por IA + edição no detalhe 2026-08-10 20:15:05 -03:00
campaignAdvisorQuickActions.ts C86+ — pathname de lista das ações rápidas em fonte única (isListPath) 2026-08-04 01:14:35 -03:00
campaignAuthCopy.ts Simplify the WebAuthn adoption: an error branch that could not reach a screen. 2026-07-28 12:30:36 -03:00
campaignCoarsePointer.ts B44: UX-1 home action button and horizontal strip primitives. 2026-07-29 14:20:52 -03:00
campaignColumnVisibility.ts feat(C129): nome de legenda da dobradinha — campo ballotName + display discreto sob o nome (Closes #696) 2026-08-12 12:52:35 -03:00
campaignConsentKeys.ts D2 — Push + sino in-app para /campanha 2026-07-31 01:51:41 +00:00
campaignHomeActions.ts feat(campaign): C87 — atualização unificada (texto + polaridade + urgente) 2026-08-07 05:04:41 -03:00
campaignHomeSearchContract.ts B106 — Voltar no header mobile, Android back e skeleton das sugestões 2026-08-01 18:36:28 +00:00
campaignHomeSearchHits.ts feat(campanha): B163 — editar contatos das dobradinhas 2026-08-06 16:52:55 -03:00
campaignHomeSearchMessages.ts fix(OPS29): estado vazio honesto na busca global sem sugestões curadas (Closes #585) 2026-08-10 12:54:16 -03:00
campaignHomeSummaryDelta.ts B111 — strip edge-to-edge bleed + silent flat delta on Início 2026-08-01 20:36:19 +00:00
campaignHoverTooltip.ts B34: editable município chips on the leaderships list. 2026-07-27 22:35:19 -03:00
campaignInlineInput.ts Engineering Pass 3: consolidate patterns and lock them with guards. 2026-07-29 06:11:29 -03:00
campaignIntelligenceConcepts.ts B62: simplify the signal model to type + text (drop fonte/triangulado). 2026-07-29 23:24:00 -03:00
campaignInviteClient.ts B30: convite WhatsApp na lista de lideranças 2026-07-26 20:47:11 -03:00
campaignIosViewportHeal.ts fix(B182): PWA iOS — heal do zoom preso do visual viewport no standalone 2026-08-09 18:50:00 -03:00
campaignJsonRequest.ts Simplify the WebAuthn adoption: an error branch that could not reach a screen. 2026-07-28 12:30:36 -03:00
campaignLastActedMunicipality.ts B93 — wizard empty state continuity (visitados + última ação) 2026-08-01 07:21:56 +00:00
campaignListOmnibox.ts chore: remove orphaned list filter shells after B128 omnibox migration 2026-08-02 20:57:47 +00:00
campaignLongPress.ts chore: delete dead exports flagged by knip (CI main estava vermelho no drift) 2026-07-30 05:28:41 -03:00
campaignMunicipalityQuickActions.ts C86+ — pathname de lista das ações rápidas em fonte única (isListPath) 2026-08-04 01:14:35 -03:00
campaignMunicipalityV2QuickActions.ts B151 — FAB secundário no detalhe município v2 (#334) 2026-08-03 01:03:10 +00:00
campaignNotificationCopy.ts feat(push): opt-in automático e fix do prompt nativo no /campanha 2026-08-10 21:14:56 -03:00
campaignPageChrome.ts feat(C139): domínio de contatos — URL state, loader com vínculos e invariante de nome 2026-08-13 14:05:24 -03:00
campaignPaths.ts feat(C139): domínio de contatos — URL state, loader com vínculos e invariante de nome 2026-08-13 14:05:24 -03:00
campaignQuickActionContext.ts feat(C123): agenda — overlay modal central como única superfície de criação/edição de atividade (Closes #667) 2026-08-12 14:16:20 -03:00
campaignQuickActionDemands.ts feat(campaign): C87 — atualização unificada (texto + polaridade + urgente) 2026-08-07 05:04:41 -03:00
campaignQuickActionDobradinhas.ts C86+ — pathname de lista das ações rápidas em fonte única (isListPath) 2026-08-04 01:14:35 -03:00
campaignQuickActionLeadership.ts feat(campaign): C87 — atualização unificada (texto + polaridade + urgente) 2026-08-07 05:04:41 -03:00
campaignQuickActionMount.ts feat(C139): domínio de contatos — URL state, loader com vínculos e invariante de nome 2026-08-13 14:05:24 -03:00
campaignQuickActionPaths.ts feat(C123): agenda — overlay modal central como única superfície de criação/edição de atividade (Closes #667) 2026-08-12 14:16:20 -03:00
campaignQuickActionRegistry.ts B86 — ações rápidas — apoiadores (staff): catálogo no FAB/overlay 2026-08-03 21:03:13 -03:00
campaignQuickActionTypes.ts feat(C94): agenda omnibox + feed no header/FAB 2026-08-09 04:35:39 -03:00
campaignReferenceQuickActions.ts C86+ — pathname de lista das ações rápidas em fonte única (isListPath) 2026-08-04 01:14:35 -03:00
campaignRoles.ts Pass 2 W2: correcoes de fronteira lib/utilities e client boundary 2026-07-25 14:38:41 -03:00
campaignSessionTtl.ts Add remembered campaign sessions 2026-07-27 08:57:26 -03:00
campaignTime.ts feat(C104): compromisso 'Todo o dia' na criação rápida da agenda (só datas, multi-dia) 2026-08-10 01:13:12 -03:00
campaignWebAuthn.ts Deliver B40: biometric login for /campanha. 2026-07-28 10:59:23 -03:00
campaignWebAuthnClient.ts Simplify the WebAuthn adoption: an error branch that could not reach a screen. 2026-07-28 12:30:36 -03:00
campaignWebAuthnSupport.ts Deliver B40: biometric login for /campanha. 2026-07-28 10:59:23 -03:00
campaignWizardCopy.ts feat(B195): finalizar wizard Registrar pedido — campo único + título derivado por IA + edição no detalhe 2026-08-10 20:15:05 -03:00
campoParties.ts Tooling: prettier como autoridade de formatacao (organize-imports deterministico, scripts format/format:check, normalizacao mecanica de 312 arquivos; artefatos gerados e migrations excluidos via .prettierignore) 2026-07-25 17:22:20 -03:00
choroplethColorScale.ts simplify(B13): corrige classe agregada, bolhas em pane proprio e registra debitos 2026-07-26 05:12:37 -03:00
cities.ts feat: add petition form config and server-action submission flow 2026-02-22 23:08:00 -03:00
contactSearchQuery.ts Tooling: prettier como autoridade de formatacao (organize-imports deterministico, scripts format/format:check, normalizacao mecanica de 312 arquivos; artefatos gerados e migrations excluidos via .prettierignore) 2026-07-25 17:22:20 -03:00
demandTitle.ts feat(B195): finalizar wizard Registrar pedido — campo único + título derivado por IA + edição no detalhe 2026-08-10 20:15:05 -03:00
deviceLabel.ts Deliver B40: biometric login for /campanha. 2026-07-28 10:59:23 -03:00
electionCandidateIdentity.ts Add TSE 2022 election results model and local seed import. 2026-07-18 18:25:19 -03:00
electionFormat.ts simplify(B13): corrige classe agregada, bolhas em pane proprio e registra debitos 2026-07-26 05:12:37 -03:00
electionPartySpectrum.ts Tooling: prettier como autoridade de formatacao (organize-imports deterministico, scripts format/format:check, normalizacao mecanica de 312 arquivos; artefatos gerados e migrations excluidos via .prettierignore) 2026-07-25 17:22:20 -03:00
electionResults.ts Engineering Pass 3: consolidate patterns and lock them with guards. 2026-07-29 06:11:29 -03:00
electionResultsBuild.ts Tooling: prettier como autoridade de formatacao (organize-imports deterministico, scripts format/format:check, normalizacao mecanica de 312 arquivos; artefatos gerados e migrations excluidos via .prettierignore) 2026-07-25 17:22:20 -03:00
electionResultsCsv.ts Add TSE 2022 election results model and local seed import. 2026-07-18 18:25:19 -03:00
electionResultsParse.ts Tooling: prettier como autoridade de formatacao (organize-imports deterministico, scripts format/format:check, normalizacao mecanica de 312 arquivos; artefatos gerados e migrations excluidos via .prettierignore) 2026-07-25 17:22:20 -03:00
electionResultsZip.ts Add TSE 2022 election results model and local seed import. 2026-07-18 18:25:19 -03:00
electionYears.ts Engineering Pass 3: consolidate patterns and lock them with guards. 2026-07-29 06:11:29 -03:00
engagementLevel.ts refactor(lib): close the lib→utilities type-import hole + Local API omission guard 2026-07-31 13:17:10 -03:00
facebookPixel.ts Tooling: prettier como autoridade de formatacao (organize-imports deterministico, scripts format/format:check, normalizacao mecanica de 312 arquivos; artefatos gerados e migrations excluidos via .prettierignore) 2026-07-25 17:22:20 -03:00
formData.ts feat(C112): múltiplos telefones por pessoa — Contact.phones array (ordem = prioridade) 2026-08-11 10:47:02 -03:00
googleCalendarEventMapping.ts fix(C115): revisão /simplify — relógio com baseline de espelho, reopen sem re-cancelamento, hardening do webhook 2026-08-11 22:42:05 -03:00
googleCalendarLink.ts feat(C114): agenda da campanha espelhada no Google Calendar com notificação (push Teqo → Google) 2026-08-11 13:53:51 -03:00
googleCalendarPushNotification.ts feat(C115): edição pelo Google Calendar volta para o Teqo (motor bidirecional + webhook push) 2026-08-11 22:38:53 -03:00
googleCalendarReverseEdit.ts feat(C115): edição pelo Google Calendar volta para o Teqo (motor bidirecional + webhook push) 2026-08-11 22:38:53 -03:00
homeSearchExcludeCurrentEntity.ts chore: prettier format (B109) 2026-08-01 20:38:53 +00:00
homeSearchFocusHistory.ts B106 — format 2026-08-01 18:38:50 +00:00
homeSearchHitBudget.ts B54 — Busca global: layout responsivo dos resultados (#60) 2026-07-30 18:45:44 -03:00
homeSearchMunicipalityMatch.ts B50: home search Assessores group for unrestricted staff. 2026-07-29 22:09:42 -03:00
homeSearchNearestMunicipalityMerge.ts B125 — nearest município first in search suggest + wizard 2026-08-02 18:21:52 +00:00
homeSearchShare.ts fix(B55): defer share strategy to click + stabilize unit tests 2026-07-30 22:47:03 +00:00
homeSearchSuggest.ts B68: curated municipality suggestions on empty home search focus. 2026-07-29 22:06:02 -03:00
homeSearchUi.ts chore: delete dead exports flagged by knip (CI main estava vermelho no drift) 2026-07-30 05:28:41 -03:00
leaderContactsQuickActions.ts feat(C139): domínio de contatos — URL state, loader com vínculos e invariante de nome 2026-08-13 14:05:24 -03:00
leadershipAdvisorMembership.ts feat(C99): toda conta campaignUser aponta para uma ficha Contact; lideranças ganham assessores responsáveis 2026-08-09 19:12:35 -03:00
leadershipMunicipalityMembership.ts B34: editable município chips on the leaderships list. 2026-07-27 22:35:19 -03:00
leadershipNameTruncate.ts feat(campanha): ship B70 leadership update wizard (grid + short form). 2026-07-30 03:51:25 -03:00
leadershipStateDeputyMembership.ts B37 simplify: one membership delta, cap messages named once. 2026-07-28 10:25:47 -03:00
leadingMunicipalities.ts feat(B177): Sollinha responde em quais cidades X foi o deputado mais votado (rank competitivo reverso, flexível) 2026-08-09 02:35:53 -03:00
listFilterOptions.ts Lift selected options to the top in shared header multi-filters. 2026-07-28 18:37:05 -03:00
listQueryMatch.ts B18: saved municipality list filters in localStorage and sidebar submenu. 2026-07-28 19:25:12 -03:00
mapScaleClasses.ts simplify(B13): corrige classe agregada, bolhas em pane proprio e registra debitos 2026-07-26 05:12:37 -03:00
median.ts E12: camada TI com rollups MAUP e benchmark intra-TI. 2026-07-26 21:26:47 -03:00
metropolitanoTerritoryPeers.ts Simplify E12+ Metropolitano peers extraction. 2026-07-29 08:24:19 -03:00
municipalityAdvisorMembership.ts B37 simplify: one membership delta, cap messages named once. 2026-07-28 10:25:47 -03:00
municipalityCatalog.ts Pass 2 W4b: zero exports mortos; knip exports/types/enumMembers em ERROR no CI 2026-07-25 15:51:52 -03:00
municipalityNameAliases.ts Engineering Pass 3: consolidate patterns and lock them with guards. 2026-07-29 06:11:29 -03:00
municipalityPortfolio.ts feat(C131): Salvador como opção agregada no dropdown de municípios das células de capacidade 2026-08-12 14:02:34 -03:00
municipalityProximity.ts chore: delete dead exports flagged by knip (CI main estava vermelho no drift) 2026-07-30 05:28:41 -03:00
municipalityStateDeputyMembership.ts B37 simplify: one membership delta, cap messages named once. 2026-07-28 10:25:47 -03:00
municipalityVoteRank.ts simplify(B13): corrige classe agregada, bolhas em pane proprio e registra debitos 2026-07-26 05:12:37 -03:00
municipalityZoneNeighborhoods.ts B8 F2: polígonos das ZE de Salvador e re-keying do coroplético por map key 2026-07-26 23:08:09 -03:00
notificationContract.ts feat(C108): sino de notificações — abrir marca tudo como lido, painel limpo, modal central no desktop 2026-08-10 02:56:20 -03:00
onda0ConsentTexts.ts O0+ (#34): consent key DRY, SQL int tests, Footer condicional, B68 suggest RSC 2026-08-01 06:04:05 +00:00
organizationQuickActions.ts B88 — Ações rápidas em Organizações (lista + detalhe) 2026-08-01 05:11:31 +00:00
partnershipCoverage.ts feat(B190): Sollinha — cobertura de parcerias (municípios sem dobradinha + dobradinhas órfãs) 2026-08-10 07:24:15 -03:00
phone.ts feat(C112): múltiplos telefones por pessoa — Contact.phones array (ordem = prioridade) 2026-08-11 10:47:02 -03:00
politicalTrendWizardMeta.ts fix: format + wire WIZARD_TREND_SAVED_MESSAGE for knip 2026-07-30 23:03:25 +00:00
politicalTrendWizardUi.ts feat(campanha): B168 — desfazer encadeamento automático das ações rápidas do wizard 2026-08-08 14:10:47 -03:00
projectionSheetParse.ts Pass 2 W4e: tipos de fonte unica 2026-07-25 15:05:03 -03:00
relationAvatarOverlap.ts feat(B200): encaixes dos cards mobile de municípios — densidade, alinhamento de labels e pilha de avatares (pós-B196) 2026-08-12 15:40:02 -03:00
relationMembershipDelta.ts B37 simplify: one membership delta, cap messages named once. 2026-07-28 10:25:47 -03:00
relationship.ts Engineering Pass 3: consolidate patterns and lock them with guards. 2026-07-29 06:11:29 -03:00
salvadorCity.ts fix(B178): review do simplify — nulls nativos em DESC, mapa sem slug da cidade, sr-only morto, sinal mobile, paginação/edges testados 2026-08-09 10:40:18 -03:00
sameIdSet.ts B17: column picker on the seven CampaignTable list surfaces. 2026-07-28 08:25:16 -03:00
searchOnlyListOmnibox.ts B137 — restore searchOnlyListOmnibox from main (CI merge ref) 2026-08-03 00:06:16 +00:00
slug.ts Pass 2 W2: correcoes de fronteira lib/utilities e client boundary 2026-07-25 14:38:41 -03:00
sollinhaChatPanelWidth.ts refactor(B166): endurece e2e (poll determinístico) e clamp exato após revisão 2026-08-08 16:04:54 -03:00
sollinhaChatSession.ts fix(OPS22): settle do chat desktop não vaza drawer para a visita mobile da mesma aba — CI main verde (deploy desbloqueado) 2026-08-10 13:12:12 -03:00
sollinhaFollowUpSuggestions.ts feat(B192): follow-ups sugeridos após cada resposta do Sollinha (bloco no prompt + chips extraídos) 2026-08-10 09:13:38 -03:00
sollinhaOpeningQuestions.ts feat(B192): follow-ups sugeridos após cada resposta do Sollinha (bloco no prompt + chips extraídos) 2026-08-10 09:13:38 -03:00
stateDeputyAdvisorMembership.ts B156 — assessores por dobradinha (campo, coluna e seção; RelationOptionCell extraído) 2026-08-04 04:57:15 -03:00
stateDeputyNameParty.ts B157 — coluna de dobradinhas na lista de municípios (+ criação inline) 2026-08-04 02:53:43 -03:00
states.ts Replace state/city selects with type-to-filter comboboxes 2026-07-15 14:41:58 -03:00
suggestionCatalog.ts refactor(lib): close the lib→utilities type-import hole + Local API omission guard 2026-07-31 13:17:10 -03:00
supporterQuickActions.ts C86+ — pathname de lista das ações rápidas em fonte única (isListPath) 2026-08-04 01:14:35 -03:00
territorialClassAnchors.ts Engineering Pass 3: consolidate patterns and lock them with guards. 2026-07-29 06:11:29 -03:00
territorialClassSortWeight.ts E12: camada TI com rollups MAUP e benchmark intra-TI. 2026-07-26 21:26:47 -03:00
territoryAnchor.ts B25: link do território na lista de municípios 2026-07-26 18:59:49 -03:00
text.ts Engineering Pass 3: consolidate patterns and lock them with guards. 2026-07-29 06:11:29 -03:00
ticketPartnerOpportunities.ts A6 — Dobradinha 2026 automática quando o TSE publicar candidaturas (pós-15/08) (#82) 2026-07-31 00:14:27 -03:00
utils.ts Tooling: prettier como autoridade de formatacao (organize-imports deterministico, scripts format/format:check, normalizacao mecanica de 312 arquivos; artefatos gerados e migrations excluidos via .prettierignore) 2026-07-25 17:22:20 -03:00
visitPlannerAnchors.ts E13: visit eligibility checklist and the tour composer. 2026-07-27 21:04:04 -03:00
voteEstimate.ts Engineering Pass 3: consolidate patterns and lock them with guards. 2026-07-29 06:11:29 -03:00
voteTrend.ts Pass 2 W4b: zero exports mortos; knip exports/types/enumMembers em ERROR no CI 2026-07-25 15:51:52 -03:00
wizardLeadershipContract.ts feat(C112): múltiplos telefones por pessoa — Contact.phones array (ordem = prioridade) 2026-08-11 10:47:02 -03:00
wizardMunicipalitySuggest.ts Format B92 files 2026-08-01 07:04:09 +00:00
wizardMunicipalitySuggestMerge.ts B125 — nearest município first in search suggest + wizard 2026-08-02 18:21:52 +00:00
wizardUpdateUi.ts feat(campanha): B168 — desfazer encadeamento automático das ações rápidas do wizard 2026-08-08 14:10:47 -03:00
wizardVoteEstimate.ts B77+: simplify vote wizard helpers after single-screen delivery. 2026-07-30 03:40:20 -03:00
wordStartFilter.ts Adopt B42's cell-edit overlay in B34 and fix the optimistic baseline again. 2026-07-27 23:59:20 -03:00