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,125 @@
|
||||
{
|
||||
"\n1. Sign in to [Microsoft Azure Portal](https://portal.azure.com/).\n2. From the left sidebar, go to **Microsoft Enfra ID**.\n3. Under **Manage**, click on **App registrations**.\n4. Click the **New registration** button.\n5. Enter a **Name** for your app.\n6. For **Supported account types**, choose:\n - **Accounts in any organizational directory (Any Microsoft Entra ID tenant - Multitenant) and personal Microsoft accounts**\n - Or select based on your requirement.\n7. In **Redirect URI**, select **Web** and ad": "\n1. Melden Sie sich bei [Microsoft Azure Portal](https://portal.azure.com/).\n. Von der linken Seitenleiste gehen Sie zur **Microsoft Enfra ID**.\n3. Unter **Verwalten** klicken Sie auf **App-Registrierungen**.\n4. Klicken Sie auf die **Neue Registrierung** Schaltfläche.\n5. Geben Sie einen **Name** für Ihre App ein.\n6. Für **unterstützte Kontotypen**, auswählen:\n - **Konten in jedem Organisationsverzeichnis (jeder Microsoft-Entra-ID-Mieter - Multitenant) und persönlichen Microsoft-Konten**\n - Oder wählen Sie nach Ihren Anforderungen aus.\n7. In **Weiterleitungs-URI** wählen Sie **Web** und fügen Sie die angegebene URL hinzu.\n8. Klicken Sie **Registrieren**.\n9. Nach der Registrierung werden Sie zur Übersichtsseite der App weitergeleitet. Kopieren Sie die **Application (Client) ID**.\n10. Vom linken Menü gehen Sie zu **Zertifikate & Geheimnisse**.\n - Unter **Kundengeheimnis**, klicke **Neues Kundengeheimnis**.\n - Geben Sie eine Beschreibung an, setzen Sie ein Ablaufdatum und klicken Sie auf **Hinzufügen**.\n - Kopieren Sie den **Wert** des Client-Geheimnisses (dies wird nicht wieder angezeigt).\n11. Gehe zu **API-Berechtigungen** vom linken Menü.\n - Klicke **Berechtigung hinzufügen**.\n - Wähle **Microsoft Graph**.\n - Fügen Sie folgende **delegierte Berechtigungen**:\n - Sites.Read hinzu. ll\n - Sites.ReadWrite.Alle \n - Sites. anage.All\n - Files.ReadWrite. ll\n - openid\n - E-Mail\n - Profil\n - offline_access\n - Klicken Sie auf **Berechtigungen hinzufügen**.\n12. Kopieren Sie Ihre **Client-ID** und **Client-Geheimnis**.\n",
|
||||
"Create Folder": "Ordner erstellen",
|
||||
"Create List": "Liste erstellen",
|
||||
"Create List Item": "Listenelement erstellen",
|
||||
"Update List Item": "Listenelement aktualisieren",
|
||||
"Delete List Item": "Listenelement löschen",
|
||||
"Find List Item": "Listenelement finden",
|
||||
"Upload File": "Datei hochladen",
|
||||
"Publish Page": "Seite veröffentlichen",
|
||||
"Copy File or Folder (Across Sites)": "Datei oder Ordner kopieren (Alle Seiten)",
|
||||
"Copy File or Folder (Within Site)": "Datei oder Ordner kopieren (innerhalb der Site)",
|
||||
"Move File": "Datei verschieben",
|
||||
"Find File": "Datei suchen",
|
||||
"Get Folder Contents": "Ordnerinhalte abrufen",
|
||||
"Get Site Information": "Website-Informationen abrufen",
|
||||
"Custom API Call": "Eigener API-Aufruf",
|
||||
"Creates a new folder at path you specify.": "Erstellt einen neuen Ordner am Pfad, den Sie angeben.",
|
||||
"Creates a new list.": "Erstellt eine neue Liste.",
|
||||
"Creates a new item in a list.": "Erstellt ein neues Element in einer Liste.",
|
||||
"Updates an existing item in a list.": "Aktualisiert ein vorhandenes Element in der Liste.",
|
||||
"Deletes an existing item from a list.": "Löscht ein vorhandenes Element aus der Liste.",
|
||||
"Finds a item in a list based on name.": "Findet ein Element in einer Liste basierend auf Namen.",
|
||||
"Uploads a new file at path you specify.": "Lädt eine neue Datei im angegebenen Pfad hoch.",
|
||||
"Publishes a SharePoint page, making it available to all users. If the page is checked out, it will be automatically checked in. Note: Pages with active approval flows will not publish until approval is complete.": "Veröffentlicht eine SharePoint-Seite, die allen Benutzern zur Verfügung steht. Wenn die Seite ausgecheckt ist, wird sie automatisch eingecheckt. Hinweis: Pages with active approval flows will not publish until approval is complete.",
|
||||
"Copy a file or folder from one site to another within the same tenant, with overwrite option.": "Kopieren Sie eine Datei oder einen Ordner von einer Site auf eine andere innerhalb derselben Instanz mit der Option Überschreiben.",
|
||||
"Copy a file or folder to another folder within the same site.": "Kopieren Sie eine Datei oder einen Ordner in einen anderen Ordner auf der gleichen Seite.",
|
||||
"Move a file from one folder to another within the same drive.": "Verschieben Sie eine Datei von einem Ordner in einen anderen auf dem selben Laufwerk.",
|
||||
"Look up a file by its name or path.": "Suchen Sie eine Datei mit ihrem Namen oder Pfad.",
|
||||
"List all files and subfolders in a specified folder, optionally with detailed metadata.": "Alle Dateien und Unterordner in einem angegebenen Ordner auflisten, optional mit detaillierten Metadaten.",
|
||||
"Fetch metadata of a SharePoint site (site ID, title, URL, description, etc.).": "Abrufen von Metadaten einer SharePoint-Website (Site-ID, Titel, URL, Beschreibung, etc.).",
|
||||
"Make a custom API call to a specific endpoint": "Einen benutzerdefinierten API-Aufruf an einen bestimmten Endpunkt machen",
|
||||
"Site": "Site",
|
||||
"Drive": "Laufwerk",
|
||||
"Parent Folder": "Eltern-Ordner",
|
||||
"Folder Name": "Ordnername",
|
||||
"List Name": "Listenname",
|
||||
"List Description": "Listenbeschreibung",
|
||||
"List": "Liste",
|
||||
"List Columns": "Spalten anzeigen",
|
||||
"List Item": "Listenelement",
|
||||
"Title": "Titel",
|
||||
"File": "Datei",
|
||||
"File Name": "Dateiname",
|
||||
"Page": "Seite",
|
||||
"Source File or Folder": "Quelldatei oder Ordner",
|
||||
"Destination Drive": "Ziellaufwerk",
|
||||
"Destination Folder": "Zielordner",
|
||||
"New Name (Optional)": "Neuer Name (optional)",
|
||||
"Conflict Behavior": "Konfliktverhalten",
|
||||
"File to Move": "Datei verschieben",
|
||||
"Find Method": "Suchmethode",
|
||||
"File Path": "Dateipfad",
|
||||
"Search Query": "Suchanfrage",
|
||||
"Folder to Search In (Optional)": "Zu suchender Ordner (optional)",
|
||||
"Folder": "Ordner",
|
||||
"Include Custom Metadata": "Benutzerdefinierte Metadaten einbeziehen",
|
||||
"Page Size": "Einträge pro Seite",
|
||||
"Select Fields (Optional)": "Felder auswählen (optional)",
|
||||
"Order By (Optional)": "Bestellung nach (Optional)",
|
||||
"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)",
|
||||
"Parent folder,like \"/demo/\" or \"/docs/assignment/\".Leave it default if you want to create folder at the root (**/**) level.": "Übergeordneter Ordner, wie \"/demo/\" oder \"/docs/assignment/\".Lassen Sie ihn Standardwert, wenn Sie einen Ordner auf der Root-Ebene erstellen wollen (**/**).",
|
||||
"Item title to search": "Artikeltitel zu suchen",
|
||||
"The file or url you want to upload": "Die Datei oder die URL, die Sie hochladen möchten",
|
||||
"Parent folder, like \"/demo/\" or \"/docs/assignment/\".Leave it default if you want to create folder at the root (**CHANGE THIS BACK//**) level.": "Übergeordneter Ordner, wie \"/demo/\" oder \"/docs/assignment/\".Lassen Sie ihn standardmäßig, wenn Sie einen Ordner im Root erstellen wollen (**CHANGE THIS BACK//**).",
|
||||
"The folder to copy the item into. Defaults to the root of the drive.": "Der Ordner, in den das Element kopiert wird. Standardmäßig ist das Stammverzeichnis des Laufwerks.",
|
||||
"A new name for the copied item. If not provided, the original name is used.": "Ein neuer Name für das kopierte Element. Wenn nicht angegeben wird, wird der Originalname verwendet.",
|
||||
"Action to take if a file with the same name already exists.": "Aktion zum Ausführen, wenn eine Datei mit dem gleichen Namen bereits vorhanden ist.",
|
||||
"The folder to copy the item into. Select \"Root\" to copy to the top level of the drive.": "Der Ordner, in den das Element kopiert wird. Wähle \"Root\" um es in die oberste Ebene des Laufwerks zu kopieren.",
|
||||
"Action to take if a file with the same name already exists in the destination.": "Aktion zum Ausführen, wenn eine Datei mit dem gleichen Namen bereits im Ziel vorhanden ist.",
|
||||
"The file you want to move.": "Die Datei, die Sie verschieben möchten.",
|
||||
"The folder to move the file into. Select \"Root\" to move to the top level of the drive.": "Der Ordner, in den die Datei verschoben wird. Wählen Sie \"Root\" um zur obersten Ebene des Laufwerks zu gelangen.",
|
||||
"Provide a new name to rename the file during the move.": "Geben Sie einen neuen Namen an, um die Datei während des Verschiebens umzubenennen.",
|
||||
"Choose how to find the file.": "Wählen Sie aus, wie die Datei gefunden werden soll.",
|
||||
"The exact path to the file from the drive's root. **Required if finding by path.** Example: `Documents/Reports/Q1-Report.docx`": "Der genaue Pfad zur Datei vom Root des Laufwerks. **Wird benötigt, wenn Pfad gefunden wird.** Beispiel: `Documents/Reports/Q1-Report.docx`",
|
||||
"The file name or keyword to search for. **Required if searching by name.** Example: `Q1-Report.docx`": "Der Dateiname oder Schlüsselwort nach dem gesucht werden soll. **Wird benötigt, wenn nach Namen gesucht wird.** Beispiel: `Q1-Report.docx`",
|
||||
"The folder to search within. If not specified, the entire drive will be searched. **Only applies when searching by name.**": "Der zu durchsuchende Ordner. Falls nicht angegeben, wird das gesamte Laufwerk durchsucht. **Wird nur nach Namen gesucht.**",
|
||||
"The folder whose contents you want to list. Select \"Root Folder\" for the top-level folder.": "Der Ordner, dessen Inhalt Sie auflisten möchten. Wählen Sie \"Root Ordner\" für den obersten Ordner.",
|
||||
"Check this to include SharePoint-specific metadata (custom columns). This may slow down the request.": "Aktivieren Sie diese Option, um SharePoint-spezifische Metadaten (benutzerdefinierte Spalten) einzubinden. Dies kann die Anfrage verlangsamen.",
|
||||
"The maximum number of items to return. The API default is 200. If more items exist, the output will contain a field `@odata.nextLink` that you can use in a custom API call to get the next page.": "Die maximale Anzahl an Gegenständen, die zurückgegeben werden sollen. Die API-Standardeinstellung ist 200. Wenn weitere Elemente vorhanden sind, enthält die Ausgabe ein Feld `@odata. extLink`, den du in einem benutzerdefinierten API-Aufruf verwenden kannst, um die nächste Seite zu erhalten.",
|
||||
"A comma-separated list of properties to return. Example: `id,name,size,webUrl`": "Eine kommaseparierte Liste von Eigenschaften, die zurückgegeben werden sollen. Beispiel: `id,name,size,webUrl`",
|
||||
"Specifies how to sort the returned items. Example: `name asc` or `lastModifiedDateTime desc`": "Gibt an, wie die zurückgegebenen Elemente sortiert werden sollen. Beispiel: `name asc` oder `lastModifiedDateTime desc`",
|
||||
"A comma-separated list of properties to return. If left blank, all default properties are returned. Example: `id,displayName,webUrl,description`": "Eine kommaseparierte Liste von Eigenschaften, die zurückgegeben werden sollen. Wenn leer gelassen, werden alle Standardeinstellungen zurückgegeben. Beispiel: `id,displayName,webUrl,description`",
|
||||
"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..",
|
||||
"Fail on conflict": "Fehler im Konflikt",
|
||||
"Overwrite existing file": "Bestehende Datei überschreiben",
|
||||
"Rename with a number": "Mit einer Zahl umbenennen",
|
||||
"Find by Exact Path": "Suche nach exaktem Pfad",
|
||||
"Search by Name": "Suche nach Name",
|
||||
"GET": "ERHALTEN",
|
||||
"POST": "POST",
|
||||
"PATCH": "PATCH",
|
||||
"PUT": "PUT",
|
||||
"DELETE": "LÖSCHEN",
|
||||
"HEAD": "HEAD",
|
||||
"New File in Folder": "Neue Datei im Ordner",
|
||||
"New File in Subfolders": "Neue Datei in Unterordner",
|
||||
"New or Updated File": "Neue oder aktualisierte Datei",
|
||||
"New or Updated Folder": "Neuer oder aktualisierter Ordner",
|
||||
"New List Item": "Neues Listenelement",
|
||||
"Updated List Item": "Aktualisiertes Listenelement",
|
||||
"New List": "Neue Liste",
|
||||
"New or Updated List": "Neue oder aktualisierte Liste",
|
||||
"Fires when a new file is created or added in a specific folder.": "Feuert ab, wenn eine neue Datei erstellt oder in einem bestimmten Ordner hinzugefügt wird.",
|
||||
"Fires when a new file is added anywhere in the first-level subfolders of a folder. Note: This trigger will not monitor subfolders created after the flow is activated.": "Feuert ab, wenn eine neue Datei irgendwo in den Unterordnern eines Ordners auf der ersten Ebene hinzugefügt wird. Hinweis: Dieser Auslöser überwacht keine Unterordner die erstellt wurden, nachdem der Fluss aktiviert ist.",
|
||||
"Fires when a file is created or updated in a given folder.": "Feuert ab, wenn eine Datei in einem bestimmten Ordner erstellt oder aktualisiert wird.",
|
||||
"Fires when a folder is created or updated (e.g., name change).": "Feuer, wenn ein Ordner erstellt oder aktualisiert wird (z. B. Namensänderung).",
|
||||
"Fires when a new item is created in a SharePoint list.": "Feuert ab, wenn ein neues Element in einer SharePoint-Liste erstellt wird.",
|
||||
"Fires when an existing item in a SharePoint list is updated.": "Feuert ab, wenn ein vorhandenes Element in einer SharePoint-Liste aktualisiert wird.",
|
||||
"Fires when a new list is created in a site.": "Feuert ab, wenn eine neue Liste in einer Site erstellt wird.",
|
||||
"Fires when a list is created or updated in a site.": "Feuert ab, wenn eine Liste erstellt oder aktualisiert wird.",
|
||||
"Folder to Monitor": "Zu überwachender Ordner",
|
||||
"Parent Folder to Monitor": "Übergeordneter Ordner zum Überwachen",
|
||||
"The folder to watch for new files. Select \"Root Folder\" for the top-level folder of the drive.": "Der Ordner für neue Dateien. Wählen Sie \"Root Ordner\" für den obersten Ordner des Laufwerks.",
|
||||
"The parent folder whose subfolders you want to monitor.": "Der übergeordnete Ordner, dessen Unterordner Sie überwachen möchten.",
|
||||
"The folder to watch for new or updated files. Select \"Root Folder\" for the top-level folder of the drive.": "Der zu beobachtende Ordner für neue oder aktualisierte Dateien. Wählen Sie \"Root Ordner\" für den obersten Ordner des Laufwerks.",
|
||||
"The folder to watch for new or updated subfolders. Select \"Root Folder\" to monitor the top-level of the drive.": "Der Ordner, der auf neue oder aktualisierte Unterordner zugreifen soll. Wählen Sie \"Root Ordner\", um die obere Ebene des Laufwerks zu überwachen."
|
||||
}
|
||||
@@ -0,0 +1,125 @@
|
||||
{
|
||||
"\n1. Sign in to [Microsoft Azure Portal](https://portal.azure.com/).\n2. From the left sidebar, go to **Microsoft Enfra ID**.\n3. Under **Manage**, click on **App registrations**.\n4. Click the **New registration** button.\n5. Enter a **Name** for your app.\n6. For **Supported account types**, choose:\n - **Accounts in any organizational directory (Any Microsoft Entra ID tenant - Multitenant) and personal Microsoft accounts**\n - Or select based on your requirement.\n7. In **Redirect URI**, select **Web** and ad": "\n1. Sign in to [Microsoft Azure Portal](https://portal.azure.com/).\n2. From the left sidebar, go to **Microsoft Enfra ID**.\n3. Under **Manage**, click on **App registrations**.\n4. Click the **New registration** button.\n5. Enter a **Name** for your app.\n6. For **Supported account types**, choose:\n - **Accounts in any organizational directory (Any Microsoft Entra ID tenant - Multitenant) and personal Microsoft accounts**\n - Or select based on your requirement.\n7. In **Redirect URI**, select **Web** and add the given URL.\n8. Click **Register**.\n9. After registration, you’ll be redirected to the app’s overview page. Copy the **Application (client) ID**.\n10. From the left menu, go to **Certificates & secrets**.\n - Under **Client secrets**, click **New client secret**.\n - Provide a description, set an expiry, and click **Add**.\n - Copy the **Value** of the client secret (this will not be shown again).\n11. Go to **API permissions** from the left menu.\n - Click **Add a permission**.\n - Select **Microsoft Graph**.\n - Add the following **Delegated permissions**:\n - Sites.Read.All\n - Sites.ReadWrite.All\n - Sites.Manage.All\n - Files.ReadWrite.All\n - openid\n - email\n - profile\n - offline_access\n - Click **Add permissions**.\n12. Copy your **Client ID** and **Client Secret**.\n",
|
||||
"Create Folder": "Crear carpeta",
|
||||
"Create List": "Crear Lista",
|
||||
"Create List Item": "Crear elemento de lista",
|
||||
"Update List Item": "Actualizar elemento de lista",
|
||||
"Delete List Item": "Eliminar elemento de lista",
|
||||
"Find List Item": "Buscar elemento de lista",
|
||||
"Upload File": "Subir archivo",
|
||||
"Publish Page": "Publicar página",
|
||||
"Copy File or Folder (Across Sites)": "Copiar archivo o carpeta (a través de sitios)",
|
||||
"Copy File or Folder (Within Site)": "Copiar archivo o carpeta (dentro del sitio)",
|
||||
"Move File": "Mover archivo",
|
||||
"Find File": "Buscar archivo",
|
||||
"Get Folder Contents": "Obtener contenido de carpeta",
|
||||
"Get Site Information": "Obtener información del sitio",
|
||||
"Custom API Call": "Llamada API personalizada",
|
||||
"Creates a new folder at path you specify.": "Crea una nueva carpeta en la ruta que especificas.",
|
||||
"Creates a new list.": "Crea una lista nueva.",
|
||||
"Creates a new item in a list.": "Crea un nuevo elemento en una lista.",
|
||||
"Updates an existing item in a list.": "Actualiza un elemento existente en una lista.",
|
||||
"Deletes an existing item from a list.": "Elimina un elemento existente de una lista.",
|
||||
"Finds a item in a list based on name.": "Encuentra un elemento en una lista basado en el nombre.",
|
||||
"Uploads a new file at path you specify.": "Sube un nuevo archivo en la ruta que especificas.",
|
||||
"Publishes a SharePoint page, making it available to all users. If the page is checked out, it will be automatically checked in. Note: Pages with active approval flows will not publish until approval is complete.": "Publica una página de SharePoint, poniéndola a disposición de todos los usuarios. Si la página está retirada, se registrará automáticamente. Nota: Las páginas con flujos de aprobación activos no se publicarán hasta que se complete la aprobación.",
|
||||
"Copy a file or folder from one site to another within the same tenant, with overwrite option.": "Copie un archivo o carpeta de un sitio a otro dentro del mismo arrendatario, con opción de sobrescribir.",
|
||||
"Copy a file or folder to another folder within the same site.": "Copiar un archivo o carpeta a otra carpeta dentro del mismo sitio.",
|
||||
"Move a file from one folder to another within the same drive.": "Mover un archivo de una carpeta a otra dentro de la misma unidad.",
|
||||
"Look up a file by its name or path.": "Buscar un archivo por su nombre o ruta.",
|
||||
"List all files and subfolders in a specified folder, optionally with detailed metadata.": "Listar todos los archivos y subcarpetas en una carpeta especificada, opcionalmente con metadatos detallados.",
|
||||
"Fetch metadata of a SharePoint site (site ID, title, URL, description, etc.).": "Obtener metadatos de un sitio SharePoint (ID del sitio, título, URL, descripción, etc.).",
|
||||
"Make a custom API call to a specific endpoint": "Hacer una llamada API personalizada a un extremo específico",
|
||||
"Site": "Sitio",
|
||||
"Drive": "Unidad",
|
||||
"Parent Folder": "Carpeta padre",
|
||||
"Folder Name": "Nombre de carpeta",
|
||||
"List Name": "Nombre de lista",
|
||||
"List Description": "Descripción de la lista",
|
||||
"List": "Lista",
|
||||
"List Columns": "Lista de columnas",
|
||||
"List Item": "Ítem de lista",
|
||||
"Title": "Título",
|
||||
"File": "Archivo",
|
||||
"File Name": "Nombre del archivo",
|
||||
"Page": "Pgina",
|
||||
"Source File or Folder": "Archivo o carpeta de origen",
|
||||
"Destination Drive": "Unidad de destino",
|
||||
"Destination Folder": "Carpeta de destino",
|
||||
"New Name (Optional)": "Nuevo nombre (opcional)",
|
||||
"Conflict Behavior": "Comportamiento del conflicto",
|
||||
"File to Move": "Archivo a mover",
|
||||
"Find Method": "Método de búsqueda",
|
||||
"File Path": "Ruta del archivo",
|
||||
"Search Query": "Buscar consulta",
|
||||
"Folder to Search In (Optional)": "Carpeta a buscar en (opcional)",
|
||||
"Folder": "Carpeta",
|
||||
"Include Custom Metadata": "Incluye metadatos personalizados",
|
||||
"Page Size": "Tamaño de página",
|
||||
"Select Fields (Optional)": "Seleccionar campos (opcional)",
|
||||
"Order By (Optional)": "Ordenar por (opcional)",
|
||||
"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)",
|
||||
"Parent folder,like \"/demo/\" or \"/docs/assignment/\".Leave it default if you want to create folder at the root (**/**) level.": "Carpeta padre, como \"/demo/\" o \"/docs/assignment/\".Déjalo por defecto si quieres crear una carpeta en el nivel raíz (**/**).",
|
||||
"Item title to search": "Título del artículo a buscar",
|
||||
"The file or url you want to upload": "El archivo o url que quieres subir",
|
||||
"Parent folder, like \"/demo/\" or \"/docs/assignment/\".Leave it default if you want to create folder at the root (**CHANGE THIS BACK//**) level.": "Carpeta padre, como \"/demo/\" o \"/docs/assignment/\".Déjalo por defecto si quieres crear una carpeta en la raíz (**CHANGE ESTA BACK/**) nivel.",
|
||||
"The folder to copy the item into. Defaults to the root of the drive.": "La carpeta en la que copiar el elemento. Por defecto es la raíz de la unidad.",
|
||||
"A new name for the copied item. If not provided, the original name is used.": "Un nuevo nombre para el elemento copiado. Si no se proporciona, se utiliza el nombre original.",
|
||||
"Action to take if a file with the same name already exists.": "Acción a tomar si ya existe un archivo con el mismo nombre.",
|
||||
"The folder to copy the item into. Select \"Root\" to copy to the top level of the drive.": "La carpeta en la que copiar el elemento. Seleccione \"Raíz\" para copiar al nivel superior de la unidad.",
|
||||
"Action to take if a file with the same name already exists in the destination.": "Acción a tomar si un archivo con el mismo nombre ya existe en el destino.",
|
||||
"The file you want to move.": "El archivo que desea mover.",
|
||||
"The folder to move the file into. Select \"Root\" to move to the top level of the drive.": "La carpeta a la que mover el archivo. Seleccione \"Raíz\" para moverse al nivel superior de la unidad.",
|
||||
"Provide a new name to rename the file during the move.": "Proporcione un nuevo nombre para renombrar el archivo durante el movimiento.",
|
||||
"Choose how to find the file.": "Elija cómo encontrar el archivo.",
|
||||
"The exact path to the file from the drive's root. **Required if finding by path.** Example: `Documents/Reports/Q1-Report.docx`": "La ruta exacta al archivo de la raíz de la unidad. **Requerido si se encuentra por ruta.** Ejemplo: `Documents/Reports/Q1-Report.docx`",
|
||||
"The file name or keyword to search for. **Required if searching by name.** Example: `Q1-Report.docx`": "El nombre del archivo o palabra clave a buscar. **Requerido si se busca por nombre.** Ejemplo: `Q1-Report.docx`",
|
||||
"The folder to search within. If not specified, the entire drive will be searched. **Only applies when searching by name.**": "La carpeta en la que buscar dentro. Si no se especifica, toda la unidad se buscará. **Sólo se aplica al buscar por nombre.**",
|
||||
"The folder whose contents you want to list. Select \"Root Folder\" for the top-level folder.": "La carpeta cuyo contenido desea enumerar. Seleccione \"Carpeta de root\" para la carpeta de nivel superior.",
|
||||
"Check this to include SharePoint-specific metadata (custom columns). This may slow down the request.": "Marque esto para incluir metadatos específicos de SharePoint (columnas personalizadas). Esto puede ralentizar la solicitud.",
|
||||
"The maximum number of items to return. The API default is 200. If more items exist, the output will contain a field `@odata.nextLink` that you can use in a custom API call to get the next page.": "El número máximo de elementos a retornar. El valor predeterminado de la API es 200. Si existen más elementos, la salida contendrá un campo `@odata. extLink` que puedes usar en una llamada API personalizada para obtener la siguiente página.",
|
||||
"A comma-separated list of properties to return. Example: `id,name,size,webUrl`": "Una lista separada por comas de propiedades a regresar. Ejemplo: `id,name,size,webUrl`",
|
||||
"Specifies how to sort the returned items. Example: `name asc` or `lastModifiedDateTime desc`": "Especifica cómo ordenar los elementos devueltos. Ejemplo: `name asc` o `lastModifiedDateTime desc`",
|
||||
"A comma-separated list of properties to return. If left blank, all default properties are returned. Example: `id,displayName,webUrl,description`": "Una lista separada por comas de propiedades a regresar. Si se deja en blanco, todas las propiedades por defecto son devueltas. Ejemplo: `id,displayName,webUrl,description`",
|
||||
"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.",
|
||||
"Fail on conflict": "Fallo en conflicto",
|
||||
"Overwrite existing file": "Sobrescribir archivo existente",
|
||||
"Rename with a number": "Renombrar con un número",
|
||||
"Find by Exact Path": "Buscar por ruta exacta",
|
||||
"Search by Name": "Buscar por nombre",
|
||||
"GET": "RECOGER",
|
||||
"POST": "POST",
|
||||
"PATCH": "PATCH",
|
||||
"PUT": "PUT",
|
||||
"DELETE": "BORRAR",
|
||||
"HEAD": "LIMPIO",
|
||||
"New File in Folder": "Nuevo archivo en carpeta",
|
||||
"New File in Subfolders": "Nuevo archivo en subcarpetas",
|
||||
"New or Updated File": "Archivo nuevo o actualizado",
|
||||
"New or Updated Folder": "Carpeta nueva o actualizada",
|
||||
"New List Item": "Nuevo elemento de lista",
|
||||
"Updated List Item": "Elemento de lista actualizado",
|
||||
"New List": "Nueva lista",
|
||||
"New or Updated List": "Lista nueva o actualizada",
|
||||
"Fires when a new file is created or added in a specific folder.": "Se activa cuando un nuevo archivo es creado o añadido en una carpeta específica.",
|
||||
"Fires when a new file is added anywhere in the first-level subfolders of a folder. Note: This trigger will not monitor subfolders created after the flow is activated.": "Se activa cuando se añade un nuevo archivo en cualquier lugar de las subcarpetas de primer nivel de una carpeta. Nota: Este disparador no supervisará las subcarpetas creadas después de que el flujo esté activado.",
|
||||
"Fires when a file is created or updated in a given folder.": "Se activa cuando un archivo es creado o actualizado en una carpeta determinada.",
|
||||
"Fires when a folder is created or updated (e.g., name change).": "Se activa cuando se crea o actualiza una carpeta (por ejemplo, cambiar de nombre).",
|
||||
"Fires when a new item is created in a SharePoint list.": "Dispara cuando se crea un nuevo elemento en una lista de SharePoint.",
|
||||
"Fires when an existing item in a SharePoint list is updated.": "Dispara cuando se actualiza un elemento existente en una lista de SharePoint.",
|
||||
"Fires when a new list is created in a site.": "Dispara cuando se crea una nueva lista en un sitio.",
|
||||
"Fires when a list is created or updated in a site.": "Dispara cuando una lista es creada o actualizada en un sitio.",
|
||||
"Folder to Monitor": "Carpeta para el seguidor",
|
||||
"Parent Folder to Monitor": "Carpeta padre para el seguimiento",
|
||||
"The folder to watch for new files. Select \"Root Folder\" for the top-level folder of the drive.": "La carpeta para ver los nuevos archivos. Seleccione \"Carpeta de root\" para la carpeta de nivel superior de la unidad.",
|
||||
"The parent folder whose subfolders you want to monitor.": "La carpeta padre cuyas subcarpetas desea monitor.",
|
||||
"The folder to watch for new or updated files. Select \"Root Folder\" for the top-level folder of the drive.": "La carpeta a ver para archivos nuevos o actualizados. Seleccione \"Carpeta de root\" para la carpeta de nivel superior de la unidad.",
|
||||
"The folder to watch for new or updated subfolders. Select \"Root Folder\" to monitor the top-level of the drive.": "La carpeta a ver para subcarpetas nuevas o actualizadas. Seleccione \"Carpeta raíz\" para supervisar el nivel superior de la unidad."
|
||||
}
|
||||
@@ -0,0 +1,125 @@
|
||||
{
|
||||
"\n1. Sign in to [Microsoft Azure Portal](https://portal.azure.com/).\n2. From the left sidebar, go to **Microsoft Enfra ID**.\n3. Under **Manage**, click on **App registrations**.\n4. Click the **New registration** button.\n5. Enter a **Name** for your app.\n6. For **Supported account types**, choose:\n - **Accounts in any organizational directory (Any Microsoft Entra ID tenant - Multitenant) and personal Microsoft accounts**\n - Or select based on your requirement.\n7. In **Redirect URI**, select **Web** and ad": "\n1. Sign in to [Microsoft Azure Portal](https://portal.azure.com/).\n2. From the left sidebar, go to **Microsoft Enfra ID**.\n3. Under **Manage**, click on **App registrations**.\n4. Click the **New registration** button.\n5. Enter a **Name** for your app.\n6. For **Supported account types**, choose:\n - **Accounts in any organizational directory (Any Microsoft Entra ID tenant - Multitenant) and personal Microsoft accounts**\n - Or select based on your requirement.\n7. In **Redirect URI**, select **Web** and add the given URL.\n8. Click **Register**.\n9. After registration, you’ll be redirected to the app’s overview page. Copy the **Application (client) ID**.\n10. From the left menu, go to **Certificates & secrets**.\n - Under **Client secrets**, click **New client secret**.\n - Provide a description, set an expiry, and click **Add**.\n - Copy the **Value** of the client secret (this will not be shown again).\n11. Go to **API permissions** from the left menu.\n - Click **Add a permission**.\n - Select **Microsoft Graph**.\n - Add the following **Delegated permissions**:\n - Sites.Read.All\n - Sites.ReadWrite.All\n - Sites.Manage.All\n - Files.ReadWrite.All\n - openid\n - email\n - profile\n - offline_access\n - Click **Add permissions**.\n12. Copy your **Client ID** and **Client Secret**.\n",
|
||||
"Create Folder": "Créer un dossier",
|
||||
"Create List": "Créer une liste",
|
||||
"Create List Item": "Créer un élément de liste",
|
||||
"Update List Item": "Mettre à jour l'élément de la liste",
|
||||
"Delete List Item": "Supprimer l'élément de la liste",
|
||||
"Find List Item": "Rechercher un élément de la liste",
|
||||
"Upload File": "Charger un fichier",
|
||||
"Publish Page": "Publier la page",
|
||||
"Copy File or Folder (Across Sites)": "Copier un fichier ou un dossier (traverser des espaces)",
|
||||
"Copy File or Folder (Within Site)": "Copier un fichier ou un dossier (au sein du site)",
|
||||
"Move File": "Déplacer le fichier",
|
||||
"Find File": "Rechercher un fichier",
|
||||
"Get Folder Contents": "Récupérer le contenu du dossier",
|
||||
"Get Site Information": "Obtenir les informations du site",
|
||||
"Custom API Call": "Appel API personnalisé",
|
||||
"Creates a new folder at path you specify.": "Crée un nouveau dossier au chemin que vous spécifiez.",
|
||||
"Creates a new list.": "Crée une nouvelle liste.",
|
||||
"Creates a new item in a list.": "Crée un nouvel élément dans une liste.",
|
||||
"Updates an existing item in a list.": "Met à jour un élément existant dans une liste.",
|
||||
"Deletes an existing item from a list.": "Supprime un élément existant d'une liste.",
|
||||
"Finds a item in a list based on name.": "Trouve un élément dans une liste basée sur son nom.",
|
||||
"Uploads a new file at path you specify.": "Téléverse un nouveau fichier au chemin que vous spécifiez.",
|
||||
"Publishes a SharePoint page, making it available to all users. If the page is checked out, it will be automatically checked in. Note: Pages with active approval flows will not publish until approval is complete.": "Publie une page SharePoint, la rendant disponible à tous les utilisateurs. Si la page est extraite, elle sera automatiquement enregistrée. Remarque : Les pages avec des flux d’approbation actifs ne seront pas publiées tant que l’approbation n’est pas terminée.",
|
||||
"Copy a file or folder from one site to another within the same tenant, with overwrite option.": "Copiez un fichier ou un dossier d'un site à un autre dans le même locataire, avec l'option d'écrasement.",
|
||||
"Copy a file or folder to another folder within the same site.": "Copiez un fichier ou un dossier dans un autre dossier du même site.",
|
||||
"Move a file from one folder to another within the same drive.": "Déplacer un fichier d'un dossier vers un autre dans le même lecteur.",
|
||||
"Look up a file by its name or path.": "Rechercher un fichier par son nom ou son chemin.",
|
||||
"List all files and subfolders in a specified folder, optionally with detailed metadata.": "Lister tous les fichiers et sous-dossiers dans un dossier spécifié, éventuellement avec des métadonnées détaillées.",
|
||||
"Fetch metadata of a SharePoint site (site ID, title, URL, description, etc.).": "Récupérer les métadonnées d'un site SharePoint (ID du site, titre, URL, description, etc.).",
|
||||
"Make a custom API call to a specific endpoint": "Passez un appel API personnalisé à un point de terminaison spécifique",
|
||||
"Site": "Site",
|
||||
"Drive": "Lecteur",
|
||||
"Parent Folder": "Dossier parent",
|
||||
"Folder Name": "Folder Name",
|
||||
"List Name": "Nom de la liste",
|
||||
"List Description": "Description de la liste",
|
||||
"List": "Liste",
|
||||
"List Columns": "Liste des colonnes",
|
||||
"List Item": "Élément de la liste",
|
||||
"Title": "Titre de la page",
|
||||
"File": "Ficher",
|
||||
"File Name": "Nom du fichier",
|
||||
"Page": "Page",
|
||||
"Source File or Folder": "Fichier ou dossier source",
|
||||
"Destination Drive": "Disque de destination",
|
||||
"Destination Folder": "Dossier de destination",
|
||||
"New Name (Optional)": "Nouveau nom (facultatif)",
|
||||
"Conflict Behavior": "Comportement de conflit",
|
||||
"File to Move": "Fichier à déplacer",
|
||||
"Find Method": "Méthode de recherche",
|
||||
"File Path": "Chemin du fichier",
|
||||
"Search Query": "Requête de recherche",
|
||||
"Folder to Search In (Optional)": "Dossier à rechercher (facultatif)",
|
||||
"Folder": "Dossier",
|
||||
"Include Custom Metadata": "Inclure les métadonnées personnalisées",
|
||||
"Page Size": "Nombre d'élément",
|
||||
"Select Fields (Optional)": "Sélectionner les champs (facultatif)",
|
||||
"Order By (Optional)": "Commander par (facultatif)",
|
||||
"Method": "Méthode",
|
||||
"Headers": "En-têtes",
|
||||
"Query Parameters": "Paramètres de requête",
|
||||
"Body": "Corps",
|
||||
"Response is Binary ?": "La réponse est Binaire ?",
|
||||
"No Error on Failure": "Aucune erreur en cas d'échec",
|
||||
"Timeout (in seconds)": "Délai d'attente (en secondes)",
|
||||
"Parent folder,like \"/demo/\" or \"/docs/assignment/\".Leave it default if you want to create folder at the root (**/**) level.": "Dossier parent, comme \"/demo/\" ou \"/docs/assignment/\".Laissez le dossier par défaut si vous voulez créer un dossier à la racine (**/**).",
|
||||
"Item title to search": "Titre de l'élément à rechercher",
|
||||
"The file or url you want to upload": "Le fichier ou l'url que vous voulez télécharger",
|
||||
"Parent folder, like \"/demo/\" or \"/docs/assignment/\".Leave it default if you want to create folder at the root (**CHANGE THIS BACK//**) level.": "Répertoire parent, comme \"/demo/\" ou \"/docs/assignment/\".Laissez le dossier par défaut si vous voulez créer un dossier à la racine (**CHANGER CE BACK//**).",
|
||||
"The folder to copy the item into. Defaults to the root of the drive.": "Le dossier dans lequel copier l'élément. Par défaut, la racine du lecteur.",
|
||||
"A new name for the copied item. If not provided, the original name is used.": "Un nouveau nom pour l'élément copié. Si non fourni, le nom original est utilisé.",
|
||||
"Action to take if a file with the same name already exists.": "Action à prendre si un fichier avec le même nom existe déjà.",
|
||||
"The folder to copy the item into. Select \"Root\" to copy to the top level of the drive.": "Le dossier dans lequel copier l'élément. Sélectionnez \"Racine\" à copier au niveau supérieur du lecteur.",
|
||||
"Action to take if a file with the same name already exists in the destination.": "Action à prendre si un fichier portant le même nom existe déjà dans la destination.",
|
||||
"The file you want to move.": "Le fichier que vous voulez déplacer.",
|
||||
"The folder to move the file into. Select \"Root\" to move to the top level of the drive.": "Le dossier dans lequel déplacer le fichier. Sélectionnez \"Racine\" pour passer au niveau supérieur du lecteur.",
|
||||
"Provide a new name to rename the file during the move.": "Fournissez un nouveau nom pour renommer le fichier pendant le déplacement.",
|
||||
"Choose how to find the file.": "Choisissez comment trouver le fichier.",
|
||||
"The exact path to the file from the drive's root. **Required if finding by path.** Example: `Documents/Reports/Q1-Report.docx`": "Le chemin exact vers le fichier depuis la racine du lecteur. **Requis si trouvé par le chemin.** Exemple: `Documents/Reports/Q1-Report.docx`",
|
||||
"The file name or keyword to search for. **Required if searching by name.** Example: `Q1-Report.docx`": "Le nom du fichier ou mot clé à rechercher. **Requis si recherche par nom.** Exemple: `Q1-Report.docx`",
|
||||
"The folder to search within. If not specified, the entire drive will be searched. **Only applies when searching by name.**": "Le dossier à rechercher à l'intérieur. S'il n'est pas spécifié, le lecteur entier sera recherché. **Ne s'applique que lorsque la recherche par nom.**",
|
||||
"The folder whose contents you want to list. Select \"Root Folder\" for the top-level folder.": "Le dossier dont le contenu est à afficher. Sélectionnez \"Racine du dossier\" pour le dossier de premier niveau.",
|
||||
"Check this to include SharePoint-specific metadata (custom columns). This may slow down the request.": "Cochez cette case pour inclure les métadonnées spécifiques à SharePoint (colonnes personnalisées). Cela peut ralentir la requête.",
|
||||
"The maximum number of items to return. The API default is 200. If more items exist, the output will contain a field `@odata.nextLink` that you can use in a custom API call to get the next page.": "Le nombre maximum d'éléments à renvoyer. La valeur par défaut de l'API est de 200. Si plus d'éléments existent, la sortie contiendra un champ `@odata. extLink` que vous pouvez utiliser dans un appel d'API personnalisé pour obtenir la page suivante.",
|
||||
"A comma-separated list of properties to return. Example: `id,name,size,webUrl`": "Une liste de propriétés séparées par des virgules. Exemple: `id,name,size,webUrl`",
|
||||
"Specifies how to sort the returned items. Example: `name asc` or `lastModifiedDateTime desc`": "Spécifie comment trier les éléments retournés. Exemple: `name asc` ou `lastModifiedDateTime desc`",
|
||||
"A comma-separated list of properties to return. If left blank, all default properties are returned. Example: `id,displayName,webUrl,description`": "Une liste de propriétés à retourner séparées par des virgules. Si laissé vide, toutes les propriétés par défaut sont retournées. Exemple: `id,displayName,webUrl,description`",
|
||||
"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.",
|
||||
"Fail on conflict": "Échec du conflit",
|
||||
"Overwrite existing file": "Écraser le fichier existant",
|
||||
"Rename with a number": "Renommer avec un nombre",
|
||||
"Find by Exact Path": "Trouver par chemin exact",
|
||||
"Search by Name": "Rechercher par nom",
|
||||
"GET": "OBTENIR",
|
||||
"POST": "POSTER",
|
||||
"PATCH": "PATCH",
|
||||
"PUT": "EFFACER",
|
||||
"DELETE": "SUPPRIMER",
|
||||
"HEAD": "HEAD",
|
||||
"New File in Folder": "Nouveau fichier dans le dossier",
|
||||
"New File in Subfolders": "Nouveau fichier dans les sous-dossiers",
|
||||
"New or Updated File": "Fichier nouveau ou mis à jour",
|
||||
"New or Updated Folder": "Nouveau ou mis à jour le dossier",
|
||||
"New List Item": "Nouvel élément de la liste",
|
||||
"Updated List Item": "Élément de liste mis à jour",
|
||||
"New List": "Nouvelle liste",
|
||||
"New or Updated List": "Liste nouvelle ou mise à jour",
|
||||
"Fires when a new file is created or added in a specific folder.": "Se déclenche lorsqu'un nouveau fichier est créé ou ajouté dans un dossier spécifique.",
|
||||
"Fires when a new file is added anywhere in the first-level subfolders of a folder. Note: This trigger will not monitor subfolders created after the flow is activated.": "Se déclenche lorsqu'un nouveau fichier est ajouté n'importe où dans les sous-dossiers de premier niveau d'un dossier. Note: Ce déclencheur ne surveillera pas les sous-dossiers créés après l'activation du flux.",
|
||||
"Fires when a file is created or updated in a given folder.": "Se déclenche lorsqu'un fichier est créé ou mis à jour dans un dossier donné.",
|
||||
"Fires when a folder is created or updated (e.g., name change).": "Déclenche lorsqu'un dossier est créé ou mis à jour (ex. : changement de nom).",
|
||||
"Fires when a new item is created in a SharePoint list.": "Se déclenche lorsqu'un nouvel élément est créé dans une liste SharePoint.",
|
||||
"Fires when an existing item in a SharePoint list is updated.": "Déclenche lorsqu'un élément existant dans une liste SharePoint est mis à jour.",
|
||||
"Fires when a new list is created in a site.": "Se déclenche lorsqu'une nouvelle liste est créée dans un espace.",
|
||||
"Fires when a list is created or updated in a site.": "Se déclenche lorsqu'une liste est créée ou mise à jour dans un site.",
|
||||
"Folder to Monitor": "Dossier à surveiller",
|
||||
"Parent Folder to Monitor": "Dossier parent à surveiller",
|
||||
"The folder to watch for new files. Select \"Root Folder\" for the top-level folder of the drive.": "Le dossier à surveiller pour les nouveaux fichiers. Sélectionnez \"Racine du dossier\" pour le dossier supérieur du lecteur.",
|
||||
"The parent folder whose subfolders you want to monitor.": "Le dossier parent dont vous voulez surveiller les sous-dossiers.",
|
||||
"The folder to watch for new or updated files. Select \"Root Folder\" for the top-level folder of the drive.": "Le dossier à surveiller pour les fichiers nouveaux ou mis à jour. Sélectionnez \"Racine\" pour le dossier supérieur du lecteur.",
|
||||
"The folder to watch for new or updated subfolders. Select \"Root Folder\" to monitor the top-level of the drive.": "Le dossier à surveiller pour les sous-dossiers nouveaux ou mis à jour. Sélectionnez \"Dossier racine\" pour surveiller le niveau supérieur du lecteur."
|
||||
}
|
||||
@@ -0,0 +1,125 @@
|
||||
{
|
||||
"\n1. Sign in to [Microsoft Azure Portal](https://portal.azure.com/).\n2. From the left sidebar, go to **Microsoft Enfra ID**.\n3. Under **Manage**, click on **App registrations**.\n4. Click the **New registration** button.\n5. Enter a **Name** for your app.\n6. For **Supported account types**, choose:\n - **Accounts in any organizational directory (Any Microsoft Entra ID tenant - Multitenant) and personal Microsoft accounts**\n - Or select based on your requirement.\n7. In **Redirect URI**, select **Web** and ad": "\n1. Sign in to [Microsoft Azure Portal](https://portal.azure.com/).\n2. From the left sidebar, go to **Microsoft Enfra ID**.\n3. Under **Manage**, click on **App registrations**.\n4. Click the **New registration** button.\n5. Enter a **Name** for your app.\n6. For **Supported account types**, choose:\n - **Accounts in any organizational directory (Any Microsoft Entra ID tenant - Multitenant) and personal Microsoft accounts**\n - Or select based on your requirement.\n7. In **Redirect URI**, select **Web** and add the given URL.\n8. Click **Register**.\n9. After registration, you’ll be redirected to the app’s overview page. Copy the **Application (client) ID**.\n10. From the left menu, go to **Certificates & secrets**.\n - Under **Client secrets**, click **New client secret**.\n - Provide a description, set an expiry, and click **Add**.\n - Copy the **Value** of the client secret (this will not be shown again).\n11. Go to **API permissions** from the left menu.\n - Click **Add a permission**.\n - Select **Microsoft Graph**.\n - Add the following **Delegated permissions**:\n - Sites.Read.All\n - Sites.ReadWrite.All\n - Sites.Manage.All\n - Files.ReadWrite.All\n - openid\n - email\n - profile\n - offline_access\n - Click **Add permissions**.\n12. Copy your **Client ID** and **Client Secret**.\n",
|
||||
"Create Folder": "フォルダを作成",
|
||||
"Create List": "リストを作成",
|
||||
"Create List Item": "リストアイテムを作成",
|
||||
"Update List Item": "リスト項目を更新",
|
||||
"Delete List Item": "リスト項目を削除",
|
||||
"Find List Item": "検索リスト アイテム",
|
||||
"Upload File": "ファイルをアップロード",
|
||||
"Publish Page": "ページを公開",
|
||||
"Copy File or Folder (Across Sites)": "ファイルまたはフォルダ(サイト間で)をコピー",
|
||||
"Copy File or Folder (Within Site)": "ファイルまたはフォルダ(サイト内) をコピー",
|
||||
"Move File": "ファイルを移動",
|
||||
"Find File": "ファイルを検索",
|
||||
"Get Folder Contents": "フォルダの内容を取得する",
|
||||
"Get Site Information": "サイト情報を取得する",
|
||||
"Custom API Call": "カスタムAPI通話",
|
||||
"Creates a new folder at path you specify.": "指定したパスに新しいフォルダを作成します。",
|
||||
"Creates a new list.": "新しいリストを作成します。",
|
||||
"Creates a new item in a list.": "リスト内に新しいアイテムを作成します。",
|
||||
"Updates an existing item in a list.": "リスト内の既存の項目を更新します。",
|
||||
"Deletes an existing item from a list.": "リストから既存の項目を削除します。",
|
||||
"Finds a item in a list based on name.": "名前に基づいてリスト内の項目を検索します。",
|
||||
"Uploads a new file at path you specify.": "指定したパスに新しいファイルをアップロードします。",
|
||||
"Publishes a SharePoint page, making it available to all users. If the page is checked out, it will be automatically checked in. Note: Pages with active approval flows will not publish until approval is complete.": "SharePointページを公開し、すべてのユーザーが利用できるようにします。ページがチェックアウトされている場合は、自動的にチェックインされます。 注意: 承認が完了するまで、アクティブな承認フローを持つページは公開されません。",
|
||||
"Copy a file or folder from one site to another within the same tenant, with overwrite option.": "上書きオプションを使用して、同じテナント内のあるサイトから別のサイトにファイルまたはフォルダをコピーします。",
|
||||
"Copy a file or folder to another folder within the same site.": "同じサイト内の別のフォルダにファイルまたはフォルダをコピーします。",
|
||||
"Move a file from one folder to another within the same drive.": "同じドライブ内のフォルダから別のフォルダにファイルを移動します。",
|
||||
"Look up a file by its name or path.": "名前またはパスでファイルを検索します。",
|
||||
"List all files and subfolders in a specified folder, optionally with detailed metadata.": "必要に応じて、指定したフォルダ内のすべてのファイルとサブフォルダを詳細なメタデータで一覧表示します。",
|
||||
"Fetch metadata of a SharePoint site (site ID, title, URL, description, etc.).": "SharePointサイト(サイトID、タイトル、URL、説明など)のメタデータを取得します。",
|
||||
"Make a custom API call to a specific endpoint": "特定のエンドポイントへのカスタム API コールを実行します。",
|
||||
"Site": "サイト",
|
||||
"Drive": "ドライブ",
|
||||
"Parent Folder": "親フォルダ",
|
||||
"Folder Name": "フォルダ名",
|
||||
"List Name": "リスト名",
|
||||
"List Description": "リストの説明",
|
||||
"List": "リスト",
|
||||
"List Columns": "列の一覧",
|
||||
"List Item": "リストアイテム",
|
||||
"Title": "タイトル",
|
||||
"File": "ファイル",
|
||||
"File Name": "ファイル名",
|
||||
"Page": "ページ",
|
||||
"Source File or Folder": "ソースファイルまたはフォルダ",
|
||||
"Destination Drive": "宛先ドライブ",
|
||||
"Destination Folder": "宛先フォルダ",
|
||||
"New Name (Optional)": "新しい名前(任意)",
|
||||
"Conflict Behavior": "競合の動作",
|
||||
"File to Move": "移動するファイル",
|
||||
"Find Method": "メソッドを検索",
|
||||
"File Path": "ファイルパス",
|
||||
"Search Query": "検索クエリ",
|
||||
"Folder to Search In (Optional)": "検索するフォルダ (オプション)",
|
||||
"Folder": "Folder",
|
||||
"Include Custom Metadata": "カスタムメタデータを含める",
|
||||
"Page Size": "ページサイズ",
|
||||
"Select Fields (Optional)": "項目の選択(オプション)",
|
||||
"Order By (Optional)": "注文順 (オプション)",
|
||||
"Method": "方法",
|
||||
"Headers": "ヘッダー",
|
||||
"Query Parameters": "クエリパラメータ",
|
||||
"Body": "本文",
|
||||
"Response is Binary ?": "応答はバイナリですか?",
|
||||
"No Error on Failure": "失敗時にエラーはありません",
|
||||
"Timeout (in seconds)": "タイムアウト(秒)",
|
||||
"Parent folder,like \"/demo/\" or \"/docs/assignment/\".Leave it default if you want to create folder at the root (**/**) level.": "親フォルダは、「/demo/」または「/docs/assignment/」のように、ルート(**/**)レベルにフォルダを作成する場合は、デフォルトのままにしておいてください。",
|
||||
"Item title to search": "検索するアイテムタイトル",
|
||||
"The file or url you want to upload": "アップロードしたいファイルまたはURL",
|
||||
"Parent folder, like \"/demo/\" or \"/docs/assignment/\".Leave it default if you want to create folder at the root (**CHANGE THIS BACK//**) level.": "親フォルダ(「/demo/」または「/docs/assignment/」)。ルートにフォルダを作成したい場合はデフォルトのままにしておきます(**この背景を変更//**)。",
|
||||
"The folder to copy the item into. Defaults to the root of the drive.": "アイテムをコピーするフォルダ。デフォルトはドライブのルートです。",
|
||||
"A new name for the copied item. If not provided, the original name is used.": "コピーされたアイテムの新しい名前。指定されていない場合は、元の名前が使用されます。",
|
||||
"Action to take if a file with the same name already exists.": "同じ名前のファイルがすでに存在する場合に処理します。",
|
||||
"The folder to copy the item into. Select \"Root\" to copy to the top level of the drive.": "アイテムをコピーするフォルダ。「ルート」を選択すると、ドライブのトップレベルにコピーします。",
|
||||
"Action to take if a file with the same name already exists in the destination.": "同じ名前のファイルが既に宛先に存在する場合に取るアクション。",
|
||||
"The file you want to move.": "移動したいファイル。",
|
||||
"The folder to move the file into. Select \"Root\" to move to the top level of the drive.": "ファイルを移動するフォルダ。「ルート」を選択すると、ドライブのトップレベルに移動します。",
|
||||
"Provide a new name to rename the file during the move.": "移動中にファイルの名前を変更する新しい名前を指定します。",
|
||||
"Choose how to find the file.": "ファイルの検索方法を選択します。",
|
||||
"The exact path to the file from the drive's root. **Required if finding by path.** Example: `Documents/Reports/Q1-Report.docx`": "ドライブのルートからファイルへの正確なパス。**パスで見つける場合は必要です。** 例: `Documents/Reports/Q1-Report.docx`",
|
||||
"The file name or keyword to search for. **Required if searching by name.** Example: `Q1-Report.docx`": "検索するファイル名またはキーワード。**名前で検索する場合は必須** 例: `Q1-Report.docx`",
|
||||
"The folder to search within. If not specified, the entire drive will be searched. **Only applies when searching by name.**": "内で検索するフォルダ。指定しない場合、ドライブ全体が検索されます。**名前で検索する場合にのみ適用されます。**",
|
||||
"The folder whose contents you want to list. Select \"Root Folder\" for the top-level folder.": "一覧表示するフォルダ。最上位フォルダの場合は「ルートフォルダ」を選択します。",
|
||||
"Check this to include SharePoint-specific metadata (custom columns). This may slow down the request.": "これにSharePoint固有のメタデータ (カスタム列) を含める場合チェックします。これはリクエストを遅くする可能性があります。",
|
||||
"The maximum number of items to return. The API default is 200. If more items exist, the output will contain a field `@odata.nextLink` that you can use in a custom API call to get the next page.": "The maximum number of items to return. The API default is 200. If more items exists, the output will contain a field `@odata. カスタムAPI呼び出しで次のページを取得するために使用できるextLink。",
|
||||
"A comma-separated list of properties to return. Example: `id,name,size,webUrl`": "返すプロパティのカンマ区切りのリスト。例: `id,name,size,webUrl`",
|
||||
"Specifies how to sort the returned items. Example: `name asc` or `lastModifiedDateTime desc`": "返されるアイテムの並べ替え方法を指定します。例: `name asc` または `lastModifiedDateTime desc`",
|
||||
"A comma-separated list of properties to return. If left blank, all default properties are returned. Example: `id,displayName,webUrl,description`": "返すプロパティのカンマ区切りのリスト。空白の場合は、すべてのデフォルトのプロパティが返されます。例: `id,displayName,webUrl,description`",
|
||||
"Authorization headers are injected automatically from your connection.": "認証ヘッダは接続から自動的に注入されます。",
|
||||
"Enable for files like PDFs, images, etc..": "PDF、画像などのファイルを有効にします。",
|
||||
"Fail on conflict": "競合に失敗しました",
|
||||
"Overwrite existing file": "既存のファイルを上書き",
|
||||
"Rename with a number": "数字で名前を変更",
|
||||
"Find by Exact Path": "正確なパスで検索",
|
||||
"Search by Name": "名前で検索",
|
||||
"GET": "取得",
|
||||
"POST": "POST",
|
||||
"PATCH": "PATCH",
|
||||
"PUT": "PUT",
|
||||
"DELETE": "削除",
|
||||
"HEAD": "頭",
|
||||
"New File in Folder": "フォルダ内の新規ファイル",
|
||||
"New File in Subfolders": "サブフォルダ内の新規ファイル",
|
||||
"New or Updated File": "新規または更新されたファイル",
|
||||
"New or Updated Folder": "新規または更新されたフォルダ",
|
||||
"New List Item": "新しいリストアイテム",
|
||||
"Updated List Item": "リストアイテムを更新しました",
|
||||
"New List": "新規リスト",
|
||||
"New or Updated List": "新規または更新されたリスト",
|
||||
"Fires when a new file is created or added in a specific folder.": "新しいファイルが特定のフォルダに作成または追加されたときに発行されます。",
|
||||
"Fires when a new file is added anywhere in the first-level subfolders of a folder. Note: This trigger will not monitor subfolders created after the flow is activated.": "フォルダの最初のレベルのサブフォルダのどこかに新しいファイルが追加されたときに発生します。 注:このトリガーはフローが有効になった後に作成されたサブフォルダーを監視しません。",
|
||||
"Fires when a file is created or updated in a given folder.": "指定したフォルダにファイルが作成または更新されたときに発行されます。",
|
||||
"Fires when a folder is created or updated (e.g., name change).": "フォルダが作成または更新されたときに発生します(名前の変更など)。",
|
||||
"Fires when a new item is created in a SharePoint list.": "SharePoint リストに新しい項目が作成されたときに発生します。",
|
||||
"Fires when an existing item in a SharePoint list is updated.": "SharePoint リストの既存のアイテムが更新されたときに発生します。",
|
||||
"Fires when a new list is created in a site.": "サイトに新しいリストが作成されたときに発行されます。",
|
||||
"Fires when a list is created or updated in a site.": "サイト内でリストが作成または更新されたときに発行されます。",
|
||||
"Folder to Monitor": "モニターするフォルダ",
|
||||
"Parent Folder to Monitor": "モニターする親フォルダ",
|
||||
"The folder to watch for new files. Select \"Root Folder\" for the top-level folder of the drive.": "新しいファイルを監視するフォルダ。ドライブの最上位フォルダには「ルートフォルダ」を選択します。",
|
||||
"The parent folder whose subfolders you want to monitor.": "サブフォルダを監視する親フォルダ。",
|
||||
"The folder to watch for new or updated files. Select \"Root Folder\" for the top-level folder of the drive.": "新規または更新されたファイルを監視するフォルダ。ドライブの最上位フォルダに「ルートフォルダ」を選択します。",
|
||||
"The folder to watch for new or updated subfolders. Select \"Root Folder\" to monitor the top-level of the drive.": "新規または更新されたサブフォルダを監視するフォルダ。ドライブのトップレベルを監視するには、「ルートフォルダ」を選択します。"
|
||||
}
|
||||
@@ -0,0 +1,125 @@
|
||||
{
|
||||
"\n1. Sign in to [Microsoft Azure Portal](https://portal.azure.com/).\n2. From the left sidebar, go to **Microsoft Enfra ID**.\n3. Under **Manage**, click on **App registrations**.\n4. Click the **New registration** button.\n5. Enter a **Name** for your app.\n6. For **Supported account types**, choose:\n - **Accounts in any organizational directory (Any Microsoft Entra ID tenant - Multitenant) and personal Microsoft accounts**\n - Or select based on your requirement.\n7. In **Redirect URI**, select **Web** and ad": "\n1. Sign in to [Microsoft Azure Portal](https://portal.azure.com/).\n2. From the left sidebar, go to **Microsoft Enfra ID**.\n3. Under **Manage**, click on **App registrations**.\n4. Click the **New registration** button.\n5. Enter a **Name** for your app.\n6. For **Supported account types**, choose:\n - **Accounts in any organizational directory (Any Microsoft Entra ID tenant - Multitenant) and personal Microsoft accounts**\n - Or select based on your requirement.\n7. In **Redirect URI**, select **Web** and add the given URL.\n8. Click **Register**.\n9. After registration, you’ll be redirected to the app’s overview page. Copy the **Application (client) ID**.\n10. From the left menu, go to **Certificates & secrets**.\n - Under **Client secrets**, click **New client secret**.\n - Provide a description, set an expiry, and click **Add**.\n - Copy the **Value** of the client secret (this will not be shown again).\n11. Go to **API permissions** from the left menu.\n - Click **Add a permission**.\n - Select **Microsoft Graph**.\n - Add the following **Delegated permissions**:\n - Sites.Read.All\n - Sites.ReadWrite.All\n - Sites.Manage.All\n - Files.ReadWrite.All\n - openid\n - email\n - profile\n - offline_access\n - Click **Add permissions**.\n12. Copy your **Client ID** and **Client Secret**.\n",
|
||||
"Create Folder": "Map aanmaken",
|
||||
"Create List": "Lijst aanmaken",
|
||||
"Create List Item": "Lijstitem aanmaken",
|
||||
"Update List Item": "Lijstitem bijwerken",
|
||||
"Delete List Item": "Verwijder lijstitem",
|
||||
"Find List Item": "Zoek Lijst Item",
|
||||
"Upload File": "Bestand uploaden",
|
||||
"Publish Page": "Pagina publiceren",
|
||||
"Copy File or Folder (Across Sites)": "Bestand of map kopiëren (over de sites)",
|
||||
"Copy File or Folder (Within Site)": "Bestand of map kopiëren (Binnen Site)",
|
||||
"Move File": "Bestand verplaatsen",
|
||||
"Find File": "Bestand zoeken",
|
||||
"Get Folder Contents": "Haal mapinhoud op",
|
||||
"Get Site Information": "Site informatie verkrijgen",
|
||||
"Custom API Call": "Custom API Call",
|
||||
"Creates a new folder at path you specify.": "Maakt een nieuwe map aan op het pad dat u opgeeft.",
|
||||
"Creates a new list.": "Maakt een nieuwe lijst aan.",
|
||||
"Creates a new item in a list.": "Maakt een nieuw onderdeel aan in een lijst.",
|
||||
"Updates an existing item in a list.": "Werkt een bestaand item in een lijst bij.",
|
||||
"Deletes an existing item from a list.": "Verwijdert een bestaand item van een lijst.",
|
||||
"Finds a item in a list based on name.": "Vindt een item in een lijst gebaseerd op naam.",
|
||||
"Uploads a new file at path you specify.": "Hiermee uploadt u een nieuw bestand op het pad dat u opgeeft.",
|
||||
"Publishes a SharePoint page, making it available to all users. If the page is checked out, it will be automatically checked in. Note: Pages with active approval flows will not publish until approval is complete.": "Publiceert een SharePoint pagina en maakt deze beschikbaar voor alle gebruikers. Als de pagina is uitgecheckt, wordt deze automatisch ingecheckt. Opmerking: pagina's met actieve goedkeuringsstromen zullen niet worden gepubliceerd totdat de goedkeuring is voltooid.",
|
||||
"Copy a file or folder from one site to another within the same tenant, with overwrite option.": "Kopieer een bestand of map van de ene site naar de andere binnen dezelfde tenant, met de optie overschrijven.",
|
||||
"Copy a file or folder to another folder within the same site.": "Kopieer een bestand of map naar een andere map binnen dezelfde site.",
|
||||
"Move a file from one folder to another within the same drive.": "Verplaats een bestand van de ene map naar de andere binnen dezelfde schijf.",
|
||||
"Look up a file by its name or path.": "Zoek een bestand op de naam of het pad.",
|
||||
"List all files and subfolders in a specified folder, optionally with detailed metadata.": "Alle bestanden en submappen in een opgegeven map weergeven, eventueel met gedetailleerde metadata.",
|
||||
"Fetch metadata of a SharePoint site (site ID, title, URL, description, etc.).": "Metadata van een SharePoint site ophalen (site-ID, titel, URL, beschrijving, enz.).",
|
||||
"Make a custom API call to a specific endpoint": "Maak een aangepaste API call naar een specifiek eindpunt",
|
||||
"Site": "Website",
|
||||
"Drive": "schijf",
|
||||
"Parent Folder": "Bovenliggende map",
|
||||
"Folder Name": "Naam van de map",
|
||||
"List Name": "Lijst Naam",
|
||||
"List Description": "Lijst beschrijving",
|
||||
"List": "Klantenlijst",
|
||||
"List Columns": "Lijst kolommen",
|
||||
"List Item": "Lijst item",
|
||||
"Title": "Aanspreektitel",
|
||||
"File": "Bestand",
|
||||
"File Name": "File Name",
|
||||
"Page": "Pagina",
|
||||
"Source File or Folder": "Bronbestand of map",
|
||||
"Destination Drive": "Bestemming Drive",
|
||||
"Destination Folder": "Doelmap map",
|
||||
"New Name (Optional)": "Nieuwe naam (optioneel)",
|
||||
"Conflict Behavior": "Conflict gedrag",
|
||||
"File to Move": "Bestand om te verplaatsen",
|
||||
"Find Method": "Vind methode",
|
||||
"File Path": "Bestandspad",
|
||||
"Search Query": "Zoek query",
|
||||
"Folder to Search In (Optional)": "Map om in te zoeken (optioneel)",
|
||||
"Folder": "Map",
|
||||
"Include Custom Metadata": "Inclusief aangepaste metadata",
|
||||
"Page Size": "Paginagrootte",
|
||||
"Select Fields (Optional)": "Velden selecteren (optioneel)",
|
||||
"Order By (Optional)": "Sorteer op (optioneel)",
|
||||
"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)",
|
||||
"Parent folder,like \"/demo/\" or \"/docs/assignment/\".Leave it default if you want to create folder at the root (**/**) level.": "Bovenliggende map, zoals \"/demo/\" of \"/docs/assignment/\".leave it default if you want to create folder at root (**/**) level.",
|
||||
"Item title to search": "Item titel om te zoeken",
|
||||
"The file or url you want to upload": "Het bestand of de URL die u wilt uploaden",
|
||||
"Parent folder, like \"/demo/\" or \"/docs/assignment/\".Leave it default if you want to create folder at the root (**CHANGE THIS BACK//**) level.": "Bovenliggende map, zoals \"/demo/\" of \"/docs/assignment/\".leave it default if you want to create folder at root (**CHANGE THIS BACK///**) level.",
|
||||
"The folder to copy the item into. Defaults to the root of the drive.": "De map waarin het item moet worden gekopieerd. Standaard naar de hoofdmap van het schijf.",
|
||||
"A new name for the copied item. If not provided, the original name is used.": "Een nieuwe naam voor het gekopieerde item. Indien niet opgegeven, wordt de oorspronkelijke naam gebruikt.",
|
||||
"Action to take if a file with the same name already exists.": "Er is actie nodig als een bestand met dezelfde naam al bestaat.",
|
||||
"The folder to copy the item into. Select \"Root\" to copy to the top level of the drive.": "De map waarin het item moet worden gekopieerd. Selecteer \"Root\" om naar het bovenste niveau van het station te kopiëren.",
|
||||
"Action to take if a file with the same name already exists in the destination.": "Er moet actie worden ondernomen als een bestand met dezelfde naam al bestaat in de bestemming.",
|
||||
"The file you want to move.": "Het bestand dat u wilt verplaatsen.",
|
||||
"The folder to move the file into. Select \"Root\" to move to the top level of the drive.": "De map waar het bestand naartoe moet worden verplaatst. Selecteer \"Root\" om naar het bovenste niveau van het station te gaan.",
|
||||
"Provide a new name to rename the file during the move.": "Geef een nieuwe naam op om het bestand tijdens het verplaatsen te hernoemen.",
|
||||
"Choose how to find the file.": "Kies hoe het bestand te vinden.",
|
||||
"The exact path to the file from the drive's root. **Required if finding by path.** Example: `Documents/Reports/Q1-Report.docx`": "Het exacte pad naar het bestand van de root van de schijf. **Vereist als het pad gevonden wordt.** Voorbeeld: `Documents/Reports/Q1-Report.docx`",
|
||||
"The file name or keyword to search for. **Required if searching by name.** Example: `Q1-Report.docx`": "De bestandsnaam of trefwoord om naar te zoeken. **Vereist bij zoeken op naam.** Voorbeeld: `Q1-Report.docx`",
|
||||
"The folder to search within. If not specified, the entire drive will be searched. **Only applies when searching by name.**": "De map waar gezocht moet worden. Indien niet opgegeven, wordt de volledige schijf doorzocht. **Alleen van toepassing bij het zoeken op naam.**",
|
||||
"The folder whose contents you want to list. Select \"Root Folder\" for the top-level folder.": "De map waarvan de inhoud moet worden weergegeven. Selecteer \"Root Map\" voor de hoofdmap.",
|
||||
"Check this to include SharePoint-specific metadata (custom columns). This may slow down the request.": "Vink dit aan om de metadata van SharePoint-specifieke (aangepaste kolommen) op te nemen. Dit kan het verzoek vertragen.",
|
||||
"The maximum number of items to return. The API default is 200. If more items exist, the output will contain a field `@odata.nextLink` that you can use in a custom API call to get the next page.": "Het maximum aantal weer te geven items. De API standaard is 200. Als meer items bestaan, zal de output een veld `@odata bevatten. extLink` die je in een aangepaste API call kunt gebruiken om de volgende pagina te krijgen.",
|
||||
"A comma-separated list of properties to return. Example: `id,name,size,webUrl`": "Een komma gescheiden lijst van eigenschappen om terug te sturen. Voorbeeld: 'id,naam,size,webUrl'",
|
||||
"Specifies how to sort the returned items. Example: `name asc` or `lastModifiedDateTime desc`": "Hiermee geeft u aan hoe de geretourneerde items gesorteerd moeten worden. Voorbeeld: `naam opgaande ` of `lastModifiedDateTime desc`",
|
||||
"A comma-separated list of properties to return. If left blank, all default properties are returned. Example: `id,displayName,webUrl,description`": "Een komma gescheiden lijst van eigenschappen om weer te geven. Indien leeg worden alle standaard eigenschappen geretourneerd. Voorbeeld: `id,displayName,webUrl,description`",
|
||||
"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..",
|
||||
"Fail on conflict": "Mislukt bij conflict",
|
||||
"Overwrite existing file": "Bestaande bestand overschrijven",
|
||||
"Rename with a number": "Hernoem met een getal",
|
||||
"Find by Exact Path": "Zoeken op Exact Pad",
|
||||
"Search by Name": "Zoeken op naam",
|
||||
"GET": "KRIJG",
|
||||
"POST": "POSTE",
|
||||
"PATCH": "BEKIJK",
|
||||
"PUT": "PUT",
|
||||
"DELETE": "VERWIJDEREN",
|
||||
"HEAD": "HOOFD",
|
||||
"New File in Folder": "Nieuw bestand in map",
|
||||
"New File in Subfolders": "Nieuw bestand in submappen",
|
||||
"New or Updated File": "Nieuw of bijgewerkt bestand",
|
||||
"New or Updated Folder": "Nieuwe of bijgewerkte map",
|
||||
"New List Item": "Nieuw lijstitem",
|
||||
"Updated List Item": "Bijgewerkt Lijstitem",
|
||||
"New List": "Nieuwe lijst",
|
||||
"New or Updated List": "Nieuwe of bijgewerkte lijst",
|
||||
"Fires when a new file is created or added in a specific folder.": "Vuurt wanneer een nieuw bestand wordt aangemaakt of toegevoegd in een specifieke map.",
|
||||
"Fires when a new file is added anywhere in the first-level subfolders of a folder. Note: This trigger will not monitor subfolders created after the flow is activated.": "Schiet wanneer een nieuw bestand ergens in de submappen op het eerste niveau van een map wordt toegevoegd. Opmerking: Deze trigger zal geen submappen monitoren die gemaakt zijn nadat de flow is geactiveerd.",
|
||||
"Fires when a file is created or updated in a given folder.": "Vuurt wanneer een bestand wordt aangemaakt of bijgewerkt in een bepaalde map.",
|
||||
"Fires when a folder is created or updated (e.g., name change).": "Ontgrendelt wanneer een map wordt gemaakt of bijgewerkt (bijv. naam veranderen).",
|
||||
"Fires when a new item is created in a SharePoint list.": "Vuurt wanneer een nieuw item wordt gemaakt in een SharePoint lijst.",
|
||||
"Fires when an existing item in a SharePoint list is updated.": "Vuurt wanneer een bestaand item in een SharePoint lijst wordt bijgewerkt.",
|
||||
"Fires when a new list is created in a site.": "Vuurt wanneer een nieuwe lijst wordt gemaakt op een site.",
|
||||
"Fires when a list is created or updated in a site.": "Vuurt wanneer een lijst wordt aangemaakt of bijgewerkt in een site.",
|
||||
"Folder to Monitor": "Map om te monitoren",
|
||||
"Parent Folder to Monitor": "Bovenliggende map om te monitoren",
|
||||
"The folder to watch for new files. Select \"Root Folder\" for the top-level folder of the drive.": "De map om nieuwe bestanden te bekijken. Selecteer \"Root Map\" voor de bovenste map van de schijf.",
|
||||
"The parent folder whose subfolders you want to monitor.": "De bovenliggende map waarvan u de submappen wilt monitoren.",
|
||||
"The folder to watch for new or updated files. Select \"Root Folder\" for the top-level folder of the drive.": "De map om nieuwe of bijgewerkte bestanden te bekijken. Selecteer \"Root Map\" voor de hoofdmap van de schijf",
|
||||
"The folder to watch for new or updated subfolders. Select \"Root Folder\" to monitor the top-level of the drive.": "De map om nieuwe of bijgewerkte submappen te bekijken. Selecteer \"Root Map\" om het bovenste niveau van de schijf te controleren."
|
||||
}
|
||||
@@ -0,0 +1,125 @@
|
||||
{
|
||||
"\n1. Sign in to [Microsoft Azure Portal](https://portal.azure.com/).\n2. From the left sidebar, go to **Microsoft Enfra ID**.\n3. Under **Manage**, click on **App registrations**.\n4. Click the **New registration** button.\n5. Enter a **Name** for your app.\n6. For **Supported account types**, choose:\n - **Accounts in any organizational directory (Any Microsoft Entra ID tenant - Multitenant) and personal Microsoft accounts**\n - Or select based on your requirement.\n7. In **Redirect URI**, select **Web** and ad": "\n1. Sign in to [Microsoft Azure Portal](https://portal.azure.com/).\n2. From the left sidebar, go to **Microsoft Enfra ID**.\n3. Under **Manage**, click on **App registrations**.\n4. Click the **New registration** button.\n5. Enter a **Name** for your app.\n6. For **Supported account types**, choose:\n - **Accounts in any organizational directory (Any Microsoft Entra ID tenant - Multitenant) and personal Microsoft accounts**\n - Or select based on your requirement.\n7. In **Redirect URI**, select **Web** and add the given URL.\n8. Click **Register**.\n9. After registration, you’ll be redirected to the app’s overview page. Copy the **Application (client) ID**.\n10. From the left menu, go to **Certificates & secrets**.\n - Under **Client secrets**, click **New client secret**.\n - Provide a description, set an expiry, and click **Add**.\n - Copy the **Value** of the client secret (this will not be shown again).\n11. Go to **API permissions** from the left menu.\n - Click **Add a permission**.\n - Select **Microsoft Graph**.\n - Add the following **Delegated permissions**:\n - Sites.Read.All\n - Sites.ReadWrite.All\n - Sites.Manage.All\n - Files.ReadWrite.All\n - openid\n - email\n - profile\n - offline_access\n - Click **Add permissions**.\n12. Copy your **Client ID** and **Client Secret**.\n",
|
||||
"Create Folder": "Criar pasta",
|
||||
"Create List": "Criar lista",
|
||||
"Create List Item": "Criar Item de Lista",
|
||||
"Update List Item": "Atualizar Item de Lista",
|
||||
"Delete List Item": "Excluir Item de Lista",
|
||||
"Find List Item": "Encontrar Item de Lista",
|
||||
"Upload File": "Enviar Arquivo",
|
||||
"Publish Page": "Publicar Página",
|
||||
"Copy File or Folder (Across Sites)": "Copiar Arquivo ou Pasta (Todos os Sites)",
|
||||
"Copy File or Folder (Within Site)": "Copiar Arquivo ou Pasta (Dentro do Site)",
|
||||
"Move File": "Mover Arquivo",
|
||||
"Find File": "Localizar arquivo",
|
||||
"Get Folder Contents": "Obter conteúdo da pasta",
|
||||
"Get Site Information": "Obter informações do site",
|
||||
"Custom API Call": "Chamada de API personalizada",
|
||||
"Creates a new folder at path you specify.": "Cria uma nova pasta no caminho que você especificar.",
|
||||
"Creates a new list.": "Cria uma nova lista.",
|
||||
"Creates a new item in a list.": "Cria um novo item em uma lista.",
|
||||
"Updates an existing item in a list.": "Atualiza um item existente em uma lista.",
|
||||
"Deletes an existing item from a list.": "Exclui um item existente de uma lista.",
|
||||
"Finds a item in a list based on name.": "Encontra um item em uma lista baseada no nome.",
|
||||
"Uploads a new file at path you specify.": "Carrega um novo arquivo no caminho especificado.",
|
||||
"Publishes a SharePoint page, making it available to all users. If the page is checked out, it will be automatically checked in. Note: Pages with active approval flows will not publish until approval is complete.": "Publica uma página do SharePoint, disponibilizando-a para todos os usuários. Se a página for checkout, será check-in automaticamente. Nota: Páginas com fluxos de aprovação ativos não irão publicar até que a aprovação seja concluída.",
|
||||
"Copy a file or folder from one site to another within the same tenant, with overwrite option.": "Copie um arquivo ou pasta de um site para outro dentro do mesmo inquilino, com opção de sobrescrever.",
|
||||
"Copy a file or folder to another folder within the same site.": "Copie um arquivo ou pasta para outra pasta dentro de um mesmo site.",
|
||||
"Move a file from one folder to another within the same drive.": "Mover um arquivo de uma pasta para outra dentro da mesma unidade.",
|
||||
"Look up a file by its name or path.": "Procurar um arquivo pelo seu nome ou caminho.",
|
||||
"List all files and subfolders in a specified folder, optionally with detailed metadata.": "Lista todos os arquivos e subpastas em uma pasta específica, opcionalmente com metadados detalhados.",
|
||||
"Fetch metadata of a SharePoint site (site ID, title, URL, description, etc.).": "Obtém metadados de um site de SharePoint (ID do site, título, URL, descrição, etc.).",
|
||||
"Make a custom API call to a specific endpoint": "Faça uma chamada de API personalizada para um ponto de extremidade específico",
|
||||
"Site": "site",
|
||||
"Drive": "Dirigindo",
|
||||
"Parent Folder": "Pasta pai",
|
||||
"Folder Name": "Nome da Pasta",
|
||||
"List Name": "Lista de nomes",
|
||||
"List Description": "Descrição da lista",
|
||||
"List": "Lista",
|
||||
"List Columns": "Listar colunas",
|
||||
"List Item": "Item de Lista",
|
||||
"Title": "Título",
|
||||
"File": "Arquivo",
|
||||
"File Name": "Nome do arquivo",
|
||||
"Page": "Página",
|
||||
"Source File or Folder": "Arquivo de origem ou pasta",
|
||||
"Destination Drive": "Unidade de Destino",
|
||||
"Destination Folder": "Pasta de destino",
|
||||
"New Name (Optional)": "Novo Nome (opcional)",
|
||||
"Conflict Behavior": "Comportamento de conflito",
|
||||
"File to Move": "Arquivo para Mover",
|
||||
"Find Method": "Encontrar Método",
|
||||
"File Path": "Caminho do Arquivo",
|
||||
"Search Query": "Consulta de Pesquisa",
|
||||
"Folder to Search In (Optional)": "Pasta para pesquisar (Opcional)",
|
||||
"Folder": "Pasta",
|
||||
"Include Custom Metadata": "Incluir Metadados Personalizados",
|
||||
"Page Size": "Tamanho da página",
|
||||
"Select Fields (Optional)": "Selecione Campos (Opcional)",
|
||||
"Order By (Optional)": "Ordenar Por (Opcional)",
|
||||
"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)",
|
||||
"Parent folder,like \"/demo/\" or \"/docs/assignment/\".Leave it default if you want to create folder at the root (**/**) level.": "Pasta principal, como \"/demo/\" ou \"/docs/assignment/\".Deixe como padrão se você quiser criar a pasta na raiz (**/**) nível.",
|
||||
"Item title to search": "Título do item para pesquisar",
|
||||
"The file or url you want to upload": "O arquivo ou URL que você deseja enviar",
|
||||
"Parent folder, like \"/demo/\" or \"/docs/assignment/\".Leave it default if you want to create folder at the root (**CHANGE THIS BACK//**) level.": "Pasta principal, como \"/demo/\" ou \"/docs/assignment/\".Deixe como padrão se você quiser criar a pasta na raiz (**CHANGE ESTE BACK//**) nível.",
|
||||
"The folder to copy the item into. Defaults to the root of the drive.": "A pasta para copiar o item. O padrão é a raiz da unidade.",
|
||||
"A new name for the copied item. If not provided, the original name is used.": "Um novo nome para o item copiado. Se não for fornecido, o nome original será usado.",
|
||||
"Action to take if a file with the same name already exists.": "Ação a ser tomada se um arquivo com o mesmo nome já existe.",
|
||||
"The folder to copy the item into. Select \"Root\" to copy to the top level of the drive.": "A pasta na qual o item será copiado. Selecione \"Root\" para copiar para o nível superior da unidade.",
|
||||
"Action to take if a file with the same name already exists in the destination.": "Ação a ser tomada se um arquivo com o mesmo nome já existe no destino.",
|
||||
"The file you want to move.": "O arquivo que você quer mover.",
|
||||
"The folder to move the file into. Select \"Root\" to move to the top level of the drive.": "A pasta para mover o arquivo. Selecione \"Root\" para mover para o nível superior da unidade.",
|
||||
"Provide a new name to rename the file during the move.": "Forneça um novo nome para renomear o arquivo durante a movimentação.",
|
||||
"Choose how to find the file.": "Escolha como localizar o arquivo.",
|
||||
"The exact path to the file from the drive's root. **Required if finding by path.** Example: `Documents/Reports/Q1-Report.docx`": "O caminho exato para o arquivo da raiz da unidade. **Obrigatório se encontrar por caminho.** Exemplo: `Documents/Reports/Q1-Report.docx`",
|
||||
"The file name or keyword to search for. **Required if searching by name.** Example: `Q1-Report.docx`": "O nome do arquivo ou palavra-chave para procurar. **Obrigatório se procurar por nome.** Exemplo: `Q1-Report.docx`",
|
||||
"The folder to search within. If not specified, the entire drive will be searched. **Only applies when searching by name.**": "A pasta para pesquisar dentro. Se não for especificado, a unidade inteira será pesquisada. **Só se aplica quando a busca é feita por nome.**",
|
||||
"The folder whose contents you want to list. Select \"Root Folder\" for the top-level folder.": "A pasta cujo conteúdo você deseja listar. Selecione \"Pasta raiz\" para a pasta de nível superior.",
|
||||
"Check this to include SharePoint-specific metadata (custom columns). This may slow down the request.": "Marque esta opção para incluir metadados específicos do SharePoin (colunas personalizadas). Isto pode atrasar a solicitação.",
|
||||
"The maximum number of items to return. The API default is 200. If more items exist, the output will contain a field `@odata.nextLink` that you can use in a custom API call to get the next page.": "O número máximo de itens para retornar. O padrão da API é 200. Se existirem mais itens, a saída conterá um campo `@odata. extLink` que você pode usar em uma chamada de API personalizada para obter a próxima página.",
|
||||
"A comma-separated list of properties to return. Example: `id,name,size,webUrl`": "Uma lista separada por vírgulas de propriedades para retornar. Exemplo: `id,name,size,webUrl`",
|
||||
"Specifies how to sort the returned items. Example: `name asc` or `lastModifiedDateTime desc`": "Especifica como classificar os itens retornados. Exemplo: `name asc` ou `lastModifiedDateTime desc`",
|
||||
"A comma-separated list of properties to return. If left blank, all default properties are returned. Example: `id,displayName,webUrl,description`": "Uma lista separada por vírgulas de propriedades para retornar. Se deixar em branco, todas as propriedades padrão serão retornadas. Exemplo: `id,displayName,webUrl,description`",
|
||||
"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..",
|
||||
"Fail on conflict": "Falha no conflito",
|
||||
"Overwrite existing file": "Sobrescrever o arquivo existente",
|
||||
"Rename with a number": "Renomear com um número",
|
||||
"Find by Exact Path": "Localizar pelo caminho exato",
|
||||
"Search by Name": "Pesquisar por nome",
|
||||
"GET": "OBTER",
|
||||
"POST": "POSTAR",
|
||||
"PATCH": "COMPRAR",
|
||||
"PUT": "COLOCAR",
|
||||
"DELETE": "EXCLUIR",
|
||||
"HEAD": "CABEÇA",
|
||||
"New File in Folder": "Novo arquivo na pasta",
|
||||
"New File in Subfolders": "Novo Arquivo em Subpastas",
|
||||
"New or Updated File": "Arquivo novo ou atualizado",
|
||||
"New or Updated Folder": "Pasta nova ou atualizada",
|
||||
"New List Item": "Novo Item de Lista",
|
||||
"Updated List Item": "Item de Lista Atualizado",
|
||||
"New List": "Nova Lista",
|
||||
"New or Updated List": "Lista nova ou atualizada",
|
||||
"Fires when a new file is created or added in a specific folder.": "Efetua quando um novo arquivo é criado ou adicionado em uma pasta específica.",
|
||||
"Fires when a new file is added anywhere in the first-level subfolders of a folder. Note: This trigger will not monitor subfolders created after the flow is activated.": "Emite quando um novo arquivo é adicionado em qualquer lugar nas subpastas de primeiro nível de uma pasta. Nota: Este gatilho não monitora subpastas criadas após o fluxo ser ativado.",
|
||||
"Fires when a file is created or updated in a given folder.": "Executa quando um arquivo é criado ou atualizado em uma determinada pasta.",
|
||||
"Fires when a folder is created or updated (e.g., name change).": "Atira quando uma pasta é criada ou atualizada (por exemplo, alteração de nome).",
|
||||
"Fires when a new item is created in a SharePoint list.": "Emite quando um novo item é criado em uma lista de SharePoint.",
|
||||
"Fires when an existing item in a SharePoint list is updated.": "Atira quando um item existente em uma lista de SharePoint é atualizado.",
|
||||
"Fires when a new list is created in a site.": "Efetua quando uma nova lista é criada em um site.",
|
||||
"Fires when a list is created or updated in a site.": "Atira quando uma lista é criada ou atualizada em um site.",
|
||||
"Folder to Monitor": "Pasta para Monitorar",
|
||||
"Parent Folder to Monitor": "Pasta pai para Monitor",
|
||||
"The folder to watch for new files. Select \"Root Folder\" for the top-level folder of the drive.": "A pasta para assistir a novos arquivos. Selecione \"Pasta raiz\" para a pasta de nível superior da unidade.",
|
||||
"The parent folder whose subfolders you want to monitor.": "A pasta pai cujas subpastas você deseja monitorar.",
|
||||
"The folder to watch for new or updated files. Select \"Root Folder\" for the top-level folder of the drive.": "A pasta para assistir a novos arquivos ou atualizados. Selecione \"Pasta raiz\" para a pasta de nível superior da unidade.",
|
||||
"The folder to watch for new or updated subfolders. Select \"Root Folder\" to monitor the top-level of the drive.": "A pasta para monitorar novas ou atualizadas subpastas. Selecione \"Pasta raiz\" para monitorar o nível superior da unidade."
|
||||
}
|
||||
@@ -0,0 +1,49 @@
|
||||
{
|
||||
"Microsoft SharePoint": "Microsoft SharePoint",
|
||||
"Authentication for Microsoft SharePoint": "Аутентификация для Microsoft SharePoint",
|
||||
"Create Folder": "Создать папку",
|
||||
"Create List": "Создать список",
|
||||
"Create List Item": "Создать элемент списка",
|
||||
"Update List Item": "Обновить элемент списка",
|
||||
"Delete List Item": "Удалить элемент списка",
|
||||
"Find List Item": "Найти элемент списка",
|
||||
"Upload File": "Загрузить файл",
|
||||
"Custom API Call": "Пользовательский вызов API",
|
||||
"Creates a new folder at path you specify.": "Создает новую папку по указанному вами пути.",
|
||||
"Creates a new list.": "Создает новый список.",
|
||||
"Creates a new item in a list.": "Создает новый элемент в списке.",
|
||||
"Updates an existing item in a list.": "Обновляет существующий элемент списка.",
|
||||
"Deletes an existing item from a list.": "Удаляет существующий элемент списка.",
|
||||
"Finds a item in a list based on name.": "Находит элемент в списке на основе имени.",
|
||||
"Uploads a new file at path you specify.": "Загружает новый файл по указанному вами пути.",
|
||||
"Make a custom API call to a specific endpoint": "Сделать пользовательский API вызов к определенной конечной точке",
|
||||
"Site ID": "Site ID",
|
||||
"Drive ID": "ID диска",
|
||||
"Parent Folder": "Родительская папка",
|
||||
"Folder Name": "Имя папки",
|
||||
"List Name": "Название списка",
|
||||
"List Description": "Описание списка",
|
||||
"List ID": "ID списка",
|
||||
"List Columns": "Столбцы списка",
|
||||
"List Item ID": "List Item ID",
|
||||
"Title": "Заголовок",
|
||||
"File": "Файл",
|
||||
"File Name": "Имя файла",
|
||||
"Method": "Метод",
|
||||
"Headers": "Заголовки",
|
||||
"Query Parameters": "Параметры запроса",
|
||||
"Body": "Тело",
|
||||
"No Error on Failure": "Нет ошибок при ошибке",
|
||||
"Timeout (in seconds)": "Таймаут (в секундах)",
|
||||
"Parent folder,like \"/demo/\" or \"/docs/assignment/\".Leave it default if you want to create folder at the root (**/**) level.": "Родительская папка, например \"/demo/\" или \"/docs/assignment/\".Оставьте ее по умолчанию, если вы хотите создать папку на уровне корня (**/**).",
|
||||
"Item title to search": "Заголовок элемента для поиска",
|
||||
"The file or url you want to upload": "Файл или url, который вы хотите загрузить",
|
||||
"Parent folder, like \"/demo/\" or \"/docs/assignment/\".Leave it default if you want to create folder at the root (**CHANGE THIS BACK//**) level.": "Родительская папка, например \"/demo/\" или \"/docs/assignment/\".Leave it default if you want to create folder at the root (**CHANGE THIS BACK//**).",
|
||||
"Authorization headers are injected automatically from your connection.": "Заголовки авторизации включаются автоматически из вашего соединения.",
|
||||
"GET": "ПОЛУЧИТЬ",
|
||||
"POST": "ПОСТ",
|
||||
"PATCH": "ПАТЧ",
|
||||
"PUT": "ПОКУПИТЬ",
|
||||
"DELETE": "УДАЛИТЬ",
|
||||
"HEAD": "HEAD"
|
||||
}
|
||||
@@ -0,0 +1,125 @@
|
||||
{
|
||||
"\n1. Sign in to [Microsoft Azure Portal](https://portal.azure.com/).\n2. From the left sidebar, go to **Microsoft Enfra ID**.\n3. Under **Manage**, click on **App registrations**.\n4. Click the **New registration** button.\n5. Enter a **Name** for your app.\n6. For **Supported account types**, choose:\n - **Accounts in any organizational directory (Any Microsoft Entra ID tenant - Multitenant) and personal Microsoft accounts**\n - Or select based on your requirement.\n7. In **Redirect URI**, select **Web** and ad": "\n1. Sign in to [Microsoft Azure Portal](https://portal.azure.com/).\n2. From the left sidebar, go to **Microsoft Enfra ID**.\n3. Under **Manage**, click on **App registrations**.\n4. Click the **New registration** button.\n5. Enter a **Name** for your app.\n6. For **Supported account types**, choose:\n - **Accounts in any organizational directory (Any Microsoft Entra ID tenant - Multitenant) and personal Microsoft accounts**\n - Or select based on your requirement.\n7. In **Redirect URI**, select **Web** and add the given URL.\n8. Click **Register**.\n9. After registration, you’ll be redirected to the app’s overview page. Copy the **Application (client) ID**.\n10. From the left menu, go to **Certificates & secrets**.\n - Under **Client secrets**, click **New client secret**.\n - Provide a description, set an expiry, and click **Add**.\n - Copy the **Value** of the client secret (this will not be shown again).\n11. Go to **API permissions** from the left menu.\n - Click **Add a permission**.\n - Select **Microsoft Graph**.\n - Add the following **Delegated permissions**:\n - Sites.Read.All\n - Sites.ReadWrite.All\n - Sites.Manage.All\n - Files.ReadWrite.All\n - openid\n - email\n - profile\n - offline_access\n - Click **Add permissions**.\n12. Copy your **Client ID** and **Client Secret**.\n",
|
||||
"Create Folder": "Create Folder",
|
||||
"Create List": "Create List",
|
||||
"Create List Item": "Create List Item",
|
||||
"Update List Item": "Update List Item",
|
||||
"Delete List Item": "Delete List Item",
|
||||
"Find List Item": "Find List Item",
|
||||
"Upload File": "Upload File",
|
||||
"Publish Page": "Publish Page",
|
||||
"Copy File or Folder (Across Sites)": "Copy File or Folder (Across Sites)",
|
||||
"Copy File or Folder (Within Site)": "Copy File or Folder (Within Site)",
|
||||
"Move File": "Move File",
|
||||
"Find File": "Find File",
|
||||
"Get Folder Contents": "Get Folder Contents",
|
||||
"Get Site Information": "Get Site Information",
|
||||
"Custom API Call": "Custom API Call",
|
||||
"Creates a new folder at path you specify.": "Creates a new folder at path you specify.",
|
||||
"Creates a new list.": "Creates a new list.",
|
||||
"Creates a new item in a list.": "Creates a new item in a list.",
|
||||
"Updates an existing item in a list.": "Updates an existing item in a list.",
|
||||
"Deletes an existing item from a list.": "Deletes an existing item from a list.",
|
||||
"Finds a item in a list based on name.": "Finds a item in a list based on name.",
|
||||
"Uploads a new file at path you specify.": "Uploads a new file at path you specify.",
|
||||
"Publishes a SharePoint page, making it available to all users. If the page is checked out, it will be automatically checked in. Note: Pages with active approval flows will not publish until approval is complete.": "Publishes a SharePoint page, making it available to all users. If the page is checked out, it will be automatically checked in. Note: Pages with active approval flows will not publish until approval is complete.",
|
||||
"Copy a file or folder from one site to another within the same tenant, with overwrite option.": "Copy a file or folder from one site to another within the same tenant, with overwrite option.",
|
||||
"Copy a file or folder to another folder within the same site.": "Copy a file or folder to another folder within the same site.",
|
||||
"Move a file from one folder to another within the same drive.": "Move a file from one folder to another within the same drive.",
|
||||
"Look up a file by its name or path.": "Look up a file by its name or path.",
|
||||
"List all files and subfolders in a specified folder, optionally with detailed metadata.": "List all files and subfolders in a specified folder, optionally with detailed metadata.",
|
||||
"Fetch metadata of a SharePoint site (site ID, title, URL, description, etc.).": "Fetch metadata of a SharePoint site (site ID, title, URL, description, etc.).",
|
||||
"Make a custom API call to a specific endpoint": "Make a custom API call to a specific endpoint",
|
||||
"Site": "Site",
|
||||
"Drive": "Drive",
|
||||
"Parent Folder": "Parent Folder",
|
||||
"Folder Name": "Folder Name",
|
||||
"List Name": "List Name",
|
||||
"List Description": "List Description",
|
||||
"List": "List",
|
||||
"List Columns": "List Columns",
|
||||
"List Item": "List Item",
|
||||
"Title": "Title",
|
||||
"File": "File",
|
||||
"File Name": "File Name",
|
||||
"Page": "Page",
|
||||
"Source File or Folder": "Source File or Folder",
|
||||
"Destination Drive": "Destination Drive",
|
||||
"Destination Folder": "Destination Folder",
|
||||
"New Name (Optional)": "New Name (Optional)",
|
||||
"Conflict Behavior": "Conflict Behavior",
|
||||
"File to Move": "File to Move",
|
||||
"Find Method": "Find Method",
|
||||
"File Path": "File Path",
|
||||
"Search Query": "Search Query",
|
||||
"Folder to Search In (Optional)": "Folder to Search In (Optional)",
|
||||
"Folder": "Folder",
|
||||
"Include Custom Metadata": "Include Custom Metadata",
|
||||
"Page Size": "Page Size",
|
||||
"Select Fields (Optional)": "Select Fields (Optional)",
|
||||
"Order By (Optional)": "Order By (Optional)",
|
||||
"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)",
|
||||
"Parent folder,like \"/demo/\" or \"/docs/assignment/\".Leave it default if you want to create folder at the root (**/**) level.": "Parent folder,like \"/demo/\" or \"/docs/assignment/\".Leave it default if you want to create folder at the root (**/**) level.",
|
||||
"Item title to search": "Item title to search",
|
||||
"The file or url you want to upload": "The file or url you want to upload",
|
||||
"Parent folder, like \"/demo/\" or \"/docs/assignment/\".Leave it default if you want to create folder at the root (**CHANGE THIS BACK//**) level.": "Parent folder, like \"/demo/\" or \"/docs/assignment/\".Leave it default if you want to create folder at the root (**CHANGE THIS BACK//**) level.",
|
||||
"The folder to copy the item into. Defaults to the root of the drive.": "The folder to copy the item into. Defaults to the root of the drive.",
|
||||
"A new name for the copied item. If not provided, the original name is used.": "A new name for the copied item. If not provided, the original name is used.",
|
||||
"Action to take if a file with the same name already exists.": "Action to take if a file with the same name already exists.",
|
||||
"The folder to copy the item into. Select \"Root\" to copy to the top level of the drive.": "The folder to copy the item into. Select \"Root\" to copy to the top level of the drive.",
|
||||
"Action to take if a file with the same name already exists in the destination.": "Action to take if a file with the same name already exists in the destination.",
|
||||
"The file you want to move.": "The file you want to move.",
|
||||
"The folder to move the file into. Select \"Root\" to move to the top level of the drive.": "The folder to move the file into. Select \"Root\" to move to the top level of the drive.",
|
||||
"Provide a new name to rename the file during the move.": "Provide a new name to rename the file during the move.",
|
||||
"Choose how to find the file.": "Choose how to find the file.",
|
||||
"The exact path to the file from the drive's root. **Required if finding by path.** Example: `Documents/Reports/Q1-Report.docx`": "The exact path to the file from the drive's root. **Required if finding by path.** Example: `Documents/Reports/Q1-Report.docx`",
|
||||
"The file name or keyword to search for. **Required if searching by name.** Example: `Q1-Report.docx`": "The file name or keyword to search for. **Required if searching by name.** Example: `Q1-Report.docx`",
|
||||
"The folder to search within. If not specified, the entire drive will be searched. **Only applies when searching by name.**": "The folder to search within. If not specified, the entire drive will be searched. **Only applies when searching by name.**",
|
||||
"The folder whose contents you want to list. Select \"Root Folder\" for the top-level folder.": "The folder whose contents you want to list. Select \"Root Folder\" for the top-level folder.",
|
||||
"Check this to include SharePoint-specific metadata (custom columns). This may slow down the request.": "Check this to include SharePoint-specific metadata (custom columns). This may slow down the request.",
|
||||
"The maximum number of items to return. The API default is 200. If more items exist, the output will contain a field `@odata.nextLink` that you can use in a custom API call to get the next page.": "The maximum number of items to return. The API default is 200. If more items exist, the output will contain a field `@odata.nextLink` that you can use in a custom API call to get the next page.",
|
||||
"A comma-separated list of properties to return. Example: `id,name,size,webUrl`": "A comma-separated list of properties to return. Example: `id,name,size,webUrl`",
|
||||
"Specifies how to sort the returned items. Example: `name asc` or `lastModifiedDateTime desc`": "Specifies how to sort the returned items. Example: `name asc` or `lastModifiedDateTime desc`",
|
||||
"A comma-separated list of properties to return. If left blank, all default properties are returned. Example: `id,displayName,webUrl,description`": "A comma-separated list of properties to return. If left blank, all default properties are returned. Example: `id,displayName,webUrl,description`",
|
||||
"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..",
|
||||
"Fail on conflict": "Fail on conflict",
|
||||
"Overwrite existing file": "Overwrite existing file",
|
||||
"Rename with a number": "Rename with a number",
|
||||
"Find by Exact Path": "Find by Exact Path",
|
||||
"Search by Name": "Search by Name",
|
||||
"GET": "GET",
|
||||
"POST": "POST",
|
||||
"PATCH": "PATCH",
|
||||
"PUT": "PUT",
|
||||
"DELETE": "DELETE",
|
||||
"HEAD": "HEAD",
|
||||
"New File in Folder": "New File in Folder",
|
||||
"New File in Subfolders": "New File in Subfolders",
|
||||
"New or Updated File": "New or Updated File",
|
||||
"New or Updated Folder": "New or Updated Folder",
|
||||
"New List Item": "New List Item",
|
||||
"Updated List Item": "Updated List Item",
|
||||
"New List": "New List",
|
||||
"New or Updated List": "New or Updated List",
|
||||
"Fires when a new file is created or added in a specific folder.": "Fires when a new file is created or added in a specific folder.",
|
||||
"Fires when a new file is added anywhere in the first-level subfolders of a folder. Note: This trigger will not monitor subfolders created after the flow is activated.": "Fires when a new file is added anywhere in the first-level subfolders of a folder. Note: This trigger will not monitor subfolders created after the flow is activated.",
|
||||
"Triggers when a file is created or updated in a given folder.": "Triggers when a file is created or updated in a given folder.",
|
||||
"Triggers when a folder is created or updated (e.g., name change).": "Triggers when a folder is created or updated (e.g., name change).",
|
||||
"Triggers when a new item is created in a SharePoint list.": "Triggers when a new item is created in a SharePoint list.",
|
||||
"Fires when an existing item in a SharePoint list is updated.": "Fires when an existing item in a SharePoint list is updated.",
|
||||
"Triggers when a new list is created in a site.": "Triggers when a new list is created in a site.",
|
||||
"Triggers when a list is created or updated in a site.": "Triggers when a list is created or updated in a site.",
|
||||
"Folder to Monitor": "Folder to Monitor",
|
||||
"Parent Folder to Monitor": "Parent Folder to Monitor",
|
||||
"The folder to watch for new files. Select \"Root Folder\" for the top-level folder of the drive.": "The folder to watch for new files. Select \"Root Folder\" for the top-level folder of the drive.",
|
||||
"The parent folder whose subfolders you want to monitor.": "The parent folder whose subfolders you want to monitor.",
|
||||
"The folder to watch for new or updated files. Select \"Root Folder\" for the top-level folder of the drive.": "The folder to watch for new or updated files. Select \"Root Folder\" for the top-level folder of the drive.",
|
||||
"The folder to watch for new or updated subfolders. Select \"Root Folder\" to monitor the top-level of the drive.": "The folder to watch for new or updated subfolders. Select \"Root Folder\" to monitor the top-level of the drive."
|
||||
}
|
||||
@@ -0,0 +1,49 @@
|
||||
{
|
||||
"Microsoft SharePoint": "Microsoft SharePoint",
|
||||
"Authentication for Microsoft SharePoint": "Authentication for Microsoft SharePoint",
|
||||
"Create Folder": "Create Folder",
|
||||
"Create List": "Create List",
|
||||
"Create List Item": "Create List Item",
|
||||
"Update List Item": "Update List Item",
|
||||
"Delete List Item": "Delete List Item",
|
||||
"Find List Item": "Find List Item",
|
||||
"Upload File": "Upload File",
|
||||
"Custom API Call": "Custom API Call",
|
||||
"Creates a new folder at path you specify.": "Creates a new folder at path you specify.",
|
||||
"Creates a new list.": "Creates a new list.",
|
||||
"Creates a new item in a list.": "Creates a new item in a list.",
|
||||
"Updates an existing item in a list.": "Updates an existing item in a list.",
|
||||
"Deletes an existing item from a list.": "Deletes an existing item from a list.",
|
||||
"Finds a item in a list based on name.": "Finds a item in a list based on name.",
|
||||
"Uploads a new file at path you specify.": "Uploads a new file at path you specify.",
|
||||
"Make a custom API call to a specific endpoint": "Make a custom API call to a specific endpoint",
|
||||
"Site ID": "Site ID",
|
||||
"Drive ID": "Drive ID",
|
||||
"Parent Folder": "Parent Folder",
|
||||
"Folder Name": "Folder Name",
|
||||
"List Name": "List Name",
|
||||
"List Description": "List Description",
|
||||
"List ID": "List ID",
|
||||
"List Columns": "List Columns",
|
||||
"List Item ID": "List Item ID",
|
||||
"Title": "Title",
|
||||
"File": "File",
|
||||
"File Name": "File Name",
|
||||
"Method": "Method",
|
||||
"Headers": "Headers",
|
||||
"Query Parameters": "Query Parameters",
|
||||
"Body": "Body",
|
||||
"No Error on Failure": "No Error on Failure",
|
||||
"Timeout (in seconds)": "Timeout (in seconds)",
|
||||
"Parent folder,like \"/demo/\" or \"/docs/assignment/\".Leave it default if you want to create folder at the root (**/**) level.": "Parent folder,like \"/demo/\" or \"/docs/assignment/\".Leave it default if you want to create folder at the root (**/**) level.",
|
||||
"Item title to search": "Item title to search",
|
||||
"The file or url you want to upload": "The file or url you want to upload",
|
||||
"Parent folder, like \"/demo/\" or \"/docs/assignment/\".Leave it default if you want to create folder at the root (**CHANGE THIS BACK//**) level.": "Parent folder, like \"/demo/\" or \"/docs/assignment/\".Leave it default if you want to create folder at the root (**CHANGE THIS BACK//**) level.",
|
||||
"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"
|
||||
}
|
||||
@@ -0,0 +1,125 @@
|
||||
{
|
||||
"\n1. Sign in to [Microsoft Azure Portal](https://portal.azure.com/).\n2. From the left sidebar, go to **Microsoft Enfra ID**.\n3. Under **Manage**, click on **App registrations**.\n4. Click the **New registration** button.\n5. Enter a **Name** for your app.\n6. For **Supported account types**, choose:\n - **Accounts in any organizational directory (Any Microsoft Entra ID tenant - Multitenant) and personal Microsoft accounts**\n - Or select based on your requirement.\n7. In **Redirect URI**, select **Web** and ad": "\n1. Sign in to [Microsoft Azure Portal](https://portal.azure.com/).\n2. From the left sidebar, go to **Microsoft Enfra ID**.\n3. Under **Manage**, click on **App registrations**.\n4. Click the **New registration** button.\n5. Enter a **Name** for your app.\n6. For **Supported account types**, choose:\n - **Accounts in any organizational directory (Any Microsoft Entra ID tenant - Multitenant) and personal Microsoft accounts**\n - Or select based on your requirement.\n7. In **Redirect URI**, select **Web** and add the given URL.\n8. Click **Register**.\n9. After registration, you’ll be redirected to the app’s overview page. Copy the **Application (client) ID**.\n10. From the left menu, go to **Certificates & secrets**.\n - Under **Client secrets**, click **New client secret**.\n - Provide a description, set an expiry, and click **Add**.\n - Copy the **Value** of the client secret (this will not be shown again).\n11. Go to **API permissions** from the left menu.\n - Click **Add a permission**.\n - Select **Microsoft Graph**.\n - Add the following **Delegated permissions**:\n - Sites.Read.All\n - Sites.ReadWrite.All\n - Sites.Manage.All\n - Files.ReadWrite.All\n - openid\n - email\n - profile\n - offline_access\n - Click **Add permissions**.\n12. Copy your **Client ID** and **Client Secret**.\n",
|
||||
"Create Folder": "Create Folder",
|
||||
"Create List": "Create List",
|
||||
"Create List Item": "Create List Item",
|
||||
"Update List Item": "Update List Item",
|
||||
"Delete List Item": "Delete List Item",
|
||||
"Find List Item": "Find List Item",
|
||||
"Upload File": "Upload File",
|
||||
"Publish Page": "Publish Page",
|
||||
"Copy File or Folder (Across Sites)": "Copy File or Folder (Across Sites)",
|
||||
"Copy File or Folder (Within Site)": "Copy File or Folder (Within Site)",
|
||||
"Move File": "Move File",
|
||||
"Find File": "Find File",
|
||||
"Get Folder Contents": "Get Folder Contents",
|
||||
"Get Site Information": "Get Site Information",
|
||||
"Custom API Call": "自定义 API 呼叫",
|
||||
"Creates a new folder at path you specify.": "Creates a new folder at path you specify.",
|
||||
"Creates a new list.": "Creates a new list.",
|
||||
"Creates a new item in a list.": "Creates a new item in a list.",
|
||||
"Updates an existing item in a list.": "Updates an existing item in a list.",
|
||||
"Deletes an existing item from a list.": "Deletes an existing item from a list.",
|
||||
"Finds a item in a list based on name.": "Finds a item in a list based on name.",
|
||||
"Uploads a new file at path you specify.": "Uploads a new file at path you specify.",
|
||||
"Publishes a SharePoint page, making it available to all users. If the page is checked out, it will be automatically checked in. Note: Pages with active approval flows will not publish until approval is complete.": "Publishes a SharePoint page, making it available to all users. If the page is checked out, it will be automatically checked in. Note: Pages with active approval flows will not publish until approval is complete.",
|
||||
"Copy a file or folder from one site to another within the same tenant, with overwrite option.": "Copy a file or folder from one site to another within the same tenant, with overwrite option.",
|
||||
"Copy a file or folder to another folder within the same site.": "Copy a file or folder to another folder within the same site.",
|
||||
"Move a file from one folder to another within the same drive.": "Move a file from one folder to another within the same drive.",
|
||||
"Look up a file by its name or path.": "Look up a file by its name or path.",
|
||||
"List all files and subfolders in a specified folder, optionally with detailed metadata.": "List all files and subfolders in a specified folder, optionally with detailed metadata.",
|
||||
"Fetch metadata of a SharePoint site (site ID, title, URL, description, etc.).": "Fetch metadata of a SharePoint site (site ID, title, URL, description, etc.).",
|
||||
"Make a custom API call to a specific endpoint": "将一个自定义 API 调用到一个特定的终点",
|
||||
"Site": "Site",
|
||||
"Drive": "Drive",
|
||||
"Parent Folder": "父文件夹",
|
||||
"Folder Name": "文件夹名称",
|
||||
"List Name": "List Name",
|
||||
"List Description": "List Description",
|
||||
"List": "List",
|
||||
"List Columns": "List Columns",
|
||||
"List Item": "List Item",
|
||||
"Title": "标题",
|
||||
"File": "文件",
|
||||
"File Name": "File Name",
|
||||
"Page": "Page",
|
||||
"Source File or Folder": "Source File or Folder",
|
||||
"Destination Drive": "Destination Drive",
|
||||
"Destination Folder": "Destination Folder",
|
||||
"New Name (Optional)": "New Name (Optional)",
|
||||
"Conflict Behavior": "Conflict Behavior",
|
||||
"File to Move": "File to Move",
|
||||
"Find Method": "Find Method",
|
||||
"File Path": "File Path",
|
||||
"Search Query": "Search Query",
|
||||
"Folder to Search In (Optional)": "Folder to Search In (Optional)",
|
||||
"Folder": "Folder",
|
||||
"Include Custom Metadata": "Include Custom Metadata",
|
||||
"Page Size": "Page Size",
|
||||
"Select Fields (Optional)": "Select Fields (Optional)",
|
||||
"Order By (Optional)": "Order By (Optional)",
|
||||
"Method": "方法",
|
||||
"Headers": "信头",
|
||||
"Query Parameters": "查询参数",
|
||||
"Body": "正文内容",
|
||||
"Response is Binary ?": "Response is Binary ?",
|
||||
"No Error on Failure": "失败时没有错误",
|
||||
"Timeout (in seconds)": "超时(秒)",
|
||||
"Parent folder,like \"/demo/\" or \"/docs/assignment/\".Leave it default if you want to create folder at the root (**/**) level.": "Parent folder,like \"/demo/\" or \"/docs/assignment/\".Leave it default if you want to create folder at the root (**/**) level.",
|
||||
"Item title to search": "Item title to search",
|
||||
"The file or url you want to upload": "The file or url you want to upload",
|
||||
"Parent folder, like \"/demo/\" or \"/docs/assignment/\".Leave it default if you want to create folder at the root (**CHANGE THIS BACK//**) level.": "Parent folder, like \"/demo/\" or \"/docs/assignment/\".Leave it default if you want to create folder at the root (**CHANGE THIS BACK//**) level.",
|
||||
"The folder to copy the item into. Defaults to the root of the drive.": "The folder to copy the item into. Defaults to the root of the drive.",
|
||||
"A new name for the copied item. If not provided, the original name is used.": "A new name for the copied item. If not provided, the original name is used.",
|
||||
"Action to take if a file with the same name already exists.": "Action to take if a file with the same name already exists.",
|
||||
"The folder to copy the item into. Select \"Root\" to copy to the top level of the drive.": "The folder to copy the item into. Select \"Root\" to copy to the top level of the drive.",
|
||||
"Action to take if a file with the same name already exists in the destination.": "Action to take if a file with the same name already exists in the destination.",
|
||||
"The file you want to move.": "The file you want to move.",
|
||||
"The folder to move the file into. Select \"Root\" to move to the top level of the drive.": "The folder to move the file into. Select \"Root\" to move to the top level of the drive.",
|
||||
"Provide a new name to rename the file during the move.": "Provide a new name to rename the file during the move.",
|
||||
"Choose how to find the file.": "Choose how to find the file.",
|
||||
"The exact path to the file from the drive's root. **Required if finding by path.** Example: `Documents/Reports/Q1-Report.docx`": "The exact path to the file from the drive's root. **Required if finding by path.** Example: `Documents/Reports/Q1-Report.docx`",
|
||||
"The file name or keyword to search for. **Required if searching by name.** Example: `Q1-Report.docx`": "The file name or keyword to search for. **Required if searching by name.** Example: `Q1-Report.docx`",
|
||||
"The folder to search within. If not specified, the entire drive will be searched. **Only applies when searching by name.**": "The folder to search within. If not specified, the entire drive will be searched. **Only applies when searching by name.**",
|
||||
"The folder whose contents you want to list. Select \"Root Folder\" for the top-level folder.": "The folder whose contents you want to list. Select \"Root Folder\" for the top-level folder.",
|
||||
"Check this to include SharePoint-specific metadata (custom columns). This may slow down the request.": "Check this to include SharePoint-specific metadata (custom columns). This may slow down the request.",
|
||||
"The maximum number of items to return. The API default is 200. If more items exist, the output will contain a field `@odata.nextLink` that you can use in a custom API call to get the next page.": "The maximum number of items to return. The API default is 200. If more items exist, the output will contain a field `@odata.nextLink` that you can use in a custom API call to get the next page.",
|
||||
"A comma-separated list of properties to return. Example: `id,name,size,webUrl`": "A comma-separated list of properties to return. Example: `id,name,size,webUrl`",
|
||||
"Specifies how to sort the returned items. Example: `name asc` or `lastModifiedDateTime desc`": "Specifies how to sort the returned items. Example: `name asc` or `lastModifiedDateTime desc`",
|
||||
"A comma-separated list of properties to return. If left blank, all default properties are returned. Example: `id,displayName,webUrl,description`": "A comma-separated list of properties to return. If left blank, all default properties are returned. Example: `id,displayName,webUrl,description`",
|
||||
"Authorization headers are injected automatically from your connection.": "授权头自动从您的连接中注入。",
|
||||
"Enable for files like PDFs, images, etc..": "Enable for files like PDFs, images, etc..",
|
||||
"Fail on conflict": "Fail on conflict",
|
||||
"Overwrite existing file": "Overwrite existing file",
|
||||
"Rename with a number": "Rename with a number",
|
||||
"Find by Exact Path": "Find by Exact Path",
|
||||
"Search by Name": "Search by Name",
|
||||
"GET": "获取",
|
||||
"POST": "帖子",
|
||||
"PATCH": "PATCH",
|
||||
"PUT": "弹出",
|
||||
"DELETE": "删除",
|
||||
"HEAD": "黑色",
|
||||
"New File in Folder": "New File in Folder",
|
||||
"New File in Subfolders": "New File in Subfolders",
|
||||
"New or Updated File": "New or Updated File",
|
||||
"New or Updated Folder": "New or Updated Folder",
|
||||
"New List Item": "New List Item",
|
||||
"Updated List Item": "Updated List Item",
|
||||
"New List": "New List",
|
||||
"New or Updated List": "New or Updated List",
|
||||
"Fires when a new file is created or added in a specific folder.": "Fires when a new file is created or added in a specific folder.",
|
||||
"Fires when a new file is added anywhere in the first-level subfolders of a folder. Note: This trigger will not monitor subfolders created after the flow is activated.": "Fires when a new file is added anywhere in the first-level subfolders of a folder. Note: This trigger will not monitor subfolders created after the flow is activated.",
|
||||
"Fires when a file is created or updated in a given folder.": "Fires when a file is created or updated in a given folder.",
|
||||
"Fires when a folder is created or updated (e.g., name change).": "Fires when a folder is created or updated (e.g., name change).",
|
||||
"Fires when a new item is created in a SharePoint list.": "Fires when a new item is created in a SharePoint list.",
|
||||
"Fires when an existing item in a SharePoint list is updated.": "Fires when an existing item in a SharePoint list is updated.",
|
||||
"Fires when a new list is created in a site.": "Fires when a new list is created in a site.",
|
||||
"Fires when a list is created or updated in a site.": "Fires when a list is created or updated in a site.",
|
||||
"Folder to Monitor": "Folder to Monitor",
|
||||
"Parent Folder to Monitor": "Parent Folder to Monitor",
|
||||
"The folder to watch for new files. Select \"Root Folder\" for the top-level folder of the drive.": "The folder to watch for new files. Select \"Root Folder\" for the top-level folder of the drive.",
|
||||
"The parent folder whose subfolders you want to monitor.": "The parent folder whose subfolders you want to monitor.",
|
||||
"The folder to watch for new or updated files. Select \"Root Folder\" for the top-level folder of the drive.": "The folder to watch for new or updated files. Select \"Root Folder\" for the top-level folder of the drive.",
|
||||
"The folder to watch for new or updated subfolders. Select \"Root Folder\" to monitor the top-level of the drive.": "The folder to watch for new or updated subfolders. Select \"Root Folder\" to monitor the top-level of the drive."
|
||||
}
|
||||
@@ -0,0 +1,128 @@
|
||||
import {
|
||||
createPiece,
|
||||
PieceAuth,
|
||||
OAuth2PropertyValue,
|
||||
} from '@activepieces/pieces-framework';
|
||||
import { PieceCategory } from '@activepieces/shared';
|
||||
import { createCustomApiCallAction } from '@activepieces/pieces-common';
|
||||
|
||||
|
||||
import { createFolderAction } from './lib/actions/create-folder';
|
||||
import { createListAction } from './lib/actions/create-list';
|
||||
import { createListItemAction } from './lib/actions/create-list-item';
|
||||
import { updateListItemAction } from './lib/actions/update-list-item';
|
||||
import { deleteListItemAction } from './lib/actions/delete-list-item';
|
||||
import { findListItemAction } from './lib/actions/search-list-item';
|
||||
import { uploadFile } from './lib/actions/upload-file';
|
||||
|
||||
|
||||
import { publishPageAction } from './lib/actions/publish-page';
|
||||
import { copyItemAction } from './lib/actions/copy-item';
|
||||
import { copyItemWithinSiteAction } from './lib/actions/copy-item-within-site';
|
||||
import { moveFileAction } from './lib/actions/move-file';
|
||||
import { findFileAction } from './lib/actions/find-file';
|
||||
import { getFolderContentsAction } from './lib/actions/get-folder-contents';
|
||||
import { getSiteInformationAction } from './lib/actions/get-site-information';
|
||||
|
||||
|
||||
import { newFileInFolderTrigger } from './lib/triggers/new-file-in-folder';
|
||||
import { newFileInSubfoldersTrigger } from './lib/triggers/new-file-in-subfolders';
|
||||
import { newOrUpdatedFileTrigger } from './lib/triggers/new-or-updated-file';
|
||||
import { newOrUpdatedFolderTrigger } from './lib/triggers/new-or-updated-folder';
|
||||
import { newListItemTrigger } from './lib/triggers/new-list-item';
|
||||
import { updatedListItemTrigger } from './lib/triggers/updated-list-item';
|
||||
import { newListTrigger } from './lib/triggers/new-list';
|
||||
import { newOrUpdatedListTrigger } from './lib/triggers/new-or-updated-list';
|
||||
|
||||
|
||||
const authDesc = `
|
||||
1. Sign in to [Microsoft Azure Portal](https://portal.azure.com/).
|
||||
2. From the left sidebar, go to **Microsoft Enfra ID**.
|
||||
3. Under **Manage**, click on **App registrations**.
|
||||
4. Click the **New registration** button.
|
||||
5. Enter a **Name** for your app.
|
||||
6. For **Supported account types**, choose:
|
||||
- **Accounts in any organizational directory (Any Microsoft Entra ID tenant - Multitenant) and personal Microsoft accounts**
|
||||
- Or select based on your requirement.
|
||||
7. In **Redirect URI**, select **Web** and add the given URL.
|
||||
8. Click **Register**.
|
||||
9. After registration, you’ll be redirected to the app’s overview page. Copy the **Application (client) ID**.
|
||||
10. From the left menu, go to **Certificates & secrets**.
|
||||
- Under **Client secrets**, click **New client secret**.
|
||||
- Provide a description, set an expiry, and click **Add**.
|
||||
- Copy the **Value** of the client secret (this will not be shown again).
|
||||
11. Go to **API permissions** from the left menu.
|
||||
- Click **Add a permission**.
|
||||
- Select **Microsoft Graph**.
|
||||
- Add the following **Delegated permissions**:
|
||||
- Sites.Read.All
|
||||
- Sites.ReadWrite.All
|
||||
- Sites.Manage.All
|
||||
- Files.ReadWrite.All
|
||||
- openid
|
||||
- email
|
||||
- profile
|
||||
- offline_access
|
||||
- Click **Add permissions**.
|
||||
12. Copy your **Client ID** and **Client Secret**.
|
||||
`
|
||||
|
||||
export const microsoftSharePointAuth = PieceAuth.OAuth2({
|
||||
description: authDesc,
|
||||
authUrl: 'https://login.microsoftonline.com/common/oauth2/v2.0/authorize',
|
||||
tokenUrl: 'https://login.microsoftonline.com/common/oauth2/v2.0/token',
|
||||
required: true,
|
||||
scope: [
|
||||
'openid',
|
||||
'email',
|
||||
'profile',
|
||||
'offline_access',
|
||||
'Sites.Read.All',
|
||||
'Sites.ReadWrite.All',
|
||||
'Sites.Manage.All',
|
||||
'Files.ReadWrite.All',
|
||||
],
|
||||
prompt: 'omit'
|
||||
});
|
||||
|
||||
export const microsoftSharePoint = createPiece({
|
||||
displayName: 'Microsoft SharePoint',
|
||||
auth: microsoftSharePointAuth,
|
||||
minimumSupportedRelease: '0.27.1',
|
||||
logoUrl: 'https://cdn.activepieces.com/pieces/microsoft-sharepoint.png',
|
||||
categories: [PieceCategory.CONTENT_AND_FILES],
|
||||
authors: ['kishanprmr', 'pranith124', 'onyedikachi-david'],
|
||||
actions: [
|
||||
createFolderAction,
|
||||
createListAction,
|
||||
createListItemAction,
|
||||
updateListItemAction,
|
||||
deleteListItemAction,
|
||||
findListItemAction,
|
||||
uploadFile,
|
||||
publishPageAction,
|
||||
copyItemAction,
|
||||
copyItemWithinSiteAction,
|
||||
moveFileAction,
|
||||
findFileAction,
|
||||
getFolderContentsAction,
|
||||
getSiteInformationAction,
|
||||
createCustomApiCallAction({
|
||||
auth: microsoftSharePointAuth,
|
||||
baseUrl: () => 'https://graph.microsoft.com/v1.0',
|
||||
authMapping: async (auth) => ({
|
||||
Authorization: `Bearer ${(auth as OAuth2PropertyValue).access_token}`,
|
||||
}),
|
||||
}),
|
||||
],
|
||||
triggers: [
|
||||
newFileInFolderTrigger,
|
||||
newFileInSubfoldersTrigger,
|
||||
newOrUpdatedFileTrigger,
|
||||
newOrUpdatedFolderTrigger,
|
||||
newListItemTrigger,
|
||||
updatedListItemTrigger,
|
||||
newListTrigger,
|
||||
newOrUpdatedListTrigger,
|
||||
],
|
||||
});
|
||||
@@ -0,0 +1,170 @@
|
||||
import { microsoftSharePointAuth } from '../../';
|
||||
import {
|
||||
createAction,
|
||||
Property,
|
||||
DropdownOption,
|
||||
PiecePropValueSchema,
|
||||
} from '@activepieces/pieces-framework';
|
||||
import { microsoftSharePointCommon } from '../common';
|
||||
import { Client, PageCollection, ResponseType } from '@microsoft/microsoft-graph-client';
|
||||
import { DriveItem } from '@microsoft/microsoft-graph-types';
|
||||
|
||||
const polling_delay_ms = 2000;
|
||||
const polling_timeout_secs = 120;
|
||||
|
||||
async function delay(ms: number) {
|
||||
return new Promise((resolve) => setTimeout(resolve, ms));
|
||||
}
|
||||
|
||||
export const copyItemWithinSiteAction = createAction({
|
||||
auth: microsoftSharePointAuth,
|
||||
name: 'microsoft_sharepoint_copy_item_within_site',
|
||||
displayName: 'Copy File or Folder (Within Site)',
|
||||
description: 'Copy a file or folder to another folder within the same site.',
|
||||
props: {
|
||||
siteId: microsoftSharePointCommon.siteId,
|
||||
driveId: microsoftSharePointCommon.driveId,
|
||||
itemId: microsoftSharePointCommon.itemId,
|
||||
destinationFolderId: Property.Dropdown({
|
||||
auth: microsoftSharePointAuth,
|
||||
displayName: 'Destination Folder',
|
||||
description: 'The folder to copy the item into. Select "Root" to copy to the top level of the drive.',
|
||||
required: true,
|
||||
refreshers: ['siteId', 'driveId'],
|
||||
options: async ({ auth, siteId, driveId }) => {
|
||||
if (!auth || !siteId || !driveId) {
|
||||
return {
|
||||
disabled: true,
|
||||
placeholder: 'Select a site and drive first.',
|
||||
options: [],
|
||||
};
|
||||
}
|
||||
const authValue = auth as PiecePropValueSchema<
|
||||
typeof microsoftSharePointAuth
|
||||
>;
|
||||
const client = Client.initWithMiddleware({
|
||||
authProvider: {
|
||||
getAccessToken: () => Promise.resolve(authValue.access_token),
|
||||
},
|
||||
});
|
||||
|
||||
const options: DropdownOption<string>[] = [
|
||||
{ label: 'Root', value: 'root' }
|
||||
];
|
||||
let response: PageCollection = await client
|
||||
.api(
|
||||
`/sites/${siteId}/drives/${driveId}/root/children?$filter=folder ne null&$select=id,name`
|
||||
)
|
||||
.get();
|
||||
|
||||
while (response.value.length > 0) {
|
||||
for (const item of response.value as DriveItem[]) {
|
||||
options.push({
|
||||
label: item.name!,
|
||||
value: item.id!,
|
||||
});
|
||||
}
|
||||
if (response['@odata.nextLink']) {
|
||||
response = await client.api(response['@odata.nextLink']).get();
|
||||
} else {
|
||||
break;
|
||||
}
|
||||
}
|
||||
return { disabled: false, options };
|
||||
},
|
||||
}),
|
||||
newName: Property.ShortText({
|
||||
displayName: 'New Name (Optional)',
|
||||
description: 'A new name for the copied item. If not provided, the original name is used.',
|
||||
required: false,
|
||||
}),
|
||||
conflictBehavior: Property.StaticDropdown({
|
||||
displayName: 'Conflict Behavior',
|
||||
description: 'Action to take if a file with the same name already exists in the destination.',
|
||||
required: true,
|
||||
options: {
|
||||
options: [
|
||||
{ label: 'Fail on conflict', value: 'fail' },
|
||||
{ label: 'Overwrite existing file', value: 'replace' },
|
||||
{ label: 'Rename with a number', value: 'rename' },
|
||||
],
|
||||
},
|
||||
defaultValue: 'fail',
|
||||
}),
|
||||
},
|
||||
async run(context) {
|
||||
const { siteId, driveId, itemId, destinationFolderId, newName, conflictBehavior } =
|
||||
context.propsValue;
|
||||
|
||||
const client = Client.initWithMiddleware({
|
||||
authProvider: {
|
||||
getAccessToken: () => Promise.resolve(context.auth.access_token),
|
||||
},
|
||||
});
|
||||
|
||||
const effectiveDestinationId = destinationFolderId === 'root'
|
||||
? (await client.api(`/drives/${driveId}/root`).get()).id
|
||||
: destinationFolderId;
|
||||
|
||||
const body: {
|
||||
parentReference: { id?: string };
|
||||
name?: string;
|
||||
} = {
|
||||
parentReference: {
|
||||
id: effectiveDestinationId,
|
||||
},
|
||||
};
|
||||
|
||||
if (newName) {
|
||||
body.name = newName;
|
||||
}
|
||||
|
||||
let initialResponse;
|
||||
try {
|
||||
initialResponse = await client
|
||||
.api(`/drives/${driveId}/items/${itemId}/copy`)
|
||||
.responseType(ResponseType.RAW)
|
||||
.query({ '@microsoft.graph.conflictBehavior': conflictBehavior })
|
||||
.post(body);
|
||||
} catch (error: any) {
|
||||
if (error.statusCode === 400) {
|
||||
throw new Error(`Invalid request: ${error.message || 'Check your input parameters'}`);
|
||||
}
|
||||
if (error.statusCode === 403) {
|
||||
throw new Error('Insufficient permissions to copy this item. Requires Files.ReadWrite or higher.');
|
||||
}
|
||||
if (error.statusCode === 404) {
|
||||
throw new Error('Source item not found. Please verify the site, drive, and item IDs.');
|
||||
}
|
||||
throw new Error(`Failed to initiate copy operation: ${error.message || 'Unknown error'}`);
|
||||
}
|
||||
|
||||
const monitorUrl = initialResponse.headers.get('Location');
|
||||
if (!monitorUrl) {
|
||||
throw new Error('Could not get monitor URL from copy operation response.');
|
||||
}
|
||||
|
||||
let attempts = polling_timeout_secs * 1000 / polling_delay_ms;
|
||||
while (attempts > 0) {
|
||||
const monitorResponse = await client.api(monitorUrl).get();
|
||||
if (monitorResponse.status === 'completed') {
|
||||
return {
|
||||
success: true,
|
||||
status: 'completed',
|
||||
resourceId: monitorResponse.resourceId,
|
||||
resourceLocation: monitorResponse.resourceLocation,
|
||||
};
|
||||
}
|
||||
if (monitorResponse.status === 'failed') {
|
||||
const errorDetails = monitorResponse.error?.details
|
||||
? monitorResponse.error.details.map((d: any) => d.message || d.code).join(', ')
|
||||
: monitorResponse.error?.message || 'Unknown error';
|
||||
throw new Error(`Copy operation failed: ${errorDetails}`);
|
||||
}
|
||||
await delay(polling_delay_ms);
|
||||
attempts--;
|
||||
}
|
||||
|
||||
throw new Error('Copy operation timed out after 120 seconds.');
|
||||
},
|
||||
});
|
||||
@@ -0,0 +1,129 @@
|
||||
import { microsoftSharePointAuth } from '../../';
|
||||
import { createAction, Property } from '@activepieces/pieces-framework';
|
||||
import { microsoftSharePointCommon } from '../common';
|
||||
import { Client, ResponseType } from '@microsoft/microsoft-graph-client';
|
||||
|
||||
const polling_delay_ms = 2000;
|
||||
const polling_timeout_secs = 120;
|
||||
|
||||
async function delay(ms: number) {
|
||||
return new Promise((resolve) => setTimeout(resolve, ms));
|
||||
}
|
||||
|
||||
export const copyItemAction = createAction({
|
||||
auth: microsoftSharePointAuth,
|
||||
name: 'microsoft_sharepoint_copy_item',
|
||||
displayName: 'Copy File or Folder (Across Sites)',
|
||||
description:
|
||||
'Copy a file or folder from one site to another within the same tenant, with overwrite option.',
|
||||
props: {
|
||||
|
||||
siteId: microsoftSharePointCommon.siteId,
|
||||
driveId: microsoftSharePointCommon.driveId,
|
||||
itemId: microsoftSharePointCommon.itemId,
|
||||
|
||||
destination_site_id: microsoftSharePointCommon.siteId,
|
||||
destination_drive_id: microsoftSharePointCommon.createDriveDropdown({
|
||||
displayName: 'Destination Drive',
|
||||
refreshers: ['destination_site_id'],
|
||||
}),
|
||||
destination_folder_id: microsoftSharePointCommon.destinationFolderId,
|
||||
|
||||
new_name: Property.ShortText({
|
||||
displayName: 'New Name (Optional)',
|
||||
description: 'A new name for the copied item. If not provided, the original name is used.',
|
||||
required: false,
|
||||
}),
|
||||
conflict_behavior: Property.StaticDropdown({
|
||||
displayName: 'Conflict Behavior',
|
||||
description: 'Action to take if a file with the same name already exists.',
|
||||
required: true,
|
||||
options: {
|
||||
options: [
|
||||
{ label: 'Fail on conflict', value: 'fail' },
|
||||
{ label: 'Overwrite existing file', value: 'replace' },
|
||||
{ label: 'Rename with a number', value: 'rename' },
|
||||
],
|
||||
},
|
||||
defaultValue: 'fail',
|
||||
}),
|
||||
},
|
||||
async run(context) {
|
||||
const {
|
||||
siteId,
|
||||
driveId,
|
||||
itemId,
|
||||
destination_drive_id,
|
||||
destination_folder_id,
|
||||
new_name,
|
||||
conflict_behavior,
|
||||
} = context.propsValue;
|
||||
|
||||
const client = Client.initWithMiddleware({
|
||||
authProvider: {
|
||||
getAccessToken: () => Promise.resolve(context.auth.access_token),
|
||||
},
|
||||
});
|
||||
|
||||
const body: { parentReference: { driveId: string; id?: string }; name?: string } = {
|
||||
parentReference: {
|
||||
driveId: destination_drive_id,
|
||||
},
|
||||
};
|
||||
|
||||
if (destination_folder_id) {
|
||||
body.parentReference.id = destination_folder_id;
|
||||
}
|
||||
if (new_name) {
|
||||
body.name = new_name;
|
||||
}
|
||||
|
||||
let initialResponse;
|
||||
try {
|
||||
initialResponse = await client
|
||||
.api(`/drives/${driveId}/items/${itemId}/copy`)
|
||||
.responseType(ResponseType.RAW)
|
||||
.query({ '@microsoft.graph.conflictBehavior': conflict_behavior })
|
||||
.post(body);
|
||||
} catch (error: any) {
|
||||
if (error.statusCode === 400) {
|
||||
throw new Error(`Invalid request: ${error.message || 'Check your input parameters'}`);
|
||||
}
|
||||
if (error.statusCode === 403) {
|
||||
throw new Error('Insufficient permissions to copy this item. Requires Files.ReadWrite or higher.');
|
||||
}
|
||||
if (error.statusCode === 404) {
|
||||
throw new Error('Source item not found. Please verify the site, drive, and item IDs.');
|
||||
}
|
||||
throw new Error(`Failed to initiate copy operation: ${error.message || 'Unknown error'}`);
|
||||
}
|
||||
|
||||
const monitorUrl = initialResponse.headers.get('Location');
|
||||
if (!monitorUrl) {
|
||||
throw new Error('Could not get monitor URL from copy operation response.');
|
||||
}
|
||||
|
||||
let attempts = polling_timeout_secs * 1000 / polling_delay_ms;
|
||||
while (attempts > 0) {
|
||||
const monitorResponse = await client.api(monitorUrl).get();
|
||||
if (monitorResponse.status === 'completed') {
|
||||
return {
|
||||
success: true,
|
||||
status: 'completed',
|
||||
resourceId: monitorResponse.resourceId,
|
||||
resourceLocation: monitorResponse.resourceLocation,
|
||||
};
|
||||
}
|
||||
if (monitorResponse.status === 'failed') {
|
||||
const errorDetails = monitorResponse.error?.details
|
||||
? monitorResponse.error.details.map((d: any) => d.message || d.code).join(', ')
|
||||
: monitorResponse.error?.message || 'Unknown error';
|
||||
throw new Error(`Copy operation failed: ${errorDetails}`);
|
||||
}
|
||||
await delay(polling_delay_ms);
|
||||
attempts--;
|
||||
}
|
||||
|
||||
throw new Error('Copy operation timed out after 120 seconds.');
|
||||
},
|
||||
});
|
||||
@@ -0,0 +1,41 @@
|
||||
import { microsoftSharePointAuth } from '../../';
|
||||
import { createAction, Property } from '@activepieces/pieces-framework';
|
||||
import { microsoftSharePointCommon } from '../common';
|
||||
import { Client } from '@microsoft/microsoft-graph-client';
|
||||
|
||||
export const createFolderAction = createAction({
|
||||
auth: microsoftSharePointAuth,
|
||||
name: 'microsoft_sharepoint_create_folder',
|
||||
displayName: 'Create Folder',
|
||||
description: 'Creates a new folder at path you specify.',
|
||||
props: {
|
||||
siteId: microsoftSharePointCommon.siteId,
|
||||
driveId: microsoftSharePointCommon.driveId,
|
||||
parentFolder: Property.ShortText({
|
||||
displayName: 'Parent Folder',
|
||||
description: `Parent folder,like "/demo/" or "/docs/assignment/".Leave it default if you want to create folder at the root (**/**) level.`,
|
||||
required: true,
|
||||
defaultValue: '/',
|
||||
}),
|
||||
folderName: Property.ShortText({
|
||||
displayName: 'Folder Name',
|
||||
required: true,
|
||||
}),
|
||||
},
|
||||
async run(context) {
|
||||
const { driveId, parentFolder, folderName } = context.propsValue;
|
||||
|
||||
const client = Client.initWithMiddleware({
|
||||
authProvider: {
|
||||
getAccessToken: () => Promise.resolve(context.auth.access_token),
|
||||
},
|
||||
});
|
||||
|
||||
const folderPath = parentFolder + folderName;
|
||||
|
||||
// https://stackoverflow.com/questions/66631136/creating-nested-folder-in-sharepoint-with-graph-api-fails
|
||||
return await client.api(`/drives/${driveId}/root:${folderPath}`).patch({
|
||||
folder: {},
|
||||
});
|
||||
},
|
||||
});
|
||||
@@ -0,0 +1,40 @@
|
||||
import { microsoftSharePointAuth } from '../../';
|
||||
import { createAction } from '@activepieces/pieces-framework';
|
||||
import { microsoftSharePointCommon } from '../common';
|
||||
import { Client } from '@microsoft/microsoft-graph-client';
|
||||
|
||||
export const createListItemAction = createAction({
|
||||
auth: microsoftSharePointAuth,
|
||||
name: 'microsoft_sharepoint_create_list_item',
|
||||
displayName: 'Create List Item',
|
||||
description: 'Creates a new item in a list.',
|
||||
props: {
|
||||
siteId: microsoftSharePointCommon.siteId,
|
||||
listId: microsoftSharePointCommon.listId,
|
||||
listColumns: microsoftSharePointCommon.listColumns,
|
||||
},
|
||||
async run(context) {
|
||||
const { siteId, listId, listColumns } = context.propsValue;
|
||||
|
||||
const client = Client.initWithMiddleware({
|
||||
authProvider: {
|
||||
getAccessToken: () => Promise.resolve(context.auth.access_token),
|
||||
},
|
||||
});
|
||||
const fieldWithArrayValues: Record<string, string> = {};
|
||||
|
||||
Object.entries(listColumns).forEach(([key, value]) => {
|
||||
// https://learn.microsoft.com/en-us/answers/questions/1517379/upload-multiple-choice-fields-item-in-sharepoint-w
|
||||
if (Array.isArray(value)) {
|
||||
fieldWithArrayValues[`${key}@odata.type`] = 'Collection(Edm.String)';
|
||||
}
|
||||
});
|
||||
const itemInput = {
|
||||
fields: { ...listColumns, ...fieldWithArrayValues },
|
||||
};
|
||||
|
||||
return await client
|
||||
.api(`/sites/${siteId}/lists/${listId}/items`)
|
||||
.post(itemInput);
|
||||
},
|
||||
});
|
||||
@@ -0,0 +1,39 @@
|
||||
import { microsoftSharePointAuth } from '../../';
|
||||
import { createAction, Property } from '@activepieces/pieces-framework';
|
||||
import { microsoftSharePointCommon } from '../common';
|
||||
import { Client } from '@microsoft/microsoft-graph-client';
|
||||
import { List } from '@microsoft/microsoft-graph-types';
|
||||
|
||||
export const createListAction = createAction({
|
||||
auth: microsoftSharePointAuth,
|
||||
name: 'microsoft_sharepoint_create_list',
|
||||
displayName: 'Create List',
|
||||
description: 'Creates a new list.',
|
||||
props: {
|
||||
siteId: microsoftSharePointCommon.siteId,
|
||||
displayName: Property.ShortText({
|
||||
displayName: 'List Name',
|
||||
required: true,
|
||||
}),
|
||||
description: Property.ShortText({
|
||||
displayName: 'List Description',
|
||||
required: true,
|
||||
}),
|
||||
},
|
||||
async run(context) {
|
||||
const { siteId, displayName, description } = context.propsValue;
|
||||
|
||||
const client = Client.initWithMiddleware({
|
||||
authProvider: {
|
||||
getAccessToken: () => Promise.resolve(context.auth.access_token),
|
||||
},
|
||||
});
|
||||
|
||||
const listInput: List = {
|
||||
displayName,
|
||||
description,
|
||||
};
|
||||
|
||||
return await client.api(`/sites/${siteId}/lists`).post(listInput);
|
||||
},
|
||||
});
|
||||
@@ -0,0 +1,29 @@
|
||||
import { microsoftSharePointAuth } from '../../';
|
||||
import { createAction } from '@activepieces/pieces-framework';
|
||||
import { microsoftSharePointCommon } from '../common';
|
||||
import { Client } from '@microsoft/microsoft-graph-client';
|
||||
|
||||
export const deleteListItemAction = createAction({
|
||||
auth: microsoftSharePointAuth,
|
||||
name: 'microsoft_sharepoint_delete_list_item',
|
||||
displayName: 'Delete List Item',
|
||||
description: 'Deletes an existing item from a list.',
|
||||
props: {
|
||||
siteId: microsoftSharePointCommon.siteId,
|
||||
listId: microsoftSharePointCommon.listId,
|
||||
listItemId: microsoftSharePointCommon.listItemId,
|
||||
},
|
||||
async run(context) {
|
||||
const { siteId, listId, listItemId } = context.propsValue;
|
||||
|
||||
const client = Client.initWithMiddleware({
|
||||
authProvider: {
|
||||
getAccessToken: () => Promise.resolve(context.auth.access_token),
|
||||
},
|
||||
});
|
||||
|
||||
return await client
|
||||
.api(`/sites/${siteId}/lists/${listId}/items/${listItemId}`)
|
||||
.delete();
|
||||
},
|
||||
});
|
||||
@@ -0,0 +1,136 @@
|
||||
import { microsoftSharePointAuth } from '../../';
|
||||
import {
|
||||
createAction,
|
||||
Property,
|
||||
DropdownOption,
|
||||
PiecePropValueSchema,
|
||||
} from '@activepieces/pieces-framework';
|
||||
import { microsoftSharePointCommon } from '../common';
|
||||
import { Client, PageCollection, GraphError } from '@microsoft/microsoft-graph-client';
|
||||
import { DriveItem } from '@microsoft/microsoft-graph-types';
|
||||
|
||||
export const findFileAction = createAction({
|
||||
auth: microsoftSharePointAuth,
|
||||
name: 'microsoft_sharepoint_find_file',
|
||||
displayName: 'Find File',
|
||||
description: 'Look up a file by its name or path.',
|
||||
props: {
|
||||
siteId: microsoftSharePointCommon.siteId,
|
||||
driveId: microsoftSharePointCommon.driveId,
|
||||
findMethod: Property.StaticDropdown({
|
||||
displayName: 'Find Method',
|
||||
description: 'Choose how to find the file.',
|
||||
required: true,
|
||||
options: {
|
||||
options: [
|
||||
{ label: 'Find by Exact Path', value: 'path' },
|
||||
{ label: 'Search by Name', value: 'search' },
|
||||
],
|
||||
},
|
||||
defaultValue: 'search',
|
||||
}),
|
||||
filePath: Property.ShortText({
|
||||
displayName: 'File Path',
|
||||
description: "The exact path to the file from the drive's root. **Required if finding by path.** Example: `Documents/Reports/Q1-Report.docx`",
|
||||
required: false,
|
||||
}),
|
||||
searchQuery: Property.ShortText({
|
||||
displayName: 'Search Query',
|
||||
description: "The file name or keyword to search for. **Required if searching by name.** Example: `Q1-Report.docx`",
|
||||
required: false,
|
||||
}),
|
||||
searchFolderId: Property.Dropdown({
|
||||
auth: microsoftSharePointAuth,
|
||||
displayName: 'Folder to Search In (Optional)',
|
||||
description: 'The folder to search within. If not specified, the entire drive will be searched. **Only applies when searching by name.**',
|
||||
required: false,
|
||||
refreshers: ['siteId', 'driveId'],
|
||||
options: async ({ auth, siteId, driveId }) => {
|
||||
if (!auth || !siteId || !driveId) {
|
||||
return {
|
||||
disabled: true,
|
||||
placeholder: 'Select a site and drive first.',
|
||||
options: [],
|
||||
};
|
||||
}
|
||||
const authValue = auth as PiecePropValueSchema<
|
||||
typeof microsoftSharePointAuth
|
||||
>;
|
||||
const client = Client.initWithMiddleware({
|
||||
authProvider: {
|
||||
getAccessToken: () => Promise.resolve(authValue.access_token),
|
||||
},
|
||||
});
|
||||
const options: DropdownOption<string>[] = [];
|
||||
let response: PageCollection = await client
|
||||
.api(
|
||||
`/sites/${siteId}/drives/${driveId}/root/children?$filter=folder ne null&$select=id,name`
|
||||
)
|
||||
.get();
|
||||
|
||||
while (response.value.length > 0) {
|
||||
for (const item of response.value as DriveItem[]) {
|
||||
options.push({ label: item.name!, value: item.id! });
|
||||
}
|
||||
if (response['@odata.nextLink']) {
|
||||
response = await client.api(response['@odata.nextLink']).get();
|
||||
} else {
|
||||
break;
|
||||
}
|
||||
}
|
||||
return { disabled: false, options };
|
||||
},
|
||||
}),
|
||||
},
|
||||
async run(context) {
|
||||
const { driveId, findMethod, filePath, searchQuery, searchFolderId } = context.propsValue;
|
||||
|
||||
const client = Client.initWithMiddleware({
|
||||
authProvider: {
|
||||
getAccessToken: () => Promise.resolve(context.auth.access_token),
|
||||
},
|
||||
});
|
||||
|
||||
if (findMethod === 'path') {
|
||||
if (!filePath) throw new Error("File Path is required when finding by path.");
|
||||
|
||||
const cleanPath = filePath.startsWith('/') ? filePath.substring(1) : filePath;
|
||||
try {
|
||||
const result = await client.api(`/drives/${driveId}/root:/${encodeURI(cleanPath)}`).get();
|
||||
return {
|
||||
success: true,
|
||||
files: [result]
|
||||
};
|
||||
} catch(e) {
|
||||
const error = e as GraphError;
|
||||
if (error.statusCode === 404) {
|
||||
return {
|
||||
success: true,
|
||||
files: []
|
||||
};
|
||||
}
|
||||
throw new Error(`Failed to find file by path: ${error.message || 'Unknown error'}`);
|
||||
}
|
||||
} else {
|
||||
if (!searchQuery) throw new Error("Search Query is required when searching by name.");
|
||||
|
||||
let searchUrl = `/drives/${driveId}/`;
|
||||
if (searchFolderId) {
|
||||
searchUrl += `items/${searchFolderId}/`;
|
||||
} else {
|
||||
searchUrl += 'root/';
|
||||
}
|
||||
searchUrl += `search(q='${encodeURIComponent(searchQuery)}')`;
|
||||
|
||||
try {
|
||||
const response = await client.api(searchUrl).get();
|
||||
return {
|
||||
success: true,
|
||||
files: response.value || []
|
||||
};
|
||||
} catch (error: any) {
|
||||
throw new Error(`Failed to search for file: ${error.message || 'Unknown error'}`);
|
||||
}
|
||||
}
|
||||
},
|
||||
});
|
||||
@@ -0,0 +1,118 @@
|
||||
import { microsoftSharePointAuth } from '../../';
|
||||
import {
|
||||
createAction,
|
||||
Property,
|
||||
DropdownOption,
|
||||
PiecePropValueSchema,
|
||||
} from '@activepieces/pieces-framework';
|
||||
import { microsoftSharePointCommon } from '../common';
|
||||
import { Client, PageCollection } from '@microsoft/microsoft-graph-client';
|
||||
import { DriveItem } from '@microsoft/microsoft-graph-types';
|
||||
|
||||
export const getFolderContentsAction = createAction({
|
||||
auth: microsoftSharePointAuth,
|
||||
name: 'microsoft_sharepoint_get_folder_contents',
|
||||
displayName: 'Get Folder Contents',
|
||||
description: 'List all files and subfolders in a specified folder, optionally with detailed metadata.',
|
||||
props: {
|
||||
siteId: microsoftSharePointCommon.siteId,
|
||||
driveId: microsoftSharePointCommon.driveId,
|
||||
folderId: Property.Dropdown({
|
||||
auth: microsoftSharePointAuth,
|
||||
displayName: 'Folder',
|
||||
description: 'The folder whose contents you want to list. Select "Root Folder" for the top-level folder.',
|
||||
required: true,
|
||||
refreshers: ['siteId', 'driveId'],
|
||||
options: async ({ auth, siteId, driveId }) => {
|
||||
if (!auth || !siteId || !driveId) {
|
||||
return {
|
||||
disabled: true,
|
||||
placeholder: 'Select a site and drive first.',
|
||||
options: [],
|
||||
};
|
||||
}
|
||||
const authValue = auth as PiecePropValueSchema<
|
||||
typeof microsoftSharePointAuth
|
||||
>;
|
||||
const client = Client.initWithMiddleware({
|
||||
authProvider: {
|
||||
getAccessToken: () => Promise.resolve(authValue.access_token),
|
||||
},
|
||||
});
|
||||
const options: DropdownOption<string>[] = [
|
||||
{ label: 'Root Folder', value: 'root' },
|
||||
];
|
||||
let response: PageCollection = await client
|
||||
.api(
|
||||
`/sites/${siteId}/drives/${driveId}/root/children?$filter=folder ne null&$select=id,name`
|
||||
)
|
||||
.get();
|
||||
while (response.value.length > 0) {
|
||||
for (const item of response.value as DriveItem[]) {
|
||||
options.push({ label: item.name!, value: item.id! });
|
||||
}
|
||||
if (response['@odata.nextLink']) {
|
||||
response = await client.api(response['@odata.nextLink']).get();
|
||||
} else {
|
||||
break;
|
||||
}
|
||||
}
|
||||
return { disabled: false, options };
|
||||
},
|
||||
}),
|
||||
includeCustomFields: Property.Checkbox({
|
||||
displayName: 'Include Custom Metadata',
|
||||
description: 'Check this to include SharePoint-specific metadata (custom columns). This may slow down the request.',
|
||||
required: false,
|
||||
defaultValue: false,
|
||||
}),
|
||||
top: Property.Number({
|
||||
displayName: 'Page Size',
|
||||
description: 'The maximum number of items to return. The API default is 200. If more items exist, the output will contain a field `@odata.nextLink` that you can use in a custom API call to get the next page.',
|
||||
required: false,
|
||||
}),
|
||||
select: Property.ShortText({
|
||||
displayName: 'Select Fields (Optional)',
|
||||
description: 'A comma-separated list of properties to return. Example: `id,name,size,webUrl`',
|
||||
required: false,
|
||||
}),
|
||||
orderby: Property.ShortText({
|
||||
displayName: 'Order By (Optional)',
|
||||
description: 'Specifies how to sort the returned items. Example: `name asc` or `lastModifiedDateTime desc`',
|
||||
required: false,
|
||||
}),
|
||||
},
|
||||
async run(context) {
|
||||
const { siteId, driveId, folderId, includeCustomFields, top, select, orderby } = context.propsValue;
|
||||
|
||||
const client = Client.initWithMiddleware({
|
||||
authProvider: {
|
||||
getAccessToken: () => Promise.resolve(context.auth.access_token),
|
||||
},
|
||||
});
|
||||
|
||||
const baseUrl = folderId === 'root'
|
||||
? `/sites/${siteId}/drive/root/children`
|
||||
: `/sites/${siteId}/drive/items/${folderId}/children`;
|
||||
|
||||
|
||||
const queryParams: {[key: string]: string | number} = {};
|
||||
if(includeCustomFields) {
|
||||
queryParams['$expand'] = 'listItem(expand=fields)';
|
||||
}
|
||||
if(top) {
|
||||
queryParams['$top'] = top;
|
||||
}
|
||||
if(select) {
|
||||
queryParams['$select'] = select;
|
||||
}
|
||||
if(orderby) {
|
||||
queryParams['$orderby'] = orderby;
|
||||
}
|
||||
|
||||
const result = await client.api(baseUrl).query(queryParams).get();
|
||||
|
||||
|
||||
return result.value || [];
|
||||
},
|
||||
});
|
||||
@@ -0,0 +1,36 @@
|
||||
import { microsoftSharePointAuth } from '../../';
|
||||
import { createAction, Property } from '@activepieces/pieces-framework';
|
||||
import { microsoftSharePointCommon } from '../common';
|
||||
import { Client } from '@microsoft/microsoft-graph-client';
|
||||
|
||||
export const getSiteInformationAction = createAction({
|
||||
auth: microsoftSharePointAuth,
|
||||
name: 'microsoft_sharepoint_get_site_information',
|
||||
displayName: 'Get Site Information',
|
||||
description: 'Fetch metadata of a SharePoint site (site ID, title, URL, description, etc.).',
|
||||
props: {
|
||||
siteId: microsoftSharePointCommon.siteId,
|
||||
select: Property.ShortText({
|
||||
displayName: 'Select Fields (Optional)',
|
||||
description: 'A comma-separated list of properties to return. If left blank, all default properties are returned. Example: `id,displayName,webUrl,description`',
|
||||
required: false,
|
||||
}),
|
||||
},
|
||||
async run(context) {
|
||||
const { siteId, select } = context.propsValue;
|
||||
|
||||
const client = Client.initWithMiddleware({
|
||||
authProvider: {
|
||||
getAccessToken: () => Promise.resolve(context.auth.access_token),
|
||||
},
|
||||
});
|
||||
|
||||
const request = client.api(`/sites/${siteId}`);
|
||||
|
||||
if (select) {
|
||||
request.select(select.split(',').map(s => s.trim()));
|
||||
}
|
||||
|
||||
return await request.get();
|
||||
},
|
||||
});
|
||||
@@ -0,0 +1,165 @@
|
||||
import { microsoftSharePointAuth } from '../../';
|
||||
import {
|
||||
createAction,
|
||||
Property,
|
||||
DropdownOption,
|
||||
PiecePropValueSchema,
|
||||
} from '@activepieces/pieces-framework';
|
||||
import { microsoftSharePointCommon } from '../common';
|
||||
import { Client, PageCollection } from '@microsoft/microsoft-graph-client';
|
||||
import { DriveItem } from '@microsoft/microsoft-graph-types';
|
||||
|
||||
export const moveFileAction = createAction({
|
||||
auth: microsoftSharePointAuth,
|
||||
name: 'microsoft_sharepoint_move_file',
|
||||
displayName: 'Move File',
|
||||
description: 'Move a file from one folder to another within the same drive.',
|
||||
props: {
|
||||
siteId: microsoftSharePointCommon.siteId,
|
||||
driveId: microsoftSharePointCommon.driveId,
|
||||
fileId: Property.Dropdown({
|
||||
auth: microsoftSharePointAuth,
|
||||
displayName: 'File to Move',
|
||||
description: 'The file you want to move.',
|
||||
required: true,
|
||||
refreshers: ['siteId', 'driveId'],
|
||||
options: async ({ auth, siteId, driveId }) => {
|
||||
if (!auth || !siteId || !driveId) {
|
||||
return {
|
||||
disabled: true,
|
||||
placeholder: 'Select a site and drive first.',
|
||||
options: [],
|
||||
};
|
||||
}
|
||||
const authValue = auth as PiecePropValueSchema<
|
||||
typeof microsoftSharePointAuth
|
||||
>;
|
||||
const client = Client.initWithMiddleware({
|
||||
authProvider: {
|
||||
getAccessToken: () => Promise.resolve(authValue.access_token),
|
||||
},
|
||||
});
|
||||
const options: DropdownOption<string>[] = [];
|
||||
let response: PageCollection = await client
|
||||
.api(
|
||||
`/drives/${driveId}/root/children?$select=id,name,file`
|
||||
// `/sites/${siteId}/drives/${driveId}/root/children?$select=id,name,file`
|
||||
)
|
||||
.get();
|
||||
while (response.value.length > 0) {
|
||||
for (const item of response.value as DriveItem[]) {
|
||||
if (item.file) {
|
||||
options.push({ label: item.name!, value: item.id! });
|
||||
}
|
||||
}
|
||||
if (response['@odata.nextLink']) {
|
||||
response = await client.api(response['@odata.nextLink']).get();
|
||||
} else {
|
||||
break;
|
||||
}
|
||||
}
|
||||
return { disabled: false, options };
|
||||
},
|
||||
}),
|
||||
destinationFolderId: Property.Dropdown({
|
||||
auth: microsoftSharePointAuth,
|
||||
displayName: 'Destination Folder',
|
||||
description: 'The folder to move the file into. Select "Root" to move to the top level of the drive.',
|
||||
required: true,
|
||||
refreshers: ['siteId', 'driveId'],
|
||||
options: async ({ auth, siteId, driveId }) => {
|
||||
if (!auth || !siteId || !driveId) {
|
||||
return {
|
||||
disabled: true,
|
||||
placeholder: 'Select a site and drive first.',
|
||||
options: [],
|
||||
};
|
||||
}
|
||||
const authValue = auth as PiecePropValueSchema<
|
||||
typeof microsoftSharePointAuth
|
||||
>;
|
||||
const client = Client.initWithMiddleware({
|
||||
authProvider: {
|
||||
getAccessToken: () => Promise.resolve(authValue.access_token),
|
||||
},
|
||||
});
|
||||
const options: DropdownOption<string>[] = [
|
||||
{ label: 'Root', value: 'root' },
|
||||
];
|
||||
let response: PageCollection = await client
|
||||
.api(
|
||||
// `/drives/${driveId}/root/children?$filter=folder ne null&$select=id,name`
|
||||
`/sites/${siteId}/drives/${driveId}/root/children?$filter=folder ne null&$select=id,name`
|
||||
)
|
||||
.get();
|
||||
while (response.value.length > 0) {
|
||||
for (const item of response.value as DriveItem[]) {
|
||||
options.push({ label: item.name!, value: item.id! });
|
||||
}
|
||||
if (response['@odata.nextLink']) {
|
||||
response = await client.api(response['@odata.nextLink']).get();
|
||||
} else {
|
||||
break;
|
||||
}
|
||||
}
|
||||
return { disabled: false, options };
|
||||
},
|
||||
}),
|
||||
newName: Property.ShortText({
|
||||
displayName: 'New Name (Optional)',
|
||||
description: 'Provide a new name to rename the file during the move.',
|
||||
required: false,
|
||||
}),
|
||||
},
|
||||
async run(context) {
|
||||
const { driveId, fileId, destinationFolderId, newName } =
|
||||
context.propsValue;
|
||||
|
||||
const client = Client.initWithMiddleware({
|
||||
authProvider: {
|
||||
getAccessToken: () => Promise.resolve(context.auth.access_token),
|
||||
},
|
||||
});
|
||||
|
||||
try {
|
||||
const effectiveDestinationId =
|
||||
destinationFolderId === 'root'
|
||||
? (await client.api(`/drives/${driveId}/root`).get()).id
|
||||
: destinationFolderId;
|
||||
|
||||
const requestBody: {
|
||||
parentReference: { id?: string };
|
||||
name?: string;
|
||||
} = {
|
||||
parentReference: {
|
||||
id: effectiveDestinationId,
|
||||
},
|
||||
};
|
||||
|
||||
if (newName) {
|
||||
requestBody.name = newName;
|
||||
}
|
||||
|
||||
const response = await client
|
||||
.api(`/drives/${driveId}/items/${fileId}`)
|
||||
.patch(requestBody);
|
||||
|
||||
return {
|
||||
success: true,
|
||||
message: 'File moved successfully',
|
||||
item: response,
|
||||
};
|
||||
} catch (error: any) {
|
||||
if (error.statusCode === 400) {
|
||||
throw new Error(`Invalid request: ${error.message || 'Check your input parameters'}`);
|
||||
}
|
||||
if (error.statusCode === 403) {
|
||||
throw new Error('Insufficient permissions to move this file. Requires Files.ReadWrite or higher.');
|
||||
}
|
||||
if (error.statusCode === 404) {
|
||||
throw new Error('File or destination not found. Please verify the IDs.');
|
||||
}
|
||||
throw new Error(`Failed to move file: ${error.message || 'Unknown error'}`);
|
||||
}
|
||||
},
|
||||
});
|
||||
@@ -0,0 +1,48 @@
|
||||
import { microsoftSharePointAuth } from '../../';
|
||||
import { createAction } from '@activepieces/pieces-framework';
|
||||
import { microsoftSharePointCommon } from '../common';
|
||||
import { Client } from '@microsoft/microsoft-graph-client';
|
||||
|
||||
export const publishPageAction = createAction({
|
||||
auth: microsoftSharePointAuth,
|
||||
name: 'microsoft_sharepoint_publish_page',
|
||||
displayName: 'Publish Page',
|
||||
description: 'Publishes a SharePoint page, making it available to all users. If the page is checked out, it will be automatically checked in. Note: Pages with active approval flows will not publish until approval is complete.',
|
||||
props: {
|
||||
siteId: microsoftSharePointCommon.siteId,
|
||||
pageId: microsoftSharePointCommon.pageId,
|
||||
},
|
||||
async run(context) {
|
||||
const { siteId, pageId } = context.propsValue;
|
||||
|
||||
const client = Client.initWithMiddleware({
|
||||
authProvider: {
|
||||
getAccessToken: () => Promise.resolve(context.auth.access_token),
|
||||
},
|
||||
});
|
||||
|
||||
try {
|
||||
await client
|
||||
.api(`/sites/${siteId}/pages/${pageId}/microsoft.graph.sitePage/publish`)
|
||||
.post({});
|
||||
|
||||
return {
|
||||
success: true,
|
||||
message: 'Page published successfully',
|
||||
pageId: pageId,
|
||||
siteId: siteId,
|
||||
};
|
||||
} catch (error: any) {
|
||||
if (error.statusCode === 404) {
|
||||
throw new Error(`Page not found. Please verify the page ID: ${pageId}`);
|
||||
}
|
||||
if (error.statusCode === 403) {
|
||||
throw new Error('Insufficient permissions to publish this page. Requires Files.ReadWrite or higher.');
|
||||
}
|
||||
if (error.statusCode === 409) {
|
||||
throw new Error('Page cannot be published. It may be awaiting approval or already published.');
|
||||
}
|
||||
throw new Error(`Failed to publish page: ${error.message || 'Unknown error'}`);
|
||||
}
|
||||
},
|
||||
});
|
||||
@@ -0,0 +1,38 @@
|
||||
import { microsoftSharePointAuth } from '../../';
|
||||
import { createAction, Property } from '@activepieces/pieces-framework';
|
||||
import { microsoftSharePointCommon } from '../common';
|
||||
import { Client } from '@microsoft/microsoft-graph-client';
|
||||
|
||||
export const findListItemAction = createAction({
|
||||
auth: microsoftSharePointAuth,
|
||||
name: 'microsoft_sharepoint_search_list_item',
|
||||
displayName: 'Find List Item',
|
||||
description: 'Finds a item in a list based on name.',
|
||||
props: {
|
||||
siteId: microsoftSharePointCommon.siteId,
|
||||
listId: microsoftSharePointCommon.listId,
|
||||
searchValue: Property.ShortText({
|
||||
displayName: 'Title',
|
||||
description: 'Item title to search',
|
||||
required: true,
|
||||
}),
|
||||
},
|
||||
async run(context) {
|
||||
const { siteId, listId, searchValue } = context.propsValue;
|
||||
|
||||
const client = Client.initWithMiddleware({
|
||||
authProvider: {
|
||||
getAccessToken: () => Promise.resolve(context.auth.access_token),
|
||||
},
|
||||
});
|
||||
|
||||
// Escaping single quotes
|
||||
const title = searchValue.replaceAll("'", "''");
|
||||
return await client
|
||||
.api(
|
||||
`/sites/${siteId}/lists/${listId}/items?$expand=fields&filter=fields/Title eq '${title}'`
|
||||
)
|
||||
.headers({ Prefer: 'HonorNonIndexedQueriesWarningMayFailRandomly' })
|
||||
.get();
|
||||
},
|
||||
});
|
||||
@@ -0,0 +1,39 @@
|
||||
import { microsoftSharePointAuth } from '../../';
|
||||
import { createAction } from '@activepieces/pieces-framework';
|
||||
import { microsoftSharePointCommon } from '../common';
|
||||
import { Client } from '@microsoft/microsoft-graph-client';
|
||||
|
||||
export const updateListItemAction = createAction({
|
||||
auth: microsoftSharePointAuth,
|
||||
name: 'microsoft_sharepoint_update_list_item',
|
||||
displayName: 'Update List Item',
|
||||
description: 'Updates an existing item in a list.',
|
||||
props: {
|
||||
siteId: microsoftSharePointCommon.siteId,
|
||||
listId: microsoftSharePointCommon.listId,
|
||||
listItemId: microsoftSharePointCommon.listItemId,
|
||||
listColumns: microsoftSharePointCommon.listColumns,
|
||||
},
|
||||
async run(context) {
|
||||
const { siteId, listId, listItemId, listColumns } = context.propsValue;
|
||||
|
||||
const client = Client.initWithMiddleware({
|
||||
authProvider: {
|
||||
getAccessToken: () => Promise.resolve(context.auth.access_token),
|
||||
},
|
||||
});
|
||||
const fieldWithArrayValues: Record<string, string> = {};
|
||||
|
||||
Object.entries(listColumns).forEach(([key, value]) => {
|
||||
// https://learn.microsoft.com/en-us/answers/questions/1517379/upload-multiple-choice-fields-item-in-sharepoint-w
|
||||
if (Array.isArray(value)) {
|
||||
fieldWithArrayValues[`${key}@odata.type`] = 'Collection(Edm.String)';
|
||||
}
|
||||
});
|
||||
const itemInput = { ...listColumns, ...fieldWithArrayValues };
|
||||
|
||||
return await client
|
||||
.api(`/sites/${siteId}/lists/${listId}/items/${listItemId}/fields`)
|
||||
.patch(itemInput);
|
||||
},
|
||||
});
|
||||
@@ -0,0 +1,46 @@
|
||||
import { microsoftSharePointAuth } from '../../';
|
||||
import { createAction, Property } from '@activepieces/pieces-framework';
|
||||
import { microsoftSharePointCommon } from '../common';
|
||||
import { Client } from '@microsoft/microsoft-graph-client';
|
||||
|
||||
export const uploadFile = createAction({
|
||||
auth: microsoftSharePointAuth,
|
||||
name: 'microsoft_sharepoint_upload_file',
|
||||
displayName: 'Upload File',
|
||||
description: 'Uploads a new file at path you specify.',
|
||||
props: {
|
||||
siteId: microsoftSharePointCommon.siteId,
|
||||
driveId: microsoftSharePointCommon.driveId,
|
||||
file: Property.File({
|
||||
displayName: "File",
|
||||
description: "The file or url you want to upload",
|
||||
required: true,
|
||||
}),
|
||||
parentFolder: Property.ShortText({
|
||||
displayName: 'Parent Folder',
|
||||
description: `Parent folder, like "/demo/" or "/docs/assignment/".Leave it default if you want to create folder at the root (**CHANGE THIS BACK//**) level.`,
|
||||
required: true,
|
||||
defaultValue: '/',
|
||||
}),
|
||||
fileName: Property.ShortText({
|
||||
displayName: 'File Name',
|
||||
required: true,
|
||||
}),
|
||||
},
|
||||
async run(context) {
|
||||
const { siteId, driveId, file, parentFolder, fileName } = context.propsValue;
|
||||
|
||||
const client = Client.initWithMiddleware({
|
||||
authProvider: {
|
||||
getAccessToken: () => Promise.resolve(context.auth.access_token),
|
||||
},
|
||||
});
|
||||
|
||||
const parentIdResponse = await client.api(`/sites/${siteId}/drives/${driveId}/root:${parentFolder}`).get()
|
||||
const parentId = parentIdResponse.id ?? "test";
|
||||
|
||||
const uploadResponse = await client.api(`/sites/${siteId}/drives/${driveId}/items/${parentId}:/${fileName}:/content`).put(file.data)
|
||||
|
||||
return uploadResponse
|
||||
}
|
||||
});
|
||||
@@ -0,0 +1,437 @@
|
||||
import { microsoftSharePointAuth } from '../../';
|
||||
import {
|
||||
DropdownOption,
|
||||
DynamicPropsValue,
|
||||
PiecePropValueSchema,
|
||||
Property,
|
||||
} from '@activepieces/pieces-framework';
|
||||
import { Client, PageCollection } from '@microsoft/microsoft-graph-client';
|
||||
import {
|
||||
Site,
|
||||
Drive,
|
||||
List,
|
||||
ListItem,
|
||||
ColumnDefinition,
|
||||
DriveItem,
|
||||
} from '@microsoft/microsoft-graph-types';
|
||||
|
||||
|
||||
const createDriveDropdown = (params: {
|
||||
displayName: string;
|
||||
refreshers: string[];
|
||||
}) =>
|
||||
Property.Dropdown({
|
||||
auth: microsoftSharePointAuth,
|
||||
displayName: params.displayName,
|
||||
required: true,
|
||||
refreshers: params.refreshers,
|
||||
options: async ({ auth, ...props }) => {
|
||||
const siteId = props[params.refreshers[0]];
|
||||
|
||||
if (!auth || !siteId) {
|
||||
return {
|
||||
disabled: true,
|
||||
placeholder: 'Please select a site first.',
|
||||
options: [],
|
||||
};
|
||||
}
|
||||
const authValue = auth as PiecePropValueSchema<
|
||||
typeof microsoftSharePointAuth
|
||||
>;
|
||||
const client = Client.initWithMiddleware({
|
||||
authProvider: {
|
||||
getAccessToken: () => Promise.resolve(authValue.access_token),
|
||||
},
|
||||
});
|
||||
|
||||
const options: DropdownOption<string>[] = [];
|
||||
let response: PageCollection = await client
|
||||
.api(`/sites/${siteId}/drives`)
|
||||
.select('id,name')
|
||||
.get();
|
||||
|
||||
while (response.value.length > 0) {
|
||||
for (const drive of response.value as Drive[]) {
|
||||
options.push({ label: drive.name!, value: drive.id! });
|
||||
}
|
||||
if (response['@odata.nextLink']) {
|
||||
response = await client.api(response['@odata.nextLink']).get();
|
||||
} else {
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
return {
|
||||
disabled: false,
|
||||
options,
|
||||
};
|
||||
},
|
||||
});
|
||||
|
||||
export const microsoftSharePointCommon = {
|
||||
siteId: Property.Dropdown({
|
||||
auth: microsoftSharePointAuth,
|
||||
displayName: 'Site',
|
||||
required: true,
|
||||
refreshers: [],
|
||||
options: async ({ auth }) => {
|
||||
if (!auth) {
|
||||
return {
|
||||
disabled: true,
|
||||
placeholder: 'Please connect your account first.',
|
||||
options: [],
|
||||
};
|
||||
}
|
||||
const authValue = auth as PiecePropValueSchema<
|
||||
typeof microsoftSharePointAuth
|
||||
>;
|
||||
const client = Client.initWithMiddleware({
|
||||
authProvider: {
|
||||
getAccessToken: () => Promise.resolve(authValue.access_token),
|
||||
},
|
||||
});
|
||||
const options: DropdownOption<string>[] = [];
|
||||
let response: PageCollection = await client
|
||||
.api('/sites?search=*&$select=displayName,id,name')
|
||||
.get();
|
||||
while (response.value.length > 0) {
|
||||
for (const site of response.value as Site[]) {
|
||||
options.push({ label: site.displayName!, value: site.id! });
|
||||
}
|
||||
if (response['@odata.nextLink']) {
|
||||
response = await client.api(response['@odata.nextLink']).get();
|
||||
} else {
|
||||
break;
|
||||
}
|
||||
}
|
||||
return {
|
||||
disabled: false,
|
||||
options,
|
||||
};
|
||||
},
|
||||
}),
|
||||
|
||||
|
||||
driveId: createDriveDropdown({
|
||||
displayName: 'Drive',
|
||||
refreshers: ['siteId'],
|
||||
}),
|
||||
|
||||
|
||||
createDriveDropdown,
|
||||
|
||||
itemId: Property.Dropdown({
|
||||
auth: microsoftSharePointAuth,
|
||||
displayName: 'Source File or Folder',
|
||||
required: true,
|
||||
refreshers: ['siteId', 'driveId'],
|
||||
options: async ({ auth, siteId, driveId }) => {
|
||||
if (!auth || !siteId || !driveId) {
|
||||
return {
|
||||
disabled: true,
|
||||
placeholder: 'Please select a site and drive first.',
|
||||
options: [],
|
||||
};
|
||||
}
|
||||
const authValue = auth as PiecePropValueSchema<
|
||||
typeof microsoftSharePointAuth
|
||||
>;
|
||||
const client = Client.initWithMiddleware({
|
||||
authProvider: {
|
||||
getAccessToken: () => Promise.resolve(authValue.access_token),
|
||||
},
|
||||
});
|
||||
|
||||
const options: DropdownOption<string>[] = [];
|
||||
let response: PageCollection = await client
|
||||
.api(
|
||||
`/sites/${siteId}/drives/${driveId}/root/children?$select=id,name,folder,file`
|
||||
)
|
||||
.get();
|
||||
|
||||
while (response.value.length > 0) {
|
||||
for (const item of response.value as DriveItem[]) {
|
||||
const prefix = item.folder ? '[Folder] ' : '[File] ';
|
||||
options.push({
|
||||
label: prefix + item.name!,
|
||||
value: item.id!,
|
||||
});
|
||||
}
|
||||
if (response['@odata.nextLink']) {
|
||||
response = await client.api(response['@odata.nextLink']).get();
|
||||
} else {
|
||||
break;
|
||||
}
|
||||
}
|
||||
return { disabled: false, options };
|
||||
},
|
||||
}),
|
||||
|
||||
|
||||
destinationFolderId: Property.Dropdown({
|
||||
auth: microsoftSharePointAuth,
|
||||
displayName: 'Destination Folder',
|
||||
description: 'The folder to copy the item into. Defaults to the root of the drive.',
|
||||
required: false,
|
||||
refreshers: ['destination_site_id', 'destination_drive_id'],
|
||||
options: async ({ auth, ...props }) => {
|
||||
const siteId = props['destination_site_id'];
|
||||
const driveId = props['destination_drive_id'];
|
||||
|
||||
if (!auth || !siteId || !driveId) {
|
||||
return {
|
||||
disabled: true,
|
||||
placeholder: 'Select a destination site and drive first.',
|
||||
options: [],
|
||||
};
|
||||
}
|
||||
const authValue = auth as PiecePropValueSchema<
|
||||
typeof microsoftSharePointAuth
|
||||
>;
|
||||
const client = Client.initWithMiddleware({
|
||||
authProvider: {
|
||||
getAccessToken: () => Promise.resolve(authValue.access_token),
|
||||
},
|
||||
});
|
||||
|
||||
const options: DropdownOption<string>[] = [];
|
||||
let response: PageCollection = await client
|
||||
.api(
|
||||
`/sites/${siteId}/drives/${driveId}/root/children?$filter=folder ne null&$select=id,name`
|
||||
)
|
||||
.get();
|
||||
|
||||
while (response.value.length > 0) {
|
||||
for (const item of response.value as DriveItem[]) {
|
||||
options.push({
|
||||
label: item.name!,
|
||||
value: item.id!,
|
||||
});
|
||||
}
|
||||
if (response['@odata.nextLink']) {
|
||||
response = await client.api(response['@odata.nextLink']).get();
|
||||
} else {
|
||||
break;
|
||||
}
|
||||
}
|
||||
return { disabled: false, options };
|
||||
},
|
||||
}),
|
||||
|
||||
listId: Property.Dropdown({
|
||||
auth: microsoftSharePointAuth,
|
||||
displayName: 'List',
|
||||
required: true,
|
||||
refreshers: ['siteId'],
|
||||
options: async ({ auth, siteId }) => {
|
||||
if (!auth || !siteId) {
|
||||
return {
|
||||
disabled: true,
|
||||
placeholder: 'Please select a site first.',
|
||||
options: [],
|
||||
};
|
||||
}
|
||||
const authValue = auth as PiecePropValueSchema<
|
||||
typeof microsoftSharePointAuth
|
||||
>;
|
||||
const client = Client.initWithMiddleware({
|
||||
authProvider: {
|
||||
getAccessToken: () => Promise.resolve(authValue.access_token),
|
||||
},
|
||||
});
|
||||
const options: DropdownOption<string>[] = [];
|
||||
let response: PageCollection = await client
|
||||
.api(`/sites/${siteId}/lists`)
|
||||
.select('displayName,id')
|
||||
.get();
|
||||
while (response.value.length > 0) {
|
||||
for (const list of response.value as List[]) {
|
||||
options.push({ label: list.displayName!, value: list.id! });
|
||||
}
|
||||
if (response['@odata.nextLink']) {
|
||||
response = await client.api(response['@odata.nextLink']).get();
|
||||
} else {
|
||||
break;
|
||||
}
|
||||
}
|
||||
return {
|
||||
disabled: false,
|
||||
options,
|
||||
};
|
||||
},
|
||||
}),
|
||||
|
||||
listColumns: Property.DynamicProperties({
|
||||
auth: microsoftSharePointAuth,
|
||||
displayName: 'List Columns',
|
||||
refreshers: ['siteId', 'listId'],
|
||||
required: true,
|
||||
props: async ({ auth, siteId, listId }) => {
|
||||
if (!auth || !siteId || !listId) return {};
|
||||
const fields: DynamicPropsValue = {};
|
||||
const authValue = auth as PiecePropValueSchema<
|
||||
typeof microsoftSharePointAuth
|
||||
>;
|
||||
const client = Client.initWithMiddleware({
|
||||
authProvider: {
|
||||
getAccessToken: () => Promise.resolve(authValue.access_token),
|
||||
},
|
||||
});
|
||||
const columns: ColumnDefinition[] = [];
|
||||
let response: PageCollection = await client
|
||||
.api(`/sites/${siteId}/lists/${listId}/columns`)
|
||||
.get();
|
||||
while (response.value.length > 0) {
|
||||
for (const column of response.value as ColumnDefinition[]) {
|
||||
if (!column.readOnly) {
|
||||
columns.push(column);
|
||||
}
|
||||
}
|
||||
if (response['@odata.nextLink']) {
|
||||
response = await client.api(response['@odata.nextLink']).get();
|
||||
} else {
|
||||
break;
|
||||
}
|
||||
}
|
||||
for (const column of columns) {
|
||||
const params = {
|
||||
displayName: column.displayName!,
|
||||
description: column.description ?? '',
|
||||
required: false,
|
||||
};
|
||||
if (column.boolean) {
|
||||
fields[column.name!] = Property.Checkbox(params);
|
||||
} else if (column.text) {
|
||||
fields[column.name!] = Property.LongText(params);
|
||||
} else if (column.dateTime) {
|
||||
fields[column.name!] = Property.DateTime(params);
|
||||
} else if (column.choice) {
|
||||
if (column.choice.displayAs === 'checkBoxes') {
|
||||
fields[column.name!] = Property.StaticMultiSelectDropdown({
|
||||
...params,
|
||||
options: {
|
||||
disabled: false,
|
||||
options: column.choice?.choices
|
||||
? column.choice.choices.map((choice: string) => ({
|
||||
label: choice,
|
||||
value: choice,
|
||||
}))
|
||||
: [],
|
||||
},
|
||||
});
|
||||
} else {
|
||||
fields[column.name!] = Property.StaticDropdown({
|
||||
...params,
|
||||
options: {
|
||||
disabled: false,
|
||||
options: column.choice?.choices
|
||||
? column.choice.choices.map((choice: string) => ({
|
||||
label: choice,
|
||||
value: choice,
|
||||
}))
|
||||
: [],
|
||||
},
|
||||
});
|
||||
}
|
||||
} else if (column.number) {
|
||||
fields[column.name!] = Property.Number(params);
|
||||
} else if (column.currency) {
|
||||
fields[column.name!] = Property.Number(params);
|
||||
}
|
||||
}
|
||||
return fields;
|
||||
},
|
||||
}),
|
||||
|
||||
listItemId: Property.Dropdown({
|
||||
auth: microsoftSharePointAuth,
|
||||
displayName: 'List Item',
|
||||
required: true,
|
||||
refreshers: ['siteId', 'listId'],
|
||||
options: async ({ auth, siteId, listId }) => {
|
||||
if (!auth || !siteId || !listId) {
|
||||
return {
|
||||
disabled: true,
|
||||
placeholder: 'Please select a site and list first.',
|
||||
options: [],
|
||||
};
|
||||
}
|
||||
const authValue = auth as PiecePropValueSchema<
|
||||
typeof microsoftSharePointAuth
|
||||
>;
|
||||
const client = Client.initWithMiddleware({
|
||||
authProvider: {
|
||||
getAccessToken: () => Promise.resolve(authValue.access_token),
|
||||
},
|
||||
});
|
||||
const options: DropdownOption<string>[] = [];
|
||||
let response: PageCollection = await client
|
||||
.api(
|
||||
`/sites/${siteId}/lists/${listId}/items?$select=id&$expand=fields($select=Title)`
|
||||
)
|
||||
.get();
|
||||
while (response.value.length > 0) {
|
||||
for (const item of response.value as ListItem[]) {
|
||||
options.push({
|
||||
label: (item.fields as any).Title ?? `Item ${item.id}`,
|
||||
value: item.id!,
|
||||
});
|
||||
}
|
||||
if (response['@odata.nextLink']) {
|
||||
response = await client.api(response['@odata.nextLink']).get();
|
||||
} else {
|
||||
break;
|
||||
}
|
||||
}
|
||||
return {
|
||||
disabled: false,
|
||||
options,
|
||||
};
|
||||
},
|
||||
}),
|
||||
|
||||
pageId: Property.Dropdown({
|
||||
auth: microsoftSharePointAuth,
|
||||
displayName: 'Page',
|
||||
required: true,
|
||||
refreshers: ['siteId'],
|
||||
options: async ({ auth, siteId }) => {
|
||||
if (!auth || !siteId) {
|
||||
return {
|
||||
disabled: true,
|
||||
placeholder: 'Please select a site first.',
|
||||
options: [],
|
||||
};
|
||||
}
|
||||
const authValue = auth as PiecePropValueSchema<
|
||||
typeof microsoftSharePointAuth
|
||||
>;
|
||||
const client = Client.initWithMiddleware({
|
||||
authProvider: {
|
||||
getAccessToken: () => Promise.resolve(authValue.access_token),
|
||||
},
|
||||
});
|
||||
const options: DropdownOption<string>[] = [];
|
||||
let response: PageCollection = await client
|
||||
.api(`/sites/${siteId}/pages?$select=id,title`)
|
||||
.get();
|
||||
while (response.value.length > 0) {
|
||||
for (const page of response.value as any[]) {
|
||||
options.push({
|
||||
label: page.title ?? `Page ${page.id}`,
|
||||
value: page.id!,
|
||||
});
|
||||
}
|
||||
if (response['@odata.nextLink']) {
|
||||
response = await client.api(response['@odata.nextLink']).get();
|
||||
} else {
|
||||
break;
|
||||
}
|
||||
}
|
||||
return {
|
||||
disabled: false,
|
||||
options,
|
||||
};
|
||||
},
|
||||
}),
|
||||
};
|
||||
@@ -0,0 +1,168 @@
|
||||
import { microsoftSharePointAuth } from '../../';
|
||||
import {
|
||||
createTrigger,
|
||||
TriggerStrategy,
|
||||
Property,
|
||||
DropdownOption,
|
||||
PiecePropValueSchema,
|
||||
} from '@activepieces/pieces-framework';
|
||||
import { microsoftSharePointCommon } from '../common';
|
||||
import { Client, PageCollection } from '@microsoft/microsoft-graph-client';
|
||||
import { DriveItem } from '@microsoft/microsoft-graph-types';
|
||||
|
||||
const clientState = 'activepieces_sharepoint_trigger';
|
||||
|
||||
export const newFileInFolderTrigger = createTrigger({
|
||||
auth: microsoftSharePointAuth,
|
||||
name: 'new_file_in_folder',
|
||||
displayName: 'New File in Folder',
|
||||
description: 'Fires when a new file is created or added in a specific folder.',
|
||||
props: {
|
||||
siteId: microsoftSharePointCommon.siteId,
|
||||
driveId: microsoftSharePointCommon.driveId,
|
||||
folderId: Property.Dropdown({
|
||||
auth: microsoftSharePointAuth,
|
||||
displayName: 'Folder to Monitor',
|
||||
description: 'The folder to watch for new files. Select "Root Folder" for the top-level folder of the drive.',
|
||||
required: true,
|
||||
refreshers: ['siteId', 'driveId'],
|
||||
options: async ({ auth, siteId, driveId }) => {
|
||||
if (!auth || !siteId || !driveId) {
|
||||
return {
|
||||
disabled: true,
|
||||
placeholder: 'Select a site and drive first.',
|
||||
options: [],
|
||||
};
|
||||
}
|
||||
const authValue = auth as PiecePropValueSchema<
|
||||
typeof microsoftSharePointAuth
|
||||
>;
|
||||
const client = Client.initWithMiddleware({
|
||||
authProvider: {
|
||||
getAccessToken: () => Promise.resolve(authValue.access_token),
|
||||
},
|
||||
});
|
||||
const options: DropdownOption<string>[] = [
|
||||
{ label: 'Root Folder', value: 'root' },
|
||||
];
|
||||
let response: PageCollection = await client
|
||||
.api(
|
||||
`/drives/${driveId}/root/children?$filter=folder ne null&$select=id,name`
|
||||
)
|
||||
.get();
|
||||
while (response.value.length > 0) {
|
||||
for (const item of response.value as DriveItem[]) {
|
||||
options.push({ label: item.name!, value: item.id! });
|
||||
}
|
||||
if (response['@odata.nextLink']) {
|
||||
response = await client.api(response['@odata.nextLink']).get();
|
||||
} else {
|
||||
break;
|
||||
}
|
||||
}
|
||||
return { disabled: false, options };
|
||||
},
|
||||
}),
|
||||
},
|
||||
type: TriggerStrategy.WEBHOOK,
|
||||
|
||||
sampleData: {
|
||||
"id": "01DRYVE_ID_GOES_HERE",
|
||||
"name": "Example-Report.docx",
|
||||
"webUrl": "https://contoso.sharepoint.com/Shared%20Documents/Example-Report.docx",
|
||||
"size": 12345,
|
||||
"createdDateTime": "2025-09-26T14:26:12Z",
|
||||
"lastModifiedDateTime": "2025-09-26T14:26:12Z",
|
||||
"file": {
|
||||
"mimeType": "application/vnd.openxmlformats-officedocument.wordprocessingml.document"
|
||||
},
|
||||
"parentReference": {
|
||||
"driveId": "DRIVE_ID_HERE",
|
||||
"id": "PARENT_FOLDER_ID_HERE",
|
||||
"path": "/drives/DRIVE_ID_HERE/root:/Shared Documents"
|
||||
}
|
||||
},
|
||||
|
||||
async onEnable(context) {
|
||||
const { siteId, driveId, folderId } = context.propsValue;
|
||||
|
||||
const client = Client.initWithMiddleware({
|
||||
authProvider: {
|
||||
getAccessToken: () => Promise.resolve(context.auth.access_token),
|
||||
},
|
||||
});
|
||||
|
||||
try {
|
||||
const effectiveFolderId = folderId === 'root'
|
||||
? (await client.api(`/drives/${driveId}/root`).get()).id
|
||||
: folderId;
|
||||
|
||||
const expirationDateTime = new Date();
|
||||
expirationDateTime.setDate(expirationDateTime.getDate() + 2);
|
||||
|
||||
const subscription = await client.api('/subscriptions').post({
|
||||
changeType: 'created',
|
||||
notificationUrl: context.webhookUrl,
|
||||
resource: `/sites/${siteId}/drive/items/${effectiveFolderId}/children`,
|
||||
expirationDateTime: expirationDateTime.toISOString(),
|
||||
clientState: clientState,
|
||||
});
|
||||
|
||||
await context.store.put('subscriptionId', subscription.id);
|
||||
} catch (error: any) {
|
||||
throw new Error(`Failed to create subscription: ${error.message || 'Unknown error'}`);
|
||||
}
|
||||
},
|
||||
|
||||
async onDisable(context) {
|
||||
const subscriptionId = await context.store.get<string>('subscriptionId');
|
||||
if (subscriptionId) {
|
||||
const client = Client.initWithMiddleware({
|
||||
authProvider: {
|
||||
getAccessToken: () => Promise.resolve(context.auth.access_token),
|
||||
},
|
||||
});
|
||||
try {
|
||||
await client.api(`/subscriptions/${subscriptionId}`).delete();
|
||||
} catch (error) {
|
||||
console.warn(`Error deleting subscription ${subscriptionId}:`, error);
|
||||
}
|
||||
}
|
||||
await context.store.delete('subscriptionId');
|
||||
},
|
||||
|
||||
async run(context) {
|
||||
|
||||
const notifications = (context.payload.body as { value: any[] })?.value;
|
||||
|
||||
if (!notifications || !Array.isArray(notifications)) {
|
||||
return [];
|
||||
}
|
||||
|
||||
const validNotifications = notifications.filter(
|
||||
(notif) => notif.clientState === clientState
|
||||
);
|
||||
if (validNotifications.length === 0) {
|
||||
return [];
|
||||
}
|
||||
|
||||
const client = Client.initWithMiddleware({
|
||||
authProvider: {
|
||||
getAccessToken: () => Promise.resolve(context.auth.access_token),
|
||||
},
|
||||
});
|
||||
|
||||
const newFilePayloads = [];
|
||||
for (const notification of validNotifications) {
|
||||
try {
|
||||
const newFile = await client.api(notification.resource).get();
|
||||
if (newFile.file) {
|
||||
newFilePayloads.push(newFile);
|
||||
}
|
||||
} catch (error) {
|
||||
console.error('Error fetching file from notification:', error);
|
||||
}
|
||||
}
|
||||
return newFilePayloads;
|
||||
},
|
||||
});
|
||||
@@ -0,0 +1,169 @@
|
||||
import { microsoftSharePointAuth } from '../../';
|
||||
import {
|
||||
createTrigger,
|
||||
TriggerStrategy,
|
||||
Property,
|
||||
DropdownOption,
|
||||
PiecePropValueSchema,
|
||||
} from '@activepieces/pieces-framework';
|
||||
import { microsoftSharePointCommon } from '../common';
|
||||
import { Client, PageCollection } from '@microsoft/microsoft-graph-client';
|
||||
import { DriveItem } from '@microsoft/microsoft-graph-types';
|
||||
|
||||
const clientState = 'activepieces_sharepoint_subfolder_trigger';
|
||||
|
||||
export const newFileInSubfoldersTrigger = createTrigger({
|
||||
auth: microsoftSharePointAuth,
|
||||
name: 'new_file_in_subfolders',
|
||||
displayName: 'New File in Subfolders',
|
||||
description: 'Fires when a new file is added anywhere in the first-level subfolders of a folder. Note: This trigger will not monitor subfolders created after the flow is activated.',
|
||||
props: {
|
||||
siteId: microsoftSharePointCommon.siteId,
|
||||
driveId: microsoftSharePointCommon.driveId,
|
||||
parentFolderId: Property.Dropdown({
|
||||
auth: microsoftSharePointAuth,
|
||||
displayName: 'Parent Folder',
|
||||
description: 'The parent folder whose subfolders you want to monitor.',
|
||||
required: true,
|
||||
refreshers: ['siteId', 'driveId'],
|
||||
options: async ({ auth, siteId, driveId }) => {
|
||||
if (!auth || !siteId || !driveId) {
|
||||
return {
|
||||
disabled: true,
|
||||
placeholder: 'Select a site and drive first.',
|
||||
options: [],
|
||||
};
|
||||
}
|
||||
const authValue = auth as PiecePropValueSchema<
|
||||
typeof microsoftSharePointAuth
|
||||
>;
|
||||
const client = Client.initWithMiddleware({
|
||||
authProvider: {
|
||||
getAccessToken: () => Promise.resolve(authValue.access_token),
|
||||
},
|
||||
});
|
||||
const options: DropdownOption<string>[] = [
|
||||
{ label: 'Root Folder', value: 'root' },
|
||||
];
|
||||
let response: PageCollection = await client
|
||||
.api(
|
||||
`/drives/${driveId}/root/children?$filter=folder ne null&$select=id,name`
|
||||
)
|
||||
.get();
|
||||
while (response.value.length > 0) {
|
||||
for (const item of response.value as DriveItem[]) {
|
||||
options.push({ label: item.name!, value: item.id! });
|
||||
}
|
||||
if (response['@odata.nextLink']) {
|
||||
response = await client.api(response['@odata.nextLink']).get();
|
||||
} else {
|
||||
break;
|
||||
}
|
||||
}
|
||||
return { disabled: false, options };
|
||||
},
|
||||
}),
|
||||
},
|
||||
type: TriggerStrategy.WEBHOOK,
|
||||
|
||||
sampleData: {
|
||||
"id": "01DRYVE_ID_GOES_HERE",
|
||||
"name": "New-File-In-Subfolder.pdf",
|
||||
"webUrl": "https://contoso.sharepoint.com/Shared%20Documents/SubfolderA/New-File-In-Subfolder.pdf",
|
||||
"size": 54321,
|
||||
"createdDateTime": "2025-09-26T14:30:00Z",
|
||||
"lastModifiedDateTime": "2025-09-26T14:30:00Z",
|
||||
"file": { "mimeType": "application/pdf" },
|
||||
"parentReference": { "id": "SUBFOLDER_ID_HERE" }
|
||||
},
|
||||
|
||||
async onEnable(context) {
|
||||
const { siteId, driveId, parentFolderId } = context.propsValue;
|
||||
|
||||
const client = Client.initWithMiddleware({
|
||||
authProvider: {
|
||||
getAccessToken: () => Promise.resolve(context.auth.access_token),
|
||||
},
|
||||
});
|
||||
|
||||
try {
|
||||
const effectiveParentId = parentFolderId === 'root'
|
||||
? (await client.api(`/drives/${driveId}/root`).get()).id
|
||||
: parentFolderId;
|
||||
|
||||
const subfoldersResponse = await client.api(`/drives/${driveId}/items/${effectiveParentId}/children?$filter=folder ne null&$select=id`).get();
|
||||
const subfolders = subfoldersResponse.value as DriveItem[];
|
||||
|
||||
const expirationDateTime = new Date();
|
||||
expirationDateTime.setDate(expirationDateTime.getDate() + 2);
|
||||
|
||||
const subscriptionPromises = subfolders.map(folder =>
|
||||
client.api('/subscriptions').post({
|
||||
changeType: 'created',
|
||||
notificationUrl: context.webhookUrl,
|
||||
resource: `/sites/${siteId}/drive/items/${folder.id}/children`,
|
||||
expirationDateTime: expirationDateTime.toISOString(),
|
||||
clientState: clientState,
|
||||
})
|
||||
);
|
||||
|
||||
const settledSubscriptions = await Promise.allSettled(subscriptionPromises);
|
||||
const subscriptionIds = settledSubscriptions
|
||||
.filter(res => res.status === 'fulfilled')
|
||||
.map(res => (res as PromiseFulfilledResult<any>).value.id);
|
||||
|
||||
await context.store.put('subscriptionIds', subscriptionIds);
|
||||
} catch (error: any) {
|
||||
throw new Error(`Failed to create subscriptions: ${error.message || 'Unknown error'}`);
|
||||
}
|
||||
},
|
||||
|
||||
async onDisable(context) {
|
||||
const subscriptionIds = await context.store.get<string[]>('subscriptionIds');
|
||||
if (subscriptionIds && subscriptionIds.length > 0) {
|
||||
const client = Client.initWithMiddleware({
|
||||
authProvider: {
|
||||
getAccessToken: () => Promise.resolve(context.auth.access_token),
|
||||
},
|
||||
});
|
||||
const deletionPromises = subscriptionIds.map(id =>
|
||||
client.api(`/subscriptions/${id}`).delete().catch(err => console.error(`Failed to delete subscription ${id}:`, err))
|
||||
);
|
||||
await Promise.allSettled(deletionPromises);
|
||||
}
|
||||
await context.store.delete('subscriptionIds');
|
||||
},
|
||||
|
||||
async run(context) {
|
||||
const notifications = (context.payload.body as { value: any[] })?.value;
|
||||
if (!notifications || !Array.isArray(notifications)) {
|
||||
return [];
|
||||
}
|
||||
|
||||
const validNotifications = notifications.filter(
|
||||
(notif) => notif.clientState === clientState
|
||||
);
|
||||
if (validNotifications.length === 0) {
|
||||
return [];
|
||||
}
|
||||
|
||||
const client = Client.initWithMiddleware({
|
||||
authProvider: {
|
||||
getAccessToken: () => Promise.resolve(context.auth.access_token),
|
||||
},
|
||||
});
|
||||
|
||||
const newFilePayloads = [];
|
||||
for (const notification of validNotifications) {
|
||||
try {
|
||||
const newFile = await client.api(notification.resource).get();
|
||||
if (newFile.file) {
|
||||
newFilePayloads.push(newFile);
|
||||
}
|
||||
} catch (error) {
|
||||
console.error('Error fetching file from notification:', error);
|
||||
}
|
||||
}
|
||||
return newFilePayloads;
|
||||
},
|
||||
});
|
||||
@@ -0,0 +1,104 @@
|
||||
import { microsoftSharePointAuth } from '../../';
|
||||
import {
|
||||
createTrigger,
|
||||
TriggerStrategy,
|
||||
PiecePropValueSchema,
|
||||
AppConnectionValueForAuthProperty,
|
||||
} from '@activepieces/pieces-framework';
|
||||
import { microsoftSharePointCommon } from '../common';
|
||||
import { Client, PageCollection } from '@microsoft/microsoft-graph-client';
|
||||
import { DedupeStrategy, Polling, pollingHelper } from '@activepieces/pieces-common';
|
||||
import dayjs from 'dayjs';
|
||||
import { ListItem } from '@microsoft/microsoft-graph-types';
|
||||
|
||||
type Props = {
|
||||
siteId: string;
|
||||
listId: string;
|
||||
};
|
||||
|
||||
const polling: Polling<AppConnectionValueForAuthProperty<typeof microsoftSharePointAuth>, Props> = {
|
||||
strategy: DedupeStrategy.TIMEBASED,
|
||||
items: async ({ auth, propsValue, lastFetchEpochMS }) => {
|
||||
const { siteId, listId } = propsValue;
|
||||
|
||||
const client = Client.initWithMiddleware({
|
||||
authProvider: {
|
||||
getAccessToken: () => Promise.resolve(auth.access_token),
|
||||
},
|
||||
});
|
||||
|
||||
const items = [];
|
||||
|
||||
const filter =
|
||||
lastFetchEpochMS === 0 ? `$filter=createdDateTime gt ${dayjs().toISOString()}` : '$top=10';
|
||||
|
||||
|
||||
let response: PageCollection = await client
|
||||
.api(`/sites/${siteId}/lists/${listId}/items?${filter}`)
|
||||
.expand('fields')
|
||||
.get();
|
||||
|
||||
if (lastFetchEpochMS === 0) {
|
||||
for (const message of response.value as ListItem[]) {
|
||||
items.push(message);
|
||||
}
|
||||
} else {
|
||||
while (response.value.length > 0) {
|
||||
for (const message of response.value as ListItem[]) {
|
||||
items.push(message);
|
||||
}
|
||||
|
||||
if (response['@odata.nextLink']) {
|
||||
response = await client.api(response['@odata.nextLink']).get();
|
||||
} else {
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
items.sort((a, b) => {
|
||||
const aDate = dayjs(a.createdDateTime);
|
||||
const bDate = dayjs(b.createdDateTime);
|
||||
return bDate.diff(aDate);
|
||||
});
|
||||
|
||||
return items.map((item) => ({
|
||||
epochMilliSeconds: dayjs(item.createdDateTime).valueOf(),
|
||||
data: item,
|
||||
}));
|
||||
},
|
||||
};
|
||||
|
||||
export const newListItemTrigger = createTrigger({
|
||||
auth: microsoftSharePointAuth,
|
||||
name: 'new_list_item',
|
||||
displayName: 'New List Item',
|
||||
description: 'Triggers when a new item is created in a SharePoint list.',
|
||||
props: {
|
||||
siteId: microsoftSharePointCommon.siteId,
|
||||
listId: microsoftSharePointCommon.listId,
|
||||
},
|
||||
type: TriggerStrategy.POLLING,
|
||||
|
||||
sampleData: undefined,
|
||||
async onEnable(context) {
|
||||
await pollingHelper.onEnable(polling, {
|
||||
auth: context.auth,
|
||||
store: context.store,
|
||||
propsValue: context.propsValue,
|
||||
});
|
||||
},
|
||||
async onDisable(context) {
|
||||
await pollingHelper.onDisable(polling, {
|
||||
auth: context.auth,
|
||||
store: context.store,
|
||||
propsValue: context.propsValue,
|
||||
});
|
||||
},
|
||||
async test(context) {
|
||||
return await pollingHelper.test(polling, context);
|
||||
},
|
||||
async run(context) {
|
||||
return await pollingHelper.poll(polling, context);
|
||||
},
|
||||
});
|
||||
@@ -0,0 +1,95 @@
|
||||
import { microsoftSharePointAuth } from '../../';
|
||||
import {
|
||||
createTrigger,
|
||||
TriggerStrategy,
|
||||
PiecePropValueSchema,
|
||||
AppConnectionValueForAuthProperty,
|
||||
} from '@activepieces/pieces-framework';
|
||||
import { microsoftSharePointCommon } from '../common';
|
||||
import { Client, PageCollection } from '@microsoft/microsoft-graph-client';
|
||||
import { DedupeStrategy, Polling, pollingHelper } from '@activepieces/pieces-common';
|
||||
import dayjs from 'dayjs';
|
||||
import { List } from '@microsoft/microsoft-graph-types';
|
||||
type Props = {
|
||||
siteId: string;
|
||||
};
|
||||
|
||||
const polling: Polling<AppConnectionValueForAuthProperty<typeof microsoftSharePointAuth>, Props> = {
|
||||
strategy: DedupeStrategy.TIMEBASED,
|
||||
items: async ({ auth, propsValue, lastFetchEpochMS }) => {
|
||||
const { siteId } = propsValue;
|
||||
const isTestMode = lastFetchEpochMS === 0;
|
||||
|
||||
const client = Client.initWithMiddleware({
|
||||
authProvider: {
|
||||
getAccessToken: () => Promise.resolve(auth.access_token),
|
||||
},
|
||||
});
|
||||
|
||||
const lists = [];
|
||||
|
||||
let response: PageCollection = await client.api(`/sites/${siteId}/lists`).get();
|
||||
|
||||
let stop = false;
|
||||
|
||||
while (!stop && response.value.length > 0) {
|
||||
for (const item of response.value as List[]) {
|
||||
if (isTestMode) {
|
||||
lists.push(item);
|
||||
if (lists.length >= 10) {
|
||||
stop = true;
|
||||
}
|
||||
continue;
|
||||
}
|
||||
lists.push(item);
|
||||
}
|
||||
|
||||
if (stop || !response['@odata.nextLink']) break;
|
||||
|
||||
response = await client.api(response['@odata.nextLink']).get();
|
||||
}
|
||||
|
||||
lists.sort((a, b) => {
|
||||
const aDate = dayjs(a.createdDateTime);
|
||||
const bDate = dayjs(b.createdDateTime);
|
||||
return bDate.diff(aDate);
|
||||
});
|
||||
|
||||
return lists.map((list) => ({
|
||||
epochMilliSeconds: dayjs(list.createdDateTime).valueOf(),
|
||||
data: list,
|
||||
}));
|
||||
},
|
||||
};
|
||||
export const newListTrigger = createTrigger({
|
||||
auth: microsoftSharePointAuth,
|
||||
name: 'new_list',
|
||||
displayName: 'New List',
|
||||
description: 'Triggers when a new list is created in a site.',
|
||||
props: {
|
||||
siteId: microsoftSharePointCommon.siteId,
|
||||
},
|
||||
type: TriggerStrategy.POLLING,
|
||||
|
||||
sampleData: undefined,
|
||||
async onEnable(context) {
|
||||
await pollingHelper.onEnable(polling, {
|
||||
auth: context.auth,
|
||||
store: context.store,
|
||||
propsValue: context.propsValue,
|
||||
});
|
||||
},
|
||||
async onDisable(context) {
|
||||
await pollingHelper.onDisable(polling, {
|
||||
auth: context.auth,
|
||||
store: context.store,
|
||||
propsValue: context.propsValue,
|
||||
});
|
||||
},
|
||||
async test(context) {
|
||||
return await pollingHelper.test(polling, context);
|
||||
},
|
||||
async run(context) {
|
||||
return await pollingHelper.poll(polling, context);
|
||||
},
|
||||
});
|
||||
@@ -0,0 +1,170 @@
|
||||
import { microsoftSharePointAuth } from '../../';
|
||||
import {
|
||||
createTrigger,
|
||||
TriggerStrategy,
|
||||
Property,
|
||||
DropdownOption,
|
||||
AppConnectionValueForAuthProperty,
|
||||
} from '@activepieces/pieces-framework';
|
||||
import { microsoftSharePointCommon } from '../common';
|
||||
import { Client, PageCollection } from '@microsoft/microsoft-graph-client';
|
||||
import { DriveItem } from '@microsoft/microsoft-graph-types';
|
||||
import { DedupeStrategy, Polling, pollingHelper } from '@activepieces/pieces-common';
|
||||
import dayjs from 'dayjs';
|
||||
|
||||
type Props = {
|
||||
siteId: string;
|
||||
driveId: string;
|
||||
folderId: string;
|
||||
};
|
||||
|
||||
const polling: Polling<AppConnectionValueForAuthProperty<typeof microsoftSharePointAuth>, Props> = {
|
||||
strategy: DedupeStrategy.TIMEBASED,
|
||||
items: async ({ auth, propsValue, lastFetchEpochMS }) => {
|
||||
const { siteId, driveId, folderId } = propsValue;
|
||||
const isTestMode = lastFetchEpochMS === 0;
|
||||
|
||||
const client = Client.initWithMiddleware({
|
||||
authProvider: {
|
||||
getAccessToken: () => Promise.resolve(auth.access_token),
|
||||
},
|
||||
});
|
||||
|
||||
const files = [];
|
||||
|
||||
const endpoint =
|
||||
folderId !== 'root'
|
||||
? `/sites/${siteId}/drive/items/${folderId}/children`
|
||||
: `/sites/${siteId}/drives/${driveId}/items/root/children`;
|
||||
|
||||
let response: PageCollection = await client
|
||||
.api(endpoint)
|
||||
.orderby('lastModifiedDateTime desc')
|
||||
.get();
|
||||
|
||||
let stop = false;
|
||||
|
||||
while (!stop && response.value.length > 0) {
|
||||
for (const item of response.value as DriveItem[]) {
|
||||
if (!item.file) continue;
|
||||
|
||||
const modifiedMs = dayjs(item.lastModifiedDateTime).valueOf();
|
||||
|
||||
if (isTestMode) {
|
||||
files.push(item);
|
||||
if (files.length >= 10) {
|
||||
stop = true;
|
||||
}
|
||||
continue;
|
||||
}
|
||||
|
||||
if (modifiedMs < lastFetchEpochMS) {
|
||||
stop = true;
|
||||
break;
|
||||
}
|
||||
|
||||
files.push(item);
|
||||
}
|
||||
|
||||
if (stop || !response['@odata.nextLink']) break;
|
||||
|
||||
response = await client.api(response['@odata.nextLink']).get();
|
||||
}
|
||||
|
||||
files.sort((a, b) => {
|
||||
const aDate = dayjs(a.lastModifiedDateTime);
|
||||
const bDate = dayjs(b.lastModifiedDateTime);
|
||||
return bDate.diff(aDate);
|
||||
});
|
||||
|
||||
return files.map((file) => ({
|
||||
epochMilliSeconds: dayjs(file.lastModifiedDateTime).valueOf(),
|
||||
data: file,
|
||||
}));
|
||||
},
|
||||
};
|
||||
|
||||
export const newOrUpdatedFileTrigger = createTrigger({
|
||||
auth: microsoftSharePointAuth,
|
||||
name: 'new_or_updated_file',
|
||||
displayName: 'New or Updated File',
|
||||
description: 'Triggers when a file is created or updated in a given folder.',
|
||||
props: {
|
||||
siteId: microsoftSharePointCommon.siteId,
|
||||
driveId: microsoftSharePointCommon.driveId,
|
||||
folderId: Property.Dropdown({
|
||||
auth: microsoftSharePointAuth,
|
||||
displayName: 'Folder to Monitor',
|
||||
description:
|
||||
'The folder to watch for new or updated files. Select "Root Folder" for the top-level folder of the drive.',
|
||||
required: true,
|
||||
refreshers: ['siteId', 'driveId'],
|
||||
options: async ({ auth, siteId, driveId }) => {
|
||||
if (!auth || !siteId || !driveId) {
|
||||
return {
|
||||
disabled: true,
|
||||
placeholder: 'Select a site and drive first.',
|
||||
options: [],
|
||||
};
|
||||
}
|
||||
const authValue = auth
|
||||
const client = Client.initWithMiddleware({
|
||||
authProvider: {
|
||||
getAccessToken: () => Promise.resolve(authValue.access_token),
|
||||
},
|
||||
});
|
||||
const options: DropdownOption<string>[] = [{ label: 'Root Folder', value: 'root' }];
|
||||
let response: PageCollection = await client
|
||||
.api(
|
||||
`/sites/${siteId}/drives/${driveId}/items/root/children?$filter=folder ne null&$select=id,name`,
|
||||
)
|
||||
.get();
|
||||
while (response.value.length > 0) {
|
||||
for (const item of response.value as DriveItem[]) {
|
||||
options.push({ label: item.name!, value: item.id! });
|
||||
}
|
||||
if (response['@odata.nextLink']) {
|
||||
response = await client.api(response['@odata.nextLink']).get();
|
||||
} else {
|
||||
break;
|
||||
}
|
||||
}
|
||||
return { disabled: false, options };
|
||||
},
|
||||
}),
|
||||
},
|
||||
type: TriggerStrategy.POLLING,
|
||||
|
||||
sampleData: {
|
||||
id: '01DRYVE_ID_GOES_HERE',
|
||||
name: 'Updated-Financials.xlsx',
|
||||
webUrl: 'https://contoso.sharepoint.com/Shared%20Documents/Updated-Financials.xlsx',
|
||||
size: 65432,
|
||||
createdDateTime: '2025-09-26T10:00:00Z',
|
||||
lastModifiedDateTime: '2025-09-26T14:34:00Z',
|
||||
file: {
|
||||
mimeType: 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet',
|
||||
},
|
||||
parentReference: { id: 'PARENT_FOLDER_ID_HERE' },
|
||||
},
|
||||
async onEnable(context) {
|
||||
await pollingHelper.onEnable(polling, {
|
||||
auth: context.auth,
|
||||
store: context.store,
|
||||
propsValue: context.propsValue,
|
||||
});
|
||||
},
|
||||
async onDisable(context) {
|
||||
await pollingHelper.onDisable(polling, {
|
||||
auth: context.auth,
|
||||
store: context.store,
|
||||
propsValue: context.propsValue,
|
||||
});
|
||||
},
|
||||
async test(context) {
|
||||
return await pollingHelper.test(polling, context);
|
||||
},
|
||||
async run(context) {
|
||||
return await pollingHelper.poll(polling, context);
|
||||
},
|
||||
});
|
||||
@@ -0,0 +1,170 @@
|
||||
import { microsoftSharePointAuth } from '../../';
|
||||
import {
|
||||
createTrigger,
|
||||
TriggerStrategy,
|
||||
Property,
|
||||
DropdownOption,
|
||||
AppConnectionValueForAuthProperty,
|
||||
} from '@activepieces/pieces-framework';
|
||||
import { microsoftSharePointCommon } from '../common';
|
||||
import { Client, PageCollection } from '@microsoft/microsoft-graph-client';
|
||||
import { DriveItem } from '@microsoft/microsoft-graph-types';
|
||||
import dayjs from 'dayjs';
|
||||
import { DedupeStrategy, Polling, pollingHelper } from '@activepieces/pieces-common';
|
||||
|
||||
type Props = {
|
||||
siteId: string;
|
||||
driveId: string;
|
||||
parentFolderId: string;
|
||||
};
|
||||
|
||||
const polling: Polling<AppConnectionValueForAuthProperty<typeof microsoftSharePointAuth>, Props> = {
|
||||
strategy: DedupeStrategy.TIMEBASED,
|
||||
items: async ({ auth, propsValue, lastFetchEpochMS }) => {
|
||||
const { siteId, driveId, parentFolderId } = propsValue;
|
||||
const isTestMode = lastFetchEpochMS === 0;
|
||||
|
||||
const client = Client.initWithMiddleware({
|
||||
authProvider: {
|
||||
getAccessToken: () => Promise.resolve(auth.access_token),
|
||||
},
|
||||
});
|
||||
|
||||
const folders = [];
|
||||
|
||||
const endpoint =
|
||||
parentFolderId !== 'root'
|
||||
? `/sites/${siteId}/drive/items/${parentFolderId}/children`
|
||||
: `/sites/${siteId}/drives/${driveId}/items/root/children`;
|
||||
|
||||
let response: PageCollection = await client
|
||||
.api(endpoint)
|
||||
.orderby('lastModifiedDateTime desc')
|
||||
.get();
|
||||
|
||||
let stop = false;
|
||||
|
||||
while (!stop && response.value.length > 0) {
|
||||
for (const item of response.value as DriveItem[]) {
|
||||
if (!item.folder) continue;
|
||||
|
||||
const modifiedMs = dayjs(item.lastModifiedDateTime).valueOf();
|
||||
|
||||
if (isTestMode) {
|
||||
folders.push(item);
|
||||
if (folders.length >= 10) {
|
||||
stop = true;
|
||||
}
|
||||
continue;
|
||||
}
|
||||
|
||||
if (modifiedMs < lastFetchEpochMS) {
|
||||
stop = true;
|
||||
break;
|
||||
}
|
||||
|
||||
folders.push(item);
|
||||
}
|
||||
|
||||
if (stop || !response['@odata.nextLink']) break;
|
||||
|
||||
response = await client.api(response['@odata.nextLink']).get();
|
||||
}
|
||||
|
||||
folders.sort((a, b) => {
|
||||
const aDate = dayjs(a.lastModifiedDateTime);
|
||||
const bDate = dayjs(b.lastModifiedDateTime);
|
||||
return bDate.diff(aDate);
|
||||
});
|
||||
|
||||
return folders.map((folder) => ({
|
||||
epochMilliSeconds: dayjs(folder.lastModifiedDateTime).valueOf(),
|
||||
data: folder,
|
||||
}));
|
||||
},
|
||||
};
|
||||
|
||||
export const newOrUpdatedFolderTrigger = createTrigger({
|
||||
auth: microsoftSharePointAuth,
|
||||
name: 'new_or_updated_folder',
|
||||
displayName: 'New or Updated Folder',
|
||||
description: 'Triggers when a folder is created or updated (e.g., name change).',
|
||||
props: {
|
||||
siteId: microsoftSharePointCommon.siteId,
|
||||
driveId: microsoftSharePointCommon.driveId,
|
||||
parentFolderId: Property.Dropdown({
|
||||
auth: microsoftSharePointAuth,
|
||||
displayName: 'Parent Folder to Monitor',
|
||||
description:
|
||||
'The folder to watch for new or updated subfolders. Select "Root Folder" to monitor the top-level of the drive.',
|
||||
required: true,
|
||||
refreshers: ['siteId', 'driveId'],
|
||||
options: async ({ auth, siteId, driveId }) => {
|
||||
if (!auth || !siteId || !driveId) {
|
||||
return {
|
||||
disabled: true,
|
||||
placeholder: 'Select a site and drive first.',
|
||||
options: [],
|
||||
};
|
||||
}
|
||||
const authValue = auth
|
||||
const client = Client.initWithMiddleware({
|
||||
authProvider: {
|
||||
getAccessToken: () => Promise.resolve(authValue.access_token),
|
||||
},
|
||||
});
|
||||
const options: DropdownOption<string>[] = [{ label: 'Root Folder', value: 'root' }];
|
||||
let response: PageCollection = await client
|
||||
.api(
|
||||
`/sites/${siteId}/drives/${driveId}/items/root/children?$filter=folder ne null&$select=id,name`,
|
||||
)
|
||||
.get();
|
||||
while (response.value.length > 0) {
|
||||
for (const item of response.value as DriveItem[]) {
|
||||
options.push({ label: item.name!, value: item.id! });
|
||||
}
|
||||
if (response['@odata.nextLink']) {
|
||||
response = await client.api(response['@odata.nextLink']).get();
|
||||
} else {
|
||||
break;
|
||||
}
|
||||
}
|
||||
return { disabled: false, options };
|
||||
},
|
||||
}),
|
||||
},
|
||||
type: TriggerStrategy.POLLING,
|
||||
|
||||
sampleData: {
|
||||
id: '01DRYVE_FOLDER_ID_GOES_HERE',
|
||||
name: 'Project Alpha',
|
||||
webUrl: 'https://contoso.sharepoint.com/Shared%20Documents/Project%20Alpha',
|
||||
size: 0,
|
||||
createdDateTime: '2025-09-26T14:50:00Z',
|
||||
lastModifiedDateTime: '2025-09-26T14:50:00Z',
|
||||
folder: {
|
||||
childCount: 0,
|
||||
},
|
||||
parentReference: { id: 'PARENT_FOLDER_ID_HERE' },
|
||||
},
|
||||
async onEnable(context) {
|
||||
await pollingHelper.onEnable(polling, {
|
||||
auth: context.auth,
|
||||
store: context.store,
|
||||
propsValue: context.propsValue,
|
||||
});
|
||||
},
|
||||
async onDisable(context) {
|
||||
await pollingHelper.onDisable(polling, {
|
||||
auth: context.auth,
|
||||
store: context.store,
|
||||
propsValue: context.propsValue,
|
||||
});
|
||||
},
|
||||
async test(context) {
|
||||
return await pollingHelper.test(polling, context);
|
||||
},
|
||||
async run(context) {
|
||||
return await pollingHelper.poll(polling, context);
|
||||
},
|
||||
});
|
||||
@@ -0,0 +1,113 @@
|
||||
import { microsoftSharePointAuth } from '../../';
|
||||
import {
|
||||
createTrigger,
|
||||
TriggerStrategy,
|
||||
AppConnectionValueForAuthProperty,
|
||||
} from '@activepieces/pieces-framework';
|
||||
import { microsoftSharePointCommon } from '../common';
|
||||
import { Client, PageCollection } from '@microsoft/microsoft-graph-client';
|
||||
import { DedupeStrategy, Polling, pollingHelper } from '@activepieces/pieces-common';
|
||||
import dayjs from 'dayjs';
|
||||
import { List } from '@microsoft/microsoft-graph-types';
|
||||
|
||||
type Props = {
|
||||
siteId: string;
|
||||
};
|
||||
|
||||
const polling: Polling<AppConnectionValueForAuthProperty<typeof microsoftSharePointAuth>, Props> = {
|
||||
strategy: DedupeStrategy.TIMEBASED,
|
||||
items: async ({ auth, propsValue, lastFetchEpochMS }) => {
|
||||
const { siteId } = propsValue;
|
||||
const isTestMode = lastFetchEpochMS === 0;
|
||||
|
||||
const client = Client.initWithMiddleware({
|
||||
authProvider: {
|
||||
getAccessToken: () => Promise.resolve(auth.access_token),
|
||||
},
|
||||
});
|
||||
|
||||
const lists = [];
|
||||
|
||||
let response: PageCollection = await client
|
||||
.api(`/sites/${siteId}/lists`)
|
||||
.get();
|
||||
|
||||
let stop = false;
|
||||
|
||||
while (!stop && response.value.length > 0) {
|
||||
for (const item of response.value as List[]) {
|
||||
const modifiedMs = dayjs(item.lastModifiedDateTime).valueOf();
|
||||
|
||||
if (isTestMode) {
|
||||
lists.push(item);
|
||||
if (lists.length >= 10) {
|
||||
stop = true;
|
||||
}
|
||||
continue;
|
||||
}
|
||||
|
||||
if (modifiedMs < lastFetchEpochMS) {
|
||||
stop = true;
|
||||
break;
|
||||
}
|
||||
|
||||
lists.push(item);
|
||||
}
|
||||
|
||||
if (stop || !response['@odata.nextLink']) break;
|
||||
|
||||
response = await client.api(response['@odata.nextLink']).get();
|
||||
}
|
||||
|
||||
lists.sort((a, b) => {
|
||||
const aDate = dayjs(a.lastModifiedDateTime);
|
||||
const bDate = dayjs(b.lastModifiedDateTime);
|
||||
return bDate.diff(aDate);
|
||||
});
|
||||
|
||||
return lists.map((list) => ({
|
||||
epochMilliSeconds: dayjs(list.lastModifiedDateTime).valueOf(),
|
||||
data: list,
|
||||
}));
|
||||
},
|
||||
};
|
||||
|
||||
export const newOrUpdatedListTrigger = createTrigger({
|
||||
auth: microsoftSharePointAuth,
|
||||
name: 'new_or_updated_list',
|
||||
displayName: 'New or Updated List',
|
||||
description: 'Triggers when a list is created or updated in a site.',
|
||||
props: {
|
||||
siteId: microsoftSharePointCommon.siteId,
|
||||
},
|
||||
type: TriggerStrategy.POLLING,
|
||||
|
||||
sampleData: {
|
||||
id: 'xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx',
|
||||
displayName: 'Projects Tracker',
|
||||
description: 'Updated list for tracking all ongoing projects.',
|
||||
createdDateTime: '2025-09-26T11:00:00Z',
|
||||
lastModifiedDateTime: '2025-09-26T14:55:00Z',
|
||||
webUrl: 'https://contoso.sharepoint.com/sites/MySite/Lists/Projects%20Tracker',
|
||||
},
|
||||
async onEnable(context) {
|
||||
await pollingHelper.onEnable(polling, {
|
||||
auth: context.auth,
|
||||
store: context.store,
|
||||
propsValue: context.propsValue,
|
||||
});
|
||||
},
|
||||
async onDisable(context) {
|
||||
await pollingHelper.onDisable(polling, {
|
||||
auth: context.auth,
|
||||
store: context.store,
|
||||
propsValue: context.propsValue,
|
||||
});
|
||||
},
|
||||
async test(context) {
|
||||
return await pollingHelper.test(polling, context);
|
||||
},
|
||||
async run(context) {
|
||||
return await pollingHelper.poll(polling, context);
|
||||
},
|
||||
});
|
||||
@@ -0,0 +1,112 @@
|
||||
import { microsoftSharePointAuth } from '../../';
|
||||
import {
|
||||
createTrigger,
|
||||
TriggerStrategy,
|
||||
Property,
|
||||
} from '@activepieces/pieces-framework';
|
||||
import { microsoftSharePointCommon } from '../common';
|
||||
import { Client } from '@microsoft/microsoft-graph-client';
|
||||
|
||||
const clientState = 'activepieces_sharepoint_updated_list_item_trigger';
|
||||
|
||||
export const updatedListItemTrigger = createTrigger({
|
||||
auth: microsoftSharePointAuth,
|
||||
name: 'updated_list_item',
|
||||
displayName: 'Updated List Item',
|
||||
description: 'Fires when an existing item in a SharePoint list is updated.',
|
||||
props: {
|
||||
siteId: microsoftSharePointCommon.siteId,
|
||||
listId: microsoftSharePointCommon.listId,
|
||||
},
|
||||
type: TriggerStrategy.WEBHOOK,
|
||||
|
||||
sampleData: {
|
||||
"id": "2",
|
||||
"createdDateTime": "2025-09-26T14:10:00Z",
|
||||
"lastModifiedDateTime": "2025-09-26T14:38:00Z",
|
||||
"webUrl": "https://contoso.sharepoint.com/sites/MySite/Lists/MyTasks/2_.000",
|
||||
"fields": {
|
||||
"@odata.etag": "\"xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx,2\"",
|
||||
"id": "2",
|
||||
"Title": "Complete Project Proposal",
|
||||
"Status": "In Progress",
|
||||
"Priority": "High",
|
||||
"DueDate": "2025-10-05T00:00:00Z"
|
||||
}
|
||||
},
|
||||
|
||||
async onEnable(context) {
|
||||
const { siteId, listId } = context.propsValue;
|
||||
|
||||
const client = Client.initWithMiddleware({
|
||||
authProvider: {
|
||||
getAccessToken: () => Promise.resolve(context.auth.access_token),
|
||||
},
|
||||
});
|
||||
|
||||
try {
|
||||
const expirationDateTime = new Date();
|
||||
expirationDateTime.setDate(expirationDateTime.getDate() + 2);
|
||||
|
||||
const subscription = await client.api('/subscriptions').post({
|
||||
changeType: 'updated',
|
||||
notificationUrl: context.webhookUrl,
|
||||
resource: `/sites/${siteId}/lists/${listId}/items`,
|
||||
expirationDateTime: expirationDateTime.toISOString(),
|
||||
clientState: clientState,
|
||||
});
|
||||
|
||||
await context.store.put('subscriptionId', subscription.id);
|
||||
} catch (error: any) {
|
||||
throw new Error(`Failed to create subscription: ${error.message || 'Unknown error'}`);
|
||||
}
|
||||
},
|
||||
|
||||
async onDisable(context) {
|
||||
const subscriptionId = await context.store.get<string>('subscriptionId');
|
||||
if (subscriptionId) {
|
||||
const client = Client.initWithMiddleware({
|
||||
authProvider: {
|
||||
getAccessToken: () => Promise.resolve(context.auth.access_token),
|
||||
},
|
||||
});
|
||||
try {
|
||||
await client.api(`/subscriptions/${subscriptionId}`).delete();
|
||||
} catch (error) {
|
||||
console.warn(`Error deleting subscription ${subscriptionId}:`, error);
|
||||
}
|
||||
}
|
||||
await context.store.delete('subscriptionId');
|
||||
},
|
||||
|
||||
async run(context) {
|
||||
const notifications = (context.payload.body as { value: any[] })?.value;
|
||||
if (!notifications || !Array.isArray(notifications)) {
|
||||
return [];
|
||||
}
|
||||
|
||||
const validNotifications = notifications.filter(
|
||||
(notif) => notif.clientState === clientState
|
||||
);
|
||||
if (validNotifications.length === 0) {
|
||||
return [];
|
||||
}
|
||||
|
||||
const client = Client.initWithMiddleware({
|
||||
authProvider: {
|
||||
getAccessToken: () => Promise.resolve(context.auth.access_token),
|
||||
},
|
||||
});
|
||||
|
||||
const updatedItemPayloads = [];
|
||||
for (const notification of validNotifications) {
|
||||
try {
|
||||
const updatedItem = await client.api(notification.resource).expand('fields').get();
|
||||
updatedItemPayloads.push(updatedItem);
|
||||
} catch (error) {
|
||||
console.error('Error fetching list item from notification:', error);
|
||||
}
|
||||
}
|
||||
return updatedItemPayloads;
|
||||
},
|
||||
});
|
||||
Reference in New Issue
Block a user