feat(HubSpot Node): Overhaul the HubSpot Node (#4337)

* 🎨 Change current defualt ressource to contact

* Change display name for list membership

* 🎨 Change display name for ressource properties

* 🔥 Remove Name & ID in Display name

* 🐛 Fix simplify data where behavior was wrong

* 🎨 Move simplfy output to additional fields

* Change data type from string to number for IDs

* Add tooltip for contact ID

* 🎨 Change tooltip for list of Id's

* Change name of fields and reorgaized options

* 🥅 Add clearer errors for some specific cases

* 🎨 changed filters in Deal get all

* Deprecate form ressource

*  add pipeline dropdown to auto fetch

* 🎨 Change direction's name

* 🎨 Change description of filter groups

* 🎨 Add validation and errors for maximum filters

*  Add ressource locator to all ressources

* 🎨 add tooltip for timestamp when using expressions

* add versioning

* 🐛 fixes small bugs and ui problems

* remove show options that was breaking custom prop

*  add ownership to deals

*  add notice for credential depreciation

* 🎨 Refactor names for RLC

* 🎨 Fixes to Deal

*  Inprove delete confirmation message

* 🎨 Fixe titles of fields

* 🎨 Fixe correct ressource hint

* 🎨 Improve error when requesting non existing ressource

* ️ Improve get deal

*  Improve search by domain for companies

*  Improve getting recently created deals

* 🎨 Improve versioning file structure

* 🥅 Improve error for unknown ids

*  Add filters to recently search for companies

*  Uniformize including properties for contact

*  Improve get all operation for Companies

* 🎨 Change filters name

* 🎨 Remove useless descriptions

* 🎨Improve description

*  Dynamically retrieve the correct operator for the properties

* 🥅 Improve error handeling

* 🥅 improve error when not finding the id

* ️Add searchable feature to Deal and contacts

* 🚨 Fix linting issues

* 🚨 Fix linting issues for V1 Hubspot

* 🐛 Fix pairedItem for v2 hubspot

* 🚨 Fix linting in HubSpot Description

* 🚨 More linting fixes

* Fix error handling

* Update endpoint for deleting object

* Fix label for recent actions

* 🐛 fix listMemberships typo in V1 and V2

* docs: Stop assuming the user's gender in code comments (after merge)

c87262a312

* fixing V1 GenericFunctions.ts api query limit as number

* Update description for ticket

* Add type to RLC

* Revert "Add type to RLC"

This reverts commit 578dacfb97bb631df7edb6e62ac1abfedad096d3.

* Add type to RLC engagement

---------

Co-authored-by: Marcus <marcus@n8n.io>
This commit is contained in:
agobrech
2023-05-08 15:15:13 +02:00
committed by GitHub
parent 0494022ad3
commit 2913e676e6
24 changed files with 12891 additions and 2736 deletions

File diff suppressed because it is too large Load Diff

View File

@@ -10,7 +10,7 @@ import type {
} from 'n8n-workflow';
import { NodeOperationError } from 'n8n-workflow';
import { hubspotApiRequest, propertyEvents } from './GenericFunctions';
import { hubspotApiRequest, propertyEvents } from './V1/GenericFunctions';
import { createHash } from 'crypto';

View File

@@ -995,6 +995,7 @@ export const companyFields: INodeProperties[] = [
},
},
required: true,
description: "The company's website domain to search for, like n8n.io",
default: '',
},
{

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,131 @@
import type { INodeProperties } from 'n8n-workflow';
export const contactListOperations: INodeProperties[] = [
{
displayName: 'Operation',
name: 'operation',
type: 'options',
noDataExpression: true,
displayOptions: {
show: {
resource: ['contactList'],
},
},
options: [
{
name: 'Add',
value: 'add',
description: 'Add contact to a list',
action: 'Add a contact to a list',
},
{
name: 'Remove',
value: 'remove',
description: 'Remove a contact from a list',
action: 'Remove a contact from a list',
},
],
default: 'add',
},
];
export const contactListFields: INodeProperties[] = [
/* -------------------------------------------------------------------------- */
/* contactList:add */
/* -------------------------------------------------------------------------- */
{
displayName: 'By',
name: 'by',
type: 'options',
options: [
{
name: 'Contact ID',
value: 'id',
},
{
name: 'Email',
value: 'email',
},
],
required: true,
displayOptions: {
show: {
resource: ['contactList'],
operation: ['add'],
},
},
default: 'email',
},
{
displayName: 'Email',
name: 'email',
type: 'string',
placeholder: 'name@email.com',
required: true,
displayOptions: {
show: {
resource: ['contactList'],
operation: ['add'],
by: ['email'],
},
},
default: '',
},
{
displayName: 'Contact to Add',
name: 'id',
type: 'number',
required: true,
displayOptions: {
show: {
resource: ['contactList'],
operation: ['add'],
by: ['id'],
},
},
default: '',
},
{
displayName: 'List to Add From',
name: 'listId',
type: 'number',
required: true,
displayOptions: {
show: {
resource: ['contactList'],
operation: ['add'],
},
},
default: '',
},
/* -------------------------------------------------------------------------- */
/* contactList:remove */
/* -------------------------------------------------------------------------- */
{
displayName: 'Contact to Remove',
name: 'id',
type: 'number',
required: true,
displayOptions: {
show: {
resource: ['contactList'],
operation: ['remove'],
},
},
default: '',
},
{
displayName: 'List to Remove From',
name: 'listId',
type: 'number',
required: true,
displayOptions: {
show: {
resource: ['contactList'],
operation: ['remove'],
},
},
default: '',
},
];

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,11 @@
import type { IDataObject } from 'n8n-workflow';
export interface IAssociation {
associatedCompanyIds?: number[];
associatedVids?: number[];
}
export interface IDeal {
associations?: IAssociation;
properties?: IDataObject[];
}

View File

@@ -0,0 +1,543 @@
import type { INodeProperties } from 'n8n-workflow';
export const engagementOperations: INodeProperties[] = [
{
displayName: 'Operation',
name: 'operation',
type: 'options',
noDataExpression: true,
displayOptions: {
show: {
resource: ['engagement'],
},
},
options: [
{
name: 'Create',
value: 'create',
description: 'Create an engagement',
action: 'Create an engagement',
},
{
name: 'Delete',
value: 'delete',
description: 'Delete an engagement',
action: 'Delete an engagement',
},
{
name: 'Get',
value: 'get',
description: 'Get an engagement',
action: 'Get an engagement',
},
{
name: 'Get Many',
value: 'getAll',
description: 'Get many engagements',
action: 'Get many engagements',
},
],
default: 'create',
},
];
export const engagementFields: INodeProperties[] = [
/* -------------------------------------------------------------------------- */
/* engagement:create */
/* -------------------------------------------------------------------------- */
{
displayName: 'Type',
name: 'type',
type: 'options',
required: true,
options: [
{
name: 'Call',
value: 'call',
},
{
name: 'Email',
value: 'email',
},
{
name: 'Meeting',
value: 'meeting',
},
{
name: 'Task',
value: 'task',
},
],
displayOptions: {
show: {
resource: ['engagement'],
operation: ['create'],
},
},
default: '',
},
{
displayName: 'Metadata',
name: 'metadata',
type: 'collection',
placeholder: 'Add Field',
default: {},
displayOptions: {
show: {
resource: ['engagement'],
operation: ['create'],
type: ['task'],
},
},
options: [
{
displayName: 'Body',
name: 'body',
type: 'string',
default: '',
},
{
displayName: 'For Object Type',
name: 'forObjectType',
type: 'options',
options: [
{
name: 'Company',
value: 'COMPANY',
},
{
name: 'Contact',
value: 'CONTACT',
},
],
default: '',
},
{
displayName: 'Status',
name: 'status',
type: 'options',
options: [
{
name: 'Completed',
value: 'COMPLETED',
},
{
name: 'Deferred',
value: 'DEFERRED',
},
{
name: 'In Progress',
value: 'IN_PROGRESS',
},
{
name: 'Not Started',
value: 'NOT_STARTED',
},
{
name: 'Waiting',
value: 'WAITING',
},
],
default: '',
},
{
displayName: 'Subject',
name: 'subject',
type: 'string',
default: '',
},
],
},
{
displayName: 'Metadata',
name: 'metadata',
type: 'collection',
placeholder: 'Add Field',
default: {},
displayOptions: {
show: {
resource: ['engagement'],
operation: ['create'],
type: ['email'],
},
},
options: [
{
displayName: 'BCC',
name: 'bcc',
type: 'string',
typeOptions: {
multipleValues: true,
multipleValueButtonText: 'Add BCC',
},
default: '',
},
{
displayName: 'CC',
name: 'cc',
type: 'string',
typeOptions: {
multipleValues: true,
multipleValueButtonText: 'Add CC',
},
default: '',
},
{
displayName: 'From Email',
name: 'fromEmail',
type: 'string',
default: '',
},
{
displayName: 'From First Name',
name: 'firstName',
type: 'string',
default: '',
},
{
displayName: 'From Last Name',
name: 'lastName',
type: 'string',
default: '',
},
{
displayName: 'HTML',
name: 'html',
type: 'string',
default: '',
},
{
displayName: 'Subject',
name: 'subject',
type: 'string',
default: '',
},
{
displayName: 'To Emails',
name: 'toEmail',
type: 'string',
typeOptions: {
multipleValues: true,
multipleValueButtonText: 'Add Email',
},
default: '',
},
],
},
{
displayName: 'Metadata',
name: 'metadata',
type: 'collection',
placeholder: 'Add Field',
default: {},
displayOptions: {
show: {
resource: ['engagement'],
operation: ['create'],
type: ['meeting'],
},
},
options: [
{
displayName: 'Body',
name: 'body',
type: 'string',
default: '',
},
{
displayName: 'End Time',
name: 'endTime',
type: 'dateTime',
default: '',
description:
'When using expressions, the time should be specified in YYYY-MM-DD hh-mm-ss format',
},
{
displayName: 'Internal Meeting Notes',
name: 'internalMeetingNotes',
type: 'string',
default: '',
},
{
displayName: 'Start Time',
name: 'startTime',
type: 'dateTime',
default: '',
description:
'When using expressions, the time should be specified in YYYY-MM-DD hh-mm-ss format',
},
{
displayName: 'Title',
name: 'title',
type: 'string',
default: '',
},
],
},
{
displayName: 'Metadata',
name: 'metadata',
type: 'collection',
placeholder: 'Add Field',
default: {},
displayOptions: {
show: {
resource: ['engagement'],
operation: ['create'],
type: ['call'],
},
},
options: [
{
displayName: 'Body',
name: 'body',
type: 'string',
default: '',
},
{
displayName: 'Duration Milliseconds',
name: 'durationMilliseconds',
type: 'number',
default: 0,
},
{
displayName: 'From Number',
name: 'fromNumber',
type: 'string',
default: '',
},
{
displayName: 'Recording URL',
name: 'recordingUrl',
type: 'string',
default: '',
},
{
displayName: 'Status',
name: 'status',
type: 'options',
options: [
{
name: 'Busy',
value: 'BUSY',
},
{
name: 'Calling CRM User',
value: 'CALLING_CRM_USER',
},
{
name: 'Canceled',
value: 'CANCELED',
},
{
name: 'Completed',
value: 'COMPLETED',
},
{
name: 'Connecting',
value: 'CONNECTING',
},
{
name: 'Failed',
value: 'FAILED',
},
{
name: 'In Progress',
value: 'IN_PROGRESS',
},
{
name: 'No Answer',
value: 'NO_ANSWER',
},
{
name: 'Queued',
value: 'QUEUED',
},
{
name: 'Ringing',
value: 'RINGING',
},
],
default: 'QUEUED',
},
{
displayName: 'To Number',
name: 'toNumber',
type: 'string',
default: '',
},
],
},
{
displayName: 'Engagement Properties',
name: 'additionalFields',
type: 'collection',
placeholder: 'Add Property',
default: {},
displayOptions: {
show: {
resource: ['engagement'],
operation: ['create'],
},
},
options: [
{
displayName: 'Associations',
name: 'associations',
type: 'collection',
placeholder: 'Add Field',
default: {},
options: [
{
displayName: 'Company IDs',
name: 'companyIds',
type: 'string',
default: '',
},
{
displayName: 'Contact IDs',
name: 'contactIds',
type: 'string',
default: '',
},
{
displayName: 'Deals IDs',
name: 'dealIds',
type: 'string',
default: '',
},
{
displayName: 'Owner IDs',
name: 'ownerIds',
type: 'string',
default: '',
},
{
displayName: 'Ticket IDs',
name: 'ticketIds',
type: 'string',
default: '',
},
],
},
],
},
/* -------------------------------------------------------------------------- */
/* engagement:get/delete */
/* -------------------------------------------------------------------------- */
{
displayName: 'Engagement to Get',
name: 'engagementId',
type: 'resourceLocator',
default: { mode: 'list', value: '' },
required: true,
displayOptions: {
show: {
resource: ['engagement'],
operation: ['get'],
},
},
modes: [
{
displayName: 'From List',
name: 'list',
type: 'list',
placeholder: 'Select from the list',
typeOptions: {
searchListMethod: 'searchEngagements',
},
},
{
displayName: 'By Id',
name: 'id',
type: 'string',
placeholder: '58539222',
validation: [
{
type: 'regex',
properties: {
regex: '[0-9]+',
errorMessage: 'Not a valid HubSpot Engagement ID',
},
},
],
},
],
},
{
displayName: 'Engagement to Delete',
name: 'engagementId',
type: 'resourceLocator',
default: { mode: 'list', value: '' },
required: true,
displayOptions: {
show: {
resource: ['engagement'],
operation: ['delete'],
},
},
modes: [
{
displayName: 'From List',
name: 'list',
type: 'list',
placeholder: 'Select from the list',
typeOptions: {
searchListMethod: 'searchEngagements',
},
},
{
displayName: 'By Id',
name: 'id',
type: 'string',
placeholder: '58539222',
validation: [
{
type: 'regex',
properties: {
regex: '[0-9]+',
errorMessage: 'Not a valid HubSpot Engagement ID',
},
},
],
},
],
},
/* -------------------------------------------------------------------------- */
/* engagement:getAll */
/* -------------------------------------------------------------------------- */
{
displayName: 'Return All',
name: 'returnAll',
type: 'boolean',
displayOptions: {
show: {
resource: ['engagement'],
operation: ['getAll'],
},
},
default: false,
description: 'Whether to return all results or only up to a given limit',
},
{
displayName: 'Limit',
name: 'limit',
type: 'number',
displayOptions: {
show: {
resource: ['engagement'],
operation: ['getAll'],
returnAll: [false],
},
},
typeOptions: {
minValue: 1,
maxValue: 250,
},
default: 100,
description: 'Max number of results to return',
},
];

View File

@@ -0,0 +1,315 @@
import type { INodeProperties } from 'n8n-workflow';
export const formOperations: INodeProperties[] = [
{
displayName: 'Operation',
name: 'operation',
type: 'options',
noDataExpression: true,
displayOptions: {
show: {
resource: ['form'],
},
},
options: [
{
name: 'Get Fields',
value: 'getFields',
description: 'Get all fields from a form',
action: 'Get all fields from a form',
},
{
name: 'Submit',
value: 'submit',
description: 'Submit data to a form',
action: 'Submit a form',
},
],
default: 'getFields',
},
];
export const formFields: INodeProperties[] = [
/* -------------------------------------------------------------------------- */
/* form:submit */
/* -------------------------------------------------------------------------- */
{
displayName: 'Form Name or ID',
name: 'formId',
type: 'options',
typeOptions: {
loadOptionsMethod: 'getForms',
},
required: true,
displayOptions: {
show: {
resource: ['form'],
operation: ['submit'],
},
},
default: '',
description:
'The ID of the form you\'re sending data to. Choose from the list, or specify an ID using an <a href="https://docs.n8n.io/code-examples/expressions/">expression</a>.',
},
{
displayName: 'Options',
name: 'additionalFields',
type: 'collection',
placeholder: 'Add Option',
default: {},
displayOptions: {
show: {
resource: ['form'],
operation: ['submit'],
},
},
options: [
{
displayName: 'Skip Validation',
name: 'skipValidation',
type: 'boolean',
default: false,
description: 'Whether or not to skip validation based on the form settings',
},
{
displayName: 'Submitted At',
name: 'submittedAt',
type: 'dateTime',
default: '',
description:
'Time of the form submission. When using expressions, the time should be specified in YYYY-MM-DD hh-mm-ss format.',
},
],
},
{
displayName: 'Context',
name: 'contextUi',
placeholder: 'Add Context',
type: 'fixedCollection',
typeOptions: {
multipleValues: false,
},
displayOptions: {
show: {
resource: ['form'],
operation: ['submit'],
},
},
default: {},
options: [
{
displayName: 'Context',
name: 'contextValue',
values: [
{
displayName: 'HubSpot Usertoken',
name: 'hutk',
type: 'string',
default: '',
description:
'Include this parameter and set it to the hubspotutk cookie value to enable cookie tracking on your submission',
},
{
displayName: 'IP Address',
name: 'ipAddress',
type: 'string',
default: '',
description: 'The IP address of the visitor filling out the form',
},
{
displayName: 'Page URI',
name: 'pageUri',
type: 'string',
default: '',
description: 'The URI of the page the submission happened on',
},
{
displayName: 'Page Name',
name: 'pageName',
type: 'string',
default: '',
description: 'The name or title of the page the submission happened on',
},
{
displayName: 'Page ID',
name: 'pageId',
type: 'number',
default: '',
description: 'The ID of a page created on the HubSpot CMS',
},
{
displayName: 'SFDC Campaign ID',
name: 'sfdcCampaignId',
type: 'number',
default: '',
description:
'If the form is for an account using the HubSpot Salesforce Integration, you can include the ID of a Salesforce campaign to add the contact to the specified campaign',
},
{
displayName: 'Go to Webinar Webinar ID',
name: 'goToWebinarWebinarKey',
type: 'number',
default: '',
description:
'If the form is for an account using the HubSpot GoToWebinar Integration, you can include the ID of a webinar to enroll the contact in that webinar when they submit the form',
},
],
},
],
},
{
displayName: 'Legal Consent',
name: 'lengalConsentUi',
placeholder: 'Add Legal Consent',
type: 'fixedCollection',
typeOptions: {
multipleValues: false,
},
displayOptions: {
show: {
resource: ['form'],
operation: ['submit'],
},
},
default: {},
options: [
{
displayName: 'Consent',
name: 'lengalConsentValues',
values: [
{
displayName: 'Consent To Process',
name: 'consentToProcess',
type: 'boolean',
default: false,
description: 'Whether or not the visitor checked the Consent to process checkbox',
},
{
displayName: 'Text',
name: 'text',
type: 'string',
default: '',
description: 'The text displayed to the visitor for the Consent to process checkbox',
},
{
displayName: 'Communications',
name: 'communicationsUi',
placeholder: 'Add Communication',
type: 'fixedCollection',
typeOptions: {
multipleValues: true,
},
default: {},
options: [
{
displayName: 'Communication',
name: 'communicationValues',
values: [
{
displayName: 'Subcription Type Name or ID',
name: 'subscriptionTypeId',
type: 'options',
typeOptions: {
loadOptionsMethod: 'getSubscriptionTypes',
},
default: '',
description:
'The ID of the specific subscription type. Choose from the list, or specify an ID using an <a href="https://docs.n8n.io/code-examples/expressions/">expression</a>.',
},
{
displayName: 'Value',
name: 'value',
type: 'boolean',
default: false,
description:
'Whether or not the visitor checked the checkbox for this subscription type',
},
{
displayName: 'Text',
name: 'text',
type: 'string',
default: '',
description:
'The text displayed to the visitor for this specific subscription checkbox',
},
],
},
],
},
],
},
{
displayName: 'Legitimate Interest',
name: 'legitimateInterestValues',
values: [
{
displayName: 'Subcription Type Name or ID',
name: 'subscriptionTypeId',
type: 'options',
typeOptions: {
loadOptionsMethod: 'getSubscriptionTypes',
},
default: '',
description:
'The ID of the specific subscription type that this forms indicates interest to. Choose from the list, or specify an ID using an <a href="https://docs.n8n.io/code-examples/expressions/">expression</a>.',
},
{
displayName: 'Value',
name: 'value',
type: 'boolean',
default: false,
// eslint-disable-next-line n8n-nodes-base/node-param-description-boolean-without-whether
description:
"This must be true when using the 'legitimateInterest' option, as it reflects the consent indicated by the visitor when submitting the form",
},
{
displayName: 'Legal Basis',
name: 'legalBasis',
type: 'options',
options: [
{
name: 'Customer',
value: 'CUSTOMER',
},
{
name: 'Lead',
value: 'LEAD',
},
],
default: '',
description: 'The privacy text displayed to the visitor',
},
{
displayName: 'Text',
name: 'text',
type: 'string',
default: '',
description: 'The privacy text displayed to the visitor',
},
],
},
],
},
/* -------------------------------------------------------------------------- */
/* form:getFields */
/* -------------------------------------------------------------------------- */
{
displayName: 'Form Name or ID',
name: 'formId',
type: 'options',
typeOptions: {
loadOptionsMethod: 'getForms',
},
required: true,
displayOptions: {
show: {
resource: ['form'],
operation: ['getFields'],
},
},
default: '',
description:
'The ID of the form. Choose from the list, or specify an ID using an <a href="https://docs.n8n.io/code-examples/expressions/">expression</a>.',
},
];

View File

@@ -0,0 +1,21 @@
import type { IDataObject } from 'n8n-workflow';
export interface IContext {
goToWebinarWebinarKey?: string;
hutk?: string;
ipAddress?: string;
pageId?: string;
pageName?: string;
pageUri?: string;
sfdcCampaignId?: string;
}
export interface IForm {
portalId?: number;
formId?: string;
fields?: IDataObject[];
legalConsentOptions?: IDataObject;
context?: IContext[];
submittedAt?: number;
skipValidation?: boolean;
}

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,606 @@
import type { INodeProperties } from 'n8n-workflow';
export const ticketOperations: INodeProperties[] = [
{
displayName: 'Operation',
name: 'operation',
type: 'options',
noDataExpression: true,
displayOptions: {
show: {
resource: ['ticket'],
},
},
options: [
{
name: 'Create',
value: 'create',
description: 'Create a ticket',
action: 'Create a ticket',
},
{
name: 'Delete',
value: 'delete',
description: 'Delete a ticket',
action: 'Delete a ticket',
},
{
name: 'Get',
value: 'get',
description: 'Get a ticket',
action: 'Get a ticket',
},
{
name: 'Get Many',
value: 'getAll',
description: 'Get many tickets',
action: 'Get many tickets',
},
{
name: 'Update',
value: 'update',
description: 'Update a ticket',
action: 'Update a ticket',
},
],
default: 'create',
},
];
export const ticketFields: INodeProperties[] = [
/* -------------------------------------------------------------------------- */
/* ticket:create */
/* -------------------------------------------------------------------------- */
{
displayName: 'Pipeline Name or ID',
name: 'pipelineId',
type: 'options',
required: true,
typeOptions: {
loadOptionsMethod: 'getTicketPipelines',
},
displayOptions: {
show: {
resource: ['ticket'],
operation: ['create'],
},
},
default: '',
description:
'The ID of the pipeline the ticket is in. Choose from the list, or specify an ID using an <a href="https://docs.n8n.io/code-examples/expressions/">expression</a>.',
},
{
displayName: 'Stage Name or ID',
name: 'stageId',
type: 'options',
required: true,
typeOptions: {
loadOptionsMethod: 'getTicketStages',
loadOptionsDependsOn: ['pipelineId'],
},
displayOptions: {
show: {
resource: ['ticket'],
operation: ['create'],
},
},
default: '',
description:
'The stage ID of the pipeline the ticket is in; depends on Pipeline ID. Choose from the list, or specify an ID using an <a href="https://docs.n8n.io/code-examples/expressions/">expression</a>.',
},
{
displayName: 'Ticket Name',
name: 'ticketName',
type: 'string',
required: true,
displayOptions: {
show: {
resource: ['ticket'],
operation: ['create'],
},
},
default: '',
},
{
displayName: 'Ticket Properties',
name: 'additionalFields',
type: 'collection',
placeholder: 'Add Property',
default: {},
displayOptions: {
show: {
resource: ['ticket'],
operation: ['create'],
},
},
options: [
{
displayName: 'Company Names or IDs',
name: 'associatedCompanyIds',
type: 'multiOptions',
typeOptions: {
loadOptionsMethod: 'getCompanies',
},
default: [],
description:
'Whether to include specific Company properties in the returned results. Choose from a list, or specify IDs using an <a href="https://docs.n8n.io/code-examples/expressions/">expression</a>. Choose from the list, or specify IDs using an <a href="https://docs.n8n.io/code-examples/expressions/">expression</a>.',
},
{
displayName: 'Contact Names or IDs',
name: 'associatedContactIds',
type: 'multiOptions',
typeOptions: {
loadOptionsMethod: 'getContacts',
},
default: [],
description:
'Whether to include specific Contact properties in the returned results. Choose from a list, or specify IDs using an <a href="https://docs.n8n.io/code-examples/expressions/">expression</a>. Choose from the list, or specify IDs using an <a href="https://docs.n8n.io/code-examples/expressions/">expression</a>.',
},
{
displayName: 'Category Name or ID',
name: 'category',
type: 'options',
typeOptions: {
loadOptionsMethod: 'getTicketCategories',
},
default: '',
description:
'Main reason customer reached out for help. Choose from the list, or specify an ID using an <a href="https://docs.n8n.io/code-examples/expressions/">expression</a>.',
},
{
displayName: 'Close Date',
name: 'closeDate',
type: 'dateTime',
default: '',
description:
'The date the ticket was closed. When using expressions, the time should be specified in YYYY-MM-DD hh-mm-ss format.',
},
{
displayName: 'Create Date',
name: 'createDate',
type: 'dateTime',
default: '',
description:
'The date the ticket was created. When using expressions, the time should be specified in YYYY-MM-DD hh-mm-ss format.',
},
{
displayName: 'Description',
name: 'description',
type: 'string',
typeOptions: {
alwaysOpenEditWindow: true,
},
default: '',
description: 'Description of the ticket',
},
{
displayName: 'Priority Name or ID',
name: 'priority',
type: 'options',
typeOptions: {
loadOptionsMethod: 'getTicketPriorities',
},
default: '',
description:
'The level of attention needed on the ticket. Choose from the list, or specify an ID using an <a href="https://docs.n8n.io/code-examples/expressions/">expression</a>.',
},
{
displayName: 'Resolution Name or ID',
name: 'resolution',
type: 'options',
typeOptions: {
loadOptionsMethod: 'getTicketResolutions',
},
default: '',
description:
'The action taken to resolve the ticket. Choose from the list, or specify an ID using an <a href="https://docs.n8n.io/code-examples/expressions/">expression</a>.',
},
{
displayName: 'Source Name or ID',
name: 'source',
type: 'options',
typeOptions: {
loadOptionsMethod: 'getTicketSources',
},
default: '',
description:
'Channel where ticket was originally submitted. Choose from the list, or specify an ID using an <a href="https://docs.n8n.io/code-examples/expressions/">expression</a>.',
},
{
displayName: 'Ticket Owner Name or ID',
name: 'ticketOwnerId',
type: 'options',
typeOptions: {
loadOptionsMethod: 'getOwners',
},
default: '',
description:
'The user from your team that the ticket is assigned to. You can assign additional users to a ticket record by creating a custom HubSpot user property. Choose from the list, or specify an ID using an <a href="https://docs.n8n.io/code-examples/expressions/">expression</a>.',
},
],
},
/* -------------------------------------------------------------------------- */
/* ticket:update */
/* -------------------------------------------------------------------------- */
{
displayName: 'Ticket to Update',
name: 'ticketId',
type: 'resourceLocator',
default: { mode: 'list', value: '' },
required: true,
displayOptions: {
show: {
resource: ['ticket'],
operation: ['update'],
},
},
modes: [
{
displayName: 'From List',
name: 'list',
type: 'list',
placeholder: 'Select from the list',
typeOptions: {
searchListMethod: 'searchTickets',
},
},
{
displayName: 'By Id',
name: 'id',
type: 'string',
placeholder: '58539222',
validation: [
{
type: 'regex',
properties: {
regex: '[0-9]+',
errorMessage: 'Not a valid HubSpot Ticket ID',
},
},
],
},
],
},
{
displayName: 'Update Fields',
name: 'updateFields',
type: 'collection',
placeholder: 'Add Field',
default: {},
displayOptions: {
show: {
resource: ['ticket'],
operation: ['update'],
},
},
options: [
{
displayName: 'Company Names or IDs',
name: 'associatedCompanyIds',
type: 'multiOptions',
typeOptions: {
loadOptionsMethod: 'getCompanies',
},
default: [],
description:
'Whether to include specific Company properties in the returned results. Choose from a list, or specify IDs using an <a href="https://docs.n8n.io/code-examples/expressions/">expression</a>. Choose from the list, or specify IDs using an <a href="https://docs.n8n.io/code-examples/expressions/">expression</a>.',
},
{
displayName: 'Contact Names or IDs',
name: 'associatedContactIds',
type: 'multiOptions',
typeOptions: {
loadOptionsMethod: 'getContacts',
},
default: [],
description:
'Whether to include specific Contact properties in the returned results. Choose from a list, or specify IDs using an <a href="https://docs.n8n.io/code-examples/expressions/">expression</a>. Choose from the list, or specify IDs using an <a href="https://docs.n8n.io/code-examples/expressions/">expression</a>.',
},
{
displayName: 'Category Name or ID',
name: 'category',
type: 'options',
typeOptions: {
loadOptionsMethod: 'getTicketCategories',
},
default: '',
description:
'Main reason customer reached out for help. Choose from the list, or specify an ID using an <a href="https://docs.n8n.io/code-examples/expressions/">expression</a>.',
},
{
displayName: 'Close Date',
name: 'closeDate',
type: 'dateTime',
default: '',
description:
'The date the ticket was closed. When using expressions, the time should be specified in YYYY-MM-DD hh-mm-ss format.',
},
{
displayName: 'Create Date',
name: 'createDate',
type: 'dateTime',
default: '',
description:
'The date the ticket was created. When using expressions, the time should be specified in YYYY-MM-DD hh-mm-ss format.',
},
{
displayName: 'Description',
name: 'description',
type: 'string',
typeOptions: {
alwaysOpenEditWindow: true,
},
default: '',
description: 'Description of the ticket',
},
{
displayName: 'Pipeline Name or ID',
name: 'pipelineId',
type: 'options',
typeOptions: {
loadOptionsMethod: 'getTicketPipelines',
},
default: '',
description:
'The ID of the pipeline the ticket is in. Choose from the list, or specify an ID using an <a href="https://docs.n8n.io/code-examples/expressions/">expression</a>.',
},
{
displayName: 'Priority Name or ID',
name: 'priority',
type: 'options',
typeOptions: {
loadOptionsMethod: 'getTicketPriorities',
},
default: '',
description:
'The level of attention needed on the ticket. Choose from the list, or specify an ID using an <a href="https://docs.n8n.io/code-examples/expressions/">expression</a>.',
},
{
displayName: 'Resolution Name or ID',
name: 'resolution',
type: 'options',
typeOptions: {
loadOptionsMethod: 'getTicketResolutions',
},
default: '',
description:
'The action taken to resolve the ticket. Choose from the list, or specify an ID using an <a href="https://docs.n8n.io/code-examples/expressions/">expression</a>.',
},
{
displayName: 'Source Name or ID',
name: 'source',
type: 'options',
typeOptions: {
loadOptionsMethod: 'getTicketSources',
},
default: '',
description:
'Channel where ticket was originally submitted. Choose from the list, or specify an ID using an <a href="https://docs.n8n.io/code-examples/expressions/">expression</a>.',
},
{
displayName: 'Stage Name or ID',
name: 'stageId',
type: 'options',
typeOptions: {
loadOptionsMethod: 'getTicketStages',
loadOptionsDependsOn: ['updateFields.pipelineId'],
},
default: '',
description:
'The stage ID of the pipeline the ticket is in; depends on Pipeline ID. Choose from the list, or specify an ID using an <a href="https://docs.n8n.io/code-examples/expressions/">expression</a>.',
},
{
displayName: 'Ticket Name',
name: 'ticketName',
type: 'string',
default: '',
},
{
displayName: 'Ticket Owner Name or ID',
name: 'ticketOwnerId',
type: 'options',
typeOptions: {
loadOptionsMethod: 'getOwners',
},
default: '',
description:
'The user from your team that the ticket is assigned to. You can assign additional users to a ticket record by creating a custom HubSpot user property. Choose from the list, or specify an ID using an <a href="https://docs.n8n.io/code-examples/expressions/">expression</a>.',
},
],
},
/* -------------------------------------------------------------------------- */
/* ticket:get */
/* -------------------------------------------------------------------------- */
{
displayName: 'Ticket to Get',
name: 'ticketId',
type: 'resourceLocator',
default: { mode: 'list', value: '' },
required: true,
displayOptions: {
show: {
resource: ['ticket'],
operation: ['get'],
},
},
modes: [
{
displayName: 'From List',
name: 'list',
type: 'list',
placeholder: 'Select from the list',
typeOptions: {
searchListMethod: 'searchTickets',
},
},
{
displayName: 'By Id',
name: 'id',
type: 'string',
placeholder: '58539222',
validation: [
{
type: 'regex',
properties: {
regex: '[0-9]+',
errorMessage: 'Not a valid HubSpot Ticket ID',
},
},
],
},
],
},
{
displayName: 'Options',
name: 'additionalFields',
type: 'collection',
placeholder: 'Add Option',
default: {},
displayOptions: {
show: {
resource: ['ticket'],
operation: ['get'],
},
},
options: [
{
displayName: 'Include Deleted',
name: 'includeDeleted',
type: 'boolean',
default: false,
},
{
displayName: 'Ticket Properties to Include',
name: 'properties',
type: 'multiOptions',
typeOptions: {
loadOptionsMethod: 'getTicketProperties',
},
default: [],
description:
'Whether to include specific Ticket properties in the returned results. Choose from a list, or specify IDs using an <a href="https://docs.n8n.io/code-examples/expressions/">expression</a>. Choose from the list, or specify IDs using an <a href="https://docs.n8n.io/code-examples/expressions/">expression</a>.',
},
{
displayName: 'Properties With History',
name: 'propertiesWithHistory',
type: 'string',
default: '',
description:
"Works similarly to properties=, but this parameter will include the history for the specified property, instead of just including the current value. Use this parameter when you need the full history of changes to a property's value.",
},
],
},
/* -------------------------------------------------------------------------- */
/* ticket:getAll */
/* -------------------------------------------------------------------------- */
{
displayName: 'Return All',
name: 'returnAll',
type: 'boolean',
displayOptions: {
show: {
resource: ['ticket'],
operation: ['getAll'],
},
},
default: false,
description: 'Whether to return all results or only up to a given limit',
},
{
displayName: 'Limit',
name: 'limit',
type: 'number',
displayOptions: {
show: {
resource: ['ticket'],
operation: ['getAll'],
returnAll: [false],
},
},
typeOptions: {
minValue: 1,
maxValue: 250,
},
default: 100,
description: 'Max number of results to return',
},
{
displayName: 'Options',
name: 'additionalFields',
type: 'collection',
placeholder: 'Add Option',
default: {},
displayOptions: {
show: {
resource: ['ticket'],
operation: ['getAll'],
},
},
options: [
{
displayName: 'Ticket Properties to Include',
name: 'properties',
type: 'multiOptions',
typeOptions: {
loadOptionsMethod: 'getTicketProperties',
},
default: [],
description:
'Whether to include specific Ticket properties in the returned results. Choose from a list, or specify IDs using an <a href="https://docs.n8n.io/code-examples/expressions/">expression</a>. Choose from the list, or specify IDs using an <a href="https://docs.n8n.io/code-examples/expressions/">expression</a>.',
},
{
displayName: 'Properties With History',
name: 'propertiesWithHistory',
type: 'string',
default: '',
description:
"Works similarly to properties=, but this parameter will include the history for the specified property, instead of just including the current value. Use this parameter when you need the full history of changes to a property's value.",
},
],
},
/* -------------------------------------------------------------------------- */
/* ticket:delete */
/* -------------------------------------------------------------------------- */
{
displayName: 'Ticket to Delete',
name: 'ticketId',
type: 'resourceLocator',
default: { mode: 'list', value: '' },
required: true,
displayOptions: {
show: {
resource: ['ticket'],
operation: ['delete'],
},
},
modes: [
{
displayName: 'From List',
name: 'list',
type: 'list',
placeholder: 'Select from the list',
typeOptions: {
searchListMethod: 'searchTickets',
},
},
{
displayName: 'By Id',
name: 'id',
type: 'string',
placeholder: '58539222',
validation: [
{
type: 'regex',
properties: {
regex: '[0-9]+',
errorMessage: 'Not a valid HubSpot Ticket ID',
},
},
],
},
],
},
];