diff --git a/packages/backend/src/apps/clickup/actions/create-task/index.js b/packages/backend/src/apps/clickup/actions/create-task/index.js new file mode 100644 index 00000000..c6f10fd9 --- /dev/null +++ b/packages/backend/src/apps/clickup/actions/create-task/index.js @@ -0,0 +1,294 @@ +import defineAction from '../../../../helpers/define-action.js'; + +export default defineAction({ + name: 'Create task', + key: 'createTask', + description: 'Creates a new task.', + arguments: [ + { + label: 'Workspace', + key: 'workspaceId', + type: 'dropdown', + required: true, + description: '', + variables: true, + source: { + type: 'query', + name: 'getDynamicData', + arguments: [ + { + name: 'key', + value: 'listWorkspaces', + }, + ], + }, + }, + { + label: 'Space', + key: 'spaceId', + type: 'dropdown', + required: true, + dependsOn: ['parameters.workspaceId'], + description: '', + variables: true, + source: { + type: 'query', + name: 'getDynamicData', + arguments: [ + { + name: 'key', + value: 'listSpaces', + }, + { + name: 'parameters.workspaceId', + value: '{parameters.workspaceId}', + }, + ], + }, + }, + { + label: 'Folder', + key: 'folderId', + type: 'dropdown', + required: true, + dependsOn: ['parameters.spaceId'], + description: '', + variables: true, + source: { + type: 'query', + name: 'getDynamicData', + arguments: [ + { + name: 'key', + value: 'listFolders', + }, + { + name: 'parameters.spaceId', + value: '{parameters.spaceId}', + }, + ], + }, + }, + { + label: 'List', + key: 'listId', + type: 'dropdown', + required: true, + dependsOn: ['parameters.folderId'], + description: '', + variables: true, + source: { + type: 'query', + name: 'getDynamicData', + arguments: [ + { + name: 'key', + value: 'listLists', + }, + { + name: 'parameters.folderId', + value: '{parameters.folderId}', + }, + ], + }, + }, + { + label: 'Task Name', + key: 'taskName', + type: 'string', + required: true, + description: '', + variables: true, + }, + { + label: 'Task Description', + key: 'taskDescription', + type: 'string', + required: false, + description: '', + variables: true, + }, + { + label: 'Markdown Content', + key: 'markdownContent', + type: 'dropdown', + required: false, + description: '', + variables: true, + options: [ + { label: 'False', value: 'false' }, + { label: 'True', value: 'true' }, + ], + }, + { + label: 'Assignees', + key: 'assigneeIds', + type: 'dynamic', + required: false, + description: '', + fields: [ + { + label: 'Assignee', + key: 'assigneeId', + type: 'dropdown', + required: false, + dependsOn: ['parameters.listId'], + variables: true, + source: { + type: 'query', + name: 'getDynamicData', + arguments: [ + { + name: 'key', + value: 'listAssignees', + }, + { + name: 'parameters.listId', + value: '{parameters.listId}', + }, + ], + }, + }, + ], + }, + { + label: 'Task Status', + key: 'taskStatus', + type: 'dropdown', + required: false, + dependsOn: ['parameters.listId'], + description: '', + variables: true, + source: { + type: 'query', + name: 'getDynamicData', + arguments: [ + { + name: 'key', + value: 'listStatuses', + }, + { + name: 'parameters.listId', + value: '{parameters.listId}', + }, + ], + }, + }, + { + label: 'Tags', + key: 'tagIds', + type: 'dynamic', + required: false, + description: '', + fields: [ + { + label: 'tag', + key: 'tagId', + type: 'dropdown', + required: false, + variables: true, + source: { + type: 'query', + name: 'getDynamicData', + arguments: [ + { + name: 'key', + value: 'listTags', + }, + ], + }, + }, + ], + }, + { + label: 'Priority', + key: 'priority', + type: 'dropdown', + required: false, + description: '', + variables: true, + options: [ + { label: 'Urgent', value: 1 }, + { label: 'High', value: 2 }, + { label: 'Normal', value: 3 }, + { label: 'Low', value: 4 }, + ], + }, + { + label: 'Due Date', + key: 'dueDate', + type: 'string', + required: false, + description: 'format: integer ', + variables: true, + }, + { + label: 'Start Date', + key: 'startDate', + type: 'string', + required: false, + description: 'format: integer ', + variables: true, + }, + ], + + async run($) { + const { + listId, + taskName, + taskDescription, + markdownContent, + assigneeIds, + taskStatus, + tagIds, + priority, + dueDate, + startDate, + } = $.step.parameters; + + const tags = tagIds.map((tag) => tag.tagId); + const assignees = assigneeIds.map((assignee) => + Number(assignee.assigneeId) + ); + + const body = { + name: taskName, + }; + + if (assignees.length) { + body.assignees = assignees; + } + + if (taskStatus) { + body.status = taskStatus; + } + + if (tags.length) { + body.tags = tags; + } + + if (priority) { + body.priority = priority; + } + + if (dueDate) { + body.due_date = dueDate; + } + + if (startDate) { + body.start_date = startDate; + } + + if (markdownContent) { + body.markdown_description = taskDescription; + } else { + body.description = taskDescription; + } + + const { data } = await $.http.post(`/v2/list/${listId}/task`, body); + + $.setActionItem({ + raw: data, + }); + }, +}); diff --git a/packages/backend/src/apps/clickup/actions/find-task-by-id/index.js b/packages/backend/src/apps/clickup/actions/find-task-by-id/index.js new file mode 100644 index 00000000..70d8ba9b --- /dev/null +++ b/packages/backend/src/apps/clickup/actions/find-task-by-id/index.js @@ -0,0 +1,82 @@ +import defineAction from '../../../../helpers/define-action.js'; + +export default defineAction({ + name: 'Find task by id', + key: 'findTaskById', + description: 'Finds a task using id.', + arguments: [ + { + label: 'Task ID', + key: 'taskId', + type: 'string', + required: true, + description: '', + variables: true, + }, + { + label: 'Use Custom ID', + key: 'useCustomId', + type: 'dropdown', + required: false, + description: '', + variables: true, + options: [ + { + label: 'True', + value: true, + }, + { + label: 'False', + value: false, + }, + ], + additionalFields: { + type: 'query', + name: 'getDynamicFields', + arguments: [ + { + name: 'key', + value: 'listFieldsWhenUsingCustomId', + }, + { + name: 'parameters.useCustomId', + value: '{parameters.useCustomId}', + }, + ], + }, + }, + { + label: 'Include Subtasks?', + key: 'includeSubtasks', + type: 'dropdown', + required: false, + description: '', + variables: true, + options: [ + { + label: 'True', + value: true, + }, + { + label: 'False', + value: false, + }, + ], + }, + ], + + async run($) { + const { taskId, useCustomId, includeSubtasks } = $.step.parameters; + + const params = { + custom_task_ids: useCustomId || false, + include_subtasks: includeSubtasks, + }; + + const { data } = await $.http.get(`/v2/task/${taskId}`, { params }); + + $.setActionItem({ + raw: data, + }); + }, +}); diff --git a/packages/backend/src/apps/clickup/actions/index.js b/packages/backend/src/apps/clickup/actions/index.js index 0c286aae..caa1fb68 100644 --- a/packages/backend/src/apps/clickup/actions/index.js +++ b/packages/backend/src/apps/clickup/actions/index.js @@ -1,4 +1,6 @@ import createFolder from './create-folder/index.js'; import createList from './create-list/index.js'; +import createTask from './create-task/index.js'; +import findTaskById from './find-task-by-id/index.js'; -export default [createFolder, createList]; +export default [createFolder, createList, createTask, findTaskById]; diff --git a/packages/backend/src/apps/clickup/dynamic-data/index.js b/packages/backend/src/apps/clickup/dynamic-data/index.js index dcc5fcf2..4422c386 100644 --- a/packages/backend/src/apps/clickup/dynamic-data/index.js +++ b/packages/backend/src/apps/clickup/dynamic-data/index.js @@ -1,7 +1,19 @@ +import listAssignees from './list-assignees/index.js'; import listFolders from './list-folders/index.js'; import listLists from './list-lists/index.js'; import listSpaces from './list-spaces/index.js'; +import listStatuses from './list-statuses/index.js'; +import listTags from './list-tags/index.js'; import listTasks from './list-tasks/index.js'; import listWorkspaces from './list-workspaces/index.js'; -export default [listFolders, listLists, listSpaces, listTasks, listWorkspaces]; +export default [ + listAssignees, + listFolders, + listLists, + listSpaces, + listStatuses, + listTags, + listTasks, + listWorkspaces, +]; diff --git a/packages/backend/src/apps/clickup/dynamic-data/list-assignees/index.js b/packages/backend/src/apps/clickup/dynamic-data/list-assignees/index.js new file mode 100644 index 00000000..f9681309 --- /dev/null +++ b/packages/backend/src/apps/clickup/dynamic-data/list-assignees/index.js @@ -0,0 +1,28 @@ +export default { + name: 'List assignees', + key: 'listAssignees', + + async run($) { + const assignees = { + data: [], + }; + const listId = $.step.parameters.listId; + + if (!listId) { + return assignees; + } + + const { data } = await $.http.get(`/v2/list/${listId}/member`); + + if (data.members) { + for (const member of data.members) { + assignees.data.push({ + value: member.id, + name: member.username, + }); + } + } + + return assignees; + }, +}; diff --git a/packages/backend/src/apps/clickup/dynamic-data/list-statuses/index.js b/packages/backend/src/apps/clickup/dynamic-data/list-statuses/index.js new file mode 100644 index 00000000..b0005e9c --- /dev/null +++ b/packages/backend/src/apps/clickup/dynamic-data/list-statuses/index.js @@ -0,0 +1,28 @@ +export default { + name: 'List statuses', + key: 'listStatuses', + + async run($) { + const statuses = { + data: [], + }; + const listId = $.step.parameters.listId; + + if (!listId) { + return statuses; + } + + const { data } = await $.http.get(`/v2/list/${listId}`); + + if (data.statuses) { + for (const status of data.statuses) { + statuses.data.push({ + value: status.status, + name: status.status, + }); + } + } + + return statuses; + }, +}; diff --git a/packages/backend/src/apps/clickup/dynamic-data/list-tags/index.js b/packages/backend/src/apps/clickup/dynamic-data/list-tags/index.js new file mode 100644 index 00000000..835fef85 --- /dev/null +++ b/packages/backend/src/apps/clickup/dynamic-data/list-tags/index.js @@ -0,0 +1,28 @@ +export default { + name: 'List tags', + key: 'listTags', + + async run($) { + const tags = { + data: [], + }; + const spaceId = $.step.parameters.spaceId; + + if (!spaceId) { + return spaceId; + } + + const { data } = await $.http.get(`v2/space/${spaceId}/tag`); + + if (data.tags) { + for (const tag of data.tags) { + tags.data.push({ + value: tag.name, + name: tag.name, + }); + } + } + + return tags; + }, +}; diff --git a/packages/backend/src/apps/clickup/dynamic-fields/index.js b/packages/backend/src/apps/clickup/dynamic-fields/index.js new file mode 100644 index 00000000..3340a681 --- /dev/null +++ b/packages/backend/src/apps/clickup/dynamic-fields/index.js @@ -0,0 +1,3 @@ +import useCustomId from './use-custom-id/index.js'; + +export default [useCustomId]; diff --git a/packages/backend/src/apps/clickup/dynamic-fields/use-custom-id/index.js b/packages/backend/src/apps/clickup/dynamic-fields/use-custom-id/index.js new file mode 100644 index 00000000..bb1b3e00 --- /dev/null +++ b/packages/backend/src/apps/clickup/dynamic-fields/use-custom-id/index.js @@ -0,0 +1,29 @@ +export default { + name: 'List workspaces when using custom id', + key: 'listFieldsWhenUsingCustomId', + + async run($) { + if ($.step.parameters.useCustomId) { + return [ + { + label: 'Workspace', + key: 'workspaceId', + type: 'dropdown', + required: true, + description: '', + variables: true, + source: { + type: 'query', + name: 'getDynamicData', + arguments: [ + { + name: 'key', + value: 'listWorkspaces', + }, + ], + }, + }, + ]; + } + }, +}; diff --git a/packages/backend/src/apps/clickup/index.js b/packages/backend/src/apps/clickup/index.js index c696949d..19d68051 100644 --- a/packages/backend/src/apps/clickup/index.js +++ b/packages/backend/src/apps/clickup/index.js @@ -4,6 +4,7 @@ import auth from './auth/index.js'; import triggers from './triggers/index.js'; import dynamicData from './dynamic-data/index.js'; import actions from './actions/index.js'; +import dynamicFields from './dynamic-fields/index.js'; export default defineApp({ name: 'ClickUp', @@ -19,4 +20,5 @@ export default defineApp({ triggers, dynamicData, actions, + dynamicFields, }); diff --git a/packages/docs/pages/.vitepress/config.js b/packages/docs/pages/.vitepress/config.js index bcf23b18..8011303f 100644 --- a/packages/docs/pages/.vitepress/config.js +++ b/packages/docs/pages/.vitepress/config.js @@ -59,6 +59,16 @@ export default defineConfig({ { text: 'Connection', link: '/apps/carbone/connection' }, ], }, + { + text: 'ClickUp', + collapsible: true, + collapsed: true, + items: [ + { text: 'Actions', link: '/apps/clickup/actions' }, + { text: 'Triggers', link: '/apps/clickup/triggers' }, + { text: 'Connection', link: '/apps/clickup/connection' }, + ], + }, { text: 'Cryptography', collapsible: true, @@ -77,16 +87,6 @@ export default defineConfig({ { text: 'Connection', link: '/apps/datastore/connection' }, ], }, - { - text: 'ClickUp', - collapsible: true, - collapsed: true, - items: [ - { text: 'Actions', link: '/apps/clickup/actions' }, - { text: 'Triggers', link: '/apps/clickup/triggers' }, - { text: 'Connection', link: '/apps/clickup/connection' }, - ], - }, { text: 'DeepL', collapsible: true, diff --git a/packages/docs/pages/apps/clickup/actions.md b/packages/docs/pages/apps/clickup/actions.md index eaebe22e..7a7abb39 100644 --- a/packages/docs/pages/apps/clickup/actions.md +++ b/packages/docs/pages/apps/clickup/actions.md @@ -5,6 +5,10 @@ items: desc: Creates a new folder. - name: Create list desc: Creates a new list. + - name: Create task + desc: Creates a new task. + - name: Find task by id + desc: Finds a task using id. ---