Skip to content

Commit cce22de

Browse files
committed
fix(workflows): apply semantic colors to native triggers
1 parent 234728c commit cce22de

4 files changed

Lines changed: 29 additions & 1 deletion

File tree

apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/panel/components/toolbar/toolbar.tsx

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@ import {
2121
Info,
2222
} from '@sim/emcn'
2323
import { ChevronDown, Search } from '@sim/emcn/icons'
24-
import { WorkflowTypeIcon } from '@sim/workflow-renderer'
24+
import { hasWorkflowTypeRole, WorkflowTypeIcon } from '@sim/workflow-renderer'
2525
import clsx from 'clsx'
2626
import { useParams } from 'next/navigation'
2727
import { usePostHog } from 'posthog-js/react'
@@ -210,6 +210,7 @@ function getTriggers(overlayVersion: number): BlockItem[] {
210210
config: trigger,
211211
icon: trigger.icon,
212212
bgColor: trigger.bgColor,
213+
workflowType: hasWorkflowTypeRole(trigger.type) ? trigger.type : undefined,
213214
docsLink: trigger.docsLink,
214215
}))
215216
}
@@ -273,6 +274,7 @@ function ensureBlockCaches() {
273274
config: block,
274275
icon: block.icon,
275276
bgColor: block.bgColor,
277+
workflowType: hasWorkflowTypeRole(block.type) ? block.type : undefined,
276278
}))
277279

278280
regularBlockItems.sort((a, b) => a.name.localeCompare(b.name))

apps/sim/lib/workflows/blocks/workflow-block-view-interaction.test.tsx

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ import { act } from 'react'
55
import {
66
getWorkflowTypeAccent,
77
getWorkflowTypeRole,
8+
hasWorkflowTypeRole,
89
WorkflowBlockView,
910
WorkflowTypeIcon,
1011
WorkflowTypeTag,
@@ -189,6 +190,12 @@ describe('WorkflowTypeTag colors', () => {
189190
expect(getWorkflowTypeRole('a2a')).toBe('neutral')
190191
expect(getWorkflowTypeRole('image_generator_v2')).toBe('generative')
191192
expect(getWorkflowTypeRole('knowledge')).toBe('knowledge')
193+
expect(getWorkflowTypeRole('start_trigger')).toBe('flow')
194+
expect(getWorkflowTypeRole('schedule')).toBe('flow')
195+
expect(getWorkflowTypeRole('generic_webhook')).toBe('interface')
196+
expect(getWorkflowTypeRole('imap')).toBe('interface')
197+
expect(getWorkflowTypeRole('rss')).toBe('knowledge')
198+
expect(getWorkflowTypeRole('sim_workspace_event')).toBe('interface')
192199

193200
expect(getWorkflowTypeAccent('agent')).toEqual({ variant: 'workflow', tone: 'inverse' })
194201
expect(getWorkflowTypeAccent('api')).toEqual({ variant: 'workflow', tone: 'blue' })
@@ -203,6 +210,15 @@ describe('WorkflowTypeTag colors', () => {
203210
expect(getWorkflowTypeAccent('knowledge')).toEqual({ variant: 'workflow', tone: 'content' })
204211
})
205212

213+
it('distinguishes semantic workflow types from branded providers', () => {
214+
expect(hasWorkflowTypeRole('start_trigger')).toBe(true)
215+
expect(hasWorkflowTypeRole('schedule')).toBe(true)
216+
expect(hasWorkflowTypeRole('generic_webhook')).toBe(true)
217+
expect(hasWorkflowTypeRole('table')).toBe(true)
218+
expect(hasWorkflowTypeRole('circleback')).toBe(false)
219+
expect(hasWorkflowTypeRole('airtable')).toBe(false)
220+
})
221+
206222
it('renders compact workflow icons with their canonical fill and ink', () => {
207223
const host = document.createElement('div')
208224
document.body.appendChild(host)

packages/workflow-renderer/src/index.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,7 @@ export {
4444
getNearestBranchCursorHandleId,
4545
getWorkflowTypeAccent,
4646
getWorkflowTypeRole,
47+
hasWorkflowTypeRole,
4748
WorkflowBlockView,
4849
type WorkflowBlockViewProps,
4950
WorkflowTypeIcon,

packages/workflow-renderer/src/workflow-block/workflow-block-view.tsx

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -126,10 +126,12 @@ const WORKFLOW_TYPE_ROLES = {
126126
file_v4: 'knowledge',
127127
file_v5: 'knowledge',
128128
function: 'logic',
129+
generic_webhook: 'interface',
129130
guardrails: 'logic',
130131
human_in_the_loop: 'state',
131132
image_generator: 'generative',
132133
image_generator_v2: 'generative',
134+
imap: 'interface',
133135
knowledge: 'knowledge',
134136
logs: 'records',
135137
logs_v2: 'records',
@@ -143,7 +145,11 @@ const WORKFLOW_TYPE_ROLES = {
143145
response: 'interface',
144146
router: 'flow',
145147
router_v2: 'flow',
148+
rss: 'knowledge',
149+
schedule: 'flow',
146150
search: 'knowledge',
151+
sim_workspace_event: 'interface',
152+
start_trigger: 'flow',
147153
starter: 'neutral',
148154
stt: 'generative',
149155
stt_v2: 'generative',
@@ -166,6 +172,9 @@ const WORKFLOW_TYPE_ROLES = {
166172

167173
const DEFAULT_WORKFLOW_TYPE_ROLE: WorkflowTypeRole = 'neutral'
168174

175+
export const hasWorkflowTypeRole = (type: string): type is keyof typeof WORKFLOW_TYPE_ROLES =>
176+
Object.hasOwn(WORKFLOW_TYPE_ROLES, type)
177+
169178
export const getWorkflowTypeRole = (type: string): WorkflowTypeRole =>
170179
WORKFLOW_TYPE_ROLES[type as keyof typeof WORKFLOW_TYPE_ROLES] ?? DEFAULT_WORKFLOW_TYPE_ROLE
171180

0 commit comments

Comments
 (0)