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,57 @@
{
"You can obtain API key from [API Settings](https://app.usemotion.com/web/settings/api).": "Sie können API-Schlüssel unter [API-Einstellungen](https://app.usemotion.com/web/settings/api).",
"Create Task": "Aufgabe erstellen",
"Update Task": "Aufgabe aktualisieren",
"Create Project": "Projekt erstellen",
"Get Task": "Aufgabe abrufen",
"Move Task": "Aufgabe verschieben",
"Find Task": "Aufgabe finden",
"Custom API Call": "Eigener API-Aufruf",
"Creates a new task.": "Erstellt eine neue Aufgabe.",
"Update an existing task in Motion": "Bestehende Aufgabe in Bewegung aktualisieren",
"Create a new project in Motion": "Neues Projekt in Bewegung erstellen",
"Get details of a specific task by ID.": "Erhalten Sie Details zu einer bestimmten Aufgabe per ID.",
"Moves a task to a different workspace.": "Verschiebt eine Aufgabe in einen anderen Arbeitsbereich.",
"Finds an existing task.": "Findet eine existierende Aufgabe.",
"Make a custom API call to a specific endpoint": "Einen benutzerdefinierten API-Aufruf an einen bestimmten Endpunkt machen",
"Workspace ID": "Arbeitsbereich-ID",
"Task Name": "Aufgabenname",
"Description": "Beschreibung",
"Due Date": "Fälligkeitsdatum",
"Duration": "Dauer",
"Status": "Status",
"Priority": "Priorität",
"Project": "Projekt",
"Assignee": "Assignee",
"Labels": "Etiketten",
"Task ID": "Task ID",
"Project Name": "Projekt Name",
"Current Workspace": "Aktueller Arbeitsbereich",
"Target Workspace": "Zielarbeitsbereich",
"Include All Statuses": "Alle Status einbeziehen",
"Method": "Methode",
"Headers": "Kopfzeilen",
"Query Parameters": "Abfrageparameter",
"Body": "Körper",
"Response is Binary ?": "Antwort ist binär?",
"No Error on Failure": "Kein Fehler bei Fehler",
"Timeout (in seconds)": "Timeout (in Sekunden)",
"Duration in minutes.": "Dauer in Minuten.",
"The names of the labels to be added to the task.": "Die Namen der Labels, die der Aufgabe hinzugefügt werden sollen.",
"The names of the labels to be added to the task": "Die Namen der Labels, die der Aufgabe hinzugefügt werden sollen",
"ISO 8601 Due date on the project": "ISO 8601 Enddatum des Projekts",
"Authorization headers are injected automatically from your connection.": "Autorisierungs-Header werden automatisch von Ihrer Verbindung injiziert.",
"Enable for files like PDFs, images, etc..": "Aktivieren für Dateien wie PDFs, Bilder, etc..",
"ASAP": "ASAP",
"HIGH": "HOCH",
"MEDIUM": "MEDIUM",
"LOW": "NACH",
"GET": "ERHALTEN",
"POST": "POST",
"PATCH": "PATCH",
"PUT": "PUT",
"DELETE": "LÖSCHEN",
"HEAD": "HEAD",
"Task Created": "Aufgabe erstellt",
"Triggers when a new task is created.": "Wird ausgelöst, wenn eine neue Aufgabe erstellt wird."
}

View File

@@ -0,0 +1,57 @@
{
"You can obtain API key from [API Settings](https://app.usemotion.com/web/settings/api).": "Puedes obtener la clave API de [Configuración API](https://app.usemotion.com/web/settings/api).",
"Create Task": "Crear tarea",
"Update Task": "Actualizar tarea",
"Create Project": "Crear proyecto",
"Get Task": "Obtener tarea",
"Move Task": "Mover tarea",
"Find Task": "Buscar tarea",
"Custom API Call": "Llamada API personalizada",
"Creates a new task.": "Crea una nueva tarea.",
"Update an existing task in Motion": "Actualizar una tarea existente en movimiento",
"Create a new project in Motion": "Crear un nuevo proyecto en movimiento",
"Get details of a specific task by ID.": "Obtener detalles de una tarea específica por ID.",
"Moves a task to a different workspace.": "Mueve una tarea a un espacio de trabajo diferente.",
"Finds an existing task.": "Encuentra una tarea existente.",
"Make a custom API call to a specific endpoint": "Hacer una llamada API personalizada a un extremo específico",
"Workspace ID": "ID del área de trabajo",
"Task Name": "Nombre de tarea",
"Description": "Descripción",
"Due Date": "Fecha de fin",
"Duration": "Duración",
"Status": "Estado",
"Priority": "Prioridad",
"Project": "Projekt",
"Assignee": "Assignee",
"Labels": "Etiquetas",
"Task ID": "Task ID",
"Project Name": "Nombre del proyecto",
"Current Workspace": "Espacio de trabajo actual",
"Target Workspace": "Espacio de trabajo objetivo",
"Include All Statuses": "Incluye todos los estados",
"Method": "Método",
"Headers": "Encabezados",
"Query Parameters": "Parámetros de consulta",
"Body": "Cuerpo",
"Response is Binary ?": "¿Respuesta es binaria?",
"No Error on Failure": "No hay ningún error en fallo",
"Timeout (in seconds)": "Tiempo de espera (en segundos)",
"Duration in minutes.": "Duración en minutos.",
"The names of the labels to be added to the task.": "Los nombres de las etiquetas que se añadirán a la tarea.",
"The names of the labels to be added to the task": "Los nombres de las etiquetas a añadir a la tarea",
"ISO 8601 Due date on the project": "ISO 8601 Fecha de vencimiento del proyecto",
"Authorization headers are injected automatically from your connection.": "Las cabeceras de autorización se inyectan automáticamente desde tu conexión.",
"Enable for files like PDFs, images, etc..": "Activar para archivos como PDFs, imágenes, etc.",
"ASAP": "ASAP",
"HIGH": "ALTA",
"MEDIUM": "MEDIUM",
"LOW": "MÁS",
"GET": "RECOGER",
"POST": "POST",
"PATCH": "PATCH",
"PUT": "PUT",
"DELETE": "BORRAR",
"HEAD": "LIMPIO",
"Task Created": "Tarea creada",
"Triggers when a new task is created.": "Se activa cuando se crea una nueva tarea."
}

