Compare commits

..

4 Commits

Author SHA1 Message Date
Rıdvan Akca
9b00cff2d9 feat(monday): add create item action 2024-05-09 14:02:47 +02:00
Rıdvan Akca
ff0dd0b415 feat(monday): add create board action 2024-05-08 12:14:32 +02:00
Rıdvan Akca
f0b5d85a7a feat(monday): add new boards trigger 2024-05-03 14:46:07 +02:00
Rıdvan Akca
2295507a2c feat(monday): add monday integration 2024-05-03 14:04:57 +02:00
175 changed files with 485 additions and 7720 deletions

View File

@@ -36,6 +36,7 @@ services:
keycloak:
image: quay.io/keycloak/keycloak:21.1
restart: always
container_name: keycloak
environment:
- KEYCLOAK_ADMIN=admin
- KEYCLOAK_ADMIN_PASSWORD=admin

24
docker/Dockerfile.cloud Normal file
View File

@@ -0,0 +1,24 @@
# syntax=docker/dockerfile:1
FROM node:18-alpine
ENV PORT 3000
RUN \
apk --no-cache add --virtual build-dependencies python3 build-base git
RUN git clone https://github.com/automatisch/automatisch.git
WORKDIR /automatisch
RUN yarn install
RUN if [ "$WORKER" != "true" ]; then cd packages/web && yarn build; fi
RUN \
rm -rf /usr/local/share/.cache/ && \
apk del build-dependencies
COPY ./docker/entrypoint-cloud.sh /entrypoint-cloud.sh
EXPOSE 3000
ENTRYPOINT ["sh", "/entrypoint-cloud.sh"]

View File

@@ -1,5 +1,5 @@
# syntax=docker/dockerfile:1
FROM automatischio/automatisch:latest
FROM automatischio/automatisch:0.10.0
WORKDIR /automatisch
RUN apk add --no-cache openssl dos2unix

13
docker/entrypoint-cloud.sh Executable file
View File

@@ -0,0 +1,13 @@
#!/bin/sh
set -e
cd packages/backend
if [ -n "$WORKER" ]; then
yarn start:worker
else
yarn db:migrate
yarn db:seed:user
yarn start
fi

View File

