diff --git a/docs/plans/atividades-omnibox-presets-busca-impl.md b/docs/plans/atividades-omnibox-presets-busca-impl.md index 827a1da3..c6344316 100644 --- a/docs/plans/atividades-omnibox-presets-busca-impl.md +++ b/docs/plans/atividades-omnibox-presets-busca-impl.md @@ -60,8 +60,7 @@ flowchart LR - **Tab + status em Todos:** ao mudar tab, limpar `status` se sair de `todos` (mesmo comportamento do antigo `buildTabHref`). - **`q` + tab:** filtros AND — busca restringe dentro da janela ativa. -## Aceite de engenharia +## Débitos deferidos (simplify B138) -- [x] Aceite de produto da intenção ainda coberto -- [x] Invariantes AGENTS/engineering-standards -- [x] Testes de domínio previstos (unit) onde URL/where mudam +- **DRY municipality/setExclusiveField helpers** (score 3, `defer_trigger`): extrair quando 3º domínio omnibox precisar do mesmo padrão — já ledgerado em B128; não bloqueia B138. +- **Int test `responsible.name` contains** (score 3, `defer_trigger`): where JSON coberto em unit; int espelhando supporter quando houver fixture de activity com responsável. diff --git a/src/utilities/activityOmnibox.ts b/src/utilities/activityOmnibox.ts index 0aa2c203..a7594271 100644 --- a/src/utilities/activityOmnibox.ts +++ b/src/utilities/activityOmnibox.ts @@ -8,6 +8,7 @@ import { type CampaignListOmniboxChip, type CampaignListOmniboxSuggestion, } from '@/lib/campaignListOmnibox' +import { isContactSearchQueryReady, normalizeContactSearchQuery } from '@/lib/contactSearchQuery' import { activityKindLabels, activityStatusLabels } from '@/lib/schemas/activity' import { activityTabLabels, @@ -197,8 +198,9 @@ export const applyActivityOmniboxSuggestion = ({ suggestionId: string }): ActivityOmniboxAction => { if (suggestionId.startsWith('q:')) { - const q = suggestionId.slice(2) - return { kind: 'url', state: withPageReset({ ...state, q: q || undefined }) } + const { trimmed } = normalizeContactSearchQuery(suggestionId.slice(2)) + const q = isContactSearchQueryReady(trimmed) ? trimmed : undefined + return { kind: 'url', state: withPageReset({ ...state, q }) } } if (suggestionId.startsWith('tab:')) { diff --git a/src/utilities/activityUi.ts b/src/utilities/activityUi.ts index 490fcd9e..a42236fa 100644 --- a/src/utilities/activityUi.ts +++ b/src/utilities/activityUi.ts @@ -1,5 +1,6 @@ import type { Where } from 'payload' +import { isContactSearchQueryReady, normalizeContactSearchQuery } from '@/lib/contactSearchQuery' import { activityKinds, activityStatuses, type ActivityKind } from '@/lib/schemas/activity' import { buildListHref, @@ -48,9 +49,15 @@ const isActivityKind = (value: string | undefined): value is ActivityKind => const isActivityStatus = (value: string | undefined): value is ActivityStatus => activityStatuses.includes(value as ActivityStatus) +const isActivityListSearchReady = (raw: string | undefined): string | undefined => { + if (!raw) return undefined + const { trimmed } = normalizeContactSearchQuery(raw) + return isContactSearchQueryReady(trimmed) ? trimmed : undefined +} + export const parseActivityListParams = (params: RawSearchParams): ActivityListState => { const rawPage = strictDecimalInteger(firstValue(params.page)) - const q = normalizedText(firstValue(params.q)) + const q = isActivityListSearchReady(normalizedText(firstValue(params.q))) const rawTab = firstValue(params.tab) const tab = isActivityTab(rawTab) ? rawTab : 'proximos' const rawKind = firstValue(params.kind) @@ -73,9 +80,12 @@ export const buildActivityListWhere = (state: ActivityListState, now: Date): Whe const filters: Where[] = [] if (state.q) { - filters.push({ - or: [{ title: { contains: state.q } }, { 'responsible.name': { contains: state.q } }], - }) + const q = isActivityListSearchReady(state.q) + if (q) { + filters.push({ + or: [{ title: { contains: q } }, { 'responsible.name': { contains: q } }], + }) + } } if (state.kind) filters.push({ kind: { equals: state.kind } }) diff --git a/tests/unit/activityUi.unit.spec.ts b/tests/unit/activityUi.unit.spec.ts index e5dd86b2..e91cab15 100644 --- a/tests/unit/activityUi.unit.spec.ts +++ b/tests/unit/activityUi.unit.spec.ts @@ -43,6 +43,7 @@ describe('parseActivityListParams', () => { it('parses and trims q', () => { expect(parseActivityListParams({ q: ' comício ' }).q).toBe('comício') expect(parseActivityListParams({ q: ' ' }).q).toBeUndefined() + expect(parseActivityListParams({ q: 'a' }).q).toBeUndefined() }) })