View File

@@ -0,0 +1,57 @@
{
"You can obtain API key from [API Settings](https://app.usemotion.com/web/settings/api).": "Vous pouvez obtenir la clé API depuis [API Settings](https://app.usemotion.com/web/settings/api).",
"Create Task": "Créer une tâche",
"Update Task": "Tâche de mise à jour",
"Create Project": "Créer un projet",
"Get Task": "Obtenir une tâche",
"Move Task": "Déplacer la tâche",
"Find Task": "Trouver une tâche",
"Custom API Call": "Appel API personnalisé",
"Creates a new task.": "Crée une nouvelle tâche.",
"Update an existing task in Motion": "Mettre à jour une tâche existante en Mouvement",
"Create a new project in Motion": "Créer un nouveau projet en Mouvement",
"Get details of a specific task by ID.": "Obtenir les détails d'une tâche spécifique par ID.",
"Moves a task to a different workspace.": "Déplace une tâche vers un autre espace de travail.",
"Finds an existing task.": "Trouve une tâche existante.",
"Make a custom API call to a specific endpoint": "Passez un appel API personnalisé à un point de terminaison spécifique",
"Workspace ID": "ID de l'espace de travail",
"Task Name": "Nom de la tâche",
"Description": "Libellé",
"Due Date": "Date de fin",
"Duration": "Durée",
"Status": "Statut",
"Priority": "Priorité",
"Project": "Projet",
"Assignee": "Assignee",
"Labels": "Étiquettes",
"Task ID": "Task ID",
"Project Name": "Project Name",
"Current Workspace": "Espace de travail actuel",
"Target Workspace": "Espace de travail cible",
"Include All Statuses": "Inclure tous les statuts",
"Method": "Méthode",
"Headers": "En-têtes",
"Query Parameters": "Paramètres de requête",
"Body": "Corps",
"Response is Binary ?": "La réponse est Binaire ?",
"No Error on Failure": "Aucune erreur en cas d'échec",
"Timeout (in seconds)": "Délai d'attente (en secondes)",
"Duration in minutes.": "Durée en minutes.",
"The names of the labels to be added to the task.": "Les noms des étiquettes à ajouter à la tâche.",
"The names of the labels to be added to the task": "Les noms des étiquettes à ajouter à la tâche",
"ISO 8601 Due date on the project": "Date d'échéance ISO 8601 sur le projet",
"Authorization headers are injected automatically from your connection.": "Les en-têtes d'autorisation sont injectés automatiquement à partir de votre connexion.",
"Enable for files like PDFs, images, etc..": "Activer pour les fichiers comme les PDFs, les images, etc.",
"ASAP": "Le plus vite possible",
"HIGH": "HAUT",
"MEDIUM": "MOYEN",
"LOW": "FAIBLE",
"GET": "OBTENIR",
"POST": "POSTER",
"PATCH": "PATCH",
"PUT": "EFFACER",
"DELETE": "SUPPRIMER",
"HEAD": "HEAD",
"Task Created": "Tâche créée",
"Triggers when a new task is created.": "Déclenche quand une nouvelle tâche est créée."
}

View File

@@ -0,0 +1,57 @@
{
"You can obtain API key from [API Settings](https://app.usemotion.com/web/settings/api).": "[API 設定](https://app.usemotion.com/web/settings/api)からAPIキーを取得できます。",
"Create Task": "タスクを作成",
"Update Task": "タスクの更新",
"Create Project": "プロジェクトを作成",
"Get Task": "タスクを取得",
"Move Task": "タスクを移動",
"Find Task": "タスクを検索",
"Custom API Call": "カスタムAPI通話",
"Creates a new task.": "新しいタスクを作成します。",
"Update an existing task in Motion": "モーションで既存のタスクを更新",
"Create a new project in Motion": "Motion で新しいプロジェクトを作成",
"Get details of a specific task by ID.": "ID で特定のタスクの詳細を取得します。",
"Moves a task to a different workspace.": "タスクを別のワークスペースに移動します。",
"Finds an existing task.": "既存のタスクを検索します。",
"Make a custom API call to a specific endpoint": "特定のエンドポイントへのカスタム API コールを実行します。",
"Workspace ID": "ワークスペース ID",
"Task Name": "タスク名",
"Description": "説明",
"Due Date": "締切日",
"Duration": "期間",
"Status": "Status",
"Priority": "優先度",
"Project": "プロジェクト",
"Assignee": "Assignee",
"Labels": "ラベル",
"Task ID": "Task ID",
"Project Name": "プロジェクト名",
"Current Workspace": "現在のワークスペース",
"Target Workspace": "ターゲットワークスペース",
"Include All Statuses": "すべてのステータスを含める",
"Method": "方法",
"Headers": "ヘッダー",
"Query Parameters": "クエリパラメータ",
"Body": "本文",
"Response is Binary ?": "応答はバイナリですか?",
"No Error on Failure": "失敗時にエラーはありません",
"Timeout (in seconds)": "タイムアウト(秒)",
"Duration in minutes.": "分単位での継続時間",
"The names of the labels to be added to the task.": "タスクに追加するラベルの名前。",
"The names of the labels to be added to the task": "タスクに追加するラベルの名前",
"ISO 8601 Due date on the project": "プロジェクトの ISO 8601 締切日",
"Authorization headers are injected automatically from your connection.": "認証ヘッダは接続から自動的に注入されます。",
"Enable for files like PDFs, images, etc..": "PDF、画像などのファイルを有効にします。",
"ASAP": "できるだけ早く。",
"HIGH": "高い",
"MEDIUM": "MEDIUM",
"LOW": "低い",
"GET": "取得",
"POST": "POST",
"PATCH": "PATCH",
"PUT": "PUT",
"DELETE": "削除",
"HEAD": "頭",
"Task Created": "タスクが作成されました",
"Triggers when a new task is created.": "新しいタスクが作成されたときにトリガーされます。"
}

