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,103 @@
{
"Cloud based task management application.": "Cloud-basierte Task-Management-Anwendung.",
"\n1. Sign in to [Microsoft Azure Portal](https://portal.azure.com/).\n2. From the left sidebar, go to **Microsoft Enfra ID**.\n3. Under **Manage**, click on **App registrations**.\n4. Click the **New registration** button.\n5. Enter a **Name** for your app.\n6. For **Supported account types**, choose:\n - **Accounts in any organizational directory (Any Microsoft Entra ID tenant - Multitenant) and personal Microsoft accounts**\n - Or select based on your requirement.\n7. In **Redirect URI**, select **Web** and ad": "\n1. Melden Sie sich bei [Microsoft Azure Portal](https://portal.azure.com/).\n. Von der linken Seitenleiste gehen Sie zur **Microsoft Enfra ID**.\n3. Unter **Verwalten** klicken Sie auf **App-Registrierungen**.\n4. Klicken Sie auf die **Neue Registrierung** Schaltfläche.\n5. Geben Sie einen **Name** für Ihre App ein.\n6. Für **unterstützte Kontotypen**, auswählen:\n - **Konten in jedem Organisationsverzeichnis (jeder Microsoft-Entra-ID-Mieter - Multitenant) und persönlichen Microsoft-Konten**\n - Oder wählen Sie nach Ihren Anforderungen aus.\n7. In **Umleitungs-URI** wählen Sie **Web** und fügen Sie die angegebene URL hinzu.\n8. Klicken Sie auf **Registrieren**.\n9. Nach der Registrierung werden Sie zur Übersichtsseite der App weitergeleitet. Kopieren Sie die **Anwendungs-(Client)-ID**.\n10. Gehen Sie aus dem linken Menü zu **Zertifikate & Geheimnis**.\n - Unter **Kundengeheimnis**, klicken Sie **Kundengeheimnis**.\n - Geben Sie eine Beschreibung an, setzen Sie ein Ablaufdatum und klicken Sie auf **Hinzufügen**.\n - Kopieren Sie den **Wert** des Client-Geheimnisses (dies wird nicht wieder angezeigt).\n11. Gehe zu **API-Berechtigungen** vom linken Menü.\n - Klicke auf **Berechtigung hinzufügen**.\n - Wähle **Microsoft Graph** → **Delegierte Berechtigungen**.\n - Fügen Sie folgende Bereiche hinzu:\n - Benutzer. ead\n - Aufgaben. eadWrite \n - offline_access\n - Klicken Sie auf **Berechtigungen hinzufügen**.\n12. Kopieren Sie Ihre **Client-ID** und **Client-Geheimnis**.\n",
"Create Task": "Aufgabe erstellen",
"Create Task List": "Aufgabenliste erstellen",
"Update Task": "Aufgabe aktualisieren",
"Update Task List": "Aufgabenliste aktualisieren",
"Complete Task": "Complete Task",
"Delete Task": "Aufgabe löschen",
"Add an Attachment": "Anhang hinzufügen",
"Get Task": "Aufgabe abrufen",
"Find Task List": "Aufgabenliste finden",
"Find Task": "Aufgabe finden",
"Custom API Call": "Eigener API-Aufruf",
"Creates a new task.": "Erstellt eine neue Aufgabe.",
"Create a new task list.": "Neue Aufgabenliste anlegen.",
"Update an existing task.": "Bestehende Aufgabe aktualisieren.",
"Updates an existing task list.": "Aktualisiert eine vorhandene Aufgabenliste.",
"Marks a task as completed.": "Markiert eine Aufgabe als abgeschlossen.",
"Deletes an existing task.": "Löscht eine existierende Aufgabe.",
"Adds an attachment to a task.": "Fügt einer Aufgabe einen Anhang hinzu.",
"Gets the details of a specific task.": "Ruft die Details einer bestimmten Aufgabe ab.",
"Finds a task list by its name.": "Findet eine Aufgabenliste mit ihrem Namen.",
"Finds tasks by title.": "Findet Aufgaben nach Titel.",
"Make a custom API call to a specific endpoint": "Einen benutzerdefinierten API-Aufruf an einen bestimmten Endpunkt machen",
"Task List": "Aufgabenliste",
"Title": "Titel",
"Body Content": "Inhalt des Körpers",
"Importance": "Bedeutung",
"Status": "Status",
"Due Date": "Fälligkeitsdatum",
"Reminder Date": "Erinnerungsdatum",
"Start Date": "Startdatum",
"Categories": "Kategorien",
"Task": "Aufgabe",
"New Name": "Neuer Name",
"File": "Datei",
"Attachment Name (Optional)": "Name des Anhangs (optional)",
"Match Type": "Match-Typ",
"Task Title": "Aufgabentitel",
"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)",
"The task list to create the task in.": "Die Aufgabenliste, in der die Aufgabe erstellt werden soll.",
"The title of the task.": "Der Titel der Aufgabe.",
"The body or notes for the task.": "Der Körper oder Notizen für die Aufgabe.",
"The importance of the task.": "Die Bedeutung der Aufgabe.",
"The status of the task.": "Der Status der Aufgabe.",
"The date and time the task is scheduled to start.": "Das Datum und die Uhrzeit, in der die Aufgabe beginnen soll.",
"Comma-separated categories for the task (e.g., Work, Personal).": "Durch Kommas getrennte Kategorien für die Aufgabe (z. B. Arbeit, Personal).",
"The name for the new task list.": "Der Name für die neue Aufgabenliste.",
"The task list containing the task to update.": "Die Aufgabenliste, die die zu aktualisierende Aufgabe enthält.",
"The task to update.": "Die zu aktualisierende Aufgabe.",
"The task list to update.": "Die zu aktualisierende Aufgabenliste.",
"The new name for the task list.": "Der neue Name für die Aufgabenliste.",
"The task list containing the task you want to complete.": "Die Aufgabenliste, die die Aufgabe enthält, die Sie ausführen möchten.",
"The specific task to mark as complete.": "Die spezifische Aufgabe, die als erledigt markiert werden soll.",
"The list containing the task you want to delete.": "Die Liste mit der Aufgabe, die Sie löschen möchten.",
"The specific task to delete.": "Die spezifische Aufgabe, die gelöscht werden soll.",
"The task list that contains the task.": "Die Aufgabenliste, die die Aufgabe enthält.",
"The task to which you are adding the attachment.": "Die Aufgabe, zu der Sie den Anhang hinzufügen.",
"The file to attach (up to 25 MB supported).": "Die anzuhängende Datei (bis zu 25 MB unterstützt).",
"The name to display for the attachment. If left blank, the original filename will be used.": "Der anzuzeigende Dateiname. Wenn leer gelassen, wird der ursprüngliche Dateiname verwendet.",
"The list containing the task you want to retrieve.": "Die Liste mit der Aufgabe, die Sie abrufen möchten.",
"The specific task to retrieve.": "Die spezifische Aufgabe, die wir abrufen müssen.",
"The name (or partial name) of the task list to find.": "Der Name (oder Teilname) der zu findenden Aufgabenliste.",
"How to match the list name.": "Wie man mit dem Listennamen übereinstimmt.",
"Select a specific task list to search within.": "Wählen Sie eine bestimmte Aufgabenliste für die Suche aus.",
"The title (or partial title) of the task to find.": "Der Titel (oder Teiltitel) der zu findenden Aufgabe.",
"How to match the task title.": "Wie man mit dem Titel der Aufgabe übereinstimmt.",
"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..",
"Low": "Niedrig",
"Normal": "Normal",
"High": "Hoch",
"Not Started": "Nicht gestartet",
"In Progress": "In Bearbeitung",
"Completed": "Abgeschlossen",
"Waiting On Others": "Warten auf anderen",
"Deferred": "Aufgeschoben",
"Contains": "Enthält",
"Starts With": "Beginnt mit",
"Exact Match": "Genaues Match",
"GET": "ERHALTEN",
"POST": "POST",
"PATCH": "PATCH",
"PUT": "PUT",
"DELETE": "LÖSCHEN",
"HEAD": "HEAD",
"New Task": "Neue Aufgabe",
"New or Updated Task": "Neue oder aktualisierte Aufgabe",
"New List": "Neue Liste",
"Task Completed": "Aufgabe erledigt",
"Triggers when a new task is created.": "Wird ausgelöst, wenn eine neue Aufgabe erstellt wird.",
"Triggers when a new task is created or an existing task is updated.": "Wird ausgelöst, wenn eine neue Aufgabe erstellt oder eine bestehende Aufgabe aktualisiert wird.",
"Triggers when a new task list is created.": "Wird ausgelöst, wenn eine neue Aufgabenliste erstellt wird.",
"Triggers when a task is completed in a specific list.": "Wird ausgelöst, wenn eine Aufgabe in einer bestimmten Liste abgeschlossen ist.",
"The list to watch for completed tasks.": "Die Liste für abgeschlossene Aufgaben."
}

View File

@@ -0,0 +1,103 @@
{
"Cloud based task management application.": "Aplicación de administración de tareas basada en la nube.",
"\n1. Sign in to [Microsoft Azure Portal](https://portal.azure.com/).\n2. From the left sidebar, go to **Microsoft Enfra ID**.\n3. Under **Manage**, click on **App registrations**.\n4. Click the **New registration** button.\n5. Enter a **Name** for your app.\n6. For **Supported account types**, choose:\n - **Accounts in any organizational directory (Any Microsoft Entra ID tenant - Multitenant) and personal Microsoft accounts**\n - Or select based on your requirement.\n7. In **Redirect URI**, select **Web** and ad": "\n1. Sign in to [Microsoft Azure Portal](https://portal.azure.com/).\n2. From the left sidebar, go to **Microsoft Enfra ID**.\n3. Under **Manage**, click on **App registrations**.\n4. Click the **New registration** button.\n5. Enter a **Name** for your app.\n6. For **Supported account types**, choose:\n - **Accounts in any organizational directory (Any Microsoft Entra ID tenant - Multitenant) and personal Microsoft accounts**\n - Or select based on your requirement.\n7. In **Redirect URI**, select **Web** and add the given URL.\n8. Click **Register**.\n9. After registration, youll be redirected to the apps overview page. Copy the **Application (client) ID**.\n10. From the left menu, go to **Certificates & secrets**.\n - Under **Client secrets**, click **New client secret**.\n - Provide a description, set an expiry, and click **Add**.\n - Copy the **Value** of the client secret (this will not be shown again).\n11. Go to **API permissions** from the left menu.\n - Click **Add a permission**.\n - Select **Microsoft Graph** → **Delegated permissions**.\n - Add the following scopes:\n - User.Read\n - Tasks.ReadWrite\n - offline_access\n - Click **Add permissions**.\n12. Copy your **Client ID** and **Client Secret**.\n",
"Create Task": "Crear tarea",
"Create Task List": "Crear lista de tareas",
"Update Task": "Actualizar tarea",
"Update Task List": "Actualizar lista de tareas",
"Complete Task": "Complete Task",
"Delete Task": "Eliminar tarea",
"Add an Attachment": "Añadir un archivo adjunto",
"Get Task": "Obtener tarea",
"Find Task List": "Buscar lista de tareas",
"Find Task": "Buscar tarea",
"Custom API Call": "Llamada API personalizada",
"Creates a new task.": "Crea una nueva tarea.",
"Create a new task list.": "Crear una nueva lista de tareas.",
"Update an existing task.": "Actualizar una tarea existente.",
"Updates an existing task list.": "Actualiza una lista de tareas existente.",
"Marks a task as completed.": "Marca una tarea como completada.",
"Deletes an existing task.": "Elimina una tarea existente.",
"Adds an attachment to a task.": "Añade un archivo adjunto a una tarea.",
"Gets the details of a specific task.": "Obtiene los detalles de una tarea específica.",
"Finds a task list by its name.": "Encuentra una lista de tareas por su nombre.",
"Finds tasks by title.": "Encuentra tareas por título.",
"Make a custom API call to a specific endpoint": "Hacer una llamada API personalizada a un extremo específico",
"Task List": "Lista de tareas",
"Title": "Título",
"Body Content": "Contenido del cuerpo",
"Importance": "Importancia",
"Status": "Estado",
"Due Date": "Fecha de fin",
"Reminder Date": "Fecha de recordatorio",
"Start Date": "Fecha de inicio",
"Categories": "Categorías",
"Task": "Tarea",
"New Name": "Nuevo nombre",
"File": "Archivo",
"Attachment Name (Optional)": "Nombre adjunto (opcional)",
"Match Type": "Tipo de partida",
"Task Title": "Título de la tarea",
"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)",
"The task list to create the task in.": "La lista de tareas en la que crear la tarea.",
"The title of the task.": "El título de la tarea.",
"The body or notes for the task.": "El cuerpo o las notas para la tarea.",
"The importance of the task.": "La importancia de la tarea.",
"The status of the task.": "El estado de la tarea.",
"The date and time the task is scheduled to start.": "La fecha y hora que la tarea está programada para comenzar.",
"Comma-separated categories for the task (e.g., Work, Personal).": "Categorías separadas por comas para la tarea (por ejemplo, Trabajo, Personal).",
"The name for the new task list.": "El nombre para la nueva lista de tareas.",
"The task list containing the task to update.": "La lista de tareas que contiene la tarea a actualizar.",
"The task to update.": "La tarea a actualizar.",
"The task list to update.": "La lista de tareas a actualizar.",
"The new name for the task list.": "El nuevo nombre para la lista de tareas.",
"The task list containing the task you want to complete.": "La lista de tareas que contiene la tarea que desea completar.",
"The specific task to mark as complete.": "La tarea específica a marcar como completa.",
"The list containing the task you want to delete.": "La lista que contiene la tarea que desea eliminar.",
"The specific task to delete.": "La tarea específica a eliminar.",
"The task list that contains the task.": "La lista de tareas que contiene la tarea.",
"The task to which you are adding the attachment.": "La tarea a la que está añadiendo el archivo adjunto.",
"The file to attach (up to 25 MB supported).": "El archivo a adjuntar (hasta 25 MB soportados).",
"The name to display for the attachment. If left blank, the original filename will be used.": "El nombre a mostrar para el adjunto. Si se deja en blanco, se utilizará el nombre del archivo original.",
"The list containing the task you want to retrieve.": "La lista que contiene la tarea que desea recuperar.",
"The specific task to retrieve.": "La tarea específica a recuperar.",
"The name (or partial name) of the task list to find.": "El nombre (o nombre parcial) de la lista de tareas a encontrar.",
"How to match the list name.": "Cómo coincidir con el nombre de la lista.",
"Select a specific task list to search within.": "Seleccione una lista de tareas específica para buscar en el interior.",
"The title (or partial title) of the task to find.": "El título (o título parcial) de la tarea a encontrar.",
"How to match the task title.": "Cómo coincidir con el título de la tarea.",
"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.",
"Low": "Baja",
"Normal": "Normal",
"High": "Alta",
"Not Started": "No iniciado",
"In Progress": "En curso",
"Completed": "Completado",
"Waiting On Others": "Esperando a otros",
"Deferred": "Aplazado",
"Contains": "Contiene",
"Starts With": "Comienza por",
"Exact Match": "Partida exacta",
"GET": "RECOGER",
"POST": "POST",
"PATCH": "PATCH",
"PUT": "PUT",
"DELETE": "BORRAR",
"HEAD": "LIMPIO",
"New Task": "Nueva tarea",
"New or Updated Task": "Tarea Nueva o Actualizada",
"New List": "Nueva lista",
"Task Completed": "Tarea completada",
"Triggers when a new task is created.": "Se activa cuando se crea una nueva tarea.",
"Triggers when a new task is created or an existing task is updated.": "Se activa cuando se crea una nueva tarea o se actualiza una tarea existente.",
"Triggers when a new task list is created.": "Dispara cuando se crea una nueva lista de tareas.",
"Triggers when a task is completed in a specific list.": "Se activa cuando una tarea se completa en una lista específica.",
"The list to watch for completed tasks.": "La lista a ver para las tareas completadas."
}

