diff --git a/packages/nodes-base/nodes/Mattermost/GenericFunctions.ts b/packages/nodes-base/nodes/Mattermost/GenericFunctions.ts index bb08acdf76..ac712e1d66 100644 --- a/packages/nodes-base/nodes/Mattermost/GenericFunctions.ts +++ b/packages/nodes-base/nodes/Mattermost/GenericFunctions.ts @@ -7,13 +7,14 @@ import { import { OptionsWithUri } from 'request'; import { IDataObject } from 'n8n-workflow'; - -export interface IAttachment { +export interface IAttachment { fields: { item?: object[]; + }, + actions: { + item?: object[]; }; -} - +} /** * Make an API request to Telegram diff --git a/packages/nodes-base/nodes/Mattermost/Mattermost.node.ts b/packages/nodes-base/nodes/Mattermost/Mattermost.node.ts index 5026955952..77d6b00f05 100644 --- a/packages/nodes-base/nodes/Mattermost/Mattermost.node.ts +++ b/packages/nodes-base/nodes/Mattermost/Mattermost.node.ts @@ -448,78 +448,178 @@ export class Mattermost implements INodeType { placeholder: 'Add attachment item', options: [ { - displayName: 'Fallback Text', - name: 'fallback', - type: 'string', + displayName: 'Actions', + name: 'actions', + placeholder: 'Add Actions', + description: 'Actions to add to message. More information can be found here', + type: 'fixedCollection', typeOptions: { - alwaysOpenEditWindow: true, + multipleValues: true, }, - default: '', - description: 'Required plain-text summary of the attachment.', - }, - { - displayName: 'Text', - name: 'text', - type: 'string', - typeOptions: { - alwaysOpenEditWindow: true, - }, - default: '', - description: 'Text to send.', - }, - { - displayName: 'Title', - name: 'title', - type: 'string', - typeOptions: { - alwaysOpenEditWindow: true, - }, - default: '', - description: 'Title of the message.', - }, - { - displayName: 'Title Link', - name: 'title_link', - type: 'string', - typeOptions: { - alwaysOpenEditWindow: true, - }, - default: '', - description: 'Link of the title.', - }, - { - displayName: 'Color', - name: 'color', - type: 'color', - default: '#ff0000', - description: 'Color of the line left of text.', - }, - { - displayName: 'Pretext', - name: 'pretext', - type: 'string', - typeOptions: { - alwaysOpenEditWindow: true, - }, - default: '', - description: 'Text which appears before the message block.', - }, - { - displayName: 'Author Name', - name: 'author_name', - type: 'string', - default: '', - description: 'Name that should appear.', - }, - { - displayName: 'Author Link', - name: 'author_link', - type: 'string', - typeOptions: { - alwaysOpenEditWindow: true, - }, - default: '', - description: 'Link for the author.', + default: {}, + options: [ + { + displayName: 'Item', + name: 'item', + values: [ + { + displayName: 'Type', + name: 'type', + type: 'options', + options: [ + { + name: 'Button', + value: 'button', + }, + { + name: 'Select', + value: 'select', + }, + ], + default: 'button', + description: 'The type of the action.', + }, + { + displayName: 'Data Source', + name: 'data_source', + type: 'options', + displayOptions: { + show: { + type: [ + 'select' + ], + }, + }, + options: [ + { + name: 'Channels', + value: 'channels', + }, + { + name: 'Custom', + value: 'custom', + }, + { + name: 'Users', + value: 'users', + }, + + ], + default: 'custom', + description: 'The type of the action.', + }, + { + displayName: 'Options', + name: 'options', + placeholder: 'Add Option', + description: 'Adds a new option to select field.', + type: 'fixedCollection', + typeOptions: { + multipleValues: true, + }, + displayOptions: { + show: { + data_source: [ + 'custom' + ], + }, + }, + default: {}, + options: [ + { + name: 'option', + displayName: 'Option', + default: {}, + values: [ + { + displayName: 'Option Text', + name: 'text', + type: 'string', + default: '', + description: 'Text of the option.', + }, + { + displayName: 'Option Value', + name: 'value', + type: 'string', + default: '', + description: 'Value of the option.', + }, + ] + }, + ], + }, + { + displayName: 'Name', + name: 'name', + type: 'string', + default: '', + description: 'Name of the Action.', + }, + { + displayName: 'Integration', + name: 'integration', + placeholder: 'Add Integration', + description: 'Integration to add to message.', + type: 'fixedCollection', + typeOptions: { + multipleValues: false, + }, + default: {}, + options: [ + { + displayName: 'Item', + name: 'item', + default: {}, + values: [ + { + displayName: 'URL', + name: 'url', + type: 'string', + default: '', + description: 'URL of the Integration.', + }, + { + displayName: 'Context', + name: 'context', + placeholder: 'Add Context to Integration', + description: 'Adds a Context values set.', + type: 'fixedCollection', + typeOptions: { + multipleValues: true, + }, + default: {}, + options: [ + { + name: 'property', + displayName: 'Property', + default: {}, + values: [ + { + displayName: 'Property Name', + name: 'name', + type: 'string', + default: '', + description: 'Name of the property to set.', + }, + { + displayName: 'Property Value', + name: 'value', + type: 'string', + default: '', + description: 'Value of the property to set.', + }, + ] + }, + ], + }, + ] + }, + ], + }, + ] + }, + ], }, { displayName: 'Author Icon', @@ -532,44 +632,38 @@ export class Mattermost implements INodeType { description: 'Icon which should appear for the user.', }, { - displayName: 'Image URL', - name: 'image_url', + displayName: 'Author Link', + name: 'author_link', type: 'string', typeOptions: { alwaysOpenEditWindow: true, }, default: '', - description: 'URL of image.', + description: 'Link for the author.', }, { - displayName: 'Thumbnail URL', - name: 'thumb_url', + displayName: 'Author Name', + name: 'author_name', type: 'string', - typeOptions: { - alwaysOpenEditWindow: true, - }, default: '', - description: 'URL of thumbnail.', + description: 'Name that should appear.', }, { - displayName: 'Footer', - name: 'footer', - type: 'string', - typeOptions: { - alwaysOpenEditWindow: true, - }, - default: '', - description: 'Text of footer to add.', + displayName: 'Color', + name: 'color', + type: 'color', + default: '#ff0000', + description: 'Color of the line left of text.', }, { - displayName: 'Footer Icon', - name: 'footer_icon', + displayName: 'Fallback Text', + name: 'fallback', type: 'string', typeOptions: { alwaysOpenEditWindow: true, }, default: '', - description: 'Icon which should appear next to footer.', + description: 'Required plain-text summary of the attachment.', }, { displayName: 'Fields', @@ -610,7 +704,87 @@ export class Mattermost implements INodeType { ] }, ], - } + }, + { + displayName: 'Footer', + name: 'footer', + type: 'string', + typeOptions: { + alwaysOpenEditWindow: true, + }, + default: '', + description: 'Text of footer to add.', + }, + { + displayName: 'Footer Icon', + name: 'footer_icon', + type: 'string', + typeOptions: { + alwaysOpenEditWindow: true, + }, + default: '', + description: 'Icon which should appear next to footer.', + }, + { + displayName: 'Image URL', + name: 'image_url', + type: 'string', + typeOptions: { + alwaysOpenEditWindow: true, + }, + default: '', + description: 'URL of image.', + }, + { + displayName: 'Pretext', + name: 'pretext', + type: 'string', + typeOptions: { + alwaysOpenEditWindow: true, + }, + default: '', + description: 'Text which appears before the message block.', + }, + { + displayName: 'Text', + name: 'text', + type: 'string', + typeOptions: { + alwaysOpenEditWindow: true, + }, + default: '', + description: 'Text to send.', + }, + { + displayName: 'Thumbnail URL', + name: 'thumb_url', + type: 'string', + typeOptions: { + alwaysOpenEditWindow: true, + }, + default: '', + description: 'URL of thumbnail.', + }, + { + displayName: 'Title', + name: 'title', + type: 'string', + typeOptions: { + alwaysOpenEditWindow: true, + }, + default: '', + description: 'Title of the message.', + }, + { + displayName: 'Title Link', + name: 'title_link', + type: 'string', + typeOptions: { + alwaysOpenEditWindow: true, + }, + default: '', + description: 'Link of the title.', + }, ], }, { @@ -890,6 +1064,47 @@ export class Mattermost implements INodeType { } } } + for (const attachment of attachments) { + if (attachment.actions !== undefined) { + if (attachment.actions.item !== undefined) { + // Move the field-content up + // @ts-ignore + attachment.actions = attachment.actions.item; + } else { + // If it does not have any items set remove it + delete attachment.actions; + } + } + } + + for (const attachment of attachments) { + if (Array.isArray(attachment.actions)) { + for (const attaction of attachment.actions) { + + if (attaction.type === 'button') { + delete attaction.type; + } + if (attaction.data_source === 'custom') { + delete attaction.data_source; + } + if (attaction.options) { + attaction.options = attaction.options.option; + } + + if (attaction.integration.item !== undefined) { + attaction.integration = attaction.integration.item; + if (Array.isArray(attaction.integration.context.property)) { + const tmpcontex = {}; + for (const attactionintegprop of attaction.integration.context.property) { + Object.assign(tmpcontex, { [attactionintegprop.name]: attactionintegprop.value }); + } + delete attaction.integration.context; + attaction.integration.context = tmpcontex; + } + } + } + } + } body.props = { attachments,