Compare commits
	
		
			1 Commits
		
	
	
		
			AUT-996
			...
			replace-wi
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
|   | f4a2e1a84b | 
| @@ -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
									
								
							
							
						
						
									
										24
									
								
								docker/Dockerfile.cloud
									
									
									
									
									
										Normal 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"] | ||||
| @@ -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
									
								
							
							
						
						
									
										13
									
								
								docker/entrypoint-cloud.sh
									
									
									
									
									
										Executable 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 | ||||
| @@ -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.'); | ||||
|     } | ||||
|   | ||||
| @@ -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" | ||||
|   }, | ||||
|   | ||||
| @@ -1,92 +0,0 @@ | ||||
| import defineAction from '../../../../helpers/define-action.js'; | ||||
|  | ||||
| export default defineAction({ | ||||
|   name: 'Create record', | ||||
|   key: 'createRecord', | ||||
|   description: 'Creates a new record with fields that automatically populate.', | ||||
|   arguments: [ | ||||
|     { | ||||
|       label: 'Base', | ||||
|       key: 'baseId', | ||||
|       type: 'dropdown', | ||||
|       required: true, | ||||
|       description: 'Base in which to create the record.', | ||||
|       variables: true, | ||||
|       source: { | ||||
|         type: 'query', | ||||
|         name: 'getDynamicData', | ||||
|         arguments: [ | ||||
|           { | ||||
|             name: 'key', | ||||
|             value: 'listBases', | ||||
|           }, | ||||
|         ], | ||||
|       }, | ||||
|     }, | ||||
|     { | ||||
|       label: 'Table', | ||||
|       key: 'tableId', | ||||
|       type: 'dropdown', | ||||
|       required: true, | ||||
|       dependsOn: ['parameters.baseId'], | ||||
|       description: '', | ||||
|       variables: true, | ||||
|       source: { | ||||
|         type: 'query', | ||||
|         name: 'getDynamicData', | ||||
|         arguments: [ | ||||
|           { | ||||
|             name: 'key', | ||||
|             value: 'listTables', | ||||
|           }, | ||||
|           { | ||||
|             name: 'parameters.baseId', | ||||
|             value: '{parameters.baseId}', | ||||
|           }, | ||||
|         ], | ||||
|       }, | ||||
|       additionalFields: { | ||||
|         type: 'query', | ||||
|         name: 'getDynamicFields', | ||||
|         arguments: [ | ||||
|           { | ||||
|             name: 'key', | ||||
|             value: 'listFields', | ||||
|           }, | ||||
|           { | ||||
|             name: 'parameters.baseId', | ||||
|             value: '{parameters.baseId}', | ||||
|           }, | ||||
|           { | ||||
|             name: 'parameters.tableId', | ||||
|             value: '{parameters.tableId}', | ||||
|           }, | ||||
|         ], | ||||
|       }, | ||||
|     }, | ||||
|   ], | ||||
|  | ||||
|   async run($) { | ||||
|     const { baseId, tableId, ...rest } = $.step.parameters; | ||||
|  | ||||
|     const fields = Object.entries(rest).reduce((result, [key, value]) => { | ||||
|       if (Array.isArray(value)) { | ||||
|         result[key] = value.map((item) => item.value); | ||||
|       } else if (value !== '') { | ||||
|         result[key] = value; | ||||
|       } | ||||
|       return result; | ||||
|     }, {}); | ||||
|  | ||||
|     const body = { | ||||
|       typecast: true, | ||||
|       fields, | ||||
|     }; | ||||
|  | ||||
|     const { data } = await $.http.post(`/v0/${baseId}/${tableId}`, body); | ||||
|  | ||||
|     $.setActionItem({ | ||||
|       raw: data, | ||||
|     }); | ||||
|   }, | ||||
| }); | ||||
| @@ -1,174 +0,0 @@ | ||||
| import defineAction from '../../../../helpers/define-action.js'; | ||||
| import { URLSearchParams } from 'url'; | ||||
|  | ||||
| export default defineAction({ | ||||
|   name: 'Find record', | ||||
|   key: 'findRecord', | ||||
|   description: | ||||
|     "Finds a record using simple field search or use Airtable's formula syntax to find a matching record.", | ||||
|   arguments: [ | ||||
|     { | ||||
|       label: 'Base', | ||||
|       key: 'baseId', | ||||
|       type: 'dropdown', | ||||
|       required: true, | ||||
|       description: 'Base in which to create the record.', | ||||
|       variables: true, | ||||
|       source: { | ||||
|         type: 'query', | ||||
|         name: 'getDynamicData', | ||||
|         arguments: [ | ||||
|           { | ||||
|             name: 'key', | ||||
|             value: 'listBases', | ||||
|           }, | ||||
|         ], | ||||
|       }, | ||||
|     }, | ||||
|     { | ||||
|       label: 'Table', | ||||
|       key: 'tableId', | ||||
|       type: 'dropdown', | ||||
|       required: true, | ||||
|       dependsOn: ['parameters.baseId'], | ||||
|       description: '', | ||||
|       variables: true, | ||||
|       source: { | ||||
|         type: 'query', | ||||
|         name: 'getDynamicData', | ||||
|         arguments: [ | ||||
|           { | ||||
|             name: 'key', | ||||
|             value: 'listTables', | ||||
|           }, | ||||
|           { | ||||
|             name: 'parameters.baseId', | ||||
|             value: '{parameters.baseId}', | ||||
|           }, | ||||
|         ], | ||||
|       }, | ||||
|     }, | ||||
|     { | ||||
|       label: 'Search by field', | ||||
|       key: 'tableField', | ||||
|       type: 'dropdown', | ||||
|       required: false, | ||||
|       dependsOn: ['parameters.baseId', 'parameters.tableId'], | ||||
|       description: '', | ||||
|       variables: true, | ||||
|       source: { | ||||
|         type: 'query', | ||||
|         name: 'getDynamicData', | ||||
|         arguments: [ | ||||
|           { | ||||
|             name: 'key', | ||||
|             value: 'listTableFields', | ||||
|           }, | ||||
|           { | ||||
|             name: 'parameters.baseId', | ||||
|             value: '{parameters.baseId}', | ||||
|           }, | ||||
|           { | ||||
|             name: 'parameters.tableId', | ||||
|             value: '{parameters.tableId}', | ||||
|           }, | ||||
|         ], | ||||
|       }, | ||||
|     }, | ||||
|     { | ||||
|       label: 'Search Value', | ||||
|       key: 'searchValue', | ||||
|       type: 'string', | ||||
|       required: false, | ||||
|       variables: true, | ||||
|       description: | ||||
|         'The value of unique identifier for the record. For date values, please use the ISO format (e.g., "YYYY-MM-DD").', | ||||
|     }, | ||||
|     { | ||||
|       label: 'Search for exact match?', | ||||
|       key: 'exactMatch', | ||||
|       type: 'dropdown', | ||||
|       required: true, | ||||
|       description: '', | ||||
|       variables: true, | ||||
|       options: [ | ||||
|         { label: 'Yes', value: 'true' }, | ||||
|         { label: 'No', value: 'false' }, | ||||
|       ], | ||||
|     }, | ||||
|     { | ||||
|       label: 'Search Formula', | ||||
|       key: 'searchFormula', | ||||
|       type: 'string', | ||||
|       required: false, | ||||
|       variables: true, | ||||
|       description: | ||||
|         'Instead, you have the option to use an Airtable search formula for locating records according to sophisticated criteria and across various fields.', | ||||
|     }, | ||||
|     { | ||||
|       label: 'Limit to View', | ||||
|       key: 'limitToView', | ||||
|       type: 'dropdown', | ||||
|       required: false, | ||||
|       dependsOn: ['parameters.baseId', 'parameters.tableId'], | ||||
|       description: | ||||
|         'You have the choice to restrict the search to a particular view ID if desired.', | ||||
|       variables: true, | ||||
|       source: { | ||||
|         type: 'query', | ||||
|         name: 'getDynamicData', | ||||
|         arguments: [ | ||||
|           { | ||||
|             name: 'key', | ||||
|             value: 'listTableViews', | ||||
|           }, | ||||
|           { | ||||
|             name: 'parameters.baseId', | ||||
|             value: '{parameters.baseId}', | ||||
|           }, | ||||
|           { | ||||
|             name: 'parameters.tableId', | ||||
|             value: '{parameters.tableId}', | ||||
|           }, | ||||
|         ], | ||||
|       }, | ||||
|     }, | ||||
|   ], | ||||
|  | ||||
|   async run($) { | ||||
|     const { | ||||
|       baseId, | ||||
|       tableId, | ||||
|       tableField, | ||||
|       searchValue, | ||||
|       exactMatch, | ||||
|       searchFormula, | ||||
|       limitToView, | ||||
|     } = $.step.parameters; | ||||
|  | ||||
|     let filterByFormula; | ||||
|  | ||||
|     if (tableField && searchValue) { | ||||
|       filterByFormula = | ||||
|         exactMatch === 'true' | ||||
|           ? `{${tableField}} = '${searchValue}'` | ||||
|           : `LOWER({${tableField}}) = LOWER('${searchValue}')`; | ||||
|     } else { | ||||
|       filterByFormula = searchFormula; | ||||
|     } | ||||
|  | ||||
|     const body = new URLSearchParams({ | ||||
|       filterByFormula, | ||||
|       view: limitToView, | ||||
|     }); | ||||
|  | ||||
|     const { data } = await $.http.post( | ||||
|       `/v0/${baseId}/${tableId}/listRecords`, | ||||
|       body | ||||
|     ); | ||||
|  | ||||
|     $.setActionItem({ | ||||
|       raw: data, | ||||
|     }); | ||||
|   }, | ||||
| }); | ||||
| @@ -1,4 +0,0 @@ | ||||
| import createRecord from './create-record/index.js'; | ||||
| import findRecord from './find-record/index.js'; | ||||
|  | ||||
| export default [createRecord, findRecord]; | ||||
| @@ -1,9 +0,0 @@ | ||||
| <?xml version="1.0" encoding="UTF-8"?> | ||||
| <svg width="256px" height="215px" viewBox="0 0 256 215" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" preserveAspectRatio="xMidYMid"> | ||||
| 	<g> | ||||
| 		<path d="M114.25873,2.70101695 L18.8604023,42.1756384 C13.5552723,44.3711638 13.6102328,51.9065311 18.9486282,54.0225085 L114.746142,92.0117514 C123.163769,95.3498757 132.537419,95.3498757 140.9536,92.0117514 L236.75256,54.0225085 C242.08951,51.9065311 242.145916,44.3711638 236.83934,42.1756384 L141.442459,2.70101695 C132.738459,-0.900338983 122.961284,-0.900338983 114.25873,2.70101695" fill="#FFBF00"></path> | ||||
| 		<path d="M136.349071,112.756863 L136.349071,207.659101 C136.349071,212.173089 140.900664,215.263892 145.096461,213.600615 L251.844122,172.166219 C254.281184,171.200072 255.879376,168.845451 255.879376,166.224705 L255.879376,71.3224678 C255.879376,66.8084791 251.327783,63.7176768 247.131986,65.3809537 L140.384325,106.815349 C137.94871,107.781496 136.349071,110.136118 136.349071,112.756863" fill="#26B5F8"></path> | ||||
| 		<path d="M111.422771,117.65355 L79.742409,132.949912 L76.5257763,134.504714 L9.65047684,166.548104 C5.4112904,168.593211 0.000578531073,165.503855 0.000578531073,160.794612 L0.000578531073,71.7210757 C0.000578531073,70.0173017 0.874160452,68.5463864 2.04568588,67.4384994 C2.53454463,66.9481944 3.08848814,66.5446689 3.66412655,66.2250305 C5.26231864,65.2661153 7.54173107,65.0101153 9.47981017,65.7766689 L110.890522,105.957098 C116.045234,108.002206 116.450206,115.225166 111.422771,117.65355" fill="#ED3049"></path> | ||||
| 		<path d="M111.422771,117.65355 L79.742409,132.949912 L2.04568588,67.4384994 C2.53454463,66.9481944 3.08848814,66.5446689 3.66412655,66.2250305 C5.26231864,65.2661153 7.54173107,65.0101153 9.47981017,65.7766689 L110.890522,105.957098 C116.045234,108.002206 116.450206,115.225166 111.422771,117.65355" fill-opacity="0.25" fill="#000000"></path> | ||||
| 	</g> | ||||
| </svg> | ||||
| Before Width: | Height: | Size: 1.9 KiB | 
| @@ -1,38 +0,0 @@ | ||||
| import crypto from 'crypto'; | ||||
| 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 state = crypto.randomBytes(100).toString('base64url'); | ||||
|   const codeVerifier = crypto.randomBytes(96).toString('base64url'); | ||||
|   const codeChallenge = crypto | ||||
|     .createHash('sha256') | ||||
|     .update(codeVerifier) | ||||
|     .digest('base64') | ||||
|     .replace(/=/g, '') | ||||
|     .replace(/\+/g, '-') | ||||
|     .replace(/\//g, '_'); | ||||
|  | ||||
|   const searchParams = new URLSearchParams({ | ||||
|     client_id: $.auth.data.clientId, | ||||
|     redirect_uri: redirectUri, | ||||
|     response_type: 'code', | ||||
|     scope: authScope.join(' '), | ||||
|     state, | ||||
|     code_challenge: codeChallenge, | ||||
|     code_challenge_method: 'S256', | ||||
|   }); | ||||
|  | ||||
|   const url = `https://airtable.com/oauth2/v1/authorize?${searchParams.toString()}`; | ||||
|  | ||||
|   await $.auth.set({ | ||||
|     url, | ||||
|     originalCodeChallenge: codeChallenge, | ||||
|     originalState: state, | ||||
|     codeVerifier, | ||||
|   }); | ||||
| } | ||||
| @@ -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/airtable/connections/add', | ||||
|       placeholder: null, | ||||
|       description: | ||||
|         'When asked to input a redirect URL in Airtable, 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, | ||||
| }; | ||||
| @@ -1,8 +0,0 @@ | ||||
| import getCurrentUser from '../common/get-current-user.js'; | ||||
|  | ||||
| const isStillVerified = async ($) => { | ||||
|   const currentUser = await getCurrentUser($); | ||||
|   return !!currentUser.id; | ||||
| }; | ||||
|  | ||||
| export default isStillVerified; | ||||
| @@ -1,40 +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, | ||||
|     grant_type: 'refresh_token', | ||||
|     refresh_token: $.auth.data.refreshToken, | ||||
|   }); | ||||
|  | ||||
|   const basicAuthToken = Buffer.from( | ||||
|     $.auth.data.clientId + ':' + $.auth.data.clientSecret | ||||
|   ).toString('base64'); | ||||
|  | ||||
|   const { data } = await $.http.post( | ||||
|     'https://airtable.com/oauth2/v1/token', | ||||
|     params.toString(), | ||||
|     { | ||||
|       headers: { | ||||
|         'Content-Type': 'application/x-www-form-urlencoded', | ||||
|         Authorization: `Basic ${basicAuthToken}`, | ||||
|       }, | ||||
|       additionalProperties: { | ||||
|         skipAddingAuthHeader: true, | ||||
|       }, | ||||
|     } | ||||
|   ); | ||||
|  | ||||
|   await $.auth.set({ | ||||
|     accessToken: data.access_token, | ||||
|     refreshToken: data.refresh_token, | ||||
|     expiresIn: data.expires_in, | ||||
|     refreshExpiresIn: data.refresh_expires_in, | ||||
|     scope: authScope.join(' '), | ||||
|     tokenType: data.token_type, | ||||
|   }); | ||||
| }; | ||||
|  | ||||
| export default refreshToken; | ||||
| @@ -1,56 +0,0 @@ | ||||
| import getCurrentUser from '../common/get-current-user.js'; | ||||
|  | ||||
| const verifyCredentials = async ($) => { | ||||
|   if ($.auth.data.originalState !== $.auth.data.state) { | ||||
|     throw new Error("The 'state' parameter does not match."); | ||||
|   } | ||||
|   if ($.auth.data.originalCodeChallenge !== $.auth.data.code_challenge) { | ||||
|     throw new Error("The 'code challenge' parameter does not match."); | ||||
|   } | ||||
|   const oauthRedirectUrlField = $.app.auth.fields.find( | ||||
|     (field) => field.key == 'oAuthRedirectUrl' | ||||
|   ); | ||||
|   const redirectUri = oauthRedirectUrlField.value; | ||||
|   const basicAuthToken = Buffer.from( | ||||
|     $.auth.data.clientId + ':' + $.auth.data.clientSecret | ||||
|   ).toString('base64'); | ||||
|  | ||||
|   const { data } = await $.http.post( | ||||
|     'https://airtable.com/oauth2/v1/token', | ||||
|     { | ||||
|       code: $.auth.data.code, | ||||
|       client_id: $.auth.data.clientId, | ||||
|       redirect_uri: redirectUri, | ||||
|       grant_type: 'authorization_code', | ||||
|       code_verifier: $.auth.data.codeVerifier, | ||||
|     }, | ||||
|     { | ||||
|       headers: { | ||||
|         'Content-Type': 'application/x-www-form-urlencoded', | ||||
|         Authorization: `Basic ${basicAuthToken}`, | ||||
|       }, | ||||
|       additionalProperties: { | ||||
|         skipAddingAuthHeader: true, | ||||
|       }, | ||||
|     } | ||||
|   ); | ||||
|  | ||||
|   await $.auth.set({ | ||||
|     accessToken: data.access_token, | ||||
|     tokenType: data.token_type, | ||||
|   }); | ||||
|  | ||||
|   const currentUser = await getCurrentUser($); | ||||
|  | ||||
|   await $.auth.set({ | ||||
|     clientId: $.auth.data.clientId, | ||||
|     clientSecret: $.auth.data.clientSecret, | ||||
|     scope: $.auth.data.scope, | ||||
|     expiresIn: data.expires_in, | ||||
|     refreshExpiresIn: data.refresh_expires_in, | ||||
|     refreshToken: data.refresh_token, | ||||
|     screenName: currentUser.email, | ||||
|   }); | ||||
| }; | ||||
|  | ||||
| export default verifyCredentials; | ||||
| @@ -1,12 +0,0 @@ | ||||
| const addAuthHeader = ($, requestConfig) => { | ||||
|   if ( | ||||
|     !requestConfig.additionalProperties?.skipAddingAuthHeader && | ||||
|     $.auth.data?.accessToken | ||||
|   ) { | ||||
|     requestConfig.headers.Authorization = `${$.auth.data.tokenType} ${$.auth.data.accessToken}`; | ||||
|   } | ||||
|  | ||||
|   return requestConfig; | ||||
| }; | ||||
|  | ||||
| export default addAuthHeader; | ||||
| @@ -1,12 +0,0 @@ | ||||
| const authScope = [ | ||||
|   'data.records:read', | ||||
|   'data.records:write', | ||||
|   'data.recordComments:read', | ||||
|   'data.recordComments:write', | ||||
|   'schema.bases:read', | ||||
|   'schema.bases:write', | ||||
|   'user.email:read', | ||||
|   'webhook:manage', | ||||
| ]; | ||||
|  | ||||
| export default authScope; | ||||
| @@ -1,6 +0,0 @@ | ||||
| const getCurrentUser = async ($) => { | ||||
|   const { data: currentUser } = await $.http.get('/v0/meta/whoami'); | ||||
|   return currentUser; | ||||
| }; | ||||
|  | ||||
| export default getCurrentUser; | ||||
| @@ -1,6 +0,0 @@ | ||||
| import listBases from './list-bases/index.js'; | ||||
| import listTableFields from './list-table-fields/index.js'; | ||||
| import listTableViews from './list-table-views/index.js'; | ||||
| import listTables from './list-tables/index.js'; | ||||
|  | ||||
| export default [listBases, listTableFields, listTableViews, listTables]; | ||||
| @@ -1,28 +0,0 @@ | ||||
| export default { | ||||
|   name: 'List bases', | ||||
|   key: 'listBases', | ||||
|  | ||||
|   async run($) { | ||||
|     const bases = { | ||||
|       data: [], | ||||
|     }; | ||||
|  | ||||
|     const params = {}; | ||||
|  | ||||
|     do { | ||||
|       const { data } = await $.http.get('/v0/meta/bases', { params }); | ||||
|       params.offset = data.offset; | ||||
|  | ||||
|       if (data?.bases) { | ||||
|         for (const base of data.bases) { | ||||
|           bases.data.push({ | ||||
|             value: base.id, | ||||
|             name: base.name, | ||||
|           }); | ||||
|         } | ||||
|       } | ||||
|     } while (params.offset); | ||||
|  | ||||
|     return bases; | ||||
|   }, | ||||
| }; | ||||
| @@ -1,39 +0,0 @@ | ||||
| export default { | ||||
|   name: 'List table fields', | ||||
|   key: 'listTableFields', | ||||
|  | ||||
|   async run($) { | ||||
|     const tableFields = { | ||||
|       data: [], | ||||
|     }; | ||||
|     const { baseId, tableId } = $.step.parameters; | ||||
|  | ||||
|     if (!baseId) { | ||||
|       return tableFields; | ||||
|     } | ||||
|  | ||||
|     const params = {}; | ||||
|  | ||||
|     do { | ||||
|       const { data } = await $.http.get(`/v0/meta/bases/${baseId}/tables`, { | ||||
|         params, | ||||
|       }); | ||||
|       params.offset = data.offset; | ||||
|  | ||||
|       if (data?.tables) { | ||||
|         for (const table of data.tables) { | ||||
|           if (table.id === tableId) { | ||||
|             table.fields.forEach((field) => { | ||||
|               tableFields.data.push({ | ||||
|                 value: field.name, | ||||
|                 name: field.name, | ||||
|               }); | ||||
|             }); | ||||
|           } | ||||
|         } | ||||
|       } | ||||
|     } while (params.offset); | ||||
|  | ||||
|     return tableFields; | ||||
|   }, | ||||
| }; | ||||
| @@ -1,39 +0,0 @@ | ||||
| export default { | ||||
|   name: 'List table views', | ||||
|   key: 'listTableViews', | ||||
|  | ||||
|   async run($) { | ||||
|     const tableViews = { | ||||
|       data: [], | ||||
|     }; | ||||
|     const { baseId, tableId } = $.step.parameters; | ||||
|  | ||||
|     if (!baseId) { | ||||
|       return tableViews; | ||||
|     } | ||||
|  | ||||
|     const params = {}; | ||||
|  | ||||
|     do { | ||||
|       const { data } = await $.http.get(`/v0/meta/bases/${baseId}/tables`, { | ||||
|         params, | ||||
|       }); | ||||
|       params.offset = data.offset; | ||||
|  | ||||
|       if (data?.tables) { | ||||
|         for (const table of data.tables) { | ||||
|           if (table.id === tableId) { | ||||
|             table.views.forEach((view) => { | ||||
|               tableViews.data.push({ | ||||
|                 value: view.id, | ||||
|                 name: view.name, | ||||
|               }); | ||||
|             }); | ||||
|           } | ||||
|         } | ||||
|       } | ||||
|     } while (params.offset); | ||||
|  | ||||
|     return tableViews; | ||||
|   }, | ||||
| }; | ||||
| @@ -1,35 +0,0 @@ | ||||
| export default { | ||||
|   name: 'List tables', | ||||
|   key: 'listTables', | ||||
|  | ||||
|   async run($) { | ||||
|     const tables = { | ||||
|       data: [], | ||||
|     }; | ||||
|     const baseId = $.step.parameters.baseId; | ||||
|  | ||||
|     if (!baseId) { | ||||
|       return tables; | ||||
|     } | ||||
|  | ||||
|     const params = {}; | ||||
|  | ||||
|     do { | ||||
|       const { data } = await $.http.get(`/v0/meta/bases/${baseId}/tables`, { | ||||
|         params, | ||||
|       }); | ||||
|       params.offset = data.offset; | ||||
|  | ||||
|       if (data?.tables) { | ||||
|         for (const table of data.tables) { | ||||
|           tables.data.push({ | ||||
|             value: table.id, | ||||
|             name: table.name, | ||||
|           }); | ||||
|         } | ||||
|       } | ||||
|     } while (params.offset); | ||||
|  | ||||
|     return tables; | ||||
|   }, | ||||
| }; | ||||
| @@ -1,3 +0,0 @@ | ||||
| import listFields from './list-fields/index.js'; | ||||
|  | ||||
| export default [listFields]; | ||||
| @@ -1,86 +0,0 @@ | ||||
| const hasValue = (value) => value !== null && value !== undefined; | ||||
|  | ||||
| export default { | ||||
|   name: 'List fields', | ||||
|   key: 'listFields', | ||||
|  | ||||
|   async run($) { | ||||
|     const options = []; | ||||
|     const { baseId, tableId } = $.step.parameters; | ||||
|  | ||||
|     if (!hasValue(baseId) || !hasValue(tableId)) { | ||||
|       return; | ||||
|     } | ||||
|  | ||||
|     const { data } = await $.http.get(`/v0/meta/bases/${baseId}/tables`); | ||||
|  | ||||
|     const selectedTable = data.tables.find((table) => table.id === tableId); | ||||
|  | ||||
|     if (!selectedTable) return; | ||||
|  | ||||
|     selectedTable.fields.forEach((field) => { | ||||
|       if (field.type === 'singleSelect') { | ||||
|         options.push({ | ||||
|           label: field.name, | ||||
|           key: field.name, | ||||
|           type: 'dropdown', | ||||
|           required: false, | ||||
|           variables: true, | ||||
|           options: field.options.choices.map((choice) => ({ | ||||
|             label: choice.name, | ||||
|             value: choice.id, | ||||
|           })), | ||||
|         }); | ||||
|       } else if (field.type === 'multipleSelects') { | ||||
|         options.push({ | ||||
|           label: field.name, | ||||
|           key: field.name, | ||||
|           type: 'dynamic', | ||||
|           required: false, | ||||
|           variables: true, | ||||
|           fields: [ | ||||
|             { | ||||
|               label: 'Value', | ||||
|               key: 'value', | ||||
|               type: 'dropdown', | ||||
|               required: false, | ||||
|               variables: true, | ||||
|               options: field.options.choices.map((choice) => ({ | ||||
|                 label: choice.name, | ||||
|                 value: choice.id, | ||||
|               })), | ||||
|             }, | ||||
|           ], | ||||
|         }); | ||||
|       } else if (field.type === 'checkbox') { | ||||
|         options.push({ | ||||
|           label: field.name, | ||||
|           key: field.name, | ||||
|           type: 'dropdown', | ||||
|           required: false, | ||||
|           variables: true, | ||||
|           options: [ | ||||
|             { | ||||
|               label: 'Yes', | ||||
|               value: 'true', | ||||
|             }, | ||||
|             { | ||||
|               label: 'No', | ||||
|               value: 'false', | ||||
|             }, | ||||
|           ], | ||||
|         }); | ||||
|       } else { | ||||
|         options.push({ | ||||
|           label: field.name, | ||||
|           key: field.name, | ||||
|           type: 'string', | ||||
|           required: false, | ||||
|           variables: true, | ||||
|         }); | ||||
|       } | ||||
|     }); | ||||
|  | ||||
|     return options; | ||||
|   }, | ||||
| }; | ||||
| @@ -1,22 +0,0 @@ | ||||
| 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 dynamicData from './dynamic-data/index.js'; | ||||
| import dynamicFields from './dynamic-fields/index.js'; | ||||
|  | ||||
| export default defineApp({ | ||||
|   name: 'Airtable', | ||||
|   key: 'airtable', | ||||
|   baseUrl: 'https://airtable.com', | ||||
|   apiBaseUrl: 'https://api.airtable.com', | ||||
|   iconUrl: '{BASE_URL}/apps/airtable/assets/favicon.svg', | ||||
|   authDocUrl: '{DOCS_URL}/apps/airtable/connection', | ||||
|   primaryColor: 'FFBF00', | ||||
|   supportsConnections: true, | ||||
|   beforeRequest: [addAuthHeader], | ||||
|   auth, | ||||
|   actions, | ||||
|   dynamicData, | ||||
|   dynamicFields, | ||||
| }); | ||||
| @@ -1 +0,0 @@ | ||||
| <svg xmlns:xlink="http://www.w3.org/1999/xlink" xmlns="http://www.w3.org/2000/svg" width="132" height="24" fill="none" viewBox="0 0 132 24"><path fill="#19191C" d="M38.557 19.495c2.16 0 3.25-1.113 3.725-1.87h.214c.094.805.664 1.562 1.779 1.562h2.111V16.82h-.545c-.38 0-.57-.213-.57-.545V6.776h-2.8v1.516h-.213c-.545-.758-1.684-1.824-3.772-1.824-3.321 0-5.789 2.748-5.789 6.514s2.515 6.513 5.86 6.513m.498-2.7c-1.969 0-3.51-1.445-3.51-3.79 0-2.297 1.494-3.86 3.487-3.86 1.898 0 3.487 1.397 3.487 3.86 0 2.108-1.352 3.79-3.463 3.79M48.04 24h2.799v-6.376h.213c.522.758 1.637 1.871 3.844 1.871 3.321 0 5.741-2.795 5.741-6.513 0-3.743-2.586-6.514-5.931-6.514-2.135 0-3.18 1.16-3.678 1.8h-.213V6.776h-2.776V24m6.263-7.134c-1.922 0-3.512-1.42-3.512-3.884 0-2.108 1.353-3.885 3.464-3.885 1.97 0 3.511 1.54 3.511 3.885 0 2.297-1.494 3.884-3.463 3.884M62.082 24h2.8v-6.376h.213c.522.758 1.637 1.871 3.843 1.871 3.321 0 5.51-2.795 5.51-6.513 0-3.743-2.355-6.514-5.7-6.514-2.135 0-3.179 1.16-3.677 1.8h-.214V6.776h-2.775zm6.263-7.134c-1.922 0-3.511-1.42-3.511-3.884 0-2.108 1.352-3.885 3.463-3.885 1.97 0 3.512 1.54 3.512 3.885 0 2.297-1.495 3.884-3.464 3.884m9.805 2.61h3.961l2.254-9.735h.143l2.253 9.735H90.7l3.153-12.412h-2.821l-2.254 9.759h-.214l-2.253-9.759h-3.725l-2.278 9.759h-.213l-2.23-9.759h-2.99l3.274 12.412m17.123 0h2.8V13.34c0-2.345 1.09-3.79 3.131-3.79h1.233V6.756h-.925c-1.59 0-2.8 1.09-3.274 2.132h-.19V7.064h-2.775zm21.057 0h2.183v-2.487h-2.159c-.854 0-1.21-.38-1.21-1.256V9.528h3.511V7.064h-3.511V3.582h-2.657v3.482h-2.325v2.464h2.159v6.229c0 2.63 1.589 3.719 4.009 3.719m9.693.019c2.586 0 4.864-1.279 5.67-3.86l-2.562-.616c-.451 1.373-1.755 2.084-3.131 2.084-2.041 0-3.393-1.326-3.417-3.41h9.419v-.782c0-3.695-2.301-6.443-6.097-6.443-3.346 0-6.216 2.63-6.216 6.537 0 3.79 2.538 6.49 6.334 6.49m-3.416-7.84c.166-1.492 1.518-2.747 3.298-2.747 1.708 0 3.108 1.066 3.25 2.747h-6.548"/><path fill="#19191C" fill-rule="evenodd" d="M108.916 19.476h-2.8V9.528h-2.182V7.064h4.982z" clip-rule="evenodd"/><path fill="#19191C" d="M107.309 5.342c1.02 0 1.779-.758 1.779-1.753 0-.971-.759-1.73-1.779-1.73-1.021 0-1.78.759-1.78 1.73 0 .995.759 1.753 1.78 1.753"/><path fill="#FD366E" d="M24.443 16.432v5.478H10.752c-3.989 0-7.472-2.203-9.335-5.478A11.041 11.041 0 0 1 0 11.695v-1.48a10.97 10.97 0 0 1 .381-2.247C1.661 3.368 5.82 0 10.751 0c4.934 0 9.092 3.37 10.371 7.967h-5.854c-.96-1.499-2.624-2.49-4.516-2.49s-3.555.991-4.516 2.49a5.47 5.47 0 0 0-.67 1.494 5.562 5.562 0 0 0-.202 1.494 5.5 5.5 0 0 0 1.69 3.983 5.32 5.32 0 0 0 3.698 1.494h13.69"/><path fill="#FD366E" d="M24.443 9.46v5.478h-9.994a5.5 5.5 0 0 0 1.691-3.983 5.56 5.56 0 0 0-.203-1.494h8.506"/></svg> | ||||
| Before Width: | Height: | Size: 2.6 KiB | 
| @@ -1,65 +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: 'projectId', | ||||
|       label: 'Project ID', | ||||
|       type: 'string', | ||||
|       required: true, | ||||
|       readOnly: false, | ||||
|       value: null, | ||||
|       placeholder: null, | ||||
|       description: 'Project ID of your Appwrite project.', | ||||
|       clickToCopy: false, | ||||
|     }, | ||||
|     { | ||||
|       key: 'apiKey', | ||||
|       label: 'API Key', | ||||
|       type: 'string', | ||||
|       required: true, | ||||
|       readOnly: false, | ||||
|       value: null, | ||||
|       placeholder: null, | ||||
|       description: 'API key of your Appwrite project.', | ||||
|       clickToCopy: false, | ||||
|     }, | ||||
|     { | ||||
|       key: 'instanceUrl', | ||||
|       label: 'Appwrite instance URL', | ||||
|       type: 'string', | ||||
|       required: false, | ||||
|       readOnly: false, | ||||
|       placeholder: '', | ||||
|       description: '', | ||||
|       clickToCopy: true, | ||||
|     }, | ||||
|     { | ||||
|       key: 'host', | ||||
|       label: 'Host Name', | ||||
|       type: 'string', | ||||
|       required: true, | ||||
|       readOnly: false, | ||||
|       value: null, | ||||
|       placeholder: null, | ||||
|       description: 'Host name of your Appwrite project.', | ||||
|       clickToCopy: false, | ||||
|     }, | ||||
|   ], | ||||
|  | ||||
|   verifyCredentials, | ||||
|   isStillVerified, | ||||
| }; | ||||
| @@ -1,8 +0,0 @@ | ||||
| import verifyCredentials from './verify-credentials.js'; | ||||
|  | ||||
| const isStillVerified = async ($) => { | ||||
|   await verifyCredentials($); | ||||
|   return true; | ||||
| }; | ||||
|  | ||||
| export default isStillVerified; | ||||
| @@ -1,5 +0,0 @@ | ||||
| const verifyCredentials = async ($) => { | ||||
|   await $.http.get('/v1/users'); | ||||
| }; | ||||
|  | ||||
| export default verifyCredentials; | ||||
| @@ -1,16 +0,0 @@ | ||||
| const addAuthHeader = ($, requestConfig) => { | ||||
|   requestConfig.headers['Content-Type'] = 'application/json'; | ||||
|  | ||||
|   if ($.auth.data?.apiKey && $.auth.data?.projectId) { | ||||
|     requestConfig.headers['X-Appwrite-Project'] = $.auth.data.projectId; | ||||
|     requestConfig.headers['X-Appwrite-Key'] = $.auth.data.apiKey; | ||||
|   } | ||||
|  | ||||
|   if ($.auth.data?.host) { | ||||
|     requestConfig.headers['Host'] = $.auth.data.host; | ||||
|   } | ||||
|  | ||||
|   return requestConfig; | ||||
| }; | ||||
|  | ||||
| export default addAuthHeader; | ||||
| @@ -1,13 +0,0 @@ | ||||
| const setBaseUrl = ($, requestConfig) => { | ||||
|   const instanceUrl = $.auth.data.instanceUrl; | ||||
|  | ||||
|   if (instanceUrl) { | ||||
|     requestConfig.baseURL = instanceUrl; | ||||
|   } else if ($.app.apiBaseUrl) { | ||||
|     requestConfig.baseURL = $.app.apiBaseUrl; | ||||
|   } | ||||
|  | ||||
|   return requestConfig; | ||||
| }; | ||||
|  | ||||
| export default setBaseUrl; | ||||
| @@ -1,4 +0,0 @@ | ||||
| import listCollections from './list-collections/index.js'; | ||||
| import listDatabases from './list-databases/index.js'; | ||||
|  | ||||
| export default [listCollections, listDatabases]; | ||||
| @@ -1,44 +0,0 @@ | ||||
| export default { | ||||
|   name: 'List collections', | ||||
|   key: 'listCollections', | ||||
|  | ||||
|   async run($) { | ||||
|     const collections = { | ||||
|       data: [], | ||||
|     }; | ||||
|     const databaseId = $.step.parameters.databaseId; | ||||
|  | ||||
|     if (!databaseId) { | ||||
|       return collections; | ||||
|     } | ||||
|  | ||||
|     const params = { | ||||
|       queries: [ | ||||
|         JSON.stringify({ | ||||
|           method: 'orderAsc', | ||||
|           attribute: 'name', | ||||
|         }), | ||||
|         JSON.stringify({ | ||||
|           method: 'limit', | ||||
|           values: [100], | ||||
|         }), | ||||
|       ], | ||||
|     }; | ||||
|  | ||||
|     const { data } = await $.http.get( | ||||
|       `/v1/databases/${databaseId}/collections`, | ||||
|       { params } | ||||
|     ); | ||||
|  | ||||
|     if (data?.collections) { | ||||
|       for (const collection of data.collections) { | ||||
|         collections.data.push({ | ||||
|           value: collection.$id, | ||||
|           name: collection.name, | ||||
|         }); | ||||
|       } | ||||
|     } | ||||
|  | ||||
|     return collections; | ||||
|   }, | ||||
| }; | ||||
| @@ -1,36 +0,0 @@ | ||||
| export default { | ||||
|   name: 'List databases', | ||||
|   key: 'listDatabases', | ||||
|  | ||||
|   async run($) { | ||||
|     const databases = { | ||||
|       data: [], | ||||
|     }; | ||||
|  | ||||
|     const params = { | ||||
|       queries: [ | ||||
|         JSON.stringify({ | ||||
|           method: 'orderAsc', | ||||
|           attribute: 'name', | ||||
|         }), | ||||
|         JSON.stringify({ | ||||
|           method: 'limit', | ||||
|           values: [100], | ||||
|         }), | ||||
|       ], | ||||
|     }; | ||||
|  | ||||
|     const { data } = await $.http.get('/v1/databases', { params }); | ||||
|  | ||||
|     if (data?.databases) { | ||||
|       for (const database of data.databases) { | ||||
|         databases.data.push({ | ||||
|           value: database.$id, | ||||
|           name: database.name, | ||||
|         }); | ||||
|       } | ||||
|     } | ||||
|  | ||||
|     return databases; | ||||
|   }, | ||||
| }; | ||||
| @@ -1,21 +0,0 @@ | ||||
| import defineApp from '../../helpers/define-app.js'; | ||||
| import addAuthHeader from './common/add-auth-header.js'; | ||||
| import setBaseUrl from './common/set-base-url.js'; | ||||
| import auth from './auth/index.js'; | ||||
| import triggers from './triggers/index.js'; | ||||
| import dynamicData from './dynamic-data/index.js'; | ||||
|  | ||||
| export default defineApp({ | ||||
|   name: 'Appwrite', | ||||
|   key: 'appwrite', | ||||
|   baseUrl: 'https://appwrite.io', | ||||
|   apiBaseUrl: 'https://cloud.appwrite.io', | ||||
|   iconUrl: '{BASE_URL}/apps/appwrite/assets/favicon.svg', | ||||
|   authDocUrl: '{DOCS_URL}/apps/appwrite/connection', | ||||
|   primaryColor: 'FD366E', | ||||
|   supportsConnections: true, | ||||
|   beforeRequest: [setBaseUrl, addAuthHeader], | ||||
|   auth, | ||||
|   triggers, | ||||
|   dynamicData, | ||||
| }); | ||||
| @@ -1,3 +0,0 @@ | ||||
| import newDocuments from './new-documents/index.js'; | ||||
|  | ||||
| export default [newDocuments]; | ||||
| @@ -1,104 +0,0 @@ | ||||
| import defineTrigger from '../../../../helpers/define-trigger.js'; | ||||
|  | ||||
| export default defineTrigger({ | ||||
|   name: 'New documents', | ||||
|   key: 'newDocuments', | ||||
|   pollInterval: 15, | ||||
|   description: 'Triggers when a new document is created.', | ||||
|   arguments: [ | ||||
|     { | ||||
|       label: 'Database', | ||||
|       key: 'databaseId', | ||||
|       type: 'dropdown', | ||||
|       required: true, | ||||
|       description: '', | ||||
|       variables: true, | ||||
|       source: { | ||||
|         type: 'query', | ||||
|         name: 'getDynamicData', | ||||
|         arguments: [ | ||||
|           { | ||||
|             name: 'key', | ||||
|             value: 'listDatabases', | ||||
|           }, | ||||
|         ], | ||||
|       }, | ||||
|     }, | ||||
|     { | ||||
|       label: 'Collection', | ||||
|       key: 'collectionId', | ||||
|       type: 'dropdown', | ||||
|       required: true, | ||||
|       dependsOn: ['parameters.databaseId'], | ||||
|       description: '', | ||||
|       variables: true, | ||||
|       source: { | ||||
|         type: 'query', | ||||
|         name: 'getDynamicData', | ||||
|         arguments: [ | ||||
|           { | ||||
|             name: 'key', | ||||
|             value: 'listCollections', | ||||
|           }, | ||||
|           { | ||||
|             name: 'parameters.databaseId', | ||||
|             value: '{parameters.databaseId}', | ||||
|           }, | ||||
|         ], | ||||
|       }, | ||||
|     }, | ||||
|   ], | ||||
|  | ||||
|   async run($) { | ||||
|     const { databaseId, collectionId } = $.step.parameters; | ||||
|  | ||||
|     const limit = 1; | ||||
|     let lastDocumentId = undefined; | ||||
|     let offset = 0; | ||||
|     let documentCount = 0; | ||||
|  | ||||
|     do { | ||||
|       const params = { | ||||
|         queries: [ | ||||
|           JSON.stringify({ | ||||
|             method: 'orderDesc', | ||||
|             attribute: '$createdAt', | ||||
|           }), | ||||
|           JSON.stringify({ | ||||
|             method: 'limit', | ||||
|             values: [limit], | ||||
|           }), | ||||
|           // An invalid cursor shouldn't be sent. | ||||
|           lastDocumentId && | ||||
|             JSON.stringify({ | ||||
|               method: 'cursorAfter', | ||||
|               values: [lastDocumentId], | ||||
|             }), | ||||
|         ].filter(Boolean), | ||||
|       }; | ||||
|  | ||||
|       const { data } = await $.http.get( | ||||
|         `/v1/databases/${databaseId}/collections/${collectionId}/documents`, | ||||
|         { params } | ||||
|       ); | ||||
|  | ||||
|       const documents = data?.documents; | ||||
|       documentCount = documents?.length; | ||||
|       offset = offset + limit; | ||||
|       lastDocumentId = documents[documentCount - 1]?.$id; | ||||
|  | ||||
|       if (!documentCount) { | ||||
|         return; | ||||
|       } | ||||
|  | ||||
|       for (const document of documents) { | ||||
|         $.pushTriggerItem({ | ||||
|           raw: document, | ||||
|           meta: { | ||||
|             internalId: document.$id, | ||||
|           }, | ||||
|         }); | ||||
|       } | ||||
|     } while (documentCount === limit); | ||||
|   }, | ||||
| }); | ||||
| @@ -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 | 
| @@ -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, | ||||
|   }); | ||||
| } | ||||
| @@ -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, | ||||
| }; | ||||
| @@ -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; | ||||
| @@ -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; | ||||
| @@ -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; | ||||
| @@ -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; | ||||
| @@ -1,3 +0,0 @@ | ||||
| const authScope = ['read', 'write', 'admin', 'email']; | ||||
|  | ||||
| export default authScope; | ||||
| @@ -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; | ||||
| @@ -1,3 +0,0 @@ | ||||
| import listForums from './list-forums/index.js'; | ||||
|  | ||||
| export default [listForums]; | ||||
| @@ -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; | ||||
|   }, | ||||
| }; | ||||
| @@ -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, | ||||
| }); | ||||
| @@ -1,4 +0,0 @@ | ||||
| import newComments from './new-comments/index.js'; | ||||
| import newFlaggedComments from './new-flagged-comments/index.js'; | ||||
|  | ||||
| export default [newComments, newFlaggedComments]; | ||||
| @@ -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); | ||||
|   }, | ||||
| }); | ||||
| @@ -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); | ||||
|   }, | ||||
| }); | ||||
| @@ -5,24 +5,11 @@ const formatDateTime = ($) => { | ||||
|  | ||||
|   const fromFormat = $.step.parameters.fromFormat; | ||||
|   const fromTimezone = $.step.parameters.fromTimezone; | ||||
|   let inputDateTime; | ||||
|  | ||||
|   if (fromFormat === 'X') { | ||||
|     inputDateTime = DateTime.fromSeconds(Number(input), fromFormat, { | ||||
|   const inputDateTime = DateTime.fromFormat(input, fromFormat, { | ||||
|     zone: fromTimezone, | ||||
|     setZone: true, | ||||
|   }); | ||||
|   } else if (fromFormat === 'x') { | ||||
|     inputDateTime = DateTime.fromMillis(Number(input), fromFormat, { | ||||
|       zone: fromTimezone, | ||||
|       setZone: true, | ||||
|     }); | ||||
|   } else { | ||||
|     inputDateTime = DateTime.fromFormat(input, fromFormat, { | ||||
|       zone: fromTimezone, | ||||
|       setZone: true, | ||||
|     }); | ||||
|   } | ||||
|  | ||||
|   const toFormat = $.step.parameters.toFormat; | ||||
|   const toTimezone = $.step.parameters.toTimezone; | ||||
|   | ||||
| @@ -2,32 +2,30 @@ 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'; | ||||
| import lowercase from './transformers/lowercase.js'; | ||||
| import markdownToHtml from './transformers/markdown-to-html.js'; | ||||
| import pluralize from './transformers/pluralize.js'; | ||||
| import replaceWithRegEx from './transformers/replace-with-regex.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, | ||||
|   lowercase, | ||||
|   markdownToHtml, | ||||
|   pluralize, | ||||
|   replaceWithRegEx, | ||||
|   replace, | ||||
|   stringToBase64, | ||||
|   encodeUri, | ||||
|   trimWhitespace, | ||||
|   useDefaultValue, | ||||
| }; | ||||
| @@ -47,19 +45,15 @@ 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' }, | ||||
|         { label: 'Extract Number', value: 'extractNumber' }, | ||||
|         { label: 'Lowercase', value: 'lowercase' }, | ||||
|         { label: 'Pluralize', value: 'pluralize' }, | ||||
|         { label: 'Replace with RegEx', value: 'replaceWithRegEx' }, | ||||
|         { 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' }, | ||||
|       ], | ||||
|   | ||||
| @@ -1,8 +0,0 @@ | ||||
| const encodeUriComponent = ($) => { | ||||
|   const input = $.step.parameters.input; | ||||
|   const encodedString = encodeURIComponent(input); | ||||
|  | ||||
|   return encodedString; | ||||
| }; | ||||
|  | ||||
| export default encodeUriComponent; | ||||
| @@ -1,8 +0,0 @@ | ||||
| const encodeUri = ($) => { | ||||
|   const input = $.step.parameters.input; | ||||
|   const encodedString = encodeURI(input); | ||||
|  | ||||
|   return encodedString; | ||||
| }; | ||||
|  | ||||
| export default encodeUri; | ||||
| @@ -0,0 +1,10 @@ | ||||
| const replaceWithRegEx = ($) => { | ||||
|   const input = $.step.parameters.input; | ||||
|  | ||||
|   const find = new RegExp($.step.parameters.find); | ||||
|   const replace = $.step.parameters.replace; | ||||
|  | ||||
|   return input.replace(find, replace); | ||||
| }; | ||||
|  | ||||
| export default replaceWithRegEx; | ||||
| @@ -1,15 +1,14 @@ | ||||
| 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'; | ||||
| import lowercase from './text/lowercase.js'; | ||||
| import markdownToHtml from './text/markdown-to-html.js'; | ||||
| import pluralize from './text/pluralize.js'; | ||||
| import replaceWithRegEx from './text/replace-with-regex.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,16 +20,15 @@ import formatDateTime from './date-time/format-date-time.js'; | ||||
| const options = { | ||||
|   base64ToString, | ||||
|   capitalize, | ||||
|   encodeUriComponent, | ||||
|   extractEmailAddress, | ||||
|   extractNumber, | ||||
|   htmlToMarkdown, | ||||
|   lowercase, | ||||
|   markdownToHtml, | ||||
|   pluralize, | ||||
|   replaceWithRegEx, | ||||
|   replace, | ||||
|   stringToBase64, | ||||
|   encodeUri, | ||||
|   trimWhitespace, | ||||
|   useDefaultValue, | ||||
|   performMathOperation, | ||||
|   | ||||
| @@ -1,12 +0,0 @@ | ||||
| const encodeUriComponent = [ | ||||
|   { | ||||
|     label: 'Input', | ||||
|     key: 'input', | ||||
|     type: 'string', | ||||
|     required: true, | ||||
|     description: 'URI Component to encode', | ||||
|     variables: true, | ||||
|   }, | ||||
| ]; | ||||
|  | ||||
| export default encodeUriComponent; | ||||
| @@ -1,12 +0,0 @@ | ||||
| const encodeUri = [ | ||||
|   { | ||||
|     label: 'Input', | ||||
|     key: 'input', | ||||
|     type: 'string', | ||||
|     required: true, | ||||
|     description: 'URI to encode', | ||||
|     variables: true, | ||||
|   }, | ||||
| ]; | ||||
|  | ||||
| export default encodeUri; | ||||
| @@ -0,0 +1,29 @@ | ||||
| const replaceWithRegEx = [ | ||||
|   { | ||||
|     label: 'Input', | ||||
|     key: 'input', | ||||
|     type: 'string', | ||||
|     required: true, | ||||
|     description: | ||||
|       'Text that you want to search for and replace values with regex.', | ||||
|     variables: true, | ||||
|   }, | ||||
|   { | ||||
|     label: 'Find', | ||||
|     key: 'find', | ||||
|     type: 'string', | ||||
|     required: true, | ||||
|     description: 'RegEx that will be searched for.', | ||||
|     variables: true, | ||||
|   }, | ||||
|   { | ||||
|     label: 'Replace', | ||||
|     key: 'replace', | ||||
|     type: 'string', | ||||
|     required: false, | ||||
|     description: 'Text that will replace the found regex.', | ||||
|     variables: true, | ||||
|   }, | ||||
| ]; | ||||
|  | ||||
| export default replaceWithRegEx; | ||||
| @@ -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, | ||||
|     }); | ||||
|   }, | ||||
| }); | ||||
| @@ -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, | ||||
|     }); | ||||
|   }, | ||||
| }); | ||||
| @@ -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], | ||||
|     }); | ||||
|   }, | ||||
| }); | ||||
| @@ -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]; | ||||
| @@ -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, | ||||
|     }); | ||||
|   }, | ||||
| }); | ||||
| @@ -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 | 
| @@ -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, | ||||
|   }); | ||||
| } | ||||
| @@ -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, | ||||
| }; | ||||
| @@ -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; | ||||
| @@ -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; | ||||
| @@ -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; | ||||
| @@ -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; | ||||
| @@ -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; | ||||
| @@ -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; | ||||
| @@ -1,4 +0,0 @@ | ||||
| import listTaskLists from './list-task-lists/index.js'; | ||||
| import listTasks from './list-tasks/index.js'; | ||||
|  | ||||
| export default [listTaskLists, listTasks]; | ||||
| @@ -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; | ||||
|   }, | ||||
| }; | ||||
| @@ -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; | ||||
|   }, | ||||
| }; | ||||
| @@ -1,22 +0,0 @@ | ||||
| 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 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', | ||||
|   supportsConnections: true, | ||||
|   beforeRequest: [addAuthHeader], | ||||
|   auth, | ||||
|   actions, | ||||
|   dynamicData, | ||||
|   triggers, | ||||
| }); | ||||
| @@ -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]; | ||||
| @@ -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); | ||||
|   }, | ||||
| }); | ||||
| @@ -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); | ||||
|   }, | ||||
| }); | ||||
| @@ -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); | ||||
|   }, | ||||
| }); | ||||
| @@ -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, | ||||
|   }, | ||||
| ]; | ||||
| @@ -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 }); | ||||
|   }, | ||||
| }); | ||||
| @@ -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, | ||||
|   }, | ||||
| ]; | ||||
| @@ -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 }); | ||||
|   }, | ||||
| }); | ||||
| @@ -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, | ||||
|   }, | ||||
| ]; | ||||
| @@ -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 }); | ||||
|   }, | ||||
| }); | ||||
| @@ -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, | ||||
|   }, | ||||
| ]; | ||||
| @@ -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 }); | ||||
|   }, | ||||
| }); | ||||
| @@ -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', | ||||
|         }, | ||||
|       ], | ||||
|     }, | ||||
|   }, | ||||
| ]; | ||||
| @@ -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 }); | ||||
|   }, | ||||
| }); | ||||
| @@ -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, | ||||
| ]; | ||||
| @@ -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 | 
| @@ -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, | ||||
| }; | ||||
| @@ -1,8 +0,0 @@ | ||||
| import verifyCredentials from './verify-credentials.js'; | ||||
|  | ||||
| const isStillVerified = async ($) => { | ||||
|   await verifyCredentials($); | ||||
|   return true; | ||||
| }; | ||||
|  | ||||
| export default isStillVerified; | ||||
| @@ -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; | ||||
| @@ -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; | ||||
Some files were not shown because too many files have changed in this diff Show More
		Reference in New Issue
	
	Block a user