View File

@@ -0,0 +1,103 @@
{
"Cloud based task management application.": "Application de gestion des tâches basée sur le Cloud.",
"\n1. Sign in to [Microsoft Azure Portal](https://portal.azure.com/).\n2. From the left sidebar, go to **Microsoft Enfra ID**.\n3. Under **Manage**, click on **App registrations**.\n4. Click the **New registration** button.\n5. Enter a **Name** for your app.\n6. For **Supported account types**, choose:\n - **Accounts in any organizational directory (Any Microsoft Entra ID tenant - Multitenant) and personal Microsoft accounts**\n - Or select based on your requirement.\n7. In **Redirect URI**, select **Web** and ad": "\n1. Sign in to [Microsoft Azure Portal](https://portal.azure.com/).\n2. From the left sidebar, go to **Microsoft Enfra ID**.\n3. Under **Manage**, click on **App registrations**.\n4. Click the **New registration** button.\n5. Enter a **Name** for your app.\n6. For **Supported account types**, choose:\n - **Accounts in any organizational directory (Any Microsoft Entra ID tenant - Multitenant) and personal Microsoft accounts**\n - Or select based on your requirement.\n7. In **Redirect URI**, select **Web** and add the given URL.\n8. Click **Register**.\n9. After registration, youll be redirected to the apps overview page. Copy the **Application (client) ID**.\n10. From the left menu, go to **Certificates & secrets**.\n - Under **Client secrets**, click **New client secret**.\n - Provide a description, set an expiry, and click **Add**.\n - Copy the **Value** of the client secret (this will not be shown again).\n11. Go to **API permissions** from the left menu.\n - Click **Add a permission**.\n - Select **Microsoft Graph** → **Delegated permissions**.\n - Add the following scopes:\n - User.Read\n - Tasks.ReadWrite\n - offline_access\n - Click **Add permissions**.\n12. Copy your **Client ID** and **Client Secret**.\n",
"Create Task": "Créer une tâche",
"Create Task List": "Créer une liste de tâches",
"Update Task": "Tâche de mise à jour",
"Update Task List": "Mettre à jour la liste des tâches",
"Complete Task": "Complete Task",
"Delete Task": "Supprimer la tâche",
"Add an Attachment": "Ajouter une pièce jointe",
"Get Task": "Obtenir une tâche",
"Find Task List": "Trouver la liste des tâches",
"Find Task": "Trouver une tâche",
"Custom API Call": "Appel API personnalisé",
"Creates a new task.": "Crée une nouvelle tâche.",
"Create a new task list.": "Créer une nouvelle liste de tâches.",
"Update an existing task.": "Mettre à jour une tâche existante.",
"Updates an existing task list.": "Met à jour une liste de tâches existante.",
"Marks a task as completed.": "Marque une tâche comme terminée.",
"Deletes an existing task.": "Supprime une tâche existante.",
"Adds an attachment to a task.": "Ajoute une pièce jointe à une tâche.",
"Gets the details of a specific task.": "Renvoie les détails d'une tâche spécifique.",
"Finds a task list by its name.": "Trouve une liste de tâches par son nom.",
"Finds tasks by title.": "Trouve des tâches par titre.",
"Make a custom API call to a specific endpoint": "Passez un appel API personnalisé à un point de terminaison spécifique",
"Task List": "Liste des Tâches",
"Title": "Titre de la page",
"Body Content": "Contenu du corps",
"Importance": "Importance",
"Status": "Statut",
"Due Date": "Date de fin",
"Reminder Date": "Date de rappel",
"Start Date": "Date de début",
"Categories": "Catégories",
"Task": "Tâche",
"New Name": "Nouveau nom",
"File": "Ficher",
"Attachment Name (Optional)": "Nom de la pièce jointe (facultatif)",
"Match Type": "Type de correspondance",
"Task Title": "Titre de la tâche",
"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)",
"The task list to create the task in.": "La liste de tâches dans laquelle créer la tâche.",
"The title of the task.": "Le titre de la tâche.",
"The body or notes for the task.": "Le corps ou les notes pour la tâche.",
"The importance of the task.": "L'importance de la tâche.",
"The status of the task.": "Le statut de la tâche.",
"The date and time the task is scheduled to start.": "La date et l'heure de démarrage de la tâche.",
"Comma-separated categories for the task (e.g., Work, Personal).": "Catégories séparées par des virgules pour la tâche (ex: travail, personnel).",
"The name for the new task list.": "Le nom de la nouvelle liste de tâches.",
"The task list containing the task to update.": "La liste des tâches contenant la tâche à mettre à jour.",
"The task to update.": "La tâche à mettre à jour.",
"The task list to update.": "La liste des tâches à mettre à jour.",
"The new name for the task list.": "Le nouveau nom de la liste des tâches.",
"The task list containing the task you want to complete.": "La liste des tâches contenant la tâche que vous voulez accomplir.",
"The specific task to mark as complete.": "La tâche spécifique à marquer comme terminée.",
"The list containing the task you want to delete.": "La liste contenant la tâche que vous voulez supprimer.",
"The specific task to delete.": "La tâche spécifique à supprimer.",
"The task list that contains the task.": "La liste des tâches qui contient la tâche.",
"The task to which you are adding the attachment.": "La tâche à laquelle vous ajoutez la pièce jointe.",
"The file to attach (up to 25 MB supported).": "Le fichier à joindre (jusqu'à 25 Mo pris en charge).",
"The name to display for the attachment. If left blank, the original filename will be used.": "Le nom à afficher pour la pièce jointe. Si laissé vide, le nom du fichier original sera utilisé.",
"The list containing the task you want to retrieve.": "La liste contenant la tâche que vous voulez récupérer.",
"The specific task to retrieve.": "La tâche spécifique à récupérer.",
"The name (or partial name) of the task list to find.": "Le nom (ou nom partiel) de la liste de tâches à trouver.",
"How to match the list name.": "Comment faire correspondre le nom de la liste.",
"Select a specific task list to search within.": "Sélectionnez une liste de tâches spécifique à rechercher.",
"The title (or partial title) of the task to find.": "Le titre (ou titre partiel) de la tâche à trouver.",
"How to match the task title.": "Comment faire correspondre le titre de la tâche.",
"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.",
"Low": "Bas",
"Normal": "Normale",
"High": "Élevé",
"Not Started": "Non démarré",
"In Progress": "En cours",
"Completed": "Terminé",
"Waiting On Others": "En attente d'autres",
"Deferred": "Retardé",
"Contains": "Contient",
"Starts With": "Commence avec",
"Exact Match": "Correspondance exacte",
"GET": "OBTENIR",
"POST": "POSTER",
"PATCH": "PATCH",
"PUT": "EFFACER",
"DELETE": "SUPPRIMER",
"HEAD": "TÊTE",
"New Task": "Nouvelle tâche",
"New or Updated Task": "Nouvelle tâche ou mise à jour",
"New List": "Nouvelle liste",
"Task Completed": "Tâche terminée",
"Triggers when a new task is created.": "Déclenche quand une nouvelle tâche est créée.",
"Triggers when a new task is created or an existing task is updated.": "Déclenche lorsqu'une nouvelle tâche est créée ou qu'une tâche existante est mise à jour.",
"Triggers when a new task list is created.": "Déclenche quand une nouvelle liste de tâches est créée.",
"Triggers when a task is completed in a specific list.": "Déclenche lorsqu'une tâche est terminée dans une liste spécifique.",
"The list to watch for completed tasks.": "La liste à surveiller pour les tâches terminées."
}

View File

@@ -0,0 +1,103 @@
{
"Cloud based task management application.": "クラウドベースのタスク管理アプリケーション。",
"\n1. Sign in to [Microsoft Azure Portal](https://portal.azure.com/).\n2. From the left sidebar, go to **Microsoft Enfra ID**.\n3. Under **Manage**, click on **App registrations**.\n4. Click the **New registration** button.\n5. Enter a **Name** for your app.\n6. For **Supported account types**, choose:\n - **Accounts in any organizational directory (Any Microsoft Entra ID tenant - Multitenant) and personal Microsoft accounts**\n - Or select based on your requirement.\n7. In **Redirect URI**, select **Web** and ad": "\n1. Sign in to [Microsoft Azure Portal](https://portal.azure.com/).\n2. From the left sidebar, go to **Microsoft Enfra ID**.\n3. Under **Manage**, click on **App registrations**.\n4. Click the **New registration** button.\n5. Enter a **Name** for your app.\n6. For **Supported account types**, choose:\n - **Accounts in any organizational directory (Any Microsoft Entra ID tenant - Multitenant) and personal Microsoft accounts**\n - Or select based on your requirement.\n7. In **Redirect URI**, select **Web** and add the given URL.\n8. Click **Register**.\n9. After registration, youll be redirected to the apps overview page. Copy the **Application (client) ID**.\n10. From the left menu, go to **Certificates & secrets**.\n - Under **Client secrets**, click **New client secret**.\n - Provide a description, set an expiry, and click **Add**.\n - Copy the **Value** of the client secret (this will not be shown again).\n11. Go to **API permissions** from the left menu.\n - Click **Add a permission**.\n - Select **Microsoft Graph** → **Delegated permissions**.\n - Add the following scopes:\n - User.Read\n - Tasks.ReadWrite\n - offline_access\n - Click **Add permissions**.\n12. Copy your **Client ID** and **Client Secret**.\n",
"Create Task": "タスクを作成",
"Create Task List": "タスクリストを作成",
"Update Task": "タスクの更新",
"Update Task List": "タスクリストの更新",
"Complete Task": "Complete Task",
"Delete Task": "タスクの削除",
"Add an Attachment": "添付ファイルを追加",
"Get Task": "タスクを取得",
"Find Task List": "タスクリストを検索",
"Find Task": "タスクを検索",
"Custom API Call": "カスタムAPI通話",
"Creates a new task.": "新しいタスクを作成します。",
"Create a new task list.": "新しいタスクリストを作成します。",
"Update an existing task.": "既存のタスクを更新する。",
"Updates an existing task list.": "既存のタスクリストを更新する。",
"Marks a task as completed.": "タスクを完了としてマークします。",
"Deletes an existing task.": "既存のタスクを削除します。",
"Adds an attachment to a task.": "タスクに添付ファイルを追加します。",
"Gets the details of a specific task.": "特定のタスクの詳細を取得します。",
"Finds a task list by its name.": "タスクリストをその名前で検索します。",
"Finds tasks by title.": "タスクをタイトルで検索します。",
"Make a custom API call to a specific endpoint": "特定のエンドポイントへのカスタム API コールを実行します。",
"Task List": "タスクリスト",
"Title": "タイトル",
"Body Content": "本文コンテンツ",
"Importance": "重要度",
"Status": "ステータス",
"Due Date": "締切日",
"Reminder Date": "リマインダー日付",
"Start Date": "開始日",
"Categories": "カテゴリ",
"Task": "タスク",
"New Name": "新しい名前",
"File": "ファイル",
"Attachment Name (Optional)": "添付ファイル名(オプション)",
"Match Type": "一致するタイプ",
"Task Title": "タスクタイトル",
"Method": "方法",
"Headers": "ヘッダー",
"Query Parameters": "クエリパラメータ",
"Body": "本文",
"Response is Binary ?": "応答はバイナリですか?",
"No Error on Failure": "失敗時にエラーはありません",
"Timeout (in seconds)": "タイムアウト(秒)",
"The task list to create the task in.": "タスクを作成するタスクリスト。",
"The title of the task.": "タスクのタイトル",
"The body or notes for the task.": "タスクの本文またはメモ。",
"The importance of the task.": "タスクの重要性。",
"The status of the task.": "タスクの状態",
"The date and time the task is scheduled to start.": "タスクの開始日時。",
"Comma-separated categories for the task (e.g., Work, Personal).": "タスクのカンマ区切りのカテゴリ (作業、個人用など)",
"The name for the new task list.": "新しいタスクリストの名前",
"The task list containing the task to update.": "更新するタスクを含むタスクリスト。",
"The task to update.": "更新するタスク",
"The task list to update.": "更新するタスクリスト。",
"The new name for the task list.": "タスクリストの新しい名前",
"The task list containing the task you want to complete.": "完了したいタスクを含むタスクリスト。",
"The specific task to mark as complete.": "完了としてマークする特定のタスク。",
"The list containing the task you want to delete.": "削除したいタスクを含むリストです。",
"The specific task to delete.": "削除する特定のタスク。",
"The task list that contains the task.": "タスクを含むタスクリスト。",
"The task to which you are adding the attachment.": "添付ファイルを追加するタスク",
"The file to attach (up to 25 MB supported).": "添付するファイル最大25 MB。",
"The name to display for the attachment. If left blank, the original filename will be used.": "添付ファイルに表示する名前。空白の場合は元のファイル名が使用されます。",
"The list containing the task you want to retrieve.": "取得したいタスクを含むリスト。",
"The specific task to retrieve.": "取得する特定のタスク。",
"The name (or partial name) of the task list to find.": "検索するタスクリストの名前 (または部分的な名前)。",
"How to match the list name.": "リスト名を一致させる方法。",
"Select a specific task list to search within.": "検索する特定のタスクリストを選択します。",
"The title (or partial title) of the task to find.": "検索するタスクのタイトル (または部分的なタイトル) 。",
"How to match the task title.": "タスクのタイトルを一致させる方法。",
"Authorization headers are injected automatically from your connection.": "認証ヘッダは接続から自動的に注入されます。",
"Enable for files like PDFs, images, etc..": "PDF、画像などのファイルを有効にします。",
"Low": "低い",
"Normal": "標準",
"High": "高い",
"Not Started": "未開始",
"In Progress": "進行中",
"Completed": "完了",
"Waiting On Others": "他のユーザーを待っています",
"Deferred": "遅延しました",
"Contains": "以下を含む",
"Starts With": "で始まる",
"Exact Match": "完全一致",
"GET": "取得",
"POST": "POST",
"PATCH": "PATCH",
"PUT": "PUT",
"DELETE": "削除",
"HEAD": "頭",
"New Task": "新しいタスク",
"New or Updated Task": "新規または更新されたタスク",
"New List": "新規リスト",
"Task Completed": "タスクが完了しました",
"Triggers when a new task is created.": "新しいタスクが作成されたときにトリガーされます。",
"Triggers when a new task is created or an existing task is updated.": "新規タスクが作成された場合、または既存のタスクが更新されたときにトリガーされます。",
"Triggers when a new task list is created.": "新しいタスクリストが作成されたときにトリガーします。",
"Triggers when a task is completed in a specific list.": "タスクが特定のリストで完了したときにトリガーします。",
"The list to watch for completed tasks.": "完了したタスクを監視するリスト。"
}

