-
Notifications
You must be signed in to change notification settings - Fork 1
Open
Labels
Description
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
OrdersTableWithSearchas client-side filtering
Reactions are currently unavailable