From 4d0f7f06bbbe2b7823735a9eefd20675647f07c9 Mon Sep 17 00:00:00 2001 From: Waleed Latif Date: Thu, 26 Mar 2026 18:52:54 -0700 Subject: [PATCH 1/4] feat(search): add tables, files, knowledge bases, and jobs to cmd-k search --- .../_components/command-items.tsx | 24 ++++++++ .../_components/search-groups.tsx | 37 +++++++++++ .../components/search-modal/search-modal.tsx | 30 +++++++++ .../sidebar/components/search-modal/utils.ts | 4 ++ .../w/components/sidebar/sidebar.tsx | 61 +++++++++++++++++++ 5 files changed, 156 insertions(+) diff --git a/apps/sim/app/workspace/[workspaceId]/w/components/sidebar/components/search-modal/_components/command-items.tsx b/apps/sim/app/workspace/[workspaceId]/w/components/sidebar/components/search-modal/_components/command-items.tsx index 173fe888e50..7cdffe5bd57 100644 --- a/apps/sim/app/workspace/[workspaceId]/w/components/sidebar/components/search-modal/_components/command-items.tsx +++ b/apps/sim/app/workspace/[workspaceId]/w/components/sidebar/components/search-modal/_components/command-items.tsx @@ -163,3 +163,27 @@ export const MemoizedPageItem = memo( prev.name === next.name && prev.shortcut === next.shortcut ) + +export const MemoizedIconItem = memo( + function IconItem({ + value, + onSelect, + name, + icon: Icon, + }: { + value: string + onSelect: () => void + name: string + icon: ComponentType<{ className?: string }> + }) { + return ( + +
+ +
+ {name} +
+ ) + }, + (prev, next) => prev.value === next.value && prev.name === next.name && prev.icon === next.icon +) diff --git a/apps/sim/app/workspace/[workspaceId]/w/components/sidebar/components/search-modal/_components/search-groups.tsx b/apps/sim/app/workspace/[workspaceId]/w/components/sidebar/components/search-modal/_components/search-groups.tsx index 23b04b2a11c..0768895359e 100644 --- a/apps/sim/app/workspace/[workspaceId]/w/components/sidebar/components/search-modal/_components/search-groups.tsx +++ b/apps/sim/app/workspace/[workspaceId]/w/components/sidebar/components/search-modal/_components/search-groups.tsx @@ -1,7 +1,9 @@ 'use client' +import type { ComponentType } from 'react' import { memo } from 'react' import { Command } from 'cmdk' +import { Calendar, Database, File, Table } from '@/components/emcn/icons' import type { SearchBlockItem, SearchDocItem, @@ -11,6 +13,7 @@ import type { PageItem, TaskItem, WorkflowItem, WorkspaceItem } from '../utils' import { GROUP_HEADING_CLASSNAME } from '../utils' import { MemoizedCommandItem, + MemoizedIconItem, MemoizedPageItem, MemoizedTaskItem, MemoizedWorkflowItem, @@ -239,3 +242,37 @@ export const PagesGroup = memo(function PagesGroup({ ) }) + +export const TablesGroup = createIconGroup('Tables', 'table', Table) +export const FilesGroup = createIconGroup('Files', 'file', File) +export const KnowledgeBasesGroup = createIconGroup('Knowledge Bases', 'knowledge-base', Database) +export const JobsGroup = createIconGroup('Jobs', 'job', Calendar) + +function createIconGroup( + heading: string, + prefix: string, + icon: ComponentType<{ className?: string }> +) { + return memo(function IconGroup({ + items, + onSelect, + }: { + items: TaskItem[] + onSelect: (item: TaskItem) => void + }) { + if (items.length === 0) return null + return ( + + {items.map((item) => ( + onSelect(item)} + name={item.name} + icon={icon} + /> + ))} + + ) + }) +} diff --git a/apps/sim/app/workspace/[workspaceId]/w/components/sidebar/components/search-modal/search-modal.tsx b/apps/sim/app/workspace/[workspaceId]/w/components/sidebar/components/search-modal/search-modal.tsx index 95c4ee1e221..694113427b4 100644 --- a/apps/sim/app/workspace/[workspaceId]/w/components/sidebar/components/search-modal/search-modal.tsx +++ b/apps/sim/app/workspace/[workspaceId]/w/components/sidebar/components/search-modal/search-modal.tsx @@ -21,7 +21,11 @@ import type { import { BlocksGroup, DocsGroup, + FilesGroup, + JobsGroup, + KnowledgeBasesGroup, PagesGroup, + TablesGroup, TasksGroup, ToolOpsGroup, ToolsGroup, @@ -40,6 +44,10 @@ export function SearchModal({ workflows = [], workspaces = [], tasks = [], + tables = [], + files = [], + knowledgeBases = [], + jobs = [], isOnWorkflowPage = false, }: SearchModalProps) { const params = useParams() @@ -284,6 +292,24 @@ export function SearchModal({ return filterAndSort(docs, (d) => `${d.name} docs documentation doc-${d.id}`, deferredSearch) }, [isOnWorkflowPage, docs, deferredSearch]) + const filteredTables = useMemo( + () => filterAndSort(tables, (t) => `${t.name} table-${t.id}`, deferredSearch), + [tables, deferredSearch] + ) + const filteredFiles = useMemo( + () => filterAndSort(files, (f) => `${f.name} file-${f.id}`, deferredSearch), + [files, deferredSearch] + ) + const filteredKnowledgeBases = useMemo( + () => + filterAndSort(knowledgeBases, (kb) => `${kb.name} knowledge-base-${kb.id}`, deferredSearch), + [knowledgeBases, deferredSearch] + ) + const filteredJobs = useMemo( + () => filterAndSort(jobs, (j) => `${j.name} job-${j.id}`, deferredSearch), + [jobs, deferredSearch] + ) + const filteredWorkflows = useMemo( () => filterAndSort(workflows, (w) => `${w.name} workflow-${w.id}`, deferredSearch), [workflows, deferredSearch] @@ -346,6 +372,10 @@ export function SearchModal({ + + + + diff --git a/apps/sim/app/workspace/[workspaceId]/w/components/sidebar/components/search-modal/utils.ts b/apps/sim/app/workspace/[workspaceId]/w/components/sidebar/components/search-modal/utils.ts index 52ba1488d28..9f2c727cccb 100644 --- a/apps/sim/app/workspace/[workspaceId]/w/components/sidebar/components/search-modal/utils.ts +++ b/apps/sim/app/workspace/[workspaceId]/w/components/sidebar/components/search-modal/utils.ts @@ -37,6 +37,10 @@ export interface SearchModalProps { workflows?: WorkflowItem[] workspaces?: WorkspaceItem[] tasks?: TaskItem[] + tables?: TaskItem[] + files?: TaskItem[] + knowledgeBases?: TaskItem[] + jobs?: TaskItem[] isOnWorkflowPage?: boolean } diff --git a/apps/sim/app/workspace/[workspaceId]/w/components/sidebar/sidebar.tsx b/apps/sim/app/workspace/[workspaceId]/w/components/sidebar/sidebar.tsx index 407e47f034c..c5f625180db 100644 --- a/apps/sim/app/workspace/[workspaceId]/w/components/sidebar/sidebar.tsx +++ b/apps/sim/app/workspace/[workspaceId]/w/components/sidebar/sidebar.tsx @@ -77,6 +77,9 @@ import { } from '@/app/workspace/[workspaceId]/w/hooks' import { getBrandConfig } from '@/ee/whitelabeling' import { useFolders } from '@/hooks/queries/folders' +import { useKnowledgeBasesQuery } from '@/hooks/queries/kb/knowledge' +import { useWorkspaceSchedules } from '@/hooks/queries/schedules' +import { useTablesList } from '@/hooks/queries/tables' import { useDeleteTask, useDeleteTasks, @@ -85,6 +88,7 @@ import { useRenameTask, useTasks, } from '@/hooks/queries/tasks' +import { useWorkspaceFiles } from '@/hooks/queries/workspace-files' import { usePermissionConfig } from '@/hooks/use-permission-config' import { useSettingsNavigation } from '@/hooks/use-settings-navigation' import { useTaskEvents } from '@/hooks/use-task-events' @@ -745,6 +749,59 @@ export const Sidebar = memo(function Sidebar() { [fetchedTasks, workspaceId] ) + const { data: fetchedTables = [] } = useTablesList(workspaceId) + const { data: fetchedFiles = [] } = useWorkspaceFiles(workspaceId) + const { data: fetchedKnowledgeBases = [] } = useKnowledgeBasesQuery(workspaceId) + const { data: fetchedSchedules = [] } = useWorkspaceSchedules(workspaceId) + + const searchModalTables = useMemo( + () => + permissionConfig.hideTablesTab + ? [] + : fetchedTables.map((t) => ({ + id: t.id, + name: t.name, + href: `/workspace/${workspaceId}/tables/${t.id}`, + })), + [fetchedTables, workspaceId, permissionConfig.hideTablesTab] + ) + + const searchModalFiles = useMemo( + () => + permissionConfig.hideFilesTab + ? [] + : fetchedFiles.map((f) => ({ + id: f.id, + name: f.name, + href: `/workspace/${workspaceId}/files`, + })), + [fetchedFiles, workspaceId, permissionConfig.hideFilesTab] + ) + + const searchModalKnowledgeBases = useMemo( + () => + permissionConfig.hideKnowledgeBaseTab + ? [] + : fetchedKnowledgeBases.map((kb) => ({ + id: kb.id, + name: kb.name, + href: `/workspace/${workspaceId}/knowledge/${kb.id}`, + })), + [fetchedKnowledgeBases, workspaceId, permissionConfig.hideKnowledgeBaseTab] + ) + + const searchModalJobs = useMemo( + () => + fetchedSchedules + .filter((s) => s.sourceType === 'job') + .map((s) => ({ + id: s.id, + name: s.jobTitle || 'Untitled Job', + href: `/workspace/${workspaceId}/scheduled-tasks`, + })), + [fetchedSchedules, workspaceId] + ) + const taskIds = useMemo(() => tasks.map((t) => t.id).filter((id) => id !== 'new'), [tasks]) const { selectedTasks, handleTaskClick } = useTaskSelection({ taskIds }) @@ -1671,6 +1728,10 @@ export const Sidebar = memo(function Sidebar() { workflows={searchModalWorkflows} workspaces={searchModalWorkspaces} tasks={tasks} + tables={searchModalTables} + files={searchModalFiles} + knowledgeBases={searchModalKnowledgeBases} + jobs={searchModalJobs} isOnWorkflowPage={!!workflowId} /> From 8ef440bc352b43f1563f12f7558876bd448562b6 Mon Sep 17 00:00:00 2001 From: Waleed Latif Date: Thu, 26 Mar 2026 18:59:30 -0700 Subject: [PATCH 2/4] =?UTF-8?q?fix(search):=20address=20PR=20feedback=20?= =?UTF-8?q?=E2=80=94=20drop=20files/jobs,=20add=20onSelect=20to=20memo?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../_components/command-items.tsx | 6 +++- .../_components/search-groups.tsx | 4 +-- .../components/search-modal/search-modal.tsx | 14 --------- .../sidebar/components/search-modal/utils.ts | 2 -- .../w/components/sidebar/sidebar.tsx | 30 ------------------- 5 files changed, 6 insertions(+), 50 deletions(-) diff --git a/apps/sim/app/workspace/[workspaceId]/w/components/sidebar/components/search-modal/_components/command-items.tsx b/apps/sim/app/workspace/[workspaceId]/w/components/sidebar/components/search-modal/_components/command-items.tsx index 7cdffe5bd57..fcfb43a5391 100644 --- a/apps/sim/app/workspace/[workspaceId]/w/components/sidebar/components/search-modal/_components/command-items.tsx +++ b/apps/sim/app/workspace/[workspaceId]/w/components/sidebar/components/search-modal/_components/command-items.tsx @@ -185,5 +185,9 @@ export const MemoizedIconItem = memo( ) }, - (prev, next) => prev.value === next.value && prev.name === next.name && prev.icon === next.icon + (prev, next) => + prev.value === next.value && + prev.name === next.name && + prev.icon === next.icon && + prev.onSelect === next.onSelect ) diff --git a/apps/sim/app/workspace/[workspaceId]/w/components/sidebar/components/search-modal/_components/search-groups.tsx b/apps/sim/app/workspace/[workspaceId]/w/components/sidebar/components/search-modal/_components/search-groups.tsx index 0768895359e..87d6f51b850 100644 --- a/apps/sim/app/workspace/[workspaceId]/w/components/sidebar/components/search-modal/_components/search-groups.tsx +++ b/apps/sim/app/workspace/[workspaceId]/w/components/sidebar/components/search-modal/_components/search-groups.tsx @@ -3,7 +3,7 @@ import type { ComponentType } from 'react' import { memo } from 'react' import { Command } from 'cmdk' -import { Calendar, Database, File, Table } from '@/components/emcn/icons' +import { Database, Table } from '@/components/emcn/icons' import type { SearchBlockItem, SearchDocItem, @@ -244,9 +244,7 @@ export const PagesGroup = memo(function PagesGroup({ }) export const TablesGroup = createIconGroup('Tables', 'table', Table) -export const FilesGroup = createIconGroup('Files', 'file', File) export const KnowledgeBasesGroup = createIconGroup('Knowledge Bases', 'knowledge-base', Database) -export const JobsGroup = createIconGroup('Jobs', 'job', Calendar) function createIconGroup( heading: string, diff --git a/apps/sim/app/workspace/[workspaceId]/w/components/sidebar/components/search-modal/search-modal.tsx b/apps/sim/app/workspace/[workspaceId]/w/components/sidebar/components/search-modal/search-modal.tsx index 694113427b4..d5c4ee32838 100644 --- a/apps/sim/app/workspace/[workspaceId]/w/components/sidebar/components/search-modal/search-modal.tsx +++ b/apps/sim/app/workspace/[workspaceId]/w/components/sidebar/components/search-modal/search-modal.tsx @@ -21,8 +21,6 @@ import type { import { BlocksGroup, DocsGroup, - FilesGroup, - JobsGroup, KnowledgeBasesGroup, PagesGroup, TablesGroup, @@ -45,9 +43,7 @@ export function SearchModal({ workspaces = [], tasks = [], tables = [], - files = [], knowledgeBases = [], - jobs = [], isOnWorkflowPage = false, }: SearchModalProps) { const params = useParams() @@ -296,19 +292,11 @@ export function SearchModal({ () => filterAndSort(tables, (t) => `${t.name} table-${t.id}`, deferredSearch), [tables, deferredSearch] ) - const filteredFiles = useMemo( - () => filterAndSort(files, (f) => `${f.name} file-${f.id}`, deferredSearch), - [files, deferredSearch] - ) const filteredKnowledgeBases = useMemo( () => filterAndSort(knowledgeBases, (kb) => `${kb.name} knowledge-base-${kb.id}`, deferredSearch), [knowledgeBases, deferredSearch] ) - const filteredJobs = useMemo( - () => filterAndSort(jobs, (j) => `${j.name} job-${j.id}`, deferredSearch), - [jobs, deferredSearch] - ) const filteredWorkflows = useMemo( () => filterAndSort(workflows, (w) => `${w.name} workflow-${w.id}`, deferredSearch), @@ -373,9 +361,7 @@ export function SearchModal({ - - diff --git a/apps/sim/app/workspace/[workspaceId]/w/components/sidebar/components/search-modal/utils.ts b/apps/sim/app/workspace/[workspaceId]/w/components/sidebar/components/search-modal/utils.ts index 9f2c727cccb..cb1017af1dc 100644 --- a/apps/sim/app/workspace/[workspaceId]/w/components/sidebar/components/search-modal/utils.ts +++ b/apps/sim/app/workspace/[workspaceId]/w/components/sidebar/components/search-modal/utils.ts @@ -38,9 +38,7 @@ export interface SearchModalProps { workspaces?: WorkspaceItem[] tasks?: TaskItem[] tables?: TaskItem[] - files?: TaskItem[] knowledgeBases?: TaskItem[] - jobs?: TaskItem[] isOnWorkflowPage?: boolean } diff --git a/apps/sim/app/workspace/[workspaceId]/w/components/sidebar/sidebar.tsx b/apps/sim/app/workspace/[workspaceId]/w/components/sidebar/sidebar.tsx index c5f625180db..50d0615ff32 100644 --- a/apps/sim/app/workspace/[workspaceId]/w/components/sidebar/sidebar.tsx +++ b/apps/sim/app/workspace/[workspaceId]/w/components/sidebar/sidebar.tsx @@ -78,7 +78,6 @@ import { import { getBrandConfig } from '@/ee/whitelabeling' import { useFolders } from '@/hooks/queries/folders' import { useKnowledgeBasesQuery } from '@/hooks/queries/kb/knowledge' -import { useWorkspaceSchedules } from '@/hooks/queries/schedules' import { useTablesList } from '@/hooks/queries/tables' import { useDeleteTask, @@ -88,7 +87,6 @@ import { useRenameTask, useTasks, } from '@/hooks/queries/tasks' -import { useWorkspaceFiles } from '@/hooks/queries/workspace-files' import { usePermissionConfig } from '@/hooks/use-permission-config' import { useSettingsNavigation } from '@/hooks/use-settings-navigation' import { useTaskEvents } from '@/hooks/use-task-events' @@ -750,9 +748,7 @@ export const Sidebar = memo(function Sidebar() { ) const { data: fetchedTables = [] } = useTablesList(workspaceId) - const { data: fetchedFiles = [] } = useWorkspaceFiles(workspaceId) const { data: fetchedKnowledgeBases = [] } = useKnowledgeBasesQuery(workspaceId) - const { data: fetchedSchedules = [] } = useWorkspaceSchedules(workspaceId) const searchModalTables = useMemo( () => @@ -766,18 +762,6 @@ export const Sidebar = memo(function Sidebar() { [fetchedTables, workspaceId, permissionConfig.hideTablesTab] ) - const searchModalFiles = useMemo( - () => - permissionConfig.hideFilesTab - ? [] - : fetchedFiles.map((f) => ({ - id: f.id, - name: f.name, - href: `/workspace/${workspaceId}/files`, - })), - [fetchedFiles, workspaceId, permissionConfig.hideFilesTab] - ) - const searchModalKnowledgeBases = useMemo( () => permissionConfig.hideKnowledgeBaseTab @@ -790,18 +774,6 @@ export const Sidebar = memo(function Sidebar() { [fetchedKnowledgeBases, workspaceId, permissionConfig.hideKnowledgeBaseTab] ) - const searchModalJobs = useMemo( - () => - fetchedSchedules - .filter((s) => s.sourceType === 'job') - .map((s) => ({ - id: s.id, - name: s.jobTitle || 'Untitled Job', - href: `/workspace/${workspaceId}/scheduled-tasks`, - })), - [fetchedSchedules, workspaceId] - ) - const taskIds = useMemo(() => tasks.map((t) => t.id).filter((id) => id !== 'new'), [tasks]) const { selectedTasks, handleTaskClick } = useTaskSelection({ taskIds }) @@ -1729,9 +1701,7 @@ export const Sidebar = memo(function Sidebar() { workspaces={searchModalWorkspaces} tasks={tasks} tables={searchModalTables} - files={searchModalFiles} knowledgeBases={searchModalKnowledgeBases} - jobs={searchModalJobs} isOnWorkflowPage={!!workflowId} /> From 2100c8565562f9a85ce94ccb5f86a6e5e528e6f2 Mon Sep 17 00:00:00 2001 From: Waleed Latif Date: Thu, 26 Mar 2026 19:03:56 -0700 Subject: [PATCH 3/4] fix(search): add files back with per-file deep links, keep jobs out --- .../search-modal/_components/search-groups.tsx | 3 ++- .../components/search-modal/search-modal.tsx | 7 +++++++ .../sidebar/components/search-modal/utils.ts | 1 + .../w/components/sidebar/sidebar.tsx | 15 +++++++++++++++ 4 files changed, 25 insertions(+), 1 deletion(-) diff --git a/apps/sim/app/workspace/[workspaceId]/w/components/sidebar/components/search-modal/_components/search-groups.tsx b/apps/sim/app/workspace/[workspaceId]/w/components/sidebar/components/search-modal/_components/search-groups.tsx index 87d6f51b850..d8bebbbcb9a 100644 --- a/apps/sim/app/workspace/[workspaceId]/w/components/sidebar/components/search-modal/_components/search-groups.tsx +++ b/apps/sim/app/workspace/[workspaceId]/w/components/sidebar/components/search-modal/_components/search-groups.tsx @@ -3,7 +3,7 @@ import type { ComponentType } from 'react' import { memo } from 'react' import { Command } from 'cmdk' -import { Database, Table } from '@/components/emcn/icons' +import { Database, File, Table } from '@/components/emcn/icons' import type { SearchBlockItem, SearchDocItem, @@ -244,6 +244,7 @@ export const PagesGroup = memo(function PagesGroup({ }) export const TablesGroup = createIconGroup('Tables', 'table', Table) +export const FilesGroup = createIconGroup('Files', 'file', File) export const KnowledgeBasesGroup = createIconGroup('Knowledge Bases', 'knowledge-base', Database) function createIconGroup( diff --git a/apps/sim/app/workspace/[workspaceId]/w/components/sidebar/components/search-modal/search-modal.tsx b/apps/sim/app/workspace/[workspaceId]/w/components/sidebar/components/search-modal/search-modal.tsx index d5c4ee32838..838083bec01 100644 --- a/apps/sim/app/workspace/[workspaceId]/w/components/sidebar/components/search-modal/search-modal.tsx +++ b/apps/sim/app/workspace/[workspaceId]/w/components/sidebar/components/search-modal/search-modal.tsx @@ -21,6 +21,7 @@ import type { import { BlocksGroup, DocsGroup, + FilesGroup, KnowledgeBasesGroup, PagesGroup, TablesGroup, @@ -43,6 +44,7 @@ export function SearchModal({ workspaces = [], tasks = [], tables = [], + files = [], knowledgeBases = [], isOnWorkflowPage = false, }: SearchModalProps) { @@ -292,6 +294,10 @@ export function SearchModal({ () => filterAndSort(tables, (t) => `${t.name} table-${t.id}`, deferredSearch), [tables, deferredSearch] ) + const filteredFiles = useMemo( + () => filterAndSort(files, (f) => `${f.name} file-${f.id}`, deferredSearch), + [files, deferredSearch] + ) const filteredKnowledgeBases = useMemo( () => filterAndSort(knowledgeBases, (kb) => `${kb.name} knowledge-base-${kb.id}`, deferredSearch), @@ -361,6 +367,7 @@ export function SearchModal({ + diff --git a/apps/sim/app/workspace/[workspaceId]/w/components/sidebar/components/search-modal/utils.ts b/apps/sim/app/workspace/[workspaceId]/w/components/sidebar/components/search-modal/utils.ts index cb1017af1dc..ec646f1d033 100644 --- a/apps/sim/app/workspace/[workspaceId]/w/components/sidebar/components/search-modal/utils.ts +++ b/apps/sim/app/workspace/[workspaceId]/w/components/sidebar/components/search-modal/utils.ts @@ -38,6 +38,7 @@ export interface SearchModalProps { workspaces?: WorkspaceItem[] tasks?: TaskItem[] tables?: TaskItem[] + files?: TaskItem[] knowledgeBases?: TaskItem[] isOnWorkflowPage?: boolean } diff --git a/apps/sim/app/workspace/[workspaceId]/w/components/sidebar/sidebar.tsx b/apps/sim/app/workspace/[workspaceId]/w/components/sidebar/sidebar.tsx index 50d0615ff32..c54b9256783 100644 --- a/apps/sim/app/workspace/[workspaceId]/w/components/sidebar/sidebar.tsx +++ b/apps/sim/app/workspace/[workspaceId]/w/components/sidebar/sidebar.tsx @@ -87,6 +87,7 @@ import { useRenameTask, useTasks, } from '@/hooks/queries/tasks' +import { useWorkspaceFiles } from '@/hooks/queries/workspace-files' import { usePermissionConfig } from '@/hooks/use-permission-config' import { useSettingsNavigation } from '@/hooks/use-settings-navigation' import { useTaskEvents } from '@/hooks/use-task-events' @@ -748,6 +749,7 @@ export const Sidebar = memo(function Sidebar() { ) const { data: fetchedTables = [] } = useTablesList(workspaceId) + const { data: fetchedFiles = [] } = useWorkspaceFiles(workspaceId) const { data: fetchedKnowledgeBases = [] } = useKnowledgeBasesQuery(workspaceId) const searchModalTables = useMemo( @@ -762,6 +764,18 @@ export const Sidebar = memo(function Sidebar() { [fetchedTables, workspaceId, permissionConfig.hideTablesTab] ) + const searchModalFiles = useMemo( + () => + permissionConfig.hideFilesTab + ? [] + : fetchedFiles.map((f) => ({ + id: f.id, + name: f.name, + href: `/workspace/${workspaceId}/files/${f.id}`, + })), + [fetchedFiles, workspaceId, permissionConfig.hideFilesTab] + ) + const searchModalKnowledgeBases = useMemo( () => permissionConfig.hideKnowledgeBaseTab @@ -1701,6 +1715,7 @@ export const Sidebar = memo(function Sidebar() { workspaces={searchModalWorkspaces} tasks={tasks} tables={searchModalTables} + files={searchModalFiles} knowledgeBases={searchModalKnowledgeBases} isOnWorkflowPage={!!workflowId} /> From 86eb3e5a16505e03f7aa0be4d5f869034fe242a3 Mon Sep 17 00:00:00 2001 From: Waleed Latif Date: Thu, 26 Mar 2026 19:17:54 -0700 Subject: [PATCH 4/4] fix(search): remove onSelect from memo comparator to match existing pattern --- .../components/search-modal/_components/command-items.tsx | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/apps/sim/app/workspace/[workspaceId]/w/components/sidebar/components/search-modal/_components/command-items.tsx b/apps/sim/app/workspace/[workspaceId]/w/components/sidebar/components/search-modal/_components/command-items.tsx index fcfb43a5391..7cdffe5bd57 100644 --- a/apps/sim/app/workspace/[workspaceId]/w/components/sidebar/components/search-modal/_components/command-items.tsx +++ b/apps/sim/app/workspace/[workspaceId]/w/components/sidebar/components/search-modal/_components/command-items.tsx @@ -185,9 +185,5 @@ export const MemoizedIconItem = memo( ) }, - (prev, next) => - prev.value === next.value && - prev.name === next.name && - prev.icon === next.icon && - prev.onSelect === next.onSelect + (prev, next) => prev.value === next.value && prev.name === next.name && prev.icon === next.icon )