first commit
Security: Sync from Public / sync-from-public (push) Has been cancelled
Test: Benchmark Nightly / build (push) Has been cancelled
Test: Benchmark Nightly / Notify Cats on failure (push) Has been cancelled
CI: Python / Checks (push) Has been cancelled
Test: Evals Python / Workflow Comparison Python (push) Has been cancelled
Util: Check Docs URLs / check-docs-urls (push) Has been cancelled
Test: Visual Storybook / Cloudflare Pages (push) Has been cancelled
Test: E2E Performance / build-and-test-performance (push) Has been cancelled
Test: Workflows Nightly / Run Workflow Tests (push) Has been cancelled
Util: Cleanup CI Docker Images / Delete stale CI images (push) Has been cancelled
Test: Benchmark Destroy Env / build (push) Has been cancelled
Util: Update Node Popularity / update-popularity (push) Has been cancelled
Test: E2E Coverage Weekly / Coverage Tests (push) Has been cancelled

This commit is contained in:
2026-03-17 16:22:57 +03:30
commit 3d5eaf9445
15349 changed files with 2847338 additions and 0 deletions
@@ -0,0 +1,130 @@
import type { INodeProperties } from 'n8n-workflow';
export const checklistOperations: INodeProperties[] = [
{
displayName: 'Operation',
name: 'operation',
type: 'options',
noDataExpression: true,
displayOptions: {
show: {
resource: ['checklist'],
},
},
options: [
{
name: 'Create',
value: 'create',
description: 'Create a checklist',
action: 'Create a checklist',
},
{
name: 'Delete',
value: 'delete',
description: 'Delete a checklist',
action: 'Delete a checklist',
},
{
name: 'Update',
value: 'update',
description: 'Update a checklist',
action: 'Update a checklist',
},
],
default: 'create',
},
];
export const checklistFields: INodeProperties[] = [
/* -------------------------------------------------------------------------- */
/* checklist:create */
/* -------------------------------------------------------------------------- */
{
displayName: 'Task ID',
name: 'task',
type: 'string',
default: '',
displayOptions: {
show: {
resource: ['checklist'],
operation: ['create'],
},
},
required: true,
},
{
displayName: 'Name',
name: 'name',
type: 'string',
default: '',
displayOptions: {
show: {
resource: ['checklist'],
operation: ['create'],
},
},
required: true,
},
/* -------------------------------------------------------------------------- */
/* checklist:delete */
/* -------------------------------------------------------------------------- */
{
displayName: 'Checklist ID',
name: 'checklist',
type: 'string',
default: '',
displayOptions: {
show: {
resource: ['checklist'],
operation: ['delete'],
},
},
required: true,
},
/* -------------------------------------------------------------------------- */
/* checklist:update */
/* -------------------------------------------------------------------------- */
{
displayName: 'Checklist ID',
name: 'checklist',
type: 'string',
default: '',
displayOptions: {
show: {
resource: ['checklist'],
operation: ['update'],
},
},
required: true,
},
{
displayName: 'Update Fields',
name: 'updateFields',
type: 'collection',
placeholder: 'Add Field',
default: {},
displayOptions: {
show: {
resource: ['checklist'],
operation: ['update'],
},
},
options: [
{
displayName: 'Name',
name: 'name',
type: 'string',
default: '',
},
{
displayName: 'Position',
name: 'position',
type: 'number',
typeOptions: {
minValue: 0,
},
default: 0,
},
],
},
];
@@ -0,0 +1,189 @@
import type { INodeProperties } from 'n8n-workflow';
export const checklistItemOperations: INodeProperties[] = [
{
displayName: 'Operation',
name: 'operation',
type: 'options',
noDataExpression: true,
displayOptions: {
show: {
resource: ['checklistItem'],
},
},
options: [
{
name: 'Create',
value: 'create',
description: 'Create a checklist item',
action: 'Create a checklist item',
},
{
name: 'Delete',
value: 'delete',
description: 'Delete a checklist item',
action: 'Delete a checklist item',
},
{
name: 'Update',
value: 'update',
description: 'Update a checklist item',
action: 'Update a checklist item',
},
],
default: 'create',
},
];
export const checklistItemFields: INodeProperties[] = [
/* -------------------------------------------------------------------------- */
/* checklistItem:create */
/* -------------------------------------------------------------------------- */
{
displayName: 'Checklist ID',
name: 'checklist',
type: 'string',
default: '',
displayOptions: {
show: {
resource: ['checklistItem'],
operation: ['create'],
},
},
required: true,
},
{
displayName: 'Name',
name: 'name',
type: 'string',
default: '',
displayOptions: {
show: {
resource: ['checklistItem'],
operation: ['create'],
},
},
required: true,
},
{
displayName: 'Additional Fields',
name: 'additionalFields',
type: 'collection',
placeholder: 'Add Field',
default: {},
displayOptions: {
show: {
resource: ['checklistItem'],
operation: ['create'],
},
},
options: [
{
displayName: 'Assignee ID',
name: 'assignee',
type: 'string',
default: '',
},
],
},
/* -------------------------------------------------------------------------- */
/* checklistItem:delete */
/* -------------------------------------------------------------------------- */
{
displayName: 'Checklist ID',
name: 'checklist',
type: 'string',
default: '',
displayOptions: {
show: {
resource: ['checklistItem'],
operation: ['delete'],
},
},
required: true,
},
{
displayName: 'Checklist Item ID',
name: 'checklistItem',
type: 'string',
default: '',
displayOptions: {
show: {
resource: ['checklistItem'],
operation: ['delete'],
},
},
required: true,
},
/* -------------------------------------------------------------------------- */
/* checklistItem:update */
/* -------------------------------------------------------------------------- */
{
displayName: 'Checklist ID',
name: 'checklist',
type: 'string',
default: '',
displayOptions: {
show: {
resource: ['checklistItem'],
operation: ['update'],
},
},
required: true,
},
{
displayName: 'Checklist Item ID',
name: 'checklistItem',
type: 'string',
default: '',
displayOptions: {
show: {
resource: ['checklistItem'],
operation: ['update'],
},
},
required: true,
},
{
displayName: 'Update Fields',
name: 'updateFields',
type: 'collection',
placeholder: 'Add Field',
default: {},
displayOptions: {
show: {
resource: ['checklistItem'],
operation: ['update'],
},
},
options: [
{
displayName: 'Assignee ID',
name: 'assignee',
type: 'string',
default: '',
},
{
displayName: 'Name',
name: 'name',
type: 'string',
default: '',
},
{
displayName: 'Parent Checklist Item ID',
name: 'parent',
type: 'string',
default: '',
description: 'Checklist item that you want to nest the target checklist item underneath',
},
{
displayName: 'Resolved',
name: 'resolved',
type: 'boolean',
default: false,
},
],
},
];
@@ -0,0 +1,25 @@
{
"node": "n8n-nodes-base.clickUp",
"nodeVersion": "1.0",
"codexVersion": "1.0",
"categories": ["Productivity", "Communication"],
"resources": {
"credentialDocumentation": [
{
"url": "https://docs.n8n.io/integrations/builtin/credentials/clickup/"
}
],
"primaryDocumentation": [
{
"url": "https://docs.n8n.io/integrations/builtin/app-nodes/n8n-nodes-base.clickup/"
}
],
"generic": [
{
"label": "2021: The Year to Automate the New You with n8n",
"icon": "☀️",
"url": "https://n8n.io/blog/2021-the-year-to-automate-the-new-you-with-n8n/"
}
]
}
}
File diff suppressed because it is too large Load Diff
@@ -0,0 +1,18 @@
{
"node": "n8n-nodes-base.clickUpTrigger",
"nodeVersion": "1.0",
"codexVersion": "1.0",
"categories": ["Productivity", "Communication"],
"resources": {
"credentialDocumentation": [
{
"url": "https://docs.n8n.io/integrations/builtin/credentials/clickup/"
}
],
"primaryDocumentation": [
{
"url": "https://docs.n8n.io/integrations/builtin/trigger-nodes/n8n-nodes-base.clickuptrigger/"
}
]
}
}
@@ -0,0 +1,343 @@
import { createHmac } from 'crypto';
import type {
IHookFunctions,
IWebhookFunctions,
IDataObject,
ILoadOptionsFunctions,
INodePropertyOptions,
INodeType,
INodeTypeDescription,
IWebhookResponseData,
} from 'n8n-workflow';
import { NodeConnectionTypes } from 'n8n-workflow';
import { clickupApiRequest } from './GenericFunctions';
export class ClickUpTrigger implements INodeType {
description: INodeTypeDescription = {
displayName: 'ClickUp Trigger',
name: 'clickUpTrigger',
icon: 'file:clickup.svg',
group: ['trigger'],
version: 1,
description: 'Handle ClickUp events via webhooks (Beta)',
defaults: {
name: 'ClickUp Trigger',
},
inputs: [],
outputs: [NodeConnectionTypes.Main],
credentials: [
{
name: 'clickUpApi',
required: true,
displayOptions: {
show: {
authentication: ['accessToken'],
},
},
},
{
name: 'clickUpOAuth2Api',
required: true,
displayOptions: {
show: {
authentication: ['oAuth2'],
},
},
},
],
webhooks: [
{
name: 'default',
httpMethod: 'POST',
responseMode: 'onReceived',
path: 'webhook',
},
],
properties: [
{
displayName: 'Authentication',
name: 'authentication',
type: 'options',
options: [
{
name: 'Access Token',
value: 'accessToken',
},
{
name: 'OAuth2',
value: 'oAuth2',
},
],
default: 'accessToken',
},
{
displayName: 'Team Name or ID',
name: 'team',
type: 'options',
description:
'Choose from the list, or specify an ID using an <a href="https://docs.n8n.io/code/expressions/">expression</a>',
typeOptions: {
loadOptionsMethod: 'getTeams',
},
required: true,
default: '',
},
{
displayName: 'Events',
name: 'events',
type: 'multiOptions',
required: true,
default: [],
options: [
{
name: '*',
value: '*',
},
{
name: 'folder.created',
value: 'folderCreated',
},
{
name: 'folder.deleted',
value: 'folderDeleted',
},
{
name: 'folder.updated',
value: 'folderUpdated',
},
{
name: 'goal.created',
value: 'goalCreated',
},
{
name: 'goal.deleted',
value: 'goalDeleted',
},
{
name: 'goal.updated',
value: 'goalUpdated',
},
{
name: 'keyResult.created',
value: 'keyResultCreated',
},
{
name: 'keyResult.deleted',
value: 'keyResultDelete',
},
{
name: 'keyResult.updated',
value: 'keyResultUpdated',
},
{
name: 'list.created',
value: 'listCreated',
},
{
name: 'list.deleted',
value: 'listDeleted',
},
{
name: 'list.updated',
value: 'listUpdated',
},
{
name: 'space.created',
value: 'spaceCreated',
},
{
name: 'space.deleted',
value: 'spaceDeleted',
},
{
name: 'space.updated',
value: 'spaceUpdated',
},
{
name: 'task.assignee.updated',
value: 'taskAssigneeUpdated',
},
{
name: 'task.comment.posted',
value: 'taskCommentPosted',
},
{
name: 'task.comment.updated',
value: 'taskCommentUpdated',
},
{
name: 'task.created',
value: 'taskCreated',
},
{
name: 'task.deleted',
value: 'taskDeleted',
},
{
name: 'task.dueDate.updated',
value: 'taskDueDateUpdated',
},
{
name: 'task.moved',
value: 'taskMoved',
},
{
name: 'task.status.updated',
value: 'taskStatusUpdated',
},
{
name: 'task.tag.updated',
value: 'taskTagUpdated',
},
{
name: 'task.timeEstimate.updated',
value: 'taskTimeEstimateUpdated',
},
{
name: 'task.timeTracked.updated',
value: 'taskTimeTrackedUpdated',
},
{
name: 'task.updated',
value: 'taskUpdated',
},
],
},
{
displayName: 'Filters',
name: 'filters',
type: 'collection',
placeholder: 'Add Field',
default: {},
options: [
{
displayName: 'Folder ID',
name: 'folderId',
type: 'string',
default: '',
},
{
displayName: 'List ID',
name: 'listId',
type: 'string',
default: '',
},
{
displayName: 'Space ID',
name: 'spaceId',
type: 'string',
default: '',
},
{
displayName: 'Task ID',
name: 'taskId',
type: 'string',
default: '',
},
],
},
],
};
methods = {
loadOptions: {
// Get all the available teams to display them to user so that they can
// select them easily
async getTeams(this: ILoadOptionsFunctions): Promise<INodePropertyOptions[]> {
const returnData: INodePropertyOptions[] = [];
const { teams } = await clickupApiRequest.call(this, 'GET', '/team');
for (const team of teams) {
const teamName = team.name;
const teamId = team.id;
returnData.push({
name: teamName,
value: teamId,
});
}
return returnData;
},
},
};
webhookMethods = {
default: {
async checkExists(this: IHookFunctions): Promise<boolean> {
const teamId = this.getNodeParameter('team') as string;
const webhookData = this.getWorkflowStaticData('node');
if (webhookData.webhookId === undefined) {
return false;
}
const endpoint = `/team/${teamId}/webhook`;
const { webhooks } = await clickupApiRequest.call(this, 'GET', endpoint);
if (Array.isArray(webhooks)) {
for (const webhook of webhooks) {
if (webhook.id === webhookData.webhookId) {
return true;
}
}
}
return false;
},
async create(this: IHookFunctions): Promise<boolean> {
const webhookUrl = this.getNodeWebhookUrl('default');
const webhookData = this.getWorkflowStaticData('node');
const filters = this.getNodeParameter('filters') as IDataObject;
const teamId = this.getNodeParameter('team') as string;
const events = this.getNodeParameter('events') as string[];
const endpoint = `/team/${teamId}/webhook`;
const body: IDataObject = {
endpoint: webhookUrl,
events,
};
if (events.includes('*')) {
body.events = '*';
}
if (filters.listId) {
body.list_id = (filters.listId as string).replace('#', '');
}
if (filters.taskId) {
body.task_id = (filters.taskId as string).replace('#', '');
}
if (filters.spaceId) {
body.space_id = (filters.spaceId as string).replace('#', '');
}
if (filters.folderId) {
body.folder_id = (filters.folderId as string).replace('#', '');
}
const { webhook } = await clickupApiRequest.call(this, 'POST', endpoint, body);
webhookData.webhookId = webhook.id;
webhookData.secret = webhook.secret;
return true;
},
async delete(this: IHookFunctions): Promise<boolean> {
const webhookData = this.getWorkflowStaticData('node');
const endpoint = `/webhook/${webhookData.webhookId}`;
try {
await clickupApiRequest.call(this, 'DELETE', endpoint);
} catch (error) {
return false;
}
delete webhookData.webhookId;
delete webhookData.secret;
return true;
},
},
};
async webhook(this: IWebhookFunctions): Promise<IWebhookResponseData> {
const webhookData = this.getWorkflowStaticData('node');
const headerData = this.getHeaderData() as IDataObject;
const req = this.getRequestObject();
const computedSignature = createHmac('sha256', webhookData.secret as string)
.update(JSON.stringify(req.body))
.digest('hex');
if (headerData['x-signature'] !== computedSignature) {
// Signature is not valid so ignore call
return {};
}
return {
workflowData: [this.helpers.returnJsonArray(req.body as IDataObject)],
};
}
}
@@ -0,0 +1,255 @@
import type { INodeProperties } from 'n8n-workflow';
export const commentOperations: INodeProperties[] = [
{
displayName: 'Operation',
name: 'operation',
type: 'options',
noDataExpression: true,
displayOptions: {
show: {
resource: ['comment'],
},
},
options: [
{
name: 'Create',
value: 'create',
description: 'Create a comment',
action: 'Create a comment',
},
{
name: 'Delete',
value: 'delete',
description: 'Delete a comment',
action: 'Delete a comment',
},
{
name: 'Get Many',
value: 'getAll',
description: 'Get many comments',
action: 'Get many comments',
},
{
name: 'Update',
value: 'update',
description: 'Update a comment',
action: 'Update a comment',
},
],
default: 'create',
},
];
export const commentFields: INodeProperties[] = [
/* -------------------------------------------------------------------------- */
/* comment:create */
/* -------------------------------------------------------------------------- */
{
displayName: 'Comment On',
name: 'commentOn',
type: 'options',
options: [
{
name: 'List',
value: 'list',
},
{
name: 'Task',
value: 'task',
},
{
name: 'View',
value: 'view',
},
],
default: '',
displayOptions: {
show: {
resource: ['comment'],
operation: ['create'],
},
},
},
{
displayName: 'ID',
name: 'id',
type: 'string',
default: '',
displayOptions: {
show: {
resource: ['comment'],
operation: ['create'],
},
},
required: true,
},
{
displayName: 'Comment Text',
name: 'commentText',
type: 'string',
default: '',
displayOptions: {
show: {
resource: ['comment'],
operation: ['create'],
},
},
},
{
displayName: 'Additional Fields',
name: 'additionalFields',
type: 'collection',
placeholder: 'Add Field',
default: {},
displayOptions: {
show: {
resource: ['comment'],
operation: ['create'],
},
},
options: [
{
displayName: 'Assignee ID',
name: 'assignee',
type: 'string',
default: '',
},
{
displayName: 'Notify All',
name: 'notifyAll',
type: 'boolean',
default: false,
description:
'Whether creation notifications will be sent to everyone including the creator of the comment',
},
],
},
/* -------------------------------------------------------------------------- */
/* comment:delete */
/* -------------------------------------------------------------------------- */
{
displayName: 'Comment ID',
name: 'comment',
type: 'string',
default: '',
displayOptions: {
show: {
resource: ['comment'],
operation: ['delete'],
},
},
required: true,
},
/* -------------------------------------------------------------------------- */
/* comment:getAll */
/* -------------------------------------------------------------------------- */
{
displayName: 'Comments On',
name: 'commentsOn',
type: 'options',
options: [
{
name: 'List',
value: 'list',
},
{
name: 'Task',
value: 'task',
},
{
name: 'View',
value: 'view',
},
],
default: '',
displayOptions: {
show: {
resource: ['comment'],
operation: ['getAll'],
},
},
},
{
displayName: 'ID',
name: 'id',
type: 'string',
default: '',
displayOptions: {
show: {
resource: ['comment'],
operation: ['getAll'],
},
},
required: true,
},
{
displayName: 'Limit',
name: 'limit',
type: 'number',
displayOptions: {
show: {
resource: ['comment'],
operation: ['getAll'],
},
},
typeOptions: {
minValue: 1,
maxValue: 100,
},
default: 50,
description: 'Max number of results to return',
},
/* -------------------------------------------------------------------------- */
/* comment:update */
/* -------------------------------------------------------------------------- */
{
displayName: 'Comment ID',
name: 'comment',
type: 'string',
default: '',
displayOptions: {
show: {
resource: ['comment'],
operation: ['update'],
},
},
required: true,
},
{
displayName: 'Update Fields',
name: 'updateFields',
type: 'collection',
placeholder: 'Add Field',
default: {},
displayOptions: {
show: {
resource: ['comment'],
operation: ['update'],
},
},
options: [
{
displayName: 'Assignee ID',
name: 'assignee',
type: 'string',
default: '',
},
{
displayName: 'Comment Text',
name: 'commentText',
type: 'string',
default: '',
},
{
displayName: 'Resolved',
name: 'resolved',
type: 'boolean',
default: false,
},
],
},
];
@@ -0,0 +1,384 @@
import type { INodeProperties } from 'n8n-workflow';
export const folderOperations: INodeProperties[] = [
{
displayName: 'Operation',
name: 'operation',
type: 'options',
noDataExpression: true,
displayOptions: {
show: {
resource: ['folder'],
},
},
options: [
{
name: 'Create',
value: 'create',
description: 'Create a folder',
action: 'Create a folder',
},
{
name: 'Delete',
value: 'delete',
description: 'Delete a folder',
action: 'Delete a folder',
},
{
name: 'Get',
value: 'get',
description: 'Get a folder',
action: 'Get a folder',
},
{
name: 'Get Many',
value: 'getAll',
description: 'Get many folders',
action: 'Get many folders',
},
{
name: 'Update',
value: 'update',
description: 'Update a folder',
action: 'Update a folder',
},
],
default: 'create',
},
];
export const folderFields: INodeProperties[] = [
/* -------------------------------------------------------------------------- */
/* folder:create */
/* -------------------------------------------------------------------------- */
{
displayName: 'Team Name or ID',
name: 'team',
type: 'options',
description:
'Choose from the list, or specify an ID using an <a href="https://docs.n8n.io/code/expressions/">expression</a>',
default: '',
displayOptions: {
show: {
resource: ['folder'],
operation: ['create'],
},
},
typeOptions: {
loadOptionsMethod: 'getTeams',
},
required: true,
},
{
displayName: 'Space Name or ID',
name: 'space',
type: 'options',
description:
'Choose from the list, or specify an ID using an <a href="https://docs.n8n.io/code/expressions/">expression</a>',
default: '',
displayOptions: {
show: {
resource: ['folder'],
operation: ['create'],
},
},
typeOptions: {
loadOptionsMethod: 'getSpaces',
loadOptionsDependsOn: ['team'],
},
required: true,
},
{
displayName: 'Name',
name: 'name',
type: 'string',
default: '',
displayOptions: {
show: {
resource: ['folder'],
operation: ['create'],
},
},
required: true,
},
/* -------------------------------------------------------------------------- */
/* folder:delete */
/* -------------------------------------------------------------------------- */
{
displayName: 'Team Name or ID',
name: 'team',
type: 'options',
description:
'Choose from the list, or specify an ID using an <a href="https://docs.n8n.io/code/expressions/">expression</a>',
default: '',
displayOptions: {
show: {
resource: ['folder'],
operation: ['delete'],
},
},
typeOptions: {
loadOptionsMethod: 'getTeams',
},
required: true,
},
{
displayName: 'Space Name or ID',
name: 'space',
type: 'options',
description:
'Choose from the list, or specify an ID using an <a href="https://docs.n8n.io/code/expressions/">expression</a>',
default: '',
displayOptions: {
show: {
resource: ['folder'],
operation: ['delete'],
},
},
typeOptions: {
loadOptionsMethod: 'getSpaces',
loadOptionsDependsOn: ['team'],
},
required: true,
},
{
displayName: 'Folder Name or ID',
name: 'folder',
type: 'options',
description:
'Choose from the list, or specify an ID using an <a href="https://docs.n8n.io/code/expressions/">expression</a>',
default: '',
displayOptions: {
show: {
resource: ['folder'],
operation: ['delete'],
},
},
typeOptions: {
loadOptionsMethod: 'getFolders',
loadOptionsDependsOn: ['space'],
},
required: true,
},
/* -------------------------------------------------------------------------- */
/* folder:get */
/* -------------------------------------------------------------------------- */
{
displayName: 'Team Name or ID',
name: 'team',
type: 'options',
description:
'Choose from the list, or specify an ID using an <a href="https://docs.n8n.io/code/expressions/">expression</a>',
default: '',
displayOptions: {
show: {
resource: ['folder'],
operation: ['get'],
},
},
typeOptions: {
loadOptionsMethod: 'getTeams',
},
required: true,
},
{
displayName: 'Space Name or ID',
name: 'space',
type: 'options',
description:
'Choose from the list, or specify an ID using an <a href="https://docs.n8n.io/code/expressions/">expression</a>',
default: '',
displayOptions: {
show: {
resource: ['folder'],
operation: ['get'],
},
},
typeOptions: {
loadOptionsMethod: 'getSpaces',
loadOptionsDependsOn: ['team'],
},
required: true,
},
{
displayName: 'Folder Name or ID',
name: 'folder',
type: 'options',
description:
'Choose from the list, or specify an ID using an <a href="https://docs.n8n.io/code/expressions/">expression</a>',
default: '',
displayOptions: {
show: {
resource: ['folder'],
operation: ['get'],
},
},
typeOptions: {
loadOptionsMethod: 'getFolders',
loadOptionsDependsOn: ['space'],
},
required: true,
},
/* -------------------------------------------------------------------------- */
/* folder:getAll */
/* -------------------------------------------------------------------------- */
{
displayName: 'Team Name or ID',
name: 'team',
type: 'options',
description:
'Choose from the list, or specify an ID using an <a href="https://docs.n8n.io/code/expressions/">expression</a>',
default: '',
displayOptions: {
show: {
resource: ['folder'],
operation: ['getAll'],
},
},
typeOptions: {
loadOptionsMethod: 'getTeams',
},
required: true,
},
{
displayName: 'Space Name or ID',
name: 'space',
type: 'options',
description:
'Choose from the list, or specify an ID using an <a href="https://docs.n8n.io/code/expressions/">expression</a>',
default: '',
displayOptions: {
show: {
resource: ['folder'],
operation: ['getAll'],
},
},
typeOptions: {
loadOptionsMethod: 'getSpaces',
loadOptionsDependsOn: ['team'],
},
required: true,
},
{
displayName: 'Limit',
name: 'limit',
type: 'number',
displayOptions: {
show: {
resource: ['folder'],
operation: ['getAll'],
},
},
typeOptions: {
minValue: 1,
maxValue: 100,
},
default: 50,
description: 'Max number of results to return',
},
{
displayName: 'Filters',
name: 'filters',
type: 'collection',
placeholder: 'Add Filter',
default: {},
displayOptions: {
show: {
resource: ['folder'],
operation: ['getAll'],
},
},
options: [
{
displayName: 'Archived',
name: 'archived',
type: 'boolean',
default: false,
},
],
},
/* -------------------------------------------------------------------------- */
/* folder:update */
/* -------------------------------------------------------------------------- */
{
displayName: 'Team Name or ID',
name: 'team',
type: 'options',
description:
'Choose from the list, or specify an ID using an <a href="https://docs.n8n.io/code/expressions/">expression</a>',
default: '',
displayOptions: {
show: {
resource: ['folder'],
operation: ['update'],
},
},
typeOptions: {
loadOptionsMethod: 'getTeams',
},
required: true,
},
{
displayName: 'Space Name or ID',
name: 'space',
type: 'options',
description:
'Choose from the list, or specify an ID using an <a href="https://docs.n8n.io/code/expressions/">expression</a>',
default: '',
displayOptions: {
show: {
resource: ['folder'],
operation: ['update'],
},
},
typeOptions: {
loadOptionsMethod: 'getSpaces',
loadOptionsDependsOn: ['team'],
},
required: true,
},
{
displayName: 'Folder Name or ID',
name: 'folder',
type: 'options',
description:
'Choose from the list, or specify an ID using an <a href="https://docs.n8n.io/code/expressions/">expression</a>',
default: '',
displayOptions: {
show: {
resource: ['folder'],
operation: ['update'],
},
},
typeOptions: {
loadOptionsMethod: 'getFolders',
loadOptionsDependsOn: ['space'],
},
required: true,
},
{
displayName: 'Update Fields',
name: 'updateFields',
type: 'collection',
placeholder: 'Add Field',
default: {},
displayOptions: {
show: {
resource: ['folder'],
operation: ['update'],
},
},
options: [
{
displayName: 'Name',
name: 'name',
type: 'string',
default: '',
},
],
},
];
@@ -0,0 +1,91 @@
import type {
IDataObject,
IExecuteFunctions,
IHookFunctions,
ILoadOptionsFunctions,
IWebhookFunctions,
IOAuth2Options,
JsonObject,
IHttpRequestMethods,
IRequestOptions,
} from 'n8n-workflow';
import { NodeApiError } from 'n8n-workflow';
export async function clickupApiRequest(
this: IHookFunctions | IExecuteFunctions | ILoadOptionsFunctions | IWebhookFunctions,
method: IHttpRequestMethods,
resource: string,
body: any = {},
qs: IDataObject = {},
uri?: string,
_option: IDataObject = {},
): Promise<any> {
const options: IRequestOptions = {
headers: {
'Content-Type': 'application/json',
},
method,
qs,
body,
uri: uri || `https://api.clickup.com/api/v2${resource}`,
json: true,
};
try {
const authenticationMethod = this.getNodeParameter('authentication', 0) as string;
if (authenticationMethod === 'accessToken') {
return await this.helpers.requestWithAuthentication.call(this, 'clickUpApi', options);
} else {
const oAuth2Options: IOAuth2Options = {
keepBearer: false,
tokenType: 'Bearer',
};
return await this.helpers.requestOAuth2.call(
this,
'clickUpOAuth2Api',
options,
oAuth2Options,
);
}
} catch (error) {
throw new NodeApiError(this.getNode(), error as JsonObject);
}
}
export async function clickupApiRequestAllItems(
this: IHookFunctions | IExecuteFunctions | ILoadOptionsFunctions,
propertyName: string,
method: IHttpRequestMethods,
resource: string,
body: any = {},
query: IDataObject = {},
): Promise<any> {
const returnData: IDataObject[] = [];
let responseData;
query.page = 0;
do {
responseData = await clickupApiRequest.call(this, method, resource, body, query);
returnData.push.apply(returnData, responseData[propertyName] as IDataObject[]);
query.page++;
const limit = query.limit as number | undefined;
if (limit && limit <= returnData.length) {
return returnData;
}
} while (responseData[propertyName] && responseData[propertyName].length !== 0);
return returnData;
}
export function validateJSON(json: string | undefined): any {
let result;
try {
result = JSON.parse(json!);
} catch (exception) {
result = undefined;
}
return result;
}
@@ -0,0 +1,271 @@
import type { INodeProperties } from 'n8n-workflow';
export const goalOperations: INodeProperties[] = [
{
displayName: 'Operation',
name: 'operation',
type: 'options',
noDataExpression: true,
displayOptions: {
show: {
resource: ['goal'],
},
},
options: [
{
name: 'Create',
value: 'create',
description: 'Create a goal',
action: 'Create a goal',
},
{
name: 'Delete',
value: 'delete',
description: 'Delete a goal',
action: 'Delete a goal',
},
{
name: 'Get',
value: 'get',
description: 'Get a goal',
action: 'Get a goal',
},
{
name: 'Get Many',
value: 'getAll',
description: 'Get many goals',
action: 'Get many goals',
},
{
name: 'Update',
value: 'update',
description: 'Update a goal',
action: 'Update a goal',
},
],
default: 'create',
},
];
export const goalFields: INodeProperties[] = [
/* -------------------------------------------------------------------------- */
/* goal:create */
/* -------------------------------------------------------------------------- */
{
displayName: 'Team Name or ID',
name: 'team',
type: 'options',
description:
'Choose from the list, or specify an ID using an <a href="https://docs.n8n.io/code/expressions/">expression</a>',
default: '',
displayOptions: {
show: {
resource: ['goal'],
operation: ['create'],
},
},
typeOptions: {
loadOptionsMethod: 'getTeams',
},
required: true,
},
{
displayName: 'Name',
name: 'name',
type: 'string',
default: '',
displayOptions: {
show: {
resource: ['goal'],
operation: ['create'],
},
},
required: true,
},
{
displayName: 'Additional Fields',
name: 'additionalFields',
type: 'collection',
placeholder: 'Add Field',
default: {},
displayOptions: {
show: {
resource: ['goal'],
operation: ['create'],
},
},
options: [
{
displayName: 'Color',
name: 'color',
type: 'color',
default: '',
},
{
displayName: 'Description',
name: 'description',
type: 'string',
default: '',
},
{
displayName: 'Due Date',
name: 'dueDate',
type: 'dateTime',
default: '',
},
{
displayName: 'Multiple Owners',
name: 'multipleOwners',
type: 'boolean',
default: false,
},
{
displayName: 'Owners',
name: 'owners',
type: 'string',
default: '',
},
],
},
/* -------------------------------------------------------------------------- */
/* goal:delete */
/* -------------------------------------------------------------------------- */
{
displayName: 'Goal ID',
name: 'goal',
type: 'string',
default: '',
displayOptions: {
show: {
resource: ['goal'],
operation: ['delete'],
},
},
required: true,
},
/* -------------------------------------------------------------------------- */
/* goal:get */
/* -------------------------------------------------------------------------- */
{
displayName: 'Goal ID',
name: 'goal',
type: 'string',
default: '',
displayOptions: {
show: {
resource: ['goal'],
operation: ['get'],
},
},
required: true,
},
/* -------------------------------------------------------------------------- */
/* goal:getAll */
/* -------------------------------------------------------------------------- */
{
displayName: 'Team Name or ID',
name: 'team',
type: 'options',
description:
'Choose from the list, or specify an ID using an <a href="https://docs.n8n.io/code/expressions/">expression</a>',
default: '',
displayOptions: {
show: {
resource: ['goal'],
operation: ['getAll'],
},
},
typeOptions: {
loadOptionsMethod: 'getTeams',
},
required: true,
},
{
displayName: 'Limit',
name: 'limit',
type: 'number',
displayOptions: {
show: {
resource: ['goal'],
operation: ['getAll'],
},
},
typeOptions: {
minValue: 1,
maxValue: 100,
},
default: 50,
description: 'Max number of results to return',
},
/* -------------------------------------------------------------------------- */
/* goal:update */
/* -------------------------------------------------------------------------- */
{
displayName: 'Goal ID',
name: 'goal',
type: 'string',
default: '',
displayOptions: {
show: {
resource: ['goal'],
operation: ['update'],
},
},
required: true,
},
{
displayName: 'Update Fields',
name: 'updateFields',
type: 'collection',
placeholder: 'Add Field',
default: {},
displayOptions: {
show: {
resource: ['goal'],
operation: ['update'],
},
},
options: [
{
displayName: 'Add Owners',
name: 'addOwners',
type: 'string',
default: '',
},
{
displayName: 'Color',
name: 'color',
type: 'color',
default: '',
},
{
displayName: 'Description',
name: 'description',
type: 'string',
default: '',
},
{
displayName: 'Due Date',
name: 'dueDate',
type: 'dateTime',
default: '',
},
{
displayName: 'Name',
name: 'name',
type: 'string',
default: '',
},
{
displayName: 'Remove Owners',
name: 'removeOwners',
type: 'string',
default: '',
},
],
},
];
@@ -0,0 +1,260 @@
import type { INodeProperties } from 'n8n-workflow';
export const goalKeyResultOperations: INodeProperties[] = [
{
displayName: 'Operation',
name: 'operation',
type: 'options',
noDataExpression: true,
displayOptions: {
show: {
resource: ['goalKeyResult'],
},
},
options: [
{
name: 'Create',
value: 'create',
description: 'Create a key result',
action: 'Create a goal key result',
},
{
name: 'Delete',
value: 'delete',
description: 'Delete a key result',
action: 'Delete a goal key result',
},
{
name: 'Update',
value: 'update',
description: 'Update a key result',
action: 'Update a goal key result',
},
],
default: 'create',
},
];
export const goalKeyResultFields: INodeProperties[] = [
/* -------------------------------------------------------------------------- */
/* goalKeyResult:create */
/* -------------------------------------------------------------------------- */
{
displayName: 'Goal ID',
name: 'goal',
type: 'string',
default: '',
displayOptions: {
show: {
resource: ['goalKeyResult'],
operation: ['create'],
},
},
required: true,
},
{
displayName: 'Name',
name: 'name',
type: 'string',
default: '',
displayOptions: {
show: {
resource: ['goalKeyResult'],
operation: ['create'],
},
},
required: true,
},
{
displayName: 'Type',
name: 'type',
type: 'options',
options: [
{
name: 'Automatic',
value: 'automatic',
},
{
name: 'Boolean',
value: 'boolean',
},
{
name: 'Currency',
value: 'currency',
},
{
name: 'Number',
value: 'number',
},
{
name: 'Percentage',
value: 'percentage',
},
],
default: '',
displayOptions: {
show: {
resource: ['goalKeyResult'],
operation: ['create'],
},
},
required: true,
},
{
displayName: 'Additional Fields',
name: 'additionalFields',
type: 'collection',
placeholder: 'Add Field',
default: {},
displayOptions: {
show: {
resource: ['goalKeyResult'],
operation: ['create'],
},
},
options: [
{
displayName: 'List IDs',
name: 'listIds',
type: 'string',
default: '',
},
{
displayName: 'Owners',
name: 'owners',
type: 'string',
default: '',
},
{
displayName: 'Steps Start',
name: 'stepsStart',
type: 'number',
typeOptions: {
minValue: 0,
},
default: 0,
description: 'Required for Percentage, Automatic, Number and Currency',
},
{
displayName: 'Steps End',
name: 'stepsEnd',
type: 'number',
typeOptions: {
minValue: 0,
},
default: 0,
description: 'Required for Percentage, Automatic, Number and Currency',
},
{
displayName: 'Task IDs',
name: 'taskIds',
type: 'string',
default: '',
},
{
displayName: 'Unit',
name: 'unit',
type: 'string',
default: '',
description:
'Only matters for type Number and Currency. For Currency the unit must be a valid currency code.',
},
],
},
/* -------------------------------------------------------------------------- */
/* goalKeyResult:delete */
/* -------------------------------------------------------------------------- */
{
displayName: 'Key Result ID',
name: 'keyResult',
type: 'string',
default: '',
displayOptions: {
show: {
resource: ['goalKeyResult'],
operation: ['delete'],
},
},
required: true,
},
/* -------------------------------------------------------------------------- */
/* goalKeyResult:update */
/* -------------------------------------------------------------------------- */
{
displayName: 'Key Result ID',
name: 'keyResult',
type: 'string',
default: '',
displayOptions: {
show: {
resource: ['goalKeyResult'],
operation: ['update'],
},
},
required: true,
},
{
displayName: 'Update Fields',
name: 'updateFields',
type: 'collection',
placeholder: 'Add Field',
default: {},
displayOptions: {
show: {
resource: ['goalKeyResult'],
operation: ['update'],
},
},
options: [
{
displayName: 'Name',
name: 'name',
type: 'string',
default: '',
},
{
displayName: 'Note',
name: 'note',
type: 'string',
default: '',
},
{
displayName: 'Steps Current',
name: 'stepsCurrent',
type: 'number',
typeOptions: {
minValue: 0,
},
default: 1,
},
{
displayName: 'Steps End',
name: 'stepsEnd',
type: 'number',
typeOptions: {
minValue: 0,
},
default: 0,
},
{
displayName: 'Steps Start',
name: 'stepsStart',
type: 'number',
typeOptions: {
minValue: 0,
},
default: 0,
},
{
displayName: 'Unit',
name: 'unit',
type: 'string',
default: '',
description:
'Only matters for type Number and Currency. For Currency the unit must be a valid currency code.',
},
],
},
];
@@ -0,0 +1,256 @@
import type { INodeProperties } from 'n8n-workflow';
export const guestOperations: INodeProperties[] = [
{
displayName: 'Operation',
name: 'operation',
type: 'options',
noDataExpression: true,
displayOptions: {
show: {
resource: ['guest'],
},
},
options: [
{
name: 'Create',
value: 'create',
description: 'Create a guest',
action: 'Create a guest',
},
{
name: 'Delete',
value: 'delete',
description: 'Delete a guest',
action: 'Delete a guest',
},
{
name: 'Get',
value: 'get',
description: 'Get a guest',
action: 'Get a guest',
},
{
name: 'Update',
value: 'update',
description: 'Update a guest',
action: 'Update a guest',
},
],
default: 'create',
},
];
export const guestFields: INodeProperties[] = [
/* -------------------------------------------------------------------------- */
/* guest:create */
/* -------------------------------------------------------------------------- */
{
displayName: 'Team Name or ID',
name: 'team',
type: 'options',
description:
'Choose from the list, or specify an ID using an <a href="https://docs.n8n.io/code/expressions/">expression</a>',
default: '',
displayOptions: {
show: {
resource: ['guest'],
operation: ['create'],
},
},
typeOptions: {
loadOptionsMethod: 'getTeams',
},
required: true,
},
{
displayName: 'Email',
name: 'email',
type: 'string',
placeholder: 'name@email.com',
default: '',
displayOptions: {
show: {
resource: ['guest'],
operation: ['create'],
},
},
},
{
displayName: 'Additional Fields',
name: 'additionalFields',
type: 'collection',
placeholder: 'Add Field',
default: {},
displayOptions: {
show: {
resource: ['guest'],
operation: ['create'],
},
},
options: [
{
displayName: 'Can Edit Tags',
name: 'can_edit_tags',
type: 'boolean',
default: false,
},
{
displayName: 'Can See Time Spend',
name: 'can_see_time_spend',
type: 'boolean',
default: false,
},
{
displayName: 'Can See Time Estimated',
name: 'can_see_time_estimated',
type: 'boolean',
default: false,
},
],
},
/* -------------------------------------------------------------------------- */
/* guest:delete */
/* -------------------------------------------------------------------------- */
{
displayName: 'Team Name or ID',
name: 'team',
type: 'options',
description:
'Choose from the list, or specify an ID using an <a href="https://docs.n8n.io/code/expressions/">expression</a>',
default: '',
displayOptions: {
show: {
resource: ['guest'],
operation: ['delete'],
},
},
typeOptions: {
loadOptionsMethod: 'getTeams',
},
required: true,
},
{
displayName: 'Guest ID',
name: 'guest',
type: 'string',
default: '',
displayOptions: {
show: {
resource: ['guest'],
operation: ['delete'],
},
},
required: true,
},
/* -------------------------------------------------------------------------- */
/* guest:get */
/* -------------------------------------------------------------------------- */
{
displayName: 'Team Name or ID',
name: 'team',
type: 'options',
description:
'Choose from the list, or specify an ID using an <a href="https://docs.n8n.io/code/expressions/">expression</a>',
default: '',
displayOptions: {
show: {
resource: ['guest'],
operation: ['get'],
},
},
typeOptions: {
loadOptionsMethod: 'getTeams',
},
required: true,
},
{
displayName: 'Guest ID',
name: 'guest',
type: 'string',
default: '',
displayOptions: {
show: {
resource: ['guest'],
operation: ['get'],
},
},
required: true,
},
/* -------------------------------------------------------------------------- */
/* guest:update */
/* -------------------------------------------------------------------------- */
{
displayName: 'Team Name or ID',
name: 'team',
type: 'options',
description:
'Choose from the list, or specify an ID using an <a href="https://docs.n8n.io/code/expressions/">expression</a>',
default: '',
displayOptions: {
show: {
resource: ['guest'],
operation: ['update'],
},
},
typeOptions: {
loadOptionsMethod: 'getTeams',
},
required: true,
},
{
displayName: 'Guest ID',
name: 'guest',
type: 'string',
default: '',
displayOptions: {
show: {
resource: ['guest'],
operation: ['update'],
},
},
required: true,
},
{
displayName: 'Update Fields',
name: 'updateFields',
type: 'collection',
placeholder: 'Add Field',
default: {},
displayOptions: {
show: {
resource: ['guest'],
operation: ['update'],
},
},
options: [
{
displayName: 'Can Edit Tags',
name: 'can_edit_tags',
type: 'boolean',
default: false,
},
{
displayName: 'Can See Time Spend',
name: 'can_see_time_spend',
type: 'boolean',
default: false,
},
{
displayName: 'Can See Time Estimated',
name: 'can_see_time_estimated',
type: 'boolean',
default: false,
},
{
displayName: 'Username',
name: 'username',
type: 'string',
default: '',
},
],
},
];
@@ -0,0 +1,815 @@
import type { INodeProperties } from 'n8n-workflow';
export const listOperations: INodeProperties[] = [
{
displayName: 'Operation',
name: 'operation',
type: 'options',
noDataExpression: true,
displayOptions: {
show: {
resource: ['list'],
},
},
options: [
{
name: 'Create',
value: 'create',
description: 'Create a list',
action: 'Create a list',
},
{
name: 'Custom Fields',
value: 'customFields',
description: "Retrieve list's custom fields",
action: 'Get custom fields from a list',
},
{
name: 'Delete',
value: 'delete',
description: 'Delete a list',
action: 'Delete a list',
},
{
name: 'Get',
value: 'get',
description: 'Get a list',
action: 'Get a list',
},
{
name: 'Get Many',
value: 'getAll',
description: 'Get many lists',
action: 'Get many lists',
},
{
name: 'Member',
value: 'member',
description: 'Get list members',
action: 'Get list members',
},
{
name: 'Update',
value: 'update',
description: 'Update a list',
action: 'Update a list',
},
],
default: 'customFields',
},
];
export const listFields: INodeProperties[] = [
/* -------------------------------------------------------------------------- */
/* list:create */
/* -------------------------------------------------------------------------- */
{
displayName: 'Team Name or ID',
name: 'team',
type: 'options',
description:
'Choose from the list, or specify an ID using an <a href="https://docs.n8n.io/code/expressions/">expression</a>',
default: '',
displayOptions: {
show: {
resource: ['list'],
operation: ['create'],
},
},
typeOptions: {
loadOptionsMethod: 'getTeams',
},
required: true,
},
{
displayName: 'Space Name or ID',
name: 'space',
type: 'options',
description:
'Choose from the list, or specify an ID using an <a href="https://docs.n8n.io/code/expressions/">expression</a>',
default: '',
displayOptions: {
show: {
resource: ['list'],
operation: ['create'],
},
},
typeOptions: {
loadOptionsMethod: 'getSpaces',
loadOptionsDependsOn: ['team'],
},
required: true,
},
{
displayName: 'Folderless List',
name: 'folderless',
type: 'boolean',
default: false,
displayOptions: {
show: {
resource: ['list'],
operation: ['create'],
},
},
required: true,
},
{
displayName: 'Folder Name or ID',
name: 'folder',
type: 'options',
description:
'Choose from the list, or specify an ID using an <a href="https://docs.n8n.io/code/expressions/">expression</a>',
default: '',
displayOptions: {
show: {
resource: ['list'],
operation: ['create'],
folderless: [false],
},
},
typeOptions: {
loadOptionsMethod: 'getFolders',
loadOptionsDependsOn: ['space'],
},
required: true,
},
{
displayName: 'Name',
name: 'name',
type: 'string',
default: '',
displayOptions: {
show: {
resource: ['list'],
operation: ['create'],
},
},
required: true,
},
{
displayName: 'Additional Fields',
name: 'additionalFields',
type: 'collection',
placeholder: 'Add Field',
default: {},
displayOptions: {
show: {
resource: ['list'],
operation: ['create'],
},
},
options: [
{
displayName: 'Assignee',
name: 'assignee',
type: 'string',
default: '',
},
{
displayName: 'Content',
name: 'content',
type: 'string',
default: '',
},
{
displayName: 'Due Date',
name: 'dueDate',
type: 'dateTime',
default: '',
},
{
displayName: 'Due Date Time',
name: 'dueDateTime',
type: 'boolean',
default: false,
},
{
displayName: 'Priority',
name: 'priority',
type: 'number',
typeOptions: {
minValue: 1,
maxValue: 4,
},
description: 'Integer mapping as 1 : Urgent, 2 : High, 3 : Normal, 4 : Low',
default: 3,
},
{
displayName: 'Status Name or ID',
name: 'status',
type: 'options',
description:
'Choose from the list, or specify an ID using an <a href="https://docs.n8n.io/code/expressions/">expression</a>',
typeOptions: {
loadOptionsMethod: 'getStatuses',
loadOptionsDependsOn: ['list'],
},
default: '',
},
],
},
/* -------------------------------------------------------------------------- */
/* 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: 'Whether to return all results 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: 'Max number of results to return',
},
/* -------------------------------------------------------------------------- */
/* list:customFields */
/* -------------------------------------------------------------------------- */
{
displayName: 'Team Name or ID',
name: 'team',
type: 'options',
description:
'Choose from the list, or specify an ID using an <a href="https://docs.n8n.io/code/expressions/">expression</a>',
default: '',
displayOptions: {
show: {
resource: ['list'],
operation: ['customFields'],
},
},
typeOptions: {
loadOptionsMethod: 'getTeams',
},
required: true,
},
{
displayName: 'Space Name or ID',
name: 'space',
type: 'options',
description:
'Choose from the list, or specify an ID using an <a href="https://docs.n8n.io/code/expressions/">expression</a>',
default: '',
displayOptions: {
show: {
resource: ['list'],
operation: ['customFields'],
},
},
typeOptions: {
loadOptionsMethod: 'getSpaces',
loadOptionsDependsOn: ['teamId'],
},
required: true,
},
{
displayName: 'Folderless List',
name: 'folderless',
type: 'boolean',
default: false,
displayOptions: {
show: {
resource: ['list'],
operation: ['customFields'],
},
},
required: true,
},
{
displayName: 'Folder Name or ID',
name: 'folder',
type: 'options',
description:
'Choose from the list, or specify an ID using an <a href="https://docs.n8n.io/code/expressions/">expression</a>',
default: '',
displayOptions: {
show: {
resource: ['list'],
operation: ['customFields'],
folderless: [false],
},
},
typeOptions: {
loadOptionsMethod: 'getFolders',
loadOptionsDependsOn: ['space'],
},
required: true,
},
{
displayName: 'List Name or ID',
name: 'list',
type: 'options',
description:
'Choose from the list, or specify an ID using an <a href="https://docs.n8n.io/code/expressions/">expression</a>',
default: '',
displayOptions: {
show: {
resource: ['list'],
operation: ['customFields'],
folderless: [true],
},
},
typeOptions: {
loadOptionsMethod: 'getFolderlessLists',
loadOptionsDependsOn: ['space'],
},
required: true,
},
{
displayName: 'List Name or ID',
name: 'list',
type: 'options',
description:
'Choose from the list, or specify an ID using an <a href="https://docs.n8n.io/code/expressions/">expression</a>',
default: '',
displayOptions: {
show: {
resource: ['list'],
operation: ['customFields'],
folderless: [false],
},
},
typeOptions: {
loadOptionsMethod: 'getLists',
loadOptionsDependsOn: ['folder'],
},
required: true,
},
/* -------------------------------------------------------------------------- */
/* list:delete */
/* -------------------------------------------------------------------------- */
{
displayName: 'Team Name or ID',
name: 'team',
type: 'options',
description:
'Choose from the list, or specify an ID using an <a href="https://docs.n8n.io/code/expressions/">expression</a>',
default: '',
displayOptions: {
show: {
resource: ['list'],
operation: ['delete'],
},
},
typeOptions: {
loadOptionsMethod: 'getTeams',
},
required: true,
},
{
displayName: 'Space Name or ID',
name: 'space',
type: 'options',
description:
'Choose from the list, or specify an ID using an <a href="https://docs.n8n.io/code/expressions/">expression</a>',
default: '',
displayOptions: {
show: {
resource: ['list'],
operation: ['delete'],
},
},
typeOptions: {
loadOptionsMethod: 'getSpaces',
loadOptionsDependsOn: ['team'],
},
required: true,
},
{
displayName: 'Folderless List',
name: 'folderless',
type: 'boolean',
default: false,
displayOptions: {
show: {
resource: ['list'],
operation: ['delete'],
},
},
required: true,
},
{
displayName: 'Folder Name or ID',
name: 'folder',
type: 'options',
description:
'Choose from the list, or specify an ID using an <a href="https://docs.n8n.io/code/expressions/">expression</a>',
default: '',
displayOptions: {
show: {
resource: ['list'],
operation: ['delete'],
folderless: [false],
},
},
typeOptions: {
loadOptionsMethod: 'getFolders',
loadOptionsDependsOn: ['space'],
},
required: true,
},
{
displayName: 'List ID',
name: 'list',
type: 'string',
default: '',
displayOptions: {
show: {
resource: ['list'],
operation: ['delete'],
},
},
required: true,
},
/* -------------------------------------------------------------------------- */
/* list:get */
/* -------------------------------------------------------------------------- */
{
displayName: 'Team Name or ID',
name: 'team',
type: 'options',
description:
'Choose from the list, or specify an ID using an <a href="https://docs.n8n.io/code/expressions/">expression</a>',
default: '',
displayOptions: {
show: {
resource: ['list'],
operation: ['get'],
},
},
typeOptions: {
loadOptionsMethod: 'getTeams',
},
required: true,
},
{
displayName: 'Space Name or ID',
name: 'space',
type: 'options',
description:
'Choose from the list, or specify an ID using an <a href="https://docs.n8n.io/code/expressions/">expression</a>',
default: '',
displayOptions: {
show: {
resource: ['list'],
operation: ['get'],
},
},
typeOptions: {
loadOptionsMethod: 'getSpaces',
loadOptionsDependsOn: ['team'],
},
required: true,
},
{
displayName: 'Folderless List',
name: 'folderless',
type: 'boolean',
default: false,
displayOptions: {
show: {
resource: ['list'],
operation: ['get'],
},
},
required: true,
},
{
displayName: 'Folder Name or ID',
name: 'folder',
type: 'options',
description:
'Choose from the list, or specify an ID using an <a href="https://docs.n8n.io/code/expressions/">expression</a>',
default: '',
displayOptions: {
show: {
resource: ['list'],
operation: ['get'],
folderless: [false],
},
},
typeOptions: {
loadOptionsMethod: 'getFolders',
loadOptionsDependsOn: ['space'],
},
required: true,
},
{
displayName: 'List ID',
name: 'list',
type: 'string',
default: '',
displayOptions: {
show: {
resource: ['list'],
operation: ['get'],
},
},
required: true,
},
/* -------------------------------------------------------------------------- */
/* list:getAll */
/* -------------------------------------------------------------------------- */
{
displayName: 'Team Name or ID',
name: 'team',
type: 'options',
description:
'Choose from the list, or specify an ID using an <a href="https://docs.n8n.io/code/expressions/">expression</a>',
default: '',
displayOptions: {
show: {
resource: ['list'],
operation: ['getAll'],
},
},
typeOptions: {
loadOptionsMethod: 'getTeams',
},
required: true,
},
{
displayName: 'Space Name or ID',
name: 'space',
type: 'options',
description:
'Choose from the list, or specify an ID using an <a href="https://docs.n8n.io/code/expressions/">expression</a>',
default: '',
displayOptions: {
show: {
resource: ['list'],
operation: ['getAll'],
},
},
typeOptions: {
loadOptionsMethod: 'getSpaces',
loadOptionsDependsOn: ['team'],
},
required: true,
},
{
displayName: 'Folderless List',
name: 'folderless',
type: 'boolean',
default: false,
displayOptions: {
show: {
resource: ['list'],
operation: ['getAll'],
},
},
required: true,
},
{
displayName: 'Folder Name or ID',
name: 'folder',
type: 'options',
description:
'Choose from the list, or specify an ID using an <a href="https://docs.n8n.io/code/expressions/">expression</a>',
default: '',
displayOptions: {
show: {
resource: ['list'],
operation: ['getAll'],
folderless: [false],
},
},
typeOptions: {
loadOptionsMethod: 'getFolders',
loadOptionsDependsOn: ['space'],
},
required: true,
},
{
displayName: 'Limit',
name: 'limit',
type: 'number',
displayOptions: {
show: {
resource: ['list'],
operation: ['getAll'],
},
},
typeOptions: {
minValue: 1,
maxValue: 100,
},
default: 50,
description: 'Max number of results to return',
},
{
displayName: 'Filters',
name: 'filters',
type: 'collection',
placeholder: 'Add Filter',
default: {},
displayOptions: {
show: {
resource: ['list'],
operation: ['getAll'],
},
},
options: [
{
displayName: 'Archived',
name: 'archived',
type: 'boolean',
default: false,
},
],
},
/* -------------------------------------------------------------------------- */
/* list:update */
/* -------------------------------------------------------------------------- */
{
displayName: 'Team Name or ID',
name: 'team',
type: 'options',
description:
'Choose from the list, or specify an ID using an <a href="https://docs.n8n.io/code/expressions/">expression</a>',
default: '',
displayOptions: {
show: {
resource: ['list'],
operation: ['update'],
},
},
typeOptions: {
loadOptionsMethod: 'getTeams',
},
required: true,
},
{
displayName: 'Space Name or ID',
name: 'space',
type: 'options',
description:
'Choose from the list, or specify an ID using an <a href="https://docs.n8n.io/code/expressions/">expression</a>',
default: '',
displayOptions: {
show: {
resource: ['list'],
operation: ['update'],
},
},
typeOptions: {
loadOptionsMethod: 'getSpaces',
loadOptionsDependsOn: ['team'],
},
required: true,
},
{
displayName: 'Folderless List',
name: 'folderless',
type: 'boolean',
default: false,
displayOptions: {
show: {
resource: ['list'],
operation: ['update'],
},
},
required: true,
},
{
displayName: 'Folder Name or ID',
name: 'folder',
type: 'options',
description:
'Choose from the list, or specify an ID using an <a href="https://docs.n8n.io/code/expressions/">expression</a>',
default: '',
displayOptions: {
show: {
resource: ['list'],
operation: ['update'],
folderless: [false],
},
},
typeOptions: {
loadOptionsMethod: 'getFolders',
loadOptionsDependsOn: ['space'],
},
required: true,
},
{
displayName: 'List ID',
name: 'list',
type: 'string',
default: '',
displayOptions: {
show: {
resource: ['list'],
operation: ['update'],
},
},
required: true,
},
{
displayName: 'Update Fields',
name: 'updateFields',
type: 'collection',
placeholder: 'Add Field',
default: {},
displayOptions: {
show: {
resource: ['list'],
operation: ['update'],
},
},
options: [
{
displayName: 'Assignee Name or ID',
name: 'assignee',
type: 'options',
description:
'Choose from the list, or specify an ID using an <a href="https://docs.n8n.io/code/expressions/">expression</a>',
typeOptions: {
loadOptionsMethod: 'getAssignees',
loadOptionsDependsOn: ['list'],
},
default: '',
},
{
displayName: 'Content',
name: 'content',
type: 'string',
default: '',
},
{
displayName: 'Due Date',
name: 'dueDate',
type: 'dateTime',
default: '',
},
{
displayName: 'Due Date Time',
name: 'dueDateTime',
type: 'boolean',
default: false,
},
{
displayName: 'Name',
name: 'name',
type: 'string',
default: '',
},
{
displayName: 'Priority',
name: 'priority',
type: 'number',
typeOptions: {
minValue: 1,
maxValue: 4,
},
description: 'Integer mapping as 1 : Urgent, 2 : High, 3 : Normal, 4 : Low',
default: 3,
},
{
displayName: 'Unset Status',
name: 'unsetStatus',
type: 'boolean',
default: false,
},
],
},
];
@@ -0,0 +1,10 @@
export interface IList {
name?: string;
content?: string;
assignee?: number;
status?: string;
priority?: number;
due_date?: number;
due_date_time?: boolean;
unset_status?: boolean;
}
@@ -0,0 +1,164 @@
import type { INodeProperties } from 'n8n-workflow';
export const spaceTagOperations: INodeProperties[] = [
{
displayName: 'Operation',
name: 'operation',
type: 'options',
noDataExpression: true,
displayOptions: {
show: {
resource: ['spaceTag'],
},
},
options: [
{
name: 'Create',
value: 'create',
description: 'Create a space tag',
action: 'Create a space tag',
},
{
name: 'Delete',
value: 'delete',
description: 'Delete a space tag',
action: 'Delete a space tag',
},
{
name: 'Get Many',
value: 'getAll',
description: 'Get many space tags',
action: 'Get many space tags',
},
{
name: 'Update',
value: 'update',
description: 'Update a space tag',
action: 'Update a space tag',
},
],
default: 'create',
},
];
export const spaceTagFields: INodeProperties[] = [
/* -------------------------------------------------------------------------- */
/* spaceTag:create */
/* -------------------------------------------------------------------------- */
{
displayName: 'Space ID',
name: 'space',
type: 'string',
default: '',
displayOptions: {
show: {
resource: ['spaceTag'],
operation: ['create', 'delete', 'getAll', 'update'],
},
},
required: true,
},
{
displayName: 'Name',
name: 'name',
type: 'string',
default: '',
displayOptions: {
show: {
resource: ['spaceTag'],
operation: ['create'],
},
},
required: true,
},
{
displayName: 'Name or ID',
name: 'name',
type: 'options',
description:
'Choose from the list, or specify an ID using an <a href="https://docs.n8n.io/code/expressions/">expression</a>',
typeOptions: {
loadOptionsDependsOn: ['space'],
loadOptionsMethod: 'getTags',
},
default: '',
displayOptions: {
show: {
resource: ['spaceTag'],
operation: ['delete', 'update'],
},
},
required: true,
},
{
displayName: 'New Name',
name: 'newName',
type: 'string',
description: 'New name to set for the tag',
default: '',
displayOptions: {
show: {
resource: ['spaceTag'],
operation: ['update'],
},
},
required: true,
},
{
displayName: 'Foreground Color',
name: 'foregroundColor',
type: 'color',
default: '#000000',
displayOptions: {
show: {
resource: ['spaceTag'],
operation: ['create', 'update'],
},
},
required: true,
},
{
displayName: 'Background Color',
name: 'backgroundColor',
type: 'color',
default: '#000000',
displayOptions: {
show: {
resource: ['spaceTag'],
operation: ['create', 'update'],
},
},
required: true,
},
{
displayName: 'Return All',
name: 'returnAll',
type: 'boolean',
displayOptions: {
show: {
resource: ['spaceTag'],
operation: ['getAll'],
},
},
default: true,
description: 'Whether to return all results or only up to a given limit',
},
{
displayName: 'Limit',
name: 'limit',
type: 'number',
displayOptions: {
show: {
resource: ['spaceTag'],
operation: ['getAll'],
returnAll: [false],
},
},
typeOptions: {
minValue: 1,
maxValue: 100,
},
default: 50,
description: 'Max number of results to return',
},
];
@@ -0,0 +1,92 @@
import type { INodeProperties } from 'n8n-workflow';
export const taskDependencyOperations: INodeProperties[] = [
{
displayName: 'Operation',
name: 'operation',
type: 'options',
noDataExpression: true,
displayOptions: {
show: {
resource: ['taskDependency'],
},
},
options: [
{
name: 'Create',
value: 'create',
description: 'Create a task dependency',
action: 'Create a task dependency',
},
{
name: 'Delete',
value: 'delete',
description: 'Delete a task dependency',
action: 'Delete a task dependency',
},
],
default: 'create',
},
];
export const taskDependencyFields: INodeProperties[] = [
/* -------------------------------------------------------------------------- */
/* taskDependency:create */
/* -------------------------------------------------------------------------- */
{
displayName: 'Task ID',
name: 'task',
type: 'string',
default: '',
displayOptions: {
show: {
resource: ['taskDependency'],
operation: ['create'],
},
},
required: true,
},
{
displayName: 'Depends On Task ID',
name: 'dependsOnTask',
type: 'string',
default: '',
displayOptions: {
show: {
resource: ['taskDependency'],
operation: ['create'],
},
},
required: true,
},
/* -------------------------------------------------------------------------- */
/* taskDependency:delete */
/* -------------------------------------------------------------------------- */
{
displayName: 'Task ID',
name: 'task',
type: 'string',
default: '',
displayOptions: {
show: {
resource: ['taskDependency'],
operation: ['delete'],
},
},
required: true,
},
{
displayName: 'Depends On Task ID',
name: 'dependsOnTask',
type: 'string',
default: '',
displayOptions: {
show: {
resource: ['taskDependency'],
operation: ['delete'],
},
},
required: true,
},
];
@@ -0,0 +1,981 @@
import type { INodeProperties } from 'n8n-workflow';
export const taskOperations: INodeProperties[] = [
{
displayName: 'Operation',
name: 'operation',
type: 'options',
noDataExpression: true,
displayOptions: {
show: {
resource: ['task'],
},
},
options: [
{
name: 'Create',
value: 'create',
description: 'Create a task',
action: 'Create a task',
},
{
name: 'Delete',
value: 'delete',
description: 'Delete a task',
action: 'Delete a task',
},
{
name: 'Get',
value: 'get',
description: 'Get a task',
action: 'Get a task',
},
{
name: 'Get Many',
value: 'getAll',
description: 'Get many tasks',
action: 'Get many tasks',
},
{
name: 'Member',
value: 'member',
description: 'Get task members',
action: 'Get task members',
},
{
name: 'Set Custom Field',
value: 'setCustomField',
description: 'Set a custom field',
action: 'Set a custom Field on a task',
},
{
name: 'Update',
value: 'update',
description: 'Update a task',
action: 'Update a task',
},
],
default: 'create',
},
];
export const taskFields: INodeProperties[] = [
/* -------------------------------------------------------------------------- */
/* task:create */
/* -------------------------------------------------------------------------- */
{
displayName: 'Team Name or ID',
name: 'team',
type: 'options',
description:
'Choose from the list, or specify an ID using an <a href="https://docs.n8n.io/code/expressions/">expression</a>',
default: '',
displayOptions: {
show: {
resource: ['task'],
operation: ['create'],
},
},
typeOptions: {
loadOptionsMethod: 'getTeams',
},
required: true,
},
{
displayName: 'Space Name or ID',
name: 'space',
type: 'options',
description:
'Choose from the list, or specify an ID using an <a href="https://docs.n8n.io/code/expressions/">expression</a>',
default: '',
displayOptions: {
show: {
resource: ['task'],
operation: ['create'],
},
},
typeOptions: {
loadOptionsMethod: 'getSpaces',
loadOptionsDependsOn: ['team'],
},
required: true,
},
{
displayName: 'Folderless List',
name: 'folderless',
type: 'boolean',
default: false,
displayOptions: {
show: {
resource: ['task'],
operation: ['create'],
},
},
required: true,
},
{
displayName: 'Folder Name or ID',
name: 'folder',
type: 'options',
description:
'Choose from the list, or specify an ID using an <a href="https://docs.n8n.io/code/expressions/">expression</a>',
default: '',
displayOptions: {
show: {
resource: ['task'],
operation: ['create'],
folderless: [false],
},
},
typeOptions: {
loadOptionsMethod: 'getFolders',
loadOptionsDependsOn: ['space'],
},
required: true,
},
{
displayName: 'List Name or ID',
name: 'list',
type: 'options',
description:
'Choose from the list, or specify an ID using an <a href="https://docs.n8n.io/code/expressions/">expression</a>',
default: '',
displayOptions: {
show: {
resource: ['task'],
operation: ['create'],
folderless: [true],
},
},
typeOptions: {
loadOptionsMethod: 'getFolderlessLists',
loadOptionsDependsOn: ['space'],
},
required: true,
},
{
displayName: 'List Name or ID',
name: 'list',
type: 'options',
description:
'Choose from the list, or specify an ID using an <a href="https://docs.n8n.io/code/expressions/">expression</a>',
default: '',
displayOptions: {
show: {
resource: ['task'],
operation: ['create'],
folderless: [false],
},
},
typeOptions: {
loadOptionsMethod: 'getLists',
loadOptionsDependsOn: ['folder'],
},
required: true,
},
{
displayName: 'Name',
name: 'name',
type: 'string',
default: '',
displayOptions: {
show: {
resource: ['task'],
operation: ['create'],
},
},
required: true,
description: 'The first name on the task',
},
{
displayName: 'Additional Fields',
name: 'additionalFields',
type: 'collection',
placeholder: 'Add Field',
default: {},
displayOptions: {
show: {
resource: ['task'],
operation: ['create'],
},
},
options: [
{
displayName: 'Assignee Names or IDs',
name: 'assignees',
type: 'multiOptions',
description:
'Choose from the list, or specify IDs using an <a href="https://docs.n8n.io/code/expressions/">expression</a>',
typeOptions: {
loadOptionsMethod: 'getAssignees',
loadOptionsDependsOn: ['list'],
},
default: [],
},
{
displayName: 'Custom Fields JSON',
name: 'customFieldsJson',
type: 'json',
typeOptions: {
alwaysOpenEditWindow: true,
},
default: '',
// eslint-disable-next-line n8n-nodes-base/node-param-description-miscased-id
description:
'Custom fields to set as JSON in the format: <code>[ {"id": "", "value": ""} ]</code>',
},
{
displayName: 'Content',
name: 'content',
type: 'string',
default: '',
},
{
displayName: 'Due Date',
name: 'dueDate',
type: 'dateTime',
default: '',
},
{
displayName: 'Due Date Time',
name: 'dueDateTime',
type: 'boolean',
default: false,
},
{
displayName: 'Is Markdown Content',
name: 'markdownContent',
type: 'boolean',
default: false,
},
{
displayName: 'Notify All',
name: 'notifyAll',
type: 'boolean',
default: false,
},
{
displayName: 'Parent ID',
name: 'parentId',
type: 'string',
default: '',
},
{
displayName: 'Priority',
name: 'priority',
type: 'number',
typeOptions: {
minValue: 1,
maxValue: 4,
},
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',
type: 'boolean',
default: false,
},
{
displayName: 'Status Name or ID',
name: 'status',
type: 'options',
description:
'Choose from the list, or specify an ID using an <a href="https://docs.n8n.io/code/expressions/">expression</a>',
typeOptions: {
loadOptionsMethod: 'getStatuses',
loadOptionsDependsOn: ['list'],
},
default: '',
},
{
displayName: 'Tag Names or IDs',
name: 'tags',
type: 'multiOptions',
typeOptions: {
loadOptionsMethod: 'getTags',
loadOptionsDependsOn: ['space'],
},
default: [],
description:
'The array of tags applied to this task. Choose from the list, or specify IDs using an <a href="https://docs.n8n.io/code/expressions/">expression</a>.',
},
{
displayName: 'Time Estimate',
name: 'timeEstimate',
type: 'number',
description: 'Time estimate in minutes',
default: 1,
},
],
},
/* -------------------------------------------------------------------------- */
/* task:update */
/* -------------------------------------------------------------------------- */
{
displayName: 'Task ID',
name: 'id',
type: 'string',
default: '',
required: true,
displayOptions: {
show: {
resource: ['task'],
operation: ['update'],
},
},
},
{
displayName: 'Update Fields',
name: 'updateFields',
type: 'collection',
placeholder: 'Add Field',
default: {},
displayOptions: {
show: {
resource: ['task'],
operation: ['update'],
},
},
options: [
{
displayName: 'Add Assignees',
name: 'addAssignees',
type: 'string',
default: '',
description: 'Assignees IDs. Multiple ca be added separated by comma.',
},
{
displayName: 'Content',
name: 'content',
type: 'string',
default: '',
},
{
displayName: 'Due Date',
name: 'dueDate',
type: 'dateTime',
default: '',
},
{
displayName: 'Due Date Time',
name: 'dueDateTime',
type: 'boolean',
default: false,
},
{
displayName: 'Is Markdown Content',
name: 'markdownContent',
type: 'boolean',
default: false,
},
{
displayName: 'Name',
name: 'name',
type: 'string',
default: '',
},
{
displayName: 'Notify All',
name: 'notifyAll',
type: 'boolean',
default: false,
},
{
displayName: 'Parent ID',
name: 'parentId',
type: 'string',
default: '',
},
{
displayName: 'Priority',
name: 'priority',
type: 'number',
typeOptions: {
minValue: 1,
maxValue: 4,
},
description: 'Integer mapping as 1 : Urgent, 2 : High, 3 : Normal, 4 : Low',
default: 3,
},
{
displayName: 'Remove Assignees',
name: 'removeAssignees',
type: 'string',
default: '',
description: 'Assignees IDs. Multiple ca be added separated by comma.',
},
{
displayName: 'Status',
name: 'status',
type: 'string',
default: '',
},
{
displayName: 'Start Date',
name: 'startDate',
type: 'dateTime',
default: '',
},
{
displayName: 'Start Date Time',
name: 'startDateTime',
type: 'boolean',
default: false,
},
{
displayName: 'Time Estimate',
name: 'timeEstimate',
type: 'number',
description: 'Time estimate in minutes',
default: 1,
},
],
},
/* -------------------------------------------------------------------------- */
/* task:get */
/* -------------------------------------------------------------------------- */
{
displayName: 'Task ID',
name: 'id',
type: 'string',
default: '',
required: true,
displayOptions: {
show: {
resource: ['task'],
operation: ['get'],
},
},
},
{
displayName: 'Include Subtasks',
name: 'includeSubtasks',
type: 'boolean',
default: false,
description: 'Whether to also fetch and include subtasks for this task',
displayOptions: {
show: {
resource: ['task'],
operation: ['get'],
},
},
},
{
displayName: 'Include Markdown Description',
name: 'includeMarkdownDescription',
type: 'boolean',
default: false,
description:
'Whether to include the markdown_description field in the response. This is important for preserving links in the description.',
displayOptions: {
show: {
resource: ['task'],
operation: ['get'],
},
},
},
/* -------------------------------------------------------------------------- */
/* task:getAll */
/* -------------------------------------------------------------------------- */
{
displayName: 'Team Name or ID',
name: 'team',
type: 'options',
description:
'Choose from the list, or specify an ID using an <a href="https://docs.n8n.io/code/expressions/">expression</a>',
default: '',
displayOptions: {
show: {
resource: ['task'],
operation: ['getAll'],
},
},
typeOptions: {
loadOptionsMethod: 'getTeams',
},
required: true,
},
{
displayName: 'Space Name or ID',
name: 'space',
type: 'options',
description:
'Choose from the list, or specify an ID using an <a href="https://docs.n8n.io/code/expressions/">expression</a>',
default: '',
displayOptions: {
show: {
resource: ['task'],
operation: ['getAll'],
},
},
typeOptions: {
loadOptionsMethod: 'getSpaces',
loadOptionsDependsOn: ['team'],
},
required: true,
},
{
displayName: 'Folderless List',
name: 'folderless',
type: 'boolean',
default: false,
displayOptions: {
show: {
resource: ['task'],
operation: ['getAll'],
},
},
required: true,
},
{
displayName: 'Folder Name or ID',
name: 'folder',
type: 'options',
description:
'Choose from the list, or specify an ID using an <a href="https://docs.n8n.io/code/expressions/">expression</a>',
default: '',
displayOptions: {
show: {
resource: ['task'],
operation: ['getAll'],
folderless: [false],
},
},
typeOptions: {
loadOptionsMethod: 'getFolders',
loadOptionsDependsOn: ['space'],
},
required: true,
},
{
displayName: 'List Name or ID',
name: 'list',
type: 'options',
description:
'Choose from the list, or specify an ID using an <a href="https://docs.n8n.io/code/expressions/">expression</a>',
default: '',
displayOptions: {
show: {
resource: ['task'],
operation: ['getAll'],
folderless: [true],
},
},
typeOptions: {
loadOptionsMethod: 'getFolderlessLists',
loadOptionsDependsOn: ['space'],
},
required: true,
},
{
displayName: 'List Name or ID',
name: 'list',
type: 'options',
description:
'Choose from the list, or specify an ID using an <a href="https://docs.n8n.io/code/expressions/">expression</a>',
default: '',
displayOptions: {
show: {
resource: ['task'],
operation: ['getAll'],
folderless: [false],
},
},
typeOptions: {
loadOptionsMethod: 'getLists',
loadOptionsDependsOn: ['folder'],
},
required: true,
},
{
displayName: 'Return All',
name: 'returnAll',
type: 'boolean',
displayOptions: {
show: {
resource: ['task'],
operation: ['getAll'],
},
},
default: true,
description: 'Whether to return all results or only up to a given limit',
},
{
displayName: 'Limit',
name: 'limit',
type: 'number',
displayOptions: {
show: {
resource: ['task'],
operation: ['getAll'],
returnAll: [false],
},
},
typeOptions: {
minValue: 1,
maxValue: 100,
},
default: 50,
description: 'Max number of results to return',
},
{
displayName: 'Filters',
name: 'filters',
type: 'collection',
placeholder: 'Add Filter',
default: {},
displayOptions: {
show: {
resource: ['task'],
operation: ['getAll'],
},
},
options: [
{
displayName: 'Archived',
name: 'archived',
type: 'boolean',
default: false,
},
{
displayName: 'Assignee Names or IDs',
name: 'assignees',
type: 'multiOptions',
description:
'Choose from the list, or specify IDs using an <a href="https://docs.n8n.io/code/expressions/">expression</a>',
typeOptions: {
loadOptionsMethod: 'getAssignees',
loadOptionsDependsOn: ['list'],
},
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 Name or ID',
name: 'fieldId',
type: 'options',
typeOptions: {
loadOptionsMethod: 'getCustomFields',
},
default: '',
description:
'The ID of the field to add custom field to. Choose from the list, or specify an ID using an <a href="https://docs.n8n.io/code/expressions/">expression</a>.',
},
{
displayName: 'Operator',
name: 'operator',
type: 'options',
options: [
{
name: '!=',
value: '!=',
},
{
name: '<',
value: '<',
},
{
name: '<=',
value: '<=',
},
{
name: '>',
value: '>',
},
{
name: '>=',
value: '>=',
},
{
name: 'Equal',
value: 'equal',
},
{
name: 'Is Not Null',
value: 'IS NOT NULL',
},
{
name: 'Is Null',
value: 'IS 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',
type: 'dateTime',
default: '',
description: 'Filter date created greater',
},
{
displayName: 'Date Created Less Than',
name: 'dateCreatedLt',
type: 'dateTime',
default: '',
description: 'Filter date created less than posix time',
},
{
displayName: 'Date Updated Greater Than',
name: 'dateUpdatedGt',
type: 'dateTime',
default: '',
description: 'Filter date updated greater than',
},
{
displayName: 'Date Update Less Than',
name: 'dateUpdatedLt',
type: 'dateTime',
default: '',
description: 'Filter date updated less than',
},
{
displayName: 'Due Date Greater Than',
name: 'dueDateGt',
type: 'dateTime',
default: '',
description: 'Filter due date greater than',
},
{
displayName: 'Due Date Less Than',
name: 'dueDateLt',
type: 'dateTime',
default: '',
description: 'Filter due date less than',
},
{
displayName: 'Include Closed',
name: 'includeClosed',
type: 'boolean',
default: false,
// eslint-disable-next-line n8n-nodes-base/node-param-description-boolean-without-whether
description:
'The response does by default not include closed tasks. Set this to true and dont send a status filter to include closed tasks.',
},
{
displayName: 'Order By',
name: 'orderBy',
type: 'options',
default: '',
options: [
{
name: 'ID',
value: 'id',
},
{
name: 'Created',
value: 'created',
},
{
name: 'Updated',
value: 'updated',
},
{
name: 'Due Date',
value: 'dueDate',
},
],
},
{
displayName: 'Status Names or IDs',
name: 'statuses',
type: 'multiOptions',
description:
'Choose from the list, or specify IDs using an <a href="https://docs.n8n.io/code/expressions/">expression</a>',
typeOptions: {
loadOptionsMethod: 'getStatuses',
loadOptionsDependsOn: ['list'],
},
default: [],
},
{
displayName: 'Subtasks',
name: 'subtasks',
type: 'boolean',
default: false,
description: 'Whether to include subtasks, default false',
},
{
displayName: 'Tag Names or IDs',
name: 'tags',
type: 'multiOptions',
typeOptions: {
loadOptionsMethod: 'getTags',
loadOptionsDependsOn: ['space'],
},
default: [],
description:
'The array of tags applied to this task. Choose from the list, or specify IDs using an <a href="https://docs.n8n.io/code/expressions/">expression</a>.',
},
],
},
/* -------------------------------------------------------------------------- */
/* task:delete */
/* -------------------------------------------------------------------------- */
{
displayName: 'Task ID',
name: 'id',
type: 'string',
default: '',
required: true,
displayOptions: {
show: {
resource: ['task'],
operation: ['delete'],
},
},
},
/* -------------------------------------------------------------------------- */
/* task:member */
/* -------------------------------------------------------------------------- */
{
displayName: 'Task ID',
name: 'id',
type: 'string',
default: '',
required: true,
displayOptions: {
show: {
resource: ['task'],
operation: ['member'],
},
},
},
{
displayName: 'Return All',
name: 'returnAll',
type: 'boolean',
displayOptions: {
show: {
resource: ['task'],
operation: ['member'],
},
},
default: true,
description: 'Whether to return all results 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: 'Max number of results to return',
},
/* -------------------------------------------------------------------------- */
/* task:setCustomField */
/* -------------------------------------------------------------------------- */
{
displayName: 'Task ID',
name: 'task',
type: 'string',
default: '',
required: true,
displayOptions: {
show: {
resource: ['task'],
operation: ['setCustomField'],
},
},
description: 'The ID of the task to add custom field to',
},
{
displayName: 'Field ID',
name: 'field',
type: 'string',
default: '',
required: true,
displayOptions: {
show: {
resource: ['task'],
operation: ['setCustomField'],
},
},
description: 'The ID of the field to add custom field to',
},
{
displayName: 'Value Is JSON',
name: 'jsonParse',
type: 'boolean',
displayOptions: {
show: {
resource: ['task'],
operation: ['setCustomField'],
},
},
default: false,
// eslint-disable-next-line n8n-nodes-base/node-param-description-boolean-without-whether
description:
'The value is JSON and will be parsed as such. Is needed if for example needed for labels which expects the value to be an array.',
},
{
displayName: 'Value',
name: 'value',
type: 'string',
default: '',
required: true,
displayOptions: {
show: {
resource: ['task'],
operation: ['setCustomField'],
},
},
description: 'The value to set on custom field',
},
];
@@ -0,0 +1,19 @@
import type { IDataObject } from 'n8n-workflow';
export interface ITask {
name?: string;
content?: string;
assignees?: string[] | IDataObject;
tags?: string[];
status?: string;
priority?: number;
due_date?: number;
due_date_time?: boolean;
time_estimate?: number;
start_date?: number;
start_date_time?: boolean;
markdown_content?: string;
notify_all?: boolean;
parent?: string;
custom_fields?: IDataObject[];
}
@@ -0,0 +1,62 @@
import type { INodeProperties } from 'n8n-workflow';
export const taskListOperations: INodeProperties[] = [
{
displayName: 'Operation',
name: 'operation',
type: 'options',
noDataExpression: true,
displayOptions: {
show: {
resource: ['taskList'],
},
},
options: [
{
name: 'Add',
value: 'add',
description: 'Add a task to a list',
action: 'Add a task to a list',
},
{
name: 'Remove',
value: 'remove',
description: 'Remove a task from a list',
action: 'Remove a task from a list',
},
],
default: 'add',
},
];
export const taskListFields: INodeProperties[] = [
/* -------------------------------------------------------------------------- */
/* taskList:add */
/* -------------------------------------------------------------------------- */
{
displayName: 'Task ID',
name: 'taskId',
type: 'string',
default: '',
displayOptions: {
show: {
resource: ['taskList'],
operation: ['remove', 'add'],
},
},
required: true,
},
{
displayName: 'List ID',
name: 'listId',
type: 'string',
default: '',
displayOptions: {
show: {
resource: ['taskList'],
operation: ['remove', 'add'],
},
},
required: true,
},
];
@@ -0,0 +1,95 @@
import type { INodeProperties } from 'n8n-workflow';
export const taskTagOperations: INodeProperties[] = [
{
displayName: 'Operation',
name: 'operation',
type: 'options',
noDataExpression: true,
displayOptions: {
show: {
resource: ['taskTag'],
},
},
options: [
{
name: 'Add',
value: 'add',
description: 'Add a tag to a task',
action: 'Add a task tag',
},
{
name: 'Remove',
value: 'remove',
description: 'Remove a tag from a task',
action: 'Remove a task tag',
},
],
default: 'add',
},
];
export const taskTagFields: INodeProperties[] = [
/* -------------------------------------------------------------------------- */
/* taskTag:add */
/* -------------------------------------------------------------------------- */
{
displayName: 'Task ID',
name: 'taskId',
type: 'string',
default: '',
displayOptions: {
show: {
resource: ['taskTag'],
operation: ['remove', 'add'],
},
},
required: true,
},
{
displayName: 'Tag Name',
name: 'tagName',
type: 'string',
default: '',
displayOptions: {
show: {
resource: ['taskTag'],
operation: ['remove', 'add'],
},
},
required: true,
},
{
displayName: 'Additional Fields',
name: 'additionalFields',
type: 'collection',
placeholder: 'Add Field',
default: {},
displayOptions: {
show: {
resource: ['taskTag'],
operation: ['remove', 'add'],
},
},
options: [
{
displayName: 'Custom Task IDs',
name: 'custom_task_ids',
type: 'boolean',
default: false,
description: "Whether to reference a task by it's custom task ID",
},
{
displayName: 'Team Name or ID',
name: 'team_id',
type: 'options',
typeOptions: {
loadOptionsMethod: 'getTeams',
},
default: '',
description:
'Only used when the parameter is set to custom_task_ids=true. Choose from the list, or specify an ID using an <a href="https://docs.n8n.io/code/expressions/">expression</a>.',
},
],
},
];
@@ -0,0 +1,739 @@
import type { INodeProperties } from 'n8n-workflow';
export const timeEntryOperations: INodeProperties[] = [
{
displayName: 'Operation',
name: 'operation',
type: 'options',
noDataExpression: true,
displayOptions: {
show: {
resource: ['timeEntry'],
},
},
options: [
{
name: 'Create',
value: 'create',
description: 'Create a time entry',
action: 'Create a time entry',
},
{
name: 'Delete',
value: 'delete',
description: 'Delete a time entry',
action: 'Delete a time entry',
},
{
name: 'Get',
value: 'get',
description: 'Get a time entry',
action: 'Get a time entry',
},
{
name: 'Get Many',
value: 'getAll',
description: 'Get many time entries',
action: 'Get many time entries',
},
{
name: 'Start',
value: 'start',
description: 'Start a time entry',
action: 'Start a time entry',
},
{
name: 'Stop',
value: 'stop',
description: 'Stop the current running timer',
action: 'Stop a time entry',
},
{
name: 'Update',
value: 'update',
description: 'Update a time Entry',
action: 'Update a time entry',
},
],
default: 'create',
},
];
export const timeEntryFields: INodeProperties[] = [
/* -------------------------------------------------------------------------- */
/* timeEntry:getAll */
/* -------------------------------------------------------------------------- */
{
displayName: 'Team Name or ID',
name: 'team',
type: 'options',
description:
'Choose from the list, or specify an ID using an <a href="https://docs.n8n.io/code/expressions/">expression</a>',
default: '',
displayOptions: {
show: {
resource: ['timeEntry'],
operation: ['getAll'],
},
},
typeOptions: {
loadOptionsMethod: 'getTeams',
},
required: true,
},
{
displayName: 'Return All',
name: 'returnAll',
type: 'boolean',
displayOptions: {
show: {
resource: ['timeEntry'],
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: ['timeEntry'],
operation: ['getAll'],
returnAll: [false],
},
},
typeOptions: {
minValue: 1,
maxValue: 10,
},
default: 5,
description: 'Max number of results to return',
},
{
displayName: 'Filters',
name: 'filters',
type: 'collection',
placeholder: 'Add Field',
default: {},
displayOptions: {
show: {
resource: ['timeEntry'],
operation: ['getAll'],
},
},
options: [
{
displayName: 'End Date',
name: 'end_date',
type: 'dateTime',
default: '',
},
{
displayName: 'Start Date',
name: 'start_date',
type: 'dateTime',
default: '',
},
],
},
/* -------------------------------------------------------------------------- */
/* timeEntry:get */
/* -------------------------------------------------------------------------- */
{
displayName: 'Team Name or ID',
name: 'team',
type: 'options',
description:
'Choose from the list, or specify an ID using an <a href="https://docs.n8n.io/code/expressions/">expression</a>',
default: '',
displayOptions: {
show: {
resource: ['timeEntry'],
operation: ['get'],
},
},
typeOptions: {
loadOptionsMethod: 'getTeams',
},
required: true,
},
{
displayName: 'Running',
name: 'running',
type: 'boolean',
displayOptions: {
show: {
resource: ['timeEntry'],
operation: ['get'],
},
},
default: false,
description: 'Whether to return just the current running time entry',
},
{
displayName: 'Time Entry ID',
name: 'timeEntry',
type: 'string',
default: '',
displayOptions: {
show: {
resource: ['timeEntry'],
operation: ['get'],
running: [false],
},
},
required: true,
},
/* -------------------------------------------------------------------------- */
/* timeEntry:create */
/* -------------------------------------------------------------------------- */
{
displayName: 'Team Name or ID',
name: 'team',
type: 'options',
description:
'Choose from the list, or specify an ID using an <a href="https://docs.n8n.io/code/expressions/">expression</a>',
default: '',
displayOptions: {
show: {
resource: ['timeEntry'],
operation: ['create'],
},
},
typeOptions: {
loadOptionsMethod: 'getTeams',
},
required: true,
},
{
displayName: 'Space Name or ID',
name: 'space',
type: 'options',
description:
'Choose from the list, or specify an ID using an <a href="https://docs.n8n.io/code/expressions/">expression</a>',
default: '',
displayOptions: {
show: {
resource: ['timeEntry'],
operation: ['create'],
},
},
typeOptions: {
loadOptionsMethod: 'getSpaces',
loadOptionsDependsOn: ['team'],
},
required: true,
},
{
displayName: 'Folderless List',
name: 'folderless',
type: 'boolean',
default: false,
displayOptions: {
show: {
resource: ['timeEntry'],
operation: ['create'],
},
},
required: true,
},
{
displayName: 'Folder Name or ID',
name: 'folder',
type: 'options',
description:
'Choose from the list, or specify an ID using an <a href="https://docs.n8n.io/code/expressions/">expression</a>',
default: '',
displayOptions: {
show: {
resource: ['timeEntry'],
operation: ['create'],
folderless: [false],
},
},
typeOptions: {
loadOptionsMethod: 'getFolders',
loadOptionsDependsOn: ['space'],
},
required: true,
},
{
displayName: 'List Name or ID',
name: 'list',
type: 'options',
description:
'Choose from the list, or specify an ID using an <a href="https://docs.n8n.io/code/expressions/">expression</a>',
default: '',
displayOptions: {
show: {
resource: ['timeEntry'],
operation: ['create'],
folderless: [true],
},
},
typeOptions: {
loadOptionsMethod: 'getFolderlessLists',
loadOptionsDependsOn: ['space'],
},
required: true,
},
{
displayName: 'List Name or ID',
name: 'list',
type: 'options',
description:
'Choose from the list, or specify an ID using an <a href="https://docs.n8n.io/code/expressions/">expression</a>',
default: '',
displayOptions: {
show: {
resource: ['timeEntry'],
operation: ['create'],
folderless: [false],
},
},
typeOptions: {
loadOptionsMethod: 'getLists',
loadOptionsDependsOn: ['folder'],
},
required: true,
},
{
displayName: 'Start',
name: 'start',
type: 'dateTime',
displayOptions: {
show: {
resource: ['timeEntry'],
operation: ['create'],
},
},
required: true,
default: '',
},
{
displayName: 'Duration (Minutes)',
name: 'duration',
type: 'number',
displayOptions: {
show: {
resource: ['timeEntry'],
operation: ['create'],
},
},
default: 0,
required: true,
description: 'Duration in minutes',
},
{
displayName: 'Task Name or ID',
name: 'task',
type: 'options',
description:
'Choose from the list, or specify an ID using an <a href="https://docs.n8n.io/code/expressions/">expression</a>',
displayOptions: {
show: {
resource: ['timeEntry'],
operation: ['create'],
},
},
typeOptions: {
loadOptionsMethod: 'getTasks',
loadOptionsDependsOn: ['list'],
},
default: '',
},
{
displayName: 'Additional Fields',
name: 'additionalFields',
type: 'collection',
placeholder: 'Add Field',
default: {},
displayOptions: {
show: {
resource: ['timeEntry'],
operation: ['create'],
},
},
options: [
{
displayName: 'Assignee Name or ID',
name: 'assignee',
type: 'options',
description:
'Choose from the list, or specify an ID using an <a href="https://docs.n8n.io/code/expressions/">expression</a>',
typeOptions: {
loadOptionsMethod: 'getAssignees',
loadOptionsDependsOn: ['list'],
},
default: [],
},
{
displayName: 'Billable',
name: 'billable',
type: 'boolean',
default: true,
},
{
displayName: 'Description',
name: 'description',
type: 'string',
default: '',
description: 'Description of the time entry',
},
{
displayName: 'Tag Names or IDs',
name: 'tags',
type: 'multiOptions',
description:
'Choose from the list, or specify IDs using an <a href="https://docs.n8n.io/code/expressions/">expression</a>',
typeOptions: {
loadOptionsDependsOn: ['team'],
loadOptionsMethod: 'getTimeEntryTags',
},
default: [],
},
],
},
/* -------------------------------------------------------------------------- */
/* timeEntry:start */
/* -------------------------------------------------------------------------- */
{
displayName: 'Team Name or ID',
name: 'team',
type: 'options',
description:
'Choose from the list, or specify an ID using an <a href="https://docs.n8n.io/code/expressions/">expression</a>',
default: '',
displayOptions: {
show: {
resource: ['timeEntry'],
operation: ['start'],
},
},
typeOptions: {
loadOptionsMethod: 'getTeams',
},
required: true,
},
{
displayName: 'Task ID',
name: 'task',
type: 'string',
default: '',
displayOptions: {
show: {
resource: ['timeEntry'],
operation: ['start'],
},
},
required: true,
},
{
displayName: 'Additional Fields',
name: 'additionalFields',
type: 'collection',
placeholder: 'Add Field',
default: {},
displayOptions: {
show: {
resource: ['timeEntry'],
operation: ['start'],
},
},
options: [
{
displayName: 'Billable',
name: 'billable',
type: 'boolean',
default: true,
},
{
displayName: 'Description',
name: 'description',
type: 'string',
default: '',
description: 'Description of the time entry',
},
],
},
/* -------------------------------------------------------------------------- */
/* timeEntry:stop */
/* -------------------------------------------------------------------------- */
{
displayName: 'Team Name or ID',
name: 'team',
type: 'options',
description:
'Choose from the list, or specify an ID using an <a href="https://docs.n8n.io/code/expressions/">expression</a>',
default: '',
displayOptions: {
show: {
resource: ['timeEntry'],
operation: ['stop'],
},
},
typeOptions: {
loadOptionsMethod: 'getTeams',
},
required: true,
},
/* -------------------------------------------------------------------------- */
/* timeEntry:delete */
/* -------------------------------------------------------------------------- */
{
displayName: 'Team Name or ID',
name: 'team',
type: 'options',
description:
'Choose from the list, or specify an ID using an <a href="https://docs.n8n.io/code/expressions/">expression</a>',
default: '',
displayOptions: {
show: {
resource: ['timeEntry'],
operation: ['delete'],
},
},
typeOptions: {
loadOptionsMethod: 'getTeams',
},
required: true,
},
{
displayName: 'Time Entry ID',
name: 'timeEntry',
type: 'string',
default: '',
displayOptions: {
show: {
resource: ['timeEntry'],
operation: ['delete'],
},
},
required: true,
},
/* -------------------------------------------------------------------------- */
/* timeEntry:update */
/* -------------------------------------------------------------------------- */
{
displayName: 'Team Name or ID',
name: 'team',
type: 'options',
description:
'Choose from the list, or specify an ID using an <a href="https://docs.n8n.io/code/expressions/">expression</a>',
default: '',
displayOptions: {
show: {
resource: ['timeEntry'],
operation: ['update'],
},
},
typeOptions: {
loadOptionsMethod: 'getTeams',
},
required: true,
},
{
displayName: 'Space Name or ID',
name: 'space',
type: 'options',
description:
'Choose from the list, or specify an ID using an <a href="https://docs.n8n.io/code/expressions/">expression</a>',
default: '',
displayOptions: {
show: {
resource: ['timeEntry'],
operation: ['update'],
},
},
typeOptions: {
loadOptionsMethod: 'getSpaces',
loadOptionsDependsOn: ['team'],
},
required: true,
},
{
displayName: 'Folderless List',
name: 'folderless',
type: 'boolean',
default: false,
displayOptions: {
show: {
resource: ['timeEntry'],
operation: ['update'],
},
},
required: true,
},
{
displayName: 'Folder Name or ID',
name: 'folder',
type: 'options',
description:
'Choose from the list, or specify an ID using an <a href="https://docs.n8n.io/code/expressions/">expression</a>',
default: '',
displayOptions: {
show: {
resource: ['timeEntry'],
operation: ['update'],
folderless: [false],
},
},
typeOptions: {
loadOptionsMethod: 'getFolders',
loadOptionsDependsOn: ['space'],
},
required: true,
},
{
displayName: 'List Name or ID',
name: 'list',
type: 'options',
description:
'Choose from the list, or specify an ID using an <a href="https://docs.n8n.io/code/expressions/">expression</a>',
default: '',
displayOptions: {
show: {
resource: ['timeEntry'],
operation: ['update'],
folderless: [true],
},
},
typeOptions: {
loadOptionsMethod: 'getFolderlessLists',
loadOptionsDependsOn: ['space'],
},
required: true,
},
{
displayName: 'List Name or ID',
name: 'list',
type: 'options',
description:
'Choose from the list, or specify an ID using an <a href="https://docs.n8n.io/code/expressions/">expression</a>',
default: '',
displayOptions: {
show: {
resource: ['timeEntry'],
operation: ['update'],
folderless: [false],
},
},
typeOptions: {
loadOptionsMethod: 'getLists',
loadOptionsDependsOn: ['folder'],
},
required: true,
},
{
displayName: 'Archived',
name: 'archived',
type: 'boolean',
default: false,
displayOptions: {
show: {
resource: ['timeEntry'],
operation: ['update'],
},
},
required: true,
},
{
displayName: 'Time Entry ID',
name: 'timeEntry',
type: 'string',
default: '',
displayOptions: {
show: {
resource: ['timeEntry'],
operation: ['update'],
},
},
required: true,
},
{
displayName: 'Update Fields',
name: 'updateFields',
type: 'collection',
placeholder: 'Add Field',
default: {},
displayOptions: {
show: {
resource: ['timeEntry'],
operation: ['update'],
},
},
options: [
{
displayName: 'Assignee Name or ID',
name: 'assignee',
type: 'options',
description:
'Choose from the list, or specify an ID using an <a href="https://docs.n8n.io/code/expressions/">expression</a>',
typeOptions: {
loadOptionsMethod: 'getAssignees',
loadOptionsDependsOn: ['list'],
},
default: [],
},
{
displayName: 'Billable',
name: 'billable',
type: 'boolean',
default: true,
},
{
displayName: 'Description',
name: 'description',
type: 'string',
default: '',
description: 'Description of the time entry',
},
{
displayName: 'Duration (Minutes)',
name: 'duration',
type: 'number',
default: 0,
description: 'Duration in minutes',
},
{
displayName: 'Start',
name: 'start',
type: 'dateTime',
default: '',
},
{
displayName: 'Tag Names or IDs',
name: 'tags',
type: 'multiOptions',
description:
'Choose from the list, or specify IDs using an <a href="https://docs.n8n.io/code/expressions/">expression</a>',
typeOptions: {
loadOptionsDependsOn: ['spaceId'],
loadOptionsMethod: 'getTags',
},
default: [],
},
{
displayName: 'Task Name or ID',
name: 'task',
type: 'options',
description:
'Choose from the list, or specify an ID using an <a href="https://docs.n8n.io/code/expressions/">expression</a>',
typeOptions: {
loadOptionsMethod: 'getTasks',
loadOptionsDependsOn: ['archived', 'list'],
},
default: '',
},
],
},
];
@@ -0,0 +1,222 @@
import type { INodeProperties } from 'n8n-workflow';
export const timeEntryTagOperations: INodeProperties[] = [
{
displayName: 'Operation',
name: 'operation',
type: 'options',
noDataExpression: true,
displayOptions: {
show: {
resource: ['timeEntryTag'],
},
},
options: [
{
name: 'Add',
value: 'add',
description: 'Add tag to time entry',
action: 'Add a time entry tag',
},
{
name: 'Get Many',
value: 'getAll',
description: 'Get many time entry tags',
action: 'Get many time entry tags',
},
{
name: 'Remove',
value: 'remove',
description: 'Remove tag from time entry',
action: 'Remove a time entry tag',
},
],
default: 'add',
},
];
export const timeEntryTagFields: INodeProperties[] = [
/* -------------------------------------------------------------------------- */
/* timeEntryTag:getAll */
/* -------------------------------------------------------------------------- */
{
displayName: 'Team Name or ID',
name: 'team',
type: 'options',
description:
'Choose from the list, or specify an ID using an <a href="https://docs.n8n.io/code/expressions/">expression</a>',
default: '',
displayOptions: {
show: {
resource: ['timeEntryTag'],
operation: ['getAll'],
},
},
typeOptions: {
loadOptionsMethod: 'getTeams',
},
required: true,
},
{
displayName: 'Return All',
name: 'returnAll',
type: 'boolean',
displayOptions: {
show: {
resource: ['timeEntryTag'],
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: ['timeEntryTag'],
operation: ['getAll'],
returnAll: [false],
},
},
typeOptions: {
minValue: 1,
maxValue: 10,
},
default: 5,
description: 'Max number of results to return',
},
/* -------------------------------------------------------------------------- */
/* timeEntryTag:add */
/* -------------------------------------------------------------------------- */
{
displayName: 'Team Name or ID',
name: 'team',
type: 'options',
description:
'Choose from the list, or specify an ID using an <a href="https://docs.n8n.io/code/expressions/">expression</a>',
default: '',
displayOptions: {
show: {
resource: ['timeEntryTag'],
operation: ['add'],
},
},
typeOptions: {
loadOptionsMethod: 'getTeams',
},
required: true,
},
{
displayName: 'Time Entry IDs',
name: 'timeEntryIds',
type: 'string',
default: '',
displayOptions: {
show: {
resource: ['timeEntryTag'],
operation: ['add'],
},
},
required: true,
},
{
displayName: 'Tags',
name: 'tagsUi',
type: 'fixedCollection',
placeholder: 'Add Tag',
typeOptions: {
multipleValues: true,
},
default: {},
displayOptions: {
show: {
resource: ['timeEntryTag'],
operation: ['add'],
},
},
options: [
{
displayName: 'Tag',
name: 'tagsValues',
values: [
{
displayName: 'Name',
name: 'name',
type: 'string',
default: '',
},
{
displayName: 'Background Color',
name: 'tag_bg',
type: 'color',
default: '#ff0000',
},
{
displayName: 'Foreground Color',
name: 'tag_fg',
type: 'color',
default: '#ff0000',
},
],
},
],
},
/* -------------------------------------------------------------------------- */
/* timeEntryTag:remove */
/* -------------------------------------------------------------------------- */
{
displayName: 'Team Name or ID',
name: 'team',
type: 'options',
description:
'Choose from the list, or specify an ID using an <a href="https://docs.n8n.io/code/expressions/">expression</a>',
default: '',
displayOptions: {
show: {
resource: ['timeEntryTag'],
operation: ['remove'],
},
},
typeOptions: {
loadOptionsMethod: 'getTeams',
},
required: true,
},
{
displayName: 'Time Entry IDs',
name: 'timeEntryIds',
type: 'string',
default: '',
displayOptions: {
show: {
resource: ['timeEntryTag'],
operation: ['remove'],
},
},
required: true,
},
{
displayName: 'Tag Names or IDs',
name: 'tagNames',
type: 'multiOptions',
description:
'Choose from the list, or specify IDs using an <a href="https://docs.n8n.io/code/expressions/">expression</a>',
typeOptions: {
loadOptionsMethod: 'getTimeEntryTags',
loadOptionsDependsOn: ['teamId'],
},
default: [],
displayOptions: {
show: {
resource: ['timeEntryTag'],
operation: ['remove'],
},
},
required: true,
},
];
@@ -0,0 +1,24 @@
{
"type": "object",
"properties": {
"id": {
"type": "string"
},
"name": {
"type": "string"
},
"orderindex": {
"type": "integer"
},
"resolved": {
"type": "integer"
},
"task_id": {
"type": "string"
},
"unresolved": {
"type": "integer"
}
},
"version": 1
}
@@ -0,0 +1,71 @@
{
"type": "object",
"properties": {
"creator": {
"type": "integer"
},
"date_created": {
"type": "string"
},
"id": {
"type": "string"
},
"items": {
"type": "array",
"items": {
"type": "object",
"properties": {
"assignee": {
"type": "null"
},
"date_created": {
"type": "string"
},
"due_date": {
"type": "null"
},
"due_date_time": {
"type": "boolean"
},
"group_assignee": {
"type": "null"
},
"id": {
"type": "string"
},
"parent": {
"type": "null"
},
"resolved": {
"type": "boolean"
},
"sent_due_date_notif": {
"type": "null"
},
"start_date": {
"type": "null"
},
"start_date_time": {
"type": "boolean"
}
}
}
},
"name": {
"type": "string"
},
"orderindex": {
"type": "integer"
},
"resolved": {
"type": "integer"
},
"task_id": {
"type": "string"
},
"unresolved": {
"type": "integer"
}
},
"version": 1
}
@@ -0,0 +1,111 @@
{
"type": "object",
"properties": {
"date": {
"type": "integer"
},
"hist_id": {
"type": "string"
},
"id": {
"type": "integer"
},
"version": {
"type": "object",
"properties": {
"data": {
"type": "object",
"properties": {
"changes": {
"type": "array",
"items": {
"type": "object",
"properties": {
"after": {
"type": "integer"
},
"field": {
"type": "string"
}
}
}
},
"context": {
"type": "object",
"properties": {
"audit_context": {
"type": "object",
"properties": {
"current_time": {
"type": "integer"
},
"route": {
"type": "string"
},
"userid": {
"type": "integer"
}
}
},
"originating_service": {
"type": "string"
}
}
},
"relationships": {
"type": "array",
"items": {
"type": "object",
"properties": {
"object_type": {
"type": "string"
},
"type": {
"type": "string"
},
"workspace_id": {
"type": "string"
}
}
}
}
}
},
"date_created": {
"type": "integer"
},
"date_updated": {
"type": "integer"
},
"deleted": {
"type": "boolean"
},
"event_publish_time": {
"type": "integer"
},
"master_id": {
"type": "integer"
},
"object_id": {
"type": "string"
},
"object_type": {
"type": "string"
},
"operation": {
"type": "string"
},
"traceparent": {
"type": "string"
},
"version": {
"type": "integer"
},
"workspace_id": {
"type": "integer"
}
}
}
},
"version": 1
}
@@ -0,0 +1,88 @@
{
"type": "object",
"properties": {
"comment": {
"type": "array",
"items": {
"type": "object",
"properties": {
"attributes": {
"type": "object",
"properties": {
"block-id": {
"type": "string"
}
}
},
"text": {
"type": "string"
}
}
}
},
"comment_text": {
"type": "string"
},
"date": {
"type": "string"
},
"group_assignee": {
"type": "null"
},
"id": {
"type": "string"
},
"reactions": {
"type": "array",
"items": {
"type": "object",
"properties": {
"date": {
"type": "string"
},
"reaction": {
"type": "string"
},
"user": {
"type": "object",
"properties": {
"email": {
"type": "string"
},
"id": {
"type": "integer"
},
"initials": {
"type": "string"
},
"username": {
"type": "string"
}
}
}
}
}
},
"reply_count": {
"type": "integer"
},
"user": {
"type": "object",
"properties": {
"email": {
"type": "string"
},
"id": {
"type": "integer"
},
"initials": {
"type": "string"
},
"username": {
"type": "string"
}
}
}
},
"version": 1
}
@@ -0,0 +1,120 @@
{
"type": "object",
"properties": {
"archived": {
"type": "boolean"
},
"deleted": {
"type": "boolean"
},
"hidden": {
"type": "boolean"
},
"id": {
"type": "string"
},
"lists": {
"type": "array",
"items": {
"type": "object",
"properties": {
"archived": {
"type": "boolean"
},
"assignee": {
"type": "null"
},
"content": {
"type": "string"
},
"due_date": {
"type": "null"
},
"id": {
"type": "string"
},
"name": {
"type": "string"
},
"orderindex": {
"type": "integer"
},
"override_statuses": {
"type": "boolean"
},
"permission_level": {
"type": "string"
},
"priority": {
"type": "null"
},
"start_date": {
"type": "null"
},
"status": {
"type": "null"
},
"statuses": {
"type": "array",
"items": {
"type": "object",
"properties": {
"color": {
"type": "string"
},
"id": {
"type": "string"
},
"orderindex": {
"type": "integer"
},
"status": {
"type": "string"
},
"status_group": {
"type": "string"
},
"type": {
"type": "string"
}
}
}
},
"task_count": {
"type": "integer"
}
}
}
},
"name": {
"type": "string"
},
"orderindex": {
"type": "integer"
},
"override_statuses": {
"type": "boolean"
},
"permission_level": {
"type": "string"
},
"space": {
"type": "object",
"properties": {
"access": {
"type": "boolean"
},
"id": {
"type": "string"
},
"name": {
"type": "string"
}
}
},
"task_count": {
"type": "string"
}
},
"version": 3
}
@@ -0,0 +1,122 @@
{
"type": "object",
"properties": {
"archived": {
"type": "boolean"
},
"hidden": {
"type": "boolean"
},
"id": {
"type": "string"
},
"lists": {
"type": "array",
"items": {
"type": "object",
"properties": {
"archived": {
"type": "boolean"
},
"content": {
"type": "string"
},
"id": {
"type": "string"
},
"name": {
"type": "string"
},
"orderindex": {
"type": "integer"
},
"permission_level": {
"type": "string"
},
"statuses": {
"type": "array",
"items": {
"type": "object",
"properties": {
"color": {
"type": "string"
},
"id": {
"type": "string"
},
"orderindex": {
"type": "integer"
},
"status": {
"type": "string"
},
"status_group": {
"type": "string"
},
"type": {
"type": "string"
}
}
}
},
"task_count": {
"type": "integer"
}
}
}
},
"name": {
"type": "string"
},
"orderindex": {
"type": "integer"
},
"override_statuses": {
"type": "boolean"
},
"permission_level": {
"type": "string"
},
"space": {
"type": "object",
"properties": {
"access": {
"type": "boolean"
},
"id": {
"type": "string"
},
"name": {
"type": "string"
}
}
},
"statuses": {
"type": "array",
"items": {
"type": "object",
"properties": {
"color": {
"type": "string"
},
"id": {
"type": "string"
},
"orderindex": {
"type": "integer"
},
"status": {
"type": "string"
},
"type": {
"type": "string"
}
}
}
},
"task_count": {
"type": "string"
}
},
"version": 1
}
@@ -0,0 +1,127 @@
{
"type": "object",
"properties": {
"archived": {
"type": "boolean"
},
"hidden": {
"type": "boolean"
},
"id": {
"type": "string"
},
"lists": {
"type": "array",
"items": {
"type": "object",
"properties": {
"archived": {
"type": "boolean"
},
"content": {
"type": "string"
},
"id": {
"type": "string"
},
"name": {
"type": "string"
},
"orderindex": {
"type": "integer"
},
"permission_level": {
"type": "string"
},
"space": {
"type": "object",
"properties": {
"access": {
"type": "boolean"
},
"id": {
"type": "string"
},
"name": {
"type": "string"
}
}
},
"statuses": {
"type": "array",
"items": {
"type": "object",
"properties": {
"color": {
"type": "string"
},
"id": {
"type": "string"
},
"orderindex": {
"type": "integer"
},
"status": {
"type": "string"
},
"status_group": {
"type": "string"
},
"type": {
"type": "string"
}
}
}
},
"task_count": {
"type": "integer"
}
}
}
},
"name": {
"type": "string"
},
"permission_level": {
"type": "string"
},
"space": {
"type": "object",
"properties": {
"id": {
"type": "string"
},
"name": {
"type": "string"
}
}
},
"statuses": {
"type": "array",
"items": {
"type": "object",
"properties": {
"color": {
"type": "string"
},
"id": {
"type": "string"
},
"orderindex": {
"type": "integer"
},
"status": {
"type": "string"
},
"type": {
"type": "string"
}
}
}
},
"task_count": {
"type": "string"
}
},
"version": 1
}
@@ -0,0 +1,96 @@
{
"type": "object",
"properties": {
"archived": {
"type": "boolean"
},
"assignee": {
"type": "null"
},
"content": {
"type": "string"
},
"deleted": {
"type": "boolean"
},
"folder": {
"type": "object",
"properties": {
"access": {
"type": "boolean"
},
"hidden": {
"type": "boolean"
},
"id": {
"type": "string"
},
"name": {
"type": "string"
}
}
},
"id": {
"type": "string"
},
"inbound_address": {
"type": "string"
},
"name": {
"type": "string"
},
"orderindex": {
"type": "integer"
},
"override_statuses": {
"type": "boolean"
},
"permission_level": {
"type": "string"
},
"space": {
"type": "object",
"properties": {
"access": {
"type": "boolean"
},
"id": {
"type": "string"
},
"name": {
"type": "string"
}
}
},
"start_date": {
"type": "null"
},
"statuses": {
"type": "array",
"items": {
"type": "object",
"properties": {
"color": {
"type": "string"
},
"id": {
"type": "string"
},
"orderindex": {
"type": "integer"
},
"status": {
"type": "string"
},
"status_group": {
"type": "string"
},
"type": {
"type": "string"
}
}
}
}
},
"version": 1
}
@@ -0,0 +1,43 @@
{
"type": "object",
"properties": {
"date_created": {
"type": "string"
},
"hide_from_guests": {
"type": "boolean"
},
"id": {
"type": "string"
},
"name": {
"type": "string"
},
"type": {
"type": "string"
},
"type_config": {
"type": "object",
"properties": {
"options": {
"type": "array",
"items": {
"type": "object",
"properties": {
"id": {
"type": "string"
},
"name": {
"type": "string"
},
"orderindex": {
"type": "integer"
}
}
}
}
}
}
},
"version": 5
}
@@ -0,0 +1,87 @@
{
"type": "object",
"properties": {
"archived": {
"type": "boolean"
},
"content": {
"type": "string"
},
"deleted": {
"type": "boolean"
},
"folder": {
"type": "object",
"properties": {
"access": {
"type": "boolean"
},
"hidden": {
"type": "boolean"
},
"id": {
"type": "string"
},
"name": {
"type": "string"
}
}
},
"id": {
"type": "string"
},
"inbound_address": {
"type": "string"
},
"name": {
"type": "string"
},
"permission_level": {
"type": "string"
},
"priority": {
"type": "null"
},
"space": {
"type": "object",
"properties": {
"access": {
"type": "boolean"
},
"id": {
"type": "string"
},
"name": {
"type": "string"
}
}
},
"statuses": {
"type": "array",
"items": {
"type": "object",
"properties": {
"color": {
"type": "string"
},
"id": {
"type": "string"
},
"orderindex": {
"type": "integer"
},
"status": {
"type": "string"
},
"status_group": {
"type": "string"
},
"type": {
"type": "string"
}
}
}
}
},
"version": 1
}
@@ -0,0 +1,52 @@
{
"type": "object",
"properties": {
"archived": {
"type": "boolean"
},
"content": {
"type": "string"
},
"folder": {
"type": "object",
"properties": {
"access": {
"type": "boolean"
},
"id": {
"type": "string"
},
"name": {
"type": "string"
}
}
},
"id": {
"type": "string"
},
"name": {
"type": "string"
},
"permission_level": {
"type": "string"
},
"space": {
"type": "object",
"properties": {
"access": {
"type": "boolean"
},
"id": {
"type": "string"
},
"name": {
"type": "string"
}
}
},
"task_count": {
"type": "integer"
}
},
"version": 1
}
@@ -0,0 +1,26 @@
{
"type": "object",
"properties": {
"email": {
"type": "string"
},
"id": {
"type": "integer"
},
"initials": {
"type": "string"
},
"profileInfo": {
"type": "object",
"properties": {
"verified_consultant": {
"type": "null"
},
"viewed_verified_consultant": {
"type": "null"
}
}
}
},
"version": 1
}
@@ -0,0 +1,275 @@
{
"type": "object",
"properties": {
"archived": {
"type": "boolean"
},
"assignees": {
"type": "array",
"items": {
"type": "object",
"properties": {
"email": {
"type": "string"
},
"id": {
"type": "integer"
},
"initials": {
"type": "string"
},
"username": {
"type": "string"
}
}
}
},
"creator": {
"type": "object",
"properties": {
"email": {
"type": "string"
},
"id": {
"type": "integer"
},
"username": {
"type": "string"
}
}
},
"custom_fields": {
"type": "array",
"items": {
"type": "object",
"properties": {
"date_created": {
"type": "string"
},
"hide_from_guests": {
"type": "boolean"
},
"id": {
"type": "string"
},
"name": {
"type": "string"
},
"type": {
"type": "string"
},
"type_config": {
"type": "object",
"properties": {
"new_drop_down": {
"type": "boolean"
},
"options": {
"type": "array",
"items": {
"type": "object",
"properties": {
"id": {
"type": "string"
},
"name": {
"type": "string"
},
"orderindex": {
"type": "integer"
}
}
}
},
"sorting": {
"type": "string"
}
}
}
}
}
},
"custom_id": {
"type": "null"
},
"custom_item_id": {
"type": "integer"
},
"date_created": {
"type": "string"
},
"date_updated": {
"type": "string"
},
"description": {
"type": "string"
},
"folder": {
"type": "object",
"properties": {
"access": {
"type": "boolean"
},
"hidden": {
"type": "boolean"
},
"id": {
"type": "string"
},
"name": {
"type": "string"
}
}
},
"id": {
"type": "string"
},
"list": {
"type": "object",
"properties": {
"access": {
"type": "boolean"
},
"id": {
"type": "string"
},
"name": {
"type": "string"
}
}
},
"name": {
"type": "string"
},
"orderindex": {
"type": "string"
},
"permission_level": {
"type": "string"
},
"points": {
"type": "null"
},
"project": {
"type": "object",
"properties": {
"access": {
"type": "boolean"
},
"hidden": {
"type": "boolean"
},
"id": {
"type": "string"
},
"name": {
"type": "string"
}
}
},
"sharing": {
"type": "object",
"properties": {
"public": {
"type": "boolean"
},
"public_fields": {
"type": "array",
"items": {
"type": "string"
}
},
"public_share_expires_on": {
"type": "null"
},
"seo_optimized": {
"type": "boolean"
},
"token": {
"type": "null"
}
}
},
"space": {
"type": "object",
"properties": {
"id": {
"type": "string"
}
}
},
"status": {
"type": "object",
"properties": {
"color": {
"type": "string"
},
"id": {
"type": "string"
},
"orderindex": {
"type": "integer"
},
"status": {
"type": "string"
},
"type": {
"type": "string"
}
}
},
"tags": {
"type": "array",
"items": {
"type": "object",
"properties": {
"creator": {
"type": "integer"
},
"name": {
"type": "string"
},
"tag_bg": {
"type": "string"
},
"tag_fg": {
"type": "string"
}
}
}
},
"team_id": {
"type": "string"
},
"text_content": {
"type": "string"
},
"time_spent": {
"type": "integer"
},
"url": {
"type": "string"
},
"watchers": {
"type": "array",
"items": {
"type": "object",
"properties": {
"email": {
"type": "string"
},
"id": {
"type": "integer"
},
"initials": {
"type": "string"
},
"username": {
"type": "string"
}
}
}
}
},
"version": 3
}
@@ -0,0 +1,9 @@
{
"type": "object",
"properties": {
"success": {
"type": "boolean"
}
},
"version": 1
}
@@ -0,0 +1,441 @@
{
"type": "object",
"properties": {
"archived": {
"type": "boolean"
},
"assignees": {
"type": "array",
"items": {
"type": "object",
"properties": {
"color": {
"type": "string"
},
"email": {
"type": "string"
},
"id": {
"type": "integer"
},
"initials": {
"type": "string"
},
"username": {
"type": "string"
}
}
}
},
"attachments": {
"type": "array",
"items": {
"type": "object",
"properties": {
"date": {
"type": "string"
},
"deleted": {
"type": "boolean"
},
"email_data": {
"type": "null"
},
"extension": {
"type": "string"
},
"hidden": {
"type": "boolean"
},
"id": {
"type": "string"
},
"is_folder": {
"type": "null"
},
"mimetype": {
"type": "string"
},
"orientation": {
"type": "null"
},
"parent_id": {
"type": "string"
},
"resolved_comments": {
"type": "integer"
},
"size": {
"type": "integer"
},
"source": {
"type": "integer"
},
"title": {
"type": "string"
},
"total_comments": {
"type": "integer"
},
"type": {
"type": "integer"
},
"url": {
"type": "string"
},
"url_w_host": {
"type": "string"
},
"url_w_query": {
"type": "string"
},
"user": {
"type": "object",
"properties": {
"color": {
"type": "string"
},
"email": {
"type": "string"
},
"id": {
"type": "integer"
},
"initials": {
"type": "string"
},
"username": {
"type": "string"
}
}
},
"version": {
"type": "integer"
},
"workspace_id": {
"type": "null"
}
}
}
},
"creator": {
"type": "object",
"properties": {
"color": {
"type": "string"
},
"email": {
"type": "string"
},
"id": {
"type": "integer"
},
"username": {
"type": "string"
}
}
},
"custom_fields": {
"type": "array",
"items": {
"type": "object",
"properties": {
"date_created": {
"type": "string"
},
"hide_from_guests": {
"type": "boolean"
},
"id": {
"type": "string"
},
"name": {
"type": "string"
},
"type": {
"type": "string"
},
"type_config": {
"type": "object",
"properties": {
"field_inverted_name": {
"type": "string"
},
"fields": {
"type": "array",
"items": {
"type": "object",
"properties": {
"field": {
"type": "string"
},
"hidden": {
"type": "boolean"
},
"name": {
"type": "string"
},
"width": {
"type": "integer"
}
}
}
},
"linked_subcategory_access": {
"type": "boolean"
},
"options": {
"type": "array",
"items": {
"type": "object",
"properties": {
"id": {
"type": "string"
},
"name": {
"type": "string"
},
"orderindex": {
"type": "integer"
}
}
}
},
"subcategory_id": {
"type": "string"
},
"subcategory_inverted_name": {
"type": "string"
}
}
}
}
}
},
"custom_item_id": {
"type": "integer"
},
"date_created": {
"type": "string"
},
"date_updated": {
"type": "string"
},
"dependencies": {
"type": "array",
"items": {
"type": "object",
"properties": {
"chain_id": {
"type": "null"
},
"date_created": {
"type": "string"
},
"depends_on": {
"type": "string"
},
"task_id": {
"type": "string"
},
"type": {
"type": "integer"
},
"userid": {
"type": "string"
},
"workspace_id": {
"type": "string"
}
}
}
},
"folder": {
"type": "object",
"properties": {
"access": {
"type": "boolean"
},
"hidden": {
"type": "boolean"
},
"id": {
"type": "string"
},
"name": {
"type": "string"
}
}
},
"id": {
"type": "string"
},
"linked_tasks": {
"type": "array",
"items": {
"type": "object",
"properties": {
"date_created": {
"type": "string"
},
"link_id": {
"type": "string"
},
"task_id": {
"type": "string"
},
"userid": {
"type": "string"
},
"workspace_id": {
"type": "string"
}
}
}
},
"list": {
"type": "object",
"properties": {
"access": {
"type": "boolean"
},
"id": {
"type": "string"
},
"name": {
"type": "string"
}
}
},
"name": {
"type": "string"
},
"orderindex": {
"type": "string"
},
"permission_level": {
"type": "string"
},
"points": {
"type": "null"
},
"project": {
"type": "object",
"properties": {
"access": {
"type": "boolean"
},
"hidden": {
"type": "boolean"
},
"id": {
"type": "string"
},
"name": {
"type": "string"
}
}
},
"sharing": {
"type": "object",
"properties": {
"public": {
"type": "boolean"
},
"public_fields": {
"type": "array",
"items": {
"type": "string"
}
},
"public_share_expires_on": {
"type": "null"
},
"seo_optimized": {
"type": "boolean"
},
"token": {
"type": "null"
}
}
},
"space": {
"type": "object",
"properties": {
"id": {
"type": "string"
}
}
},
"status": {
"type": "object",
"properties": {
"color": {
"type": "string"
},
"id": {
"type": "string"
},
"orderindex": {
"type": "integer"
},
"status": {
"type": "string"
},
"type": {
"type": "string"
}
}
},
"tags": {
"type": "array",
"items": {
"type": "object",
"properties": {
"creator": {
"type": "integer"
},
"name": {
"type": "string"
},
"tag_bg": {
"type": "string"
},
"tag_fg": {
"type": "string"
}
}
}
},
"team_id": {
"type": "string"
},
"time_spent": {
"type": "integer"
},
"url": {
"type": "string"
},
"watchers": {
"type": "array",
"items": {
"type": "object",
"properties": {
"email": {
"type": "string"
},
"id": {
"type": "integer"
},
"initials": {
"type": "string"
},
"username": {
"type": "string"
}
}
}
}
},
"version": 1
}
@@ -0,0 +1,352 @@
{
"type": "object",
"properties": {
"archived": {
"type": "boolean"
},
"assignees": {
"type": "array",
"items": {
"type": "object",
"properties": {
"email": {
"type": "string"
},
"id": {
"type": "integer"
},
"initials": {
"type": "string"
},
"username": {
"type": "string"
}
}
}
},
"checklists": {
"type": "array",
"items": {
"type": "object",
"properties": {
"creator": {
"type": "integer"
},
"date_created": {
"type": "string"
},
"id": {
"type": "string"
},
"name": {
"type": "string"
},
"orderindex": {
"type": "integer"
},
"resolved": {
"type": "integer"
},
"task_id": {
"type": "string"
},
"unresolved": {
"type": "integer"
}
}
}
},
"creator": {
"type": "object",
"properties": {
"email": {
"type": "string"
},
"id": {
"type": "integer"
},
"username": {
"type": "string"
}
}
},
"custom_fields": {
"type": "array",
"items": {
"type": "object",
"properties": {
"date_created": {
"type": "string"
},
"hide_from_guests": {
"type": "boolean"
},
"id": {
"type": "string"
},
"name": {
"type": "string"
},
"type": {
"type": "string"
},
"type_config": {
"type": "object",
"properties": {
"options": {
"type": "array",
"items": {
"type": "object",
"properties": {
"id": {
"type": "string"
},
"name": {
"type": "string"
},
"orderindex": {
"type": "integer"
}
}
}
},
"sorting": {
"type": "string"
}
}
}
}
}
},
"custom_item_id": {
"type": "integer"
},
"date_created": {
"type": "string"
},
"date_updated": {
"type": "string"
},
"dependencies": {
"type": "array",
"items": {
"type": "object",
"properties": {
"date_created": {
"type": "string"
},
"depends_on": {
"type": "string"
},
"task_id": {
"type": "string"
},
"type": {
"type": "integer"
},
"userid": {
"type": "string"
},
"workspace_id": {
"type": "string"
}
}
}
},
"folder": {
"type": "object",
"properties": {
"access": {
"type": "boolean"
},
"hidden": {
"type": "boolean"
},
"id": {
"type": "string"
},
"name": {
"type": "string"
}
}
},
"id": {
"type": "string"
},
"linked_tasks": {
"type": "array",
"items": {
"type": "object",
"properties": {
"date_created": {
"type": "string"
},
"link_id": {
"type": "string"
},
"task_id": {
"type": "string"
},
"userid": {
"type": "string"
},
"workspace_id": {
"type": "string"
}
}
}
},
"list": {
"type": "object",
"properties": {
"access": {
"type": "boolean"
},
"id": {
"type": "string"
},
"name": {
"type": "string"
}
}
},
"locations": {
"type": "array",
"items": {
"type": "object",
"properties": {
"id": {
"type": "string"
},
"name": {
"type": "string"
}
}
}
},
"name": {
"type": "string"
},
"orderindex": {
"type": "string"
},
"permission_level": {
"type": "string"
},
"project": {
"type": "object",
"properties": {
"access": {
"type": "boolean"
},
"hidden": {
"type": "boolean"
},
"id": {
"type": "string"
},
"name": {
"type": "string"
}
}
},
"sharing": {
"type": "object",
"properties": {
"public": {
"type": "boolean"
},
"public_fields": {
"type": "array",
"items": {
"type": "string"
}
},
"public_share_expires_on": {
"type": "null"
},
"seo_optimized": {
"type": "boolean"
},
"token": {
"type": "null"
}
}
},
"space": {
"type": "object",
"properties": {
"id": {
"type": "string"
}
}
},
"status": {
"type": "object",
"properties": {
"color": {
"type": "string"
},
"id": {
"type": "string"
},
"orderindex": {
"type": "integer"
},
"status": {
"type": "string"
},
"type": {
"type": "string"
}
}
},
"tags": {
"type": "array",
"items": {
"type": "object",
"properties": {
"creator": {
"type": "integer"
},
"name": {
"type": "string"
},
"tag_bg": {
"type": "string"
},
"tag_fg": {
"type": "string"
}
}
}
},
"team_id": {
"type": "string"
},
"url": {
"type": "string"
},
"watchers": {
"type": "array",
"items": {
"type": "object",
"properties": {
"email": {
"type": "string"
},
"id": {
"type": "integer"
},
"initials": {
"type": "string"
},
"username": {
"type": "string"
}
}
}
}
},
"version": 1
}
@@ -0,0 +1,475 @@
{
"type": "object",
"properties": {
"archived": {
"type": "boolean"
},
"assignees": {
"type": "array",
"items": {
"type": "object",
"properties": {
"color": {
"type": "string"
},
"email": {
"type": "string"
},
"id": {
"type": "integer"
},
"initials": {
"type": "string"
},
"username": {
"type": "string"
}
}
}
},
"attachments": {
"type": "array",
"items": {
"type": "object",
"properties": {
"date": {
"type": "string"
},
"deleted": {
"type": "boolean"
},
"email_data": {
"type": "null"
},
"extension": {
"type": "string"
},
"hidden": {
"type": "boolean"
},
"id": {
"type": "string"
},
"is_folder": {
"type": "null"
},
"mimetype": {
"type": "string"
},
"parent_id": {
"type": "string"
},
"resolved_comments": {
"type": "integer"
},
"size": {
"type": "integer"
},
"source": {
"type": "integer"
},
"title": {
"type": "string"
},
"total_comments": {
"type": "integer"
},
"type": {
"type": "integer"
},
"url": {
"type": "string"
},
"url_w_host": {
"type": "string"
},
"url_w_query": {
"type": "string"
},
"user": {
"type": "object",
"properties": {
"color": {
"type": "string"
},
"email": {
"type": "string"
},
"id": {
"type": "integer"
},
"initials": {
"type": "string"
},
"username": {
"type": "string"
}
}
},
"version": {
"type": "integer"
},
"workspace_id": {
"type": "null"
}
}
}
},
"checklists": {
"type": "array",
"items": {
"type": "object",
"properties": {
"creator": {
"type": "integer"
},
"date_created": {
"type": "string"
},
"id": {
"type": "string"
},
"items": {
"type": "array",
"items": {
"type": "object",
"properties": {
"date_created": {
"type": "string"
},
"due_date": {
"type": "null"
},
"group_assignee": {
"type": "null"
},
"id": {
"type": "string"
},
"name": {
"type": "string"
},
"parent": {
"type": "null"
},
"resolved": {
"type": "boolean"
},
"sent_due_date_notif": {
"type": "null"
},
"start_date": {
"type": "null"
}
}
}
},
"name": {
"type": "string"
},
"orderindex": {
"type": "integer"
},
"resolved": {
"type": "integer"
},
"task_id": {
"type": "string"
},
"unresolved": {
"type": "integer"
}
}
}
},
"creator": {
"type": "object",
"properties": {
"email": {
"type": "string"
},
"id": {
"type": "integer"
},
"username": {
"type": "string"
}
}
},
"custom_fields": {
"type": "array",
"items": {
"type": "object",
"properties": {
"date_created": {
"type": "string"
},
"hide_from_guests": {
"type": "boolean"
},
"id": {
"type": "string"
},
"name": {
"type": "string"
},
"type": {
"type": "string"
},
"type_config": {
"type": "object",
"properties": {
"options": {
"type": "array",
"items": {
"type": "object",
"properties": {
"id": {
"type": "string"
},
"name": {
"type": "string"
},
"orderindex": {
"type": "integer"
}
}
}
},
"sorting": {
"type": "string"
}
}
}
}
}
},
"custom_item_id": {
"type": "integer"
},
"date_created": {
"type": "string"
},
"date_updated": {
"type": "string"
},
"dependencies": {
"type": "array",
"items": {
"type": "object",
"properties": {
"chain_id": {
"type": "null"
},
"date_created": {
"type": "string"
},
"depends_on": {
"type": "string"
},
"task_id": {
"type": "string"
},
"type": {
"type": "integer"
},
"userid": {
"type": "string"
},
"workspace_id": {
"type": "string"
}
}
}
},
"folder": {
"type": "object",
"properties": {
"access": {
"type": "boolean"
},
"id": {
"type": "string"
},
"name": {
"type": "string"
}
}
},
"id": {
"type": "string"
},
"linked_tasks": {
"type": "array",
"items": {
"type": "object",
"properties": {
"date_created": {
"type": "string"
},
"link_id": {
"type": "string"
},
"task_id": {
"type": "string"
},
"userid": {
"type": "string"
},
"workspace_id": {
"type": "string"
}
}
}
},
"list": {
"type": "object",
"properties": {
"access": {
"type": "boolean"
},
"id": {
"type": "string"
},
"name": {
"type": "string"
}
}
},
"locations": {
"type": "array",
"items": {
"type": "object",
"properties": {
"id": {
"type": "string"
},
"name": {
"type": "string"
}
}
}
},
"name": {
"type": "string"
},
"orderindex": {
"type": "string"
},
"permission_level": {
"type": "string"
},
"project": {
"type": "object",
"properties": {
"access": {
"type": "boolean"
},
"id": {
"type": "string"
},
"name": {
"type": "string"
}
}
},
"sharing": {
"type": "object",
"properties": {
"public": {
"type": "boolean"
},
"public_fields": {
"type": "array",
"items": {
"type": "string"
}
},
"public_share_expires_on": {
"type": "null"
},
"seo_optimized": {
"type": "boolean"
},
"token": {
"type": "null"
}
}
},
"space": {
"type": "object",
"properties": {
"id": {
"type": "string"
}
}
},
"status": {
"type": "object",
"properties": {
"color": {
"type": "string"
},
"id": {
"type": "string"
},
"orderindex": {
"type": "integer"
},
"status": {
"type": "string"
},
"type": {
"type": "string"
}
}
},
"tags": {
"type": "array",
"items": {
"type": "object",
"properties": {
"name": {
"type": "string"
},
"tag_bg": {
"type": "string"
},
"tag_fg": {
"type": "string"
}
}
}
},
"team_id": {
"type": "string"
},
"time_spent": {
"type": "integer"
},
"url": {
"type": "string"
},
"watchers": {
"type": "array",
"items": {
"type": "object",
"properties": {
"email": {
"type": "string"
},
"id": {
"type": "integer"
},
"initials": {
"type": "string"
},
"username": {
"type": "string"
}
}
}
}
},
"version": 1
}
@@ -0,0 +1,9 @@
{
"type": "object",
"properties": {
"success": {
"type": "boolean"
}
},
"version": 1
}
@@ -0,0 +1,124 @@
{
"type": "object",
"properties": {
"approval_id": {
"type": "null"
},
"at": {
"type": "string"
},
"billable": {
"type": "boolean"
},
"description": {
"type": "string"
},
"duration": {
"type": "string"
},
"end": {
"type": "string"
},
"id": {
"type": "string"
},
"is_locked": {
"type": "boolean"
},
"source": {
"type": "string"
},
"start": {
"type": "string"
},
"tags": {
"type": "array",
"items": {
"type": "object",
"properties": {
"creator": {
"type": "integer"
},
"name": {
"type": "string"
},
"tag_bg": {
"type": "string"
},
"tag_fg": {
"type": "string"
}
}
}
},
"task": {
"type": "object",
"properties": {
"id": {
"type": "string"
},
"name": {
"type": "string"
},
"status": {
"type": "object",
"properties": {
"color": {
"type": "string"
},
"orderindex": {
"type": "integer"
},
"status": {
"type": "string"
},
"type": {
"type": "string"
}
}
}
}
},
"task_location": {
"type": "object",
"properties": {
"folder_id": {
"type": "string"
},
"list_id": {
"type": "string"
},
"space_id": {
"type": "string"
}
}
},
"task_url": {
"type": "string"
},
"user": {
"type": "object",
"properties": {
"color": {
"type": "string"
},
"email": {
"type": "string"
},
"id": {
"type": "integer"
},
"initials": {
"type": "string"
},
"username": {
"type": "string"
}
}
},
"wid": {
"type": "string"
}
},
"version": 1
}
@@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="-10 0 155 155"><defs><linearGradient id="a" x1="0%" y1="68.01%" y2="68.01%"><stop offset="0%" stop-color="#8930FD"/><stop offset="100%" stop-color="#49CCF9"/></linearGradient><linearGradient id="b" x1="0%" y1="68.01%" y2="68.01%"><stop offset="0%" stop-color="#FF02F0"/><stop offset="100%" stop-color="#FFC800"/></linearGradient></defs><g fill="none"><path fill="url(#a)" d="m.4 119.12 23.81-18.24C36.86 117.39 50.3 125 65.26 125c14.88 0 27.94-7.52 40.02-23.9l24.15 17.8C112 142.52 90.34 155 65.26 155c-25 0-46.87-12.4-64.86-35.88"/><path fill="url(#b)" d="M65.18 39.84 22.8 76.36 3.21 53.64 65.27.16l61.57 53.52-19.68 22.64z"/></g></svg>

After

Width:  |  Height:  |  Size: 687 B