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,86 @@
{
"Intuitive online task manager for teams, personal productivity, and everything in between.": "Intuitiver Online-Task-Manager für Teams, persönliche Produktivität und alles dazwischen.",
"Authentication for MeisterTask (uses MindMeister OAuth2)": "Authentifizierung für MeisterTask (verwendet MindMeister OAuth2)",
"Create Label": "Label erstellen",
"Create Task Label": "Aufgabenbezeichnung erstellen",
"Create Attachment": "Anhang erstellen",
"Create Task": "Aufgabe erstellen",
"Update Task": "Aufgabe aktualisieren",
"Find Attachment": "Anhang finden",
"Find Label": "Label suchen",
"Find Person": "Person finden",
"Find Task": "Aufgabe finden",
"Find or Create Attachment": "Anhang finden oder erstellen",
"Find or Create Task": "Aufgabe suchen oder erstellen",
"Find or Create Label": "Label suchen oder erstellen",
"Custom API Call": "Eigener API-Aufruf",
"Creates a new label": "Erstellt ein neues Label",
"Creates a new task label": "Erstellt eine neue Aufgabenbezeichnung",
"Creates a new attachment": "Erstellt einen neuen Anhang",
"Creates a new task": "Erstellt eine neue Aufgabe",
"Updates an existing task": "Aktualisiert eine existierende Aufgabe",
"Finds an attachment by searching": "Sucht einen Anhang durch Suche",
"Finds a label by searching": "Findet eine Beschriftung durch Suche",
"Finds a person based on person_id": "Findet eine Person basierend auf person_id",
"Finds a task by searching": "Findet eine Aufgabe durch Suche",
"Finds an attachment by searching, or creates one if it doesn't exist": "Findet einen Anhang durch Suche oder erstellt einen wenn er nicht existiert",
"Finds a task by searching, or creates one if it doesn't exist": "Findet eine Aufgabe durch Suche oder erstellt eine, falls sie nicht existiert",
"Finds a label by searching, or creates one if it doesn't exist": "Findet eine Beschriftung durch Suche oder erstellt eine, wenn sie nicht existiert",
"Make a custom API call to a specific endpoint": "Einen benutzerdefinierten API-Aufruf an einen bestimmten Endpunkt machen",
"Project": "Projekt",
"Label Name": "Labelname",
"Color": "Farbe",
"Task": "Aufgabe",
"Label": "Label",
"File URL": "Datei-URL",
"Attachment Name": "Anhangname",
"Section": "Abschnitt",
"Task Name": "Aufgabenname",
"Notes": "Notizen",
"Person": "Person",
"Due Date": "Fälligkeitsdatum",
"Status": "Status",
"Person ID": "Person-ID",
"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)",
"Hex color code (e.g., #FF0000)": "Hex-Farbcode (z. B. #FF000000)",
"URL of the file to attach": "URL der anzuhängenden Datei",
"URL of the file to attach (used if creating)": "URL der anzuhängenden Datei (bei Erstellung verwendet)",
"Notes for the task (used if creating)": "Notizen für die Aufgabe (bei der Erstellung verwendet)",
"Due date for the task (used if creating)": "Enddatum der Aufgabe (bei Erstellung verwendet)",
"Hex color code (e.g., #FF0000) - used if creating": "Hex-Farbcode (z. B. #FF0000) - Wird bei der Erstellung verwendet",
"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..",
"Open": "Öffnen",
"Completed": "Abgeschlossen",
"Trashed": "Papierkorb",
"GET": "ERHALTEN",
"POST": "POST",
"PATCH": "PATCH",
"PUT": "PUT",
"DELETE": "LÖSCHEN",
"HEAD": "HEAD",
"New Attachment": "Neuer Anhang",
"New Person": "Neue Person",
"New Section": "Neuer Abschnitt",
"New Comment": "Neuer Kommentar",
"New Task Label": "Neue Aufgabenbezeichnung",
"New Checklist Item": "Neues Checklisten-Element",
"New Project": "Neues Projekt",
"New Label": "Neue Bezeichnung",
"New Task": "Neue Aufgabe",
"Triggers when an attachment is created.": "Wird ausgelöst, wenn ein Anhang erstellt wird.",
"Triggers when a new person is added to a project.": "Wird ausgelöst, wenn eine neue Person einem Projekt hinzugefügt wird.",
"Triggers when a new section is created.": "Wird ausgelöst, wenn ein neuer Abschnitt erstellt wird.",
"Triggers when a new comment is created on a task.": "Wird ausgelöst, wenn ein neuer Kommentar zu einer Aufgabe erstellt wird.",
"Triggers when a task label is created.": "Wird ausgelöst, wenn ein Aufgaben-Label erstellt wird.",
"Triggers when a new checklist item is added to a task.": "Wird ausgelöst, wenn ein neues Element der Checkliste einer Aufgabe hinzugefügt wird.",
"Triggers when a new project is created.": "Wird ausgelöst, wenn ein neues Projekt erstellt wird.",
"Triggers when a label is created.": "Wird ausgelöst, wenn ein Label erstellt wird.",
"Triggers when a task is created or changed.": "Wird ausgelöst, wenn eine Aufgabe erstellt oder geändert wird."
}

View File

@@ -0,0 +1,86 @@
{
"Intuitive online task manager for teams, personal productivity, and everything in between.": "Gestor de tareas intuitivo en línea para equipos, productividad personal y todo lo intermedio.",
"Authentication for MeisterTask (uses MindMeister OAuth2)": "Autenticación para MeisterTask (utiliza MindMeister OAuth2)",
"Create Label": "Crear etiqueta",
"Create Task Label": "Crear etiqueta de tarea",
"Create Attachment": "Crear archivo adjunto",
"Create Task": "Crear tarea",
"Update Task": "Actualizar tarea",
"Find Attachment": "Buscar adjunto",
"Find Label": "Buscar etiqueta",
"Find Person": "Buscar Persona",
"Find Task": "Buscar tarea",
"Find or Create Attachment": "Buscar o crear archivo adjunto",
"Find or Create Task": "Buscar o crear tarea",
"Find or Create Label": "Buscar o crear etiqueta",
"Custom API Call": "Llamada API personalizada",
"Creates a new label": "Crea una nueva etiqueta",
"Creates a new task label": "Crea una nueva etiqueta de tarea",
"Creates a new attachment": "Crea un nuevo archivo adjunto",
"Creates a new task": "Crea una nueva tarea",
"Updates an existing task": "Actualiza una tarea existente",
"Finds an attachment by searching": "Encuentra un archivo adjunto buscando",
"Finds a label by searching": "Encuentra una etiqueta buscando",
"Finds a person based on person_id": "Encuentra una persona basada en person_id",
"Finds a task by searching": "Encuentra una tarea buscando",
"Finds an attachment by searching, or creates one if it doesn't exist": "Encuentra un archivo adjunto buscando, o crea uno si no existe",
"Finds a task by searching, or creates one if it doesn't exist": "Encuentra una tarea buscando, o crea una si no existe",
"Finds a label by searching, or creates one if it doesn't exist": "Encuentra una etiqueta buscando, o crea una si no existe",
"Make a custom API call to a specific endpoint": "Hacer una llamada API personalizada a un extremo específico",
"Project": "Projekt",
"Label Name": "Nombre de etiqueta",
"Color": "Color",
"Task": "Tarea",
"Label": "Etiqueta",
"File URL": "URL del archivo",
"Attachment Name": "Nombre del archivo adjunto",
"Section": "Sección",
"Task Name": "Nombre de tarea",
"Notes": "Notas",
"Person": "Persona",
"Due Date": "Fecha de fin",
"Status": "Estado",
"Person ID": "ID de la persona",
"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)",
"Hex color code (e.g., #FF0000)": "Código de color hexadecimal (por ej., #FF0000)",
"URL of the file to attach": "URL del archivo a adjuntar",
"URL of the file to attach (used if creating)": "URL del archivo a adjuntar (usado si se crea)",
"Notes for the task (used if creating)": "Notas para la tarea (usado si se crea)",
"Due date for the task (used if creating)": "Fecha límite para la tarea (usado si se crea)",
"Hex color code (e.g., #FF0000) - used if creating": "Código de color hexadecimal (por ejemplo, #FF0000) - usado si se crea",
"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 PDF, imágenes, etc.",
"Open": "Abrir",
"Completed": "Completado",
"Trashed": "Basura",
"GET": "RECOGER",
"POST": "POST",
"PATCH": "PATCH",
"PUT": "PUT",
"DELETE": "BORRAR",
"HEAD": "LIMPIO",
"New Attachment": "Nuevo adjunto",
"New Person": "Nueva persona",
"New Section": "Nueva sección",
"New Comment": "Nuevo comentario",
"New Task Label": "Nueva etiqueta de tarea",
"New Checklist Item": "Nuevo elemento de lista de control",
"New Project": "Nuevo proyecto",
"New Label": "Nueva etiqueta",
"New Task": "Nueva tarea",
"Triggers when an attachment is created.": "Dispara cuando se crea un archivo adjunto.",
"Triggers when a new person is added to a project.": "Desencadena cuando una nueva persona es añadida a un proyecto.",
"Triggers when a new section is created.": "Dispara cuando se crea una nueva sección.",
"Triggers when a new comment is created on a task.": "Dispara cuando se crea un nuevo comentario en una tarea.",
"Triggers when a task label is created.": "Dispara cuando se crea una etiqueta de tarea.",
"Triggers when a new checklist item is added to a task.": "Se activa cuando se añade un nuevo elemento de lista de verificación a una tarea.",
"Triggers when a new project is created.": "Se activa cuando se crea un nuevo proyecto.",
"Triggers when a label is created.": "Dispara cuando se crea una etiqueta.",
"Triggers when a task is created or changed.": "Se activa cuando se crea o cambia una tarea."
}

View File