View File

@@ -0,0 +1,57 @@
{
"You can obtain API key from [API Settings](https://app.usemotion.com/web/settings/api).": "U kunt API-sleutel verkrijgen via [API-instellingen](https://app.usemotion.com/web/settings/api).",
"Create Task": "Taak maken",
"Update Task": "Taak bijwerken",
"Create Project": "Project aanmaken",
"Get Task": "Ophalen taak",
"Move Task": "Verplaats taak",
"Find Task": "Zoek Taak",
"Custom API Call": "Custom API Call",
"Creates a new task.": "Maakt een nieuwe taak aan.",
"Update an existing task in Motion": "Een bestaande taak in Beweging bijwerken",
"Create a new project in Motion": "Maak een nieuw project aan in Beweging",
"Get details of a specific task by ID.": "Krijg details van een specifieke taak via ID.",
"Moves a task to a different workspace.": "Verplaatst een taak naar een andere werkruimte.",
"Finds an existing task.": "Een bestaande taak vinden.",
"Make a custom API call to a specific endpoint": "Maak een aangepaste API call naar een specifiek eindpunt",
"Workspace ID": "Werkruimte ID",
"Task Name": "Taak naam",
"Description": "Beschrijving",
"Due Date": "Inleverdatum",
"Duration": "Tijdsduur",
"Status": "status",
"Priority": "Prioriteit",
"Project": "Project",
"Assignee": "Assignee",
"Labels": "Labels",
"Task ID": "Task ID",
"Project Name": "Projectnaam",
"Current Workspace": "Huidige werkruimte",
"Target Workspace": "Doel werkruimte",
"Include All Statuses": "Alle statussen meenemen",
"Method": "Methode",
"Headers": "Kopteksten",
"Query Parameters": "Query parameters",
"Body": "Lichaam",
"Response is Binary ?": "Antwoord is binair?",
"No Error on Failure": "Geen fout bij fout",
"Timeout (in seconds)": "Time-out (in seconden)",
"Duration in minutes.": "Duur in minuten.",
"The names of the labels to be added to the task.": "De namen van de labels die aan de taak moeten worden toegevoegd.",
"The names of the labels to be added to the task": "De namen van de labels die aan de taak moeten worden toegevoegd",
"ISO 8601 Due date on the project": "ISO 8601 Vervaldatum op het project",
"Authorization headers are injected automatically from your connection.": "Autorisatie headers worden automatisch geïnjecteerd vanuit uw verbinding.",
"Enable for files like PDFs, images, etc..": "Inschakelen voor bestanden zoals PDF's, afbeeldingen etc..",
"ASAP": "OPSLAG",
"HIGH": "HOOG",
"MEDIUM": "MEDIUM",
"LOW": "LAAG",
"GET": "KRIJG",
"POST": "POSTE",
"PATCH": "BEKIJK",
"PUT": "PUT",
"DELETE": "VERWIJDEREN",
"HEAD": "HOOFD",
"Task Created": "Taak aangemaakt",
"Triggers when a new task is created.": "Triggert wanneer een nieuwe taak is aangemaakt."
}

View File

@@ -0,0 +1,57 @@
{
"You can obtain API key from [API Settings](https://app.usemotion.com/web/settings/api).": "Você pode obter chave de API em [Configurações da API](https://app.usemotion.com/web/settings/api).",
"Create Task": "Criar tarefa",
"Update Task": "Atualizar Tarefa",
"Create Project": "Criar Projeto",
"Get Task": "Obter Tarefa",
"Move Task": "Mover tarefa",
"Find Task": "Procurar Tarefa",
"Custom API Call": "Chamada de API personalizada",
"Creates a new task.": "Cria uma nova tarefa.",
"Update an existing task in Motion": "Atualizar uma tarefa existente em Movimento",
"Create a new project in Motion": "Criar um novo projeto em Movimento",
"Get details of a specific task by ID.": "Obtenha detalhes de uma tarefa específica por ID.",
"Moves a task to a different workspace.": "Move a tarefa para um espaço de trabalho diferente.",
"Finds an existing task.": "Encontra uma tarefa existente.",
"Make a custom API call to a specific endpoint": "Faça uma chamada de API personalizada para um ponto de extremidade específico",
"Workspace ID": "ID do workspace",
"Task Name": "Nome da tarefa",
"Description": "Descrição",
"Due Date": "Data de vencimento",
"Duration": "Duração",
"Status": "Estado",
"Priority": "Prioridade",
"Project": "Projecto",
"Assignee": "Assignee",
"Labels": "Marcadores",
"Task ID": "Task ID",
"Project Name": "Nome do Projeto",
"Current Workspace": "Projeto atual",
"Target Workspace": "Workspace alvo",
"Include All Statuses": "Incluir todos os status",
"Method": "Método",
"Headers": "Cabeçalhos",
"Query Parameters": "Parâmetros da consulta",
"Body": "Conteúdo",
"Response is Binary ?": "A resposta é binária ?",
"No Error on Failure": "Nenhum erro no Failure",
"Timeout (in seconds)": "Tempo limite (em segundos)",
"Duration in minutes.": "Duração em minutos.",
"The names of the labels to be added to the task.": "Os nomes das etiquetas a serem adicionadas à tarefa.",
"The names of the labels to be added to the task": "Os nomes das etiquetas a serem adicionadas à tarefa",
"ISO 8601 Due date on the project": "Data limite para ISO 8601 no projeto",
"Authorization headers are injected automatically from your connection.": "Os cabeçalhos de autorização são inseridos automaticamente a partir da sua conexão.",
"Enable for files like PDFs, images, etc..": "Habilitar para arquivos como PDFs, imagens, etc..",
"ASAP": "ASAP",
"HIGH": "ALTO",
"MEDIUM": "MÉDIO",
"LOW": "BAIXA",
"GET": "OBTER",
"POST": "POSTAR",
"PATCH": "COMPRAR",
"PUT": "COLOCAR",
"DELETE": "EXCLUIR",
"HEAD": "CABEÇA",
"Task Created": "Tarefa criada",
"Triggers when a new task is created.": "Dispara quando uma nova tarefa é criada."
}

