diff --git a/packages/cli/src/Server.ts b/packages/cli/src/Server.ts index ad2a3c1de5..d078c8594e 100644 --- a/packages/cli/src/Server.ts +++ b/packages/cli/src/Server.ts @@ -555,7 +555,7 @@ class App { this.app.get('/rest/node-parameter-options', ResponseHelper.send(async (req: express.Request, res: express.Response): Promise => { const nodeType = req.query.nodeType as string; let credentials: INodeCredentials | undefined = undefined; - const currentNodeParameters = req.query.currentNodeParameters as INodeParameters[]; + const currentNodeParameters = JSON.parse('' + req.query.currentNodeParameters) as INodeParameters; if (req.query.credentials !== undefined) { credentials = JSON.parse(req.query.credentials as string); } diff --git a/packages/cli/src/WorkflowExecuteAdditionalData.ts b/packages/cli/src/WorkflowExecuteAdditionalData.ts index 9665080ebd..7ac79310ba 100644 --- a/packages/cli/src/WorkflowExecuteAdditionalData.ts +++ b/packages/cli/src/WorkflowExecuteAdditionalData.ts @@ -387,10 +387,10 @@ export async function executeWorkflow(workflowInfo: IExecuteWorkflowInfo, additi * * @export * @param {IWorkflowCredentials} credentials - * @param {INodeParameters[]} [currentNodeParameters=[]] + * @param {INodeParameters} currentNodeParameters * @returns {Promise} */ -export async function getBase(credentials: IWorkflowCredentials, currentNodeParameters: INodeParameters[] = []): Promise { +export async function getBase(credentials: IWorkflowCredentials, currentNodeParameters?: INodeParameters): Promise { const urlBaseWebhook = WebhookHelpers.getWebhookBaseUrl(); const timezone = config.get('generic.timezone') as string; diff --git a/packages/core/src/NodeExecuteFunctions.ts b/packages/core/src/NodeExecuteFunctions.ts index 5b31f7bed8..640a75ca9a 100644 --- a/packages/core/src/NodeExecuteFunctions.ts +++ b/packages/core/src/NodeExecuteFunctions.ts @@ -152,7 +152,7 @@ export function getCredentials(workflow: Workflow, node: INode, type: string, ad throw new Error(`Node type "${node.type}" does not have any credentials of type "${type}" defined!`); } - if (NodeHelpers.displayParameter(node.parameters, nodeCredentialDescription, node.parameters) === false) { + if (NodeHelpers.displayParameter(additionalData.currentNodeParameters || node.parameters, nodeCredentialDescription, node.parameters) === false) { // Credentials should not be displayed so return undefined even if they would be defined return undefined; } @@ -666,14 +666,14 @@ export function getLoadOptionsFunctions(workflow: Workflow, node: INode, additio return getCredentials(workflow, node, type, additionalData); }, getCurrentNodeParameter: (parameterName: string): NodeParameterValue | INodeParameters | NodeParameterValue[] | INodeParameters[] | object | undefined => { - const nodeParameters = JSON.parse('' + additionalData.currentNodeParameters); + const nodeParameters = additionalData.currentNodeParameters; if (nodeParameters && nodeParameters[parameterName]) { return nodeParameters[parameterName]; } return undefined; }, getCurrentNodeParameters: (): INodeParameters | undefined => { - return JSON.parse('' + additionalData.currentNodeParameters); + return additionalData.currentNodeParameters; }, getNode: () => { return getNode(node); diff --git a/packages/nodes-base/nodes/Jira/GenericFunctions.ts b/packages/nodes-base/nodes/Jira/GenericFunctions.ts index 3f2e6dd82a..e0a7d8871e 100644 --- a/packages/nodes-base/nodes/Jira/GenericFunctions.ts +++ b/packages/nodes-base/nodes/Jira/GenericFunctions.ts @@ -1,4 +1,4 @@ -import { +import { OptionsWithUri, } from 'request'; @@ -9,13 +9,19 @@ import { ILoadOptionsFunctions, } from 'n8n-core'; -import { +import { IDataObject, + ICredentialDataDecryptedObject, } from 'n8n-workflow'; export async function jiraSoftwareCloudApiRequest(this: IHookFunctions | IExecuteFunctions | IExecuteSingleFunctions | ILoadOptionsFunctions, endpoint: string, method: string, body: any = {}, query?: IDataObject, uri?: string): Promise { // tslint:disable-line:no-any let data; let domain; - const jiraCloudCredentials = this.getCredentials('jiraSoftwareCloudApi'); + let jiraCloudCredentials: ICredentialDataDecryptedObject | undefined; + try { + jiraCloudCredentials = this.getCredentials('jiraSoftwareCloudApi'); + } catch (error) { + + } const jiraServerCredentials = this.getCredentials('jiraSoftwareServerApi'); if (jiraCloudCredentials === undefined && jiraServerCredentials === undefined) { throw new Error('No credentials got returned!'); diff --git a/packages/nodes-base/nodes/Jira/IssueDescription.ts b/packages/nodes-base/nodes/Jira/IssueDescription.ts index cd788c886e..bdb06179df 100644 --- a/packages/nodes-base/nodes/Jira/IssueDescription.ts +++ b/packages/nodes-base/nodes/Jira/IssueDescription.ts @@ -174,6 +174,31 @@ export const issueFields = [ default: [], required : false, description: 'Labels', + displayOptions: { + show: { + '/jiraVersion': [ + 'cloud', + ], + }, + }, + }, + { + displayName: 'Labels', + name: 'serverLabels', + type: 'string', + default: [], + required : false, + description: 'Labels', + displayOptions: { + show: { + '/jiraVersion': [ + 'server', + ], + }, + }, + typeOptions: { + multipleValues: true, + }, }, { displayName: 'Parent Issue Key', @@ -284,6 +309,31 @@ export const issueFields = [ default: [], required : false, description: 'Labels', + displayOptions: { + show: { + '/jiraVersion': [ + 'cloud', + ], + }, + }, + }, + { + displayName: 'Labels', + name: 'serverLabels', + type: 'string', + default: [], + required : false, + description: 'Labels', + displayOptions: { + show: { + '/jiraVersion': [ + 'server', + ], + }, + }, + typeOptions: { + multipleValues: true, + }, }, { displayName: 'Parent Issue Key', diff --git a/packages/nodes-base/nodes/Jira/JiraSoftwareCloud.node.ts b/packages/nodes-base/nodes/Jira/JiraSoftwareCloud.node.ts index eff27bad6b..5b64de4f95 100644 --- a/packages/nodes-base/nodes/Jira/JiraSoftwareCloud.node.ts +++ b/packages/nodes-base/nodes/Jira/JiraSoftwareCloud.node.ts @@ -140,18 +140,31 @@ export class JiraSoftwareCloud implements INodeType { const returnData: INodePropertyOptions[] = []; const issueTypes = await jiraSoftwareCloudApiRequest.call(this, '/issuetype', 'GET'); - - for (const issueType of issueTypes) { - if (issueType.scope.project.id === projectId) { + const jiraVersion = this.getCurrentNodeParameter('jiraVersion') as string; + if (jiraVersion === "server") { + for (const issueType of issueTypes) { const issueTypeName = issueType.name; const issueTypeId = issueType.id; - + returnData.push({ name: issueTypeName, value: issueTypeId, }); } + } else { + for (const issueType of issueTypes) { + if (issueType.scope.project.id === projectId) { + const issueTypeName = issueType.name; + const issueTypeId = issueType.id; + + returnData.push({ + name: issueTypeName, + value: issueTypeId, + }); + } + } } + return returnData; }, @@ -197,18 +210,37 @@ export class JiraSoftwareCloud implements INodeType { // select them easily async getUsers(this: ILoadOptionsFunctions): Promise { const returnData: INodePropertyOptions[] = []; + const jiraVersion = this.getCurrentNodeParameter("jiraVersion") as string; + if (jiraVersion === "server") { + // the interface call must bring username + const users = await jiraSoftwareCloudApiRequest.call(this, "/user/search", "GET", {}, + { + username: "'", + } + ); + for (const user of users) { + const userName = user.displayName; + const userId = user.name; + + returnData.push({ + name: userName, + value: userId, + }); + } + } else { + const users = await jiraSoftwareCloudApiRequest.call(this, '/users/search', 'GET'); - const users = await jiraSoftwareCloudApiRequest.call(this, '/users/search', 'GET'); + for (const user of users) { + const userName = user.displayName; + const userId = user.accountId; - for (const user of users) { - const userName = user.displayName; - const userId = user.accountId; - - returnData.push({ - name: userName, - value: userId, - }); + returnData.push({ + name: userName, + value: userId, + }); + } } + return returnData; }, @@ -283,6 +315,9 @@ export class JiraSoftwareCloud implements INodeType { if (additionalFields.labels) { fields.labels = additionalFields.labels as string[]; } + if (additionalFields.serverLabels) { + fields.labels = additionalFields.serverLabels as string[]; + } if (additionalFields.priority) { fields.priority = { id: additionalFields.priority as string, @@ -342,6 +377,9 @@ export class JiraSoftwareCloud implements INodeType { if (updateFields.labels) { fields.labels = updateFields.labels as string[]; } + if (updateFields.serverLabels) { + fields.labels = updateFields.serverLabels as string[]; + } if (updateFields.priority) { fields.priority = { id: updateFields.priority as string, diff --git a/packages/workflow/src/Interfaces.ts b/packages/workflow/src/Interfaces.ts index 6a1500e0d7..373a40bcf7 100644 --- a/packages/workflow/src/Interfaces.ts +++ b/packages/workflow/src/Interfaces.ts @@ -680,7 +680,7 @@ export interface IWorkflowExecuteAdditionalData { timezone: string; webhookBaseUrl: string; webhookTestBaseUrl: string; - currentNodeParameters? : INodeParameters[]; + currentNodeParameters? : INodeParameters; } export type WorkflowExecuteMode = 'cli' | 'error' | 'integrated' | 'internal' | 'manual' | 'retry' | 'trigger' | 'webhook';