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,18 @@
|
||||
{
|
||||
"extends": ["../../../../.eslintrc.json"],
|
||||
"ignorePatterns": ["!**/*"],
|
||||
"overrides": [
|
||||
{
|
||||
"files": ["*.ts", "*.tsx", "*.js", "*.jsx"],
|
||||
"rules": {}
|
||||
},
|
||||
{
|
||||
"files": ["*.ts", "*.tsx"],
|
||||
"rules": {}
|
||||
},
|
||||
{
|
||||
"files": ["*.js", "*.jsx"],
|
||||
"rules": {}
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -0,0 +1,7 @@
|
||||
# pieces-podio
|
||||
|
||||
This library was generated with [Nx](https://nx.dev).
|
||||
|
||||
## Building
|
||||
|
||||
Run `nx build pieces-podio` to build the library.
|
||||
@@ -0,0 +1,10 @@
|
||||
{
|
||||
"name": "@activepieces/piece-podio",
|
||||
"version": "0.0.9",
|
||||
"type": "commonjs",
|
||||
"main": "./src/index.js",
|
||||
"types": "./src/index.d.ts",
|
||||
"dependencies": {
|
||||
"tslib": "^2.3.0"
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,65 @@
|
||||
{
|
||||
"name": "pieces-podio",
|
||||
"$schema": "../../../../node_modules/nx/schemas/project-schema.json",
|
||||
"sourceRoot": "packages/pieces/community/podio/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/podio",
|
||||
"tsConfig": "packages/pieces/community/podio/tsconfig.lib.json",
|
||||
"packageJson": "packages/pieces/community/podio/package.json",
|
||||
"main": "packages/pieces/community/podio/src/index.ts",
|
||||
"assets": [
|
||||
"packages/pieces/community/podio/*.md",
|
||||
{
|
||||
"input": "packages/pieces/community/podio/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/podio",
|
||||
"command": "bun install --no-save --silent"
|
||||
},
|
||||
"dependsOn": [
|
||||
"^build"
|
||||
]
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,176 @@
|
||||
{
|
||||
"Connect your Podio account to automate workspace management and item operations.": "Verbinden Sie Ihr Podio Konto, um Arbeitsbereichsverwaltung und Artikeloperationen zu automatisieren.",
|
||||
"Create Item": "Erstelle Element",
|
||||
"Update Item": "Element aktualisieren",
|
||||
"Create Task": "Aufgabe erstellen",
|
||||
"Update Task": "Aufgabe aktualisieren",
|
||||
"Attach File": "Datei anhängen",
|
||||
"Create Comment": "Kommentar erstellen",
|
||||
"Create Status Update": "Status-Update erstellen",
|
||||
"Find Item": "Element finden",
|
||||
"Find Task": "Aufgabe finden",
|
||||
"Custom API Call": "Eigener API-Aufruf",
|
||||
"Create a new record in a Podio app with specified field values.": "Erstellen Sie einen neuen Datensatz in einer Podio App mit angegebenen Feldwerten.",
|
||||
"Update an existing record in a Podio app with specified field values. Only provided fields will be updated.": "Aktualisiere einen vorhandenen Eintrag in einer Podio-App mit angegebenen Feldwerten. Nur angegebene Felder werden aktualisiert.",
|
||||
"Add a new task to an item or workspace with due dates, assignees, and attachments.": "Fügen Sie eine neue Aufgabe zu einem Element oder Arbeitsbereich mit Fälligkeitsdatum, Zuweisern und Anhängen hinzu.",
|
||||
"Modify an existing task's details or status. Only specified fields will be updated.": "Details oder Status einer bestehenden Aufgabe ändern. Nur angegebene Felder werden aktualisiert.",
|
||||
"Upload and attach a file to an item/task/comment.": "Datei hochladen und an ein Element/Task/Kommentar anhängen.",
|
||||
"Post a comment on an item or task.": "Schreibe einen Kommentar zu einem Element oder einer Aufgabe.",
|
||||
"Add a status to an item or workspace stream.": "Fügen Sie einen Status zu einem Element oder Arbeitsbereich Stream hinzu.",
|
||||
"Retrieve a single item by ID or field value.": "Ein einzelnes Element per ID oder Feldwert abrufen.",
|
||||
"Retrieve a task by ID for further updates.": "Abrufen einer Aufgabe per ID für weitere Updates.",
|
||||
"Make a custom API call to a specific endpoint": "Einen benutzerdefinierten API-Aufruf an einen bestimmten Endpunkt machen",
|
||||
"Organization (Optional)": "Organisation (optional)",
|
||||
"Space (Optional)": "Raum (optional)",
|
||||
"App": "App",
|
||||
"External ID": "Externe ID",
|
||||
"App Fields": "App-Felder",
|
||||
"Advanced: Custom Fields JSON": "Erweitert: Benutzerdefinierte Felder JSON",
|
||||
"File IDs": "Datei-IDs",
|
||||
"Tags": "Tags",
|
||||
"Reminder": "Erinnerung",
|
||||
"Recurrence": "Wiederholung",
|
||||
"Linked Account ID": "Verknüpfte Konto-ID",
|
||||
"Reference": "Referenz",
|
||||
"Execute Hooks": "Hooks ausführen",
|
||||
"Silent Mode": "Lautlos-Modus",
|
||||
"Item": "Artikel",
|
||||
"Revision": "Revision",
|
||||
"Legacy Fields (Advanced)": "Legacy-Felder (Erweitert)",
|
||||
"Task Text": "Aufgabentext",
|
||||
"Description": "Beschreibung",
|
||||
"Private": "Privat",
|
||||
"Due Date": "Fälligkeitsdatum",
|
||||
"Due Time": "Fällige Zeit",
|
||||
"Due Date & Time (UTC)": "Fälligkeitsdatum & -zeit (UTC)",
|
||||
"Organization": "Organisation",
|
||||
"Space": "Raum",
|
||||
"Reference Type": "Referenztyp",
|
||||
"Reference Object": "Referenzobjekt",
|
||||
"Responsible Person": "Verantwortliche Person",
|
||||
"Labels (Text)": "Labels (Text)",
|
||||
"Label IDs": "Label IDs",
|
||||
"Task": "Aufgabe",
|
||||
"Text": "Text",
|
||||
"Completed": "Abgeschlossen",
|
||||
"Responsible User ID": "Verantwortliche Benutzer-ID",
|
||||
"Labels": "Etiketten",
|
||||
"File": "Datei",
|
||||
"Attach To": "Anhängen an",
|
||||
"Comment On": "Kommentar zu",
|
||||
"Object": "Objekt",
|
||||
"Comment Text": "Kommentartext",
|
||||
"Attach Files": "Dateien anhängen",
|
||||
"Embed ID": "ID einbinden",
|
||||
"Embed URL": "URL einbinden",
|
||||
"Auto-Invite Mentioned Users": "Erwähnte Benutzer automatisch einladen",
|
||||
"Status Message": "Statusnachricht",
|
||||
"Add Poll": "Umfrage hinzufügen",
|
||||
"Search Method": "Suchmethode",
|
||||
"Item ID": "Item ID",
|
||||
"Mark as Viewed": "Als gesehen markieren",
|
||||
"Search Filters": "Filter suchen",
|
||||
"Limit": "Limit",
|
||||
"Offset": "Versatz",
|
||||
"Sort By": "Sortieren nach",
|
||||
"Sort Descending": "Absteigend sortieren",
|
||||
"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)",
|
||||
"Select an organization to filter apps by workspace. Leave empty to see all apps.": "Wählen Sie eine Organisation aus, um Apps nach Arbeitsbereich zu filtern. Lassen Sie leer, um alle Apps zu sehen.",
|
||||
"Select a workspace to filter apps. Leave empty to see all apps in the organization.": "Wählen Sie einen Arbeitsbereich, um Apps zu filtern. Lassen Sie leer, um alle Apps in der Organisation zu sehen.",
|
||||
"Select a Podio app": "Podio App auswählen",
|
||||
"The external id of the item. This can be used to hold a reference to the item in an external system.": "Die externe Id des Items. Dies kann verwendet werden, um einen Verweis auf das Element in einem externen System zu halten.",
|
||||
"Configure values for the fields in the selected app": "Werte für die Felder der ausgewählten App konfigurieren",
|
||||
"Advanced: Use this for complex field configurations. Format: {\"field_id\": {\"value\": \"content\"}}. Only use if the dynamic fields above don't meet your needs.": "Erweitert: Verwenden Sie dies für komplexe Feldkonfigurationen. Format: {\"field_id\": {\"value\": \"content\"}}. Nur verwenden, wenn die oben genannten dynamischen Felder nicht Ihren Bedürfnissen entsprechen.",
|
||||
"Temporary files that have been uploaded and should be attached to this item": "Temporäre Dateien, die hochgeladen wurden und an dieses Element angehängt werden sollen",
|
||||
"The tags to put on the item": "Die Tags die auf das Element gesetzt werden sollen",
|
||||
"Optional reminder on this item. Format: {\"remind_delta\": minutes_before_due_date}": "Optionale Erinnerung an dieses Element. Format: {\"Erinnerung_delta\": minutes_before_due_date}",
|
||||
"The recurrence for the task, if any. Format: {\"name\": \"weekly|monthly|yearly\", \"config\": {...}, \"step\": 1, \"until\": \"date\"}": "Die Wiederholung der Aufgabe, falls vorhanden. Format: {\"name\": \"weekly|monthly|yearly\", \"config\": {...}, \"Schritt\": 1, \"bis\": \"bis\": \"date\"}",
|
||||
"The linked account to use for the meeting": "Das verknüpfte Konto für das Meeting",
|
||||
"The reference for the new item, if any. Format: {\"type\": \"item\", \"id\": reference_id}": "Die Referenz für das neue Element, falls vorhanden. Format: {\"type\": \"item\", \"id\": reference_id}",
|
||||
"If false, webhooks and integrations will not be triggered for this operation": "Wenn falsch, werden Webhooks und Integrationen für diese Operation nicht ausgelöst",
|
||||
"If true, notifications will not be triggered and the object will not appear in activity streams": "Wenn aktiviert, werden keine Benachrichtigungen ausgelöst und das Objekt wird nicht in den Aktivitätsströmen angezeigt",
|
||||
"Select a Podio item": "Podio Element auswählen",
|
||||
"Configure values for the fields you want to update in the selected app": "Konfigurieren Sie Werte für die Felder, die Sie in der ausgewählten App aktualisieren möchten",
|
||||
"The revision of the item that is being updated. Optional for conflict detection.": "Die Revision des Elements, der aktualisiert wird. Optional zur Konflikterkennung.",
|
||||
"The new external_id of the item": "Die neue external_id des Elements",
|
||||
"Manual field configuration using field_id or external_id as keys. Use this for advanced scenarios or when dynamic fields are not sufficient.": "Manuelle Feldkonfiguration mit field_id oder external_id als Schlüssel. Verwenden Sie dies für erweiterte Szenarien oder wenn dynamische Felder nicht ausreichen.",
|
||||
"The list of attachments": "Liste der Anhänge",
|
||||
"The list of tags": "Die Liste der Tags",
|
||||
"The linked account to use for meetings": "Das verknüpfte Konto für Besprechungen",
|
||||
"The reference of the item. Format: {\"type\": \"reference_type\", \"id\": reference_id}": "Die Referenz des Elements. Format: {\"type\": \"reference_type\", \"id\": reference_id}",
|
||||
"The description or text of the task": "Die Beschreibung oder der Text der Aufgabe",
|
||||
"Additional description for the task": "Zusätzliche Beschreibung für die Aufgabe",
|
||||
"Whether the task should be private (only creator, assignee and assignor can see it)": "Ob die Aufgabe privat sein soll (nur Ersteller, Zuweiser und Zuweiser können sie sehen)",
|
||||
"Due date in local time (date only)": "Enddatum in lokaler Zeit (nur Datum)",
|
||||
"Due time in local time (HH:MM:SS format, e.g., \"14:30:00\")": "Fälligkeit in lokaler Zeit (HH:MM:SS-Format, z.B.: \"14:30:00\")",
|
||||
"Complete due date and time in UTC. Alternative to separate date/time fields.": "Füllen Sie das Fälligkeitsdatum und die Uhrzeit in UTC aus. Alternativ zu separaten Datums-/Zeitfeldern.",
|
||||
"Select a Podio organization": "Podio-Organisation auswählen",
|
||||
"Select a Podio workspace": "Podio Arbeitsbereich auswählen",
|
||||
"The type of object to reference": "Die Art des zu referenzierenden Objekts",
|
||||
"Select the specific object to reference": "Wählen Sie das zu referenzierende Objekt",
|
||||
"Who is responsible for this task. Can be a user ID (number) or contact identifier object with type and id.": "Wer ist für diese Aufgabe verantwortlich. Kann eine Benutzer-ID (Nummer) oder ein Kontakt-Identifikator-Objekt mit Typ und ID sein.",
|
||||
"List of file IDs to attach to this task": "Liste der zu dieser Aufgabe anzuhängenden Datei-IDs",
|
||||
"List of label names in text form": "Liste der Labelnamen in Textform",
|
||||
"List of label IDs (alternative to text labels)": "Liste der Label-IDs (Alternative zu Text-Labels)",
|
||||
"Reminder settings. Format: {\"remind_delta\": minutes_before_due_date}": "Erinnerungseinstellungen. Format: {\"Erinnerung_delta\": minutes_before_due_date}",
|
||||
"Recurring task settings. Format: {\"name\": \"weekly|monthly|yearly\", \"config\": {...}, \"step\": 1, \"until\": \"date\"}": "Wiederkehrende Aufgabeneinstellungen. Format: {\"name\": \"wöchentlich|monatlich|jährlich\", \"config\": {...}, \"Schritt\": 1, \"bis\": \"date\"}",
|
||||
"External system identifier for this task": "Externer System-Identifikator für diese Aufgabe",
|
||||
"Select a Podio task": "Podio Aufgabe auswählen",
|
||||
"The updated text (title) for the task": "Der aktualisierte Text (Titel) für die Aufgabe",
|
||||
"The updated description for the task": "Die aktualisierte Beschreibung für die Aufgabe",
|
||||
"The new due date for the task (in users timezone)": "Das neue Enddatum für die Aufgabe (in der Zeitzone der Benutzer)",
|
||||
"The new due time for the task in local timezone (HH:MM:SS format, e.g., \"14:30:00\")": "Die neue Fälligkeit für die Aufgabe in der lokalen Zeitzone (HH:MM:SS Format, z.B.: \"14:30:00\")",
|
||||
"Mark the task as completed or not completed": "Aufgabe als erledigt oder nicht erledigt markieren",
|
||||
"The user ID of the person responsible for this task": "Die Benutzer-ID der Person, die für diese Aufgabe verantwortlich ist",
|
||||
"The labels for the task. Either a list of label ids or label texts": "Die Etiketten für die Aufgabe. Entweder eine Liste von Label-Ids oder Label-Texten",
|
||||
"The list of files that should be attached to the task": "Die Liste der Dateien, die der Aufgabe hinzugefügt werden sollen",
|
||||
"Optional reminder on this task. Format: {\"remind_delta\": minutes_before_due_date}. If empty, existing reminder is deleted.": "Optionale Erinnerung an diese Aufgabe. Format: {\"remind_delta\": minutes_before_due_date}. Wenn leer, wird bereits eine Erinnerung gelöscht.",
|
||||
"Select a file from the space": "Wählen Sie eine Datei aus der Gruppe",
|
||||
"What type of object to attach the file to": "Welcher Objekttyp soll die Datei anhängen",
|
||||
"What type of object to comment on": "Welche Art von Objekt zu kommentieren",
|
||||
"Select the specific object to comment on": "Wählen Sie das zu kommentierende Objekt aus",
|
||||
"The content of your comment": "Der Inhalt Ihres Kommentars",
|
||||
"Optional external identifier for the comment": "Optionale externe Kennung für den Kommentar",
|
||||
"Select files from the space to attach to this comment (enter file IDs from the space)": "Wählen Sie Dateien aus der Gruppe, die an diesen Kommentar angehängt werden sollen (geben Sie Datei-IDs aus dem Leerzeichen ein)",
|
||||
"ID of a previously created embedded link": "ID eines zuvor erstellten eingebetteten Links",
|
||||
"URL to embed in the comment": "URL in den Kommentar einbetten",
|
||||
"Automatically invite mentioned users to the workspace if they lack access": "Benannte Benutzer automatisch in den Arbeitsbereich einladen, wenn ihnen der Zugriff fehlt",
|
||||
"What would you like to share?": "Was möchten Sie teilen?",
|
||||
"File IDs to attach to this status update (enter file IDs from the space)": "Datei-IDs, die an dieses Statusupdate angehängt werden sollen (Datei-IDs aus dem Leerzeichen eingeben)",
|
||||
"URL to embed in the status update": "URL zum Einbinden in die Statusaktualisierung",
|
||||
"Create a poll with your status. Format: {\"text\": \"Question?\", \"options\": [\"Option 1\", \"Option 2\"]}": "Erstelle eine Umfrage mit deinem Status. Format: {\"text\": \"Frage?\", \"Option\": [\"Option 1\", \"Option 2\"]}",
|
||||
"How to find the item": "Artikel finden",
|
||||
"The specific item ID to retrieve": "Die spezifische Artikel-ID zum Abrufen",
|
||||
"Mark any new notifications on this item as viewed": "Neue Benachrichtigungen für dieses Element als angesehen markieren",
|
||||
"Filter criteria as JSON object. Use field external_id as keys.": "Kriterien als JSON-Objekt filtern. Feld external_id als Schlüssel verwenden.",
|
||||
"Maximum number of results to return (1-500, default: 20)": "Maximale Anzahl der zurückzugebenden Ergebnisse (1-500, Standardwert: 20)",
|
||||
"Number of results to skip for pagination (default: 0)": "Anzahl der zu überspringenden Ergebnisse für die Seiteninierung (Standard: 0)",
|
||||
"Field to sort results by (e.g., \"created_on\", \"last_edit_on\")": "Feld um Ergebnisse zu sortieren nach (z.B. \"created_on\", \"last_edit_on\")",
|
||||
"Sort results in descending order": "Ergebnisse absteigend sortieren",
|
||||
"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 Item": "Neues Element",
|
||||
"New Task": "Neue Aufgabe",
|
||||
"New Status": "Neuer Status",
|
||||
"Item Updated": "Artikel aktualisiert",
|
||||
"New App": "Neue App",
|
||||
"Member Added": "Mitglied hinzugefügt",
|
||||
"Fires when a new item (record/entry) is created in an app": "Feuert ab, wenn ein neues Element (Datensatz/Eintrag) in einer App erstellt wird",
|
||||
"Fires when a new task is added to any workspace": "Feuert ab, wenn eine neue Aufgabe zu einem beliebigen Arbeitsbereich hinzugefügt wird",
|
||||
"Fires when a new status is created in a workspace stream": "Feuert ab, wenn ein neuer Status in einem Workspace-Stream erstellt wird",
|
||||
"Fires when an existing item is updated (excluding comments)": "Feuer, wenn ein vorhandenes Element aktualisiert wird (ohne Kommentare)",
|
||||
"Fires when a new app is created in a workspace": "Startet, wenn eine neue App in einem Arbeitsbereich erstellt wird",
|
||||
"Fires when a new member is added to a workspace": "Feuert ab, wenn ein neues Mitglied einem Arbeitsbereich hinzugefügt wird"
|
||||
}
|
||||
@@ -0,0 +1,176 @@
|
||||
{
|
||||
"Connect your Podio account to automate workspace management and item operations.": "Conecte su cuenta de Podio para automatizar la gestión del espacio de trabajo y las operaciones de artículos.",
|
||||
"Create Item": "Crear artículo",
|
||||
"Update Item": "Actualizar elemento",
|
||||
"Create Task": "Crear tarea",
|
||||
"Update Task": "Actualizar tarea",
|
||||
"Attach File": "Adjuntar archivo",
|
||||
"Create Comment": "Crear comentario",
|
||||
"Create Status Update": "Crear Actualización de Estado",
|
||||
"Find Item": "Buscar artículo",
|
||||
"Find Task": "Buscar tarea",
|
||||
"Custom API Call": "Llamada API personalizada",
|
||||
"Create a new record in a Podio app with specified field values.": "Crear un nuevo registro en una aplicación Podio con valores de campo especificados.",
|
||||
"Update an existing record in a Podio app with specified field values. Only provided fields will be updated.": "Actualizar un registro existente en una aplicación de Podio con valores de campo especificados. Sólo se actualizarán los campos proporcionados.",
|
||||
"Add a new task to an item or workspace with due dates, assignees, and attachments.": "Añadir una nueva tarea a un elemento o área de trabajo con fechas de vencimiento, asignados y adjuntos.",
|
||||
"Modify an existing task's details or status. Only specified fields will be updated.": "Modificar los detalles o el estado de una tarea existente. Sólo se actualizarán los campos especificados.",
|
||||
"Upload and attach a file to an item/task/comment.": "Subir y adjuntar un archivo a un elemento/tarea/comentario.",
|
||||
"Post a comment on an item or task.": "Publica un comentario en un elemento o tarea.",
|
||||
"Add a status to an item or workspace stream.": "Añadir un estado a un elemento o flujo de espacio de trabajo.",
|
||||
"Retrieve a single item by ID or field value.": "Recuperar un único elemento por ID o valor de campo.",
|
||||
"Retrieve a task by ID for further updates.": "Recuperar una tarea por ID para más actualizaciones.",
|
||||
"Make a custom API call to a specific endpoint": "Hacer una llamada API personalizada a un extremo específico",
|
||||
"Organization (Optional)": "Organización (opcional)",
|
||||
"Space (Optional)": "Espacio (opcional)",
|
||||
"App": "App",
|
||||
"External ID": "ID Externo",
|
||||
"App Fields": "Campos de App",
|
||||
"Advanced: Custom Fields JSON": "Avanzado: Campos personalizados JSON",
|
||||
"File IDs": "IDs de archivo",
|
||||
"Tags": "Etiquetas",
|
||||
"Reminder": "Recordatorio",
|
||||
"Recurrence": "Recurrencia",
|
||||
"Linked Account ID": "ID de cuenta vinculada",
|
||||
"Reference": "Referencia",
|
||||
"Execute Hooks": "Ejecutar Hooks",
|
||||
"Silent Mode": "Modo silencioso",
|
||||
"Item": "Objeto",
|
||||
"Revision": "Revisión",
|
||||
"Legacy Fields (Advanced)": "Campos antiguos (Avanzado)",
|
||||
"Task Text": "Texto de tarea",
|
||||
"Description": "Descripción",
|
||||
"Private": "Privado",
|
||||
"Due Date": "Fecha de fin",
|
||||
"Due Time": "Hora límite",
|
||||
"Due Date & Time (UTC)": "Fecha y hora límite (UTC)",
|
||||
"Organization": "Organización",
|
||||
"Space": "Espacio",
|
||||
"Reference Type": "Tipo de referencia",
|
||||
"Reference Object": "Objeto de referencia",
|
||||
"Responsible Person": "Persona responsable",
|
||||
"Labels (Text)": "Etiquetas (texto)",
|
||||
"Label IDs": "ID de etiqueta",
|
||||
"Task": "Tarea",
|
||||
"Text": "Texto",
|
||||
"Completed": "Completado",
|
||||
"Responsible User ID": "ID de usuario responsable",
|
||||
"Labels": "Etiquetas",
|
||||
"File": "Archivo",
|
||||
"Attach To": "Adjuntar a",
|
||||
"Comment On": "Comentar en",
|
||||
"Object": "Objeto",
|
||||
"Comment Text": "Comentario",
|
||||
"Attach Files": "Adjuntar archivos",
|
||||
"Embed ID": "ID incrustado",
|
||||
"Embed URL": "Incrustar URL",
|
||||
"Auto-Invite Mentioned Users": "Auto-Invitar Usuarios Mencionados",
|
||||
"Status Message": "Mensaje de estado",
|
||||
"Add Poll": "Añadir encuesta",
|
||||
"Search Method": "Método de búsqueda",
|
||||
"Item ID": "Item ID",
|
||||
"Mark as Viewed": "Marcar como visto",
|
||||
"Search Filters": "Filtros de búsqueda",
|
||||
"Limit": "Límite",
|
||||
"Offset": "Desplazamiento",
|
||||
"Sort By": "Ordenar por",
|
||||
"Sort Descending": "Orden descendente",
|
||||
"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)",
|
||||
"Select an organization to filter apps by workspace. Leave empty to see all apps.": "Seleccione una organización para filtrar aplicaciones por espacio de trabajo. Dejar vacío para ver todas las aplicaciones.",
|
||||
"Select a workspace to filter apps. Leave empty to see all apps in the organization.": "Seleccione un espacio de trabajo para filtrar aplicaciones. Deje en blanco para ver todas las aplicaciones de la organización.",
|
||||
"Select a Podio app": "Selecciona una aplicación de Podio",
|
||||
"The external id of the item. This can be used to hold a reference to the item in an external system.": "El id externo del elemento. Esto puede utilizarse para mantener una referencia al elemento en un sistema externo.",
|
||||
"Configure values for the fields in the selected app": "Configurar los valores de los campos en la aplicación seleccionada",
|
||||
"Advanced: Use this for complex field configurations. Format: {\"field_id\": {\"value\": \"content\"}}. Only use if the dynamic fields above don't meet your needs.": "Avanzado: Utilice esto para configuraciones complejas de campos. Formato: {\"field_id\": {\"valor\": \"contenido\"}}. Utilice sólo si los campos dinámicos de arriba no cumplen con sus necesidades.",
|
||||
"Temporary files that have been uploaded and should be attached to this item": "Archivos temporales que han sido subidos y deben estar adjuntados a este elemento",
|
||||
"The tags to put on the item": "Las etiquetas a poner en el artículo",
|
||||
"Optional reminder on this item. Format: {\"remind_delta\": minutes_before_due_date}": "Recordatorio opcional en este elemento. Formato: {\"remind_delta\": minutos_before_due_date}",
|
||||
"The recurrence for the task, if any. Format: {\"name\": \"weekly|monthly|yearly\", \"config\": {...}, \"step\": 1, \"until\": \"date\"}": "La repetición de la tarea, si las hay. Formato: {\"name\": \"semanal|mensual|anualmente\", \"config\": {...}, \"paso\": 1, \"hasta\": \"fecha\"}",
|
||||
"The linked account to use for the meeting": "La cuenta vinculada a utilizar para la reunión",
|
||||
"The reference for the new item, if any. Format: {\"type\": \"item\", \"id\": reference_id}": "La referencia para el nuevo elemento, si existe. Formato: {\"type\": \"item\", \"id\": reference_id}",
|
||||
"If false, webhooks and integrations will not be triggered for this operation": "Si es falso, los webhooks e integraciones no se activarán para esta operación",
|
||||
"If true, notifications will not be triggered and the object will not appear in activity streams": "Si es verdadero, las notificaciones no se activarán y el objeto no aparecerá en los flujos de actividad",
|
||||
"Select a Podio item": "Selecciona un elemento de Podio",
|
||||
"Configure values for the fields you want to update in the selected app": "Configure los valores para los campos que desea actualizar en la aplicación seleccionada",
|
||||
"The revision of the item that is being updated. Optional for conflict detection.": "La revisión del elemento que está siendo actualizado. Opcional para la detección de conflictos.",
|
||||
"The new external_id of the item": "El nuevo id externo del elemento",
|
||||
"Manual field configuration using field_id or external_id as keys. Use this for advanced scenarios or when dynamic fields are not sufficient.": "Configuración manual de campos usando field_id o external_id como claves. Utilice esto para escenarios avanzados o cuando los campos dinámicos no son suficientes.",
|
||||
"The list of attachments": "La lista de archivos adjuntos",
|
||||
"The list of tags": "La lista de etiquetas",
|
||||
"The linked account to use for meetings": "La cuenta vinculada a utilizar para reuniones",
|
||||
"The reference of the item. Format: {\"type\": \"reference_type\", \"id\": reference_id}": "La referencia del elemento. Formato: {\"type\": \"reference_type\", \"id\": reference_id}",
|
||||
"The description or text of the task": "La descripción o el texto de la tarea",
|
||||
"Additional description for the task": "Descripción adicional para la tarea",
|
||||
"Whether the task should be private (only creator, assignee and assignor can see it)": "Si la tarea debe ser privada (sólo el creador, asignador y asignador puede verla)",
|
||||
"Due date in local time (date only)": "Fecha de fin en hora local (sólo fecha)",
|
||||
"Due time in local time (HH:MM:SS format, e.g., \"14:30:00\")": "Hora límite en hora local (HH:MM:SS, por ejemplo, \"14:30:00\")",
|
||||
"Complete due date and time in UTC. Alternative to separate date/time fields.": "Complete la fecha y hora de vencimiento en UTC.",
|
||||
"Select a Podio organization": "Seleccione una organización de Podio",
|
||||
"Select a Podio workspace": "Seleccione un área de trabajo de Podio",
|
||||
"The type of object to reference": "El tipo de objeto a referenciar",
|
||||
"Select the specific object to reference": "Seleccione el objeto específico a referenciar",
|
||||
"Who is responsible for this task. Can be a user ID (number) or contact identifier object with type and id.": "Quién es responsable de esta tarea. Puede ser un identificador de usuario (número) o ponerse en contacto con el objeto identificador con tipo e id.",
|
||||
"List of file IDs to attach to this task": "Lista de IDs de archivos a adjuntar a esta tarea",
|
||||
"List of label names in text form": "Lista de nombres de etiquetas en forma de texto",
|
||||
"List of label IDs (alternative to text labels)": "Lista de IDs de etiqueta (alternativa a etiquetas de texto)",
|
||||
"Reminder settings. Format: {\"remind_delta\": minutes_before_due_date}": "Ajustes del recordatorio. Formato: {\"remind_delta\": minutos_before_due_date}",
|
||||
"Recurring task settings. Format: {\"name\": \"weekly|monthly|yearly\", \"config\": {...}, \"step\": 1, \"until\": \"date\"}": "Configuración de la tarea recurrente. Formato: {\"nombre\": \"semanal|mensual|anualmente\", \"configuración\": {...}, \"paso\": 1, \"hasta\": \"fecha\"}",
|
||||
"External system identifier for this task": "Identificador externo del sistema para esta tarea",
|
||||
"Select a Podio task": "Selecciona una tarea de Podio",
|
||||
"The updated text (title) for the task": "El texto actualizado (título) para la tarea",
|
||||
"The updated description for the task": "La descripción actualizada para la tarea",
|
||||
"The new due date for the task (in users timezone)": "La nueva fecha de vencimiento para la tarea (en zona horaria de usuarios)",
|
||||
"The new due time for the task in local timezone (HH:MM:SS format, e.g., \"14:30:00\")": "El nuevo plazo para la tarea en la zona horaria local (formato HH:MM:SS, ej., \"14:30:00\")",
|
||||
"Mark the task as completed or not completed": "Marcar la tarea como completada o incompleta",
|
||||
"The user ID of the person responsible for this task": "El ID de usuario de la persona responsable de esta tarea",
|
||||
"The labels for the task. Either a list of label ids or label texts": "Las etiquetas para la tarea. O una lista de identificadores de etiqueta o textos de etiqueta",
|
||||
"The list of files that should be attached to the task": "La lista de archivos que deben ser adjuntados a la tarea",
|
||||
"Optional reminder on this task. Format: {\"remind_delta\": minutes_before_due_date}. If empty, existing reminder is deleted.": "Recordatorio opcional en esta tarea. Formato: {\"remind_delta\": minutes_before_due_date}. Si está vacío, el recordatorio existente se elimina.",
|
||||
"Select a file from the space": "Seleccione un archivo del espacio",
|
||||
"What type of object to attach the file to": "A qué tipo de objeto adjuntar el archivo",
|
||||
"What type of object to comment on": "En qué tipo de objeto comentar",
|
||||
"Select the specific object to comment on": "Seleccione el objeto específico en el que comentar",
|
||||
"The content of your comment": "El contenido de tu comentario",
|
||||
"Optional external identifier for the comment": "Identificador externo opcional para el comentario",
|
||||
"Select files from the space to attach to this comment (enter file IDs from the space)": "Seleccione archivos del espacio para adjuntar a este comentario (introduzca ID de archivo desde el espacio)",
|
||||
"ID of a previously created embedded link": "ID de un enlace embebido creado previamente",
|
||||
"URL to embed in the comment": "URL para incrustar en el comentario",
|
||||
"Automatically invite mentioned users to the workspace if they lack access": "Invitar automáticamente a los usuarios mencionados al área de trabajo si carecen de acceso",
|
||||
"What would you like to share?": "¿Qué te gustaría compartir?",
|
||||
"File IDs to attach to this status update (enter file IDs from the space)": "ID de archivo a adjuntar a esta actualización de estado (introduzca ID de archivo desde el espacio)",
|
||||
"URL to embed in the status update": "URL para incrustar en la actualización de estado",
|
||||
"Create a poll with your status. Format: {\"text\": \"Question?\", \"options\": [\"Option 1\", \"Option 2\"]}": "Crear una encuesta con su estado. Formato: {\"text\": \"Pregunta?\", \"options\": [\"Opción 1\", \"Opción 2\"]}",
|
||||
"How to find the item": "Cómo encontrar el artículo",
|
||||
"The specific item ID to retrieve": "El ID del artículo específico a recuperar",
|
||||
"Mark any new notifications on this item as viewed": "Marcar cualquier nueva notificación en este elemento como se ve",
|
||||
"Filter criteria as JSON object. Use field external_id as keys.": "Filtrar criterios como objeto JSON. Usar campo external_id como claves.",
|
||||
"Maximum number of results to return (1-500, default: 20)": "Número máximo de resultados a devolver (1-500, predeterminado: 20)",
|
||||
"Number of results to skip for pagination (default: 0)": "Número de resultados a omitir para la paginación (por defecto: 0)",
|
||||
"Field to sort results by (e.g., \"created_on\", \"last_edit_on\")": "Campo para ordenar resultados por (por ejemplo, \"created_on\", \"last_edit_on\")",
|
||||
"Sort results in descending order": "Ordenar resultados en orden descendente",
|
||||
"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 Item": "Nuevo ítem",
|
||||
"New Task": "Nueva tarea",
|
||||
"New Status": "Nuevo estado",
|
||||
"Item Updated": "Artículo actualizado",
|
||||
"New App": "Nueva App",
|
||||
"Member Added": "Miembro añadido",
|
||||
"Fires when a new item (record/entry) is created in an app": "Se activa cuando se crea un nuevo elemento (registro/entrada) en una aplicación",
|
||||
"Fires when a new task is added to any workspace": "Dispara cuando se añade una nueva tarea a cualquier área de trabajo",
|
||||
"Fires when a new status is created in a workspace stream": "Dispara cuando se crea un nuevo estado en un flujo de espacio de trabajo",
|
||||
"Fires when an existing item is updated (excluding comments)": "Dispara cuando se actualiza un elemento existente (excluyendo comentarios)",
|
||||
"Fires when a new app is created in a workspace": "Dispara cuando se crea una nueva aplicación en un área de trabajo",
|
||||
"Fires when a new member is added to a workspace": "Dispara cuando un nuevo miembro es añadido a un área de trabajo"
|
||||
}
|
||||
@@ -0,0 +1,176 @@
|
||||
{
|
||||
"Connect your Podio account to automate workspace management and item operations.": "Connectez votre compte Podio pour automatiser la gestion de l'espace de travail et les opérations d'éléments.",
|
||||
"Create Item": "Créer un élément",
|
||||
"Update Item": "Mettre à jour l'élément",
|
||||
"Create Task": "Créer une tâche",
|
||||
"Update Task": "Tâche de mise à jour",
|
||||
"Attach File": "Joindre un fichier",
|
||||
"Create Comment": "Créer un commentaire",
|
||||
"Create Status Update": "Créer une mise à jour de statut",
|
||||
"Find Item": "Trouver un objet",
|
||||
"Find Task": "Trouver une tâche",
|
||||
"Custom API Call": "Appel API personnalisé",
|
||||
"Create a new record in a Podio app with specified field values.": "Créer un nouvel enregistrement dans une application Podio avec des valeurs de champs spécifiées.",
|
||||
"Update an existing record in a Podio app with specified field values. Only provided fields will be updated.": "Mettre à jour un enregistrement existant dans une application Podio avec des valeurs de champs spécifiées. Seuls les champs fournis seront mis à jour.",
|
||||
"Add a new task to an item or workspace with due dates, assignees, and attachments.": "Ajouter une nouvelle tâche à un élément ou un espace de travail avec des dates d'échéance, des cessionnaires et des pièces jointes.",
|
||||
"Modify an existing task's details or status. Only specified fields will be updated.": "Modifier les détails ou le statut d'une tâche existante. Seuls les champs spécifiés seront mis à jour.",
|
||||
"Upload and attach a file to an item/task/comment.": "Télécharger et joindre un fichier à un élément/tâche/commentaire.",
|
||||
"Post a comment on an item or task.": "Poster un commentaire sur un élément ou une tâche.",
|
||||
"Add a status to an item or workspace stream.": "Ajouter un statut à un flux d'élément ou d'espace de travail.",
|
||||
"Retrieve a single item by ID or field value.": "Récupérer un seul élément par ID ou par valeur de champ.",
|
||||
"Retrieve a task by ID for further updates.": "Récupérer une tâche par ID pour d'autres mises à jour.",
|
||||
"Make a custom API call to a specific endpoint": "Passez un appel API personnalisé à un point de terminaison spécifique",
|
||||
"Organization (Optional)": "Organisation (facultatif)",
|
||||
"Space (Optional)": "Espace (facultatif)",
|
||||
"App": "Application",
|
||||
"External ID": "ID externe",
|
||||
"App Fields": "Champs de l'application",
|
||||
"Advanced: Custom Fields JSON": "Avancé : JSON des champs personnalisés",
|
||||
"File IDs": "ID de fichier",
|
||||
"Tags": "Tags",
|
||||
"Reminder": "Rappel",
|
||||
"Recurrence": "Récurrence",
|
||||
"Linked Account ID": "ID de compte lié",
|
||||
"Reference": "Référence",
|
||||
"Execute Hooks": "Exécuter des crochets",
|
||||
"Silent Mode": "Mode silencieux",
|
||||
"Item": "Élément",
|
||||
"Revision": "Révision",
|
||||
"Legacy Fields (Advanced)": "Champs hérités (avancés)",
|
||||
"Task Text": "Texte de la tâche",
|
||||
"Description": "Libellé",
|
||||
"Private": "Privé",
|
||||
"Due Date": "Date de fin",
|
||||
"Due Time": "Heure d'échéance",
|
||||
"Due Date & Time (UTC)": "Date et heure d'échéance (UTC)",
|
||||
"Organization": "Organisation",
|
||||
"Space": "Espace libre",
|
||||
"Reference Type": "Type de référence",
|
||||
"Reference Object": "Objet de référence",
|
||||
"Responsible Person": "Personne responsable",
|
||||
"Labels (Text)": "Étiquettes (Texte)",
|
||||
"Label IDs": "IDs d'étiquette",
|
||||
"Task": "Tâche",
|
||||
"Text": "Texte du texte",
|
||||
"Completed": "Terminé",
|
||||
"Responsible User ID": "Identifiant de l'utilisateur responsable",
|
||||
"Labels": "Étiquettes",
|
||||
"File": "Ficher",
|
||||
"Attach To": "Attacher à",
|
||||
"Comment On": "Commenter sur",
|
||||
"Object": "Objet",
|
||||
"Comment Text": "Texte du commentaire",
|
||||
"Attach Files": "Joindre des fichiers",
|
||||
"Embed ID": "Intégrer l'ID",
|
||||
"Embed URL": "Intégrer l'URL",
|
||||
"Auto-Invite Mentioned Users": "Invitation automatique des utilisateurs mentionnés",
|
||||
"Status Message": "Message de statut",
|
||||
"Add Poll": "Ajouter un sondage",
|
||||
"Search Method": "Méthode de recherche",
|
||||
"Item ID": "Item ID",
|
||||
"Mark as Viewed": "Marquer comme vu",
|
||||
"Search Filters": "Filtres de recherche",
|
||||
"Limit": "Limite",
|
||||
"Offset": "Décalage",
|
||||
"Sort By": "Trier par",
|
||||
"Sort Descending": "Tri décroissant",
|
||||
"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)",
|
||||
"Select an organization to filter apps by workspace. Leave empty to see all apps.": "Sélectionnez une organisation pour filtrer les applications par espace de travail. Laissez vide pour voir toutes les applications.",
|
||||
"Select a workspace to filter apps. Leave empty to see all apps in the organization.": "Sélectionnez un espace de travail pour filtrer les applications. Laissez vide pour voir toutes les applications de l'organisation.",
|
||||
"Select a Podio app": "Sélectionnez une application Podio",
|
||||
"The external id of the item. This can be used to hold a reference to the item in an external system.": "L'id externe de l'élément. Cela peut être utilisé pour contenir une référence à l'élément dans un système externe.",
|
||||
"Configure values for the fields in the selected app": "Configurer les valeurs des champs dans l'application sélectionnée",
|
||||
"Advanced: Use this for complex field configurations. Format: {\"field_id\": {\"value\": \"content\"}}. Only use if the dynamic fields above don't meet your needs.": "Avancé : Utilisez ceci pour des configurations de champs complexes. Format: {\"field_id\": {\"value\": \"content\"}}. Utilisez uniquement si les champs dynamiques ci-dessus ne répondent pas à vos besoins.",
|
||||
"Temporary files that have been uploaded and should be attached to this item": "Les fichiers temporaires qui ont été téléchargés et devraient être attachés à cet élément",
|
||||
"The tags to put on the item": "Les tags à mettre sur l'élément",
|
||||
"Optional reminder on this item. Format: {\"remind_delta\": minutes_before_due_date}": "Rappel optionnel sur cet élément. Format: {\"remind_delta\": minutes_before_due_date}",
|
||||
"The recurrence for the task, if any. Format: {\"name\": \"weekly|monthly|yearly\", \"config\": {...}, \"step\": 1, \"until\": \"date\"}": "La récurrence pour la tâche, le cas échéant. Format: {\"name\": \"hebdomadaire|mensuellement|annuelle\", \"config\": {...}, \"step\": 1, \"jusqu'au\": \"date\"}",
|
||||
"The linked account to use for the meeting": "Le compte lié à utiliser pour la réunion",
|
||||
"The reference for the new item, if any. Format: {\"type\": \"item\", \"id\": reference_id}": "La référence pour le nouvel élément, le cas échéant. Format: {\"type\": \"item\", \"id\": reference_id}",
|
||||
"If false, webhooks and integrations will not be triggered for this operation": "Si faux, les webhooks et les intégrations ne seront pas déclenchés pour cette opération",
|
||||
"If true, notifications will not be triggered and the object will not appear in activity streams": "Si vrai, les notifications ne seront pas déclenchées et l'objet n'apparaîtra pas dans les flux d'activité",
|
||||
"Select a Podio item": "Sélectionnez un objet Podio",
|
||||
"Configure values for the fields you want to update in the selected app": "Configurer les valeurs pour les champs que vous voulez mettre à jour dans l'application sélectionnée",
|
||||
"The revision of the item that is being updated. Optional for conflict detection.": "La révision de l'élément en cours de mise à jour. Optionnel pour la détection de conflit.",
|
||||
"The new external_id of the item": "Le nouvel external_id de l'élément",
|
||||
"Manual field configuration using field_id or external_id as keys. Use this for advanced scenarios or when dynamic fields are not sufficient.": "Configuration manuelle des champs en utilisant field_id ou external_id comme clés. Utilisez ceci pour les scénarios avancés ou lorsque les champs dynamiques ne sont pas suffisants.",
|
||||
"The list of attachments": "La liste des pièces jointes",
|
||||
"The list of tags": "La liste des tags",
|
||||
"The linked account to use for meetings": "Le compte lié à utiliser pour les réunions",
|
||||
"The reference of the item. Format: {\"type\": \"reference_type\", \"id\": reference_id}": "La référence de l'élément. Format: {\"type\": \"reference_type\", \"id\": reference_id}",
|
||||
"The description or text of the task": "La description ou le texte de la tâche",
|
||||
"Additional description for the task": "Description supplémentaire pour la tâche",
|
||||
"Whether the task should be private (only creator, assignee and assignor can see it)": "Si la tâche doit être privée (seul le créateur, l'assigné et l'assigné peuvent le voir)",
|
||||
"Due date in local time (date only)": "Date d'échéance en heure locale (date seule)",
|
||||
"Due time in local time (HH:MM:SS format, e.g., \"14:30:00\")": "Heure d'échéance au format local (HH:MM:SS, ex: \"14:30:00\")",
|
||||
"Complete due date and time in UTC. Alternative to separate date/time fields.": "Complétez la date d'échéance et l'heure en UTC. Alternative pour séparer les champs date/heure.",
|
||||
"Select a Podio organization": "Sélectionnez une organisation Podio",
|
||||
"Select a Podio workspace": "Sélectionnez un espace de travail Podio",
|
||||
"The type of object to reference": "Le type d'objet à référencer",
|
||||
"Select the specific object to reference": "Sélectionnez l'objet spécifique à référencer",
|
||||
"Who is responsible for this task. Can be a user ID (number) or contact identifier object with type and id.": "Qui est responsable de cette tâche. Peut être un identifiant utilisateur (nombre) ou un objet identifiant de contact avec le type et l'identifiant.",
|
||||
"List of file IDs to attach to this task": "Liste des identifiants de fichiers à attacher à cette tâche",
|
||||
"List of label names in text form": "Liste des noms d'étiquettes sous forme de texte",
|
||||
"List of label IDs (alternative to text labels)": "Liste des identifiants d'étiquette (alternative aux libellés textuels)",
|
||||
"Reminder settings. Format: {\"remind_delta\": minutes_before_due_date}": "Paramètres de rappel. Format: {\"remind_delta\": minutes_before_due_date}",
|
||||
"Recurring task settings. Format: {\"name\": \"weekly|monthly|yearly\", \"config\": {...}, \"step\": 1, \"until\": \"date\"}": "Paramètres des tâches récurrentes. Format: {\"name\": \"chaque semaine|mensuellement|annuellement\", \"config\": {...}, \"étape\": 1, \"jusqu'au\": \"date\"}",
|
||||
"External system identifier for this task": "Identifiant du système externe pour cette tâche",
|
||||
"Select a Podio task": "Sélectionnez une tâche Podio",
|
||||
"The updated text (title) for the task": "Le texte mis à jour (titre) pour la tâche",
|
||||
"The updated description for the task": "La description mise à jour de la tâche",
|
||||
"The new due date for the task (in users timezone)": "La nouvelle date d'échéance pour la tâche (dans le fuseau horaire des utilisateurs)",
|
||||
"The new due time for the task in local timezone (HH:MM:SS format, e.g., \"14:30:00\")": "La nouvelle heure limite pour la tâche dans le fuseau horaire local (format HH:MM:SS, p. ex. \"14:30:00\")",
|
||||
"Mark the task as completed or not completed": "Marquer la tâche comme terminée ou non terminée",
|
||||
"The user ID of the person responsible for this task": "L'ID de l'utilisateur de la personne responsable de cette tâche",
|
||||
"The labels for the task. Either a list of label ids or label texts": "Les étiquettes pour la tâche. Soit une liste d'identifiants d'étiquettes ou de textes d'étiquette",
|
||||
"The list of files that should be attached to the task": "La liste des fichiers qui doivent être attachés à la tâche",
|
||||
"Optional reminder on this task. Format: {\"remind_delta\": minutes_before_due_date}. If empty, existing reminder is deleted.": "Rappel optionnel sur cette tâche. Format: {\"remind_delta\": minutes_before_due_date}. Si vide, le rappel existant est supprimé.",
|
||||
"Select a file from the space": "Sélectionnez un fichier dans l'espace",
|
||||
"What type of object to attach the file to": "À quel type d'objet attacher le fichier",
|
||||
"What type of object to comment on": "Sur quel type d'objet commenter",
|
||||
"Select the specific object to comment on": "Sélectionnez l'objet spécifique sur lequel commenter",
|
||||
"The content of your comment": "Le contenu de votre commentaire",
|
||||
"Optional external identifier for the comment": "Identifiant externe facultatif pour le commentaire",
|
||||
"Select files from the space to attach to this comment (enter file IDs from the space)": "Sélectionnez les fichiers dans l'espace à attacher à ce commentaire (entrez les identifiants de fichier dans l'espace)",
|
||||
"ID of a previously created embedded link": "ID d'un lien incorporé précédemment créé",
|
||||
"URL to embed in the comment": "URL à intégrer dans le commentaire",
|
||||
"Automatically invite mentioned users to the workspace if they lack access": "Invitez automatiquement les utilisateurs mentionnés à l'espace de travail s'ils n'ont pas accès",
|
||||
"What would you like to share?": "Que souhaitez-vous partager ?",
|
||||
"File IDs to attach to this status update (enter file IDs from the space)": "ID de fichier à attacher à cette mise à jour de statut (entrez les identifiants de fichier depuis l'espace)",
|
||||
"URL to embed in the status update": "URL à intégrer dans la mise à jour de statut",
|
||||
"Create a poll with your status. Format: {\"text\": \"Question?\", \"options\": [\"Option 1\", \"Option 2\"]}": "Créez un sondage avec votre statut. Format: {\"text\": \"Question?\", \"options\": [\"Option 1\", \"Option 2\"]}",
|
||||
"How to find the item": "Comment trouver l'élément",
|
||||
"The specific item ID to retrieve": "L'ID de l'élément spécifique à récupérer",
|
||||
"Mark any new notifications on this item as viewed": "Marquer toute nouvelle notification sur cet élément comme vu",
|
||||
"Filter criteria as JSON object. Use field external_id as keys.": "Filtrer les critères en tant qu'objet JSON. Utiliser le champ external_id comme clés.",
|
||||
"Maximum number of results to return (1-500, default: 20)": "Nombre maximum de résultats à retourner (1-500, par défaut: 20)",
|
||||
"Number of results to skip for pagination (default: 0)": "Nombre de résultats à passer pour la pagination (par défaut: 0)",
|
||||
"Field to sort results by (e.g., \"created_on\", \"last_edit_on\")": "Champ pour trier les résultats (par exemple, \"created_on\", \"last_edit_on\")",
|
||||
"Sort results in descending order": "Trier les résultats par ordre décroissant",
|
||||
"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 Item": "Nouvel élément",
|
||||
"New Task": "Nouvelle tâche",
|
||||
"New Status": "Nouveau statut",
|
||||
"Item Updated": "Élément mis à jour",
|
||||
"New App": "Nouvelle application",
|
||||
"Member Added": "Membre ajouté",
|
||||
"Fires when a new item (record/entry) is created in an app": "Se déclenche lorsqu'un nouvel élément (enregistrement/entrée) est créé dans une application",
|
||||
"Fires when a new task is added to any workspace": "Tire lorsqu'une nouvelle tâche est ajoutée à n'importe quel espace de travail",
|
||||
"Fires when a new status is created in a workspace stream": "Déclenche lorsqu'un nouvel état est créé dans un flux d'espace de travail",
|
||||
"Fires when an existing item is updated (excluding comments)": "Tire lorsqu'un élément existant est mis à jour (hors commentaires)",
|
||||
"Fires when a new app is created in a workspace": "Se déclenche lorsqu'une nouvelle application est créée dans un espace de travail",
|
||||
"Fires when a new member is added to a workspace": "Tire lorsqu'un nouveau membre est ajouté à un espace de travail"
|
||||
}
|
||||
@@ -0,0 +1,176 @@
|
||||
{
|
||||
"Connect your Podio account to automate workspace management and item operations.": "Podioアカウントを接続して、ワークスペース管理とアイテム操作を自動化します。",
|
||||
"Create Item": "アイテムを作成",
|
||||
"Update Item": "アイテムを更新",
|
||||
"Create Task": "タスクを作成",
|
||||
"Update Task": "タスクの更新",
|
||||
"Attach File": "ファイルを添付",
|
||||
"Create Comment": "コメントを作成",
|
||||
"Create Status Update": "状態の更新を作成",
|
||||
"Find Item": "アイテムを検索",
|
||||
"Find Task": "タスクを検索",
|
||||
"Custom API Call": "カスタムAPI通話",
|
||||
"Create a new record in a Podio app with specified field values.": "指定したフィールド値を持つ Podio アプリで新しいレコードを作成します。",
|
||||
"Update an existing record in a Podio app with specified field values. Only provided fields will be updated.": "指定されたフィールド値を持つ Podio アプリの既存のレコードを更新します。指定されたフィールドのみが更新されます。",
|
||||
"Add a new task to an item or workspace with due dates, assignees, and attachments.": "期日、担当者、および添付ファイルを持つアイテムまたはワークスペースに新しいタスクを追加します。",
|
||||
"Modify an existing task's details or status. Only specified fields will be updated.": "既存のタスクの詳細またはステータスを変更します。指定されたフィールドのみが更新されます。",
|
||||
"Upload and attach a file to an item/task/comment.": "項目/タスク/コメントにファイルをアップロードして添付します。",
|
||||
"Post a comment on an item or task.": "項目またはタスクにコメントを投稿します。",
|
||||
"Add a status to an item or workspace stream.": "アイテムまたはワークスペースストリームにステータスを追加します。",
|
||||
"Retrieve a single item by ID or field value.": "IDまたは項目値で単一の項目を取得します。",
|
||||
"Retrieve a task by ID for further updates.": "さらなる更新については、IDでタスクを取得します。",
|
||||
"Make a custom API call to a specific endpoint": "特定のエンドポイントへのカスタム API コールを実行します。",
|
||||
"Organization (Optional)": "組織(オプション)",
|
||||
"Space (Optional)": "スペース(オプション)",
|
||||
"App": "アプリ",
|
||||
"External ID": "外部 ID",
|
||||
"App Fields": "アプリフィールド",
|
||||
"Advanced: Custom Fields JSON": "詳細設定: カスタムフィールドJSON",
|
||||
"File IDs": "ファイルID",
|
||||
"Tags": "タグ",
|
||||
"Reminder": "リマインダ",
|
||||
"Recurrence": "繰り返し",
|
||||
"Linked Account ID": "リンクされたアカウントID",
|
||||
"Reference": "参照",
|
||||
"Execute Hooks": "フックを実行",
|
||||
"Silent Mode": "サイレントモード",
|
||||
"Item": "項目",
|
||||
"Revision": "リビジョン",
|
||||
"Legacy Fields (Advanced)": "レガシーフィールド (上級)",
|
||||
"Task Text": "タスクテキスト",
|
||||
"Description": "説明",
|
||||
"Private": "非公開",
|
||||
"Due Date": "締切日",
|
||||
"Due Time": "締切日時",
|
||||
"Due Date & Time (UTC)": "期限 & 時間 (UTC)",
|
||||
"Organization": "組織",
|
||||
"Space": "スペース",
|
||||
"Reference Type": "参照タイプ",
|
||||
"Reference Object": "参照オブジェクト",
|
||||
"Responsible Person": "担当者",
|
||||
"Labels (Text)": "ラベル (テキスト)",
|
||||
"Label IDs": "ラベルID",
|
||||
"Task": "タスク",
|
||||
"Text": "テキスト",
|
||||
"Completed": "完了",
|
||||
"Responsible User ID": "Responsible User ID",
|
||||
"Labels": "ラベル",
|
||||
"File": "ファイル",
|
||||
"Attach To": "添付先",
|
||||
"Comment On": "コメントオン",
|
||||
"Object": "オブジェクト",
|
||||
"Comment Text": "コメントテキスト",
|
||||
"Attach Files": "ファイルを添付",
|
||||
"Embed ID": "埋め込みID",
|
||||
"Embed URL": "埋め込みURL",
|
||||
"Auto-Invite Mentioned Users": "メンションされたユーザーを自動招待する",
|
||||
"Status Message": "ステータスメッセージ",
|
||||
"Add Poll": "アンケートを追加",
|
||||
"Search Method": "検索方法",
|
||||
"Item ID": "Item ID",
|
||||
"Mark as Viewed": "閲覧済みにする",
|
||||
"Search Filters": "検索フィルター",
|
||||
"Limit": "制限",
|
||||
"Offset": "オフセット",
|
||||
"Sort By": "並び替え",
|
||||
"Sort Descending": "降順にソート",
|
||||
"Method": "方法",
|
||||
"Headers": "ヘッダー",
|
||||
"Query Parameters": "クエリパラメータ",
|
||||
"Body": "本文",
|
||||
"Response is Binary ?": "応答はバイナリですか?",
|
||||
"No Error on Failure": "失敗時にエラーはありません",
|
||||
"Timeout (in seconds)": "タイムアウト(秒)",
|
||||
"Select an organization to filter apps by workspace. Leave empty to see all apps.": "ワークスペースでアプリをフィルタリングする組織を選択します。すべてのアプリを表示するには空のままにします。",
|
||||
"Select a workspace to filter apps. Leave empty to see all apps in the organization.": "アプリをフィルタリングするワークスペースを選択します。組織内のすべてのアプリを表示するには、空白のままにします。",
|
||||
"Select a Podio app": "Podioアプリを選択",
|
||||
"The external id of the item. This can be used to hold a reference to the item in an external system.": "アイテムの外部ID。外部システム内のアイテムへの参照を保持するために使用できます。",
|
||||
"Configure values for the fields in the selected app": "選択したアプリのフィールドの値を設定します",
|
||||
"Advanced: Use this for complex field configurations. Format: {\"field_id\": {\"value\": \"content\"}}. Only use if the dynamic fields above don't meet your needs.": "Advanced: 複雑なフィールド設定に使用します。フォーマット: {\"field_id\": {\"value\": \"content\"}}. 上記の動的フィールドがニーズを満たしていない場合にのみ使用します。",
|
||||
"Temporary files that have been uploaded and should be attached to this item": "このアイテムに添付されている一時ファイルがアップロードされています",
|
||||
"The tags to put on the item": "アイテムに追加するタグ",
|
||||
"Optional reminder on this item. Format: {\"remind_delta\": minutes_before_due_date}": "このアイテムのオプションのリマインダー。フォーマット:{\"remind_delta\": minutes_before_due_date}",
|
||||
"The recurrence for the task, if any. Format: {\"name\": \"weekly|monthly|yearly\", \"config\": {...}, \"step\": 1, \"until\": \"date\"}": "タスクの繰り返しです。フォーマット: {\"name\": \"weekly|monthly|yearly\", \"config\": {...}, \"step\": 1, \"until\": \"date\"}",
|
||||
"The linked account to use for the meeting": "会議に使用するリンクされたアカウント",
|
||||
"The reference for the new item, if any. Format: {\"type\": \"item\", \"id\": reference_id}": "新しいアイテムの参照。もしあれば。フォーマット:{\"type\": \"item\", \"id\": reference_id}",
|
||||
"If false, webhooks and integrations will not be triggered for this operation": "falseの場合、この操作に対してWebhookと統合がトリガーされません。",
|
||||
"If true, notifications will not be triggered and the object will not appear in activity streams": "true の場合、通知はトリガーされず、オブジェクトはアクティビティストリームに表示されません",
|
||||
"Select a Podio item": "Podio アイテムを選択",
|
||||
"Configure values for the fields you want to update in the selected app": "選択したアプリで更新したいフィールドの値を設定します",
|
||||
"The revision of the item that is being updated. Optional for conflict detection.": "更新されているアイテムのリビジョン。競合を検出するためのオプション。",
|
||||
"The new external_id of the item": "アイテムの新しい external_id",
|
||||
"Manual field configuration using field_id or external_id as keys. Use this for advanced scenarios or when dynamic fields are not sufficient.": "キーに field_id または external_id を使用した手動フィールド設定。高度なシナリオや動的フィールドが不十分な場合に使用します。",
|
||||
"The list of attachments": "添付ファイル一覧",
|
||||
"The list of tags": "タグのリスト",
|
||||
"The linked account to use for meetings": "会議に使用するリンクされたアカウント",
|
||||
"The reference of the item. Format: {\"type\": \"reference_type\", \"id\": reference_id}": "項目の参照。書式: {\"type\": \"reference_type\", \"id\": reference_id}",
|
||||
"The description or text of the task": "タスクの説明またはテキスト",
|
||||
"Additional description for the task": "タスクの追加説明",
|
||||
"Whether the task should be private (only creator, assignee and assignor can see it)": "タスクをプライベートにするかどうか(作成者、担当者、割り当て者のみが表示されます)",
|
||||
"Due date in local time (date only)": "最終日時(日時のみ)",
|
||||
"Due time in local time (HH:MM:SS format, e.g., \"14:30:00\")": "期限はローカル時間(HH:MM:SS形式, 例えば, \"14:30:00\")",
|
||||
"Complete due date and time in UTC. Alternative to separate date/time fields.": "締切日時はUTCで完了します。日付/時刻フィールドを分離する代わりになります。",
|
||||
"Select a Podio organization": "Podio 組織を選択",
|
||||
"Select a Podio workspace": "Podioワークスペースを選択",
|
||||
"The type of object to reference": "参照するオブジェクトの種類",
|
||||
"Select the specific object to reference": "参照する特定のオブジェクトを選択します",
|
||||
"Who is responsible for this task. Can be a user ID (number) or contact identifier object with type and id.": "誰がこのタスクを担当しますか。ユーザーID(数字)またはtypeとidを持つ連絡先識別子オブジェクトにすることができます。",
|
||||
"List of file IDs to attach to this task": "このタスクに添付するファイルIDの一覧",
|
||||
"List of label names in text form": "テキスト形式でのラベル名のリスト",
|
||||
"List of label IDs (alternative to text labels)": "ラベル ID の一覧 (テキスト ラベルの代わり)",
|
||||
"Reminder settings. Format: {\"remind_delta\": minutes_before_due_date}": "リマインダー設定:{\"remind_delta\": minutes_before_due_date}",
|
||||
"Recurring task settings. Format: {\"name\": \"weekly|monthly|yearly\", \"config\": {...}, \"step\": 1, \"until\": \"date\"}": "定期的なタスク設定。フォーマット: {\"name\": \"毎週|毎月|毎年\", \"config\": {...}, \"step\": 1, \"until\": \"date\"}",
|
||||
"External system identifier for this task": "このタスクの外部システム識別子",
|
||||
"Select a Podio task": "Podio タスクを選択",
|
||||
"The updated text (title) for the task": "タスクの更新されたテキスト (タイトル)",
|
||||
"The updated description for the task": "タスクの更新された説明",
|
||||
"The new due date for the task (in users timezone)": "タスクの新しい締切日時(ユーザーのタイムゾーン内)",
|
||||
"The new due time for the task in local timezone (HH:MM:SS format, e.g., \"14:30:00\")": "ローカルタイムゾーン(HH:MM:SS形式、例:\"14:30:00\")",
|
||||
"Mark the task as completed or not completed": "タスクを完了または完了していないとマークする",
|
||||
"The user ID of the person responsible for this task": "このタスクの責任者のユーザー ID",
|
||||
"The labels for the task. Either a list of label ids or label texts": "タスクのラベル。ラベル ID またはラベル テキストのリストのいずれか",
|
||||
"The list of files that should be attached to the task": "タスクに添付するファイルのリスト",
|
||||
"Optional reminder on this task. Format: {\"remind_delta\": minutes_before_due_date}. If empty, existing reminder is deleted.": "このタスクに関する任意のリマインダー。フォーマット:{\"remind_delta\": minutes_before_due_date}。空の場合は、既存のリマインダーが削除されます。",
|
||||
"Select a file from the space": "スペースからファイルを選択",
|
||||
"What type of object to attach the file to": "ファイルを添付するオブジェクトの種類",
|
||||
"What type of object to comment on": "コメントするオブジェクトの種類",
|
||||
"Select the specific object to comment on": "コメントする特定のオブジェクトを選択",
|
||||
"The content of your comment": "コメントの内容",
|
||||
"Optional external identifier for the comment": "コメントのオプションの外部識別子",
|
||||
"Select files from the space to attach to this comment (enter file IDs from the space)": "このコメントに添付するスペースからファイルを選択してください (スペースからファイルIDを入力してください)",
|
||||
"ID of a previously created embedded link": "以前に作成された埋め込みリンクの ID",
|
||||
"URL to embed in the comment": "コメントに埋め込むURL",
|
||||
"Automatically invite mentioned users to the workspace if they lack access": "メンションされたユーザーをワークスペースに自動的に招待する",
|
||||
"What would you like to share?": "何を共有しますか?",
|
||||
"File IDs to attach to this status update (enter file IDs from the space)": "この状態の更新に添付するファイルID(スペースからファイルIDを入力)",
|
||||
"URL to embed in the status update": "ステータス更新に埋め込むURL",
|
||||
"Create a poll with your status. Format: {\"text\": \"Question?\", \"options\": [\"Option 1\", \"Option 2\"]}": "状態で投票を作成します。フォーマット: {\"text\": \"Question?\", \"options\": [\"Option 1\", \"Option 2\"]}",
|
||||
"How to find the item": "アイテムを見つける方法",
|
||||
"The specific item ID to retrieve": "取得する特定のアイテムID",
|
||||
"Mark any new notifications on this item as viewed": "このアイテムの新しい通知を閲覧としてマークする",
|
||||
"Filter criteria as JSON object. Use field external_id as keys.": "JSON オブジェクトとして条件をフィルタリングします。フィールドの external_id をキーとして使用します。",
|
||||
"Maximum number of results to return (1-500, default: 20)": "返す結果の最大数(1-500、デフォルト:20)",
|
||||
"Number of results to skip for pagination (default: 0)": "ページネーションをスキップする結果の数 (デフォルト: 0)",
|
||||
"Field to sort results by (e.g., \"created_on\", \"last_edit_on\")": "結果をソートするフィールド (例: \"created_on\", \"last_edit_on\")",
|
||||
"Sort results in descending order": "降順で結果をソート",
|
||||
"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 Item": "新しいアイテム",
|
||||
"New Task": "新しいタスク",
|
||||
"New Status": "新しいステータス",
|
||||
"Item Updated": "アイテムを更新しました",
|
||||
"New App": "新しいアプリ",
|
||||
"Member Added": "メンバーを追加しました",
|
||||
"Fires when a new item (record/entry) is created in an app": "アプリ内に新しいアイテム(レコード/エントリ)が作成されたときに発行されます。",
|
||||
"Fires when a new task is added to any workspace": "任意のワークスペースに新しいタスクが追加されたときに発行されます。",
|
||||
"Fires when a new status is created in a workspace stream": "ワークスペースストリームに新しいステータスが作成されたときに発生します。",
|
||||
"Fires when an existing item is updated (excluding comments)": "既存のアイテムが更新されたときに発生します(コメントを除く)",
|
||||
"Fires when a new app is created in a workspace": "ワークスペースに新しいアプリが作成されたときに発行されます。",
|
||||
"Fires when a new member is added to a workspace": "ワークスペースに新しいメンバーが追加されたときに発火します"
|
||||
}
|
||||
@@ -0,0 +1,176 @@
|
||||
{
|
||||
"Connect your Podio account to automate workspace management and item operations.": "Verbind uw Podio account om workspace-management en artikelbewerkingen te automatiseren.",
|
||||
"Create Item": "Item aanmaken",
|
||||
"Update Item": "Artikel bijwerken",
|
||||
"Create Task": "Taak maken",
|
||||
"Update Task": "Taak bijwerken",
|
||||
"Attach File": "Bestand toevoegen",
|
||||
"Create Comment": "Commentaar maken",
|
||||
"Create Status Update": "Statusupdate aanmaken",
|
||||
"Find Item": "Voorwerp zoeken",
|
||||
"Find Task": "Zoek Taak",
|
||||
"Custom API Call": "Custom API Call",
|
||||
"Create a new record in a Podio app with specified field values.": "Maak een nieuw record in een Podio app met opgegeven veldwaarden.",
|
||||
"Update an existing record in a Podio app with specified field values. Only provided fields will be updated.": "Update een bestaand record in een Podio app met opgegeven veld waarden. Alleen opgegeven velden zullen worden bijgewerkt.",
|
||||
"Add a new task to an item or workspace with due dates, assignees, and attachments.": "Voeg een nieuwe taak toe aan een item of werkruimte met vervalte dates, taakontvangers en bijlagen.",
|
||||
"Modify an existing task's details or status. Only specified fields will be updated.": "Wijzig de details of status van een bestaande taak. Alleen de opgegeven velden worden bijgewerkt.",
|
||||
"Upload and attach a file to an item/task/comment.": "Upload en voeg een bestand toe aan een item/taak/commentaar.",
|
||||
"Post a comment on an item or task.": "Plaats een reactie op een item of taak.",
|
||||
"Add a status to an item or workspace stream.": "Voeg een status toe aan een item of workspace stream.",
|
||||
"Retrieve a single item by ID or field value.": "Haal een enkel item op via ID of veldwaarde.",
|
||||
"Retrieve a task by ID for further updates.": "Ophalen een taak via ID voor verdere updates.",
|
||||
"Make a custom API call to a specific endpoint": "Maak een aangepaste API call naar een specifiek eindpunt",
|
||||
"Organization (Optional)": "Organisatie (optioneel)",
|
||||
"Space (Optional)": "Ruimte (optioneel)",
|
||||
"App": "App",
|
||||
"External ID": "Extern ID",
|
||||
"App Fields": "App velden",
|
||||
"Advanced: Custom Fields JSON": "Geavanceerd: Aangepaste velden JSON",
|
||||
"File IDs": "Bestand ID's",
|
||||
"Tags": "Labels",
|
||||
"Reminder": "Herinnering",
|
||||
"Recurrence": "Herhaling",
|
||||
"Linked Account ID": "Gekoppeld account-ID",
|
||||
"Reference": "Referentie",
|
||||
"Execute Hooks": "Hooks uitvoeren",
|
||||
"Silent Mode": "Stille modus",
|
||||
"Item": "Artikel",
|
||||
"Revision": "Herziening",
|
||||
"Legacy Fields (Advanced)": "Oude velden (Geavanceerd)",
|
||||
"Task Text": "Taak tekst",
|
||||
"Description": "Beschrijving",
|
||||
"Private": "Privé",
|
||||
"Due Date": "Inleverdatum",
|
||||
"Due Time": "Achterstallige tijd",
|
||||
"Due Date & Time (UTC)": "Due Date & Time (UTC)",
|
||||
"Organization": "Rekening",
|
||||
"Space": "Spatiebalk",
|
||||
"Reference Type": "Referentie type",
|
||||
"Reference Object": "Referentie object",
|
||||
"Responsible Person": "Verantwoordelijk persoon",
|
||||
"Labels (Text)": "Etiketten (Tekst)",
|
||||
"Label IDs": "Label ID's",
|
||||
"Task": "Opdracht",
|
||||
"Text": "Tekstveld",
|
||||
"Completed": "Voltooid",
|
||||
"Responsible User ID": "Verantwoordelijke gebruiker ID",
|
||||
"Labels": "Labels",
|
||||
"File": "Bestand",
|
||||
"Attach To": "Bijvoegen aan",
|
||||
"Comment On": "Commentaar op",
|
||||
"Object": "Object",
|
||||
"Comment Text": "Commentaar tekst",
|
||||
"Attach Files": "Bestanden toevoegen",
|
||||
"Embed ID": "ID insluiten",
|
||||
"Embed URL": "URL insluiten",
|
||||
"Auto-Invite Mentioned Users": "Auto-invite vermelde gebruikers",
|
||||
"Status Message": "Status bericht",
|
||||
"Add Poll": "Enquete toevoegen",
|
||||
"Search Method": "Zoek methode",
|
||||
"Item ID": "Item ID",
|
||||
"Mark as Viewed": "Markeren als bekeken",
|
||||
"Search Filters": "Zoek filters",
|
||||
"Limit": "Limiet",
|
||||
"Offset": "Verschuiving",
|
||||
"Sort By": "Sorteren op",
|
||||
"Sort Descending": "Aflopend sorteren",
|
||||
"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)",
|
||||
"Select an organization to filter apps by workspace. Leave empty to see all apps.": "Selecteer een organisatie om apps te filteren op werkruimte. Laat leeg om alle apps te zien.",
|
||||
"Select a workspace to filter apps. Leave empty to see all apps in the organization.": "Selecteer een werkruimte om apps te filteren. Laat leeg om alle apps in de organisatie te zien.",
|
||||
"Select a Podio app": "Selecteer een Podio app",
|
||||
"The external id of the item. This can be used to hold a reference to the item in an external system.": "Het externe id van het artikel. Dit kan worden gebruikt om een verwijzing naar het artikel in een extern systeem vast te houden.",
|
||||
"Configure values for the fields in the selected app": "Configureer waarden voor de velden in de geselecteerde app",
|
||||
"Advanced: Use this for complex field configurations. Format: {\"field_id\": {\"value\": \"content\"}}. Only use if the dynamic fields above don't meet your needs.": "Geavanceerd: Gebruik dit voor complexe veldconfiguraties. Formaat: {\"field_id\": {\"value\": \"content\"}}. Alleen gebruiken als de dynamische velden hierboven niet aan uw behoeften voldoen.",
|
||||
"Temporary files that have been uploaded and should be attached to this item": "Tijdelijke bestanden die zijn geüpload en moeten worden toegevoegd aan dit item",
|
||||
"The tags to put on the item": "De tags om op het item te plaatsen",
|
||||
"Optional reminder on this item. Format: {\"remind_delta\": minutes_before_due_date}": "Optionele herinnering voor dit item. Formaat: {\"remind_delta\": minutes_before_due_date}",
|
||||
"The recurrence for the task, if any. Format: {\"name\": \"weekly|monthly|yearly\", \"config\": {...}, \"step\": 1, \"until\": \"date\"}": "De herhalingsdatum voor de taak, indien van toepassing. Formaat: {\"naam\": \"wekelijkse maandelijks\", \"config\": {...}, \"stap\": 1, \"tot\": \"date\"}",
|
||||
"The linked account to use for the meeting": "Het gekoppelde account dat moet worden gebruikt voor de vergadering",
|
||||
"The reference for the new item, if any. Format: {\"type\": \"item\", \"id\": reference_id}": "De referentie voor het nieuwe item, indien van toepassing. Formaat: {\"type\": \"item\", \"id\": reference_id}",
|
||||
"If false, webhooks and integrations will not be triggered for this operation": "Indien onwaar, webhooks en integraties niet worden geactiveerd voor deze bewerking",
|
||||
"If true, notifications will not be triggered and the object will not appear in activity streams": "Indien waar, meldingen zullen niet worden geactiveerd en het object zal niet worden weergegeven in activiteit streams",
|
||||
"Select a Podio item": "Selecteer een Podio item",
|
||||
"Configure values for the fields you want to update in the selected app": "Configureer de waarden voor de velden die u wilt bijwerken in de geselecteerde app",
|
||||
"The revision of the item that is being updated. Optional for conflict detection.": "De herziening van het item dat wordt bijgewerkt. Optioneel voor conflictdetectie.",
|
||||
"The new external_id of the item": "De nieuwe external_id van het item",
|
||||
"Manual field configuration using field_id or external_id as keys. Use this for advanced scenarios or when dynamic fields are not sufficient.": "Handmatige veldconfiguratie met behulp van field_id of external_id als sleutels. Gebruik dit voor geavanceerde scenario's of wanneer dynamische velden niet voldoende zijn.",
|
||||
"The list of attachments": "De lijst van bijlagen",
|
||||
"The list of tags": "De lijst met tags",
|
||||
"The linked account to use for meetings": "Het gekoppelde account om te gebruiken voor vergaderingen",
|
||||
"The reference of the item. Format: {\"type\": \"reference_type\", \"id\": reference_id}": "De referentie van het item. Formaat: {\"type\": \"reference_type\", \"id\": reference_id}",
|
||||
"The description or text of the task": "De omschrijving of tekst van de taak",
|
||||
"Additional description for the task": "Aanvullende beschrijving van de taak",
|
||||
"Whether the task should be private (only creator, assignee and assignor can see it)": "Of de taak privé moet zijn (alleen maker, verantwoordelijke en opdrachtgever of kan deze zien)",
|
||||
"Due date in local time (date only)": "Vervaldatum in lokale tijd (alleen datum)",
|
||||
"Due time in local time (HH:MM:SS format, e.g., \"14:30:00\")": "Vervaltijd in lokale tijd (HH:MM:SS formaat, b.v. \"14:30:00\")",
|
||||
"Complete due date and time in UTC. Alternative to separate date/time fields.": "Voltooi vervaldatum en tijd in UTC. Alternatief om datum/tijd velden te scheiden.",
|
||||
"Select a Podio organization": "Selecteer een Podio organisatie",
|
||||
"Select a Podio workspace": "Selecteer een Podio workspace",
|
||||
"The type of object to reference": "Het type object om te verwijzen",
|
||||
"Select the specific object to reference": "Selecteer het specifieke object om te verwijzen",
|
||||
"Who is responsible for this task. Can be a user ID (number) or contact identifier object with type and id.": "Wie is verantwoordelijk voor deze taak. Kan een gebruikers-ID (nummer) of contact opnemen met het type en id.",
|
||||
"List of file IDs to attach to this task": "Lijst van te koppelen bestand IDs aan deze taak",
|
||||
"List of label names in text form": "Lijst van labelnamen in tekstformulier",
|
||||
"List of label IDs (alternative to text labels)": "Lijst van label ID's (alternatief voor tekstlabels)",
|
||||
"Reminder settings. Format: {\"remind_delta\": minutes_before_due_date}": "Herinneringsinstellingen. Formaat: {\"herinnering_delta\": minutes_before_due_date}",
|
||||
"Recurring task settings. Format: {\"name\": \"weekly|monthly|yearly\", \"config\": {...}, \"step\": 1, \"until\": \"date\"}": "Terugkerende taakinstellingen. Formaat: {\"naam\": \"wekelijks maandelijks\", \"config\": {...}, \"stap\": 1, \"tot\": \"date\"}",
|
||||
"External system identifier for this task": "Naam extern systeem voor deze taak",
|
||||
"Select a Podio task": "Selecteer een Podio taak",
|
||||
"The updated text (title) for the task": "De bijgewerkte tekst (titel) voor de taak",
|
||||
"The updated description for the task": "De bijgewerkte beschrijving van de taak",
|
||||
"The new due date for the task (in users timezone)": "De nieuwe vervaldatum voor de taak (in gebruikerstijdzone)",
|
||||
"The new due time for the task in local timezone (HH:MM:SS format, e.g., \"14:30:00\")": "De nieuwe vervaltijd voor de taak in lokale tijdzone (HH:MM:SS formaat, b.v. \"14:30:00\")",
|
||||
"Mark the task as completed or not completed": "Markeer de taak als voltooid of niet voltooid",
|
||||
"The user ID of the person responsible for this task": "De gebruikers-ID van de persoon die verantwoordelijk is voor deze taak",
|
||||
"The labels for the task. Either a list of label ids or label texts": "De labels voor de taak. Ofwel een lijst van labelid's of labelteksten",
|
||||
"The list of files that should be attached to the task": "De lijst met bestanden die aan de taak moeten worden toegevoegd",
|
||||
"Optional reminder on this task. Format: {\"remind_delta\": minutes_before_due_date}. If empty, existing reminder is deleted.": "Optionele herinnering voor deze taak. Formaat: {\"remind_delta\": minutes_before_due_date}. Indien leeg, wordt bestaande herinnering verwijderd.",
|
||||
"Select a file from the space": "Selecteer een bestand uit de ruimte",
|
||||
"What type of object to attach the file to": "Aan welk type object het bestand toe te voegen",
|
||||
"What type of object to comment on": "Welk type object om op te reageren",
|
||||
"Select the specific object to comment on": "Selecteer het specifieke object waarop u commentaar wilt geven",
|
||||
"The content of your comment": "De inhoud van uw commentaar",
|
||||
"Optional external identifier for the comment": "Optionele externe identificatie voor de opmerking",
|
||||
"Select files from the space to attach to this comment (enter file IDs from the space)": "Selecteer bestanden uit de ruimte om toe te voegen aan deze reactie (voer bestand-IDs in vanuit de spatie)",
|
||||
"ID of a previously created embedded link": "ID van een eerder gemaakte ingesloten link",
|
||||
"URL to embed in the comment": "URL om in te sluiten in de reactie",
|
||||
"Automatically invite mentioned users to the workspace if they lack access": "Vermelde gebruikers automatisch uitnodigen voor de werkruimte als ze geen toegang hebben",
|
||||
"What would you like to share?": "Wat wilt u delen?",
|
||||
"File IDs to attach to this status update (enter file IDs from the space)": "Bestands-IDs om aan deze statusupdate te koppelen (voer bestand-ID's vanuit de ruimte in)",
|
||||
"URL to embed in the status update": "URL om in te sluiten in de statusupdate",
|
||||
"Create a poll with your status. Format: {\"text\": \"Question?\", \"options\": [\"Option 1\", \"Option 2\"]}": "Maak een poll aan met je status. Formaat: {\"text\": \"Vraag?\", \"opties\": [\"Optie 1\", \"Optie 2\"]}",
|
||||
"How to find the item": "Hoe vind je het item",
|
||||
"The specific item ID to retrieve": "Het op te halen specifieke item-ID",
|
||||
"Mark any new notifications on this item as viewed": "Markeer nieuwe meldingen op dit item als bekeken",
|
||||
"Filter criteria as JSON object. Use field external_id as keys.": "Filter criteria als JSON object. Gebruik veld external_id als sleutels.",
|
||||
"Maximum number of results to return (1-500, default: 20)": "Maximum aantal resultaten om terug te keren (1-500, standaard: 20)",
|
||||
"Number of results to skip for pagination (default: 0)": "Aantal resultaten om over te slaan voor paginering (standaard: 0)",
|
||||
"Field to sort results by (e.g., \"created_on\", \"last_edit_on\")": "Veld om resultaten te sorteren op (bijv. \"created_on\", \"last_edit_on\")",
|
||||
"Sort results in descending order": "Sorteer resultaten in aflopende volgorde",
|
||||
"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 Item": "Nieuw artikel",
|
||||
"New Task": "Nieuwe taak",
|
||||
"New Status": "Nieuwe status",
|
||||
"Item Updated": "Item bijgewerkt",
|
||||
"New App": "Nieuwe app",
|
||||
"Member Added": "Lid toegevoegd",
|
||||
"Fires when a new item (record/entry) is created in an app": "Vuurt wanneer een nieuw item (record/entry) wordt aangemaakt in een app",
|
||||
"Fires when a new task is added to any workspace": "Vuurt wanneer een nieuwe taak is toegevoegd aan elke werkruimte",
|
||||
"Fires when a new status is created in a workspace stream": "Vuurt wanneer een nieuwe status is gemaakt in een workspace stream",
|
||||
"Fires when an existing item is updated (excluding comments)": "Vuurt wanneer een bestaand item wordt bijgewerkt (exclusief reacties)",
|
||||
"Fires when a new app is created in a workspace": "Schiet wanneer een nieuwe app is gemaakt in een werkruimte",
|
||||
"Fires when a new member is added to a workspace": "Vuurt wanneer een nieuw lid is toegevoegd aan een werkruimte"
|
||||
}
|
||||
@@ -0,0 +1,176 @@
|
||||
{
|
||||
"Connect your Podio account to automate workspace management and item operations.": "Conecte sua conta do Podio para automatizar o gerenciamento de projetos e operações de itens.",
|
||||
"Create Item": "Criar item",
|
||||
"Update Item": "Atualizar Item",
|
||||
"Create Task": "Criar tarefa",
|
||||
"Update Task": "Atualizar Tarefa",
|
||||
"Attach File": "Anexar arquivo",
|
||||
"Create Comment": "Criar Comentário",
|
||||
"Create Status Update": "Criar atualização de status",
|
||||
"Find Item": "Encontrar item",
|
||||
"Find Task": "Procurar Tarefa",
|
||||
"Custom API Call": "Chamada de API personalizada",
|
||||
"Create a new record in a Podio app with specified field values.": "Criar um novo registro em um aplicativo do Podio com valores de campo especificados.",
|
||||
"Update an existing record in a Podio app with specified field values. Only provided fields will be updated.": "Atualizar um registro existente em um aplicativo Podio com valores de campo especificados. Somente campos fornecidos serão atualizados.",
|
||||
"Add a new task to an item or workspace with due dates, assignees, and attachments.": "Adicionar uma nova tarefa a um item ou espaço de trabalho com datas previstas, atribuídos e anexos.",
|
||||
"Modify an existing task's details or status. Only specified fields will be updated.": "Modifica os detalhes ou status de uma tarefa existente. Somente campos especificados serão atualizados.",
|
||||
"Upload and attach a file to an item/task/comment.": "Enviar e anexar um arquivo a um item/tarefa/comentário.",
|
||||
"Post a comment on an item or task.": "Publique um comentário em um item ou tarefa.",
|
||||
"Add a status to an item or workspace stream.": "Adicionar um status a um fluxo de item ou espaço de trabalho.",
|
||||
"Retrieve a single item by ID or field value.": "Recuperar um único item por ID ou valor do campo.",
|
||||
"Retrieve a task by ID for further updates.": "Recuperar uma tarefa por ID para mais atualizações.",
|
||||
"Make a custom API call to a specific endpoint": "Faça uma chamada de API personalizada para um ponto de extremidade específico",
|
||||
"Organization (Optional)": "Organização (opcional)",
|
||||
"Space (Optional)": "Espaço (opcional)",
|
||||
"App": "Aplicativo",
|
||||
"External ID": "ID Externo",
|
||||
"App Fields": "Campos do aplicativo",
|
||||
"Advanced: Custom Fields JSON": "Avançado: Campos Personalizados JSON",
|
||||
"File IDs": "IDs de arquivo",
|
||||
"Tags": "Etiquetas",
|
||||
"Reminder": "Lembrete",
|
||||
"Recurrence": "Recorrência",
|
||||
"Linked Account ID": "ID da Conta Vinculada",
|
||||
"Reference": "Referência",
|
||||
"Execute Hooks": "Executar Hooks",
|
||||
"Silent Mode": "Modo silencioso",
|
||||
"Item": "Produto",
|
||||
"Revision": "Revisão",
|
||||
"Legacy Fields (Advanced)": "Campos Legados (Avançado)",
|
||||
"Task Text": "Texto da tarefa",
|
||||
"Description": "Descrição",
|
||||
"Private": "Privado",
|
||||
"Due Date": "Data de vencimento",
|
||||
"Due Time": "Hora-Limite",
|
||||
"Due Date & Time (UTC)": "Data de Vencimento E Hora (UTC)",
|
||||
"Organization": "Cliente",
|
||||
"Space": "Sala",
|
||||
"Reference Type": "Tipo de referência",
|
||||
"Reference Object": "Objeto de Referência",
|
||||
"Responsible Person": "Pessoa Responsável",
|
||||
"Labels (Text)": "Etiquetas (Texto)",
|
||||
"Label IDs": "IDs de Rótulos",
|
||||
"Task": "Tarefas",
|
||||
"Text": "texto",
|
||||
"Completed": "Concluído",
|
||||
"Responsible User ID": "Identificação de Usuário Responsável",
|
||||
"Labels": "Marcadores",
|
||||
"File": "Arquivo",
|
||||
"Attach To": "Anexar a",
|
||||
"Comment On": "Comentar em",
|
||||
"Object": "Objeto",
|
||||
"Comment Text": "Texto do comentário",
|
||||
"Attach Files": "Anexar arquivos",
|
||||
"Embed ID": "Incorporar ID",
|
||||
"Embed URL": "Incorporar URL",
|
||||
"Auto-Invite Mentioned Users": "Convites Automáticos Mencionados",
|
||||
"Status Message": "Mensagem de status",
|
||||
"Add Poll": "Adicionar enquete",
|
||||
"Search Method": "Método de Pesquisa",
|
||||
"Item ID": "Item ID",
|
||||
"Mark as Viewed": "Marcar como Visto",
|
||||
"Search Filters": "Filtros de Busca",
|
||||
"Limit": "Limitar",
|
||||
"Offset": "Deslocamento",
|
||||
"Sort By": "Classificar por",
|
||||
"Sort Descending": "Ordenação Decrescente",
|
||||
"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)",
|
||||
"Select an organization to filter apps by workspace. Leave empty to see all apps.": "Selecione uma organização para filtrar os aplicativos por área de trabalho. Deixe em branco para ver todos os aplicativos.",
|
||||
"Select a workspace to filter apps. Leave empty to see all apps in the organization.": "Selecione um espaço de trabalho para filtrar aplicativos. Deixe em branco para ver todos os apps da organização.",
|
||||
"Select a Podio app": "Selecione um app do Podio",
|
||||
"The external id of the item. This can be used to hold a reference to the item in an external system.": "O ID externo do item. Isso pode ser usado para manter uma referência ao item em um sistema externo.",
|
||||
"Configure values for the fields in the selected app": "Configure os valores para os campos no aplicativo selecionado",
|
||||
"Advanced: Use this for complex field configurations. Format: {\"field_id\": {\"value\": \"content\"}}. Only use if the dynamic fields above don't meet your needs.": "Avançado: Use isto para configurações de campo complexas. Formato: {\"field_id\": {\"value\": \"content\"}}. Use somente se os campos dinâmicos acima não atenderem às suas necessidades.",
|
||||
"Temporary files that have been uploaded and should be attached to this item": "Arquivos temporários que foram carregados e devem ser anexados a este item",
|
||||
"The tags to put on the item": "As tags a serem colocadas no item",
|
||||
"Optional reminder on this item. Format: {\"remind_delta\": minutes_before_due_date}": "Lembrete opcional sobre este item. Formato: {\"remind_delta\": minues_before_due_date}",
|
||||
"The recurrence for the task, if any. Format: {\"name\": \"weekly|monthly|yearly\", \"config\": {...}, \"step\": 1, \"until\": \"date\"}": "A recorrência da tarefa, se houver. Formato: {\"nome\": \"semanalmente menstrualmente\", \"config\": {...}, \"step\": 1, \"until\": \"date\"}",
|
||||
"The linked account to use for the meeting": "A conta vinculada a ser usada para a reunião",
|
||||
"The reference for the new item, if any. Format: {\"type\": \"item\", \"id\": reference_id}": "A referência para o novo item, se houver. Formato: {\"type\": \"item\", \"id\": reference_id}",
|
||||
"If false, webhooks and integrations will not be triggered for this operation": "Se falso, webhooks e integrações não serão acionadas para esta operação",
|
||||
"If true, notifications will not be triggered and the object will not appear in activity streams": "Se verdadeiro, as notificações não serão acionadas e o objeto não aparecerá nos fluxos de atividade",
|
||||
"Select a Podio item": "Selecione um item do Podio",
|
||||
"Configure values for the fields you want to update in the selected app": "Configure os valores para os campos que deseja atualizar no aplicativo selecionado",
|
||||
"The revision of the item that is being updated. Optional for conflict detection.": "A revisão do item que está sendo atualizado. Opcional para a detecção de conflitos.",
|
||||
"The new external_id of the item": "O novo external_id do item",
|
||||
"Manual field configuration using field_id or external_id as keys. Use this for advanced scenarios or when dynamic fields are not sufficient.": "Configuração manual de campo usando field_id ou external_id como chaves. Use isso para cenários avançados ou quando campos dinâmicos não forem suficientes.",
|
||||
"The list of attachments": "A lista de anexos",
|
||||
"The list of tags": "A lista de tags",
|
||||
"The linked account to use for meetings": "A conta vinculada a ser utilizada nas reuniões",
|
||||
"The reference of the item. Format: {\"type\": \"reference_type\", \"id\": reference_id}": "A referência do item. Formato: {\"type\": \"reference_type\", \"id\": reference_id}",
|
||||
"The description or text of the task": "A descrição ou o texto da tarefa",
|
||||
"Additional description for the task": "Descrição adicional para a tarefa",
|
||||
"Whether the task should be private (only creator, assignee and assignor can see it)": "Se a tarefa deve ser privada (somente criador, atribuído e atribuidor pode vê-la)",
|
||||
"Due date in local time (date only)": "Data de vencimento no horário local (apenas a data)",
|
||||
"Due time in local time (HH:MM:SS format, e.g., \"14:30:00\")": "Hora de vencimento no formato local (HH:MM:SS, por exemplo, \"14:30:00\")",
|
||||
"Complete due date and time in UTC. Alternative to separate date/time fields.": "Data e hora de vencimento em UTC. Alternativo para separar campos de data/hora.",
|
||||
"Select a Podio organization": "Selecione uma organização do Podio",
|
||||
"Select a Podio workspace": "Selecionar um espaço de trabalho do Podio",
|
||||
"The type of object to reference": "O tipo de objeto a fazer referência",
|
||||
"Select the specific object to reference": "Selecione o objeto específico para fazer referência",
|
||||
"Who is responsible for this task. Can be a user ID (number) or contact identifier object with type and id.": "Quem é responsável por esta tarefa. Pode ser um ID de usuário (número) ou um objeto de identificador de contato com tipo e id.",
|
||||
"List of file IDs to attach to this task": "Lista de IDs de arquivos para anexar a esta tarefa",
|
||||
"List of label names in text form": "Lista de nomes de etiquetas no formulário de texto",
|
||||
"List of label IDs (alternative to text labels)": "Lista de IDs de etiquetas (alternativas aos rótulos de texto)",
|
||||
"Reminder settings. Format: {\"remind_delta\": minutes_before_due_date}": "Configurações de lembretes. Formato: {\"remind_delta\": minutes_before_due_date}",
|
||||
"Recurring task settings. Format: {\"name\": \"weekly|monthly|yearly\", \"config\": {...}, \"step\": 1, \"until\": \"date\"}": "Configurações de tarefas recorrentes. Formato: {\"name\": \"weekly├mensal-mensal\", \"config\": {...}, \"step\": 1, \"until\": \"date\"}",
|
||||
"External system identifier for this task": "Identificador de sistema externo para esta tarefa",
|
||||
"Select a Podio task": "Selecionar uma tarefa do Podio",
|
||||
"The updated text (title) for the task": "O texto atualizado (título) da tarefa",
|
||||
"The updated description for the task": "A descrição atualizada para a tarefa",
|
||||
"The new due date for the task (in users timezone)": "Nova data limite para a tarefa (no fuso horário do usuário)",
|
||||
"The new due time for the task in local timezone (HH:MM:SS format, e.g., \"14:30:00\")": "O novo hora-limite para a tarefa no formato local de fuso horário (HH:MM:SS, por exemplo, \"14:30:00\")",
|
||||
"Mark the task as completed or not completed": "Marcar a tarefa como concluída ou não concluída",
|
||||
"The user ID of the person responsible for this task": "A ID do usuário da pessoa responsável por esta tarefa",
|
||||
"The labels for the task. Either a list of label ids or label texts": "As etiquetas para a tarefa. Ou uma lista de IDs de rótulo ou textos de rótulo",
|
||||
"The list of files that should be attached to the task": "Lista de arquivos que devem ser anexados à tarefa",
|
||||
"Optional reminder on this task. Format: {\"remind_delta\": minutes_before_due_date}. If empty, existing reminder is deleted.": "Lembrete opcional sobre esta tarefa. Formato: {\"remind_delta\": minues_before_due_date}. Se vazio, o lembrete existente será excluído.",
|
||||
"Select a file from the space": "Selecione um arquivo do espaço",
|
||||
"What type of object to attach the file to": "Que tipo de objeto para anexar o arquivo",
|
||||
"What type of object to comment on": "Que tipo de objeto deve comentar",
|
||||
"Select the specific object to comment on": "Selecione o objeto específico sobre o qual comentar",
|
||||
"The content of your comment": "O conteúdo do seu comentário",
|
||||
"Optional external identifier for the comment": "Identificador externo opcional para o comentário",
|
||||
"Select files from the space to attach to this comment (enter file IDs from the space)": "Selecione os arquivos do espaço para anexar a este comentário (insira as IDs de arquivos do espaço)",
|
||||
"ID of a previously created embedded link": "ID de um link incorporado criado anteriormente",
|
||||
"URL to embed in the comment": "URL para incorporar no comentário",
|
||||
"Automatically invite mentioned users to the workspace if they lack access": "Convidar automaticamente usuários para o espaço de trabalho caso não tenham acesso a eles",
|
||||
"What would you like to share?": "O que você gostaria de compartilhar?",
|
||||
"File IDs to attach to this status update (enter file IDs from the space)": "IDs de arquivos para anexar a essa atualização de status (insira os IDs de arquivos do espaço)",
|
||||
"URL to embed in the status update": "URL para incorporar na atualização de status",
|
||||
"Create a poll with your status. Format: {\"text\": \"Question?\", \"options\": [\"Option 1\", \"Option 2\"]}": "Crie uma enquete com seu status. Formato: {\"text\": \"Question?\", \"options\": [\"Opção 1\", \"Opção 2\"]}",
|
||||
"How to find the item": "Como encontrar o item",
|
||||
"The specific item ID to retrieve": "O ID do item específico para recuperar",
|
||||
"Mark any new notifications on this item as viewed": "Marcar qualquer nova notificação sobre este item como visualizado",
|
||||
"Filter criteria as JSON object. Use field external_id as keys.": "Filtrar critérios como objeto JSON. Use o campo external_id como chaves.",
|
||||
"Maximum number of results to return (1-500, default: 20)": "Número máximo de resultados a retornar (1-500, padrão: 20)",
|
||||
"Number of results to skip for pagination (default: 0)": "Número de resultados para pular para paginação (padrão: 0)",
|
||||
"Field to sort results by (e.g., \"created_on\", \"last_edit_on\")": "Campo para classificar resultados por (e.g., \"created_on\", \"last_edit_on\")",
|
||||
"Sort results in descending order": "Ordenar resultados por ordem decrescente",
|
||||
"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 Item": "Novo item",
|
||||
"New Task": "Nova tarefa",
|
||||
"New Status": "Novo status",
|
||||
"Item Updated": "Item Atualizado",
|
||||
"New App": "Novo aplicativo",
|
||||
"Member Added": "Membro adicionado",
|
||||
"Fires when a new item (record/entry) is created in an app": "Atira quando um novo item (registro/entrada) é criado em um aplicativo",
|
||||
"Fires when a new task is added to any workspace": "Atira quando uma nova tarefa é adicionada a qualquer área de trabalho",
|
||||
"Fires when a new status is created in a workspace stream": "Atira quando um novo status é criado em um fluxo de área de trabalho",
|
||||
"Fires when an existing item is updated (excluding comments)": "Atira quando um item existente é atualizado (excluindo comentários)",
|
||||
"Fires when a new app is created in a workspace": "Atira quando um novo aplicativo é criado em um espaço de trabalho",
|
||||
"Fires when a new member is added to a workspace": "Efetua quando um novo membro é adicionado a um espaço de trabalho"
|
||||
}
|
||||
@@ -0,0 +1,175 @@
|
||||
{
|
||||
"Podio": "Подио",
|
||||
"Connect your Podio account to automate workspace management and item operations.": "Подключите свой аккаунт в Podio для автоматизации управления проектом и операций с элементами.",
|
||||
"Create Item": "Создать элемент",
|
||||
"Update Item": "Обновить элемент",
|
||||
"Create Task": "Создать задачу",
|
||||
"Update Task": "Обновить задачу",
|
||||
"Attach File": "Прикрепить файл",
|
||||
"Create Comment": "Создать комментарий",
|
||||
"Create Status Update": "Создать статус обновления",
|
||||
"Find Item": "Найти предмет",
|
||||
"Find Task": "Найти задачу",
|
||||
"Custom API Call": "Пользовательский вызов API",
|
||||
"Create a new record in a Podio app with specified field values.": "Создать новую запись в приложении Podio с заданными значениями поля.",
|
||||
"Update an existing record in a Podio app with specified field values. Only provided fields will be updated.": "Обновление существующей записи в приложении Podio с заданными значениями поля. Только заполненные поля будут обновлены.",
|
||||
"Add a new task to an item or workspace with due dates, assignees, and attachments.": "Добавить новую задачу в элемент или рабочую область с установленными датами, назначениями и вложениями.",
|
||||
"Modify an existing task's details or status. Only specified fields will be updated.": "Изменение данных или статуса существующей задачи. Будут обновлены только указанные поля.",
|
||||
"Upload and attach a file to an item/task/comment.": "Загрузите и приложите файл к элементу/задачу/комментарию.",
|
||||
"Post a comment on an item or task.": "Оставить комментарий на элемент или задачу.",
|
||||
"Add a status to an item or workspace stream.": "Добавить статус в поток элемента или рабочей области.",
|
||||
"Retrieve a single item by ID or field value.": "Получить один элемент по идентификатору или значению поля.",
|
||||
"Retrieve a task by ID for further updates.": "Получить задачу по идентификатору для дальнейших обновлений.",
|
||||
"Make a custom API call to a specific endpoint": "Сделать пользовательский API вызов к определенной конечной точке",
|
||||
"Organization (Optional)": "Организация (необязательно)",
|
||||
"Space (Optional)": "Пространство (необязательно)",
|
||||
"App": "Приложение",
|
||||
"External ID": "Внешний ID",
|
||||
"App Fields": "Поля приложения",
|
||||
"Advanced: Custom Fields JSON": "Дополнительно: пользовательские поля JSON",
|
||||
"File IDs": "ID файла",
|
||||
"Tags": "Теги",
|
||||
"Reminder": "Напоминание",
|
||||
"Recurrence": "Повторение",
|
||||
"Linked Account ID": "ID привязанного аккаунта",
|
||||
"Reference": "Артикул",
|
||||
"Execute Hooks": "Выполнить хуки",
|
||||
"Silent Mode": "Беззвучный режим",
|
||||
"Item": "Пункт 1",
|
||||
"Revision": "Ревизия",
|
||||
"Legacy Fields (Advanced)": "Наследие Полей (Дополнительно)",
|
||||
"Task Text": "Текст задачи",
|
||||
"Description": "Описание",
|
||||
"Private": "Приватный",
|
||||
"Due Date": "Срок сдачи",
|
||||
"Due Time": "Время выполнения",
|
||||
"Due Date & Time (UTC)": "Срок и время (UTC)",
|
||||
"Organization": "Организация",
|
||||
"Space": "Пространство",
|
||||
"Reference Type": "Тип ссылки",
|
||||
"Reference Object": "Артикул объекта",
|
||||
"Responsible Person": "Ответственное лицо",
|
||||
"Labels (Text)": "Метки (Text)",
|
||||
"Label IDs": "ID метки",
|
||||
"Task": "Задача",
|
||||
"Text": "Текст",
|
||||
"Completed": "Выполнено",
|
||||
"Responsible User ID": "Ответственный ID пользователя",
|
||||
"Labels": "Метки",
|
||||
"File": "Файл",
|
||||
"Attach To": "Прикрепить к",
|
||||
"Comment On": "Комментарий на",
|
||||
"Object": "Объект",
|
||||
"Comment Text": "Текст комментария",
|
||||
"Attach Files": "Прикрепить файлы",
|
||||
"Embed ID": "ID вставки",
|
||||
"Embed URL": "Вставить URL",
|
||||
"Auto-Invite Mentioned Users": "Автоприглашение упоминаемых пользователей",
|
||||
"Status Message": "Сообщение о статусе",
|
||||
"Add Poll": "Добавить опрос",
|
||||
"Search Method": "Метод поиска",
|
||||
"Item ID": "Item ID",
|
||||
"Mark as Viewed": "Отметить как Просмотренные",
|
||||
"Search Filters": "Фильтры поиска",
|
||||
"Limit": "Лимит",
|
||||
"Offset": "Смещение",
|
||||
"Sort By": "Сортировать по",
|
||||
"Sort Descending": "Сортировать по убыванию",
|
||||
"Method": "Метод",
|
||||
"Headers": "Заголовки",
|
||||
"Query Parameters": "Параметры запроса",
|
||||
"Body": "Тело",
|
||||
"No Error on Failure": "Нет ошибок при ошибке",
|
||||
"Timeout (in seconds)": "Таймаут (в секундах)",
|
||||
"Select an organization to filter apps by workspace. Leave empty to see all apps.": "Выберите организацию для фильтрации приложений по рабочей области. Оставьте пустым, чтобы увидеть все приложения.",
|
||||
"Select a workspace to filter apps. Leave empty to see all apps in the organization.": "Выберите рабочую область для фильтрации приложений. Оставьте пустым, чтобы увидеть все приложения в организации.",
|
||||
"Select a Podio app": "Выберите приложение Podio",
|
||||
"The external id of the item. This can be used to hold a reference to the item in an external system.": "Внешний идентификатор предмета, который может быть использован для хранения ссылки на предмет во внешней системе.",
|
||||
"Configure values for the fields in the selected app": "Настройка значений полей в выбранном приложении",
|
||||
"Advanced: Use this for complex field configurations. Format: {\"field_id\": {\"value\": \"content\"}}. Only use if the dynamic fields above don't meet your needs.": "Дополнительно: Используйте это для сложных конфигураций полей. Формат: {\"field_id\": {\"value\": \"content\"}}. Используйте только если динамические поля выше не удовлетворяют вашим потребностям.",
|
||||
"Temporary files that have been uploaded and should be attached to this item": "Временные файлы, которые были загружены и должны быть прикреплены к этому элементу",
|
||||
"The tags to put on the item": "Теги для размещения элемента",
|
||||
"Optional reminder on this item. Format: {\"remind_delta\": minutes_before_due_date}": "Необязательное напоминание об этом предмете. Формат: {\"remind_delta\": minutes_before_due_date}",
|
||||
"The recurrence for the task, if any. Format: {\"name\": \"weekly|monthly|yearly\", \"config\": {...}, \"step\": 1, \"until\": \"date\"}": "Повторение задания, если еженедельно. Формат: {\"name\": \"Еженедельно|ежемесячно|ежегодно\", \"config\": {...}, \"шаг\": 1, \"until\": \"date\"}",
|
||||
"The linked account to use for the meeting": "Связанный счет для использования для совещания",
|
||||
"The reference for the new item, if any. Format: {\"type\": \"item\", \"id\": reference_id}": "Ссылка на новый элемент, если есть. Формат: {\"type\": \"item\", \"id\": reference_id}",
|
||||
"If false, webhooks and integrations will not be triggered for this operation": "Если false, веб-хуки и интеграция не будут срабатывать для этой операции",
|
||||
"If true, notifications will not be triggered and the object will not appear in activity streams": "Если включено, уведомления не будут запускаться и объект не будет отображаться в потоках активности",
|
||||
"Select a Podio item": "Выберите элемент Podio",
|
||||
"Configure values for the fields you want to update in the selected app": "Настройте значения для полей, которые вы хотите обновить в выбранном приложении",
|
||||
"The revision of the item that is being updated. Optional for conflict detection.": "Пересмотр элемента, который обновляется. Опционально для обнаружения конфликтов.",
|
||||
"The new external_id of the item": "Новый внешний идентификатор предмета",
|
||||
"Manual field configuration using field_id or external_id as keys. Use this for advanced scenarios or when dynamic fields are not sufficient.": "Настройка полей вручную с использованием field_id или external_id в качестве ключей. Используйте это для дополнительных сценариев или когда динамических полей недостаточно.",
|
||||
"The list of attachments": "Список вложений",
|
||||
"The list of tags": "Список тегов",
|
||||
"The linked account to use for meetings": "Связанный счет для использования на совещаниях",
|
||||
"The reference of the item. Format: {\"type\": \"reference_type\", \"id\": reference_id}": "Ссылка на элемент. Формат: {\"type\": \"reference_type\", \"id\": reference_id}",
|
||||
"The description or text of the task": "Описание или текст задачи",
|
||||
"Additional description for the task": "Дополнительное описание задачи",
|
||||
"Whether the task should be private (only creator, assignee and assignor can see it)": "Должна ли задача быть приватной (только создатель, правопреемник и назначатель может ее видеть)",
|
||||
"Due date in local time (date only)": "Дата выполнения в локальное время (только дата)",
|
||||
"Due time in local time (HH:MM:SS format, e.g., \"14:30:00\")": "Время выполнения в локальное время (формат HH:MM:SS, например, \"14:30:00\")",
|
||||
"Complete due date and time in UTC. Alternative to separate date/time fields.": "Заполните срок и время в UTC. Или разделите поля даты/времени.",
|
||||
"Select a Podio organization": "Выберите организацию Podio",
|
||||
"Select a Podio workspace": "Выберите рабочую область Podio",
|
||||
"The type of object to reference": "Тип ссылаемого объекта",
|
||||
"Select the specific object to reference": "Выберите конкретный объект для ссылки",
|
||||
"Who is responsible for this task. Can be a user ID (number) or contact identifier object with type and id.": "Кто несет ответственность за эту задачу. Может быть ID пользователя (номер) или объект идентификатора контакта с типом и идентификатором.",
|
||||
"List of file IDs to attach to this task": "Список идентификаторов файла для прикрепления к этой задаче",
|
||||
"List of label names in text form": "Список имен меток в текстовой форме",
|
||||
"List of label IDs (alternative to text labels)": "Список идентификаторов меток (альтернатива текстовым меткам)",
|
||||
"Reminder settings. Format: {\"remind_delta\": minutes_before_due_date}": "Напоминание. Формат: {\"remind_delta\": minutes_before_due_date}",
|
||||
"Recurring task settings. Format: {\"name\": \"weekly|monthly|yearly\", \"config\": {...}, \"step\": 1, \"until\": \"date\"}": "Настройки повторяющихся задач. Формат: {\"name\": \"еженедельно|ежемесячно|ежегодно\", \"config\": {...}, \"шаг\": 1, \"до\" \": \"date\"}",
|
||||
"External system identifier for this task": "Идентификатор внешней системы для этой задачи",
|
||||
"Select a Podio task": "Выберите задание Podio",
|
||||
"The updated text (title) for the task": "Обновленный текст (название) задачи",
|
||||
"The updated description for the task": "Обновленное описание задачи",
|
||||
"The new due date for the task (in users timezone)": "Новая дата выполнения задачи (в часовом поясе пользователя)",
|
||||
"The new due time for the task in local timezone (HH:MM:SS format, e.g., \"14:30:00\")": "Новое время выполнения задачи в локальном часовом поясе (формат HH:MM:SS, например, \"14:30:00\")",
|
||||
"Mark the task as completed or not completed": "Отметить задачу как выполненную или не выполненную",
|
||||
"The user ID of the person responsible for this task": "ID пользователя человека, ответственного за эту задачу",
|
||||
"The labels for the task. Either a list of label ids or label texts": "Метки для задачи. Либо список идентификаторов ярлыков или текстов метки",
|
||||
"The list of files that should be attached to the task": "Список файлов, которые должны быть прикреплены к задаче",
|
||||
"Optional reminder on this task. Format: {\"remind_delta\": minutes_before_due_date}. If empty, existing reminder is deleted.": "Необязательное напоминание об этой задаче. Формат: {\"remind_delta\": minutes_before_due_date}. Если пусто, то имеющееся напоминание удалено.",
|
||||
"Select a file from the space": "Выберите файл из сообщества",
|
||||
"What type of object to attach the file to": "Какой тип объекта прикрепить к файлу",
|
||||
"What type of object to comment on": "Тип объекта для комментирования",
|
||||
"Select the specific object to comment on": "Выберите конкретный объект для комментирования",
|
||||
"The content of your comment": "Содержание вашего комментария",
|
||||
"Optional external identifier for the comment": "Необязательный внешний идентификатор для комментария",
|
||||
"Select files from the space to attach to this comment (enter file IDs from the space)": "Выберите файлы из области, чтобы прикрепить к этому комментарию (введите ID файла из сообщества)",
|
||||
"ID of a previously created embedded link": "ID ранее созданной ссылки",
|
||||
"URL to embed in the comment": "URL для вставки в комментарий",
|
||||
"Automatically invite mentioned users to the workspace if they lack access": "Автоматически приглашать указанных пользователей в рабочую область, если у них нет доступа",
|
||||
"What would you like to share?": "Что бы вы хотели поделиться?",
|
||||
"File IDs to attach to this status update (enter file IDs from the space)": "ID файла для прикрепления к этому статусу обновления (введите ID файла из сообщества)",
|
||||
"URL to embed in the status update": "URL для вставки в статус обновления",
|
||||
"Create a poll with your status. Format: {\"text\": \"Question?\", \"options\": [\"Option 1\", \"Option 2\"]}": "Создайте опрос с с вашим статусом. Формат: {\"text\": \"Вопрос?\", \"options\": [\"Option 1\", \"Option 2\"]}",
|
||||
"How to find the item": "Как найти предмет",
|
||||
"The specific item ID to retrieve": "Идентификатор конкретного элемента для извлечения",
|
||||
"Mark any new notifications on this item as viewed": "Отметить любые новые уведомления об этом элементе, как просмотрено",
|
||||
"Filter criteria as JSON object. Use field external_id as keys.": "Фильтровать критерии как объект JSON. Использовать поле external_id как ключи.",
|
||||
"Maximum number of results to return (1-500, default: 20)": "Максимальное количество результатов (1-500, по умолчанию: 20)",
|
||||
"Number of results to skip for pagination (default: 0)": "Количество пропущенных результатов для пагинации (по умолчанию: 0)",
|
||||
"Field to sort results by (e.g., \"created_on\", \"last_edit_on\")": "Сортировка результатов по полю (например, \"created_on\", \"last_edit_on\")",
|
||||
"Sort results in descending order": "Сортировать результаты в порядке убывания",
|
||||
"Authorization headers are injected automatically from your connection.": "Заголовки авторизации включаются автоматически из вашего соединения.",
|
||||
"GET": "ПОЛУЧИТЬ",
|
||||
"POST": "ПОСТ",
|
||||
"PATCH": "ПАТЧ",
|
||||
"PUT": "ПОКУПИТЬ",
|
||||
"DELETE": "УДАЛИТЬ",
|
||||
"HEAD": "HEAD",
|
||||
"New Item": "Новый элемент",
|
||||
"New Task": "Новая задача",
|
||||
"New Status": "Новый статус",
|
||||
"Item Updated": "Элемент обновлен",
|
||||
"New App": "Новое приложение",
|
||||
"Member Added": "Участник добавлен",
|
||||
"Fires when a new item (record/entry) is created in an app": "Вызывает создание нового элемента (записи/записи) в приложении",
|
||||
"Fires when a new task is added to any workspace": "Стреляет при добавлении новой задачи в любую рабочую область",
|
||||
"Fires when a new status is created in a workspace stream": "Вызывает создание нового статуса в потоке рабочей области",
|
||||
"Fires when an existing item is updated (excluding comments)": "Возникает при обновлении существующего элемента (за исключением комментариев)",
|
||||
"Fires when a new app is created in a workspace": "Застреляет при создании нового приложения в проекте",
|
||||
"Fires when a new member is added to a workspace": "Застреляет при добавлении нового участника в рабочую область"
|
||||
}
|
||||
@@ -0,0 +1,176 @@
|
||||
{
|
||||
"Connect your Podio account to automate workspace management and item operations.": "Connect your Podio account to automate workspace management and item operations.",
|
||||
"Create Item": "Create Item",
|
||||
"Update Item": "Update Item",
|
||||
"Create Task": "Create Task",
|
||||
"Update Task": "Update Task",
|
||||
"Attach File": "Attach File",
|
||||
"Create Comment": "Create Comment",
|
||||
"Create Status Update": "Create Status Update",
|
||||
"Find Item": "Find Item",
|
||||
"Find Task": "Find Task",
|
||||
"Custom API Call": "Custom API Call",
|
||||
"Create a new record in a Podio app with specified field values.": "Create a new record in a Podio app with specified field values.",
|
||||
"Update an existing record in a Podio app with specified field values. Only provided fields will be updated.": "Update an existing record in a Podio app with specified field values. Only provided fields will be updated.",
|
||||
"Add a new task to an item or workspace with due dates, assignees, and attachments.": "Add a new task to an item or workspace with due dates, assignees, and attachments.",
|
||||
"Modify an existing task's details or status. Only specified fields will be updated.": "Modify an existing task's details or status. Only specified fields will be updated.",
|
||||
"Upload and attach a file to an item/task/comment.": "Upload and attach a file to an item/task/comment.",
|
||||
"Post a comment on an item or task.": "Post a comment on an item or task.",
|
||||
"Add a status to an item or workspace stream.": "Add a status to an item or workspace stream.",
|
||||
"Retrieve a single item by ID or field value.": "Retrieve a single item by ID or field value.",
|
||||
"Retrieve a task by ID for further updates.": "Retrieve a task by ID for further updates.",
|
||||
"Make a custom API call to a specific endpoint": "Make a custom API call to a specific endpoint",
|
||||
"Organization (Optional)": "Organization (Optional)",
|
||||
"Space (Optional)": "Space (Optional)",
|
||||
"App": "App",
|
||||
"External ID": "External ID",
|
||||
"App Fields": "App Fields",
|
||||
"Advanced: Custom Fields JSON": "Advanced: Custom Fields JSON",
|
||||
"File IDs": "File IDs",
|
||||
"Tags": "Tags",
|
||||
"Reminder": "Reminder",
|
||||
"Recurrence": "Recurrence",
|
||||
"Linked Account ID": "Linked Account ID",
|
||||
"Reference": "Reference",
|
||||
"Execute Hooks": "Execute Hooks",
|
||||
"Silent Mode": "Silent Mode",
|
||||
"Item": "Item",
|
||||
"Revision": "Revision",
|
||||
"Legacy Fields (Advanced)": "Legacy Fields (Advanced)",
|
||||
"Task Text": "Task Text",
|
||||
"Description": "Description",
|
||||
"Private": "Private",
|
||||
"Due Date": "Due Date",
|
||||
"Due Time": "Due Time",
|
||||
"Due Date & Time (UTC)": "Due Date & Time (UTC)",
|
||||
"Organization": "Organization",
|
||||
"Space": "Space",
|
||||
"Reference Type": "Reference Type",
|
||||
"Reference Object": "Reference Object",
|
||||
"Responsible Person": "Responsible Person",
|
||||
"Labels (Text)": "Labels (Text)",
|
||||
"Label IDs": "Label IDs",
|
||||
"Task": "Task",
|
||||
"Text": "Text",
|
||||
"Completed": "Completed",
|
||||
"Responsible User ID": "Responsible User ID",
|
||||
"Labels": "Labels",
|
||||
"File": "File",
|
||||
"Attach To": "Attach To",
|
||||
"Comment On": "Comment On",
|
||||
"Object": "Object",
|
||||
"Comment Text": "Comment Text",
|
||||
"Attach Files": "Attach Files",
|
||||
"Embed ID": "Embed ID",
|
||||
"Embed URL": "Embed URL",
|
||||
"Auto-Invite Mentioned Users": "Auto-Invite Mentioned Users",
|
||||
"Status Message": "Status Message",
|
||||
"Add Poll": "Add Poll",
|
||||
"Search Method": "Search Method",
|
||||
"Item ID": "Item ID",
|
||||
"Mark as Viewed": "Mark as Viewed",
|
||||
"Search Filters": "Search Filters",
|
||||
"Limit": "Limit",
|
||||
"Offset": "Offset",
|
||||
"Sort By": "Sort By",
|
||||
"Sort Descending": "Sort Descending",
|
||||
"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)",
|
||||
"Select an organization to filter apps by workspace. Leave empty to see all apps.": "Select an organization to filter apps by workspace. Leave empty to see all apps.",
|
||||
"Select a workspace to filter apps. Leave empty to see all apps in the organization.": "Select a workspace to filter apps. Leave empty to see all apps in the organization.",
|
||||
"Select a Podio app": "Select a Podio app",
|
||||
"The external id of the item. This can be used to hold a reference to the item in an external system.": "The external id of the item. This can be used to hold a reference to the item in an external system.",
|
||||
"Configure values for the fields in the selected app": "Configure values for the fields in the selected app",
|
||||
"Advanced: Use this for complex field configurations. Format: {\"field_id\": {\"value\": \"content\"}}. Only use if the dynamic fields above don't meet your needs.": "Advanced: Use this for complex field configurations. Format: {\"field_id\": {\"value\": \"content\"}}. Only use if the dynamic fields above don't meet your needs.",
|
||||
"Temporary files that have been uploaded and should be attached to this item": "Temporary files that have been uploaded and should be attached to this item",
|
||||
"The tags to put on the item": "The tags to put on the item",
|
||||
"Optional reminder on this item. Format: {\"remind_delta\": minutes_before_due_date}": "Optional reminder on this item. Format: {\"remind_delta\": minutes_before_due_date}",
|
||||
"The recurrence for the task, if any. Format: {\"name\": \"weekly|monthly|yearly\", \"config\": {...}, \"step\": 1, \"until\": \"date\"}": "The recurrence for the task, if any. Format: {\"name\": \"weekly|monthly|yearly\", \"config\": {...}, \"step\": 1, \"until\": \"date\"}",
|
||||
"The linked account to use for the meeting": "The linked account to use for the meeting",
|
||||
"The reference for the new item, if any. Format: {\"type\": \"item\", \"id\": reference_id}": "The reference for the new item, if any. Format: {\"type\": \"item\", \"id\": reference_id}",
|
||||
"If false, webhooks and integrations will not be triggered for this operation": "If false, webhooks and integrations will not be triggered for this operation",
|
||||
"If true, notifications will not be triggered and the object will not appear in activity streams": "If true, notifications will not be triggered and the object will not appear in activity streams",
|
||||
"Select a Podio item": "Select a Podio item",
|
||||
"Configure values for the fields you want to update in the selected app": "Configure values for the fields you want to update in the selected app",
|
||||
"The revision of the item that is being updated. Optional for conflict detection.": "The revision of the item that is being updated. Optional for conflict detection.",
|
||||
"The new external_id of the item": "The new external_id of the item",
|
||||
"Manual field configuration using field_id or external_id as keys. Use this for advanced scenarios or when dynamic fields are not sufficient.": "Manual field configuration using field_id or external_id as keys. Use this for advanced scenarios or when dynamic fields are not sufficient.",
|
||||
"The list of attachments": "The list of attachments",
|
||||
"The list of tags": "The list of tags",
|
||||
"The linked account to use for meetings": "The linked account to use for meetings",
|
||||
"The reference of the item. Format: {\"type\": \"reference_type\", \"id\": reference_id}": "The reference of the item. Format: {\"type\": \"reference_type\", \"id\": reference_id}",
|
||||
"The description or text of the task": "The description or text of the task",
|
||||
"Additional description for the task": "Additional description for the task",
|
||||
"Whether the task should be private (only creator, assignee and assignor can see it)": "Whether the task should be private (only creator, assignee and assignor can see it)",
|
||||
"Due date in local time (date only)": "Due date in local time (date only)",
|
||||
"Due time in local time (HH:MM:SS format, e.g., \"14:30:00\")": "Due time in local time (HH:MM:SS format, e.g., \"14:30:00\")",
|
||||
"Complete due date and time in UTC. Alternative to separate date/time fields.": "Complete due date and time in UTC. Alternative to separate date/time fields.",
|
||||
"Select a Podio organization": "Select a Podio organization",
|
||||
"Select a Podio workspace": "Select a Podio workspace",
|
||||
"The type of object to reference": "The type of object to reference",
|
||||
"Select the specific object to reference": "Select the specific object to reference",
|
||||
"Who is responsible for this task. Can be a user ID (number) or contact identifier object with type and id.": "Who is responsible for this task. Can be a user ID (number) or contact identifier object with type and id.",
|
||||
"List of file IDs to attach to this task": "List of file IDs to attach to this task",
|
||||
"List of label names in text form": "List of label names in text form",
|
||||
"List of label IDs (alternative to text labels)": "List of label IDs (alternative to text labels)",
|
||||
"Reminder settings. Format: {\"remind_delta\": minutes_before_due_date}": "Reminder settings. Format: {\"remind_delta\": minutes_before_due_date}",
|
||||
"Recurring task settings. Format: {\"name\": \"weekly|monthly|yearly\", \"config\": {...}, \"step\": 1, \"until\": \"date\"}": "Recurring task settings. Format: {\"name\": \"weekly|monthly|yearly\", \"config\": {...}, \"step\": 1, \"until\": \"date\"}",
|
||||
"External system identifier for this task": "External system identifier for this task",
|
||||
"Select a Podio task": "Select a Podio task",
|
||||
"The updated text (title) for the task": "The updated text (title) for the task",
|
||||
"The updated description for the task": "The updated description for the task",
|
||||
"The new due date for the task (in users timezone)": "The new due date for the task (in users timezone)",
|
||||
"The new due time for the task in local timezone (HH:MM:SS format, e.g., \"14:30:00\")": "The new due time for the task in local timezone (HH:MM:SS format, e.g., \"14:30:00\")",
|
||||
"Mark the task as completed or not completed": "Mark the task as completed or not completed",
|
||||
"The user ID of the person responsible for this task": "The user ID of the person responsible for this task",
|
||||
"The labels for the task. Either a list of label ids or label texts": "The labels for the task. Either a list of label ids or label texts",
|
||||
"The list of files that should be attached to the task": "The list of files that should be attached to the task",
|
||||
"Optional reminder on this task. Format: {\"remind_delta\": minutes_before_due_date}. If empty, existing reminder is deleted.": "Optional reminder on this task. Format: {\"remind_delta\": minutes_before_due_date}. If empty, existing reminder is deleted.",
|
||||
"Select a file from the space": "Select a file from the space",
|
||||
"What type of object to attach the file to": "What type of object to attach the file to",
|
||||
"What type of object to comment on": "What type of object to comment on",
|
||||
"Select the specific object to comment on": "Select the specific object to comment on",
|
||||
"The content of your comment": "The content of your comment",
|
||||
"Optional external identifier for the comment": "Optional external identifier for the comment",
|
||||
"Select files from the space to attach to this comment (enter file IDs from the space)": "Select files from the space to attach to this comment (enter file IDs from the space)",
|
||||
"ID of a previously created embedded link": "ID of a previously created embedded link",
|
||||
"URL to embed in the comment": "URL to embed in the comment",
|
||||
"Automatically invite mentioned users to the workspace if they lack access": "Automatically invite mentioned users to the workspace if they lack access",
|
||||
"What would you like to share?": "What would you like to share?",
|
||||
"File IDs to attach to this status update (enter file IDs from the space)": "File IDs to attach to this status update (enter file IDs from the space)",
|
||||
"URL to embed in the status update": "URL to embed in the status update",
|
||||
"Create a poll with your status. Format: {\"text\": \"Question?\", \"options\": [\"Option 1\", \"Option 2\"]}": "Create a poll with your status. Format: {\"text\": \"Question?\", \"options\": [\"Option 1\", \"Option 2\"]}",
|
||||
"How to find the item": "How to find the item",
|
||||
"The specific item ID to retrieve": "The specific item ID to retrieve",
|
||||
"Mark any new notifications on this item as viewed": "Mark any new notifications on this item as viewed",
|
||||
"Filter criteria as JSON object. Use field external_id as keys.": "Filter criteria as JSON object. Use field external_id as keys.",
|
||||
"Maximum number of results to return (1-500, default: 20)": "Maximum number of results to return (1-500, default: 20)",
|
||||
"Number of results to skip for pagination (default: 0)": "Number of results to skip for pagination (default: 0)",
|
||||
"Field to sort results by (e.g., \"created_on\", \"last_edit_on\")": "Field to sort results by (e.g., \"created_on\", \"last_edit_on\")",
|
||||
"Sort results in descending order": "Sort results in descending order",
|
||||
"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 Item": "New Item",
|
||||
"New Task": "New Task",
|
||||
"New Status": "New Status",
|
||||
"Item Updated": "Item Updated",
|
||||
"New App": "New App",
|
||||
"Member Added": "Member Added",
|
||||
"Fires when a new item (record/entry) is created in an app": "Fires when a new item (record/entry) is created in an app",
|
||||
"Fires when a new task is added to any workspace": "Fires when a new task is added to any workspace",
|
||||
"Fires when a new status is created in a workspace stream": "Fires when a new status is created in a workspace stream",
|
||||
"Fires when an existing item is updated (excluding comments)": "Fires when an existing item is updated (excluding comments)",
|
||||
"Fires when a new app is created in a workspace": "Fires when a new app is created in a workspace",
|
||||
"Fires when a new member is added to a workspace": "Fires when a new member is added to a workspace"
|
||||
}
|
||||
@@ -0,0 +1,175 @@
|
||||
{
|
||||
"Podio": "Podio",
|
||||
"Connect your Podio account to automate workspace management and item operations.": "Connect your Podio account to automate workspace management and item operations.",
|
||||
"Create Item": "Create Item",
|
||||
"Update Item": "Update Item",
|
||||
"Create Task": "Create Task",
|
||||
"Update Task": "Update Task",
|
||||
"Attach File": "Attach File",
|
||||
"Create Comment": "Create Comment",
|
||||
"Create Status Update": "Create Status Update",
|
||||
"Find Item": "Find Item",
|
||||
"Find Task": "Find Task",
|
||||
"Custom API Call": "Custom API Call",
|
||||
"Create a new record in a Podio app with specified field values.": "Create a new record in a Podio app with specified field values.",
|
||||
"Update an existing record in a Podio app with specified field values. Only provided fields will be updated.": "Update an existing record in a Podio app with specified field values. Only provided fields will be updated.",
|
||||
"Add a new task to an item or workspace with due dates, assignees, and attachments.": "Add a new task to an item or workspace with due dates, assignees, and attachments.",
|
||||
"Modify an existing task's details or status. Only specified fields will be updated.": "Modify an existing task's details or status. Only specified fields will be updated.",
|
||||
"Upload and attach a file to an item/task/comment.": "Upload and attach a file to an item/task/comment.",
|
||||
"Post a comment on an item or task.": "Post a comment on an item or task.",
|
||||
"Add a status to an item or workspace stream.": "Add a status to an item or workspace stream.",
|
||||
"Retrieve a single item by ID or field value.": "Retrieve a single item by ID or field value.",
|
||||
"Retrieve a task by ID for further updates.": "Retrieve a task by ID for further updates.",
|
||||
"Make a custom API call to a specific endpoint": "Make a custom API call to a specific endpoint",
|
||||
"Organization (Optional)": "Organization (Optional)",
|
||||
"Space (Optional)": "Space (Optional)",
|
||||
"App": "App",
|
||||
"External ID": "External ID",
|
||||
"App Fields": "App Fields",
|
||||
"Advanced: Custom Fields JSON": "Advanced: Custom Fields JSON",
|
||||
"File IDs": "File IDs",
|
||||
"Tags": "Tags",
|
||||
"Reminder": "Reminder",
|
||||
"Recurrence": "Recurrence",
|
||||
"Linked Account ID": "Linked Account ID",
|
||||
"Reference": "Reference",
|
||||
"Execute Hooks": "Execute Hooks",
|
||||
"Silent Mode": "Silent Mode",
|
||||
"Item": "Item",
|
||||
"Revision": "Revision",
|
||||
"Legacy Fields (Advanced)": "Legacy Fields (Advanced)",
|
||||
"Task Text": "Task Text",
|
||||
"Description": "Description",
|
||||
"Private": "Private",
|
||||
"Due Date": "Due Date",
|
||||
"Due Time": "Due Time",
|
||||
"Due Date & Time (UTC)": "Due Date & Time (UTC)",
|
||||
"Organization": "Organization",
|
||||
"Space": "Space",
|
||||
"Reference Type": "Reference Type",
|
||||
"Reference Object": "Reference Object",
|
||||
"Responsible Person": "Responsible Person",
|
||||
"Labels (Text)": "Labels (Text)",
|
||||
"Label IDs": "Label IDs",
|
||||
"Task": "Task",
|
||||
"Text": "Text",
|
||||
"Completed": "Completed",
|
||||
"Responsible User ID": "Responsible User ID",
|
||||
"Labels": "Labels",
|
||||
"File": "File",
|
||||
"Attach To": "Attach To",
|
||||
"Comment On": "Comment On",
|
||||
"Object": "Object",
|
||||
"Comment Text": "Comment Text",
|
||||
"Attach Files": "Attach Files",
|
||||
"Embed ID": "Embed ID",
|
||||
"Embed URL": "Embed URL",
|
||||
"Auto-Invite Mentioned Users": "Auto-Invite Mentioned Users",
|
||||
"Status Message": "Status Message",
|
||||
"Add Poll": "Add Poll",
|
||||
"Search Method": "Search Method",
|
||||
"Item ID": "Item ID",
|
||||
"Mark as Viewed": "Mark as Viewed",
|
||||
"Search Filters": "Search Filters",
|
||||
"Limit": "Limit",
|
||||
"Offset": "Offset",
|
||||
"Sort By": "Sort By",
|
||||
"Sort Descending": "Sort Descending",
|
||||
"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 an organization to filter apps by workspace. Leave empty to see all apps.": "Select an organization to filter apps by workspace. Leave empty to see all apps.",
|
||||
"Select a workspace to filter apps. Leave empty to see all apps in the organization.": "Select a workspace to filter apps. Leave empty to see all apps in the organization.",
|
||||
"Select a Podio app": "Select a Podio app",
|
||||
"The external id of the item. This can be used to hold a reference to the item in an external system.": "The external id of the item. This can be used to hold a reference to the item in an external system.",
|
||||
"Configure values for the fields in the selected app": "Configure values for the fields in the selected app",
|
||||
"Advanced: Use this for complex field configurations. Format: {\"field_id\": {\"value\": \"content\"}}. Only use if the dynamic fields above don't meet your needs.": "Advanced: Use this for complex field configurations. Format: {\"field_id\": {\"value\": \"content\"}}. Only use if the dynamic fields above don't meet your needs.",
|
||||
"Temporary files that have been uploaded and should be attached to this item": "Temporary files that have been uploaded and should be attached to this item",
|
||||
"The tags to put on the item": "The tags to put on the item",
|
||||
"Optional reminder on this item. Format: {\"remind_delta\": minutes_before_due_date}": "Optional reminder on this item. Format: {\"remind_delta\": minutes_before_due_date}",
|
||||
"The recurrence for the task, if any. Format: {\"name\": \"weekly|monthly|yearly\", \"config\": {...}, \"step\": 1, \"until\": \"date\"}": "The recurrence for the task, if any. Format: {\"name\": \"weekly|monthly|yearly\", \"config\": {...}, \"step\": 1, \"until\": \"date\"}",
|
||||
"The linked account to use for the meeting": "The linked account to use for the meeting",
|
||||
"The reference for the new item, if any. Format: {\"type\": \"item\", \"id\": reference_id}": "The reference for the new item, if any. Format: {\"type\": \"item\", \"id\": reference_id}",
|
||||
"If false, webhooks and integrations will not be triggered for this operation": "If false, webhooks and integrations will not be triggered for this operation",
|
||||
"If true, notifications will not be triggered and the object will not appear in activity streams": "If true, notifications will not be triggered and the object will not appear in activity streams",
|
||||
"Select a Podio item": "Select a Podio item",
|
||||
"Configure values for the fields you want to update in the selected app": "Configure values for the fields you want to update in the selected app",
|
||||
"The revision of the item that is being updated. Optional for conflict detection.": "The revision of the item that is being updated. Optional for conflict detection.",
|
||||
"The new external_id of the item": "The new external_id of the item",
|
||||
"Manual field configuration using field_id or external_id as keys. Use this for advanced scenarios or when dynamic fields are not sufficient.": "Manual field configuration using field_id or external_id as keys. Use this for advanced scenarios or when dynamic fields are not sufficient.",
|
||||
"The list of attachments": "The list of attachments",
|
||||
"The list of tags": "The list of tags",
|
||||
"The linked account to use for meetings": "The linked account to use for meetings",
|
||||
"The reference of the item. Format: {\"type\": \"reference_type\", \"id\": reference_id}": "The reference of the item. Format: {\"type\": \"reference_type\", \"id\": reference_id}",
|
||||
"The description or text of the task": "The description or text of the task",
|
||||
"Additional description for the task": "Additional description for the task",
|
||||
"Whether the task should be private (only creator, assignee and assignor can see it)": "Whether the task should be private (only creator, assignee and assignor can see it)",
|
||||
"Due date in local time (date only)": "Due date in local time (date only)",
|
||||
"Due time in local time (HH:MM:SS format, e.g., \"14:30:00\")": "Due time in local time (HH:MM:SS format, e.g., \"14:30:00\")",
|
||||
"Complete due date and time in UTC. Alternative to separate date/time fields.": "Complete due date and time in UTC. Alternative to separate date/time fields.",
|
||||
"Select a Podio organization": "Select a Podio organization",
|
||||
"Select a Podio workspace": "Select a Podio workspace",
|
||||
"The type of object to reference": "The type of object to reference",
|
||||
"Select the specific object to reference": "Select the specific object to reference",
|
||||
"Who is responsible for this task. Can be a user ID (number) or contact identifier object with type and id.": "Who is responsible for this task. Can be a user ID (number) or contact identifier object with type and id.",
|
||||
"List of file IDs to attach to this task": "List of file IDs to attach to this task",
|
||||
"List of label names in text form": "List of label names in text form",
|
||||
"List of label IDs (alternative to text labels)": "List of label IDs (alternative to text labels)",
|
||||
"Reminder settings. Format: {\"remind_delta\": minutes_before_due_date}": "Reminder settings. Format: {\"remind_delta\": minutes_before_due_date}",
|
||||
"Recurring task settings. Format: {\"name\": \"weekly|monthly|yearly\", \"config\": {...}, \"step\": 1, \"until\": \"date\"}": "Recurring task settings. Format: {\"name\": \"weekly|monthly|yearly\", \"config\": {...}, \"step\": 1, \"until\": \"date\"}",
|
||||
"External system identifier for this task": "External system identifier for this task",
|
||||
"Select a Podio task": "Select a Podio task",
|
||||
"The updated text (title) for the task": "The updated text (title) for the task",
|
||||
"The updated description for the task": "The updated description for the task",
|
||||
"The new due date for the task (in users timezone)": "The new due date for the task (in users timezone)",
|
||||
"The new due time for the task in local timezone (HH:MM:SS format, e.g., \"14:30:00\")": "The new due time for the task in local timezone (HH:MM:SS format, e.g., \"14:30:00\")",
|
||||
"Mark the task as completed or not completed": "Mark the task as completed or not completed",
|
||||
"The user ID of the person responsible for this task": "The user ID of the person responsible for this task",
|
||||
"The labels for the task. Either a list of label ids or label texts": "The labels for the task. Either a list of label ids or label texts",
|
||||
"The list of files that should be attached to the task": "The list of files that should be attached to the task",
|
||||
"Optional reminder on this task. Format: {\"remind_delta\": minutes_before_due_date}. If empty, existing reminder is deleted.": "Optional reminder on this task. Format: {\"remind_delta\": minutes_before_due_date}. If empty, existing reminder is deleted.",
|
||||
"Select a file from the space": "Select a file from the space",
|
||||
"What type of object to attach the file to": "What type of object to attach the file to",
|
||||
"What type of object to comment on": "What type of object to comment on",
|
||||
"Select the specific object to comment on": "Select the specific object to comment on",
|
||||
"The content of your comment": "The content of your comment",
|
||||
"Optional external identifier for the comment": "Optional external identifier for the comment",
|
||||
"Select files from the space to attach to this comment (enter file IDs from the space)": "Select files from the space to attach to this comment (enter file IDs from the space)",
|
||||
"ID of a previously created embedded link": "ID of a previously created embedded link",
|
||||
"URL to embed in the comment": "URL to embed in the comment",
|
||||
"Automatically invite mentioned users to the workspace if they lack access": "Automatically invite mentioned users to the workspace if they lack access",
|
||||
"What would you like to share?": "What would you like to share?",
|
||||
"File IDs to attach to this status update (enter file IDs from the space)": "File IDs to attach to this status update (enter file IDs from the space)",
|
||||
"URL to embed in the status update": "URL to embed in the status update",
|
||||
"Create a poll with your status. Format: {\"text\": \"Question?\", \"options\": [\"Option 1\", \"Option 2\"]}": "Create a poll with your status. Format: {\"text\": \"Question?\", \"options\": [\"Option 1\", \"Option 2\"]}",
|
||||
"How to find the item": "How to find the item",
|
||||
"The specific item ID to retrieve": "The specific item ID to retrieve",
|
||||
"Mark any new notifications on this item as viewed": "Mark any new notifications on this item as viewed",
|
||||
"Filter criteria as JSON object. Use field external_id as keys.": "Filter criteria as JSON object. Use field external_id as keys.",
|
||||
"Maximum number of results to return (1-500, default: 20)": "Maximum number of results to return (1-500, default: 20)",
|
||||
"Number of results to skip for pagination (default: 0)": "Number of results to skip for pagination (default: 0)",
|
||||
"Field to sort results by (e.g., \"created_on\", \"last_edit_on\")": "Field to sort results by (e.g., \"created_on\", \"last_edit_on\")",
|
||||
"Sort results in descending order": "Sort results in descending order",
|
||||
"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 Item": "New Item",
|
||||
"New Task": "New Task",
|
||||
"New Status": "New Status",
|
||||
"Item Updated": "Item Updated",
|
||||
"New App": "New App",
|
||||
"Member Added": "Member Added",
|
||||
"Fires when a new item (record/entry) is created in an app": "Fires when a new item (record/entry) is created in an app",
|
||||
"Fires when a new task is added to any workspace": "Fires when a new task is added to any workspace",
|
||||
"Fires when a new status is created in a workspace stream": "Fires when a new status is created in a workspace stream",
|
||||
"Fires when an existing item is updated (excluding comments)": "Fires when an existing item is updated (excluding comments)",
|
||||
"Fires when a new app is created in a workspace": "Fires when a new app is created in a workspace",
|
||||
"Fires when a new member is added to a workspace": "Fires when a new member is added to a workspace"
|
||||
}
|
||||
@@ -0,0 +1,176 @@
|
||||
{
|
||||
"Connect your Podio account to automate workspace management and item operations.": "Connect your Podio account to automate workspace management and item operations.",
|
||||
"Create Item": "Create Item",
|
||||
"Update Item": "Update Item",
|
||||
"Create Task": "Create Task",
|
||||
"Update Task": "Update Task",
|
||||
"Attach File": "Attach File",
|
||||
"Create Comment": "Create Comment",
|
||||
"Create Status Update": "Create Status Update",
|
||||
"Find Item": "Find Item",
|
||||
"Find Task": "Find Task",
|
||||
"Custom API Call": "自定义 API 呼叫",
|
||||
"Create a new record in a Podio app with specified field values.": "Create a new record in a Podio app with specified field values.",
|
||||
"Update an existing record in a Podio app with specified field values. Only provided fields will be updated.": "Update an existing record in a Podio app with specified field values. Only provided fields will be updated.",
|
||||
"Add a new task to an item or workspace with due dates, assignees, and attachments.": "Add a new task to an item or workspace with due dates, assignees, and attachments.",
|
||||
"Modify an existing task's details or status. Only specified fields will be updated.": "Modify an existing task's details or status. Only specified fields will be updated.",
|
||||
"Upload and attach a file to an item/task/comment.": "Upload and attach a file to an item/task/comment.",
|
||||
"Post a comment on an item or task.": "Post a comment on an item or task.",
|
||||
"Add a status to an item or workspace stream.": "Add a status to an item or workspace stream.",
|
||||
"Retrieve a single item by ID or field value.": "Retrieve a single item by ID or field value.",
|
||||
"Retrieve a task by ID for further updates.": "Retrieve a task by ID for further updates.",
|
||||
"Make a custom API call to a specific endpoint": "将一个自定义 API 调用到一个特定的终点",
|
||||
"Organization (Optional)": "Organization (Optional)",
|
||||
"Space (Optional)": "Space (Optional)",
|
||||
"App": "应用",
|
||||
"External ID": "外部ID",
|
||||
"App Fields": "App Fields",
|
||||
"Advanced: Custom Fields JSON": "Advanced: Custom Fields JSON",
|
||||
"File IDs": "File IDs",
|
||||
"Tags": "标签",
|
||||
"Reminder": "Reminder",
|
||||
"Recurrence": "Recurrence",
|
||||
"Linked Account ID": "Linked Account ID",
|
||||
"Reference": "Reference",
|
||||
"Execute Hooks": "Execute Hooks",
|
||||
"Silent Mode": "Silent Mode",
|
||||
"Item": "Item",
|
||||
"Revision": "Revision",
|
||||
"Legacy Fields (Advanced)": "Legacy Fields (Advanced)",
|
||||
"Task Text": "Task Text",
|
||||
"Description": "描述",
|
||||
"Private": "Private",
|
||||
"Due Date": "Due Date",
|
||||
"Due Time": "Due Time",
|
||||
"Due Date & Time (UTC)": "Due Date & Time (UTC)",
|
||||
"Organization": "Organization",
|
||||
"Space": "Space",
|
||||
"Reference Type": "Reference Type",
|
||||
"Reference Object": "Reference Object",
|
||||
"Responsible Person": "Responsible Person",
|
||||
"Labels (Text)": "Labels (Text)",
|
||||
"Label IDs": "Label IDs",
|
||||
"Task": "Task",
|
||||
"Text": "文本",
|
||||
"Completed": "Completed",
|
||||
"Responsible User ID": "Responsible User ID",
|
||||
"Labels": "Labels",
|
||||
"File": "文件",
|
||||
"Attach To": "Attach To",
|
||||
"Comment On": "Comment On",
|
||||
"Object": "Object",
|
||||
"Comment Text": "Comment Text",
|
||||
"Attach Files": "Attach Files",
|
||||
"Embed ID": "Embed ID",
|
||||
"Embed URL": "Embed URL",
|
||||
"Auto-Invite Mentioned Users": "Auto-Invite Mentioned Users",
|
||||
"Status Message": "Status Message",
|
||||
"Add Poll": "Add Poll",
|
||||
"Search Method": "Search Method",
|
||||
"Item ID": "Item ID",
|
||||
"Mark as Viewed": "Mark as Viewed",
|
||||
"Search Filters": "Search Filters",
|
||||
"Limit": "Limit",
|
||||
"Offset": "Offset",
|
||||
"Sort By": "Sort By",
|
||||
"Sort Descending": "Sort Descending",
|
||||
"Method": "方法",
|
||||
"Headers": "信头",
|
||||
"Query Parameters": "查询参数",
|
||||
"Body": "正文内容",
|
||||
"Response is Binary ?": "Response is Binary ?",
|
||||
"No Error on Failure": "失败时没有错误",
|
||||
"Timeout (in seconds)": "超时(秒)",
|
||||
"Select an organization to filter apps by workspace. Leave empty to see all apps.": "Select an organization to filter apps by workspace. Leave empty to see all apps.",
|
||||
"Select a workspace to filter apps. Leave empty to see all apps in the organization.": "Select a workspace to filter apps. Leave empty to see all apps in the organization.",
|
||||
"Select a Podio app": "Select a Podio app",
|
||||
"The external id of the item. This can be used to hold a reference to the item in an external system.": "The external id of the item. This can be used to hold a reference to the item in an external system.",
|
||||
"Configure values for the fields in the selected app": "Configure values for the fields in the selected app",
|
||||
"Advanced: Use this for complex field configurations. Format: {\"field_id\": {\"value\": \"content\"}}. Only use if the dynamic fields above don't meet your needs.": "Advanced: Use this for complex field configurations. Format: {\"field_id\": {\"value\": \"content\"}}. Only use if the dynamic fields above don't meet your needs.",
|
||||
"Temporary files that have been uploaded and should be attached to this item": "Temporary files that have been uploaded and should be attached to this item",
|
||||
"The tags to put on the item": "The tags to put on the item",
|
||||
"Optional reminder on this item. Format: {\"remind_delta\": minutes_before_due_date}": "Optional reminder on this item. Format: {\"remind_delta\": minutes_before_due_date}",
|
||||
"The recurrence for the task, if any. Format: {\"name\": \"weekly|monthly|yearly\", \"config\": {...}, \"step\": 1, \"until\": \"date\"}": "The recurrence for the task, if any. Format: {\"name\": \"weekly|monthly|yearly\", \"config\": {...}, \"step\": 1, \"until\": \"date\"}",
|
||||
"The linked account to use for the meeting": "The linked account to use for the meeting",
|
||||
"The reference for the new item, if any. Format: {\"type\": \"item\", \"id\": reference_id}": "The reference for the new item, if any. Format: {\"type\": \"item\", \"id\": reference_id}",
|
||||
"If false, webhooks and integrations will not be triggered for this operation": "If false, webhooks and integrations will not be triggered for this operation",
|
||||
"If true, notifications will not be triggered and the object will not appear in activity streams": "If true, notifications will not be triggered and the object will not appear in activity streams",
|
||||
"Select a Podio item": "Select a Podio item",
|
||||
"Configure values for the fields you want to update in the selected app": "Configure values for the fields you want to update in the selected app",
|
||||
"The revision of the item that is being updated. Optional for conflict detection.": "The revision of the item that is being updated. Optional for conflict detection.",
|
||||
"The new external_id of the item": "The new external_id of the item",
|
||||
"Manual field configuration using field_id or external_id as keys. Use this for advanced scenarios or when dynamic fields are not sufficient.": "Manual field configuration using field_id or external_id as keys. Use this for advanced scenarios or when dynamic fields are not sufficient.",
|
||||
"The list of attachments": "The list of attachments",
|
||||
"The list of tags": "The list of tags",
|
||||
"The linked account to use for meetings": "The linked account to use for meetings",
|
||||
"The reference of the item. Format: {\"type\": \"reference_type\", \"id\": reference_id}": "The reference of the item. Format: {\"type\": \"reference_type\", \"id\": reference_id}",
|
||||
"The description or text of the task": "The description or text of the task",
|
||||
"Additional description for the task": "Additional description for the task",
|
||||
"Whether the task should be private (only creator, assignee and assignor can see it)": "Whether the task should be private (only creator, assignee and assignor can see it)",
|
||||
"Due date in local time (date only)": "Due date in local time (date only)",
|
||||
"Due time in local time (HH:MM:SS format, e.g., \"14:30:00\")": "Due time in local time (HH:MM:SS format, e.g., \"14:30:00\")",
|
||||
"Complete due date and time in UTC. Alternative to separate date/time fields.": "Complete due date and time in UTC. Alternative to separate date/time fields.",
|
||||
"Select a Podio organization": "Select a Podio organization",
|
||||
"Select a Podio workspace": "Select a Podio workspace",
|
||||
"The type of object to reference": "The type of object to reference",
|
||||
"Select the specific object to reference": "Select the specific object to reference",
|
||||
"Who is responsible for this task. Can be a user ID (number) or contact identifier object with type and id.": "Who is responsible for this task. Can be a user ID (number) or contact identifier object with type and id.",
|
||||
"List of file IDs to attach to this task": "List of file IDs to attach to this task",
|
||||
"List of label names in text form": "List of label names in text form",
|
||||
"List of label IDs (alternative to text labels)": "List of label IDs (alternative to text labels)",
|
||||
"Reminder settings. Format: {\"remind_delta\": minutes_before_due_date}": "Reminder settings. Format: {\"remind_delta\": minutes_before_due_date}",
|
||||
"Recurring task settings. Format: {\"name\": \"weekly|monthly|yearly\", \"config\": {...}, \"step\": 1, \"until\": \"date\"}": "Recurring task settings. Format: {\"name\": \"weekly|monthly|yearly\", \"config\": {...}, \"step\": 1, \"until\": \"date\"}",
|
||||
"External system identifier for this task": "External system identifier for this task",
|
||||
"Select a Podio task": "Select a Podio task",
|
||||
"The updated text (title) for the task": "The updated text (title) for the task",
|
||||
"The updated description for the task": "The updated description for the task",
|
||||
"The new due date for the task (in users timezone)": "The new due date for the task (in users timezone)",
|
||||
"The new due time for the task in local timezone (HH:MM:SS format, e.g., \"14:30:00\")": "The new due time for the task in local timezone (HH:MM:SS format, e.g., \"14:30:00\")",
|
||||
"Mark the task as completed or not completed": "Mark the task as completed or not completed",
|
||||
"The user ID of the person responsible for this task": "The user ID of the person responsible for this task",
|
||||
"The labels for the task. Either a list of label ids or label texts": "The labels for the task. Either a list of label ids or label texts",
|
||||
"The list of files that should be attached to the task": "The list of files that should be attached to the task",
|
||||
"Optional reminder on this task. Format: {\"remind_delta\": minutes_before_due_date}. If empty, existing reminder is deleted.": "Optional reminder on this task. Format: {\"remind_delta\": minutes_before_due_date}. If empty, existing reminder is deleted.",
|
||||
"Select a file from the space": "Select a file from the space",
|
||||
"What type of object to attach the file to": "What type of object to attach the file to",
|
||||
"What type of object to comment on": "What type of object to comment on",
|
||||
"Select the specific object to comment on": "Select the specific object to comment on",
|
||||
"The content of your comment": "The content of your comment",
|
||||
"Optional external identifier for the comment": "Optional external identifier for the comment",
|
||||
"Select files from the space to attach to this comment (enter file IDs from the space)": "Select files from the space to attach to this comment (enter file IDs from the space)",
|
||||
"ID of a previously created embedded link": "ID of a previously created embedded link",
|
||||
"URL to embed in the comment": "URL to embed in the comment",
|
||||
"Automatically invite mentioned users to the workspace if they lack access": "Automatically invite mentioned users to the workspace if they lack access",
|
||||
"What would you like to share?": "What would you like to share?",
|
||||
"File IDs to attach to this status update (enter file IDs from the space)": "File IDs to attach to this status update (enter file IDs from the space)",
|
||||
"URL to embed in the status update": "URL to embed in the status update",
|
||||
"Create a poll with your status. Format: {\"text\": \"Question?\", \"options\": [\"Option 1\", \"Option 2\"]}": "Create a poll with your status. Format: {\"text\": \"Question?\", \"options\": [\"Option 1\", \"Option 2\"]}",
|
||||
"How to find the item": "How to find the item",
|
||||
"The specific item ID to retrieve": "The specific item ID to retrieve",
|
||||
"Mark any new notifications on this item as viewed": "Mark any new notifications on this item as viewed",
|
||||
"Filter criteria as JSON object. Use field external_id as keys.": "Filter criteria as JSON object. Use field external_id as keys.",
|
||||
"Maximum number of results to return (1-500, default: 20)": "Maximum number of results to return (1-500, default: 20)",
|
||||
"Number of results to skip for pagination (default: 0)": "Number of results to skip for pagination (default: 0)",
|
||||
"Field to sort results by (e.g., \"created_on\", \"last_edit_on\")": "Field to sort results by (e.g., \"created_on\", \"last_edit_on\")",
|
||||
"Sort results in descending order": "Sort results in descending order",
|
||||
"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 Item": "New Item",
|
||||
"New Task": "New Task",
|
||||
"New Status": "New Status",
|
||||
"Item Updated": "Item Updated",
|
||||
"New App": "New App",
|
||||
"Member Added": "Member Added",
|
||||
"Fires when a new item (record/entry) is created in an app": "Fires when a new item (record/entry) is created in an app",
|
||||
"Fires when a new task is added to any workspace": "Fires when a new task is added to any workspace",
|
||||
"Fires when a new status is created in a workspace stream": "Fires when a new status is created in a workspace stream",
|
||||
"Fires when an existing item is updated (excluding comments)": "Fires when an existing item is updated (excluding comments)",
|
||||
"Fires when a new app is created in a workspace": "Fires when a new app is created in a workspace",
|
||||
"Fires when a new member is added to a workspace": "Fires when a new member is added to a workspace"
|
||||
}
|
||||
@@ -0,0 +1,94 @@
|
||||
import { createPiece, PieceAuth } from "@activepieces/pieces-framework";
|
||||
import { createCustomApiCallAction, HttpMethod } from '@activepieces/pieces-common';
|
||||
import { createItemAction } from './lib/actions/create-item';
|
||||
import { updateItemAction } from './lib/actions/update-item';
|
||||
import { createTaskAction } from './lib/actions/create-task';
|
||||
import { updateTaskAction } from './lib/actions/update-task';
|
||||
import { attachFileAction } from './lib/actions/attach-file';
|
||||
import { createCommentAction } from './lib/actions/create-comment';
|
||||
import { createStatusAction } from './lib/actions/create-status';
|
||||
import { findItemAction } from './lib/actions/find-item';
|
||||
import { findTaskAction } from './lib/actions/find-task';
|
||||
import { newItemTrigger } from './lib/triggers/new-item';
|
||||
import { newTaskTrigger } from './lib/triggers/new-task';
|
||||
import { newActivityTrigger } from './lib/triggers/new-activity';
|
||||
import { itemUpdatedTrigger } from './lib/triggers/item-updated';
|
||||
import { newOrganizationTrigger } from './lib/triggers/new-organization';
|
||||
import { newWorkspaceTrigger } from './lib/triggers/new-workspace';
|
||||
import { podioApiCall, validateAuthData } from './lib/common';
|
||||
|
||||
export const podioAuth = PieceAuth.OAuth2({
|
||||
description: "Connect your Podio account to automate workspace management and item operations.",
|
||||
authUrl: 'https://podio.com/oauth/authorize',
|
||||
tokenUrl: 'https://podio.com/oauth/token',
|
||||
required: true,
|
||||
scope: ['global:read', 'global:write'],
|
||||
validate: async ({ auth }) => {
|
||||
try {
|
||||
const validation = validateAuthData(auth);
|
||||
if (!validation.valid) {
|
||||
return { valid: false, error: validation.error || 'Authentication validation failed' };
|
||||
}
|
||||
|
||||
const response = await podioApiCall({
|
||||
method: HttpMethod.GET,
|
||||
accessToken: auth.access_token,
|
||||
resourceUri: '/user/status',
|
||||
});
|
||||
|
||||
if (response && typeof response === 'object') {
|
||||
return { valid: true };
|
||||
}
|
||||
|
||||
return { valid: false, error: 'Failed to validate connection with Podio API' };
|
||||
} catch (error: any) {
|
||||
if (error.response?.status === 401) {
|
||||
return { valid: false, error: 'Invalid or expired access token. Please reconnect your Podio account.' };
|
||||
}
|
||||
|
||||
if (error.response?.status === 403) {
|
||||
return { valid: false, error: 'Access denied. Please check your Podio permissions.' };
|
||||
}
|
||||
|
||||
return {
|
||||
valid: false,
|
||||
error: `Connection validation failed: ${error.message || 'Unknown error occurred'}`
|
||||
};
|
||||
}
|
||||
},
|
||||
});
|
||||
|
||||
export const podio = createPiece({
|
||||
displayName: "Podio",
|
||||
auth: podioAuth,
|
||||
minimumSupportedRelease: '0.36.1',
|
||||
logoUrl: "https://cdn.activepieces.com/pieces/podio.png",
|
||||
authors: ["sparkybug", "onyedikachi-david"],
|
||||
actions: [
|
||||
createItemAction,
|
||||
updateItemAction,
|
||||
createTaskAction,
|
||||
updateTaskAction,
|
||||
attachFileAction,
|
||||
createCommentAction,
|
||||
createStatusAction,
|
||||
findItemAction,
|
||||
findTaskAction,
|
||||
createCustomApiCallAction({
|
||||
baseUrl: () => 'https://api.podio.com',
|
||||
auth: podioAuth,
|
||||
authMapping: async (auth: any) => ({
|
||||
Authorization: `Bearer ${auth.access_token}`,
|
||||
}),
|
||||
}),
|
||||
],
|
||||
triggers: [
|
||||
newItemTrigger,
|
||||
newTaskTrigger,
|
||||
newActivityTrigger,
|
||||
itemUpdatedTrigger,
|
||||
newOrganizationTrigger,
|
||||
newWorkspaceTrigger,
|
||||
],
|
||||
});
|
||||
|
||||
@@ -0,0 +1,90 @@
|
||||
import { createAction, Property } from '@activepieces/pieces-framework';
|
||||
import { HttpMethod } from '@activepieces/pieces-common';
|
||||
import { podioAuth } from '../../index';
|
||||
import { podioApiCall, getAccessToken, silentProperty, dynamicRefTypeProperty, dynamicRefIdProperty, dynamicAppProperty, dynamicSpaceProperty, dynamicOrgProperty, dynamicFileProperty } from '../common';
|
||||
|
||||
export const attachFileAction = createAction({
|
||||
auth: podioAuth,
|
||||
name: 'attach_file',
|
||||
displayName: 'Attach File',
|
||||
description: 'Upload and attach a file to an item/task/comment.',
|
||||
props: {
|
||||
orgId: dynamicOrgProperty,
|
||||
spaceId: dynamicSpaceProperty,
|
||||
appId: dynamicAppProperty,
|
||||
|
||||
fileId: dynamicFileProperty,
|
||||
|
||||
refType: Property.Dropdown({
|
||||
auth: podioAuth,
|
||||
displayName: 'Attach To',
|
||||
description: 'What type of object to attach the file to',
|
||||
required: true,
|
||||
refreshers: [],
|
||||
options: async () => {
|
||||
return {
|
||||
options: [
|
||||
{ label: 'Item', value: 'item' },
|
||||
{ label: 'Task', value: 'task' },
|
||||
{ label: 'Status Update', value: 'status' },
|
||||
{ label: 'Comment', value: 'comment' },
|
||||
{ label: 'Space', value: 'space' },
|
||||
],
|
||||
};
|
||||
},
|
||||
}),
|
||||
refId: dynamicRefIdProperty,
|
||||
|
||||
silent: silentProperty,
|
||||
},
|
||||
async run(context) {
|
||||
const accessToken = getAccessToken(context.auth);
|
||||
const { fileId, orgId, spaceId, appId, refType, refId, silent } = context.propsValue;
|
||||
|
||||
if (!spaceId) {
|
||||
throw new Error('Space selection is required to load and attach files. Please select a space first.');
|
||||
}
|
||||
|
||||
if (!fileId) {
|
||||
throw new Error('File selection is required. Please select a file from the dropdown.');
|
||||
}
|
||||
|
||||
if (!refType) {
|
||||
throw new Error('Attach To selection is required. Please choose what type of object to attach the file to.');
|
||||
}
|
||||
|
||||
if (!refId) {
|
||||
throw new Error('Reference Object is required. Please select the specific object to attach the file to.');
|
||||
}
|
||||
|
||||
if (refType === 'item' && !appId) {
|
||||
throw new Error('App selection is required when attaching files to items. Please select an app first.');
|
||||
}
|
||||
|
||||
if ((refType === 'status' || refType === 'task') && !spaceId) {
|
||||
throw new Error('Space selection is required when attaching files to status updates or tasks. Please select a space first.');
|
||||
}
|
||||
|
||||
const body = {
|
||||
ref_type: refType,
|
||||
ref_id: refId,
|
||||
};
|
||||
|
||||
const queryParams: any = {};
|
||||
if (typeof silent === 'boolean') {
|
||||
queryParams.silent = silent.toString();
|
||||
}
|
||||
|
||||
const response = await podioApiCall<{
|
||||
file_id: number;
|
||||
}>({
|
||||
method: HttpMethod.POST,
|
||||
accessToken,
|
||||
resourceUri: `/file/${fileId}/attach`,
|
||||
body,
|
||||
queryParams,
|
||||
});
|
||||
|
||||
return response;
|
||||
},
|
||||
});
|
||||
@@ -0,0 +1,259 @@
|
||||
import { createAction, Property } from '@activepieces/pieces-framework';
|
||||
import { HttpMethod } from '@activepieces/pieces-common';
|
||||
import { podioAuth } from '../../index';
|
||||
import { podioApiCall, getAccessToken, silentProperty, hookProperty, dynamicAppProperty, dynamicSpaceProperty, dynamicOrgProperty } from '../common';
|
||||
|
||||
export const createCommentAction = createAction({
|
||||
auth: podioAuth,
|
||||
name: 'create_comment',
|
||||
displayName: 'Create Comment',
|
||||
description: 'Post a comment on an item or task.',
|
||||
props: {
|
||||
orgId: dynamicOrgProperty,
|
||||
spaceId: dynamicSpaceProperty,
|
||||
appId: dynamicAppProperty,
|
||||
|
||||
type: Property.Dropdown({
|
||||
auth: podioAuth,
|
||||
displayName: 'Comment On',
|
||||
description: 'What type of object to comment on',
|
||||
required: true,
|
||||
refreshers: [],
|
||||
options: async () => {
|
||||
return {
|
||||
options: [
|
||||
{ label: 'Item', value: 'item' },
|
||||
{ label: 'Task', value: 'task' },
|
||||
],
|
||||
};
|
||||
},
|
||||
}),
|
||||
id: Property.Dropdown({
|
||||
auth: podioAuth,
|
||||
displayName: 'Object',
|
||||
description: 'Select the specific object to comment on',
|
||||
required: true,
|
||||
refreshers: ['type', 'appId', 'spaceId'],
|
||||
options: async ({ auth, type, appId, spaceId }) => {
|
||||
if (!auth || !type) {
|
||||
return {
|
||||
disabled: true,
|
||||
placeholder: !auth ? 'Connect your Podio account first' : 'Select an object type first',
|
||||
options: [],
|
||||
};
|
||||
}
|
||||
|
||||
try {
|
||||
const accessToken = getAccessToken(auth as any);
|
||||
|
||||
switch (type) {
|
||||
case 'item': {
|
||||
if (!appId) {
|
||||
return {
|
||||
disabled: true,
|
||||
placeholder: 'Select an app first to load items',
|
||||
options: [],
|
||||
};
|
||||
}
|
||||
const itemResponse = await podioApiCall<{ items: any[] }>({
|
||||
method: HttpMethod.POST,
|
||||
accessToken,
|
||||
resourceUri: `/item/app/${appId}/filter/`,
|
||||
body: { limit: 30 },
|
||||
});
|
||||
return {
|
||||
options: itemResponse.items?.map((item: any) => ({
|
||||
label: item.title || `Item ${item.item_id}`,
|
||||
value: item.item_id,
|
||||
})) || [],
|
||||
};
|
||||
}
|
||||
|
||||
case 'task': {
|
||||
const userInfo = await podioApiCall<any>({
|
||||
method: HttpMethod.GET,
|
||||
accessToken,
|
||||
resourceUri: '/user/status',
|
||||
});
|
||||
const userId = userInfo?.user?.user_id;
|
||||
|
||||
if (!userId) {
|
||||
return {
|
||||
disabled: true,
|
||||
options: [],
|
||||
placeholder: 'Could not determine user ID for task filtering',
|
||||
};
|
||||
}
|
||||
|
||||
const taskQueryParams: any = {
|
||||
responsible: userId,
|
||||
limit: 30,
|
||||
view: 'full',
|
||||
sort_by: 'created_on',
|
||||
sort_desc: 'true'
|
||||
};
|
||||
|
||||
if (spaceId) {
|
||||
taskQueryParams.space = spaceId;
|
||||
}
|
||||
|
||||
const taskResponse = await podioApiCall<any[]>({
|
||||
method: HttpMethod.GET,
|
||||
accessToken,
|
||||
resourceUri: '/task/',
|
||||
queryParams: taskQueryParams,
|
||||
});
|
||||
|
||||
return {
|
||||
options: taskResponse?.map((task: any) => {
|
||||
let label = task.text || `Task ${task.task_id}`;
|
||||
if (task.ref?.title) {
|
||||
label += ` → ${task.ref.title}`;
|
||||
}
|
||||
return {
|
||||
label,
|
||||
value: task.task_id,
|
||||
};
|
||||
}) || [],
|
||||
};
|
||||
}
|
||||
|
||||
default:
|
||||
return {
|
||||
options: [],
|
||||
placeholder: 'Please select Item or Task',
|
||||
};
|
||||
}
|
||||
} catch (error) {
|
||||
return {
|
||||
disabled: true,
|
||||
options: [],
|
||||
placeholder: `Failed to load ${type}s. Check your permissions.`,
|
||||
};
|
||||
}
|
||||
},
|
||||
}),
|
||||
|
||||
value: Property.LongText({
|
||||
displayName: 'Comment Text',
|
||||
description: 'The content of your comment',
|
||||
required: true,
|
||||
}),
|
||||
externalId: Property.ShortText({
|
||||
displayName: 'External ID',
|
||||
description: 'Optional external identifier for the comment',
|
||||
required: false,
|
||||
}),
|
||||
|
||||
fileIds: Property.Array({
|
||||
displayName: 'Attach Files',
|
||||
description: 'Select files from the space to attach to this comment (enter file IDs from the space)',
|
||||
required: false,
|
||||
}),
|
||||
embedId: Property.Number({
|
||||
displayName: 'Embed ID',
|
||||
description: 'ID of a previously created embedded link',
|
||||
required: false,
|
||||
}),
|
||||
embedUrl: Property.ShortText({
|
||||
displayName: 'Embed URL',
|
||||
description: 'URL to embed in the comment',
|
||||
required: false,
|
||||
}),
|
||||
|
||||
alertInvite: Property.Checkbox({
|
||||
displayName: 'Auto-Invite Mentioned Users',
|
||||
description: 'Automatically invite mentioned users to the workspace if they lack access',
|
||||
required: false,
|
||||
defaultValue: false,
|
||||
}),
|
||||
|
||||
silent: silentProperty,
|
||||
hook: hookProperty,
|
||||
},
|
||||
async run(context) {
|
||||
const accessToken = getAccessToken(context.auth);
|
||||
const {
|
||||
appId,
|
||||
spaceId,
|
||||
type,
|
||||
id,
|
||||
value,
|
||||
externalId,
|
||||
fileIds,
|
||||
embedId,
|
||||
embedUrl,
|
||||
alertInvite,
|
||||
silent,
|
||||
hook
|
||||
} = context.propsValue;
|
||||
|
||||
if (!type) {
|
||||
throw new Error('Comment target type is required. Please select what type of object to comment on.');
|
||||
}
|
||||
|
||||
if (!id) {
|
||||
throw new Error('Target object is required. Please select the specific object to comment on.');
|
||||
}
|
||||
|
||||
if (!value || typeof value !== 'string' || value.trim().length === 0) {
|
||||
throw new Error('Comment text is required and cannot be empty.');
|
||||
}
|
||||
|
||||
if (type === 'item' && !appId) {
|
||||
throw new Error('App selection is required when commenting on items. Please select an app first.');
|
||||
}
|
||||
|
||||
if (fileIds && !Array.isArray(fileIds)) {
|
||||
throw new Error('File IDs must be provided as an array.');
|
||||
}
|
||||
|
||||
if (embedId && typeof embedId !== 'number') {
|
||||
throw new Error('Embed ID must be a number.');
|
||||
}
|
||||
|
||||
const body: any = {
|
||||
value: value.trim(),
|
||||
};
|
||||
|
||||
if (externalId && externalId.trim()) {
|
||||
body.external_id = externalId.trim();
|
||||
}
|
||||
|
||||
if (fileIds && Array.isArray(fileIds) && fileIds.length > 0) {
|
||||
body.file_ids = fileIds;
|
||||
}
|
||||
|
||||
if (embedId) {
|
||||
body.embed_id = embedId;
|
||||
}
|
||||
|
||||
if (embedUrl && embedUrl.trim()) {
|
||||
body.embed_url = embedUrl.trim();
|
||||
}
|
||||
|
||||
if (typeof alertInvite === 'boolean') {
|
||||
body.alert_invite = alertInvite;
|
||||
}
|
||||
|
||||
const queryParams: any = {};
|
||||
if (typeof silent === 'boolean') {
|
||||
queryParams.silent = silent.toString();
|
||||
}
|
||||
if (typeof hook === 'boolean') {
|
||||
queryParams.hook = hook.toString();
|
||||
}
|
||||
|
||||
const response = await podioApiCall<{
|
||||
comment_id: number;
|
||||
}>({
|
||||
method: HttpMethod.POST,
|
||||
accessToken,
|
||||
resourceUri: `/comment/${type}/${id}`,
|
||||
body,
|
||||
queryParams,
|
||||
});
|
||||
|
||||
return response;
|
||||
},
|
||||
});
|
||||
@@ -0,0 +1,473 @@
|
||||
import { createAction, Property } from '@activepieces/pieces-framework';
|
||||
import { HttpMethod } from '@activepieces/pieces-common';
|
||||
import { podioAuth } from '../../index';
|
||||
import {
|
||||
podioApiCall,
|
||||
getAccessToken,
|
||||
dynamicAppProperty,
|
||||
silentProperty,
|
||||
hookProperty,
|
||||
formatFieldValues
|
||||
} from '../common';
|
||||
|
||||
export const createItemAction = createAction({
|
||||
auth: podioAuth,
|
||||
name: 'create_item',
|
||||
displayName: 'Create Item',
|
||||
description: 'Create a new record in a Podio app with specified field values.',
|
||||
props: {
|
||||
orgId: Property.Dropdown({
|
||||
auth: podioAuth,
|
||||
displayName: 'Organization (Optional)',
|
||||
description: 'Select an organization to filter apps by workspace. Leave empty to see all apps.',
|
||||
required: false,
|
||||
refreshers: [],
|
||||
options: async ({ auth }) => {
|
||||
if (!auth) {
|
||||
return {
|
||||
disabled: true,
|
||||
placeholder: 'Connect your Podio account first',
|
||||
options: [],
|
||||
};
|
||||
}
|
||||
|
||||
try {
|
||||
const accessToken = getAccessToken(auth as any);
|
||||
|
||||
const orgs = await podioApiCall<any[]>({
|
||||
method: HttpMethod.GET,
|
||||
accessToken,
|
||||
resourceUri: '/org/',
|
||||
});
|
||||
|
||||
if (!orgs || orgs.length === 0) {
|
||||
return {
|
||||
options: [],
|
||||
placeholder: 'No organizations found',
|
||||
};
|
||||
}
|
||||
|
||||
return {
|
||||
options: orgs.map((org: any) => ({
|
||||
label: org.name,
|
||||
value: org.org_id,
|
||||
})),
|
||||
};
|
||||
} catch (error) {
|
||||
return {
|
||||
disabled: true,
|
||||
options: [],
|
||||
placeholder: 'Failed to load organizations. Check your connection.',
|
||||
};
|
||||
}
|
||||
},
|
||||
}),
|
||||
spaceId: Property.Dropdown({
|
||||
auth: podioAuth,
|
||||
displayName: 'Space (Optional)',
|
||||
description: 'Select a workspace to filter apps. Leave empty to see all apps in the organization.',
|
||||
required: false,
|
||||
refreshers: ['orgId'],
|
||||
options: async ({ auth, orgId }) => {
|
||||
if (!auth) {
|
||||
return {
|
||||
disabled: true,
|
||||
placeholder: 'Connect your Podio account first',
|
||||
options: [],
|
||||
};
|
||||
}
|
||||
|
||||
if (!orgId) {
|
||||
return {
|
||||
disabled: true,
|
||||
placeholder: 'Select an organization first',
|
||||
options: [],
|
||||
};
|
||||
}
|
||||
|
||||
try {
|
||||
const accessToken = getAccessToken(auth as any);
|
||||
|
||||
const resourceUri = `/org/${orgId}/space/`;
|
||||
|
||||
const spaces = await podioApiCall<any[]>({
|
||||
method: HttpMethod.GET,
|
||||
accessToken,
|
||||
resourceUri,
|
||||
});
|
||||
|
||||
if (!spaces || spaces.length === 0) {
|
||||
return {
|
||||
options: [],
|
||||
placeholder: 'No spaces found in this organization',
|
||||
};
|
||||
}
|
||||
|
||||
return {
|
||||
options: spaces.map((space: any) => ({
|
||||
label: `${space.name}${space.org ? ` (${space.org.name})` : ''}`,
|
||||
value: space.space_id,
|
||||
})),
|
||||
};
|
||||
} catch (error) {
|
||||
return {
|
||||
disabled: true,
|
||||
options: [],
|
||||
placeholder: 'Failed to load spaces. Check your connection.',
|
||||
};
|
||||
}
|
||||
},
|
||||
}),
|
||||
appId: dynamicAppProperty,
|
||||
externalId: Property.ShortText({
|
||||
displayName: 'External ID',
|
||||
description: 'The external id of the item. This can be used to hold a reference to the item in an external system.',
|
||||
required: false,
|
||||
}),
|
||||
|
||||
appFields: Property.DynamicProperties({
|
||||
auth: podioAuth,
|
||||
displayName: 'App Fields',
|
||||
description: 'Configure values for the fields in the selected app',
|
||||
required: true,
|
||||
refreshers: ['appId'],
|
||||
props: async ({ auth, appId }) => {
|
||||
if (!auth || !appId) {
|
||||
return {};
|
||||
}
|
||||
|
||||
try {
|
||||
const accessToken = getAccessToken(auth as any);
|
||||
|
||||
const app = await podioApiCall<any>({
|
||||
method: HttpMethod.GET,
|
||||
accessToken,
|
||||
resourceUri: `/app/${appId}`,
|
||||
queryParams: { view: 'full' }
|
||||
});
|
||||
|
||||
|
||||
|
||||
const fields = app.fields || [];
|
||||
|
||||
|
||||
if (!fields || fields.length === 0) {
|
||||
return {};
|
||||
}
|
||||
|
||||
const fieldProperties: Record<string, any> = {};
|
||||
|
||||
for (const field of fields) {
|
||||
try {
|
||||
const fieldKey = `field_${field.field_id}`;
|
||||
const fieldConfig = field.config;
|
||||
const fieldType = field.type;
|
||||
const isRequired = fieldConfig.required || false;
|
||||
|
||||
|
||||
const baseProps = {
|
||||
displayName: fieldConfig.label,
|
||||
description: fieldConfig.description || `Enter value for ${fieldConfig.label}`,
|
||||
required: isRequired,
|
||||
};
|
||||
|
||||
|
||||
switch (fieldType) {
|
||||
case 'text':
|
||||
fieldProperties[fieldKey] = Property.LongText({
|
||||
...baseProps,
|
||||
description: `${baseProps.description}. Supports plain text, markdown, or HTML.`,
|
||||
});
|
||||
break;
|
||||
|
||||
case 'number':
|
||||
fieldProperties[fieldKey] = Property.Number({
|
||||
...baseProps,
|
||||
description: `${baseProps.description}. Enter a numeric value.`,
|
||||
});
|
||||
break;
|
||||
|
||||
case 'money':
|
||||
fieldProperties[fieldKey] = Property.Object({
|
||||
...baseProps,
|
||||
description: `${baseProps.description}. Format: {"value": "amount", "currency": "USD"}`,
|
||||
});
|
||||
break;
|
||||
|
||||
case 'date':
|
||||
fieldProperties[fieldKey] = Property.Object({
|
||||
...baseProps,
|
||||
description: `${baseProps.description}. Format: {"start_date": "YYYY-MM-DD", "start_time": "HH:MM:SS", "end_date": "YYYY-MM-DD", "end_time": "HH:MM:SS"}`,
|
||||
});
|
||||
break;
|
||||
|
||||
case 'contact':
|
||||
fieldProperties[fieldKey] = Property.Number({
|
||||
...baseProps,
|
||||
description: `${baseProps.description}. Enter the Podio profile ID of the contact.`,
|
||||
});
|
||||
break;
|
||||
|
||||
case 'member':
|
||||
fieldProperties[fieldKey] = Property.Number({
|
||||
...baseProps,
|
||||
description: `${baseProps.description}. Enter the Podio user ID of the member.`,
|
||||
});
|
||||
break;
|
||||
|
||||
case 'app':
|
||||
fieldProperties[fieldKey] = Property.Number({
|
||||
...baseProps,
|
||||
description: `${baseProps.description}. Enter the ID of the item from the linked app.`,
|
||||
});
|
||||
break;
|
||||
|
||||
case 'category':
|
||||
case 'status': {
|
||||
|
||||
|
||||
let staticOptions: Array<{label: string, value: any}> = [];
|
||||
|
||||
if (fieldConfig.settings?.options && Array.isArray(fieldConfig.settings.options)) {
|
||||
staticOptions = fieldConfig.settings.options.map((option: any) => ({
|
||||
label: option.text || option.name || option.value || `Option ${option.id}`,
|
||||
value: option.id || option.value,
|
||||
}));
|
||||
}
|
||||
|
||||
if (staticOptions.length > 0) {
|
||||
fieldProperties[fieldKey] = Property.StaticDropdown({
|
||||
...baseProps,
|
||||
options: {
|
||||
options: staticOptions,
|
||||
},
|
||||
});
|
||||
} else {
|
||||
|
||||
fieldProperties[fieldKey] = Property.Number({
|
||||
...baseProps,
|
||||
description: `${baseProps.description}. Enter the ${fieldType} option ID manually.`,
|
||||
});
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
case 'email':
|
||||
fieldProperties[fieldKey] = Property.Object({
|
||||
...baseProps,
|
||||
description: `${baseProps.description}. Format: {"value": "email@example.com", "type": "work|home|other"}`,
|
||||
});
|
||||
break;
|
||||
|
||||
case 'phone':
|
||||
fieldProperties[fieldKey] = Property.Object({
|
||||
...baseProps,
|
||||
description: `${baseProps.description}. Format: {"value": "phone_number", "type": "mobile|work|home|main|work_fax|private_fax|other"}`,
|
||||
});
|
||||
break;
|
||||
|
||||
case 'location':
|
||||
fieldProperties[fieldKey] = Property.ShortText({
|
||||
...baseProps,
|
||||
description: `${baseProps.description}. Enter a location (address, coordinates, etc.)`,
|
||||
});
|
||||
break;
|
||||
|
||||
case 'image':
|
||||
case 'file':
|
||||
fieldProperties[fieldKey] = Property.Number({
|
||||
...baseProps,
|
||||
description: `${baseProps.description}. Enter the file ID of the uploaded ${fieldType}.`,
|
||||
});
|
||||
break;
|
||||
|
||||
case 'progress':
|
||||
fieldProperties[fieldKey] = Property.Number({
|
||||
...baseProps,
|
||||
description: `${baseProps.description}. Enter a value between 0 and 100.`,
|
||||
});
|
||||
break;
|
||||
|
||||
default:
|
||||
fieldProperties[fieldKey] = Property.ShortText({
|
||||
...baseProps,
|
||||
description: `${baseProps.description}. Field type: ${fieldType}`,
|
||||
});
|
||||
}
|
||||
} catch (fieldError) {
|
||||
|
||||
const fieldKey = `field_${field.field_id}`;
|
||||
fieldProperties[fieldKey] = Property.ShortText({
|
||||
displayName: `${field.config?.label || 'Unknown Field'} (Fallback)`,
|
||||
description: `Field type "${field.type}" - Manual entry required. Original error: ${fieldError instanceof Error ? fieldError.message : 'Unknown error'}`,
|
||||
required: field.config?.required || false,
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
return fieldProperties;
|
||||
} catch (error) {
|
||||
return {};
|
||||
}
|
||||
},
|
||||
}),
|
||||
legacyFields: Property.Object({
|
||||
displayName: 'Advanced: Custom Fields JSON',
|
||||
description: 'Advanced: Use this for complex field configurations. Format: {"field_id": {"value": "content"}}. Only use if the dynamic fields above don\'t meet your needs.',
|
||||
required: false,
|
||||
}),
|
||||
fileIds: Property.Array({
|
||||
displayName: 'File IDs',
|
||||
description: 'Temporary files that have been uploaded and should be attached to this item',
|
||||
required: false,
|
||||
}),
|
||||
tags: Property.Array({
|
||||
displayName: 'Tags',
|
||||
description: 'The tags to put on the item',
|
||||
required: false,
|
||||
}),
|
||||
reminder: Property.Object({
|
||||
displayName: 'Reminder',
|
||||
description: 'Optional reminder on this item. Format: {"remind_delta": minutes_before_due_date}',
|
||||
required: false,
|
||||
}),
|
||||
recurrence: Property.Object({
|
||||
displayName: 'Recurrence',
|
||||
description: 'The recurrence for the task, if any. Format: {"name": "weekly|monthly|yearly", "config": {...}, "step": 1, "until": "date"}',
|
||||
required: false,
|
||||
}),
|
||||
linkedAccountId: Property.Number({
|
||||
displayName: 'Linked Account ID',
|
||||
description: 'The linked account to use for the meeting',
|
||||
required: false,
|
||||
}),
|
||||
ref: Property.Object({
|
||||
displayName: 'Reference',
|
||||
description: 'The reference for the new item, if any. Format: {"type": "item", "id": reference_id}',
|
||||
required: false,
|
||||
}),
|
||||
hook: hookProperty,
|
||||
silent: silentProperty,
|
||||
},
|
||||
async run(context) {
|
||||
|
||||
const accessToken = getAccessToken(context.auth);
|
||||
const {
|
||||
orgId,
|
||||
spaceId,
|
||||
appId,
|
||||
externalId,
|
||||
appFields,
|
||||
legacyFields,
|
||||
fileIds,
|
||||
tags,
|
||||
reminder,
|
||||
recurrence,
|
||||
linkedAccountId,
|
||||
ref,
|
||||
hook,
|
||||
silent
|
||||
} = context.propsValue;
|
||||
|
||||
|
||||
if (!appId) {
|
||||
throw new Error('App selection is required. Please select a Podio app from the dropdown.');
|
||||
}
|
||||
|
||||
let formattedFields: Record<string, any> = {};
|
||||
|
||||
if (appFields && Object.keys(appFields).length > 0) {
|
||||
try {
|
||||
const accessToken = getAccessToken(context.auth);
|
||||
const app = await podioApiCall<any>({
|
||||
method: HttpMethod.GET,
|
||||
accessToken,
|
||||
resourceUri: `/app/${appId}`,
|
||||
queryParams: { view: 'full' }
|
||||
});
|
||||
|
||||
const fieldDefinitions = app.fields || [];
|
||||
|
||||
formattedFields = formatFieldValues(fieldDefinitions, appFields);
|
||||
} catch (error) {
|
||||
throw new Error(`Failed to process app fields: ${error instanceof Error ? error.message : 'Unknown error'}`);
|
||||
}
|
||||
}
|
||||
|
||||
if (legacyFields && typeof legacyFields === 'object' && Object.keys(legacyFields).length > 0) {
|
||||
formattedFields = { ...formattedFields, ...legacyFields };
|
||||
}
|
||||
|
||||
if (Object.keys(formattedFields).length === 0) {
|
||||
throw new Error('At least one field value is required to create an item. Please configure the app fields or provide legacy field data.');
|
||||
}
|
||||
|
||||
if (fileIds && !Array.isArray(fileIds)) {
|
||||
throw new Error('File IDs must be provided as an array of numbers.');
|
||||
}
|
||||
|
||||
if (tags && !Array.isArray(tags)) {
|
||||
throw new Error('Tags must be provided as an array of strings.');
|
||||
}
|
||||
|
||||
const body: any = {
|
||||
fields: formattedFields,
|
||||
};
|
||||
|
||||
if (externalId) {
|
||||
body.external_id = externalId;
|
||||
}
|
||||
|
||||
if (fileIds && Array.isArray(fileIds) && fileIds.length > 0) {
|
||||
body.file_ids = fileIds;
|
||||
}
|
||||
|
||||
if (tags && Array.isArray(tags) && tags.length > 0) {
|
||||
body.tags = tags;
|
||||
}
|
||||
|
||||
if (reminder && typeof reminder === 'object' && Object.keys(reminder).length > 0) {
|
||||
if (reminder['remind_delta'] && typeof reminder['remind_delta'] === 'number') {
|
||||
body.reminder = reminder;
|
||||
}
|
||||
}
|
||||
|
||||
if (recurrence && typeof recurrence === 'object' && Object.keys(recurrence).length > 0) {
|
||||
if (recurrence['name'] && recurrence['config']) {
|
||||
body.recurrence = recurrence;
|
||||
}
|
||||
}
|
||||
|
||||
if (linkedAccountId) {
|
||||
body.linked_account_id = linkedAccountId;
|
||||
}
|
||||
|
||||
if (ref && typeof ref === 'object' && Object.keys(ref).length > 0) {
|
||||
if (ref['type'] && ref['id']) {
|
||||
body.ref = ref;
|
||||
}
|
||||
}
|
||||
|
||||
const queryParams: any = {};
|
||||
if (typeof hook === 'boolean') {
|
||||
queryParams.hook = hook.toString();
|
||||
}
|
||||
if (typeof silent === 'boolean') {
|
||||
queryParams.silent = silent.toString();
|
||||
}
|
||||
|
||||
const response = await podioApiCall<{
|
||||
item_id: number;
|
||||
title: string;
|
||||
}>({
|
||||
method: HttpMethod.POST,
|
||||
accessToken,
|
||||
resourceUri: `/item/app/${appId}/`,
|
||||
body,
|
||||
queryParams,
|
||||
});
|
||||
|
||||
return response;
|
||||
},
|
||||
});
|
||||
@@ -0,0 +1,124 @@
|
||||
import { createAction, Property } from '@activepieces/pieces-framework';
|
||||
import { HttpMethod } from '@activepieces/pieces-common';
|
||||
import { podioAuth } from '../../index';
|
||||
import { podioApiCall, getAccessToken, dynamicSpaceProperty, dynamicOrgProperty } from '../common';
|
||||
|
||||
export const createStatusAction = createAction({
|
||||
auth: podioAuth,
|
||||
name: 'create_status',
|
||||
displayName: 'Create Status Update',
|
||||
description: 'Add a status to an item or workspace stream.',
|
||||
props: {
|
||||
orgId: dynamicOrgProperty,
|
||||
spaceId: dynamicSpaceProperty,
|
||||
|
||||
value: Property.LongText({
|
||||
displayName: 'Status Message',
|
||||
description: 'What would you like to share?',
|
||||
required: true,
|
||||
}),
|
||||
|
||||
fileIds: Property.Array({
|
||||
displayName: 'Attach Files',
|
||||
description: 'File IDs to attach to this status update (enter file IDs from the space)',
|
||||
required: false,
|
||||
}),
|
||||
embedId: Property.Number({
|
||||
displayName: 'Embed ID',
|
||||
description: 'ID of a previously created embedded link',
|
||||
required: false,
|
||||
}),
|
||||
embedUrl: Property.ShortText({
|
||||
displayName: 'Embed URL',
|
||||
description: 'URL to embed in the status update',
|
||||
required: false,
|
||||
}),
|
||||
|
||||
question: Property.Object({
|
||||
displayName: 'Add Poll',
|
||||
description: 'Create a poll with your status. Format: {"text": "Question?", "options": ["Option 1", "Option 2"]}',
|
||||
required: false,
|
||||
}),
|
||||
|
||||
alertInvite: Property.Checkbox({
|
||||
displayName: 'Auto-Invite Mentioned Users',
|
||||
description: 'Automatically invite mentioned users to the workspace if they lack access',
|
||||
required: false,
|
||||
defaultValue: false,
|
||||
}),
|
||||
},
|
||||
async run(context) {
|
||||
const accessToken = getAccessToken(context.auth);
|
||||
const {
|
||||
spaceId,
|
||||
value,
|
||||
fileIds,
|
||||
embedId,
|
||||
embedUrl,
|
||||
question,
|
||||
alertInvite
|
||||
} = context.propsValue;
|
||||
|
||||
if (!spaceId) {
|
||||
throw new Error('Space selection is required. Please select a workspace to post your status to.');
|
||||
}
|
||||
|
||||
if (!value || typeof value !== 'string' || value.trim().length === 0) {
|
||||
throw new Error('Status message is required and cannot be empty.');
|
||||
}
|
||||
|
||||
if (fileIds && !Array.isArray(fileIds)) {
|
||||
throw new Error('File IDs must be provided as an array.');
|
||||
}
|
||||
|
||||
if (embedId && typeof embedId !== 'number') {
|
||||
throw new Error('Embed ID must be a number.');
|
||||
}
|
||||
|
||||
if (question && typeof question === 'object') {
|
||||
if (!question['text'] || typeof question['text'] !== 'string') {
|
||||
throw new Error('Poll question must have a "text" property with the question text.');
|
||||
}
|
||||
if (!question['options'] || !Array.isArray(question['options']) || question['options'].length === 0) {
|
||||
throw new Error('Poll question must have an "options" array with at least one choice.');
|
||||
}
|
||||
}
|
||||
|
||||
const body: any = {
|
||||
value: value.trim(),
|
||||
};
|
||||
|
||||
if (fileIds && Array.isArray(fileIds) && fileIds.length > 0) {
|
||||
body.file_ids = fileIds;
|
||||
}
|
||||
|
||||
if (embedId) {
|
||||
body.embed_id = embedId;
|
||||
}
|
||||
|
||||
if (embedUrl && embedUrl.trim()) {
|
||||
body.embed_url = embedUrl.trim();
|
||||
}
|
||||
|
||||
if (question && typeof question === 'object' && question['text'] && question['options']) {
|
||||
body.question = question;
|
||||
}
|
||||
|
||||
const queryParams: any = {};
|
||||
if (typeof alertInvite === 'boolean') {
|
||||
queryParams.alert_invite = alertInvite.toString();
|
||||
}
|
||||
|
||||
const response = await podioApiCall<{
|
||||
status_id: number;
|
||||
}>({
|
||||
method: HttpMethod.POST,
|
||||
accessToken,
|
||||
resourceUri: `/status/space/${spaceId}/`,
|
||||
body,
|
||||
queryParams,
|
||||
});
|
||||
|
||||
return response;
|
||||
},
|
||||
});
|
||||
@@ -0,0 +1,255 @@
|
||||
import { createAction, Property } from '@activepieces/pieces-framework';
|
||||
import { HttpMethod } from '@activepieces/pieces-common';
|
||||
import { podioAuth } from '../../index';
|
||||
import { podioApiCall, getAccessToken, dynamicRefTypeProperty, dynamicRefIdProperty, dynamicAppProperty, dynamicSpaceProperty, dynamicOrgProperty, hookProperty, silentProperty } from '../common';
|
||||
|
||||
export const createTaskAction = createAction({
|
||||
auth: podioAuth,
|
||||
name: 'create_task',
|
||||
displayName: 'Create Task',
|
||||
description: 'Add a new task to an item or workspace with due dates, assignees, and attachments.',
|
||||
props: {
|
||||
text: Property.LongText({
|
||||
displayName: 'Task Text',
|
||||
description: 'The description or text of the task',
|
||||
required: true,
|
||||
}),
|
||||
description: Property.LongText({
|
||||
displayName: 'Description',
|
||||
description: 'Additional description for the task',
|
||||
required: false,
|
||||
}),
|
||||
private: Property.Checkbox({
|
||||
displayName: 'Private',
|
||||
description: 'Whether the task should be private (only creator, assignee and assignor can see it)',
|
||||
required: false,
|
||||
defaultValue: false,
|
||||
}),
|
||||
|
||||
dueDate: Property.DateTime({
|
||||
displayName: 'Due Date',
|
||||
description: 'Due date in local time (date only)',
|
||||
required: false,
|
||||
}),
|
||||
dueTime: Property.ShortText({
|
||||
displayName: 'Due Time',
|
||||
description: 'Due time in local time (HH:MM:SS format, e.g., "14:30:00")',
|
||||
required: false,
|
||||
}),
|
||||
dueOn: Property.DateTime({
|
||||
displayName: 'Due Date & Time (UTC)',
|
||||
description: 'Complete due date and time in UTC. Alternative to separate date/time fields.',
|
||||
required: false,
|
||||
}),
|
||||
|
||||
orgId: dynamicOrgProperty,
|
||||
spaceId: dynamicSpaceProperty,
|
||||
appId: dynamicAppProperty,
|
||||
|
||||
refType: dynamicRefTypeProperty,
|
||||
refId: dynamicRefIdProperty,
|
||||
|
||||
responsible: Property.Object({
|
||||
displayName: 'Responsible Person',
|
||||
description: 'Who is responsible for this task. Can be a user ID (number) or contact identifier object with type and id.',
|
||||
required: false,
|
||||
}),
|
||||
|
||||
fileIds: Property.Array({
|
||||
displayName: 'File IDs',
|
||||
description: 'List of file IDs to attach to this task',
|
||||
required: false,
|
||||
}),
|
||||
labels: Property.Array({
|
||||
displayName: 'Labels (Text)',
|
||||
description: 'List of label names in text form',
|
||||
required: false,
|
||||
}),
|
||||
labelIds: Property.Array({
|
||||
displayName: 'Label IDs',
|
||||
description: 'List of label IDs (alternative to text labels)',
|
||||
required: false,
|
||||
}),
|
||||
|
||||
reminder: Property.Object({
|
||||
displayName: 'Reminder',
|
||||
description: 'Reminder settings. Format: {"remind_delta": minutes_before_due_date}',
|
||||
required: false,
|
||||
}),
|
||||
recurrence: Property.Object({
|
||||
displayName: 'Recurrence',
|
||||
description: 'Recurring task settings. Format: {"name": "weekly|monthly|yearly", "config": {...}, "step": 1, "until": "date"}',
|
||||
required: false,
|
||||
}),
|
||||
|
||||
externalId: Property.ShortText({
|
||||
displayName: 'External ID',
|
||||
description: 'External system identifier for this task',
|
||||
required: false,
|
||||
}),
|
||||
|
||||
hook: hookProperty,
|
||||
silent: silentProperty,
|
||||
},
|
||||
async run(context) {
|
||||
console.log('🔍 [Podio Task] Action run started with propsValue:', JSON.stringify(context.propsValue, null, 2));
|
||||
|
||||
const accessToken = getAccessToken(context.auth);
|
||||
const {
|
||||
text,
|
||||
description,
|
||||
private: isPrivate,
|
||||
dueDate,
|
||||
dueTime,
|
||||
dueOn,
|
||||
orgId,
|
||||
spaceId,
|
||||
appId,
|
||||
refType,
|
||||
refId,
|
||||
responsible,
|
||||
fileIds,
|
||||
labels,
|
||||
labelIds,
|
||||
reminder,
|
||||
recurrence,
|
||||
externalId,
|
||||
hook,
|
||||
silent
|
||||
} = context.propsValue;
|
||||
|
||||
if (!text || typeof text !== 'string' || text.trim().length === 0) {
|
||||
throw new Error('Task text is required and cannot be empty.');
|
||||
}
|
||||
|
||||
if (refType && !refId) {
|
||||
throw new Error('Reference Object is required when Reference Type is specified. Please select an object from the dropdown.');
|
||||
}
|
||||
|
||||
if (!refType && refId) {
|
||||
throw new Error('Reference Type is required when Reference Object is specified. Please select a reference type first.');
|
||||
}
|
||||
|
||||
if (refType === 'item' && !appId) {
|
||||
throw new Error('App selection is required when referencing items. Please select an app first.');
|
||||
}
|
||||
|
||||
if ((refType === 'status' || refType === 'task') && !spaceId) {
|
||||
throw new Error('Space selection is required when referencing status updates or tasks. Please select a space first.');
|
||||
}
|
||||
|
||||
if (fileIds && !Array.isArray(fileIds)) {
|
||||
throw new Error('File IDs must be provided as an array of numbers.');
|
||||
}
|
||||
|
||||
if (labels && !Array.isArray(labels)) {
|
||||
throw new Error('Labels must be provided as an array of strings.');
|
||||
}
|
||||
|
||||
if (labelIds && !Array.isArray(labelIds)) {
|
||||
throw new Error('Label IDs must be provided as an array of numbers.');
|
||||
}
|
||||
|
||||
if (reminder && typeof reminder !== 'object') {
|
||||
throw new Error('Reminder must be an object with remind_delta property.');
|
||||
}
|
||||
|
||||
if (recurrence && typeof recurrence !== 'object') {
|
||||
throw new Error('Recurrence must be an object with name and config properties.');
|
||||
}
|
||||
|
||||
const body: any = {
|
||||
text: text.trim(),
|
||||
};
|
||||
|
||||
if (description && description.trim()) {
|
||||
body.description = description.trim();
|
||||
}
|
||||
|
||||
if (typeof isPrivate === 'boolean') {
|
||||
body.private = isPrivate;
|
||||
}
|
||||
|
||||
if (dueOn) {
|
||||
body.due_on = dueOn;
|
||||
} else if (dueDate || dueTime) {
|
||||
if (dueDate) {
|
||||
body.due_date = dueDate;
|
||||
}
|
||||
if (dueTime) {
|
||||
body.due_time = dueTime;
|
||||
}
|
||||
}
|
||||
|
||||
if (refType && refId) {
|
||||
body.ref_type = refType;
|
||||
body.ref_id = refId;
|
||||
}
|
||||
|
||||
if (responsible) {
|
||||
body.responsible = responsible;
|
||||
}
|
||||
|
||||
if (fileIds && Array.isArray(fileIds) && fileIds.length > 0) {
|
||||
body.file_ids = fileIds.filter((id: unknown) => typeof id === 'number' || (typeof id === 'string' && !isNaN(Number(id))));
|
||||
}
|
||||
|
||||
if (labels && Array.isArray(labels) && labels.length > 0) {
|
||||
body.labels = labels
|
||||
.filter((label: unknown): label is string => typeof label === 'string' && label.trim().length > 0)
|
||||
.map((label: string) => label.trim());
|
||||
} else if (labelIds && Array.isArray(labelIds) && labelIds.length > 0) {
|
||||
body.label_ids = labelIds.filter((id: unknown) => typeof id === 'number' || (typeof id === 'string' && !isNaN(Number(id))));
|
||||
}
|
||||
|
||||
if (reminder && typeof reminder === 'object' && Object.keys(reminder).length > 0) {
|
||||
if (reminder['remind_delta'] && typeof reminder['remind_delta'] === 'number') {
|
||||
body.reminder = reminder;
|
||||
}
|
||||
}
|
||||
|
||||
if (recurrence && typeof recurrence === 'object' && Object.keys(recurrence).length > 0) {
|
||||
if (recurrence['name'] && recurrence['config']) {
|
||||
body.recurrence = recurrence;
|
||||
}
|
||||
}
|
||||
|
||||
if (externalId && externalId.trim()) {
|
||||
body.external_id = externalId.trim();
|
||||
}
|
||||
|
||||
const queryParams: any = {};
|
||||
if (typeof hook === 'boolean') {
|
||||
queryParams.hook = hook.toString();
|
||||
}
|
||||
if (typeof silent === 'boolean') {
|
||||
queryParams.silent = silent.toString();
|
||||
}
|
||||
|
||||
let resourceUri = '/task/';
|
||||
|
||||
if (refType && refId) {
|
||||
resourceUri = `/task/${refType}/${refId}/`;
|
||||
|
||||
delete body.ref_type;
|
||||
delete body.ref_id;
|
||||
} else {
|
||||
console.log('🔍 [Podio Task] Using general task endpoint:', resourceUri);
|
||||
}
|
||||
|
||||
const response = await podioApiCall<{
|
||||
task_id: number;
|
||||
text: string;
|
||||
[key: string]: any;
|
||||
}>({
|
||||
method: HttpMethod.POST,
|
||||
accessToken,
|
||||
resourceUri,
|
||||
body,
|
||||
queryParams,
|
||||
});
|
||||
|
||||
|
||||
return response;
|
||||
},
|
||||
});
|
||||
@@ -0,0 +1,146 @@
|
||||
import { createAction, Property } from '@activepieces/pieces-framework';
|
||||
import { HttpMethod } from '@activepieces/pieces-common';
|
||||
import { podioAuth } from '../../index';
|
||||
import { podioApiCall, getAccessToken, dynamicAppProperty, dynamicItemProperty, limitProperty, offsetProperty, dynamicOrgProperty, dynamicSpaceProperty } from '../common';
|
||||
|
||||
export const findItemAction = createAction({
|
||||
auth: podioAuth,
|
||||
name: 'find_item',
|
||||
displayName: 'Find Item',
|
||||
description: 'Retrieve a single item by ID or field value.',
|
||||
props: {
|
||||
searchType: Property.Dropdown({
|
||||
auth: podioAuth,
|
||||
displayName: 'Search Method',
|
||||
description: 'How to find the item',
|
||||
required: true,
|
||||
refreshers: [],
|
||||
options: async () => {
|
||||
return {
|
||||
options: [
|
||||
{ label: 'Get by Item ID', value: 'by_id' },
|
||||
{ label: 'Filter Items in App', value: 'filter' },
|
||||
],
|
||||
};
|
||||
},
|
||||
}),
|
||||
|
||||
itemId: Property.Number({
|
||||
displayName: 'Item ID',
|
||||
description: 'The specific item ID to retrieve',
|
||||
required: false,
|
||||
}),
|
||||
selectedItem: dynamicItemProperty,
|
||||
markAsViewed: Property.Checkbox({
|
||||
displayName: 'Mark as Viewed',
|
||||
description: 'Mark any new notifications on this item as viewed',
|
||||
required: false,
|
||||
defaultValue: true,
|
||||
}),
|
||||
|
||||
orgId: dynamicOrgProperty,
|
||||
spaceId: dynamicSpaceProperty,
|
||||
appId: dynamicAppProperty,
|
||||
|
||||
filters: Property.Object({
|
||||
displayName: 'Search Filters',
|
||||
description: 'Filter criteria as JSON object. Use field external_id as keys.',
|
||||
required: false,
|
||||
}),
|
||||
|
||||
limit: limitProperty,
|
||||
offset: offsetProperty,
|
||||
sortBy: Property.ShortText({
|
||||
displayName: 'Sort By',
|
||||
description: 'Field to sort results by (e.g., "created_on", "last_edit_on")',
|
||||
required: false,
|
||||
}),
|
||||
sortDesc: Property.Checkbox({
|
||||
displayName: 'Sort Descending',
|
||||
description: 'Sort results in descending order',
|
||||
required: false,
|
||||
defaultValue: false,
|
||||
}),
|
||||
},
|
||||
async run(context) {
|
||||
const accessToken = getAccessToken(context.auth);
|
||||
const {
|
||||
searchType,
|
||||
itemId,
|
||||
selectedItem,
|
||||
markAsViewed,
|
||||
orgId,
|
||||
spaceId,
|
||||
appId,
|
||||
filters,
|
||||
limit,
|
||||
offset,
|
||||
sortBy,
|
||||
sortDesc
|
||||
} = context.propsValue;
|
||||
|
||||
if (searchType === 'by_id') {
|
||||
const finalItemId = selectedItem || itemId;
|
||||
|
||||
if (!finalItemId) {
|
||||
throw new Error('Item ID is required. Please provide an item ID or select an item from the dropdown.');
|
||||
}
|
||||
|
||||
const queryParams: any = {};
|
||||
if (typeof markAsViewed === 'boolean') {
|
||||
queryParams.mark_as_viewed = markAsViewed.toString();
|
||||
}
|
||||
|
||||
const response = await podioApiCall({
|
||||
method: HttpMethod.GET,
|
||||
accessToken,
|
||||
resourceUri: `/item/${finalItemId}`,
|
||||
queryParams,
|
||||
});
|
||||
|
||||
return response;
|
||||
} else if (searchType === 'filter') {
|
||||
if (!appId) {
|
||||
throw new Error('App selection is required for filtering. Please select an app first.');
|
||||
}
|
||||
|
||||
if (limit && (limit < 1 || limit > 500)) {
|
||||
throw new Error('Limit must be between 1 and 500.');
|
||||
}
|
||||
|
||||
if (offset && offset < 0) {
|
||||
throw new Error('Offset must be 0 or greater.');
|
||||
}
|
||||
|
||||
const body: any = {};
|
||||
|
||||
if (filters && typeof filters === 'object' && Object.keys(filters).length > 0) {
|
||||
body.filters = filters;
|
||||
}
|
||||
|
||||
if (limit) {
|
||||
body.limit = limit;
|
||||
}
|
||||
|
||||
if (offset) {
|
||||
body.offset = offset;
|
||||
}
|
||||
|
||||
if (sortBy && sortBy.trim()) {
|
||||
body.sort_by = sortBy.trim();
|
||||
body.sort_desc = Boolean(sortDesc);
|
||||
}
|
||||
|
||||
const response = await podioApiCall({
|
||||
method: HttpMethod.POST,
|
||||
accessToken,
|
||||
resourceUri: `/item/app/${appId}/filter/`,
|
||||
body,
|
||||
});
|
||||
|
||||
return response;
|
||||
} else {
|
||||
throw new Error('Invalid search method. Please select either "Get by Item ID" or "Filter Items in App".');
|
||||
}
|
||||
},
|
||||
});
|
||||
@@ -0,0 +1,30 @@
|
||||
import { createAction, Property } from '@activepieces/pieces-framework';
|
||||
import { HttpMethod } from '@activepieces/pieces-common';
|
||||
import { podioAuth } from '../../index';
|
||||
import { podioApiCall, getAccessToken, dynamicTaskProperty } from '../common';
|
||||
|
||||
export const findTaskAction = createAction({
|
||||
auth: podioAuth,
|
||||
name: 'find_task',
|
||||
displayName: 'Find Task',
|
||||
description: 'Retrieve a task by ID for further updates.',
|
||||
props: {
|
||||
taskId: dynamicTaskProperty,
|
||||
},
|
||||
async run(context) {
|
||||
const accessToken = getAccessToken(context.auth);
|
||||
const { taskId } = context.propsValue;
|
||||
|
||||
if (!taskId) {
|
||||
throw new Error('Task selection is required. Please select a task from the dropdown.');
|
||||
}
|
||||
|
||||
const response = await podioApiCall<any>({
|
||||
method: HttpMethod.GET,
|
||||
accessToken,
|
||||
resourceUri: `/task/${taskId}`,
|
||||
});
|
||||
|
||||
return response;
|
||||
},
|
||||
});
|
||||
@@ -0,0 +1,385 @@
|
||||
import { createAction, Property } from '@activepieces/pieces-framework';
|
||||
import { HttpMethod } from '@activepieces/pieces-common';
|
||||
import { podioAuth } from '../../index';
|
||||
import { podioApiCall, getAccessToken, silentProperty, hookProperty, dynamicAppProperty, dynamicItemProperty, formatFieldValues } from '../common';
|
||||
|
||||
export const updateItemAction = createAction({
|
||||
auth: podioAuth,
|
||||
name: 'update_item',
|
||||
displayName: 'Update Item',
|
||||
description: 'Update an existing record in a Podio app with specified field values. Only provided fields will be updated.',
|
||||
props: {
|
||||
appId: dynamicAppProperty,
|
||||
itemId: dynamicItemProperty,
|
||||
appFields: Property.DynamicProperties({
|
||||
auth: podioAuth,
|
||||
displayName: 'App Fields',
|
||||
description: 'Configure values for the fields you want to update in the selected app',
|
||||
required: false,
|
||||
refreshers: ['appId'],
|
||||
props: async ({ auth, appId }) => {
|
||||
if (!auth || !appId) {
|
||||
return {};
|
||||
}
|
||||
|
||||
try {
|
||||
const accessToken = getAccessToken(auth as any);
|
||||
const app = await podioApiCall<any>({
|
||||
method: HttpMethod.GET,
|
||||
accessToken,
|
||||
resourceUri: `/app/${appId}`,
|
||||
queryParams: { view: 'full' }
|
||||
});
|
||||
|
||||
|
||||
|
||||
const fields = app.fields || [];
|
||||
|
||||
|
||||
if (!fields || fields.length === 0) {
|
||||
return {};
|
||||
}
|
||||
|
||||
const fieldProperties: Record<string, any> = {};
|
||||
|
||||
for (const field of fields) {
|
||||
try {
|
||||
const fieldKey = `field_${field.field_id}`;
|
||||
const fieldConfig = field.config;
|
||||
const fieldType = field.type;
|
||||
const isRequired = false;
|
||||
|
||||
|
||||
|
||||
const baseProps = {
|
||||
displayName: fieldConfig.label,
|
||||
description: fieldConfig.description || `Update value for ${fieldConfig.label}`,
|
||||
required: isRequired,
|
||||
};
|
||||
|
||||
switch (fieldType) {
|
||||
case 'text':
|
||||
fieldProperties[fieldKey] = Property.LongText({
|
||||
...baseProps,
|
||||
description: `${baseProps.description}. Supports plain text, markdown, or HTML.`,
|
||||
});
|
||||
break;
|
||||
|
||||
case 'number':
|
||||
fieldProperties[fieldKey] = Property.Number({
|
||||
...baseProps,
|
||||
description: `${baseProps.description}. Enter a numeric value.`,
|
||||
});
|
||||
break;
|
||||
|
||||
case 'money':
|
||||
fieldProperties[fieldKey] = Property.Object({
|
||||
...baseProps,
|
||||
description: `${baseProps.description}. Format: {"value": "amount", "currency": "USD"}`,
|
||||
});
|
||||
break;
|
||||
|
||||
case 'date':
|
||||
fieldProperties[fieldKey] = Property.Object({
|
||||
...baseProps,
|
||||
description: `${baseProps.description}. Format: {"start_date": "YYYY-MM-DD", "start_time": "HH:MM:SS", "end_date": "YYYY-MM-DD", "end_time": "HH:MM:SS"}`,
|
||||
});
|
||||
break;
|
||||
|
||||
case 'contact':
|
||||
fieldProperties[fieldKey] = Property.Number({
|
||||
...baseProps,
|
||||
description: `${baseProps.description}. Enter the Podio profile ID of the contact.`,
|
||||
});
|
||||
break;
|
||||
|
||||
case 'member':
|
||||
fieldProperties[fieldKey] = Property.Number({
|
||||
...baseProps,
|
||||
description: `${baseProps.description}. Enter the Podio user ID of the member.`,
|
||||
});
|
||||
break;
|
||||
|
||||
case 'app':
|
||||
fieldProperties[fieldKey] = Property.Number({
|
||||
...baseProps,
|
||||
description: `${baseProps.description}. Enter the ID of the item from the linked app.`,
|
||||
});
|
||||
break;
|
||||
|
||||
case 'category':
|
||||
case 'status': {
|
||||
|
||||
let staticOptions: Array<{label: string, value: any}> = [];
|
||||
|
||||
if (fieldConfig.settings?.options && Array.isArray(fieldConfig.settings.options)) {
|
||||
staticOptions = fieldConfig.settings.options.map((option: any) => ({
|
||||
label: option.text || option.name || option.value || `Option ${option.id}`,
|
||||
value: option.id || option.value,
|
||||
}));
|
||||
}
|
||||
|
||||
if (staticOptions.length > 0) {
|
||||
fieldProperties[fieldKey] = Property.StaticDropdown({
|
||||
...baseProps,
|
||||
options: {
|
||||
options: staticOptions,
|
||||
},
|
||||
});
|
||||
} else {
|
||||
fieldProperties[fieldKey] = Property.Number({
|
||||
...baseProps,
|
||||
description: `${baseProps.description}. Enter the ${fieldType} option ID manually.`,
|
||||
});
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
case 'email':
|
||||
fieldProperties[fieldKey] = Property.Object({
|
||||
...baseProps,
|
||||
description: `${baseProps.description}. Format: {"value": "email@example.com", "type": "work|home|other"}`,
|
||||
});
|
||||
break;
|
||||
|
||||
case 'phone':
|
||||
fieldProperties[fieldKey] = Property.Object({
|
||||
...baseProps,
|
||||
description: `${baseProps.description}. Format: {"value": "phone_number", "type": "mobile|work|home|main|work_fax|private_fax|other"}`,
|
||||
});
|
||||
break;
|
||||
|
||||
case 'location':
|
||||
fieldProperties[fieldKey] = Property.ShortText({
|
||||
...baseProps,
|
||||
description: `${baseProps.description}. Enter a location (address, coordinates, etc.)`,
|
||||
});
|
||||
break;
|
||||
|
||||
case 'image':
|
||||
case 'file':
|
||||
fieldProperties[fieldKey] = Property.Number({
|
||||
...baseProps,
|
||||
description: `${baseProps.description}. Enter the file ID of the uploaded ${fieldType}.`,
|
||||
});
|
||||
break;
|
||||
|
||||
case 'progress':
|
||||
fieldProperties[fieldKey] = Property.Number({
|
||||
...baseProps,
|
||||
description: `${baseProps.description}. Enter a value between 0 and 100.`,
|
||||
});
|
||||
break;
|
||||
|
||||
default:
|
||||
fieldProperties[fieldKey] = Property.ShortText({
|
||||
...baseProps,
|
||||
description: `${baseProps.description}. Field type: ${fieldType}`,
|
||||
});
|
||||
}
|
||||
} catch (fieldError) {
|
||||
|
||||
const fieldKey = `field_${field.field_id}`;
|
||||
fieldProperties[fieldKey] = Property.ShortText({
|
||||
displayName: `${field.config?.label || 'Unknown Field'} (Fallback)`,
|
||||
description: `Field type "${field.type}" - Manual entry required. Original error: ${fieldError instanceof Error ? fieldError.message : 'Unknown error'}`,
|
||||
required: false,
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
return fieldProperties;
|
||||
} catch (error) {
|
||||
return {};
|
||||
}
|
||||
},
|
||||
}),
|
||||
revision: Property.Number({
|
||||
displayName: 'Revision',
|
||||
description: 'The revision of the item that is being updated. Optional for conflict detection.',
|
||||
required: false,
|
||||
}),
|
||||
externalId: Property.ShortText({
|
||||
displayName: 'External ID',
|
||||
description: 'The new external_id of the item',
|
||||
required: false,
|
||||
}),
|
||||
legacyFields: Property.Object({
|
||||
displayName: 'Legacy Fields (Advanced)',
|
||||
description: 'Manual field configuration using field_id or external_id as keys. Use this for advanced scenarios or when dynamic fields are not sufficient.',
|
||||
required: false,
|
||||
}),
|
||||
fileIds: Property.Array({
|
||||
displayName: 'File IDs',
|
||||
description: 'The list of attachments',
|
||||
required: false,
|
||||
}),
|
||||
tags: Property.Array({
|
||||
displayName: 'Tags',
|
||||
description: 'The list of tags',
|
||||
required: false,
|
||||
}),
|
||||
reminder: Property.Object({
|
||||
displayName: 'Reminder',
|
||||
description: 'Optional reminder on this item. Format: {"remind_delta": minutes_before_due_date}',
|
||||
required: false,
|
||||
}),
|
||||
recurrence: Property.Object({
|
||||
displayName: 'Recurrence',
|
||||
description: 'The recurrence for the task, if any. Format: {"name": "weekly|monthly|yearly", "config": {...}, "step": 1, "until": "date"}',
|
||||
required: false,
|
||||
}),
|
||||
linkedAccountId: Property.Number({
|
||||
displayName: 'Linked Account ID',
|
||||
description: 'The linked account to use for meetings',
|
||||
required: false,
|
||||
}),
|
||||
ref: Property.Object({
|
||||
displayName: 'Reference',
|
||||
description: 'The reference of the item. Format: {"type": "reference_type", "id": reference_id}',
|
||||
required: false,
|
||||
}),
|
||||
hook: hookProperty,
|
||||
silent: silentProperty,
|
||||
},
|
||||
async run(context) {
|
||||
const accessToken = getAccessToken(context.auth);
|
||||
const {
|
||||
appId,
|
||||
itemId,
|
||||
appFields,
|
||||
revision,
|
||||
externalId,
|
||||
legacyFields,
|
||||
fileIds,
|
||||
tags,
|
||||
reminder,
|
||||
recurrence,
|
||||
linkedAccountId,
|
||||
ref,
|
||||
hook,
|
||||
silent
|
||||
} = context.propsValue;
|
||||
|
||||
if (!appId) {
|
||||
throw new Error('App selection is required to update an item. Please select an app first.');
|
||||
}
|
||||
|
||||
if (!itemId) {
|
||||
throw new Error('Item selection is required to update an item. Please select an item from the dropdown.');
|
||||
}
|
||||
|
||||
let formattedFields: Record<string, any> = {};
|
||||
|
||||
if (appFields && Object.keys(appFields).length > 0) {
|
||||
try {
|
||||
|
||||
const app = await podioApiCall<any>({
|
||||
method: HttpMethod.GET,
|
||||
accessToken,
|
||||
resourceUri: `/app/${appId}`,
|
||||
queryParams: { view: 'full' }
|
||||
});
|
||||
|
||||
const fieldDefinitions = app.fields || [];
|
||||
|
||||
formattedFields = formatFieldValues(fieldDefinitions, appFields);
|
||||
} catch (error) {
|
||||
throw new Error(`Failed to process app fields: ${error instanceof Error ? error.message : 'Unknown error'}`);
|
||||
}
|
||||
}
|
||||
|
||||
if (legacyFields && typeof legacyFields === 'object' && Object.keys(legacyFields).length > 0) {
|
||||
formattedFields = { ...formattedFields, ...legacyFields };
|
||||
}
|
||||
|
||||
if (fileIds && !Array.isArray(fileIds)) {
|
||||
throw new Error('File IDs must be provided as an array of numbers.');
|
||||
}
|
||||
|
||||
if (tags && !Array.isArray(tags)) {
|
||||
throw new Error('Tags must be provided as an array of strings.');
|
||||
}
|
||||
|
||||
if (reminder && reminder['remind_delta'] !== undefined && typeof reminder['remind_delta'] !== 'number') {
|
||||
throw new Error('Reminder remind_delta must be a number representing minutes before due date.');
|
||||
}
|
||||
|
||||
if (linkedAccountId && typeof linkedAccountId !== 'number') {
|
||||
throw new Error('Linked Account ID must be a number.');
|
||||
}
|
||||
|
||||
if (ref && (!ref['type'] || !ref['id'])) {
|
||||
throw new Error('Reference must include both "type" and "id" properties.');
|
||||
}
|
||||
|
||||
const body: any = {};
|
||||
|
||||
if (revision !== undefined) {
|
||||
if (typeof revision !== 'number') {
|
||||
throw new Error('Revision must be a number.');
|
||||
}
|
||||
body.revision = revision;
|
||||
}
|
||||
|
||||
if (externalId && externalId.trim()) {
|
||||
body.external_id = externalId.trim();
|
||||
}
|
||||
|
||||
if (Object.keys(formattedFields).length > 0) {
|
||||
body.fields = formattedFields;
|
||||
}
|
||||
|
||||
if (fileIds && Array.isArray(fileIds) && fileIds.length > 0) {
|
||||
body.file_ids = fileIds;
|
||||
}
|
||||
|
||||
if (tags && Array.isArray(tags) && tags.length > 0) {
|
||||
body.tags = tags;
|
||||
}
|
||||
|
||||
if (reminder && typeof reminder === 'object' && Object.keys(reminder).length > 0) {
|
||||
if (reminder['remind_delta'] && typeof reminder['remind_delta'] === 'number') {
|
||||
body.reminder = reminder;
|
||||
}
|
||||
}
|
||||
|
||||
if (recurrence && typeof recurrence === 'object' && Object.keys(recurrence).length > 0) {
|
||||
if (recurrence['name'] && recurrence['config']) {
|
||||
body.recurrence = recurrence;
|
||||
}
|
||||
}
|
||||
|
||||
if (linkedAccountId) {
|
||||
body.linked_account_id = linkedAccountId;
|
||||
}
|
||||
|
||||
if (ref && typeof ref === 'object' && Object.keys(ref).length > 0) {
|
||||
if (ref['type'] && ref['id']) {
|
||||
body.ref = ref;
|
||||
}
|
||||
}
|
||||
|
||||
const queryParams: any = {};
|
||||
if (typeof hook === 'boolean') {
|
||||
queryParams.hook = hook.toString();
|
||||
}
|
||||
if (typeof silent === 'boolean') {
|
||||
queryParams.silent = silent.toString();
|
||||
}
|
||||
|
||||
const response = await podioApiCall<{
|
||||
revision: number;
|
||||
title: string;
|
||||
}>({
|
||||
method: HttpMethod.PUT,
|
||||
accessToken,
|
||||
resourceUri: `/item/${itemId}`,
|
||||
body,
|
||||
queryParams,
|
||||
});
|
||||
|
||||
return response;
|
||||
},
|
||||
});
|
||||
@@ -0,0 +1,238 @@
|
||||
import { createAction, Property } from '@activepieces/pieces-framework';
|
||||
import { HttpMethod } from '@activepieces/pieces-common';
|
||||
import { podioAuth } from '../../index';
|
||||
import { podioApiCall, getAccessToken, dynamicTaskProperty, hookProperty, silentProperty, dynamicRefTypeProperty, dynamicRefIdProperty, dynamicAppProperty, dynamicSpaceProperty, dynamicOrgProperty } from '../common';
|
||||
|
||||
export const updateTaskAction = createAction({
|
||||
auth: podioAuth,
|
||||
name: 'update_task',
|
||||
displayName: 'Update Task',
|
||||
description: 'Modify an existing task\'s details or status. Only specified fields will be updated.',
|
||||
props: {
|
||||
taskId: dynamicTaskProperty,
|
||||
text: Property.LongText({
|
||||
displayName: 'Text',
|
||||
description: 'The updated text (title) for the task',
|
||||
required: false,
|
||||
}),
|
||||
description: Property.LongText({
|
||||
displayName: 'Description',
|
||||
description: 'The updated description for the task',
|
||||
required: false,
|
||||
}),
|
||||
dueDate: Property.DateTime({
|
||||
displayName: 'Due Date',
|
||||
description: 'The new due date for the task (in users timezone)',
|
||||
required: false,
|
||||
}),
|
||||
dueTime: Property.ShortText({
|
||||
displayName: 'Due Time',
|
||||
description: 'The new due time for the task in local timezone (HH:MM:SS format, e.g., "14:30:00")',
|
||||
required: false,
|
||||
}),
|
||||
private: Property.Checkbox({
|
||||
displayName: 'Private',
|
||||
description: 'Whether the task should be private (only creator, assignee and assignor can see it)',
|
||||
required: false,
|
||||
}),
|
||||
completed: Property.Checkbox({
|
||||
displayName: 'Completed',
|
||||
description: 'Mark the task as completed or not completed',
|
||||
required: false,
|
||||
}),
|
||||
|
||||
orgId: dynamicOrgProperty,
|
||||
spaceId: dynamicSpaceProperty,
|
||||
appId: dynamicAppProperty,
|
||||
|
||||
refType: dynamicRefTypeProperty,
|
||||
refId: dynamicRefIdProperty,
|
||||
|
||||
responsible: Property.Number({
|
||||
displayName: 'Responsible User ID',
|
||||
description: 'The user ID of the person responsible for this task',
|
||||
required: false,
|
||||
}),
|
||||
labels: Property.Array({
|
||||
displayName: 'Labels',
|
||||
description: 'The labels for the task. Either a list of label ids or label texts',
|
||||
required: false,
|
||||
}),
|
||||
fileIds: Property.Array({
|
||||
displayName: 'File IDs',
|
||||
description: 'The list of files that should be attached to the task',
|
||||
required: false,
|
||||
}),
|
||||
reminder: Property.Object({
|
||||
displayName: 'Reminder',
|
||||
description: 'Optional reminder on this task. Format: {"remind_delta": minutes_before_due_date}. If empty, existing reminder is deleted.',
|
||||
required: false,
|
||||
}),
|
||||
hook: hookProperty,
|
||||
silent: silentProperty,
|
||||
},
|
||||
async run(context) {
|
||||
const accessToken = getAccessToken(context.auth);
|
||||
const {
|
||||
taskId,
|
||||
text,
|
||||
description,
|
||||
dueDate,
|
||||
dueTime,
|
||||
private: isPrivate,
|
||||
completed,
|
||||
orgId,
|
||||
spaceId,
|
||||
appId,
|
||||
refType,
|
||||
refId,
|
||||
responsible,
|
||||
labels,
|
||||
fileIds,
|
||||
reminder,
|
||||
hook,
|
||||
silent
|
||||
} = context.propsValue;
|
||||
|
||||
if (!taskId) {
|
||||
throw new Error('Task ID is required to update a task. Please provide a valid task ID.');
|
||||
}
|
||||
|
||||
if (refType && !refId) {
|
||||
throw new Error('Reference Object is required when Reference Type is specified. Please select an object from the dropdown.');
|
||||
}
|
||||
|
||||
if (!refType && refId) {
|
||||
throw new Error('Reference Type is required when Reference Object is specified. Please select a reference type first.');
|
||||
}
|
||||
|
||||
if (refType === 'item' && !appId) {
|
||||
throw new Error('App selection is required when referencing items. Please select an app first.');
|
||||
}
|
||||
|
||||
if ((refType === 'status' || refType === 'task') && !spaceId) {
|
||||
throw new Error('Space selection is required when referencing status updates or tasks. Please select a space first.');
|
||||
}
|
||||
|
||||
if (fileIds && !Array.isArray(fileIds)) {
|
||||
throw new Error('File IDs must be provided as an array of numbers.');
|
||||
}
|
||||
|
||||
if (labels && !Array.isArray(labels)) {
|
||||
throw new Error('Labels must be provided as an array of strings or numbers.');
|
||||
}
|
||||
|
||||
if (reminder && typeof reminder === 'object' && reminder['remind_delta'] !== undefined) {
|
||||
if (typeof reminder['remind_delta'] !== 'number' && reminder['remind_delta'] !== null) {
|
||||
throw new Error('Reminder remind_delta must be a number (minutes before due date) or null to delete existing reminder.');
|
||||
}
|
||||
}
|
||||
|
||||
const body: any = {};
|
||||
let updateCount = 0;
|
||||
|
||||
if (text !== undefined) {
|
||||
if (typeof text !== 'string') {
|
||||
throw new Error('Text must be a string.');
|
||||
}
|
||||
body.text = text;
|
||||
updateCount++;
|
||||
}
|
||||
|
||||
if (description !== undefined) {
|
||||
if (typeof description !== 'string') {
|
||||
throw new Error('Description must be a string.');
|
||||
}
|
||||
body.description = description;
|
||||
updateCount++;
|
||||
}
|
||||
|
||||
if (dueDate !== undefined) {
|
||||
body.due_date = dueDate;
|
||||
updateCount++;
|
||||
}
|
||||
|
||||
if (dueTime !== undefined) {
|
||||
body.due_time = dueTime;
|
||||
updateCount++;
|
||||
}
|
||||
|
||||
if (typeof isPrivate === 'boolean') {
|
||||
body.private = isPrivate;
|
||||
updateCount++;
|
||||
}
|
||||
|
||||
if (typeof completed === 'boolean') {
|
||||
body.completed = completed;
|
||||
updateCount++;
|
||||
}
|
||||
|
||||
if (refType) {
|
||||
body.ref_type = refType;
|
||||
updateCount++;
|
||||
}
|
||||
|
||||
if (refId) {
|
||||
body.ref_id = refId;
|
||||
updateCount++;
|
||||
}
|
||||
|
||||
if (responsible !== undefined) {
|
||||
if (typeof responsible !== 'number') {
|
||||
throw new Error('Responsible user ID must be a number.');
|
||||
}
|
||||
body.responsible = responsible;
|
||||
updateCount++;
|
||||
}
|
||||
|
||||
if (labels && Array.isArray(labels) && labels.length > 0) {
|
||||
body.labels = labels.filter((label: unknown) =>
|
||||
(typeof label === 'string' && label.trim().length > 0) ||
|
||||
typeof label === 'number'
|
||||
);
|
||||
updateCount++;
|
||||
}
|
||||
|
||||
if (fileIds && Array.isArray(fileIds) && fileIds.length > 0) {
|
||||
body.file_ids = fileIds.filter((id: unknown) =>
|
||||
typeof id === 'number' || (typeof id === 'string' && !isNaN(Number(id)))
|
||||
);
|
||||
updateCount++;
|
||||
}
|
||||
|
||||
if (reminder && typeof reminder === 'object') {
|
||||
if (reminder['remind_delta'] === null || reminder['remind_delta'] === '') {
|
||||
body.reminder = { remind_delta: null };
|
||||
updateCount++;
|
||||
} else if (typeof reminder['remind_delta'] === 'number') {
|
||||
body.reminder = reminder;
|
||||
updateCount++;
|
||||
}
|
||||
}
|
||||
|
||||
if (updateCount === 0) {
|
||||
throw new Error('At least one field must be provided to update the task. Please specify which fields you want to modify.');
|
||||
}
|
||||
|
||||
const queryParams: any = {};
|
||||
if (typeof hook === 'boolean') {
|
||||
queryParams.hook = hook.toString();
|
||||
}
|
||||
if (typeof silent === 'boolean') {
|
||||
queryParams.silent = silent.toString();
|
||||
}
|
||||
|
||||
const response = await podioApiCall<{
|
||||
task_id: number;
|
||||
[key: string]: any;
|
||||
}>({
|
||||
method: HttpMethod.PUT,
|
||||
accessToken,
|
||||
resourceUri: `/task/${taskId}`,
|
||||
body,
|
||||
queryParams,
|
||||
});
|
||||
|
||||
return response;
|
||||
},
|
||||
});
|
||||
@@ -0,0 +1,48 @@
|
||||
import { OAuth2PropertyValue } from '@activepieces/pieces-framework';
|
||||
|
||||
export function getAccessToken(auth: OAuth2PropertyValue): string {
|
||||
return auth.access_token;
|
||||
}
|
||||
|
||||
export function getRefreshToken(auth: OAuth2PropertyValue): string | undefined {
|
||||
return auth.data?.['refresh_token'];
|
||||
}
|
||||
|
||||
export function isTokenExpired(auth: OAuth2PropertyValue): boolean {
|
||||
if (!auth.data?.['expires_in'] || !auth.data?.['claimed_at']) {
|
||||
return false;
|
||||
}
|
||||
|
||||
const secondsSinceEpoch = Math.round(Date.now() / 1000);
|
||||
const expiresIn = auth.data['expires_in'];
|
||||
const claimedAt = auth.data['claimed_at'];
|
||||
const refreshThreshold = 15 * 60; // 15 minutes buffer
|
||||
|
||||
return secondsSinceEpoch + refreshThreshold >= claimedAt + expiresIn;
|
||||
}
|
||||
|
||||
export function validateAuthData(auth: OAuth2PropertyValue): { valid: boolean; error?: string } {
|
||||
if (!auth) {
|
||||
return { valid: false, error: 'Authentication data is missing' };
|
||||
}
|
||||
|
||||
if (!auth.access_token) {
|
||||
return { valid: false, error: 'Access token is missing' };
|
||||
}
|
||||
|
||||
if (isTokenExpired(auth)) {
|
||||
return { valid: false, error: 'Access token has expired' };
|
||||
}
|
||||
|
||||
return { valid: true };
|
||||
}
|
||||
|
||||
export function getTokenType(auth: OAuth2PropertyValue): string {
|
||||
return auth.data?.['token_type'] || 'Bearer';
|
||||
}
|
||||
|
||||
export function getAuthorizationHeader(auth: OAuth2PropertyValue): string {
|
||||
const tokenType = getTokenType(auth);
|
||||
const accessToken = getAccessToken(auth);
|
||||
return `${tokenType} ${accessToken}`;
|
||||
}
|
||||
@@ -0,0 +1,128 @@
|
||||
import { HttpMethod, httpClient } from '@activepieces/pieces-common';
|
||||
|
||||
export const PODIO_API_URL = 'https://api.podio.com';
|
||||
|
||||
export interface PodioApiCallOptions {
|
||||
method: HttpMethod;
|
||||
accessToken: string;
|
||||
resourceUri: string;
|
||||
body?: any;
|
||||
queryParams?: Record<string, any>;
|
||||
}
|
||||
|
||||
export async function podioApiCall<T = any>(options: PodioApiCallOptions): Promise<T> {
|
||||
const { method, accessToken, resourceUri, body, queryParams } = options;
|
||||
|
||||
validateRequiredFields({ accessToken, resourceUri }, ['accessToken', 'resourceUri']);
|
||||
|
||||
const url = `${PODIO_API_URL}${resourceUri}`;
|
||||
|
||||
const headers: Record<string, string> = {
|
||||
'Authorization': `Bearer ${accessToken}`,
|
||||
'Content-Type': 'application/json',
|
||||
'Accept': 'application/json',
|
||||
};
|
||||
|
||||
try {
|
||||
const response = await httpClient.sendRequest<T>({
|
||||
method,
|
||||
url,
|
||||
headers,
|
||||
body: body ? JSON.stringify(body) : undefined,
|
||||
queryParams,
|
||||
});
|
||||
|
||||
return response.body;
|
||||
} catch (error: any) {
|
||||
const statusCode = error.response?.status || error.status;
|
||||
const errorBody = error.response?.body || error.body;
|
||||
|
||||
switch (statusCode) {
|
||||
case 400:
|
||||
throw new Error(`Bad Request: ${getErrorMessage(errorBody) || 'Invalid request parameters. Please check your input values.'}`);
|
||||
|
||||
case 401:
|
||||
throw new Error('Authentication failed. Your Podio access token is invalid or expired. Please reconnect your Podio account.');
|
||||
|
||||
case 403:
|
||||
throw new Error(`Access denied: ${getErrorMessage(errorBody) || 'You do not have permission to perform this action. Check your user permissions in Podio.'}`);
|
||||
|
||||
case 404:
|
||||
throw new Error(`Not found: ${getErrorMessage(errorBody) || 'The requested resource was not found. Please verify the ID is correct.'}`);
|
||||
|
||||
case 409:
|
||||
throw new Error(`Conflict: ${getErrorMessage(errorBody) || 'The item has been modified by someone else. Please refresh and try again.'}`);
|
||||
|
||||
case 420: {
|
||||
const rateLimitMsg = getRateLimitMessage(error.response?.headers);
|
||||
throw new Error(`Rate limit exceeded: ${rateLimitMsg}`);
|
||||
}
|
||||
|
||||
case 422:
|
||||
throw new Error(`Validation error: ${getErrorMessage(errorBody) || 'The provided data is invalid. Please check required fields and formats.'}`);
|
||||
|
||||
case 500:
|
||||
throw new Error('Podio server error. Please try again in a few minutes.');
|
||||
|
||||
case 502:
|
||||
case 503:
|
||||
case 504:
|
||||
throw new Error('Podio is temporarily unavailable. Please try again in a few minutes.');
|
||||
|
||||
default:
|
||||
throw new Error(`Request failed (${statusCode}): ${getErrorMessage(errorBody) || error.message || 'Unknown error occurred'}`);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
export function getErrorMessage(errorBody: any): string | null {
|
||||
if (!errorBody) return null;
|
||||
|
||||
if (typeof errorBody === 'string') {
|
||||
try {
|
||||
errorBody = JSON.parse(errorBody);
|
||||
} catch {
|
||||
return errorBody;
|
||||
}
|
||||
}
|
||||
|
||||
return errorBody.error_description ||
|
||||
errorBody.error ||
|
||||
errorBody.message ||
|
||||
(errorBody.errors && Array.isArray(errorBody.errors) ? errorBody.errors.join(', ') : null);
|
||||
}
|
||||
|
||||
export function getRateLimitMessage(headers: any): string {
|
||||
if (!headers) {
|
||||
return 'You have exceeded the API rate limit. Please wait before making more requests.';
|
||||
}
|
||||
|
||||
const resetTime = headers['x-rate-limit-reset'] || headers['X-Rate-Limit-Reset'];
|
||||
const limit = headers['x-rate-limit-limit'] || headers['X-Rate-Limit-Limit'];
|
||||
|
||||
if (resetTime) {
|
||||
const resetDate = new Date(parseInt(resetTime) * 1000);
|
||||
return `Rate limit exceeded (${limit || '1000'} calls/hour). Limit resets at ${resetDate.toLocaleTimeString()}.`;
|
||||
}
|
||||
|
||||
return 'Rate limit exceeded. Podio allows 1000 API calls per hour for most operations and 250 calls/hour for rate-limited operations.';
|
||||
}
|
||||
|
||||
export function validateRequiredFields(data: Record<string, any>, requiredFields: string[]): void {
|
||||
const missingFields = requiredFields.filter(field => {
|
||||
const value = data[field];
|
||||
return value === undefined || value === null || value === '';
|
||||
});
|
||||
|
||||
if (missingFields.length > 0) {
|
||||
throw new Error(`Missing required fields: ${missingFields.join(', ')}`);
|
||||
}
|
||||
}
|
||||
|
||||
export function validateArrayLimits(arrays: Array<{ name: string; value: any[]; maxLength: number }>): void {
|
||||
for (const { name, value, maxLength } of arrays) {
|
||||
if (Array.isArray(value) && value.length > maxLength) {
|
||||
throw new Error(`${name} cannot contain more than ${maxLength} items. Current count: ${value.length}`);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,3 @@
|
||||
export * from './auth';
|
||||
export * from './client';
|
||||
export * from './props';
|
||||
@@ -0,0 +1,783 @@
|
||||
import { Property } from '@activepieces/pieces-framework';
|
||||
import { HttpMethod } from '@activepieces/pieces-common';
|
||||
import { podioApiCall } from './client';
|
||||
import { getAccessToken } from './auth';
|
||||
import { podioAuth } from '../..';
|
||||
|
||||
export const appIdProperty = Property.Number({
|
||||
displayName: 'App ID',
|
||||
description: 'The ID of the Podio app',
|
||||
required: true,
|
||||
});
|
||||
|
||||
export const dynamicAppProperty = Property.Dropdown({
|
||||
auth: podioAuth,
|
||||
displayName: 'App',
|
||||
description: 'Select a Podio app',
|
||||
required: true,
|
||||
refreshers: ['spaceId'],
|
||||
options: async ({ auth, spaceId }) => {
|
||||
if (!auth) {
|
||||
return {
|
||||
disabled: true,
|
||||
placeholder: 'Connect your Podio account first',
|
||||
options: [],
|
||||
};
|
||||
}
|
||||
|
||||
try {
|
||||
const accessToken = getAccessToken(auth as any);
|
||||
|
||||
let resourceUri = '/app/';
|
||||
if (spaceId) {
|
||||
resourceUri = `/app/space/${spaceId}/`;
|
||||
}
|
||||
|
||||
const apps = await podioApiCall<any[]>({
|
||||
method: HttpMethod.GET,
|
||||
accessToken,
|
||||
resourceUri,
|
||||
});
|
||||
|
||||
if (!apps || apps.length === 0) {
|
||||
return {
|
||||
options: [],
|
||||
placeholder: spaceId ? 'No apps found in this space' : 'No apps found',
|
||||
};
|
||||
}
|
||||
|
||||
return {
|
||||
options: apps.map((app: any) => ({
|
||||
label: `${app.config?.name || app.name}${app.space ? ` (${app.space.name})` : ''}`,
|
||||
value: app.app_id,
|
||||
})),
|
||||
};
|
||||
} catch (error) {
|
||||
return {
|
||||
disabled: true,
|
||||
options: [],
|
||||
placeholder: 'Failed to load apps. Check your connection.',
|
||||
};
|
||||
}
|
||||
},
|
||||
});
|
||||
|
||||
export const dynamicSpaceProperty = Property.Dropdown({
|
||||
auth: podioAuth,
|
||||
displayName: 'Space',
|
||||
description: 'Select a Podio workspace',
|
||||
required: true,
|
||||
refreshers: ['orgId'],
|
||||
options: async ({ auth, orgId }) => {
|
||||
if (!auth) {
|
||||
return {
|
||||
disabled: true,
|
||||
placeholder: 'Connect your Podio account first',
|
||||
options: [],
|
||||
};
|
||||
}
|
||||
|
||||
if (!orgId) {
|
||||
return {
|
||||
disabled: true,
|
||||
placeholder: 'Select an organization first',
|
||||
options: [],
|
||||
};
|
||||
}
|
||||
|
||||
try {
|
||||
const accessToken = getAccessToken(auth as any);
|
||||
|
||||
const resourceUri = `/org/${orgId}/space/`;
|
||||
|
||||
const spaces = await podioApiCall<any[]>({
|
||||
method: HttpMethod.GET,
|
||||
accessToken,
|
||||
resourceUri,
|
||||
});
|
||||
|
||||
if (!spaces || spaces.length === 0) {
|
||||
return {
|
||||
options: [],
|
||||
placeholder: 'No spaces found in this organization',
|
||||
};
|
||||
}
|
||||
|
||||
return {
|
||||
options: spaces.map((space: any) => ({
|
||||
label: `${space.name}${space.org ? ` (${space.org.name})` : ''}`,
|
||||
value: space.space_id,
|
||||
})),
|
||||
};
|
||||
} catch (error) {
|
||||
return {
|
||||
disabled: true,
|
||||
options: [],
|
||||
placeholder: 'Failed to load spaces. Check your connection.',
|
||||
};
|
||||
}
|
||||
},
|
||||
});
|
||||
|
||||
export const dynamicOrgProperty = Property.Dropdown({
|
||||
auth: podioAuth,
|
||||
displayName: 'Organization',
|
||||
description: 'Select a Podio organization',
|
||||
required: true,
|
||||
refreshers: [],
|
||||
options: async ({ auth }) => {
|
||||
if (!auth) {
|
||||
return {
|
||||
disabled: true,
|
||||
placeholder: 'Connect your Podio account first',
|
||||
options: [],
|
||||
};
|
||||
}
|
||||
|
||||
try {
|
||||
const accessToken = getAccessToken(auth as any);
|
||||
|
||||
const orgs = await podioApiCall<any[]>({
|
||||
method: HttpMethod.GET,
|
||||
accessToken,
|
||||
resourceUri: '/org/',
|
||||
});
|
||||
|
||||
if (!orgs || orgs.length === 0) {
|
||||
return {
|
||||
options: [],
|
||||
placeholder: 'No organizations found',
|
||||
};
|
||||
}
|
||||
|
||||
return {
|
||||
options: orgs.map((org: any) => ({
|
||||
label: org.name,
|
||||
value: org.org_id,
|
||||
})),
|
||||
};
|
||||
} catch (error) {
|
||||
return {
|
||||
disabled: true,
|
||||
options: [],
|
||||
placeholder: 'Failed to load organizations. Check your connection.',
|
||||
};
|
||||
}
|
||||
},
|
||||
});
|
||||
|
||||
export const dynamicItemProperty = Property.Dropdown({
|
||||
auth: podioAuth,
|
||||
displayName: 'Item',
|
||||
description: 'Select a Podio item',
|
||||
required: true,
|
||||
refreshers: ['appId'],
|
||||
options: async ({ auth, appId }) => {
|
||||
if (!auth || !appId) {
|
||||
return {
|
||||
disabled: true,
|
||||
placeholder: !auth ? 'Connect your Podio account first' : 'Select an app first',
|
||||
options: [],
|
||||
};
|
||||
}
|
||||
|
||||
try {
|
||||
const accessToken = getAccessToken(auth as any);
|
||||
|
||||
const response = await podioApiCall<{ items: any[] }>({
|
||||
method: HttpMethod.POST,
|
||||
accessToken,
|
||||
resourceUri: `/item/app/${appId}/filter/`,
|
||||
body: { limit: 50 },
|
||||
});
|
||||
|
||||
if (!response.items || response.items.length === 0) {
|
||||
return {
|
||||
options: [],
|
||||
placeholder: 'No items found in this app',
|
||||
};
|
||||
}
|
||||
|
||||
return {
|
||||
options: response.items.map((item: any) => ({
|
||||
label: `${item.title || `Item ${item.item_id}`}`,
|
||||
value: item.item_id,
|
||||
})),
|
||||
};
|
||||
} catch (error) {
|
||||
return {
|
||||
disabled: true,
|
||||
options: [],
|
||||
placeholder: 'Failed to load items. Check your permissions.',
|
||||
};
|
||||
}
|
||||
},
|
||||
});
|
||||
|
||||
export const dynamicRefTypeProperty = Property.Dropdown({
|
||||
auth: podioAuth,
|
||||
displayName: 'Reference Type',
|
||||
description: 'The type of object to reference',
|
||||
required: false,
|
||||
refreshers: [],
|
||||
options: async () => {
|
||||
return {
|
||||
options: [
|
||||
{ label: 'Item', value: 'item' },
|
||||
{ label: 'Task', value: 'task' },
|
||||
{ label: 'Status', value: 'status' },
|
||||
{ label: 'App', value: 'app' },
|
||||
{ label: 'Space', value: 'space' },
|
||||
],
|
||||
};
|
||||
},
|
||||
});
|
||||
|
||||
export const dynamicRefIdProperty = Property.Dropdown({
|
||||
auth: podioAuth,
|
||||
displayName: 'Reference Object',
|
||||
description: 'Select the specific object to reference',
|
||||
required: false,
|
||||
refreshers: ['refType', 'appId', 'spaceId', 'orgId'],
|
||||
options: async ({ auth, refType, appId, spaceId, orgId }) => {
|
||||
if (!auth || !refType) {
|
||||
return {
|
||||
disabled: true,
|
||||
placeholder: !auth ? 'Connect your Podio account first' : 'Select a reference type first',
|
||||
options: [],
|
||||
};
|
||||
}
|
||||
|
||||
try {
|
||||
const accessToken = getAccessToken(auth as any);
|
||||
let endpoint = '';
|
||||
|
||||
switch (refType) {
|
||||
case 'item': {
|
||||
if (!appId) {
|
||||
return {
|
||||
disabled: true,
|
||||
placeholder: 'Select an app first to load items',
|
||||
options: [],
|
||||
};
|
||||
}
|
||||
const itemResponse = await podioApiCall<{ items: any[] }>({
|
||||
method: HttpMethod.POST,
|
||||
accessToken,
|
||||
resourceUri: `/item/app/${appId}/filter/`,
|
||||
body: { limit: 30 },
|
||||
});
|
||||
return {
|
||||
options: itemResponse.items?.map((item: any) => ({
|
||||
label: item.title || `Item ${item.item_id}`,
|
||||
value: item.item_id,
|
||||
})) || [],
|
||||
};
|
||||
}
|
||||
|
||||
case 'task': {
|
||||
if (spaceId) {
|
||||
endpoint = `/task/space/${spaceId}/`;
|
||||
} else {
|
||||
endpoint = '/task/';
|
||||
}
|
||||
|
||||
const taskResponse = await podioApiCall<any[]>({
|
||||
method: HttpMethod.GET,
|
||||
accessToken,
|
||||
resourceUri: endpoint,
|
||||
queryParams: { limit: 30 },
|
||||
});
|
||||
|
||||
return {
|
||||
options: taskResponse?.map((task: any) => ({
|
||||
label: task.text || `Task ${task.task_id}`,
|
||||
value: task.task_id,
|
||||
})) || [],
|
||||
};
|
||||
}
|
||||
|
||||
case 'status':
|
||||
if (!spaceId) {
|
||||
return {
|
||||
disabled: true,
|
||||
placeholder: 'Select a space first to load status updates',
|
||||
options: [],
|
||||
};
|
||||
}
|
||||
|
||||
try {
|
||||
const statusResponse = await podioApiCall<any>({
|
||||
method: HttpMethod.GET,
|
||||
accessToken,
|
||||
resourceUri: `/stream/space/${spaceId}/`,
|
||||
queryParams: {
|
||||
limit: 50,
|
||||
type: 'status'
|
||||
},
|
||||
});
|
||||
|
||||
if (statusResponse?.items) {
|
||||
return {
|
||||
options: statusResponse.items
|
||||
.filter((item: any) => item.type === 'status' && item.data)
|
||||
.map((item: any) => ({
|
||||
label: (item.data.value || item.data.text || '').substring(0, 60) + (item.data.value?.length > 60 ? '...' : '') || `Status ${item.data.status_id}`,
|
||||
value: item.data.status_id,
|
||||
}))
|
||||
.slice(0, 30),
|
||||
};
|
||||
}
|
||||
|
||||
return {
|
||||
options: [],
|
||||
placeholder: 'No status updates found in this space',
|
||||
};
|
||||
} catch (error) {
|
||||
return {
|
||||
options: [],
|
||||
placeholder: 'Enter status ID manually (could not load status updates)',
|
||||
};
|
||||
}
|
||||
|
||||
case 'app':
|
||||
if (spaceId) {
|
||||
endpoint = `/app/space/${spaceId}/`;
|
||||
} else {
|
||||
endpoint = '/app/';
|
||||
}
|
||||
|
||||
try {
|
||||
const appResponse = await podioApiCall<any[]>({
|
||||
method: HttpMethod.GET,
|
||||
accessToken,
|
||||
resourceUri: endpoint,
|
||||
});
|
||||
|
||||
return {
|
||||
options: appResponse?.map((app: any) => ({
|
||||
label: `${app.config?.name || app.name}${app.space ? ` (${app.space.name})` : ''}`,
|
||||
value: app.app_id,
|
||||
})) || [],
|
||||
};
|
||||
} catch (error) {
|
||||
return {
|
||||
options: [],
|
||||
placeholder: spaceId ? 'No apps found in this space' : 'Failed to load apps',
|
||||
};
|
||||
}
|
||||
|
||||
case 'space': {
|
||||
if (!orgId) {
|
||||
return {
|
||||
disabled: true,
|
||||
placeholder: 'Select an organization first to load spaces',
|
||||
options: [],
|
||||
};
|
||||
}
|
||||
|
||||
const spaceResponse = await podioApiCall<any[]>({
|
||||
method: HttpMethod.GET,
|
||||
accessToken,
|
||||
resourceUri: `/org/${orgId}/space/`,
|
||||
});
|
||||
|
||||
return {
|
||||
options: spaceResponse?.map((space: any) => ({
|
||||
label: space.name,
|
||||
value: space.space_id,
|
||||
})) || [],
|
||||
};
|
||||
}
|
||||
|
||||
default:
|
||||
return {
|
||||
options: [],
|
||||
placeholder: 'Unknown reference type',
|
||||
};
|
||||
}
|
||||
} catch (error) {
|
||||
return {
|
||||
disabled: true,
|
||||
options: [],
|
||||
placeholder: `Failed to load ${refType}s. Check your permissions.`,
|
||||
};
|
||||
}
|
||||
},
|
||||
});
|
||||
|
||||
export const spaceIdProperty = Property.Number({
|
||||
displayName: 'Space ID',
|
||||
description: 'The ID of the Podio workspace/space',
|
||||
required: true,
|
||||
});
|
||||
|
||||
export const itemIdProperty = Property.Number({
|
||||
displayName: 'Item ID',
|
||||
description: 'The ID of the Podio item',
|
||||
required: true,
|
||||
});
|
||||
|
||||
export const taskIdProperty = Property.Number({
|
||||
displayName: 'Task ID',
|
||||
description: 'The ID of the Podio task',
|
||||
required: true,
|
||||
});
|
||||
|
||||
export const dynamicFileProperty = Property.Dropdown({
|
||||
auth: podioAuth,
|
||||
displayName: 'File',
|
||||
description: 'Select a file from the space',
|
||||
required: true,
|
||||
refreshers: ['spaceId'],
|
||||
options: async ({ auth, spaceId }) => {
|
||||
if (!auth) {
|
||||
return {
|
||||
disabled: true,
|
||||
placeholder: 'Connect your Podio account first',
|
||||
options: [],
|
||||
};
|
||||
}
|
||||
|
||||
if (!spaceId) {
|
||||
return {
|
||||
disabled: true,
|
||||
placeholder: 'Select a space first to load files',
|
||||
options: [],
|
||||
};
|
||||
}
|
||||
|
||||
try {
|
||||
const accessToken = getAccessToken(auth as any);
|
||||
const files = await podioApiCall<any[]>({
|
||||
method: HttpMethod.GET,
|
||||
accessToken,
|
||||
resourceUri: `/file/space/${spaceId}/`,
|
||||
queryParams: {
|
||||
limit: 50,
|
||||
sort_by: 'created_on',
|
||||
sort_desc: 'true'
|
||||
}
|
||||
});
|
||||
|
||||
if (!files || files.length === 0) {
|
||||
return {
|
||||
options: [],
|
||||
placeholder: 'No files found in this space',
|
||||
};
|
||||
}
|
||||
|
||||
return {
|
||||
options: files.map((file: any) => {
|
||||
let label = file.name || `File ${file.file_id}`;
|
||||
|
||||
if (file.size) {
|
||||
const sizeInKB = Math.round(file.size / 1024);
|
||||
const sizeText = sizeInKB > 1024
|
||||
? `${Math.round(sizeInKB / 1024)}MB`
|
||||
: `${sizeInKB}KB`;
|
||||
label += ` (${sizeText})`;
|
||||
}
|
||||
|
||||
if (file.mimetype) {
|
||||
const fileType = file.mimetype.split('/')[0];
|
||||
const iconMap: Record<string, string> = {
|
||||
'image': '🖼️',
|
||||
'video': '🎥',
|
||||
'audio': '🎵',
|
||||
'text': '📄',
|
||||
'application': '📁'
|
||||
};
|
||||
const icon = iconMap[fileType] || '📄';
|
||||
label = `${icon} ${label}`;
|
||||
}
|
||||
|
||||
if (file.context?.title) {
|
||||
label += ` → ${file.context.title}`;
|
||||
}
|
||||
|
||||
return {
|
||||
label,
|
||||
value: file.file_id,
|
||||
};
|
||||
}),
|
||||
};
|
||||
} catch (error) {
|
||||
return {
|
||||
disabled: true,
|
||||
options: [],
|
||||
placeholder: 'Failed to load files. Check your connection.',
|
||||
};
|
||||
}
|
||||
},
|
||||
});
|
||||
|
||||
export const dynamicTaskProperty = Property.Dropdown({
|
||||
auth: podioAuth,
|
||||
displayName: 'Task',
|
||||
description: 'Select a Podio task',
|
||||
required: true,
|
||||
refreshers: [],
|
||||
options: async ({ auth }) => {
|
||||
if (!auth) {
|
||||
return {
|
||||
disabled: true,
|
||||
placeholder: 'Connect your Podio account first',
|
||||
options: [],
|
||||
};
|
||||
}
|
||||
|
||||
try {
|
||||
const accessToken = getAccessToken(auth as any);
|
||||
|
||||
const userInfo = await podioApiCall<any>({
|
||||
method: HttpMethod.GET,
|
||||
accessToken,
|
||||
resourceUri: '/user/status',
|
||||
});
|
||||
|
||||
const userId = userInfo?.user?.user_id;
|
||||
|
||||
if (!userId) {
|
||||
return {
|
||||
disabled: true,
|
||||
options: [],
|
||||
placeholder: 'Could not determine user ID for task filtering',
|
||||
};
|
||||
}
|
||||
|
||||
const tasks = await podioApiCall<any[]>({
|
||||
method: HttpMethod.GET,
|
||||
accessToken,
|
||||
resourceUri: '/task/',
|
||||
queryParams: {
|
||||
responsible: userId,
|
||||
limit: 100,
|
||||
view: 'full',
|
||||
sort_by: 'created_on',
|
||||
sort_desc: 'true'
|
||||
}
|
||||
});
|
||||
|
||||
if (!tasks || tasks.length === 0) {
|
||||
return {
|
||||
options: [],
|
||||
placeholder: 'No tasks found assigned to you',
|
||||
};
|
||||
}
|
||||
|
||||
return {
|
||||
options: tasks.map((task: any) => {
|
||||
let label = task.text || `Task ${task.task_id}`;
|
||||
|
||||
if (task.status === 'completed') {
|
||||
label = `✓ ${label}`;
|
||||
} else if (task.due_date) {
|
||||
const dueDate = new Date(task.due_date);
|
||||
const today = new Date();
|
||||
if (dueDate < today) {
|
||||
label = `⚠️ ${label} (Overdue)`;
|
||||
} else {
|
||||
label = `📅 ${label}`;
|
||||
}
|
||||
}
|
||||
|
||||
if (task.ref?.title) {
|
||||
label += ` → ${task.ref.title}`;
|
||||
}
|
||||
|
||||
return {
|
||||
label,
|
||||
value: task.task_id,
|
||||
};
|
||||
}),
|
||||
};
|
||||
} catch (error) {
|
||||
return {
|
||||
disabled: true,
|
||||
options: [],
|
||||
placeholder: 'Failed to load tasks. Check your connection.',
|
||||
};
|
||||
}
|
||||
},
|
||||
});
|
||||
|
||||
export const orgIdProperty = Property.Number({
|
||||
displayName: 'Organization ID',
|
||||
description: 'The ID of the Podio organization',
|
||||
required: true,
|
||||
});
|
||||
|
||||
export const refTypeProperty = Property.Dropdown({
|
||||
auth: podioAuth,
|
||||
displayName: 'Reference Type',
|
||||
description: 'The type of object',
|
||||
required: true,
|
||||
refreshers: [],
|
||||
options: async () => {
|
||||
return {
|
||||
options: [
|
||||
{ label: 'Item', value: 'item' },
|
||||
{ label: 'Task', value: 'task' },
|
||||
{ label: 'Status', value: 'status' },
|
||||
{ label: 'App', value: 'app' },
|
||||
{ label: 'Space', value: 'space' },
|
||||
],
|
||||
};
|
||||
},
|
||||
});
|
||||
|
||||
export const statusProperty = Property.Dropdown({
|
||||
auth: podioAuth,
|
||||
displayName: 'Status',
|
||||
description: 'The status filter',
|
||||
required: false,
|
||||
refreshers: [],
|
||||
options: async () => {
|
||||
return {
|
||||
options: [
|
||||
{ label: 'Active', value: 'active' },
|
||||
{ label: 'Completed', value: 'completed' },
|
||||
{ label: 'All', value: 'all' },
|
||||
],
|
||||
};
|
||||
},
|
||||
});
|
||||
|
||||
export const silentProperty = Property.Checkbox({
|
||||
displayName: 'Silent Mode',
|
||||
description: 'If true, notifications will not be triggered and the object will not appear in activity streams',
|
||||
required: false,
|
||||
defaultValue: false,
|
||||
});
|
||||
|
||||
export const hookProperty = Property.Checkbox({
|
||||
displayName: 'Execute Hooks',
|
||||
description: 'If false, webhooks and integrations will not be triggered for this operation',
|
||||
required: false,
|
||||
defaultValue: true,
|
||||
});
|
||||
|
||||
export const limitProperty = Property.Number({
|
||||
displayName: 'Limit',
|
||||
description: 'Maximum number of results to return (1-500, default: 20)',
|
||||
required: false,
|
||||
defaultValue: 20,
|
||||
});
|
||||
|
||||
export const offsetProperty = Property.Number({
|
||||
displayName: 'Offset',
|
||||
description: 'Number of results to skip for pagination (default: 0)',
|
||||
required: false,
|
||||
defaultValue: 0,
|
||||
});
|
||||
|
||||
export function formatFieldValues(appFields: any[], formData: Record<string, any>): Record<string, any> {
|
||||
|
||||
const fields: Record<string, any> = {};
|
||||
|
||||
for (const field of appFields) {
|
||||
const fieldKey = `field_${field.field_id}`;
|
||||
const fieldValue = formData[fieldKey];
|
||||
|
||||
|
||||
|
||||
if (fieldValue !== undefined && fieldValue !== null && fieldValue !== '') {
|
||||
const fieldType = field.type;
|
||||
|
||||
switch (fieldType) {
|
||||
case 'text':
|
||||
fields[field.field_id] = {
|
||||
value: fieldValue.toString(),
|
||||
};
|
||||
break;
|
||||
|
||||
case 'number':
|
||||
fields[field.field_id] = {
|
||||
value: fieldValue.toString(),
|
||||
};
|
||||
break;
|
||||
|
||||
case 'money':
|
||||
if (typeof fieldValue === 'object' && fieldValue.value) {
|
||||
fields[field.field_id] = {
|
||||
value: fieldValue.value.toString(),
|
||||
currency: fieldValue.currency || 'USD',
|
||||
};
|
||||
}
|
||||
break;
|
||||
|
||||
case 'date':
|
||||
if (typeof fieldValue === 'object') {
|
||||
const dateObj: any = {};
|
||||
if (fieldValue.start_date) dateObj.start_date = fieldValue.start_date;
|
||||
if (fieldValue.start_time) dateObj.start_time = fieldValue.start_time;
|
||||
if (fieldValue.end_date) dateObj.end_date = fieldValue.end_date;
|
||||
if (fieldValue.end_time) dateObj.end_time = fieldValue.end_time;
|
||||
|
||||
if (Object.keys(dateObj).length > 0) {
|
||||
fields[field.field_id] = dateObj;
|
||||
}
|
||||
}
|
||||
break;
|
||||
|
||||
case 'contact':
|
||||
case 'member':
|
||||
case 'app':
|
||||
case 'category':
|
||||
case 'status':
|
||||
case 'image':
|
||||
case 'file':
|
||||
case 'duration':
|
||||
case 'video':
|
||||
fields[field.field_id] = {
|
||||
value: Number(fieldValue),
|
||||
};
|
||||
break;
|
||||
|
||||
case 'progress': {
|
||||
const progressValue = Number(fieldValue);
|
||||
if (progressValue >= 0 && progressValue <= 100) {
|
||||
fields[field.field_id] = {
|
||||
value: progressValue,
|
||||
};
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
case 'email':
|
||||
case 'phone':
|
||||
if (typeof fieldValue === 'object' && fieldValue.value) {
|
||||
fields[field.field_id] = {
|
||||
value: fieldValue.value,
|
||||
type: fieldValue.type || (fieldType === 'email' ? 'work' : 'mobile'),
|
||||
};
|
||||
}
|
||||
break;
|
||||
|
||||
case 'location':
|
||||
fields[field.field_id] = {
|
||||
value: fieldValue.toString(),
|
||||
};
|
||||
break;
|
||||
|
||||
case 'embed':
|
||||
if (typeof fieldValue === 'object' && fieldValue.embed) {
|
||||
fields[field.field_id] = {
|
||||
embed: fieldValue.embed,
|
||||
file: fieldValue.file || null,
|
||||
};
|
||||
}
|
||||
break;
|
||||
|
||||
default:
|
||||
fields[field.field_id] = {
|
||||
value: fieldValue.toString(),
|
||||
};
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
return fields;
|
||||
}
|
||||
@@ -0,0 +1,91 @@
|
||||
import { createTrigger, TriggerStrategy } from '@activepieces/pieces-framework';
|
||||
import { HttpMethod } from '@activepieces/pieces-common';
|
||||
import { podioAuth } from '../../index';
|
||||
import { podioApiCall, getAccessToken, dynamicAppProperty } from '../common';
|
||||
|
||||
export const itemUpdatedTrigger = createTrigger({
|
||||
auth: podioAuth,
|
||||
name: 'item_updated',
|
||||
displayName: 'Item Updated',
|
||||
description: 'Fires when an existing item is updated (excluding comments)',
|
||||
props: {
|
||||
appId: dynamicAppProperty,
|
||||
},
|
||||
sampleData: {
|
||||
type: "item.update",
|
||||
item_id: 1234567890,
|
||||
item_revision_id: 3,
|
||||
external_id: "external-item-123"
|
||||
},
|
||||
type: TriggerStrategy.WEBHOOK,
|
||||
async onEnable(context) {
|
||||
const accessToken = getAccessToken(context.auth);
|
||||
const { appId } = context.propsValue;
|
||||
|
||||
if (!appId) {
|
||||
throw new Error('App selection is required to enable the Item Updated trigger. Please select an app.');
|
||||
}
|
||||
|
||||
try {
|
||||
const response = await podioApiCall<{ hook_id: number }>({
|
||||
method: HttpMethod.POST,
|
||||
accessToken,
|
||||
resourceUri: `/hook/app/${appId}/`,
|
||||
body: {
|
||||
url: context.webhookUrl,
|
||||
type: 'item.update',
|
||||
},
|
||||
});
|
||||
|
||||
if (!response.hook_id) {
|
||||
throw new Error('Failed to create webhook: No hook ID returned from Podio API.');
|
||||
}
|
||||
|
||||
await context.store.put('podio_item_updated_hook_id', response.hook_id);
|
||||
await context.store.put('podio_item_updated_app_id', appId);
|
||||
} catch (error: any) {
|
||||
throw new Error(`Failed to enable Item Updated trigger: ${error.message || 'Unknown error occurred'}`);
|
||||
}
|
||||
},
|
||||
async onDisable(context) {
|
||||
const accessToken = getAccessToken(context.auth);
|
||||
const hookId = await context.store.get<number>('podio_item_updated_hook_id');
|
||||
|
||||
if (!hookId) {
|
||||
return;
|
||||
}
|
||||
|
||||
try {
|
||||
await podioApiCall({
|
||||
method: HttpMethod.DELETE,
|
||||
accessToken,
|
||||
resourceUri: `/hook/${hookId}`,
|
||||
});
|
||||
} catch (error: any) {
|
||||
if (error.response?.status === 404) {
|
||||
return;
|
||||
}
|
||||
throw new Error(`Failed to disable Item Updated trigger: ${error.message || 'Unknown error occurred'}`);
|
||||
} finally {
|
||||
await context.store.delete('podio_item_updated_hook_id');
|
||||
await context.store.delete('podio_item_updated_app_id');
|
||||
}
|
||||
},
|
||||
async run(context) {
|
||||
const payload = context.payload.body;
|
||||
|
||||
if (!payload || typeof payload !== 'object') {
|
||||
return [];
|
||||
}
|
||||
|
||||
if (!(payload as any).type || (payload as any).type !== 'item.update') {
|
||||
return [];
|
||||
}
|
||||
|
||||
if (!(payload as any).item_id) {
|
||||
return [];
|
||||
}
|
||||
|
||||
return [payload];
|
||||
},
|
||||
});
|
||||
@@ -0,0 +1,90 @@
|
||||
import { createTrigger, TriggerStrategy } from '@activepieces/pieces-framework';
|
||||
import { HttpMethod } from '@activepieces/pieces-common';
|
||||
import { podioAuth } from '../../index';
|
||||
import { podioApiCall, getAccessToken, dynamicSpaceProperty, dynamicOrgProperty } from '../common';
|
||||
|
||||
export const newActivityTrigger = createTrigger({
|
||||
auth: podioAuth,
|
||||
name: 'new_activity',
|
||||
displayName: 'New Status',
|
||||
description: 'Fires when a new status is created in a workspace stream',
|
||||
props: {
|
||||
orgId: dynamicOrgProperty,
|
||||
spaceId: dynamicSpaceProperty,
|
||||
},
|
||||
sampleData: {
|
||||
type: "status.create",
|
||||
status_id: 1122334455
|
||||
},
|
||||
type: TriggerStrategy.WEBHOOK,
|
||||
async onEnable(context) {
|
||||
const accessToken = getAccessToken(context.auth);
|
||||
const { spaceId } = context.propsValue;
|
||||
|
||||
if (!spaceId) {
|
||||
throw new Error('Space selection is required to enable the New Status trigger. Please select a workspace.');
|
||||
}
|
||||
|
||||
try {
|
||||
const response = await podioApiCall<{ hook_id: number }>({
|
||||
method: HttpMethod.POST,
|
||||
accessToken,
|
||||
resourceUri: `/hook/space/${spaceId}/`,
|
||||
body: {
|
||||
url: context.webhookUrl,
|
||||
type: 'status.create',
|
||||
},
|
||||
});
|
||||
|
||||
if (!response.hook_id) {
|
||||
throw new Error('Failed to create webhook: No hook ID returned from Podio API.');
|
||||
}
|
||||
|
||||
await context.store.put('podio_new_activity_hook_id', response.hook_id);
|
||||
await context.store.put('podio_new_activity_space_id', spaceId);
|
||||
} catch (error: any) {
|
||||
throw new Error(`Failed to enable New Status trigger: ${error.message || 'Unknown error occurred'}`);
|
||||
}
|
||||
},
|
||||
async onDisable(context) {
|
||||
const accessToken = getAccessToken(context.auth);
|
||||
const hookId = await context.store.get<number>('podio_new_activity_hook_id');
|
||||
|
||||
if (!hookId) {
|
||||
return;
|
||||
}
|
||||
|
||||
try {
|
||||
await podioApiCall({
|
||||
method: HttpMethod.DELETE,
|
||||
accessToken,
|
||||
resourceUri: `/hook/${hookId}`,
|
||||
});
|
||||
} catch (error: any) {
|
||||
if (error.response?.status === 404) {
|
||||
return;
|
||||
}
|
||||
throw new Error(`Failed to disable New Status trigger: ${error.message || 'Unknown error occurred'}`);
|
||||
} finally {
|
||||
await context.store.delete('podio_new_activity_hook_id');
|
||||
await context.store.delete('podio_new_activity_space_id');
|
||||
}
|
||||
},
|
||||
async run(context) {
|
||||
const payload = context.payload.body;
|
||||
|
||||
if (!payload || typeof payload !== 'object') {
|
||||
return [];
|
||||
}
|
||||
|
||||
if (!(payload as any).type || (payload as any).type !== 'status.create') {
|
||||
return [];
|
||||
}
|
||||
|
||||
if (!(payload as any).status_id) {
|
||||
return [];
|
||||
}
|
||||
|
||||
return [payload];
|
||||
},
|
||||
});
|
||||
@@ -0,0 +1,91 @@
|
||||
import { createTrigger, TriggerStrategy } from '@activepieces/pieces-framework';
|
||||
import { HttpMethod } from '@activepieces/pieces-common';
|
||||
import { podioAuth } from '../../index';
|
||||
import { podioApiCall, getAccessToken, dynamicAppProperty } from '../common';
|
||||
|
||||
export const newItemTrigger = createTrigger({
|
||||
auth: podioAuth,
|
||||
name: 'new_item',
|
||||
displayName: 'New Item',
|
||||
description: 'Fires when a new item (record/entry) is created in an app',
|
||||
props: {
|
||||
appId: dynamicAppProperty,
|
||||
},
|
||||
sampleData: {
|
||||
type: "item.create",
|
||||
item_id: 1234567890,
|
||||
item_revision_id: 1,
|
||||
external_id: "external-item-123"
|
||||
},
|
||||
type: TriggerStrategy.WEBHOOK,
|
||||
async onEnable(context) {
|
||||
const accessToken = getAccessToken(context.auth);
|
||||
const { appId } = context.propsValue;
|
||||
|
||||
if (!appId) {
|
||||
throw new Error('App selection is required to enable the New Item trigger. Please select an app.');
|
||||
}
|
||||
|
||||
try {
|
||||
const response = await podioApiCall<{ hook_id: number }>({
|
||||
method: HttpMethod.POST,
|
||||
accessToken,
|
||||
resourceUri: `/hook/app/${appId}/`,
|
||||
body: {
|
||||
url: context.webhookUrl,
|
||||
type: 'item.create',
|
||||
},
|
||||
});
|
||||
|
||||
if (!response.hook_id) {
|
||||
throw new Error('Failed to create webhook: No hook ID returned from Podio API.');
|
||||
}
|
||||
|
||||
await context.store.put('podio_new_item_hook_id', response.hook_id);
|
||||
await context.store.put('podio_new_item_app_id', appId);
|
||||
} catch (error: any) {
|
||||
throw new Error(`Failed to enable New Item trigger: ${error.message || 'Unknown error occurred'}`);
|
||||
}
|
||||
},
|
||||
async onDisable(context) {
|
||||
const accessToken = getAccessToken(context.auth);
|
||||
const hookId = await context.store.get<number>('podio_new_item_hook_id');
|
||||
|
||||
if (!hookId) {
|
||||
return;
|
||||
}
|
||||
|
||||
try {
|
||||
await podioApiCall({
|
||||
method: HttpMethod.DELETE,
|
||||
accessToken,
|
||||
resourceUri: `/hook/${hookId}`,
|
||||
});
|
||||
} catch (error: any) {
|
||||
if (error.response?.status === 404) {
|
||||
return;
|
||||
}
|
||||
throw new Error(`Failed to disable New Item trigger: ${error.message || 'Unknown error occurred'}`);
|
||||
} finally {
|
||||
await context.store.delete('podio_new_item_hook_id');
|
||||
await context.store.delete('podio_new_item_app_id');
|
||||
}
|
||||
},
|
||||
async run(context) {
|
||||
const payload = context.payload.body;
|
||||
|
||||
if (!payload || typeof payload !== 'object') {
|
||||
return [];
|
||||
}
|
||||
|
||||
if (!(payload as any).type || (payload as any).type !== 'item.create') {
|
||||
return [];
|
||||
}
|
||||
|
||||
if (!(payload as any).item_id) {
|
||||
return [];
|
||||
}
|
||||
|
||||
return [payload];
|
||||
},
|
||||
});
|
||||
@@ -0,0 +1,90 @@
|
||||
import { createTrigger, TriggerStrategy } from '@activepieces/pieces-framework';
|
||||
import { HttpMethod } from '@activepieces/pieces-common';
|
||||
import { podioAuth } from '../../index';
|
||||
import { podioApiCall, getAccessToken, dynamicSpaceProperty, dynamicOrgProperty } from '../common';
|
||||
|
||||
export const newOrganizationTrigger = createTrigger({
|
||||
auth: podioAuth,
|
||||
name: 'new_app',
|
||||
displayName: 'New App',
|
||||
description: 'Fires when a new app is created in a workspace',
|
||||
props: {
|
||||
orgId: dynamicOrgProperty,
|
||||
spaceId: dynamicSpaceProperty,
|
||||
},
|
||||
sampleData: {
|
||||
type: "app.create",
|
||||
app_id: 111222333
|
||||
},
|
||||
type: TriggerStrategy.WEBHOOK,
|
||||
async onEnable(context) {
|
||||
const accessToken = getAccessToken(context.auth);
|
||||
const { spaceId } = context.propsValue;
|
||||
|
||||
if (!spaceId) {
|
||||
throw new Error('Space selection is required to enable the New App trigger. Please select a workspace.');
|
||||
}
|
||||
|
||||
try {
|
||||
const response = await podioApiCall<{ hook_id: number }>({
|
||||
method: HttpMethod.POST,
|
||||
accessToken,
|
||||
resourceUri: `/hook/space/${spaceId}/`,
|
||||
body: {
|
||||
url: context.webhookUrl,
|
||||
type: 'app.create',
|
||||
},
|
||||
});
|
||||
|
||||
if (!response.hook_id) {
|
||||
throw new Error('Failed to create webhook: No hook ID returned from Podio API.');
|
||||
}
|
||||
|
||||
await context.store.put('podio_new_app_hook_id', response.hook_id);
|
||||
await context.store.put('podio_new_app_space_id', spaceId);
|
||||
} catch (error: any) {
|
||||
throw new Error(`Failed to enable New App trigger: ${error.message || 'Unknown error occurred'}`);
|
||||
}
|
||||
},
|
||||
async onDisable(context) {
|
||||
const accessToken = getAccessToken(context.auth);
|
||||
const hookId = await context.store.get<number>('podio_new_app_hook_id');
|
||||
|
||||
if (!hookId) {
|
||||
return;
|
||||
}
|
||||
|
||||
try {
|
||||
await podioApiCall({
|
||||
method: HttpMethod.DELETE,
|
||||
accessToken,
|
||||
resourceUri: `/hook/${hookId}`,
|
||||
});
|
||||
} catch (error: any) {
|
||||
if (error.response?.status === 404) {
|
||||
return;
|
||||
}
|
||||
throw new Error(`Failed to disable New App trigger: ${error.message || 'Unknown error occurred'}`);
|
||||
} finally {
|
||||
await context.store.delete('podio_new_app_hook_id');
|
||||
await context.store.delete('podio_new_app_space_id');
|
||||
}
|
||||
},
|
||||
async run(context) {
|
||||
const payload = context.payload.body;
|
||||
|
||||
if (!payload || typeof payload !== 'object') {
|
||||
return [];
|
||||
}
|
||||
|
||||
if (!(payload as any).type || (payload as any).type !== 'app.create') {
|
||||
return [];
|
||||
}
|
||||
|
||||
if (!(payload as any).app_id) {
|
||||
return [];
|
||||
}
|
||||
|
||||
return [payload];
|
||||
},
|
||||
});
|
||||
@@ -0,0 +1,90 @@
|
||||
import { createTrigger, TriggerStrategy } from '@activepieces/pieces-framework';
|
||||
import { HttpMethod } from '@activepieces/pieces-common';
|
||||
import { podioAuth } from '../../index';
|
||||
import { podioApiCall, getAccessToken, dynamicSpaceProperty, dynamicOrgProperty } from '../common';
|
||||
|
||||
export const newTaskTrigger = createTrigger({
|
||||
auth: podioAuth,
|
||||
name: 'new_task',
|
||||
displayName: 'New Task',
|
||||
description: 'Fires when a new task is added to any workspace',
|
||||
props: {
|
||||
orgId: dynamicOrgProperty,
|
||||
spaceId: dynamicSpaceProperty,
|
||||
},
|
||||
sampleData: {
|
||||
type: "task.create",
|
||||
task_id: 987654321
|
||||
},
|
||||
type: TriggerStrategy.WEBHOOK,
|
||||
async onEnable(context) {
|
||||
const accessToken = getAccessToken(context.auth);
|
||||
const { spaceId } = context.propsValue;
|
||||
|
||||
if (!spaceId) {
|
||||
throw new Error('Space selection is required to enable the New Task trigger. Please select a workspace.');
|
||||
}
|
||||
|
||||
try {
|
||||
const response = await podioApiCall<{ hook_id: number }>({
|
||||
method: HttpMethod.POST,
|
||||
accessToken,
|
||||
resourceUri: `/hook/space/${spaceId}/`,
|
||||
body: {
|
||||
url: context.webhookUrl,
|
||||
type: 'task.create',
|
||||
},
|
||||
});
|
||||
|
||||
if (!response.hook_id) {
|
||||
throw new Error('Failed to create webhook: No hook ID returned from Podio API.');
|
||||
}
|
||||
|
||||
await context.store.put('podio_new_task_hook_id', response.hook_id);
|
||||
await context.store.put('podio_new_task_space_id', spaceId);
|
||||
} catch (error: any) {
|
||||
throw new Error(`Failed to enable New Task trigger: ${error.message || 'Unknown error occurred'}`);
|
||||
}
|
||||
},
|
||||
async onDisable(context) {
|
||||
const accessToken = getAccessToken(context.auth);
|
||||
const hookId = await context.store.get<number>('podio_new_task_hook_id');
|
||||
|
||||
if (!hookId) {
|
||||
return;
|
||||
}
|
||||
|
||||
try {
|
||||
await podioApiCall({
|
||||
method: HttpMethod.DELETE,
|
||||
accessToken,
|
||||
resourceUri: `/hook/${hookId}`,
|
||||
});
|
||||
} catch (error: any) {
|
||||
if (error.response?.status === 404) {
|
||||
return;
|
||||
}
|
||||
throw new Error(`Failed to disable New Task trigger: ${error.message || 'Unknown error occurred'}`);
|
||||
} finally {
|
||||
await context.store.delete('podio_new_task_hook_id');
|
||||
await context.store.delete('podio_new_task_space_id');
|
||||
}
|
||||
},
|
||||
async run(context) {
|
||||
const payload = context.payload.body;
|
||||
|
||||
if (!payload || typeof payload !== 'object') {
|
||||
return [];
|
||||
}
|
||||
|
||||
if (!(payload as any).type || (payload as any).type !== 'task.create') {
|
||||
return [];
|
||||
}
|
||||
|
||||
if (!(payload as any).task_id) {
|
||||
return [];
|
||||
}
|
||||
|
||||
return [payload];
|
||||
},
|
||||
});
|
||||
@@ -0,0 +1,91 @@
|
||||
import { createTrigger, TriggerStrategy } from '@activepieces/pieces-framework';
|
||||
import { HttpMethod } from '@activepieces/pieces-common';
|
||||
import { podioAuth } from '../../index';
|
||||
import { podioApiCall, getAccessToken, dynamicSpaceProperty, dynamicOrgProperty } from '../common';
|
||||
|
||||
export const newWorkspaceTrigger = createTrigger({
|
||||
auth: podioAuth,
|
||||
name: 'member_added',
|
||||
displayName: 'Member Added',
|
||||
description: 'Fires when a new member is added to a workspace',
|
||||
props: {
|
||||
orgId: dynamicOrgProperty,
|
||||
spaceId: dynamicSpaceProperty,
|
||||
},
|
||||
sampleData: {
|
||||
type: "member.add",
|
||||
space_id: 456789012,
|
||||
user_id: 234567
|
||||
},
|
||||
type: TriggerStrategy.WEBHOOK,
|
||||
async onEnable(context) {
|
||||
const accessToken = getAccessToken(context.auth);
|
||||
const { spaceId } = context.propsValue;
|
||||
|
||||
if (!spaceId) {
|
||||
throw new Error('Space selection is required to enable the Member Added trigger. Please select a workspace.');
|
||||
}
|
||||
|
||||
try {
|
||||
const response = await podioApiCall<{ hook_id: number }>({
|
||||
method: HttpMethod.POST,
|
||||
accessToken,
|
||||
resourceUri: `/hook/space/${spaceId}/`,
|
||||
body: {
|
||||
url: context.webhookUrl,
|
||||
type: 'member.add',
|
||||
},
|
||||
});
|
||||
|
||||
if (!response.hook_id) {
|
||||
throw new Error('Failed to create webhook: No hook ID returned from Podio API.');
|
||||
}
|
||||
|
||||
await context.store.put('podio_member_added_hook_id', response.hook_id);
|
||||
await context.store.put('podio_member_added_space_id', spaceId);
|
||||
} catch (error: any) {
|
||||
throw new Error(`Failed to enable Member Added trigger: ${error.message || 'Unknown error occurred'}`);
|
||||
}
|
||||
},
|
||||
async onDisable(context) {
|
||||
const accessToken = getAccessToken(context.auth);
|
||||
const hookId = await context.store.get<number>('podio_member_added_hook_id');
|
||||
|
||||
if (!hookId) {
|
||||
return;
|
||||
}
|
||||
|
||||
try {
|
||||
await podioApiCall({
|
||||
method: HttpMethod.DELETE,
|
||||
accessToken,
|
||||
resourceUri: `/hook/${hookId}`,
|
||||
});
|
||||
} catch (error: any) {
|
||||
if (error.response?.status === 404) {
|
||||
return;
|
||||
}
|
||||
throw new Error(`Failed to disable Member Added trigger: ${error.message || 'Unknown error occurred'}`);
|
||||
} finally {
|
||||
await context.store.delete('podio_member_added_hook_id');
|
||||
await context.store.delete('podio_member_added_space_id');
|
||||
}
|
||||
},
|
||||
async run(context) {
|
||||
const payload = context.payload.body;
|
||||
|
||||
if (!payload || typeof payload !== 'object') {
|
||||
return [];
|
||||
}
|
||||
|
||||
if (!(payload as any).type || (payload as any).type !== 'member.add') {
|
||||
return [];
|
||||
}
|
||||
|
||||
if (!(payload as any).space_id || !(payload as any).user_id) {
|
||||
return [];
|
||||
}
|
||||
|
||||
return [payload];
|
||||
},
|
||||
});
|
||||
@@ -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