@@ -0,0 +1,86 @@
{
"Intuitive online task manager for teams, personal productivity, and everything in between.": "Gestionnaire de tâches en ligne intuitif pour les équipes, la productivité personnelle et tout ce qui se passe entre les deux.",
"Authentication for MeisterTask (uses MindMeister OAuth2)": "Authentification pour MeisterTask (utilise MindMeister OAuth2)",
"Create Label": "Créer une étiquette",
"Create Task Label": "Créer une étiquette de tâche",
"Create Attachment": "Créer une pièce jointe",
"Create Task": "Créer une tâche",
"Update Task": "Tâche de mise à jour",
"Find Attachment": "Trouver une pièce jointe",
"Find Label": "Rechercher une étiquette",
"Find Person": "Trouver une personne",
"Find Task": "Trouver une tâche",
"Find or Create Attachment": "Trouver ou créer une pièce jointe",
"Find or Create Task": "Trouver ou créer une tâche",
"Find or Create Label": "Trouver ou créer une étiquette",
"Custom API Call": "Appel d'API personnalisé",
"Creates a new label": "Crée une nouvelle étiquette",
"Creates a new task label": "Crée une nouvelle étiquette de tâche",
"Creates a new attachment": "Crée une nouvelle pièce jointe",
"Creates a new task": "Crée une nouvelle tâche",
"Updates an existing task": "Met à jour une tâche existante",
"Finds an attachment by searching": "Trouve une pièce jointe en recherchant",
"Finds a label by searching": "Trouve un libellé par recherche",
"Finds a person based on person_id": "Trouve une personne basée sur person_id",
"Finds a task by searching": "Trouve une tâche en recherchant",
"Finds an attachment by searching, or creates one if it doesn't exist": "Trouve une pièce jointe par recherche, ou en crée une si elle n'existe pas",
"Finds a task by searching, or creates one if it doesn't exist": "Trouve une tâche en recherchant ou en en créant une si elle n'existe pas",
"Finds a label by searching, or creates one if it doesn't exist": "Trouve un libellé par recherche, ou en crée un s'il n'existe pas",
"Make a custom API call to a specific endpoint": "Passer un appel API personnalisé à un endpoint spécifique",
"Project": "Votre compte",
"Label Name": "Nom de l'étiquette",
"Color": "Couleur",
"Task": "Tâche",
"Label": "Étiquette",
"File URL": "URL du fichier",
"Attachment Name": "Nom de la pièce jointe",
"Section": "Section",
"Task Name": "Nom de la tâche",
"Notes": "Notes",
"Person": "Personne",
"Due Date": "Date de fin",
"Status": "Statut",
"Person ID": "ID de la personne",
"Method": "Méthode",
"Headers": "Headers",
"Query Parameters": "Paramètres de requête",
"Body": "Body",
"Response is Binary ?": "La réponse est Binaire ?",
"No Error on Failure": "Aucune erreur en cas d'échec",
"Timeout (in seconds)": "Délai d'expiration (en secondes)",
"Hex color code (e.g., #FF0000)": "Code couleur hexadécimal (par exemple, #FF0000)",
"URL of the file to attach": "URL du fichier à joindre",
"URL of the file to attach (used if creating)": "URL du fichier à joindre (utilisé lors de la création)",
"Notes for the task (used if creating)": "Notes pour la tâche (utilisées lors de la création)",
"Due date for the task (used if creating)": "Date d'échéance pour la tâche (utilisée lors de la création)",
"Hex color code (e.g., #FF0000) - used if creating": "Code couleur hexadécimal (par exemple, #FF0000) - utilisé lors de la création",
"Authorization headers are injected automatically from your connection.": "Les Headers 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.",
"Open": "Ouvert",
"Completed": "Terminé",
"Trashed": "Corbeille",
"GET": "GET",
"POST": "POST",
"PATCH": "PATCH",
"PUT": "PUT",
"DELETE": "DELETE",
"HEAD": "HEAD",
"New Attachment": "Nouvelle pièce jointe",
"New Person": "Nouvelle Personne",
"New Section": "Nouvelle section",
"New Comment": "Nouveau commentaire",
"New Task Label": "Étiquette de nouvelle tâche",
"New Checklist Item": "Nouvel élément de la liste de contrôle",
"New Project": "Nouveau projet",
"New Label": "Nouveau libellé",
"New Task": "Nouvelle tâche",
"Triggers when an attachment is created.": "Déclenche quand une pièce jointe est créée.",
"Triggers when a new person is added to a project.": "Déclenche quand une nouvelle personne est ajoutée à un projet.",
"Triggers when a new section is created.": "Déclenche quand une nouvelle section est créée.",
"Triggers when a new comment is created on a task.": "Déclenche lorsqu'un nouveau commentaire est créé sur une tâche.",
"Triggers when a task label is created.": "Déclenche quand une étiquette de tâche est créée.",
"Triggers when a new checklist item is added to a task.": "Déclenche lorsqu'un nouvel élément de liste de contrôle est ajouté à une tâche.",
"Triggers when a new project is created.": "Déclenche lorsqu'un nouveau projet est créé.",
"Triggers when a label is created.": "Déclenche quand une étiquette est créée.",
"Triggers when a task is created or changed.": "Déclenche lorsqu'une tâche est créée ou modifiée."
}

View File

@@ -0,0 +1,86 @@
{
"Intuitive online task manager for teams, personal productivity, and everything in between.": "チームのための直感的なオンラインタスクマネージャー、個人の生産性、そしてその間のすべて。",
"Authentication for MeisterTask (uses MindMeister OAuth2)": "MeisterTask の認証 (MindMeister OAuth2を使用)",
"Create Label": "ラベルを作成",
"Create Task Label": "タスクのラベルを作成",
"Create Attachment": "添付ファイルを作成",
"Create Task": "タスクを作成",
"Update Task": "タスクの更新",
"Find Attachment": "添付ファイルを検索",
"Find Label": "ラベルを検索",
"Find Person": "人を探す",
"Find Task": "タスクを検索",
"Find or Create Attachment": "添付ファイルを検索または作成",
"Find or Create Task": "タスクを検索または作成",
"Find or Create Label": "ラベルを検索または作成",
"Custom API Call": "カスタムAPI通話",
"Creates a new label": "新しいラベルを作成",
"Creates a new task label": "新しいタスクリベルを作成",
"Creates a new attachment": "新しい添付ファイルを作成",
"Creates a new task": "新しいタスクを作成します",
"Updates an existing task": "既存のタスクを更新",
"Finds an attachment by searching": "検索して添付ファイルを検索",
"Finds a label by searching": "検索してラベルを検索",
"Finds a person based on person_id": "person_id に基づいて人を検索",
"Finds a task by searching": "検索してタスクを検索",
"Finds an attachment by searching, or creates one if it doesn't exist": "検索して添付ファイルを検索するか、存在しない場合に作成します。",
"Finds a task by searching, or creates one if it doesn't exist": "検索してタスクを検索するか、存在しない場合に作成します",
"Finds a label by searching, or creates one if it doesn't exist": "検索してラベルを検索します。存在しない場合はラベルを作成します",
"Make a custom API call to a specific endpoint": "特定のエンドポイントへのカスタム API コールを実行します。",
"Project": "プロジェクト",
"Label Name": "ラベル名",
"Color": "色",
"Task": "タスク",
"Label": "ラベル",
"File URL": "ファイル URL",
"Attachment Name": "添付ファイル名",
"Section": "セクション",
"Task Name": "タスク名",
"Notes": "メモ",
"Person": "人",
"Due Date": "締切日",
"Status": "Status",
"Person ID": "Person ID",
"Method": "方法",
"Headers": "ヘッダー",
"Query Parameters": "クエリパラメータ",
"Body": "本文",
"Response is Binary ?": "応答はバイナリですか?",
"No Error on Failure": "失敗時にエラーはありません",
"Timeout (in seconds)": "タイムアウト(秒)",
"Hex color code (e.g., #FF0000)": "16進カラーコード#FF0000",
"URL of the file to attach": "添付するファイルの URL",
"URL of the file to attach (used if creating)": "添付するファイルの URL (作成時に使用)",
"Notes for the task (used if creating)": "タスクのメモ(作成時に使用)",
"Due date for the task (used if creating)": "タスクの期限 (作成時に使用)",
"Hex color code (e.g., #FF0000) - used if creating": "16進カラーコード#FF0000 - 作成時に使用",
"Authorization headers are injected automatically from your connection.": "認証ヘッダは接続から自動的に注入されます。",
"Enable for files like PDFs, images, etc..": "PDF、画像などのファイルを有効にします。",
"Open": "開く",
"Completed": "完了",
"Trashed": "ゴミ箱に入れる",
"GET": "取得",
"POST": "POST",
"PATCH": "PATCH",
"PUT": "PUT",
"DELETE": "削除",
"HEAD": "頭",
"New Attachment": "新しい添付ファイル",
"New Person": "新しい人",
"New Section": "新しいセクション",
"New Comment": "新しいコメント",
"New Task Label": "新しいタスクのラベル",
"New Checklist Item": "新規チェックリストアイテム",
"New Project": "新規プロジェクト",
"New Label": "新しいラベル",
"New Task": "新しいタスク",
"Triggers when an attachment is created.": "添付ファイルが作成されたときにトリガーします。",
"Triggers when a new person is added to a project.": "新規ユーザーがプロジェクトに追加されたときにトリガーします。",
"Triggers when a new section is created.": "新しいセクションが作成されたときにトリガーします。",
"Triggers when a new comment is created on a task.": "タスクに新しいコメントが作成されたときにトリガーします。",
"Triggers when a task label is created.": "タスクラベルが作成されたときにトリガーされます。",
"Triggers when a new checklist item is added to a task.": "タスクに新しいチェックリスト項目が追加されたときにトリガーされます。",
"Triggers when a new project is created.": "新しいプロジェクトが作成されたときにトリガーします。",
"Triggers when a label is created.": "ラベルが作成されたときにトリガーします。",
"Triggers when a task is created or changed.": "タスクが作成または変更されたときにトリガーします。"
}

