🐛 Fix that "getCurrentNodeParameter" did not resolve expressions

This commit is contained in:
Jan Oberhauser 2019-12-16 20:27:56 -06:00
parent ae89882951
commit a7d729842a
5 changed files with 29 additions and 4 deletions

View file

@ -10,6 +10,7 @@ import {
INode,
INodeCredentials,
INodeIssues,
INodeParameters,
INodePropertyOptions,
INodeTypeDescription,
IRunExecutionData,
@ -125,7 +126,7 @@ export interface IRestApi {
makeRestApiRequest(method: string, endpoint: string, data?: any): Promise<any>; // tslint:disable-line:no-any
getSettings(): Promise<IN8nUISettings>;
getNodeTypes(): Promise<INodeTypeDescription[]>;
getNodeParameterOptions(nodeType: string, methodName: string, credentials?: INodeCredentials): Promise<INodePropertyOptions[]>;
getNodeParameterOptions(nodeType: string, methodName: string, currentNodeParameters: INodeParameters, credentials?: INodeCredentials): Promise<INodePropertyOptions[]>;
removeTestWebhook(workflowId: string): Promise<boolean>;
runWorkflow(runData: IStartRunData): Promise<IExecutionPushResponse>;
createNewWorkflow(sendData: IWorkflowData): Promise<IWorkflowDb>;

View file

@ -171,6 +171,7 @@ import { genericHelpers } from '@/components/mixins/genericHelpers';
import { restApi } from '@/components/mixins/restApi';
import { showMessage } from '@/components/mixins/showMessage';
import { workflowHelpers } from '@/components/mixins/workflowHelpers';
import { workflowSave } from '@/components/mixins/workflowSave';
import { workflowRun } from '@/components/mixins/workflowRun';
import { saveAs } from 'file-saver';
@ -183,6 +184,7 @@ export default mixins(
showMessage,
workflowHelpers,
workflowRun,
workflowSave,
)
.extend({
name: 'MainHeader',

View file

@ -57,6 +57,7 @@ import mixins from 'vue-typed-mixins';
export default mixins(
copyPaste,
showMessage,
workflowHelpers,
)
.extend({

View file

@ -125,6 +125,7 @@ import {
import {
NodeHelpers,
NodeParameterValue,
INodeParameters,
INodePropertyOptions,
Workflow,
} from 'n8n-workflow';
@ -421,6 +422,21 @@ export default mixins(
},
},
methods: {
getResolveNodeParameters (nodeParameters: INodeParameters): INodeParameters {
const returnData: INodeParameters = {};
for (const key of Object.keys(nodeParameters)) {
if (Array.isArray(nodeParameters[key])) {
returnData[key] = (nodeParameters[key] as string[]).map(value => {
return this.resolveExpression(value as string) as string;
});
} else if (typeof nodeParameters[key] === 'object') {
returnData[key] = this.getResolveNodeParameters(nodeParameters[key] as INodeParameters);
} else {
returnData[key] = this.resolveExpression(nodeParameters[key] as string);
}
}
return returnData;
},
async loadRemoteParameterOptions () {
if (this.node === null || this.remoteMethod === undefined || this.remoteParameterOptionsLoading) {
return;
@ -429,8 +445,12 @@ export default mixins(
this.remoteParameterOptionsLoading = true;
this.remoteParameterOptions.length = 0;
// Get the resolved parameter values of the current node
const currentNodeParameters = this.$store.getters.activeNode.parameters;
const resolvedNodeParameters = this.getResolveNodeParameters(currentNodeParameters);
try {
const options = await this.restApi().getNodeParameterOptions(this.node.type, this.remoteMethod, this.node.credentials);
const options = await this.restApi().getNodeParameterOptions(this.node.type, this.remoteMethod, resolvedNodeParameters, this.node.credentials);
this.remoteParameterOptions.push.apply(this.remoteParameterOptions, options);
} catch (error) {
this.remoteParameterOptionsLoadingIssues = error.message;

View file

@ -26,6 +26,7 @@ import {
ICredentialType,
IDataObject,
INodeCredentials,
INodeParameters,
INodePropertyOptions,
INodeTypeDescription,
} from 'n8n-workflow';
@ -152,12 +153,12 @@ export const restApi = Vue.extend({
},
// Returns all the parameter options from the server
getNodeParameterOptions: (nodeType: string, methodName: string, credentials?: INodeCredentials): Promise<INodePropertyOptions[]> => {
getNodeParameterOptions: (nodeType: string, methodName: string, currentNodeParameters: INodeParameters, credentials?: INodeCredentials): Promise<INodePropertyOptions[]> => {
const sendData = {
nodeType,
methodName,
credentials,
currentNodeParameters: this.$store.getters.activeNode.parameters,
currentNodeParameters,
};
return self.restApi().makeRestApiRequest('GET', '/node-parameter-options', sendData);
},