diff --git a/app/w/[id]/components/workflow-block/components/sub-block/components/code.tsx b/app/w/[id]/components/workflow-block/components/sub-block/components/code.tsx index f7e684a084..842dea2c31 100644 --- a/app/w/[id]/components/workflow-block/components/sub-block/components/code.tsx +++ b/app/w/[id]/components/workflow-block/components/sub-block/components/code.tsx @@ -1,8 +1,10 @@ import { useEffect, useRef, useState } from 'react' +import { ChevronDown, ChevronUp } from 'lucide-react' import { highlight, languages } from 'prismjs' import 'prismjs/components/prism-javascript' import 'prismjs/themes/prism.css' import Editor from 'react-simple-code-editor' +import { Button } from '@/components/ui/button' import { EnvVarDropdown, checkEnvVarTrigger } from '@/components/ui/env-var-dropdown' import { TagDropdown, checkTagTrigger } from '@/components/ui/tag-dropdown' import { cn } from '@/lib/utils' @@ -12,9 +14,10 @@ interface CodeProps { blockId: string subBlockId: string isConnecting: boolean + minimizable?: boolean } -export function Code({ blockId, subBlockId, isConnecting }: CodeProps) { +export function Code({ blockId, subBlockId, isConnecting, minimizable }: CodeProps) { const [storeValue, setStoreValue] = useSubBlockValue(blockId, subBlockId) const [code, setCode] = useState('') const [lineCount, setLineCount] = useState(1) @@ -23,6 +26,7 @@ export function Code({ blockId, subBlockId, isConnecting }: CodeProps) { const [searchTerm, setSearchTerm] = useState('') const [cursorPosition, setCursorPosition] = useState(0) const [activeSourceBlockId, setActiveSourceBlockId] = useState(null) + const [isMinimized, setIsMinimized] = useState(false) const editorRef = useRef(null) // Add new state for tracking visual line heights @@ -186,98 +190,132 @@ export function Code({ blockId, subBlockId, isConnecting }: CodeProps) { return (
e.preventDefault()} onDrop={handleDrop} > - {/* Updated line numbers */} - + {minimizable && code.length > 0 && ( + + )} -
- {code.length === 0 && ( -
- Write JavaScript... + {isMinimized && minimizable && code.length > 0 ? ( +
+
+ {}} + highlight={(code) => highlight(code, languages.javascript, 'javascript')} + padding={0} + style={{ + fontFamily: 'inherit', + maxHeight: '80px', + lineHeight: '21px', + }} + className="focus:outline-none pointer-events-none" + textareaClassName="focus:outline-none focus:ring-0 bg-transparent opacity-50" + readOnly + /> +
+
+
+ ) : ( + <> + {/* Line numbers */} + - )} - { - setCode(newCode) - setStoreValue(newCode) - // Check for tag trigger and environment variable trigger - const textarea = editorRef.current?.querySelector('textarea') - if (textarea) { - const pos = textarea.selectionStart - setCursorPosition(pos) +
+ {code.length === 0 && ( +
+ Write JavaScript... +
+ )} + { + setCode(newCode) + setStoreValue(newCode) - // Tag trigger check - const tagTrigger = checkTagTrigger(newCode, pos) - setShowTags(tagTrigger.show) - if (!tagTrigger.show) { - setActiveSourceBlockId(null) - } + // Check for tag trigger and environment variable trigger + const textarea = editorRef.current?.querySelector('textarea') + if (textarea) { + const pos = textarea.selectionStart + setCursorPosition(pos) - // Environment variable trigger check - const envVarTrigger = checkEnvVarTrigger(newCode, pos) - setShowEnvVars(envVarTrigger.show) - setSearchTerm(envVarTrigger.show ? envVarTrigger.searchTerm : '') - } - }} - onKeyDown={(e) => { - if (e.key === 'Escape') { - setShowTags(false) - setShowEnvVars(false) - } - }} - highlight={(code) => highlight(code, languages.javascript, 'javascript')} - padding={12} - style={{ - fontFamily: 'inherit', - minHeight: '46px', - lineHeight: '21px', - }} - className="focus:outline-none" - textareaClassName="focus:outline-none focus:ring-0 bg-transparent" - /> + // Tag trigger check + const tagTrigger = checkTagTrigger(newCode, pos) + setShowTags(tagTrigger.show) + if (!tagTrigger.show) { + setActiveSourceBlockId(null) + } - {showEnvVars && ( - { - setShowEnvVars(false) - setSearchTerm('') - }} - /> - )} + // Environment variable trigger check + const envVarTrigger = checkEnvVarTrigger(newCode, pos) + setShowEnvVars(envVarTrigger.show) + setSearchTerm(envVarTrigger.show ? envVarTrigger.searchTerm : '') + } + }} + onKeyDown={(e) => { + if (e.key === 'Escape') { + setShowTags(false) + setShowEnvVars(false) + } + }} + highlight={(code) => highlight(code, languages.javascript, 'javascript')} + padding={12} + style={{ + fontFamily: 'inherit', + minHeight: '46px', + lineHeight: '21px', + }} + className="focus:outline-none" + textareaClassName="focus:outline-none focus:ring-0 bg-transparent" + /> - {showTags && ( - { - setShowTags(false) - setActiveSourceBlockId(null) - }} - /> - )} -
+ {showEnvVars && ( + { + setShowEnvVars(false) + setSearchTerm('') + }} + /> + )} + + {showTags && ( + { + setShowTags(false) + setActiveSourceBlockId(null) + }} + /> + )} +
+ + )}
) } diff --git a/app/w/[id]/components/workflow-block/components/sub-block/sub-block.tsx b/app/w/[id]/components/workflow-block/components/sub-block/sub-block.tsx index adb74f6fd8..af8e178122 100644 --- a/app/w/[id]/components/workflow-block/components/sub-block/sub-block.tsx +++ b/app/w/[id]/components/workflow-block/components/sub-block/sub-block.tsx @@ -67,7 +67,14 @@ export function SubBlock({ blockId, config, isConnecting }: SubBlockProps) { case 'table': return case 'code': - return + return ( + + ) case 'switch': return case 'tool-input': diff --git a/blocks/blocks/agent.ts b/blocks/blocks/agent.ts index e8c0839260..a50474b35f 100644 --- a/blocks/blocks/agent.ts +++ b/blocks/blocks/agent.ts @@ -198,6 +198,7 @@ export const AgentBlock: BlockConfig = { title: 'Response Format', type: 'code', layout: 'full', + minimizable: true, placeholder: `{ "fields": [ { diff --git a/blocks/types.ts b/blocks/types.ts index 3302e7730a..0c27626610 100644 --- a/blocks/types.ts +++ b/blocks/types.ts @@ -78,6 +78,7 @@ export interface SubBlockConfig { outputHandle?: boolean hidden?: boolean value?: (params: Record) => string + minimizable?: boolean } export interface BlockConfig {