mirror of
https://github.com/lingble/twenty.git
synced 2025-11-01 21:27:58 +00:00
feat: first working version
This commit is contained in:
@@ -1,6 +1,7 @@
|
|||||||
import { useQuery } from '@apollo/client';
|
|
||||||
import { FIND_MANY_SERVERLESS_FUNCTIONS } from '@/settings/serverless-functions/graphql/queries/findManyServerlessFunctions';
|
|
||||||
import { useApolloMetadataClient } from '@/object-metadata/hooks/useApolloMetadataClient';
|
import { useApolloMetadataClient } from '@/object-metadata/hooks/useApolloMetadataClient';
|
||||||
|
import { FIND_MANY_SERVERLESS_FUNCTIONS } from '@/settings/serverless-functions/graphql/queries/findManyServerlessFunctions';
|
||||||
|
import { useQuery } from '@apollo/client';
|
||||||
|
import { useMemo } from 'react';
|
||||||
import {
|
import {
|
||||||
GetManyServerlessFunctionsQuery,
|
GetManyServerlessFunctionsQuery,
|
||||||
GetManyServerlessFunctionsQueryVariables,
|
GetManyServerlessFunctionsQueryVariables,
|
||||||
@@ -14,8 +15,10 @@ export const useGetManyServerlessFunctions = () => {
|
|||||||
>(FIND_MANY_SERVERLESS_FUNCTIONS, {
|
>(FIND_MANY_SERVERLESS_FUNCTIONS, {
|
||||||
client: apolloMetadataClient ?? undefined,
|
client: apolloMetadataClient ?? undefined,
|
||||||
});
|
});
|
||||||
|
return useMemo(() => {
|
||||||
return {
|
return {
|
||||||
serverlessFunctions:
|
serverlessFunctions:
|
||||||
data?.serverlessFunctions?.edges.map(({ node }) => node) || [],
|
data?.serverlessFunctions?.edges.map(({ node }) => node) || [],
|
||||||
};
|
};
|
||||||
|
}, [data?.serverlessFunctions?.edges]);
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -1,3 +1,4 @@
|
|||||||
|
import { useGetManyServerlessFunctions } from '@/settings/serverless-functions/hooks/useGetManyServerlessFunctions';
|
||||||
import { getSnapshotValue } from '@/ui/utilities/state/utils/getSnapshotValue';
|
import { getSnapshotValue } from '@/ui/utilities/state/utils/getSnapshotValue';
|
||||||
import { workflowDiagramState } from '@/workflow/states/workflowDiagramState';
|
import { workflowDiagramState } from '@/workflow/states/workflowDiagramState';
|
||||||
import {
|
import {
|
||||||
@@ -19,15 +20,24 @@ export const WorkflowDiagramEffect = ({
|
|||||||
}) => {
|
}) => {
|
||||||
const setWorkflowDiagram = useSetRecoilState(workflowDiagramState);
|
const setWorkflowDiagram = useSetRecoilState(workflowDiagramState);
|
||||||
|
|
||||||
|
const { serverlessFunctions } = useGetManyServerlessFunctions();
|
||||||
|
|
||||||
const computeAndMergeNewWorkflowDiagram = useRecoilCallback(
|
const computeAndMergeNewWorkflowDiagram = useRecoilCallback(
|
||||||
({ snapshot, set }) => {
|
({ snapshot, set }) => {
|
||||||
return (currentVersion: WorkflowVersion) => {
|
return (currentVersion: WorkflowVersion) => {
|
||||||
|
if (!isDefined(serverlessFunctions)) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
const previousWorkflowDiagram = getSnapshotValue(
|
const previousWorkflowDiagram = getSnapshotValue(
|
||||||
snapshot,
|
snapshot,
|
||||||
workflowDiagramState,
|
workflowDiagramState,
|
||||||
);
|
);
|
||||||
|
|
||||||
const nextWorkflowDiagram = getWorkflowVersionDiagram(currentVersion);
|
const nextWorkflowDiagram = getWorkflowVersionDiagram(
|
||||||
|
currentVersion,
|
||||||
|
serverlessFunctions,
|
||||||
|
);
|
||||||
|
|
||||||
let mergedWorkflowDiagram = nextWorkflowDiagram;
|
let mergedWorkflowDiagram = nextWorkflowDiagram;
|
||||||
if (isDefined(previousWorkflowDiagram)) {
|
if (isDefined(previousWorkflowDiagram)) {
|
||||||
@@ -44,7 +54,7 @@ export const WorkflowDiagramEffect = ({
|
|||||||
set(workflowDiagramState, workflowDiagramWithCreateStepNodes);
|
set(workflowDiagramState, workflowDiagramWithCreateStepNodes);
|
||||||
};
|
};
|
||||||
},
|
},
|
||||||
[],
|
[serverlessFunctions],
|
||||||
);
|
);
|
||||||
|
|
||||||
useEffect(() => {
|
useEffect(() => {
|
||||||
|
|||||||
@@ -1,9 +1,11 @@
|
|||||||
|
import { useGetManyServerlessFunctions } from '@/settings/serverless-functions/hooks/useGetManyServerlessFunctions';
|
||||||
import { TRIGGER_STEP_ID } from '@/workflow/constants/TriggerStepId';
|
import { TRIGGER_STEP_ID } from '@/workflow/constants/TriggerStepId';
|
||||||
import { WorkflowStep, WorkflowTrigger } from '@/workflow/types/Workflow';
|
import { WorkflowStep, WorkflowTrigger } from '@/workflow/types/Workflow';
|
||||||
import {
|
import {
|
||||||
WorkflowDiagram,
|
WorkflowDiagram,
|
||||||
WorkflowDiagramEdge,
|
WorkflowDiagramEdge,
|
||||||
WorkflowDiagramNode,
|
WorkflowDiagramNode,
|
||||||
|
WorkflowDiagramNodeData,
|
||||||
} from '@/workflow/types/WorkflowDiagram';
|
} from '@/workflow/types/WorkflowDiagram';
|
||||||
import { splitWorkflowTriggerEventName } from '@/workflow/utils/splitWorkflowTriggerEventName';
|
import { splitWorkflowTriggerEventName } from '@/workflow/utils/splitWorkflowTriggerEventName';
|
||||||
import { MarkerType } from '@xyflow/react';
|
import { MarkerType } from '@xyflow/react';
|
||||||
@@ -14,9 +16,13 @@ import { capitalize } from '~/utils/string/capitalize';
|
|||||||
export const generateWorkflowDiagram = ({
|
export const generateWorkflowDiagram = ({
|
||||||
trigger,
|
trigger,
|
||||||
steps,
|
steps,
|
||||||
|
serverlessFunctionsData,
|
||||||
}: {
|
}: {
|
||||||
trigger: WorkflowTrigger | undefined;
|
trigger: WorkflowTrigger | undefined;
|
||||||
steps: Array<WorkflowStep>;
|
steps: Array<WorkflowStep>;
|
||||||
|
serverlessFunctionsData: ReturnType<
|
||||||
|
typeof useGetManyServerlessFunctions
|
||||||
|
>['serverlessFunctions'];
|
||||||
}): WorkflowDiagram => {
|
}): WorkflowDiagram => {
|
||||||
const nodes: Array<WorkflowDiagramNode> = [];
|
const nodes: Array<WorkflowDiagramNode> = [];
|
||||||
const edges: Array<WorkflowDiagramEdge> = [];
|
const edges: Array<WorkflowDiagramEdge> = [];
|
||||||
@@ -29,13 +35,28 @@ export const generateWorkflowDiagram = ({
|
|||||||
yPos: number,
|
yPos: number,
|
||||||
) => {
|
) => {
|
||||||
const nodeId = step.id;
|
const nodeId = step.id;
|
||||||
nodes.push({
|
const nodeData: WorkflowDiagramNodeData = {
|
||||||
id: nodeId,
|
|
||||||
data: {
|
|
||||||
nodeType: 'action',
|
nodeType: 'action',
|
||||||
actionType: step.type,
|
actionType: step.type,
|
||||||
label: step.name,
|
label: step.name,
|
||||||
},
|
};
|
||||||
|
|
||||||
|
if (step.type === 'CODE') {
|
||||||
|
const serverlessFunctionData = serverlessFunctionsData.find(
|
||||||
|
({ id }) => id === step.settings.input.serverlessFunctionId,
|
||||||
|
);
|
||||||
|
if (!isDefined(serverlessFunctionData)) {
|
||||||
|
throw new Error(
|
||||||
|
'Could not find the definition of the serverless function',
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
nodeData.label = serverlessFunctionData.name;
|
||||||
|
}
|
||||||
|
|
||||||
|
nodes.push({
|
||||||
|
id: nodeId,
|
||||||
|
data: nodeData,
|
||||||
position: {
|
position: {
|
||||||
x: xPos,
|
x: xPos,
|
||||||
y: yPos,
|
y: yPos,
|
||||||
|
|||||||
@@ -1,3 +1,4 @@
|
|||||||
|
import { useGetManyServerlessFunctions } from '@/settings/serverless-functions/hooks/useGetManyServerlessFunctions';
|
||||||
import { WorkflowVersion } from '@/workflow/types/Workflow';
|
import { WorkflowVersion } from '@/workflow/types/Workflow';
|
||||||
import { WorkflowDiagram } from '@/workflow/types/WorkflowDiagram';
|
import { WorkflowDiagram } from '@/workflow/types/WorkflowDiagram';
|
||||||
import { generateWorkflowDiagram } from '@/workflow/utils/generateWorkflowDiagram';
|
import { generateWorkflowDiagram } from '@/workflow/utils/generateWorkflowDiagram';
|
||||||
@@ -10,6 +11,9 @@ const EMPTY_DIAGRAM: WorkflowDiagram = {
|
|||||||
|
|
||||||
export const getWorkflowVersionDiagram = (
|
export const getWorkflowVersionDiagram = (
|
||||||
workflowVersion: WorkflowVersion | undefined,
|
workflowVersion: WorkflowVersion | undefined,
|
||||||
|
serverlessFunctionsData: ReturnType<
|
||||||
|
typeof useGetManyServerlessFunctions
|
||||||
|
>['serverlessFunctions'],
|
||||||
): WorkflowDiagram => {
|
): WorkflowDiagram => {
|
||||||
if (!isDefined(workflowVersion)) {
|
if (!isDefined(workflowVersion)) {
|
||||||
return EMPTY_DIAGRAM;
|
return EMPTY_DIAGRAM;
|
||||||
@@ -18,5 +22,6 @@ export const getWorkflowVersionDiagram = (
|
|||||||
return generateWorkflowDiagram({
|
return generateWorkflowDiagram({
|
||||||
trigger: workflowVersion.trigger ?? undefined,
|
trigger: workflowVersion.trigger ?? undefined,
|
||||||
steps: workflowVersion.steps ?? [],
|
steps: workflowVersion.steps ?? [],
|
||||||
|
serverlessFunctionsData,
|
||||||
});
|
});
|
||||||
};
|
};
|
||||||
|
|||||||
Reference in New Issue
Block a user