View File

@@ -0,0 +1,103 @@
{
"Cloud based task management application.": "Cloud gebaseerde taak beheer toepassing.",
"\n1. Sign in to [Microsoft Azure Portal](https://portal.azure.com/).\n2. From the left sidebar, go to **Microsoft Enfra ID**.\n3. Under **Manage**, click on **App registrations**.\n4. Click the **New registration** button.\n5. Enter a **Name** for your app.\n6. For **Supported account types**, choose:\n - **Accounts in any organizational directory (Any Microsoft Entra ID tenant - Multitenant) and personal Microsoft accounts**\n - Or select based on your requirement.\n7. In **Redirect URI**, select **Web** and ad": "\n1. Log in bij [Microsoft Azure Portal](https://portal.azure.com/).\n. Ga naar **Microsoft Enfra ID**.\n3. Onder **Beheren**, klik op **App registraties**.\n4. Klik op de **Nieuwe registratie** knop.\n5. Voer een **Naam** in voor uw app.\n6. Voor **Ondersteunde accounttypen**, kies keuze:\n - **Accounts in elke map van de organisatie (Any Microsoft Entra ID-tenant - Multitenant) en persoonlijke Microsoft accounts**\n - Of selecteer gebaseerd op uw vereiste.\n7. In **Redirect URI**, selecteer **Web** en voeg de opgegeven URL toe.\n8. Klik **Register**.\n9. Na registratie wordt u doorverwezen naar de overzichtspagina. Kopieer de **Applicatie (client) ID**.\n10. Vanuit het linkermenu ga naar **Certificaten & geheimen**.\n - Onder **Client secrets**, klik op **Nieuwe client geheim**.\n - Geef een beschrijving, verloop, en klik **Toevoegen**.\n - Kopieer de **waarde** van de client secret (dit zal niet meer worden weergegeven).\n11. Ga naar **API permissies** in het linkermenu.\n - Klik **Een machtiging toevoegen**.\n - Selecteer **Microsoft Graph** → **Toegewezen machtigingen**.\n - Voeg de volgende toepassingsgebieden toe:\n - gebruiker. ead\n - Taken. eadWrite \n - offline_access\n - Klik **Permissies toevoegen**.\n12. Kopieer de **Client ID** en **Client Secret**.\n",
"Create Task": "Taak maken",
"Create Task List": "Takenlijst maken",
"Update Task": "Taak bijwerken",
"Update Task List": "Takenlijst bijwerken",
"Complete Task": "Complete Task",
"Delete Task": "Taak verwijderen",
"Add an Attachment": "Een bijlage toevoegen",
"Get Task": "Ophalen taak",
"Find Task List": "Takenlijst zoeken",
"Find Task": "Zoek Taak",
"Custom API Call": "Custom API Call",
"Creates a new task.": "Maakt een nieuwe taak aan.",
"Create a new task list.": "Maak een nieuwe takenlijst aan.",
"Update an existing task.": "Een bestaande taak bijwerken.",
"Updates an existing task list.": "Werkt een bestaande takenlijst bij.",
"Marks a task as completed.": "Markeert een taak als voltooid.",
"Deletes an existing task.": "Verwijdert een bestaande taak.",
"Adds an attachment to a task.": "Voegt een bijlage toe aan een taak.",
"Gets the details of a specific task.": "Geeft de details van een specifieke taak.",
"Finds a task list by its name.": "Vindt een takenlijst volgens de naam.",
"Finds tasks by title.": "Vindt taken op titel.",
"Make a custom API call to a specific endpoint": "Maak een aangepaste API call naar een specifiek eindpunt",
"Task List": "Taak lijst",
"Title": "Aanspreektitel",
"Body Content": "Inhoud artikeltekst",
"Importance": "Belangrijkheid",
"Status": "status",
"Due Date": "Inleverdatum",
"Reminder Date": "Datum van herinnering",
"Start Date": "Start datum",
"Categories": "Categoriechar@@0n",
"Task": "Opdracht",
"New Name": "Nieuwe naam",
"File": "Bestand",
"Attachment Name (Optional)": "Bijlage naam (optioneel)",
"Match Type": "Wedstrijd Type",
"Task Title": "Taak titel",
"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)",
"The task list to create the task in.": "De takenlijst waarin de taak moet worden aangemaakt.",
"The title of the task.": "De titel van de taak.",
"The body or notes for the task.": "Het lichaam of notities van de taak.",
"The importance of the task.": "Het belang van deze taak.",
"The status of the task.": "De status van de taak.",
"The date and time the task is scheduled to start.": "De datum en tijd waarop de taak gepland is om te starten.",
"Comma-separated categories for the task (e.g., Work, Personal).": "Kommagescheiden categorieën voor de taak (bijv. Werk, Persoonlijk).",
"The name for the new task list.": "De naam van de nieuwe takenlijst.",
"The task list containing the task to update.": "De takenlijst met de bij te werken taak",
"The task to update.": "De taak om bij te werken.",
"The task list to update.": "De te updaten takenlijst",
"The new name for the task list.": "De nieuwe naam van de takenlijst.",
"The task list containing the task you want to complete.": "De takenlijst met de taak die u wilt voltooien.",
"The specific task to mark as complete.": "De specifieke taak om te markeren als voltooid.",
"The list containing the task you want to delete.": "De lijst met de taak die u wilt verwijderen.",
"The specific task to delete.": "De specifieke taak om te verwijderen.",
"The task list that contains the task.": "De takenlijst die de taak bevat.",
"The task to which you are adding the attachment.": "De taak waaraan je de bijlage toevoegt.",
"The file to attach (up to 25 MB supported).": "Het toe te voegen bestand (tot 25 MB ondersteund).",
"The name to display for the attachment. If left blank, the original filename will be used.": "De weer te geven naam voor de bijlage. Indien leeg wordt de oorspronkelijke bestandsnaam gebruikt.",
"The list containing the task you want to retrieve.": "De lijst met de taak die u wilt ophalen.",
"The specific task to retrieve.": "De specifieke taak om op te halen.",
"The name (or partial name) of the task list to find.": "De naam (of gedeeltelijke naam) van de takenlijst om te vinden.",
"How to match the list name.": "Hoe de naam van de lijst te overeenkomen.",
"Select a specific task list to search within.": "Selecteer een specifieke takenlijst om in te zoeken.",
"The title (or partial title) of the task to find.": "De titel (of gedeeltelijke titel) van de taak om te vinden.",
"How to match the task title.": "Hoe de titel van de taak te vergelijken.",
"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..",
"Low": "laag",
"Normal": "normaal",
"High": "hoog",
"Not Started": "Niet begonnen",
"In Progress": "In uitvoering",
"Completed": "Voltooid",
"Waiting On Others": "Wachten op anderen",
"Deferred": "Uitgesteld",
"Contains": "Bevat",
"Starts With": "Begint met",
"Exact Match": "Exacte overeenkomst",
"GET": "KRIJG",
"POST": "POSTE",
"PATCH": "BEKIJK",
"PUT": "PUT",
"DELETE": "VERWIJDEREN",
"HEAD": "HOOFD",
"New Task": "Nieuwe taak",
"New or Updated Task": "Nieuwe of bijgewerkte taak",
"New List": "Nieuwe lijst",
"Task Completed": "Taak voltooid",
"Triggers when a new task is created.": "Triggert wanneer een nieuwe taak is aangemaakt.",
"Triggers when a new task is created or an existing task is updated.": "Triggert wanneer een nieuwe taak is aangemaakt of een bestaande taak is bijgewerkt.",
"Triggers when a new task list is created.": "Triggert wanneer een nieuwe takenlijst is aangemaakt.",
"Triggers when a task is completed in a specific list.": "Activeert wanneer een taak is voltooid in een specifieke lijst.",
"The list to watch for completed tasks.": "De lijst om te kijken voor voltooide taken."
}

View File

@@ -0,0 +1,103 @@
{
"Cloud based task management application.": "Gerenciamento de tarefas baseado em nuvem.",
"\n1. Sign in to [Microsoft Azure Portal](https://portal.azure.com/).\n2. From the left sidebar, go to **Microsoft Enfra ID**.\n3. Under **Manage**, click on **App registrations**.\n4. Click the **New registration** button.\n5. Enter a **Name** for your app.\n6. For **Supported account types**, choose:\n - **Accounts in any organizational directory (Any Microsoft Entra ID tenant - Multitenant) and personal Microsoft accounts**\n - Or select based on your requirement.\n7. In **Redirect URI**, select **Web** and ad": "\n1. Entre no [Microsoft Azure Portal](https://portal.azure.com/).\n. Na barra lateral esquerda, vá até **Microsoft Enfra ID**.\n3. Sob **Gerenciar**, clique em **Aplicativos registrados**.\n4. Clique no botão **Novo registro**.\n5. Digite um **Nome** para o seu aplicativo.\n6. Para **Tipos de conta suportados**, escolha:\n - **Contas em qualquer diretório organizacional (qualquer inquilino de ID da Microsoft Entra - Multitenant) e contas pessoais da Microsoft**\n - Ou selecione com base nos seus requisitos.\n7. Em **URI de redirecionamento**, selecione **Web** e adicione a URL fornecida.\n8. Clique em **Registrar**.\n9. Após o registro, você será redirecionado para a página de visão geral do aplicativo. Copie o **ID do aplicativo (cliente) **.\n10. No menu da esquerda, vá para **Certificados e segredos**.\n - Em **Segredos do cliente**, clique em **Novo segredo do cliente**.\n - Fornece uma descrição, define um vencimento e clique em **Adicionar**.\n - Copiar o **Valor** do segredo do cliente (isso não será exibido novamente).\n11. Vá para **permissões de API** no menu à esquerda.\n - Clique em **Adicionar uma permissão**.\n - Selecione **Microsoft Graph** → **Delegated permissions**.\n - Adicione os seguintes escopos:\n - Usuário. assim\n - Tarefas. eadWrite \n - offline_access\n - Clique em **Adicionar permissões**.\n12. Copie seu **ID do Cliente** e **Segredo do Cliente**.\n",
"Create Task": "Criar tarefa",
"Create Task List": "Criar Lista de Tarefas",
"Update Task": "Atualizar Tarefa",
"Update Task List": "Atualizar Lista de Tarefas",
"Complete Task": "Complete Task",
"Delete Task": "Excluir Tarefa",
"Add an Attachment": "Adicionar um anexo",
"Get Task": "Obter Tarefa",
"Find Task List": "Procurar Lista de Tarefas",
"Find Task": "Procurar Tarefa",
"Custom API Call": "Chamada de API personalizada",
"Creates a new task.": "Cria uma nova tarefa.",
"Create a new task list.": "Criar uma nova lista de tarefas.",
"Update an existing task.": "Atualizar uma tarefa existente.",
"Updates an existing task list.": "Atualiza uma lista de tarefas existente.",
"Marks a task as completed.": "Marca uma tarefa como concluída.",
"Deletes an existing task.": "Exclui uma tarefa existente.",
"Adds an attachment to a task.": "Adiciona um anexo a uma tarefa.",
"Gets the details of a specific task.": "Obtém os detalhes de uma tarefa específica.",
"Finds a task list by its name.": "Localiza uma lista de tarefas pelo nome dela.",
"Finds tasks by title.": "Localiza tarefas por título.",
"Make a custom API call to a specific endpoint": "Faça uma chamada de API personalizada para um ponto de extremidade específico",
"Task List": "Lista de tarefas",
"Title": "Título",
"Body Content": "Conteúdo do corpo",
"Importance": "Importância",
"Status": "Estado",
"Due Date": "Data de vencimento",
"Reminder Date": "Data do lembrete",
"Start Date": "Data Inicial",
"Categories": "categorias",
"Task": "Tarefas",
"New Name": "Novo Nome",
"File": "Arquivo",
"Attachment Name (Optional)": "Nome de anexo (opcional)",
"Match Type": "Tipo de correspondência",
"Task Title": "Título da tarefa",
"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)",
"The task list to create the task in.": "Lista de tarefas para criar a tarefa",
"The title of the task.": "O título da tarefa.",
"The body or notes for the task.": "O órgão ou anotações para a tarefa.",
"The importance of the task.": "A importância da tarefa.",
"The status of the task.": "O estado da tarefa.",
"The date and time the task is scheduled to start.": "A data e a hora de início da tarefa",
"Comma-separated categories for the task (e.g., Work, Personal).": "Categorias separadas por vírgulas para a tarefa (por exemplo, Trabalho, Pessoal).",
"The name for the new task list.": "O nome para a nova lista de tarefas.",
"The task list containing the task to update.": "A lista de tarefas que contém a tarefa a atualizar.",
"The task to update.": "A tarefa a atualizar.",
"The task list to update.": "A lista de tarefas para atualizar.",
"The new name for the task list.": "O novo nome para a lista de tarefas.",
"The task list containing the task you want to complete.": "A lista de tarefas que você deseja concluir.",
"The specific task to mark as complete.": "A tarefa específica a marcar como concluída.",
"The list containing the task you want to delete.": "A lista que contém a tarefa que você deseja excluir.",
"The specific task to delete.": "A tarefa específica para excluir.",
"The task list that contains the task.": "A lista de tarefas que contém a tarefa.",
"The task to which you are adding the attachment.": "A tarefa à qual você está adicionando o anexo.",
"The file to attach (up to 25 MB supported).": "O arquivo a ser anexado (até 25 MB suportado).",
"The name to display for the attachment. If left blank, the original filename will be used.": "O nome a ser exibido para o anexo. Se deixado em branco, será usado o nome de arquivo original.",
"The list containing the task you want to retrieve.": "A lista que contém a tarefa que você deseja recuperar.",
"The specific task to retrieve.": "A tarefa específica a ser recuperada.",
"The name (or partial name) of the task list to find.": "O nome (ou nome parcial) da lista de tarefas para encontrar.",
"How to match the list name.": "Como corresponder ao nome da lista.",
"Select a specific task list to search within.": "Selecione uma lista de tarefas específica para pesquisar dentro de casa.",
"The title (or partial title) of the task to find.": "O título (ou título parcial) da tarefa a ser encontrada.",
"How to match the task title.": "Como combinar o título da tarefa.",
"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..",
"Low": "baixa",
"Normal": "normal",
"High": "alta",
"Not Started": "Não Iniciado",
"In Progress": "Em Execução",
"Completed": "Concluído",
"Waiting On Others": "Esperando em outros",
"Deferred": "Adiado",
"Contains": "contém",
"Starts With": "Começa com",
"Exact Match": "Partida exata",
"GET": "OBTER",
"POST": "POSTAR",
"PATCH": "COMPRAR",
"PUT": "COLOCAR",
"DELETE": "EXCLUIR",
"HEAD": "CABEÇA",
"New Task": "Nova tarefa",
"New or Updated Task": "Tarefa nova ou atualizada",
"New List": "Nova Lista",
"Task Completed": "Tarefa concluída",
"Triggers when a new task is created.": "Dispara quando uma nova tarefa é criada.",
"Triggers when a new task is created or an existing task is updated.": "Dispara quando uma nova tarefa é criada ou uma tarefa existente é atualizada.",
"Triggers when a new task list is created.": "Dispara quando uma nova lista de tarefas é criada.",
"Triggers when a task is completed in a specific list.": "Aciona quando uma tarefa é concluída em uma lista específica.",
"The list to watch for completed tasks.": "A lista para visualizar as tarefas concluídas."
}