View File

@@ -0,0 +1,86 @@
{
"Intuitive online task manager for teams, personal productivity, and everything in between.": "Intuïtieve online taakbeheer voor teams, persoonlijke productiviteit en alles daartussenin.",
"Authentication for MeisterTask (uses MindMeister OAuth2)": "Authenticatie voor MeisterTask (maakt gebruik van MindMeister OAuth2)",
"Create Label": "Label maken",
"Create Task Label": "Takenlabel aanmaken",
"Create Attachment": "Bijlage aanmaken",
"Create Task": "Taak maken",
"Update Task": "Taak bijwerken",
"Find Attachment": "Bijlage zoeken",
"Find Label": "Label zoeken",
"Find Person": "Persoon zoeken",
"Find Task": "Zoek Taak",
"Find or Create Attachment": "Bijlage zoeken of aanmaken",
"Find or Create Task": "Zoek of maak een Taak",
"Find or Create Label": "Label zoeken of maken",
"Custom API Call": "Custom API Call",
"Creates a new label": "Maakt een nieuw label aan",
"Creates a new task label": "Maakt een nieuw takenlabel aan",
"Creates a new attachment": "Maakt een nieuwe bijlage",
"Creates a new task": "Maakt een nieuwe taak",
"Updates an existing task": "Werkt een bestaande taak bij",
"Finds an attachment by searching": "Vindt een bijlage door te zoeken",
"Finds a label by searching": "Zoekt een label door te zoeken",
"Finds a person based on person_id": "Vindt een persoon op basis van persoon_id",
"Finds a task by searching": "Vindt een taak door te zoeken",
"Finds an attachment by searching, or creates one if it doesn't exist": "Vindt een bijlage door te zoeken, of maakt er een aan als deze niet bestaat",
"Finds a task by searching, or creates one if it doesn't exist": "Vindt een taak door te zoeken of maakt er een aan als deze niet bestaat",
"Finds a label by searching, or creates one if it doesn't exist": "Zoekt een label door te zoeken of maakt er een aan als deze niet bestaat",
"Make a custom API call to a specific endpoint": "Maak een aangepaste API call naar een specifiek eindpunt",
"Project": "Project",
"Label Name": "Label naam",
"Color": "Kleur",
"Task": "Opdracht",
"Label": "Omschrijving",
"File URL": "Bestand URL",
"Attachment Name": "Bijlage naam",
"Section": "Sectie",
"Task Name": "Taak naam",
"Notes": "Opmerkingen",
"Person": "Persoon",
"Due Date": "Inleverdatum",
"Status": "status",
"Person ID": "Persoon ID",
"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)",
"Hex color code (e.g., #FF0000)": "Hex kleurcode (bijv. #FF0000)",
"URL of the file to attach": "URL van het toe te voegen bestand",
"URL of the file to attach (used if creating)": "URL van het bij te voegen bestand (gebruikt bij aanmaken)",
"Notes for the task (used if creating)": "Notities voor de taak (gebruikt als schepping)",
"Due date for the task (used if creating)": "Vervaldatum voor de taak (gebruikt indien gemaakt)",
"Hex color code (e.g., #FF0000) - used if creating": "Hex kleurcode (bijv. #FF0000) - gebruikt bij aanmaken",
"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..",
"Open": "Open",
"Completed": "Voltooid",
"Trashed": "Verwijderd",
"GET": "KRIJG",
"POST": "POSTE",
"PATCH": "BEKIJK",
"PUT": "PUT",
"DELETE": "VERWIJDEREN",
"HEAD": "HOOFD",
"New Attachment": "Nieuwe bijlage",
"New Person": "Nieuw persoon",
"New Section": "Nieuwe sectie",
"New Comment": "Nieuwe reactie",
"New Task Label": "Nieuw takenlabel",
"New Checklist Item": "Nieuw Checklist Item",
"New Project": "Nieuw project",
"New Label": "Nieuw label",
"New Task": "Nieuwe taak",
"Triggers when an attachment is created.": "Triggert wanneer een bijlage is aangemaakt.",
"Triggers when a new person is added to a project.": "Triggert wanneer een nieuwe persoon aan een project wordt toegevoegd.",
"Triggers when a new section is created.": "Triggert wanneer een nieuwe sectie is aangemaakt.",
"Triggers when a new comment is created on a task.": "Triggert wanneer een nieuwe reactie wordt aangemaakt op een taak.",
"Triggers when a task label is created.": "Triggers wanneer een takenlabel is aangemaakt.",
"Triggers when a new checklist item is added to a task.": "Triggert wanneer een nieuw checklist item is toegevoegd aan een taak.",
"Triggers when a new project is created.": "Triggert wanneer een nieuw project wordt aangemaakt.",
"Triggers when a label is created.": "Triggers wanneer een label is aangemaakt.",
"Triggers when a task is created or changed.": "Triggert wanneer een taak is aangemaakt of gewijzigd."
}

View File

@@ -0,0 +1,86 @@
{
"Intuitive online task manager for teams, personal productivity, and everything in between.": "Gestor de tarefas on-line intuitivo para equipes, produtividade pessoal e tudo o mais.",
"Authentication for MeisterTask (uses MindMeister OAuth2)": "Autenticação para MeisterTask (usa MindMeister OAuth2)",
"Create Label": "Criar etiqueta",
"Create Task Label": "Criar etiqueta de tarefa",
"Create Attachment": "Criar anexo",
"Create Task": "Criar tarefa",
"Update Task": "Atualizar Tarefa",
"Find Attachment": "Localizar Anexo",
"Find Label": "Localizar etiqueta",
"Find Person": "Encontrar pessoa",
"Find Task": "Procurar Tarefa",
"Find or Create Attachment": "Localizar ou criar anexo",
"Find or Create Task": "Encontrar ou Criar Tarefa",
"Find or Create Label": "Encontre ou crie etiqueta",
"Custom API Call": "Chamada de API personalizada",
"Creates a new label": "Cria um novo rótulo",
"Creates a new task label": "Cria um novo rótulo de tarefa",
"Creates a new attachment": "Cria um novo anexo",
"Creates a new task": "Cria uma nova tarefa",
"Updates an existing task": "Atualiza uma tarefa existente",
"Finds an attachment by searching": "Encontra um anexo ao pesquisar",
"Finds a label by searching": "Encontra um rótulo ao pesquisar",
"Finds a person based on person_id": "Localiza uma pessoa baseada em person_id",
"Finds a task by searching": "Encontra uma tarefa procurando",
"Finds an attachment by searching, or creates one if it doesn't exist": "Encontra um anexo por pesquisa, ou cria um se não existe",
"Finds a task by searching, or creates one if it doesn't exist": "Encontra uma tarefa procurando ou cria uma se ela não existe",
"Finds a label by searching, or creates one if it doesn't exist": "Encontra um rótulo por pesquisa, ou cria um se ele não existe",
"Make a custom API call to a specific endpoint": "Faça uma chamada de API personalizada para um ponto de extremidade específico",
"Project": "Projecto",
"Label Name": "Nome da etiqueta",
"Color": "Cor",
"Task": "Tarefas",
"Label": "Descrição",
"File URL": "URL do Arquivo",
"Attachment Name": "Nome do anexo",
"Section": "Turma",
"Task Name": "Nome da tarefa",
"Notes": "Observações",
"Person": "Pessoa",
"Due Date": "Data de vencimento",
"Status": "Estado",
"Person ID": "ID da pessoa",
"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)",
"Hex color code (e.g., #FF0000)": "Código de cor hexadecimal (por exemplo, #FF0000)",
"URL of the file to attach": "URL do arquivo a ser anexado",
"URL of the file to attach (used if creating)": "URL do arquivo a ser anexado (usado ao criar)",
"Notes for the task (used if creating)": "Notas para a tarefa (usado se criar)",
"Due date for the task (used if creating)": "Data de vencimento para a tarefa (utilizada se criar)",
"Hex color code (e.g., #FF0000) - used if creating": "Código de cor hexadecimal (por exemplo, #FF0000) - usado se criar",
"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..",
"Open": "Abertas",
"Completed": "Concluído",
"Trashed": "Lixeira",
"GET": "OBTER",
"POST": "POSTAR",
"PATCH": "COMPRAR",
"PUT": "COLOCAR",
"DELETE": "EXCLUIR",
"HEAD": "CABEÇA",
"New Attachment": "Novo Anexo",
"New Person": "Nova Pessoa",
"New Section": "Nova seção",
"New Comment": "Novo Comentário",
"New Task Label": "Nova Etiqueta de Tarefa",
"New Checklist Item": "Novo item da Checklist",
"New Project": "Novo Projeto",
"New Label": "Novo Marcador",
"New Task": "Nova tarefa",
"Triggers when an attachment is created.": "Dispara quando um anexo é criado.",
"Triggers when a new person is added to a project.": "Aciona quando uma nova pessoa é adicionada a um projeto.",
"Triggers when a new section is created.": "Dispara quando uma nova seção é criada.",
"Triggers when a new comment is created on a task.": "Dispara quando um novo comentário é criado em uma tarefa.",
"Triggers when a task label is created.": "Dispara quando um rótulo de tarefa é criado.",
"Triggers when a new checklist item is added to a task.": "Aciona quando um novo item da lista de verificação é adicionado a uma tarefa.",
"Triggers when a new project is created.": "Aciona quando um novo projeto é criado.",
"Triggers when a label is created.": "Dispara quando uma etiqueta é criada.",
"Triggers when a task is created or changed.": "Dispara quando uma tarefa é criada ou alterada."
}

View File

