Skip to content

Commit 9228500

Browse files
committed
enriched workflow preview
1 parent fa952df commit 9228500

File tree

42 files changed

+945
-626
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

42 files changed

+945
-626
lines changed

apps/sim/app/templates/[id]/template.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,7 @@ import { useSession } from '@/lib/auth/auth-client'
3636
import { cn } from '@/lib/core/utils/cn'
3737
import { getBaseUrl } from '@/lib/core/utils/urls'
3838
import type { CredentialRequirement } from '@/lib/workflows/credentials/credential-extractor'
39-
import { WorkflowPreview } from '@/app/workspace/[workspaceId]/w/components/workflow-preview/workflow-preview'
39+
import { WorkflowPreview } from '@/app/workspace/[workspaceId]/w/components/preview'
4040
import { getBlock } from '@/blocks/registry'
4141
import { useStarTemplate, useTemplate } from '@/hooks/queries/templates'
4242

apps/sim/app/templates/components/template-card.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ import { Star, User } from 'lucide-react'
44
import { useParams, useRouter } from 'next/navigation'
55
import { VerifiedBadge } from '@/components/ui/verified-badge'
66
import { cn } from '@/lib/core/utils/cn'
7-
import { WorkflowPreview } from '@/app/workspace/[workspaceId]/w/components/workflow-preview/workflow-preview'
7+
import { WorkflowPreview } from '@/app/workspace/[workspaceId]/w/components/preview'
88
import { getBlock } from '@/blocks/registry'
99
import { useStarTemplate } from '@/hooks/queries/templates'
1010
import type { WorkflowState } from '@/stores/workflows/workflow/types'

apps/sim/app/workspace/[workspaceId]/logs/components/index.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
export { Dashboard } from './dashboard'
22
export { LogDetails } from './log-details'
3+
export { ExecutionSnapshot } from './log-details/components/execution-snapshot'
34
export { FileCards } from './log-details/components/file-download'
4-
export { FrozenCanvas } from './log-details/components/frozen-canvas'
55
export { TraceSpans } from './log-details/components/trace-spans'
66
export { LogRowContextMenu } from './log-row-context-menu'
77
export { LogsList } from './logs-list'

apps/sim/app/workspace/[workspaceId]/logs/components/log-details/components/frozen-canvas/frozen-canvas.tsx renamed to apps/sim/app/workspace/[workspaceId]/logs/components/log-details/components/execution-snapshot/execution-snapshot.tsx

Lines changed: 31 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -6,11 +6,13 @@ import { AlertCircle, Loader2 } from 'lucide-react'
66
import { Modal, ModalBody, ModalContent, ModalHeader } from '@/components/emcn'
77
import { redactApiKeys } from '@/lib/core/security/redaction'
88
import { cn } from '@/lib/core/utils/cn'
9-
import { PinnedSubBlocks } from '@/app/workspace/[workspaceId]/w/components/workflow-preview/components/pinned-sub-blocks'
10-
import { WorkflowPreview } from '@/app/workspace/[workspaceId]/w/components/workflow-preview/workflow-preview'
9+
import {
10+
BlockDetailsSidebar,
11+
WorkflowPreview,
12+
} from '@/app/workspace/[workspaceId]/w/components/preview'
1113
import type { WorkflowState } from '@/stores/workflows/workflow/types'
1214

13-
const logger = createLogger('FrozenCanvas')
15+
const logger = createLogger('ExecutionSnapshot')
1416