View File

@@ -0,0 +1,72 @@
{
"Microsoft To Do": "Microsoft To Do",
"Cloud based task management application.": "Облачное приложение для управления задачами.",
"Authenticate with your Microsoft Account. You will need to register an application in the Microsoft Entra admin center.Add **Tasks.ReadWrite**,**User.Read**, **offline_access** scopes.": "Авторизуйтесь с учетной записью Майкрософт. Вам нужно зарегистрировать приложение в области администрирования Microsoft Entra. Добавить **Tasks.ReadWrite**,**User.Read**, **offline_access** .",
"Create Task": "Создать задачу",
"Create Task List": "Создать список задач",
"Update Task": "Обновить задачу",
"Find Task List": "Найти список задач",
"Find Task": "Найти задачу",
"Custom API Call": "Пользовательский вызов API",
"Creates a new task.": "Создает новую задачу.",
"Create a new task list.": "Создать новый список задач.",
"Update an existing task.": "Обновить существующую задачу.",
"Finds a task list by its name.": "Находит список задач по его имени.",
"Finds tasks by title.": "Ищет задачи по названию.",
"Make a custom API call to a specific endpoint": "Сделать пользовательский API вызов к определенной конечной точке",
"Task List": "Список задач",
"Title": "Заголовок",
"Body Content": "Содержание тела",
"Importance": "Важность",
"Status": "Статус",
"Due Date": "Срок сдачи",
"Reminder Date": "Напоминание Дата",
"Start Date": "Дата начала",
"Categories": "Категории",
"Task": "Задача",
"Match Type": "Тип матча",
"Task Title": "Название задачи",
"Method": "Метод",
"Headers": "Заголовки",
"Query Parameters": "Параметры запроса",
"Body": "Тело",
"No Error on Failure": "Нет ошибок при ошибке",
"Timeout (in seconds)": "Таймаут (в секундах)",
"The task list to create the task in.": "Список задач для создания задачи.",
"The title of the task.": "Название задачи.",
"The body or notes for the task.": "Тело или примечания для задачи.",
"The importance of the task.": "Важность этой задачи.",
"The status of the task.": "Статус задачи.",
"The date and time the task is scheduled to start.": "Дата и время начала задачи.",
"Comma-separated categories for the task (e.g., Work, Personal).": "Категории, разделенные запятыми (например, Работа, Личная).",
"The name for the new task list.": "Имя для нового списка задач.",
"The task list containing the task to update.": "Список задач, содержащий задачу для обновления.",
"The task to update.": "Задача для обновления.",
"The name (or partial name) of the task list to find.": "Имя (или частичное имя) списка задач для поиска.",
"How to match the list name.": "Как найти имя списка.",
"Select a specific task list to search within.": "Выберите конкретный список задач для поиска.",
"The title (or partial title) of the task to find.": "Заголовок (или частичное название) задачи найти.",
"How to match the task title.": "Как соответствовать названию задачи.",
"Authorization headers are injected automatically from your connection.": "Заголовки авторизации включаются автоматически из вашего соединения.",
"Low": "Низкий",
"Normal": "Обычный",
"High": "Высокий",
"Not Started": "Не начато",
"In Progress": "В процессе",
"Completed": "Выполнено",
"Waiting On Others": "Ожидание на других",
"Deferred": "Отложено",
"Contains": "Содержит",
"Starts With": "Начинается с",
"Exact Match": "Точное совпадение",
"GET": "ПОЛУЧИТЬ",
"POST": "ПОСТ",
"PATCH": "ПАТЧ",
"PUT": "ПОКУПИТЬ",
"DELETE": "УДАЛИТЬ",
"HEAD": "HEAD",
"New Task": "Новая задача",
"New or Updated Task": "Новая или Обновленная задача",
"Triggers when a new task is created.": "Триггеры при создании новой задачи.",
"Triggers when a new task is created or an existing task is updated.": "Триггеры при создании новой задачи или обновлении существующей задачи."
}

View File

@@ -0,0 +1,103 @@
{
"Cloud based task management application.": "Cloud based task management application.",
"\n1. Sign in to [Microsoft Azure Portal](https://portal.azure.com/).\n2. From the left sidebar, go to **Microsoft Enfra ID**.\n3. Under **Manage**, click on **App registrations**.\n4. Click the **New registration** button.\n5. Enter a **Name** for your app.\n6. For **Supported account types**, choose:\n - **Accounts in any organizational directory (Any Microsoft Entra ID tenant - Multitenant) and personal Microsoft accounts**\n - Or select based on your requirement.\n7. In **Redirect URI**, select **Web** and ad": "\n1. Sign in to [Microsoft Azure Portal](https://portal.azure.com/).\n2. From the left sidebar, go to **Microsoft Enfra ID**.\n3. Under **Manage**, click on **App registrations**.\n4. Click the **New registration** button.\n5. Enter a **Name** for your app.\n6. For **Supported account types**, choose:\n - **Accounts in any organizational directory (Any Microsoft Entra ID tenant - Multitenant) and personal Microsoft accounts**\n - Or select based on your requirement.\n7. In **Redirect URI**, select **Web** and add the given URL.\n8. Click **Register**.\n9. After registration, youll be redirected to the apps overview page. Copy the **Application (client) ID**.\n10. From the left menu, go to **Certificates & secrets**.\n - Under **Client secrets**, click **New client secret**.\n - Provide a description, set an expiry, and click **Add**.\n - Copy the **Value** of the client secret (this will not be shown again).\n11. Go to **API permissions** from the left menu.\n - Click **Add a permission**.\n - Select **Microsoft Graph** → **Delegated permissions**.\n - Add the following scopes:\n - User.Read\n - Tasks.ReadWrite\n - offline_access\n - Click **Add permissions**.\n12. Copy your **Client ID** and **Client Secret**.\n",
"Create Task": "Create Task",
"Create Task List": "Create Task List",
"Update Task": "Update Task",
"Update Task List": "Update Task List",
"Complete Task": "Complete Task",
"Delete Task": "Delete Task",
"Add an Attachment": "Add an Attachment",
"Get Task": "Get Task",
"Find Task List": "Find Task List",
"Find Task": "Find Task",
"Custom API Call": "Custom API Call",
"Creates a new task.": "Creates a new task.",
"Create a new task list.": "Create a new task list.",
"Update an existing task.": "Update an existing task.",
"Updates an existing task list.": "Updates an existing task list.",
"Marks a task as completed.": "Marks a task as completed.",
"Deletes an existing task.": "Deletes an existing task.",
"Adds an attachment to a task.": "Adds an attachment to a task.",
"Gets the details of a specific task.": "Gets the details of a specific task.",
"Finds a task list by its name.": "Finds a task list by its name.",
"Finds tasks by title.": "Finds tasks by title.",
"Make a custom API call to a specific endpoint": "Make a custom API call to a specific endpoint",
"Task List": "Task List",
"Title": "Title",
"Body Content": "Body Content",
"Importance": "Importance",
"Status": "Status",
"Due Date": "Due Date",
"Reminder Date": "Reminder Date",
"Start Date": "Start Date",
"Categories": "Categories",
"Task": "Task",
"New Name": "New Name",
"File": "File",
"Attachment Name (Optional)": "Attachment Name (Optional)",
"Match Type": "Match Type",
"Task Title": "Task Title",
"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)",
"The task list to create the task in.": "The task list to create the task in.",
"The title of the task.": "The title of the task.",
"The body or notes for the task.": "The body or notes for the task.",
"The importance of the task.": "The importance of the task.",
"The status of the task.": "The status of the task.",
"The date and time the task is scheduled to start.": "The date and time the task is scheduled to start.",
"Comma-separated categories for the task (e.g., Work, Personal).": "Comma-separated categories for the task (e.g., Work, Personal).",
"The name for the new task list.": "The name for the new task list.",
"The task list containing the task to update.": "The task list containing the task to update.",
"The task to update.": "The task to update.",
"The task list to update.": "The task list to update.",
"The new name for the task list.": "The new name for the task list.",
"The task list containing the task you want to complete.": "The task list containing the task you want to complete.",
"The specific task to mark as complete.": "The specific task to mark as complete.",
"The list containing the task you want to delete.": "The list containing the task you want to delete.",
"The specific task to delete.": "The specific task to delete.",
"The task list that contains the task.": "The task list that contains the task.",
"The task to which you are adding the attachment.": "The task to which you are adding the attachment.",
"The file to attach (up to 25 MB supported).": "The file to attach (up to 25 MB supported).",
"The name to display for the attachment. If left blank, the original filename will be used.": "The name to display for the attachment. If left blank, the original filename will be used.",
"The list containing the task you want to retrieve.": "The list containing the task you want to retrieve.",
"The specific task to retrieve.": "The specific task to retrieve.",
"The name (or partial name) of the task list to find.": "The name (or partial name) of the task list to find.",
"How to match the list name.": "How to match the list name.",
"Select a specific task list to search within.": "Select a specific task list to search within.",
"The title (or partial title) of the task to find.": "The title (or partial title) of the task to find.",
"How to match the task title.": "How to match the task title.",
"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..",
"Low": "Low",
"Normal": "Normal",
"High": "High",
"Not Started": "Not Started",
"In Progress": "In Progress",
"Completed": "Completed",
"Waiting On Others": "Waiting On Others",
"Deferred": "Deferred",
"Contains": "Contains",
"Starts With": "Starts With",
"Exact Match": "Exact Match",
"GET": "GET",
"POST": "POST",
"PATCH": "PATCH",
"PUT": "PUT",
"DELETE": "DELETE",
"HEAD": "HEAD",
"New Task": "New Task",
"New or Updated Task": "New or Updated Task",
"New List": "New List",
"Task Completed": "Task Completed",
"Triggers when a new task is created.": "Triggers when a new task is created.",
"Triggers when a new task is created or an existing task is updated.": "Triggers when a new task is created or an existing task is updated.",
"Triggers when a new task list is created.": "Triggers when a new task list is created.",
"Triggers when a task is completed in a specific list.": "Triggers when a task is completed in a specific list.",
"The list to watch for completed tasks.": "The list to watch for completed tasks."
}

View File

@@ -0,0 +1,72 @@
{
"Microsoft To Do": "Microsoft To Do",
"Cloud based task management application.": "Cloud based task management application.",
"Authenticate with your Microsoft Account. You will need to register an application in the Microsoft Entra admin center.Add **Tasks.ReadWrite**,**User.Read**, **offline_access** scopes.": "Authenticate with your Microsoft Account. You will need to register an application in the Microsoft Entra admin center.Add **Tasks.ReadWrite**,**User.Read**, **offline_access** scopes.",
"Create Task": "Create Task",
"Create Task List": "Create Task List",
"Update Task": "Update Task",
"Find Task List": "Find Task List",
"Find Task": "Find Task",
"Custom API Call": "Custom API Call",
"Creates a new task.": "Creates a new task.",
"Create a new task list.": "Create a new task list.",
"Update an existing task.": "Update an existing task.",
"Finds a task list by its name.": "Finds a task list by its name.",
"Finds tasks by title.": "Finds tasks by title.",
"Make a custom API call to a specific endpoint": "Make a custom API call to a specific endpoint",
"Task List": "Task List",
"Title": "Title",
"Body Content": "Body Content",
"Importance": "Importance",
"Status": "Status",
"Due Date": "Due Date",
"Reminder Date": "Reminder Date",
"Start Date": "Start Date",
"Categories": "Categories",
"Task": "Task",
"Match Type": "Match Type",
"Task Title": "Task Title",
"Method": "Method",
"Headers": "Headers",
"Query Parameters": "Query Parameters",
"Body": "Body",
"No Error on Failure": "No Error on Failure",
"Timeout (in seconds)": "Timeout (in seconds)",
"The task list to create the task in.": "The task list to create the task in.",
"The title of the task.": "The title of the task.",
"The body or notes for the task.": "The body or notes for the task.",
"The importance of the task.": "The importance of the task.",
"The status of the task.": "The status of the task.",
"The date and time the task is scheduled to start.": "The date and time the task is scheduled to start.",
"Comma-separated categories for the task (e.g., Work, Personal).": "Comma-separated categories for the task (e.g., Work, Personal).",
"The name for the new task list.": "The name for the new task list.",
"The task list containing the task to update.": "The task list containing the task to update.",
"The task to update.": "The task to update.",
"The name (or partial name) of the task list to find.": "The name (or partial name) of the task list to find.",
"How to match the list name.": "How to match the list name.",
"Select a specific task list to search within.": "Select a specific task list to search within.",
"The title (or partial title) of the task to find.": "The title (or partial title) of the task to find.",
"How to match the task title.": "How to match the task title.",
"Authorization headers are injected automatically from your connection.": "Authorization headers are injected automatically from your connection.",
"Low": "Low",
"Normal": "Normal",
"High": "High",
"Not Started": "Not Started",
"In Progress": "In Progress",
"Completed": "Completed",
"Waiting On Others": "Waiting On Others",
"Deferred": "Deferred",
"Contains": "Contains",
"Starts With": "Starts With",
"Exact Match": "Exact Match",
"GET": "GET",
"POST": "POST",
"PATCH": "PATCH",
"PUT": "PUT",
"DELETE": "DELETE",
"HEAD": "HEAD",
"New Task": "New Task",
"New or Updated Task": "New or Updated Task",
"Triggers when a new task is created.": "Triggers when a new task is created.",
"Triggers when a new task is created or an existing task is updated.": "Triggers when a new task is created or an existing task is updated."
}

View File

@@ -0,0 +1,103 @@
{
"Cloud based task management application.": "Cloud based task management application.",
"\n1. Sign in to [Microsoft Azure Portal](https://portal.azure.com/).\n2. From the left sidebar, go to **Microsoft Enfra ID**.\n3. Under **Manage**, click on **App registrations**.\n4. Click the **New registration** button.\n5. Enter a **Name** for your app.\n6. For **Supported account types**, choose:\n - **Accounts in any organizational directory (Any Microsoft Entra ID tenant - Multitenant) and personal Microsoft accounts**\n - Or select based on your requirement.\n7. In **Redirect URI**, select **Web** and ad": "\n1. Sign in to [Microsoft Azure Portal](https://portal.azure.com/).\n2. From the left sidebar, go to **Microsoft Enfra ID**.\n3. Under **Manage**, click on **App registrations**.\n4. Click the **New registration** button.\n5. Enter a **Name** for your app.\n6. For **Supported account types**, choose:\n - **Accounts in any organizational directory (Any Microsoft Entra ID tenant - Multitenant) and personal Microsoft accounts**\n - Or select based on your requirement.\n7. In **Redirect URI**, select **Web** and add the given URL.\n8. Click **Register**.\n9. After registration, youll be redirected to the apps overview page. Copy the **Application (client) ID**.\n10. From the left menu, go to **Certificates & secrets**.\n - Under **Client secrets**, click **New client secret**.\n - Provide a description, set an expiry, and click **Add**.\n - Copy the **Value** of the client secret (this will not be shown again).\n11. Go to **API permissions** from the left menu.\n - Click **Add a permission**.\n - Select **Microsoft Graph** → **Delegated permissions**.\n - Add the following scopes:\n - User.Read\n - Tasks.ReadWrite\n - offline_access\n - Click **Add permissions**.\n12. Copy your **Client ID** and **Client Secret**.\n",
"Create Task": "Create Task",
"Create Task List": "Create Task List",
"Update Task": "Update Task",
"Update Task List": "Update Task List",
"Complete Task": "Complete Task",
"Delete Task": "Delete Task",
"Add an Attachment": "Add an Attachment",
"Get Task": "Get Task",
"Find Task List": "Find Task List",
"Find Task": "Find Task",
"Custom API Call": "自定义 API 呼叫",
"Creates a new task.": "Creates a new task.",
"Create a new task list.": "Create a new task list.",
"Update an existing task.": "Update an existing task.",
"Updates an existing task list.": "Updates an existing task list.",
"Marks a task as completed.": "Marks a task as completed.",
"Deletes an existing task.": "Deletes an existing task.",
"Adds an attachment to a task.": "Adds an attachment to a task.",
"Gets the details of a specific task.": "Gets the details of a specific task.",
"Finds a task list by its name.": "Finds a task list by its name.",
"Finds tasks by title.": "Finds tasks by title.",
"Make a custom API call to a specific endpoint": "将一个自定义 API 调用到一个特定的终点",
"Task List": "Task List",
"Title": "标题",
"Body Content": "Body Content",
"Importance": "Importance",
"Status": "状态",
"Due Date": "Due Date",
"Reminder Date": "Reminder Date",
"Start Date": "Start Date",
"Categories": "Categories",
"Task": "Task",
"New Name": "New Name",
"File": "文件",
"Attachment Name (Optional)": "Attachment Name (Optional)",
"Match Type": "Match Type",
"Task Title": "Task Title",
"Method": "方法",
"Headers": "信头",
"Query Parameters": "查询参数",
"Body": "正文内容",
"Response is Binary ?": "Response is Binary ?",
"No Error on Failure": "失败时没有错误",
"Timeout (in seconds)": "超时(秒)",
"The task list to create the task in.": "The task list to create the task in.",
"The title of the task.": "The title of the task.",
"The body or notes for the task.": "The body or notes for the task.",
"The importance of the task.": "The importance of the task.",
"The status of the task.": "The status of the task.",
"The date and time the task is scheduled to start.": "The date and time the task is scheduled to start.",
"Comma-separated categories for the task (e.g., Work, Personal).": "Comma-separated categories for the task (e.g., Work, Personal).",
"The name for the new task list.": "The name for the new task list.",
"The task list containing the task to update.": "The task list containing the task to update.",
"The task to update.": "The task to update.",
"The task list to update.": "The task list to update.",
"The new name for the task list.": "The new name for the task list.",
"The task list containing the task you want to complete.": "The task list containing the task you want to complete.",
"The specific task to mark as complete.": "The specific task to mark as complete.",
"The list containing the task you want to delete.": "The list containing the task you want to delete.",
"The specific task to delete.": "The specific task to delete.",
"The task list that contains the task.": "The task list that contains the task.",
"The task to which you are adding the attachment.": "The task to which you are adding the attachment.",
"The file to attach (up to 25 MB supported).": "The file to attach (up to 25 MB supported).",
"The name to display for the attachment. If left blank, the original filename will be used.": "The name to display for the attachment. If left blank, the original filename will be used.",
"The list containing the task you want to retrieve.": "The list containing the task you want to retrieve.",
"The specific task to retrieve.": "The specific task to retrieve.",
"The name (or partial name) of the task list to find.": "The name (or partial name) of the task list to find.",
"How to match the list name.": "How to match the list name.",
"Select a specific task list to search within.": "Select a specific task list to search within.",
"The title (or partial title) of the task to find.": "The title (or partial title) of the task to find.",
"How to match the task title.": "How to match the task title.",
"Authorization headers are injected automatically from your connection.": "授权头自动从您的连接中注入。",
"Enable for files like PDFs, images, etc..": "Enable for files like PDFs, images, etc..",
"Low": "Low",
"Normal": "Normal",
"High": "High",
"Not Started": "Not Started",
"In Progress": "In Progress",
"Completed": "Completed",
"Waiting On Others": "Waiting On Others",
"Deferred": "Deferred",
"Contains": "Contains",
"Starts With": "Starts With",
"Exact Match": "精确匹配",
"GET": "获取",
"POST": "帖子",
"PATCH": "PATCH",
"PUT": "弹出",
"DELETE": "删除",
"HEAD": "黑色",
"New Task": "New Task",
"New or Updated Task": "New or Updated Task",
"New List": "New List",
"Task Completed": "Task Completed",
"Triggers when a new task is created.": "Triggers when a new task is created.",
"Triggers when a new task is created or an existing task is updated.": "Triggers when a new task is created or an existing task is updated.",
"Triggers when a new task list is created.": "Triggers when a new task list is created.",
"Triggers when a task is completed in a specific list.": "Triggers when a task is completed in a specific list.",
"The list to watch for completed tasks.": "The list to watch for completed tasks."
}

View File

@@ -0,0 +1,93 @@
import { createPiece, OAuth2PropertyValue, PieceAuth } from '@activepieces/pieces-framework';
import { PieceCategory } from '@activepieces/shared';
import { createCustomApiCallAction } from '@activepieces/pieces-common';
import { createTask } from './lib/actions/create-task';
import { createTaskListAction } from './lib/actions/create-task-list';
import { updateTaskListAction } from './lib/actions/update-task-list';
import { updateTaskAction } from './lib/actions/update-task';
import { completeTaskAction } from './lib/actions/complete-task';
import { addAttachmentAction } from './lib/actions/add-attachment';
import { getTaskAction } from './lib/actions/get-task';
import { deleteTaskAction } from './lib/actions/delete-task';
import { findTaskListByNameAction } from './lib/actions/find-task-list-by-name';
import { findTaskByTitleAction } from './lib/actions/find-task-by-title';
import { newTaskCreatedTrigger } from './lib/triggers/new-task-created';
import { newOrUpdatedTaskTrigger } from './lib/triggers/task-updated';
import { newListCreatedTrigger } from './lib/triggers/new-list-created';
import { taskCompletedTrigger } from './lib/triggers/task-completed';
const authDesc = `
1. Sign in to [Microsoft Azure Portal](https://portal.azure.com/).
2. From the left sidebar, go to **Microsoft Enfra ID**.
3. Under **Manage**, click on **App registrations**.
4. Click the **New registration** button.
5. Enter a **Name** for your app.
6. For **Supported account types**, choose:
- **Accounts in any organizational directory (Any Microsoft Entra ID tenant - Multitenant) and personal Microsoft accounts**
- Or select based on your requirement.
7. In **Redirect URI**, select **Web** and add the given URL.
8. Click **Register**.
9. After registration, youll be redirected to the apps overview page. Copy the **Application (client) ID**.
10. From the left menu, go to **Certificates & secrets**.
- Under **Client secrets**, click **New client secret**.
- Provide a description, set an expiry, and click **Add**.
- Copy the **Value** of the client secret (this will not be shown again).
11. Go to **API permissions** from the left menu.
- Click **Add a permission**.
- Select **Microsoft Graph** → **Delegated permissions**.
- Add the following scopes:
- User.Read
- Tasks.ReadWrite
- offline_access
- Click **Add permissions**.
12. Copy your **Client ID** and **Client Secret**.
`;
export const microsoftToDoAuth = PieceAuth.OAuth2({
description: authDesc,
authUrl: 'https://login.microsoftonline.com/common/oauth2/v2.0/authorize',
tokenUrl: 'https://login.microsoftonline.com/common/oauth2/v2.0/token',
required: true,
scope: ['Tasks.ReadWrite', 'User.Read', 'offline_access'],
prompt: 'omit'
});
export const microsoftTodo = createPiece({
displayName: 'Microsoft To Do',
description: 'Cloud based task management application.',
categories: [PieceCategory.PRODUCTIVITY],
auth: microsoftToDoAuth,
minimumSupportedRelease: '0.36.1',
logoUrl: 'https://cdn.activepieces.com/pieces/microsoft-todo.png',
authors: ['onyedikachi-david','david-oluwaseun420'],
actions: [
createTask,
createTaskListAction,
updateTaskAction,
updateTaskListAction,
completeTaskAction,
deleteTaskAction,
addAttachmentAction,
getTaskAction,
findTaskListByNameAction,
findTaskByTitleAction,
createCustomApiCallAction({
baseUrl: () => 'https://graph.microsoft.com/v1.0/me/todo',
auth: microsoftToDoAuth,
authMapping: async (auth) => ({
Authorization: `Bearer ${(auth as OAuth2PropertyValue).access_token}`,
}),
}),
],
triggers: [
newTaskCreatedTrigger,
newOrUpdatedTaskTrigger,
newListCreatedTrigger,
taskCompletedTrigger,
],
});

View File