@@ -2,7 +2,6 @@ import appConfig from '../../src/config/app.js';
import logger from '../../src/helpers/logger.js';
import client from './client.js';
import User from '../../src/models/user.js';
import Config from '../../src/models/config.js';
import Role from '../../src/models/role.js';
import '../../src/config/orm.js';
import process from 'process';
@@ -22,14 +21,6 @@ export async function createUser(
email = 'user@automatisch.io',
password = 'sample'
) {
if (appConfig.disableSeedUser) {
logger.info('Seed user is disabled.');
process.exit(0);
return;
}
const UNIQUE_VIOLATION_CODE = '23505';
const role = await fetchAdminRole();
@@ -46,8 +37,6 @@ export async function createUser(
if (userCount === 0) {
const user = await User.query().insertAndFetch(userParams);
logger.info(`User has been saved: ${user.email}`);
await Config.markInstallationCompleted();
} else {
logger.info('No need to seed a user.');
}

View File

@@ -67,7 +67,6 @@
"pluralize": "^8.0.0",
"raw-body": "^2.5.2",
"showdown": "^2.1.0",
"uuid": "^9.0.1",
"winston": "^3.7.1",
"xmlrpc": "^1.3.2"
},

View File

@@ -1,29 +0,0 @@
import defineAction from '../../../../helpers/define-action.js';
export default defineAction({
name: 'Create a watch',
key: 'createWatch',
description: 'Creates a new change detection watch for a specific website.',
arguments: [
{
label: 'URL',
key: 'url',
type: 'string',
required: true,
variables: true,
description: 'Url you want to monitor',
},
],
async run($) {
const url = $.step.parameters.url;
const body = {
url,
};
const response = await $.http.post('/v1/watch', body);
$.setActionItem({ raw: response.data });
},
});

View File

@@ -1,3 +0,0 @@
import createWatch from './create-watch/index.js';
export default [createWatch];

File diff suppressed because one or more lines are too long

Before

Width:  |  Height:  |  Size: 9.9 KiB

View File

@@ -1,44 +0,0 @@
import verifyCredentials from './verify-credentials.js';
import isStillVerified from './is-still-verified.js';
export default {
fields: [
{
key: 'screenName',
label: 'Screen Name',
type: 'string',
required: true,
readOnly: false,
value: null,
placeholder: null,
description:
'Screen name of your connection to be used on Automatisch UI.',
clickToCopy: false,
},
{
key: 'instanceUrl',
label: 'Instance URL',
type: 'string',
required: true,
readOnly: false,
value: null,
placeholder: null,
description: null,
clickToCopy: false,
},
{
key: 'apiKey',
label: 'API Key',
type: 'string',
required: true,
readOnly: false,
value: null,
placeholder: null,
description: 'Changedetection API key of your account.',
clickToCopy: false,
},
],
verifyCredentials,
isStillVerified,
};

View File

@@ -1,10 +0,0 @@
const verifyCredentials = async ($) => {
await $.http.get('/v1/systeminfo');
await $.auth.set({
screenName: $.auth.data.screenName,
apiKey: $.auth.data.apiKey,
});
};
export default verifyCredentials;

View File

@@ -1,10 +0,0 @@
const setBaseUrl = ($, requestConfig) => {
const instanceUrl = $.auth.data.instanceUrl;
if (instanceUrl) {
requestConfig.baseURL = `${instanceUrl}/api`;
}
return requestConfig;
};
export default setBaseUrl;

View File

@@ -1,19 +0,0 @@
import defineApp from '../../helpers/define-app.js';
import addAuthHeader from './common/add-auth-header.js';
import auth from './auth/index.js';
import setBaseUrl from './common/set-base-url.js';
import actions from './actions/index.js';
export default defineApp({
name: 'Changedetection',
key: 'changedetection',
iconUrl: '{BASE_URL}/apps/changedetection/assets/favicon.svg',
authDocUrl: '{DOCS_URL}/apps/changedetection/connection',
supportsConnections: true,
baseUrl: 'https://changedetection.io',
apiBaseUrl: '',
primaryColor: '3056d3',
beforeRequest: [setBaseUrl, addAuthHeader],
auth,
actions,
});

View File

@@ -1,16 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- Generator: Adobe Illustrator 16.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
width="200px" height="200px" viewBox="0 0 200 200" enable-background="new 0 0 200 200" xml:space="preserve">
<g id="background">
<rect fill="#2E9FFF" width="200" height="200"/>
</g>
<g id="Layer_2">
</g>
<path fill="#FFFFFF" d="M102.535,167.5c-16.518,0-31.621-6.036-43.298-16.021L30.5,155.405l11.102-27.401
c-3.868-8.535-6.038-18.01-6.038-28.004c0-37.277,29.984-67.5,66.971-67.5c36.984,0,66.965,30.223,66.965,67.5
C169.5,137.284,139.52,167.5,102.535,167.5z M139.102,99.807v-0.188c0-19.479-13.736-33.367-37.42-33.367h-25.58v67.5h25.201
C125.171,133.753,139.102,119.284,139.102,99.807L139.102,99.807z M101.964,117.168h-7.482V82.841h7.482
c10.989,0,18.283,6.265,18.283,17.07v0.188C120.247,110.995,112.953,117.168,101.964,117.168z"/>
</svg>

Before

Width:  |  Height:  |  Size: 1.1 KiB

View File

@@ -1,21 +0,0 @@
import { URLSearchParams } from 'url';
import authScope from '../common/auth-scope.js';
export default async function generateAuthUrl($) {
const oauthRedirectUrlField = $.app.auth.fields.find(
(field) => field.key == 'oAuthRedirectUrl'
);
const redirectUri = oauthRedirectUrlField.value;
const searchParams = new URLSearchParams({
client_id: $.auth.data.apiKey,
scope: authScope.join(','),
response_type: 'code',
redirect_uri: redirectUri,
});
const url = `https://disqus.com/api/oauth/2.0/authorize/?${searchParams.toString()}`;
await $.auth.set({
url,
});
}

View File

@@ -1,48 +0,0 @@
import generateAuthUrl from './generate-auth-url.js';
import verifyCredentials from './verify-credentials.js';
import refreshToken from './refresh-token.js';
import isStillVerified from './is-still-verified.js';
export default {
fields: [
{
key: 'oAuthRedirectUrl',
label: 'OAuth Redirect URL',
type: 'string',
required: true,
readOnly: true,
value: '{WEB_APP_URL}/app/disqus/connections/add',
placeholder: null,
description:
'When asked to input a redirect URL in Disqus, enter the URL above.',
clickToCopy: true,
},
{
key: 'apiKey',
label: 'API Key',
type: 'string',
required: true,
readOnly: false,
value: null,
placeholder: null,
description: null,
clickToCopy: false,
},
{
key: 'apiSecret',
label: 'API Secret',
type: 'string',
required: true,
readOnly: false,
value: null,
placeholder: null,
description: null,
clickToCopy: false,
},
],
generateAuthUrl,
verifyCredentials,
isStillVerified,
refreshToken,
};

View File

@@ -1,8 +0,0 @@
import getCurrentUser from '../common/get-current-user.js';
const isStillVerified = async ($) => {
const currentUser = await getCurrentUser($);
return !!currentUser.response.username;
};
export default isStillVerified;

View File

@@ -1,26 +0,0 @@
import { URLSearchParams } from 'node:url';
import authScope from '../common/auth-scope.js';
const refreshToken = async ($) => {
const params = new URLSearchParams({
grant_type: 'refresh_token',
client_id: $.auth.data.apiKey,
client_secret: $.auth.data.apiSecret,
refresh_token: $.auth.data.refreshToken,
});
const { data } = await $.http.post(
`https://disqus.com/api/oauth/2.0/access_token/`,
params.toString()
);
await $.auth.set({
accessToken: data.access_token,
refreshToken: data.refresh_token,
expiresIn: data.expires_in,
scope: authScope.join(','),
tokenType: data.token_type,
});
};
export default refreshToken;

View File

@@ -1,34 +0,0 @@
import { URLSearchParams } from 'url';
const verifyCredentials = async ($) => {
const oauthRedirectUrlField = $.app.auth.fields.find(
(field) => field.key == 'oAuthRedirectUrl'
);
const redirectUri = oauthRedirectUrlField.value;
const params = new URLSearchParams({
grant_type: 'authorization_code',
client_id: $.auth.data.apiKey,
client_secret: $.auth.data.apiSecret,
redirect_uri: redirectUri,
code: $.auth.data.code,
});
const { data } = await $.http.post(
`https://disqus.com/api/oauth/2.0/access_token/`,
params.toString()
);
await $.auth.set({
accessToken: data.access_token,
tokenType: data.token_type,
apiKey: $.auth.data.apiKey,
apiSecret: $.auth.data.apiSecret,
scope: $.auth.data.scope,
userId: data.user_id,
expiresIn: data.expires_in,
refreshToken: data.refresh_token,
screenName: data.username,
});
};
export default verifyCredentials;

View File

@@ -1,15 +0,0 @@
import { URLSearchParams } from 'url';
const addAuthHeader = ($, requestConfig) => {
const params = new URLSearchParams({
access_token: $.auth.data.accessToken,
api_key: $.auth.data.apiKey,
api_secret: $.auth.data.apiSecret,
});
requestConfig.params = params;
return requestConfig;
};
export default addAuthHeader;

View File

@@ -1,3 +0,0 @@
const authScope = ['read', 'write', 'admin', 'email'];
export default authScope;

View File

@@ -1,10 +0,0 @@
const getCurrentUser = async ($) => {
try {
const { data: currentUser } = await $.http.get('/3.0/users/details.json');
return currentUser;
} catch (error) {
throw new Error('You are not authenticated.');
}
};
export default getCurrentUser;

View File

@@ -1,3 +0,0 @@
import listForums from './list-forums/index.js';
export default [listForums];

View File

@@ -1,36 +0,0 @@
export default {
name: 'List forums',
key: 'listForums',
async run($) {
const forums = {
data: [],
};
const params = {
limit: 100,
order: 'desc',
cursor: undefined,
};
let more;
do {
const { data } = await $.http.get('/3.0/users/listForums.json', {
params,
});
params.cursor = data.cursor.next;
more = data.cursor.hasNext;
if (data.response?.length) {
for (const forum of data.response) {
forums.data.push({
value: forum.id,
name: forum.id,
});
}
}
} while (more);
return forums;
},
};

View File

@@ -1,20 +0,0 @@
import defineApp from '../../helpers/define-app.js';
import addAuthHeader from './common/add-auth-header.js';
import auth from './auth/index.js';
import dynamicData from './dynamic-data/index.js';
import triggers from './triggers/index.js';
export default defineApp({
name: 'Disqus',
key: 'disqus',
baseUrl: 'https://disqus.com',
apiBaseUrl: 'https://disqus.com/api',
iconUrl: '{BASE_URL}/apps/disqus/assets/favicon.svg',
authDocUrl: '{DOCS_URL}/apps/disqus/connection',
primaryColor: '2E9FFF',
supportsConnections: true,
beforeRequest: [addAuthHeader],
auth,
dynamicData,
triggers,
});

View File

@@ -1,4 +0,0 @@
import newComments from './new-comments/index.js';
import newFlaggedComments from './new-flagged-comments/index.js';
export default [newComments, newFlaggedComments];

View File

@@ -1,92 +0,0 @@
import defineTrigger from '../../../../helpers/define-trigger.js';
import { URLSearchParams } from 'url';
export default defineTrigger({
name: 'New comments',
key: 'newComments',
pollInterval: 15,
description: 'Triggers when a new comment is posted in a forum using Disqus.',
arguments: [
{
label: 'Post Types',
key: 'postTypes',
type: 'dynamic',
required: false,
description:
'Which posts should be considered for inclusion in the trigger?',
fields: [
{
label: 'Type',
key: 'type',
type: 'dropdown',
required: false,
description: '',
variables: true,
options: [
{ label: 'Unapproved Posts', value: 'unapproved' },
{ label: 'Approved Posts', value: 'approved' },
{ label: 'Spam Posts', value: 'spam' },
{ label: 'Deleted Posts', value: 'deleted' },
{ label: 'Flagged Posts', value: 'flagged' },
{ label: 'Highlighted Posts', value: 'highlighted' },
],
},
],
},
{
label: 'Forum',
key: 'forumId',
type: 'dropdown',
required: true,
description: 'Select the forum where you want comments to be triggered.',
variables: true,
source: {
type: 'query',
name: 'getDynamicData',
arguments: [
{
name: 'key',
value: 'listForums',
},
],
},
},
],
async run($) {
const forumId = $.step.parameters.forumId;
const postTypes = $.step.parameters.postTypes;
const formattedCommentTypes = postTypes
.filter((type) => type.type !== '')
.map((type) => type.type);
const params = new URLSearchParams({
limit: '100',
forum: forumId,
});
if (formattedCommentTypes.length) {
formattedCommentTypes.forEach((type) => params.append('include', type));
}
let more;
do {
const { data } = await $.http.get(
`/3.0/posts/list.json?${params.toString()}`
);
params.set('cursor', data.cursor.next);
more = data.cursor.hasNext;
if (data.response?.length) {
for (const comment of data.response) {
$.pushTriggerItem({
raw: comment,
meta: {
internalId: comment.id,
},
});
}
}
} while (more);
},
});

View File

@@ -1,60 +0,0 @@
import defineTrigger from '../../../../helpers/define-trigger.js';
import { URLSearchParams } from 'url';
export default defineTrigger({
name: 'New flagged comments',
key: 'newFlaggedComments',
pollInterval: 15,
description: 'Triggers when a Disqus comment is marked with a flag',
arguments: [
{
label: 'Forum',
key: 'forumId',
type: 'dropdown',
required: true,
description: 'Select the forum where you want comments to be triggered.',
variables: true,
source: {
type: 'query',
name: 'getDynamicData',
arguments: [
{
name: 'key',
value: 'listForums',
},
],
},
},
],
async run($) {
const forumId = $.step.parameters.forumId;
const isFlaggedFilter = 5;
const params = new URLSearchParams({
limit: 100,
forum: forumId,
filters: [isFlaggedFilter],
});
let more;
do {
const { data } = await $.http.get(
`/3.0/posts/list.json?${params.toString()}`
);
params.set('cursor', data.cursor.next);
more = data.cursor.hasNext;
if (data.response?.length) {
for (const comment of data.response) {
$.pushTriggerItem({
raw: comment,
meta: {
internalId: comment.id,
},
});
}
}
} while (more);
},
});

View File

@@ -2,7 +2,6 @@ import defineAction from '../../../../helpers/define-action.js';
import base64ToString from './transformers/base64-to-string.js';
import capitalize from './transformers/capitalize.js';
import encodeUriComponent from './transformers/encode-uri-component.js';
import extractEmailAddress from './transformers/extract-email-address.js';
import extractNumber from './transformers/extract-number.js';
import htmlToMarkdown from './transformers/html-to-markdown.js';
@@ -11,14 +10,12 @@ import markdownToHtml from './transformers/markdown-to-html.js';
import pluralize from './transformers/pluralize.js';
import replace from './transformers/replace.js';
import stringToBase64 from './transformers/string-to-base64.js';
import encodeUri from './transformers/encode-uri.js';
import trimWhitespace from './transformers/trim-whitespace.js';
import useDefaultValue from './transformers/use-default-value.js';
const transformers = {
base64ToString,
capitalize,
encodeUriComponent,
extractEmailAddress,
extractNumber,
htmlToMarkdown,
@@ -27,7 +24,6 @@ const transformers = {
pluralize,
replace,
stringToBase64,
encodeUri,
trimWhitespace,
useDefaultValue,
};
@@ -47,10 +43,6 @@ export default defineAction({
options: [
{ label: 'Base64 to String', value: 'base64ToString' },
{ label: 'Capitalize', value: 'capitalize' },
{
label: 'Encode URI Component',
value: 'encodeUriComponent',
},
{ label: 'Convert HTML to Markdown', value: 'htmlToMarkdown' },
{ label: 'Convert Markdown to HTML', value: 'markdownToHtml' },
{ label: 'Extract Email Address', value: 'extractEmailAddress' },
@@ -59,7 +51,6 @@ export default defineAction({
{ label: 'Pluralize', value: 'pluralize' },
{ label: 'Replace', value: 'replace' },
{ label: 'String to Base64', value: 'stringToBase64' },
{ label: 'Encode URI', value: 'encodeUri' },
{ label: 'Trim Whitespace', value: 'trimWhitespace' },
{ label: 'Use Default Value', value: 'useDefaultValue' },
],

View File

@@ -1,8 +0,0 @@
const encodeUriComponent = ($) => {
const input = $.step.parameters.input;
const encodedString = encodeURIComponent(input);
return encodedString;
};
export default encodeUriComponent;

View File

@@ -1,8 +0,0 @@
const encodeUri = ($) => {
const input = $.step.parameters.input;
const encodedString = encodeURI(input);
return encodedString;
};
export default encodeUri;

View File

@@ -1,6 +1,5 @@
import base64ToString from './text/base64-to-string.js';
import capitalize from './text/capitalize.js';
import encodeUriComponent from './text/encode-uri-component.js';
import extractEmailAddress from './text/extract-email-address.js';
import extractNumber from './text/extract-number.js';
import htmlToMarkdown from './text/html-to-markdown.js';
@@ -9,7 +8,6 @@ import markdownToHtml from './text/markdown-to-html.js';
import pluralize from './text/pluralize.js';
import replace from './text/replace.js';
import stringToBase64 from './text/string-to-base64.js';
import encodeUri from './text/encode-uri.js';
import trimWhitespace from './text/trim-whitespace.js';
import useDefaultValue from './text/use-default-value.js';
import performMathOperation from './numbers/perform-math-operation.js';
@@ -21,7 +19,6 @@ import formatDateTime from './date-time/format-date-time.js';
const options = {
base64ToString,
capitalize,
encodeUriComponent,
extractEmailAddress,
extractNumber,
htmlToMarkdown,
@@ -30,7 +27,6 @@ const options = {
pluralize,
replace,
stringToBase64,
encodeUri,
trimWhitespace,
useDefaultValue,
performMathOperation,

View File

@@ -1,12 +0,0 @@
const encodeUriComponent = [
{
label: 'Input',
key: 'input',
type: 'string',
required: true,
description: 'URI Component to encode',
variables: true,
},
];
export default encodeUriComponent;

View File

@@ -1,12 +0,0 @@
const encodeUri = [
{
label: 'Input',
key: 'input',
type: 'string',
required: true,
description: 'URI to encode',
variables: true,
},
];
export default encodeUri;

View File

@@ -1,31 +0,0 @@
import defineAction from '../../../../helpers/define-action.js';
export default defineAction({
name: 'Create task list',
key: 'createTaskList',
description: 'Creates a new task list.',
arguments: [
{
label: 'List Title',
key: 'listTitle',
type: 'string',
required: true,
description: '',
variables: true,
},
],
async run($) {
const listTitle = $.step.parameters.listTitle;
const body = {
title: listTitle,
};
const { data } = await $.http.post('/tasks/v1/users/@me/lists', body);
$.setActionItem({
raw: data,
});
},
});

View File

@@ -1,70 +0,0 @@
import defineAction from '../../../../helpers/define-action.js';
export default defineAction({
name: 'Create task',
key: 'createTask',
description: 'Creates a new task.',
arguments: [
{
label: 'Task List',
key: 'taskListId',
type: 'dropdown',
required: true,
description: '',
variables: true,
source: {
type: 'query',
name: 'getDynamicData',
arguments: [
{
name: 'key',
value: 'listTaskLists',
},
],
},
},
{
label: 'Title',
key: 'title',
type: 'string',
required: true,
description: '',
variables: true,
},
{
label: 'Notes',
key: 'notes',
type: 'string',
required: false,
description: '',
variables: true,
},
{
label: 'Due Date',
key: 'due',
type: 'string',
required: false,
description: 'RFC 3339 timestamp.',
variables: true,
},
],
async run($) {
const { taskListId, title, notes, due } = $.step.parameters;
const body = {
title,
notes,
due,
};
const { data } = await $.http.post(
`/tasks/v1/lists/${taskListId}/tasks`,
body
);
$.setActionItem({
raw: data,
});
},
});

View File

@@ -1,57 +0,0 @@
import defineAction from '../../../../helpers/define-action.js';
export default defineAction({
name: 'Find task',
key: 'findTask',
description: 'Looking for a specific task.',
arguments: [
{
label: 'Task List',
key: 'taskListId',
type: 'dropdown',
required: true,
description: 'The list to be searched.',
variables: true,
source: {
type: 'query',
name: 'getDynamicData',
arguments: [
{
name: 'key',
value: 'listTaskLists',
},
],
},
},
{
label: 'Title',
key: 'title',
type: 'string',
required: true,
description: '',
variables: true,
},
],
async run($) {
const taskListId = $.step.parameters.taskListId;
const title = $.step.parameters.title;
const params = {
showCompleted: true,
showHidden: true,
};
const { data } = await $.http.get(`/tasks/v1/lists/${taskListId}/tasks`, {
params,
});
const filteredTask = data.items?.filter((task) =>
task.title.includes(title)
);
$.setActionItem({
raw: filteredTask[0],
});
},
});

View File

@@ -1,6 +0,0 @@
import createTask from './create-task/index.js';
import createTaskList from './create-task-list/index.js';
import findTask from './find-task/index.js';
import updateTask from './update-task/index.js';
export default [createTask, createTaskList, findTask, updateTask];

View File

@@ -1,108 +0,0 @@
import defineAction from '../../../../helpers/define-action.js';
export default defineAction({
name: 'Update task',
key: 'updateTask',
description: 'Updates an existing task.',
arguments: [
{
label: 'Task List',
key: 'taskListId',
type: 'dropdown',
required: true,
description: '',
variables: true,
source: {
type: 'query',
name: 'getDynamicData',
arguments: [
{
name: 'key',
value: 'listTaskLists',
},
],
},
},
{
label: 'Task',
key: 'taskId',
type: 'dropdown',
required: true,
description: 'Ensure that you choose a list before proceeding.',
variables: true,
dependsOn: ['parameters.taskListId'],
source: {
type: 'query',
name: 'getDynamicData',
arguments: [
{
name: 'key',
value: 'listTasks',
},
{
name: 'parameters.taskListId',
value: '{parameters.taskListId}',
},
],
},
},
{
label: 'Title',
key: 'title',
type: 'string',
required: false,
description: 'Provide a new title for the revised task.',
variables: true,
},
{
label: 'Status',
key: 'status',
type: 'dropdown',
required: false,
description:
'Specify the status of the updated task. If you opt for a custom value, enter either "needsAttention" or "completed."',
variables: true,
options: [
{ label: 'Incomplete', value: 'needsAction' },
{ label: 'Complete', value: 'completed' },
],
},
{
label: 'Notes',
key: 'notes',
type: 'string',
required: false,
description: 'Provide a note for the revised task.',
variables: true,
},
{
label: 'Due Date',
key: 'due',
type: 'string',
required: false,
description:
'Specify the deadline for the task (as a RFC 3339 timestamp).',
variables: true,
},
],
async run($) {
const { taskListId, taskId, title, status, notes, due } = $.step.parameters;
const body = {
title,
status,
notes,
due,
};
const { data } = await $.http.patch(
`/tasks/v1/lists/${taskListId}/tasks/${taskId}`,
body
);
$.setActionItem({
raw: data,
});
},
});

View File

@@ -1,16 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<svg version="1.1"
id="svg8849" inkscape:version="1.1 (c68e22c387, 2021-05-23)" sodipodi:docname="google tasks.svg" xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" width="527.1px" height="500px"
viewBox="0 0 527.1 500" enable-background="new 0 0 527.1 500" xml:space="preserve">
<sodipodi:namedview bordercolor="#eeeeee" borderopacity="1" id="namedview8851" inkscape:bbox-nodes="true" inkscape:bbox-paths="true" inkscape:current-layer="layer1" inkscape:cx="280.62992" inkscape:cy="277.14384" inkscape:document-units="mm" inkscape:object-paths="true" inkscape:pagecheckerboard="0" inkscape:pageopacity="0" inkscape:pageshadow="0" inkscape:snap-bbox="true" inkscape:snap-bbox-edge-midpoints="true" inkscape:snap-bbox-midpoints="true" inkscape:snap-center="true" inkscape:snap-global="true" inkscape:snap-intersection-paths="true" inkscape:snap-midpoints="true" inkscape:snap-object-midpoints="true" inkscape:snap-page="true" inkscape:snap-smooth-nodes="true" inkscape:snap-text-baseline="true" inkscape:window-height="1009" inkscape:window-maximized="1" inkscape:window-width="1920" inkscape:window-x="1912" inkscape:window-y="760" inkscape:zoom="1.4342733" pagecolor="#505050" showgrid="false" units="px">
</sodipodi:namedview>
<g>
<polygon fill="#0066DA" points="410.4,58.3 368.8,81.2 348.2,120.6 368.8,168.8 407.8,211 450,187.5 475.9,142.8 450,87.5 "/>
<path fill="#2684FC" d="M249.3,219.4l98.9-98.9c29.1,22.1,50.5,53.8,59.6,90.4L272.1,346.7c-12.2,12.2-32,12.2-44.2,0l-91.5-91.5
c-9.8-9.8-9.8-25.6,0-35.3l39-39c9.8-9.8,25.6-9.8,35.3,0L249.3,219.4z M519.8,63.6l-39.7-39.7c-9.7-9.7-25.6-9.7-35.3,0
l-34.4,34.4c27.5,23,49.9,51.8,65.5,84.5l43.9-43.9C529.6,89.2,529.6,73.3,519.8,63.6z M412.5,250c0,89.8-72.8,162.5-162.5,162.5
S87.5,339.8,87.5,250S160.2,87.5,250,87.5c36.9,0,70.9,12.3,98.2,33.1l62.2-62.2C367,21.9,311.1,0,250,0C111.9,0,0,111.9,0,250
s111.9,250,250,250s250-111.9,250-250c0-38.3-8.7-74.7-24.1-107.2L407.8,211C410.8,223.5,412.5,236.6,412.5,250z"/>
</g>
</svg>

Before

Width:  |  Height:  |  Size: 2.2 KiB

View File

@@ -1,23 +0,0 @@
import { URLSearchParams } from 'url';
import authScope from '../common/auth-scope.js';
export default async function generateAuthUrl($) {
const oauthRedirectUrlField = $.app.auth.fields.find(
(field) => field.key == 'oAuthRedirectUrl'
);
const redirectUri = oauthRedirectUrlField.value;
const searchParams = new URLSearchParams({
client_id: $.auth.data.clientId,
redirect_uri: redirectUri,
prompt: 'select_account',
scope: authScope.join(' '),
response_type: 'code',
access_type: 'offline',
});
const url = `https://accounts.google.com/o/oauth2/v2/auth?${searchParams.toString()}`;
await $.auth.set({
url,
});
}

View File

@@ -1,48 +0,0 @@
import generateAuthUrl from './generate-auth-url.js';
import verifyCredentials from './verify-credentials.js';
import refreshToken from './refresh-token.js';
import isStillVerified from './is-still-verified.js';
export default {
fields: [
{
key: 'oAuthRedirectUrl',
label: 'OAuth Redirect URL',
type: 'string',
required: true,
readOnly: true,
value: '{WEB_APP_URL}/app/google-tasks/connections/add',
placeholder: null,
description:
'When asked to input a redirect URL in Google Cloud, enter the URL above.',
clickToCopy: true,
},
{
key: 'clientId',
label: 'Client ID',
type: 'string',
required: true,
readOnly: false,
value: null,
placeholder: null,
description: null,
clickToCopy: false,
},
{
key: 'clientSecret',
label: 'Client Secret',
type: 'string',
required: true,
readOnly: false,
value: null,
placeholder: null,
description: null,
clickToCopy: false,
},
],
generateAuthUrl,
verifyCredentials,
isStillVerified,
refreshToken,
};

View File

@@ -1,8 +0,0 @@
import getCurrentUser from '../common/get-current-user.js';
const isStillVerified = async ($) => {
const currentUser = await getCurrentUser($);
return !!currentUser.resourceName;
};
export default isStillVerified;

View File

@@ -1,25 +0,0 @@
import { URLSearchParams } from 'node:url';
import authScope from '../common/auth-scope.js';
const refreshToken = async ($) => {
const params = new URLSearchParams({
client_id: $.auth.data.clientId,
client_secret: $.auth.data.clientSecret,
grant_type: 'refresh_token',
refresh_token: $.auth.data.refreshToken,
});
const { data } = await $.http.post(
'https://oauth2.googleapis.com/token',
params.toString()
);
await $.auth.set({
accessToken: data.access_token,
expiresIn: data.expires_in,
scope: authScope.join(' '),
tokenType: data.token_type,
});
};
export default refreshToken;

View File

@@ -1,42 +0,0 @@
import getCurrentUser from '../common/get-current-user.js';
const verifyCredentials = async ($) => {
const oauthRedirectUrlField = $.app.auth.fields.find(
(field) => field.key == 'oAuthRedirectUrl'
);
const redirectUri = oauthRedirectUrlField.value;
const { data } = await $.http.post(`https://oauth2.googleapis.com/token`, {
client_id: $.auth.data.clientId,
client_secret: $.auth.data.clientSecret,
code: $.auth.data.code,
grant_type: 'authorization_code',
redirect_uri: redirectUri,
});
await $.auth.set({
accessToken: data.access_token,
tokenType: data.token_type,
});
const currentUser = await getCurrentUser($);
const { displayName } = currentUser.names.find(
(name) => name.metadata.primary
);
const { value: email } = currentUser.emailAddresses.find(
(emailAddress) => emailAddress.metadata.primary
);
await $.auth.set({
clientId: $.auth.data.clientId,
clientSecret: $.auth.data.clientSecret,
scope: $.auth.data.scope,
idToken: data.id_token,
expiresIn: data.expires_in,
refreshToken: data.refresh_token,
resourceName: currentUser.resourceName,
screenName: `${displayName} - ${email}`,
});
};
export default verifyCredentials;

View File

@@ -1,9 +0,0 @@
const addAuthHeader = ($, requestConfig) => {
if ($.auth.data?.accessToken) {
requestConfig.headers.Authorization = `${$.auth.data.tokenType} ${$.auth.data.accessToken}`;
}
return requestConfig;
};
export default addAuthHeader;

View File

@@ -1,7 +0,0 @@
const authScope = [
'https://www.googleapis.com/auth/tasks',
'https://www.googleapis.com/auth/userinfo.email',
'https://www.googleapis.com/auth/userinfo.profile',
];
export default authScope;

View File

@@ -1,8 +0,0 @@
const getCurrentUser = async ($) => {
const { data: currentUser } = await $.http.get(
'https://people.googleapis.com/v1/people/me?personFields=names,emailAddresses'
);
return currentUser;
};
export default getCurrentUser;

View File

@@ -1,4 +0,0 @@
import listTaskLists from './list-task-lists/index.js';
import listTasks from './list-tasks/index.js';
export default [listTaskLists, listTasks];

View File

@@ -1,33 +0,0 @@
export default {
name: 'List task lists',
key: 'listTaskLists',
async run($) {
const taskLists = {
data: [],
};
const params = {
maxResults: 100,
pageToken: undefined,
};
do {
const { data } = await $.http.get('/tasks/v1/users/@me/lists', {
params,
});
params.pageToken = data.nextPageToken;
if (data.items) {
for (const taskList of data.items) {
taskLists.data.push({
value: taskList.id,
name: taskList.title,
});
}
}
} while (params.pageToken);
return taskLists;
},
};

View File

@@ -1,40 +0,0 @@
export default {
name: 'List tasks',
key: 'listTasks',
async run($) {
const tasks = {
data: [],
};
const taskListId = $.step.parameters.taskListId;
const params = {
maxResults: 100,
pageToken: undefined,
};
if (!taskListId) {
return tasks;
}
do {
const { data } = await $.http.get(`/tasks/v1/lists/${taskListId}/tasks`, {
params,
});
params.pageToken = data.nextPageToken;
if (data.items) {
for (const task of data.items) {
if (task.title !== '') {
tasks.data.push({
value: task.id,
name: task.title,
});
}
}
}
} while (params.pageToken);
return tasks;
},
};

View File

@@ -1,5 +0,0 @@
import newCompletedTasks from './new-completed-tasks/index.js';
import newTaskLists from './new-task-lists/index.js';
import newTasks from './new-tasks/index.js';
export default [newCompletedTasks, newTaskLists, newTasks];

View File

@@ -1,59 +0,0 @@
import defineTrigger from '../../../../helpers/define-trigger.js';
export default defineTrigger({
name: 'New completed tasks',
key: 'newCompletedTasks',
pollInterval: 15,
description: 'Triggers when a task is finished within a specified task list.',
arguments: [
{
label: 'Task List',
key: 'taskListId',
type: 'dropdown',
required: true,
description: '',
variables: true,
source: {
type: 'query',
name: 'getDynamicData',
arguments: [
{
name: 'key',
value: 'listTaskLists',
},
],
},
},
],
async run($) {
const taskListId = $.step.parameters.taskListId;
const params = {
maxResults: 100,
showCompleted: true,
showHidden: true,
pageToken: undefined,
};
do {
const { data } = await $.http.get(`/tasks/v1/lists/${taskListId}/tasks`, {
params,
});
params.pageToken = data.nextPageToken;
if (data.items?.length) {
for (const task of data.items) {
if (task.status === 'completed') {
$.pushTriggerItem({
raw: task,
meta: {
internalId: task.id,
},
});
}
}
}
} while (params.pageToken);
},
});

View File

@@ -1,31 +0,0 @@
import defineTrigger from '../../../../helpers/define-trigger.js';
export default defineTrigger({
name: 'New task lists',
key: 'newTaskLists',
pollInterval: 15,
description: 'Triggers when a new task list is created.',
async run($) {
const params = {
maxResults: 100,
pageToken: undefined,
};
do {
const { data } = await $.http.get('/tasks/v1/users/@me/lists');
params.pageToken = data.nextPageToken;
if (data.items?.length) {
for (const taskList of data.items.reverse()) {
$.pushTriggerItem({
raw: taskList,
meta: {
internalId: taskList.id,
},
});
}
}
} while (params.pageToken);
},
});

View File

@@ -1,53 +0,0 @@
import defineTrigger from '../../../../helpers/define-trigger.js';
export default defineTrigger({
name: 'New tasks',
key: 'newTasks',
pollInterval: 15,
description: 'Triggers when a new task is created.',
arguments: [
{
label: 'Task List',
key: 'taskListId',
type: 'dropdown',
required: true,
description: '',
variables: true,
source: {
type: 'query',
name: 'getDynamicData',
arguments: [
{
name: 'key',
value: 'listTaskLists',
},
],
},
},
],
async run($) {
const taskListId = $.step.parameters.taskListId;
const params = {
maxResults: 100,
pageToken: undefined,
};
do {
const { data } = await $.http.get(`/tasks/v1/lists/${taskListId}/tasks`);
params.pageToken = data.nextPageToken;
if (data.items?.length) {
for (const task of data.items) {
$.pushTriggerItem({
raw: task,
meta: {
internalId: task.id,
},
});
}
}
} while (params.pageToken);
},
});

View File

@@ -0,0 +1,70 @@
import defineAction from '../../../../helpers/define-action.js';
export default defineAction({
name: 'Create board',
key: 'createBoard',
description: 'Creates a new board.',
arguments: [
{
label: 'Board Name',
key: 'boardName',
type: 'string',
required: true,
description: 'Title for the board.',
variables: true,
},
{
label: 'Board Kind',
key: 'boardKind',
type: 'dropdown',
required: true,
description: '',
variables: true,
options: [
{
label: 'Main',
value: 'public',
},
{
label: 'Private',
value: 'private',
},
{
label: 'Shareable',
value: 'share',
},
],
},
{
label: 'Template ID',
key: 'templateId',
type: 'string',
required: false,
description:
"When you switch on developer mode, you'll spot the template IDs in your template store. Additionally, you have the option to utilize the Board ID from any board you've saved as a template.",
variables: true,
},
],
async run($) {
const { boardName, boardKind, templateId } = $.step.parameters;
const body = {
query: `mutation {
create_board (board_name: "${boardName}", board_kind: ${boardKind}${
templateId ? `, template_id: ${templateId}` : ''
}) {
id
name
board_kind
}
}`,
};
const { data } = await $.http.post('/', body);
$.setActionItem({
raw: data,
});
},
});

View File

@@ -0,0 +1,112 @@
import defineAction from '../../../../helpers/define-action.js';
export default defineAction({
name: 'Create item',
key: 'createItem',
description: 'Creates a new item in a board.',
arguments: [
{
label: 'Board',
key: 'boardId',
type: 'dropdown',
required: true,
description: '',
variables: true,
source: {
type: 'query',
name: 'getDynamicData',
arguments: [
{
name: 'key',
value: 'listBoards',
},
],
},
},
{
label: 'Group',
key: 'groupId',
type: 'dropdown',
required: false,
description: '',
dependsOn: ['parameters.boardId'],
variables: true,
source: {
type: 'query',
name: 'getDynamicData',
arguments: [
{
name: 'key',
value: 'listGroups',
},
{
name: 'parameters.boardId',
value: '{parameters.boardId}',
},
],
},
},
{
label: 'Item Name',
key: 'itemName',
type: 'string',
required: true,
description: '',
variables: true,
},
{
label: 'Subitem Names',
key: 'subitemNames',
type: 'dynamic',
required: false,
description: '',
fields: [
{
label: 'Subitem Name',
key: 'subitemName',
type: 'string',
required: false,
description: '',
variables: true,
},
],
},
],
async run($) {
const { boardId, groupId, itemName, subitemNames } = $.step.parameters;
const allSubitems = subitemNames.map((entry) => entry.subitemName);
const body = {
query: `
mutation {
create_item (board_id: ${boardId}${
groupId ? `, group_id: "${groupId}"` : ''
}, item_name: "${itemName}") {
id
}
}`,
};
const { data } = await $.http.post('/', body);
const itemId = data.data.create_item.id;
for (let subitemName of allSubitems) {
let body = {
query: `
mutation {
create_subitem (parent_item_id:${itemId}, item_name:"${subitemName}") {
id
}
}`,
};
await $.http.post('/', body);
}
$.setActionItem({
raw: data,
});
},
});

View File

@@ -0,0 +1,4 @@
import createBoard from './create-board/index.js';
import createItem from './create-item/index.js';
export default [createBoard, createItem];

View File

@@ -0,0 +1,8 @@
<?xml version="1.0" encoding="UTF-8"?>
<svg width="256px" height="156px" viewBox="0 0 256 156" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" preserveAspectRatio="xMidYMid">
<g>
<path d="M31.8458633,153.488694 C20.3244423,153.513586 9.68073708,147.337265 3.98575204,137.321731 C-1.62714067,127.367831 -1.29055839,115.129325 4.86093879,105.498969 L62.2342919,15.4033556 C68.2125882,5.54538256 79.032489,-0.333585033 90.5563073,0.0146553508 C102.071737,0.290611552 112.546041,6.74705604 117.96667,16.9106216 C123.315033,27.0238906 122.646488,39.1914174 116.240607,48.6847625 L58.9037201,138.780375 C52.9943022,147.988884 42.7873202,153.537154 31.8458633,153.488694 L31.8458633,153.488694 Z" fill="#F62B54"></path>
<path d="M130.25575,153.488484 C118.683837,153.488484 108.035731,147.301291 102.444261,137.358197 C96.8438154,127.431292 97.1804475,115.223704 103.319447,105.620522 L160.583402,15.7315506 C166.47539,5.73210989 177.327374,-0.284878136 188.929728,0.0146553508 C200.598885,0.269918151 211.174058,6.7973526 216.522421,17.0078646 C221.834319,27.2183766 221.056375,39.4588356 214.456008,48.9278699 L157.204209,138.816842 C151.313487,147.985468 141.153618,153.5168 130.25575,153.488484 Z" fill="#FFCC00"></path>
<ellipse fill="#00CA72" cx="226.465527" cy="125.324379" rx="29.5375538" ry="28.9176274"></ellipse>
</g>
</svg>

After

Width:  |  Height:  |  Size: 1.4 KiB

View File

@@ -0,0 +1,21 @@
import verifyCredentials from './verify-credentials.js';
import isStillVerified from './is-still-verified.js';
export default {
fields: [
{
key: 'apiToken',
label: 'API Token',
type: 'string',
required: true,
readOnly: false,
value: null,
placeholder: null,
description: 'Monday.com API token of your account.',
clickToCopy: false,
},
],
verifyCredentials,
isStillVerified,
};

View File

@@ -0,0 +1,18 @@
const verifyCredentials = async ($) => {
const body = {
query: 'query { me { name, email } }',
};
const { data } = await $.http.post('/', body);
const screenName = [data.data.me.name, data.data.me.email]
.filter(Boolean)
.join(' @ ');
await $.auth.set({
screenName,
apiToken: $.auth.data.apiToken,
});
};
export default verifyCredentials;

View File

@@ -1,6 +1,6 @@
const addAuthHeader = ($, requestConfig) => {
if ($.auth.data?.apiKey) {
requestConfig.headers['x-api-key'] = $.auth.data.apiKey;
if ($.auth.data?.apiToken) {
requestConfig.headers.Authorization = $.auth.data.apiToken;
}
return requestConfig;

View File

@@ -0,0 +1,4 @@
import listBoards from './list-boards/index.js';
import listGroups from './list-groups/index.js';
export default [listBoards, listGroups];

View File

@@ -0,0 +1,34 @@
export default {
name: 'List boards',
key: 'listBoards',
async run($) {
const boards = {
data: [],
};
const body = {
query: `
query {
boards {
id
name
}
}
`,
};
const { data } = await $.http.post('/', body);
if (data.data.boards?.length) {
for (const board of data.data.boards) {
boards.data.push({
value: board.id,
name: board.name,
});
}
}
return boards;
},
};

View File

@@ -0,0 +1,40 @@
export default {
name: 'List groups',
key: 'listGroups',
async run($) {
const groups = {
data: [],
};
const boardId = $.step.parameters.parameters.boardId;
if (!boardId) {
return groups;
}
const body = {
query: `query {
boards (ids: ${boardId}) {
groups {
title
id
}
}
}
`,
};
const { data } = await $.http.post('/', body);
if (data.data.boards[0].groups.length) {
for (const group of data.data.boards[0].groups) {
groups.data.push({
value: group.id,
name: group.title,
});
}
}
return groups;
},
};

View File

@@ -1,22 +1,22 @@
import defineApp from '../../helpers/define-app.js';
import addAuthHeader from './common/add-auth-header.js';
import auth from './auth/index.js';
import actions from './actions/index.js';
import triggers from './triggers/index.js';
import actions from './actions/index.js';
import dynamicData from './dynamic-data/index.js';
export default defineApp({
name: 'Google Tasks',
key: 'google-tasks',
baseUrl: 'https://calendar.google.com/calendar/u/0/r/tasks',
apiBaseUrl: 'https://tasks.googleapis.com',
iconUrl: '{BASE_URL}/apps/google-tasks/assets/favicon.svg',
authDocUrl: '{DOCS_URL}/apps/google-tasks/connection',
primaryColor: '0066DA',
name: 'Monday',
key: 'monday',
iconUrl: '{BASE_URL}/apps/monday/assets/favicon.svg',
authDocUrl: '{DOCS_URL}/apps/monday/connection',
supportsConnections: true,
baseUrl: 'https://monday.com',
apiBaseUrl: 'https://api.monday.com/v2',
primaryColor: 'F62B54',
beforeRequest: [addAuthHeader],
auth,
triggers,
actions,
dynamicData,
triggers,
});

View File

@@ -0,0 +1,3 @@
import newBoards from './new-boards/index.js';
export default [newBoards];

View File

@@ -0,0 +1,29 @@
import defineTrigger from '../../../../helpers/define-trigger.js';
export default defineTrigger({
name: 'New board',
key: 'newBoard',
pollInterval: 15,
description: 'Triggers when a new board is created.',
async run($) {
const body = {
query: 'query { boards { id, name } }',
};
const { data } = await $.http.post('/', body);
if (!data?.data?.boards?.length) {
return;
}
for (const board of data.data.boards) {
$.pushTriggerItem({
raw: board,
meta: {
internalId: board.id,
},
});
}
},
});

View File

@@ -1,408 +0,0 @@
export const fields = [
{
label: 'Summary',
key: 'summary',
type: 'string',
required: true,
description: '',
variables: true,
},
{
label: 'Record Currency',
key: 'recordCurrencyId',
type: 'dropdown',
required: false,
description: '',
variables: true,
source: {
type: 'query',
name: 'getDynamicData',
arguments: [
{
name: 'key',
value: 'listRecordCurrencies',
},
],
},
},
{
label: 'Case Title',
key: 'caseTitle',
type: 'string',
required: true,
description: '',
variables: true,
},
{
label: 'Status',
key: 'status',
type: 'dropdown',
required: true,
description: '',
variables: true,
source: {
type: 'query',
name: 'getDynamicData',
arguments: [
{
name: 'key',
value: 'listCaseOptions',
},
{
name: 'parameters.status',
value: 'casestatus',
},
],
},
},
{
label: 'Priority',
key: 'priority',
type: 'dropdown',
required: true,
description: '',
variables: true,
source: {
type: 'query',
name: 'getDynamicData',
arguments: [
{
name: 'key',
value: 'listCaseOptions',
},
{
name: 'parameters.priority',
value: 'casepriority',
},
],
},
},
{
label: 'Contact',
key: 'contactId',
type: 'dropdown',
required: true,
description: '',
variables: true,
source: {
type: 'query',
name: 'getDynamicData',
arguments: [
{
name: 'key',
value: 'listContacts',
},
],
},
},
{
label: 'Organization',
key: 'organizationId',
type: 'dropdown',
required: false,
description: '',
variables: true,
source: {
type: 'query',
name: 'getDynamicData',
arguments: [
{
name: 'key',
value: 'listOrganizations',
},
],
},
},
{
label: 'Group',
key: 'groupId',
type: 'dropdown',
required: false,
description: '',
variables: true,
source: {
type: 'query',
name: 'getDynamicData',
arguments: [
{
name: 'key',
value: 'listGroups',
},
],
},
},
{
label: 'Assigned To',
key: 'assignedTo',
type: 'string',
required: false,
description: '',
variables: true,
},
{
label: 'Product',
key: 'productId',
type: 'dropdown',
required: false,
description: '',
variables: true,
source: {
type: 'query',
name: 'getDynamicData',
arguments: [
{
name: 'key',
value: 'listProducts',
},
],
},
},
{
label: 'Channel',
key: 'channel',
type: 'dropdown',
required: false,
description: '',
variables: true,
source: {
type: 'query',
name: 'getDynamicData',
arguments: [
{
name: 'key',
value: 'listCaseOptions',
},
{
name: 'parameters.channel',
value: 'casechannel',
},
],
},
},
{
label: 'Resolution',
key: 'resolution',
type: 'string',
required: false,
description: '',
variables: true,
},
{
label: 'Category',
key: 'category',
type: 'dropdown',
required: false,
description: '',
variables: true,
source: {
type: 'query',
name: 'getDynamicData',
arguments: [
{
name: 'key',
value: 'listCaseOptions',
},
{
name: 'parameters.category',
value: 'impact_type',
},
],
},
},
{
label: 'Sub Category',
key: 'subCategory',
type: 'dropdown',
required: false,
description: '',
variables: true,
source: {
type: 'query',
name: 'getDynamicData',
arguments: [
{
name: 'key',
value: 'listCaseOptions',
},
{
name: 'parameters.subCategory',
value: 'impact_area',
},
],
},
},
{
label: 'Resolution Type',
key: 'resolutionType',
type: 'dropdown',
required: false,
description: '',
variables: true,
source: {
type: 'query',
name: 'getDynamicData',
arguments: [
{
name: 'key',
value: 'listCaseOptions',
},
{
name: 'parameters.resolutionType',
value: 'resolution_type',
},
],
},
},
{
label: 'Deferred Date',
key: 'deferredDate',
type: 'string',
required: false,
description: 'format: yyyy-mm-dd',
variables: true,
},
{
label: 'Service Contract',
key: 'serviceContractId',
type: 'dropdown',
required: false,
description: '',
variables: true,
source: {
type: 'query',
name: 'getDynamicData',
arguments: [
{
name: 'key',
value: 'listServiceContracts',
},
],
},
},
{
label: 'Asset',
key: 'assetId',
type: 'dropdown',
required: false,
description: '',
variables: true,
source: {
type: 'query',
name: 'getDynamicData',
arguments: [
{
name: 'key',
value: 'listAssets',
},
],
},
},
{
label: 'SLA',
key: 'slaId',
type: 'dropdown',
required: false,
description: '',
variables: true,
source: {
type: 'query',
name: 'getDynamicData',
arguments: [
{
name: 'key',
value: 'listSlaNames',
},
],
},
},
{
label: 'Is Billable',
key: 'isBillable',
type: 'dropdown',
required: false,
description: '',
variables: true,
options: [
{ label: 'True', value: '1' },
{ label: 'False', value: '-1' },
],
},
{
label: 'Service',
key: 'service',
type: 'dropdown',
required: false,
description: '',
variables: true,
source: {
type: 'query',
name: 'getDynamicData',
arguments: [
{
name: 'key',
value: 'listServices',
},
],
},
},
{
label: 'Rate',
key: 'rate',
type: 'string',
required: false,
description: '',
variables: true,
},
{
label: 'Service Type',
key: 'serviceType',
type: 'dropdown',
required: false,
description: '',
variables: true,
source: {
type: 'query',
name: 'getDynamicData',
arguments: [
{
name: 'key',
value: 'listCaseOptions',
},
{
name: 'parameters.serviceType',
value: 'servicetype',
},
],
},
},
{
label: 'Service Location',
key: 'serviceLocation',
type: 'dropdown',
required: false,
description: '',
variables: true,
source: {
type: 'query',
name: 'getDynamicData',
arguments: [
{
name: 'key',
value: 'listCaseOptions',
},
{
name: 'parameters.serviceLocation',
value: 'servicelocation',
},
],
},
},
{
label: 'Work Location',
key: 'workLocation',
type: 'string',
required: false,
description: '',
variables: true,
},
];

View File

@@ -1,78 +0,0 @@
import defineAction from '../../../../helpers/define-action.js';
import { fields } from './fields.js';
export default defineAction({
name: 'Create case',
key: 'createCase',
description: 'Create a new case.',
arguments: fields,
async run($) {
const {
summary,
recordCurrencyId,
caseTitle,
status,
priority,
contactId,
organizationId,
groupId,
assignedTo,
productId,
channel,
resolution,
category,
subCategory,
resolutionType,
deferredDate,
serviceContractId,
assetId,
slaId,
isBillable,
service,
rate,
serviceType,
serviceLocation,
workLocation,
} = $.step.parameters;
const elementData = {
description: summary,
record_currency_id: recordCurrencyId,
title: caseTitle,
casestatus: status,
casepriority: priority,
contact_id: contactId,
parent_id: organizationId,
group_id: groupId,
assigned_user_id: assignedTo,
product_id: productId,
casechannel: channel,
resolution: resolution,
impact_type: category,
impact_area: subCategory,
resolution_type: resolutionType,
deferred_date: deferredDate,
servicecontract_id: serviceContractId,
asset_id: assetId,
slaid: slaId,
is_billable: isBillable,
billing_service: service,
rate: rate,
servicetype: serviceType,
servicelocation: serviceLocation,
work_location: workLocation,
};
const body = {
operation: 'create',
sessionName: $.auth.data.sessionName,
element: JSON.stringify(elementData),
elementType: 'Cases',
};
const response = await $.http.post('/webservice.php', body);
$.setActionItem({ raw: response.data });
},
});

View File

@@ -1,649 +0,0 @@
export const fields = [
{
label: 'Salutation',
key: 'salutation',
type: 'dropdown',
required: false,
description: '',
variables: true,
options: [
{ label: 'Mr.', value: 'Mr.' },
{ label: 'Ms.', value: 'Ms.' },
{ label: 'Mrs.', value: 'Mrs.' },
{ label: 'Dr.', value: 'Dr.' },
{ label: 'Prof.', value: 'Prof.' },
],
},
{
label: 'First Name',
key: 'firstName',
type: 'string',
required: false,
description: '',
variables: true,
},
{
label: 'Last Name',
key: 'lastName',
type: 'string',
required: true,
description: '',
variables: true,
},
{
label: 'Primary Email',
key: 'primaryEmail',
type: 'string',
required: false,
description: '',
variables: true,
},
{
label: 'Office Phone',
key: 'officePhone',
type: 'string',
required: false,
description: '',
variables: true,
},
{
label: 'Mobile Phone',
key: 'mobilePhone',
type: 'string',
required: false,
description: '',
variables: true,
},
{
label: 'Home Phone',
key: 'homePhone',
type: 'string',
required: false,
description: '',
variables: true,
},
{
label: 'Date of Birth',
key: 'dateOfBirth',
type: 'string',
required: false,
description: 'format: yyyy-mm-dd',
variables: true,
},
{
label: 'Fax',
key: 'fax',
type: 'string',
required: false,
description: '',
variables: true,
},
{
label: 'Organization',
key: 'organizationId',
type: 'dropdown',
required: false,
description: '',
variables: true,
source: {
type: 'query',
name: 'getDynamicData',
arguments: [
{
name: 'key',
value: 'listOrganizations',
},
],
},
},
{
label: 'Title',
key: 'title',
type: 'dropdown',
required: false,
description: '',
variables: true,
source: {
type: 'query',
name: 'getDynamicData',
arguments: [
{
name: 'key',
value: 'listContactOptions',
},
{
name: 'parameters.title',
value: 'listContactOptions',
},
],
},
},
{
label: 'Department',
key: 'department',
type: 'string',
required: false,
description: '',
variables: true,
},
{
label: 'Reports To',
key: 'reportsTo',
type: 'dropdown',
required: false,
description: '',
variables: true,
source: {
type: 'query',
name: 'getDynamicData',
arguments: [
{
name: 'key',
value: 'listContacts',
},
],
},
},
{
label: 'Lead Source',
key: 'leadSource',
type: 'dropdown',
required: false,
description: '',
variables: true,
source: {
type: 'query',
name: 'getDynamicData',
arguments: [
{
name: 'key',
value: 'listContactOptions',
},
{
name: 'parameters.leadSource',
value: 'leadsource',
},
],
},
},
{
label: 'Secondary Email',
key: 'secondaryEmail',
type: 'string',
required: false,
description: '',
variables: true,
},
{
label: 'Assigned To',
key: 'assignedTo',
type: 'string',
required: false,
description: '',
variables: true,
},
{
label: 'Do Not Call',
key: 'doNotCall',
type: 'dropdown',
required: false,
description: '',
variables: true,
options: [
{ label: 'True', value: '1' },
{ label: 'False', value: '-1' },
],
},
{
label: 'Notify Owner',
key: 'notifyOwner',
type: 'dropdown',
required: false,
description: '',
variables: true,
options: [
{ label: 'True', value: '1' },
{ label: 'False', value: '-1' },
],
},
{
label: 'Twitter Username',
key: 'twitterUsername',
type: 'string',
required: false,
description: '',
variables: true,
},
{
label: 'SLA',
key: 'slaId',
type: 'dropdown',
required: false,
description: '',
variables: true,
source: {
type: 'query',
name: 'getDynamicData',
arguments: [
{
name: 'key',
value: 'listSlaNames',
},
],
},
},
{
label: 'Lifecycle Stage',
key: 'lifecycleStage',
type: 'dropdown',
required: false,
description: '',
variables: true,
source: {
type: 'query',
name: 'getDynamicData',
arguments: [
{
name: 'key',
value: 'listContactOptions',
},
{
name: 'parameters.lifecycleStage',
value: 'contacttype',
},
],
},
},
{
label: 'Status',
key: 'status',
type: 'dropdown',
required: false,
description: '',
variables: true,
source: {
type: 'query',
name: 'getDynamicData',
arguments: [
{
name: 'key',
value: 'listContactOptions',
},
{
name: 'parameters.status',
value: 'contactstatus',
},
],
},
},
{
label: 'Happiness Rating',
key: 'happinessRating',
type: 'dropdown',
required: false,
description: '',
variables: true,
source: {
type: 'query',
name: 'getDynamicData',
arguments: [
{
name: 'key',
value: 'listContactOptions',
},
{
name: 'parameters.happinessRating',
value: 'happiness_rating',
},
],
},
},
{
label: 'Record Currency',
key: 'recordCurrencyId',
type: 'dropdown',
required: false,
description: '',
variables: true,
source: {
type: 'query',
name: 'getDynamicData',
arguments: [
{
name: 'key',
value: 'listRecordCurrencies',
},
],
},
},
{
label: 'Referred By',
key: 'referredBy',
type: 'dropdown',
required: false,
description: '',
variables: true,
source: {
type: 'query',
name: 'getDynamicData',
arguments: [
{
name: 'key',
value: 'listContacts',
},
],
},
},
{
label: 'Email Opt-in',
key: 'emailOptin',
type: 'dropdown',
required: false,
description: '',
variables: true,
source: {
type: 'query',
name: 'getDynamicData',
arguments: [
{
name: 'key',
value: 'listContactOptions',
},
{
name: 'parameters.emailOptin',
value: 'emailoptin',
},
],
},
},
{
label: 'SMS Opt-in',
key: 'smsOptin',
type: 'dropdown',
required: false,
description: '',
variables: true,
source: {
type: 'query',
name: 'getDynamicData',
arguments: [
{
name: 'key',
value: 'listContactOptions',
},
{
name: 'parameters.smsOptin',
value: 'smsoptin',
},
],
},
},
{
label: 'Language',
key: 'language',
type: 'dropdown',
required: false,
description: '',
variables: true,
source: {
type: 'query',
name: 'getDynamicData',
arguments: [
{
name: 'key',
value: 'listContactOptions',
},
{
name: 'parameters.language',
value: 'language',
},
],
},
},
{
label: 'Source Campaign',
key: 'sourceCampaignId',
type: 'dropdown',
required: false,
description: '',
variables: true,
source: {
type: 'query',
name: 'getDynamicData',
arguments: [
{
name: 'key',
value: 'listCampaignSources',
},
],
},
},
{
label: 'Portal User',
key: 'portalUser',
type: 'dropdown',
required: false,
description: '',
variables: true,
options: [
{ label: 'True', value: '1' },
{ label: 'False', value: '-1' },
],
},
{
label: 'Support Start Date',
key: 'supportStartDate',
type: 'string',
required: false,
description: 'format: yyyy-mm-dd',
variables: true,
},
{
label: 'Support End Date',
key: 'supportEndDate',
type: 'string',
required: false,
description: 'format: yyyy-mm-dd',
variables: true,
},
{
label: 'Other Country',
key: 'otherCountry',
type: 'dropdown',
required: false,
description: '',
variables: true,
source: {
type: 'query',
name: 'getDynamicData',
arguments: [
{
name: 'key',
value: 'listContactOptions',
},
{
name: 'parameters.otherCountry',
value: 'othercountry',
},
],
},
},
{
label: 'Mailing Country',
key: 'mailingCountry',
type: 'dropdown',
required: false,
description: '',
variables: true,
source: {
type: 'query',
name: 'getDynamicData',
arguments: [
{
name: 'key',
value: 'listContactOptions',
},
{
name: 'parameters.mailingCountry',
value: 'mailingcountry',
},
],
},
},
{
label: 'Mailing Street',
key: 'mailingStreet',
type: 'string',
required: false,
description: '',
variables: true,
},
{
label: 'Other Street',
key: 'otherStreet',
type: 'string',
required: false,
description: '',
variables: true,
},
{
label: 'Mailing PO Box',
key: 'mailingPoBox',
type: 'string',
required: false,
description: '',
variables: true,
},
{
label: 'Other PO Box',
key: 'otherPoBox',
type: 'string',
required: false,
description: '',
variables: true,
},
{
label: 'Mailing City',
key: 'mailingCity',
type: 'string',
required: false,
description: '',
variables: true,
},
{
label: 'Other City',
key: 'otherCity',
type: 'string',
required: false,
description: '',
variables: true,
},
{
label: 'Mailing State',
key: 'mailingState',
type: 'dropdown',
required: false,
description: '',
variables: true,
source: {
type: 'query',
name: 'getDynamicData',
arguments: [
{
name: 'key',
value: 'listContactOptions',
},
{
name: 'parameters.mailingState',
value: 'mailingstate',
},
],
},
},
{
label: 'Other State',
key: 'otherState',
type: 'dropdown',
required: false,
description: '',
variables: true,
source: {
type: 'query',
name: 'getDynamicData',
arguments: [
{
name: 'key',
value: 'listContactOptions',
},
{
name: 'parameters.otherState',
value: 'otherstate',
},
],
},
},
{
label: 'Mailing Zip',
key: 'mailingZip',
type: 'string',
required: false,
description: '',
variables: true,
},
{
label: 'Other Zip',
key: 'otherZip',
type: 'string',
required: false,
description: '',
variables: true,
},
{
label: 'Description',
key: 'description',
type: 'string',
required: false,
description: '',
variables: true,
},
{
label: 'Contact Image',
key: 'contactImage',
type: 'string',
required: false,
description: '',
variables: true,
},
{
label: 'Linkedin URL',
key: 'linkedinUrl',
type: 'string',
required: false,
description: '',
variables: true,
},
{
label: 'Linkedin Followers',
key: 'linkedinFollowers',
type: 'string',
required: false,
description: '',
variables: true,
},
{
label: 'Facebook URL',
key: 'facebookUrl',
type: 'string',
required: false,
description: '',
variables: true,
},
{
label: 'Facebook Followers',
key: 'facebookFollowers',
type: 'string',
required: false,
description: '',
variables: true,
},
];

View File

@@ -1,129 +0,0 @@
import defineAction from '../../../../helpers/define-action.js';
import { fields } from './fields.js';
export default defineAction({
name: 'Create contact',
key: 'createContact',
description: 'Create a new contact.',
arguments: fields,
async run($) {
const {
salutation,
firstName,
lastName,
primaryEmail,
officePhone,
mobilePhone,
homePhone,
dateOfBirth,
fax,
organizationId,
title,
department,
reportsTo,
leadSource,
secondaryEmail,
assignedTo,
doNotCall,
notifyOwner,
twitterUsername,
slaId,
lifecycleStage,
status,
happinessRating,
recordCurrencyId,
referredBy,
emailOptin,
smsOptin,
language,
sourceCampaignId,
portalUser,
supportStartDate,
supportEndDate,
otherCountry,
mailingCountry,
mailingStreet,
otherStreet,
mailingPoBox,
otherPoBox,
mailingCity,
otherCity,
mailingState,
otherState,
mailingZip,
otherZip,
description,
contactImage,
linkedinUrl,
linkedinFollowers,
facebookUrl,
facebookFollowers,
} = $.step.parameters;
const elementData = {
salutationtype: salutation,
firstname: firstName,
lastname: lastName,
email: primaryEmail,
phone: officePhone,
mobile: mobilePhone,
homephone: homePhone,
birthday: dateOfBirth,
fax: fax,
account_id: organizationId,
title: title,
department: department,
contact_id: reportsTo,
leadsource: leadSource,
secondaryemail: secondaryEmail,
assigned_user_id: assignedTo || $.auth.data.userId,
donotcall: doNotCall,
notify_owner: notifyOwner,
emailoptout: emailOptin,
primary_twitter: twitterUsername,
slaid: slaId,
contacttype: lifecycleStage,
contactstatus: status,
happiness_rating: happinessRating,
record_currency_id: recordCurrencyId,
referred_by: referredBy,
emailoptin: emailOptin,
smsoptin: smsOptin,
language: language,
source_campaign: sourceCampaignId,
portal: portalUser,
support_start_date: supportStartDate,
support_end_date: supportEndDate,
othercountry: otherCountry,
mailingcountry: mailingCountry,
mailingstreet: mailingStreet,
otherstreet: otherStreet,
mailingpobox: mailingPoBox,
otherpobox: otherPoBox,
mailingcity: mailingCity,
othercity: otherCity,
mailingstate: mailingState,
otherstate: otherState,
mailingzip: mailingZip,
otherzip: otherZip,
description: description,
imagename: contactImage,
primary_linkedin: linkedinUrl,
followers_linkedin: linkedinFollowers,
primary_facebook: facebookUrl,
followers_facebook: facebookFollowers,
};
const body = {
operation: 'create',
sessionName: $.auth.data.sessionName,
element: JSON.stringify(elementData),
elementType: 'Contacts',
};
const response = await $.http.post('/webservice.php', body);
$.setActionItem({ raw: response.data });
},
});

View File

@@ -1,395 +0,0 @@
export const fields = [
{
label: 'Salutation',
key: 'salutation',
type: 'dropdown',
required: false,
description: '',
variables: true,
options: [
{ label: 'Mr.', value: 'Mr.' },
{ label: 'Ms.', value: 'Ms.' },
{ label: 'Mrs.', value: 'Mrs.' },
{ label: 'Dr.', value: 'Dr.' },
{ label: 'Prof.', value: 'Prof.' },
],
},
{
label: 'First Name',
key: 'firstName',
type: 'string',
required: false,
description: '',
variables: true,
},
{
label: 'Last Name',
key: 'lastName',
type: 'string',
required: true,
description: '',
variables: true,
},
{
label: 'Company',
key: 'company',
type: 'string',
required: false,
description: '',
variables: true,
},
{
label: 'Primary Email',
key: 'primaryEmail',
type: 'string',
required: false,
description: '',
variables: true,
},
{
label: 'Office Phone',
key: 'officePhone',
type: 'string',
required: false,
description: '',
variables: true,
},
{
label: 'Designation',
key: 'designation',
type: 'dropdown',
required: false,
description: '',
variables: true,
source: {
type: 'query',
name: 'getDynamicData',
arguments: [
{
name: 'key',
value: 'listLeadOptions',
},
{
name: 'parameters.designation',
value: 'designation',
},
],
},
},
{
label: 'Mobile Phone',
key: 'mobilePhone',
type: 'string',
required: false,
description: '',
variables: true,
},
{
label: 'Industry',
key: 'industry',
type: 'dropdown',
required: false,
description: '',
variables: true,
source: {
type: 'query',
name: 'getDynamicData',
arguments: [
{
name: 'key',
value: 'listLeadOptions',
},
{
name: 'parameters.industry',
value: 'industry',
},
],
},
},
{
label: 'Website',
key: 'website',
type: 'string',
required: false,
description: '',
variables: true,
},
{
label: 'Annual Revenue',
key: 'annualRevenue',
type: 'string',
required: false,
description: '',
variables: true,
},
{
label: 'Lead Source',
key: 'leadSource',
type: 'dropdown',
required: false,
description: '',
variables: true,
source: {
type: 'query',
name: 'getDynamicData',
arguments: [
{
name: 'key',
value: 'listLeadOptions',
},
{
name: 'parameters.leadSource',
value: 'leadsource',
},
],
},
},
{
label: 'Lead Status',
key: 'leadStatus',
type: 'dropdown',
required: false,
description: '',
variables: true,
source: {
type: 'query',
name: 'getDynamicData',
arguments: [
{
name: 'key',
value: 'listLeadOptions',
},
{
name: 'parameters.leadStatus',
value: 'leadstatus',
},
],
},
},
{
label: 'Assigned To',
key: 'assignedTo',
type: 'string',
required: false,
description: '',
variables: true,
},
{
label: 'Fax',
key: 'fax',
type: 'string',
required: false,
description: '',
variables: true,
},
{
label: 'Number of Employees',
key: 'numberOfEmployees',
type: 'string',
required: false,
description: '',
variables: true,
},
{
label: 'Twitter Username',
key: 'twitterUsername',
type: 'string',
required: false,
description: '',
variables: true,
},
{
label: 'Record Currency',
key: 'recordCurrencyId',
type: 'dropdown',
required: false,
description: '',
variables: true,
source: {
type: 'query',
name: 'getDynamicData',
arguments: [
{
name: 'key',
value: 'listRecordCurrencies',
},
],
},
},
{
label: 'Email Opt-in',
key: 'emailOptin',
type: 'dropdown',
required: false,
description: '',
variables: true,
source: {
type: 'query',
name: 'getDynamicData',
arguments: [
{
name: 'key',
value: 'listLeadOptions',
},
{
name: 'parameters.emailOptin',
value: 'emailoptin',
},
],
},
},
{
label: 'SMS Opt-in',
key: 'smsOptin',
type: 'dropdown',
required: false,
description: '',
variables: true,
source: {
type: 'query',
name: 'getDynamicData',
arguments: [
{
name: 'key',
value: 'listLeadOptions',
},
{
name: 'parameters.smsOptin',
value: 'smsoptin',
},
],
},
},
{
label: 'Language',
key: 'language',
type: 'dropdown',
required: false,
description: '',
variables: true,
source: {
type: 'query',
name: 'getDynamicData',
arguments: [
{
name: 'key',
value: 'listLeadOptions',
},
{
name: 'parameters.language',
value: 'language',
},
],
},
},
{
label: 'Source Campaign',
key: 'sourceCampaignId',
type: 'dropdown',
required: false,
description: '',
variables: true,
source: {
type: 'query',
name: 'getDynamicData',
arguments: [
{
name: 'key',
value: 'listCampaignSources',
},
],
},
},
{
label: 'Country',
key: 'country',
type: 'dropdown',
required: false,
description: '',
variables: true,
source: {
type: 'query',
name: 'getDynamicData',
arguments: [
{
name: 'key',
value: 'listLeadOptions',
},
{
name: 'parameters.country',
value: 'country',
},
],
},
},
{
label: 'Street',
key: 'street',
type: 'string',
required: false,
description: '',
variables: true,
},
{
label: 'PO Box',
key: 'poBox',
type: 'string',
required: false,
description: '',
variables: true,
},
{
label: 'Postal Code',
key: 'postalCode',
type: 'string',
required: false,
description: '',
variables: true,
},
{
label: 'City',
key: 'city',
type: 'string',
required: false,
description: '',
variables: true,
},
{
label: 'State',
key: 'state',
type: 'dropdown',
required: false,
description: '',
variables: true,
source: {
type: 'query',
name: 'getDynamicData',
arguments: [
{
name: 'key',
value: 'listLeadOptions',
},
{
name: 'parameters.state',
value: 'state',
},
],
},
},
{
label: 'Description',
key: 'description',
type: 'string',
required: false,
description: '',
variables: true,
},
{
label: 'Lead Image',
key: 'leadImage',
type: 'string',
required: false,
description: '',
variables: true,
},
];

View File

@@ -1,88 +0,0 @@
import defineAction from '../../../../helpers/define-action.js';
import { fields } from './fields.js';
export default defineAction({
name: 'Create lead',
key: 'createLead',
description: 'Create a new lead.',
arguments: fields,
async run($) {
const {
salutation,
firstName,
lastName,
company,
primaryEmail,
officePhone,
designation,
mobilePhone,
industry,
website,
annualRevenue,
leadSource,
leadStatus,
assignedTo,
fax,
numberOfEmployees,
twitterUsername,
recordCurrencyId,
emailOptin,
smsOptin,
language,
sourceCampaignId,
country,
street,
poBox,
postalCode,
city,
state,
description,
leadImage,
} = $.step.parameters;
const elementData = {
salutationtype: salutation,
firstname: firstName,
lastname: lastName,
company: company,
email: primaryEmail,
phone: officePhone,
designation: designation,
mobile: mobilePhone,
industry: industry,
website: website,
annualrevenue: annualRevenue,
leadsource: leadSource,
leadstatus: leadStatus,
assigned_user_id: assignedTo || $.auth.data.userId,
fax: fax,
noofemployees: numberOfEmployees,
primary_twitter: twitterUsername,
record_currency_id: recordCurrencyId,
emailoptin: emailOptin,
smsoptin: smsOptin,
language: language,
source_campaign: sourceCampaignId,
country: country,
lane: street,
pobox: poBox,
code: postalCode,
city: city,
state: state,
description: description,
imagename: leadImage,
};
const body = {
operation: 'create',
sessionName: $.auth.data.sessionName,
element: JSON.stringify(elementData),
elementType: 'Leads',
};
const response = await $.http.post('/webservice.php', body);
$.setActionItem({ raw: response.data });
},
});

View File

@@ -1,244 +0,0 @@
export const fields = [
{
label: 'Deal Name',
key: 'dealName',
type: 'string',
required: true,
description: '',
variables: true,
},
{
label: 'Amount',
key: 'amount',
type: 'string',
required: false,
description: '',
variables: true,
},
{
label: 'Organization',
key: 'organizationId',
type: 'dropdown',
required: false,
description: '',
variables: true,
source: {
type: 'query',
name: 'getDynamicData',
arguments: [
{
name: 'key',
value: 'listOrganizations',
},
],
},
},
{
label: 'Contact',
key: 'contactId',
type: 'dropdown',
required: false,
description: '',
variables: true,
source: {
type: 'query',
name: 'getDynamicData',
arguments: [
{
name: 'key',
value: 'listContacts',
},
],
},
},
{
label: 'Expected Close Date',
key: 'expectedCloseDate',
type: 'string',
required: true,
description: 'Format: yyyy-mm-dd',
variables: true,
},
{
label: 'Pipeline',
key: 'pipeline',
type: 'dropdown',
required: true,
value: 'Standart',
description: '',
variables: true,
options: [{ label: 'Standart', value: 'Standart' }],
},
{
label: 'Sales Stage',
key: 'salesStage',
type: 'dropdown',
required: false,
description: '',
variables: true,
source: {
type: 'query',
name: 'getDynamicData',
arguments: [
{
name: 'key',
value: 'listOpportunityOptions',
},
{
name: 'parameters.salesStage',
value: 'sales_stage',
},
],
},
},
{
label: 'Assigned To',
key: 'assignedTo',
type: 'string',
required: false,
description: 'Default is the id of the account connected to Automatisch.',
variables: true,
},
{
label: 'Lead Source',
key: 'leadSource',
type: 'dropdown',
required: false,
description: '',
variables: true,
source: {
type: 'query',
name: 'getDynamicData',
arguments: [
{
name: 'key',
value: 'listOpportunityOptions',
},
{
name: 'parameters.leadSource',
value: 'leadsource',
},
],
},
},
{
label: 'Next Step',
key: 'nextStep',
type: 'string',
required: false,
description: '',
variables: true,
},
{
label: 'Type',
key: 'type',
type: 'dropdown',
required: false,
description: '',
variables: true,
source: {
type: 'query',
name: 'getDynamicData',
arguments: [
{
name: 'key',
value: 'listOpportunityOptions',
},
{
name: 'parameters.type',
value: 'opportunity_type',
},
],
},
},
{
label: 'Probability',
key: 'probability',
type: 'string',
required: false,
description: '',
variables: true,
},
{
label: 'Campaign Source',
key: 'campaignSourceId',
type: 'dropdown',
required: false,
description: '',
variables: true,
source: {
type: 'query',
name: 'getDynamicData',
arguments: [
{
name: 'key',
value: 'listCampaignSources',
},
],
},
},
{
label: 'Weighted Revenue',
key: 'weightedRevenue',
type: 'string',
required: false,
description: '',
variables: true,
},
{
label: 'Adjusted Amount',
key: 'adjustedAmount',
type: 'string',
required: false,
description: '',
variables: true,
},
{
label: 'Lost Reason',
key: 'lostReason',
type: 'dropdown',
required: false,
description: '',
variables: true,
source: {
type: 'query',
name: 'getDynamicData',
arguments: [
{
name: 'key',
value: 'listOpportunityOptions',
},
{
name: 'parameters.lostReason',
value: 'lost_reason',
},
],
},
},
{
label: 'Record Currency',
key: 'recordCurrencyId',
type: 'dropdown',
required: false,
description: '',
variables: true,
source: {
type: 'query',
name: 'getDynamicData',
arguments: [
{
name: 'key',
value: 'listRecordCurrencies',
},
],
},
},
{
label: 'Description',
key: 'description',
type: 'string',
required: false,
description: '',
variables: true,
},
];

View File

@@ -1,64 +0,0 @@
import defineAction from '../../../../helpers/define-action.js';
import { fields } from './fields.js';
export default defineAction({
name: 'Create opportunity',
key: 'createOpportunity',
description: 'Create a new opportunity.',
arguments: fields,
async run($) {
const {
dealName,
amount,
organizationId,
contactId,
expectedCloseDate,
pipeline,
salesStage,
assignedTo,
leadSource,
nextStep,
type,
probability,
campaignSourceId,
weightedRevenue,
adjustedAmount,
lostReason,
recordCurrencyId,
description,
} = $.step.parameters;
const elementData = {
potentialname: dealName,
amount,
related_to: organizationId,
contact_id: contactId,
closingdate: expectedCloseDate,
pipeline,
sales_stage: salesStage,
assigned_user_id: assignedTo || $.auth.data.userId,
leadsource: leadSource,
nextstep: nextStep,
opportunity_type: type,
probability: probability,
campaignid: campaignSourceId,
forecast_amount: weightedRevenue,
adjusted_amount: adjustedAmount,
lost_reason: lostReason,
record_currency_id: recordCurrencyId,
description,
};
const body = {
operation: 'create',
sessionName: $.auth.data.sessionName,
element: JSON.stringify(elementData),
elementType: 'Potentials',
};
const response = await $.http.post('/webservice.php', body);
$.setActionItem({ raw: response.data });
},
});

View File

@@ -1,357 +0,0 @@
export const fields = [
{
label: 'Name',
key: 'name',
type: 'string',
required: true,
description: '',
variables: true,
},
{
label: 'Assigned To',
key: 'assignedTo',
type: 'string',
required: false,
description: 'Default is the id of the account connected to Automatisch.',
variables: true,
},
{
label: 'Start Date & Time',
key: 'startDateAndTime',
type: 'string',
required: false,
description: 'Format: yyyy-mm-dd',
variables: true,
},
{
label: 'Due Date',
key: 'dueDate',
type: 'string',
required: false,
description: 'Format: yyyy-mm-dd',
variables: true,
},
{
label: 'Stage',
key: 'stage',
type: 'dropdown',
required: true,
description: '',
variables: true,
source: {
type: 'query',
name: 'getDynamicData',
arguments: [
{
name: 'key',
value: 'listTodoOptions',
},
{
name: 'parameters.stage',
value: 'taskstatus',
},
],
},
},
{
label: 'Contact',
key: 'contactId',
type: 'dropdown',
required: false,
description: '',
variables: true,
source: {
type: 'query',
name: 'getDynamicData',
arguments: [
{
name: 'key',
value: 'listContacts',
},
],
},
},
{
label: 'Priority',
key: 'priority',
type: 'dropdown',
required: true,
description: '',
variables: true,
options: [
{ label: 'High', value: 'High' },
{ label: 'Medium', value: 'Medium' },
{ label: 'Low', value: 'Low' },
],
},
{
label: 'Send Notification',
key: 'sendNotification',
type: 'dropdown',
required: false,
description: '',
variables: true,
options: [
{ label: 'True', value: 'true' },
{ label: 'False', value: 'false' },
],
},
{
label: 'Location',
key: 'location',
type: 'string',
required: false,
description: '',
variables: true,
},
{
label: 'Record Currency',
key: 'recordCurrencyId',
type: 'dropdown',
required: false,
description: '',
variables: true,
source: {
type: 'query',
name: 'getDynamicData',
arguments: [
{
name: 'key',
value: 'listRecordCurrencies',
},
],
},
},
{
label: 'Milestone',
key: 'milestone',
type: 'dropdown',
required: false,
description: '',
variables: true,
source: {
type: 'query',
name: 'getDynamicData',
arguments: [
{
name: 'key',
value: 'listMilestones',
},
],
},
},
{
label: 'Previous Task',
key: 'previousTask',
type: 'dropdown',
required: false,
description: '',
variables: true,
source: {
type: 'query',
name: 'getDynamicData',
arguments: [
{
name: 'key',
value: 'listTasks',
},
],
},
},
{
label: 'Parent Task',
key: 'parentTask',
type: 'dropdown',
required: false,
description: '',
variables: true,
source: {
type: 'query',
name: 'getDynamicData',
arguments: [
{
name: 'key',
value: 'listTasks',
},
],
},
},
{
label: 'Task Type',
key: 'taskType',
type: 'dropdown',
required: true,
description: '',
variables: true,
source: {
type: 'query',
name: 'getDynamicData',
arguments: [
{
name: 'key',
value: 'listTodoOptions',
},
{
name: 'parameters.taskType',
value: 'tasktype',
},
],
},
},
{
label: 'Skipped Reason',
key: 'skippedReason',
type: 'dropdown',
required: false,
description: '',
variables: true,
source: {
type: 'query',
name: 'getDynamicData',
arguments: [
{
name: 'key',
value: 'listTodoOptions',
},
{
name: 'parameters.skippedReason',
value: 'skipped_reason',
},
],
},
},
{
label: 'Estimate',
key: 'estimate',
type: 'string',
required: false,
description: '',
variables: true,
},
{
label: 'Related Task',
key: 'relatedTask',
type: 'dropdown',
required: false,
description: '',
variables: true,
source: {
type: 'query',
name: 'getDynamicData',
arguments: [
{
name: 'key',
value: 'listTasks',
},
],
},
},
{
label: 'Project',
key: 'projectId',
type: 'dropdown',
required: false,
description: '',
variables: true,
source: {
type: 'query',
name: 'getDynamicData',
arguments: [
{
name: 'key',
value: 'listProjects',
},
],
},
},
{
label: 'Organization',
key: 'organizationId',
type: 'dropdown',
required: false,
description: '',
variables: true,
source: {
type: 'query',
name: 'getDynamicData',
arguments: [
{
name: 'key',
value: 'listOrganizations',
},
],
},
},
{
label: 'Send Email Reminder Before',
key: 'sendEmailReminderBefore',
type: 'string',
required: false,
description: '',
variables: true,
},
{
label: 'Description',
key: 'description',
type: 'string',
required: false,
description: '',
variables: true,
},
{
label: 'Is Billable',
key: 'isBillable',
type: 'dropdown',
required: false,
description: '',
variables: true,
options: [
{ label: 'True', value: '1' },
{ label: 'False', value: '-1' },
],
},
{
label: 'Service',
key: 'service',
type: 'dropdown',
required: false,
description: '',
variables: true,
source: {
type: 'query',
name: 'getDynamicData',
arguments: [
{
name: 'key',
value: 'listServices',
},
],
},
},
{
label: 'Rate',
key: 'rate',
type: 'string',
required: false,
description: '',
variables: true,
},
{
label: 'SLA',
key: 'slaId',
type: 'dropdown',
required: false,
description: '',
variables: true,
source: {
type: 'query',
name: 'getDynamicData',
arguments: [
{
name: 'key',
value: 'listSlaNames',
},
],
},
},
];

View File

@@ -1,78 +0,0 @@
import defineAction from '../../../../helpers/define-action.js';
import { fields } from './fields.js';
export default defineAction({
name: 'Create todo',
key: 'createTodo',
description: 'Create a new todo.',
arguments: fields,
async run($) {
const {
name,
assignedTo,
startDateAndTime,
dueDate,
stage,
contactId,
priority,
sendNotification,
location,
recordCurrencyId,
milestone,
previousTask,
parentTask,
taskType,
skippedReason,
estimate,
relatedTask,
projectId,
organizationId,
sendEmailReminderBefore,
description,
isBillable,
service,
rate,
slaId,
} = $.step.parameters;
const elementData = {
subject: name,
assigned_user_id: assignedTo || $.auth.data.userId,
date_start: startDateAndTime,
due_date: dueDate,
taskstatus: stage,
contact_id: contactId,
taskpriority: priority,
sendnotification: sendNotification,
location: location,
record_currency_id: recordCurrencyId,
milestone: milestone,
dependent_on: previousTask,
parent_task: parentTask,
tasktype: taskType,
skipped_reason: skippedReason,
estimate: estimate,
related_task: relatedTask,
related_project: projectId,
account_id: organizationId,
reminder_time: sendEmailReminderBefore,
description: description,
is_billable: isBillable,
billing_service: service,
rate: rate,
slaid: slaId,
};
const body = {
operation: 'create',
sessionName: $.auth.data.sessionName,
element: JSON.stringify(elementData),
elementType: 'Calendar',
};
const response = await $.http.post('/webservice.php', body);
$.setActionItem({ raw: response.data });
},
});

View File

@@ -1,13 +0,0 @@
import createCase from './create-case/index.js';
import createContact from './create-contact/index.js';
import createLead from './create-lead/index.js';
import createOpportunity from './create-opportunity/index.js';
import createTodo from './create-todo/index.js';
export default [
createCase,
createContact,
createLead,
createOpportunity,
createTodo,
];

View File

@@ -1,925 +0,0 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" width="490px" height="399px" viewBox="0 0 490 399" enable-background="new 0 0 490 399" xml:space="preserve"> <image id="image0" width="490" height="399" x="0" y="0"
href="data:image/png;base64,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
MjArMDA6MDA2wf1pAAAAAElFTkSuQmCC" />
</svg>

Before

Width:  |  Height:  |  Size: 70 KiB

View File

@@ -1,44 +0,0 @@
import verifyCredentials from './verify-credentials.js';
import isStillVerified from './is-still-verified.js';
export default {
fields: [
{
key: 'username',
label: 'Username',
type: 'string',
required: true,
readOnly: false,
value: null,
placeholder: null,
description: 'Email address of your Vtiger CRM account',
clickToCopy: false,
},
{
key: 'accessKey',
label: 'Access Key',
type: 'string',
required: true,
readOnly: false,
value: null,
placeholder: null,
description: 'Access Key of your Vtiger CRM account',
clickToCopy: false,
},
{
key: 'domain',
label: 'Domain',
type: 'string',
required: true,
readOnly: false,
value: null,
placeholder: null,
description:
'For example: acmeco.od1 if your dashboard url is https://acmeco.od1.vtiger.com. (Unfortunately, we are not able to offer support for self-hosted instances at this moment.)',
clickToCopy: false,
},
],
verifyCredentials,
isStillVerified,
};

View File

@@ -1,8 +0,0 @@
import verifyCredentials from './verify-credentials.js';
const isStillVerified = async ($) => {
await verifyCredentials($);
return true;
};
export default isStillVerified;

View File

@@ -1,32 +0,0 @@
import crypto from 'crypto';
const verifyCredentials = async ($) => {
const params = {
operation: 'getchallenge',
username: $.auth.data.username,
};
const { data } = await $.http.get('/webservice.php', { params });
const accessKey = crypto
.createHash('md5')
.update(data.result.token + $.auth.data.accessKey)
.digest('hex');
const body = {
operation: 'login',
username: $.auth.data.username,
accessKey,
};
const { data: result } = await $.http.post('/webservice.php', body);
const response = await $.http.get('/restapi/v1/vtiger/default/me');
await $.auth.set({
screenName: `${response.data.result?.first_name} ${response.data.result?.last_name}`,
sessionName: result.result.sessionName,
});
};
export default verifyCredentials;

View File

@@ -1,15 +0,0 @@
const addAuthHeader = ($, requestConfig) => {
const { data } = $.auth;
if (data?.username && data?.accessKey) {
requestConfig.headers['Content-Type'] = 'application/x-www-form-urlencoded';
requestConfig.auth = {
username: data.username,
password: data.accessKey,
};
}
return requestConfig;
};
export default addAuthHeader;

View File

@@ -1,10 +0,0 @@
const setBaseUrl = ($, requestConfig) => {
const domain = $.auth.data.domain;
if (domain) {
requestConfig.baseURL = `https://${domain}.vtiger.com`;
}
return requestConfig;
};
export default setBaseUrl;

View File

@@ -1,39 +0,0 @@
import listAssets from './list-assets/index.js';
import listCampaignSources from './list-campaign-sources/index.js';
import listCaseOptions from './list-case-options/index.js';
import listContactOptions from './list-contact-options/index.js';
import listContacts from './list-contacts/index.js';
import listGroups from './list-groups/index.js';
import listLeadOptions from './list-lead-options/index.js';
import listMilestones from './list-milestones/index.js';
import listOpportunityOptions from './list-opportunity-options/index.js';
import listOrganizations from './list-organizations/index.js';
import listProducts from './list-products/index.js';
import listProjects from './list-projects/index.js';
import listRecordCurrencies from './list-record-currencies/index.js';
import listServiceContracts from './list-service-contracts/index.js';
import listServices from './list-services/index.js';
import listSlaNames from './list-sla-names/index.js';
import listTasks from './list-tasks/index.js';
import listTodoOptions from './list-todo-options/index.js';
export default [
listAssets,
listCampaignSources,
listCaseOptions,
listContactOptions,
listContacts,
listGroups,
listLeadOptions,
listMilestones,
listOpportunityOptions,
listOrganizations,
listProducts,
listProjects,
listRecordCurrencies,
listServiceContracts,
listServices,
listSlaNames,
listTasks,
listTodoOptions,
];

View File

@@ -1,29 +0,0 @@
export default {
name: 'List assets',
key: 'listAssets',
async run($) {
const assets = {
data: [],
};
const params = {
operation: 'query',
sessionName: $.auth.data.sessionName,
query: 'SELECT * FROM Assets ORDER BY createdtime DESC;',
};
const { data } = await $.http.get('/webservice.php', { params });
if (data.result?.length) {
for (const asset of data.result) {
assets.data.push({
value: asset.id,
name: `${asset.assetname} (${asset.assetstatus})`,
});
}
}
return assets;
},
};

View File

@@ -1,29 +0,0 @@
export default {
name: 'List campaign sources',
key: 'listCampaignSources',
async run($) {
const campaignSources = {
data: [],
};
const params = {
operation: 'query',
sessionName: $.auth.data.sessionName,
query: 'SELECT * FROM Campaigns ORDER BY createdtime DESC;',
};
const { data } = await $.http.get(`/webservice.php`, { params });
if (data.result?.length) {
for (const campaignSource of data.result) {
campaignSources.data.push({
value: campaignSource.id,
name: campaignSource.campaignname,
});
}
}
return campaignSources;
},
};

View File

@@ -1,58 +0,0 @@
export default {
name: 'List case options',
key: 'listCaseOptions',
async run($) {
const caseOptions = {
data: [],
};
const {
status,
priority,
contactName,
productName,
channel,
category,
subCategory,
resolutionType,
serviceType,
serviceLocation,
} = $.step.parameters;
const picklistFields = [
status,
priority,
contactName,
productName,
channel,
category,
subCategory,
resolutionType,
serviceType,
serviceLocation,
];
const params = {
operation: 'describe',
sessionName: $.auth.data.sessionName,
elementType: 'Cases',
};
const { data } = await $.http.get(`/webservice.php`, { params });
if (data.result.fields?.length) {
for (const field of data.result.fields) {
if (picklistFields.includes(field.name)) {
field.type.picklistValues.map((item) =>
caseOptions.data.push({
value: item.value,
name: item.label,
})
);
}
}
}
return caseOptions;
},
};

View File

@@ -1,62 +0,0 @@
export default {
name: 'List contact options',
key: 'listContactOptions',
async run($) {
const leadOptions = {
data: [],
};
const {
leadSource,
lifecycleStage,
status,
title,
happinessRating,
emailOptin,
smsOptin,
language,
otherCountry,
mailingCountry,
mailingState,
otherState,
} = $.step.parameters;
const picklistFields = [
leadSource,
lifecycleStage,
status,
title,
happinessRating,
emailOptin,
smsOptin,
language,
otherCountry,
mailingCountry,
mailingState,
otherState,
];
const params = {
operation: 'describe',
sessionName: $.auth.data.sessionName,
elementType: 'Contacts',
};
const { data } = await $.http.get(`/webservice.php`, { params });
if (data.result.fields?.length) {
for (const field of data.result.fields) {
if (picklistFields.includes(field.name)) {
field.type.picklistValues.map((item) =>
leadOptions.data.push({
value: item.value,
name: item.label,
})
);
}
}
}
return leadOptions;
},
};

View File

@@ -1,29 +0,0 @@
export default {
name: 'List contacts',
key: 'listContacts',
async run($) {
const contacts = {
data: [],
};
const params = {
operation: 'query',
sessionName: $.auth.data.sessionName,
query: 'SELECT * FROM Contacts ORDER BY createdtime DESC;',
};
const { data } = await $.http.get(`/webservice.php`, { params });
if (data.result?.length) {
for (const contact of data.result) {
contacts.data.push({
value: contact.id,
name: `${contact.firstname} ${contact.lastname}`,
});
}
}
return contacts;
},
};

View File

@@ -1,29 +0,0 @@
export default {
name: 'List groups',
key: 'listGroups',
async run($) {
const groups = {
data: [],
};
const params = {
operation: 'query',
sessionName: $.auth.data.sessionName,
query: 'SELECT * FROM Groups;',
};
const { data } = await $.http.get('/webservice.php', { params });
if (data.result?.length) {
for (const group of data.result) {
groups.data.push({
value: group.id,
name: group.groupname,
});
}
}
return groups;
},
};

View File

@@ -1,56 +0,0 @@
export default {
name: 'List lead options',
key: 'listLeadOptions',
async run($) {
const leadOptions = {
data: [],
};
const {
designation,
industry,
leadSource,
leadStatus,
emailOptin,
smsOptin,
language,
country,
state,
} = $.step.parameters;
const picklistFields = [
designation,
industry,
leadSource,
leadStatus,
emailOptin,
smsOptin,
language,
country,
state,
];
const params = {
operation: 'describe',
sessionName: $.auth.data.sessionName,
elementType: 'Leads',
};
const { data } = await $.http.get(`/webservice.php`, { params });
if (data.result.fields?.length) {
for (const field of data.result.fields) {
if (picklistFields.includes(field.name)) {
field.type.picklistValues.map((item) =>
leadOptions.data.push({
value: item.value,
name: item.label,
})
);
}
}
}
return leadOptions;
},
};

View File

@@ -1,29 +0,0 @@
export default {
name: 'List milestones',
key: 'listMilestones',
async run($) {
const milestones = {
data: [],
};
const params = {
operation: 'query',
sessionName: $.auth.data.sessionName,
query: 'SELECT * FROM ProjectMilestone ORDER BY createdtime DESC;',
};
const { data } = await $.http.get('/webservice.php', { params });
if (data.result?.length) {
for (const milestone of data.result) {
milestones.data.push({
value: milestone.id,
name: milestone.projectmilestonename,
});
}
}
return milestones;
},
};

View File

@@ -1,38 +0,0 @@
export default {
name: 'List opportunity options',
key: 'listOpportunityOptions',
async run($) {
const opportunityOptions = {
data: [],
};
const leadSource = $.step.parameters.leadSource;
const lostReason = $.step.parameters.lostReason;
const type = $.step.parameters.type;
const salesStage = $.step.parameters.salesStage;
const picklistFields = [leadSource, lostReason, type, salesStage];
const params = {
operation: 'describe',
sessionName: $.auth.data.sessionName,
elementType: 'Potentials',
};
const { data } = await $.http.get(`/webservice.php`, { params });
if (data.result.fields?.length) {
for (const field of data.result.fields) {
if (picklistFields.includes(field.name)) {
field.type.picklistValues.map((item) =>
opportunityOptions.data.push({
value: item.value,
name: item.label,
})
);
}
}
}
return opportunityOptions;
},
};

View File

@@ -1,29 +0,0 @@
export default {
name: 'List organizations',
key: 'listOrganizations',
async run($) {
const organizations = {
data: [],
};
const params = {
operation: 'query',
sessionName: $.auth.data.sessionName,
query: 'SELECT * FROM Accounts ORDER BY createdtime DESC;',
};
const { data } = await $.http.get(`/webservice.php`, { params });
if (data.result?.length) {
for (const organization of data.result) {
organizations.data.push({
value: organization.id,
name: organization.accountname,
});
}
}
return organizations;
},
};

View File

@@ -1,29 +0,0 @@
export default {
name: 'List products',
key: 'listProducts',
async run($) {
const products = {
data: [],
};
const params = {
operation: 'query',
sessionName: $.auth.data.sessionName,
query: 'SELECT * FROM Products ORDER BY createdtime DESC;',
};
const { data } = await $.http.get('/webservice.php', { params });
if (data.result?.length) {
for (const product of data.result) {
products.data.push({
value: product.id,
name: product.productname,
});
}
}
return products;
},
};

View File

@@ -1,29 +0,0 @@
export default {
name: 'List projects',
key: 'listProjects',
async run($) {
const projects = {
data: [],
};
const params = {
operation: 'query',
sessionName: $.auth.data.sessionName,
query: 'SELECT * FROM Project ORDER BY createdtime DESC;',
};
const { data } = await $.http.get('/webservice.php', { params });
if (data.result?.length) {
for (const project of data.result) {
projects.data.push({
value: project.id,
name: project.projectname,
});
}
}
return projects;
},
};

View File

@@ -1,29 +0,0 @@
export default {
name: 'List record currencies',
key: 'listRecordCurrencies',
async run($) {
const recordCurrencies = {
data: [],
};
const params = {
operation: 'query',
sessionName: $.auth.data.sessionName,
query: 'SELECT * FROM Currency;',
};
const { data } = await $.http.get(`/webservice.php`, { params });
if (data.result?.length) {
for (const recordCurrency of data.result) {
recordCurrencies.data.push({
value: recordCurrency.id,
name: recordCurrency.currency_code,
});
}
}
return recordCurrencies;
},
};

Some files were not shown because too many files have changed in this diff Show More