@@ -0,0 +1,86 @@
{
"Intuitive online task manager for teams, personal productivity, and everything in between.": "Intuitive online task manager for teams, personal productivity, and everything in between.",
"Authentication for MeisterTask (uses MindMeister OAuth2)": "Authentication for MeisterTask (uses MindMeister OAuth2)",
"Create Label": "Create Label",
"Create Task Label": "Create Task Label",
"Create Attachment": "Create Attachment",
"Create Task": "Create Task",
"Update Task": "Update Task",
"Find Attachment": "Find Attachment",
"Find Label": "Find Label",
"Find Person": "Find Person",
"Find Task": "Find Task",
"Find or Create Attachment": "Find or Create Attachment",
"Find or Create Task": "Find or Create Task",
"Find or Create Label": "Find or Create Label",
"Custom API Call": "Custom API Call",
"Creates a new label": "Creates a new label",
"Creates a new task label": "Creates a new task label",
"Creates a new attachment": "Creates a new attachment",
"Creates a new task": "Creates a new task",
"Updates an existing task": "Updates an existing task",
"Finds an attachment by searching": "Finds an attachment by searching",
"Finds a label by searching": "Finds a label by searching",
"Finds a person based on person_id": "Finds a person based on person_id",
"Finds a task by searching": "Finds a task by searching",
"Finds an attachment by searching, or creates one if it doesn't exist": "Finds an attachment by searching, or creates one if it doesn't exist",
"Finds a task by searching, or creates one if it doesn't exist": "Finds a task by searching, or creates one if it doesn't exist",
"Finds a label by searching, or creates one if it doesn't exist": "Finds a label by searching, or creates one if it doesn't exist",
"Make a custom API call to a specific endpoint": "Make a custom API call to a specific endpoint",
"Project": "Project",
"Label Name": "Label Name",
"Color": "Color",
"Task": "Task",
"Label": "Label",
"File URL": "File URL",
"Attachment Name": "Attachment Name",
"Section": "Section",
"Task Name": "Task Name",
"Notes": "Notes",
"Person": "Person",
"Due Date": "Due Date",
"Status": "Status",
"Person ID": "Person ID",
"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)",
"Hex color code (e.g., #FF0000)": "Hex color code (e.g., #FF0000)",
"URL of the file to attach": "URL of the file to attach",
"URL of the file to attach (used if creating)": "URL of the file to attach (used if creating)",
"Notes for the task (used if creating)": "Notes for the task (used if creating)",
"Due date for the task (used if creating)": "Due date for the task (used if creating)",
"Hex color code (e.g., #FF0000) - used if creating": "Hex color code (e.g., #FF0000) - used if creating",
"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..",
"Open": "Open",
"Completed": "Completed",
"Trashed": "Trashed",
"GET": "GET",
"POST": "POST",
"PATCH": "PATCH",
"PUT": "PUT",
"DELETE": "DELETE",
"HEAD": "HEAD",
"New Attachment": "New Attachment",
"New Person": "New Person",
"New Section": "New Section",
"New Comment": "New Comment",
"New Task Label": "New Task Label",
"New Checklist Item": "New Checklist Item",
"New Project": "New Project",
"New Label": "New Label",
"New Task": "New Task",
"Triggers when an attachment is created.": "Triggers when an attachment is created.",
"Triggers when a new person is added to a project.": "Triggers when a new person is added to a project.",
"Triggers when a new section is created.": "Triggers when a new section is created.",
"Triggers when a new comment is created on a task.": "Triggers when a new comment is created on a task.",
"Triggers when a task label is created.": "Triggers when a task label is created.",
"Triggers when a new checklist item is added to a task.": "Triggers when a new checklist item is added to a task.",
"Triggers when a new project is created.": "Triggers when a new project is created.",
"Triggers when a label is created.": "Triggers when a label is created.",
"Triggers when a task is created or changed.": "Triggers when a task is created or changed."
}

View File

@@ -0,0 +1,86 @@
{
"Intuitive online task manager for teams, personal productivity, and everything in between.": "Intuitive online task manager for teams, personal productivity, and everything in between.",
"Authentication for MeisterTask (uses MindMeister OAuth2)": "Authentication for MeisterTask (uses MindMeister OAuth2)",
"Create Label": "Create Label",
"Create Task Label": "Create Task Label",
"Create Attachment": "Create Attachment",
"Create Task": "Create Task",
"Update Task": "Update Task",
"Find Attachment": "Find Attachment",
"Find Label": "Find Label",
"Find Person": "Find Person",
"Find Task": "Find Task",
"Find or Create Attachment": "Find or Create Attachment",
"Find or Create Task": "Find or Create Task",
"Find or Create Label": "Find or Create Label",
"Custom API Call": "自定义 API 呼叫",
"Creates a new label": "Creates a new label",
"Creates a new task label": "Creates a new task label",
"Creates a new attachment": "Creates a new attachment",
"Creates a new task": "Creates a new task",
"Updates an existing task": "Updates an existing task",
"Finds an attachment by searching": "Finds an attachment by searching",
"Finds a label by searching": "Finds a label by searching",
"Finds a person based on person_id": "Finds a person based on person_id",
"Finds a task by searching": "Finds a task by searching",
"Finds an attachment by searching, or creates one if it doesn't exist": "Finds an attachment by searching, or creates one if it doesn't exist",
"Finds a task by searching, or creates one if it doesn't exist": "Finds a task by searching, or creates one if it doesn't exist",
"Finds a label by searching, or creates one if it doesn't exist": "Finds a label by searching, or creates one if it doesn't exist",
"Make a custom API call to a specific endpoint": "将一个自定义 API 调用到一个特定的终点",
"Project": "项目",
"Label Name": "Label Name",
"Color": "Color",
"Task": "Task",
"Label": "Label",
"File URL": "File URL",
"Attachment Name": "Attachment Name",
"Section": "Section",
"Task Name": "Task Name",
"Notes": "Notes",
"Person": "Person",
"Due Date": "Due Date",
"Status": "状态",
"Person ID": "Person ID",
"Method": "方法",
"Headers": "信头",
"Query Parameters": "查询参数",
"Body": "正文内容",
"Response is Binary ?": "Response is Binary ?",
"No Error on Failure": "失败时没有错误",
"Timeout (in seconds)": "超时(秒)",
"Hex color code (e.g., #FF0000)": "Hex color code (e.g., #FF0000)",
"URL of the file to attach": "URL of the file to attach",
"URL of the file to attach (used if creating)": "URL of the file to attach (used if creating)",
"Notes for the task (used if creating)": "Notes for the task (used if creating)",
"Due date for the task (used if creating)": "Due date for the task (used if creating)",
"Hex color code (e.g., #FF0000) - used if creating": "Hex color code (e.g., #FF0000) - used if creating",
"Authorization headers are injected automatically from your connection.": "授权头自动从您的连接中注入。",
"Enable for files like PDFs, images, etc..": "Enable for files like PDFs, images, etc..",
"Open": "Open",
"Completed": "Completed",
"Trashed": "Trashed",
"GET": "获取",
"POST": "帖子",
"PATCH": "PATCH",
"PUT": "弹出",
"DELETE": "删除",
"HEAD": "黑色",
"New Attachment": "New Attachment",
"New Person": "New Person",
"New Section": "New Section",
"New Comment": "New Comment",
"New Task Label": "New Task Label",
"New Checklist Item": "New Checklist Item",
"New Project": "新建项目",
"New Label": "New Label",
"New Task": "New Task",
"Triggers when an attachment is created.": "Triggers when an attachment is created.",
"Triggers when a new person is added to a project.": "Triggers when a new person is added to a project.",
"Triggers when a new section is created.": "Triggers when a new section is created.",
"Triggers when a new comment is created on a task.": "Triggers when a new comment is created on a task.",
"Triggers when a task label is created.": "Triggers when a task label is created.",
"Triggers when a new checklist item is added to a task.": "Triggers when a new checklist item is added to a task.",
"Triggers when a new project is created.": "Triggers when a new project is created.",
"Triggers when a label is created.": "Triggers when a label is created.",
"Triggers when a task is created or changed.": "Triggers when a task is created or changed."
}

View File

@@ -0,0 +1,102 @@
import { createPiece, PieceAuth } from '@activepieces/pieces-framework';
import { PieceCategory } from '@activepieces/shared';
import { newAttachment } from './lib/triggers/new-attachment';
import { newPerson } from './lib/triggers/new-person';
import { newSection } from './lib/triggers/new-section';
import { newComment } from './lib/triggers/new-comment';
import { newTaskLabel } from './lib/triggers/new-task-label';
import { newChecklistItem } from './lib/triggers/new-checklist-item';
import { newProject } from './lib/triggers/new-project';
import { newLabel } from './lib/triggers/new-label';
import { newTask } from './lib/triggers/new-task';
import { createLabel } from './lib/actions/create-label';
import { createTaskLabel } from './lib/actions/create-task-label';
import { createAttachment } from './lib/actions/create-attachment';
import { createTask } from './lib/actions/create-task';
import { updateTask } from './lib/actions/update-task';
import { findAttachment } from './lib/actions/find-attachment';
import { findLabel } from './lib/actions/find-label';
import { findPerson } from './lib/actions/find-person';
import { findTask } from './lib/actions/find-task';
import { findOrCreateAttachment } from './lib/actions/find-or-create-attachment';
import { findOrCreateTask } from './lib/actions/find-or-create-task';
import { findOrCreateLabel } from './lib/actions/find-or-create-label';
import { OAuth2PropertyValue } from '@activepieces/pieces-framework';
import { httpClient, HttpMethod, AuthenticationType, createCustomApiCallAction } from '@activepieces/pieces-common';
import { MEISTERTASK_API_URL } from './lib/common/common';
export const meistertaskAuth = PieceAuth.OAuth2({
description: 'Authentication for MeisterTask (uses MindMeister OAuth2)',
authUrl: 'https://www.mindmeister.com/oauth2/authorize',
tokenUrl: 'https://www.mindmeister.com/oauth2/token',
required: true,
scope: ['userinfo.profile', 'userinfo.email', 'meistertask'],
validate: async ({ auth }) => {
const accessToken = (auth as OAuth2PropertyValue).access_token;
try {
await httpClient.sendRequest({
method: HttpMethod.GET,
url: `${MEISTERTASK_API_URL}/projects`,
authentication: {
type: AuthenticationType.BEARER_TOKEN,
token: accessToken,
},
});
return {
valid: true,
};
} catch (e) {
return {
valid: false,
error: 'Invalid token or insufficient scopes.',
};
}
},
});
export const meistertask = createPiece({
displayName: 'MeisterTask',
description: 'Intuitive online task manager for teams, personal productivity, and everything in between.',
auth: meistertaskAuth,
minimumSupportedRelease: '0.36.1',
logoUrl: 'https://cdn.activepieces.com/pieces/meistertask.png',
categories: [PieceCategory.PRODUCTIVITY],
authors: ['Ani-4x', 'sanket-a11y'],
actions: [
createLabel,
createTaskLabel,
createAttachment,
createTask,
updateTask,
findAttachment,
findLabel,
findPerson,
findTask,
findOrCreateAttachment,
findOrCreateTask,
findOrCreateLabel,
createCustomApiCallAction({
auth: meistertaskAuth,
baseUrl: () => MEISTERTASK_API_URL,
authMapping: async (auth) => {
return {
Authorization: `Bearer ${(auth as OAuth2PropertyValue).access_token}`,
};
},
}),
],
triggers: [
newAttachment,
newPerson,
newSection,
newComment,
newTaskLabel,
newChecklistItem,
newProject,
newLabel,
newTask,
],
});