View File

@@ -0,0 +1,56 @@
{
"Motion": "Движение",
"You can obtain API key from [API Settings](https://app.usemotion.com/web/settings/api).": "Вы можете получить ключ API в [Настройках API](https://app.usemotion.com/web/settings/api).",
"Create Task": "Создать задачу",
"Update Task": "Обновить задачу",
"Create Project": "Создать проект",
"Get Task": "Получить задачу",
"Move Task": "Переместить задачу",
"Find Task": "Найти задачу",
"Custom API Call": "Пользовательский вызов API",
"Creates a new task.": "Создает новую задачу.",
"Update an existing task in Motion": "Обновить существующую задачу в движении",
"Create a new project in Motion": "Создать новый проект в движении",
"Get details of a specific task by ID.": "Получить подробную информацию о конкретной задаче по ID.",
"Moves a task to a different workspace.": "Перемещает задачу в другую рабочую область.",
"Finds an existing task.": "Находит существующую задачу.",
"Make a custom API call to a specific endpoint": "Сделать пользовательский API вызов к определенной конечной точке",
"Workspace ID": "ID проекта",
"Task Name": "Название задачи",
"Description": "Описание",
"Due Date": "Срок сдачи",
"Duration": "Duration",
"Status": "Status",
"Priority": "Приоритет",
"Project": "Проект",
"Assignee": "Assignee",
"Labels": "Метки",
"Task ID": "Task ID",
"Project Name": "Название проекта",
"Current Workspace": "Текущий проект",
"Target Workspace": "Целевая рабочая область",
"Include All Statuses": "Включить все статусы",
"Method": "Метод",
"Headers": "Заголовки",
"Query Parameters": "Параметры запроса",
"Body": "Тело",
"No Error on Failure": "Нет ошибок при ошибке",
"Timeout (in seconds)": "Таймаут (в секундах)",
"Duration in minutes.": "Продолжительность в считанные минуты.",
"The names of the labels to be added to the task.": "Имена меток, которые будут добавлены в задачу.",
"The names of the labels to be added to the task": "Имена меток, которые будут добавлены в задачу",
"ISO 8601 Due date on the project": "ISO 8601 Дата окончания проекта",
"Authorization headers are injected automatically from your connection.": "Заголовки авторизации включаются автоматически из вашего соединения.",
"ASAP": "АСАП",
"HIGH": "ВЫСОКОЕ",
"MEDIUM": "СРЕДНИЙ",
"LOW": "НИЗКИЙ",
"GET": "ПОЛУЧИТЬ",
"POST": "ПОСТ",
"PATCH": "ПАТЧ",
"PUT": "ПОКУПИТЬ",
"DELETE": "УДАЛИТЬ",
"HEAD": "HEAD",
"Task Created": "Задача создана",
"Triggers when a new task is created.": "Триггеры при создании новой задачи."
}

View File

@@ -0,0 +1,57 @@
{
"You can obtain API key from [API Settings](https://app.usemotion.com/web/settings/api).": "You can obtain API key from [API Settings](https://app.usemotion.com/web/settings/api).",
"Create Task": "Create Task",
"Update Task": "Update Task",
"Create Project": "Create Project",
"Get Task": "Get Task",
"Move Task": "Move Task",
"Find Task": "Find Task",
"Custom API Call": "Custom API Call",
"Creates a new task.": "Creates a new task.",
"Update an existing task in Motion": "Update an existing task in Motion",
"Create a new project in Motion": "Create a new project in Motion",
"Get details of a specific task by ID.": "Get details of a specific task by ID.",
"Moves a task to a different workspace.": "Moves a task to a different workspace.",
"Finds an existing task.": "Finds an existing task.",
"Make a custom API call to a specific endpoint": "Make a custom API call to a specific endpoint",
"Workspace ID": "Workspace ID",
"Task Name": "Task Name",
"Description": "Description",
"Due Date": "Due Date",
"Duration": "Duration",
"Status": "Status",
"Priority": "Priority",
"Project": "Project",
"Assignee": "Assignee",
"Labels": "Labels",
"Task ID": "Task ID",
"Project Name": "Project Name",
"Current Workspace": "Current Workspace",
"Target Workspace": "Target Workspace",
"Include All Statuses": "Include All Statuses",
"Method": "Method",
"Headers": "Headers",
"Query Parameters": "Query Parameters",
"Body": "Body",
"Response is Binary ?": "Response is Binary ?",
"No Error on Failure": "No Error on Failure",
"Timeout (in seconds)": "Timeout (in seconds)",
"Duration in minutes.": "Duration in minutes.",
"The names of the labels to be added to the task.": "The names of the labels to be added to the task.",
"The names of the labels to be added to the task": "The names of the labels to be added to the task",
"ISO 8601 Due date on the project": "ISO 8601 Due date on the project",
"Authorization headers are injected automatically from your connection.": "Authorization headers are injected automatically from your connection.",
"Enable for files like PDFs, images, etc..": "Enable for files like PDFs, images, etc..",
"ASAP": "ASAP",
"HIGH": "HIGH",
"MEDIUM": "MEDIUM",
"LOW": "LOW",
"GET": "GET",
"POST": "POST",
"PATCH": "PATCH",
"PUT": "PUT",
"DELETE": "DELETE",
"HEAD": "HEAD",
"Task Created": "Task Created",
"Triggers when a new task is created.": "Triggers when a new task is created."
}

