diff --git a/src/config/dynamic/resolvers/schemas/resolver-schemas.ts b/src/config/dynamic/resolvers/schemas/resolver-schemas.ts index 0245c76ad..136acd3da 100644 --- a/src/config/dynamic/resolvers/schemas/resolver-schemas.ts +++ b/src/config/dynamic/resolvers/schemas/resolver-schemas.ts @@ -38,6 +38,7 @@ const resolverSchemas: ResolverSchemas = { returnType: z.object({ cancel: workflowActionsEnabledValueSchema, terminate: workflowActionsEnabledValueSchema, + signal: workflowActionsEnabledValueSchema, restart: workflowActionsEnabledValueSchema, reset: workflowActionsEnabledValueSchema, }), diff --git a/src/config/dynamic/resolvers/workflow-actions-enabled.ts b/src/config/dynamic/resolvers/workflow-actions-enabled.ts index c2d62485a..1bc58cc19 100644 --- a/src/config/dynamic/resolvers/workflow-actions-enabled.ts +++ b/src/config/dynamic/resolvers/workflow-actions-enabled.ts @@ -15,5 +15,6 @@ export default async function workflowActionsEnabled( cancel: 'ENABLED', restart: 'ENABLED', reset: 'ENABLED', + signal: 'ENABLED', }; } diff --git a/src/config/dynamic/resolvers/workflow-actions-enabled.types.ts b/src/config/dynamic/resolvers/workflow-actions-enabled.types.ts index c3290ae5b..da3ae646a 100644 --- a/src/config/dynamic/resolvers/workflow-actions-enabled.types.ts +++ b/src/config/dynamic/resolvers/workflow-actions-enabled.types.ts @@ -1,6 +1,11 @@ import type WORKFLOW_ACTIONS_DISABLED_VALUES_CONFIG from './workflow-actions-disabled-values.config'; -export type WorkflowActionID = 'cancel' | 'terminate' | 'restart' | 'reset'; +export type WorkflowActionID = + | 'cancel' + | 'terminate' + | 'restart' + | 'reset' + | 'signal'; export type WorkflowActionsEnabledResolverParams = { domain: string; diff --git a/src/utils/config/__fixtures__/resolved-config-values.ts b/src/utils/config/__fixtures__/resolved-config-values.ts index 0cdd18ea7..537b48436 100644 --- a/src/utils/config/__fixtures__/resolved-config-values.ts +++ b/src/utils/config/__fixtures__/resolved-config-values.ts @@ -30,6 +30,7 @@ const mockResolvedConfigValues: LoadedConfigResolvedValues = { WORKFLOW_ACTIONS_ENABLED: { terminate: 'ENABLED', cancel: 'ENABLED', + signal: 'ENABLED', restart: 'ENABLED', reset: 'ENABLED', }, diff --git a/src/views/workflow-actions/config/workflow-actions.config.ts b/src/views/workflow-actions/config/workflow-actions.config.ts index 294202785..8a331201c 100644 --- a/src/views/workflow-actions/config/workflow-actions.config.ts +++ b/src/views/workflow-actions/config/workflow-actions.config.ts @@ -5,6 +5,7 @@ import { MdPowerSettingsNew, MdOutlineRestartAlt, MdRefresh, + MdOutlineWifiTethering, } from 'react-icons/md'; import { type CancelWorkflowResponse } from '@/route-handlers/cancel-workflow/cancel-workflow.types'; @@ -20,6 +21,12 @@ import { type ResetWorkflowSubmissionData, type ResetWorkflowFormData, } from '../workflow-action-reset-form/workflow-action-reset-form.types'; +import { signalWorkflowFormSchema } from '../workflow-action-signal-form/schemas/signal-workflow-form-schema'; +import WorkflowActionSignalForm from '../workflow-action-signal-form/workflow-action-signal-form'; +import { + type SignalWorkflowSubmissionData, + type SignalWorkflowFormData, +} from '../workflow-action-signal-form/workflow-action-signal-form.types'; import { type WorkflowAction } from '../workflow-actions.types'; const cancelWorkflowActionConfig: WorkflowAction = { @@ -69,6 +76,37 @@ const terminateWorkflowActionConfig: WorkflowAction = renderSuccessMessage: () => 'Workflow has been terminated.', }; +const signalWorkflowActionConfig: WorkflowAction< + unknown, + SignalWorkflowFormData, + SignalWorkflowSubmissionData +> = { + id: 'signal', + label: 'Signal', + subtitle: 'Send a signal to the workflow', + modal: { + text: 'Provide data to running workflows using signals', + docsLink: { + text: 'Learn more about signals', + href: 'https://cadenceworkflow.io/docs/go-client/signals', + }, + withForm: true, + form: WorkflowActionSignalForm, + formSchema: signalWorkflowFormSchema, + transformFormDataToSubmission: (formData) => formData, + }, + icon: MdOutlineWifiTethering, + getRunnableStatus: (workflow) => + getWorkflowIsCompleted( + workflow.workflowExecutionInfo?.closeEvent?.attributes ?? '' + ) + ? 'NOT_RUNNABLE_WORKFLOW_CLOSED' + : 'RUNNABLE', + apiRoute: 'signal', + renderSuccessMessage: ({ inputParams }) => + `Successfully sent signal "${inputParams.submissionData.signalName}"`, +}; + const restartWorkflowActionConfig: WorkflowAction = { id: 'restart', label: 'Restart', @@ -136,6 +174,7 @@ export const resetWorkflowActionConfig: WorkflowAction< const workflowActionsConfig = [ cancelWorkflowActionConfig, terminateWorkflowActionConfig, + signalWorkflowActionConfig, restartWorkflowActionConfig, resetWorkflowActionConfig, ] as const satisfies WorkflowAction[]; diff --git a/src/views/workflow-actions/workflow-actions-menu/__tests__/workflow-actions-menu.test.tsx b/src/views/workflow-actions/workflow-actions-menu/__tests__/workflow-actions-menu.test.tsx index d832d0bd8..edf836b77 100644 --- a/src/views/workflow-actions/workflow-actions-menu/__tests__/workflow-actions-menu.test.tsx +++ b/src/views/workflow-actions/workflow-actions-menu/__tests__/workflow-actions-menu.test.tsx @@ -63,6 +63,7 @@ describe(WorkflowActionsMenu.name, () => { actionsEnabledConfig: { cancel: 'DISABLED_DEFAULT', terminate: 'DISABLED_DEFAULT', + signal: 'DISABLED_DEFAULT', restart: 'ENABLED', reset: 'ENABLED', },