Add Activepieces integration for workflow automation

- Add Activepieces fork with SmoothSchedule custom piece
- Create integrations app with Activepieces service layer
- Add embed token endpoint for iframe integration
- Create Automations page with embedded workflow builder
- Add sidebar visibility fix for embed mode
- Add list inactive customers endpoint to Public API
- Include SmoothSchedule triggers: event created/updated/cancelled
- Include SmoothSchedule actions: create/update/cancel events, list resources/services/customers

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
This commit is contained in:
poduck
2025-12-18 22:59:37 -05:00
parent 9848268d34
commit 3aa7199503
16292 changed files with 1284892 additions and 4708 deletions

View File

@@ -0,0 +1,18 @@
{
"extends": ["../../../../.eslintrc.json"],
"ignorePatterns": ["!**/*"],
"overrides": [
{
"files": ["*.ts", "*.tsx", "*.js", "*.jsx"],
"rules": {}
},
{
"files": ["*.ts", "*.tsx"],
"rules": {}
},
{
"files": ["*.js", "*.jsx"],
"rules": {}
}
]
}

View File

@@ -0,0 +1,7 @@
# pieces-wootric
This library was generated with [Nx](https://nx.dev).
## Building
Run `nx build pieces-wootric` to build the library.

View File

@@ -0,0 +1,4 @@
{
"name": "@activepieces/piece-wootric",
"version": "0.0.9"
}

View File

@@ -0,0 +1,57 @@
{
"name": "pieces-wootric",
"$schema": "../../../../node_modules/nx/schemas/project-schema.json",
"sourceRoot": "packages/pieces/community/wootric/src",
"projectType": "library",
"targets": {
"build": {
"executor": "@nx/js:tsc",
"outputs": [
"{options.outputPath}"
],
"options": {
"outputPath": "dist/packages/pieces/community/wootric",
"tsConfig": "packages/pieces/community/wootric/tsconfig.lib.json",
"packageJson": "packages/pieces/community/wootric/package.json",
"main": "packages/pieces/community/wootric/src/index.ts",
"assets": [
"packages/pieces/community/wootric/*.md",
{
"input": "packages/pieces/community/wootric/src/i18n",
"output": "./src/i18n",
"glob": "**/!(i18n.json)"
}
],
"buildableProjectDepsInPackageJsonType": "dependencies",
"updateBuildableProjectDepsInPackageJson": true
},
"dependsOn": [
"^build",
"prebuild"
]
},
"publish": {
"command": "node tools/scripts/publish.mjs pieces-community-wootric {args.ver} {args.tag}",
"dependsOn": [
"build"
]
},
"lint": {
"executor": "@nx/eslint:lint",
"outputs": [
"{options.outputFile}"
]
},
"prebuild": {
"executor": "nx:run-commands",
"options": {
"cwd": "packages/pieces/community/wootric",
"command": "bun install --no-save --silent"
},
"dependsOn": [
"^build"
]
}
},
"tags": []
}

View File

@@ -0,0 +1,9 @@
{
"Measure and boost customer happiness": "Kundenzufriedenheit messen und steigern",
"Trigger Wootric Survey": "Wootric-Umfrage auslösen",
"Trigger a survey from Wootric": "Eine Umfrage von Wootric auslösen",
"Emails": "E-Mails",
"Survey Immediately": "Umfrage sofort",
"End user emails, where you want the survey to be received": "Endbenutzer-E-Mails, wo die Umfrage empfangen werden soll",
"Enter \"true\" to survey immediately to bypass checks, otherwise \"false\"": "Geben Sie \"true\" zur Umfrage sofort ein, um Prüfungen zu umgehen, ansonsten \"falsch\""
}

View File

@@ -0,0 +1,9 @@
{
"Measure and boost customer happiness": "Medir y mejorar la felicidad del cliente",
"Trigger Wootric Survey": "Encuesta sanguinaria de activación",
"Trigger a survey from Wootric": "Activar una encuesta desde Wootric",
"Emails": "Correos",
"Survey Immediately": "Encuesta inmediatamente",
"End user emails, where you want the survey to be received": "Correos de usuario final, donde quieres que la encuesta sea recibida",
"Enter \"true\" to survey immediately to bypass checks, otherwise \"false\"": "Introduzca \"verdadero\" para la encuesta inmediatamente para eludir las comprobaciones, de lo contrario \"falso\""
}

View File

@@ -0,0 +1,9 @@
{
"Measure and boost customer happiness": "Mesurer et améliorer le bonheur des clients",
"Trigger Wootric Survey": "Déclencher Wootric Survey",
"Trigger a survey from Wootric": "Déclencher une enquête de Wootric",
"Emails": "E-mails",
"Survey Immediately": "Enquête immédiate",
"End user emails, where you want the survey to be received": "Emails de l'utilisateur final, où vous voulez que l'enquête soit reçue",
"Enter \"true\" to survey immediately to bypass checks, otherwise \"false\"": "Entrez \"true\" pour l'enquête immédiatement pour contourner les vérifications, sinon \"false\""
}

View File

@@ -0,0 +1,9 @@
{
"Measure and boost customer happiness": "顧客の幸せを測定し、向上させる",
"Trigger Wootric Survey": "トリガーWootric Survey",
"Trigger a survey from Wootric": "Wootric からアンケートをトリガーする",
"Emails": "E-mail",
"Survey Immediately": "すぐにアンケートする",
"End user emails, where you want the survey to be received": "アンケートを受信したいユーザーのメールを終了します。",
"Enter \"true\" to survey immediately to bypass checks, otherwise \"false\"": "チェックをバイパスするにはすぐにアンケートに「true」を入力してください。そうでない場合は「false」を入力してください"
}

View File

@@ -0,0 +1,9 @@
{
"Measure and boost customer happiness": "Meet en verhoog het klantgeluk",
"Trigger Wootric Survey": "Trigger Wootrisch Survey",
"Trigger a survey from Wootric": "Trigger een enquête van Wootric",
"Emails": "E-mails",
"Survey Immediately": "Onmiddellijk onderzoek",
"End user emails, where you want the survey to be received": "Einde gebruikerse-mails, waar u de enquête wilt ontvangen",
"Enter \"true\" to survey immediately to bypass checks, otherwise \"false\"": "Voer \"true\" in om direct te onderzoeken om controles te omzeilen, anders \"false\""
}

View File

@@ -0,0 +1,9 @@
{
"Measure and boost customer happiness": "Medir e melhorar a felicidade do cliente",
"Trigger Wootric Survey": "Ativar Pesquisa Wootric",
"Trigger a survey from Wootric": "Acionar uma pesquisa no Wootric",
"Emails": "e-mails",
"Survey Immediately": "Pesquisa imediatamente",
"End user emails, where you want the survey to be received": "Fim de email de usuário, onde você quer que a pesquisa seja recebida",
"Enter \"true\" to survey immediately to bypass checks, otherwise \"false\"": "Digite \"true\" para a pesquisa imediatamente para ignorar as verificações, caso contrário \"false\""
}

View File

@@ -0,0 +1,10 @@
{
"Wootric": "Вурическая",
"Measure and boost customer happiness": "Измерьте и ускорьте счастье клиента",
"Trigger Wootric Survey": "Триггер Wootric Survey",
"Trigger a survey from Wootric": "Запустить опрос из Wootric",
"Emails": "Письма",
"Survey Immediately": "Опрос немедленно",
"End user emails, where you want the survey to be received": "Электронная почта конечного пользователя, где вы хотите получить опрос",
"Enter \"true\" to survey immediately to bypass checks, otherwise \"false\"": "Введите \"true\", чтобы немедленно пропустить проверки, в противном случае \"false\""
}

View File

@@ -0,0 +1,9 @@
{
"Measure and boost customer happiness": "Measure and boost customer happiness",
"Trigger Wootric Survey": "Trigger Wootric Survey",
"Trigger a survey from Wootric": "Trigger a survey from Wootric",
"Emails": "Emails",
"Survey Immediately": "Survey Immediately",
"End user emails, where you want the survey to be received": "End user emails, where you want the survey to be received",
"Enter \"true\" to survey immediately to bypass checks, otherwise \"false\"": "Enter \"true\" to survey immediately to bypass checks, otherwise \"false\""
}

View File

@@ -0,0 +1,10 @@
{
"Wootric": "Wootric",
"Measure and boost customer happiness": "Measure and boost customer happiness",
"Trigger Wootric Survey": "Trigger Wootric Survey",
"Trigger a survey from Wootric": "Trigger a survey from Wootric",
"Emails": "Emails",
"Survey Immediately": "Survey Immediately",
"End user emails, where you want the survey to be received": "End user emails, where you want the survey to be received",
"Enter \"true\" to survey immediately to bypass checks, otherwise \"false\"": "Enter \"true\" to survey immediately to bypass checks, otherwise \"false\""
}

View File

@@ -0,0 +1,9 @@
{
"Measure and boost customer happiness": "Measure and boost customer happiness",
"Trigger Wootric Survey": "Trigger Wootric Survey",
"Trigger a survey from Wootric": "Trigger a survey from Wootric",
"Emails": "电子邮件",
"Survey Immediately": "Survey Immediately",
"End user emails, where you want the survey to be received": "End user emails, where you want the survey to be received",
"Enter \"true\" to survey immediately to bypass checks, otherwise \"false\"": "Enter \"true\" to survey immediately to bypass checks, otherwise \"false\""
}

View File

@@ -0,0 +1,27 @@
import { createPiece, PieceAuth } from '@activepieces/pieces-framework';
import { createWootricSurvey } from './lib/actions/create-survey';
import { OAuth2GrantType } from '@activepieces/shared';
export const WOOTRIC_API_URL = 'https://api.wootric.com';
export const WOOTRIC_IMAGE_URL =
'https://assets-production.wootric.com/assets/wootric-is-now-inmoment-250x108-85cb4900c62ff4d33200abafee7d63372d410abc5bf0cab90e80a07d4f4e5a31.png';
export const wootricAuth = PieceAuth.OAuth2({
required: true,
grantType: OAuth2GrantType.CLIENT_CREDENTIALS,
authUrl: '',
tokenUrl: `${WOOTRIC_API_URL}/oauth/token`,
scope: [],
});
export const wootric = createPiece({
displayName: 'Wootric',
description: 'Measure and boost customer happiness',
auth: wootricAuth,
minimumSupportedRelease: '0.30.0',
logoUrl: WOOTRIC_IMAGE_URL,
authors: ["abuaboud"],
actions: [createWootricSurvey],
triggers: [],
});

View File

@@ -0,0 +1,47 @@
import { createAction, Property } from '@activepieces/pieces-framework';
import { wootricAuth, WOOTRIC_API_URL } from '../../';
import { httpClient, HttpMethod } from '@activepieces/pieces-common';
export const sendSurvey = async (surveyRequestPayload: object) => {
const EMAIL_SURVEY = `${WOOTRIC_API_URL}/v1/email_survey`;
return await httpClient.sendRequest({
method: HttpMethod.POST,
url: EMAIL_SURVEY,
body: surveyRequestPayload,
});
};
export const createWootricSurvey = createAction({
name: 'trigger_wootric_survey',
auth: wootricAuth,
displayName: 'Trigger Wootric Survey',
description: 'Trigger a survey from Wootric',
props: {
emails: Property.Array({
displayName: 'Emails',
description: 'End user emails, where you want the survey to be received',
required: true,
defaultValue: [],
}),
surveyImmediately: Property.Checkbox({
displayName: 'Survey Immediately',
description:
'Enter "true" to survey immediately to bypass checks, otherwise "false"',
required: true,
}),
},
async run(context) {
const { surveyImmediately, emails } = context.propsValue;
const { access_token } = context.auth;
const surveyRequestPayload = {
emails: emails,
survey_immediately: surveyImmediately,
access_token: access_token,
};
const surveyResponse = await sendSurvey(surveyRequestPayload);
return surveyResponse.body;
},
});

View File

@@ -0,0 +1,19 @@
{
"extends": "../../../../tsconfig.base.json",
"compilerOptions": {
"module": "commonjs",
"forceConsistentCasingInFileNames": true,
"strict": true,
"noImplicitOverride": true,
"noPropertyAccessFromIndexSignature": true,
"noImplicitReturns": true,
"noFallthroughCasesInSwitch": true
},
"files": [],
"include": [],
"references": [
{
"path": "./tsconfig.lib.json"
}
]
}

View File

@@ -0,0 +1,11 @@
{
"extends": "./tsconfig.json",
"compilerOptions": {
"module": "commonjs",
"outDir": "../../../../dist/out-tsc",
"declaration": true,
"types": ["node"]
},
"exclude": ["jest.config.ts", "src/**/*.spec.ts", "src/**/*.test.ts"],
"include": ["src/**/*.ts"]
}