1517
interface BlockExecutionData {
1618
input: unknown
@@ -19,7 +21,7 @@ interface BlockExecutionData {
1921
durationMs: number
2022
}
2123

22-
interface FrozenCanvasData {
24+
interface ExecutionSnapshotData {
2325
executionId: string
2426
workflowId: string
2527
workflowState: WorkflowState
@@ -38,7 +40,7 @@ interface FrozenCanvasData {
3840
}
3941
}
4042

41-
interface FrozenCanvasProps {
43+
interface ExecutionSnapshotProps {
4244
executionId: string
4345
traceSpans?: any[]
4446
className?: string
@@ -49,7 +51,7 @@ interface FrozenCanvasProps {
4951
onClose?: () => void
5052
}
5153

52-
export function FrozenCanvas({
54+
export function ExecutionSnapshot({
5355
executionId,
5456
traceSpans,
5557
className,
@@ -58,8 +60,8 @@ export function FrozenCanvas({
5860
isModal = false,
5961
isOpen = false,
6062
onClose,
61-
}: FrozenCanvasProps) {
62-
const [data, setData] = useState<FrozenCanvasData | null>(null)
63+
}: ExecutionSnapshotProps) {
64+
const [data, setData] = useState<ExecutionSnapshotData | null>(null)
6365
const [blockExecutions, setBlockExecutions] = useState<Record<string, BlockExecutionData>>({})
6466
const [loading, setLoading] = useState(true)
6567
const [error, setError] = useState<string | null>(null)
@@ -109,15 +111,15 @@ export function FrozenCanvas({
109111

110112
const response = await fetch(`/api/logs/execution/${executionId}`)
111113
if (!response.ok) {
112-
throw new Error(`Failed to fetch frozen canvas data: ${response.statusText}`)
114+
throw new Error(`Failed to fetch execution snapshot data: ${response.statusText}`)
113115
}
114116

115117
const result = await response.json()
116118
setData(result)
117-
logger.debug(`Loaded frozen canvas data for execution: ${executionId}`)
119+
logger.debug(`Loaded execution snapshot data for execution: ${executionId}`)
118120
} catch (err) {
119121
const errorMessage = err instanceof Error ? err.message : 'Unknown error'
120-
logger.error('Failed to fetch frozen canvas data:', err)
122+
logger.error('Failed to fetch execution snapshot data:', err)
121123
setError(errorMessage)
122124
} finally {
123125
setLoading(false)
@@ -136,7 +138,7 @@ export function FrozenCanvas({
136138
>
137139
<div className='flex items-center gap-[8px] text-[var(--text-secondary)]'>
138140
<Loader2 className='h-[16px] w-[16px] animate-spin' />
139-
<span className='text-[13px]'>Loading frozen canvas...</span>
141+
<span className='text-[13px]'>Loading execution snapshot...</span>
140142
</div>
141143
</div>
142144
)
@@ -150,7 +152,7 @@ export function FrozenCanvas({
150152
>
151153
<div className='flex items-center gap-[8px] text-[var(--text-error)]'>
152154
<AlertCircle className='h-[16px] w-[16px]' />
153-
<span className='text-[13px]'>Failed to load frozen canvas: {error}</span>
155+
<span className='text-[13px]'>Failed to load execution snapshot: {error}</span>
154156
</div>
155157
</div>
156158
)
@@ -190,27 +192,35 @@ export function FrozenCanvas({
190192
}
191193

192194
return (
193-
<div style={{ height, width }} className={cn('flex', className)}>
194-
{/* Canvas area */}
195-
<div className='frozen-canvas-mode h-full flex-1 overflow-hidden border-[var(--border)] border-r'>
195+
<div
196+
style={{ height, width }}
197+
className={cn(
198+
'flex overflow-hidden rounded-[4px] border border-[var(--border)]',
199+
className
200+
)}
201+
>
202+
<div className='h-full flex-1'>
196203
<WorkflowPreview
197204
workflowState={data.workflowState}
198205
showSubBlocks={true}
199206
isPannable={true}
200207
defaultPosition={{ x: 0, y: 0 }}
201208
defaultZoom={0.8}
202209
onNodeClick={(blockId) => {
203-
setPinnedBlockId(blockId)
210+
// Toggle: clicking same block closes sidebar, clicking different block switches
211+
setPinnedBlockId((prev) => (prev === blockId ? null : blockId))
204212
}}
213+
cursorStyle='pointer'
214+
executedBlocks={blockExecutions}
205215
/>
206216
</div>
207-
208-
{/* Sidebar - attached to right side */}
209217
{pinnedBlockId && data.workflowState.blocks[pinnedBlockId] && (
210-
<PinnedSubBlocks
218+
<BlockDetailsSidebar
211219
block={data.workflowState.blocks[pinnedBlockId]}
212-
onClose={() => setPinnedBlockId(null)}
213220
executionData={blockExecutions[pinnedBlockId]}
221+
allBlockExecutions={blockExecutions}
222+
workflowBlocks={data.workflowState.blocks}
223+
isExecutionMode
214224
/>
215225
)}
216226
</div>
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
export { ExecutionSnapshot } from './execution-snapshot'

apps/sim/app/workspace/[workspaceId]/logs/components/log-details/components/frozen-canvas/index.ts

Lines changed: 0 additions & 1 deletion
This file was deleted.

apps/sim/app/workspace/[workspaceId]/logs/components/log-details/log-details.tsx

Lines changed: 10 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,11 @@ import { ChevronUp, X } from 'lucide-react'
55
import { Button, Eye } from '@/components/emcn'
66
import { ScrollArea } from '@/components/ui/scroll-area'
77
import { BASE_EXECUTION_CHARGE } from '@/lib/billing/constants'
8-
import { FileCards, FrozenCanvas, TraceSpans } from '@/app/workspace/[workspaceId]/logs/components'
8+
import {
9+
ExecutionSnapshot,
10+
FileCards,
11+
TraceSpans,
12+
} from '@/app/workspace/[workspaceId]/logs/components'
913
import { useLogDetailsResize } from '@/app/workspace/[workspaceId]/logs/hooks'
1014
import {
1115
formatDate,
@@ -49,7 +53,7 @@ export const LogDetails = memo(function LogDetails({
4953
hasNext = false,
5054
hasPrev = false,
5155
}: LogDetailsProps) {
52-
const [isFrozenCanvasOpen, setIsFrozenCanvasOpen] = useState(false)
56+
const [isExecutionSnapshotOpen, setIsExecutionSnapshotOpen] = useState(false)
5357
const scrollAreaRef = useRef<HTMLDivElement>(null)
5458
const panelWidth = useLogDetailsUIStore((state) => state.panelWidth)
5559
const { handleMouseDown } = useLogDetailsResize()
@@ -266,7 +270,7 @@ export const LogDetails = memo(function LogDetails({
266270
Workflow State
267271
</span>
268272
<button
269-
onClick={() => setIsFrozenCanvasOpen(true)}
273+
onClick={() => setIsExecutionSnapshotOpen(true)}
270274
className='flex items-center justify-between rounded-[6px] bg-[var(--surface-1)] px-[10px] py-[8px] transition-colors hover:bg-[var(--surface-4)]'
271275
>
272276
<span className='font-medium text-[12px] text-[var(--text-secondary)]'>
@@ -363,12 +367,12 @@ export const LogDetails = memo(function LogDetails({
363367

364368
{/* Frozen Canvas Modal */}
365369
{log?.executionId && (
366-
<FrozenCanvas
370+
<ExecutionSnapshot
367371
executionId={log.executionId}
368372
traceSpans={log.executionData?.traceSpans}
369373
isModal
370-
isOpen={isFrozenCanvasOpen}
371-
onClose={() => setIsFrozenCanvasOpen(false)}
374+
isOpen={isExecutionSnapshotOpen}
375+
onClose={() => setIsExecutionSnapshotOpen(false)}
372376
/>
373377
)}
374378
</div>

apps/sim/app/workspace/[workspaceId]/logs/components/log-row-context-menu/log-row-context-menu.tsx

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ interface LogRowContextMenuProps {
1818
log: WorkflowLog | null
1919
onCopyExecutionId: () => void
2020
onOpenWorkflow: () => void
21+
onOpenPreview: () => void
2122
onToggleWorkflowFilter: () => void
2223
onClearAllFilters: () => void
2324
isFilteredByThisWorkflow: boolean
@@ -36,6 +37,7 @@ export function LogRowContextMenu({
3637
log,
3738
onCopyExecutionId,
3839
onOpenWorkflow,
40+
onOpenPreview,
3941
onToggleWorkflowFilter,
4042
onClearAllFilters,
4143
isFilteredByThisWorkflow,
@@ -78,6 +80,15 @@ export function LogRowContextMenu({
7880
>
7981
Open Workflow
8082
</PopoverItem>
83+
<PopoverItem
84+
disabled={!hasExecutionId}
85+
onClick={() => {
86+
onOpenPreview()
87+
onClose()
88+
}}
89+
>
90+
Open Preview
91+
</PopoverItem>
8192

8293
{/* Filter actions */}
8394
<PopoverDivider />

0 commit comments

Comments
 (0)