View File

@@ -0,0 +1,56 @@
{
"Motion": "Motion",
"You can obtain API key from [API Settings](https://app.usemotion.com/web/settings/api).": "You can obtain API key from [API Settings](https://app.usemotion.com/web/settings/api).",
"Create Task": "Create Task",
"Update Task": "Update Task",
"Create Project": "Create Project",
"Get Task": "Get Task",
"Move Task": "Move Task",
"Find Task": "Find Task",
"Custom API Call": "Custom API Call",
"Creates a new task.": "Creates a new task.",
"Update an existing task in Motion": "Update an existing task in Motion",
"Create a new project in Motion": "Create a new project in Motion",
"Get details of a specific task by ID.": "Get details of a specific task by ID.",
"Moves a task to a different workspace.": "Moves a task to a different workspace.",
"Finds an existing task.": "Finds an existing task.",
"Make a custom API call to a specific endpoint": "Make a custom API call to a specific endpoint",
"Workspace ID": "Workspace ID",
"Task Name": "Task Name",
"Description": "Description",
"Due Date": "Due Date",
"Duration": "Duration",
"Status": "Status",
"Priority": "Priority",
"Project": "Project",
"Assignee": "Assignee",
"Labels": "Labels",
"Task ID": "Task ID",
"Project Name": "Project Name",
"Current Workspace": "Current Workspace",
"Target Workspace": "Target Workspace",
"Include All Statuses": "Include All Statuses",
"Method": "Method",
"Headers": "Headers",
"Query Parameters": "Query Parameters",
"Body": "Body",
"No Error on Failure": "No Error on Failure",
"Timeout (in seconds)": "Timeout (in seconds)",
"Duration in minutes.": "Duration in minutes.",
"The names of the labels to be added to the task.": "The names of the labels to be added to the task.",
"The names of the labels to be added to the task": "The names of the labels to be added to the task",
"ISO 8601 Due date on the project": "ISO 8601 Due date on the project",
"Authorization headers are injected automatically from your connection.": "Authorization headers are injected automatically from your connection.",
"ASAP": "ASAP",
"HIGH": "HIGH",
"MEDIUM": "MEDIUM",
"LOW": "LOW",
"GET": "GET",
"POST": "POST",
"PATCH": "PATCH",
"PUT": "PUT",
"DELETE": "DELETE",
"HEAD": "HEAD",
"Task Created": "Task Created",
"Triggers when a new task is created.": "Triggers when a new task is created."
}

View File

@@ -0,0 +1,57 @@
{
"You can obtain API key from [API Settings](https://app.usemotion.com/web/settings/api).": "You can obtain API key from [API Settings](https://app.usemotion.com/web/settings/api).",
"Create Task": "Create Task",
"Update Task": "Update Task",
"Create Project": "Create Project",
"Get Task": "Get Task",
"Move Task": "Move Task",
"Find Task": "Find Task",
"Custom API Call": "自定义 API 呼叫",
"Creates a new task.": "Creates a new task.",
"Update an existing task in Motion": "Update an existing task in Motion",
"Create a new project in Motion": "Create a new project in Motion",
"Get details of a specific task by ID.": "Get details of a specific task by ID.",
"Moves a task to a different workspace.": "Moves a task to a different workspace.",
"Finds an existing task.": "Finds an existing task.",
"Make a custom API call to a specific endpoint": "将一个自定义 API 调用到一个特定的终点",
"Workspace ID": "Workspace ID",
"Task Name": "Task Name",
"Description": "描述",
"Due Date": "Due Date",
"Duration": "期限",
"Status": "状态",
"Priority": "Priority",
"Project": "项目",
"Assignee": "Assignee",
"Labels": "Labels",
"Task ID": "Task ID",
"Project Name": "项目名称",
"Current Workspace": "Current Workspace",
"Target Workspace": "Target Workspace",
"Include All Statuses": "Include All Statuses",
"Method": "方法",
"Headers": "信头",
"Query Parameters": "查询参数",
"Body": "正文内容",
"Response is Binary ?": "Response is Binary ?",
"No Error on Failure": "失败时没有错误",
"Timeout (in seconds)": "超时(秒)",
"Duration in minutes.": "Duration in minutes.",
"The names of the labels to be added to the task.": "The names of the labels to be added to the task.",
"The names of the labels to be added to the task": "The names of the labels to be added to the task",
"ISO 8601 Due date on the project": "ISO 8601 Due date on the project",
"Authorization headers are injected automatically from your connection.": "授权头自动从您的连接中注入。",
"Enable for files like PDFs, images, etc..": "Enable for files like PDFs, images, etc..",
"ASAP": "ASAP",
"HIGH": "HIGH",
"MEDIUM": "MEDIUM",
"LOW": "LOW",
"GET": "获取",
"POST": "帖子",
"PATCH": "PATCH",
"PUT": "弹出",
"DELETE": "删除",
"HEAD": "黑色",
"Task Created": "Task Created",
"Triggers when a new task is created.": "Triggers when a new task is created."
}

View File