View File

@@ -0,0 +1,40 @@
import { meistertaskAuth } from '../../index';
import { meisterTaskCommon, makeRequest } from '../common/common';
import { createAction, Property } from '@activepieces/pieces-framework';
import { HttpMethod } from '@activepieces/pieces-common';
import { Project } from '@activepieces/shared';
export const createAttachment = createAction({
auth: meistertaskAuth,
name: 'create_attachment',
displayName: 'Create Attachment',
description: 'Creates a new attachment',
props: {
task_id: meisterTaskCommon.task_id,
file_url: Property.File({
displayName: 'File URL',
description: 'URL of the file to attach',
required: true,
}),
name: Property.ShortText({
displayName: 'Attachment Name',
required: false,
}),
},
async run(context) {
const token = context.auth.access_token;
const { task_id, file_url, name } = context.propsValue;
const body: any = { url: file_url };
if (name) body.name = name;
const response = await makeRequest(
HttpMethod.POST,
`/tasks/${task_id}/attachments`,
token,
body
);
return response.body;
},
});

View File

@@ -0,0 +1,40 @@
import { createAction, Property } from '@activepieces/pieces-framework';
import { makeRequest, meisterTaskCommon } from '../common/common';
import { meistertaskAuth } from '../../index';
import { HttpMethod } from '@activepieces/pieces-common';
export const createLabel = createAction({
auth: meistertaskAuth,
name: 'create_label',
displayName: 'Create Label',
description: 'Creates a new label',
props: {
project: meisterTaskCommon.project,
name: Property.ShortText({
displayName: 'Label Name',
required: true,
}),
color: Property.ShortText({
displayName: 'Color',
description: 'Hex color code (e.g., #FF0000)',
required: false,
}),
},
async run(context) {
const token = context.auth.access_token;
const { project, name, color } = context.propsValue;
const body: any = { name };
if (color) body.color = color;
const response = await makeRequest(
HttpMethod.POST,
`/projects/${project}/labels`,
token,
body
);
return response.body;
},
});

View File

@@ -0,0 +1,29 @@
import { meistertaskAuth } from '../../index';
import { makeRequest, meisterTaskCommon} from '../common/common';
import { createAction, Property } from '@activepieces/pieces-framework';
import { HttpMethod } from '@activepieces/pieces-common';
export const createTaskLabel = createAction({
auth: meistertaskAuth,
name: 'create_task_label',
displayName: 'Create Task Label',
description: 'Creates a new task label',
props: {
project: meisterTaskCommon.project,
task_id: meisterTaskCommon.task_id,
label: meisterTaskCommon.label,
},
async run(context) {
const token = context.auth.access_token;
const { task_id, label } = context.propsValue;
const response = await makeRequest(
HttpMethod.POST,
`/tasks/${task_id}/task_labels`,
token,
{ label_id: label }
);
return response.body;
},
});

View File

@@ -0,0 +1,50 @@
import { meistertaskAuth } from '../../index';
import { makeRequest, meisterTaskCommon } from '../common/common';
import { createAction, Property } from '@activepieces/pieces-framework';
import { HttpMethod } from '@activepieces/pieces-common';
export const createTask = createAction({
auth: meistertaskAuth,
name: 'create_task',
displayName: 'Create Task',
description: 'Creates a new task',
props: {
project: meisterTaskCommon.project,
section: meisterTaskCommon.section,
name: Property.ShortText({
displayName: 'Task Name',
required: true,
}),
notes: Property.LongText({
displayName: 'Notes',
required: false,
}),
assigned_to: meisterTaskCommon.person,
due_date: Property.DateTime({
displayName: 'Due Date',
required: false,
}),
},
async run(context) {
const token = context.auth.access_token;
const { section, name, notes, assigned_to, due_date } = context.propsValue;
const body: any = {
name,
section_id: section,
};
if (notes) body.notes = notes;
if (assigned_to) body.assigned_to_id = assigned_to;
if (due_date) body.due = due_date;
const response = await makeRequest(
HttpMethod.POST,
'/tasks',
token,
body
);
return response.body;
},
});

View File

@@ -0,0 +1,38 @@
import { meistertaskAuth } from '../../index';
import { meisterTaskCommon, makeRequest } from '../common/common';
import { createAction, Property } from '@activepieces/pieces-framework';
import { HttpMethod } from '@activepieces/pieces-common';
export const findAttachment = createAction({
auth: meistertaskAuth,
name: 'find_attachment',
displayName: 'Find Attachment',
description: 'Finds an attachment by searching',
props: {
task_id: meisterTaskCommon.task_id,
name: Property.ShortText({
displayName: 'Attachment Name',
required: false,
}),
},
async run(context) {
const token = context.auth.access_token;
const { task_id, name } = context.propsValue;
const response = await makeRequest(
HttpMethod.GET,
`/tasks/${task_id}/attachments`,
token
);
let attachments = response.body;
if (name) {
attachments = attachments.filter((att: any) =>
att.name.toLowerCase().includes(name.toLowerCase())
);
}
return attachments.length > 0 ? attachments[0] : null;
},
});

View File

@@ -0,0 +1,34 @@
import { meistertaskAuth } from '../../index';
import { makeRequest, meisterTaskCommon } from '../common/common';
import { createAction, Property } from '@activepieces/pieces-framework';
import { HttpMethod } from '@activepieces/pieces-common';
export const findLabel = createAction({
auth: meistertaskAuth,
name: 'find_label',
displayName: 'Find Label',
description: 'Finds a label by searching',
props: {
project: meisterTaskCommon.project,
name: Property.ShortText({
displayName: 'Label Name',
required: true,
}),
},
async run(context) {
const token = context.auth.access_token;
const { project, name } = context.propsValue;
const response = await makeRequest(
HttpMethod.GET,
`/projects/${project}/labels`,
token
);
const labels = response.body.filter((label: any) =>
label.name.toLowerCase().includes(name.toLowerCase())
);
return labels.length > 0 ? labels[0] : null;
},
});

View File

@@ -0,0 +1,60 @@
import { meistertaskAuth } from '../../index';
import { meisterTaskCommon, makeRequest } from '../common/common';
import { createAction, Property } from '@activepieces/pieces-framework';
import { HttpMethod } from '@activepieces/pieces-common';
export const findOrCreateAttachment = createAction({
auth: meistertaskAuth,
name: 'find_or_create_attachment',
displayName: 'Find or Create Attachment',
description: 'Finds an attachment by searching, or creates one if it doesn\'t exist',
props: {
task_id: meisterTaskCommon.task_id,
name: Property.ShortText({
displayName: 'Attachment Name',
required: true,
}),
file_url: Property.File({
displayName: 'File URL',
description: 'URL of the file to attach (used if creating)',
required: true,
}),
},
async run(context) {
const token = context.auth.access_token;
const { task_id, name, file_url } = context.propsValue;
// Try to find existing attachment
const findResponse = await makeRequest(
HttpMethod.GET,
`/tasks/${task_id}/attachments`,
token
);
const existingAttachment = findResponse.body.find((att: any) =>
att.name.toLowerCase() === name.toLowerCase()
);
if (existingAttachment) {
return {
found: true,
created: false,
attachment: existingAttachment,
};
}
// Create new attachment
const createResponse = await makeRequest(
HttpMethod.POST,
`/tasks/${task_id}/attachments`,
token,
{ url: file_url, name }
);
return {
found: false,
created: true,
attachment: createResponse.body,
};
},
});

View File

@@ -0,0 +1,63 @@
import { meistertaskAuth } from '../../index';
import { makeRequest, meisterTaskCommon } from '../common/common';
import { createAction, Property } from '@activepieces/pieces-framework';
import { HttpMethod } from '@activepieces/pieces-common';
export const findOrCreateLabel = createAction({
auth: meistertaskAuth,
name: 'find_or_create_label',
displayName: 'Find or Create Label',
description: 'Finds a label by searching, or creates one if it doesn\'t exist',
props: {
project: meisterTaskCommon.project,
name: Property.ShortText({
displayName: 'Label Name',
required: true,
}),
color: Property.ShortText({
displayName: 'Color',
description: 'Hex color code (e.g., #FF0000) - used if creating',
required: false,
}),
},
async run(context) {
const token = context.auth.access_token;
const { project, name, color } = context.propsValue;
// Try to find existing label
const findResponse = await makeRequest(
HttpMethod.GET,
`/projects/${project}/labels`,
token
);
const existingLabel = findResponse.body.find((label: any) =>
label.name.toLowerCase() === name.toLowerCase()
);
if (existingLabel) {
return {
found: true,
created: false,
label: existingLabel,
};
}
// Create new label
const body: any = { name };
if (color) body.color = color;
const createResponse = await makeRequest(
HttpMethod.POST,
`/projects/${project}/labels`,
token,
body
);
return {
found: false,
created: true,
label: createResponse.body,
};
},
});

