Skip to content

Expand admin global search (⌘K) to cover more data types and pages #317

@Starefossen

Description

@Starefossen

Summary

The global search modal (⌘K / Ctrl+K) in the admin interface currently only searches proposals. It should be expanded to search across all major data types and link to relevant admin pages.

Current Behavior

  • SearchModal (src/components/admin/SearchModal.tsx) only queries proposals via /admin/api/proposals/search
  • Results show proposal title, speaker names, status, and link to the proposal detail page
  • Several admin pages have their own isolated inline search (speakers, orders, sponsors) but these are not accessible from the global search

Proposed Behavior

The global search should return results across multiple data types, grouped by category:

Data types to add

Data Type Fields to Search Link Target
Speakers Name, title, email, company /admin/speakers (or anchor/highlight)
Sponsors Company name, contact names, contract status /admin/sponsors
Ticket Orders Order ID, attendee name, email, company /admin/tickets/orders
Workshops Workshop title, attendee name, email /admin/workshops
Volunteers Name, email /admin/volunteers
Schedule Slots Talk title, speaker name, room/track /admin/schedule

Admin pages as search targets

In addition to data, the search should match admin page names so users can quickly navigate:

  • Dashboard, Proposals, Speakers, Schedule, Sponsors, Sponsor CRM, Sponsor Tiers, Sponsor Templates, Tickets, Orders, Ticket Types, Discount Codes, Workshops, Volunteers, Marketing, Gallery, Settings

Typing "spon" should show a "Pages" section with links to Sponsors, Sponsor CRM, Sponsor Tiers, etc.

Design Considerations

  • Group results by category (Pages, Proposals, Speakers, Sponsors, etc.) with section headers
  • Show a maximum of 3-5 results per category with a "View all" link
  • Keep keyboard navigation working across groups (arrow keys, Enter to select)
  • Maintain the existing 300ms debounce for server queries
  • Page results can be filtered client-side (static list); data results should query the server
  • Consider a unified tRPC procedure or parallel queries per data type

Technical Notes

  • Current search hook: src/components/admin/hooks/useProposalSearch.ts
  • Current modal: src/components/admin/SearchModal.tsx
  • Speakers are already loaded client-side in SpeakerTable — could reuse that pattern or add a tRPC search procedure
  • Sponsors have a tRPC router (sponsorsRouter) that could be extended with a search procedure
  • Orders search logic exists in OrdersTableWithSearch as client-side filtering

Metadata

Metadata

Assignees

No one assigned

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions