Fix parameters being lost on save bug (#818)
This commit is contained in:
@@ -1,6 +1,6 @@
|
|||||||
import { useParams } from "react-router-dom";
|
import { useParams } from "react-router-dom";
|
||||||
import { useWorkflowQuery } from "../hooks/useWorkflowQuery";
|
import { useWorkflowQuery } from "../hooks/useWorkflowQuery";
|
||||||
import { getElements } from "./workflowEditorUtils";
|
import { convertEchoParameters, getElements } from "./workflowEditorUtils";
|
||||||
import { useMutation, useQueryClient } from "@tanstack/react-query";
|
import { useMutation, useQueryClient } from "@tanstack/react-query";
|
||||||
import {
|
import {
|
||||||
BlockYAML,
|
BlockYAML,
|
||||||
@@ -14,6 +14,11 @@ import { ReactFlowProvider } from "@xyflow/react";
|
|||||||
import { FlowRenderer } from "./FlowRenderer";
|
import { FlowRenderer } from "./FlowRenderer";
|
||||||
import { toast } from "@/components/ui/use-toast";
|
import { toast } from "@/components/ui/use-toast";
|
||||||
import { AxiosError } from "axios";
|
import { AxiosError } from "axios";
|
||||||
|
import {
|
||||||
|
AWSSecretParameter,
|
||||||
|
BitwardenSensitiveInformationParameter,
|
||||||
|
ContextParameter,
|
||||||
|
} from "../types/workflowTypes";
|
||||||
|
|
||||||
function WorkflowEditor() {
|
function WorkflowEditor() {
|
||||||
const { workflowPermanentId } = useParams();
|
const { workflowPermanentId } = useParams();
|
||||||
@@ -122,8 +127,24 @@ function WorkflowEditor() {
|
|||||||
}
|
}
|
||||||
})}
|
})}
|
||||||
handleSave={(parameters, blocks, title) => {
|
handleSave={(parameters, blocks, title) => {
|
||||||
|
const filteredParameters =
|
||||||
|
workflow.workflow_definition.parameters.filter((parameter) => {
|
||||||
|
return (
|
||||||
|
parameter.parameter_type === "aws_secret" ||
|
||||||
|
parameter.parameter_type ===
|
||||||
|
"bitwarden_sensitive_information" ||
|
||||||
|
parameter.parameter_type === "context"
|
||||||
|
);
|
||||||
|
}) as Array<
|
||||||
|
| AWSSecretParameter
|
||||||
|
| BitwardenSensitiveInformationParameter
|
||||||
|
| ContextParameter
|
||||||
|
>;
|
||||||
|
|
||||||
|
const echoParameters = convertEchoParameters(filteredParameters);
|
||||||
|
|
||||||
saveWorkflowMutation.mutate({
|
saveWorkflowMutation.mutate({
|
||||||
parameters,
|
parameters: [...echoParameters, ...parameters],
|
||||||
blocks,
|
blocks,
|
||||||
title,
|
title,
|
||||||
});
|
});
|
||||||
|
|||||||
@@ -8,6 +8,10 @@ export type SendEmailNodeData = {
|
|||||||
editable: boolean;
|
editable: boolean;
|
||||||
label: string;
|
label: string;
|
||||||
sender: string;
|
sender: string;
|
||||||
|
smtpHostSecretParameterKey?: string;
|
||||||
|
smtpPortSecretParameterKey?: string;
|
||||||
|
smtpUsernameSecretParameterKey?: string;
|
||||||
|
smtpPasswordSecretParameterKey?: string;
|
||||||
};
|
};
|
||||||
|
|
||||||
export type SendEmailNode = Node<SendEmailNodeData, "sendEmail">;
|
export type SendEmailNode = Node<SendEmailNodeData, "sendEmail">;
|
||||||
|
|||||||
@@ -2,7 +2,7 @@ import Dagre from "@dagrejs/dagre";
|
|||||||
import { Edge } from "@xyflow/react";
|
import { Edge } from "@xyflow/react";
|
||||||
import { nanoid } from "nanoid";
|
import { nanoid } from "nanoid";
|
||||||
import type { WorkflowBlock } from "../types/workflowTypes";
|
import type { WorkflowBlock } from "../types/workflowTypes";
|
||||||
import { BlockYAML } from "../types/workflowYamlTypes";
|
import { BlockYAML, ParameterYAML } from "../types/workflowYamlTypes";
|
||||||
import { REACT_FLOW_EDGE_Z_INDEX } from "./constants";
|
import { REACT_FLOW_EDGE_Z_INDEX } from "./constants";
|
||||||
import { AppNode, nodeTypes } from "./nodes";
|
import { AppNode, nodeTypes } from "./nodes";
|
||||||
import { codeBlockNodeDefaultData } from "./nodes/CodeBlockNode/types";
|
import { codeBlockNodeDefaultData } from "./nodes/CodeBlockNode/types";
|
||||||
@@ -145,6 +145,10 @@ function convertToNode(
|
|||||||
recipients: block.recipients.join(", "),
|
recipients: block.recipients.join(", "),
|
||||||
subject: block.subject,
|
subject: block.subject,
|
||||||
sender: block.sender,
|
sender: block.sender,
|
||||||
|
smtpHostSecretParameterKey: block.smtp_host?.key,
|
||||||
|
smtpPortSecretParameterKey: block.smtp_port?.key,
|
||||||
|
smtpUsernameSecretParameterKey: block.smtp_username?.key,
|
||||||
|
smtpPasswordSecretParameterKey: block.smtp_password?.key,
|
||||||
},
|
},
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
@@ -467,6 +471,12 @@ function getWorkflowBlock(
|
|||||||
recipients: node.data.recipients.split(","),
|
recipients: node.data.recipients.split(","),
|
||||||
subject: node.data.subject,
|
subject: node.data.subject,
|
||||||
sender: node.data.sender,
|
sender: node.data.sender,
|
||||||
|
smtp_host_secret_parameter_key: node.data.smtpHostSecretParameterKey,
|
||||||
|
smtp_port_secret_parameter_key: node.data.smtpPortSecretParameterKey,
|
||||||
|
smtp_username_secret_parameter_key:
|
||||||
|
node.data.smtpUsernameSecretParameterKey,
|
||||||
|
smtp_password_secret_parameter_key:
|
||||||
|
node.data.smtpPasswordSecretParameterKey,
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
case "codeBlock": {
|
case "codeBlock": {
|
||||||
@@ -556,6 +566,56 @@ function generateNodeLabel(existingLabels: Array<string>) {
|
|||||||
throw new Error("Failed to generate a new node label");
|
throw new Error("Failed to generate a new node label");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
import type {
|
||||||
|
AWSSecretParameter,
|
||||||
|
BitwardenSensitiveInformationParameter,
|
||||||
|
ContextParameter,
|
||||||
|
} from "../types/workflowTypes";
|
||||||
|
|
||||||
|
/**
|
||||||
|
* If a parameter is not displayed in the editor, we should echo its value back when saved.
|
||||||
|
*/
|
||||||
|
function convertEchoParameters(
|
||||||
|
parameters: Array<
|
||||||
|
| ContextParameter
|
||||||
|
| BitwardenSensitiveInformationParameter
|
||||||
|
| AWSSecretParameter
|
||||||
|
>,
|
||||||
|
): Array<ParameterYAML> {
|
||||||
|
return parameters.map((parameter) => {
|
||||||
|
if (parameter.parameter_type === "aws_secret") {
|
||||||
|
return {
|
||||||
|
key: parameter.key,
|
||||||
|
parameter_type: "aws_secret",
|
||||||
|
aws_key: parameter.aws_key,
|
||||||
|
};
|
||||||
|
}
|
||||||
|
if (parameter.parameter_type === "bitwarden_sensitive_information") {
|
||||||
|
return {
|
||||||
|
key: parameter.key,
|
||||||
|
parameter_type: "bitwarden_sensitive_information",
|
||||||
|
bitwarden_collection_id: parameter.bitwarden_collection_id,
|
||||||
|
bitwarden_identity_key: parameter.bitwarden_identity_key,
|
||||||
|
bitwarden_identity_fields: parameter.bitwarden_identity_fields,
|
||||||
|
bitwarden_client_id_aws_secret_key:
|
||||||
|
parameter.bitwarden_client_id_aws_secret_key,
|
||||||
|
bitwarden_client_secret_aws_secret_key:
|
||||||
|
parameter.bitwarden_client_secret_aws_secret_key,
|
||||||
|
bitwarden_master_password_aws_secret_key:
|
||||||
|
parameter.bitwarden_master_password_aws_secret_key,
|
||||||
|
};
|
||||||
|
}
|
||||||
|
if (parameter.parameter_type === "context") {
|
||||||
|
return {
|
||||||
|
key: parameter.key,
|
||||||
|
parameter_type: "context",
|
||||||
|
source_parameter_key: parameter.source.key,
|
||||||
|
};
|
||||||
|
}
|
||||||
|
throw new Error("Unknown parameter type");
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
export {
|
export {
|
||||||
createNode,
|
createNode,
|
||||||
generateNodeData,
|
generateNodeData,
|
||||||
@@ -563,4 +623,5 @@ export {
|
|||||||
getWorkflowBlocks,
|
getWorkflowBlocks,
|
||||||
layout,
|
layout,
|
||||||
generateNodeLabel,
|
generateNodeLabel,
|
||||||
|
convertEchoParameters,
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -37,7 +37,7 @@ export type BitwardenSensitiveInformationParameter = WorkflowParameterBase & {
|
|||||||
bitwarden_master_password_aws_secret_key: string;
|
bitwarden_master_password_aws_secret_key: string;
|
||||||
bitwarden_collection_id: string;
|
bitwarden_collection_id: string;
|
||||||
bitwarden_identity_key: string;
|
bitwarden_identity_key: string;
|
||||||
bitwarden_identity_fields: string;
|
bitwarden_identity_fields: Array<string>;
|
||||||
created_at: string;
|
created_at: string;
|
||||||
modified_at: string;
|
modified_at: string;
|
||||||
deleted_at: string | null;
|
deleted_at: string | null;
|
||||||
@@ -171,10 +171,10 @@ export type UploadToS3Block = WorkflowBlockBase & {
|
|||||||
|
|
||||||
export type SendEmailBlock = WorkflowBlockBase & {
|
export type SendEmailBlock = WorkflowBlockBase & {
|
||||||
block_type: "send_email";
|
block_type: "send_email";
|
||||||
smtp_host: AWSSecretParameter;
|
smtp_host?: AWSSecretParameter;
|
||||||
smtp_port: AWSSecretParameter;
|
smtp_port?: AWSSecretParameter;
|
||||||
smtp_username: AWSSecretParameter;
|
smtp_username?: AWSSecretParameter;
|
||||||
smtp_password: AWSSecretParameter;
|
smtp_password?: AWSSecretParameter;
|
||||||
sender: string;
|
sender: string;
|
||||||
recipients: Array<string>;
|
recipients: Array<string>;
|
||||||
subject: string;
|
subject: string;
|
||||||
|
|||||||
@@ -15,7 +15,11 @@ export type WorkflowDefinitionYAML = {
|
|||||||
|
|
||||||
export type ParameterYAML =
|
export type ParameterYAML =
|
||||||
| WorkflowParameterYAML
|
| WorkflowParameterYAML
|
||||||
| BitwardenLoginCredentialParameterYAML;
|
| BitwardenLoginCredentialParameterYAML
|
||||||
|
| AWSSecretParameterYAML
|
||||||
|
| ContextParameterYAML
|
||||||
|
| OutputParameterYAML
|
||||||
|
| BitwardenSensitiveInformationParameterYAML;
|
||||||
|
|
||||||
export type ParameterYAMLBase = {
|
export type ParameterYAMLBase = {
|
||||||
parameter_type: string;
|
parameter_type: string;
|
||||||
@@ -38,6 +42,30 @@ export type BitwardenLoginCredentialParameterYAML = ParameterYAMLBase & {
|
|||||||
bitwarden_master_password_aws_secret_key: "SKYVERN_BITWARDEN_MASTER_PASSWORD";
|
bitwarden_master_password_aws_secret_key: "SKYVERN_BITWARDEN_MASTER_PASSWORD";
|
||||||
};
|
};
|
||||||
|
|
||||||
|
export type AWSSecretParameterYAML = ParameterYAMLBase & {
|
||||||
|
parameter_type: "aws_secret";
|
||||||
|
aws_key: string;
|
||||||
|
};
|
||||||
|
|
||||||
|
export type BitwardenSensitiveInformationParameterYAML = ParameterYAMLBase & {
|
||||||
|
parameter_type: "bitwarden_sensitive_information";
|
||||||
|
bitwarden_collection_id: string;
|
||||||
|
bitwarden_identity_key: string;
|
||||||
|
bitwarden_identity_fields: Array<string>;
|
||||||
|
bitwarden_client_id_aws_secret_key: string;
|
||||||
|
bitwarden_client_secret_aws_secret_key: string;
|
||||||
|
bitwarden_master_password_aws_secret_key: string;
|
||||||
|
};
|
||||||
|
|
||||||
|
export type ContextParameterYAML = ParameterYAMLBase & {
|
||||||
|
parameter_type: "context";
|
||||||
|
source_parameter_key: string;
|
||||||
|
};
|
||||||
|
|
||||||
|
export type OutputParameterYAML = ParameterYAMLBase & {
|
||||||
|
parameter_type: "output";
|
||||||
|
};
|
||||||
|
|
||||||
const BlockTypes = {
|
const BlockTypes = {
|
||||||
TASK: "task",
|
TASK: "task",
|
||||||
FOR_LOOP: "for_loop",
|
FOR_LOOP: "for_loop",
|
||||||
|
|||||||
Reference in New Issue
Block a user