View File

@@ -0,0 +1,76 @@
import { meistertaskAuth } from '../../index';
import { makeRequest, meisterTaskCommon } from '../common/common';
import { createAction, Property } from '@activepieces/pieces-framework';
import { HttpMethod } from '@activepieces/pieces-common';
export const findOrCreateTask = createAction({
auth: meistertaskAuth,
name: 'find_or_create_task',
displayName: 'Find or Create Task',
description: 'Finds a task by searching, or creates one if it doesn\'t exist',
props: {
project: meisterTaskCommon.project,
section: meisterTaskCommon.section,
name: Property.ShortText({
displayName: 'Task Name',
required: true,
}),
notes: Property.LongText({
displayName: 'Notes',
description: 'Notes for the task (used if creating)',
required: false,
}),
assigned_to: meisterTaskCommon.person,
due_date: Property.DateTime({
displayName: 'Due Date',
description: 'Due date for the task (used if creating)',
required: false,
}),
},
async run(context) {
const token = context.auth.access_token;
const { section, name, notes, assigned_to, due_date } = context.propsValue;
// Try to find existing task
const findResponse = await makeRequest(
HttpMethod.GET,
`/sections/${section}/tasks`,
token
);
const existingTask = findResponse.body.find((task: any) =>
task.name.toLowerCase() === name.toLowerCase()
);
if (existingTask) {
return {
found: true,
created: false,
task: existingTask,
};
}
// Create new task
const body: any = {
name,
section_id: section,
};
if (notes) body.notes = notes;
if (assigned_to) body.assigned_to_id = assigned_to;
if (due_date) body.due = due_date;
const createResponse = await makeRequest(
HttpMethod.POST,
'/tasks',
token,
body
);
return {
found: false,
created: true,
task: createResponse.body,
};
},
});

View File

@@ -0,0 +1,29 @@
import { meistertaskAuth } from '../../index';
import { meisterTaskCommon, makeRequest } from '../common/common';
import { createAction, Property } from '@activepieces/pieces-framework';
import { HttpMethod } from '@activepieces/pieces-common';
export const findPerson = createAction({
auth: meistertaskAuth,
name: 'find_person',
displayName: 'Find Person',
description: 'Finds a person based on person_id',
props: {
person_id: Property.Number({
displayName: 'Person ID',
required: true,
}),
},
async run(context) {
const token = context.auth.access_token;
const { person_id } = context.propsValue;
const response = await makeRequest(
HttpMethod.GET,
`/persons/${person_id}`,
token
);
return response.body;
},
});

View File

@@ -0,0 +1,39 @@
import { meistertaskAuth } from '../../index';
import { makeRequest, meisterTaskCommon } from '../common/common';
import { createAction, Property } from '@activepieces/pieces-framework';
import { HttpMethod } from '@activepieces/pieces-common';
export const findTask = createAction({
auth: meistertaskAuth,
name: 'find_task',
displayName: 'Find Task',
description: 'Finds a task by searching',
props: {
project: meisterTaskCommon.project,
section: meisterTaskCommon.section,
name: Property.ShortText({
displayName: 'Task Name',
required: false,
}),
},
async run(context) {
const token = context.auth.access_token;
const { section, name } = context.propsValue;
const response = await makeRequest(
HttpMethod.GET,
`/sections/${section}/tasks`,
token
);
let tasks = response.body;
if (name) {
tasks = tasks.filter((task: any) =>
task.name.toLowerCase().includes(name.toLowerCase())
);
}
return tasks.length > 0 ? tasks[0] : null;
},
});

View File

@@ -0,0 +1,61 @@
import { meistertaskAuth } from '../../index';
import { meisterTaskCommon, makeRequest } from '../common/common';
import { createAction, Property } from '@activepieces/pieces-framework';
import { HttpMethod } from '@activepieces/pieces-common';
import { Project } from '@activepieces/shared';
export const updateTask = createAction({
auth: meistertaskAuth,
name: 'update_task',
displayName: 'Update Task',
description: 'Updates an existing task',
props: {
Project: meisterTaskCommon.project,
task_id: meisterTaskCommon.task_id,
name: Property.ShortText({
displayName: 'Task Name',
required: false,
}),
notes: Property.LongText({
displayName: 'Notes',
required: false,
}),
status: Property.StaticDropdown({
displayName: 'Status',
required: false,
options: {
disabled: false,
options: [
{ label: 'Open', value: 1 },
{ label: 'Completed', value: 2 },
{ label: 'Trashed', value: 18 },
],
},
}),
assigned_to: meisterTaskCommon.person,
due_date: Property.DateTime({
displayName: 'Due Date',
required: false,
}),
},
async run(context) {
const token = context.auth.access_token;
const { task_id, name, notes, status, assigned_to, due_date } = context.propsValue;
const body: any = {};
if (name) body.name = name;
if (notes) body.notes = notes;
if (status) body.status = status;
if (assigned_to) body.assigned_to_id = assigned_to;
if (due_date) body.due = due_date;
const response = await makeRequest(
HttpMethod.PUT,
`/tasks/${task_id}`,
token,
body
);
return response.body;
},
});

View File

@@ -0,0 +1,247 @@
import { HttpMethod, httpClient } from '@activepieces/pieces-common';
import { Property } from '@activepieces/pieces-framework';
import { createTrigger, TriggerStrategy } from '@activepieces/pieces-framework';
import { AuthenticationType } from '@activepieces/pieces-common';
import { meistertaskAuth } from '../../index';
export const MEISTERTASK_API_URL = 'https://www.meistertask.com/api';
export const meisterTaskCommon = {
baseUrl: MEISTERTASK_API_URL,
project: Property.Dropdown({
auth: meistertaskAuth,
displayName: 'Project',
required: true,
refreshers: [],
options: async ({ auth }) => {
if (!auth) {
return {
disabled: true,
options: [],
placeholder: 'Please connect your account first',
};
}
try {
const token = typeof auth === 'string' ? auth : (auth).access_token;
const response = await httpClient.sendRequest({
method: HttpMethod.GET,
url: `${MEISTERTASK_API_URL}/projects`,
authentication: {
type: AuthenticationType.BEARER_TOKEN,
token: token,
},
});
return {
disabled: false,
options: response.body.map((project: any) => ({
label: project.name,
value: project.id,
})),
};
} catch (error) {
console.error('Error fetching projects:', error);
return {
disabled: true,
options: [],
placeholder: 'Error loading projects. Please reconnect your account.',
};
}
},
}),
section: Property.Dropdown({
auth: meistertaskAuth,
displayName: 'Section',
required: true,
refreshers: ['project'],
options: async ({ auth, project }) => {
if (!auth || !project) {
return {
disabled: true,
options: [],
placeholder: 'Please select a project first',
};
}
try {
const token = typeof auth === 'string' ? auth : (auth as any).access_token;
const response = await httpClient.sendRequest({
method: HttpMethod.GET,
url: `${MEISTERTASK_API_URL}/projects/${project}/sections`,
authentication: {
type: AuthenticationType.BEARER_TOKEN,
token: token,
},
});
return {
disabled: false,
options: response.body.map((section: any) => ({
label: section.name,
value: section.id,
})),
};
} catch (error) {
console.error('Error fetching sections:', error);
return {
disabled: true,
options: [],
placeholder: 'Error loading sections',
};
}
},
}),
task_id: Property.Dropdown<{ name: string; id: string },true,typeof meistertaskAuth>({
auth: meistertaskAuth,
displayName: 'Task',
required: true,
refreshers: [],
options: async ({ auth }) => {
if (!auth) {
return {
disabled: true,
options: [],
placeholder: 'Please select a first',
};
}
try {
const token = typeof auth === 'string' ? auth : (auth as any).access_token;
const response = await httpClient.sendRequest({
method: HttpMethod.GET,
url: `${MEISTERTASK_API_URL}/tasks`,
authentication: {
type: AuthenticationType.BEARER_TOKEN,
token: token,
},
});
return {
disabled: false,
options: response.body.map((task: any) => ({
label: task.name,
value: task.id,
})),
};
} catch (error) {
console.error('Error fetching tasks:', error);
return {
disabled: true,
options: [],
placeholder: 'Error loading tasks',
};
}
},
}),
label: Property.Dropdown<{ name: string; id: string },true,typeof meistertaskAuth>({
auth: meistertaskAuth,
displayName: 'Label',
required: true,
refreshers: ['project'],
options: async ({ auth, project }) => {
if (!auth || !project) {
return {
disabled: true,
options: [],
placeholder: 'Please select a project first',
};
}
try {
const token = typeof auth === 'string' ? auth : (auth as any).access_token;
const response = await httpClient.sendRequest({
method: HttpMethod.GET,
url: `${MEISTERTASK_API_URL}/projects/${project}/labels`,
authentication: {
type: AuthenticationType.BEARER_TOKEN,
token: token,
},
});
return {
disabled: false,
options: response.body.map((label: any) => ({
label: label.name,
value: label.id,
})),
};
} catch (error) {
console.error('Error fetching labels:', error);
return {
disabled: true,
options: [],
placeholder: 'Error loading labels',
};
}
},
}),
person: Property.Dropdown({
auth: meistertaskAuth,
displayName: 'Person',
required: false,
refreshers: ['project'],
options: async ({ auth, project }) => {
if (!auth || !project) {
return {
disabled: true,
options: [],
placeholder: 'Please select a project first',
};
}
try {
const token = typeof auth === 'string' ? auth : (auth as any).access_token;
const response = await httpClient.sendRequest({
method: HttpMethod.GET,
url: `${MEISTERTASK_API_URL}/projects/${project}/persons`,
authentication: {
type: AuthenticationType.BEARER_TOKEN,
token: token,
},
});
return {
disabled: false,
options: response.body.map((person: any) => ({
label: `${person.firstname} ${person.lastname}`,
value: person.id,
})),
};
} catch (error) {
console.error('Error fetching persons:', error);
return {
disabled: true,
options: [],
placeholder: 'Error loading persons',
};
}
},
}),
};
export async function makeRequest(
method: HttpMethod,
url: string,
token: string,
body?: any
) {
return await httpClient.sendRequest({
method,
url: `${MEISTERTASK_API_URL}${url}`,
authentication: {
type: AuthenticationType.BEARER_TOKEN,
token,
},
body,
});
}

