From 71182e566f532e47cde571d938d3ffb09f516239 Mon Sep 17 00:00:00 2001 From: Adam Gough Date: Sat, 13 Sep 2025 12:18:54 -0700 Subject: [PATCH] changed search for folders and workflows in logs --- .../components/filters/components/folder.tsx | 105 +++++++++------- .../filters/components/workflow.tsx | 115 ++++++++++-------- 2 files changed, 120 insertions(+), 100 deletions(-) diff --git a/apps/sim/app/workspace/[workspaceId]/logs/components/filters/components/folder.tsx b/apps/sim/app/workspace/[workspaceId]/logs/components/filters/components/folder.tsx index df73416e6a..02d943c47b 100644 --- a/apps/sim/app/workspace/[workspaceId]/logs/components/filters/components/folder.tsx +++ b/apps/sim/app/workspace/[workspaceId]/logs/components/filters/components/folder.tsx @@ -1,14 +1,21 @@ -import { useEffect, useState } from 'react' +import { useEffect, useMemo, useState } from 'react' import { Check, ChevronDown } from 'lucide-react' import { useParams } from 'next/navigation' import { Button } from '@/components/ui/button' +import { + Command, + CommandEmpty, + CommandGroup, + CommandInput, + CommandItem, + CommandList, +} from '@/components/ui/command' import { DropdownMenu, DropdownMenuContent, - DropdownMenuItem, - DropdownMenuSeparator, DropdownMenuTrigger, } from '@/components/ui/dropdown-menu' +import { createLogger } from '@/lib/logs/console/logger' import { useFolderStore } from '@/stores/folders/store' import { useFilterStore } from '@/stores/logs/filters/store' @@ -26,6 +33,8 @@ export default function FolderFilter() { const workspaceId = params.workspaceId as string const [folders, setFolders] = useState([]) const [loading, setLoading] = useState(true) + const [search, setSearch] = useState('') + const logger = useMemo(() => createLogger('LogsFolderFilter'), []) // Fetch all available folders from the API useEffect(() => { @@ -62,7 +71,7 @@ export default function FolderFilter() { setFolders(folderOptions) } } catch (error) { - console.error('Failed to fetch folders:', error) + logger.error('Failed to fetch folders', { error }) } finally { setLoading(false) } @@ -105,49 +114,53 @@ export default function FolderFilter() { - { - e.preventDefault() - clearSelections() - }} - className='flex cursor-pointer items-center justify-between rounded-md px-3 py-2 font-[380] text-card-foreground text-sm hover:bg-secondary/50 focus:bg-secondary/50' - > - All folders - {folderIds.length === 0 && } - - - {!loading && folders.length > 0 && } - - {!loading && - folders.map((folder) => ( - { - e.preventDefault() - toggleFolderId(folder.id) - }} - className='flex cursor-pointer items-center justify-between rounded-md px-3 py-2 font-[380] text-card-foreground text-sm hover:bg-secondary/50 focus:bg-secondary/50' - > -
- - {folder.path} - -
- {isFolderSelected(folder.id) && } -
- ))} - - {loading && ( - - Loading folders... - - )} + + setSearch(v)} /> + + {loading ? 'Loading folders...' : 'No folders found.'} + + { + clearSelections() + }} + className='cursor-pointer' + > + All folders + {folderIds.length === 0 && ( + + )} + + {useMemo(() => { + const q = search.trim().toLowerCase() + const filtered = q + ? folders.filter((f) => (f.path || f.name).toLowerCase().includes(q)) + : folders + return filtered.map((folder) => ( + { + toggleFolderId(folder.id) + }} + className='cursor-pointer' + > +
+ + {folder.path} + +
+ {isFolderSelected(folder.id) && ( + + )} +
+ )) + }, [folders, search, folderIds])} +
+
+
) diff --git a/apps/sim/app/workspace/[workspaceId]/logs/components/filters/components/workflow.tsx b/apps/sim/app/workspace/[workspaceId]/logs/components/filters/components/workflow.tsx index 8d4c2b6935..289ca6e593 100644 --- a/apps/sim/app/workspace/[workspaceId]/logs/components/filters/components/workflow.tsx +++ b/apps/sim/app/workspace/[workspaceId]/logs/components/filters/components/workflow.tsx @@ -1,13 +1,20 @@ -import { useEffect, useState } from 'react' +import { useEffect, useMemo, useState } from 'react' import { Check, ChevronDown } from 'lucide-react' import { Button } from '@/components/ui/button' +import { + Command, + CommandEmpty, + CommandGroup, + CommandInput, + CommandItem, + CommandList, +} from '@/components/ui/command' import { DropdownMenu, DropdownMenuContent, - DropdownMenuItem, - DropdownMenuSeparator, DropdownMenuTrigger, } from '@/components/ui/dropdown-menu' +import { createLogger } from '@/lib/logs/console/logger' import { useFilterStore } from '@/stores/logs/filters/store' interface WorkflowOption { @@ -20,6 +27,8 @@ export default function Workflow() { const { workflowIds, toggleWorkflowId, setWorkflowIds } = useFilterStore() const [workflows, setWorkflows] = useState([]) const [loading, setLoading] = useState(true) + const [search, setSearch] = useState('') + const logger = useMemo(() => createLogger('LogsWorkflowFilter'), []) // Fetch all available workflows from the API useEffect(() => { @@ -37,7 +46,7 @@ export default function Workflow() { setWorkflows(workflowOptions) } } catch (error) { - console.error('Failed to fetch workflows:', error) + logger.error('Failed to fetch workflows', { error }) } finally { setLoading(false) } @@ -80,57 +89,55 @@ export default function Workflow() { - { - e.preventDefault() - clearSelections() - }} - className='flex cursor-pointer items-center justify-between rounded-md px-3 py-2 font-[380] text-card-foreground text-sm hover:bg-secondary/50 focus:bg-secondary/50' - > - All workflows - {workflowIds.length === 0 && } - - - {!loading && workflows.length > 0 && } - - {!loading && - workflows.map((workflow) => ( - { - e.preventDefault() - toggleWorkflowId(workflow.id) - }} - className='flex cursor-pointer items-center justify-between rounded-md px-3 py-2 font-[380] text-card-foreground text-sm hover:bg-secondary/50 focus:bg-secondary/50' - > -
-
- {workflow.name} -
- {isWorkflowSelected(workflow.id) && ( - - )} - - ))} - - {loading && ( - - Loading workflows... - - )} + + setSearch(v)} /> + + {loading ? 'Loading workflows...' : 'No workflows found.'} + + { + clearSelections() + }} + className='cursor-pointer' + > + All workflows + {workflowIds.length === 0 && ( + + )} + + {useMemo(() => { + const q = search.trim().toLowerCase() + const filtered = q + ? workflows.filter((w) => w.name.toLowerCase().includes(q)) + : workflows + return filtered.map((workflow) => ( + { + toggleWorkflowId(workflow.id) + }} + className='cursor-pointer' + > +
+
+ {workflow.name} +
+ {isWorkflowSelected(workflow.id) && ( + + )} + + )) + }, [workflows, search, workflowIds])} + + + )