Add object type filter dropdown to side panel record searches (#18912)

## Summary

- Adds an object type filter dropdown to the side panel, allowing users
to scope record search results to a specific object type (e.g. People,
Companies, Opportunities)
- The filter appears as a funnel icon next to the search input in both
the global search (SearchRecords page) and the "Pick a record" sidebar
flow
- Replaces the AI sparkles button on the search records page with the
filter icon
- Uses colored icons matching the navigation menu style
(NavigationMenuItemStyleIcon + getStandardObjectIconColor)

## Test plan

- [ ] Open the side panel, type something to enter SearchRecords mode,
verify the filter icon appears
- [ ] Click the filter icon, verify the dropdown opens with "Object"
header, search input, "All Objects" and individual object types with
colored icons
- [ ] Select an object type, verify only records of that type appear in
search results
- [ ] Select "All Objects", verify all record types appear again
- [ ] Verify the filter icon turns blue when a filter is active
- [ ] In layout customization mode, add a new sidebar item > Record,
verify the filter dropdown also works there
- [ ] Close and reopen the side panel, verify the filter resets to "All
Objects"
- [ ] Verify the AI sparkles button no longer appears on the command
menu root page
- [ ] Verify the AI edit icon still appears on Ask AI pages


Made with [Cursor](https://cursor.com)
This commit is contained in:
Félix Malfait
2026-03-25 16:02:24 +01:00
committed by GitHub
parent 13ea3ec75c
commit 5f0d6553f6
26 changed files with 641 additions and 98 deletions
@@ -0,0 +1,23 @@
// TODO: These objects are tied to connected accounts and have channel-based visibility
// settings (MessageChannelVisibility / CalendarChannelVisibility) that control what data
// workspace members can see. The global search service does not yet enforce these visibility
// rules, so we exclude these objects from explicit search inclusion to prevent leaking
// restricted content (e.g. message subjects, calendar event titles).
// Once the search service properly joins channel tables and applies visibility filtering,
// this list can be removed.
export const OBJECTS_WITH_CHANNEL_VISIBILITY_CONSTRAINTS = [
'blocklist',
'connectedAccount',
'message',
'messageThread',
'messageChannel',
'messageParticipant',
'messageFolder',
'messageChannelMessageAssociation',
'messageChannelMessageAssociationMessageFolder',
'messageThreadSubscriber',
'calendarEvent',
'calendarChannel',
'calendarChannelEventAssociation',
'calendarEventParticipant',
] as const;
@@ -32,6 +32,7 @@ export { LABEL_IDENTIFIER_FIELD_METADATA_TYPES } from './LabelIdentifierFieldMet
export { MULTI_ITEM_FIELD_DEFAULT_MAX_VALUES } from './MultiItemFieldDefaultMaxValues';
export { MULTI_ITEM_FIELD_MIN_MAX_VALUES } from './MultiItemFieldMinMaxValues';
export { MUTATION_MAX_MERGE_RECORDS } from './MutationMaxMergeRecords';
export { OBJECTS_WITH_CHANNEL_VISIBILITY_CONSTRAINTS } from './ObjectsWithChannelVisibilityConstraints';
export { PermissionFlagType } from './PermissionFlagType';
export { PermissionsOnAllObjectRecords } from './PermissionsOnAllObjectRecords';
export { QUERY_DEFAULT_LIMIT_RECORDS } from './QueryDefaultLimitRecords';