View File

@@ -0,0 +1,87 @@
import {
createTrigger,
TriggerStrategy,
PiecePropValueSchema,
AppConnectionValueForAuthProperty,
} from '@activepieces/pieces-framework';
import {
DedupeStrategy,
Polling,
pollingHelper,
HttpMethod,
} from '@activepieces/pieces-common';
import dayjs from 'dayjs';
import { meistertaskAuth } from '../../index';
import { makeRequest, meisterTaskCommon } from '../common/common';
const getToken = (auth: any): string => {
return typeof auth === 'string' ? auth : (auth as any).access_token;
};
const newAttachmentPolling: Polling<
AppConnectionValueForAuthProperty<typeof meistertaskAuth>,
{ project: unknown; section: unknown }
> = {
strategy: DedupeStrategy.TIMEBASED,
items: async ({ auth, propsValue }) => {
const token = getToken(auth);
const tasksResponse = await makeRequest(
HttpMethod.GET,
`/sections/${propsValue.section}/tasks`,
token
);
const tasks = tasksResponse.body || [];
const attachments: any[] = [];
for (const task of tasks) {
try {
const attachmentsResponse = await makeRequest(
HttpMethod.GET,
`/tasks/${task.id}/attachments`,
token
);
const taskAttachments = attachmentsResponse.body || [];
attachments.push(...taskAttachments);
} catch (error) {
console.error(`Error fetching attachments for task ${task.id}:`, error);
}
}
return attachments.map((attachment: any) => ({
epochMilliSeconds: dayjs(attachment.created_at).valueOf(),
data: attachment,
}));
},
};
export const newAttachment = createTrigger({
auth: meistertaskAuth,
name: 'new_attachment',
displayName: 'New Attachment',
description: 'Triggers when an attachment is created.',
props: {
project: meisterTaskCommon.project,
section: meisterTaskCommon.section,
},
sampleData: {
id: 55555555,
task_id: 12345678,
filename: 'document.pdf',
url: 'https://example.com/file.pdf',
created_at: '2024-01-15T12:00:00Z',
},
type: TriggerStrategy.POLLING,
async test(context) {
return await pollingHelper.test(newAttachmentPolling, context);
},
async onEnable(context) {
await pollingHelper.onEnable(newAttachmentPolling, context);
},
async onDisable(context) {
await pollingHelper.onDisable(newAttachmentPolling, context);
},
async run(context) {
return await pollingHelper.poll(newAttachmentPolling, context);
},
});

View File

@@ -0,0 +1,81 @@
import {
createTrigger,
TriggerStrategy,
PiecePropValueSchema,
AppConnectionValueForAuthProperty,
} from '@activepieces/pieces-framework';
import {
DedupeStrategy,
Polling,
pollingHelper,
HttpMethod,
} from '@activepieces/pieces-common';
import { meistertaskAuth } from '../../index';
import { makeRequest, meisterTaskCommon } from '../common/common';
const getToken = (auth: any): string => {
return typeof auth === 'string' ? auth : (auth as any).access_token;
};
const newChecklistItemPolling: Polling<
AppConnectionValueForAuthProperty<typeof meistertaskAuth>,
{ task_id: unknown }
> = {
strategy: DedupeStrategy.LAST_ITEM,
items: async ({ auth, propsValue }) => {
const token = getToken(auth);
try {
const tasksResponse = await makeRequest(
HttpMethod.GET,
`/task/${propsValue.task_id}/checklist_items`,
token
);
const tasks = tasksResponse.body || [];
const checklistItems: any[] = [];
if (tasks.length === 0) {
return [];
}
return tasks.map((item: any) => ({
id: item.id,
data: item,
}));
} catch (error) {
console.error('Error fetching checklist items:', error);
return [];
}
},
};
export const newChecklistItem = createTrigger({
auth: meistertaskAuth,
name: 'new_checklist_item',
displayName: 'New Checklist Item',
description: 'Triggers when a new checklist item is added to a task.',
props: {
task_id: meisterTaskCommon.task_id,
},
sampleData: {
"id": 26,
"name": "Checklist A",
"sequence": 100000,
"task_id": 12,
"project_id": 6
},
type: TriggerStrategy.POLLING,
async test(context) {
return await pollingHelper.test(newChecklistItemPolling, context);
},
async onEnable(context) {
await pollingHelper.onEnable(newChecklistItemPolling, context);
},
async onDisable(context) {
await pollingHelper.onDisable(newChecklistItemPolling, context);
},
async run(context) {
return await pollingHelper.poll(newChecklistItemPolling, context);
},
});

View File

@@ -0,0 +1,73 @@
import {
createTrigger,
TriggerStrategy,
PiecePropValueSchema,
AppConnectionValueForAuthProperty,
} from '@activepieces/pieces-framework';
import {
DedupeStrategy,
Polling,
pollingHelper,
HttpMethod,
} from '@activepieces/pieces-common';
import dayjs from 'dayjs';
import { meistertaskAuth } from '../../index';
import { makeRequest, meisterTaskCommon } from '../common/common';
const getToken = (auth: any): string => {
return typeof auth === 'string' ? auth : (auth as any).access_token;
};
const newCommentPolling: Polling<
AppConnectionValueForAuthProperty<typeof meistertaskAuth>,
{ task_id: unknown }
> = {
strategy: DedupeStrategy.TIMEBASED,
items: async ({ auth, propsValue }) => {
const token = getToken(auth);
const tasksResponse = await makeRequest(
HttpMethod.GET,
`/task/${propsValue.task_id}/comments`,
token
);
const taskComments = tasksResponse.body || [];
return taskComments.map((comment: any) => ({
epochMilliSeconds: dayjs(comment.created_at).valueOf(),
data: comment,
}));
},
};
export const newComment = createTrigger({
auth: meistertaskAuth,
name: 'new_comment',
displayName: 'New Comment',
description: 'Triggers when a new comment is created on a task.',
props: {
task_id: meisterTaskCommon.task_id,
},
sampleData: {
"id": 2,
"task_id": 123,
"text": "Looks awesome!",
"text_html": "<p>Looks awesome!</p>\n",
"person_id": 7,
"created_at": "2017-04-02T03:14:15.926535Z",
"updated_at": "2017-04-02T03:14:15.926535Z"
},
type: TriggerStrategy.POLLING,
async test(context) {
return await pollingHelper.test(newCommentPolling, context);
},
async onEnable(context) {
await pollingHelper.onEnable(newCommentPolling, context);
},
async onDisable(context) {
await pollingHelper.onDisable(newCommentPolling, context);
},
async run(context) {
return await pollingHelper.poll(newCommentPolling, context);
},
});

View File

@@ -0,0 +1,69 @@
import {
createTrigger,
TriggerStrategy,
PiecePropValueSchema,
AppConnectionValueForAuthProperty,
} from '@activepieces/pieces-framework';
import {
DedupeStrategy,
Polling,
pollingHelper,
HttpMethod,
} from '@activepieces/pieces-common';
import dayjs from 'dayjs';
import { meistertaskAuth } from '../../index';
import { meisterTaskCommon, makeRequest } from '../common/common';
const getToken = (auth: any): string => {
return typeof auth === 'string' ? auth : (auth as any).access_token;
};
const newLabelPolling: Polling<
AppConnectionValueForAuthProperty<typeof meistertaskAuth>,
{ project: unknown }
> = {
strategy: DedupeStrategy.LAST_ITEM,
items: async ({ auth, propsValue }) => {
const token = getToken(auth);
const response = await makeRequest(
HttpMethod.GET,
`/projects/${propsValue.project}/labels`,
token
);
const labels = response.body || [];
return labels.map((label: any) => ({
id: label.id,
data: label,
}));
},
};
export const newLabel = createTrigger({
auth: meistertaskAuth,
name: 'new_label',
displayName: 'New Label',
description: 'Triggers when a label is created.',
props: {
project: meisterTaskCommon.project,
},
sampleData: {
"id": 24,
"project_id": 42,
"name": "Bug",
"color": "d93651"
},
type: TriggerStrategy.POLLING,
async test(context) {
return await pollingHelper.test(newLabelPolling, context);
},
async onEnable(context) {
await pollingHelper.onEnable(newLabelPolling, context);
},
async onDisable(context) {
await pollingHelper.onDisable(newLabelPolling, context);
},
async run(context) {
return await pollingHelper.poll(newLabelPolling, context);
},
});

View File

