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,33 @@
|
||||
{
|
||||
"extends": [
|
||||
"../../../../.eslintrc.base.json"
|
||||
],
|
||||
"ignorePatterns": [
|
||||
"!**/*"
|
||||
],
|
||||
"overrides": [
|
||||
{
|
||||
"files": [
|
||||
"*.ts",
|
||||
"*.tsx",
|
||||
"*.js",
|
||||
"*.jsx"
|
||||
],
|
||||
"rules": {}
|
||||
},
|
||||
{
|
||||
"files": [
|
||||
"*.ts",
|
||||
"*.tsx"
|
||||
],
|
||||
"rules": {}
|
||||
},
|
||||
{
|
||||
"files": [
|
||||
"*.js",
|
||||
"*.jsx"
|
||||
],
|
||||
"rules": {}
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -0,0 +1,7 @@
|
||||
# pieces-productboard
|
||||
|
||||
This library was generated with [Nx](https://nx.dev).
|
||||
|
||||
## Building
|
||||
|
||||
Run `nx build pieces-productboard` to build the library.
|
||||
@@ -0,0 +1,10 @@
|
||||
{
|
||||
"name": "@activepieces/piece-productboard",
|
||||
"version": "0.0.2",
|
||||
"type": "commonjs",
|
||||
"main": "./src/index.js",
|
||||
"types": "./src/index.d.ts",
|
||||
"dependencies": {
|
||||
"tslib": "^2.3.0"
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,65 @@
|
||||
{
|
||||
"name": "pieces-productboard",
|
||||
"$schema": "../../../../node_modules/nx/schemas/project-schema.json",
|
||||
"sourceRoot": "packages/pieces/community/productboard/src",
|
||||
"projectType": "library",
|
||||
"release": {
|
||||
"version": {
|
||||
"manifestRootsToUpdate": [
|
||||
"dist/{projectRoot}"
|
||||
],
|
||||
"currentVersionResolver": "git-tag",
|
||||
"fallbackCurrentVersionResolver": "disk"
|
||||
}
|
||||
},
|
||||
"tags": [],
|
||||
"targets": {
|
||||
"build": {
|
||||
"executor": "@nx/js:tsc",
|
||||
"outputs": [
|
||||
"{options.outputPath}"
|
||||
],
|
||||
"options": {
|
||||
"outputPath": "dist/packages/pieces/community/productboard",
|
||||
"tsConfig": "packages/pieces/community/productboard/tsconfig.lib.json",
|
||||
"packageJson": "packages/pieces/community/productboard/package.json",
|
||||
"main": "packages/pieces/community/productboard/src/index.ts",
|
||||
"assets": [
|
||||
"packages/pieces/community/productboard/*.md",
|
||||
{
|
||||
"input": "packages/pieces/community/productboard/src/i18n",
|
||||
"output": "./src/i18n",
|
||||
"glob": "**/!(i18n.json)"
|
||||
}
|
||||
],
|
||||
"buildableProjectDepsInPackageJsonType": "dependencies",
|
||||
"updateBuildableProjectDepsInPackageJson": true
|
||||
},
|
||||
"dependsOn": [
|
||||
"^build",
|
||||
"prebuild"
|
||||
]
|
||||
},
|
||||
"nx-release-publish": {
|
||||
"options": {
|
||||
"packageRoot": "dist/{projectRoot}"
|
||||
}
|
||||
},
|
||||
"lint": {
|
||||
"executor": "@nx/eslint:lint",
|
||||
"outputs": [
|
||||
"{options.outputFile}"
|
||||
]
|
||||
},
|
||||
"prebuild": {
|
||||
"executor": "nx:run-commands",
|
||||
"options": {
|
||||
"cwd": "packages/pieces/community/productboard",
|
||||
"command": "bun install --no-save --silent"
|
||||
},
|
||||
"dependsOn": [
|
||||
"^build"
|
||||
]
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,54 @@
|
||||
{
|
||||
"Productboard is a product management tool that helps you manage your product roadmap and features.": "Productboard ist ein Produkt-Management-Tool, das Ihnen hilft, Ihre ProduktRoadmap und -funktionen zu verwalten.",
|
||||
"Your Productboard API Key.\n\nTo obtain your API Key:\n1. Go to https://app.productboard.com/\n2. Log in to your account\n3. Go to Settings → Integrations → Public API\n4. Generate a new API Key\n5. Copy the Key and paste it here": "Ihr Productboard-API-Schlüssel.\n\nUm Ihren API-Schlüssel zu erhalten:\n1. Gehen Sie zu https://app.productboard.com/\n2. Melden Sie sich bei Ihrem Konto\n3 3 an. Gehen Sie zu Einstellungen → Integrationen → Öffentliche API\n4. Generieren Sie einen neuen API-Schlüssel\n5. Kopieren Sie den Schlüssel und fügen Sie ihn hier ein",
|
||||
"Create Feature": "Feature erstellen",
|
||||
"Create Note": "Notiz erstellen",
|
||||
"Update Feature": "Funktion aktualisieren",
|
||||
"Get Feature": "Feature holen",
|
||||
"Create a new feature in Productboard": "Erstellen Sie eine neue Funktion in Produktboard",
|
||||
"Creates a new note in Productboard": "Erstellt eine neue Notiz in Produktboard",
|
||||
"Updates an existing feature in Productboard.": "Aktualisiert ein vorhandenes Feature in Productboard.",
|
||||
"Retrieves an existing feature.": "Ruft eine vorhandene Funktion ab.",
|
||||
"Feature Name": "Objektname",
|
||||
"Description": "Beschreibung",
|
||||
"Type": "Typ",
|
||||
"Status": "Status",
|
||||
"Parent Type": "Elterntyp",
|
||||
"Parent": "Elternteil",
|
||||
"Archived": "Archiviert",
|
||||
"Note Title": "Notiztitel",
|
||||
"Content": "Inhalt",
|
||||
"User Email": "Benutzer-E-Mail",
|
||||
"Company Domain": "Firmendomäne",
|
||||
"Display URL": "URL anzeigen",
|
||||
"Source Origin": "Ursprung",
|
||||
"Source Record ID": "Quelldatensatz-ID",
|
||||
"Tags": "Tags",
|
||||
"Feature": "Feature",
|
||||
"Name of the feature": "Name der Funktion",
|
||||
"Description of the feature": "Beschreibung der Funktion",
|
||||
"Type of the feature": "Typ der Funktion",
|
||||
"Current status of the feature": "Aktueller Status der Funktion",
|
||||
"A flag denoting if the feature is archived. If null, it will default to `false`.": "Ein Flag zeigt an, ob das Feature archiviert ist. Wenn null wird standardmäßig `false` verwendet.",
|
||||
"Title of the feedback note": "Titel der Feedback-Notiz",
|
||||
"HTML-encoded rich text content of the feedback note": "HTML-kodierter Rich Text Inhalt der Feedback-Notiz",
|
||||
"Email address of a user to be attached to the note. This field can't be combined with `Company Domain`.": "E-Mail-Adresse eines Benutzers, der zur Notiz hinzugefügt werden soll. Dieses Feld kann nicht mit `Unternehmensdomäne` kombiniert werden.",
|
||||
"Domain of a company the note should be linked to. This field can't be combined with `User Email`.": "Domain einer Firma, mit der die Notiz verlinkt werden soll. Dieses Feld kann nicht mit `Benutzer E-Mail` kombiniert werden.",
|
||||
"URL where the external entity can be accessed.": "URL, auf die die externe Entität zugegriffen werden kann.",
|
||||
"A unique string identifying the external system from which the data came.": "Ein eindeutiger String, der das externe System identifiziert, von dem die Daten stammen.",
|
||||
"The unique id of the record in the origin system.": "Die einzigartige ID des Datensatzes im Ursprungssystem.",
|
||||
"A set of tags for categorizing the note.": "Ein Satz von Tags für die Kategorisierung der Notiz.",
|
||||
"The feature to update.": "Die zu aktualisierende Funktion.",
|
||||
"New name for the feature.": "Neuer Name für das Feature.",
|
||||
"New description for the feature.": "Neue Beschreibung für das Feature.",
|
||||
"New status for the feature.": "Neuer Status für das Feature.",
|
||||
"Whether the feature is archived.": "Ob die Funktion archiviert ist.",
|
||||
"The feature to retrieve.": "Die Funktion, die abgerufen werden soll.",
|
||||
"Subfeature": "Unterfunktion",
|
||||
"New Feature": "Neue Funktion",
|
||||
"New Note": "Neue Notiz",
|
||||
"Updated Feature": "Aktualisierte Funktion",
|
||||
"Triggers when a new feature is created in Productboard": "Trigger wenn eine neue Funktion in Productboard erstellt wird",
|
||||
"Triggers when a new note is created in Productboard": "Löst aus, wenn eine neue Notiz in Productboard erstellt wird",
|
||||
"Triggers when an existing feature is updated in Productboard": "Wird ausgelöst, wenn ein vorhandenes Feature in Productboard aktualisiert wird"
|
||||
}
|
||||
@@ -0,0 +1,54 @@
|
||||
{
|
||||
"Productboard is a product management tool that helps you manage your product roadmap and features.": "El cuadro de producto es una herramienta de gestión de productos que le ayuda a administrar su mapa de ruta de producto y sus características.",
|
||||
"Your Productboard API Key.\n\nTo obtain your API Key:\n1. Go to https://app.productboard.com/\n2. Log in to your account\n3. Go to Settings → Integrations → Public API\n4. Generate a new API Key\n5. Copy the Key and paste it here": "Tu clave API del Tablero de Productos.\n\nPara obtener tu clave API:\n1. Ve a https://app.productboard.com/\n2. Inicia sesión en tu cuenta\n3. Vaya a Ajustes → Integraciones → API pública\n4. Genere una nueva clave API\n5. Copie la clave y péguela aquí",
|
||||
"Create Feature": "Crear Característica",
|
||||
"Create Note": "Crear nota",
|
||||
"Update Feature": "Actualizar Característica",
|
||||
"Get Feature": "Obtener Característica",
|
||||
"Create a new feature in Productboard": "Crear una nueva característica en el cuadro de productos",
|
||||
"Creates a new note in Productboard": "Crea una nueva nota en el cuadro de producto",
|
||||
"Updates an existing feature in Productboard.": "Actualiza una característica existente en el Panel de Productos.",
|
||||
"Retrieves an existing feature.": "Recupera una característica existente.",
|
||||
"Feature Name": "Nombre de la característica",
|
||||
"Description": "Descripción",
|
||||
"Type": "Tipo",
|
||||
"Status": "Estado",
|
||||
"Parent Type": "Tipo de padre",
|
||||
"Parent": "Padres",
|
||||
"Archived": "Archivado",
|
||||
"Note Title": "Título de nota",
|
||||
"Content": "Contenido",
|
||||
"User Email": "Email de usuario",
|
||||
"Company Domain": "Dominio de la empresa",
|
||||
"Display URL": "Mostrar URL",
|
||||
"Source Origin": "Origen de origen",
|
||||
"Source Record ID": "ID de registro de origen",
|
||||
"Tags": "Etiquetas",
|
||||
"Feature": "Característica",
|
||||
"Name of the feature": "Nombre de la característica",
|
||||
"Description of the feature": "Descripción de la característica",
|
||||
"Type of the feature": "Tipo de característica",
|
||||
"Current status of the feature": "Estado actual de la característica",
|
||||
"A flag denoting if the feature is archived. If null, it will default to `false`.": "Una bandera que denota si la función está archivada. Si es nula, por defecto será `false`.",
|
||||
"Title of the feedback note": "Título de la nota de comentarios",
|
||||
"HTML-encoded rich text content of the feedback note": "Contenido de texto enriquecido codificado en HTML de la nota de comentarios",
|
||||
"Email address of a user to be attached to the note. This field can't be combined with `Company Domain`.": "Dirección de correo electrónico de un usuario a adjuntar a la nota. Este campo no puede combinarse con `Dominio de la empresa`.",
|
||||
"Domain of a company the note should be linked to. This field can't be combined with `User Email`.": "Dominio de una empresa a la que la nota debe estar enlazada. Este campo no puede combinarse con `Email del usuario`.",
|
||||
"URL where the external entity can be accessed.": "URL donde se puede acceder a la entidad externa.",
|
||||
"A unique string identifying the external system from which the data came.": "Una cadena única que identifica el sistema externo del cual proceden los datos.",
|
||||
"The unique id of the record in the origin system.": "El identificador único del registro en el sistema de origen.",
|
||||
"A set of tags for categorizing the note.": "Un conjunto de etiquetas para categorizar la nota.",
|
||||
"The feature to update.": "La característica a actualizar.",
|
||||
"New name for the feature.": "Nuevo nombre para la característica.",
|
||||
"New description for the feature.": "Nueva descripción para la característica.",
|
||||
"New status for the feature.": "Nuevo estado para la función.",
|
||||
"Whether the feature is archived.": "Si la característica está archivada.",
|
||||
"The feature to retrieve.": "La característica a recuperar.",
|
||||
"Subfeature": "Subfunción",
|
||||
"New Feature": "Nueva característica",
|
||||
"New Note": "Nueva nota",
|
||||
"Updated Feature": "Característica actualizada",
|
||||
"Triggers when a new feature is created in Productboard": "Dispara cuando se crea una nueva característica en el cuadro de productos",
|
||||
"Triggers when a new note is created in Productboard": "Dispara cuando se crea una nueva nota en el cuadro de productos",
|
||||
"Triggers when an existing feature is updated in Productboard": "Dispara cuando una característica existente se actualiza en el cuadro de productos"
|
||||
}
|
||||
@@ -0,0 +1,54 @@
|
||||
{
|
||||
"Productboard is a product management tool that helps you manage your product roadmap and features.": "Produtboard est un outil de gestion de produits qui vous aide à gérer votre feuille de route et les fonctionnalités de votre produit.",
|
||||
"Your Productboard API Key.\n\nTo obtain your API Key:\n1. Go to https://app.productboard.com/\n2. Log in to your account\n3. Go to Settings → Integrations → Public API\n4. Generate a new API Key\n5. Copy the Key and paste it here": "Votre clé API de Productboard.\n\nPour obtenir votre clé API :\n1. Allez sur https://app.productboard.com/\n2. Connectez-vous à votre compte\n3. Allez dans Paramètres → Intégrations → API publique\n4. Générez une nouvelle clé API\n5. Copiez la clé et collez-la ici",
|
||||
"Create Feature": "Créer une fonctionnalité",
|
||||
"Create Note": "Créer une note",
|
||||
"Update Feature": "Mettre à jour la fonctionnalité",
|
||||
"Get Feature": "Obtenir la fonctionnalité",
|
||||
"Create a new feature in Productboard": "Créer une nouvelle fonctionnalité dans le Productboard",
|
||||
"Creates a new note in Productboard": "Crée une nouvelle note dans le tableau de produit",
|
||||
"Updates an existing feature in Productboard.": "Met à jour une fonctionnalité existante dans Productboard.",
|
||||
"Retrieves an existing feature.": "Récupère une fonctionnalité existante.",
|
||||
"Feature Name": "Nom de la fonctionnalité",
|
||||
"Description": "Libellé",
|
||||
"Type": "Type de texte",
|
||||
"Status": "Statut",
|
||||
"Parent Type": "Type parent",
|
||||
"Parent": "Parent",
|
||||
"Archived": "Archivé",
|
||||
"Note Title": "Titre de la note",
|
||||
"Content": "Contenus",
|
||||
"User Email": "E-mail de l'utilisateur",
|
||||
"Company Domain": "Domaine de la société",
|
||||
"Display URL": "URL d'affichage",
|
||||
"Source Origin": "Origine source",
|
||||
"Source Record ID": "ID de l'enregistrement source",
|
||||
"Tags": "Tags",
|
||||
"Feature": "Fonctionnalité",
|
||||
"Name of the feature": "Nom de la caractéristique",
|
||||
"Description of the feature": "Description de la fonctionnalité",
|
||||
"Type of the feature": "Type de la fonction",
|
||||
"Current status of the feature": "Statut actuel de la fonctionnalité",
|
||||
"A flag denoting if the feature is archived. If null, it will default to `false`.": "Un drapeau indiquant si la fonctionnalité est archivée. Si null, elle sera par défaut `false`.",
|
||||
"Title of the feedback note": "Titre de la note de commentaire",
|
||||
"HTML-encoded rich text content of the feedback note": "Contenu en texte riche encodé en HTML de la note de rétroaction",
|
||||
"Email address of a user to be attached to the note. This field can't be combined with `Company Domain`.": "Adresse email d'un utilisateur à attacher à la note. Ce champ ne peut pas être combiné avec le `Domaine de l'Entreprise`.",
|
||||
"Domain of a company the note should be linked to. This field can't be combined with `User Email`.": "Domaine d'une entreprise à laquelle la note doit être liée. Ce champ ne peut pas être combiné avec `User Email`.",
|
||||
"URL where the external entity can be accessed.": "URL où l'entité externe peut être accédée.",
|
||||
"A unique string identifying the external system from which the data came.": "Une chaîne de caractères unique identifiant le système externe d'où proviennent les données.",
|
||||
"The unique id of the record in the origin system.": "L'identifiant unique de l'enregistrement dans le système d'origine.",
|
||||
"A set of tags for categorizing the note.": "Un ensemble de balises pour catégoriser la note.",
|
||||
"The feature to update.": "La fonctionnalité à mettre à jour.",
|
||||
"New name for the feature.": "Nouveau nom pour la fonctionnalité.",
|
||||
"New description for the feature.": "Nouvelle description pour la fonctionnalité.",
|
||||
"New status for the feature.": "Nouveau statut pour la fonctionnalité.",
|
||||
"Whether the feature is archived.": "Si la fonctionnalité est archivée.",
|
||||
"The feature to retrieve.": "La fonction à récupérer.",
|
||||
"Subfeature": "Sous-fonctionnalité",
|
||||
"New Feature": "Nouvelle fonctionnalité",
|
||||
"New Note": "Nouvelle note",
|
||||
"Updated Feature": "Fonctionnalité mise à jour",
|
||||
"Triggers when a new feature is created in Productboard": "Déclenche quand une nouvelle fonctionnalité est créée dans la carte produit",
|
||||
"Triggers when a new note is created in Productboard": "Déclenche quand une nouvelle note est créée dans le Productboard",
|
||||
"Triggers when an existing feature is updated in Productboard": "Déclenche quand une fonctionnalité existante est mise à jour dans la carte produit"
|
||||
}
|
||||
@@ -0,0 +1,54 @@
|
||||
{
|
||||
"Productboard is a product management tool that helps you manage your product roadmap and features.": "Productboardは、製品のロードマップと機能を管理するための製品管理ツールです。",
|
||||
"Your Productboard API Key.\n\nTo obtain your API Key:\n1. Go to https://app.productboard.com/\n2. Log in to your account\n3. Go to Settings → Integrations → Public API\n4. Generate a new API Key\n5. Copy the Key and paste it here": "Your Productboard API Key.\n\nTo obtain your API Key:\n1. Go to https://app.productboard.com/\n2. Log in to your account\n3. Go to Settings → Integrations → Public API\n4. Generate a new API Key\n5. Copy the Key and paste it here",
|
||||
"Create Feature": "機能を作成",
|
||||
"Create Note": "ノートを作成",
|
||||
"Update Feature": "機能の更新",
|
||||
"Get Feature": "機能を取得する",
|
||||
"Create a new feature in Productboard": "製品ボードに新しい機能を作成",
|
||||
"Creates a new note in Productboard": "Productboardに新しいノートを作成",
|
||||
"Updates an existing feature in Productboard.": "Productboardの既存の機能を更新します。",
|
||||
"Retrieves an existing feature.": "既存の機能を取得します。",
|
||||
"Feature Name": "機能名",
|
||||
"Description": "説明",
|
||||
"Type": "タイプ",
|
||||
"Status": "ステータス",
|
||||
"Parent Type": "親タイプ",
|
||||
"Parent": "親",
|
||||
"Archived": "アーカイブ済み",
|
||||
"Note Title": "ノートタイトル",
|
||||
"Content": "コンテンツ",
|
||||
"User Email": "ユーザーのメールアドレス",
|
||||
"Company Domain": "会社ドメイン",
|
||||
"Display URL": "URLを表示",
|
||||
"Source Origin": "ソース元",
|
||||
"Source Record ID": "ソースレコードID",
|
||||
"Tags": "タグ",
|
||||
"Feature": "機能",
|
||||
"Name of the feature": "機能の名前",
|
||||
"Description of the feature": "機能の説明",
|
||||
"Type of the feature": "機能の種類",
|
||||
"Current status of the feature": "機能の現在の状態",
|
||||
"A flag denoting if the feature is archived. If null, it will default to `false`.": "この機能がアーカイブされている場合を示すフラグ。null の場合、デフォルトは `false` になります。",
|
||||
"Title of the feedback note": "フィードバックノートのタイトル",
|
||||
"HTML-encoded rich text content of the feedback note": "フィードバックノートの HTML エンコードされたリッチテキストコンテンツ",
|
||||
"Email address of a user to be attached to the note. This field can't be combined with `Company Domain`.": "ノートに添付するユーザーのメールアドレス。このフィールドは `Company Domain` と組み合わせることはできません。",
|
||||
"Domain of a company the note should be linked to. This field can't be combined with `User Email`.": "メモをリンクさせる必要がある会社のドメイン。このフィールドは `User Email` と組み合わせることはできません。",
|
||||
"URL where the external entity can be accessed.": "外部エンティティにアクセスできるURL。",
|
||||
"A unique string identifying the external system from which the data came.": "データが来た外部システムを識別する独自の文字列。",
|
||||
"The unique id of the record in the origin system.": "オリジンシステム内のレコードの一意の id です。",
|
||||
"A set of tags for categorizing the note.": "ノートを分類するためのタグのセット。",
|
||||
"The feature to update.": "更新する機能",
|
||||
"New name for the feature.": "この機能の新しい名前。",
|
||||
"New description for the feature.": "この機能の新しい説明。",
|
||||
"New status for the feature.": "この機能の新しいステータスです。",
|
||||
"Whether the feature is archived.": "フィーチャーがアーカイブされているかどうか。",
|
||||
"The feature to retrieve.": "取得する機能",
|
||||
"Subfeature": "サブ機能",
|
||||
"New Feature": "新機能",
|
||||
"New Note": "新しいメモ",
|
||||
"Updated Feature": "更新された機能",
|
||||
"Triggers when a new feature is created in Productboard": "Productboardで新しい機能が作成されたときにトリガーします",
|
||||
"Triggers when a new note is created in Productboard": "Productboardで新しいノートが作成されたときにトリガーします",
|
||||
"Triggers when an existing feature is updated in Productboard": "Productboardで既存の機能が更新されたときにトリガーします"
|
||||
}
|
||||
@@ -0,0 +1,54 @@
|
||||
{
|
||||
"Productboard is a product management tool that helps you manage your product roadmap and features.": "Productboard is een tool voor productbeheer die je helpt je productroadmap en -functies te beheren.",
|
||||
"Your Productboard API Key.\n\nTo obtain your API Key:\n1. Go to https://app.productboard.com/\n2. Log in to your account\n3. Go to Settings → Integrations → Public API\n4. Generate a new API Key\n5. Copy the Key and paste it here": "Uw Productboard API-sleutel.\n\nOm uw API-sleutel te verkrijgen:\n1. Ga naar https://app.productboard.com/\n2. Log in op uw account\n3. Ga naar Instellingen → Integraties → Publieke API\n4. Genereer een nieuwe API Key\n5. Kopieer de Key en plak hem hier",
|
||||
"Create Feature": "Functie aanmaken",
|
||||
"Create Note": "Notitie aanmaken",
|
||||
"Update Feature": "Functie bijwerken",
|
||||
"Get Feature": "Functie verkrijgen",
|
||||
"Create a new feature in Productboard": "Maak een nieuwe functie aan op het Productbord",
|
||||
"Creates a new note in Productboard": "Maakt een nieuwe notitie aan op Productbord",
|
||||
"Updates an existing feature in Productboard.": "Werkt een bestaande functie bij in het productbord.",
|
||||
"Retrieves an existing feature.": "Haal een bestaande functie op.",
|
||||
"Feature Name": "Naam functie",
|
||||
"Description": "Beschrijving",
|
||||
"Type": "Type",
|
||||
"Status": "status",
|
||||
"Parent Type": "Bovenliggend type",
|
||||
"Parent": "Bovenliggende",
|
||||
"Archived": "Gearchiveerd",
|
||||
"Note Title": "Notitie titel",
|
||||
"Content": "Inhoud",
|
||||
"User Email": "E-mail van gebruiker",
|
||||
"Company Domain": "Bedrijfsdomein",
|
||||
"Display URL": "Toon URL",
|
||||
"Source Origin": "Bron oorsprong",
|
||||
"Source Record ID": "Bron record ID",
|
||||
"Tags": "Labels",
|
||||
"Feature": "Functie",
|
||||
"Name of the feature": "Naam van de functie",
|
||||
"Description of the feature": "Beschrijving van de functie",
|
||||
"Type of the feature": "Type van de functie",
|
||||
"Current status of the feature": "Huidige status van de functie",
|
||||
"A flag denoting if the feature is archived. If null, it will default to `false`.": "Een vlag denoten als de functie is gearchiveerd. Als deze leeg is zal het standaard `false` zijn.",
|
||||
"Title of the feedback note": "Titel van de feedback notitie",
|
||||
"HTML-encoded rich text content of the feedback note": "HTML-gecodeerde rich tekst inhoud van de feedbacknotitie",
|
||||
"Email address of a user to be attached to the note. This field can't be combined with `Company Domain`.": "E-mailadres van een gebruiker die aan de notitie moet worden gekoppeld. Dit veld kan niet worden gecombineerd met `BedrijfDomain`.",
|
||||
"Domain of a company the note should be linked to. This field can't be combined with `User Email`.": "Domein van een bedrijf waaraan de notitie moet worden gekoppeld. Dit veld kan niet worden gecombineerd met `Gebruiker E-mail`.",
|
||||
"URL where the external entity can be accessed.": "URL waar de externe entiteit kan worden benaderd.",
|
||||
"A unique string identifying the external system from which the data came.": "Een unieke tekenreeks die het externe systeem identificeert waar de gegevens vandaan komen.",
|
||||
"The unique id of the record in the origin system.": "Het unieke id van het record in het oorsprongssysteem.",
|
||||
"A set of tags for categorizing the note.": "Een set van tags voor het categoriseren van de notitie.",
|
||||
"The feature to update.": "De functie om bij te werken",
|
||||
"New name for the feature.": "Nieuwe naam voor deze functie.",
|
||||
"New description for the feature.": "Nieuwe beschrijving van de functie",
|
||||
"New status for the feature.": "Nieuwe status voor deze functie.",
|
||||
"Whether the feature is archived.": "Of de functie is gearchiveerd.",
|
||||
"The feature to retrieve.": "De functie om op te halen.",
|
||||
"Subfeature": "Subfunctie",
|
||||
"New Feature": "Nieuwe functie",
|
||||
"New Note": "Nieuwe notitie",
|
||||
"Updated Feature": "Bijgewerkte functie",
|
||||
"Triggers when a new feature is created in Productboard": "Triggert wanneer een nieuwe functie wordt aangemaakt op het Productbord",
|
||||
"Triggers when a new note is created in Productboard": "Triggert wanneer een nieuwe notitie wordt aangemaakt op het Productbord",
|
||||
"Triggers when an existing feature is updated in Productboard": "Triggert wanneer een bestaande functie wordt bijgewerkt in het Productbord"
|
||||
}
|
||||
@@ -0,0 +1,54 @@
|
||||
{
|
||||
"Productboard is a product management tool that helps you manage your product roadmap and features.": "O Painel de Produto é uma ferramenta de gerenciamento de produtos que o ajuda a gerenciar o seu roteiro e recursos do produto.",
|
||||
"Your Productboard API Key.\n\nTo obtain your API Key:\n1. Go to https://app.productboard.com/\n2. Log in to your account\n3. Go to Settings → Integrations → Public API\n4. Generate a new API Key\n5. Copy the Key and paste it here": "Sua chave de API Productboard.\n\nPara obter a sua chave de API:\n1. Vá para https://app.productboard.com/\n2. Entre na sua conta\n3. Vá para Configurações → Integrações → API pública\n4. Gerar uma nova chave de API\n5. Copie a chave e cole-a aqui",
|
||||
"Create Feature": "Criar Recurso",
|
||||
"Create Note": "Criar Nota",
|
||||
"Update Feature": "Atualizar Recurso",
|
||||
"Get Feature": "Obter recurso",
|
||||
"Create a new feature in Productboard": "Criar um novo recurso no Tabela de Produto",
|
||||
"Creates a new note in Productboard": "Cria uma nova nota no Tabela de Produto",
|
||||
"Updates an existing feature in Productboard.": "Atualiza um recurso existente no Quadro de Produtos.",
|
||||
"Retrieves an existing feature.": "Recupera um recurso existente.",
|
||||
"Feature Name": "Nome da funcionalidade",
|
||||
"Description": "Descrição",
|
||||
"Type": "tipo",
|
||||
"Status": "Estado",
|
||||
"Parent Type": "Tipo de Origem",
|
||||
"Parent": "Antecessor",
|
||||
"Archived": "Arquivado",
|
||||
"Note Title": "Título da Nota",
|
||||
"Content": "Conteúdo",
|
||||
"User Email": "Email do Usuário",
|
||||
"Company Domain": "Domínio da empresa",
|
||||
"Display URL": "Exibir URL",
|
||||
"Source Origin": "Origem da fonte",
|
||||
"Source Record ID": "ID do registro de origem",
|
||||
"Tags": "Etiquetas",
|
||||
"Feature": "Funcionalidade",
|
||||
"Name of the feature": "Nome da funcionalidade",
|
||||
"Description of the feature": "Descrição da funcionalidade",
|
||||
"Type of the feature": "Tipo do recurso",
|
||||
"Current status of the feature": "Status atual do recurso",
|
||||
"A flag denoting if the feature is archived. If null, it will default to `false`.": "Uma bandeira indicando se o recurso está arquivado. Se estiver nulo, será por padrão `false`.",
|
||||
"Title of the feedback note": "Título da nota de feedback",
|
||||
"HTML-encoded rich text content of the feedback note": "Conteúdo de texto rico codificado em HTML da nota de feedback",
|
||||
"Email address of a user to be attached to the note. This field can't be combined with `Company Domain`.": "Endereço de e-mail de um usuário a ser anexado à nota. Este campo não pode ser combinado com o `Domínio da Empresa`.",
|
||||
"Domain of a company the note should be linked to. This field can't be combined with `User Email`.": "Domínio de uma empresa a nota deve estar vinculada. Este campo não pode ser combinado com `E-mail do Usuário`.",
|
||||
"URL where the external entity can be accessed.": "URL onde a entidade externa pode ser acessada.",
|
||||
"A unique string identifying the external system from which the data came.": "Uma string única que identifica o sistema externo de onde os dados vieram.",
|
||||
"The unique id of the record in the origin system.": "O ID exclusivo do registro no sistema de origem.",
|
||||
"A set of tags for categorizing the note.": "Um conjunto de tags para categorizar a nota.",
|
||||
"The feature to update.": "O recurso a atualizar.",
|
||||
"New name for the feature.": "Novo nome para o recurso.",
|
||||
"New description for the feature.": "Nova descrição para o recurso.",
|
||||
"New status for the feature.": "Novo status para o recurso.",
|
||||
"Whether the feature is archived.": "Se o recurso está arquivado.",
|
||||
"The feature to retrieve.": "O recurso a recuperar.",
|
||||
"Subfeature": "Subrecurso",
|
||||
"New Feature": "Nova Funcionalidade",
|
||||
"New Note": "Nova anotação",
|
||||
"Updated Feature": "Recurso atualizado",
|
||||
"Triggers when a new feature is created in Productboard": "Dispara quando uma nova funcionalidade é criada no Painel de Produto",
|
||||
"Triggers when a new note is created in Productboard": "Dispara quando uma nova nota é criada no Quadro de Produtos",
|
||||
"Triggers when an existing feature is updated in Productboard": "Dispara quando uma funcionalidade existente é atualizada no Painel de Produto"
|
||||
}
|
||||
@@ -0,0 +1,54 @@
|
||||
{
|
||||
"Productboard is a product management tool that helps you manage your product roadmap and features.": "Productboard is a product management tool that helps you manage your product roadmap and features.",
|
||||
"Your Productboard API Key.\n\nTo obtain your API Key:\n1. Go to https://app.productboard.com/\n2. Log in to your account\n3. Go to Settings → Integrations → Public API\n4. Generate a new API Key\n5. Copy the Key and paste it here": "Your Productboard API Key.\n\nTo obtain your API Key:\n1. Go to https://app.productboard.com/\n2. Log in to your account\n3. Go to Settings → Integrations → Public API\n4. Generate a new API Key\n5. Copy the Key and paste it here",
|
||||
"Create Feature": "Create Feature",
|
||||
"Create Note": "Create Note",
|
||||
"Update Feature": "Update Feature",
|
||||
"Get Feature": "Get Feature",
|
||||
"Create a new feature in Productboard": "Create a new feature in Productboard",
|
||||
"Creates a new note in Productboard": "Creates a new note in Productboard",
|
||||
"Updates an existing feature in Productboard.": "Updates an existing feature in Productboard.",
|
||||
"Retrieves an existing feature.": "Retrieves an existing feature.",
|
||||
"Feature Name": "Feature Name",
|
||||
"Description": "Description",
|
||||
"Type": "Type",
|
||||
"Status": "Status",
|
||||
"Parent Type": "Parent Type",
|
||||
"Parent": "Parent",
|
||||
"Archived": "Archived",
|
||||
"Note Title": "Note Title",
|
||||
"Content": "Content",
|
||||
"User Email": "User Email",
|
||||
"Company Domain": "Company Domain",
|
||||
"Display URL": "Display URL",
|
||||
"Source Origin": "Source Origin",
|
||||
"Source Record ID": "Source Record ID",
|
||||
"Tags": "Tags",
|
||||
"Feature": "Feature",
|
||||
"Name of the feature": "Name of the feature",
|
||||
"Description of the feature": "Description of the feature",
|
||||
"Type of the feature": "Type of the feature",
|
||||
"Current status of the feature": "Current status of the feature",
|
||||
"A flag denoting if the feature is archived. If null, it will default to `false`.": "A flag denoting if the feature is archived. If null, it will default to `false`.",
|
||||
"Title of the feedback note": "Title of the feedback note",
|
||||
"HTML-encoded rich text content of the feedback note": "HTML-encoded rich text content of the feedback note",
|
||||
"Email address of a user to be attached to the note. This field can't be combined with `Company Domain`.": "Email address of a user to be attached to the note. This field can't be combined with `Company Domain`.",
|
||||
"Domain of a company the note should be linked to. This field can't be combined with `User Email`.": "Domain of a company the note should be linked to. This field can't be combined with `User Email`.",
|
||||
"URL where the external entity can be accessed.": "URL where the external entity can be accessed.",
|
||||
"A unique string identifying the external system from which the data came.": "A unique string identifying the external system from which the data came.",
|
||||
"The unique id of the record in the origin system.": "The unique id of the record in the origin system.",
|
||||
"A set of tags for categorizing the note.": "A set of tags for categorizing the note.",
|
||||
"The feature to update.": "The feature to update.",
|
||||
"New name for the feature.": "New name for the feature.",
|
||||
"New description for the feature.": "New description for the feature.",
|
||||
"New status for the feature.": "New status for the feature.",
|
||||
"Whether the feature is archived.": "Whether the feature is archived.",
|
||||
"The feature to retrieve.": "The feature to retrieve.",
|
||||
"Subfeature": "Subfeature",
|
||||
"New Feature": "New Feature",
|
||||
"New Note": "New Note",
|
||||
"Updated Feature": "Updated Feature",
|
||||
"Triggers when a new feature is created in Productboard": "Triggers when a new feature is created in Productboard",
|
||||
"Triggers when a new note is created in Productboard": "Triggers when a new note is created in Productboard",
|
||||
"Triggers when an existing feature is updated in Productboard": "Triggers when an existing feature is updated in Productboard"
|
||||
}
|
||||
@@ -0,0 +1,54 @@
|
||||
{
|
||||
"Productboard is a product management tool that helps you manage your product roadmap and features.": "Productboard is a product management tool that helps you manage your product roadmap and features.",
|
||||
"Your Productboard API Key.\n\nTo obtain your API Key:\n1. Go to https://app.productboard.com/\n2. Log in to your account\n3. Go to Settings → Integrations → Public API\n4. Generate a new API Key\n5. Copy the Key and paste it here": "Your Productboard API Key.\n\nTo obtain your API Key:\n1. Go to https://app.productboard.com/\n2. Log in to your account\n3. Go to Settings → Integrations → Public API\n4. Generate a new API Key\n5. Copy the Key and paste it here",
|
||||
"Create Feature": "Create Feature",
|
||||
"Create Note": "Create Note",
|
||||
"Update Feature": "Update Feature",
|
||||
"Get Feature": "Get Feature",
|
||||
"Create a new feature in Productboard": "Create a new feature in Productboard",
|
||||
"Creates a new note in Productboard": "Creates a new note in Productboard",
|
||||
"Updates an existing feature in Productboard.": "Updates an existing feature in Productboard.",
|
||||
"Retrieves an existing feature.": "Retrieves an existing feature.",
|
||||
"Feature Name": "Feature Name",
|
||||
"Description": "描述",
|
||||
"Type": "类型",
|
||||
"Status": "状态",
|
||||
"Parent Type": "Parent Type",
|
||||
"Parent": "Parent",
|
||||
"Archived": "Archived",
|
||||
"Note Title": "Note Title",
|
||||
"Content": "Content",
|
||||
"User Email": "User Email",
|
||||
"Company Domain": "Company Domain",
|
||||
"Display URL": "Display URL",
|
||||
"Source Origin": "Source Origin",
|
||||
"Source Record ID": "Source Record ID",
|
||||
"Tags": "标签",
|
||||
"Feature": "Feature",
|
||||
"Name of the feature": "Name of the feature",
|
||||
"Description of the feature": "Description of the feature",
|
||||
"Type of the feature": "Type of the feature",
|
||||
"Current status of the feature": "Current status of the feature",
|
||||
"A flag denoting if the feature is archived. If null, it will default to `false`.": "A flag denoting if the feature is archived. If null, it will default to `false`.",
|
||||
"Title of the feedback note": "Title of the feedback note",
|
||||
"HTML-encoded rich text content of the feedback note": "HTML-encoded rich text content of the feedback note",
|
||||
"Email address of a user to be attached to the note. This field can't be combined with `Company Domain`.": "Email address of a user to be attached to the note. This field can't be combined with `Company Domain`.",
|
||||
"Domain of a company the note should be linked to. This field can't be combined with `User Email`.": "Domain of a company the note should be linked to. This field can't be combined with `User Email`.",
|
||||
"URL where the external entity can be accessed.": "URL where the external entity can be accessed.",
|
||||
"A unique string identifying the external system from which the data came.": "A unique string identifying the external system from which the data came.",
|
||||
"The unique id of the record in the origin system.": "The unique id of the record in the origin system.",
|
||||
"A set of tags for categorizing the note.": "A set of tags for categorizing the note.",
|
||||
"The feature to update.": "The feature to update.",
|
||||
"New name for the feature.": "New name for the feature.",
|
||||
"New description for the feature.": "New description for the feature.",
|
||||
"New status for the feature.": "New status for the feature.",
|
||||
"Whether the feature is archived.": "Whether the feature is archived.",
|
||||
"The feature to retrieve.": "The feature to retrieve.",
|
||||
"Subfeature": "Subfeature",
|
||||
"New Feature": "New Feature",
|
||||
"New Note": "New Note",
|
||||
"Updated Feature": "Updated Feature",
|
||||
"Triggers when a new feature is created in Productboard": "Triggers when a new feature is created in Productboard",
|
||||
"Triggers when a new note is created in Productboard": "Triggers when a new note is created in Productboard",
|
||||
"Triggers when an existing feature is updated in Productboard": "Triggers when an existing feature is updated in Productboard"
|
||||
}
|
||||
@@ -0,0 +1,32 @@
|
||||
|
||||
import { createPiece } from "@activepieces/pieces-framework";
|
||||
import { productboardAuth } from "./lib/common/auth";
|
||||
import { createFeature } from "./lib/actions/create-feature";
|
||||
import { createNote } from "./lib/actions/create-note";
|
||||
import { updateFeature } from "./lib/actions/update-feature";
|
||||
import { getFeature } from "./lib/actions/get-feature";
|
||||
import { newFeature } from "./lib/triggers/new-feature";
|
||||
import { newNote } from "./lib/triggers/new-note";
|
||||
import { updatedFeature } from "./lib/triggers/updated-feature";
|
||||
import { PieceCategory } from "@activepieces/shared";
|
||||
|
||||
export const productboard = createPiece({
|
||||
displayName: "Productboard",
|
||||
auth: productboardAuth,
|
||||
description: "Productboard is a product management tool that helps you manage your product roadmap and features.",
|
||||
categories: [PieceCategory.PRODUCTIVITY],
|
||||
minimumSupportedRelease: '0.36.1',
|
||||
logoUrl: "https://cdn.activepieces.com/pieces/productboard.png",
|
||||
authors: ["owuzo", "onyedikachi-david"],
|
||||
actions: [
|
||||
createFeature,
|
||||
createNote,
|
||||
updateFeature,
|
||||
getFeature,
|
||||
],
|
||||
triggers: [
|
||||
newFeature,
|
||||
newNote,
|
||||
updatedFeature,
|
||||
],
|
||||
});
|
||||
@@ -0,0 +1,171 @@
|
||||
import { createAction, Property } from '@activepieces/pieces-framework';
|
||||
import { HttpMethod } from '@activepieces/pieces-common';
|
||||
import { productboardAuth } from '../common/auth';
|
||||
import { productboardCommon } from '../common/client';
|
||||
|
||||
export const createFeature = createAction({
|
||||
name: 'create_feature',
|
||||
displayName: 'Create Feature',
|
||||
description: 'Create a new feature in Productboard',
|
||||
auth: productboardAuth,
|
||||
props: {
|
||||
name: Property.ShortText({
|
||||
displayName: 'Feature Name',
|
||||
description: 'Name of the feature',
|
||||
required: true,
|
||||
}),
|
||||
description: Property.LongText({
|
||||
displayName: 'Description',
|
||||
description: 'Description of the feature',
|
||||
required: true,
|
||||
}),
|
||||
type: Property.StaticDropdown({
|
||||
displayName: 'Type',
|
||||
description: 'Type of the feature',
|
||||
required: true,
|
||||
options: {
|
||||
options: [
|
||||
{ label: 'Feature', value: 'feature' },
|
||||
{ label: 'Subfeature', value: 'subfeature' },
|
||||
]
|
||||
}
|
||||
}),
|
||||
status: Property.Dropdown({
|
||||
auth: productboardAuth,
|
||||
displayName: 'Status',
|
||||
description: 'Current status of the feature',
|
||||
required: true,
|
||||
refreshers: [],
|
||||
options: async ({ auth }) => {
|
||||
if (!auth) {
|
||||
return {
|
||||
disabled: true,
|
||||
options: [],
|
||||
placeholder: 'Please authenticate first'
|
||||
};
|
||||
}
|
||||
const response = await productboardCommon.apiCall({
|
||||
auth: auth,
|
||||
method: HttpMethod.GET,
|
||||
resourceUri: '/feature-statuses'
|
||||
});
|
||||
const statuses = response.body['data'] ?? [];
|
||||
return {
|
||||
disabled: false,
|
||||
options: statuses.map((status: { id: string; name: string }) => ({
|
||||
label: status.name,
|
||||
value: status.id
|
||||
}))
|
||||
};
|
||||
}
|
||||
}),
|
||||
parent_type: Property.DynamicProperties({
|
||||
auth: productboardAuth,
|
||||
displayName: 'Parent Type',
|
||||
required: true,
|
||||
refreshers: ['type'],
|
||||
props: async (props) => {
|
||||
const typeValue = props['type'] as unknown as string
|
||||
const fields: { [key: string]: any } = {}
|
||||
if (typeValue === 'subfeature') {
|
||||
fields['parent_type'] = Property.StaticDropdown({
|
||||
displayName: 'Parent Type',
|
||||
required: true,
|
||||
options: {
|
||||
options: [
|
||||
{ label: 'Feature', value: 'feature' },
|
||||
]
|
||||
}
|
||||
})
|
||||
} else {
|
||||
fields['parent_type'] = Property.StaticDropdown({
|
||||
displayName: 'Parent Type',
|
||||
required: true,
|
||||
options: {
|
||||
options: [
|
||||
{ label: 'Product', value: 'product' },
|
||||
{ label: 'Component', value: 'component' },
|
||||
]
|
||||
}
|
||||
})
|
||||
}
|
||||
return fields
|
||||
}
|
||||
}),
|
||||
parent_id: Property.Dropdown({
|
||||
auth: productboardAuth,
|
||||
displayName: 'Parent',
|
||||
required: true,
|
||||
refreshers: ['parent_type'],
|
||||
options: async (props) => {
|
||||
const auth = props['auth']
|
||||
const parent_type = props['parent_type'] as unknown as { parent_type: string }
|
||||
|
||||
if (!auth) return { disabled: true, options: [], placeholder: 'Please authenticate first' };
|
||||
if (!parent_type) return { disabled: true, options: [], placeholder: 'Please select a parent type first' };
|
||||
|
||||
const parentTypeValue = parent_type.parent_type
|
||||
let resourceUri = ''
|
||||
if (parentTypeValue === 'product') resourceUri = '/products'
|
||||
else if (parentTypeValue === 'component') resourceUri = '/components'
|
||||
else if (parentTypeValue === 'feature') resourceUri = '/features'
|
||||
|
||||
if (!resourceUri) return { disabled: true, options: [], placeholder: 'Invalid parent type' };
|
||||
|
||||
const response = await productboardCommon.apiCall({
|
||||
auth: auth,
|
||||
method: HttpMethod.GET,
|
||||
resourceUri: resourceUri
|
||||
});
|
||||
const items = response.body['data'] || [];
|
||||
|
||||
let filteredItems = items;
|
||||
if (parentTypeValue === 'feature') {
|
||||
filteredItems = items.filter((item: { type: string }) => item.type === 'feature');
|
||||
}
|
||||
|
||||
return {
|
||||
disabled: false,
|
||||
options: filteredItems.map((item: { id: string; name: string }) => ({
|
||||
label: item.name,
|
||||
value: item.id
|
||||
}))
|
||||
};
|
||||
}
|
||||
}),
|
||||
archived: Property.Checkbox({
|
||||
displayName: 'Archived',
|
||||
description: 'A flag denoting if the feature is archived. If null, it will default to `false`.',
|
||||
required: false,
|
||||
}),
|
||||
},
|
||||
async run(context) {
|
||||
const { name, description, type, status, parent_type, parent_id, archived } = context.propsValue;
|
||||
|
||||
const feature: Record<string, any> = {
|
||||
data: {
|
||||
name,
|
||||
description: `<p>${description}</p>`,
|
||||
type,
|
||||
status: {
|
||||
id: status,
|
||||
},
|
||||
parent: {
|
||||
[(parent_type as { parent_type: string }).parent_type]: {
|
||||
id: parent_id,
|
||||
},
|
||||
},
|
||||
archived: archived,
|
||||
},
|
||||
};
|
||||
|
||||
const response = await productboardCommon.apiCall({
|
||||
auth: context.auth,
|
||||
method: HttpMethod.POST,
|
||||
resourceUri: '/features',
|
||||
body: feature,
|
||||
});
|
||||
|
||||
return response.body;
|
||||
},
|
||||
});
|
||||
@@ -0,0 +1,108 @@
|
||||
import { createAction, Property } from '@activepieces/pieces-framework';
|
||||
import { HttpMethod } from '@activepieces/pieces-common';
|
||||
import { productboardAuth } from '../common/auth';
|
||||
import { productboardCommon } from '../common/client';
|
||||
|
||||
export const createNote = createAction({
|
||||
name: 'create_note',
|
||||
displayName: 'Create Note',
|
||||
description: 'Creates a new note in Productboard',
|
||||
auth: productboardAuth,
|
||||
props: {
|
||||
title: Property.ShortText({
|
||||
displayName: 'Note Title',
|
||||
description: 'Title of the feedback note',
|
||||
required: true,
|
||||
}),
|
||||
content: Property.LongText({
|
||||
displayName: 'Content',
|
||||
description: 'HTML-encoded rich text content of the feedback note',
|
||||
required: true,
|
||||
}),
|
||||
user_email: Property.ShortText({
|
||||
displayName: 'User Email',
|
||||
description: "Email address of a user to be attached to the note. This field can't be combined with `Company Domain`.",
|
||||
required: false,
|
||||
}),
|
||||
company_domain: Property.ShortText({
|
||||
displayName: 'Company Domain',
|
||||
description: "Domain of a company the note should be linked to. This field can't be combined with `User Email`.",
|
||||
required: false,
|
||||
}),
|
||||
display_url: Property.ShortText({
|
||||
displayName: 'Display URL',
|
||||
description: 'URL where the external entity can be accessed.',
|
||||
required: false,
|
||||
}),
|
||||
source_origin: Property.ShortText({
|
||||
displayName: 'Source Origin',
|
||||
description: 'A unique string identifying the external system from which the data came.',
|
||||
required: false,
|
||||
}),
|
||||
source_record_id: Property.ShortText({
|
||||
displayName: 'Source Record ID',
|
||||
description: 'The unique id of the record in the origin system.',
|
||||
required: false,
|
||||
}),
|
||||
tags: Property.Array({
|
||||
displayName: 'Tags',
|
||||
description: 'A set of tags for categorizing the note.',
|
||||
required: false,
|
||||
properties: {
|
||||
tag: Property.ShortText({
|
||||
displayName: 'Tag',
|
||||
required: true,
|
||||
}),
|
||||
},
|
||||
}),
|
||||
},
|
||||
async run(context) {
|
||||
const {
|
||||
title,
|
||||
content,
|
||||
user_email,
|
||||
company_domain,
|
||||
display_url,
|
||||
source_origin,
|
||||
source_record_id,
|
||||
tags,
|
||||
} = context.propsValue;
|
||||
|
||||
const note: Record<string, any> = {
|
||||
title,
|
||||
content,
|
||||
};
|
||||
|
||||
if (user_email) {
|
||||
note['user'] = { email: user_email };
|
||||
}
|
||||
|
||||
if (company_domain) {
|
||||
note['company'] = { domain: company_domain };
|
||||
}
|
||||
|
||||
if (display_url) {
|
||||
note['display_url'] = display_url;
|
||||
}
|
||||
|
||||
if (source_origin && source_record_id) {
|
||||
note['source'] = {
|
||||
origin: source_origin,
|
||||
record_id: source_record_id,
|
||||
};
|
||||
}
|
||||
|
||||
if (tags) {
|
||||
note['tags'] = (tags as { tag: string }[]).map((t) => t.tag);
|
||||
}
|
||||
|
||||
const response = await productboardCommon.apiCall({
|
||||
auth: context.auth,
|
||||
method: HttpMethod.POST,
|
||||
resourceUri: '/notes',
|
||||
body: note,
|
||||
});
|
||||
|
||||
return response.body;
|
||||
},
|
||||
});
|
||||
@@ -0,0 +1,53 @@
|
||||
import { createAction, Property } from '@activepieces/pieces-framework';
|
||||
import { HttpMethod } from '@activepieces/pieces-common';
|
||||
import { productboardAuth } from '../common/auth';
|
||||
import { productboardCommon } from '../common/client';
|
||||
|
||||
export const getFeature = createAction({
|
||||
name: 'get_feature',
|
||||
displayName: 'Get Feature',
|
||||
description: 'Retrieves an existing feature.',
|
||||
auth: productboardAuth,
|
||||
props: {
|
||||
feature_id: Property.Dropdown({
|
||||
auth: productboardAuth,
|
||||
displayName: 'Feature',
|
||||
description: 'The feature to retrieve.',
|
||||
required: true,
|
||||
refreshers: [],
|
||||
options: async ({ auth }) => {
|
||||
if (!auth) {
|
||||
return {
|
||||
disabled: true,
|
||||
options: [],
|
||||
placeholder: 'Please authenticate first'
|
||||
};
|
||||
}
|
||||
const response = await productboardCommon.apiCall({
|
||||
auth: auth,
|
||||
method: HttpMethod.GET,
|
||||
resourceUri: '/features'
|
||||
});
|
||||
const features = response.body['data'] ?? [];
|
||||
return {
|
||||
disabled: false,
|
||||
options: features.map((feature: { id: string; name: string }) => ({
|
||||
label: feature.name,
|
||||
value: feature.id
|
||||
}))
|
||||
};
|
||||
}
|
||||
})
|
||||
},
|
||||
async run(context) {
|
||||
const { feature_id } = context.propsValue;
|
||||
|
||||
const response = await productboardCommon.apiCall({
|
||||
auth: context.auth,
|
||||
method: HttpMethod.GET,
|
||||
resourceUri: `/features/${feature_id}`,
|
||||
});
|
||||
|
||||
return response.body;
|
||||
},
|
||||
});
|
||||
@@ -0,0 +1,122 @@
|
||||
import { createAction, Property } from '@activepieces/pieces-framework';
|
||||
import { HttpMethod } from '@activepieces/pieces-common';
|
||||
import { productboardAuth } from '../common/auth';
|
||||
import { productboardCommon } from '../common/client';
|
||||
|
||||
export const updateFeature = createAction({
|
||||
name: 'update_feature',
|
||||
displayName: 'Update Feature',
|
||||
description: 'Updates an existing feature in Productboard.',
|
||||
auth: productboardAuth,
|
||||
props: {
|
||||
feature_id: Property.Dropdown({
|
||||
auth: productboardAuth,
|
||||
displayName: 'Feature',
|
||||
description: 'The feature to update.',
|
||||
required: true,
|
||||
refreshers: [],
|
||||
options: async ({ auth }) => {
|
||||
if (!auth) {
|
||||
return {
|
||||
disabled: true,
|
||||
options: [],
|
||||
placeholder: 'Please authenticate first'
|
||||
};
|
||||
}
|
||||
const response = await productboardCommon.apiCall({
|
||||
auth: auth,
|
||||
method: HttpMethod.GET,
|
||||
resourceUri: '/features'
|
||||
});
|
||||
const features = response.body['data'] ?? [];
|
||||
return {
|
||||
disabled: false,
|
||||
options: features.map((feature: { id: string; name: string }) => ({
|
||||
label: feature.name,
|
||||
value: feature.id
|
||||
}))
|
||||
};
|
||||
}
|
||||
}),
|
||||
name: Property.ShortText({
|
||||
displayName: 'Feature Name',
|
||||
description: 'New name for the feature.',
|
||||
required: false,
|
||||
}),
|
||||
description: Property.LongText({
|
||||
displayName: 'Description',
|
||||
description: 'New description for the feature.',
|
||||
required: false,
|
||||
}),
|
||||
status: Property.Dropdown({
|
||||
auth: productboardAuth,
|
||||
displayName: 'Status',
|
||||
description: 'New status for the feature.',
|
||||
required: false,
|
||||
refreshers: [],
|
||||
options: async ({ auth }) => {
|
||||
if (!auth) {
|
||||
return {
|
||||
disabled: true,
|
||||
options: [],
|
||||
placeholder: 'Please authenticate first'
|
||||
};
|
||||
}
|
||||
const response = await productboardCommon.apiCall({
|
||||
auth: auth,
|
||||
method: HttpMethod.GET,
|
||||
resourceUri: '/feature-statuses'
|
||||
});
|
||||
const statuses = response.body['data'] ?? [];
|
||||
return {
|
||||
disabled: false,
|
||||
options: statuses.map((status: { id: string; name: string }) => ({
|
||||
label: status.name,
|
||||
value: status.id
|
||||
}))
|
||||
};
|
||||
}
|
||||
}),
|
||||
archived: Property.Checkbox({
|
||||
displayName: 'Archived',
|
||||
description: 'Whether the feature is archived.',
|
||||
required: false,
|
||||
}),
|
||||
},
|
||||
async run(context) {
|
||||
const { feature_id, name, description, status, archived } = context.propsValue;
|
||||
|
||||
const feature: Record<string, any> = {
|
||||
data: {},
|
||||
};
|
||||
|
||||
if (name) {
|
||||
feature['data'].name = name;
|
||||
}
|
||||
|
||||
if (description) {
|
||||
feature['data'].description = description;
|
||||
}
|
||||
|
||||
if (status) {
|
||||
feature['data'].status = { id: status };
|
||||
}
|
||||
|
||||
if (archived !== undefined) {
|
||||
feature['data'].archived = archived;
|
||||
}
|
||||
|
||||
if (Object.keys(feature['data']).length === 0) {
|
||||
return { success: true, message: 'No fields to update.' };
|
||||
}
|
||||
|
||||
const response = await productboardCommon.apiCall({
|
||||
auth: context.auth,
|
||||
method: HttpMethod.PATCH,
|
||||
resourceUri: `/features/${feature_id}`,
|
||||
body: feature,
|
||||
});
|
||||
|
||||
return response.body;
|
||||
},
|
||||
});
|
||||
@@ -0,0 +1,14 @@
|
||||
import { PieceAuth } from '@activepieces/pieces-framework';
|
||||
|
||||
export const productboardAuth = PieceAuth.SecretText({
|
||||
displayName: 'API Key',
|
||||
description: `Your Productboard API Key.
|
||||
|
||||
To obtain your API Key:
|
||||
1. Go to https://app.productboard.com/
|
||||
2. Log in to your account
|
||||
3. Go to Settings → Integrations → Public API
|
||||
4. Generate a new API Key
|
||||
5. Copy the Key and paste it here`,
|
||||
required: true,
|
||||
});
|
||||
@@ -0,0 +1,35 @@
|
||||
import { httpClient, HttpMethod, AuthenticationType } from '@activepieces/pieces-common';
|
||||
import { AppConnectionValueForAuthProperty } from '@activepieces/pieces-framework';
|
||||
import { productboardAuth } from './auth';
|
||||
|
||||
const PRODUCTBOARD_API_BASE_URL = 'https://api.productboard.com';
|
||||
|
||||
export const productboardCommon = {
|
||||
baseUrl: PRODUCTBOARD_API_BASE_URL,
|
||||
|
||||
async apiCall({
|
||||
auth,
|
||||
method,
|
||||
resourceUri,
|
||||
body = undefined,
|
||||
queryParams = undefined,
|
||||
}: {
|
||||
auth: AppConnectionValueForAuthProperty<typeof productboardAuth>;
|
||||
method: HttpMethod;
|
||||
resourceUri: string;
|
||||
body?: any;
|
||||
queryParams?: Record<string, string>;
|
||||
}) {
|
||||
return await httpClient.sendRequest({
|
||||
method: method,
|
||||
url: `${PRODUCTBOARD_API_BASE_URL}${resourceUri}`,
|
||||
body,
|
||||
queryParams,
|
||||
headers: {
|
||||
'Authorization': `Bearer ${auth.secret_text}`,
|
||||
'X-Version': '1',
|
||||
'Content-Type': 'application/json',
|
||||
}
|
||||
});
|
||||
}
|
||||
};
|
||||
@@ -0,0 +1,64 @@
|
||||
import { productboardAuth } from '../common/auth';
|
||||
import { HttpMethod } from '@activepieces/pieces-common';
|
||||
import {
|
||||
TriggerStrategy,
|
||||
createTrigger,
|
||||
} from '@activepieces/pieces-framework';
|
||||
import { productboardCommon } from '../common/client';
|
||||
|
||||
export const newFeature = createTrigger({
|
||||
name: 'new_feature',
|
||||
displayName: 'New Feature',
|
||||
description: 'Triggers when a new feature is created in Productboard',
|
||||
auth: productboardAuth,
|
||||
type: TriggerStrategy.WEBHOOK,
|
||||
props: {},
|
||||
sampleData: {
|
||||
data: {
|
||||
id: 'c5a0b5f0-3f2e-4e1a-8c7z-5c8e4b3f2e1a',
|
||||
eventType: 'feature.created',
|
||||
links: {
|
||||
target: 'https://api.productboard.com/features/c5a0b5f0-3f2e-4e1a-8c7z-5c8e4b3f2e1a',
|
||||
},
|
||||
},
|
||||
},
|
||||
onEnable: async (context) => {
|
||||
const { webhookUrl, auth } = context;
|
||||
const response = await productboardCommon.apiCall({
|
||||
auth,
|
||||
method: HttpMethod.POST,
|
||||
resourceUri: '/webhooks',
|
||||
body: {
|
||||
data: {
|
||||
name: 'Activepieces - New Feature',
|
||||
events: [
|
||||
{
|
||||
eventType: 'feature.created',
|
||||
},
|
||||
],
|
||||
notification: {
|
||||
url: webhookUrl,
|
||||
version: 1,
|
||||
},
|
||||
},
|
||||
},
|
||||
});
|
||||
|
||||
await context.store.put('webhook_id', response.body['data'].id);
|
||||
return response.body;
|
||||
},
|
||||
onDisable: async (context) => {
|
||||
const { auth } = context;
|
||||
const webhookId = await context.store.get('webhook_id');
|
||||
if (webhookId) {
|
||||
await productboardCommon.apiCall({
|
||||
auth,
|
||||
method: HttpMethod.DELETE,
|
||||
resourceUri: `/webhooks/${webhookId}`,
|
||||
});
|
||||
}
|
||||
},
|
||||
run: async (context) => {
|
||||
return [context.payload.body];
|
||||
},
|
||||
});
|
||||
@@ -0,0 +1,64 @@
|
||||
import { productboardAuth } from '../common/auth';
|
||||
import { HttpMethod } from '@activepieces/pieces-common';
|
||||
import {
|
||||
TriggerStrategy,
|
||||
createTrigger,
|
||||
} from '@activepieces/pieces-framework';
|
||||
import { productboardCommon } from '../common/client';
|
||||
|
||||
export const newNote = createTrigger({
|
||||
name: 'new_note',
|
||||
displayName: 'New Note',
|
||||
description: 'Triggers when a new note is created in Productboard',
|
||||
auth: productboardAuth,
|
||||
type: TriggerStrategy.WEBHOOK,
|
||||
props: {},
|
||||
sampleData: {
|
||||
data: {
|
||||
id: 'c5a0b5f0-3f2e-4e1a-8c7z-5c8e4b3f2e1a',
|
||||
eventType: 'note.created',
|
||||
links: {
|
||||
target: 'https://api.productboard.com/notes/c5a0b5f0-3f2e-4e1a-8c7z-5c8e4b3f2e1a',
|
||||
},
|
||||
},
|
||||
},
|
||||
onEnable: async (context) => {
|
||||
const { webhookUrl, auth } = context;
|
||||
const response = await productboardCommon.apiCall({
|
||||
auth,
|
||||
method: HttpMethod.POST,
|
||||
resourceUri: '/webhooks',
|
||||
body: {
|
||||
data: {
|
||||
name: 'Activepieces - New Note',
|
||||
events: [
|
||||
{
|
||||
eventType: 'note.created',
|
||||
},
|
||||
],
|
||||
notification: {
|
||||
url: webhookUrl,
|
||||
version: 1,
|
||||
},
|
||||
},
|
||||
},
|
||||
});
|
||||
|
||||
await context.store.put('webhook_id', response.body['data'].id);
|
||||
return response.body;
|
||||
},
|
||||
onDisable: async (context) => {
|
||||
const { auth } = context;
|
||||
const webhookId = await context.store.get('webhook_id');
|
||||
if (webhookId) {
|
||||
await productboardCommon.apiCall({
|
||||
auth,
|
||||
method: HttpMethod.DELETE,
|
||||
resourceUri: `/webhooks/${webhookId}`,
|
||||
});
|
||||
}
|
||||
},
|
||||
run: async (context) => {
|
||||
return [context.payload.body];
|
||||
},
|
||||
});
|
||||
@@ -0,0 +1,64 @@
|
||||
import { productboardAuth } from '../common/auth';
|
||||
import { HttpMethod } from '@activepieces/pieces-common';
|
||||
import {
|
||||
TriggerStrategy,
|
||||
createTrigger,
|
||||
} from '@activepieces/pieces-framework';
|
||||
import { productboardCommon } from '../common/client';
|
||||
|
||||
export const updatedFeature = createTrigger({
|
||||
name: 'updated_feature',
|
||||
displayName: 'Updated Feature',
|
||||
description: 'Triggers when an existing feature is updated in Productboard',
|
||||
auth: productboardAuth,
|
||||
type: TriggerStrategy.WEBHOOK,
|
||||
props: {},
|
||||
sampleData: {
|
||||
data: {
|
||||
id: 'c5a0b5f0-3f2e-4e1a-8c7z-5c8e4b3f2e1a',
|
||||
eventType: 'feature.updated',
|
||||
links: {
|
||||
target: 'https://api.productboard.com/features/c5a0b5f0-3f2e-4e1a-8c7z-5c8e4b3f2e1a',
|
||||
},
|
||||
},
|
||||
},
|
||||
onEnable: async (context) => {
|
||||
const { webhookUrl, auth } = context;
|
||||
const response = await productboardCommon.apiCall({
|
||||
auth,
|
||||
method: HttpMethod.POST,
|
||||
resourceUri: '/webhooks',
|
||||
body: {
|
||||
data: {
|
||||
name: 'Activepieces - Updated Feature',
|
||||
events: [
|
||||
{
|
||||
eventType: 'feature.updated',
|
||||
},
|
||||
],
|
||||
notification: {
|
||||
url: webhookUrl,
|
||||
version: 1,
|
||||
},
|
||||
},
|
||||
},
|
||||
});
|
||||
|
||||
await context.store.put('webhook_id', response.body['data'].id);
|
||||
return response.body;
|
||||
},
|
||||
onDisable: async (context) => {
|
||||
const { auth } = context;
|
||||
const webhookId = await context.store.get('webhook_id');
|
||||
if (webhookId) {
|
||||
await productboardCommon.apiCall({
|
||||
auth,
|
||||
method: HttpMethod.DELETE,
|
||||
resourceUri: `/webhooks/${webhookId}`,
|
||||
});
|
||||
}
|
||||
},
|
||||
run: async (context) => {
|
||||
return [context.payload.body];
|
||||
},
|
||||
});
|
||||
@@ -0,0 +1,20 @@
|
||||
{
|
||||
"extends": "../../../../tsconfig.base.json",
|
||||
"compilerOptions": {
|
||||
"module": "commonjs",
|
||||
"forceConsistentCasingInFileNames": true,
|
||||
"strict": true,
|
||||
"importHelpers": true,
|
||||
"noImplicitOverride": true,
|
||||
"noImplicitReturns": true,
|
||||
"noFallthroughCasesInSwitch": true,
|
||||
"noPropertyAccessFromIndexSignature": true
|
||||
},
|
||||
"files": [],
|
||||
"include": [],
|
||||
"references": [
|
||||
{
|
||||
"path": "./tsconfig.lib.json"
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -0,0 +1,9 @@
|
||||
{
|
||||
"extends": "./tsconfig.json",
|
||||
"compilerOptions": {
|
||||
"outDir": "../../../../dist/out-tsc",
|
||||
"declaration": true,
|
||||
"types": ["node"]
|
||||
},
|
||||
"include": ["src/**/*.ts"]
|
||||
}
|
||||
Reference in New Issue
Block a user