@@ -0,0 +1,143 @@
import { Property, createAction, OAuth2PropertyValue } from '@activepieces/pieces-framework';
import { getTaskListsDropdown, getTasksInListDropdown } from '../common';
import { TaskFileAttachment } from '@microsoft/microsoft-graph-types';
import { microsoftToDoAuth } from '../../index';
import { Client } from '@microsoft/microsoft-graph-client';
export const addAttachmentAction = createAction({
auth: microsoftToDoAuth,
name: 'add_attachment',
displayName: 'Add an Attachment',
description: 'Adds an attachment to a task.',
props: {
task_list_id: Property.Dropdown({
auth: microsoftToDoAuth,
displayName: 'Task List',
description: 'The task list that contains the task.',
required: true,
refreshers: [],
options: async ({ auth }) => {
if (!(auth as OAuth2PropertyValue)?.access_token) {
return {
disabled: true,
placeholder: 'Connect your account first',
options: [],
};
}
return await getTaskListsDropdown(auth as OAuth2PropertyValue);
},
}),
task_id: Property.Dropdown({
auth: microsoftToDoAuth,
displayName: 'Task',
description: 'The task to which you are adding the attachment.',
required: true,
refreshers: ['task_list_id'],
options: async ({ auth, task_list_id }) => {
const authValue = auth as OAuth2PropertyValue;
if (!authValue?.access_token || !task_list_id) {
return {
disabled: true,
placeholder: !authValue?.access_token
? 'Connect your account first'
: 'Select a task list first',
options: [],
};
}
return await getTasksInListDropdown(authValue, task_list_id as string);
},
}),
file: Property.File({
displayName: 'File',
description: 'The file to attach (up to 25 MB supported).',
required: true,
}),
filename: Property.ShortText({
displayName: 'Attachment Name (Optional)',
description: 'The name to display for the attachment. If left blank, the original filename will be used.',
required: false,
}),
},
async run(context) {
const { auth, propsValue } = context;
const { task_list_id, task_id, file, filename } = propsValue;
if (!task_list_id || !task_id) {
throw new Error('Task List ID and Task ID are required');
}
if (!file || !file.data) {
throw new Error('File or file data is missing. Please provide a valid file.');
}
const fileSizeInBytes = file.data.length;
const fileSizeInMB = fileSizeInBytes / (1024 * 1024);
const attachmentName = filename || file.filename;
if (fileSizeInMB > 25) {
throw new Error(`File size (${fileSizeInMB.toFixed(2)} MB) exceeds the 25 MB limit.`);
}
const client = Client.initWithMiddleware({
authProvider: {
getAccessToken: () => Promise.resolve(auth.access_token),
},
});
try {
if (fileSizeInMB < 3) {
const attachmentBody = {
'@odata.type': '#microsoft.graph.taskFileAttachment',
name: attachmentName,
contentBytes: file.data.toString('base64'),
contentType: file.extension ? `application/${file.extension}` : 'application/octet-stream',
};
const response = await client
.api(`/me/todo/lists/${task_list_id}/tasks/${task_id}/attachments`)
.post(attachmentBody);
return response as TaskFileAttachment;
}
const uploadSession = await client
.api(`/me/todo/lists/${task_list_id}/tasks/${task_id}/attachments/createUploadSession`)
.post({
attachmentInfo: {
attachmentType: 'file',
name: attachmentName,
size: fileSizeInBytes,
},
});
const uploadUrl = uploadSession.uploadUrl;
const chunkSize = 4 * 1024 * 1024;
let uploadedBytes = 0;
while (uploadedBytes < fileSizeInBytes) {
const chunkEnd = Math.min(uploadedBytes + chunkSize, fileSizeInBytes);
const chunk = file.data.slice(uploadedBytes, chunkEnd);
const contentRange = `bytes ${uploadedBytes}-${chunkEnd - 1}/${fileSizeInBytes}`;
const uploadResponse = await client
.api(uploadUrl)
.headers({
'Content-Length': chunk.length.toString(),
'Content-Range': contentRange,
'Content-Type': 'application/octet-stream',
})
.put(chunk);
uploadedBytes = chunkEnd;
if (uploadedBytes >= fileSizeInBytes) {
return uploadResponse as TaskFileAttachment;
}
}
throw new Error('Upload completed but no response received');
} catch (error: any) {
throw new Error(`Failed to add attachment: ${error?.message || error}`);
}
},
});

View File

@@ -0,0 +1,83 @@
import { Property, createAction, OAuth2PropertyValue } from '@activepieces/pieces-framework';
import { getTaskListsDropdown, getIncompleteTasksInListDropdown } from '../common';
import { microsoftToDoAuth } from '../../index';
import { Client } from '@microsoft/microsoft-graph-client';
import { TodoTask } from '@microsoft/microsoft-graph-types';
export const completeTaskAction = createAction({
auth: microsoftToDoAuth,
name: 'complete_task',
displayName: 'Complete Task',
description: 'Marks a task as completed.',
props: {
task_list_id: Property.Dropdown({
auth: microsoftToDoAuth,
displayName: 'Task List',
description: 'The task list containing the task you want to complete.',
required: true,
refreshers: [],
options: async ({ auth }) => {
if (!(auth as OAuth2PropertyValue)?.access_token) {
return {
disabled: true,
placeholder: 'Connect your account first',
options: [],
};
}
return await getTaskListsDropdown(auth as OAuth2PropertyValue);
},
}),
task_id: Property.Dropdown({
auth: microsoftToDoAuth,
displayName: 'Task',
description: 'The specific task to mark as complete.',
required: true,
refreshers: ['task_list_id'],
options: async ({ auth, task_list_id }) => {
const authValue = auth as OAuth2PropertyValue;
if (!authValue?.access_token || !task_list_id) {
return {
disabled: true,
placeholder: !authValue?.access_token
? 'Connect your account first'
: 'Select a task list first',
options: [],
};
}
return await getIncompleteTasksInListDropdown(authValue, task_list_id as string);
},
}),
},
async run(context) {
const { auth, propsValue } = context;
const { task_list_id, task_id } = propsValue;
if (!task_list_id || !task_id) {
throw new Error('Task List ID and Task ID are required');
}
const client = Client.initWithMiddleware({
authProvider: {
getAccessToken: () => Promise.resolve(auth.access_token),
},
});
try {
const taskUpdate: Partial<TodoTask> = {
status: 'completed',
completedDateTime: {
dateTime: new Date().toISOString(),
timeZone: 'UTC',
},
};
const response = await client
.api(`/me/todo/lists/${task_list_id}/tasks/${task_id}`)
.update(taskUpdate);
return response as TodoTask;
} catch (error: any) {
throw new Error(`Failed to complete task: ${error?.message || error}`);
}
},
});

View File

@@ -0,0 +1,32 @@
import { Property, createAction } from '@activepieces/pieces-framework';
import { microsoftToDoAuth } from '../../index';
import { Client } from '@microsoft/microsoft-graph-client';
export const createTaskListAction = createAction({
auth: microsoftToDoAuth,
name: 'create_task_list',
displayName: 'Create Task List',
description: 'Create a new task list.',
props: {
displayName: Property.ShortText({
displayName: 'Title',
description: 'The name for the new task list.',
required: true,
}),
},
async run(context) {
const { auth, propsValue } = context;
const client = Client.initWithMiddleware({
authProvider: {
getAccessToken: () => Promise.resolve(auth.access_token),
},
});
const response = await client.api('/me/todo/lists').post({
displayName: propsValue.displayName,
});
return response;
},
});

View File

@@ -0,0 +1,152 @@
import { Property, createAction, OAuth2PropertyValue } from '@activepieces/pieces-framework';
import { getTaskListsDropdown } from '../common';
import { microsoftToDoAuth } from '../../index';
import { Client } from '@microsoft/microsoft-graph-client';
import { Importance, TaskStatus, TodoTask } from '@microsoft/microsoft-graph-types';
export const createTask = createAction({
auth: microsoftToDoAuth,
name: 'create_task',
displayName: 'Create Task',
description: 'Creates a new task.',
props: {
task_list_id: Property.Dropdown({
auth: microsoftToDoAuth,
displayName: 'Task List',
description: 'The task list to create the task in.',
required: true,
refreshers: [],
options: async ({ auth }) => {
if (!(auth as OAuth2PropertyValue)?.access_token) {
return {
disabled: true,
placeholder: 'Connect your account first',
options: [],
};
}
return await getTaskListsDropdown(auth as OAuth2PropertyValue);
},
}),
title: Property.ShortText({
displayName: 'Title',
description: 'The title of the task.',
required: true,
}),
body_content: Property.LongText({
displayName: 'Body Content',
description: 'The body or notes for the task.',
required: false,
}),
importance: Property.StaticDropdown({
displayName: 'Importance',
description: 'The importance of the task.',
required: false,
options: {
options: [
{ label: 'Low', value: 'low' },
{ label: 'Normal', value: 'normal' },
{ label: 'High', value: 'high' },
],
},
}),
status: Property.StaticDropdown({
displayName: 'Status',
description: 'The status of the task.',
required: false,
options: {
options: [
{ label: 'Not Started', value: 'notStarted' },
{ label: 'In Progress', value: 'inProgress' },
{ label: 'Completed', value: 'completed' },
{ label: 'Waiting On Others', value: 'waitingOnOthers' },
{ label: 'Deferred', value: 'deferred' },
],
},
defaultValue: 'notStarted',
}),
due_date_time: Property.DateTime({
displayName: 'Due Date',
required: false,
}),
reminder_date_time: Property.DateTime({
displayName: 'Reminder Date',
required: false,
}),
start_date_time: Property.DateTime({
displayName: 'Start Date',
description: 'The date and time the task is scheduled to start.',
required: false,
}),
categories: Property.ShortText({
displayName: 'Categories',
description: 'Comma-separated categories for the task (e.g., Work, Personal).',
required: false,
}),
},
async run(context) {
const { auth, propsValue } = context;
const {
task_list_id,
title,
body_content,
importance,
status,
due_date_time,
reminder_date_time,
start_date_time,
categories,
} = propsValue;
const client = Client.initWithMiddleware({
authProvider: {
getAccessToken: () => Promise.resolve(auth.access_token),
},
});
const taskBody: TodoTask = {
title,
};
if (body_content) {
taskBody.body = {
content: body_content,
contentType: 'text',
};
}
if (importance) {
taskBody.importance = importance as Importance;
}
if (status) {
taskBody.status = status as TaskStatus;
}
if (due_date_time) {
taskBody.dueDateTime = {
dateTime: due_date_time,
timeZone: 'UTC',
};
}
if (reminder_date_time) {
taskBody.isReminderOn = true;
taskBody.reminderDateTime = { dateTime: reminder_date_time, timeZone: 'UTC' };
}
if (start_date_time) {
taskBody.startDateTime = { dateTime: start_date_time, timeZone: 'UTC' };
}
if (categories) {
taskBody.categories = categories
.split(',')
.map((c) => c.trim())
.filter((c) => c.length > 0);
}
const response = await client.api(`/me/todo/lists/${task_list_id}/tasks`).post(taskBody);
return response;
},
});

View File

@@ -0,0 +1,78 @@
import { Property, createAction, OAuth2PropertyValue } from '@activepieces/pieces-framework';
import { getTaskListsDropdown, getTasksInListDropdown } from '../common';
import { microsoftToDoAuth } from '../../index';
import { Client } from '@microsoft/microsoft-graph-client';
export const deleteTaskAction = createAction({
auth: microsoftToDoAuth,
name: 'delete_task',
displayName: 'Delete Task',
description: 'Deletes an existing task.',
props: {
task_list_id: Property.Dropdown({
auth: microsoftToDoAuth,
displayName: 'Task List',
description: 'The list containing the task you want to delete.',
required: true,
refreshers: [],
options: async ({ auth }) => {
const authValue = auth as OAuth2PropertyValue;
if (!authValue?.access_token) {
return {
disabled: true,
placeholder: 'Connect your account first',
options: [],
};
}
return await getTaskListsDropdown(authValue);
},
}),
task_id: Property.Dropdown({
auth: microsoftToDoAuth,
displayName: 'Task',
description: 'The specific task to delete.',
required: true,
refreshers: ['task_list_id'],
options: async ({ auth, task_list_id }) => {
const authValue = auth as OAuth2PropertyValue;
if (!authValue?.access_token || !task_list_id) {
return {
disabled: true,
placeholder: !authValue?.access_token
? 'Connect your account first'
: 'Select a task list first',
options: [],
};
}
return await getTasksInListDropdown(authValue, task_list_id as string);
},
}),
},
async run(context) {
const { auth, propsValue } = context;
const { task_list_id, task_id } = propsValue;
if (!task_list_id || !task_id) {
throw new Error('Task List ID and Task ID are required');
}
const client = Client.initWithMiddleware({
authProvider: {
getAccessToken: () => Promise.resolve(auth.access_token),
},
});
try {
await client
.api(`/me/todo/lists/${task_list_id}/tasks/${task_id}`)
.delete();
return {
success: true,
message: 'Task deleted successfully.',
};
} catch (error: any) {
throw new Error(`Failed to delete task: ${error?.message || error}`);
}
},
});

View File

@@ -0,0 +1,91 @@
import { Property, createAction, OAuth2PropertyValue } from '@activepieces/pieces-framework';
import { getTaskListsDropdown } from '../common';
import { microsoftToDoAuth } from '../../index';
import { Client, PageCollection } from '@microsoft/microsoft-graph-client';
import { TodoTask } from '@microsoft/microsoft-graph-types';
export const findTaskByTitleAction = createAction({
auth: microsoftToDoAuth,
name: 'find_task_by_title',
displayName: 'Find Task',
description: 'Finds tasks by title.',
props: {
task_list_id: Property.Dropdown({
auth: microsoftToDoAuth,
displayName: 'Task List',
description: 'Select a specific task list to search within.',
required: true,
refreshers: [],
options: async ({ auth }) => {
if (!(auth as OAuth2PropertyValue)?.access_token) {
return { disabled: true, placeholder: 'Connect your account first', options: [] };
}
return await getTaskListsDropdown(auth as OAuth2PropertyValue);
},
}),
title: Property.ShortText({
displayName: 'Task Title',
description: 'The title (or partial title) of the task to find.',
required: true,
}),
match_type: Property.StaticDropdown({
displayName: 'Match Type',
description: 'How to match the task title.',
required: false,
defaultValue: 'contains',
options: {
options: [
{ label: 'Contains', value: 'contains' },
{ label: 'Starts With', value: 'startsWith' },
{ label: 'Exact Match', value: 'exact' },
],
},
}),
},
async run(context) {
const { auth, propsValue } = context;
const { title, task_list_id, match_type } = propsValue;
const client = Client.initWithMiddleware({
authProvider: {
getAccessToken: () => Promise.resolve(auth.access_token),
},
});
let titleFilterString = '';
switch (match_type) {
case 'startsWith':
titleFilterString = `startsWith(title, '${title}')`;
break;
case 'exact':
titleFilterString = `title eq '${title}'`;
break;
case 'contains':
default:
titleFilterString = `contains(title, '${title}')`;
break;
}
const result = [];
let response: PageCollection = await client
.api(`/me/todo/lists/${task_list_id}/tasks`)
.filter(titleFilterString)
.get();
while (response.value.length > 0) {
for (const task of response.value as TodoTask[]) {
result.push(task);
}
if (response['@odata.nextLink']) {
response = await client.api(response['@odata.nextLink']).get();
} else {
break;
}
}
return result;
},
});

