diff --git a/docs/plans/assessores-omnibox-municipio-carteira-impl.md b/docs/plans/assessores-omnibox-municipio-carteira-impl.md index 59171ecb..e269fd94 100644 --- a/docs/plans/assessores-omnibox-municipio-carteira-impl.md +++ b/docs/plans/assessores-omnibox-municipio-carteira-impl.md @@ -25,6 +25,7 @@ flowchart LR ``` **Opções consideradas:** + - A) Estender `searchOnlyListOmnibox` com hooks — rejeitada (não escala; leadership/supporter já têm adapter próprio). - B) Adapter `advisorOmnibox` + `advisorListFilters` espelhando lideranças (só dimensão município + busca) — **recomendada**. - C) Facet server-side de municípios com assessor — rejeitada nesta fatia (busca tipada no índice de 435 já atende; página já carrega `loadMunicipalityPortfolioIndex`). @@ -67,3 +68,9 @@ flowchart LR - [x] Aceite de produto da intenção ainda coberto - [x] Invariantes AGENTS/engineering-standards - [x] Testes de domínio previstos (unit/int) onde access/write paths mudam + +## Débitos deferidos (simplify) + +- Facet server-side restrito a municípios com assessor — gatilho: omnibox ruidosa com 435 seeds. +- Toggle municipality via parse round-trip — gatilho: segunda dimensão de filtro em assessores. +- Omnibox `municipality:` slice duplicado em apply/remove — gatilho: refactor cross-list omnibox. diff --git a/src/app/(campaign)/campanha/(app)/assessores/page.tsx b/src/app/(campaign)/campanha/(app)/assessores/page.tsx index b8e7a22d..87dc3c96 100644 --- a/src/app/(campaign)/campanha/(app)/assessores/page.tsx +++ b/src/app/(campaign)/campanha/(app)/assessores/page.tsx @@ -5,14 +5,14 @@ import { getPayload } from 'payload' import { AdvisorFilters } from '@/components/campaign/advisor/AdvisorFilters' import { AdvisorsTable } from '@/components/campaign/advisor/AdvisorsTable' import { CampaignListFooter } from '@/components/campaign/shared/CampaignListFooter' -import { getMunicipalityCatalogEntry } from '@/lib/municipalityCatalog' -import { hasAdvisorListActiveFilters } from '@/utilities/advisor/advisorListFilters' import { CampaignListPendingBoundary, CampaignListResults, } from '@/components/campaign/shared/CampaignListPending' import { CampaignPageShell } from '@/components/campaign/shell/CampaignPageShell' import { campaignPageMetadataFromCatalog } from '@/lib/campaignPageChrome' +import { getMunicipalityCatalogEntry } from '@/lib/municipalityCatalog' +import { hasAdvisorListActiveFilters } from '@/utilities/advisor/advisorListFilters' import { advisorListHrefForPage, loadAdvisorListPageData, diff --git a/src/components/campaign/advisor/AdvisorFilters.tsx b/src/components/campaign/advisor/AdvisorFilters.tsx index 93791163..a581013c 100644 --- a/src/components/campaign/advisor/AdvisorFilters.tsx +++ b/src/components/campaign/advisor/AdvisorFilters.tsx @@ -4,6 +4,8 @@ import { useMemo, useState } from 'react' import { CampaignListOmnibox } from '@/components/campaign/shared/CampaignListOmnibox' import { useCampaignListFilterNavigation } from '@/components/campaign/shared/useCampaignListFilterNavigation' +import type { AdvisorFilterOption } from '@/utilities/advisor/advisorListFilters' +import { advisorListHrefForPage, type AdvisorListState } from '@/utilities/advisor/advisorListUrl' import { applyAdvisorOmniboxSuggestion, buildAdvisorOmniboxChips, @@ -13,8 +15,6 @@ import { removeAdvisorOmniboxChip, type AdvisorOmniboxAction, } from '@/utilities/advisor/advisorOmnibox' -import type { AdvisorFilterOption } from '@/utilities/advisor/advisorListFilters' -import { advisorListHrefForPage, type AdvisorListState } from '@/utilities/advisor/advisorListUrl' export const AdvisorFilters = ({ state, diff --git a/src/utilities/advisor/advisorListFilters.ts b/src/utilities/advisor/advisorListFilters.ts index 9027d665..63b06ae1 100644 --- a/src/utilities/advisor/advisorListFilters.ts +++ b/src/utilities/advisor/advisorListFilters.ts @@ -1,12 +1,12 @@ /** * Advisor list filter affordances: município (carteira) toggles and clear. */ -import { strictDecimalInteger } from '@/utilities/campaignListUrl' import { advisorListStateToRawParams, parseAdvisorListParams, type AdvisorListState, } from '@/utilities/advisor/advisorListUrl' +import { strictDecimalInteger } from '@/utilities/campaignListUrl' export type AdvisorFilterOption = { value: string diff --git a/tests/unit/campaignEntityListParsers.unit.spec.ts b/tests/unit/campaignEntityListParsers.unit.spec.ts index c48e2a98..2377ea75 100644 --- a/tests/unit/campaignEntityListParsers.unit.spec.ts +++ b/tests/unit/campaignEntityListParsers.unit.spec.ts @@ -33,7 +33,9 @@ describe.each(qAndPageParsers)('%s list parser (q + page)', (_name, parse) => { }) it('parses repeatable municipality ids and drops invalid tokens', () => { - expect(parseAdvisorListParams({ municipality: ['12', 'bad', '0'] }).municipalities).toEqual([12]) + expect(parseAdvisorListParams({ municipality: ['12', 'bad', '0'] }).municipalities).toEqual([ + 12, + ]) expect(parseAdvisorListParams({ municipality: ['3', '7'] }).municipalities).toEqual([3, 7]) expect(parseAdvisorListParams({}).municipalities).toBeUndefined() }) diff --git a/tests/unit/listOmniboxB128.unit.spec.ts b/tests/unit/listOmniboxB128.unit.spec.ts index aeb520b0..0a04e2ef 100644 --- a/tests/unit/listOmniboxB128.unit.spec.ts +++ b/tests/unit/listOmniboxB128.unit.spec.ts @@ -9,6 +9,7 @@ import { buildActivityOmniboxChips, clearActivityOmnibox, } from '@/utilities/activityOmnibox' +import { parseActivityListParams } from '@/utilities/activityUi' import { parseAdvisorListParams } from '@/utilities/advisor/advisorListUrl' import { applyAdvisorOmniboxSuggestion, @@ -16,7 +17,6 @@ import { buildAdvisorOmniboxSuggestionSeeds, filterAdvisorOmniboxSuggestions, } from '@/utilities/advisor/advisorOmnibox' -import { parseActivityListParams } from '@/utilities/activityUi' import { parseDemandListParams } from '@/utilities/demand/demandListUrl' import { applyDemandOmniboxSuggestion,