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-zendesk
|
||||
|
||||
This library was generated with [Nx](https://nx.dev).
|
||||
|
||||
## Running lint
|
||||
|
||||
Run `nx lint pieces-zendesk` to execute the lint via [ESLint](https://eslint.org/).
|
||||
@@ -0,0 +1,4 @@
|
||||
{
|
||||
"name": "@activepieces/piece-zendesk",
|
||||
"version": "0.1.15"
|
||||
}
|
||||
@@ -0,0 +1,51 @@
|
||||
{
|
||||
"name": "pieces-zendesk",
|
||||
"$schema": "../../../../node_modules/nx/schemas/project-schema.json",
|
||||
"sourceRoot": "packages/pieces/community/zendesk/src",
|
||||
"projectType": "library",
|
||||
"targets": {
|
||||
"build": {
|
||||
"executor": "@nx/js:tsc",
|
||||
"outputs": [
|
||||
"{options.outputPath}"
|
||||
],
|
||||
"options": {
|
||||
"outputPath": "dist/packages/pieces/community/zendesk",
|
||||
"tsConfig": "packages/pieces/community/zendesk/tsconfig.lib.json",
|
||||
"packageJson": "packages/pieces/community/zendesk/package.json",
|
||||
"main": "packages/pieces/community/zendesk/src/index.ts",
|
||||
"assets": [
|
||||
"packages/pieces/community/zendesk/*.md",
|
||||
{
|
||||
"input": "packages/pieces/community/zendesk/src/i18n",
|
||||
"output": "./src/i18n",
|
||||
"glob": "**/!(i18n.json)"
|
||||
}
|
||||
],
|
||||
"buildableProjectDepsInPackageJsonType": "dependencies",
|
||||
"updateBuildableProjectDepsInPackageJson": true
|
||||
},
|
||||
"dependsOn": [
|
||||
"^build",
|
||||
"prebuild"
|
||||
]
|
||||
},
|
||||
"lint": {
|
||||
"executor": "@nx/eslint:lint",
|
||||
"outputs": [
|
||||
"{options.outputFile}"
|
||||
]
|
||||
},
|
||||
"prebuild": {
|
||||
"executor": "nx:run-commands",
|
||||
"options": {
|
||||
"cwd": "packages/pieces/community/zendesk",
|
||||
"command": "bun install --no-save --silent"
|
||||
},
|
||||
"dependsOn": [
|
||||
"^build"
|
||||
]
|
||||
}
|
||||
},
|
||||
"tags": []
|
||||
}
|
||||
@@ -0,0 +1,304 @@
|
||||
{
|
||||
"Customer service software and support ticket system": "Kundenservice-Software und Support-Ticket-System",
|
||||
"Agent Email": "Agenten-E-Mail",
|
||||
"Token": "Token",
|
||||
"Organization (e.g activepieceshelp)": "Organisation (z. B. activepieceshelp)",
|
||||
"The email address you use to login to Zendesk": "Die E-Mail-Adresse, mit der Sie sich bei Zendesk anmelden",
|
||||
"The API token you can generate in Zendesk": "Der API-Token den Sie in Zendesk generieren können",
|
||||
"The subdomain of your Zendesk instance": "Die Subdomain deiner Zendesk-Instanz",
|
||||
"\n**Organization**: The organization name can be found in the URL (e.g https://ORGANIZATION_NAME.zendesk.com).\n\n**Agent Email**: The email you use to log in to Zendesk.\n\n**API Token**: You can find this in the Zendesk Admin Panel under Settings > APIs > Zendesk API.\n": "\n**Organisation**: Der Organisationsname kann unter der URL gefunden werden (z.B. https://ORGANIZATION_NAME. Endesk.com).\n\n**Agent E-Mail**: Die E-Mail, mit der Sie sich bei Zendesk anmelden.\n\n**API-Token**: Sie finden dies im Zendesk-Admin-Panel unter Einstellungen > APIs > Zendesk-API.\n",
|
||||
"Create Ticket": "Ticket erstellen",
|
||||
"Update Ticket": "Ticket aktualisieren",
|
||||
"Add Tag to Ticket": "Tag zu Ticket hinzufügen",
|
||||
"Add Comment to Ticket": "Kommentar zu Ticket hinzufügen",
|
||||
"Create Organization": "Organisation erstellen",
|
||||
"Update Organization": "Organisation aktualisieren",
|
||||
"Create User": "Benutzer erstellen",
|
||||
"Delete User": "Benutzer löschen",
|
||||
"Find Organization(s)": "Organisation finden(n)",
|
||||
"Find Ticket(s)": "Tickets finden(n)",
|
||||
"Find User(s)": "Benutzer finden(n)",
|
||||
"Custom API Call": "Eigener API-Aufruf",
|
||||
"Create a new ticket in Zendesk.": "Erstellen Sie ein neues Ticket in Zendesk.",
|
||||
"Modify ticket fields or status via API call.": "Ticket-Felder oder Status per API-Aufruf ändern.",
|
||||
"Apply one or more tags to a ticket.": "Ein oder mehrere Tags auf ein Ticket übertragen.",
|
||||
"Append a public/private comment to a ticket.": "Einen öffentlichen/privaten Kommentar an ein Ticket anhängen.",
|
||||
"Create a new organization record.": "Erstellen Sie einen neuen Organisationseintrag.",
|
||||
"Update existing organization fields.": "Bestehende Organisationsfelder aktualisieren.",
|
||||
"Add a new user to the Zendesk instance.": "Fügen Sie einen neuen Benutzer zur Zendesk-Instanz hinzu.",
|
||||
"Remove a user and associated records from the account.": "Benutzer und zugehörige Datensätze aus dem Konto entfernen.",
|
||||
"Search organizations by name, domain, external ID, or other criteria.": "Suche Organisationen nach Namen, Domain, externer ID oder anderen Kriterien.",
|
||||
"Search tickets by ID, field, or content.": "Tickets nach ID, Feld oder Inhalt suchen.",
|
||||
"Search users by email, name, role, or other criteria.": "Suche Benutzer nach E-Mails, Namen, Rolle oder anderen Kriterien.",
|
||||
"Make a custom API call to a specific endpoint": "Einen benutzerdefinierten API-Aufruf an einen bestimmten Endpunkt machen",
|
||||
"Subject": "Betreff",
|
||||
"Comment Body": "Kommentar-Text",
|
||||
"Comment HTML Body": "HTML-Inhalt kommentieren",
|
||||
"Requester Email": "Anfrage E-Mail",
|
||||
"Requester Name": "Name des Antragstellers",
|
||||
"Assignee Email": "Assignee Email",
|
||||
"Priority": "Priorität",
|
||||
"Type": "Typ",
|
||||
"Status": "Status",
|
||||
"Tags": "Tags",
|
||||
"Organization": "Organisation",
|
||||
"Group": "Gruppe",
|
||||
"External ID": "Externe ID",
|
||||
"Collaborator Emails": "Mitarbeiter-E-Mails",
|
||||
"Follower Emails": "Follower-E-Mails",
|
||||
"Due Date": "Fälligkeitsdatum",
|
||||
"Custom Fields": "Eigene Felder",
|
||||
"Public Comment": "Öffentlicher Kommentar",
|
||||
"Brand": "Marke",
|
||||
"Forum Topic ID": "Themen-ID des Forums",
|
||||
"Problem Ticket": "Problem Ticket",
|
||||
"Ticket": "Ticket",
|
||||
"Custom Status ID": "Eigene Status-ID",
|
||||
"Safe Update": "Sicheres Update",
|
||||
"Updated Timestamp": "Aktualisierte Zeitstempel",
|
||||
"Author Email": "Autor E-Mail",
|
||||
"Attachment Tokens": "Attachment-Token",
|
||||
"Via Followup Source ID": "Über Follow-up-Quell-ID",
|
||||
"Organization Name": "Organisationsname",
|
||||
"Details": "Details",
|
||||
"Notes": "Notizen",
|
||||
"Domain Names": "Domänennamen",
|
||||
"Organization Fields": "Organisationsfelder",
|
||||
"Shared Tickets": "Gemeinsame Tickets",
|
||||
"Shared Comments": "Gemeinsame Kommentare",
|
||||
"Name": "Name",
|
||||
"Email": "E-Mail",
|
||||
"Role": "Rolle",
|
||||
"Custom Role": "Eigene Rolle",
|
||||
"Phone": "Telefon",
|
||||
"Alias": "Alias",
|
||||
"Time Zone": "Zeitzone",
|
||||
"Locale": "Lokal",
|
||||
"Verified": "Verifiziert",
|
||||
"Active": "Aktiv",
|
||||
"Shared": "Geteilt",
|
||||
"Shared Agent": "Geteilter Agent",
|
||||
"Moderator": "Moderator",
|
||||
"Suspended": "Gesperrt",
|
||||
"Restricted Agent": "Eingeschränkter Agent",
|
||||
"Only Private Comments": "Nur private Kommentare",
|
||||
"Report CSV": "CSV melden",
|
||||
"Skip Verify Email": "Bestätigungs-E-Mail überspringen",
|
||||
"Ticket Restriction": "Ticket-Beschränkung",
|
||||
"Signature": "Signatur",
|
||||
"Agent Brand Access": "Agenten-Markenzugriff",
|
||||
"User Fields": "Benutzerfelder",
|
||||
"Identities": "Identitäten",
|
||||
"User": "Benutzer",
|
||||
"Confirm Deletion": "Löschen bestätigen",
|
||||
"Search Type": "Suchtyp",
|
||||
"Domain": "Domäne",
|
||||
"Tag": "Markierung",
|
||||
"Custom Query": "Eigene Abfrage",
|
||||
"Sort By": "Sortieren nach",
|
||||
"Sort Order": "Sortierung",
|
||||
"Ticket ID": "Ticket-ID",
|
||||
"Content": "Inhalt",
|
||||
"Email Address": "E-Mail-Adresse",
|
||||
"Method": "Methode",
|
||||
"Headers": "Kopfzeilen",
|
||||
"Query Parameters": "Abfrageparameter",
|
||||
"Body": "Körper",
|
||||
"Response is Binary ?": "Antwort ist binär?",
|
||||
"No Error on Failure": "Kein Fehler bei Fehler",
|
||||
"Timeout (in seconds)": "Timeout (in Sekunden)",
|
||||
"The subject of the ticket (optional - will use first comment text if not provided)": "Der Betreff des Tickets (optional - wird den Text des ersten Kommentars verwenden, wenn er nicht angegeben ist)",
|
||||
"The comment body (text). Use this for plain text comments.": "Der Kommentartext (Text). Verwenden Sie dies für Klartext-Kommentare.",
|
||||
"The comment body (HTML). Use this for HTML formatted comments. If provided, this takes precedence over Comment Body.": "Der Kommentar-Text (HTML). Verwenden Sie diese Option für HTML-formatierte Kommentare. Wenn vorhanden, hat dies Vorrang vor Kommentar-Body.",
|
||||
"Email address of the ticket requester. If not provided, the authenticated user will be the requester.": "E-Mail-Adresse der Ticket-Anfrage. Wenn nicht angegeben, wird der authentifizierte Benutzer der Anfrage.",
|
||||
"Name of the ticket requester (used when creating a new user).": "Name der Ticket-Anforderung (wird beim Erstellen eines neuen Benutzers verwendet).",
|
||||
"Email address of the agent to assign the ticket to.": "E-Mail-Adresse des Agenten, dem das Ticket zugewiesen werden soll.",
|
||||
"The priority of the ticket.": "Die Priorität des Tickets.",
|
||||
"The type of ticket.": "Die Art des Tickets.",
|
||||
"The status of the ticket.": "Der Status des Tickets.",
|
||||
"Array of tags to apply to the ticket.": "Anordnung von Tags, die auf das Ticket angewendet werden sollen.",
|
||||
"Select the organization to work with": "Wählen Sie die Organisation für die Arbeit aus",
|
||||
"Select the group to assign": "Gruppe zum Zuweisen auswählen",
|
||||
"An external ID for the ticket (useful for integrations).": "Eine externe ID für das Ticket (nützlich für Integrationen).",
|
||||
"Array of email addresses to add as collaborators.": "Array der E-Mail-Adressen, die als Mitarbeiter hinzugefügt werden sollen.",
|
||||
"Array of email addresses to add as followers.": "Anordnung der E-Mail-Adressen, die als Follower hinzugefügt werden sollen.",
|
||||
"The date and time when the ticket is due.": "Datum und Uhrzeit, wann das Ticket fällig ist.",
|
||||
"Custom ticket field values": "Benutzerdefinierte Ticket-Feldwerte",
|
||||
"Whether the comment is public (visible to the requester). Defaults to true.": "Gibt an, ob der Kommentar öffentlich ist (für die Anforderung sichtbar). Standard ist wahr.",
|
||||
"Select the brand to work with": "Wählen Sie die Marke zum Arbeiten aus",
|
||||
"The ID of the forum topic associated with the ticket.": "Die ID des mit dem Ticket verknüpften Forenthemas.",
|
||||
"Select the problem ticket this ticket is an incident of": "Wählen Sie das Problem-Ticket, von dem dieses Ticket ein Vorfall ist",
|
||||
"Select the ticket to work with": "Wähle das Ticket, mit dem gearbeitet werden soll",
|
||||
"Update the subject of the ticket": "Betreff des Tickets aktualisieren",
|
||||
"Add a comment to the ticket (plain text)": "Kommentar zum Ticket hinzufügen (einfacher Text)",
|
||||
"Add a comment to the ticket (HTML). If provided, this takes precedence over Comment Body.": "Kommentar zum Ticket hinzufügen (HTML). Wenn vorhanden, hat dies Vorrang vor Kommentar-Body.",
|
||||
"Email address of the agent to assign the ticket to": "E-Mail-Adresse des Agenten, dem das Ticket zugewiesen werden soll",
|
||||
"Update the priority of the ticket": "Aktualisiere die Priorität des Tickets",
|
||||
"Update the type of ticket": "Ticket-Typ aktualisieren",
|
||||
"Update the status of the ticket": "Status des Tickets aktualisieren",
|
||||
"Replace all tags with this array. Use \"Add Tag to Ticket\" action to add tags without replacing existing ones.": "Ersetzen Sie alle Tags mit diesem Array. Benutzen Sie die Aktion \"Tag zum Ticket hinzufügen\", um Tags hinzuzufügen, ohne vorhandene zu ersetzen.",
|
||||
"Update the external ID for the ticket": "Externe ID für das Ticket aktualisieren",
|
||||
"Update the date and time when the ticket is due": "Datum und Uhrzeit der Fälligkeit des Tickets aktualisieren",
|
||||
"Update custom ticket field values": "Aktualisiere benutzerdefinierte Ticket-Feldwerte",
|
||||
"Set a custom status ID for the ticket": "Legen Sie eine benutzerdefinierte Status-ID für das Ticket fest",
|
||||
"Update the forum topic associated with the ticket": "Das dem Ticket zugeordnete Forenthema aktualisieren",
|
||||
"Replace collaborators with this array of email addresses": "Mitarbeiter durch dieses Array von E-Mail-Adressen ersetzen",
|
||||
"Replace followers with this array of email addresses": "Follower mit diesem Array von E-Mail-Adressen ersetzen",
|
||||
"Update the requester of the ticket": "Aktualisiere den Anforderer des Tickets",
|
||||
"Prevent update collisions by checking timestamp": "Update-Kollisionen durch Überprüfung des Zeitstempels verhindern",
|
||||
"Ticket timestamp from updated_at field for collision prevention": "Ticket-Zeitstempel aus dem updated_at Feld zur Kollisionsvermeidung",
|
||||
"Tags to add to the ticket (adds to existing tags)": "Tags zum Ticket hinzufügen (Hinzufügen zu bestehenden Tags)",
|
||||
"Prevent tag loss from concurrent updates": "Tag-Verlust bei gleichzeitigen Updates verhindern",
|
||||
"The comment text content": "Der Inhalt des Kommentartextes",
|
||||
"HTML formatted comment (takes precedence over text)": "HTML formatierter Kommentar (hat Vorrang vor Text)",
|
||||
"Make comment visible to requester (default: true)": "Kommentar für den Anforderer sichtbar machen (Standard: wahr)",
|
||||
"Email of comment author (defaults to authenticated user)": "E-Mail des Kommentarautors (Standard für authentifizierten Benutzer)",
|
||||
"Upload tokens for file attachments": "Token für Dateianhänge hochladen",
|
||||
"Original ticket ID if this is from a follow-up": "Originale Ticket-ID, wenn dies von einem Follow-up stammt",
|
||||
"Unique name for the organization": "Eindeutiger Name für die Organisation",
|
||||
"Additional details about the organization": "Weitere Details über die Organisation",
|
||||
"Internal notes about the organization": "Interne Notizen über die Organisation",
|
||||
"External ID for integration purposes": "Externe ID für Integrationszwecke",
|
||||
"Domain names associated with the organization": "Domain-Namen, die der Organisation zugeordnet sind",
|
||||
"Tags to apply to the organization": "Tags für die Organisation",
|
||||
"Custom organization field values": "Feldwerte für benutzerdefinierte Organisation",
|
||||
"Allow users to see each other's tickets": "Benutzern erlauben, die Tickets des anderen zu sehen",
|
||||
"Allow users to see each other's comments": "Benutzern erlauben, gegenseitig Kommentare zu sehen",
|
||||
"New name for the organization (must be unique)": "Neuer Name für die Organisation (muss eindeutig sein)",
|
||||
"Domain names for the organization (replaces all existing)": "Domänennamen für die Organisation (ersetzt alle vorhandenen)",
|
||||
"Tags for the organization (replaces all existing)": "Tags für die Organisation (ersetzt alle existierenden)",
|
||||
"The name of the user": "Der Name des Benutzers",
|
||||
"The primary email address of the user": "Die primäre E-Mail-Adresse des Benutzers",
|
||||
"The role of the user. Defaults to \"end-user\" if not specified.": "Die Rolle des Benutzers. Standardmäßig ist \"End-Benutzer\", wenn nicht angegeben.",
|
||||
"Select the custom role for the agent": "Wählen Sie die benutzerdefinierte Rolle des Agenten",
|
||||
"Create and associate user with a new organization by name (alternative to Organization ID)": "Benutzer mit Namen erstellen und verknüpfen (Alternative zur Organisations-ID)",
|
||||
"The phone number of the user": "Die Telefonnummer des Benutzers",
|
||||
"An alias displayed to end users": "Ein Alias für Endbenutzer",
|
||||
"Additional details about the user": "Zusätzliche Details zum Benutzer",
|
||||
"Internal notes about the user": "Interne Notizen zum Benutzer",
|
||||
"A unique external ID for the user (useful for integrations)": "Eine eindeutige externe ID für den Benutzer (nützlich für Integrationen)",
|
||||
"The time zone of the user (e.g., \"America/New_York\")": "Die Zeitzone des Benutzers (z.B. \"America/New_York\")",
|
||||
"The locale of the user (e.g., \"en-US\")": "Das Gebietsschema des Benutzers (z. B. \"en-US\")",
|
||||
"Whether the user is verified": "Ob der Benutzer überprüft wurde",
|
||||
"Whether the user is active. Defaults to true.": "Gibt an, ob der Benutzer aktiv ist. Standard ist wahr.",
|
||||
"Whether the user is shared from a different Zendesk Support instance": "Ob der Benutzer von einer anderen Zendesk-Support-Instanz geteilt wird",
|
||||
"Whether the user is a shared agent from a different Zendesk Support instance": "Ob der Benutzer ein Shared Agent einer anderen Zendesk Support-Instanz ist",
|
||||
"Whether the user has forum moderation capabilities": "Ob der Benutzer Forum-Moderationsfähigkeiten hat",
|
||||
"Whether the user is suspended": "Ob der Benutzer gesperrt ist",
|
||||
"Whether the agent has restrictions on what tickets they can access": "Ob der Agenten Beschränkungen hat, auf welche Tickets er zugreifen kann",
|
||||
"Whether the user can only create private comments": "Ob der Benutzer nur private Kommentare erstellen kann",
|
||||
"Whether the user can access CSV reports": "Ob der Benutzer auf CSV-Berichte zugreifen kann",
|
||||
"Skip sending a verification email to the user": "Überspringe das Senden einer Bestätigungs-E-Mail an den Benutzer",
|
||||
"The ticket restriction for the user": "Die Ticket-Beschränkung für den Benutzer",
|
||||
"The user's signature for email responses": "Die Signatur des Benutzers für E-Mail-Antworten",
|
||||
"Select the brands that the agent can access (for agents only)": "Marken, auf die der Agent zugreifen kann (nur für Agenten)",
|
||||
"Array of tags to apply to the user": "Anordnung von Schlagwörtern, die für den Benutzer gelten sollen",
|
||||
"Custom user field values": "Benutzerdefinierte Feldwerte",
|
||||
"Array of identity objects with type and value. Example: [{\"type\": \"email\", \"value\": \"test@user.com\"}, {\"type\": \"twitter\", \"value\": \"username\"}]": "Array von Identitätsobjekten mit Typ und Wert. Beispiel: [{\"type\": \"email\", \"value\": \"test@user.com\"}, {\"type\": \"twitter\", \"value\": \"username\"}]",
|
||||
"Select the user to work with": "Wählen Sie den Benutzer, mit dem gearbeitet werden soll",
|
||||
"I understand that deleted users are not recoverable and this action cannot be undone.": "Ich verstehe, dass gelöschte Benutzer nicht wiederhergestellt werden können und dass diese Aktion nicht rückgängig gemacht werden kann.",
|
||||
"Choose how to search for organizations": "Wählen Sie die Suche nach Organisationen",
|
||||
"The name of the organization to search for": "Der Name der zu durchsuchenden Organisation",
|
||||
"Search organizations by domain name": "Organisationen nach Domänennamen suchen",
|
||||
"Search organizations by external ID": "Organisationen nach externer ID suchen",
|
||||
"Search organizations containing this tag": "Organisationen mit diesem Tag durchsuchen",
|
||||
"Search in organization details/notes": "Suche in Organisationsdetails/Notizen",
|
||||
"Custom search query using Zendesk search syntax (e.g., \"type:organization domain:example.com\")": "Benutzerdefinierte Suchanfrage mit Zendesk-Suchsyntax (z.B. \"type:organization domain:example.com\")",
|
||||
"How to sort the results": "Sortieren der Ergebnisse",
|
||||
"Sort order for results": "Reihenfolge der Ergebnisse",
|
||||
"Choose how to search for tickets": "Wählen Sie, wie Tickets gesucht werden sollen",
|
||||
"The ID of the ticket to find": "Die ID des zu findenden Tickets",
|
||||
"Search tickets by status": "Tickets nach Status suchen",
|
||||
"Search tickets by priority": "Tickets nach Priorität suchen",
|
||||
"Search tickets by type": "Tickets nach Typ suchen",
|
||||
"Search tickets containing this tag": "Tickets mit diesem Tag durchsuchen",
|
||||
"Search tickets by requester email address": "Tickets nach Anfrage-E-Mail-Adresse suchen",
|
||||
"Search tickets by assignee email address": "Tickets nach zuständiger E-Mail-Adresse suchen",
|
||||
"Search in ticket subject and content": "Suche in Ticket-Betreff und Inhalt",
|
||||
"Custom search query using Zendesk search syntax (e.g., \"type:ticket status:open priority:high\")": "Benutzerdefinierte Suchanfrage mit Zendesk Suchsyntax (z.B. \"type:ticket status:open priority:high\")",
|
||||
"Choose how to search for users": "Wählen Sie, wie nach Benutzern gesucht werden soll",
|
||||
"The email address of the user to search for": "Die E-Mail-Adresse des zu suchenden Benutzers",
|
||||
"The name of the user to search for": "Der Name des zu suchenden Benutzers",
|
||||
"Search users by role": "Suche Benutzer nach Rolle",
|
||||
"Search users by organization name": "Suche Benutzer nach Organisationsnamen",
|
||||
"Search users containing this tag": "Benutzer mit diesem Tag durchsuchen",
|
||||
"Search users by external ID": "Benutzer mit externer ID suchen",
|
||||
"Custom search query using Zendesk search syntax (e.g., \"type:user role:agent\")": "Benutzerdefinierte Suchanfrage mit Zendesk Suchsyntax (z.B. \"type:user role:agent\")",
|
||||
"Authorization headers are injected automatically from your connection.": "Autorisierungs-Header werden automatisch von Ihrer Verbindung injiziert.",
|
||||
"Enable for files like PDFs, images, etc..": "Aktivieren für Dateien wie PDFs, Bilder, etc..",
|
||||
"Low": "Niedrig",
|
||||
"Normal": "Normal",
|
||||
"High": "Hoch",
|
||||
"Urgent": "Dringend",
|
||||
"Problem": "Problem",
|
||||
"Incident": "Vorfall",
|
||||
"Question": "Frage",
|
||||
"Task": "Aufgabe",
|
||||
"New": "Neu",
|
||||
"Open": "Öffnen",
|
||||
"Pending": "Ausstehend",
|
||||
"Hold": "Halten",
|
||||
"Solved": "Gelöst",
|
||||
"Closed": "Geschlossen",
|
||||
"End User": "Endbenutzer",
|
||||
"Agent": "Agent",
|
||||
"Admin": "Admin",
|
||||
"Groups": "Gruppen",
|
||||
"Assigned": "Zugewiesen",
|
||||
"Requested": "Angefragt",
|
||||
"Search by Name": "Suche nach Name",
|
||||
"Search by Domain": "Suche nach Domain",
|
||||
"Search by External ID": "Suche nach externer ID",
|
||||
"Search by Tag": "Suche nach Tag",
|
||||
"Search by Details": "Suche nach Details",
|
||||
"Relevance (Default)": "Relevanz (Standard)",
|
||||
"Created Date": "Erstellungsdatum",
|
||||
"Updated Date": "Aktualisiertes Datum",
|
||||
"Descending (Default)": "Absteigend (Standard)",
|
||||
"Ascending": "Aufsteigend",
|
||||
"Search by Ticket ID": "Suche nach Ticket-ID",
|
||||
"Search by Status": "Nach Status suchen",
|
||||
"Search by Priority": "Nach Priorität suchen",
|
||||
"Search by Type": "Suche nach Typ",
|
||||
"Search by Requester Email": "Suche nach Anfrage-E-Mail",
|
||||
"Search by Assignee Email": "Suche nach zugewiesener E-Mail",
|
||||
"Search by Subject/Content": "Suche nach Betreff/Inhalt",
|
||||
"Ticket Type": "Ticket-Typ",
|
||||
"Search by Email": "Suche per E-Mail",
|
||||
"Search by Role": "Suche nach Rolle",
|
||||
"Search by Organization": "Suche nach Organisation",
|
||||
"GET": "ERHALTEN",
|
||||
"POST": "POST",
|
||||
"PATCH": "PATCH",
|
||||
"PUT": "PUT",
|
||||
"DELETE": "LÖSCHEN",
|
||||
"HEAD": "HEAD",
|
||||
"New ticket in view": "Neues Ticket im Blick",
|
||||
"New Ticket": "Neues Ticket",
|
||||
"Updated Ticket": "Ticket aktualisiert",
|
||||
"Tag Added to Ticket": "Tag zum Ticket hinzugefügt",
|
||||
"New Organization": "Neue Organisation",
|
||||
"New User": "Neuer Benutzer",
|
||||
"New Suspended Ticket": "Neues gesperrtes Ticket",
|
||||
"New Action on Ticket": "Neue Aktion auf Ticket",
|
||||
"Triggers when a new ticket is created in a view": "Wird ausgelöst, wenn ein neues Ticket in einer Ansicht erstellt wird",
|
||||
"Fires when a new ticket is created (optionally filtered by organization). Requires a Zendesk Trigger with Notify active webhook.": "Feuer, wenn ein neues Ticket erstellt wird (optional nach Organisation gefiltert). Benötigt einen Zendesk-Trigger mit Notify active webhook.",
|
||||
"Fires when an existing ticket is updated. Requires a Zendesk Trigger with Notify active webhook.": "Feuer, wenn ein bestehendes Ticket aktualisiert wird. Benötigt einen Zendesk Trigger mit Benachrichtigung des aktiven Webhooks.",
|
||||
"Fires when a ticket update includes the specified tag. Requires a Zendesk Trigger with Notify active webhook.": "Feuert ab, wenn ein Ticket-Update das angegebene Tag enthält. Benötigt einen Zendesk-Trigger mit Benachrichtigen aktiven Webhook.",
|
||||
"Fires when a new organization record is created. Uses Zendesk event webhook (no Trigger needed).": "Feuer, wenn ein neuer Organisations-Datensatz erstellt wird. Verwendet Zendesk Event Webhook (kein Trigger nötig).",
|
||||
"Fires when a new user is created. Uses Zendesk event webhook (no Trigger needed).": "Feuert ab, wenn ein neuer Benutzer erstellt wird. Benutzt Zendesk Event Webhook (kein Trigger nötig).",
|
||||
"Fires when a ticket is suspended. Requires a Zendesk Trigger with Notify active webhook. Suspended tickets auto-delete after 14 days.": "Feuert ab, wenn ein Ticket gesperrt ist. Benötigt einen Zendesk-Trigger mit Benachrichtigung des aktiven Webhooks. Suspendierte Tickets werden nach 14 Tagen automatisch gelöscht.",
|
||||
"Fires when the specified ticket updates. Requires a Zendesk Trigger with Notify active webhook.": "Feuert ab, wenn die angegebene Ticket-Aktualisierung aktualisiert wird. Benötigt einen Zendesk-Trigger mit Benachrichtigung des aktiven Webhooks.",
|
||||
"View": "Ansicht",
|
||||
"Organization (Optional)": "Organisation (optional)",
|
||||
"Specific Tag (Optional)": "Spezifisches Tag (Optional)",
|
||||
"User Role (Optional)": "Benutzerrolle (optional)",
|
||||
"Organization ID Filter (Optional)": "Organisations-ID-Filter (optional)",
|
||||
"The view to monitor for new tickets": "Die Ansicht zur Überwachung neuer Tickets",
|
||||
"Filter tickets by organization. Leave empty to trigger for all organizations.": "Tickets nach Organisation filtern. Leer lassen um für alle Organisationen auszulösen.",
|
||||
"Only trigger when this specific tag is added. Leave empty to trigger for any tag addition.": "Wird nur ausgelöst, wenn dieses Schlagwort hinzugefügt wird. Leer lassen um für jede Tag-Ergänzung auszulösen.",
|
||||
"Filter users by role. Leave empty to trigger for all user types.": "Benutzer nach Rolle filtern. Leer lassen, um für alle Benutzertypen auszulösen.",
|
||||
"Only trigger for tickets from this organization ID. Leave empty for all organizations.": "Nur Tickets von dieser Organisations-ID auslösen. Leer lassen für alle Organisationen.",
|
||||
"The specific ticket ID to monitor for actions/events.": "Die spezifische Ticket-ID zur Überwachung von Aktionen/Veranstaltungen.",
|
||||
"All Roles": "Alle Rollen"
|
||||
}
|
||||
@@ -0,0 +1,304 @@
|
||||
{
|
||||
"Customer service software and support ticket system": "Software de servicio al cliente y sistema de tickets de soporte",
|
||||
"Agent Email": "Email del agente",
|
||||
"Token": "Token",
|
||||
"Organization (e.g activepieceshelp)": "Organización (por ejemplo, activepieceshelp)",
|
||||
"The email address you use to login to Zendesk": "La dirección de correo electrónico que utiliza para iniciar sesión en Zendesk",
|
||||
"The API token you can generate in Zendesk": "El token de API que puedes generar en Zendesk",
|
||||
"The subdomain of your Zendesk instance": "El subdominio de su instancia de Zendesk",
|
||||
"\n**Organization**: The organization name can be found in the URL (e.g https://ORGANIZATION_NAME.zendesk.com).\n\n**Agent Email**: The email you use to log in to Zendesk.\n\n**API Token**: You can find this in the Zendesk Admin Panel under Settings > APIs > Zendesk API.\n": "\n**Organization**: The organization name can be found in the URL (e.g https://ORGANIZATION_NAME.zendesk.com).\n\n**Agent Email**: The email you use to log in to Zendesk.\n\n**API Token**: You can find this in the Zendesk Admin Panel under Settings > APIs > Zendesk API.\n",
|
||||
"Create Ticket": "Crear Ticket",
|
||||
"Update Ticket": "Actualizar Ticket",
|
||||
"Add Tag to Ticket": "Añadir etiqueta al Ticket",
|
||||
"Add Comment to Ticket": "Añadir comentario al Ticket",
|
||||
"Create Organization": "Crear organización",
|
||||
"Update Organization": "Actualizar organización",
|
||||
"Create User": "Crear usuario",
|
||||
"Delete User": "Eliminar usuario",
|
||||
"Find Organization(s)": "Buscar organización(es)",
|
||||
"Find Ticket(s)": "Buscar Ticket(s)",
|
||||
"Find User(s)": "Buscar usuario(s)",
|
||||
"Custom API Call": "Llamada API personalizada",
|
||||
"Create a new ticket in Zendesk.": "Crear un nuevo ticket en Zendesk.",
|
||||
"Modify ticket fields or status via API call.": "Modificar campos de ticket o estado mediante llamada API.",
|
||||
"Apply one or more tags to a ticket.": "Aplicar una o más etiquetas a un ticket.",
|
||||
"Append a public/private comment to a ticket.": "Añadir un comentario público/privado a un ticket.",
|
||||
"Create a new organization record.": "Crear un nuevo registro de organización.",
|
||||
"Update existing organization fields.": "Actualizar campos existentes de la organización.",
|
||||
"Add a new user to the Zendesk instance.": "Añadir un nuevo usuario a la instancia de Zendesk.",
|
||||
"Remove a user and associated records from the account.": "Eliminar un usuario y registros asociados de la cuenta.",
|
||||
"Search organizations by name, domain, external ID, or other criteria.": "Buscar organizaciones por nombre, dominio, ID externo u otros criterios.",
|
||||
"Search tickets by ID, field, or content.": "Buscar tickets por ID, campo o contenido.",
|
||||
"Search users by email, name, role, or other criteria.": "Buscar usuarios por correo electrónico, nombre, rol u otros criterios.",
|
||||
"Make a custom API call to a specific endpoint": "Hacer una llamada API personalizada a un extremo específico",
|
||||
"Subject": "Asunto",
|
||||
"Comment Body": "Comentar cuerpo",
|
||||
"Comment HTML Body": "Comentar cuerpo HTML",
|
||||
"Requester Email": "Email del solicitante",
|
||||
"Requester Name": "Nombre del solicitante",
|
||||
"Assignee Email": "Assignee Email",
|
||||
"Priority": "Prioridad",
|
||||
"Type": "Tipo",
|
||||
"Status": "Estado",
|
||||
"Tags": "Etiquetas",
|
||||
"Organization": "Organización",
|
||||
"Group": "Grupo",
|
||||
"External ID": "ID Externo",
|
||||
"Collaborator Emails": "Correos electrónicos de colaborador",
|
||||
"Follower Emails": "Correos de seguimiento",
|
||||
"Due Date": "Fecha de fin",
|
||||
"Custom Fields": "Campos personalizados",
|
||||
"Public Comment": "Comentario público",
|
||||
"Brand": "Marca",
|
||||
"Forum Topic ID": "ID del tema del foro",
|
||||
"Problem Ticket": "Ticket de problemas",
|
||||
"Ticket": "Ticket",
|
||||
"Custom Status ID": "ID de estado personalizado",
|
||||
"Safe Update": "Actualizar Seguro",
|
||||
"Updated Timestamp": "Timestamp actualizado",
|
||||
"Author Email": "Email del autor",
|
||||
"Attachment Tokens": "Fichas de adjunto",
|
||||
"Via Followup Source ID": "ID fuente de seguimiento",
|
||||
"Organization Name": "Nombre de la organización",
|
||||
"Details": "Detalles",
|
||||
"Notes": "Notas",
|
||||
"Domain Names": "Nombres de dominio",
|
||||
"Organization Fields": "Campos de la organización",
|
||||
"Shared Tickets": "Tickets compartidos",
|
||||
"Shared Comments": "Comentarios compartidos",
|
||||
"Name": "Nombre",
|
||||
"Email": "E-mail",
|
||||
"Role": "Rol",
|
||||
"Custom Role": "Rol personalizado",
|
||||
"Phone": "Teléfono",
|
||||
"Alias": "Alias",
|
||||
"Time Zone": "Zona horaria",
|
||||
"Locale": "Local",
|
||||
"Verified": "Verificado",
|
||||
"Active": "Activo",
|
||||
"Shared": "Compartido",
|
||||
"Shared Agent": "Agente compartido",
|
||||
"Moderator": "Moderador",
|
||||
"Suspended": "Suspendido",
|
||||
"Restricted Agent": "Agente restringido",
|
||||
"Only Private Comments": "Sólo comentarios privados",
|
||||
"Report CSV": "Reportar CSV",
|
||||
"Skip Verify Email": "Omitir Verificar Email",
|
||||
"Ticket Restriction": "Restricción de Ticket",
|
||||
"Signature": "Firma",
|
||||
"Agent Brand Access": "Acceso a la marca del agente",
|
||||
"User Fields": "Campos de usuario",
|
||||
"Identities": "Identidades",
|
||||
"User": "Usuario",
|
||||
"Confirm Deletion": "Confirmar eliminación",
|
||||
"Search Type": "Tipo de búsqueda",
|
||||
"Domain": "Dominio",
|
||||
"Tag": "Etiqueta",
|
||||
"Custom Query": "Consulta personalizada",
|
||||
"Sort By": "Ordenar por",
|
||||
"Sort Order": "Ordenar",
|
||||
"Ticket ID": "ID del Ticket",
|
||||
"Content": "Contenido",
|
||||
"Email Address": "Dirección de email",
|
||||
"Method": "Método",
|
||||
"Headers": "Encabezados",
|
||||
"Query Parameters": "Parámetros de consulta",
|
||||
"Body": "Cuerpo",
|
||||
"Response is Binary ?": "¿Respuesta es binaria?",
|
||||
"No Error on Failure": "No hay ningún error en fallo",
|
||||
"Timeout (in seconds)": "Tiempo de espera (en segundos)",
|
||||
"The subject of the ticket (optional - will use first comment text if not provided)": "El asunto del ticket (opcional - utilizará el primer texto del comentario si no se proporciona)",
|
||||
"The comment body (text). Use this for plain text comments.": "El cuerpo del comentario (texto). Utilice esto para comentarios de texto plano.",
|
||||
"The comment body (HTML). Use this for HTML formatted comments. If provided, this takes precedence over Comment Body.": "El cuerpo del comentario (HTML). Utilice esto para comentarios con formato HTML. Si se proporciona, esto tendrá prioridad sobre el cuerpo de comentarios.",
|
||||
"Email address of the ticket requester. If not provided, the authenticated user will be the requester.": "Dirección de correo electrónico del solicitante de ticket. Si no se proporciona, el usuario autenticado será el solicitante.",
|
||||
"Name of the ticket requester (used when creating a new user).": "Nombre del solicitante de tickets (usado al crear un nuevo usuario).",
|
||||
"Email address of the agent to assign the ticket to.": "Dirección de correo electrónico del agente al que asignar el ticket.",
|
||||
"The priority of the ticket.": "La prioridad del billete.",
|
||||
"The type of ticket.": "El tipo de ticket.",
|
||||
"The status of the ticket.": "El estado del ticket.",
|
||||
"Array of tags to apply to the ticket.": "Arreglo de etiquetas a aplicar al ticket.",
|
||||
"Select the organization to work with": "Seleccione la organización con la que trabajar",
|
||||
"Select the group to assign": "Seleccione el grupo a asignar",
|
||||
"An external ID for the ticket (useful for integrations).": "Un ID externo para el ticket (útil para integraciones).",
|
||||
"Array of email addresses to add as collaborators.": "Arreglo de direcciones de correo electrónico a añadir como colaboradores.",
|
||||
"Array of email addresses to add as followers.": "Arreglo de direcciones de correo electrónico a añadir como seguidores.",
|
||||
"The date and time when the ticket is due.": "La fecha y hora en que el billete está vencido.",
|
||||
"Custom ticket field values": "Valores personalizados de campos de ticket",
|
||||
"Whether the comment is public (visible to the requester). Defaults to true.": "Si el comentario es público (visible para el solicitante). Por defecto es verdadero.",
|
||||
"Select the brand to work with": "Selecciona la marca con la que trabajar",
|
||||
"The ID of the forum topic associated with the ticket.": "El ID del tema del foro asociado con el ticket.",
|
||||
"Select the problem ticket this ticket is an incident of": "Seleccione el problema del ticket de este ticket es un incidente de",
|
||||
"Select the ticket to work with": "Seleccione el ticket con el que trabajar",
|
||||
"Update the subject of the ticket": "Actualizar el asunto del ticket",
|
||||
"Add a comment to the ticket (plain text)": "Añadir un comentario al ticket (texto plano)",
|
||||
"Add a comment to the ticket (HTML). If provided, this takes precedence over Comment Body.": "Añadir un comentario al ticket (HTML). Si se proporciona, esto tiene prioridad sobre el cuerpo del comentario.",
|
||||
"Email address of the agent to assign the ticket to": "Dirección de correo electrónico del agente al que asignar el ticket",
|
||||
"Update the priority of the ticket": "Actualizar la prioridad del ticket",
|
||||
"Update the type of ticket": "Actualizar el tipo de ticket",
|
||||
"Update the status of the ticket": "Actualizar el estado del ticket",
|
||||
"Replace all tags with this array. Use \"Add Tag to Ticket\" action to add tags without replacing existing ones.": "Reemplazar todas las etiquetas con esta matriz. Utilice la acción \"Añadir etiqueta al Ticket\" para añadir etiquetas sin reemplazar las existentes.",
|
||||
"Update the external ID for the ticket": "Actualizar el ID externo para el ticket",
|
||||
"Update the date and time when the ticket is due": "Actualizar la fecha y hora cuando el ticket vence",
|
||||
"Update custom ticket field values": "Actualizar valores de campos de tickets personalizados",
|
||||
"Set a custom status ID for the ticket": "Establecer un ID de estado personalizado para el ticket",
|
||||
"Update the forum topic associated with the ticket": "Actualizar el tema del foro asociado con el ticket",
|
||||
"Replace collaborators with this array of email addresses": "Reemplazar los colaboradores con esta matriz de direcciones de correo electrónico",
|
||||
"Replace followers with this array of email addresses": "Reemplazar seguidores con esta matriz de direcciones de correo electrónico",
|
||||
"Update the requester of the ticket": "Actualizar el solicitante del ticket",
|
||||
"Prevent update collisions by checking timestamp": "Evitar colisiones de actualización comprobando marca de tiempo",
|
||||
"Ticket timestamp from updated_at field for collision prevention": "Marca de tiempo del ticket desde el campo actualizado_at para la prevención de colisiones",
|
||||
"Tags to add to the ticket (adds to existing tags)": "Etiquetas a añadir al ticket (se añade a las etiquetas existentes)",
|
||||
"Prevent tag loss from concurrent updates": "Evitar pérdida de etiquetas de actualizaciones simultáneas",
|
||||
"The comment text content": "El contenido del texto del comentario",
|
||||
"HTML formatted comment (takes precedence over text)": "Comentario con formato HTML (tiene precedencia sobre el texto)",
|
||||
"Make comment visible to requester (default: true)": "Hacer un comentario visible al solicitante (por defecto: verdadero)",
|
||||
"Email of comment author (defaults to authenticated user)": "Email del autor del comentario (por defecto al usuario autenticado)",
|
||||
"Upload tokens for file attachments": "Subir tokens para archivos adjuntos",
|
||||
"Original ticket ID if this is from a follow-up": "ID de ticket original si es de un seguimiento",
|
||||
"Unique name for the organization": "Nombre único para la organización",
|
||||
"Additional details about the organization": "Detalles adicionales sobre la organización",
|
||||
"Internal notes about the organization": "Notas internas sobre la organización",
|
||||
"External ID for integration purposes": "ID externo para propósitos de integración",
|
||||
"Domain names associated with the organization": "Nombres de dominio asociados con la organización",
|
||||
"Tags to apply to the organization": "Etiquetas a aplicar a la organización",
|
||||
"Custom organization field values": "Valores de campos personalizados de la organización",
|
||||
"Allow users to see each other's tickets": "Permitir a los usuarios ver los tickets de los demás",
|
||||
"Allow users to see each other's comments": "Permitir a los usuarios ver sus comentarios",
|
||||
"New name for the organization (must be unique)": "Nuevo nombre para la organización (debe ser único)",
|
||||
"Domain names for the organization (replaces all existing)": "Nombres de dominio para la organización (reemplaza todos los existentes)",
|
||||
"Tags for the organization (replaces all existing)": "Etiquetas para la organización (sustituye a todas las existentes)",
|
||||
"The name of the user": "El nombre del usuario",
|
||||
"The primary email address of the user": "La dirección de correo principal del usuario",
|
||||
"The role of the user. Defaults to \"end-user\" if not specified.": "El rol del usuario. Por defecto es \"usuario final\" si no se especifica.",
|
||||
"Select the custom role for the agent": "Seleccione el rol personalizado para el agente",
|
||||
"Create and associate user with a new organization by name (alternative to Organization ID)": "Crear y asociar usuario con una nueva organización por nombre (alternativa al ID de organización)",
|
||||
"The phone number of the user": "El número de teléfono del usuario",
|
||||
"An alias displayed to end users": "Un alias mostrado a los usuarios finales",
|
||||
"Additional details about the user": "Detalles adicionales sobre el usuario",
|
||||
"Internal notes about the user": "Notas internas sobre el usuario",
|
||||
"A unique external ID for the user (useful for integrations)": "Un único ID externo para el usuario (útil para integraciones)",
|
||||
"The time zone of the user (e.g., \"America/New_York\")": "La zona horaria del usuario (por ej., \"América/Nuevo\")",
|
||||
"The locale of the user (e.g., \"en-US\")": "La localización del usuario (por ej., \"es-US\")",
|
||||
"Whether the user is verified": "Si el usuario está verificado",
|
||||
"Whether the user is active. Defaults to true.": "Si el usuario está activo. Por defecto es verdadero.",
|
||||
"Whether the user is shared from a different Zendesk Support instance": "Si el usuario es compartido desde una instancia de Soporte Zendesk diferente",
|
||||
"Whether the user is a shared agent from a different Zendesk Support instance": "Si el usuario es un agente compartido de una instancia de Soporte Zendesk diferente",
|
||||
"Whether the user has forum moderation capabilities": "Si el usuario tiene capacidades de moderación del foro",
|
||||
"Whether the user is suspended": "Si el usuario está suspendido",
|
||||
"Whether the agent has restrictions on what tickets they can access": "Si el agente tiene restricciones sobre los tickets a los que pueden acceder",
|
||||
"Whether the user can only create private comments": "Si el usuario sólo puede crear comentarios privados",
|
||||
"Whether the user can access CSV reports": "Si el usuario puede acceder a los informes CSV",
|
||||
"Skip sending a verification email to the user": "Omitir el envío de un correo de verificación al usuario",
|
||||
"The ticket restriction for the user": "Restricción de ticket para el usuario",
|
||||
"The user's signature for email responses": "La firma del usuario para respuestas por correo electrónico",
|
||||
"Select the brands that the agent can access (for agents only)": "Seleccione las marcas a las que el agente puede acceder (para agentes solamente)",
|
||||
"Array of tags to apply to the user": "Arreglo de etiquetas a aplicar al usuario",
|
||||
"Custom user field values": "Valores personalizados de campos de usuario",
|
||||
"Array of identity objects with type and value. Example: [{\"type\": \"email\", \"value\": \"test@user.com\"}, {\"type\": \"twitter\", \"value\": \"username\"}]": "Array de objetos de identidad con tipo y valor. Ejemplo: [{\"type\": \"email\", \"value\": \"test@user.com\"}, {\"type\": \"twitter\", \"value\": \"username\"}]",
|
||||
"Select the user to work with": "Seleccione el usuario con el que trabajar",
|
||||
"I understand that deleted users are not recoverable and this action cannot be undone.": "Entiendo que los usuarios eliminados no son recuperables y esta acción no se puede deshacer.",
|
||||
"Choose how to search for organizations": "Elegir cómo buscar organizaciones",
|
||||
"The name of the organization to search for": "El nombre de la organización a buscar",
|
||||
"Search organizations by domain name": "Buscar organizaciones por nombre de dominio",
|
||||
"Search organizations by external ID": "Buscar organizaciones por ID externo",
|
||||
"Search organizations containing this tag": "Buscar organizaciones que contengan esta etiqueta",
|
||||
"Search in organization details/notes": "Buscar en detalles/notas de la organización",
|
||||
"Custom search query using Zendesk search syntax (e.g., \"type:organization domain:example.com\")": "Consulta de búsqueda personalizada usando la sintaxis de búsqueda de Zendesk (por ejemplo, \"tipo:dominio de organización:ejemplo.com\")",
|
||||
"How to sort the results": "Cómo ordenar los resultados",
|
||||
"Sort order for results": "Ordenar resultados",
|
||||
"Choose how to search for tickets": "Elegir cómo buscar tickets",
|
||||
"The ID of the ticket to find": "El ID del ticket a encontrar",
|
||||
"Search tickets by status": "Buscar tickets por estado",
|
||||
"Search tickets by priority": "Buscar tickets por prioridad",
|
||||
"Search tickets by type": "Buscar tickets por tipo",
|
||||
"Search tickets containing this tag": "Buscar tickets que contengan esta etiqueta",
|
||||
"Search tickets by requester email address": "Buscar tickets por dirección de email solicitante",
|
||||
"Search tickets by assignee email address": "Buscar tickets por dirección de correo de asignados",
|
||||
"Search in ticket subject and content": "Buscar en asunto y contenido del ticket",
|
||||
"Custom search query using Zendesk search syntax (e.g., \"type:ticket status:open priority:high\")": "Consulta de búsqueda personalizada usando la sintaxis de búsqueda Zendesk (por ejemplo, \"tipo:estado de ticket:prioridad abierta:alto\")",
|
||||
"Choose how to search for users": "Elegir cómo buscar usuarios",
|
||||
"The email address of the user to search for": "La dirección de correo electrónico del usuario a buscar",
|
||||
"The name of the user to search for": "El nombre del usuario a buscar",
|
||||
"Search users by role": "Buscar usuarios por rol",
|
||||
"Search users by organization name": "Buscar usuarios por nombre de organización",
|
||||
"Search users containing this tag": "Buscar usuarios que contengan esta etiqueta",
|
||||
"Search users by external ID": "Buscar usuarios por ID externa",
|
||||
"Custom search query using Zendesk search syntax (e.g., \"type:user role:agent\")": "Consulta de búsqueda personalizada usando la sintaxis de búsqueda Zendesk (por ejemplo, \"tipo:rol de usuario:agent\")",
|
||||
"Authorization headers are injected automatically from your connection.": "Las cabeceras de autorización se inyectan automáticamente desde tu conexión.",
|
||||
"Enable for files like PDFs, images, etc..": "Activar para archivos como PDFs, imágenes, etc.",
|
||||
"Low": "Baja",
|
||||
"Normal": "Normal",
|
||||
"High": "Alta",
|
||||
"Urgent": "Urgente",
|
||||
"Problem": "Problema",
|
||||
"Incident": "Incidente",
|
||||
"Question": "Pregunta",
|
||||
"Task": "Tarea",
|
||||
"New": "Nuevo",
|
||||
"Open": "Abrir",
|
||||
"Pending": "Pendiente",
|
||||
"Hold": "Mantener",
|
||||
"Solved": "Resuelto",
|
||||
"Closed": "Cerrado",
|
||||
"End User": "Usuario final",
|
||||
"Agent": "Agente",
|
||||
"Admin": "Admin",
|
||||
"Groups": "Grupos",
|
||||
"Assigned": "Asignado",
|
||||
"Requested": "Solicitado",
|
||||
"Search by Name": "Buscar por nombre",
|
||||
"Search by Domain": "Búsqueda por Dominio",
|
||||
"Search by External ID": "Búsqueda por ID Externo",
|
||||
"Search by Tag": "Buscar por Tag",
|
||||
"Search by Details": "Buscar por detalles",
|
||||
"Relevance (Default)": "Relevancia (por defecto)",
|
||||
"Created Date": "Fecha de creación",
|
||||
"Updated Date": "Fecha actualizada",
|
||||
"Descending (Default)": "Descendente (por defecto)",
|
||||
"Ascending": "Ascendiente",
|
||||
"Search by Ticket ID": "Buscar por ID de ticket",
|
||||
"Search by Status": "Buscar por estado",
|
||||
"Search by Priority": "Búsqueda por prioridad",
|
||||
"Search by Type": "Buscar por tipo",
|
||||
"Search by Requester Email": "Buscar por email del solicitante",
|
||||
"Search by Assignee Email": "Buscar por correo del asignatario",
|
||||
"Search by Subject/Content": "Buscar por tema/contenido",
|
||||
"Ticket Type": "Tipo de ticket",
|
||||
"Search by Email": "Buscar por Email",
|
||||
"Search by Role": "Buscar por rol",
|
||||
"Search by Organization": "Buscar por organización",
|
||||
"GET": "RECOGER",
|
||||
"POST": "POST",
|
||||
"PATCH": "PATCH",
|
||||
"PUT": "PUT",
|
||||
"DELETE": "BORRAR",
|
||||
"HEAD": "LIMPIO",
|
||||
"New ticket in view": "Nuevo ticket en vista",
|
||||
"New Ticket": "Nuevo Ticket",
|
||||
"Updated Ticket": "Ticket actualizado",
|
||||
"Tag Added to Ticket": "Etiqueta añadida al Ticket",
|
||||
"New Organization": "Nueva organización",
|
||||
"New User": "Nuevo usuario",
|
||||
"New Suspended Ticket": "Nuevo Ticket suspendido",
|
||||
"New Action on Ticket": "Nueva acción en Ticket",
|
||||
"Triggers when a new ticket is created in a view": "Dispara cuando se crea un nuevo ticket en una vista",
|
||||
"Fires when a new ticket is created (optionally filtered by organization). Requires a Zendesk Trigger with Notify active webhook.": "Dispara cuando se crea un nuevo ticket (opcionalmente filtrado por la organización). Requiere un Zendesk Trigger con Notify webhook activo.",
|
||||
"Fires when an existing ticket is updated. Requires a Zendesk Trigger with Notify active webhook.": "Dispara cuando se actualiza un ticket existente. Requiere un Zendesk Trigger con notificar un webhook activo.",
|
||||
"Fires when a ticket update includes the specified tag. Requires a Zendesk Trigger with Notify active webhook.": "Se activa cuando una actualización de un ticket incluye la etiqueta especificada. Requiere un Zendesk Trigger con Notify webhook activo.",
|
||||
"Fires when a new organization record is created. Uses Zendesk event webhook (no Trigger needed).": "Dispara cuando se crea un nuevo registro de organización. Usa el webhook del evento Zendesk (sin necesidad de Trigger).",
|
||||
"Fires when a new user is created. Uses Zendesk event webhook (no Trigger needed).": "Se activa cuando se crea un nuevo usuario. Usa el webhook del evento de Zendesk (sin necesidad de Trigger).",
|
||||
"Fires when a ticket is suspended. Requires a Zendesk Trigger with Notify active webhook. Suspended tickets auto-delete after 14 days.": "Dispara cuando un ticket es suspendido. Requiere un Zendesk Trigger con notificar al webhook activo. Suspendido los tickets auto-eliminados después de 14 días.",
|
||||
"Fires when the specified ticket updates. Requires a Zendesk Trigger with Notify active webhook.": "Dispara cuando se actualiza el ticket especificado. Requiere un Zendesk Trigger con notificar al webhook activo.",
|
||||
"View": "Ver",
|
||||
"Organization (Optional)": "Organización (opcional)",
|
||||
"Specific Tag (Optional)": "Etiqueta específica (opcional)",
|
||||
"User Role (Optional)": "Rol de usuario (opcional)",
|
||||
"Organization ID Filter (Optional)": "Filtro de ID de organización (opcional)",
|
||||
"The view to monitor for new tickets": "La vista para monitorear nuevos tickets",
|
||||
"Filter tickets by organization. Leave empty to trigger for all organizations.": "Filtrar tickets por organización. Dejar en blanco para activar todas las organizaciones.",
|
||||
"Only trigger when this specific tag is added. Leave empty to trigger for any tag addition.": "Sólo se activa cuando se añade esta etiqueta específica. Dejar en blanco para activar cualquier adición de etiquetas.",
|
||||
"Filter users by role. Leave empty to trigger for all user types.": "Filtrar usuarios por rol. Dejar vacío para activar todos los tipos de usuario.",
|
||||
"Only trigger for tickets from this organization ID. Leave empty for all organizations.": "Disparador solo para tickets de esta organización ID. Dejar en blanco para todas las organizaciones.",
|
||||
"The specific ticket ID to monitor for actions/events.": "El ID de ticket específico para monitorear las acciones/eventos.",
|
||||
"All Roles": "Todos los roles"
|
||||
}
|
||||
@@ -0,0 +1,304 @@
|
||||
{
|
||||
"Customer service software and support ticket system": "Logiciel de service client et système de tickets de support",
|
||||
"Agent Email": "Courriel de l'agent",
|
||||
"Token": "Jeton",
|
||||
"Organization (e.g activepieceshelp)": "Organisation (par exemple activepieceshelp)",
|
||||
"The email address you use to login to Zendesk": "L'adresse e-mail que vous utilisez pour vous connecter à Zendesk",
|
||||
"The API token you can generate in Zendesk": "Le jeton API que vous pouvez générer dans Zendesk",
|
||||
"The subdomain of your Zendesk instance": "Le sous-domaine de votre instance Zendesk",
|
||||
"\n**Organization**: The organization name can be found in the URL (e.g https://ORGANIZATION_NAME.zendesk.com).\n\n**Agent Email**: The email you use to log in to Zendesk.\n\n**API Token**: You can find this in the Zendesk Admin Panel under Settings > APIs > Zendesk API.\n": "\n**Organization**: The organization name can be found in the URL (e.g https://ORGANIZATION_NAME.zendesk.com).\n\n**Agent Email**: The email you use to log in to Zendesk.\n\n**API Token**: You can find this in the Zendesk Admin Panel under Settings > APIs > Zendesk API.\n",
|
||||
"Create Ticket": "Créer un ticket",
|
||||
"Update Ticket": "Mettre à jour le ticket",
|
||||
"Add Tag to Ticket": "Ajouter une étiquette à un ticket",
|
||||
"Add Comment to Ticket": "Ajouter un commentaire au ticket",
|
||||
"Create Organization": "Créer une organisation",
|
||||
"Update Organization": "Mettre à jour l'organisation",
|
||||
"Create User": "Créer un utilisateur",
|
||||
"Delete User": "Supprimer l'utilisateur",
|
||||
"Find Organization(s)": "Trouver des organisations",
|
||||
"Find Ticket(s)": "Trouver le(s) billet(s)",
|
||||
"Find User(s)": "Trouver un/des utilisateur(s)",
|
||||
"Custom API Call": "Appel d'API personnalisé",
|
||||
"Create a new ticket in Zendesk.": "Créer un nouveau ticket dans Zendesk.",
|
||||
"Modify ticket fields or status via API call.": "Modifier les champs de ticket ou le statut via un appel API.",
|
||||
"Apply one or more tags to a ticket.": "Appliquer une ou plusieurs balises à un ticket.",
|
||||
"Append a public/private comment to a ticket.": "Ajouter un commentaire public/privé à un ticket.",
|
||||
"Create a new organization record.": "Créer un nouvel enregistrement d'organisation.",
|
||||
"Update existing organization fields.": "Mettre à jour les champs d'organisation existants.",
|
||||
"Add a new user to the Zendesk instance.": "Ajouter un nouvel utilisateur à l'instance Zendesk.",
|
||||
"Remove a user and associated records from the account.": "Supprimer un utilisateur et les enregistrements associés du compte.",
|
||||
"Search organizations by name, domain, external ID, or other criteria.": "Rechercher des organisations par nom, domaine, ID externe ou autre critère.",
|
||||
"Search tickets by ID, field, or content.": "Rechercher des tickets par ID, champ ou contenu.",
|
||||
"Search users by email, name, role, or other criteria.": "Rechercher les utilisateurs par e-mail, nom, rôle ou autre critère.",
|
||||
"Make a custom API call to a specific endpoint": "Passer un appel API personnalisé à un endpoint spécifique",
|
||||
"Subject": "Sujet",
|
||||
"Comment Body": "Corps du commentaire",
|
||||
"Comment HTML Body": "Corps HTML du commentaire",
|
||||
"Requester Email": "E-mail du demandeur",
|
||||
"Requester Name": "Nom du demandeur",
|
||||
"Assignee Email": "Assignee Email",
|
||||
"Priority": "Priorité",
|
||||
"Type": "Type de texte",
|
||||
"Status": "Statut",
|
||||
"Tags": "Tags",
|
||||
"Organization": "Organisation",
|
||||
"Group": "Groupes",
|
||||
"External ID": "ID externe",
|
||||
"Collaborator Emails": "E-mails de Collaborator",
|
||||
"Follower Emails": "Emails des abonnés",
|
||||
"Due Date": "Date de fin",
|
||||
"Custom Fields": "Champs personnalisés",
|
||||
"Public Comment": "Commentaire public",
|
||||
"Brand": "Marque",
|
||||
"Forum Topic ID": "ID du sujet du forum",
|
||||
"Problem Ticket": "Ticket de Problème",
|
||||
"Ticket": "Billet",
|
||||
"Custom Status ID": "ID de statut personnalisé",
|
||||
"Safe Update": "Mise à jour sécurisée",
|
||||
"Updated Timestamp": "Horodatage actualisé",
|
||||
"Author Email": "E-mail de l'auteur",
|
||||
"Attachment Tokens": "Jetons de pièce jointe",
|
||||
"Via Followup Source ID": "Via ID de Source de Suivi",
|
||||
"Organization Name": "Nom de l'organisation",
|
||||
"Details": "Détails du produit",
|
||||
"Notes": "Notes",
|
||||
"Domain Names": "Noms de domaine",
|
||||
"Organization Fields": "Champs de l'organisation",
|
||||
"Shared Tickets": "Tickets partagés",
|
||||
"Shared Comments": "Commentaires partagés",
|
||||
"Name": "Nom",
|
||||
"Email": "Courriel",
|
||||
"Role": "Rôle",
|
||||
"Custom Role": "Rôle personnalisé",
|
||||
"Phone": "Téléphone",
|
||||
"Alias": "Alias",
|
||||
"Time Zone": "Fuseau horaire",
|
||||
"Locale": "Locale",
|
||||
"Verified": "Vérifié",
|
||||
"Active": "Actif",
|
||||
"Shared": "Partagé",
|
||||
"Shared Agent": "Agent partagé",
|
||||
"Moderator": "Modérateur",
|
||||
"Suspended": "Suspendu",
|
||||
"Restricted Agent": "Agent restreint",
|
||||
"Only Private Comments": "Seulement les commentaires privés",
|
||||
"Report CSV": "Signaler le CSV",
|
||||
"Skip Verify Email": "Ignorer l'e-mail de vérification",
|
||||
"Ticket Restriction": "Restriction du ticket",
|
||||
"Signature": "Signature",
|
||||
"Agent Brand Access": "Accès à la marque de l'agent",
|
||||
"User Fields": "Champs de l'utilisateur",
|
||||
"Identities": "Identités",
|
||||
"User": "Utilisateur",
|
||||
"Confirm Deletion": "Confirmer la suppression",
|
||||
"Search Type": "Type de recherche",
|
||||
"Domain": "Domaine",
|
||||
"Tag": "Étiquette",
|
||||
"Custom Query": "Requête personnalisée",
|
||||
"Sort By": "Trier par",
|
||||
"Sort Order": "Ordre de tri",
|
||||
"Ticket ID": "ID du ticket",
|
||||
"Content": "Contenus",
|
||||
"Email Address": "Adresse e-mail",
|
||||
"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)",
|
||||
"The subject of the ticket (optional - will use first comment text if not provided)": "Le sujet du ticket (facultatif - utilisera le texte du premier commentaire si non fourni)",
|
||||
"The comment body (text). Use this for plain text comments.": "Le corps du commentaire (texte). Utilisez ceci pour les commentaires en texte brut.",
|
||||
"The comment body (HTML). Use this for HTML formatted comments. If provided, this takes precedence over Comment Body.": "Le corps du commentaire (HTML). Utilisez ceci pour les commentaires au format HTML. Si fourni, cela prend la priorité sur le corps du commentaire.",
|
||||
"Email address of the ticket requester. If not provided, the authenticated user will be the requester.": "Adresse e-mail du demandeur de ticket. S'il n'est pas fourni, l'utilisateur authentifié sera le demandeur.",
|
||||
"Name of the ticket requester (used when creating a new user).": "Nom du demandeur de ticket (utilisé lors de la création d'un nouvel utilisateur).",
|
||||
"Email address of the agent to assign the ticket to.": "Adresse e-mail de l'agent à qui assigner le ticket.",
|
||||
"The priority of the ticket.": "La priorité du ticket.",
|
||||
"The type of ticket.": "Le type de ticket.",
|
||||
"The status of the ticket.": "Le statut du ticket.",
|
||||
"Array of tags to apply to the ticket.": "Tableau de balises à appliquer au ticket.",
|
||||
"Select the organization to work with": "Sélectionnez l'organisation avec laquelle travailler",
|
||||
"Select the group to assign": "Sélectionnez le groupe à assigner",
|
||||
"An external ID for the ticket (useful for integrations).": "Un ID externe pour le ticket (utile pour les intégrations).",
|
||||
"Array of email addresses to add as collaborators.": "Tableau d'adresses e-mail à ajouter en tant que collaborateurs.",
|
||||
"Array of email addresses to add as followers.": "Tableau d'adresses e-mail à ajouter en tant que suiveurs.",
|
||||
"The date and time when the ticket is due.": "La date et l'heure à laquelle le ticket est dû.",
|
||||
"Custom ticket field values": "Valeurs du champ de ticket personnalisé",
|
||||
"Whether the comment is public (visible to the requester). Defaults to true.": "Si le commentaire est public (visible par le demandeur). La valeur par défaut est vraie.",
|
||||
"Select the brand to work with": "Sélectionnez la marque avec laquelle travailler",
|
||||
"The ID of the forum topic associated with the ticket.": "L'ID du sujet du forum associé au ticket.",
|
||||
"Select the problem ticket this ticket is an incident of": "Sélectionnez le ticket de problème dont ce ticket est un incident",
|
||||
"Select the ticket to work with": "Sélectionnez le ticket avec lequel travailler",
|
||||
"Update the subject of the ticket": "Mettre à jour le sujet du ticket",
|
||||
"Add a comment to the ticket (plain text)": "Ajouter un commentaire au ticket (texte brut)",
|
||||
"Add a comment to the ticket (HTML). If provided, this takes precedence over Comment Body.": "Ajouter un commentaire au ticket (HTML). Si fourni, cela prend la priorité sur le corps du commentaire.",
|
||||
"Email address of the agent to assign the ticket to": "Adresse e-mail de l'agent à laquelle assigner le ticket",
|
||||
"Update the priority of the ticket": "Mettre à jour la priorité du ticket",
|
||||
"Update the type of ticket": "Mettre à jour le type de ticket",
|
||||
"Update the status of the ticket": "Mettre à jour le statut du ticket",
|
||||
"Replace all tags with this array. Use \"Add Tag to Ticket\" action to add tags without replacing existing ones.": "Remplacer toutes les balises par ce tableau. Utilisez l'action \"Ajouter des balises à un ticket\" pour ajouter des balises sans remplacer celles existantes.",
|
||||
"Update the external ID for the ticket": "Mettre à jour l'ID externe du ticket",
|
||||
"Update the date and time when the ticket is due": "Mettre à jour la date et l'heure d'échéance du ticket",
|
||||
"Update custom ticket field values": "Mettre à jour les valeurs du champ de ticket personnalisé",
|
||||
"Set a custom status ID for the ticket": "Définir un ID de statut personnalisé pour le ticket",
|
||||
"Update the forum topic associated with the ticket": "Mettre à jour le sujet du forum associé au ticket",
|
||||
"Replace collaborators with this array of email addresses": "Remplacer les collaborateurs par ce tableau d'adresses e-mail",
|
||||
"Replace followers with this array of email addresses": "Remplacer les abonnés par ce tableau d'adresses e-mail",
|
||||
"Update the requester of the ticket": "Mettre à jour le demandeur du ticket",
|
||||
"Prevent update collisions by checking timestamp": "Empêcher les collisions de mise à jour en vérifiant l'horodatage",
|
||||
"Ticket timestamp from updated_at field for collision prevention": "Horodatage du ticket du champ updated_at pour la prévention des collisions",
|
||||
"Tags to add to the ticket (adds to existing tags)": "Tags à ajouter au ticket (ajoutés aux tags existants)",
|
||||
"Prevent tag loss from concurrent updates": "Empêcher la perte des tags de mises à jour simultanées",
|
||||
"The comment text content": "Le contenu du texte du commentaire",
|
||||
"HTML formatted comment (takes precedence over text)": "Commentaire formaté en HTML (prend la priorité sur le texte)",
|
||||
"Make comment visible to requester (default: true)": "Rendre le commentaire visible par le demandeur (par défaut: true)",
|
||||
"Email of comment author (defaults to authenticated user)": "Courriel de l'auteur du commentaire (par défaut pour un utilisateur authentifié)",
|
||||
"Upload tokens for file attachments": "Télécharger des jetons pour les pièces jointes",
|
||||
"Original ticket ID if this is from a follow-up": "ID du ticket d'origine s'il provient d'un suivi",
|
||||
"Unique name for the organization": "Nom unique pour l'organisation",
|
||||
"Additional details about the organization": "Plus de détails sur l'organisation",
|
||||
"Internal notes about the organization": "Notes internes à propos de l'organisation",
|
||||
"External ID for integration purposes": "ID externe à des fins d'intégration",
|
||||
"Domain names associated with the organization": "Noms de domaine associés à l'organisation",
|
||||
"Tags to apply to the organization": "Tags à appliquer à l'organisation",
|
||||
"Custom organization field values": "Valeurs du champ de l'organisation personnalisée",
|
||||
"Allow users to see each other's tickets": "Permettre aux utilisateurs de voir les tickets de l'autre",
|
||||
"Allow users to see each other's comments": "Autoriser les utilisateurs à voir leurs commentaires",
|
||||
"New name for the organization (must be unique)": "Nouveau nom pour l'organisation (doit être unique)",
|
||||
"Domain names for the organization (replaces all existing)": "Noms de domaine pour l'organisation (remplace tous les existants)",
|
||||
"Tags for the organization (replaces all existing)": "Tags pour l'organisation (remplace tous les tags existants)",
|
||||
"The name of the user": "Le nom de l'utilisateur",
|
||||
"The primary email address of the user": "L'adresse e-mail principale de l'utilisateur",
|
||||
"The role of the user. Defaults to \"end-user\" if not specified.": "Le rôle de l'utilisateur. Par défaut, \"utilisateur final\" si non spécifié.",
|
||||
"Select the custom role for the agent": "Sélectionnez le rôle personnalisé pour l'agent",
|
||||
"Create and associate user with a new organization by name (alternative to Organization ID)": "Créer et associer un utilisateur avec une nouvelle organisation par nom (alternative à l'ID de l'Organisation)",
|
||||
"The phone number of the user": "Le numéro de téléphone de l'utilisateur",
|
||||
"An alias displayed to end users": "Un alias affiché aux utilisateurs finaux",
|
||||
"Additional details about the user": "Détails supplémentaires sur l'utilisateur",
|
||||
"Internal notes about the user": "Notes internes à propos de l'utilisateur",
|
||||
"A unique external ID for the user (useful for integrations)": "Un ID externe unique pour l'utilisateur (utile pour les intégrations)",
|
||||
"The time zone of the user (e.g., \"America/New_York\")": "Le fuseau horaire de l'utilisateur (par exemple, \"Amérique/New_York\")",
|
||||
"The locale of the user (e.g., \"en-US\")": "La locale de l'utilisateur (par exemple, \"en-US\")",
|
||||
"Whether the user is verified": "Si l'utilisateur est vérifié",
|
||||
"Whether the user is active. Defaults to true.": "Si l'utilisateur est actif. La valeur par défaut est true.",
|
||||
"Whether the user is shared from a different Zendesk Support instance": "Si l'utilisateur est partagé depuis une instance de support Zendesk différente",
|
||||
"Whether the user is a shared agent from a different Zendesk Support instance": "Si l'utilisateur est un agent partagé d'une instance de support Zendesk différente",
|
||||
"Whether the user has forum moderation capabilities": "Si l'utilisateur a des capacités de modération de forum",
|
||||
"Whether the user is suspended": "Si l'utilisateur est suspendu",
|
||||
"Whether the agent has restrictions on what tickets they can access": "Si l'agent a des restrictions sur quels tickets il peut accéder",
|
||||
"Whether the user can only create private comments": "Si l'utilisateur peut seulement créer des commentaires privés",
|
||||
"Whether the user can access CSV reports": "Si l'utilisateur peut accéder aux rapports CSV",
|
||||
"Skip sending a verification email to the user": "Ignorer l'envoi d'un e-mail de vérification à l'utilisateur",
|
||||
"The ticket restriction for the user": "Restriction de ticket pour l'utilisateur",
|
||||
"The user's signature for email responses": "La signature de l'utilisateur pour les réponses e-mail",
|
||||
"Select the brands that the agent can access (for agents only)": "Sélectionnez les marques auxquelles l'agent peut avoir accès (pour les agents seulement)",
|
||||
"Array of tags to apply to the user": "Tableau de balises à appliquer à l'utilisateur",
|
||||
"Custom user field values": "Valeurs du champ utilisateur personnalisées",
|
||||
"Array of identity objects with type and value. Example: [{\"type\": \"email\", \"value\": \"test@user.com\"}, {\"type\": \"twitter\", \"value\": \"username\"}]": "Tableau des objets d'identité avec type et valeur. Exemple: [{\"type\": \"email\", \"value\": \"test@user.com\"}, {\"type\": \"twitter\", \"value\": \"username\"}]",
|
||||
"Select the user to work with": "Sélectionnez l'utilisateur avec qui travailler",
|
||||
"I understand that deleted users are not recoverable and this action cannot be undone.": "Je comprends que les utilisateurs supprimés ne sont pas récupérables et que cette action ne peut pas être annulée.",
|
||||
"Choose how to search for organizations": "Choisir comment rechercher des organisations",
|
||||
"The name of the organization to search for": "Le nom de l'organisation à rechercher",
|
||||
"Search organizations by domain name": "Rechercher des organisations par nom de domaine",
|
||||
"Search organizations by external ID": "Rechercher des organisations par ID externe",
|
||||
"Search organizations containing this tag": "Rechercher des organisations contenant ce tag",
|
||||
"Search in organization details/notes": "Rechercher dans les détails/notes de l'organisation",
|
||||
"Custom search query using Zendesk search syntax (e.g., \"type:organization domain:example.com\")": "Requête de recherche personnalisée en utilisant la syntaxe de recherche Zendesk (par exemple, \"type:organisation domain:example.com\")",
|
||||
"How to sort the results": "Comment trier les résultats",
|
||||
"Sort order for results": "Ordre de tri des résultats",
|
||||
"Choose how to search for tickets": "Choisir comment rechercher des tickets",
|
||||
"The ID of the ticket to find": "L'ID du ticket à trouver",
|
||||
"Search tickets by status": "Rechercher des tickets par statut",
|
||||
"Search tickets by priority": "Rechercher des tickets par priorité",
|
||||
"Search tickets by type": "Rechercher des tickets par type",
|
||||
"Search tickets containing this tag": "Rechercher des tickets contenant ce tag",
|
||||
"Search tickets by requester email address": "Rechercher des tickets par adresse e-mail du demandeur",
|
||||
"Search tickets by assignee email address": "Rechercher des tickets par adresse e-mail du cessionnaire",
|
||||
"Search in ticket subject and content": "Rechercher dans le sujet et le contenu du ticket",
|
||||
"Custom search query using Zendesk search syntax (e.g., \"type:ticket status:open priority:high\")": "Requête de recherche personnalisée en utilisant la syntaxe de recherche Zendesk (par exemple, \"type:ticket status:open priority:high\")",
|
||||
"Choose how to search for users": "Choisir comment rechercher des utilisateurs",
|
||||
"The email address of the user to search for": "L'adresse e-mail de l'utilisateur à rechercher",
|
||||
"The name of the user to search for": "Le nom de l'utilisateur à rechercher",
|
||||
"Search users by role": "Rechercher des utilisateurs par rôle",
|
||||
"Search users by organization name": "Rechercher des utilisateurs par nom d'organisation",
|
||||
"Search users containing this tag": "Rechercher des utilisateurs contenant ce tag",
|
||||
"Search users by external ID": "Rechercher des utilisateurs par ID externe",
|
||||
"Custom search query using Zendesk search syntax (e.g., \"type:user role:agent\")": "Requête de recherche personnalisée en utilisant la syntaxe de recherche Zendesk (par exemple, \"type:user role:agent\")",
|
||||
"Authorization headers are injected automatically from your connection.": "Les en-têtes d'autorisation sont injectés automatiquement à partir de votre connexion.",
|
||||
"Enable for files like PDFs, images, etc..": "Activer pour les fichiers comme les PDFs, les images, etc.",
|
||||
"Low": "Bas",
|
||||
"Normal": "Normale",
|
||||
"High": "Élevé",
|
||||
"Urgent": "Urgent",
|
||||
"Problem": "Problème",
|
||||
"Incident": "Incident",
|
||||
"Question": "Question",
|
||||
"Task": "Tâche",
|
||||
"New": "Nouveau",
|
||||
"Open": "Ouvert",
|
||||
"Pending": "En attente",
|
||||
"Hold": "Suspendre",
|
||||
"Solved": "Résolu",
|
||||
"Closed": "Fermé",
|
||||
"End User": "Utilisateur final",
|
||||
"Agent": "Agent",
|
||||
"Admin": "Administrateur",
|
||||
"Groups": "Groupes",
|
||||
"Assigned": "Assigné",
|
||||
"Requested": "Demandé",
|
||||
"Search by Name": "Rechercher par nom",
|
||||
"Search by Domain": "Recherche par domaine",
|
||||
"Search by External ID": "Recherche par ID externe",
|
||||
"Search by Tag": "Rechercher par Tag",
|
||||
"Search by Details": "Rechercher par détails",
|
||||
"Relevance (Default)": "Pertinence (par défaut)",
|
||||
"Created Date": "Date de création",
|
||||
"Updated Date": "Date de mise à jour",
|
||||
"Descending (Default)": "Décroissant (par défaut)",
|
||||
"Ascending": "Ascendant",
|
||||
"Search by Ticket ID": "Rechercher par ID de ticket",
|
||||
"Search by Status": "Rechercher par statut",
|
||||
"Search by Priority": "Recherche par priorité",
|
||||
"Search by Type": "Rechercher par type",
|
||||
"Search by Requester Email": "Recherche par email du demandeur",
|
||||
"Search by Assignee Email": "Rechercher par email du cessionnaire",
|
||||
"Search by Subject/Content": "Recherche par sujet/contenu",
|
||||
"Ticket Type": "Type de ticket",
|
||||
"Search by Email": "Rechercher par e-mail",
|
||||
"Search by Role": "Rechercher par Rôle",
|
||||
"Search by Organization": "Recherche par organisation",
|
||||
"GET": "GET",
|
||||
"POST": "POST",
|
||||
"PATCH": "PATCH",
|
||||
"PUT": "PUT",
|
||||
"DELETE": "DELETE",
|
||||
"HEAD": "HEAD",
|
||||
"New ticket in view": "Nouveau ticket en vue",
|
||||
"New Ticket": "Nouveau ticket",
|
||||
"Updated Ticket": "Ticket mis à jour",
|
||||
"Tag Added to Ticket": "Tag ajouté au ticket",
|
||||
"New Organization": "Nouvelle organisation",
|
||||
"New User": "Nouvel utilisateur",
|
||||
"New Suspended Ticket": "Nouveau ticket suspendu",
|
||||
"New Action on Ticket": "Nouvelle action sur le ticket",
|
||||
"Triggers when a new ticket is created in a view": "Déclenche lorsqu'un nouveau ticket est créé dans une vue",
|
||||
"Fires when a new ticket is created (optionally filtered by organization). Requires a Zendesk Trigger with Notify active webhook.": "Déclenche lorsqu'un nouveau ticket est créé (éventuellement filtré par l'organisation). Nécessite un déclencheur Zendesk avec le webhook actif de notification.",
|
||||
"Fires when an existing ticket is updated. Requires a Zendesk Trigger with Notify active webhook.": "Tire quand un ticket existant est mis à jour. Nécessite un déclencheur Zendesk avec le webhook actif Notifier.",
|
||||
"Fires when a ticket update includes the specified tag. Requires a Zendesk Trigger with Notify active webhook.": "Se déclenche lorsqu'une mise à jour de ticket inclut le tag spécifié. Nécessite un déclencheur Zendesk avec le webhook actif Notifier.",
|
||||
"Fires when a new organization record is created. Uses Zendesk event webhook (no Trigger needed).": "Se déclenche lorsqu'une nouvelle organisation est créée. Utilise le webhook d'événements Zendesk (aucun déclencheur n'est nécessaire).",
|
||||
"Fires when a new user is created. Uses Zendesk event webhook (no Trigger needed).": "Se déclenche lorsqu'un nouvel utilisateur est créé. Utilise le webhook d'événements Zendesk (aucun déclencheur n'est nécessaire).",
|
||||
"Fires when a ticket is suspended. Requires a Zendesk Trigger with Notify active webhook. Suspended tickets auto-delete after 14 days.": "Tire lorsqu'un ticket est suspendu. Nécessite un déclencheur Zendesk avec le webhook actif. Les tickets suspendus sont automatiquement supprimés après 14 jours.",
|
||||
"Fires when the specified ticket updates. Requires a Zendesk Trigger with Notify active webhook.": "Se déclenche lorsque le ticket spécifié se met à jour. Nécessite un déclencheur Zendesk avec le webhook actif Notifié.",
|
||||
"View": "Afficher",
|
||||
"Organization (Optional)": "Organisation (facultatif)",
|
||||
"Specific Tag (Optional)": "Étiquette spécifique (facultatif)",
|
||||
"User Role (Optional)": "Rôle utilisateur (facultatif)",
|
||||
"Organization ID Filter (Optional)": "Filtre d'ID d'organisation (facultatif)",
|
||||
"The view to monitor for new tickets": "La vue à surveiller pour les nouveaux tickets",
|
||||
"Filter tickets by organization. Leave empty to trigger for all organizations.": "Filtrer les tickets par organisation. Laisser vide pour déclencher pour toutes les organisations.",
|
||||
"Only trigger when this specific tag is added. Leave empty to trigger for any tag addition.": "Ne se déclenche que lorsque cette balise spécifique est ajoutée. Laissez vide pour déclencher tout ajout de balise.",
|
||||
"Filter users by role. Leave empty to trigger for all user types.": "Filtrer les utilisateurs par rôle. Laisser vide pour déclencher tous les types d'utilisateurs.",
|
||||
"Only trigger for tickets from this organization ID. Leave empty for all organizations.": "Déclenche uniquement les tickets de cet ID d'organisation. Laisser vide pour toutes les organisations.",
|
||||
"The specific ticket ID to monitor for actions/events.": "L'ID de ticket spécifique à surveiller pour les actions/événements.",
|
||||
"All Roles": "Tous les rôles"
|
||||
}
|
||||
@@ -0,0 +1,304 @@
|
||||
{
|
||||
"Customer service software and support ticket system": "カスタマーサービスソフトウェアとサポートチケットシステム",
|
||||
"Agent Email": "エージェントのメールアドレス",
|
||||
"Token": "トークン",
|
||||
"Organization (e.g activepieceshelp)": "組織 (e.g activepieceshelp)",
|
||||
"The email address you use to login to Zendesk": "Zendeskにログインするために使用するメールアドレス",
|
||||
"The API token you can generate in Zendesk": "Zendeskで生成できるAPIトークン",
|
||||
"The subdomain of your Zendesk instance": "Zendeskインスタンスのサブドメイン",
|
||||
"\n**Organization**: The organization name can be found in the URL (e.g https://ORGANIZATION_NAME.zendesk.com).\n\n**Agent Email**: The email you use to log in to Zendesk.\n\n**API Token**: You can find this in the Zendesk Admin Panel under Settings > APIs > Zendesk API.\n": "\n**Organization**: The organization name can be found in the URL (e.g https://ORGANIZATION_NAME.zendesk.com).\n\n**Agent Email**: The email you use to log in to Zendesk.\n\n**API Token**: You can find this in the Zendesk Admin Panel under Settings > APIs > Zendesk API.\n",
|
||||
"Create Ticket": "チケットを作成",
|
||||
"Update Ticket": "チケットを更新",
|
||||
"Add Tag to Ticket": "チケットにタグを追加",
|
||||
"Add Comment to Ticket": "コメントをチケットに追加",
|
||||
"Create Organization": "組織を作成",
|
||||
"Update Organization": "組織を更新",
|
||||
"Create User": "ユーザーを作成",
|
||||
"Delete User": "ユーザーを削除",
|
||||
"Find Organization(s)": "組織を検索",
|
||||
"Find Ticket(s)": "チケットを検索",
|
||||
"Find User(s)": "ユーザを検索",
|
||||
"Custom API Call": "カスタムAPI通話",
|
||||
"Create a new ticket in Zendesk.": "Zendeskで新しいチケットを作成します。",
|
||||
"Modify ticket fields or status via API call.": "API 呼び出しを介してチケットのフィールドまたはステータスを変更します。",
|
||||
"Apply one or more tags to a ticket.": "チケットにタグを適用します。",
|
||||
"Append a public/private comment to a ticket.": "チケットに公開/非公開コメントを追加します。",
|
||||
"Create a new organization record.": "新しい組織レコードを作成します。",
|
||||
"Update existing organization fields.": "既存の組織フィールドを更新します。",
|
||||
"Add a new user to the Zendesk instance.": "Zendeskインスタンスに新しいユーザーを追加します。",
|
||||
"Remove a user and associated records from the account.": "アカウントからユーザーと関連レコードを削除します。",
|
||||
"Search organizations by name, domain, external ID, or other criteria.": "名前、ドメイン、外部 ID またはその他の条件で組織を検索します。",
|
||||
"Search tickets by ID, field, or content.": "ID、フィールド、またはコンテンツでチケットを検索します。",
|
||||
"Search users by email, name, role, or other criteria.": "メール、名前、ロール、またはその他の条件でユーザーを検索します。",
|
||||
"Make a custom API call to a specific endpoint": "特定のエンドポイントへのカスタム API コールを実行します。",
|
||||
"Subject": "件名",
|
||||
"Comment Body": "コメント本文",
|
||||
"Comment HTML Body": "コメントHTML本文",
|
||||
"Requester Email": "依頼者のメールアドレス",
|
||||
"Requester Name": "要求者名",
|
||||
"Assignee Email": "Assignee Email",
|
||||
"Priority": "優先度",
|
||||
"Type": "タイプ",
|
||||
"Status": "ステータス",
|
||||
"Tags": "タグ",
|
||||
"Organization": "組織",
|
||||
"Group": "グループ",
|
||||
"External ID": "外部 ID",
|
||||
"Collaborator Emails": "コラボレーターのメール",
|
||||
"Follower Emails": "フォロワーメール",
|
||||
"Due Date": "締切日",
|
||||
"Custom Fields": "カスタムフィールド",
|
||||
"Public Comment": "公開コメント",
|
||||
"Brand": "ブランド",
|
||||
"Forum Topic ID": "フォーラムトピックID",
|
||||
"Problem Ticket": "問題のチケット",
|
||||
"Ticket": "チケット",
|
||||
"Custom Status ID": "カスタムステータスID",
|
||||
"Safe Update": "安全な更新",
|
||||
"Updated Timestamp": "更新されたタイムスタンプ",
|
||||
"Author Email": "投稿者のメールアドレス",
|
||||
"Attachment Tokens": "アタッチメントトークン",
|
||||
"Via Followup Source ID": "フォローアップソースIDによる検索",
|
||||
"Organization Name": "組織名",
|
||||
"Details": "詳細",
|
||||
"Notes": "メモ",
|
||||
"Domain Names": "ドメイン名",
|
||||
"Organization Fields": "取引先フィールド",
|
||||
"Shared Tickets": "共有チケット",
|
||||
"Shared Comments": "共有されたコメント",
|
||||
"Name": "Name",
|
||||
"Email": "Eメールアドレス",
|
||||
"Role": "ロール",
|
||||
"Custom Role": "カスタムロール",
|
||||
"Phone": "電話番号",
|
||||
"Alias": "Alias",
|
||||
"Time Zone": "タイムゾーン",
|
||||
"Locale": "ロケール",
|
||||
"Verified": "確認済み",
|
||||
"Active": "有効",
|
||||
"Shared": "共有",
|
||||
"Shared Agent": "共有エージェント",
|
||||
"Moderator": "モデレーター",
|
||||
"Suspended": "保留中",
|
||||
"Restricted Agent": "制限付きエージェント",
|
||||
"Only Private Comments": "プライベートコメントのみ",
|
||||
"Report CSV": "CSVを報告",
|
||||
"Skip Verify Email": "メールの確認をスキップ",
|
||||
"Ticket Restriction": "チケットの制限",
|
||||
"Signature": "署名",
|
||||
"Agent Brand Access": "エージェントのブランドアクセス",
|
||||
"User Fields": "ユーザーフィールド",
|
||||
"Identities": "ID",
|
||||
"User": "ユーザー",
|
||||
"Confirm Deletion": "削除の確認",
|
||||
"Search Type": "検索タイプ",
|
||||
"Domain": "ドメイン",
|
||||
"Tag": "タグ",
|
||||
"Custom Query": "カスタムクエリ",
|
||||
"Sort By": "並び替え",
|
||||
"Sort Order": "並び順",
|
||||
"Ticket ID": "ケースID",
|
||||
"Content": "コンテンツ",
|
||||
"Email Address": "メールアドレス",
|
||||
"Method": "方法",
|
||||
"Headers": "ヘッダー",
|
||||
"Query Parameters": "クエリパラメータ",
|
||||
"Body": "本文",
|
||||
"Response is Binary ?": "応答はバイナリですか?",
|
||||
"No Error on Failure": "失敗時にエラーはありません",
|
||||
"Timeout (in seconds)": "タイムアウト(秒)",
|
||||
"The subject of the ticket (optional - will use first comment text if not provided)": "チケットの件名 (省略可能)",
|
||||
"The comment body (text). Use this for plain text comments.": "コメント本文 (text) 。プレーンテキストのコメントに使用します。",
|
||||
"The comment body (HTML). Use this for HTML formatted comments. If provided, this takes precedence over Comment Body.": "コメント本文 (HTML) 。HTML 形式のコメントに使用します。指定された場合は、Comment Body よりも優先されます。",
|
||||
"Email address of the ticket requester. If not provided, the authenticated user will be the requester.": "チケットリクエスターのメールアドレスです。指定されていない場合、認証されたユーザーはリクエスターになります。",
|
||||
"Name of the ticket requester (used when creating a new user).": "チケットリクエスターの名前 (新規ユーザーの作成時に使用されます)。",
|
||||
"Email address of the agent to assign the ticket to.": "チケットを割り当てるエージェントのメールアドレスです。",
|
||||
"The priority of the ticket.": "チケットの優先度",
|
||||
"The type of ticket.": "チケットの種類。",
|
||||
"The status of the ticket.": "チケットのステータス",
|
||||
"Array of tags to apply to the ticket.": "チケットに適用するタグの配列。",
|
||||
"Select the organization to work with": "作業する組織を選択してください",
|
||||
"Select the group to assign": "割り当てるグループを選択します",
|
||||
"An external ID for the ticket (useful for integrations).": "チケットの外部 ID (統合に便利)",
|
||||
"Array of email addresses to add as collaborators.": "コラボレーターとして追加するメールアドレスの配列です。",
|
||||
"Array of email addresses to add as followers.": "追加するメールアドレスの配列です。",
|
||||
"The date and time when the ticket is due.": "チケットの期日と時刻。",
|
||||
"Custom ticket field values": "チケットのカスタムフィールドの値",
|
||||
"Whether the comment is public (visible to the requester). Defaults to true.": "コメントが公開されているかどうか。デフォルトはtrueです。",
|
||||
"Select the brand to work with": "使用するブランドを選択してください",
|
||||
"The ID of the forum topic associated with the ticket.": "チケットに関連付けられたフォーラムトピックのID。",
|
||||
"Select the problem ticket this ticket is an incident of": "このチケットがインシデントである問題のチケットを選択してください",
|
||||
"Select the ticket to work with": "作業するチケットを選択してください",
|
||||
"Update the subject of the ticket": "チケットの件名を更新",
|
||||
"Add a comment to the ticket (plain text)": "チケットにコメントを追加 (プレーンテキスト)",
|
||||
"Add a comment to the ticket (HTML). If provided, this takes precedence over Comment Body.": "チケット(HTML)にコメントを追加します。指定された場合、Comment Bodyよりも優先されます。",
|
||||
"Email address of the agent to assign the ticket to": "チケットを割り当てるエージェントのメールアドレス",
|
||||
"Update the priority of the ticket": "チケットの優先度を更新する",
|
||||
"Update the type of ticket": "チケットの種類を更新",
|
||||
"Update the status of the ticket": "チケットのステータスを更新する",
|
||||
"Replace all tags with this array. Use \"Add Tag to Ticket\" action to add tags without replacing existing ones.": "すべてのタグをこの配列に置き換えます。「タグをチケットに追加」アクションを使用して、既存のタグを置き換えることなくタグを追加します。",
|
||||
"Update the external ID for the ticket": "チケットの外部 ID を更新する",
|
||||
"Update the date and time when the ticket is due": "チケットの締切日時を更新する",
|
||||
"Update custom ticket field values": "カスタムチケットフィールドの値を更新",
|
||||
"Set a custom status ID for the ticket": "チケットのカスタムステータスIDを設定する",
|
||||
"Update the forum topic associated with the ticket": "チケットに関連付けられているフォーラムトピックを更新",
|
||||
"Replace collaborators with this array of email addresses": "コラボレーターをこのメールアドレスの配列に置き換えます",
|
||||
"Replace followers with this array of email addresses": "フォロワーをこの配列のメールアドレスに置き換えます",
|
||||
"Update the requester of the ticket": "チケットのリクエスターを更新",
|
||||
"Prevent update collisions by checking timestamp": "タイムスタンプをチェックして更新時の衝突を防止",
|
||||
"Ticket timestamp from updated_at field for collision prevention": "衝突防止のための updated_at フィールドのチケットタイムスタンプです。",
|
||||
"Tags to add to the ticket (adds to existing tags)": "チケットに追加するタグ(既存のタグに追加)",
|
||||
"Prevent tag loss from concurrent updates": "同時更新によるタグの損失を防止",
|
||||
"The comment text content": "コメントテキストの内容",
|
||||
"HTML formatted comment (takes precedence over text)": "HTML 形式のコメント (テキストよりも優先されます)",
|
||||
"Make comment visible to requester (default: true)": "リクエスターにコメントを表示する (デフォルト: true)",
|
||||
"Email of comment author (defaults to authenticated user)": "コメント投稿者のメールアドレス (デフォルトで認証済みユーザー)",
|
||||
"Upload tokens for file attachments": "添付ファイルのトークンをアップロード",
|
||||
"Original ticket ID if this is from a follow-up": "フォローアップによるオリジナルのチケットID",
|
||||
"Unique name for the organization": "組織のユニークな名前",
|
||||
"Additional details about the organization": "組織に関する詳細情報",
|
||||
"Internal notes about the organization": "組織に関する内部メモ",
|
||||
"External ID for integration purposes": "統合目的の外部ID",
|
||||
"Domain names associated with the organization": "組織に関連付けられたドメイン",
|
||||
"Tags to apply to the organization": "組織に適用するタグ",
|
||||
"Custom organization field values": "組織のカスタムフィールドの値",
|
||||
"Allow users to see each other's tickets": "ユーザーがお互いのチケットを閲覧できるようにする",
|
||||
"Allow users to see each other's comments": "ユーザーがお互いのコメントを見ることを許可する",
|
||||
"New name for the organization (must be unique)": "組織の新しい名前(固有のものである必要があります)",
|
||||
"Domain names for the organization (replaces all existing)": "組織のドメイン名(既存のすべてに置き換えられます)",
|
||||
"Tags for the organization (replaces all existing)": "組織のタグ (既存のものに置き換える)",
|
||||
"The name of the user": "利用者の名前",
|
||||
"The primary email address of the user": "利用者のプライマリメールアドレス",
|
||||
"The role of the user. Defaults to \"end-user\" if not specified.": "ユーザーのロール。指定されていない場合、デフォルトは \"end-user\" です。",
|
||||
"Select the custom role for the agent": "エージェントのカスタムロールを選択します",
|
||||
"Create and associate user with a new organization by name (alternative to Organization ID)": "新しい組織名でユーザーを作成および関連付けます(組織 ID の代替)",
|
||||
"The phone number of the user": "利用者の電話番号",
|
||||
"An alias displayed to end users": "エンドユーザーに表示されるエイリアスです。",
|
||||
"Additional details about the user": "ユーザーに関する追加の詳細",
|
||||
"Internal notes about the user": "利用者に関する内部メモ",
|
||||
"A unique external ID for the user (useful for integrations)": "ユーザーの一意の外部 ID (統合に便利)",
|
||||
"The time zone of the user (e.g., \"America/New_York\")": "ユーザーのタイムゾーン (例: \"America/New_York\")",
|
||||
"The locale of the user (e.g., \"en-US\")": "ユーザーのロケール(例:\"en-US\")",
|
||||
"Whether the user is verified": "ユーザーが認証されているかどうか",
|
||||
"Whether the user is active. Defaults to true.": "ユーザーがアクティブかどうか。デフォルトはtrueです。",
|
||||
"Whether the user is shared from a different Zendesk Support instance": "他のZendeskサポートインスタンスからユーザーを共有するかどうか",
|
||||
"Whether the user is a shared agent from a different Zendesk Support instance": "Zendeskサポートインスタンスの共有エージェントであるかどうか",
|
||||
"Whether the user has forum moderation capabilities": "ユーザにフォーラムモデレーション機能があるかどうか",
|
||||
"Whether the user is suspended": "ユーザーが一時停止されているかどうか",
|
||||
"Whether the agent has restrictions on what tickets they can access": "エージェントがアクセスできるチケットに制限があるかどうか",
|
||||
"Whether the user can only create private comments": "ユーザーがプライベートコメントのみを作成できるかどうか",
|
||||
"Whether the user can access CSV reports": "ユーザーがCSVレポートにアクセスできるかどうか",
|
||||
"Skip sending a verification email to the user": "ユーザーへの確認メールの送信をスキップ",
|
||||
"The ticket restriction for the user": "利用者のチケット制限",
|
||||
"The user's signature for email responses": "メール応答のユーザーの署名",
|
||||
"Select the brands that the agent can access (for agents only)": "エージェントがアクセスできるブランドを選択します(エージェントのみ)",
|
||||
"Array of tags to apply to the user": "ユーザーに適用するタグの配列",
|
||||
"Custom user field values": "ユーザー定義フィールドの値",
|
||||
"Array of identity objects with type and value. Example: [{\"type\": \"email\", \"value\": \"test@user.com\"}, {\"type\": \"twitter\", \"value\": \"username\"}]": "型と値を持つIDオブジェクトの配列。例: [{\"type\": \"email\", \"value\": \"test@user.com\"}, {\"type\": \"twitter\", \"value\": \"username\"}]",
|
||||
"Select the user to work with": "作業するユーザーを選択してください",
|
||||
"I understand that deleted users are not recoverable and this action cannot be undone.": "削除されたユーザーは復元できず、この操作は元に戻せません。",
|
||||
"Choose how to search for organizations": "組織を検索する方法を選択してください",
|
||||
"The name of the organization to search for": "検索する組織の名前",
|
||||
"Search organizations by domain name": "ドメイン名で組織を検索",
|
||||
"Search organizations by external ID": "外部 ID で組織を検索",
|
||||
"Search organizations containing this tag": "このタグを含む組織を検索",
|
||||
"Search in organization details/notes": "組織の詳細/メモから検索",
|
||||
"Custom search query using Zendesk search syntax (e.g., \"type:organization domain:example.com\")": "Zendesk検索構文を使用したカスタム検索クエリ (例: \"type:organization domain:example.com\")",
|
||||
"How to sort the results": "結果を並べ替える方法",
|
||||
"Sort order for results": "結果の並び順",
|
||||
"Choose how to search for tickets": "チケットを検索する方法を選択",
|
||||
"The ID of the ticket to find": "検索するチケットのID",
|
||||
"Search tickets by status": "ステータス別にチケットを検索",
|
||||
"Search tickets by priority": "優先度でチケットを検索",
|
||||
"Search tickets by type": "チケットの種類で検索",
|
||||
"Search tickets containing this tag": "このタグを含むチケットを検索",
|
||||
"Search tickets by requester email address": "リクエスターのメールアドレスでチケットを検索",
|
||||
"Search tickets by assignee email address": "担当者のメールアドレスでチケットを検索",
|
||||
"Search in ticket subject and content": "チケットの件名と内容で検索",
|
||||
"Custom search query using Zendesk search syntax (e.g., \"type:ticket status:open priority:high\")": "Zendesk検索構文を使用したカスタム検索クエリ (例: \"type:ticket status:open priority:high\")",
|
||||
"Choose how to search for users": "ユーザーを検索する方法を選択してください",
|
||||
"The email address of the user to search for": "検索するユーザーのメールアドレス",
|
||||
"The name of the user to search for": "検索するユーザーの名前",
|
||||
"Search users by role": "ロールでユーザーを検索",
|
||||
"Search users by organization name": "組織名でユーザーを検索",
|
||||
"Search users containing this tag": "このタグを含むユーザーを検索",
|
||||
"Search users by external ID": "外部 ID でユーザーを検索",
|
||||
"Custom search query using Zendesk search syntax (e.g., \"type:user role:agent\")": "Zendesk検索構文を使用したカスタム検索クエリ (例: \"type:user role:agent\")",
|
||||
"Authorization headers are injected automatically from your connection.": "認証ヘッダは接続から自動的に注入されます。",
|
||||
"Enable for files like PDFs, images, etc..": "PDF、画像などのファイルを有効にします。",
|
||||
"Low": "低い",
|
||||
"Normal": "標準",
|
||||
"High": "高い",
|
||||
"Urgent": "urgent",
|
||||
"Problem": "問題",
|
||||
"Incident": "事件",
|
||||
"Question": "質問",
|
||||
"Task": "タスク",
|
||||
"New": "新規作成",
|
||||
"Open": "開く",
|
||||
"Pending": "処理待ち",
|
||||
"Hold": "保留",
|
||||
"Solved": "解決済み",
|
||||
"Closed": "クローズ済み",
|
||||
"End User": "エンドユーザー",
|
||||
"Agent": "エージェント",
|
||||
"Admin": "管理者",
|
||||
"Groups": "グループ",
|
||||
"Assigned": "割り当て",
|
||||
"Requested": "要求済み",
|
||||
"Search by Name": "名前で検索",
|
||||
"Search by Domain": "ドメインで検索",
|
||||
"Search by External ID": "外部IDで検索",
|
||||
"Search by Tag": "タグで検索",
|
||||
"Search by Details": "詳細で検索",
|
||||
"Relevance (Default)": "Relevance (Default)",
|
||||
"Created Date": "作成日",
|
||||
"Updated Date": "更新日時",
|
||||
"Descending (Default)": "降順",
|
||||
"Ascending": "昇順",
|
||||
"Search by Ticket ID": "チケットIDで検索",
|
||||
"Search by Status": "ステータスで検索",
|
||||
"Search by Priority": "優先度で検索",
|
||||
"Search by Type": "タイプで検索",
|
||||
"Search by Requester Email": "リクエスターメールで検索",
|
||||
"Search by Assignee Email": "担当者のメールで検索",
|
||||
"Search by Subject/Content": "件名/内容で検索",
|
||||
"Ticket Type": "チケットタイプ",
|
||||
"Search by Email": "メールで検索",
|
||||
"Search by Role": "ロールで検索",
|
||||
"Search by Organization": "組織で検索",
|
||||
"GET": "取得",
|
||||
"POST": "POST",
|
||||
"PATCH": "PATCH",
|
||||
"PUT": "PUT",
|
||||
"DELETE": "削除",
|
||||
"HEAD": "頭",
|
||||
"New ticket in view": "新しいチケットを表示する",
|
||||
"New Ticket": "新規チケット",
|
||||
"Updated Ticket": "更新されたチケット",
|
||||
"Tag Added to Ticket": "チケットにタグが追加されました",
|
||||
"New Organization": "新しい組織",
|
||||
"New User": "新規ユーザー",
|
||||
"New Suspended Ticket": "新規保留チケット",
|
||||
"New Action on Ticket": "チケットの新規アクション",
|
||||
"Triggers when a new ticket is created in a view": "ビューに新しいチケットが作成されたときにトリガーされます",
|
||||
"Fires when a new ticket is created (optionally filtered by organization). Requires a Zendesk Trigger with Notify active webhook.": "新しいチケットが作成されたときに発生します(組織別にフィルタリングされます)。Zendesk Trigger with Notify active webhookが必要です。",
|
||||
"Fires when an existing ticket is updated. Requires a Zendesk Trigger with Notify active webhook.": "既存のチケットが更新されたときに発行されます。Zendesk Trigger with Notify active webhookが必要です。",
|
||||
"Fires when a ticket update includes the specified tag. Requires a Zendesk Trigger with Notify active webhook.": "チケットの更新に指定したタグが含まれている場合に発行されます。Zendesk Trigger with Notify active webhookが必要です。",
|
||||
"Fires when a new organization record is created. Uses Zendesk event webhook (no Trigger needed).": "新しい組織レコードが作成されたときに発生します。Zendesk イベント webhook を使用します (トリガーは必要ありません)。",
|
||||
"Fires when a new user is created. Uses Zendesk event webhook (no Trigger needed).": "新しいユーザーが作成されたときに発生します。ZendeskイベントのWebhookを使用します(トリガーは不要です)。",
|
||||
"Fires when a ticket is suspended. Requires a Zendesk Trigger with Notify active webhook. Suspended tickets auto-delete after 14 days.": "チケットが一時停止されたときに発生します。Zendesk Trigger with Notify active webhookが必要です。一時停止したチケットは14日後に自動的に削除されます。",
|
||||
"Fires when the specified ticket updates. Requires a Zendesk Trigger with Notify active webhook.": "指定したチケットの更新時に発生します。Zendesk Trigger with Notify active webhookが必要です。",
|
||||
"View": "表示",
|
||||
"Organization (Optional)": "組織(オプション)",
|
||||
"Specific Tag (Optional)": "特定のタグ(オプション)",
|
||||
"User Role (Optional)": "ユーザーロール(任意)",
|
||||
"Organization ID Filter (Optional)": "組織IDフィルター(オプション)",
|
||||
"The view to monitor for new tickets": "新しいチケットを監視するためのビュー",
|
||||
"Filter tickets by organization. Leave empty to trigger for all organizations.": "組織別のチケットを絞り込みます。空のままにすると、すべての組織がトリガーされます。",
|
||||
"Only trigger when this specific tag is added. Leave empty to trigger for any tag addition.": "この特定のタグが追加された場合のみトリガーします。任意のタグ追加のトリガーには空のままにします。",
|
||||
"Filter users by role. Leave empty to trigger for all user types.": "ロールでユーザーをフィルターします。空のままにすると、すべてのユーザータイプがトリガーされます。",
|
||||
"Only trigger for tickets from this organization ID. Leave empty for all organizations.": "この組織 ID からのチケットのみトリガーします。すべての組織で空のままにします。",
|
||||
"The specific ticket ID to monitor for actions/events.": "アクション/イベントを監視する特定のチケットID。",
|
||||
"All Roles": "すべてのロール"
|
||||
}
|
||||
@@ -0,0 +1,304 @@
|
||||
{
|
||||
"Customer service software and support ticket system": "Deskundig datingadvies en ticketsysteem",
|
||||
"Agent Email": "Medewerker E-mail",
|
||||
"Token": "Token",
|
||||
"Organization (e.g activepieceshelp)": "Organisatie (bijv. activepieceshelp)",
|
||||
"The email address you use to login to Zendesk": "Het e-mailadres dat u gebruikt om in te loggen op Zendesk",
|
||||
"The API token you can generate in Zendesk": "De API-sleutel die je kan genereren in Zendesk",
|
||||
"The subdomain of your Zendesk instance": "De subdomein van uw Zendesk instantie",
|
||||
"\n**Organization**: The organization name can be found in the URL (e.g https://ORGANIZATION_NAME.zendesk.com).\n\n**Agent Email**: The email you use to log in to Zendesk.\n\n**API Token**: You can find this in the Zendesk Admin Panel under Settings > APIs > Zendesk API.\n": "\n**Organisatie**: De organisatienaam kan gevonden worden in de URL (bijv. https://ORGANIZATION_NAME. endesk.com).\n\n**Agent E-mail**: Het e-mailadres dat u gebruikt om in te loggen op Zendesk.\n\n**API Token**: U kunt dit vinden in het Zendesk Admin Panel onder Instellingen > API's > Zendesk API.\n",
|
||||
"Create Ticket": "Ticket aanmaken",
|
||||
"Update Ticket": "Ticket bijwerken",
|
||||
"Add Tag to Ticket": "Label toevoegen aan ticket",
|
||||
"Add Comment to Ticket": "Voeg reactie toe aan ticket",
|
||||
"Create Organization": "Nieuwe organisatie aanmaken",
|
||||
"Update Organization": "Organisatie bijwerken",
|
||||
"Create User": "Gebruiker aanmaken",
|
||||
"Delete User": "Gebruiker verwijderen",
|
||||
"Find Organization(s)": "Organisatie(s) zoeken",
|
||||
"Find Ticket(s)": "Ticket(s) zoeken",
|
||||
"Find User(s)": "Zoek gebruiker(s)",
|
||||
"Custom API Call": "Custom API Call",
|
||||
"Create a new ticket in Zendesk.": "Maak een nieuw ticket aan in Zendesk.",
|
||||
"Modify ticket fields or status via API call.": "Wijzig ticketvelden of status via API call.",
|
||||
"Apply one or more tags to a ticket.": "Een of meer tags toepassen op een ticket.",
|
||||
"Append a public/private comment to a ticket.": "Voeg een publiek-private reactie toe aan een ticket.",
|
||||
"Create a new organization record.": "Maak een nieuw organisatie record.",
|
||||
"Update existing organization fields.": "Bestaande organisatie velden bijwerken.",
|
||||
"Add a new user to the Zendesk instance.": "Voeg een nieuwe gebruiker toe aan de Zendesk instantie.",
|
||||
"Remove a user and associated records from the account.": "Verwijder een gebruiker en bijbehorende records van het account.",
|
||||
"Search organizations by name, domain, external ID, or other criteria.": "Zoek organisaties op naam, domein, externe ID, of andere criteria.",
|
||||
"Search tickets by ID, field, or content.": "Zoekt tickets op ID, veld of inhoud.",
|
||||
"Search users by email, name, role, or other criteria.": "Gebruikers zoeken via e-mail, naam, rol of andere criteria.",
|
||||
"Make a custom API call to a specific endpoint": "Maak een aangepaste API call naar een specifiek eindpunt",
|
||||
"Subject": "Onderwerp",
|
||||
"Comment Body": "Commentaar inhoud",
|
||||
"Comment HTML Body": "Commentaar HTML body",
|
||||
"Requester Email": "Aanvrager E-mail",
|
||||
"Requester Name": "Naam aanvrager",
|
||||
"Assignee Email": "Assignee Email",
|
||||
"Priority": "Prioriteit",
|
||||
"Type": "Type",
|
||||
"Status": "status",
|
||||
"Tags": "Labels",
|
||||
"Organization": "Rekening",
|
||||
"Group": "Groeperen",
|
||||
"External ID": "Extern ID",
|
||||
"Collaborator Emails": "E-mail Medewerker",
|
||||
"Follower Emails": "Volger e-mails",
|
||||
"Due Date": "Inleverdatum",
|
||||
"Custom Fields": "Aangepaste velden",
|
||||
"Public Comment": "Openbare Opmerking",
|
||||
"Brand": "Merk",
|
||||
"Forum Topic ID": "Forumonderwerp ID",
|
||||
"Problem Ticket": "Probleem Ticket",
|
||||
"Ticket": "Ticketsysteem",
|
||||
"Custom Status ID": "Aangepaste status-ID",
|
||||
"Safe Update": "Veilige update",
|
||||
"Updated Timestamp": "Bijgewerkte Tijdstempel",
|
||||
"Author Email": "E-mailadres auteur",
|
||||
"Attachment Tokens": "Bijlage Tokens",
|
||||
"Via Followup Source ID": "Via het opvolgen van bron-ID",
|
||||
"Organization Name": "Naam organisatie",
|
||||
"Details": "Beschrijving",
|
||||
"Notes": "Opmerkingen",
|
||||
"Domain Names": "Domein namen",
|
||||
"Organization Fields": "Organisatie velden",
|
||||
"Shared Tickets": "Gedeelde tickets",
|
||||
"Shared Comments": "Gedeelde reacties",
|
||||
"Name": "Naam",
|
||||
"Email": "E-mail",
|
||||
"Role": "Functie",
|
||||
"Custom Role": "Aangepaste rol",
|
||||
"Phone": "Telefoonnummer",
|
||||
"Alias": "Alias",
|
||||
"Time Zone": "Tijd Zone",
|
||||
"Locale": "Lokalisatie",
|
||||
"Verified": "Geverifieerd",
|
||||
"Active": "Actief",
|
||||
"Shared": "Gedeeld",
|
||||
"Shared Agent": "Gedeelde agent",
|
||||
"Moderator": "Moderator",
|
||||
"Suspended": "Gestopt",
|
||||
"Restricted Agent": "Beperkte agent",
|
||||
"Only Private Comments": "Alleen privéreacties",
|
||||
"Report CSV": "CSV-rapporteren",
|
||||
"Skip Verify Email": "Sla bevestigings-e-mail over",
|
||||
"Ticket Restriction": "Ticket beperking",
|
||||
"Signature": "Handtekening",
|
||||
"Agent Brand Access": "Agent merk toegang",
|
||||
"User Fields": "Gebruiker velden",
|
||||
"Identities": "Identiteiten",
|
||||
"User": "Gebruiker",
|
||||
"Confirm Deletion": "Verwijdering bevestigen",
|
||||
"Search Type": "Type zoeken",
|
||||
"Domain": "Domein",
|
||||
"Tag": "Tagnaam",
|
||||
"Custom Query": "Aangepaste zoekopdracht",
|
||||
"Sort By": "Sorteren op",
|
||||
"Sort Order": "Sorteren bestelling",
|
||||
"Ticket ID": "Ticket ID",
|
||||
"Content": "Inhoud",
|
||||
"Email Address": "Uw e-mailadres",
|
||||
"Method": "Methode",
|
||||
"Headers": "Kopteksten",
|
||||
"Query Parameters": "Query parameters",
|
||||
"Body": "Lichaam",
|
||||
"Response is Binary ?": "Antwoord is binair?",
|
||||
"No Error on Failure": "Geen fout bij fout",
|
||||
"Timeout (in seconds)": "Time-out (in seconden)",
|
||||
"The subject of the ticket (optional - will use first comment text if not provided)": "Het onderwerp van de ticket (optioneel - gebruikt de eerste reactietekst indien niet opgegeven)",
|
||||
"The comment body (text). Use this for plain text comments.": "De inhoud van de reactie (tekst). Gebruik dit voor commentaar zonder opmaak.",
|
||||
"The comment body (HTML). Use this for HTML formatted comments. If provided, this takes precedence over Comment Body.": "De inhoud van de reactie (HTML). Gebruik dit voor HTML opgemaakte commentaren. Indien ingevuld krijgt dit commentaar voorrang boven Commentaar Body.",
|
||||
"Email address of the ticket requester. If not provided, the authenticated user will be the requester.": "E-mailadres van de ticketaanvrager. Indien niet opgegeven, wordt de ingelogde gebruiker de aanvrager.",
|
||||
"Name of the ticket requester (used when creating a new user).": "Naam van de ticketaanvrager (gebruikt bij het maken van een nieuwe gebruiker).",
|
||||
"Email address of the agent to assign the ticket to.": "Email adres van de agent waaraan de ticket wordt toegewezen.",
|
||||
"The priority of the ticket.": "De prioriteit van het ticket.",
|
||||
"The type of ticket.": "Het type ticket.",
|
||||
"The status of the ticket.": "De status van het ticket.",
|
||||
"Array of tags to apply to the ticket.": "Array of tags om toe te passen op het ticket.",
|
||||
"Select the organization to work with": "Selecteer de organisatie waarmee u wilt werken",
|
||||
"Select the group to assign": "Selecteer de groep om toe te wijzen",
|
||||
"An external ID for the ticket (useful for integrations).": "Een externe ID voor het ticket (nuttig voor integraties).",
|
||||
"Array of email addresses to add as collaborators.": "Reeks van e-mailadressen om toe te voegen als medewerkers.",
|
||||
"Array of email addresses to add as followers.": "Reeks van e-mailadressen om toe te voegen als volgers.",
|
||||
"The date and time when the ticket is due.": "De datum en tijd waarop het ticket vervallen is.",
|
||||
"Custom ticket field values": "Aangepaste ticketveld waarden",
|
||||
"Whether the comment is public (visible to the requester). Defaults to true.": "Of de reactie openbaar is (zichtbaar voor de aanvrager). Standaard waar.",
|
||||
"Select the brand to work with": "Selecteer het merk waarmee u wilt werken",
|
||||
"The ID of the forum topic associated with the ticket.": "De ID van het forumonderwerp dat is gekoppeld aan het ticket.",
|
||||
"Select the problem ticket this ticket is an incident of": "Selecteer het probleemticket waar dit ticket een incident van is",
|
||||
"Select the ticket to work with": "Selecteer het ticket waarmee u wilt werken",
|
||||
"Update the subject of the ticket": "Onderwerp van het ticket bijwerken",
|
||||
"Add a comment to the ticket (plain text)": "Voeg een opmerking toe aan de ticket (platte tekst)",
|
||||
"Add a comment to the ticket (HTML). If provided, this takes precedence over Comment Body.": "Voeg een opmerking toe aan ticket (HTML). Indien verstrekt wordt dit voorrang boven Commentaar Body.",
|
||||
"Email address of the agent to assign the ticket to": "Email adres van de agent waaraan de ticket moet worden toegewezen",
|
||||
"Update the priority of the ticket": "Update de prioriteit van de ticket",
|
||||
"Update the type of ticket": "Het type ticket bijwerken",
|
||||
"Update the status of the ticket": "De status van de ticket bijwerken",
|
||||
"Replace all tags with this array. Use \"Add Tag to Ticket\" action to add tags without replacing existing ones.": "Vervang alle tags door deze array. Gebruik \"Label toevoegen aan Ticket\" actie om labels toe te voegen zonder bestaande te vervangen.",
|
||||
"Update the external ID for the ticket": "Werk het externe ID van het ticket bij",
|
||||
"Update the date and time when the ticket is due": "Datum en tijd bijwerken wanneer het ticket vervallen is",
|
||||
"Update custom ticket field values": "Aangepaste ticketveldwaarden bijwerken",
|
||||
"Set a custom status ID for the ticket": "Stel een aangepaste status-ID in voor het ticket",
|
||||
"Update the forum topic associated with the ticket": "Werk het forumonderwerp dat is gekoppeld aan het ticket bij",
|
||||
"Replace collaborators with this array of email addresses": "Vervang medewerkers met dit scala aan e-mailadressen",
|
||||
"Replace followers with this array of email addresses": "Vervang volgers met dit scala aan e-mailadressen",
|
||||
"Update the requester of the ticket": "De aanvrager van het ticket bijwerken",
|
||||
"Prevent update collisions by checking timestamp": "Voorkom collisies van updates door de tijdstempel te controleren",
|
||||
"Ticket timestamp from updated_at field for collision prevention": "Ticket tijdstempel van updated_at veld voor botsing preventie",
|
||||
"Tags to add to the ticket (adds to existing tags)": "Tags om toe te voegen aan het ticket (voegt toe aan bestaande tags)",
|
||||
"Prevent tag loss from concurrent updates": "Voorkomen dat tag-verlies van gelijktijdige updates",
|
||||
"The comment text content": "Inhoud van de commentaar",
|
||||
"HTML formatted comment (takes precedence over text)": "HTML geformatteerde reactie (heeft voorrang op tekst)",
|
||||
"Make comment visible to requester (default: true)": "Maak reactie zichtbaar voor aanvrager (standaard: true)",
|
||||
"Email of comment author (defaults to authenticated user)": "E-mail van auteur van commentaar (standaard geverifieerde gebruiker)",
|
||||
"Upload tokens for file attachments": "Tokens voor bestandsbijlagen uploaden",
|
||||
"Original ticket ID if this is from a follow-up": "Oorspronkelijke ticket-ID als dit een follow-up is",
|
||||
"Unique name for the organization": "Unieke naam voor de organisatie",
|
||||
"Additional details about the organization": "Aanvullende informatie over de organisatie",
|
||||
"Internal notes about the organization": "Interne notities over de organisatie",
|
||||
"External ID for integration purposes": "Externe ID voor integratie doeleinden",
|
||||
"Domain names associated with the organization": "Domeinnamen geassocieerd met de organisatie",
|
||||
"Tags to apply to the organization": "Tags om toe te passen op de organisatie",
|
||||
"Custom organization field values": "Veld waarden van aangepaste organisatie",
|
||||
"Allow users to see each other's tickets": "Gebruikers toestaan elkaars tickets te bekijken",
|
||||
"Allow users to see each other's comments": "Gebruikers toestaan elkaars opmerkingen te zien",
|
||||
"New name for the organization (must be unique)": "Nieuwe naam voor de organisatie (moet uniek zijn)",
|
||||
"Domain names for the organization (replaces all existing)": "Domeinnamen voor de organisatie (vervangt alle bestaande)",
|
||||
"Tags for the organization (replaces all existing)": "Tags voor de organisatie (vervangt alle bestaande)",
|
||||
"The name of the user": "De naam van de gebruiker",
|
||||
"The primary email address of the user": "Het primaire e-mailadres van de gebruiker",
|
||||
"The role of the user. Defaults to \"end-user\" if not specified.": "De rol van de gebruiker. Standaard ingesteld op \"end-user\" indien niet opgegeven.",
|
||||
"Select the custom role for the agent": "Selecteer de aangepaste rol voor de agent",
|
||||
"Create and associate user with a new organization by name (alternative to Organization ID)": "Maak en koppel een gebruiker aan een nieuwe organisatie op naam (alternatief voor Organisatie ID)",
|
||||
"The phone number of the user": "Het telefoonnummer van de gebruiker",
|
||||
"An alias displayed to end users": "Een alias weergegeven aan eindgebruikers",
|
||||
"Additional details about the user": "Aanvullende informatie over de gebruiker",
|
||||
"Internal notes about the user": "Interne notities over de gebruiker",
|
||||
"A unique external ID for the user (useful for integrations)": "Een unieke externe ID voor de gebruiker (nuttig voor integraties)",
|
||||
"The time zone of the user (e.g., \"America/New_York\")": "De tijdzone van de gebruiker (bijv. \"Amerika/New_York\")",
|
||||
"The locale of the user (e.g., \"en-US\")": "De taal van de gebruiker (bijv. \"nl-NL\")",
|
||||
"Whether the user is verified": "Of de gebruiker is geverifieerd",
|
||||
"Whether the user is active. Defaults to true.": "Of de gebruiker actief is. Standaard ingesteld op waar.",
|
||||
"Whether the user is shared from a different Zendesk Support instance": "Of de gebruiker wordt gedeeld via een andere Zendesk support instantie",
|
||||
"Whether the user is a shared agent from a different Zendesk Support instance": "Of de gebruiker een gedeelde agent is van een andere Zendesk ondersteuningsinstantie",
|
||||
"Whether the user has forum moderation capabilities": "Of de gebruiker een forum moderatie mogelijkheden heeft",
|
||||
"Whether the user is suspended": "Of de gebruiker is geschorst",
|
||||
"Whether the agent has restrictions on what tickets they can access": "Of de agent beperkingen heeft op welke tickets hij toegang heeft",
|
||||
"Whether the user can only create private comments": "Of de gebruiker alleen privéreacties kan maken",
|
||||
"Whether the user can access CSV reports": "Of de gebruiker toegang heeft tot CSV-rapporten",
|
||||
"Skip sending a verification email to the user": "Sla het verzenden van een verificatie-e-mail naar de gebruiker over",
|
||||
"The ticket restriction for the user": "De ticketbeperking voor de gebruiker",
|
||||
"The user's signature for email responses": "De handtekening van de gebruiker voor e-mail antwoorden",
|
||||
"Select the brands that the agent can access (for agents only)": "Selecteer de merken die de agent kan gebruiken (alleen voor agenten)",
|
||||
"Array of tags to apply to the user": "Array of tags om toe te passen op de gebruiker",
|
||||
"Custom user field values": "Veld waarden eigen gebruiker",
|
||||
"Array of identity objects with type and value. Example: [{\"type\": \"email\", \"value\": \"test@user.com\"}, {\"type\": \"twitter\", \"value\": \"username\"}]": "Array of identity objecten met type en waarde. Voorbeeld: [{\"type\": \"email\", \"value\": \"test@user.com\"}, {\"type\": \"twitter\", \"value\": \"username\"}]",
|
||||
"Select the user to work with": "Selecteer de gebruiker waarmee u wilt werken",
|
||||
"I understand that deleted users are not recoverable and this action cannot be undone.": "Ik begrijp dat verwijderde gebruikers niet te herstellen zijn en deze actie kan niet ongedaan worden gemaakt.",
|
||||
"Choose how to search for organizations": "Kies hoe u wilt zoeken in organisaties",
|
||||
"The name of the organization to search for": "De naam van de organisatie om naar te zoeken",
|
||||
"Search organizations by domain name": "Zoek organisaties op domeinnaam",
|
||||
"Search organizations by external ID": "Zoek organisaties op extern ID",
|
||||
"Search organizations containing this tag": "Zoek organisaties die dit label bevatten",
|
||||
"Search in organization details/notes": "Zoeken in organisatiegegevens/notities",
|
||||
"Custom search query using Zendesk search syntax (e.g., \"type:organization domain:example.com\")": "Aangepaste zoekquery met Zendesk zoeksyntaxis (bijv. \"type:organisatiedomein:example.com\")",
|
||||
"How to sort the results": "Hoe de resultaten te sorteren",
|
||||
"Sort order for results": "Sorteer volgorde voor resultaten",
|
||||
"Choose how to search for tickets": "Kies hoe te zoeken naar tickets",
|
||||
"The ID of the ticket to find": "Het ID van het ticket om te vinden",
|
||||
"Search tickets by status": "Tickets zoeken op status",
|
||||
"Search tickets by priority": "Zoekt tickets op prioriteit",
|
||||
"Search tickets by type": "Zoekt tickets op type",
|
||||
"Search tickets containing this tag": "Zoekt tickets met deze tag",
|
||||
"Search tickets by requester email address": "Zoekt tickets op e-mailadres van de aanvrager",
|
||||
"Search tickets by assignee email address": "Zoekt tickets op toegewezen e-mailadres",
|
||||
"Search in ticket subject and content": "Zoeken in ticket onderwerp en inhoud",
|
||||
"Custom search query using Zendesk search syntax (e.g., \"type:ticket status:open priority:high\")": "Aangepaste zoekquery met Zendesk zoeksyntaxis (bijv. \"type:ticketstatus:open prioriteit:high\")",
|
||||
"Choose how to search for users": "Kies hoe u wilt zoeken naar gebruikers",
|
||||
"The email address of the user to search for": "Het e-mailadres van de gebruiker om naar te zoeken",
|
||||
"The name of the user to search for": "De naam van de te zoeken gebruiker",
|
||||
"Search users by role": "Gebruikers zoeken op rol",
|
||||
"Search users by organization name": "Gebruikers doorzoeken op organisatienaam",
|
||||
"Search users containing this tag": "Zoek gebruikers die deze tag bevatten",
|
||||
"Search users by external ID": "Gebruikers zoeken op externe ID",
|
||||
"Custom search query using Zendesk search syntax (e.g., \"type:user role:agent\")": "Aangepaste zoekquery met behulp van Zendesk zoeksyntaxis (bijv. \"type:user rol:agent\")",
|
||||
"Authorization headers are injected automatically from your connection.": "Autorisatie headers worden automatisch geïnjecteerd vanuit uw verbinding.",
|
||||
"Enable for files like PDFs, images, etc..": "Inschakelen voor bestanden zoals PDF's, afbeeldingen etc..",
|
||||
"Low": "laag",
|
||||
"Normal": "normaal",
|
||||
"High": "hoog",
|
||||
"Urgent": "Dringend",
|
||||
"Problem": "Probleem",
|
||||
"Incident": "Incident",
|
||||
"Question": "Vraag",
|
||||
"Task": "Opdracht",
|
||||
"New": "Nieuw",
|
||||
"Open": "Open",
|
||||
"Pending": "In behandeling",
|
||||
"Hold": "Ingedrukt houden",
|
||||
"Solved": "Opgelost",
|
||||
"Closed": "gesloten",
|
||||
"End User": "Beëindig gebruiker",
|
||||
"Agent": "Agent",
|
||||
"Admin": "Beheerder",
|
||||
"Groups": "Groepen",
|
||||
"Assigned": "Toegewezen",
|
||||
"Requested": "Aangevraagd",
|
||||
"Search by Name": "Zoeken op naam",
|
||||
"Search by Domain": "Zoeken op domein",
|
||||
"Search by External ID": "Zoeken op extern ID",
|
||||
"Search by Tag": "Zoeken op label",
|
||||
"Search by Details": "Zoeken op details",
|
||||
"Relevance (Default)": "Relevantie (standaard)",
|
||||
"Created Date": "Aangemaakt op",
|
||||
"Updated Date": "Bijgewerkt op",
|
||||
"Descending (Default)": "Aflopend (standaard)",
|
||||
"Ascending": "Oplopend",
|
||||
"Search by Ticket ID": "Zoeken op ticket ID",
|
||||
"Search by Status": "Zoeken op status",
|
||||
"Search by Priority": "Zoeken op prioriteit",
|
||||
"Search by Type": "Zoeken op type",
|
||||
"Search by Requester Email": "Zoek op e-mailadres van aanvrager",
|
||||
"Search by Assignee Email": "Zoeken per toegewezen e-mail",
|
||||
"Search by Subject/Content": "Zoeken op onderwerp/inhoud",
|
||||
"Ticket Type": "Type ticket",
|
||||
"Search by Email": "Zoeken op e-mail",
|
||||
"Search by Role": "Zoeken op rol",
|
||||
"Search by Organization": "Zoek op organisatie",
|
||||
"GET": "KRIJG",
|
||||
"POST": "POSTE",
|
||||
"PATCH": "BEKIJK",
|
||||
"PUT": "PUT",
|
||||
"DELETE": "VERWIJDEREN",
|
||||
"HEAD": "HOOFD",
|
||||
"New ticket in view": "Nieuw ticket in weergave",
|
||||
"New Ticket": "Nieuw ticket",
|
||||
"Updated Ticket": "Ticket bijgewerkt",
|
||||
"Tag Added to Ticket": "Tag toegevoegd aan ticket",
|
||||
"New Organization": "Nieuwe organisatie",
|
||||
"New User": "Nieuwe gebruiker",
|
||||
"New Suspended Ticket": "Nieuw geschorst ticket",
|
||||
"New Action on Ticket": "Nieuwe actie op Ticket",
|
||||
"Triggers when a new ticket is created in a view": "Triggert wanneer een nieuw ticket wordt aangemaakt in een weergave",
|
||||
"Fires when a new ticket is created (optionally filtered by organization). Requires a Zendesk Trigger with Notify active webhook.": "Vuurt wanneer een nieuw ticket wordt gemaakt (optioneel gefilterd door organisatie). Vereist een Zendesk Trigger met Notificeer actieve webhook.",
|
||||
"Fires when an existing ticket is updated. Requires a Zendesk Trigger with Notify active webhook.": "Vuurt wanneer een bestaand ticket wordt bijgewerkt. Vereist een Zendesk Trigger met Notificeer actieve webhook.",
|
||||
"Fires when a ticket update includes the specified tag. Requires a Zendesk Trigger with Notify active webhook.": "Vuurt wanneer een ticket update de opgegeven tag bevat. Vereist een Zendesk Trigger met Notificeer actieve webhook.",
|
||||
"Fires when a new organization record is created. Uses Zendesk event webhook (no Trigger needed).": "Ontgrendelt wanneer een nieuw organisatie record is gemaakt. Maakt gebruik van Zendesk event webhook (geen Trigger nodig).",
|
||||
"Fires when a new user is created. Uses Zendesk event webhook (no Trigger needed).": "Vuurt wanneer een nieuwe gebruiker is aangemaakt. Maakt gebruik van Zendesk event webhook (geen Trigger nodig).",
|
||||
"Fires when a ticket is suspended. Requires a Zendesk Trigger with Notify active webhook. Suspended tickets auto-delete after 14 days.": "Vuurt wanneer een ticket is opgeschort. Vereist een Zendesk Trigger met Notificatie actieve webhook. Gekopte tickets automatisch verwijderen na 14 dagen.",
|
||||
"Fires when the specified ticket updates. Requires a Zendesk Trigger with Notify active webhook.": "Schiet wanneer de opgegeven ticket updates. Vereist een Zendesk Trigger met Notificeer actieve webhook.",
|
||||
"View": "Weergave",
|
||||
"Organization (Optional)": "Organisatie (optioneel)",
|
||||
"Specific Tag (Optional)": "Specifieke tag (optioneel)",
|
||||
"User Role (Optional)": "Gebruikersrol (optioneel)",
|
||||
"Organization ID Filter (Optional)": "Organisatie ID-filter (optioneel)",
|
||||
"The view to monitor for new tickets": "De weergave om nieuwe tickets te controleren",
|
||||
"Filter tickets by organization. Leave empty to trigger for all organizations.": "Ticket filteren op organisatie. Laat leeg voor alle organisaties.",
|
||||
"Only trigger when this specific tag is added. Leave empty to trigger for any tag addition.": "Alleen trigger wanneer deze specifieke tag wordt toegevoegd. Laat leeg om te trigger voor tag aanvulling.",
|
||||
"Filter users by role. Leave empty to trigger for all user types.": "Gebruikers filteren op rol. Laat leeg voor alle gebruikerstypes.",
|
||||
"Only trigger for tickets from this organization ID. Leave empty for all organizations.": "Alleen trigger voor tickets van deze organisatie-ID. Laat leeg voor alle organisaties.",
|
||||
"The specific ticket ID to monitor for actions/events.": "De specifieke ticket-ID voor het controleren van acties/gebeurtenissen.",
|
||||
"All Roles": "Alle rollen"
|
||||
}
|
||||
@@ -0,0 +1,304 @@
|
||||
{
|
||||
"Customer service software and support ticket system": "Software de atendimento ao cliente e sistema de suporte a pedidos",
|
||||
"Agent Email": "E-mail do representante",
|
||||
"Token": "Identificador",
|
||||
"Organization (e.g activepieceshelp)": "Organização (por exemplo, ajuda de activepartes)",
|
||||
"The email address you use to login to Zendesk": "O endereço de e-mail que você usa para acessar o Zendesk",
|
||||
"The API token you can generate in Zendesk": "O token de API que você pode gerar em Zendesk",
|
||||
"The subdomain of your Zendesk instance": "O subdomínio da instância do Zendesk",
|
||||
"\n**Organization**: The organization name can be found in the URL (e.g https://ORGANIZATION_NAME.zendesk.com).\n\n**Agent Email**: The email you use to log in to Zendesk.\n\n**API Token**: You can find this in the Zendesk Admin Panel under Settings > APIs > Zendesk API.\n": "\n**Organização**: O nome da organização pode ser encontrado no URL (por exemplo, https://ORGANIZATION_NAME. endesk.com).\n\n**Agente Email**: O e-mail que você usa para fazer login no Zendesk.\n\n**API Token**: Você pode encontrar isso no Painel de Administração do Zendesk em Configurações > APIs > Zendesk API.\n",
|
||||
"Create Ticket": "Criar Ticket",
|
||||
"Update Ticket": "Atualizar Ticket",
|
||||
"Add Tag to Ticket": "Adicionar Tag ao Ticket",
|
||||
"Add Comment to Ticket": "Adicionar Comentário ao Ticket",
|
||||
"Create Organization": "Criar Organização",
|
||||
"Update Organization": "Atualizar Organização",
|
||||
"Create User": "Criar Usuário",
|
||||
"Delete User": "Excluir Usuário",
|
||||
"Find Organization(s)": "Encontrar Organizações",
|
||||
"Find Ticket(s)": "Localizar Ticket(s)",
|
||||
"Find User(s)": "Localizar Usuário(s)",
|
||||
"Custom API Call": "Chamada de API personalizada",
|
||||
"Create a new ticket in Zendesk.": "Criar um novo ticket em Zendesk.",
|
||||
"Modify ticket fields or status via API call.": "Modificar campos de tickets ou status via chamada de API.",
|
||||
"Apply one or more tags to a ticket.": "Aplicar uma ou mais tags a um ticket.",
|
||||
"Append a public/private comment to a ticket.": "Anexar um comentário público/privado a um ticket.",
|
||||
"Create a new organization record.": "Criar um novo registro na organização.",
|
||||
"Update existing organization fields.": "Atualizar campos da organização existentes.",
|
||||
"Add a new user to the Zendesk instance.": "Adicionar um novo usuário à instância do Zendesk.",
|
||||
"Remove a user and associated records from the account.": "Remover um usuário e registros associados da conta.",
|
||||
"Search organizations by name, domain, external ID, or other criteria.": "Pesquisar organizações por nome, domínio, ID externo, ou outros critérios.",
|
||||
"Search tickets by ID, field, or content.": "Buscar tickets por ID, campo ou conteúdo.",
|
||||
"Search users by email, name, role, or other criteria.": "Pesquise usuários por e-mail, nome, papel ou outros critérios.",
|
||||
"Make a custom API call to a specific endpoint": "Faça uma chamada de API personalizada para um ponto de extremidade específico",
|
||||
"Subject": "Cargo",
|
||||
"Comment Body": "Corpo do Comentário",
|
||||
"Comment HTML Body": "Corpo do Comentário HTML",
|
||||
"Requester Email": "E-mail do Solicitador",
|
||||
"Requester Name": "Nome do Solicitador",
|
||||
"Assignee Email": "Assignee Email",
|
||||
"Priority": "Prioridade",
|
||||
"Type": "tipo",
|
||||
"Status": "Estado",
|
||||
"Tags": "Etiquetas",
|
||||
"Organization": "Cliente",
|
||||
"Group": "grupo",
|
||||
"External ID": "ID Externo",
|
||||
"Collaborator Emails": "E-mails do Colaborador",
|
||||
"Follower Emails": "E-mails Seguidores",
|
||||
"Due Date": "Data de vencimento",
|
||||
"Custom Fields": "Campos Personalizados",
|
||||
"Public Comment": "Comentário público",
|
||||
"Brand": "Bandeira",
|
||||
"Forum Topic ID": "ID do tópico do fórum",
|
||||
"Problem Ticket": "Ticket do Problema",
|
||||
"Ticket": "Chamado",
|
||||
"Custom Status ID": "Status personalizado ID",
|
||||
"Safe Update": "Atualização Segura",
|
||||
"Updated Timestamp": "Timestamp atualizado",
|
||||
"Author Email": "Email do Autor",
|
||||
"Attachment Tokens": "Tokens de Anexos",
|
||||
"Via Followup Source ID": "Através do Followup Source ID",
|
||||
"Organization Name": "Nome Da Organização",
|
||||
"Details": "detalhes",
|
||||
"Notes": "Observações",
|
||||
"Domain Names": "Nomes de domínio",
|
||||
"Organization Fields": "Campos De Organização",
|
||||
"Shared Tickets": "Tickets Compartilhados",
|
||||
"Shared Comments": "Comentários Compartilhados",
|
||||
"Name": "Nome",
|
||||
"Email": "e-mail",
|
||||
"Role": "Funções",
|
||||
"Custom Role": "Função Personalizada",
|
||||
"Phone": "Smartphone",
|
||||
"Alias": "Alias",
|
||||
"Time Zone": "Fuso Horário",
|
||||
"Locale": "Localidade",
|
||||
"Verified": "Verificada",
|
||||
"Active": "Ativo",
|
||||
"Shared": "Compartilhado",
|
||||
"Shared Agent": "Agente compartilhado",
|
||||
"Moderator": "Moderador(a)",
|
||||
"Suspended": "Suspenso",
|
||||
"Restricted Agent": "Agente restrito",
|
||||
"Only Private Comments": "Apenas comentários privados",
|
||||
"Report CSV": "Relatório CSV",
|
||||
"Skip Verify Email": "Ignorar verificação de e-mail",
|
||||
"Ticket Restriction": "Restrição do Ticket",
|
||||
"Signature": "Assinatura",
|
||||
"Agent Brand Access": "Acesso à marca do representante",
|
||||
"User Fields": "Campos de Usuário",
|
||||
"Identities": "Identidades",
|
||||
"User": "Usuário",
|
||||
"Confirm Deletion": "Confirmar Exclusão",
|
||||
"Search Type": "Pesquisar Tipo",
|
||||
"Domain": "Domínio",
|
||||
"Tag": "Etiqueta",
|
||||
"Custom Query": "Consulta personalizada",
|
||||
"Sort By": "Classificar por",
|
||||
"Sort Order": "Ordem de classificação",
|
||||
"Ticket ID": "ID Ticket",
|
||||
"Content": "Conteúdo",
|
||||
"Email Address": "Endereço de e-mail",
|
||||
"Method": "Método",
|
||||
"Headers": "Cabeçalhos",
|
||||
"Query Parameters": "Parâmetros da consulta",
|
||||
"Body": "Conteúdo",
|
||||
"Response is Binary ?": "A resposta é binária ?",
|
||||
"No Error on Failure": "Nenhum erro no Failure",
|
||||
"Timeout (in seconds)": "Tempo limite (em segundos)",
|
||||
"The subject of the ticket (optional - will use first comment text if not provided)": "O assunto do ticket (opcional - usará o texto do primeiro comentário se não for fornecido)",
|
||||
"The comment body (text). Use this for plain text comments.": "O corpo do comentário (texto). Use isto para comentários em texto simples.",
|
||||
"The comment body (HTML). Use this for HTML formatted comments. If provided, this takes precedence over Comment Body.": "O corpo do comentário (HTML). Use isto para comentários com formato HTML. Se fornecido, isto tem precedência sobre o Compromisso.",
|
||||
"Email address of the ticket requester. If not provided, the authenticated user will be the requester.": "Endereço de e-mail do solicitante do ticket. Se não for fornecido, o usuário autenticado será o solicitante.",
|
||||
"Name of the ticket requester (used when creating a new user).": "Nome do solicitador do ticket (usado ao criar um novo usuário).",
|
||||
"Email address of the agent to assign the ticket to.": "E-mail endereço do agente para atribuir o Chamado.",
|
||||
"The priority of the ticket.": "A prioridade do bilhete.",
|
||||
"The type of ticket.": "O tipo de ingresso.",
|
||||
"The status of the ticket.": "O estado do bilhete.",
|
||||
"Array of tags to apply to the ticket.": "Array de tags para aplicar ao bilhete.",
|
||||
"Select the organization to work with": "Selecione a organização com a qual trabalhar",
|
||||
"Select the group to assign": "Selecione o grupo para atribuir",
|
||||
"An external ID for the ticket (useful for integrations).": "Um ID externo para o ticket (útil para integrações).",
|
||||
"Array of email addresses to add as collaborators.": "Array de endereços de e-mail para adicionar como colaboradores.",
|
||||
"Array of email addresses to add as followers.": "Array de endereços de e-mail para adicionar como seguidores.",
|
||||
"The date and time when the ticket is due.": "A data e a hora da passagem é vencida.",
|
||||
"Custom ticket field values": "Valores do campo do ticket personalizado",
|
||||
"Whether the comment is public (visible to the requester). Defaults to true.": "Se o comentário é público (visível para o solicitante). O padrão é true.",
|
||||
"Select the brand to work with": "Selecione a marca com a qual trabalhar",
|
||||
"The ID of the forum topic associated with the ticket.": "O ID do tópico do fórum associado com o ticket.",
|
||||
"Select the problem ticket this ticket is an incident of": "Selecione o ticket que este ticket é um incidente de",
|
||||
"Select the ticket to work with": "Selecione o ticket para trabalhar com",
|
||||
"Update the subject of the ticket": "Atualizar o assunto do ticket",
|
||||
"Add a comment to the ticket (plain text)": "Adicionar um comentário ao ticket (texto simples)",
|
||||
"Add a comment to the ticket (HTML). If provided, this takes precedence over Comment Body.": "Adicionar um comentário ao ticket (HTML). Se fornecido, isso tem precedência sobre o Comentário do Corpo.",
|
||||
"Email address of the agent to assign the ticket to": "Endereço de e-mail do agente para atribuir o ticket para",
|
||||
"Update the priority of the ticket": "Atualizar a prioridade do ticket",
|
||||
"Update the type of ticket": "Atualizar o tipo do ticket",
|
||||
"Update the status of the ticket": "Atualizar a situação do ticket",
|
||||
"Replace all tags with this array. Use \"Add Tag to Ticket\" action to add tags without replacing existing ones.": "Substitua todas as tags por este array. Use a ação \"Adicionar Tag ao Ticket\" para adicionar tags sem substituir as existentes.",
|
||||
"Update the external ID for the ticket": "Atualizar o ID externo do ticket",
|
||||
"Update the date and time when the ticket is due": "Atualizar a data e a hora em que o ticket expira",
|
||||
"Update custom ticket field values": "Atualizar valores do campo do ticket personalizado",
|
||||
"Set a custom status ID for the ticket": "Definir um ID de status personalizado para o ticket",
|
||||
"Update the forum topic associated with the ticket": "Atualizar o tópico do fórum associado com o ticket",
|
||||
"Replace collaborators with this array of email addresses": "Substituir colaboradores por esta matriz de endereços de e-mail",
|
||||
"Replace followers with this array of email addresses": "Substituir seguidores por esta matriz de endereços de e-mail",
|
||||
"Update the requester of the ticket": "Atualizar o solicitante do ticket",
|
||||
"Prevent update collisions by checking timestamp": "Evitar atualização de colisões verificando o timestamp",
|
||||
"Ticket timestamp from updated_at field for collision prevention": "Ticket timestamp de atualização_no campo para prevenção de colisão",
|
||||
"Tags to add to the ticket (adds to existing tags)": "Marcadores a serem adicionados ao ticket (adiciona a tags existentes)",
|
||||
"Prevent tag loss from concurrent updates": "Impedir perda de etiquetas de atualizações simultâneas",
|
||||
"The comment text content": "O conteúdo do texto comentário",
|
||||
"HTML formatted comment (takes precedence over text)": "Comentário formatado em HTML (tem precedência sobre texto)",
|
||||
"Make comment visible to requester (default: true)": "Tornar o comentário visível para o solicitante (padrão: true)",
|
||||
"Email of comment author (defaults to authenticated user)": "E-mail do autor do comentário (padrão é autenticado)",
|
||||
"Upload tokens for file attachments": "Enviar tokens para anexos de arquivos",
|
||||
"Original ticket ID if this is from a follow-up": "ID original do ticket se isso for de acompanhamento",
|
||||
"Unique name for the organization": "Nome único para a organização",
|
||||
"Additional details about the organization": "Detalhes adicionais sobre a organização",
|
||||
"Internal notes about the organization": "Notas internas sobre a organização",
|
||||
"External ID for integration purposes": "ID externo para fins de integração",
|
||||
"Domain names associated with the organization": "Nomes de domínio associados à organização",
|
||||
"Tags to apply to the organization": "Tags a serem aplicadas à organização",
|
||||
"Custom organization field values": "Valores do campo da organização personalizada",
|
||||
"Allow users to see each other's tickets": "Permitir que os usuários vejam tickets uns dos outros",
|
||||
"Allow users to see each other's comments": "Permitir que os usuários vejam os comentários uns dos outros",
|
||||
"New name for the organization (must be unique)": "Novo nome para a organização (deve ser único)",
|
||||
"Domain names for the organization (replaces all existing)": "Nomes de domínio para a organização (substitui todos existentes)",
|
||||
"Tags for the organization (replaces all existing)": "Tags para a organização (substitui todos existentes)",
|
||||
"The name of the user": "O nome do usuário",
|
||||
"The primary email address of the user": "O endereço de e-mail principal do usuário",
|
||||
"The role of the user. Defaults to \"end-user\" if not specified.": "A função do usuário. O padrão é \"usuário final\" se não for especificado.",
|
||||
"Select the custom role for the agent": "Selecione o papel personalizado para o agente",
|
||||
"Create and associate user with a new organization by name (alternative to Organization ID)": "Criar e associar usuário com uma nova organização por nome (alternativa ao ID da Organização)",
|
||||
"The phone number of the user": "O telefone do usuário",
|
||||
"An alias displayed to end users": "Um alias exibido para os usuários finais",
|
||||
"Additional details about the user": "Detalhes adicionais sobre o usuário",
|
||||
"Internal notes about the user": "Notas internas sobre o usuário",
|
||||
"A unique external ID for the user (useful for integrations)": "Um ID externo exclusivo para o usuário (útil para integrações)",
|
||||
"The time zone of the user (e.g., \"America/New_York\")": "O fuso horário do usuário (por exemplo, \"América/New_York\")",
|
||||
"The locale of the user (e.g., \"en-US\")": "A localidade do usuário (por exemplo, \"en-US\")",
|
||||
"Whether the user is verified": "Se o usuário é verificado",
|
||||
"Whether the user is active. Defaults to true.": "Se o usuário está ativo. O padrão é true.",
|
||||
"Whether the user is shared from a different Zendesk Support instance": "Se o usuário é compartilhado de uma instância diferente de suporte do Zendesk",
|
||||
"Whether the user is a shared agent from a different Zendesk Support instance": "Se o usuário é um agente compartilhado de uma instância diferente de suporte do Zendesk",
|
||||
"Whether the user has forum moderation capabilities": "Se o usuário tem recursos de moderação do fórum",
|
||||
"Whether the user is suspended": "Se o usuário está suspenso",
|
||||
"Whether the agent has restrictions on what tickets they can access": "Se o agente tem restrições sobre quais tickets podem acessar",
|
||||
"Whether the user can only create private comments": "Se o usuário só pode criar comentários privados",
|
||||
"Whether the user can access CSV reports": "Se o usuário pode acessar relatórios CSV",
|
||||
"Skip sending a verification email to the user": "Pular o envio de um e-mail de verificação para o usuário",
|
||||
"The ticket restriction for the user": "Restrição de ticket para o usuário",
|
||||
"The user's signature for email responses": "A assinatura do usuário para as respostas de e-mail",
|
||||
"Select the brands that the agent can access (for agents only)": "Selecione as marcas que o agente pode acessar (para agentes apenas)",
|
||||
"Array of tags to apply to the user": "Array de tags para aplicar ao usuário",
|
||||
"Custom user field values": "Valores de campo do usuário personalizado",
|
||||
"Array of identity objects with type and value. Example: [{\"type\": \"email\", \"value\": \"test@user.com\"}, {\"type\": \"twitter\", \"value\": \"username\"}]": "Array de objetos de identidade com tipo e valor. Exemplo: [{\"type\": \"email\", \"value\": \"test@user.com\"}, {\"type\": \"twitter\", \"value\": \"username\"}]",
|
||||
"Select the user to work with": "Selecione o usuário com o qual trabalhar",
|
||||
"I understand that deleted users are not recoverable and this action cannot be undone.": "Eu entendo que os usuários excluídos não são recuperáveis e esta ação não pode ser desfeita.",
|
||||
"Choose how to search for organizations": "Escolha como pesquisar organizações",
|
||||
"The name of the organization to search for": "O nome da organização para pesquisar",
|
||||
"Search organizations by domain name": "Pesquisar organizações por nome de domínio",
|
||||
"Search organizations by external ID": "Pesquisar organizações por ID externo",
|
||||
"Search organizations containing this tag": "Pesquisar organizações que contenham esta tag",
|
||||
"Search in organization details/notes": "Pesquisar nos detalhes/notas da organização",
|
||||
"Custom search query using Zendesk search syntax (e.g., \"type:organization domain:example.com\")": "Consulta de pesquisa personalizada usando sintaxe de pesquisa do Zendesk (por exemplo, \"tipo:domínio da organização:exemplo.com\")",
|
||||
"How to sort the results": "Como classificar os resultados",
|
||||
"Sort order for results": "Ordem de classificação para resultados",
|
||||
"Choose how to search for tickets": "Escolha como pesquisar por Tickets",
|
||||
"The ID of the ticket to find": "O ID do ticket para encontrar",
|
||||
"Search tickets by status": "Pesquisar tickets por status",
|
||||
"Search tickets by priority": "Pesquisar tickets por prioridade",
|
||||
"Search tickets by type": "Pesquisar tickets por tipo",
|
||||
"Search tickets containing this tag": "Buscar tickets que contenham esta etiqueta",
|
||||
"Search tickets by requester email address": "Pesquisar tickets por endereço de e-mail solicitante",
|
||||
"Search tickets by assignee email address": "Pesquisar tickets por endereço de e-mail atribuído",
|
||||
"Search in ticket subject and content": "Pesquisar no assunto do ticket e conteúdo",
|
||||
"Custom search query using Zendesk search syntax (e.g., \"type:ticket status:open priority:high\")": "Consulta de pesquisa personalizada usando sintaxe de pesquisa do Zendesk (por exemplo, \"tipo:ticket status:open priority:high\")",
|
||||
"Choose how to search for users": "Escolha como pesquisar por usuários",
|
||||
"The email address of the user to search for": "O endereço de email do usuário para procurar",
|
||||
"The name of the user to search for": "O nome do usuário a procurar",
|
||||
"Search users by role": "Procurar usuários por função",
|
||||
"Search users by organization name": "Pesquisar usuários por nome da organização",
|
||||
"Search users containing this tag": "Pesquisar usuários que contêm esta tag",
|
||||
"Search users by external ID": "Buscar usuários por ID externo",
|
||||
"Custom search query using Zendesk search syntax (e.g., \"type:user role:agent\")": "Consulta de pesquisa personalizada usando sintaxe de pesquisa do Zendesk (por exemplo, \"tipo:user role:agent\")",
|
||||
"Authorization headers are injected automatically from your connection.": "Os cabeçalhos de autorização são inseridos automaticamente a partir da sua conexão.",
|
||||
"Enable for files like PDFs, images, etc..": "Habilitar para arquivos como PDFs, imagens, etc..",
|
||||
"Low": "baixa",
|
||||
"Normal": "normal",
|
||||
"High": "alta",
|
||||
"Urgent": "Urgente",
|
||||
"Problem": "Problema",
|
||||
"Incident": "Incidente",
|
||||
"Question": "Questão",
|
||||
"Task": "Tarefas",
|
||||
"New": "Novidades",
|
||||
"Open": "Abertas",
|
||||
"Pending": "Pendente",
|
||||
"Hold": "Segurar",
|
||||
"Solved": "Resolvido",
|
||||
"Closed": "Fechado",
|
||||
"End User": "Usuário Final",
|
||||
"Agent": "Representante",
|
||||
"Admin": "Admin",
|
||||
"Groups": "grupos",
|
||||
"Assigned": "Atribuído",
|
||||
"Requested": "Solicitado",
|
||||
"Search by Name": "Pesquisar por nome",
|
||||
"Search by Domain": "Pesquisa por domínio",
|
||||
"Search by External ID": "Pesquisar por ID Externo",
|
||||
"Search by Tag": "Pesquisar por Tag",
|
||||
"Search by Details": "Busca por Detalhes",
|
||||
"Relevance (Default)": "Relevância (Padrão)",
|
||||
"Created Date": "Data de Criação",
|
||||
"Updated Date": "Data de atualização",
|
||||
"Descending (Default)": "Descendente (Padrão)",
|
||||
"Ascending": "Crescente",
|
||||
"Search by Ticket ID": "Pesquisar por ID do Ticket",
|
||||
"Search by Status": "Pesquisar por status",
|
||||
"Search by Priority": "Pesquisar por prioridade",
|
||||
"Search by Type": "Pesquisar por tipo",
|
||||
"Search by Requester Email": "Pesquisar por E-mail do Solicitador",
|
||||
"Search by Assignee Email": "Pesquisar por E-mail do Responsável",
|
||||
"Search by Subject/Content": "Pesquisar por assunto/conteúdo",
|
||||
"Ticket Type": "Tipo de Ticket",
|
||||
"Search by Email": "Pesquisar por e-mail",
|
||||
"Search by Role": "Pesquisar por função",
|
||||
"Search by Organization": "Pesquisar por organização",
|
||||
"GET": "OBTER",
|
||||
"POST": "POSTAR",
|
||||
"PATCH": "COMPRAR",
|
||||
"PUT": "COLOCAR",
|
||||
"DELETE": "EXCLUIR",
|
||||
"HEAD": "CABEÇA",
|
||||
"New ticket in view": "Novo ticket em visualização",
|
||||
"New Ticket": "Novo Ticket",
|
||||
"Updated Ticket": "Ticket atualizado",
|
||||
"Tag Added to Ticket": "Tag adicionada ao Ticket",
|
||||
"New Organization": "Nova organização",
|
||||
"New User": "Novo Usuário",
|
||||
"New Suspended Ticket": "Novo Ticket Suspenso",
|
||||
"New Action on Ticket": "Nova Ação no Ticket",
|
||||
"Triggers when a new ticket is created in a view": "Aciona quando um novo ticket é criado em uma view",
|
||||
"Fires when a new ticket is created (optionally filtered by organization). Requires a Zendesk Trigger with Notify active webhook.": "Atira quando um novo ticket é criado (opcionalmente filtrado por organização). Requer um Disparo Zendesk com Notificar webhook ativo.",
|
||||
"Fires when an existing ticket is updated. Requires a Zendesk Trigger with Notify active webhook.": "Atira quando um ticket existente é atualizado. Requer um gatilho Zendesk com Notificar webhook ativo.",
|
||||
"Fires when a ticket update includes the specified tag. Requires a Zendesk Trigger with Notify active webhook.": "Atira quando uma atualização de ticket inclui a tag especificada. Requer um gatilho de Zendesk com Notificar webhook ativo.",
|
||||
"Fires when a new organization record is created. Uses Zendesk event webhook (no Trigger needed).": "Atira quando um novo registro de organização é criado. Usa o webhook de evento Zendesk (nenhum gatilho necessário).",
|
||||
"Fires when a new user is created. Uses Zendesk event webhook (no Trigger needed).": "Aciona quando um novo usuário é criado. Usa webhook de evento do Zendesk (nenhum gatilho é necessário).",
|
||||
"Fires when a ticket is suspended. Requires a Zendesk Trigger with Notify active webhook. Suspended tickets auto-delete after 14 days.": "Atira quando um ticket está suspenso. Requer um gatilho Zendesk com Notificar webhook ativo. Chamados suspensos serão excluídos automaticamente após 14 dias.",
|
||||
"Fires when the specified ticket updates. Requires a Zendesk Trigger with Notify active webhook.": "Atira quando as atualizações especificadas do ticket. Requer um gatilho Zendesk com Notificar webhook ativo.",
|
||||
"View": "Visualizar",
|
||||
"Organization (Optional)": "Organização (opcional)",
|
||||
"Specific Tag (Optional)": "Tag Específica (opcional)",
|
||||
"User Role (Optional)": "Função do Usuário (Opcional)",
|
||||
"Organization ID Filter (Optional)": "Filtro de ID da organização (opcional)",
|
||||
"The view to monitor for new tickets": "A visualização para monitorar novos tickets",
|
||||
"Filter tickets by organization. Leave empty to trigger for all organizations.": "Filtrar tickets por organização. Deixe em branco para acionar para todas as organizações.",
|
||||
"Only trigger when this specific tag is added. Leave empty to trigger for any tag addition.": "Somente é acionado quando esta tag específica é adicionada. Deixe em branco para acionar em qualquer adição de tag.",
|
||||
"Filter users by role. Leave empty to trigger for all user types.": "Filtrar usuários por papel. Deixe em branco para acionar todos os tipos de usuário.",
|
||||
"Only trigger for tickets from this organization ID. Leave empty for all organizations.": "Acionar somente tickets de ID desta organização. Deixe em branco para todas as organizações.",
|
||||
"The specific ticket ID to monitor for actions/events.": "O ID do ticket específico para monitorar ações e eventos.",
|
||||
"All Roles": "Todas as funções"
|
||||
}
|
||||
@@ -0,0 +1,303 @@
|
||||
{
|
||||
"Zendesk": "Зендеск",
|
||||
"Customer service software and support ticket system": "Программное обеспечение обслуживания клиентов и система поддержки заявок",
|
||||
"Agent Email": "E-mail Агента",
|
||||
"Token": "Токен",
|
||||
"Organization (e.g activepieceshelp)": "Организация (например, активная помощь)",
|
||||
"The email address you use to login to Zendesk": "Адрес электронной почты, который вы используете для входа в Zendesk",
|
||||
"The API token you can generate in Zendesk": "API-токен, который вы можете сгенерировать в Zendesk",
|
||||
"The subdomain of your Zendesk instance": "Поддомен вашего экземпляра Zendesk",
|
||||
"\n**Organization**: The organization name can be found in the URL (e.g https://ORGANIZATION_NAME.zendesk.com).\n\n**Agent Email**: The email you use to log in to Zendesk.\n\n**API Token**: You can find this in the Zendesk Admin Panel under Settings > APIs > Zendesk API.\n": "\n**Организация**: Название организации можно найти в URL (например, https://ORGANIZATION_NAME.\n\n**E-mail агента**: Электронная почта, которую вы используете для входа в Zendesk.\n\n**API Token**: Вы можете найти это в панели администратора Zendesk в Настройки > API > Zendesk API.\n",
|
||||
"Create Ticket": "Создать тикет",
|
||||
"Update Ticket": "Обновить тикет",
|
||||
"Add Tag to Ticket": "Добавить Тег в Заявку",
|
||||
"Add Comment to Ticket": "Добавить комментарий к заявке",
|
||||
"Create Organization": "Создать организацию",
|
||||
"Update Organization": "Обновить организацию",
|
||||
"Create User": "Создать пользователя",
|
||||
"Delete User": "Удалить пользователя",
|
||||
"Find Organization(s)": "Найти организации(и)",
|
||||
"Find Ticket(s)": "Найти тикет (ы)",
|
||||
"Find User(s)": "Найти Пользователей",
|
||||
"Custom API Call": "Пользовательский вызов API",
|
||||
"Create a new ticket in Zendesk.": "Создать новый запрос в Zendesk.",
|
||||
"Modify ticket fields or status via API call.": "Изменение полей заявки или статуса при помощи API вызова.",
|
||||
"Apply one or more tags to a ticket.": "Применить один или несколько тегов к Заявке.",
|
||||
"Append a public/private comment to a ticket.": "Добавить публичный или приватный комментарий к заявке.",
|
||||
"Create a new organization record.": "Создать новую запись организации.",
|
||||
"Update existing organization fields.": "Обновить существующие поля организации.",
|
||||
"Add a new user to the Zendesk instance.": "Добавить нового пользователя в экземпляр Zendesk.",
|
||||
"Remove a user and associated records from the account.": "Удалить пользователя и связанные с ним записи из учетной записи.",
|
||||
"Search organizations by name, domain, external ID, or other criteria.": "Поиск организаций по имени, домену, внешнему ID или другим критериям.",
|
||||
"Search tickets by ID, field, or content.": "Поиск заявок по ID, полу или содержимому.",
|
||||
"Search users by email, name, role, or other criteria.": "Поиск пользователей по электронной почте, имени, роли или другим критериям.",
|
||||
"Make a custom API call to a specific endpoint": "Сделать пользовательский API вызов к определенной конечной точке",
|
||||
"Subject": "Тема",
|
||||
"Comment Body": "Тело комментария",
|
||||
"Comment HTML Body": "HTML-текст комментария",
|
||||
"Requester Email": "Электронная почта запроса",
|
||||
"Requester Name": "Имя запроса",
|
||||
"Assignee Email": "Assignee Email",
|
||||
"Priority": "Приоритет",
|
||||
"Type": "Тип",
|
||||
"Status": "Status",
|
||||
"Tags": "Теги",
|
||||
"Organization": "Организация",
|
||||
"Group": "Группа",
|
||||
"External ID": "Внешний ID",
|
||||
"Collaborator Emails": "Письма соавтора",
|
||||
"Follower Emails": "Письма из папки",
|
||||
"Due Date": "Срок сдачи",
|
||||
"Custom Fields": "Пользовательские поля",
|
||||
"Public Comment": "Публичный комментарий",
|
||||
"Brand": "Бренд",
|
||||
"Forum Topic ID": "ID темы форума",
|
||||
"Problem Ticket": "Задача тикета",
|
||||
"Ticket": "Билет",
|
||||
"Custom Status ID": "ID статуса пользователя",
|
||||
"Safe Update": "Безопасное обновление",
|
||||
"Updated Timestamp": "Обновлена метка времени",
|
||||
"Author Email": "Email автора",
|
||||
"Attachment Tokens": "Маркеры вложения",
|
||||
"Via Followup Source ID": "Через последующий исходный ID",
|
||||
"Organization Name": "Название организации",
|
||||
"Details": "Детали",
|
||||
"Notes": "Примечания",
|
||||
"Domain Names": "Доменные имена",
|
||||
"Organization Fields": "Поля организации",
|
||||
"Shared Tickets": "Общие Заявки",
|
||||
"Shared Comments": "Общие комментарии",
|
||||
"Name": "Наименование",
|
||||
"Email": "Почта",
|
||||
"Role": "Роль",
|
||||
"Custom Role": "Настраиваемая роль",
|
||||
"Phone": "Телефон",
|
||||
"Alias": "Alias",
|
||||
"Time Zone": "Часовой пояс",
|
||||
"Locale": "Язык",
|
||||
"Verified": "Подтверждено",
|
||||
"Active": "Активен",
|
||||
"Shared": "Общий доступ",
|
||||
"Shared Agent": "Общий Агент",
|
||||
"Moderator": "Модератор",
|
||||
"Suspended": "Приостановлен",
|
||||
"Restricted Agent": "Ограниченный агент",
|
||||
"Only Private Comments": "Только приватные комментарии",
|
||||
"Report CSV": "CSV отчёта",
|
||||
"Skip Verify Email": "Пропустить проверку E-mail",
|
||||
"Ticket Restriction": "Ограничение Заявки",
|
||||
"Signature": "Подпись",
|
||||
"Agent Brand Access": "Доступ к бренду агента",
|
||||
"User Fields": "Поля пользователя",
|
||||
"Identities": "Идентификаторы",
|
||||
"User": "Пользователь",
|
||||
"Confirm Deletion": "Подтвердите удаление",
|
||||
"Search Type": "Тип поиска",
|
||||
"Domain": "Домен",
|
||||
"Tag": "Тег",
|
||||
"Custom Query": "Пользовательский запрос",
|
||||
"Sort By": "Сортировать по",
|
||||
"Sort Order": "Порядок сортировки",
|
||||
"Ticket ID": "ID заявки",
|
||||
"Content": "Содержание",
|
||||
"Email Address": "Email Address",
|
||||
"Method": "Метод",
|
||||
"Headers": "Заголовки",
|
||||
"Query Parameters": "Параметры запроса",
|
||||
"Body": "Тело",
|
||||
"No Error on Failure": "Нет ошибок при ошибке",
|
||||
"Timeout (in seconds)": "Таймаут (в секундах)",
|
||||
"The subject of the ticket (optional - will use first comment text if not provided)": "Тема заявки (опционально - будет использовать первый текст комментария, если не указано)",
|
||||
"The comment body (text). Use this for plain text comments.": "Тело комментария (текст). Используйте это для текстовых комментариев.",
|
||||
"The comment body (HTML). Use this for HTML formatted comments. If provided, this takes precedence over Comment Body.": "Тело комментария (HTML). Используйте это для HTML-отформатированных комментариев. Если указано, это занимает приоритет над телом комментария.",
|
||||
"Email address of the ticket requester. If not provided, the authenticated user will be the requester.": "Адрес электронной почты инициатора заявки. Если не указано, то авторизованный пользователь будет инициатором.",
|
||||
"Name of the ticket requester (used when creating a new user).": "Имя инициатора заявки (используется при создании нового пользователя).",
|
||||
"Email address of the agent to assign the ticket to.": "Адрес электронной почты агента для назначения заявки.",
|
||||
"The priority of the ticket.": "Приоритет Заявки.",
|
||||
"The type of ticket.": "Тип заявки.",
|
||||
"The status of the ticket.": "Статус Заявки.",
|
||||
"Array of tags to apply to the ticket.": "Массив тегов, применяемых к заявке.",
|
||||
"Select the organization to work with": "Выберите организацию для работы с",
|
||||
"Select the group to assign": "Выберите группу для назначения",
|
||||
"An external ID for the ticket (useful for integrations).": "Внешний ID заявки (полезно для интеграции).",
|
||||
"Array of email addresses to add as collaborators.": "Массив адресов электронной почты для добавления в качестве соавторов.",
|
||||
"Array of email addresses to add as followers.": "Массив email адресов для добавления в качестве подписчиков.",
|
||||
"The date and time when the ticket is due.": "Дата и время, когда билет присваивается.",
|
||||
"Custom ticket field values": "Пользовательские значения поля заявки",
|
||||
"Whether the comment is public (visible to the requester). Defaults to true.": "Является ли комментарий публичным (видимым для инициатора). По умолчанию верно.",
|
||||
"Select the brand to work with": "Выберите бренд для работы с",
|
||||
"The ID of the forum topic associated with the ticket.": "ID темы форума, связанной с заявкой.",
|
||||
"Select the problem ticket this ticket is an incident of": "Выберите заявку для этой задачи - инцидент из",
|
||||
"Select the ticket to work with": "Выберите тикет для работы с",
|
||||
"Update the subject of the ticket": "Обновить тему заявки",
|
||||
"Add a comment to the ticket (plain text)": "Добавить комментарий к заявке (простой текст)",
|
||||
"Add a comment to the ticket (HTML). If provided, this takes precedence over Comment Body.": "Добавьте комментарий к заявке (HTML). Если указано, это имеет приоритет над телом комментария.",
|
||||
"Email address of the agent to assign the ticket to": "Адрес электронной почты агента для назначения заявки",
|
||||
"Update the priority of the ticket": "Обновить приоритет заявки",
|
||||
"Update the type of ticket": "Обновить тип заявки",
|
||||
"Update the status of the ticket": "Обновить статус заявки",
|
||||
"Replace all tags with this array. Use \"Add Tag to Ticket\" action to add tags without replacing existing ones.": "Замените все теги этим массивом. Используйте действие \"Добавить тег в Заявку\" для добавления тегов без замены существующих.",
|
||||
"Update the external ID for the ticket": "Обновить внешний ID для заявки",
|
||||
"Update the date and time when the ticket is due": "Обновить дату и время выполнения заявки",
|
||||
"Update custom ticket field values": "Обновить значения поля заявки",
|
||||
"Set a custom status ID for the ticket": "Установка ID статуса для заявки",
|
||||
"Update the forum topic associated with the ticket": "Обновить тему форума, связанную с заявкой",
|
||||
"Replace collaborators with this array of email addresses": "Заменить соавторов этим массивом адресов электронной почты",
|
||||
"Replace followers with this array of email addresses": "Заменить подписчиков этим массивом email адресов",
|
||||
"Update the requester of the ticket": "Обновить инициатора заявки",
|
||||
"Prevent update collisions by checking timestamp": "Предотвратить обновление столкновений путем проверки времени",
|
||||
"Ticket timestamp from updated_at field for collision prevention": "Отметка времени от обновлённого _в поле для предотвращения столкновений",
|
||||
"Tags to add to the ticket (adds to existing tags)": "Теги для добавления в Заявку (добавляет к существующим тегам)",
|
||||
"Prevent tag loss from concurrent updates": "Предотвратить потерю тегов от одновременных обновлений",
|
||||
"The comment text content": "Содержание текста комментария",
|
||||
"HTML formatted comment (takes precedence over text)": "HTML-отформатированный комментарий (имеет приоритет над текстом)",
|
||||
"Make comment visible to requester (default: true)": "Сделать комментарий видимым для инициатора (по умолчанию: true)",
|
||||
"Email of comment author (defaults to authenticated user)": "Email автора комментария (по умолчанию авторизованный пользователь)",
|
||||
"Upload tokens for file attachments": "Загрузить токены для прикрепленных файлов",
|
||||
"Original ticket ID if this is from a follow-up": "Оригинальный ID заявки, если это от последующего",
|
||||
"Unique name for the organization": "Уникальное имя организации",
|
||||
"Additional details about the organization": "Дополнительные сведения об организации",
|
||||
"Internal notes about the organization": "Внутренние заметки об организации",
|
||||
"External ID for integration purposes": "Внешний ID для целей интеграции",
|
||||
"Domain names associated with the organization": "Доменные имена, связанные с организацией",
|
||||
"Tags to apply to the organization": "Теги, применяемые к организации",
|
||||
"Custom organization field values": "Пользовательские значения поля организации",
|
||||
"Allow users to see each other's tickets": "Разрешить пользователям видеть заявки друг друга",
|
||||
"Allow users to see each other's comments": "Разрешить пользователям видеть комментарии друг друга",
|
||||
"New name for the organization (must be unique)": "Новое имя организации (должно быть уникальным)",
|
||||
"Domain names for the organization (replaces all existing)": "Доменные имена для организации (заменяет все существующие)",
|
||||
"Tags for the organization (replaces all existing)": "Теги для организации (заменяют все существующие)",
|
||||
"The name of the user": "Имя пользователя",
|
||||
"The primary email address of the user": "Основной адрес электронной почты пользователя",
|
||||
"The role of the user. Defaults to \"end-user\" if not specified.": "Роль пользователя. По умолчанию «конечный пользователь», если не указано.",
|
||||
"Select the custom role for the agent": "Выберите пользовательскую роль для агента",
|
||||
"Create and associate user with a new organization by name (alternative to Organization ID)": "Создавать и ассоциировать пользователя с новой организацией по имени (альтернатива идентификатору организации)",
|
||||
"The phone number of the user": "Номер телефона пользователя",
|
||||
"An alias displayed to end users": "Псевдоним для конечных пользователей",
|
||||
"Additional details about the user": "Дополнительные сведения о пользователе",
|
||||
"Internal notes about the user": "Внутренние заметки о пользователе",
|
||||
"A unique external ID for the user (useful for integrations)": "Уникальный внешний ID пользователя (полезен для интеграции)",
|
||||
"The time zone of the user (e.g., \"America/New_York\")": "Часовой пояс пользователя (например, \"Америка/Нью-Йорк\")",
|
||||
"The locale of the user (e.g., \"en-US\")": "Локаль пользователя (например, \"ru-US\")",
|
||||
"Whether the user is verified": "Проверяется ли пользователь",
|
||||
"Whether the user is active. Defaults to true.": "Является ли пользователь активным. По умолчанию истинным.",
|
||||
"Whether the user is shared from a different Zendesk Support instance": "Относится ли пользователь к другому серверу поддержки Zendesk",
|
||||
"Whether the user is a shared agent from a different Zendesk Support instance": "Является ли пользователь общим агентом из другой версии поддержки Zendesk",
|
||||
"Whether the user has forum moderation capabilities": "Есть ли у пользователя возможности модерации форума",
|
||||
"Whether the user is suspended": "Является ли пользователь заблокированным",
|
||||
"Whether the agent has restrictions on what tickets they can access": "Имеет ли агент ограничения на доступ к заявкам",
|
||||
"Whether the user can only create private comments": "Может ли пользователь создавать только приватные комментарии",
|
||||
"Whether the user can access CSV reports": "Может ли пользователь получить доступ к отчётам CSV",
|
||||
"Skip sending a verification email to the user": "Пропустить отправку письма с подтверждением пользователю",
|
||||
"The ticket restriction for the user": "Ограничение заявки для пользователя",
|
||||
"The user's signature for email responses": "Подпись пользователя для ответов по электронной почте",
|
||||
"Select the brands that the agent can access (for agents only)": "Выберите бренды, которые агент может получить доступ (только для агентов)",
|
||||
"Array of tags to apply to the user": "Массив тегов, применяемых к пользователю",
|
||||
"Custom user field values": "Пользовательские значения полей пользователя",
|
||||
"Array of identity objects with type and value. Example: [{\"type\": \"email\", \"value\": \"test@user.com\"}, {\"type\": \"twitter\", \"value\": \"username\"}]": "Массив идентификационных объектов с типом и значением. Пример: [{\"type\": \"email\", \"value\": \"test@user.com\"}, {\"type\": \"twitter\", \"value\": \"username\"}]",
|
||||
"Select the user to work with": "Выберите пользователя для работы с",
|
||||
"I understand that deleted users are not recoverable and this action cannot be undone.": "Я понимаю, что удаленные пользователи не могут быть восстановлены, и это действие не может быть отменено.",
|
||||
"Choose how to search for organizations": "Выберите, как искать организации",
|
||||
"The name of the organization to search for": "Название организации для поиска",
|
||||
"Search organizations by domain name": "Поиск организаций по доменному имени",
|
||||
"Search organizations by external ID": "Поиск организаций по внешнему ID",
|
||||
"Search organizations containing this tag": "Поиск организаций, содержащих этот тег",
|
||||
"Search in organization details/notes": "Поиск в деталях организации/заметках",
|
||||
"Custom search query using Zendesk search syntax (e.g., \"type:organization domain:example.com\")": "Пользовательский поисковый запрос с помощью синтаксиса поиска Zendesk (например, \"type:organization domain:example.com\")",
|
||||
"How to sort the results": "Как сортировать результаты",
|
||||
"Sort order for results": "Порядок сортировки для результатов",
|
||||
"Choose how to search for tickets": "Выберите, как искать заявки",
|
||||
"The ID of the ticket to find": "ID заявки для поиска",
|
||||
"Search tickets by status": "Поиск заявок по статусу",
|
||||
"Search tickets by priority": "Поиск заявок по приоритету",
|
||||
"Search tickets by type": "Искать заявки по типу",
|
||||
"Search tickets containing this tag": "Поиск заявок, содержащих этот тег",
|
||||
"Search tickets by requester email address": "Искать заявки по email запросу",
|
||||
"Search tickets by assignee email address": "Искать заявки по email назначенного",
|
||||
"Search in ticket subject and content": "Поиск в теме и содержании заявки",
|
||||
"Custom search query using Zendesk search syntax (e.g., \"type:ticket status:open priority:high\")": "Пользовательский поисковый запрос с использованием синтаксиса поиска Zendesk (например, \"type:Ticket status:open priority:high\")",
|
||||
"Choose how to search for users": "Выберите способ поиска пользователей",
|
||||
"The email address of the user to search for": "Адрес электронной почты пользователя для поиска",
|
||||
"The name of the user to search for": "Имя пользователя, для поиска",
|
||||
"Search users by role": "Поиск пользователей по ролям",
|
||||
"Search users by organization name": "Поиск пользователей по названию организации",
|
||||
"Search users containing this tag": "Поиск пользователей, содержащих этот тег",
|
||||
"Search users by external ID": "Поиск пользователей по внешнему ID",
|
||||
"Custom search query using Zendesk search syntax (e.g., \"type:user role:agent\")": "Пользовательский поисковый запрос с помощью синтаксиса поиска Zendesk (например, \"type:user role:agent\")",
|
||||
"Authorization headers are injected automatically from your connection.": "Заголовки авторизации включаются автоматически из вашего соединения.",
|
||||
"Low": "Низкий",
|
||||
"Normal": "Обычный",
|
||||
"High": "Высокий",
|
||||
"Urgent": "Срочно",
|
||||
"Problem": "Проблема",
|
||||
"Incident": "Инцидент",
|
||||
"Question": "Вопрос",
|
||||
"Task": "Задача",
|
||||
"New": "Новый",
|
||||
"Open": "Открыть",
|
||||
"Pending": "В ожидании",
|
||||
"Hold": "Удерживать",
|
||||
"Solved": "Решено",
|
||||
"Closed": "Закрыто",
|
||||
"End User": "Конечный пользователь",
|
||||
"Agent": "Агент",
|
||||
"Admin": "Admin",
|
||||
"Groups": "Группы",
|
||||
"Assigned": "Назначено",
|
||||
"Requested": "Запрошено",
|
||||
"Search by Name": "Поиск по названию",
|
||||
"Search by Domain": "Поиск по домену",
|
||||
"Search by External ID": "Поиск по внешнему ID",
|
||||
"Search by Tag": "Поиск по тегу",
|
||||
"Search by Details": "Поиск по деталям",
|
||||
"Relevance (Default)": "Релевантность (по умолчанию)",
|
||||
"Created Date": "Дата создания",
|
||||
"Updated Date": "Дата обновления",
|
||||
"Descending (Default)": "По убыванию (по умолчанию)",
|
||||
"Ascending": "По возрастанию",
|
||||
"Search by Ticket ID": "Поиск по ID Заявки",
|
||||
"Search by Status": "Поиск по статусу",
|
||||
"Search by Priority": "Поиск по приоритету",
|
||||
"Search by Type": "Поиск по типу",
|
||||
"Search by Requester Email": "Поиск по электронной почте запроса",
|
||||
"Search by Assignee Email": "Поиск по Email Назначенному",
|
||||
"Search by Subject/Content": "Поиск по теме/содержимому",
|
||||
"Ticket Type": "Тип заявки",
|
||||
"Search by Email": "Поиск по email",
|
||||
"Search by Role": "Поиск по роли",
|
||||
"Search by Organization": "Поиск по организации",
|
||||
"GET": "ПОЛУЧИТЬ",
|
||||
"POST": "ПОСТ",
|
||||
"PATCH": "ПАТЧ",
|
||||
"PUT": "ПОКУПИТЬ",
|
||||
"DELETE": "УДАЛИТЬ",
|
||||
"HEAD": "HEAD",
|
||||
"New ticket in view": "Новая заявка в просмотре",
|
||||
"New Ticket": "Новая заявка",
|
||||
"Updated Ticket": "Обновлена заявка",
|
||||
"Tag Added to Ticket": "Тег добавлен в заявку",
|
||||
"New Organization": "Новая организация",
|
||||
"New User": "Новый пользователь",
|
||||
"New Suspended Ticket": "Новая приостановленная заявка",
|
||||
"New Action on Ticket": "Новое действие в тикете",
|
||||
"Triggers when a new ticket is created in a view": "Триггеры при создании новой Заявки в виде",
|
||||
"Fires when a new ticket is created (optionally filtered by organization). Requires a Zendesk Trigger with Notify active webhook.": "Вызывает, когда создается новая Заявка (опционально фильтрованная по организации). Требует срабатывание Zendesk с уведомлением об активном вебхуке.",
|
||||
"Fires when an existing ticket is updated. Requires a Zendesk Trigger with Notify active webhook.": "Вызывает, когда существующая Заявка обновлена. Требует срабатывания Zendesk с уведомлением об активном webhook.",
|
||||
"Fires when a ticket update includes the specified tag. Requires a Zendesk Trigger with Notify active webhook.": "Вызывает, когда обновление заявки включает указанный тег. Требует Zendesk триггер с уведомлением об активном вебхуке.",
|
||||
"Fires when a new organization record is created. Uses Zendesk event webhook (no Trigger needed).": "Оказывается, когда создается новая запись организации. Использует webhook события Zendesk (триггер не требуется).",
|
||||
"Fires when a new user is created. Uses Zendesk event webhook (no Trigger needed).": "Оказывается при создании нового пользователя. Использует webhook события Zendesk (триггер не требуется).",
|
||||
"Fires when a ticket is suspended. Requires a Zendesk Trigger with Notify active webhook. Suspended tickets auto-delete after 14 days.": "Вызывает, когда Заявка приостановлена. Требует срабатывания Zendesk с уведомлением об активном вебхуке. Подвесные заявки автоматически удаляются через 14 дней.",
|
||||
"Fires when the specified ticket updates. Requires a Zendesk Trigger with Notify active webhook.": "Запускает при указанном обновлении Заявки. Требует срабатывание Zendesk с уведомлением об активном webhook.",
|
||||
"View": "View",
|
||||
"Organization (Optional)": "Организация (необязательно)",
|
||||
"Specific Tag (Optional)": "Особый тег (необязательно)",
|
||||
"User Role (Optional)": "Роль пользователя (необязательно)",
|
||||
"Organization ID Filter (Optional)": "Фильтр ID организации (необязательно)",
|
||||
"The view to monitor for new tickets": "Отображение для отслеживания новых заявок",
|
||||
"Filter tickets by organization. Leave empty to trigger for all organizations.": "Фильтр заявок по организации. Оставьте пустым для запуска всех организаций.",
|
||||
"Only trigger when this specific tag is added. Leave empty to trigger for any tag addition.": "Триггер только при добавлении этого тега. Оставьте пустым, чтобы сгенерировать любой тег добавления.",
|
||||
"Filter users by role. Leave empty to trigger for all user types.": "Фильтровать пользователей по ролям. Оставьте пустым для всех типов пользователей.",
|
||||
"Only trigger for tickets from this organization ID. Leave empty for all organizations.": "Триггер только для заявок из этого ID организации. Оставьте пустым для всех организаций.",
|
||||
"The specific ticket ID to monitor for actions/events.": "Идентификатор заявки для отслеживания действий/событий.",
|
||||
"All Roles": "Все роли"
|
||||
}
|
||||
@@ -0,0 +1,305 @@
|
||||
{
|
||||
"Customer service software and support ticket system": "Customer service software and support ticket system",
|
||||
"Agent Email": "Agent Email",
|
||||
"Token": "Token",
|
||||
"Organization (e.g activepieceshelp)": "Organization (e.g activepieceshelp)",
|
||||
"The email address you use to login to Zendesk": "The email address you use to login to Zendesk",
|
||||
"The API token you can generate in Zendesk": "The API token you can generate in Zendesk",
|
||||
"The subdomain of your Zendesk instance": "The subdomain of your Zendesk instance",
|
||||
"\n**Organization**: The organization name can be found in the URL (e.g https://ORGANIZATION_NAME.zendesk.com).\n\n**Agent Email**: The email you use to log in to Zendesk.\n\n**API Token**: You can find this in the Zendesk Admin Panel under Settings > APIs > Zendesk API.\n": "\n**Organization**: The organization name can be found in the URL (e.g https://ORGANIZATION_NAME.zendesk.com).\n\n**Agent Email**: The email you use to log in to Zendesk.\n\n**API Token**: You can find this in the Zendesk Admin Panel under Settings > APIs > Zendesk API.\n",
|
||||
"Create Ticket": "Create Ticket",
|
||||
"Update Ticket": "Update Ticket",
|
||||
"Add Tag to Ticket": "Add Tag to Ticket",
|
||||
"Add Comment to Ticket": "Add Comment to Ticket",
|
||||
"Create Organization": "Create Organization",
|
||||
"Update Organization": "Update Organization",
|
||||
"Create User": "Create User",
|
||||
"Delete User": "Delete User",
|
||||
"Find Organization(s)": "Find Organization(s)",
|
||||
"Find Ticket(s)": "Find Ticket(s)",
|
||||
"Find User(s)": "Find User(s)",
|
||||
"Custom API Call": "Custom API Call",
|
||||
"Create a new ticket in Zendesk.": "Create a new ticket in Zendesk.",
|
||||
"Modify ticket fields or status via API call.": "Modify ticket fields or status via API call.",
|
||||
"Apply one or more tags to a ticket.": "Apply one or more tags to a ticket.",
|
||||
"Append a public/private comment to a ticket.": "Append a public/private comment to a ticket.",
|
||||
"Create a new organization record.": "Create a new organization record.",
|
||||
"Update existing organization fields.": "Update existing organization fields.",
|
||||
"Add a new user to the Zendesk instance.": "Add a new user to the Zendesk instance.",
|
||||
"Remove a user and associated records from the account.": "Remove a user and associated records from the account.",
|
||||
"Search organizations by name, domain, external ID, or other criteria.": "Search organizations by name, domain, external ID, or other criteria.",
|
||||
"Search tickets by ID, field, or content.": "Search tickets by ID, field, or content.",
|
||||
"Search users by email, name, role, or other criteria.": "Search users by email, name, role, or other criteria.",
|
||||
"Make a custom API call to a specific endpoint": "Make a custom API call to a specific endpoint",
|
||||
"Subject": "Subject",
|
||||
"Comment Body": "Comment Body",
|
||||
"Comment HTML Body": "Comment HTML Body",
|
||||
"Requester Email": "Requester Email",
|
||||
"Requester Name": "Requester Name",
|
||||
"Assignee Email": "Assignee Email",
|
||||
"Priority": "Priority",
|
||||
"Type": "Type",
|
||||
"Status": "Status",
|
||||
"Tags": "Tags",
|
||||
"Organization": "Organization",
|
||||
"Group": "Group",
|
||||
"External ID": "External ID",
|
||||
"Collaborator Emails": "Collaborator Emails",
|
||||
"Follower Emails": "Follower Emails",
|
||||
"Due Date": "Due Date",
|
||||
"Custom Fields": "Custom Fields",
|
||||
"Public Comment": "Public Comment",
|
||||
"Brand": "Brand",
|
||||
"Forum Topic ID": "Forum Topic ID",
|
||||
"Problem Ticket": "Problem Ticket",
|
||||
"Ticket": "Ticket",
|
||||
"Custom Status ID": "Custom Status ID",
|
||||
"Safe Update": "Safe Update",
|
||||
"Updated Timestamp": "Updated Timestamp",
|
||||
"Author Email": "Author Email",
|
||||
"Attachment Tokens": "Attachment Tokens",
|
||||
"Via Followup Source ID": "Via Followup Source ID",
|
||||
"Organization Name": "Organization Name",
|
||||
"Details": "Details",
|
||||
"Notes": "Notes",
|
||||
"Domain Names": "Domain Names",
|
||||
"Organization Fields": "Organization Fields",
|
||||
"Shared Tickets": "Shared Tickets",
|
||||
"Shared Comments": "Shared Comments",
|
||||
"Name": "Name",
|
||||
"Email": "Email",
|
||||
"Role": "Role",
|
||||
"Custom Role": "Custom Role",
|
||||
"Phone": "Phone",
|
||||
"Alias": "Alias",
|
||||
"Time Zone": "Time Zone",
|
||||
"Locale": "Locale",
|
||||
"Verified": "Verified",
|
||||
"Active": "Active",
|
||||
"Shared": "Shared",
|
||||
"Shared Agent": "Shared Agent",
|
||||
"Moderator": "Moderator",
|
||||
"Suspended": "Suspended",
|
||||
"Restricted Agent": "Restricted Agent",
|
||||
"Only Private Comments": "Only Private Comments",
|
||||
"Report CSV": "Report CSV",
|
||||
"Skip Verify Email": "Skip Verify Email",
|
||||
"Ticket Restriction": "Ticket Restriction",
|
||||
"Signature": "Signature",
|
||||
"Agent Brand Access": "Agent Brand Access",
|
||||
"User Fields": "User Fields",
|
||||
"Identities": "Identities",
|
||||
"User": "User",
|
||||
"Confirm Deletion": "Confirm Deletion",
|
||||
"Search Type": "Search Type",
|
||||
"Domain": "Domain",
|
||||
"Tag": "Tag",
|
||||
"Custom Query": "Custom Query",
|
||||
"Sort By": "Sort By",
|
||||
"Sort Order": "Sort Order",
|
||||
"Date Time Filter": "Date Time Filter",
|
||||
"Ticket ID": "Ticket ID",
|
||||
"Content": "Content",
|
||||
"Email Address": "Email Address",
|
||||
"Method": "Method",
|
||||
"Headers": "Headers",
|
||||
"Query Parameters": "Query Parameters",
|
||||
"Body": "Body",
|
||||
"Response is Binary ?": "Response is Binary ?",
|
||||
"No Error on Failure": "No Error on Failure",
|
||||
"Timeout (in seconds)": "Timeout (in seconds)",
|
||||
"The subject of the ticket (optional - will use first comment text if not provided)": "The subject of the ticket (optional - will use first comment text if not provided)",
|
||||
"The comment body (text). Use this for plain text comments.": "The comment body (text). Use this for plain text comments.",
|
||||
"The comment body (HTML). Use this for HTML formatted comments. If provided, this takes precedence over Comment Body.": "The comment body (HTML). Use this for HTML formatted comments. If provided, this takes precedence over Comment Body.",
|
||||
"Email address of the ticket requester. If not provided, the authenticated user will be the requester.": "Email address of the ticket requester. If not provided, the authenticated user will be the requester.",
|
||||
"Name of the ticket requester (used when creating a new user).": "Name of the ticket requester (used when creating a new user).",
|
||||
"Email address of the agent to assign the ticket to.": "Email address of the agent to assign the ticket to.",
|
||||
"The priority of the ticket.": "The priority of the ticket.",
|
||||
"The type of ticket.": "The type of ticket.",
|
||||
"The status of the ticket.": "The status of the ticket.",
|
||||
"Array of tags to apply to the ticket.": "Array of tags to apply to the ticket.",
|
||||
"Select the organization to work with": "Select the organization to work with",
|
||||
"Select the group to assign": "Select the group to assign",
|
||||
"An external ID for the ticket (useful for integrations).": "An external ID for the ticket (useful for integrations).",
|
||||
"Array of email addresses to add as collaborators.": "Array of email addresses to add as collaborators.",
|
||||
"Array of email addresses to add as followers.": "Array of email addresses to add as followers.",
|
||||
"The date and time when the ticket is due.": "The date and time when the ticket is due.",
|
||||
"Custom ticket field values": "Custom ticket field values",
|
||||
"Whether the comment is public (visible to the requester). Defaults to true.": "Whether the comment is public (visible to the requester). Defaults to true.",
|
||||
"Select the brand to work with": "Select the brand to work with",
|
||||
"The ID of the forum topic associated with the ticket.": "The ID of the forum topic associated with the ticket.",
|
||||
"Select the problem ticket this ticket is an incident of": "Select the problem ticket this ticket is an incident of",
|
||||
"Select the ticket to work with": "Select the ticket to work with",
|
||||
"Update the subject of the ticket": "Update the subject of the ticket",
|
||||
"Add a comment to the ticket (plain text)": "Add a comment to the ticket (plain text)",
|
||||
"Add a comment to the ticket (HTML). If provided, this takes precedence over Comment Body.": "Add a comment to the ticket (HTML). If provided, this takes precedence over Comment Body.",
|
||||
"Email address of the agent to assign the ticket to": "Email address of the agent to assign the ticket to",
|
||||
"Update the priority of the ticket": "Update the priority of the ticket",
|
||||
"Update the type of ticket": "Update the type of ticket",
|
||||
"Update the status of the ticket": "Update the status of the ticket",
|
||||
"Replace all tags with this array. Use \"Add Tag to Ticket\" action to add tags without replacing existing ones.": "Replace all tags with this array. Use \"Add Tag to Ticket\" action to add tags without replacing existing ones.",
|
||||
"Update the external ID for the ticket": "Update the external ID for the ticket",
|
||||
"Update the date and time when the ticket is due": "Update the date and time when the ticket is due",
|
||||
"Update custom ticket field values": "Update custom ticket field values",
|
||||
"Set a custom status ID for the ticket": "Set a custom status ID for the ticket",
|
||||
"Update the forum topic associated with the ticket": "Update the forum topic associated with the ticket",
|
||||
"Replace collaborators with this array of email addresses": "Replace collaborators with this array of email addresses",
|
||||
"Replace followers with this array of email addresses": "Replace followers with this array of email addresses",
|
||||
"Update the requester of the ticket": "Update the requester of the ticket",
|
||||
"Prevent update collisions by checking timestamp": "Prevent update collisions by checking timestamp",
|
||||
"Ticket timestamp from updated_at field for collision prevention": "Ticket timestamp from updated_at field for collision prevention",
|
||||
"Tags to add to the ticket (adds to existing tags)": "Tags to add to the ticket (adds to existing tags)",
|
||||
"Prevent tag loss from concurrent updates": "Prevent tag loss from concurrent updates",
|
||||
"The comment text content": "The comment text content",
|
||||
"HTML formatted comment (takes precedence over text)": "HTML formatted comment (takes precedence over text)",
|
||||
"Make comment visible to requester (default: true)": "Make comment visible to requester (default: true)",
|
||||
"Email of comment author (defaults to authenticated user)": "Email of comment author (defaults to authenticated user)",
|
||||
"Upload tokens for file attachments": "Upload tokens for file attachments",
|
||||
"Original ticket ID if this is from a follow-up": "Original ticket ID if this is from a follow-up",
|
||||
"Unique name for the organization": "Unique name for the organization",
|
||||
"Additional details about the organization": "Additional details about the organization",
|
||||
"Internal notes about the organization": "Internal notes about the organization",
|
||||
"External ID for integration purposes": "External ID for integration purposes",
|
||||
"Domain names associated with the organization": "Domain names associated with the organization",
|
||||
"Tags to apply to the organization": "Tags to apply to the organization",
|
||||
"Custom organization field values": "Custom organization field values",
|
||||
"Allow users to see each other's tickets": "Allow users to see each other's tickets",
|
||||
"Allow users to see each other's comments": "Allow users to see each other's comments",
|
||||
"New name for the organization (must be unique)": "New name for the organization (must be unique)",
|
||||
"Domain names for the organization (replaces all existing)": "Domain names for the organization (replaces all existing)",
|
||||
"Tags for the organization (replaces all existing)": "Tags for the organization (replaces all existing)",
|
||||
"The name of the user": "The name of the user",
|
||||
"The primary email address of the user": "The primary email address of the user",
|
||||
"The role of the user. Defaults to \"end-user\" if not specified.": "The role of the user. Defaults to \"end-user\" if not specified.",
|
||||
"Select the custom role for the agent": "Select the custom role for the agent",
|
||||
"Create and associate user with a new organization by name (alternative to Organization ID)": "Create and associate user with a new organization by name (alternative to Organization ID)",
|
||||
"The phone number of the user": "The phone number of the user",
|
||||
"An alias displayed to end users": "An alias displayed to end users",
|
||||
"Additional details about the user": "Additional details about the user",
|
||||
"Internal notes about the user": "Internal notes about the user",
|
||||
"A unique external ID for the user (useful for integrations)": "A unique external ID for the user (useful for integrations)",
|
||||
"The time zone of the user (e.g., \"America/New_York\")": "The time zone of the user (e.g., \"America/New_York\")",
|
||||
"The locale of the user (e.g., \"en-US\")": "The locale of the user (e.g., \"en-US\")",
|
||||
"Whether the user is verified": "Whether the user is verified",
|
||||
"Whether the user is active. Defaults to true.": "Whether the user is active. Defaults to true.",
|
||||
"Whether the user is shared from a different Zendesk Support instance": "Whether the user is shared from a different Zendesk Support instance",
|
||||
"Whether the user is a shared agent from a different Zendesk Support instance": "Whether the user is a shared agent from a different Zendesk Support instance",
|
||||
"Whether the user has forum moderation capabilities": "Whether the user has forum moderation capabilities",
|
||||
"Whether the user is suspended": "Whether the user is suspended",
|
||||
"Whether the agent has restrictions on what tickets they can access": "Whether the agent has restrictions on what tickets they can access",
|
||||
"Whether the user can only create private comments": "Whether the user can only create private comments",
|
||||
"Whether the user can access CSV reports": "Whether the user can access CSV reports",
|
||||
"Skip sending a verification email to the user": "Skip sending a verification email to the user",
|
||||
"The ticket restriction for the user": "The ticket restriction for the user",
|
||||
"The user's signature for email responses": "The user's signature for email responses",
|
||||
"Select the brands that the agent can access (for agents only)": "Select the brands that the agent can access (for agents only)",
|
||||
"Array of tags to apply to the user": "Array of tags to apply to the user",
|
||||
"Custom user field values": "Custom user field values",
|
||||
"Array of identity objects with type and value. Example: [{\"type\": \"email\", \"value\": \"test@user.com\"}, {\"type\": \"twitter\", \"value\": \"username\"}]": "Array of identity objects with type and value. Example: [{\"type\": \"email\", \"value\": \"test@user.com\"}, {\"type\": \"twitter\", \"value\": \"username\"}]",
|
||||
"Select the user to work with": "Select the user to work with",
|
||||
"I understand that deleted users are not recoverable and this action cannot be undone.": "I understand that deleted users are not recoverable and this action cannot be undone.",
|
||||
"Choose how to search for organizations": "Choose how to search for organizations",
|
||||
"The name of the organization to search for": "The name of the organization to search for",
|
||||
"Search organizations by domain name": "Search organizations by domain name",
|
||||
"Search organizations by external ID": "Search organizations by external ID",
|
||||
"Search organizations containing this tag": "Search organizations containing this tag",
|
||||
"Search in organization details/notes": "Search in organization details/notes",
|
||||
"Custom search query using Zendesk search syntax (e.g., \"type:organization domain:example.com\")": "Custom search query using Zendesk search syntax (e.g., \"type:organization domain:example.com\")",
|
||||
"How to sort the results": "How to sort the results",
|
||||
"Sort order for results": "Sort order for results",
|
||||
"Choose how to search for tickets": "Choose how to search for tickets",
|
||||
"The ID of the ticket to find": "The ID of the ticket to find",
|
||||
"Search tickets by status": "Search tickets by status",
|
||||
"Search tickets by priority": "Search tickets by priority",
|
||||
"Search tickets by type": "Search tickets by type",
|
||||
"Search tickets containing this tag": "Search tickets containing this tag",
|
||||
"Search tickets by requester email address": "Search tickets by requester email address",
|
||||
"Search tickets by assignee email address": "Search tickets by assignee email address",
|
||||
"Search in ticket subject and content": "Search in ticket subject and content",
|
||||
"Custom search query using Zendesk search syntax (e.g., \"type:ticket status:open priority:high\")": "Custom search query using Zendesk search syntax (e.g., \"type:ticket status:open priority:high\")",
|
||||
"Choose how to search for users": "Choose how to search for users",
|
||||
"The email address of the user to search for": "The email address of the user to search for",
|
||||
"The name of the user to search for": "The name of the user to search for",
|
||||
"Search users by role": "Search users by role",
|
||||
"Search users by organization name": "Search users by organization name",
|
||||
"Search users containing this tag": "Search users containing this tag",
|
||||
"Search users by external ID": "Search users by external ID",
|
||||
"Custom search query using Zendesk search syntax (e.g., \"type:user role:agent\")": "Custom search query using Zendesk search syntax (e.g., \"type:user role:agent\")",
|
||||
"Authorization headers are injected automatically from your connection.": "Authorization headers are injected automatically from your connection.",
|
||||
"Enable for files like PDFs, images, etc..": "Enable for files like PDFs, images, etc..",
|
||||
"Low": "Low",
|
||||
"Normal": "Normal",
|
||||
"High": "High",
|
||||
"Urgent": "Urgent",
|
||||
"Problem": "Problem",
|
||||
"Incident": "Incident",
|
||||
"Question": "Question",
|
||||
"Task": "Task",
|
||||
"New": "New",
|
||||
"Open": "Open",
|
||||
"Pending": "Pending",
|
||||
"Hold": "Hold",
|
||||
"Solved": "Solved",
|
||||
"Closed": "Closed",
|
||||
"End User": "End User",
|
||||
"Agent": "Agent",
|
||||
"Admin": "Admin",
|
||||
"Groups": "Groups",
|
||||
"Assigned": "Assigned",
|
||||
"Requested": "Requested",
|
||||
"Search by Name": "Search by Name",
|
||||
"Search by Domain": "Search by Domain",
|
||||
"Search by External ID": "Search by External ID",
|
||||
"Search by Tag": "Search by Tag",
|
||||
"Search by Details": "Search by Details",
|
||||
"Relevance (Default)": "Relevance (Default)",
|
||||
"Created Date": "Created Date",
|
||||
"Updated Date": "Updated Date",
|
||||
"Descending (Default)": "Descending (Default)",
|
||||
"Ascending": "Ascending",
|
||||
"Search by Ticket ID": "Search by Ticket ID",
|
||||
"Search by Status": "Search by Status",
|
||||
"Search by Priority": "Search by Priority",
|
||||
"Search by Type": "Search by Type",
|
||||
"Search by Requester Email": "Search by Requester Email",
|
||||
"Search by Assignee Email": "Search by Assignee Email",
|
||||
"Search by Subject/Content": "Search by Subject/Content",
|
||||
"Ticket Type": "Ticket Type",
|
||||
"Search by Email": "Search by Email",
|
||||
"Search by Role": "Search by Role",
|
||||
"Search by Organization": "Search by Organization",
|
||||
"GET": "GET",
|
||||
"POST": "POST",
|
||||
"PATCH": "PATCH",
|
||||
"PUT": "PUT",
|
||||
"DELETE": "DELETE",
|
||||
"HEAD": "HEAD",
|
||||
"New ticket in view": "New ticket in view",
|
||||
"New Ticket": "New Ticket",
|
||||
"Updated Ticket": "Updated Ticket",
|
||||
"Tag Added to Ticket": "Tag Added to Ticket",
|
||||
"New Organization": "New Organization",
|
||||
"New User": "New User",
|
||||
"New Suspended Ticket": "New Suspended Ticket",
|
||||
"New Action on Ticket": "New Action on Ticket",
|
||||
"Triggers when a new ticket is created in a view": "Triggers when a new ticket is created in a view",
|
||||
"Fires when a new ticket is created (optionally filtered by organization). Requires a Zendesk Trigger with Notify active webhook.": "Fires when a new ticket is created (optionally filtered by organization). Requires a Zendesk Trigger with Notify active webhook.",
|
||||
"Fires when an existing ticket is updated. Requires a Zendesk Trigger with Notify active webhook.": "Fires when an existing ticket is updated. Requires a Zendesk Trigger with Notify active webhook.",
|
||||
"Fires when a ticket update includes the specified tag. Requires a Zendesk Trigger with Notify active webhook.": "Fires when a ticket update includes the specified tag. Requires a Zendesk Trigger with Notify active webhook.",
|
||||
"Fires when a new organization record is created. Uses Zendesk event webhook (no Trigger needed).": "Fires when a new organization record is created. Uses Zendesk event webhook (no Trigger needed).",
|
||||
"Fires when a new user is created. Uses Zendesk event webhook (no Trigger needed).": "Fires when a new user is created. Uses Zendesk event webhook (no Trigger needed).",
|
||||
"Fires when a ticket is suspended. Requires a Zendesk Trigger with Notify active webhook. Suspended tickets auto-delete after 14 days.": "Fires when a ticket is suspended. Requires a Zendesk Trigger with Notify active webhook. Suspended tickets auto-delete after 14 days.",
|
||||
"Fires when the specified ticket updates. Requires a Zendesk Trigger with Notify active webhook.": "Fires when the specified ticket updates. Requires a Zendesk Trigger with Notify active webhook.",
|
||||
"View": "View",
|
||||
"Organization (Optional)": "Organization (Optional)",
|
||||
"Specific Tag (Optional)": "Specific Tag (Optional)",
|
||||
"User Role (Optional)": "User Role (Optional)",
|
||||
"Organization ID Filter (Optional)": "Organization ID Filter (Optional)",
|
||||
"The view to monitor for new tickets": "The view to monitor for new tickets",
|
||||
"Filter tickets by organization. Leave empty to trigger for all organizations.": "Filter tickets by organization. Leave empty to trigger for all organizations.",
|
||||
"Only trigger when this specific tag is added. Leave empty to trigger for any tag addition.": "Only trigger when this specific tag is added. Leave empty to trigger for any tag addition.",
|
||||
"Filter users by role. Leave empty to trigger for all user types.": "Filter users by role. Leave empty to trigger for all user types.",
|
||||
"Only trigger for tickets from this organization ID. Leave empty for all organizations.": "Only trigger for tickets from this organization ID. Leave empty for all organizations.",
|
||||
"The specific ticket ID to monitor for actions/events.": "The specific ticket ID to monitor for actions/events.",
|
||||
"All Roles": "All Roles"
|
||||
}
|
||||
@@ -0,0 +1,30 @@
|
||||
{
|
||||
"Zendesk": "Zendesk",
|
||||
"Customer service software and support ticket system": "Customer service software and support ticket system",
|
||||
"Agent Email": "Agent Email",
|
||||
"Token": "Token",
|
||||
"Organization (e.g activepieceshelp)": "Organization (e.g activepieceshelp)",
|
||||
"The email address you use to login to Zendesk": "The email address you use to login to Zendesk",
|
||||
"The API token you can generate in Zendesk": "The API token you can generate in Zendesk",
|
||||
"The subdomain of your Zendesk instance": "The subdomain of your Zendesk instance",
|
||||
"\n**Organization**: The organization name can be found in the URL (e.g https://ORGANIZATION_NAME.zendesk.com).\n\n**Agent Email**: The email you use to log in to Zendesk.\n\n**API Token**: You can find this in the Zendesk Admin Panel under Settings > APIs > Zendesk API.\n": "\n**Organization**: The organization name can be found in the URL (e.g https://ORGANIZATION_NAME.zendesk.com).\n\n**Agent Email**: The email you use to log in to Zendesk.\n\n**API Token**: You can find this in the Zendesk Admin Panel under Settings > APIs > Zendesk API.\n",
|
||||
"Custom API Call": "Custom API Call",
|
||||
"Make a custom API call to a specific endpoint": "Make a custom API call to a specific endpoint",
|
||||
"Method": "Method",
|
||||
"Headers": "Headers",
|
||||
"Query Parameters": "Query Parameters",
|
||||
"Body": "Body",
|
||||
"No Error on Failure": "No Error on Failure",
|
||||
"Timeout (in seconds)": "Timeout (in seconds)",
|
||||
"Authorization headers are injected automatically from your connection.": "Authorization headers are injected automatically from your connection.",
|
||||
"GET": "GET",
|
||||
"POST": "POST",
|
||||
"PATCH": "PATCH",
|
||||
"PUT": "PUT",
|
||||
"DELETE": "DELETE",
|
||||
"HEAD": "HEAD",
|
||||
"New ticket in view": "New ticket in view",
|
||||
"Triggers when a new ticket is created in a view": "Triggers when a new ticket is created in a view",
|
||||
"View": "View",
|
||||
"The view to monitor for new tickets": "The view to monitor for new tickets"
|
||||
}
|
||||
@@ -0,0 +1,304 @@
|
||||
{
|
||||
"Customer service software and support ticket system": "Customer service software and support ticket system",
|
||||
"Agent Email": "Agent Email",
|
||||
"Token": "Token",
|
||||
"Organization (e.g activepieceshelp)": "Organization (e.g activepieceshelp)",
|
||||
"The email address you use to login to Zendesk": "The email address you use to login to Zendesk",
|
||||
"The API token you can generate in Zendesk": "The API token you can generate in Zendesk",
|
||||
"The subdomain of your Zendesk instance": "The subdomain of your Zendesk instance",
|
||||
"\n**Organization**: The organization name can be found in the URL (e.g https://ORGANIZATION_NAME.zendesk.com).\n\n**Agent Email**: The email you use to log in to Zendesk.\n\n**API Token**: You can find this in the Zendesk Admin Panel under Settings > APIs > Zendesk API.\n": "\n**Organization**: The organization name can be found in the URL (e.g https://ORGANIZATION_NAME.zendesk.com).\n\n**Agent Email**: The email you use to log in to Zendesk.\n\n**API Token**: You can find this in the Zendesk Admin Panel under Settings > APIs > Zendesk API.\n",
|
||||
"Create Ticket": "Create Ticket",
|
||||
"Update Ticket": "Update Ticket",
|
||||
"Add Tag to Ticket": "Add Tag to Ticket",
|
||||
"Add Comment to Ticket": "Add Comment to Ticket",
|
||||
"Create Organization": "Create Organization",
|
||||
"Update Organization": "Update Organization",
|
||||
"Create User": "Create User",
|
||||
"Delete User": "删除用户",
|
||||
"Find Organization(s)": "Find Organization(s)",
|
||||
"Find Ticket(s)": "Find Ticket(s)",
|
||||
"Find User(s)": "Find User(s)",
|
||||
"Custom API Call": "自定义 API 呼叫",
|
||||
"Create a new ticket in Zendesk.": "Create a new ticket in Zendesk.",
|
||||
"Modify ticket fields or status via API call.": "Modify ticket fields or status via API call.",
|
||||
"Apply one or more tags to a ticket.": "Apply one or more tags to a ticket.",
|
||||
"Append a public/private comment to a ticket.": "Append a public/private comment to a ticket.",
|
||||
"Create a new organization record.": "Create a new organization record.",
|
||||
"Update existing organization fields.": "Update existing organization fields.",
|
||||
"Add a new user to the Zendesk instance.": "Add a new user to the Zendesk instance.",
|
||||
"Remove a user and associated records from the account.": "Remove a user and associated records from the account.",
|
||||
"Search organizations by name, domain, external ID, or other criteria.": "Search organizations by name, domain, external ID, or other criteria.",
|
||||
"Search tickets by ID, field, or content.": "Search tickets by ID, field, or content.",
|
||||
"Search users by email, name, role, or other criteria.": "Search users by email, name, role, or other criteria.",
|
||||
"Make a custom API call to a specific endpoint": "将一个自定义 API 调用到一个特定的终点",
|
||||
"Subject": "Subject",
|
||||
"Comment Body": "Comment Body",
|
||||
"Comment HTML Body": "Comment HTML Body",
|
||||
"Requester Email": "Requester Email",
|
||||
"Requester Name": "Requester Name",
|
||||
"Assignee Email": "Assignee Email",
|
||||
"Priority": "Priority",
|
||||
"Type": "类型",
|
||||
"Status": "状态",
|
||||
"Tags": "标签",
|
||||
"Organization": "Organization",
|
||||
"Group": "Group",
|
||||
"External ID": "外部ID",
|
||||
"Collaborator Emails": "Collaborator Emails",
|
||||
"Follower Emails": "Follower Emails",
|
||||
"Due Date": "Due Date",
|
||||
"Custom Fields": "Custom Fields",
|
||||
"Public Comment": "Public Comment",
|
||||
"Brand": "Brand",
|
||||
"Forum Topic ID": "Forum Topic ID",
|
||||
"Problem Ticket": "Problem Ticket",
|
||||
"Ticket": "Ticket",
|
||||
"Custom Status ID": "Custom Status ID",
|
||||
"Safe Update": "Safe Update",
|
||||
"Updated Timestamp": "Updated Timestamp",
|
||||
"Author Email": "Author Email",
|
||||
"Attachment Tokens": "Attachment Tokens",
|
||||
"Via Followup Source ID": "Via Followup Source ID",
|
||||
"Organization Name": "Organization Name",
|
||||
"Details": "详细信息",
|
||||
"Notes": "Notes",
|
||||
"Domain Names": "Domain Names",
|
||||
"Organization Fields": "Organization Fields",
|
||||
"Shared Tickets": "Shared Tickets",
|
||||
"Shared Comments": "Shared Comments",
|
||||
"Name": "名称",
|
||||
"Email": "电子邮件地址",
|
||||
"Role": "作用",
|
||||
"Custom Role": "Custom Role",
|
||||
"Phone": "Phone",
|
||||
"Alias": "Alias",
|
||||
"Time Zone": "Time Zone",
|
||||
"Locale": "Locale",
|
||||
"Verified": "已验证",
|
||||
"Active": "使用中",
|
||||
"Shared": "Shared",
|
||||
"Shared Agent": "Shared Agent",
|
||||
"Moderator": "Moderator",
|
||||
"Suspended": "Suspended",
|
||||
"Restricted Agent": "Restricted Agent",
|
||||
"Only Private Comments": "Only Private Comments",
|
||||
"Report CSV": "Report CSV",
|
||||
"Skip Verify Email": "Skip Verify Email",
|
||||
"Ticket Restriction": "Ticket Restriction",
|
||||
"Signature": "Signature",
|
||||
"Agent Brand Access": "Agent Brand Access",
|
||||
"User Fields": "User Fields",
|
||||
"Identities": "Identities",
|
||||
"User": "用户",
|
||||
"Confirm Deletion": "确认删除",
|
||||
"Search Type": "Search Type",
|
||||
"Domain": "Domain",
|
||||
"Tag": "标签",
|
||||
"Custom Query": "Custom Query",
|
||||
"Sort By": "Sort By",
|
||||
"Sort Order": "Sort Order",
|
||||
"Ticket ID": "Ticket ID",
|
||||
"Content": "Content",
|
||||
"Email Address": "Email Address",
|
||||
"Method": "方法",
|
||||
"Headers": "信头",
|
||||
"Query Parameters": "查询参数",
|
||||
"Body": "正文内容",
|
||||
"Response is Binary ?": "Response is Binary ?",
|
||||
"No Error on Failure": "失败时没有错误",
|
||||
"Timeout (in seconds)": "超时(秒)",
|
||||
"The subject of the ticket (optional - will use first comment text if not provided)": "The subject of the ticket (optional - will use first comment text if not provided)",
|
||||
"The comment body (text). Use this for plain text comments.": "The comment body (text). Use this for plain text comments.",
|
||||
"The comment body (HTML). Use this for HTML formatted comments. If provided, this takes precedence over Comment Body.": "The comment body (HTML). Use this for HTML formatted comments. If provided, this takes precedence over Comment Body.",
|
||||
"Email address of the ticket requester. If not provided, the authenticated user will be the requester.": "Email address of the ticket requester. If not provided, the authenticated user will be the requester.",
|
||||
"Name of the ticket requester (used when creating a new user).": "Name of the ticket requester (used when creating a new user).",
|
||||
"Email address of the agent to assign the ticket to.": "Email address of the agent to assign the ticket to.",
|
||||
"The priority of the ticket.": "The priority of the ticket.",
|
||||
"The type of ticket.": "The type of ticket.",
|
||||
"The status of the ticket.": "The status of the ticket.",
|
||||
"Array of tags to apply to the ticket.": "Array of tags to apply to the ticket.",
|
||||
"Select the organization to work with": "Select the organization to work with",
|
||||
"Select the group to assign": "Select the group to assign",
|
||||
"An external ID for the ticket (useful for integrations).": "An external ID for the ticket (useful for integrations).",
|
||||
"Array of email addresses to add as collaborators.": "Array of email addresses to add as collaborators.",
|
||||
"Array of email addresses to add as followers.": "Array of email addresses to add as followers.",
|
||||
"The date and time when the ticket is due.": "The date and time when the ticket is due.",
|
||||
"Custom ticket field values": "Custom ticket field values",
|
||||
"Whether the comment is public (visible to the requester). Defaults to true.": "Whether the comment is public (visible to the requester). Defaults to true.",
|
||||
"Select the brand to work with": "Select the brand to work with",
|
||||
"The ID of the forum topic associated with the ticket.": "The ID of the forum topic associated with the ticket.",
|
||||
"Select the problem ticket this ticket is an incident of": "Select the problem ticket this ticket is an incident of",
|
||||
"Select the ticket to work with": "Select the ticket to work with",
|
||||
"Update the subject of the ticket": "Update the subject of the ticket",
|
||||
"Add a comment to the ticket (plain text)": "Add a comment to the ticket (plain text)",
|
||||
"Add a comment to the ticket (HTML). If provided, this takes precedence over Comment Body.": "Add a comment to the ticket (HTML). If provided, this takes precedence over Comment Body.",
|
||||
"Email address of the agent to assign the ticket to": "Email address of the agent to assign the ticket to",
|
||||
"Update the priority of the ticket": "Update the priority of the ticket",
|
||||
"Update the type of ticket": "Update the type of ticket",
|
||||
"Update the status of the ticket": "Update the status of the ticket",
|
||||
"Replace all tags with this array. Use \"Add Tag to Ticket\" action to add tags without replacing existing ones.": "Replace all tags with this array. Use \"Add Tag to Ticket\" action to add tags without replacing existing ones.",
|
||||
"Update the external ID for the ticket": "Update the external ID for the ticket",
|
||||
"Update the date and time when the ticket is due": "Update the date and time when the ticket is due",
|
||||
"Update custom ticket field values": "Update custom ticket field values",
|
||||
"Set a custom status ID for the ticket": "Set a custom status ID for the ticket",
|
||||
"Update the forum topic associated with the ticket": "Update the forum topic associated with the ticket",
|
||||
"Replace collaborators with this array of email addresses": "Replace collaborators with this array of email addresses",
|
||||
"Replace followers with this array of email addresses": "Replace followers with this array of email addresses",
|
||||
"Update the requester of the ticket": "Update the requester of the ticket",
|
||||
"Prevent update collisions by checking timestamp": "Prevent update collisions by checking timestamp",
|
||||
"Ticket timestamp from updated_at field for collision prevention": "Ticket timestamp from updated_at field for collision prevention",
|
||||
"Tags to add to the ticket (adds to existing tags)": "Tags to add to the ticket (adds to existing tags)",
|
||||
"Prevent tag loss from concurrent updates": "Prevent tag loss from concurrent updates",
|
||||
"The comment text content": "The comment text content",
|
||||
"HTML formatted comment (takes precedence over text)": "HTML formatted comment (takes precedence over text)",
|
||||
"Make comment visible to requester (default: true)": "Make comment visible to requester (default: true)",
|
||||
"Email of comment author (defaults to authenticated user)": "Email of comment author (defaults to authenticated user)",
|
||||
"Upload tokens for file attachments": "Upload tokens for file attachments",
|
||||
"Original ticket ID if this is from a follow-up": "Original ticket ID if this is from a follow-up",
|
||||
"Unique name for the organization": "Unique name for the organization",
|
||||
"Additional details about the organization": "Additional details about the organization",
|
||||
"Internal notes about the organization": "Internal notes about the organization",
|
||||
"External ID for integration purposes": "External ID for integration purposes",
|
||||
"Domain names associated with the organization": "Domain names associated with the organization",
|
||||
"Tags to apply to the organization": "Tags to apply to the organization",
|
||||
"Custom organization field values": "Custom organization field values",
|
||||
"Allow users to see each other's tickets": "Allow users to see each other's tickets",
|
||||
"Allow users to see each other's comments": "Allow users to see each other's comments",
|
||||
"New name for the organization (must be unique)": "New name for the organization (must be unique)",
|
||||
"Domain names for the organization (replaces all existing)": "Domain names for the organization (replaces all existing)",
|
||||
"Tags for the organization (replaces all existing)": "Tags for the organization (replaces all existing)",
|
||||
"The name of the user": "The name of the user",
|
||||
"The primary email address of the user": "The primary email address of the user",
|
||||
"The role of the user. Defaults to \"end-user\" if not specified.": "The role of the user. Defaults to \"end-user\" if not specified.",
|
||||
"Select the custom role for the agent": "Select the custom role for the agent",
|
||||
"Create and associate user with a new organization by name (alternative to Organization ID)": "Create and associate user with a new organization by name (alternative to Organization ID)",
|
||||
"The phone number of the user": "The phone number of the user",
|
||||
"An alias displayed to end users": "An alias displayed to end users",
|
||||
"Additional details about the user": "Additional details about the user",
|
||||
"Internal notes about the user": "Internal notes about the user",
|
||||
"A unique external ID for the user (useful for integrations)": "A unique external ID for the user (useful for integrations)",
|
||||
"The time zone of the user (e.g., \"America/New_York\")": "The time zone of the user (e.g., \"America/New_York\")",
|
||||
"The locale of the user (e.g., \"en-US\")": "The locale of the user (e.g., \"en-US\")",
|
||||
"Whether the user is verified": "Whether the user is verified",
|
||||
"Whether the user is active. Defaults to true.": "Whether the user is active. Defaults to true.",
|
||||
"Whether the user is shared from a different Zendesk Support instance": "Whether the user is shared from a different Zendesk Support instance",
|
||||
"Whether the user is a shared agent from a different Zendesk Support instance": "Whether the user is a shared agent from a different Zendesk Support instance",
|
||||
"Whether the user has forum moderation capabilities": "Whether the user has forum moderation capabilities",
|
||||
"Whether the user is suspended": "Whether the user is suspended",
|
||||
"Whether the agent has restrictions on what tickets they can access": "Whether the agent has restrictions on what tickets they can access",
|
||||
"Whether the user can only create private comments": "Whether the user can only create private comments",
|
||||
"Whether the user can access CSV reports": "Whether the user can access CSV reports",
|
||||
"Skip sending a verification email to the user": "Skip sending a verification email to the user",
|
||||
"The ticket restriction for the user": "The ticket restriction for the user",
|
||||
"The user's signature for email responses": "The user's signature for email responses",
|
||||
"Select the brands that the agent can access (for agents only)": "Select the brands that the agent can access (for agents only)",
|
||||
"Array of tags to apply to the user": "Array of tags to apply to the user",
|
||||
"Custom user field values": "Custom user field values",
|
||||
"Array of identity objects with type and value. Example: [{\"type\": \"email\", \"value\": \"test@user.com\"}, {\"type\": \"twitter\", \"value\": \"username\"}]": "Array of identity objects with type and value. Example: [{\"type\": \"email\", \"value\": \"test@user.com\"}, {\"type\": \"twitter\", \"value\": \"username\"}]",
|
||||
"Select the user to work with": "Select the user to work with",
|
||||
"I understand that deleted users are not recoverable and this action cannot be undone.": "I understand that deleted users are not recoverable and this action cannot be undone.",
|
||||
"Choose how to search for organizations": "Choose how to search for organizations",
|
||||
"The name of the organization to search for": "The name of the organization to search for",
|
||||
"Search organizations by domain name": "Search organizations by domain name",
|
||||
"Search organizations by external ID": "Search organizations by external ID",
|
||||
"Search organizations containing this tag": "Search organizations containing this tag",
|
||||
"Search in organization details/notes": "Search in organization details/notes",
|
||||
"Custom search query using Zendesk search syntax (e.g., \"type:organization domain:example.com\")": "Custom search query using Zendesk search syntax (e.g., \"type:organization domain:example.com\")",
|
||||
"How to sort the results": "How to sort the results",
|
||||
"Sort order for results": "Sort order for results",
|
||||
"Choose how to search for tickets": "Choose how to search for tickets",
|
||||
"The ID of the ticket to find": "The ID of the ticket to find",
|
||||
"Search tickets by status": "Search tickets by status",
|
||||
"Search tickets by priority": "Search tickets by priority",
|
||||
"Search tickets by type": "Search tickets by type",
|
||||
"Search tickets containing this tag": "Search tickets containing this tag",
|
||||
"Search tickets by requester email address": "Search tickets by requester email address",
|
||||
"Search tickets by assignee email address": "Search tickets by assignee email address",
|
||||
"Search in ticket subject and content": "Search in ticket subject and content",
|
||||
"Custom search query using Zendesk search syntax (e.g., \"type:ticket status:open priority:high\")": "Custom search query using Zendesk search syntax (e.g., \"type:ticket status:open priority:high\")",
|
||||
"Choose how to search for users": "Choose how to search for users",
|
||||
"The email address of the user to search for": "The email address of the user to search for",
|
||||
"The name of the user to search for": "The name of the user to search for",
|
||||
"Search users by role": "Search users by role",
|
||||
"Search users by organization name": "Search users by organization name",
|
||||
"Search users containing this tag": "Search users containing this tag",
|
||||
"Search users by external ID": "Search users by external ID",
|
||||
"Custom search query using Zendesk search syntax (e.g., \"type:user role:agent\")": "Custom search query using Zendesk search syntax (e.g., \"type:user role:agent\")",
|
||||
"Authorization headers are injected automatically from your connection.": "授权头自动从您的连接中注入。",
|
||||
"Enable for files like PDFs, images, etc..": "Enable for files like PDFs, images, etc..",
|
||||
"Low": "Low",
|
||||
"Normal": "Normal",
|
||||
"High": "High",
|
||||
"Urgent": "Urgent",
|
||||
"Problem": "Problem",
|
||||
"Incident": "Incident",
|
||||
"Question": "Question",
|
||||
"Task": "Task",
|
||||
"New": "New",
|
||||
"Open": "Open",
|
||||
"Pending": "待處理",
|
||||
"Hold": "Hold",
|
||||
"Solved": "Solved",
|
||||
"Closed": "Closed",
|
||||
"End User": "End User",
|
||||
"Agent": "Agent",
|
||||
"Admin": "管理员",
|
||||
"Groups": "Groups",
|
||||
"Assigned": "Assigned",
|
||||
"Requested": "Requested",
|
||||
"Search by Name": "Search by Name",
|
||||
"Search by Domain": "Search by Domain",
|
||||
"Search by External ID": "Search by External ID",
|
||||
"Search by Tag": "Search by Tag",
|
||||
"Search by Details": "Search by Details",
|
||||
"Relevance (Default)": "Relevance (Default)",
|
||||
"Created Date": "Created Date",
|
||||
"Updated Date": "Updated Date",
|
||||
"Descending (Default)": "Descending (Default)",
|
||||
"Ascending": "升序",
|
||||
"Search by Ticket ID": "Search by Ticket ID",
|
||||
"Search by Status": "Search by Status",
|
||||
"Search by Priority": "Search by Priority",
|
||||
"Search by Type": "Search by Type",
|
||||
"Search by Requester Email": "Search by Requester Email",
|
||||
"Search by Assignee Email": "Search by Assignee Email",
|
||||
"Search by Subject/Content": "Search by Subject/Content",
|
||||
"Ticket Type": "Ticket Type",
|
||||
"Search by Email": "Search by Email",
|
||||
"Search by Role": "Search by Role",
|
||||
"Search by Organization": "Search by Organization",
|
||||
"GET": "获取",
|
||||
"POST": "帖子",
|
||||
"PATCH": "PATCH",
|
||||
"PUT": "弹出",
|
||||
"DELETE": "删除",
|
||||
"HEAD": "黑色",
|
||||
"New ticket in view": "New ticket in view",
|
||||
"New Ticket": "New Ticket",
|
||||
"Updated Ticket": "Updated Ticket",
|
||||
"Tag Added to Ticket": "Tag Added to Ticket",
|
||||
"New Organization": "New Organization",
|
||||
"New User": "New User",
|
||||
"New Suspended Ticket": "New Suspended Ticket",
|
||||
"New Action on Ticket": "New Action on Ticket",
|
||||
"Triggers when a new ticket is created in a view": "Triggers when a new ticket is created in a view",
|
||||
"Fires when a new ticket is created (optionally filtered by organization). Requires a Zendesk Trigger with Notify active webhook.": "Fires when a new ticket is created (optionally filtered by organization). Requires a Zendesk Trigger with Notify active webhook.",
|
||||
"Fires when an existing ticket is updated. Requires a Zendesk Trigger with Notify active webhook.": "Fires when an existing ticket is updated. Requires a Zendesk Trigger with Notify active webhook.",
|
||||
"Fires when a ticket update includes the specified tag. Requires a Zendesk Trigger with Notify active webhook.": "Fires when a ticket update includes the specified tag. Requires a Zendesk Trigger with Notify active webhook.",
|
||||
"Fires when a new organization record is created. Uses Zendesk event webhook (no Trigger needed).": "Fires when a new organization record is created. Uses Zendesk event webhook (no Trigger needed).",
|
||||
"Fires when a new user is created. Uses Zendesk event webhook (no Trigger needed).": "Fires when a new user is created. Uses Zendesk event webhook (no Trigger needed).",
|
||||
"Fires when a ticket is suspended. Requires a Zendesk Trigger with Notify active webhook. Suspended tickets auto-delete after 14 days.": "Fires when a ticket is suspended. Requires a Zendesk Trigger with Notify active webhook. Suspended tickets auto-delete after 14 days.",
|
||||
"Fires when the specified ticket updates. Requires a Zendesk Trigger with Notify active webhook.": "Fires when the specified ticket updates. Requires a Zendesk Trigger with Notify active webhook.",
|
||||
"View": "查看",
|
||||
"Organization (Optional)": "Organization (Optional)",
|
||||
"Specific Tag (Optional)": "Specific Tag (Optional)",
|
||||
"User Role (Optional)": "User Role (Optional)",
|
||||
"Organization ID Filter (Optional)": "Organization ID Filter (Optional)",
|
||||
"The view to monitor for new tickets": "The view to monitor for new tickets",
|
||||
"Filter tickets by organization. Leave empty to trigger for all organizations.": "Filter tickets by organization. Leave empty to trigger for all organizations.",
|
||||
"Only trigger when this specific tag is added. Leave empty to trigger for any tag addition.": "Only trigger when this specific tag is added. Leave empty to trigger for any tag addition.",
|
||||
"Filter users by role. Leave empty to trigger for all user types.": "Filter users by role. Leave empty to trigger for all user types.",
|
||||
"Only trigger for tickets from this organization ID. Leave empty for all organizations.": "Only trigger for tickets from this organization ID. Leave empty for all organizations.",
|
||||
"The specific ticket ID to monitor for actions/events.": "The specific ticket ID to monitor for actions/events.",
|
||||
"All Roles": "All Roles"
|
||||
}
|
||||
@@ -0,0 +1,96 @@
|
||||
import { createCustomApiCallAction } from '@activepieces/pieces-common';
|
||||
import {
|
||||
PieceAuth,
|
||||
Property,
|
||||
createPiece,
|
||||
} from '@activepieces/pieces-framework';
|
||||
import { PieceCategory } from '@activepieces/shared';
|
||||
import { newTicketInView } from './lib/trigger/new-ticket-in-view';
|
||||
import { newTicket } from './lib/trigger/new-ticket';
|
||||
import { updatedTicket } from './lib/trigger/updated-ticket';
|
||||
import { tagAddedToTicket } from './lib/trigger/tag-added-to-ticket';
|
||||
import { newOrganization } from './lib/trigger/new-organization';
|
||||
import { newUser } from './lib/trigger/new-user';
|
||||
import { newSuspendedTicket } from './lib/trigger/new-suspended-ticket';
|
||||
import { newActionOnTicket } from './lib/trigger/new-action-on-ticket';
|
||||
import { createTicketAction } from './lib/actions/create-ticket';
|
||||
import { updateTicketAction } from './lib/actions/update-ticket';
|
||||
import { addTagToTicketAction } from './lib/actions/add-tag-to-ticket';
|
||||
import { addCommentToTicketAction } from './lib/actions/add-comment-to-ticket';
|
||||
import { createOrganizationAction } from './lib/actions/create-organization';
|
||||
import { updateOrganizationAction } from './lib/actions/update-organization';
|
||||
import { createUserAction } from './lib/actions/create-user';
|
||||
import { deleteUserAction } from './lib/actions/delete-user';
|
||||
import { findOrganizationAction } from './lib/actions/find-organization';
|
||||
import { findTicketsAction } from './lib/actions/find-tickets';
|
||||
import { findUserAction } from './lib/actions/find-user';
|
||||
|
||||
const markdownProperty = `
|
||||
**Organization**: The organization name can be found in the URL (e.g https://ORGANIZATION_NAME.zendesk.com).
|
||||
|
||||
**Agent Email**: The email you use to log in to Zendesk.
|
||||
|
||||
**API Token**: You can find this in the Zendesk Admin Panel under Settings > APIs > Zendesk API.
|
||||
`;
|
||||
|
||||
export const zendeskAuth = PieceAuth.CustomAuth({
|
||||
description: markdownProperty,
|
||||
props: {
|
||||
email: Property.ShortText({
|
||||
displayName: 'Agent Email',
|
||||
description: 'The email address you use to login to Zendesk',
|
||||
required: true,
|
||||
}),
|
||||
token: Property.ShortText({
|
||||
displayName: 'Token',
|
||||
description: 'The API token you can generate in Zendesk',
|
||||
required: true,
|
||||
}),
|
||||
subdomain: Property.ShortText({
|
||||
displayName: 'Organization (e.g activepieceshelp)',
|
||||
description: 'The subdomain of your Zendesk instance',
|
||||
required: true,
|
||||
}),
|
||||
},
|
||||
required: true,
|
||||
});
|
||||
|
||||
export const zendesk = createPiece({
|
||||
displayName: 'Zendesk',
|
||||
description: 'Customer service software and support ticket system',
|
||||
|
||||
minimumSupportedRelease: '0.30.0',
|
||||
logoUrl: 'https://cdn.activepieces.com/pieces/zendesk.png',
|
||||
authors: ["kishanprmr","MoShizzle","khaledmashaly","abuaboud","aryel780","onyedikachi-david"],
|
||||
categories: [PieceCategory.CUSTOMER_SUPPORT],
|
||||
auth: zendeskAuth,
|
||||
actions: [
|
||||
createTicketAction,
|
||||
updateTicketAction,
|
||||
addTagToTicketAction,
|
||||
addCommentToTicketAction,
|
||||
createOrganizationAction,
|
||||
updateOrganizationAction,
|
||||
createUserAction,
|
||||
deleteUserAction,
|
||||
findOrganizationAction,
|
||||
findTicketsAction,
|
||||
findUserAction,
|
||||
createCustomApiCallAction({
|
||||
baseUrl: (auth) =>
|
||||
auth?
|
||||
`https://${
|
||||
auth.props.subdomain
|
||||
}.zendesk.com/api/v2` : '',
|
||||
auth: zendeskAuth,
|
||||
authMapping: async (auth) => ({
|
||||
Authorization: `Basic ${Buffer.from(
|
||||
`${auth.props.email}/token:${
|
||||
auth.props.token
|
||||
}`
|
||||
).toString('base64')}`,
|
||||
}),
|
||||
}),
|
||||
],
|
||||
triggers: [newTicketInView, newTicket, updatedTicket, tagAddedToTicket, newOrganization, newUser, newSuspendedTicket, newActionOnTicket],
|
||||
});
|
||||
@@ -0,0 +1,197 @@
|
||||
import { createAction, Property } from '@activepieces/pieces-framework';
|
||||
import {
|
||||
AuthenticationType,
|
||||
HttpMethod,
|
||||
httpClient,
|
||||
} from '@activepieces/pieces-common';
|
||||
import { zendeskAuth } from '../..';
|
||||
import { ticketIdDropdown } from '../common/props';
|
||||
|
||||
type AuthProps = {
|
||||
email: string;
|
||||
token: string;
|
||||
subdomain: string;
|
||||
};
|
||||
|
||||
export const addCommentToTicketAction = createAction({
|
||||
auth: zendeskAuth,
|
||||
name: 'add-comment-to-ticket',
|
||||
displayName: 'Add Comment to Ticket',
|
||||
description: 'Append a public/private comment to a ticket.',
|
||||
props: {
|
||||
ticket_id: ticketIdDropdown,
|
||||
comment_body: Property.LongText({
|
||||
displayName: 'Comment Body',
|
||||
description: 'The comment text content',
|
||||
required: false,
|
||||
}),
|
||||
comment_html_body: Property.LongText({
|
||||
displayName: 'Comment HTML Body',
|
||||
description: 'HTML formatted comment (takes precedence over text)',
|
||||
required: false,
|
||||
}),
|
||||
public: Property.Checkbox({
|
||||
displayName: 'Public Comment',
|
||||
description: 'Make comment visible to requester (default: true)',
|
||||
required: false,
|
||||
}),
|
||||
author_email: Property.ShortText({
|
||||
displayName: 'Author Email',
|
||||
description: 'Email of comment author (defaults to authenticated user)',
|
||||
required: false,
|
||||
}),
|
||||
uploads: Property.Array({
|
||||
displayName: 'Attachment Tokens',
|
||||
description: 'Upload tokens for file attachments',
|
||||
required: false,
|
||||
}),
|
||||
via_followup_source_id: Property.Number({
|
||||
displayName: 'Via Followup Source ID',
|
||||
description: 'Original ticket ID if this is from a follow-up',
|
||||
required: false,
|
||||
}),
|
||||
},
|
||||
async run({ propsValue, auth }) {
|
||||
const authentication = auth;
|
||||
const {
|
||||
ticket_id,
|
||||
comment_body,
|
||||
comment_html_body,
|
||||
public: isPublic,
|
||||
author_email,
|
||||
uploads,
|
||||
via_followup_source_id,
|
||||
} = propsValue;
|
||||
|
||||
if (!comment_body && !comment_html_body) {
|
||||
throw new Error('Either Comment Body or Comment HTML Body is required');
|
||||
}
|
||||
|
||||
const resolveUserByEmail = async (email: string) => {
|
||||
try {
|
||||
const response = await httpClient.sendRequest({
|
||||
url: `https://${
|
||||
authentication.props.subdomain
|
||||
}.zendesk.com/api/v2/users/search.json?query=email:${encodeURIComponent(
|
||||
email
|
||||
)}`,
|
||||
method: HttpMethod.GET,
|
||||
authentication: {
|
||||
type: AuthenticationType.BASIC,
|
||||
username: authentication.props.email + '/token',
|
||||
password: authentication.props.token,
|
||||
},
|
||||
});
|
||||
|
||||
const users = (response.body as { users: Array<{ id: number }> }).users;
|
||||
return users.length > 0 ? users[0].id : null;
|
||||
} catch (error) {
|
||||
console.warn(
|
||||
`Warning: Could not resolve user with email ${email}:`,
|
||||
(error as Error).message
|
||||
);
|
||||
return null;
|
||||
}
|
||||
};
|
||||
|
||||
const comment: Record<string, unknown> = {};
|
||||
|
||||
if (comment_html_body) {
|
||||
comment.html_body = comment_html_body;
|
||||
} else if (comment_body) {
|
||||
comment.body = comment_body;
|
||||
}
|
||||
|
||||
comment.public = isPublic !== false;
|
||||
|
||||
if (author_email) {
|
||||
const authorId = await resolveUserByEmail(author_email);
|
||||
if (authorId) {
|
||||
comment.author_id = authorId;
|
||||
} else {
|
||||
throw new Error(`Could not find user with email: ${author_email}`);
|
||||
}
|
||||
}
|
||||
|
||||
if (uploads && Array.isArray(uploads) && uploads.length > 0) {
|
||||
comment.uploads = uploads;
|
||||
}
|
||||
|
||||
if (via_followup_source_id) {
|
||||
comment.via = {
|
||||
followup_source_id: via_followup_source_id,
|
||||
};
|
||||
}
|
||||
|
||||
const ticket = {
|
||||
comment,
|
||||
};
|
||||
|
||||
try {
|
||||
const response = await httpClient.sendRequest({
|
||||
url: `https://${authentication.props.subdomain}.zendesk.com/api/v2/tickets/${ticket_id}.json`,
|
||||
method: HttpMethod.PUT,
|
||||
headers: {
|
||||
'Content-Type': 'application/json',
|
||||
},
|
||||
authentication: {
|
||||
type: AuthenticationType.BASIC,
|
||||
username: authentication.props.email + '/token',
|
||||
password: authentication.props.token,
|
||||
},
|
||||
body: {
|
||||
ticket,
|
||||
},
|
||||
});
|
||||
|
||||
return {
|
||||
success: true,
|
||||
message: `Comment added successfully to ticket ${ticket_id}`,
|
||||
data: response.body,
|
||||
comment_details: {
|
||||
is_public: comment.public,
|
||||
has_attachments: uploads && uploads.length > 0,
|
||||
content_type: comment_html_body ? 'html' : 'text',
|
||||
},
|
||||
};
|
||||
} catch (error) {
|
||||
const errorMessage = (error as Error).message;
|
||||
if (errorMessage.includes('400')) {
|
||||
throw new Error(
|
||||
'Invalid request parameters. Please check your input values and try again.'
|
||||
);
|
||||
}
|
||||
|
||||
if (errorMessage.includes('401') || errorMessage.includes('403')) {
|
||||
throw new Error(
|
||||
'Authentication failed. Please check your API credentials and permissions.'
|
||||
);
|
||||
}
|
||||
|
||||
if (errorMessage.includes('404')) {
|
||||
throw new Error(
|
||||
`Ticket with ID ${ticket_id} not found. Please verify the ticket ID.`
|
||||
);
|
||||
}
|
||||
|
||||
if (errorMessage.includes('422')) {
|
||||
if (errorMessage.includes('5000')) {
|
||||
throw new Error(
|
||||
'This ticket has reached the maximum limit of 5000 comments. No additional comments can be added.'
|
||||
);
|
||||
}
|
||||
throw new Error(
|
||||
'Validation error. Please check that all field values are valid.'
|
||||
);
|
||||
}
|
||||
|
||||
if (errorMessage.includes('429')) {
|
||||
throw new Error(
|
||||
'Rate limit exceeded. Please wait a moment before trying again.'
|
||||
);
|
||||
}
|
||||
|
||||
throw new Error(`Failed to add comment to ticket: ${errorMessage}`);
|
||||
}
|
||||
},
|
||||
});
|
||||
@@ -0,0 +1,126 @@
|
||||
import { createAction, Property } from '@activepieces/pieces-framework';
|
||||
import {
|
||||
AuthenticationType,
|
||||
HttpMethod,
|
||||
httpClient,
|
||||
} from '@activepieces/pieces-common';
|
||||
import { zendeskAuth } from '../..';
|
||||
import { ticketIdDropdown } from '../common/props';
|
||||
|
||||
type AuthProps = {
|
||||
email: string;
|
||||
token: string;
|
||||
subdomain: string;
|
||||
};
|
||||
|
||||
export const addTagToTicketAction = createAction({
|
||||
auth: zendeskAuth,
|
||||
name: 'add-tag-to-ticket',
|
||||
displayName: 'Add Tag to Ticket',
|
||||
description: 'Apply one or more tags to a ticket.',
|
||||
props: {
|
||||
ticket_id: ticketIdDropdown,
|
||||
tags: Property.Array({
|
||||
displayName: 'Tags',
|
||||
description: 'Tags to add to the ticket (adds to existing tags)',
|
||||
required: true,
|
||||
}),
|
||||
safe_update: Property.Checkbox({
|
||||
displayName: 'Safe Update',
|
||||
description: 'Prevent tag loss from concurrent updates',
|
||||
required: false,
|
||||
}),
|
||||
updated_stamp: Property.ShortText({
|
||||
displayName: 'Updated Timestamp',
|
||||
description: 'Ticket timestamp from updated_at field for collision prevention',
|
||||
required: false,
|
||||
}),
|
||||
},
|
||||
async run({ propsValue, auth }) {
|
||||
const authentication = auth;
|
||||
const { ticket_id, tags, safe_update, updated_stamp } = propsValue;
|
||||
|
||||
if (!Array.isArray(tags) || tags.length === 0) {
|
||||
throw new Error(
|
||||
'Tags array is required and must contain at least one tag.'
|
||||
);
|
||||
}
|
||||
|
||||
if (safe_update && !updated_stamp) {
|
||||
throw new Error(
|
||||
'Updated Timestamp is required when Safe Update is enabled.'
|
||||
);
|
||||
}
|
||||
|
||||
const body: Record<string, unknown> = {
|
||||
tags: tags,
|
||||
};
|
||||
|
||||
if (safe_update && updated_stamp) {
|
||||
body.updated_stamp = updated_stamp;
|
||||
body.safe_update = 'true';
|
||||
}
|
||||
|
||||
try {
|
||||
const response = await httpClient.sendRequest({
|
||||
url: `https://${authentication.props.subdomain}.zendesk.com/api/v2/tickets/${ticket_id}/tags.json`,
|
||||
method: HttpMethod.PUT,
|
||||
headers: {
|
||||
'Content-Type': 'application/json',
|
||||
},
|
||||
authentication: {
|
||||
type: AuthenticationType.BASIC,
|
||||
username: authentication.props.email + '/token',
|
||||
password: authentication.props.token,
|
||||
},
|
||||
body,
|
||||
});
|
||||
|
||||
return {
|
||||
success: true,
|
||||
message: `Successfully added ${tags.length} tag(s) to ticket ${ticket_id}`,
|
||||
data: response.body,
|
||||
added_tags: tags,
|
||||
};
|
||||
} catch (error) {
|
||||
const errorMessage = (error as Error).message;
|
||||
if (errorMessage.includes('400')) {
|
||||
throw new Error(
|
||||
'Invalid request parameters. Please check your input values and try again.'
|
||||
);
|
||||
}
|
||||
|
||||
if (errorMessage.includes('401') || errorMessage.includes('403')) {
|
||||
throw new Error(
|
||||
'Authentication failed. Please check your API credentials and permissions.'
|
||||
);
|
||||
}
|
||||
|
||||
if (errorMessage.includes('404')) {
|
||||
throw new Error(
|
||||
`Ticket with ID ${ticket_id} not found. Please verify the ticket ID.`
|
||||
);
|
||||
}
|
||||
|
||||
if (errorMessage.includes('409')) {
|
||||
throw new Error(
|
||||
'Conflict detected. The ticket was updated since the provided timestamp. Please retry with the latest updated_at timestamp.'
|
||||
);
|
||||
}
|
||||
|
||||
if (errorMessage.includes('422')) {
|
||||
throw new Error(
|
||||
'Validation error. Please check that all tag values are valid.'
|
||||
);
|
||||
}
|
||||
|
||||
if (errorMessage.includes('429')) {
|
||||
throw new Error(
|
||||
'Rate limit exceeded. Please wait a moment before trying again.'
|
||||
);
|
||||
}
|
||||
|
||||
throw new Error(`Failed to add tags to ticket: ${errorMessage}`);
|
||||
}
|
||||
},
|
||||
});
|
||||
@@ -0,0 +1,330 @@
|
||||
import { createAction, Property } from '@activepieces/pieces-framework';
|
||||
import {
|
||||
AuthenticationType,
|
||||
HttpMethod,
|
||||
httpClient,
|
||||
} from '@activepieces/pieces-common';
|
||||
import { zendeskAuth } from '../..';
|
||||
import { groupIdDropdown } from '../common/props';
|
||||
|
||||
type AuthProps = {
|
||||
email: string;
|
||||
token: string;
|
||||
subdomain: string;
|
||||
};
|
||||
|
||||
export const createOrganizationAction = createAction({
|
||||
auth: zendeskAuth,
|
||||
name: 'create-organization',
|
||||
displayName: 'Create Organization',
|
||||
description: 'Create a new organization record.',
|
||||
props: {
|
||||
name: Property.ShortText({
|
||||
displayName: 'Organization Name',
|
||||
description: 'Unique name for the organization',
|
||||
required: true,
|
||||
}),
|
||||
details: Property.LongText({
|
||||
displayName: 'Details',
|
||||
description: 'Additional details about the organization',
|
||||
required: false,
|
||||
}),
|
||||
notes: Property.LongText({
|
||||
displayName: 'Notes',
|
||||
description: 'Internal notes about the organization',
|
||||
required: false,
|
||||
}),
|
||||
external_id: Property.ShortText({
|
||||
displayName: 'External ID',
|
||||
description: 'External ID for integration purposes',
|
||||
required: false,
|
||||
}),
|
||||
group_id: groupIdDropdown,
|
||||
domain_names: Property.Array({
|
||||
displayName: 'Domain Names',
|
||||
description: 'Domain names associated with the organization',
|
||||
required: false,
|
||||
}),
|
||||
tags: Property.Array({
|
||||
displayName: 'Tags',
|
||||
description: 'Tags to apply to the organization',
|
||||
required: false,
|
||||
}),
|
||||
organization_fields: Property.DynamicProperties({
|
||||
auth: zendeskAuth,
|
||||
displayName: 'Organization Fields',
|
||||
description: 'Custom organization field values',
|
||||
required: false,
|
||||
refreshers: ['auth'],
|
||||
props: async ({ auth }) => {
|
||||
if (!auth) {
|
||||
return {};
|
||||
}
|
||||
|
||||
try {
|
||||
const authentication = auth;
|
||||
const response = await httpClient.sendRequest({
|
||||
url: `https://${authentication.props.subdomain}.zendesk.com/api/v2/organization_fields.json`,
|
||||
method: HttpMethod.GET,
|
||||
authentication: {
|
||||
type: AuthenticationType.BASIC,
|
||||
username: authentication.props.email + '/token',
|
||||
password: authentication.props.token,
|
||||
},
|
||||
});
|
||||
|
||||
const fields = (response.body as { organization_fields: Array<{
|
||||
id: number;
|
||||
key: string;
|
||||
title: string;
|
||||
description?: string;
|
||||
type: string;
|
||||
active: boolean;
|
||||
custom_field_options?: Array<{ name: string; value: string }>;
|
||||
regexp_for_validation?: string;
|
||||
}> }).organization_fields;
|
||||
|
||||
const dynamicProps: Record<string, any> = {};
|
||||
|
||||
for (const field of fields) {
|
||||
if (!field.active) continue;
|
||||
|
||||
const fieldKey = `field_${field.key}`;
|
||||
const displayName = field.title;
|
||||
const description = field.description || `Custom ${field.type} field`;
|
||||
|
||||
switch (field.type) {
|
||||
case 'dropdown':
|
||||
if (field.custom_field_options && field.custom_field_options.length > 0) {
|
||||
dynamicProps[fieldKey] = Property.StaticDropdown({
|
||||
displayName,
|
||||
description,
|
||||
required: false,
|
||||
options: {
|
||||
disabled: false,
|
||||
placeholder: `Select ${displayName}`,
|
||||
options: field.custom_field_options.map(option => ({
|
||||
label: option.name,
|
||||
value: option.value,
|
||||
})),
|
||||
},
|
||||
});
|
||||
}
|
||||
break;
|
||||
case 'multiselect':
|
||||
if (field.custom_field_options && field.custom_field_options.length > 0) {
|
||||
dynamicProps[fieldKey] = Property.StaticMultiSelectDropdown({
|
||||
displayName,
|
||||
description,
|
||||
required: false,
|
||||
options: {
|
||||
options: field.custom_field_options.map(option => ({
|
||||
label: option.name,
|
||||
value: option.value,
|
||||
})),
|
||||
},
|
||||
});
|
||||
}
|
||||
break;
|
||||
case 'text':
|
||||
dynamicProps[fieldKey] = Property.ShortText({
|
||||
displayName,
|
||||
description,
|
||||
required: false,
|
||||
});
|
||||
break;
|
||||
case 'textarea':
|
||||
dynamicProps[fieldKey] = Property.LongText({
|
||||
displayName,
|
||||
description,
|
||||
required: false,
|
||||
});
|
||||
break;
|
||||
case 'integer':
|
||||
case 'decimal':
|
||||
dynamicProps[fieldKey] = Property.Number({
|
||||
displayName,
|
||||
description,
|
||||
required: false,
|
||||
});
|
||||
break;
|
||||
case 'date':
|
||||
dynamicProps[fieldKey] = Property.DateTime({
|
||||
displayName,
|
||||
description,
|
||||
required: false,
|
||||
});
|
||||
break;
|
||||
case 'checkbox':
|
||||
dynamicProps[fieldKey] = Property.Checkbox({
|
||||
displayName,
|
||||
description,
|
||||
required: false,
|
||||
});
|
||||
break;
|
||||
case 'regexp':
|
||||
dynamicProps[fieldKey] = Property.ShortText({
|
||||
displayName,
|
||||
description: `${description}${field.regexp_for_validation ? ` (Pattern: ${field.regexp_for_validation})` : ''}`,
|
||||
required: false,
|
||||
});
|
||||
break;
|
||||
default:
|
||||
dynamicProps[fieldKey] = Property.ShortText({
|
||||
displayName,
|
||||
description: `${description} (${field.type})`,
|
||||
required: false,
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
return dynamicProps;
|
||||
} catch (error) {
|
||||
console.warn('Failed to load organization fields:', error);
|
||||
return {};
|
||||
}
|
||||
},
|
||||
}),
|
||||
shared_tickets: Property.Checkbox({
|
||||
displayName: 'Shared Tickets',
|
||||
description: 'Allow users to see each other\'s tickets',
|
||||
required: false,
|
||||
}),
|
||||
shared_comments: Property.Checkbox({
|
||||
displayName: 'Shared Comments',
|
||||
description: 'Allow users to see each other\'s comments',
|
||||
required: false,
|
||||
}),
|
||||
},
|
||||
async run({ propsValue, auth }) {
|
||||
const authentication = auth;
|
||||
const {
|
||||
name,
|
||||
details,
|
||||
notes,
|
||||
external_id,
|
||||
group_id,
|
||||
domain_names,
|
||||
tags,
|
||||
organization_fields,
|
||||
shared_tickets,
|
||||
shared_comments,
|
||||
} = propsValue;
|
||||
|
||||
const organization: Record<string, unknown> = {
|
||||
name: name.trim(),
|
||||
};
|
||||
|
||||
const optionalParams = {
|
||||
details,
|
||||
notes,
|
||||
external_id,
|
||||
group_id,
|
||||
domain_names,
|
||||
tags,
|
||||
shared_tickets,
|
||||
shared_comments,
|
||||
};
|
||||
|
||||
for (const [key, value] of Object.entries(optionalParams)) {
|
||||
if (value !== null && value !== undefined && value !== '') {
|
||||
organization[key] = value;
|
||||
}
|
||||
}
|
||||
|
||||
if (organization_fields && typeof organization_fields === 'object') {
|
||||
try {
|
||||
const fieldsResponse = await httpClient.sendRequest({
|
||||
url: `https://${authentication.props.subdomain}.zendesk.com/api/v2/organization_fields.json`,
|
||||
method: HttpMethod.GET,
|
||||
authentication: {
|
||||
type: AuthenticationType.BASIC,
|
||||
username: authentication.props.email + '/token',
|
||||
password: authentication.props.token,
|
||||
},
|
||||
});
|
||||
|
||||
const fieldDefinitions = (fieldsResponse.body as { organization_fields: Array<{
|
||||
id: number;
|
||||
key: string;
|
||||
type: string;
|
||||
}> }).organization_fields;
|
||||
|
||||
const orgFieldsObj: Record<string, any> = {};
|
||||
|
||||
for (const [propKey, value] of Object.entries(organization_fields)) {
|
||||
if (value !== null && value !== undefined && value !== '') {
|
||||
const fieldKey = propKey.startsWith('field_') ? propKey.substring(6) : propKey;
|
||||
|
||||
const fieldDef = fieldDefinitions.find(f => f.key === fieldKey);
|
||||
if (fieldDef) {
|
||||
let formattedValue = value;
|
||||
if (fieldDef.type === 'date' && value) {
|
||||
formattedValue = new Date(value as string).toISOString().split('T')[0];
|
||||
}
|
||||
|
||||
orgFieldsObj[fieldDef.key] = formattedValue;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (Object.keys(orgFieldsObj).length > 0) {
|
||||
organization.organization_fields = orgFieldsObj;
|
||||
}
|
||||
} catch (error) {
|
||||
console.warn('Failed to process organization fields:', error);
|
||||
}
|
||||
}
|
||||
|
||||
try {
|
||||
const response = await httpClient.sendRequest({
|
||||
url: `https://${authentication.props.subdomain}.zendesk.com/api/v2/organizations.json`,
|
||||
method: HttpMethod.POST,
|
||||
headers: {
|
||||
'Content-Type': 'application/json',
|
||||
},
|
||||
authentication: {
|
||||
type: AuthenticationType.BASIC,
|
||||
username: authentication.props.email + '/token',
|
||||
password: authentication.props.token,
|
||||
},
|
||||
body: {
|
||||
organization,
|
||||
},
|
||||
});
|
||||
|
||||
return {
|
||||
success: true,
|
||||
message: 'Organization created successfully',
|
||||
data: response.body,
|
||||
};
|
||||
} catch (error) {
|
||||
const errorMessage = (error as Error).message;
|
||||
if (errorMessage.includes('400')) {
|
||||
throw new Error(
|
||||
'Invalid request parameters. Please check your input values and try again.'
|
||||
);
|
||||
}
|
||||
|
||||
if (errorMessage.includes('401') || errorMessage.includes('403')) {
|
||||
throw new Error(
|
||||
'Authentication failed or insufficient permissions. Please check your API credentials and permissions to manage organizations.'
|
||||
);
|
||||
}
|
||||
|
||||
if (errorMessage.includes('422')) {
|
||||
throw new Error(
|
||||
'Validation error. The organization name may already exist or be invalid. Organization names must be unique and cannot be empty.'
|
||||
);
|
||||
}
|
||||
|
||||
if (errorMessage.includes('429')) {
|
||||
throw new Error(
|
||||
'Rate limit exceeded. Please wait a moment before trying again.'
|
||||
);
|
||||
}
|
||||
|
||||
throw new Error(`Failed to create organization: ${errorMessage}`);
|
||||
}
|
||||
},
|
||||
});
|
||||
@@ -0,0 +1,518 @@
|
||||
import {
|
||||
createAction,
|
||||
Property,
|
||||
} from '@activepieces/pieces-framework';
|
||||
import {
|
||||
AuthenticationType,
|
||||
HttpMethod,
|
||||
httpClient,
|
||||
} from '@activepieces/pieces-common';
|
||||
import { zendeskAuth } from '../..';
|
||||
import { organizationIdDropdown, brandIdDropdown, problemTicketIdDropdown, groupIdDropdown } from '../common/props';
|
||||
|
||||
type AuthProps = {
|
||||
email: string;
|
||||
token: string;
|
||||
subdomain: string;
|
||||
};
|
||||
|
||||
export const createTicketAction = createAction({
|
||||
auth: zendeskAuth,
|
||||
name: 'create-ticket',
|
||||
displayName: 'Create Ticket',
|
||||
description: 'Create a new ticket in Zendesk.',
|
||||
props: {
|
||||
subject: Property.ShortText({
|
||||
displayName: 'Subject',
|
||||
description: 'The subject of the ticket (optional - will use first comment text if not provided)',
|
||||
required: false,
|
||||
}),
|
||||
comment_body: Property.LongText({
|
||||
displayName: 'Comment Body',
|
||||
description: 'The comment body (text). Use this for plain text comments.',
|
||||
required: false,
|
||||
}),
|
||||
comment_html_body: Property.LongText({
|
||||
displayName: 'Comment HTML Body',
|
||||
description: 'The comment body (HTML). Use this for HTML formatted comments. If provided, this takes precedence over Comment Body.',
|
||||
required: false,
|
||||
}),
|
||||
requester_email: Property.ShortText({
|
||||
displayName: 'Requester Email',
|
||||
description: 'Email address of the ticket requester. If not provided, the authenticated user will be the requester.',
|
||||
required: false,
|
||||
}),
|
||||
requester_name: Property.ShortText({
|
||||
displayName: 'Requester Name',
|
||||
description: 'Name of the ticket requester (used when creating a new user).',
|
||||
required: false,
|
||||
}),
|
||||
assignee_email: Property.ShortText({
|
||||
displayName: 'Assignee Email',
|
||||
description: 'Email address of the agent to assign the ticket to.',
|
||||
required: false,
|
||||
}),
|
||||
priority: Property.StaticDropdown({
|
||||
displayName: 'Priority',
|
||||
description: 'The priority of the ticket.',
|
||||
required: false,
|
||||
options: {
|
||||
disabled: false,
|
||||
placeholder: 'Select priority (optional)',
|
||||
options: [
|
||||
{ label: 'Low', value: 'low' },
|
||||
{ label: 'Normal', value: 'normal' },
|
||||
{ label: 'High', value: 'high' },
|
||||
{ label: 'Urgent', value: 'urgent' },
|
||||
],
|
||||
},
|
||||
}),
|
||||
type: Property.StaticDropdown({
|
||||
displayName: 'Type',
|
||||
description: 'The type of ticket.',
|
||||
required: false,
|
||||
options: {
|
||||
disabled: false,
|
||||
placeholder: 'Select type (optional)',
|
||||
options: [
|
||||
{ label: 'Problem', value: 'problem' },
|
||||
{ label: 'Incident', value: 'incident' },
|
||||
{ label: 'Question', value: 'question' },
|
||||
{ label: 'Task', value: 'task' },
|
||||
],
|
||||
},
|
||||
}),
|
||||
status: Property.StaticDropdown({
|
||||
displayName: 'Status',
|
||||
description: 'The status of the ticket.',
|
||||
required: false,
|
||||
options: {
|
||||
disabled: false,
|
||||
placeholder: 'Select status (optional)',
|
||||
options: [
|
||||
{ label: 'New', value: 'new' },
|
||||
{ label: 'Open', value: 'open' },
|
||||
{ label: 'Pending', value: 'pending' },
|
||||
{ label: 'Hold', value: 'hold' },
|
||||
{ label: 'Solved', value: 'solved' },
|
||||
{ label: 'Closed', value: 'closed' },
|
||||
],
|
||||
},
|
||||
}),
|
||||
tags: Property.Array({
|
||||
displayName: 'Tags',
|
||||
description: 'Array of tags to apply to the ticket.',
|
||||
required: false,
|
||||
}),
|
||||
organization_id: organizationIdDropdown,
|
||||
group_id: groupIdDropdown,
|
||||
external_id: Property.ShortText({
|
||||
displayName: 'External ID',
|
||||
description: 'An external ID for the ticket (useful for integrations).',
|
||||
required: false,
|
||||
}),
|
||||
collaborator_emails: Property.Array({
|
||||
displayName: 'Collaborator Emails',
|
||||
description: 'Array of email addresses to add as collaborators.',
|
||||
required: false,
|
||||
}),
|
||||
follower_emails: Property.Array({
|
||||
displayName: 'Follower Emails',
|
||||
description: 'Array of email addresses to add as followers.',
|
||||
required: false,
|
||||
}),
|
||||
due_at: Property.DateTime({
|
||||
displayName: 'Due Date',
|
||||
description: 'The date and time when the ticket is due.',
|
||||
required: false,
|
||||
}),
|
||||
custom_fields: Property.DynamicProperties({
|
||||
auth: zendeskAuth,
|
||||
displayName: 'Custom Fields',
|
||||
description: 'Custom ticket field values',
|
||||
required: false,
|
||||
refreshers: ['auth'],
|
||||
props: async ({ auth }) => {
|
||||
if (!auth) {
|
||||
return {};
|
||||
}
|
||||
|
||||
try {
|
||||
const authentication = auth;
|
||||
const response = await httpClient.sendRequest({
|
||||
url: `https://${authentication.props.subdomain}.zendesk.com/api/v2/ticket_fields.json`,
|
||||
method: HttpMethod.GET,
|
||||
authentication: {
|
||||
type: AuthenticationType.BASIC,
|
||||
username: authentication.props.email + '/token',
|
||||
password: authentication.props.token,
|
||||
},
|
||||
});
|
||||
|
||||
const fields = (response.body as { ticket_fields: Array<{
|
||||
id: number;
|
||||
key: string;
|
||||
title: string;
|
||||
description?: string;
|
||||
type: string;
|
||||
active: boolean;
|
||||
removable?: boolean;
|
||||
custom_field_options?: Array<{ name: string; value: string }>;
|
||||
regexp_for_validation?: string;
|
||||
}> }).ticket_fields;
|
||||
|
||||
const skipSystemTypes = new Set([
|
||||
'subject',
|
||||
'description',
|
||||
'priority',
|
||||
'status',
|
||||
'tickettype',
|
||||
'group',
|
||||
'assignee',
|
||||
]);
|
||||
|
||||
const dynamicProps: Record<string, any> = {};
|
||||
|
||||
for (const field of fields) {
|
||||
if (!field.active) continue;
|
||||
if (skipSystemTypes.has(field.type)) continue;
|
||||
|
||||
const fieldKey = `field_${field.key ?? `custom_field_${field.id}`}`;
|
||||
const displayName = field.title;
|
||||
const description = field.description || `Custom ${field.type} field`;
|
||||
|
||||
switch (field.type) {
|
||||
case 'tagger':
|
||||
if (field.custom_field_options && field.custom_field_options.length > 0) {
|
||||
dynamicProps[fieldKey] = Property.StaticDropdown({
|
||||
displayName,
|
||||
description,
|
||||
required: false,
|
||||
options: {
|
||||
disabled: false,
|
||||
placeholder: `Select ${displayName}`,
|
||||
options: field.custom_field_options.map(option => ({
|
||||
label: option.name,
|
||||
value: option.value,
|
||||
})),
|
||||
},
|
||||
});
|
||||
}
|
||||
break;
|
||||
case 'multiselect':
|
||||
if (field.custom_field_options && field.custom_field_options.length > 0) {
|
||||
dynamicProps[fieldKey] = Property.StaticMultiSelectDropdown({
|
||||
displayName,
|
||||
description,
|
||||
required: false,
|
||||
options: {
|
||||
options: field.custom_field_options.map(option => ({
|
||||
label: option.name,
|
||||
value: option.value,
|
||||
})),
|
||||
},
|
||||
});
|
||||
}
|
||||
break;
|
||||
case 'text':
|
||||
dynamicProps[fieldKey] = Property.ShortText({
|
||||
displayName,
|
||||
description,
|
||||
required: false,
|
||||
});
|
||||
break;
|
||||
case 'textarea':
|
||||
dynamicProps[fieldKey] = Property.LongText({
|
||||
displayName,
|
||||
description,
|
||||
required: false,
|
||||
});
|
||||
break;
|
||||
case 'integer':
|
||||
case 'decimal':
|
||||
dynamicProps[fieldKey] = Property.Number({
|
||||
displayName,
|
||||
description,
|
||||
required: false,
|
||||
});
|
||||
break;
|
||||
case 'date':
|
||||
dynamicProps[fieldKey] = Property.DateTime({
|
||||
displayName,
|
||||
description,
|
||||
required: false,
|
||||
});
|
||||
break;
|
||||
case 'checkbox':
|
||||
dynamicProps[fieldKey] = Property.Checkbox({
|
||||
displayName,
|
||||
description,
|
||||
required: false,
|
||||
});
|
||||
break;
|
||||
case 'regexp':
|
||||
dynamicProps[fieldKey] = Property.ShortText({
|
||||
displayName,
|
||||
description: `${description}${field.regexp_for_validation ? ` (Pattern: ${field.regexp_for_validation})` : ''}`,
|
||||
required: false,
|
||||
});
|
||||
break;
|
||||
default:
|
||||
dynamicProps[fieldKey] = Property.ShortText({
|
||||
displayName,
|
||||
description: `${description} (${field.type})`,
|
||||
required: false,
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
return dynamicProps;
|
||||
} catch (error) {
|
||||
console.warn('Failed to load ticket fields:', error);
|
||||
return {};
|
||||
}
|
||||
},
|
||||
}),
|
||||
comment_public: Property.Checkbox({
|
||||
displayName: 'Public Comment',
|
||||
description: 'Whether the comment is public (visible to the requester). Defaults to true.',
|
||||
required: false,
|
||||
}),
|
||||
brand_id: brandIdDropdown,
|
||||
forum_topic_id: Property.Number({
|
||||
displayName: 'Forum Topic ID',
|
||||
description: 'The ID of the forum topic associated with the ticket.',
|
||||
required: false,
|
||||
}),
|
||||
problem_id: problemTicketIdDropdown,
|
||||
},
|
||||
async run({ propsValue, auth }) {
|
||||
const authentication = auth;
|
||||
const {
|
||||
subject,
|
||||
comment_body,
|
||||
comment_html_body,
|
||||
requester_email,
|
||||
requester_name,
|
||||
assignee_email,
|
||||
priority,
|
||||
type,
|
||||
status,
|
||||
tags,
|
||||
organization_id,
|
||||
group_id,
|
||||
external_id,
|
||||
collaborator_emails,
|
||||
follower_emails,
|
||||
due_at,
|
||||
custom_fields,
|
||||
comment_public,
|
||||
brand_id,
|
||||
forum_topic_id,
|
||||
problem_id,
|
||||
} = propsValue;
|
||||
|
||||
if (!comment_body && !comment_html_body) {
|
||||
throw new Error('Either Comment Body or Comment HTML Body is required');
|
||||
}
|
||||
|
||||
const comment: Record<string, unknown> = {};
|
||||
if (comment_html_body) {
|
||||
comment.html_body = comment_html_body;
|
||||
} else if (comment_body) {
|
||||
comment.body = comment_body;
|
||||
}
|
||||
|
||||
if (comment_public !== undefined) {
|
||||
comment.public = comment_public;
|
||||
}
|
||||
|
||||
const ticket: Record<string, unknown> = {
|
||||
comment,
|
||||
};
|
||||
|
||||
if (subject) {
|
||||
ticket.subject = subject;
|
||||
}
|
||||
|
||||
const resolveUserByEmail = async (email: string) => {
|
||||
try {
|
||||
const response = await httpClient.sendRequest({
|
||||
url: `https://${authentication.props.subdomain}.zendesk.com/api/v2/users/search.json?query=email:${encodeURIComponent(email)}`,
|
||||
method: HttpMethod.GET,
|
||||
authentication: {
|
||||
type: AuthenticationType.BASIC,
|
||||
username: authentication.props.email + '/token',
|
||||
password: authentication.props.token,
|
||||
},
|
||||
});
|
||||
|
||||
const users = (response.body as { users: Array<{ id: number }> }).users;
|
||||
return users.length > 0 ? users[0].id : null;
|
||||
} catch (error) {
|
||||
console.warn(`Warning: Could not resolve user with email ${email}:`, (error as Error).message);
|
||||
return null;
|
||||
}
|
||||
};
|
||||
|
||||
if (requester_email) {
|
||||
const requesterId = await resolveUserByEmail(requester_email);
|
||||
if (requesterId) {
|
||||
ticket.requester_id = requesterId;
|
||||
} else {
|
||||
ticket.requester = {
|
||||
email: requester_email,
|
||||
name: requester_name || requester_email,
|
||||
};
|
||||
}
|
||||
}
|
||||
|
||||
if (assignee_email) {
|
||||
const assigneeId = await resolveUserByEmail(assignee_email);
|
||||
if (assigneeId) {
|
||||
ticket.assignee_id = assigneeId;
|
||||
} else {
|
||||
throw new Error(`Could not find agent with email: ${assignee_email}`);
|
||||
}
|
||||
}
|
||||
|
||||
if (collaborator_emails && Array.isArray(collaborator_emails) && collaborator_emails.length > 0) {
|
||||
const collaboratorIds = [];
|
||||
for (const email of collaborator_emails) {
|
||||
const collaboratorId = await resolveUserByEmail(email as string);
|
||||
if (collaboratorId) {
|
||||
collaboratorIds.push(collaboratorId);
|
||||
}
|
||||
}
|
||||
if (collaboratorIds.length > 0) {
|
||||
ticket.collaborator_ids = collaboratorIds;
|
||||
}
|
||||
}
|
||||
|
||||
if (follower_emails && Array.isArray(follower_emails) && follower_emails.length > 0) {
|
||||
const followerIds = [];
|
||||
for (const email of follower_emails) {
|
||||
const followerId = await resolveUserByEmail(email as string);
|
||||
if (followerId) {
|
||||
followerIds.push(followerId);
|
||||
}
|
||||
}
|
||||
if (followerIds.length > 0) {
|
||||
ticket.follower_ids = followerIds;
|
||||
}
|
||||
}
|
||||
|
||||
const optionalParams = {
|
||||
priority,
|
||||
type,
|
||||
status,
|
||||
tags,
|
||||
organization_id,
|
||||
group_id,
|
||||
external_id,
|
||||
due_at,
|
||||
brand_id,
|
||||
forum_topic_id,
|
||||
problem_id,
|
||||
};
|
||||
|
||||
for (const [key, value] of Object.entries(optionalParams)) {
|
||||
if (value !== null && value !== undefined && value !== '') {
|
||||
ticket[key] = value;
|
||||
}
|
||||
}
|
||||
|
||||
if (custom_fields && typeof custom_fields === 'object') {
|
||||
try {
|
||||
const fieldsResponse = await httpClient.sendRequest({
|
||||
url: `https://${authentication.props.subdomain}.zendesk.com/api/v2/ticket_fields.json`,
|
||||
method: HttpMethod.GET,
|
||||
authentication: {
|
||||
type: AuthenticationType.BASIC,
|
||||
username: authentication.props.email + '/token',
|
||||
password: authentication.props.token,
|
||||
},
|
||||
});
|
||||
|
||||
const fieldDefinitions = (fieldsResponse.body as { ticket_fields: Array<{
|
||||
id: number;
|
||||
key: string;
|
||||
type: string;
|
||||
}> }).ticket_fields;
|
||||
|
||||
const customFieldsArray: Array<{ id: number; value: unknown }> = [];
|
||||
for (const [propKey, value] of Object.entries(custom_fields)) {
|
||||
if (value === undefined || value === null || value === '') continue;
|
||||
|
||||
const fieldKey = propKey.startsWith('field_') ? propKey.substring(6) : propKey;
|
||||
const def = fieldDefinitions.find(f => (f.key ?? `custom_field_${f.id}`) === fieldKey || f.key === fieldKey);
|
||||
if (!def) continue;
|
||||
|
||||
let formattedValue: unknown = value;
|
||||
if (def.type === 'date' && typeof value === 'string') {
|
||||
formattedValue = new Date(value).toISOString().split('T')[0];
|
||||
}
|
||||
|
||||
customFieldsArray.push({ id: def.id, value: formattedValue });
|
||||
}
|
||||
|
||||
if (customFieldsArray.length > 0) {
|
||||
ticket.custom_fields = customFieldsArray;
|
||||
}
|
||||
} catch (error) {
|
||||
console.warn('Failed to process custom fields:', error);
|
||||
}
|
||||
}
|
||||
|
||||
try {
|
||||
const response = await httpClient.sendRequest({
|
||||
url: `https://${authentication.props.subdomain}.zendesk.com/api/v2/tickets.json`,
|
||||
method: HttpMethod.POST,
|
||||
headers: {
|
||||
'Content-Type': 'application/json',
|
||||
},
|
||||
authentication: {
|
||||
type: AuthenticationType.BASIC,
|
||||
username: authentication.props.email + '/token',
|
||||
password: authentication.props.token,
|
||||
},
|
||||
body: {
|
||||
ticket,
|
||||
},
|
||||
});
|
||||
|
||||
return {
|
||||
success: true,
|
||||
message: 'Ticket created successfully',
|
||||
data: response.body,
|
||||
};
|
||||
} catch (error) {
|
||||
const errorMessage = (error as Error).message;
|
||||
if (errorMessage.includes('400')) {
|
||||
throw new Error(
|
||||
'Invalid request parameters. Please check your input values and try again.'
|
||||
);
|
||||
}
|
||||
|
||||
if (errorMessage.includes('401') || errorMessage.includes('403')) {
|
||||
throw new Error(
|
||||
'Authentication failed. Please check your API credentials and permissions.'
|
||||
);
|
||||
}
|
||||
|
||||
if (errorMessage.includes('422')) {
|
||||
throw new Error(
|
||||
'Validation error. Please check that all required fields are provided and valid.'
|
||||
);
|
||||
}
|
||||
|
||||
if (errorMessage.includes('429')) {
|
||||
throw new Error(
|
||||
'Rate limit exceeded. Please wait a moment before trying again.'
|
||||
);
|
||||
}
|
||||
|
||||
throw new Error(`Failed to create ticket: ${errorMessage}`);
|
||||
}
|
||||
},
|
||||
});
|
||||
@@ -0,0 +1,545 @@
|
||||
import { createAction, Property } from '@activepieces/pieces-framework';
|
||||
import {
|
||||
AuthenticationType,
|
||||
HttpMethod,
|
||||
httpClient,
|
||||
} from '@activepieces/pieces-common';
|
||||
import { zendeskAuth } from '../..';
|
||||
import {
|
||||
organizationIdDropdown,
|
||||
customRoleIdDropdown,
|
||||
agentBrandIdDropdown,
|
||||
groupIdDropdown,
|
||||
} from '../common/props';
|
||||
|
||||
type AuthProps = {
|
||||
email: string;
|
||||
token: string;
|
||||
subdomain: string;
|
||||
};
|
||||
|
||||
export const createUserAction = createAction({
|
||||
auth: zendeskAuth,
|
||||
name: 'create-user',
|
||||
displayName: 'Create User',
|
||||
description: 'Add a new user to the Zendesk instance.',
|
||||
props: {
|
||||
name: Property.ShortText({
|
||||
displayName: 'Name',
|
||||
description: 'The name of the user',
|
||||
required: true,
|
||||
}),
|
||||
email: Property.ShortText({
|
||||
displayName: 'Email',
|
||||
description: 'The primary email address of the user',
|
||||
required: false,
|
||||
}),
|
||||
role: Property.StaticDropdown({
|
||||
displayName: 'Role',
|
||||
description:
|
||||
'The role of the user. Defaults to "end-user" if not specified.',
|
||||
required: false,
|
||||
options: {
|
||||
disabled: false,
|
||||
placeholder: 'Select role (optional)',
|
||||
options: [
|
||||
{ label: 'End User', value: 'end-user' },
|
||||
{ label: 'Agent', value: 'agent' },
|
||||
{ label: 'Admin', value: 'admin' },
|
||||
],
|
||||
},
|
||||
}),
|
||||
custom_role_id: customRoleIdDropdown,
|
||||
organization_id: organizationIdDropdown,
|
||||
organization_name: Property.ShortText({
|
||||
displayName: 'Organization Name',
|
||||
description:
|
||||
'Create and associate user with a new organization by name (alternative to Organization ID)',
|
||||
required: false,
|
||||
}),
|
||||
phone: Property.ShortText({
|
||||
displayName: 'Phone',
|
||||
description: 'The phone number of the user',
|
||||
required: false,
|
||||
}),
|
||||
alias: Property.ShortText({
|
||||
displayName: 'Alias',
|
||||
description: 'An alias displayed to end users',
|
||||
required: false,
|
||||
}),
|
||||
details: Property.LongText({
|
||||
displayName: 'Details',
|
||||
description: 'Additional details about the user',
|
||||
required: false,
|
||||
}),
|
||||
notes: Property.LongText({
|
||||
displayName: 'Notes',
|
||||
description: 'Internal notes about the user',
|
||||
required: false,
|
||||
}),
|
||||
external_id: Property.ShortText({
|
||||
displayName: 'External ID',
|
||||
description:
|
||||
'A unique external ID for the user (useful for integrations)',
|
||||
required: false,
|
||||
}),
|
||||
time_zone: Property.ShortText({
|
||||
displayName: 'Time Zone',
|
||||
description: 'The time zone of the user (e.g., "America/New_York")',
|
||||
required: false,
|
||||
}),
|
||||
locale: Property.ShortText({
|
||||
displayName: 'Locale',
|
||||
description: 'The locale of the user (e.g., "en-US")',
|
||||
required: false,
|
||||
}),
|
||||
verified: Property.Checkbox({
|
||||
displayName: 'Verified',
|
||||
description: 'Whether the user is verified',
|
||||
required: false,
|
||||
}),
|
||||
active: Property.Checkbox({
|
||||
displayName: 'Active',
|
||||
description: 'Whether the user is active. Defaults to true.',
|
||||
required: false,
|
||||
}),
|
||||
shared: Property.Checkbox({
|
||||
displayName: 'Shared',
|
||||
description:
|
||||
'Whether the user is shared from a different Zendesk Support instance',
|
||||
required: false,
|
||||
}),
|
||||
shared_agent: Property.Checkbox({
|
||||
displayName: 'Shared Agent',
|
||||
description:
|
||||
'Whether the user is a shared agent from a different Zendesk Support instance',
|
||||
required: false,
|
||||
}),
|
||||
moderator: Property.Checkbox({
|
||||
displayName: 'Moderator',
|
||||
description: 'Whether the user has forum moderation capabilities',
|
||||
required: false,
|
||||
}),
|
||||
suspended: Property.Checkbox({
|
||||
displayName: 'Suspended',
|
||||
description: 'Whether the user is suspended',
|
||||
required: false,
|
||||
}),
|
||||
restricted_agent: Property.Checkbox({
|
||||
displayName: 'Restricted Agent',
|
||||
description:
|
||||
'Whether the agent has restrictions on what tickets they can access',
|
||||
required: false,
|
||||
}),
|
||||
only_private_comments: Property.Checkbox({
|
||||
displayName: 'Only Private Comments',
|
||||
description: 'Whether the user can only create private comments',
|
||||
required: false,
|
||||
}),
|
||||
report_csv: Property.Checkbox({
|
||||
displayName: 'Report CSV',
|
||||
description: 'Whether the user can access CSV reports',
|
||||
required: false,
|
||||
}),
|
||||
skip_verify_email: Property.Checkbox({
|
||||
displayName: 'Skip Verify Email',
|
||||
description: 'Skip sending a verification email to the user',
|
||||
required: false,
|
||||
}),
|
||||
ticket_restriction: Property.StaticDropdown({
|
||||
displayName: 'Ticket Restriction',
|
||||
description: 'The ticket restriction for the user',
|
||||
required: false,
|
||||
options: {
|
||||
disabled: false,
|
||||
placeholder: 'Select restriction (optional)',
|
||||
options: [
|
||||
{ label: 'Organization', value: 'organization' },
|
||||
{ label: 'Groups', value: 'groups' },
|
||||
{ label: 'Assigned', value: 'assigned' },
|
||||
{ label: 'Requested', value: 'requested' },
|
||||
],
|
||||
},
|
||||
}),
|
||||
signature: Property.LongText({
|
||||
displayName: 'Signature',
|
||||
description: "The user's signature for email responses",
|
||||
required: false,
|
||||
}),
|
||||
default_group_id: groupIdDropdown,
|
||||
agent_brand_ids: agentBrandIdDropdown,
|
||||
tags: Property.Array({
|
||||
displayName: 'Tags',
|
||||
description: 'Array of tags to apply to the user',
|
||||
required: false,
|
||||
}),
|
||||
user_fields: Property.DynamicProperties({
|
||||
auth: zendeskAuth,
|
||||
displayName: 'User Fields',
|
||||
description: 'Custom user field values',
|
||||
required: false,
|
||||
refreshers: ['auth'],
|
||||
props: async ({ auth }) => {
|
||||
if (!auth) {
|
||||
return {};
|
||||
}
|
||||
|
||||
try {
|
||||
const authentication = auth;
|
||||
const response = await httpClient.sendRequest({
|
||||
url: `https://${authentication.props.subdomain}.zendesk.com/api/v2/user_fields.json`,
|
||||
method: HttpMethod.GET,
|
||||
authentication: {
|
||||
type: AuthenticationType.BASIC,
|
||||
username: authentication.props.email + '/token',
|
||||
password: authentication.props.token,
|
||||
},
|
||||
});
|
||||
|
||||
const fields = (response.body as { user_fields: Array<{
|
||||
id: number;
|
||||
key: string;
|
||||
title: string;
|
||||
description?: string;
|
||||
type: string;
|
||||
active: boolean;
|
||||
custom_field_options?: Array<{ name: string; value: string }>;
|
||||
regexp_for_validation?: string;
|
||||
}> }).user_fields;
|
||||
|
||||
const dynamicProps: Record<string, any> = {};
|
||||
for (const field of fields) {
|
||||
if (!field.active) continue;
|
||||
|
||||
const fieldKey = `field_${field.key}`;
|
||||
const displayName = field.title;
|
||||
const description = field.description || `Custom ${field.type} field`;
|
||||
|
||||
switch (field.type) {
|
||||
case 'tagger':
|
||||
if (field.custom_field_options && field.custom_field_options.length > 0) {
|
||||
dynamicProps[fieldKey] = Property.StaticDropdown({
|
||||
displayName,
|
||||
description,
|
||||
required: false,
|
||||
options: {
|
||||
disabled: false,
|
||||
placeholder: `Select ${displayName}`,
|
||||
options: field.custom_field_options.map(option => ({
|
||||
label: option.name,
|
||||
value: option.value,
|
||||
})),
|
||||
},
|
||||
});
|
||||
}
|
||||
break;
|
||||
case 'multiselect':
|
||||
if (field.custom_field_options && field.custom_field_options.length > 0) {
|
||||
dynamicProps[fieldKey] = Property.StaticMultiSelectDropdown({
|
||||
displayName,
|
||||
description,
|
||||
required: false,
|
||||
options: {
|
||||
options: field.custom_field_options.map(option => ({
|
||||
label: option.name,
|
||||
value: option.value,
|
||||
})),
|
||||
},
|
||||
});
|
||||
}
|
||||
break;
|
||||
case 'text':
|
||||
dynamicProps[fieldKey] = Property.ShortText({
|
||||
displayName,
|
||||
description,
|
||||
required: false,
|
||||
});
|
||||
break;
|
||||
case 'textarea':
|
||||
dynamicProps[fieldKey] = Property.LongText({
|
||||
displayName,
|
||||
description,
|
||||
required: false,
|
||||
});
|
||||
break;
|
||||
case 'integer':
|
||||
case 'decimal':
|
||||
dynamicProps[fieldKey] = Property.Number({
|
||||
displayName,
|
||||
description,
|
||||
required: false,
|
||||
});
|
||||
break;
|
||||
case 'date':
|
||||
dynamicProps[fieldKey] = Property.DateTime({
|
||||
displayName,
|
||||
description,
|
||||
required: false,
|
||||
});
|
||||
break;
|
||||
case 'checkbox':
|
||||
dynamicProps[fieldKey] = Property.Checkbox({
|
||||
displayName,
|
||||
description,
|
||||
required: false,
|
||||
});
|
||||
break;
|
||||
case 'regexp':
|
||||
dynamicProps[fieldKey] = Property.ShortText({
|
||||
displayName,
|
||||
description: `${description}${field.regexp_for_validation ? ` (Pattern: ${field.regexp_for_validation})` : ''}`,
|
||||
required: false,
|
||||
});
|
||||
break;
|
||||
default:
|
||||
dynamicProps[fieldKey] = Property.ShortText({
|
||||
displayName,
|
||||
description: `${description} (${field.type})`,
|
||||
required: false,
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
return dynamicProps;
|
||||
} catch (error) {
|
||||
console.warn('Failed to load user fields:', error);
|
||||
return {};
|
||||
}
|
||||
},
|
||||
}),
|
||||
identities: Property.Json({
|
||||
displayName: 'Identities',
|
||||
description:
|
||||
'Array of identity objects with type and value. Example: [{"type": "email", "value": "test@user.com"}, {"type": "twitter", "value": "username"}]',
|
||||
required: false,
|
||||
}),
|
||||
},
|
||||
async run({ propsValue, auth }) {
|
||||
const authentication = auth;
|
||||
const {
|
||||
name,
|
||||
email,
|
||||
role,
|
||||
custom_role_id,
|
||||
organization_id,
|
||||
organization_name,
|
||||
phone,
|
||||
alias,
|
||||
details,
|
||||
notes,
|
||||
external_id,
|
||||
time_zone,
|
||||
locale,
|
||||
verified,
|
||||
active,
|
||||
shared,
|
||||
shared_agent,
|
||||
moderator,
|
||||
suspended,
|
||||
restricted_agent,
|
||||
only_private_comments,
|
||||
report_csv,
|
||||
skip_verify_email,
|
||||
ticket_restriction,
|
||||
signature,
|
||||
default_group_id,
|
||||
agent_brand_ids,
|
||||
tags,
|
||||
user_fields,
|
||||
identities,
|
||||
} = propsValue;
|
||||
|
||||
const user: Record<string, unknown> = {
|
||||
name,
|
||||
};
|
||||
|
||||
if (email) {
|
||||
user.email = email;
|
||||
}
|
||||
|
||||
if (role) {
|
||||
user.role = role;
|
||||
if (role === 'agent' && custom_role_id) {
|
||||
user.custom_role_id = custom_role_id;
|
||||
}
|
||||
} else if (custom_role_id) {
|
||||
user.role = 'agent';
|
||||
user.custom_role_id = custom_role_id;
|
||||
}
|
||||
|
||||
if (organization_id) {
|
||||
user.organization_id = organization_id;
|
||||
} else if (organization_name) {
|
||||
user.organization = {
|
||||
name: organization_name,
|
||||
};
|
||||
}
|
||||
|
||||
const booleanParams = {
|
||||
verified,
|
||||
active,
|
||||
shared,
|
||||
shared_agent,
|
||||
moderator,
|
||||
suspended,
|
||||
restricted_agent,
|
||||
only_private_comments,
|
||||
report_csv,
|
||||
};
|
||||
|
||||
for (const [key, value] of Object.entries(booleanParams)) {
|
||||
if (value !== undefined && value !== null) {
|
||||
user[key] = value;
|
||||
}
|
||||
}
|
||||
|
||||
const optionalParams = {
|
||||
phone,
|
||||
alias,
|
||||
details,
|
||||
notes,
|
||||
external_id,
|
||||
time_zone,
|
||||
locale,
|
||||
ticket_restriction,
|
||||
signature,
|
||||
default_group_id,
|
||||
tags,
|
||||
};
|
||||
|
||||
for (const [key, value] of Object.entries(optionalParams)) {
|
||||
if (value !== null && value !== undefined && value !== '') {
|
||||
user[key] = value;
|
||||
}
|
||||
}
|
||||
|
||||
if (
|
||||
agent_brand_ids &&
|
||||
Array.isArray(agent_brand_ids) &&
|
||||
agent_brand_ids.length > 0
|
||||
) {
|
||||
const brandIds = agent_brand_ids.map((id) =>
|
||||
typeof id === 'string' ? parseInt(id) : id
|
||||
);
|
||||
user.agent_brand_ids = brandIds;
|
||||
}
|
||||
|
||||
if (user_fields && typeof user_fields === 'object') {
|
||||
try {
|
||||
const fieldsResponse = await httpClient.sendRequest({
|
||||
url: `https://${authentication.props.subdomain}.zendesk.com/api/v2/user_fields.json`,
|
||||
method: HttpMethod.GET,
|
||||
authentication: {
|
||||
type: AuthenticationType.BASIC,
|
||||
username: authentication.props.email + '/token',
|
||||
password: authentication.props.token,
|
||||
},
|
||||
});
|
||||
|
||||
const defs = (fieldsResponse.body as { user_fields: Array<{ id: number; key: string; type: string }> }).user_fields;
|
||||
const mapped: Record<string, unknown> = {};
|
||||
for (const [propKey, value] of Object.entries(user_fields)) {
|
||||
if (value === undefined || value === null || value === '') continue;
|
||||
const key = propKey.startsWith('field_') ? propKey.substring(6) : propKey;
|
||||
const def = defs.find(d => d.key === key);
|
||||
if (!def) continue;
|
||||
let formatted: unknown = value;
|
||||
if (def.type === 'date' && typeof value === 'string') {
|
||||
formatted = new Date(value).toISOString();
|
||||
}
|
||||
mapped[def.key] = formatted;
|
||||
}
|
||||
if (Object.keys(mapped).length > 0) {
|
||||
user.user_fields = mapped;
|
||||
}
|
||||
} catch (error) {
|
||||
console.warn('Failed to process user fields:', error);
|
||||
}
|
||||
}
|
||||
|
||||
if (identities) {
|
||||
try {
|
||||
const identitiesArray =
|
||||
typeof identities === 'string' ? JSON.parse(identities) : identities;
|
||||
if (!Array.isArray(identitiesArray)) {
|
||||
throw new Error(
|
||||
'Identities must be an array of objects with type and value properties.'
|
||||
);
|
||||
}
|
||||
|
||||
for (const identity of identitiesArray) {
|
||||
if (!identity.type || !identity.value) {
|
||||
throw new Error(
|
||||
'Each identity must have both "type" and "value" properties.'
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
user.identities = identitiesArray;
|
||||
} catch (error) {
|
||||
throw new Error(
|
||||
`Invalid identities format: ${(error as Error).message}`
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
const requestBody: Record<string, unknown> = {
|
||||
user,
|
||||
};
|
||||
|
||||
if (skip_verify_email) {
|
||||
requestBody.skip_verify_email = true;
|
||||
}
|
||||
|
||||
try {
|
||||
const response = await httpClient.sendRequest({
|
||||
url: `https://${authentication.props.subdomain}.zendesk.com/api/v2/users.json`,
|
||||
method: HttpMethod.POST,
|
||||
headers: {
|
||||
'Content-Type': 'application/json',
|
||||
},
|
||||
authentication: {
|
||||
type: AuthenticationType.BASIC,
|
||||
username: authentication.props.email + '/token',
|
||||
password: authentication.props.token,
|
||||
},
|
||||
body: requestBody,
|
||||
});
|
||||
|
||||
return {
|
||||
success: true,
|
||||
message: 'User created successfully',
|
||||
data: response.body,
|
||||
user_role: user.role || 'end-user',
|
||||
verification_email_sent: !skip_verify_email,
|
||||
};
|
||||
} catch (error) {
|
||||
const errorMessage = (error as Error).message;
|
||||
if (errorMessage.includes('400')) {
|
||||
throw new Error(
|
||||
'Invalid request parameters. Please check your input values and try again.'
|
||||
);
|
||||
}
|
||||
|
||||
if (errorMessage.includes('401') || errorMessage.includes('403')) {
|
||||
throw new Error(
|
||||
'Authentication failed or insufficient permissions. Please check your API credentials and permissions to manage users.'
|
||||
);
|
||||
}
|
||||
|
||||
if (errorMessage.includes('422')) {
|
||||
throw new Error(
|
||||
'Validation error. The email may already exist, be invalid, or required fields may be missing.'
|
||||
);
|
||||
}
|
||||
|
||||
if (errorMessage.includes('429')) {
|
||||
throw new Error(
|
||||
'Rate limit exceeded. Please wait a moment before trying again.'
|
||||
);
|
||||
}
|
||||
|
||||
throw new Error(`Failed to create user: ${errorMessage}`);
|
||||
}
|
||||
},
|
||||
});
|
||||
@@ -0,0 +1,96 @@
|
||||
import {
|
||||
createAction,
|
||||
Property,
|
||||
} from '@activepieces/pieces-framework';
|
||||
import {
|
||||
AuthenticationType,
|
||||
HttpMethod,
|
||||
httpClient,
|
||||
} from '@activepieces/pieces-common';
|
||||
import { zendeskAuth } from '../..';
|
||||
import { userIdDropdown } from '../common/props';
|
||||
|
||||
type AuthProps = {
|
||||
email: string;
|
||||
token: string;
|
||||
subdomain: string;
|
||||
};
|
||||
|
||||
export const deleteUserAction = createAction({
|
||||
auth: zendeskAuth,
|
||||
name: 'delete-user',
|
||||
displayName: 'Delete User',
|
||||
description: 'Remove a user and associated records from the account.',
|
||||
props: {
|
||||
user_id: userIdDropdown,
|
||||
confirmation: Property.Checkbox({
|
||||
displayName: 'Confirm Deletion',
|
||||
description: 'I understand that deleted users are not recoverable and this action cannot be undone.',
|
||||
required: true,
|
||||
}),
|
||||
},
|
||||
async run({ propsValue, auth }) {
|
||||
const authentication = auth;
|
||||
const {
|
||||
user_id,
|
||||
confirmation,
|
||||
} = propsValue;
|
||||
|
||||
if (!confirmation) {
|
||||
throw new Error('You must confirm that you understand this action cannot be undone.');
|
||||
}
|
||||
|
||||
try {
|
||||
const response = await httpClient.sendRequest({
|
||||
url: `https://${authentication.props.subdomain}.zendesk.com/api/v2/users/${user_id}.json`,
|
||||
method: HttpMethod.DELETE,
|
||||
authentication: {
|
||||
type: AuthenticationType.BASIC,
|
||||
username: authentication.props.email + '/token',
|
||||
password: authentication.props.token,
|
||||
},
|
||||
});
|
||||
|
||||
return {
|
||||
success: true,
|
||||
message: `User ${user_id} has been deleted`,
|
||||
data: response.body,
|
||||
warning: "Deleted users are not recoverable in Zendesk UI. For GDPR erasure, use 'Permanently Delete User' if required.",
|
||||
note: 'To comply with GDPR, you may need to use the "Permanently Delete User" endpoint for complete data removal.',
|
||||
};
|
||||
} catch (error) {
|
||||
const errorMessage = (error as Error).message;
|
||||
if (errorMessage.includes('400')) {
|
||||
throw new Error(
|
||||
'Invalid request parameters. Please check the user ID and try again.'
|
||||
);
|
||||
}
|
||||
|
||||
if (errorMessage.includes('401') || errorMessage.includes('403')) {
|
||||
throw new Error(
|
||||
'Authentication failed or insufficient permissions. Please check your API credentials and permissions to manage users.'
|
||||
);
|
||||
}
|
||||
|
||||
if (errorMessage.includes('404')) {
|
||||
throw new Error(
|
||||
`User with ID ${user_id} not found. Please verify the user ID.`
|
||||
);
|
||||
}
|
||||
|
||||
if (errorMessage.includes('422')) {
|
||||
throw new Error(
|
||||
'Cannot delete this user. The user may be the account owner or have restrictions preventing deletion.'
|
||||
);
|
||||
}
|
||||
|
||||
if (errorMessage.includes('429')) {
|
||||
throw new Error(
|
||||
'Rate limit exceeded. Please wait a moment before trying again.'
|
||||
);
|
||||
}
|
||||
|
||||
throw new Error(`Failed to delete user: ${errorMessage}`);
|
||||
}
|
||||
},
|
||||
});
|
||||
@@ -0,0 +1,229 @@
|
||||
import {
|
||||
createAction,
|
||||
Property,
|
||||
} from '@activepieces/pieces-framework';
|
||||
import {
|
||||
AuthenticationType,
|
||||
HttpMethod,
|
||||
httpClient,
|
||||
} from '@activepieces/pieces-common';
|
||||
import { zendeskAuth } from '../..';
|
||||
|
||||
type AuthProps = {
|
||||
email: string;
|
||||
token: string;
|
||||
subdomain: string;
|
||||
};
|
||||
|
||||
export const findOrganizationAction = createAction({
|
||||
auth: zendeskAuth,
|
||||
name: 'find-organization',
|
||||
displayName: 'Find Organization(s)',
|
||||
description: 'Search organizations by name, domain, external ID, or other criteria.',
|
||||
props: {
|
||||
search_type: Property.StaticDropdown({
|
||||
displayName: 'Search Type',
|
||||
description: 'Choose how to search for organizations',
|
||||
required: true,
|
||||
options: {
|
||||
disabled: false,
|
||||
options: [
|
||||
{ label: 'Search by Name', value: 'name' },
|
||||
{ label: 'Search by Domain', value: 'domain' },
|
||||
{ label: 'Search by External ID', value: 'external_id' },
|
||||
{ label: 'Search by Tag', value: 'tag' },
|
||||
{ label: 'Search by Details', value: 'details' },
|
||||
{ label: 'Custom Query', value: 'custom' },
|
||||
],
|
||||
},
|
||||
}),
|
||||
name: Property.ShortText({
|
||||
displayName: 'Organization Name',
|
||||
description: 'The name of the organization to search for',
|
||||
required: false,
|
||||
}),
|
||||
domain: Property.ShortText({
|
||||
displayName: 'Domain',
|
||||
description: 'Search organizations by domain name',
|
||||
required: false,
|
||||
}),
|
||||
external_id: Property.ShortText({
|
||||
displayName: 'External ID',
|
||||
description: 'Search organizations by external ID',
|
||||
required: false,
|
||||
}),
|
||||
tag: Property.ShortText({
|
||||
displayName: 'Tag',
|
||||
description: 'Search organizations containing this tag',
|
||||
required: false,
|
||||
}),
|
||||
details: Property.ShortText({
|
||||
displayName: 'Details',
|
||||
description: 'Search in organization details/notes',
|
||||
required: false,
|
||||
}),
|
||||
custom_query: Property.LongText({
|
||||
displayName: 'Custom Query',
|
||||
description: 'Custom search query using Zendesk search syntax (e.g., "type:organization domain:example.com")',
|
||||
required: false,
|
||||
}),
|
||||
sort_by: Property.StaticDropdown({
|
||||
displayName: 'Sort By',
|
||||
description: 'How to sort the results',
|
||||
required: false,
|
||||
options: {
|
||||
disabled: false,
|
||||
options: [
|
||||
{ label: 'Relevance (Default)', value: 'relevance' },
|
||||
{ label: 'Created Date', value: 'created_at' },
|
||||
{ label: 'Updated Date', value: 'updated_at' },
|
||||
],
|
||||
},
|
||||
}),
|
||||
sort_order: Property.StaticDropdown({
|
||||
displayName: 'Sort Order',
|
||||
description: 'Sort order for results',
|
||||
required: false,
|
||||
options: {
|
||||
disabled: false,
|
||||
options: [
|
||||
{ label: 'Descending (Default)', value: 'desc' },
|
||||
{ label: 'Ascending', value: 'asc' },
|
||||
],
|
||||
},
|
||||
}),
|
||||
},
|
||||
async run({ propsValue, auth }) {
|
||||
const authentication = auth;
|
||||
const {
|
||||
search_type,
|
||||
name,
|
||||
domain,
|
||||
external_id,
|
||||
tag,
|
||||
details,
|
||||
custom_query,
|
||||
sort_by,
|
||||
sort_order,
|
||||
} = propsValue;
|
||||
|
||||
let query = 'type:organization';
|
||||
|
||||
switch (search_type) {
|
||||
case 'name':
|
||||
if (!name) {
|
||||
throw new Error('Organization name is required when searching by name.');
|
||||
}
|
||||
query += ` name:"${name}"`;
|
||||
break;
|
||||
case 'domain':
|
||||
if (!domain) {
|
||||
throw new Error('Domain is required when searching by domain.');
|
||||
}
|
||||
query += ` domain:${domain}`;
|
||||
break;
|
||||
case 'external_id':
|
||||
if (!external_id) {
|
||||
throw new Error('External ID is required when searching by external ID.');
|
||||
}
|
||||
query += ` external_id:${external_id}`;
|
||||
break;
|
||||
case 'tag':
|
||||
if (!tag) {
|
||||
throw new Error('Tag is required when searching by tag.');
|
||||
}
|
||||
query += ` tags:${tag}`;
|
||||
break;
|
||||
case 'details':
|
||||
if (!details) {
|
||||
throw new Error('Details are required when searching by details.');
|
||||
}
|
||||
query += ` details:"${details}"`;
|
||||
break;
|
||||
case 'custom':
|
||||
if (!custom_query) {
|
||||
throw new Error('Custom query is required when using custom search.');
|
||||
}
|
||||
query = custom_query;
|
||||
break;
|
||||
default:
|
||||
throw new Error('Invalid search type selected.');
|
||||
}
|
||||
|
||||
const searchParams = new URLSearchParams();
|
||||
searchParams.append('query', query);
|
||||
|
||||
if (sort_by && sort_by !== 'relevance') {
|
||||
searchParams.append('sort_by', sort_by);
|
||||
}
|
||||
|
||||
if (sort_order) {
|
||||
searchParams.append('sort_order', sort_order);
|
||||
}
|
||||
|
||||
try {
|
||||
const response = await httpClient.sendRequest({
|
||||
url: `https://${authentication.props.subdomain}.zendesk.com/api/v2/search.json?${searchParams.toString()}`,
|
||||
method: HttpMethod.GET,
|
||||
authentication: {
|
||||
type: AuthenticationType.BASIC,
|
||||
username: authentication.props.email + '/token',
|
||||
password: authentication.props.token,
|
||||
},
|
||||
});
|
||||
|
||||
const responseBody = response.body as {
|
||||
results: Array<Record<string, unknown>>;
|
||||
count: number;
|
||||
next_page?: string;
|
||||
previous_page?: string;
|
||||
facets?: unknown;
|
||||
};
|
||||
|
||||
const organizations = responseBody.results.filter(result => result.result_type === 'organization');
|
||||
|
||||
return {
|
||||
success: true,
|
||||
message: `Found ${organizations.length} organization(s) matching the search criteria`,
|
||||
data: response.body,
|
||||
organizations,
|
||||
search_criteria: {
|
||||
type: search_type,
|
||||
query: query,
|
||||
sort_by: sort_by || 'relevance',
|
||||
sort_order: sort_order || 'desc',
|
||||
},
|
||||
total_count: responseBody.count,
|
||||
found_count: organizations.length,
|
||||
has_more: !!responseBody.next_page,
|
||||
};
|
||||
} catch (error) {
|
||||
const errorMessage = (error as Error).message;
|
||||
if (errorMessage.includes('400')) {
|
||||
throw new Error(
|
||||
'Invalid search query. Please check your search parameters and try again.'
|
||||
);
|
||||
}
|
||||
|
||||
if (errorMessage.includes('401') || errorMessage.includes('403')) {
|
||||
throw new Error(
|
||||
'Authentication failed or insufficient permissions. Please check your API credentials and permissions to search organizations.'
|
||||
);
|
||||
}
|
||||
|
||||
if (errorMessage.includes('422')) {
|
||||
throw new Error(
|
||||
'Search query validation error. Please check your search syntax and parameters.'
|
||||
);
|
||||
}
|
||||
|
||||
if (errorMessage.includes('429')) {
|
||||
throw new Error(
|
||||
'Rate limit exceeded. Please wait a moment before trying again.'
|
||||
);
|
||||
}
|
||||
|
||||
throw new Error(`Failed to search organizations: ${errorMessage}`);
|
||||
}
|
||||
},
|
||||
});
|
||||
@@ -0,0 +1,363 @@
|
||||
import { createAction, Property } from '@activepieces/pieces-framework';
|
||||
import {
|
||||
AuthenticationType,
|
||||
HttpMethod,
|
||||
httpClient,
|
||||
} from '@activepieces/pieces-common';
|
||||
import { zendeskAuth } from '../..';
|
||||
import { isEmpty } from '@activepieces/shared';
|
||||
import dayjs from 'dayjs'
|
||||
|
||||
type AuthProps = {
|
||||
email: string;
|
||||
token: string;
|
||||
subdomain: string;
|
||||
};
|
||||
|
||||
export const findTicketsAction = createAction({
|
||||
auth: zendeskAuth,
|
||||
name: 'find-tickets',
|
||||
displayName: 'Find Ticket(s)',
|
||||
description: 'Search tickets by ID, field, or content.',
|
||||
props: {
|
||||
search_type: Property.StaticDropdown({
|
||||
displayName: 'Search Type',
|
||||
description: 'Choose how to search for tickets',
|
||||
required: true,
|
||||
options: {
|
||||
disabled: false,
|
||||
options: [
|
||||
{ label: 'Search by Ticket ID', value: 'id' },
|
||||
{ label: 'Search by Status', value: 'status' },
|
||||
{ label: 'Search by Priority', value: 'priority' },
|
||||
{ label: 'Search by Type', value: 'type' },
|
||||
{ label: 'Search by Tag', value: 'tag' },
|
||||
{ label: 'Search by Requester Email', value: 'requester' },
|
||||
{ label: 'Search by Assignee Email', value: 'assignee' },
|
||||
{ label: 'Search by Subject/Content', value: 'content' },
|
||||
{ label: 'Custom Query', value: 'custom' },
|
||||
],
|
||||
},
|
||||
}),
|
||||
timeFilter: Property.Array({
|
||||
displayName: 'Date Time Filter',
|
||||
required: false,
|
||||
properties: {
|
||||
field: Property.StaticDropdown({
|
||||
displayName: 'Date Field',
|
||||
description: 'Date field to apply filter on',
|
||||
required: true,
|
||||
options: {
|
||||
disabled: false,
|
||||
options: [
|
||||
{
|
||||
label: 'Created At',
|
||||
value: 'created',
|
||||
},
|
||||
{ label: 'Updated At', value: 'updated' },
|
||||
{ label: 'Solved At', value: 'solved' },
|
||||
{ label: 'Due Date', value: 'due_date' },
|
||||
],
|
||||
},
|
||||
}),
|
||||
operator: Property.StaticDropdown({
|
||||
displayName: 'Operator',
|
||||
required: true,
|
||||
options: {
|
||||
disabled: false,
|
||||
options: [
|
||||
{ label: 'Equals', value: ':' },
|
||||
{ label: 'Greater Than', value: '>' },
|
||||
{ label: 'Less Than', value: '<' },
|
||||
{ label: 'Greater Than Equals To', value: '>=' },
|
||||
{ label: 'Less Than Equals To', value: '<=' },
|
||||
],
|
||||
},
|
||||
}),
|
||||
fieldValue: Property.DateTime({
|
||||
displayName: 'Date Field Value',
|
||||
required: true,
|
||||
}),
|
||||
},
|
||||
}),
|
||||
ticket_id: Property.ShortText({
|
||||
displayName: 'Ticket ID',
|
||||
description: 'The ID of the ticket to find',
|
||||
required: false,
|
||||
}),
|
||||
status: Property.StaticDropdown({
|
||||
displayName: 'Status',
|
||||
description: 'Search tickets by status',
|
||||
required: false,
|
||||
options: {
|
||||
disabled: false,
|
||||
options: [
|
||||
{ label: 'New', value: 'new' },
|
||||
{ label: 'Open', value: 'open' },
|
||||
{ label: 'Pending', value: 'pending' },
|
||||
{ label: 'Hold', value: 'hold' },
|
||||
{ label: 'Solved', value: 'solved' },
|
||||
{ label: 'Closed', value: 'closed' },
|
||||
],
|
||||
},
|
||||
}),
|
||||
priority: Property.StaticDropdown({
|
||||
displayName: 'Priority',
|
||||
description: 'Search tickets by priority',
|
||||
required: false,
|
||||
options: {
|
||||
disabled: false,
|
||||
options: [
|
||||
{ label: 'Low', value: 'low' },
|
||||
{ label: 'Normal', value: 'normal' },
|
||||
{ label: 'High', value: 'high' },
|
||||
{ label: 'Urgent', value: 'urgent' },
|
||||
],
|
||||
},
|
||||
}),
|
||||
ticket_type: Property.StaticDropdown({
|
||||
displayName: 'Type',
|
||||
description: 'Search tickets by type',
|
||||
required: false,
|
||||
options: {
|
||||
disabled: false,
|
||||
options: [
|
||||
{ label: 'Problem', value: 'problem' },
|
||||
{ label: 'Incident', value: 'incident' },
|
||||
{ label: 'Question', value: 'question' },
|
||||
{ label: 'Task', value: 'task' },
|
||||
],
|
||||
},
|
||||
}),
|
||||
tag: Property.ShortText({
|
||||
displayName: 'Tag',
|
||||
description: 'Search tickets containing this tag',
|
||||
required: false,
|
||||
}),
|
||||
requester_email: Property.ShortText({
|
||||
displayName: 'Requester Email',
|
||||
description: 'Search tickets by requester email address',
|
||||
required: false,
|
||||
}),
|
||||
assignee_email: Property.ShortText({
|
||||
displayName: 'Assignee Email',
|
||||
description: 'Search tickets by assignee email address',
|
||||
required: false,
|
||||
}),
|
||||
content: Property.ShortText({
|
||||
displayName: 'Content',
|
||||
description: 'Search in ticket subject and content',
|
||||
required: false,
|
||||
}),
|
||||
custom_query: Property.LongText({
|
||||
displayName: 'Custom Query',
|
||||
description:
|
||||
'Custom search query using Zendesk search syntax (e.g., "type:ticket status:open priority:high")',
|
||||
required: false,
|
||||
}),
|
||||
sort_by: Property.StaticDropdown({
|
||||
displayName: 'Sort By',
|
||||
description: 'How to sort the results',
|
||||
required: false,
|
||||
options: {
|
||||
disabled: false,
|
||||
options: [
|
||||
{ label: 'Relevance (Default)', value: 'relevance' },
|
||||
{ label: 'Created Date', value: 'created_at' },
|
||||
{ label: 'Updated Date', value: 'updated_at' },
|
||||
{ label: 'Priority', value: 'priority' },
|
||||
{ label: 'Status', value: 'status' },
|
||||
{ label: 'Ticket Type', value: 'ticket_type' },
|
||||
],
|
||||
},
|
||||
}),
|
||||
sort_order: Property.StaticDropdown({
|
||||
displayName: 'Sort Order',
|
||||
description: 'Sort order for results',
|
||||
required: false,
|
||||
options: {
|
||||
disabled: false,
|
||||
options: [
|
||||
{ label: 'Descending (Default)', value: 'desc' },
|
||||
{ label: 'Ascending', value: 'asc' },
|
||||
],
|
||||
},
|
||||
}),
|
||||
},
|
||||
async run({ propsValue, auth }) {
|
||||
const authentication = auth;
|
||||
const {
|
||||
search_type,
|
||||
ticket_id,
|
||||
status,
|
||||
priority,
|
||||
ticket_type,
|
||||
tag,
|
||||
requester_email,
|
||||
assignee_email,
|
||||
content,
|
||||
custom_query,
|
||||
sort_by,
|
||||
sort_order,
|
||||
} = propsValue;
|
||||
const dateTimeFilterProp =
|
||||
(propsValue.timeFilter as Array<DateTimeFilterProp>) ?? [];
|
||||
|
||||
let query = 'type:ticket';
|
||||
|
||||
// https://support.zendesk.com/hc/en-us/articles/4408886879258-Zendesk-Support-search-reference
|
||||
switch (search_type) {
|
||||
case 'id':
|
||||
if (!ticket_id) {
|
||||
throw new Error('Ticket ID is required when searching by ID.');
|
||||
}
|
||||
query += ` ${ticket_id}`;
|
||||
break;
|
||||
case 'status':
|
||||
if (!status) {
|
||||
throw new Error('Status is required when searching by status.');
|
||||
}
|
||||
query += ` status:${status}`;
|
||||
break;
|
||||
case 'priority':
|
||||
if (!priority) {
|
||||
throw new Error('Priority is required when searching by priority.');
|
||||
}
|
||||
query += ` priority:${priority}`;
|
||||
break;
|
||||
case 'type':
|
||||
if (!ticket_type) {
|
||||
throw new Error('Type is required when searching by type.');
|
||||
}
|
||||
query += ` ticket_type:${ticket_type}`;
|
||||
break;
|
||||
case 'tag':
|
||||
if (!tag) {
|
||||
throw new Error('Tag is required when searching by tag.');
|
||||
}
|
||||
query += ` tags:${tag}`;
|
||||
break;
|
||||
case 'requester':
|
||||
if (!requester_email) {
|
||||
throw new Error(
|
||||
'Requester email is required when searching by requester.'
|
||||
);
|
||||
}
|
||||
query += ` requester:${requester_email}`;
|
||||
break;
|
||||
case 'assignee':
|
||||
if (!assignee_email) {
|
||||
throw new Error(
|
||||
'Assignee email is required when searching by assignee.'
|
||||
);
|
||||
}
|
||||
query += ` assignee:${assignee_email}`;
|
||||
break;
|
||||
case 'content':
|
||||
if (!content) {
|
||||
throw new Error('Content is required when searching by content.');
|
||||
}
|
||||
query += ` ${content}`;
|
||||
break;
|
||||
case 'custom':
|
||||
if (!custom_query) {
|
||||
throw new Error('Custom query is required when using custom search.');
|
||||
}
|
||||
query = custom_query;
|
||||
break;
|
||||
default:
|
||||
throw new Error('Invalid search type selected.');
|
||||
}
|
||||
|
||||
if(!isEmpty(dateTimeFilterProp))
|
||||
{
|
||||
query+= ` ${dateTimeFilterProp.map(c => `${c.field}${c.operator}${dayjs(c.fieldValue).format("YYYY-MM-DD")}`).join(" ")}`
|
||||
}
|
||||
|
||||
const searchParams = new URLSearchParams();
|
||||
searchParams.append('query', query);
|
||||
|
||||
if (sort_by && sort_by !== 'relevance') {
|
||||
searchParams.append('sort_by', sort_by);
|
||||
}
|
||||
|
||||
if (sort_order) {
|
||||
searchParams.append('sort_order', sort_order);
|
||||
}
|
||||
|
||||
try {
|
||||
const response = await httpClient.sendRequest({
|
||||
url: `https://${
|
||||
authentication.props.subdomain
|
||||
}.zendesk.com/api/v2/search.json?${searchParams.toString()}`,
|
||||
method: HttpMethod.GET,
|
||||
authentication: {
|
||||
type: AuthenticationType.BASIC,
|
||||
username: authentication.props.email + '/token',
|
||||
password: authentication.props.token,
|
||||
},
|
||||
});
|
||||
|
||||
const responseBody = response.body as {
|
||||
results: Array<Record<string, unknown>>;
|
||||
count: number;
|
||||
next_page?: string;
|
||||
previous_page?: string;
|
||||
facets?: unknown;
|
||||
};
|
||||
|
||||
const tickets = responseBody.results.filter(
|
||||
(result) => result.result_type === 'ticket'
|
||||
);
|
||||
|
||||
return {
|
||||
success: true,
|
||||
message: `Found ${tickets.length} ticket(s) matching the search criteria`,
|
||||
data: response.body,
|
||||
tickets,
|
||||
search_criteria: {
|
||||
type: search_type,
|
||||
query: query,
|
||||
sort_by: sort_by || 'relevance',
|
||||
sort_order: sort_order || 'desc',
|
||||
},
|
||||
total_count: responseBody.count,
|
||||
found_count: tickets.length,
|
||||
has_more: !!responseBody.next_page,
|
||||
};
|
||||
} catch (error) {
|
||||
const errorMessage = (error as Error).message;
|
||||
if (errorMessage.includes('400')) {
|
||||
throw new Error(
|
||||
'Invalid search query. Please check your search parameters and try again.'
|
||||
);
|
||||
}
|
||||
|
||||
if (errorMessage.includes('401') || errorMessage.includes('403')) {
|
||||
throw new Error(
|
||||
'Authentication failed or insufficient permissions. Please check your API credentials and permissions to search tickets.'
|
||||
);
|
||||
}
|
||||
|
||||
if (errorMessage.includes('422')) {
|
||||
throw new Error(
|
||||
'Search query validation error. Please check your search syntax and parameters.'
|
||||
);
|
||||
}
|
||||
|
||||
if (errorMessage.includes('429')) {
|
||||
throw new Error(
|
||||
'Rate limit exceeded. Please wait a moment before trying again.'
|
||||
);
|
||||
}
|
||||
|
||||
throw new Error(`Failed to search tickets: ${errorMessage}`);
|
||||
}
|
||||
},
|
||||
});
|
||||
|
||||
type DateTimeFilterProp = {
|
||||
field: string;
|
||||
operator: string;
|
||||
fieldValue: string;
|
||||
};
|
||||
@@ -0,0 +1,274 @@
|
||||
import { createAction, Property } from '@activepieces/pieces-framework';
|
||||
import {
|
||||
AuthenticationType,
|
||||
HttpMethod,
|
||||
httpClient,
|
||||
} from '@activepieces/pieces-common';
|
||||
import { zendeskAuth } from '../..';
|
||||
|
||||
type AuthProps = {
|
||||
email: string;
|
||||
token: string;
|
||||
subdomain: string;
|
||||
};
|
||||
|
||||
export const findUserAction = createAction({
|
||||
auth: zendeskAuth,
|
||||
name: 'find-user',
|
||||
displayName: 'Find User(s)',
|
||||
description: 'Search users by email, name, role, or other criteria.',
|
||||
props: {
|
||||
search_type: Property.StaticDropdown({
|
||||
displayName: 'Search Type',
|
||||
description: 'Choose how to search for users',
|
||||
required: true,
|
||||
options: {
|
||||
disabled: false,
|
||||
options: [
|
||||
{ label: 'Search by Email', value: 'email' },
|
||||
{ label: 'Search by Name', value: 'name' },
|
||||
{ label: 'Search by Role', value: 'role' },
|
||||
{ label: 'Search by Organization', value: 'organization' },
|
||||
{ label: 'Search by Tag', value: 'tag' },
|
||||
{ label: 'Search by External ID', value: 'external_id' },
|
||||
{ label: 'Custom Query', value: 'custom' },
|
||||
],
|
||||
},
|
||||
}),
|
||||
email: Property.ShortText({
|
||||
displayName: 'Email Address',
|
||||
description: 'The email address of the user to search for',
|
||||
required: false,
|
||||
}),
|
||||
name: Property.ShortText({
|
||||
displayName: 'Name',
|
||||
description: 'The name of the user to search for',
|
||||
required: false,
|
||||
}),
|
||||
role: Property.StaticDropdown({
|
||||
displayName: 'Role',
|
||||
description: 'Search users by role',
|
||||
required: false,
|
||||
options: {
|
||||
disabled: false,
|
||||
options: [
|
||||
{ label: 'End User', value: 'end-user' },
|
||||
{ label: 'Agent', value: 'agent' },
|
||||
{ label: 'Admin', value: 'admin' },
|
||||
],
|
||||
},
|
||||
}),
|
||||
organization: Property.ShortText({
|
||||
displayName: 'Organization',
|
||||
description: 'Search users by organization name',
|
||||
required: false,
|
||||
}),
|
||||
tag: Property.ShortText({
|
||||
displayName: 'Tag',
|
||||
description: 'Search users containing this tag',
|
||||
required: false,
|
||||
}),
|
||||
external_id: Property.ShortText({
|
||||
displayName: 'External ID',
|
||||
description: 'Search users by external ID',
|
||||
required: false,
|
||||
}),
|
||||
custom_query: Property.LongText({
|
||||
displayName: 'Custom Query',
|
||||
description:
|
||||
'Custom search query using Zendesk search syntax (e.g., "type:user role:agent")',
|
||||
required: false,
|
||||
}),
|
||||
sort_by: Property.StaticDropdown({
|
||||
displayName: 'Sort By',
|
||||
description: 'How to sort the results',
|
||||
required: false,
|
||||
options: {
|
||||
disabled: false,
|
||||
options: [
|
||||
{ label: 'Relevance (Default)', value: 'relevance' },
|
||||
{ label: 'Created Date', value: 'created_at' },
|
||||
{ label: 'Updated Date', value: 'updated_at' },
|
||||
],
|
||||
},
|
||||
}),
|
||||
sort_order: Property.StaticDropdown({
|
||||
displayName: 'Sort Order',
|
||||
description: 'Sort order for results',
|
||||
required: false,
|
||||
options: {
|
||||
disabled: false,
|
||||
options: [
|
||||
{ label: 'Descending (Default)', value: 'desc' },
|
||||
{ label: 'Ascending', value: 'asc' },
|
||||
],
|
||||
},
|
||||
}),
|
||||
},
|
||||
async run({ propsValue, auth }) {
|
||||
const authentication = auth;
|
||||
const {
|
||||
search_type,
|
||||
email,
|
||||
name,
|
||||
role,
|
||||
organization,
|
||||
tag,
|
||||
external_id,
|
||||
custom_query,
|
||||
sort_by,
|
||||
sort_order,
|
||||
} = propsValue;
|
||||
|
||||
let query = 'type:user';
|
||||
|
||||
switch (search_type) {
|
||||
case 'email':
|
||||
if (!email) {
|
||||
throw new Error('Email address is required when searching by email.');
|
||||
}
|
||||
query += ` email:${email}`;
|
||||
break;
|
||||
case 'name':
|
||||
if (!name) {
|
||||
throw new Error('Name is required when searching by name.');
|
||||
}
|
||||
query += ` name:"${name}"`;
|
||||
break;
|
||||
case 'role':
|
||||
if (!role) {
|
||||
throw new Error('Role is required when searching by role.');
|
||||
}
|
||||
query += ` role:${role}`;
|
||||
break;
|
||||
case 'organization':
|
||||
if (!organization) {
|
||||
throw new Error(
|
||||
'Organization is required when searching by organization.'
|
||||
);
|
||||
}
|
||||
query += ` organization:"${organization}"`;
|
||||
break;
|
||||
case 'tag':
|
||||
if (!tag) {
|
||||
throw new Error('Tag is required when searching by tag.');
|
||||
}
|
||||
query += ` tags:${tag}`;
|
||||
break;
|
||||
case 'external_id':
|
||||
if (!external_id) {
|
||||
throw new Error(
|
||||
'External ID is required when searching by external ID.'
|
||||
);
|
||||
}
|
||||
query += ` external_id:${external_id}`;
|
||||
break;
|
||||
case 'custom':
|
||||
if (!custom_query) {
|
||||
throw new Error('Custom query is required when using custom search.');
|
||||
}
|
||||
query = custom_query;
|
||||
break;
|
||||
default:
|
||||
throw new Error('Invalid search type selected.');
|
||||
}
|
||||
|
||||
const searchParams = new URLSearchParams();
|
||||
searchParams.append('query', query);
|
||||
|
||||
if (sort_by && sort_by !== 'relevance') {
|
||||
searchParams.append('sort_by', sort_by);
|
||||
}
|
||||
|
||||
if (sort_order) {
|
||||
searchParams.append('sort_order', sort_order);
|
||||
}
|
||||
|
||||
try {
|
||||
const response = await httpClient.sendRequest({
|
||||
url: `https://${
|
||||
authentication.props.subdomain
|
||||
}.zendesk.com/api/v2/search.json?${searchParams.toString()}`,
|
||||
method: HttpMethod.GET,
|
||||
authentication: {
|
||||
type: AuthenticationType.BASIC,
|
||||
username: authentication.props.email + '/token',
|
||||
password: authentication.props.token,
|
||||
},
|
||||
});
|
||||
|
||||
const responseBody = response.body as {
|
||||
results: Array<Record<string, unknown>>;
|
||||
count: number;
|
||||
next_page?: string;
|
||||
previous_page?: string;
|
||||
facets?: unknown;
|
||||
};
|
||||
|
||||
const users = responseBody.results.filter(
|
||||
(result) => result.result_type === 'user'
|
||||
);
|
||||
|
||||
return {
|
||||
success: true,
|
||||
message: `Found ${users.length} user(s) matching the search criteria`,
|
||||
data: response.body,
|
||||
users,
|
||||
search_criteria: {
|
||||
type: search_type,
|
||||
query: query,
|
||||
sort_by: sort_by || 'relevance',
|
||||
sort_order: sort_order || 'desc',
|
||||
},
|
||||
total_count: responseBody.count,
|
||||
found_count: users.length,
|
||||
has_more: !!responseBody.next_page,
|
||||
};
|
||||
} catch (error) {
|
||||
const errorMessage = (error as Error).message;
|
||||
if (errorMessage.includes('400')) {
|
||||
throw new Error(
|
||||
'Invalid search query. Please check your search parameters and try again.'
|
||||
);
|
||||
}
|
||||
|
||||
if (errorMessage.includes('401') || errorMessage.includes('403')) {
|
||||
throw new Error(
|
||||
'Authentication failed or insufficient permissions. Please check your API credentials and permissions to search users.'
|
||||
);
|
||||
}
|
||||
|
||||
if (errorMessage.includes('404')) {
|
||||
return {
|
||||
success: true,
|
||||
message: 'No users found matching the search criteria',
|
||||
data: { results: [], count: 0 },
|
||||
users: [],
|
||||
search_criteria: {
|
||||
type: search_type,
|
||||
query: query,
|
||||
sort_by: sort_by || 'relevance',
|
||||
sort_order: sort_order || 'desc',
|
||||
},
|
||||
total_count: 0,
|
||||
found_count: 0,
|
||||
has_more: false,
|
||||
};
|
||||
}
|
||||
|
||||
if (errorMessage.includes('422')) {
|
||||
throw new Error(
|
||||
'Search query validation error. Please check your search syntax and parameters.'
|
||||
);
|
||||
}
|
||||
|
||||
if (errorMessage.includes('429')) {
|
||||
throw new Error(
|
||||
'Rate limit exceeded. Please wait a moment before trying again.'
|
||||
);
|
||||
}
|
||||
|
||||
throw new Error(`Failed to search users: ${errorMessage}`);
|
||||
}
|
||||
},
|
||||
});
|
||||
@@ -0,0 +1,347 @@
|
||||
import {
|
||||
createAction,
|
||||
Property,
|
||||
} from '@activepieces/pieces-framework';
|
||||
import {
|
||||
AuthenticationType,
|
||||
HttpMethod,
|
||||
httpClient,
|
||||
} from '@activepieces/pieces-common';
|
||||
import { zendeskAuth } from '../..';
|
||||
import { organizationIdDropdown, groupIdDropdown } from '../common/props';
|
||||
|
||||
type AuthProps = {
|
||||
email: string;
|
||||
token: string;
|
||||
subdomain: string;
|
||||
};
|
||||
|
||||
export const updateOrganizationAction = createAction({
|
||||
auth: zendeskAuth,
|
||||
name: 'update-organization',
|
||||
displayName: 'Update Organization',
|
||||
description: 'Update existing organization fields.',
|
||||
props: {
|
||||
organization_id: organizationIdDropdown,
|
||||
name: Property.ShortText({
|
||||
displayName: 'Organization Name',
|
||||
description: 'New name for the organization (must be unique)',
|
||||
required: false,
|
||||
}),
|
||||
details: Property.LongText({
|
||||
displayName: 'Details',
|
||||
description: 'Additional details about the organization',
|
||||
required: false,
|
||||
}),
|
||||
notes: Property.LongText({
|
||||
displayName: 'Notes',
|
||||
description: 'Internal notes about the organization',
|
||||
required: false,
|
||||
}),
|
||||
external_id: Property.ShortText({
|
||||
displayName: 'External ID',
|
||||
description: 'External ID for integration purposes',
|
||||
required: false,
|
||||
}),
|
||||
group_id: groupIdDropdown,
|
||||
domain_names: Property.Array({
|
||||
displayName: 'Domain Names',
|
||||
description: 'Domain names for the organization (replaces all existing)',
|
||||
required: false,
|
||||
}),
|
||||
tags: Property.Array({
|
||||
displayName: 'Tags',
|
||||
description: 'Tags for the organization (replaces all existing)',
|
||||
required: false,
|
||||
}),
|
||||
organization_fields: Property.DynamicProperties({
|
||||
auth: zendeskAuth,
|
||||
displayName: 'Organization Fields',
|
||||
description: 'Custom organization field values',
|
||||
required: false,
|
||||
refreshers: ['auth'],
|
||||
props: async ({ auth }) => {
|
||||
if (!auth) {
|
||||
return {};
|
||||
}
|
||||
|
||||
try {
|
||||
const authentication = auth;
|
||||
const response = await httpClient.sendRequest({
|
||||
url: `https://${authentication.props.subdomain}.zendesk.com/api/v2/organization_fields.json`,
|
||||
method: HttpMethod.GET,
|
||||
authentication: {
|
||||
type: AuthenticationType.BASIC,
|
||||
username: authentication.props.email + '/token',
|
||||
password: authentication.props.token,
|
||||
},
|
||||
});
|
||||
|
||||
const fields = (response.body as { organization_fields: Array<{
|
||||
id: number;
|
||||
key: string;
|
||||
title: string;
|
||||
description?: string;
|
||||
type: string;
|
||||
active: boolean;
|
||||
custom_field_options?: Array<{ name: string; value: string }>;
|
||||
regexp_for_validation?: string;
|
||||
}> }).organization_fields;
|
||||
|
||||
const dynamicProps: Record<string, any> = {};
|
||||
|
||||
for (const field of fields) {
|
||||
if (!field.active) continue;
|
||||
|
||||
const fieldKey = `field_${field.key}`;
|
||||
const displayName = field.title;
|
||||
const description = field.description || `Custom ${field.type} field`;
|
||||
|
||||
switch (field.type) {
|
||||
case 'dropdown':
|
||||
if (field.custom_field_options && field.custom_field_options.length > 0) {
|
||||
dynamicProps[fieldKey] = Property.StaticDropdown({
|
||||
displayName,
|
||||
description,
|
||||
required: false,
|
||||
options: {
|
||||
disabled: false,
|
||||
placeholder: `Select ${displayName}`,
|
||||
options: field.custom_field_options.map(option => ({
|
||||
label: option.name,
|
||||
value: option.value,
|
||||
})),
|
||||
},
|
||||
});
|
||||
}
|
||||
break;
|
||||
case 'multiselect':
|
||||
if (field.custom_field_options && field.custom_field_options.length > 0) {
|
||||
dynamicProps[fieldKey] = Property.StaticMultiSelectDropdown({
|
||||
displayName,
|
||||
description,
|
||||
required: false,
|
||||
options: {
|
||||
options: field.custom_field_options.map(option => ({
|
||||
label: option.name,
|
||||
value: option.value,
|
||||
})),
|
||||
},
|
||||
});
|
||||
}
|
||||
break;
|
||||
case 'text':
|
||||
dynamicProps[fieldKey] = Property.ShortText({
|
||||
displayName,
|
||||
description,
|
||||
required: false,
|
||||
});
|
||||
break;
|
||||
case 'textarea':
|
||||
dynamicProps[fieldKey] = Property.LongText({
|
||||
displayName,
|
||||
description,
|
||||
required: false,
|
||||
});
|
||||
break;
|
||||
case 'integer':
|
||||
case 'decimal':
|
||||
dynamicProps[fieldKey] = Property.Number({
|
||||
displayName,
|
||||
description,
|
||||
required: false,
|
||||
});
|
||||
break;
|
||||
case 'date':
|
||||
dynamicProps[fieldKey] = Property.DateTime({
|
||||
displayName,
|
||||
description,
|
||||
required: false,
|
||||
});
|
||||
break;
|
||||
case 'checkbox':
|
||||
dynamicProps[fieldKey] = Property.Checkbox({
|
||||
displayName,
|
||||
description,
|
||||
required: false,
|
||||
});
|
||||
break;
|
||||
case 'regexp':
|
||||
dynamicProps[fieldKey] = Property.ShortText({
|
||||
displayName,
|
||||
description: `${description}${field.regexp_for_validation ? ` (Pattern: ${field.regexp_for_validation})` : ''}`,
|
||||
required: false,
|
||||
});
|
||||
break;
|
||||
default:
|
||||
dynamicProps[fieldKey] = Property.ShortText({
|
||||
displayName,
|
||||
description: `${description} (${field.type})`,
|
||||
required: false,
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
return dynamicProps;
|
||||
} catch (error) {
|
||||
console.warn('Failed to load organization fields:', error);
|
||||
return {};
|
||||
}
|
||||
},
|
||||
}),
|
||||
shared_tickets: Property.Checkbox({
|
||||
displayName: 'Shared Tickets',
|
||||
description: 'Allow users to see each other\'s tickets',
|
||||
required: false,
|
||||
}),
|
||||
shared_comments: Property.Checkbox({
|
||||
displayName: 'Shared Comments',
|
||||
description: 'Allow users to see each other\'s comments',
|
||||
required: false,
|
||||
}),
|
||||
},
|
||||
async run({ propsValue, auth }) {
|
||||
const authentication = auth;
|
||||
const {
|
||||
organization_id,
|
||||
name,
|
||||
details,
|
||||
notes,
|
||||
external_id,
|
||||
group_id,
|
||||
domain_names,
|
||||
tags,
|
||||
organization_fields,
|
||||
shared_tickets,
|
||||
shared_comments,
|
||||
} = propsValue;
|
||||
|
||||
const organization: Record<string, unknown> = {};
|
||||
|
||||
if (name !== undefined && name !== null && name !== '') {
|
||||
organization.name = name.trim();
|
||||
}
|
||||
|
||||
const optionalParams = {
|
||||
details,
|
||||
notes,
|
||||
external_id,
|
||||
group_id,
|
||||
domain_names,
|
||||
tags,
|
||||
shared_tickets,
|
||||
shared_comments,
|
||||
};
|
||||
|
||||
for (const [key, value] of Object.entries(optionalParams)) {
|
||||
if (value !== null && value !== undefined && value !== '') {
|
||||
organization[key] = value;
|
||||
}
|
||||
}
|
||||
|
||||
if (organization_fields && typeof organization_fields === 'object') {
|
||||
try {
|
||||
const fieldsResponse = await httpClient.sendRequest({
|
||||
url: `https://${authentication.props.subdomain}.zendesk.com/api/v2/organization_fields.json`,
|
||||
method: HttpMethod.GET,
|
||||
authentication: {
|
||||
type: AuthenticationType.BASIC,
|
||||
username: authentication.props.email + '/token',
|
||||
password: authentication.props.token,
|
||||
},
|
||||
});
|
||||
|
||||
const fieldDefinitions = (fieldsResponse.body as { organization_fields: Array<{
|
||||
id: number;
|
||||
key: string;
|
||||
type: string;
|
||||
}> }).organization_fields;
|
||||
|
||||
const orgFieldsObj: Record<string, any> = {};
|
||||
|
||||
for (const [propKey, value] of Object.entries(organization_fields)) {
|
||||
if (value !== null && value !== undefined && value !== '') {
|
||||
const fieldKey = propKey.startsWith('field_') ? propKey.substring(6) : propKey;
|
||||
|
||||
const fieldDef = fieldDefinitions.find(f => f.key === fieldKey);
|
||||
if (fieldDef) {
|
||||
let formattedValue = value;
|
||||
if (fieldDef.type === 'date' && value) {
|
||||
formattedValue = new Date(value as string).toISOString().split('T')[0];
|
||||
}
|
||||
|
||||
orgFieldsObj[fieldDef.key] = formattedValue;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (Object.keys(orgFieldsObj).length > 0) {
|
||||
organization.organization_fields = orgFieldsObj;
|
||||
}
|
||||
} catch (error) {
|
||||
console.warn('Failed to process organization fields:', error);
|
||||
}
|
||||
}
|
||||
|
||||
if (Object.keys(organization).length === 0) {
|
||||
throw new Error('No fields provided to update. Please specify at least one field to modify.');
|
||||
}
|
||||
|
||||
try {
|
||||
const response = await httpClient.sendRequest({
|
||||
url: `https://${authentication.props.subdomain}.zendesk.com/api/v2/organizations/${organization_id}.json`,
|
||||
method: HttpMethod.PUT,
|
||||
headers: {
|
||||
'Content-Type': 'application/json',
|
||||
},
|
||||
authentication: {
|
||||
type: AuthenticationType.BASIC,
|
||||
username: authentication.props.email + '/token',
|
||||
password: authentication.props.token,
|
||||
},
|
||||
body: {
|
||||
organization,
|
||||
},
|
||||
});
|
||||
|
||||
return {
|
||||
success: true,
|
||||
message: 'Organization updated successfully',
|
||||
data: response.body,
|
||||
};
|
||||
} catch (error) {
|
||||
const errorMessage = (error as Error).message;
|
||||
if (errorMessage.includes('400')) {
|
||||
throw new Error(
|
||||
'Invalid request parameters. Please check your input values and try again.'
|
||||
);
|
||||
}
|
||||
|
||||
if (errorMessage.includes('401') || errorMessage.includes('403')) {
|
||||
throw new Error(
|
||||
'Authentication failed or insufficient permissions. Please check your API credentials and permissions to manage organizations.'
|
||||
);
|
||||
}
|
||||
|
||||
if (errorMessage.includes('404')) {
|
||||
throw new Error(
|
||||
`Organization with ID ${organization_id} not found. Please verify the organization ID.`
|
||||
);
|
||||
}
|
||||
|
||||
if (errorMessage.includes('422')) {
|
||||
throw new Error(
|
||||
'Validation error. The organization name may already exist or be invalid. Organization names must be unique and cannot be empty.'
|
||||
);
|
||||
}
|
||||
|
||||
if (errorMessage.includes('429')) {
|
||||
throw new Error(
|
||||
'Rate limit exceeded. Please wait a moment before trying again.'
|
||||
);
|
||||
}
|
||||
|
||||
throw new Error(`Failed to update organization: ${errorMessage}`);
|
||||
}
|
||||
},
|
||||
});
|
||||
@@ -0,0 +1,566 @@
|
||||
import { createAction, Property } from '@activepieces/pieces-framework';
|
||||
import {
|
||||
AuthenticationType,
|
||||
HttpMethod,
|
||||
httpClient,
|
||||
} from '@activepieces/pieces-common';
|
||||
import { zendeskAuth } from '../..';
|
||||
import {
|
||||
organizationIdDropdown,
|
||||
ticketIdDropdown,
|
||||
groupIdDropdown,
|
||||
brandIdDropdown,
|
||||
problemTicketIdDropdown,
|
||||
} from '../common/props';
|
||||
|
||||
type AuthProps = {
|
||||
email: string;
|
||||
token: string;
|
||||
subdomain: string;
|
||||
};
|
||||
|
||||
export const updateTicketAction = createAction({
|
||||
auth: zendeskAuth,
|
||||
name: 'update-ticket',
|
||||
displayName: 'Update Ticket',
|
||||
description: 'Modify ticket fields or status via API call.',
|
||||
props: {
|
||||
ticket_id: ticketIdDropdown,
|
||||
subject: Property.ShortText({
|
||||
displayName: 'Subject',
|
||||
description: 'Update the subject of the ticket',
|
||||
required: false,
|
||||
}),
|
||||
comment_body: Property.LongText({
|
||||
displayName: 'Comment Body',
|
||||
description: 'Add a comment to the ticket (plain text)',
|
||||
required: false,
|
||||
}),
|
||||
comment_html_body: Property.LongText({
|
||||
displayName: 'Comment HTML Body',
|
||||
description:
|
||||
'Add a comment to the ticket (HTML). If provided, this takes precedence over Comment Body.',
|
||||
required: false,
|
||||
}),
|
||||
comment_public: Property.Checkbox({
|
||||
displayName: 'Public Comment',
|
||||
description:
|
||||
'Whether the comment is public (visible to the requester). Defaults to true.',
|
||||
required: false,
|
||||
}),
|
||||
assignee_email: Property.ShortText({
|
||||
displayName: 'Assignee Email',
|
||||
description: 'Email address of the agent to assign the ticket to',
|
||||
required: false,
|
||||
}),
|
||||
priority: Property.StaticDropdown({
|
||||
displayName: 'Priority',
|
||||
description: 'Update the priority of the ticket',
|
||||
required: false,
|
||||
options: {
|
||||
disabled: false,
|
||||
placeholder: 'Select priority (optional)',
|
||||
options: [
|
||||
{ label: 'Low', value: 'low' },
|
||||
{ label: 'Normal', value: 'normal' },
|
||||
{ label: 'High', value: 'high' },
|
||||
{ label: 'Urgent', value: 'urgent' },
|
||||
],
|
||||
},
|
||||
}),
|
||||
type: Property.StaticDropdown({
|
||||
displayName: 'Type',
|
||||
description: 'Update the type of ticket',
|
||||
required: false,
|
||||
options: {
|
||||
disabled: false,
|
||||
placeholder: 'Select type (optional)',
|
||||
options: [
|
||||
{ label: 'Problem', value: 'problem' },
|
||||
{ label: 'Incident', value: 'incident' },
|
||||
{ label: 'Question', value: 'question' },
|
||||
{ label: 'Task', value: 'task' },
|
||||
],
|
||||
},
|
||||
}),
|
||||
status: Property.StaticDropdown({
|
||||
displayName: 'Status',
|
||||
description: 'Update the status of the ticket',
|
||||
required: false,
|
||||
options: {
|
||||
disabled: false,
|
||||
placeholder: 'Select status (optional)',
|
||||
options: [
|
||||
{ label: 'New', value: 'new' },
|
||||
{ label: 'Open', value: 'open' },
|
||||
{ label: 'Pending', value: 'pending' },
|
||||
{ label: 'Hold', value: 'hold' },
|
||||
{ label: 'Solved', value: 'solved' },
|
||||
{ label: 'Closed', value: 'closed' },
|
||||
],
|
||||
},
|
||||
}),
|
||||
tags: Property.Array({
|
||||
displayName: 'Tags',
|
||||
description:
|
||||
'Replace all tags with this array. Use "Add Tag to Ticket" action to add tags without replacing existing ones.',
|
||||
required: false,
|
||||
}),
|
||||
organization_id: organizationIdDropdown,
|
||||
group_id: groupIdDropdown,
|
||||
external_id: Property.ShortText({
|
||||
displayName: 'External ID',
|
||||
description: 'Update the external ID for the ticket',
|
||||
required: false,
|
||||
}),
|
||||
due_at: Property.DateTime({
|
||||
displayName: 'Due Date',
|
||||
description: 'Update the date and time when the ticket is due',
|
||||
required: false,
|
||||
}),
|
||||
custom_fields: Property.DynamicProperties({
|
||||
auth: zendeskAuth,
|
||||
displayName: 'Custom Fields',
|
||||
description: 'Update custom ticket field values',
|
||||
required: false,
|
||||
refreshers: ['auth'],
|
||||
props: async ({ auth }) => {
|
||||
if (!auth) {
|
||||
return {};
|
||||
}
|
||||
|
||||
try {
|
||||
const authentication = auth;
|
||||
const response = await httpClient.sendRequest({
|
||||
url: `https://${authentication.props.subdomain}.zendesk.com/api/v2/ticket_fields.json`,
|
||||
method: HttpMethod.GET,
|
||||
authentication: {
|
||||
type: AuthenticationType.BASIC,
|
||||
username: authentication.props.email + '/token',
|
||||
password: authentication.props.token,
|
||||
},
|
||||
});
|
||||
|
||||
const fields = (response.body as { ticket_fields: Array<{
|
||||
id: number;
|
||||
key: string;
|
||||
title: string;
|
||||
description?: string;
|
||||
type: string;
|
||||
active: boolean;
|
||||
removable?: boolean;
|
||||
custom_field_options?: Array<{ name: string; value: string }>;
|
||||
regexp_for_validation?: string;
|
||||
}> }).ticket_fields;
|
||||
|
||||
const skipSystemTypes = new Set([
|
||||
'subject',
|
||||
'description',
|
||||
'priority',
|
||||
'status',
|
||||
'tickettype',
|
||||
'group',
|
||||
'assignee',
|
||||
]);
|
||||
|
||||
const dynamicProps: Record<string, any> = {};
|
||||
|
||||
for (const field of fields) {
|
||||
if (!field.active) continue;
|
||||
if (skipSystemTypes.has(field.type)) continue;
|
||||
|
||||
const fieldKey = `field_${field.key ?? `custom_field_${field.id}`}`;
|
||||
const displayName = field.title;
|
||||
const description = field.description || `Custom ${field.type} field`;
|
||||
|
||||
switch (field.type) {
|
||||
case 'tagger':
|
||||
if (field.custom_field_options && field.custom_field_options.length > 0) {
|
||||
dynamicProps[fieldKey] = Property.StaticDropdown({
|
||||
displayName,
|
||||
description,
|
||||
required: false,
|
||||
options: {
|
||||
disabled: false,
|
||||
placeholder: `Select ${displayName}`,
|
||||
options: field.custom_field_options.map(option => ({
|
||||
label: option.name,
|
||||
value: option.value,
|
||||
})),
|
||||
},
|
||||
});
|
||||
}
|
||||
break;
|
||||
case 'multiselect':
|
||||
if (field.custom_field_options && field.custom_field_options.length > 0) {
|
||||
dynamicProps[fieldKey] = Property.StaticMultiSelectDropdown({
|
||||
displayName,
|
||||
description,
|
||||
required: false,
|
||||
options: {
|
||||
options: field.custom_field_options.map(option => ({
|
||||
label: option.name,
|
||||
value: option.value,
|
||||
})),
|
||||
},
|
||||
});
|
||||
}
|
||||
break;
|
||||
case 'text':
|
||||
dynamicProps[fieldKey] = Property.ShortText({
|
||||
displayName,
|
||||
description,
|
||||
required: false,
|
||||
});
|
||||
break;
|
||||
case 'textarea':
|
||||
dynamicProps[fieldKey] = Property.LongText({
|
||||
displayName,
|
||||
description,
|
||||
required: false,
|
||||
});
|
||||
break;
|
||||
case 'integer':
|
||||
case 'decimal':
|
||||
dynamicProps[fieldKey] = Property.Number({
|
||||
displayName,
|
||||
description,
|
||||
required: false,
|
||||
});
|
||||
break;
|
||||
case 'date':
|
||||
dynamicProps[fieldKey] = Property.DateTime({
|
||||
displayName,
|
||||
description,
|
||||
required: false,
|
||||
});
|
||||
break;
|
||||
case 'checkbox':
|
||||
dynamicProps[fieldKey] = Property.Checkbox({
|
||||
displayName,
|
||||
description,
|
||||
required: false,
|
||||
});
|
||||
break;
|
||||
case 'regexp':
|
||||
dynamicProps[fieldKey] = Property.ShortText({
|
||||
displayName,
|
||||
description: `${description}${field.regexp_for_validation ? ` (Pattern: ${field.regexp_for_validation})` : ''}`,
|
||||
required: false,
|
||||
});
|
||||
break;
|
||||
default:
|
||||
dynamicProps[fieldKey] = Property.ShortText({
|
||||
displayName,
|
||||
description: `${description} (${field.type})`,
|
||||
required: false,
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
return dynamicProps;
|
||||
} catch (error) {
|
||||
console.warn('Failed to load ticket fields:', error);
|
||||
return {};
|
||||
}
|
||||
},
|
||||
}),
|
||||
custom_status_id: Property.Number({
|
||||
displayName: 'Custom Status ID',
|
||||
description: 'Set a custom status ID for the ticket',
|
||||
required: false,
|
||||
}),
|
||||
forum_topic_id: Property.Number({
|
||||
displayName: 'Forum Topic ID',
|
||||
description: 'Update the forum topic associated with the ticket',
|
||||
required: false,
|
||||
}),
|
||||
collaborator_emails: Property.Array({
|
||||
displayName: 'Collaborator Emails',
|
||||
description: 'Replace collaborators with this array of email addresses',
|
||||
required: false,
|
||||
}),
|
||||
follower_emails: Property.Array({
|
||||
displayName: 'Follower Emails',
|
||||
description: 'Replace followers with this array of email addresses',
|
||||
required: false,
|
||||
}),
|
||||
requester_email: Property.ShortText({
|
||||
displayName: 'Requester Email',
|
||||
description: 'Update the requester of the ticket',
|
||||
required: false,
|
||||
}),
|
||||
safe_update: Property.Checkbox({
|
||||
displayName: 'Safe Update',
|
||||
description: 'Prevent update collisions by checking timestamp',
|
||||
required: false,
|
||||
}),
|
||||
updated_stamp: Property.ShortText({
|
||||
displayName: 'Updated Timestamp',
|
||||
description: 'Ticket timestamp from updated_at field for collision prevention',
|
||||
required: false,
|
||||
}),
|
||||
brand_id: brandIdDropdown,
|
||||
problem_id: problemTicketIdDropdown,
|
||||
},
|
||||
async run({ propsValue, auth }) {
|
||||
const authentication = auth;
|
||||
const {
|
||||
ticket_id,
|
||||
subject,
|
||||
comment_body,
|
||||
comment_html_body,
|
||||
comment_public,
|
||||
assignee_email,
|
||||
priority,
|
||||
type,
|
||||
status,
|
||||
tags,
|
||||
organization_id,
|
||||
group_id,
|
||||
external_id,
|
||||
due_at,
|
||||
custom_fields,
|
||||
custom_status_id,
|
||||
forum_topic_id,
|
||||
collaborator_emails,
|
||||
follower_emails,
|
||||
requester_email,
|
||||
safe_update,
|
||||
updated_stamp,
|
||||
brand_id,
|
||||
problem_id,
|
||||
} = propsValue;
|
||||
|
||||
const resolveUserByEmail = async (email: string) => {
|
||||
try {
|
||||
const response = await httpClient.sendRequest({
|
||||
url: `https://${
|
||||
authentication.props.subdomain
|
||||
}.zendesk.com/api/v2/users/search.json?query=email:${encodeURIComponent(
|
||||
email
|
||||
)}`,
|
||||
method: HttpMethod.GET,
|
||||
authentication: {
|
||||
type: AuthenticationType.BASIC,
|
||||
username: authentication.props.email + '/token',
|
||||
password: authentication.props.token,
|
||||
},
|
||||
});
|
||||
|
||||
const users = (response.body as { users: Array<{ id: number }> }).users;
|
||||
return users.length > 0 ? users[0].id : null;
|
||||
} catch (error) {
|
||||
console.warn(
|
||||
`Warning: Could not resolve user with email ${email}:`,
|
||||
(error as Error).message
|
||||
);
|
||||
return null;
|
||||
}
|
||||
};
|
||||
|
||||
const ticket: Record<string, unknown> = {};
|
||||
|
||||
if (comment_body || comment_html_body) {
|
||||
const comment: Record<string, unknown> = {};
|
||||
if (comment_html_body) {
|
||||
comment.html_body = comment_html_body;
|
||||
} else if (comment_body) {
|
||||
comment.body = comment_body;
|
||||
}
|
||||
|
||||
if (comment_public !== undefined) {
|
||||
comment.public = comment_public;
|
||||
}
|
||||
|
||||
ticket.comment = comment;
|
||||
}
|
||||
|
||||
if (assignee_email) {
|
||||
const assigneeId = await resolveUserByEmail(assignee_email);
|
||||
if (assigneeId) {
|
||||
ticket.assignee_id = assigneeId;
|
||||
} else {
|
||||
throw new Error(`Could not find agent with email: ${assignee_email}`);
|
||||
}
|
||||
}
|
||||
|
||||
if (requester_email) {
|
||||
const requesterId = await resolveUserByEmail(requester_email);
|
||||
if (requesterId) {
|
||||
ticket.requester_id = requesterId;
|
||||
} else {
|
||||
throw new Error(`Could not find user with email: ${requester_email}`);
|
||||
}
|
||||
}
|
||||
|
||||
if (
|
||||
collaborator_emails &&
|
||||
Array.isArray(collaborator_emails) &&
|
||||
collaborator_emails.length > 0
|
||||
) {
|
||||
const collaboratorIds = [];
|
||||
for (const email of collaborator_emails) {
|
||||
const collaboratorId = await resolveUserByEmail(email as string);
|
||||
if (collaboratorId) {
|
||||
collaboratorIds.push(collaboratorId);
|
||||
}
|
||||
}
|
||||
ticket.collaborator_ids = collaboratorIds;
|
||||
}
|
||||
|
||||
if (
|
||||
follower_emails &&
|
||||
Array.isArray(follower_emails) &&
|
||||
follower_emails.length > 0
|
||||
) {
|
||||
const followerIds = [];
|
||||
for (const email of follower_emails) {
|
||||
const followerId = await resolveUserByEmail(email as string);
|
||||
if (followerId) {
|
||||
followerIds.push(followerId);
|
||||
}
|
||||
}
|
||||
ticket.follower_ids = followerIds;
|
||||
}
|
||||
|
||||
if (safe_update) {
|
||||
if (!updated_stamp) {
|
||||
throw new Error('Updated Timestamp is required when Safe Update is enabled');
|
||||
}
|
||||
ticket.safe_update = true;
|
||||
ticket.updated_stamp = updated_stamp;
|
||||
}
|
||||
|
||||
const optionalParams = {
|
||||
subject,
|
||||
priority,
|
||||
type,
|
||||
status,
|
||||
tags,
|
||||
organization_id,
|
||||
group_id,
|
||||
external_id,
|
||||
due_at,
|
||||
custom_status_id,
|
||||
brand_id,
|
||||
forum_topic_id,
|
||||
problem_id,
|
||||
};
|
||||
|
||||
for (const [key, value] of Object.entries(optionalParams)) {
|
||||
if (value !== null && value !== undefined && value !== '') {
|
||||
ticket[key] = value;
|
||||
}
|
||||
}
|
||||
|
||||
if (custom_fields && typeof custom_fields === 'object') {
|
||||
try {
|
||||
const fieldsResponse = await httpClient.sendRequest({
|
||||
url: `https://${authentication.props.subdomain}.zendesk.com/api/v2/ticket_fields.json`,
|
||||
method: HttpMethod.GET,
|
||||
authentication: {
|
||||
type: AuthenticationType.BASIC,
|
||||
username: authentication.props.email + '/token',
|
||||
password: authentication.props.token,
|
||||
},
|
||||
});
|
||||
|
||||
const fieldDefinitions = (fieldsResponse.body as { ticket_fields: Array<{
|
||||
id: number;
|
||||
key: string;
|
||||
type: string;
|
||||
}> }).ticket_fields;
|
||||
|
||||
const customFieldsArray: Array<{ id: number; value: unknown }> = [];
|
||||
for (const [propKey, value] of Object.entries(custom_fields)) {
|
||||
if (value === undefined || value === null || value === '') continue;
|
||||
const fieldKey = propKey.startsWith('field_') ? propKey.substring(6) : propKey;
|
||||
const def = fieldDefinitions.find(f => (f.key ?? `custom_field_${f.id}`) === fieldKey || f.key === fieldKey);
|
||||
if (!def) continue;
|
||||
|
||||
let formattedValue: unknown = value;
|
||||
if (def.type === 'date' && typeof value === 'string') {
|
||||
formattedValue = new Date(value).toISOString().split('T')[0];
|
||||
}
|
||||
customFieldsArray.push({ id: def.id, value: formattedValue });
|
||||
}
|
||||
|
||||
if (customFieldsArray.length > 0) {
|
||||
ticket.custom_fields = customFieldsArray;
|
||||
}
|
||||
} catch (error) {
|
||||
console.warn('Failed to process custom fields:', error);
|
||||
}
|
||||
}
|
||||
|
||||
if (Object.keys(ticket).length === 0) {
|
||||
throw new Error(
|
||||
'No fields provided to update. Please specify at least one field to modify.'
|
||||
);
|
||||
}
|
||||
|
||||
try {
|
||||
const response = await httpClient.sendRequest({
|
||||
url: `https://${authentication.props.subdomain}.zendesk.com/api/v2/tickets/${ticket_id}.json`,
|
||||
method: HttpMethod.PUT,
|
||||
headers: {
|
||||
'Content-Type': 'application/json',
|
||||
},
|
||||
authentication: {
|
||||
type: AuthenticationType.BASIC,
|
||||
username: authentication.props.email + '/token',
|
||||
password: authentication.props.token,
|
||||
},
|
||||
body: {
|
||||
ticket,
|
||||
},
|
||||
});
|
||||
|
||||
return {
|
||||
success: true,
|
||||
message: 'Ticket updated successfully',
|
||||
data: response.body,
|
||||
};
|
||||
} catch (error) {
|
||||
const errorMessage = (error as Error).message;
|
||||
if (errorMessage.includes('400')) {
|
||||
throw new Error(
|
||||
'Invalid request parameters. Please check your input values and try again.'
|
||||
);
|
||||
}
|
||||
|
||||
if (errorMessage.includes('401') || errorMessage.includes('403')) {
|
||||
throw new Error(
|
||||
'Authentication failed. Please check your API credentials and permissions.'
|
||||
);
|
||||
}
|
||||
|
||||
if (errorMessage.includes('404')) {
|
||||
throw new Error(
|
||||
`Ticket with ID ${ticket_id} not found. Please verify the ticket ID.`
|
||||
);
|
||||
}
|
||||
|
||||
if (errorMessage.includes('409')) {
|
||||
throw new Error(
|
||||
'Update conflict detected. The ticket was modified by another user. Please fetch the latest ticket data and try again.'
|
||||
);
|
||||
}
|
||||
|
||||
if (errorMessage.includes('422')) {
|
||||
throw new Error(
|
||||
'Validation error. Please check that all field values are valid.'
|
||||
);
|
||||
}
|
||||
|
||||
if (errorMessage.includes('429')) {
|
||||
throw new Error(
|
||||
'Rate limit exceeded. Please wait a moment before trying again.'
|
||||
);
|
||||
}
|
||||
|
||||
throw new Error(`Failed to update ticket: ${errorMessage}`);
|
||||
}
|
||||
},
|
||||
});
|
||||
@@ -0,0 +1,525 @@
|
||||
import { Property } from '@activepieces/pieces-framework';
|
||||
import {
|
||||
HttpMethod,
|
||||
AuthenticationType,
|
||||
httpClient,
|
||||
} from '@activepieces/pieces-common';
|
||||
import { zendeskAuth } from '../..';
|
||||
|
||||
type AuthProps = {
|
||||
email: string;
|
||||
token: string;
|
||||
subdomain: string;
|
||||
};
|
||||
|
||||
interface ZendeskTicket {
|
||||
id: number;
|
||||
subject: string;
|
||||
status: string;
|
||||
type?: string;
|
||||
requester_id: number;
|
||||
assignee_id?: number;
|
||||
created_at: string;
|
||||
updated_at: string;
|
||||
}
|
||||
|
||||
interface ZendeskTicketsResponse {
|
||||
tickets: ZendeskTicket[];
|
||||
}
|
||||
|
||||
interface ZendeskOrganization {
|
||||
id: number;
|
||||
name: string;
|
||||
details?: string;
|
||||
created_at: string;
|
||||
updated_at: string;
|
||||
}
|
||||
|
||||
interface ZendeskOrganizationsResponse {
|
||||
organizations: ZendeskOrganization[];
|
||||
}
|
||||
|
||||
interface ZendeskUser {
|
||||
id: number;
|
||||
name: string;
|
||||
email?: string;
|
||||
role?: string;
|
||||
created_at: string;
|
||||
updated_at: string;
|
||||
}
|
||||
|
||||
interface ZendeskUsersResponse {
|
||||
users: ZendeskUser[];
|
||||
}
|
||||
|
||||
interface ZendeskBrand {
|
||||
id: number;
|
||||
name: string;
|
||||
subdomain: string;
|
||||
active: boolean;
|
||||
default: boolean;
|
||||
created_at: string;
|
||||
updated_at: string;
|
||||
}
|
||||
|
||||
interface ZendeskBrandsResponse {
|
||||
brands: ZendeskBrand[];
|
||||
}
|
||||
|
||||
interface ZendeskCustomRole {
|
||||
id: number;
|
||||
name: string;
|
||||
description: string;
|
||||
role_type: number;
|
||||
team_member_count: number;
|
||||
created_at: string;
|
||||
updated_at: string;
|
||||
}
|
||||
|
||||
interface ZendeskCustomRolesResponse {
|
||||
custom_roles: ZendeskCustomRole[];
|
||||
}
|
||||
|
||||
interface ZendeskGroup {
|
||||
id: number;
|
||||
name: string;
|
||||
is_public: boolean;
|
||||
created_at: string;
|
||||
updated_at: string;
|
||||
}
|
||||
|
||||
interface ZendeskGroupsResponse {
|
||||
groups: ZendeskGroup[];
|
||||
}
|
||||
|
||||
export const ticketIdDropdown = Property.Dropdown({
|
||||
auth: zendeskAuth,
|
||||
displayName: 'Ticket',
|
||||
description: 'Select the ticket to work with',
|
||||
required: true,
|
||||
refreshers: ['auth'],
|
||||
options: async (propsValue) => {
|
||||
const auth = propsValue.auth;
|
||||
if (!auth) {
|
||||
return {
|
||||
disabled: true,
|
||||
options: [],
|
||||
placeholder: 'Connect your Zendesk account first',
|
||||
};
|
||||
}
|
||||
|
||||
try {
|
||||
const authentication = auth;
|
||||
const response = await httpClient.sendRequest<ZendeskTicketsResponse>({
|
||||
url: `https://${authentication.props.subdomain}.zendesk.com/api/v2/tickets.json?per_page=100`,
|
||||
method: HttpMethod.GET,
|
||||
authentication: {
|
||||
type: AuthenticationType.BASIC,
|
||||
username: authentication.props.email + '/token',
|
||||
password: authentication.props.token,
|
||||
},
|
||||
});
|
||||
|
||||
const tickets = response.body.tickets;
|
||||
|
||||
return {
|
||||
disabled: false,
|
||||
options: tickets.map((ticket) => ({
|
||||
label: `#${ticket.id} - ${ticket.subject} (${ticket.status})`,
|
||||
value: ticket.id.toString(),
|
||||
})),
|
||||
placeholder:
|
||||
tickets.length === 0 ? 'No tickets available' : 'Select a ticket',
|
||||
};
|
||||
} catch (error: unknown) {
|
||||
const errorMessage =
|
||||
error instanceof Error ? error.message : String(error);
|
||||
return {
|
||||
disabled: true,
|
||||
options: [],
|
||||
placeholder: `Error loading tickets: ${errorMessage}`,
|
||||
};
|
||||
}
|
||||
},
|
||||
});
|
||||
|
||||
export const organizationIdDropdown = Property.Dropdown({
|
||||
auth: zendeskAuth,
|
||||
|
||||
displayName: 'Organization',
|
||||
description: 'Select the organization to work with',
|
||||
required: true,
|
||||
refreshers: ['auth'],
|
||||
options: async (propsValue) => {
|
||||
const auth = propsValue.auth;
|
||||
if (!auth) {
|
||||
return {
|
||||
disabled: true,
|
||||
options: [],
|
||||
placeholder: 'Connect your Zendesk account first',
|
||||
};
|
||||
}
|
||||
|
||||
try {
|
||||
const authentication = auth;
|
||||
const response =
|
||||
await httpClient.sendRequest<ZendeskOrganizationsResponse>({
|
||||
url: `https://${authentication.props.subdomain}.zendesk.com/api/v2/organizations.json?per_page=100`,
|
||||
method: HttpMethod.GET,
|
||||
authentication: {
|
||||
type: AuthenticationType.BASIC,
|
||||
username: authentication.props.email + '/token',
|
||||
password: authentication.props.token,
|
||||
},
|
||||
});
|
||||
|
||||
const organizations = response.body.organizations;
|
||||
|
||||
return {
|
||||
disabled: false,
|
||||
options: organizations.map((org) => ({
|
||||
label: `${org.name} (ID: ${org.id})`,
|
||||
value: org.id.toString(),
|
||||
})),
|
||||
placeholder:
|
||||
organizations.length === 0
|
||||
? 'No organizations available'
|
||||
: 'Select an organization',
|
||||
};
|
||||
} catch (error: unknown) {
|
||||
const errorMessage =
|
||||
error instanceof Error ? error.message : String(error);
|
||||
return {
|
||||
disabled: true,
|
||||
options: [],
|
||||
placeholder: `Error loading organizations: ${errorMessage}`,
|
||||
};
|
||||
}
|
||||
},
|
||||
});
|
||||
|
||||
export const userIdDropdown = Property.Dropdown({
|
||||
auth: zendeskAuth,
|
||||
|
||||
displayName: 'User',
|
||||
description: 'Select the user to work with',
|
||||
required: true,
|
||||
refreshers: ['auth'],
|
||||
options: async (propsValue) => {
|
||||
const auth = propsValue.auth;
|
||||
if (!auth) {
|
||||
return {
|
||||
disabled: true,
|
||||
options: [],
|
||||
placeholder: 'Connect your Zendesk account first',
|
||||
};
|
||||
}
|
||||
|
||||
try {
|
||||
const authentication = auth;
|
||||
const response = await httpClient.sendRequest<ZendeskUsersResponse>({
|
||||
url: `https://${authentication.props.subdomain}.zendesk.com/api/v2/users.json?per_page=100`,
|
||||
method: HttpMethod.GET,
|
||||
authentication: {
|
||||
type: AuthenticationType.BASIC,
|
||||
username: authentication.props.email + '/token',
|
||||
password: authentication.props.token,
|
||||
},
|
||||
});
|
||||
|
||||
const users = response.body.users;
|
||||
|
||||
return {
|
||||
disabled: false,
|
||||
options: users.map((user) => ({
|
||||
label: `${user.name}${user.email ? ` (${user.email})` : ''} - ID: ${
|
||||
user.id
|
||||
}${user.role ? ` [${user.role}]` : ''}`,
|
||||
value: user.id.toString(),
|
||||
})),
|
||||
placeholder:
|
||||
users.length === 0 ? 'No users available' : 'Select a user',
|
||||
};
|
||||
} catch (error: unknown) {
|
||||
const errorMessage =
|
||||
error instanceof Error ? error.message : String(error);
|
||||
return {
|
||||
disabled: true,
|
||||
options: [],
|
||||
placeholder: `Error loading users: ${errorMessage}`,
|
||||
};
|
||||
}
|
||||
},
|
||||
});
|
||||
|
||||
export const brandIdDropdown = Property.Dropdown({
|
||||
auth: zendeskAuth,
|
||||
|
||||
displayName: 'Brand',
|
||||
description: 'Select the brand to work with',
|
||||
required: false,
|
||||
refreshers: ['auth'],
|
||||
options: async (propsValue) => {
|
||||
const auth = propsValue.auth;
|
||||
if (!auth) {
|
||||
return {
|
||||
disabled: true,
|
||||
options: [],
|
||||
placeholder: 'Connect your Zendesk account first',
|
||||
};
|
||||
}
|
||||
|
||||
try {
|
||||
const authentication = auth;
|
||||
const response = await httpClient.sendRequest<ZendeskBrandsResponse>({
|
||||
url: `https://${authentication.props.subdomain}.zendesk.com/api/v2/brands.json`,
|
||||
method: HttpMethod.GET,
|
||||
authentication: {
|
||||
type: AuthenticationType.BASIC,
|
||||
username: authentication.props.email + '/token',
|
||||
password: authentication.props.token,
|
||||
},
|
||||
});
|
||||
|
||||
const brands = response.body.brands;
|
||||
|
||||
return {
|
||||
disabled: false,
|
||||
options: brands
|
||||
.filter((brand) => brand.active)
|
||||
.map((brand) => ({
|
||||
label: `${brand.name}${brand.default ? ' (Default)' : ''} - ${
|
||||
brand.subdomain
|
||||
}`,
|
||||
value: brand.id.toString(),
|
||||
})),
|
||||
placeholder:
|
||||
brands.length === 0 ? 'No brands available' : 'Select a brand',
|
||||
};
|
||||
} catch (error: unknown) {
|
||||
const errorMessage =
|
||||
error instanceof Error ? error.message : String(error);
|
||||
return {
|
||||
disabled: true,
|
||||
options: [],
|
||||
placeholder: `Error loading brands: ${errorMessage}`,
|
||||
};
|
||||
}
|
||||
},
|
||||
});
|
||||
|
||||
export const problemTicketIdDropdown = Property.Dropdown({
|
||||
auth: zendeskAuth,
|
||||
|
||||
displayName: 'Problem Ticket',
|
||||
description: 'Select the problem ticket this ticket is an incident of',
|
||||
required: false,
|
||||
refreshers: ['auth'],
|
||||
options: async (propsValue) => {
|
||||
const auth = propsValue.auth;
|
||||
if (!auth) {
|
||||
return {
|
||||
disabled: true,
|
||||
options: [],
|
||||
placeholder: 'Connect your Zendesk account first',
|
||||
};
|
||||
}
|
||||
|
||||
try {
|
||||
const authentication = auth;
|
||||
const response = await httpClient.sendRequest<ZendeskTicketsResponse>({
|
||||
url: `https://${authentication.props.subdomain}.zendesk.com/api/v2/tickets.json?per_page=100`,
|
||||
method: HttpMethod.GET,
|
||||
authentication: {
|
||||
type: AuthenticationType.BASIC,
|
||||
username: authentication.props.email + '/token',
|
||||
password: authentication.props.token,
|
||||
},
|
||||
});
|
||||
|
||||
const tickets = response.body.tickets;
|
||||
|
||||
const problemTickets = tickets.filter(
|
||||
(ticket) => ticket.type === 'problem'
|
||||
);
|
||||
|
||||
return {
|
||||
disabled: false,
|
||||
options: problemTickets.map((ticket) => ({
|
||||
label: `#${ticket.id} - ${ticket.subject} (${ticket.status})`,
|
||||
value: ticket.id.toString(),
|
||||
})),
|
||||
placeholder:
|
||||
problemTickets.length === 0
|
||||
? 'No problem tickets available'
|
||||
: 'Select a problem ticket',
|
||||
};
|
||||
} catch (error: unknown) {
|
||||
const errorMessage =
|
||||
error instanceof Error ? error.message : String(error);
|
||||
return {
|
||||
disabled: true,
|
||||
options: [],
|
||||
placeholder: `Error loading problem tickets: ${errorMessage}`,
|
||||
};
|
||||
}
|
||||
},
|
||||
});
|
||||
|
||||
export const customRoleIdDropdown = Property.Dropdown({
|
||||
auth: zendeskAuth,
|
||||
|
||||
displayName: 'Custom Role',
|
||||
description: 'Select the custom role for the agent',
|
||||
required: false,
|
||||
refreshers: ['auth'],
|
||||
options: async (propsValue) => {
|
||||
const auth = propsValue.auth;
|
||||
if (!auth) {
|
||||
return {
|
||||
disabled: true,
|
||||
options: [],
|
||||
placeholder: 'Connect your Zendesk account first',
|
||||
};
|
||||
}
|
||||
|
||||
try {
|
||||
const authentication = auth;
|
||||
const response = await httpClient.sendRequest<ZendeskCustomRolesResponse>({
|
||||
url: `https://${authentication.props.subdomain}.zendesk.com/api/v2/custom_roles.json`,
|
||||
method: HttpMethod.GET,
|
||||
authentication: {
|
||||
type: AuthenticationType.BASIC,
|
||||
username: authentication.props.email + '/token',
|
||||
password: authentication.props.token,
|
||||
},
|
||||
});
|
||||
|
||||
const customRoles = response.body.custom_roles;
|
||||
|
||||
return {
|
||||
disabled: false,
|
||||
options: customRoles.map((role) => ({
|
||||
label: `${role.name} - ${role.description} (${role.team_member_count} members)`,
|
||||
value: role.id.toString(),
|
||||
})),
|
||||
placeholder:
|
||||
customRoles.length === 0 ? 'No custom roles available' : 'Select a custom role',
|
||||
};
|
||||
} catch (error: unknown) {
|
||||
const errorMessage =
|
||||
error instanceof Error ? error.message : String(error);
|
||||
return {
|
||||
disabled: true,
|
||||
options: [],
|
||||
placeholder: `Error loading custom roles: ${errorMessage}`,
|
||||
};
|
||||
}
|
||||
},
|
||||
});
|
||||
|
||||
export const agentBrandIdDropdown = Property.MultiSelectDropdown({
|
||||
auth: zendeskAuth,
|
||||
displayName: 'Agent Brand Access',
|
||||
description: 'Select the brands that the agent can access (for agents only)',
|
||||
required: false,
|
||||
refreshers: ['auth'],
|
||||
options: async (propsValue) => {
|
||||
const auth = propsValue.auth;
|
||||
if (!auth) {
|
||||
return {
|
||||
disabled: true,
|
||||
options: [],
|
||||
placeholder: 'Connect your Zendesk account first',
|
||||
};
|
||||
}
|
||||
|
||||
try {
|
||||
const authentication = auth;
|
||||
const response = await httpClient.sendRequest<ZendeskBrandsResponse>({
|
||||
url: `https://${authentication.props.subdomain}.zendesk.com/api/v2/brands.json`,
|
||||
method: HttpMethod.GET,
|
||||
authentication: {
|
||||
type: AuthenticationType.BASIC,
|
||||
username: authentication.props.email + '/token',
|
||||
password: authentication.props.token,
|
||||
},
|
||||
});
|
||||
|
||||
const brands = response.body.brands;
|
||||
|
||||
return {
|
||||
disabled: false,
|
||||
options: brands
|
||||
.filter((brand) => brand.active) // Only show active brands
|
||||
.map((brand) => ({
|
||||
label: `${brand.name}${brand.default ? ' (Default)' : ''} - ${brand.subdomain}`,
|
||||
value: brand.id.toString(),
|
||||
})),
|
||||
placeholder:
|
||||
brands.length === 0 ? 'No brands available' : 'Select brands for agent access',
|
||||
};
|
||||
} catch (error: unknown) {
|
||||
const errorMessage =
|
||||
error instanceof Error ? error.message : String(error);
|
||||
return {
|
||||
disabled: true,
|
||||
options: [],
|
||||
placeholder: `Error loading brands: ${errorMessage}`,
|
||||
};
|
||||
}
|
||||
},
|
||||
});
|
||||
|
||||
export const groupIdDropdown = Property.Dropdown({
|
||||
auth: zendeskAuth,
|
||||
|
||||
displayName: 'Group',
|
||||
description: 'Select the group to assign',
|
||||
required: false,
|
||||
refreshers: ['auth'],
|
||||
options: async (propsValue) => {
|
||||
const auth = propsValue.auth;
|
||||
if (!auth) {
|
||||
return {
|
||||
disabled: true,
|
||||
options: [],
|
||||
placeholder: 'Connect your Zendesk account first',
|
||||
};
|
||||
}
|
||||
|
||||
try {
|
||||
const authentication = auth;
|
||||
const response = await httpClient.sendRequest<ZendeskGroupsResponse>({
|
||||
url: `https://${authentication.props.subdomain}.zendesk.com/api/v2/groups.json?per_page=100`,
|
||||
method: HttpMethod.GET,
|
||||
authentication: {
|
||||
type: AuthenticationType.BASIC,
|
||||
username: authentication.props.email + '/token',
|
||||
password: authentication.props.token,
|
||||
},
|
||||
});
|
||||
|
||||
const groups = response.body.groups;
|
||||
|
||||
return {
|
||||
disabled: false,
|
||||
options: groups.map((group) => ({
|
||||
label: `${group.name}${group.is_public ? ' (Public)' : ' (Private)'} - ID: ${group.id}`,
|
||||
value: group.id.toString(),
|
||||
})),
|
||||
placeholder:
|
||||
groups.length === 0 ? 'No groups available' : 'Select a group',
|
||||
};
|
||||
} catch (error: unknown) {
|
||||
const errorMessage =
|
||||
error instanceof Error ? error.message : String(error);
|
||||
return {
|
||||
disabled: true,
|
||||
options: [],
|
||||
placeholder: `Error loading groups: ${errorMessage}`,
|
||||
};
|
||||
}
|
||||
},
|
||||
});
|
||||
|
||||
@@ -0,0 +1,190 @@
|
||||
import {
|
||||
createTrigger,
|
||||
Property,
|
||||
TriggerStrategy,
|
||||
} from '@activepieces/pieces-framework';
|
||||
import {
|
||||
AuthenticationType,
|
||||
HttpMethod,
|
||||
httpClient,
|
||||
} from '@activepieces/pieces-common';
|
||||
import { zendeskAuth } from '../..';
|
||||
|
||||
const WEBHOOK_TRIGGER_KEY = 'zendesk_ticket_action_webhook';
|
||||
|
||||
type AuthProps = {
|
||||
email: string;
|
||||
token: string;
|
||||
subdomain: string;
|
||||
};
|
||||
|
||||
interface ZendeskTicket {
|
||||
id: number;
|
||||
subject: string;
|
||||
description: string;
|
||||
status: string;
|
||||
priority: string;
|
||||
organization_id?: number;
|
||||
requester_id: number;
|
||||
assignee_id?: number;
|
||||
created_at: string;
|
||||
updated_at: string;
|
||||
tags: string[];
|
||||
}
|
||||
|
||||
export const newActionOnTicket = createTrigger({
|
||||
name: 'new_action_on_ticket',
|
||||
displayName: 'New Action on Ticket',
|
||||
description: 'Fires when the specified ticket updates. Requires a Zendesk Trigger with Notify active webhook.',
|
||||
auth: zendeskAuth,
|
||||
props: {
|
||||
ticket_id: Property.Number({
|
||||
displayName: 'Ticket ID',
|
||||
description: 'The specific ticket ID to monitor for actions/events.',
|
||||
required: true,
|
||||
}),
|
||||
},
|
||||
type: TriggerStrategy.WEBHOOK,
|
||||
sampleData: {
|
||||
url: 'https://example.zendesk.com/api/v2/tickets/5.json',
|
||||
id: 5,
|
||||
external_id: null,
|
||||
via: {
|
||||
channel: 'web',
|
||||
source: {
|
||||
from: {},
|
||||
to: {},
|
||||
rel: null,
|
||||
},
|
||||
},
|
||||
created_at: '2023-03-25T02:39:41Z',
|
||||
updated_at: '2023-03-25T02:39:41Z',
|
||||
type: null,
|
||||
subject: 'Sample Ticket with Action',
|
||||
raw_subject: 'Sample Ticket with Action',
|
||||
description: 'This ticket has activity',
|
||||
priority: 'normal',
|
||||
status: 'open',
|
||||
recipient: null,
|
||||
requester_id: 8193592318236,
|
||||
submitter_id: 8193592318236,
|
||||
assignee_id: 8193592318236,
|
||||
organization_id: 8193599387420,
|
||||
group_id: 8193569448092,
|
||||
collaborator_ids: [],
|
||||
follower_ids: [],
|
||||
email_cc_ids: [],
|
||||
forum_topic_id: null,
|
||||
problem_id: null,
|
||||
has_incidents: false,
|
||||
is_public: true,
|
||||
due_at: null,
|
||||
tags: ['monitored'],
|
||||
custom_fields: [],
|
||||
satisfaction_rating: null,
|
||||
sharing_agreement_ids: [],
|
||||
custom_status_id: 8193592472348,
|
||||
fields: [],
|
||||
followup_ids: [],
|
||||
ticket_form_id: 8193569410076,
|
||||
brand_id: 8193583542300,
|
||||
allow_channelback: false,
|
||||
allow_attachments: true,
|
||||
from_messaging_channel: false,
|
||||
audit: {
|
||||
id: 12345,
|
||||
ticket_id: 5,
|
||||
created_at: '2023-03-25T02:39:41Z',
|
||||
author_id: 8193592318236,
|
||||
events: [
|
||||
{
|
||||
id: 67890,
|
||||
type: 'Comment',
|
||||
public: true,
|
||||
body: 'New comment added to the ticket',
|
||||
html_body: '<div>New comment added to the ticket</div>',
|
||||
plain_body: 'New comment added to the ticket',
|
||||
author_id: 8193592318236,
|
||||
},
|
||||
{
|
||||
id: 67891,
|
||||
type: 'Change',
|
||||
field_name: 'priority',
|
||||
previous_value: 'low',
|
||||
value: 'normal',
|
||||
},
|
||||
],
|
||||
},
|
||||
},
|
||||
async onEnable(context) {
|
||||
const authentication = context.auth;
|
||||
|
||||
try {
|
||||
const response = await httpClient.sendRequest<{
|
||||
webhook: { id: string };
|
||||
}>({
|
||||
url: `https://${authentication.props.subdomain}.zendesk.com/api/v2/webhooks`,
|
||||
method: HttpMethod.POST,
|
||||
headers: {
|
||||
'Content-Type': 'application/json',
|
||||
},
|
||||
authentication: {
|
||||
type: AuthenticationType.BASIC,
|
||||
username: authentication.props.email + '/token',
|
||||
password: authentication.props.token,
|
||||
},
|
||||
body: {
|
||||
webhook: {
|
||||
name: `Activepieces Ticket Action Webhook - ${Date.now()}`,
|
||||
endpoint: context.webhookUrl,
|
||||
http_method: 'POST',
|
||||
request_format: 'json',
|
||||
status: 'active',
|
||||
subscriptions: ['conditional_ticket_events'],
|
||||
},
|
||||
},
|
||||
});
|
||||
|
||||
await context.store.put<string>(WEBHOOK_TRIGGER_KEY, response.body.webhook.id);
|
||||
} catch (error) {
|
||||
throw new Error(`Failed to register webhook: ${(error as Error).message}`);
|
||||
}
|
||||
},
|
||||
|
||||
async onDisable(context) {
|
||||
const authentication = context.auth;
|
||||
const webhookId = await context.store.get<string>(WEBHOOK_TRIGGER_KEY);
|
||||
|
||||
if (webhookId) {
|
||||
try {
|
||||
await httpClient.sendRequest({
|
||||
url: `https://${authentication.props.subdomain}.zendesk.com/api/v2/webhooks/${webhookId}`,
|
||||
method: HttpMethod.DELETE,
|
||||
authentication: {
|
||||
type: AuthenticationType.BASIC,
|
||||
username: authentication.props.email + '/token',
|
||||
password: authentication.props.token,
|
||||
},
|
||||
});
|
||||
} catch (error) {
|
||||
console.warn(`Warning: Failed to delete webhook ${webhookId}:`, (error as Error).message);
|
||||
} finally {
|
||||
await context.store.delete(WEBHOOK_TRIGGER_KEY);
|
||||
}
|
||||
}
|
||||
},
|
||||
|
||||
async run(context) {
|
||||
const payload = context.payload.body as { ticket?: ZendeskTicket };
|
||||
if (!payload.ticket) {
|
||||
return [];
|
||||
}
|
||||
|
||||
const targetTicketId = context.propsValue.ticket_id;
|
||||
if (payload.ticket.id !== targetTicketId) {
|
||||
return [];
|
||||
}
|
||||
|
||||
return [payload.ticket];
|
||||
},
|
||||
});
|
||||
@@ -0,0 +1,134 @@
|
||||
import {
|
||||
createTrigger,
|
||||
TriggerStrategy,
|
||||
} from '@activepieces/pieces-framework';
|
||||
import {
|
||||
AuthenticationType,
|
||||
HttpMethod,
|
||||
httpClient,
|
||||
} from '@activepieces/pieces-common';
|
||||
import { zendeskAuth } from '../..';
|
||||
|
||||
const WEBHOOK_TRIGGER_KEY = 'zendesk_new_organization_webhook';
|
||||
|
||||
type AuthProps = {
|
||||
email: string;
|
||||
token: string;
|
||||
subdomain: string;
|
||||
};
|
||||
|
||||
interface ZendeskOrganization {
|
||||
id: number;
|
||||
name: string;
|
||||
details: string;
|
||||
notes: string;
|
||||
group_id?: number;
|
||||
shared_tickets: boolean;
|
||||
shared_comments: boolean;
|
||||
external_id?: string;
|
||||
tags: string[];
|
||||
organization_fields: Record<string, unknown>;
|
||||
created_at: string;
|
||||
updated_at: string;
|
||||
}
|
||||
|
||||
export const newOrganization = createTrigger({
|
||||
name: 'new_organization',
|
||||
displayName: 'New Organization',
|
||||
description: 'Fires when a new organization record is created. Uses Zendesk event webhook (no Trigger needed).',
|
||||
auth: zendeskAuth,
|
||||
props: {},
|
||||
type: TriggerStrategy.WEBHOOK,
|
||||
sampleData: {
|
||||
id: 12345,
|
||||
url: 'https://example.zendesk.com/api/v2/organizations/12345.json',
|
||||
name: 'Acme Corporation',
|
||||
details: 'A leading technology company',
|
||||
notes: 'Important client',
|
||||
group_id: 67890,
|
||||
shared_tickets: true,
|
||||
shared_comments: true,
|
||||
external_id: 'acme-001',
|
||||
tags: ['enterprise', 'vip'],
|
||||
organization_fields: {
|
||||
industry: 'Technology',
|
||||
company_size: 'Large',
|
||||
},
|
||||
created_at: '2023-03-25T02:39:41Z',
|
||||
updated_at: '2023-03-25T02:39:41Z',
|
||||
domain_names: ['acme.com', 'acmecorp.com'],
|
||||
},
|
||||
async onEnable(context) {
|
||||
const authentication = context.auth;
|
||||
|
||||
try {
|
||||
const response = await httpClient.sendRequest<{
|
||||
webhook: { id: string };
|
||||
}>({
|
||||
url: `https://${authentication.props.subdomain}.zendesk.com/api/v2/webhooks`,
|
||||
method: HttpMethod.POST,
|
||||
headers: {
|
||||
'Content-Type': 'application/json',
|
||||
},
|
||||
authentication: {
|
||||
type: AuthenticationType.BASIC,
|
||||
username: authentication.props.email + '/token',
|
||||
password: authentication.props.token,
|
||||
},
|
||||
body: {
|
||||
webhook: {
|
||||
name: `Activepieces New Organization Webhook - ${Date.now()}`,
|
||||
endpoint: context.webhookUrl,
|
||||
http_method: 'POST',
|
||||
request_format: 'json',
|
||||
status: 'active',
|
||||
subscriptions: ['zen:event-type:organization.created'],
|
||||
},
|
||||
},
|
||||
});
|
||||
|
||||
await context.store.put<string>(WEBHOOK_TRIGGER_KEY, response.body.webhook.id);
|
||||
} catch (error) {
|
||||
throw new Error(`Failed to register webhook: ${(error as Error).message}`);
|
||||
}
|
||||
},
|
||||
|
||||
async onDisable(context) {
|
||||
const authentication = context.auth;
|
||||
const webhookId = await context.store.get<string>(WEBHOOK_TRIGGER_KEY);
|
||||
|
||||
if (webhookId) {
|
||||
try {
|
||||
await httpClient.sendRequest({
|
||||
url: `https://${authentication.props.subdomain}.zendesk.com/api/v2/webhooks/${webhookId}`,
|
||||
method: HttpMethod.DELETE,
|
||||
authentication: {
|
||||
type: AuthenticationType.BASIC,
|
||||
username: authentication.props.email + '/token',
|
||||
password: authentication.props.token,
|
||||
},
|
||||
});
|
||||
} catch (error) {
|
||||
console.warn(`Warning: Failed to delete webhook ${webhookId}:`, (error as Error).message);
|
||||
} finally {
|
||||
await context.store.delete(WEBHOOK_TRIGGER_KEY);
|
||||
}
|
||||
}
|
||||
},
|
||||
|
||||
async run(context) {
|
||||
const payload = context.payload.body as {
|
||||
type?: string;
|
||||
organization?: ZendeskOrganization;
|
||||
detail?: ZendeskOrganization;
|
||||
'zen:body'?: { organization?: ZendeskOrganization };
|
||||
};
|
||||
|
||||
const organization = payload.organization || payload['zen:body']?.organization || payload.detail;
|
||||
if (!organization) {
|
||||
return [];
|
||||
}
|
||||
|
||||
return [organization];
|
||||
},
|
||||
});
|
||||
@@ -0,0 +1,186 @@
|
||||
import {
|
||||
createTrigger,
|
||||
Property,
|
||||
TriggerStrategy,
|
||||
} from '@activepieces/pieces-framework';
|
||||
import {
|
||||
AuthenticationType,
|
||||
HttpMethod,
|
||||
httpClient,
|
||||
} from '@activepieces/pieces-common';
|
||||
import { zendeskAuth } from '../..';
|
||||
|
||||
const WEBHOOK_TRIGGER_KEY = 'zendesk_suspended_ticket_webhook';
|
||||
|
||||
type AuthProps = {
|
||||
email: string;
|
||||
token: string;
|
||||
subdomain: string;
|
||||
};
|
||||
|
||||
interface ZendeskTicket {
|
||||
id: number;
|
||||
subject: string;
|
||||
description: string;
|
||||
status: string;
|
||||
priority: string;
|
||||
organization_id?: number;
|
||||
requester_id: number;
|
||||
assignee_id?: number;
|
||||
created_at: string;
|
||||
updated_at: string;
|
||||
tags: string[];
|
||||
}
|
||||
|
||||
export const newSuspendedTicket = createTrigger({
|
||||
name: 'new_suspended_ticket',
|
||||
displayName: 'New Suspended Ticket',
|
||||
description: 'Fires when a ticket is suspended. Requires a Zendesk Trigger with Notify active webhook. Suspended tickets auto-delete after 14 days.',
|
||||
auth: zendeskAuth,
|
||||
props: {
|
||||
organization_filter: Property.ShortText({
|
||||
displayName: 'Organization ID Filter (Optional)',
|
||||
description: 'Only trigger for tickets from this organization ID. Leave empty for all organizations.',
|
||||
required: false,
|
||||
}),
|
||||
},
|
||||
type: TriggerStrategy.WEBHOOK,
|
||||
sampleData: {
|
||||
url: 'https://example.zendesk.com/api/v2/tickets/5.json',
|
||||
id: 5,
|
||||
external_id: null,
|
||||
via: {
|
||||
channel: 'web',
|
||||
source: {
|
||||
from: {},
|
||||
to: {},
|
||||
rel: null,
|
||||
},
|
||||
},
|
||||
created_at: '2023-03-25T02:39:41Z',
|
||||
updated_at: '2023-03-25T02:39:41Z',
|
||||
type: null,
|
||||
subject: 'Suspended Ticket',
|
||||
raw_subject: 'Suspended Ticket',
|
||||
description: 'This ticket has been suspended',
|
||||
priority: null,
|
||||
status: 'suspended',
|
||||
recipient: null,
|
||||
requester_id: 8193592318236,
|
||||
submitter_id: 8193592318236,
|
||||
assignee_id: null,
|
||||
organization_id: 8193599387420,
|
||||
group_id: 8193569448092,
|
||||
collaborator_ids: [],
|
||||
follower_ids: [],
|
||||
email_cc_ids: [],
|
||||
forum_topic_id: null,
|
||||
problem_id: null,
|
||||
has_incidents: false,
|
||||
is_public: true,
|
||||
due_at: null,
|
||||
tags: [],
|
||||
custom_fields: [],
|
||||
satisfaction_rating: null,
|
||||
sharing_agreement_ids: [],
|
||||
custom_status_id: 8193592472348,
|
||||
fields: [],
|
||||
followup_ids: [],
|
||||
ticket_form_id: 8193569410076,
|
||||
brand_id: 8193583542300,
|
||||
allow_channelback: false,
|
||||
allow_attachments: true,
|
||||
from_messaging_channel: false,
|
||||
audit: {
|
||||
id: 12345,
|
||||
ticket_id: 5,
|
||||
created_at: '2023-03-25T02:39:41Z',
|
||||
author_id: 8193592318236,
|
||||
events: [
|
||||
{
|
||||
id: 67890,
|
||||
type: 'Change',
|
||||
field_name: 'status',
|
||||
previous_value: 'open',
|
||||
value: 'suspended',
|
||||
},
|
||||
],
|
||||
},
|
||||
},
|
||||
async onEnable(context) {
|
||||
const authentication = context.auth;
|
||||
|
||||
try {
|
||||
const response = await httpClient.sendRequest<{
|
||||
webhook: { id: string };
|
||||
}>({
|
||||
url: `https://${authentication.props.subdomain}.zendesk.com/api/v2/webhooks`,
|
||||
method: HttpMethod.POST,
|
||||
headers: {
|
||||
'Content-Type': 'application/json',
|
||||
},
|
||||
authentication: {
|
||||
type: AuthenticationType.BASIC,
|
||||
username: authentication.props.email + '/token',
|
||||
password: authentication.props.token,
|
||||
},
|
||||
body: {
|
||||
webhook: {
|
||||
name: `Activepieces Suspended Ticket Webhook - ${Date.now()}`,
|
||||
endpoint: context.webhookUrl,
|
||||
http_method: 'POST',
|
||||
request_format: 'json',
|
||||
status: 'active',
|
||||
subscriptions: ['conditional_ticket_events'],
|
||||
},
|
||||
},
|
||||
});
|
||||
|
||||
await context.store.put<string>(WEBHOOK_TRIGGER_KEY, response.body.webhook.id);
|
||||
} catch (error) {
|
||||
throw new Error(`Failed to register webhook: ${(error as Error).message}`);
|
||||
}
|
||||
},
|
||||
|
||||
async onDisable(context) {
|
||||
const authentication = context.auth;
|
||||
const webhookId = await context.store.get<string>(WEBHOOK_TRIGGER_KEY);
|
||||
|
||||
if (webhookId) {
|
||||
try {
|
||||
await httpClient.sendRequest({
|
||||
url: `https://${authentication.props.subdomain}.zendesk.com/api/v2/webhooks/${webhookId}`,
|
||||
method: HttpMethod.DELETE,
|
||||
authentication: {
|
||||
type: AuthenticationType.BASIC,
|
||||
username: authentication.props.email + '/token',
|
||||
password: authentication.props.token,
|
||||
},
|
||||
});
|
||||
} catch (error) {
|
||||
console.warn(`Warning: Failed to delete webhook ${webhookId}:`, (error as Error).message);
|
||||
} finally {
|
||||
await context.store.delete(WEBHOOK_TRIGGER_KEY);
|
||||
}
|
||||
}
|
||||
},
|
||||
|
||||
async run(context) {
|
||||
const payload = context.payload.body as { ticket?: ZendeskTicket };
|
||||
if (!payload.ticket) {
|
||||
return [];
|
||||
}
|
||||
|
||||
const ticket = payload.ticket;
|
||||
if (ticket.status !== 'suspended') {
|
||||
return [];
|
||||
}
|
||||
|
||||
const organizationFilter = context.propsValue.organization_filter;
|
||||
if (organizationFilter && ticket.organization_id?.toString() !== organizationFilter) {
|
||||
return [];
|
||||
}
|
||||
|
||||
return [ticket];
|
||||
},
|
||||
});
|
||||
@@ -0,0 +1,164 @@
|
||||
import {
|
||||
TriggerStrategy,
|
||||
createTrigger,
|
||||
Property,
|
||||
AppConnectionValueForAuthProperty,
|
||||
} from '@activepieces/pieces-framework';
|
||||
import {
|
||||
AuthenticationType,
|
||||
DedupeStrategy,
|
||||
httpClient,
|
||||
HttpMethod,
|
||||
Polling,
|
||||
pollingHelper,
|
||||
} from '@activepieces/pieces-common';
|
||||
import { zendeskAuth } from '../..';
|
||||
|
||||
export const newTicketInView = createTrigger({
|
||||
auth: zendeskAuth,
|
||||
name: 'new_ticket_in_view',
|
||||
displayName: 'New ticket in view',
|
||||
description: 'Triggers when a new ticket is created in a view',
|
||||
type: TriggerStrategy.POLLING,
|
||||
props: {
|
||||
view_id: Property.Dropdown({
|
||||
auth: zendeskAuth,
|
||||
displayName: 'View',
|
||||
description: 'The view to monitor for new tickets',
|
||||
refreshers: [],
|
||||
required: true,
|
||||
options: async ({ auth }) => {
|
||||
const authentication = auth;
|
||||
if (
|
||||
!authentication
|
||||
) {
|
||||
return {
|
||||
placeholder: 'Fill your authentication first',
|
||||
disabled: true,
|
||||
options: [],
|
||||
};
|
||||
}
|
||||
const response = await httpClient.sendRequest<{ views: any[] }>({
|
||||
url: `https://${authentication.props.subdomain}.zendesk.com/api/v2/views.json`,
|
||||
method: HttpMethod.GET,
|
||||
authentication: {
|
||||
type: AuthenticationType.BASIC,
|
||||
username: authentication.props.email + '/token',
|
||||
password: authentication.props.token,
|
||||
},
|
||||
});
|
||||
return {
|
||||
placeholder: 'Select a view',
|
||||
options: response.body.views.map((view: any) => ({
|
||||
label: view.title,
|
||||
value: view.id,
|
||||
})),
|
||||
};
|
||||
},
|
||||
}),
|
||||
},
|
||||
sampleData: {
|
||||
url: 'https://activepieceshelp.zendesk.com/api/v2/tickets/5.json',
|
||||
id: 5,
|
||||
external_id: null,
|
||||
via: {
|
||||
channel: 'web',
|
||||
source: {
|
||||
from: {},
|
||||
to: {},
|
||||
rel: null,
|
||||
},
|
||||
},
|
||||
created_at: '2023-03-25T02:39:41Z',
|
||||
updated_at: '2023-03-25T02:39:41Z',
|
||||
type: null,
|
||||
subject: 'Subject',
|
||||
raw_subject: 'Raw Subject',
|
||||
description: 'Description',
|
||||
priority: null,
|
||||
status: 'open',
|
||||
recipient: null,
|
||||
requester_id: 8193592318236,
|
||||
submitter_id: 8193592318236,
|
||||
assignee_id: 8193592318236,
|
||||
organization_id: 8193599387420,
|
||||
group_id: 8193569448092,
|
||||
collaborator_ids: [],
|
||||
follower_ids: [],
|
||||
email_cc_ids: [],
|
||||
forum_topic_id: null,
|
||||
problem_id: null,
|
||||
has_incidents: false,
|
||||
is_public: true,
|
||||
due_at: null,
|
||||
tags: [],
|
||||
custom_fields: [],
|
||||
satisfaction_rating: null,
|
||||
sharing_agreement_ids: [],
|
||||
custom_status_id: 8193592472348,
|
||||
fields: [],
|
||||
followup_ids: [],
|
||||
ticket_form_id: 8193569410076,
|
||||
brand_id: 8193583542300,
|
||||
allow_channelback: false,
|
||||
allow_attachments: true,
|
||||
from_messaging_channel: false,
|
||||
},
|
||||
onEnable: async (context) => {
|
||||
await pollingHelper.onEnable(polling, {
|
||||
auth: context.auth,
|
||||
store: context.store,
|
||||
propsValue: context.propsValue,
|
||||
});
|
||||
},
|
||||
onDisable: async (context) => {
|
||||
await pollingHelper.onDisable(polling, {
|
||||
auth: context.auth,
|
||||
store: context.store,
|
||||
propsValue: context.propsValue,
|
||||
});
|
||||
},
|
||||
run: async (context) => {
|
||||
return await pollingHelper.poll(polling, {
|
||||
auth: context.auth,
|
||||
store: context.store,
|
||||
propsValue: context.propsValue,
|
||||
files: context.files,
|
||||
});
|
||||
},
|
||||
test: async (context) => {
|
||||
return await pollingHelper.test(polling, {
|
||||
auth: context.auth,
|
||||
store: context.store,
|
||||
propsValue: context.propsValue,
|
||||
files: context.files,
|
||||
});
|
||||
},
|
||||
});
|
||||
|
||||
|
||||
|
||||
const polling: Polling<AppConnectionValueForAuthProperty<typeof zendeskAuth>, { view_id: string }> = {
|
||||
strategy: DedupeStrategy.LAST_ITEM,
|
||||
items: async ({ auth, propsValue }) => {
|
||||
const items = await getTickets(auth, propsValue.view_id);
|
||||
return items.map((item) => ({
|
||||
id: item.id,
|
||||
data: item,
|
||||
}));
|
||||
},
|
||||
};
|
||||
|
||||
async function getTickets(authentication: AppConnectionValueForAuthProperty<typeof zendeskAuth>, view_id: string) {
|
||||
const { email, token, subdomain } = authentication.props;
|
||||
const response = await httpClient.sendRequest<{ tickets: any[] }>({
|
||||
url: `https://${subdomain}.zendesk.com/api/v2/views/${view_id}/tickets.json?sort_order=desc&sort_by=created_at&per_page=200`,
|
||||
method: HttpMethod.GET,
|
||||
authentication: {
|
||||
type: AuthenticationType.BASIC,
|
||||
username: email + '/token',
|
||||
password: token,
|
||||
},
|
||||
});
|
||||
return response.body.tickets;
|
||||
}
|
||||
@@ -0,0 +1,208 @@
|
||||
import {
|
||||
createTrigger,
|
||||
Property,
|
||||
TriggerStrategy,
|
||||
} from '@activepieces/pieces-framework';
|
||||
import {
|
||||
AuthenticationType,
|
||||
HttpMethod,
|
||||
httpClient,
|
||||
} from '@activepieces/pieces-common';
|
||||
import { zendeskAuth } from '../..';
|
||||
|
||||
const WEBHOOK_TRIGGER_KEY = 'zendesk_new_ticket_webhook';
|
||||
|
||||
type AuthProps = {
|
||||
email: string;
|
||||
token: string;
|
||||
subdomain: string;
|
||||
};
|
||||
|
||||
interface ZendeskOrganization {
|
||||
id: number;
|
||||
name: string;
|
||||
}
|
||||
|
||||
interface ZendeskPayload {
|
||||
type?: string;
|
||||
ticket?: Record<string, unknown>;
|
||||
}
|
||||
|
||||
export const newTicket = createTrigger({
|
||||
name: 'new_ticket',
|
||||
displayName: 'New Ticket',
|
||||
description: 'Fires when a new ticket is created (optionally filtered by organization). Requires a Zendesk Trigger with Notify active webhook.',
|
||||
auth: zendeskAuth,
|
||||
props: {
|
||||
organization_id: Property.Dropdown({
|
||||
auth: zendeskAuth,
|
||||
displayName: 'Organization (Optional)',
|
||||
description: 'Filter tickets by organization. Leave empty to trigger for all organizations.',
|
||||
refreshers: [],
|
||||
required: false,
|
||||
options: async ({ auth }) => {
|
||||
const authentication = auth;
|
||||
if (
|
||||
!authentication
|
||||
) {
|
||||
return {
|
||||
placeholder: 'Fill your authentication first',
|
||||
disabled: true,
|
||||
options: [],
|
||||
};
|
||||
}
|
||||
try {
|
||||
const response = await httpClient.sendRequest<{ organizations: ZendeskOrganization[] }>({
|
||||
url: `https://${authentication.props.subdomain}.zendesk.com/api/v2/organizations.json`,
|
||||
method: HttpMethod.GET,
|
||||
authentication: {
|
||||
type: AuthenticationType.BASIC,
|
||||
username: authentication.props.email + '/token',
|
||||
password: authentication.props.token,
|
||||
},
|
||||
});
|
||||
return {
|
||||
placeholder: 'Select an organization (optional)',
|
||||
options: [
|
||||
{ label: 'All Organizations', value: 'all' },
|
||||
...response.body.organizations.map((org: ZendeskOrganization) => ({
|
||||
label: org.name,
|
||||
value: org.id.toString(),
|
||||
})),
|
||||
],
|
||||
};
|
||||
} catch (error) {
|
||||
return {
|
||||
placeholder: 'Error loading organizations',
|
||||
disabled: true,
|
||||
options: [],
|
||||
};
|
||||
}
|
||||
},
|
||||
}),
|
||||
},
|
||||
type: TriggerStrategy.WEBHOOK,
|
||||
sampleData: {
|
||||
url: 'https://example.zendesk.com/api/v2/tickets/5.json',
|
||||
id: 5,
|
||||
external_id: null,
|
||||
via: {
|
||||
channel: 'web',
|
||||
source: {
|
||||
from: {},
|
||||
to: {},
|
||||
rel: null,
|
||||
},
|
||||
},
|
||||
created_at: '2023-03-25T02:39:41Z',
|
||||
updated_at: '2023-03-25T02:39:41Z',
|
||||
type: null,
|
||||
subject: 'Subject',
|
||||
raw_subject: 'Raw Subject',
|
||||
description: 'Description',
|
||||
priority: null,
|
||||
status: 'open',
|
||||
recipient: null,
|
||||
requester_id: 8193592318236,
|
||||
submitter_id: 8193592318236,
|
||||
assignee_id: 8193592318236,
|
||||
organization_id: 8193599387420,
|
||||
group_id: 8193569448092,
|
||||
collaborator_ids: [],
|
||||
follower_ids: [],
|
||||
email_cc_ids: [],
|
||||
forum_topic_id: null,
|
||||
problem_id: null,
|
||||
has_incidents: false,
|
||||
is_public: true,
|
||||
due_at: null,
|
||||
tags: [],
|
||||
custom_fields: [],
|
||||
satisfaction_rating: null,
|
||||
sharing_agreement_ids: [],
|
||||
custom_status_id: 8193592472348,
|
||||
fields: [],
|
||||
followup_ids: [],
|
||||
ticket_form_id: 8193569410076,
|
||||
brand_id: 8193583542300,
|
||||
allow_channelback: false,
|
||||
allow_attachments: true,
|
||||
from_messaging_channel: false,
|
||||
},
|
||||
async onEnable(context) {
|
||||
const authentication = context.auth;
|
||||
|
||||
try {
|
||||
const response = await httpClient.sendRequest<{
|
||||
webhook: { id: string };
|
||||
}>({
|
||||
url: `https://${authentication.props.subdomain}.zendesk.com/api/v2/webhooks`,
|
||||
method: HttpMethod.POST,
|
||||
headers: {
|
||||
'Content-Type': 'application/json',
|
||||
},
|
||||
authentication: {
|
||||
type: AuthenticationType.BASIC,
|
||||
username: authentication.props.email + '/token',
|
||||
password: authentication.props.token,
|
||||
},
|
||||
body: {
|
||||
webhook: {
|
||||
name: `Activepieces New Ticket Webhook - ${Date.now()}`,
|
||||
endpoint: context.webhookUrl,
|
||||
http_method: 'POST',
|
||||
request_format: 'json',
|
||||
status: 'active',
|
||||
subscriptions: ['conditional_ticket_events'],
|
||||
},
|
||||
},
|
||||
});
|
||||
|
||||
await context.store.put<string>(WEBHOOK_TRIGGER_KEY, response.body.webhook.id);
|
||||
} catch (error) {
|
||||
throw new Error(`Failed to register webhook: ${(error as Error).message}`);
|
||||
}
|
||||
},
|
||||
|
||||
async onDisable(context) {
|
||||
const authentication = context.auth;
|
||||
const webhookId = await context.store.get<string>(WEBHOOK_TRIGGER_KEY);
|
||||
|
||||
if (webhookId) {
|
||||
try {
|
||||
await httpClient.sendRequest({
|
||||
url: `https://${authentication.props.subdomain}.zendesk.com/api/v2/webhooks/${webhookId}`,
|
||||
method: HttpMethod.DELETE,
|
||||
authentication: {
|
||||
type: AuthenticationType.BASIC,
|
||||
username: authentication.props.email + '/token',
|
||||
password: authentication.props.token,
|
||||
},
|
||||
});
|
||||
} catch (error) {
|
||||
console.warn(`Warning: Failed to delete webhook ${webhookId}:`, (error as Error).message);
|
||||
} finally {
|
||||
await context.store.delete(WEBHOOK_TRIGGER_KEY);
|
||||
}
|
||||
}
|
||||
},
|
||||
|
||||
async run(context) {
|
||||
const payload = context.payload.body as ZendeskPayload;
|
||||
if (!payload.ticket) {
|
||||
return [];
|
||||
}
|
||||
|
||||
const ticket = payload.ticket;
|
||||
|
||||
const organizationId = context.propsValue.organization_id;
|
||||
if (organizationId && organizationId !== 'all') {
|
||||
const ticketOrganizationId = (ticket as Record<string, unknown>).organization_id;
|
||||
if (!ticketOrganizationId || ticketOrganizationId.toString() !== organizationId) {
|
||||
return [];
|
||||
}
|
||||
}
|
||||
|
||||
return [ticket];
|
||||
},
|
||||
});
|
||||
@@ -0,0 +1,201 @@
|
||||
import {
|
||||
createTrigger,
|
||||
Property,
|
||||
TriggerStrategy,
|
||||
} from '@activepieces/pieces-framework';
|
||||
import {
|
||||
AuthenticationType,
|
||||
HttpMethod,
|
||||
httpClient,
|
||||
} from '@activepieces/pieces-common';
|
||||
import { zendeskAuth } from '../..';
|
||||
|
||||
const WEBHOOK_TRIGGER_KEY = 'zendesk_new_user_webhook';
|
||||
|
||||
type AuthProps = {
|
||||
email: string;
|
||||
token: string;
|
||||
subdomain: string;
|
||||
};
|
||||
|
||||
interface ZendeskUser {
|
||||
id: number;
|
||||
name: string;
|
||||
email: string;
|
||||
created_at: string;
|
||||
updated_at: string;
|
||||
time_zone: string;
|
||||
phone?: string;
|
||||
shared_phone_number?: string;
|
||||
photo?: {
|
||||
url: string;
|
||||
id: number;
|
||||
file_name: string;
|
||||
content_url: string;
|
||||
content_type: string;
|
||||
size: number;
|
||||
width: number;
|
||||
height: number;
|
||||
};
|
||||
locale_id: number;
|
||||
locale: string;
|
||||
organization_id?: number;
|
||||
role: string;
|
||||
verified: boolean;
|
||||
external_id?: string;
|
||||
tags: string[];
|
||||
alias?: string;
|
||||
active: boolean;
|
||||
shared: boolean;
|
||||
shared_agent: boolean;
|
||||
last_login_at?: string;
|
||||
two_factor_auth_enabled: boolean;
|
||||
signature?: string;
|
||||
details?: string;
|
||||
notes?: string;
|
||||
role_type?: number;
|
||||
custom_role_id?: number;
|
||||
moderator: boolean;
|
||||
ticket_restriction: string;
|
||||
only_private_comments: boolean;
|
||||
restricted_agent: boolean;
|
||||
suspended: boolean;
|
||||
report_csv: boolean;
|
||||
user_fields: Record<string, unknown>;
|
||||
}
|
||||
|
||||
export const newUser = createTrigger({
|
||||
name: 'new_user',
|
||||
displayName: 'New User',
|
||||
description: 'Fires when a new user is created. Uses Zendesk event webhook (no Trigger needed).',
|
||||
auth: zendeskAuth,
|
||||
props: {
|
||||
user_role: Property.StaticDropdown({
|
||||
displayName: 'User Role (Optional)',
|
||||
description: 'Filter users by role. Leave empty to trigger for all user types.',
|
||||
required: false,
|
||||
options: {
|
||||
disabled: false,
|
||||
placeholder: 'Select a user role (optional)',
|
||||
options: [
|
||||
{ label: 'All Roles', value: 'all' },
|
||||
{ label: 'End User', value: 'end-user' },
|
||||
{ label: 'Agent', value: 'agent' },
|
||||
{ label: 'Admin', value: 'admin' },
|
||||
],
|
||||
},
|
||||
}),
|
||||
},
|
||||
type: TriggerStrategy.WEBHOOK,
|
||||
sampleData: {
|
||||
id: 12345,
|
||||
url: 'https://example.zendesk.com/api/v2/users/12345.json',
|
||||
name: 'John Doe',
|
||||
email: 'john.doe@example.com',
|
||||
created_at: '2023-03-25T02:39:41Z',
|
||||
updated_at: '2023-03-25T02:39:41Z',
|
||||
time_zone: 'America/New_York',
|
||||
phone: '+1-555-123-4567',
|
||||
locale_id: 1,
|
||||
locale: 'en-US',
|
||||
organization_id: 67890,
|
||||
role: 'end-user',
|
||||
verified: true,
|
||||
external_id: 'user-001',
|
||||
tags: ['new_customer'],
|
||||
active: true,
|
||||
shared: false,
|
||||
shared_agent: false,
|
||||
two_factor_auth_enabled: false,
|
||||
moderator: false,
|
||||
ticket_restriction: 'requested',
|
||||
only_private_comments: false,
|
||||
restricted_agent: false,
|
||||
suspended: false,
|
||||
report_csv: false,
|
||||
user_fields: {
|
||||
department: 'Sales',
|
||||
company_size: 'Medium',
|
||||
},
|
||||
},
|
||||
async onEnable(context) {
|
||||
const authentication = context.auth;
|
||||
|
||||
try {
|
||||
const response = await httpClient.sendRequest<{
|
||||
webhook: { id: string };
|
||||
}>({
|
||||
url: `https://${authentication.props.subdomain}.zendesk.com/api/v2/webhooks`,
|
||||
method: HttpMethod.POST,
|
||||
headers: {
|
||||
'Content-Type': 'application/json',
|
||||
},
|
||||
authentication: {
|
||||
type: AuthenticationType.BASIC,
|
||||
username: authentication.props.email + '/token',
|
||||
password: authentication.props.token,
|
||||
},
|
||||
body: {
|
||||
webhook: {
|
||||
name: `Activepieces New User Webhook - ${Date.now()}`,
|
||||
endpoint: context.webhookUrl,
|
||||
http_method: 'POST',
|
||||
request_format: 'json',
|
||||
status: 'active',
|
||||
subscriptions: ['zen:event-type:user.created'],
|
||||
},
|
||||
},
|
||||
});
|
||||
|
||||
await context.store.put<string>(WEBHOOK_TRIGGER_KEY, response.body.webhook.id);
|
||||
} catch (error) {
|
||||
throw new Error(`Failed to register webhook: ${(error as Error).message}`);
|
||||
}
|
||||
},
|
||||
|
||||
async onDisable(context) {
|
||||
const authentication = context.auth;
|
||||
const webhookId = await context.store.get<string>(WEBHOOK_TRIGGER_KEY);
|
||||
|
||||
if (webhookId) {
|
||||
try {
|
||||
await httpClient.sendRequest({
|
||||
url: `https://${authentication.props.subdomain}.zendesk.com/api/v2/webhooks/${webhookId}`,
|
||||
method: HttpMethod.DELETE,
|
||||
authentication: {
|
||||
type: AuthenticationType.BASIC,
|
||||
username: authentication.props.email + '/token',
|
||||
password: authentication.props.token,
|
||||
},
|
||||
});
|
||||
} catch (error) {
|
||||
console.warn(`Warning: Failed to delete webhook ${webhookId}:`, (error as Error).message);
|
||||
} finally {
|
||||
await context.store.delete(WEBHOOK_TRIGGER_KEY);
|
||||
}
|
||||
}
|
||||
},
|
||||
|
||||
async run(context) {
|
||||
const payload = context.payload.body as {
|
||||
type?: string;
|
||||
user?: ZendeskUser;
|
||||
detail?: ZendeskUser;
|
||||
'zen:body'?: { user?: ZendeskUser };
|
||||
};
|
||||
|
||||
const user = payload.user || payload['zen:body']?.user || payload.detail;
|
||||
if (!user) {
|
||||
return [];
|
||||
}
|
||||
|
||||
const userRole = context.propsValue.user_role;
|
||||
if (userRole && userRole !== 'all') {
|
||||
if (user.role !== userRole) {
|
||||
return [];
|
||||
}
|
||||
}
|
||||
|
||||
return [user];
|
||||
},
|
||||
});
|
||||
@@ -0,0 +1,187 @@
|
||||
import {
|
||||
createTrigger,
|
||||
Property,
|
||||
TriggerStrategy,
|
||||
} from '@activepieces/pieces-framework';
|
||||
import {
|
||||
AuthenticationType,
|
||||
HttpMethod,
|
||||
httpClient,
|
||||
} from '@activepieces/pieces-common';
|
||||
import { zendeskAuth } from '../..';
|
||||
|
||||
const WEBHOOK_TRIGGER_KEY = 'zendesk_tag_added_webhook';
|
||||
|
||||
type AuthProps = {
|
||||
email: string;
|
||||
token: string;
|
||||
subdomain: string;
|
||||
};
|
||||
|
||||
interface ZendeskTicket {
|
||||
id: number;
|
||||
subject: string;
|
||||
description: string;
|
||||
status: string;
|
||||
priority: string;
|
||||
organization_id?: number;
|
||||
requester_id: number;
|
||||
assignee_id?: number;
|
||||
created_at: string;
|
||||
updated_at: string;
|
||||
tags: string[];
|
||||
}
|
||||
|
||||
export const tagAddedToTicket = createTrigger({
|
||||
name: 'tag_added_to_ticket',
|
||||
displayName: 'Tag Added to Ticket',
|
||||
description: 'Fires when a ticket update includes the specified tag. Requires a Zendesk Trigger with Notify active webhook.',
|
||||
auth: zendeskAuth,
|
||||
props: {
|
||||
specific_tag: Property.ShortText({
|
||||
displayName: 'Specific Tag (Optional)',
|
||||
description: 'Only trigger when this specific tag is added. Leave empty to trigger for any tag addition.',
|
||||
required: false,
|
||||
}),
|
||||
},
|
||||
type: TriggerStrategy.WEBHOOK,
|
||||
sampleData: {
|
||||
url: 'https://example.zendesk.com/api/v2/tickets/5.json',
|
||||
id: 5,
|
||||
external_id: null,
|
||||
via: {
|
||||
channel: 'web',
|
||||
source: {
|
||||
from: {},
|
||||
to: {},
|
||||
rel: null,
|
||||
},
|
||||
},
|
||||
created_at: '2023-03-25T02:39:41Z',
|
||||
updated_at: '2023-03-25T02:39:41Z',
|
||||
type: null,
|
||||
subject: 'Ticket with new tag',
|
||||
raw_subject: 'Ticket with new tag',
|
||||
description: 'Description',
|
||||
priority: null,
|
||||
status: 'open',
|
||||
recipient: null,
|
||||
requester_id: 8193592318236,
|
||||
submitter_id: 8193592318236,
|
||||
assignee_id: 8193592318236,
|
||||
organization_id: 8193599387420,
|
||||
group_id: 8193569448092,
|
||||
collaborator_ids: [],
|
||||
follower_ids: [],
|
||||
email_cc_ids: [],
|
||||
forum_topic_id: null,
|
||||
problem_id: null,
|
||||
has_incidents: false,
|
||||
is_public: true,
|
||||
due_at: null,
|
||||
tags: ['urgent', 'priority'],
|
||||
custom_fields: [],
|
||||
satisfaction_rating: null,
|
||||
sharing_agreement_ids: [],
|
||||
custom_status_id: 8193592472348,
|
||||
fields: [],
|
||||
followup_ids: [],
|
||||
ticket_form_id: 8193569410076,
|
||||
brand_id: 8193583542300,
|
||||
allow_channelback: false,
|
||||
allow_attachments: true,
|
||||
from_messaging_channel: false,
|
||||
audit: {
|
||||
id: 12345,
|
||||
ticket_id: 5,
|
||||
created_at: '2023-03-25T02:39:41Z',
|
||||
author_id: 8193592318236,
|
||||
events: [
|
||||
{
|
||||
id: 67890,
|
||||
type: 'Change',
|
||||
field_name: 'tags',
|
||||
previous_value: ['urgent'],
|
||||
value: ['urgent', 'priority'],
|
||||
},
|
||||
],
|
||||
},
|
||||
},
|
||||
async onEnable(context) {
|
||||
const authentication = context.auth;
|
||||
|
||||
try {
|
||||
const response = await httpClient.sendRequest<{
|
||||
webhook: { id: string };
|
||||
}>({
|
||||
url: `https://${authentication.props.subdomain}.zendesk.com/api/v2/webhooks`,
|
||||
method: HttpMethod.POST,
|
||||
headers: {
|
||||
'Content-Type': 'application/json',
|
||||
},
|
||||
authentication: {
|
||||
type: AuthenticationType.BASIC,
|
||||
username: authentication.props.email + '/token',
|
||||
password: authentication.props.token,
|
||||
},
|
||||
body: {
|
||||
webhook: {
|
||||
name: `Activepieces Tag Added Webhook - ${Date.now()}`,
|
||||
endpoint: context.webhookUrl,
|
||||
http_method: 'POST',
|
||||
request_format: 'json',
|
||||
status: 'active',
|
||||
subscriptions: ['conditional_ticket_events'],
|
||||
},
|
||||
},
|
||||
});
|
||||
|
||||
await context.store.put<string>(WEBHOOK_TRIGGER_KEY, response.body.webhook.id);
|
||||
} catch (error) {
|
||||
throw new Error(`Failed to register webhook: ${(error as Error).message}`);
|
||||
}
|
||||
},
|
||||
|
||||
async onDisable(context) {
|
||||
const authentication = context.auth;
|
||||
const webhookId = await context.store.get<string>(WEBHOOK_TRIGGER_KEY);
|
||||
|
||||
if (webhookId) {
|
||||
try {
|
||||
await httpClient.sendRequest({
|
||||
url: `https://${authentication.props.subdomain}.zendesk.com/api/v2/webhooks/${webhookId}`,
|
||||
method: HttpMethod.DELETE,
|
||||
authentication: {
|
||||
type: AuthenticationType.BASIC,
|
||||
username: authentication.props.email + '/token',
|
||||
password: authentication.props.token,
|
||||
},
|
||||
});
|
||||
} catch (error) {
|
||||
console.warn(`Warning: Failed to delete webhook ${webhookId}:`, (error as Error).message);
|
||||
} finally {
|
||||
await context.store.delete(WEBHOOK_TRIGGER_KEY);
|
||||
}
|
||||
}
|
||||
},
|
||||
|
||||
async run(context) {
|
||||
const payload = context.payload.body as { ticket?: ZendeskTicket };
|
||||
if (!payload.ticket) {
|
||||
return [];
|
||||
}
|
||||
|
||||
const specificTag = context.propsValue.specific_tag as string | undefined;
|
||||
const tags = payload.ticket.tags || [];
|
||||
|
||||
if (specificTag) {
|
||||
if (!tags.includes(specificTag)) {
|
||||
return [];
|
||||
}
|
||||
} else if (!Array.isArray(tags) || tags.length === 0) {
|
||||
return [];
|
||||
}
|
||||
|
||||
return [payload.ticket];
|
||||
},
|
||||
});
|
||||
@@ -0,0 +1,229 @@
|
||||
import {
|
||||
createTrigger,
|
||||
Property,
|
||||
TriggerStrategy,
|
||||
} from '@activepieces/pieces-framework';
|
||||
import {
|
||||
AuthenticationType,
|
||||
HttpMethod,
|
||||
httpClient,
|
||||
} from '@activepieces/pieces-common';
|
||||
import { zendeskAuth } from '../..';
|
||||
|
||||
const WEBHOOK_TRIGGER_KEY = 'zendesk_updated_ticket_webhook';
|
||||
|
||||
type AuthProps = {
|
||||
email: string;
|
||||
token: string;
|
||||
subdomain: string;
|
||||
};
|
||||
|
||||
interface ZendeskOrganization {
|
||||
id: number;
|
||||
name: string;
|
||||
}
|
||||
|
||||
interface ZendeskTicket {
|
||||
id: number;
|
||||
subject: string;
|
||||
description: string;
|
||||
status: string;
|
||||
priority: string;
|
||||
organization_id?: number;
|
||||
requester_id: number;
|
||||
assignee_id?: number;
|
||||
created_at: string;
|
||||
updated_at: string;
|
||||
}
|
||||
|
||||
export const updatedTicket = createTrigger({
|
||||
name: 'updated_ticket',
|
||||
displayName: 'Updated Ticket',
|
||||
description: 'Fires when an existing ticket is updated. Requires a Zendesk Trigger with Notify active webhook.',
|
||||
auth: zendeskAuth,
|
||||
props: {
|
||||
organization_id: Property.Dropdown({
|
||||
auth: zendeskAuth,
|
||||
displayName: 'Organization (Optional)',
|
||||
description: 'Filter tickets by organization. Leave empty to trigger for all organizations.',
|
||||
refreshers: [],
|
||||
required: false,
|
||||
options: async ({ auth }) => {
|
||||
const authentication = auth;
|
||||
if (!authentication
|
||||
) {
|
||||
return {
|
||||
placeholder: 'Fill your authentication first',
|
||||
disabled: true,
|
||||
options: [],
|
||||
};
|
||||
}
|
||||
try {
|
||||
const response = await httpClient.sendRequest<{ organizations: ZendeskOrganization[] }>({
|
||||
url: `https://${authentication.props.subdomain}.zendesk.com/api/v2/organizations.json`,
|
||||
method: HttpMethod.GET,
|
||||
authentication: {
|
||||
type: AuthenticationType.BASIC,
|
||||
username: authentication.props.email + '/token',
|
||||
password: authentication.props.token,
|
||||
},
|
||||
});
|
||||
return {
|
||||
placeholder: 'Select an organization (optional)',
|
||||
options: [
|
||||
{ label: 'All Organizations', value: 'all' },
|
||||
...response.body.organizations.map((org: ZendeskOrganization) => ({
|
||||
label: org.name,
|
||||
value: org.id.toString(),
|
||||
})),
|
||||
],
|
||||
};
|
||||
} catch (error) {
|
||||
return {
|
||||
placeholder: 'Error loading organizations',
|
||||
disabled: true,
|
||||
options: [],
|
||||
};
|
||||
}
|
||||
},
|
||||
}),
|
||||
},
|
||||
type: TriggerStrategy.WEBHOOK,
|
||||
sampleData: {
|
||||
url: 'https://example.zendesk.com/api/v2/tickets/5.json',
|
||||
id: 5,
|
||||
external_id: null,
|
||||
via: {
|
||||
channel: 'web',
|
||||
source: {
|
||||
from: {},
|
||||
to: {},
|
||||
rel: null,
|
||||
},
|
||||
},
|
||||
created_at: '2023-03-25T02:39:41Z',
|
||||
updated_at: '2023-03-25T02:39:41Z',
|
||||
type: null,
|
||||
subject: 'Updated Subject',
|
||||
raw_subject: 'Updated Raw Subject',
|
||||
description: 'Updated Description',
|
||||
priority: 'high',
|
||||
status: 'pending',
|
||||
recipient: null,
|
||||
requester_id: 8193592318236,
|
||||
submitter_id: 8193592318236,
|
||||
assignee_id: 8193592318236,
|
||||
organization_id: 8193599387420,
|
||||
group_id: 8193569448092,
|
||||
collaborator_ids: [],
|
||||
follower_ids: [],
|
||||
email_cc_ids: [],
|
||||
forum_topic_id: null,
|
||||
problem_id: null,
|
||||
has_incidents: false,
|
||||
is_public: true,
|
||||
due_at: null,
|
||||
tags: ['updated'],
|
||||
custom_fields: [],
|
||||
satisfaction_rating: null,
|
||||
sharing_agreement_ids: [],
|
||||
custom_status_id: 8193592472348,
|
||||
fields: [],
|
||||
followup_ids: [],
|
||||
ticket_form_id: 8193569410076,
|
||||
brand_id: 8193583542300,
|
||||
allow_channelback: false,
|
||||
allow_attachments: true,
|
||||
from_messaging_channel: false,
|
||||
audit: {
|
||||
id: 12345,
|
||||
ticket_id: 5,
|
||||
created_at: '2023-03-25T02:39:41Z',
|
||||
author_id: 8193592318236,
|
||||
events: [
|
||||
{
|
||||
id: 67890,
|
||||
type: 'Change',
|
||||
field_name: 'status',
|
||||
previous_value: 'open',
|
||||
value: 'pending',
|
||||
},
|
||||
],
|
||||
},
|
||||
},
|
||||
async onEnable(context) {
|
||||
const authentication = context.auth;
|
||||
|
||||
try {
|
||||
const response = await httpClient.sendRequest<{
|
||||
webhook: { id: string };
|
||||
}>({
|
||||
url: `https://${authentication.props.subdomain}.zendesk.com/api/v2/webhooks`,
|
||||
method: HttpMethod.POST,
|
||||
headers: {
|
||||
'Content-Type': 'application/json',
|
||||
},
|
||||
authentication: {
|
||||
type: AuthenticationType.BASIC,
|
||||
username: authentication.props.email + '/token',
|
||||
password: authentication.props.token,
|
||||
},
|
||||
body: {
|
||||
webhook: {
|
||||
name: `Activepieces Updated Ticket Webhook - ${Date.now()}`,
|
||||
endpoint: context.webhookUrl,
|
||||
http_method: 'POST',
|
||||
request_format: 'json',
|
||||
status: 'active',
|
||||
subscriptions: ['conditional_ticket_events'],
|
||||
},
|
||||
},
|
||||
});
|
||||
|
||||
await context.store.put<string>(WEBHOOK_TRIGGER_KEY, response.body.webhook.id);
|
||||
} catch (error) {
|
||||
throw new Error(`Failed to register webhook: ${(error as Error).message}`);
|
||||
}
|
||||
},
|
||||
|
||||
async onDisable(context) {
|
||||
const authentication = context.auth;
|
||||
const webhookId = await context.store.get<string>(WEBHOOK_TRIGGER_KEY);
|
||||
|
||||
if (webhookId) {
|
||||
try {
|
||||
await httpClient.sendRequest({
|
||||
url: `https://${authentication.props.subdomain}.zendesk.com/api/v2/webhooks/${webhookId}`,
|
||||
method: HttpMethod.DELETE,
|
||||
authentication: {
|
||||
type: AuthenticationType.BASIC,
|
||||
username: authentication.props.email + '/token',
|
||||
password: authentication.props.token,
|
||||
},
|
||||
});
|
||||
} catch (error) {
|
||||
console.warn(`Warning: Failed to delete webhook ${webhookId}:`, (error as Error).message);
|
||||
} finally {
|
||||
await context.store.delete(WEBHOOK_TRIGGER_KEY);
|
||||
}
|
||||
}
|
||||
},
|
||||
|
||||
async run(context) {
|
||||
const payload = context.payload.body as { ticket?: ZendeskTicket };
|
||||
if (!payload.ticket) {
|
||||
return [];
|
||||
}
|
||||
|
||||
const ticket = payload.ticket;
|
||||
|
||||
const organizationId = context.propsValue.organization_id;
|
||||
if (organizationId && organizationId !== 'all') {
|
||||
if (!ticket.organization_id || ticket.organization_id.toString() !== organizationId) {
|
||||
return [];
|
||||
}
|
||||
}
|
||||
|
||||
return [ticket];
|
||||
},
|
||||
});
|
||||
@@ -0,0 +1,16 @@
|
||||
{
|
||||
"extends": "../../../../tsconfig.base.json",
|
||||
"files": [],
|
||||
"include": [],
|
||||
"references": [
|
||||
{
|
||||
"path": "./tsconfig.lib.json"
|
||||
}
|
||||
],
|
||||
"compilerOptions": {
|
||||
"forceConsistentCasingInFileNames": true,
|
||||
"strict": true,
|
||||
"noImplicitReturns": true,
|
||||
"noFallthroughCasesInSwitch": true
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,11 @@
|
||||
{
|
||||
"extends": "./tsconfig.json",
|
||||
"compilerOptions": {
|
||||
"module": "commonjs",
|
||||
"outDir": "../../../../dist/out-tsc",
|
||||
"declaration": true,
|
||||
"types": ["node"]
|
||||
},
|
||||
"exclude": ["jest.config.ts", "src/**/*.spec.ts", "src/**/*.test.ts"],
|
||||
"include": ["src/**/*.ts"]
|
||||
}
|
||||
Reference in New Issue
Block a user