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-wufoo
|
||||
|
||||
This library was generated with [Nx](https://nx.dev).
|
||||
|
||||
## Building
|
||||
|
||||
Run `nx build pieces-wufoo` to build the library.
|
||||
@@ -0,0 +1,4 @@
|
||||
{
|
||||
"name": "@activepieces/piece-wufoo",
|
||||
"version": "0.0.10"
|
||||
}
|
||||
@@ -0,0 +1,65 @@
|
||||
{
|
||||
"name": "pieces-wufoo",
|
||||
"$schema": "../../../../node_modules/nx/schemas/project-schema.json",
|
||||
"sourceRoot": "packages/pieces/community/wufoo/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/wufoo",
|
||||
"tsConfig": "packages/pieces/community/wufoo/tsconfig.lib.json",
|
||||
"packageJson": "packages/pieces/community/wufoo/package.json",
|
||||
"main": "packages/pieces/community/wufoo/src/index.ts",
|
||||
"assets": [
|
||||
"packages/pieces/community/wufoo/*.md",
|
||||
{
|
||||
"input": "packages/pieces/community/wufoo/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/wufoo",
|
||||
"command": "bun install --no-save --silent"
|
||||
},
|
||||
"dependsOn": [
|
||||
"^build"
|
||||
]
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,124 @@
|
||||
{
|
||||
"API Key": "API-Schlüssel",
|
||||
"Subdomain": "Subdomain",
|
||||
"Your Wufoo account subdomain (e.g., for fishbowl.wufoo.com, use \"fishbowl\")": "Ihre Wufoo-Konto-Subdomain (z.B. für fishbowl.wufoo.com, verwenden Sie \"fishbowl\")",
|
||||
"Enter your Wufoo API Key and Subdomain.": "Geben Sie Ihren Wufoo API Key und Subdomain ein.",
|
||||
"Create Form Entry": "Formulareintrag erstellen",
|
||||
"Find Form by Name or Hash": "Formular nach Namen oder Hash suchen",
|
||||
"Find Submission by Field Value": "Suche Einreichung nach Feldwert",
|
||||
"Get Entry Details": "Eintragsdetails abrufen",
|
||||
"Custom API Call": "Eigener API-Aufruf",
|
||||
"Submit a new entry to a Wufoo form with dynamic field selection.": "Einen neuen Eintrag in ein Wufoo-Formular mit dynamischer Feldauswahl einreichen.",
|
||||
"Get details about a Wufoo form including settings, entry counts, and metadata.": "Erhalten Sie Details über ein Wufoo-Formular mit Einstellungen, Eintragszählern und Metadaten.",
|
||||
"Search for form submissions by field value for deduplication and lookup operations.": "Suche nach Formulareinreichungen nach Feldwert für Entkeimungs- und Suchoperationen.",
|
||||
"Get form entries with filtering, sorting, and pagination options.": "Erhalten Sie Formulareinträge mit Filter-, Sortier- und Paginierungsoptionen.",
|
||||
"Make a custom API call to a specific endpoint": "Einen benutzerdefinierten API-Aufruf an einen bestimmten Endpunkt machen",
|
||||
"Form Identifier (Name and Hash)": "Formular-Identifikator (Name und Hash)",
|
||||
"Response Format": "Antwortformat",
|
||||
"Form Fields": "Formularfelder",
|
||||
"Include Today Count": "Heutige Anzahl einbeziehen",
|
||||
"Field ID": "Feld-ID",
|
||||
"Search Value": "Suchwert",
|
||||
"Match Type": "Match-Typ",
|
||||
"Maximum Results": "Maximale Ergebnisse",
|
||||
"Sort Order": "Sortierung",
|
||||
"Include Metadata": "Metadaten einbeziehen",
|
||||
"Specific Entry ID (Optional)": "Spezifische Eintrag-ID (Optional)",
|
||||
"Filter Field ID (Optional)": "Filterfeld-ID (optional)",
|
||||
"Filter Operator": "Filter-Operator",
|
||||
"Filter Value (Optional)": "Filterwert (Optional)",
|
||||
"Second Filter Field (Optional)": "Zweiter Filterfeld (optional)",
|
||||
"Second Filter Operator": "Zweiter Filter-Operator",
|
||||
"Second Filter Value (Optional)": "Zweiter Filterwert (optional)",
|
||||
"Filter Logic": "Filterlogik",
|
||||
"Sort By Field ID (Optional)": "Nach Feld-ID sortieren (optional)",
|
||||
"Sort Direction": "Sortierrichtung",
|
||||
"Page Start": "Seitenanfang",
|
||||
"Page Size": "Einträge pro Seite",
|
||||
"Include System Fields": "Systemfelder einschließen",
|
||||
"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 a Wufoo form to work with.": "Wählen Sie ein Wufoo-Formular aus, mit dem gearbeitet werden soll.",
|
||||
"Choose the format for the API response. JSON is recommended for most use cases.": "Wählen Sie das Format für die API-Antwort. JSON wird für die meisten Anwendungsfälle empfohlen.",
|
||||
"Fill out the form fields with the data you want to submit. Field types and validation are automatically configured based on your form structure.": "Füllen Sie die Formularfelder mit den Daten aus, die Sie übermitteln möchten. Feldtypen und Validierung werden automatisch anhand Ihrer Formularstruktur konfiguriert.",
|
||||
"Choose the format for the API response. JSON is recommended for most integrations.": "Wählen Sie das Format für die API-Antwort. JSON wird für die meisten Integrationen empfohlen.",
|
||||
"Include the number of entries submitted today in the response. Useful for daily analytics and monitoring.": "Enthält die Anzahl der heute eingereichten Beiträge in der Antwort. Nützlich für die tägliche Analyse und Überwachung.",
|
||||
"Choose the format for the API response. JSON is recommended for most workflows.": "Wählen Sie das Format für die API-Antwort. JSON wird für die meisten Workflows empfohlen.",
|
||||
"The form field to search in (e.g., Field1 for first name, Field218 for email). You can find Field IDs in the form builder or via the Form Fields API.": "Das zu durchsuchende Formularfeld (z.B. Feld1 nach Vornamen, Field218 nach E-Mail). Feld-IDs finden Sie im Formular-Builder oder über die Formular-Feld-API.",
|
||||
"The value to search for in the specified field. For exact matches, use the complete value.": "Der zu suchende Wert im angegebenen Feld. Für exakte Übereinstimmungen verwenden Sie den vollständigen Wert.",
|
||||
"How to match the search value with field data. Choose based on your use case.": "Wie der Suchwert mit den Felddaten übereinstimmt. Wählen Sie nach Ihrem Anwendungsfall.",
|
||||
"Limit the number of results returned (1-50). Lower numbers are faster for deduplication checks.": "Limitiert die Anzahl der zurückgegebenen Ergebnisse (1-50). Niedrigere Zahlen sind schneller bei Deduplizierungsprüfungen.",
|
||||
"Order to return results. \"Newest First\" is best for finding recent duplicates.": "Um Ergebnisse zurückzugeben. \"Neueste Zuerst\" ist am besten um neuere Duplikate zu finden.",
|
||||
"Include additional information like submission date, IP address, and creation details.": "Fügen Sie zusätzliche Informationen wie Einreichungsdatum, IP-Adresse und Erstellungsdetails hinzu.",
|
||||
"Enter a specific Entry ID to retrieve just that entry. Leave blank to get multiple entries with other filters.": "Geben Sie eine bestimmte Eintrags-ID ein, um nur diesen Eintrag abzurufen. Lassen Sie leer, um mehrere Einträge mit anderen Filtern zu erhalten.",
|
||||
"The field ID to filter by (e.g., Field1, Field105, EntryId, DateCreated). Leave blank for no filtering.": "Das Feld ID nach dem gefiltert werden soll (z.B., Field1, Field105, EntryId, DateCreated). Leer lassen für keine Filter.",
|
||||
"How to compare the filter value with the field data.": "Wie man den Filterwert mit den Felddaten vergleicht.",
|
||||
"The value to filter by. For dates, use YYYY-MM-DD format or YYYY-MM-DD HH:MM:SS for specific times.": "Der Wert, nach dem gefiltert werden soll. Für Daten verwenden Sie das Format JJJJ-MM-TT oder JJJ-MM-TT HH:MM:SS für bestimmte Zeiten.",
|
||||
"Add a second filter field for more complex queries.": "Ein zweites Filterfeld für komplexere Abfragen hinzufügen.",
|
||||
"Operator for the second filter.": "Operator für den zweiten Filter.",
|
||||
"Value for the second filter.": "Wert für den zweiten Filter.",
|
||||
"How to combine multiple filters. Only applies when using multiple filters.": "Wie man mehrere Filter kombiniert. Gilt nur, wenn mehrere Filter verwendet werden.",
|
||||
"Sort results by field ID (e.g., EntryId, DateCreated, Field1). Leave blank for default order.": "Ergebnisse nach Feld ID sortieren (z. B. EntryId, DateErstellte, Feld1). Leer lassen für die Standardsortierung.",
|
||||
"Order to sort the results.": "Sortieren Sie die Ergebnisse.",
|
||||
"Starting entry number for pagination (0 = first entry).": "Starteintragsnummer für Paginierung (0 = erster Eintrag).",
|
||||
"Number of entries to return (maximum 100 per request).": "Anzahl der zurückzugebenden Einträge (maximal 100 pro Anfrage).",
|
||||
"Include additional metadata like IP address, payment status, and completion status.": "Fügen Sie zusätzliche Metadaten wie IP-Adresse, Zahlungsstatus und Fertigstellungsstatus hinzu.",
|
||||
"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..",
|
||||
"JSON": "JSON",
|
||||
"XML": "XML",
|
||||
"Exact Match": "Genaues Match",
|
||||
"Contains Text": "Enthält Text",
|
||||
"Starts With": "Beginnt mit",
|
||||
"Ends With": "Endet mit",
|
||||
"Does Not Contain": "Enthält nicht",
|
||||
"Is Not Equal To": "Ist nicht gleich zu",
|
||||
"Newest First": "Neueste zuerst",
|
||||
"Oldest First": "Älteste zuerst",
|
||||
"Is Equal To": "Ist gleich zu",
|
||||
"Contains": "Enthält",
|
||||
"Begins With": "Beginnt mit",
|
||||
"Is Greater Than": "Ist größer als",
|
||||
"Is Less Than": "Ist weniger als",
|
||||
"Is On (Date)": "Ist an (Datum)",
|
||||
"Is Before (Date)": "Ist vor (Datum)",
|
||||
"Is After (Date)": "Ist nach (Datum)",
|
||||
"Is Not Empty": "Ist nicht leer",
|
||||
"AND (All filters must match)": "UND (Alle Filter müssen übereinstimmen)",
|
||||
"OR (Any filter must match)": "ODER (Jeder Filter muss übereinstimmen)",
|
||||
"Descending (Newest first)": "Absteigend (Neueste zuerst)",
|
||||
"Ascending (Oldest first)": "Aufsteigend (Älteste zuerst)",
|
||||
"GET": "ERHALTEN",
|
||||
"POST": "POST",
|
||||
"PATCH": "PATCH",
|
||||
"PUT": "PUT",
|
||||
"DELETE": "LÖSCHEN",
|
||||
"HEAD": "HEAD",
|
||||
"New Form Entry": "Neuer Formulareintrag",
|
||||
"New Form Created": "Neues Formular erstellt",
|
||||
"Triggers when someone submits a new entry to your Wufoo form.": "Wird ausgelöst, wenn jemand einen neuen Eintrag in Ihr Wufoo-Formular einreicht.",
|
||||
"Triggers when a new form is created in your Wufoo account.": "Wird ausgelöst, wenn ein neues Formular in Ihrem Wufoo-Konto erstellt wird.",
|
||||
"Handshake Key (Optional)": "Handshake-Schlüssel (optional)",
|
||||
"Include Form Structure Metadata": "Metadaten der Formularstruktur einbeziehen",
|
||||
"Webhook Response Format": "Webhook Antwortformat",
|
||||
"Polling Interval": "Umfrageintervall",
|
||||
"Form Name Filter (Optional)": "Formularnamen-Filter (optional)",
|
||||
"Include Inactive Forms": "Inaktive Formulare einbeziehen",
|
||||
"A secret key to validate webhook authenticity and prevent unauthorized requests. Recommended for production workflows.": "Ein geheimer Schlüssel, um die Authentizität des Webhooks zu überprüfen und unautorisierte Anfragen zu verhindern. Empfohlen für Produktionsabläufe.",
|
||||
"Include detailed form and field structure information with each submission. Useful for dynamic processing but increases payload size.": "Fügen Sie detaillierte Formular- und Feldstrukturinformationen bei jeder Einreichung hinzu. Nützlich für dynamische Verarbeitung, aber erhöht die Nutzlastgröße.",
|
||||
"Choose the format for webhook data. JSON is recommended for most automation workflows.": "Wählen Sie das Format für Webhook-Daten. JSON wird für die meisten Automatisierungsworkflows empfohlen.",
|
||||
"How frequently to check for new forms. More frequent checking provides faster detection but uses more API calls.": "Wie oft man nach neuen Formularen sucht. Häufige Überprüfung sorgt für eine schnellere Erkennung, aber verwendet mehr API-Aufrufe.",
|
||||
"Only trigger for forms containing this text in their name. Leave empty to monitor all forms.": "Trigger nur für Formulare, die diesen Text in ihrem Namen enthalten. Leer lassen um alle Formulare zu überwachen.",
|
||||
"Include forms that are not currently active/published. Useful for monitoring all form creation activity.": "Füge Formulare hinzu, die derzeit nicht aktiv oder veröffentlicht sind. Nützlich zur Überwachung aller Formularerstellungstätigkeiten.",
|
||||
"Choose the format for form data. JSON is recommended for most workflows.": "Wählen Sie das Format für Formulardaten. JSON wird für die meisten Workflows empfohlen.",
|
||||
"Every 1 minute": "Alle 1 Minute",
|
||||
"Every 5 minutes": "Alle 5 Minuten",
|
||||
"Every 15 minutes": "Alle 15 Minuten",
|
||||
"Every 30 minutes": "Alle 30 Minuten",
|
||||
"Every hour": "Stündlich"
|
||||
}
|
||||
@@ -0,0 +1,124 @@
|
||||
{
|
||||
"API Key": "Clave API",
|
||||
"Subdomain": "Subdominio",
|
||||
"Your Wufoo account subdomain (e.g., for fishbowl.wufoo.com, use \"fishbowl\")": "Tu subdominio de cuenta de Wufoo (por ejemplo, para fishbowl.wufoo.com, usa \"fishbowl\")",
|
||||
"Enter your Wufoo API Key and Subdomain.": "Introduzca su clave y subdominio de API de Wufoo.",
|
||||
"Create Form Entry": "Crear entrada de formulario",
|
||||
"Find Form by Name or Hash": "Buscar Formulario por Nombre o Hash",
|
||||
"Find Submission by Field Value": "Encontrar envío por valor de campo",
|
||||
"Get Entry Details": "Detalles de la entrada",
|
||||
"Custom API Call": "Llamada API personalizada",
|
||||
"Submit a new entry to a Wufoo form with dynamic field selection.": "Enviar una nueva entrada a un formulario Wufoo con selección dinámica de campos.",
|
||||
"Get details about a Wufoo form including settings, entry counts, and metadata.": "Obtén detalles sobre un formulario de Wufoo incluyendo ajustes, recuentos de entradas y metadatas.",
|
||||
"Search for form submissions by field value for deduplication and lookup operations.": "Buscar envíos de formularios por valor de campo para operaciones de deduplicación y búsqueda.",
|
||||
"Get form entries with filtering, sorting, and pagination options.": "Obtener entradas de formulario con opciones de filtrado, ordenamiento y paginación.",
|
||||
"Make a custom API call to a specific endpoint": "Hacer una llamada API personalizada a un extremo específico",
|
||||
"Form Identifier (Name and Hash)": "Identificador de Formulario (Nombre y Hash)",
|
||||
"Response Format": "Formato de respuesta",
|
||||
"Form Fields": "Campos de Formulario",
|
||||
"Include Today Count": "Incluye el número de hoy",
|
||||
"Field ID": "ID del campo",
|
||||
"Search Value": "Valor de búsqueda",
|
||||
"Match Type": "Tipo de partida",
|
||||
"Maximum Results": "Resultados máximos",
|
||||
"Sort Order": "Ordenar",
|
||||
"Include Metadata": "Incluye metadatos",
|
||||
"Specific Entry ID (Optional)": "ID de entrada específica (opcional)",
|
||||
"Filter Field ID (Optional)": "ID de campo de filtro (opcional)",
|
||||
"Filter Operator": "Operador de filtro",
|
||||
"Filter Value (Optional)": "Valor del filtro (opcional)",
|
||||
"Second Filter Field (Optional)": "Segundo campo de filtro (opcional)",
|
||||
"Second Filter Operator": "Operador de segundo filtro",
|
||||
"Second Filter Value (Optional)": "Segundo valor de filtro (opcional)",
|
||||
"Filter Logic": "Filtrar lógica",
|
||||
"Sort By Field ID (Optional)": "Ordenar por ID de campo (opcional)",
|
||||
"Sort Direction": "Ordenar dirección",
|
||||
"Page Start": "Inicio de página",
|
||||
"Page Size": "Tamaño de página",
|
||||
"Include System Fields": "Incluye campos del sistema",
|
||||
"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 a Wufoo form to work with.": "Seleccione un formulario Wufoo con el que trabajar.",
|
||||
"Choose the format for the API response. JSON is recommended for most use cases.": "Elija el formato para la respuesta de la API. Se recomienda JSON para la mayoría de los casos de uso.",
|
||||
"Fill out the form fields with the data you want to submit. Field types and validation are automatically configured based on your form structure.": "Rellene los campos del formulario con los datos que desea enviar. Los tipos de campos y la validación se configuran automáticamente en función de su estructura del formulario.",
|
||||
"Choose the format for the API response. JSON is recommended for most integrations.": "Elija el formato para la respuesta API. Se recomienda JSON para la mayoría de las integraciones.",
|
||||
"Include the number of entries submitted today in the response. Useful for daily analytics and monitoring.": "Incluye el número de entradas enviadas hoy en la respuesta. Útil para análisis y monitoreo diarios.",
|
||||
"Choose the format for the API response. JSON is recommended for most workflows.": "Elija el formato para la respuesta API. Se recomienda JSON para la mayoría de los flujos de trabajo.",
|
||||
"The form field to search in (e.g., Field1 for first name, Field218 for email). You can find Field IDs in the form builder or via the Form Fields API.": "El campo de formulario en el que buscar (por ejemplo, Field1 para el nombre, Field218 para el correo electrónico). Puede encontrar IDs de campo en el compilador de formularios o a través de la API Campos de Formulario.",
|
||||
"The value to search for in the specified field. For exact matches, use the complete value.": "El valor a buscar en el campo especificado. Para coincidencias exactas, utilice el valor completo.",
|
||||
"How to match the search value with field data. Choose based on your use case.": "Cómo coincidir el valor de búsqueda con los datos de campo. Elija basándose en su caso de uso.",
|
||||
"Limit the number of results returned (1-50). Lower numbers are faster for deduplication checks.": "Limita el número de resultados devueltos (1-50). Los números más bajos son más rápidos para comprobaciones de deduplicación.",
|
||||
"Order to return results. \"Newest First\" is best for finding recent duplicates.": "Orden para devolver resultados. \"Lo primero más nuevo\" es mejor para encontrar duplicados recientes.",
|
||||
"Include additional information like submission date, IP address, and creation details.": "Incluye información adicional como fecha de envío, dirección IP y detalles de creación.",
|
||||
"Enter a specific Entry ID to retrieve just that entry. Leave blank to get multiple entries with other filters.": "Introduzca un ID de entrada específico para recuperar sólo esa entrada. Deje en blanco para obtener varias entradas con otros filtros.",
|
||||
"The field ID to filter by (e.g., Field1, Field105, EntryId, DateCreated). Leave blank for no filtering.": "El ID del campo a filtrar por (por ej., Campo1, Field105, EntryId, FechaCreado). Dejar en blanco para no filtrar.",
|
||||
"How to compare the filter value with the field data.": "Cómo comparar el valor del filtro con los datos del campo.",
|
||||
"The value to filter by. For dates, use YYYY-MM-DD format or YYYY-MM-DD HH:MM:SS for specific times.": "El valor para filtrar. Para fechas, utilice el formato YYYY-MM-DD o YYYY-MM-DD HH:MM:SS para tiempos específicos.",
|
||||
"Add a second filter field for more complex queries.": "Añadir un segundo campo de filtro para consultas más complejas.",
|
||||
"Operator for the second filter.": "Operador para el segundo filtro.",
|
||||
"Value for the second filter.": "Valor para el segundo filtro.",
|
||||
"How to combine multiple filters. Only applies when using multiple filters.": "Cómo combinar varios filtros. Sólo se aplica cuando se utilizan varios filtros.",
|
||||
"Sort results by field ID (e.g., EntryId, DateCreated, Field1). Leave blank for default order.": "Ordenar resultados por ID del campo (por ejemplo, EntryId, DateCreated, Field1). Dejar en blanco para el orden predeterminado.",
|
||||
"Order to sort the results.": "Ordenar los resultados.",
|
||||
"Starting entry number for pagination (0 = first entry).": "Número de entrada inicial para paginación (0 = primera entrada).",
|
||||
"Number of entries to return (maximum 100 per request).": "Número de entradas a devolver (máximo 100 por solicitud).",
|
||||
"Include additional metadata like IP address, payment status, and completion status.": "Incluye metadatos adicionales como dirección IP, estado de pago y estado de terminación.",
|
||||
"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.",
|
||||
"JSON": "JSON",
|
||||
"XML": "XML",
|
||||
"Exact Match": "Partida exacta",
|
||||
"Contains Text": "Contiene texto",
|
||||
"Starts With": "Comienza por",
|
||||
"Ends With": "Termina con",
|
||||
"Does Not Contain": "No contiene",
|
||||
"Is Not Equal To": "No es igual a",
|
||||
"Newest First": "Más nuevo primero",
|
||||
"Oldest First": "Más antiguo primero",
|
||||
"Is Equal To": "Es igual a",
|
||||
"Contains": "Contiene",
|
||||
"Begins With": "Comienza con",
|
||||
"Is Greater Than": "Es mayor que",
|
||||
"Is Less Than": "Es menor que",
|
||||
"Is On (Date)": "Encendido (DE)",
|
||||
"Is Before (Date)": "Es anterior (Dis)",
|
||||
"Is After (Date)": "Es Después (Dis)",
|
||||
"Is Not Empty": "No está vacío",
|
||||
"AND (All filters must match)": "AND (Todos los filtros deben coincidir)",
|
||||
"OR (Any filter must match)": "O (Cualquier filtro debe coincidir)",
|
||||
"Descending (Newest first)": "Descendente (más reciente primero)",
|
||||
"Ascending (Oldest first)": "Ascendente (más antiguo primero)",
|
||||
"GET": "RECOGER",
|
||||
"POST": "POST",
|
||||
"PATCH": "PATCH",
|
||||
"PUT": "PUT",
|
||||
"DELETE": "BORRAR",
|
||||
"HEAD": "LIMPIO",
|
||||
"New Form Entry": "Nueva entrada de formulario",
|
||||
"New Form Created": "Nuevo formulario creado",
|
||||
"Triggers when someone submits a new entry to your Wufoo form.": "Dispara cuando alguien envía una nueva entrada a tu formulario Wufoo.",
|
||||
"Triggers when a new form is created in your Wufoo account.": "Dispara cuando se crea un nuevo formulario en tu cuenta de Wufoo.",
|
||||
"Handshake Key (Optional)": "Llave de sacudido de mano (opcional)",
|
||||
"Include Form Structure Metadata": "Incluye metadatos de estructuras de formulario",
|
||||
"Webhook Response Format": "Formato de respuesta Webhook",
|
||||
"Polling Interval": "Intervalo de encuesta",
|
||||
"Form Name Filter (Optional)": "Filtro de nombre de formulario (opcional)",
|
||||
"Include Inactive Forms": "Incluye formularios inactivos",
|
||||
"A secret key to validate webhook authenticity and prevent unauthorized requests. Recommended for production workflows.": "Una clave secreta para validar la ciudad de webhook y prevenir solicitudes no autorizadas. Recomendado para flujos de trabajo de producción.",
|
||||
"Include detailed form and field structure information with each submission. Useful for dynamic processing but increases payload size.": "Incluye información detallada de forma y estructura de campo con cada envío. Útil para procesamiento dinámico, pero aumenta el tamaño de la carga útil.",
|
||||
"Choose the format for webhook data. JSON is recommended for most automation workflows.": "Elija el formato para los datos del webhook. Se recomienda JSON para la mayoría de los flujos de trabajo de automatización.",
|
||||
"How frequently to check for new forms. More frequent checking provides faster detection but uses more API calls.": "Con qué frecuencia comprobar nuevos formularios. Una comprobación más frecuente proporciona una detección más rápida pero utiliza más llamadas API.",
|
||||
"Only trigger for forms containing this text in their name. Leave empty to monitor all forms.": "Sólo disparador para formularios que contengan este texto en su nombre. Deje en blanco para monitorear todos los formularios.",
|
||||
"Include forms that are not currently active/published. Useful for monitoring all form creation activity.": "Incluye formularios que actualmente no están activos/publicados. Útil para supervisar toda la actividad de creación de formularios.",
|
||||
"Choose the format for form data. JSON is recommended for most workflows.": "Elija el formato para los datos del formulario. Se recomienda JSON para la mayoría de los flujos de trabajo.",
|
||||
"Every 1 minute": "Cada 1 minuto",
|
||||
"Every 5 minutes": "Cada 5 minutos",
|
||||
"Every 15 minutes": "Cada 15 minutos",
|
||||
"Every 30 minutes": "Cada 30 minutos",
|
||||
"Every hour": "Cada hora"
|
||||
}
|
||||
@@ -0,0 +1,124 @@
|
||||
{
|
||||
"API Key": "Clé API",
|
||||
"Subdomain": "Sous-domaine",
|
||||
"Your Wufoo account subdomain (e.g., for fishbowl.wufoo.com, use \"fishbowl\")": "Votre sous-domaine de compte Wufoo (par exemple, pour fishbowl.wufoo.com, utilisez \"fishbowl\")",
|
||||
"Enter your Wufoo API Key and Subdomain.": "Entrez votre clé API et sous-domaine Wufoo.",
|
||||
"Create Form Entry": "Créer une entrée de formulaire",
|
||||
"Find Form by Name or Hash": "Trouver le formulaire par nom ou par hachage",
|
||||
"Find Submission by Field Value": "Rechercher la soumission par valeur de champ",
|
||||
"Get Entry Details": "Obtenir les détails de l'entrée",
|
||||
"Custom API Call": "Appel d'API personnalisé",
|
||||
"Submit a new entry to a Wufoo form with dynamic field selection.": "Soumettez une nouvelle entrée dans un formulaire Wufoo avec sélection de champs dynamiques.",
|
||||
"Get details about a Wufoo form including settings, entry counts, and metadata.": "Obtenez des détails sur un formulaire Wufoo incluant les paramètres, le nombre d'entrées et les métadonnées.",
|
||||
"Search for form submissions by field value for deduplication and lookup operations.": "Recherche des soumissions de formulaire par valeur de champ pour les opérations de déduplication et de recherche.",
|
||||
"Get form entries with filtering, sorting, and pagination options.": "Récupère les entrées de formulaire avec les options de filtrage, de tri et de pagination.",
|
||||
"Make a custom API call to a specific endpoint": "Passer un appel API personnalisé à un endpoint spécifique",
|
||||
"Form Identifier (Name and Hash)": "Identifiant du formulaire (nom et hachage)",
|
||||
"Response Format": "Format de réponse",
|
||||
"Form Fields": "Champs de formulaire",
|
||||
"Include Today Count": "Inclure le nombre d'aujourd'hui",
|
||||
"Field ID": "ID du champ",
|
||||
"Search Value": "Valeur de la recherche",
|
||||
"Match Type": "Type de correspondance",
|
||||
"Maximum Results": "Nombre maximum de résultats",
|
||||
"Sort Order": "Ordre de tri",
|
||||
"Include Metadata": "Inclure les métadonnées",
|
||||
"Specific Entry ID (Optional)": "ID d'entrée spécifique (facultatif)",
|
||||
"Filter Field ID (Optional)": "ID du champ de filtre (facultatif)",
|
||||
"Filter Operator": "Opérateur de filtre",
|
||||
"Filter Value (Optional)": "Valeur du filtre (facultatif)",
|
||||
"Second Filter Field (Optional)": "Deuxième champ de filtre (facultatif)",
|
||||
"Second Filter Operator": "Deuxième opérateur de filtre",
|
||||
"Second Filter Value (Optional)": "Valeur du deuxième filtre (facultatif)",
|
||||
"Filter Logic": "Logique du filtre",
|
||||
"Sort By Field ID (Optional)": "Trier par ID de champ (facultatif)",
|
||||
"Sort Direction": "Direction de tri",
|
||||
"Page Start": "Démarrage de la page",
|
||||
"Page Size": "Nombre d'élément",
|
||||
"Include System Fields": "Inclure les champs système",
|
||||
"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'expiration (en secondes)",
|
||||
"Select a Wufoo form to work with.": "Sélectionnez un formulaire Wufoo avec lequel vous pouvez travailler.",
|
||||
"Choose the format for the API response. JSON is recommended for most use cases.": "Choisissez le format de la réponse de l'API. JSON est recommandé pour la plupart des cas d'utilisation.",
|
||||
"Fill out the form fields with the data you want to submit. Field types and validation are automatically configured based on your form structure.": "Remplissez les champs de formulaire avec les données que vous souhaitez soumettre. Les types de champs et la validation sont automatiquement configurés en fonction de votre structure de formulaire.",
|
||||
"Choose the format for the API response. JSON is recommended for most integrations.": "Choisissez le format de la réponse de l'API. JSON est recommandé pour la plupart des intégrations.",
|
||||
"Include the number of entries submitted today in the response. Useful for daily analytics and monitoring.": "Inclure le nombre d'entrées soumises aujourd'hui dans la réponse. Utile pour l'analyse quotidienne et la surveillance.",
|
||||
"Choose the format for the API response. JSON is recommended for most workflows.": "Choisissez le format de la réponse de l'API. JSON est recommandé pour la plupart des workflows.",
|
||||
"The form field to search in (e.g., Field1 for first name, Field218 for email). You can find Field IDs in the form builder or via the Form Fields API.": "Le champ de formulaire dans lequel rechercher (par exemple, Field1 pour le prénom, Field218 pour l'e-mail). Vous pouvez trouver des IDs de champs dans le constructeur de formulaire ou via l'API des champs de formulaire.",
|
||||
"The value to search for in the specified field. For exact matches, use the complete value.": "La valeur à rechercher dans le champ spécifié. Pour des correspondances exactes, utilisez la valeur complète.",
|
||||
"How to match the search value with field data. Choose based on your use case.": "Comment faire correspondre la valeur de la recherche avec les données de champs. Choisissez en fonction de votre cas d'utilisation.",
|
||||
"Limit the number of results returned (1-50). Lower numbers are faster for deduplication checks.": "Limiter le nombre de résultats retournés (1-50). Les nombres inférieurs sont plus rapides pour les vérifications de déduplication .",
|
||||
"Order to return results. \"Newest First\" is best for finding recent duplicates.": "Ordre de retour des résultats. « Le plus récent d'abord» est le meilleur moyen de trouver les doublons récents.",
|
||||
"Include additional information like submission date, IP address, and creation details.": "Inclure des informations supplémentaires telles que la date de soumission, l'adresse IP et les détails de création.",
|
||||
"Enter a specific Entry ID to retrieve just that entry. Leave blank to get multiple entries with other filters.": "Entrez un ID d'entrée spécifique pour récupérer uniquement cette entrée. Laissez vide pour obtenir plusieurs entrées avec d'autres filtres.",
|
||||
"The field ID to filter by (e.g., Field1, Field105, EntryId, DateCreated). Leave blank for no filtering.": "L'ID du champ à filtrer par (par exemple, Field1, Field105, EntryId, DateCreated). Laisser vide pour aucun filtrage.",
|
||||
"How to compare the filter value with the field data.": "Comment comparer la valeur du filtre avec les données du champ.",
|
||||
"The value to filter by. For dates, use YYYY-MM-DD format or YYYY-MM-DD HH:MM:SS for specific times.": "La valeur à filtrer. Pour les dates, utilisez le format AAAA-MM-JJ ou AAAA-MM-JJ HH:MM:SS pour des heures spécifiques.",
|
||||
"Add a second filter field for more complex queries.": "Ajouter un second champ de filtre pour des requêtes plus complexes.",
|
||||
"Operator for the second filter.": "Opérateur pour le second filtre.",
|
||||
"Value for the second filter.": "Valeur pour le second filtre.",
|
||||
"How to combine multiple filters. Only applies when using multiple filters.": "Comment combiner plusieurs filtres. Ne s'applique que si vous utilisez plusieurs filtres.",
|
||||
"Sort results by field ID (e.g., EntryId, DateCreated, Field1). Leave blank for default order.": "Trier les résultats par ID de champ (par exemple, EntryId, DateCreated, Field1). Laisser vide pour l'ordre par défaut.",
|
||||
"Order to sort the results.": "Ordre de tri des résultats.",
|
||||
"Starting entry number for pagination (0 = first entry).": "Numéro d'entrée de départ pour la pagination (0 = première entrée).",
|
||||
"Number of entries to return (maximum 100 per request).": "Nombre d'entrées à retourner (maximum 100 par demande).",
|
||||
"Include additional metadata like IP address, payment status, and completion status.": "Inclure des métadonnées supplémentaires comme l'adresse IP, le statut de paiement et le statut d'achèvement.",
|
||||
"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.",
|
||||
"JSON": "JSON",
|
||||
"XML": "XML",
|
||||
"Exact Match": "Correspondance exacte",
|
||||
"Contains Text": "Contient du texte",
|
||||
"Starts With": "Commence avec",
|
||||
"Ends With": "Se termine par",
|
||||
"Does Not Contain": "Ne contient pas",
|
||||
"Is Not Equal To": "N'est pas égal à",
|
||||
"Newest First": "Plus récent en premier",
|
||||
"Oldest First": "Le plus ancien en premier",
|
||||
"Is Equal To": "Est égal à",
|
||||
"Contains": "Contient",
|
||||
"Begins With": "Commence par",
|
||||
"Is Greater Than": "Est supérieur à",
|
||||
"Is Less Than": "Est inférieur à",
|
||||
"Is On (Date)": "Est activé (Date)",
|
||||
"Is Before (Date)": "Est avant (Date)",
|
||||
"Is After (Date)": "Est après (Date)",
|
||||
"Is Not Empty": "N'est pas vide",
|
||||
"AND (All filters must match)": "ET (Tous les filtres doivent correspondre)",
|
||||
"OR (Any filter must match)": "OU (N'importe quel filtre doit correspondre)",
|
||||
"Descending (Newest first)": "Décroissant (plus récent en premier)",
|
||||
"Ascending (Oldest first)": "Ascendant (plus ancien en premier)",
|
||||
"GET": "GET",
|
||||
"POST": "POST",
|
||||
"PATCH": "PATCH",
|
||||
"PUT": "PUT",
|
||||
"DELETE": "DELETE",
|
||||
"HEAD": "HEAD",
|
||||
"New Form Entry": "Nouvelle entrée de formulaire",
|
||||
"New Form Created": "Nouveau formulaire créé",
|
||||
"Triggers when someone submits a new entry to your Wufoo form.": "Déclenche quand quelqu'un soumet une nouvelle entrée à votre formulaire Wufoo.",
|
||||
"Triggers when a new form is created in your Wufoo account.": "Déclenche lorsqu'un nouveau formulaire est créé dans votre compte Wufoo.",
|
||||
"Handshake Key (Optional)": "Touche de poignée de main (facultatif)",
|
||||
"Include Form Structure Metadata": "Inclure les métadonnées de la structure de formulaire",
|
||||
"Webhook Response Format": "Format de réponse du Webhook",
|
||||
"Polling Interval": "Intervalle de vote",
|
||||
"Form Name Filter (Optional)": "Filtre de nom de formulaire (facultatif)",
|
||||
"Include Inactive Forms": "Inclure les formulaires inactifs",
|
||||
"A secret key to validate webhook authenticity and prevent unauthorized requests. Recommended for production workflows.": "Une clé secrète pour valider l'authenticité du webhook et prévenir les requêtes non autorisées. Recommandée pour les flux de production.",
|
||||
"Include detailed form and field structure information with each submission. Useful for dynamic processing but increases payload size.": "Inclure des informations détaillées sur le formulaire et la structure du champ à chaque soumission. Utile pour un traitement dynamique mais augmente la taille de la charge utile.",
|
||||
"Choose the format for webhook data. JSON is recommended for most automation workflows.": "Choisissez le format des données du webhook. JSON est recommandé pour la plupart des flux de travail d'automatisation.",
|
||||
"How frequently to check for new forms. More frequent checking provides faster detection but uses more API calls.": "Fréquence de vérification des nouveaux formulaires. Des vérifications plus fréquentes permettent une détection plus rapide mais utilisent plus d'appels API.",
|
||||
"Only trigger for forms containing this text in their name. Leave empty to monitor all forms.": "Déclenche uniquement les formulaires contenant ce texte dans leur nom. Laisser vide pour surveiller tous les formulaires.",
|
||||
"Include forms that are not currently active/published. Useful for monitoring all form creation activity.": "Inclure les formulaires qui ne sont pas actuellement actifs/publiés. Utile pour surveiller toutes les activités de création de formulaires.",
|
||||
"Choose the format for form data. JSON is recommended for most workflows.": "Choisissez le format pour les données de formulaire. JSON est recommandé pour la plupart des workflows.",
|
||||
"Every 1 minute": "Toutes les 1 minute",
|
||||
"Every 5 minutes": "Toutes les 5 minutes",
|
||||
"Every 15 minutes": "Toutes les 15 minutes",
|
||||
"Every 30 minutes": "Toutes les 30 minutes",
|
||||
"Every hour": "Toutes les heures"
|
||||
}
|
||||
@@ -0,0 +1,124 @@
|
||||
{
|
||||
"API Key": "API キー",
|
||||
"Subdomain": "サブドメイン",
|
||||
"Your Wufoo account subdomain (e.g., for fishbowl.wufoo.com, use \"fishbowl\")": "Wufoo アカウントのサブドメイン(例:fishbowl.wufoo.comの場合は、\"fishbowl\"を使用してください)",
|
||||
"Enter your Wufoo API Key and Subdomain.": "Wufoo APIキーとサブドメインを入力します。",
|
||||
"Create Form Entry": "フォームエントリを作成",
|
||||
"Find Form by Name or Hash": "名前またはハッシュでフォームを検索",
|
||||
"Find Submission by Field Value": "フィールド値で提出物を検索",
|
||||
"Get Entry Details": "エントリーの詳細を取得する",
|
||||
"Custom API Call": "カスタムAPI通話",
|
||||
"Submit a new entry to a Wufoo form with dynamic field selection.": "フィールド選択がダイナミックなWufoo フォームに新しいエントリを送信します。",
|
||||
"Get details about a Wufoo form including settings, entry counts, and metadata.": "設定、エントリ数、メタデータなど、Wufoo フォームの詳細を取得します。",
|
||||
"Search for form submissions by field value for deduplication and lookup operations.": "重複排除とルックアップ操作の項目値でフォームの提出物を検索します。",
|
||||
"Get form entries with filtering, sorting, and pagination options.": "フィルタリング、並べ替え、ページネーションオプションを使用してフォームエントリを取得します。",
|
||||
"Make a custom API call to a specific endpoint": "特定のエンドポイントへのカスタム API コールを実行します。",
|
||||
"Form Identifier (Name and Hash)": "フォーム識別子 (名前とハッシュ)",
|
||||
"Response Format": "応答形式",
|
||||
"Form Fields": "フォームフィールド",
|
||||
"Include Today Count": "今日の数を含める",
|
||||
"Field ID": "フィールドID",
|
||||
"Search Value": "検索値",
|
||||
"Match Type": "一致するタイプ",
|
||||
"Maximum Results": "最大結果",
|
||||
"Sort Order": "並び順",
|
||||
"Include Metadata": "メタデータを含める",
|
||||
"Specific Entry ID (Optional)": "特定のエントリ ID(オプション)",
|
||||
"Filter Field ID (Optional)": "フィルタフィールド ID (オプション)",
|
||||
"Filter Operator": "フィルター演算子",
|
||||
"Filter Value (Optional)": "フィルタの値(任意)",
|
||||
"Second Filter Field (Optional)": "2番目のフィルタ項目(オプション)",
|
||||
"Second Filter Operator": "Second Filter Operator",
|
||||
"Second Filter Value (Optional)": "2番目のフィルタ値(オプション)",
|
||||
"Filter Logic": "フィルタのロジック",
|
||||
"Sort By Field ID (Optional)": "項目IDで並び替え(オプション)",
|
||||
"Sort Direction": "並べ替え方向",
|
||||
"Page Start": "ページの開始",
|
||||
"Page Size": "ページサイズ",
|
||||
"Include System Fields": "システムフィールドを含める",
|
||||
"Method": "方法",
|
||||
"Headers": "ヘッダー",
|
||||
"Query Parameters": "クエリパラメータ",
|
||||
"Body": "本文",
|
||||
"Response is Binary ?": "応答はバイナリですか?",
|
||||
"No Error on Failure": "失敗時にエラーはありません",
|
||||
"Timeout (in seconds)": "タイムアウト(秒)",
|
||||
"Select a Wufoo form to work with.": "一緒に作業するWufoo フォームを選択します。",
|
||||
"Choose the format for the API response. JSON is recommended for most use cases.": "APIレスポンスのフォーマットを選択してください。ほとんどの場合、JSONが推奨されます。",
|
||||
"Fill out the form fields with the data you want to submit. Field types and validation are automatically configured based on your form structure.": "送信するデータでフォームフィールドに入力します。フィールドの種類と検証は、フォーム構造に基づいて自動的に構成されます。",
|
||||
"Choose the format for the API response. JSON is recommended for most integrations.": "APIレスポンスのフォーマットを選択してください。ほとんどのインテグレーションではJSONをお勧めします。",
|
||||
"Include the number of entries submitted today in the response. Useful for daily analytics and monitoring.": "今日の回答に投稿されたエントリ数を含めます。毎日の分析やモニタリングに役立ちます。",
|
||||
"Choose the format for the API response. JSON is recommended for most workflows.": "API 応答の形式を選択します。ほとんどのワークフローでは、JSON が推奨されます。",
|
||||
"The form field to search in (e.g., Field1 for first name, Field218 for email). You can find Field IDs in the form builder or via the Form Fields API.": "検索するフォームフィールド(例:メール用のフィールド名、フィールド218)。 フォーム ビルダーまたはフォーム フィールド API を使用して、フィールド ID を見つけることができます。",
|
||||
"The value to search for in the specified field. For exact matches, use the complete value.": "指定されたフィールドで検索する値。正確に一致する場合は、完全な値を使用してください。",
|
||||
"How to match the search value with field data. Choose based on your use case.": "フィールドデータと検索値を一致させる方法。ユースケースに基づいて選択してください。",
|
||||
"Limit the number of results returned (1-50). Lower numbers are faster for deduplication checks.": "返される結果の数を制限します(1-50)。 重複排除チェックの場合、より低い数字がより速くなります。",
|
||||
"Order to return results. \"Newest First\" is best for finding recent duplicates.": "結果を返すための注文。\"最新の最初\"は、最近の重複を検索するのに最適です。",
|
||||
"Include additional information like submission date, IP address, and creation details.": "提出日、IPアドレス、作成の詳細などの追加情報を含めます。",
|
||||
"Enter a specific Entry ID to retrieve just that entry. Leave blank to get multiple entries with other filters.": "そのエントリだけを取得するには、特定のエントリ ID を入力します。他のフィルタで複数のエントリを取得するには、空白のままにします。",
|
||||
"The field ID to filter by (e.g., Field1, Field105, EntryId, DateCreated). Leave blank for no filtering.": "フィルタリングするフィールド ID (例: Field1, Field105, EntryId, DateCreated)。フィルタリングしない場合は空白のままにします。",
|
||||
"How to compare the filter value with the field data.": "フィルタの値をフィールドデータと比較する方法。",
|
||||
"The value to filter by. For dates, use YYYY-MM-DD format or YYYY-MM-DD HH:MM:SS for specific times.": "フィルタリングする値。日付の場合は、YYYY-MM-DD フォーマットまたは YYYY-MM-DD HHH:MM:SS を特定の時間に使用します。",
|
||||
"Add a second filter field for more complex queries.": "より複雑なクエリのために2つ目のフィルタフィールドを追加します。",
|
||||
"Operator for the second filter.": "2 番目のフィルタの演算子。",
|
||||
"Value for the second filter.": "2 番目のフィルタの値です。",
|
||||
"How to combine multiple filters. Only applies when using multiple filters.": "複数のフィルタを組み合わせる方法は、複数のフィルタを使用する場合にのみ適用されます。",
|
||||
"Sort results by field ID (e.g., EntryId, DateCreated, Field1). Leave blank for default order.": "フィールド ID (例: EntryId, DateCreated, Field1)で結果をソートします。デフォルトの順序は空白のままにします。",
|
||||
"Order to sort the results.": "結果を並べ替える順序です。",
|
||||
"Starting entry number for pagination (0 = first entry).": "ページネーションの開始エントリ番号(0 = 最初のエントリ)。",
|
||||
"Number of entries to return (maximum 100 per request).": "Number of entries to return (maximum 100 per request).",
|
||||
"Include additional metadata like IP address, payment status, and completion status.": "IPアドレス、支払いステータス、完了ステータスなどの追加のメタデータを含めます。",
|
||||
"Authorization headers are injected automatically from your connection.": "認証ヘッダは接続から自動的に注入されます。",
|
||||
"Enable for files like PDFs, images, etc..": "PDF、画像などのファイルを有効にします。",
|
||||
"JSON": "JSON",
|
||||
"XML": "XML",
|
||||
"Exact Match": "完全一致",
|
||||
"Contains Text": "テキストを含む",
|
||||
"Starts With": "で始まる",
|
||||
"Ends With": "で終了",
|
||||
"Does Not Contain": "含まない",
|
||||
"Is Not Equal To": "等しくない",
|
||||
"Newest First": "最も新しい順",
|
||||
"Oldest First": "古い順",
|
||||
"Is Equal To": "等しい順",
|
||||
"Contains": "以下を含む",
|
||||
"Begins With": "で始まる",
|
||||
"Is Greater Than": "より大きい",
|
||||
"Is Less Than": "以下",
|
||||
"Is On (Date)": "オン (日付)",
|
||||
"Is Before (Date)": "前 (日付)",
|
||||
"Is After (Date)": "後 (日付)",
|
||||
"Is Not Empty": "空ではありません",
|
||||
"AND (All filters must match)": "AND (すべてのフィルターが一致する必要があります)",
|
||||
"OR (Any filter must match)": "OR (任意のフィルターは一致しなければなりません)",
|
||||
"Descending (Newest first)": "降順",
|
||||
"Ascending (Oldest first)": "昇順 (古い順)",
|
||||
"GET": "取得",
|
||||
"POST": "POST",
|
||||
"PATCH": "PATCH",
|
||||
"PUT": "PUT",
|
||||
"DELETE": "削除",
|
||||
"HEAD": "頭",
|
||||
"New Form Entry": "新しいフォームのエントリ",
|
||||
"New Form Created": "新しいフォームが作成されました",
|
||||
"Triggers when someone submits a new entry to your Wufoo form.": "誰かがあなたのWufooフォームに新しいエントリを送信したときにトリガーします。",
|
||||
"Triggers when a new form is created in your Wufoo account.": "Wufoo アカウントに新しいフォームが作成されたときにトリガーします。",
|
||||
"Handshake Key (Optional)": "ハンドシェイクキー (任意)",
|
||||
"Include Form Structure Metadata": "フォーム構造のメタデータを含める",
|
||||
"Webhook Response Format": "Webhook 応答フォーマット",
|
||||
"Polling Interval": "ポーリング間隔",
|
||||
"Form Name Filter (Optional)": "フォーム名フィルタ(オプション)",
|
||||
"Include Inactive Forms": "無効なフォームを含める",
|
||||
"A secret key to validate webhook authenticity and prevent unauthorized requests. Recommended for production workflows.": "Webhook認証性を検証し、許可されていないリクエストを防ぐための秘密鍵です。本番ワークフローに推奨します。",
|
||||
"Include detailed form and field structure information with each submission. Useful for dynamic processing but increases payload size.": "各提出物に詳細なフォームとフィールド構造情報を含めます。動的な処理に便利ですが、ペイロードサイズを大きくします。",
|
||||
"Choose the format for webhook data. JSON is recommended for most automation workflows.": "Webhookデータのフォーマットを選択します。ほとんどの自動化ワークフローではJSONが推奨されます。",
|
||||
"How frequently to check for new forms. More frequent checking provides faster detection but uses more API calls.": "新しいフォームをチェックする頻度。チェックが頻繁に行われると、検出が速くなりますが、より多くの API コールが使用されます。",
|
||||
"Only trigger for forms containing this text in their name. Leave empty to monitor all forms.": "このテキストを含むフォームのトリガーのみです。すべてのフォームを監視するには空のままにしてください。",
|
||||
"Include forms that are not currently active/published. Useful for monitoring all form creation activity.": "現在アクティブ/公開されていないフォームを含めます。すべてのフォーム作成アクティビティを監視するのに便利です。",
|
||||
"Choose the format for form data. JSON is recommended for most workflows.": "フォームデータのフォーマットを選択します。ほとんどのワークフローではJSONが推奨されます。",
|
||||
"Every 1 minute": "1 分ごと",
|
||||
"Every 5 minutes": "5分ごと",
|
||||
"Every 15 minutes": "15 分ごと",
|
||||
"Every 30 minutes": "30分ごと",
|
||||
"Every hour": "1時間ごと"
|
||||
}
|
||||
@@ -0,0 +1,124 @@
|
||||
{
|
||||
"API Key": "API Sleutel",
|
||||
"Subdomain": "Subdomein",
|
||||
"Your Wufoo account subdomain (e.g., for fishbowl.wufoo.com, use \"fishbowl\")": "Uw Wufoo account subdomein (bijv. voor visbowl.wufoo.com, gebruik \"fishbowl\")",
|
||||
"Enter your Wufoo API Key and Subdomain.": "Voer uw Wufoo API-sleutel en subdomein in.",
|
||||
"Create Form Entry": "Formulier invoer maken",
|
||||
"Find Form by Name or Hash": "Formulier zoeken op naam of Hash",
|
||||
"Find Submission by Field Value": "Zoek inzending op veldwaarde",
|
||||
"Get Entry Details": "Haal Invoer Details op",
|
||||
"Custom API Call": "Custom API Call",
|
||||
"Submit a new entry to a Wufoo form with dynamic field selection.": "Dien een nieuw item in op een Wufoo formulier met dynamische veld selectie.",
|
||||
"Get details about a Wufoo form including settings, entry counts, and metadata.": "Krijg details over een Wufoo formulier, waaronder instellingen, ingangen en metadata.",
|
||||
"Search for form submissions by field value for deduplication and lookup operations.": "Zoek naar formulierinzendingen per veld waarde voor deduplicatie en het opzoeken van operaties.",
|
||||
"Get form entries with filtering, sorting, and pagination options.": "Krijg formuliervermeldingen met filter-, sorterings- en pagineringsopties.",
|
||||
"Make a custom API call to a specific endpoint": "Maak een aangepaste API call naar een specifiek eindpunt",
|
||||
"Form Identifier (Name and Hash)": "Formulier id (naam en Hash)",
|
||||
"Response Format": "Antwoord formaat",
|
||||
"Form Fields": "Formulier velden",
|
||||
"Include Today Count": "Inclusief 'Vandaag'",
|
||||
"Field ID": "Veld ID",
|
||||
"Search Value": "Waarde zoeken",
|
||||
"Match Type": "Wedstrijd Type",
|
||||
"Maximum Results": "Maximaal aantal resultaten",
|
||||
"Sort Order": "Sorteren bestelling",
|
||||
"Include Metadata": "Inclusief metadata",
|
||||
"Specific Entry ID (Optional)": "Specifieke invoer-ID (optioneel)",
|
||||
"Filter Field ID (Optional)": "Filter veld-ID (optioneel)",
|
||||
"Filter Operator": "Filter operator",
|
||||
"Filter Value (Optional)": "Filter waarde (optioneel)",
|
||||
"Second Filter Field (Optional)": "Tweede filterveld (optioneel)",
|
||||
"Second Filter Operator": "Tweede filter operator",
|
||||
"Second Filter Value (Optional)": "Tweede filterwaarde (optioneel)",
|
||||
"Filter Logic": "Filter Logica",
|
||||
"Sort By Field ID (Optional)": "Sorteren op veld-ID (optioneel)",
|
||||
"Sort Direction": "Sorteer richting",
|
||||
"Page Start": "Pagina start",
|
||||
"Page Size": "Paginagrootte",
|
||||
"Include System Fields": "Inclusief systeemvelden",
|
||||
"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 a Wufoo form to work with.": "Selecteer een Wufoo formulier om mee te werken.",
|
||||
"Choose the format for the API response. JSON is recommended for most use cases.": "Kies het formaat voor de API respons. JSON wordt aanbevolen voor de meeste gevallen die je gebruikt.",
|
||||
"Fill out the form fields with the data you want to submit. Field types and validation are automatically configured based on your form structure.": "Vul de formuliervelden in met de gegevens die je wilt indienen. Veldtypes en -validatie worden automatisch geconfigureerd op basis van je formulierstructuur.",
|
||||
"Choose the format for the API response. JSON is recommended for most integrations.": "Kies het formaat van de API reactie. JSON is aanbevolen voor de meeste integraties.",
|
||||
"Include the number of entries submitted today in the response. Useful for daily analytics and monitoring.": "Voeg het aantal inzendingen toe in de reactie. Handig voor dagelijkse analytics en monitoring.",
|
||||
"Choose the format for the API response. JSON is recommended for most workflows.": "Kies het formaat voor de API respons. JSON wordt aanbevolen voor de meeste workflows.",
|
||||
"The form field to search in (e.g., Field1 for first name, Field218 for email). You can find Field IDs in the form builder or via the Form Fields API.": "Het formulierveld om in te zoeken (bijvoorbeeld, Field1 voor voornaam, Field218 voor e-mail). U vindt Field IDs in de formulierbouwer of via de Form Fields API.",
|
||||
"The value to search for in the specified field. For exact matches, use the complete value.": "De waarde om naar te zoeken in het opgegeven veld. Voor exacte overeenkomsten, gebruik de volledige waarde.",
|
||||
"How to match the search value with field data. Choose based on your use case.": "Hoe de zoekwaarde aan gegevens uit het veld te koppelen. Kies gebaseerd op uw gebruik case.",
|
||||
"Limit the number of results returned (1-50). Lower numbers are faster for deduplication checks.": "Beperk het aantal resultaten dat geretourneerd wordt (1-50). Lagere getallen zijn sneller voor deduplicatie controles.",
|
||||
"Order to return results. \"Newest First\" is best for finding recent duplicates.": "Bestelling om resultaten te retourneren. \"Nieuwste eerst\" is het beste voor het vinden van recente duplicaten.",
|
||||
"Include additional information like submission date, IP address, and creation details.": "Inclusief aanvullende informatie zoals indieningsdatum, IP-adres en aanmaakdetails.",
|
||||
"Enter a specific Entry ID to retrieve just that entry. Leave blank to get multiple entries with other filters.": "Vul een specifiek invoer-ID in om deze invoer op te halen. Laat leeg om meerdere invoergegevens met andere filters te krijgen.",
|
||||
"The field ID to filter by (e.g., Field1, Field105, EntryId, DateCreated). Leave blank for no filtering.": "Het veld ID om te filteren op (bijvoorbeeld, Field1, Field105, EntryId, DateCreated). Laat leeg voor geen filteren.",
|
||||
"How to compare the filter value with the field data.": "Hoe de filterwaarde te vergelijken met gegevens in het veld.",
|
||||
"The value to filter by. For dates, use YYYY-MM-DD format or YYYY-MM-DD HH:MM:SS for specific times.": "De filterwaarde op datum, gebruik JJJJ-MM-DD formaat of YYYY-MM-DD HH:MM:SS voor specifieke tijden.",
|
||||
"Add a second filter field for more complex queries.": "Voeg een tweede filterveld toe voor meer complexe query's.",
|
||||
"Operator for the second filter.": "Operator voor het tweede filter.",
|
||||
"Value for the second filter.": "Waarde voor het tweede filter.",
|
||||
"How to combine multiple filters. Only applies when using multiple filters.": "Hoe meerdere filters te combineren. Alleen van toepassing bij het gebruik van meerdere filters.",
|
||||
"Sort results by field ID (e.g., EntryId, DateCreated, Field1). Leave blank for default order.": "Sorteer de resultaten op veld ID (bijv. EntryId, DateCreated, Field1). Laat leeg voor de standaardvolgorde.",
|
||||
"Order to sort the results.": "Volgorde om de resultaten te sorteren.",
|
||||
"Starting entry number for pagination (0 = first entry).": "Startnummer voor paginering (0 = eerste invoer).",
|
||||
"Number of entries to return (maximum 100 per request).": "Aantal items om terug te keren (maximaal 100 per aanvraag).",
|
||||
"Include additional metadata like IP address, payment status, and completion status.": "Inclusief extra metadata zoals IP-adres, betalingsstatus en voltooiingsstatus.",
|
||||
"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..",
|
||||
"JSON": "JSON",
|
||||
"XML": "XML",
|
||||
"Exact Match": "Exacte overeenkomst",
|
||||
"Contains Text": "Bevat tekst",
|
||||
"Starts With": "Begint met",
|
||||
"Ends With": "Eindigt met",
|
||||
"Does Not Contain": "Bevat niet",
|
||||
"Is Not Equal To": "Is niet gelijk aan",
|
||||
"Newest First": "Nieuwste eerst",
|
||||
"Oldest First": "Oudste eerst",
|
||||
"Is Equal To": "Gelijk aan",
|
||||
"Contains": "Bevat",
|
||||
"Begins With": "Begint met",
|
||||
"Is Greater Than": "Is Groter dan",
|
||||
"Is Less Than": "Is minder dan",
|
||||
"Is On (Date)": "Is op (datum)",
|
||||
"Is Before (Date)": "Is vóór (datum)",
|
||||
"Is After (Date)": "Is na (datum)",
|
||||
"Is Not Empty": "Is niet leeg",
|
||||
"AND (All filters must match)": "EN (alle filters moeten overeenkomen)",
|
||||
"OR (Any filter must match)": "OF (elk filter moet overeenkomen)",
|
||||
"Descending (Newest first)": "Aflopend (Nieuwste eerst)",
|
||||
"Ascending (Oldest first)": "Oplopend (oudste eerst)",
|
||||
"GET": "KRIJG",
|
||||
"POST": "POSTE",
|
||||
"PATCH": "BEKIJK",
|
||||
"PUT": "PUT",
|
||||
"DELETE": "VERWIJDEREN",
|
||||
"HEAD": "HOOFD",
|
||||
"New Form Entry": "Nieuwe formulierinvoer",
|
||||
"New Form Created": "Nieuw formulier aangemaakt",
|
||||
"Triggers when someone submits a new entry to your Wufoo form.": "Triggert wanneer iemand een nieuwe invoer indient in uw Wufoo formulier.",
|
||||
"Triggers when a new form is created in your Wufoo account.": "Triggert wanneer een nieuw formulier wordt aangemaakt in uw Wufoo account.",
|
||||
"Handshake Key (Optional)": "Handdruk Sleutel (optioneel)",
|
||||
"Include Form Structure Metadata": "Inclusief metadata van formulierstructuur",
|
||||
"Webhook Response Format": "Webhook antwoord formaat",
|
||||
"Polling Interval": "Polling Interval",
|
||||
"Form Name Filter (Optional)": "Formuliernaam filter (optioneel)",
|
||||
"Include Inactive Forms": "Inclusief inactieve formulieren",
|
||||
"A secret key to validate webhook authenticity and prevent unauthorized requests. Recommended for production workflows.": "Een geheime sleutel om de webhook authenticiteit te valideren en ongeautoriseerde verzoeken te voorkomen. Aanbevolen voor productie workflows.",
|
||||
"Include detailed form and field structure information with each submission. Useful for dynamic processing but increases payload size.": "Inclusief gedetailleerde formulier- en veldstructuurinformatie bij elke uitzending. Nuttig voor dynamisch verwerken maar verhoogt de payload grootte.",
|
||||
"Choose the format for webhook data. JSON is recommended for most automation workflows.": "Kies het formaat van webhook gegevens. JSON is aanbevolen voor de meeste automatische workflows.",
|
||||
"How frequently to check for new forms. More frequent checking provides faster detection but uses more API calls.": "Hoe vaak te controleren op nieuwe formulieren. frequenter controleren biedt snellere detectie, maar gebruikt meer API calls.",
|
||||
"Only trigger for forms containing this text in their name. Leave empty to monitor all forms.": "Alleen trigger voor formulieren die deze tekst bevatten op hun naam. Laat leeg om alle formulieren te controleren.",
|
||||
"Include forms that are not currently active/published. Useful for monitoring all form creation activity.": "Formulieren opnemen die momenteel niet actief/gepubliceerd zijn. Nuttig voor het controleren van alle formuliercreatie activiteiten.",
|
||||
"Choose the format for form data. JSON is recommended for most workflows.": "Kies het formaat voor formuliergegevens. JSON is aanbevolen voor de meeste workflows.",
|
||||
"Every 1 minute": "Elke minuut",
|
||||
"Every 5 minutes": "Elke 5 minuten",
|
||||
"Every 15 minutes": "Elke 15 minuten",
|
||||
"Every 30 minutes": "Elke 30 minuten",
|
||||
"Every hour": "Elk uur"
|
||||
}
|
||||
@@ -0,0 +1,124 @@
|
||||
{
|
||||
"API Key": "Chave de API",
|
||||
"Subdomain": "Subdomínio",
|
||||
"Your Wufoo account subdomain (e.g., for fishbowl.wufoo.com, use \"fishbowl\")": "Sua conta Wufoo subdomínio (por exemplo, para peixebowl.wufoo.com, use \"peixebowl\")",
|
||||
"Enter your Wufoo API Key and Subdomain.": "Digite sua chave API do Wufoo e seu subdomínio.",
|
||||
"Create Form Entry": "Criar Entrada de Formulário",
|
||||
"Find Form by Name or Hash": "Localizar Formulário por Nome ou Hash",
|
||||
"Find Submission by Field Value": "Encontrar Submissão por Valor do Campo",
|
||||
"Get Entry Details": "Obter detalhes do post",
|
||||
"Custom API Call": "Chamada de API personalizada",
|
||||
"Submit a new entry to a Wufoo form with dynamic field selection.": "Enviar uma nova entrada para um formulário Wufoo com seleção de campo dinâmico.",
|
||||
"Get details about a Wufoo form including settings, entry counts, and metadata.": "Obtenha detalhes sobre um formulário Wufoo, incluindo configurações, contagens de entrada e metadados.",
|
||||
"Search for form submissions by field value for deduplication and lookup operations.": "Pesquisar por submissões de formulário por valor de campo para operações de deduplicação e pesquisa.",
|
||||
"Get form entries with filtering, sorting, and pagination options.": "Receba postagens de formulário com filtros, ordenações e opções de paginação.",
|
||||
"Make a custom API call to a specific endpoint": "Faça uma chamada de API personalizada para um ponto de extremidade específico",
|
||||
"Form Identifier (Name and Hash)": "Identificador do formulário (Nome e Hash)",
|
||||
"Response Format": "Formato de Resposta",
|
||||
"Form Fields": "Campos do formulário",
|
||||
"Include Today Count": "Incluir contagem de hoje",
|
||||
"Field ID": "ID do campo",
|
||||
"Search Value": "Pesquisar Valor",
|
||||
"Match Type": "Tipo de correspondência",
|
||||
"Maximum Results": "Resultados máximos",
|
||||
"Sort Order": "Ordem de classificação",
|
||||
"Include Metadata": "Incluir Metadados",
|
||||
"Specific Entry ID (Optional)": "ID de Entrada Específica (opcional)",
|
||||
"Filter Field ID (Optional)": "ID do campo de filtro (opcional)",
|
||||
"Filter Operator": "Operador de Filtros",
|
||||
"Filter Value (Optional)": "Valor do filtro (opcional)",
|
||||
"Second Filter Field (Optional)": "Segundo Campo de Filtro (Opcional)",
|
||||
"Second Filter Operator": "Segundo Operador de Filtro",
|
||||
"Second Filter Value (Optional)": "Segundo Valor de Filtro Opcional)",
|
||||
"Filter Logic": "Lógica de filtro",
|
||||
"Sort By Field ID (Optional)": "Ordenar Por ID do Campo (Opcional)",
|
||||
"Sort Direction": "Ordenar direção",
|
||||
"Page Start": "Início da Página",
|
||||
"Page Size": "Tamanho da página",
|
||||
"Include System Fields": "Incluir Campos do Sistema",
|
||||
"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 a Wufoo form to work with.": "Selecione um formulário Wufoo para trabalhar.",
|
||||
"Choose the format for the API response. JSON is recommended for most use cases.": "Escolha o formato para a resposta da API. JSON é recomendado para a maioria dos casos de uso.",
|
||||
"Fill out the form fields with the data you want to submit. Field types and validation are automatically configured based on your form structure.": "Preencha os campos do formulário com os dados que você deseja enviar. Tipos de campos e validação são automaticamente configurados com base na sua estrutura do formulário.",
|
||||
"Choose the format for the API response. JSON is recommended for most integrations.": "Escolha o formato para a resposta da API. JSON é recomendado para a maioria das integrações.",
|
||||
"Include the number of entries submitted today in the response. Useful for daily analytics and monitoring.": "Incluir o número de entradas enviadas hoje na resposta. Útil para análise diária e monitoramento.",
|
||||
"Choose the format for the API response. JSON is recommended for most workflows.": "Escolha o formato para a resposta da API. JSON é recomendado para a maioria dos fluxos de trabalho.",
|
||||
"The form field to search in (e.g., Field1 for first name, Field218 for email). You can find Field IDs in the form builder or via the Form Fields API.": "O campo do formulário a ser pesquisado (por exemplo, Field1 para o primeiro nome, Field218 para e-mail). Você pode encontrar IDs de campo no construtor do formulário ou através da API de campos de formulário.",
|
||||
"The value to search for in the specified field. For exact matches, use the complete value.": "O valor a procurar no campo especificado. Para correspondências exatas, use o valor completo.",
|
||||
"How to match the search value with field data. Choose based on your use case.": "Como corresponder o valor da pesquisa com os dados do campo. Escolha com base no seu caso de uso.",
|
||||
"Limit the number of results returned (1-50). Lower numbers are faster for deduplication checks.": "Limitar o número de resultados retornados (1-50). Números mais baixos são mais rápidos para verificações de desduplicação.",
|
||||
"Order to return results. \"Newest First\" is best for finding recent duplicates.": "Ordem para devolver os resultados. \"Mais recentes primeiro\" é a melhor para encontrar duplicatas recentes.",
|
||||
"Include additional information like submission date, IP address, and creation details.": "Inclua informações adicionais como data de envio, endereço IP e detalhes de criação.",
|
||||
"Enter a specific Entry ID to retrieve just that entry. Leave blank to get multiple entries with other filters.": "Insira um ID de entrada específico para recuperar apenas essa entrada. Deixe em branco para obter várias entradas com outros filtros.",
|
||||
"The field ID to filter by (e.g., Field1, Field105, EntryId, DateCreated). Leave blank for no filtering.": "O campo ID a ser filtrado (por exemplo, Field1, Field105, EntryId, DateCreated). Deixe em branco para nenhum filtro.",
|
||||
"How to compare the filter value with the field data.": "Como comparar o valor do filtro com os dados do campo.",
|
||||
"The value to filter by. For dates, use YYYY-MM-DD format or YYYY-MM-DD HH:MM:SS for specific times.": "O valor a ser filtrado. Para datas, use o formato YYYY-MM-DD ou YYYY-MM-DD HH:MM:SS para horários específicos.",
|
||||
"Add a second filter field for more complex queries.": "Adicionar um segundo campo de filtro para consultas mais complexas.",
|
||||
"Operator for the second filter.": "Operador para o segundo filtro.",
|
||||
"Value for the second filter.": "Valor para o segundo filtro.",
|
||||
"How to combine multiple filters. Only applies when using multiple filters.": "Como combinar vários filtros. Só se aplica quando usa vários filtros.",
|
||||
"Sort results by field ID (e.g., EntryId, DateCreated, Field1). Leave blank for default order.": "Ordenar resultados por ID do campo (por exemplo, EntryId, DateCreated, Field1). Deixe em branco para o pedido padrão.",
|
||||
"Order to sort the results.": "Ordem para ordenar os resultados.",
|
||||
"Starting entry number for pagination (0 = first entry).": "Número de entrada inicial para paginação (0 = primeira entrada).",
|
||||
"Number of entries to return (maximum 100 per request).": "Número de entradas a retornar (máximo de 100 por pedido).",
|
||||
"Include additional metadata like IP address, payment status, and completion status.": "Inclua metadados adicionais como endereço IP, status de pagamento e status de conclusão.",
|
||||
"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..",
|
||||
"JSON": "JSON",
|
||||
"XML": "XML",
|
||||
"Exact Match": "Partida exata",
|
||||
"Contains Text": "Contém texto",
|
||||
"Starts With": "Começa com",
|
||||
"Ends With": "Termina com",
|
||||
"Does Not Contain": "Não contém",
|
||||
"Is Not Equal To": "Não é igual a",
|
||||
"Newest First": "Mais recentes primeiro",
|
||||
"Oldest First": "Mais antigos primeiro",
|
||||
"Is Equal To": "É igual a",
|
||||
"Contains": "contém",
|
||||
"Begins With": "Começa com",
|
||||
"Is Greater Than": "É Maior do que",
|
||||
"Is Less Than": "É menor que",
|
||||
"Is On (Date)": "Está Ligado (Date)",
|
||||
"Is Before (Date)": "É Antes (Date)",
|
||||
"Is After (Date)": "É Depois (Date)",
|
||||
"Is Not Empty": "Não está vazio",
|
||||
"AND (All filters must match)": "E (Todos os filtros devem corresponder)",
|
||||
"OR (Any filter must match)": "OU (Qualquer filtro deve coincidir)",
|
||||
"Descending (Newest first)": "Descendente (mais novos primeiro)",
|
||||
"Ascending (Oldest first)": "Crescente (mais antigos primeiro)",
|
||||
"GET": "OBTER",
|
||||
"POST": "POSTAR",
|
||||
"PATCH": "COMPRAR",
|
||||
"PUT": "COLOCAR",
|
||||
"DELETE": "EXCLUIR",
|
||||
"HEAD": "CABEÇA",
|
||||
"New Form Entry": "Nova Entrada de Formulário",
|
||||
"New Form Created": "Novo formulário criado",
|
||||
"Triggers when someone submits a new entry to your Wufoo form.": "Aciona quando alguém envia uma nova entrada no seu formulário Wufoo.",
|
||||
"Triggers when a new form is created in your Wufoo account.": "Aciona quando um novo formulário é criado em sua conta Wufoo.",
|
||||
"Handshake Key (Optional)": "Chave Handshake (opcional)",
|
||||
"Include Form Structure Metadata": "Incluir Metadados da Estrutura de Formulários",
|
||||
"Webhook Response Format": "Formato de Resposta Webhook",
|
||||
"Polling Interval": "Intervalo de votação",
|
||||
"Form Name Filter (Optional)": "Filtro de Nome do Formulário Opcional)",
|
||||
"Include Inactive Forms": "Incluir Formulários Inativos",
|
||||
"A secret key to validate webhook authenticity and prevent unauthorized requests. Recommended for production workflows.": "Uma chave secreta para validar autenticidade de webhook e impedir solicitações não autorizadas. Recomendado para fluxos de trabalho em produção.",
|
||||
"Include detailed form and field structure information with each submission. Useful for dynamic processing but increases payload size.": "Inclua informações detalhadas sobre o formulário e o campo com cada submissão. Útil para processamento dinâmico, mas aumenta o tamanho da carga.",
|
||||
"Choose the format for webhook data. JSON is recommended for most automation workflows.": "Escolha o formato para dados do webhook. JSON é recomendado para a maioria dos fluxos de trabalho de automação.",
|
||||
"How frequently to check for new forms. More frequent checking provides faster detection but uses more API calls.": "Com que frequência verificar novos formulários. A verificação mais frequente fornece detecção mais rápida, mas utiliza mais chamadas de API.",
|
||||
"Only trigger for forms containing this text in their name. Leave empty to monitor all forms.": "Apenas gatilho para formulários que contêm este texto em seu nome. Deixe em branco para monitorar todos os formulários.",
|
||||
"Include forms that are not currently active/published. Useful for monitoring all form creation activity.": "Inclua formulários que ainda não estão ativos/publicados. Útil para monitorar todas as atividades de criação de formulários.",
|
||||
"Choose the format for form data. JSON is recommended for most workflows.": "Escolha o formato de dados de formulário. JSON é recomendado para a maioria dos fluxos de trabalho.",
|
||||
"Every 1 minute": "A cada 1 minuto",
|
||||
"Every 5 minutes": "A cada 5 minutos",
|
||||
"Every 15 minutes": "A cada 15 minutos",
|
||||
"Every 30 minutes": "A cada 30 minutos",
|
||||
"Every hour": "Toda hora"
|
||||
}
|
||||
@@ -0,0 +1,123 @@
|
||||
{
|
||||
"Wufoo": "Wufoo",
|
||||
"API Key": "Ключ API",
|
||||
"Subdomain": "Поддомен",
|
||||
"Your Wufoo account subdomain (e.g., for fishbowl.wufoo.com, use \"fishbowl\")": "Ваш субдомен аккаунта Wufoo (например, для fishbowl.wufoo.com, используйте \"fishbowl\")",
|
||||
"Enter your Wufoo API Key and Subdomain.": "Введите ваш ключ API Wufoo и субдомен.",
|
||||
"Create Form Entry": "Создать запись формы",
|
||||
"Find Form by Name or Hash": "Найти форму по имени или хешу",
|
||||
"Find Submission by Field Value": "Поиск сообщения по значению поля",
|
||||
"Get Entry Details": "Получить информацию о записи",
|
||||
"Custom API Call": "Пользовательский вызов API",
|
||||
"Submit a new entry to a Wufoo form with dynamic field selection.": "Внесите новую запись в форму Wufoo с выбором динамических полей.",
|
||||
"Get details about a Wufoo form including settings, entry counts, and metadata.": "Получить подробную информацию о форме Wufoo, включая настройки, количество записей и метаданные.",
|
||||
"Search for form submissions by field value for deduplication and lookup operations.": "Поиск ответов форм по значению поля для операций deduplication и поиска.",
|
||||
"Get form entries with filtering, sorting, and pagination options.": "Получить записи формы с фильтрацией, сортировкой и параметрами разбивки на страницы.",
|
||||
"Make a custom API call to a specific endpoint": "Сделать пользовательский API вызов к определенной конечной точке",
|
||||
"Form Identifier (Name and Hash)": "Идентификатор формы (Имя и Хэш)",
|
||||
"Response Format": "Формат ответа",
|
||||
"Form Fields": "Поля формы",
|
||||
"Include Today Count": "Включать сегодня количество",
|
||||
"Field ID": "ID поля",
|
||||
"Search Value": "Поисковое значение",
|
||||
"Match Type": "Тип матча",
|
||||
"Maximum Results": "Максимальное количество результатов",
|
||||
"Sort Order": "Порядок сортировки",
|
||||
"Include Metadata": "Включить метаданные",
|
||||
"Specific Entry ID (Optional)": "Особый ID записи (необязательно)",
|
||||
"Filter Field ID (Optional)": "ID поля фильтра (необязательно)",
|
||||
"Filter Operator": "Оператор фильтра",
|
||||
"Filter Value (Optional)": "Значение фильтра (необязательно)",
|
||||
"Second Filter Field (Optional)": "Второе поле фильтра (необязательно)",
|
||||
"Second Filter Operator": "Второй оператор фильтра",
|
||||
"Second Filter Value (Optional)": "Второе значение фильтра (необязательно)",
|
||||
"Filter Logic": "Логика фильтра",
|
||||
"Sort By Field ID (Optional)": "Сортировка по ID (необязательно)",
|
||||
"Sort Direction": "Направление сортировки",
|
||||
"Page Start": "Начало страницы",
|
||||
"Page Size": "Размер страницы",
|
||||
"Include System Fields": "Включить системные поля",
|
||||
"Method": "Метод",
|
||||
"Headers": "Заголовки",
|
||||
"Query Parameters": "Параметры запроса",
|
||||
"Body": "Тело",
|
||||
"No Error on Failure": "Нет ошибок при ошибке",
|
||||
"Timeout (in seconds)": "Таймаут (в секундах)",
|
||||
"Select a Wufoo form to work with.": "Выберите форму Wufoo для работы.",
|
||||
"Choose the format for the API response. JSON is recommended for most use cases.": "Выберите формат ответа API. JSON рекомендуется для большинства вариантов использования.",
|
||||
"Fill out the form fields with the data you want to submit. Field types and validation are automatically configured based on your form structure.": "Заполните поля формы с данными, которые вы хотите отправить. Типы полей и валидация автоматически настроены на основе структуры формы.",
|
||||
"Choose the format for the API response. JSON is recommended for most integrations.": "Выберите формат ответа API. JSON рекомендуется для большинства интеграций.",
|
||||
"Include the number of entries submitted today in the response. Useful for daily analytics and monitoring.": "Включает количество записей, представленных сегодня в ответе. Полезно для ежедневной аналитики и мониторинга.",
|
||||
"Choose the format for the API response. JSON is recommended for most workflows.": "Выберите формат ответа API. JSON рекомендуется для большинства рабочих процессов.",
|
||||
"The form field to search in (e.g., Field1 for first name, Field218 for email). You can find Field IDs in the form builder or via the Form Fields API.": "Поле формы для поиска (например, Field1 для фамилии, Field218 для электронной почты). ID полей можно найти в конструкторе форм или через API форм поля.",
|
||||
"The value to search for in the specified field. For exact matches, use the complete value.": "Значение для поиска в указанном поле. Для точных совпадений используйте полное значение.",
|
||||
"How to match the search value with field data. Choose based on your use case.": "Как сопоставить значение поиска с данными поля. Выберите на основе варианта использования.",
|
||||
"Limit the number of results returned (1-50). Lower numbers are faster for deduplication checks.": "Ограничить количество возвращаемых результатов (1-50). Чем ниже значение для проверки дедупликации.",
|
||||
"Order to return results. \"Newest First\" is best for finding recent duplicates.": "Заказ на возврат результатов. \"Новейший первый\" лучше найти последние дубликаты.",
|
||||
"Include additional information like submission date, IP address, and creation details.": "Включите дополнительную информацию, такую как дата создания, IP-адрес и детали создания.",
|
||||
"Enter a specific Entry ID to retrieve just that entry. Leave blank to get multiple entries with other filters.": "Введите специальный идентификатор записи, чтобы получить только эту запись. Оставьте пустым, чтобы получить несколько записей с другими фильтрами.",
|
||||
"The field ID to filter by (e.g., Field1, Field105, EntryId, DateCreated). Leave blank for no filtering.": "ID поля для фильтрации (например, Field1, Field105, EntryId, DateCreated). Оставьте пустым для отсутствия фильтрации.",
|
||||
"How to compare the filter value with the field data.": "Как сравнить значение фильтра с данными поля.",
|
||||
"The value to filter by. For dates, use YYYY-MM-DD format or YYYY-MM-DD HH:MM:SS for specific times.": "Значение фильтрации. Для использования дат используйте формат YYYY-MM-DD или YYY-MM-DD HH:MM:SS для определенного времени.",
|
||||
"Add a second filter field for more complex queries.": "Добавить второе поле для более сложных запросов.",
|
||||
"Operator for the second filter.": "Оператор второго фильтра.",
|
||||
"Value for the second filter.": "Значение второго фильтра.",
|
||||
"How to combine multiple filters. Only applies when using multiple filters.": "Как комбинировать несколько фильтров. Применяется только при использовании нескольких фильтров.",
|
||||
"Sort results by field ID (e.g., EntryId, DateCreated, Field1). Leave blank for default order.": "Сортировка результатов по ID поля (например, ID записи, дата создания, поля). Оставьте пустым для порядка по умолчанию.",
|
||||
"Order to sort the results.": "Порядок сортировки результатов.",
|
||||
"Starting entry number for pagination (0 = first entry).": "Начальный номер записи для пагинации (0 = первый ввод).",
|
||||
"Number of entries to return (maximum 100 per request).": "Количество записей для возврата (максимум 100 за запрос).",
|
||||
"Include additional metadata like IP address, payment status, and completion status.": "Включить дополнительные метаданные, такие как IP-адрес, статус платежа и статус выполнения.",
|
||||
"Authorization headers are injected automatically from your connection.": "Заголовки авторизации включаются автоматически из вашего соединения.",
|
||||
"JSON": "JSON",
|
||||
"XML": "XML",
|
||||
"Exact Match": "Точное совпадение",
|
||||
"Contains Text": "Содержит текст",
|
||||
"Starts With": "Начинается с",
|
||||
"Ends With": "Заканчивается с",
|
||||
"Does Not Contain": "Не содержит",
|
||||
"Is Not Equal To": "Не равно",
|
||||
"Newest First": "Сначала новые",
|
||||
"Oldest First": "Сначала старые",
|
||||
"Is Equal To": "Равно",
|
||||
"Contains": "Содержит",
|
||||
"Begins With": "Начинается с",
|
||||
"Is Greater Than": "Больше чем",
|
||||
"Is Less Than": "Меньше чем",
|
||||
"Is On (Date)": "Включен датчик",
|
||||
"Is Before (Date)": "До даты)",
|
||||
"Is After (Date)": "После даты)",
|
||||
"Is Not Empty": "Не пусто",
|
||||
"AND (All filters must match)": "И (Все фильтры должны совпадать)",
|
||||
"OR (Any filter must match)": "ИЛИ (Любой фильтр должен совпадать)",
|
||||
"Descending (Newest first)": "По убыванию (сначала новые)",
|
||||
"Ascending (Oldest first)": "По возрастанию (сначала старые)",
|
||||
"GET": "ПОЛУЧИТЬ",
|
||||
"POST": "ПОСТ",
|
||||
"PATCH": "ПАТЧ",
|
||||
"PUT": "ПОКУПИТЬ",
|
||||
"DELETE": "УДАЛИТЬ",
|
||||
"HEAD": "HEAD",
|
||||
"New Form Entry": "Новый вход в форму",
|
||||
"New Form Created": "Новая форма создана",
|
||||
"Triggers when someone submits a new entry to your Wufoo form.": "Триггеры, когда кто-то отправляет новую запись в вашу форму Wufoo.",
|
||||
"Triggers when a new form is created in your Wufoo account.": "Включает при создании новой формы в вашей учетной записи Wufoo.",
|
||||
"Handshake Key (Optional)": "Ключ рукопожатия (необязательно)",
|
||||
"Include Form Structure Metadata": "Включить метаданные структуры форм",
|
||||
"Webhook Response Format": "Формат ответа Webhook",
|
||||
"Polling Interval": "Интервал опроса",
|
||||
"Form Name Filter (Optional)": "Фильтр по названию формы (необязательно)",
|
||||
"Include Inactive Forms": "Включить неактивные формы",
|
||||
"A secret key to validate webhook authenticity and prevent unauthorized requests. Recommended for production workflows.": "Секретный ключ для проверки подлинности webhook и предотвращения несанкционированных запросов. Рекомендуется для производственных процессов.",
|
||||
"Include detailed form and field structure information with each submission. Useful for dynamic processing but increases payload size.": "Включает в себя подробную информацию о форме и структуре поля с каждой отправкой. Полезно для динамической обработки, но увеличивает размер полезной нагрузки.",
|
||||
"Choose the format for webhook data. JSON is recommended for most automation workflows.": "Выберите формат для данных webhook. JSON рекомендуется для большинства автоматических рабочих процессов.",
|
||||
"How frequently to check for new forms. More frequent checking provides faster detection but uses more API calls.": "Как часто проверять новые формы. Более частые проверки обеспечивают более быстрое обнаружение, но используют больше вызовов API.",
|
||||
"Only trigger for forms containing this text in their name. Leave empty to monitor all forms.": "Триггер только для форм, содержащих этот текст в их имени. Оставьте пустым, чтобы отслеживать все формы.",
|
||||
"Include forms that are not currently active/published. Useful for monitoring all form creation activity.": "Включить формы, которые не активны или опубликованы. Полезно для мониторинга всех действий по созданию формы.",
|
||||
"Choose the format for form data. JSON is recommended for most workflows.": "Выберите формат для данных форм. JSON рекомендуется для большинства рабочих процессов.",
|
||||
"Every 1 minute": "Каждую минуту",
|
||||
"Every 5 minutes": "Каждые 5 минут",
|
||||
"Every 15 minutes": "Каждые 15 минут",
|
||||
"Every 30 minutes": "Каждые 30 минут",
|
||||
"Every hour": "Каждый час"
|
||||
}
|
||||
@@ -0,0 +1,124 @@
|
||||
{
|
||||
"API Key": "API Key",
|
||||
"Subdomain": "Subdomain",
|
||||
"Your Wufoo account subdomain (e.g., for fishbowl.wufoo.com, use \"fishbowl\")": "Your Wufoo account subdomain (e.g., for fishbowl.wufoo.com, use \"fishbowl\")",
|
||||
"Enter your Wufoo API Key and Subdomain.": "Enter your Wufoo API Key and Subdomain.",
|
||||
"Create Form Entry": "Create Form Entry",
|
||||
"Find Form by Name or Hash": "Find Form by Name or Hash",
|
||||
"Find Submission by Field Value": "Find Submission by Field Value",
|
||||
"Get Entry Details": "Get Entry Details",
|
||||
"Custom API Call": "Custom API Call",
|
||||
"Submit a new entry to a Wufoo form with dynamic field selection.": "Submit a new entry to a Wufoo form with dynamic field selection.",
|
||||
"Get details about a Wufoo form including settings, entry counts, and metadata.": "Get details about a Wufoo form including settings, entry counts, and metadata.",
|
||||
"Search for form submissions by field value for deduplication and lookup operations.": "Search for form submissions by field value for deduplication and lookup operations.",
|
||||
"Get form entries with filtering, sorting, and pagination options.": "Get form entries with filtering, sorting, and pagination options.",
|
||||
"Make a custom API call to a specific endpoint": "Make a custom API call to a specific endpoint",
|
||||
"Form Identifier (Name and Hash)": "Form Identifier (Name and Hash)",
|
||||
"Response Format": "Response Format",
|
||||
"Form Fields": "Form Fields",
|
||||
"Include Today Count": "Include Today Count",
|
||||
"Field ID": "Field ID",
|
||||
"Search Value": "Search Value",
|
||||
"Match Type": "Match Type",
|
||||
"Maximum Results": "Maximum Results",
|
||||
"Sort Order": "Sort Order",
|
||||
"Include Metadata": "Include Metadata",
|
||||
"Specific Entry ID (Optional)": "Specific Entry ID (Optional)",
|
||||
"Filter Field ID (Optional)": "Filter Field ID (Optional)",
|
||||
"Filter Operator": "Filter Operator",
|
||||
"Filter Value (Optional)": "Filter Value (Optional)",
|
||||
"Second Filter Field (Optional)": "Second Filter Field (Optional)",
|
||||
"Second Filter Operator": "Second Filter Operator",
|
||||
"Second Filter Value (Optional)": "Second Filter Value (Optional)",
|
||||
"Filter Logic": "Filter Logic",
|
||||
"Sort By Field ID (Optional)": "Sort By Field ID (Optional)",
|
||||
"Sort Direction": "Sort Direction",
|
||||
"Page Start": "Page Start",
|
||||
"Page Size": "Page Size",
|
||||
"Include System Fields": "Include System Fields",
|
||||
"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 a Wufoo form to work with.": "Select a Wufoo form to work with.",
|
||||
"Choose the format for the API response. JSON is recommended for most use cases.": "Choose the format for the API response. JSON is recommended for most use cases.",
|
||||
"Fill out the form fields with the data you want to submit. Field types and validation are automatically configured based on your form structure.": "Fill out the form fields with the data you want to submit. Field types and validation are automatically configured based on your form structure.",
|
||||
"Choose the format for the API response. JSON is recommended for most integrations.": "Choose the format for the API response. JSON is recommended for most integrations.",
|
||||
"Include the number of entries submitted today in the response. Useful for daily analytics and monitoring.": "Include the number of entries submitted today in the response. Useful for daily analytics and monitoring.",
|
||||
"Choose the format for the API response. JSON is recommended for most workflows.": "Choose the format for the API response. JSON is recommended for most workflows.",
|
||||
"The form field to search in (e.g., Field1 for first name, Field218 for email). You can find Field IDs in the form builder or via the Form Fields API.": "The form field to search in (e.g., Field1 for first name, Field218 for email). You can find Field IDs in the form builder or via the Form Fields API.",
|
||||
"The value to search for in the specified field. For exact matches, use the complete value.": "The value to search for in the specified field. For exact matches, use the complete value.",
|
||||
"How to match the search value with field data. Choose based on your use case.": "How to match the search value with field data. Choose based on your use case.",
|
||||
"Limit the number of results returned (1-50). Lower numbers are faster for deduplication checks.": "Limit the number of results returned (1-50). Lower numbers are faster for deduplication checks.",
|
||||
"Order to return results. \"Newest First\" is best for finding recent duplicates.": "Order to return results. \"Newest First\" is best for finding recent duplicates.",
|
||||
"Include additional information like submission date, IP address, and creation details.": "Include additional information like submission date, IP address, and creation details.",
|
||||
"Enter a specific Entry ID to retrieve just that entry. Leave blank to get multiple entries with other filters.": "Enter a specific Entry ID to retrieve just that entry. Leave blank to get multiple entries with other filters.",
|
||||
"The field ID to filter by (e.g., Field1, Field105, EntryId, DateCreated). Leave blank for no filtering.": "The field ID to filter by (e.g., Field1, Field105, EntryId, DateCreated). Leave blank for no filtering.",
|
||||
"How to compare the filter value with the field data.": "How to compare the filter value with the field data.",
|
||||
"The value to filter by. For dates, use YYYY-MM-DD format or YYYY-MM-DD HH:MM:SS for specific times.": "The value to filter by. For dates, use YYYY-MM-DD format or YYYY-MM-DD HH:MM:SS for specific times.",
|
||||
"Add a second filter field for more complex queries.": "Add a second filter field for more complex queries.",
|
||||
"Operator for the second filter.": "Operator for the second filter.",
|
||||
"Value for the second filter.": "Value for the second filter.",
|
||||
"How to combine multiple filters. Only applies when using multiple filters.": "How to combine multiple filters. Only applies when using multiple filters.",
|
||||
"Sort results by field ID (e.g., EntryId, DateCreated, Field1). Leave blank for default order.": "Sort results by field ID (e.g., EntryId, DateCreated, Field1). Leave blank for default order.",
|
||||
"Order to sort the results.": "Order to sort the results.",
|
||||
"Starting entry number for pagination (0 = first entry).": "Starting entry number for pagination (0 = first entry).",
|
||||
"Number of entries to return (maximum 100 per request).": "Number of entries to return (maximum 100 per request).",
|
||||
"Include additional metadata like IP address, payment status, and completion status.": "Include additional metadata like IP address, payment status, and completion status.",
|
||||
"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..",
|
||||
"JSON": "JSON",
|
||||
"XML": "XML",
|
||||
"Exact Match": "Exact Match",
|
||||
"Contains Text": "Contains Text",
|
||||
"Starts With": "Starts With",
|
||||
"Ends With": "Ends With",
|
||||
"Does Not Contain": "Does Not Contain",
|
||||
"Is Not Equal To": "Is Not Equal To",
|
||||
"Newest First": "Newest First",
|
||||
"Oldest First": "Oldest First",
|
||||
"Is Equal To": "Is Equal To",
|
||||
"Contains": "Contains",
|
||||
"Begins With": "Begins With",
|
||||
"Is Greater Than": "Is Greater Than",
|
||||
"Is Less Than": "Is Less Than",
|
||||
"Is On (Date)": "Is On (Date)",
|
||||
"Is Before (Date)": "Is Before (Date)",
|
||||
"Is After (Date)": "Is After (Date)",
|
||||
"Is Not Empty": "Is Not Empty",
|
||||
"AND (All filters must match)": "AND (All filters must match)",
|
||||
"OR (Any filter must match)": "OR (Any filter must match)",
|
||||
"Descending (Newest first)": "Descending (Newest first)",
|
||||
"Ascending (Oldest first)": "Ascending (Oldest first)",
|
||||
"GET": "GET",
|
||||
"POST": "POST",
|
||||
"PATCH": "PATCH",
|
||||
"PUT": "PUT",
|
||||
"DELETE": "DELETE",
|
||||
"HEAD": "HEAD",
|
||||
"New Form Entry": "New Form Entry",
|
||||
"New Form Created": "New Form Created",
|
||||
"Triggers when someone submits a new entry to your Wufoo form.": "Triggers when someone submits a new entry to your Wufoo form.",
|
||||
"Triggers when a new form is created in your Wufoo account.": "Triggers when a new form is created in your Wufoo account.",
|
||||
"Handshake Key (Optional)": "Handshake Key (Optional)",
|
||||
"Include Form Structure Metadata": "Include Form Structure Metadata",
|
||||
"Webhook Response Format": "Webhook Response Format",
|
||||
"Polling Interval": "Polling Interval",
|
||||
"Form Name Filter (Optional)": "Form Name Filter (Optional)",
|
||||
"Include Inactive Forms": "Include Inactive Forms",
|
||||
"A secret key to validate webhook authenticity and prevent unauthorized requests. Recommended for production workflows.": "A secret key to validate webhook authenticity and prevent unauthorized requests. Recommended for production workflows.",
|
||||
"Include detailed form and field structure information with each submission. Useful for dynamic processing but increases payload size.": "Include detailed form and field structure information with each submission. Useful for dynamic processing but increases payload size.",
|
||||
"Choose the format for webhook data. JSON is recommended for most automation workflows.": "Choose the format for webhook data. JSON is recommended for most automation workflows.",
|
||||
"How frequently to check for new forms. More frequent checking provides faster detection but uses more API calls.": "How frequently to check for new forms. More frequent checking provides faster detection but uses more API calls.",
|
||||
"Only trigger for forms containing this text in their name. Leave empty to monitor all forms.": "Only trigger for forms containing this text in their name. Leave empty to monitor all forms.",
|
||||
"Include forms that are not currently active/published. Useful for monitoring all form creation activity.": "Include forms that are not currently active/published. Useful for monitoring all form creation activity.",
|
||||
"Choose the format for form data. JSON is recommended for most workflows.": "Choose the format for form data. JSON is recommended for most workflows.",
|
||||
"Every 1 minute": "Every 1 minute",
|
||||
"Every 5 minutes": "Every 5 minutes",
|
||||
"Every 15 minutes": "Every 15 minutes",
|
||||
"Every 30 minutes": "Every 30 minutes",
|
||||
"Every hour": "Every hour"
|
||||
}
|
||||
@@ -0,0 +1,123 @@
|
||||
{
|
||||
"Wufoo": "Wufoo",
|
||||
"API Key": "API Key",
|
||||
"Subdomain": "Subdomain",
|
||||
"Your Wufoo account subdomain (e.g., for fishbowl.wufoo.com, use \"fishbowl\")": "Your Wufoo account subdomain (e.g., for fishbowl.wufoo.com, use \"fishbowl\")",
|
||||
"Enter your Wufoo API Key and Subdomain.": "Enter your Wufoo API Key and Subdomain.",
|
||||
"Create Form Entry": "Create Form Entry",
|
||||
"Find Form by Name or Hash": "Find Form by Name or Hash",
|
||||
"Find Submission by Field Value": "Find Submission by Field Value",
|
||||
"Get Entry Details": "Get Entry Details",
|
||||
"Custom API Call": "Custom API Call",
|
||||
"Submit a new entry to a Wufoo form with dynamic field selection.": "Submit a new entry to a Wufoo form with dynamic field selection.",
|
||||
"Get details about a Wufoo form including settings, entry counts, and metadata.": "Get details about a Wufoo form including settings, entry counts, and metadata.",
|
||||
"Search for form submissions by field value for deduplication and lookup operations.": "Search for form submissions by field value for deduplication and lookup operations.",
|
||||
"Get form entries with filtering, sorting, and pagination options.": "Get form entries with filtering, sorting, and pagination options.",
|
||||
"Make a custom API call to a specific endpoint": "Make a custom API call to a specific endpoint",
|
||||
"Form Identifier (Name and Hash)": "Form Identifier (Name and Hash)",
|
||||
"Response Format": "Response Format",
|
||||
"Form Fields": "Form Fields",
|
||||
"Include Today Count": "Include Today Count",
|
||||
"Field ID": "Field ID",
|
||||
"Search Value": "Search Value",
|
||||
"Match Type": "Match Type",
|
||||
"Maximum Results": "Maximum Results",
|
||||
"Sort Order": "Sort Order",
|
||||
"Include Metadata": "Include Metadata",
|
||||
"Specific Entry ID (Optional)": "Specific Entry ID (Optional)",
|
||||
"Filter Field ID (Optional)": "Filter Field ID (Optional)",
|
||||
"Filter Operator": "Filter Operator",
|
||||
"Filter Value (Optional)": "Filter Value (Optional)",
|
||||
"Second Filter Field (Optional)": "Second Filter Field (Optional)",
|
||||
"Second Filter Operator": "Second Filter Operator",
|
||||
"Second Filter Value (Optional)": "Second Filter Value (Optional)",
|
||||
"Filter Logic": "Filter Logic",
|
||||
"Sort By Field ID (Optional)": "Sort By Field ID (Optional)",
|
||||
"Sort Direction": "Sort Direction",
|
||||
"Page Start": "Page Start",
|
||||
"Page Size": "Phân trang",
|
||||
"Include System Fields": "Include System Fields",
|
||||
"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 a Wufoo form to work with.": "Select a Wufoo form to work with.",
|
||||
"Choose the format for the API response. JSON is recommended for most use cases.": "Choose the format for the API response. JSON is recommended for most use cases.",
|
||||
"Fill out the form fields with the data you want to submit. Field types and validation are automatically configured based on your form structure.": "Fill out the form fields with the data you want to submit. Field types and validation are automatically configured based on your form structure.",
|
||||
"Choose the format for the API response. JSON is recommended for most integrations.": "Choose the format for the API response. JSON is recommended for most integrations.",
|
||||
"Include the number of entries submitted today in the response. Useful for daily analytics and monitoring.": "Include the number of entries submitted today in the response. Useful for daily analytics and monitoring.",
|
||||
"Choose the format for the API response. JSON is recommended for most workflows.": "Choose the format for the API response. JSON is recommended for most workflows.",
|
||||
"The form field to search in (e.g., Field1 for first name, Field218 for email). You can find Field IDs in the form builder or via the Form Fields API.": "The form field to search in (e.g., Field1 for first name, Field218 for email). You can find Field IDs in the form builder or via the Form Fields API.",
|
||||
"The value to search for in the specified field. For exact matches, use the complete value.": "The value to search for in the specified field. For exact matches, use the complete value.",
|
||||
"How to match the search value with field data. Choose based on your use case.": "How to match the search value with field data. Choose based on your use case.",
|
||||
"Limit the number of results returned (1-50). Lower numbers are faster for deduplication checks.": "Limit the number of results returned (1-50). Lower numbers are faster for deduplication checks.",
|
||||
"Order to return results. \"Newest First\" is best for finding recent duplicates.": "Order to return results. \"Newest First\" is best for finding recent duplicates.",
|
||||
"Include additional information like submission date, IP address, and creation details.": "Include additional information like submission date, IP address, and creation details.",
|
||||
"Enter a specific Entry ID to retrieve just that entry. Leave blank to get multiple entries with other filters.": "Enter a specific Entry ID to retrieve just that entry. Leave blank to get multiple entries with other filters.",
|
||||
"The field ID to filter by (e.g., Field1, Field105, EntryId, DateCreated). Leave blank for no filtering.": "The field ID to filter by (e.g., Field1, Field105, EntryId, DateCreated). Leave blank for no filtering.",
|
||||
"How to compare the filter value with the field data.": "How to compare the filter value with the field data.",
|
||||
"The value to filter by. For dates, use YYYY-MM-DD format or YYYY-MM-DD HH:MM:SS for specific times.": "The value to filter by. For dates, use YYYY-MM-DD format or YYYY-MM-DD HH:MM:SS for specific times.",
|
||||
"Add a second filter field for more complex queries.": "Add a second filter field for more complex queries.",
|
||||
"Operator for the second filter.": "Operator for the second filter.",
|
||||
"Value for the second filter.": "Value for the second filter.",
|
||||
"How to combine multiple filters. Only applies when using multiple filters.": "How to combine multiple filters. Only applies when using multiple filters.",
|
||||
"Sort results by field ID (e.g., EntryId, DateCreated, Field1). Leave blank for default order.": "Sort results by field ID (e.g., EntryId, DateCreated, Field1). Leave blank for default order.",
|
||||
"Order to sort the results.": "Order to sort the results.",
|
||||
"Starting entry number for pagination (0 = first entry).": "Starting entry number for pagination (0 = first entry).",
|
||||
"Number of entries to return (maximum 100 per request).": "Number of entries to return (maximum 100 per request).",
|
||||
"Include additional metadata like IP address, payment status, and completion status.": "Include additional metadata like IP address, payment status, and completion status.",
|
||||
"Authorization headers are injected automatically from your connection.": "Authorization headers are injected automatically from your connection.",
|
||||
"JSON": "JSON",
|
||||
"XML": "XML",
|
||||
"Exact Match": "Exact Match",
|
||||
"Contains Text": "Contains Text",
|
||||
"Starts With": "Starts With",
|
||||
"Ends With": "Ends With",
|
||||
"Does Not Contain": "Does Not Contain",
|
||||
"Is Not Equal To": "Is Not Equal To",
|
||||
"Newest First": "Newest First",
|
||||
"Oldest First": "Oldest First",
|
||||
"Is Equal To": "Is Equal To",
|
||||
"Contains": "Contains",
|
||||
"Begins With": "Begins With",
|
||||
"Is Greater Than": "Is Greater Than",
|
||||
"Is Less Than": "Is Less Than",
|
||||
"Is On (Date)": "Is On (Date)",
|
||||
"Is Before (Date)": "Is Before (Date)",
|
||||
"Is After (Date)": "Is After (Date)",
|
||||
"Is Not Empty": "Is Not Empty",
|
||||
"AND (All filters must match)": "AND (All filters must match)",
|
||||
"OR (Any filter must match)": "OR (Any filter must match)",
|
||||
"Descending (Newest first)": "Descending (Newest first)",
|
||||
"Ascending (Oldest first)": "Ascending (Oldest first)",
|
||||
"GET": "GET",
|
||||
"POST": "POST",
|
||||
"PATCH": "PATCH",
|
||||
"PUT": "PUT",
|
||||
"DELETE": "DELETE",
|
||||
"HEAD": "HEAD",
|
||||
"New Form Entry": "New Form Entry",
|
||||
"New Form Created": "New Form Created",
|
||||
"Triggers when someone submits a new entry to your Wufoo form.": "Triggers when someone submits a new entry to your Wufoo form.",
|
||||
"Triggers when a new form is created in your Wufoo account.": "Triggers when a new form is created in your Wufoo account.",
|
||||
"Handshake Key (Optional)": "Handshake Key (Optional)",
|
||||
"Include Form Structure Metadata": "Include Form Structure Metadata",
|
||||
"Webhook Response Format": "Webhook Response Format",
|
||||
"Polling Interval": "Polling Interval",
|
||||
"Form Name Filter (Optional)": "Form Name Filter (Optional)",
|
||||
"Include Inactive Forms": "Include Inactive Forms",
|
||||
"A secret key to validate webhook authenticity and prevent unauthorized requests. Recommended for production workflows.": "A secret key to validate webhook authenticity and prevent unauthorized requests. Recommended for production workflows.",
|
||||
"Include detailed form and field structure information with each submission. Useful for dynamic processing but increases payload size.": "Include detailed form and field structure information with each submission. Useful for dynamic processing but increases payload size.",
|
||||
"Choose the format for webhook data. JSON is recommended for most automation workflows.": "Choose the format for webhook data. JSON is recommended for most automation workflows.",
|
||||
"How frequently to check for new forms. More frequent checking provides faster detection but uses more API calls.": "How frequently to check for new forms. More frequent checking provides faster detection but uses more API calls.",
|
||||
"Only trigger for forms containing this text in their name. Leave empty to monitor all forms.": "Only trigger for forms containing this text in their name. Leave empty to monitor all forms.",
|
||||
"Include forms that are not currently active/published. Useful for monitoring all form creation activity.": "Include forms that are not currently active/published. Useful for monitoring all form creation activity.",
|
||||
"Choose the format for form data. JSON is recommended for most workflows.": "Choose the format for form data. JSON is recommended for most workflows.",
|
||||
"Every 1 minute": "Every 1 minute",
|
||||
"Every 5 minutes": "Every 5 minutes",
|
||||
"Every 15 minutes": "Every 15 minutes",
|
||||
"Every 30 minutes": "Every 30 minutes",
|
||||
"Every hour": "Every hour"
|
||||
}
|
||||
@@ -0,0 +1,124 @@
|
||||
{
|
||||
"API Key": "API 密钥",
|
||||
"Subdomain": "Subdomain",
|
||||
"Your Wufoo account subdomain (e.g., for fishbowl.wufoo.com, use \"fishbowl\")": "Your Wufoo account subdomain (e.g., for fishbowl.wufoo.com, use \"fishbowl\")",
|
||||
"Enter your Wufoo API Key and Subdomain.": "Enter your Wufoo API Key and Subdomain.",
|
||||
"Create Form Entry": "Create Form Entry",
|
||||
"Find Form by Name or Hash": "Find Form by Name or Hash",
|
||||
"Find Submission by Field Value": "Find Submission by Field Value",
|
||||
"Get Entry Details": "Get Entry Details",
|
||||
"Custom API Call": "自定义 API 呼叫",
|
||||
"Submit a new entry to a Wufoo form with dynamic field selection.": "Submit a new entry to a Wufoo form with dynamic field selection.",
|
||||
"Get details about a Wufoo form including settings, entry counts, and metadata.": "Get details about a Wufoo form including settings, entry counts, and metadata.",
|
||||
"Search for form submissions by field value for deduplication and lookup operations.": "Search for form submissions by field value for deduplication and lookup operations.",
|
||||
"Get form entries with filtering, sorting, and pagination options.": "Get form entries with filtering, sorting, and pagination options.",
|
||||
"Make a custom API call to a specific endpoint": "将一个自定义 API 调用到一个特定的终点",
|
||||
"Form Identifier (Name and Hash)": "Form Identifier (Name and Hash)",
|
||||
"Response Format": "Response Format",
|
||||
"Form Fields": "Form Fields",
|
||||
"Include Today Count": "Include Today Count",
|
||||
"Field ID": "Field ID",
|
||||
"Search Value": "搜索值",
|
||||
"Match Type": "Match Type",
|
||||
"Maximum Results": "Maximum Results",
|
||||
"Sort Order": "Sort Order",
|
||||
"Include Metadata": "Include Metadata",
|
||||
"Specific Entry ID (Optional)": "Specific Entry ID (Optional)",
|
||||
"Filter Field ID (Optional)": "Filter Field ID (Optional)",
|
||||
"Filter Operator": "Filter Operator",
|
||||
"Filter Value (Optional)": "Filter Value (Optional)",
|
||||
"Second Filter Field (Optional)": "Second Filter Field (Optional)",
|
||||
"Second Filter Operator": "Second Filter Operator",
|
||||
"Second Filter Value (Optional)": "Second Filter Value (Optional)",
|
||||
"Filter Logic": "Filter Logic",
|
||||
"Sort By Field ID (Optional)": "Sort By Field ID (Optional)",
|
||||
"Sort Direction": "Sort Direction",
|
||||
"Page Start": "Page Start",
|
||||
"Page Size": "Page Size",
|
||||
"Include System Fields": "Include System Fields",
|
||||
"Method": "方法",
|
||||
"Headers": "信头",
|
||||
"Query Parameters": "查询参数",
|
||||
"Body": "正文内容",
|
||||
"Response is Binary ?": "Response is Binary ?",
|
||||
"No Error on Failure": "失败时没有错误",
|
||||
"Timeout (in seconds)": "超时(秒)",
|
||||
"Select a Wufoo form to work with.": "Select a Wufoo form to work with.",
|
||||
"Choose the format for the API response. JSON is recommended for most use cases.": "Choose the format for the API response. JSON is recommended for most use cases.",
|
||||
"Fill out the form fields with the data you want to submit. Field types and validation are automatically configured based on your form structure.": "Fill out the form fields with the data you want to submit. Field types and validation are automatically configured based on your form structure.",
|
||||
"Choose the format for the API response. JSON is recommended for most integrations.": "Choose the format for the API response. JSON is recommended for most integrations.",
|
||||
"Include the number of entries submitted today in the response. Useful for daily analytics and monitoring.": "Include the number of entries submitted today in the response. Useful for daily analytics and monitoring.",
|
||||
"Choose the format for the API response. JSON is recommended for most workflows.": "Choose the format for the API response. JSON is recommended for most workflows.",
|
||||
"The form field to search in (e.g., Field1 for first name, Field218 for email). You can find Field IDs in the form builder or via the Form Fields API.": "The form field to search in (e.g., Field1 for first name, Field218 for email). You can find Field IDs in the form builder or via the Form Fields API.",
|
||||
"The value to search for in the specified field. For exact matches, use the complete value.": "The value to search for in the specified field. For exact matches, use the complete value.",
|
||||
"How to match the search value with field data. Choose based on your use case.": "How to match the search value with field data. Choose based on your use case.",
|
||||
"Limit the number of results returned (1-50). Lower numbers are faster for deduplication checks.": "Limit the number of results returned (1-50). Lower numbers are faster for deduplication checks.",
|
||||
"Order to return results. \"Newest First\" is best for finding recent duplicates.": "Order to return results. \"Newest First\" is best for finding recent duplicates.",
|
||||
"Include additional information like submission date, IP address, and creation details.": "Include additional information like submission date, IP address, and creation details.",
|
||||
"Enter a specific Entry ID to retrieve just that entry. Leave blank to get multiple entries with other filters.": "Enter a specific Entry ID to retrieve just that entry. Leave blank to get multiple entries with other filters.",
|
||||
"The field ID to filter by (e.g., Field1, Field105, EntryId, DateCreated). Leave blank for no filtering.": "The field ID to filter by (e.g., Field1, Field105, EntryId, DateCreated). Leave blank for no filtering.",
|
||||
"How to compare the filter value with the field data.": "How to compare the filter value with the field data.",
|
||||
"The value to filter by. For dates, use YYYY-MM-DD format or YYYY-MM-DD HH:MM:SS for specific times.": "The value to filter by. For dates, use YYYY-MM-DD format or YYYY-MM-DD HH:MM:SS for specific times.",
|
||||
"Add a second filter field for more complex queries.": "Add a second filter field for more complex queries.",
|
||||
"Operator for the second filter.": "Operator for the second filter.",
|
||||
"Value for the second filter.": "Value for the second filter.",
|
||||
"How to combine multiple filters. Only applies when using multiple filters.": "How to combine multiple filters. Only applies when using multiple filters.",
|
||||
"Sort results by field ID (e.g., EntryId, DateCreated, Field1). Leave blank for default order.": "Sort results by field ID (e.g., EntryId, DateCreated, Field1). Leave blank for default order.",
|
||||
"Order to sort the results.": "Order to sort the results.",
|
||||
"Starting entry number for pagination (0 = first entry).": "Starting entry number for pagination (0 = first entry).",
|
||||
"Number of entries to return (maximum 100 per request).": "Number of entries to return (maximum 100 per request).",
|
||||
"Include additional metadata like IP address, payment status, and completion status.": "Include additional metadata like IP address, payment status, and completion status.",
|
||||
"Authorization headers are injected automatically from your connection.": "授权头自动从您的连接中注入。",
|
||||
"Enable for files like PDFs, images, etc..": "Enable for files like PDFs, images, etc..",
|
||||
"JSON": "JSON",
|
||||
"XML": "XML",
|
||||
"Exact Match": "精确匹配",
|
||||
"Contains Text": "Contains Text",
|
||||
"Starts With": "Starts With",
|
||||
"Ends With": "Ends With",
|
||||
"Does Not Contain": "Does Not Contain",
|
||||
"Is Not Equal To": "Is Not Equal To",
|
||||
"Newest First": "Newest First",
|
||||
"Oldest First": "Oldest First",
|
||||
"Is Equal To": "Is Equal To",
|
||||
"Contains": "Contains",
|
||||
"Begins With": "Begins With",
|
||||
"Is Greater Than": "Is Greater Than",
|
||||
"Is Less Than": "Is Less Than",
|
||||
"Is On (Date)": "Is On (Date)",
|
||||
"Is Before (Date)": "Is Before (Date)",
|
||||
"Is After (Date)": "Is After (Date)",
|
||||
"Is Not Empty": "Is Not Empty",
|
||||
"AND (All filters must match)": "AND (All filters must match)",
|
||||
"OR (Any filter must match)": "OR (Any filter must match)",
|
||||
"Descending (Newest first)": "Descending (Newest first)",
|
||||
"Ascending (Oldest first)": "Ascending (Oldest first)",
|
||||
"GET": "获取",
|
||||
"POST": "帖子",
|
||||
"PATCH": "PATCH",
|
||||
"PUT": "弹出",
|
||||
"DELETE": "删除",
|
||||
"HEAD": "黑色",
|
||||
"New Form Entry": "New Form Entry",
|
||||
"New Form Created": "New Form Created",
|
||||
"Triggers when someone submits a new entry to your Wufoo form.": "Triggers when someone submits a new entry to your Wufoo form.",
|
||||
"Triggers when a new form is created in your Wufoo account.": "Triggers when a new form is created in your Wufoo account.",
|
||||
"Handshake Key (Optional)": "Handshake Key (Optional)",
|
||||
"Include Form Structure Metadata": "Include Form Structure Metadata",
|
||||
"Webhook Response Format": "Webhook Response Format",
|
||||
"Polling Interval": "Polling Interval",
|
||||
"Form Name Filter (Optional)": "Form Name Filter (Optional)",
|
||||
"Include Inactive Forms": "Include Inactive Forms",
|
||||
"A secret key to validate webhook authenticity and prevent unauthorized requests. Recommended for production workflows.": "A secret key to validate webhook authenticity and prevent unauthorized requests. Recommended for production workflows.",
|
||||
"Include detailed form and field structure information with each submission. Useful for dynamic processing but increases payload size.": "Include detailed form and field structure information with each submission. Useful for dynamic processing but increases payload size.",
|
||||
"Choose the format for webhook data. JSON is recommended for most automation workflows.": "Choose the format for webhook data. JSON is recommended for most automation workflows.",
|
||||
"How frequently to check for new forms. More frequent checking provides faster detection but uses more API calls.": "How frequently to check for new forms. More frequent checking provides faster detection but uses more API calls.",
|
||||
"Only trigger for forms containing this text in their name. Leave empty to monitor all forms.": "Only trigger for forms containing this text in their name. Leave empty to monitor all forms.",
|
||||
"Include forms that are not currently active/published. Useful for monitoring all form creation activity.": "Include forms that are not currently active/published. Useful for monitoring all form creation activity.",
|
||||
"Choose the format for form data. JSON is recommended for most workflows.": "Choose the format for form data. JSON is recommended for most workflows.",
|
||||
"Every 1 minute": "Every 1 minute",
|
||||
"Every 5 minutes": "Every 5 minutes",
|
||||
"Every 15 minutes": "Every 15 minutes",
|
||||
"Every 30 minutes": "Every 30 minutes",
|
||||
"Every hour": "Every hour"
|
||||
}
|
||||
@@ -0,0 +1,74 @@
|
||||
import {
|
||||
createCustomApiCallAction,
|
||||
HttpMethod,
|
||||
} from '@activepieces/pieces-common';
|
||||
import { AppConnectionValueForAuthProperty, createPiece, PieceAuth } from '@activepieces/pieces-framework';
|
||||
import { wufooApiCall } from './lib/common/client';
|
||||
import { createFormEntryAction } from './lib/actions/create-form-entry';
|
||||
import { findFormAction } from './lib/actions/find-form';
|
||||
import { findSubmissionByFieldAction } from './lib/actions/find-submission-by-field';
|
||||
import { getEntryDetailsAction } from './lib/actions/get-entry-details';
|
||||
import { newFormEntryTrigger } from './lib/triggers/new-form-entry';
|
||||
import { newFormTrigger } from './lib/triggers/new-form';
|
||||
import { AppConnectionType } from '@activepieces/shared';
|
||||
|
||||
export const wufooAuth = PieceAuth.CustomAuth({
|
||||
description: 'Enter your Wufoo API Key and Subdomain.',
|
||||
props: {
|
||||
apiKey: PieceAuth.SecretText({
|
||||
displayName: 'API Key',
|
||||
required: true,
|
||||
}),
|
||||
subdomain: PieceAuth.SecretText({
|
||||
displayName: 'Subdomain',
|
||||
description:
|
||||
'Your Wufoo account subdomain (e.g., for fishbowl.wufoo.com, use "fishbowl")',
|
||||
required: true,
|
||||
}),
|
||||
},
|
||||
validate: async ({ auth }) => {
|
||||
try {
|
||||
await wufooApiCall({
|
||||
method: HttpMethod.GET,
|
||||
auth: {
|
||||
props: auth,
|
||||
type: AppConnectionType.CUSTOM_AUTH,
|
||||
},
|
||||
resourceUri: '/forms.json',
|
||||
});
|
||||
return { valid: true };
|
||||
} catch (e) {
|
||||
return {
|
||||
valid: false,
|
||||
error: 'Invalid API Key or Subdomain',
|
||||
};
|
||||
}
|
||||
},
|
||||
required: true,
|
||||
});
|
||||
|
||||
export const wufoo = createPiece({
|
||||
displayName: 'Wufoo',
|
||||
auth: wufooAuth,
|
||||
minimumSupportedRelease: '0.36.1',
|
||||
logoUrl: 'https://cdn.activepieces.com/pieces/wufoo.png',
|
||||
authors: ['krushnarout','onyedikachi-david'],
|
||||
actions: [
|
||||
createFormEntryAction,
|
||||
findFormAction,
|
||||
findSubmissionByFieldAction,
|
||||
getEntryDetailsAction,
|
||||
createCustomApiCallAction({
|
||||
auth: wufooAuth,
|
||||
baseUrl: (auth: any) => `https://${auth.subdomain}.wufoo.com/api/v3`,
|
||||
authMapping: async (auth) => {
|
||||
const { apiKey } = auth.props;
|
||||
const encoded = Buffer.from(`${apiKey}:footastic`).toString('base64');
|
||||
return {
|
||||
Authorization: `Basic ${encoded}`,
|
||||
};
|
||||
},
|
||||
}),
|
||||
],
|
||||
triggers: [newFormEntryTrigger, newFormTrigger],
|
||||
});
|
||||
@@ -0,0 +1,149 @@
|
||||
import { HttpMethod } from '@activepieces/pieces-common';
|
||||
import { createAction, Property } from '@activepieces/pieces-framework';
|
||||
import { wufooApiCall } from '../common/client';
|
||||
import { wufooAuth } from '../../index';
|
||||
import { formIdentifier, dynamicFormFields } from '../common/props';
|
||||
|
||||
|
||||
export const createFormEntryAction = createAction({
|
||||
auth: wufooAuth,
|
||||
name: 'create-form-entry',
|
||||
displayName: 'Create Form Entry',
|
||||
description: 'Submit a new entry to a Wufoo form with dynamic field selection.',
|
||||
props: {
|
||||
formIdentifier: formIdentifier,
|
||||
format: Property.StaticDropdown({
|
||||
displayName: 'Response Format',
|
||||
description: 'Choose the format for the API response. JSON is recommended for most use cases.',
|
||||
required: true,
|
||||
defaultValue: 'json',
|
||||
options: {
|
||||
disabled: false,
|
||||
options: [
|
||||
{ label: 'JSON', value: 'json' },
|
||||
{ label: 'XML', value: 'xml' },
|
||||
],
|
||||
},
|
||||
}),
|
||||
formFields: dynamicFormFields,
|
||||
},
|
||||
async run(context) {
|
||||
const { formIdentifier, format, formFields } = context.propsValue;
|
||||
|
||||
try {
|
||||
const processedFields: Record<string, string> = {};
|
||||
|
||||
for (const [fieldId, fieldValue] of Object.entries(formFields)) {
|
||||
if (fieldValue !== null && fieldValue !== undefined) {
|
||||
if (fieldId.includes('date') || fieldId.includes('Date')) {
|
||||
const dateValue = new Date(fieldValue as string);
|
||||
if (!isNaN(dateValue.getTime())) {
|
||||
const year = dateValue.getFullYear();
|
||||
const month = String(dateValue.getMonth() + 1).padStart(2, '0');
|
||||
const day = String(dateValue.getDate()).padStart(2, '0');
|
||||
processedFields[fieldId] = `${year}${month}${day}`;
|
||||
} else {
|
||||
processedFields[fieldId] = String(fieldValue);
|
||||
}
|
||||
} else if (Array.isArray(fieldValue)) {
|
||||
if (fieldValue.length > 0) {
|
||||
for (const selectedId of fieldValue) {
|
||||
processedFields[selectedId] = '1';
|
||||
}
|
||||
}
|
||||
} else if (typeof fieldValue === 'boolean') {
|
||||
processedFields[fieldId] = fieldValue ? '1' : '0';
|
||||
} else if (typeof fieldValue === 'number') {
|
||||
processedFields[fieldId] = String(fieldValue);
|
||||
} else if (fieldValue instanceof File) {
|
||||
processedFields[fieldId] = fieldValue.name || 'uploaded_file';
|
||||
} else {
|
||||
processedFields[fieldId] = String(fieldValue);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
const response = await wufooApiCall<WufooSubmissionResponse>({
|
||||
method: HttpMethod.POST,
|
||||
auth: context.auth,
|
||||
resourceUri: `/forms/${formIdentifier}/entries.${format}`,
|
||||
body: new URLSearchParams(processedFields).toString(),
|
||||
});
|
||||
|
||||
if (response.Success === 1) {
|
||||
return {
|
||||
success: true,
|
||||
message: 'Form entry submitted successfully!',
|
||||
entryId: response.EntryId,
|
||||
entryLink: response.EntryLink,
|
||||
redirectUrl: response.RedirectUrl,
|
||||
submittedFields: processedFields,
|
||||
};
|
||||
} else {
|
||||
const errorDetails = {
|
||||
success: false,
|
||||
message: response.ErrorText || 'Form submission failed',
|
||||
fieldErrors: response.FieldErrors || [],
|
||||
redirectUrl: response.RedirectUrl,
|
||||
};
|
||||
|
||||
let errorMessage = 'Form submission failed';
|
||||
if (response.FieldErrors && response.FieldErrors.length > 0) {
|
||||
const fieldErrorMessages = response.FieldErrors.map(
|
||||
(error: WufooFieldError) => `${error.ID}: ${error.ErrorText}`
|
||||
);
|
||||
errorMessage += ` - Field errors: ${fieldErrorMessages.join(', ')}`;
|
||||
}
|
||||
|
||||
throw new Error(errorMessage);
|
||||
}
|
||||
} catch (error: any) {
|
||||
if (error.response?.status === 429) {
|
||||
throw new Error(
|
||||
'Rate limit exceeded. Wufoo allows maximum 50 submissions per user in a 5-minute window. Please wait before trying again.'
|
||||
);
|
||||
}
|
||||
|
||||
if (error.response?.status === 400) {
|
||||
throw new Error(
|
||||
`Bad request: ${error.response.data?.Text || error.message}. Please check your form field values.`
|
||||
);
|
||||
}
|
||||
|
||||
if (error.response?.status === 401) {
|
||||
throw new Error(
|
||||
'Authentication failed. Please check your API key and subdomain.'
|
||||
);
|
||||
}
|
||||
|
||||
if (error.response?.status === 404) {
|
||||
throw new Error(
|
||||
'Form not found. Please verify the form identifier is correct.'
|
||||
);
|
||||
}
|
||||
|
||||
if (error.message.includes('Field errors:')) {
|
||||
throw error;
|
||||
}
|
||||
|
||||
throw new Error(
|
||||
`Failed to submit form entry: ${error.message || 'Unknown error occurred'}`
|
||||
);
|
||||
}
|
||||
},
|
||||
|
||||
});
|
||||
|
||||
interface WufooSubmissionResponse {
|
||||
Success: number;
|
||||
EntryId?: number;
|
||||
EntryLink?: string;
|
||||
RedirectUrl?: string;
|
||||
ErrorText?: string;
|
||||
FieldErrors?: WufooFieldError[];
|
||||
}
|
||||
|
||||
interface WufooFieldError {
|
||||
ID: string;
|
||||
ErrorText: string;
|
||||
}
|
||||
@@ -0,0 +1,145 @@
|
||||
import { HttpMethod } from '@activepieces/pieces-common';
|
||||
import { createAction, Property } from '@activepieces/pieces-framework';
|
||||
import { wufooApiCall } from '../common/client';
|
||||
import { wufooAuth } from '../../index';
|
||||
import { formIdentifier } from '../common/props';
|
||||
|
||||
export const findFormAction = createAction({
|
||||
auth: wufooAuth,
|
||||
name: 'find-form',
|
||||
displayName: 'Find Form by Name or Hash',
|
||||
description: 'Get details about a Wufoo form including settings, entry counts, and metadata.',
|
||||
props: {
|
||||
formIdentifier: formIdentifier,
|
||||
format: Property.StaticDropdown({
|
||||
displayName: 'Response Format',
|
||||
description: 'Choose the format for the API response. JSON is recommended for most integrations.',
|
||||
required: true,
|
||||
defaultValue: 'json',
|
||||
options: {
|
||||
disabled: false,
|
||||
options: [
|
||||
{ label: 'JSON', value: 'json' },
|
||||
{ label: 'XML', value: 'xml' },
|
||||
],
|
||||
},
|
||||
}),
|
||||
includeTodayCount: Property.Checkbox({
|
||||
displayName: 'Include Today Count',
|
||||
description: 'Include the number of entries submitted today in the response. Useful for daily analytics and monitoring.',
|
||||
required: false,
|
||||
defaultValue: false,
|
||||
}),
|
||||
|
||||
},
|
||||
async run(context) {
|
||||
const { formIdentifier, format, includeTodayCount } = context.propsValue;
|
||||
|
||||
try {
|
||||
const response = await wufooApiCall<WufooFormResponse | string>({
|
||||
method: HttpMethod.GET,
|
||||
auth: context.auth,
|
||||
resourceUri: `/forms/${formIdentifier}.${format}`,
|
||||
query: {
|
||||
includeTodayCount: includeTodayCount ? 'true' : 'false',
|
||||
pretty: 'false',
|
||||
},
|
||||
});
|
||||
|
||||
let parsedResponse = response;
|
||||
if (typeof response === 'string' && response.includes('OUTPUT =')) {
|
||||
const match = response.match(/OUTPUT = ({.*?});/);
|
||||
if (match) {
|
||||
try {
|
||||
parsedResponse = JSON.parse(match[1]);
|
||||
} catch (e) {
|
||||
parsedResponse = response;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (format === 'json' && parsedResponse && typeof parsedResponse === 'object') {
|
||||
let formData: WufooFormResponse;
|
||||
if (Array.isArray(parsedResponse)) {
|
||||
formData = parsedResponse[0] as WufooFormResponse;
|
||||
} else if ((parsedResponse as any).Forms && Array.isArray((parsedResponse as any).Forms)) {
|
||||
formData = (parsedResponse as any).Forms[0] as WufooFormResponse;
|
||||
} else {
|
||||
formData = parsedResponse as WufooFormResponse;
|
||||
}
|
||||
|
||||
return {
|
||||
success: true,
|
||||
message: 'Form details retrieved successfully',
|
||||
form: {
|
||||
name: formData.Name,
|
||||
description: formData.Description,
|
||||
hash: formData.Hash,
|
||||
url: formData.Url,
|
||||
isPublic: formData.IsPublic === '1',
|
||||
language: formData.Language,
|
||||
redirectMessage: formData.RedirectMessage,
|
||||
entryLimit: parseInt(formData.EntryLimit || '0'),
|
||||
todayCount: formData.EntryCountToday ? parseInt(formData.EntryCountToday) : undefined,
|
||||
dateCreated: formData.DateCreated,
|
||||
dateUpdated: formData.DateUpdated,
|
||||
startDate: formData.StartDate,
|
||||
endDate: formData.EndDate,
|
||||
fieldsLink: formData.LinkFields,
|
||||
entriesLink: formData.LinkEntries,
|
||||
entriesCountLink: formData.LinkEntriesCount,
|
||||
},
|
||||
rawResponse: parsedResponse,
|
||||
};
|
||||
} else {
|
||||
return {
|
||||
success: true,
|
||||
message: 'Form details retrieved successfully',
|
||||
response: parsedResponse,
|
||||
};
|
||||
}
|
||||
} catch (error: any) {
|
||||
if (error.response?.status === 404) {
|
||||
throw new Error(
|
||||
`Form not found: The form with identifier "${formIdentifier}" does not exist or you do not have access to it. Please verify the form identifier and your permissions.`
|
||||
);
|
||||
}
|
||||
|
||||
if (error.response?.status === 403) {
|
||||
throw new Error(
|
||||
'Access denied: You do not have permission to view this form. Please check your Wufoo account permissions and API key scope.'
|
||||
);
|
||||
}
|
||||
|
||||
if (error.response?.status === 401) {
|
||||
throw new Error(
|
||||
'Authentication failed: Please verify your API key and subdomain are correct in the connection settings.'
|
||||
);
|
||||
}
|
||||
|
||||
throw new Error(
|
||||
`Failed to retrieve form details: ${error.message || 'Unknown error occurred'}. Please check your form identifier and try again.`
|
||||
);
|
||||
}
|
||||
},
|
||||
});
|
||||
|
||||
|
||||
interface WufooFormResponse {
|
||||
Name: string;
|
||||
Description?: string;
|
||||
Hash: string;
|
||||
Url: string;
|
||||
IsPublic: string;
|
||||
Language: string;
|
||||
RedirectMessage?: string;
|
||||
EntryLimit?: string;
|
||||
EntryCountToday?: string;
|
||||
DateCreated: string;
|
||||
DateUpdated: string;
|
||||
StartDate: string;
|
||||
EndDate: string;
|
||||
LinkFields?: string;
|
||||
LinkEntries?: string;
|
||||
LinkEntriesCount?: string;
|
||||
}
|
||||
@@ -0,0 +1,235 @@
|
||||
import { HttpMethod } from '@activepieces/pieces-common';
|
||||
import { createAction, Property } from '@activepieces/pieces-framework';
|
||||
import { wufooApiCall } from '../common/client';
|
||||
import { wufooAuth } from '../../index';
|
||||
import { formIdentifier } from '../common/props';
|
||||
|
||||
export const findSubmissionByFieldAction = createAction({
|
||||
auth: wufooAuth,
|
||||
name: 'find-submission-by-field',
|
||||
displayName: 'Find Submission by Field Value',
|
||||
description: 'Search for form submissions by field value for deduplication and lookup operations.',
|
||||
props: {
|
||||
formIdentifier: formIdentifier,
|
||||
format: Property.StaticDropdown({
|
||||
displayName: 'Response Format',
|
||||
description: 'Choose the format for the API response. JSON is recommended for most workflows.',
|
||||
required: true,
|
||||
defaultValue: 'json',
|
||||
options: {
|
||||
disabled: false,
|
||||
options: [
|
||||
{ label: 'JSON', value: 'json' },
|
||||
{ label: 'XML', value: 'xml' },
|
||||
],
|
||||
},
|
||||
}),
|
||||
|
||||
fieldId: Property.ShortText({
|
||||
displayName: 'Field ID',
|
||||
description: 'The form field to search in (e.g., Field1 for first name, Field218 for email). You can find Field IDs in the form builder or via the Form Fields API.',
|
||||
required: true,
|
||||
}),
|
||||
|
||||
searchValue: Property.ShortText({
|
||||
displayName: 'Search Value',
|
||||
description: 'The value to search for in the specified field. For exact matches, use the complete value.',
|
||||
required: true,
|
||||
}),
|
||||
|
||||
matchType: Property.StaticDropdown({
|
||||
displayName: 'Match Type',
|
||||
description: 'How to match the search value with field data. Choose based on your use case.',
|
||||
required: true,
|
||||
defaultValue: 'Is_equal_to',
|
||||
options: {
|
||||
disabled: false,
|
||||
options: [
|
||||
{ label: 'Exact Match', value: 'Is_equal_to' },
|
||||
{ label: 'Contains Text', value: 'Contains' },
|
||||
{ label: 'Starts With', value: 'Begins_with' },
|
||||
{ label: 'Ends With', value: 'Ends_with' },
|
||||
{ label: 'Does Not Contain', value: 'Does_not_contain' },
|
||||
{ label: 'Is Not Equal To', value: 'Is_not_equal_to' },
|
||||
],
|
||||
},
|
||||
}),
|
||||
|
||||
maxResults: Property.Number({
|
||||
displayName: 'Maximum Results',
|
||||
description: 'Limit the number of results returned (1-50). Lower numbers are faster for deduplication checks.',
|
||||
required: false,
|
||||
defaultValue: 10,
|
||||
}),
|
||||
|
||||
sortOrder: Property.StaticDropdown({
|
||||
displayName: 'Sort Order',
|
||||
description: 'Order to return results. "Newest First" is best for finding recent duplicates.',
|
||||
required: false,
|
||||
defaultValue: 'DESC',
|
||||
options: {
|
||||
disabled: false,
|
||||
options: [
|
||||
{ label: 'Newest First', value: 'DESC' },
|
||||
{ label: 'Oldest First', value: 'ASC' },
|
||||
],
|
||||
},
|
||||
}),
|
||||
|
||||
includeMetadata: Property.Checkbox({
|
||||
displayName: 'Include Metadata',
|
||||
description: 'Include additional information like submission date, IP address, and creation details.',
|
||||
required: false,
|
||||
defaultValue: false,
|
||||
}),
|
||||
},
|
||||
|
||||
async run(context) {
|
||||
const {
|
||||
formIdentifier,
|
||||
format,
|
||||
fieldId,
|
||||
searchValue,
|
||||
matchType,
|
||||
maxResults,
|
||||
sortOrder,
|
||||
includeMetadata,
|
||||
} = context.propsValue;
|
||||
|
||||
try {
|
||||
const query: Record<string, string> = {
|
||||
pageStart: '0',
|
||||
pageSize: String(Math.min(maxResults ?? 10, 50)),
|
||||
system: includeMetadata ? 'true' : 'false',
|
||||
pretty: 'false',
|
||||
|
||||
Filter1: `${fieldId}+${matchType}+${encodeURIComponent(searchValue)}`,
|
||||
|
||||
sort: 'EntryId',
|
||||
sortDirection: sortOrder || 'DESC',
|
||||
};
|
||||
|
||||
const response = await wufooApiCall<WufooEntriesResponse | string>({
|
||||
method: HttpMethod.GET,
|
||||
auth: context.auth,
|
||||
resourceUri: `/forms/${formIdentifier}/entries.${format}`,
|
||||
query,
|
||||
});
|
||||
|
||||
let parsedResponse = response;
|
||||
if (typeof response === 'string' && response.includes('OUTPUT =')) {
|
||||
const match = response.match(/OUTPUT = ({.*?});/);
|
||||
if (match) {
|
||||
try {
|
||||
parsedResponse = JSON.parse(match[1]);
|
||||
} catch (e) {
|
||||
parsedResponse = response;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (format === 'json' && parsedResponse && typeof parsedResponse === 'object') {
|
||||
const entriesData = parsedResponse as WufooEntriesResponse;
|
||||
const entries = entriesData.Entries || [];
|
||||
|
||||
const result = {
|
||||
success: true,
|
||||
found: entries.length > 0,
|
||||
message: entries.length > 0
|
||||
? `Found ${entries.length} submission(s) matching the search criteria`
|
||||
: `No submissions found with ${fieldId} ${matchType.replace('_', ' ').toLowerCase()} "${searchValue}"`,
|
||||
|
||||
searchCriteria: {
|
||||
fieldId,
|
||||
searchValue,
|
||||
matchType: matchType.replace('_', ' ').toLowerCase(),
|
||||
formIdentifier,
|
||||
},
|
||||
|
||||
resultCount: entries.length,
|
||||
|
||||
firstMatch: entries.length > 0 ? {
|
||||
entryId: entries[0].EntryId,
|
||||
dateCreated: entries[0].DateCreated,
|
||||
matchedFieldValue: entries[0][fieldId],
|
||||
|
||||
keyFields: {
|
||||
[fieldId]: entries[0][fieldId],
|
||||
...(entries[0]['Field1'] && { name_first: entries[0]['Field1'] }),
|
||||
...(entries[0]['Field2'] && { name_last: entries[0]['Field2'] }),
|
||||
...(entries[0]['Field218'] && { email: entries[0]['Field218'] }),
|
||||
...(entries[0]['Field220'] && { phone: entries[0]['Field220'] }),
|
||||
},
|
||||
} : null,
|
||||
|
||||
allMatches: entries.map(entry => ({
|
||||
entryId: entry.EntryId,
|
||||
dateCreated: entry.DateCreated,
|
||||
dateUpdated: entry.DateUpdated,
|
||||
matchedFieldValue: entry[fieldId],
|
||||
|
||||
allFields: Object.keys(entry)
|
||||
.filter(key => !['EntryId', 'DateCreated', 'DateUpdated', 'CreatedBy', 'UpdatedBy'].includes(key))
|
||||
.reduce((acc, key) => {
|
||||
acc[key] = entry[key];
|
||||
return acc;
|
||||
}, {} as Record<string, any>),
|
||||
})),
|
||||
|
||||
rawResponse: parsedResponse,
|
||||
};
|
||||
|
||||
return result;
|
||||
} else {
|
||||
return {
|
||||
success: true,
|
||||
message: 'Search completed successfully',
|
||||
response: parsedResponse,
|
||||
};
|
||||
}
|
||||
} catch (error: any) {
|
||||
if (error.response?.status === 404) {
|
||||
throw new Error(
|
||||
`Form not found: The form with identifier "${formIdentifier}" does not exist. Please verify the form identifier is correct.`
|
||||
);
|
||||
}
|
||||
|
||||
if (error.response?.status === 400) {
|
||||
throw new Error(
|
||||
`Invalid search parameters: The field ID "${fieldId}" may not exist in this form, or the search value contains invalid characters. Please check the field ID and search value.`
|
||||
);
|
||||
}
|
||||
|
||||
if (error.response?.status === 403) {
|
||||
throw new Error(
|
||||
'Access denied: You do not have permission to search entries in this form. Please check your Wufoo account permissions.'
|
||||
);
|
||||
}
|
||||
|
||||
if (error.response?.status === 401) {
|
||||
throw new Error(
|
||||
'Authentication failed: Please verify your API key and subdomain are correct in the connection settings.'
|
||||
);
|
||||
}
|
||||
|
||||
throw new Error(
|
||||
`Search failed: ${error.message || 'Unknown error occurred'}. Please check your search parameters and try again.`
|
||||
);
|
||||
}
|
||||
},
|
||||
});
|
||||
|
||||
interface WufooEntriesResponse {
|
||||
Entries: WufooEntry[];
|
||||
}
|
||||
|
||||
|
||||
interface WufooEntry {
|
||||
EntryId: string;
|
||||
DateCreated: string;
|
||||
DateUpdated: string;
|
||||
CreatedBy: string;
|
||||
UpdatedBy: string | null;
|
||||
|
||||
[key: string]: any;
|
||||
}
|
||||
@@ -0,0 +1,324 @@
|
||||
import { HttpMethod } from '@activepieces/pieces-common';
|
||||
import { createAction, Property } from '@activepieces/pieces-framework';
|
||||
import { wufooApiCall } from '../common/client';
|
||||
import { wufooAuth } from '../../index';
|
||||
import { formIdentifier } from '../common/props';
|
||||
|
||||
export const getEntryDetailsAction = createAction({
|
||||
auth: wufooAuth,
|
||||
name: 'get-entry-details',
|
||||
displayName: 'Get Entry Details',
|
||||
description: 'Get form entries with filtering, sorting, and pagination options.',
|
||||
props: {
|
||||
formIdentifier: formIdentifier,
|
||||
format: Property.StaticDropdown({
|
||||
displayName: 'Response Format',
|
||||
description: 'Choose the format for the API response. JSON is recommended for most integrations.',
|
||||
required: true,
|
||||
defaultValue: 'json',
|
||||
options: {
|
||||
disabled: false,
|
||||
options: [
|
||||
{ label: 'JSON', value: 'json' },
|
||||
{ label: 'XML', value: 'xml' },
|
||||
],
|
||||
},
|
||||
}),
|
||||
|
||||
entryId: Property.Number({
|
||||
displayName: 'Specific Entry ID (Optional)',
|
||||
description: 'Enter a specific Entry ID to retrieve just that entry. Leave blank to get multiple entries with other filters.',
|
||||
required: false,
|
||||
}),
|
||||
|
||||
filterField: Property.ShortText({
|
||||
displayName: 'Filter Field ID (Optional)',
|
||||
description: 'The field ID to filter by (e.g., Field1, Field105, EntryId, DateCreated). Leave blank for no filtering.',
|
||||
required: false,
|
||||
}),
|
||||
|
||||
filterOperator: Property.StaticDropdown({
|
||||
displayName: 'Filter Operator',
|
||||
description: 'How to compare the filter value with the field data.',
|
||||
required: false,
|
||||
defaultValue: 'Is_equal_to',
|
||||
options: {
|
||||
disabled: false,
|
||||
options: [
|
||||
{ label: 'Is Equal To', value: 'Is_equal_to' },
|
||||
{ label: 'Is Not Equal To', value: 'Is_not_equal_to' },
|
||||
{ label: 'Contains', value: 'Contains' },
|
||||
{ label: 'Does Not Contain', value: 'Does_not_contain' },
|
||||
{ label: 'Begins With', value: 'Begins_with' },
|
||||
{ label: 'Ends With', value: 'Ends_with' },
|
||||
{ label: 'Is Greater Than', value: 'Is_greater_than' },
|
||||
{ label: 'Is Less Than', value: 'Is_less_than' },
|
||||
{ label: 'Is On (Date)', value: 'Is_on' },
|
||||
{ label: 'Is Before (Date)', value: 'Is_before' },
|
||||
{ label: 'Is After (Date)', value: 'Is_after' },
|
||||
{ label: 'Is Not Empty', value: 'Is_not_NULL' },
|
||||
],
|
||||
},
|
||||
}),
|
||||
|
||||
filterValue: Property.ShortText({
|
||||
displayName: 'Filter Value (Optional)',
|
||||
description: 'The value to filter by. For dates, use YYYY-MM-DD format or YYYY-MM-DD HH:MM:SS for specific times.',
|
||||
required: false,
|
||||
}),
|
||||
|
||||
additionalFilterField: Property.ShortText({
|
||||
displayName: 'Second Filter Field (Optional)',
|
||||
description: 'Add a second filter field for more complex queries.',
|
||||
required: false,
|
||||
}),
|
||||
|
||||
additionalFilterOperator: Property.StaticDropdown({
|
||||
displayName: 'Second Filter Operator',
|
||||
description: 'Operator for the second filter.',
|
||||
required: false,
|
||||
defaultValue: 'Is_equal_to',
|
||||
options: {
|
||||
disabled: false,
|
||||
options: [
|
||||
{ label: 'Is Equal To', value: 'Is_equal_to' },
|
||||
{ label: 'Is Not Equal To', value: 'Is_not_equal_to' },
|
||||
{ label: 'Contains', value: 'Contains' },
|
||||
{ label: 'Does Not Contain', value: 'Does_not_contain' },
|
||||
{ label: 'Begins With', value: 'Begins_with' },
|
||||
{ label: 'Ends With', value: 'Ends_with' },
|
||||
{ label: 'Is Greater Than', value: 'Is_greater_than' },
|
||||
{ label: 'Is Less Than', value: 'Is_less_than' },
|
||||
{ label: 'Is On (Date)', value: 'Is_on' },
|
||||
{ label: 'Is Before (Date)', value: 'Is_before' },
|
||||
{ label: 'Is After (Date)', value: 'Is_after' },
|
||||
{ label: 'Is Not Empty', value: 'Is_not_NULL' },
|
||||
],
|
||||
},
|
||||
}),
|
||||
|
||||
additionalFilterValue: Property.ShortText({
|
||||
displayName: 'Second Filter Value (Optional)',
|
||||
description: 'Value for the second filter.',
|
||||
required: false,
|
||||
}),
|
||||
|
||||
filterLogic: Property.StaticDropdown({
|
||||
displayName: 'Filter Logic',
|
||||
description: 'How to combine multiple filters. Only applies when using multiple filters.',
|
||||
required: false,
|
||||
defaultValue: 'AND',
|
||||
options: {
|
||||
disabled: false,
|
||||
options: [
|
||||
{ label: 'AND (All filters must match)', value: 'AND' },
|
||||
{ label: 'OR (Any filter must match)', value: 'OR' },
|
||||
],
|
||||
},
|
||||
}),
|
||||
|
||||
sort: Property.ShortText({
|
||||
displayName: 'Sort By Field ID (Optional)',
|
||||
description: 'Sort results by field ID (e.g., EntryId, DateCreated, Field1). Leave blank for default order.',
|
||||
required: false,
|
||||
}),
|
||||
|
||||
sortDirection: Property.StaticDropdown({
|
||||
displayName: 'Sort Direction',
|
||||
description: 'Order to sort the results.',
|
||||
required: false,
|
||||
defaultValue: 'DESC',
|
||||
options: {
|
||||
disabled: false,
|
||||
options: [
|
||||
{ label: 'Descending (Newest first)', value: 'DESC' },
|
||||
{ label: 'Ascending (Oldest first)', value: 'ASC' },
|
||||
],
|
||||
},
|
||||
}),
|
||||
|
||||
pageStart: Property.Number({
|
||||
displayName: 'Page Start',
|
||||
description: 'Starting entry number for pagination (0 = first entry).',
|
||||
required: false,
|
||||
defaultValue: 0,
|
||||
}),
|
||||
|
||||
pageSize: Property.Number({
|
||||
displayName: 'Page Size',
|
||||
description: 'Number of entries to return (maximum 100 per request).',
|
||||
required: false,
|
||||
defaultValue: 25,
|
||||
}),
|
||||
|
||||
includeSystem: Property.Checkbox({
|
||||
displayName: 'Include System Fields',
|
||||
description: 'Include additional metadata like IP address, payment status, and completion status.',
|
||||
required: false,
|
||||
defaultValue: false,
|
||||
}),
|
||||
|
||||
|
||||
},
|
||||
|
||||
async run(context) {
|
||||
const {
|
||||
formIdentifier,
|
||||
format,
|
||||
entryId,
|
||||
filterField,
|
||||
filterOperator,
|
||||
filterValue,
|
||||
additionalFilterField,
|
||||
additionalFilterOperator,
|
||||
additionalFilterValue,
|
||||
filterLogic,
|
||||
sort,
|
||||
sortDirection,
|
||||
pageStart,
|
||||
pageSize,
|
||||
includeSystem,
|
||||
} = context.propsValue;
|
||||
|
||||
try {
|
||||
const query: Record<string, string> = {
|
||||
pageStart: String(pageStart ?? 0),
|
||||
pageSize: String(Math.min(pageSize ?? 25, 100)),
|
||||
system: includeSystem ? 'true' : 'false',
|
||||
pretty: 'false', // Always false to avoid HTML wrapper
|
||||
};
|
||||
|
||||
let filterCount = 0;
|
||||
|
||||
if (entryId !== undefined && entryId !== null) {
|
||||
filterCount++;
|
||||
query[`Filter${filterCount}`] = `EntryId+Is_equal_to+${entryId}`;
|
||||
} else {
|
||||
if (filterField && filterValue) {
|
||||
filterCount++;
|
||||
query[`Filter${filterCount}`] = `${filterField}+${filterOperator}+${encodeURIComponent(filterValue)}`;
|
||||
}
|
||||
|
||||
if (additionalFilterField && additionalFilterValue) {
|
||||
filterCount++;
|
||||
query[`Filter${filterCount}`] = `${additionalFilterField}+${additionalFilterOperator}+${encodeURIComponent(additionalFilterValue)}`;
|
||||
}
|
||||
|
||||
if (filterCount > 1) {
|
||||
query['match'] = filterLogic || 'AND';
|
||||
}
|
||||
}
|
||||
|
||||
if (sort) {
|
||||
query['sort'] = sort;
|
||||
if (sortDirection) {
|
||||
query['sortDirection'] = sortDirection;
|
||||
}
|
||||
}
|
||||
|
||||
const response = await wufooApiCall<WufooEntriesResponse | string>({
|
||||
method: HttpMethod.GET,
|
||||
auth: context.auth,
|
||||
resourceUri: `/forms/${formIdentifier}/entries.${format}`,
|
||||
query,
|
||||
});
|
||||
|
||||
let parsedResponse = response;
|
||||
if (typeof response === 'string' && response.includes('OUTPUT =')) {
|
||||
const match = response.match(/OUTPUT = ({.*?});/);
|
||||
if (match) {
|
||||
try {
|
||||
parsedResponse = JSON.parse(match[1]);
|
||||
} catch (e) {
|
||||
parsedResponse = response;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (format === 'json' && parsedResponse && typeof parsedResponse === 'object') {
|
||||
const entriesData = parsedResponse as WufooEntriesResponse;
|
||||
const entries = entriesData.Entries || [];
|
||||
|
||||
return {
|
||||
success: true,
|
||||
message: `Retrieved ${entries.length} entries successfully`,
|
||||
summary: {
|
||||
totalRetrieved: entries.length,
|
||||
pageStart: pageStart ?? 0,
|
||||
pageSize: pageSize ?? 25,
|
||||
hasMoreEntries: entries.length === (pageSize ?? 25),
|
||||
filtersApplied: filterCount,
|
||||
sortedBy: sort || 'default',
|
||||
sortDirection: sortDirection || 'ASC',
|
||||
},
|
||||
entries: entries.map(entry => ({
|
||||
entryId: entry.EntryId,
|
||||
dateCreated: entry.DateCreated,
|
||||
dateUpdated: entry.DateUpdated,
|
||||
createdBy: entry.CreatedBy,
|
||||
updatedBy: entry.UpdatedBy,
|
||||
|
||||
fieldData: Object.keys(entry)
|
||||
.filter(key => !['EntryId', 'DateCreated', 'DateUpdated', 'CreatedBy', 'UpdatedBy'].includes(key))
|
||||
.reduce((acc, key) => {
|
||||
acc[key] = entry[key];
|
||||
return acc;
|
||||
}, {} as Record<string, any>),
|
||||
|
||||
rawEntry: entry,
|
||||
})),
|
||||
rawResponse: parsedResponse,
|
||||
};
|
||||
} else {
|
||||
return {
|
||||
success: true,
|
||||
message: 'Entries retrieved successfully',
|
||||
response: parsedResponse,
|
||||
};
|
||||
}
|
||||
} catch (error: any) {
|
||||
if (error.response?.status === 404) {
|
||||
throw new Error(
|
||||
`Form not found: The form with identifier "${formIdentifier}" does not exist or you do not have access to it. Please verify the form identifier and your permissions.`
|
||||
);
|
||||
}
|
||||
|
||||
if (error.response?.status === 400) {
|
||||
throw new Error(
|
||||
`Bad request: Invalid filter parameters or field IDs. Please check your filter fields and values. Error: ${error.response?.data?.Text || error.message}`
|
||||
);
|
||||
}
|
||||
|
||||
if (error.response?.status === 403) {
|
||||
throw new Error(
|
||||
'Access denied: You do not have permission to view entries for this form. Please check your Wufoo account permissions and API key scope.'
|
||||
);
|
||||
}
|
||||
|
||||
if (error.response?.status === 401) {
|
||||
throw new Error(
|
||||
'Authentication failed: Please verify your API key and subdomain are correct in the connection settings.'
|
||||
);
|
||||
}
|
||||
|
||||
throw new Error(
|
||||
`Failed to retrieve entries: ${error.message || 'Unknown error occurred'}. Please check your parameters and try again.`
|
||||
);
|
||||
}
|
||||
},
|
||||
});
|
||||
|
||||
interface WufooEntriesResponse {
|
||||
Entries: WufooEntry[];
|
||||
}
|
||||
|
||||
interface WufooEntry {
|
||||
EntryId: string;
|
||||
DateCreated: string;
|
||||
DateUpdated: string;
|
||||
CreatedBy: string;
|
||||
UpdatedBy: string | null;
|
||||
|
||||
// Dynamic field data - varies by form
|
||||
[key: string]: any;
|
||||
}
|
||||
@@ -0,0 +1,120 @@
|
||||
import {
|
||||
httpClient,
|
||||
HttpMethod,
|
||||
HttpRequest,
|
||||
HttpMessageBody,
|
||||
QueryParams,
|
||||
} from '@activepieces/pieces-common';
|
||||
import { AppConnectionValueForAuthProperty } from '@activepieces/pieces-framework';
|
||||
import { wufooAuth } from '../..';
|
||||
|
||||
export type WufooAuthProps = AppConnectionValueForAuthProperty<typeof wufooAuth>;
|
||||
|
||||
export type WufooApiCallParams = {
|
||||
method: HttpMethod;
|
||||
resourceUri: string;
|
||||
query?: Record<string, string | number | string[] | undefined>;
|
||||
body?: any;
|
||||
auth: WufooAuthProps;
|
||||
};
|
||||
|
||||
export async function wufooApiCall<T extends HttpMessageBody>({
|
||||
method,
|
||||
resourceUri,
|
||||
query,
|
||||
body,
|
||||
auth,
|
||||
}: WufooApiCallParams): Promise<T> {
|
||||
const { apiKey, subdomain } = auth.props;
|
||||
|
||||
if (!apiKey || !subdomain) {
|
||||
throw new Error('Wufoo API key and subdomain are required for authentication');
|
||||
}
|
||||
|
||||
const queryParams: QueryParams = {};
|
||||
|
||||
if (query) {
|
||||
for (const [key, value] of Object.entries(query)) {
|
||||
if (value !== null && value !== undefined) {
|
||||
queryParams[key] = String(value);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
const baseUrl = `https://${subdomain}.wufoo.com/api/v3`;
|
||||
|
||||
const authHeader = `Basic ${Buffer.from(`${apiKey}:footastic`).toString('base64')}`;
|
||||
|
||||
const request: HttpRequest = {
|
||||
method,
|
||||
url: `${baseUrl}${resourceUri}`,
|
||||
headers: {
|
||||
Authorization: authHeader,
|
||||
'Content-Type': 'application/x-www-form-urlencoded',
|
||||
},
|
||||
queryParams,
|
||||
body,
|
||||
};
|
||||
|
||||
try {
|
||||
const response = await httpClient.sendRequest<T>(request);
|
||||
return response.body;
|
||||
} catch (error: any) {
|
||||
const statusCode = error.response?.status;
|
||||
const errorData = error.response?.data;
|
||||
|
||||
switch (statusCode) {
|
||||
case 400:
|
||||
throw new Error(
|
||||
`Bad Request: ${errorData?.Text || 'Invalid request parameters'}. Please check your form data and field values.`
|
||||
);
|
||||
|
||||
case 401:
|
||||
throw new Error(
|
||||
'Authentication Failed: Invalid API key or subdomain. Please verify your Wufoo credentials in the connection settings.'
|
||||
);
|
||||
|
||||
case 403:
|
||||
throw new Error(
|
||||
'Access Forbidden: You do not have permission to access this resource. Please check your Wufoo account permissions.'
|
||||
);
|
||||
|
||||
case 404:
|
||||
throw new Error(
|
||||
'Resource Not Found: The requested form or resource does not exist. Please verify the form identifier is correct.'
|
||||
);
|
||||
|
||||
case 429:
|
||||
throw new Error(
|
||||
'Rate Limit Exceeded: Too many requests in a short time period. Wufoo allows maximum 50 submissions per user in a 5-minute window. Please wait before trying again.'
|
||||
);
|
||||
|
||||
case 500:
|
||||
throw new Error(
|
||||
'Internal Server Error: Wufoo is experiencing technical difficulties. Please try again later or contact Wufoo support.'
|
||||
);
|
||||
|
||||
case 502:
|
||||
case 503:
|
||||
case 504:
|
||||
throw new Error(
|
||||
'Service Unavailable: Wufoo service is temporarily unavailable. Please try again in a few minutes.'
|
||||
);
|
||||
|
||||
default: {
|
||||
let errorMessage = 'Unknown error occurred';
|
||||
if (errorData?.Text) {
|
||||
errorMessage = errorData.Text;
|
||||
} else if (errorData?.ErrorText) {
|
||||
errorMessage = errorData.ErrorText;
|
||||
} else if (error.message) {
|
||||
errorMessage = error.message;
|
||||
}
|
||||
|
||||
throw new Error(
|
||||
`Wufoo API Error (${statusCode || 'Unknown'}): ${errorMessage}`
|
||||
);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,410 @@
|
||||
import { Property, DynamicPropsValue } from '@activepieces/pieces-framework';
|
||||
import { HttpMethod } from '@activepieces/pieces-common';
|
||||
import { wufooApiCall } from './client';
|
||||
import { wufooAuth } from '../..';
|
||||
|
||||
interface WufooForm {
|
||||
Name: string;
|
||||
Hash: string;
|
||||
Url: string;
|
||||
}
|
||||
|
||||
interface WufooFormField {
|
||||
ID: string;
|
||||
Title: string;
|
||||
Type: string;
|
||||
IsRequired: string;
|
||||
Instructions: string;
|
||||
ClassNames: string;
|
||||
DefaultVal: string;
|
||||
Page: string;
|
||||
IsSystem?: boolean;
|
||||
|
||||
SubFields?: Array<{
|
||||
ID: string;
|
||||
Label: string;
|
||||
DefaultVal: string;
|
||||
}>;
|
||||
|
||||
Choices?: Array<{
|
||||
Label: string;
|
||||
Score?: number; // For Likert fields
|
||||
}>;
|
||||
|
||||
// For fields that allow "Other" option
|
||||
HasOtherField?: boolean;
|
||||
}
|
||||
|
||||
interface WufooFormFieldsResponse {
|
||||
Fields: WufooFormField[];
|
||||
}
|
||||
|
||||
export const formIdentifier = Property.Dropdown({
|
||||
auth: wufooAuth,
|
||||
displayName: 'Form Identifier (Name and Hash)',
|
||||
description: 'Select a Wufoo form to work with.',
|
||||
required: true,
|
||||
refreshers: [],
|
||||
options: async ({ auth }) => {
|
||||
|
||||
if (!auth) {
|
||||
return {
|
||||
disabled: true,
|
||||
options: [],
|
||||
placeholder: 'Please connect your Wufoo account.',
|
||||
};
|
||||
}
|
||||
|
||||
let response: { Forms: WufooForm[] };
|
||||
|
||||
try {
|
||||
response = await wufooApiCall<{ Forms: WufooForm[] }>({
|
||||
auth: auth,
|
||||
method: HttpMethod.GET,
|
||||
resourceUri: '/forms.json',
|
||||
});
|
||||
} catch (e) {
|
||||
return {
|
||||
disabled: true,
|
||||
options: [],
|
||||
placeholder: `Error fetching forms: ${(e as Error).message}`,
|
||||
};
|
||||
}
|
||||
|
||||
const forms = Array.isArray(response.Forms) ? response.Forms : [];
|
||||
|
||||
if (forms.length === 0) {
|
||||
return {
|
||||
disabled: true,
|
||||
options: [],
|
||||
placeholder: 'No forms found in your account.',
|
||||
};
|
||||
}
|
||||
|
||||
return {
|
||||
disabled: false,
|
||||
options: forms.map((form) => ({
|
||||
label: `${form.Name} (${form.Hash})`,
|
||||
value: form.Hash,
|
||||
})),
|
||||
};
|
||||
},
|
||||
});
|
||||
|
||||
export const dynamicFormFields = Property.DynamicProperties({
|
||||
auth: wufooAuth,
|
||||
displayName: 'Form Fields',
|
||||
description: 'Fill out the form fields with the data you want to submit. Field types and validation are automatically configured based on your form structure.',
|
||||
required: true,
|
||||
refreshers: ['formIdentifier', 'format'],
|
||||
props: async ({ auth, formIdentifier, format }) => {
|
||||
if (!auth || !formIdentifier) {
|
||||
return {};
|
||||
}
|
||||
|
||||
const responseFormat = (format as unknown as string) || 'json';
|
||||
|
||||
try {
|
||||
const response = await wufooApiCall<WufooFormFieldsResponse | any>({
|
||||
auth: auth,
|
||||
method: HttpMethod.GET,
|
||||
resourceUri: `/forms/${formIdentifier}/fields.json`,
|
||||
});
|
||||
|
||||
let parsedResponse = response;
|
||||
if (typeof response === 'string' && response.includes('OUTPUT =')) {
|
||||
const match = response.match(/OUTPUT = ({.*?});/);
|
||||
if (match) {
|
||||
try {
|
||||
parsedResponse = JSON.parse(match[1]);
|
||||
} catch (e) {
|
||||
console.error('Error parsing Wufoo fields response:', e);
|
||||
parsedResponse = response;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
let fields: WufooFormField[] = [];
|
||||
|
||||
if (parsedResponse && typeof parsedResponse === 'object') {
|
||||
if ((parsedResponse as any).Fields && Array.isArray((parsedResponse as any).Fields)) {
|
||||
fields = (parsedResponse as any).Fields;
|
||||
} else if (responseFormat === 'json') {
|
||||
fields = (parsedResponse as WufooFormFieldsResponse).Fields || [];
|
||||
} else if (responseFormat === 'xml') {
|
||||
const fieldsContainer = parsedResponse.Fields || parsedResponse;
|
||||
if (Array.isArray(fieldsContainer)) {
|
||||
fields = fieldsContainer;
|
||||
} else if (fieldsContainer.Field) {
|
||||
if (Array.isArray(fieldsContainer.Field)) {
|
||||
fields = fieldsContainer.Field;
|
||||
} else {
|
||||
fields = [fieldsContainer.Field];
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
const props: DynamicPropsValue = {};
|
||||
|
||||
for (const field of fields) {
|
||||
// Skip system fields (marked with IsSystem: true) and common system field IDs
|
||||
if (field.IsSystem ||
|
||||
['EntryId', 'DateCreated', 'CreatedBy', 'LastUpdated', 'UpdatedBy',
|
||||
'Status', 'PurchaseTotal', 'Currency', 'TransactionId', 'MerchantType',
|
||||
'IP', 'LastPage', 'CompleteSubmission'].includes(field.ID)) {
|
||||
continue;
|
||||
}
|
||||
|
||||
const fieldId = field.ID.startsWith('Field') ? field.ID : `Field${field.ID}`;
|
||||
const fieldTitle = field.Title || `Field ${field.ID}`;
|
||||
const fieldDescription = field.Instructions || `Enter value for ${fieldTitle}`;
|
||||
const isRequired = field.IsRequired === '1';
|
||||
|
||||
switch (field.Type) {
|
||||
case 'text':
|
||||
case 'email':
|
||||
case 'url':
|
||||
props[fieldId] = Property.ShortText({
|
||||
displayName: fieldTitle,
|
||||
description: fieldDescription,
|
||||
required: isRequired,
|
||||
defaultValue: field.DefaultVal || undefined,
|
||||
});
|
||||
break;
|
||||
|
||||
case 'textarea':
|
||||
props[fieldId] = Property.LongText({
|
||||
displayName: fieldTitle,
|
||||
description: fieldDescription,
|
||||
required: isRequired,
|
||||
defaultValue: field.DefaultVal || undefined,
|
||||
});
|
||||
break;
|
||||
|
||||
case 'number':
|
||||
case 'money':
|
||||
props[fieldId] = Property.Number({
|
||||
displayName: fieldTitle,
|
||||
description: field.Type === 'money' ?
|
||||
`${fieldDescription} (Enter monetary amount)` : fieldDescription,
|
||||
required: isRequired,
|
||||
defaultValue: field.DefaultVal ? parseFloat(field.DefaultVal) : undefined,
|
||||
});
|
||||
break;
|
||||
|
||||
case 'date':
|
||||
props[fieldId] = Property.DateTime({
|
||||
displayName: fieldTitle,
|
||||
description: `${fieldDescription} (Date will be converted to YYYYMMDD format for Wufoo)`,
|
||||
required: isRequired,
|
||||
});
|
||||
break;
|
||||
|
||||
case 'time':
|
||||
props[fieldId] = Property.ShortText({
|
||||
displayName: fieldTitle,
|
||||
description: `${fieldDescription} (Enter time in HH:MM format)`,
|
||||
required: isRequired,
|
||||
defaultValue: field.DefaultVal || undefined,
|
||||
});
|
||||
break;
|
||||
|
||||
case 'phone':
|
||||
props[fieldId] = Property.ShortText({
|
||||
displayName: fieldTitle,
|
||||
description: `${fieldDescription} (Phone number)`,
|
||||
required: isRequired,
|
||||
defaultValue: field.DefaultVal || undefined,
|
||||
});
|
||||
break;
|
||||
|
||||
case 'select':
|
||||
case 'radio':
|
||||
if (field.Choices && field.Choices.length > 0) {
|
||||
const options = field.Choices
|
||||
.filter(choice => choice.Label && choice.Label.trim() !== '')
|
||||
.map((choice) => ({
|
||||
label: choice.Label,
|
||||
value: choice.Label,
|
||||
}));
|
||||
|
||||
if (options.length > 0) {
|
||||
props[fieldId] = Property.StaticDropdown({
|
||||
displayName: fieldTitle,
|
||||
description: field.HasOtherField ?
|
||||
`${fieldDescription} (Includes "Other" option)` : fieldDescription,
|
||||
required: isRequired,
|
||||
options: {
|
||||
disabled: false,
|
||||
options: options,
|
||||
},
|
||||
});
|
||||
} else {
|
||||
// Fallback to text input if no valid choices
|
||||
props[fieldId] = Property.ShortText({
|
||||
displayName: fieldTitle,
|
||||
description: fieldDescription,
|
||||
required: isRequired,
|
||||
defaultValue: field.DefaultVal || undefined,
|
||||
});
|
||||
}
|
||||
} else {
|
||||
props[fieldId] = Property.ShortText({
|
||||
displayName: fieldTitle,
|
||||
description: fieldDescription,
|
||||
required: isRequired,
|
||||
defaultValue: field.DefaultVal || undefined,
|
||||
});
|
||||
}
|
||||
break;
|
||||
|
||||
case 'checkbox':
|
||||
if (field.SubFields && field.SubFields.length > 0) {
|
||||
// Handle checkbox fields with multiple options
|
||||
const options = field.SubFields.map((subField) => ({
|
||||
label: subField.Label,
|
||||
value: subField.ID,
|
||||
}));
|
||||
|
||||
props[fieldId] = Property.StaticMultiSelectDropdown({
|
||||
displayName: fieldTitle,
|
||||
description: `${fieldDescription} (Select multiple options)`,
|
||||
required: isRequired,
|
||||
options: {
|
||||
disabled: false,
|
||||
options: options,
|
||||
},
|
||||
});
|
||||
} else {
|
||||
// Single checkbox
|
||||
props[fieldId] = Property.Checkbox({
|
||||
displayName: fieldTitle,
|
||||
description: fieldDescription,
|
||||
required: isRequired,
|
||||
defaultValue: field.DefaultVal === '1' || field.DefaultVal === 'true',
|
||||
});
|
||||
}
|
||||
break;
|
||||
|
||||
case 'address':
|
||||
if (field.SubFields && field.SubFields.length > 0) {
|
||||
// Create individual fields for each address component
|
||||
for (const subField of field.SubFields) {
|
||||
props[subField.ID] = Property.ShortText({
|
||||
displayName: `${fieldTitle} - ${subField.Label}`,
|
||||
description: `Enter ${subField.Label.toLowerCase()}`,
|
||||
required: isRequired && ['Street Address', 'City'].includes(subField.Label),
|
||||
defaultValue: subField.DefaultVal || undefined,
|
||||
});
|
||||
}
|
||||
} else {
|
||||
// Fallback to single address field
|
||||
props[fieldId] = Property.LongText({
|
||||
displayName: fieldTitle,
|
||||
description: `${fieldDescription} (Complete address)`,
|
||||
required: isRequired,
|
||||
defaultValue: field.DefaultVal || undefined,
|
||||
});
|
||||
}
|
||||
break;
|
||||
|
||||
case 'shortname':
|
||||
if (field.SubFields && field.SubFields.length > 0) {
|
||||
// Create individual fields for name components (First, Last, etc.)
|
||||
for (const subField of field.SubFields) {
|
||||
props[subField.ID] = Property.ShortText({
|
||||
displayName: `${fieldTitle} - ${subField.Label}`,
|
||||
description: `Enter ${subField.Label.toLowerCase()} name`,
|
||||
required: isRequired,
|
||||
defaultValue: subField.DefaultVal || undefined,
|
||||
});
|
||||
}
|
||||
} else {
|
||||
props[fieldId] = Property.ShortText({
|
||||
displayName: fieldTitle,
|
||||
description: fieldDescription,
|
||||
required: isRequired,
|
||||
defaultValue: field.DefaultVal || undefined,
|
||||
});
|
||||
}
|
||||
break;
|
||||
|
||||
case 'likert':
|
||||
if (field.Choices && field.Choices.length > 0) {
|
||||
const options = field.Choices.map((choice) => ({
|
||||
label: `${choice.Label}${choice.Score ? ` (Score: ${choice.Score})` : ''}`,
|
||||
value: choice.Label,
|
||||
}));
|
||||
|
||||
if (field.SubFields && field.SubFields.length > 0) {
|
||||
// Create a dropdown for each Likert row
|
||||
for (const subField of field.SubFields) {
|
||||
props[subField.ID] = Property.StaticDropdown({
|
||||
displayName: `${fieldTitle} - ${subField.Label}`,
|
||||
description: `Rate: ${subField.Label}`,
|
||||
required: isRequired,
|
||||
options: {
|
||||
disabled: false,
|
||||
options: options,
|
||||
},
|
||||
});
|
||||
}
|
||||
} else {
|
||||
props[fieldId] = Property.StaticDropdown({
|
||||
displayName: fieldTitle,
|
||||
description: fieldDescription,
|
||||
required: isRequired,
|
||||
options: {
|
||||
disabled: false,
|
||||
options: options,
|
||||
},
|
||||
});
|
||||
}
|
||||
} else {
|
||||
// Fallback if no choices are provided
|
||||
props[fieldId] = Property.ShortText({
|
||||
displayName: fieldTitle,
|
||||
description: `${fieldDescription} (Likert scale)`,
|
||||
required: isRequired,
|
||||
defaultValue: field.DefaultVal || undefined,
|
||||
});
|
||||
}
|
||||
break;
|
||||
|
||||
case 'rating':
|
||||
props[fieldId] = Property.Number({
|
||||
displayName: fieldTitle,
|
||||
description: `${fieldDescription} (Rating scale)`,
|
||||
required: isRequired,
|
||||
defaultValue: field.DefaultVal ? parseFloat(field.DefaultVal) : undefined,
|
||||
});
|
||||
break;
|
||||
|
||||
case 'file':
|
||||
props[fieldId] = Property.File({
|
||||
displayName: fieldTitle,
|
||||
description: `${fieldDescription} (File upload)`,
|
||||
required: isRequired,
|
||||
});
|
||||
break;
|
||||
|
||||
default:
|
||||
// For unknown field types, default to text input with field type in description
|
||||
props[fieldId] = Property.ShortText({
|
||||
displayName: fieldTitle,
|
||||
description: `${fieldDescription} (Field type: ${field.Type})`,
|
||||
required: isRequired,
|
||||
defaultValue: field.DefaultVal || undefined,
|
||||
});
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
return props;
|
||||
} catch (error) {
|
||||
console.error(`Error fetching form fields in ${responseFormat} format:`, error);
|
||||
return {};
|
||||
}
|
||||
},
|
||||
});
|
||||
@@ -0,0 +1,241 @@
|
||||
import { HttpMethod } from '@activepieces/pieces-common';
|
||||
import { createTrigger, TriggerStrategy, Property } from '@activepieces/pieces-framework';
|
||||
import { isNil } from '@activepieces/shared';
|
||||
import { wufooAuth } from '../../index';
|
||||
import { wufooApiCall } from '../common/client';
|
||||
import { formIdentifier } from '../common/props';
|
||||
|
||||
const TRIGGER_KEY = 'wufoo-webhook-hash';
|
||||
|
||||
export const newFormEntryTrigger = createTrigger({
|
||||
auth: wufooAuth,
|
||||
name: 'new_form_entry',
|
||||
displayName: 'New Form Entry',
|
||||
description: 'Triggers when someone submits a new entry to your Wufoo form.',
|
||||
type: TriggerStrategy.WEBHOOK,
|
||||
props: {
|
||||
formIdentifier: formIdentifier,
|
||||
|
||||
handshakeKey: Property.ShortText({
|
||||
displayName: 'Handshake Key (Optional)',
|
||||
description: 'A secret key to validate webhook authenticity and prevent unauthorized requests. Recommended for production workflows.',
|
||||
required: false,
|
||||
}),
|
||||
|
||||
includeMetadata: Property.Checkbox({
|
||||
displayName: 'Include Form Structure Metadata',
|
||||
description: 'Include detailed form and field structure information with each submission. Useful for dynamic processing but increases payload size.',
|
||||
required: false,
|
||||
defaultValue: false,
|
||||
}),
|
||||
|
||||
responseFormat: Property.StaticDropdown({
|
||||
displayName: 'Webhook Response Format',
|
||||
description: 'Choose the format for webhook data. JSON is recommended for most automation workflows.',
|
||||
required: false,
|
||||
defaultValue: 'json',
|
||||
options: {
|
||||
disabled: false,
|
||||
options: [
|
||||
{ label: 'JSON', value: 'json' },
|
||||
{ label: 'XML', value: 'xml' },
|
||||
],
|
||||
},
|
||||
}),
|
||||
},
|
||||
|
||||
async onEnable(context) {
|
||||
const { formIdentifier, handshakeKey, includeMetadata, responseFormat } = context.propsValue;
|
||||
|
||||
try {
|
||||
await wufooApiCall({
|
||||
method: HttpMethod.GET,
|
||||
auth: context.auth,
|
||||
resourceUri: `/forms/${formIdentifier}.json`,
|
||||
});
|
||||
|
||||
const webhookBody: Record<string, string> = {
|
||||
url: context.webhookUrl,
|
||||
metadata: includeMetadata ? 'true' : 'false',
|
||||
};
|
||||
|
||||
if (handshakeKey && handshakeKey.trim()) {
|
||||
webhookBody['handshakeKey'] = handshakeKey.trim();
|
||||
}
|
||||
|
||||
const response = await wufooApiCall<{
|
||||
WebHookPutResult: { Hash: string };
|
||||
}>({
|
||||
method: HttpMethod.PUT,
|
||||
auth: context.auth,
|
||||
resourceUri: `/forms/${formIdentifier}/webhooks.${responseFormat || 'json'}`,
|
||||
body: webhookBody,
|
||||
});
|
||||
|
||||
await context.store.put<string>(TRIGGER_KEY, response.WebHookPutResult.Hash);
|
||||
|
||||
console.log(`Wufoo webhook successfully configured for form ${formIdentifier} with hash: ${response.WebHookPutResult.Hash}`);
|
||||
} catch (error: any) {
|
||||
if (error.response?.status === 404) {
|
||||
throw new Error(
|
||||
`Form not found: The form with identifier "${formIdentifier}" does not exist or you do not have access to it. Please verify the form identifier and your permissions.`
|
||||
);
|
||||
}
|
||||
|
||||
if (error.response?.status === 403) {
|
||||
throw new Error(
|
||||
'Access denied: You do not have permission to set up webhooks for this form. Please check your Wufoo account permissions and ensure you have webhook access.'
|
||||
);
|
||||
}
|
||||
|
||||
if (error.response?.status === 400) {
|
||||
throw new Error(
|
||||
`Invalid webhook configuration: ${error.response?.data?.Text || error.message}. Please check your webhook URL and form identifier.`
|
||||
);
|
||||
}
|
||||
|
||||
throw new Error(
|
||||
`Failed to set up webhook: ${error.message || 'Unknown error occurred'}. Please check your form identifier and try again.`
|
||||
);
|
||||
}
|
||||
},
|
||||
|
||||
async onDisable(context) {
|
||||
const webhookHash = await context.store.get<string>(TRIGGER_KEY);
|
||||
const { formIdentifier, responseFormat } = context.propsValue;
|
||||
|
||||
if (!isNil(webhookHash)) {
|
||||
try {
|
||||
await wufooApiCall({
|
||||
method: HttpMethod.DELETE,
|
||||
auth: context.auth,
|
||||
resourceUri: `/forms/${formIdentifier}/webhooks/${webhookHash}.${responseFormat || 'json'}`,
|
||||
});
|
||||
|
||||
console.log(`Wufoo webhook successfully removed for form ${formIdentifier} with hash: ${webhookHash}`);
|
||||
} catch (error: any) {
|
||||
console.warn(`Warning: Failed to clean up webhook ${webhookHash} for form ${formIdentifier}:`, error.message);
|
||||
|
||||
await context.store.delete(TRIGGER_KEY);
|
||||
}
|
||||
}
|
||||
},
|
||||
|
||||
async run(context) {
|
||||
const payload = context.payload.body as Record<string, any>;
|
||||
|
||||
if (payload && typeof payload === 'object') {
|
||||
const processedPayload = {
|
||||
entryId: payload['EntryId'],
|
||||
dateCreated: payload['DateCreated'],
|
||||
createdBy: payload['CreatedBy'] || 'public',
|
||||
|
||||
formData: Object.keys(payload)
|
||||
.filter(key => !['EntryId', 'DateCreated', 'CreatedBy', 'DateUpdated', 'UpdatedBy'].includes(key))
|
||||
.reduce((acc, key) => {
|
||||
acc[key] = payload[key];
|
||||
return acc;
|
||||
}, {} as Record<string, any>),
|
||||
|
||||
commonFields: {
|
||||
...(payload['Field1'] && { firstName: payload['Field1'] }),
|
||||
...(payload['Field2'] && { lastName: payload['Field2'] }),
|
||||
...(payload['Field218'] && { email: payload['Field218'] }),
|
||||
...(payload['Field220'] && { phone: payload['Field220'] }),
|
||||
},
|
||||
|
||||
rawPayload: payload,
|
||||
|
||||
webhookInfo: {
|
||||
receivedAt: new Date().toISOString(),
|
||||
source: 'wufoo',
|
||||
type: 'form_entry',
|
||||
},
|
||||
};
|
||||
|
||||
return [processedPayload];
|
||||
}
|
||||
|
||||
return [payload];
|
||||
},
|
||||
|
||||
async test(context) {
|
||||
return [
|
||||
{
|
||||
entryId: '123',
|
||||
dateCreated: '2025-01-15 14:30:22',
|
||||
createdBy: 'public',
|
||||
formData: {
|
||||
Field105: 'Sample form submission for testing',
|
||||
Field106: '456',
|
||||
Field107: 'This is a test paragraph field entry with multiple lines of content.',
|
||||
Field1: 'John',
|
||||
Field2: 'Doe',
|
||||
Field218: 'john.doe@example.com',
|
||||
Field220: '555-123-4567',
|
||||
Field217: '2025-01-15',
|
||||
},
|
||||
commonFields: {
|
||||
firstName: 'John',
|
||||
lastName: 'Doe',
|
||||
email: 'john.doe@example.com',
|
||||
phone: '555-123-4567',
|
||||
},
|
||||
rawPayload: {
|
||||
EntryId: '123',
|
||||
Field105: 'Sample form submission for testing',
|
||||
Field106: '456',
|
||||
Field107: 'This is a test paragraph field entry with multiple lines of content.',
|
||||
Field1: 'John',
|
||||
Field2: 'Doe',
|
||||
Field218: 'john.doe@example.com',
|
||||
Field220: '555-123-4567',
|
||||
Field217: '2025-01-15',
|
||||
DateCreated: '2025-01-15 14:30:22',
|
||||
CreatedBy: 'public',
|
||||
},
|
||||
webhookInfo: {
|
||||
receivedAt: '2025-01-15T14:30:22.000Z',
|
||||
source: 'wufoo',
|
||||
type: 'form_entry',
|
||||
},
|
||||
},
|
||||
];
|
||||
},
|
||||
|
||||
sampleData: {
|
||||
entryId: '124',
|
||||
dateCreated: '2025-01-15 15:45:10',
|
||||
createdBy: 'public',
|
||||
formData: {
|
||||
Field105: 'Another sample entry',
|
||||
Field106: '789',
|
||||
Field1: 'Jane',
|
||||
Field2: 'Smith',
|
||||
Field218: 'jane.smith@example.com',
|
||||
Field220: '555-987-6543',
|
||||
},
|
||||
commonFields: {
|
||||
firstName: 'Jane',
|
||||
lastName: 'Smith',
|
||||
email: 'jane.smith@example.com',
|
||||
phone: '555-987-6543',
|
||||
},
|
||||
rawPayload: {
|
||||
EntryId: '124',
|
||||
Field105: 'Another sample entry',
|
||||
Field106: '789',
|
||||
Field1: 'Jane',
|
||||
Field2: 'Smith',
|
||||
Field218: 'jane.smith@example.com',
|
||||
Field220: '555-987-6543',
|
||||
DateCreated: '2025-01-15 15:45:10',
|
||||
CreatedBy: 'public',
|
||||
},
|
||||
webhookInfo: {
|
||||
receivedAt: '2025-01-15T15:45:10.000Z',
|
||||
source: 'wufoo',
|
||||
type: 'form_entry',
|
||||
},
|
||||
},
|
||||
});
|
||||
@@ -0,0 +1,328 @@
|
||||
import { createTrigger, TriggerStrategy, Property } from '@activepieces/pieces-framework';
|
||||
import { HttpMethod } from '@activepieces/pieces-common';
|
||||
import { wufooAuth } from '../../index';
|
||||
import { wufooApiCall } from '../common/client';
|
||||
|
||||
const LAST_FORM_IDS_KEY = 'wufoo-last-form-ids';
|
||||
|
||||
export const newFormTrigger = createTrigger({
|
||||
auth: wufooAuth,
|
||||
name: 'new_form_created',
|
||||
displayName: 'New Form Created',
|
||||
description: 'Triggers when a new form is created in your Wufoo account.',
|
||||
type: TriggerStrategy.POLLING,
|
||||
props: {
|
||||
pollingInterval: Property.StaticDropdown({
|
||||
displayName: 'Polling Interval',
|
||||
description: 'How frequently to check for new forms. More frequent checking provides faster detection but uses more API calls.',
|
||||
required: false,
|
||||
defaultValue: '5',
|
||||
options: {
|
||||
disabled: false,
|
||||
options: [
|
||||
{ label: 'Every 1 minute', value: '1' },
|
||||
{ label: 'Every 5 minutes', value: '5' },
|
||||
{ label: 'Every 15 minutes', value: '15' },
|
||||
{ label: 'Every 30 minutes', value: '30' },
|
||||
{ label: 'Every hour', value: '60' },
|
||||
],
|
||||
},
|
||||
}),
|
||||
|
||||
nameFilter: Property.ShortText({
|
||||
displayName: 'Form Name Filter (Optional)',
|
||||
description: 'Only trigger for forms containing this text in their name. Leave empty to monitor all forms.',
|
||||
required: false,
|
||||
}),
|
||||
|
||||
includeInactive: Property.Checkbox({
|
||||
displayName: 'Include Inactive Forms',
|
||||
description: 'Include forms that are not currently active/published. Useful for monitoring all form creation activity.',
|
||||
required: false,
|
||||
defaultValue: false,
|
||||
}),
|
||||
|
||||
responseFormat: Property.StaticDropdown({
|
||||
displayName: 'Response Format',
|
||||
description: 'Choose the format for form data. JSON is recommended for most workflows.',
|
||||
required: false,
|
||||
defaultValue: 'json',
|
||||
options: {
|
||||
disabled: false,
|
||||
options: [
|
||||
{ label: 'JSON', value: 'json' },
|
||||
{ label: 'XML', value: 'xml' },
|
||||
],
|
||||
},
|
||||
}),
|
||||
},
|
||||
|
||||
async onEnable(context) {
|
||||
const { responseFormat } = context.propsValue;
|
||||
|
||||
try {
|
||||
const response = await wufooApiCall<{ Forms: WufooForm[] }>({
|
||||
auth: context.auth,
|
||||
method: HttpMethod.GET,
|
||||
resourceUri: `/forms.${responseFormat || 'json'}`,
|
||||
});
|
||||
|
||||
const hashes = response.Forms.map((form) => form.Hash);
|
||||
await context.store.put<string[]>(LAST_FORM_IDS_KEY, hashes);
|
||||
|
||||
console.log(`Wufoo New Form trigger initialized with ${hashes.length} existing forms`);
|
||||
} catch (error: any) {
|
||||
if (error.response?.status === 401) {
|
||||
throw new Error(
|
||||
'Authentication failed: Please check your API key and subdomain. Make sure your API key has permission to access forms.'
|
||||
);
|
||||
}
|
||||
|
||||
if (error.response?.status === 403) {
|
||||
throw new Error(
|
||||
'Access denied: You do not have permission to list forms. Please check your Wufoo account permissions.'
|
||||
);
|
||||
}
|
||||
|
||||
throw new Error(
|
||||
`Failed to initialize form monitoring: ${error.message || 'Unknown error occurred'}. Please check your Wufoo connection.`
|
||||
);
|
||||
}
|
||||
},
|
||||
|
||||
async onDisable() {
|
||||
console.log('Wufoo New Form trigger disabled and cleaned up');
|
||||
},
|
||||
|
||||
async run(context) {
|
||||
const { nameFilter, includeInactive, responseFormat } = context.propsValue;
|
||||
|
||||
try {
|
||||
const previousHashes = await context.store.get<string[]>(LAST_FORM_IDS_KEY) || [];
|
||||
|
||||
const response = await wufooApiCall<{ Forms: WufooForm[] }>({
|
||||
auth: context.auth,
|
||||
method: HttpMethod.GET,
|
||||
resourceUri: `/forms.${responseFormat || 'json'}`,
|
||||
});
|
||||
|
||||
const allForms = response.Forms || [];
|
||||
const currentHashes = allForms.map((f) => f.Hash);
|
||||
|
||||
await context.store.put<string[]>(LAST_FORM_IDS_KEY, currentHashes);
|
||||
|
||||
let newForms = allForms.filter((form) => !previousHashes.includes(form.Hash));
|
||||
|
||||
if (nameFilter && nameFilter.trim()) {
|
||||
const filterText = nameFilter.trim().toLowerCase();
|
||||
newForms = newForms.filter((form) =>
|
||||
form.Name && form.Name.toLowerCase().includes(filterText)
|
||||
);
|
||||
}
|
||||
|
||||
if (!includeInactive) {
|
||||
newForms = newForms.filter((form) => form.IsPublic === '1');
|
||||
}
|
||||
|
||||
const processedForms = newForms.map((form) => ({
|
||||
id: form.Hash,
|
||||
name: form.Name,
|
||||
description: form.Description,
|
||||
url: form.Url,
|
||||
|
||||
isPublic: form.IsPublic === '1',
|
||||
isActive: form.IsPublic === '1',
|
||||
redirectUrl: form.RedirectUrl,
|
||||
|
||||
dateCreated: form.DateCreated,
|
||||
dateUpdated: form.DateUpdated,
|
||||
|
||||
entryCount: parseInt(form.EntryCount || '0', 10),
|
||||
|
||||
language: form.Language || 'english',
|
||||
|
||||
rawFormData: form,
|
||||
|
||||
triggerInfo: {
|
||||
detectedAt: new Date().toISOString(),
|
||||
source: 'wufoo',
|
||||
type: 'new_form',
|
||||
},
|
||||
}));
|
||||
|
||||
return processedForms;
|
||||
} catch (error: any) {
|
||||
if (error.response?.status === 401) {
|
||||
throw new Error(
|
||||
'Authentication failed: Your API key may have expired. Please check your Wufoo authentication.'
|
||||
);
|
||||
}
|
||||
|
||||
if (error.response?.status === 429) {
|
||||
throw new Error(
|
||||
'Rate limit exceeded: Wufoo API rate limit reached. Consider increasing your polling interval.'
|
||||
);
|
||||
}
|
||||
|
||||
if (error.response?.status === 403) {
|
||||
throw new Error(
|
||||
'Access denied: You do not have permission to list forms. Please check your account permissions.'
|
||||
);
|
||||
}
|
||||
|
||||
throw new Error(
|
||||
`Failed to check for new forms: ${error.message || 'Unknown error occurred'}. The trigger will retry on the next polling interval.`
|
||||
);
|
||||
}
|
||||
},
|
||||
|
||||
async test(context) {
|
||||
const { responseFormat } = context.propsValue;
|
||||
|
||||
try {
|
||||
const response = await wufooApiCall<{ Forms: WufooForm[] }>({
|
||||
auth: context.auth,
|
||||
method: HttpMethod.GET,
|
||||
resourceUri: `/forms.${responseFormat || 'json'}`,
|
||||
});
|
||||
|
||||
const forms = response.Forms || [];
|
||||
|
||||
if (forms.length > 0) {
|
||||
const testForm = forms[0];
|
||||
return [
|
||||
{
|
||||
id: testForm.Hash,
|
||||
name: testForm.Name,
|
||||
description: testForm.Description,
|
||||
url: testForm.Url,
|
||||
isPublic: testForm.IsPublic === '1',
|
||||
isActive: testForm.IsPublic === '1',
|
||||
redirectUrl: testForm.RedirectUrl,
|
||||
dateCreated: testForm.DateCreated,
|
||||
dateUpdated: testForm.DateUpdated,
|
||||
entryCount: parseInt(testForm.EntryCount || '0', 10),
|
||||
language: testForm.Language || 'english',
|
||||
rawFormData: testForm,
|
||||
triggerInfo: {
|
||||
detectedAt: new Date().toISOString(),
|
||||
source: 'wufoo',
|
||||
type: 'new_form',
|
||||
},
|
||||
},
|
||||
];
|
||||
} else {
|
||||
return [
|
||||
{
|
||||
id: 's1afea8b1vk0jf7',
|
||||
name: 'Sample Contact Form',
|
||||
description: 'A sample contact form for testing purposes',
|
||||
url: 'https://example.wufoo.com/forms/s1afea8b1vk0jf7/',
|
||||
isPublic: true,
|
||||
isActive: true,
|
||||
redirectUrl: 'https://example.com/thank-you',
|
||||
dateCreated: '2025-01-15 10:00:00',
|
||||
dateUpdated: '2025-01-15 10:00:00',
|
||||
entryCount: 0,
|
||||
language: 'english',
|
||||
rawFormData: {
|
||||
Hash: 's1afea8b1vk0jf7',
|
||||
Name: 'Sample Contact Form',
|
||||
Description: 'A sample contact form for testing purposes',
|
||||
Url: 'https://example.wufoo.com/forms/s1afea8b1vk0jf7/',
|
||||
IsPublic: '1',
|
||||
EntryCount: '0',
|
||||
DateCreated: '2025-01-15 10:00:00',
|
||||
DateUpdated: '2025-01-15 10:00:00',
|
||||
Language: 'english',
|
||||
},
|
||||
triggerInfo: {
|
||||
detectedAt: new Date().toISOString(),
|
||||
source: 'wufoo',
|
||||
type: 'new_form',
|
||||
},
|
||||
},
|
||||
];
|
||||
}
|
||||
} catch (error: any) {
|
||||
return [
|
||||
{
|
||||
id: 's1afea8b1vk0jf7',
|
||||
name: 'Test Contact Form',
|
||||
description: 'A test form created for workflow testing',
|
||||
url: 'https://example.wufoo.com/forms/s1afea8b1vk0jf7/',
|
||||
isPublic: true,
|
||||
isActive: true,
|
||||
redirectUrl: 'https://example.com/thank-you',
|
||||
dateCreated: '2025-01-15 10:00:00',
|
||||
dateUpdated: '2025-01-15 10:00:00',
|
||||
entryCount: 5,
|
||||
language: 'english',
|
||||
rawFormData: {
|
||||
Hash: 's1afea8b1vk0jf7',
|
||||
Name: 'Test Contact Form',
|
||||
Description: 'A test form created for workflow testing',
|
||||
Url: 'https://example.wufoo.com/forms/s1afea8b1vk0jf7/',
|
||||
IsPublic: '1',
|
||||
EntryCount: '5',
|
||||
DateCreated: '2025-01-15 10:00:00',
|
||||
DateUpdated: '2025-01-15 10:00:00',
|
||||
Language: 'english',
|
||||
},
|
||||
triggerInfo: {
|
||||
detectedAt: new Date().toISOString(),
|
||||
source: 'wufoo',
|
||||
type: 'new_form',
|
||||
},
|
||||
},
|
||||
];
|
||||
}
|
||||
},
|
||||
|
||||
sampleData: {
|
||||
id: 's1afea8b1vk0jf7',
|
||||
name: 'Customer Feedback Form',
|
||||
description: 'Collect valuable feedback from our customers',
|
||||
url: 'https://example.wufoo.com/forms/s1afea8b1vk0jf7/',
|
||||
isPublic: true,
|
||||
isActive: true,
|
||||
redirectUrl: 'https://example.com/thank-you',
|
||||
dateCreated: '2025-01-15 09:30:00',
|
||||
dateUpdated: '2025-01-15 09:30:00',
|
||||
entryCount: 0,
|
||||
language: 'english',
|
||||
rawFormData: {
|
||||
Hash: 's1afea8b1vk0jf7',
|
||||
Name: 'Customer Feedback Form',
|
||||
Description: 'Collect valuable feedback from our customers',
|
||||
Url: 'https://example.wufoo.com/forms/s1afea8b1vk0jf7/',
|
||||
IsPublic: '1',
|
||||
EntryCount: '0',
|
||||
DateCreated: '2025-01-15 09:30:00',
|
||||
DateUpdated: '2025-01-15 09:30:00',
|
||||
Language: 'english',
|
||||
},
|
||||
triggerInfo: {
|
||||
detectedAt: '2025-01-15T09:30:00.000Z',
|
||||
source: 'wufoo',
|
||||
type: 'new_form',
|
||||
},
|
||||
},
|
||||
});
|
||||
|
||||
/**
|
||||
* Interface for Wufoo form data structure
|
||||
*/
|
||||
interface WufooForm {
|
||||
Hash: string;
|
||||
Name: string;
|
||||
Description: string;
|
||||
Url: string;
|
||||
IsPublic: string;
|
||||
EntryCount: string;
|
||||
DateCreated: string;
|
||||
DateUpdated: string;
|
||||
Language?: string;
|
||||
RedirectUrl?: string;
|
||||
[key: string]: any;
|
||||
}
|
||||
@@ -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