d0ff1ffd5f
- create a serverless function when creating a new workflow code step - add code editor in workflow code step - move workflowVersion steps management from frontend to backend - add a custom resolver for workflow-version management - fix optimistic rendering on frontend - fix css - delete serverless function when deleting workflow code step TODO - Don't update serverlessFunction if no code change - Factorize what can be between crud trigger and crud step - Publish serverless version when activating workflow - delete serverless functions when deleting workflow or workflowVersion - fix optimistic rendering for code updates - Unify CRUD types <img width="1279" alt="image" src="https://github.com/user-attachments/assets/3d97ee9f-4b96-4abc-9d36-5c0280058be4">
143 lines
4.5 KiB
TypeScript
143 lines
4.5 KiB
TypeScript
import { lazy, Suspense } from 'react';
|
|
import { WorkflowEditTriggerDatabaseEventForm } from '@/workflow/components/WorkflowEditTriggerDatabaseEventForm';
|
|
import { WorkflowEditTriggerManualForm } from '@/workflow/components/WorkflowEditTriggerManualForm';
|
|
import {
|
|
WorkflowAction,
|
|
WorkflowTrigger,
|
|
WorkflowVersion,
|
|
} from '@/workflow/types/Workflow';
|
|
import { assertUnreachable } from '@/workflow/utils/assertUnreachable';
|
|
import { getStepDefinitionOrThrow } from '@/workflow/utils/getStepDefinitionOrThrow';
|
|
import { isWorkflowRecordCreateAction } from '@/workflow/utils/isWorkflowRecordCreateAction';
|
|
import { isWorkflowRecordUpdateAction } from '@/workflow/utils/isWorkflowRecordUpdateAction';
|
|
import { WorkflowEditActionFormRecordCreate } from '@/workflow/workflow-actions/components/WorkflowEditActionFormRecordCreate';
|
|
import { WorkflowEditActionFormRecordUpdate } from '@/workflow/workflow-actions/components/WorkflowEditActionFormRecordUpdate';
|
|
import { WorkflowEditActionFormSendEmail } from '@/workflow/workflow-actions/components/WorkflowEditActionFormSendEmail';
|
|
import { isDefined } from 'twenty-ui';
|
|
import { RightDrawerSkeletonLoader } from '~/loading/components/RightDrawerSkeletonLoader';
|
|
|
|
const WorkflowEditActionFormServerlessFunction = lazy(() =>
|
|
import(
|
|
'@/workflow/workflow-actions/components/WorkflowEditActionFormServerlessFunction'
|
|
).then((module) => ({
|
|
default: module.WorkflowEditActionFormServerlessFunction,
|
|
})),
|
|
);
|
|
|
|
type WorkflowStepDetailProps =
|
|
| {
|
|
stepId: string;
|
|
workflowVersion: WorkflowVersion;
|
|
readonly: true;
|
|
onTriggerUpdate?: undefined;
|
|
onActionUpdate?: undefined;
|
|
}
|
|
| {
|
|
stepId: string;
|
|
workflowVersion: WorkflowVersion;
|
|
readonly?: false;
|
|
onTriggerUpdate: (trigger: WorkflowTrigger) => void;
|
|
onActionUpdate: (action: WorkflowAction) => void;
|
|
};
|
|
|
|
export const WorkflowStepDetail = ({
|
|
stepId,
|
|
workflowVersion,
|
|
...props
|
|
}: WorkflowStepDetailProps) => {
|
|
const stepDefinition = getStepDefinitionOrThrow({
|
|
stepId,
|
|
workflowVersion,
|
|
});
|
|
if (!isDefined(stepDefinition)) {
|
|
return null;
|
|
}
|
|
|
|
switch (stepDefinition.type) {
|
|
case 'trigger': {
|
|
if (!isDefined(stepDefinition.definition)) {
|
|
throw new Error(
|
|
'Expected the trigger to be defined at this point. Ensure the trigger has been set with a default value before trying to edit it.',
|
|
);
|
|
}
|
|
|
|
switch (stepDefinition.definition.type) {
|
|
case 'DATABASE_EVENT': {
|
|
return (
|
|
<WorkflowEditTriggerDatabaseEventForm
|
|
trigger={stepDefinition.definition}
|
|
triggerOptions={props}
|
|
/>
|
|
);
|
|
}
|
|
case 'MANUAL': {
|
|
return (
|
|
<WorkflowEditTriggerManualForm
|
|
trigger={stepDefinition.definition}
|
|
triggerOptions={props}
|
|
/>
|
|
);
|
|
}
|
|
}
|
|
|
|
return assertUnreachable(
|
|
stepDefinition.definition,
|
|
`Expected the step to have an handler; ${JSON.stringify(stepDefinition)}`,
|
|
);
|
|
}
|
|
case 'action': {
|
|
switch (stepDefinition.definition.type) {
|
|
case 'CODE': {
|
|
return (
|
|
<Suspense fallback={<RightDrawerSkeletonLoader />}>
|
|
<WorkflowEditActionFormServerlessFunction
|
|
action={stepDefinition.definition}
|
|
actionOptions={props}
|
|
/>
|
|
</Suspense>
|
|
);
|
|
}
|
|
case 'SEND_EMAIL': {
|
|
return (
|
|
<WorkflowEditActionFormSendEmail
|
|
action={stepDefinition.definition}
|
|
actionOptions={props}
|
|
/>
|
|
);
|
|
}
|
|
case 'RECORD_CRUD': {
|
|
if (isWorkflowRecordCreateAction(stepDefinition.definition)) {
|
|
return (
|
|
<WorkflowEditActionFormRecordCreate
|
|
action={stepDefinition.definition}
|
|
actionOptions={props}
|
|
/>
|
|
);
|
|
}
|
|
|
|
if (isWorkflowRecordUpdateAction(stepDefinition.definition)) {
|
|
return (
|
|
<WorkflowEditActionFormRecordUpdate
|
|
action={stepDefinition.definition}
|
|
actionOptions={props}
|
|
/>
|
|
);
|
|
}
|
|
|
|
return null;
|
|
}
|
|
}
|
|
|
|
return assertUnreachable(
|
|
stepDefinition.definition,
|
|
`Expected the step to have an handler; ${JSON.stringify(stepDefinition)}`,
|
|
);
|
|
}
|
|
}
|
|
|
|
return assertUnreachable(
|
|
stepDefinition,
|
|
`Expected the step to have an handler; ${JSON.stringify(stepDefinition)}`,
|
|
);
|
|
};
|