@@ -0,0 +1,73 @@
import {
createTrigger,
TriggerStrategy,
PiecePropValueSchema,
AppConnectionValueForAuthProperty,
} from '@activepieces/pieces-framework';
import {
DedupeStrategy,
Polling,
pollingHelper,
HttpMethod,
} from '@activepieces/pieces-common';
import dayjs from 'dayjs';
import { meistertaskAuth } from '../../index';
import { makeRequest, meisterTaskCommon } from '../common/common';
const getToken = (auth: any): string => {
return typeof auth === 'string' ? auth : (auth as any).access_token;
};
const newPersonPolling: Polling<
AppConnectionValueForAuthProperty<typeof meistertaskAuth>,
{ project: unknown }
> = {
strategy: DedupeStrategy.TIMEBASED,
items: async ({ auth, propsValue }) => {
const token = getToken(auth);
const response = await makeRequest(
HttpMethod.GET,
`/projects/${propsValue.project}/persons`,
token
);
const persons = response.body || [];
return persons.map((person: any) => ({
epochMilliSeconds: dayjs(person.created_at).valueOf(),
data: person,
}));
},
};
export const newPerson = createTrigger({
auth: meistertaskAuth,
name: 'new_person',
displayName: 'New Person',
description: 'Triggers when a new person is added to a project.',
props: {
project: meisterTaskCommon.project,
},
sampleData: {
"id": 8,
"firstname": "Jane",
"lastname": "Demo",
"email": "jane@example.com",
"avatar": "https://www.example.com/files/avatars/jane.jpg",
"avatar_thumb": "https://www.example.com/files/avatars/jane.jpg",
"created_at": "2017-04-02T03:14:15.926535Z",
"updated_at": "2017-04-02T03:14:15.926535Z"
},
type: TriggerStrategy.POLLING,
async test(context) {
return await pollingHelper.test(newPersonPolling, context);
},
async onEnable(context) {
await pollingHelper.onEnable(newPersonPolling, context);
},
async onDisable(context) {
await pollingHelper.onDisable(newPersonPolling, context);
},
async run(context) {
return await pollingHelper.poll(newPersonPolling, context);
},
});

View File

@@ -0,0 +1,70 @@
import {
createTrigger,
TriggerStrategy,
PiecePropValueSchema,
AppConnectionValueForAuthProperty,
} from '@activepieces/pieces-framework';
import {
DedupeStrategy,
Polling,
pollingHelper,
HttpMethod,
} from '@activepieces/pieces-common';
import dayjs from 'dayjs';
import { meistertaskAuth } from '../../index';
import { makeRequest, meisterTaskCommon } from '../common/common';
const getToken = (auth: any): string => {
return typeof auth === 'string' ? auth : (auth as any).access_token;
};
const newProjectPolling: Polling<
AppConnectionValueForAuthProperty<typeof meistertaskAuth>,
Record<string, any>
> = {
strategy: DedupeStrategy.TIMEBASED,
items: async ({ auth }) => {
const token = getToken(auth);
const response = await makeRequest(
HttpMethod.GET,
`/projects`,
token
);
const projects = response.body || [];
return projects.map((project: any) => ({
epochMilliSeconds: dayjs(project.created_at).valueOf(),
data: project,
}));
},
};
export const newProject = createTrigger({
auth: meistertaskAuth,
name: 'new_project',
displayName: 'New Project',
description: 'Triggers when a new project is created.',
props: {},
sampleData: {
"id": 123,
"token": "s3i5reaF",
"name": "Getting Started with MeisterTask",
"notes": "This is just a demo project",
"status": 1,
"created_at": "2017-01-13T09:29:36.360375Z",
"updated_at": "2017-01-16T10:10:21.460697Z"
},
type: TriggerStrategy.POLLING,
async test(context) {
return await pollingHelper.test(newProjectPolling, context);
},
async onEnable(context) {
await pollingHelper.onEnable(newProjectPolling, context);
},
async onDisable(context) {
await pollingHelper.onDisable(newProjectPolling, context);
},
async run(context) {
return await pollingHelper.poll(newProjectPolling, context);
},
});

View File

@@ -0,0 +1,74 @@
import {
createTrigger,
TriggerStrategy,
PiecePropValueSchema,
AppConnectionValueForAuthProperty,
} from '@activepieces/pieces-framework';
import {
DedupeStrategy,
Polling,
pollingHelper,
HttpMethod,
} from '@activepieces/pieces-common';
import dayjs from 'dayjs';
import { meistertaskAuth } from '../../index';
import { makeRequest, meisterTaskCommon } from '../common/common';
const getToken = (auth: any): string => {
return typeof auth === 'string' ? auth : (auth as any).access_token;
};
const newSectionPolling: Polling<
AppConnectionValueForAuthProperty<typeof meistertaskAuth>,
Record<string, any>
> = {
strategy: DedupeStrategy.TIMEBASED,
items: async ({ auth, propsValue }) => {
const token = getToken(auth);
const response = await makeRequest(
HttpMethod.GET,
`/sections`,
token
);
const sections = response.body || [];
return sections.map((section: any) => ({
epochMilliSeconds: dayjs(section.created_at).valueOf(),
data: section,
}));
},
};
export const newSection = createTrigger({
auth: meistertaskAuth,
name: 'new_section',
displayName: 'New Section',
description: 'Triggers when a new section is created.',
props: {
},
sampleData: {
"id": 119,
"name": "Intermediate",
"description": null,
"color": "30bfbf",
"indicator": 7,
"status": 1,
"project_id": 66,
"sequence": -1,
"created_at": "2017-01-25T13:22:34.559759Z",
"updated_at": "2017-02-01T09:24:48.453184Z"
},
type: TriggerStrategy.POLLING,
async test(context) {
return await pollingHelper.test(newSectionPolling, context);
},
async onEnable(context) {
await pollingHelper.onEnable(newSectionPolling, context);
},
async onDisable(context) {
await pollingHelper.onDisable(newSectionPolling, context);
},
async run(context) {
return await pollingHelper.poll(newSectionPolling, context);
},
});

View File

@@ -0,0 +1,77 @@
import {
createTrigger,
TriggerStrategy,
PiecePropValueSchema,
Property,
AppConnectionValueForAuthProperty,
} from '@activepieces/pieces-framework';
import {
DedupeStrategy,
Polling,
pollingHelper,
HttpMethod,
} from '@activepieces/pieces-common';
import dayjs from 'dayjs';
import { meistertaskAuth } from '../../index';
import { makeRequest, meisterTaskCommon } from '../common/common';
const getToken = (auth: any): string => {
return typeof auth === 'string' ? auth : (auth as any).access_token;
};
const newTaskLabelPolling: Polling<
AppConnectionValueForAuthProperty<typeof meistertaskAuth>,
{ project: unknown; section: unknown }
> = {
strategy: DedupeStrategy.TIMEBASED,
items: async ({ auth, propsValue }) => {
const token = getToken(auth);
try {
const tasksResponse = await makeRequest(
HttpMethod.GET,
`/task/${propsValue.section}/task_labels`,
token
);
const taskLabels = tasksResponse.body || [];
return taskLabels.map((label: any) => ({
epochMilliSeconds: dayjs(label.created_at || label.updated_at || new Date()).valueOf(),
data: label,
}));
} catch (error) {
console.error('Error fetching task labels:', error);
return [];
}
},
};
export const newTaskLabel = createTrigger({
auth: meistertaskAuth,
name: 'new_task_label',
displayName: 'New Task Label',
description: 'Triggers when a task label is created.',
props: {
project: meisterTaskCommon.project,
section: meisterTaskCommon.section,
},
sampleData: {
"id": 364,
"label_id": 25,
"task_id": 123
},
type: TriggerStrategy.POLLING,
async test(context) {
return await pollingHelper.test(newTaskLabelPolling, context);
},
async onEnable(context) {
await pollingHelper.onEnable(newTaskLabelPolling, context);
},
async onDisable(context) {
await pollingHelper.onDisable(newTaskLabelPolling, context);
},
async run(context) {
return await pollingHelper.poll(newTaskLabelPolling, context);
},
});

View File

@@ -0,0 +1,79 @@
import {
createTrigger,
TriggerStrategy,
PiecePropValueSchema,
AppConnectionValueForAuthProperty,
} from '@activepieces/pieces-framework';
import {
DedupeStrategy,
Polling,
pollingHelper,
HttpMethod,
} from '@activepieces/pieces-common';
import dayjs from 'dayjs';
import { meistertaskAuth } from '../../index';
import { makeRequest, meisterTaskCommon } from '../common/common';
const getToken = (auth: any): string => {
return typeof auth === 'string' ? auth : (auth as any).access_token;
};
const newTaskPolling: Polling<
AppConnectionValueForAuthProperty<typeof meistertaskAuth>,
Record<string, any>
> = {
strategy: DedupeStrategy.TIMEBASED,
items: async ({ auth, propsValue }) => {
const token = getToken(auth);
const response = await makeRequest(
HttpMethod.GET,
`/tasks`,
token
);
const tasks = response.body || [];
return tasks.map((task: any) => ({
epochMilliSeconds: dayjs(task.updated_at).valueOf(),
data: task,
}));
},
};
export const newTask = createTrigger({
auth: meistertaskAuth,
name: 'new_task',
displayName: 'New Task',
description: 'Triggers when a task is created or changed.',
props: {
},
sampleData: {
"id": 15,
"token": "gvuUs17f",
"name": "Task Name",
"notes": "Here are some task notes",
"status": 1,
"status_updated_at": "2019-05-09T14:49:18.303930Z",
"section_id": 1,
"section_name": "Open",
"project_id": 15,
"sequence": 100,
"assigned_to_id": 1,
"tracked_time": 3600,
"due": null,
"created_at": "2019-02-06T17:01:33.635649Z",
"updated_at": "2019-05-09T14:49:18.304227Z"
},
type: TriggerStrategy.POLLING,
async test(context) {
return await pollingHelper.test(newTaskPolling, context);
},
async onEnable(context) {
await pollingHelper.onEnable(newTaskPolling, context);
},
async onDisable(context) {
await pollingHelper.onDisable(newTaskPolling, context);
},
async run(context) {
return await pollingHelper.poll(newTaskPolling, context);
},
});