@@ -0,0 +1,67 @@
import { createPiece, PieceAuth } from '@activepieces/pieces-framework';
import { createTask } from './lib/actions/create-task';
import { updateTask } from './lib/actions/update-task';
import { createProject } from './lib/actions/create-project';
import { getTask } from './lib/actions/get-task';
import { taskCreated } from './lib/triggers/task-created';
import { moveTask } from './lib/actions/move-task';
import { PieceCategory } from '@activepieces/shared';
import { findTask } from './lib/actions/find-task';
import {
createCustomApiCallAction,
httpClient,
HttpMethod,
} from '@activepieces/pieces-common';
import { BASE_URL } from './lib/common/props';
export const motionAuth = PieceAuth.SecretText({
displayName: 'API Key',
description: `You can obtain API key from [API Settings](https://app.usemotion.com/web/settings/api).`,
required: true,
validate: async ({ auth }) => {
try {
await httpClient.sendRequest({
method: HttpMethod.GET,
url: `${BASE_URL}/workspaces`,
headers: {
'X-API-Key': auth,
},
});
return {
valid: true,
};
} catch {
return {
valid: false,
error: 'Invalid API key.',
};
}
},
});
export const motion = createPiece({
displayName: 'Motion',
logoUrl: 'https://cdn.activepieces.com/pieces/motion.png',
categories: [PieceCategory.PRODUCTIVITY],
auth: motionAuth,
authors: ['Sanket6652', 'kishanprmr'],
actions: [
createTask,
updateTask,
createProject,
getTask,
moveTask,
findTask,
createCustomApiCallAction({
auth: motionAuth,
baseUrl: () => BASE_URL,
authMapping: async (auth) => {
return {
'X-API-Key': auth.secret_text,
};
},
}),
],
triggers: [taskCreated],
});

View File

@@ -0,0 +1,52 @@
import { createAction, Property } from '@activepieces/pieces-framework';
import { motionAuth } from '../../index';
import { BASE_URL, priority, workspaceId } from '../common/props';
import { httpClient, HttpMethod } from '@activepieces/pieces-common';
export const createProject = createAction({
auth: motionAuth,
name: 'create-project',
displayName: 'Create Project',
description: 'Create a new project in Motion',
props: {
workspaceId: workspaceId('Workspace ID'),
name: Property.ShortText({
displayName: 'Project Name',
required: true,
}),
description: Property.LongText({
displayName: 'Description',
required: false,
}),
dueDate: Property.DateTime({
displayName: 'Due Date',
description: 'ISO 8601 Due date on the project',
required: false,
}),
priority: priority,
labels: Property.Array({
displayName: 'Labels',
required: false,
}),
},
async run({ auth, propsValue }) {
const response = await httpClient.sendRequest({
method: HttpMethod.POST,
url: `${BASE_URL}/projects`,
headers: {
'Content-Type': 'application/json',
'X-API-Key': auth.secret_text,
},
body: {
name: propsValue.name,
workspaceId: propsValue.workspaceId,
description: propsValue.description,
dueDate: propsValue.dueDate,
priority: propsValue.priority,
labels: (propsValue.labels as string[]) || [],
},
});
return response.body;
},
});

View File

@@ -0,0 +1,72 @@
import { createAction, Property } from '@activepieces/pieces-framework';
import { motionAuth } from '../../index';
import {
BASE_URL,
priority,
projectId,
statusId,
userId,
workspaceId,
} from '../common/props';
import { httpClient, HttpMethod } from '@activepieces/pieces-common';
export const createTask = createAction({
auth: motionAuth,
name: 'create-task',
displayName: 'Create Task',
description: 'Creates a new task.',
props: {
workspaceId: workspaceId('Workspace ID'),
name: Property.ShortText({
displayName: 'Task Name',
required: true,
}),
description: Property.LongText({
displayName: 'Description',
required: false,
}),
dueDate: Property.DateTime({
displayName: 'Due Date',
required: false,
}),
duration: Property.Number({
displayName: 'Duration',
description: 'Duration in minutes.',
required: false,
}),
statusId: statusId,
priority: priority,
projectId: projectId,
assigneeId: userId,
labels: Property.Array({
displayName: 'Labels',
description: 'The names of the labels to be added to the task.',
required: false,
}),
},
async run({ auth, propsValue }) {
const response = await httpClient.sendRequest({
method: HttpMethod.POST,
url: `${BASE_URL}/tasks`,
headers: {
'Content-Type': 'application/json',
'X-API-Key': auth.secret_text,
},
body: {
name: propsValue.name,
workspaceId: propsValue.workspaceId,
description: propsValue.description,
dueDate: propsValue.dueDate,
duration: propsValue.duration,
status: propsValue.statusId,
priority: propsValue.priority,
projectId: propsValue.projectId,
assigneeId: propsValue.assigneeId,
labels: (propsValue.labels as string[]) || [],
},
});
return response.body;
},
});

View File

@@ -0,0 +1,86 @@
import { motionAuth } from '../../index';
import { createAction, Property } from '@activepieces/pieces-framework';
import {
BASE_URL,
projectId,
statusId,
userId,
workspaceId,
} from '../common/props';
import {
httpClient,
HttpMethod,
QueryParams,
} from '@activepieces/pieces-common';
export const findTask = createAction({
auth: motionAuth,
name: 'find-task',
displayName: 'Find Task',
description: 'Finds an existing task.',
props: {
workspaceId: workspaceId('Workspace ID'),
includeAllStatuses: Property.Checkbox({
displayName: 'Include All Statuses',
required: false,
}),
name: Property.ShortText({
displayName: 'Task Name',
required: true,
}),
status: statusId,
assigneeId: userId,
projectId: projectId,
},
async run(context) {
const {
workspaceId,
includeAllStatuses,
name,
status,
assigneeId,
projectId,
} = context.propsValue;
const result = [];
let nextCursor: string | undefined;
const qs: QueryParams = {
name,
workspaceId,
includeAllStatuses: includeAllStatuses ? 'true' : 'false',
};
if (status) qs['status'] = status;
if (projectId) qs['projectId'] = projectId;
if (assigneeId) qs['assigneeId'] = assigneeId;
do {
if (nextCursor) {
qs['cursor'] = nextCursor;
}
const response = await httpClient.sendRequest<{
tasks: { id: string; name: string }[];
meta: { pageSize: number; nextCursor?: string };
}>({
method: HttpMethod.GET,
url: `${BASE_URL}/tasks`,
headers: {
'X-API-Key': context.auth.secret_text,
},
queryParams: qs,
});
const tasks = response.body.tasks ?? [];
result.push(...tasks);
nextCursor = response.body.meta.nextCursor;
} while (nextCursor);
return {
found: result.length > 0,
result,
};
},
});

