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:
@@ -0,0 +1,52 @@
|
||||
{
|
||||
"Notion": "Notion",
|
||||
"The all-in-one workspace": "The all-in-one workspace",
|
||||
"Create Database Item": "Create Database Item",
|
||||
"Update Database Item": "Update Database Item",
|
||||
"Find Database Item": "Find Database Item",
|
||||
"Create Page": "Create Page",
|
||||
"Append to Page": "Append to Page",
|
||||
"Get block content": "Get block content",
|
||||
"Custom API Call": "Custom API Call",
|
||||
"Creates an item in a database.": "Creates an item in a database.",
|
||||
"Updates an item in database": "Updates an item in database",
|
||||
"Searches for an item in database by field.": "Searches for an item in database by field.",
|
||||
"Create a page under a parent page.": "Create a page under a parent page.",
|
||||
"Appends content to the end of a page.": "Appends content to the end of a page.",
|
||||
"Retrieve the actual content of a page (represented by blocks).": "Retrieve the actual content of a page (represented by blocks).",
|
||||
"Make a custom API call to a specific endpoint": "Make a custom API call to a specific endpoint",
|
||||
"Database": "Database",
|
||||
"Fields": "Fields",
|
||||
"Content": "Content",
|
||||
"Database Item": "Database Item",
|
||||
"Page": "Page",
|
||||
"Title": "Title",
|
||||
"Page or parent block ID": "Page or parent block ID",
|
||||
"Markdown": "Markdown",
|
||||
"Dynamic properties": "Dynamic properties",
|
||||
"Method": "Method",
|
||||
"Headers": "Headers",
|
||||
"Query Parameters": "Query Parameters",
|
||||
"Body": "Body",
|
||||
"No Error on Failure": "No Error on Failure",
|
||||
"Timeout (in seconds)": "Timeout (in seconds)",
|
||||
"Select the database you want to use": "Select the database you want to use",
|
||||
"The content you want to append to your item.": "The content you want to append to your item.",
|
||||
"Select the item you want to update": "Select the item you want to update",
|
||||
"Select the page you want to use. Only your most recently edited 100 pages will appear.": "Select the page you want to use. Only your most recently edited 100 pages will appear.",
|
||||
"The title of the page.": "The title of the page.",
|
||||
"The content of the page.": "The content of the page.",
|
||||
"The content you want to append. You can use markdown formatting.": "The content you want to append. You can use markdown formatting.",
|
||||
"Convert Notion JSON blocks to Markdown": "Convert Notion JSON blocks to Markdown",
|
||||
"Authorization headers are injected automatically from your connection.": "Authorization headers are injected automatically from your connection.",
|
||||
"GET": "GET",
|
||||
"POST": "POST",
|
||||
"PATCH": "PATCH",
|
||||
"PUT": "PUT",
|
||||
"DELETE": "DELETE",
|
||||
"HEAD": "HEAD",
|
||||
"New Database Item": "New Database Item",
|
||||
"Updated Database Item": "Updated Database Item",
|
||||
"Triggers when an item is added to a database.": "Triggers when an item is added to a database.",
|
||||
"Triggers when an item is updated in a database.": "Triggers when an item is updated in a database."
|
||||
}
|
||||
@@ -0,0 +1,79 @@
|
||||
{
|
||||
"The all-in-one workspace": "Der gesamte Arbeitsbereich",
|
||||
"Create Database Item": "Datenbank-Element erstellen",
|
||||
"Update Database Item": "Datenbank-Element aktualisieren",
|
||||
"Find Database Item": "Datenbank-Element finden",
|
||||
"Create Page": "Seite erstellen",
|
||||
"Append to Page": "An Seite anhängen",
|
||||
"Get block content": "Blockinhalt abrufen",
|
||||
"Archive Database Item": "Archivdatenbank-Element",
|
||||
"Restore Database Item": "Datenbank-Element wiederherstellen",
|
||||
"Add Comment": "Kommentar hinzufügen",
|
||||
"Retrieve Database Structure": "Datenbankstruktur abrufen",
|
||||
"Get Page Comments": "Seitenkommentare erhalten",
|
||||
"Find Page": "Seite suchen",
|
||||
"Custom API Call": "Eigener API-Aufruf",
|
||||
"Add a new item to a Notion database with custom field values and optional content. Ideal for creating tasks, records, or entries in structured databases.": "Fügen Sie ein neues Element zu einer Notion-Datenbank mit benutzerdefinierten Feldwerten und optionalem Inhalt hinzu. Ideal zum Erstellen von Aufgaben, Datensätzen oder Einträgen in strukturierten Datenbanken.",
|
||||
"Update specific fields in a Notion database item. Perfect for maintaining data, tracking changes, or syncing information across systems.": "Aktualisieren Sie bestimmte Felder in einem Notion-Datenbank-Element. Perfekt für die Pflege von Daten, die Verfolgung von Änderungen oder die Synchronisierung von Informationen über alle Systeme.",
|
||||
"Searches for an item in database by field.": "Sucht nach einem Element in der Datenbank nach Feld.",
|
||||
"Create a new Notion page as a sub-page with custom title and content. Perfect for organizing documentation, notes, or creating structured page hierarchies.": "Erstellen Sie eine neue Notion-Seite als Unterseite mit benutzerdefiniertem Titel und Inhalt. Perfekt um Dokumentationen, Notizen oder strukturierte Seitenhierarchien zu organisieren.",
|
||||
"Appends content to the end of a page.": "Fügt Inhalte an das Ende einer Seite an.",
|
||||
"Retrieve the actual content of a page (represented by blocks).": "Den aktuellen Inhalt einer Seite abrufen (durch Blöcke repräsentiert).",
|
||||
"Archive (soft-delete) a database item without permanently removing it. Archived items can be restored later if needed.": "Archiv (Soft-Löschen) eines Datenbankelements, ohne es dauerhaft zu löschen. Archivierte Elemente können später wiederhergestellt werden, falls nötig.",
|
||||
"Restore an archived database item back to active status. Perfect for recovering accidentally archived tasks, projects, or records.": "Stelle ein archiviertes Datenbankelement wieder in den aktiven Status zurück. Perfekt um versehentlich archivierte Aufgaben, Projekte oder Datensätze wiederherzustellen.",
|
||||
"Add a comment to any Notion page to start discussions, provide feedback, or leave notes for team collaboration.": "Fügen Sie einen Kommentar zu jeder Notion-Seite, um Diskussionen zu beginnen, geben Sie Feedback oder hinterlassen Sie Notizen für die Zusammenarbeit im Team.",
|
||||
"Get detailed information about a Notion database including all its properties, field types, and configuration. Perfect for building dynamic forms, validation rules, or understanding database schemas.": "Erhalten Sie detaillierte Informationen über eine Notion-Datenbank mit allen Eigenschaften, Feldtypen und Konfiguration. Perfekt um dynamische Formulare, Validierungsregeln zu erstellen oder Datenbankschemas zu verstehen.",
|
||||
"Retrieve all comments from a Notion page, organized by discussion threads. Perfect for tracking feedback, managing reviews, or monitoring page discussions.": "Alle Kommentare von einer Notion-Seite abrufen, organisiert nach Diskussionsthemen. Perfekt um Feedbacks zu verfolgen, Rezensionen zu verwalten oder Seitengespräche zu überwachen.",
|
||||
"Search for Notion pages by title with flexible matching options. Perfect for finding specific pages, building page references, or creating automated workflows based on page discovery.": "Suche nach Notion-Seiten nach Titel mit flexiblen passenden Optionen. Perfekt um bestimmte Seiten zu finden, Seitenreferenzen zu erstellen oder automatisierte Arbeitsabläufe auf der Grundlage der Seitenentdeckung zu erstellen.",
|
||||
"Make a custom API call to a specific endpoint": "Einen benutzerdefinierten API-Aufruf an einen bestimmten Endpunkt machen",
|
||||
"Database": "Datenbank",
|
||||
"Fields": "Felder",
|
||||
"Content": "Inhalt",
|
||||
"Database Item": "Datenbank-Element",
|
||||
"Page": "Seite",
|
||||
"Title": "Titel",
|
||||
"Page or parent block ID": "Seiten- oder Elternblock-ID",
|
||||
"Markdown": "Markdown",
|
||||
"Dynamic properties": "Dynamische Eigenschaften",
|
||||
"Archived Item": "Archiviertes Element",
|
||||
"Comment Text": "Kommentartext",
|
||||
"Page Title": "Seitentitel",
|
||||
"Exact Match": "Genaues Match",
|
||||
"Maximum Results": "Maximale Ergebnisse",
|
||||
"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)",
|
||||
"Choose the Notion database you want to work with from your workspace": "Wählen Sie die Notion-Datenbank, mit der Sie arbeiten möchten, aus Ihrem Arbeitsbereich",
|
||||
"The content you want to append to your item.": "Der Inhalt, den Sie an Ihren Artikel anhängen möchten.",
|
||||
"Select the item you want to update": "Wählen Sie das Element, das Sie aktualisieren möchten",
|
||||
"Choose the Notion page you want to work with. This list shows your 100 most recently edited pages for easy selection.": "Wählen Sie die Notion-Seite, mit der Sie arbeiten möchten. Diese Liste zeigt Ihre 100 zuletzt bearbeiteten Seiten zur einfachen Auswahl.",
|
||||
"The title of the page.": "Der Titel der Seite.",
|
||||
"The content of the page.": "Der Inhalt der Seite.",
|
||||
"The content you want to append. You can use markdown formatting.": "Der Inhalt, den Sie anhängen möchten. Sie können die Markdown-Formatierung verwenden.",
|
||||
"Convert Notion JSON blocks to Markdown": "Konvertiere JSON-Blöcke in Markdown",
|
||||
"Choose which archived item to restore from the selected database": "Wählen Sie, welches archivierte Element aus der ausgewählten Datenbank wiederherzustellen",
|
||||
"Enter your comment text. Supports plain text and will be posted as a new comment thread on the selected page.": "Geben Sie Ihren Kommentartext ein. Unterstützt Klartext und wird als neuer Kommentar-Thread auf der ausgewählten Seite veröffentlicht.",
|
||||
"Enter the page title or part of the title you want to search for": "Geben Sie den Seitentitel oder einen Teil des Titels ein, nach dem Sie suchen möchten",
|
||||
"Enable this to find pages with exactly the same title. Disable for partial matching (finds pages containing your search term).": "Aktivieren Sie dies, um Seiten mit genau dem gleichen Titel zu finden. Deaktivieren für partielle Übereinstimmung (Funde Seiten mit Ihrem Suchbegriff).",
|
||||
"How many pages to return at most (between 1 and 100)": "Wie viele Seiten maximal zurückgegeben werden sollen (zwischen 1 und 100)",
|
||||
"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..",
|
||||
"GET": "ERHALTEN",
|
||||
"POST": "POST",
|
||||
"PATCH": "PATCH",
|
||||
"PUT": "PUT",
|
||||
"DELETE": "LÖSCHEN",
|
||||
"HEAD": "HEAD",
|
||||
"New Database Item": "Neues Datenbankelement",
|
||||
"Updated Database Item": "Aktualisierte Datenbank-Element",
|
||||
"New Comment": "Neuer Kommentar",
|
||||
"Updated Page": "Aktualisierte Seite",
|
||||
"Triggers when an item is added to a database.": "Wird ausgelöst, wenn ein Element zur Datenbank hinzugefügt wird.",
|
||||
"Triggers when an item is updated in a database.": "Wird ausgelöst, wenn ein Element in einer Datenbank aktualisiert wird.",
|
||||
"Triggers whenever someone adds a new comment to a specific Notion page. Perfect for notifications, review workflows, or automated responses to team feedback.": "Löst jedes Mal, wenn jemand einen neuen Kommentar zu einer bestimmten Notion-Seite hinzufügt. Perfekt für Benachrichtigungen, Workflows oder automatisierte Antworten auf Team-Feedback.",
|
||||
"Triggers whenever any page in your Notion workspace is modified or updated. Ideal for syncing content changes, backup processes, or notifying teams about documentation updates.": "Löscht jede Seite in Ihrem Notion-Arbeitsbereich aus. Ideal zum Synchronisieren von Inhaltsänderungen, Sicherungsprozessen oder zur Benachrichtigung von Teams über Dokumentationsaktualisierungen."
|
||||
}
|
||||
@@ -0,0 +1,79 @@
|
||||
{
|
||||
"The all-in-one workspace": "El espacio de trabajo todo en uno",
|
||||
"Create Database Item": "Crear artículo de base de datos",
|
||||
"Update Database Item": "Actualizar elemento de base de datos",
|
||||
"Find Database Item": "Encontrar elemento de base de datos",
|
||||
"Create Page": "Crear página",
|
||||
"Append to Page": "Añadir a la página",
|
||||
"Get block content": "Obtener contenido de bloque",
|
||||
"Archive Database Item": "Archivar elemento de base de datos",
|
||||
"Restore Database Item": "Restaurar elemento de base de datos",
|
||||
"Add Comment": "Añadir comentario",
|
||||
"Retrieve Database Structure": "Recuperar estructura de base de datos",
|
||||
"Get Page Comments": "Obtener Comentarios de Página",
|
||||
"Find Page": "Buscar página",
|
||||
"Custom API Call": "Llamada API personalizada",
|
||||
"Add a new item to a Notion database with custom field values and optional content. Ideal for creating tasks, records, or entries in structured databases.": "Añadir un nuevo elemento a una base de datos Noción con valores de campos personalizados y contenido opcional. Ideal para crear tareas, registros o entradas en bases de datos estructuradas.",
|
||||
"Update specific fields in a Notion database item. Perfect for maintaining data, tracking changes, or syncing information across systems.": "Actualizar campos específicos en un elemento de base de datos de Nociones. Perfecto para mantener datos, rastrear cambios o sincronizar información entre sistemas.",
|
||||
"Searches for an item in database by field.": "Busca un elemento en la base de datos por campo.",
|
||||
"Create a new Notion page as a sub-page with custom title and content. Perfect for organizing documentation, notes, or creating structured page hierarchies.": "Crear una nueva página de Noción como una subpágina con título personalizado y contenido. Perfecto para organizar documentación, notas o crear jerarquías de páginas estructuradas.",
|
||||
"Appends content to the end of a page.": "Añade contenido al final de una página.",
|
||||
"Retrieve the actual content of a page (represented by blocks).": "Recuperar el contenido real de una página (representado por bloques).",
|
||||
"Archive (soft-delete) a database item without permanently removing it. Archived items can be restored later if needed.": "Archivar (soft-delete) un elemento de base de datos sin eliminarlo permanentemente. Los elementos archivados pueden ser restaurados más tarde si es necesario.",
|
||||
"Restore an archived database item back to active status. Perfect for recovering accidentally archived tasks, projects, or records.": "Restaurar un elemento de base de datos archivado de vuelta al estado activo. Perfecto para recuperar tareas, proyectos o registros archivados accidentalmente.",
|
||||
"Add a comment to any Notion page to start discussions, provide feedback, or leave notes for team collaboration.": "Añadir un comentario a cualquier página de Noción para iniciar discusiones, proporcionar comentarios o dejar notas para la colaboración del equipo.",
|
||||
"Get detailed information about a Notion database including all its properties, field types, and configuration. Perfect for building dynamic forms, validation rules, or understanding database schemas.": "Obtenga información detallada acerca de una base de datos Noción incluyendo todas sus propiedades, tipos de campo y configuración. Perfecto para construir formas dinámicas, reglas de validación o comprensión de esquemas de base de datos.",
|
||||
"Retrieve all comments from a Notion page, organized by discussion threads. Perfect for tracking feedback, managing reviews, or monitoring page discussions.": "Recuperar todos los comentarios de una página de Noción, organizada por hilos de discusión. Perfecto para rastrear comentarios, gestionar reseñas o monitorear discusiones de páginas.",
|
||||
"Search for Notion pages by title with flexible matching options. Perfect for finding specific pages, building page references, or creating automated workflows based on page discovery.": "Busca páginas de Nociones por título con opciones flexibles de coincidencia. Perfecto para encontrar páginas específicas, crear referencias de páginas o crear flujos de trabajo automatizados basados en el descubrimiento de página.",
|
||||
"Make a custom API call to a specific endpoint": "Hacer una llamada API personalizada a un extremo específico",
|
||||
"Database": "Base de datos",
|
||||
"Fields": "Campos",
|
||||
"Content": "Contenido",
|
||||
"Database Item": "Base de datos",
|
||||
"Page": "Pgina",
|
||||
"Title": "Título",
|
||||
"Page or parent block ID": "ID de bloque padre o página",
|
||||
"Markdown": "Markdown",
|
||||
"Dynamic properties": "Propiedades dinámicas",
|
||||
"Archived Item": "Elemento archivado",
|
||||
"Comment Text": "Comentario",
|
||||
"Page Title": "Título de página",
|
||||
"Exact Match": "Partida exacta",
|
||||
"Maximum Results": "Resultados máximos",
|
||||
"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)",
|
||||
"Choose the Notion database you want to work with from your workspace": "Elija la base de datos con la que desea trabajar desde su área de trabajo",
|
||||
"The content you want to append to your item.": "El contenido que quieres añadir a tu artículo.",
|
||||
"Select the item you want to update": "Seleccione el elemento que desea actualizar",
|
||||
"Choose the Notion page you want to work with. This list shows your 100 most recently edited pages for easy selection.": "Elija la página de Noción con la que desea trabajar. Esta lista muestra sus 100 páginas editadas más recientemente para una selección sencilla.",
|
||||
"The title of the page.": "El título de la página.",
|
||||
"The content of the page.": "El contenido de la página.",
|
||||
"The content you want to append. You can use markdown formatting.": "El contenido que desea añadir. Puede utilizar el formato markdown.",
|
||||
"Convert Notion JSON blocks to Markdown": "Convertir bloques JSON de Noción a Markdown",
|
||||
"Choose which archived item to restore from the selected database": "Elija qué elemento archivado desea restaurar de la base de datos seleccionada",
|
||||
"Enter your comment text. Supports plain text and will be posted as a new comment thread on the selected page.": "Introduzca el texto de su comentario. Soporta texto plano y se publicará como un nuevo hilo de comentarios en la página seleccionada.",
|
||||
"Enter the page title or part of the title you want to search for": "Introduzca el título de la página o parte del título que desea buscar",
|
||||
"Enable this to find pages with exactly the same title. Disable for partial matching (finds pages containing your search term).": "Habilite esto para encontrar páginas con exactamente el mismo título. Desactivar para coincidencia parcial (encuentra páginas que contengan su término de búsqueda).",
|
||||
"How many pages to return at most (between 1 and 100)": "Cuántas páginas devolver como máximo (entre 1 y 100)",
|
||||
"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.",
|
||||
"GET": "RECOGER",
|
||||
"POST": "POST",
|
||||
"PATCH": "PATCH",
|
||||
"PUT": "PUT",
|
||||
"DELETE": "BORRAR",
|
||||
"HEAD": "LIMPIO",
|
||||
"New Database Item": "Nuevo elemento de base de datos",
|
||||
"Updated Database Item": "Artículo de base de datos actualizado",
|
||||
"New Comment": "Nuevo comentario",
|
||||
"Updated Page": "Página actualizada",
|
||||
"Triggers when an item is added to a database.": "Dispara cuando un elemento se agrega a una base de datos.",
|
||||
"Triggers when an item is updated in a database.": "Dispara cuando un elemento se actualiza en una base de datos.",
|
||||
"Triggers whenever someone adds a new comment to a specific Notion page. Perfect for notifications, review workflows, or automated responses to team feedback.": "Dispara cuando alguien agrega un nuevo comentario a una página de Noción específica. Perfecto para notificaciones, revisar flujos de trabajo o respuestas automatizadas a los comentarios del equipo.",
|
||||
"Triggers whenever any page in your Notion workspace is modified or updated. Ideal for syncing content changes, backup processes, or notifying teams about documentation updates.": "Dispara cuando cualquier página en su espacio de trabajo de Noción es modificada o actualizada. Ideal para sincronizar cambios de contenido, procesos de copia de seguridad o notificar a los equipos sobre actualizaciones de documentación."
|
||||
}
|
||||
@@ -0,0 +1,79 @@
|
||||
{
|
||||
"The all-in-one workspace": "L'espace de travail tout-en-un",
|
||||
"Create Database Item": "Créer un élément de base de données",
|
||||
"Update Database Item": "Mettre à jour l'élément de la base de données",
|
||||
"Find Database Item": "Trouver un élément de la base de données",
|
||||
"Create Page": "Créer une page",
|
||||
"Append to Page": "Ajouter à la page",
|
||||
"Get block content": "Obtenir le contenu du bloc",
|
||||
"Archive Database Item": "Archiver l'élément de la base de données",
|
||||
"Restore Database Item": "Restaurer l'élément de la base de données",
|
||||
"Add Comment": "Ajouter un commentaire",
|
||||
"Retrieve Database Structure": "Récupérer la structure de la base de données",
|
||||
"Get Page Comments": "Obtenir les commentaires de la page",
|
||||
"Find Page": "Rechercher une page",
|
||||
"Custom API Call": "Appel API personnalisé",
|
||||
"Add a new item to a Notion database with custom field values and optional content. Ideal for creating tasks, records, or entries in structured databases.": "Ajouter un nouvel élément à une base de données Notion avec des valeurs de champs personnalisés et du contenu optionnel. Idéal pour créer des tâches, des enregistrements ou des entrées dans des bases de données structurées.",
|
||||
"Update specific fields in a Notion database item. Perfect for maintaining data, tracking changes, or syncing information across systems.": "Mettre à jour des champs spécifiques dans une base de données Notion. Parfait pour maintenir les données, le suivi des modifications ou la synchronisation des informations entre les systèmes.",
|
||||
"Searches for an item in database by field.": "Recherche un élément dans la base de données par champ.",
|
||||
"Create a new Notion page as a sub-page with custom title and content. Perfect for organizing documentation, notes, or creating structured page hierarchies.": "Créez une nouvelle page Notion en tant que sous-page avec un titre et un contenu personnalisés. Idéal pour organiser la documentation, les notes ou créer des hiérarchies structurées de pages.",
|
||||
"Appends content to the end of a page.": "Ajoute du contenu à la fin d'une page.",
|
||||
"Retrieve the actual content of a page (represented by blocks).": "Récupère le contenu réel d'une page (représenté par des blocs).",
|
||||
"Archive (soft-delete) a database item without permanently removing it. Archived items can be restored later if needed.": "Archive (soft-delete) un élément de la base de données sans le supprimer définitivement. Les éléments archivés peuvent être restaurés plus tard si nécessaire.",
|
||||
"Restore an archived database item back to active status. Perfect for recovering accidentally archived tasks, projects, or records.": "Restaurer un élément de base de données archivé à l'état actif. Parfait pour récupérer des tâches, des projets ou des enregistrements archivés accidentellement.",
|
||||
"Add a comment to any Notion page to start discussions, provide feedback, or leave notes for team collaboration.": "Ajoutez un commentaire à n'importe quelle page Notion pour commencer les discussions, fournir des commentaires ou laisser des notes pour la collaboration de l'équipe.",
|
||||
"Get detailed information about a Notion database including all its properties, field types, and configuration. Perfect for building dynamic forms, validation rules, or understanding database schemas.": "Obtenir des informations détaillées sur une base de données Notion incluant toutes ses propriétés, types de champs et configuration. Idéal pour construire des formulaires dynamiques, des règles de validation ou pour comprendre les schémas de base de données.",
|
||||
"Retrieve all comments from a Notion page, organized by discussion threads. Perfect for tracking feedback, managing reviews, or monitoring page discussions.": "Récupérez tous les commentaires d'une page Notion, organisée par fil de discussion. Parfait pour suivre les commentaires, gérer les commentaires ou surveiller les discussions de pages.",
|
||||
"Search for Notion pages by title with flexible matching options. Perfect for finding specific pages, building page references, or creating automated workflows based on page discovery.": "Rechercher des pages de notion par titre avec des options de correspondance flexibles. Idéal pour trouver des pages spécifiques, créer des références de pages ou créer des flux de travail automatisés basés sur la découverte de pages.",
|
||||
"Make a custom API call to a specific endpoint": "Passez un appel API personnalisé à un point de terminaison spécifique",
|
||||
"Database": "Base de données",
|
||||
"Fields": "Champs",
|
||||
"Content": "Contenus",
|
||||
"Database Item": "Élément de la base de données",
|
||||
"Page": "Page",
|
||||
"Title": "Titre de la page",
|
||||
"Page or parent block ID": "ID de la page ou du bloc parent",
|
||||
"Markdown": "Markdown",
|
||||
"Dynamic properties": "Propriétés dynamiques",
|
||||
"Archived Item": "Élément archivé",
|
||||
"Comment Text": "Texte du commentaire",
|
||||
"Page Title": "Titre de la page",
|
||||
"Exact Match": "Correspondance exacte",
|
||||
"Maximum Results": "Nombre maximum de résultats",
|
||||
"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)",
|
||||
"Choose the Notion database you want to work with from your workspace": "Choisissez la base de données avec laquelle vous souhaitez travailler depuis votre espace de travail",
|
||||
"The content you want to append to your item.": "Le contenu que vous souhaitez ajouter à votre objet.",
|
||||
"Select the item you want to update": "Sélectionnez l'élément que vous souhaitez mettre à jour",
|
||||
"Choose the Notion page you want to work with. This list shows your 100 most recently edited pages for easy selection.": "Choisissez la page de Notion avec laquelle vous voulez travailler. Cette liste montre vos 100 pages les plus récemment modifiées pour une sélection facile.",
|
||||
"The title of the page.": "Le titre de la page.",
|
||||
"The content of the page.": "Le contenu de la page.",
|
||||
"The content you want to append. You can use markdown formatting.": "Le contenu que vous souhaitez ajouter. Vous pouvez utiliser le formatage markdown.",
|
||||
"Convert Notion JSON blocks to Markdown": "Convertir les blocs Notion JSON en Markdown",
|
||||
"Choose which archived item to restore from the selected database": "Choisir quel élément archivé restaurer à partir de la base de données sélectionnée",
|
||||
"Enter your comment text. Supports plain text and will be posted as a new comment thread on the selected page.": "Entrez votre texte de commentaire. Supporte le texte brut et sera posté comme un nouveau fil de discussion sur la page sélectionnée.",
|
||||
"Enter the page title or part of the title you want to search for": "Entrez le titre de la page ou une partie du titre que vous souhaitez rechercher",
|
||||
"Enable this to find pages with exactly the same title. Disable for partial matching (finds pages containing your search term).": "Activez cette option pour trouver des pages avec exactement le même titre. Désactivez pour la correspondance partielle (trouve des pages contenant votre terme de recherche).",
|
||||
"How many pages to return at most (between 1 and 100)": "Combien de pages retourner au maximum (entre 1 et 100)",
|
||||
"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.",
|
||||
"GET": "OBTENIR",
|
||||
"POST": "POSTER",
|
||||
"PATCH": "PATCH",
|
||||
"PUT": "EFFACER",
|
||||
"DELETE": "SUPPRIMER",
|
||||
"HEAD": "TÊTE",
|
||||
"New Database Item": "Nouvel élément de la base de données",
|
||||
"Updated Database Item": "Élément de la base de données mis à jour",
|
||||
"New Comment": "Nouveau commentaire",
|
||||
"Updated Page": "Page mise à jour",
|
||||
"Triggers when an item is added to a database.": "Déclenche lorsqu'un élément est ajouté à une base de données.",
|
||||
"Triggers when an item is updated in a database.": "Déclenche lorsqu'un élément est mis à jour dans une base de données.",
|
||||
"Triggers whenever someone adds a new comment to a specific Notion page. Perfect for notifications, review workflows, or automated responses to team feedback.": "Déclenche chaque fois que quelqu'un ajoute un nouveau commentaire à une page de Notion spécifique. Parfait pour les notifications, les flux de travail de révision ou les réponses automatisées aux commentaires de l'équipe.",
|
||||
"Triggers whenever any page in your Notion workspace is modified or updated. Ideal for syncing content changes, backup processes, or notifying teams about documentation updates.": "Déclenche chaque fois qu'une page de votre espace de travail Notion est modifiée ou mise à jour. Idéal pour synchroniser les changements de contenu, les processus de sauvegarde ou pour notifier les équipes des mises à jour de la documentation."
|
||||
}
|
||||
@@ -0,0 +1,52 @@
|
||||
{
|
||||
"Notion": "Notion",
|
||||
"The all-in-one workspace": "The all-in-one workspace",
|
||||
"Create Database Item": "Create Database Item",
|
||||
"Update Database Item": "Update Database Item",
|
||||
"Find Database Item": "Find Database Item",
|
||||
"Create Page": "Create Page",
|
||||
"Append to Page": "Append to Page",
|
||||
"Get block content": "Get block content",
|
||||
"Custom API Call": "Custom API Call",
|
||||
"Creates an item in a database.": "Creates an item in a database.",
|
||||
"Updates an item in database": "Updates an item in database",
|
||||
"Searches for an item in database by field.": "Searches for an item in database by field.",
|
||||
"Create a page under a parent page.": "Create a page under a parent page.",
|
||||
"Appends content to the end of a page.": "Appends content to the end of a page.",
|
||||
"Retrieve the actual content of a page (represented by blocks).": "Retrieve the actual content of a page (represented by blocks).",
|
||||
"Make a custom API call to a specific endpoint": "Make a custom API call to a specific endpoint",
|
||||
"Database": "Database",
|
||||
"Fields": "Fields",
|
||||
"Content": "Content",
|
||||
"Database Item": "Database Item",
|
||||
"Page": "Page",
|
||||
"Title": "Title",
|
||||
"Page or parent block ID": "Page or parent block ID",
|
||||
"Markdown": "Markdown",
|
||||
"Dynamic properties": "Dynamic properties",
|
||||
"Method": "Method",
|
||||
"Headers": "Headers",
|
||||
"Query Parameters": "Query Parameters",
|
||||
"Body": "Body",
|
||||
"No Error on Failure": "No Error on Failure",
|
||||
"Timeout (in seconds)": "Timeout (in seconds)",
|
||||
"Select the database you want to use": "Select the database you want to use",
|
||||
"The content you want to append to your item.": "The content you want to append to your item.",
|
||||
"Select the item you want to update": "Select the item you want to update",
|
||||
"Select the page you want to use. Only your most recently edited 100 pages will appear.": "Select the page you want to use. Only your most recently edited 100 pages will appear.",
|
||||
"The title of the page.": "The title of the page.",
|
||||
"The content of the page.": "The content of the page.",
|
||||
"The content you want to append. You can use markdown formatting.": "The content you want to append. You can use markdown formatting.",
|
||||
"Convert Notion JSON blocks to Markdown": "Convert Notion JSON blocks to Markdown",
|
||||
"Authorization headers are injected automatically from your connection.": "Authorization headers are injected automatically from your connection.",
|
||||
"GET": "GET",
|
||||
"POST": "POST",
|
||||
"PATCH": "PATCH",
|
||||
"PUT": "PUT",
|
||||
"DELETE": "DELETE",
|
||||
"HEAD": "HEAD",
|
||||
"New Database Item": "New Database Item",
|
||||
"Updated Database Item": "Updated Database Item",
|
||||
"Triggers when an item is added to a database.": "Triggers when an item is added to a database.",
|
||||
"Triggers when an item is updated in a database.": "Triggers when an item is updated in a database."
|
||||
}
|
||||
@@ -0,0 +1,52 @@
|
||||
{
|
||||
"Notion": "Notion",
|
||||
"The all-in-one workspace": "The all-in-one workspace",
|
||||
"Create Database Item": "Create Database Item",
|
||||
"Update Database Item": "Update Database Item",
|
||||
"Find Database Item": "Find Database Item",
|
||||
"Create Page": "Create Page",
|
||||
"Append to Page": "Append to Page",
|
||||
"Get block content": "Get block content",
|
||||
"Custom API Call": "Custom API Call",
|
||||
"Creates an item in a database.": "Creates an item in a database.",
|
||||
"Updates an item in database": "Updates an item in database",
|
||||
"Searches for an item in database by field.": "Searches for an item in database by field.",
|
||||
"Create a page under a parent page.": "Create a page under a parent page.",
|
||||
"Appends content to the end of a page.": "Appends content to the end of a page.",
|
||||
"Retrieve the actual content of a page (represented by blocks).": "Retrieve the actual content of a page (represented by blocks).",
|
||||
"Make a custom API call to a specific endpoint": "Make a custom API call to a specific endpoint",
|
||||
"Database": "Database",
|
||||
"Fields": "Fields",
|
||||
"Content": "Content",
|
||||
"Database Item": "Database Item",
|
||||
"Page": "Page",
|
||||
"Title": "Title",
|
||||
"Page or parent block ID": "Page or parent block ID",
|
||||
"Markdown": "Markdown",
|
||||
"Dynamic properties": "Dynamic properties",
|
||||
"Method": "Method",
|
||||
"Headers": "Headers",
|
||||
"Query Parameters": "Query Parameters",
|
||||
"Body": "Body",
|
||||
"No Error on Failure": "No Error on Failure",
|
||||
"Timeout (in seconds)": "Timeout (in seconds)",
|
||||
"Select the database you want to use": "Select the database you want to use",
|
||||
"The content you want to append to your item.": "The content you want to append to your item.",
|
||||
"Select the item you want to update": "Select the item you want to update",
|
||||
"Select the page you want to use. Only your most recently edited 100 pages will appear.": "Select the page you want to use. Only your most recently edited 100 pages will appear.",
|
||||
"The title of the page.": "The title of the page.",
|
||||
"The content of the page.": "The content of the page.",
|
||||
"The content you want to append. You can use markdown formatting.": "The content you want to append. You can use markdown formatting.",
|
||||
"Convert Notion JSON blocks to Markdown": "Convert Notion JSON blocks to Markdown",
|
||||
"Authorization headers are injected automatically from your connection.": "Authorization headers are injected automatically from your connection.",
|
||||
"GET": "GET",
|
||||
"POST": "POST",
|
||||
"PATCH": "PATCH",
|
||||
"PUT": "PUT",
|
||||
"DELETE": "DELETE",
|
||||
"HEAD": "HEAD",
|
||||
"New Database Item": "New Database Item",
|
||||
"Updated Database Item": "Updated Database Item",
|
||||
"Triggers when an item is added to a database.": "Triggers when an item is added to a database.",
|
||||
"Triggers when an item is updated in a database.": "Triggers when an item is updated in a database."
|
||||
}
|
||||
@@ -0,0 +1,79 @@
|
||||
{
|
||||
"The all-in-one workspace": "オールインワンワークスペース",
|
||||
"Create Database Item": "データベース項目を作成",
|
||||
"Update Database Item": "データベース項目を更新",
|
||||
"Find Database Item": "データベースアイテムを検索",
|
||||
"Create Page": "ページを作成",
|
||||
"Append to Page": "ページに追加",
|
||||
"Get block content": "ブロック内容を取得する",
|
||||
"Archive Database Item": "データベースアイテムをアーカイブ",
|
||||
"Restore Database Item": "データベースアイテムを復元",
|
||||
"Add Comment": "コメントを追加",
|
||||
"Retrieve Database Structure": "データベース構造の取得",
|
||||
"Get Page Comments": "ページコメントを取得",
|
||||
"Find Page": "ページを検索",
|
||||
"Custom API Call": "カスタムAPI通話",
|
||||
"Add a new item to a Notion database with custom field values and optional content. Ideal for creating tasks, records, or entries in structured databases.": "カスタムフィールドの値と任意のコンテンツを持つNotionデータベースに新しいアイテムを追加します。構造化されたデータベース内のタスク、レコード、またはエントリの作成に最適です。",
|
||||
"Update specific fields in a Notion database item. Perfect for maintaining data, tracking changes, or syncing information across systems.": "Notionデータベース項目内の特定のフィールドを更新します。データの管理、変更の追跡、システム間での情報の同期に最適です。",
|
||||
"Searches for an item in database by field.": "フィールド別にデータベース内の項目を検索します。",
|
||||
"Create a new Notion page as a sub-page with custom title and content. Perfect for organizing documentation, notes, or creating structured page hierarchies.": "カスタムタイトルとコンテンツを持つサブページとして新しいノートページを作成します。ドキュメント、メモ、構造化されたページ階層の作成に最適です。",
|
||||
"Appends content to the end of a page.": "ページの最後にコンテンツを追加します。",
|
||||
"Retrieve the actual content of a page (represented by blocks).": "ページの実際のコンテンツを取得します (ブロックで表されます)。",
|
||||
"Archive (soft-delete) a database item without permanently removing it. Archived items can be restored later if needed.": "データベース項目を永久に削除せずにアーカイブ(ソフト削除)します。アーカイブされた項目は必要に応じて後で復元できます。",
|
||||
"Restore an archived database item back to active status. Perfect for recovering accidentally archived tasks, projects, or records.": "アーカイブされたデータベース項目をアクティブな状態に戻します。誤ってアーカイブされたタスク、プロジェクト、または記録を回復するのに最適です。",
|
||||
"Add a comment to any Notion page to start discussions, provide feedback, or leave notes for team collaboration.": "コメントを任意のformat@@0ページに追加すると、ディスカッションを開始したり、フィードバックを提供したり、チームのコラボレーションのためにノートを残すことができます。",
|
||||
"Get detailed information about a Notion database including all its properties, field types, and configuration. Perfect for building dynamic forms, validation rules, or understanding database schemas.": "すべてのプロパティ、フィールドタイプ、および構成を含むNotionデータベースに関する詳細情報を取得します。 ダイナミックフォームの構築、バリデーションルール、データベーススキーマの理解に最適です。",
|
||||
"Retrieve all comments from a Notion page, organized by discussion threads. Perfect for tracking feedback, managing reviews, or monitoring page discussions.": "ディスカッションスレッドごとに整理された、Notionページからすべてのコメントを取得します。フィードバックの追跡、レビューの管理、ページディスカッションの監視に最適です。",
|
||||
"Search for Notion pages by title with flexible matching options. Perfect for finding specific pages, building page references, or creating automated workflows based on page discovery.": "柔軟なマッチングオプションを持つタイトルでノートページを検索します。 特定のページを見つける、ページ参照を構築する、またはページディスカバリに基づいて自動ワークフローを作成するのに最適です。",
|
||||
"Make a custom API call to a specific endpoint": "特定のエンドポイントへのカスタム API コールを実行します。",
|
||||
"Database": "データベース",
|
||||
"Fields": "フィールド",
|
||||
"Content": "コンテンツ",
|
||||
"Database Item": "データベース項目",
|
||||
"Page": "ページ",
|
||||
"Title": "タイトル",
|
||||
"Page or parent block ID": "ページまたは親ブロックID",
|
||||
"Markdown": "Markdown",
|
||||
"Dynamic properties": "動的プロパティ",
|
||||
"Archived Item": "アーカイブされたアイテム",
|
||||
"Comment Text": "コメントテキスト",
|
||||
"Page Title": "ページタイトル",
|
||||
"Exact Match": "完全一致",
|
||||
"Maximum Results": "最大結果",
|
||||
"Method": "方法",
|
||||
"Headers": "ヘッダー",
|
||||
"Query Parameters": "クエリパラメータ",
|
||||
"Body": "本文",
|
||||
"Response is Binary ?": "応答はバイナリですか?",
|
||||
"No Error on Failure": "失敗時にエラーはありません",
|
||||
"Timeout (in seconds)": "タイムアウト(秒)",
|
||||
"Choose the Notion database you want to work with from your workspace": "ワークスペースで作業したいNotionデータベースを選択してください",
|
||||
"The content you want to append to your item.": "アイテムに追加したいコンテンツ。",
|
||||
"Select the item you want to update": "更新したいアイテムを選択してください",
|
||||
"Choose the Notion page you want to work with. This list shows your 100 most recently edited pages for easy selection.": "操作したいノートページを選択します。このリストには、簡単に選択できるように、最新の編集済みページが100ページ表示されます。",
|
||||
"The title of the page.": "ページのタイトル",
|
||||
"The content of the page.": "ページの内容。",
|
||||
"The content you want to append. You can use markdown formatting.": "追加したいコンテンツ。マークダウン形式を使用できます。",
|
||||
"Convert Notion JSON blocks to Markdown": "Notion JSONブロックをMarkdownに変換",
|
||||
"Choose which archived item to restore from the selected database": "選択したデータベースから復元するアーカイブアイテムを選択してください",
|
||||
"Enter your comment text. Supports plain text and will be posted as a new comment thread on the selected page.": "コメントのテキストを入力します。プレーンテキストをサポートし、選択したページに新しいコメントスレッドとして投稿されます。",
|
||||
"Enter the page title or part of the title you want to search for": "検索したいタイトルまたはタイトルの一部を入力してください",
|
||||
"Enable this to find pages with exactly the same title. Disable for partial matching (finds pages containing your search term).": "これを有効にすると、全く同じタイトルのページを見つけることができます。部分一致(検索語を含むページを検索)を無効にします。",
|
||||
"How many pages to return at most (between 1 and 100)": "返却するページ数(1~100ページ)",
|
||||
"Authorization headers are injected automatically from your connection.": "認証ヘッダは接続から自動的に注入されます。",
|
||||
"Enable for files like PDFs, images, etc..": "PDF、画像などのファイルを有効にします。",
|
||||
"GET": "取得",
|
||||
"POST": "POST",
|
||||
"PATCH": "PATCH",
|
||||
"PUT": "PUT",
|
||||
"DELETE": "削除",
|
||||
"HEAD": "頭",
|
||||
"New Database Item": "新しいデータベース項目",
|
||||
"Updated Database Item": "データベース項目を更新しました",
|
||||
"New Comment": "新しいコメント",
|
||||
"Updated Page": "更新されたページ",
|
||||
"Triggers when an item is added to a database.": "アイテムがデータベースに追加されたときにトリガーします。",
|
||||
"Triggers when an item is updated in a database.": "データベースでアイテムが更新されたときにトリガーします。",
|
||||
"Triggers whenever someone adds a new comment to a specific Notion page. Perfect for notifications, review workflows, or automated responses to team feedback.": "特定の通知ページに新しいコメントを追加するたびにトリガーします。通知、ワークフローの確認、チームのフィードバックへの自動応答に最適です。",
|
||||
"Triggers whenever any page in your Notion workspace is modified or updated. Ideal for syncing content changes, backup processes, or notifying teams about documentation updates.": "ノートワークスペースのページが変更または更新されるたびにトリガーされます。コンテンツの変更、バックアッププロセスの同期、ドキュメントの更新についてチームに通知するのに最適です。"
|
||||
}
|
||||
@@ -0,0 +1,79 @@
|
||||
{
|
||||
"The all-in-one workspace": "De alles-in-één werkruimte",
|
||||
"Create Database Item": "Maak Database Item",
|
||||
"Update Database Item": "Database item bijwerken",
|
||||
"Find Database Item": "Database item zoeken",
|
||||
"Create Page": "Pagina maken",
|
||||
"Append to Page": "Aan pagina toevoegen",
|
||||
"Get block content": "Verkrijg blokinhoud",
|
||||
"Archive Database Item": "Archiveer Database Item",
|
||||
"Restore Database Item": "Herstel Database Item",
|
||||
"Add Comment": "Opmerking toevoegen",
|
||||
"Retrieve Database Structure": "Database structuur ophalen",
|
||||
"Get Page Comments": "Opmerkingen op pagina krijgen",
|
||||
"Find Page": "Pagina zoeken",
|
||||
"Custom API Call": "Custom API Call",
|
||||
"Add a new item to a Notion database with custom field values and optional content. Ideal for creating tasks, records, or entries in structured databases.": "Een nieuw item toevoegen aan een Notion database met aangepaste veldwaarden en optionele inhoud. Ideaal voor het maken van taken, records of items in gestructureerde databases.",
|
||||
"Update specific fields in a Notion database item. Perfect for maintaining data, tracking changes, or syncing information across systems.": "Werk specifieke velden bij in een Notion database item. Perfect voor het bewaren van gegevens, het bijhouden van wijzigingen of het synchroniseren van informatie tussen systemen.",
|
||||
"Searches for an item in database by field.": "Zoekt naar een item in database op basis van veld.",
|
||||
"Create a new Notion page as a sub-page with custom title and content. Perfect for organizing documentation, notes, or creating structured page hierarchies.": "Creëer een nieuwe notitiepagina als subpagina met aangepaste titel en inhoud. Perfect voor het organiseren van documentatie, aantekeningen of het creëren van gestructureerde paginacormen.",
|
||||
"Appends content to the end of a page.": "Voegt inhoud toe aan het einde van een pagina.",
|
||||
"Retrieve the actual content of a page (represented by blocks).": "Haal de werkelijke inhoud van een pagina op (weergegeven door blokken).",
|
||||
"Archive (soft-delete) a database item without permanently removing it. Archived items can be restored later if needed.": "Archiveer (soft-delete) een databaseitem zonder deze permanent te verwijderen. Gearchiveerde items kunnen later worden teruggezet indien nodig.",
|
||||
"Restore an archived database item back to active status. Perfect for recovering accidentally archived tasks, projects, or records.": "Herstel een gearchiveerd databaseitem terug naar een actieve status. Perfect voor het herstellen van per ongeluk gearchiveerde taken, projecten of records.",
|
||||
"Add a comment to any Notion page to start discussions, provide feedback, or leave notes for team collaboration.": "Voeg een opmerking toe aan een willekeurige Notion pagina om discussies te beginnen, feedback te geven, of notities voor teamsamenwerking te maken.",
|
||||
"Get detailed information about a Notion database including all its properties, field types, and configuration. Perfect for building dynamic forms, validation rules, or understanding database schemas.": "Krijg gedetailleerde informatie over een Notion database inclusief al zijn eigenschappen, veldtypes en configuratie. Perfect voor het maken van dynamische formulieren, validatieregels of het begrijpen van databaseschema's.",
|
||||
"Retrieve all comments from a Notion page, organized by discussion threads. Perfect for tracking feedback, managing reviews, or monitoring page discussions.": "Haal alle reacties op van een Notie pagina, georganiseerd door discussiethreads. Perfect voor het volgen van feedback, het beheren van beoordelingen of het monitoren van discussies over pagina's",
|
||||
"Search for Notion pages by title with flexible matching options. Perfect for finding specific pages, building page references, or creating automated workflows based on page discovery.": "Zoek voor Notie pagina's op titel met flexibele overeenkomende opties. Perfect voor het vinden van specifieke pagina's, het bouwen van pagina-referenties of het maken van geautomatiseerde workflows op basis van pagina-ontdekking.",
|
||||
"Make a custom API call to a specific endpoint": "Maak een aangepaste API call naar een specifiek eindpunt",
|
||||
"Database": "Database",
|
||||
"Fields": "Velden",
|
||||
"Content": "Inhoud",
|
||||
"Database Item": "Database Item",
|
||||
"Page": "Pagina",
|
||||
"Title": "Aanspreektitel",
|
||||
"Page or parent block ID": "Pagina of bovenliggende blok-ID",
|
||||
"Markdown": "Markdown",
|
||||
"Dynamic properties": "Dynamische eigenschappen",
|
||||
"Archived Item": "Gearchiveerd item",
|
||||
"Comment Text": "Commentaar tekst",
|
||||
"Page Title": "Pagina Titel",
|
||||
"Exact Match": "Exacte overeenkomst",
|
||||
"Maximum Results": "Maximaal aantal resultaten",
|
||||
"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)",
|
||||
"Choose the Notion database you want to work with from your workspace": "Kies de Notie database waarmee u wilt werken uit uw werkruimte",
|
||||
"The content you want to append to your item.": "De inhoud die je aan je item wilt toevoegen.",
|
||||
"Select the item you want to update": "Selecteer het item dat u wilt bijwerken",
|
||||
"Choose the Notion page you want to work with. This list shows your 100 most recently edited pages for easy selection.": "Kies de notie pagina waarmee u wilt werken. Deze lijst toont uw 100 laatst bewerkte pagina's voor eenvoudige selectie.",
|
||||
"The title of the page.": "De titel van de pagina.",
|
||||
"The content of the page.": "De inhoud van de pagina.",
|
||||
"The content you want to append. You can use markdown formatting.": "De inhoud die je wilt toevoegen. Je kunt de markdown opmaak gebruiken.",
|
||||
"Convert Notion JSON blocks to Markdown": "Zet JSON blokken om naar Markdown",
|
||||
"Choose which archived item to restore from the selected database": "Kies welk gearchiveerd item moet worden teruggezet uit de geselecteerde database",
|
||||
"Enter your comment text. Supports plain text and will be posted as a new comment thread on the selected page.": "Voer uw commentaar tekst in. Ondersteunt platte tekst en zal worden geplaatst als een nieuwe reactiethread op de geselecteerde pagina.",
|
||||
"Enter the page title or part of the title you want to search for": "Voer de paginatitel in of een deel van de titel waarnaar u wilt zoeken",
|
||||
"Enable this to find pages with exactly the same title. Disable for partial matching (finds pages containing your search term).": "Schakel dit in om pagina's met exact dezelfde titel te vinden. Uitschakelen voor gedeeltelijke overeenkomende (vondspagina's die uw zoekterm bevatten).",
|
||||
"How many pages to return at most (between 1 and 100)": "Hoeveel pagina's maximaal retourneren (tussen 1 en 100)",
|
||||
"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..",
|
||||
"GET": "KRIJG",
|
||||
"POST": "POSTE",
|
||||
"PATCH": "BEKIJK",
|
||||
"PUT": "PUT",
|
||||
"DELETE": "VERWIJDEREN",
|
||||
"HEAD": "HOOFD",
|
||||
"New Database Item": "Nieuw Database Item",
|
||||
"Updated Database Item": "Bijgewerkt Database Item",
|
||||
"New Comment": "Nieuwe reactie",
|
||||
"Updated Page": "Pagina bijgewerkt",
|
||||
"Triggers when an item is added to a database.": "Triggert wanneer een artikel is toegevoegd aan een database.",
|
||||
"Triggers when an item is updated in a database.": "Triggert wanneer een item wordt bijgewerkt in een database.",
|
||||
"Triggers whenever someone adds a new comment to a specific Notion page. Perfect for notifications, review workflows, or automated responses to team feedback.": "Triggert wanneer iemand een nieuwe reactie toevoegt aan een specifieke notitiepagina. Perfect voor meldingen, review workflows, of geautomatiseerde reacties op teamfeedback.",
|
||||
"Triggers whenever any page in your Notion workspace is modified or updated. Ideal for syncing content changes, backup processes, or notifying teams about documentation updates.": "Triggers wanneer een pagina in uw kenniswerkruimte is gewijzigd of bijgewerkt. Ideaal voor het synchroniseren van inhoudwijzigingen, back-upprocessen of het informeren van teams over documentatie-updates."
|
||||
}
|
||||
@@ -0,0 +1,79 @@
|
||||
{
|
||||
"The all-in-one workspace": "O espaço de trabalho tudo-em-um",
|
||||
"Create Database Item": "Criar Banco de Dados",
|
||||
"Update Database Item": "Atualizar Item do Banco de Dados",
|
||||
"Find Database Item": "Localizar Banco de Dados",
|
||||
"Create Page": "Criar página",
|
||||
"Append to Page": "Acrescentar à página",
|
||||
"Get block content": "Obter conteúdo do bloco",
|
||||
"Archive Database Item": "Arquivo de banco de dados",
|
||||
"Restore Database Item": "Restaurar Banco de Dados",
|
||||
"Add Comment": "Adicionar comentário",
|
||||
"Retrieve Database Structure": "Recuperar estrutura de banco de dados",
|
||||
"Get Page Comments": "Obter Comentários da Página",
|
||||
"Find Page": "Encontrar página",
|
||||
"Custom API Call": "Chamada de API personalizada",
|
||||
"Add a new item to a Notion database with custom field values and optional content. Ideal for creating tasks, records, or entries in structured databases.": "Adicionar um novo item a um Notion database com valores de campo personalizados e conteúdo opcional. Ideal para a criação de tarefas, registros ou entradas em bancos de dados estruturados.",
|
||||
"Update specific fields in a Notion database item. Perfect for maintaining data, tracking changes, or syncing information across systems.": "Atualizar campos específicos em um item do banco de dados Notion. Perfeito para manter dados, alterações de rastreamento ou sincronização de informações entre sistemas.",
|
||||
"Searches for an item in database by field.": "Procura um item no banco de dados por campo.",
|
||||
"Create a new Notion page as a sub-page with custom title and content. Perfect for organizing documentation, notes, or creating structured page hierarchies.": "Criar uma nova página de Noções como uma sub-página com título e conteúdo personalizado. Perfeito para organizar documentação, notas ou criar hierarquias estruturadas de páginas.",
|
||||
"Appends content to the end of a page.": "Anexa o conteúdo para o final de uma página.",
|
||||
"Retrieve the actual content of a page (represented by blocks).": "Recuperar o conteúdo real de uma página (representado por blocos).",
|
||||
"Archive (soft-delete) a database item without permanently removing it. Archived items can be restored later if needed.": "Arquivar (soft-delete) um item do banco de dados sem removê-lo permanentemente. Itens arquivados podem ser restaurados mais tarde, se necessário.",
|
||||
"Restore an archived database item back to active status. Perfect for recovering accidentally archived tasks, projects, or records.": "Restaurar um item do banco de dados arquivado de volta para o estado ativo. Perfeito para recuperar tarefas, projetos ou registros acidentalmente arquivados.",
|
||||
"Add a comment to any Notion page to start discussions, provide feedback, or leave notes for team collaboration.": "Adicione um comentário a qualquer página de Noções para iniciar discussões, dar feedback ou deixar anotações para a colaboração em equipe.",
|
||||
"Get detailed information about a Notion database including all its properties, field types, and configuration. Perfect for building dynamic forms, validation rules, or understanding database schemas.": "Obter informações detalhadas sobre um banco de dados Notion incluindo todas as suas propriedades, tipos de campo e configuração. Perfeito para construir formulários dinâmicos, regras de validação ou compreensão de esquemas de banco de dados.",
|
||||
"Retrieve all comments from a Notion page, organized by discussion threads. Perfect for tracking feedback, managing reviews, or monitoring page discussions.": "Recuperar todos os comentários de uma página de noção, organizada por tópicos de discussão. Perfeito para o rastreamento de comentários, gerenciamento de análises ou discussões na página de monitoramento.",
|
||||
"Search for Notion pages by title with flexible matching options. Perfect for finding specific pages, building page references, or creating automated workflows based on page discovery.": "Pesquise as páginas de Notação por título com opções de correspondência flexíveis. Perfeito para encontrar páginas específicas, construir referências de página ou criar fluxos de trabalho automatizados baseados na descoberta da página.",
|
||||
"Make a custom API call to a specific endpoint": "Faça uma chamada de API personalizada para um ponto de extremidade específico",
|
||||
"Database": "Banco",
|
||||
"Fields": "campos",
|
||||
"Content": "Conteúdo",
|
||||
"Database Item": "Item do banco",
|
||||
"Page": "Página",
|
||||
"Title": "Título",
|
||||
"Page or parent block ID": "Página ou ID do bloco pai",
|
||||
"Markdown": "Markdown",
|
||||
"Dynamic properties": "Propriedades dinâmicas",
|
||||
"Archived Item": "Item Arquivado",
|
||||
"Comment Text": "Texto do comentário",
|
||||
"Page Title": "Título da página",
|
||||
"Exact Match": "Partida exata",
|
||||
"Maximum Results": "Resultados máximos",
|
||||
"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)",
|
||||
"Choose the Notion database you want to work with from your workspace": "Escolha a base de dados Notion com a qual deseja trabalhar a partir do seu espaço de trabalho",
|
||||
"The content you want to append to your item.": "O conteúdo que você deseja adicionar ao seu item.",
|
||||
"Select the item you want to update": "Selecione o item que você deseja atualizar",
|
||||
"Choose the Notion page you want to work with. This list shows your 100 most recently edited pages for easy selection.": "Escolha a página de Notion com a qual você deseja trabalhar. Esta lista mostra as suas 100 páginas editadas mais recentemente para facilitar a seleção.",
|
||||
"The title of the page.": "O título da página.",
|
||||
"The content of the page.": "O conteúdo da página.",
|
||||
"The content you want to append. You can use markdown formatting.": "O conteúdo que você deseja adicionar. Você pode usar a formatação markdown.",
|
||||
"Convert Notion JSON blocks to Markdown": "Converter blocos JSON de notificação em Markdown",
|
||||
"Choose which archived item to restore from the selected database": "Escolha qual item arquivado para restaurar a partir do banco de dados selecionado",
|
||||
"Enter your comment text. Supports plain text and will be posted as a new comment thread on the selected page.": "Digite o texto do seu comentário. Suporta texto sem formatação e será publicado como um novo comentário na página selecionada.",
|
||||
"Enter the page title or part of the title you want to search for": "Digite o título da página ou parte do título que você deseja procurar",
|
||||
"Enable this to find pages with exactly the same title. Disable for partial matching (finds pages containing your search term).": "Ative isto para localizar páginas com exatamente o mesmo título. Desative para correspondência parcial (localiza páginas que contenham seu termo de pesquisa).",
|
||||
"How many pages to return at most (between 1 and 100)": "Quantas páginas devem retornar no máximo (entre 1 e 100)",
|
||||
"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..",
|
||||
"GET": "OBTER",
|
||||
"POST": "POSTAR",
|
||||
"PATCH": "COMPRAR",
|
||||
"PUT": "COLOCAR",
|
||||
"DELETE": "EXCLUIR",
|
||||
"HEAD": "CABEÇA",
|
||||
"New Database Item": "Novo Item do Banco de Dados",
|
||||
"Updated Database Item": "Banco de dados atualizado",
|
||||
"New Comment": "Novo Comentário",
|
||||
"Updated Page": "Página atualizada",
|
||||
"Triggers when an item is added to a database.": "Dispara quando um item é adicionado a um banco de dados.",
|
||||
"Triggers when an item is updated in a database.": "Dispara quando um item é atualizado em um banco de dados.",
|
||||
"Triggers whenever someone adds a new comment to a specific Notion page. Perfect for notifications, review workflows, or automated responses to team feedback.": "Aciona sempre que alguém adicionar um novo comentário em uma página de noções específica. Perfeito para notificações, fluxos de trabalho de revisão ou respostas automatizadas ao feedback da equipe.",
|
||||
"Triggers whenever any page in your Notion workspace is modified or updated. Ideal for syncing content changes, backup processes, or notifying teams about documentation updates.": "Aciona sempre que qualquer página no seu Espaço de Trabalho de Notion é modificada ou atualizada. Ideal para sincronizar alterações de conteúdo, processos de backup ou notificar as equipes sobre atualizações de documentação."
|
||||
}
|
||||
@@ -0,0 +1,78 @@
|
||||
{
|
||||
"Notion": "Заметка",
|
||||
"The all-in-one workspace": "Все в одном проекте",
|
||||
"Create Database Item": "Создать элемент базы данных",
|
||||
"Update Database Item": "Обновить элемент базы данных",
|
||||
"Find Database Item": "Найти элемент базы данных",
|
||||
"Create Page": "Создать страницу",
|
||||
"Append to Page": "Добавить на страницу",
|
||||
"Get block content": "Получить содержимое блока",
|
||||
"Archive Database Item": "Элемент базы данных архивов",
|
||||
"Restore Database Item": "Восстановить элемент базы данных",
|
||||
"Add Comment": "Добавить комментарий",
|
||||
"Retrieve Database Structure": "Получить структуру базы данных",
|
||||
"Get Page Comments": "Получить комментарии к странице",
|
||||
"Find Page": "Найти страницу",
|
||||
"Custom API Call": "Пользовательский вызов API",
|
||||
"Add a new item to a Notion database with custom field values and optional content. Ideal for creating tasks, records, or entries in structured databases.": "Добавление нового элемента в базу данных узлов с пользовательскими значениями полей и необязательным содержимым. Идеально подходит для создания задач, записей или записей в структурированных базах данных.",
|
||||
"Update specific fields in a Notion database item. Perfect for maintaining data, tracking changes, or syncing information across systems.": "Обновите конкретные поля в элементе базы данных Notion. Идеально подходит для поддержания данных, отслеживания изменений или синхронизации информации между системами.",
|
||||
"Searches for an item in database by field.": "Поиск элемента в базе данных по полям.",
|
||||
"Create a new Notion page as a sub-page with custom title and content. Perfect for organizing documentation, notes, or creating structured page hierarchies.": "Создать новую страницу Notion как подстраницу с пользовательским заголовком и содержимым. Идеально подходит для организации документации, заметок или создания структурированных иерархий страниц.",
|
||||
"Appends content to the end of a page.": "Добавляет содержимое в конец страницы.",
|
||||
"Retrieve the actual content of a page (represented by blocks).": "Получить фактическое содержимое страницы (представлено блоками).",
|
||||
"Archive (soft-delete) a database item without permanently removing it. Archived items can be restored later if needed.": "Архив (мягкое удаление) элемента базы данных, не удаляя его навсегда. Архивные элементы могут быть восстановлены позже, если необходимо.",
|
||||
"Restore an archived database item back to active status. Perfect for recovering accidentally archived tasks, projects, or records.": "Восстановить архивный элемент базы данных обратно в активное состояние. Идеально подходит для восстановления случайно архивированных задач, проектов или записей.",
|
||||
"Add a comment to any Notion page to start discussions, provide feedback, or leave notes for team collaboration.": "Добавьте комментарий на любую страницу Notion, чтобы начать обсуждения, оставить отзыв или заметки о сотрудничестве команды.",
|
||||
"Get detailed information about a Notion database including all its properties, field types, and configuration. Perfect for building dynamic forms, validation rules, or understanding database schemas.": "Получайте подробную информацию о базе данных Notion, включая все ее свойства, типы полей и конфигурации. Идеально подходит для построения динамических форм, правил проверки или понимания схем баз данных.",
|
||||
"Retrieve all comments from a Notion page, organized by discussion threads. Perfect for tracking feedback, managing reviews, or monitoring page discussions.": "Получить все комментарии со страницы Notion, организованной обсуждениями. Идеально подходит для отслеживания обратной связи, управления обзорами или обсуждений на странице мониторинга.",
|
||||
"Search for Notion pages by title with flexible matching options. Perfect for finding specific pages, building page references, or creating automated workflows based on page discovery.": "Поиск страниц Notion по названию с гибкими параметрами. Идеально подходит для поиска конкретных страниц, создания ссылок на страницы или создания автоматических рабочих процессов на основе поиска страниц.",
|
||||
"Make a custom API call to a specific endpoint": "Сделать пользовательский API вызов к определенной конечной точке",
|
||||
"Database": "База данных",
|
||||
"Fields": "Поля",
|
||||
"Content": "Содержание",
|
||||
"Database Item": "Элемент базы данных",
|
||||
"Page": "Страница",
|
||||
"Title": "Заголовок",
|
||||
"Page or parent block ID": "ID страницы или родительского блока",
|
||||
"Markdown": "Markdown",
|
||||
"Dynamic properties": "Динамические свойства",
|
||||
"Archived Item": "Архивированный элемент",
|
||||
"Comment Text": "Текст комментария",
|
||||
"Page Title": "Название страницы",
|
||||
"Exact Match": "Точное совпадение",
|
||||
"Maximum Results": "Максимальное количество результатов",
|
||||
"Method": "Метод",
|
||||
"Headers": "Заголовки",
|
||||
"Query Parameters": "Параметры запроса",
|
||||
"Body": "Тело",
|
||||
"No Error on Failure": "Нет ошибок при ошибке",
|
||||
"Timeout (in seconds)": "Таймаут (в секундах)",
|
||||
"Choose the Notion database you want to work with from your workspace": "Выберите базу данных Notion, с которой вы хотите работать из рабочей области",
|
||||
"The content you want to append to your item.": "Контент, который вы хотите добавить к элементу.",
|
||||
"Select the item you want to update": "Выберите элемент, который вы хотите обновить",
|
||||
"Choose the Notion page you want to work with. This list shows your 100 most recently edited pages for easy selection.": "Выберите страницу Notion, с которой вы хотите работать. Этот список показывает ваши 100 последних редактируемых страниц для легкого выбора.",
|
||||
"The title of the page.": "Заголовок страницы.",
|
||||
"The content of the page.": "Содержание страницы.",
|
||||
"The content you want to append. You can use markdown formatting.": "Контент, который вы хотите добавить. Вы можете использовать формат markdown.",
|
||||
"Convert Notion JSON blocks to Markdown": "Преобразовать блоки узла в Markdown",
|
||||
"Choose which archived item to restore from the selected database": "Выберите архивированный элемент для восстановления из выбранной базы данных",
|
||||
"Enter your comment text. Supports plain text and will be posted as a new comment thread on the selected page.": "Введите текст вашего комментария. Поддерживает простой текст и будет опубликован в качестве нового комментария на выбранной странице.",
|
||||
"Enter the page title or part of the title you want to search for": "Введите заголовок страницы или часть заголовка, который вы хотите искать",
|
||||
"Enable this to find pages with exactly the same title. Disable for partial matching (finds pages containing your search term).": "Включите это, чтобы найти страницы с одинаковым названием. Отключите для частичного совпадения (находит страницы, содержащие условия поиска).",
|
||||
"How many pages to return at most (between 1 and 100)": "Сколько страниц нужно возвращать максимум (между 1 и 100)",
|
||||
"Authorization headers are injected automatically from your connection.": "Заголовки авторизации включаются автоматически из вашего соединения.",
|
||||
"GET": "ПОЛУЧИТЬ",
|
||||
"POST": "ПОСТ",
|
||||
"PATCH": "ПАТЧ",
|
||||
"PUT": "ПОКУПИТЬ",
|
||||
"DELETE": "УДАЛИТЬ",
|
||||
"HEAD": "HEAD",
|
||||
"New Database Item": "Новый элемент базы данных",
|
||||
"Updated Database Item": "Обновлен элемент базы данных",
|
||||
"New Comment": "Новый комментарий",
|
||||
"Updated Page": "Страница обновлена",
|
||||
"Triggers when an item is added to a database.": "Включает при добавлении элемента в базу данных.",
|
||||
"Triggers when an item is updated in a database.": "Включает при обновлении элемента в базу данных.",
|
||||
"Triggers whenever someone adds a new comment to a specific Notion page. Perfect for notifications, review workflows, or automated responses to team feedback.": "Триггеры всякий раз, когда кто-то добавляет новый комментарий на конкретную страницу Notion. Идеально подходит для уведомлений, обзоров рабочих процессов или автоматических ответов на командные отзывы.",
|
||||
"Triggers whenever any page in your Notion workspace is modified or updated. Ideal for syncing content changes, backup processes, or notifying teams about documentation updates.": "Включает всякий раз, когда любая страница в Вашем проекте Notion изменена или обновлена. Идеально подходит для синхронизации изменений, резервных копий или команд об обновлениях документации."
|
||||
}
|
||||
@@ -0,0 +1,79 @@
|
||||
{
|
||||
"The all-in-one workspace": "The all-in-one workspace",
|
||||
"Create Database Item": "Create Database Item",
|
||||
"Update Database Item": "Update Database Item",
|
||||
"Find Database Item": "Find Database Item",
|
||||
"Create Page": "Create Page",
|
||||
"Append to Page": "Append to Page",
|
||||
"Get block content": "Get block content",
|
||||
"Archive Database Item": "Archive Database Item",
|
||||
"Restore Database Item": "Restore Database Item",
|
||||
"Add Comment": "Add Comment",
|
||||
"Retrieve Database Structure": "Retrieve Database Structure",
|
||||
"Get Page Comments": "Get Page Comments",
|
||||
"Find Page": "Find Page",
|
||||
"Custom API Call": "Custom API Call",
|
||||
"Add a new item to a Notion database with custom field values and optional content. Ideal for creating tasks, records, or entries in structured databases.": "Add a new item to a Notion database with custom field values and optional content. Ideal for creating tasks, records, or entries in structured databases.",
|
||||
"Update specific fields in a Notion database item. Perfect for maintaining data, tracking changes, or syncing information across systems.": "Update specific fields in a Notion database item. Perfect for maintaining data, tracking changes, or syncing information across systems.",
|
||||
"Searches for an item in database by field.": "Searches for an item in database by field.",
|
||||
"Create a new Notion page as a sub-page with custom title and content. Perfect for organizing documentation, notes, or creating structured page hierarchies.": "Create a new Notion page as a sub-page with custom title and content. Perfect for organizing documentation, notes, or creating structured page hierarchies.",
|
||||
"Appends content to the end of a page.": "Appends content to the end of a page.",
|
||||
"Retrieve the actual content of a page (represented by blocks).": "Retrieve the actual content of a page (represented by blocks).",
|
||||
"Archive (soft-delete) a database item without permanently removing it. Archived items can be restored later if needed.": "Archive (soft-delete) a database item without permanently removing it. Archived items can be restored later if needed.",
|
||||
"Restore an archived database item back to active status. Perfect for recovering accidentally archived tasks, projects, or records.": "Restore an archived database item back to active status. Perfect for recovering accidentally archived tasks, projects, or records.",
|
||||
"Add a comment to any Notion page to start discussions, provide feedback, or leave notes for team collaboration.": "Add a comment to any Notion page to start discussions, provide feedback, or leave notes for team collaboration.",
|
||||
"Get detailed information about a Notion database including all its properties, field types, and configuration. Perfect for building dynamic forms, validation rules, or understanding database schemas.": "Get detailed information about a Notion database including all its properties, field types, and configuration. Perfect for building dynamic forms, validation rules, or understanding database schemas.",
|
||||
"Retrieve all comments from a Notion page, organized by discussion threads. Perfect for tracking feedback, managing reviews, or monitoring page discussions.": "Retrieve all comments from a Notion page, organized by discussion threads. Perfect for tracking feedback, managing reviews, or monitoring page discussions.",
|
||||
"Search for Notion pages by title with flexible matching options. Perfect for finding specific pages, building page references, or creating automated workflows based on page discovery.": "Search for Notion pages by title with flexible matching options. Perfect for finding specific pages, building page references, or creating automated workflows based on page discovery.",
|
||||
"Make a custom API call to a specific endpoint": "Make a custom API call to a specific endpoint",
|
||||
"Database": "Database",
|
||||
"Fields": "Fields",
|
||||
"Content": "Content",
|
||||
"Database Item": "Database Item",
|
||||
"Page": "Page",
|
||||
"Title": "Title",
|
||||
"Page or parent block ID": "Page or parent block ID",
|
||||
"Markdown": "Markdown",
|
||||
"Dynamic properties": "Dynamic properties",
|
||||
"Archived Item": "Archived Item",
|
||||
"Comment Text": "Comment Text",
|
||||
"Page Title": "Page Title",
|
||||
"Exact Match": "Exact Match",
|
||||
"Maximum Results": "Maximum Results",
|
||||
"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)",
|
||||
"Choose the Notion database you want to work with from your workspace": "Choose the Notion database you want to work with from your workspace",
|
||||
"The content you want to append to your item.": "The content you want to append to your item.",
|
||||
"Select the item you want to update": "Select the item you want to update",
|
||||
"Choose the Notion page you want to work with. This list shows your 100 most recently edited pages for easy selection.": "Choose the Notion page you want to work with. This list shows your 100 most recently edited pages for easy selection.",
|
||||
"The title of the page.": "The title of the page.",
|
||||
"The content of the page.": "The content of the page.",
|
||||
"The content you want to append. You can use markdown formatting.": "The content you want to append. You can use markdown formatting.",
|
||||
"Convert Notion JSON blocks to Markdown": "Convert Notion JSON blocks to Markdown",
|
||||
"Choose which archived item to restore from the selected database": "Choose which archived item to restore from the selected database",
|
||||
"Enter your comment text. Supports plain text and will be posted as a new comment thread on the selected page.": "Enter your comment text. Supports plain text and will be posted as a new comment thread on the selected page.",
|
||||
"Enter the page title or part of the title you want to search for": "Enter the page title or part of the title you want to search for",
|
||||
"Enable this to find pages with exactly the same title. Disable for partial matching (finds pages containing your search term).": "Enable this to find pages with exactly the same title. Disable for partial matching (finds pages containing your search term).",
|
||||
"How many pages to return at most (between 1 and 100)": "How many pages to return at most (between 1 and 100)",
|
||||
"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..",
|
||||
"GET": "GET",
|
||||
"POST": "POST",
|
||||
"PATCH": "PATCH",
|
||||
"PUT": "PUT",
|
||||
"DELETE": "DELETE",
|
||||
"HEAD": "HEAD",
|
||||
"New Database Item": "New Database Item",
|
||||
"Updated Database Item": "Updated Database Item",
|
||||
"New Comment": "New Comment",
|
||||
"Updated Page": "Updated Page",
|
||||
"Triggers when an item is added to a database.": "Triggers when an item is added to a database.",
|
||||
"Triggers when an item is updated in a database.": "Triggers when an item is updated in a database.",
|
||||
"Triggers whenever someone adds a new comment to a specific Notion page. Perfect for notifications, review workflows, or automated responses to team feedback.": "Triggers whenever someone adds a new comment to a specific Notion page. Perfect for notifications, review workflows, or automated responses to team feedback.",
|
||||
"Triggers whenever any page in your Notion workspace is modified or updated. Ideal for syncing content changes, backup processes, or notifying teams about documentation updates.": "Triggers whenever any page in your Notion workspace is modified or updated. Ideal for syncing content changes, backup processes, or notifying teams about documentation updates."
|
||||
}
|
||||
@@ -0,0 +1,78 @@
|
||||
{
|
||||
"Notion": "Notion",
|
||||
"The all-in-one workspace": "The all-in-one workspace",
|
||||
"Create Database Item": "Create Database Item",
|
||||
"Update Database Item": "Update Database Item",
|
||||
"Find Database Item": "Find Database Item",
|
||||
"Create Page": "Create Page",
|
||||
"Append to Page": "Append to Page",
|
||||
"Get block content": "Get block content",
|
||||
"Archive Database Item": "Archive Database Item",
|
||||
"Restore Database Item": "Restore Database Item",
|
||||
"Add Comment": "Add Comment",
|
||||
"Retrieve Database Structure": "Retrieve Database Structure",
|
||||
"Get Page Comments": "Get Page Comments",
|
||||
"Find Page": "Find Page",
|
||||
"Custom API Call": "Custom API Call",
|
||||
"Add a new item to a Notion database with custom field values and optional content. Ideal for creating tasks, records, or entries in structured databases.": "Add a new item to a Notion database with custom field values and optional content. Ideal for creating tasks, records, or entries in structured databases.",
|
||||
"Update specific fields in a Notion database item. Perfect for maintaining data, tracking changes, or syncing information across systems.": "Update specific fields in a Notion database item. Perfect for maintaining data, tracking changes, or syncing information across systems.",
|
||||
"Searches for an item in database by field.": "Searches for an item in database by field.",
|
||||
"Create a new Notion page as a sub-page with custom title and content. Perfect for organizing documentation, notes, or creating structured page hierarchies.": "Create a new Notion page as a sub-page with custom title and content. Perfect for organizing documentation, notes, or creating structured page hierarchies.",
|
||||
"Appends content to the end of a page.": "Appends content to the end of a page.",
|
||||
"Retrieve the actual content of a page (represented by blocks).": "Retrieve the actual content of a page (represented by blocks).",
|
||||
"Archive (soft-delete) a database item without permanently removing it. Archived items can be restored later if needed.": "Archive (soft-delete) a database item without permanently removing it. Archived items can be restored later if needed.",
|
||||
"Restore an archived database item back to active status. Perfect for recovering accidentally archived tasks, projects, or records.": "Restore an archived database item back to active status. Perfect for recovering accidentally archived tasks, projects, or records.",
|
||||
"Add a comment to any Notion page to start discussions, provide feedback, or leave notes for team collaboration.": "Add a comment to any Notion page to start discussions, provide feedback, or leave notes for team collaboration.",
|
||||
"Get detailed information about a Notion database including all its properties, field types, and configuration. Perfect for building dynamic forms, validation rules, or understanding database schemas.": "Get detailed information about a Notion database including all its properties, field types, and configuration. Perfect for building dynamic forms, validation rules, or understanding database schemas.",
|
||||
"Retrieve all comments from a Notion page, organized by discussion threads. Perfect for tracking feedback, managing reviews, or monitoring page discussions.": "Retrieve all comments from a Notion page, organized by discussion threads. Perfect for tracking feedback, managing reviews, or monitoring page discussions.",
|
||||
"Search for Notion pages by title with flexible matching options. Perfect for finding specific pages, building page references, or creating automated workflows based on page discovery.": "Search for Notion pages by title with flexible matching options. Perfect for finding specific pages, building page references, or creating automated workflows based on page discovery.",
|
||||
"Make a custom API call to a specific endpoint": "Make a custom API call to a specific endpoint",
|
||||
"Database": "Database",
|
||||
"Fields": "Fields",
|
||||
"Content": "Content",
|
||||
"Database Item": "Database Item",
|
||||
"Page": "Page",
|
||||
"Title": "Title",
|
||||
"Page or parent block ID": "Page or parent block ID",
|
||||
"Markdown": "Markdown",
|
||||
"Dynamic properties": "Dynamic properties",
|
||||
"Archived Item": "Archived Item",
|
||||
"Comment Text": "Comment Text",
|
||||
"Page Title": "Page Title",
|
||||
"Exact Match": "Exact Match",
|
||||
"Maximum Results": "Maximum Results",
|
||||
"Method": "Method",
|
||||
"Headers": "Headers",
|
||||
"Query Parameters": "Query Parameters",
|
||||
"Body": "Body",
|
||||
"No Error on Failure": "No Error on Failure",
|
||||
"Timeout (in seconds)": "Timeout (in seconds)",
|
||||
"Choose the Notion database you want to work with from your workspace": "Choose the Notion database you want to work with from your workspace",
|
||||
"The content you want to append to your item.": "The content you want to append to your item.",
|
||||
"Select the item you want to update": "Select the item you want to update",
|
||||
"Choose the Notion page you want to work with. This list shows your 100 most recently edited pages for easy selection.": "Choose the Notion page you want to work with. This list shows your 100 most recently edited pages for easy selection.",
|
||||
"The title of the page.": "The title of the page.",
|
||||
"The content of the page.": "The content of the page.",
|
||||
"The content you want to append. You can use markdown formatting.": "The content you want to append. You can use markdown formatting.",
|
||||
"Convert Notion JSON blocks to Markdown": "Convert Notion JSON blocks to Markdown",
|
||||
"Choose which archived item to restore from the selected database": "Choose which archived item to restore from the selected database",
|
||||
"Enter your comment text. Supports plain text and will be posted as a new comment thread on the selected page.": "Enter your comment text. Supports plain text and will be posted as a new comment thread on the selected page.",
|
||||
"Enter the page title or part of the title you want to search for": "Enter the page title or part of the title you want to search for",
|
||||
"Enable this to find pages with exactly the same title. Disable for partial matching (finds pages containing your search term).": "Enable this to find pages with exactly the same title. Disable for partial matching (finds pages containing your search term).",
|
||||
"How many pages to return at most (between 1 and 100)": "How many pages to return at most (between 1 and 100)",
|
||||
"Authorization headers are injected automatically from your connection.": "Authorization headers are injected automatically from your connection.",
|
||||
"GET": "GET",
|
||||
"POST": "POST",
|
||||
"PATCH": "PATCH",
|
||||
"PUT": "PUT",
|
||||
"DELETE": "DELETE",
|
||||
"HEAD": "HEAD",
|
||||
"New Database Item": "New Database Item",
|
||||
"Updated Database Item": "Updated Database Item",
|
||||
"New Comment": "New Comment",
|
||||
"Updated Page": "Updated Page",
|
||||
"Triggers when an item is added to a database.": "Triggers when an item is added to a database.",
|
||||
"Triggers when an item is updated in a database.": "Triggers when an item is updated in a database.",
|
||||
"Triggers whenever someone adds a new comment to a specific Notion page. Perfect for notifications, review workflows, or automated responses to team feedback.": "Triggers whenever someone adds a new comment to a specific Notion page. Perfect for notifications, review workflows, or automated responses to team feedback.",
|
||||
"Triggers whenever any page in your Notion workspace is modified or updated. Ideal for syncing content changes, backup processes, or notifying teams about documentation updates.": "Triggers whenever any page in your Notion workspace is modified or updated. Ideal for syncing content changes, backup processes, or notifying teams about documentation updates."
|
||||
}
|
||||
@@ -0,0 +1,79 @@
|
||||
{
|
||||
"The all-in-one workspace": "The all-in-one workspace",
|
||||
"Create Database Item": "Create Database Item",
|
||||
"Update Database Item": "Update Database Item",
|
||||
"Find Database Item": "Find Database Item",
|
||||
"Create Page": "Create Page",
|
||||
"Append to Page": "Append to Page",
|
||||
"Get block content": "Get block content",
|
||||
"Archive Database Item": "Archive Database Item",
|
||||
"Restore Database Item": "Restore Database Item",
|
||||
"Add Comment": "Add Comment",
|
||||
"Retrieve Database Structure": "Retrieve Database Structure",
|
||||
"Get Page Comments": "Get Page Comments",
|
||||
"Find Page": "Find Page",
|
||||
"Custom API Call": "自定义 API 呼叫",
|
||||
"Add a new item to a Notion database with custom field values and optional content. Ideal for creating tasks, records, or entries in structured databases.": "Add a new item to a Notion database with custom field values and optional content. Ideal for creating tasks, records, or entries in structured databases.",
|
||||
"Update specific fields in a Notion database item. Perfect for maintaining data, tracking changes, or syncing information across systems.": "Update specific fields in a Notion database item. Perfect for maintaining data, tracking changes, or syncing information across systems.",
|
||||
"Searches for an item in database by field.": "Searches for an item in database by field.",
|
||||
"Create a new Notion page as a sub-page with custom title and content. Perfect for organizing documentation, notes, or creating structured page hierarchies.": "Create a new Notion page as a sub-page with custom title and content. Perfect for organizing documentation, notes, or creating structured page hierarchies.",
|
||||
"Appends content to the end of a page.": "Appends content to the end of a page.",
|
||||
"Retrieve the actual content of a page (represented by blocks).": "Retrieve the actual content of a page (represented by blocks).",
|
||||
"Archive (soft-delete) a database item without permanently removing it. Archived items can be restored later if needed.": "Archive (soft-delete) a database item without permanently removing it. Archived items can be restored later if needed.",
|
||||
"Restore an archived database item back to active status. Perfect for recovering accidentally archived tasks, projects, or records.": "Restore an archived database item back to active status. Perfect for recovering accidentally archived tasks, projects, or records.",
|
||||
"Add a comment to any Notion page to start discussions, provide feedback, or leave notes for team collaboration.": "Add a comment to any Notion page to start discussions, provide feedback, or leave notes for team collaboration.",
|
||||
"Get detailed information about a Notion database including all its properties, field types, and configuration. Perfect for building dynamic forms, validation rules, or understanding database schemas.": "Get detailed information about a Notion database including all its properties, field types, and configuration. Perfect for building dynamic forms, validation rules, or understanding database schemas.",
|
||||
"Retrieve all comments from a Notion page, organized by discussion threads. Perfect for tracking feedback, managing reviews, or monitoring page discussions.": "Retrieve all comments from a Notion page, organized by discussion threads. Perfect for tracking feedback, managing reviews, or monitoring page discussions.",
|
||||
"Search for Notion pages by title with flexible matching options. Perfect for finding specific pages, building page references, or creating automated workflows based on page discovery.": "Search for Notion pages by title with flexible matching options. Perfect for finding specific pages, building page references, or creating automated workflows based on page discovery.",
|
||||
"Make a custom API call to a specific endpoint": "将一个自定义 API 调用到一个特定的终点",
|
||||
"Database": "Database",
|
||||
"Fields": "Fields",
|
||||
"Content": "Content",
|
||||
"Database Item": "Database Item",
|
||||
"Page": "Page",
|
||||
"Title": "标题",
|
||||
"Page or parent block ID": "Page or parent block ID",
|
||||
"Markdown": "Markdown",
|
||||
"Dynamic properties": "Dynamic properties",
|
||||
"Archived Item": "Archived Item",
|
||||
"Comment Text": "Comment Text",
|
||||
"Page Title": "Page Title",
|
||||
"Exact Match": "精确匹配",
|
||||
"Maximum Results": "Maximum Results",
|
||||
"Method": "方法",
|
||||
"Headers": "信头",
|
||||
"Query Parameters": "查询参数",
|
||||
"Body": "正文内容",
|
||||
"Response is Binary ?": "Response is Binary ?",
|
||||
"No Error on Failure": "失败时没有错误",
|
||||
"Timeout (in seconds)": "超时(秒)",
|
||||
"Choose the Notion database you want to work with from your workspace": "Choose the Notion database you want to work with from your workspace",
|
||||
"The content you want to append to your item.": "The content you want to append to your item.",
|
||||
"Select the item you want to update": "Select the item you want to update",
|
||||
"Choose the Notion page you want to work with. This list shows your 100 most recently edited pages for easy selection.": "Choose the Notion page you want to work with. This list shows your 100 most recently edited pages for easy selection.",
|
||||
"The title of the page.": "The title of the page.",
|
||||
"The content of the page.": "The content of the page.",
|
||||
"The content you want to append. You can use markdown formatting.": "The content you want to append. You can use markdown formatting.",
|
||||
"Convert Notion JSON blocks to Markdown": "Convert Notion JSON blocks to Markdown",
|
||||
"Choose which archived item to restore from the selected database": "Choose which archived item to restore from the selected database",
|
||||
"Enter your comment text. Supports plain text and will be posted as a new comment thread on the selected page.": "Enter your comment text. Supports plain text and will be posted as a new comment thread on the selected page.",
|
||||
"Enter the page title or part of the title you want to search for": "Enter the page title or part of the title you want to search for",
|
||||
"Enable this to find pages with exactly the same title. Disable for partial matching (finds pages containing your search term).": "Enable this to find pages with exactly the same title. Disable for partial matching (finds pages containing your search term).",
|
||||
"How many pages to return at most (between 1 and 100)": "How many pages to return at most (between 1 and 100)",
|
||||
"Authorization headers are injected automatically from your connection.": "授权头自动从您的连接中注入。",
|
||||
"Enable for files like PDFs, images, etc..": "Enable for files like PDFs, images, etc..",
|
||||
"GET": "获取",
|
||||
"POST": "帖子",
|
||||
"PATCH": "PATCH",
|
||||
"PUT": "弹出",
|
||||
"DELETE": "删除",
|
||||
"HEAD": "黑色",
|
||||
"New Database Item": "New Database Item",
|
||||
"Updated Database Item": "Updated Database Item",
|
||||
"New Comment": "New Comment",
|
||||
"Updated Page": "Updated Page",
|
||||
"Triggers when an item is added to a database.": "Triggers when an item is added to a database.",
|
||||
"Triggers when an item is updated in a database.": "Triggers when an item is updated in a database.",
|
||||
"Triggers whenever someone adds a new comment to a specific Notion page. Perfect for notifications, review workflows, or automated responses to team feedback.": "Triggers whenever someone adds a new comment to a specific Notion page. Perfect for notifications, review workflows, or automated responses to team feedback.",
|
||||
"Triggers whenever any page in your Notion workspace is modified or updated. Ideal for syncing content changes, backup processes, or notifying teams about documentation updates.": "Triggers whenever any page in your Notion workspace is modified or updated. Ideal for syncing content changes, backup processes, or notifying teams about documentation updates."
|
||||
}
|
||||
@@ -0,0 +1,76 @@
|
||||
import { createCustomApiCallAction } from '@activepieces/pieces-common';
|
||||
import {
|
||||
OAuth2AuthorizationMethod,
|
||||
OAuth2PropertyValue,
|
||||
PieceAuth,
|
||||
createPiece,
|
||||
} from '@activepieces/pieces-framework';
|
||||
import { PieceCategory } from '@activepieces/shared';
|
||||
import { appendToPage } from './lib/actions/append-to-page';
|
||||
import { createDatabaseItem } from './lib/actions/create-database-item';
|
||||
import { createPage } from './lib/actions/create-page';
|
||||
import { updateDatabaseItem } from './lib/actions/update-database-item';
|
||||
import { newDatabaseItem } from './lib/triggers/new-database-item';
|
||||
import { updatedDatabaseItem } from './lib/triggers/updated-database-item';
|
||||
import { newComment } from './lib/triggers/new-comment';
|
||||
import { updatedPage } from './lib/triggers/updated-page';
|
||||
import { findDatabaseItem } from './lib/actions/find-item';
|
||||
import { getPageOrBlockChildren } from './lib/actions/get-page-or-block-children';
|
||||
import { archiveDatabaseItem } from './lib/actions/archive-database-item';
|
||||
import { restoreDatabaseItem } from './lib/actions/restore-database-item';
|
||||
import { addComment } from './lib/actions/add-comment';
|
||||
import { retrieveDatabase } from './lib/actions/retrieve-database';
|
||||
import { getPageComments } from './lib/actions/get-page-comments';
|
||||
import { findPage } from './lib/actions/find-page';
|
||||
|
||||
export const notionAuth = PieceAuth.OAuth2({
|
||||
authUrl: 'https://api.notion.com/v1/oauth/authorize',
|
||||
tokenUrl: 'https://api.notion.com/v1/oauth/token',
|
||||
scope: [],
|
||||
extra: {
|
||||
owner: 'user',
|
||||
},
|
||||
authorizationMethod: OAuth2AuthorizationMethod.HEADER,
|
||||
required: true,
|
||||
});
|
||||
|
||||
export const notion = createPiece({
|
||||
displayName: 'Notion',
|
||||
description: 'The all-in-one workspace',
|
||||
logoUrl: 'https://cdn.activepieces.com/pieces/notion.png',
|
||||
categories: [PieceCategory.PRODUCTIVITY],
|
||||
minimumSupportedRelease: '0.30.0',
|
||||
authors: [
|
||||
'ShayPunter',
|
||||
'kishanprmr',
|
||||
'MoShizzle',
|
||||
'khaledmashaly',
|
||||
'abuaboud',
|
||||
'AdamSelene',
|
||||
'ezhil56x',
|
||||
'onyedikachi-david',
|
||||
],
|
||||
auth: notionAuth,
|
||||
actions: [
|
||||
createDatabaseItem,
|
||||
updateDatabaseItem,
|
||||
findDatabaseItem,
|
||||
createPage,
|
||||
appendToPage,
|
||||
getPageOrBlockChildren,
|
||||
archiveDatabaseItem,
|
||||
restoreDatabaseItem,
|
||||
addComment,
|
||||
retrieveDatabase,
|
||||
getPageComments,
|
||||
findPage,
|
||||
createCustomApiCallAction({
|
||||
baseUrl: () => 'https://api.notion.com/v1',
|
||||
auth: notionAuth,
|
||||
authMapping: async (auth) => ({
|
||||
Authorization: `Bearer ${(auth as OAuth2PropertyValue).access_token}`,
|
||||
}),
|
||||
}),
|
||||
],
|
||||
triggers: [newDatabaseItem, updatedDatabaseItem, newComment, updatedPage],
|
||||
});
|
||||
@@ -0,0 +1,82 @@
|
||||
import {
|
||||
createAction,
|
||||
OAuth2PropertyValue,
|
||||
Property,
|
||||
} from '@activepieces/pieces-framework';
|
||||
import { Client } from '@notionhq/client';
|
||||
import { notionAuth } from '../..';
|
||||
import { notionCommon } from '../common';
|
||||
|
||||
export const addComment = createAction({
|
||||
auth: notionAuth,
|
||||
name: 'add_comment',
|
||||
displayName: 'Add Comment',
|
||||
description:
|
||||
'Add a comment to any Notion page to start discussions, provide feedback, or leave notes for team collaboration.',
|
||||
props: {
|
||||
page_id: notionCommon.page,
|
||||
comment_text: Property.LongText({
|
||||
displayName: 'Comment Text',
|
||||
description:
|
||||
'Enter your comment text. Supports plain text and will be posted as a new comment thread on the selected page.',
|
||||
required: true,
|
||||
}),
|
||||
},
|
||||
async run(context) {
|
||||
const { page_id, comment_text } = context.propsValue;
|
||||
|
||||
if (!comment_text) {
|
||||
throw new Error('Comment text is required');
|
||||
}
|
||||
|
||||
const notion = new Client({
|
||||
auth: (context.auth as OAuth2PropertyValue).access_token,
|
||||
notionVersion: '2022-02-22',
|
||||
});
|
||||
|
||||
const commentData: any = {
|
||||
rich_text: [
|
||||
{
|
||||
text: {
|
||||
content: comment_text,
|
||||
},
|
||||
},
|
||||
],
|
||||
};
|
||||
|
||||
if (!page_id) {
|
||||
throw new Error('Page ID is required');
|
||||
}
|
||||
|
||||
commentData.parent = {
|
||||
page_id: page_id,
|
||||
};
|
||||
|
||||
try {
|
||||
const response = await notion.comments.create(commentData);
|
||||
if (response.object === 'comment' && Object.keys(response).length <= 2) {
|
||||
return {
|
||||
success: true,
|
||||
message:
|
||||
'💬 Comment posted successfully! Your comment has been added to the page.',
|
||||
comment_id: response.id,
|
||||
note: 'Limited comment details available. To see full comment content, ensure your Notion integration has "Read comments" capability enabled in your workspace settings.',
|
||||
};
|
||||
}
|
||||
|
||||
return {
|
||||
success: true,
|
||||
message:
|
||||
'💬 Comment posted successfully! Your comment has been added to the page.',
|
||||
comment: response,
|
||||
};
|
||||
} catch (error: any) {
|
||||
if (error.message?.includes('permissions')) {
|
||||
throw new Error(
|
||||
'Integration lacks required comment capabilities. Please ensure your Notion integration has "Insert comments" capability enabled.'
|
||||
);
|
||||
}
|
||||
throw error;
|
||||
}
|
||||
},
|
||||
});
|
||||
@@ -0,0 +1,40 @@
|
||||
import {
|
||||
createAction,
|
||||
OAuth2PropertyValue,
|
||||
Property,
|
||||
} from '@activepieces/pieces-framework';
|
||||
import { Client } from '@notionhq/client';
|
||||
|
||||
import { notionAuth } from '../..';
|
||||
import { notionCommon } from '../common';
|
||||
import { markdownToBlocks } from '@tryfabric/martian';
|
||||
import { BlockObjectRequest } from '@notionhq/client/build/src/api-endpoints';
|
||||
|
||||
export const appendToPage = createAction({
|
||||
auth: notionAuth,
|
||||
name: 'append_to_page',
|
||||
displayName: 'Append to Page',
|
||||
description: 'Appends content to the end of a page.',
|
||||
props: {
|
||||
pageId: notionCommon.page,
|
||||
content: Property.LongText({
|
||||
displayName: 'Content',
|
||||
description:
|
||||
'The content you want to append. You can use markdown formatting.',
|
||||
required: true,
|
||||
}),
|
||||
},
|
||||
async run(context) {
|
||||
const { pageId, content } = context.propsValue;
|
||||
|
||||
const notion = new Client({
|
||||
auth: (context.auth as OAuth2PropertyValue).access_token,
|
||||
notionVersion: '2022-02-22',
|
||||
});
|
||||
|
||||
return await notion.blocks.children.append({
|
||||
block_id: pageId as string,
|
||||
children: markdownToBlocks(content) as unknown as BlockObjectRequest[],
|
||||
});
|
||||
},
|
||||
});
|
||||
@@ -0,0 +1,94 @@
|
||||
import {
|
||||
createAction,
|
||||
OAuth2PropertyValue,
|
||||
} from '@activepieces/pieces-framework';
|
||||
import { Client } from '@notionhq/client';
|
||||
import { notionAuth } from '../..';
|
||||
import { notionCommon } from '../common';
|
||||
|
||||
export const archiveDatabaseItem = createAction({
|
||||
auth: notionAuth,
|
||||
name: 'archive_database_item',
|
||||
displayName: 'Archive Database Item',
|
||||
description:
|
||||
'Archive (soft-delete) a database item without permanently removing it. Archived items can be restored later if needed.',
|
||||
props: {
|
||||
database_id: notionCommon.database_id,
|
||||
database_item_id: notionCommon.database_item_id,
|
||||
},
|
||||
async run(context) {
|
||||
const { database_id, database_item_id } = context.propsValue;
|
||||
|
||||
if (!database_id) {
|
||||
throw new Error('Database selection is required');
|
||||
}
|
||||
|
||||
if (!database_item_id) {
|
||||
throw new Error('Please select a database item to archive');
|
||||
}
|
||||
|
||||
const notion = new Client({
|
||||
auth: (context.auth as OAuth2PropertyValue).access_token,
|
||||
notionVersion: '2022-02-22',
|
||||
});
|
||||
|
||||
try {
|
||||
const response = await notion.pages.update({
|
||||
page_id: database_item_id,
|
||||
archived: true,
|
||||
});
|
||||
|
||||
// Get the item title for better user feedback
|
||||
let itemTitle = 'Database item';
|
||||
let itemUrl = undefined;
|
||||
|
||||
if ('properties' in response && response.properties) {
|
||||
const firstProperty = Object.values(response.properties)[0];
|
||||
if (
|
||||
firstProperty &&
|
||||
typeof firstProperty === 'object' &&
|
||||
'title' in firstProperty &&
|
||||
firstProperty.title
|
||||
) {
|
||||
itemTitle =
|
||||
(firstProperty.title as any)[0]?.plain_text || 'Untitled item';
|
||||
}
|
||||
}
|
||||
|
||||
if ('url' in response) {
|
||||
itemUrl = response.url;
|
||||
}
|
||||
|
||||
return {
|
||||
success: true,
|
||||
message: `"${itemTitle}" has been archived successfully`,
|
||||
archivedItem: {
|
||||
id: response.id,
|
||||
title: itemTitle,
|
||||
url: itemUrl,
|
||||
archived_at: new Date().toISOString(),
|
||||
},
|
||||
// Include full response for advanced users
|
||||
fullResponse: response,
|
||||
};
|
||||
} catch (error: any) {
|
||||
if (
|
||||
error.message?.includes('permissions') ||
|
||||
error.message?.includes('unauthorized')
|
||||
) {
|
||||
throw new Error(
|
||||
'Unable to archive item: Your Notion integration may lack edit permissions for this database. Please check your integration permissions in Notion.'
|
||||
);
|
||||
}
|
||||
|
||||
if (error.message?.includes('not_found')) {
|
||||
throw new Error(
|
||||
'The selected item could not be found. It may have been deleted or moved to a different database.'
|
||||
);
|
||||
}
|
||||
|
||||
// Re-throw with more context
|
||||
throw new Error(`Failed to archive database item: ${error.message}`);
|
||||
}
|
||||
},
|
||||
});
|
||||
@@ -0,0 +1,83 @@
|
||||
import {
|
||||
createAction,
|
||||
DynamicPropsValue,
|
||||
OAuth2PropertyValue,
|
||||
Property,
|
||||
} from '@activepieces/pieces-framework';
|
||||
import { Client } from '@notionhq/client';
|
||||
import { NotionFieldMapping } from '../common/models';
|
||||
import { notionAuth } from '../..';
|
||||
import { notionCommon } from '../common';
|
||||
|
||||
export const createDatabaseItem = createAction({
|
||||
auth: notionAuth,
|
||||
name: 'create_database_item',
|
||||
displayName: 'Create Database Item',
|
||||
description:
|
||||
'Add a new item to a Notion database with custom field values and optional content. Ideal for creating tasks, records, or entries in structured databases.',
|
||||
props: {
|
||||
database_id: notionCommon.database_id,
|
||||
databaseFields: notionCommon.databaseFields,
|
||||
content: Property.LongText({
|
||||
displayName: 'Content',
|
||||
description: 'The content you want to append to your item.',
|
||||
required: false,
|
||||
}),
|
||||
},
|
||||
async run(context) {
|
||||
const database_id = context.propsValue.database_id;
|
||||
const databaseFields = context.propsValue.databaseFields;
|
||||
const content = context.propsValue.content;
|
||||
const notionFields: DynamicPropsValue = {};
|
||||
const notion = new Client({
|
||||
auth: (context.auth as OAuth2PropertyValue).access_token,
|
||||
notionVersion: '2022-02-22',
|
||||
});
|
||||
const { properties } = await notion.databases.retrieve({
|
||||
database_id: database_id as unknown as string,
|
||||
});
|
||||
|
||||
Object.keys(databaseFields).forEach((key) => {
|
||||
const value = databaseFields[key];
|
||||
if (
|
||||
value !== '' &&
|
||||
value !== undefined &&
|
||||
value !== null &&
|
||||
!(Array.isArray(value) && value.length === 0)
|
||||
) {
|
||||
const fieldType: string = properties[key]?.type;
|
||||
if (fieldType) {
|
||||
notionFields[key] =
|
||||
NotionFieldMapping[fieldType].buildNotionType(value);
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
const children: any[] = [];
|
||||
// Add content to page
|
||||
if (content)
|
||||
children.push({
|
||||
object: 'block',
|
||||
type: 'paragraph',
|
||||
paragraph: {
|
||||
rich_text: [
|
||||
{
|
||||
type: 'text',
|
||||
text: {
|
||||
content: content,
|
||||
},
|
||||
},
|
||||
],
|
||||
},
|
||||
});
|
||||
|
||||
return await notion.pages.create({
|
||||
parent: {
|
||||
type: 'database_id',
|
||||
database_id: database_id as string,
|
||||
},
|
||||
properties: notionFields,
|
||||
children: children,
|
||||
});
|
||||
},
|
||||
});
|
||||
@@ -0,0 +1,78 @@
|
||||
import {
|
||||
createAction,
|
||||
OAuth2PropertyValue,
|
||||
Property,
|
||||
} from '@activepieces/pieces-framework';
|
||||
import { Client } from '@notionhq/client';
|
||||
|
||||
import { notionAuth } from '../..';
|
||||
import { notionCommon } from '../common';
|
||||
|
||||
export const createPage = createAction({
|
||||
auth: notionAuth,
|
||||
name: 'createPage',
|
||||
displayName: 'Create Page',
|
||||
description:
|
||||
'Create a new Notion page as a sub-page with custom title and content. Perfect for organizing documentation, notes, or creating structured page hierarchies.',
|
||||
props: {
|
||||
pageId: notionCommon.page,
|
||||
title: Property.ShortText({
|
||||
displayName: 'Title',
|
||||
description: 'The title of the page.',
|
||||
required: false,
|
||||
}),
|
||||
content: Property.LongText({
|
||||
displayName: 'Content',
|
||||
description: 'The content of the page.',
|
||||
required: false,
|
||||
}),
|
||||
},
|
||||
|
||||
async run(context) {
|
||||
const { pageId, title, content } = context.propsValue;
|
||||
|
||||
const notion = new Client({
|
||||
auth: (context.auth as OAuth2PropertyValue).access_token,
|
||||
notionVersion: '2022-02-22',
|
||||
});
|
||||
|
||||
const pageProperties: any = {
|
||||
title: {
|
||||
title: [
|
||||
{
|
||||
text: {
|
||||
content: title ?? '',
|
||||
},
|
||||
},
|
||||
],
|
||||
},
|
||||
};
|
||||
|
||||
const children: any[] = [];
|
||||
// Add content to page
|
||||
if (content)
|
||||
children.push({
|
||||
object: 'block',
|
||||
type: 'paragraph',
|
||||
paragraph: {
|
||||
rich_text: [
|
||||
{
|
||||
type: 'text',
|
||||
text: {
|
||||
content: content,
|
||||
},
|
||||
},
|
||||
],
|
||||
},
|
||||
});
|
||||
|
||||
const page = await notion.pages.create({
|
||||
parent: {
|
||||
page_id: pageId as string,
|
||||
},
|
||||
properties: pageProperties,
|
||||
children: children,
|
||||
});
|
||||
return page;
|
||||
},
|
||||
});
|
||||
@@ -0,0 +1,96 @@
|
||||
import { notionAuth } from '../../';
|
||||
import { createAction } from '@activepieces/pieces-framework';
|
||||
import { notionCommon } from '../common';
|
||||
import { Client } from '@notionhq/client';
|
||||
|
||||
export const findDatabaseItem = createAction({
|
||||
auth: notionAuth,
|
||||
name: 'notion-find-database-item',
|
||||
displayName: 'Find Database Item',
|
||||
description: 'Searches for an item in database by field.',
|
||||
props: {
|
||||
database_id: notionCommon.database_id,
|
||||
filterDatabaseFields: notionCommon.filterDatabaseFields,
|
||||
},
|
||||
async run(context) {
|
||||
const databaseId = context.propsValue.database_id;
|
||||
const filterFields = context.propsValue.filterDatabaseFields;
|
||||
|
||||
const notion = new Client({
|
||||
auth: context.auth.access_token,
|
||||
notionVersion: '2022-02-22',
|
||||
});
|
||||
|
||||
const { properties } = await notion.databases.retrieve({
|
||||
database_id: databaseId as string,
|
||||
});
|
||||
|
||||
const filterArray = [];
|
||||
|
||||
for (const fieldKey in filterFields) {
|
||||
const fieldValue = filterFields[fieldKey];
|
||||
const fieldType = properties[fieldKey].type;
|
||||
if (
|
||||
fieldValue === '' ||
|
||||
fieldValue === undefined ||
|
||||
fieldValue === null ||
|
||||
(Array.isArray(fieldValue) && fieldValue.length === 0)
|
||||
) {
|
||||
continue;
|
||||
}
|
||||
switch (fieldType) {
|
||||
case 'number':
|
||||
filterArray.push({
|
||||
property: fieldKey,
|
||||
number: { equals: Number(fieldValue) },
|
||||
});
|
||||
break;
|
||||
case 'rich_text':
|
||||
filterArray.push({
|
||||
property: fieldKey,
|
||||
rich_text: { equals: fieldValue },
|
||||
});
|
||||
break;
|
||||
case 'email':
|
||||
filterArray.push({
|
||||
property: fieldKey,
|
||||
email: { equals: fieldValue },
|
||||
});
|
||||
break;
|
||||
case 'select':
|
||||
filterArray.push({
|
||||
property: fieldKey,
|
||||
select: { equals: fieldValue },
|
||||
});
|
||||
break;
|
||||
case 'phone_number':
|
||||
filterArray.push({
|
||||
property: fieldKey,
|
||||
phone_number: { equals: fieldValue },
|
||||
});
|
||||
break;
|
||||
case 'url':
|
||||
filterArray.push({ property: fieldKey, url: { equals: fieldValue } });
|
||||
break;
|
||||
case 'title':
|
||||
filterArray.push({
|
||||
property: fieldKey,
|
||||
title: { equals: fieldValue },
|
||||
});
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
const { results } = await notion.databases.query({
|
||||
database_id: databaseId as string,
|
||||
filter: {
|
||||
and: filterArray,
|
||||
},
|
||||
});
|
||||
|
||||
return {
|
||||
success: results.length > 0,
|
||||
results,
|
||||
};
|
||||
},
|
||||
});
|
||||
@@ -0,0 +1,156 @@
|
||||
import {
|
||||
createAction,
|
||||
OAuth2PropertyValue,
|
||||
Property,
|
||||
} from '@activepieces/pieces-framework';
|
||||
import { Client } from '@notionhq/client';
|
||||
import { notionAuth } from '../..';
|
||||
|
||||
export const findPage = createAction({
|
||||
auth: notionAuth,
|
||||
name: 'find_page',
|
||||
displayName: 'Find Page',
|
||||
description:
|
||||
'Search for Notion pages by title with flexible matching options. Perfect for finding specific pages, building page references, or creating automated workflows based on page discovery.',
|
||||
props: {
|
||||
title: Property.ShortText({
|
||||
displayName: 'Page Title',
|
||||
description:
|
||||
'Enter the page title or part of the title you want to search for',
|
||||
required: true,
|
||||
}),
|
||||
exact_match: Property.Checkbox({
|
||||
displayName: 'Exact Match',
|
||||
description:
|
||||
'Enable this to find pages with exactly the same title. Disable for partial matching (finds pages containing your search term).',
|
||||
required: false,
|
||||
defaultValue: false,
|
||||
}),
|
||||
limit: Property.Number({
|
||||
displayName: 'Maximum Results',
|
||||
description: 'How many pages to return at most (between 1 and 100)',
|
||||
required: false,
|
||||
defaultValue: 10,
|
||||
}),
|
||||
},
|
||||
async run(context) {
|
||||
const { title, exact_match, limit } = context.propsValue;
|
||||
|
||||
if (!title) {
|
||||
throw new Error('Page title is required');
|
||||
}
|
||||
|
||||
const searchLimit = Math.min(Math.max(limit || 10, 1), 100);
|
||||
|
||||
const notion = new Client({
|
||||
auth: (context.auth as OAuth2PropertyValue).access_token,
|
||||
notionVersion: '2022-02-22',
|
||||
});
|
||||
|
||||
const allPages: any[] = [];
|
||||
let cursor: string | undefined;
|
||||
let hasMore = true;
|
||||
|
||||
while (hasMore && allPages.length < searchLimit) {
|
||||
const response = await notion.search({
|
||||
query: title,
|
||||
filter: {
|
||||
property: 'object',
|
||||
value: 'page',
|
||||
},
|
||||
sort: {
|
||||
direction: 'descending',
|
||||
timestamp: 'last_edited_time',
|
||||
},
|
||||
start_cursor: cursor,
|
||||
page_size: Math.min(100, searchLimit - allPages.length),
|
||||
});
|
||||
|
||||
allPages.push(...response.results);
|
||||
hasMore = response.has_more;
|
||||
cursor = response.next_cursor || undefined;
|
||||
}
|
||||
|
||||
// Filter results based on exact match requirement
|
||||
let filteredPages = allPages;
|
||||
|
||||
if (exact_match) {
|
||||
filteredPages = allPages.filter((page: any) => {
|
||||
const pageTitle = extractPageTitle(page);
|
||||
return pageTitle && pageTitle.toLowerCase() === title.toLowerCase();
|
||||
});
|
||||
} else {
|
||||
filteredPages = allPages.filter((page: any) => {
|
||||
const pageTitle = extractPageTitle(page);
|
||||
return (
|
||||
pageTitle && pageTitle.toLowerCase().includes(title.toLowerCase())
|
||||
);
|
||||
});
|
||||
}
|
||||
|
||||
const limitedResults = filteredPages.slice(0, searchLimit);
|
||||
|
||||
const formattedResults = limitedResults.map((page: any) => ({
|
||||
id: page.id,
|
||||
title: extractPageTitle(page),
|
||||
url: page.url,
|
||||
created_time: page.created_time,
|
||||
last_edited_time: page.last_edited_time,
|
||||
archived: page.archived,
|
||||
parent: page.parent,
|
||||
properties: page.properties,
|
||||
}));
|
||||
|
||||
const matchType = exact_match ? 'exact match' : 'partial match';
|
||||
const resultMessage =
|
||||
filteredPages.length === 0
|
||||
? `🔍 No pages found matching "${title}" (${matchType}). Try using partial matching or check your search term.`
|
||||
: `🔍 Found ${filteredPages.length} page${
|
||||
filteredPages.length === 1 ? '' : 's'
|
||||
} matching "${title}" (${matchType})${
|
||||
formattedResults.length < filteredPages.length
|
||||
? `, showing first ${formattedResults.length}`
|
||||
: ''
|
||||
}.`;
|
||||
|
||||
return {
|
||||
success: true,
|
||||
searchTerm: title,
|
||||
exactMatch: exact_match,
|
||||
totalFound: filteredPages.length,
|
||||
returned: formattedResults.length,
|
||||
pages: formattedResults,
|
||||
summary: {
|
||||
searchTerm: title,
|
||||
matchType: matchType,
|
||||
totalFound: filteredPages.length,
|
||||
returned: formattedResults.length,
|
||||
hasMore: filteredPages.length > formattedResults.length,
|
||||
},
|
||||
message: resultMessage,
|
||||
};
|
||||
},
|
||||
});
|
||||
|
||||
function extractPageTitle(page: any): string | null {
|
||||
try {
|
||||
if (page.properties) {
|
||||
for (const [, prop] of Object.entries(page.properties)) {
|
||||
if ((prop as any).type === 'title') {
|
||||
const titleArray = (prop as any).title;
|
||||
if (titleArray && titleArray.length > 0) {
|
||||
return (
|
||||
titleArray[0].plain_text ||
|
||||
titleArray[0].text?.content ||
|
||||
'Untitled'
|
||||
);
|
||||
}
|
||||
return null;
|
||||
}
|
||||
}
|
||||
}
|
||||
return null;
|
||||
} catch (error) {
|
||||
return null;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,109 @@
|
||||
import {
|
||||
createAction,
|
||||
OAuth2PropertyValue,
|
||||
} from '@activepieces/pieces-framework';
|
||||
import { Client } from '@notionhq/client';
|
||||
import { notionAuth } from '../..';
|
||||
import { notionCommon } from '../common';
|
||||
|
||||
export const getPageComments = createAction({
|
||||
auth: notionAuth,
|
||||
name: 'get_page_comments',
|
||||
displayName: 'Get Page Comments',
|
||||
description:
|
||||
'Retrieve all comments from a Notion page, organized by discussion threads. Perfect for tracking feedback, managing reviews, or monitoring page discussions.',
|
||||
props: {
|
||||
page_id: notionCommon.page,
|
||||
},
|
||||
async run(context) {
|
||||
const { page_id } = context.propsValue;
|
||||
|
||||
if (!page_id) {
|
||||
throw new Error('Page ID is required');
|
||||
}
|
||||
|
||||
const notion = new Client({
|
||||
auth: (context.auth as OAuth2PropertyValue).access_token,
|
||||
notionVersion: '2022-02-22',
|
||||
});
|
||||
|
||||
const allComments: any[] = [];
|
||||
let cursor: string | undefined;
|
||||
let hasMore = true;
|
||||
|
||||
while (hasMore) {
|
||||
try {
|
||||
const response = await notion.comments.list({
|
||||
block_id: page_id,
|
||||
start_cursor: cursor,
|
||||
});
|
||||
|
||||
allComments.push(...response.results);
|
||||
hasMore = response.has_more;
|
||||
cursor = response.next_cursor || undefined;
|
||||
} catch (error: any) {
|
||||
if (error.message?.includes('permissions')) {
|
||||
throw new Error(
|
||||
'Integration lacks required "read comments" capability.'
|
||||
);
|
||||
}
|
||||
throw error;
|
||||
}
|
||||
}
|
||||
|
||||
const commentsByDiscussion: { [key: string]: any[] } = {};
|
||||
const pageComments: any[] = [];
|
||||
|
||||
allComments.forEach((comment: any) => {
|
||||
if (comment.discussion_id) {
|
||||
if (!commentsByDiscussion[comment.discussion_id]) {
|
||||
commentsByDiscussion[comment.discussion_id] = [];
|
||||
}
|
||||
commentsByDiscussion[comment.discussion_id].push(comment);
|
||||
} else {
|
||||
pageComments.push(comment);
|
||||
}
|
||||
});
|
||||
|
||||
Object.keys(commentsByDiscussion).forEach((discussionId) => {
|
||||
commentsByDiscussion[discussionId].sort(
|
||||
(a: any, b: any) =>
|
||||
new Date(a.created_time).getTime() -
|
||||
new Date(b.created_time).getTime()
|
||||
);
|
||||
});
|
||||
|
||||
pageComments.sort(
|
||||
(a: any, b: any) =>
|
||||
new Date(a.created_time).getTime() - new Date(b.created_time).getTime()
|
||||
);
|
||||
|
||||
const threadCount = Object.keys(commentsByDiscussion).length;
|
||||
|
||||
return {
|
||||
success: true,
|
||||
totalComments: allComments.length,
|
||||
pageComments: pageComments,
|
||||
discussionThreads: commentsByDiscussion,
|
||||
discussionCount: threadCount,
|
||||
allComments: allComments,
|
||||
summary: {
|
||||
totalComments: allComments.length,
|
||||
discussionThreads: threadCount,
|
||||
standaloneComments: pageComments.length,
|
||||
},
|
||||
message:
|
||||
allComments.length === 0
|
||||
? `📝 No comments found on this page yet.`
|
||||
: `💬 Successfully retrieved ${allComments.length} comment${
|
||||
allComments.length === 1 ? '' : 's'
|
||||
} from page${
|
||||
threadCount > 0
|
||||
? ` organized into ${threadCount} discussion thread${
|
||||
threadCount === 1 ? '' : 's'
|
||||
}`
|
||||
: ''
|
||||
}.`,
|
||||
};
|
||||
},
|
||||
});
|
||||
@@ -0,0 +1,108 @@
|
||||
import {
|
||||
createAction,
|
||||
DynamicPropsValue,
|
||||
OAuth2PropertyValue,
|
||||
Property,
|
||||
} from '@activepieces/pieces-framework';
|
||||
import { NotionToMarkdown } from 'notion-to-md';
|
||||
import { notionAuth } from '../..';
|
||||
import { Client, collectPaginatedAPI, isFullBlock } from '@notionhq/client';
|
||||
import { PartialBlockObjectResponse } from '@notionhq/client/build/src/api-endpoints';
|
||||
|
||||
export const getPageOrBlockChildren = createAction({
|
||||
auth: notionAuth,
|
||||
name: 'getPageOrBlockChildren',
|
||||
displayName: 'Get block content',
|
||||
description: 'Retrieve the actual content of a page (represented by blocks).',
|
||||
props: {
|
||||
parentId: Property.ShortText({
|
||||
displayName: 'Page or parent block ID',
|
||||
required: true,
|
||||
}),
|
||||
markdown: Property.Checkbox({
|
||||
displayName: 'Markdown',
|
||||
description: 'Convert Notion JSON blocks to Markdown',
|
||||
required: true,
|
||||
defaultValue: false,
|
||||
}),
|
||||
dynamic: Property.DynamicProperties({
|
||||
auth: notionAuth,
|
||||
displayName: 'Dynamic properties',
|
||||
refreshers: ['markdown'],
|
||||
required: true,
|
||||
props: async ({ markdown }) => {
|
||||
if (markdown) {
|
||||
return {};
|
||||
}
|
||||
const fields: DynamicPropsValue = {
|
||||
depth: Property.Number({
|
||||
displayName: 'Depth',
|
||||
description: 'Recursively retrieve children up to this depth',
|
||||
required: true,
|
||||
defaultValue: 1,
|
||||
}),
|
||||
};
|
||||
return fields;
|
||||
},
|
||||
}),
|
||||
},
|
||||
async run(context) {
|
||||
const notion = new Client({
|
||||
auth: (context.auth as OAuth2PropertyValue).access_token,
|
||||
notionVersion: '2022-02-22',
|
||||
});
|
||||
|
||||
if (context.propsValue.markdown) {
|
||||
const n2m = new NotionToMarkdown({
|
||||
notionClient: notion,
|
||||
config: { parseChildPages: false },
|
||||
});
|
||||
return n2m.toMarkdownString(
|
||||
await n2m.pageToMarkdown(context.propsValue.parentId)
|
||||
).parent;
|
||||
} else {
|
||||
return getBlockChildrenRecursively(
|
||||
notion,
|
||||
context.propsValue.parentId,
|
||||
context.propsValue.dynamic['depth'],
|
||||
0
|
||||
);
|
||||
}
|
||||
},
|
||||
});
|
||||
|
||||
async function getBlockChildrenRecursively(
|
||||
notion: Client,
|
||||
blockId: string,
|
||||
depth: number,
|
||||
currentDepth = 0
|
||||
) {
|
||||
if (currentDepth >= depth) {
|
||||
return [];
|
||||
}
|
||||
|
||||
// Retrieve the block's children
|
||||
const children = await collectPaginatedAPI(notion.blocks.children.list, {
|
||||
block_id: blockId,
|
||||
});
|
||||
|
||||
// Recursively retrieve children of each child block
|
||||
for (const child of children) {
|
||||
if (!isFullBlock(child) || !child.has_children) {
|
||||
continue;
|
||||
}
|
||||
const childChildren = await getBlockChildrenRecursively(
|
||||
notion,
|
||||
child.id,
|
||||
depth,
|
||||
currentDepth + 1
|
||||
);
|
||||
(child as BlockObjectResponseWithChildren).children = childChildren;
|
||||
}
|
||||
|
||||
return children;
|
||||
}
|
||||
|
||||
type BlockObjectResponseWithChildren = PartialBlockObjectResponse & {
|
||||
children?: BlockObjectResponseWithChildren[];
|
||||
};
|
||||
@@ -0,0 +1,91 @@
|
||||
import {
|
||||
createAction,
|
||||
OAuth2PropertyValue,
|
||||
} from '@activepieces/pieces-framework';
|
||||
import { Client } from '@notionhq/client';
|
||||
import { notionAuth } from '../..';
|
||||
import { notionCommon } from '../common';
|
||||
|
||||
export const restoreDatabaseItem = createAction({
|
||||
auth: notionAuth,
|
||||
name: 'restore_database_item',
|
||||
displayName: 'Restore Database Item',
|
||||
description:
|
||||
'Restore an archived database item back to active status. Perfect for recovering accidentally archived tasks, projects, or records.',
|
||||
props: {
|
||||
database_id: notionCommon.database_id,
|
||||
archived_item_id: notionCommon.archived_database_item_id,
|
||||
},
|
||||
async run(context) {
|
||||
const { database_id, archived_item_id } = context.propsValue;
|
||||
|
||||
if (!database_id) {
|
||||
throw new Error('Database selection is required');
|
||||
}
|
||||
|
||||
if (!archived_item_id) {
|
||||
throw new Error('Please select an archived item to restore');
|
||||
}
|
||||
|
||||
const notion = new Client({
|
||||
auth: (context.auth as OAuth2PropertyValue).access_token,
|
||||
notionVersion: '2022-02-22',
|
||||
});
|
||||
|
||||
try {
|
||||
const response = await notion.pages.update({
|
||||
page_id: archived_item_id,
|
||||
archived: false,
|
||||
});
|
||||
|
||||
let itemTitle = 'Database item';
|
||||
let itemUrl = undefined;
|
||||
|
||||
if ('properties' in response && response.properties) {
|
||||
const firstProperty = Object.values(response.properties)[0];
|
||||
if (
|
||||
firstProperty &&
|
||||
typeof firstProperty === 'object' &&
|
||||
'title' in firstProperty &&
|
||||
firstProperty.title
|
||||
) {
|
||||
itemTitle =
|
||||
(firstProperty.title as any)[0]?.plain_text || 'Untitled item';
|
||||
}
|
||||
}
|
||||
|
||||
if ('url' in response) {
|
||||
itemUrl = response.url;
|
||||
}
|
||||
|
||||
return {
|
||||
success: true,
|
||||
message: `"${itemTitle}" has been successfully restored and is now active`,
|
||||
restoredItem: {
|
||||
id: response.id,
|
||||
title: itemTitle,
|
||||
url: itemUrl,
|
||||
restored_at: new Date().toISOString(),
|
||||
},
|
||||
fullResponse: response,
|
||||
};
|
||||
} catch (error: any) {
|
||||
if (
|
||||
error.message?.includes('permissions') ||
|
||||
error.message?.includes('unauthorized')
|
||||
) {
|
||||
throw new Error(
|
||||
'Unable to restore item: Your Notion integration may lack edit permissions for this database. Please check your integration permissions in Notion.'
|
||||
);
|
||||
}
|
||||
|
||||
if (error.message?.includes('not_found')) {
|
||||
throw new Error(
|
||||
'The selected item could not be found. It may have been permanently deleted or moved to a different database.'
|
||||
);
|
||||
}
|
||||
|
||||
throw new Error(`Failed to restore database item: ${error.message}`);
|
||||
}
|
||||
},
|
||||
});
|
||||
@@ -0,0 +1,206 @@
|
||||
import {
|
||||
createAction,
|
||||
OAuth2PropertyValue,
|
||||
} from '@activepieces/pieces-framework';
|
||||
import { Client } from '@notionhq/client';
|
||||
import { notionAuth } from '../..';
|
||||
import { notionCommon } from '../common';
|
||||
import {
|
||||
FormStructure,
|
||||
NotionDatabase,
|
||||
NotionDatabaseProperty,
|
||||
} from '../common/types';
|
||||
|
||||
export const retrieveDatabase = createAction({
|
||||
auth: notionAuth,
|
||||
name: 'retrieve_database',
|
||||
displayName: 'Retrieve Database Structure',
|
||||
description:
|
||||
'Get detailed information about a Notion database including all its properties, field types, and configuration. Perfect for building dynamic forms, validation rules, or understanding database schemas.',
|
||||
props: {
|
||||
database_id: notionCommon.database_id,
|
||||
},
|
||||
async run(context) {
|
||||
const { database_id } = context.propsValue;
|
||||
|
||||
if (!database_id) {
|
||||
throw new Error('Database ID is required');
|
||||
}
|
||||
|
||||
const notion = new Client({
|
||||
auth: (context.auth as OAuth2PropertyValue).access_token,
|
||||
notionVersion: '2022-02-22',
|
||||
});
|
||||
|
||||
const database = (await notion.databases.retrieve({
|
||||
database_id: database_id,
|
||||
})) as NotionDatabase;
|
||||
|
||||
const formStructure: FormStructure = {
|
||||
id: database.id,
|
||||
title: database.title?.[0]?.plain_text || '',
|
||||
description: database.description?.[0]?.plain_text || '',
|
||||
properties: {},
|
||||
propertyTypes: {},
|
||||
requiredFields: [],
|
||||
selectOptions: {},
|
||||
statusOptions: {},
|
||||
relationConfig: {},
|
||||
formulaConfig: {},
|
||||
rollupConfig: {},
|
||||
numberConfig: {},
|
||||
};
|
||||
|
||||
Object.entries(database.properties).forEach(
|
||||
([key, property]: [string, NotionDatabaseProperty]) => {
|
||||
formStructure.properties[key] = {
|
||||
name: property.name || key,
|
||||
type: property.type,
|
||||
id: property.id,
|
||||
description: property.description || '',
|
||||
};
|
||||
|
||||
formStructure.propertyTypes[key] = property.type;
|
||||
|
||||
switch (property.type) {
|
||||
case 'select':
|
||||
if (property.select?.options) {
|
||||
formStructure.selectOptions[key] = property.select.options.map(
|
||||
(option: { name: string; color: string; id: string }) => ({
|
||||
name: option.name,
|
||||
color: option.color,
|
||||
id: option.id,
|
||||
})
|
||||
);
|
||||
}
|
||||
break;
|
||||
|
||||
case 'multi_select':
|
||||
if (property.multi_select?.options) {
|
||||
formStructure.selectOptions[key] =
|
||||
property.multi_select.options.map(
|
||||
(option: { name: string; color: string; id: string }) => ({
|
||||
name: option.name,
|
||||
color: option.color,
|
||||
id: option.id,
|
||||
})
|
||||
);
|
||||
}
|
||||
break;
|
||||
|
||||
case 'status':
|
||||
if (property.status) {
|
||||
formStructure.statusOptions[key] = {
|
||||
options:
|
||||
property.status.options?.map(
|
||||
(option: { name: string; color: string; id: string }) => ({
|
||||
name: option.name,
|
||||
color: option.color,
|
||||
id: option.id,
|
||||
})
|
||||
) || [],
|
||||
groups:
|
||||
property.status.groups?.map(
|
||||
(group: {
|
||||
name: string;
|
||||
color: string;
|
||||
id: string;
|
||||
option_ids: string[];
|
||||
}) => ({
|
||||
name: group.name,
|
||||
color: group.color,
|
||||
id: group.id,
|
||||
option_ids: group.option_ids || [],
|
||||
})
|
||||
) || [],
|
||||
};
|
||||
}
|
||||
break;
|
||||
|
||||
case 'relation':
|
||||
if (property.relation) {
|
||||
formStructure.relationConfig[key] = {
|
||||
database_id: property.relation.database_id,
|
||||
synced_property_id: property.relation.synced_property_id,
|
||||
synced_property_name: property.relation.synced_property_name,
|
||||
};
|
||||
}
|
||||
break;
|
||||
|
||||
case 'formula':
|
||||
if (property.formula) {
|
||||
formStructure.formulaConfig[key] = {
|
||||
expression: property.formula.expression,
|
||||
};
|
||||
}
|
||||
break;
|
||||
|
||||
case 'rollup':
|
||||
if (property.rollup) {
|
||||
formStructure.rollupConfig[key] = {
|
||||
function: property.rollup.function,
|
||||
relation_property_id: property.rollup.relation_property_id,
|
||||
relation_property_name: property.rollup.relation_property_name,
|
||||
rollup_property_id: property.rollup.rollup_property_id,
|
||||
rollup_property_name: property.rollup.rollup_property_name,
|
||||
};
|
||||
}
|
||||
break;
|
||||
|
||||
case 'number':
|
||||
if (property.number) {
|
||||
formStructure.numberConfig[key] = {
|
||||
format: property.number.format,
|
||||
};
|
||||
}
|
||||
break;
|
||||
|
||||
case 'checkbox':
|
||||
case 'created_by':
|
||||
case 'created_time':
|
||||
case 'date':
|
||||
case 'email':
|
||||
case 'files':
|
||||
case 'last_edited_by':
|
||||
case 'last_edited_time':
|
||||
case 'people':
|
||||
case 'phone_number':
|
||||
case 'rich_text':
|
||||
case 'title':
|
||||
case 'url':
|
||||
break;
|
||||
|
||||
default:
|
||||
console.warn(
|
||||
`Unknown property type: ${property.type} for property: ${key}`
|
||||
);
|
||||
break;
|
||||
}
|
||||
}
|
||||
);
|
||||
|
||||
const totalProperties = Object.keys(formStructure.properties).length;
|
||||
|
||||
return {
|
||||
success: true,
|
||||
database: database,
|
||||
formStructure: formStructure,
|
||||
summary: {
|
||||
title: formStructure.title || 'Untitled Database',
|
||||
totalProperties: totalProperties,
|
||||
propertyTypes: Object.values(formStructure.propertyTypes).reduce(
|
||||
(acc: Record<string, number>, type) => {
|
||||
acc[type] = (acc[type] || 0) + 1;
|
||||
return acc;
|
||||
},
|
||||
{}
|
||||
),
|
||||
},
|
||||
message: `📊 Database structure retrieved successfully! Found ${totalProperties} properties including ${
|
||||
Object.keys(formStructure.selectOptions).length
|
||||
} dropdown fields and ${
|
||||
Object.keys(formStructure.statusOptions).length
|
||||
} status fields.`,
|
||||
};
|
||||
},
|
||||
});
|
||||
@@ -0,0 +1,56 @@
|
||||
import {
|
||||
createAction,
|
||||
DynamicPropsValue,
|
||||
OAuth2PropertyValue,
|
||||
} from '@activepieces/pieces-framework';
|
||||
import { Client } from '@notionhq/client';
|
||||
import { NotionFieldMapping } from '../common/models';
|
||||
|
||||
import { notionAuth } from '../..';
|
||||
import { notionCommon } from '../common';
|
||||
export const updateDatabaseItem = createAction({
|
||||
auth: notionAuth,
|
||||
name: 'update_database_item',
|
||||
displayName: 'Update Database Item',
|
||||
description:
|
||||
'Update specific fields in a Notion database item. Perfect for maintaining data, tracking changes, or syncing information across systems.',
|
||||
props: {
|
||||
database_id: notionCommon.database_id,
|
||||
database_item_id: notionCommon.database_item_id,
|
||||
databaseFields: notionCommon.databaseFields,
|
||||
},
|
||||
async run(context) {
|
||||
const { database_id, database_item_id, databaseFields } =
|
||||
context.propsValue;
|
||||
|
||||
if (!database_item_id) throw new Error('Item ID is required');
|
||||
|
||||
const notionFields: DynamicPropsValue = {};
|
||||
|
||||
const notion = new Client({
|
||||
auth: (context.auth as OAuth2PropertyValue).access_token,
|
||||
notionVersion: '2022-02-22',
|
||||
});
|
||||
const { properties } = await notion.databases.retrieve({
|
||||
database_id: database_id as unknown as string,
|
||||
});
|
||||
|
||||
Object.keys(databaseFields).forEach((key) => {
|
||||
const value = databaseFields[key];
|
||||
if (
|
||||
value !== '' &&
|
||||
value !== undefined &&
|
||||
value !== null &&
|
||||
!(Array.isArray(value) && value.length === 0)
|
||||
) {
|
||||
const fieldType: string = properties[key].type;
|
||||
notionFields[key] =
|
||||
NotionFieldMapping[fieldType].buildNotionType(value);
|
||||
}
|
||||
});
|
||||
return await notion.pages.update({
|
||||
page_id: database_item_id,
|
||||
properties: notionFields,
|
||||
});
|
||||
},
|
||||
});
|
||||
@@ -0,0 +1,371 @@
|
||||
import {
|
||||
OAuth2PropertyValue,
|
||||
Property,
|
||||
DynamicPropsValue,
|
||||
} from '@activepieces/pieces-framework';
|
||||
import { Client } from '@notionhq/client';
|
||||
import { NotionFieldMapping } from './models';
|
||||
import { notionAuth } from '../..';
|
||||
|
||||
export const notionCommon = {
|
||||
baseUrl: 'https://api.notion.com/v1',
|
||||
database_id: Property.Dropdown<string, true, typeof notionAuth>({
|
||||
auth: notionAuth,
|
||||
displayName: 'Database',
|
||||
required: true,
|
||||
description:
|
||||
'Choose the Notion database you want to work with from your workspace',
|
||||
refreshers: [],
|
||||
options: async ({ auth }) => {
|
||||
if (!auth) {
|
||||
return {
|
||||
disabled: true,
|
||||
placeholder: 'Please connect your Notion account first',
|
||||
options: [],
|
||||
};
|
||||
}
|
||||
const notion = new Client({
|
||||
auth: (auth as OAuth2PropertyValue).access_token,
|
||||
notionVersion: '2022-02-22',
|
||||
});
|
||||
const databases = await notion.search({
|
||||
filter: {
|
||||
property: 'object',
|
||||
value: 'database',
|
||||
},
|
||||
});
|
||||
return {
|
||||
placeholder: 'Select a database',
|
||||
options: databases.results
|
||||
.filter((f: any) => f.title.length > 0)
|
||||
.map((database: any) => ({
|
||||
label: database.title?.[0]?.plain_text ?? 'Unknown title',
|
||||
value: database.id,
|
||||
})),
|
||||
};
|
||||
},
|
||||
}),
|
||||
database_item_id: Property.Dropdown({
|
||||
auth: notionAuth,
|
||||
displayName: 'Database Item',
|
||||
description: 'Select the item you want to update',
|
||||
required: true,
|
||||
refreshers: ['database_id'],
|
||||
options: async ({ auth, database_id }) => {
|
||||
if (!auth || !database_id) {
|
||||
return {
|
||||
disabled: true,
|
||||
placeholder:
|
||||
'Please connect your Notion account first and select database',
|
||||
options: [],
|
||||
};
|
||||
}
|
||||
const notion = new Client({
|
||||
auth: (auth as OAuth2PropertyValue).access_token,
|
||||
notionVersion: '2022-02-22',
|
||||
});
|
||||
const { results } = await notion.databases.query({
|
||||
database_id: database_id as string,
|
||||
filter_properties: ['title'],
|
||||
});
|
||||
return {
|
||||
disabled: false,
|
||||
options: results.map((item: any) => {
|
||||
const property: any = Object.values(item.properties)[0];
|
||||
return {
|
||||
label: property.title[0]?.plain_text ?? 'No Title',
|
||||
value: item.id,
|
||||
};
|
||||
}),
|
||||
};
|
||||
},
|
||||
}),
|
||||
archived_database_item_id: Property.Dropdown({
|
||||
auth: notionAuth,
|
||||
displayName: 'Archived Item',
|
||||
description:
|
||||
'Choose which archived item to restore from the selected database',
|
||||
required: true,
|
||||
refreshers: ['database_id'],
|
||||
options: async ({ auth, database_id }) => {
|
||||
if (!auth || !database_id) {
|
||||
return {
|
||||
disabled: true,
|
||||
placeholder:
|
||||
'Please connect your Notion account first and select a database',
|
||||
options: [],
|
||||
};
|
||||
}
|
||||
|
||||
try {
|
||||
const notion = new Client({
|
||||
auth: (auth as OAuth2PropertyValue).access_token,
|
||||
notionVersion: '2022-02-22',
|
||||
});
|
||||
|
||||
const { results } = await notion.databases.query({
|
||||
database_id: database_id as string,
|
||||
filter_properties: ['title'],
|
||||
archived: true, // Only fetch archived items
|
||||
});
|
||||
|
||||
if (results.length === 0) {
|
||||
return {
|
||||
disabled: false,
|
||||
options: [],
|
||||
placeholder: 'No archived items found in this database',
|
||||
};
|
||||
}
|
||||
|
||||
return {
|
||||
disabled: false,
|
||||
placeholder: 'Select an archived item to restore',
|
||||
options: results.map((item: any) => {
|
||||
const property: any = Object.values(item.properties)[0];
|
||||
const title = property?.title?.[0]?.plain_text || 'Untitled';
|
||||
return {
|
||||
label: `${title} (archived)`,
|
||||
value: item.id,
|
||||
};
|
||||
}),
|
||||
};
|
||||
} catch (error: any) {
|
||||
return {
|
||||
disabled: true,
|
||||
placeholder:
|
||||
'Error loading archived items. Please check your database permissions.',
|
||||
options: [],
|
||||
};
|
||||
}
|
||||
},
|
||||
}),
|
||||
databaseFields: Property.DynamicProperties({
|
||||
auth: notionAuth,
|
||||
displayName: 'Fields',
|
||||
required: true,
|
||||
refreshers: ['database_id'],
|
||||
props: async ({ auth, database_id }) => {
|
||||
if (!auth || !database_id) {
|
||||
return {
|
||||
disabled: true,
|
||||
placeholder:
|
||||
'Please connect your Notion account first and select database',
|
||||
options: [],
|
||||
};
|
||||
}
|
||||
const fields: DynamicPropsValue = {};
|
||||
try {
|
||||
const notion = new Client({
|
||||
auth: (auth as OAuth2PropertyValue).access_token,
|
||||
notionVersion: '2022-02-22',
|
||||
});
|
||||
const { properties } = await notion.databases.retrieve({
|
||||
database_id: database_id as unknown as string,
|
||||
});
|
||||
for (const key in properties) {
|
||||
try {
|
||||
const property = properties[key];
|
||||
if (
|
||||
[
|
||||
'rollup',
|
||||
'button',
|
||||
'files',
|
||||
'verification',
|
||||
'formula',
|
||||
'unique_id',
|
||||
'relation',
|
||||
'created_by',
|
||||
'created_time',
|
||||
'last_edited_by',
|
||||
'last_edited_time',
|
||||
].includes(property.type)
|
||||
) {
|
||||
continue;
|
||||
}
|
||||
if (property.type === 'people') {
|
||||
const { results } = await notion.users.list({ page_size: 100 });
|
||||
fields[property.name] = Property.StaticMultiSelectDropdown({
|
||||
displayName: property.name,
|
||||
required: false,
|
||||
options: {
|
||||
disabled: false,
|
||||
options: results
|
||||
.filter(
|
||||
(user) => user.type === 'person' && user.name !== null
|
||||
)
|
||||
.map((option: { id: string; name: any }) => {
|
||||
return {
|
||||
label: option.name,
|
||||
value: option.id,
|
||||
};
|
||||
}),
|
||||
},
|
||||
});
|
||||
} else {
|
||||
fields[property.name] =
|
||||
NotionFieldMapping[property.type].buildActivepieceType(
|
||||
property
|
||||
);
|
||||
}
|
||||
} catch (e) {
|
||||
console.error(
|
||||
'Notion: could not generate dynamic input property',
|
||||
e
|
||||
);
|
||||
}
|
||||
}
|
||||
} catch (e) {
|
||||
console.debug(e);
|
||||
}
|
||||
return fields;
|
||||
},
|
||||
}),
|
||||
filterDatabaseFields: Property.DynamicProperties({
|
||||
auth: notionAuth,
|
||||
displayName: 'Fields',
|
||||
required: true,
|
||||
refreshers: ['database_id'],
|
||||
props: async ({ auth, database_id }) => {
|
||||
if (!auth || !database_id) {
|
||||
return {
|
||||
disabled: true,
|
||||
placeholder:
|
||||
'Please connect your Notion account first and select database',
|
||||
options: [],
|
||||
};
|
||||
}
|
||||
const fields: DynamicPropsValue = {};
|
||||
try {
|
||||
const notion = new Client({
|
||||
auth: (auth as OAuth2PropertyValue).access_token,
|
||||
notionVersion: '2022-02-22',
|
||||
});
|
||||
const { properties } = await notion.databases.retrieve({
|
||||
database_id: database_id as unknown as string,
|
||||
});
|
||||
|
||||
for (const key in properties) {
|
||||
const property = properties[key];
|
||||
if (
|
||||
[
|
||||
'rollup',
|
||||
'button',
|
||||
'files',
|
||||
'verification',
|
||||
'status',
|
||||
'multi_select',
|
||||
'formula',
|
||||
'unique_id',
|
||||
'relation',
|
||||
'checkbox',
|
||||
'created_by',
|
||||
'created_time',
|
||||
'last_edited_by',
|
||||
'last_edited_time',
|
||||
].includes(property.type)
|
||||
) {
|
||||
continue;
|
||||
}
|
||||
fields[property.name] =
|
||||
NotionFieldMapping[property.type].buildActivepieceType(property);
|
||||
}
|
||||
} catch (e) {
|
||||
console.debug(e);
|
||||
}
|
||||
return fields;
|
||||
},
|
||||
}),
|
||||
|
||||
page: Property.Dropdown({
|
||||
auth: notionAuth,
|
||||
displayName: 'Page',
|
||||
required: true,
|
||||
description:
|
||||
'Choose the Notion page you want to work with. This list shows your 100 most recently edited pages for easy selection.',
|
||||
refreshers: [],
|
||||
options: async ({ auth }) => {
|
||||
if (!auth) {
|
||||
return {
|
||||
disabled: true,
|
||||
placeholder: 'Please connect your Notion account first',
|
||||
options: [],
|
||||
};
|
||||
}
|
||||
const pages = await getPages(auth as OAuth2PropertyValue);
|
||||
|
||||
return {
|
||||
placeholder: 'Select a page',
|
||||
options: pages.map((page: any) => ({
|
||||
label:
|
||||
page.properties.Name?.title[0]?.plain_text ??
|
||||
page.properties.title?.title[0]?.text?.content ??
|
||||
'No Title',
|
||||
value: page.id,
|
||||
})),
|
||||
};
|
||||
},
|
||||
}),
|
||||
};
|
||||
|
||||
export async function getPages(
|
||||
auth: OAuth2PropertyValue,
|
||||
search?: {
|
||||
editedAfter?: Date;
|
||||
createdAfter?: Date;
|
||||
},
|
||||
sort?: {
|
||||
property: string;
|
||||
direction: 'ascending' | 'descending';
|
||||
}
|
||||
): Promise<any[]> {
|
||||
const notion = new Client({
|
||||
auth: auth.access_token,
|
||||
notionVersion: '2022-02-22',
|
||||
});
|
||||
|
||||
let filter: any = {
|
||||
property: 'object',
|
||||
value: 'page',
|
||||
};
|
||||
if (search?.editedAfter)
|
||||
filter = {
|
||||
and: [
|
||||
{
|
||||
property: 'object',
|
||||
value: 'page',
|
||||
},
|
||||
{
|
||||
timestamp: 'last_edited_time',
|
||||
last_edited_time: {
|
||||
after: search.editedAfter,
|
||||
},
|
||||
},
|
||||
],
|
||||
};
|
||||
if (search?.createdAfter)
|
||||
filter = {
|
||||
and: [
|
||||
{
|
||||
property: 'object',
|
||||
value: 'page',
|
||||
},
|
||||
{
|
||||
timestamp: 'created_time',
|
||||
created_time: {
|
||||
after: search.createdAfter,
|
||||
},
|
||||
},
|
||||
],
|
||||
};
|
||||
|
||||
const sortObj: any = {
|
||||
direction: sort?.direction ?? 'descending',
|
||||
timestamp: sort?.property ?? 'last_edited_time',
|
||||
};
|
||||
|
||||
const pages = await notion.search({
|
||||
filter: filter,
|
||||
sort: sortObj,
|
||||
});
|
||||
return pages.results as any[];
|
||||
}
|
||||
@@ -0,0 +1,472 @@
|
||||
import { DynamicPropsValue, Property } from '@activepieces/pieces-framework';
|
||||
type SelectColor =
|
||||
| 'default'
|
||||
| 'gray'
|
||||
| 'brown'
|
||||
| 'orange'
|
||||
| 'yellow'
|
||||
| 'green'
|
||||
| 'blue'
|
||||
| 'purple'
|
||||
| 'pink'
|
||||
| 'red';
|
||||
|
||||
type DateDatabaseProperty = {
|
||||
id: string;
|
||||
name: string;
|
||||
type: 'date';
|
||||
date: Record<string, never>;
|
||||
};
|
||||
type CheckboxDatabaseProperty = {
|
||||
id: string;
|
||||
name: string;
|
||||
type: 'checkbox';
|
||||
checkbox: Record<string, never>;
|
||||
};
|
||||
type CreatedByDatabaseProperty = {
|
||||
id: string;
|
||||
name: string;
|
||||
type: 'created_by';
|
||||
};
|
||||
type CreatedTimeDatabaseProperty = {
|
||||
id: string;
|
||||
name: string;
|
||||
type: 'created_time';
|
||||
created_time: Record<string, never>;
|
||||
};
|
||||
type EmailDatabaseProperty = {
|
||||
id: string;
|
||||
name: string;
|
||||
type: 'email';
|
||||
email: Record<string, never>;
|
||||
};
|
||||
type FilesDatabaseProperty = {
|
||||
id: string;
|
||||
name: string;
|
||||
type: 'files';
|
||||
files: Record<string, never>;
|
||||
};
|
||||
type FormulaDatabaseProperty = {
|
||||
id: string;
|
||||
name: string;
|
||||
type: 'formula';
|
||||
formula: {
|
||||
expression: string;
|
||||
};
|
||||
};
|
||||
type LastEditedByDatabaseProperty = {
|
||||
id: string;
|
||||
name: string;
|
||||
type: 'last_edited_by';
|
||||
last_edited_by: Record<string, never>;
|
||||
};
|
||||
type LastEditedTimeDatabaseProperty = {
|
||||
id: string;
|
||||
name: string;
|
||||
type: 'last_edited_time';
|
||||
last_edited_time: Record<string, never>;
|
||||
};
|
||||
type MultiSelectDatabaseProperty = {
|
||||
id: string;
|
||||
name: string;
|
||||
type: 'multi_select';
|
||||
multi_select: {
|
||||
options: {
|
||||
id: string;
|
||||
name: string;
|
||||
color: SelectColor;
|
||||
}[];
|
||||
};
|
||||
};
|
||||
type NumberFormat =
|
||||
| 'number'
|
||||
| 'number_with_commas'
|
||||
| 'percent'
|
||||
| 'dollar'
|
||||
| 'canadian_dollar'
|
||||
| 'singapore_dollar'
|
||||
| 'euro'
|
||||
| 'pound'
|
||||
| 'yen'
|
||||
| 'ruble'
|
||||
| 'rupee'
|
||||
| 'won'
|
||||
| 'yuan'
|
||||
| 'real'
|
||||
| 'lira'
|
||||
| 'rupiah'
|
||||
| 'franc'
|
||||
| 'hong_kong_dollar'
|
||||
| 'new_zealand_dollar'
|
||||
| 'krona'
|
||||
| 'norwegian_krone'
|
||||
| 'mexican_peso'
|
||||
| 'rand'
|
||||
| 'new_taiwan_dollar'
|
||||
| 'danish_krone'
|
||||
| 'zloty'
|
||||
| 'baht'
|
||||
| 'forint'
|
||||
| 'koruna'
|
||||
| 'shekel'
|
||||
| 'chilean_peso'
|
||||
| 'philippine_peso'
|
||||
| 'dirham'
|
||||
| 'colombian_peso'
|
||||
| 'riyal'
|
||||
| 'ringgit'
|
||||
| 'leu'
|
||||
| 'argentine_peso'
|
||||
| 'uruguayan_peso'
|
||||
| 'peruvian_sol';
|
||||
type NumberDatabaseProperty = {
|
||||
id: string;
|
||||
name: string;
|
||||
type: 'number';
|
||||
number: {
|
||||
format: NumberFormat;
|
||||
};
|
||||
};
|
||||
type PeopleDatabaseProperty = {
|
||||
id: string;
|
||||
name: string;
|
||||
type: 'people';
|
||||
people: Record<string, never>;
|
||||
};
|
||||
type PhoneNumberDatabaseProperty = {
|
||||
id: string;
|
||||
name: string;
|
||||
type: 'phone_number';
|
||||
phone_number: Record<string, never>;
|
||||
};
|
||||
type RelationDatabaseProperty = {
|
||||
id: string;
|
||||
name: string;
|
||||
type: 'relation';
|
||||
relation: {
|
||||
database_id: string;
|
||||
synced_property_id: string;
|
||||
synced_property_name: string;
|
||||
};
|
||||
};
|
||||
type RichTextDatabaseProperty = {
|
||||
id: string;
|
||||
name: string;
|
||||
type: 'rich_text';
|
||||
rich_text: Record<string, never>;
|
||||
};
|
||||
type RollupFunction =
|
||||
| 'count'
|
||||
| 'count_values'
|
||||
| 'empty'
|
||||
| 'not_empty'
|
||||
| 'unique'
|
||||
| 'show_unique'
|
||||
| 'percent_empty'
|
||||
| 'percent_not_empty'
|
||||
| 'sum'
|
||||
| 'average'
|
||||
| 'median'
|
||||
| 'min'
|
||||
| 'max'
|
||||
| 'range'
|
||||
| 'earliest_date'
|
||||
| 'latest_date'
|
||||
| 'date_range'
|
||||
| 'checked'
|
||||
| 'unchecked'
|
||||
| 'percent_checked'
|
||||
| 'percent_unchecked'
|
||||
| 'count_per_group'
|
||||
| 'percent_per_group'
|
||||
| 'show_original';
|
||||
|
||||
type RollupDatabaseProperty = {
|
||||
type: 'rollup';
|
||||
rollup: {
|
||||
rollup_property_name: string;
|
||||
relation_property_name: string;
|
||||
rollup_property_id: string;
|
||||
relation_property_id: string;
|
||||
function: RollupFunction;
|
||||
};
|
||||
id: string;
|
||||
name: string;
|
||||
};
|
||||
type SelectDatabaseProperty = {
|
||||
id: string;
|
||||
name: string;
|
||||
type: 'select';
|
||||
select: {
|
||||
options: {
|
||||
id: string;
|
||||
name: string;
|
||||
color: SelectColor;
|
||||
}[];
|
||||
};
|
||||
};
|
||||
type StatusDatabaseProperty = {
|
||||
id: string;
|
||||
name: string;
|
||||
type: 'status';
|
||||
status: {
|
||||
options: {
|
||||
id: string;
|
||||
name: string;
|
||||
color: SelectColor;
|
||||
}[];
|
||||
groups: {
|
||||
id: string;
|
||||
name: string;
|
||||
color: SelectColor;
|
||||
option_ids: Array<string>;
|
||||
};
|
||||
};
|
||||
};
|
||||
type TitleDatabaseProperty = {
|
||||
type: 'title';
|
||||
title: Record<string, never>;
|
||||
id: string;
|
||||
name: string;
|
||||
};
|
||||
type UrlDatabaseProperty = {
|
||||
type: 'url';
|
||||
url: Record<string, never>;
|
||||
id: string;
|
||||
name: string;
|
||||
};
|
||||
export type DatabaseProperty =
|
||||
| NumberDatabaseProperty
|
||||
| FormulaDatabaseProperty
|
||||
| SelectDatabaseProperty
|
||||
| MultiSelectDatabaseProperty
|
||||
| StatusDatabaseProperty
|
||||
| RelationDatabaseProperty
|
||||
| RollupDatabaseProperty
|
||||
| TitleDatabaseProperty
|
||||
| RichTextDatabaseProperty
|
||||
| UrlDatabaseProperty
|
||||
| PeopleDatabaseProperty
|
||||
| FilesDatabaseProperty
|
||||
| EmailDatabaseProperty
|
||||
| PhoneNumberDatabaseProperty
|
||||
| DateDatabaseProperty
|
||||
| CheckboxDatabaseProperty
|
||||
| CreatedByDatabaseProperty
|
||||
| CreatedTimeDatabaseProperty
|
||||
| LastEditedByDatabaseProperty
|
||||
| LastEditedTimeDatabaseProperty;
|
||||
|
||||
export interface NotionDatabase {
|
||||
object: 'database';
|
||||
id: string;
|
||||
created_time: string;
|
||||
created_by: {
|
||||
object: 'user';
|
||||
id: string;
|
||||
};
|
||||
last_edited_time: string;
|
||||
last_edited_by: {
|
||||
object: 'user';
|
||||
id: string;
|
||||
};
|
||||
is_inline: boolean;
|
||||
archived: boolean;
|
||||
url: string;
|
||||
public_url: string | null;
|
||||
cover:
|
||||
| {
|
||||
type: 'external';
|
||||
external: {
|
||||
url: string;
|
||||
};
|
||||
}
|
||||
| null
|
||||
| {
|
||||
type: 'file';
|
||||
file: {
|
||||
url: string;
|
||||
expiry_time: string;
|
||||
};
|
||||
}
|
||||
| null;
|
||||
properties: Record<string, DatabaseProperty>;
|
||||
parent:
|
||||
| {
|
||||
type: 'database_id';
|
||||
database_id: string;
|
||||
}
|
||||
| {
|
||||
type: 'page_id';
|
||||
page_id: string;
|
||||
}
|
||||
| {
|
||||
type: 'block_id';
|
||||
block_id: string;
|
||||
}
|
||||
| {
|
||||
type: 'workspace';
|
||||
workspace: true;
|
||||
};
|
||||
}
|
||||
|
||||
export const NotionFieldMapping: Record<string, any> = {
|
||||
checkbox: {
|
||||
buildActivepieceType: (property: CheckboxDatabaseProperty) =>
|
||||
Property.Checkbox({
|
||||
displayName: property.name,
|
||||
required: false,
|
||||
}),
|
||||
buildNotionType: (property: DynamicPropsValue) => ({
|
||||
checkbox: property,
|
||||
}),
|
||||
},
|
||||
date: {
|
||||
buildActivepieceType: (property: DateDatabaseProperty) =>
|
||||
Property.DateTime({
|
||||
displayName: property.name,
|
||||
required: false,
|
||||
}),
|
||||
buildNotionType: (property: DynamicPropsValue) => ({
|
||||
date: {
|
||||
start: property,
|
||||
},
|
||||
}),
|
||||
},
|
||||
email: {
|
||||
buildActivepieceType: (property: EmailDatabaseProperty) =>
|
||||
Property.ShortText({
|
||||
displayName: property.name,
|
||||
required: false,
|
||||
}),
|
||||
buildNotionType: (property: DynamicPropsValue) => ({
|
||||
email: property,
|
||||
}),
|
||||
},
|
||||
// formula: Property.ShortText,
|
||||
select: {
|
||||
buildActivepieceType: (property: SelectDatabaseProperty) =>
|
||||
Property.StaticDropdown({
|
||||
displayName: property.name,
|
||||
required: false,
|
||||
options: {
|
||||
disabled: false,
|
||||
options: property.select.options?.map((option) => {
|
||||
return {
|
||||
label: option.name,
|
||||
value: option.name,
|
||||
};
|
||||
}),
|
||||
},
|
||||
}),
|
||||
buildNotionType: (property: DynamicPropsValue) => ({
|
||||
select: {
|
||||
name: property,
|
||||
},
|
||||
}),
|
||||
},
|
||||
multi_select: {
|
||||
buildActivepieceType: (property: MultiSelectDatabaseProperty) =>
|
||||
Property.StaticMultiSelectDropdown({
|
||||
displayName: property.name,
|
||||
required: false,
|
||||
options: {
|
||||
disabled: false,
|
||||
options: property.multi_select.options?.map((option) => {
|
||||
return {
|
||||
label: option.name,
|
||||
value: option.name,
|
||||
};
|
||||
}),
|
||||
},
|
||||
}),
|
||||
buildNotionType: (property: DynamicPropsValue) => ({
|
||||
multi_select: property.map((name: any) => ({ name: name })),
|
||||
}),
|
||||
},
|
||||
status: {
|
||||
buildActivepieceType: (property: StatusDatabaseProperty) =>
|
||||
Property.StaticDropdown({
|
||||
displayName: property.name,
|
||||
required: false,
|
||||
options: {
|
||||
disabled: false,
|
||||
options: property.status.options?.map((option) => {
|
||||
return {
|
||||
label: option.name,
|
||||
value: option.name,
|
||||
};
|
||||
}),
|
||||
},
|
||||
}),
|
||||
buildNotionType: (property: DynamicPropsValue) => ({
|
||||
status: {
|
||||
name: property,
|
||||
},
|
||||
}),
|
||||
},
|
||||
number: {
|
||||
buildActivepieceType: (property: NumberDatabaseProperty) =>
|
||||
Property.Number({
|
||||
displayName: property.name,
|
||||
required: false,
|
||||
}),
|
||||
buildNotionType: (property: DynamicPropsValue) => ({
|
||||
number: Number(property),
|
||||
}),
|
||||
},
|
||||
phone_number: {
|
||||
buildActivepieceType: (property: PhoneNumberDatabaseProperty) =>
|
||||
Property.Number({
|
||||
displayName: property.name,
|
||||
required: false,
|
||||
}),
|
||||
buildNotionType: (property: DynamicPropsValue) => ({
|
||||
phone_number: property,
|
||||
}),
|
||||
},
|
||||
rich_text: {
|
||||
buildActivepieceType: (property: RichTextDatabaseProperty) =>
|
||||
Property.LongText({ displayName: property.name, required: false }),
|
||||
buildNotionType: (property: DynamicPropsValue) => ({
|
||||
rich_text: [
|
||||
{
|
||||
type: 'text',
|
||||
text: {
|
||||
content: property,
|
||||
},
|
||||
},
|
||||
],
|
||||
}),
|
||||
},
|
||||
title: {
|
||||
buildActivepieceType: (property: TitleDatabaseProperty) =>
|
||||
Property.ShortText({ displayName: property.name, required: false }),
|
||||
buildNotionType: (property: DynamicPropsValue) => ({
|
||||
title: [
|
||||
{
|
||||
type: 'text',
|
||||
text: {
|
||||
content: property,
|
||||
},
|
||||
},
|
||||
],
|
||||
}),
|
||||
},
|
||||
url: {
|
||||
buildActivepieceType: (property: UrlDatabaseProperty) =>
|
||||
Property.ShortText({
|
||||
displayName: property.name,
|
||||
required: false,
|
||||
}),
|
||||
buildNotionType: (property: DynamicPropsValue) => ({
|
||||
url: property,
|
||||
}),
|
||||
},
|
||||
people: {
|
||||
buildActivepieceType: undefined,
|
||||
buildNotionType: (property: DynamicPropsValue) => ({
|
||||
people: property.map((id: any) => ({ id: id })),
|
||||
}),
|
||||
},
|
||||
};
|
||||
@@ -0,0 +1,101 @@
|
||||
interface NotionDatabaseProperty {
|
||||
id: string;
|
||||
name: string;
|
||||
type: string;
|
||||
description?: string;
|
||||
select?: {
|
||||
options: Array<{ name: string; color: string; id: string }>;
|
||||
};
|
||||
multi_select?: {
|
||||
options: Array<{ name: string; color: string; id: string }>;
|
||||
};
|
||||
status?: {
|
||||
options: Array<{ name: string; color: string; id: string }>;
|
||||
groups: Array<{
|
||||
name: string;
|
||||
color: string;
|
||||
id: string;
|
||||
option_ids: string[];
|
||||
}>;
|
||||
};
|
||||
relation?: {
|
||||
database_id: string;
|
||||
synced_property_id?: string;
|
||||
synced_property_name?: string;
|
||||
};
|
||||
formula?: {
|
||||
expression: string;
|
||||
};
|
||||
rollup?: {
|
||||
function: string;
|
||||
relation_property_id: string;
|
||||
relation_property_name: string;
|
||||
rollup_property_id: string;
|
||||
rollup_property_name: string;
|
||||
};
|
||||
number?: {
|
||||
format: string;
|
||||
};
|
||||
}
|
||||
|
||||
interface NotionDatabase {
|
||||
id: string;
|
||||
title: Array<{ plain_text: string }>;
|
||||
description: Array<{ plain_text: string }> | null;
|
||||
properties: Record<string, NotionDatabaseProperty>;
|
||||
}
|
||||
|
||||
interface FormStructure {
|
||||
id: string;
|
||||
title: string;
|
||||
description: string;
|
||||
properties: Record<
|
||||
string,
|
||||
{
|
||||
name: string;
|
||||
type: string;
|
||||
id: string;
|
||||
description: string;
|
||||
}
|
||||
>;
|
||||
propertyTypes: Record<string, string>;
|
||||
requiredFields: string[];
|
||||
selectOptions: Record<
|
||||
string,
|
||||
Array<{ name: string; color: string; id: string }>
|
||||
>;
|
||||
statusOptions: Record<
|
||||
string,
|
||||
{
|
||||
options: Array<{ name: string; color: string; id: string }>;
|
||||
groups: Array<{
|
||||
name: string;
|
||||
color: string;
|
||||
id: string;
|
||||
option_ids: string[];
|
||||
}>;
|
||||
}
|
||||
>;
|
||||
relationConfig: Record<
|
||||
string,
|
||||
{
|
||||
database_id: string;
|
||||
synced_property_id?: string;
|
||||
synced_property_name?: string;
|
||||
}
|
||||
>;
|
||||
formulaConfig: Record<string, { expression: string }>;
|
||||
rollupConfig: Record<
|
||||
string,
|
||||
{
|
||||
function: string;
|
||||
relation_property_id: string;
|
||||
relation_property_name: string;
|
||||
rollup_property_id: string;
|
||||
rollup_property_name: string;
|
||||
}
|
||||
>;
|
||||
numberConfig: Record<string, { format: string }>;
|
||||
}
|
||||
|
||||
export { FormStructure, NotionDatabase, NotionDatabaseProperty };
|
||||
@@ -0,0 +1,178 @@
|
||||
import {
|
||||
DedupeStrategy,
|
||||
Polling,
|
||||
pollingHelper,
|
||||
} from '@activepieces/pieces-common';
|
||||
import {
|
||||
createTrigger,
|
||||
TriggerStrategy,
|
||||
OAuth2PropertyValue,
|
||||
AppConnectionValueForAuthProperty,
|
||||
} from '@activepieces/pieces-framework';
|
||||
import dayjs from 'dayjs';
|
||||
import { notionCommon } from '../common';
|
||||
import { Client } from '@notionhq/client';
|
||||
import { notionAuth } from '../..';
|
||||
|
||||
export const newComment = createTrigger({
|
||||
auth: notionAuth,
|
||||
name: 'new_comment',
|
||||
displayName: 'New Comment',
|
||||
description:
|
||||
'Triggers whenever someone adds a new comment to a specific Notion page. Perfect for notifications, review workflows, or automated responses to team feedback.',
|
||||
props: {
|
||||
page_id: notionCommon.page,
|
||||
},
|
||||
sampleData: {
|
||||
object: 'comment',
|
||||
id: '223805e9-774b-80b1-9194-001d0c8f56dd',
|
||||
parent: {
|
||||
type: 'page_id',
|
||||
page_id: '1d5805e9-774b-8071-80c0-ffcea9b13b94',
|
||||
},
|
||||
discussion_id: 'f1c805e9-774b-824f-8511-83edf6abbdda',
|
||||
created_time: '2025-07-01T07:19:00.000Z',
|
||||
last_edited_time: '2025-07-01T07:19:00.000Z',
|
||||
created_by: {
|
||||
object: 'user',
|
||||
id: '0f46d5cf-06ee-4350-8051-79ad10c898a6',
|
||||
},
|
||||
rich_text: [
|
||||
{
|
||||
type: 'text',
|
||||
text: {
|
||||
content: 'Good DX',
|
||||
link: null,
|
||||
},
|
||||
annotations: {
|
||||
bold: false,
|
||||
italic: false,
|
||||
strikethrough: false,
|
||||
underline: false,
|
||||
code: false,
|
||||
color: 'default',
|
||||
},
|
||||
plain_text: 'Good DX',
|
||||
href: null,
|
||||
},
|
||||
],
|
||||
display_name: {
|
||||
type: 'integration',
|
||||
resolved_name: 'Activepieces',
|
||||
},
|
||||
},
|
||||
type: TriggerStrategy.POLLING,
|
||||
async test(ctx) {
|
||||
return await pollingHelper.test(polling, {
|
||||
auth: ctx.auth,
|
||||
store: ctx.store,
|
||||
propsValue: ctx.propsValue,
|
||||
files: ctx.files,
|
||||
});
|
||||
},
|
||||
async onEnable(ctx) {
|
||||
await pollingHelper.onEnable(polling, {
|
||||
auth: ctx.auth,
|
||||
store: ctx.store,
|
||||
propsValue: ctx.propsValue,
|
||||
});
|
||||
},
|
||||
async onDisable(ctx) {
|
||||
await pollingHelper.onDisable(polling, {
|
||||
auth: ctx.auth,
|
||||
store: ctx.store,
|
||||
propsValue: ctx.propsValue,
|
||||
});
|
||||
},
|
||||
async run(ctx) {
|
||||
return await pollingHelper.poll(polling, {
|
||||
auth: ctx.auth,
|
||||
store: ctx.store,
|
||||
propsValue: ctx.propsValue,
|
||||
files: ctx.files,
|
||||
});
|
||||
},
|
||||
});
|
||||
|
||||
const polling: Polling<
|
||||
AppConnectionValueForAuthProperty<typeof notionAuth>,
|
||||
{ page_id: string | undefined }
|
||||
> = {
|
||||
strategy: DedupeStrategy.LAST_ITEM,
|
||||
items: async ({ auth, propsValue, lastItemId }) => {
|
||||
const lastItem = lastItemId as string;
|
||||
let lastCreatedDate: string | null;
|
||||
|
||||
if (lastItem) {
|
||||
const lastUpdatedEpochMS = Number(lastItem.split('|')[1]);
|
||||
lastCreatedDate = dayjs(lastUpdatedEpochMS).toISOString();
|
||||
} else {
|
||||
lastCreatedDate = lastItem;
|
||||
}
|
||||
|
||||
const items = await getComments(
|
||||
auth,
|
||||
propsValue.page_id || '',
|
||||
lastCreatedDate
|
||||
);
|
||||
return items.map((item) => {
|
||||
const comment = item as { created_time: string; id: string };
|
||||
return {
|
||||
id: comment.id + '|' + dayjs(comment.created_time).valueOf(),
|
||||
data: item,
|
||||
};
|
||||
});
|
||||
},
|
||||
};
|
||||
|
||||
const getComments = async (
|
||||
authentication: OAuth2PropertyValue,
|
||||
page_id: string,
|
||||
startDate: string | null
|
||||
) => {
|
||||
const notion = new Client({
|
||||
auth: authentication.access_token,
|
||||
notionVersion: '2022-02-22',
|
||||
});
|
||||
|
||||
let cursor;
|
||||
let hasMore = true;
|
||||
let shouldContinue = true;
|
||||
|
||||
const results = [];
|
||||
|
||||
do {
|
||||
try {
|
||||
const response = await notion.comments.list({
|
||||
start_cursor: cursor,
|
||||
block_id: page_id,
|
||||
});
|
||||
|
||||
hasMore = response.has_more;
|
||||
cursor = response.next_cursor ?? undefined;
|
||||
|
||||
for (const comment of response.results) {
|
||||
if (
|
||||
startDate &&
|
||||
!dayjs(comment.created_time).isAfter(dayjs(startDate))
|
||||
) {
|
||||
shouldContinue = false;
|
||||
break;
|
||||
}
|
||||
results.push(comment);
|
||||
}
|
||||
} catch (error) {
|
||||
if ((error as Error).message?.includes('permissions')) {
|
||||
throw new Error(
|
||||
'Integration lacks required "read comments" capability.'
|
||||
);
|
||||
}
|
||||
throw error;
|
||||
}
|
||||
} while (hasMore && shouldContinue);
|
||||
|
||||
return results.sort(
|
||||
(a: { created_time: string }, b: { created_time: string }) =>
|
||||
dayjs(b.created_time).valueOf() - dayjs(a.created_time).valueOf()
|
||||
);
|
||||
};
|
||||
@@ -0,0 +1,195 @@
|
||||
import {
|
||||
DedupeStrategy,
|
||||
Polling,
|
||||
pollingHelper,
|
||||
} from '@activepieces/pieces-common';
|
||||
import {
|
||||
createTrigger,
|
||||
TriggerStrategy,
|
||||
OAuth2PropertyValue,
|
||||
AppConnectionValueForAuthProperty,
|
||||
} from '@activepieces/pieces-framework';
|
||||
import dayjs from 'dayjs';
|
||||
import { notionCommon } from '../common';
|
||||
import { Client } from '@notionhq/client';
|
||||
import { notionAuth } from '../..';
|
||||
import { isNil } from '@activepieces/shared';
|
||||
|
||||
export const newDatabaseItem = createTrigger({
|
||||
auth: notionAuth,
|
||||
name: 'new_database_item',
|
||||
displayName: 'New Database Item',
|
||||
description: 'Triggers when an item is added to a database.',
|
||||
props: {
|
||||
database_id: notionCommon.database_id,
|
||||
},
|
||||
sampleData: {
|
||||
id: 'd23872cd-c106-4afa-b33d-d3fd66064ccb',
|
||||
url: 'https://www.notion.so/Take-Fig-on-a-walk-d23872cdc1064afab33dd3fd66064ccb',
|
||||
icon: {
|
||||
type: 'emoji',
|
||||
emoji: '🐶',
|
||||
},
|
||||
cover: null,
|
||||
object: 'page',
|
||||
parent: {
|
||||
type: 'database_id',
|
||||
database_id: 'fe1eb968-50b6-4d96-83ca-4d19b96f488e',
|
||||
},
|
||||
archived: false,
|
||||
created_by: {
|
||||
id: 'f3806fae-a281-4f4e-8563-c816c3e8bd40',
|
||||
object: 'user',
|
||||
},
|
||||
properties: {
|
||||
Name: {
|
||||
id: 'title',
|
||||
type: 'title',
|
||||
title: [
|
||||
{
|
||||
href: null,
|
||||
text: {
|
||||
link: null,
|
||||
content: 'Take Fig on a walk',
|
||||
},
|
||||
type: 'text',
|
||||
plain_text: 'Take Fig on a walk',
|
||||
annotations: {
|
||||
bold: false,
|
||||
code: false,
|
||||
color: 'default',
|
||||
italic: false,
|
||||
underline: false,
|
||||
strikethrough: false,
|
||||
},
|
||||
},
|
||||
],
|
||||
},
|
||||
Status: {
|
||||
id: '%5EOE%40',
|
||||
type: 'select',
|
||||
select: {
|
||||
id: '2',
|
||||
name: 'Doing',
|
||||
color: 'yellow',
|
||||
},
|
||||
},
|
||||
'Date Created': {
|
||||
id: "'Y6%3C",
|
||||
type: 'created_time',
|
||||
created_time: '2023-03-02T01:43:00.000Z',
|
||||
},
|
||||
},
|
||||
created_time: '2023-03-02T01:43:00.000Z',
|
||||
last_edited_by: {
|
||||
id: 'f3806fae-a281-4f4e-8563-c816c3e8bd40',
|
||||
object: 'user',
|
||||
},
|
||||
last_edited_time: '2023-03-02T01:43:00.000Z',
|
||||
},
|
||||
type: TriggerStrategy.POLLING,
|
||||
async test(ctx) {
|
||||
return await pollingHelper.test(polling, {
|
||||
auth: ctx.auth,
|
||||
store: ctx.store,
|
||||
propsValue: ctx.propsValue,
|
||||
files: ctx.files,
|
||||
});
|
||||
},
|
||||
async onEnable(ctx) {
|
||||
await pollingHelper.onEnable(polling, {
|
||||
auth: ctx.auth,
|
||||
store: ctx.store,
|
||||
propsValue: ctx.propsValue,
|
||||
});
|
||||
},
|
||||
async onDisable(ctx) {
|
||||
await pollingHelper.onDisable(polling, {
|
||||
auth: ctx.auth,
|
||||
store: ctx.store,
|
||||
propsValue: ctx.propsValue,
|
||||
});
|
||||
},
|
||||
async run(ctx) {
|
||||
return await pollingHelper.poll(polling, {
|
||||
auth: ctx.auth,
|
||||
store: ctx.store,
|
||||
propsValue: ctx.propsValue,
|
||||
files: ctx.files,
|
||||
});
|
||||
},
|
||||
});
|
||||
|
||||
const polling: Polling<
|
||||
AppConnectionValueForAuthProperty<typeof notionAuth>,
|
||||
{ database_id: string | undefined }
|
||||
> = {
|
||||
strategy: DedupeStrategy.LAST_ITEM,
|
||||
items: async ({ auth, propsValue, lastItemId }) => {
|
||||
const lastItem = lastItemId as string;
|
||||
let lastCreatedDate: string | null;
|
||||
|
||||
if (lastItem) {
|
||||
const lastUpdatedEpochMS = Number(lastItem.split('|')[1]);
|
||||
lastCreatedDate = dayjs(lastUpdatedEpochMS).toISOString();
|
||||
} else {
|
||||
lastCreatedDate = lastItem;
|
||||
}
|
||||
|
||||
const items = await getResponse(
|
||||
auth,
|
||||
propsValue.database_id!,
|
||||
lastCreatedDate
|
||||
);
|
||||
return items.map((item: any) => {
|
||||
const object = item as { created_time: string; id: string };
|
||||
return {
|
||||
id: object.id + '|' + dayjs(object.created_time).valueOf(),
|
||||
data: item,
|
||||
};
|
||||
});
|
||||
},
|
||||
};
|
||||
|
||||
const getResponse = async (
|
||||
authentication: OAuth2PropertyValue,
|
||||
database_id: string,
|
||||
startDate: string | null
|
||||
) => {
|
||||
const notion = new Client({
|
||||
auth: authentication.access_token,
|
||||
notionVersion: '2022-02-22',
|
||||
});
|
||||
let cursor;
|
||||
let hasMore = true;
|
||||
const results = [];
|
||||
|
||||
do {
|
||||
const response = await notion.databases.query({
|
||||
start_cursor: cursor,
|
||||
database_id,
|
||||
filter:
|
||||
startDate == null
|
||||
? undefined
|
||||
: {
|
||||
timestamp: 'created_time',
|
||||
created_time: {
|
||||
on_or_after: startDate,
|
||||
},
|
||||
},
|
||||
sorts: [
|
||||
{
|
||||
timestamp: 'created_time',
|
||||
direction: 'descending',
|
||||
},
|
||||
],
|
||||
});
|
||||
|
||||
hasMore = response.has_more;
|
||||
cursor = response.next_cursor ?? undefined;
|
||||
|
||||
results.push(...response.results);
|
||||
} while (hasMore && !isNil(startDate));
|
||||
|
||||
return results;
|
||||
};
|
||||
@@ -0,0 +1,196 @@
|
||||
import {
|
||||
DedupeStrategy,
|
||||
Polling,
|
||||
pollingHelper,
|
||||
} from '@activepieces/pieces-common';
|
||||
import {
|
||||
createTrigger,
|
||||
TriggerStrategy,
|
||||
OAuth2PropertyValue,
|
||||
AppConnectionValueForAuthProperty,
|
||||
} from '@activepieces/pieces-framework';
|
||||
import dayjs from 'dayjs';
|
||||
import { notionCommon } from '../common';
|
||||
import { Client } from '@notionhq/client';
|
||||
import { notionAuth } from '../..';
|
||||
import { isNil } from '@activepieces/shared';
|
||||
|
||||
export const updatedDatabaseItem = createTrigger({
|
||||
auth: notionAuth,
|
||||
name: 'updated_database_item',
|
||||
displayName: 'Updated Database Item',
|
||||
description: 'Triggers when an item is updated in a database.',
|
||||
props: {
|
||||
database_id: notionCommon.database_id,
|
||||
},
|
||||
sampleData: {
|
||||
id: 'd23872cd-c106-4afa-b33d-d3fd66064ccb',
|
||||
url: 'https://www.notion.so/Take-Fig-on-a-walk-d23872cdc1064afab33dd3fd66064ccb',
|
||||
icon: {
|
||||
type: 'emoji',
|
||||
emoji: '🐶',
|
||||
},
|
||||
cover: null,
|
||||
object: 'page',
|
||||
parent: {
|
||||
type: 'database_id',
|
||||
database_id: 'fe1eb968-50b6-4d96-83ca-4d19b96f488e',
|
||||
},
|
||||
archived: false,
|
||||
created_by: {
|
||||
id: 'f3806fae-a281-4f4e-8563-c816c3e8bd40',
|
||||
object: 'user',
|
||||
},
|
||||
properties: {
|
||||
Name: {
|
||||
id: 'title',
|
||||
type: 'title',
|
||||
title: [
|
||||
{
|
||||
href: null,
|
||||
text: {
|
||||
link: null,
|
||||
content: 'Take Fig on a walk',
|
||||
},
|
||||
type: 'text',
|
||||
plain_text: 'Take Fig on a walk',
|
||||
annotations: {
|
||||
bold: false,
|
||||
code: false,
|
||||
color: 'default',
|
||||
italic: false,
|
||||
underline: false,
|
||||
strikethrough: false,
|
||||
},
|
||||
},
|
||||
],
|
||||
},
|
||||
Status: {
|
||||
id: '%5EOE%40',
|
||||
type: 'select',
|
||||
select: {
|
||||
id: '2',
|
||||
name: 'Doing',
|
||||
color: 'yellow',
|
||||
},
|
||||
},
|
||||
'Date Created': {
|
||||
id: "'Y6%3C",
|
||||
type: 'created_time',
|
||||
created_time: '2023-03-02T01:43:00.000Z',
|
||||
},
|
||||
},
|
||||
created_time: '2023-03-02T01:43:00.000Z',
|
||||
last_edited_by: {
|
||||
id: 'f3806fae-a281-4f4e-8563-c816c3e8bd40',
|
||||
object: 'user',
|
||||
},
|
||||
last_edited_time: '2023-03-02T01:43:00.000Z',
|
||||
},
|
||||
type: TriggerStrategy.POLLING,
|
||||
async test(ctx) {
|
||||
return await pollingHelper.test(polling, {
|
||||
auth: ctx.auth,
|
||||
store: ctx.store,
|
||||
propsValue: ctx.propsValue,
|
||||
files: ctx.files,
|
||||
});
|
||||
},
|
||||
async onEnable(ctx) {
|
||||
await pollingHelper.onEnable(polling, {
|
||||
auth: ctx.auth,
|
||||
store: ctx.store,
|
||||
propsValue: ctx.propsValue,
|
||||
});
|
||||
},
|
||||
async onDisable(ctx) {
|
||||
await pollingHelper.onDisable(polling, {
|
||||
auth: ctx.auth,
|
||||
store: ctx.store,
|
||||
propsValue: ctx.propsValue,
|
||||
});
|
||||
},
|
||||
async run(ctx) {
|
||||
return await pollingHelper.poll(polling, {
|
||||
auth: ctx.auth,
|
||||
store: ctx.store,
|
||||
propsValue: ctx.propsValue,
|
||||
files: ctx.files,
|
||||
});
|
||||
},
|
||||
});
|
||||
|
||||
const polling: Polling<
|
||||
AppConnectionValueForAuthProperty<typeof notionAuth>,
|
||||
{ database_id: string | undefined }
|
||||
> = {
|
||||
strategy: DedupeStrategy.LAST_ITEM,
|
||||
items: async ({ auth, propsValue, lastItemId }) => {
|
||||
const lastItem = lastItemId as string;
|
||||
let lastUpdatedDate: string | null;
|
||||
|
||||
if (lastItem) {
|
||||
const lastUpdatedEpochMS = Number(lastItem.split('|')[1]);
|
||||
lastUpdatedDate = dayjs(lastUpdatedEpochMS).toISOString();
|
||||
} else {
|
||||
lastUpdatedDate = lastItem;
|
||||
}
|
||||
|
||||
const items = await getResponse(
|
||||
auth,
|
||||
propsValue.database_id!,
|
||||
lastUpdatedDate
|
||||
);
|
||||
|
||||
return items.map((item: any) => {
|
||||
const object = item as { last_edited_time: string; id: string };
|
||||
return {
|
||||
id: object.id + '|' + dayjs(object.last_edited_time).valueOf(),
|
||||
data: item,
|
||||
};
|
||||
});
|
||||
},
|
||||
};
|
||||
|
||||
const getResponse = async (
|
||||
authentication: OAuth2PropertyValue,
|
||||
database_id: string,
|
||||
startDate: string | null
|
||||
) => {
|
||||
const notion = new Client({
|
||||
auth: authentication.access_token,
|
||||
notionVersion: '2022-02-22',
|
||||
});
|
||||
|
||||
let cursor;
|
||||
let hasMore = true;
|
||||
const results = [];
|
||||
do {
|
||||
const response = await notion.databases.query({
|
||||
start_cursor: cursor,
|
||||
database_id,
|
||||
filter:
|
||||
startDate == null
|
||||
? undefined
|
||||
: {
|
||||
timestamp: 'last_edited_time',
|
||||
last_edited_time: {
|
||||
on_or_after: startDate,
|
||||
},
|
||||
},
|
||||
sorts: [
|
||||
{
|
||||
timestamp: 'last_edited_time',
|
||||
direction: 'descending',
|
||||
},
|
||||
],
|
||||
});
|
||||
|
||||
hasMore = response.has_more;
|
||||
cursor = response.next_cursor ?? undefined;
|
||||
|
||||
results.push(...response.results);
|
||||
} while (hasMore && !isNil(startDate));
|
||||
|
||||
return results;
|
||||
};
|
||||
@@ -0,0 +1,145 @@
|
||||
import {
|
||||
DedupeStrategy,
|
||||
Polling,
|
||||
pollingHelper,
|
||||
} from '@activepieces/pieces-common';
|
||||
import {
|
||||
createTrigger,
|
||||
TriggerStrategy,
|
||||
OAuth2PropertyValue,
|
||||
AppConnectionValueForAuthProperty,
|
||||
} from '@activepieces/pieces-framework';
|
||||
import dayjs from 'dayjs';
|
||||
import { getPages } from '../common';
|
||||
import { notionAuth } from '../..';
|
||||
|
||||
export const updatedPage = createTrigger({
|
||||
auth: notionAuth,
|
||||
name: 'updated_page',
|
||||
displayName: 'Updated Page',
|
||||
description:
|
||||
'Triggers whenever any page in your Notion workspace is modified or updated. Ideal for syncing content changes, backup processes, or notifying teams about documentation updates.',
|
||||
props: {},
|
||||
sampleData: {
|
||||
object: 'page',
|
||||
id: '1d4805e9-774b-8056-820b-c1083bff77e3',
|
||||
created_time: '2025-04-13T23:35:00.000Z',
|
||||
last_edited_time: '2025-07-01T07:29:00.000Z',
|
||||
created_by: {
|
||||
object: 'user',
|
||||
id: '0f46d5cf-06ee-4350-8051-79ad10c898a6',
|
||||
},
|
||||
last_edited_by: {
|
||||
object: 'user',
|
||||
id: '0f46d5cf-06ee-4350-8051-79ad10c898a6',
|
||||
},
|
||||
cover: null,
|
||||
icon: {
|
||||
type: 'emoji',
|
||||
emoji: '💰',
|
||||
},
|
||||
parent: {
|
||||
type: 'workspace',
|
||||
workspace: true,
|
||||
},
|
||||
archived: false,
|
||||
in_trash: false,
|
||||
properties: {
|
||||
title: {
|
||||
id: 'title',
|
||||
type: 'title',
|
||||
title: [
|
||||
{
|
||||
type: 'text',
|
||||
text: {
|
||||
content: 'Saas Ideas',
|
||||
link: null,
|
||||
},
|
||||
annotations: {
|
||||
bold: false,
|
||||
italic: false,
|
||||
strikethrough: false,
|
||||
underline: false,
|
||||
code: false,
|
||||
color: 'default',
|
||||
},
|
||||
plain_text: 'Saas Ideas',
|
||||
href: null,
|
||||
},
|
||||
],
|
||||
},
|
||||
},
|
||||
url: 'https://www.notion.so/Saas-Ideas-1d4805e9774b8056820bc1083bff77e3',
|
||||
public_url: null,
|
||||
},
|
||||
type: TriggerStrategy.POLLING,
|
||||
async test(ctx) {
|
||||
return await pollingHelper.test(polling, {
|
||||
auth: ctx.auth,
|
||||
store: ctx.store,
|
||||
propsValue: ctx.propsValue,
|
||||
files: ctx.files,
|
||||
});
|
||||
},
|
||||
async onEnable(ctx) {
|
||||
await pollingHelper.onEnable(polling, {
|
||||
auth: ctx.auth,
|
||||
store: ctx.store,
|
||||
propsValue: ctx.propsValue,
|
||||
});
|
||||
},
|
||||
async onDisable(ctx) {
|
||||
await pollingHelper.onDisable(polling, {
|
||||
auth: ctx.auth,
|
||||
store: ctx.store,
|
||||
propsValue: ctx.propsValue,
|
||||
});
|
||||
},
|
||||
async run(ctx) {
|
||||
return await pollingHelper.poll(polling, {
|
||||
auth: ctx.auth,
|
||||
store: ctx.store,
|
||||
propsValue: ctx.propsValue,
|
||||
files: ctx.files,
|
||||
});
|
||||
},
|
||||
});
|
||||
|
||||
const polling: Polling<
|
||||
AppConnectionValueForAuthProperty<typeof notionAuth>,
|
||||
Record<string, never>
|
||||
> = {
|
||||
strategy: DedupeStrategy.LAST_ITEM,
|
||||
items: async ({ auth, lastItemId }) => {
|
||||
const lastItem = lastItemId as string;
|
||||
let lastEditedDate: Date | undefined;
|
||||
|
||||
if (lastItem) {
|
||||
const lastUpdatedEpochMS = Number(lastItem.split('|')[1]);
|
||||
lastEditedDate = dayjs(lastUpdatedEpochMS).toDate();
|
||||
}
|
||||
|
||||
const items = await getUpdatedPages(auth, lastEditedDate);
|
||||
return items.map((item: any) => {
|
||||
const page = item as { last_edited_time: string; id: string };
|
||||
return {
|
||||
id: page.id + '|' + dayjs(page.last_edited_time).valueOf(),
|
||||
data: item,
|
||||
};
|
||||
});
|
||||
},
|
||||
};
|
||||
|
||||
const getUpdatedPages = async (
|
||||
authentication: OAuth2PropertyValue,
|
||||
startDate?: Date
|
||||
) => {
|
||||
const searchOptions = startDate ? { editedAfter: startDate } : undefined;
|
||||
const sortOptions = {
|
||||
property: 'last_edited_time',
|
||||
direction: 'descending' as const,
|
||||
};
|
||||
|
||||
const pages = await getPages(authentication, searchOptions, sortOptions);
|
||||
return pages;
|
||||
};
|
||||
Reference in New Issue
Block a user