diff --git a/packages/twenty-front/src/modules/workflow/workflow-diagram/types/WorkflowDiagram.ts b/packages/twenty-front/src/modules/workflow/workflow-diagram/types/WorkflowDiagram.ts index 6b71cd1935e..201054b4ff6 100644 --- a/packages/twenty-front/src/modules/workflow/workflow-diagram/types/WorkflowDiagram.ts +++ b/packages/twenty-front/src/modules/workflow/workflow-diagram/types/WorkflowDiagram.ts @@ -65,6 +65,7 @@ export type WorkflowDiagramStepNodeData = nodeType: 'action'; actionType: WorkflowActionType; name: string; + logicFunctionId?: string; runStatus?: WorkflowRunStepStatus; hasNextStepIds: boolean; stepId: string; diff --git a/packages/twenty-front/src/modules/workflow/workflow-diagram/utils/generateNodesAndEdgesForDefaultNode.ts b/packages/twenty-front/src/modules/workflow/workflow-diagram/utils/generateNodesAndEdgesForDefaultNode.ts index eaa4709b1af..f87fbd06793 100644 --- a/packages/twenty-front/src/modules/workflow/workflow-diagram/utils/generateNodesAndEdgesForDefaultNode.ts +++ b/packages/twenty-front/src/modules/workflow/workflow-diagram/utils/generateNodesAndEdgesForDefaultNode.ts @@ -47,6 +47,9 @@ export const generateNodesAndEdgesForDefaultNode = ({ nodeType: 'action', actionType: step.type, name: step.name, + ...(step.type === 'LOGIC_FUNCTION' + ? { logicFunctionId: step.settings.input.logicFunctionId } + : {}), hasNextStepIds: isDefined(step.nextStepIds) && step.nextStepIds.length > 0, stepId: step.id, diff --git a/packages/twenty-front/src/modules/workflow/workflow-diagram/workflow-nodes/components/WorkflowDiagramStepNodeIcon.tsx b/packages/twenty-front/src/modules/workflow/workflow-diagram/workflow-nodes/components/WorkflowDiagramStepNodeIcon.tsx index 3f3e538d6da..4a19b81d288 100644 --- a/packages/twenty-front/src/modules/workflow/workflow-diagram/workflow-nodes/components/WorkflowDiagramStepNodeIcon.tsx +++ b/packages/twenty-front/src/modules/workflow/workflow-diagram/workflow-nodes/components/WorkflowDiagramStepNodeIcon.tsx @@ -1,5 +1,6 @@ import { type WorkflowDiagramStepNodeData } from '@/workflow/workflow-diagram/types/WorkflowDiagram'; import { getWorkflowNodeIconKey } from '@/workflow/workflow-diagram/utils/getWorkflowNodeIconKey'; +import { WorkflowDiagramStepNodeLogicFunctionIcon } from '@/workflow/workflow-diagram/workflow-nodes/components/WorkflowDiagramStepNodeLogicFunctionIcon'; import { assertUnreachable } from 'twenty-shared/utils'; import { useIcons } from 'twenty-ui-deprecated/display'; import { ThemeContext } from 'twenty-ui-deprecated/theme-constants'; @@ -43,6 +44,13 @@ export const WorkflowDiagramStepNodeIcon = ({ /> ); } + case 'LOGIC_FUNCTION': { + return ( + + ); + } case 'FORM': { return ; } diff --git a/packages/twenty-front/src/modules/workflow/workflow-diagram/workflow-nodes/components/WorkflowDiagramStepNodeLogicFunctionIcon.tsx b/packages/twenty-front/src/modules/workflow/workflow-diagram/workflow-nodes/components/WorkflowDiagramStepNodeLogicFunctionIcon.tsx new file mode 100644 index 00000000000..7cb9ba221e9 --- /dev/null +++ b/packages/twenty-front/src/modules/workflow/workflow-diagram/workflow-nodes/components/WorkflowDiagramStepNodeLogicFunctionIcon.tsx @@ -0,0 +1,38 @@ +import { AppChip } from '@/applications/components/AppChip'; +import { logicFunctionsSelector } from '@/logic-functions/states/logicFunctionsSelector'; +import { useAtomStateValue } from '@/ui/utilities/state/jotai/hooks/useAtomStateValue'; +import { getActionIcon } from '@/workflow/workflow-steps/workflow-actions/utils/getActionIcon'; +import { useContext } from 'react'; +import { isDefined } from 'twenty-shared/utils'; +import { useIcons } from 'twenty-ui-deprecated/display'; +import { ThemeContext } from 'twenty-ui-deprecated/theme-constants'; + +export const WorkflowDiagramStepNodeLogicFunctionIcon = ({ + logicFunctionId, +}: { + logicFunctionId?: string; +}) => { + const { theme } = useContext(ThemeContext); + const { getIcon } = useIcons(); + const logicFunctions = useAtomStateValue(logicFunctionsSelector); + + const applicationId = isDefined(logicFunctionId) + ? logicFunctions.find( + (logicFunction) => logicFunction.id === logicFunctionId, + )?.applicationId + : undefined; + + if (isDefined(applicationId)) { + return ; + } + + const FallbackIcon = getIcon(getActionIcon('LOGIC_FUNCTION')); + + return ( + + ); +};