View File

@@ -0,0 +1,72 @@
import { Property, createAction, OAuth2PropertyValue } from '@activepieces/pieces-framework';
import { microsoftToDoAuth } from '../../index';
import { Client, PageCollection } from '@microsoft/microsoft-graph-client';
import { TodoTaskList } from '@microsoft/microsoft-graph-types';
export const findTaskListByNameAction = createAction({
auth: microsoftToDoAuth,
name: 'find_task_list_by_name',
displayName: 'Find Task List',
description: 'Finds a task list by its name.',
props: {
name: Property.ShortText({
displayName: 'Title',
description: 'The name (or partial name) of the task list to find.',
required: true,
}),
match_type: Property.StaticDropdown({
displayName: 'Match Type',
description: 'How to match the list name.',
required: false,
defaultValue: 'contains',
options: {
options: [
{ label: 'Contains', value: 'contains' },
{ label: 'Starts With', value: 'startsWith' },
{ label: 'Exact Match', value: 'exact' },
],
},
}),
},
async run(context) {
const { auth, propsValue } = context;
const { name, match_type } = propsValue;
let filterString = '';
switch (match_type) {
case 'startsWith':
filterString = `startsWith(displayName, '${name}')`;
break;
case 'exact':
filterString = `displayName eq '${name}'`;
break;
case 'contains':
default:
filterString = `contains(displayName, '${name}')`;
break;
}
const client = Client.initWithMiddleware({
authProvider: {
getAccessToken: () => Promise.resolve(auth.access_token),
},
});
const result = [];
let response: PageCollection = await client.api('/me/todo/lists').filter(filterString).get();
while (response.value.length > 0) {
for (const list of response.value as TodoTaskList[]) {
result.push(list);
}
if (response['@odata.nextLink']) {
response = await client.api(response['@odata.nextLink']).get();
} else {
break;
}
}
return result;
},
});

View File

@@ -0,0 +1,76 @@
import { Property, createAction, OAuth2PropertyValue } from '@activepieces/pieces-framework';
import { getTaskListsDropdown, getTasksInListDropdown } from '../common';
import { microsoftToDoAuth } from '../../index';
import { Client } from '@microsoft/microsoft-graph-client';
import { TodoTask } from '@microsoft/microsoft-graph-types';
export const getTaskAction = createAction({
auth: microsoftToDoAuth,
name: 'get_task',
displayName: 'Get Task',
description: 'Gets the details of a specific task.',
props: {
task_list_id: Property.Dropdown({
auth: microsoftToDoAuth,
displayName: 'Task List',
description: 'The list containing the task you want to retrieve.',
required: true,
refreshers: [],
options: async ({ auth }) => {
const authValue = auth as OAuth2PropertyValue;
if (!authValue?.access_token) {
return {
disabled: true,
placeholder: 'Connect your account first',
options: [],
};
}
return await getTaskListsDropdown(authValue);
},
}),
task_id: Property.Dropdown({
auth: microsoftToDoAuth,
displayName: 'Task',
description: 'The specific task to retrieve.',
required: true,
refreshers: ['task_list_id'],
options: async ({ auth, task_list_id }) => {
const authValue = auth as OAuth2PropertyValue;
if (!authValue?.access_token || !task_list_id) {
return {
disabled: true,
placeholder: !authValue?.access_token
? 'Connect your account first'
: 'Select a task list first',
options: [],
};
}
return await getTasksInListDropdown(authValue, task_list_id as string);
},
}),
},
async run(context) {
const { auth, propsValue } = context;
const { task_list_id, task_id } = propsValue;
if (!task_list_id || !task_id) {
throw new Error('Task List ID and Task ID are required');
}
const client = Client.initWithMiddleware({
authProvider: {
getAccessToken: () => Promise.resolve(auth.access_token),
},
});
try {
const response = await client
.api(`/me/todo/lists/${task_list_id}/tasks/${task_id}`)
.get();
return response as TodoTask;
} catch (error: any) {
throw new Error(`Failed to get task: ${error?.message || error}`);
}
},
});

View File

@@ -0,0 +1,69 @@
import { Property, createAction, OAuth2PropertyValue } from '@activepieces/pieces-framework';
import { getTaskListsDropdown } from '../common';
import { microsoftToDoAuth } from '../../index';
import { Client } from '@microsoft/microsoft-graph-client';
import { TodoTaskList } from '@microsoft/microsoft-graph-types';
export const updateTaskListAction = createAction({
auth: microsoftToDoAuth,
name: 'update_task_list',
displayName: 'Update Task List',
description: 'Updates an existing task list.',
props: {
task_list_id: Property.Dropdown({
auth: microsoftToDoAuth,
displayName: 'Task List',
description: 'The task list to update.',
required: true,
refreshers: [],
options: async ({ auth }) => {
const authValue = auth as OAuth2PropertyValue;
if (!authValue?.access_token) {
return {
disabled: true,
placeholder: 'Connect your account first',
options: [],
};
}
return await getTaskListsDropdown(authValue);
},
}),
displayName: Property.ShortText({
displayName: 'New Name',
description: 'The new name for the task list.',
required: true,
}),
},
async run(context) {
const { auth, propsValue } = context;
const { task_list_id, displayName } = propsValue;
if (!task_list_id) {
throw new Error('Task List ID is required');
}
if (!displayName || displayName.trim().length === 0) {
throw new Error('New Name cannot be empty. Please provide a valid name for the task list.');
}
const client = Client.initWithMiddleware({
authProvider: {
getAccessToken: () => Promise.resolve(auth.access_token),
},
});
try {
const taskListBody: Partial<TodoTaskList> = {
displayName: displayName.trim(),
};
const response = await client
.api(`/me/todo/lists/${task_list_id}`)
.update(taskListBody);
return response as TodoTaskList;
} catch (error: any) {
throw new Error(`Failed to update task list: ${error?.message || error}`);
}
},
});

View File

@@ -0,0 +1,184 @@
import { Property, createAction, OAuth2PropertyValue } from '@activepieces/pieces-framework';
import { getTaskListsDropdown, getTasksInListDropdown } from '../common';
import { microsoftToDoAuth } from '../../index';
import { Client } from '@microsoft/microsoft-graph-client';
import { Importance, TaskStatus, TodoTask } from '@microsoft/microsoft-graph-types';
export const updateTaskAction = createAction({
auth: microsoftToDoAuth,
name: 'update_task',
displayName: 'Update Task',
description: 'Update an existing task.',
props: {
task_list_id: Property.Dropdown({
auth: microsoftToDoAuth,
displayName: 'Task List',
description: 'The task list containing the task to update.',
required: true,
refreshers: [],
options: async ({ auth }) => {
if (!(auth as OAuth2PropertyValue)?.access_token) {
return { disabled: true, placeholder: 'Connect your account first', options: [] };
}
return await getTaskListsDropdown(auth as OAuth2PropertyValue);
},
}),
task_id: Property.Dropdown({
auth: microsoftToDoAuth,
displayName: 'Task',
description: 'The task to update.',
required: true,
refreshers: ['task_list_id'],
options: async ({ auth, task_list_id }) => {
const authValue = auth as OAuth2PropertyValue;
if (!authValue?.access_token || !task_list_id) {
return {
disabled: true,
placeholder: !authValue?.access_token
? 'Connect your account first'
: 'Select a task list first',
options: [],
};
}
return await getTasksInListDropdown(authValue, task_list_id as string);
},
}),
title: Property.ShortText({
displayName: 'Title',
description: 'The title of the task.',
required: false,
}),
body_content: Property.LongText({
displayName: 'Body Content',
description: 'The body or notes for the task.',
required: false,
}),
importance: Property.StaticDropdown({
displayName: 'Importance',
description: 'The importance of the task.',
required: false,
options: {
options: [
{ label: 'Low', value: 'low' },
{ label: 'Normal', value: 'normal' },
{ label: 'High', value: 'high' },
],
},
}),
status: Property.StaticDropdown({
displayName: 'Status',
description: 'The status of the task.',
required: false,
options: {
options: [
{ label: 'Not Started', value: 'notStarted' },
{ label: 'In Progress', value: 'inProgress' },
{ label: 'Completed', value: 'completed' },
{ label: 'Waiting On Others', value: 'waitingOnOthers' },
{ label: 'Deferred', value: 'deferred' },
],
},
}),
due_date_time: Property.DateTime({
displayName: 'Due Date',
required: false,
}),
reminder_date_time: Property.DateTime({
displayName: 'Reminder Date',
required: false,
}),
start_date_time: Property.DateTime({
displayName: 'Start Date',
description: 'The date and time the task is scheduled to start.',
required: false,
}),
categories: Property.ShortText({
displayName: 'Categories',
description: 'Comma-separated categories for the task (e.g., Work, Personal).',
required: false,
}),
},
async run(context) {
const { auth, propsValue } = context;
const {
task_list_id,
task_id,
title,
body_content,
importance,
status,
due_date_time,
reminder_date_time,
start_date_time,
categories,
} = propsValue;
const client = Client.initWithMiddleware({
authProvider: {
getAccessToken: () => Promise.resolve(auth.access_token),
},
});
const taskBody: TodoTask = {
title,
};
if (body_content) {
taskBody.body = {
content: body_content,
contentType: 'text',
};
}
if (importance) {
taskBody.importance = importance as Importance;
}
if (status) {
taskBody.status = status as TaskStatus;
}
if (due_date_time) {
taskBody.dueDateTime = {
dateTime: due_date_time,
timeZone: 'UTC',
};
}
if (reminder_date_time) {
taskBody.isReminderOn = true;
taskBody.reminderDateTime = { dateTime: reminder_date_time, timeZone: 'UTC' };
}
if (start_date_time) {
taskBody.startDateTime = { dateTime: start_date_time, timeZone: 'UTC' };
}
if (categories && categories !== '') {
taskBody.categories = categories
.split(',')
.map((c) => c.trim())
.filter((c) => c.length > 0);
}
// Only send request if there's something to update
if (Object.keys(taskBody).length === 0) {
// Optionally return the existing task or a message, or fetch and return task if ID is present
// For now, just return a message or do nothing if nothing to update.
// However, a PATCH with empty body might be treated as bad request by some APIs.
// Microsoft Graph usually ignores fields not present, so an empty body PATCH might be a no-op.
// Best to ensure at least one field is being modified or return early.
// Let's assume for now the user intends a no-op if all update fields are blank,
// but this might need a more specific behavior (e.g. fetch current task data).
// For safety, if requestBody is empty, we could fetch the task and return it.
// For now, let's proceed with the PATCH, it should be a no-op by MS Graph if body is empty.
throw new Error('Please provide any field to update.');
}
const response = await client
.api(`/me/todo/lists/${task_list_id}/tasks/${task_id}`)
.update(taskBody);
return response;
},
});

View File

@@ -0,0 +1,156 @@
import { OAuth2PropertyValue, DropdownOption } from '@activepieces/pieces-framework';
import { Client, PageCollection } from '@microsoft/microsoft-graph-client';
import { TodoTaskList, TodoTask } from '@microsoft/microsoft-graph-types';
export async function getTaskListsDropdown(auth: OAuth2PropertyValue): Promise<{
disabled: boolean;
options: DropdownOption<string>[];
placeholder?: string;
}> {
if (!auth || !auth.access_token) {
return {
disabled: true,
options: [],
placeholder: 'Connect your account first',
};
}
try {
const client = Client.initWithMiddleware({
authProvider: {
getAccessToken: () => Promise.resolve(auth.access_token),
},
});
const options: DropdownOption<string>[] = [];
let response: PageCollection = await client.api(`/me/todo/lists`).get();
while (response.value.length > 0) {
for (const list of response.value as TodoTaskList[]) {
options.push({ label: list.displayName!, value: list.id! });
}
if (response['@odata.nextLink']) {
response = await client.api(response['@odata.nextLink']).get();
} else {
break;
}
}
return {
disabled: false,
options: options,
};
} catch (error) {
return {
disabled: true,
options: [],
placeholder: 'An unexpected error occurred while fetching task lists.',
};
}
}
export async function getTasksInListDropdown(
auth: OAuth2PropertyValue,
taskListId: string,
): Promise<{
disabled: boolean;
options: DropdownOption<string>[];
placeholder?: string;
}> {
if (!auth || !auth.access_token) {
return { disabled: true, options: [], placeholder: 'Connect your account first' };
}
if (!taskListId) {
return { disabled: true, options: [], placeholder: 'Task List ID is required' };
}
try {
const client = Client.initWithMiddleware({
authProvider: {
getAccessToken: () => Promise.resolve(auth.access_token),
},
});
const options: DropdownOption<string>[] = [];
let response: PageCollection = await client.api(`/me/todo/lists/${taskListId}/tasks`).get();
while (response.value.length > 0) {
for (const task of response.value as TodoTask[]) {
if (task.id && task.title) {
options.push({ label: task.title, value: task.id });
}
}
if (response['@odata.nextLink']) {
response = await client.api(response['@odata.nextLink']).get();
} else {
break;
}
}
return { disabled: false, options: options };
} catch (error) {
return { disabled: true, options: [], placeholder: 'Error fetching tasks.' };
}
}
export async function getIncompleteTasksInListDropdown(
auth: OAuth2PropertyValue,
taskListId: string,
): Promise<{
disabled: boolean;
options: DropdownOption<string>[];
placeholder?: string;
}> {
if (!auth || !auth.access_token) {
return { disabled: true, options: [], placeholder: 'Connect your account first' };
}
if (!taskListId) {
return { disabled: true, options: [], placeholder: 'Task List ID is required' };
}
try {
const client = Client.initWithMiddleware({
authProvider: {
getAccessToken: () => Promise.resolve(auth.access_token),
},
});
const options: DropdownOption<string>[] = [];
let response: PageCollection = await client
.api(`/me/todo/lists/${taskListId}/tasks`)
.filter("status ne 'completed'")
.get();
while (response.value.length > 0) {
for (const task of response.value as TodoTask[]) {
if (task.id && task.title) {
options.push({ label: task.title, value: task.id });
}
}
if (response['@odata.nextLink']) {
response = await client.api(response['@odata.nextLink']).get();
} else {
break;
}
}
if (options.length === 0) {
return {
disabled: true,
options: [],
placeholder: 'No incomplete tasks found in this list',
};
}
return { disabled: false, options: options };
} catch (error) {
return { disabled: true, options: [], placeholder: 'Error fetching tasks.' };
}
}
export const microsoftTodoCommon = {
getTaskListsDropdown,
getTasksInListDropdown,
getIncompleteTasksInListDropdown,
};