View File

@@ -0,0 +1,28 @@
import { createAction, Property } from '@activepieces/pieces-framework';
import { motionAuth } from '../../index';
import { httpClient, HttpMethod } from '@activepieces/pieces-common';
import { BASE_URL } from '../common/props';
export const getTask = createAction({
auth: motionAuth,
name: 'get-task',
displayName: 'Get Task',
description: 'Get details of a specific task by ID.',
props: {
taskId: Property.ShortText({
displayName: 'Task ID',
required: true,
}),
},
async run({ auth, propsValue }) {
const response = await httpClient.sendRequest( {
method: HttpMethod.GET,
url:`${BASE_URL}/tasks/${propsValue.taskId}`,
headers: {
'X-API-Key': auth.secret_text,
},
});
return response.body;
},
});

View File

@@ -0,0 +1,33 @@
import { createAction } from '@activepieces/pieces-framework';
import { motionAuth } from '../../index';
import { BASE_URL, taskId, workspaceId } from '../common/props';
import { httpClient, HttpMethod } from '@activepieces/pieces-common';
export const moveTask = createAction({
auth: motionAuth,
name: 'moveTask',
displayName: 'Move Task',
description: 'Moves a task to a different workspace.',
props: {
workspaceId:workspaceId('Current Workspace'),
taskId:taskId,
newWorkspaceId: workspaceId('Target Workspace')
},
async run({ auth, propsValue }) {
const { taskId, newWorkspaceId } = propsValue;
const response = await httpClient.sendRequest({
method: HttpMethod.PATCH,
url:`${BASE_URL}/tasks/${taskId}/move`,
headers: {
'Content-Type': 'application/json',
'X-API-Key': auth.secret_text,
},
body: {
workspaceId:newWorkspaceId
}
});
return response.body;
},
});

View File

@@ -0,0 +1,83 @@
import { createAction, Property } from '@activepieces/pieces-framework';
import { motionAuth } from '../../index';
import {
BASE_URL,
priority,
projectId,
statusId,
taskId,
userId,
workspaceId,
} from '../common/props';
import { httpClient, HttpMethod } from '@activepieces/pieces-common';
export const updateTask = createAction({
auth: motionAuth,
name: 'update-task',
displayName: 'Update Task',
description: 'Update an existing task in Motion',
props: {
workspaceId: workspaceId('Workspace ID'),
taskId: taskId,
name: Property.ShortText({
displayName: 'Task Name',
required: false,
}),
description: Property.LongText({
displayName: 'Description',
required: false,
}),
dueDate: Property.DateTime({
displayName: 'Due Date',
required: false,
}),
duration: Property.Number({
displayName: 'Duration',
description: 'Duration in minutes.',
required: false,
}),
statusId: statusId,
priority: priority,
projectId: projectId,
assigneeId: userId,
labels: Property.Array({
displayName: 'Labels',
description: 'The names of the labels to be added to the task',
required: false,
}),
},
async run({ auth, propsValue }) {
const {
name,
workspaceId,
description,
dueDate,
duration,
statusId,
priority,
assigneeId,
} = propsValue;
const labels = propsValue.labels ?? [];
const response = await httpClient.sendRequest({
method: HttpMethod.PATCH,
url: `${BASE_URL}/tasks/${propsValue.taskId}`,
headers: {
'Content-Type': 'application/json',
'X-API-Key': auth.secret_text,
},
body: {
name,
workspaceId,
description,
priority,
dueDate,
duration,
staus: statusId,
assigneeId,
labels: labels.length > 0 ? labels : undefined,
},
});
return response.body;
},
});

View File

