diff --git a/packages/nodes-base/nodes/ClickUp/ClickUp.node.ts b/packages/nodes-base/nodes/ClickUp/ClickUp.node.ts index 280f9dedee..ad1fcd1197 100644 --- a/packages/nodes-base/nodes/ClickUp/ClickUp.node.ts +++ b/packages/nodes-base/nodes/ClickUp/ClickUp.node.ts @@ -99,7 +99,7 @@ export class ClickUp implements INodeType { { name: 'clickUpApi', required: true, - } + }, ], properties: [ { @@ -296,7 +296,7 @@ export class ClickUp implements INodeType { const { tags } = await clickupApiRequest.call(this, 'GET', `/space/${spaceId}/tag`); for (const tag of tags) { const tagName = tag.name; - const tagId = tag.id; + const tagId = tag.name; returnData.push({ name: tagName, value: tagId, @@ -320,6 +320,23 @@ export class ClickUp implements INodeType { } return returnData; }, + + // Get all the custom fields to display them to user so that he can + // select them easily + async getCustomFields(this: ILoadOptionsFunctions): Promise { + const listId = this.getCurrentNodeParameter('list') as string; + const returnData: INodePropertyOptions[] = []; + const { fields } = await clickupApiRequest.call(this, 'GET', `/list/${listId}/field`); + for (const field of fields) { + const fieldName = field.name; + const fieldId = field.id; + returnData.push({ + name: fieldName, + value: fieldId, + }); + } + return returnData; + }, }, }; @@ -846,6 +863,22 @@ export class ClickUp implements INodeType { if (filters.dateUpdatedLt) { qs.date_updated_lt = new Date(filters.dateUpdatedLt as string).getTime(); } + if (filters.customFieldsUi) { + const customFieldsValues = (filters.customFieldsUi as IDataObject).customFieldsValues as IDataObject[]; + if (customFieldsValues) { + const customFields: IDataObject[] = []; + for (const customFieldValue of customFieldsValues) { + customFields.push({ + field_id: customFieldValue.fieldId, + operator: (customFieldValue.operator === 'equal') ? '=' : customFieldValue.operator, + value: customFieldValue.value as string, + }); + } + + qs.custom_fields = JSON.stringify(customFields); + } + } + const listId = this.getNodeParameter('list', i) as string; if (returnAll === true) { responseData = await clickupApiRequestAllItems.call(this, 'tasks', 'GET', `/list/${listId}/task`, {}, qs); @@ -855,6 +888,19 @@ export class ClickUp implements INodeType { responseData = responseData.splice(0, qs.limit); } } + if (operation === 'member') { + const taskId = this.getNodeParameter('id', i) as string; + const returnAll = this.getNodeParameter('returnAll', i) as boolean; + if (returnAll === true) { + responseData = await clickupApiRequest.call(this, 'GET', `/task/${taskId}/member`, {}, qs); + responseData = responseData.members; + } else { + qs.limit = this.getNodeParameter('limit', i) as number; + responseData = await clickupApiRequest.call(this, 'GET', `/task/${taskId}/member`, {}, qs); + responseData = responseData.members; + responseData = responseData.splice(0, qs.limit); + } + } if (operation === 'setCustomField') { const taskId = this.getNodeParameter('task', i) as string; const fieldId = this.getNodeParameter('field', i) as string; @@ -984,6 +1030,19 @@ export class ClickUp implements INodeType { responseData = await clickupApiRequest.call(this, 'POST', `/folder/${folderId}/list`, body); } } + if (operation === 'member') { + const listId = this.getNodeParameter('id', i) as string; + const returnAll = this.getNodeParameter('returnAll', i) as boolean; + if (returnAll === true) { + responseData = await clickupApiRequest.call(this, 'GET', `/list/${listId}/member`, {}, qs); + responseData = responseData.members; + } else { + qs.limit = this.getNodeParameter('limit', i) as number; + responseData = await clickupApiRequest.call(this, 'GET', `/list/${listId}/member`, {}, qs); + responseData = responseData.members; + responseData = responseData.splice(0, qs.limit); + } + } if (operation === 'customFields') { const listId = this.getNodeParameter('list', i) as string; responseData = await clickupApiRequest.call(this, 'GET', `/list/${listId}/field`); diff --git a/packages/nodes-base/nodes/ClickUp/ListDescription.ts b/packages/nodes-base/nodes/ClickUp/ListDescription.ts index 8fd4a8a13f..ed1de017c7 100644 --- a/packages/nodes-base/nodes/ClickUp/ListDescription.ts +++ b/packages/nodes-base/nodes/ClickUp/ListDescription.ts @@ -40,6 +40,11 @@ export const listOperations = [ value: 'getAll', description: 'Get all lists', }, + { + name: 'Member', + value: 'member', + description: 'Get list members', + }, { name: 'Update', value: 'update', @@ -229,6 +234,68 @@ export const listFields = [ ], }, /* -------------------------------------------------------------------------- */ +/* list:member */ +/* -------------------------------------------------------------------------- */ + { + displayName: 'List ID', + name: 'id', + type: 'string', + default: '', + required: true, + displayOptions: { + show: { + resource: [ + 'list', + ], + operation: [ + 'member', + ], + }, + }, + description: 'Task ID', + }, + { + displayName: 'Return All', + name: 'returnAll', + type: 'boolean', + displayOptions: { + show: { + resource: [ + 'list', + ], + operation: [ + 'member', + ], + }, + }, + default: true, + description: 'If all results should be returned or only up to a given limit.', + }, + { + displayName: 'Limit', + name: 'limit', + type: 'number', + displayOptions: { + show: { + resource: [ + 'list', + ], + operation: [ + 'member', + ], + returnAll: [ + false, + ], + }, + }, + typeOptions: { + minValue: 1, + maxValue: 100, + }, + default: 50, + description: 'How many results to return.', + }, +/* -------------------------------------------------------------------------- */ /* list:customFields */ /* -------------------------------------------------------------------------- */ { diff --git a/packages/nodes-base/nodes/ClickUp/TaskDescription.ts b/packages/nodes-base/nodes/ClickUp/TaskDescription.ts index 5d53390c1c..0d0d9e265b 100644 --- a/packages/nodes-base/nodes/ClickUp/TaskDescription.ts +++ b/packages/nodes-base/nodes/ClickUp/TaskDescription.ts @@ -31,12 +31,17 @@ export const taskOperations = [ description: 'Get a task', }, { - name: 'Get all', + name: 'Get All', value: 'getAll', description: 'Get all tasks', }, { - name: 'Set custom field', + name: 'Member', + value: 'member', + description: 'Get task members', + }, + { + name: 'Set Custom Field', value: 'setCustomField', description: 'Set a custom field', }, @@ -95,7 +100,7 @@ export const taskFields = [ loadOptionsMethod: 'getSpaces', loadOptionsDependsOn: [ 'team', - ] + ], }, required: true, }, @@ -190,7 +195,7 @@ export const taskFields = [ loadOptionsMethod: 'getLists', loadOptionsDependsOn: [ 'folder', - ] + ], }, required: true, }, @@ -239,7 +244,6 @@ export const taskFields = [ typeOptions: { loadOptionsMethod: 'getAssignees', }, - default: [], }, { @@ -302,6 +306,12 @@ export const taskFields = [ description: 'Integer mapping as 1 : Urgent, 2 : High, 3 : Normal, 4 : Low', default: 3, }, + { + displayName: 'Start Date', + name: 'startDate', + type: 'dateTime', + default: '', + }, { displayName: 'Start Date Time', name: 'startDateTime', @@ -457,6 +467,12 @@ export const taskFields = [ default: '', description: 'status' }, + { + displayName: 'Start Date', + name: 'startDate', + type: 'dateTime', + default: '', + }, { displayName: 'Start Date Time', name: 'startDateTime', @@ -631,7 +647,7 @@ export const taskFields = [ loadOptionsMethod: 'getLists', loadOptionsDependsOn: [ 'folder', - ] + ], }, required: true, }, @@ -712,6 +728,91 @@ export const taskFields = [ default: [], }, + { + displayName: 'Custom Fields', + name: 'customFieldsUi', + placeholder: 'Add Custom Field', + type: 'fixedCollection', + typeOptions: { + multipleValues: true, + }, + description: 'Filter by custom fields ', + default: {}, + options: [ + { + name: 'customFieldsValues', + displayName: 'Custom Field', + values: [ + { + displayName: 'Field ID', + name: 'fieldId', + type: 'options', + typeOptions: { + loadOptionsMethod: 'getCustomFields', + }, + default: '', + description: 'The ID of the field to add custom field to.', + }, + { + displayName: 'Operator', + name: 'operator', + type: 'options', + options: [ + { + name: 'Equal', + value: 'equal', + }, + { + name: '<', + value: '<', + }, + { + name: '<=', + value: '<=', + }, + { + name: '>', + value: '>', + }, + { + name: '>=', + value: '>=', + }, + { + name: '!=', + value: '!=', + }, + { + name: 'Is Null', + value: 'IS NULL', + }, + { + name: 'Is Not Null', + value: 'IS NOT NULL', + }, + ], + default: 'equal', + description: 'The value to set on custom field.', + }, + { + displayName: 'Value', + name: 'value', + type: 'string', + displayOptions: { + hide: { + operator: [ + 'IS NULL', + 'IS NOT NULL', + ], + }, + }, + default: '', + description: 'The value to set on custom field.', + }, + ], + }, + ], + }, { displayName: 'Date Created Greater Than', name: 'dateCreatedGt', @@ -841,6 +942,68 @@ export const taskFields = [ description: 'task ID', }, /* -------------------------------------------------------------------------- */ +/* task:member */ +/* -------------------------------------------------------------------------- */ + { + displayName: 'Task ID', + name: 'id', + type: 'string', + default: '', + required: true, + displayOptions: { + show: { + resource: [ + 'task', + ], + operation: [ + 'member', + ], + }, + }, + description: 'Task ID', + }, + { + displayName: 'Return All', + name: 'returnAll', + type: 'boolean', + displayOptions: { + show: { + resource: [ + 'task', + ], + operation: [ + 'member', + ], + }, + }, + default: true, + description: 'If all results should be returned or only up to a given limit.', + }, + { + displayName: 'Limit', + name: 'limit', + type: 'number', + displayOptions: { + show: { + resource: [ + 'task', + ], + operation: [ + 'member', + ], + returnAll: [ + false, + ], + }, + }, + typeOptions: { + minValue: 1, + maxValue: 100, + }, + default: 50, + description: 'How many results to return.', + }, +/* -------------------------------------------------------------------------- */ /* task:setCustomField */ /* -------------------------------------------------------------------------- */ {