View File

@@ -0,0 +1,69 @@
import { TriggerStrategy, createTrigger, AppConnectionValueForAuthProperty } from '@activepieces/pieces-framework';
import { DedupeStrategy, Polling, pollingHelper } from '@activepieces/pieces-common';
import { microsoftToDoAuth } from '../../index';
import { Client } from '@microsoft/microsoft-graph-client';
import { TodoTaskList } from '@microsoft/microsoft-graph-types';
const polling: Polling<AppConnectionValueForAuthProperty<typeof microsoftToDoAuth>, Record<string, never>> = {
strategy: DedupeStrategy.LAST_ITEM,
items: async ({ auth }) => {
const client = Client.initWithMiddleware({
authProvider: {
getAccessToken: () => Promise.resolve(auth.access_token),
},
});
const response = await client.api('/me/todo/lists').get();
const lists = response.value as TodoTaskList[];
return lists.map((list) => ({
id: list.id!,
data: list,
}));
},
};
export const newListCreatedTrigger = createTrigger({
auth: microsoftToDoAuth,
name: 'new_list_created',
displayName: 'New List',
description: 'Triggers when a new task list is created.',
props: {},
type: TriggerStrategy.POLLING,
sampleData: {
'@odata.etag': 'W/"m19slk90924jJPD1941jla="',
'displayName': 'Vacation Plans',
'isOwner': true,
'isShared': false,
'wellknownListName': 'none',
'id': 'AAMkAGI2NGY3NTY0LTZmYjEtNDk0MS04YjQ5LTFlNmQ5NjI1MWI5ZgAuAAAAAAC50Fk_sKMfS5_62i1Isws2AQD3xL9-24sxT5RO4265g_AEAAB3x24kAAA=',
},
async onEnable(context) {
await pollingHelper.poll(polling, context as any);
},
async onDisable(context) {
await pollingHelper.onDisable(polling, context as any);
},
async run(context) {
return await pollingHelper.poll(polling, context as any);
},
async test(context) {
try {
const client = Client.initWithMiddleware({
authProvider: {
getAccessToken: () => Promise.resolve(context.auth.access_token),
},
});
const response = await client.api('/me/todo/lists').get();
const lists = (response.value as TodoTaskList[]).slice(0, 5);
return lists;
} catch (error: any) {
throw new Error(`Failed to fetch task lists: ${error?.message || error}`);
}
},
});

View File

@@ -0,0 +1,112 @@
import { AppConnectionValueForAuthProperty, OAuth2PropertyValue, Property } from '@activepieces/pieces-framework';
import { createTrigger, TriggerStrategy } from '@activepieces/pieces-framework';
import { DedupeStrategy, Polling, pollingHelper } from '@activepieces/pieces-common';
import { getTaskListsDropdown } from '../common';
import { microsoftToDoAuth } from '../../index';
import { Client, PageCollection } from '@microsoft/microsoft-graph-client';
import dayjs from 'dayjs';
import { TodoTask } from '@microsoft/microsoft-graph-types';
const polling: Polling<AppConnectionValueForAuthProperty<typeof microsoftToDoAuth>, { task_list_id: string }> = {
strategy: DedupeStrategy.TIMEBASED,
items: async ({ auth, propsValue, store, lastFetchEpochMS }) => {
const taskListId = propsValue.task_list_id;
const client = Client.initWithMiddleware({
authProvider: {
getAccessToken: () => Promise.resolve(auth.access_token),
},
});
const tasks = [];
const filter =
lastFetchEpochMS === 0
? '$top=10'
: `$filter=createdDateTime gt ${dayjs(lastFetchEpochMS).toISOString()}`;
let response: PageCollection = await client
.api(`/me/todo/lists/${taskListId}/tasks?${filter}`)
.get();
if (lastFetchEpochMS === 0) {
for (const task of response.value as TodoTask[]) {
tasks.push(task);
}
} else {
while (response.value.length > 0) {
for (const task of response.value as TodoTask[]) {
tasks.push(task);
}
if (response['@odata.nextLink']) {
response = await client.api(response['@odata.nextLink']).get();
} else {
break;
}
}
}
return tasks.map((task) => ({
epochMilliSeconds: dayjs(task.createdDateTime).valueOf(),
data: task,
}));
},
};
export const newTaskCreatedTrigger = createTrigger({
name: 'new_task_created',
displayName: 'New Task',
description: 'Triggers when a new task is created.',
auth: microsoftToDoAuth,
props: {
task_list_id: Property.Dropdown({
auth: microsoftToDoAuth,
displayName: 'Task List',
required: true,
refreshers: [],
options: async ({ auth }) => {
if (!(auth as OAuth2PropertyValue)?.access_token) {
return { disabled: true, placeholder: 'Connect your account first', options: [] };
}
return await getTaskListsDropdown(auth as OAuth2PropertyValue);
},
}),
},
type: TriggerStrategy.POLLING,
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: {
'@odata.etag': 'W/"vVwdQvxCiE6779iYhchMrAAGgwrb4w=="',
importance: 'normal',
isReminderOn: false,
status: 'notStarted',
title: 'fdfdfd',
createdDateTime: '2025-05-08T12:40:55.3080693Z',
lastModifiedDateTime: '2025-05-08T12:40:55.3533435Z',
hasAttachments: false,
categories: [],
id: 'AQMkADAwATM3ZmYAZS0xNGVmLWNiZmYALTAwAi0wMAoARgAAAw8tTPoZEYtLvE5mK48wuvIHAL1cHUL8QohOu_-YmIXITKwABoMc5_AAAAC9XB1C-EKITrvv2JiFyEysAAaDHTv2AAAA',
body: {
content: '',
contentType: 'text',
},
},
});

View File

@@ -0,0 +1,138 @@
import { OAuth2PropertyValue, Property, TriggerStrategy, createTrigger } from '@activepieces/pieces-framework';
import { getTaskListsDropdown } from '../common';
import { microsoftToDoAuth } from '../../index';
import { Client } from '@microsoft/microsoft-graph-client';
import dayjs from 'dayjs';
import { TodoTask } from '@microsoft/microsoft-graph-types';
interface WebhookNotification {
value: {
resource: string;
resourceData?: {
id: string;
};
}[];
}
export const taskCompletedTrigger = createTrigger({
auth: microsoftToDoAuth,
name: 'task_completed',
displayName: 'Task Completed',
description: 'Triggers when a task is completed in a specific list.',
props: {
task_list_id: Property.Dropdown({
auth: microsoftToDoAuth,
displayName: 'Task List',
description: 'The list to watch for completed tasks.',
required: true,
refreshers: [],
options: async ({ auth }) => {
const authValue = auth as OAuth2PropertyValue;
if (!authValue?.access_token) {
return { disabled: true, placeholder: 'Connect your account first', options: [] };
}
return await getTaskListsDropdown(authValue);
},
}),
},
type: TriggerStrategy.WEBHOOK,
sampleData: {
'@odata.etag': 'W/"vVwdQvxCiE6779iYhchMrAAGgwrltg=="',
importance: 'normal',
isReminderOn: false,
status: 'completed',
title: 'Test Task',
},
async onEnable(context) {
try {
const client = Client.initWithMiddleware({
authProvider: { getAccessToken: () => Promise.resolve(context.auth.access_token) },
});
const clientState = Math.random().toString(36).substring(7);
const expirationDateTime = dayjs().add(2, 'days').toISOString();
const response = await client.api('/subscriptions').post({
changeType: 'updated',
notificationUrl: context.webhookUrl,
resource: `/me/todo/lists/${context.propsValue.task_list_id}/tasks`,
expirationDateTime: expirationDateTime,
clientState: clientState,
});
await context.store.put('subscriptionId', response.id);
await context.store.put('clientState', clientState);
} catch (error: any) {
throw new Error(`Failed to create webhook subscription: ${error?.message || error}`);
}
},
async onDisable(context) {
try {
const subscriptionId = await context.store.get('subscriptionId') as string | null;
if (subscriptionId) {
const client = Client.initWithMiddleware({
authProvider: { getAccessToken: () => Promise.resolve(context.auth.access_token) },
});
await client.api(`/subscriptions/${subscriptionId}`).delete();
await context.store.delete('subscriptionId');
await context.store.delete('clientState');
}
} catch (error: any) {
console.warn(`Failed to delete subscription: ${error?.message || error}`);
}
},
async onRenew(context) {
try {
const subscriptionId = await context.store.get('subscriptionId') as string | null;
if (subscriptionId) {
const client = Client.initWithMiddleware({
authProvider: { getAccessToken: () => Promise.resolve(context.auth.access_token) },
});
await client.api(`/subscriptions/${subscriptionId}`).patch({
expirationDateTime: dayjs().add(2, 'days').toISOString(),
});
}
} catch (error: any) {
throw new Error(`Failed to renew subscription: ${error?.message || error}`);
}
},
async run(context) {
const payload = context.payload.body as WebhookNotification;
const storedClientState = await context.store.get('clientState') as string | null;
const receivedClientState = (context.payload.body as any)?.value?.[0]?.clientState;
if (storedClientState && receivedClientState !== storedClientState) {
console.warn('Invalid clientState received in webhook notification');
return [];
}
const completedTasks: TodoTask[] = [];
const client = Client.initWithMiddleware({
authProvider: { getAccessToken: () => Promise.resolve(context.auth.access_token) },
});
for (const notification of payload.value) {
const taskId = notification.resourceData?.id;
if (!taskId) continue;
try {
const task = await client.api(notification.resource).get() as TodoTask;
if (task.status === 'completed') {
completedTasks.push(task);
}
} catch (e) {
console.warn(`Failed to fetch task ${taskId}, it may have been deleted.`);
}
}
return completedTasks;
},
});

View File

@@ -0,0 +1,112 @@
import { AppConnectionValueForAuthProperty, OAuth2PropertyValue, Property } from '@activepieces/pieces-framework';
import { createTrigger, TriggerStrategy } from '@activepieces/pieces-framework';
import { DedupeStrategy, Polling, pollingHelper } from '@activepieces/pieces-common';
import { getTaskListsDropdown } from '../common';
import { microsoftToDoAuth } from '../../index';
import { Client, PageCollection } from '@microsoft/microsoft-graph-client';
import dayjs from 'dayjs';
import { TodoTask } from '@microsoft/microsoft-graph-types';
const polling: Polling<AppConnectionValueForAuthProperty<typeof microsoftToDoAuth>, { task_list_id: string }> = {
strategy: DedupeStrategy.TIMEBASED,
async items({ auth, propsValue, store, lastFetchEpochMS }) {
const taskListId = propsValue.task_list_id;
const client = Client.initWithMiddleware({
authProvider: {
getAccessToken: () => Promise.resolve(auth.access_token),
},
});
const tasks = [];
const filter =
lastFetchEpochMS === 0
? '$top=10'
: `$filter=lastModifiedDateTime gt ${dayjs(lastFetchEpochMS).toISOString()}`;
let response: PageCollection = await client
.api(`/me/todo/lists/${taskListId}/tasks?${filter}`)
.get();
if (lastFetchEpochMS === 0) {
for (const task of response.value as TodoTask[]) {
tasks.push(task);
}
} else {
while (response.value.length > 0) {
for (const task of response.value as TodoTask[]) {
tasks.push(task);
}
if (response['@odata.nextLink']) {
response = await client.api(response['@odata.nextLink']).get();
} else {
break;
}
}
}
return tasks.map((task) => ({
epochMilliSeconds: dayjs(task.lastModifiedDateTime).valueOf(),
data: task,
}));
},
};
export const newOrUpdatedTaskTrigger = createTrigger({
name: 'new_or_updated_task',
displayName: 'New or Updated Task',
description: 'Triggers when a new task is created or an existing task is updated.',
auth: microsoftToDoAuth,
props: {
task_list_id: Property.Dropdown({
auth: microsoftToDoAuth,
displayName: 'Task List',
required: true,
refreshers: [],
options: async ({ auth }) => {
if (!(auth as OAuth2PropertyValue)?.access_token) {
return { disabled: true, placeholder: 'Connect your account first', options: [] };
}
return await getTaskListsDropdown(auth as OAuth2PropertyValue);
},
}),
},
type: TriggerStrategy.POLLING,
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: {
'@odata.etag': 'W/"vVwdQvxCiE6779iYhchMrAAGgwrb4w=="',
importance: 'normal',
isReminderOn: false,
status: 'notStarted',
title: 'fdfdfd',
createdDateTime: '2025-05-08T12:40:55.3080693Z',
lastModifiedDateTime: '2025-05-08T12:40:55.3533435Z',
hasAttachments: false,
categories: [],
id: 'AQMkADAwATM3ZmYAZS0xNGVmLWNiZmYALTAwAi0wMAoARgAAAw8tTPoZEYtLvE5mK48wuvIHAL1cHUL8QohOu_-YmIXITKwABoMc5_AAAAC9XB1C-EKITrvv2JiFyEysAAaDHTv2AAAA',
body: {
content: '',
contentType: 'text',
},
},
});