@@ -0,0 +1,219 @@
import { DropdownOption, Property } from '@activepieces/pieces-framework';
import {
httpClient,
HttpMethod,
QueryParams,
} from '@activepieces/pieces-common';
import { motionAuth } from '../..';
export const BASE_URL = 'https://api.usemotion.com/v1';
export const workspaceId =(displayName:string)=> Property.Dropdown({
auth: motionAuth,
displayName,
refreshers: [],
required: true,
options: async ({ auth }) => {
if (!auth) {
return {
disabled: true,
placeholder: 'Please connect your account.',
options: [],
};
}
const response = await httpClient.sendRequest<{
workspaces: { id: string; name: string }[];
}>({
method: HttpMethod.GET,
url: `${BASE_URL}/workspaces`,
headers: {
'X-API-Key': auth.secret_text,
},
});
return {
disabled: false,
options: response.body.workspaces.map((workspace) => ({
label: workspace.name,
value: workspace.id,
})),
};
},
});
export const statusId = Property.Dropdown({
auth: motionAuth,
displayName: 'Status',
refreshers: ['workspaceId'],
required: false,
options: async ({ auth, workspaceId }) => {
if (!auth || !workspaceId) {
return {
disabled: true,
placeholder: 'Please connect your account and select workspace.',
options: [],
};
}
const response = await httpClient.sendRequest<{ name: string }[]>({
method: HttpMethod.GET,
url: `${BASE_URL}/statuses`,
headers: {
'X-API-Key': auth.secret_text,
},
queryParams: {
workspaceId: workspaceId as string,
},
});
return {
disabled: false,
options: response.body.map((status) => ({
label: status.name,
value: status.name,
})),
};
},
});
export const projectId = Property.Dropdown({
auth: motionAuth,
displayName: 'Project',
refreshers: ['workspaceId'],
required: false,
options: async ({ auth, workspaceId }) => {
if (!auth || !workspaceId) {
return {
disabled: true,
placeholder: 'Please connect your account and select workspace.',
options: [],
};
}
const response = await httpClient.sendRequest<{
projects: { id: string; name: string }[];
}>({
method: HttpMethod.GET,
url: `${BASE_URL}/projects`,
headers: {
'X-API-Key': auth.secret_text,
},
queryParams: {
workspaceId: workspaceId as string,
},
});
return {
disabled: false,
options: response.body.projects.map((project) => ({
label: project.name,
value: project.id,
})),
};
},
});
export const userId = Property.Dropdown({
auth: motionAuth,
displayName: 'Assignee',
refreshers: ['workspaceId'],
required: false,
options: async ({ auth, workspaceId }) => {
if (!auth || !workspaceId) {
return {
disabled: true,
placeholder: 'Please connect your account and select workspace.',
options: [],
};
}
const response = await httpClient.sendRequest<{
users: { id: string; name: string }[];
}>({
method: HttpMethod.GET,
url: `${BASE_URL}/users`,
headers: {
'X-API-Key': auth.secret_text,
},
queryParams: {
workspaceId: workspaceId as string,
},
});
return {
disabled: false,
options: response.body.users.map((user) => ({
label: user.name,
value: user.id,
})),
};
},
});
export const taskId = Property.Dropdown({
auth: motionAuth,
displayName: 'Task ID',
refreshers: ['workspaceId'],
required: true,
options: async ({ auth, workspaceId }) => {
if (!auth || !workspaceId) {
return {
disabled: true,
placeholder: 'Please connect your account and select workspace.',
options: [],
};
}
let nextCursor: string | undefined;
const options: DropdownOption<string>[] = [];
const qs: QueryParams = { workspaceId: workspaceId as string };
do {
if (nextCursor) {
qs['cursor'] = nextCursor;
}
const response = await httpClient.sendRequest<{
tasks: { id: string; name: string }[];
meta: { pageSize: number; nextCursor?: string };
}>({
method: HttpMethod.GET,
url: `${BASE_URL}/tasks`,
headers: {
'X-API-Key': auth.secret_text,
},
queryParams: qs,
});
const tasks = response.body.tasks ?? [];
for (const { id, name } of tasks) {
options.push({ label: name, value: id });
}
nextCursor = response.body.meta.nextCursor;
} while (nextCursor);
return {
disabled: false,
options,
};
},
});
export const priority = Property.StaticDropdown({
displayName: 'Priority',
required: false,
options: {
disabled: false,
options: [
{ label: 'ASAP', value: 'ASAP' },
{ label: 'HIGH', value: 'HIGH' },
{ label: 'MEDIUM', value: 'MEDIUM' },
{ label: 'LOW', value: 'LOW' },
],
},
})

View File

@@ -0,0 +1,129 @@
import {
AppConnectionValueForAuthProperty,
createTrigger,
PiecePropValueSchema,
TriggerStrategy,
} from '@activepieces/pieces-framework';
import { motionAuth } from '../../index';
import {
DedupeStrategy,
httpClient,
HttpMethod,
Polling,
pollingHelper,
QueryParams,
} from '@activepieces/pieces-common';
import { BASE_URL, workspaceId } from '../common/props';
import dayjs from 'dayjs';
const polling: Polling<
AppConnectionValueForAuthProperty<typeof motionAuth>,
{ workspaceId: string }
> = {
strategy: DedupeStrategy.TIMEBASED,
async items({ auth, propsValue }) {
const result = [];
let nextCursor: string | undefined;
const qs: QueryParams = {
workspaceId: propsValue.workspaceId,
};
do {
if (nextCursor) {
qs['cursor'] = nextCursor;
}
const response = await httpClient.sendRequest<{
tasks: { id: string; name: string; createdTime: string }[];
meta: { pageSize: number; nextCursor?: string };
}>({
method: HttpMethod.GET,
url: `${BASE_URL}/tasks`,
headers: {
'X-API-Key': auth.secret_text,
},
queryParams: qs,
});
const tasks = response.body.tasks ?? [];
result.push(...tasks);
nextCursor = response.body.meta.nextCursor;
} while (nextCursor);
return result.map((task) => {
return {
epochMilliSeconds: dayjs(task.createdTime).valueOf(),
data: task,
};
});
},
};
export const taskCreated = createTrigger({
auth: motionAuth,
name: 'task-created',
displayName: 'Task Created',
description: 'Triggers when a new task is created.',
type: TriggerStrategy.POLLING,
props: {
workspaceId: workspaceId('Workspace ID'),
},
async onEnable(context) {
await pollingHelper.onEnable(polling, {
auth: context.auth,
store: context.store,
propsValue: context.propsValue,
});
},
async onDisable(context) {
await pollingHelper.onDisable(polling, {
auth: context.auth,
store: context.store,
propsValue: context.propsValue,
});
},
async test(context) {
return await pollingHelper.test(polling, context);
},
async run(context) {
return await pollingHelper.poll(polling, context);
},
sampleData: {
id: 'task_123',
name: 'Sample Task',
description: 'This is a sample task',
duration: 60,
dueDate: '2024-03-20T15:00:00Z',
deadlineType: 'HARD',
completed: false,
creator: {
id: 'user_123',
name: 'John Doe',
email: 'john@example.com',
},
workspace: {
id: 'workspace_123',
name: 'My Workspace',
},
status: {
name: 'In Progress',
isDefaultStatus: false,
isResolvedStatus: false,
},
priority: 'HIGH',
labels: [{ name: 'Important' }, { name: 'Urgent' }],
assignees: [
{
id: 'user_456',
name: 'Jane Smith',
email: 'jane@example.com',
},
],
createdTime: '2024-03-19T10:00:00Z',
updatedTime: '2024-03-19T10:00:00Z',
},
});