holden. A second duplicate profile (no email) was only found via a known address.dani.j@kw.com found her immediately.GlobalSearch.tsx) and scheduling contact picker (ContactSearch.tsx) both call GET /contact?search=… scoped by _companyId only.searchContactsOnly in contact.ts uses MongoDB Atlas $search on firstName, lastName, email, and phone as separate autocomplete fields with minimumShouldMatch: 1. A multi-word query like Danielle Jones can match many contacts on first name alone; the exact record may not rank in the top results.PAGE_SIZE = 10). When Inspections + Quotes + Contacts filters are all enabled (default), contact infinite scroll is disabled — users only see the first page unless they toggle to Contacts only and scroll.ContactSearch also merges Spectora agent/buyer results when the user has Spectora integration — this can make scheduling picker results differ from global search, but is not the primary Attik miss.Locked
GlobalSearch.tsx) and scheduling contact picker (ContactSearch.tsx); both use the same backend contact search.Open
Danielle Jones and Jeremy Holden, must the target contact appear in the top 10 results in the default global search view (Inspections + Quotes + Contacts all enabled)? Or is it acceptable if users must toggle to Contacts only and/or scroll to load more?firstName + lastName Atlas index pathDanielle only should still return many Danielles, but Danielle Jones must rank the exact record highly)./contacts) — Global search and scheduling picker are in scope; should Tools → Contacts table search (ContactsTableControls → same GET /contact?search=… API) be explicitly included in v1 QA/acceptance, or inherit the backend fix only?searchContactsOnly / the contact-search Atlas index in the same release?Backend (attik-backend)
src/routes/contact.ts → searchContactsOnly: Atlas $search compound query on contact-search index (firstName, lastName, email, phone autocomplete paths). Improve multi-token name matching and ranking so full-name queries surface the intended contact.GET /contact with search, limit, offset params; company filter via _companyId / res.locals.company.Frontend (attik-frontend)
src/components/navbar/GlobalSearch.tsx: contact fetch via useServerInfiniteSearch with PAGE_SIZE = 10; allowInfiniteScroll only when exactly one entity filter is active; isLikelyAddress gate skips contact search for address-like queries.src/components/scheduling/ContactSearch.tsx: same contact API with limit: 10; optional Spectora agent/buyer merge when user.integrations includes spectora.src/app/tools/contacts/ContactsTableControls.tsx uses the same search API via URL params; confirm v1 inclusion per product decision above.src/util/hooks/useServerInfiniteSearch.ts: offset/limit pagination accumulation.Out of scope (unless product expands)
attik-backend/src/routes/contact.ts, attik-frontend/src/components/navbar/GlobalSearch.tsx, attik-frontend/src/components/scheduling/ContactSearch.tsx, attik-frontend/src/app/tools/contacts/ContactsTableControls.tsxPlease authenticate to join the conversation.
Planned
Main App
1 day ago
Linear
Get notified by email when there are changes.
Planned
Main App
1 day ago
Linear
Get notified by email when there are changes.