diff --git a/packages/pieces/community/customer-io/package.json b/packages/pieces/community/customer-io/package.json
index 4b351f89906..db9b6d53b71 100644
--- a/packages/pieces/community/customer-io/package.json
+++ b/packages/pieces/community/customer-io/package.json
@@ -1,6 +1,6 @@
{
"name": "@activepieces/piece-customer-io",
- "version": "0.3.4",
+ "version": "0.3.5",
"main": "./dist/src/index.js",
"types": "./dist/src/index.d.ts",
"dependencies": {
diff --git a/packages/pieces/community/customer-io/src/i18n/de.json b/packages/pieces/community/customer-io/src/i18n/de.json
index 046eb3729c2..a37ed82d87c 100644
--- a/packages/pieces/community/customer-io/src/i18n/de.json
+++ b/packages/pieces/community/customer-io/src/i18n/de.json
@@ -6,7 +6,7 @@
"Bearer Token": "Bären-Token",
"US": "MN",
"EU": "EU",
- "\n**Site ID:**\n\n\nPlease log in and go to Settings, click [here](https://fly.customer.io/settings/api_credentials).\n\n**Tracking API Key:**\n\n\nPlease log in and go to Settings, click [here](https://fly.customer.io/settings/api_credentials).\n\n**APP API Token:**\n\n\nPlease log in and find it in Account Settings, click [here](https://fly.customer.io/settings/api_credentials?keyType=app).\n\n\n \nPlease note that the Track API Key and App API Key are different. You can read more about it [here](https://customer.io/doc": "\n**Site-ID:**\n\n\nBitte melden Sie sich an und gehen Sie zu Einstellungen, klicken Sie [here](https://fly.customer.io/settings/api_credentials).\n\n**Tracking-API-Schlüssel:**\n\n\nBitte melden Sie sich an und gehen Sie zu Einstellungen, klicken Sie [here](https://fly.customer.io/settings/api_credentials).\n\n**APP-API-Token:**\n\n\nBitte melden Sie sich an und finden Sie es in den Kontoeinstellungen, klicken Sie [here](https://fly.customer.io/settings/api_credentials?keyType=app).\n\n\n \nBitte beachten Sie, dass der API-Schlüssel und der API-Schlüssel unterschiedlich sind. Sie können mehr darüber lesen [here](https://customer.io/docs/accounts-and-workspaces/managing-credentials/).\n",
+ "\n**Site ID:**\n\n\nPlease log in and go to Settings, click [here](https://fly.customer.io/settings/api_credentials).\n\n**Tracking API Key:**\n\n\nPlease log in and go to Settings, click [here](https://fly.customer.io/settings/api_credentials).\n\n**APP API Token:**\n\n\nPlease log in and find it in Account Settings, click [here](https://fly.customer.io/settings/api_credentials?keyType=app).\n\n \nPlease note that the Track API Key and App API Key are different. You can read more about it [here](https://customer.io/docs": "\n**Site-ID:**\n\n\nBitte melden Sie sich an und gehen Sie zu Einstellungen, klicken Sie [here](https://fly.customer.io/settings/api_credentials).\n\n**Tracking-API-Schlüssel:**\n\n\nBitte melden Sie sich an und gehen Sie zu Einstellungen, klicken Sie [here](https://fly.customer.io/settings/api_credentials).\n\n**APP-API-Token:**\n\n\nBitte melden Sie sich an und finden Sie es in den Kontoeinstellungen, klicken Sie [here](https://fly.customer.io/settings/api_credentials?keyType=app).\n\n \nBitte beachten Sie, dass der API-Schlüssel und der API-Schlüssel unterschiedlich sind. Sie können mehr darüber lesen [here](https://customer.io/docs/accounts-and-workspaces/managing-credentials/).\n",
"Create Event": "Ereignis erstellen",
"Track Custom API Call": "Eigenen API-Aufruf verfolgen",
"App Custom API Call": "App-benutzerdefinierte API-Aufruf",
diff --git a/packages/pieces/community/customer-io/src/i18n/es.json b/packages/pieces/community/customer-io/src/i18n/es.json
index 33145262efc..fc8dbac3184 100644
--- a/packages/pieces/community/customer-io/src/i18n/es.json
+++ b/packages/pieces/community/customer-io/src/i18n/es.json
@@ -6,7 +6,7 @@
"Bearer Token": "Tóken de portador",
"US": "SUS",
"EU": "EU",
- "\n**Site ID:**\n\n\nPlease log in and go to Settings, click [here](https://fly.customer.io/settings/api_credentials).\n\n**Tracking API Key:**\n\n\nPlease log in and go to Settings, click [here](https://fly.customer.io/settings/api_credentials).\n\n**APP API Token:**\n\n\nPlease log in and find it in Account Settings, click [here](https://fly.customer.io/settings/api_credentials?keyType=app).\n\n\n \nPlease note that the Track API Key and App API Key are different. You can read more about it [here](https://customer.io/doc": "\n**Site ID:**\n\n\nPlease log in and go to Settings, click [here](https://fly.customer.io/settings/api_credentials).\n\n**Tracking API Key:**\n\n\nPlease log in and go to Settings, click [here](https://fly.customer.io/settings/api_credentials).\n\n**APP API Token:**\n\n\nPlease log in and find it in Account Settings, click [here](https://fly.customer.io/settings/api_credentials?keyType=app).\n\n\n \nPlease note that the Track API Key and App API Key are different. You can read more about it [here](https://customer.io/docs/accounts-and-workspaces/managing-credentials/).\n",
+ "\n**Site ID:**\n\n\nPlease log in and go to Settings, click [here](https://fly.customer.io/settings/api_credentials).\n\n**Tracking API Key:**\n\n\nPlease log in and go to Settings, click [here](https://fly.customer.io/settings/api_credentials).\n\n**APP API Token:**\n\n\nPlease log in and find it in Account Settings, click [here](https://fly.customer.io/settings/api_credentials?keyType=app).\n\n \nPlease note that the Track API Key and App API Key are different. You can read more about it [here](https://customer.io/docs": "\n**Site ID:**\n\n\nPlease log in and go to Settings, click [here](https://fly.customer.io/settings/api_credentials).\n\n**Tracking API Key:**\n\n\nPlease log in and go to Settings, click [here](https://fly.customer.io/settings/api_credentials).\n\n**APP API Token:**\n\n\nPlease log in and find it in Account Settings, click [here](https://fly.customer.io/settings/api_credentials?keyType=app).\n\n \nPlease note that the Track API Key and App API Key are different. You can read more about it [here](https://customer.io/docs/accounts-and-workspaces/managing-credentials/).\n",
"Create Event": "Crear Evento",
"Track Custom API Call": "Rastrear llamada API personalizada",
"App Custom API Call": "Aplicación API Llamada",
diff --git a/packages/pieces/community/customer-io/src/i18n/fr.json b/packages/pieces/community/customer-io/src/i18n/fr.json
index c8d055683f6..f98f13f599d 100644
--- a/packages/pieces/community/customer-io/src/i18n/fr.json
+++ b/packages/pieces/community/customer-io/src/i18n/fr.json
@@ -6,7 +6,7 @@
"Bearer Token": "Jeton de Porteur",
"US": "US",
"EU": "EU",
- "\n**Site ID:**\n\n\nPlease log in and go to Settings, click [here](https://fly.customer.io/settings/api_credentials).\n\n**Tracking API Key:**\n\n\nPlease log in and go to Settings, click [here](https://fly.customer.io/settings/api_credentials).\n\n**APP API Token:**\n\n\nPlease log in and find it in Account Settings, click [here](https://fly.customer.io/settings/api_credentials?keyType=app).\n\n\n \nPlease note that the Track API Key and App API Key are different. You can read more about it [here](https://customer.io/doc": "\n**Identifiant du site :**\n\n\nVeuillez vous connecter et aller dans Paramètres, cliquez sur [here](https://fly.customer.io/settings/api_credentials).\n\n**Clé API de suivi :**\n\n\nVeuillez vous connecter et aller dans Paramètres, cliquez sur [here](https://fly.customer.io/settings/api_credentials).\n\n**Jeton API APP :**\n\n\nVeuillez vous connecter et le trouver dans les paramètres du compte, cliquez sur [here](https://fly.customer.io/settings/api_credentials?keyType=app).\n\n\n \nVeuillez noter que la clé API Track et la clé API App sont différentes. Vous pouvez en savoir plus sur [here](https://customer.io/docs/accounts-and-workspaces/managing-credentials/).\n",
+ "\n**Site ID:**\n\n\nPlease log in and go to Settings, click [here](https://fly.customer.io/settings/api_credentials).\n\n**Tracking API Key:**\n\n\nPlease log in and go to Settings, click [here](https://fly.customer.io/settings/api_credentials).\n\n**APP API Token:**\n\n\nPlease log in and find it in Account Settings, click [here](https://fly.customer.io/settings/api_credentials?keyType=app).\n\n \nPlease note that the Track API Key and App API Key are different. You can read more about it [here](https://customer.io/docs": "\n**Identifiant du site :**\n\n\nVeuillez vous connecter et aller dans Paramètres, cliquez sur [here](https://fly.customer.io/settings/api_credentials).\n\n**Clé API de suivi :**\n\n\nVeuillez vous connecter et aller dans Paramètres, cliquez sur [here](https://fly.customer.io/settings/api_credentials).\n\n**Jeton API APP :**\n\n\nVeuillez vous connecter et le trouver dans les paramètres du compte, cliquez sur [here](https://fly.customer.io/settings/api_credentials?keyType=app).\n\n \nVeuillez noter que la clé API Track et la clé API App sont différentes. Vous pouvez en savoir plus sur [here](https://customer.io/docs/accounts-and-workspaces/managing-credentials/).\n",
"Create Event": "Créer un événement",
"Track Custom API Call": "Suivre l'appel d'API personnalisé",
"App Custom API Call": "Appel API personnalisé de l'application",
diff --git a/packages/pieces/community/customer-io/src/i18n/ja.json b/packages/pieces/community/customer-io/src/i18n/ja.json
index e8bbfcd37cc..65d84ae5560 100644
--- a/packages/pieces/community/customer-io/src/i18n/ja.json
+++ b/packages/pieces/community/customer-io/src/i18n/ja.json
@@ -6,7 +6,7 @@
"Bearer Token": "ベアラートトークン",
"US": "米国",
"EU": "EU",
- "\n**Site ID:**\n\n\nPlease log in and go to Settings, click [here](https://fly.customer.io/settings/api_credentials).\n\n**Tracking API Key:**\n\n\nPlease log in and go to Settings, click [here](https://fly.customer.io/settings/api_credentials).\n\n**APP API Token:**\n\n\nPlease log in and find it in Account Settings, click [here](https://fly.customer.io/settings/api_credentials?keyType=app).\n\n\n \nPlease note that the Track API Key and App API Key are different. You can read more about it [here](https://customer.io/doc": "\n**Site ID:**\n\n\nPlease log in and go to Settings, click [here](https://fly.customer.io/settings/api_credentials).\n\n**Tracking API Key:**\n\n\nPlease log in and go to Settings, click [here](https://fly.customer.io/settings/api_credentials).\n\n**APP API Token:**\n\n\nPlease log in and find it in Account Settings, click [here](https://fly.customer.io/settings/api_credentials?keyType=app).\n\n\n \nPlease note that the Track API Key and App API Key are different. You can read more about it [here](https://customer.io/docs/accounts-and-workspaces/managing-credentials/).\n",
+ "\n**Site ID:**\n\n\nPlease log in and go to Settings, click [here](https://fly.customer.io/settings/api_credentials).\n\n**Tracking API Key:**\n\n\nPlease log in and go to Settings, click [here](https://fly.customer.io/settings/api_credentials).\n\n**APP API Token:**\n\n\nPlease log in and find it in Account Settings, click [here](https://fly.customer.io/settings/api_credentials?keyType=app).\n\n \nPlease note that the Track API Key and App API Key are different. You can read more about it [here](https://customer.io/docs": "\n**Site ID:**\n\n\nPlease log in and go to Settings, click [here](https://fly.customer.io/settings/api_credentials).\n\n**Tracking API Key:**\n\n\nPlease log in and go to Settings, click [here](https://fly.customer.io/settings/api_credentials).\n\n**APP API Token:**\n\n\nPlease log in and find it in Account Settings, click [here](https://fly.customer.io/settings/api_credentials?keyType=app).\n\n \nPlease note that the Track API Key and App API Key are different. You can read more about it [here](https://customer.io/docs/accounts-and-workspaces/managing-credentials/).\n",
"Create Event": "イベントを作成",
"Track Custom API Call": "カスタムAPI通話を追跡",
"App Custom API Call": "アプリカスタムAPI通話",
diff --git a/packages/pieces/community/customer-io/src/i18n/nl.json b/packages/pieces/community/customer-io/src/i18n/nl.json
index 191f4fa3073..481eda927ea 100644
--- a/packages/pieces/community/customer-io/src/i18n/nl.json
+++ b/packages/pieces/community/customer-io/src/i18n/nl.json
@@ -6,7 +6,7 @@
"Bearer Token": "Betere Token",
"US": "VS",
"EU": "EU",
- "\n**Site ID:**\n\n\nPlease log in and go to Settings, click [here](https://fly.customer.io/settings/api_credentials).\n\n**Tracking API Key:**\n\n\nPlease log in and go to Settings, click [here](https://fly.customer.io/settings/api_credentials).\n\n**APP API Token:**\n\n\nPlease log in and find it in Account Settings, click [here](https://fly.customer.io/settings/api_credentials?keyType=app).\n\n\n \nPlease note that the Track API Key and App API Key are different. You can read more about it [here](https://customer.io/doc": "\n**Site ID:**\n\n\nLog in en ga naar Instellingen, klik [here](https://fly.customer.io/settings/api_credentials).\n\n**Tracking API-sleutel:**\n\n\nLog in en ga naar Instellingen, klik [here](https://fly.customer.io/settings/api_credentials).\n\n**APP Token:**\n\n\nLog in en vind het in de accountinstellingen, klik op [here](https://fly.customer.io/settings/api_credentials?keyType=app).\n\n\n \nHoud er rekening mee dat de Track API Key en App API Key verschillend zijn. U kunt er meer over lezen [here](https://customer.io/docs/accounts-and-workspaces/managing-credentials/).\n",
+ "\n**Site ID:**\n\n\nPlease log in and go to Settings, click [here](https://fly.customer.io/settings/api_credentials).\n\n**Tracking API Key:**\n\n\nPlease log in and go to Settings, click [here](https://fly.customer.io/settings/api_credentials).\n\n**APP API Token:**\n\n\nPlease log in and find it in Account Settings, click [here](https://fly.customer.io/settings/api_credentials?keyType=app).\n\n \nPlease note that the Track API Key and App API Key are different. You can read more about it [here](https://customer.io/docs": "\n**Site ID:**\n\n\nLog in en ga naar Instellingen, klik [here](https://fly.customer.io/settings/api_credentials).\n\n**Tracking API-sleutel:**\n\n\nLog in en ga naar Instellingen, klik [here](https://fly.customer.io/settings/api_credentials).\n\n**APP Token:**\n\n\nLog in en vind het in de accountinstellingen, klik op [here](https://fly.customer.io/settings/api_credentials?keyType=app).\n\n \nHoud er rekening mee dat de Track API Key en App API Key verschillend zijn. U kunt er meer over lezen [here](https://customer.io/docs/accounts-and-workspaces/managing-credentials/).\n",
"Create Event": "Gebeurtenis aanmaken",
"Track Custom API Call": "Bijhouden van aangepaste API-oproep",
"App Custom API Call": "App Aangepaste API Call",
diff --git a/packages/pieces/community/customer-io/src/i18n/pt.json b/packages/pieces/community/customer-io/src/i18n/pt.json
index f4b022392b0..b00fa689f13 100644
--- a/packages/pieces/community/customer-io/src/i18n/pt.json
+++ b/packages/pieces/community/customer-io/src/i18n/pt.json
@@ -6,7 +6,7 @@
"Bearer Token": "Token do portador",
"US": "EUA",
"EU": "EU",
- "\n**Site ID:**\n\n\nPlease log in and go to Settings, click [here](https://fly.customer.io/settings/api_credentials).\n\n**Tracking API Key:**\n\n\nPlease log in and go to Settings, click [here](https://fly.customer.io/settings/api_credentials).\n\n**APP API Token:**\n\n\nPlease log in and find it in Account Settings, click [here](https://fly.customer.io/settings/api_credentials?keyType=app).\n\n\n \nPlease note that the Track API Key and App API Key are different. You can read more about it [here](https://customer.io/doc": "\n**Site ID:**\n\n\nPlease log in and go to Settings, click [here](https://fly.customer.io/settings/api_credentials).\n\n**Tracking API Key:**\n\n\nPlease log in and go to Settings, click [here](https://fly.customer.io/settings/api_credentials).\n\n**APP API Token:**\n\n\nPlease log in and find it in Account Settings, click [here](https://fly.customer.io/settings/api_credentials?keyType=app).\n\n\n \nPlease note that the Track API Key and App API Key are different. You can read more about it [here](https://customer.io/docs/accounts-and-workspaces/managing-credentials/).\n",
+ "\n**Site ID:**\n\n\nPlease log in and go to Settings, click [here](https://fly.customer.io/settings/api_credentials).\n\n**Tracking API Key:**\n\n\nPlease log in and go to Settings, click [here](https://fly.customer.io/settings/api_credentials).\n\n**APP API Token:**\n\n\nPlease log in and find it in Account Settings, click [here](https://fly.customer.io/settings/api_credentials?keyType=app).\n\n \nPlease note that the Track API Key and App API Key are different. You can read more about it [here](https://customer.io/docs": "\n**Site ID:**\n\n\nPlease log in and go to Settings, click [here](https://fly.customer.io/settings/api_credentials).\n\n**Tracking API Key:**\n\n\nPlease log in and go to Settings, click [here](https://fly.customer.io/settings/api_credentials).\n\n**APP API Token:**\n\n\nPlease log in and find it in Account Settings, click [here](https://fly.customer.io/settings/api_credentials?keyType=app).\n\n \nPlease note that the Track API Key and App API Key are different. You can read more about it [here](https://customer.io/docs/accounts-and-workspaces/managing-credentials/).\n",
"Create Event": "Criar evento",
"Track Custom API Call": "Rastrear chamada de API personalizada",
"App Custom API Call": "Chamada de API personalizada do aplicativo",
diff --git a/packages/pieces/community/customer-io/src/i18n/zh.json b/packages/pieces/community/customer-io/src/i18n/zh.json
index b1e845f87b9..2da96261a4d 100644
--- a/packages/pieces/community/customer-io/src/i18n/zh.json
+++ b/packages/pieces/community/customer-io/src/i18n/zh.json
@@ -6,7 +6,7 @@
"Bearer Token": "Bearer Token",
"US": "US",
"EU": "EU",
- "\n**Site ID:**\n\n\nPlease log in and go to Settings, click [here](https://fly.customer.io/settings/api_credentials).\n\n**Tracking API Key:**\n\n\nPlease log in and go to Settings, click [here](https://fly.customer.io/settings/api_credentials).\n\n**APP API Token:**\n\n\nPlease log in and find it in Account Settings, click [here](https://fly.customer.io/settings/api_credentials?keyType=app).\n\n\n \nPlease note that the Track API Key and App API Key are different. You can read more about it [here](https://customer.io/doc": "\n**Site ID:**\n\n\nPlease log in and go to Settings, click [here](https://fly.customer.io/settings/api_credentials).\n\n**Tracking API Key:**\n\n\nPlease log in and go to Settings, click [here](https://fly.customer.io/settings/api_credentials).\n\n**APP API Token:**\n\n\nPlease log in and find it in Account Settings, click [here](https://fly.customer.io/settings/api_credentials?keyType=app).\n\n\n \nPlease note that the Track API Key and App API Key are different. You can read more about it [here](https://customer.io/docs/accounts-and-workspaces/managing-credentials/).\n",
+ "\n**Site ID:**\n\n\nPlease log in and go to Settings, click [here](https://fly.customer.io/settings/api_credentials).\n\n**Tracking API Key:**\n\n\nPlease log in and go to Settings, click [here](https://fly.customer.io/settings/api_credentials).\n\n**APP API Token:**\n\n\nPlease log in and find it in Account Settings, click [here](https://fly.customer.io/settings/api_credentials?keyType=app).\n\n \nPlease note that the Track API Key and App API Key are different. You can read more about it [here](https://customer.io/docs": "\n**Site ID:**\n\n\nPlease log in and go to Settings, click [here](https://fly.customer.io/settings/api_credentials).\n\n**Tracking API Key:**\n\n\nPlease log in and go to Settings, click [here](https://fly.customer.io/settings/api_credentials).\n\n**APP API Token:**\n\n\nPlease log in and find it in Account Settings, click [here](https://fly.customer.io/settings/api_credentials?keyType=app).\n\n \nPlease note that the Track API Key and App API Key are different. You can read more about it [here](https://customer.io/docs/accounts-and-workspaces/managing-credentials/).\n",
"Create Event": "Create Event",
"Track Custom API Call": "Track Custom API Call",
"App Custom API Call": "App Custom API Call",
diff --git a/packages/pieces/community/exa/package.json b/packages/pieces/community/exa/package.json
index e5660a926ed..36c1baaa856 100644
--- a/packages/pieces/community/exa/package.json
+++ b/packages/pieces/community/exa/package.json
@@ -1,6 +1,6 @@
{
"name": "@activepieces/piece-exa",
- "version": "0.1.4",
+ "version": "0.1.5",
"main": "./dist/src/index.js",
"types": "./dist/src/index.d.ts",
"scripts": {
diff --git a/packages/pieces/community/exa/src/i18n/de.json b/packages/pieces/community/exa/src/i18n/de.json
index 3c83be38d91..37c46745c6d 100644
--- a/packages/pieces/community/exa/src/i18n/de.json
+++ b/packages/pieces/community/exa/src/i18n/de.json
@@ -1,6 +1,6 @@
{
"AI-powered search and content extraction from the web.": "KI-gestützte Suche und Inhaltsextraktion aus dem Internet.",
- "Obtain your API key from [Dashboard Setting](https://dashboard.exa.ai/api-keys).": "Erhalten Sie Ihre API-Taste über [Dashboard-Einstellung](https://dashboard.exa.ai/api-keys).",
+ "\nObtain your API key from [Dashboard Setting](https://dashboard.exa.ai/api-keys).\n": "\nErhalten Sie Ihren API-Schlüssel über [Dashboard-Einstellung](https://dashboard.exa.ai/api-keys).\n",
"Get Contents": "Inhalte abrufen",
"Ask AI": "KI fragen",
"Perform Search": "Suche durchführen",
diff --git a/packages/pieces/community/exa/src/i18n/es.json b/packages/pieces/community/exa/src/i18n/es.json
index 3e9b1acb007..7e8ef6b8677 100644
--- a/packages/pieces/community/exa/src/i18n/es.json
+++ b/packages/pieces/community/exa/src/i18n/es.json
@@ -1,6 +1,6 @@
{
"AI-powered search and content extraction from the web.": "Búsqueda y extracción de contenido impulsada por la AIE de la web.",
- "Obtain your API key from [Dashboard Setting](https://dashboard.exa.ai/api-keys).": "Obtén tu clave API de [Configuración del panel](https://dashboard.exa.ai/api-keys).",
+ "\nObtain your API key from [Dashboard Setting](https://dashboard.exa.ai/api-keys).\n": "\nObtén tu clave API desde [Configuración del panel de control](https://dashboard.exa.ai/api-keys).\n",
"Get Contents": "Obtener contenido",
"Ask AI": "Preguntar IA",
"Perform Search": "Realizar búsqueda",
diff --git a/packages/pieces/community/exa/src/i18n/fr.json b/packages/pieces/community/exa/src/i18n/fr.json
index 3bf09781906..a76679afa25 100644
--- a/packages/pieces/community/exa/src/i18n/fr.json
+++ b/packages/pieces/community/exa/src/i18n/fr.json
@@ -1,6 +1,6 @@
{
"AI-powered search and content extraction from the web.": "La recherche et l'extraction de contenu à partir du Web.",
- "Obtain your API key from [Dashboard Setting](https://dashboard.exa.ai/api-keys).": "Obtenez votre clé API dans [Dashboard Setting](https://dashboard.exa.ai/api-keys).",
+ "\nObtain your API key from [Dashboard Setting](https://dashboard.exa.ai/api-keys).\n": "\nObtenir votre clé API dans [Dashboard Setting](https://dashboard.exa.ai/api-keys).\n",
"Get Contents": "Obtenir du contenu",
"Ask AI": "Demander à l'IA",
"Perform Search": "Effectuer la recherche",
diff --git a/packages/pieces/community/exa/src/i18n/ja.json b/packages/pieces/community/exa/src/i18n/ja.json
index d4e65b4dbe3..4fdd3b6914b 100644
--- a/packages/pieces/community/exa/src/i18n/ja.json
+++ b/packages/pieces/community/exa/src/i18n/ja.json
@@ -1,6 +1,6 @@
{
"AI-powered search and content extraction from the web.": "AIを駆使した検索とWebからのコンテンツ抽出。",
- "Obtain your API key from [Dashboard Setting](https://dashboard.exa.ai/api-keys).": "[ダッシュボード設定](https://dashboard.exa.ai/api-keys)からAPIキーを取得します。",
+ "\nObtain your API key from [Dashboard Setting](https://dashboard.exa.ai/api-keys).\n": "\n[ダッシュボード設定](https://dashboard.exa.ai/api-keys)からAPIキーを取得します。\n",
"Get Contents": "内容を取得",
"Ask AI": "AIに聞く",
"Perform Search": "検索を実行",
diff --git a/packages/pieces/community/exa/src/i18n/nl.json b/packages/pieces/community/exa/src/i18n/nl.json
index ec1ea1af9ba..e76e006b927 100644
--- a/packages/pieces/community/exa/src/i18n/nl.json
+++ b/packages/pieces/community/exa/src/i18n/nl.json
@@ -1,6 +1,6 @@
{
"AI-powered search and content extraction from the web.": "AI-aangedreven zoek- en inhoudsextractie van het web.",
- "Obtain your API key from [Dashboard Setting](https://dashboard.exa.ai/api-keys).": "Verkrijg je API-sleutel van [Dashboard Instellingen](https://dashboard.exa.ai/api-keys).",
+ "\nObtain your API key from [Dashboard Setting](https://dashboard.exa.ai/api-keys).\n": "\nVerkrijg je API-sleutel van [Dashboard Instelling](https://dashboard.exa.ai/api-keys).\n",
"Get Contents": "Inhoud ophalen",
"Ask AI": "Vraag het AI",
"Perform Search": "Zoekopdracht uitvoeren",
diff --git a/packages/pieces/community/exa/src/i18n/pt.json b/packages/pieces/community/exa/src/i18n/pt.json
index c487a9b5573..9d86619ab43 100644
--- a/packages/pieces/community/exa/src/i18n/pt.json
+++ b/packages/pieces/community/exa/src/i18n/pt.json
@@ -1,6 +1,6 @@
{
"AI-powered search and content extraction from the web.": "Pesquisa e extração de conteúdo a partir da web.",
- "Obtain your API key from [Dashboard Setting](https://dashboard.exa.ai/api-keys).": "Obtenha sua chave de API de [Configuração do Painel](https://dashboard.exa.ai/api-keys).",
+ "\nObtain your API key from [Dashboard Setting](https://dashboard.exa.ai/api-keys).\n": "\nObtenha sua chave de API de [Configuração do Painel](https://dashboard.exa.ai/api-keys).\n",
"Get Contents": "Obter conteúdo",
"Ask AI": "Perguntar à IA",
"Perform Search": "Executar Pesquisa",
diff --git a/packages/pieces/community/exa/src/i18n/zh.json b/packages/pieces/community/exa/src/i18n/zh.json
index 2c377397e30..40aa03e0c82 100644
--- a/packages/pieces/community/exa/src/i18n/zh.json
+++ b/packages/pieces/community/exa/src/i18n/zh.json
@@ -1,6 +1,6 @@
{
"AI-powered search and content extraction from the web.": "AI-powered search and content extraction from the web.",
- "Obtain your API key from [Dashboard Setting](https://dashboard.exa.ai/api-keys).": "Obtain your API key from [Dashboard Setting](https://dashboard.exa.ai/api-keys).",
+ "\nObtain your API key from [Dashboard Setting](https://dashboard.exa.ai/api-keys).\n": "\nObtain your API key from [Dashboard Setting](https://dashboard.exa.ai/api-keys).\n",
"Get Contents": "Get Contents",
"Ask AI": "询问AI",
"Perform Search": "Perform Search",
diff --git a/packages/pieces/community/google-search-console/package.json b/packages/pieces/community/google-search-console/package.json
index 07b808998c5..84100783ddf 100644
--- a/packages/pieces/community/google-search-console/package.json
+++ b/packages/pieces/community/google-search-console/package.json
@@ -1,6 +1,6 @@
{
"name": "@activepieces/piece-google-search-console",
- "version": "0.1.4",
+ "version": "0.1.5",
"main": "./dist/src/index.js",
"types": "./dist/src/index.d.ts",
"dependencies": {
diff --git a/packages/pieces/community/google-search-console/src/i18n/de.json b/packages/pieces/community/google-search-console/src/i18n/de.json
index fe4b35eb100..5da1c46cb62 100644
--- a/packages/pieces/community/google-search-console/src/i18n/de.json
+++ b/packages/pieces/community/google-search-console/src/i18n/de.json
@@ -1,5 +1,5 @@
{
- "\n 1. Sign in to [Google Cloud Console](https://console.cloud.google.com/).\n 2. Create a new project or you can use existing one.\n 3. Go to **APIs & Services** and click **Enable APIs & Services**.\n 4. Search for **Google Search Console API** in the search bar and enable it.\n 5. Go to **OAuth consent screen** and select **External** type and click create.\n 6. Fill App Name, User Support Email, and Developer Contact Information. Click on the Save and Continue button.\n 7. Click on **Add or Remove Scopes": "\n 1. Anmelden bei [Google Cloud Console](https://console.cloud.google.com/).\n 2. Erstellen Sie ein neues Projekt oder Sie können ein bestehendes Projekt verwenden.\n 3. Gehen Sie zu **APIs & Services** und klicken Sie auf **APIs & Services**.\n 4. Suche nach **Google Search Console API** in der Suchleiste und aktiviere diese.\n Gehe zum **OAuth consent screen** und wähle **External** Typ und klicke auf Erstellen.\n 6. Geben Sie App-Name, Benutzer-Support-E-Mail und Entwickler-Kontaktinformationen ein. Klicken Sie auf die Schaltfläche Speichern und fortfahren.\n Klicken Sie auf **Add or Remove Scopes** und fügen Sie folgende Bereiche hinzu und klicken Sie auf Update.\n - https://www.googleapis. om/auth/webmasters\n 8. Klicken Sie auf Speichern und Weiter um den Schritt zu beenden.\n 9. Klicken Sie auf den Button Benutzer hinzufügen und fügen Sie eine Test-E-Mail hinzu. Sie können Ihre eigene E-Mail hinzufügen). hen klicken Sie schließlich auf Speichern und fortfahren, um den Test User Teil zu beenden.\n 10. Gehen Sie zu **Anmeldeinformationen**. Klicke auf den Button **Anmeldeinformationen erstellen** und wähle die Option **OAuth client ID** aus.\n 11. Wählen Sie den Anwendungstyp als **Web Application** aus und füllen Sie das Feld Name aus.\n 12. Fügen Sie https://cloud.activepieces.com/redirect im Feld **Autorisierte Weiterleitungs-URIs** hinzu und klicken Sie auf den Erstellen-Button.\n 13. Kopiere **Client-ID** und **Client-Geheimnis**.",
+ "\n 1. Sign in to [Google Cloud Console](https://console.cloud.google.com/).\n 2. Create a new project or you can use existing one.\n 3. Go to **APIs & Services** and click **Enable APIs & Services**.\n 4. Search for **Google Search Console API** in the search bar and enable it.\n 5. Go to **OAuth consent screen** and select **External** type and click create.\n 6. Fill App Name, User Support Email, and Developer Contact Information. Click on the Save and Continue button.\n 7. Click on **Add or Remove Scopes": "\n 1. Anmelden bei [Google Cloud Console](https://console.cloud.google.com/).\n 2. Erstellen Sie ein neues Projekt oder Sie können ein bestehendes Projekt verwenden.\n 3. Gehen Sie zu **APIs & Services** und klicken Sie auf **APIs & Services**.\n 4. Suche nach **Google Search Console API** in der Suchleiste und aktiviere diese.\n Gehe zum **OAuth consent screen** und wähle **External** Typ und klicke auf Erstellen.\n 6. Geben Sie App-Name, Benutzer-Support-E-Mail und Entwickler-Kontaktinformationen ein. Klicken Sie auf die Schaltfläche Speichern und fortfahren.\n Klicken Sie auf **Add or Remove Scopes** und fügen Sie folgende Bereiche hinzu und klicken Sie auf Update.\n - https://www.googleapis. om/auth/webmasters\n 8. Klicken Sie auf Speichern und Fortfahren, um den Schritt der Bereiche abzuschließen.\n 9. Klicken Sie auf den Button Benutzer hinzufügen und fügen Sie eine Test-E-Mail hinzu. Sie können Ihre eigene E-Mail hinzufügen)\n. hen klicken Sie schließlich auf Speichern und fortfahren, um den Test User Teil zu beenden.\n 10. Gehen Sie zu **Anmeldeinformationen**. Klicke auf den Button **Anmeldeinformationen erstellen** und wähle die Option **OAuth client ID** aus.\n 11. Wählen Sie den Anwendungstyp als **Web Application** aus und füllen Sie das Feld Name aus.\n 12. Fügen Sie https://cloud.activepieces.com/redirect im Feld **Autorisierte Weiterleitungs-URIs** hinzu und klicken Sie auf den Erstellen-Button.\n 13. Kopiere **Client-ID** und **Client-Geheimnis**.",
"Search Analytics": "Suchanalytik",
"List Sitemaps": "Sitemaps auflisten",
"Submit a Sitemap": "Sitemap absenden",
diff --git a/packages/pieces/community/google-search-console/src/i18n/es.json b/packages/pieces/community/google-search-console/src/i18n/es.json
index abc946a0b6c..c2c9e093011 100644
--- a/packages/pieces/community/google-search-console/src/i18n/es.json
+++ b/packages/pieces/community/google-search-console/src/i18n/es.json
@@ -1,5 +1,5 @@
{
- "\n 1. Sign in to [Google Cloud Console](https://console.cloud.google.com/).\n 2. Create a new project or you can use existing one.\n 3. Go to **APIs & Services** and click **Enable APIs & Services**.\n 4. Search for **Google Search Console API** in the search bar and enable it.\n 5. Go to **OAuth consent screen** and select **External** type and click create.\n 6. Fill App Name, User Support Email, and Developer Contact Information. Click on the Save and Continue button.\n 7. Click on **Add or Remove Scopes": "\n 1. Sign in to [Google Cloud Console](https://console.cloud.google.com/).\n 2. Create a new project or you can use existing one.\n 3. Go to **APIs & Services** and click **Enable APIs & Services**.\n 4. Search for **Google Search Console API** in the search bar and enable it.\n 5. Go to **OAuth consent screen** and select **External** type and click create.\n 6. Fill App Name, User Support Email, and Developer Contact Information. Click on the Save and Continue button.\n 7. Click on **Add or Remove Scopes** and add following scopes and click update.\n - https://www.googleapis.com/auth/webmasters\n 8. Click Save and Continue to finish the Scopes step.\n 9. Click on the Add Users button and add a test email You can add your own email).Then finally click Save and Continue to finish the Test Users portion.\n 10. Go to **Credentials**. Click on the **Create Credentials** button and select the **OAuth client ID** option.\n 11. Select the application type as **Web Application** and fill the Name field.\n 12. Add https://cloud.activepieces.com/redirect in **Authorized redirect URIs** field, and click on the Create button.\n 13. Copy **Client ID** and **Client Secret**.",
+ "\n 1. Sign in to [Google Cloud Console](https://console.cloud.google.com/).\n 2. Create a new project or you can use existing one.\n 3. Go to **APIs & Services** and click **Enable APIs & Services**.\n 4. Search for **Google Search Console API** in the search bar and enable it.\n 5. Go to **OAuth consent screen** and select **External** type and click create.\n 6. Fill App Name, User Support Email, and Developer Contact Information. Click on the Save and Continue button.\n 7. Click on **Add or Remove Scopes": "\n 1. Sign in to [Google Cloud Console](https://console.cloud.google.com/).\n 2. Create a new project or you can use existing one.\n 3. Go to **APIs & Services** and click **Enable APIs & Services**.\n 4. Search for **Google Search Console API** in the search bar and enable it.\n 5. Go to **OAuth consent screen** and select **External** type and click create.\n 6. Fill App Name, User Support Email, and Developer Contact Information. Click on the Save and Continue button.\n 7. Click on **Add or Remove Scopes** and add following scopes and click update.\n - https://www.googleapis.com/auth/webmasters\n 8. Click Save and Continue to finish the Scopes step.\n 9. Click on the Add Users button and add a test email You can add your own email)\n.Then finally click Save and Continue to finish the Test Users portion.\n 10. Go to **Credentials**. Click on the **Create Credentials** button and select the **OAuth client ID** option.\n 11. Select the application type as **Web Application** and fill the Name field.\n 12. Add https://cloud.activepieces.com/redirect in **Authorized redirect URIs** field, and click on the Create button.\n 13. Copy **Client ID** and **Client Secret**.",
"Search Analytics": "Análisis de búsqueda",
"List Sitemaps": "Listar Sitemaps",
"Submit a Sitemap": "Enviar un mapa del sitio",
diff --git a/packages/pieces/community/google-search-console/src/i18n/fr.json b/packages/pieces/community/google-search-console/src/i18n/fr.json
index 54033f19446..18d96f705dc 100644
--- a/packages/pieces/community/google-search-console/src/i18n/fr.json
+++ b/packages/pieces/community/google-search-console/src/i18n/fr.json
@@ -1,5 +1,5 @@
{
- "\n 1. Sign in to [Google Cloud Console](https://console.cloud.google.com/).\n 2. Create a new project or you can use existing one.\n 3. Go to **APIs & Services** and click **Enable APIs & Services**.\n 4. Search for **Google Search Console API** in the search bar and enable it.\n 5. Go to **OAuth consent screen** and select **External** type and click create.\n 6. Fill App Name, User Support Email, and Developer Contact Information. Click on the Save and Continue button.\n 7. Click on **Add or Remove Scopes": "\n 1. Sign in to [Google Cloud Console](https://console.cloud.google.com/).\n 2. Create a new project or you can use existing one.\n 3. Go to **APIs & Services** and click **Enable APIs & Services**.\n 4. Search for **Google Search Console API** in the search bar and enable it.\n 5. Go to **OAuth consent screen** and select **External** type and click create.\n 6. Fill App Name, User Support Email, and Developer Contact Information. Click on the Save and Continue button.\n 7. Click on **Add or Remove Scopes** and add following scopes and click update.\n - https://www.googleapis.com/auth/webmasters\n 8. Click Save and Continue to finish the Scopes step.\n 9. Click on the Add Users button and add a test email You can add your own email).Then finally click Save and Continue to finish the Test Users portion.\n 10. Go to **Credentials**. Click on the **Create Credentials** button and select the **OAuth client ID** option.\n 11. Select the application type as **Web Application** and fill the Name field.\n 12. Add https://cloud.activepieces.com/redirect in **Authorized redirect URIs** field, and click on the Create button.\n 13. Copy **Client ID** and **Client Secret**.",
+ "\n 1. Sign in to [Google Cloud Console](https://console.cloud.google.com/).\n 2. Create a new project or you can use existing one.\n 3. Go to **APIs & Services** and click **Enable APIs & Services**.\n 4. Search for **Google Search Console API** in the search bar and enable it.\n 5. Go to **OAuth consent screen** and select **External** type and click create.\n 6. Fill App Name, User Support Email, and Developer Contact Information. Click on the Save and Continue button.\n 7. Click on **Add or Remove Scopes": "\n 1. Sign in to [Google Cloud Console](https://console.cloud.google.com/).\n 2. Create a new project or you can use existing one.\n 3. Go to **APIs & Services** and click **Enable APIs & Services**.\n 4. Search for **Google Search Console API** in the search bar and enable it.\n 5. Go to **OAuth consent screen** and select **External** type and click create.\n 6. Fill App Name, User Support Email, and Developer Contact Information. Click on the Save and Continue button.\n 7. Click on **Add or Remove Scopes** and add following scopes and click update.\n - https://www.googleapis.com/auth/webmasters\n 8. Click Save and Continue to finish the Scopes step.\n 9. Click on the Add Users button and add a test email You can add your own email)\n.Then finally click Save and Continue to finish the Test Users portion.\n 10. Go to **Credentials**. Click on the **Create Credentials** button and select the **OAuth client ID** option.\n 11. Select the application type as **Web Application** and fill the Name field.\n 12. Add https://cloud.activepieces.com/redirect in **Authorized redirect URIs** field, and click on the Create button.\n 13. Copy **Client ID** and **Client Secret**.",
"Search Analytics": "Analyses de recherche",
"List Sitemaps": "Lister les sitemaps",
"Submit a Sitemap": "Soumettre un plan du site",
diff --git a/packages/pieces/community/google-search-console/src/i18n/ja.json b/packages/pieces/community/google-search-console/src/i18n/ja.json
index 7c337c1de91..b6cad7c8ff7 100644
--- a/packages/pieces/community/google-search-console/src/i18n/ja.json
+++ b/packages/pieces/community/google-search-console/src/i18n/ja.json
@@ -1,5 +1,5 @@
{
- "\n 1. Sign in to [Google Cloud Console](https://console.cloud.google.com/).\n 2. Create a new project or you can use existing one.\n 3. Go to **APIs & Services** and click **Enable APIs & Services**.\n 4. Search for **Google Search Console API** in the search bar and enable it.\n 5. Go to **OAuth consent screen** and select **External** type and click create.\n 6. Fill App Name, User Support Email, and Developer Contact Information. Click on the Save and Continue button.\n 7. Click on **Add or Remove Scopes": "\n 1. Sign in to [Google Cloud Console](https://console.cloud.google.com/).\n 2. Create a new project or you can use existing one.\n 3. Go to **APIs & Services** and click **Enable APIs & Services**.\n 4. Search for **Google Search Console API** in the search bar and enable it.\n 5. Go to **OAuth consent screen** and select **External** type and click create.\n 6. Fill App Name, User Support Email, and Developer Contact Information. Click on the Save and Continue button.\n 7. Click on **Add or Remove Scopes** and add following scopes and click update.\n - https://www.googleapis.com/auth/webmasters\n 8. Click Save and Continue to finish the Scopes step.\n 9. Click on the Add Users button and add a test email You can add your own email).Then finally click Save and Continue to finish the Test Users portion.\n 10. Go to **Credentials**. Click on the **Create Credentials** button and select the **OAuth client ID** option.\n 11. Select the application type as **Web Application** and fill the Name field.\n 12. Add https://cloud.activepieces.com/redirect in **Authorized redirect URIs** field, and click on the Create button.\n 13. Copy **Client ID** and **Client Secret**.",
+ "\n 1. Sign in to [Google Cloud Console](https://console.cloud.google.com/).\n 2. Create a new project or you can use existing one.\n 3. Go to **APIs & Services** and click **Enable APIs & Services**.\n 4. Search for **Google Search Console API** in the search bar and enable it.\n 5. Go to **OAuth consent screen** and select **External** type and click create.\n 6. Fill App Name, User Support Email, and Developer Contact Information. Click on the Save and Continue button.\n 7. Click on **Add or Remove Scopes": "\n 1. Sign in to [Google Cloud Console](https://console.cloud.google.com/).\n 2. Create a new project or you can use existing one.\n 3. Go to **APIs & Services** and click **Enable APIs & Services**.\n 4. Search for **Google Search Console API** in the search bar and enable it.\n 5. Go to **OAuth consent screen** and select **External** type and click create.\n 6. Fill App Name, User Support Email, and Developer Contact Information. Click on the Save and Continue button.\n 7. Click on **Add or Remove Scopes** and add following scopes and click update.\n - https://www.googleapis.com/auth/webmasters\n 8. Click Save and Continue to finish the Scopes step.\n 9. Click on the Add Users button and add a test email You can add your own email)\n.Then finally click Save and Continue to finish the Test Users portion.\n 10. Go to **Credentials**. Click on the **Create Credentials** button and select the **OAuth client ID** option.\n 11. Select the application type as **Web Application** and fill the Name field.\n 12. Add https://cloud.activepieces.com/redirect in **Authorized redirect URIs** field, and click on the Create button.\n 13. Copy **Client ID** and **Client Secret**.",
"Search Analytics": "検索分析",
"List Sitemaps": "サイトマップ一覧",
"Submit a Sitemap": "サイトマップを送信",
diff --git a/packages/pieces/community/google-search-console/src/i18n/nl.json b/packages/pieces/community/google-search-console/src/i18n/nl.json
index fdf418ec953..e093020de3a 100644
--- a/packages/pieces/community/google-search-console/src/i18n/nl.json
+++ b/packages/pieces/community/google-search-console/src/i18n/nl.json
@@ -1,5 +1,5 @@
{
- "\n 1. Sign in to [Google Cloud Console](https://console.cloud.google.com/).\n 2. Create a new project or you can use existing one.\n 3. Go to **APIs & Services** and click **Enable APIs & Services**.\n 4. Search for **Google Search Console API** in the search bar and enable it.\n 5. Go to **OAuth consent screen** and select **External** type and click create.\n 6. Fill App Name, User Support Email, and Developer Contact Information. Click on the Save and Continue button.\n 7. Click on **Add or Remove Scopes": "\n 1. Log in op [Google Cloud Console](https://console.cloud.google.com/).\n 2. Maak een nieuw project aan of u kunt een bestaand project gebruiken.\n 3. Ga naar **API's & Services** en klik op **API's & Service inschakelen**.\n 4. Zoek naar **Google Console API** in de zoekbalk en schakel deze in.\n 5. Ga naar het **OAuth toestemming scherm** en selecteer **External** type en klik op maken.\n 6. Vul de App Naam, User Support Email en Ontwikkelaar Contact Informatie. Klik op Opslaan en Doorgaan knop.\n 7. Klik op **Voeg toe of verwijder Scopes** en voeg de volgende scopes toe en klik op update.\n - https://www.googleapis. Aute/auth/webmasters\n 8. Klik op Opslaan en doorgaan om de Scopes stap af te ronden.\n 9. Klik op de Gebruikers toevoegen knop en voeg een test e-mail toe die u zelf kunt toevoegen. hen klik eindelijk op Opslaan en ga verder om de test users portie te voltooien.\n 10. Ga naar **Aanmeldingen**. Klik op de knop **Credentials** en selecteer de optie **OAuth client ID**.\n 11. Selecteer het applicatie type als **Web Applicatie** en vul het veld Naam in.\n 12. Voeg https://cloud.activepieces.com/redirect toe in **Authorized redirect URI's** veld en klik op de Creëer-knop.\n 13. Kopieer **Client ID** en **Client Secret**.",
+ "\n 1. Sign in to [Google Cloud Console](https://console.cloud.google.com/).\n 2. Create a new project or you can use existing one.\n 3. Go to **APIs & Services** and click **Enable APIs & Services**.\n 4. Search for **Google Search Console API** in the search bar and enable it.\n 5. Go to **OAuth consent screen** and select **External** type and click create.\n 6. Fill App Name, User Support Email, and Developer Contact Information. Click on the Save and Continue button.\n 7. Click on **Add or Remove Scopes": "\n 1. Log in op [Google Cloud Console](https://console.cloud.google.com/).\n 2. Maak een nieuw project aan of u kunt een bestaand project gebruiken.\n 3. Ga naar **API's & Services** en klik op **API's & Service inschakelen**.\n 4. Zoek naar **Google Console API** in de zoekbalk en schakel deze in.\n 5. Ga naar het **OAuth toestemming scherm** en selecteer **External** type en klik op maken.\n 6. Vul de App Naam, User Support Email en Ontwikkelaar Contact Informatie. Klik op Opslaan en Doorgaan knop.\n 7. Klik op **Voeg toe of verwijder Scopes** en voeg de volgende scopes toe en klik op update.\n - https://www.googleapis. om/auth/webmasters\n 8. Klik op opslaan en doorgaan met het voltooien van de Scopes stap.\n 9. Klik op de Gebruikers toevoegen knop en voeg een test e-mail toe die u uw eigen e-mail kunt toevoegen)\n. hen klik eindelijk op Opslaan en doorgaan om de test users portie te voltooien.\n 10. Ga naar **Aanmeldingen**. Klik op de knop **Credentials** en selecteer de optie **OAuth client ID**.\n 11. Selecteer het applicatie type als **Web Applicatie** en vul het veld Naam in.\n 12. Voeg https://cloud.activepieces.com/redirect toe in **Authorized redirect URI's** veld, en klik op de Creëer-knop.\n 13. Kopieer **Client ID** en **Client Secret**.",
"Search Analytics": "Zoek Analytics",
"List Sitemaps": "Sitemaps weergeven",
"Submit a Sitemap": "Een Sitemap indienen",
diff --git a/packages/pieces/community/google-search-console/src/i18n/pt.json b/packages/pieces/community/google-search-console/src/i18n/pt.json
index 5a76bc62db8..056d7c30945 100644
--- a/packages/pieces/community/google-search-console/src/i18n/pt.json
+++ b/packages/pieces/community/google-search-console/src/i18n/pt.json
@@ -1,5 +1,5 @@
{
- "\n 1. Sign in to [Google Cloud Console](https://console.cloud.google.com/).\n 2. Create a new project or you can use existing one.\n 3. Go to **APIs & Services** and click **Enable APIs & Services**.\n 4. Search for **Google Search Console API** in the search bar and enable it.\n 5. Go to **OAuth consent screen** and select **External** type and click create.\n 6. Fill App Name, User Support Email, and Developer Contact Information. Click on the Save and Continue button.\n 7. Click on **Add or Remove Scopes": "\n 1. Entre no [Google Cloud Console](https://console.cloud.google.com/).\n 2. Crie um novo projeto ou você pode usar o já existente.\n 3. Vá para **APIs & serviços** e clique **Habilitar APIs e serviços**.\n 4. Pesquisar por **API do Console de Pesquisa do Google** na barra de pesquisa e habilitá-lo.\n 5. Vá para **OAuth consent screen** e selecione o tipo **externo** e clique em criar.\n 6. Preencha o nome do aplicativo, e-mail de suporte ao usuário e informações de contato do desenvolvedor. Clique no botão Salvar e Continuar.\n 7. Clique em **Adicionar ou Remover Escopo** e adicione os seguintes escopos e clique em atualizar.\n - https://www.googleapis. om/auth/webmasters\n 8. Clique em Salvar e Continuar para terminar a etapa dos escopos.\n 9. Clique no botão Adicionar Usuários e adicione um e-mail de teste. Você pode adicionar seu próprio e-mail). hen finalmente clique em Salvar e Continuar para terminar a porção de Usuários Teste A.\n 10. Vá para **Credenciais**. Clique no botão **Criar Credenciais** e selecione a opção **ID do cliente OAuth.\n 11. Selecione o tipo de aplicativo como **Aplicativo Web** e preencha o campo Nome.\n 12. Adicionar https://cloud.activepieces.com/redirect no campo **URIs de redirecionamento autorizados** e clique no botão Criar.\n 13. Copie o **ID do cliente** e o **Segredo do Cliente**.",
+ "\n 1. Sign in to [Google Cloud Console](https://console.cloud.google.com/).\n 2. Create a new project or you can use existing one.\n 3. Go to **APIs & Services** and click **Enable APIs & Services**.\n 4. Search for **Google Search Console API** in the search bar and enable it.\n 5. Go to **OAuth consent screen** and select **External** type and click create.\n 6. Fill App Name, User Support Email, and Developer Contact Information. Click on the Save and Continue button.\n 7. Click on **Add or Remove Scopes": "\n 1. Entre no [Google Cloud Console](https://console.cloud.google.com/).\n 2. Crie um novo projeto ou você pode usar o já existente.\n 3. Vá para **APIs & serviços** e clique **Habilitar APIs e serviços**.\n 4. Pesquisar por **API do Console de Pesquisa do Google** na barra de pesquisa e habilitá-lo.\n 5. Vá para **OAuth consent screen** e selecione o tipo **externo** e clique em criar.\n 6. Preencha o nome do aplicativo, e-mail de suporte ao usuário e informações de contato do desenvolvedor. Clique no botão Salvar e Continuar.\n 7. Clique em **Adicionar ou Remover Escopo** e adicione os seguintes escopos e clique em atualizar.\n - https://www.googleapis. om/auth/webmasters\n 8. Clique em Salvar e Continuar para terminar a etapa dos escopos.\n 9. Clique no botão Adicionar Usuários e adicione um e-mail de teste. Você pode adicionar seu próprio e-mail)\n. hen finalmente clique em Salvar e Continuar para terminar a porção de Usuários Teste A.\n 10. Vá para **Credenciais**. Clique no botão **Criar Credenciais** e selecione a opção **ID do cliente OAuth.\n 11. Selecione o tipo de aplicativo como **Aplicativo Web** e preencha o campo Nome.\n 12. Adicione https://cloud.activepieces.com/redirect no campo **URIs de redirecionamento autorizados** e clique no botão Criar.\n 13. Copie o **ID do cliente** e o **Segredo do Cliente**.",
"Search Analytics": "Pesquisar análises",
"List Sitemaps": "Listar Mapas",
"Submit a Sitemap": "Enviar um Sitemap",
diff --git a/packages/pieces/community/google-search-console/src/i18n/zh.json b/packages/pieces/community/google-search-console/src/i18n/zh.json
index 766173bca37..017e7e14ae7 100644
--- a/packages/pieces/community/google-search-console/src/i18n/zh.json
+++ b/packages/pieces/community/google-search-console/src/i18n/zh.json
@@ -1,5 +1,5 @@
{
- "\n 1. Sign in to [Google Cloud Console](https://console.cloud.google.com/).\n 2. Create a new project or you can use existing one.\n 3. Go to **APIs & Services** and click **Enable APIs & Services**.\n 4. Search for **Google Search Console API** in the search bar and enable it.\n 5. Go to **OAuth consent screen** and select **External** type and click create.\n 6. Fill App Name, User Support Email, and Developer Contact Information. Click on the Save and Continue button.\n 7. Click on **Add or Remove Scopes": "\n 1. Sign in to [Google Cloud Console](https://console.cloud.google.com/).\n 2. Create a new project or you can use existing one.\n 3. Go to **APIs & Services** and click **Enable APIs & Services**.\n 4. Search for **Google Search Console API** in the search bar and enable it.\n 5. Go to **OAuth consent screen** and select **External** type and click create.\n 6. Fill App Name, User Support Email, and Developer Contact Information. Click on the Save and Continue button.\n 7. Click on **Add or Remove Scopes** and add following scopes and click update.\n - https://www.googleapis.com/auth/webmasters\n 8. Click Save and Continue to finish the Scopes step.\n 9. Click on the Add Users button and add a test email You can add your own email).Then finally click Save and Continue to finish the Test Users portion.\n 10. Go to **Credentials**. Click on the **Create Credentials** button and select the **OAuth client ID** option.\n 11. Select the application type as **Web Application** and fill the Name field.\n 12. Add https://cloud.activepieces.com/redirect in **Authorized redirect URIs** field, and click on the Create button.\n 13. Copy **Client ID** and **Client Secret**.",
+ "\n 1. Sign in to [Google Cloud Console](https://console.cloud.google.com/).\n 2. Create a new project or you can use existing one.\n 3. Go to **APIs & Services** and click **Enable APIs & Services**.\n 4. Search for **Google Search Console API** in the search bar and enable it.\n 5. Go to **OAuth consent screen** and select **External** type and click create.\n 6. Fill App Name, User Support Email, and Developer Contact Information. Click on the Save and Continue button.\n 7. Click on **Add or Remove Scopes": "\n 1. Sign in to [Google Cloud Console](https://console.cloud.google.com/).\n 2. Create a new project or you can use existing one.\n 3. Go to **APIs & Services** and click **Enable APIs & Services**.\n 4. Search for **Google Search Console API** in the search bar and enable it.\n 5. Go to **OAuth consent screen** and select **External** type and click create.\n 6. Fill App Name, User Support Email, and Developer Contact Information. Click on the Save and Continue button.\n 7. Click on **Add or Remove Scopes** and add following scopes and click update.\n - https://www.googleapis.com/auth/webmasters\n 8. Click Save and Continue to finish the Scopes step.\n 9. Click on the Add Users button and add a test email You can add your own email)\n.Then finally click Save and Continue to finish the Test Users portion.\n 10. Go to **Credentials**. Click on the **Create Credentials** button and select the **OAuth client ID** option.\n 11. Select the application type as **Web Application** and fill the Name field.\n 12. Add https://cloud.activepieces.com/redirect in **Authorized redirect URIs** field, and click on the Create button.\n 13. Copy **Client ID** and **Client Secret**.",
"Search Analytics": "Search Analytics",
"List Sitemaps": "List Sitemaps",
"Submit a Sitemap": "Submit a Sitemap",
diff --git a/packages/pieces/community/logsnag/package.json b/packages/pieces/community/logsnag/package.json
index 0e78e4c75a5..1315b73662e 100644
--- a/packages/pieces/community/logsnag/package.json
+++ b/packages/pieces/community/logsnag/package.json
@@ -1,6 +1,6 @@
{
"name": "@activepieces/piece-logsnag",
- "version": "0.0.2",
+ "version": "0.0.3",
"main": "./dist/src/index.js",
"types": "./dist/src/index.d.ts",
"dependencies": {
diff --git a/packages/pieces/community/logsnag/src/i18n/de.json b/packages/pieces/community/logsnag/src/i18n/de.json
new file mode 100644
index 00000000000..6f0af01e2cc
--- /dev/null
+++ b/packages/pieces/community/logsnag/src/i18n/de.json
@@ -0,0 +1,34 @@
+{
+ "Your LogSnag API key specific to the project": "Ihr für das Projekt spezifischer LogSnag API-Schlüssel",
+ "Create Event": "Ereignis erstellen",
+ "Custom API Call": "Eigener API-Aufruf",
+ "Creates a new event in LogSnag with the specified channel and details.": "Erstellt ein neues Ereignis in LogSnag mit dem angegebenen Kanal und Details.",
+ "Make a custom API call to a specific endpoint": "Einen benutzerdefinierten API-Aufruf an einen bestimmten Endpunkt machen",
+ "Project": "Projekt",
+ "Channel": "Kanal",
+ "Event": "Ereignis",
+ "Description": "Beschreibung",
+ "Method": "Methode",
+ "Headers": "Kopfzeilen",
+ "Query Parameters": "Abfrageparameter",
+ "Body Type": "Körpertyp",
+ "Body": "Körper",
+ "Response is Binary ?": "Antwort ist binär?",
+ "No Error on Failure": "Kein Fehler bei Fehler",
+ "Timeout (in seconds)": "Timeout (in Sekunden)",
+ "Follow redirects": "Weiterleitungen folgen",
+ "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 usw.",
+ "GET": "ERHALTEN",
+ "POST": "POST",
+ "PATCH": "PATCH",
+ "PUT": "PUT",
+ "DELETE": "LÖSCHEN",
+ "HEAD": "HEAD",
+ "None": "Keine",
+ "JSON": "JSON",
+ "Form Data": "Formulardaten",
+ "Raw": "Rohe",
+ "New event created": "Neues Ereignis erstellt",
+ "triggers when a new event ic created and logged": "löst aus, wenn ein neues Ereignis erstellt und protokolliert wird"
+}
\ No newline at end of file
diff --git a/packages/pieces/community/logsnag/src/i18n/es.json b/packages/pieces/community/logsnag/src/i18n/es.json
new file mode 100644
index 00000000000..d5f94b42bc0
--- /dev/null
+++ b/packages/pieces/community/logsnag/src/i18n/es.json
@@ -0,0 +1,34 @@
+{
+ "Your LogSnag API key specific to the project": "Su clave API LogSnag específica para el proyecto",
+ "Create Event": "Crear Evento",
+ "Custom API Call": "Llamada API personalizada",
+ "Creates a new event in LogSnag with the specified channel and details.": "Crea un nuevo evento en LogSnag con el canal y detalles especificados.",
+ "Make a custom API call to a specific endpoint": "Hacer una llamada API personalizada a un extremo específico",
+ "Project": "Projekt",
+ "Channel": "Canal",
+ "Event": "Evento",
+ "Description": "Descripción",
+ "Method": "Método",
+ "Headers": "Encabezados",
+ "Query Parameters": "Parámetros de consulta",
+ "Body Type": "Tipo de cuerpo",
+ "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)",
+ "Follow redirects": "Seguir redirecciones",
+ "Authorization headers are injected automatically from your connection.": "Las cabeceras de autorización se inyectan automáticamente desde tu conexión.",
+ "Enable for files like PDFs, images, etc.": "Activar para archivos como PDFs, imágenes, etc.",
+ "GET": "RECOGER",
+ "POST": "POST",
+ "PATCH": "PATCH",
+ "PUT": "PUT",
+ "DELETE": "BORRAR",
+ "HEAD": "LIMPIO",
+ "None": "Ninguna",
+ "JSON": "JSON",
+ "Form Data": "Datos de Formulario",
+ "Raw": "Rápido",
+ "New event created": "Nuevo evento creado",
+ "triggers when a new event ic created and logged": "activa cuando se crea y registra un nuevo evento"
+}
\ No newline at end of file
diff --git a/packages/pieces/community/logsnag/src/i18n/fr.json b/packages/pieces/community/logsnag/src/i18n/fr.json
new file mode 100644
index 00000000000..08d8a5514dc
--- /dev/null
+++ b/packages/pieces/community/logsnag/src/i18n/fr.json
@@ -0,0 +1,34 @@
+{
+ "Your LogSnag API key specific to the project": "Votre clé d'API LogSnag spécifique au projet",
+ "Create Event": "Créer un événement",
+ "Custom API Call": "Appel d'API personnalisé",
+ "Creates a new event in LogSnag with the specified channel and details.": "Crée un nouvel événement dans LogSnag avec le canal et les détails spécifiés.",
+ "Make a custom API call to a specific endpoint": "Passer un appel API personnalisé à un endpoint spécifique",
+ "Project": "Votre compte",
+ "Channel": "Chaîne",
+ "Event": "Evénement",
+ "Description": "Libellé",
+ "Method": "Méthode",
+ "Headers": "Headers",
+ "Query Parameters": "Paramètres de requête",
+ "Body Type": "Body Type",
+ "Body": "Body",
+ "Response is Binary ?": "La réponse est Binaire ?",
+ "No Error on Failure": "Aucune erreur en cas d'échec",
+ "Timeout (in seconds)": "Délai d'expiration (en secondes)",
+ "Follow redirects": "Suivre les redirections",
+ "Authorization headers are injected automatically from your connection.": "Les Headers d'autorisation sont injectés automatiquement à partir de votre connexion.",
+ "Enable for files like PDFs, images, etc.": "Activer pour les fichiers comme les PDFs, les images, etc.",
+ "GET": "GET",
+ "POST": "POST",
+ "PATCH": "PATCH",
+ "PUT": "PUT",
+ "DELETE": "DELETE",
+ "HEAD": "HEAD",
+ "None": "Aucun",
+ "JSON": "JSON",
+ "Form Data": "Données du formulaire",
+ "Raw": "Brut",
+ "New event created": "Nouvel événement créé",
+ "triggers when a new event ic created and logged": "se déclenche lorsqu'un nouvel événement est créé et connecté"
+}
\ No newline at end of file
diff --git a/packages/pieces/community/logsnag/src/i18n/ja.json b/packages/pieces/community/logsnag/src/i18n/ja.json
new file mode 100644
index 00000000000..a106abcde46
--- /dev/null
+++ b/packages/pieces/community/logsnag/src/i18n/ja.json
@@ -0,0 +1,34 @@
+{
+ "Your LogSnag API key specific to the project": "プロジェクト固有の LogSnag API キー",
+ "Create Event": "イベントを作成",
+ "Custom API Call": "カスタムAPI呼び出し",
+ "Creates a new event in LogSnag with the specified channel and details.": "指定されたチャンネルと詳細を含む LogSnag に新しいイベントを作成します。",
+ "Make a custom API call to a specific endpoint": "特定のエンドポイントへのカスタム API コールを実行します。",
+ "Project": "プロジェクト",
+ "Channel": "チャンネル",
+ "Event": "イベント",
+ "Description": "Description",
+ "Method": "方法",
+ "Headers": "ヘッダー",
+ "Query Parameters": "クエリパラメータ",
+ "Body Type": "ボディタイプ",
+ "Body": "本文",
+ "Response is Binary ?": "応答はバイナリですか?",
+ "No Error on Failure": "失敗時にエラーはありません",
+ "Timeout (in seconds)": "タイムアウト(秒)",
+ "Follow redirects": "リダイレクトをフォローする",
+ "Authorization headers are injected automatically from your connection.": "認証ヘッダは接続から自動的に注入されます。",
+ "Enable for files like PDFs, images, etc.": "PDF、画像などのファイルを有効にする",
+ "GET": "GET",
+ "POST": "POST",
+ "PATCH": "PATCH",
+ "PUT": "PUT",
+ "DELETE": "DELETE",
+ "HEAD": "HEAD",
+ "None": "なし",
+ "JSON": "JSON",
+ "Form Data": "フォームデータ",
+ "Raw": "Raw",
+ "New event created": "新しいイベントが作成されました",
+ "triggers when a new event ic created and logged": "新しいイベント icが作成されログに記録されたときにトリガーされます"
+}
\ No newline at end of file
diff --git a/packages/pieces/community/logsnag/src/i18n/nl.json b/packages/pieces/community/logsnag/src/i18n/nl.json
new file mode 100644
index 00000000000..5725ff68a97
--- /dev/null
+++ b/packages/pieces/community/logsnag/src/i18n/nl.json
@@ -0,0 +1,34 @@
+{
+ "Your LogSnag API key specific to the project": "Uw LogSnag API-sleutel specifiek voor het project",
+ "Create Event": "Gebeurtenis aanmaken",
+ "Custom API Call": "Custom API Call",
+ "Creates a new event in LogSnag with the specified channel and details.": "Maakt een nieuwe afspraak in LogSnag met het opgegeven kanaal en de details.",
+ "Make a custom API call to a specific endpoint": "Maak een aangepaste API call naar een specifiek eindpunt",
+ "Project": "Project",
+ "Channel": "Kanaal",
+ "Event": "Gebeurtenis",
+ "Description": "Beschrijving",
+ "Method": "Methode",
+ "Headers": "Kopteksten",
+ "Query Parameters": "Query parameters",
+ "Body Type": "Type lichaam",
+ "Body": "Lichaam",
+ "Response is Binary ?": "Antwoord is binair?",
+ "No Error on Failure": "Geen fout bij fout",
+ "Timeout (in seconds)": "Time-out (in seconden)",
+ "Follow redirects": "Volg omleidingen",
+ "Authorization headers are injected automatically from your connection.": "Autorisatie headers worden automatisch geïnjecteerd vanuit uw verbinding.",
+ "Enable for files like PDFs, images, etc.": "Inschakelen voor bestanden zoals PDF's, afbeeldingen etc.",
+ "GET": "KRIJG",
+ "POST": "POSTE",
+ "PATCH": "BEKIJK",
+ "PUT": "PUT",
+ "DELETE": "VERWIJDEREN",
+ "HEAD": "HOOFD",
+ "None": "geen",
+ "JSON": "JSON",
+ "Form Data": "Formulieren gegevens",
+ "Raw": "Onbewerkte",
+ "New event created": "Nieuwe afspraak aangemaakt",
+ "triggers when a new event ic created and logged": "activeert wanneer een nieuwe event ic is aangemaakt en gelogd"
+}
\ No newline at end of file
diff --git a/packages/pieces/community/logsnag/src/i18n/pt.json b/packages/pieces/community/logsnag/src/i18n/pt.json
new file mode 100644
index 00000000000..03ff36ab2d7
--- /dev/null
+++ b/packages/pieces/community/logsnag/src/i18n/pt.json
@@ -0,0 +1,34 @@
+{
+ "Your LogSnag API key specific to the project": "Sua chave da API LogSnag específica para o projeto",
+ "Create Event": "Criar evento",
+ "Custom API Call": "Chamada de API personalizada",
+ "Creates a new event in LogSnag with the specified channel and details.": "Cria um novo evento no LogSnag com o canal e os detalhes especificados.",
+ "Make a custom API call to a specific endpoint": "Faça uma chamada de API personalizada para um ponto de extremidade específico",
+ "Project": "Projecto",
+ "Channel": "Canal",
+ "Event": "Evento",
+ "Description": "Descrição",
+ "Method": "Método",
+ "Headers": "Cabeçalhos",
+ "Query Parameters": "Parâmetros da consulta",
+ "Body Type": "Tipo de Corpo",
+ "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)",
+ "Follow redirects": "Seguir redirecionamentos",
+ "Authorization headers are injected automatically from your connection.": "Os cabeçalhos de autorização são inseridos automaticamente a partir da sua conexão.",
+ "Enable for files like PDFs, images, etc.": "Habilitar para arquivos como PDFs, imagens, etc.",
+ "GET": "OBTER",
+ "POST": "POSTAR",
+ "PATCH": "COMPRAR",
+ "PUT": "COLOCAR",
+ "DELETE": "EXCLUIR",
+ "HEAD": "CABEÇA",
+ "None": "Nenhuma",
+ "JSON": "JSON",
+ "Form Data": "Dados de Formulário",
+ "Raw": "RAW",
+ "New event created": "Novo evento criado",
+ "triggers when a new event ic created and logged": "Aciona quando um novo evento é criado e registrado"
+}
\ No newline at end of file
diff --git a/packages/pieces/community/logsnag/src/i18n/zh.json b/packages/pieces/community/logsnag/src/i18n/zh.json
new file mode 100644
index 00000000000..f95ab386176
--- /dev/null
+++ b/packages/pieces/community/logsnag/src/i18n/zh.json
@@ -0,0 +1,34 @@
+{
+ "Your LogSnag API key specific to the project": "Your LogSnag API key specific to the project",
+ "Create Event": "Create Event",
+ "Custom API Call": "自定义 API 呼叫",
+ "Creates a new event in LogSnag with the specified channel and details.": "Creates a new event in LogSnag with the specified channel and details.",
+ "Make a custom API call to a specific endpoint": "将一个自定义 API 调用到一个特定的终点",
+ "Project": "项目",
+ "Channel": "Channel",
+ "Event": "Event",
+ "Description": "描述",
+ "Method": "方法",
+ "Headers": "信头",
+ "Query Parameters": "查询参数",
+ "Body Type": "Body Type",
+ "Body": "正文内容",
+ "Response is Binary ?": "Response is Binary ?",
+ "No Error on Failure": "失败时没有错误",
+ "Timeout (in seconds)": "超时(秒)",
+ "Follow redirects": "Follow redirects",
+ "Authorization headers are injected automatically from your connection.": "授权头自动从您的连接中注入。",
+ "Enable for files like PDFs, images, etc.": "Enable for files like PDFs, images, etc.",
+ "GET": "获取",
+ "POST": "帖子",
+ "PATCH": "PATCH",
+ "PUT": "弹出",
+ "DELETE": "删除",
+ "HEAD": "黑色",
+ "None": "无",
+ "JSON": "JSON",
+ "Form Data": "表单数据",
+ "Raw": "原始文件",
+ "New event created": "New event created",
+ "triggers when a new event ic created and logged": "triggers when a new event ic created and logged"
+}
\ No newline at end of file
diff --git a/packages/pieces/community/microsoft-365-people/package.json b/packages/pieces/community/microsoft-365-people/package.json
index bd519cd2774..bb9679828be 100644
--- a/packages/pieces/community/microsoft-365-people/package.json
+++ b/packages/pieces/community/microsoft-365-people/package.json
@@ -1,6 +1,6 @@
{
"name": "@activepieces/piece-microsoft-365-people",
- "version": "0.1.9",
+ "version": "0.1.10",
"type": "commonjs",
"main": "./dist/src/index.js",
"types": "./dist/src/index.d.ts",
diff --git a/packages/pieces/community/microsoft-365-people/src/i18n/de.json b/packages/pieces/community/microsoft-365-people/src/i18n/de.json
index a8fc9f39e2c..4dbf6f881fa 100644
--- a/packages/pieces/community/microsoft-365-people/src/i18n/de.json
+++ b/packages/pieces/community/microsoft-365-people/src/i18n/de.json
@@ -1,6 +1,6 @@
{
"Manage contacts in Microsoft 365 People": "Kontakte in Microsoft 365 Personen verwalten",
- "\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 **Umleitungs-URI** wählen Sie **Web** und fügen Sie die angegebene URL hinzu.\n8. Klicken Sie auf **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** → **delegierte Berechtigungen**.\n - Fügen Sie folgende Bereiche hinzu:\n - Kontakte. eadWrite\n - offline_access \n - Klicken Sie auf **Berechtigungen hinzufügen**.\n12. Kopieren Sie Ihre **Client-ID** und **Client-Geheimnis**.\n",
+ "\nIf you’d like to use your own custom Azure app instead of the default Activepieces app, follow the [Azure app creation guide](https://learn.microsoft.com/en-us/entra/identity-platform/quickstart-register-app#register-an-application),\n set the **Redirect URI** to {{redirectUrl}} and add the following **Microsoft Graph (Delegated) permissions** under **API permissions**:\n - Contacts.ReadWrite\n - offline_access": "\nWenn du deine eigene eigene Azure App anstelle der Standard Activepieces App verwenden möchtest, folge der [Azure App Erstellungsanleitung](https://learn.microsoft.com/en-us/entra/identity-platform/quickstart-register-app#register-an-application),\n hat die **Umleitungs-URI** auf {{redirectUrl}} gesetzt und die folgenden **Microsoft Graph (Delegiert) Berechtigungen** unter **API Berechtigungen**:\n - Kontakte. eadSchreiben\n - offline_access",
"Create a Contact": "Kontakt erstellen",
"Delete a Contact": "Kontakt löschen",
"Update a Contact": "Kontakt aktualisieren",
diff --git a/packages/pieces/community/microsoft-365-people/src/i18n/es.json b/packages/pieces/community/microsoft-365-people/src/i18n/es.json
index 3b547cc898e..2e41e3e3933 100644
--- a/packages/pieces/community/microsoft-365-people/src/i18n/es.json
+++ b/packages/pieces/community/microsoft-365-people/src/i18n/es.json
@@ -1,6 +1,6 @@
{
"Manage contacts in Microsoft 365 People": "Administrar contactos en Microsoft 365 Personas",
- "\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** → **Delegated permissions**.\n - Add the following scopes:\n - Contacts.ReadWrite\n - offline_access\n - Click **Add permissions**.\n12. Copy your **Client ID** and **Client Secret**.\n",
+ "\nIf you’d like to use your own custom Azure app instead of the default Activepieces app, follow the [Azure app creation guide](https://learn.microsoft.com/en-us/entra/identity-platform/quickstart-register-app#register-an-application),\n set the **Redirect URI** to {{redirectUrl}} and add the following **Microsoft Graph (Delegated) permissions** under **API permissions**:\n - Contacts.ReadWrite\n - offline_access": "\nIf you’d like to use your own custom Azure app instead of the default Activepieces app, follow the [Azure app creation guide](https://learn.microsoft.com/en-us/entra/identity-platform/quickstart-register-app#register-an-application),\n set the **Redirect URI** to {{redirectUrl}} and add the following **Microsoft Graph (Delegated) permissions** under **API permissions**:\n - Contacts.ReadWrite\n - offline_access",
"Create a Contact": "Crear un contacto",
"Delete a Contact": "Eliminar un Contacto",
"Update a Contact": "Actualizar un contacto",
diff --git a/packages/pieces/community/microsoft-365-people/src/i18n/fr.json b/packages/pieces/community/microsoft-365-people/src/i18n/fr.json
index 202606c52cf..ef4c3f8ef35 100644
--- a/packages/pieces/community/microsoft-365-people/src/i18n/fr.json
+++ b/packages/pieces/community/microsoft-365-people/src/i18n/fr.json
@@ -1,6 +1,6 @@
{
"Manage contacts in Microsoft 365 People": "Gérer les contacts dans Microsoft 365 Personnes",
- "\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** → **Delegated permissions**.\n - Add the following scopes:\n - Contacts.ReadWrite\n - offline_access\n - Click **Add permissions**.\n12. Copy your **Client ID** and **Client Secret**.\n",
+ "\nIf you’d like to use your own custom Azure app instead of the default Activepieces app, follow the [Azure app creation guide](https://learn.microsoft.com/en-us/entra/identity-platform/quickstart-register-app#register-an-application),\n set the **Redirect URI** to {{redirectUrl}} and add the following **Microsoft Graph (Delegated) permissions** under **API permissions**:\n - Contacts.ReadWrite\n - offline_access": "\nIf you’d like to use your own custom Azure app instead of the default Activepieces app, follow the [Azure app creation guide](https://learn.microsoft.com/en-us/entra/identity-platform/quickstart-register-app#register-an-application),\n set the **Redirect URI** to {{redirectUrl}} and add the following **Microsoft Graph (Delegated) permissions** under **API permissions**:\n - Contacts.ReadWrite\n - offline_access",
"Create a Contact": "Créer un contact",
"Delete a Contact": "Supprimer un contact",
"Update a Contact": "Mettre à jour un contact",
diff --git a/packages/pieces/community/microsoft-365-people/src/i18n/ja.json b/packages/pieces/community/microsoft-365-people/src/i18n/ja.json
index a943f2a1386..a7bb8e99518 100644
--- a/packages/pieces/community/microsoft-365-people/src/i18n/ja.json
+++ b/packages/pieces/community/microsoft-365-people/src/i18n/ja.json
@@ -1,6 +1,6 @@
{
"Manage contacts in Microsoft 365 People": "Microsoft 365ユーザーの連絡先を管理",
- "\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** → **Delegated permissions**.\n - Add the following scopes:\n - Contacts.ReadWrite\n - offline_access\n - Click **Add permissions**.\n12. Copy your **Client ID** and **Client Secret**.\n",
+ "\nIf you’d like to use your own custom Azure app instead of the default Activepieces app, follow the [Azure app creation guide](https://learn.microsoft.com/en-us/entra/identity-platform/quickstart-register-app#register-an-application),\n set the **Redirect URI** to {{redirectUrl}} and add the following **Microsoft Graph (Delegated) permissions** under **API permissions**:\n - Contacts.ReadWrite\n - offline_access": "\nIf you’d like to use your own custom Azure app instead of the default Activepieces app, follow the [Azure app creation guide](https://learn.microsoft.com/en-us/entra/identity-platform/quickstart-register-app#register-an-application),\n set the **Redirect URI** to {{redirectUrl}} and add the following **Microsoft Graph (Delegated) permissions** under **API permissions**:\n - Contacts.ReadWrite\n - offline_access",
"Create a Contact": "連絡先を作成",
"Delete a Contact": "連絡先を削除",
"Update a Contact": "連絡先を更新",
diff --git a/packages/pieces/community/microsoft-365-people/src/i18n/nl.json b/packages/pieces/community/microsoft-365-people/src/i18n/nl.json
index 92f90a06d6c..33d1597c910 100644
--- a/packages/pieces/community/microsoft-365-people/src/i18n/nl.json
+++ b/packages/pieces/community/microsoft-365-people/src/i18n/nl.json
@@ -1,6 +1,6 @@
{
"Manage contacts in Microsoft 365 People": "Beheer contacten in Microsoft 365 mensen",
- "\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. Log in bij [Microsoft Azure Portal](https://portal.azure.com/).\n. Ga naar **Microsoft Enfra ID**.\n3. Onder **Beheren**, klik op **App registraties**.\n4. Klik op de **Nieuwe registratie** knop.\n5. Voer een **Naam** in voor uw app.\n6. Voor **Ondersteunde accounttypen**, kies keuze:\n - **Accounts in elke map van de organisatie (Any Microsoft Entra ID-tenant - Multitenant) en persoonlijke Microsoft accounts**\n - Of selecteer gebaseerd op uw vereiste.\n7. In **Redirect URI** selecteer **Web** en voeg de opgegeven URL toe.\n8. Klik op **Register**.\n9. Na registratie wordt u doorverwezen naar de overzichtspagina. Kopieer de **Applicatie (client) ID**.\n10. Vanuit het linkermenu ga naar **Certificaten & geheimen**.\n - Klik onder **Client geheimen** op **Nieuwe client geheim**.\n - Geef een beschrijving, verloop, en klik **Toevoegen**.\n - Kopieer de **Waarde** van de client secret (dit zal niet meer worden getoond).\n11. Ga naar **API-rechten** vanuit het linkermenu.\n - Klik **Een machtiging toevoegen**.\n - Selecteer **Microsoft Graph** → **gedelegeerde rechten**.\n - Voeg de volgende toepassingsgebieden toe:\n - Contacten. eadWrite\n - offline_access \n - Klik **Permissies toevoegen**.\n12. Kopieer uw **Client ID** en **Client Secret**.\n",
+ "\nIf you’d like to use your own custom Azure app instead of the default Activepieces app, follow the [Azure app creation guide](https://learn.microsoft.com/en-us/entra/identity-platform/quickstart-register-app#register-an-application),\n set the **Redirect URI** to {{redirectUrl}} and add the following **Microsoft Graph (Delegated) permissions** under **API permissions**:\n - Contacts.ReadWrite\n - offline_access": "\nAls u uw eigen aangepaste Azure app wilt gebruiken in plaats van de standaard Activepieces app, Volg de [Azure app creatie handleiding] (https://learn.microsoft.com/en-us/entra/identity-platform/quickstart-register-app#register-an-application),\n zet de **Redirect URI** in op {{redirectUrl}} en voeg de volgende **Microsoft Graph (Delegated) permissies** toe onder **API permissies**:\n - Contacten. eadWrite\n - offline_access",
"Create a Contact": "Een contactpersoon aanmaken",
"Delete a Contact": "Verwijder een contactpersoon",
"Update a Contact": "Een contactpersoon bijwerken",
diff --git a/packages/pieces/community/microsoft-365-people/src/i18n/pt.json b/packages/pieces/community/microsoft-365-people/src/i18n/pt.json
index 8bef90e1725..79d275d8564 100644
--- a/packages/pieces/community/microsoft-365-people/src/i18n/pt.json
+++ b/packages/pieces/community/microsoft-365-people/src/i18n/pt.json
@@ -1,6 +1,6 @@
{
"Manage contacts in Microsoft 365 People": "Gerenciar contatos no Microsoft 365 People",
- "\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. Entre no [Microsoft Azure Portal](https://portal.azure.com/).\n. Na barra lateral esquerda, vá até **Microsoft Enfra ID**.\n3. Sob **Gerenciar**, clique em **Aplicativos registrados**.\n4. Clique no botão **Novo registro**.\n5. Digite um **Nome** para o seu aplicativo.\n6. Para **Tipos de conta suportados**, escolha:\n - **Contas em qualquer diretório organizacional (qualquer inquilino de ID da Microsoft Entra - Multitenant) e contas pessoais da Microsoft**\n - Ou selecione com base nos seus requisitos.\n7. Em **URI de redirecionamento**, selecione **Web** e adicione a URL fornecida.\n8. Clique em **Registrar**.\n9. Após o registro, você será redirecionado para a página de visão geral do aplicativo. Copie o **aplicativo (cliente) ID**.\n10. Do menu à esquerda, vá para **Certificados e segredos**.\n - Em **Segredos do Cliente**, clique em **Novo segredo do Cliente**.\n - Fornece uma descrição, define um vencimento e clique em **Adicionar**.\n - Copiar o **Valor** do segredo do cliente (não será mostrado novamente).\n11. Vá para **Permissões da API** no menu à esquerda.\n - Clique em **Adicionar permissão**.\n - Selecione **Microsoft Graph** → **Delegated permissions**.\n - Adicionar os seguintes escopos:\n - Contatos. eadWrite\n - offline_access \n - Clique em **Adicionar permissões**.\n12. Copie seu **ID do Cliente** e **Segredo do Cliente**.\n",
+ "\nIf you’d like to use your own custom Azure app instead of the default Activepieces app, follow the [Azure app creation guide](https://learn.microsoft.com/en-us/entra/identity-platform/quickstart-register-app#register-an-application),\n set the **Redirect URI** to {{redirectUrl}} and add the following **Microsoft Graph (Delegated) permissions** under **API permissions**:\n - Contacts.ReadWrite\n - offline_access": "\nIf you’d like to use your own custom Azure app instead of the default Activepieces app, follow the [Azure app creation guide](https://learn.microsoft.com/en-us/entra/identity-platform/quickstart-register-app#register-an-application),\n set the **Redirect URI** to {{redirectUrl}} and add the following **Microsoft Graph (Delegated) permissions** under **API permissions**:\n - Contacts.ReadWrite\n - offline_access",
"Create a Contact": "Criar um contato",
"Delete a Contact": "Excluir um contato",
"Update a Contact": "Atualizar um contato",
diff --git a/packages/pieces/community/microsoft-365-people/src/i18n/zh.json b/packages/pieces/community/microsoft-365-people/src/i18n/zh.json
index 7d3d5df859c..dfef50a5b63 100644
--- a/packages/pieces/community/microsoft-365-people/src/i18n/zh.json
+++ b/packages/pieces/community/microsoft-365-people/src/i18n/zh.json
@@ -1,6 +1,6 @@
{
"Manage contacts in Microsoft 365 People": "Manage contacts in Microsoft 365 People",
- "\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** → **Delegated permissions**.\n - Add the following scopes:\n - Contacts.ReadWrite\n - offline_access\n - Click **Add permissions**.\n12. Copy your **Client ID** and **Client Secret**.\n",
+ "\nIf you’d like to use your own custom Azure app instead of the default Activepieces app, follow the [Azure app creation guide](https://learn.microsoft.com/en-us/entra/identity-platform/quickstart-register-app#register-an-application),\n set the **Redirect URI** to {{redirectUrl}} and add the following **Microsoft Graph (Delegated) permissions** under **API permissions**:\n - Contacts.ReadWrite\n - offline_access": "\nIf you’d like to use your own custom Azure app instead of the default Activepieces app, follow the [Azure app creation guide](https://learn.microsoft.com/en-us/entra/identity-platform/quickstart-register-app#register-an-application),\n set the **Redirect URI** to {{redirectUrl}} and add the following **Microsoft Graph (Delegated) permissions** under **API permissions**:\n - Contacts.ReadWrite\n - offline_access",
"Create a Contact": "Create a Contact",
"Delete a Contact": "Delete a Contact",
"Update a Contact": "Update a Contact",
diff --git a/packages/pieces/community/microsoft-365-planner/package.json b/packages/pieces/community/microsoft-365-planner/package.json
index 0fe0a77ae0e..4762339a665 100644
--- a/packages/pieces/community/microsoft-365-planner/package.json
+++ b/packages/pieces/community/microsoft-365-planner/package.json
@@ -1,6 +1,6 @@
{
"name": "@activepieces/piece-microsoft-365-planner",
- "version": "0.1.9",
+ "version": "0.1.10",
"type": "commonjs",
"main": "./dist/src/index.js",
"types": "./dist/src/index.d.ts",
diff --git a/packages/pieces/community/microsoft-365-planner/src/i18n/de.json b/packages/pieces/community/microsoft-365-planner/src/i18n/de.json
index 8dd1f9928cd..2721fb3fe36 100644
--- a/packages/pieces/community/microsoft-365-planner/src/i18n/de.json
+++ b/packages/pieces/community/microsoft-365-planner/src/i18n/de.json
@@ -1,5 +1,6 @@
{
"Microsoft 365 Planner is part of the Microsoft 365 suite, offering lightweight task and bucket-based planning for teams. This integration supports creating plans, buckets, tasks, fetching them, deleting them, and custom API calls.": "Microsoft 365 Planner ist Teil der Microsoft 365 Suite und bietet leichte Aufgaben- und Eimer-basierte Planung für Teams. Diese Integration unterstützt die Erstellung von Plänen, Buckets, Aufgaben, das Abrufen, Löschen und benutzerdefinierte API-Aufrufe.",
+ "\nIf you'd like to use your own custom Azure app instead of the default Activepieces app, follow the [Azure app creation guide](https://learn.microsoft.com/en-us/entra/identity-platform/quickstart-register-app#register-an-application),\n set the **Redirect URI** to {{redirectUrl}} and add the following **Microsoft Graph (Delegated) permissions** under **API permissions**:\n - Group.Read.All\n - Tasks.ReadWrite\n - User.Read": "\nWenn Sie Ihre eigene eigene Azure App anstelle der Standard Activepieces App verwenden möchten, folge der [Azure App Erstellungsanleitung](https://learn.microsoft.com/en-us/entra/identity-platform/quickstart-register-app#register-an-application),\n hat die **Umleitungs-URI** auf {{redirectUrl}} gesetzt und die folgenden **Microsoft Graph (Delegiert) Berechtigungen** unter **API Berechtigungen**:\n - Gruppen hinzugefügt. ead.Alle\n - Aufgaben.ReadSchreiben\n - Benutzer.Lesen",
"Create Plan": "Plan erstellen",
"Create Bucket": "Bucket erstellen",
"Create Task": "Aufgabe erstellen",
diff --git a/packages/pieces/community/microsoft-365-planner/src/i18n/es.json b/packages/pieces/community/microsoft-365-planner/src/i18n/es.json
index f772fe88f23..f4198cd33ed 100644
--- a/packages/pieces/community/microsoft-365-planner/src/i18n/es.json
+++ b/packages/pieces/community/microsoft-365-planner/src/i18n/es.json
@@ -1,5 +1,6 @@
{
"Microsoft 365 Planner is part of the Microsoft 365 suite, offering lightweight task and bucket-based planning for teams. This integration supports creating plans, buckets, tasks, fetching them, deleting them, and custom API calls.": "Microsoft 365 Planner forma parte de la suite Microsoft 365, que ofrece una tarea ligera y una planificación basada en cubos para equipos. Esta integración soporta la creación de planes, cuquetes, tareas, buscarlos, borrarlos y llamadas personalizadas de API.",
+ "\nIf you'd like to use your own custom Azure app instead of the default Activepieces app, follow the [Azure app creation guide](https://learn.microsoft.com/en-us/entra/identity-platform/quickstart-register-app#register-an-application),\n set the **Redirect URI** to {{redirectUrl}} and add the following **Microsoft Graph (Delegated) permissions** under **API permissions**:\n - Group.Read.All\n - Tasks.ReadWrite\n - User.Read": "\nIf you'd like to use your own custom Azure app instead of the default Activepieces app, follow the [Azure app creation guide](https://learn.microsoft.com/en-us/entra/identity-platform/quickstart-register-app#register-an-application),\n set the **Redirect URI** to {{redirectUrl}} and add the following **Microsoft Graph (Delegated) permissions** under **API permissions**:\n - Group.Read.All\n - Tasks.ReadWrite\n - User.Read",
"Create Plan": "Crear plan",
"Create Bucket": "Crear cubo",
"Create Task": "Crear tarea",
diff --git a/packages/pieces/community/microsoft-365-planner/src/i18n/fr.json b/packages/pieces/community/microsoft-365-planner/src/i18n/fr.json
index d33a1dbff0d..60e9a7f851a 100644
--- a/packages/pieces/community/microsoft-365-planner/src/i18n/fr.json
+++ b/packages/pieces/community/microsoft-365-planner/src/i18n/fr.json
@@ -1,5 +1,6 @@
{
"Microsoft 365 Planner is part of the Microsoft 365 suite, offering lightweight task and bucket-based planning for teams. This integration supports creating plans, buckets, tasks, fetching them, deleting them, and custom API calls.": "Microsoft 365 Planner fait partie de la suite Microsoft 365, offrant des tâches légères et une planification basée sur des compartiments pour les équipes. Cette intégration prend en charge la création de plans, de segments, de tâches, la récupération, la suppression et les appels API personnalisés.",
+ "\nIf you'd like to use your own custom Azure app instead of the default Activepieces app, follow the [Azure app creation guide](https://learn.microsoft.com/en-us/entra/identity-platform/quickstart-register-app#register-an-application),\n set the **Redirect URI** to {{redirectUrl}} and add the following **Microsoft Graph (Delegated) permissions** under **API permissions**:\n - Group.Read.All\n - Tasks.ReadWrite\n - User.Read": "\nIf you'd like to use your own custom Azure app instead of the default Activepieces app, follow the [Azure app creation guide](https://learn.microsoft.com/en-us/entra/identity-platform/quickstart-register-app#register-an-application),\n set the **Redirect URI** to {{redirectUrl}} and add the following **Microsoft Graph (Delegated) permissions** under **API permissions**:\n - Group.Read.All\n - Tasks.ReadWrite\n - User.Read",
"Create Plan": "Créer un plan",
"Create Bucket": "Créer un seau",
"Create Task": "Créer une tâche",
diff --git a/packages/pieces/community/microsoft-365-planner/src/i18n/ja.json b/packages/pieces/community/microsoft-365-planner/src/i18n/ja.json
index 4bd9c54aec5..388689f130c 100644
--- a/packages/pieces/community/microsoft-365-planner/src/i18n/ja.json
+++ b/packages/pieces/community/microsoft-365-planner/src/i18n/ja.json
@@ -1,5 +1,6 @@
{
"Microsoft 365 Planner is part of the Microsoft 365 suite, offering lightweight task and bucket-based planning for teams. This integration supports creating plans, buckets, tasks, fetching them, deleting them, and custom API calls.": "Microsoft 365 Plannerは、Microsoft 365スイートの一部であり、チーム向けに軽量なタスクとバケットベースの計画を提供します。 この統合は、プラン、バケット、タスク、フェッチ、削除、カスタム API コールの作成をサポートします。",
+ "\nIf you'd like to use your own custom Azure app instead of the default Activepieces app, follow the [Azure app creation guide](https://learn.microsoft.com/en-us/entra/identity-platform/quickstart-register-app#register-an-application),\n set the **Redirect URI** to {{redirectUrl}} and add the following **Microsoft Graph (Delegated) permissions** under **API permissions**:\n - Group.Read.All\n - Tasks.ReadWrite\n - User.Read": "\nIf you'd like to use your own custom Azure app instead of the default Activepieces app, follow the [Azure app creation guide](https://learn.microsoft.com/en-us/entra/identity-platform/quickstart-register-app#register-an-application),\n set the **Redirect URI** to {{redirectUrl}} and add the following **Microsoft Graph (Delegated) permissions** under **API permissions**:\n - Group.Read.All\n - Tasks.ReadWrite\n - User.Read",
"Create Plan": "プランを作成",
"Create Bucket": "バケットを作成",
"Create Task": "タスクを作成",
diff --git a/packages/pieces/community/microsoft-365-planner/src/i18n/nl.json b/packages/pieces/community/microsoft-365-planner/src/i18n/nl.json
index 10c4fc4d9cc..17429f089c2 100644
--- a/packages/pieces/community/microsoft-365-planner/src/i18n/nl.json
+++ b/packages/pieces/community/microsoft-365-planner/src/i18n/nl.json
@@ -1,5 +1,6 @@
{
"Microsoft 365 Planner is part of the Microsoft 365 suite, offering lightweight task and bucket-based planning for teams. This integration supports creating plans, buckets, tasks, fetching them, deleting them, and custom API calls.": "Microsoft 365 Planner maakt deel uit van de Microsoft 365 suite, biedt lichtgewicht taak en bucket-gebaseerde planning voor teams. Deze integratie ondersteunt het maken van plannen, buckets, taken, ophalen ervan, verwijderen ervan en aangepaste API-oproepen.",
+ "\nIf you'd like to use your own custom Azure app instead of the default Activepieces app, follow the [Azure app creation guide](https://learn.microsoft.com/en-us/entra/identity-platform/quickstart-register-app#register-an-application),\n set the **Redirect URI** to {{redirectUrl}} and add the following **Microsoft Graph (Delegated) permissions** under **API permissions**:\n - Group.Read.All\n - Tasks.ReadWrite\n - User.Read": "\nAls u uw eigen aangepaste Azure app wilt gebruiken in plaats van de standaard Activepieces app, Volg de [Azure app creatie handleiding] (https://learn.microsoft.com/en-us/entra/identity-platform/quickstart-register-app#register-an-application),\n zet de **Redirect URI** in op {{redirectUrl}} en voeg de volgende **Microsoft Graph (Delegated) permissies** toe onder **API permissies**:\n - groep. ead.All\n - Taken.ReadWrite\n - User.Read",
"Create Plan": "Maak Plan aan",
"Create Bucket": "Emmer maken",
"Create Task": "Taak maken",
diff --git a/packages/pieces/community/microsoft-365-planner/src/i18n/pt.json b/packages/pieces/community/microsoft-365-planner/src/i18n/pt.json
index fe4c3652847..c8e5ec184ca 100644
--- a/packages/pieces/community/microsoft-365-planner/src/i18n/pt.json
+++ b/packages/pieces/community/microsoft-365-planner/src/i18n/pt.json
@@ -1,5 +1,6 @@
{
"Microsoft 365 Planner is part of the Microsoft 365 suite, offering lightweight task and bucket-based planning for teams. This integration supports creating plans, buckets, tasks, fetching them, deleting them, and custom API calls.": "O Planejador do Microsoft 365 faz parte do pacote Microsoft 365, oferecendo uma tarefa leve e um planejamento baseado em baldes para equipes. Esta integração suporta a criação de planos, buckets, tarefas, buscando-os, excluindo-as e chamadas de API personalizadas.",
+ "\nIf you'd like to use your own custom Azure app instead of the default Activepieces app, follow the [Azure app creation guide](https://learn.microsoft.com/en-us/entra/identity-platform/quickstart-register-app#register-an-application),\n set the **Redirect URI** to {{redirectUrl}} and add the following **Microsoft Graph (Delegated) permissions** under **API permissions**:\n - Group.Read.All\n - Tasks.ReadWrite\n - User.Read": "\nIf you'd like to use your own custom Azure app instead of the default Activepieces app, follow the [Azure app creation guide](https://learn.microsoft.com/en-us/entra/identity-platform/quickstart-register-app#register-an-application),\n set the **Redirect URI** to {{redirectUrl}} and add the following **Microsoft Graph (Delegated) permissions** under **API permissions**:\n - Group.Read.All\n - Tasks.ReadWrite\n - User.Read",
"Create Plan": "Criar plano",
"Create Bucket": "Criar Balde",
"Create Task": "Criar tarefa",
diff --git a/packages/pieces/community/microsoft-365-planner/src/i18n/zh.json b/packages/pieces/community/microsoft-365-planner/src/i18n/zh.json
index 8644546d156..d2e31918ff8 100644
--- a/packages/pieces/community/microsoft-365-planner/src/i18n/zh.json
+++ b/packages/pieces/community/microsoft-365-planner/src/i18n/zh.json
@@ -1,5 +1,6 @@
{
"Microsoft 365 Planner is part of the Microsoft 365 suite, offering lightweight task and bucket-based planning for teams. This integration supports creating plans, buckets, tasks, fetching them, deleting them, and custom API calls.": "Microsoft 365 Planner is part of the Microsoft 365 suite, offering lightweight task and bucket-based planning for teams. This integration supports creating plans, buckets, tasks, fetching them, deleting them, and custom API calls.",
+ "\nIf you'd like to use your own custom Azure app instead of the default Activepieces app, follow the [Azure app creation guide](https://learn.microsoft.com/en-us/entra/identity-platform/quickstart-register-app#register-an-application),\n set the **Redirect URI** to {{redirectUrl}} and add the following **Microsoft Graph (Delegated) permissions** under **API permissions**:\n - Group.Read.All\n - Tasks.ReadWrite\n - User.Read": "\nIf you'd like to use your own custom Azure app instead of the default Activepieces app, follow the [Azure app creation guide](https://learn.microsoft.com/en-us/entra/identity-platform/quickstart-register-app#register-an-application),\n set the **Redirect URI** to {{redirectUrl}} and add the following **Microsoft Graph (Delegated) permissions** under **API permissions**:\n - Group.Read.All\n - Tasks.ReadWrite\n - User.Read",
"Create Plan": "Create Plan",
"Create Bucket": "Create Bucket",
"Create Task": "Create Task",
diff --git a/packages/pieces/community/microsoft-dynamics-365-business-central/package.json b/packages/pieces/community/microsoft-dynamics-365-business-central/package.json
index bd82c94f922..7e34de170f4 100644
--- a/packages/pieces/community/microsoft-dynamics-365-business-central/package.json
+++ b/packages/pieces/community/microsoft-dynamics-365-business-central/package.json
@@ -1,6 +1,6 @@
{
"name": "@activepieces/piece-microsoft-dynamics-365-business-central",
- "version": "0.1.5",
+ "version": "0.1.6",
"main": "./dist/src/index.js",
"types": "./dist/src/index.d.ts",
"scripts": {
diff --git a/packages/pieces/community/microsoft-dynamics-365-business-central/src/i18n/de.json b/packages/pieces/community/microsoft-dynamics-365-business-central/src/i18n/de.json
index 84ca53974db..2640c3b8d81 100644
--- a/packages/pieces/community/microsoft-dynamics-365-business-central/src/i18n/de.json
+++ b/packages/pieces/community/microsoft-dynamics-365-business-central/src/i18n/de.json
@@ -2,7 +2,7 @@
"All-in-one business management solution by Microsoft.": "All-in-One Business Management Lösung von Microsoft.",
"Environment": "Umgebung",
"Name of the environment to connect to, e.g. 'Production' or 'Sandbox'. Environment names can be found in the Business Central Admin Center.": "Name der Umgebung, zu der eine Verbindung hergestellt werden soll, z.B. 'Produktion' oder 'Sandbox'. Umweltnamen finden Sie im Business Central Admin Center.",
- "\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 **Umleitungs-URI** wählen Sie **Web** und fügen Sie die angegebene URL hinzu.\n8. Klicken Sie auf **Registrieren**.\n9. Nach der Registrierung werden Sie zur Übersichtsseite der App weitergeleitet. Kopieren Sie die **Anwendungs-(Client)-ID**.\n10. Gehen Sie aus dem linken Menü zu **Zertifikate & Geheimnis**.\n - Unter **Kundengeheimnis**, klicken Sie **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 auf **Berechtigung hinzufügen**.\n - Wähle **Dynamics 365 Business Central** → **Delegierte Berechtigungen**.\n - Fügen Sie folgende Bereiche hinzu:\n - Finanzen. eadWrite.All\n - user_impersonation \n - Klicken Sie auf **Berechtigungen hinzufügen**.\n12. Kopieren Sie Ihre **Client-ID** und **Client-Geheimnis**.\n",
+ "\nIf you’d like to use your own custom Azure app instead of the default Activepieces app, follow the [Azure app creation guide](https://learn.microsoft.com/en-us/entra/identity-platform/quickstart-register-app#register-an-application),\n set the **Redirect URI** to {{redirectUrl}} and add the following **Dynamics 365 Business Central permissions** under **API permissions**:\n - Financials.ReadWrite.All\n - user_impersonation\n": "\nWenn du deine eigene eigene Azure App anstelle der Standard Activepieces App verwenden möchtest, folge der [Azure App Erstellungsanleitung](https://learn.microsoft.com/en-us/entra/identity-platform/quickstart-register-app#register-an-application),\n setzte die **Umleitungs-URI** auf {{redirectUrl}} und füge folgende **Dynamics 365 Business Central Berechtigungen** unter **API Berechtigungen**:\n - Finanzen. eadWrite.Alle\n - user_impersonation\n",
"Create Record": "Datensatz erstellen",
"Delete Record": "Datensatz löschen",
"Get Record": "Datensatz abrufen",
diff --git a/packages/pieces/community/microsoft-dynamics-365-business-central/src/i18n/es.json b/packages/pieces/community/microsoft-dynamics-365-business-central/src/i18n/es.json
index 7a5c653a59b..349e9b42e17 100644
--- a/packages/pieces/community/microsoft-dynamics-365-business-central/src/i18n/es.json
+++ b/packages/pieces/community/microsoft-dynamics-365-business-central/src/i18n/es.json
@@ -2,7 +2,7 @@
"All-in-one business management solution by Microsoft.": "Solución de gestión de negocios todo en uno por Microsoft.",
"Environment": "Entorno",
"Name of the environment to connect to, e.g. 'Production' or 'Sandbox'. Environment names can be found in the Business Central Admin Center.": "Nombre del entorno al que conectar, por ejemplo, 'Producción' o 'Sandbox'. Los nombres de entorno se pueden encontrar en el Business Central Admin Center.",
- "\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 **Dynamics 365 Business Central** → **Delegated permissions**.\n - Add the following scopes:\n - Financials.ReadWrite.All\n - user_impersonation\n - Click **Add permissions**.\n12. Copy your **Client ID** and **Client Secret**.\n",
+ "\nIf you’d like to use your own custom Azure app instead of the default Activepieces app, follow the [Azure app creation guide](https://learn.microsoft.com/en-us/entra/identity-platform/quickstart-register-app#register-an-application),\n set the **Redirect URI** to {{redirectUrl}} and add the following **Dynamics 365 Business Central permissions** under **API permissions**:\n - Financials.ReadWrite.All\n - user_impersonation\n": "\nIf you’d like to use your own custom Azure app instead of the default Activepieces app, follow the [Azure app creation guide](https://learn.microsoft.com/en-us/entra/identity-platform/quickstart-register-app#register-an-application),\n set the **Redirect URI** to {{redirectUrl}} and add the following **Dynamics 365 Business Central permissions** under **API permissions**:\n - Financials.ReadWrite.All\n - user_impersonation\n",
"Create Record": "Crear registro",
"Delete Record": "Eliminar registro",
"Get Record": "Obtener registro",
diff --git a/packages/pieces/community/microsoft-dynamics-365-business-central/src/i18n/fr.json b/packages/pieces/community/microsoft-dynamics-365-business-central/src/i18n/fr.json
index 4993ce1bb5d..016c244d552 100644
--- a/packages/pieces/community/microsoft-dynamics-365-business-central/src/i18n/fr.json
+++ b/packages/pieces/community/microsoft-dynamics-365-business-central/src/i18n/fr.json
@@ -2,7 +2,7 @@
"All-in-one business management solution by Microsoft.": "Solution de gestion globale de l'entreprise de Microsoft.",
"Environment": "Environnement",
"Name of the environment to connect to, e.g. 'Production' or 'Sandbox'. Environment names can be found in the Business Central Admin Center.": "Nom de l'environnement auquel se connecter, par exemple 'Production' ou 'Sandbox'. Les noms d'environnement peuvent être trouvés dans le Business Central Admin Center.",
- "\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 **Dynamics 365 Business Central** → **Delegated permissions**.\n - Add the following scopes:\n - Financials.ReadWrite.All\n - user_impersonation\n - Click **Add permissions**.\n12. Copy your **Client ID** and **Client Secret**.\n",
+ "\nIf you’d like to use your own custom Azure app instead of the default Activepieces app, follow the [Azure app creation guide](https://learn.microsoft.com/en-us/entra/identity-platform/quickstart-register-app#register-an-application),\n set the **Redirect URI** to {{redirectUrl}} and add the following **Dynamics 365 Business Central permissions** under **API permissions**:\n - Financials.ReadWrite.All\n - user_impersonation\n": "\nIf you’d like to use your own custom Azure app instead of the default Activepieces app, follow the [Azure app creation guide](https://learn.microsoft.com/en-us/entra/identity-platform/quickstart-register-app#register-an-application),\n set the **Redirect URI** to {{redirectUrl}} and add the following **Dynamics 365 Business Central permissions** under **API permissions**:\n - Financials.ReadWrite.All\n - user_impersonation\n",
"Create Record": "Créer un enregistrement",
"Delete Record": "Supprimer l'enregistrement",
"Get Record": "Obtenir un enregistrement",
diff --git a/packages/pieces/community/microsoft-dynamics-365-business-central/src/i18n/ja.json b/packages/pieces/community/microsoft-dynamics-365-business-central/src/i18n/ja.json
index dc074343c66..230fa2be7df 100644
--- a/packages/pieces/community/microsoft-dynamics-365-business-central/src/i18n/ja.json
+++ b/packages/pieces/community/microsoft-dynamics-365-business-central/src/i18n/ja.json
@@ -2,7 +2,7 @@
"All-in-one business management solution by Microsoft.": "Microsoftによるオールインワンのビジネス管理ソリューション。",
"Environment": "環境",
"Name of the environment to connect to, e.g. 'Production' or 'Sandbox'. Environment names can be found in the Business Central Admin Center.": "「Production」や「Sandbox」など、接続する環境の名前は、Business Central Admin Center に記載されています。",
- "\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 **Dynamics 365 Business Central** → **Delegated permissions**.\n - Add the following scopes:\n - Financials.ReadWrite.All\n - user_impersonation\n - Click **Add permissions**.\n12. Copy your **Client ID** and **Client Secret**.\n",
+ "\nIf you’d like to use your own custom Azure app instead of the default Activepieces app, follow the [Azure app creation guide](https://learn.microsoft.com/en-us/entra/identity-platform/quickstart-register-app#register-an-application),\n set the **Redirect URI** to {{redirectUrl}} and add the following **Dynamics 365 Business Central permissions** under **API permissions**:\n - Financials.ReadWrite.All\n - user_impersonation\n": "\nIf you’d like to use your own custom Azure app instead of the default Activepieces app, follow the [Azure app creation guide](https://learn.microsoft.com/en-us/entra/identity-platform/quickstart-register-app#register-an-application),\n set the **Redirect URI** to {{redirectUrl}} and add the following **Dynamics 365 Business Central permissions** under **API permissions**:\n - Financials.ReadWrite.All\n - user_impersonation\n",
"Create Record": "レコードを作成",
"Delete Record": "レコードを削除",
"Get Record": "レコードを取得",
diff --git a/packages/pieces/community/microsoft-dynamics-365-business-central/src/i18n/nl.json b/packages/pieces/community/microsoft-dynamics-365-business-central/src/i18n/nl.json
index 5c987b92251..11778a38c5b 100644
--- a/packages/pieces/community/microsoft-dynamics-365-business-central/src/i18n/nl.json
+++ b/packages/pieces/community/microsoft-dynamics-365-business-central/src/i18n/nl.json
@@ -2,7 +2,7 @@
"All-in-one business management solution by Microsoft.": "Alles-in-één oplossing voor bedrijfsbeheer door Microsoft.",
"Environment": "Milieu",
"Name of the environment to connect to, e.g. 'Production' or 'Sandbox'. Environment names can be found in the Business Central Admin Center.": "Naam van de omgeving waarmee u verbinding wilt maken, bijvoorbeeld 'Productie' of 'Sandbox'. Omgevingsnamen zijn te vinden in het Business Central Admin Centrum.",
- "\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. Log in bij [Microsoft Azure Portal](https://portal.azure.com/).\n. Ga naar **Microsoft Enfra ID**.\n3. Onder **Beheren**, klik op **App registraties**.\n4. Klik op de **Nieuwe registratie** knop.\n5. Voer een **Naam** in voor uw app.\n6. Voor **Ondersteunde accounttypen**, kies keuze:\n - **Accounts in elke map van de organisatie (Any Microsoft Entra ID-tenant - Multitenant) en persoonlijke Microsoft accounts**\n - Of selecteer gebaseerd op uw vereiste.\n7. In **Redirect URI**, selecteer **Web** en voeg de opgegeven URL toe.\n8. Klik **Register**.\n9. Na registratie wordt u doorverwezen naar de overzichtspagina. Kopieer de **Applicatie (client) ID**.\n10. Vanuit het linkermenu ga naar **Certificaten & geheimen**.\n - Onder **Client secrets**, klik op **Nieuwe client geheim**.\n - Geef een beschrijving, verloop, en klik **Toevoegen**.\n - Kopieer de **waarde** van de client secret (dit zal niet meer worden weergegeven).\n11. Ga naar **API permissies** in het linkermenu.\n - Klik **Voeg een permissie toe**.\n - Selecteer **Dynamics 365 Business Central** → **Delegated permissies**.\n - Voeg de volgende toepassingsgebieden toe:\n - Financiën. eadWrite.Alle\n - user_impersonation \n - Klik **Permissies toevoegen**.\n12. Kopieer uw **Client ID** en **Client Secret**.\n",
+ "\nIf you’d like to use your own custom Azure app instead of the default Activepieces app, follow the [Azure app creation guide](https://learn.microsoft.com/en-us/entra/identity-platform/quickstart-register-app#register-an-application),\n set the **Redirect URI** to {{redirectUrl}} and add the following **Dynamics 365 Business Central permissions** under **API permissions**:\n - Financials.ReadWrite.All\n - user_impersonation\n": "\nAls u uw eigen aangepaste Azure app wilt gebruiken in plaats van de standaard Activepieces app, Volg de [Azure app creatie handleiding] (https://learn.microsoft.com/en-us/entra/identity-platform/quickstart-register-app#register-an-application),\n zet de **Redirect URI** naar {{redirectUrl}} en voeg de volgende **Dynamics 365 Business Central permissies** toe onder **API permissies**:\n - Financiën. eadWrite.Alle\n - user_impersonation\n",
"Create Record": "Record Maken",
"Delete Record": "Record verwijderen",
"Get Record": "Krijg Record",
diff --git a/packages/pieces/community/microsoft-dynamics-365-business-central/src/i18n/pt.json b/packages/pieces/community/microsoft-dynamics-365-business-central/src/i18n/pt.json
index 544eb0c7f6c..cf8df2f49c1 100644
--- a/packages/pieces/community/microsoft-dynamics-365-business-central/src/i18n/pt.json
+++ b/packages/pieces/community/microsoft-dynamics-365-business-central/src/i18n/pt.json
@@ -2,7 +2,7 @@
"All-in-one business management solution by Microsoft.": "Solução completa de gerenciamento de negócios pela Microsoft.",
"Environment": "Seguros",
"Name of the environment to connect to, e.g. 'Production' or 'Sandbox'. Environment names can be found in the Business Central Admin Center.": "Nome do ambiente a se conectar, por exemplo, 'Produção' ou 'Sandbox'. Os nomes dos ambientes podem ser encontrados no Centro de Administração da Empresa",
- "\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. Entre no [Microsoft Azure Portal](https://portal.azure.com/).\n. Na barra lateral esquerda, vá até **Microsoft Enfra ID**.\n3. Sob **Gerenciar**, clique em **Aplicativos registrados**.\n4. Clique no botão **Novo registro**.\n5. Digite um **Nome** para o seu aplicativo.\n6. Para **Tipos de conta suportados**, escolha:\n - **Contas em qualquer diretório organizacional (qualquer inquilino de ID da Microsoft Entra - Multitenant) e contas pessoais da Microsoft**\n - Ou selecione com base nos seus requisitos.\n7. Em **URI de redirecionamento**, selecione **Web** e adicione a URL fornecida.\n8. Clique em **Registrar**.\n9. Após o registro, você será redirecionado para a página de visão geral do aplicativo. Copie o **ID do aplicativo (cliente) **.\n10. No menu da esquerda, vá para **Certificados e segredos**.\n - Em **Segredos do cliente**, clique em **Novo segredo do cliente**.\n - Fornece uma descrição, define um vencimento e clique em **Adicionar**.\n - Copiar o **Valor** do segredo do cliente (isso não será exibido novamente).\n11. Vá para **permissões de API** no menu à esquerda.\n - Clique em **Adicionar uma permissão**.\n - Selecione **Dynamics 365 Business Central** → **Delegated permissions**.\n - Adicione os seguintes escopos:\n - Financeiros. eadWrite.All\n - user_impersonation \n - Clique em **Adicionar permissões**.\n12. Copie seu **ID do Cliente** e **Segredo do Cliente**.\n",
+ "\nIf you’d like to use your own custom Azure app instead of the default Activepieces app, follow the [Azure app creation guide](https://learn.microsoft.com/en-us/entra/identity-platform/quickstart-register-app#register-an-application),\n set the **Redirect URI** to {{redirectUrl}} and add the following **Dynamics 365 Business Central permissions** under **API permissions**:\n - Financials.ReadWrite.All\n - user_impersonation\n": "\nIf you’d like to use your own custom Azure app instead of the default Activepieces app, follow the [Azure app creation guide](https://learn.microsoft.com/en-us/entra/identity-platform/quickstart-register-app#register-an-application),\n set the **Redirect URI** to {{redirectUrl}} and add the following **Dynamics 365 Business Central permissions** under **API permissions**:\n - Financials.ReadWrite.All\n - user_impersonation\n",
"Create Record": "Criar Registro",
"Delete Record": "Excluir registro",
"Get Record": "Obter Registro",
diff --git a/packages/pieces/community/microsoft-dynamics-365-business-central/src/i18n/zh.json b/packages/pieces/community/microsoft-dynamics-365-business-central/src/i18n/zh.json
index b1e48b16462..c30d538e195 100644
--- a/packages/pieces/community/microsoft-dynamics-365-business-central/src/i18n/zh.json
+++ b/packages/pieces/community/microsoft-dynamics-365-business-central/src/i18n/zh.json
@@ -2,7 +2,7 @@
"All-in-one business management solution by Microsoft.": "All-in-one business management solution by Microsoft.",
"Environment": "Environment",
"Name of the environment to connect to, e.g. 'Production' or 'Sandbox'. Environment names can be found in the Business Central Admin Center.": "Name of the environment to connect to, e.g. 'Production' or 'Sandbox'. Environment names can be found in the Business Central Admin Center.",
- "\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 **Dynamics 365 Business Central** → **Delegated permissions**.\n - Add the following scopes:\n - Financials.ReadWrite.All\n - user_impersonation\n - Click **Add permissions**.\n12. Copy your **Client ID** and **Client Secret**.\n",
+ "\nIf you’d like to use your own custom Azure app instead of the default Activepieces app, follow the [Azure app creation guide](https://learn.microsoft.com/en-us/entra/identity-platform/quickstart-register-app#register-an-application),\n set the **Redirect URI** to {{redirectUrl}} and add the following **Dynamics 365 Business Central permissions** under **API permissions**:\n - Financials.ReadWrite.All\n - user_impersonation\n": "\nIf you’d like to use your own custom Azure app instead of the default Activepieces app, follow the [Azure app creation guide](https://learn.microsoft.com/en-us/entra/identity-platform/quickstart-register-app#register-an-application),\n set the **Redirect URI** to {{redirectUrl}} and add the following **Dynamics 365 Business Central permissions** under **API permissions**:\n - Financials.ReadWrite.All\n - user_impersonation\n",
"Create Record": "Create Record",
"Delete Record": "Delete Record",
"Get Record": "Get Record",
diff --git a/packages/pieces/community/microsoft-dynamics-crm/package.json b/packages/pieces/community/microsoft-dynamics-crm/package.json
index e9fb70f4401..05b66ca8c7f 100644
--- a/packages/pieces/community/microsoft-dynamics-crm/package.json
+++ b/packages/pieces/community/microsoft-dynamics-crm/package.json
@@ -1,6 +1,6 @@
{
"name": "@activepieces/piece-microsoft-dynamics-crm",
- "version": "0.2.5",
+ "version": "0.2.6",
"main": "./dist/src/index.js",
"types": "./dist/src/index.d.ts",
"scripts": {
diff --git a/packages/pieces/community/microsoft-dynamics-crm/src/i18n/de.json b/packages/pieces/community/microsoft-dynamics-crm/src/i18n/de.json
index 3c82b33c674..ea407ccbd2b 100644
--- a/packages/pieces/community/microsoft-dynamics-crm/src/i18n/de.json
+++ b/packages/pieces/community/microsoft-dynamics-crm/src/i18n/de.json
@@ -6,7 +6,7 @@
"Host URL without trailing slash.For example **https://demo.crm.dynamics.com**": "Host-URL ohne Slash.Zum Beispiel **https://demo.crm.dynamics.com**",
"You can find this in the Azure portal.": "Dies finden Sie im Azure Portal.",
"Keep empty if not needed. Optional proxy URL used for establishing connections when proxying requests is needed. For example: **https://proxy.com:8080**.": "Bleiben Sie leer, wenn nicht nötig. Optionale Proxy-URL, die zur Herstellung von Verbindungen verwendet wird, wenn Proxy-Anfragen benötigt werden. Zum Beispiel: **https://proxy.com:8080**.",
- "\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/).\n2. 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 **Umleitungs-URI** wählen Sie **Web** und fügen Sie die angegebene URL hinzu.\n8. Klicken Sie auf **Registrieren**.\n9. Nach der Registrierung werden Sie zur Übersichtsseite der App weitergeleitet. Kopieren Sie die **Anwendungs-(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 **Dynamics CRM** → **Delegierte Berechtigungen**.\n - Klicke **Berechtigungen hinzufügen**.\n12. Kopieren Sie Ihre **Client-ID** und **Client-Geheimnis**.\n",
+ "\nFollow the [Azure app creation guide](https://learn.microsoft.com/en-us/entra/identity-platform/quickstart-register-app#register-an-application),\n set the **Redirect URI** to {{redirectUrl}} and add the **Dynamics CRM (Delegated) permissions** under **API permissions**.": "\nFolge der [Azure App Erstellungsanleitung](https://learn.microsoft.com/en-us/entra/identity-platform/quickstart-register-app#register-an-application),\n hat die **Umleitungs-URI** auf {{redirectUrl}} gesetzt und die **Dynamics CRM (delegiert) Berechtigungen** unter **API Berechtigungen hinzufügen**.",
"Create Record": "Datensatz erstellen",
"Delete Record": "Datensatz löschen",
"Get Record": "Datensatz abrufen",
diff --git a/packages/pieces/community/microsoft-dynamics-crm/src/i18n/es.json b/packages/pieces/community/microsoft-dynamics-crm/src/i18n/es.json
index e40bde3413c..60b750da647 100644
--- a/packages/pieces/community/microsoft-dynamics-crm/src/i18n/es.json
+++ b/packages/pieces/community/microsoft-dynamics-crm/src/i18n/es.json
@@ -6,7 +6,7 @@
"Host URL without trailing slash.For example **https://demo.crm.dynamics.com**": "URL del host sin slash.Por ejemplo **https://demo.crm.dynamics.com**",
"You can find this in the Azure portal.": "Puede encontrarlo en el portal Azure.",
"Keep empty if not needed. Optional proxy URL used for establishing connections when proxying requests is needed. For example: **https://proxy.com:8080**.": "Dejar vacío si no es necesario. URL opcional del proxy usada para establecer conexiones cuando se necesitan peticiones de proxy. Por ejemplo: **https://proxy.com:8080**.",
- "\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 **Dynamics CRM** → **Delegated permissions**.\n - Click **Add permissions**.\n12. Copy your **Client ID** and **Client Secret**.\n",
+ "\nFollow the [Azure app creation guide](https://learn.microsoft.com/en-us/entra/identity-platform/quickstart-register-app#register-an-application),\n set the **Redirect URI** to {{redirectUrl}} and add the **Dynamics CRM (Delegated) permissions** under **API permissions**.": "\nSigue la [guía de creación de Azure app](https://learn.microsoft.com/en-us/entra/identity-platform/quickstart-register-app#register-an-application),\n estableció la **URI de redireccionamiento** a {{redirectUrl}} y agregó los **permisos de dinámicas CRM (elegidos)** bajo **permisos de API**.",
"Create Record": "Crear registro",
"Delete Record": "Eliminar registro",
"Get Record": "Obtener registro",
diff --git a/packages/pieces/community/microsoft-dynamics-crm/src/i18n/fr.json b/packages/pieces/community/microsoft-dynamics-crm/src/i18n/fr.json
index 6794a47170f..490e6e64717 100644
--- a/packages/pieces/community/microsoft-dynamics-crm/src/i18n/fr.json
+++ b/packages/pieces/community/microsoft-dynamics-crm/src/i18n/fr.json
@@ -6,7 +6,7 @@
"Host URL without trailing slash.For example **https://demo.crm.dynamics.com**": "URL de l'hôte sans slash.Par exemple **https://demo.crm.dynamics.com**",
"You can find this in the Azure portal.": "Vous pouvez le trouver sur le portail Azure.",
"Keep empty if not needed. Optional proxy URL used for establishing connections when proxying requests is needed. For example: **https://proxy.com:8080**.": "Laisser vide si ce n'est pas nécessaire. URL de proxy optionnelle utilisée pour établir des connexions lorsque des requêtes de proxy sont nécessaires. Par exemple : **https://proxy.com:8080**.",
- "\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 **Dynamics CRM** → **Delegated permissions**.\n - Click **Add permissions**.\n12. Copy your **Client ID** and **Client Secret**.\n",
+ "\nFollow the [Azure app creation guide](https://learn.microsoft.com/en-us/entra/identity-platform/quickstart-register-app#register-an-application),\n set the **Redirect URI** to {{redirectUrl}} and add the **Dynamics CRM (Delegated) permissions** under **API permissions**.": "\nFollow the [Azure app creation guide](https://learn.microsoft.com/en-us/entra/identity-platform/quickstart-register-app#register-an-application),\n set the **Redirect URI** to {{redirectUrl}} and add the **Dynamics CRM (Delegated) permissions** under **API permissions**.",
"Create Record": "Créer un enregistrement",
"Delete Record": "Supprimer l'enregistrement",
"Get Record": "Obtenir un enregistrement",
diff --git a/packages/pieces/community/microsoft-dynamics-crm/src/i18n/ja.json b/packages/pieces/community/microsoft-dynamics-crm/src/i18n/ja.json
index 27c07df17f0..7c6aed80ca7 100644
--- a/packages/pieces/community/microsoft-dynamics-crm/src/i18n/ja.json
+++ b/packages/pieces/community/microsoft-dynamics-crm/src/i18n/ja.json
@@ -6,7 +6,7 @@
"Host URL without trailing slash.For example **https://demo.crm.dynamics.com**": "スラッシュの末尾のないホストURL。例えば **https://demo.crm.dynamics.com**",
"You can find this in the Azure portal.": "これは Azure ポータルで確認できます。",
"Keep empty if not needed. Optional proxy URL used for establishing connections when proxying requests is needed. For example: **https://proxy.com:8080**.": "不要な場合は空のままにしておきます。プロキシのリクエストが必要なときに接続を確立するためのオプションのプロキシ URL です。例: **https://proxy.com:8080**",
- "\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 **Dynamics CRM** → **Delegated permissions**.\n - Click **Add permissions**.\n12. Copy your **Client ID** and **Client Secret**.\n",
+ "\nFollow the [Azure app creation guide](https://learn.microsoft.com/en-us/entra/identity-platform/quickstart-register-app#register-an-application),\n set the **Redirect URI** to {{redirectUrl}} and add the **Dynamics CRM (Delegated) permissions** under **API permissions**.": "\nFollow the [Azure app creation guide](https://learn.microsoft.com/en-us/entra/identity-platform/quickstart-register-app#register-an-application),\n set the **Redirect URI** to {{redirectUrl}} and add the **Dynamics CRM (Delegated) permissions** under **API permissions**.",
"Create Record": "レコードを作成",
"Delete Record": "レコードを削除",
"Get Record": "レコードを取得",
diff --git a/packages/pieces/community/microsoft-dynamics-crm/src/i18n/nl.json b/packages/pieces/community/microsoft-dynamics-crm/src/i18n/nl.json
index 06a2c3e251f..9bcc75da361 100644
--- a/packages/pieces/community/microsoft-dynamics-crm/src/i18n/nl.json
+++ b/packages/pieces/community/microsoft-dynamics-crm/src/i18n/nl.json
@@ -6,7 +6,7 @@
"Host URL without trailing slash.For example **https://demo.crm.dynamics.com**": "Host URL zonder slash.Bijvoorbeeld **https://demo.crm.dynamics.com**",
"You can find this in the Azure portal.": "U vindt dit in het Azure portaal.",
"Keep empty if not needed. Optional proxy URL used for establishing connections when proxying requests is needed. For example: **https://proxy.com:8080**.": "Laat leeg indien niet nodig. Optionele proxy URL gebruikt voor het instellen van verbindingen wanneer proxyverzoeken nodig zijn. Bijvoorbeeld: **https://proxy.com:8080**.",
- "\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. Log in bij [Microsoft Azure Portal](https://portal.azure.com/).\n2. Ga naar **Microsoft Enfra ID**.\n3. Onder **Beheren**, klik op **App registraties**.\n4. Klik op de **Nieuwe registratie** knop.\n5. Voer een **Naam** in voor uw app.\n6. Voor **Ondersteunde accounttypen**, kies keuze:\n - **Accounts in elke map van de organisatie (Any Microsoft Entra ID-tenant - Multitenant) en persoonlijke Microsoft accounts**\n - Of selecteer gebaseerd op uw vereiste.\n7. In **Redirect URI**, selecteer **Web** en voeg de opgegeven URL toe.\n8. Klik **Register**.\n9. Na registratie wordt u doorverwezen naar de overzichtspagina. Kopieer de **Applicatie (client) ID**.\n10. Vanuit het linkermenu ga naar **Certificaten en geheimen**.\n - Klik onder **Client geheimen** op **Nieuwe client geheim**.\n - Geef een beschrijving, verloop, en klik **Toevoegen**.\n - Kopieer de **Waarde** van de client secret (dit zal niet meer worden getoond).\n11. Ga naar **API-rechten** vanuit het linkermenu.\n - Klik **Een machtiging toevoegen**.\n - Selecteer **Dynamics CRM** → **Toegewezen machtigingen**.\n - Klik **Permissies toevoegen**.\n12. Kopieer de **Client ID** en **Client Secret**.\n",
+ "\nFollow the [Azure app creation guide](https://learn.microsoft.com/en-us/entra/identity-platform/quickstart-register-app#register-an-application),\n set the **Redirect URI** to {{redirectUrl}} and add the **Dynamics CRM (Delegated) permissions** under **API permissions**.": "\nVolg de [Azure app creatie handleiding] (https://learn.microsoft.com/en-us/entra/identity-platform/quickstart-register-app#register-an-application),\n zet de **Redirect URI** naar {{redirectUrl}} en voegt de **Dynamics CRM (Delegated) permissies** toe onder **API permissies**.",
"Create Record": "Record Maken",
"Delete Record": "Record verwijderen",
"Get Record": "Krijg Record",
diff --git a/packages/pieces/community/microsoft-dynamics-crm/src/i18n/pt.json b/packages/pieces/community/microsoft-dynamics-crm/src/i18n/pt.json
index a1aae0f367b..c332e78e24c 100644
--- a/packages/pieces/community/microsoft-dynamics-crm/src/i18n/pt.json
+++ b/packages/pieces/community/microsoft-dynamics-crm/src/i18n/pt.json
@@ -6,7 +6,7 @@
"Host URL without trailing slash.For example **https://demo.crm.dynamics.com**": "Host URL sem trailing slash.Por exemplo **https://demo.crm.dynamics.com**",
"You can find this in the Azure portal.": "Pode encontrar isso no portal Azure .",
"Keep empty if not needed. Optional proxy URL used for establishing connections when proxying requests is needed. For example: **https://proxy.com:8080**.": "Manter vazio se não necessário. URL de proxy opcional usada para estabelecer conexões quando requisições de proxy é necessário. Por exemplo: **https://proxy.com:8080**.",
- "\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. Entre no [Microsoft Azure Portal](https://portal.azure.com/).\n2. Na barra lateral esquerda, vá até **Microsoft Enfra ID**.\n3. Sob **Gerenciar**, clique em **Aplicativos registrados**.\n4. Clique no botão **Novo registro**.\n5. Digite um **Nome** para o seu aplicativo.\n6. Para **Tipos de conta suportados**, escolha:\n - **Contas em qualquer diretório organizacional (qualquer inquilino de ID da Microsoft Entra - Multitenant) e contas pessoais da Microsoft**\n - Ou selecione com base nos seus requisitos.\n7. Em **URI de redirecionamento**, selecione **Web** e adicione a URL fornecida.\n8. Clique em **Registrar**.\n9. Após o registro, você será redirecionado para a página de visão geral do aplicativo. Copie o **ID do aplicativo (cliente) **.\n10. No menu à esquerda, vá para **Certificados e segredos**.\n - Em **Segredos do Cliente**, clique em **Novo segredo do Cliente**.\n - Fornece uma descrição, define um vencimento e clique em **Adicionar**.\n - Copiar o **Valor** do segredo do cliente (não será mostrado novamente).\n11. Vá para **Permissões da API** no menu à esquerda.\n - Clique em **Adicionar permissão**.\n - Selecione **Dinâmica CRM** → **Delegated permissions**.\n - Clique em **Adicionar permissões**.\n12. Copie seu **ID do Cliente** e **Segredo do Cliente**.\n",
+ "\nFollow the [Azure app creation guide](https://learn.microsoft.com/en-us/entra/identity-platform/quickstart-register-app#register-an-application),\n set the **Redirect URI** to {{redirectUrl}} and add the **Dynamics CRM (Delegated) permissions** under **API permissions**.": "\nSiga o [guia de criação do aplicativo Azure](https://learn.microsoft.com/en-us/entra/identity-platform/quickstart-register-app#register-an-application),\n defina a **URI de redirecionamento** para {{redirectUrl}} e adicione as **permissões de Dynamics CRM (Delegate)** em **permissões de API**.",
"Create Record": "Criar Registro",
"Delete Record": "Excluir registro",
"Get Record": "Obter Registro",
diff --git a/packages/pieces/community/microsoft-dynamics-crm/src/i18n/zh.json b/packages/pieces/community/microsoft-dynamics-crm/src/i18n/zh.json
index 3124799dd58..189b8f82bf6 100644
--- a/packages/pieces/community/microsoft-dynamics-crm/src/i18n/zh.json
+++ b/packages/pieces/community/microsoft-dynamics-crm/src/i18n/zh.json
@@ -6,7 +6,7 @@
"Host URL without trailing slash.For example **https://demo.crm.dynamics.com**": "Host URL without trailing slash.For example **https://demo.crm.dynamics.com**",
"You can find this in the Azure portal.": "You can find this in the Azure portal.",
"Keep empty if not needed. Optional proxy URL used for establishing connections when proxying requests is needed. For example: **https://proxy.com:8080**.": "Keep empty if not needed. Optional proxy URL used for establishing connections when proxying requests is needed. For example: **https://proxy.com:8080**.",
- "\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 **Dynamics CRM** → **Delegated permissions**.\n - Click **Add permissions**.\n12. Copy your **Client ID** and **Client Secret**.\n",
+ "\nFollow the [Azure app creation guide](https://learn.microsoft.com/en-us/entra/identity-platform/quickstart-register-app#register-an-application),\n set the **Redirect URI** to {{redirectUrl}} and add the **Dynamics CRM (Delegated) permissions** under **API permissions**.": "\nFollow the [Azure app creation guide](https://learn.microsoft.com/en-us/entra/identity-platform/quickstart-register-app#register-an-application),\n set the **Redirect URI** to {{redirectUrl}} and add the **Dynamics CRM (Delegated) permissions** under **API permissions**.",
"Create Record": "Create Record",
"Delete Record": "Delete Record",
"Get Record": "Get Record",
diff --git a/packages/pieces/community/microsoft-excel-365/package.json b/packages/pieces/community/microsoft-excel-365/package.json
index c1c03cdc025..8bf4567525b 100644
--- a/packages/pieces/community/microsoft-excel-365/package.json
+++ b/packages/pieces/community/microsoft-excel-365/package.json
@@ -1,6 +1,6 @@
{
"name": "@activepieces/piece-microsoft-excel-365",
- "version": "0.4.12",
+ "version": "0.4.13",
"main": "./dist/src/index.js",
"types": "./dist/src/index.d.ts",
"dependencies": {
diff --git a/packages/pieces/community/microsoft-excel-365/src/i18n/de.json b/packages/pieces/community/microsoft-excel-365/src/i18n/de.json
index 98250a64f51..1d498862e62 100644
--- a/packages/pieces/community/microsoft-excel-365/src/i18n/de.json
+++ b/packages/pieces/community/microsoft-excel-365/src/i18n/de.json
@@ -1,6 +1,6 @@
{
"Spreadsheet software by Microsoft": "Tabellensoftware von Microsoft",
- "\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 ": "\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 **Umleitungs-URI** wählen Sie **Web** und fügen Sie die angegebene URL hinzu.\n8. Klicken Sie auf **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ählen Sie **Microsoft Graph** → **delegierte Berechtigungen**.\n - Fügen Sie folgende Bereiche hinzu:\n - Dateien. eadWrite\n - offline_access \n - Klicken Sie auf **Berechtigungen hinzufügen**.\n12. Kopieren Sie Ihre **Client-ID** und **Client-Geheimnis**.\n",
+ "\nIf you'd like to use your own custom Azure app instead of the default Activepieces app, follow the [Azure app creation guide](https://learn.microsoft.com/en-us/entra/identity-platform/quickstart-register-app#register-an-application),\n set the **Redirect URI** to {{redirectUrl}} and add the following **Microsoft Graph (Delegated) permissions** under **API permissions**:\n - Files.ReadWrite\n - offline_access": "\nWenn Sie Ihre eigene eigene Azure App anstelle der Standard Activepieces App verwenden möchten, folge der [Azure App Erstellungsanleitung](https://learn.microsoft.com/en-us/entra/identity-platform/quickstart-register-app#register-an-application),\n hat die **Umleitungs-URI** auf {{redirectUrl}} gesetzt und die folgenden **Microsoft Graph (Delegiert) Berechtigungen** unter **API Berechtigungen**:\n - Dateien hinzugefügt. eadSchreiben\n - offline_access",
"Append Row to Worksheet": "Zeile an Arbeitsblatt anhängen",
"Append Multiple Rows": "Mehrere Zeilen anhängen",
"Get Worksheets": "Arbeitsblätter abrufen",
diff --git a/packages/pieces/community/microsoft-excel-365/src/i18n/es.json b/packages/pieces/community/microsoft-excel-365/src/i18n/es.json
index 2ffeb8dcbd0..90aa72255fa 100644
--- a/packages/pieces/community/microsoft-excel-365/src/i18n/es.json
+++ b/packages/pieces/community/microsoft-excel-365/src/i18n/es.json
@@ -1,6 +1,6 @@
{
"Spreadsheet software by Microsoft": "Software de hoja de cálculo por Microsoft",
- "\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 ": "\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** → **Delegated permissions**.\n - Add the following scopes:\n - Files.ReadWrite\n - offline_access\n - Click **Add permissions**.\n12. Copy your **Client ID** and **Client Secret**.\n",
+ "\nIf you'd like to use your own custom Azure app instead of the default Activepieces app, follow the [Azure app creation guide](https://learn.microsoft.com/en-us/entra/identity-platform/quickstart-register-app#register-an-application),\n set the **Redirect URI** to {{redirectUrl}} and add the following **Microsoft Graph (Delegated) permissions** under **API permissions**:\n - Files.ReadWrite\n - offline_access": "\nIf you'd like to use your own custom Azure app instead of the default Activepieces app, follow the [Azure app creation guide](https://learn.microsoft.com/en-us/entra/identity-platform/quickstart-register-app#register-an-application),\n set the **Redirect URI** to {{redirectUrl}} and add the following **Microsoft Graph (Delegated) permissions** under **API permissions**:\n - Files.ReadWrite\n - offline_access",
"Append Row to Worksheet": "Añadir fila a la hoja de trabajo",
"Append Multiple Rows": "Añadir múltiples filas",
"Get Worksheets": "Obtener hojas de trabajo",
diff --git a/packages/pieces/community/microsoft-excel-365/src/i18n/fr.json b/packages/pieces/community/microsoft-excel-365/src/i18n/fr.json
index 6993907cf1d..e7865346043 100644
--- a/packages/pieces/community/microsoft-excel-365/src/i18n/fr.json
+++ b/packages/pieces/community/microsoft-excel-365/src/i18n/fr.json
@@ -1,6 +1,6 @@
{
"Spreadsheet software by Microsoft": "Logiciel de la feuille de calcul par Microsoft",
- "\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 ": "\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** → **Delegated permissions**.\n - Add the following scopes:\n - Files.ReadWrite\n - offline_access\n - Click **Add permissions**.\n12. Copy your **Client ID** and **Client Secret**.\n",
+ "\nIf you'd like to use your own custom Azure app instead of the default Activepieces app, follow the [Azure app creation guide](https://learn.microsoft.com/en-us/entra/identity-platform/quickstart-register-app#register-an-application),\n set the **Redirect URI** to {{redirectUrl}} and add the following **Microsoft Graph (Delegated) permissions** under **API permissions**:\n - Files.ReadWrite\n - offline_access": "\nIf you'd like to use your own custom Azure app instead of the default Activepieces app, follow the [Azure app creation guide](https://learn.microsoft.com/en-us/entra/identity-platform/quickstart-register-app#register-an-application),\n set the **Redirect URI** to {{redirectUrl}} and add the following **Microsoft Graph (Delegated) permissions** under **API permissions**:\n - Files.ReadWrite\n - offline_access",
"Append Row to Worksheet": "Ajouter la ligne à la feuille de travail",
"Append Multiple Rows": "Ajouter plusieurs lignes",
"Get Worksheets": "Obtenir des feuilles de travail",
diff --git a/packages/pieces/community/microsoft-excel-365/src/i18n/ja.json b/packages/pieces/community/microsoft-excel-365/src/i18n/ja.json
index de1aa6a7c81..f055328206e 100644
--- a/packages/pieces/community/microsoft-excel-365/src/i18n/ja.json
+++ b/packages/pieces/community/microsoft-excel-365/src/i18n/ja.json
@@ -1,6 +1,6 @@
{
"Spreadsheet software by Microsoft": "Microsoftによるスプレッドシートソフトウェア",
- "\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 ": "\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** → **Delegated permissions**.\n - Add the following scopes:\n - Files.ReadWrite\n - offline_access\n - Click **Add permissions**.\n12. Copy your **Client ID** and **Client Secret**.\n",
+ "\nIf you'd like to use your own custom Azure app instead of the default Activepieces app, follow the [Azure app creation guide](https://learn.microsoft.com/en-us/entra/identity-platform/quickstart-register-app#register-an-application),\n set the **Redirect URI** to {{redirectUrl}} and add the following **Microsoft Graph (Delegated) permissions** under **API permissions**:\n - Files.ReadWrite\n - offline_access": "\nIf you'd like to use your own custom Azure app instead of the default Activepieces app, follow the [Azure app creation guide](https://learn.microsoft.com/en-us/entra/identity-platform/quickstart-register-app#register-an-application),\n set the **Redirect URI** to {{redirectUrl}} and add the following **Microsoft Graph (Delegated) permissions** under **API permissions**:\n - Files.ReadWrite\n - offline_access",
"Append Row to Worksheet": "行をワークシートに追加",
"Append Multiple Rows": "複数の行を追加",
"Get Worksheets": "ワークシートを取得",
diff --git a/packages/pieces/community/microsoft-excel-365/src/i18n/nl.json b/packages/pieces/community/microsoft-excel-365/src/i18n/nl.json
index 0e0b4fd8aba..390c71fbb06 100644
--- a/packages/pieces/community/microsoft-excel-365/src/i18n/nl.json
+++ b/packages/pieces/community/microsoft-excel-365/src/i18n/nl.json
@@ -1,6 +1,6 @@
{
"Spreadsheet software by Microsoft": "Spreadsheet software van Microsoft",
- "\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 ": "\n1. Log in bij [Microsoft Azure Portal](https://portal.azure.com/).\n. Ga naar **Microsoft Enfra ID**.\n3. Onder **Beheren**, klik op **App registraties**.\n4. Klik op de **Nieuwe registratie** knop.\n5. Voer een **Naam** in voor uw app.\n6. Voor **Ondersteunde accounttypen**, kies keuze:\n - **Accounts in elke map van de organisatie (Any Microsoft Entra ID-tenant - Multitenant) en persoonlijke Microsoft accounts**\n - Of selecteer gebaseerd op uw vereiste.\n7. In **Redirect URI** selecteer **Web** en voeg de opgegeven URL toe.\n8. Klik op **Register**.\n9. Na registratie wordt u doorverwezen naar de overzichtspagina. Kopieer de **Applicatie (client) ID**.\n10. Vanuit het linkermenu ga naar **Certificaten & geheimen**.\n - Klik onder **Client geheimen** op **Nieuwe client geheim**.\n - Geef een beschrijving, verloop, en klik **Toevoegen**.\n - Kopieer de **Waarde** van de client secret (dit zal niet meer worden getoond).\n11. Ga naar **API-rechten** vanuit het linkermenu.\n - Klik **Een machtiging toevoegen**.\n - Selecteer **Microsoft Graph** → **gedelegeerde machtigingen**.\n - Voeg de volgende toepassingsgebieden toe:\n - Bestanden. eadWrite\n - offline_access \n - Klik **Permissies toevoegen**.\n12. Kopieer uw **Client ID** en **Client Secret**.\n",
+ "\nIf you'd like to use your own custom Azure app instead of the default Activepieces app, follow the [Azure app creation guide](https://learn.microsoft.com/en-us/entra/identity-platform/quickstart-register-app#register-an-application),\n set the **Redirect URI** to {{redirectUrl}} and add the following **Microsoft Graph (Delegated) permissions** under **API permissions**:\n - Files.ReadWrite\n - offline_access": "\nAls u uw eigen aangepaste Azure app wilt gebruiken in plaats van de standaard Activepieces app, Volg de [Azure app creatie handleiding] (https://learn.microsoft.com/en-us/entra/identity-platform/quickstart-register-app#register-an-application),\n zet de **Redirect URI** naar {{redirectUrl}} en voeg de volgende **Microsoft Graph (Delegated) permissies** toe onder **API permissies**:\n - Bestanden. eadWrite\n - offline_access",
"Append Row to Worksheet": "Rij toevoegen aan werkblad",
"Append Multiple Rows": "Voeg meerdere rijen toe",
"Get Worksheets": "Haal werkbladen op",
diff --git a/packages/pieces/community/microsoft-excel-365/src/i18n/pt.json b/packages/pieces/community/microsoft-excel-365/src/i18n/pt.json
index be65501f9e6..f87b1fee82d 100644
--- a/packages/pieces/community/microsoft-excel-365/src/i18n/pt.json
+++ b/packages/pieces/community/microsoft-excel-365/src/i18n/pt.json
@@ -1,6 +1,6 @@
{
"Spreadsheet software by Microsoft": "Software de planilha da Microsoft",
- "\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 ": "\n1. Entre no [Microsoft Azure Portal](https://portal.azure.com/).\n. Na barra lateral esquerda, vá até **Microsoft Enfra ID**.\n3. Sob **Gerenciar**, clique em **Aplicativos registrados**.\n4. Clique no botão **Novo registro**.\n5. Digite um **Nome** para o seu aplicativo.\n6. Para **Tipos de conta suportados**, escolha:\n - **Contas em qualquer diretório organizacional (qualquer inquilino de ID da Microsoft Entra - Multitenant) e contas pessoais da Microsoft**\n - Ou selecione com base nos seus requisitos.\n7. Em **URI de redirecionamento**, selecione **Web** e adicione a URL fornecida.\n8. Clique em **Registrar**.\n9. Após o registro, você será redirecionado para a página de visão geral do aplicativo. Copie o **aplicativo (cliente) ID**.\n10. Do menu à esquerda, vá para **Certificados e segredos**.\n - Em **Segredos do Cliente**, clique em **Novo segredo do Cliente**.\n - Fornece uma descrição, define um vencimento e clique em **Adicionar**.\n - Copiar o **Valor** do segredo do cliente (não será mostrado novamente).\n11. Vá para **Permissões da API** no menu à esquerda.\n - Clique em **Adicionar permissão**.\n - Selecione **Microsoft Graph** → **Delegated permissions**.\n - Adicione os seguintes escopos:\n - Arquivos. eadWrite\n - offline_access \n - Clique em **Adicionar permissões**.\n12. Copie seu **ID do Cliente** e **Segredo do Cliente**.\n",
+ "\nIf you'd like to use your own custom Azure app instead of the default Activepieces app, follow the [Azure app creation guide](https://learn.microsoft.com/en-us/entra/identity-platform/quickstart-register-app#register-an-application),\n set the **Redirect URI** to {{redirectUrl}} and add the following **Microsoft Graph (Delegated) permissions** under **API permissions**:\n - Files.ReadWrite\n - offline_access": "\nIf you'd like to use your own custom Azure app instead of the default Activepieces app, follow the [Azure app creation guide](https://learn.microsoft.com/en-us/entra/identity-platform/quickstart-register-app#register-an-application),\n set the **Redirect URI** to {{redirectUrl}} and add the following **Microsoft Graph (Delegated) permissions** under **API permissions**:\n - Files.ReadWrite\n - offline_access",
"Append Row to Worksheet": "Acrescentar linha à planilha",
"Append Multiple Rows": "Acrescentar múltiplas linhas",
"Get Worksheets": "Obter planilhas",
diff --git a/packages/pieces/community/microsoft-excel-365/src/i18n/zh.json b/packages/pieces/community/microsoft-excel-365/src/i18n/zh.json
index 699e87ff346..0cea197011c 100644
--- a/packages/pieces/community/microsoft-excel-365/src/i18n/zh.json
+++ b/packages/pieces/community/microsoft-excel-365/src/i18n/zh.json
@@ -1,6 +1,6 @@
{
"Spreadsheet software by Microsoft": "Spreadsheet software by Microsoft",
- "\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 ": "\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** → **Delegated permissions**.\n - Add the following scopes:\n - Files.ReadWrite\n - offline_access\n - Click **Add permissions**.\n12. Copy your **Client ID** and **Client Secret**.\n",
+ "\nIf you'd like to use your own custom Azure app instead of the default Activepieces app, follow the [Azure app creation guide](https://learn.microsoft.com/en-us/entra/identity-platform/quickstart-register-app#register-an-application),\n set the **Redirect URI** to {{redirectUrl}} and add the following **Microsoft Graph (Delegated) permissions** under **API permissions**:\n - Files.ReadWrite\n - offline_access": "\nIf you'd like to use your own custom Azure app instead of the default Activepieces app, follow the [Azure app creation guide](https://learn.microsoft.com/en-us/entra/identity-platform/quickstart-register-app#register-an-application),\n set the **Redirect URI** to {{redirectUrl}} and add the following **Microsoft Graph (Delegated) permissions** under **API permissions**:\n - Files.ReadWrite\n - offline_access",
"Append Row to Worksheet": "Append Row to Worksheet",
"Append Multiple Rows": "Append Multiple Rows",
"Get Worksheets": "Get Worksheets",
diff --git a/packages/pieces/community/microsoft-onedrive/package.json b/packages/pieces/community/microsoft-onedrive/package.json
index b671e237cdc..1956724c15b 100644
--- a/packages/pieces/community/microsoft-onedrive/package.json
+++ b/packages/pieces/community/microsoft-onedrive/package.json
@@ -1,6 +1,6 @@
{
"name": "@activepieces/piece-microsoft-onedrive",
- "version": "0.1.9",
+ "version": "0.1.10",
"main": "./dist/src/index.js",
"types": "./dist/src/index.d.ts",
"dependencies": {
diff --git a/packages/pieces/community/microsoft-onedrive/src/i18n/de.json b/packages/pieces/community/microsoft-onedrive/src/i18n/de.json
index 0780910328a..6788f39f76b 100644
--- a/packages/pieces/community/microsoft-onedrive/src/i18n/de.json
+++ b/packages/pieces/community/microsoft-onedrive/src/i18n/de.json
@@ -1,6 +1,6 @@
{
"Cloud storage by Microsoft": "Cloud-Speicher von Microsoft",
- "\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 **Umleitungs-URI** wählen Sie **Web** und fügen Sie die angegebene URL hinzu.\n8. Klicken Sie auf **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** → **delegierte Berechtigungen**.\n - Fügen Sie folgende Bereiche hinzu:\n - Dateien. eadWrite\n - offline_access \n - Klicken Sie auf **Berechtigungen hinzufügen**.\n12. Kopieren Sie Ihre **Client-ID** und **Client-Geheimnis**.\n",
+ "\nIf you'd like to use your own custom Azure app instead of the default Activepieces app, follow the [Azure app creation guide](https://learn.microsoft.com/en-us/entra/identity-platform/quickstart-register-app#register-an-application),\n set the **Redirect URI** to {{redirectUrl}} and add the following **Microsoft Graph (Delegated) permissions** under **API permissions**:\n - Files.ReadWrite\n - offline_access\n": "\nWenn Sie Ihre eigene eigene Azure App anstelle der Standard Activepieces App verwenden möchten, folge der [Azure App Erstellungsanleitung](https://learn.microsoft.com/en-us/entra/identity-platform/quickstart-register-app#register-an-application),\n hat die **Umleitungs-URI** auf {{redirectUrl}} gesetzt und die folgenden **Microsoft Graph (Delegiert) Berechtigungen** unter **API Berechtigungen**:\n - Dateien hinzugefügt. eadSchreiben\n - offline_access\n",
"Upload file": "Datei hochladen",
"Download file": "Datei herunterladen",
"List Files": "Dateien auflisten",
diff --git a/packages/pieces/community/microsoft-onedrive/src/i18n/es.json b/packages/pieces/community/microsoft-onedrive/src/i18n/es.json
index 8c1710a9fc7..2969a830232 100644
--- a/packages/pieces/community/microsoft-onedrive/src/i18n/es.json
+++ b/packages/pieces/community/microsoft-onedrive/src/i18n/es.json
@@ -1,6 +1,6 @@
{
"Cloud storage by Microsoft": "Almacenamiento en la nube por Microsoft",
- "\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** → **Delegated permissions**.\n - Add the following scopes:\n - Files.ReadWrite\n - offline_access\n - Click **Add permissions**.\n12. Copy your **Client ID** and **Client Secret**.\n",
+ "\nIf you'd like to use your own custom Azure app instead of the default Activepieces app, follow the [Azure app creation guide](https://learn.microsoft.com/en-us/entra/identity-platform/quickstart-register-app#register-an-application),\n set the **Redirect URI** to {{redirectUrl}} and add the following **Microsoft Graph (Delegated) permissions** under **API permissions**:\n - Files.ReadWrite\n - offline_access\n": "\nIf you'd like to use your own custom Azure app instead of the default Activepieces app, follow the [Azure app creation guide](https://learn.microsoft.com/en-us/entra/identity-platform/quickstart-register-app#register-an-application),\n set the **Redirect URI** to {{redirectUrl}} and add the following **Microsoft Graph (Delegated) permissions** under **API permissions**:\n - Files.ReadWrite\n - offline_access\n",
"Upload file": "Subir archivo",
"Download file": "Descargar archivo",
"List Files": "Listar archivos",
diff --git a/packages/pieces/community/microsoft-onedrive/src/i18n/fr.json b/packages/pieces/community/microsoft-onedrive/src/i18n/fr.json
index 9491b366c09..6c2ba801556 100644
--- a/packages/pieces/community/microsoft-onedrive/src/i18n/fr.json
+++ b/packages/pieces/community/microsoft-onedrive/src/i18n/fr.json
@@ -1,6 +1,6 @@
{
"Cloud storage by Microsoft": "Stockage dans le cloud par Microsoft",
- "\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** → **Delegated permissions**.\n - Add the following scopes:\n - Files.ReadWrite\n - offline_access\n - Click **Add permissions**.\n12. Copy your **Client ID** and **Client Secret**.\n",
+ "\nIf you'd like to use your own custom Azure app instead of the default Activepieces app, follow the [Azure app creation guide](https://learn.microsoft.com/en-us/entra/identity-platform/quickstart-register-app#register-an-application),\n set the **Redirect URI** to {{redirectUrl}} and add the following **Microsoft Graph (Delegated) permissions** under **API permissions**:\n - Files.ReadWrite\n - offline_access\n": "\nIf you'd like to use your own custom Azure app instead of the default Activepieces app, follow the [Azure app creation guide](https://learn.microsoft.com/en-us/entra/identity-platform/quickstart-register-app#register-an-application),\n set the **Redirect URI** to {{redirectUrl}} and add the following **Microsoft Graph (Delegated) permissions** under **API permissions**:\n - Files.ReadWrite\n - offline_access\n",
"Upload file": "Charger un fichier",
"Download file": "Télécharger le fichier",
"List Files": "Lister les fichiers",
diff --git a/packages/pieces/community/microsoft-onedrive/src/i18n/ja.json b/packages/pieces/community/microsoft-onedrive/src/i18n/ja.json
index a6b42bb7835..59bb871a731 100644
--- a/packages/pieces/community/microsoft-onedrive/src/i18n/ja.json
+++ b/packages/pieces/community/microsoft-onedrive/src/i18n/ja.json
@@ -1,6 +1,6 @@
{
"Cloud storage by Microsoft": "マイクロソフトによるクラウドストレージ",
- "\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** → **Delegated permissions**.\n - Add the following scopes:\n - Files.ReadWrite\n - offline_access\n - Click **Add permissions**.\n12. Copy your **Client ID** and **Client Secret**.\n",
+ "\nIf you'd like to use your own custom Azure app instead of the default Activepieces app, follow the [Azure app creation guide](https://learn.microsoft.com/en-us/entra/identity-platform/quickstart-register-app#register-an-application),\n set the **Redirect URI** to {{redirectUrl}} and add the following **Microsoft Graph (Delegated) permissions** under **API permissions**:\n - Files.ReadWrite\n - offline_access\n": "\nIf you'd like to use your own custom Azure app instead of the default Activepieces app, follow the [Azure app creation guide](https://learn.microsoft.com/en-us/entra/identity-platform/quickstart-register-app#register-an-application),\n set the **Redirect URI** to {{redirectUrl}} and add the following **Microsoft Graph (Delegated) permissions** under **API permissions**:\n - Files.ReadWrite\n - offline_access\n",
"Upload file": "ファイルをアップロード",
"Download file": "ファイルをダウンロード",
"List Files": "リストファイル",
diff --git a/packages/pieces/community/microsoft-onedrive/src/i18n/nl.json b/packages/pieces/community/microsoft-onedrive/src/i18n/nl.json
index a4634647d16..6ea680d0c06 100644
--- a/packages/pieces/community/microsoft-onedrive/src/i18n/nl.json
+++ b/packages/pieces/community/microsoft-onedrive/src/i18n/nl.json
@@ -1,6 +1,6 @@
{
"Cloud storage by Microsoft": "Cloud opslag door Microsoft",
- "\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. Log in bij [Microsoft Azure Portal](https://portal.azure.com/).\n. Ga naar **Microsoft Enfra ID**.\n3. Onder **Beheren**, klik op **App registraties**.\n4. Klik op de **Nieuwe registratie** knop.\n5. Voer een **Naam** in voor uw app.\n6. Voor **Ondersteunde accounttypen**, kies keuze:\n - **Accounts in elke map van de organisatie (Any Microsoft Entra ID-tenant - Multitenant) en persoonlijke Microsoft accounts**\n - Of selecteer gebaseerd op uw vereiste.\n7. In **Redirect URI** selecteer **Web** en voeg de opgegeven URL toe.\n8. Klik op **Register**.\n9. Na registratie wordt u doorverwezen naar de overzichtspagina. Kopieer de **Applicatie (client) ID**.\n10. Vanuit het linkermenu ga naar **Certificaten & geheimen**.\n - Klik onder **Client geheimen** op **Nieuwe client geheim**.\n - Geef een beschrijving, verloop, en klik **Toevoegen**.\n - Kopieer de **Waarde** van de client secret (dit zal niet meer worden getoond).\n11. Ga naar **API-rechten** vanuit het linkermenu.\n - Klik **Een machtiging toevoegen**.\n - Selecteer **Microsoft Graph** → **gedelegeerde rechten**.\n - Voeg de volgende toepassingsgebieden toe:\n - Bestanden. eadWrite\n - offline_access \n - Klik **Permissies toevoegen**.\n12. Kopieer uw **Client ID** en **Client Secret**.\n",
+ "\nIf you'd like to use your own custom Azure app instead of the default Activepieces app, follow the [Azure app creation guide](https://learn.microsoft.com/en-us/entra/identity-platform/quickstart-register-app#register-an-application),\n set the **Redirect URI** to {{redirectUrl}} and add the following **Microsoft Graph (Delegated) permissions** under **API permissions**:\n - Files.ReadWrite\n - offline_access\n": "\nAls u uw eigen aangepaste Azure app wilt gebruiken in plaats van de standaard Activepieces app, Volg de [Azure app creatie handleiding] (https://learn.microsoft.com/en-us/entra/identity-platform/quickstart-register-app#register-an-application),\n zet de **Redirect URI** naar {{redirectUrl}} en voeg de volgende **Microsoft Graph (Delegated) permissies** toe onder **API permissies**:\n - Bestanden. eadWrite\n - offline_access\n",
"Upload file": "Bestand uploaden",
"Download file": "Bestand downloaden",
"List Files": "Lijst van bestanden",
diff --git a/packages/pieces/community/microsoft-onedrive/src/i18n/pt.json b/packages/pieces/community/microsoft-onedrive/src/i18n/pt.json
index e3bbd695605..207ba87996e 100644
--- a/packages/pieces/community/microsoft-onedrive/src/i18n/pt.json
+++ b/packages/pieces/community/microsoft-onedrive/src/i18n/pt.json
@@ -1,6 +1,6 @@
{
"Cloud storage by Microsoft": "Armazenamento em nuvem da Microsoft",
- "\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. Entre no [Microsoft Azure Portal](https://portal.azure.com/).\n. Na barra lateral esquerda, vá até **Microsoft Enfra ID**.\n3. Sob **Gerenciar**, clique em **Aplicativos registrados**.\n4. Clique no botão **Novo registro**.\n5. Digite um **Nome** para o seu aplicativo.\n6. Para **Tipos de conta suportados**, escolha:\n - **Contas em qualquer diretório organizacional (qualquer inquilino de ID da Microsoft Entra - Multitenant) e contas pessoais da Microsoft**\n - Ou selecione com base nos seus requisitos.\n7. Em **URI de redirecionamento**, selecione **Web** e adicione a URL fornecida.\n8. Clique em **Registrar**.\n9. Após o registro, você será redirecionado para a página de visão geral do aplicativo. Copie o **aplicativo (cliente) ID**.\n10. Do menu à esquerda, vá para **Certificados e segredos**.\n - Em **Segredos do Cliente**, clique em **Novo segredo do Cliente**.\n - Fornece uma descrição, define um vencimento e clique em **Adicionar**.\n - Copiar o **Valor** do segredo do cliente (não será mostrado novamente).\n11. Vá para **Permissões da API** no menu à esquerda.\n - Clique em **Adicionar permissão**.\n - Selecione **Microsoft Graph** → **Delegated permissions**.\n - Adicione os seguintes escopos:\n - Arquivos. eadWrite\n - offline_access \n - Clique em **Adicionar permissões**.\n12. Copie seu **ID do Cliente** e **Segredo do Cliente**.\n",
+ "\nIf you'd like to use your own custom Azure app instead of the default Activepieces app, follow the [Azure app creation guide](https://learn.microsoft.com/en-us/entra/identity-platform/quickstart-register-app#register-an-application),\n set the **Redirect URI** to {{redirectUrl}} and add the following **Microsoft Graph (Delegated) permissions** under **API permissions**:\n - Files.ReadWrite\n - offline_access\n": "\nIf you'd like to use your own custom Azure app instead of the default Activepieces app, follow the [Azure app creation guide](https://learn.microsoft.com/en-us/entra/identity-platform/quickstart-register-app#register-an-application),\n set the **Redirect URI** to {{redirectUrl}} and add the following **Microsoft Graph (Delegated) permissions** under **API permissions**:\n - Files.ReadWrite\n - offline_access\n",
"Upload file": "Upload de arquivo",
"Download file": "Baixar arquivo",
"List Files": "Listar Arquivos",
diff --git a/packages/pieces/community/microsoft-onedrive/src/i18n/zh.json b/packages/pieces/community/microsoft-onedrive/src/i18n/zh.json
index f6cba3034ea..a056877a8d1 100644
--- a/packages/pieces/community/microsoft-onedrive/src/i18n/zh.json
+++ b/packages/pieces/community/microsoft-onedrive/src/i18n/zh.json
@@ -1,6 +1,6 @@
{
"Cloud storage by Microsoft": "Cloud storage by Microsoft",
- "\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** → **Delegated permissions**.\n - Add the following scopes:\n - Files.ReadWrite\n - offline_access\n - Click **Add permissions**.\n12. Copy your **Client ID** and **Client Secret**.\n",
+ "\nIf you'd like to use your own custom Azure app instead of the default Activepieces app, follow the [Azure app creation guide](https://learn.microsoft.com/en-us/entra/identity-platform/quickstart-register-app#register-an-application),\n set the **Redirect URI** to {{redirectUrl}} and add the following **Microsoft Graph (Delegated) permissions** under **API permissions**:\n - Files.ReadWrite\n - offline_access\n": "\nIf you'd like to use your own custom Azure app instead of the default Activepieces app, follow the [Azure app creation guide](https://learn.microsoft.com/en-us/entra/identity-platform/quickstart-register-app#register-an-application),\n set the **Redirect URI** to {{redirectUrl}} and add the following **Microsoft Graph (Delegated) permissions** under **API permissions**:\n - Files.ReadWrite\n - offline_access\n",
"Upload file": "Upload file",
"Download file": "Download file",
"List Files": "List Files",
diff --git a/packages/pieces/community/microsoft-onenote/package.json b/packages/pieces/community/microsoft-onenote/package.json
index de0306e81cf..1db607283bb 100644
--- a/packages/pieces/community/microsoft-onenote/package.json
+++ b/packages/pieces/community/microsoft-onenote/package.json
@@ -1,6 +1,6 @@
{
"name": "@activepieces/piece-microsoft-onenote",
- "version": "0.1.8",
+ "version": "0.1.9",
"type": "commonjs",
"main": "./dist/src/index.js",
"types": "./dist/src/index.d.ts",
diff --git a/packages/pieces/community/microsoft-onenote/src/i18n/de.json b/packages/pieces/community/microsoft-onenote/src/i18n/de.json
index 7aef4a4d5f9..81663fc0cdb 100644
--- a/packages/pieces/community/microsoft-onenote/src/i18n/de.json
+++ b/packages/pieces/community/microsoft-onenote/src/i18n/de.json
@@ -1,6 +1,6 @@
{
"Microsoft OneNote is a note-taking app that allows you to create, edit, and share notes with others.": "Microsoft OneNote ist eine Notizenanwendung, mit der Sie Notizen erstellen, bearbeiten und mit anderen teilen können.",
- "\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 **Umleitungs-URI** wählen Sie **Web** und fügen Sie die angegebene URL hinzu.\n8. Klicken Sie auf **Registrieren**.\n9. Nach der Registrierung werden Sie zur Übersichtsseite der App weitergeleitet. Kopieren Sie die **Anwendungs-(Client)-ID**.\n10. Gehen Sie aus dem linken Menü zu **Zertifikate & Geheimnis**.\n - Unter **Kundengeheimnis**, klicken Sie **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 auf **Berechtigung hinzufügen**.\n - Wähle **Microsoft Graph** → **Delegierte Berechtigungen**.\n - Fügen Sie folgende Bereiche hinzu:\n - Notizen. eadWrite\n - offline_access \n - User.Lesen Sie\n - Klicken Sie auf **Berechtigungen hinzufügen**.\n12. Kopieren Sie Ihre **Client-ID** und **Client-Geheimnis**.\n",
+ "\nIf you’d like to use your own custom Azure app instead of the default Activepieces app, follow the [Azure app creation guide](https://learn.microsoft.com/en-us/entra/identity-platform/quickstart-register-app#register-an-application),\n set the **Redirect URI** to {{redirectUrl}} and add the following **Microsoft Graph (Delegated) permissions** under **API permissions**:\n - User.Read\n - Notes.ReadWrite\n - offline_access": "\nWenn du deine eigene eigene Azure App anstelle der Standard Activepieces App verwenden möchtest, folge der [Azure App Erstellungsanleitung](https://learn.microsoft.com/en-us/entra/identity-platform/quickstart-register-app#register-an-application),\n setzte die **Umleitungs-URI** auf {{redirectUrl}} und füge folgende **Microsoft Graph (Delegiert) Berechtigungen** unter **API Berechtigungen**:\n - Benutzer hinzu. ead\n - Notizen.ReadSchreiben\n - offline_access",
"Create Notebook": "Notizbuch erstellen",
"Create Section": "Abschnitt erstellen",
"Create Note in Section": "Notiz in Abschnitt erstellen",
diff --git a/packages/pieces/community/microsoft-onenote/src/i18n/es.json b/packages/pieces/community/microsoft-onenote/src/i18n/es.json
index fa709949380..7ef73e1c4f4 100644
--- a/packages/pieces/community/microsoft-onenote/src/i18n/es.json
+++ b/packages/pieces/community/microsoft-onenote/src/i18n/es.json
@@ -1,6 +1,6 @@
{
"Microsoft OneNote is a note-taking app that allows you to create, edit, and share notes with others.": "Microsoft OneNote es una aplicación para tomar notas que le permite crear, editar y compartir notas con otros.",
- "\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** → **Delegated permissions**.\n - Add the following scopes:\n - Notes.ReadWrite\n - offline_access\n\t - User.Read\n - Click **Add permissions**.\n12. Copy your **Client ID** and **Client Secret**.\n",
+ "\nIf you’d like to use your own custom Azure app instead of the default Activepieces app, follow the [Azure app creation guide](https://learn.microsoft.com/en-us/entra/identity-platform/quickstart-register-app#register-an-application),\n set the **Redirect URI** to {{redirectUrl}} and add the following **Microsoft Graph (Delegated) permissions** under **API permissions**:\n - User.Read\n - Notes.ReadWrite\n - offline_access": "\nIf you’d like to use your own custom Azure app instead of the default Activepieces app, follow the [Azure app creation guide](https://learn.microsoft.com/en-us/entra/identity-platform/quickstart-register-app#register-an-application),\n set the **Redirect URI** to {{redirectUrl}} and add the following **Microsoft Graph (Delegated) permissions** under **API permissions**:\n - User.Read\n - Notes.ReadWrite\n - offline_access",
"Create Notebook": "Crear Cuadro de notas",
"Create Section": "Crear sección",
"Create Note in Section": "Crear nota en la sección",
diff --git a/packages/pieces/community/microsoft-onenote/src/i18n/fr.json b/packages/pieces/community/microsoft-onenote/src/i18n/fr.json
index 83b04a0b824..55a5f492435 100644
--- a/packages/pieces/community/microsoft-onenote/src/i18n/fr.json
+++ b/packages/pieces/community/microsoft-onenote/src/i18n/fr.json
@@ -1,6 +1,6 @@
{
"Microsoft OneNote is a note-taking app that allows you to create, edit, and share notes with others.": "Microsoft OneNote est une application de prise de notes qui vous permet de créer, modifier et partager des notes avec d'autres.",
- "\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** → **Delegated permissions**.\n - Add the following scopes:\n - Notes.ReadWrite\n - offline_access\n\t - User.Read\n - Click **Add permissions**.\n12. Copy your **Client ID** and **Client Secret**.\n",
+ "\nIf you’d like to use your own custom Azure app instead of the default Activepieces app, follow the [Azure app creation guide](https://learn.microsoft.com/en-us/entra/identity-platform/quickstart-register-app#register-an-application),\n set the **Redirect URI** to {{redirectUrl}} and add the following **Microsoft Graph (Delegated) permissions** under **API permissions**:\n - User.Read\n - Notes.ReadWrite\n - offline_access": "\nIf you’d like to use your own custom Azure app instead of the default Activepieces app, follow the [Azure app creation guide](https://learn.microsoft.com/en-us/entra/identity-platform/quickstart-register-app#register-an-application),\n set the **Redirect URI** to {{redirectUrl}} and add the following **Microsoft Graph (Delegated) permissions** under **API permissions**:\n - User.Read\n - Notes.ReadWrite\n - offline_access",
"Create Notebook": "Créer un carnet",
"Create Section": "Créer une section",
"Create Note in Section": "Créer une note dans la section",
diff --git a/packages/pieces/community/microsoft-onenote/src/i18n/ja.json b/packages/pieces/community/microsoft-onenote/src/i18n/ja.json
index 26f85363479..c03e3dae394 100644
--- a/packages/pieces/community/microsoft-onenote/src/i18n/ja.json
+++ b/packages/pieces/community/microsoft-onenote/src/i18n/ja.json
@@ -1,6 +1,6 @@
{
"Microsoft OneNote is a note-taking app that allows you to create, edit, and share notes with others.": "Microsoft OneNote は、ノートを作成、編集、および他の人と共有することができるノートテイクアプリです。",
- "\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** → **Delegated permissions**.\n - Add the following scopes:\n - Notes.ReadWrite\n - offline_access\n\t - User.Read\n - Click **Add permissions**.\n12. Copy your **Client ID** and **Client Secret**.\n",
+ "\nIf you’d like to use your own custom Azure app instead of the default Activepieces app, follow the [Azure app creation guide](https://learn.microsoft.com/en-us/entra/identity-platform/quickstart-register-app#register-an-application),\n set the **Redirect URI** to {{redirectUrl}} and add the following **Microsoft Graph (Delegated) permissions** under **API permissions**:\n - User.Read\n - Notes.ReadWrite\n - offline_access": "\nIf you’d like to use your own custom Azure app instead of the default Activepieces app, follow the [Azure app creation guide](https://learn.microsoft.com/en-us/entra/identity-platform/quickstart-register-app#register-an-application),\n set the **Redirect URI** to {{redirectUrl}} and add the following **Microsoft Graph (Delegated) permissions** under **API permissions**:\n - User.Read\n - Notes.ReadWrite\n - offline_access",
"Create Notebook": "メモ帳を作成",
"Create Section": "セクションを作成",
"Create Note in Section": "セクションにノートを作成",
diff --git a/packages/pieces/community/microsoft-onenote/src/i18n/nl.json b/packages/pieces/community/microsoft-onenote/src/i18n/nl.json
index c9ae6e9b7bb..418ede9f051 100644
--- a/packages/pieces/community/microsoft-onenote/src/i18n/nl.json
+++ b/packages/pieces/community/microsoft-onenote/src/i18n/nl.json
@@ -1,6 +1,6 @@
{
"Microsoft OneNote is a note-taking app that allows you to create, edit, and share notes with others.": "Microsoft OneNote is een note-take app waarmee je notities kunt maken, bewerken en delen met anderen.",
- "\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. Log in bij [Microsoft Azure Portal](https://portal.azure.com/).\n. Ga naar **Microsoft Enfra ID**.\n3. Onder **Beheren**, klik op **App registraties**.\n4. Klik op de **Nieuwe registratie** knop.\n5. Voer een **Naam** in voor uw app.\n6. Voor **Ondersteunde accounttypen**, kies keuze:\n - **Accounts in elke map van de organisatie (Any Microsoft Entra ID-tenant - Multitenant) en persoonlijke Microsoft accounts**\n - Of selecteer gebaseerd op uw vereiste.\n7. In **Redirect URI**, selecteer **Web** en voeg de opgegeven URL toe.\n8. Klik **Register**.\n9. Na registratie wordt u doorverwezen naar de overzichtspagina. Kopieer de **Applicatie (client) ID**.\n10. Vanuit het linkermenu ga naar **Certificaten & geheimen**.\n - Onder **Client secrets**, klik op **Nieuwe client geheim**.\n - Geef een beschrijving, verloop, en klik **Toevoegen**.\n - Kopieer de **waarde** van de client secret (dit zal niet meer worden weergegeven).\n11. Ga naar **API permissies** in het linkermenu.\n - Klik **Een machtiging toevoegen**.\n - Selecteer **Microsoft Graph** → **Toegewezen machtigingen**.\n - Voeg de volgende toepassingsgebieden toe:\n - Notities. eadWrite\n - offline_access \n - User.Read\n - Klik **Permissies toevoegen**.\n12. Kopieer de **Client ID** en **Client Secret**.\n",
+ "\nIf you’d like to use your own custom Azure app instead of the default Activepieces app, follow the [Azure app creation guide](https://learn.microsoft.com/en-us/entra/identity-platform/quickstart-register-app#register-an-application),\n set the **Redirect URI** to {{redirectUrl}} and add the following **Microsoft Graph (Delegated) permissions** under **API permissions**:\n - User.Read\n - Notes.ReadWrite\n - offline_access": "\nAls u uw eigen aangepaste Azure app wilt gebruiken in plaats van de standaard Activepieces app, Volg de [Azure app creatie handleiding] (https://learn.microsoft.com/en-us/entra/identity-platform/quickstart-register-app#register-an-application),\n zet de **Redirect URI** naar {{redirectUrl}} en voeg de volgende **Microsoft Graph (Delegated) permissies** toe onder **API permissies**:\n - gebruiker. ead\n - Notes.ReadWrite\n - offline_access",
"Create Notebook": "Notitieboek maken",
"Create Section": "Sectie aanmaken",
"Create Note in Section": "Notitie aanmaken in sectie",
diff --git a/packages/pieces/community/microsoft-onenote/src/i18n/pt.json b/packages/pieces/community/microsoft-onenote/src/i18n/pt.json
index 28fecf4cdcf..37ec8e7b482 100644
--- a/packages/pieces/community/microsoft-onenote/src/i18n/pt.json
+++ b/packages/pieces/community/microsoft-onenote/src/i18n/pt.json
@@ -1,6 +1,6 @@
{
"Microsoft OneNote is a note-taking app that allows you to create, edit, and share notes with others.": "Microsoft OneNote é um app anotações que permite criar, editar e compartilhar anotações com outros.",
- "\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. Entre no [Microsoft Azure Portal](https://portal.azure.com/).\n. Na barra lateral esquerda, vá até **Microsoft Enfra ID**.\n3. Sob **Gerenciar**, clique em **Aplicativos registrados**.\n4. Clique no botão **Novo registro**.\n5. Digite um **Nome** para o seu aplicativo.\n6. Para **Tipos de conta suportados**, escolha:\n - **Contas em qualquer diretório organizacional (qualquer inquilino de ID da Microsoft Entra - Multitenant) e contas pessoais da Microsoft**\n - Ou selecione com base nos seus requisitos.\n7. Em **URI de redirecionamento**, selecione **Web** e adicione a URL fornecida.\n8. Clique em **Registrar**.\n9. Após o registro, você será redirecionado para a página de visão geral do aplicativo. Copie o **ID do aplicativo (cliente) **.\n10. No menu da esquerda, vá para **Certificados e segredos**.\n - Em **Segredos do cliente**, clique em **Novo segredo do cliente**.\n - Fornece uma descrição, define um vencimento e clique em **Adicionar**.\n - Copiar o **Valor** do segredo do cliente (isso não será exibido novamente).\n11. Vá para **permissões de API** no menu à esquerda.\n - Clique em **Adicionar uma permissão**.\n - Selecione **Microsoft Graph** → **Delegated permissions**.\n - Adicione os seguintes escopos:\n - Notas. eadWrite\n - offline_access \n - Usuário. Leia\n - Clique em **Adicionar permissões**.\n12. Copie seu **ID do Cliente** e **Segredo do Cliente**.\n",
+ "\nIf you’d like to use your own custom Azure app instead of the default Activepieces app, follow the [Azure app creation guide](https://learn.microsoft.com/en-us/entra/identity-platform/quickstart-register-app#register-an-application),\n set the **Redirect URI** to {{redirectUrl}} and add the following **Microsoft Graph (Delegated) permissions** under **API permissions**:\n - User.Read\n - Notes.ReadWrite\n - offline_access": "\nIf you’d like to use your own custom Azure app instead of the default Activepieces app, follow the [Azure app creation guide](https://learn.microsoft.com/en-us/entra/identity-platform/quickstart-register-app#register-an-application),\n set the **Redirect URI** to {{redirectUrl}} and add the following **Microsoft Graph (Delegated) permissions** under **API permissions**:\n - User.Read\n - Notes.ReadWrite\n - offline_access",
"Create Notebook": "Criar caderno",
"Create Section": "Criar seção",
"Create Note in Section": "Criar Nota na Seção",
diff --git a/packages/pieces/community/microsoft-onenote/src/i18n/zh.json b/packages/pieces/community/microsoft-onenote/src/i18n/zh.json
index 21ded1e459c..171a8731b97 100644
--- a/packages/pieces/community/microsoft-onenote/src/i18n/zh.json
+++ b/packages/pieces/community/microsoft-onenote/src/i18n/zh.json
@@ -1,6 +1,6 @@
{
"Microsoft OneNote is a note-taking app that allows you to create, edit, and share notes with others.": "Microsoft OneNote is a note-taking app that allows you to create, edit, and share notes with others.",
- "\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** → **Delegated permissions**.\n - Add the following scopes:\n - Notes.ReadWrite\n - offline_access\n\t - User.Read\n - Click **Add permissions**.\n12. Copy your **Client ID** and **Client Secret**.\n",
+ "\nIf you’d like to use your own custom Azure app instead of the default Activepieces app, follow the [Azure app creation guide](https://learn.microsoft.com/en-us/entra/identity-platform/quickstart-register-app#register-an-application),\n set the **Redirect URI** to {{redirectUrl}} and add the following **Microsoft Graph (Delegated) permissions** under **API permissions**:\n - User.Read\n - Notes.ReadWrite\n - offline_access": "\nIf you’d like to use your own custom Azure app instead of the default Activepieces app, follow the [Azure app creation guide](https://learn.microsoft.com/en-us/entra/identity-platform/quickstart-register-app#register-an-application),\n set the **Redirect URI** to {{redirectUrl}} and add the following **Microsoft Graph (Delegated) permissions** under **API permissions**:\n - User.Read\n - Notes.ReadWrite\n - offline_access",
"Create Notebook": "Create Notebook",
"Create Section": "Create Section",
"Create Note in Section": "Create Note in Section",
diff --git a/packages/pieces/community/microsoft-outlook-calendar/package.json b/packages/pieces/community/microsoft-outlook-calendar/package.json
index 09272ef6754..7348f85e020 100644
--- a/packages/pieces/community/microsoft-outlook-calendar/package.json
+++ b/packages/pieces/community/microsoft-outlook-calendar/package.json
@@ -1,6 +1,6 @@
{
"name": "@activepieces/piece-microsoft-outlook-calendar",
- "version": "0.1.5",
+ "version": "0.1.6",
"main": "./dist/src/index.js",
"types": "./dist/src/index.d.ts",
"scripts": {
diff --git a/packages/pieces/community/microsoft-outlook-calendar/src/i18n/de.json b/packages/pieces/community/microsoft-outlook-calendar/src/i18n/de.json
index e5a5d059632..2d396017a4d 100644
--- a/packages/pieces/community/microsoft-outlook-calendar/src/i18n/de.json
+++ b/packages/pieces/community/microsoft-outlook-calendar/src/i18n/de.json
@@ -1,6 +1,6 @@
{
"Calendar software by Microsoft": "Kalendersoftware von Microsoft",
- "\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 **Umleitungs-URI** wählen Sie **Web** und fügen Sie die angegebene URL hinzu.\n8. Klicken Sie auf **Registrieren**.\n9. Nach der Registrierung werden Sie zur Übersichtsseite der App weitergeleitet. Kopieren Sie die **Anwendungs-(Client)-ID**.\n10. Gehen Sie aus dem linken Menü zu **Zertifikate & Geheimnis**.\n - Unter **Kundengeheimnis**, klicken Sie **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 auf **Berechtigung hinzufügen**.\n - Wähle **Microsoft Graph** → **Delegierte Berechtigungen**.\n - Fügen Sie folgende Bereiche hinzu:\n\t - Kalender. eadWrite\n\t - offline_access \n - User.Lesen Sie\n - Klicken Sie auf **Berechtigungen hinzufügen**.\n12. Kopieren Sie Ihre **Client-ID** und **Client-Geheimnis**.\n",
+ "\nIf you’d like to use your own custom Azure app instead of the default Activepieces app, follow the [Azure app creation guide](https://learn.microsoft.com/en-us/entra/identity-platform/quickstart-register-app#register-an-application),\n set the **Redirect URI** to {{redirectUrl}} and add the following **Microsoft Graph (Delegated) permissions** under **API permissions**:\n - User.Read\n - Calendars.ReadWrite\n - offline_access": "\nWenn du deine eigene eigene Azure App anstelle der Standard Activepieces App verwenden möchtest, folge der [Azure App Erstellungsanleitung](https://learn.microsoft.com/en-us/entra/identity-platform/quickstart-register-app#register-an-application),\n setzte die **Umleitungs-URI** auf {{redirectUrl}} und füge folgende **Microsoft Graph (Delegiert) Berechtigungen** unter **API Berechtigungen**:\n - Benutzer hinzu. ead\n - Calendars.ReadSchreiben\n - offline_access",
"Create a new event in a calendar": "Neues Ereignis in einem Kalender erstellen",
"Delete an event in a calendar": "Ereignis in einem Kalender löschen",
"List events in a calendar": "Ereignisse in einem Kalender auflisten",
diff --git a/packages/pieces/community/microsoft-outlook-calendar/src/i18n/es.json b/packages/pieces/community/microsoft-outlook-calendar/src/i18n/es.json
index e4a9381eb2d..39b3a1715c7 100644
--- a/packages/pieces/community/microsoft-outlook-calendar/src/i18n/es.json
+++ b/packages/pieces/community/microsoft-outlook-calendar/src/i18n/es.json
@@ -1,6 +1,6 @@
{
"Calendar software by Microsoft": "Software de calendario de Microsoft",
- "\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** → **Delegated permissions**.\n - Add the following scopes:\n\t - Calendars.ReadWrite\n\t - offline_access\n\t - User.Read\n - Click **Add permissions**.\n12. Copy your **Client ID** and **Client Secret**.\n",
+ "\nIf you’d like to use your own custom Azure app instead of the default Activepieces app, follow the [Azure app creation guide](https://learn.microsoft.com/en-us/entra/identity-platform/quickstart-register-app#register-an-application),\n set the **Redirect URI** to {{redirectUrl}} and add the following **Microsoft Graph (Delegated) permissions** under **API permissions**:\n - User.Read\n - Calendars.ReadWrite\n - offline_access": "\nIf you’d like to use your own custom Azure app instead of the default Activepieces app, follow the [Azure app creation guide](https://learn.microsoft.com/en-us/entra/identity-platform/quickstart-register-app#register-an-application),\n set the **Redirect URI** to {{redirectUrl}} and add the following **Microsoft Graph (Delegated) permissions** under **API permissions**:\n - User.Read\n - Calendars.ReadWrite\n - offline_access",
"Create a new event in a calendar": "Crear un nuevo evento en un calendario",
"Delete an event in a calendar": "Eliminar un evento en un calendario",
"List events in a calendar": "Listar eventos en un calendario",
diff --git a/packages/pieces/community/microsoft-outlook-calendar/src/i18n/fr.json b/packages/pieces/community/microsoft-outlook-calendar/src/i18n/fr.json
index d7257330c53..9c93535697e 100644
--- a/packages/pieces/community/microsoft-outlook-calendar/src/i18n/fr.json
+++ b/packages/pieces/community/microsoft-outlook-calendar/src/i18n/fr.json
@@ -1,6 +1,6 @@
{
"Calendar software by Microsoft": "Logiciel de calendrier par Microsoft",
- "\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** → **Delegated permissions**.\n - Add the following scopes:\n\t - Calendars.ReadWrite\n\t - offline_access\n\t - User.Read\n - Click **Add permissions**.\n12. Copy your **Client ID** and **Client Secret**.\n",
+ "\nIf you’d like to use your own custom Azure app instead of the default Activepieces app, follow the [Azure app creation guide](https://learn.microsoft.com/en-us/entra/identity-platform/quickstart-register-app#register-an-application),\n set the **Redirect URI** to {{redirectUrl}} and add the following **Microsoft Graph (Delegated) permissions** under **API permissions**:\n - User.Read\n - Calendars.ReadWrite\n - offline_access": "\nIf you’d like to use your own custom Azure app instead of the default Activepieces app, follow the [Azure app creation guide](https://learn.microsoft.com/en-us/entra/identity-platform/quickstart-register-app#register-an-application),\n set the **Redirect URI** to {{redirectUrl}} and add the following **Microsoft Graph (Delegated) permissions** under **API permissions**:\n - User.Read\n - Calendars.ReadWrite\n - offline_access",
"Create a new event in a calendar": "Créer un nouvel événement dans un calendrier",
"Delete an event in a calendar": "Supprimer un événement dans un calendrier",
"List events in a calendar": "Lister les événements dans un calendrier",
diff --git a/packages/pieces/community/microsoft-outlook-calendar/src/i18n/ja.json b/packages/pieces/community/microsoft-outlook-calendar/src/i18n/ja.json
index b4070d007ba..9dffbce349e 100644
--- a/packages/pieces/community/microsoft-outlook-calendar/src/i18n/ja.json
+++ b/packages/pieces/community/microsoft-outlook-calendar/src/i18n/ja.json
@@ -1,6 +1,6 @@
{
"Calendar software by Microsoft": "Microsoftによるカレンダーソフトウェア",
- "\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** → **Delegated permissions**.\n - Add the following scopes:\n\t - Calendars.ReadWrite\n\t - offline_access\n\t - User.Read\n - Click **Add permissions**.\n12. Copy your **Client ID** and **Client Secret**.\n",
+ "\nIf you’d like to use your own custom Azure app instead of the default Activepieces app, follow the [Azure app creation guide](https://learn.microsoft.com/en-us/entra/identity-platform/quickstart-register-app#register-an-application),\n set the **Redirect URI** to {{redirectUrl}} and add the following **Microsoft Graph (Delegated) permissions** under **API permissions**:\n - User.Read\n - Calendars.ReadWrite\n - offline_access": "\nIf you’d like to use your own custom Azure app instead of the default Activepieces app, follow the [Azure app creation guide](https://learn.microsoft.com/en-us/entra/identity-platform/quickstart-register-app#register-an-application),\n set the **Redirect URI** to {{redirectUrl}} and add the following **Microsoft Graph (Delegated) permissions** under **API permissions**:\n - User.Read\n - Calendars.ReadWrite\n - offline_access",
"Create a new event in a calendar": "カレンダーに新しい予定を作成する",
"Delete an event in a calendar": "カレンダーの予定を削除する",
"List events in a calendar": "カレンダー内のイベント一覧",
diff --git a/packages/pieces/community/microsoft-outlook-calendar/src/i18n/nl.json b/packages/pieces/community/microsoft-outlook-calendar/src/i18n/nl.json
index 21d1759575f..f3370ab5687 100644
--- a/packages/pieces/community/microsoft-outlook-calendar/src/i18n/nl.json
+++ b/packages/pieces/community/microsoft-outlook-calendar/src/i18n/nl.json
@@ -1,6 +1,6 @@
{
"Calendar software by Microsoft": "Agenda software van Microsoft",
- "\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. Log in bij [Microsoft Azure Portal](https://portal.azure.com/).\n. Ga naar **Microsoft Enfra ID**.\n3. Onder **Beheren**, klik op **App registraties**.\n4. Klik op de **Nieuwe registratie** knop.\n5. Voer een **Naam** in voor uw app.\n6. Voor **Ondersteunde accounttypen**, kies keuze:\n - **Accounts in elke map van de organisatie (Any Microsoft Entra ID-tenant - Multitenant) en persoonlijke Microsoft accounts**\n - Of selecteer gebaseerd op uw vereiste.\n7. In **Redirect URI**, selecteer **Web** en voeg de opgegeven URL toe.\n8. Klik **Register**.\n9. Na registratie wordt u doorverwezen naar de overzichtspagina. Kopieer de **Applicatie (client) ID**.\n10. Vanuit het linkermenu ga naar **Certificaten & geheimen**.\n - Onder **Client secrets**, klik op **Nieuwe client geheim**.\n - Geef een beschrijving, verloop, en klik **Toevoegen**.\n - Kopieer de **waarde** van de client secret (dit zal niet meer worden weergegeven).\n11. Ga naar **API permissies** in het linkermenu.\n - Klik **Een machtiging toevoegen**.\n - Selecteer **Microsoft Graph** → **Toegewezen machtigingen**.\n - Voeg de volgende toepassingsgebieden toe:\n\t - kalenders. eadWrite\n\t - offline_access \n - User.Read\n - Klik **Permissies toevoegen**.\n12. Kopieer de **Client ID** en **Client Secret**.\n",
+ "\nIf you’d like to use your own custom Azure app instead of the default Activepieces app, follow the [Azure app creation guide](https://learn.microsoft.com/en-us/entra/identity-platform/quickstart-register-app#register-an-application),\n set the **Redirect URI** to {{redirectUrl}} and add the following **Microsoft Graph (Delegated) permissions** under **API permissions**:\n - User.Read\n - Calendars.ReadWrite\n - offline_access": "\nAls u uw eigen aangepaste Azure app wilt gebruiken in plaats van de standaard Activepieces app, Volg de [Azure app creatie handleiding] (https://learn.microsoft.com/en-us/entra/identity-platform/quickstart-register-app#register-an-application),\n zet de **Redirect URI** naar {{redirectUrl}} en voeg de volgende **Microsoft Graph (Delegated) permissies** toe onder **API permissies**:\n - gebruiker. ead\n - Kalendars.ReadWrite\n - offline_access",
"Create a new event in a calendar": "Maak een nieuwe afspraak aan in een kalender",
"Delete an event in a calendar": "Een afspraak in een kalender verwijderen",
"List events in a calendar": "Afspraken in een kalender weergeven",
diff --git a/packages/pieces/community/microsoft-outlook-calendar/src/i18n/pt.json b/packages/pieces/community/microsoft-outlook-calendar/src/i18n/pt.json
index 9a05822573e..d4f747929d9 100644
--- a/packages/pieces/community/microsoft-outlook-calendar/src/i18n/pt.json
+++ b/packages/pieces/community/microsoft-outlook-calendar/src/i18n/pt.json
@@ -1,6 +1,6 @@
{
"Calendar software by Microsoft": "Software de calendário de Microsoft",
- "\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. Entre no [Microsoft Azure Portal](https://portal.azure.com/).\n. Na barra lateral esquerda, vá até **Microsoft Enfra ID**.\n3. Sob **Gerenciar**, clique em **Aplicativos registrados**.\n4. Clique no botão **Novo registro**.\n5. Digite um **Nome** para o seu aplicativo.\n6. Para **Tipos de conta suportados**, escolha:\n - **Contas em qualquer diretório organizacional (qualquer inquilino de ID da Microsoft Entra - Multitenant) e contas pessoais da Microsoft**\n - Ou selecione com base nos seus requisitos.\n7. Em **URI de redirecionamento**, selecione **Web** e adicione a URL fornecida.\n8. Clique em **Registrar**.\n9. Após o registro, você será redirecionado para a página de visão geral do aplicativo. Copie o **ID do aplicativo (cliente) **.\n10. No menu da esquerda, vá para **Certificados e segredos**.\n - Em **Segredos do cliente**, clique em **Novo segredo do cliente**.\n - Fornece uma descrição, define um vencimento e clique em **Adicionar**.\n - Copiar o **Valor** do segredo do cliente (isso não será exibido novamente).\n11. Vá para **permissões de API** no menu à esquerda.\n - Clique em **Adicionar uma permissão**.\n - Selecione **Microsoft Graph** → **Delegated permissions**.\n - Adicione os seguintes escopos:\n\t - Calendários. eadWrite\n\t - offline_access \n - Usuário. Leia\n - Clique em **Adicionar permissões**.\n12. Copie seu **ID do Cliente** e **Segredo do Cliente**.\n",
+ "\nIf you’d like to use your own custom Azure app instead of the default Activepieces app, follow the [Azure app creation guide](https://learn.microsoft.com/en-us/entra/identity-platform/quickstart-register-app#register-an-application),\n set the **Redirect URI** to {{redirectUrl}} and add the following **Microsoft Graph (Delegated) permissions** under **API permissions**:\n - User.Read\n - Calendars.ReadWrite\n - offline_access": "\nIf you’d like to use your own custom Azure app instead of the default Activepieces app, follow the [Azure app creation guide](https://learn.microsoft.com/en-us/entra/identity-platform/quickstart-register-app#register-an-application),\n set the **Redirect URI** to {{redirectUrl}} and add the following **Microsoft Graph (Delegated) permissions** under **API permissions**:\n - User.Read\n - Calendars.ReadWrite\n - offline_access",
"Create a new event in a calendar": "Criar um novo evento em um calendário",
"Delete an event in a calendar": "Apagar um evento em um calendário",
"List events in a calendar": "Listar eventos em um calendário",
diff --git a/packages/pieces/community/microsoft-outlook-calendar/src/i18n/zh.json b/packages/pieces/community/microsoft-outlook-calendar/src/i18n/zh.json
index dbdabce524e..6a9715b40f1 100644
--- a/packages/pieces/community/microsoft-outlook-calendar/src/i18n/zh.json
+++ b/packages/pieces/community/microsoft-outlook-calendar/src/i18n/zh.json
@@ -1,6 +1,6 @@
{
"Calendar software by Microsoft": "Calendar software by Microsoft",
- "\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** → **Delegated permissions**.\n - Add the following scopes:\n\t - Calendars.ReadWrite\n\t - offline_access\n\t - User.Read\n - Click **Add permissions**.\n12. Copy your **Client ID** and **Client Secret**.\n",
+ "\nIf you’d like to use your own custom Azure app instead of the default Activepieces app, follow the [Azure app creation guide](https://learn.microsoft.com/en-us/entra/identity-platform/quickstart-register-app#register-an-application),\n set the **Redirect URI** to {{redirectUrl}} and add the following **Microsoft Graph (Delegated) permissions** under **API permissions**:\n - User.Read\n - Calendars.ReadWrite\n - offline_access": "\nIf you’d like to use your own custom Azure app instead of the default Activepieces app, follow the [Azure app creation guide](https://learn.microsoft.com/en-us/entra/identity-platform/quickstart-register-app#register-an-application),\n set the **Redirect URI** to {{redirectUrl}} and add the following **Microsoft Graph (Delegated) permissions** under **API permissions**:\n - User.Read\n - Calendars.ReadWrite\n - offline_access",
"Create a new event in a calendar": "Create a new event in a calendar",
"Delete an event in a calendar": "Delete an event in a calendar",
"List events in a calendar": "List events in a calendar",
diff --git a/packages/pieces/community/microsoft-outlook/package.json b/packages/pieces/community/microsoft-outlook/package.json
index c02976f76a8..22331fee360 100644
--- a/packages/pieces/community/microsoft-outlook/package.json
+++ b/packages/pieces/community/microsoft-outlook/package.json
@@ -1,6 +1,6 @@
{
"name": "@activepieces/piece-microsoft-outlook",
- "version": "0.2.12",
+ "version": "0.2.13",
"main": "./dist/src/index.js",
"types": "./dist/src/index.d.ts",
"dependencies": {
diff --git a/packages/pieces/community/microsoft-outlook/src/i18n/de.json b/packages/pieces/community/microsoft-outlook/src/i18n/de.json
index 16138279dab..f4c128f0a3c 100644
--- a/packages/pieces/community/microsoft-outlook/src/i18n/de.json
+++ b/packages/pieces/community/microsoft-outlook/src/i18n/de.json
@@ -1,5 +1,5 @@
{
- "\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 **Umleitungs-URI** wählen Sie **Web** und fügen Sie die angegebene URL hinzu.\n8. Klicken Sie auf **Registrieren**.\n9. Nach der Registrierung werden Sie zur Übersichtsseite der App weitergeleitet. Kopieren Sie die **Anwendungs-(Client)-ID**.\n10. Gehen Sie aus dem linken Menü zu **Zertifikate & Geheimnisse**.\n - Unter **Kundengeheimnis**, klicken Sie auf **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** → **delegierte Berechtigungen**.\n - Fügen Sie folgende Bereiche hinzu:\n - Mail. eadSchreiben\n - Mail.Senden Sie \n - Kalender. ead\n\t - offline_access\n\t - User.Lesen Sie\n - Klicken Sie auf **Berechtigungen hinzufügen**.\n12. Kopieren Sie Ihre **Client-ID** und **Client-Geheimnis**.\n",
+ "\nIf you’d like to use your own custom Azure app instead of the default Activepieces app, follow the [Azure app creation guide](https://learn.microsoft.com/en-us/entra/identity-platform/quickstart-register-app#register-an-application),\n set the **Redirect URI** to {{redirectUrl}} and add the following **Microsoft Graph (Delegated) permissions** under **API permissions**:\n - User.Read\n - Mail.ReadWrite\n - Mail.Send\n - Calendars.Read\n - offline_access\n": "\nWenn du deine eigene eigene Azure App anstelle der Standard Activepieces App verwenden möchtest, folge der [Azure App Erstellungsanleitung](https://learn.microsoft.com/en-us/entra/identity-platform/quickstart-register-app#register-an-application),\n setzte die **Umleitungs-URI** auf {{redirectUrl}} und füge folgende **Microsoft Graph (Delegiert) Berechtigungen** unter **API Berechtigungen**:\n - Benutzer hinzu. ead\n - Mail.ReadSchreiben\n - Mail.Senden Sie\n - Kalender.Lesen Sie\n - offline_access\n",
"Send Email": "E-Mail senden",
"Download Attachment": "Anhang herunterladen",
"Reply to Email": "Auf E-Mail antworten",
diff --git a/packages/pieces/community/microsoft-outlook/src/i18n/es.json b/packages/pieces/community/microsoft-outlook/src/i18n/es.json
index 7d3f496f934..0b3c1149f93 100644
--- a/packages/pieces/community/microsoft-outlook/src/i18n/es.json
+++ b/packages/pieces/community/microsoft-outlook/src/i18n/es.json
@@ -1,5 +1,5 @@
{
- "\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** → **Delegated permissions**.\n - Add the following scopes:\n - Mail.ReadWrite\n - Mail.Send\n\t - Calendars.Read\n\t - offline_access\n\t - User.Read\n - Click **Add permissions**.\n12. Copy your **Client ID** and **Client Secret**.\n",
+ "\nIf you’d like to use your own custom Azure app instead of the default Activepieces app, follow the [Azure app creation guide](https://learn.microsoft.com/en-us/entra/identity-platform/quickstart-register-app#register-an-application),\n set the **Redirect URI** to {{redirectUrl}} and add the following **Microsoft Graph (Delegated) permissions** under **API permissions**:\n - User.Read\n - Mail.ReadWrite\n - Mail.Send\n - Calendars.Read\n - offline_access\n": "\nIf you’d like to use your own custom Azure app instead of the default Activepieces app, follow the [Azure app creation guide](https://learn.microsoft.com/en-us/entra/identity-platform/quickstart-register-app#register-an-application),\n set the **Redirect URI** to {{redirectUrl}} and add the following **Microsoft Graph (Delegated) permissions** under **API permissions**:\n - User.Read\n - Mail.ReadWrite\n - Mail.Send\n - Calendars.Read\n - offline_access\n",
"Send Email": "Enviar Email",
"Download Attachment": "Descargar adjunto",
"Reply to Email": "Responder al email",
diff --git a/packages/pieces/community/microsoft-outlook/src/i18n/fr.json b/packages/pieces/community/microsoft-outlook/src/i18n/fr.json
index 80e569dfd80..c30640ec195 100644
--- a/packages/pieces/community/microsoft-outlook/src/i18n/fr.json
+++ b/packages/pieces/community/microsoft-outlook/src/i18n/fr.json
@@ -1,5 +1,5 @@
{
- "\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** → **Delegated permissions**.\n - Add the following scopes:\n - Mail.ReadWrite\n - Mail.Send\n\t - Calendars.Read\n\t - offline_access\n\t - User.Read\n - Click **Add permissions**.\n12. Copy your **Client ID** and **Client Secret**.\n",
+ "\nIf you’d like to use your own custom Azure app instead of the default Activepieces app, follow the [Azure app creation guide](https://learn.microsoft.com/en-us/entra/identity-platform/quickstart-register-app#register-an-application),\n set the **Redirect URI** to {{redirectUrl}} and add the following **Microsoft Graph (Delegated) permissions** under **API permissions**:\n - User.Read\n - Mail.ReadWrite\n - Mail.Send\n - Calendars.Read\n - offline_access\n": "\nIf you’d like to use your own custom Azure app instead of the default Activepieces app, follow the [Azure app creation guide](https://learn.microsoft.com/en-us/entra/identity-platform/quickstart-register-app#register-an-application),\n set the **Redirect URI** to {{redirectUrl}} and add the following **Microsoft Graph (Delegated) permissions** under **API permissions**:\n - User.Read\n - Mail.ReadWrite\n - Mail.Send\n - Calendars.Read\n - offline_access\n",
"Send Email": "Envoyer un e-mail",
"Download Attachment": "Télécharger la pièce jointe",
"Reply to Email": "Répondre à l'e-mail",
diff --git a/packages/pieces/community/microsoft-outlook/src/i18n/ja.json b/packages/pieces/community/microsoft-outlook/src/i18n/ja.json
index 2e80b8fad1f..e2c11a0f898 100644
--- a/packages/pieces/community/microsoft-outlook/src/i18n/ja.json
+++ b/packages/pieces/community/microsoft-outlook/src/i18n/ja.json
@@ -1,5 +1,5 @@
{
- "\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** → **Delegated permissions**.\n - Add the following scopes:\n - Mail.ReadWrite\n - Mail.Send\n\t - Calendars.Read\n\t - offline_access\n\t - User.Read\n - Click **Add permissions**.\n12. Copy your **Client ID** and **Client Secret**.\n",
+ "\nIf you’d like to use your own custom Azure app instead of the default Activepieces app, follow the [Azure app creation guide](https://learn.microsoft.com/en-us/entra/identity-platform/quickstart-register-app#register-an-application),\n set the **Redirect URI** to {{redirectUrl}} and add the following **Microsoft Graph (Delegated) permissions** under **API permissions**:\n - User.Read\n - Mail.ReadWrite\n - Mail.Send\n - Calendars.Read\n - offline_access\n": "\nIf you’d like to use your own custom Azure app instead of the default Activepieces app, follow the [Azure app creation guide](https://learn.microsoft.com/en-us/entra/identity-platform/quickstart-register-app#register-an-application),\n set the **Redirect URI** to {{redirectUrl}} and add the following **Microsoft Graph (Delegated) permissions** under **API permissions**:\n - User.Read\n - Mail.ReadWrite\n - Mail.Send\n - Calendars.Read\n - offline_access\n",
"Send Email": "メール送信",
"Download Attachment": "添付ファイルをダウンロード",
"Reply to Email": "メールに返信",
diff --git a/packages/pieces/community/microsoft-outlook/src/i18n/nl.json b/packages/pieces/community/microsoft-outlook/src/i18n/nl.json
index f4c22bcdbd1..3560686f09e 100644
--- a/packages/pieces/community/microsoft-outlook/src/i18n/nl.json
+++ b/packages/pieces/community/microsoft-outlook/src/i18n/nl.json
@@ -1,5 +1,5 @@
{
- "\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. Log in bij [Microsoft Azure Portal](https://portal.azure.com/).\n. Ga naar **Microsoft Enfra ID**.\n3. Onder **Beheren**, klik op **App registraties**.\n4. Klik op de **Nieuwe registratie** knop.\n5. Voer een **Naam** in voor uw app.\n6. Voor **Ondersteunde accounttypen**, kies keuze:\n - **Accounts in elke map van de organisatie (Any Microsoft Entra ID-tenant - Multitenant) en persoonlijke Microsoft accounts**\n - Of selecteer gebaseerd op uw vereiste.\n7. In **Redirect URI**, selecteer **Web** en voeg de opgegeven URL toe.\n8. Klik **Register**.\n9. Na registratie wordt u doorgestuurd naar de overzichtspagina. Kopieer de **Applicatie (client) ID**.\n10. Ga in het linkermenu, naar **Certificaten & geheimen**.\n - onder **Client secrets**, klik op **Nieuw client geheim**.\n - Geef een beschrijving, verloop, en klik **Toevoegen**.\n - Kopieer de **Waarde** van de client secret (dit zal niet meer worden getoond).\n11. Ga naar **API-rechten** vanuit het linkermenu.\n - Klik **Een machtiging toevoegen**.\n - Selecteer **Microsoft Graph** → **gedelegeerde rechten**.\n - Voeg de volgende toepassingsgebieden toe:\n - Mail. eadWrite\n - Mail.Send \n - Kalenders. ead\n\t - offline_access\n\t - User.Read\n - Klik **Machtigingen toevoegen**.\n12. Kopieer uw **Client ID** en **Client Secret**.\n",
+ "\nIf you’d like to use your own custom Azure app instead of the default Activepieces app, follow the [Azure app creation guide](https://learn.microsoft.com/en-us/entra/identity-platform/quickstart-register-app#register-an-application),\n set the **Redirect URI** to {{redirectUrl}} and add the following **Microsoft Graph (Delegated) permissions** under **API permissions**:\n - User.Read\n - Mail.ReadWrite\n - Mail.Send\n - Calendars.Read\n - offline_access\n": "\nAls u uw eigen aangepaste Azure app wilt gebruiken in plaats van de standaard Activepieces app, Volg de [Azure app creatie handleiding] (https://learn.microsoft.com/en-us/entra/identity-platform/quickstart-register-app#register-an-application),\n zet de **Redirect URI** naar {{redirectUrl}} en voeg de volgende **Microsoft Graph (Delegated) permissies** toe onder **API permissies**:\n - gebruiker. ead\n - Mail.ReadWrite\n - Mail.Send\n - Kalendars.Lees\n - offline_access\n",
"Send Email": "E-mail verzenden",
"Download Attachment": "Bijlage downloaden",
"Reply to Email": "Beantwoord e-mail",
diff --git a/packages/pieces/community/microsoft-outlook/src/i18n/pt.json b/packages/pieces/community/microsoft-outlook/src/i18n/pt.json
index 846a3336c73..1070376da61 100644
--- a/packages/pieces/community/microsoft-outlook/src/i18n/pt.json
+++ b/packages/pieces/community/microsoft-outlook/src/i18n/pt.json
@@ -1,5 +1,5 @@
{
- "\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** → **Delegated permissions**.\n - Add the following scopes:\n - Mail.ReadWrite\n - Mail.Send\n\t - Calendars.Read\n\t - offline_access\n\t - User.Read\n - Click **Add permissions**.\n12. Copy your **Client ID** and **Client Secret**.\n",
+ "\nIf you’d like to use your own custom Azure app instead of the default Activepieces app, follow the [Azure app creation guide](https://learn.microsoft.com/en-us/entra/identity-platform/quickstart-register-app#register-an-application),\n set the **Redirect URI** to {{redirectUrl}} and add the following **Microsoft Graph (Delegated) permissions** under **API permissions**:\n - User.Read\n - Mail.ReadWrite\n - Mail.Send\n - Calendars.Read\n - offline_access\n": "\nIf you’d like to use your own custom Azure app instead of the default Activepieces app, follow the [Azure app creation guide](https://learn.microsoft.com/en-us/entra/identity-platform/quickstart-register-app#register-an-application),\n set the **Redirect URI** to {{redirectUrl}} and add the following **Microsoft Graph (Delegated) permissions** under **API permissions**:\n - User.Read\n - Mail.ReadWrite\n - Mail.Send\n - Calendars.Read\n - offline_access\n",
"Send Email": "Enviar e-mail",
"Download Attachment": "Baixar anexo",
"Reply to Email": "Responder para o E-mail",
diff --git a/packages/pieces/community/microsoft-outlook/src/i18n/zh.json b/packages/pieces/community/microsoft-outlook/src/i18n/zh.json
index aab65525cbe..d86c4e73f57 100644
--- a/packages/pieces/community/microsoft-outlook/src/i18n/zh.json
+++ b/packages/pieces/community/microsoft-outlook/src/i18n/zh.json
@@ -1,5 +1,5 @@
{
- "\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** → **Delegated permissions**.\n - Add the following scopes:\n - Mail.ReadWrite\n - Mail.Send\n\t - Calendars.Read\n\t - offline_access\n\t - User.Read\n - Click **Add permissions**.\n12. Copy your **Client ID** and **Client Secret**.\n",
+ "\nIf you’d like to use your own custom Azure app instead of the default Activepieces app, follow the [Azure app creation guide](https://learn.microsoft.com/en-us/entra/identity-platform/quickstart-register-app#register-an-application),\n set the **Redirect URI** to {{redirectUrl}} and add the following **Microsoft Graph (Delegated) permissions** under **API permissions**:\n - User.Read\n - Mail.ReadWrite\n - Mail.Send\n - Calendars.Read\n - offline_access\n": "\nIf you’d like to use your own custom Azure app instead of the default Activepieces app, follow the [Azure app creation guide](https://learn.microsoft.com/en-us/entra/identity-platform/quickstart-register-app#register-an-application),\n set the **Redirect URI** to {{redirectUrl}} and add the following **Microsoft Graph (Delegated) permissions** under **API permissions**:\n - User.Read\n - Mail.ReadWrite\n - Mail.Send\n - Calendars.Read\n - offline_access\n",
"Send Email": "Send Email",
"Download Attachment": "Download Attachment",
"Reply to Email": "Reply to Email",
diff --git a/packages/pieces/community/microsoft-power-bi/package.json b/packages/pieces/community/microsoft-power-bi/package.json
index 726368d3e29..c3ecde2c715 100644
--- a/packages/pieces/community/microsoft-power-bi/package.json
+++ b/packages/pieces/community/microsoft-power-bi/package.json
@@ -1,6 +1,6 @@
{
"name": "@activepieces/piece-microsoft-power-bi",
- "version": "0.1.5",
+ "version": "0.1.6",
"main": "./dist/src/index.js",
"types": "./dist/src/index.d.ts",
"icon": "https://raw.githubusercontent.com/microsoft/PowerBI-Icons/main/SVG/Power-BI.svg",
diff --git a/packages/pieces/community/microsoft-power-bi/src/i18n/de.json b/packages/pieces/community/microsoft-power-bi/src/i18n/de.json
index feff75297f2..f919df07ce7 100644
--- a/packages/pieces/community/microsoft-power-bi/src/i18n/de.json
+++ b/packages/pieces/community/microsoft-power-bi/src/i18n/de.json
@@ -1,6 +1,6 @@
{
"Create and manage Power BI datasets and push data to them": "Erstellen und verwalten von Power BI-Datensätzen und Push-Daten",
- "\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 **Umleitungs-URI** wählen Sie **Web** und fügen Sie die angegebene URL hinzu.\n8. Klicken Sie auf **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 auf **Berechtigung hinzufügen**.\n - Wähle **Power BI Service** → **Delegierte Berechtigungen**.\n - Fügen Sie folgende Bereiche hinzu:\n\t - Dataset. eadWrite.All\n\t - offline_access \n - Klicken Sie auf **Berechtigungen hinzufügen**.\n12. Kopieren Sie Ihre **Client-ID** und **Client-Geheimnis**.\n",
+ "If you'd like to use your own custom Azure app instead of the default Activepieces app, follow the [Azure app creation guide](https://learn.microsoft.com/en-us/entra/identity-platform/quickstart-register-app#register-an-application),\n set the **Redirect URI** to {{redirectUrl}} and add the following **Power BI Service (Delegated) permissions** under **API permissions**:\n - Dataset.ReadWrite.All\n - offline_access": "Wenn du deine eigene eigene Azure App anstelle der Standard Activepieces App verwenden möchtest, folge der [Azure App Erstellungsanleitung](https://learn.microsoft.com/en-us/entra/identity-platform/quickstart-register-app#register-an-application),\n hat die **Umleitungs-URI** auf {{redirectUrl}} gesetzt und die folgenden **Power BI Service (delegiert) Berechtigungen** unter **API Berechtigungen hinzugefügt**:\n - Dataset. eadWrite.Alle\n - offline_access",
"Create Dataset": "Datensatz erstellen",
"Push Rows to Dataset Table": "Zeilen an Datensatztabelle schieben",
"Custom API Call": "Eigener API-Aufruf",
diff --git a/packages/pieces/community/microsoft-power-bi/src/i18n/es.json b/packages/pieces/community/microsoft-power-bi/src/i18n/es.json
index bbffc9320f2..3abc53a40ac 100644
--- a/packages/pieces/community/microsoft-power-bi/src/i18n/es.json
+++ b/packages/pieces/community/microsoft-power-bi/src/i18n/es.json
@@ -1,6 +1,6 @@
{
"Create and manage Power BI datasets and push data to them": "Crear y administrar conjuntos de datos Power BI y enviarles datos",
- "\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 **Power BI Service** → **Delegated permissions**.\n - Add the following scopes:\n\t - Dataset.ReadWrite.All\n\t - offline_access\n - Click **Add permissions**.\n12. Copy your **Client ID** and **Client Secret**.\n",
+ "If you'd like to use your own custom Azure app instead of the default Activepieces app, follow the [Azure app creation guide](https://learn.microsoft.com/en-us/entra/identity-platform/quickstart-register-app#register-an-application),\n set the **Redirect URI** to {{redirectUrl}} and add the following **Power BI Service (Delegated) permissions** under **API permissions**:\n - Dataset.ReadWrite.All\n - offline_access": "Si quieres usar tu propia aplicación Azure personalizada en lugar de la aplicación Activepieces por defecto, sigue la [guía de creación de aplicaciones Azure](https://learn.microsoft.com/en-us/entra/identity-platform/quickstart-register-app#register-an-application),\n estableció la **URI** de Redirección a {{redirectUrl}} y agrega los siguientes **permisos de Servicio de BI Power (Delegado)** bajo **permisos API**:\n - Dataset. eadWrite.All\n - offline_access",
"Create Dataset": "Crear conjunto de datos",
"Push Rows to Dataset Table": "Enviar filas a tabla de datos",
"Custom API Call": "Llamada API personalizada",
diff --git a/packages/pieces/community/microsoft-power-bi/src/i18n/fr.json b/packages/pieces/community/microsoft-power-bi/src/i18n/fr.json
index df695dab83b..6d8280d934c 100644
--- a/packages/pieces/community/microsoft-power-bi/src/i18n/fr.json
+++ b/packages/pieces/community/microsoft-power-bi/src/i18n/fr.json
@@ -1,6 +1,6 @@
{
"Create and manage Power BI datasets and push data to them": "Créez et gérez des jeux de données Power BI et envoyez des données vers eux",
- "\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 **Power BI Service** → **Delegated permissions**.\n - Add the following scopes:\n\t - Dataset.ReadWrite.All\n\t - offline_access\n - Click **Add permissions**.\n12. Copy your **Client ID** and **Client Secret**.\n",
+ "If you'd like to use your own custom Azure app instead of the default Activepieces app, follow the [Azure app creation guide](https://learn.microsoft.com/en-us/entra/identity-platform/quickstart-register-app#register-an-application),\n set the **Redirect URI** to {{redirectUrl}} and add the following **Power BI Service (Delegated) permissions** under **API permissions**:\n - Dataset.ReadWrite.All\n - offline_access": "Si vous souhaitez utiliser votre propre application personnalisée Azure au lieu de l'application Activepieces par défaut, suivez le [guide de création des applications Azure](https://learn.microsoft.com/en-us/entra/identity-platform/quickstart-register-app#register-an-application),\n définit l'**URI de redirection** à {{redirectUrl}} et ajoute les permissions suivantes **Power BI Service (Déléguées) sous **permissions API** :\n - Dataset. Tous les\n - hors ligne_accès",
"Create Dataset": "Créer un jeu de données",
"Push Rows to Dataset Table": "Pousser les lignes vers la table des jeux de données",
"Custom API Call": "Appel API personnalisé",
diff --git a/packages/pieces/community/microsoft-power-bi/src/i18n/ja.json b/packages/pieces/community/microsoft-power-bi/src/i18n/ja.json
index f5c34a4672e..c4098a5e8b6 100644
--- a/packages/pieces/community/microsoft-power-bi/src/i18n/ja.json
+++ b/packages/pieces/community/microsoft-power-bi/src/i18n/ja.json
@@ -1,6 +1,6 @@
{
"Create and manage Power BI datasets and push data to them": "Power BI データセットを作成・管理し、データをプッシュします",
- "\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 **Power BI Service** → **Delegated permissions**.\n - Add the following scopes:\n\t - Dataset.ReadWrite.All\n\t - offline_access\n - Click **Add permissions**.\n12. Copy your **Client ID** and **Client Secret**.\n",
+ "If you'd like to use your own custom Azure app instead of the default Activepieces app, follow the [Azure app creation guide](https://learn.microsoft.com/en-us/entra/identity-platform/quickstart-register-app#register-an-application),\n set the **Redirect URI** to {{redirectUrl}} and add the following **Power BI Service (Delegated) permissions** under **API permissions**:\n - Dataset.ReadWrite.All\n - offline_access": "If you'd like to use your own custom Azure app instead of the default Activepieces app, follow the [Azure app creation guide](https://learn.microsoft.com/en-us/entra/identity-platform/quickstart-register-app#register-an-application),\n set the **Redirect URI** to {{redirectUrl}} and add the following **Power BI Service (Delegated) permissions** under **API permissions**:\n - Dataset.ReadWrite.All\n - offline_access",
"Create Dataset": "データセットを作成",
"Push Rows to Dataset Table": "データセットテーブルに行をプッシュする",
"Custom API Call": "カスタムAPI通話",
diff --git a/packages/pieces/community/microsoft-power-bi/src/i18n/nl.json b/packages/pieces/community/microsoft-power-bi/src/i18n/nl.json
index fcdd77ec037..c23d80e4e9f 100644
--- a/packages/pieces/community/microsoft-power-bi/src/i18n/nl.json
+++ b/packages/pieces/community/microsoft-power-bi/src/i18n/nl.json
@@ -1,6 +1,6 @@
{
"Create and manage Power BI datasets and push data to them": "Maken en beheren van Power BI datasets en push-gegevens naar hen",
- "\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. Log in bij [Microsoft Azure Portal](https://portal.azure.com/).\n. Ga naar **Microsoft Enfra ID**.\n3. Onder **Beheren**, klik op **App registraties**.\n4. Klik op de **Nieuwe registratie** knop.\n5. Voer een **Naam** in voor uw app.\n6. Voor **Ondersteunde accounttypen**, kies keuze:\n - **Accounts in elke map van de organisatie (Any Microsoft Entra ID-tenant - Multitenant) en persoonlijke Microsoft accounts**\n - Of selecteer gebaseerd op uw vereiste.\n7. In **Redirect URI** selecteer **Web** en voeg de opgegeven URL toe.\n8. Klik op **Register**.\n9. Na registratie wordt u doorverwezen naar de overzichtspagina. Kopieer de **Applicatie (client) ID**.\n10. Vanuit het linkermenu ga naar **Certificaten & geheimen**.\n - Klik onder **Client geheimen** op **Nieuwe client geheim**.\n - Geef een beschrijving, verloop, en klik **Toevoegen**.\n - Kopieer de **waarde** van de client secret (dit zal niet meer worden weergegeven).\n11. Ga naar **API permissies** in het linkermenu.\n - Klik **Een permissie toevoegen**.\n - Selecteer **Power BI Service** → **Toegewezen machtigingen**.\n - Voeg de volgende toepassingsgebieden toe:\n\t - Dataset. eadWrite.Alle\n\t - offline_access \n - Klik **Permissies toevoegen**.\n12. Kopieer uw **Client ID** en **Client Secret**.\n",
+ "If you'd like to use your own custom Azure app instead of the default Activepieces app, follow the [Azure app creation guide](https://learn.microsoft.com/en-us/entra/identity-platform/quickstart-register-app#register-an-application),\n set the **Redirect URI** to {{redirectUrl}} and add the following **Power BI Service (Delegated) permissions** under **API permissions**:\n - Dataset.ReadWrite.All\n - offline_access": "Als u uw eigen aangepaste Azure app wilt gebruiken in plaats van de standaard Activepieces app, volg dan de [Azure app creatie guide](https://learn.microsoft.com/en-us/entra/identity-platform/quickstart-register-app#register-an-application),\n zet de **Redirect URI** naar {{redirectUrl}} en voeg de volgende **Power BI Service (Delegated) permissies** toe onder **API permissies**:\n - Dataset. eadWrite.Alle\n - offline_access",
"Create Dataset": "Dataset aanmaken",
"Push Rows to Dataset Table": "Duw rijen naar Dataset Tabel",
"Custom API Call": "Custom API Call",
diff --git a/packages/pieces/community/microsoft-power-bi/src/i18n/pt.json b/packages/pieces/community/microsoft-power-bi/src/i18n/pt.json
index 5f54a09d874..08d40db28ad 100644
--- a/packages/pieces/community/microsoft-power-bi/src/i18n/pt.json
+++ b/packages/pieces/community/microsoft-power-bi/src/i18n/pt.json
@@ -1,6 +1,6 @@
{
"Create and manage Power BI datasets and push data to them": "Criar e gerenciar conjuntos de dados Power BI e enviar dados para eles",
- "\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. Entre no [Microsoft Azure Portal](https://portal.azure.com/).\n. Na barra lateral esquerda, vá até **Microsoft Enfra ID**.\n3. Sob **Gerenciar**, clique em **Aplicativos registrados**.\n4. Clique no botão **Novo registro**.\n5. Digite um **Nome** para o seu aplicativo.\n6. Para **Tipos de conta suportados**, escolha:\n - **Contas em qualquer diretório organizacional (qualquer inquilino de ID da Microsoft Entra - Multitenant) e contas pessoais da Microsoft**\n - Ou selecione com base nos seus requisitos.\n7. Em **URI de redirecionamento**, selecione **Web** e adicione a URL fornecida.\n8. Clique em **Registrar**.\n9. Após o registro, você será redirecionado para a página de visão geral do aplicativo. Copie o **aplicativo (cliente) ID**.\n10. Do menu à esquerda, vá para **Certificados e segredos**.\n - Em **Segredos do Cliente**, clique em **Novo segredo do Cliente**.\n - Fornece uma descrição, define um vencimento e clique em **Adicionar**.\n - Copiar o **Valor** do segredo do cliente (isso não será exibido novamente).\n11. Vá para **permissões de API** no menu à esquerda.\n - Clique **Adicionar uma permissão**.\n - Selecione **Serviço de Energia BI** → **Permissões delegadas**.\n - Adicione os seguintes escopos:\n\t - Dataset. eadWrite.All\n\t - offline_access \n - Clique em **Adicionar permissões**.\n12. Copie seu **ID do Cliente** e **Segredo do Cliente**.\n",
+ "If you'd like to use your own custom Azure app instead of the default Activepieces app, follow the [Azure app creation guide](https://learn.microsoft.com/en-us/entra/identity-platform/quickstart-register-app#register-an-application),\n set the **Redirect URI** to {{redirectUrl}} and add the following **Power BI Service (Delegated) permissions** under **API permissions**:\n - Dataset.ReadWrite.All\n - offline_access": "Se você quiser usar seu próprio aplicativo Azure personalizado em vez do aplicativo Activepieces padrão, siga o [guia de criação de aplicativo Azu](https://learn.microsoft.com/en-us/entra/identity-platform/quickstart-register-app#register-an-application),\n definiu a **URI de redirecionamento** para {{redirectUrl}} e adicionar a seguinte **Serviço de energia BI (excluir) permissões** em **permissões de API**:\n - Dataset. eadWrite.All\n - offline_access",
"Create Dataset": "Criar dados",
"Push Rows to Dataset Table": "Empurrar Linhas para a Tabela de Conjunto de Dados",
"Custom API Call": "Chamada de API personalizada",
diff --git a/packages/pieces/community/microsoft-power-bi/src/i18n/zh.json b/packages/pieces/community/microsoft-power-bi/src/i18n/zh.json
index 8bf0d9e4eb5..6ee0499dc41 100644
--- a/packages/pieces/community/microsoft-power-bi/src/i18n/zh.json
+++ b/packages/pieces/community/microsoft-power-bi/src/i18n/zh.json
@@ -1,6 +1,6 @@
{
"Create and manage Power BI datasets and push data to them": "Create and manage Power BI datasets and push data to them",
- "\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 **Power BI Service** → **Delegated permissions**.\n - Add the following scopes:\n\t - Dataset.ReadWrite.All\n\t - offline_access\n - Click **Add permissions**.\n12. Copy your **Client ID** and **Client Secret**.\n",
+ "If you'd like to use your own custom Azure app instead of the default Activepieces app, follow the [Azure app creation guide](https://learn.microsoft.com/en-us/entra/identity-platform/quickstart-register-app#register-an-application),\n set the **Redirect URI** to {{redirectUrl}} and add the following **Power BI Service (Delegated) permissions** under **API permissions**:\n - Dataset.ReadWrite.All\n - offline_access": "If you'd like to use your own custom Azure app instead of the default Activepieces app, follow the [Azure app creation guide](https://learn.microsoft.com/en-us/entra/identity-platform/quickstart-register-app#register-an-application),\n set the **Redirect URI** to {{redirectUrl}} and add the following **Power BI Service (Delegated) permissions** under **API permissions**:\n - Dataset.ReadWrite.All\n - offline_access",
"Create Dataset": "Create Dataset",
"Push Rows to Dataset Table": "Push Rows to Dataset Table",
"Custom API Call": "自定义 API 呼叫",
diff --git a/packages/pieces/community/microsoft-sharepoint/package.json b/packages/pieces/community/microsoft-sharepoint/package.json
index f555e6b77a2..429f58a136a 100644
--- a/packages/pieces/community/microsoft-sharepoint/package.json
+++ b/packages/pieces/community/microsoft-sharepoint/package.json
@@ -1,6 +1,6 @@
{
"name": "@activepieces/piece-microsoft-sharepoint",
- "version": "0.2.11",
+ "version": "0.2.12",
"main": "./dist/src/index.js",
"types": "./dist/src/index.d.ts",
"dependencies": {
diff --git a/packages/pieces/community/microsoft-sharepoint/src/i18n/de.json b/packages/pieces/community/microsoft-sharepoint/src/i18n/de.json
index ec35a2b1ea0..6579a5e3aba 100644
--- a/packages/pieces/community/microsoft-sharepoint/src/i18n/de.json
+++ b/packages/pieces/community/microsoft-sharepoint/src/i18n/de.json
@@ -1,5 +1,5 @@
{
- "\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 zu **Microsoft Enfra ID**.\n3. Unter **Verwalten** klicken Sie auf **App-Registrierungen**.\n4. Klicken Sie auf die **Neue Registrierung** Schaltfläche.\nGib einen **Name** für deine App ein.\nFü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: {{redirectUrl}}\n8. Klicken Sie auf **Registrieren**.\n9. Nach der Registrierung werden Sie zur Übersichtsseite der App weitergeleitet. Kopieren Sie die **Anwendungs-(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 auf **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",
+ "\nIf you'd like to use your own custom Azure app instead of the default Activepieces app, follow the [Azure app creation guide](https://learn.microsoft.com/en-us/entra/identity-platform/quickstart-register-app#register-an-application),\n set the **Redirect URI** to {{redirectUrl}} and add the following **Microsoft Graph (Delegated) permissions** under **API 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": "\nWenn Sie Ihre eigene eigene Azure App anstelle der Standard Activepieces App verwenden möchten, folge der [Azure App Erstellungsanleitung](https://learn.microsoft.com/en-us/entra/identity-platform/quickstart-register-app#register-an-application),\n hat die **Umleitungs-URI** auf {{redirectUrl}} gesetzt und die folgenden **Microsoft-Graph (delegiert) Berechtigungen** unter **API-Berechtigungen**:\n - Seiten hinzugefügt. ead.All\n - Sites.ReadWrite.All\n - Sites.Manage.All\n - Files.ReadWrite. ll\n - openid\n - E-Mail\n - Profil\n - offline_access",
"Create Folder": "Ordner erstellen",
"Create List": "Liste erstellen",
"Create List Item": "Listenelement erstellen",
diff --git a/packages/pieces/community/microsoft-sharepoint/src/i18n/es.json b/packages/pieces/community/microsoft-sharepoint/src/i18n/es.json
index a62dd04e8b8..21254497b7e 100644
--- a/packages/pieces/community/microsoft-sharepoint/src/i18n/es.json
+++ b/packages/pieces/community/microsoft-sharepoint/src/i18n/es.json
@@ -1,5 +1,5 @@
{
- "\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. Inicie sesión en [Microsoft Azure Portal](https://portal.azure.com/).\n. Desde la barra lateral izquierda, vaya a **Microsoft Enfra ID**. Rformat@@3 3. Bajo **Administrar**, haga clic en **registros de aplicación**.\n4. Haga clic en el botón **Nueva registro**.\n5. Introduce un **nombre** para tu aplicación.\n6. Para **Tipos de cuenta compatibles**, elegir:\n - **Cuentas en cualquier directorio organizacional (Cualquier cliente de Microsoft Entra ID - Multitenant) y cuentas personales de Microsoft**\n - O seleccione basándose en su requerimiento.\n7. En **Redirigir URI**, seleccione **Web** y añada la URL dada: {{redirectUrl}}\n8. Haga clic en **Registrar**.\n9. Después del registro, serás redirigido a la página de resumen de la aplicación. Copia el **ID de aplicación (cliente**.\n10. Desde el menú de la izquierda, vaya a **Certificados y secretos**.\n - Bajo **Secretos de cliente**, haga clic en **Nuevo secreto de cliente**.\n - Proporciona una descripción, establece un vencimiento y haz clic en **Añadir**.\n - Copia el **Valor** del secreto del cliente (no se mostrará de nuevo).\n11. Ve a **permisos de API** desde el menú de la izquierda.\n - Haga clic en **Agregar un permiso**.\n - Seleccione **Microsoft Graph**.\n - Agregue los siguientes **Permisos elegados**:\n - Sitios.Read. ll \n - Sites.ReadWrite.All\n - Sitios. anage.All\n - Files.ReadWrite. ll\n - openid\n - email\n - profile\n - offline_access\n - Click **Add permissions**.\n12. Copie su **ID de cliente** y su **Código de cliente**.\n",
+ "\nIf you'd like to use your own custom Azure app instead of the default Activepieces app, follow the [Azure app creation guide](https://learn.microsoft.com/en-us/entra/identity-platform/quickstart-register-app#register-an-application),\n set the **Redirect URI** to {{redirectUrl}} and add the following **Microsoft Graph (Delegated) permissions** under **API 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": "\nIf you'd like to use your own custom Azure app instead of the default Activepieces app, follow the [Azure app creation guide](https://learn.microsoft.com/en-us/entra/identity-platform/quickstart-register-app#register-an-application),\n set the **Redirect URI** to {{redirectUrl}} and add the following **Microsoft Graph (Delegated) permissions** under **API 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",
"Create Folder": "Crear carpeta",
"Create List": "Crear Lista",
"Create List Item": "Crear elemento de lista",
diff --git a/packages/pieces/community/microsoft-sharepoint/src/i18n/fr.json b/packages/pieces/community/microsoft-sharepoint/src/i18n/fr.json
index a6dbde4267d..4226f34f6a0 100644
--- a/packages/pieces/community/microsoft-sharepoint/src/i18n/fr.json
+++ b/packages/pieces/community/microsoft-sharepoint/src/i18n/fr.json
@@ -1,5 +1,5 @@
{
- "\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: {{redirectUrl}}\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",
+ "\nIf you'd like to use your own custom Azure app instead of the default Activepieces app, follow the [Azure app creation guide](https://learn.microsoft.com/en-us/entra/identity-platform/quickstart-register-app#register-an-application),\n set the **Redirect URI** to {{redirectUrl}} and add the following **Microsoft Graph (Delegated) permissions** under **API 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": "\nIf you'd like to use your own custom Azure app instead of the default Activepieces app, follow the [Azure app creation guide](https://learn.microsoft.com/en-us/entra/identity-platform/quickstart-register-app#register-an-application),\n set the **Redirect URI** to {{redirectUrl}} and add the following **Microsoft Graph (Delegated) permissions** under **API 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",
"Create Folder": "Créer un dossier",
"Create List": "Créer une liste",
"Create List Item": "Créer un élément de liste",
diff --git a/packages/pieces/community/microsoft-sharepoint/src/i18n/ja.json b/packages/pieces/community/microsoft-sharepoint/src/i18n/ja.json
index ce316fcff71..2b0c6377d68 100644
--- a/packages/pieces/community/microsoft-sharepoint/src/i18n/ja.json
+++ b/packages/pieces/community/microsoft-sharepoint/src/i18n/ja.json
@@ -1,5 +1,5 @@
{
- "\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: {{redirectUrl}}\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",
+ "\nIf you'd like to use your own custom Azure app instead of the default Activepieces app, follow the [Azure app creation guide](https://learn.microsoft.com/en-us/entra/identity-platform/quickstart-register-app#register-an-application),\n set the **Redirect URI** to {{redirectUrl}} and add the following **Microsoft Graph (Delegated) permissions** under **API 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": "\nIf you'd like to use your own custom Azure app instead of the default Activepieces app, follow the [Azure app creation guide](https://learn.microsoft.com/en-us/entra/identity-platform/quickstart-register-app#register-an-application),\n set the **Redirect URI** to {{redirectUrl}} and add the following **Microsoft Graph (Delegated) permissions** under **API 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",
"Create Folder": "フォルダを作成",
"Create List": "リストを作成",
"Create List Item": "リストアイテムを作成",
diff --git a/packages/pieces/community/microsoft-sharepoint/src/i18n/nl.json b/packages/pieces/community/microsoft-sharepoint/src/i18n/nl.json
index ab797e04d31..be8a9fc61a9 100644
--- a/packages/pieces/community/microsoft-sharepoint/src/i18n/nl.json
+++ b/packages/pieces/community/microsoft-sharepoint/src/i18n/nl.json
@@ -1,5 +1,5 @@
{
- "\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. Meld je aan bij [Microsoft Azure Portal](https://portal.azure.com/).\n. Ga naar **Microsoft Enfra ID**.\n3. Klik onder **Beheren**, op **App registraties**.\n4. Klik op de **Nieuwe registratie** knop.\n5. Voer een **naam** in voor uw app.\n6. Voor **Ondersteunde accounttypen**, kies keuze:\n - **Accounts in elke map van de organisatie (Any Microsoft Entra ID-tenant - Multitenant) en persoonlijke Microsoft accounts**\n - Of selecteer gebaseerd op uw vereiste.\n7. In **Redirect URI**, selecteer **Web** en voeg de opgegeven URL toe: {{redirectUrl}}\n8. Klik **Register**.\n9. Na registratie wordt u doorverwezen naar de overzichtspagina. Kopieer de **Applicatie (client) ID**.\n10. Vanuit het linkermenu ga naar **Certificaten en geheimen**.\n - Klik onder **Client geheimen** op **Nieuwe client geheim**.\n - Geef een beschrijving, verloop, en klik **Toevoegen**.\n - Kopieer de **waarde** van de client secret (dit zal niet meer worden weergegeven).\n11. Ga naar **API permissies** in het linkermenu.\n - Klik **Een machtiging toevoegen**.\n - Selecteer **Microsoft Graph**.\n - Voeg de volgende **gedelegeerde machtigingen** toe**:\n - Sites.Read. ll \n - Sites.ReadWrite.All\n - Sites. anage.All\n - Files.ReadWrite. ll\n - openid\n - email\n - profiel\n - offline_access\n - Klik op **rechten toevoegen**.\n12. Kopieer de **Client ID** en **Client Secret**.\n",
+ "\nIf you'd like to use your own custom Azure app instead of the default Activepieces app, follow the [Azure app creation guide](https://learn.microsoft.com/en-us/entra/identity-platform/quickstart-register-app#register-an-application),\n set the **Redirect URI** to {{redirectUrl}} and add the following **Microsoft Graph (Delegated) permissions** under **API 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": "\nAls u uw eigen aangepaste Azure app wilt gebruiken in plaats van de standaard Activepieces app, Volg de [Azure app creatie handleiding] (https://learn.microsoft.com/en-us/entra/identity-platform/quickstart-register-app#register-an-application),\n zet de **Redirect URI** naar {{redirectUrl}} en voeg de volgende **Microsoft Graph (Delegated) permissies** toe onder **API permissies**:\n - Sites. ead.All\n - Sites.ReadWrite.All\n - Sites.Manage.All\n - Files.ReadWrite. ll\n - openid\n - email\n - profiel\n - offline_access",
"Create Folder": "Map aanmaken",
"Create List": "Lijst aanmaken",
"Create List Item": "Lijstitem aanmaken",
diff --git a/packages/pieces/community/microsoft-sharepoint/src/i18n/pt.json b/packages/pieces/community/microsoft-sharepoint/src/i18n/pt.json
index 54295e906c5..27fb3a74f26 100644
--- a/packages/pieces/community/microsoft-sharepoint/src/i18n/pt.json
+++ b/packages/pieces/community/microsoft-sharepoint/src/i18n/pt.json
@@ -1,5 +1,5 @@
{
- "\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. Entre no [Microsoft Azure Portal](https://portal.azure.com/).\n. Na barra lateral esquerda, vá até **Microsoft Enfra ID**.\n3. Sob **Gerenciar**, clique em **Aplicativos registrados**.\n4. Clique no botão **Novo registro**.\n5. Digite um **nome** para o seu aplicativo.\n6. Para **Tipos de conta suportados**, escolha:\n - **Contas em qualquer diretório organizacional (qualquer inquilino de ID da Microsoft Entra - Multitenant) e contas pessoais da Microsoft**\n - Ou selecione com base nos seus requisitos.\n7. Em **URI de redirecionamento**, selecione **Web** e adicione a URL indicada: {{redirectUrl}}\n8. Clique em **Registrar**.\n9. Após o registro, você será redirecionado para a página de visão geral do aplicativo. Copie o **ID do aplicativo (cliente) **.\n10. No menu da esquerda, vá para **Certificados e segredos**.\n - Em **Segredos do Cliente**, clique em **Novo segredo do Cliente**.\n - Fornece uma descrição, define um vencimento e clique em **Adicionar**.\n - Copiar o **Valor** do segredo do cliente (isso não aparecerá novamente).\n11. Vá para **permissões de API** no menu à esquerda.\n - Clique em **adicionar permissão**.\n - Selecione **Microsoft Graph**.\n - Adicionar as seguintes **permissões delegadas**:\n - Sites.Read. ll \n - Sites.ReadWrite.All\n - Sites. anage.All\n - Files.ReadWrite. ll\n - openid\n - email\n - perfil\n - offline_access\n - Clique em **Adicionar permissões**.\n12. Copie seu **ID do cliente** e **Segredo do Cliente**.\n",
+ "\nIf you'd like to use your own custom Azure app instead of the default Activepieces app, follow the [Azure app creation guide](https://learn.microsoft.com/en-us/entra/identity-platform/quickstart-register-app#register-an-application),\n set the **Redirect URI** to {{redirectUrl}} and add the following **Microsoft Graph (Delegated) permissions** under **API 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": "\nIf you'd like to use your own custom Azure app instead of the default Activepieces app, follow the [Azure app creation guide](https://learn.microsoft.com/en-us/entra/identity-platform/quickstart-register-app#register-an-application),\n set the **Redirect URI** to {{redirectUrl}} and add the following **Microsoft Graph (Delegated) permissions** under **API 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",
"Create Folder": "Criar pasta",
"Create List": "Criar lista",
"Create List Item": "Criar Item de Lista",
diff --git a/packages/pieces/community/microsoft-sharepoint/src/i18n/zh.json b/packages/pieces/community/microsoft-sharepoint/src/i18n/zh.json
index 78776c4170a..86fabb2d6ce 100644
--- a/packages/pieces/community/microsoft-sharepoint/src/i18n/zh.json
+++ b/packages/pieces/community/microsoft-sharepoint/src/i18n/zh.json
@@ -1,5 +1,5 @@
{
- "\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: {{redirectUrl}}\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",
+ "\nIf you'd like to use your own custom Azure app instead of the default Activepieces app, follow the [Azure app creation guide](https://learn.microsoft.com/en-us/entra/identity-platform/quickstart-register-app#register-an-application),\n set the **Redirect URI** to {{redirectUrl}} and add the following **Microsoft Graph (Delegated) permissions** under **API 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": "\nIf you'd like to use your own custom Azure app instead of the default Activepieces app, follow the [Azure app creation guide](https://learn.microsoft.com/en-us/entra/identity-platform/quickstart-register-app#register-an-application),\n set the **Redirect URI** to {{redirectUrl}} and add the following **Microsoft Graph (Delegated) permissions** under **API 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",
"Create Folder": "Create Folder",
"Create List": "Create List",
"Create List Item": "Create List Item",
diff --git a/packages/pieces/community/microsoft-teams/package.json b/packages/pieces/community/microsoft-teams/package.json
index 07e1e61ddc0..298f521bb67 100644
--- a/packages/pieces/community/microsoft-teams/package.json
+++ b/packages/pieces/community/microsoft-teams/package.json
@@ -1,6 +1,6 @@
{
"name": "@activepieces/piece-microsoft-teams",
- "version": "0.3.11",
+ "version": "0.3.12",
"main": "./dist/src/index.js",
"types": "./dist/src/index.d.ts",
"dependencies": {
diff --git a/packages/pieces/community/microsoft-teams/src/i18n/de.json b/packages/pieces/community/microsoft-teams/src/i18n/de.json
index 7bd22ed4c9d..43c0f7a25ac 100644
--- a/packages/pieces/community/microsoft-teams/src/i18n/de.json
+++ b/packages/pieces/community/microsoft-teams/src/i18n/de.json
@@ -1,5 +1,5 @@
{
- "\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 zu **Microsoft Enfra ID**.\n. Unter **Verwalten** klicken Sie auf **App-Registrierungen**.\n4. Klicken Sie auf die **Neue Registrierung** Schaltfläche.\nGib einen **Name** für deine App ein.\nFü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 **Umleitungs-URI** wählen Sie **Web** und fügen Sie die angegebene URL hinzu.\n8. Klicken Sie auf **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 auf **Berechtigung hinzufügen**.\n - Wähle **Microsoft Graph** → **Delegierte Berechtigungen**.\n - Fügen Sie folgende Bereiche hinzu:\n\t - Benutzer. ead\n - Channel.Create \n - Channel.ReadBasic. ll\n\t - ChannelMessage.Senden Sie\n\t - Team.ReadBasic.Alle\n\t - Chat.ReadWrite\n\t - ChannelMessage. ead.All\n\t - User.ReadBasic.All\n\t - Presence.Read.All\n\t - Teammitglied. ead.Alle\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",
+ "\nIf you'd like to use your own custom Azure app instead of the default Activepieces app, follow the [Azure app creation guide](https://learn.microsoft.com/en-us/entra/identity-platform/quickstart-register-app#register-an-application),\n set the **Redirect URI** to {{redirectUrl}} and add the following **Microsoft Graph (Delegated) permissions** under **API permissions**:\n - User.Read\n\t- Channel.Create\n\t- Channel.ReadBasic.All\n\t- ChannelMessage.Send\n\t- Team.ReadBasic.All\n\t- Chat.ReadWrite\n\t- ChannelMessage.R": "\nWenn Sie Ihre eigene eigene Azure App anstelle der Standard Activepieces App verwenden möchten, folge der [Azure App Erstellungsanleitung](https://learn.microsoft.com/en-us/entra/identity-platform/quickstart-register-app#register-an-application),\n setzte die **Umleitungs-URI** auf {{redirectUrl}} und füge folgende **Microsoft Graph (Delegiert) Berechtigungen** unter **API Berechtigungen**:\n - Benutzer hinzu. ead\n\t- Kanal. reate\n\t- Channel.ReadBasic.Alles\n\t- ChannelMessage.Senden\n\t- Team.ReadBasic.Alle\n\t- Chat.ReadWrite\n\t- ChannelMessage.Read.Read.Alles\n\t- Benutzer. eadBasic.Alle\n\t- Presence.Read.Alle\n\t- TeamMember.Read.Alles\n\t- openid\n\t- E-Mail\n\t- Profil\n\t- offline_access",
"Create Channel": "Kanal erstellen",
"Send Channel Message": "Kanalnachricht senden",
"Send Chat Message": "Chat-Nachricht senden",
diff --git a/packages/pieces/community/microsoft-teams/src/i18n/es.json b/packages/pieces/community/microsoft-teams/src/i18n/es.json
index b83e5f483e5..26abd8a84b4 100644
--- a/packages/pieces/community/microsoft-teams/src/i18n/es.json
+++ b/packages/pieces/community/microsoft-teams/src/i18n/es.json
@@ -1,5 +1,5 @@
{
- "\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** → **Delegated permissions**.\n - Add the following scopes:\n\t - User.Read\n - Channel.Create\n\t - Channel.ReadBasic.All\n\t - ChannelMessage.Send\n\t - Team.ReadBasic.All\n\t - Chat.ReadWrite\n\t - ChannelMessage.Read.All\n\t - User.ReadBasic.All\n\t - Presence.Read.All\n\t - TeamMember.Read.All\n - openid\n - email\n - profile\n\t - offline_access\n - Click **Add permissions**.\n12. Copy your **Client ID** and **Client Secret**.\n",
+ "\nIf you'd like to use your own custom Azure app instead of the default Activepieces app, follow the [Azure app creation guide](https://learn.microsoft.com/en-us/entra/identity-platform/quickstart-register-app#register-an-application),\n set the **Redirect URI** to {{redirectUrl}} and add the following **Microsoft Graph (Delegated) permissions** under **API permissions**:\n - User.Read\n\t- Channel.Create\n\t- Channel.ReadBasic.All\n\t- ChannelMessage.Send\n\t- Team.ReadBasic.All\n\t- Chat.ReadWrite\n\t- ChannelMessage.R": "\nIf you'd like to use your own custom Azure app instead of the default Activepieces app, follow the [Azure app creation guide](https://learn.microsoft.com/en-us/entra/identity-platform/quickstart-register-app#register-an-application),\n set the **Redirect URI** to {{redirectUrl}} and add the following **Microsoft Graph (Delegated) permissions** under **API permissions**:\n - User.Read\n\t- Channel.Create\n\t- Channel.ReadBasic.All\n\t- ChannelMessage.Send\n\t- Team.ReadBasic.All\n\t- Chat.ReadWrite\n\t- ChannelMessage.Read.All\n\t- User.ReadBasic.All\n\t- Presence.Read.All\n\t- TeamMember.Read.All\n\t- openid\n\t- email\n\t- profile\n\t- offline_access",
"Create Channel": "Crear canal",
"Send Channel Message": "Enviar Mensaje del Canal",
"Send Chat Message": "Enviar mensaje de chat",
diff --git a/packages/pieces/community/microsoft-teams/src/i18n/fr.json b/packages/pieces/community/microsoft-teams/src/i18n/fr.json
index c6e9c89cda2..d988ee48cfa 100644
--- a/packages/pieces/community/microsoft-teams/src/i18n/fr.json
+++ b/packages/pieces/community/microsoft-teams/src/i18n/fr.json
@@ -1,5 +1,5 @@
{
- "\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** → **Delegated permissions**.\n - Add the following scopes:\n\t - User.Read\n - Channel.Create\n\t - Channel.ReadBasic.All\n\t - ChannelMessage.Send\n\t - Team.ReadBasic.All\n\t - Chat.ReadWrite\n\t - ChannelMessage.Read.All\n\t - User.ReadBasic.All\n\t - Presence.Read.All\n\t - TeamMember.Read.All\n - openid\n - email\n - profile\n\t - offline_access\n - Click **Add permissions**.\n12. Copy your **Client ID** and **Client Secret**.\n",
+ "\nIf you'd like to use your own custom Azure app instead of the default Activepieces app, follow the [Azure app creation guide](https://learn.microsoft.com/en-us/entra/identity-platform/quickstart-register-app#register-an-application),\n set the **Redirect URI** to {{redirectUrl}} and add the following **Microsoft Graph (Delegated) permissions** under **API permissions**:\n - User.Read\n\t- Channel.Create\n\t- Channel.ReadBasic.All\n\t- ChannelMessage.Send\n\t- Team.ReadBasic.All\n\t- Chat.ReadWrite\n\t- ChannelMessage.R": "\nIf you'd like to use your own custom Azure app instead of the default Activepieces app, follow the [Azure app creation guide](https://learn.microsoft.com/en-us/entra/identity-platform/quickstart-register-app#register-an-application),\n set the **Redirect URI** to {{redirectUrl}} and add the following **Microsoft Graph (Delegated) permissions** under **API permissions**:\n - User.Read\n\t- Channel.Create\n\t- Channel.ReadBasic.All\n\t- ChannelMessage.Send\n\t- Team.ReadBasic.All\n\t- Chat.ReadWrite\n\t- ChannelMessage.Read.All\n\t- User.ReadBasic.All\n\t- Presence.Read.All\n\t- TeamMember.Read.All\n\t- openid\n\t- email\n\t- profile\n\t- offline_access",
"Create Channel": "Créer un canal",
"Send Channel Message": "Envoyer un message dans un channel",
"Send Chat Message": "Envoyer un message de chat",
diff --git a/packages/pieces/community/microsoft-teams/src/i18n/ja.json b/packages/pieces/community/microsoft-teams/src/i18n/ja.json
index 0b955209b7b..f118c1eb642 100644
--- a/packages/pieces/community/microsoft-teams/src/i18n/ja.json
+++ b/packages/pieces/community/microsoft-teams/src/i18n/ja.json
@@ -1,5 +1,5 @@
{
- "\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** → **Delegated permissions**.\n - Add the following scopes:\n\t - User.Read\n - Channel.Create\n\t - Channel.ReadBasic.All\n\t - ChannelMessage.Send\n\t - Team.ReadBasic.All\n\t - Chat.ReadWrite\n\t - ChannelMessage.Read.All\n\t - User.ReadBasic.All\n\t - Presence.Read.All\n\t - TeamMember.Read.All\n - openid\n - email\n - profile\n\t - offline_access\n - Click **Add permissions**.\n12. Copy your **Client ID** and **Client Secret**.\n",
+ "\nIf you'd like to use your own custom Azure app instead of the default Activepieces app, follow the [Azure app creation guide](https://learn.microsoft.com/en-us/entra/identity-platform/quickstart-register-app#register-an-application),\n set the **Redirect URI** to {{redirectUrl}} and add the following **Microsoft Graph (Delegated) permissions** under **API permissions**:\n - User.Read\n\t- Channel.Create\n\t- Channel.ReadBasic.All\n\t- ChannelMessage.Send\n\t- Team.ReadBasic.All\n\t- Chat.ReadWrite\n\t- ChannelMessage.R": "\nIf you'd like to use your own custom Azure app instead of the default Activepieces app, follow the [Azure app creation guide](https://learn.microsoft.com/en-us/entra/identity-platform/quickstart-register-app#register-an-application),\n set the **Redirect URI** to {{redirectUrl}} and add the following **Microsoft Graph (Delegated) permissions** under **API permissions**:\n - User.Read\n\t- Channel.Create\n\t- Channel.ReadBasic.All\n\t- ChannelMessage.Send\n\t- Team.ReadBasic.All\n\t- Chat.ReadWrite\n\t- ChannelMessage.Read.All\n\t- User.ReadBasic.All\n\t- Presence.Read.All\n\t- TeamMember.Read.All\n\t- openid\n\t- email\n\t- profile\n\t- offline_access",
"Create Channel": "チャンネルを作成",
"Send Channel Message": "チャンネルにメッセージを送信",
"Send Chat Message": "チャットにメッセージを送信",
diff --git a/packages/pieces/community/microsoft-teams/src/i18n/nl.json b/packages/pieces/community/microsoft-teams/src/i18n/nl.json
index 9ee0066ac93..f9e2978f998 100644
--- a/packages/pieces/community/microsoft-teams/src/i18n/nl.json
+++ b/packages/pieces/community/microsoft-teams/src/i18n/nl.json
@@ -1,5 +1,5 @@
{
- "\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. Meld je aan bij [Microsoft Azure Portal](https://portal.azure.com/).\n. Ga naar **Microsoft Enfra ID**.\n. Klik onder **Beheren**, op **App registraties**.\n4. Klik op de **Nieuwe registratie** knop.\n5. Voer een **naam** in voor uw app.\n6. Voor **Ondersteunde accounttypen**, kies keuze:\n - **Accounts in elke map van de organisatie (Any Microsoft Entra ID-tenant - Multitenant) en persoonlijke Microsoft accounts**\n - Of selecteer gebaseerd op uw vereiste.\n7. In **Redirect URI** selecteer **Web** en voeg de opgegeven URL toe.\n8. Klik op **Register**.\n9. Na registratie wordt u doorverwezen naar de overzichtspagina. Kopieer de **Applicatie (client) ID**.\n10. Vanuit het linkermenu ga naar **Certificaten & geheimen**.\n - Klik onder **Client geheimen** op **Nieuwe client geheim**.\n - Geef een beschrijving, verloop, en klik **Toevoegen**.\n - Kopieer de **waarde** van de client secret (dit zal niet meer worden weergegeven).\n11. Ga naar **API permissies** in het linkermenu.\n - Klik **Een machtiging toevoegen**.\n - Selecteer **Microsoft Graph** → **Toegewezen machtigingen**.\n - Voeg de volgende toepassingsgebieden toe:\n\t - gebruiker. ead\n - Kanaal.Create \n - Channel.ReadBasic. tot\n\t - ChannelMessage.Send\n\t - Team.ReadBasic.All\n\t - Chat.ReadWrite\n\t - ChannelMessage. ead.All\n\t - User.ReadBasic.All\n\t - Presence.Read.All\n\t - Teamli. ead.Alle\n - openid\n - e-mail\n - profiel \n - offline_access\n - Klik **Rechten toevoegen**.\n12. Kopieer de **Client ID** en **Client Secret**.\n",
+ "\nIf you'd like to use your own custom Azure app instead of the default Activepieces app, follow the [Azure app creation guide](https://learn.microsoft.com/en-us/entra/identity-platform/quickstart-register-app#register-an-application),\n set the **Redirect URI** to {{redirectUrl}} and add the following **Microsoft Graph (Delegated) permissions** under **API permissions**:\n - User.Read\n\t- Channel.Create\n\t- Channel.ReadBasic.All\n\t- ChannelMessage.Send\n\t- Team.ReadBasic.All\n\t- Chat.ReadWrite\n\t- ChannelMessage.R": "\nAls u uw eigen aangepaste Azure app wilt gebruiken in plaats van de standaard Activepieces app, Volg de [Azure app creatie handleiding] (https://learn.microsoft.com/en-us/entra/identity-platform/quickstart-register-app#register-an-application),\n zet de **Redirect URI** naar {{redirectUrl}} en voeg de volgende **Microsoft Graph (Delegated) permissies** toe onder **API permissies**:\n - gebruiker. ead\n\t½ - Kanaal. reate\n\t×- Channel.ReadBasic.All\n\tØ - ChannelMessage.Send\n\t・- Team.ReadBasic.All\n\tØ - Chat.ReadWrite\n\tØ - ChannelMessage.Read.All\n\t--User. eadBasic.All\n\t+unnamed@@0 - Presence.Read.All\n\t## - TeamMember.Read.All\n\t## - openid\n\t## - e-mail\n\tconcerneert - profiel\n\t- offline_access",
"Create Channel": "Kanaal aanmaken",
"Send Channel Message": "Zend kanaal bericht",
"Send Chat Message": "Verstuur chatbericht",
diff --git a/packages/pieces/community/microsoft-teams/src/i18n/pt.json b/packages/pieces/community/microsoft-teams/src/i18n/pt.json
index 054eec7b3b9..0c2cb78932a 100644
--- a/packages/pieces/community/microsoft-teams/src/i18n/pt.json
+++ b/packages/pieces/community/microsoft-teams/src/i18n/pt.json
@@ -1,5 +1,5 @@
{
- "\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. Entre no [Microsoft Azure Portal](https://portal.azure.com/).\n. Na barra lateral esquerda, vá até **Microsoft Enfra ID**.\n. Sob **Gerenciar**, clique em **Aplicativos registrados**.\n4. Clique no botão **Novo registro**.\n5. Digite um **nome** para o seu aplicativo.\n6. Para **Tipos de conta suportados**, escolha:\n - **Contas em qualquer diretório organizacional (qualquer inquilino de ID da Microsoft Entra - Multitenant) e contas pessoais da Microsoft**\n - Ou selecione com base nos seus requisitos.\n7. Em **URI de redirecionamento**, selecione **Web** e adicione a URL fornecida.\n8. Clique em **Registrar**.\n9. Após o registro, você será redirecionado para a página de visão geral do aplicativo. Copie o **aplicativo (cliente) ID**.\n10. Do menu à esquerda, vá para **Certificados e segredos**.\n - Em **Segredos do Cliente**, clique em **Novo segredo do Cliente**.\n - Fornece uma descrição, define um vencimento e clique em **Adicionar**.\n - Copiar o **Valor** do segredo do cliente (isso não será exibido novamente).\n11. Vá para **permissões de API** no menu à esquerda.\n - Clique em **Adicionar uma permissão**.\n - Selecione **Microsoft Graph** → **Delegated permissions**.\n - Adicione os seguintes escopos:\n\t - Usuário. ead\n - Canal.Create \n - Channel.ReadBasic. ll\n\t - ChannelMessage.Send\n\t - Team.ReadBasic.All\n\t - Chat.ReadWrite\n\t - ChannelMessage. ead.All\n\t - User.ReadBasic.All\n\t - Presença.Read.All\n\t - Membro. ead.All\n - openid\n - email\n - perfil \n - offline_access\n - Clique em **Adicionar permissões**.\n12. Copie seu **ID do cliente** e **Segredo do cliente**.\n",
+ "\nIf you'd like to use your own custom Azure app instead of the default Activepieces app, follow the [Azure app creation guide](https://learn.microsoft.com/en-us/entra/identity-platform/quickstart-register-app#register-an-application),\n set the **Redirect URI** to {{redirectUrl}} and add the following **Microsoft Graph (Delegated) permissions** under **API permissions**:\n - User.Read\n\t- Channel.Create\n\t- Channel.ReadBasic.All\n\t- ChannelMessage.Send\n\t- Team.ReadBasic.All\n\t- Chat.ReadWrite\n\t- ChannelMessage.R": "\nIf you'd like to use your own custom Azure app instead of the default Activepieces app, follow the [Azure app creation guide](https://learn.microsoft.com/en-us/entra/identity-platform/quickstart-register-app#register-an-application),\n set the **Redirect URI** to {{redirectUrl}} and add the following **Microsoft Graph (Delegated) permissions** under **API permissions**:\n - User.Read\n\t- Channel.Create\n\t- Channel.ReadBasic.All\n\t- ChannelMessage.Send\n\t- Team.ReadBasic.All\n\t- Chat.ReadWrite\n\t- ChannelMessage.Read.All\n\t- User.ReadBasic.All\n\t- Presence.Read.All\n\t- TeamMember.Read.All\n\t- openid\n\t- email\n\t- profile\n\t- offline_access",
"Create Channel": "Criar Canal",
"Send Channel Message": "Enviar Mensagem de Canal",
"Send Chat Message": "Enviar Mensagem de Chat",
diff --git a/packages/pieces/community/microsoft-teams/src/i18n/zh.json b/packages/pieces/community/microsoft-teams/src/i18n/zh.json
index f0e5e930e90..a6e807680bd 100644
--- a/packages/pieces/community/microsoft-teams/src/i18n/zh.json
+++ b/packages/pieces/community/microsoft-teams/src/i18n/zh.json
@@ -1,5 +1,5 @@
{
- "\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** → **Delegated permissions**.\n - Add the following scopes:\n\t - User.Read\n - Channel.Create\n\t - Channel.ReadBasic.All\n\t - ChannelMessage.Send\n\t - Team.ReadBasic.All\n\t - Chat.ReadWrite\n\t - ChannelMessage.Read.All\n\t - User.ReadBasic.All\n\t - Presence.Read.All\n\t - TeamMember.Read.All\n - openid\n - email\n - profile\n\t - offline_access\n - Click **Add permissions**.\n12. Copy your **Client ID** and **Client Secret**.\n",
+ "\nIf you'd like to use your own custom Azure app instead of the default Activepieces app, follow the [Azure app creation guide](https://learn.microsoft.com/en-us/entra/identity-platform/quickstart-register-app#register-an-application),\n set the **Redirect URI** to {{redirectUrl}} and add the following **Microsoft Graph (Delegated) permissions** under **API permissions**:\n - User.Read\n\t- Channel.Create\n\t- Channel.ReadBasic.All\n\t- ChannelMessage.Send\n\t- Team.ReadBasic.All\n\t- Chat.ReadWrite\n\t- ChannelMessage.R": "\nIf you'd like to use your own custom Azure app instead of the default Activepieces app, follow the [Azure app creation guide](https://learn.microsoft.com/en-us/entra/identity-platform/quickstart-register-app#register-an-application),\n set the **Redirect URI** to {{redirectUrl}} and add the following **Microsoft Graph (Delegated) permissions** under **API permissions**:\n - User.Read\n\t- Channel.Create\n\t- Channel.ReadBasic.All\n\t- ChannelMessage.Send\n\t- Team.ReadBasic.All\n\t- Chat.ReadWrite\n\t- ChannelMessage.Read.All\n\t- User.ReadBasic.All\n\t- Presence.Read.All\n\t- TeamMember.Read.All\n\t- openid\n\t- email\n\t- profile\n\t- offline_access",
"Create Channel": "Create Channel",
"Send Channel Message": "Send Channel Message",
"Send Chat Message": "Send Chat Message",
diff --git a/packages/pieces/community/microsoft-todo/package.json b/packages/pieces/community/microsoft-todo/package.json
index c9bf62658c5..5a5333e3c93 100644
--- a/packages/pieces/community/microsoft-todo/package.json
+++ b/packages/pieces/community/microsoft-todo/package.json
@@ -1,6 +1,6 @@
{
"name": "@activepieces/piece-microsoft-todo",
- "version": "0.2.9",
+ "version": "0.2.10",
"main": "./dist/src/index.js",
"types": "./dist/src/index.d.ts",
"dependencies": {
diff --git a/packages/pieces/community/microsoft-todo/src/i18n/de.json b/packages/pieces/community/microsoft-todo/src/i18n/de.json
index d57850d448a..51b1cff3285 100644
--- a/packages/pieces/community/microsoft-todo/src/i18n/de.json
+++ b/packages/pieces/community/microsoft-todo/src/i18n/de.json
@@ -1,6 +1,6 @@
{
"Cloud based task management application.": "Cloud-basierte Task-Management-Anwendung.",
- "\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 **Umleitungs-URI** wählen Sie **Web** und fügen Sie die angegebene URL hinzu.\n8. Klicken Sie auf **Registrieren**.\n9. Nach der Registrierung werden Sie zur Übersichtsseite der App weitergeleitet. Kopieren Sie die **Anwendungs-(Client)-ID**.\n10. Gehen Sie aus dem linken Menü zu **Zertifikate & Geheimnis**.\n - Unter **Kundengeheimnis**, klicken Sie **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 auf **Berechtigung hinzufügen**.\n - Wähle **Microsoft Graph** → **Delegierte Berechtigungen**.\n - Fügen Sie folgende Bereiche hinzu:\n - Benutzer. ead\n - Aufgaben. eadWrite \n - offline_access\n - Klicken Sie auf **Berechtigungen hinzufügen**.\n12. Kopieren Sie Ihre **Client-ID** und **Client-Geheimnis**.\n",
+ "\nIf you’d like to use your own custom Azure app instead of the default Activepieces app, follow the [Azure app creation guide](https://learn.microsoft.com/en-us/entra/identity-platform/quickstart-register-app#register-an-application),\n set the **Redirect URI** to {{redirectUrl}} and add the following **Microsoft Graph (Delegated) permissions** under **API permissions**:\n - User.Read\n - Tasks.ReadWrite\n - offline_access\n": "\nWenn du deine eigene eigene Azure App anstelle der Standard Activepieces App verwenden möchtest, folge der [Azure App Erstellungsanleitung](https://learn.microsoft.com/en-us/entra/identity-platform/quickstart-register-app#register-an-application),\n setzte die **Umleitungs-URI** auf {{redirectUrl}} und füge folgende **Microsoft Graph (Delegiert) Berechtigungen** unter **API Berechtigungen**:\n - Benutzer hinzu. ead\n - Aufgaben.ReadWrite\n - offline_access\n",
"Create Task": "Aufgabe erstellen",
"Create Task List": "Aufgabenliste erstellen",
"Update Task": "Aufgabe aktualisieren",
diff --git a/packages/pieces/community/microsoft-todo/src/i18n/es.json b/packages/pieces/community/microsoft-todo/src/i18n/es.json
index a4480d5a56a..5b6d1f4c191 100644
--- a/packages/pieces/community/microsoft-todo/src/i18n/es.json
+++ b/packages/pieces/community/microsoft-todo/src/i18n/es.json
@@ -1,6 +1,6 @@
{
"Cloud based task management application.": "Aplicación de administración de tareas basada en la nube.",
- "\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** → **Delegated permissions**.\n - Add the following scopes:\n - User.Read\n - Tasks.ReadWrite\n - offline_access\n - Click **Add permissions**.\n12. Copy your **Client ID** and **Client Secret**.\n",
+ "\nIf you’d like to use your own custom Azure app instead of the default Activepieces app, follow the [Azure app creation guide](https://learn.microsoft.com/en-us/entra/identity-platform/quickstart-register-app#register-an-application),\n set the **Redirect URI** to {{redirectUrl}} and add the following **Microsoft Graph (Delegated) permissions** under **API permissions**:\n - User.Read\n - Tasks.ReadWrite\n - offline_access\n": "\nIf you’d like to use your own custom Azure app instead of the default Activepieces app, follow the [Azure app creation guide](https://learn.microsoft.com/en-us/entra/identity-platform/quickstart-register-app#register-an-application),\n set the **Redirect URI** to {{redirectUrl}} and add the following **Microsoft Graph (Delegated) permissions** under **API permissions**:\n - User.Read\n - Tasks.ReadWrite\n - offline_access\n",
"Create Task": "Crear tarea",
"Create Task List": "Crear lista de tareas",
"Update Task": "Actualizar tarea",
diff --git a/packages/pieces/community/microsoft-todo/src/i18n/fr.json b/packages/pieces/community/microsoft-todo/src/i18n/fr.json
index 32d67057b2a..7a967d3da71 100644
--- a/packages/pieces/community/microsoft-todo/src/i18n/fr.json
+++ b/packages/pieces/community/microsoft-todo/src/i18n/fr.json
@@ -1,6 +1,6 @@
{
"Cloud based task management application.": "Application de gestion des tâches basée sur le Cloud.",
- "\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** → **Delegated permissions**.\n - Add the following scopes:\n - User.Read\n - Tasks.ReadWrite\n - offline_access\n - Click **Add permissions**.\n12. Copy your **Client ID** and **Client Secret**.\n",
+ "\nIf you’d like to use your own custom Azure app instead of the default Activepieces app, follow the [Azure app creation guide](https://learn.microsoft.com/en-us/entra/identity-platform/quickstart-register-app#register-an-application),\n set the **Redirect URI** to {{redirectUrl}} and add the following **Microsoft Graph (Delegated) permissions** under **API permissions**:\n - User.Read\n - Tasks.ReadWrite\n - offline_access\n": "\nIf you’d like to use your own custom Azure app instead of the default Activepieces app, follow the [Azure app creation guide](https://learn.microsoft.com/en-us/entra/identity-platform/quickstart-register-app#register-an-application),\n set the **Redirect URI** to {{redirectUrl}} and add the following **Microsoft Graph (Delegated) permissions** under **API permissions**:\n - User.Read\n - Tasks.ReadWrite\n - offline_access\n",
"Create Task": "Créer une tâche",
"Create Task List": "Créer une liste de tâches",
"Update Task": "Tâche de mise à jour",
diff --git a/packages/pieces/community/microsoft-todo/src/i18n/ja.json b/packages/pieces/community/microsoft-todo/src/i18n/ja.json
index c36d8e1ce19..18beab02fca 100644
--- a/packages/pieces/community/microsoft-todo/src/i18n/ja.json
+++ b/packages/pieces/community/microsoft-todo/src/i18n/ja.json
@@ -1,6 +1,6 @@
{
"Cloud based task management application.": "クラウドベースのタスク管理アプリケーション。",
- "\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** → **Delegated permissions**.\n - Add the following scopes:\n - User.Read\n - Tasks.ReadWrite\n - offline_access\n - Click **Add permissions**.\n12. Copy your **Client ID** and **Client Secret**.\n",
+ "\nIf you’d like to use your own custom Azure app instead of the default Activepieces app, follow the [Azure app creation guide](https://learn.microsoft.com/en-us/entra/identity-platform/quickstart-register-app#register-an-application),\n set the **Redirect URI** to {{redirectUrl}} and add the following **Microsoft Graph (Delegated) permissions** under **API permissions**:\n - User.Read\n - Tasks.ReadWrite\n - offline_access\n": "\nIf you’d like to use your own custom Azure app instead of the default Activepieces app, follow the [Azure app creation guide](https://learn.microsoft.com/en-us/entra/identity-platform/quickstart-register-app#register-an-application),\n set the **Redirect URI** to {{redirectUrl}} and add the following **Microsoft Graph (Delegated) permissions** under **API permissions**:\n - User.Read\n - Tasks.ReadWrite\n - offline_access\n",
"Create Task": "タスクを作成",
"Create Task List": "タスクリストを作成",
"Update Task": "タスクの更新",
diff --git a/packages/pieces/community/microsoft-todo/src/i18n/nl.json b/packages/pieces/community/microsoft-todo/src/i18n/nl.json
index 92b6f655e1b..3b399ab0b2e 100644
--- a/packages/pieces/community/microsoft-todo/src/i18n/nl.json
+++ b/packages/pieces/community/microsoft-todo/src/i18n/nl.json
@@ -1,6 +1,6 @@
{
"Cloud based task management application.": "Cloud gebaseerde taak beheer toepassing.",
- "\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. Log in bij [Microsoft Azure Portal](https://portal.azure.com/).\n. Ga naar **Microsoft Enfra ID**.\n3. Onder **Beheren**, klik op **App registraties**.\n4. Klik op de **Nieuwe registratie** knop.\n5. Voer een **Naam** in voor uw app.\n6. Voor **Ondersteunde accounttypen**, kies keuze:\n - **Accounts in elke map van de organisatie (Any Microsoft Entra ID-tenant - Multitenant) en persoonlijke Microsoft accounts**\n - Of selecteer gebaseerd op uw vereiste.\n7. In **Redirect URI**, selecteer **Web** en voeg de opgegeven URL toe.\n8. Klik **Register**.\n9. Na registratie wordt u doorverwezen naar de overzichtspagina. Kopieer de **Applicatie (client) ID**.\n10. Vanuit het linkermenu ga naar **Certificaten & geheimen**.\n - Onder **Client secrets**, klik op **Nieuwe client geheim**.\n - Geef een beschrijving, verloop, en klik **Toevoegen**.\n - Kopieer de **waarde** van de client secret (dit zal niet meer worden weergegeven).\n11. Ga naar **API permissies** in het linkermenu.\n - Klik **Een machtiging toevoegen**.\n - Selecteer **Microsoft Graph** → **Toegewezen machtigingen**.\n - Voeg de volgende toepassingsgebieden toe:\n - gebruiker. ead\n - Taken. eadWrite \n - offline_access\n - Klik **Permissies toevoegen**.\n12. Kopieer de **Client ID** en **Client Secret**.\n",
+ "\nIf you’d like to use your own custom Azure app instead of the default Activepieces app, follow the [Azure app creation guide](https://learn.microsoft.com/en-us/entra/identity-platform/quickstart-register-app#register-an-application),\n set the **Redirect URI** to {{redirectUrl}} and add the following **Microsoft Graph (Delegated) permissions** under **API permissions**:\n - User.Read\n - Tasks.ReadWrite\n - offline_access\n": "\nAls u uw eigen aangepaste Azure app wilt gebruiken in plaats van de standaard Activepieces app, Volg de [Azure app creatie handleiding] (https://learn.microsoft.com/en-us/entra/identity-platform/quickstart-register-app#register-an-application),\n zet de **Redirect URI** naar {{redirectUrl}} en voeg de volgende **Microsoft Graph (Delegated) permissies** toe onder **API permissies**:\n - gebruiker. ead\n - Taken.ReadWrite\n - offline_access\n",
"Create Task": "Taak maken",
"Create Task List": "Takenlijst maken",
"Update Task": "Taak bijwerken",
diff --git a/packages/pieces/community/microsoft-todo/src/i18n/pt.json b/packages/pieces/community/microsoft-todo/src/i18n/pt.json
index fb7b76eea56..43ce7bb84d3 100644
--- a/packages/pieces/community/microsoft-todo/src/i18n/pt.json
+++ b/packages/pieces/community/microsoft-todo/src/i18n/pt.json
@@ -1,6 +1,6 @@
{
"Cloud based task management application.": "Gerenciamento de tarefas baseado em nuvem.",
- "\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. Entre no [Microsoft Azure Portal](https://portal.azure.com/).\n. Na barra lateral esquerda, vá até **Microsoft Enfra ID**.\n3. Sob **Gerenciar**, clique em **Aplicativos registrados**.\n4. Clique no botão **Novo registro**.\n5. Digite um **Nome** para o seu aplicativo.\n6. Para **Tipos de conta suportados**, escolha:\n - **Contas em qualquer diretório organizacional (qualquer inquilino de ID da Microsoft Entra - Multitenant) e contas pessoais da Microsoft**\n - Ou selecione com base nos seus requisitos.\n7. Em **URI de redirecionamento**, selecione **Web** e adicione a URL fornecida.\n8. Clique em **Registrar**.\n9. Após o registro, você será redirecionado para a página de visão geral do aplicativo. Copie o **ID do aplicativo (cliente) **.\n10. No menu da esquerda, vá para **Certificados e segredos**.\n - Em **Segredos do cliente**, clique em **Novo segredo do cliente**.\n - Fornece uma descrição, define um vencimento e clique em **Adicionar**.\n - Copiar o **Valor** do segredo do cliente (isso não será exibido novamente).\n11. Vá para **permissões de API** no menu à esquerda.\n - Clique em **Adicionar uma permissão**.\n - Selecione **Microsoft Graph** → **Delegated permissions**.\n - Adicione os seguintes escopos:\n - Usuário. assim\n - Tarefas. eadWrite \n - offline_access\n - Clique em **Adicionar permissões**.\n12. Copie seu **ID do Cliente** e **Segredo do Cliente**.\n",
+ "\nIf you’d like to use your own custom Azure app instead of the default Activepieces app, follow the [Azure app creation guide](https://learn.microsoft.com/en-us/entra/identity-platform/quickstart-register-app#register-an-application),\n set the **Redirect URI** to {{redirectUrl}} and add the following **Microsoft Graph (Delegated) permissions** under **API permissions**:\n - User.Read\n - Tasks.ReadWrite\n - offline_access\n": "\nIf you’d like to use your own custom Azure app instead of the default Activepieces app, follow the [Azure app creation guide](https://learn.microsoft.com/en-us/entra/identity-platform/quickstart-register-app#register-an-application),\n set the **Redirect URI** to {{redirectUrl}} and add the following **Microsoft Graph (Delegated) permissions** under **API permissions**:\n - User.Read\n - Tasks.ReadWrite\n - offline_access\n",
"Create Task": "Criar tarefa",
"Create Task List": "Criar Lista de Tarefas",
"Update Task": "Atualizar Tarefa",
diff --git a/packages/pieces/community/microsoft-todo/src/i18n/zh.json b/packages/pieces/community/microsoft-todo/src/i18n/zh.json
index 6a4f6e9e8b4..3e3133ad5d8 100644
--- a/packages/pieces/community/microsoft-todo/src/i18n/zh.json
+++ b/packages/pieces/community/microsoft-todo/src/i18n/zh.json
@@ -1,6 +1,6 @@
{
"Cloud based task management application.": "Cloud based task management application.",
- "\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** → **Delegated permissions**.\n - Add the following scopes:\n - User.Read\n - Tasks.ReadWrite\n - offline_access\n - Click **Add permissions**.\n12. Copy your **Client ID** and **Client Secret**.\n",
+ "\nIf you’d like to use your own custom Azure app instead of the default Activepieces app, follow the [Azure app creation guide](https://learn.microsoft.com/en-us/entra/identity-platform/quickstart-register-app#register-an-application),\n set the **Redirect URI** to {{redirectUrl}} and add the following **Microsoft Graph (Delegated) permissions** under **API permissions**:\n - User.Read\n - Tasks.ReadWrite\n - offline_access\n": "\nIf you’d like to use your own custom Azure app instead of the default Activepieces app, follow the [Azure app creation guide](https://learn.microsoft.com/en-us/entra/identity-platform/quickstart-register-app#register-an-application),\n set the **Redirect URI** to {{redirectUrl}} and add the following **Microsoft Graph (Delegated) permissions** under **API permissions**:\n - User.Read\n - Tasks.ReadWrite\n - offline_access\n",
"Create Task": "Create Task",
"Create Task List": "Create Task List",
"Update Task": "Update Task",
diff --git a/packages/pieces/community/mycase-piece/package.json b/packages/pieces/community/mycase-piece/package.json
index fa9d42dff0f..131a5fd8541 100644
--- a/packages/pieces/community/mycase-piece/package.json
+++ b/packages/pieces/community/mycase-piece/package.json
@@ -1,6 +1,6 @@
{
"name": "@activepieces/piece-mycase-piece",
- "version": "0.1.3",
+ "version": "0.1.4",
"type": "commonjs",
"main": "./dist/src/index.js",
"types": "./dist/src/index.d.ts",
diff --git a/packages/pieces/community/mycase-piece/src/i18n/de.json b/packages/pieces/community/mycase-piece/src/i18n/de.json
index dc43fb540a6..4c38729100b 100644
--- a/packages/pieces/community/mycase-piece/src/i18n/de.json
+++ b/packages/pieces/community/mycase-piece/src/i18n/de.json
@@ -1,6 +1,6 @@
{
"Automate legal case management workflows with MyCase. Create and manage cases, clients, companies, events, tasks, time entries, documents, and more. Get notified when cases, events, people, companies, or leads are added or updated.": "Automatisieren Sie Rechtsfallmanagementworkflows mit MyCase. Erstellen und verwalten Sie Fälle, Kunden, Firmen, Events, Aufgaben, Zeiteinträge, Dokumente und vieles mehr. Erhalten Sie Benachrichtigungen, wenn Ereignisse, Personen, Unternehmen oder Leads hinzugefügt oder aktualisiert werden.",
- "\n## MyCase OAuth 2.0 Setup\n\n### Obtaining Client Credentials\n1. Contact MyCase support at [https://www.mycase.com/support/](https://www.mycase.com/support/) to request OAuth 2.0 client credentials\n2. Provide your application details and request a client ID and client secret\n3. MyCase support will provide you with:\n - **Client ID**: Your OAuth Client ID\n - **Client Secret**: Your OAuth Client secret\n - **Redirect URI**: A pre-configured redirect URI for your application\n\n### Required Permissions\nThe au": "\n## MyCase OAuth 2.0 Setup\n\n### Client-Zugangsdaten\n. Kontaktieren Sie MyCase Support unter [https://www.mycase.com/support/](https://www.mycase. om/support/), um OAuth 2.0 Client-Zugangsdaten\n2. Geben Sie Ihre Anwendungsdaten an und fordern Sie eine Client-ID und Client-Geheimnis\n3 an. MyCase unterstützt Sie mit:\n - **Client ID**: Ihre OAuth Client ID\n - **Client Secret**: Ihr OAuth Client Secret\n - **Umleitungs-URI**: Eine vorkonfigurierte Umleitungs-URI für Ihre Anwendung\n\n### Benötigte Berechtigungen\nDer autorisierende Benutzer muss die **\"Einstellungen Ihres Unternehmens verwalten, Rechnungs- und Zahlungsoptionen** Berechtigung auf **Ja** in MyCase.\n\n### Autorisierungsfluss\nMyCase verwendet OAuth 2.0 Autorisierungscode Grant Flow mit folgenden Endpunkten:\n\n**Autorisierungs-URL**: `https://auth. ycase.com/login_sessions/new` \n**Token URL**: `https://auth.mycase. om/tokens`\n\n### Bewertungslimit\n- 25 Anfragen pro Sekunde pro Client\n- Zugangs-Token sind gültig für 24 Stunden\n- Aktualisiere Tokens für 2 Wochen\n\nfür detaillierte API-Dokumentation, besuchen: [https://mycaseapi.stoplight.io/docs/mycase-api-documentation/k5xpc4jyhkom7-getting-started](https://mycaseapi. toplight.io/docs/mycase-api-documentation/k5xpc4yhkom7-getting-started) \n",
+ "\n## MyCase OAuth 2.0 Setup\n\n### Obtaining Client Credentials\n1. Contact MyCase support at [https://www.mycase.com/support/](https://www.mycase.com/support/) to request OAuth 2.0 client credentials\n2. Provide your application details and request a client ID and client secret\n3. MyCase support will provide you with:\n - **Client ID**: Your OAuth Client ID\n - **Client Secret**: Your OAuth Client secret\n - **Redirect URI**: A pre-configured redirect URI for your application\n\n### Required Permissions\nThe au": "\n## MyCase OAuth 2.0 Setup\n\n### Client-Zugangsdaten\n. Kontaktieren Sie MyCase Support unter [https://www.mycase.com/support/](https://www.mycase. om/support/), um OAuth 2.0 Client-Zugangsdaten\n2. Geben Sie Ihre Anwendungsdaten an und fordern Sie eine Client-ID und Client-Geheimnis\n3 an. MyCase unterstützt Sie mit:\n - **Client ID**: Ihre OAuth Client ID\n - **Client Secret**: Ihr OAuth Client Secret\n - **Umleitungs-URI**: Eine vorkonfigurierte Umleitungs-URI für Ihre Anwendung\n\n### Benötigte Berechtigungen\nDer autorisierende Benutzer muss die **\"Einstellungen Ihres Unternehmens verwalten, Rechnungs- und Zahlungsoptionen** Berechtigung auf **Ja** in MyCase.\n\n### Autorisierungsfluss\nMyCase verwendet OAuth 2.0 Autorisierungscode Grant Flow mit folgenden Endpunkten:\n\n**Autorisierungs-URL**: `https://auth.mycase.com/login_sessions/new`\n**Token URL**: `https://auth.mycase. om/tokens`\n\n### Bewertungslimit\n- 25 Anfragen pro Sekunde pro Client\n- Zugangs-Token sind gültig für 24 Stunden\n- Aktualisiere Tokens für 2 Wochen\n\nfür detaillierte API-Dokumentation, besuchen: [https://mycaseapi.stoplight.io/docs/mycase-api-documentation/k5xpc4jyhkom7-getting-started](https://mycaseapi. toplight.io/docs/mycase-api-documentation/k5xpc4yhkom7-getting-started) \n",
"Create Case": "Fall erstellen",
"Create Case Stage": "Fallstufe erstellen",
"Create Company": "Firma erstellen",
diff --git a/packages/pieces/community/mycase-piece/src/i18n/es.json b/packages/pieces/community/mycase-piece/src/i18n/es.json
index ded0c6e83c6..3750f6ba1a9 100644
--- a/packages/pieces/community/mycase-piece/src/i18n/es.json
+++ b/packages/pieces/community/mycase-piece/src/i18n/es.json
@@ -1,6 +1,6 @@
{
"Automate legal case management workflows with MyCase. Create and manage cases, clients, companies, events, tasks, time entries, documents, and more. Get notified when cases, events, people, companies, or leads are added or updated.": "Automatiza los flujos de trabajo de administración de casos legales con MyCase. Crea y gestiona casos, clientes, empresas, eventos, tareas, entradas de tiempo, documentos y más. Recibe notificaciones cuando se añadan o actualizan casos, eventos, personas, empresas o clientes potenciales.",
- "\n## MyCase OAuth 2.0 Setup\n\n### Obtaining Client Credentials\n1. Contact MyCase support at [https://www.mycase.com/support/](https://www.mycase.com/support/) to request OAuth 2.0 client credentials\n2. Provide your application details and request a client ID and client secret\n3. MyCase support will provide you with:\n - **Client ID**: Your OAuth Client ID\n - **Client Secret**: Your OAuth Client secret\n - **Redirect URI**: A pre-configured redirect URI for your application\n\n### Required Permissions\nThe au": "\n## Configuración de MyCase OAuth 2.0\n\n### Obtener credenciales de cliente\n. Póngase en contacto con soporte de MyCase en [https://www.mycase.com/support/](https://www.mycase. om/support/) para solicitar credenciales de cliente de OAuth 2.0\n2. Proporcione los datos de su aplicación y solicite un ID de cliente y un secreto de cliente\n3. El soporte de MyCase te proporcionará con:\n - **ID de cliente**: Tu ID de cliente OAuth\n - **Código del cliente**: tu secreto de cliente OAuth\n - **URI**: Una URI de redirección preconfigurada para tu aplicación\n\n### Permisos requeridos\nEl usuario autorizador debe tener el **\"Administrar las preferencias de tu empresa, permiso de facturación y opciones de pago\"** establecido a **Sí** en MyCase.\n\n### Flujo de Autorización\nMyCase utiliza el flujo de concesión de código de autorización OAuth 2.0 con los siguientes puntos finales:\n\n**URL de Autorización**: `https://auth. ycase.com/login_sessions/new` \n**URL de ficha**: `https://auth.mycase. om/tokens`\n\n### Límites de frecuencia\n- 25 solicitudes por segundo por cliente\n- Los tokens de acceso son válidos por 24 horas\n- Los tokens de actualización son válidos por 2 semanas\n\nPara documentación detallada de la API, visita: [https://mycaseapi.stoplight.io/docs/mycase-api-documentation/k5xpc4jyhkom7-getting-started](https://mycaseapi. toplight.io/docs/mycase-api-documentation/k5xpc4jyhkom7-getting-started) \n",
+ "\n## MyCase OAuth 2.0 Setup\n\n### Obtaining Client Credentials\n1. Contact MyCase support at [https://www.mycase.com/support/](https://www.mycase.com/support/) to request OAuth 2.0 client credentials\n2. Provide your application details and request a client ID and client secret\n3. MyCase support will provide you with:\n - **Client ID**: Your OAuth Client ID\n - **Client Secret**: Your OAuth Client secret\n - **Redirect URI**: A pre-configured redirect URI for your application\n\n### Required Permissions\nThe au": "\n## Configuración de MyCase OAuth 2.0\n\n### Obtener credenciales de cliente\n. Póngase en contacto con soporte de MyCase en [https://www.mycase.com/support/](https://www.mycase. om/support/) para solicitar credenciales de cliente de OAuth 2.0\n2. Proporcione los datos de su aplicación y solicite un ID de cliente y un secreto de cliente\n3. El soporte de MyCase te proporcionará con:\n - **ID de cliente**: Tu ID de cliente OAuth\n - **Código del cliente**: tu secreto de cliente OAuth\n - **URI**: Una URI de redirección preconfigurada para tu aplicación\n\n### Permisos requeridos\nEl usuario autorizador debe tener el **\"Administrar las preferencias de tu empresa, permiso de facturación y opciones de pago\"** establecido a **Sí** en MyCase.\n\n### Flujo de Autorización\nMyCase utiliza el flujo de concesión de código de autorización de OAuth 2.0 con los siguientes puntos finales:\n\n**URL de Autorización**: `https://auth.mycase.com/login_sessions/new`\n**URL de Token **: `https://auth.mycase. om/tokens`\n\n### Límites de frecuencia\n- 25 solicitudes por segundo por cliente\n- Los tokens de acceso son válidos por 24 horas\n- Los tokens de actualización son válidos por 2 semanas\n\nPara documentación detallada de la API, visita: [https://mycaseapi.stoplight.io/docs/mycase-api-documentation/k5xpc4jyhkom7-getting-started](https://mycaseapi. toplight.io/docs/mycase-api-documentation/k5xpc4jyhkom7-getting-started) \n",
"Create Case": "Crear Caso",
"Create Case Stage": "Crear Fase de Caso",
"Create Company": "Crear empresa",
diff --git a/packages/pieces/community/mycase-piece/src/i18n/fr.json b/packages/pieces/community/mycase-piece/src/i18n/fr.json
index 7191514a000..2eea39773c2 100644
--- a/packages/pieces/community/mycase-piece/src/i18n/fr.json
+++ b/packages/pieces/community/mycase-piece/src/i18n/fr.json
@@ -1,6 +1,6 @@
{
"Automate legal case management workflows with MyCase. Create and manage cases, clients, companies, events, tasks, time entries, documents, and more. Get notified when cases, events, people, companies, or leads are added or updated.": "Automatisez les flux de travail de gestion de cas légaux avec MyCase. Créez et gérez des cas, des clients, des entreprises, des événements, des tâches, des entrées de temps, des documents, et plus encore. Soyez averti lorsque des cas, des événements, des personnes, des entreprises ou des prospects sont ajoutés ou mis à jour.",
- "\n## MyCase OAuth 2.0 Setup\n\n### Obtaining Client Credentials\n1. Contact MyCase support at [https://www.mycase.com/support/](https://www.mycase.com/support/) to request OAuth 2.0 client credentials\n2. Provide your application details and request a client ID and client secret\n3. MyCase support will provide you with:\n - **Client ID**: Your OAuth Client ID\n - **Client Secret**: Your OAuth Client secret\n - **Redirect URI**: A pre-configured redirect URI for your application\n\n### Required Permissions\nThe au": "\n## MyCase OAuth 2.0 Setup\n\n### Obtaining Client Credentials\n1. Contact MyCase support at [https://www.mycase.com/support/](https://www.mycase.com/support/) to request OAuth 2.0 client credentials\n2. Provide your application details and request a client ID and client secret\n3. MyCase support will provide you with:\n - **Client ID**: Your OAuth Client ID\n - **Client Secret**: Your OAuth Client secret\n - **Redirect URI**: A pre-configured redirect URI for your application\n\n### Required Permissions\nThe authorizing user must have the **\"Manage your firm's preferences, billing, and payment options\"** permission set to **Yes** in MyCase.\n\n### Authorization Flow\nMyCase uses OAuth 2.0 Authorization Code Grant flow with the following endpoints:\n\n**Authorization URL**: `https://auth.mycase.com/login_sessions/new` \n**Token URL**: `https://auth.mycase.com/tokens`\n\n### Rate Limits\n- 25 requests per second per client\n- Access tokens are valid for 24 hours\n- Refresh tokens are valid for 2 weeks\n\nFor detailed API documentation, visit: [https://mycaseapi.stoplight.io/docs/mycase-api-documentation/k5xpc4jyhkom7-getting-started](https://mycaseapi.stoplight.io/docs/mycase-api-documentation/k5xpc4jyhkom7-getting-started)\n",
+ "\n## MyCase OAuth 2.0 Setup\n\n### Obtaining Client Credentials\n1. Contact MyCase support at [https://www.mycase.com/support/](https://www.mycase.com/support/) to request OAuth 2.0 client credentials\n2. Provide your application details and request a client ID and client secret\n3. MyCase support will provide you with:\n - **Client ID**: Your OAuth Client ID\n - **Client Secret**: Your OAuth Client secret\n - **Redirect URI**: A pre-configured redirect URI for your application\n\n### Required Permissions\nThe au": "\n## MyCase OAuth 2.0 Setup\n\n### Obtaining Client Credentials\n1. Contact MyCase support at [https://www.mycase.com/support/](https://www.mycase.com/support/) to request OAuth 2.0 client credentials\n2. Provide your application details and request a client ID and client secret\n3. MyCase support will provide you with:\n - **Client ID**: Your OAuth Client ID\n - **Client Secret**: Your OAuth Client secret\n - **Redirect URI**: A pre-configured redirect URI for your application\n\n### Required Permissions\nThe authorizing user must have the **\"Manage your firm's preferences, billing, and payment options\"** permission set to **Yes** in MyCase.\n\n### Authorization Flow\nMyCase uses OAuth 2.0 Authorization Code Grant flow with the following endpoints:\n\n**Authorization URL**: `https://auth.mycase.com/login_sessions/new`\n**Token URL**: `https://auth.mycase.com/tokens`\n\n### Rate Limits\n- 25 requests per second per client\n- Access tokens are valid for 24 hours\n- Refresh tokens are valid for 2 weeks\n\nFor detailed API documentation, visit: [https://mycaseapi.stoplight.io/docs/mycase-api-documentation/k5xpc4jyhkom7-getting-started](https://mycaseapi.stoplight.io/docs/mycase-api-documentation/k5xpc4jyhkom7-getting-started)\n",
"Create Case": "Créer un Cas",
"Create Case Stage": "Créer une phase de Cas",
"Create Company": "Créer une entreprise",
diff --git a/packages/pieces/community/mycase-piece/src/i18n/ja.json b/packages/pieces/community/mycase-piece/src/i18n/ja.json
index f917a77361d..d629e40f297 100644
--- a/packages/pieces/community/mycase-piece/src/i18n/ja.json
+++ b/packages/pieces/community/mycase-piece/src/i18n/ja.json
@@ -1,6 +1,6 @@
{
"Automate legal case management workflows with MyCase. Create and manage cases, clients, companies, events, tasks, time entries, documents, and more. Get notified when cases, events, people, companies, or leads are added or updated.": "MyCaseを使用して、ケース管理ワークフローを自動化します。ケース、クライアント、企業、イベント、タスク、タイムエントリ、ドキュメントなどを作成および管理します。 案件、イベント、人、企業、またはリードが追加または更新されたときに通知を受け取ります。",
- "\n## MyCase OAuth 2.0 Setup\n\n### Obtaining Client Credentials\n1. Contact MyCase support at [https://www.mycase.com/support/](https://www.mycase.com/support/) to request OAuth 2.0 client credentials\n2. Provide your application details and request a client ID and client secret\n3. MyCase support will provide you with:\n - **Client ID**: Your OAuth Client ID\n - **Client Secret**: Your OAuth Client secret\n - **Redirect URI**: A pre-configured redirect URI for your application\n\n### Required Permissions\nThe au": "\n## MyCase OAuth 2.0 Setup\n\n### Obtaining Client Credentials\n1. Contact MyCase support at [https://www.mycase.com/support/](https://www.mycase.com/support/) to request OAuth 2.0 client credentials\n2. Provide your application details and request a client ID and client secret\n3. MyCase support will provide you with:\n - **Client ID**: Your OAuth Client ID\n - **Client Secret**: Your OAuth Client secret\n - **Redirect URI**: A pre-configured redirect URI for your application\n\n### Required Permissions\nThe authorizing user must have the **\"Manage your firm's preferences, billing, and payment options\"** permission set to **Yes** in MyCase.\n\n### Authorization Flow\nMyCase uses OAuth 2.0 Authorization Code Grant flow with the following endpoints:\n\n**Authorization URL**: `https://auth.mycase.com/login_sessions/new` \n**Token URL**: `https://auth.mycase.com/tokens`\n\n### Rate Limits\n- 25 requests per second per client\n- Access tokens are valid for 24 hours\n- Refresh tokens are valid for 2 weeks\n\nFor detailed API documentation, visit: [https://mycaseapi.stoplight.io/docs/mycase-api-documentation/k5xpc4jyhkom7-getting-started](https://mycaseapi.stoplight.io/docs/mycase-api-documentation/k5xpc4jyhkom7-getting-started)\n",
+ "\n## MyCase OAuth 2.0 Setup\n\n### Obtaining Client Credentials\n1. Contact MyCase support at [https://www.mycase.com/support/](https://www.mycase.com/support/) to request OAuth 2.0 client credentials\n2. Provide your application details and request a client ID and client secret\n3. MyCase support will provide you with:\n - **Client ID**: Your OAuth Client ID\n - **Client Secret**: Your OAuth Client secret\n - **Redirect URI**: A pre-configured redirect URI for your application\n\n### Required Permissions\nThe au": "\n## MyCase OAuth 2.0 Setup\n\n### Obtaining Client Credentials\n1. Contact MyCase support at [https://www.mycase.com/support/](https://www.mycase.com/support/) to request OAuth 2.0 client credentials\n2. Provide your application details and request a client ID and client secret\n3. MyCase support will provide you with:\n - **Client ID**: Your OAuth Client ID\n - **Client Secret**: Your OAuth Client secret\n - **Redirect URI**: A pre-configured redirect URI for your application\n\n### Required Permissions\nThe authorizing user must have the **\"Manage your firm's preferences, billing, and payment options\"** permission set to **Yes** in MyCase.\n\n### Authorization Flow\nMyCase uses OAuth 2.0 Authorization Code Grant flow with the following endpoints:\n\n**Authorization URL**: `https://auth.mycase.com/login_sessions/new`\n**Token URL**: `https://auth.mycase.com/tokens`\n\n### Rate Limits\n- 25 requests per second per client\n- Access tokens are valid for 24 hours\n- Refresh tokens are valid for 2 weeks\n\nFor detailed API documentation, visit: [https://mycaseapi.stoplight.io/docs/mycase-api-documentation/k5xpc4jyhkom7-getting-started](https://mycaseapi.stoplight.io/docs/mycase-api-documentation/k5xpc4jyhkom7-getting-started)\n",
"Create Case": "案件を作成",
"Create Case Stage": "症例ステージを作成",
"Create Company": "所属を作成",
diff --git a/packages/pieces/community/mycase-piece/src/i18n/nl.json b/packages/pieces/community/mycase-piece/src/i18n/nl.json
index 795acff9f6e..f8c8dbd22ad 100644
--- a/packages/pieces/community/mycase-piece/src/i18n/nl.json
+++ b/packages/pieces/community/mycase-piece/src/i18n/nl.json
@@ -1,6 +1,6 @@
{
"Automate legal case management workflows with MyCase. Create and manage cases, clients, companies, events, tasks, time entries, documents, and more. Get notified when cases, events, people, companies, or leads are added or updated.": "Automatiseren van juridische case management workflows met MyCase. Maak en beheer cases, klanten, bedrijven, gebeurtenissen, taken, tijd ingangen en documenten en meer. Krijg een melding wanneer cases, personen, bedrijven of leads worden toegevoegd of bijgewerkt.",
- "\n## MyCase OAuth 2.0 Setup\n\n### Obtaining Client Credentials\n1. Contact MyCase support at [https://www.mycase.com/support/](https://www.mycase.com/support/) to request OAuth 2.0 client credentials\n2. Provide your application details and request a client ID and client secret\n3. MyCase support will provide you with:\n - **Client ID**: Your OAuth Client ID\n - **Client Secret**: Your OAuth Client secret\n - **Redirect URI**: A pre-configured redirect URI for your application\n\n### Required Permissions\nThe au": "\n## MyCase OAuth 2.0 Setup\n\n### Client Credentials\n. Neem contact op met MyCase ondersteuning bij [https://www.mycase.com/support/](https://www.mycase. om/support/) om OAuth 2.0 clientreferenties\n2. Geef uw applicatiegegevens en vraag een client-ID en clientgeheim\n3. MyCase ondersteuning biedt u aan:\n - **Client-ID**: Uw OAuth Client-ID\n - **Clientgeheim**: Your OAuth Client secret\n - **Redirect URI**: Een vooraf geconfigureerde omleidings-URI voor uw applicatie\n\n### Vereiste rechten\nDe gebruiker moet de **\"Beheer de voorkeuren van uw bedrijf, facturering en betalingsopties\"** permissie ingesteld op **Ja** in MyCase.\n\n### Authorization Flow\nMyCase maakt gebruik van OAuth 2.0 Authorization Code Grant flow met de volgende eindpunten:\n\n**Authorization URL**: `https://auth. ycase.com/login_sessions/new` \n**Token URL**: `https://auth.mycase. om/tokens`\n\n### Rate Limites\n- 25 aanvragen per seconde per client\n- Toegangstokens zijn 24 uur geldig\n- Vernieuwen tokens zijn 2 weken geldig\n\nVoor gedetailleerde API documentatie, bezoek: [https://mycaseapi.stoplight.io/docs/mycase-api-documentation/k5xpc4jyhkom7-getting-started](https://mycaseapi. toplight.io/docs/mycase-api-documentatie/k5xpc4jyhkom7-getting-started) \n",
+ "\n## MyCase OAuth 2.0 Setup\n\n### Obtaining Client Credentials\n1. Contact MyCase support at [https://www.mycase.com/support/](https://www.mycase.com/support/) to request OAuth 2.0 client credentials\n2. Provide your application details and request a client ID and client secret\n3. MyCase support will provide you with:\n - **Client ID**: Your OAuth Client ID\n - **Client Secret**: Your OAuth Client secret\n - **Redirect URI**: A pre-configured redirect URI for your application\n\n### Required Permissions\nThe au": "\n## MyCase OAuth 2.0 Setup\n\n### Client Credentials\n. Neem contact op met MyCase ondersteuning bij [https://www.mycase.com/support/](https://www.mycase. om/support/) om OAuth 2.0 clientreferenties\n2. Geef uw applicatiegegevens en vraag een client-ID en clientgeheim\n3. MyCase ondersteuning biedt u aan:\n - **Client-ID**: Uw OAuth Client-ID\n - **Clientgeheim**: Your OAuth Client secret\n - **Redirect URI**: Een vooraf geconfigureerde omleidings-URI voor uw applicatie\n\n### Vereiste rechten\nDe gebruiker moet de **\"Beheer de voorkeuren van uw bedrijf, facturering en betalingsopties\"** permissie ingesteld op **Ja** in MyCase.\n\n### Authorization Flow\nMyCase maakt gebruik van OAuth 2.0 Authorization Code Grant flow met de volgende eindpunten:\n\n**Authorization URL**: `https://auth.mycase.com/login_sessions/new`\n**Token URL**: `https://auth.mycase. om/tokens`\n\n### Rate Limites\n- 25 aanvragen per seconde per client\n- Toegangstokens zijn 24 uur geldig\n- Vernieuwen tokens zijn 2 weken geldig\n\nVoor gedetailleerde API documentatie, bezoek: [https://mycaseapi.stoplight.io/docs/mycase-api-documentation/k5xpc4jyhkom7-getting-started](https://mycaseapi. toplight.io/docs/mycase-api-documentatie/k5xpc4jyhkom7-getting-started) \n",
"Create Case": "Maak Geval",
"Create Case Stage": "Maak Geval Fase",
"Create Company": "Bedrijf aanmaken",
diff --git a/packages/pieces/community/mycase-piece/src/i18n/pt.json b/packages/pieces/community/mycase-piece/src/i18n/pt.json
index 15f078e99a4..5d2c142bc36 100644
--- a/packages/pieces/community/mycase-piece/src/i18n/pt.json
+++ b/packages/pieces/community/mycase-piece/src/i18n/pt.json
@@ -1,6 +1,6 @@
{
"Automate legal case management workflows with MyCase. Create and manage cases, clients, companies, events, tasks, time entries, documents, and more. Get notified when cases, events, people, companies, or leads are added or updated.": "Automatize os fluxos de trabalho de gerenciamento de casos legais com MyCase. Criar e gerenciar casos, clientes, empresas, eventos, tarefas, entradas de tempo, documentos e muito mais. Seja notificado quando casos, eventos, pessoas, empresas, ou leads forem adicionados ou atualizados.",
- "\n## MyCase OAuth 2.0 Setup\n\n### Obtaining Client Credentials\n1. Contact MyCase support at [https://www.mycase.com/support/](https://www.mycase.com/support/) to request OAuth 2.0 client credentials\n2. Provide your application details and request a client ID and client secret\n3. MyCase support will provide you with:\n - **Client ID**: Your OAuth Client ID\n - **Client Secret**: Your OAuth Client secret\n - **Redirect URI**: A pre-configured redirect URI for your application\n\n### Required Permissions\nThe au": "\n## Configuração do MyCase OAuth 2.0\n\n### Obtendo Credenciais do Cliente\n. Contate o suporte a MyCase em [https://www.mycase.com/support/](https://www.mycase. om/support/) para solicitar credenciais de cliente OAuth 2.0\n2. Forneça os detalhes do seu aplicativo e solicite um ID de cliente e cliente secreto\n3. O suporte a MeuCase fornecerá para você:\n - **ID do cliente**: Seu ID de Cliente OAuth\n - **Segredo do cliente**: Seu segredo de Cliente OAuth\n - **URI de redirecionamento pré-configurado para a sua aplicação\n\n### Permissões necessárias\nO usuário autorizador deve ter as **\"Gerenciar as preferências da sua empresa, faturamento, e opções de pagamento\"** permissão definida para **Sim** no MyCase.\n\n### Authorization Flow\nMyCase usa o fluxo de concessão de autorização OAuth 2.0 com os seguintes endpoints:\n\n**URL de autorização**: `https://auth. ycase.com/login_sessions/new` \n**Token URL**: `https://auth.mycase. om/tokens`\n\n### Limites de taxa\n- 25 pedidos por segundo por cliente\n- Tokens de acesso são válidos por 24 horas\n- tokens de atualização são válidos por 2 semanas\n\nPara documentação detalhada da API, visita: [https://mycaseapi.stoplight.io/docs/mycase-api-documentation/k5xpc4jyhkom7-getting-started](https://mycaseapi. toplight.io/docs/mycase-api-documentation/k5xpc4jyhkom7-getting-started) \n",
+ "\n## MyCase OAuth 2.0 Setup\n\n### Obtaining Client Credentials\n1. Contact MyCase support at [https://www.mycase.com/support/](https://www.mycase.com/support/) to request OAuth 2.0 client credentials\n2. Provide your application details and request a client ID and client secret\n3. MyCase support will provide you with:\n - **Client ID**: Your OAuth Client ID\n - **Client Secret**: Your OAuth Client secret\n - **Redirect URI**: A pre-configured redirect URI for your application\n\n### Required Permissions\nThe au": "\n## Configuração do MyCase OAuth 2.0\n\n### Obtendo Credenciais do Cliente\n. Contate o suporte a MyCase em [https://www.mycase.com/support/](https://www.mycase. om/support/) para solicitar credenciais de cliente OAuth 2.0\n2. Forneça os detalhes do seu aplicativo e solicite um ID de cliente e cliente secreto\n3. O suporte a MeuCase fornecerá para você:\n - **ID do cliente**: Seu ID de Cliente OAuth\n - **Segredo do cliente**: Seu segredo de Cliente OAuth\n - **URI de redirecionamento pré-configurado para a sua aplicação\n\n### Permissões necessárias\nO usuário autorizador deve ter as **\"Gerenciar as preferências da sua empresa, faturamento, e opções de pagamento\"** permissão definida para **Sim** no MyCase.\n\n### Autorização Flow\nMyCase usa o fluxo de concessão de autorização OAuth 2.0 com os seguintes endpoints:\n\n**URL de autorização**: `https://auth.mycase.com/login_sessions/new`\n**URL do token**: `https://auth.mycase. om/tokens`\n\n### Limites de taxa\n- 25 pedidos por segundo por cliente\n- Tokens de acesso são válidos por 24 horas\n- tokens de atualização são válidos por 2 semanas\n\nPara documentação detalhada da API, visita: [https://mycaseapi.stoplight.io/docs/mycase-api-documentation/k5xpc4jyhkom7-getting-started](https://mycaseapi. toplight.io/docs/mycase-api-documentation/k5xpc4jyhkom7-getting-started) \n",
"Create Case": "Criar Ocorrência",
"Create Case Stage": "Criar Estágio de Caso",
"Create Company": "Criar Empresa",
diff --git a/packages/pieces/community/mycase-piece/src/i18n/zh.json b/packages/pieces/community/mycase-piece/src/i18n/zh.json
index ce6a9f2df75..2fbd0bb684e 100644
--- a/packages/pieces/community/mycase-piece/src/i18n/zh.json
+++ b/packages/pieces/community/mycase-piece/src/i18n/zh.json
@@ -1,6 +1,6 @@
{
"Automate legal case management workflows with MyCase. Create and manage cases, clients, companies, events, tasks, time entries, documents, and more. Get notified when cases, events, people, companies, or leads are added or updated.": "Automate legal case management workflows with MyCase. Create and manage cases, clients, companies, events, tasks, time entries, documents, and more. Get notified when cases, events, people, companies, or leads are added or updated.",
- "\n## MyCase OAuth 2.0 Setup\n\n### Obtaining Client Credentials\n1. Contact MyCase support at [https://www.mycase.com/support/](https://www.mycase.com/support/) to request OAuth 2.0 client credentials\n2. Provide your application details and request a client ID and client secret\n3. MyCase support will provide you with:\n - **Client ID**: Your OAuth Client ID\n - **Client Secret**: Your OAuth Client secret\n - **Redirect URI**: A pre-configured redirect URI for your application\n\n### Required Permissions\nThe au": "\n## MyCase OAuth 2.0 Setup\n\n### Obtaining Client Credentials\n1. Contact MyCase support at [https://www.mycase.com/support/](https://www.mycase.com/support/) to request OAuth 2.0 client credentials\n2. Provide your application details and request a client ID and client secret\n3. MyCase support will provide you with:\n - **Client ID**: Your OAuth Client ID\n - **Client Secret**: Your OAuth Client secret\n - **Redirect URI**: A pre-configured redirect URI for your application\n\n### Required Permissions\nThe authorizing user must have the **\"Manage your firm's preferences, billing, and payment options\"** permission set to **Yes** in MyCase.\n\n### Authorization Flow\nMyCase uses OAuth 2.0 Authorization Code Grant flow with the following endpoints:\n\n**Authorization URL**: `https://auth.mycase.com/login_sessions/new` \n**Token URL**: `https://auth.mycase.com/tokens`\n\n### Rate Limits\n- 25 requests per second per client\n- Access tokens are valid for 24 hours\n- Refresh tokens are valid for 2 weeks\n\nFor detailed API documentation, visit: [https://mycaseapi.stoplight.io/docs/mycase-api-documentation/k5xpc4jyhkom7-getting-started](https://mycaseapi.stoplight.io/docs/mycase-api-documentation/k5xpc4jyhkom7-getting-started)\n",
+ "\n## MyCase OAuth 2.0 Setup\n\n### Obtaining Client Credentials\n1. Contact MyCase support at [https://www.mycase.com/support/](https://www.mycase.com/support/) to request OAuth 2.0 client credentials\n2. Provide your application details and request a client ID and client secret\n3. MyCase support will provide you with:\n - **Client ID**: Your OAuth Client ID\n - **Client Secret**: Your OAuth Client secret\n - **Redirect URI**: A pre-configured redirect URI for your application\n\n### Required Permissions\nThe au": "\n## MyCase OAuth 2.0 Setup\n\n### Obtaining Client Credentials\n1. Contact MyCase support at [https://www.mycase.com/support/](https://www.mycase.com/support/) to request OAuth 2.0 client credentials\n2. Provide your application details and request a client ID and client secret\n3. MyCase support will provide you with:\n - **Client ID**: Your OAuth Client ID\n - **Client Secret**: Your OAuth Client secret\n - **Redirect URI**: A pre-configured redirect URI for your application\n\n### Required Permissions\nThe authorizing user must have the **\"Manage your firm's preferences, billing, and payment options\"** permission set to **Yes** in MyCase.\n\n### Authorization Flow\nMyCase uses OAuth 2.0 Authorization Code Grant flow with the following endpoints:\n\n**Authorization URL**: `https://auth.mycase.com/login_sessions/new`\n**Token URL**: `https://auth.mycase.com/tokens`\n\n### Rate Limits\n- 25 requests per second per client\n- Access tokens are valid for 24 hours\n- Refresh tokens are valid for 2 weeks\n\nFor detailed API documentation, visit: [https://mycaseapi.stoplight.io/docs/mycase-api-documentation/k5xpc4jyhkom7-getting-started](https://mycaseapi.stoplight.io/docs/mycase-api-documentation/k5xpc4jyhkom7-getting-started)\n",
"Create Case": "Create Case",
"Create Case Stage": "Create Case Stage",
"Create Company": "Create Company",
diff --git a/packages/pieces/community/mysendingbox/package.json b/packages/pieces/community/mysendingbox/package.json
index 38a77a89286..c0d7342d0a9 100644
--- a/packages/pieces/community/mysendingbox/package.json
+++ b/packages/pieces/community/mysendingbox/package.json
@@ -1,6 +1,6 @@
{
"name": "@activepieces/piece-mysendingbox",
- "version": "0.0.2",
+ "version": "0.0.3",
"main": "./dist/src/index.js",
"types": "./dist/src/index.d.ts",
"scripts": {
diff --git a/packages/pieces/community/mysendingbox/src/i18n/de.json b/packages/pieces/community/mysendingbox/src/i18n/de.json
new file mode 100644
index 00000000000..a40f43db977
--- /dev/null
+++ b/packages/pieces/community/mysendingbox/src/i18n/de.json
@@ -0,0 +1,27 @@
+{
+ "API Key": "API-Schlüssel",
+ "\nMySendingBox API keyis available under the developer portal.\n(https://app.mysendingbox.fr/account/keys)": "\nMySendingBox API-Schlüssel verfügbar unter dem Entwicklerportal.\n(https://app.mysendingbox.fr/account/keys)",
+ "Custom API Call": "Eigener API-Aufruf",
+ "Make a custom API call to a specific endpoint": "Einen benutzerdefinierten API-Aufruf an einen bestimmten Endpunkt machen",
+ "Method": "Methode",
+ "Headers": "Kopfzeilen",
+ "Query Parameters": "Abfrageparameter",
+ "Body Type": "Körpertyp",
+ "Body": "Körper",
+ "Response is Binary ?": "Antwort ist binär?",
+ "No Error on Failure": "Kein Fehler bei Fehler",
+ "Timeout (in seconds)": "Timeout (in Sekunden)",
+ "Follow redirects": "Weiterleitungen folgen",
+ "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 usw.",
+ "GET": "ERHALTEN",
+ "POST": "POST",
+ "PATCH": "PATCH",
+ "PUT": "PUT",
+ "DELETE": "LÖSCHEN",
+ "HEAD": "HEAD",
+ "None": "Keine",
+ "JSON": "JSON",
+ "Form Data": "Formulardaten",
+ "Raw": "Rohe"
+}
\ No newline at end of file
diff --git a/packages/pieces/community/mysendingbox/src/i18n/es.json b/packages/pieces/community/mysendingbox/src/i18n/es.json
new file mode 100644
index 00000000000..cb37155e9ed
--- /dev/null
+++ b/packages/pieces/community/mysendingbox/src/i18n/es.json
@@ -0,0 +1,27 @@
+{
+ "API Key": "Clave API",
+ "\nMySendingBox API keyis available under the developer portal.\n(https://app.mysendingbox.fr/account/keys)": "\nLa clave API MySendingBox está disponible en el portal del desarrollador.\n(https://app..Uendingbox.fr/account/keys)",
+ "Custom API Call": "Llamada API personalizada",
+ "Make a custom API call to a specific endpoint": "Hacer una llamada API personalizada a un extremo específico",
+ "Method": "Método",
+ "Headers": "Encabezados",
+ "Query Parameters": "Parámetros de consulta",
+ "Body Type": "Tipo de cuerpo",
+ "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)",
+ "Follow redirects": "Seguir redirecciones",
+ "Authorization headers are injected automatically from your connection.": "Las cabeceras de autorización se inyectan automáticamente desde tu conexión.",
+ "Enable for files like PDFs, images, etc.": "Activar para archivos como PDFs, imágenes, etc.",
+ "GET": "RECOGER",
+ "POST": "POST",
+ "PATCH": "PATCH",
+ "PUT": "PUT",
+ "DELETE": "BORRAR",
+ "HEAD": "LIMPIO",
+ "None": "Ninguna",
+ "JSON": "JSON",
+ "Form Data": "Datos de Formulario",
+ "Raw": "Rápido"
+}
\ No newline at end of file
diff --git a/packages/pieces/community/mysendingbox/src/i18n/fr.json b/packages/pieces/community/mysendingbox/src/i18n/fr.json
new file mode 100644
index 00000000000..b9c5be289de
--- /dev/null
+++ b/packages/pieces/community/mysendingbox/src/i18n/fr.json
@@ -0,0 +1,27 @@
+{
+ "API Key": "Clé API",
+ "\nMySendingBox API keyis available under the developer portal.\n(https://app.mysendingbox.fr/account/keys)": "\nLa clé API MySendingBox est disponible sur le portail du développeur.\n(https://app.mysendingbox.fr/account/keys)",
+ "Custom API Call": "Appel d'API personnalisé",
+ "Make a custom API call to a specific endpoint": "Passer un appel API personnalisé à un endpoint spécifique",
+ "Method": "Méthode",
+ "Headers": "Headers",
+ "Query Parameters": "Paramètres de requête",
+ "Body Type": "Body Type",
+ "Body": "Body",
+ "Response is Binary ?": "La réponse est Binaire ?",
+ "No Error on Failure": "Aucune erreur en cas d'échec",
+ "Timeout (in seconds)": "Délai d'expiration (en secondes)",
+ "Follow redirects": "Suivre les redirections",
+ "Authorization headers are injected automatically from your connection.": "Les Headers d'autorisation sont injectés automatiquement à partir de votre connexion.",
+ "Enable for files like PDFs, images, etc.": "Activer pour les fichiers comme les PDFs, les images, etc.",
+ "GET": "GET",
+ "POST": "POST",
+ "PATCH": "PATCH",
+ "PUT": "PUT",
+ "DELETE": "DELETE",
+ "HEAD": "HEAD",
+ "None": "Aucun",
+ "JSON": "JSON",
+ "Form Data": "Données du formulaire",
+ "Raw": "Brut"
+}
\ No newline at end of file
diff --git a/packages/pieces/community/mysendingbox/src/i18n/ja.json b/packages/pieces/community/mysendingbox/src/i18n/ja.json
new file mode 100644
index 00000000000..a9090c82263
--- /dev/null
+++ b/packages/pieces/community/mysendingbox/src/i18n/ja.json
@@ -0,0 +1,27 @@
+{
+ "API Key": "API キー",
+ "\nMySendingBox API keyis available under the developer portal.\n(https://app.mysendingbox.fr/account/keys)": "\nMySendingBox API キーは開発者ポータルで利用できます。\n(https://app.mysendingbox.fr/account/keys)",
+ "Custom API Call": "カスタムAPI呼び出し",
+ "Make a custom API call to a specific endpoint": "特定のエンドポイントへのカスタム API コールを実行します。",
+ "Method": "方法",
+ "Headers": "ヘッダー",
+ "Query Parameters": "クエリパラメータ",
+ "Body Type": "ボディタイプ",
+ "Body": "本文",
+ "Response is Binary ?": "応答はバイナリですか?",
+ "No Error on Failure": "失敗時にエラーはありません",
+ "Timeout (in seconds)": "タイムアウト(秒)",
+ "Follow redirects": "リダイレクトをフォローする",
+ "Authorization headers are injected automatically from your connection.": "認証ヘッダは接続から自動的に注入されます。",
+ "Enable for files like PDFs, images, etc.": "PDF、画像などのファイルを有効にする",
+ "GET": "GET",
+ "POST": "POST",
+ "PATCH": "PATCH",
+ "PUT": "PUT",
+ "DELETE": "DELETE",
+ "HEAD": "HEAD",
+ "None": "なし",
+ "JSON": "JSON",
+ "Form Data": "フォームデータ",
+ "Raw": "Raw"
+}
\ No newline at end of file
diff --git a/packages/pieces/community/mysendingbox/src/i18n/nl.json b/packages/pieces/community/mysendingbox/src/i18n/nl.json
new file mode 100644
index 00000000000..3ac4cd5920a
--- /dev/null
+++ b/packages/pieces/community/mysendingbox/src/i18n/nl.json
@@ -0,0 +1,27 @@
+{
+ "API Key": "API Sleutel",
+ "\nMySendingBox API keyis available under the developer portal.\n(https://app.mysendingbox.fr/account/keys)": "\nMySendingBox API sleutel is beschikbaar onder de ontwikkelaarsportaal.\n(https://app.mysendingbox.fr/account/keys)",
+ "Custom API Call": "Custom API Call",
+ "Make a custom API call to a specific endpoint": "Maak een aangepaste API call naar een specifiek eindpunt",
+ "Method": "Methode",
+ "Headers": "Kopteksten",
+ "Query Parameters": "Query parameters",
+ "Body Type": "Type lichaam",
+ "Body": "Lichaam",
+ "Response is Binary ?": "Antwoord is binair?",
+ "No Error on Failure": "Geen fout bij fout",
+ "Timeout (in seconds)": "Time-out (in seconden)",
+ "Follow redirects": "Volg omleidingen",
+ "Authorization headers are injected automatically from your connection.": "Autorisatie headers worden automatisch geïnjecteerd vanuit uw verbinding.",
+ "Enable for files like PDFs, images, etc.": "Inschakelen voor bestanden zoals PDF's, afbeeldingen etc.",
+ "GET": "KRIJG",
+ "POST": "POSTE",
+ "PATCH": "BEKIJK",
+ "PUT": "PUT",
+ "DELETE": "VERWIJDEREN",
+ "HEAD": "HOOFD",
+ "None": "geen",
+ "JSON": "JSON",
+ "Form Data": "Formulieren gegevens",
+ "Raw": "Onbewerkte"
+}
\ No newline at end of file
diff --git a/packages/pieces/community/mysendingbox/src/i18n/pt.json b/packages/pieces/community/mysendingbox/src/i18n/pt.json
new file mode 100644
index 00000000000..35da39190fb
--- /dev/null
+++ b/packages/pieces/community/mysendingbox/src/i18n/pt.json
@@ -0,0 +1,27 @@
+{
+ "API Key": "Chave de API",
+ "\nMySendingBox API keyis available under the developer portal.\n(https://app.mysendingbox.fr/account/keys)": "\nA chave API do MySendingBox está disponível no portal do desenvolvedor.\n(https://app.mysendingbox.fr/account/keys)",
+ "Custom API Call": "Chamada de API personalizada",
+ "Make a custom API call to a specific endpoint": "Faça uma chamada de API personalizada para um ponto de extremidade específico",
+ "Method": "Método",
+ "Headers": "Cabeçalhos",
+ "Query Parameters": "Parâmetros da consulta",
+ "Body Type": "Tipo de Corpo",
+ "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)",
+ "Follow redirects": "Seguir redirecionamentos",
+ "Authorization headers are injected automatically from your connection.": "Os cabeçalhos de autorização são inseridos automaticamente a partir da sua conexão.",
+ "Enable for files like PDFs, images, etc.": "Habilitar para arquivos como PDFs, imagens, etc.",
+ "GET": "OBTER",
+ "POST": "POSTAR",
+ "PATCH": "COMPRAR",
+ "PUT": "COLOCAR",
+ "DELETE": "EXCLUIR",
+ "HEAD": "CABEÇA",
+ "None": "Nenhuma",
+ "JSON": "JSON",
+ "Form Data": "Dados de Formulário",
+ "Raw": "RAW"
+}
\ No newline at end of file
diff --git a/packages/pieces/community/mysendingbox/src/i18n/zh.json b/packages/pieces/community/mysendingbox/src/i18n/zh.json
new file mode 100644
index 00000000000..d43575d6815
--- /dev/null
+++ b/packages/pieces/community/mysendingbox/src/i18n/zh.json
@@ -0,0 +1,27 @@
+{
+ "API Key": "API 密钥",
+ "\nMySendingBox API keyis available under the developer portal.\n(https://app.mysendingbox.fr/account/keys)": "\nMySendingBox API keyis available under the developer portal.\n(https://app.mysendingbox.fr/account/keys)",
+ "Custom API Call": "自定义 API 呼叫",
+ "Make a custom API call to a specific endpoint": "将一个自定义 API 调用到一个特定的终点",
+ "Method": "方法",
+ "Headers": "信头",
+ "Query Parameters": "查询参数",
+ "Body Type": "Body Type",
+ "Body": "正文内容",
+ "Response is Binary ?": "Response is Binary ?",
+ "No Error on Failure": "失败时没有错误",
+ "Timeout (in seconds)": "超时(秒)",
+ "Follow redirects": "Follow redirects",
+ "Authorization headers are injected automatically from your connection.": "授权头自动从您的连接中注入。",
+ "Enable for files like PDFs, images, etc.": "Enable for files like PDFs, images, etc.",
+ "GET": "获取",
+ "POST": "帖子",
+ "PATCH": "PATCH",
+ "PUT": "弹出",
+ "DELETE": "删除",
+ "HEAD": "黑色",
+ "None": "无",
+ "JSON": "JSON",
+ "Form Data": "表单数据",
+ "Raw": "原始文件"
+}
\ No newline at end of file
diff --git a/packages/pieces/community/opnform/package.json b/packages/pieces/community/opnform/package.json
index 310c2e59fd9..92d5cbc4261 100644
--- a/packages/pieces/community/opnform/package.json
+++ b/packages/pieces/community/opnform/package.json
@@ -1,6 +1,6 @@
{
"name": "@activepieces/piece-opnform",
- "version": "0.1.5",
+ "version": "0.1.6",
"type": "commonjs",
"main": "./dist/src/index.js",
"types": "./dist/src/index.d.ts",
diff --git a/packages/pieces/community/opnform/src/i18n/de.json b/packages/pieces/community/opnform/src/i18n/de.json
index 66eb5d28db4..c12af7064a7 100644
--- a/packages/pieces/community/opnform/src/i18n/de.json
+++ b/packages/pieces/community/opnform/src/i18n/de.json
@@ -1,7 +1,8 @@
{
"Create beautiful online forms and surveys with unlimited fields and submissions": "Erstelle schöne Online-Formulare und Umfragen mit unbegrenzten Feldern und Einreichungen",
- "Base URL (Default: https://api.opnform.com)": "Basis-URL (Standard: https://api.opnform.com)",
+ "Base URL": "Basis-URL",
"API Key": "API-Schlüssel",
+ "Default value is 'https://api.opnform.com'.": "Standardwert ist 'https://api.opnform.com'.",
"Please use your Opnform API Key. [Click here for create API Key](https://opnform.com/home?user-settings=access-tokens)": "Bitte verwende deinen Opnform API Key. [Klicke hier um API-Schlüssel zu erstellen](https://opnform.com/home?user-settings=access-tokens)",
"Custom API Call": "Eigener API-Aufruf",
"Make a custom API call to a specific endpoint": "Einen benutzerdefinierten API-Aufruf an einen bestimmten Endpunkt machen",
diff --git a/packages/pieces/community/opnform/src/i18n/es.json b/packages/pieces/community/opnform/src/i18n/es.json
index 309d53b7c5a..e4fcdccb4d9 100644
--- a/packages/pieces/community/opnform/src/i18n/es.json
+++ b/packages/pieces/community/opnform/src/i18n/es.json
@@ -1,7 +1,8 @@
{
"Create beautiful online forms and surveys with unlimited fields and submissions": "Crear hermosos formularios y encuestas en línea con campos ilimitados y envíos",
- "Base URL (Default: https://api.opnform.com)": "URL base (por defecto: https://api.opnform.com)",
+ "Base URL": "URL base",
"API Key": "Clave API",
+ "Default value is 'https://api.opnform.com'.": "El valor predeterminado es 'https://api.opnform.com'.",
"Please use your Opnform API Key. [Click here for create API Key](https://opnform.com/home?user-settings=access-tokens)": "Por favor, utiliza tu clave API de Opnform. [Haz clic aquí para crear la clave API](https://opnform.com/home?user-settings=access-tokens)",
"Custom API Call": "Llamada API personalizada",
"Make a custom API call to a specific endpoint": "Hacer una llamada API personalizada a un extremo específico",
diff --git a/packages/pieces/community/opnform/src/i18n/fr.json b/packages/pieces/community/opnform/src/i18n/fr.json
index eccef2eb993..18206c66d68 100644
--- a/packages/pieces/community/opnform/src/i18n/fr.json
+++ b/packages/pieces/community/opnform/src/i18n/fr.json
@@ -1,7 +1,8 @@
{
"Create beautiful online forms and surveys with unlimited fields and submissions": "Créez de beaux formulaires et sondages en ligne avec des champs et des soumissions illimités",
- "Base URL (Default: https://api.opnform.com)": "URL de base (par défaut: https://api.opnform.com)",
+ "Base URL": "URL de base",
"API Key": "Clé API",
+ "Default value is 'https://api.opnform.com'.": "La valeur par défaut est 'https://api.opnform.com'.",
"Please use your Opnform API Key. [Click here for create API Key](https://opnform.com/home?user-settings=access-tokens)": "Veuillez utiliser votre clé d'API Opnform. [Cliquez ici pour créer une clé API](https://opnform.com/home?user-settings=access-tokens)",
"Custom API Call": "Appel d'API personnalisé",
"Make a custom API call to a specific endpoint": "Passer un appel API personnalisé à un endpoint spécifique",
diff --git a/packages/pieces/community/opnform/src/i18n/ja.json b/packages/pieces/community/opnform/src/i18n/ja.json
index 39d97ca755e..ecd1e64b4bf 100644
--- a/packages/pieces/community/opnform/src/i18n/ja.json
+++ b/packages/pieces/community/opnform/src/i18n/ja.json
@@ -1,7 +1,8 @@
{
"Create beautiful online forms and surveys with unlimited fields and submissions": "無制限のフィールドと提出で美しいオンラインフォームとアンケートを作成します",
- "Base URL (Default: https://api.opnform.com)": "ベース URL (デフォルト: https://api.opnform.com)",
+ "Base URL": "ベースURL",
"API Key": "API キー",
+ "Default value is 'https://api.opnform.com'.": "デフォルト値は 'https://api.opnform.com' です。",
"Please use your Opnform API Key. [Click here for create API Key](https://opnform.com/home?user-settings=access-tokens)": "Please use your Opnform API Key. [Click here for create API Key](https://opnform.com/home?user-settings=access-tokens)",
"Custom API Call": "カスタムAPI通話",
"Make a custom API call to a specific endpoint": "特定のエンドポイントへのカスタム API コールを実行します。",
diff --git a/packages/pieces/community/opnform/src/i18n/nl.json b/packages/pieces/community/opnform/src/i18n/nl.json
index b0080bddd1f..099ecd0065e 100644
--- a/packages/pieces/community/opnform/src/i18n/nl.json
+++ b/packages/pieces/community/opnform/src/i18n/nl.json
@@ -1,7 +1,8 @@
{
"Create beautiful online forms and surveys with unlimited fields and submissions": "Maak prachtige online formulieren en enquêtes met onbeperkte velden en inzendingen",
- "Base URL (Default: https://api.opnform.com)": "Basis-URL (standaard: https://api.opnform.com)",
+ "Base URL": "Basis URL",
"API Key": "API Sleutel",
+ "Default value is 'https://api.opnform.com'.": "Standaardwaarde is 'https://api.opnform.com'.",
"Please use your Opnform API Key. [Click here for create API Key](https://opnform.com/home?user-settings=access-tokens)": "Gebruik uw Opnform API-sleutel. [Klik hier voor het maken van API-sleutel](https://opnform.com/home?user-settings=access-tokens)",
"Custom API Call": "Custom API Call",
"Make a custom API call to a specific endpoint": "Maak een aangepaste API call naar een specifiek eindpunt",
diff --git a/packages/pieces/community/opnform/src/i18n/pt.json b/packages/pieces/community/opnform/src/i18n/pt.json
index 4d96b60e33e..003c6eb9591 100644
--- a/packages/pieces/community/opnform/src/i18n/pt.json
+++ b/packages/pieces/community/opnform/src/i18n/pt.json
@@ -1,7 +1,8 @@
{
"Create beautiful online forms and surveys with unlimited fields and submissions": "Crie belos formulários e pesquisas on-line com campos e submissões ilimitados",
- "Base URL (Default: https://api.opnform.com)": "URL Base (Padrão: https://api.opnform.com)",
+ "Base URL": "URL Base",
"API Key": "Chave de API",
+ "Default value is 'https://api.opnform.com'.": "O valor padrão é 'https://api.opnform.com'.",
"Please use your Opnform API Key. [Click here for create API Key](https://opnform.com/home?user-settings=access-tokens)": "Por favor, use sua chave de API de Opnform. [Clique aqui para criar chave de API](https://opnform.com/home?user-settings=access-tokens)",
"Custom API Call": "Chamada de API personalizada",
"Make a custom API call to a specific endpoint": "Faça uma chamada de API personalizada para um ponto de extremidade específico",
diff --git a/packages/pieces/community/opnform/src/i18n/zh.json b/packages/pieces/community/opnform/src/i18n/zh.json
index 3baeb026b5a..3348923ae17 100644
--- a/packages/pieces/community/opnform/src/i18n/zh.json
+++ b/packages/pieces/community/opnform/src/i18n/zh.json
@@ -1,7 +1,8 @@
{
"Create beautiful online forms and surveys with unlimited fields and submissions": "Create beautiful online forms and surveys with unlimited fields and submissions",
- "Base URL (Default: https://api.opnform.com)": "Base URL (Default: https://api.opnform.com)",
+ "Base URL": "基本网址",
"API Key": "API 密钥",
+ "Default value is 'https://api.opnform.com'.": "Default value is 'https://api.opnform.com'.",
"Please use your Opnform API Key. [Click here for create API Key](https://opnform.com/home?user-settings=access-tokens)": "Please use your Opnform API Key. [Click here for create API Key](https://opnform.com/home?user-settings=access-tokens)",
"Custom API Call": "自定义 API 呼叫",
"Make a custom API call to a specific endpoint": "将一个自定义 API 调用到一个特定的终点",
diff --git a/packages/pieces/community/salesforce/package.json b/packages/pieces/community/salesforce/package.json
index 62ce68f20c2..778bd45cd07 100644
--- a/packages/pieces/community/salesforce/package.json
+++ b/packages/pieces/community/salesforce/package.json
@@ -1,6 +1,6 @@
{
"name": "@activepieces/piece-salesforce",
- "version": "0.6.0",
+ "version": "0.6.1",
"main": "./dist/src/index.js",
"types": "./dist/src/index.d.ts",
"scripts": {
diff --git a/packages/pieces/community/salesforce/src/i18n/de.json b/packages/pieces/community/salesforce/src/i18n/de.json
index b4d1efa31bf..06d66f42efd 100644
--- a/packages/pieces/community/salesforce/src/i18n/de.json
+++ b/packages/pieces/community/salesforce/src/i18n/de.json
@@ -161,6 +161,7 @@
"New Outbound Message": "Neue ausgehende Nachricht",
"New Record": "Neuer Datensatz",
"New or Updated File": "Neue oder aktualisierte Datei",
+ "New Case in Queue": "Neuer Fall in der Warteschlange",
"Fires when a new Attachment or File is added to any Case record.": "Feuert ab, wenn ein neuer Anhang oder Datei zu jedem Fall Datensatz hinzugefügt wird.",
"Fires when a new Contact record is created in Salesforce.": "Feuer, wenn ein neuer Kontakt-Datensatz in Salesforce erstellt wird.",
"Fires when a tracked field is updated on a specified object.": "Feuert ab, wenn ein getragenes Feld auf ein bestimmtes Objekt aktualisiert wird.",
@@ -169,6 +170,9 @@
"Fires when a new outbound message is received from Salesforce.": "Feuert ab, wenn eine neue ausgehende Nachricht von Salesforce empfangen wird.",
"Triggers when there is new record": "Auslöser wenn neuer Datensatz vorhanden ist",
"Fires when a file (ContentDocument) is created or updated. Does not fire for classic Attachments or Notes.": "Feuer, wenn eine Datei (ContentDocument) erstellt oder aktualisiert wird. Feuert nicht auf klassische Anhänge oder Notizen.",
+ "Triggers when a new Case record is assigned to a specified queue.": "Wird ausgelöst, wenn ein neuer Case Datensatz einer angegebenen Warteschlange zugewiesen wird.",
"Conditions (Advanced)": "Bedingungen (Fortgeschritten)",
- "Enter a SOQL query where clause i. e. IsDeleted = TRUE": "Geben Sie eine SOQL-Abfrage ein, wo Klausel i. e. IsDeleted = TRUE ein."
+ "Case Queue": "Fallwarteschlange",
+ "Enter a SOQL query where clause i. e. IsDeleted = TRUE": "Geben Sie eine SOQL-Abfrage ein, wo Klausel i. e. IsDeleted = TRUE ein.",
+ "The queue to monitor for new cases.": "Die Warteschlange für neue Fälle."
}
\ No newline at end of file
diff --git a/packages/pieces/community/salesforce/src/i18n/es.json b/packages/pieces/community/salesforce/src/i18n/es.json
index c2761a6ab25..542ccbaa856 100644
--- a/packages/pieces/community/salesforce/src/i18n/es.json
+++ b/packages/pieces/community/salesforce/src/i18n/es.json
@@ -161,6 +161,7 @@
"New Outbound Message": "Nuevo mensaje saliente",
"New Record": "Nuevo registro",
"New or Updated File": "Archivo nuevo o actualizado",
+ "New Case in Queue": "Nuevo caso en cola",
"Fires when a new Attachment or File is added to any Case record.": "Dispara cuando se añade un nuevo archivo o adjunto a cualquier registro del caso.",
"Fires when a new Contact record is created in Salesforce.": "Dispara cuando se crea un nuevo registro de contacto en Salesforce.",
"Fires when a tracked field is updated on a specified object.": "Dispara cuando un campo rastreado se actualiza en un objeto especificado.",
@@ -169,6 +170,9 @@
"Fires when a new outbound message is received from Salesforce.": "Dispara cuando se recibe un nuevo mensaje saliente de Salesforce.",
"Triggers when there is new record": "Dispara cuando hay un nuevo registro",
"Fires when a file (ContentDocument) is created or updated. Does not fire for classic Attachments or Notes.": "Dispara cuando un archivo (ContentDocument) es creado o actualizado. No se dispara para archivos adjuntos o notas clásicos.",
+ "Triggers when a new Case record is assigned to a specified queue.": "Se activa cuando se asigna un nuevo registro de Caso a una cola especificada.",
"Conditions (Advanced)": "Condiciones (Avanzado)",
- "Enter a SOQL query where clause i. e. IsDeleted = TRUE": "Introduzca una consulta SOQL donde la cláusula i. e. IsDeleted = TRUE"
+ "Case Queue": "Cola de Casos",
+ "Enter a SOQL query where clause i. e. IsDeleted = TRUE": "Introduzca una consulta SOQL donde la cláusula i. e. IsDeleted = TRUE",
+ "The queue to monitor for new cases.": "La cola para monitorizar nuevos casos."
}
\ No newline at end of file
diff --git a/packages/pieces/community/salesforce/src/i18n/fr.json b/packages/pieces/community/salesforce/src/i18n/fr.json
index 8c64fe8fee9..aec701a9d92 100644
--- a/packages/pieces/community/salesforce/src/i18n/fr.json
+++ b/packages/pieces/community/salesforce/src/i18n/fr.json
@@ -161,6 +161,7 @@
"New Outbound Message": "Nouveau message sortant",
"New Record": "Nouvel enregistrement",
"New or Updated File": "Fichier nouveau ou mis à jour",
+ "New Case in Queue": "Nouveau cas dans la file d'attente",
"Fires when a new Attachment or File is added to any Case record.": "Se déclenche lorsqu'une nouvelle pièce jointe ou un nouveau fichier est ajouté à n'importe quel dossier de cas.",
"Fires when a new Contact record is created in Salesforce.": "Se déclenche lorsqu'un nouveau contact est créé dans la force de vente.",
"Fires when a tracked field is updated on a specified object.": "Tire lorsqu'un champ suivi est mis à jour sur un objet spécifié.",
@@ -169,6 +170,9 @@
"Fires when a new outbound message is received from Salesforce.": "Se déclenche lorsqu'un nouveau message sortant est reçu par Salesforce.",
"Triggers when there is new record": "Déclenche lorsqu'il y a un nouvel enregistrement",
"Fires when a file (ContentDocument) is created or updated. Does not fire for classic Attachments or Notes.": "Tire lorsqu'un fichier (ContentDocument) est créé ou mis à jour. Ne tire pas pour les pièces jointes ou notes classiques.",
+ "Triggers when a new Case record is assigned to a specified queue.": "Déclenche lorsqu'un nouvel enregistrement de cas est affecté à une file d'attente spécifiée.",
"Conditions (Advanced)": "Conditions (Avancées)",
- "Enter a SOQL query where clause i. e. IsDeleted = TRUE": "Entrez une requête SOQL où la clause i. e. IsDeleted = TRUE"
+ "Case Queue": "File d'attente de cas",
+ "Enter a SOQL query where clause i. e. IsDeleted = TRUE": "Entrez une requête SOQL où la clause i. e. IsDeleted = TRUE",
+ "The queue to monitor for new cases.": "La file d'attente à surveiller pour les nouveaux cas."
}
\ No newline at end of file
diff --git a/packages/pieces/community/salesforce/src/i18n/ja.json b/packages/pieces/community/salesforce/src/i18n/ja.json
index 6df2d6e0d98..68bb2cb28c0 100644
--- a/packages/pieces/community/salesforce/src/i18n/ja.json
+++ b/packages/pieces/community/salesforce/src/i18n/ja.json
@@ -161,6 +161,7 @@
"New Outbound Message": "新しい送信メッセージ",
"New Record": "新しいレコード",
"New or Updated File": "新規または更新されたファイル",
+ "New Case in Queue": "キュー内の新しいケース",
"Fires when a new Attachment or File is added to any Case record.": "症例レコードに新しい添付ファイルまたはファイルが追加されたときに発生します。",
"Fires when a new Contact record is created in Salesforce.": "Salesforce に新しい連絡先レコードが作成されたときに発行されます。",
"Fires when a tracked field is updated on a specified object.": "トラッキングフィールドが指定されたオブジェクトで更新されたときに発生します。",
@@ -169,6 +170,9 @@
"Fires when a new outbound message is received from Salesforce.": "Salesforce から新しい送信メッセージを受信したときに発生します。",
"Triggers when there is new record": "新しいレコードがあるときにトリガーします",
"Fires when a file (ContentDocument) is created or updated. Does not fire for classic Attachments or Notes.": "ファイル(ContentDocument)が作成または更新されたときに発行されます。",
+ "Triggers when a new Case record is assigned to a specified queue.": "新しいケースレコードが指定されたキューに割り当てられたときにトリガーされます。",
"Conditions (Advanced)": "条件 (高度)",
- "Enter a SOQL query where clause i. e. IsDeleted = TRUE": "SOQL クエリを入力します。e. IsDeleted = TRUE"
+ "Case Queue": "案件キュー",
+ "Enter a SOQL query where clause i. e. IsDeleted = TRUE": "SOQL クエリを入力します。e. IsDeleted = TRUE",
+ "The queue to monitor for new cases.": "新しい案件を監視するためのキュー。"
}
\ No newline at end of file
diff --git a/packages/pieces/community/salesforce/src/i18n/nl.json b/packages/pieces/community/salesforce/src/i18n/nl.json
index d68c2ed4613..b2e133275fb 100644
--- a/packages/pieces/community/salesforce/src/i18n/nl.json
+++ b/packages/pieces/community/salesforce/src/i18n/nl.json
@@ -161,6 +161,7 @@
"New Outbound Message": "Nieuw uitgaande bericht",
"New Record": "Nieuwe Record",
"New or Updated File": "Nieuw of bijgewerkt bestand",
+ "New Case in Queue": "Nieuwe Geval in de wachtrij",
"Fires when a new Attachment or File is added to any Case record.": "Vuurt wanneer een nieuwe bijlage of bestand is toegevoegd aan een zaak record.",
"Fires when a new Contact record is created in Salesforce.": "Vuurt wanneer een nieuw Contact record wordt aangemaakt in Salesforce.",
"Fires when a tracked field is updated on a specified object.": "Vuurt wanneer een bijgehouden veld wordt bijgewerkt op een bepaald object.",
@@ -169,6 +170,9 @@
"Fires when a new outbound message is received from Salesforce.": "Vuurt af wanneer een nieuw uitgaande bericht wordt ontvangen van Salesforce.",
"Triggers when there is new record": "Triggert wanneer er een nieuw record is",
"Fires when a file (ContentDocument) is created or updated. Does not fire for classic Attachments or Notes.": "Vuurt wanneer een bestand (ContentDocument) is gemaakt of bijgewerkt. Vuurt niet voor klassieke bijlagen of notities.",
+ "Triggers when a new Case record is assigned to a specified queue.": "Triggert wanneer een nieuwe Geval record is toegewezen aan een opgegeven wachtrij.",
"Conditions (Advanced)": "Voorwaarden (Geavanceerd)",
- "Enter a SOQL query where clause i. e. IsDeleted = TRUE": "Voer een SOQL query in waar clausule i is. Verwijderd = TRUE"
+ "Case Queue": "Geval Wachtrij",
+ "Enter a SOQL query where clause i. e. IsDeleted = TRUE": "Voer een SOQL query in waar clausule i is. Verwijderd = TRUE",
+ "The queue to monitor for new cases.": "De wachtrij om nieuwe zaken te monitoren."
}
\ No newline at end of file
diff --git a/packages/pieces/community/salesforce/src/i18n/pt.json b/packages/pieces/community/salesforce/src/i18n/pt.json
index f13f4472173..2e1e6aecc33 100644
--- a/packages/pieces/community/salesforce/src/i18n/pt.json
+++ b/packages/pieces/community/salesforce/src/i18n/pt.json
@@ -161,6 +161,7 @@
"New Outbound Message": "Nova Mensagem de Saída",
"New Record": "Novo Registro",
"New or Updated File": "Arquivo novo ou atualizado",
+ "New Case in Queue": "Novo caso na fila",
"Fires when a new Attachment or File is added to any Case record.": "Atira quando um novo Anexo ou Arquivo é adicionado a qualquer registro de caso.",
"Fires when a new Contact record is created in Salesforce.": "Atira quando um novo registro de contato é criado no Salesforce.",
"Fires when a tracked field is updated on a specified object.": "Atira quando um campo monitorado é atualizado em um objeto especificado.",
@@ -169,6 +170,9 @@
"Fires when a new outbound message is received from Salesforce.": "Atira quando uma nova mensagem de saída é recebida do Salesforce.",
"Triggers when there is new record": "Dispara quando há um novo registro",
"Fires when a file (ContentDocument) is created or updated. Does not fire for classic Attachments or Notes.": "Atira quando um arquivo (ContentDocument) é criado ou atualizado. Não é acionado para anexos ou notas clássicas.",
+ "Triggers when a new Case record is assigned to a specified queue.": "Aciona quando um novo registro de caso é atribuído a uma fila especificada.",
"Conditions (Advanced)": "Condições (Avançadas)",
- "Enter a SOQL query where clause i. e. IsDeleted = TRUE": "Digite uma consulta SOQL onde a cláusula i. IsDeleted = TRUE"
+ "Case Queue": "Fila de caso",
+ "Enter a SOQL query where clause i. e. IsDeleted = TRUE": "Digite uma consulta SOQL onde a cláusula i. IsDeleted = TRUE",
+ "The queue to monitor for new cases.": "A fila para monitorar novos casos."
}
\ No newline at end of file
diff --git a/packages/pieces/community/salesforce/src/i18n/zh.json b/packages/pieces/community/salesforce/src/i18n/zh.json
index 256eee43315..e3381a8b44a 100644
--- a/packages/pieces/community/salesforce/src/i18n/zh.json
+++ b/packages/pieces/community/salesforce/src/i18n/zh.json
@@ -161,6 +161,7 @@
"New Outbound Message": "New Outbound Message",
"New Record": "New Record",
"New or Updated File": "New or Updated File",
+ "New Case in Queue": "New Case in Queue",
"Fires when a new Attachment or File is added to any Case record.": "Fires when a new Attachment or File is added to any Case record.",
"Fires when a new Contact record is created in Salesforce.": "Fires when a new Contact record is created in Salesforce.",
"Fires when a tracked field is updated on a specified object.": "Fires when a tracked field is updated on a specified object.",
@@ -169,6 +170,9 @@
"Fires when a new outbound message is received from Salesforce.": "Fires when a new outbound message is received from Salesforce.",
"Triggers when there is new record": "Triggers when there is new record",
"Fires when a file (ContentDocument) is created or updated. Does not fire for classic Attachments or Notes.": "Fires when a file (ContentDocument) is created or updated. Does not fire for classic Attachments or Notes.",
+ "Triggers when a new Case record is assigned to a specified queue.": "Triggers when a new Case record is assigned to a specified queue.",
"Conditions (Advanced)": "Conditions (Advanced)",
- "Enter a SOQL query where clause i. e. IsDeleted = TRUE": "Enter a SOQL query where clause i. e. IsDeleted = TRUE"
+ "Case Queue": "Case Queue",
+ "Enter a SOQL query where clause i. e. IsDeleted = TRUE": "Enter a SOQL query where clause i. e. IsDeleted = TRUE",
+ "The queue to monitor for new cases.": "The queue to monitor for new cases."
}
\ No newline at end of file
diff --git a/packages/pieces/community/sign-now/package.json b/packages/pieces/community/sign-now/package.json
index fad564362a6..169d69a441c 100644
--- a/packages/pieces/community/sign-now/package.json
+++ b/packages/pieces/community/sign-now/package.json
@@ -1,6 +1,6 @@
{
"name": "@activepieces/piece-sign-now",
- "version": "0.0.1",
+ "version": "0.0.2",
"type": "commonjs",
"main": "./dist/src/index.js",
"types": "./dist/src/index.d.ts",
@@ -15,4 +15,4 @@
"build": "tsc -p tsconfig.lib.json && cp package.json dist/",
"lint": "eslint 'src/**/*.ts'"
}
-}
\ No newline at end of file
+}
diff --git a/packages/pieces/community/sign-now/src/i18n/de.json b/packages/pieces/community/sign-now/src/i18n/de.json
new file mode 100644
index 00000000000..c0fe4dcca02
--- /dev/null
+++ b/packages/pieces/community/sign-now/src/i18n/de.json
@@ -0,0 +1,109 @@
+{
+ "eSignature platform for sending, signing, and managing documents.": "eSignature Plattform zum Versenden, Signieren und Verwalten von Dokumenten.",
+ "Cancel Invite to Sign": "Einladung zum Signieren abbrechen",
+ "Upload Document": "Dokument hochladen",
+ "Upload Document & Extract Fields": "Dokument hochladen & Felder extrahieren",
+ "Invite to Sign": "Zum Unterschreiben einladen",
+ "Create Document From Template & Send Free Form Invite": "Dokument aus Vorlage erstellen & kostenlose Formular-Einladung senden",
+ "Create Document From Template & Send Role-Based Invite": "Dokument aus Vorlage erstellen & rollenbasierte Einladung senden",
+ "Create Document Group From Template Group & Send Invite": "Dokumentgruppe aus Vorlagengruppe erstellen & Einladung senden",
+ "Custom API Call": "Eigener API-Aufruf",
+ "Cancels an invite to sign a document.": "Annulliert eine Einladung, ein Dokument zu unterzeichnen.",
+ "Uploads a document to your SignNow account. Supports PDF, Word, PowerPoint, Excel, images, and more.": "Laden Sie ein Dokument auf Ihr SignNow-Konto hoch. Unterstützt PDF, Word, PowerPoint, Excel, Bilder und mehr.",
+ "Uploads a document and automatically converts text tags into SignNow fillable fields.": "Lädt ein Dokument hoch und konvertiert automatisch Text-Tags in ausgefüllte Felder mit SignNow.",
+ "Sends an invite to sign an existing document.": "Sendet eine Einladung, ein existierendes Dokument zu unterzeichnen.",
+ "Creates a new document from a template and sends a free form invite to a signer.": "Erstellt ein neues Dokument aus einer Vorlage und sendet eine kostenlose Einladung an einen Unterzeichner.",
+ "Creates a new document from a template with fillable fields and sends an invite to one or more signers by role.": "Erstellt ein neues Dokument aus einer Vorlage mit ausfüllbaren Feldern und sendet eine Einladung an einen oder mehrere Unterzeichner nach Rolle.",
+ "Creates a new document group from a template group and sends an invite to one or more signers.": "Erstellt eine neue Dokumentgruppe aus einer Vorlagengruppe und sendet eine Einladung an einen oder mehrere Unterzeichner.",
+ "Make a custom authenticated request to any SignNow API endpoint.": "Stellen Sie eine benutzerdefinierte authentifizierte Anfrage an jeden SignNow API Endpunkt.",
+ "Document ID": "Dokument-ID",
+ "Cancellation Reason": "Stornierungsgrund",
+ "File": "Datei",
+ "Parse Text Tags": "Text-Tags analysieren",
+ "Sender's Email": "Absender-E-Mail",
+ "Signers": "Unterzeichner",
+ "Email Subject (All Signers)": "E-Mail-Betreff (Alle Unterzeichner)",
+ "Email Message (All Signers)": "E-Mail Nachricht (alle Signierer)",
+ "CC Recipients": "CC-Empfänger",
+ "CC Email Subject": "CC-E-Mail-Betreff",
+ "CC Email Message": "CC E-Mail Nachricht",
+ "Template ID": "Template-ID",
+ "Document Name": "Dokumentname",
+ "Signer's Email": "Signierer-E-Mail",
+ "Email Subject": "E-Mail-Betreff",
+ "Email Message": "E-Mail Nachricht",
+ "Language": "Sprache",
+ "Redirect URL": "Weiterleitungs-URL",
+ "Close Redirect URL": "Weiterleitungs-URL schließen",
+ "Redirect Target": "Ziel umleiten",
+ "Expiration Days": "Ablauftage",
+ "Document Group Template ID": "Dokumentgruppen-Vorlagen-ID",
+ "Document Group Name": "Dokumentgruppenname",
+ "Method": "Methode",
+ "Headers": "Kopfzeilen",
+ "Query Parameters": "Abfrageparameter",
+ "Body Type": "Körpertyp",
+ "Body": "Körper",
+ "Response is Binary ?": "Antwort ist binär?",
+ "No Error on Failure": "Kein Fehler bei Fehler",
+ "Timeout (in seconds)": "Timeout (in Sekunden)",
+ "Follow redirects": "Weiterleitungen folgen",
+ "The ID of the document whose invite you want to cancel.": "Die ID des Dokuments, dessen Einladung Sie stornieren möchten.",
+ "The reason for cancelling the invite.": "Der Grund für die Absage der Einladung.",
+ "The file to upload. Accepted formats: .pdf, .doc, .docx, .odt, .rtf, .png, .jpg, .jpeg, .gif, .bmp, .xml, .xls, .xlsx, .ppt, .pptx, .ps, .eps. Maximum size: 50 MB.": "Die Datei zum Hochladen. Akzeptierte Formate: .pdf, .doc, .docx, .odt, .rtf, .png, .jpg, . Peg, .gif, .bmp, .xml, .xls, .xlsx, .ppt, .pptx, .ps, .eps. Maximale Größe: 50 MB.",
+ "Enable if your document contains simple text tags that should be converted to fillable fields.": "Aktivieren, wenn Ihr Dokument einfache Text-Tags enthält, die in ausfüllbare Felder umgewandelt werden sollen.",
+ "The file to upload. Text tags in the document (e.g. {{t:s;r:y;o:\"Signer 1\";}}) will be converted to fillable fields. Accepted formats: .pdf, .doc, .docx, .odt, .rtf, .png, .jpg, .jpeg, .gif, .bmp, .xml, .xls, .xlsx, .ppt, .pptx, .ps, .eps. Maximum size: 50 MB.": "Die hochzuladende Datei. Text-Tags im Dokument (z.B. {{t:s;r:y;o:\"Signer 1\";}}) werden in ausfüllbare Felder konvertiert. Akzeptierte Formate: . df, .doc, .docx, .odt, .rtf, .png, .jpg, .jpeg, .gif, .bmp, .xml, .xls, .xlsx, .ppt, .pptx, .ps, .eps. Maximale Größe: 50 MB.",
+ "The ID of the document to send for signing.": "Die ID des zu unterzeichnenden Dokuments.",
+ "Must be the email address associated with your SignNow account.": "Muss die E-Mail-Adresse sein, die mit Ihrem SignNow-Konto verknüpft ist.",
+ "One entry per signer role. Each signer needs an email, role name, and signing order.": "Ein Eintrag pro Unterzeichnerrolle. Jeder Unterzeichner benötigt eine E-Mail, einen Rollennamen und eine unterschriebene Reihenfolge.",
+ "Default email subject for all signers. Overridden by per-signer subject if set.": "Standard E-Mail-Betreff für alle Unterzeichner. Überschrieben von jedem Unterzeichner Betreff wenn gesetzt.",
+ "Default email body for all signers. Overridden by per-signer message if set.": "Standard-E-Mail-Text für alle Signierer. Wird von der Signier-Nachricht überschrieben, wenn gesetzt.",
+ "Email addresses to CC on the invite.": "E-Mail-Adressen an CC auf der Einladung.",
+ "Subject line for CC recipient emails.": "Betreffzeile für CC-Empfänger-E-Mails.",
+ "Body message for CC recipient emails.": "Body-Nachricht für CC-Empfänger-E-Mails.",
+ "The ID of the template to create the document from.": "Die ID der Vorlage, aus der das Dokument erstellt werden soll.",
+ "Name for the new document. Defaults to the template name if not provided.": "Name für das neue Dokument. Standardmäßig wird der Vorlagenname angegeben, wenn nicht angegeben.",
+ "Email address of the signer. A free form invite can be sent to the sender's own email address.": "E-Mail-Adresse des Unterzeichners. Eine kostenlose Einladung kann an die eigene E-Mail-Adresse des Absenders gesendet werden.",
+ "Subject line of the invite email sent to the signer.": "Betreff der Einladungs-E-Mail an den Unterzeichner.",
+ "Body message of the invite email sent to the signer.": "Body Nachricht der Einladungs-E-Mail an den Unterzeichner.",
+ "Subject line of the email sent to CC recipients.": "Betreff der E-Mail an CC-Empfänger.",
+ "Body message of the email sent to CC recipients.": "Body Nachricht der E-Mail, die an CC-Empfänger gesendet wurde.",
+ "Language for the signing session and notification emails.": "Sprache für die Signatursitzung und Benachrichtigungs-E-Mails.",
+ "URL the signer is redirected to after signing.": "URL zu der der Unterzeichner nach der Unterschrift weitergeleitet wird.",
+ "URL that opens when the signer clicks the Close button.": "URL, die sich öffnet, wenn der Unterzeichner auf die Schaltfläche Schließen klickt.",
+ "Whether to open the redirect URL in a new tab or the same tab.": "Gibt an, ob die Umleitungs-URL in einem neuen Tab oder im selben Tab geöffnet werden soll.",
+ "One entry per signer role defined in the template. Each signer must have an email and a role name (e.g. \"Signer 1\").": "Ein Eintrag pro Unterzeichnerrolle im Template definiert. Jeder Unterzeichner muss eine E-Mail und einen Rollennamen haben (z.B. \"Signer 1\").",
+ "Default email subject sent to all signers. Overridden by per-signer subject if set.": "Standard-E-Mail-Betreff an alle Unterzeichner gesendet. Wird von jedem Unterzeichner überschrieben, falls gesetzt.",
+ "Default email body sent to all signers. Overridden by per-signer message if set.": "Standard-E-Mail-Board, der an alle Unterzeichner gesendet wird. Wird von der Unterzeichner-Nachricht überschrieben, falls gesetzt.",
+ "Number of days before the invite expires (3–180). Defaults to 30.": "Anzahl der Tage vor Ablauf der Einladung (3–180). Standard ist 30.",
+ "The unique ID of the document group template.": "Die eindeutige ID der Dokumentgruppenvorlage.",
+ "Name for the new document group.": "Name für die neue Dokumentgruppe.",
+ "One entry per signer. Each signer needs an email, role name, and the document they are signing within the group. Signing order determines the step sequence.": "Ein Eintrag pro Unterzeichner. Jeder Unterzeichner benötigt eine E-Mail, einen Rollennamen und das Dokument, das er in der Gruppe unterzeichnet. Signierungsreihenfolge bestimmt die Schrittsequenz.",
+ "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 usw.",
+ "English": "Englisch",
+ "Spanish": "Spanisch",
+ "French": "Französisch",
+ "New tab": "New tab",
+ "Same tab": "Same tab",
+ "GET": "ERHALTEN",
+ "POST": "POST",
+ "PATCH": "PATCH",
+ "PUT": "PUT",
+ "DELETE": "LÖSCHEN",
+ "HEAD": "HEAD",
+ "None": "Keine",
+ "JSON": "JSON",
+ "Form Data": "Formulardaten",
+ "Raw": "Rohe",
+ "New Document": "Neues Dokument",
+ "Document Updated": "Dokument aktualisiert",
+ "Document Completed": "Dokument abgeschlossen",
+ "Document Deleted": "Dokument gelöscht",
+ "Document Group Completed": "Dokumentengruppe abgeschlossen",
+ "Triggers when a document has been uploaded to SignNow.": "Wird ausgelöst, wenn ein Dokument zum Signieren hochgeladen wurde.",
+ "Triggers when a document has been updated.": "Wird ausgelöst, wenn ein Dokument aktualisiert wurde.",
+ "Triggers when all signers have filled in and signed the document.": "Trigger wenn alle Unterzeichner das Dokument ausgefüllt und unterzeichnet haben.",
+ "Triggers when a document has been deleted.": "Wird ausgelöst, wenn ein Dokument gelöscht wurde.",
+ "Triggers when all signers have filled in and signed the document group.": "Wird ausgelöst, wenn alle Unterzeichner die Dokumentgruppe ausgefüllt und unterzeichnet haben."
+}
\ No newline at end of file
diff --git a/packages/pieces/community/sign-now/src/i18n/es.json b/packages/pieces/community/sign-now/src/i18n/es.json
new file mode 100644
index 00000000000..60309728e1f
--- /dev/null
+++ b/packages/pieces/community/sign-now/src/i18n/es.json
@@ -0,0 +1,109 @@
+{
+ "eSignature platform for sending, signing, and managing documents.": "Plataforma de eSignature para enviar, firmar y administrar documentos.",
+ "Cancel Invite to Sign": "Cancelar invitación al signo",
+ "Upload Document": "Subir Documento",
+ "Upload Document & Extract Fields": "Subir documentos y extraer campos",
+ "Invite to Sign": "Invitar al signo",
+ "Create Document From Template & Send Free Form Invite": "Crear documento a partir de plantilla y enviar invitación gratuita de formulario",
+ "Create Document From Template & Send Role-Based Invite": "Crear documento a partir de plantilla y enviar invitación basada en roles",
+ "Create Document Group From Template Group & Send Invite": "Crear Grupo de Documentos a partir del Grupo de Plantillas y Enviar Invitación",
+ "Custom API Call": "Llamada API personalizada",
+ "Cancels an invite to sign a document.": "Cancela una invitación para firmar un documento.",
+ "Uploads a document to your SignNow account. Supports PDF, Word, PowerPoint, Excel, images, and more.": "Sube un documento a tu cuenta de SignNow. Soporta PDF, Word, PowerPoint, Excel, imágenes y más.",
+ "Uploads a document and automatically converts text tags into SignNow fillable fields.": "Sube un documento y convierte automáticamente etiquetas de texto en campos rellenables de SignNow.",
+ "Sends an invite to sign an existing document.": "Envía una invitación para firmar un documento existente.",
+ "Creates a new document from a template and sends a free form invite to a signer.": "Crea un nuevo documento a partir de una plantilla y envía una invitación de formulario libre a un firmante.",
+ "Creates a new document from a template with fillable fields and sends an invite to one or more signers by role.": "Crea un nuevo documento a partir de una plantilla con campos rellenables y envía una invitación a uno o más firmantes por rol.",
+ "Creates a new document group from a template group and sends an invite to one or more signers.": "Crea un nuevo grupo de documentos a partir de un grupo de plantillas y envía una invitación a uno o más firmantes.",
+ "Make a custom authenticated request to any SignNow API endpoint.": "Hacer una petición personalizada autenticada a cualquier punto final de la API de SignNow.",
+ "Document ID": "ID del documento",
+ "Cancellation Reason": "Motivo de la cancelación",
+ "File": "Archivo",
+ "Parse Text Tags": "Analizar etiquetas de texto",
+ "Sender's Email": "Email del remitente",
+ "Signers": "Firmadores",
+ "Email Subject (All Signers)": "Asunto de correo electrónico (todos los firmantes)",
+ "Email Message (All Signers)": "Mensaje de correo (todos los firmantes)",
+ "CC Recipients": "Destinatarios CC",
+ "CC Email Subject": "Asunto de Email CC",
+ "CC Email Message": "Mensaje de Email CC",
+ "Template ID": "ID de plantilla",
+ "Document Name": "Nombre del documento",
+ "Signer's Email": "Email del firmante",
+ "Email Subject": "Asunto de Email",
+ "Email Message": "Mensaje de email",
+ "Language": "Idioma",
+ "Redirect URL": "URL de redirección",
+ "Close Redirect URL": "Cerrar URL de redirección",
+ "Redirect Target": "Redirigir objetivo",
+ "Expiration Days": "Días de caducidad",
+ "Document Group Template ID": "ID de plantilla de grupo de documentos",
+ "Document Group Name": "Nombre del Grupo de Documentos",
+ "Method": "Método",
+ "Headers": "Encabezados",
+ "Query Parameters": "Parámetros de consulta",
+ "Body Type": "Tipo de cuerpo",
+ "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)",
+ "Follow redirects": "Seguir redirecciones",
+ "The ID of the document whose invite you want to cancel.": "El ID del documento cuya invitación desea cancelar.",
+ "The reason for cancelling the invite.": "La razón para cancelar la invitación.",
+ "The file to upload. Accepted formats: .pdf, .doc, .docx, .odt, .rtf, .png, .jpg, .jpeg, .gif, .bmp, .xml, .xls, .xlsx, .ppt, .pptx, .ps, .eps. Maximum size: 50 MB.": "El archivo a cargar. Formatos aceptados: .pdf, .doc, .docx, .odt, .rtf, .png, .jpg, . peg, .gif, .bmp, .xml, .xls, .xlsx, .ppt, .ptx, .ps, .eps. Tamaño máximo: 50 MB.",
+ "Enable if your document contains simple text tags that should be converted to fillable fields.": "Activar si el documento contiene etiquetas de texto simples que deben ser convertidas a campos rellenables.",
+ "The file to upload. Text tags in the document (e.g. {{t:s;r:y;o:\"Signer 1\";}}) will be converted to fillable fields. Accepted formats: .pdf, .doc, .docx, .odt, .rtf, .png, .jpg, .jpeg, .gif, .bmp, .xml, .xls, .xlsx, .ppt, .pptx, .ps, .eps. Maximum size: 50 MB.": "El archivo a subir. Etiquetas de texto en el documento (por ejemplo, {{t:s;r:y;o:\"Signer 1\";}}) se convertirán en campos rellenables. Formatos aceptados: . df, .doc, .docx, .odt, .rtf, .png, .jpg, .jpeg, .gif, .bmp, .xml, .xls, .xlsx, .ppt, .ptx, .ps, .eps. Tamaño máximo: 50 MB.",
+ "The ID of the document to send for signing.": "El ID del documento a enviar para la firma.",
+ "Must be the email address associated with your SignNow account.": "Debe ser la dirección de correo electrónico asociada a su cuenta de SignNow.",
+ "One entry per signer role. Each signer needs an email, role name, and signing order.": "Una entrada por rol de firmante. Cada firmante necesita un correo electrónico, nombre de rol y orden de firma.",
+ "Default email subject for all signers. Overridden by per-signer subject if set.": "Asunto de correo electrónico por defecto para todos los firmantes. Sobrescrito por el asunto por firma si se establece.",
+ "Default email body for all signers. Overridden by per-signer message if set.": "Cuerpo de correo electrónico por defecto para todos los firmantes. Si se establece, se reemplaza por mensaje por firmante.",
+ "Email addresses to CC on the invite.": "Direcciones de correo electrónico a CC en la invitación.",
+ "Subject line for CC recipient emails.": "Línea de asunto para correos electrónicos del destinatario de CC.",
+ "Body message for CC recipient emails.": "Mensaje corporal para los correos electrónicos del destinatario de CC.",
+ "The ID of the template to create the document from.": "El ID de la plantilla para crear el documento.",
+ "Name for the new document. Defaults to the template name if not provided.": "Nombre del nuevo documento. Por defecto es el nombre de la plantilla si no se proporciona.",
+ "Email address of the signer. A free form invite can be sent to the sender's own email address.": "Dirección de correo electrónico del firmante. Una invitación gratuita puede ser enviada a la propia dirección de correo electrónico del remitente.",
+ "Subject line of the invite email sent to the signer.": "Línea del asunto del correo de invitación enviado al firmante.",
+ "Body message of the invite email sent to the signer.": "Mensaje corporal del correo de invitación enviado al firmante.",
+ "Subject line of the email sent to CC recipients.": "Línea del asunto del correo electrónico enviado a los destinatarios de CC.",
+ "Body message of the email sent to CC recipients.": "Mensaje corporal del correo electrónico enviado a los destinatarios de CC.",
+ "Language for the signing session and notification emails.": "Idioma para la firma de los correos electrónicos de sesión y notificaciones.",
+ "URL the signer is redirected to after signing.": "URL a la que el firmante es redirigido después de firmar.",
+ "URL that opens when the signer clicks the Close button.": "URL que se abre cuando el firmante hace clic en el botón Cerrar.",
+ "Whether to open the redirect URL in a new tab or the same tab.": "Si abrir la URL de redirección en una nueva pestaña o en la misma pestaña.",
+ "One entry per signer role defined in the template. Each signer must have an email and a role name (e.g. \"Signer 1\").": "Una entrada por rol de firma definida en la plantilla. Cada firmante debe tener un correo electrónico y un nombre de rol (por ejemplo, \"Firma 1\").",
+ "Default email subject sent to all signers. Overridden by per-signer subject if set.": "Asunto de correo electrónico por defecto enviado a todos los firmantes. Reemplazado por el asunto por firma si se establece.",
+ "Default email body sent to all signers. Overridden by per-signer message if set.": "Cuerpo de correo electrónico por defecto enviado a todos los firmantes. Reemplazado por mensaje por firma si se establece.",
+ "Number of days before the invite expires (3–180). Defaults to 30.": "Número de días antes de que la invitación expire (3–180). Por defecto es 30.",
+ "The unique ID of the document group template.": "El ID único de la plantilla de grupo de documentos.",
+ "Name for the new document group.": "Nombre para el nuevo grupo de documentos.",
+ "One entry per signer. Each signer needs an email, role name, and the document they are signing within the group. Signing order determines the step sequence.": "Una entrada por firmante. Cada firmante necesita un correo electrónico, nombre de rol y el documento que están firmando dentro del grupo. El orden de firma determina la secuencia de pasos.",
+ "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.",
+ "English": "Inglés",
+ "Spanish": "Español",
+ "French": "Francés",
+ "New tab": "New tab",
+ "Same tab": "Same tab",
+ "GET": "RECOGER",
+ "POST": "POST",
+ "PATCH": "PATCH",
+ "PUT": "PUT",
+ "DELETE": "BORRAR",
+ "HEAD": "LIMPIO",
+ "None": "Ninguna",
+ "JSON": "JSON",
+ "Form Data": "Datos de Formulario",
+ "Raw": "Rápido",
+ "New Document": "Nuevo documento",
+ "Document Updated": "Documento actualizado",
+ "Document Completed": "Documento completado",
+ "Document Deleted": "Documento eliminado",
+ "Document Group Completed": "Grupo de documentos completado",
+ "Triggers when a document has been uploaded to SignNow.": "Dispara cuando un documento ha sido subido a SignNow.",
+ "Triggers when a document has been updated.": "Se activa cuando un documento ha sido actualizado.",
+ "Triggers when all signers have filled in and signed the document.": "Dispara cuando todos los firmantes han rellenado y firmado el documento.",
+ "Triggers when a document has been deleted.": "Dispara cuando un documento ha sido eliminado.",
+ "Triggers when all signers have filled in and signed the document group.": "Dispara cuando todos los firmantes han rellenado y firmado el grupo de documentos."
+}
\ No newline at end of file
diff --git a/packages/pieces/community/sign-now/src/i18n/fr.json b/packages/pieces/community/sign-now/src/i18n/fr.json
new file mode 100644
index 00000000000..08f763715e1
--- /dev/null
+++ b/packages/pieces/community/sign-now/src/i18n/fr.json
@@ -0,0 +1,109 @@
+{
+ "eSignature platform for sending, signing, and managing documents.": "Plateforme eSignature pour l’envoi, la signature et la gestion des documents.",
+ "Cancel Invite to Sign": "Annuler l'invitation à signer",
+ "Upload Document": "Télécharger le document",
+ "Upload Document & Extract Fields": "Télécharger des champs de document et d'extraction",
+ "Invite to Sign": "Inviter à signer",
+ "Create Document From Template & Send Free Form Invite": "Créer un document à partir du modèle et envoyer une invitation de formulaire gratuite",
+ "Create Document From Template & Send Role-Based Invite": "Créer un document à partir du modèle et envoyer une invitation basée sur les rôles",
+ "Create Document Group From Template Group & Send Invite": "Créer un groupe de documents à partir d'un groupe de gabarits et envoyer une invitation",
+ "Custom API Call": "Appel d'API personnalisé",
+ "Cancels an invite to sign a document.": "Annule une invitation à signer un document.",
+ "Uploads a document to your SignNow account. Supports PDF, Word, PowerPoint, Excel, images, and more.": "Télécharge un document sur votre compte SignNow. Supporte PDF, Word, PowerPoint, Excel, images et plus encore.",
+ "Uploads a document and automatically converts text tags into SignNow fillable fields.": "Télécharge un document et convertit automatiquement les balises texte dans les champs remplissables SignNow.",
+ "Sends an invite to sign an existing document.": "Envoie une invitation à signer un document existant.",
+ "Creates a new document from a template and sends a free form invite to a signer.": "Crée un nouveau document à partir d'un modèle et envoie une invitation gratuite à un signataire.",
+ "Creates a new document from a template with fillable fields and sends an invite to one or more signers by role.": "Crée un nouveau document à partir d'un modèle avec des champs remplissables et envoie une invitation à un ou plusieurs signataires par rôle.",
+ "Creates a new document group from a template group and sends an invite to one or more signers.": "Crée un nouveau groupe de documents à partir d'un groupe de gabarits et envoie une invitation à un ou plusieurs signataires.",
+ "Make a custom authenticated request to any SignNow API endpoint.": "Faites une requête personnalisée authentifiée vers n'importe quel point de terminaison de l'API SignNow.",
+ "Document ID": "ID du document",
+ "Cancellation Reason": "Raison de l'annulation",
+ "File": "Ficher",
+ "Parse Text Tags": "Analyser les balises de texte",
+ "Sender's Email": "E-mail de l'expéditeur",
+ "Signers": "Signataires",
+ "Email Subject (All Signers)": "Sujet de l'e-mail (tous les signataires)",
+ "Email Message (All Signers)": "Message E-mail (tous les signataires)",
+ "CC Recipients": "Destinataires CC",
+ "CC Email Subject": "Objet de l'e-mail CC",
+ "CC Email Message": "Message de courriel CC",
+ "Template ID": "ID du modèle",
+ "Document Name": "Nom du document",
+ "Signer's Email": "Courriel du signataire",
+ "Email Subject": "Sujet de l'e-mail",
+ "Email Message": "Courriel",
+ "Language": "Langue",
+ "Redirect URL": "URL de redirection",
+ "Close Redirect URL": "Fermer l'URL de redirection",
+ "Redirect Target": "Rediriger la cible",
+ "Expiration Days": "Jours d'expiration",
+ "Document Group Template ID": "ID du modèle de groupe de document",
+ "Document Group Name": "Nom du groupe de documents",
+ "Method": "Méthode",
+ "Headers": "Headers",
+ "Query Parameters": "Paramètres de requête",
+ "Body Type": "Body Type",
+ "Body": "Body",
+ "Response is Binary ?": "La réponse est Binaire ?",
+ "No Error on Failure": "Aucune erreur en cas d'échec",
+ "Timeout (in seconds)": "Délai d'expiration (en secondes)",
+ "Follow redirects": "Suivre les redirections",
+ "The ID of the document whose invite you want to cancel.": "L'ID du document que vous souhaitez annuler.",
+ "The reason for cancelling the invite.": "La raison de l'annulation de l'invitation.",
+ "The file to upload. Accepted formats: .pdf, .doc, .docx, .odt, .rtf, .png, .jpg, .jpeg, .gif, .bmp, .xml, .xls, .xlsx, .ppt, .pptx, .ps, .eps. Maximum size: 50 MB.": "Le fichier à télécharger. Formats acceptés : .pdf, .doc, .docx, .odt, .rtf, .png, .jpg, . peg, .gif, .bmp, .xml, .xls, .xlsx, .ppt, .pptx, .ps, .eps. Taille maximale : 50 Mo.",
+ "Enable if your document contains simple text tags that should be converted to fillable fields.": "Activer si votre document contient des balises texte simples qui doivent être converties en champs remplissables.",
+ "The file to upload. Text tags in the document (e.g. {{t:s;r:y;o:\"Signer 1\";}}) will be converted to fillable fields. Accepted formats: .pdf, .doc, .docx, .odt, .rtf, .png, .jpg, .jpeg, .gif, .bmp, .xml, .xls, .xlsx, .ppt, .pptx, .ps, .eps. Maximum size: 50 MB.": "Le fichier à télécharger. Les balises texte dans le document (par exemple {{t:s;r:y;o:\"Signer 1\";}}) seront converties en champs remplissables. Formats acceptés : . df, .doc, .docx, .odt, .rtf, .png, .jpg, .jpeg, .gif, .bmp, .xml, .xls, .xlsx, .ppt, .pptx, .ps, .eps. Taille maximale : 50 Mo.",
+ "The ID of the document to send for signing.": "L'ID du document à envoyer à signer.",
+ "Must be the email address associated with your SignNow account.": "Doit être l'adresse e-mail associée à votre compte SignNow.",
+ "One entry per signer role. Each signer needs an email, role name, and signing order.": "Une entrée par rôle de signataire. Chaque signataire a besoin d'un e-mail, d'un nom de rôle et d'un ordre de signature.",
+ "Default email subject for all signers. Overridden by per-signer subject if set.": "Sujet de courriel par défaut pour tous les signataires. Remplacé par le sujet par signataire si défini.",
+ "Default email body for all signers. Overridden by per-signer message if set.": "Corps de courriel par défaut pour tous les signataires. Remplacé par le message par signataire si défini.",
+ "Email addresses to CC on the invite.": "Adresses e-mail à CC sur l'invitation.",
+ "Subject line for CC recipient emails.": "Subject line for CC recipient emails.",
+ "Body message for CC recipient emails.": "Corps du message pour les e-mails du destinataire CC.",
+ "The ID of the template to create the document from.": "L'ID du modèle à partir duquel créer le document.",
+ "Name for the new document. Defaults to the template name if not provided.": "Nom du nouveau document. Par défaut, le nom du modèle n'est pas fourni.",
+ "Email address of the signer. A free form invite can be sent to the sender's own email address.": "Adresse e-mail du signataire. Une invitation de formulaire gratuit peut être envoyée à la propre adresse e-mail de l'expéditeur.",
+ "Subject line of the invite email sent to the signer.": "Sujet de l'e-mail d'invitation envoyé au signataire.",
+ "Body message of the invite email sent to the signer.": "Corps du message d'invitation envoyé au signataire.",
+ "Subject line of the email sent to CC recipients.": "Sujet de l'e-mail envoyé aux destinataires de la CC.",
+ "Body message of the email sent to CC recipients.": "Corps du message envoyé aux destinataires de la CC.",
+ "Language for the signing session and notification emails.": "Langue pour la session de signature et les e-mails de notification.",
+ "URL the signer is redirected to after signing.": "URL vers laquelle le signataire est redirigé après la signature.",
+ "URL that opens when the signer clicks the Close button.": "URL qui s'ouvre lorsque le signataire clique sur le bouton Fermer.",
+ "Whether to open the redirect URL in a new tab or the same tab.": "Ouvrir l'URL de redirection dans un nouvel onglet ou dans le même onglet.",
+ "One entry per signer role defined in the template. Each signer must have an email and a role name (e.g. \"Signer 1\").": "Une entrée par rôle de signataire défini dans le modèle. Chaque signataire doit avoir un e-mail et un nom de rôle (par exemple \"Signer 1\").",
+ "Default email subject sent to all signers. Overridden by per-signer subject if set.": "Sujet par défaut de l'e-mail envoyé à tous les signataires. Remplacé par l'objet par signataire si défini.",
+ "Default email body sent to all signers. Overridden by per-signer message if set.": "Corps d'e-mail par défaut envoyé à tous les signataires. Remplacé par le message par signataire si défini.",
+ "Number of days before the invite expires (3–180). Defaults to 30.": "Nombre de jours avant l'expiration de l'invitation (3-180). 30 par défaut.",
+ "The unique ID of the document group template.": "L'ID unique du modèle de groupe de documents.",
+ "Name for the new document group.": "Nom du nouveau groupe de documents.",
+ "One entry per signer. Each signer needs an email, role name, and the document they are signing within the group. Signing order determines the step sequence.": "Une entrée par signataire. Chaque signataire a besoin d'un courriel, d'un nom de rôle et du document qu'ils signent au sein du groupe. L'ordre de signature détermine la séquence d'étape.",
+ "Authorization headers are injected automatically from your connection.": "Les Headers 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.",
+ "English": "Anglais",
+ "Spanish": "Espagnol",
+ "French": "Français",
+ "New tab": "New tab",
+ "Same tab": "Same tab",
+ "GET": "GET",
+ "POST": "POST",
+ "PATCH": "PATCH",
+ "PUT": "PUT",
+ "DELETE": "DELETE",
+ "HEAD": "HEAD",
+ "None": "Aucun",
+ "JSON": "JSON",
+ "Form Data": "Données du formulaire",
+ "Raw": "Brut",
+ "New Document": "Nouveau document",
+ "Document Updated": "Document mis à jour",
+ "Document Completed": "Document terminé",
+ "Document Deleted": "Document supprimé",
+ "Document Group Completed": "Groupe de documents terminé",
+ "Triggers when a document has been uploaded to SignNow.": "Déclenche lorsqu'un document a été téléchargé sur SignNow.",
+ "Triggers when a document has been updated.": "Déclenche lorsqu'un document a été mis à jour.",
+ "Triggers when all signers have filled in and signed the document.": "Déclenche lorsque tous les signataires ont rempli et signé le document.",
+ "Triggers when a document has been deleted.": "Déclenche lorsqu'un document a été supprimé.",
+ "Triggers when all signers have filled in and signed the document group.": "Déclenche lorsque tous les signataires ont rempli et signé le groupe de documents."
+}
\ No newline at end of file
diff --git a/packages/pieces/community/sign-now/src/i18n/ja.json b/packages/pieces/community/sign-now/src/i18n/ja.json
new file mode 100644
index 00000000000..91c28bc3630
--- /dev/null
+++ b/packages/pieces/community/sign-now/src/i18n/ja.json
@@ -0,0 +1,109 @@
+{
+ "eSignature platform for sending, signing, and managing documents.": "eSignature platform for sending, signing, and managing documents.",
+ "Cancel Invite to Sign": "サインする招待をキャンセル",
+ "Upload Document": "ドキュメントをアップロード",
+ "Upload Document & Extract Fields": "ドキュメントのアップロードとフィールドの抽出",
+ "Invite to Sign": "サインに招待する",
+ "Create Document From Template & Send Free Form Invite": "テンプレートからドキュメントを作成し、無料のフォーム招待を送信する",
+ "Create Document From Template & Send Role-Based Invite": "テンプレートからドキュメントを作成し、ロールベースの招待を送信する",
+ "Create Document Group From Template Group & Send Invite": "テンプレートグループからドキュメントグループを作成して招待を送信する",
+ "Custom API Call": "カスタムAPI呼び出し",
+ "Cancels an invite to sign a document.": "ドキュメントに署名する招待をキャンセルします。",
+ "Uploads a document to your SignNow account. Supports PDF, Word, PowerPoint, Excel, images, and more.": "SignNowアカウントにドキュメントをアップロードします。PDF、Word、PowerPoint、Excel、画像などに対応しています。",
+ "Uploads a document and automatically converts text tags into SignNow fillable fields.": "ドキュメントをアップロードし、自動的に SignNow 入力可能フィールドにテキストタグを変換します。",
+ "Sends an invite to sign an existing document.": "既存のドキュメントに署名する招待状を送信します。",
+ "Creates a new document from a template and sends a free form invite to a signer.": "テンプレートから新しいドキュメントを作成し、自由なフォームの招待状を署名者に送信します。",
+ "Creates a new document from a template with fillable fields and sends an invite to one or more signers by role.": "入力可能なフィールドを持つテンプレートから新しいドキュメントを作成し、ロールごとに1つ以上の署名者に招待状を送信します。",
+ "Creates a new document group from a template group and sends an invite to one or more signers.": "テンプレートグループから新しいドキュメントグループを作成し、1つ以上の署名者に招待状を送信します。",
+ "Make a custom authenticated request to any SignNow API endpoint.": "任意の SignNow API エンドポイントに、カスタム認証済みリクエストを作成します。",
+ "Document ID": "ドキュメントID",
+ "Cancellation Reason": "キャンセルの理由",
+ "File": "ファイル",
+ "Parse Text Tags": "テキストタグを解析",
+ "Sender's Email": "送信者のメールアドレス",
+ "Signers": "署名者",
+ "Email Subject (All Signers)": "メール件名(すべての署名者)",
+ "Email Message (All Signers)": "メールメッセージ(すべての署名者)",
+ "CC Recipients": "CC受信者",
+ "CC Email Subject": "CCメール件名",
+ "CC Email Message": "CCメールメッセージ",
+ "Template ID": "テンプレートID",
+ "Document Name": "ドキュメント名",
+ "Signer's Email": "署名者のメールアドレス",
+ "Email Subject": "メールの件名",
+ "Email Message": "電子メールメッセージ",
+ "Language": "言語",
+ "Redirect URL": "リダイレクトURL",
+ "Close Redirect URL": "リダイレクトURLを閉じる",
+ "Redirect Target": "ターゲットのリダイレクト",
+ "Expiration Days": "有効期限",
+ "Document Group Template ID": "ドキュメントグループテンプレートID",
+ "Document Group Name": "ドキュメントグループ名",
+ "Method": "方法",
+ "Headers": "ヘッダー",
+ "Query Parameters": "クエリパラメータ",
+ "Body Type": "ボディタイプ",
+ "Body": "本文",
+ "Response is Binary ?": "応答はバイナリですか?",
+ "No Error on Failure": "失敗時にエラーはありません",
+ "Timeout (in seconds)": "タイムアウト(秒)",
+ "Follow redirects": "リダイレクトをフォローする",
+ "The ID of the document whose invite you want to cancel.": "招待をキャンセルしたいドキュメントのID。",
+ "The reason for cancelling the invite.": "招待をキャンセルした理由。",
+ "The file to upload. Accepted formats: .pdf, .doc, .docx, .odt, .rtf, .png, .jpg, .jpeg, .gif, .bmp, .xml, .xls, .xlsx, .ppt, .pptx, .ps, .eps. Maximum size: 50 MB.": "アップロードするファイル。使用可能な形式:.pdf、.doc、.docx、.odt、.rtf、.png、.jpg。 peg, .gif, .bmp, .xml, .xls, .xlsx, .ppt, .pptx, .ps, .eps. 最大サイズ: 50 MB.",
+ "Enable if your document contains simple text tags that should be converted to fillable fields.": "ドキュメントに記入可能なフィールドに変換する単純なテキストタグが含まれている場合に有効にします。",
+ "The file to upload. Text tags in the document (e.g. {{t:s;r:y;o:\"Signer 1\";}}) will be converted to fillable fields. Accepted formats: .pdf, .doc, .docx, .odt, .rtf, .png, .jpg, .jpeg, .gif, .bmp, .xml, .xls, .xlsx, .ppt, .pptx, .ps, .eps. Maximum size: 50 MB.": "アップロードするファイル。ドキュメント内のテキストタグ(例:{{t:s;r:y;o:\"Signer 1\";}}) は入力可能なフィールドに変換されます。 df, .doc, .docx, .odt, .rtf, .png, .jpeg, .gif, .bmp, .xml, .xls, .xlsx, .ppt, .pptx, .ps, .eps. 最大サイズ: 50 MB.",
+ "The ID of the document to send for signing.": "署名のために送信するドキュメントのID。",
+ "Must be the email address associated with your SignNow account.": "SignNowアカウントに関連付けられているメールアドレスである必要があります。",
+ "One entry per signer role. Each signer needs an email, role name, and signing order.": "署名者のロールごとに1つのエントリがあります。各署名者はメール、ロール名、および署名順を必要とします。",
+ "Default email subject for all signers. Overridden by per-signer subject if set.": "すべての署名者のデフォルトのメール件名。設定されている場合は、署名者ごとの件名が上書きされます。",
+ "Default email body for all signers. Overridden by per-signer message if set.": "すべての署名者のデフォルトのメール本文。設定されている場合は、署名者ごとのメッセージで上書きされます。",
+ "Email addresses to CC on the invite.": "招待時にCCにメールアドレスを送信します。",
+ "Subject line for CC recipient emails.": "CC受信者メールの件名です。",
+ "Body message for CC recipient emails.": "CC受信者メールの本文メッセージ。",
+ "The ID of the template to create the document from.": "ドキュメントを作成するテンプレートのID。",
+ "Name for the new document. Defaults to the template name if not provided.": "新規ドキュメントの名前。指定されていない場合はテンプレート名がデフォルトです。",
+ "Email address of the signer. A free form invite can be sent to the sender's own email address.": "署名者のメールアドレス。無料フォームの招待状を送信者自身のメールアドレスに送信できます。",
+ "Subject line of the invite email sent to the signer.": "署名者に送信された招待メールの件名です。",
+ "Body message of the invite email sent to the signer.": "シグナーに送信された招待メールの本文メッセージ。",
+ "Subject line of the email sent to CC recipients.": "CC受信者に送信されたメールの件名。",
+ "Body message of the email sent to CC recipients.": "CC受信者に送信されたメールの本文メッセージ。",
+ "Language for the signing session and notification emails.": "署名セッションと通知メールの言語。",
+ "URL the signer is redirected to after signing.": "署名後に署名者がリダイレクトされます。",
+ "URL that opens when the signer clicks the Close button.": "署名者が閉じるボタンをクリックしたときに開くURL。",
+ "Whether to open the redirect URL in a new tab or the same tab.": "リダイレクトURLを新しいタブまたは同じタブで開くかどうか。",
+ "One entry per signer role defined in the template. Each signer must have an email and a role name (e.g. \"Signer 1\").": "テンプレート内で定義されているシグナーロールごとに1つのエントリ。各シグナーはメールアドレスと役割名(例:「シグナー1」)を持つ必要があります。",
+ "Default email subject sent to all signers. Overridden by per-signer subject if set.": "すべての署名者に送信されたデフォルトのメール件名。設定されている場合は、署名者ごとの件名が上書きされます。",
+ "Default email body sent to all signers. Overridden by per-signer message if set.": "すべての署名者に送信された既定のメール本文。設定されている場合は、署名者ごとのメッセージで上書きされます。",
+ "Number of days before the invite expires (3–180). Defaults to 30.": "招待の有効期限が切れるまでの日数。デフォルトは30です。",
+ "The unique ID of the document group template.": "ドキュメントグループテンプレートの一意のID。",
+ "Name for the new document group.": "新しいドキュメント グループの名前。",
+ "One entry per signer. Each signer needs an email, role name, and the document they are signing within the group. Signing order determines the step sequence.": "署名者ごとに 1 つのエントリ。各署名者は、メール、ロール名、およびグループ内で署名するドキュメントを必要とします。 署名順はステップシーケンスを決定します。",
+ "Authorization headers are injected automatically from your connection.": "認証ヘッダは接続から自動的に注入されます。",
+ "Enable for files like PDFs, images, etc.": "PDF、画像などのファイルを有効にする",
+ "English": "日本語",
+ "Spanish": "スペイン語",
+ "French": "フランス語",
+ "New tab": "New tab",
+ "Same tab": "Same tab",
+ "GET": "GET",
+ "POST": "POST",
+ "PATCH": "PATCH",
+ "PUT": "PUT",
+ "DELETE": "DELETE",
+ "HEAD": "HEAD",
+ "None": "なし",
+ "JSON": "JSON",
+ "Form Data": "フォームデータ",
+ "Raw": "Raw",
+ "New Document": "新しいドキュメント",
+ "Document Updated": "ドキュメントが更新されました",
+ "Document Completed": "ドキュメントが完了しました",
+ "Document Deleted": "ドキュメントが削除されました",
+ "Document Group Completed": "ドキュメントグループが完了しました",
+ "Triggers when a document has been uploaded to SignNow.": "ドキュメントが SignNow にアップロードされたときにトリガーします。",
+ "Triggers when a document has been updated.": "ドキュメントが更新されたときにトリガーします。",
+ "Triggers when all signers have filled in and signed the document.": "すべての署名者がドキュメントに記入して署名したときにトリガーします。",
+ "Triggers when a document has been deleted.": "ドキュメントが削除されたときにトリガーします。",
+ "Triggers when all signers have filled in and signed the document group.": "すべての署名者がドキュメントグループに入力して署名したときにトリガーします。"
+}
\ No newline at end of file
diff --git a/packages/pieces/community/sign-now/src/i18n/nl.json b/packages/pieces/community/sign-now/src/i18n/nl.json
new file mode 100644
index 00000000000..b6c1e8af99c
--- /dev/null
+++ b/packages/pieces/community/sign-now/src/i18n/nl.json
@@ -0,0 +1,109 @@
+{
+ "eSignature platform for sending, signing, and managing documents.": "eSignature platform voor het verzenden, ondertekenen en beheren van documenten.",
+ "Cancel Invite to Sign": "Annuleer Uitnodigen om te ondertekenen",
+ "Upload Document": "Document uploaden",
+ "Upload Document & Extract Fields": "Document & Afvoer velden uploaden",
+ "Invite to Sign": "Uitnodigen om te ondertekenen",
+ "Create Document From Template & Send Free Form Invite": "Document maken van sjabloon en gratis formulieruitnodiging verzenden",
+ "Create Document From Template & Send Role-Based Invite": "Document maken van sjabloon & Role-based uitnodiging verzenden",
+ "Create Document Group From Template Group & Send Invite": "Documentgroep maken van sjabloongroep & uitnodiging verzenden",
+ "Custom API Call": "Custom API Call",
+ "Cancels an invite to sign a document.": "Annuleert een uitnodiging om een document te ondertekenen.",
+ "Uploads a document to your SignNow account. Supports PDF, Word, PowerPoint, Excel, images, and more.": "Uploads een document naar uw SignNow account. Ondersteunt PDF, Word, PowerPoint, Excel, afbeeldingen en meer.",
+ "Uploads a document and automatically converts text tags into SignNow fillable fields.": "Uploaden van een document en converteert automatisch tekst tags in Signow filterbare velden.",
+ "Sends an invite to sign an existing document.": "Verstuurt een uitnodiging om een bestaand document te ondertekenen.",
+ "Creates a new document from a template and sends a free form invite to a signer.": "Maakt een nieuw document van een sjabloon aan en verstuurt een gratis formulieruitnodiging naar een signer.",
+ "Creates a new document from a template with fillable fields and sends an invite to one or more signers by role.": "Maakt een nieuw document aan van een sjabloon met ingevulde velden en stuurt een uitnodiging naar één of meer ondertekenaars per rol.",
+ "Creates a new document group from a template group and sends an invite to one or more signers.": "Maakt een nieuwe documentgroep aan vanuit een sjabloongroep en stuurt een uitnodiging naar een of meerdere signers.",
+ "Make a custom authenticated request to any SignNow API endpoint.": "Maak een aangepaste geauthenticeerde aanvraag voor elk SignNow API-eindpunt.",
+ "Document ID": "Document ID",
+ "Cancellation Reason": "Reden van annulering",
+ "File": "Bestand",
+ "Parse Text Tags": "Parse tekst-tags",
+ "Sender's Email": "Afzender E-mail",
+ "Signers": "Signers",
+ "Email Subject (All Signers)": "E-mail Onderwerp (Alle Signers)",
+ "Email Message (All Signers)": "E-mailbericht (alle ondertekenaars)",
+ "CC Recipients": "CC Ontvangers",
+ "CC Email Subject": "CC e-mailonderwerp",
+ "CC Email Message": "CC e-mailbericht",
+ "Template ID": "Sjabloon ID",
+ "Document Name": "Document naam",
+ "Signer's Email": "Signer E-mail",
+ "Email Subject": "E-mail Onderwerp",
+ "Email Message": "E-mail bericht",
+ "Language": "Taal",
+ "Redirect URL": "Omleidings URL",
+ "Close Redirect URL": "Sluiten doorstuur URL",
+ "Redirect Target": "Doel omleiden",
+ "Expiration Days": "Verval dagen",
+ "Document Group Template ID": "Document groep sjabloonID",
+ "Document Group Name": "Naam documentgroep",
+ "Method": "Methode",
+ "Headers": "Kopteksten",
+ "Query Parameters": "Query parameters",
+ "Body Type": "Type lichaam",
+ "Body": "Lichaam",
+ "Response is Binary ?": "Antwoord is binair?",
+ "No Error on Failure": "Geen fout bij fout",
+ "Timeout (in seconds)": "Time-out (in seconden)",
+ "Follow redirects": "Volg omleidingen",
+ "The ID of the document whose invite you want to cancel.": "Het ID van het document wiens uitnodiging u wilt annuleren.",
+ "The reason for cancelling the invite.": "De reden voor het annuleren van de uitnodiging.",
+ "The file to upload. Accepted formats: .pdf, .doc, .docx, .odt, .rtf, .png, .jpg, .jpeg, .gif, .bmp, .xml, .xls, .xlsx, .ppt, .pptx, .ps, .eps. Maximum size: 50 MB.": "Het te uploaden bestand. Geaccepteerde formaten: .pdf, .doc, .docx, .odt, .rtf, .png, .jpg, . . . peg, .gif, .bmp, .xml, .xls, .xlsx, .ppt, .pptx, .ps, Maximale grootte: 50 MB.",
+ "Enable if your document contains simple text tags that should be converted to fillable fields.": "Inschakelen als uw document eenvoudige teksttags bevat die moeten worden geconverteerd naar ingevulde velden.",
+ "The file to upload. Text tags in the document (e.g. {{t:s;r:y;o:\"Signer 1\";}}) will be converted to fillable fields. Accepted formats: .pdf, .doc, .docx, .odt, .rtf, .png, .jpg, .jpeg, .gif, .bmp, .xml, .xls, .xlsx, .ppt, .pptx, .ps, .eps. Maximum size: 50 MB.": "Het te uploaden bestand. Teksttags in het document (bijv. {{t:s;r:y;o:\"Signer 1\";}}) worden geconverteerd naar ingevulde velden. Geaccepteerde formaten: . df, .doc, .docx, .odt, .rtf, .png, .jpg, .jpeg, .gif, .bmp, .xml, .xls, .xlsx, .ppt, .pptx, .ps, .eps. Maximale grootte: 50 MB.",
+ "The ID of the document to send for signing.": "Het ID van het document om te verzenden voor ondertekening.",
+ "Must be the email address associated with your SignNow account.": "Moet het e-mailadres zijn dat is gekoppeld aan uw Signay-account.",
+ "One entry per signer role. Each signer needs an email, role name, and signing order.": "Eén item per signer rol. Elke ondertekenaar heeft een e-mail, rolnaam en een order nodig.",
+ "Default email subject for all signers. Overridden by per-signer subject if set.": "Standaard e-mail onderwerp voor alle ondertekenaars. Indien ingesteld.",
+ "Default email body for all signers. Overridden by per-signer message if set.": "Standaard e-mailbody voor alle signers. Indien ingesteld door per ondertekenaar.",
+ "Email addresses to CC on the invite.": "E-mailadressen naar CC op de uitnodiging.",
+ "Subject line for CC recipient emails.": "Onderwerp voor CC ontvanger e-mails.",
+ "Body message for CC recipient emails.": "Body bericht voor CC ontvanger e-mails.",
+ "The ID of the template to create the document from.": "Het ID van het sjabloon waaruit het document gemaakt moet worden.",
+ "Name for the new document. Defaults to the template name if not provided.": "Naam voor het nieuwe document. Standaard de sjabloonnaam indien niet opgegeven.",
+ "Email address of the signer. A free form invite can be sent to the sender's own email address.": "E-mailadres van de ondertekenaar. Een gratis formulieruitnodiging kan worden verzonden naar het e-mailadres van de afzender.",
+ "Subject line of the invite email sent to the signer.": "Onderwerpregel van de uitnodigingsmail verzonden naar de ondertekenaar.",
+ "Body message of the invite email sent to the signer.": "Lichaamsbericht van de uitnodigingsmail verzonden naar de ondertekenaar.",
+ "Subject line of the email sent to CC recipients.": "Onderwerpregel van de e-mail verzonden naar CC ontvangers.",
+ "Body message of the email sent to CC recipients.": "Body bericht van de e-mail verzonden naar CC ontvangers.",
+ "Language for the signing session and notification emails.": "Taal voor de ondertekeningssessie en notificatie e-mails.",
+ "URL the signer is redirected to after signing.": "URL waarnaar de ondertekenaar wordt omgeleid na ondertekening.",
+ "URL that opens when the signer clicks the Close button.": "URL die wordt geopend wanneer de ondertekenaar op de sluitknop klikt.",
+ "Whether to open the redirect URL in a new tab or the same tab.": "Openen van de doorverwijzings-URL in een nieuw tabblad of hetzelfde tabblad.",
+ "One entry per signer role defined in the template. Each signer must have an email and a role name (e.g. \"Signer 1\").": "Eén item per signer rol gedefinieerd in het sjabloon. Elke ondertekenaar moet een e-mail en een rolnaam hebben (bijv. \"Signer 1\").",
+ "Default email subject sent to all signers. Overridden by per-signer subject if set.": "Standaard e-mail onderwerp verzonden naar alle signers. Indien ingesteld overschreven door per ondertekenaar.",
+ "Default email body sent to all signers. Overridden by per-signer message if set.": "Standaard e-mailbericht verzonden naar alle ondertekenaars. Indien ingesteld wordt dit overschreven door per ondertekenaar.",
+ "Number of days before the invite expires (3–180). Defaults to 30.": "Aantal dagen voordat de uitnodiging vervalt (3–180). Standaard ingesteld op 30.",
+ "The unique ID of the document group template.": "Het unieke ID van de documentgroepsjabloon.",
+ "Name for the new document group.": "Naam voor de nieuwe documentgroep.",
+ "One entry per signer. Each signer needs an email, role name, and the document they are signing within the group. Signing order determines the step sequence.": "Eén vermelding per ondertekenaar. Elke ondertekenaar heeft een e-mail, rolnaam en het document dat ze binnen de groep ondertekenen. Het ondertekenen van een order bepaalt de stappenreeks.",
+ "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.",
+ "English": "Nederlands",
+ "Spanish": "Spaans",
+ "French": "Frans",
+ "New tab": "New tab",
+ "Same tab": "Same tab",
+ "GET": "KRIJG",
+ "POST": "POSTE",
+ "PATCH": "BEKIJK",
+ "PUT": "PUT",
+ "DELETE": "VERWIJDEREN",
+ "HEAD": "HOOFD",
+ "None": "geen",
+ "JSON": "JSON",
+ "Form Data": "Formulieren gegevens",
+ "Raw": "Onbewerkte",
+ "New Document": "Nieuw Document",
+ "Document Updated": "Document bijgewerkt",
+ "Document Completed": "Document voltooid",
+ "Document Deleted": "Document verwijderd",
+ "Document Group Completed": "Documentgroep voltooid",
+ "Triggers when a document has been uploaded to SignNow.": "Activeert wanneer een document is geüpload naar Signaal.",
+ "Triggers when a document has been updated.": "Triggert wanneer een document is bijgewerkt.",
+ "Triggers when all signers have filled in and signed the document.": "Triggert wanneer alle ondertekenaars het document hebben ingevuld en ondertekend.",
+ "Triggers when a document has been deleted.": "Triggert wanneer een document is verwijderd.",
+ "Triggers when all signers have filled in and signed the document group.": "Triggert wanneer alle ondertekenaars hebben ingevuld en de documentgroep hebben ondertekend."
+}
\ No newline at end of file
diff --git a/packages/pieces/community/sign-now/src/i18n/pt.json b/packages/pieces/community/sign-now/src/i18n/pt.json
new file mode 100644
index 00000000000..de88bc987b7
--- /dev/null
+++ b/packages/pieces/community/sign-now/src/i18n/pt.json
@@ -0,0 +1,109 @@
+{
+ "eSignature platform for sending, signing, and managing documents.": "Plataforma eSignature para enviar, assinar e gerenciar documentos.",
+ "Cancel Invite to Sign": "Cancelar Convite para Assinar",
+ "Upload Document": "Upload de documento",
+ "Upload Document & Extract Fields": "Enviar Campos do Documento e Extrair",
+ "Invite to Sign": "Convidar para assinar",
+ "Create Document From Template & Send Free Form Invite": "Criar documento a partir do modelo e enviar convite de formulário gratuito",
+ "Create Document From Template & Send Role-Based Invite": "Criar documento a partir do modelo e enviar um convite baseado em papel",
+ "Create Document Group From Template Group & Send Invite": "Criar grupo de documentos do grupo de modelos e enviar convite",
+ "Custom API Call": "Chamada de API personalizada",
+ "Cancels an invite to sign a document.": "Cancela um convite para assinar um documento.",
+ "Uploads a document to your SignNow account. Supports PDF, Word, PowerPoint, Excel, images, and more.": "Carrega um documento para sua conta SignNow. Suporta PDF, Word, PowerPoint, Excel, imagens e muito mais.",
+ "Uploads a document and automatically converts text tags into SignNow fillable fields.": "Carrega um documento e converte automaticamente tags de texto em campos de SignNow preenchíveis.",
+ "Sends an invite to sign an existing document.": "Envia um convite para assinar um documento existente.",
+ "Creates a new document from a template and sends a free form invite to a signer.": "Cria um novo documento a partir de um modelo e envia um convite de formulário livre para um assinante.",
+ "Creates a new document from a template with fillable fields and sends an invite to one or more signers by role.": "Cria um novo documento a partir de um modelo com campos preenchíveis e envia um convite para um ou mais assinantes por papel.",
+ "Creates a new document group from a template group and sends an invite to one or more signers.": "Cria um novo grupo de documentos a partir de um grupo modelo e envia um convite para um ou mais assinantes.",
+ "Make a custom authenticated request to any SignNow API endpoint.": "Faça uma solicitação personalizada autenticada para qualquer ponto de API de SignNow .",
+ "Document ID": "ID do documento",
+ "Cancellation Reason": "Motivo do cancelamento",
+ "File": "Arquivo",
+ "Parse Text Tags": "Analisar Tags de Texto",
+ "Sender's Email": "E-mail do remetente",
+ "Signers": "Assinantes",
+ "Email Subject (All Signers)": "Assunto do Email (Todos os Assinantes)",
+ "Email Message (All Signers)": "Mensagem de e-mail (Todos os Assinantes)",
+ "CC Recipients": "Destinatários CC",
+ "CC Email Subject": "Assunto do E-mail CC",
+ "CC Email Message": "Mensagem de E-mail CC",
+ "Template ID": "ID do modelo",
+ "Document Name": "Nome do documento",
+ "Signer's Email": "Email do Assinante",
+ "Email Subject": "Assunto do e-mail",
+ "Email Message": "Mensagem de e-mail",
+ "Language": "IDIOMA",
+ "Redirect URL": "URL de redirecionamento",
+ "Close Redirect URL": "Fechar URL de redirecionamento",
+ "Redirect Target": "Alvo de redirecionamento",
+ "Expiration Days": "Dias de expiração",
+ "Document Group Template ID": "No. Grupo de Documento",
+ "Document Group Name": "Nome do Grupo Documento",
+ "Method": "Método",
+ "Headers": "Cabeçalhos",
+ "Query Parameters": "Parâmetros da consulta",
+ "Body Type": "Tipo de Corpo",
+ "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)",
+ "Follow redirects": "Seguir redirecionamentos",
+ "The ID of the document whose invite you want to cancel.": "A identificação do documento cujo convite você deseja cancelar.",
+ "The reason for cancelling the invite.": "A razão para o cancelamento do convite.",
+ "The file to upload. Accepted formats: .pdf, .doc, .docx, .odt, .rtf, .png, .jpg, .jpeg, .gif, .bmp, .xml, .xls, .xlsx, .ppt, .pptx, .ps, .eps. Maximum size: 50 MB.": "O arquivo a ser enviado. Formatos aceitos: .pdf, .doc, .docx, .odt, .rtf, .png, .jpg, . peg, .gif, .bmp, .xml, .xls, .xlsx, .ppt, .pptx, .ps, .eps. Tamanho máximo: 50 MB.",
+ "Enable if your document contains simple text tags that should be converted to fillable fields.": "Habilite se o seu documento contém tags de texto simples que devem ser convertidas para campos preenchíveis.",
+ "The file to upload. Text tags in the document (e.g. {{t:s;r:y;o:\"Signer 1\";}}) will be converted to fillable fields. Accepted formats: .pdf, .doc, .docx, .odt, .rtf, .png, .jpg, .jpeg, .gif, .bmp, .xml, .xls, .xlsx, .ppt, .pptx, .ps, .eps. Maximum size: 50 MB.": "Arquivo para upload. Tags de texto no documento (por exemplo, {{t:s;r:y;o:\"Signer 1\";}}) serão convertidos em campos preenchíveis. Formatos aceitos: . df, .doc, .docx, .odt, .rtf, .png, .jpg, .jpeg, .gif, .bmp, .xml, .xls, .xlsx, .ppt, .pptx, .ps, .eps. tamanho máximo: 50 MB.",
+ "The ID of the document to send for signing.": "O ID do documento a ser enviado para a assinatura.",
+ "Must be the email address associated with your SignNow account.": "Deve ser o endereço de e-mail associado à sua conta SignNow.",
+ "One entry per signer role. Each signer needs an email, role name, and signing order.": "Uma entrada por papel de assinante. Cada signatário precisa de um e-mail, um nome de função e um pedido de assinatura.",
+ "Default email subject for all signers. Overridden by per-signer subject if set.": "Assunto de e-mail padrão para todos os signatários. Substituído por assunto por signatário, se definido.",
+ "Default email body for all signers. Overridden by per-signer message if set.": "Corpo de e-mail padrão para todos os signatários. Substituído por mensagem por signatário, se definido.",
+ "Email addresses to CC on the invite.": "Endereços de email para CC no convite.",
+ "Subject line for CC recipient emails.": "Linha de assunto para e-mails de destinatário CC.",
+ "Body message for CC recipient emails.": "Mensagem de corpo para e-mails de destinatário CC.",
+ "The ID of the template to create the document from.": "O ID do modelo para criar o documento.",
+ "Name for the new document. Defaults to the template name if not provided.": "Nome para o novo documento. O padrão é o nome de modelo se não fornecido.",
+ "Email address of the signer. A free form invite can be sent to the sender's own email address.": "Endereço de e-mail do assinante. Um convite de formulário gratuito pode ser enviado para o próprio endereço de e-mail do remetente.",
+ "Subject line of the invite email sent to the signer.": "Linha de assunto do email de convite enviado para o assinante.",
+ "Body message of the invite email sent to the signer.": "Mensagem do email de convite enviado ao assinante.",
+ "Subject line of the email sent to CC recipients.": "Linha de assunto do e-mail enviado aos destinatários da CC.",
+ "Body message of the email sent to CC recipients.": "Mensagem do e-mail enviado para destinatários da CC.",
+ "Language for the signing session and notification emails.": "Idioma para os e-mails de sessão e notificação.",
+ "URL the signer is redirected to after signing.": "URL para a qual a assinatura é redirecionada após a assinatura.",
+ "URL that opens when the signer clicks the Close button.": "URL que abre quando o assinante clica no botão de Fechar.",
+ "Whether to open the redirect URL in a new tab or the same tab.": "Se deseja abrir o URL de redirecionamento em uma nova aba ou na mesma aba.",
+ "One entry per signer role defined in the template. Each signer must have an email and a role name (e.g. \"Signer 1\").": "Uma entrada por função de assinante definida no modelo. Cada signatário deve ter um email e um nome de função (por exemplo, \"Assinante 1\").",
+ "Default email subject sent to all signers. Overridden by per-signer subject if set.": "Assunto de e-mail padrão enviado a todos os signatários. Substituído por assunto por signatário, se definido.",
+ "Default email body sent to all signers. Overridden by per-signer message if set.": "Corpo de e-mail padrão enviado para todos os signatários. Substituído por mensagem por signatário, se definido.",
+ "Number of days before the invite expires (3–180). Defaults to 30.": "Número de dias antes do convite expirar (3-180). O padrão é 30.",
+ "The unique ID of the document group template.": "O ID exclusivo do modelo do grupo de documentos.",
+ "Name for the new document group.": "Nome para o novo grupo de documentos.",
+ "One entry per signer. Each signer needs an email, role name, and the document they are signing within the group. Signing order determines the step sequence.": "Uma entrada por assinante. Cada signatário precisa de um e-mail, nome da função e o documento que eles estão assinando no grupo. A assinatura da ordem determina a sequência da etapa.",
+ "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.",
+ "English": "Portuguese-Brazil",
+ "Spanish": "espanhol",
+ "French": "francês",
+ "New tab": "New tab",
+ "Same tab": "Same tab",
+ "GET": "OBTER",
+ "POST": "POSTAR",
+ "PATCH": "COMPRAR",
+ "PUT": "COLOCAR",
+ "DELETE": "EXCLUIR",
+ "HEAD": "CABEÇA",
+ "None": "Nenhuma",
+ "JSON": "JSON",
+ "Form Data": "Dados de Formulário",
+ "Raw": "RAW",
+ "New Document": "Novo documento",
+ "Document Updated": "Documento atualizado",
+ "Document Completed": "Documento concluído",
+ "Document Deleted": "Documento Excluído",
+ "Document Group Completed": "Grupo de documentos concluído",
+ "Triggers when a document has been uploaded to SignNow.": "Dispara quando um documento for enviado para AssinarAgora.",
+ "Triggers when a document has been updated.": "Dispara quando um documento foi atualizado.",
+ "Triggers when all signers have filled in and signed the document.": "Dispara quando todos os assinantes tiverem preenchido e assinado o documento.",
+ "Triggers when a document has been deleted.": "Dispara quando um documento for excluído.",
+ "Triggers when all signers have filled in and signed the document group.": "Aciona quando todos os assinantes forem preenchidos e assinados o grupo de documentos."
+}
\ No newline at end of file
diff --git a/packages/pieces/community/sign-now/src/i18n/zh.json b/packages/pieces/community/sign-now/src/i18n/zh.json
new file mode 100644
index 00000000000..77c14e4520f
--- /dev/null
+++ b/packages/pieces/community/sign-now/src/i18n/zh.json
@@ -0,0 +1,109 @@
+{
+ "eSignature platform for sending, signing, and managing documents.": "eSignature platform for sending, signing, and managing documents.",
+ "Cancel Invite to Sign": "Cancel Invite to Sign",
+ "Upload Document": "Upload Document",
+ "Upload Document & Extract Fields": "Upload Document & Extract Fields",
+ "Invite to Sign": "Invite to Sign",
+ "Create Document From Template & Send Free Form Invite": "Create Document From Template & Send Free Form Invite",
+ "Create Document From Template & Send Role-Based Invite": "Create Document From Template & Send Role-Based Invite",
+ "Create Document Group From Template Group & Send Invite": "Create Document Group From Template Group & Send Invite",
+ "Custom API Call": "自定义 API 呼叫",
+ "Cancels an invite to sign a document.": "Cancels an invite to sign a document.",
+ "Uploads a document to your SignNow account. Supports PDF, Word, PowerPoint, Excel, images, and more.": "Uploads a document to your SignNow account. Supports PDF, Word, PowerPoint, Excel, images, and more.",
+ "Uploads a document and automatically converts text tags into SignNow fillable fields.": "Uploads a document and automatically converts text tags into SignNow fillable fields.",
+ "Sends an invite to sign an existing document.": "Sends an invite to sign an existing document.",
+ "Creates a new document from a template and sends a free form invite to a signer.": "Creates a new document from a template and sends a free form invite to a signer.",
+ "Creates a new document from a template with fillable fields and sends an invite to one or more signers by role.": "Creates a new document from a template with fillable fields and sends an invite to one or more signers by role.",
+ "Creates a new document group from a template group and sends an invite to one or more signers.": "Creates a new document group from a template group and sends an invite to one or more signers.",
+ "Make a custom authenticated request to any SignNow API endpoint.": "Make a custom authenticated request to any SignNow API endpoint.",
+ "Document ID": "Document ID",
+ "Cancellation Reason": "Cancellation Reason",
+ "File": "文件",
+ "Parse Text Tags": "Parse Text Tags",
+ "Sender's Email": "Sender's Email",
+ "Signers": "Signers",
+ "Email Subject (All Signers)": "Email Subject (All Signers)",
+ "Email Message (All Signers)": "Email Message (All Signers)",
+ "CC Recipients": "CC Recipients",
+ "CC Email Subject": "CC Email Subject",
+ "CC Email Message": "CC Email Message",
+ "Template ID": "Template ID",
+ "Document Name": "Document Name",
+ "Signer's Email": "Signer's Email",
+ "Email Subject": "Email Subject",
+ "Email Message": "Email Message",
+ "Language": "Language",
+ "Redirect URL": "重定向网址",
+ "Close Redirect URL": "Close Redirect URL",
+ "Redirect Target": "Redirect Target",
+ "Expiration Days": "Expiration Days",
+ "Document Group Template ID": "Document Group Template ID",
+ "Document Group Name": "Document Group Name",
+ "Method": "方法",
+ "Headers": "信头",
+ "Query Parameters": "查询参数",
+ "Body Type": "Body Type",
+ "Body": "正文内容",
+ "Response is Binary ?": "Response is Binary ?",
+ "No Error on Failure": "失败时没有错误",
+ "Timeout (in seconds)": "超时(秒)",
+ "Follow redirects": "Follow redirects",
+ "The ID of the document whose invite you want to cancel.": "The ID of the document whose invite you want to cancel.",
+ "The reason for cancelling the invite.": "The reason for cancelling the invite.",
+ "The file to upload. Accepted formats: .pdf, .doc, .docx, .odt, .rtf, .png, .jpg, .jpeg, .gif, .bmp, .xml, .xls, .xlsx, .ppt, .pptx, .ps, .eps. Maximum size: 50 MB.": "The file to upload. Accepted formats: .pdf, .doc, .docx, .odt, .rtf, .png, .jpg, .jpeg, .gif, .bmp, .xml, .xls, .xlsx, .ppt, .pptx, .ps, .eps. Maximum size: 50 MB.",
+ "Enable if your document contains simple text tags that should be converted to fillable fields.": "Enable if your document contains simple text tags that should be converted to fillable fields.",
+ "The file to upload. Text tags in the document (e.g. {{t:s;r:y;o:\"Signer 1\";}}) will be converted to fillable fields. Accepted formats: .pdf, .doc, .docx, .odt, .rtf, .png, .jpg, .jpeg, .gif, .bmp, .xml, .xls, .xlsx, .ppt, .pptx, .ps, .eps. Maximum size: 50 MB.": "The file to upload. Text tags in the document (e.g. {{t:s;r:y;o:\"Signer 1\";}}) will be converted to fillable fields. Accepted formats: .pdf, .doc, .docx, .odt, .rtf, .png, .jpg, .jpeg, .gif, .bmp, .xml, .xls, .xlsx, .ppt, .pptx, .ps, .eps. Maximum size: 50 MB.",
+ "The ID of the document to send for signing.": "The ID of the document to send for signing.",
+ "Must be the email address associated with your SignNow account.": "Must be the email address associated with your SignNow account.",
+ "One entry per signer role. Each signer needs an email, role name, and signing order.": "One entry per signer role. Each signer needs an email, role name, and signing order.",
+ "Default email subject for all signers. Overridden by per-signer subject if set.": "Default email subject for all signers. Overridden by per-signer subject if set.",
+ "Default email body for all signers. Overridden by per-signer message if set.": "Default email body for all signers. Overridden by per-signer message if set.",
+ "Email addresses to CC on the invite.": "Email addresses to CC on the invite.",
+ "Subject line for CC recipient emails.": "Subject line for CC recipient emails.",
+ "Body message for CC recipient emails.": "Body message for CC recipient emails.",
+ "The ID of the template to create the document from.": "The ID of the template to create the document from.",
+ "Name for the new document. Defaults to the template name if not provided.": "Name for the new document. Defaults to the template name if not provided.",
+ "Email address of the signer. A free form invite can be sent to the sender's own email address.": "Email address of the signer. A free form invite can be sent to the sender's own email address.",
+ "Subject line of the invite email sent to the signer.": "Subject line of the invite email sent to the signer.",
+ "Body message of the invite email sent to the signer.": "Body message of the invite email sent to the signer.",
+ "Subject line of the email sent to CC recipients.": "Subject line of the email sent to CC recipients.",
+ "Body message of the email sent to CC recipients.": "Body message of the email sent to CC recipients.",
+ "Language for the signing session and notification emails.": "Language for the signing session and notification emails.",
+ "URL the signer is redirected to after signing.": "URL the signer is redirected to after signing.",
+ "URL that opens when the signer clicks the Close button.": "URL that opens when the signer clicks the Close button.",
+ "Whether to open the redirect URL in a new tab or the same tab.": "Whether to open the redirect URL in a new tab or the same tab.",
+ "One entry per signer role defined in the template. Each signer must have an email and a role name (e.g. \"Signer 1\").": "One entry per signer role defined in the template. Each signer must have an email and a role name (e.g. \"Signer 1\").",
+ "Default email subject sent to all signers. Overridden by per-signer subject if set.": "Default email subject sent to all signers. Overridden by per-signer subject if set.",
+ "Default email body sent to all signers. Overridden by per-signer message if set.": "Default email body sent to all signers. Overridden by per-signer message if set.",
+ "Number of days before the invite expires (3–180). Defaults to 30.": "Number of days before the invite expires (3–180). Defaults to 30.",
+ "The unique ID of the document group template.": "The unique ID of the document group template.",
+ "Name for the new document group.": "Name for the new document group.",
+ "One entry per signer. Each signer needs an email, role name, and the document they are signing within the group. Signing order determines the step sequence.": "One entry per signer. Each signer needs an email, role name, and the document they are signing within the group. Signing order determines the step sequence.",
+ "Authorization headers are injected automatically from your connection.": "授权头自动从您的连接中注入。",
+ "Enable for files like PDFs, images, etc.": "Enable for files like PDFs, images, etc.",
+ "English": "English",
+ "Spanish": "Spanish",
+ "French": "French",
+ "New tab": "New tab",
+ "Same tab": "Same tab",
+ "GET": "获取",
+ "POST": "帖子",
+ "PATCH": "PATCH",
+ "PUT": "弹出",
+ "DELETE": "删除",
+ "HEAD": "黑色",
+ "None": "无",
+ "JSON": "JSON",
+ "Form Data": "表单数据",
+ "Raw": "原始文件",
+ "New Document": "New Document",
+ "Document Updated": "Document Updated",
+ "Document Completed": "Document Completed",
+ "Document Deleted": "Document Deleted",
+ "Document Group Completed": "Document Group Completed",
+ "Triggers when a document has been uploaded to SignNow.": "Triggers when a document has been uploaded to SignNow.",
+ "Triggers when a document has been updated.": "Triggers when a document has been updated.",
+ "Triggers when all signers have filled in and signed the document.": "Triggers when all signers have filled in and signed the document.",
+ "Triggers when a document has been deleted.": "Triggers when a document has been deleted.",
+ "Triggers when all signers have filled in and signed the document group.": "Triggers when all signers have filled in and signed the document group."
+}
\ No newline at end of file
diff --git a/packages/pieces/community/slack/package.json b/packages/pieces/community/slack/package.json
index e59b0001542..a956251a4dd 100644
--- a/packages/pieces/community/slack/package.json
+++ b/packages/pieces/community/slack/package.json
@@ -1,6 +1,6 @@
{
"name": "@activepieces/piece-slack",
- "version": "0.12.4",
+ "version": "0.12.5",
"main": "./dist/src/index.js",
"types": "./dist/src/index.d.ts",
"dependencies": {
diff --git a/packages/pieces/community/slack/src/i18n/de.json b/packages/pieces/community/slack/src/i18n/de.json
index b9d82de9342..274ff9d0881 100644
--- a/packages/pieces/community/slack/src/i18n/de.json
+++ b/packages/pieces/community/slack/src/i18n/de.json
@@ -154,6 +154,7 @@
"New User": "Neuer Benutzer",
"New Saved Message": "Neue gespeicherte Nachricht",
"New Team Custom Emoji": "Neues Team Custom Emoji",
+ "New Modal Interaction": "Neue Modale Interaktion",
"Triggers when a new message is posted to any channel.": "Wird ausgelöst, wenn eine neue Nachricht an einen beliebigen Kanal gesendet wird.",
"Triggers when a new message is posted to a specific #channel you choose.": "Wird ausgelöst, wenn eine neue Nachricht an einen bestimmten #channel gesendet wird, den du wählst.",
"Triggers when a message was posted in a direct message channel.": "Wird ausgelöst, wenn eine Nachricht in einem Direktnachrichten gesendet wurde.",
@@ -166,15 +167,20 @@
"Triggers when a new user is created / first joins your org.": "Wird ausgelöst, wenn ein neuer Benutzer erstellt wird / zuerst deiner Org beitritt.",
"Triggers when you save a message.": "Wird ausgelöst, wenn Sie eine Nachricht speichern.",
"Triggers when a custom emoji has been added to a team.": "Trigger wenn ein benutzerdefinierter Emoji einem Team hinzugefügt wurde.",
+ "Triggers when a user interacts with a modal.": "Wird ausgelöst, wenn ein Benutzer mit einem Modal interagiert.",
"Ignore Bot Messages ?": "Bot Nachrichten ignorieren ?",
"Ignore Message from Yourself ?": "Nachricht von Ihnen selbst ignorieren ?",
"Channels": "Kanäle",
"Emojis (E.g fire, smile)": "Emojis (Feuer, Lächeln)",
"Commands": "Befehle",
+ "Interaction Type": "Interaktionstyp",
"\n\tPlease make sure add the bot to the channel by following these steps:\n\t 1. Type /invite in the channel's chat.\n\t 2. Click on Add apps to this channel.\n\t 3. Search for and add the bot.\n \n**Note**: If you can't find the channel in the dropdown list (which fetches up to 2000 channels), please click on the **(F)** and type the channel ID directly in an array like this: `{`{ ['your_channel_id_1', 'your_channel_id_2', ...] `}`}": "\n\tBitte stelle sicher, dass du den Bot zum Kanal hinzufügst, indem du folgende Schritte folgst:\n\t 1. Tippe /invite in den Chat des Channels.\n\t 2. Klicke auf Apps zu diesem Kanal hinzufügen.\n\t 3. Suche nach und füge den Bot hinzu.\n \n**Notiz**: Wenn du den Kanal in der Dropdown-Liste nicht finden kannst (welche bis zu 2000 Kanäle abruft) bitte klicken Sie auf das **(F)** und tippen Sie die Kanal-ID direkt in ein Array wie folgt: `{`{ ['your_channel_id_1', 'your_channel_id_2', . .] `}`}",
"If no channel is selected, the flow will be triggered for username mentions in all channels": "Wenn kein Kanal ausgewählt ist, wird der Fluss für Benutzername Erwähnungen in allen Kanälen ausgelöst",
"Select emojis to trigger on": "Wähle Emojis zum Auslösen aus",
"If no channel is selected, the flow will be triggered for reactions in all channels the app has access to": "Wenn kein Kanal ausgewählt ist, wird der Fluss für Reaktionen in allen Kanälen ausgelöst, auf die die App Zugriff hat",
"List of valid commands that the bot should respond to (e.g., help, ocr, remind)": "Liste gültiger Befehle, auf die der Bot reagieren soll (z.B. help, ocr, remind)",
- "If no channel is selected, the flow will be triggered for commands in all channels": "Wenn kein Kanal ausgewählt ist, wird der Fluss für Befehle in allen Kanälen ausgelöst"
+ "If no channel is selected, the flow will be triggered for commands in all channels": "Wenn kein Kanal ausgewählt ist, wird der Fluss für Befehle in allen Kanälen ausgelöst",
+ "Select the type of modal interaction to trigger on.": "Wählen Sie die Art der modalen Interaktion aus, die ausgelöst werden soll.",
+ "View Submission": "Einreichung anzeigen",
+ "View Closed": "Ansicht geschlossen"
}
\ No newline at end of file
diff --git a/packages/pieces/community/slack/src/i18n/es.json b/packages/pieces/community/slack/src/i18n/es.json
index bc2a5177454..1d9ed316e2a 100644
--- a/packages/pieces/community/slack/src/i18n/es.json
+++ b/packages/pieces/community/slack/src/i18n/es.json
@@ -154,6 +154,7 @@
"New User": "Nuevo usuario",
"New Saved Message": "Nuevo mensaje guardado",
"New Team Custom Emoji": "Emoji nuevo equipo personalizado",
+ "New Modal Interaction": "Nueva interacción modal",
"Triggers when a new message is posted to any channel.": "Dispara cuando se publica un nuevo mensaje en cualquier canal.",
"Triggers when a new message is posted to a specific #channel you choose.": "Dispara cuando un nuevo mensaje se publica en un #canal específico que elijas.",
"Triggers when a message was posted in a direct message channel.": "Dispara cuando un mensaje fue publicado en un canal de mensaje directo.",
@@ -166,15 +167,20 @@
"Triggers when a new user is created / first joins your org.": "Dispara cuando un nuevo usuario es creado / se une por primera vez a su órgano.",
"Triggers when you save a message.": "Dispara cuando guardas un mensaje.",
"Triggers when a custom emoji has been added to a team.": "Dispara cuando se ha añadido un emoji personalizado a un equipo.",
+ "Triggers when a user interacts with a modal.": "Dispara cuando un usuario interactúa con un modal.",
"Ignore Bot Messages ?": "¿Ignorar mensajes de bot?",
"Ignore Message from Yourself ?": "¿Ignorar mensaje de ti mismo?",
"Channels": "Canales",
"Emojis (E.g fire, smile)": "Emojis (Ej. fuego, sonrisa)",
"Commands": "Comandos",
+ "Interaction Type": "Tipo de interacción",
"\n\tPlease make sure add the bot to the channel by following these steps:\n\t 1. Type /invite in the channel's chat.\n\t 2. Click on Add apps to this channel.\n\t 3. Search for and add the bot.\n \n**Note**: If you can't find the channel in the dropdown list (which fetches up to 2000 channels), please click on the **(F)** and type the channel ID directly in an array like this: `{`{ ['your_channel_id_1', 'your_channel_id_2', ...] `}`}": "\n\tPlease make sure add the bot to the channel by following these steps:\n\t 1. Type /invite in the channel's chat.\n\t 2. Click on Add apps to this channel.\n\t 3. Search for and add the bot.\n \n**Note**: If you can't find the channel in the dropdown list (which fetches up to 2000 channels), please click on the **(F)** and type the channel ID directly in an array like this: `{`{ ['your_channel_id_1', 'your_channel_id_2', ...] `}`}",
"If no channel is selected, the flow will be triggered for username mentions in all channels": "Si no se selecciona ningún canal, el flujo se activará por menciones de nombre de usuario en todos los canales",
"Select emojis to trigger on": "Selecciona emojis para activar",
"If no channel is selected, the flow will be triggered for reactions in all channels the app has access to": "Si no se selecciona ningún canal, el flujo se activará para reacciones en todos los canales a los que la aplicación tiene acceso",
"List of valid commands that the bot should respond to (e.g., help, ocr, remind)": "Lista de comandos válidos a los que el bot debe responder (por ejemplo, ayuda, ocr, recordatorio)",
- "If no channel is selected, the flow will be triggered for commands in all channels": "Si no se selecciona ningún canal, el flujo se activará para comandos en todos los canales"
+ "If no channel is selected, the flow will be triggered for commands in all channels": "Si no se selecciona ningún canal, el flujo se activará para comandos en todos los canales",
+ "Select the type of modal interaction to trigger on.": "Seleccione el tipo de interacción modal a activar.",
+ "View Submission": "Ver envío",
+ "View Closed": "Ver cerrados"
}
\ No newline at end of file
diff --git a/packages/pieces/community/slack/src/i18n/fr.json b/packages/pieces/community/slack/src/i18n/fr.json
index 8d9fdb93f5b..e2596023f0d 100644
--- a/packages/pieces/community/slack/src/i18n/fr.json
+++ b/packages/pieces/community/slack/src/i18n/fr.json
@@ -154,6 +154,7 @@
"New User": "Nouvel utilisateur",
"New Saved Message": "Nouveau message sauvegardé",
"New Team Custom Emoji": "Nouvel Emoji personnalisé d'équipe",
+ "New Modal Interaction": "Nouvelle interaction modale",
"Triggers when a new message is posted to any channel.": "Déclenche lorsqu'un nouveau message est posté sur n'importe quel canal.",
"Triggers when a new message is posted to a specific #channel you choose.": "Déclenche lorsqu'un nouveau message est posté sur un canal spécifique que vous choisissez.",
"Triggers when a message was posted in a direct message channel.": "Déclenche lorsqu'un message a été posté dans un canal de message direct.",
@@ -166,15 +167,20 @@
"Triggers when a new user is created / first joins your org.": "Déclenche lorsqu'un nouvel utilisateur est créé / rejoint d'abord votre organisation.",
"Triggers when you save a message.": "Déclenche lorsque vous enregistrez un message.",
"Triggers when a custom emoji has been added to a team.": "Déclenche lorsqu'un émoji personnalisé a été ajouté à une équipe.",
+ "Triggers when a user interacts with a modal.": "Déclenche lorsqu'un utilisateur interagit avec un modal.",
"Ignore Bot Messages ?": "Ignorer les messages du bot ?",
"Ignore Message from Yourself ?": "Ignorer le message de vous-même ?",
"Channels": "Canaux",
"Emojis (E.g fire, smile)": "Emojis (par exemple, feu, sourire)",
"Commands": "Commandes",
+ "Interaction Type": "Type d'interaction",
"\n\tPlease make sure add the bot to the channel by following these steps:\n\t 1. Type /invite in the channel's chat.\n\t 2. Click on Add apps to this channel.\n\t 3. Search for and add the bot.\n \n**Note**: If you can't find the channel in the dropdown list (which fetches up to 2000 channels), please click on the **(F)** and type the channel ID directly in an array like this: `{`{ ['your_channel_id_1', 'your_channel_id_2', ...] `}`}": "\n\tPlease make sure add the bot to the channel by following these steps:\n\t 1. Type /invite in the channel's chat.\n\t 2. Click on Add apps to this channel.\n\t 3. Search for and add the bot.\n \n**Note**: If you can't find the channel in the dropdown list (which fetches up to 2000 channels), please click on the **(F)** and type the channel ID directly in an array like this: `{`{ ['your_channel_id_1', 'your_channel_id_2', ...] `}`}",
"If no channel is selected, the flow will be triggered for username mentions in all channels": "Si aucun canal n'est sélectionné, le flux sera déclenché pour les mentions d'utilisateur dans tous les canaux",
"Select emojis to trigger on": "Sélectionnez les émoticônes à activer",
"If no channel is selected, the flow will be triggered for reactions in all channels the app has access to": "Si aucun canal n'est sélectionné, le flux sera déclenché pour les réactions dans tous les canaux auxquels l'application a accès",
"List of valid commands that the bot should respond to (e.g., help, ocr, remind)": "Liste des commandes valides auxquelles le bot doit répondre (par exemple, aide, ocr, rappel)",
- "If no channel is selected, the flow will be triggered for commands in all channels": "Si aucun canal n'est sélectionné, le flux sera déclenché pour les commandes dans tous les canaux"
+ "If no channel is selected, the flow will be triggered for commands in all channels": "Si aucun canal n'est sélectionné, le flux sera déclenché pour les commandes dans tous les canaux",
+ "Select the type of modal interaction to trigger on.": "Sélectionnez le type d'interaction modale à activer.",
+ "View Submission": "Voir la soumission",
+ "View Closed": "Vue fermée"
}
\ No newline at end of file
diff --git a/packages/pieces/community/slack/src/i18n/ja.json b/packages/pieces/community/slack/src/i18n/ja.json
index 70392ce870c..81fed8371b3 100644
--- a/packages/pieces/community/slack/src/i18n/ja.json
+++ b/packages/pieces/community/slack/src/i18n/ja.json
@@ -154,6 +154,7 @@
"New User": "新規ユーザー",
"New Saved Message": "新規保存されたメッセージ",
"New Team Custom Emoji": "新しいチームカスタム絵文字",
+ "New Modal Interaction": "新しいモーダルの相互作用",
"Triggers when a new message is posted to any channel.": "新しいメッセージが任意のチャンネルに投稿されたときにトリガーします。",
"Triggers when a new message is posted to a specific #channel you choose.": "選択した特定の#チャンネルに新しいメッセージが投稿されたときにトリガーされます。",
"Triggers when a message was posted in a direct message channel.": "メッセージがダイレクトメッセージチャンネルに投稿されたときにトリガーします。",
@@ -166,15 +167,20 @@
"Triggers when a new user is created / first joins your org.": "新規ユーザーが作成されたとき/最初に組織に参加したときにトリガーします。",
"Triggers when you save a message.": "メッセージを保存するときにトリガーします。",
"Triggers when a custom emoji has been added to a team.": "カスタム絵文字がチームに追加されたときにトリガーします。",
+ "Triggers when a user interacts with a modal.": "ユーザーがモーダルとやり取りしたときにトリガーします。",
"Ignore Bot Messages ?": "ボットメッセージを無視しますか?",
"Ignore Message from Yourself ?": "自分からのメッセージを無視しますか?",
"Channels": "チャンネル",
"Emojis (E.g fire, smile)": "Emojis (E.g fire, smile)",
"Commands": "マーク",
+ "Interaction Type": "インタラクションタイプ",
"\n\tPlease make sure add the bot to the channel by following these steps:\n\t 1. Type /invite in the channel's chat.\n\t 2. Click on Add apps to this channel.\n\t 3. Search for and add the bot.\n \n**Note**: If you can't find the channel in the dropdown list (which fetches up to 2000 channels), please click on the **(F)** and type the channel ID directly in an array like this: `{`{ ['your_channel_id_1', 'your_channel_id_2', ...] `}`}": "\n以下の手順に従って、ボットをチャンネルに追加してください。\n1. チャンネルのチャットに「/invite」と入力します。\n2. 「このチャンネルにアプリを追加する」をクリックします。\n3. ボットを検索して追加します。\n\n**注**: ドロップダウンリスト(最大2000件のチャンネルが表示されます)にチャンネルが見つからない場合は、**(F)** をクリックし、チャンネルIDを配列形式で直接入力してください。例: `{`{ ['your_channel_id_1', 'your_channel_id_2', ...] `}`}",
"If no channel is selected, the flow will be triggered for username mentions in all channels": "チャンネルが選択されていない場合、フローはすべてのチャンネルのユーザー名メンションに対してトリガーされます",
"Select emojis to trigger on": "トリガーする絵文字を選択してください",
"If no channel is selected, the flow will be triggered for reactions in all channels the app has access to": "チャンネルが選択されていない場合、アプリがアクセスできるすべてのチャンネルのリアクションに対してフローがトリガーされます。",
"List of valid commands that the bot should respond to (e.g., help, ocr, remind)": "ボットが応答する有効なコマンドのリスト(例:ヘルプ、分かった、リマインダーなど)",
- "If no channel is selected, the flow will be triggered for commands in all channels": "チャンネルが選択されていない場合、フローはすべてのチャンネルのコマンドに対してトリガーされます"
+ "If no channel is selected, the flow will be triggered for commands in all channels": "チャンネルが選択されていない場合、フローはすべてのチャンネルのコマンドに対してトリガーされます",
+ "Select the type of modal interaction to trigger on.": "起動するモーダルインタラクションの種類を選択します。",
+ "View Submission": "提出物を表示",
+ "View Closed": "クローズされた表示"
}
\ No newline at end of file
diff --git a/packages/pieces/community/slack/src/i18n/nl.json b/packages/pieces/community/slack/src/i18n/nl.json
index a87aa41f35d..84bf6c433a1 100644
--- a/packages/pieces/community/slack/src/i18n/nl.json
+++ b/packages/pieces/community/slack/src/i18n/nl.json
@@ -154,6 +154,7 @@
"New User": "Nieuwe gebruiker",
"New Saved Message": "Nieuw opgeslagen bericht",
"New Team Custom Emoji": "Nieuw Team Aangepaste Emoji",
+ "New Modal Interaction": "Nieuwe Modal Interactie",
"Triggers when a new message is posted to any channel.": "Wordt uitgevoerd wanneer een nieuw bericht op een kanaal is geplaatst.",
"Triggers when a new message is posted to a specific #channel you choose.": "Triggert wanneer een nieuw bericht wordt geplaatst op een specifiek #channel dat je kiest.",
"Triggers when a message was posted in a direct message channel.": "Triggert wanneer een bericht is geplaatst in een direct berichtkanaal.",
@@ -166,15 +167,20 @@
"Triggers when a new user is created / first joins your org.": "Triggert wanneer een nieuwe gebruiker wordt aangemaakt / treedt voor het eerst bij je org.",
"Triggers when you save a message.": "Triggert wanneer je een bericht opslaat.",
"Triggers when a custom emoji has been added to a team.": "Triggert wanneer een eigen emoji aan een team is toegevoegd.",
+ "Triggers when a user interacts with a modal.": "Triggert wanneer een gebruiker met een modal interactief is.",
"Ignore Bot Messages ?": "Bot berichten negeren?",
"Ignore Message from Yourself ?": "Negeer bericht van jezelf ?",
"Channels": "Kanalen",
"Emojis (E.g fire, smile)": "Emojis (E.g vuur, smile)",
"Commands": "Opdrachten",
+ "Interaction Type": "Interactie Type",
"\n\tPlease make sure add the bot to the channel by following these steps:\n\t 1. Type /invite in the channel's chat.\n\t 2. Click on Add apps to this channel.\n\t 3. Search for and add the bot.\n \n**Note**: If you can't find the channel in the dropdown list (which fetches up to 2000 channels), please click on the **(F)** and type the channel ID directly in an array like this: `{`{ ['your_channel_id_1', 'your_channel_id_2', ...] `}`}": "\n\t± voeg de bot toe aan het kanaal door de volgende stappen te volgen:\n\t 1. Typ /invite in de chat van het kanaal.\n\t 2. Klik op Apps toevoegen aan dit kanaal.\n\t 3. Zoek naar en voeg de bot toe.\n \n**Opmerking**: Als je het kanaal niet kan vinden in de dropdown lijst (die tot 2000 kanalen ophaalt), klik op **(F)** en typ de kanaal ID direct in een array zoals dit: `{`{ ['your_channel_id_1', 'your_channel_id_2', . .] `}`}",
"If no channel is selected, the flow will be triggered for username mentions in all channels": "Als er geen kanaal is geselecteerd, zal de flow worden geactiveerd voor vermelding van de gebruikersnaam in alle kanalen",
"Select emojis to trigger on": "Selecteer emojis op te starten",
"If no channel is selected, the flow will be triggered for reactions in all channels the app has access to": "Als er geen kanaal is geselecteerd, zal de stroom worden geactiveerd voor reacties in alle kanalen waar de app toegang tot heeft",
"List of valid commands that the bot should respond to (e.g., help, ocr, remind)": "Lijst van geldige commando's waarop de bot moet reageren (bijv. hulp, ocr, herinnering)",
- "If no channel is selected, the flow will be triggered for commands in all channels": "Als er geen kanaal is geselecteerd, wordt de stroom geactiveerd voor commando's in alle kanalen"
+ "If no channel is selected, the flow will be triggered for commands in all channels": "Als er geen kanaal is geselecteerd, wordt de stroom geactiveerd voor commando's in alle kanalen",
+ "Select the type of modal interaction to trigger on.": "Selecteer het type modale interactie waarop u wilt starten.",
+ "View Submission": "Inzending bekijken",
+ "View Closed": "Weergave gesloten"
}
\ No newline at end of file
diff --git a/packages/pieces/community/slack/src/i18n/pt.json b/packages/pieces/community/slack/src/i18n/pt.json
index 09f6e256608..7fb539d450c 100644
--- a/packages/pieces/community/slack/src/i18n/pt.json
+++ b/packages/pieces/community/slack/src/i18n/pt.json
@@ -154,6 +154,7 @@
"New User": "Novo Usuário",
"New Saved Message": "Nova mensagem salva",
"New Team Custom Emoji": "Emoji Personalizado do Novo Time",
+ "New Modal Interaction": "Nova Interação Modal",
"Triggers when a new message is posted to any channel.": "Aciona quando uma nova mensagem é postada em qualquer canal.",
"Triggers when a new message is posted to a specific #channel you choose.": "Dispara quando uma nova mensagem for publicada em um canal de #canal específico que você escolher.",
"Triggers when a message was posted in a direct message channel.": "Aciona quando uma mensagem é postada em um canal de mensagem direta.",
@@ -166,15 +167,20 @@
"Triggers when a new user is created / first joins your org.": "Dispara quando um novo usuário é criado / entra pela primeira vez em sua organização.",
"Triggers when you save a message.": "Dispara quando você salvar uma mensagem.",
"Triggers when a custom emoji has been added to a team.": "Dispara quando um emoji personalizado foi adicionado a uma equipe.",
+ "Triggers when a user interacts with a modal.": "Dispara quando um usuário interage com uma modal.",
"Ignore Bot Messages ?": "Ignorar mensagens do Bot ?",
"Ignore Message from Yourself ?": "Ignorar a mensagem de si mesmo?",
"Channels": "Canais",
"Emojis (E.g fire, smile)": "Emojis (E.g fogo, sorriso)",
"Commands": "Comandos",
+ "Interaction Type": "Tipo de interação",
"\n\tPlease make sure add the bot to the channel by following these steps:\n\t 1. Type /invite in the channel's chat.\n\t 2. Click on Add apps to this channel.\n\t 3. Search for and add the bot.\n \n**Note**: If you can't find the channel in the dropdown list (which fetches up to 2000 channels), please click on the **(F)** and type the channel ID directly in an array like this: `{`{ ['your_channel_id_1', 'your_channel_id_2', ...] `}`}": "\n\tCertifique-se de adicionar o bot ao canal seguindo estes passos:\n\t 1. Digite /invite no chat do canal.\n\t 2. Clique em adicionar aplicativos a este canal.\n\t 3. Procurar e adicionar o bot.\n \n**Nota**: Se você não consegue encontrar o canal na lista suspensa (que busca até 2000 canais), por favor clique em **(F)** e digite o ID do canal diretamente em um array como este: `{`{ ['your_channel_id_1', 'your_channel_id_2', . .] `}`}",
"If no channel is selected, the flow will be triggered for username mentions in all channels": "Se nenhum canal estiver selecionado, o fluxo será acionado para menções de nome de usuário em todos os canais",
"Select emojis to trigger on": "Selecionar emojis para acionar",
"If no channel is selected, the flow will be triggered for reactions in all channels the app has access to": "Se nenhum canal for selecionado, o fluxo será acionado para reações em todos os canais a que o app tem acesso",
"List of valid commands that the bot should respond to (e.g., help, ocr, remind)": "Lista de comandos válidos que o bot deve responder (por exemplo, ajuda, ocr, lembrete)",
- "If no channel is selected, the flow will be triggered for commands in all channels": "Se nenhum canal estiver selecionado, o fluxo será acionado para comandos em todos os canais"
+ "If no channel is selected, the flow will be triggered for commands in all channels": "Se nenhum canal estiver selecionado, o fluxo será acionado para comandos em todos os canais",
+ "Select the type of modal interaction to trigger on.": "Selecione o tipo de interação modal para ativar.",
+ "View Submission": "Visualizar envio",
+ "View Closed": "Ver Fechado"
}
\ No newline at end of file
diff --git a/packages/pieces/community/slack/src/i18n/zh.json b/packages/pieces/community/slack/src/i18n/zh.json
index 630044c9112..9b78e1805c6 100644
--- a/packages/pieces/community/slack/src/i18n/zh.json
+++ b/packages/pieces/community/slack/src/i18n/zh.json
@@ -154,6 +154,7 @@
"New User": "New User",
"New Saved Message": "New Saved Message",
"New Team Custom Emoji": "New Team Custom Emoji",
+ "New Modal Interaction": "New Modal Interaction",
"Triggers when a new message is posted to any channel.": "Triggers when a new message is posted to any channel.",
"Triggers when a new message is posted to a specific #channel you choose.": "Triggers when a new message is posted to a specific #channel you choose.",
"Triggers when a message was posted in a direct message channel.": "Triggers when a message was posted in a direct message channel.",
@@ -166,15 +167,20 @@
"Triggers when a new user is created / first joins your org.": "Triggers when a new user is created / first joins your org.",
"Triggers when you save a message.": "Triggers when you save a message.",
"Triggers when a custom emoji has been added to a team.": "Triggers when a custom emoji has been added to a team.",
+ "Triggers when a user interacts with a modal.": "Triggers when a user interacts with a modal.",
"Ignore Bot Messages ?": "Ignore Bot Messages ?",
"Ignore Message from Yourself ?": "Ignore Message from Yourself ?",
"Channels": "Channels",
"Emojis (E.g fire, smile)": "Emojis (E.g fire, smile)",
"Commands": "Commands",
+ "Interaction Type": "Interaction Type",
"\n\tPlease make sure add the bot to the channel by following these steps:\n\t 1. Type /invite in the channel's chat.\n\t 2. Click on Add apps to this channel.\n\t 3. Search for and add the bot.\n \n**Note**: If you can't find the channel in the dropdown list (which fetches up to 2000 channels), please click on the **(F)** and type the channel ID directly in an array like this: `{`{ ['your_channel_id_1', 'your_channel_id_2', ...] `}`}": "\n\tPlease make sure add the bot to the channel by following these steps:\n\t 1. Type /invite in the channel's chat.\n\t 2. Click on Add apps to this channel.\n\t 3. Search for and add the bot.\n \n**Note**: If you can't find the channel in the dropdown list (which fetches up to 2000 channels), please click on the **(F)** and type the channel ID directly in an array like this: `{`{ ['your_channel_id_1', 'your_channel_id_2', ...] `}`}",
"If no channel is selected, the flow will be triggered for username mentions in all channels": "If no channel is selected, the flow will be triggered for username mentions in all channels",
"Select emojis to trigger on": "Select emojis to trigger on",
"If no channel is selected, the flow will be triggered for reactions in all channels the app has access to": "If no channel is selected, the flow will be triggered for reactions in all channels the app has access to",
"List of valid commands that the bot should respond to (e.g., help, ocr, remind)": "List of valid commands that the bot should respond to (e.g., help, ocr, remind)",
- "If no channel is selected, the flow will be triggered for commands in all channels": "If no channel is selected, the flow will be triggered for commands in all channels"
+ "If no channel is selected, the flow will be triggered for commands in all channels": "If no channel is selected, the flow will be triggered for commands in all channels",
+ "Select the type of modal interaction to trigger on.": "Select the type of modal interaction to trigger on.",
+ "View Submission": "View Submission",
+ "View Closed": "View Closed"
}
\ No newline at end of file
diff --git a/packages/pieces/core/file-helper/src/i18n/de.json b/packages/pieces/core/file-helper/src/i18n/de.json
index 0289cbc88f6..f3e17c9d763 100644
--- a/packages/pieces/core/file-helper/src/i18n/de.json
+++ b/packages/pieces/core/file-helper/src/i18n/de.json
@@ -118,6 +118,6 @@
"CD Audio": "CD Audio",
"MPEG Transport Stream": "MPEG-Transport-Stream",
"Opus Audio in Ogg Container": "Opus Audio im Ogg Container",
- "Get File Name": "Dateinamen abrufen",
- "Get the name of a file": "Den Namen einer Datei abrufen"
+ "Get File Name": "Dateiname abrufen",
+ "Get the name of a file": "Den Dateinamen abrufen"
}
\ No newline at end of file
diff --git a/packages/pieces/core/file-helper/src/i18n/fr.json b/packages/pieces/core/file-helper/src/i18n/fr.json
index 8d4d554da69..6fde983ef77 100644
--- a/packages/pieces/core/file-helper/src/i18n/fr.json
+++ b/packages/pieces/core/file-helper/src/i18n/fr.json
@@ -119,5 +119,5 @@
"MPEG Transport Stream": "Flux de Transport MPEG",
"Opus Audio in Ogg Container": "Opus Audio dans Ogg Container",
"Get File Name": "Obtenir le nom du fichier",
- "Get the name of a file": "Obtenir le nom d'un fichier"
+ "Get the name of a file": "Récupère le nom d'un fichier"
}
\ No newline at end of file
diff --git a/packages/pieces/core/file-helper/src/i18n/ja.json b/packages/pieces/core/file-helper/src/i18n/ja.json
index ee416046d68..3801ab90124 100644
--- a/packages/pieces/core/file-helper/src/i18n/ja.json
+++ b/packages/pieces/core/file-helper/src/i18n/ja.json
@@ -119,5 +119,5 @@
"MPEG Transport Stream": "MPEG転送ストリーム",
"Opus Audio in Ogg Container": "Opus Audio in Ogg Container",
"Get File Name": "ファイル名を取得",
- "Get the name of a file": "ファイルの名前を取得します"
+ "Get the name of a file": "ファイル名を取得する"
}
\ No newline at end of file
diff --git a/packages/pieces/core/file-helper/src/i18n/nl.json b/packages/pieces/core/file-helper/src/i18n/nl.json
index 889567d64ee..6f91e2abd47 100644
--- a/packages/pieces/core/file-helper/src/i18n/nl.json
+++ b/packages/pieces/core/file-helper/src/i18n/nl.json
@@ -119,5 +119,5 @@
"MPEG Transport Stream": "MPEG Transport Stream",
"Opus Audio in Ogg Container": "Opus Audio in Ogg Container",
"Get File Name": "Bestandsnaam ophalen",
- "Get the name of a file": "Haal de naam van een bestand op"
+ "Get the name of a file": "De naam van een bestand ophalen"
}
\ No newline at end of file
diff --git a/packages/pieces/core/file-helper/src/i18n/pt.json b/packages/pieces/core/file-helper/src/i18n/pt.json
index 16e4690a320..f1fc0c47135 100644
--- a/packages/pieces/core/file-helper/src/i18n/pt.json
+++ b/packages/pieces/core/file-helper/src/i18n/pt.json
@@ -118,6 +118,6 @@
"CD Audio": "Áudio do CD",
"MPEG Transport Stream": "Transporte MPEG - Transporte",
"Opus Audio in Ogg Container": "Opus Audio no Recipiente Ogg",
- "Get File Name": "Obter nome do arquivo",
+ "Get File Name": "Obter Nome do Arquivo",
"Get the name of a file": "Obter o nome de um arquivo"
}
\ No newline at end of file
diff --git a/packages/pieces/core/file-helper/src/i18n/zh.json b/packages/pieces/core/file-helper/src/i18n/zh.json
index 2a53bcdccf5..8102c512b4a 100644
--- a/packages/pieces/core/file-helper/src/i18n/zh.json
+++ b/packages/pieces/core/file-helper/src/i18n/zh.json
@@ -118,6 +118,6 @@
"CD Audio": "CD Audio",
"MPEG Transport Stream": "MPEG Transport Stream",
"Opus Audio in Ogg Container": "Opus Audio in Ogg Container",
- "Get File Name": "获取文件名",
- "Get the name of a file": "获取文件的名称"
+ "Get File Name": "Get File Name",
+ "Get the name of a file": "Get the name of a file"
}
\ No newline at end of file
diff --git a/packages/web/src/lib/authentication-api.ts b/packages/web/src/api/authentication-api.ts
similarity index 100%
rename from packages/web/src/lib/authentication-api.ts
rename to packages/web/src/api/authentication-api.ts
diff --git a/packages/web/src/lib/flags-api.ts b/packages/web/src/api/flags-api.ts
similarity index 83%
rename from packages/web/src/lib/flags-api.ts
rename to packages/web/src/api/flags-api.ts
index 1a45a778b9d..1532807bc44 100644
--- a/packages/web/src/lib/flags-api.ts
+++ b/packages/web/src/api/flags-api.ts
@@ -1,4 +1,4 @@
-import { api } from './api';
+import { api } from '@/lib/api';
export type FlagsMap = Record;
export const flagsApi = {
diff --git a/packages/web/src/lib/health-api.ts b/packages/web/src/api/health-api.ts
similarity index 88%
rename from packages/web/src/lib/health-api.ts
rename to packages/web/src/api/health-api.ts
index 5462c9f511b..f9bd89ac740 100644
--- a/packages/web/src/lib/health-api.ts
+++ b/packages/web/src/api/health-api.ts
@@ -1,6 +1,6 @@
import { GetSystemHealthChecksResponse } from '@activepieces/shared';
-import { api } from './api';
+import { api } from '@/lib/api';
export const healthApi = {
getSystemHealthChecks(): Promise {
diff --git a/packages/web/src/lib/platform-user-api.ts b/packages/web/src/api/platform-user-api.ts
similarity index 100%
rename from packages/web/src/lib/platform-user-api.ts
rename to packages/web/src/api/platform-user-api.ts
diff --git a/packages/web/src/lib/platforms-api.ts b/packages/web/src/api/platforms-api.ts
similarity index 92%
rename from packages/web/src/lib/platforms-api.ts
rename to packages/web/src/api/platforms-api.ts
index 4b76a0ffe8e..ff83256baee 100644
--- a/packages/web/src/lib/platforms-api.ts
+++ b/packages/web/src/api/platforms-api.ts
@@ -3,8 +3,8 @@ import {
UpdatePlatformRequestBody,
} from '@activepieces/shared';
-import { api } from './api';
-import { authenticationSession } from './authentication-session';
+import { api } from '@/lib/api';
+import { authenticationSession } from '@/lib/authentication-session';
export const platformApi = {
deleteAccount() {
diff --git a/packages/web/src/lib/user-api.ts b/packages/web/src/api/user-api.ts
similarity index 95%
rename from packages/web/src/lib/user-api.ts
rename to packages/web/src/api/user-api.ts
index b59b590ef32..7f9e07153a5 100644
--- a/packages/web/src/lib/user-api.ts
+++ b/packages/web/src/api/user-api.ts
@@ -1,6 +1,6 @@
import { UpdateMeResponse, UserWithBadges } from '@activepieces/shared';
-import { api } from './api';
+import { api } from '@/lib/api';
export const userApi = {
getUserById(id: string) {
diff --git a/packages/web/src/app/app.tsx b/packages/web/src/app/app.tsx
index adc4e6ae378..816b5bd9f4a 100644
--- a/packages/web/src/app/app.tsx
+++ b/packages/web/src/app/app.tsx
@@ -11,13 +11,13 @@ import {
import React from 'react';
import { useTranslation } from 'react-i18next';
-import { EmbeddingProvider } from '@/components/embed-provider';
-import TelemetryProvider from '@/components/telemetry-provider';
-import { ThemeProvider } from '@/components/theme-provider';
+import { EmbeddingProvider } from '@/components/providers/embed-provider';
+import TelemetryProvider from '@/components/providers/telemetry-provider';
+import { ThemeProvider } from '@/components/providers/theme-provider';
import { internalErrorToast, Toaster } from '@/components/ui/sonner';
import { TooltipProvider } from '@/components/ui/tooltip';
-import { useManagePlanDialogStore } from '@/features/billing/lib/active-flows-addon-dialog-state';
-import { RefreshAnalyticsProvider } from '@/features/platform-admin/lib/refresh-analytics-context';
+import { useManagePlanDialogStore } from '@/features/billing';
+import { RefreshAnalyticsProvider } from '@/features/platform-admin';
import { api } from '@/lib/api';
import { EmbeddingFontLoader } from './components/embedding-font-loader';
diff --git a/packages/web/src/app/builder/builder-header/builder-header.tsx b/packages/web/src/app/builder/builder-header/builder-header.tsx
index c5631695c99..f392de17255 100644
--- a/packages/web/src/app/builder/builder-header/builder-header.tsx
+++ b/packages/web/src/app/builder/builder-header/builder-header.tsx
@@ -18,8 +18,11 @@ import {
} from 'react-router-dom';
import { useBuilderStateContext } from '@/app/builder/builder-hooks';
+import { RightSideBarType } from '@/app/builder/types';
+import EditableText from '@/components/custom/editable-text';
+import { HomeButton } from '@/components/custom/home-button';
import { PageHeader } from '@/components/custom/page-header';
-import { useEmbedding } from '@/components/embed-provider';
+import { useEmbedding } from '@/components/providers/embed-provider';
import {
Breadcrumb,
BreadcrumbItem,
@@ -29,20 +32,15 @@ import {
BreadcrumbSeparator,
} from '@/components/ui/breadcrumb';
import { Button } from '@/components/ui/button';
-import EditableText from '@/components/ui/editable-text';
-import { HomeButton } from '@/components/ui/home-button';
-import { flowHooks } from '@/features/flows/lib/flow-hooks';
-import { foldersHooks } from '@/features/folders/lib/folders-hooks';
+import { flowHooks } from '@/features/flows';
+import { foldersHooks } from '@/features/folders';
+import { getProjectName, projectCollectionUtils } from '@/features/projects';
import { useAuthorization } from '@/hooks/authorization-hooks';
import { flagsHooks } from '@/hooks/flags-hooks';
-import {
- getProjectName,
- projectCollectionUtils,
-} from '@/hooks/project-collection';
import { authenticationSession } from '@/lib/authentication-session';
import { useNewWindow } from '@/lib/navigation-utils';
-import { RightSideBarType } from '@/lib/types';
-import { cn, NEW_FLOW_QUERY_PARAM } from '@/lib/utils';
+import { NEW_FLOW_QUERY_PARAM } from '@/lib/route-utils';
+import { cn } from '@/lib/utils';
import FlowActionMenu from '../../components/flow-actions-menu';
import { flowCanvasConsts } from '../flow-canvas/utils/consts';
diff --git a/packages/web/src/app/builder/builder-header/flow-status/index.tsx b/packages/web/src/app/builder/builder-header/flow-status/index.tsx
index 90db8f177b5..8695af71af2 100644
--- a/packages/web/src/app/builder/builder-header/flow-status/index.tsx
+++ b/packages/web/src/app/builder/builder-header/flow-status/index.tsx
@@ -2,8 +2,7 @@ import { FlowVersionState, isNil } from '@activepieces/shared';
import React from 'react';
import { useBuilderStateContext } from '@/app/builder/builder-hooks';
-import { FlowStatusToggle } from '@/features/flows/components/flow-status-toggle';
-import { FlowVersionStateDot } from '@/features/flows/components/flow-version-state-dot';
+import { FlowStatusToggle, FlowVersionStateDot } from '@/features/flows';
const BuilderFlowStatusSection = React.memo(() => {
const [flowVersion, flow] = useBuilderStateContext((state) => [
diff --git a/packages/web/src/app/builder/data-selector/data-selector-node-content.tsx b/packages/web/src/app/builder/data-selector/data-selector-node-content.tsx
index 59a79683d94..b68a1a15286 100644
--- a/packages/web/src/app/builder/data-selector/data-selector-node-content.tsx
+++ b/packages/web/src/app/builder/data-selector/data-selector-node-content.tsx
@@ -2,10 +2,10 @@ import { flowStructureUtil } from '@activepieces/shared';
import { t } from 'i18next';
import { ChevronDown, ChevronUp } from 'lucide-react';
-import { useApRipple } from '../../../components/theme-provider';
-import { Button } from '../../../components/ui/button';
-import { PieceIcon } from '../../../features/pieces/components/piece-icon';
-import { stepsHooks } from '../../../features/pieces/lib/steps-hooks';
+import { useApRipple } from '@/components/providers/theme-provider';
+import { Button } from '@/components/ui/button';
+import { PieceIcon, stepsHooks } from '@/features/pieces';
+
import { useBuilderStateContext } from '../builder-hooks';
import { DataSelectorTreeNode } from './type';
diff --git a/packages/web/src/app/builder/data-selector/data-selector-size-togglers.tsx b/packages/web/src/app/builder/data-selector/data-selector-size-togglers.tsx
index ea98f17cae9..13f1866c281 100644
--- a/packages/web/src/app/builder/data-selector/data-selector-size-togglers.tsx
+++ b/packages/web/src/app/builder/data-selector/data-selector-size-togglers.tsx
@@ -1,13 +1,13 @@
import { t } from 'i18next';
import { ExpandIcon, MinusIcon, PanelRightDashedIcon } from 'lucide-react';
+import { Button } from '@/components/ui/button';
import {
Tooltip,
TooltipContent,
TooltipTrigger,
} from '@/components/ui/tooltip';
-import { Button } from '../../../components/ui/button';
import { cn } from '../../../lib/utils';
export enum DataSelectorSizeState {
diff --git a/packages/web/src/app/builder/data-selector/index.tsx b/packages/web/src/app/builder/data-selector/index.tsx
index 8256f8ff992..9f56b890f80 100644
--- a/packages/web/src/app/builder/data-selector/index.tsx
+++ b/packages/web/src/app/builder/data-selector/index.tsx
@@ -4,7 +4,7 @@ import { SearchXIcon } from 'lucide-react';
import { useCallback, useEffect, useRef, useState } from 'react';
import { textMentionUtils } from '@/app/builder/piece-properties/text-input-with-mentions/text-input-utils';
-import { SearchInput } from '@/components/ui/search-input';
+import { SearchInput } from '@/components/custom/search-input';
import { cn } from '@/lib/utils';
import { ScrollArea } from '../../../components/ui/scroll-area';
diff --git a/packages/web/src/app/builder/data-selector/test-step-section.tsx b/packages/web/src/app/builder/data-selector/test-step-section.tsx
index 021a35bdbf0..5b2f0513400 100644
--- a/packages/web/src/app/builder/data-selector/test-step-section.tsx
+++ b/packages/web/src/app/builder/data-selector/test-step-section.tsx
@@ -1,6 +1,7 @@
import { t } from 'i18next';
-import { Button } from '../../../components/ui/button';
+import { Button } from '@/components/ui/button';
+
import { useBuilderStateContext } from '../builder-hooks';
export const TestStepSection = ({ stepName }: { stepName: string }) => {
diff --git a/packages/web/src/app/builder/data-selector/utils.ts b/packages/web/src/app/builder/data-selector/utils.ts
index 7452770ae1b..46a9061ad52 100644
--- a/packages/web/src/app/builder/data-selector/utils.ts
+++ b/packages/web/src/app/builder/data-selector/utils.ts
@@ -7,7 +7,7 @@ import {
FlowTriggerType,
} from '@activepieces/shared';
-import { pieceSelectorUtils } from '@/features/pieces/lib/piece-selector-utils';
+import { pieceSelectorUtils } from '@/features/pieces';
import {
DataSelectorTreeNode,
diff --git a/packages/web/src/app/builder/flow-canvas/canvas-controls.tsx b/packages/web/src/app/builder/flow-canvas/canvas-controls.tsx
index c5d1d80019a..fd406a953ea 100644
--- a/packages/web/src/app/builder/flow-canvas/canvas-controls.tsx
+++ b/packages/web/src/app/builder/flow-canvas/canvas-controls.tsx
@@ -18,7 +18,7 @@ import {
TooltipTrigger,
TooltipContent,
} from '@/components/ui/tooltip';
-import { isMac } from '@/lib/utils';
+import { isMac } from '@/lib/dom-utils';
import { useBuilderStateContext } from '../builder-hooks';
import { NoteDragOverlayMode } from '../state/notes-state';
diff --git a/packages/web/src/app/builder/flow-canvas/context-menu/canvas-context-menu-content.tsx b/packages/web/src/app/builder/flow-canvas/context-menu/canvas-context-menu-content.tsx
index b45c62108af..c0d3dce214d 100644
--- a/packages/web/src/app/builder/flow-canvas/context-menu/canvas-context-menu-content.tsx
+++ b/packages/web/src/app/builder/flow-canvas/context-menu/canvas-context-menu-content.tsx
@@ -17,6 +17,7 @@ import {
Trash,
} from 'lucide-react';
+import { Shortcut, ShortcutProps } from '@/components/custom/shortcut';
import {
ContextMenuContent,
ContextMenuItem,
@@ -25,7 +26,6 @@ import {
ContextMenuSubContent,
ContextMenuSubTrigger,
} from '@/components/ui/context-menu';
-import { Shortcut, ShortcutProps } from '@/components/ui/shortcut';
import { useBuilderStateContext } from '../../builder-hooks';
import { CanvasShortcuts } from '../../shortcuts';
diff --git a/packages/web/src/app/builder/flow-canvas/context-menu/canvas-context-menu.tsx b/packages/web/src/app/builder/flow-canvas/context-menu/canvas-context-menu.tsx
index 666cc24afb0..dece52b5ac6 100644
--- a/packages/web/src/app/builder/flow-canvas/context-menu/canvas-context-menu.tsx
+++ b/packages/web/src/app/builder/flow-canvas/context-menu/canvas-context-menu.tsx
@@ -1,5 +1,5 @@
+import { ShortcutProps } from '@/components/custom/shortcut';
import { ContextMenu, ContextMenuTrigger } from '@/components/ui/context-menu';
-import { ShortcutProps } from '@/components/ui/shortcut';
import { CanvasContextMenuContent } from './canvas-context-menu-content';
diff --git a/packages/web/src/app/builder/flow-canvas/hooks.tsx b/packages/web/src/app/builder/flow-canvas/hooks.tsx
index 7b0de7d2fed..3ec54b10c45 100644
--- a/packages/web/src/app/builder/flow-canvas/hooks.tsx
+++ b/packages/web/src/app/builder/flow-canvas/hooks.tsx
@@ -14,13 +14,12 @@ import { ImperativePanelHandle } from 'react-resizable-panels';
import { useLocation, usePrevious } from 'react-use';
import { useDebouncedCallback } from 'use-debounce';
-import { useEmbedding } from '@/components/embed-provider';
-import { useSocket } from '@/components/socket-provider';
-import { flowRunUtils } from '@/features/flow-runs/lib/flow-run-utils';
-import { flowRunsApi } from '@/features/flow-runs/lib/flow-runs-api';
-import { flowsApi } from '@/features/flows/lib/flows-api';
+import { RightSideBarType } from '@/app/builder/types';
+import { useEmbedding } from '@/components/providers/embed-provider';
+import { useSocket } from '@/components/providers/socket-provider';
+import { flowRunsApi, flowRunUtils } from '@/features/flow-runs';
+import { flowsApi } from '@/features/flows';
import { useAuthorization } from '@/hooks/authorization-hooks';
-import { RightSideBarType } from '@/lib/types';
import { useBuilderStateContext } from '../builder-hooks';
import { textMentionUtils } from '../piece-properties/text-input-with-mentions/text-input-utils';
diff --git a/packages/web/src/app/builder/flow-canvas/nodes/note-node/index.tsx b/packages/web/src/app/builder/flow-canvas/nodes/note-node/index.tsx
index a91fd52909f..498af89d9df 100644
--- a/packages/web/src/app/builder/flow-canvas/nodes/note-node/index.tsx
+++ b/packages/web/src/app/builder/flow-canvas/nodes/note-node/index.tsx
@@ -6,7 +6,7 @@ import { t } from 'i18next';
import { useRef, useState } from 'react';
import { useDebouncedCallback } from 'use-debounce';
-import { MarkdownInput } from '@/components/ui/markdown-input';
+import { MarkdownInput } from '@/components/custom/markdown-input';
import {
Tooltip,
TooltipContent,
diff --git a/packages/web/src/app/builder/flow-canvas/nodes/note-node/note-footer.tsx b/packages/web/src/app/builder/flow-canvas/nodes/note-node/note-footer.tsx
index 02290731c03..163a29a3581 100644
--- a/packages/web/src/app/builder/flow-canvas/nodes/note-node/note-footer.tsx
+++ b/packages/web/src/app/builder/flow-canvas/nodes/note-node/note-footer.tsx
@@ -1,7 +1,7 @@
import { isNil } from '@activepieces/shared';
import { ApAvatar } from '@/components/custom/ap-avatar';
-import { useEmbedding } from '@/components/embed-provider';
+import { useEmbedding } from '@/components/providers/embed-provider';
export const NoteFooter = ({ creatorId, isDragging }: NoteFooterProps) => {
const {
diff --git a/packages/web/src/app/builder/flow-canvas/nodes/note-node/note-tools.tsx b/packages/web/src/app/builder/flow-canvas/nodes/note-node/note-tools.tsx
index a4f2ad72305..66e6d93f763 100644
--- a/packages/web/src/app/builder/flow-canvas/nodes/note-node/note-tools.tsx
+++ b/packages/web/src/app/builder/flow-canvas/nodes/note-node/note-tools.tsx
@@ -5,11 +5,11 @@ import { TrashIcon } from 'lucide-react';
import { forwardRef, useRef, useState } from 'react';
import { useBuilderStateContext } from '@/app/builder/builder-hooks';
-import { Button } from '@/components/ui/button';
import {
MarkdownTools,
ToolWrapper,
-} from '@/components/ui/markdown-input/tools';
+} from '@/components/custom/markdown-input/tools';
+import { Button } from '@/components/ui/button';
import {
Popover,
PopoverContent,
diff --git a/packages/web/src/app/builder/flow-canvas/nodes/step-node/index.tsx b/packages/web/src/app/builder/flow-canvas/nodes/step-node/index.tsx
index 30ba1cc2476..66e2216aa30 100644
--- a/packages/web/src/app/builder/flow-canvas/nodes/step-node/index.tsx
+++ b/packages/web/src/app/builder/flow-canvas/nodes/step-node/index.tsx
@@ -11,8 +11,8 @@ import React, { useMemo } from 'react';
import { useBuilderStateContext } from '@/app/builder/builder-hooks';
import { PieceSelector } from '@/app/builder/pieces-selector';
import { LoopIterationInput } from '@/app/builder/run-details/loop-iteration-input';
-import { stepsHooks } from '@/features/pieces/lib/steps-hooks';
-import { RightSideBarType } from '@/lib/types';
+import { RightSideBarType } from '@/app/builder/types';
+import { stepsHooks } from '@/features/pieces';
import { cn } from '@/lib/utils';
import { flowCanvasConsts } from '../../utils/consts';
diff --git a/packages/web/src/app/builder/flow-canvas/nodes/step-node/step-drag-overlay.tsx b/packages/web/src/app/builder/flow-canvas/nodes/step-node/step-drag-overlay.tsx
index 83beab82091..9cc63f6408b 100644
--- a/packages/web/src/app/builder/flow-canvas/nodes/step-node/step-drag-overlay.tsx
+++ b/packages/web/src/app/builder/flow-canvas/nodes/step-node/step-drag-overlay.tsx
@@ -3,7 +3,7 @@ import { t } from 'i18next';
import { useState } from 'react';
import { useSidebar } from '@/components/ui/sidebar-shadcn';
-import { stepsHooks } from '@/features/pieces/lib/steps-hooks';
+import { stepsHooks } from '@/features/pieces';
import {
useCursorPosition,
diff --git a/packages/web/src/app/builder/flow-canvas/nodes/step-node/step-node-logo.tsx b/packages/web/src/app/builder/flow-canvas/nodes/step-node/step-node-logo.tsx
index bdb5b12e48b..95a9c5911ab 100644
--- a/packages/web/src/app/builder/flow-canvas/nodes/step-node/step-node-logo.tsx
+++ b/packages/web/src/app/builder/flow-canvas/nodes/step-node/step-node-logo.tsx
@@ -1,4 +1,4 @@
-import { ImageWithColorBackground } from '@/components/ui/image-with-color-background';
+import { ImageWithColorBackground } from '@/components/custom/image-with-color-background';
import { cn } from '@/lib/utils';
const StepNodeLogo = ({
diff --git a/packages/web/src/app/builder/flow-canvas/nodes/step-node/step-node-run-duration-and-piece-name.tsx b/packages/web/src/app/builder/flow-canvas/nodes/step-node/step-node-run-duration-and-piece-name.tsx
index 3928b93c8b1..ac94b88e591 100644
--- a/packages/web/src/app/builder/flow-canvas/nodes/step-node/step-node-run-duration-and-piece-name.tsx
+++ b/packages/web/src/app/builder/flow-canvas/nodes/step-node/step-node-run-duration-and-piece-name.tsx
@@ -3,8 +3,8 @@ import { useMemo } from 'react';
import { useBuilderStateContext } from '@/app/builder/builder-hooks';
import { TextWithTooltip } from '@/components/custom/text-with-tooltip';
-import { flowRunUtils } from '@/features/flow-runs/lib/flow-run-utils';
-import { formatUtils } from '@/lib/utils';
+import { flowRunUtils } from '@/features/flow-runs';
+import { formatUtils } from '@/lib/format-utils';
const StepNodeRunDuration = ({ duration }: { duration: number }) => {
return (
diff --git a/packages/web/src/app/builder/flow-canvas/nodes/step-node/step-node-status-in-run.tsx b/packages/web/src/app/builder/flow-canvas/nodes/step-node/step-node-status-in-run.tsx
index a204f621a6e..5de8b023708 100644
--- a/packages/web/src/app/builder/flow-canvas/nodes/step-node/step-node-status-in-run.tsx
+++ b/packages/web/src/app/builder/flow-canvas/nodes/step-node/step-node-status-in-run.tsx
@@ -1,8 +1,7 @@
import { t } from 'i18next';
import { useMemo } from 'react';
-import { StepStatusIcon } from '@/features/flow-runs/components/step-status-icon';
-import { flowRunUtils } from '@/features/flow-runs/lib/flow-run-utils';
+import { StepStatusIcon, flowRunUtils } from '@/features/flow-runs';
import { cn } from '@/lib/utils';
import { useBuilderStateContext } from '../../../builder-hooks';
diff --git a/packages/web/src/app/builder/flow-canvas/nodes/step-node/step-node-status.tsx b/packages/web/src/app/builder/flow-canvas/nodes/step-node/step-node-status.tsx
index 3fe7fa23d68..9bd92fa8ce6 100644
--- a/packages/web/src/app/builder/flow-canvas/nodes/step-node/step-node-status.tsx
+++ b/packages/web/src/app/builder/flow-canvas/nodes/step-node/step-node-status.tsx
@@ -1,9 +1,8 @@
import { t } from 'i18next';
import { useMemo } from 'react';
-import { LoadingSpinner } from '@/components/ui/spinner';
-import { StepStatusIcon } from '@/features/flow-runs/components/step-status-icon';
-import { flowRunUtils } from '@/features/flow-runs/lib/flow-run-utils';
+import { LoadingSpinner } from '@/components/custom/spinner';
+import { StepStatusIcon, flowRunUtils } from '@/features/flow-runs';
import { cn } from '@/lib/utils';
import { useBuilderStateContext } from '../../../builder-hooks';
diff --git a/packages/web/src/app/builder/flow-canvas/utils/flow-canvas-utils.ts b/packages/web/src/app/builder/flow-canvas/utils/flow-canvas-utils.ts
index 973e9653df4..0a22fbee76d 100644
--- a/packages/web/src/app/builder/flow-canvas/utils/flow-canvas-utils.ts
+++ b/packages/web/src/app/builder/flow-canvas/utils/flow-canvas-utils.ts
@@ -15,8 +15,8 @@ import {
} from '@activepieces/shared';
import { t } from 'i18next';
-import { flowRunUtils } from '@/features/flow-runs/lib/flow-run-utils';
-import { NEW_FLOW_QUERY_PARAM } from '@/lib/utils';
+import { flowRunUtils } from '@/features/flow-runs';
+import { NEW_FLOW_QUERY_PARAM } from '@/lib/route-utils';
import { flowCanvasConsts } from './consts';
import {
diff --git a/packages/web/src/app/builder/flow-canvas/widgets/above-trigger-button.tsx b/packages/web/src/app/builder/flow-canvas/widgets/above-trigger-button.tsx
index f9b62e4e39c..71c470bfea5 100644
--- a/packages/web/src/app/builder/flow-canvas/widgets/above-trigger-button.tsx
+++ b/packages/web/src/app/builder/flow-canvas/widgets/above-trigger-button.tsx
@@ -7,7 +7,8 @@ import {
TooltipContent,
TooltipTrigger,
} from '@/components/ui/tooltip';
-import { cn, isMac } from '@/lib/utils';
+import { isMac } from '@/lib/dom-utils';
+import { cn } from '@/lib/utils';
type AboveTriggerButtonProps = {
onClick: () => void;
diff --git a/packages/web/src/app/builder/flow-canvas/widgets/minimap.tsx b/packages/web/src/app/builder/flow-canvas/widgets/minimap.tsx
index fdd8cc187b4..d73c14bf3bf 100644
--- a/packages/web/src/app/builder/flow-canvas/widgets/minimap.tsx
+++ b/packages/web/src/app/builder/flow-canvas/widgets/minimap.tsx
@@ -1,10 +1,9 @@
import { flowStructureUtil, isNil, Step } from '@activepieces/shared';
import { MiniMap, MiniMapNodeProps } from '@xyflow/react';
-import { useTheme } from '@/components/theme-provider';
-import { stepsHooks } from '@/features/pieces/lib/steps-hooks';
+import { useTheme } from '@/components/providers/theme-provider';
+import { stepsHooks, StepMetadata } from '@/features/pieces';
import { colorsUtils } from '@/lib/color-utils';
-import { StepMetadata } from '@/lib/types';
import { useBuilderStateContext } from '../../builder-hooks';
diff --git a/packages/web/src/app/builder/flow-canvas/widgets/publish-flow-reminder-widget.tsx b/packages/web/src/app/builder/flow-canvas/widgets/publish-flow-reminder-widget.tsx
index 421d9b1c8ed..a040b895e00 100644
--- a/packages/web/src/app/builder/flow-canvas/widgets/publish-flow-reminder-widget.tsx
+++ b/packages/web/src/app/builder/flow-canvas/widgets/publish-flow-reminder-widget.tsx
@@ -10,16 +10,16 @@ import { InfoCircledIcon } from '@radix-ui/react-icons';
import { useMutation } from '@tanstack/react-query';
import { t } from 'i18next';
+import { RightSideBarType } from '@/app/builder/types';
+import { LoadingSpinner } from '@/components/custom/spinner';
import { Button } from '@/components/ui/button';
-import { LoadingSpinner } from '@/components/ui/spinner';
import {
Tooltip,
TooltipContent,
TooltipTrigger,
} from '@/components/ui/tooltip';
-import { flowHooks } from '@/features/flows/lib/flow-hooks';
+import { flowHooks } from '@/features/flows';
import { useAuthorization } from '@/hooks/authorization-hooks';
-import { RightSideBarType } from '@/lib/types';
import { useBuilderStateContext } from '../../builder-hooks';
diff --git a/packages/web/src/app/builder/flow-canvas/widgets/run-info-widget.tsx b/packages/web/src/app/builder/flow-canvas/widgets/run-info-widget.tsx
index d5fad184268..fa6d87ed6f4 100644
--- a/packages/web/src/app/builder/flow-canvas/widgets/run-info-widget.tsx
+++ b/packages/web/src/app/builder/flow-canvas/widgets/run-info-widget.tsx
@@ -6,9 +6,10 @@ import {
import { QuestionMarkIcon } from '@radix-ui/react-icons';
import { t } from 'i18next';
-import { flowRunUtils } from '@/features/flow-runs/lib/flow-run-utils';
+import { flowRunUtils } from '@/features/flow-runs';
import { flagsHooks } from '@/hooks/flags-hooks';
-import { cn, formatUtils } from '@/lib/utils';
+import { formatUtils } from '@/lib/format-utils';
+import { cn } from '@/lib/utils';
import { EditFlowOrViewDraftButton } from '../../builder-header/flow-status/view-draft-or-edit-flow-button';
import { useBuilderStateContext } from '../../builder-hooks';
diff --git a/packages/web/src/app/builder/flow-canvas/widgets/test-flow-widget.tsx b/packages/web/src/app/builder/flow-canvas/widgets/test-flow-widget.tsx
index fbc82fcc16a..daa7983d973 100644
--- a/packages/web/src/app/builder/flow-canvas/widgets/test-flow-widget.tsx
+++ b/packages/web/src/app/builder/flow-canvas/widgets/test-flow-widget.tsx
@@ -9,10 +9,10 @@ import { useRef } from 'react';
import { EditFlowOrViewDraftButton } from '@/app/builder/builder-header/flow-status/view-draft-or-edit-flow-button';
import { useBuilderStateContext } from '@/app/builder/builder-hooks';
-import { flowRunUtils } from '@/features/flow-runs/lib/flow-run-utils';
-import { flowHooks } from '@/features/flows/lib/flow-hooks';
-import { pieceSelectorUtils } from '@/features/pieces/lib/piece-selector-utils';
-import { ChatDrawerSource } from '@/lib/types';
+import { ChatDrawerSource } from '@/app/builder/types';
+import { flowRunUtils } from '@/features/flow-runs';
+import { flowHooks } from '@/features/flows';
+import { pieceSelectorUtils } from '@/features/pieces';
import { AboveTriggerButton } from './above-trigger-button';
diff --git a/packages/web/src/app/builder/flow-canvas/widgets/viewing-old-version-widget.tsx b/packages/web/src/app/builder/flow-canvas/widgets/viewing-old-version-widget.tsx
index 7c832e12749..f7cdc92b663 100644
--- a/packages/web/src/app/builder/flow-canvas/widgets/viewing-old-version-widget.tsx
+++ b/packages/web/src/app/builder/flow-canvas/widgets/viewing-old-version-widget.tsx
@@ -3,7 +3,7 @@ import { InfoCircledIcon } from '@radix-ui/react-icons';
import { t } from 'i18next';
import { Button } from '@/components/ui/button';
-import { flowHooks } from '@/features/flows/lib/flow-hooks';
+import { flowHooks } from '@/features/flows';
import { useAuthorization } from '@/hooks/authorization-hooks';
import { EditFlowOrViewDraftButton } from '../../builder-header/flow-status/view-draft-or-edit-flow-button';
diff --git a/packages/web/src/app/builder/flow-versions/flow-versions-card.tsx b/packages/web/src/app/builder/flow-versions/flow-versions-card.tsx
index 48bf8202d7b..b4cbff32e8a 100644
--- a/packages/web/src/app/builder/flow-versions/flow-versions-card.tsx
+++ b/packages/web/src/app/builder/flow-versions/flow-versions-card.tsx
@@ -10,7 +10,9 @@ import React, { useState } from 'react';
import { useBuilderStateContext } from '@/app/builder/builder-hooks';
import { CardListItem } from '@/components/custom/card-list';
-import { useEmbedding } from '@/components/embed-provider';
+import { FormattedDate } from '@/components/custom/formatted-date';
+import { UserAvatar } from '@/components/custom/user-avatar';
+import { useEmbedding } from '@/components/providers/embed-provider';
import { Button } from '@/components/ui/button';
import {
DropdownMenu,
@@ -18,15 +20,12 @@ import {
DropdownMenuItem,
DropdownMenuTrigger,
} from '@/components/ui/dropdown-menu';
-import { FormattedDate } from '@/components/ui/formatted-date';
import {
Tooltip,
TooltipContent,
TooltipTrigger,
} from '@/components/ui/tooltip';
-import { UserAvatar } from '@/components/ui/user-avatar';
-import { FlowVersionStateDot } from '@/features/flows/components/flow-version-state-dot';
-import { flowHooks } from '@/features/flows/lib/flow-hooks';
+import { FlowVersionStateDot, flowHooks } from '@/features/flows';
import { useAuthorization } from '@/hooks/authorization-hooks';
import { OverwriteDraftDialog } from './overwrite-draft-dialog';
diff --git a/packages/web/src/app/builder/flow-versions/index.tsx b/packages/web/src/app/builder/flow-versions/index.tsx
index 2311b336830..1d376517761 100644
--- a/packages/web/src/app/builder/flow-versions/index.tsx
+++ b/packages/web/src/app/builder/flow-versions/index.tsx
@@ -1,10 +1,10 @@
import { t } from 'i18next';
import { useBuilderStateContext } from '@/app/builder/builder-hooks';
+import { RightSideBarType } from '@/app/builder/types';
import { CardList, CardListItemSkeleton } from '@/components/custom/card-list';
import { ScrollArea } from '@/components/ui/scroll-area';
-import { flowHooks } from '@/features/flows/lib/flow-hooks';
-import { RightSideBarType } from '@/lib/types';
+import { flowHooks } from '@/features/flows';
import { SidebarHeader } from '../sidebar-header';
diff --git a/packages/web/src/app/builder/flow-versions/overwrite-draft-dialog.tsx b/packages/web/src/app/builder/flow-versions/overwrite-draft-dialog.tsx
index e43229a25dd..90a574b2776 100644
--- a/packages/web/src/app/builder/flow-versions/overwrite-draft-dialog.tsx
+++ b/packages/web/src/app/builder/flow-versions/overwrite-draft-dialog.tsx
@@ -2,6 +2,7 @@ import { Permission } from '@activepieces/shared';
import { t } from 'i18next';
import { useState } from 'react';
+import { RightSideBarType } from '@/app/builder/types';
import { PermissionNeededTooltip } from '@/components/custom/permission-needed-tooltip';
import { Button } from '@/components/ui/button';
import {
@@ -14,9 +15,8 @@ import {
DialogTitle,
DialogTrigger,
} from '@/components/ui/dialog';
-import { flowHooks } from '@/features/flows/lib/flow-hooks';
+import { flowHooks } from '@/features/flows';
import { useAuthorization } from '@/hooks/authorization-hooks';
-import { RightSideBarType } from '@/lib/types';
import { useBuilderStateContext } from '../builder-hooks';
diff --git a/packages/web/src/app/builder/index.tsx b/packages/web/src/app/builder/index.tsx
index 5a6982a5ba9..bf8e1f41efc 100644
--- a/packages/web/src/app/builder/index.tsx
+++ b/packages/web/src/app/builder/index.tsx
@@ -12,18 +12,18 @@ import { useBuilderStateContext } from '@/app/builder/builder-hooks';
import { DataSelector } from '@/app/builder/data-selector';
import { CanvasControls } from '@/app/builder/flow-canvas/canvas-controls';
import { StepSettingsProvider } from '@/app/builder/step-settings/step-settings-context';
+import { RightSideBarType } from '@/app/builder/types';
import { ChatDrawer } from '@/app/routes/chat/chat-drawer';
-import { ShowPoweredBy } from '@/components/show-powered-by';
+import { ShowPoweredBy } from '@/components/custom/show-powered-by';
import {
ResizableHandle,
ResizablePanel,
ResizablePanelGroup,
} from '@/components/ui/resizable-panel';
-import { piecesHooks } from '@/features/pieces/lib/pieces-hooks';
+import { piecesHooks } from '@/features/pieces';
import { platformHooks } from '@/hooks/platform-hooks';
-import { RightSideBarType } from '@/lib/types';
-
-import { cn, useElementSize } from '../../lib/utils';
+import { useElementSize } from '@/hooks/use-element-size';
+import { cn } from '@/lib/utils';
import { BuilderHeader } from './builder-header/builder-header';
import { FlowCanvas } from './flow-canvas';
diff --git a/packages/web/src/app/builder/piece-properties/action-error-handling.tsx b/packages/web/src/app/builder/piece-properties/action-error-handling.tsx
index 74a53d05ef3..c50c0edcd77 100644
--- a/packages/web/src/app/builder/piece-properties/action-error-handling.tsx
+++ b/packages/web/src/app/builder/piece-properties/action-error-handling.tsx
@@ -3,13 +3,13 @@ import { t } from 'i18next';
import React from 'react';
import { useFormContext } from 'react-hook-form';
+import { ReadMoreDescription } from '@/components/custom/read-more-description';
import {
FormField,
FormItem,
FormLabel,
FormControl,
} from '@/components/ui/form';
-import { ReadMoreDescription } from '@/components/ui/read-more-description';
import { Switch } from '@/components/ui/switch';
import { cn, GAP_SIZE_FOR_STEP_SETTINGS } from '@/lib/utils';
diff --git a/packages/web/src/app/builder/piece-properties/array-property.tsx b/packages/web/src/app/builder/piece-properties/array-property.tsx
index 9d09e175354..ab5da7a74bb 100644
--- a/packages/web/src/app/builder/piece-properties/array-property.tsx
+++ b/packages/web/src/app/builder/piece-properties/array-property.tsx
@@ -10,9 +10,9 @@ import React, { useState } from 'react';
import { useFormContext } from 'react-hook-form';
import { ArrayInput } from '@/components/custom/array-input';
+import { TextWithIcon } from '@/components/custom/text-with-icon';
import { Button } from '@/components/ui/button';
import { Input } from '@/components/ui/input';
-import { TextWithIcon } from '@/components/ui/text-with-icon';
import { cn, GAP_SIZE_FOR_STEP_SETTINGS } from '@/lib/utils';
import { GenericPropertiesForm } from './generic-properties-form';
diff --git a/packages/web/src/app/builder/piece-properties/auto-form-field-wrapper.tsx b/packages/web/src/app/builder/piece-properties/auto-form-field-wrapper.tsx
index f93aa208bb3..c3fdddabf05 100644
--- a/packages/web/src/app/builder/piece-properties/auto-form-field-wrapper.tsx
+++ b/packages/web/src/app/builder/piece-properties/auto-form-field-wrapper.tsx
@@ -15,16 +15,16 @@ import { ErrorBoundary } from 'react-error-boundary';
import { ControllerRenderProps, useFormContext } from 'react-hook-form';
import { toast } from 'sonner';
+import { ReadMoreDescription } from '@/components/custom/read-more-description';
import { Button } from '@/components/ui/button';
import { FormItem, FormLabel } from '@/components/ui/form';
-import { ReadMoreDescription } from '@/components/ui/read-more-description';
import { Toggle } from '@/components/ui/toggle';
import {
Tooltip,
TooltipContent,
TooltipTrigger,
} from '@/components/ui/tooltip';
-import { formUtils } from '@/features/pieces/lib/form-utils';
+import { formUtils } from '@/features/pieces';
import { cn } from '@/lib/utils';
import { ArrayPiecePropertyInInlineItemMode } from './array-property-in-inline-item-mode';
diff --git a/packages/web/src/app/builder/piece-properties/custom-property.tsx b/packages/web/src/app/builder/piece-properties/custom-property.tsx
index e380c405426..dd0dab8f2a5 100644
--- a/packages/web/src/app/builder/piece-properties/custom-property.tsx
+++ b/packages/web/src/app/builder/piece-properties/custom-property.tsx
@@ -1,8 +1,8 @@
import { CustomProperty as CustomPropertyType } from '@activepieces/pieces-framework';
import { useEffect, useId } from 'react';
-import { useEmbedding } from '@/components/embed-provider';
-import { projectCollectionUtils } from '@/hooks/project-collection';
+import { useEmbedding } from '@/components/providers/embed-provider';
+import { projectCollectionUtils } from '@/features/projects';
const CUSTOM_PROPERTY_CONTAINER_ID = 'custom-property-container';
type CustomPropertyParams = {
diff --git a/packages/web/src/app/builder/piece-properties/dictionary-property.tsx b/packages/web/src/app/builder/piece-properties/dictionary-property.tsx
index 9dae8511c37..5b8af0ac3e5 100644
--- a/packages/web/src/app/builder/piece-properties/dictionary-property.tsx
+++ b/packages/web/src/app/builder/piece-properties/dictionary-property.tsx
@@ -2,9 +2,9 @@ import { t } from 'i18next';
import { Plus, TrashIcon } from 'lucide-react';
import { useRef } from 'react';
+import { TextWithIcon } from '@/components/custom/text-with-icon';
import { Button } from '@/components/ui/button';
import { Input } from '@/components/ui/input';
-import { TextWithIcon } from '@/components/ui/text-with-icon';
import { cn, GAP_SIZE_FOR_STEP_SETTINGS } from '@/lib/utils';
import { TextInputWithMentions } from './text-input-with-mentions';
diff --git a/packages/web/src/app/builder/piece-properties/dynamic-dropdown-piece-property.tsx b/packages/web/src/app/builder/piece-properties/dynamic-dropdown-piece-property.tsx
index c912158a488..1da1091839b 100644
--- a/packages/web/src/app/builder/piece-properties/dynamic-dropdown-piece-property.tsx
+++ b/packages/web/src/app/builder/piece-properties/dynamic-dropdown-piece-property.tsx
@@ -7,7 +7,7 @@ import { FieldValues, UseFormReturn, useWatch } from 'react-hook-form';
import { useBuilderStateContext } from '@/app/builder/builder-hooks';
import { SearchableSelect } from '@/components/custom/searchable-select';
-import { piecesHooks } from '@/features/pieces/lib/pieces-hooks';
+import { piecesHooks } from '@/features/pieces';
import { authenticationSession } from '@/lib/authentication-session';
import { MultiSelectPieceProperty } from '../../../components/custom/multi-select-piece-property';
diff --git a/packages/web/src/app/builder/piece-properties/dynamic-piece-property.tsx b/packages/web/src/app/builder/piece-properties/dynamic-piece-property.tsx
index 7dbb71c16d5..673c6dc3081 100644
--- a/packages/web/src/app/builder/piece-properties/dynamic-piece-property.tsx
+++ b/packages/web/src/app/builder/piece-properties/dynamic-piece-property.tsx
@@ -11,8 +11,7 @@ import { useDeepCompareEffectNoCheck } from 'use-deep-compare-effect';
import { useBuilderStateContext } from '@/app/builder/builder-hooks';
import { SkeletonList } from '@/components/ui/skeleton';
-import { formUtils } from '@/features/pieces/lib/form-utils';
-import { piecesHooks } from '@/features/pieces/lib/pieces-hooks';
+import { piecesHooks, formUtils } from '@/features/pieces';
import { authenticationSession } from '@/lib/authentication-session';
import { DynamicPropertiesErrorBoundary } from './dynamic-piece-properties-error-boundary';
diff --git a/packages/web/src/app/builder/piece-properties/properties-utils.tsx b/packages/web/src/app/builder/piece-properties/properties-utils.tsx
index 3738b03a582..d1c4f7e31e7 100644
--- a/packages/web/src/app/builder/piece-properties/properties-utils.tsx
+++ b/packages/web/src/app/builder/piece-properties/properties-utils.tsx
@@ -12,11 +12,11 @@ import {
} from 'react-hook-form';
import { SecretInput } from '@/app/connections/secret-input';
+import { ColorPicker } from '@/components/custom/color-picker';
import { JsonEditor } from '@/components/custom/json-editor';
import { ApMarkdown } from '@/components/custom/markdown';
import { MultiSelectPieceProperty } from '@/components/custom/multi-select-piece-property';
import { SearchableSelect } from '@/components/custom/searchable-select';
-import { ColorPicker } from '@/components/ui/color-picker';
import { FormControl } from '@/components/ui/form';
import { Input } from '@/components/ui/input';
import { Switch } from '@/components/ui/switch';
diff --git a/packages/web/src/app/builder/piece-properties/text-input-with-mentions/index.tsx b/packages/web/src/app/builder/piece-properties/text-input-with-mentions/index.tsx
index f95f76257ab..7ba7b95b1b6 100644
--- a/packages/web/src/app/builder/piece-properties/text-input-with-mentions/index.tsx
+++ b/packages/web/src/app/builder/piece-properties/text-input-with-mentions/index.tsx
@@ -11,7 +11,7 @@ import { useEditor, EditorContent } from '@tiptap/react';
import StarterKit from '@tiptap/starter-kit';
import { inputClass } from '@/components/ui/input';
-import { stepsHooks } from '@/features/pieces/lib/steps-hooks';
+import { stepsHooks } from '@/features/pieces';
import { cn } from '@/lib/utils';
import { useBuilderStateContext } from '../../builder-hooks';
diff --git a/packages/web/src/app/builder/piece-properties/text-input-with-mentions/text-input-utils.ts b/packages/web/src/app/builder/piece-properties/text-input-with-mentions/text-input-utils.ts
index 4a2cda6fd91..ffcf794e02a 100644
--- a/packages/web/src/app/builder/piece-properties/text-input-with-mentions/text-input-utils.ts
+++ b/packages/web/src/app/builder/piece-properties/text-input-with-mentions/text-input-utils.ts
@@ -7,7 +7,7 @@ import {
import { MentionNodeAttrs } from '@tiptap/extension-mention';
import { JSONContent } from '@tiptap/react';
-import { StepMetadata } from '@/lib/types';
+import { StepMetadata } from '@/features/pieces';
const removeQuotes = (text: string) => {
if (
diff --git a/packages/web/src/app/builder/pieces-selector/ai-tab-content/ai-action.tsx b/packages/web/src/app/builder/pieces-selector/ai-tab-content/ai-action.tsx
index d207729cf34..844f22c9fdf 100644
--- a/packages/web/src/app/builder/pieces-selector/ai-tab-content/ai-action.tsx
+++ b/packages/web/src/app/builder/pieces-selector/ai-tab-content/ai-action.tsx
@@ -1,8 +1,11 @@
import { FlowActionType, FlowTriggerType } from '@activepieces/shared';
import { CardListItem } from '@/components/custom/card-list';
-import { PieceIcon } from '@/features/pieces/components/piece-icon';
-import { PieceSelectorItem, StepMetadataWithSuggestions } from '@/lib/types';
+import {
+ PieceIcon,
+ PieceSelectorItem,
+ StepMetadataWithSuggestions,
+} from '@/features/pieces';
type AIActionItemProps = {
item: PieceSelectorItem;
diff --git a/packages/web/src/app/builder/pieces-selector/ai-tab-content/ai-actions-list.tsx b/packages/web/src/app/builder/pieces-selector/ai-tab-content/ai-actions-list.tsx
index e0de89e64f2..80b401c9ef8 100644
--- a/packages/web/src/app/builder/pieces-selector/ai-tab-content/ai-actions-list.tsx
+++ b/packages/web/src/app/builder/pieces-selector/ai-tab-content/ai-actions-list.tsx
@@ -8,15 +8,15 @@ import React from 'react';
import { useNavigate } from 'react-router-dom';
import { toast } from 'sonner';
-import { useTelemetry } from '@/components/telemetry-provider';
+import { useTelemetry } from '@/components/providers/telemetry-provider';
import { ScrollArea } from '@/components/ui/scroll-area';
-import { flagsHooks } from '@/hooks/flags-hooks';
import {
PieceSelectorOperation,
StepMetadataWithSuggestions,
-} from '@/lib/types';
+ usePieceSearchContext,
+} from '@/features/pieces';
+import { flagsHooks } from '@/hooks/flags-hooks';
-import { usePieceSearchContext } from '../../../../features/pieces/lib/piece-search-context';
import { useBuilderStateContext } from '../../builder-hooks';
import { convertStepMetadataToPieceSelectorItems } from '../piece-actions-or-triggers-list';
diff --git a/packages/web/src/app/builder/pieces-selector/ai-tab-content/index.tsx b/packages/web/src/app/builder/pieces-selector/ai-tab-content/index.tsx
index 9b584878ca9..07ff7db783a 100644
--- a/packages/web/src/app/builder/pieces-selector/ai-tab-content/index.tsx
+++ b/packages/web/src/app/builder/pieces-selector/ai-tab-content/index.tsx
@@ -2,12 +2,12 @@ import { FlowOperationType, isNil } from '@activepieces/shared';
import { CardListItemSkeleton } from '@/components/custom/card-list';
import {
+ piecesHooks,
PieceSelectorTabType,
usePieceSelectorTabs,
-} from '@/features/pieces/lib/piece-selector-tabs-provider';
-import { piecesHooks } from '@/features/pieces/lib/pieces-hooks';
-import { stepUtils } from '@/features/pieces/lib/step-utils';
-import { PieceSelectorOperation } from '@/lib/types';
+ PieceSelectorOperation,
+ stepUtils,
+} from '@/features/pieces';
import { AIPieceActionsList } from './ai-actions-list';
diff --git a/packages/web/src/app/builder/pieces-selector/approvals-tab-content.tsx b/packages/web/src/app/builder/pieces-selector/approvals-tab-content.tsx
index 948c90521c4..52cb9008a62 100644
--- a/packages/web/src/app/builder/pieces-selector/approvals-tab-content.tsx
+++ b/packages/web/src/app/builder/pieces-selector/approvals-tab-content.tsx
@@ -2,12 +2,12 @@ import { FlowActionType, FlowOperationType, isNil } from '@activepieces/shared';
import { CardList, CardListItemSkeleton } from '@/components/custom/card-list';
import {
+ piecesHooks,
PieceSelectorTabType,
usePieceSelectorTabs,
-} from '@/features/pieces/lib/piece-selector-tabs-provider';
-import { piecesHooks } from '@/features/pieces/lib/pieces-hooks';
-import { stepUtils } from '@/features/pieces/lib/step-utils';
-import { PieceSelectorOperation } from '@/lib/types';
+ PieceSelectorOperation,
+ stepUtils,
+} from '@/features/pieces';
import { useBuilderStateContext } from '../builder-hooks';
diff --git a/packages/web/src/app/builder/pieces-selector/custom-piece-selector-items-utils.ts b/packages/web/src/app/builder/pieces-selector/custom-piece-selector-items-utils.ts
index 5b315d37f4b..f362e64f88b 100644
--- a/packages/web/src/app/builder/pieces-selector/custom-piece-selector-items-utils.ts
+++ b/packages/web/src/app/builder/pieces-selector/custom-piece-selector-items-utils.ts
@@ -1,7 +1,10 @@
import { FlowOperationType } from '@activepieces/shared';
-import { pieceSelectorUtils } from '@/features/pieces/lib/piece-selector-utils';
-import { PieceSelectorOperation, PieceSelectorPieceItem } from '@/lib/types';
+import {
+ PieceSelectorOperation,
+ PieceSelectorPieceItem,
+ pieceSelectorUtils,
+} from '@/features/pieces';
import { BuilderState } from '../builder-hooks';
diff --git a/packages/web/src/app/builder/pieces-selector/explore-tab-content.tsx b/packages/web/src/app/builder/pieces-selector/explore-tab-content.tsx
index 4e7df84833b..4b378c76eaa 100644
--- a/packages/web/src/app/builder/pieces-selector/explore-tab-content.tsx
+++ b/packages/web/src/app/builder/pieces-selector/explore-tab-content.tsx
@@ -5,13 +5,13 @@ import {
CardListItemSkeleton,
} from '@/components/custom/card-list';
import { ScrollArea } from '@/components/ui/scroll-area';
-import { PieceIcon } from '@/features/pieces/components/piece-icon';
import {
+ PieceIcon,
+ piecesHooks,
PieceSelectorTabType,
usePieceSelectorTabs,
-} from '@/features/pieces/lib/piece-selector-tabs-provider';
-import { piecesHooks } from '@/features/pieces/lib/pieces-hooks';
-import { PieceSelectorOperation } from '@/lib/types';
+ PieceSelectorOperation,
+} from '@/features/pieces';
import { PieceActionsOrTriggersList } from './piece-actions-or-triggers-list';
diff --git a/packages/web/src/app/builder/pieces-selector/generic-piece-selector-item.tsx b/packages/web/src/app/builder/pieces-selector/generic-piece-selector-item.tsx
index a9ae02225d2..247d8649f73 100644
--- a/packages/web/src/app/builder/pieces-selector/generic-piece-selector-item.tsx
+++ b/packages/web/src/app/builder/pieces-selector/generic-piece-selector-item.tsx
@@ -1,9 +1,12 @@
import { FlowActionType, FlowTriggerType } from '@activepieces/shared';
import { CardListItem } from '@/components/custom/card-list';
-import { PieceIcon } from '@/features/pieces/components/piece-icon';
-import { PIECE_SELECTOR_ELEMENTS_HEIGHTS } from '@/features/pieces/lib/piece-selector-utils';
-import { PieceSelectorItem, StepMetadataWithSuggestions } from '@/lib/types';
+import {
+ PieceIcon,
+ PieceSelectorItem,
+ StepMetadataWithSuggestions,
+ PIECE_SELECTOR_ELEMENTS_HEIGHTS,
+} from '@/features/pieces';
import { cn } from '@/lib/utils';
type GenericActionOrTriggerItemProps = {
item: PieceSelectorItem;
diff --git a/packages/web/src/app/builder/pieces-selector/index.tsx b/packages/web/src/app/builder/pieces-selector/index.tsx
index f51384766aa..ebd9641830f 100644
--- a/packages/web/src/app/builder/pieces-selector/index.tsx
+++ b/packages/web/src/app/builder/pieces-selector/index.tsx
@@ -17,21 +17,18 @@ import {
PopoverTrigger,
} from '@/components/ui/popover';
import { Separator } from '@/components/ui/separator';
-import { PiecesSearchInput } from '@/features/pieces/components/piece-selector-search';
-import { PieceSelectorTabs } from '@/features/pieces/components/piece-selector-tabs';
import {
+ PiecesSearchInput,
+ PieceSelectorTabs,
PieceSelectorTabsProvider,
PieceSelectorTabType,
-} from '@/features/pieces/lib/piece-selector-tabs-provider';
-import { pieceSelectorUtils } from '@/features/pieces/lib/piece-selector-utils';
-import { platformHooks } from '@/hooks/platform-hooks';
-import { useIsMobile } from '@/hooks/use-mobile';
-import { PieceSelectorOperation } from '@/lib/types';
-
-import {
+ PieceSelectorOperation,
+ pieceSelectorUtils,
PieceSearchProvider,
usePieceSearchContext,
-} from '../../../features/pieces/lib/piece-search-context';
+} from '@/features/pieces';
+import { platformHooks } from '@/hooks/platform-hooks';
+import { useIsMobile } from '@/hooks/use-mobile';
import { AITabContent } from './ai-tab-content';
import { ApprovalsTabContent } from './approvals-tab-content';
diff --git a/packages/web/src/app/builder/pieces-selector/no-results-found.tsx b/packages/web/src/app/builder/pieces-selector/no-results-found.tsx
index 5508360f903..346e4f146d9 100644
--- a/packages/web/src/app/builder/pieces-selector/no-results-found.tsx
+++ b/packages/web/src/app/builder/pieces-selector/no-results-found.tsx
@@ -2,7 +2,7 @@ import { ApFlagId, feedbackUrl } from '@activepieces/shared';
import { t } from 'i18next';
import { SearchX } from 'lucide-react';
-import { useEmbedding } from '@/components/embed-provider';
+import { useEmbedding } from '@/components/providers/embed-provider';
import { Button } from '@/components/ui/button';
import { flagsHooks } from '@/hooks/flags-hooks';
diff --git a/packages/web/src/app/builder/pieces-selector/piece-actions-or-triggers-list.tsx b/packages/web/src/app/builder/pieces-selector/piece-actions-or-triggers-list.tsx
index 65eda2c2f89..42ad595ee4b 100644
--- a/packages/web/src/app/builder/pieces-selector/piece-actions-or-triggers-list.tsx
+++ b/packages/web/src/app/builder/pieces-selector/piece-actions-or-triggers-list.tsx
@@ -9,17 +9,17 @@ import { MoveLeft } from 'lucide-react';
import React from 'react';
import { CardList } from '@/components/custom/card-list';
-import { useTelemetry } from '@/components/telemetry-provider';
+import { useTelemetry } from '@/components/providers/telemetry-provider';
import { ScrollArea } from '@/components/ui/scroll-area';
-import { pieceSelectorUtils } from '@/features/pieces/lib/piece-selector-utils';
-import { CORE_ACTIONS_METADATA } from '@/features/pieces/lib/step-utils';
import {
PieceSelectorItem,
PieceSelectorOperation,
StepMetadataWithSuggestions,
-} from '@/lib/types';
+ pieceSelectorUtils,
+ CORE_ACTIONS_METADATA,
+ usePieceSearchContext,
+} from '@/features/pieces';
-import { usePieceSearchContext } from '../../../features/pieces/lib/piece-search-context';
import { useBuilderStateContext } from '../builder-hooks';
import GenericActionOrTriggerItem from './generic-piece-selector-item';
diff --git a/packages/web/src/app/builder/pieces-selector/piece-card-item.tsx b/packages/web/src/app/builder/pieces-selector/piece-card-item.tsx
index f78598c3c61..ec1a677cd9a 100644
--- a/packages/web/src/app/builder/pieces-selector/piece-card-item.tsx
+++ b/packages/web/src/app/builder/pieces-selector/piece-card-item.tsx
@@ -1,14 +1,15 @@
import { useRef } from 'react';
import { CardListItem } from '@/components/custom/card-list';
-import { PieceIcon } from '@/features/pieces/components/piece-icon';
-import { PIECE_SELECTOR_ELEMENTS_HEIGHTS } from '@/features/pieces/lib/piece-selector-utils';
-import { useIsMobile } from '@/hooks/use-mobile';
import {
+ PieceIcon,
PieceSelectorOperation,
StepMetadataWithSuggestions,
-} from '@/lib/types';
-import { cn, wait } from '@/lib/utils';
+ PIECE_SELECTOR_ELEMENTS_HEIGHTS,
+} from '@/features/pieces';
+import { useIsMobile } from '@/hooks/use-mobile';
+import { wait } from '@/lib/dom-utils';
+import { cn } from '@/lib/utils';
import { useBuilderStateContext } from '../builder-hooks';
diff --git a/packages/web/src/app/builder/pieces-selector/pieces-card-list.tsx b/packages/web/src/app/builder/pieces-selector/pieces-card-list.tsx
index 78c7bd37541..f71351900f9 100644
--- a/packages/web/src/app/builder/pieces-selector/pieces-card-list.tsx
+++ b/packages/web/src/app/builder/pieces-selector/pieces-card-list.tsx
@@ -9,20 +9,16 @@ import { CardListItemSkeleton } from '@/components/custom/card-list';
import { Separator } from '@/components/ui/separator';
import { VirtualizedScrollArea } from '@/components/ui/virtualized-scroll-area';
import {
+ piecesHooks,
PieceSelectorTabType,
usePieceSelectorTabs,
-} from '@/features/pieces/lib/piece-selector-tabs-provider';
-import {
- PIECE_SELECTOR_ELEMENTS_HEIGHTS,
- pieceSelectorUtils,
-} from '@/features/pieces/lib/piece-selector-utils';
-import { piecesHooks } from '@/features/pieces/lib/pieces-hooks';
-import { useIsMobile } from '@/hooks/use-mobile';
-import {
PieceSelectorOperation,
StepMetadataWithSuggestions,
CategorizedStepMetadataWithSuggestions,
-} from '@/lib/types';
+ PIECE_SELECTOR_ELEMENTS_HEIGHTS,
+ pieceSelectorUtils,
+} from '@/features/pieces';
+import { useIsMobile } from '@/hooks/use-mobile';
import { cn } from '../../../lib/utils';
import { useBuilderStateContext } from '../builder-hooks';
diff --git a/packages/web/src/app/builder/run-details/flow-step-input-output.tsx b/packages/web/src/app/builder/run-details/flow-step-input-output.tsx
index 37af918a1c3..a6f0a6b55a5 100644
--- a/packages/web/src/app/builder/run-details/flow-step-input-output.tsx
+++ b/packages/web/src/app/builder/run-details/flow-step-input-output.tsx
@@ -13,14 +13,13 @@ import { Info, Timer } from 'lucide-react';
import { useMemo } from 'react';
import { StepOutputSkeleton } from '@/app/components/step-output-skeleton';
-import { JsonViewer } from '@/components/json-viewer';
+import { JsonViewer } from '@/components/custom/json-viewer';
import { ScrollArea } from '@/components/ui/scroll-area';
import { Tabs, TabsContent, TabsList, TabsTrigger } from '@/components/ui/tabs';
-import { AgentTimeline } from '@/features/agents/agent-timeline';
-import { StepStatusIcon } from '@/features/flow-runs/components/step-status-icon';
-import { flowRunUtils } from '@/features/flow-runs/lib/flow-run-utils';
+import { AgentTimeline } from '@/features/agents';
+import { StepStatusIcon, flowRunUtils } from '@/features/flow-runs';
import { flagsHooks } from '@/hooks/flags-hooks';
-import { formatUtils } from '@/lib/utils';
+import { formatUtils } from '@/lib/format-utils';
import { useBuilderStateContext } from '../builder-hooks';
import { isRunAgent } from '../test-step/agent-test-step';
diff --git a/packages/web/src/app/builder/run-details/loop-iteration-input.tsx b/packages/web/src/app/builder/run-details/loop-iteration-input.tsx
index 8086b9473c3..8ec67974f7c 100644
--- a/packages/web/src/app/builder/run-details/loop-iteration-input.tsx
+++ b/packages/web/src/app/builder/run-details/loop-iteration-input.tsx
@@ -10,8 +10,8 @@ import {
TooltipContent,
TooltipTrigger,
} from '@/components/ui/tooltip';
+import { flowRunUtils } from '@/features/flow-runs';
-import { flowRunUtils } from '../../../features/flow-runs/lib/flow-run-utils';
import { useBuilderStateContext } from '../builder-hooks';
const LoopIterationInput = ({ stepName }: { stepName: string }) => {
diff --git a/packages/web/src/app/builder/run-list/flow-run-card.tsx b/packages/web/src/app/builder/run-list/flow-run-card.tsx
index fddd50a9534..e84e0846925 100644
--- a/packages/web/src/app/builder/run-list/flow-run-card.tsx
+++ b/packages/web/src/app/builder/run-list/flow-run-card.tsx
@@ -15,7 +15,9 @@ import React, { useState } from 'react';
import { useNavigate } from 'react-router-dom';
import { CardListItem } from '@/components/custom/card-list';
+import { FormattedDate } from '@/components/custom/formatted-date';
import { PermissionNeededTooltip } from '@/components/custom/permission-needed-tooltip';
+import { LoadingSpinner } from '@/components/custom/spinner';
import { Button } from '@/components/ui/button';
import {
DropdownMenu,
@@ -23,19 +25,17 @@ import {
DropdownMenuTrigger,
DropdownMenuContent,
} from '@/components/ui/dropdown-menu';
-import { FormattedDate } from '@/components/ui/formatted-date';
-import { LoadingSpinner } from '@/components/ui/spinner';
import {
Tooltip,
TooltipContent,
TooltipTrigger,
} from '@/components/ui/tooltip';
-import { flowRunUtils } from '@/features/flow-runs/lib/flow-run-utils';
-import { flowRunsApi } from '@/features/flow-runs/lib/flow-runs-api';
-import { flowsApi } from '@/features/flows/lib/flows-api';
+import { flowRunsApi, flowRunUtils } from '@/features/flow-runs';
+import { flowsApi } from '@/features/flows';
import { useAuthorization } from '@/hooks/authorization-hooks';
import { authenticationSession } from '@/lib/authentication-session';
-import { cn, formatUtils } from '@/lib/utils';
+import { formatUtils } from '@/lib/format-utils';
+import { cn } from '@/lib/utils';
type FlowRunCardProps = {
run: FlowRun;
diff --git a/packages/web/src/app/builder/run-list/index.tsx b/packages/web/src/app/builder/run-list/index.tsx
index 61bd83ed1e9..6165b2aa10d 100644
--- a/packages/web/src/app/builder/run-list/index.tsx
+++ b/packages/web/src/app/builder/run-list/index.tsx
@@ -8,15 +8,15 @@ import { t } from 'i18next';
import React, { useMemo } from 'react';
import { useBuilderStateContext } from '@/app/builder/builder-hooks';
+import { RightSideBarType } from '@/app/builder/types';
import {
CardListEmpty,
CardListItemSkeleton,
} from '@/components/custom/card-list';
import { Button } from '@/components/ui/button';
import { VirtualizedScrollArea } from '@/components/ui/virtualized-scroll-area';
-import { flowRunsApi } from '@/features/flow-runs/lib/flow-runs-api';
+import { flowRunsApi } from '@/features/flow-runs';
import { authenticationSession } from '@/lib/authentication-session';
-import { RightSideBarType } from '@/lib/types';
import { SidebarHeader } from '../sidebar-header';
diff --git a/packages/web/src/app/builder/state/builder-state-provider.tsx b/packages/web/src/app/builder/state/builder-state-provider.tsx
index 8c7fc553037..16179a58037 100644
--- a/packages/web/src/app/builder/state/builder-state-provider.tsx
+++ b/packages/web/src/app/builder/state/builder-state-provider.tsx
@@ -8,9 +8,9 @@ import {
BuilderStore,
createBuilderStore,
} from '@/app/builder/builder-hooks';
-import { useSocket } from '@/components/socket-provider';
+import { useSocket } from '@/components/providers/socket-provider';
+import { projectHooks } from '@/features/projects';
import { useAuthorization } from '@/hooks/authorization-hooks';
-import { projectHooks } from '@/hooks/project-collection';
type BuilderStateProviderProps = Omit<
React.PropsWithChildren,
diff --git a/packages/web/src/app/builder/state/canvas-state.ts b/packages/web/src/app/builder/state/canvas-state.ts
index 44a5f363261..5bc188b223e 100644
--- a/packages/web/src/app/builder/state/canvas-state.ts
+++ b/packages/web/src/app/builder/state/canvas-state.ts
@@ -1,8 +1,8 @@
import { FlowTriggerType, isNil } from '@activepieces/shared';
import { StoreApi } from 'zustand';
-import { flowRunUtils } from '@/features/flow-runs/lib/flow-run-utils';
-import { RightSideBarType } from '@/lib/types';
+import { RightSideBarType } from '@/app/builder/types';
+import { flowRunUtils } from '@/features/flow-runs';
import { BuilderState } from '../builder-hooks';
import { flowCanvasUtils } from '../flow-canvas/utils/flow-canvas-utils';
diff --git a/packages/web/src/app/builder/state/chat-state.ts b/packages/web/src/app/builder/state/chat-state.ts
index a49f751c945..ba7132e1d6b 100644
--- a/packages/web/src/app/builder/state/chat-state.ts
+++ b/packages/web/src/app/builder/state/chat-state.ts
@@ -1,8 +1,8 @@
import { apId } from '@activepieces/shared';
import { StoreApi } from 'zustand';
-import { Messages } from '@/features/chat/chat-message-list';
-import { ChatDrawerSource } from '@/lib/types';
+import { ChatDrawerSource } from '@/app/builder/types';
+import { Messages } from '@/features/chat';
import { BuilderState } from '../builder-hooks';
diff --git a/packages/web/src/app/builder/state/flow-state.ts b/packages/web/src/app/builder/state/flow-state.ts
index d0b35a1dcfb..d5e99d74efa 100644
--- a/packages/web/src/app/builder/state/flow-state.ts
+++ b/packages/web/src/app/builder/state/flow-state.ts
@@ -16,15 +16,14 @@ import {
import { QueryClient } from '@tanstack/react-query';
import { StoreApi } from 'zustand';
-import { flowsApi } from '@/features/flows/lib/flows-api';
-import { sampleDataHooks } from '@/features/flows/lib/sample-data-hooks';
-import { pieceSelectorUtils } from '@/features/pieces/lib/piece-selector-utils';
-import { PromiseQueue } from '@/lib/promise-queue';
+import { RightSideBarType } from '@/app/builder/types';
+import { flowsApi, sampleDataHooks } from '@/features/flows';
import {
PieceSelectorItem,
PieceSelectorOperation,
- RightSideBarType,
-} from '@/lib/types';
+ pieceSelectorUtils,
+} from '@/features/pieces';
+import { PromiseQueue } from '@/lib/promise-queue';
import { BuilderState } from '../builder-hooks';
import { flowCanvasUtils } from '../flow-canvas/utils/flow-canvas-utils';
diff --git a/packages/web/src/app/builder/state/piece-selector-state.ts b/packages/web/src/app/builder/state/piece-selector-state.ts
index 34600c8ba57..d8874503c67 100644
--- a/packages/web/src/app/builder/state/piece-selector-state.ts
+++ b/packages/web/src/app/builder/state/piece-selector-state.ts
@@ -1,7 +1,8 @@
import { FlowTriggerType } from '@activepieces/shared';
import { StoreApi } from 'zustand';
-import { RightSideBarType, StepMetadataWithSuggestions } from '@/lib/types';
+import { RightSideBarType } from '@/app/builder/types';
+import { StepMetadataWithSuggestions } from '@/features/pieces';
import { BuilderState } from '../builder-hooks';
diff --git a/packages/web/src/app/builder/state/run-state.ts b/packages/web/src/app/builder/state/run-state.ts
index b7a6d92eb9b..febb96f55d8 100644
--- a/packages/web/src/app/builder/state/run-state.ts
+++ b/packages/web/src/app/builder/state/run-state.ts
@@ -16,7 +16,7 @@ import { Socket } from 'socket.io-client';
import { StoreApi } from 'zustand';
import { internalErrorToast } from '@/components/ui/sonner';
-import { flowRunUtils } from '@/features/flow-runs/lib/flow-run-utils';
+import { flowRunUtils } from '@/features/flow-runs';
import { BuilderState } from '../builder-hooks';
import { defaultAgentOutput, isRunAgent } from '../test-step/agent-test-step';
diff --git a/packages/web/src/app/builder/step-settings/agent-settings/agent-tools.tsx b/packages/web/src/app/builder/step-settings/agent-settings/agent-tools.tsx
index 586133bd254..41f2bf89b5a 100644
--- a/packages/web/src/app/builder/step-settings/agent-settings/agent-tools.tsx
+++ b/packages/web/src/app/builder/step-settings/agent-settings/agent-tools.tsx
@@ -6,12 +6,14 @@ import { Plus } from 'lucide-react';
import { ControllerRenderProps } from 'react-hook-form';
import { Button } from '@/components/ui/button';
-import { AddToolDropdown } from '@/features/agents/agent-tools/add-agent-tool-dropwdown';
-import { AgentFlowToolComponent } from '@/features/agents/agent-tools/componenets/flow-tool';
-import { AgentMcpToolComponent } from '@/features/agents/agent-tools/componenets/mcp-tool';
-import { AgentPieceToolComponent } from '@/features/agents/agent-tools/componenets/piece-tool';
-import { AgentFlowToolDialog } from '@/features/agents/agent-tools/flow-tool-dialog';
-import { AgentMcpDialog } from '@/features/agents/agent-tools/mcp-tool-dialog';
+import {
+ AddToolDropdown,
+ AgentFlowToolComponent,
+ AgentMcpToolComponent,
+ AgentPieceToolComponent,
+ AgentFlowToolDialog,
+ AgentMcpDialog,
+} from '@/features/agents';
import { AgentPieceDialog } from './piece-tool-dialog';
diff --git a/packages/web/src/app/builder/step-settings/agent-settings/index.tsx b/packages/web/src/app/builder/step-settings/agent-settings/index.tsx
index 3f40d481e1d..321dda24590 100644
--- a/packages/web/src/app/builder/step-settings/agent-settings/index.tsx
+++ b/packages/web/src/app/builder/step-settings/agent-settings/index.tsx
@@ -10,8 +10,7 @@ import { useFormContext } from 'react-hook-form';
import { AgentTools } from '@/app/builder/step-settings/agent-settings/agent-tools';
import { FormField } from '@/components/ui/form';
import { Skeleton } from '@/components/ui/skeleton';
-import { AIModelSelector } from '@/features/agents/ai-model';
-import { AgentStructuredOutput } from '@/features/agents/structured-output';
+import { AIModelSelector, AgentStructuredOutput } from '@/features/agents';
import {
selectGenericFormComponentForProperty,
diff --git a/packages/web/src/app/builder/step-settings/agent-settings/piece-tool-dialog.tsx b/packages/web/src/app/builder/step-settings/agent-settings/piece-tool-dialog.tsx
index b4eab9e8c41..3be689c9a65 100644
--- a/packages/web/src/app/builder/step-settings/agent-settings/piece-tool-dialog.tsx
+++ b/packages/web/src/app/builder/step-settings/agent-settings/piece-tool-dialog.tsx
@@ -19,11 +19,15 @@ import {
TooltipContent,
TooltipTrigger,
} from '@/components/ui/tooltip';
-import { PieceActionsList } from '@/features/agents/agent-tools/piece-tool-dialog/dialog-pages/piece-actions-list';
-import { PiecesList } from '@/features/agents/agent-tools/piece-tool-dialog/dialog-pages/pieces-list';
-import { usePieceToolsDialogStore } from '@/features/agents/agent-tools/stores/pieces-tools';
-import { stepsHooks } from '@/features/pieces/lib/steps-hooks';
-import { PieceStepMetadataWithSuggestions } from '@/lib/types';
+import {
+ PieceActionsList,
+ PiecesList,
+ usePieceToolsDialogStore,
+} from '@/features/agents';
+import {
+ stepsHooks,
+ PieceStepMetadataWithSuggestions,
+} from '@/features/pieces';
import { PredefinedInputsForm } from './predefined-inputs-form';
diff --git a/packages/web/src/app/builder/step-settings/agent-settings/predefined-inputs-form.tsx b/packages/web/src/app/builder/step-settings/agent-settings/predefined-inputs-form.tsx
index baba1d817a8..572b37af05f 100644
--- a/packages/web/src/app/builder/step-settings/agent-settings/predefined-inputs-form.tsx
+++ b/packages/web/src/app/builder/step-settings/agent-settings/predefined-inputs-form.tsx
@@ -20,9 +20,11 @@ import {
SelectTrigger,
SelectValue,
} from '@/components/ui/select';
-import { ConnectionDropdown } from '@/features/agents/agent-tools/piece-tool-dialog/connection-select';
-import { usePieceToolsDialogStore } from '@/features/agents/agent-tools/stores/pieces-tools';
-import { piecesHooks } from '@/features/pieces/lib/pieces-hooks';
+import {
+ ConnectionDropdown,
+ usePieceToolsDialogStore,
+} from '@/features/agents';
+import { piecesHooks } from '@/features/pieces';
import { selectGenericFormComponentForProperty } from '../../piece-properties/properties-utils';
diff --git a/packages/web/src/app/builder/step-settings/code-settings/code-editor.tsx b/packages/web/src/app/builder/step-settings/code-settings/code-editor.tsx
index a1ca9c537c0..6179a17d03d 100644
--- a/packages/web/src/app/builder/step-settings/code-settings/code-editor.tsx
+++ b/packages/web/src/app/builder/step-settings/code-settings/code-editor.tsx
@@ -7,7 +7,7 @@ import { t } from 'i18next';
import { Code, Package } from 'lucide-react';
import { useRef, useState } from 'react';
-import { useTheme } from '@/components/theme-provider';
+import { useTheme } from '@/components/providers/theme-provider';
import { Button } from '@/components/ui/button';
import { internalErrorToast } from '@/components/ui/sonner';
import { flagsHooks } from '@/hooks/flags-hooks';
diff --git a/packages/web/src/app/builder/step-settings/editable-step-name.tsx b/packages/web/src/app/builder/step-settings/editable-step-name.tsx
index 39ebf4f03c6..c78053bb952 100644
--- a/packages/web/src/app/builder/step-settings/editable-step-name.tsx
+++ b/packages/web/src/app/builder/step-settings/editable-step-name.tsx
@@ -3,7 +3,7 @@ import { t } from 'i18next'; // Import t directly from i18next
import { Pencil } from 'lucide-react';
import React from 'react';
-import EditableText from '@/components/ui/editable-text';
+import EditableText from '@/components/custom/editable-text';
interface EditableStepNameProps {
selectedBranchIndex: number | null;
diff --git a/packages/web/src/app/builder/step-settings/index.tsx b/packages/web/src/app/builder/step-settings/index.tsx
index 9ce92084ca5..06f98c95dbb 100644
--- a/packages/web/src/app/builder/step-settings/index.tsx
+++ b/packages/web/src/app/builder/step-settings/index.tsx
@@ -20,12 +20,10 @@ import {
} from '@/components/ui/resizable-panel';
import { ScrollArea } from '@/components/ui/scroll-area';
import { Separator } from '@/components/ui/separator';
-import { pieceSelectorUtils } from '@/features/pieces/lib/piece-selector-utils';
-import { stepsHooks } from '@/features/pieces/lib/steps-hooks';
-import { projectCollectionUtils } from '@/hooks/project-collection';
+import { stepsHooks, pieceSelectorUtils, formUtils } from '@/features/pieces';
+import { projectCollectionUtils } from '@/features/projects';
import { cn, GAP_SIZE_FOR_STEP_SETTINGS } from '@/lib/utils';
-import { formUtils } from '../../../features/pieces/lib/form-utils';
import { ActionErrorHandlingForm } from '../piece-properties/action-error-handling';
import { DynamicPropertiesProvider } from '../piece-properties/dynamic-properties-context';
import { FlowStepInputOutput } from '../run-details/flow-step-input-output';
diff --git a/packages/web/src/app/builder/step-settings/piece-settings/connection-select.tsx b/packages/web/src/app/builder/step-settings/piece-settings/connection-select.tsx
index 4e7c8090af8..5036d6045c8 100644
--- a/packages/web/src/app/builder/step-settings/piece-settings/connection-select.tsx
+++ b/packages/web/src/app/builder/step-settings/piece-settings/connection-select.tsx
@@ -30,8 +30,8 @@ import {
SelectTrigger,
SelectValue,
} from '@/components/ui/select';
-import { appConnectionsQueries } from '@/features/connections/lib/app-connections-hooks';
-import { piecesHooks } from '@/features/pieces/lib/pieces-hooks';
+import { appConnectionsQueries } from '@/features/connections';
+import { piecesHooks } from '@/features/pieces';
import {
useAuthorization,
useIsPlatformAdmin,
diff --git a/packages/web/src/app/builder/step-settings/router-settings/branches-list.tsx b/packages/web/src/app/builder/step-settings/router-settings/branches-list.tsx
index e619ba8cf40..afa8bbb33a1 100644
--- a/packages/web/src/app/builder/step-settings/router-settings/branches-list.tsx
+++ b/packages/web/src/app/builder/step-settings/router-settings/branches-list.tsx
@@ -10,6 +10,8 @@ import { Trash, CopyPlus, Pencil } from 'lucide-react';
import React, { useState } from 'react';
import { useFormContext } from 'react-hook-form';
+import EditableText from '@/components/custom/editable-text';
+import { Button } from '@/components/ui/button';
import {
Sortable,
SortableDragHandle,
@@ -17,8 +19,6 @@ import {
} from '@/components/ui/sortable';
import { InvalidStepIcon } from '../../../../components/custom/alert-icon';
-import { Button } from '../../../../components/ui/button';
-import EditableText from '../../../../components/ui/editable-text';
import { Separator } from '../../../../components/ui/separator';
import {
Tooltip,
diff --git a/packages/web/src/app/builder/step-settings/router-settings/branches-toolbar.tsx b/packages/web/src/app/builder/step-settings/router-settings/branches-toolbar.tsx
index 2aadb525ab2..00faf536729 100644
--- a/packages/web/src/app/builder/step-settings/router-settings/branches-toolbar.tsx
+++ b/packages/web/src/app/builder/step-settings/router-settings/branches-toolbar.tsx
@@ -2,7 +2,7 @@ import { t } from 'i18next';
import { Plus } from 'lucide-react';
import React from 'react';
-import { Button } from '../../../../components/ui/button';
+import { Button } from '@/components/ui/button';
interface BranchesToolbarProps {
addButtonClicked: () => void;
diff --git a/packages/web/src/app/builder/step-settings/step-info.tsx b/packages/web/src/app/builder/step-settings/step-info.tsx
index 6d55dcc9c4a..7ec56c5cc82 100644
--- a/packages/web/src/app/builder/step-settings/step-info.tsx
+++ b/packages/web/src/app/builder/step-settings/step-info.tsx
@@ -18,12 +18,12 @@ import {
TooltipContent,
TooltipTrigger,
} from '@/components/ui/tooltip';
-import { PieceIcon } from '@/features/pieces/components/piece-icon';
-import { stepsHooks } from '@/features/pieces/lib/steps-hooks';
import {
+ PieceIcon,
+ stepsHooks,
PieceStepMetadata,
StepMetadataWithActionOrTriggerOrAgentDisplayName,
-} from '@/lib/types';
+} from '@/features/pieces';
import { useBuilderStateContext } from '../builder-hooks';
diff --git a/packages/web/src/app/builder/step-settings/step-settings-context.tsx b/packages/web/src/app/builder/step-settings/step-settings-context.tsx
index 41c48f99210..e163d1b6516 100644
--- a/packages/web/src/app/builder/step-settings/step-settings-context.tsx
+++ b/packages/web/src/app/builder/step-settings/step-settings-context.tsx
@@ -20,7 +20,7 @@ import {
} from 'react';
import { UseFormReturn } from 'react-hook-form';
-import { formUtils } from '../../../features/pieces/lib/form-utils';
+import { formUtils } from '@/features/pieces';
const numberReplacement = 'anyOf[0]items';
const stringReplacement = 'properties.';
const createUpdatedSchemaKey = (propertyKey: string) => {
diff --git a/packages/web/src/app/builder/test-step/agent-test-step/index.tsx b/packages/web/src/app/builder/test-step/agent-test-step/index.tsx
index 873ac216d88..c6d1c08b5ff 100644
--- a/packages/web/src/app/builder/test-step/agent-test-step/index.tsx
+++ b/packages/web/src/app/builder/test-step/agent-test-step/index.tsx
@@ -8,9 +8,9 @@ import {
} from '@activepieces/shared';
import { t } from 'i18next';
-import { JsonViewer } from '@/components/json-viewer';
+import { JsonViewer } from '@/components/custom/json-viewer';
import { Tabs, TabsContent, TabsList, TabsTrigger } from '@/components/ui/tabs';
-import { AgentTimeline } from '@/features/agents/agent-timeline';
+import { AgentTimeline } from '@/features/agents';
export const isRunAgent = (step?: Step | null) => {
return (
diff --git a/packages/web/src/app/builder/test-step/test-action-section.tsx b/packages/web/src/app/builder/test-step/test-action-section.tsx
index 5bacfa9c713..7b3f7459b31 100644
--- a/packages/web/src/app/builder/test-step/test-action-section.tsx
+++ b/packages/web/src/app/builder/test-step/test-action-section.tsx
@@ -8,8 +8,8 @@ import {
import { t } from 'i18next';
import React, { useContext, useState } from 'react';
+import { Dot } from '@/components/custom/dot';
import { Button } from '@/components/ui/button';
-import { Dot } from '@/components/ui/dot';
import { useBuilderStateContext } from '../builder-hooks';
import { DynamicPropertiesContext } from '../piece-properties/dynamic-properties-context';
diff --git a/packages/web/src/app/builder/test-step/test-sample-data-viewer.tsx b/packages/web/src/app/builder/test-step/test-sample-data-viewer.tsx
index 3c294e30766..7b71fe2ceb9 100644
--- a/packages/web/src/app/builder/test-step/test-sample-data-viewer.tsx
+++ b/packages/web/src/app/builder/test-step/test-sample-data-viewer.tsx
@@ -9,12 +9,12 @@ import { t } from 'i18next';
import React, { useContext } from 'react';
import { StepOutputSkeleton } from '@/app/components/step-output-skeleton';
-import { JsonViewer } from '@/components/json-viewer';
+import { JsonViewer } from '@/components/custom/json-viewer';
+import { LoadingSpinner } from '@/components/custom/spinner';
import { Button } from '@/components/ui/button';
-import { LoadingSpinner } from '@/components/ui/spinner';
import { Tabs, TabsContent, TabsList, TabsTrigger } from '@/components/ui/tabs';
-import { StepStatusIcon } from '@/features/flow-runs/components/step-status-icon';
-import { formatUtils } from '@/lib/utils';
+import { StepStatusIcon } from '@/features/flow-runs';
+import { formatUtils } from '@/lib/format-utils';
import { DynamicPropertiesContext } from '../piece-properties/dynamic-properties-context';
diff --git a/packages/web/src/app/builder/test-step/test-trigger-section/first-time-testing-section.tsx b/packages/web/src/app/builder/test-step/test-trigger-section/first-time-testing-section.tsx
index bbea068535c..c24d43f1802 100644
--- a/packages/web/src/app/builder/test-step/test-trigger-section/first-time-testing-section.tsx
+++ b/packages/web/src/app/builder/test-step/test-trigger-section/first-time-testing-section.tsx
@@ -2,8 +2,8 @@ import { isNil } from '@activepieces/shared';
import { t } from 'i18next';
import { useContext } from 'react';
+import { Dot } from '@/components/custom/dot';
import { Button } from '@/components/ui/button';
-import { Dot } from '@/components/ui/dot';
import { DynamicPropertiesContext } from '../../piece-properties/dynamic-properties-context';
import { TestButtonTooltip } from '../test-step-tooltip';
diff --git a/packages/web/src/app/builder/test-step/test-trigger-section/index.tsx b/packages/web/src/app/builder/test-step/test-trigger-section/index.tsx
index 3c42830335f..e6bc9918571 100644
--- a/packages/web/src/app/builder/test-step/test-trigger-section/index.tsx
+++ b/packages/web/src/app/builder/test-step/test-trigger-section/index.tsx
@@ -4,9 +4,9 @@ import { t } from 'i18next';
import React, { useRef, useState } from 'react';
import { useFormContext } from 'react-hook-form';
-import { triggerEventHooks } from '@/features/flows/lib/trigger-event-hooks';
-import { piecesHooks } from '@/features/pieces/lib/pieces-hooks';
-import { ChatDrawerSource } from '@/lib/types';
+import { ChatDrawerSource } from '@/app/builder/types';
+import { triggerEventHooks } from '@/features/flows';
+import { piecesHooks } from '@/features/pieces';
import { useBuilderStateContext } from '../../builder-hooks';
import { McpToolTestingDialog } from '../custom-test-step/mcp-tool-testing-dialog';
diff --git a/packages/web/src/app/builder/test-step/test-trigger-section/simulation-section.tsx b/packages/web/src/app/builder/test-step/test-trigger-section/simulation-section.tsx
index 26c418326bc..8d8e3e0df59 100644
--- a/packages/web/src/app/builder/test-step/test-trigger-section/simulation-section.tsx
+++ b/packages/web/src/app/builder/test-step/test-trigger-section/simulation-section.tsx
@@ -2,9 +2,9 @@ import { t } from 'i18next';
import { AlertCircle } from 'lucide-react';
import React from 'react';
+import { LoadingSpinner } from '@/components/custom/spinner';
import { Alert, AlertDescription, AlertTitle } from '@/components/ui/alert';
import { Button } from '@/components/ui/button';
-import { LoadingSpinner } from '@/components/ui/spinner';
type SimulationSectionProps = {
note: React.ReactNode;
diff --git a/packages/web/src/app/builder/test-step/test-trigger-section/trigger-event-utils.ts b/packages/web/src/app/builder/test-step/test-trigger-section/trigger-event-utils.ts
index 57063d819b7..d45b9c891d4 100644
--- a/packages/web/src/app/builder/test-step/test-trigger-section/trigger-event-utils.ts
+++ b/packages/web/src/app/builder/test-step/test-trigger-section/trigger-event-utils.ts
@@ -1,7 +1,7 @@
import { TriggerBase, TriggerStrategy } from '@activepieces/pieces-framework';
import { TriggerTestStrategy } from '@activepieces/shared';
-import { pieceSelectorUtils } from '@/features/pieces/lib/piece-selector-utils';
+import { pieceSelectorUtils } from '@/features/pieces';
export type TestType =
| 'mcp-tool'
diff --git a/packages/web/src/app/builder/test-step/utils/test-step-hooks.ts b/packages/web/src/app/builder/test-step/utils/test-step-hooks.ts
index 418bb4add7c..f9889a54233 100644
--- a/packages/web/src/app/builder/test-step/utils/test-step-hooks.ts
+++ b/packages/web/src/app/builder/test-step/utils/test-step-hooks.ts
@@ -14,11 +14,11 @@ import { t } from 'i18next';
import { useFormContext } from 'react-hook-form';
import { internalErrorToast } from '@/components/ui/sonner';
-import { flowRunsApi } from '@/features/flow-runs/lib/flow-runs-api';
-import { triggerEventsApi } from '@/features/flows/lib/trigger-events-api';
+import { flowRunsApi } from '@/features/flow-runs';
+import { triggerEventsApi } from '@/features/flows';
import { api } from '@/lib/api';
import { authenticationSession } from '@/lib/authentication-session';
-import { wait } from '@/lib/utils';
+import { wait } from '@/lib/dom-utils';
import { useBuilderStateContext } from '../../builder-hooks';
diff --git a/packages/web/src/app/builder/types/index.ts b/packages/web/src/app/builder/types/index.ts
new file mode 100644
index 00000000000..ec9c0f9ab44
--- /dev/null
+++ b/packages/web/src/app/builder/types/index.ts
@@ -0,0 +1,11 @@
+export enum RightSideBarType {
+ NONE = 'none',
+ PIECE_SETTINGS = 'piece-settings',
+ VERSIONS = 'versions',
+ RUNS = 'runs',
+}
+
+export enum ChatDrawerSource {
+ TEST_FLOW = 'test-flow',
+ TEST_STEP = 'test-step',
+}
diff --git a/packages/web/src/app/components/account-settings/index.tsx b/packages/web/src/app/components/account-settings/index.tsx
index 5edcbba2621..fa0f27d28cc 100644
--- a/packages/web/src/app/components/account-settings/index.tsx
+++ b/packages/web/src/app/components/account-settings/index.tsx
@@ -10,6 +10,8 @@ import { Camera, Mail } from 'lucide-react';
import { useRef } from 'react';
import { toast } from 'sonner';
+import { userApi } from '@/api/user-api';
+import { UserAvatar } from '@/components/custom/user-avatar';
import { UserBadges } from '@/components/custom/user-badges';
import {
Dialog,
@@ -19,9 +21,7 @@ import {
} from '@/components/ui/dialog';
import { ScrollArea } from '@/components/ui/scroll-area';
import { Separator } from '@/components/ui/separator';
-import { UserAvatar } from '@/components/ui/user-avatar';
import { userHooks } from '@/hooks/user-hooks';
-import { userApi } from '@/lib/user-api';
import { DeleteAccount } from './delete-account';
import LanguageToggle from './language-toggle';
diff --git a/packages/web/src/app/components/account-settings/language-toggle.tsx b/packages/web/src/app/components/account-settings/language-toggle.tsx
index 8b5b5872a5d..c0fb714736b 100644
--- a/packages/web/src/app/components/account-settings/language-toggle.tsx
+++ b/packages/web/src/app/components/account-settings/language-toggle.tsx
@@ -6,6 +6,7 @@ import { useState } from 'react';
import { useTranslation } from 'react-i18next';
import { Link } from 'react-router-dom';
+import { LoadingSpinner } from '@/components/custom/spinner';
import { Button } from '@/components/ui/button';
import {
Command,
@@ -22,9 +23,9 @@ import {
PopoverTrigger,
} from '@/components/ui/popover';
import { ScrollArea } from '@/components/ui/scroll-area';
-import { LoadingSpinner } from '@/components/ui/spinner';
import { flagsHooks } from '@/hooks/flags-hooks';
-import { cn, localesMap } from '@/lib/utils';
+import { localesMap } from '@/lib/locale-utils';
+import { cn } from '@/lib/utils';
export const LanguageToggle = () => {
const { i18n } = useTranslation();
diff --git a/packages/web/src/app/components/account-settings/theme-toggle.tsx b/packages/web/src/app/components/account-settings/theme-toggle.tsx
index 39fde46e7c4..ec4d95c6fb9 100644
--- a/packages/web/src/app/components/account-settings/theme-toggle.tsx
+++ b/packages/web/src/app/components/account-settings/theme-toggle.tsx
@@ -1,7 +1,7 @@
import { t } from 'i18next';
import { Monitor, Moon, Palette, Sun } from 'lucide-react';
-import { useTheme } from '@/components/theme-provider';
+import { useTheme } from '@/components/providers/theme-provider';
import { Label } from '@/components/ui/label';
import {
Select,
diff --git a/packages/web/src/app/components/allow-logged-in-user-only-guard.tsx b/packages/web/src/app/components/allow-logged-in-user-only-guard.tsx
index 7abe5136a5d..1d1f79445ad 100644
--- a/packages/web/src/app/components/allow-logged-in-user-only-guard.tsx
+++ b/packages/web/src/app/components/allow-logged-in-user-only-guard.tsx
@@ -1,10 +1,10 @@
import { Navigate, useLocation } from 'react-router-dom';
-import { SocketProvider } from '@/components/socket-provider';
-import { useTelemetry } from '@/components/telemetry-provider';
+import { SocketProvider } from '@/components/providers/socket-provider';
+import { useTelemetry } from '@/components/providers/telemetry-provider';
+import { projectCollectionUtils } from '@/features/projects';
import { flagsHooks } from '@/hooks/flags-hooks';
import { platformHooks } from '@/hooks/platform-hooks';
-import { projectCollectionUtils } from '@/hooks/project-collection';
import { authenticationSession } from '../../lib/authentication-session';
diff --git a/packages/web/src/app/components/badge-celebrate.tsx b/packages/web/src/app/components/badge-celebrate.tsx
index eb35f1bd304..5156b2b5cbf 100644
--- a/packages/web/src/app/components/badge-celebrate.tsx
+++ b/packages/web/src/app/components/badge-celebrate.tsx
@@ -9,7 +9,7 @@ import { Trophy } from 'lucide-react';
import { useEffect, useRef, useState } from 'react';
import { toast } from 'sonner';
-import { useSocket } from '@/components/socket-provider';
+import { useSocket } from '@/components/providers/socket-provider';
import { flagsHooks } from '@/hooks/flags-hooks';
import { userHooks } from '@/hooks/user-hooks';
diff --git a/packages/web/src/app/components/builder-layout/index.tsx b/packages/web/src/app/components/builder-layout/index.tsx
index 3e2f80183e3..89dd4f04ff7 100644
--- a/packages/web/src/app/components/builder-layout/index.tsx
+++ b/packages/web/src/app/components/builder-layout/index.tsx
@@ -1,8 +1,8 @@
import { ApEdition, ApFlagId } from '@activepieces/shared';
-import { useEmbedding } from '@/components/embed-provider';
+import { useEmbedding } from '@/components/providers/embed-provider';
import { SidebarInset, SidebarProvider } from '@/components/ui/sidebar-shadcn';
-import { PurchaseExtraFlowsDialog } from '@/features/billing/components/active-flows-addon/purchase-active-flows-dialog';
+import { PurchaseExtraFlowsDialog } from '@/features/billing';
import { flagsHooks } from '@/hooks/flags-hooks';
import { ProjectDashboardSidebar } from '../sidebar/dashboard';
diff --git a/packages/web/src/app/components/embedding-font-loader.tsx b/packages/web/src/app/components/embedding-font-loader.tsx
index 0a33b221921..c35910ce6d4 100644
--- a/packages/web/src/app/components/embedding-font-loader.tsx
+++ b/packages/web/src/app/components/embedding-font-loader.tsx
@@ -1,7 +1,7 @@
import { isNil } from '@activepieces/shared';
import { useSuspenseQuery } from '@tanstack/react-query';
-import { useEmbedding } from '@/components/embed-provider';
+import { useEmbedding } from '@/components/providers/embed-provider';
import { api } from '@/lib/api';
const defaultFont = 'Roboto';
const useDownloadEmbeddingFont = () => {
diff --git a/packages/web/src/app/components/flow-actions-menu.tsx b/packages/web/src/app/components/flow-actions-menu.tsx
index 973728c8eda..f2a241d86b8 100644
--- a/packages/web/src/app/components/flow-actions-menu.tsx
+++ b/packages/web/src/app/components/flow-actions-menu.tsx
@@ -23,33 +23,36 @@ import {
import React, { useState } from 'react';
import { useLocation } from 'react-router-dom';
+import { ConfirmationDeleteDialog } from '@/components/custom/delete-dialog';
import { PermissionNeededTooltip } from '@/components/custom/permission-needed-tooltip';
-import { ConfirmationDeleteDialog } from '@/components/delete-dialog';
-import { useEmbedding } from '@/components/embed-provider';
+import { LoadingSpinner } from '@/components/custom/spinner';
+import { useEmbedding } from '@/components/providers/embed-provider';
import {
DropdownMenu,
DropdownMenuContent,
DropdownMenuItem,
DropdownMenuTrigger,
} from '@/components/ui/dropdown-menu';
-import { LoadingSpinner } from '@/components/ui/spinner';
-import { ChangeOwnerDialog } from '@/features/flows/components/change-owner-dialog';
-import { ImportFlowDialog } from '@/features/flows/components/import-flow-dialog';
-import { RenameFlowDialog } from '@/features/flows/components/rename-flow-dialog';
-import { flowHooks } from '@/features/flows/lib/flow-hooks';
-import { flowsApi } from '@/features/flows/lib/flows-api';
-import { projectMembersHooks } from '@/features/members/lib/project-members-hooks';
-import { PublishedNeededTooltip } from '@/features/project-releases/components/published-tooltip';
-import { PushToGitDialog } from '@/features/project-releases/components/push-to-git-dialog';
-import { gitSyncHooks } from '@/features/project-releases/lib/git-sync-hooks';
+import {
+ flowsApi,
+ ChangeOwnerDialog,
+ ImportFlowDialog,
+ RenameFlowDialog,
+ flowHooks,
+ MoveFlowDialog,
+ ShareTemplateDialog,
+} from '@/features/flows';
+import { projectMembersHooks } from '@/features/members';
+import {
+ PublishedNeededTooltip,
+ PushToGitDialog,
+ gitSyncHooks,
+} from '@/features/project-releases';
import { useAuthorization } from '@/hooks/authorization-hooks';
import { platformHooks } from '@/hooks/platform-hooks';
import { authenticationSession } from '@/lib/authentication-session';
import { useNewWindow } from '@/lib/navigation-utils';
-import { MoveFlowDialog } from '../../features/flows/components/move-flow-dialog';
-import { ShareTemplateDialog } from '../../features/flows/components/share-template-dialog';
-
type FlowActionMenuProps = {
flow: PopulatedFlow;
flowVersion: FlowVersion;
diff --git a/packages/web/src/app/components/initial-data-guard.tsx b/packages/web/src/app/components/initial-data-guard.tsx
index 9a5a2de176f..c355b1641b5 100644
--- a/packages/web/src/app/components/initial-data-guard.tsx
+++ b/packages/web/src/app/components/initial-data-guard.tsx
@@ -1,8 +1,7 @@
import { Suspense } from 'react';
-import { useEmbedding } from '@/components/embed-provider';
-
-import { LoadingScreen } from '../../components/ui/loading-screen';
+import { LoadingScreen } from '@/components/custom/loading-screen';
+import { useEmbedding } from '@/components/providers/embed-provider';
type InitialDataGuardProps = {
children: React.ReactNode;
diff --git a/packages/web/src/app/components/platform-layout.tsx b/packages/web/src/app/components/platform-layout.tsx
index d8dc62c50e5..839615545ca 100644
--- a/packages/web/src/app/components/platform-layout.tsx
+++ b/packages/web/src/app/components/platform-layout.tsx
@@ -3,7 +3,7 @@ import React from 'react';
import { Navigate } from 'react-router-dom';
import { SidebarInset, SidebarProvider } from '@/components/ui/sidebar-shadcn';
-import { PurchaseExtraFlowsDialog } from '@/features/billing/components/active-flows-addon/purchase-active-flows-dialog';
+import { PurchaseExtraFlowsDialog } from '@/features/billing';
import { useIsPlatformAdmin } from '@/hooks/authorization-hooks';
import { flagsHooks } from '@/hooks/flags-hooks';
diff --git a/packages/web/src/app/components/project-layout/index.tsx b/packages/web/src/app/components/project-layout/index.tsx
index 61b7d8c397b..6c2e6994594 100644
--- a/packages/web/src/app/components/project-layout/index.tsx
+++ b/packages/web/src/app/components/project-layout/index.tsx
@@ -4,12 +4,12 @@ import React, { ComponentType, SVGProps } from 'react';
import { useTranslation } from 'react-i18next';
import { Navigate, useLocation } from 'react-router-dom';
-import { useEmbedding } from '@/components/embed-provider';
+import { useEmbedding } from '@/components/providers/embed-provider';
import { Separator } from '@/components/ui/separator';
import { SidebarInset, SidebarProvider } from '@/components/ui/sidebar-shadcn';
-import { PurchaseExtraFlowsDialog } from '@/features/billing/components/active-flows-addon/purchase-active-flows-dialog';
+import { PurchaseExtraFlowsDialog } from '@/features/billing';
+import { projectHooks } from '@/features/projects';
import { flagsHooks } from '@/hooks/flags-hooks';
-import { projectHooks } from '@/hooks/project-collection';
import { authenticationSession } from '../../../lib/authentication-session';
import { ProjectDashboardSidebar } from '../sidebar/dashboard';
diff --git a/packages/web/src/app/components/project-layout/project-dashboard-layout-header.tsx b/packages/web/src/app/components/project-layout/project-dashboard-layout-header.tsx
index d685eed0e2c..cad0c6532b5 100644
--- a/packages/web/src/app/components/project-layout/project-dashboard-layout-header.tsx
+++ b/packages/web/src/app/components/project-layout/project-dashboard-layout-header.tsx
@@ -3,12 +3,12 @@ import { t } from 'i18next';
import { History, Link2, Package, Table2, Workflow } from 'lucide-react';
import { useLocation, useNavigate } from 'react-router-dom';
-import { useEmbedding } from '@/components/embed-provider';
+import { useEmbedding } from '@/components/providers/embed-provider';
import { Separator } from '@/components/ui/separator';
import { Tabs, TabsList, TabsTrigger } from '@/components/ui/tabs';
+import { projectCollectionUtils } from '@/features/projects';
import { useAuthorization } from '@/hooks/authorization-hooks';
import { platformHooks } from '@/hooks/platform-hooks';
-import { projectCollectionUtils } from '@/hooks/project-collection';
import { authenticationSession } from '@/lib/authentication-session';
import { ProjectDashboardPageHeader } from './project-dashboard-page-header';
diff --git a/packages/web/src/app/components/project-layout/project-dashboard-page-header.tsx b/packages/web/src/app/components/project-layout/project-dashboard-page-header.tsx
index 1217c9d47a0..8c784217404 100644
--- a/packages/web/src/app/components/project-layout/project-dashboard-page-header.tsx
+++ b/packages/web/src/app/components/project-layout/project-dashboard-page-header.tsx
@@ -21,15 +21,11 @@ import {
TooltipProvider,
TooltipTrigger,
} from '@/components/ui/tooltip';
-import { InviteUserDialog } from '@/features/members/component/invite-user/invite-user-dialog';
-import { projectMembersHooks } from '@/features/members/lib/project-members-hooks';
+import { InviteUserDialog, projectMembersHooks } from '@/features/members';
+import { getProjectName, projectCollectionUtils } from '@/features/projects';
import { useAuthorization } from '@/hooks/authorization-hooks';
import { flagsHooks } from '@/hooks/flags-hooks';
import { platformHooks } from '@/hooks/platform-hooks';
-import {
- getProjectName,
- projectCollectionUtils,
-} from '@/hooks/project-collection';
import { userHooks } from '@/hooks/user-hooks';
import { ApProjectDisplay } from '../ap-project-display';
diff --git a/packages/web/src/app/components/project-settings/alerts/add-alert-email-dialog.tsx b/packages/web/src/app/components/project-settings/alerts/add-alert-email-dialog.tsx
index 920c3cfdfa8..592488301cc 100644
--- a/packages/web/src/app/components/project-settings/alerts/add-alert-email-dialog.tsx
+++ b/packages/web/src/app/components/project-settings/alerts/add-alert-email-dialog.tsx
@@ -24,9 +24,9 @@ import {
TooltipTrigger,
TooltipContent,
} from '@/components/ui/tooltip';
-import { alertMutations } from '@/features/alerts/lib/alert-hooks';
+import { alertMutations } from '@/features/alerts';
import { useAuthorization } from '@/hooks/authorization-hooks';
-import { formatUtils } from '@/lib/utils';
+import { formatUtils } from '@/lib/format-utils';
const FormSchema = Type.Object({
email: Type.String({
diff --git a/packages/web/src/app/components/project-settings/alerts/index.tsx b/packages/web/src/app/components/project-settings/alerts/index.tsx
index 77ba07beeaa..7ebea83277e 100644
--- a/packages/web/src/app/components/project-settings/alerts/index.tsx
+++ b/packages/web/src/app/components/project-settings/alerts/index.tsx
@@ -2,6 +2,7 @@ import { Permission } from '@activepieces/shared';
import { t } from 'i18next';
import { Bell, Trash } from 'lucide-react';
+import { LoadingSpinner } from '@/components/custom/spinner';
import { Alert, AlertDescription, AlertTitle } from '@/components/ui/alert';
import { Button } from '@/components/ui/button';
import {
@@ -11,16 +12,12 @@ import {
CardHeader,
CardTitle,
} from '@/components/ui/card';
-import { LoadingSpinner } from '@/components/ui/spinner';
import {
Tooltip,
TooltipContent,
TooltipTrigger,
} from '@/components/ui/tooltip';
-import {
- alertQueries,
- alertMutations,
-} from '@/features/alerts/lib/alert-hooks';
+import { alertQueries, alertMutations } from '@/features/alerts';
import { useAuthorization } from '@/hooks/authorization-hooks';
import { AddAlertEmailDialog } from './add-alert-email-dialog';
diff --git a/packages/web/src/app/components/project-settings/environment/index.tsx b/packages/web/src/app/components/project-settings/environment/index.tsx
index 95b59becf80..bba1922d545 100644
--- a/packages/web/src/app/components/project-settings/environment/index.tsx
+++ b/packages/web/src/app/components/project-settings/environment/index.tsx
@@ -4,12 +4,14 @@ import { t } from 'i18next';
import { toast } from 'sonner';
import LockedFeatureGuard from '@/app/components/locked-feature-guard';
+import { LoadingSpinner } from '@/components/custom/spinner';
import { Button } from '@/components/ui/button';
import { Card } from '@/components/ui/card';
-import { LoadingSpinner } from '@/components/ui/spinner';
-import { ConnectGitDialog } from '@/features/project-releases/components/connect-git-dialog';
-import { gitSyncApi } from '@/features/project-releases/lib/git-sync-api';
-import { gitSyncHooks } from '@/features/project-releases/lib/git-sync-hooks';
+import {
+ gitSyncApi,
+ ConnectGitDialog,
+ gitSyncHooks,
+} from '@/features/project-releases';
import { platformHooks } from '@/hooks/platform-hooks';
import { authenticationSession } from '@/lib/authentication-session';
diff --git a/packages/web/src/app/components/project-settings/environment/release-card.tsx b/packages/web/src/app/components/project-settings/environment/release-card.tsx
index ea8b3cafbe0..50a0514f0ac 100644
--- a/packages/web/src/app/components/project-settings/environment/release-card.tsx
+++ b/packages/web/src/app/components/project-settings/environment/release-card.tsx
@@ -3,7 +3,7 @@ import { Package } from 'lucide-react';
import { Button } from '@/components/ui/button';
import { Card } from '@/components/ui/card';
-import { projectCollectionUtils } from '@/hooks/project-collection';
+import { projectCollectionUtils } from '@/features/projects';
import { cn } from '@/lib/utils';
const ReleaseCard = () => {
diff --git a/packages/web/src/app/components/project-settings/general/index.tsx b/packages/web/src/app/components/project-settings/general/index.tsx
index 0f5862be5cf..cd080dbe971 100644
--- a/packages/web/src/app/components/project-settings/general/index.tsx
+++ b/packages/web/src/app/components/project-settings/general/index.tsx
@@ -25,8 +25,8 @@ import {
PopoverContent,
PopoverTrigger,
} from '@/components/ui/popover';
+import { projectCollectionUtils } from '@/features/projects';
import { platformHooks } from '@/hooks/platform-hooks';
-import { projectCollectionUtils } from '@/hooks/project-collection';
import { userHooks } from '@/hooks/user-hooks';
import { cn } from '@/lib/utils';
diff --git a/packages/web/src/app/components/project-settings/index.tsx b/packages/web/src/app/components/project-settings/index.tsx
index 5d3eaceb891..3af0a238337 100644
--- a/packages/web/src/app/components/project-settings/index.tsx
+++ b/packages/web/src/app/components/project-settings/index.tsx
@@ -16,10 +16,10 @@ import { Badge } from '@/components/ui/badge';
import { Button } from '@/components/ui/button';
import { Dialog, DialogContent } from '@/components/ui/dialog';
import { ScrollArea } from '@/components/ui/scroll-area';
+import { projectCollectionUtils } from '@/features/projects';
import { useAuthorization } from '@/hooks/authorization-hooks';
import { flagsHooks } from '@/hooks/flags-hooks';
import { platformHooks } from '@/hooks/platform-hooks';
-import { projectCollectionUtils } from '@/hooks/project-collection';
import { userHooks } from '@/hooks/user-hooks';
import { cn } from '@/lib/utils';
diff --git a/packages/web/src/app/components/project-settings/mcp-server/index.tsx b/packages/web/src/app/components/project-settings/mcp-server/index.tsx
index 3428a66c93d..8615b40d959 100644
--- a/packages/web/src/app/components/project-settings/mcp-server/index.tsx
+++ b/packages/web/src/app/components/project-settings/mcp-server/index.tsx
@@ -2,15 +2,15 @@ import { McpServerStatus, FlowStatus } from '@activepieces/shared';
import { t } from 'i18next';
import { CheckCircle, CircleDot } from 'lucide-react';
-import { Button } from '@/components/ui/button';
import {
Field,
FieldContent,
FieldDescription,
FieldLabel,
-} from '@/components/ui/field';
-import { LoadingSpinner } from '@/components/ui/spinner';
-import { StatusIconWithText } from '@/components/ui/status-icon-with-text';
+} from '@/components/custom/field';
+import { LoadingSpinner } from '@/components/custom/spinner';
+import { StatusIconWithText } from '@/components/custom/status-icon-with-text';
+import { Button } from '@/components/ui/button';
import { Switch } from '@/components/ui/switch';
import { authenticationSession } from '@/lib/authentication-session';
diff --git a/packages/web/src/app/components/project-settings/members/columns.tsx b/packages/web/src/app/components/project-settings/members/columns.tsx
index a71a97d2ecf..925cb823ceb 100644
--- a/packages/web/src/app/components/project-settings/members/columns.tsx
+++ b/packages/web/src/app/components/project-settings/members/columns.tsx
@@ -10,11 +10,12 @@ import { t } from 'i18next';
import { Info, Trash2, User, Shield, ChevronDown } from 'lucide-react';
import { toast } from 'sonner';
+import { RowDataWithActions } from '@/components/custom/data-table';
+import { DataTableColumnHeader } from '@/components/custom/data-table/data-table-column-header';
+import { ConfirmationDeleteDialog } from '@/components/custom/delete-dialog';
import { PermissionNeededTooltip } from '@/components/custom/permission-needed-tooltip';
-import { ConfirmationDeleteDialog } from '@/components/delete-dialog';
+import { UserAvatar } from '@/components/custom/user-avatar';
import { Button } from '@/components/ui/button';
-import { RowDataWithActions } from '@/components/ui/data-table';
-import { DataTableColumnHeader } from '@/components/ui/data-table/data-table-column-header';
import { internalErrorToast } from '@/components/ui/sonner';
import {
Tooltip,
@@ -22,14 +23,15 @@ import {
TooltipProvider,
TooltipTrigger,
} from '@/components/ui/tooltip';
-import { UserAvatar } from '@/components/ui/user-avatar';
-import { RoleSelector } from '@/features/members/component/role-selector';
-import { projectMembersApi } from '@/features/members/lib/project-members-api';
-import { userInvitationApi } from '@/features/members/lib/user-invitation';
-import { projectRoleApi } from '@/features/platform-admin/lib/project-role-api';
+import {
+ projectMembersApi,
+ userInvitationApi,
+ RoleSelector,
+} from '@/features/members';
+import { projectRoleApi } from '@/features/platform-admin';
+import { projectCollectionUtils } from '@/features/projects';
import { useAuthorization } from '@/hooks/authorization-hooks';
-import { projectCollectionUtils } from '@/hooks/project-collection';
-import { formatUtils } from '@/lib/utils';
+import { formatUtils } from '@/lib/format-utils';
export type MemberRowData =
| {
diff --git a/packages/web/src/app/components/project-settings/members/index.tsx b/packages/web/src/app/components/project-settings/members/index.tsx
index 6ff18b157ed..61d4d689d2c 100644
--- a/packages/web/src/app/components/project-settings/members/index.tsx
+++ b/packages/web/src/app/components/project-settings/members/index.tsx
@@ -8,12 +8,14 @@ import { t } from 'i18next';
import { Users } from 'lucide-react';
import { useCallback, useMemo, useState } from 'react';
+import { DataTable } from '@/components/custom/data-table';
+import { DataTableInputPopover } from '@/components/custom/data-table/data-table-input-popover';
import { Button } from '@/components/ui/button';
-import { DataTable } from '@/components/ui/data-table';
-import { DataTableInputPopover } from '@/components/ui/data-table/data-table-input-popover';
-import { InviteUserDialog } from '@/features/members/component/invite-user/invite-user-dialog';
-import { projectMembersHooks } from '@/features/members/lib/project-members-hooks';
-import { userInvitationsHooks } from '@/features/members/lib/user-invitations-hooks';
+import {
+ InviteUserDialog,
+ projectMembersHooks,
+ userInvitationsHooks,
+} from '@/features/members';
import { useAuthorization } from '@/hooks/authorization-hooks';
import { platformUserHooks } from '@/hooks/platform-user-hooks';
import { authenticationSession } from '@/lib/authentication-session';
diff --git a/packages/web/src/app/components/project-settings/pieces/index.tsx b/packages/web/src/app/components/project-settings/pieces/index.tsx
index 463d9b3e49a..ae23b1953f1 100644
--- a/packages/web/src/app/components/project-settings/pieces/index.tsx
+++ b/packages/web/src/app/components/project-settings/pieces/index.tsx
@@ -15,18 +15,16 @@ import { useMemo } from 'react';
import { useSearchParams } from 'react-router-dom';
import { RequestTrial } from '@/app/components/request-trial';
-import { ConfirmationDeleteDialog } from '@/components/delete-dialog';
-import { Button } from '@/components/ui/button';
import {
BulkAction,
DataTable,
RowDataWithActions,
-} from '@/components/ui/data-table';
-import { DataTableColumnHeader } from '@/components/ui/data-table/data-table-column-header';
-import { LockedAlert } from '@/components/ui/locked-alert';
-import { PieceIcon } from '@/features/pieces/components/piece-icon';
-import { piecesApi } from '@/features/pieces/lib/pieces-api';
-import { piecesHooks } from '@/features/pieces/lib/pieces-hooks';
+} from '@/components/custom/data-table';
+import { DataTableColumnHeader } from '@/components/custom/data-table/data-table-column-header';
+import { ConfirmationDeleteDialog } from '@/components/custom/delete-dialog';
+import { LockedAlert } from '@/components/custom/locked-alert';
+import { Button } from '@/components/ui/button';
+import { piecesApi, PieceIcon, piecesHooks } from '@/features/pieces';
import { platformHooks } from '@/hooks/platform-hooks';
import { ManagePiecesDialog } from './manage-pieces-dialog';
diff --git a/packages/web/src/app/components/project-settings/pieces/manage-pieces-dialog.tsx b/packages/web/src/app/components/project-settings/pieces/manage-pieces-dialog.tsx
index 4a36139ca86..20821c798f5 100644
--- a/packages/web/src/app/components/project-settings/pieces/manage-pieces-dialog.tsx
+++ b/packages/web/src/app/components/project-settings/pieces/manage-pieces-dialog.tsx
@@ -17,10 +17,10 @@ import {
} from '@/components/ui/dialog';
import { Form, FormField, FormItem } from '@/components/ui/form';
import { Label } from '@/components/ui/label';
-import { projectCollectionUtils } from '@/hooks/project-collection';
+import { piecesHooks } from '@/features/pieces';
+import { projectCollectionUtils } from '@/features/projects';
import { MultiSelectPieceProperty } from '../../../../components/custom/multi-select-piece-property';
-import { piecesHooks } from '../../../../features/pieces/lib/pieces-hooks';
import { authenticationSession } from '../../../../lib/authentication-session';
type ManagePiecesDialogProps = {
diff --git a/packages/web/src/app/components/sidebar/ap-sidebar-item.tsx b/packages/web/src/app/components/sidebar/ap-sidebar-item.tsx
index 1058f7c6064..3b058164397 100644
--- a/packages/web/src/app/components/sidebar/ap-sidebar-item.tsx
+++ b/packages/web/src/app/components/sidebar/ap-sidebar-item.tsx
@@ -2,7 +2,7 @@ import { LockKeyhole } from 'lucide-react';
import { ComponentType, SVGProps } from 'react';
import { useLocation, useNavigate } from 'react-router-dom';
-import { Dot } from '@/components/ui/dot';
+import { Dot } from '@/components/custom/dot';
import {
SidebarMenuButton,
SidebarMenuItem,
diff --git a/packages/web/src/app/components/sidebar/dashboard/index.tsx b/packages/web/src/app/components/sidebar/dashboard/index.tsx
index bb079bf6993..04a07404beb 100644
--- a/packages/web/src/app/components/sidebar/dashboard/index.tsx
+++ b/packages/web/src/app/components/sidebar/dashboard/index.tsx
@@ -12,14 +12,14 @@ import { useLocation, useNavigate } from 'react-router-dom';
import { useDebounce } from 'use-debounce';
import { NewProjectDialog } from '@/app/routes/platform/projects/new-project-dialog';
-import { useEmbedding } from '@/components/embed-provider';
+import { SearchInput } from '@/components/custom/search-input';
+import { useEmbedding } from '@/components/providers/embed-provider';
import { Button } from '@/components/ui/button';
import {
Popover,
PopoverContent,
PopoverTrigger,
} from '@/components/ui/popover';
-import { SearchInput } from '@/components/ui/search-input';
import {
Sidebar,
SidebarContent,
@@ -37,9 +37,9 @@ import {
TooltipTrigger,
} from '@/components/ui/tooltip';
import { VirtualizedScrollArea } from '@/components/ui/virtualized-scroll-area';
-import { templatesTelemetryApi } from '@/features/templates/lib/templates-telemetry-api';
+import { projectCollectionUtils } from '@/features/projects';
+import { templatesTelemetryApi } from '@/features/templates';
import { platformHooks } from '@/hooks/platform-hooks';
-import { projectCollectionUtils } from '@/hooks/project-collection';
import { userHooks } from '@/hooks/user-hooks';
import { cn } from '@/lib/utils';
diff --git a/packages/web/src/app/components/sidebar/platform/index.tsx b/packages/web/src/app/components/sidebar/platform/index.tsx
index 6d7a66b6119..5e5506c294b 100644
--- a/packages/web/src/app/components/sidebar/platform/index.tsx
+++ b/packages/web/src/app/components/sidebar/platform/index.tsx
@@ -38,7 +38,8 @@ import {
import { useAuthorization } from '@/hooks/authorization-hooks';
import { flagsHooks } from '@/hooks/flags-hooks';
import { platformHooks } from '@/hooks/platform-hooks';
-import { cn, determineDefaultRoute } from '@/lib/utils';
+import { determineDefaultRoute } from '@/lib/route-utils';
+import { cn } from '@/lib/utils';
import { ApSidebarItem } from '../ap-sidebar-item';
import { SidebarUser } from '../sidebar-user';
diff --git a/packages/web/src/app/components/sidebar/project/index.tsx b/packages/web/src/app/components/sidebar/project/index.tsx
index 513d98035ac..19bfadc36ed 100644
--- a/packages/web/src/app/components/sidebar/project/index.tsx
+++ b/packages/web/src/app/components/sidebar/project/index.tsx
@@ -8,7 +8,7 @@ import { User } from 'lucide-react';
import { Avatar } from '@/components/ui/avatar';
import { SidebarMenuButton, useSidebar } from '@/components/ui/sidebar-shadcn';
-import { getProjectName } from '@/hooks/project-collection';
+import { getProjectName } from '@/features/projects';
import { cn } from '@/lib/utils';
const MAX_LENGTH_TO_NOT_SHOW_TOOLTIP = 28;
diff --git a/packages/web/src/app/components/sidebar/sidebar-header.tsx b/packages/web/src/app/components/sidebar/sidebar-header.tsx
index 9555bf97d83..a8aa5cc96f1 100644
--- a/packages/web/src/app/components/sidebar/sidebar-header.tsx
+++ b/packages/web/src/app/components/sidebar/sidebar-header.tsx
@@ -3,7 +3,7 @@ import { t } from 'i18next';
import { ChevronsUpDown } from 'lucide-react';
import { useNavigate } from 'react-router-dom';
-import { useEmbedding } from '@/components/embed-provider';
+import { useEmbedding } from '@/components/providers/embed-provider';
import { Button } from '@/components/ui/button';
import {
SidebarHeader,
@@ -12,11 +12,11 @@ import {
SidebarMenuItem,
useSidebar,
} from '@/components/ui/sidebar-shadcn';
-import { PlatformSwitcher } from '@/features/projects/components/platform-switcher';
+import { PlatformSwitcher } from '@/features/projects';
import { useAuthorization } from '@/hooks/authorization-hooks';
import { flagsHooks } from '@/hooks/flags-hooks';
import { platformHooks } from '@/hooks/platform-hooks';
-import { determineDefaultRoute } from '@/lib/utils';
+import { determineDefaultRoute } from '@/lib/route-utils';
function SidebarLogoCollapsed({ linkTo }: { linkTo?: string }) {
const branding = flagsHooks.useWebsiteBranding();
diff --git a/packages/web/src/app/components/sidebar/sidebar-usage-limits.tsx b/packages/web/src/app/components/sidebar/sidebar-usage-limits.tsx
index 216e6d019b4..b04cea5204f 100644
--- a/packages/web/src/app/components/sidebar/sidebar-usage-limits.tsx
+++ b/packages/web/src/app/components/sidebar/sidebar-usage-limits.tsx
@@ -10,11 +10,11 @@ import {
TooltipContent,
TooltipTrigger,
} from '@/components/ui/tooltip';
+import { projectCollectionUtils } from '@/features/projects';
import { flagsHooks } from '@/hooks/flags-hooks';
import { platformHooks } from '@/hooks/platform-hooks';
-import { projectCollectionUtils } from '@/hooks/project-collection';
import { userHooks } from '@/hooks/user-hooks';
-import { formatUtils } from '@/lib/utils';
+import { formatUtils } from '@/lib/format-utils';
const SidebarUsageLimits = React.memo(() => {
const { project } = projectCollectionUtils.useCurrentProject();
diff --git a/packages/web/src/app/components/sidebar/sidebar-user.tsx b/packages/web/src/app/components/sidebar/sidebar-user.tsx
index da56a54031f..cd87ef37308 100644
--- a/packages/web/src/app/components/sidebar/sidebar-user.tsx
+++ b/packages/web/src/app/components/sidebar/sidebar-user.tsx
@@ -11,8 +11,9 @@ import {
import { useState } from 'react';
import { useLocation, useNavigate } from 'react-router-dom';
-import { useEmbedding } from '@/components/embed-provider';
-import { useTelemetry } from '@/components/telemetry-provider';
+import { UserAvatar } from '@/components/custom/user-avatar';
+import { useEmbedding } from '@/components/providers/embed-provider';
+import { useTelemetry } from '@/components/providers/telemetry-provider';
import {
DropdownMenu,
DropdownMenuContent,
@@ -28,8 +29,7 @@ import {
SidebarMenuItem,
useSidebar,
} from '@/components/ui/sidebar-shadcn';
-import { UserAvatar } from '@/components/ui/user-avatar';
-import { InviteUserDialog } from '@/features/members/component/invite-user/invite-user-dialog';
+import { InviteUserDialog } from '@/features/members';
import {
useIsPlatformAdmin,
useAuthorization,
diff --git a/packages/web/src/app/connections/create-edit-connection-dialog.tsx b/packages/web/src/app/connections/create-edit-connection-dialog.tsx
index 164e4979aa2..394a4662981 100644
--- a/packages/web/src/app/connections/create-edit-connection-dialog.tsx
+++ b/packages/web/src/app/connections/create-edit-connection-dialog.tsx
@@ -44,14 +44,16 @@ import { Label } from '@/components/ui/label';
import { ScrollArea } from '@/components/ui/scroll-area';
import { Separator } from '@/components/ui/separator';
import { SkeletonList } from '@/components/ui/skeleton';
-import { AssignConnectionToProjectsControl } from '@/features/connections/components/assign-global-connection-to-projects';
-import { appConnectionsMutations } from '@/features/connections/lib/app-connections-hooks';
-import { oauthAppsQueries } from '@/features/connections/lib/oauth-apps-hooks';
+import {
+ AssignConnectionToProjectsControl,
+ appConnectionsMutations,
+ oauthAppsQueries,
+ oauth2Utils,
+ PiecesOAuth2AppsMap,
+ newConnectionUtils,
+} from '@/features/connections';
+import { formUtils } from '@/features/pieces';
import { flagsHooks } from '@/hooks/flags-hooks';
-import { oauth2Utils, PiecesOAuth2AppsMap } from '@/lib/oauth2-utils';
-
-import { newConnectionUtils } from '../../features/connections/lib/utils';
-import { formUtils } from '../../features/pieces/lib/form-utils';
import { BasicAuthConnectionSettings } from './basic-secret-connection-settings';
import { CustomAuthConnectionSettings } from './custom-auth-connection-settings';
diff --git a/packages/web/src/app/connections/multi-auth-list.tsx b/packages/web/src/app/connections/multi-auth-list.tsx
index 271cea45a8b..9a51dd8d5cf 100644
--- a/packages/web/src/app/connections/multi-auth-list.tsx
+++ b/packages/web/src/app/connections/multi-auth-list.tsx
@@ -28,8 +28,8 @@ import {
OAuth2App,
PiecesOAuth2AppsMap,
oauth2Utils,
-} from '@/lib/oauth2-utils';
-import { formatUtils } from '@/lib/utils';
+} from '@/features/connections';
+import { formatUtils } from '@/lib/format-utils';
export function MutliAuthList({
pieceAuth,
diff --git a/packages/web/src/app/connections/new-connection-dialog.tsx b/packages/web/src/app/connections/new-connection-dialog.tsx
index d878a16fbc8..f50a5bcb0bf 100644
--- a/packages/web/src/app/connections/new-connection-dialog.tsx
+++ b/packages/web/src/app/connections/new-connection-dialog.tsx
@@ -15,7 +15,7 @@ import {
} from '@/components/ui/dialog';
import { Input } from '@/components/ui/input';
import { ScrollArea } from '@/components/ui/scroll-area';
-import { piecesHooks } from '@/features/pieces/lib/pieces-hooks';
+import { piecesHooks } from '@/features/pieces';
import { CreateOrEditConnectionDialog } from './create-edit-connection-dialog';
diff --git a/packages/web/src/app/connections/oauth2-connection-settings.tsx b/packages/web/src/app/connections/oauth2-connection-settings.tsx
index 228ad989940..1b43d04722b 100644
--- a/packages/web/src/app/connections/oauth2-connection-settings.tsx
+++ b/packages/web/src/app/connections/oauth2-connection-settings.tsx
@@ -26,8 +26,8 @@ import {
FormMessage,
} from '@/components/ui/form';
import { Input } from '@/components/ui/input';
+import { OAuth2App, oauth2Utils } from '@/features/connections';
import { flagsHooks } from '@/hooks/flags-hooks';
-import { OAuth2App, oauth2Utils } from '@/lib/oauth2-utils';
import { GenericPropertiesForm } from '../builder/piece-properties/generic-properties-form';
diff --git a/packages/web/src/app/connections/reconnect-button-dialog.tsx b/packages/web/src/app/connections/reconnect-button-dialog.tsx
index 5f8116cfc0f..a45060de9cf 100644
--- a/packages/web/src/app/connections/reconnect-button-dialog.tsx
+++ b/packages/web/src/app/connections/reconnect-button-dialog.tsx
@@ -13,7 +13,7 @@ import {
TooltipContent,
TooltipTrigger,
} from '@/components/ui/tooltip';
-import { piecesHooks } from '@/features/pieces/lib/pieces-hooks';
+import { piecesHooks } from '@/features/pieces';
type ReconnectButtonDialogProps = {
connection: AppConnectionWithoutSensitiveData;
diff --git a/packages/web/src/app/connections/replace-connections-dialog.tsx b/packages/web/src/app/connections/replace-connections-dialog.tsx
index e7f92c6d63f..e5356741362 100644
--- a/packages/web/src/app/connections/replace-connections-dialog.tsx
+++ b/packages/web/src/app/connections/replace-connections-dialog.tsx
@@ -25,10 +25,9 @@ import { ScrollArea } from '@/components/ui/scroll-area';
import {
appConnectionsMutations,
appConnectionsQueries,
-} from '@/features/connections/lib/app-connections-hooks';
-import { flowsApi } from '@/features/flows/lib/flows-api';
-import PieceIconWithPieceName from '@/features/pieces/components/piece-icon-from-name';
-import { piecesHooks } from '@/features/pieces/lib/pieces-hooks';
+} from '@/features/connections';
+import { flowsApi } from '@/features/flows';
+import { PieceIconWithPieceName, piecesHooks } from '@/features/pieces';
import { cn } from '@/lib/utils';
type ReplaceConnectionsDialogProps = {
diff --git a/packages/web/src/app/connections/secret-input.tsx b/packages/web/src/app/connections/secret-input.tsx
index d91ed9115d1..65dce295997 100644
--- a/packages/web/src/app/connections/secret-input.tsx
+++ b/packages/web/src/app/connections/secret-input.tsx
@@ -21,7 +21,7 @@ import {
TooltipContent,
TooltipTrigger,
} from '@/components/ui/tooltip';
-import { secretManagersHooks } from '@/features/secret-managers/lib/secret-managers-hooks';
+import { secretManagersHooks } from '@/features/secret-managers';
import { cn } from '@/lib/utils';
type SecretInputProps = Omit & {
diff --git a/packages/web/src/app/guards/default-route.tsx b/packages/web/src/app/guards/default-route.tsx
index 72ad8e27d02..d94c5df9076 100644
--- a/packages/web/src/app/guards/default-route.tsx
+++ b/packages/web/src/app/guards/default-route.tsx
@@ -2,7 +2,7 @@ import { Navigate, useLocation } from 'react-router-dom';
import { useAuthorization } from '@/hooks/authorization-hooks';
import { authenticationSession } from '@/lib/authentication-session';
-import { determineDefaultRoute } from '@/lib/utils';
+import { determineDefaultRoute } from '@/lib/route-utils';
export const DefaultRoute = () => {
const token = authenticationSession.getToken();
diff --git a/packages/web/src/app/guards/index.tsx b/packages/web/src/app/guards/index.tsx
index 0bd7f9cbd3f..98c4610a87f 100644
--- a/packages/web/src/app/guards/index.tsx
+++ b/packages/web/src/app/guards/index.tsx
@@ -1,578 +1,24 @@
-import { Permission } from '@activepieces/shared';
import {
- Navigate,
RouterProvider,
createBrowserRouter,
createMemoryRouter,
- useLocation,
} from 'react-router-dom';
import { PageTitle } from '@/app/components/page-title';
-import { ChatPage } from '@/app/routes/chat';
-import { EmbedPage } from '@/app/routes/embed';
-import AnalyticsPage from '@/app/routes/impact';
-import { ApiKeysPage } from '@/app/routes/platform/security/api-keys';
-import { SigningKeysPage } from '@/app/routes/platform/security/signing-keys';
-import { SSOPage } from '@/app/routes/platform/security/sso';
-import AIProvidersPage from '@/app/routes/platform/setup/ai';
-import { BrandingPage } from '@/app/routes/platform/setup/branding';
-import { PlatformPiecesPage } from '@/app/routes/platform/setup/pieces';
-import { RedirectPage } from '@/app/routes/redirect';
-import { useEmbedding } from '@/components/embed-provider';
-import { VerifyEmail } from '@/features/authentication/components/verify-email';
-import { Error } from '@/features/billing/components/error';
-import { Success } from '@/features/billing/components/success';
-import { AcceptInvitation } from '@/features/members/component/accept-invitation';
-import { routesThatRequireProjectId } from '@/lib/utils';
+import { authRoutes } from '@/app/routes/auth-routes';
+import { platformRoutes } from '@/app/routes/platform-routes';
+import { projectRoutes } from '@/app/routes/project-routes';
+import { publicRoutes } from '@/app/routes/public-routes';
+import { useEmbedding } from '@/components/providers/embed-provider';
-import { ApTableStateProvider } from '../../features/tables/components/ap-table-state-provider';
-import { BuilderLayout } from '../components/builder-layout';
-import { PlatformLayout } from '../components/platform-layout';
-import { ProjectDashboardLayout } from '../components/project-layout';
-import NotFoundPage from '../routes/404-page';
-import AuthenticatePage from '../routes/authenticate';
-import { ChangePasswordPage } from '../routes/change-password';
-import { AppConnectionsPage } from '../routes/connections';
-import { EmbeddedConnectionDialog } from '../routes/embed/embedded-connection-dialog';
-import { FlowsPage } from '../routes/flows';
-import { FlowBuilderPage } from '../routes/flows/id';
-import { ResetPasswordPage } from '../routes/forget-password';
-import { FormPage } from '../routes/forms';
-import LeaderboardPage from '../routes/leaderboard';
-import SettingsBilling from '../routes/platform/billing';
-import EventDestinationsPage from '../routes/platform/infra/event-destinations';
-import SettingsHealthPage from '../routes/platform/infra/health';
-import TriggerHealthPage from '../routes/platform/infra/triggers';
-import SettingsWorkersPage from '../routes/platform/infra/workers';
-import ProjectsPage from '../routes/platform/projects';
-import AuditLogsPage from '../routes/platform/security/audit-logs';
-import { ProjectRolePage } from '../routes/platform/security/project-role';
-import { ProjectRoleUsersTable } from '../routes/platform/security/project-role/project-role-users-table';
-import SecretManagersPage from '../routes/platform/security/secret-managers';
-import { GlobalConnectionsTable } from '../routes/platform/setup/connections';
-import { PlatformTemplatesPage } from '../routes/platform/setup/templates';
-import UsersPage from '../routes/platform/users';
-import { ProjectReleasesPage } from '../routes/project-release';
-import ViewRelease from '../routes/project-release/view-release';
-import { RunsPage } from '../routes/runs';
-import { FlowRunPage } from '../routes/runs/id';
-import { SignInPage } from '../routes/sign-in';
-import { SignUpPage } from '../routes/sign-up';
-import { ApTablesPage } from '../routes/tables';
-import { ApTableEditorPage } from '../routes/tables/id';
-import { TemplatesPage } from '../routes/templates';
-
-import { AfterImportFlowRedirect } from './after-import-flow-redirect';
import { DefaultRoute } from './default-route';
-import { RoutePermissionGuard } from './permission-guard';
-import {
- ProjectRouterWrapper,
- TokenCheckerWrapper,
-} from './project-route-wrapper';
-import { TemplateDetailsWrapper } from './template-details-wrapper';
-
-const SettingsRerouter = () => {
- const { hash } = useLocation();
- const fragmentWithoutHash = hash.slice(1).toLowerCase();
- return fragmentWithoutHash ? (
-
- ) : (
-
- );
-};
+import { TokenCheckerWrapper } from './project-route-wrapper';
const routes = [
- {
- path: '/embed',
- element: ,
- },
- {
- path: '/embed/connections',
- element: ,
- },
- {
- path: '/authenticate',
- element: ,
- },
- {
- path: '/templates',
- element: (
-
-
-
-
-
- ),
- },
- ...ProjectRouterWrapper({
- path: routesThatRequireProjectId.flows,
- element: (
-
-
-
-
-
-
-
- ),
- }),
- ...ProjectRouterWrapper({
- path: routesThatRequireProjectId.singleFlow,
- element: (
-
-
-
-
-
-
-
- ),
- }),
- ...ProjectRouterWrapper({
- path: '/flow-import-redirect/:flowId',
- element: ,
- }),
- {
- path: '/forms/:flowId',
- element: (
-
-
-
- ),
- },
- {
- path: '/chats/:flowId',
- element: (
-
-
-
- ),
- },
- ...ProjectRouterWrapper({
- path: routesThatRequireProjectId.singleRun,
- element: (
-
-
-
-
-
-
-
- ),
- }),
- ...ProjectRouterWrapper({
- path: routesThatRequireProjectId.runs,
- element: (
-
-
-
-
-
-
-
- ),
- }),
- {
- path: '/templates/:templateId',
- element: ,
- },
- ...ProjectRouterWrapper({
- path: routesThatRequireProjectId.singleRelease,
- element: (
-
-
-
-
-
- ),
- }),
- ...ProjectRouterWrapper({
- path: routesThatRequireProjectId.tables,
- element: (
-
-
-
-
-
-
-
- ),
- }),
- ...ProjectRouterWrapper({
- path: routesThatRequireProjectId.singleTable,
- element: (
-
-
-
-
-
-
-
-
-
- ),
- }),
- ...ProjectRouterWrapper({
- path: routesThatRequireProjectId.connections,
- element: (
-
-
-
-
-
-
-
- ),
- }),
- ...ProjectRouterWrapper({
- path: routesThatRequireProjectId.releases,
- element: (
-
-
-
-
-
- ),
- }),
- ...ProjectRouterWrapper({
- path: routesThatRequireProjectId.settings,
- element: (
-
-
-
- ),
- }),
- {
- path: '/forget-password',
- element: (
-
-
-
- ),
- },
- {
- path: '/reset-password',
- element: (
-
-
-
- ),
- },
- {
- path: '/sign-in',
- element: (
-
-
-
- ),
- },
- {
- path: '/verify-email',
- element: (
-
-
-
- ),
- },
- {
- path: '/sign-up',
- element: (
-
-
-
- ),
- },
-
- {
- path: '/invitation',
- element: (
-
-
-
- ),
- },
- {
- path: '/404',
- element: (
-
-
-
- ),
- },
- {
- path: '/platform/projects',
- element: (
-
-
-
-
-
- ),
- },
- {
- path: '/platform/setup/pieces',
- element: (
-
-
-
-
-
- ),
- },
- {
- path: '/impact',
- element: (
-
-
-
-
-
- ),
- },
- {
- path: '/leaderboard',
- element: (
-
-
-
-
-
- ),
- },
- {
- path: '/platform',
- element: (
-
-
-
-
-
- ),
- },
- {
- path: '/platform/setup/connections',
- element: (
-
-
-
-
-
- ),
- },
- {
- path: '/platform/setup/templates',
- element: (
-
-
-
-
-
- ),
- },
- {
- path: '/platform/setup/branding',
- element: (
-
-
-
-
-
- ),
- },
- {
- path: '/platform/users',
- element: (
-
-
-
-
-
- ),
- },
- {
- path: '/platform/setup/ai',
- element: (
-
-
-
-
-
- ),
- },
- {
- path: '/platform/security/api-keys',
- element: (
-
-
-
-
-
- ),
- },
- {
- path: '/platform/security/secret-managers',
- element: (
-
-
-
-
-
- ),
- },
- {
- path: '/platform/security/audit-logs',
- element: (
-
-
-
-
-
- ),
- },
- {
- path: '/platform/infrastructure/workers',
- element: (
-
-
-
-
-
- ),
- },
- {
- path: '/platform/infrastructure/health',
- element: (
-
-
-
-
-
- ),
- },
- {
- path: '/platform/infrastructure/triggers',
- element: (
-
-
-
-
-
- ),
- },
- {
- path: '/platform/infrastructure/event-destinations',
- element: (
-
-
-
-
-
- ),
- },
- {
- path: '/platform/setup/billing',
- element: (
-
-
-
-
-
- ),
- },
- {
- path: '/platform/setup/billing/success',
- element: (
-
-
-
-
-
- ),
- },
- {
- path: '/platform/setup/billing/error',
- element: (
-
-
-
-
-
- ),
- },
- {
- path: '/platform/security/signing-keys',
- element: (
-
-
-
-
-
- ),
- },
- {
- path: '/platform/security/sso',
- element: (
-
-
-
-
-
- ),
- },
- {
- path: '/platform/security/project-roles',
- element: (
-
-
-
-
-
- ),
- },
- {
- path: '/platform/security/project-roles/:projectRoleId',
- element: (
-
-
-
-
-
- ),
- },
- {
- path: '/platform/setup',
- element: (
-
-
-
-
-
- ),
- },
- {
- path: '/platform/infrastructure',
- element: (
-
-
-
-
-
- ),
- },
- {
- path: '/platform/security',
- element: (
-
-
-
-
-
- ),
- },
- {
- path: '/redirect',
- element: ,
- },
+ ...publicRoutes,
+ ...projectRoutes,
+ ...authRoutes,
+ ...platformRoutes,
{
path: '/projects/:projectId',
element: (
diff --git a/packages/web/src/app/guards/project-route-wrapper.tsx b/packages/web/src/app/guards/project-route-wrapper.tsx
index 66d97e696ba..7957bcbb2a3 100644
--- a/packages/web/src/app/guards/project-route-wrapper.tsx
+++ b/packages/web/src/app/guards/project-route-wrapper.tsx
@@ -4,7 +4,7 @@ import React from 'react';
import { Navigate, useParams, useSearchParams } from 'react-router-dom';
import { toast } from 'sonner';
-import { projectCollectionUtils } from '@/hooks/project-collection';
+import { projectCollectionUtils } from '@/features/projects';
import {
FROM_QUERY_PARAM,
useDefaultRedirectPath,
diff --git a/packages/web/src/app/guards/template-details-wrapper.tsx b/packages/web/src/app/guards/template-details-wrapper.tsx
index 4add80824c2..7613ca37849 100644
--- a/packages/web/src/app/guards/template-details-wrapper.tsx
+++ b/packages/web/src/app/guards/template-details-wrapper.tsx
@@ -4,9 +4,8 @@ import { Navigate, useParams, useLocation } from 'react-router-dom';
import { PageTitle } from '@/app/components/page-title';
import { ProjectDashboardLayout } from '@/app/components/project-layout';
import { TemplateDetailsPage } from '@/app/routes/templates/id';
-import { LoadingScreen } from '@/components/ui/loading-screen';
-import { ShareTemplate } from '@/features/templates/components/share-template';
-import { templatesHooks } from '@/features/templates/hooks/templates-hook';
+import { LoadingScreen } from '@/components/custom/loading-screen';
+import { ShareTemplate, templatesHooks } from '@/features/templates';
import { authenticationSession } from '@/lib/authentication-session';
import { FROM_QUERY_PARAM } from '@/lib/navigation-utils';
diff --git a/packages/web/src/app/routes/auth-routes.tsx b/packages/web/src/app/routes/auth-routes.tsx
new file mode 100644
index 00000000000..b765c11f05b
--- /dev/null
+++ b/packages/web/src/app/routes/auth-routes.tsx
@@ -0,0 +1,59 @@
+import { PageTitle } from '@/app/components/page-title';
+import { VerifyEmail } from '@/features/authentication';
+import { AcceptInvitation } from '@/features/members';
+
+import { ChangePasswordPage } from './change-password';
+import { ResetPasswordPage } from './forget-password';
+import { SignInPage } from './sign-in';
+import { SignUpPage } from './sign-up';
+
+export const authRoutes = [
+ {
+ path: '/forget-password',
+ element: (
+
+
+
+ ),
+ },
+ {
+ path: '/reset-password',
+ element: (
+
+
+
+ ),
+ },
+ {
+ path: '/sign-in',
+ element: (
+
+
+
+ ),
+ },
+ {
+ path: '/verify-email',
+ element: (
+
+
+
+ ),
+ },
+ {
+ path: '/sign-up',
+ element: (
+
+
+
+ ),
+ },
+ {
+ path: '/invitation',
+ element: (
+
+
+
+ ),
+ },
+];
diff --git a/packages/web/src/app/routes/change-password/index.tsx b/packages/web/src/app/routes/change-password/index.tsx
index 8a8f2227d08..2bc2014a1ea 100644
--- a/packages/web/src/app/routes/change-password/index.tsx
+++ b/packages/web/src/app/routes/change-password/index.tsx
@@ -1,5 +1,5 @@
-import { FullLogo } from '@/components/ui/full-logo';
-import { ChangePasswordForm } from '@/features/authentication/components/change-password';
+import { FullLogo } from '@/components/custom/full-logo';
+import { ChangePasswordForm } from '@/features/authentication';
const ChangePasswordPage = () => {
return (
diff --git a/packages/web/src/app/routes/chat/chat-drawer.tsx b/packages/web/src/app/routes/chat/chat-drawer.tsx
index 93ac392e3b8..af0622ca8a9 100644
--- a/packages/web/src/app/routes/chat/chat-drawer.tsx
+++ b/packages/web/src/app/routes/chat/chat-drawer.tsx
@@ -7,7 +7,8 @@ import { ArrowRight } from 'lucide-react';
import { useRef } from 'react';
import { useBuilderStateContext } from '@/app/builder/builder-hooks';
-import { useSocket } from '@/components/socket-provider';
+import { ChatDrawerSource } from '@/app/builder/types';
+import { useSocket } from '@/components/providers/socket-provider';
import { Button } from '@/components/ui/button';
import {
Drawer,
@@ -15,7 +16,6 @@ import {
DrawerHeader,
DrawerTitle,
} from '@/components/ui/drawer';
-import { ChatDrawerSource } from '@/lib/types';
import { FlowChat } from './flow-chat';
diff --git a/packages/web/src/app/routes/chat/flow-chat.tsx b/packages/web/src/app/routes/chat/flow-chat.tsx
index 6b26e2dd0a4..ffabec58e06 100644
--- a/packages/web/src/app/routes/chat/flow-chat.tsx
+++ b/packages/web/src/app/routes/chat/flow-chat.tsx
@@ -10,16 +10,17 @@ import { AxiosError } from 'axios';
import { nanoid } from 'nanoid';
import { useEffect, useRef, useState } from 'react';
-import { LoadingScreen } from '@/components/ui/loading-screen';
-import { ChatInput, ChatMessage } from '@/features/chat/chat-input';
-import { ChatIntro } from '@/features/chat/chat-intro';
-import { ImageDialog } from '@/features/chat/chat-message/image-dialog';
+import { ChatDrawerSource } from '@/app/builder/types';
+import { LoadingScreen } from '@/components/custom/loading-screen';
import {
+ ChatInput,
+ ChatMessage,
+ ChatIntro,
+ ImageDialog,
ChatMessageList,
Messages,
-} from '@/features/chat/chat-message-list/index';
-import { humanInputApi } from '@/features/forms/lib/human-input-api';
-import { ChatDrawerSource } from '@/lib/types';
+} from '@/features/chat';
+import { humanInputApi } from '@/features/forms';
import { cn } from '@/lib/utils';
import NotFoundPage from '../404-page';
diff --git a/packages/web/src/app/routes/chat/index.tsx b/packages/web/src/app/routes/chat/index.tsx
index 867d37212f1..2a86f3c4563 100644
--- a/packages/web/src/app/routes/chat/index.tsx
+++ b/packages/web/src/app/routes/chat/index.tsx
@@ -4,10 +4,10 @@ import { useState, useEffect } from 'react';
import { useParams } from 'react-router-dom';
import { useSearchParam } from 'react-use';
-import { LoadingScreen } from '@/components/ui/loading-screen';
-import { Messages } from '@/features/chat/chat-message-list';
-import { flowHooks } from '@/features/flows/lib/flow-hooks';
-import { ChatDrawerSource } from '@/lib/types';
+import { ChatDrawerSource } from '@/app/builder/types';
+import { LoadingScreen } from '@/components/custom/loading-screen';
+import { Messages } from '@/features/chat';
+import { flowHooks } from '@/features/flows';
import { ChatNotFound, FlowChat } from './flow-chat';
diff --git a/packages/web/src/app/routes/connections/index.tsx b/packages/web/src/app/routes/connections/index.tsx
index ab0160e8544..4be968221e5 100644
--- a/packages/web/src/app/routes/connections/index.tsx
+++ b/packages/web/src/app/routes/connections/index.tsx
@@ -26,9 +26,6 @@ import { NewConnectionDialog } from '@/app/connections/new-connection-dialog';
import { ReconnectButtonDialog } from '@/app/connections/reconnect-button-dialog';
import { ReplaceConnectionsDialog } from '@/app/connections/replace-connections-dialog';
import { CopyTextTooltip } from '@/components/custom/clipboard/copy-text-tooltip';
-import { PermissionNeededTooltip } from '@/components/custom/permission-needed-tooltip';
-import { ConfirmationDeleteDialog } from '@/components/delete-dialog';
-import { Button } from '@/components/ui/button';
import {
BulkAction,
CURSOR_QUERY_PARAM,
@@ -36,29 +33,31 @@ import {
DataTableFilters,
LIMIT_QUERY_PARAM,
RowDataWithActions,
-} from '@/components/ui/data-table';
-import { DataTableColumnHeader } from '@/components/ui/data-table/data-table-column-header';
-import { FormattedDate } from '@/components/ui/formatted-date';
-import { StatusIconWithText } from '@/components/ui/status-icon-with-text';
+} from '@/components/custom/data-table';
+import { DataTableColumnHeader } from '@/components/custom/data-table/data-table-column-header';
+import { ConfirmationDeleteDialog } from '@/components/custom/delete-dialog';
+import { FormattedDate } from '@/components/custom/formatted-date';
+import { PermissionNeededTooltip } from '@/components/custom/permission-needed-tooltip';
+import { StatusIconWithText } from '@/components/custom/status-icon-with-text';
+import { Button } from '@/components/ui/button';
import {
Tooltip,
TooltipContent,
TooltipTrigger,
} from '@/components/ui/tooltip';
-import { EditGlobalConnectionDialog } from '@/features/connections/components/edit-global-connection-dialog';
-import { RenameConnectionDialog } from '@/features/connections/components/rename-connection-dialog';
import {
+ EditGlobalConnectionDialog,
+ RenameConnectionDialog,
appConnectionsMutations,
appConnectionsQueries,
-} from '@/features/connections/lib/app-connections-hooks';
-import { appConnectionUtils } from '@/features/connections/lib/utils';
-import PieceIconWithPieceName from '@/features/pieces/components/piece-icon-from-name';
-import { piecesHooks } from '@/features/pieces/lib/pieces-hooks';
+ appConnectionUtils,
+} from '@/features/connections';
+import { PieceIconWithPieceName, piecesHooks } from '@/features/pieces';
import { useAuthorization } from '@/hooks/authorization-hooks';
import { ownerColumnHooks } from '@/hooks/owner-column-hooks';
import { userHooks } from '@/hooks/user-hooks';
import { authenticationSession } from '@/lib/authentication-session';
-import { formatUtils } from '@/lib/utils';
+import { formatUtils } from '@/lib/format-utils';
function AppConnectionsPage() {
const navigate = useNavigate();
diff --git a/packages/web/src/app/routes/embed/embedded-connection-dialog.tsx b/packages/web/src/app/routes/embed/embedded-connection-dialog.tsx
index 70502da545d..a63867544c4 100644
--- a/packages/web/src/app/routes/embed/embedded-connection-dialog.tsx
+++ b/packages/web/src/app/routes/embed/embedded-connection-dialog.tsx
@@ -14,12 +14,13 @@ import {
import { useEffect, useRef, useState } from 'react';
import { memoryRouter } from '@/app/guards';
+import { LoadingSpinner } from '@/components/custom/spinner';
import { Dialog, DialogContent } from '@/components/ui/dialog';
-import { LoadingSpinner } from '@/components/ui/spinner';
-import { oauthAppsQueries } from '@/features/connections/lib/oauth-apps-hooks';
-import { cn, parentWindow } from '@/lib/utils';
+import { oauthAppsQueries } from '@/features/connections';
+import { piecesHooks } from '@/features/pieces';
+import { parentWindow } from '@/lib/dom-utils';
+import { cn } from '@/lib/utils';
-import { piecesHooks } from '../../../features/pieces/lib/pieces-hooks';
import { CreateOrEditConnectionDialogContent } from '../../connections/create-edit-connection-dialog';
const extractIdFromQueryParams = () => {
diff --git a/packages/web/src/app/routes/embed/index.tsx b/packages/web/src/app/routes/embed/index.tsx
index 535beb09046..45868ff9ebf 100644
--- a/packages/web/src/app/routes/embed/index.tsx
+++ b/packages/web/src/app/routes/embed/index.tsx
@@ -15,18 +15,17 @@ import { useTranslation } from 'react-i18next';
import { useEffectOnce } from 'react-use';
import { memoryRouter } from '@/app/guards';
-import { useEmbedding } from '@/components/embed-provider';
-import { useTheme } from '@/components/theme-provider';
-import { LoadingScreen } from '@/components/ui/loading-screen';
+import { LoadingScreen } from '@/components/custom/loading-screen';
+import { useEmbedding } from '@/components/providers/embed-provider';
+import { useTheme } from '@/components/providers/theme-provider';
+import { managedAuthApi } from '@/features/authentication';
import { useAuthorization } from '@/hooks/authorization-hooks';
import { authenticationSession } from '@/lib/authentication-session';
-import { managedAuthApi } from '@/lib/managed-auth-api';
+import { combinePaths, parentWindow } from '@/lib/dom-utils';
import {
- combinePaths,
determineDefaultRoute,
- parentWindow,
routesThatRequireProjectId,
-} from '@/lib/utils';
+} from '@/lib/route-utils';
const notifyVendorPostAuthentication = () => {
const authenticationSuccessEvent: ActivepiecesClientAuthenticationSuccess = {
diff --git a/packages/web/src/app/routes/flows/flows-table/columns.tsx b/packages/web/src/app/routes/flows/flows-table/columns.tsx
index 253b6efd71d..c5d85458668 100644
--- a/packages/web/src/app/routes/flows/flows-table/columns.tsx
+++ b/packages/web/src/app/routes/flows/flows-table/columns.tsx
@@ -5,13 +5,13 @@ import { EllipsisVertical, Tag, Blocks, Clock, ToggleLeft } from 'lucide-react';
import { Dispatch, SetStateAction } from 'react';
import FlowActionMenu from '@/app/components/flow-actions-menu';
+import { RowDataWithActions } from '@/components/custom/data-table';
+import { DataTableColumnHeader } from '@/components/custom/data-table/data-table-column-header';
+import { TruncatedColumnTextValue } from '@/components/custom/data-table/truncated-column-text-value';
+import { FormattedDate } from '@/components/custom/formatted-date';
import { Button } from '@/components/ui/button';
-import { RowDataWithActions } from '@/components/ui/data-table';
-import { DataTableColumnHeader } from '@/components/ui/data-table/data-table-column-header';
-import { TruncatedColumnTextValue } from '@/components/ui/data-table/truncated-column-text-value';
-import { FormattedDate } from '@/components/ui/formatted-date';
-import { FlowStatusToggle } from '@/features/flows/components/flow-status-toggle';
-import { PieceIconList } from '@/features/pieces/components/piece-icon-list';
+import { FlowStatusToggle } from '@/features/flows';
+import { PieceIconList } from '@/features/pieces';
type FlowsTableColumnsProps = {
refetch: () => void;
diff --git a/packages/web/src/app/routes/flows/flows-table/index.tsx b/packages/web/src/app/routes/flows/flows-table/index.tsx
index d75439d88d2..a2ca23d1d97 100644
--- a/packages/web/src/app/routes/flows/flows-table/index.tsx
+++ b/packages/web/src/app/routes/flows/flows-table/index.tsx
@@ -9,20 +9,16 @@ import { CheckIcon, Link2, Workflow } from 'lucide-react';
import { useState } from 'react';
import { useNavigate, useSearchParams } from 'react-router-dom';
-import { useEmbedding } from '@/components/embed-provider';
-import { DataTable, DataTableFilters } from '@/components/ui/data-table';
-import { appConnectionsQueries } from '@/features/connections/lib/app-connections-hooks';
-import { flowsApi } from '@/features/flows/lib/flows-api';
-import { useFlowsBulkActions } from '@/features/flows/lib/use-flows-bulk-actions';
-import {
- FolderFilterList,
- folderIdParamName,
-} from '@/features/folders/component/folder-filter-list';
-import { piecesHooks } from '@/features/pieces/lib/pieces-hooks';
+import { DataTable, DataTableFilters } from '@/components/custom/data-table';
+import { useEmbedding } from '@/components/providers/embed-provider';
+import { appConnectionsQueries } from '@/features/connections';
+import { flowsApi, useFlowsBulkActions } from '@/features/flows';
+import { FolderFilterList, folderIdParamName } from '@/features/folders';
+import { piecesHooks } from '@/features/pieces';
import { ownerColumnHooks } from '@/hooks/owner-column-hooks';
import { authenticationSession } from '@/lib/authentication-session';
+import { formatUtils } from '@/lib/format-utils';
import { useNewWindow } from '@/lib/navigation-utils';
-import { formatUtils } from '@/lib/utils';
import { flowsTableColumns } from './columns';
diff --git a/packages/web/src/app/routes/flows/id/index.tsx b/packages/web/src/app/routes/flows/id/index.tsx
index 2c732a5cb6c..663c765d170 100644
--- a/packages/web/src/app/routes/flows/id/index.tsx
+++ b/packages/web/src/app/routes/flows/id/index.tsx
@@ -7,10 +7,9 @@ import { Link, useParams } from 'react-router-dom';
import { BuilderPage } from '@/app/builder';
import { BuilderStateProvider } from '@/app/builder/state/builder-state-provider';
+import { LoadingSpinner } from '@/components/custom/spinner';
import { buttonVariants } from '@/components/ui/button';
-import { LoadingSpinner } from '@/components/ui/spinner';
-import { flowsApi } from '@/features/flows/lib/flows-api';
-import { sampleDataHooks } from '@/features/flows/lib/sample-data-hooks';
+import { flowsApi, sampleDataHooks } from '@/features/flows';
import { authenticationSession } from '@/lib/authentication-session';
import { cn } from '@/lib/utils';
diff --git a/packages/web/src/app/routes/forget-password/index.tsx b/packages/web/src/app/routes/forget-password/index.tsx
index 8738b219dcd..58aaa4a69ef 100644
--- a/packages/web/src/app/routes/forget-password/index.tsx
+++ b/packages/web/src/app/routes/forget-password/index.tsx
@@ -1,5 +1,5 @@
-import { FullLogo } from '@/components/ui/full-logo';
-import { ResetPasswordForm } from '@/features/authentication/components/reset-password-form';
+import { FullLogo } from '@/components/custom/full-logo';
+import { ResetPasswordForm } from '@/features/authentication';
const ResetPasswordPage = () => {
return (
diff --git a/packages/web/src/app/routes/forms/index.tsx b/packages/web/src/app/routes/forms/index.tsx
index 5cdee7f70c0..d96fc5eafef 100644
--- a/packages/web/src/app/routes/forms/index.tsx
+++ b/packages/web/src/app/routes/forms/index.tsx
@@ -7,9 +7,8 @@ import { useQuery } from '@tanstack/react-query';
import { useParams } from 'react-router-dom';
import { useSearchParam } from 'react-use';
-import { LoadingScreen } from '@/components/ui/loading-screen';
-import { ApForm } from '@/features/forms/components/ap-form';
-import { humanInputApi } from '@/features/forms/lib/human-input-api';
+import { LoadingScreen } from '@/components/custom/loading-screen';
+import { humanInputApi, ApForm } from '@/features/forms';
import NotFoundPage from '../404-page';
diff --git a/packages/web/src/app/routes/impact/details/edit-time-saved-popover.tsx b/packages/web/src/app/routes/impact/details/edit-time-saved-popover.tsx
index 45df08b0243..947446cf539 100644
--- a/packages/web/src/app/routes/impact/details/edit-time-saved-popover.tsx
+++ b/packages/web/src/app/routes/impact/details/edit-time-saved-popover.tsx
@@ -10,9 +10,11 @@ import {
PopoverContent,
PopoverTrigger,
} from '@/components/ui/popover';
-import { flowsApi } from '@/features/flows/lib/flows-api';
-import { analyticsApi } from '@/features/platform-admin/lib/analytics-api';
-import { RefreshAnalyticsContext } from '@/features/platform-admin/lib/refresh-analytics-context';
+import { flowsApi } from '@/features/flows';
+import {
+ analyticsApi,
+ RefreshAnalyticsContext,
+} from '@/features/platform-admin';
import { hmsToSeconds, secondsToHMS } from '../lib/impact-utils';
diff --git a/packages/web/src/app/routes/impact/details/flow-details-header.tsx b/packages/web/src/app/routes/impact/details/flow-details-header.tsx
index 8bf2b03cd5f..5ad4877c065 100644
--- a/packages/web/src/app/routes/impact/details/flow-details-header.tsx
+++ b/packages/web/src/app/routes/impact/details/flow-details-header.tsx
@@ -3,7 +3,7 @@ import { t } from 'i18next';
import { Download } from 'lucide-react';
import { Button } from '@/components/ui/button';
-import { downloadFile } from '@/lib/utils';
+import { downloadFile } from '@/lib/dom-utils';
type FlowDetailsHeaderProps = {
report?: PlatformAnalyticsReport;
diff --git a/packages/web/src/app/routes/impact/details/index.tsx b/packages/web/src/app/routes/impact/details/index.tsx
index 31a6ab3cb02..04eb94d4e38 100644
--- a/packages/web/src/app/routes/impact/details/index.tsx
+++ b/packages/web/src/app/routes/impact/details/index.tsx
@@ -22,11 +22,11 @@ import {
import { useMemo } from 'react';
import { ApAvatar } from '@/components/custom/ap-avatar';
+import { DataTable, RowDataWithActions } from '@/components/custom/data-table';
+import { DataTableColumnHeader } from '@/components/custom/data-table/data-table-column-header';
import { Avatar } from '@/components/ui/avatar';
import { Button } from '@/components/ui/button';
import { Checkbox } from '@/components/ui/checkbox';
-import { DataTable, RowDataWithActions } from '@/components/ui/data-table';
-import { DataTableColumnHeader } from '@/components/ui/data-table/data-table-column-header';
import { Input } from '@/components/ui/input';
import {
Popover,
@@ -40,7 +40,7 @@ import {
TooltipTrigger,
} from '@/components/ui/tooltip';
import { userHooks } from '@/hooks/user-hooks';
-import { formatUtils } from '@/lib/utils';
+import { formatUtils } from '@/lib/format-utils';
import { TimeSavedFilterContent } from '../components/time-saved-filter-content';
import { exportFlowDetailsCsv } from '../lib/impact-utils';
diff --git a/packages/web/src/app/routes/impact/index.tsx b/packages/web/src/app/routes/impact/index.tsx
index c080493fb79..40c2d18effb 100644
--- a/packages/web/src/app/routes/impact/index.tsx
+++ b/packages/web/src/app/routes/impact/index.tsx
@@ -23,9 +23,11 @@ import {
TooltipContent,
TooltipTrigger,
} from '@/components/ui/tooltip';
-import { platformAnalyticsHooks } from '@/features/platform-admin/lib/analytics-hooks';
-import { RefreshAnalyticsContext } from '@/features/platform-admin/lib/refresh-analytics-context';
-import { projectCollectionUtils } from '@/hooks/project-collection';
+import {
+ platformAnalyticsHooks,
+ RefreshAnalyticsContext,
+} from '@/features/platform-admin';
+import { projectCollectionUtils } from '@/features/projects';
import { ProjectSelect } from './components/project-select';
import { FlowsDetails } from './details';
diff --git a/packages/web/src/app/routes/impact/lib/impact-utils.ts b/packages/web/src/app/routes/impact/lib/impact-utils.ts
index 60e6680e468..34a4bd9b3a5 100644
--- a/packages/web/src/app/routes/impact/lib/impact-utils.ts
+++ b/packages/web/src/app/routes/impact/lib/impact-utils.ts
@@ -1,6 +1,6 @@
import { toPng } from 'html-to-image';
-import { downloadFile } from '@/lib/utils';
+import { downloadFile } from '@/lib/dom-utils';
export type TimeUnit = 'Sec' | 'Min' | 'Hrs';
diff --git a/packages/web/src/app/routes/impact/lib/use-flow-details-data.ts b/packages/web/src/app/routes/impact/lib/use-flow-details-data.ts
index d667b2bb450..a6b6d8081e5 100644
--- a/packages/web/src/app/routes/impact/lib/use-flow-details-data.ts
+++ b/packages/web/src/app/routes/impact/lib/use-flow-details-data.ts
@@ -1,7 +1,7 @@
import { PlatformAnalyticsReport } from '@activepieces/shared';
import { useContext, useMemo } from 'react';
-import { RefreshAnalyticsContext } from '@/features/platform-admin/lib/refresh-analytics-context';
+import { RefreshAnalyticsContext } from '@/features/platform-admin';
export type FlowDetailRow = PlatformAnalyticsReport['flows'][number] & {
id: string;
diff --git a/packages/web/src/app/routes/impact/summary/time-saved-metric.tsx b/packages/web/src/app/routes/impact/summary/time-saved-metric.tsx
index 45bb325ba45..11ecc684f5e 100644
--- a/packages/web/src/app/routes/impact/summary/time-saved-metric.tsx
+++ b/packages/web/src/app/routes/impact/summary/time-saved-metric.tsx
@@ -2,7 +2,7 @@ import { PlatformAnalyticsReport } from '@activepieces/shared';
import { t } from 'i18next';
import { Clock } from 'lucide-react';
-import { formatUtils } from '@/lib/utils';
+import { formatUtils } from '@/lib/format-utils';
import { MetricCard, MetricCardSkeleton } from './metric-card';
diff --git a/packages/web/src/app/routes/impact/trends/time-saved-chart.tsx b/packages/web/src/app/routes/impact/trends/time-saved-chart.tsx
index ad5c480d3f6..449a0fcf822 100644
--- a/packages/web/src/app/routes/impact/trends/time-saved-chart.tsx
+++ b/packages/web/src/app/routes/impact/trends/time-saved-chart.tsx
@@ -2,7 +2,7 @@ import { PlatformAnalyticsReport } from '@activepieces/shared';
import { t } from 'i18next';
import { Clock } from 'lucide-react';
-import { formatUtils } from '@/lib/utils';
+import { formatUtils } from '@/lib/format-utils';
import { AnalyticsAreaChart } from './analytics-area-chart';
diff --git a/packages/web/src/app/routes/leaderboard/index.tsx b/packages/web/src/app/routes/leaderboard/index.tsx
index 9135d6995b8..c738f044219 100644
--- a/packages/web/src/app/routes/leaderboard/index.tsx
+++ b/packages/web/src/app/routes/leaderboard/index.tsx
@@ -20,14 +20,15 @@ import {
import { useContext, useMemo, useState } from 'react';
import { toast } from 'sonner';
+import { userApi } from '@/api/user-api';
import { ApSidebarToggle } from '@/components/custom/ap-sidebar-toggle';
+import { SearchInput } from '@/components/custom/search-input';
import { Button } from '@/components/ui/button';
import {
Popover,
PopoverContent,
PopoverTrigger,
} from '@/components/ui/popover';
-import { SearchInput } from '@/components/ui/search-input';
import {
Select,
SelectContent,
@@ -42,14 +43,14 @@ import {
TooltipContent,
TooltipTrigger,
} from '@/components/ui/tooltip';
-import { platformAnalyticsHooks } from '@/features/platform-admin/lib/analytics-hooks';
import {
+ platformAnalyticsHooks,
RefreshAnalyticsContext,
RefreshAnalyticsProvider,
-} from '@/features/platform-admin/lib/refresh-analytics-context';
-import { projectCollectionUtils } from '@/hooks/project-collection';
-import { userApi } from '@/lib/user-api';
-import { downloadFile, formatUtils } from '@/lib/utils';
+} from '@/features/platform-admin';
+import { projectCollectionUtils } from '@/features/projects';
+import { downloadFile } from '@/lib/dom-utils';
+import { formatUtils } from '@/lib/format-utils';
import { TimeSavedFilterContent } from '../impact/components/time-saved-filter-content';
import {
diff --git a/packages/web/src/app/routes/leaderboard/projects-leaderboard.tsx b/packages/web/src/app/routes/leaderboard/projects-leaderboard.tsx
index d16053874c6..9aa3a2ba31e 100644
--- a/packages/web/src/app/routes/leaderboard/projects-leaderboard.tsx
+++ b/packages/web/src/app/routes/leaderboard/projects-leaderboard.tsx
@@ -4,10 +4,10 @@ import { t } from 'i18next';
import { Rocket } from 'lucide-react';
import { useMemo } from 'react';
+import { DataTable, RowDataWithActions } from '@/components/custom/data-table';
+import { DataTableColumnHeader } from '@/components/custom/data-table/data-table-column-header';
import { Avatar } from '@/components/ui/avatar';
-import { DataTable, RowDataWithActions } from '@/components/ui/data-table';
-import { DataTableColumnHeader } from '@/components/ui/data-table/data-table-column-header';
-import { formatUtils } from '@/lib/utils';
+import { formatUtils } from '@/lib/format-utils';
import { FirstIcon } from './icons/1st-icon';
import { SecondIcon } from './icons/2nd-icon';
diff --git a/packages/web/src/app/routes/leaderboard/users-leaderboard.tsx b/packages/web/src/app/routes/leaderboard/users-leaderboard.tsx
index 21f3405d1e8..82ad5a430fc 100644
--- a/packages/web/src/app/routes/leaderboard/users-leaderboard.tsx
+++ b/packages/web/src/app/routes/leaderboard/users-leaderboard.tsx
@@ -5,14 +5,15 @@ import { Trophy } from 'lucide-react';
import { useMemo } from 'react';
import { ApAvatar } from '@/components/custom/ap-avatar';
-import { DataTable, RowDataWithActions } from '@/components/ui/data-table';
-import { DataTableColumnHeader } from '@/components/ui/data-table/data-table-column-header';
+import { DataTable, RowDataWithActions } from '@/components/custom/data-table';
+import { DataTableColumnHeader } from '@/components/custom/data-table/data-table-column-header';
import {
Tooltip,
TooltipContent,
TooltipTrigger,
} from '@/components/ui/tooltip';
-import { cn, formatUtils } from '@/lib/utils';
+import { formatUtils } from '@/lib/format-utils';
+import { cn } from '@/lib/utils';
import { RankCell } from './projects-leaderboard';
diff --git a/packages/web/src/app/routes/platform-routes.tsx b/packages/web/src/app/routes/platform-routes.tsx
new file mode 100644
index 00000000000..7dcfafc17b0
--- /dev/null
+++ b/packages/web/src/app/routes/platform-routes.tsx
@@ -0,0 +1,365 @@
+import React, { Suspense } from 'react';
+import { Navigate } from 'react-router-dom';
+
+import { PageTitle } from '@/app/components/page-title';
+import { LoadingScreen } from '@/components/custom/loading-screen';
+import { Error, Success } from '@/features/billing';
+
+import { PlatformLayout } from '../components/platform-layout';
+
+const SettingsBilling = React.lazy(() => import('./platform/billing'));
+const EventDestinationsPage = React.lazy(
+ () => import('./platform/infra/event-destinations'),
+);
+const SettingsHealthPage = React.lazy(() => import('./platform/infra/health'));
+const TriggerHealthPage = React.lazy(() => import('./platform/infra/triggers'));
+const SettingsWorkersPage = React.lazy(
+ () => import('./platform/infra/workers'),
+);
+const ProjectsPage = React.lazy(() => import('./platform/projects'));
+const ApiKeysPage = React.lazy(() =>
+ import('./platform/security/api-keys').then((m) => ({
+ default: m.ApiKeysPage,
+ })),
+);
+const AuditLogsPage = React.lazy(
+ () => import('./platform/security/audit-logs'),
+);
+const ProjectRolePage = React.lazy(() =>
+ import('./platform/security/project-role').then((m) => ({
+ default: m.ProjectRolePage,
+ })),
+);
+const ProjectRoleUsersTable = React.lazy(() =>
+ import('./platform/security/project-role/project-role-users-table').then(
+ (m) => ({ default: m.ProjectRoleUsersTable }),
+ ),
+);
+const SecretManagersPage = React.lazy(
+ () => import('./platform/security/secret-managers'),
+);
+const SigningKeysPage = React.lazy(() =>
+ import('./platform/security/signing-keys').then((m) => ({
+ default: m.SigningKeysPage,
+ })),
+);
+const SSOPage = React.lazy(() =>
+ import('./platform/security/sso').then((m) => ({ default: m.SSOPage })),
+);
+const AIProvidersPage = React.lazy(() => import('./platform/setup/ai'));
+const BrandingPage = React.lazy(() =>
+ import('./platform/setup/branding').then((m) => ({
+ default: m.BrandingPage,
+ })),
+);
+const GlobalConnectionsTable = React.lazy(() =>
+ import('./platform/setup/connections').then((m) => ({
+ default: m.GlobalConnectionsTable,
+ })),
+);
+const PlatformPiecesPage = React.lazy(() =>
+ import('./platform/setup/pieces').then((m) => ({
+ default: m.PlatformPiecesPage,
+ })),
+);
+const PlatformTemplatesPage = React.lazy(() =>
+ import('./platform/setup/templates').then((m) => ({
+ default: m.PlatformTemplatesPage,
+ })),
+);
+const UsersPage = React.lazy(() => import('./platform/users'));
+
+function SuspenseWrapper({ children }: { children: React.ReactNode }) {
+ return }>{children};
+}
+
+export const platformRoutes = [
+ {
+ path: '/platform',
+ element: (
+
+
+
+
+
+ ),
+ },
+ {
+ path: '/platform/projects',
+ element: (
+
+
+
+
+
+
+
+ ),
+ },
+ {
+ path: '/platform/users',
+ element: (
+
+
+
+
+
+
+
+ ),
+ },
+ {
+ path: '/platform/setup',
+ element: (
+
+
+
+
+
+ ),
+ },
+ {
+ path: '/platform/setup/ai',
+ element: (
+
+
+
+
+
+
+
+ ),
+ },
+ {
+ path: '/platform/setup/pieces',
+ element: (
+
+
+
+
+
+
+
+ ),
+ },
+ {
+ path: '/platform/setup/connections',
+ element: (
+
+
+
+
+
+
+
+ ),
+ },
+ {
+ path: '/platform/setup/templates',
+ element: (
+
+
+
+
+
+
+
+ ),
+ },
+ {
+ path: '/platform/setup/branding',
+ element: (
+
+
+
+
+
+
+
+ ),
+ },
+ {
+ path: '/platform/setup/billing',
+ element: (
+
+
+
+
+
+
+
+ ),
+ },
+ {
+ path: '/platform/setup/billing/success',
+ element: (
+
+
+
+
+
+ ),
+ },
+ {
+ path: '/platform/setup/billing/error',
+ element: (
+
+
+
+
+
+ ),
+ },
+ {
+ path: '/platform/security',
+ element: (
+
+
+
+
+
+ ),
+ },
+ {
+ path: '/platform/security/api-keys',
+ element: (
+
+
+
+
+
+
+
+ ),
+ },
+ {
+ path: '/platform/security/secret-managers',
+ element: (
+
+
+
+
+
+
+
+ ),
+ },
+ {
+ path: '/platform/security/audit-logs',
+ element: (
+
+
+
+
+
+
+
+ ),
+ },
+ {
+ path: '/platform/security/signing-keys',
+ element: (
+
+
+
+
+
+
+
+ ),
+ },
+ {
+ path: '/platform/security/sso',
+ element: (
+
+
+
+
+
+
+
+ ),
+ },
+ {
+ path: '/platform/security/project-roles',
+ element: (
+
+
+
+
+
+
+
+ ),
+ },
+ {
+ path: '/platform/security/project-roles/:projectRoleId',
+ element: (
+
+
+
+
+
+
+
+ ),
+ },
+ {
+ path: '/platform/infrastructure',
+ element: (
+
+
+
+
+
+ ),
+ },
+ {
+ path: '/platform/infrastructure/workers',
+ element: (
+
+
+
+
+
+
+
+ ),
+ },
+ {
+ path: '/platform/infrastructure/health',
+ element: (
+
+
+
+
+
+
+
+ ),
+ },
+ {
+ path: '/platform/infrastructure/triggers',
+ element: (
+
+
+
+
+
+
+
+ ),
+ },
+ {
+ path: '/platform/infrastructure/event-destinations',
+ element: (
+
+
+
+
+
+
+
+ ),
+ },
+];
diff --git a/packages/web/src/app/routes/platform/billing/index.tsx b/packages/web/src/app/routes/platform/billing/index.tsx
index 1b9c15840c2..af758844ad7 100644
--- a/packages/web/src/app/routes/platform/billing/index.tsx
+++ b/packages/web/src/app/routes/platform/billing/index.tsx
@@ -10,18 +10,18 @@ import { Wand } from 'lucide-react';
import { DashboardPageHeader } from '@/app/components/dashboard-page-header';
import LockedFeatureGuard from '@/app/components/locked-feature-guard';
+import { LoadingSpinner } from '@/components/custom/spinner';
import { Button } from '@/components/ui/button';
import { Card, CardContent, CardHeader } from '@/components/ui/card';
-import { LoadingSpinner } from '@/components/ui/spinner';
-import { ActiveFlowAddon } from '@/features/billing/components/active-flows-addon';
-import { AICreditUsage } from '@/features/billing/components/ai-credits/ai-credit-usage';
-import { FeatureStatus } from '@/features/billing/components/features-status';
-import { LicenseKey } from '@/features/billing/components/license-key';
-import { SubscriptionInfo } from '@/features/billing/components/subscription-info';
import {
+ ActiveFlowAddon,
+ AICreditUsage,
+ FeatureStatus,
+ LicenseKey,
+ SubscriptionInfo,
billingMutations,
billingQueries,
-} from '@/features/billing/lib/billing-hooks';
+} from '@/features/billing';
import { flagsHooks } from '@/hooks/flags-hooks';
import { platformHooks } from '@/hooks/platform-hooks';
diff --git a/packages/web/src/app/routes/platform/infra/event-destinations/components/event-destination-actions.tsx b/packages/web/src/app/routes/platform/infra/event-destinations/components/event-destination-actions.tsx
index f1eb17009a0..f912b5c1242 100644
--- a/packages/web/src/app/routes/platform/infra/event-destinations/components/event-destination-actions.tsx
+++ b/packages/web/src/app/routes/platform/infra/event-destinations/components/event-destination-actions.tsx
@@ -3,7 +3,7 @@ import { t } from 'i18next';
import { MoreVertical, Pencil, Trash } from 'lucide-react';
import { useState } from 'react';
-import { ConfirmationDeleteDialog } from '@/components/delete-dialog';
+import { ConfirmationDeleteDialog } from '@/components/custom/delete-dialog';
import { Button } from '@/components/ui/button';
import {
DropdownMenu,
diff --git a/packages/web/src/app/routes/platform/infra/event-destinations/components/event-destinations-table.tsx b/packages/web/src/app/routes/platform/infra/event-destinations/components/event-destinations-table.tsx
index 2aebd669aa3..d39340f4687 100644
--- a/packages/web/src/app/routes/platform/infra/event-destinations/components/event-destinations-table.tsx
+++ b/packages/web/src/app/routes/platform/infra/event-destinations/components/event-destinations-table.tsx
@@ -3,10 +3,10 @@ import { ColumnDef } from '@tanstack/react-table';
import { t } from 'i18next';
import { Globe } from 'lucide-react';
+import { DataTable, RowDataWithActions } from '@/components/custom/data-table';
+import { DataTableColumnHeader } from '@/components/custom/data-table/data-table-column-header';
import { Badge } from '@/components/ui/badge';
-import { DataTable, RowDataWithActions } from '@/components/ui/data-table';
-import { DataTableColumnHeader } from '@/components/ui/data-table/data-table-column-header';
-import { formatUtils } from '@/lib/utils';
+import { formatUtils } from '@/lib/format-utils';
import EventDestinationActions from './event-destination-actions';
diff --git a/packages/web/src/app/routes/platform/infra/health/check-item.tsx b/packages/web/src/app/routes/platform/infra/health/check-item.tsx
index 7b76a401762..4177eca0b62 100644
--- a/packages/web/src/app/routes/platform/infra/health/check-item.tsx
+++ b/packages/web/src/app/routes/platform/infra/health/check-item.tsx
@@ -8,8 +8,8 @@ import {
ItemTitle,
ItemDescription,
ItemActions,
-} from '@/components/ui/item';
-import { LoadingSpinner } from '@/components/ui/spinner';
+} from '@/components/custom/item';
+import { LoadingSpinner } from '@/components/custom/spinner';
type CheckItemProps = {
id: string;
diff --git a/packages/web/src/app/routes/platform/infra/health/index.tsx b/packages/web/src/app/routes/platform/infra/health/index.tsx
index 88398226752..69c77fcadc9 100644
--- a/packages/web/src/app/routes/platform/infra/health/index.tsx
+++ b/packages/web/src/app/routes/platform/infra/health/index.tsx
@@ -5,9 +5,9 @@ import { Cpu, HardDrive, MemoryStick, Package } from 'lucide-react';
import React from 'react';
import semver from 'semver';
+import { healthApi } from '@/api/health-api';
import { DashboardPageHeader } from '@/app/components/dashboard-page-header';
import { flagsHooks } from '@/hooks/flags-hooks';
-import { healthApi } from '@/lib/health-api';
import { CheckItem } from './check-item';
diff --git a/packages/web/src/app/routes/platform/infra/triggers/index.tsx b/packages/web/src/app/routes/platform/infra/triggers/index.tsx
index 17967886062..a64f1811924 100644
--- a/packages/web/src/app/routes/platform/infra/triggers/index.tsx
+++ b/packages/web/src/app/routes/platform/infra/triggers/index.tsx
@@ -13,16 +13,15 @@ import {
} from 'lucide-react';
import { DashboardPageHeader } from '@/app/components/dashboard-page-header';
-import { DataTable } from '@/components/ui/data-table';
-import { DataTableColumnHeader } from '@/components/ui/data-table/data-table-column-header';
+import { DataTable } from '@/components/custom/data-table';
+import { DataTableColumnHeader } from '@/components/custom/data-table/data-table-column-header';
import {
Tooltip,
TooltipTrigger,
TooltipContent,
} from '@/components/ui/tooltip';
-import { triggerRunHooks } from '@/features/flows/lib/trigger-run-api';
-import PieceDisplayName from '@/features/pieces/components/piece-display-name';
-import PieceIconWithPieceName from '@/features/pieces/components/piece-icon-from-name';
+import { triggerRunHooks } from '@/features/flows';
+import { PieceDisplayName, PieceIconWithPieceName } from '@/features/pieces';
import { cn } from '@/lib/utils';
import { StatusProgressBar, type DayStatus } from './status-progress-bar';
diff --git a/packages/web/src/app/routes/platform/infra/workers/index.tsx b/packages/web/src/app/routes/platform/infra/workers/index.tsx
index 813cf0fb995..592d5009606 100644
--- a/packages/web/src/app/routes/platform/infra/workers/index.tsx
+++ b/packages/web/src/app/routes/platform/infra/workers/index.tsx
@@ -23,12 +23,13 @@ import {
import { DashboardPageHeader } from '@/app/components/dashboard-page-header';
import { CircularIcon } from '@/components/custom/circular-icon';
+import { DataTable } from '@/components/custom/data-table';
+import { DataTableColumnHeader } from '@/components/custom/data-table/data-table-column-header';
import { Alert, AlertDescription } from '@/components/ui/alert';
-import { DataTable } from '@/components/ui/data-table';
-import { DataTableColumnHeader } from '@/components/ui/data-table/data-table-column-header';
-import { workersApi } from '@/features/platform-admin/lib/workers-api';
+import { workersApi } from '@/features/platform-admin';
import { flagsHooks } from '@/hooks/flags-hooks';
-import { cn, useTimeAgo } from '@/lib/utils';
+import { useTimeAgo } from '@/hooks/use-time-ago';
+import { cn } from '@/lib/utils';
import { WorkerConfigsModal } from './worker-configs-dialog';
diff --git a/packages/web/src/app/routes/platform/projects/columns.tsx b/packages/web/src/app/routes/platform/projects/columns.tsx
index 21397738f0f..e1cb88134ef 100644
--- a/packages/web/src/app/routes/platform/projects/columns.tsx
+++ b/packages/web/src/app/routes/platform/projects/columns.tsx
@@ -18,9 +18,9 @@ import {
Link2,
} from 'lucide-react';
-import { RowDataWithActions } from '@/components/ui/data-table';
-import { DataTableColumnHeader } from '@/components/ui/data-table/data-table-column-header';
-import { FormattedDate } from '@/components/ui/formatted-date';
+import { RowDataWithActions } from '@/components/custom/data-table';
+import { DataTableColumnHeader } from '@/components/custom/data-table/data-table-column-header';
+import { FormattedDate } from '@/components/custom/formatted-date';
type ProjectsTableColumnsProps = {
platform: PlatformWithoutSensitiveData;
diff --git a/packages/web/src/app/routes/platform/projects/index.tsx b/packages/web/src/app/routes/platform/projects/index.tsx
index d2b6f1368da..299d231fab4 100644
--- a/packages/web/src/app/routes/platform/projects/index.tsx
+++ b/packages/web/src/app/routes/platform/projects/index.tsx
@@ -12,24 +12,24 @@ import { toast } from 'sonner';
import { DashboardPageHeader } from '@/app/components/dashboard-page-header';
import LockedFeatureGuard from '@/app/components/locked-feature-guard';
-import { ConfirmationDeleteDialog } from '@/components/delete-dialog';
-import { Button } from '@/components/ui/button';
-import { Checkbox } from '@/components/ui/checkbox';
import {
DataTable,
RowDataWithActions,
BulkAction,
-} from '@/components/ui/data-table';
+} from '@/components/custom/data-table';
+import { ConfirmationDeleteDialog } from '@/components/custom/delete-dialog';
+import { Button } from '@/components/ui/button';
+import { Checkbox } from '@/components/ui/checkbox';
import {
Tooltip,
TooltipContent,
TooltipTrigger,
} from '@/components/ui/tooltip';
-import { globalConnectionsQueries } from '@/features/connections/lib/global-connections-hooks';
-import { EditProjectDialog } from '@/features/projects/components/edit-project-dialog';
+import { globalConnectionsQueries } from '@/features/connections';
+import { EditProjectDialog, projectCollectionUtils } from '@/features/projects';
import { platformHooks } from '@/hooks/platform-hooks';
-import { projectCollectionUtils } from '@/hooks/project-collection';
-import { formatUtils, validationUtils } from '@/lib/utils';
+import { formatUtils } from '@/lib/format-utils';
+import { validationUtils } from '@/lib/validation-utils';
import { projectsTableColumns } from './columns';
import { NewProjectDialog } from './new-project-dialog';
diff --git a/packages/web/src/app/routes/platform/projects/new-project-dialog.tsx b/packages/web/src/app/routes/platform/projects/new-project-dialog.tsx
index e0026f2c6e4..5036faef094 100644
--- a/packages/web/src/app/routes/platform/projects/new-project-dialog.tsx
+++ b/packages/web/src/app/routes/platform/projects/new-project-dialog.tsx
@@ -26,9 +26,9 @@ import { Input } from '@/components/ui/input';
import { Label } from '@/components/ui/label';
import { SkeletonList } from '@/components/ui/skeleton';
import { internalErrorToast } from '@/components/ui/sonner';
-import { globalConnectionsQueries } from '@/features/connections/lib/global-connections-hooks';
+import { globalConnectionsQueries } from '@/features/connections';
+import { projectCollectionUtils } from '@/features/projects';
import { platformHooks } from '@/hooks/platform-hooks';
-import { projectCollectionUtils } from '@/hooks/project-collection';
type NewProjectDialogProps = {
children: React.ReactNode;
diff --git a/packages/web/src/app/routes/platform/security/api-keys/index.tsx b/packages/web/src/app/routes/platform/security/api-keys/index.tsx
index ea00d523e9b..545a7d73c5a 100644
--- a/packages/web/src/app/routes/platform/security/api-keys/index.tsx
+++ b/packages/web/src/app/routes/platform/security/api-keys/index.tsx
@@ -7,13 +7,13 @@ import { Key, Plus, Trash, Hash, Tag, Clock } from 'lucide-react';
import { DashboardPageHeader } from '@/app/components/dashboard-page-header';
import LockedFeatureGuard from '@/app/components/locked-feature-guard';
import { NewApiKeyDialog } from '@/app/routes/platform/security/api-keys/new-api-key-dialog';
-import { ConfirmationDeleteDialog } from '@/components/delete-dialog';
+import { DataTable, RowDataWithActions } from '@/components/custom/data-table';
+import { DataTableColumnHeader } from '@/components/custom/data-table/data-table-column-header';
+import { ConfirmationDeleteDialog } from '@/components/custom/delete-dialog';
+import { FormattedDate } from '@/components/custom/formatted-date';
import { Button } from '@/components/ui/button';
-import { DataTable, RowDataWithActions } from '@/components/ui/data-table';
-import { DataTableColumnHeader } from '@/components/ui/data-table/data-table-column-header';
-import { FormattedDate } from '@/components/ui/formatted-date';
import { internalErrorToast } from '@/components/ui/sonner';
-import { apiKeyApi } from '@/features/platform-admin/lib/api-key-api';
+import { apiKeyApi } from '@/features/platform-admin';
import { platformHooks } from '@/hooks/platform-hooks';
const ApiKeysPage = () => {
diff --git a/packages/web/src/app/routes/platform/security/api-keys/new-api-key-dialog.tsx b/packages/web/src/app/routes/platform/security/api-keys/new-api-key-dialog.tsx
index 30a999b0229..88a9ab3a422 100644
--- a/packages/web/src/app/routes/platform/security/api-keys/new-api-key-dialog.tsx
+++ b/packages/web/src/app/routes/platform/security/api-keys/new-api-key-dialog.tsx
@@ -24,7 +24,7 @@ import {
FormMessage,
} from '@/components/ui/form';
import { Input } from '@/components/ui/input';
-import { apiKeyApi } from '@/features/platform-admin/lib/api-key-api';
+import { apiKeyApi } from '@/features/platform-admin';
type NewApiKeyDialogProps = {
children: React.ReactNode;
diff --git a/packages/web/src/app/routes/platform/security/audit-logs/index.tsx b/packages/web/src/app/routes/platform/security/audit-logs/index.tsx
index 816a8ffff33..e877748d945 100644
--- a/packages/web/src/app/routes/platform/security/audit-logs/index.tsx
+++ b/packages/web/src/app/routes/platform/security/audit-logs/index.tsx
@@ -30,19 +30,19 @@ import {
DataTable,
DataTableFilters,
LIMIT_QUERY_PARAM,
-} from '@/components/ui/data-table';
-import { DataTableColumnHeader } from '@/components/ui/data-table/data-table-column-header';
-import { FormattedDate } from '@/components/ui/formatted-date';
+} from '@/components/custom/data-table';
+import { DataTableColumnHeader } from '@/components/custom/data-table/data-table-column-header';
+import { FormattedDate } from '@/components/custom/formatted-date';
import {
Tooltip,
TooltipContent,
TooltipTrigger,
} from '@/components/ui/tooltip';
-import { auditEventsApi } from '@/features/platform-admin/lib/audit-events-api';
+import { auditEventsApi } from '@/features/platform-admin';
+import { projectCollectionUtils } from '@/features/projects';
import { platformHooks } from '@/hooks/platform-hooks';
import { platformUserHooks } from '@/hooks/platform-user-hooks';
-import { projectCollectionUtils } from '@/hooks/project-collection';
-import { formatUtils } from '@/lib/utils';
+import { formatUtils } from '@/lib/format-utils';
export default function AuditLogsPage() {
const { platform } = platformHooks.useCurrentPlatform();
diff --git a/packages/web/src/app/routes/platform/security/project-role/index.tsx b/packages/web/src/app/routes/platform/security/project-role/index.tsx
index 640cab9bf44..ddb0d0405f3 100644
--- a/packages/web/src/app/routes/platform/security/project-role/index.tsx
+++ b/packages/web/src/app/routes/platform/security/project-role/index.tsx
@@ -10,7 +10,7 @@ import {
TooltipContent,
TooltipTrigger,
} from '@/components/ui/tooltip';
-import { projectRoleApi } from '@/features/platform-admin/lib/project-role-api';
+import { projectRoleApi } from '@/features/platform-admin';
import { platformHooks } from '@/hooks/platform-hooks';
import { ProjectRoleDialog } from './project-role-dialog';
diff --git a/packages/web/src/app/routes/platform/security/project-role/project-role-dialog.tsx b/packages/web/src/app/routes/platform/security/project-role/project-role-dialog.tsx
index 60bed2a242c..8d4903cc6c0 100644
--- a/packages/web/src/app/routes/platform/security/project-role/project-role-dialog.tsx
+++ b/packages/web/src/app/routes/platform/security/project-role/project-role-dialog.tsx
@@ -13,7 +13,7 @@ import {
} from '@/components/ui/dialog';
import { Input } from '@/components/ui/input';
import { ScrollArea } from '@/components/ui/scroll-area';
-import { projectRoleApi } from '@/features/platform-admin/lib/project-role-api';
+import { projectRoleApi } from '@/features/platform-admin';
const initialPermissions = [
{
diff --git a/packages/web/src/app/routes/platform/security/project-role/project-role-users-table.tsx b/packages/web/src/app/routes/platform/security/project-role/project-role-users-table.tsx
index 9772245e114..60d8a253c10 100644
--- a/packages/web/src/app/routes/platform/security/project-role/project-role-users-table.tsx
+++ b/packages/web/src/app/routes/platform/security/project-role/project-role-users-table.tsx
@@ -11,6 +11,8 @@ import { useNavigate, useParams, useSearchParams } from 'react-router-dom';
import { DashboardPageHeader } from '@/app/components/dashboard-page-header';
import { LockedFeatureGuard } from '@/app/components/locked-feature-guard';
+import { DataTable, RowDataWithActions } from '@/components/custom/data-table';
+import { DataTableColumnHeader } from '@/components/custom/data-table/data-table-column-header';
import {
Breadcrumb,
BreadcrumbList,
@@ -19,9 +21,7 @@ import {
BreadcrumbPage,
BreadcrumbSeparator,
} from '@/components/ui/breadcrumb';
-import { DataTable, RowDataWithActions } from '@/components/ui/data-table';
-import { DataTableColumnHeader } from '@/components/ui/data-table/data-table-column-header';
-import { projectRoleApi } from '@/features/platform-admin/lib/project-role-api';
+import { projectRoleApi } from '@/features/platform-admin';
import { platformHooks } from '@/hooks/platform-hooks';
export const ProjectRoleUsersTable = () => {
diff --git a/packages/web/src/app/routes/platform/security/project-role/project-roles-table.tsx b/packages/web/src/app/routes/platform/security/project-role/project-roles-table.tsx
index 02f0607cd49..84d05f26bae 100644
--- a/packages/web/src/app/routes/platform/security/project-role/project-roles-table.tsx
+++ b/packages/web/src/app/routes/platform/security/project-role/project-roles-table.tsx
@@ -6,17 +6,17 @@ import { Eye, Pencil, Trash, Users, Tag, Clock } from 'lucide-react';
import { useNavigate } from 'react-router-dom';
import { toast } from 'sonner';
-import { ConfirmationDeleteDialog } from '@/components/delete-dialog';
+import { DataTable, RowDataWithActions } from '@/components/custom/data-table';
+import { DataTableColumnHeader } from '@/components/custom/data-table/data-table-column-header';
+import { ConfirmationDeleteDialog } from '@/components/custom/delete-dialog';
+import { FormattedDate } from '@/components/custom/formatted-date';
import { Button } from '@/components/ui/button';
-import { DataTable, RowDataWithActions } from '@/components/ui/data-table';
-import { DataTableColumnHeader } from '@/components/ui/data-table/data-table-column-header';
-import { FormattedDate } from '@/components/ui/formatted-date';
import {
Tooltip,
TooltipTrigger,
TooltipContent,
} from '@/components/ui/tooltip';
-import { projectRoleApi } from '@/features/platform-admin/lib/project-role-api';
+import { projectRoleApi } from '@/features/platform-admin';
import { platformHooks } from '@/hooks/platform-hooks';
import { ProjectRoleDialog } from './project-role-dialog';
diff --git a/packages/web/src/app/routes/platform/security/secret-managers/connect-secret-manager-dialog.tsx b/packages/web/src/app/routes/platform/security/secret-managers/connect-secret-manager-dialog.tsx
index b8631562a9f..a98ff7a9e99 100644
--- a/packages/web/src/app/routes/platform/security/secret-managers/connect-secret-manager-dialog.tsx
+++ b/packages/web/src/app/routes/platform/security/secret-managers/connect-secret-manager-dialog.tsx
@@ -20,7 +20,7 @@ import {
import { Form, FormField, FormItem, FormMessage } from '@/components/ui/form';
import { Input } from '@/components/ui/input';
import { Label } from '@/components/ui/label';
-import { secretManagersHooks } from '@/features/secret-managers/lib/secret-managers-hooks';
+import { secretManagersHooks } from '@/features/secret-managers';
import { api } from '@/lib/api';
type ConnectSecretManagerDialogProps = {
diff --git a/packages/web/src/app/routes/platform/security/secret-managers/index.tsx b/packages/web/src/app/routes/platform/security/secret-managers/index.tsx
index 4d992c92a4b..8559d1bd166 100644
--- a/packages/web/src/app/routes/platform/security/secret-managers/index.tsx
+++ b/packages/web/src/app/routes/platform/security/secret-managers/index.tsx
@@ -3,7 +3,7 @@ import { t } from 'i18next';
import { DashboardPageHeader } from '@/app/components/dashboard-page-header';
import LockedFeatureGuard from '@/app/components/locked-feature-guard';
import { SkeletonList } from '@/components/ui/skeleton';
-import { secretManagersHooks } from '@/features/secret-managers/lib/secret-managers-hooks';
+import { secretManagersHooks } from '@/features/secret-managers';
import { platformHooks } from '@/hooks/platform-hooks';
import SecretManagerProviderCard from './secret-manager-provider-card';
diff --git a/packages/web/src/app/routes/platform/security/secret-managers/secret-manager-provider-card.tsx b/packages/web/src/app/routes/platform/security/secret-managers/secret-manager-provider-card.tsx
index fb7e0515bc9..dfb538aff58 100644
--- a/packages/web/src/app/routes/platform/security/secret-managers/secret-manager-provider-card.tsx
+++ b/packages/web/src/app/routes/platform/security/secret-managers/secret-manager-provider-card.tsx
@@ -2,7 +2,7 @@ import { SecretManagerProviderMetaData } from '@activepieces/shared';
import { t } from 'i18next';
import { CircleAlert, Pencil, RefreshCcw, Trash } from 'lucide-react';
-import { ConfirmationDeleteDialog } from '@/components/delete-dialog';
+import { ConfirmationDeleteDialog } from '@/components/custom/delete-dialog';
import { Button } from '@/components/ui/button';
import { Card } from '@/components/ui/card';
import {
@@ -10,7 +10,7 @@ import {
TooltipContent,
TooltipTrigger,
} from '@/components/ui/tooltip';
-import { secretManagersHooks } from '@/features/secret-managers/lib/secret-managers-hooks';
+import { secretManagersHooks } from '@/features/secret-managers';
import ConnectSecretManagerDialog from './connect-secret-manager-dialog';
diff --git a/packages/web/src/app/routes/platform/security/signing-keys/index.tsx b/packages/web/src/app/routes/platform/security/signing-keys/index.tsx
index 5478e031389..b3fb77e6781 100644
--- a/packages/web/src/app/routes/platform/security/signing-keys/index.tsx
+++ b/packages/web/src/app/routes/platform/security/signing-keys/index.tsx
@@ -8,14 +8,13 @@ import { Link } from 'react-router-dom';
import { DashboardPageHeader } from '@/app/components/dashboard-page-header';
import LockedFeatureGuard from '@/app/components/locked-feature-guard';
-import { ConfirmationDeleteDialog } from '@/components/delete-dialog';
+import { DataTable, RowDataWithActions } from '@/components/custom/data-table';
+import { DataTableColumnHeader } from '@/components/custom/data-table/data-table-column-header';
+import { ConfirmationDeleteDialog } from '@/components/custom/delete-dialog';
+import { FormattedDate } from '@/components/custom/formatted-date';
import { Button } from '@/components/ui/button';
-import { DataTable, RowDataWithActions } from '@/components/ui/data-table';
-import { DataTableColumnHeader } from '@/components/ui/data-table/data-table-column-header';
-import { FormattedDate } from '@/components/ui/formatted-date';
import { internalErrorToast } from '@/components/ui/sonner';
-import { NewSigningKeyDialog } from '@/features/platform-admin/components/new-signing-key-dialog';
-import { signingKeyApi } from '@/features/platform-admin/lib/signing-key-api';
+import { signingKeyApi, NewSigningKeyDialog } from '@/features/platform-admin';
import { platformHooks } from '@/hooks/platform-hooks';
const SigningKeysPage = () => {
diff --git a/packages/web/src/app/routes/platform/security/sso/allowed-domain.tsx b/packages/web/src/app/routes/platform/security/sso/allowed-domain.tsx
index 12f34585613..b8dccc82fbb 100644
--- a/packages/web/src/app/routes/platform/security/sso/allowed-domain.tsx
+++ b/packages/web/src/app/routes/platform/security/sso/allowed-domain.tsx
@@ -11,6 +11,7 @@ import { useState } from 'react';
import { useForm, useFieldArray } from 'react-hook-form';
import { toast } from 'sonner';
+import { platformApi } from '@/api/platforms-api';
import { Button } from '@/components/ui/button';
import {
Dialog,
@@ -22,7 +23,6 @@ import {
} from '@/components/ui/dialog';
import { Form, FormField, FormItem, FormMessage } from '@/components/ui/form';
import { Input } from '@/components/ui/input';
-import { platformApi } from '@/lib/platforms-api';
type AllowedDomainDialogProps = {
platform: PlatformWithoutSensitiveData;
diff --git a/packages/web/src/app/routes/platform/security/sso/index.tsx b/packages/web/src/app/routes/platform/security/sso/index.tsx
index aa94a7ab71d..09a4dcb8855 100644
--- a/packages/web/src/app/routes/platform/security/sso/index.tsx
+++ b/packages/web/src/app/routes/platform/security/sso/index.tsx
@@ -5,6 +5,7 @@ import { LockIcon, MailIcon, Earth } from 'lucide-react';
import React from 'react';
import { toast } from 'sonner';
+import { platformApi } from '@/api/platforms-api';
import { DashboardPageHeader } from '@/app/components/dashboard-page-header';
import LockedFeatureGuard from '@/app/components/locked-feature-guard';
import { AllowedDomainDialog } from '@/app/routes/platform/security/sso/allowed-domain';
@@ -14,7 +15,6 @@ import { Badge } from '@/components/ui/badge';
import { Card } from '@/components/ui/card';
import { Switch } from '@/components/ui/switch';
import { platformHooks } from '@/hooks/platform-hooks';
-import { platformApi } from '@/lib/platforms-api';
import GoogleIcon from '../../../../../assets/img/custom/auth/google-icon.svg';
diff --git a/packages/web/src/app/routes/platform/security/sso/oauth2-dialog.tsx b/packages/web/src/app/routes/platform/security/sso/oauth2-dialog.tsx
index 51e24a8a797..7752ab35f11 100644
--- a/packages/web/src/app/routes/platform/security/sso/oauth2-dialog.tsx
+++ b/packages/web/src/app/routes/platform/security/sso/oauth2-dialog.tsx
@@ -10,6 +10,7 @@ import { useState } from 'react';
import { useForm } from 'react-hook-form';
import { toast } from 'sonner';
+import { platformApi } from '@/api/platforms-api';
import { ApMarkdown } from '@/components/custom/markdown';
import { Button } from '@/components/ui/button';
import {
@@ -23,7 +24,6 @@ import {
import { Form, FormField, FormItem, FormMessage } from '@/components/ui/form';
import { Input } from '@/components/ui/input';
import { Label } from '@/components/ui/label';
-import { platformApi } from '@/lib/platforms-api';
type NewOAuth2DialogProps = {
providerName: 'google' | 'github';
diff --git a/packages/web/src/app/routes/platform/security/sso/saml-dialog.tsx b/packages/web/src/app/routes/platform/security/sso/saml-dialog.tsx
index b5f938b4117..4b89488a869 100644
--- a/packages/web/src/app/routes/platform/security/sso/saml-dialog.tsx
+++ b/packages/web/src/app/routes/platform/security/sso/saml-dialog.tsx
@@ -11,6 +11,7 @@ import { useState } from 'react';
import { useForm } from 'react-hook-form';
import { toast } from 'sonner';
+import { platformApi } from '@/api/platforms-api';
import { ApMarkdown } from '@/components/custom/markdown';
import { Button } from '@/components/ui/button';
import {
@@ -26,7 +27,6 @@ import { Input } from '@/components/ui/input';
import { Label } from '@/components/ui/label';
import { Textarea } from '@/components/ui/textarea';
import { flagsHooks } from '@/hooks/flags-hooks';
-import { platformApi } from '@/lib/platforms-api';
type ConfigureSamlDialogProps = {
platform: PlatformWithoutSensitiveData;
diff --git a/packages/web/src/app/routes/platform/setup/ai/index.tsx b/packages/web/src/app/routes/platform/setup/ai/index.tsx
index 6e65a07767d..40e61d57619 100644
--- a/packages/web/src/app/routes/platform/setup/ai/index.tsx
+++ b/packages/web/src/app/routes/platform/setup/ai/index.tsx
@@ -3,11 +3,11 @@ import { useMutation, useQuery } from '@tanstack/react-query';
import { t } from 'i18next';
import { DashboardPageHeader } from '@/app/components/dashboard-page-header';
-import { aiProviderApi } from '@/features/platform-admin/lib/ai-provider-api';
+import { SUPPORTED_AI_PROVIDERS } from '@/features/agents';
+import { aiProviderApi } from '@/features/platform-admin';
import { flagsHooks } from '@/hooks/flags-hooks';
import { userHooks } from '@/hooks/user-hooks';
-import { SUPPORTED_AI_PROVIDERS } from '../../../../../features/agents/ai-providers';
import LockedFeatureGuard from '../../../../components/locked-feature-guard';
import { AIProviderCard } from './universal-pieces/ai-provider-card';
diff --git a/packages/web/src/app/routes/platform/setup/ai/universal-pieces/ai-provider-card.tsx b/packages/web/src/app/routes/platform/setup/ai/universal-pieces/ai-provider-card.tsx
index 82efffffb6a..827c901cd61 100644
--- a/packages/web/src/app/routes/platform/setup/ai/universal-pieces/ai-provider-card.tsx
+++ b/packages/web/src/app/routes/platform/setup/ai/universal-pieces/ai-provider-card.tsx
@@ -4,8 +4,7 @@ import { Pencil, Trash } from 'lucide-react';
import { Button } from '@/components/ui/button';
import { Card } from '@/components/ui/card';
-
-import { AiProviderInfo } from '../../../../../../features/agents/ai-providers';
+import { AiProviderInfo } from '@/features/agents';
import { UpsertAIProviderDialog } from './upsert-provider-dialog';
diff --git a/packages/web/src/app/routes/platform/setup/ai/universal-pieces/upsert-provider-dialog.tsx b/packages/web/src/app/routes/platform/setup/ai/universal-pieces/upsert-provider-dialog.tsx
index 24114d8206b..127a9691d99 100644
--- a/packages/web/src/app/routes/platform/setup/ai/universal-pieces/upsert-provider-dialog.tsx
+++ b/packages/web/src/app/routes/platform/setup/ai/universal-pieces/upsert-provider-dialog.tsx
@@ -44,10 +44,10 @@ import {
} from '@/components/ui/form';
import { Input } from '@/components/ui/input';
import { ScrollArea } from '@/components/ui/scroll-area';
-import { aiProviderApi } from '@/features/platform-admin/lib/ai-provider-api';
+import { SUPPORTED_AI_PROVIDERS } from '@/features/agents';
+import { aiProviderApi } from '@/features/platform-admin';
import { ApMarkdown } from '../../../../../../components/custom/markdown';
-import { SUPPORTED_AI_PROVIDERS } from '../../../../../../features/agents/ai-providers';
import { UpsertProviderConfigForm } from './upsert-provider-config-form';
diff --git a/packages/web/src/app/routes/platform/setup/branding/appearance-section.tsx b/packages/web/src/app/routes/platform/setup/branding/appearance-section.tsx
index ea84612fedb..c6c77e71b99 100644
--- a/packages/web/src/app/routes/platform/setup/branding/appearance-section.tsx
+++ b/packages/web/src/app/routes/platform/setup/branding/appearance-section.tsx
@@ -6,8 +6,9 @@ import { useRef } from 'react';
import { useForm } from 'react-hook-form';
import { toast } from 'sonner';
+import { platformApi } from '@/api/platforms-api';
+import { ColorPicker } from '@/components/custom/color-picker';
import { Button } from '@/components/ui/button';
-import { ColorPicker } from '@/components/ui/color-picker';
import {
Form,
FormField,
@@ -18,7 +19,6 @@ import {
import { Input } from '@/components/ui/input';
import { Separator } from '@/components/ui/separator';
import { platformHooks } from '@/hooks/platform-hooks';
-import { platformApi } from '@/lib/platforms-api';
const FromSchema = Type.Object({
name: Type.String(),
diff --git a/packages/web/src/app/routes/platform/setup/connections/index.tsx b/packages/web/src/app/routes/platform/setup/connections/index.tsx
index 54292de3330..5aba09e62c8 100644
--- a/packages/web/src/app/routes/platform/setup/connections/index.tsx
+++ b/packages/web/src/app/routes/platform/setup/connections/index.tsx
@@ -24,9 +24,6 @@ import { LockedFeatureGuard } from '@/app/components/locked-feature-guard';
import { NewConnectionDialog } from '@/app/connections/new-connection-dialog';
import { ReconnectButtonDialog } from '@/app/connections/reconnect-button-dialog';
import { CopyTextTooltip } from '@/components/custom/clipboard/copy-text-tooltip';
-import { DefaultTag } from '@/components/custom/global-connection-utils';
-import { ConfirmationDeleteDialog } from '@/components/delete-dialog';
-import { Button } from '@/components/ui/button';
import {
BulkAction,
CURSOR_QUERY_PARAM,
@@ -34,20 +31,23 @@ import {
DataTableFilters,
LIMIT_QUERY_PARAM,
RowDataWithActions,
-} from '@/components/ui/data-table';
-import { DataTableColumnHeader } from '@/components/ui/data-table/data-table-column-header';
-import { FormattedDate } from '@/components/ui/formatted-date';
-import { StatusIconWithText } from '@/components/ui/status-icon-with-text';
-import { EditGlobalConnectionDialog } from '@/features/connections/components/edit-global-connection-dialog';
+} from '@/components/custom/data-table';
+import { DataTableColumnHeader } from '@/components/custom/data-table/data-table-column-header';
+import { ConfirmationDeleteDialog } from '@/components/custom/delete-dialog';
+import { FormattedDate } from '@/components/custom/formatted-date';
+import { DefaultTag } from '@/components/custom/global-connection-utils';
+import { StatusIconWithText } from '@/components/custom/status-icon-with-text';
+import { Button } from '@/components/ui/button';
import {
+ EditGlobalConnectionDialog,
globalConnectionsMutations,
globalConnectionsQueries,
-} from '@/features/connections/lib/global-connections-hooks';
-import { appConnectionUtils } from '@/features/connections/lib/utils';
-import PieceIconWithPieceName from '@/features/pieces/components/piece-icon-from-name';
+ appConnectionUtils,
+} from '@/features/connections';
+import { PieceIconWithPieceName } from '@/features/pieces';
import { useAuthorization } from '@/hooks/authorization-hooks';
import { platformHooks } from '@/hooks/platform-hooks';
-import { formatUtils } from '@/lib/utils';
+import { formatUtils } from '@/lib/format-utils';
const STATUS_QUERY_PARAM = 'status';
const filters: DataTableFilters[] = [
diff --git a/packages/web/src/app/routes/platform/setup/pieces/apply-tags.tsx b/packages/web/src/app/routes/platform/setup/pieces/apply-tags.tsx
index ed036ab8495..be2be41e09e 100644
--- a/packages/web/src/app/routes/platform/setup/pieces/apply-tags.tsx
+++ b/packages/web/src/app/routes/platform/setup/pieces/apply-tags.tsx
@@ -21,7 +21,7 @@ import {
} from '@/components/ui/popover';
import { ScrollArea } from '@/components/ui/scroll-area';
import { Separator } from '@/components/ui/separator';
-import { piecesTagsApi } from '@/features/platform-admin/lib/pieces-tags';
+import { piecesTagsApi } from '@/features/platform-admin';
type ApplyTagsProps = {
selectedPieces: PieceMetadataModelSummary[];
diff --git a/packages/web/src/app/routes/platform/setup/pieces/create-tag-dialog.tsx b/packages/web/src/app/routes/platform/setup/pieces/create-tag-dialog.tsx
index 9f74b5e15a7..b675fd9a683 100644
--- a/packages/web/src/app/routes/platform/setup/pieces/create-tag-dialog.tsx
+++ b/packages/web/src/app/routes/platform/setup/pieces/create-tag-dialog.tsx
@@ -15,7 +15,7 @@ import {
} from '@/components/ui/dialog';
import { Input } from '@/components/ui/input';
import { Label } from '@/components/ui/label';
-import { piecesTagsApi } from '@/features/platform-admin/lib/pieces-tags';
+import { piecesTagsApi } from '@/features/platform-admin';
type CreateTagDialogProps = {
onTagCreated: (tag: Tag) => void;
diff --git a/packages/web/src/app/routes/platform/setup/pieces/index.tsx b/packages/web/src/app/routes/platform/setup/pieces/index.tsx
index df8c0b150df..0729b2adc30 100644
--- a/packages/web/src/app/routes/platform/setup/pieces/index.tsx
+++ b/packages/web/src/app/routes/platform/setup/pieces/index.tsx
@@ -23,14 +23,12 @@ import { ApplyTags } from '@/app/routes/platform/setup/pieces/apply-tags';
import { PieceActions } from '@/app/routes/platform/setup/pieces/piece-actions';
import { SyncPiecesButton } from '@/app/routes/platform/setup/pieces/sync-pieces';
import { ConfigurePieceOAuth2Dialog } from '@/app/routes/platform/setup/pieces/update-oauth2-dialog';
+import { DataTable, RowDataWithActions } from '@/components/custom/data-table';
+import { DataTableColumnHeader } from '@/components/custom/data-table/data-table-column-header';
+import { LockedAlert } from '@/components/custom/locked-alert';
import { Badge } from '@/components/ui/badge';
-import { DataTable, RowDataWithActions } from '@/components/ui/data-table';
-import { DataTableColumnHeader } from '@/components/ui/data-table/data-table-column-header';
-import { LockedAlert } from '@/components/ui/locked-alert';
-import { oauthAppsQueries } from '@/features/connections/lib/oauth-apps-hooks';
-import { InstallPieceDialog } from '@/features/pieces/components/install-piece-dialog';
-import { PieceIcon } from '@/features/pieces/components/piece-icon';
-import { piecesHooks } from '@/features/pieces/lib/pieces-hooks';
+import { oauthAppsQueries } from '@/features/connections';
+import { InstallPieceDialog, PieceIcon, piecesHooks } from '@/features/pieces';
import { platformHooks } from '@/hooks/platform-hooks';
const PlatformPiecesPage = () => {
diff --git a/packages/web/src/app/routes/platform/setup/pieces/piece-actions.tsx b/packages/web/src/app/routes/platform/setup/pieces/piece-actions.tsx
index 385335bbc14..36e653357e2 100644
--- a/packages/web/src/app/routes/platform/setup/pieces/piece-actions.tsx
+++ b/packages/web/src/app/routes/platform/setup/pieces/piece-actions.tsx
@@ -3,6 +3,7 @@ import { t } from 'i18next';
import { Eye, EyeOff, Pin, PinOff } from 'lucide-react';
import { toast } from 'sonner';
+import { platformApi } from '@/api/platforms-api';
import { Button } from '@/components/ui/button';
import {
Tooltip,
@@ -10,7 +11,6 @@ import {
TooltipTrigger,
} from '@/components/ui/tooltip';
import { platformHooks } from '@/hooks/platform-hooks';
-import { platformApi } from '@/lib/platforms-api';
type PieceActionsProps = {
pieceName: string;
diff --git a/packages/web/src/app/routes/platform/setup/pieces/sync-pieces.tsx b/packages/web/src/app/routes/platform/setup/pieces/sync-pieces.tsx
index d0de3095029..ad0c6d70345 100644
--- a/packages/web/src/app/routes/platform/setup/pieces/sync-pieces.tsx
+++ b/packages/web/src/app/routes/platform/setup/pieces/sync-pieces.tsx
@@ -5,7 +5,7 @@ import { RefreshCcw } from 'lucide-react';
import { toast } from 'sonner';
import { Button } from '@/components/ui/button';
-import { piecesApi } from '@/features/pieces/lib/pieces-api';
+import { piecesApi } from '@/features/pieces';
import { flagsHooks } from '@/hooks/flags-hooks';
const SyncPiecesButton = () => {
diff --git a/packages/web/src/app/routes/platform/setup/pieces/update-oauth2-dialog.tsx b/packages/web/src/app/routes/platform/setup/pieces/update-oauth2-dialog.tsx
index b4ad5b077d0..ad40561be13 100644
--- a/packages/web/src/app/routes/platform/setup/pieces/update-oauth2-dialog.tsx
+++ b/packages/web/src/app/routes/platform/setup/pieces/update-oauth2-dialog.tsx
@@ -23,10 +23,7 @@ import {
TooltipContent,
TooltipTrigger,
} from '@/components/ui/tooltip';
-import {
- oauthAppsMutations,
- oauthAppsQueries,
-} from '@/features/connections/lib/oauth-apps-hooks';
+import { oauthAppsMutations, oauthAppsQueries } from '@/features/connections';
type ConfigurePieceOAuth2DialogProps = {
pieceName: string;
diff --git a/packages/web/src/app/routes/platform/setup/templates/create-template-dialog.tsx b/packages/web/src/app/routes/platform/setup/templates/create-template-dialog.tsx
index 9e81ec24d46..249489e63a1 100644
--- a/packages/web/src/app/routes/platform/setup/templates/create-template-dialog.tsx
+++ b/packages/web/src/app/routes/platform/setup/templates/create-template-dialog.tsx
@@ -22,8 +22,8 @@ import {
import { Form, FormField, FormItem, FormMessage } from '@/components/ui/form';
import { Input } from '@/components/ui/input';
import { Label } from '@/components/ui/label';
-import { templateUtils } from '@/features/flows/lib/template-parser';
-import { templatesApi } from '@/features/templates/lib/templates-api';
+import { templateUtils } from '@/features/flows';
+import { templatesApi } from '@/features/templates';
import { userHooks } from '@/hooks/user-hooks';
import { api } from '@/lib/api';
diff --git a/packages/web/src/app/routes/platform/setup/templates/index.tsx b/packages/web/src/app/routes/platform/setup/templates/index.tsx
index 1eca47b5ea7..aa79fc64d18 100644
--- a/packages/web/src/app/routes/platform/setup/templates/index.tsx
+++ b/packages/web/src/app/routes/platform/setup/templates/index.tsx
@@ -17,23 +17,23 @@ import { toast } from 'sonner';
import { DashboardPageHeader } from '@/app/components/dashboard-page-header';
import LockedFeatureGuard from '@/app/components/locked-feature-guard';
-import { ConfirmationDeleteDialog } from '@/components/delete-dialog';
-import { Button } from '@/components/ui/button';
-import { Checkbox } from '@/components/ui/checkbox';
import {
DataTable,
RowDataWithActions,
BulkAction,
-} from '@/components/ui/data-table';
-import { DataTableColumnHeader } from '@/components/ui/data-table/data-table-column-header';
-import { FormattedDate } from '@/components/ui/formatted-date';
+} from '@/components/custom/data-table';
+import { DataTableColumnHeader } from '@/components/custom/data-table/data-table-column-header';
+import { ConfirmationDeleteDialog } from '@/components/custom/delete-dialog';
+import { FormattedDate } from '@/components/custom/formatted-date';
+import { Button } from '@/components/ui/button';
+import { Checkbox } from '@/components/ui/checkbox';
import {
Tooltip,
TooltipContent,
TooltipTrigger,
} from '@/components/ui/tooltip';
-import { PieceIconList } from '@/features/pieces/components/piece-icon-list';
-import { templatesApi } from '@/features/templates/lib/templates-api';
+import { PieceIconList } from '@/features/pieces';
+import { templatesApi } from '@/features/templates';
import { platformHooks } from '@/hooks/platform-hooks';
import { CreateTemplateDialog } from './create-template-dialog';
diff --git a/packages/web/src/app/routes/platform/setup/templates/update-template-dialog.tsx b/packages/web/src/app/routes/platform/setup/templates/update-template-dialog.tsx
index 9e403826e25..83062e66c5f 100644
--- a/packages/web/src/app/routes/platform/setup/templates/update-template-dialog.tsx
+++ b/packages/web/src/app/routes/platform/setup/templates/update-template-dialog.tsx
@@ -23,8 +23,8 @@ import { Form, FormField, FormItem, FormMessage } from '@/components/ui/form';
import { Input } from '@/components/ui/input';
import { Label } from '@/components/ui/label';
import { Textarea } from '@/components/ui/textarea';
-import { templateUtils } from '@/features/flows/lib/template-parser';
-import { templatesApi } from '@/features/templates/lib/templates-api';
+import { templateUtils } from '@/features/flows';
+import { templatesApi } from '@/features/templates';
import { api } from '@/lib/api';
const UpdateFlowTemplateSchema = Type.Object({
diff --git a/packages/web/src/app/routes/platform/users/actions/delete-user-action.tsx b/packages/web/src/app/routes/platform/users/actions/delete-user-action.tsx
index 0b35aae46e1..255a60394b9 100644
--- a/packages/web/src/app/routes/platform/users/actions/delete-user-action.tsx
+++ b/packages/web/src/app/routes/platform/users/actions/delete-user-action.tsx
@@ -1,7 +1,7 @@
import { t } from 'i18next';
import { Trash } from 'lucide-react';
-import { ConfirmationDeleteDialog } from '@/components/delete-dialog';
+import { ConfirmationDeleteDialog } from '@/components/custom/delete-dialog';
import { Button } from '@/components/ui/button';
import {
Tooltip,
diff --git a/packages/web/src/app/routes/platform/users/actions/update-user-dialog.tsx b/packages/web/src/app/routes/platform/users/actions/update-user-dialog.tsx
index 89654d344f5..948554ca7ae 100644
--- a/packages/web/src/app/routes/platform/users/actions/update-user-dialog.tsx
+++ b/packages/web/src/app/routes/platform/users/actions/update-user-dialog.tsx
@@ -9,6 +9,7 @@ import { t } from 'i18next';
import { useState } from 'react';
import { useForm } from 'react-hook-form';
+import { platformUserApi } from '@/api/platform-user-api';
import { Button } from '@/components/ui/button';
import {
Dialog,
@@ -21,8 +22,7 @@ import {
import { Form, FormField, FormItem, FormMessage } from '@/components/ui/form';
import { Input } from '@/components/ui/input';
import { Label } from '@/components/ui/label';
-import { RoleSelector } from '@/features/members/component/role-selector';
-import { platformUserApi } from '@/lib/platform-user-api';
+import { RoleSelector } from '@/features/members';
export const UpdateUserDialog = ({
children,
diff --git a/packages/web/src/app/routes/platform/users/columns.tsx b/packages/web/src/app/routes/platform/users/columns.tsx
index 82c3572ae9e..d67af7f182a 100644
--- a/packages/web/src/app/routes/platform/users/columns.tsx
+++ b/packages/web/src/app/routes/platform/users/columns.tsx
@@ -3,10 +3,10 @@ import { ColumnDef } from '@tanstack/react-table';
import { t } from 'i18next';
import { Mail, Tag, Hash, Shield, Clock, Activity, Info } from 'lucide-react';
-import { RowDataWithActions } from '@/components/ui/data-table';
-import { DataTableColumnHeader } from '@/components/ui/data-table/data-table-column-header';
-import { TruncatedColumnTextValue } from '@/components/ui/data-table/truncated-column-text-value';
-import { FormattedDate } from '@/components/ui/formatted-date';
+import { RowDataWithActions } from '@/components/custom/data-table';
+import { DataTableColumnHeader } from '@/components/custom/data-table/data-table-column-header';
+import { TruncatedColumnTextValue } from '@/components/custom/data-table/truncated-column-text-value';
+import { FormattedDate } from '@/components/custom/formatted-date';
import {
Tooltip,
TooltipContent,
diff --git a/packages/web/src/app/routes/platform/users/index.tsx b/packages/web/src/app/routes/platform/users/index.tsx
index 5fefbe7fe14..9c5bbfbaf37 100644
--- a/packages/web/src/app/routes/platform/users/index.tsx
+++ b/packages/web/src/app/routes/platform/users/index.tsx
@@ -10,14 +10,13 @@ import { User, UserPlus } from 'lucide-react';
import { useMemo, useState } from 'react';
import { toast } from 'sonner';
+import { platformUserApi } from '@/api/platform-user-api';
import { DashboardPageHeader } from '@/app/components/dashboard-page-header';
import LockedFeatureGuard from '@/app/components/locked-feature-guard';
+import { DataTable } from '@/components/custom/data-table';
import { Button } from '@/components/ui/button';
-import { DataTable } from '@/components/ui/data-table';
-import { InviteUserDialog } from '@/features/members/component/invite-user/invite-user-dialog';
-import { userInvitationApi } from '@/features/members/lib/user-invitation';
+import { userInvitationApi, InviteUserDialog } from '@/features/members';
import { platformUserHooks } from '@/hooks/platform-user-hooks';
-import { platformUserApi } from '@/lib/platform-user-api';
import { DeleteUserAction } from './actions/delete-user-action';
import { EditUserAction } from './actions/edit-user-action';
diff --git a/packages/web/src/app/routes/project-release/apply-plan.tsx b/packages/web/src/app/routes/project-release/apply-plan.tsx
index 74525d40385..261e09f75cb 100644
--- a/packages/web/src/app/routes/project-release/apply-plan.tsx
+++ b/packages/web/src/app/routes/project-release/apply-plan.tsx
@@ -8,9 +8,11 @@ import { useState, ReactNode } from 'react';
import { Button, ButtonProps } from '@/components/ui/button';
import { internalErrorToast } from '@/components/ui/sonner';
-import { ConnectGitDialog } from '@/features/project-releases/components/connect-git-dialog';
-import { gitSyncHooks } from '@/features/project-releases/lib/git-sync-hooks';
-import { projectReleaseApi } from '@/features/project-releases/lib/project-release-api';
+import {
+ projectReleaseApi,
+ ConnectGitDialog,
+ gitSyncHooks,
+} from '@/features/project-releases';
import { authenticationSession } from '@/lib/authentication-session';
import { CreateReleaseDialog } from './create-release-dialog';
diff --git a/packages/web/src/app/routes/project-release/create-release-dialog/index.tsx b/packages/web/src/app/routes/project-release/create-release-dialog/index.tsx
index 5606cc4680f..c0439dab688 100644
--- a/packages/web/src/app/routes/project-release/create-release-dialog/index.tsx
+++ b/packages/web/src/app/routes/project-release/create-release-dialog/index.tsx
@@ -13,6 +13,7 @@ import { useState } from 'react';
import { useForm, UseFormReturn } from 'react-hook-form';
import * as z from 'zod';
+import { LoadingSpinner } from '@/components/custom/spinner';
import { Button } from '@/components/ui/button';
import { Checkbox } from '@/components/ui/checkbox';
import {
@@ -25,10 +26,8 @@ import {
import { Input } from '@/components/ui/input';
import { Label } from '@/components/ui/label';
import { ScrollArea } from '@/components/ui/scroll-area';
-import { LoadingSpinner } from '@/components/ui/spinner';
import { Textarea } from '@/components/ui/textarea';
-import { gitSyncHooks } from '@/features/project-releases/lib/git-sync-hooks';
-import { projectReleaseApi } from '@/features/project-releases/lib/project-release-api';
+import { projectReleaseApi, gitSyncHooks } from '@/features/project-releases';
import { platformHooks } from '@/hooks/platform-hooks';
import { authenticationSession } from '@/lib/authentication-session';
diff --git a/packages/web/src/app/routes/project-release/index.tsx b/packages/web/src/app/routes/project-release/index.tsx
index 24762a4fb90..ead93a88e57 100644
--- a/packages/web/src/app/routes/project-release/index.tsx
+++ b/packages/web/src/app/routes/project-release/index.tsx
@@ -20,25 +20,25 @@ import {
} from 'lucide-react';
import { useNavigate } from 'react-router-dom';
+import { DataTable, RowDataWithActions } from '@/components/custom/data-table';
+import { DataTableColumnHeader } from '@/components/custom/data-table/data-table-column-header';
+import { FormattedDate } from '@/components/custom/formatted-date';
import { PermissionNeededTooltip } from '@/components/custom/permission-needed-tooltip';
import { Button } from '@/components/ui/button';
-import { DataTable, RowDataWithActions } from '@/components/ui/data-table';
-import { DataTableColumnHeader } from '@/components/ui/data-table/data-table-column-header';
import {
DropdownMenu,
DropdownMenuContent,
DropdownMenuItem,
DropdownMenuTrigger,
} from '@/components/ui/dropdown-menu';
-import { FormattedDate } from '@/components/ui/formatted-date';
import {
Tooltip,
TooltipContent,
TooltipTrigger,
} from '@/components/ui/tooltip';
-import { projectReleaseApi } from '@/features/project-releases/lib/project-release-api';
+import { projectReleaseApi } from '@/features/project-releases';
+import { projectCollectionUtils } from '@/features/projects';
import { useAuthorization } from '@/hooks/authorization-hooks';
-import { projectCollectionUtils } from '@/hooks/project-collection';
import { authenticationSession } from '@/lib/authentication-session';
import { ApplyButton } from './apply-plan';
diff --git a/packages/web/src/app/routes/project-release/push-everything-dialog/index.tsx b/packages/web/src/app/routes/project-release/push-everything-dialog/index.tsx
index cc1dd70d0e5..09a60d13589 100644
--- a/packages/web/src/app/routes/project-release/push-everything-dialog/index.tsx
+++ b/packages/web/src/app/routes/project-release/push-everything-dialog/index.tsx
@@ -35,8 +35,7 @@ import {
TooltipContent,
TooltipTrigger,
} from '@/components/ui/tooltip';
-import { gitSyncApi } from '@/features/project-releases/lib/git-sync-api';
-import { gitSyncHooks } from '@/features/project-releases/lib/git-sync-hooks';
+import { gitSyncApi, gitSyncHooks } from '@/features/project-releases';
import { platformHooks } from '@/hooks/platform-hooks';
import { authenticationSession } from '@/lib/authentication-session';
diff --git a/packages/web/src/app/routes/project-release/selection-dialog.tsx b/packages/web/src/app/routes/project-release/selection-dialog.tsx
index 9149b88111d..107a4fe4603 100644
--- a/packages/web/src/app/routes/project-release/selection-dialog.tsx
+++ b/packages/web/src/app/routes/project-release/selection-dialog.tsx
@@ -2,7 +2,7 @@ import { ProjectReleaseType } from '@activepieces/shared';
import { ReactNode, useState } from 'react';
import { Button, ButtonProps } from '@/components/ui/button';
-import { projectCollectionUtils } from '@/hooks/project-collection';
+import { projectCollectionUtils } from '@/features/projects';
import { ProjectSelectionDialog } from './selection-release-dialog/project-dialog';
diff --git a/packages/web/src/app/routes/project-release/selection-release-dialog/project-dialog.tsx b/packages/web/src/app/routes/project-release/selection-release-dialog/project-dialog.tsx
index c09d992bb13..03d01de0e45 100644
--- a/packages/web/src/app/routes/project-release/selection-release-dialog/project-dialog.tsx
+++ b/packages/web/src/app/routes/project-release/selection-release-dialog/project-dialog.tsx
@@ -18,8 +18,8 @@ import {
} from '@/components/ui/dialog';
import { FormField, FormItem, Form, FormMessage } from '@/components/ui/form';
import { Label } from '@/components/ui/label';
-import { projectReleaseApi } from '@/features/project-releases/lib/project-release-api';
-import { projectCollectionUtils } from '@/hooks/project-collection';
+import { projectReleaseApi } from '@/features/project-releases';
+import { projectCollectionUtils } from '@/features/projects';
import { CreateReleaseDialog } from '../create-release-dialog';
diff --git a/packages/web/src/app/routes/project-release/view-release.tsx b/packages/web/src/app/routes/project-release/view-release.tsx
index 6a2dba99741..2b6eb3657dc 100644
--- a/packages/web/src/app/routes/project-release/view-release.tsx
+++ b/packages/web/src/app/routes/project-release/view-release.tsx
@@ -18,7 +18,7 @@ import {
TooltipProvider,
TooltipTrigger,
} from '@/components/ui/tooltip';
-import { projectReleaseApi } from '@/features/project-releases/lib/project-release-api';
+import { projectReleaseApi } from '@/features/project-releases';
import { authenticationSession } from '@/lib/authentication-session';
import { ApplyButton } from './apply-plan';
diff --git a/packages/web/src/app/routes/project-routes.tsx b/packages/web/src/app/routes/project-routes.tsx
new file mode 100644
index 00000000000..1dcdeb0c9f0
--- /dev/null
+++ b/packages/web/src/app/routes/project-routes.tsx
@@ -0,0 +1,221 @@
+import { Permission } from '@activepieces/shared';
+import React, { Suspense } from 'react';
+import { Navigate, useLocation } from 'react-router-dom';
+
+import { PageTitle } from '@/app/components/page-title';
+import { LoadingScreen } from '@/components/custom/loading-screen';
+import { ApTableStateProvider } from '@/features/tables';
+import { routesThatRequireProjectId } from '@/lib/route-utils';
+
+import { BuilderLayout } from '../components/builder-layout';
+import { ProjectDashboardLayout } from '../components/project-layout';
+import { AfterImportFlowRedirect } from '../guards/after-import-flow-redirect';
+import { RoutePermissionGuard } from '../guards/permission-guard';
+import { ProjectRouterWrapper } from '../guards/project-route-wrapper';
+
+const FlowsPage = React.lazy(() =>
+ import('./flows').then((m) => ({ default: m.FlowsPage })),
+);
+const FlowBuilderPage = React.lazy(() =>
+ import('./flows/id').then((m) => ({ default: m.FlowBuilderPage })),
+);
+const AnalyticsPage = React.lazy(() => import('./impact'));
+const LeaderboardPage = React.lazy(() => import('./leaderboard'));
+const ProjectReleasesPage = React.lazy(() =>
+ import('./project-release').then((m) => ({
+ default: m.ProjectReleasesPage,
+ })),
+);
+const ViewRelease = React.lazy(() => import('./project-release/view-release'));
+const RunsPage = React.lazy(() =>
+ import('./runs').then((m) => ({ default: m.RunsPage })),
+);
+const FlowRunPage = React.lazy(() =>
+ import('./runs/id').then((m) => ({ default: m.FlowRunPage })),
+);
+const AppConnectionsPage = React.lazy(() =>
+ import('./connections').then((m) => ({ default: m.AppConnectionsPage })),
+);
+const ApTablesPage = React.lazy(() =>
+ import('./tables').then((m) => ({ default: m.ApTablesPage })),
+);
+const ApTableEditorPage = React.lazy(() =>
+ import('./tables/id').then((m) => ({ default: m.ApTableEditorPage })),
+);
+
+const SettingsRerouter = () => {
+ const { hash } = useLocation();
+ const fragmentWithoutHash = hash.slice(1).toLowerCase();
+ return fragmentWithoutHash ? (
+
+ ) : (
+
+ );
+};
+
+function SuspenseWrapper({ children }: { children: React.ReactNode }) {
+ return }>{children};
+}
+
+export const projectRoutes = [
+ ...ProjectRouterWrapper({
+ path: routesThatRequireProjectId.flows,
+ element: (
+
+
+
+
+
+
+
+
+
+ ),
+ }),
+ ...ProjectRouterWrapper({
+ path: routesThatRequireProjectId.singleFlow,
+ element: (
+
+
+
+
+
+
+
+
+
+ ),
+ }),
+ ...ProjectRouterWrapper({
+ path: '/flow-import-redirect/:flowId',
+ element: ,
+ }),
+ ...ProjectRouterWrapper({
+ path: routesThatRequireProjectId.singleRun,
+ element: (
+
+
+
+
+
+
+
+
+
+ ),
+ }),
+ ...ProjectRouterWrapper({
+ path: routesThatRequireProjectId.runs,
+ element: (
+
+
+
+
+
+
+
+
+
+ ),
+ }),
+ ...ProjectRouterWrapper({
+ path: routesThatRequireProjectId.singleRelease,
+ element: (
+
+
+
+
+
+
+
+ ),
+ }),
+ ...ProjectRouterWrapper({
+ path: routesThatRequireProjectId.tables,
+ element: (
+
+
+
+
+
+
+
+
+
+ ),
+ }),
+ ...ProjectRouterWrapper({
+ path: routesThatRequireProjectId.singleTable,
+ element: (
+
+
+
+
+
+
+
+
+
+
+
+ ),
+ }),
+ ...ProjectRouterWrapper({
+ path: routesThatRequireProjectId.connections,
+ element: (
+
+
+
+
+
+
+
+
+
+ ),
+ }),
+ ...ProjectRouterWrapper({
+ path: routesThatRequireProjectId.releases,
+ element: (
+
+
+
+
+
+
+
+ ),
+ }),
+ ...ProjectRouterWrapper({
+ path: routesThatRequireProjectId.settings,
+ element: (
+
+
+
+ ),
+ }),
+ {
+ path: '/impact',
+ element: (
+
+
+
+
+
+
+
+ ),
+ },
+ {
+ path: '/leaderboard',
+ element: (
+
+
+
+
+
+
+
+ ),
+ },
+];
diff --git a/packages/web/src/app/routes/public-routes.tsx b/packages/web/src/app/routes/public-routes.tsx
new file mode 100644
index 00000000000..01cb840b449
--- /dev/null
+++ b/packages/web/src/app/routes/public-routes.tsx
@@ -0,0 +1,90 @@
+import React, { Suspense } from 'react';
+
+import { PageTitle } from '@/app/components/page-title';
+import { LoadingScreen } from '@/components/custom/loading-screen';
+
+import { ProjectDashboardLayout } from '../components/project-layout';
+import { TemplateDetailsWrapper } from '../guards/template-details-wrapper';
+
+import NotFoundPage from './404-page';
+import AuthenticatePage from './authenticate';
+import { EmbedPage } from './embed';
+import { EmbeddedConnectionDialog } from './embed/embedded-connection-dialog';
+import { RedirectPage } from './redirect';
+
+const ChatPage = React.lazy(() =>
+ import('./chat').then((m) => ({ default: m.ChatPage })),
+);
+const FormPage = React.lazy(() =>
+ import('./forms').then((m) => ({ default: m.FormPage })),
+);
+const TemplatesPage = React.lazy(() =>
+ import('./templates').then((m) => ({ default: m.TemplatesPage })),
+);
+
+function SuspenseWrapper({ children }: { children: React.ReactNode }) {
+ return }>{children};
+}
+
+export const publicRoutes = [
+ {
+ path: '/embed',
+ element: ,
+ },
+ {
+ path: '/embed/connections',
+ element: ,
+ },
+ {
+ path: '/authenticate',
+ element: ,
+ },
+ {
+ path: '/templates',
+ element: (
+
+
+
+
+
+
+
+ ),
+ },
+ {
+ path: '/templates/:templateId',
+ element: ,
+ },
+ {
+ path: '/forms/:flowId',
+ element: (
+
+
+
+
+
+ ),
+ },
+ {
+ path: '/chats/:flowId',
+ element: (
+
+
+
+
+
+ ),
+ },
+ {
+ path: '/redirect',
+ element: ,
+ },
+ {
+ path: '/404',
+ element: (
+
+
+
+ ),
+ },
+];
diff --git a/packages/web/src/app/routes/redirect.tsx b/packages/web/src/app/routes/redirect.tsx
index 388f974a581..b48532c2e5b 100644
--- a/packages/web/src/app/routes/redirect.tsx
+++ b/packages/web/src/app/routes/redirect.tsx
@@ -4,10 +4,10 @@ import React, { useEffect, useRef } from 'react';
import { useLocation, useNavigate } from 'react-router-dom';
import { toast } from 'sonner';
-import { LoadingScreen } from '@/components/ui/loading-screen';
+import { authenticationApi } from '@/api/authentication-api';
+import { LoadingScreen } from '@/components/custom/loading-screen';
import { internalErrorToast } from '@/components/ui/sonner';
import { api } from '@/lib/api';
-import { authenticationApi } from '@/lib/authentication-api';
import { authenticationSession } from '@/lib/authentication-session';
import {
FROM_QUERY_PARAM,
diff --git a/packages/web/src/app/routes/runs/id/index.tsx b/packages/web/src/app/routes/runs/id/index.tsx
index 42dd76dc55a..5a20c49e7f0 100644
--- a/packages/web/src/app/routes/runs/id/index.tsx
+++ b/packages/web/src/app/routes/runs/id/index.tsx
@@ -5,10 +5,9 @@ import { useParams } from 'react-router-dom';
import { BuilderPage } from '@/app/builder';
import { BuilderStateProvider } from '@/app/builder/state/builder-state-provider';
-import { LoadingSpinner } from '@/components/ui/spinner';
-import { flowRunsApi } from '@/features/flow-runs/lib/flow-runs-api';
-import { flowsApi } from '@/features/flows/lib/flows-api';
-import { sampleDataHooks } from '@/features/flows/lib/sample-data-hooks';
+import { LoadingSpinner } from '@/components/custom/spinner';
+import { flowRunsApi } from '@/features/flow-runs';
+import { flowsApi, sampleDataHooks } from '@/features/flows';
const FlowRunPage = () => {
const { runId, projectId } = useParams();
diff --git a/packages/web/src/app/routes/runs/index.tsx b/packages/web/src/app/routes/runs/index.tsx
index cf208a63fec..e8c61eb3f75 100644
--- a/packages/web/src/app/routes/runs/index.tsx
+++ b/packages/web/src/app/routes/runs/index.tsx
@@ -1,4 +1,4 @@
-import { RunsTable } from '@/features/flow-runs/components/runs-table';
+import { RunsTable } from '@/features/flow-runs';
const RunsPage = () => {
return ;
diff --git a/packages/web/src/app/routes/sign-in/index.tsx b/packages/web/src/app/routes/sign-in/index.tsx
index a3acd14d8d4..986933fa2d6 100644
--- a/packages/web/src/app/routes/sign-in/index.tsx
+++ b/packages/web/src/app/routes/sign-in/index.tsx
@@ -1,4 +1,4 @@
-import { AuthFormTemplate } from '@/features/authentication/components/auth-form-template';
+import { AuthFormTemplate } from '@/features/authentication';
const SignInPage: React.FC = () => {
return (
diff --git a/packages/web/src/app/routes/sign-up/index.tsx b/packages/web/src/app/routes/sign-up/index.tsx
index d07fe4b9223..b0c8b41a51d 100644
--- a/packages/web/src/app/routes/sign-up/index.tsx
+++ b/packages/web/src/app/routes/sign-up/index.tsx
@@ -1,4 +1,4 @@
-import { AuthFormTemplate } from '@/features/authentication/components/auth-form-template';
+import { AuthFormTemplate } from '@/features/authentication';
const SignUpPage: React.FC = () => {
return (
diff --git a/packages/web/src/app/routes/tables/id/index.tsx b/packages/web/src/app/routes/tables/id/index.tsx
index b1fbf12ce3f..4bb0fc45eca 100644
--- a/packages/web/src/app/routes/tables/id/index.tsx
+++ b/packages/web/src/app/routes/tables/id/index.tsx
@@ -5,15 +5,17 @@ import DataGrid, { DataGridHandle } from 'react-data-grid';
import 'react-data-grid/lib/styles.css';
import { useNavigate } from 'react-router-dom';
-import { useTheme } from '@/components/theme-provider';
-import { ApTableFooter } from '@/features/tables/components/ap-table-footer';
-import { ApTableHeader } from '@/features/tables/components/ap-table-header';
-import { useTableState } from '@/features/tables/components/ap-table-state-provider';
+import { useTheme } from '@/components/providers/theme-provider';
import {
+ ApTableFooter,
+ ApTableHeader,
+ useTableState,
useTableColumns,
mapRecordsToRows,
-} from '@/features/tables/components/table-columns';
-import { Row, ROW_HEIGHT_MAP, RowHeight } from '@/features/tables/lib/types';
+ Row,
+ ROW_HEIGHT_MAP,
+ RowHeight,
+} from '@/features/tables';
import { useAuthorization } from '@/hooks/authorization-hooks';
import { flagsHooks } from '@/hooks/flags-hooks';
import { authenticationSession } from '@/lib/authentication-session';
diff --git a/packages/web/src/app/routes/tables/index.tsx b/packages/web/src/app/routes/tables/index.tsx
index e024854a412..49feb3f92c7 100644
--- a/packages/web/src/app/routes/tables/index.tsx
+++ b/packages/web/src/app/routes/tables/index.tsx
@@ -17,25 +17,27 @@ import { useMemo, useState } from 'react';
import { useNavigate } from 'react-router-dom';
import LockedFeatureGuard from '@/app/components/locked-feature-guard';
-import { PermissionNeededTooltip } from '@/components/custom/permission-needed-tooltip';
-import { ConfirmationDeleteDialog } from '@/components/delete-dialog';
-import { Button } from '@/components/ui/button';
import {
BulkAction,
DataTable,
RowDataWithActions,
-} from '@/components/ui/data-table';
-import { DataTableColumnHeader } from '@/components/ui/data-table/data-table-column-header';
-import { FormattedDate } from '@/components/ui/formatted-date';
-import { LoadingScreen } from '@/components/ui/loading-screen';
-import { PushToGitDialog } from '@/features/project-releases/components/push-to-git-dialog';
-import { ApTableActionsMenu } from '@/features/tables/components/ap-table-actions-menu';
-import { ImportTableDialog } from '@/features/tables/components/import-table-dialog';
-import { tableHooks } from '@/features/tables/lib/table-hooks';
-import { tablesApi } from '@/features/tables/lib/tables-api';
+} from '@/components/custom/data-table';
+import { DataTableColumnHeader } from '@/components/custom/data-table/data-table-column-header';
+import { ConfirmationDeleteDialog } from '@/components/custom/delete-dialog';
+import { FormattedDate } from '@/components/custom/formatted-date';
+import { LoadingScreen } from '@/components/custom/loading-screen';
+import { PermissionNeededTooltip } from '@/components/custom/permission-needed-tooltip';
+import { Button } from '@/components/ui/button';
+import { PushToGitDialog } from '@/features/project-releases';
+import { projectCollectionUtils } from '@/features/projects';
+import {
+ tablesApi,
+ ApTableActionsMenu,
+ ImportTableDialog,
+ tableHooks,
+} from '@/features/tables';
import { useAuthorization } from '@/hooks/authorization-hooks';
import { platformHooks } from '@/hooks/platform-hooks';
-import { projectCollectionUtils } from '@/hooks/project-collection';
import { useNewWindow } from '@/lib/navigation-utils';
const ApTablesPage = () => {
diff --git a/packages/web/src/app/routes/templates/empty-templates-view.tsx b/packages/web/src/app/routes/templates/empty-templates-view.tsx
index ad3c811337e..a3d339945b7 100644
--- a/packages/web/src/app/routes/templates/empty-templates-view.tsx
+++ b/packages/web/src/app/routes/templates/empty-templates-view.tsx
@@ -7,7 +7,7 @@ import {
EmptyHeader,
EmptyMedia,
EmptyTitle,
-} from '@/components/ui/empty';
+} from '@/components/custom/empty';
export const EmptyTemplatesView = () => {
return (
diff --git a/packages/web/src/app/routes/templates/id/flow-card.tsx b/packages/web/src/app/routes/templates/id/flow-card.tsx
index 9980f764d94..155bb2ddea7 100644
--- a/packages/web/src/app/routes/templates/id/flow-card.tsx
+++ b/packages/web/src/app/routes/templates/id/flow-card.tsx
@@ -2,7 +2,7 @@ import { FlowVersionTemplate } from '@activepieces/shared';
import { Workflow } from 'lucide-react';
import { Card, CardContent } from '@/components/ui/card';
-import { PieceIconList } from '@/features/pieces/components/piece-icon-list';
+import { PieceIconList } from '@/features/pieces';
type FlowCardProps = {
flow: FlowVersionTemplate;
diff --git a/packages/web/src/app/routes/templates/id/index.tsx b/packages/web/src/app/routes/templates/id/index.tsx
index 5b9d214e9c7..86b99b79aa5 100644
--- a/packages/web/src/app/routes/templates/id/index.tsx
+++ b/packages/web/src/app/routes/templates/id/index.tsx
@@ -18,13 +18,13 @@ import { toast } from 'sonner';
import { FlowCanvas } from '@/app/builder/flow-canvas';
import { CanvasControls } from '@/app/builder/flow-canvas/canvas-controls';
import { BuilderStateProvider } from '@/app/builder/state/builder-state-provider';
+import { TagWithBright } from '@/components/custom/tag-with-bright';
import { Button } from '@/components/ui/button';
import { ScrollArea } from '@/components/ui/scroll-area';
import { useSidebar } from '@/components/ui/sidebar-shadcn';
-import { TagWithBright } from '@/components/ui/tag-with-bright';
import { authenticationSession } from '@/lib/authentication-session';
+import { formatUtils } from '@/lib/format-utils';
import { FROM_QUERY_PARAM } from '@/lib/navigation-utils';
-import { formatUtils } from '@/lib/utils';
import { FlowCard } from './flow-card';
import { PieceCard } from './piece-card';
diff --git a/packages/web/src/app/routes/templates/id/piece-card.tsx b/packages/web/src/app/routes/templates/id/piece-card.tsx
index 3cb9f3fad7a..be7fa7bc81e 100644
--- a/packages/web/src/app/routes/templates/id/piece-card.tsx
+++ b/packages/web/src/app/routes/templates/id/piece-card.tsx
@@ -1,7 +1,6 @@
import { Card, CardContent } from '@/components/ui/card';
-import PieceIconWithPieceName from '@/features/pieces/components/piece-icon-from-name';
-import { piecesHooks } from '@/features/pieces/lib/pieces-hooks';
-import { formatUtils } from '@/lib/utils';
+import { PieceIconWithPieceName, piecesHooks } from '@/features/pieces';
+import { formatUtils } from '@/lib/format-utils';
type PieceCardProps = {
pieceName: string;
diff --git a/packages/web/src/app/routes/templates/id/use-template-dialog.tsx b/packages/web/src/app/routes/templates/id/use-template-dialog.tsx
index 5085d09bbaf..af5ca8778f0 100644
--- a/packages/web/src/app/routes/templates/id/use-template-dialog.tsx
+++ b/packages/web/src/app/routes/templates/id/use-template-dialog.tsx
@@ -30,11 +30,10 @@ import {
SelectTrigger,
SelectValue,
} from '@/components/ui/select';
-import { flowHooks } from '@/features/flows/lib/flow-hooks';
-import { foldersApi } from '@/features/folders/lib/folders-api';
-import { foldersHooks } from '@/features/folders/lib/folders-hooks';
-import { templatesTelemetryApi } from '@/features/templates/lib/templates-telemetry-api';
-import { projectCollectionUtils } from '@/hooks/project-collection';
+import { flowHooks } from '@/features/flows';
+import { foldersApi, foldersHooks } from '@/features/folders';
+import { projectCollectionUtils } from '@/features/projects';
+import { templatesTelemetryApi } from '@/features/templates';
import { authenticationSession } from '@/lib/authentication-session';
type UseTemplateDialogProps = {
diff --git a/packages/web/src/app/routes/templates/index.tsx b/packages/web/src/app/routes/templates/index.tsx
index 039daf44e50..ff4dd01b490 100644
--- a/packages/web/src/app/routes/templates/index.tsx
+++ b/packages/web/src/app/routes/templates/index.tsx
@@ -12,9 +12,8 @@ import { useNavigate } from 'react-router-dom';
import { ApSidebarToggle } from '@/components/custom/ap-sidebar-toggle';
import { InputWithIcon } from '@/components/custom/input-with-icon';
import { Button } from '@/components/ui/button';
-import { flowHooks } from '@/features/flows/lib/flow-hooks';
-import { templatesHooks } from '@/features/templates/hooks/templates-hook';
-import { templatesTelemetryApi } from '@/features/templates/lib/templates-telemetry-api';
+import { flowHooks } from '@/features/flows';
+import { templatesTelemetryApi, templatesHooks } from '@/features/templates';
import { platformHooks } from '@/hooks/platform-hooks';
import { AllCategoriesView } from './all-categories-view';
diff --git a/packages/web/src/app/routes/templates/selected-category-view.tsx b/packages/web/src/app/routes/templates/selected-category-view.tsx
index 16f4a609a7e..dd2113d7e0a 100644
--- a/packages/web/src/app/routes/templates/selected-category-view.tsx
+++ b/packages/web/src/app/routes/templates/selected-category-view.tsx
@@ -8,7 +8,7 @@ import {
EmptyHeader,
EmptyMedia,
EmptyTitle,
-} from '@/components/ui/empty';
+} from '@/components/custom/empty';
import { Skeleton } from '@/components/ui/skeleton';
import { TemplateCardSkeleton } from './skeletons/template-card-skeleton';
diff --git a/packages/web/src/app/routes/templates/template-card.tsx b/packages/web/src/app/routes/templates/template-card.tsx
index abf850f0f4a..404f7b59758 100644
--- a/packages/web/src/app/routes/templates/template-card.tsx
+++ b/packages/web/src/app/routes/templates/template-card.tsx
@@ -1,10 +1,10 @@
import { Template } from '@activepieces/shared';
import { t } from 'i18next';
+import { TagWithBright } from '@/components/custom/tag-with-bright';
import { Card, CardContent } from '@/components/ui/card';
-import { TagWithBright } from '@/components/ui/tag-with-bright';
-import { PieceIconList } from '@/features/pieces/components/piece-icon-list';
-import { useGradientFromPieces } from '@/features/templates/hooks/use-gradient-from-pieces';
+import { PieceIconList } from '@/features/pieces';
+import { useGradientFromPieces } from '@/features/templates';
type TemplateCardProps = {
template: Template;
diff --git a/packages/web/src/components/custom/ap-avatar.tsx b/packages/web/src/components/custom/ap-avatar.tsx
index 1941a794d7e..4da26498cbf 100644
--- a/packages/web/src/components/custom/ap-avatar.tsx
+++ b/packages/web/src/components/custom/ap-avatar.tsx
@@ -10,7 +10,7 @@ import {
import { userHooks } from '@/hooks/user-hooks';
import { cn } from '@/lib/utils';
-import { UserAvatar } from '../ui/user-avatar';
+import { UserAvatar } from './user-avatar';
interface ApAvatarProps {
id: string | null;
diff --git a/packages/web/src/components/custom/array-input.tsx b/packages/web/src/components/custom/array-input.tsx
index 534e53e8d5f..c53173e41e5 100644
--- a/packages/web/src/components/custom/array-input.tsx
+++ b/packages/web/src/components/custom/array-input.tsx
@@ -5,6 +5,7 @@ import { nanoid } from 'nanoid';
import React, { useState } from 'react';
import { useFormContext } from 'react-hook-form';
+import { TextWithIcon } from '@/components/custom/text-with-icon';
import { Button } from '@/components/ui/button';
import { FormControl, FormField, FormItem } from '@/components/ui/form';
import { Input } from '@/components/ui/input';
@@ -13,7 +14,6 @@ import {
SortableDragHandle,
SortableItem,
} from '@/components/ui/sortable';
-import { TextWithIcon } from '@/components/ui/text-with-icon';
import { cn } from '@/lib/utils';
type ArrayInputProps = {
diff --git a/packages/web/src/components/ui/autocomplete.tsx b/packages/web/src/components/custom/autocomplete.tsx
similarity index 94%
rename from packages/web/src/components/ui/autocomplete.tsx
rename to packages/web/src/components/custom/autocomplete.tsx
index 55ccf5cc111..cea54cd0463 100644
--- a/packages/web/src/components/ui/autocomplete.tsx
+++ b/packages/web/src/components/custom/autocomplete.tsx
@@ -1,17 +1,20 @@
import { t } from 'i18next';
import { Check } from 'lucide-react';
-import { cn } from '@/lib/utils';
-
import {
Command,
CommandEmpty,
CommandGroup,
CommandItem,
CommandList,
-} from './command';
-import { Popover, PopoverContent, PopoverTrigger } from './popover';
-import { ScrollArea } from './scroll-area';
+} from '@/components/ui/command';
+import {
+ Popover,
+ PopoverContent,
+ PopoverTrigger,
+} from '@/components/ui/popover';
+import { ScrollArea } from '@/components/ui/scroll-area';
+import { cn } from '@/lib/utils';
type Props = {
selectedValue: T;
diff --git a/packages/web/src/components/ui/color-picker.tsx b/packages/web/src/components/custom/color-picker.tsx
similarity index 95%
rename from packages/web/src/components/ui/color-picker.tsx
rename to packages/web/src/components/custom/color-picker.tsx
index 63fd4a3f989..292a6c90bb9 100644
--- a/packages/web/src/components/ui/color-picker.tsx
+++ b/packages/web/src/components/custom/color-picker.tsx
@@ -11,7 +11,8 @@ import {
PopoverContent,
PopoverTrigger,
} from '@/components/ui/popover';
-import { useForwardedRef, cn } from '@/lib/utils';
+import { useForwardedRef } from '@/hooks/use-forwarded-ref';
+import { cn } from '@/lib/utils';
interface ColorPickerProps {
value: string;
diff --git a/packages/web/src/components/data-list.tsx b/packages/web/src/components/custom/data-list.tsx
similarity index 100%
rename from packages/web/src/components/data-list.tsx
rename to packages/web/src/components/custom/data-list.tsx
diff --git a/packages/web/src/components/ui/data-table/data-table-bulk-actions.tsx b/packages/web/src/components/custom/data-table/data-table-bulk-actions.tsx
similarity index 100%
rename from packages/web/src/components/ui/data-table/data-table-bulk-actions.tsx
rename to packages/web/src/components/custom/data-table/data-table-bulk-actions.tsx
diff --git a/packages/web/src/components/ui/data-table/data-table-checkbox-filter.tsx b/packages/web/src/components/custom/data-table/data-table-checkbox-filter.tsx
similarity index 100%
rename from packages/web/src/components/ui/data-table/data-table-checkbox-filter.tsx
rename to packages/web/src/components/custom/data-table/data-table-checkbox-filter.tsx
diff --git a/packages/web/src/components/ui/data-table/data-table-column-header.tsx b/packages/web/src/components/custom/data-table/data-table-column-header.tsx
similarity index 100%
rename from packages/web/src/components/ui/data-table/data-table-column-header.tsx
rename to packages/web/src/components/custom/data-table/data-table-column-header.tsx
diff --git a/packages/web/src/components/ui/data-table/data-table-filter.tsx b/packages/web/src/components/custom/data-table/data-table-filter.tsx
similarity index 97%
rename from packages/web/src/components/ui/data-table/data-table-filter.tsx
rename to packages/web/src/components/custom/data-table/data-table-filter.tsx
index ca81797b91f..a871b6f914b 100644
--- a/packages/web/src/components/ui/data-table/data-table-filter.tsx
+++ b/packages/web/src/components/custom/data-table/data-table-filter.tsx
@@ -3,7 +3,10 @@ import * as React from 'react';
import { DateRange } from 'react-day-picker';
import { useSearchParams } from 'react-router-dom';
-import { DateTimePickerWithRange, PresetKey } from '../date-time-picker-range';
+import {
+ DateTimePickerWithRange,
+ PresetKey,
+} from '@/components/custom/date-time-picker-range';
import { DataTableInputCheckbox } from './data-table-checkbox-filter';
import { DataTableInputPopover } from './data-table-input-popover';
diff --git a/packages/web/src/components/ui/data-table/data-table-input-popover.tsx b/packages/web/src/components/custom/data-table/data-table-input-popover.tsx
similarity index 82%
rename from packages/web/src/components/ui/data-table/data-table-input-popover.tsx
rename to packages/web/src/components/custom/data-table/data-table-input-popover.tsx
index bed84859a54..f67036138df 100644
--- a/packages/web/src/components/ui/data-table/data-table-input-popover.tsx
+++ b/packages/web/src/components/custom/data-table/data-table-input-popover.tsx
@@ -3,11 +3,15 @@ import { SearchIcon } from 'lucide-react';
import { useEffect, useState } from 'react';
import { useDebounce } from 'use-debounce';
-import { Badge } from '../badge';
-import { Button } from '../button';
-import { Popover, PopoverContent, PopoverTrigger } from '../popover';
-import { SearchInput } from '../search-input';
-import { Separator } from '../separator';
+import { SearchInput } from '@/components/custom/search-input';
+import { Badge } from '@/components/ui/badge';
+import { Button } from '@/components/ui/button';
+import {
+ Popover,
+ PopoverContent,
+ PopoverTrigger,
+} from '@/components/ui/popover';
+import { Separator } from '@/components/ui/separator';
type DataTableInputPopoverProps = {
title?: string;
diff --git a/packages/web/src/components/ui/data-table/data-table-select-popover.tsx b/packages/web/src/components/custom/data-table/data-table-select-popover.tsx
similarity index 93%
rename from packages/web/src/components/ui/data-table/data-table-select-popover.tsx
rename to packages/web/src/components/custom/data-table/data-table-select-popover.tsx
index 70e5f14c475..ce50d82656e 100644
--- a/packages/web/src/components/ui/data-table/data-table-select-popover.tsx
+++ b/packages/web/src/components/custom/data-table/data-table-select-popover.tsx
@@ -1,9 +1,7 @@
import { CheckIcon, ListFilterIcon } from 'lucide-react';
-import { cn } from '@/lib/utils';
-
-import { Badge } from '../badge';
-import { Button } from '../button';
+import { Badge } from '@/components/ui/badge';
+import { Button } from '@/components/ui/button';
import {
Command,
CommandEmpty,
@@ -12,10 +10,15 @@ import {
CommandItem,
CommandList,
CommandSeparator,
-} from '../command';
-import { Popover, PopoverContent, PopoverTrigger } from '../popover';
-import { ScrollArea } from '../scroll-area';
-import { Separator } from '../separator';
+} from '@/components/ui/command';
+import {
+ Popover,
+ PopoverContent,
+ PopoverTrigger,
+} from '@/components/ui/popover';
+import { ScrollArea } from '@/components/ui/scroll-area';
+import { Separator } from '@/components/ui/separator';
+import { cn } from '@/lib/utils';
type DataTableSelectPopoverProps = {
title?: string;
diff --git a/packages/web/src/components/ui/data-table/data-table-skeleton.tsx b/packages/web/src/components/custom/data-table/data-table-skeleton.tsx
similarity index 100%
rename from packages/web/src/components/ui/data-table/data-table-skeleton.tsx
rename to packages/web/src/components/custom/data-table/data-table-skeleton.tsx
diff --git a/packages/web/src/components/ui/data-table/data-table-toolbar.tsx b/packages/web/src/components/custom/data-table/data-table-toolbar.tsx
similarity index 100%
rename from packages/web/src/components/ui/data-table/data-table-toolbar.tsx
rename to packages/web/src/components/custom/data-table/data-table-toolbar.tsx
diff --git a/packages/web/src/components/ui/data-table/index.tsx b/packages/web/src/components/custom/data-table/index.tsx
similarity index 99%
rename from packages/web/src/components/ui/data-table/index.tsx
rename to packages/web/src/components/custom/data-table/index.tsx
index 9947ae5c829..4432084d307 100644
--- a/packages/web/src/components/ui/data-table/index.tsx
+++ b/packages/web/src/components/custom/data-table/index.tsx
@@ -15,6 +15,15 @@ import React, { useState, useEffect } from 'react';
import { useSearchParams } from 'react-router-dom';
import { useDeepCompareEffect } from 'react-use';
+import { Button } from '@/components/ui/button';
+import { Checkbox } from '@/components/ui/checkbox';
+import {
+ Select,
+ SelectTrigger,
+ SelectValue,
+ SelectContent,
+ SelectItem,
+} from '@/components/ui/select';
import {
Table,
TableBody,
@@ -25,16 +34,6 @@ import {
} from '@/components/ui/table';
import { cn } from '@/lib/utils';
-import { Button } from '../button';
-import { Checkbox } from '../checkbox';
-import {
- Select,
- SelectTrigger,
- SelectValue,
- SelectContent,
- SelectItem,
-} from '../select';
-
import { DataTableBulkActions } from './data-table-bulk-actions';
import { DataTableColumnHeader } from './data-table-column-header';
import { DataTableFilter, DataTableFilterProps } from './data-table-filter';
diff --git a/packages/web/src/components/ui/data-table/truncated-column-text-value.tsx b/packages/web/src/components/custom/data-table/truncated-column-text-value.tsx
similarity index 100%
rename from packages/web/src/components/ui/data-table/truncated-column-text-value.tsx
rename to packages/web/src/components/custom/data-table/truncated-column-text-value.tsx
diff --git a/packages/web/src/components/ui/date-time-picker-range.tsx b/packages/web/src/components/custom/date-time-picker-range.tsx
similarity index 98%
rename from packages/web/src/components/ui/date-time-picker-range.tsx
rename to packages/web/src/components/custom/date-time-picker-range.tsx
index a66f61df426..c2bd70afabc 100644
--- a/packages/web/src/components/ui/date-time-picker-range.tsx
+++ b/packages/web/src/components/custom/date-time-picker-range.tsx
@@ -4,6 +4,7 @@ import { Calendar as CalendarIcon, Clock } from 'lucide-react';
import * as React from 'react';
import { DateRange } from 'react-day-picker';
+import { TimePicker } from '@/components/custom/time-picker';
import { Button } from '@/components/ui/button';
import { Calendar } from '@/components/ui/calendar';
import {
@@ -18,11 +19,9 @@ import {
SelectTrigger,
SelectValue,
} from '@/components/ui/select';
+import { Separator } from '@/components/ui/separator';
import { cn } from '@/lib/utils';
-import { Separator } from './separator';
-import { TimePicker } from './time-picker';
-
export type PresetKey =
| '7days'
| '14days'
diff --git a/packages/web/src/components/delete-dialog.tsx b/packages/web/src/components/custom/delete-dialog.tsx
similarity index 100%
rename from packages/web/src/components/delete-dialog.tsx
rename to packages/web/src/components/custom/delete-dialog.tsx
diff --git a/packages/web/src/components/ui/dot.tsx b/packages/web/src/components/custom/dot.tsx
similarity index 100%
rename from packages/web/src/components/ui/dot.tsx
rename to packages/web/src/components/custom/dot.tsx
diff --git a/packages/web/src/components/ui/editable-text.tsx b/packages/web/src/components/custom/editable-text.tsx
similarity index 97%
rename from packages/web/src/components/ui/editable-text.tsx
rename to packages/web/src/components/custom/editable-text.tsx
index b6c458c502b..b9f4b0d4d2e 100644
--- a/packages/web/src/components/ui/editable-text.tsx
+++ b/packages/web/src/components/custom/editable-text.tsx
@@ -1,7 +1,11 @@
import { isNil } from '@activepieces/shared';
import { useState, useRef, useCallback } from 'react';
-import { Tooltip, TooltipContent, TooltipTrigger } from './tooltip';
+import {
+ Tooltip,
+ TooltipContent,
+ TooltipTrigger,
+} from '@/components/ui/tooltip';
type EditableTextProps = {
value: string | undefined;
diff --git a/packages/web/src/components/ui/empty.tsx b/packages/web/src/components/custom/empty.tsx
similarity index 100%
rename from packages/web/src/components/ui/empty.tsx
rename to packages/web/src/components/custom/empty.tsx
diff --git a/packages/web/src/components/ui/field.tsx b/packages/web/src/components/custom/field.tsx
similarity index 100%
rename from packages/web/src/components/ui/field.tsx
rename to packages/web/src/components/custom/field.tsx
diff --git a/packages/web/src/components/ui/formatted-date.tsx b/packages/web/src/components/custom/formatted-date.tsx
similarity index 94%
rename from packages/web/src/components/ui/formatted-date.tsx
rename to packages/web/src/components/custom/formatted-date.tsx
index 9c45a605ca3..01cfe381d65 100644
--- a/packages/web/src/components/ui/formatted-date.tsx
+++ b/packages/web/src/components/custom/formatted-date.tsx
@@ -3,7 +3,7 @@ import {
TooltipContent,
TooltipTrigger,
} from '@/components/ui/tooltip';
-import { formatUtils } from '@/lib/utils';
+import { formatUtils } from '@/lib/format-utils';
type FormattedDateProps = {
date: Date;
diff --git a/packages/web/src/components/ui/full-logo.tsx b/packages/web/src/components/custom/full-logo.tsx
similarity index 100%
rename from packages/web/src/components/ui/full-logo.tsx
rename to packages/web/src/components/custom/full-logo.tsx
diff --git a/packages/web/src/components/ui/home-button.tsx b/packages/web/src/components/custom/home-button.tsx
similarity index 90%
rename from packages/web/src/components/ui/home-button.tsx
rename to packages/web/src/components/custom/home-button.tsx
index f1e43efdcd7..113376f848a 100644
--- a/packages/web/src/components/ui/home-button.tsx
+++ b/packages/web/src/components/custom/home-button.tsx
@@ -3,14 +3,16 @@ import { t } from 'i18next';
import { ChevronLeft } from 'lucide-react';
import { Link } from 'react-router-dom';
+import { useEmbedding } from '@/components/providers/embed-provider';
+import { Button } from '@/components/ui/button';
+import {
+ Tooltip,
+ TooltipContent,
+ TooltipTrigger,
+} from '@/components/ui/tooltip';
import { flagsHooks } from '@/hooks/flags-hooks';
import { authenticationSession } from '@/lib/authentication-session';
-import { useEmbedding } from '../embed-provider';
-
-import { Button } from './button';
-import { Tooltip, TooltipContent, TooltipTrigger } from './tooltip';
-
const HomeButtonWrapper = ({ children }: { children: React.ReactNode }) => {
const { embedState } = useEmbedding();
if (embedState.emitHomeButtonClickedEvent) {
diff --git a/packages/web/src/components/ui/image-with-color-background.tsx b/packages/web/src/components/custom/image-with-color-background.tsx
similarity index 100%
rename from packages/web/src/components/ui/image-with-color-background.tsx
rename to packages/web/src/components/custom/image-with-color-background.tsx
diff --git a/packages/web/src/components/ui/image-with-fallback.tsx b/packages/web/src/components/custom/image-with-fallback.tsx
similarity index 100%
rename from packages/web/src/components/ui/image-with-fallback.tsx
rename to packages/web/src/components/custom/image-with-fallback.tsx
diff --git a/packages/web/src/components/ui/item.tsx b/packages/web/src/components/custom/item.tsx
similarity index 100%
rename from packages/web/src/components/ui/item.tsx
rename to packages/web/src/components/custom/item.tsx
diff --git a/packages/web/src/components/custom/json-editor.tsx b/packages/web/src/components/custom/json-editor.tsx
index a9dcb9747e4..61defaaa4c8 100644
--- a/packages/web/src/components/custom/json-editor.tsx
+++ b/packages/web/src/components/custom/json-editor.tsx
@@ -8,7 +8,7 @@ import CodeMirror, {
import React, { RefObject, useRef, useState } from 'react';
import { ControllerRenderProps } from 'react-hook-form';
-import { useTheme } from '@/components/theme-provider';
+import { useTheme } from '@/components/providers/theme-provider';
import { cn } from '@/lib/utils';
const styleTheme = EditorView.baseTheme({
diff --git a/packages/web/src/components/json-viewer.tsx b/packages/web/src/components/custom/json-viewer.tsx
similarity index 97%
rename from packages/web/src/components/json-viewer.tsx
rename to packages/web/src/components/custom/json-viewer.tsx
index b2323f12e6e..236664da435 100644
--- a/packages/web/src/components/json-viewer.tsx
+++ b/packages/web/src/components/custom/json-viewer.tsx
@@ -6,16 +6,16 @@ import { createRoot } from 'react-dom/client';
import ReactJson from 'react-json-view';
import { toast } from 'sonner';
-import { useTheme } from '@/components/theme-provider';
+import { useTheme } from '@/components/providers/theme-provider';
+import { Button } from '@/components/ui/button';
import {
Tooltip,
TooltipContent,
TooltipProvider,
TooltipTrigger,
} from '@/components/ui/tooltip';
-import { cn, isStepFileUrl } from '@/lib/utils';
-
-import { Button } from './ui/button';
+import { isStepFileUrl } from '@/lib/dom-utils';
+import { cn } from '@/lib/utils';
type JsonViewerProps = {
json: any;
diff --git a/packages/web/src/components/ui/loading-screen.tsx b/packages/web/src/components/custom/loading-screen.tsx
similarity index 84%
rename from packages/web/src/components/ui/loading-screen.tsx
rename to packages/web/src/components/custom/loading-screen.tsx
index 8f1d1dfe900..3c6d6a23a44 100644
--- a/packages/web/src/components/ui/loading-screen.tsx
+++ b/packages/web/src/components/custom/loading-screen.tsx
@@ -1,6 +1,5 @@
-import { cn } from '../../lib/utils';
-
-import { LoadingSpinner } from './spinner';
+import { LoadingSpinner } from '@/components/custom/spinner';
+import { cn } from '@/lib/utils';
type LoadingScreenProps = {
brightSpinner?: boolean;
diff --git a/packages/web/src/components/ui/locked-alert.tsx b/packages/web/src/components/custom/locked-alert.tsx
similarity index 100%
rename from packages/web/src/components/ui/locked-alert.tsx
rename to packages/web/src/components/custom/locked-alert.tsx
diff --git a/packages/web/src/components/ui/markdown-input/index.tsx b/packages/web/src/components/custom/markdown-input/index.tsx
similarity index 100%
rename from packages/web/src/components/ui/markdown-input/index.tsx
rename to packages/web/src/components/custom/markdown-input/index.tsx
diff --git a/packages/web/src/components/ui/markdown-input/tools.tsx b/packages/web/src/components/custom/markdown-input/tools.tsx
similarity index 94%
rename from packages/web/src/components/ui/markdown-input/tools.tsx
rename to packages/web/src/components/custom/markdown-input/tools.tsx
index a8898a47e10..911d274cd0f 100644
--- a/packages/web/src/components/ui/markdown-input/tools.tsx
+++ b/packages/web/src/components/custom/markdown-input/tools.tsx
@@ -10,10 +10,18 @@ import {
} from 'lucide-react';
import { useEffect, useRef, useState } from 'react';
-import { Button } from '../button';
-import { Input } from '../input';
-import { Popover, PopoverContent, PopoverTrigger } from '../popover';
-import { Tooltip, TooltipContent, TooltipTrigger } from '../tooltip';
+import { Button } from '@/components/ui/button';
+import { Input } from '@/components/ui/input';
+import {
+ Popover,
+ PopoverContent,
+ PopoverTrigger,
+} from '@/components/ui/popover';
+import {
+ Tooltip,
+ TooltipContent,
+ TooltipTrigger,
+} from '@/components/ui/tooltip';
export const MarkdownTools = ({ editor }: { editor: Editor }) => {
const isStrikeActive = editor.isActive('strike');
diff --git a/packages/web/src/components/ui/message-tooltip.tsx b/packages/web/src/components/custom/message-tooltip.tsx
similarity index 100%
rename from packages/web/src/components/ui/message-tooltip.tsx
rename to packages/web/src/components/custom/message-tooltip.tsx
diff --git a/packages/web/src/components/custom/page-header.tsx b/packages/web/src/components/custom/page-header.tsx
index 405d2c78875..9e1cc87e9b9 100644
--- a/packages/web/src/components/custom/page-header.tsx
+++ b/packages/web/src/components/custom/page-header.tsx
@@ -1,6 +1,6 @@
import { ReactNode } from 'react';
-import { useEmbedding } from '@/components/embed-provider';
+import { useEmbedding } from '@/components/providers/embed-provider';
interface PageHeaderProps {
title: ReactNode;
diff --git a/packages/web/src/components/ui/read-more-description.tsx b/packages/web/src/components/custom/read-more-description.tsx
similarity index 100%
rename from packages/web/src/components/ui/read-more-description.tsx
rename to packages/web/src/components/custom/read-more-description.tsx
diff --git a/packages/web/src/components/ui/search-input.tsx b/packages/web/src/components/custom/search-input.tsx
similarity index 92%
rename from packages/web/src/components/ui/search-input.tsx
rename to packages/web/src/components/custom/search-input.tsx
index c44877c031d..e6ecc9e3d0b 100644
--- a/packages/web/src/components/ui/search-input.tsx
+++ b/packages/web/src/components/custom/search-input.tsx
@@ -2,11 +2,10 @@ import { t } from 'i18next';
import { Search, X } from 'lucide-react';
import * as React from 'react';
+import { Input, inputClass } from '@/components/ui/input';
import { cn } from '@/lib/utils';
-import { SelectUtilButton } from '../custom/select-util-button';
-
-import { Input, inputClass } from './input';
+import { SelectUtilButton } from './select-util-button';
export type SearchInputProps = Omit<
React.InputHTMLAttributes,
diff --git a/packages/web/src/components/ui/shortcut.tsx b/packages/web/src/components/custom/shortcut.tsx
similarity index 100%
rename from packages/web/src/components/ui/shortcut.tsx
rename to packages/web/src/components/custom/shortcut.tsx
diff --git a/packages/web/src/components/show-powered-by.tsx b/packages/web/src/components/custom/show-powered-by.tsx
similarity index 98%
rename from packages/web/src/components/show-powered-by.tsx
rename to packages/web/src/components/custom/show-powered-by.tsx
index 9f3614d4323..6e0f4739343 100644
--- a/packages/web/src/components/show-powered-by.tsx
+++ b/packages/web/src/components/custom/show-powered-by.tsx
@@ -1,4 +1,4 @@
-import { cn } from '../lib/utils';
+import { cn } from '@/lib/utils';
type ShowPoweredByProps = {
show: boolean;
diff --git a/packages/web/src/components/simple-json-viewer.tsx b/packages/web/src/components/custom/simple-json-viewer.tsx
similarity index 96%
rename from packages/web/src/components/simple-json-viewer.tsx
rename to packages/web/src/components/custom/simple-json-viewer.tsx
index c137b771e68..cd597df8cbe 100644
--- a/packages/web/src/components/simple-json-viewer.tsx
+++ b/packages/web/src/components/custom/simple-json-viewer.tsx
@@ -4,8 +4,8 @@ import React, { useState } from 'react';
import ReactJson from 'react-json-view';
import { toast } from 'sonner';
-import { useTheme } from './theme-provider';
-import { Button } from './ui/button';
+import { useTheme } from '@/components/providers/theme-provider';
+import { Button } from '@/components/ui/button';
interface SimpleJsonViewerProps {
data: any;
diff --git a/packages/web/src/components/ui/spinner.tsx b/packages/web/src/components/custom/spinner.tsx
similarity index 100%
rename from packages/web/src/components/ui/spinner.tsx
rename to packages/web/src/components/custom/spinner.tsx
diff --git a/packages/web/src/components/ui/status-icon-with-text.tsx b/packages/web/src/components/custom/status-icon-with-text.tsx
similarity index 100%
rename from packages/web/src/components/ui/status-icon-with-text.tsx
rename to packages/web/src/components/custom/status-icon-with-text.tsx
diff --git a/packages/web/src/components/ui/tag-input.tsx b/packages/web/src/components/custom/tag-input.tsx
similarity index 95%
rename from packages/web/src/components/ui/tag-input.tsx
rename to packages/web/src/components/custom/tag-input.tsx
index 9308aeca33a..d10ea4b3679 100644
--- a/packages/web/src/components/ui/tag-input.tsx
+++ b/packages/web/src/components/custom/tag-input.tsx
@@ -3,12 +3,12 @@
import { XIcon } from 'lucide-react';
import { forwardRef, useCallback, useEffect, useRef, useState } from 'react';
-import { cn, formatUtils } from '@/lib/utils';
-
-import { Badge } from './badge';
-import { Button } from './button';
-import type { InputProps } from './input';
-import { ScrollArea } from './scroll-area';
+import { Badge } from '@/components/ui/badge';
+import { Button } from '@/components/ui/button';
+import type { InputProps } from '@/components/ui/input';
+import { ScrollArea } from '@/components/ui/scroll-area';
+import { formatUtils } from '@/lib/format-utils';
+import { cn } from '@/lib/utils';
type TagInputProps = Omit & {
value?: ReadonlyArray;
diff --git a/packages/web/src/components/ui/tag-with-bright.tsx b/packages/web/src/components/custom/tag-with-bright.tsx
similarity index 100%
rename from packages/web/src/components/ui/tag-with-bright.tsx
rename to packages/web/src/components/custom/tag-with-bright.tsx
diff --git a/packages/web/src/components/ui/text-with-icon.tsx b/packages/web/src/components/custom/text-with-icon.tsx
similarity index 100%
rename from packages/web/src/components/ui/text-with-icon.tsx
rename to packages/web/src/components/custom/text-with-icon.tsx
diff --git a/packages/web/src/components/ui/time-period-select.tsx b/packages/web/src/components/custom/time-period-select.tsx
similarity index 100%
rename from packages/web/src/components/ui/time-period-select.tsx
rename to packages/web/src/components/custom/time-period-select.tsx
diff --git a/packages/web/src/components/ui/time-picker-utils.ts b/packages/web/src/components/custom/time-picker-utils.ts
similarity index 100%
rename from packages/web/src/components/ui/time-picker-utils.ts
rename to packages/web/src/components/custom/time-picker-utils.ts
diff --git a/packages/web/src/components/ui/time-picker.tsx b/packages/web/src/components/custom/time-picker.tsx
similarity index 100%
rename from packages/web/src/components/ui/time-picker.tsx
rename to packages/web/src/components/custom/time-picker.tsx
diff --git a/packages/web/src/components/ui/time-unit-input.tsx b/packages/web/src/components/custom/time-unit-input.tsx
similarity index 100%
rename from packages/web/src/components/ui/time-unit-input.tsx
rename to packages/web/src/components/custom/time-unit-input.tsx
diff --git a/packages/web/src/components/ui/user-avatar.tsx b/packages/web/src/components/custom/user-avatar.tsx
similarity index 93%
rename from packages/web/src/components/ui/user-avatar.tsx
rename to packages/web/src/components/custom/user-avatar.tsx
index 68cce08bb4a..c45395933fe 100644
--- a/packages/web/src/components/ui/user-avatar.tsx
+++ b/packages/web/src/components/custom/user-avatar.tsx
@@ -1,10 +1,13 @@
import { isNil } from '@activepieces/shared';
import Avatar from 'boring-avatars';
+import {
+ Tooltip,
+ TooltipTrigger,
+ TooltipContent,
+} from '@/components/ui/tooltip';
import { cn } from '@/lib/utils';
-import { Tooltip, TooltipTrigger, TooltipContent } from './tooltip';
-
type UserAvatarProps = {
name: string;
email: string;
diff --git a/packages/web/src/components/embed-provider.tsx b/packages/web/src/components/providers/embed-provider.tsx
similarity index 100%
rename from packages/web/src/components/embed-provider.tsx
rename to packages/web/src/components/providers/embed-provider.tsx
diff --git a/packages/web/src/components/socket-provider.tsx b/packages/web/src/components/providers/socket-provider.tsx
similarity index 100%
rename from packages/web/src/components/socket-provider.tsx
rename to packages/web/src/components/providers/socket-provider.tsx
diff --git a/packages/web/src/components/telemetry-provider.tsx b/packages/web/src/components/providers/telemetry-provider.tsx
similarity index 100%
rename from packages/web/src/components/telemetry-provider.tsx
rename to packages/web/src/components/providers/telemetry-provider.tsx
diff --git a/packages/web/src/components/theme-provider.tsx b/packages/web/src/components/providers/theme-provider.tsx
similarity index 98%
rename from packages/web/src/components/theme-provider.tsx
rename to packages/web/src/components/providers/theme-provider.tsx
index 44142f8bb85..fe5812ea58f 100644
--- a/packages/web/src/components/theme-provider.tsx
+++ b/packages/web/src/components/providers/theme-provider.tsx
@@ -2,7 +2,7 @@ import { createContext, useContext, useEffect, useState } from 'react';
import * as RippleHook from 'use-ripple-hook';
import { flagsHooks } from '@/hooks/flags-hooks';
-import { colorsUtils } from '@/lib/color-util';
+import { colorsUtils } from '@/lib/color-utils';
type Theme = 'dark' | 'light' | 'system';
diff --git a/packages/web/src/components/ui/button.tsx b/packages/web/src/components/ui/button.tsx
index 909822d6a76..b8a024aa63b 100644
--- a/packages/web/src/components/ui/button.tsx
+++ b/packages/web/src/components/ui/button.tsx
@@ -2,11 +2,10 @@ import { Slot } from '@radix-ui/react-slot';
import { cva, type VariantProps } from 'class-variance-authority';
import * as React from 'react';
+import { Shortcut } from '@/components/custom/shortcut';
+import { LoadingSpinner } from '@/components/custom/spinner';
import { cn } from '@/lib/utils';
-import { Shortcut } from './shortcut';
-import { LoadingSpinner } from './spinner';
-
const buttonVariants = cva(
"inline-flex items-center justify-center whitespace-nowrap rounded-md text-sm font-medium transition-all disabled:pointer-events-none disabled:opacity-50 [&_svg]:pointer-events-none [&_svg:not([class*='size-'])]:size-4 shrink-0 [&_svg]:shrink-0 outline-hidden focus-visible:border-ring focus-visible:ring-ring/50 focus-visible:ring-[3px] aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive",
{
diff --git a/packages/web/src/components/ui/number-input.tsx b/packages/web/src/components/ui/number-input.tsx
deleted file mode 100644
index 321e1a0cc2b..00000000000
--- a/packages/web/src/components/ui/number-input.tsx
+++ /dev/null
@@ -1,76 +0,0 @@
-import { MinusIcon, PlusIcon } from 'lucide-react';
-import React from 'react';
-
-import { Button } from '@/components/ui/button';
-import { Input } from '@/components/ui/input';
-
-interface NumberInputWithButtonsProps {
- value: number;
- onChange: (value: number) => void;
- min?: number;
- max?: number;
- step?: number;
- disabled?: boolean;
- className?: string;
-}
-
-const NumberInputWithButtons: React.FC = ({
- value,
- onChange,
- min = 0,
- max = Infinity,
- step = 1,
- disabled = false,
- className = '',
-}) => {
- const handleChange = (e: React.ChangeEvent) => {
- const newValue = parseInt(e.target.value) || 0;
- onChange(Math.min(Math.max(newValue, min), max));
- };
-
- const increment = () => {
- if (disabled) return;
- onChange(Math.min(value + step, max));
- };
-
- const decrement = () => {
- if (disabled) return;
- onChange(Math.max(value - step, min));
- };
-
- return (
-
-
-
-
-
- );
-};
-
-export default NumberInputWithButtons;
diff --git a/packages/web/src/components/ui/progress-circle.tsx b/packages/web/src/components/ui/progress-circle.tsx
deleted file mode 100644
index 19cfa32f063..00000000000
--- a/packages/web/src/components/ui/progress-circle.tsx
+++ /dev/null
@@ -1,26 +0,0 @@
-import * as ProgressPrimitive from '@radix-ui/react-progress';
-import * as React from 'react';
-
-import { cn } from '@/lib/utils';
-
-const Progress = React.forwardRef<
- React.ElementRef,
- React.ComponentPropsWithoutRef
->(({ className, value, ...props }, ref) => (
-
-
-
-));
-Progress.displayName = ProgressPrimitive.Root.displayName;
-
-export { Progress };
diff --git a/packages/web/src/components/ui/sonner.tsx b/packages/web/src/components/ui/sonner.tsx
index fe55a8d5778..b834db783f4 100644
--- a/packages/web/src/components/ui/sonner.tsx
+++ b/packages/web/src/components/ui/sonner.tsx
@@ -9,7 +9,7 @@ import {
} from 'lucide-react';
import { Toaster as Sonner, toast, type ToasterProps } from 'sonner';
-import { useTheme } from '@/components/theme-provider';
+import { useTheme } from '@/components/providers/theme-provider';
export const INTERNAL_ERROR_MESSAGE =
'An unexpected error occurred. Please try again in a moment.';
diff --git a/packages/web/src/features/agents/agent-timeline/timeline-blocks.tsx b/packages/web/src/features/agents/agent-timeline/timeline-blocks.tsx
index 27f55139c5d..c60702b7571 100644
--- a/packages/web/src/features/agents/agent-timeline/timeline-blocks.tsx
+++ b/packages/web/src/features/agents/agent-timeline/timeline-blocks.tsx
@@ -21,10 +21,10 @@ import {
} from 'lucide-react';
import { useMemo, useState } from 'react';
+import { DataList } from '@/components/custom/data-list';
+import { JsonViewer } from '@/components/custom/json-viewer';
import { ApMarkdown } from '@/components/custom/markdown';
-import { DataList } from '@/components/data-list';
-import { JsonViewer } from '@/components/json-viewer';
-import { SimpleJsonViewer } from '@/components/simple-json-viewer';
+import { SimpleJsonViewer } from '@/components/custom/simple-json-viewer';
import {
Accordion,
AccordionItem,
diff --git a/packages/web/src/features/agents/agent-tool-hooks.ts b/packages/web/src/features/agents/agent-tool-hooks.ts
index 00cbfc54d4b..a96ca83ba1c 100644
--- a/packages/web/src/features/agents/agent-tool-hooks.ts
+++ b/packages/web/src/features/agents/agent-tool-hooks.ts
@@ -1,7 +1,7 @@
import { ToolCallType, type ToolCallContentBlock } from '@activepieces/shared';
import { useQuery } from '@tanstack/react-query';
-import { piecesApi } from '../pieces/lib/pieces-api';
+import { piecesApi } from '../pieces/api/pieces-api';
type ToolMetadata = {
displayName?: string | null;
diff --git a/packages/web/src/features/agents/agent-tools/componenets/piece-tool.tsx b/packages/web/src/features/agents/agent-tools/componenets/piece-tool.tsx
index 59430770299..5f7f8e4baf9 100644
--- a/packages/web/src/features/agents/agent-tools/componenets/piece-tool.tsx
+++ b/packages/web/src/features/agents/agent-tools/componenets/piece-tool.tsx
@@ -15,8 +15,8 @@ import {
TooltipContent,
TooltipTrigger,
} from '@/components/ui/tooltip';
-import { stepsHooks } from '@/features/pieces/lib/steps-hooks';
-import { PieceStepMetadataWithSuggestions } from '@/lib/types';
+import { stepsHooks } from '@/features/pieces/hooks/steps-hooks';
+import { PieceStepMetadataWithSuggestions } from '@/features/pieces/types';
import { usePieceToolsDialogStore } from '../stores/pieces-tools';
diff --git a/packages/web/src/features/agents/agent-tools/flow-tool-dialog/create-mcp-flow-button.tsx b/packages/web/src/features/agents/agent-tools/flow-tool-dialog/create-mcp-flow-button.tsx
index 1b200c0f310..a4f7f481dc3 100644
--- a/packages/web/src/features/agents/agent-tools/flow-tool-dialog/create-mcp-flow-button.tsx
+++ b/packages/web/src/features/agents/agent-tools/flow-tool-dialog/create-mcp-flow-button.tsx
@@ -1,7 +1,7 @@
import { t } from 'i18next';
import { Button } from '@/components/ui/button';
-import { flowHooks } from '@/features/flows/lib/flow-hooks';
+import { flowHooks } from '@/features/flows/hooks/flow-hooks';
export const CreateMcpFlowButton = () => {
const { mutate: createMcpFlow, isPending } = flowHooks.useCreateMcpFlow();
diff --git a/packages/web/src/features/agents/agent-tools/flow-tool-dialog/index.tsx b/packages/web/src/features/agents/agent-tools/flow-tool-dialog/index.tsx
index 0a85c415284..5136faf0914 100644
--- a/packages/web/src/features/agents/agent-tools/flow-tool-dialog/index.tsx
+++ b/packages/web/src/features/agents/agent-tools/flow-tool-dialog/index.tsx
@@ -21,7 +21,7 @@ import {
} from '@/components/ui/dialog';
import { Input } from '@/components/ui/input';
import { ScrollArea } from '@/components/ui/scroll-area';
-import { flowsApi } from '@/features/flows/lib/flows-api';
+import { flowsApi } from '@/features/flows/api/flows-api';
import { authenticationSession } from '@/lib/authentication-session';
import { useFlowToolDialogStore } from '../stores/flows-tools';
diff --git a/packages/web/src/features/agents/agent-tools/piece-tool-dialog/connection-select.tsx b/packages/web/src/features/agents/agent-tools/piece-tool-dialog/connection-select.tsx
index b65c0d2e529..2ceaee812c3 100644
--- a/packages/web/src/features/agents/agent-tools/piece-tool-dialog/connection-select.tsx
+++ b/packages/web/src/features/agents/agent-tools/piece-tool-dialog/connection-select.tsx
@@ -5,7 +5,7 @@ import React, { useState } from 'react';
// eslint-disable-next-line import/no-restricted-paths
import { CreateOrEditConnectionDialog } from '@/app/connections/create-edit-connection-dialog';
import { SearchableSelect } from '@/components/custom/searchable-select';
-import { appConnectionsQueries } from '@/features/connections/lib/app-connections-hooks';
+import { appConnectionsQueries } from '@/features/connections/hooks/app-connections-hooks';
import { authenticationSession } from '@/lib/authentication-session';
type ConnectionDropdownProps = {
diff --git a/packages/web/src/features/agents/agent-tools/piece-tool-dialog/dialog-pages/pieces-list.tsx b/packages/web/src/features/agents/agent-tools/piece-tool-dialog/dialog-pages/pieces-list.tsx
index 4d396b9bd87..0daa8854643 100644
--- a/packages/web/src/features/agents/agent-tools/piece-tool-dialog/dialog-pages/pieces-list.tsx
+++ b/packages/web/src/features/agents/agent-tools/piece-tool-dialog/dialog-pages/pieces-list.tsx
@@ -5,7 +5,7 @@ import React from 'react';
import { Input } from '@/components/ui/input';
import { ScrollArea } from '@/components/ui/scroll-area';
import { Skeleton } from '@/components/ui/skeleton';
-import { PieceStepMetadataWithSuggestions } from '@/lib/types';
+import { PieceStepMetadataWithSuggestions } from '@/features/pieces/types';
import { usePieceToolsDialogStore } from '../../stores/pieces-tools';
diff --git a/packages/web/src/features/agents/agent-tools/stores/pieces-tools.ts b/packages/web/src/features/agents/agent-tools/stores/pieces-tools.ts
index 0665f7b7338..1b84f8c45e6 100644
--- a/packages/web/src/features/agents/agent-tools/stores/pieces-tools.ts
+++ b/packages/web/src/features/agents/agent-tools/stores/pieces-tools.ts
@@ -8,7 +8,7 @@ import {
} from '@activepieces/shared';
import { create } from 'zustand';
-import { PieceStepMetadataWithSuggestions } from '@/lib/types';
+import { PieceStepMetadataWithSuggestions } from '@/features/pieces/types';
type SelectedDialogPage = 'pieces-list' | 'actions-list' | 'action-inputs';
diff --git a/packages/web/src/features/agents/ai-model/hooks.ts b/packages/web/src/features/agents/ai-model/hooks.ts
index 023444aac0c..1ca2de25afa 100644
--- a/packages/web/src/features/agents/ai-model/hooks.ts
+++ b/packages/web/src/features/agents/ai-model/hooks.ts
@@ -2,7 +2,7 @@ import { AIProviderModel, AIProviderName, isNil } from '@activepieces/shared';
import { Provider } from '@radix-ui/react-tooltip';
import { useQuery } from '@tanstack/react-query';
-import { aiProviderApi } from '@/features/platform-admin/lib/ai-provider-api';
+import { aiProviderApi } from '@/features/platform-admin/api/ai-provider-api';
type Provider =
| 'activepieces'
diff --git a/packages/web/src/features/agents/index.ts b/packages/web/src/features/agents/index.ts
new file mode 100644
index 00000000000..3a4c20e12be
--- /dev/null
+++ b/packages/web/src/features/agents/index.ts
@@ -0,0 +1,15 @@
+export { AgentTimeline } from './agent-timeline';
+export { AddToolDropdown } from './agent-tools/add-agent-tool-dropwdown';
+export { AgentFlowToolComponent } from './agent-tools/componenets/flow-tool';
+export { AgentMcpToolComponent } from './agent-tools/componenets/mcp-tool';
+export { AgentPieceToolComponent } from './agent-tools/componenets/piece-tool';
+export { AgentFlowToolDialog } from './agent-tools/flow-tool-dialog';
+export { AgentMcpDialog } from './agent-tools/mcp-tool-dialog';
+export { ConnectionDropdown } from './agent-tools/piece-tool-dialog/connection-select';
+export { PieceActionsList } from './agent-tools/piece-tool-dialog/dialog-pages/piece-actions-list';
+export { PiecesList } from './agent-tools/piece-tool-dialog/dialog-pages/pieces-list';
+export { usePieceToolsDialogStore } from './agent-tools/stores/pieces-tools';
+export { AIModelSelector } from './ai-model';
+export { SUPPORTED_AI_PROVIDERS } from './ai-providers';
+export type { AiProviderInfo } from './ai-providers';
+export { AgentStructuredOutput } from './structured-output';
diff --git a/packages/web/src/features/alerts/lib/api.ts b/packages/web/src/features/alerts/api/alerts-api.ts
similarity index 100%
rename from packages/web/src/features/alerts/lib/api.ts
rename to packages/web/src/features/alerts/api/alerts-api.ts
diff --git a/packages/web/src/features/alerts/lib/alert-hooks.ts b/packages/web/src/features/alerts/hooks/alert-hooks.ts
similarity index 98%
rename from packages/web/src/features/alerts/lib/alert-hooks.ts
rename to packages/web/src/features/alerts/hooks/alert-hooks.ts
index 78a1bcf6a74..a7ad13132b1 100644
--- a/packages/web/src/features/alerts/lib/alert-hooks.ts
+++ b/packages/web/src/features/alerts/hooks/alert-hooks.ts
@@ -9,7 +9,7 @@ import { internalErrorToast } from '@/components/ui/sonner';
import { api } from '@/lib/api';
import { authenticationSession } from '@/lib/authentication-session';
-import { alertsApi } from './api';
+import { alertsApi } from '../api/alerts-api';
type Params = {
email: string;
diff --git a/packages/web/src/features/alerts/index.ts b/packages/web/src/features/alerts/index.ts
new file mode 100644
index 00000000000..9d70fb3635b
--- /dev/null
+++ b/packages/web/src/features/alerts/index.ts
@@ -0,0 +1 @@
+export { alertMutations, alertQueries } from './hooks/alert-hooks';
diff --git a/packages/web/src/lib/managed-auth-api.ts b/packages/web/src/features/authentication/api/managed-auth-api.ts
similarity index 100%
rename from packages/web/src/lib/managed-auth-api.ts
rename to packages/web/src/features/authentication/api/managed-auth-api.ts
diff --git a/packages/web/src/features/authentication/components/auth-form-template.tsx b/packages/web/src/features/authentication/components/auth-form-template.tsx
index 29deba54179..578baae8402 100644
--- a/packages/web/src/features/authentication/components/auth-form-template.tsx
+++ b/packages/web/src/features/authentication/components/auth-form-template.tsx
@@ -6,6 +6,7 @@ import { t } from 'i18next';
import React, { useEffect, useState } from 'react';
import { Link, useSearchParams } from 'react-router-dom';
+import { FullLogo } from '@/components/custom/full-logo';
import {
Card,
CardContent,
@@ -13,7 +14,6 @@ import {
CardHeader,
CardTitle,
} from '@/components/ui/card';
-import { FullLogo } from '@/components/ui/full-logo';
import { authenticationSession } from '@/lib/authentication-session';
import { useRedirectAfterLogin } from '@/lib/navigation-utils';
diff --git a/packages/web/src/features/authentication/components/change-password.tsx b/packages/web/src/features/authentication/components/change-password.tsx
index a3352bcc05f..ac60272688d 100644
--- a/packages/web/src/features/authentication/components/change-password.tsx
+++ b/packages/web/src/features/authentication/components/change-password.tsx
@@ -7,6 +7,7 @@ import { SubmitHandler, useForm } from 'react-hook-form';
import { useNavigate } from 'react-router-dom';
import { toast } from 'sonner';
+import { authenticationApi } from '@/api/authentication-api';
import { Button } from '@/components/ui/button';
import {
Card,
@@ -20,9 +21,8 @@ import { Input } from '@/components/ui/input';
import { Label } from '@/components/ui/label';
import { PopoverContent, PopoverTrigger } from '@/components/ui/popover';
import { PasswordValidator } from '@/features/authentication/components/password-validator';
-import { passwordValidation } from '@/features/authentication/lib/password-validation-utils';
+import { passwordValidation } from '@/features/authentication/utils/password-validation-utils';
import { HttpError } from '@/lib/api';
-import { authenticationApi } from '@/lib/authentication-api';
const ChangePasswordForm = () => {
const navigate = useNavigate();
diff --git a/packages/web/src/features/authentication/components/check-email-note.tsx b/packages/web/src/features/authentication/components/check-email-note.tsx
index 01a8693c65c..ebd33bb623b 100644
--- a/packages/web/src/features/authentication/components/check-email-note.tsx
+++ b/packages/web/src/features/authentication/components/check-email-note.tsx
@@ -4,7 +4,7 @@ import { t } from 'i18next';
import { MailCheck } from 'lucide-react';
import { toast } from 'sonner';
-import { authenticationApi } from '@/lib/authentication-api';
+import { authenticationApi } from '@/api/authentication-api';
const CheckEmailNote = ({ email, type }: CreateOtpRequestBody) => {
const { mutate: resendVerification } = useMutation({
diff --git a/packages/web/src/features/authentication/components/password-validator.tsx b/packages/web/src/features/authentication/components/password-validator.tsx
index a6a5b5423a6..66c106bdcc4 100644
--- a/packages/web/src/features/authentication/components/password-validator.tsx
+++ b/packages/web/src/features/authentication/components/password-validator.tsx
@@ -1,6 +1,6 @@
import { Check, X } from 'lucide-react';
-import { passwordRules } from '@/features/authentication/lib/password-validation-utils';
+import { passwordRules } from '@/features/authentication/utils/password-validation-utils';
const PasswordValidator = ({ password }: { password: string }) => {
return (
diff --git a/packages/web/src/features/authentication/components/reset-password-form.tsx b/packages/web/src/features/authentication/components/reset-password-form.tsx
index 10589fca1d0..be9864a6c89 100644
--- a/packages/web/src/features/authentication/components/reset-password-form.tsx
+++ b/packages/web/src/features/authentication/components/reset-password-form.tsx
@@ -7,6 +7,7 @@ import { useState } from 'react';
import { SubmitHandler, useForm } from 'react-hook-form';
import { Link } from 'react-router-dom';
+import { authenticationApi } from '@/api/authentication-api';
import { Button } from '@/components/ui/button';
import {
Card,
@@ -20,7 +21,6 @@ import { Input } from '@/components/ui/input';
import { Label } from '@/components/ui/label';
import { CheckEmailNote } from '@/features/authentication/components/check-email-note';
import { HttpError } from '@/lib/api';
-import { authenticationApi } from '@/lib/authentication-api';
const FormSchema = Type.Object({
email: Type.String({
diff --git a/packages/web/src/features/authentication/components/sign-in-form.tsx b/packages/web/src/features/authentication/components/sign-in-form.tsx
index 7b429fff7e7..864d0311b09 100644
--- a/packages/web/src/features/authentication/components/sign-in-form.tsx
+++ b/packages/web/src/features/authentication/components/sign-in-form.tsx
@@ -15,16 +15,16 @@ import { useState } from 'react';
import { SubmitHandler, useForm } from 'react-hook-form';
import { Link, Navigate } from 'react-router-dom';
+import { authenticationApi } from '@/api/authentication-api';
import { Button } from '@/components/ui/button';
import { Form, FormField, FormItem, FormMessage } from '@/components/ui/form';
import { Input } from '@/components/ui/input';
import { Label } from '@/components/ui/label';
import { flagsHooks } from '@/hooks/flags-hooks';
import { HttpError, api } from '@/lib/api';
-import { authenticationApi } from '@/lib/authentication-api';
import { authenticationSession } from '@/lib/authentication-session';
+import { formatUtils } from '@/lib/format-utils';
import { useRedirectAfterLogin } from '@/lib/navigation-utils';
-import { formatUtils } from '@/lib/utils';
import { CheckEmailNote } from './check-email-note';
diff --git a/packages/web/src/features/authentication/components/sign-up-form.tsx b/packages/web/src/features/authentication/components/sign-up-form.tsx
index 9917b192ab5..9df09c36ecf 100644
--- a/packages/web/src/features/authentication/components/sign-up-form.tsx
+++ b/packages/web/src/features/authentication/components/sign-up-form.tsx
@@ -13,6 +13,7 @@ import { useMemo, useRef, useState } from 'react';
import { SubmitHandler, useForm } from 'react-hook-form';
import { Link, useSearchParams } from 'react-router-dom';
+import { authenticationApi } from '@/api/authentication-api';
import { Button } from '@/components/ui/button';
import { Checkbox } from '@/components/ui/checkbox';
import {
@@ -33,12 +34,12 @@ import { CheckEmailNote } from '@/features/authentication/components/check-email
import { PasswordValidator } from '@/features/authentication/components/password-validator';
import { flagsHooks } from '@/hooks/flags-hooks';
import { HttpError, api } from '@/lib/api';
-import { authenticationApi } from '@/lib/authentication-api';
import { authenticationSession } from '@/lib/authentication-session';
+import { formatUtils } from '@/lib/format-utils';
import { useRedirectAfterLogin } from '@/lib/navigation-utils';
-import { cn, formatUtils } from '@/lib/utils';
+import { cn } from '@/lib/utils';
-import { passwordValidation } from '../lib/password-validation-utils';
+import { passwordValidation } from '../utils/password-validation-utils';
type SignUpSchema = {
email: string;
diff --git a/packages/web/src/features/authentication/components/third-party-logins.tsx b/packages/web/src/features/authentication/components/third-party-logins.tsx
index 217a01daa5d..e3a84c89d15 100644
--- a/packages/web/src/features/authentication/components/third-party-logins.tsx
+++ b/packages/web/src/features/authentication/components/third-party-logins.tsx
@@ -6,14 +6,13 @@ import {
import { t } from 'i18next';
import React from 'react';
+import { authenticationApi } from '@/api/authentication-api';
+import GoogleIcon from '@/assets/img/custom/auth/google-icon.svg';
+import SamlIcon from '@/assets/img/custom/auth/saml.svg';
import { Button } from '@/components/ui/button';
import { internalErrorToast } from '@/components/ui/sonner';
-
-import GoogleIcon from '../../../assets/img/custom/auth/google-icon.svg';
-import SamlIcon from '../../../assets/img/custom/auth/saml.svg';
-import { flagsHooks } from '../../../hooks/flags-hooks';
-import { authenticationApi } from '../../../lib/authentication-api';
-import { oauth2Utils } from '../../../lib/oauth2-utils';
+import { oauth2Utils } from '@/features/connections/utils/oauth2-utils';
+import { flagsHooks } from '@/hooks/flags-hooks';
const ThirdPartyIcon = ({ icon }: { icon: string }) => {
return ;
diff --git a/packages/web/src/features/authentication/components/verify-email.tsx b/packages/web/src/features/authentication/components/verify-email.tsx
index d734db54018..f4e73c3fead 100644
--- a/packages/web/src/features/authentication/components/verify-email.tsx
+++ b/packages/web/src/features/authentication/components/verify-email.tsx
@@ -5,13 +5,13 @@ import { MailCheck, MailX } from 'lucide-react';
import { useEffect, useState, useRef } from 'react';
import { Navigate, useNavigate, useSearchParams } from 'react-router-dom';
+import { authenticationApi } from '@/api/authentication-api';
+import { FullLogo } from '@/components/custom/full-logo';
+import { LoadingSpinner } from '@/components/custom/spinner';
import { Card } from '@/components/ui/card';
-import { FullLogo } from '@/components/ui/full-logo';
import { internalErrorToast } from '@/components/ui/sonner';
-import { LoadingSpinner } from '@/components/ui/spinner';
import { usePartnerStack } from '@/hooks/use-partner-stack';
import { api } from '@/lib/api';
-import { authenticationApi } from '@/lib/authentication-api';
const VerifyEmail = () => {
const [isExpired, setIsExpired] = useState(false);
diff --git a/packages/web/src/features/authentication/index.ts b/packages/web/src/features/authentication/index.ts
new file mode 100644
index 00000000000..f702cafb463
--- /dev/null
+++ b/packages/web/src/features/authentication/index.ts
@@ -0,0 +1,11 @@
+export { managedAuthApi } from './api/managed-auth-api';
+export { AuthFormTemplate } from './components/auth-form-template';
+export { ChangePasswordForm } from './components/change-password';
+export { CheckEmailNote } from './components/check-email-note';
+export { PasswordValidator } from './components/password-validator';
+export { ResetPasswordForm } from './components/reset-password-form';
+export { VerifyEmail } from './components/verify-email';
+export {
+ passwordRules,
+ passwordValidation,
+} from './utils/password-validation-utils';
diff --git a/packages/web/src/features/authentication/lib/password-validation-utils.ts b/packages/web/src/features/authentication/utils/password-validation-utils.ts
similarity index 100%
rename from packages/web/src/features/authentication/lib/password-validation-utils.ts
rename to packages/web/src/features/authentication/utils/password-validation-utils.ts
diff --git a/packages/web/src/features/billing/lib/api.ts b/packages/web/src/features/billing/api/billing-plans-api.ts
similarity index 100%
rename from packages/web/src/features/billing/lib/api.ts
rename to packages/web/src/features/billing/api/billing-plans-api.ts
diff --git a/packages/web/src/lib/request-trial-api.ts b/packages/web/src/features/billing/api/request-trial-api.ts
similarity index 89%
rename from packages/web/src/lib/request-trial-api.ts
rename to packages/web/src/features/billing/api/request-trial-api.ts
index 48c76e17d1c..a3ecb19c3ed 100644
--- a/packages/web/src/lib/request-trial-api.ts
+++ b/packages/web/src/features/billing/api/request-trial-api.ts
@@ -1,7 +1,7 @@
import { CreateTrialLicenseKeyRequestBody } from '@activepieces/shared';
-import { api } from './api';
-import { flagsApi } from './flags-api';
+import { flagsApi } from '@/api/flags-api';
+import { api } from '@/lib/api';
export const requestTrialApi = {
createKey(params: CreateTrialLicenseKeyRequestBody): Promise {
diff --git a/packages/web/src/features/billing/components/activate-license-dialog.tsx b/packages/web/src/features/billing/components/activate-license-dialog.tsx
index 604fa8f3f04..c829e67a8ac 100644
--- a/packages/web/src/features/billing/components/activate-license-dialog.tsx
+++ b/packages/web/src/features/billing/components/activate-license-dialog.tsx
@@ -4,6 +4,7 @@ import { useQueryClient } from '@tanstack/react-query';
import { t } from 'i18next';
import { useForm } from 'react-hook-form';
+import { LoadingSpinner } from '@/components/custom/spinner';
import { Button } from '@/components/ui/button';
import {
Dialog,
@@ -15,7 +16,6 @@ import {
} from '@/components/ui/dialog';
import { Form, FormField, FormItem, FormMessage } from '@/components/ui/form';
import { Input } from '@/components/ui/input';
-import { LoadingSpinner } from '@/components/ui/spinner';
import { platformHooks } from '@/hooks/platform-hooks';
const LicenseKeySchema = Type.Object({
diff --git a/packages/web/src/features/billing/components/active-flows-addon/index.tsx b/packages/web/src/features/billing/components/active-flows-addon/index.tsx
index 0b848a30468..501dfee8e83 100644
--- a/packages/web/src/features/billing/components/active-flows-addon/index.tsx
+++ b/packages/web/src/features/billing/components/active-flows-addon/index.tsx
@@ -20,7 +20,7 @@ import {
} from '@/components/ui/tooltip';
import { flagsHooks } from '@/hooks/flags-hooks';
-import { useManagePlanDialogStore } from '../../lib/active-flows-addon-dialog-state';
+import { useManagePlanDialogStore } from '../../stores/active-flows-addon-dialog-state';
type BusinessActiveFlowsProps = {
platformSubscription: PlatformBillingInformation;
diff --git a/packages/web/src/features/billing/components/active-flows-addon/purchase-active-flows-dialog.tsx b/packages/web/src/features/billing/components/active-flows-addon/purchase-active-flows-dialog.tsx
index e1b8b563419..e8a111ac2dc 100644
--- a/packages/web/src/features/billing/components/active-flows-addon/purchase-active-flows-dialog.tsx
+++ b/packages/web/src/features/billing/components/active-flows-addon/purchase-active-flows-dialog.tsx
@@ -21,8 +21,8 @@ import { Slider } from '@/components/ui/slider';
import { platformHooks } from '@/hooks/platform-hooks';
import { cn } from '@/lib/utils';
-import { useManagePlanDialogStore } from '../../lib/active-flows-addon-dialog-state';
-import { billingMutations, billingQueries } from '../../lib/billing-hooks';
+import { billingMutations, billingQueries } from '../../hooks/billing-hooks';
+import { useManagePlanDialogStore } from '../../stores/active-flows-addon-dialog-state';
export function PurchaseExtraFlowsDialog() {
const { closeDialog, isOpen } = useManagePlanDialogStore();
diff --git a/packages/web/src/features/billing/components/ai-credits/ai-credit-usage.tsx b/packages/web/src/features/billing/components/ai-credits/ai-credit-usage.tsx
index 3da53c1b1bc..fdfac2417a6 100644
--- a/packages/web/src/features/billing/components/ai-credits/ai-credit-usage.tsx
+++ b/packages/web/src/features/billing/components/ai-credits/ai-credit-usage.tsx
@@ -21,7 +21,7 @@ import {
import { flagsHooks } from '@/hooks/flags-hooks';
import { isRunningCloudInDevMode } from '@/lib/api';
-import { billingMutations } from '../../lib/billing-hooks';
+import { billingMutations } from '../../hooks/billing-hooks';
import { AutoTopUpConfigDialog } from './auto-topup-config-dialog';
import { PurchaseAICreditsDialog } from './purchase-ai-credits-dialog';
diff --git a/packages/web/src/features/billing/components/ai-credits/auto-topup-config-dialog.tsx b/packages/web/src/features/billing/components/ai-credits/auto-topup-config-dialog.tsx
index 32ee9b04bdd..2b05b334465 100644
--- a/packages/web/src/features/billing/components/ai-credits/auto-topup-config-dialog.tsx
+++ b/packages/web/src/features/billing/components/ai-credits/auto-topup-config-dialog.tsx
@@ -19,7 +19,7 @@ import {
import { Label } from '@/components/ui/label';
import { Slider } from '@/components/ui/slider';
-import { billingMutations } from '../../lib/billing-hooks';
+import { billingMutations } from '../../hooks/billing-hooks';
interface AutoTopUpConfigDialogProps {
isOpen: boolean;
diff --git a/packages/web/src/features/billing/components/ai-credits/purchase-ai-credits-dialog.tsx b/packages/web/src/features/billing/components/ai-credits/purchase-ai-credits-dialog.tsx
index ae72678a8ce..089c17c704f 100644
--- a/packages/web/src/features/billing/components/ai-credits/purchase-ai-credits-dialog.tsx
+++ b/packages/web/src/features/billing/components/ai-credits/purchase-ai-credits-dialog.tsx
@@ -13,7 +13,7 @@ import {
} from '@/components/ui/dialog';
import { Slider } from '@/components/ui/slider';
-import { billingMutations } from '../../lib/billing-hooks';
+import { billingMutations } from '../../hooks/billing-hooks';
interface PurchaseAICreditsDialogProps {
isOpen: boolean;
diff --git a/packages/web/src/features/billing/components/enable-ai-credits-overage.tsx b/packages/web/src/features/billing/components/enable-ai-credits-overage.tsx
index ae41e32c56c..549714b71b2 100644
--- a/packages/web/src/features/billing/components/enable-ai-credits-overage.tsx
+++ b/packages/web/src/features/billing/components/enable-ai-credits-overage.tsx
@@ -4,7 +4,7 @@ import { Info } from 'lucide-react';
import { Button } from '@/components/ui/button';
import { Dialog, DialogContent } from '@/components/ui/dialog';
-import { billingMutations } from '../lib/billing-hooks';
+import { billingMutations } from '../hooks/billing-hooks';
interface EnableAIOverageDialogProps {
isOpen?: boolean;
diff --git a/packages/web/src/features/billing/components/features-status.tsx b/packages/web/src/features/billing/components/features-status.tsx
index b4dce840cd9..d3f4a68e153 100644
--- a/packages/web/src/features/billing/components/features-status.tsx
+++ b/packages/web/src/features/billing/components/features-status.tsx
@@ -5,7 +5,7 @@ import {
import { t } from 'i18next';
import { Check, Lock } from 'lucide-react';
-import { StatusIconWithText } from '@/components/ui/status-icon-with-text';
+import { StatusIconWithText } from '@/components/custom/status-icon-with-text';
const LICENSE_PROPS_MAP = {
environmentsEnabled: {
diff --git a/packages/web/src/features/billing/components/license-key.tsx b/packages/web/src/features/billing/components/license-key.tsx
index 04257af4acd..bb573cbbdfa 100644
--- a/packages/web/src/features/billing/components/license-key.tsx
+++ b/packages/web/src/features/billing/components/license-key.tsx
@@ -4,10 +4,10 @@ import { t } from 'i18next';
import { Shield, AlertTriangle, Check, Zap } from 'lucide-react';
import { useState } from 'react';
+import { StatusIconWithText } from '@/components/custom/status-icon-with-text';
import { Button } from '@/components/ui/button';
import { Card, CardContent, CardHeader } from '@/components/ui/card';
-import { StatusIconWithText } from '@/components/ui/status-icon-with-text';
-import { formatUtils } from '@/lib/utils';
+import { formatUtils } from '@/lib/format-utils';
import { ActivateLicenseDialog } from './activate-license-dialog';
import { FeatureStatus } from './features-status';
diff --git a/packages/web/src/features/billing/lib/billing-hooks.ts b/packages/web/src/features/billing/hooks/billing-hooks.ts
similarity index 98%
rename from packages/web/src/features/billing/lib/billing-hooks.ts
rename to packages/web/src/features/billing/hooks/billing-hooks.ts
index 941fc64e99f..e56f604d85d 100644
--- a/packages/web/src/features/billing/lib/billing-hooks.ts
+++ b/packages/web/src/features/billing/hooks/billing-hooks.ts
@@ -11,7 +11,7 @@ import { toast } from 'sonner';
import { internalErrorToast } from '@/components/ui/sonner';
-import { platformBillingApi } from './api';
+import { platformBillingApi } from '../api/billing-plans-api';
export const billingKeys = {
platformSubscription: (platformId: string) =>
diff --git a/packages/web/src/features/billing/index.ts b/packages/web/src/features/billing/index.ts
new file mode 100644
index 00000000000..2170d908689
--- /dev/null
+++ b/packages/web/src/features/billing/index.ts
@@ -0,0 +1,10 @@
+export { ActiveFlowAddon } from './components/active-flows-addon';
+export { PurchaseExtraFlowsDialog } from './components/active-flows-addon/purchase-active-flows-dialog';
+export { AICreditUsage } from './components/ai-credits/ai-credit-usage';
+export { Error } from './components/error';
+export { FeatureStatus } from './components/features-status';
+export { LicenseKey } from './components/license-key';
+export { SubscriptionInfo } from './components/subscription-info';
+export { Success } from './components/success';
+export { billingMutations, billingQueries } from './hooks/billing-hooks';
+export { useManagePlanDialogStore } from './stores/active-flows-addon-dialog-state';
diff --git a/packages/web/src/features/billing/lib/active-flows-addon-dialog-state.ts b/packages/web/src/features/billing/stores/active-flows-addon-dialog-state.ts
similarity index 100%
rename from packages/web/src/features/billing/lib/active-flows-addon-dialog-state.ts
rename to packages/web/src/features/billing/stores/active-flows-addon-dialog-state.ts
diff --git a/packages/web/src/features/chat/chat-input/index.tsx b/packages/web/src/features/chat/chat-input/index.tsx
index 3d284933a1c..ea610e18b90 100644
--- a/packages/web/src/features/chat/chat-input/index.tsx
+++ b/packages/web/src/features/chat/chat-input/index.tsx
@@ -5,7 +5,8 @@ import { useRef, useState } from 'react';
import { Button } from '@/components/ui/button';
import { ResizableTextareaProps, Textarea } from '@/components/ui/textarea';
-import { cn, useElementSize } from '@/lib/utils';
+import { useElementSize } from '@/hooks/use-element-size';
+import { cn } from '@/lib/utils';
import { FileInputPreview } from './file-input-preview';
diff --git a/packages/web/src/features/chat/chat-message/image-message.tsx b/packages/web/src/features/chat/chat-message/image-message.tsx
index 7de11dd1466..53180f11123 100644
--- a/packages/web/src/features/chat/chat-message/image-message.tsx
+++ b/packages/web/src/features/chat/chat-message/image-message.tsx
@@ -1,7 +1,7 @@
import { Download } from 'lucide-react';
import React from 'react';
-import ImageWithFallback from '@/components/ui/image-with-fallback';
+import ImageWithFallback from '@/components/custom/image-with-fallback';
interface ImageMessageProps {
content: string;
diff --git a/packages/web/src/features/chat/chat-message/text-message.tsx b/packages/web/src/features/chat/chat-message/text-message.tsx
index a9cf06e5839..1591e756c96 100644
--- a/packages/web/src/features/chat/chat-message/text-message.tsx
+++ b/packages/web/src/features/chat/chat-message/text-message.tsx
@@ -11,7 +11,7 @@ import Markdown from 'react-markdown';
import remarkGfm from 'remark-gfm';
import { CopyButton } from '@/components/custom/clipboard/copy-button';
-import { useTheme } from '@/components/theme-provider';
+import { useTheme } from '@/components/providers/theme-provider';
import { Button } from '@/components/ui/button';
import { cn } from '@/lib/utils';
diff --git a/packages/web/src/features/chat/index.ts b/packages/web/src/features/chat/index.ts
new file mode 100644
index 00000000000..8974c931ee1
--- /dev/null
+++ b/packages/web/src/features/chat/index.ts
@@ -0,0 +1,5 @@
+export { ChatInput } from './chat-input';
+export type { ChatMessage } from './chat-input';
+export { ChatIntro } from './chat-intro';
+export { ChatMessageList, Messages } from './chat-message-list';
+export { ImageDialog } from './chat-message/image-dialog';
diff --git a/packages/web/src/features/connections/lib/api/app-connections.ts b/packages/web/src/features/connections/api/app-connections.ts
similarity index 100%
rename from packages/web/src/features/connections/lib/api/app-connections.ts
rename to packages/web/src/features/connections/api/app-connections.ts
diff --git a/packages/web/src/features/connections/lib/api/global-connections.ts b/packages/web/src/features/connections/api/global-connections.ts
similarity index 100%
rename from packages/web/src/features/connections/lib/api/global-connections.ts
rename to packages/web/src/features/connections/api/global-connections.ts
diff --git a/packages/web/src/features/connections/lib/api/oauth-apps.ts b/packages/web/src/features/connections/api/oauth-apps.ts
similarity index 100%
rename from packages/web/src/features/connections/lib/api/oauth-apps.ts
rename to packages/web/src/features/connections/api/oauth-apps.ts
diff --git a/packages/web/src/features/connections/components/assign-global-connection-to-projects.tsx b/packages/web/src/features/connections/components/assign-global-connection-to-projects.tsx
index c590226c2f8..01847e24579 100644
--- a/packages/web/src/features/connections/components/assign-global-connection-to-projects.tsx
+++ b/packages/web/src/features/connections/components/assign-global-connection-to-projects.tsx
@@ -2,7 +2,7 @@ import { isNil } from '@activepieces/shared';
import { t } from 'i18next';
import { Control } from 'react-hook-form';
-import { projectCollectionUtils } from '@/hooks/project-collection';
+import { projectCollectionUtils } from '@/features/projects/stores/project-collection';
import { MultiSelectPieceProperty } from '../../../components/custom/multi-select-piece-property';
import { FormField, FormItem, FormMessage } from '../../../components/ui/form';
diff --git a/packages/web/src/features/connections/components/edit-global-connection-dialog.tsx b/packages/web/src/features/connections/components/edit-global-connection-dialog.tsx
index e7dea4c9d18..8c5a0a80244 100644
--- a/packages/web/src/features/connections/components/edit-global-connection-dialog.tsx
+++ b/packages/web/src/features/connections/components/edit-global-connection-dialog.tsx
@@ -25,7 +25,7 @@ import {
TooltipTrigger,
} from '@/components/ui/tooltip';
-import { globalConnectionsMutations } from '../lib/global-connections-hooks';
+import { globalConnectionsMutations } from '../hooks/global-connections-hooks';
import { AssignConnectionToProjectsControl } from './assign-global-connection-to-projects';
diff --git a/packages/web/src/features/connections/components/rename-connection-dialog.tsx b/packages/web/src/features/connections/components/rename-connection-dialog.tsx
index eeecedfee5f..5b972cb7c94 100644
--- a/packages/web/src/features/connections/components/rename-connection-dialog.tsx
+++ b/packages/web/src/features/connections/components/rename-connection-dialog.tsx
@@ -23,7 +23,7 @@ import {
TooltipTrigger,
} from '@/components/ui/tooltip';
-import { appConnectionsMutations } from '../lib/app-connections-hooks';
+import { appConnectionsMutations } from '../hooks/app-connections-hooks';
const RenameConnectionSchema = Type.Object({
displayName: Type.String(),
diff --git a/packages/web/src/features/connections/lib/app-connections-hooks.ts b/packages/web/src/features/connections/hooks/app-connections-hooks.ts
similarity index 97%
rename from packages/web/src/features/connections/lib/app-connections-hooks.ts
rename to packages/web/src/features/connections/hooks/app-connections-hooks.ts
index 425663413b9..227cade558c 100644
--- a/packages/web/src/features/connections/lib/app-connections-hooks.ts
+++ b/packages/web/src/features/connections/hooks/app-connections-hooks.ts
@@ -17,19 +17,19 @@ import { t } from 'i18next';
import { UseFormReturn } from 'react-hook-form';
import { toast } from 'sonner';
-import { useEmbedding } from '@/components/embed-provider';
+import { useEmbedding } from '@/components/providers/embed-provider';
import { internalErrorToast } from '@/components/ui/sonner';
-import { projectMembersApi } from '@/features/members/lib/project-members-api';
+import { projectMembersApi } from '@/features/members/api/project-members-api';
import { api } from '@/lib/api';
import { authenticationSession } from '@/lib/authentication-session';
-import { appConnectionsApi } from './api/app-connections';
-import { globalConnectionsApi } from './api/global-connections';
+import { appConnectionsApi } from '../api/app-connections';
+import { globalConnectionsApi } from '../api/global-connections';
import {
ConnectionNameAlreadyExists,
NoProjectSelected,
isConnectionNameUnique,
-} from './utils';
+} from '../utils/utils';
type UseReplaceConnectionsProps = {
setDialogOpen: (isOpen: boolean) => void;
diff --git a/packages/web/src/features/connections/lib/global-connections-hooks.ts b/packages/web/src/features/connections/hooks/global-connections-hooks.ts
similarity index 97%
rename from packages/web/src/features/connections/lib/global-connections-hooks.ts
rename to packages/web/src/features/connections/hooks/global-connections-hooks.ts
index 892ac4a668b..3739a7353fd 100644
--- a/packages/web/src/features/connections/lib/global-connections-hooks.ts
+++ b/packages/web/src/features/connections/hooks/global-connections-hooks.ts
@@ -10,12 +10,12 @@ import { toast } from 'sonner';
import { internalErrorToast } from '@/components/ui/sonner';
import { platformHooks } from '@/hooks/platform-hooks';
-import { globalConnectionsApi } from './api/global-connections';
+import { globalConnectionsApi } from '../api/global-connections';
import {
NoProjectSelected,
ConnectionNameAlreadyExists,
isConnectionNameUnique,
-} from './utils';
+} from '../utils/utils';
type UseGlobalConnectionsProps = {
request: ListGlobalConnectionsRequestQuery;
diff --git a/packages/web/src/features/connections/lib/oauth-apps-hooks.ts b/packages/web/src/features/connections/hooks/oauth-apps-hooks.ts
similarity index 96%
rename from packages/web/src/features/connections/lib/oauth-apps-hooks.ts
rename to packages/web/src/features/connections/hooks/oauth-apps-hooks.ts
index 35ac21eef87..851e06491ac 100644
--- a/packages/web/src/features/connections/lib/oauth-apps-hooks.ts
+++ b/packages/web/src/features/connections/hooks/oauth-apps-hooks.ts
@@ -8,11 +8,11 @@ import { useMutation, useQuery } from '@tanstack/react-query';
import { t } from 'i18next';
import { toast } from 'sonner';
+import { PiecesOAuth2AppsMap } from '@/features/connections/utils/oauth2-utils';
import { flagsHooks } from '@/hooks/flags-hooks';
import { platformHooks } from '@/hooks/platform-hooks';
-import { PiecesOAuth2AppsMap } from '@/lib/oauth2-utils';
-import { oauthAppsApi } from './api/oauth-apps';
+import { oauthAppsApi } from '../api/oauth-apps';
export const oauthAppsMutations = {
useDeleteOAuthApp: (refetch: () => void, setOpen: (open: boolean) => void) =>
diff --git a/packages/web/src/features/connections/index.ts b/packages/web/src/features/connections/index.ts
new file mode 100644
index 00000000000..006361acadd
--- /dev/null
+++ b/packages/web/src/features/connections/index.ts
@@ -0,0 +1,16 @@
+export { appConnectionsApi } from './api/app-connections';
+export { AssignConnectionToProjectsControl } from './components/assign-global-connection-to-projects';
+export { EditGlobalConnectionDialog } from './components/edit-global-connection-dialog';
+export { RenameConnectionDialog } from './components/rename-connection-dialog';
+export {
+ appConnectionsMutations,
+ appConnectionsQueries,
+} from './hooks/app-connections-hooks';
+export {
+ globalConnectionsMutations,
+ globalConnectionsQueries,
+} from './hooks/global-connections-hooks';
+export { oauthAppsMutations, oauthAppsQueries } from './hooks/oauth-apps-hooks';
+export { oauth2Utils } from './utils/oauth2-utils';
+export type { OAuth2App, PiecesOAuth2AppsMap } from './utils/oauth2-utils';
+export { appConnectionUtils, newConnectionUtils } from './utils/utils';
diff --git a/packages/web/src/lib/oauth2-utils.ts b/packages/web/src/features/connections/utils/oauth2-utils.ts
similarity index 96%
rename from packages/web/src/lib/oauth2-utils.ts
rename to packages/web/src/features/connections/utils/oauth2-utils.ts
index 78ee0444df2..734bc56e653 100644
--- a/packages/web/src/lib/oauth2-utils.ts
+++ b/packages/web/src/features/connections/utils/oauth2-utils.ts
@@ -1,4 +1,4 @@
-import { OAuth2Property } from '@activepieces/pieces-framework';
+import { OAuth2Property, OAuth2Props } from '@activepieces/pieces-framework';
import {
AppConnectionType,
BOTH_CLIENT_CREDENTIALS_AND_AUTHORIZATION_CODE,
@@ -14,7 +14,7 @@ import {
LOGIN_QUERY_PARAM,
PROVIDER_NAME_QUERY_PARAM,
STATE_QUERY_PARAM,
-} from './navigation-utils';
+} from '@/lib/navigation-utils';
let currentPopup: Window | null = null;
@@ -135,23 +135,7 @@ function getCode(redirectUrl: string): Promise {
});
}
-type OAuth2PopupParams = {
- authUrl: string;
- clientId: string;
- redirectUrl: string;
- scope: string;
- prompt?: 'none' | 'consent' | 'login' | 'omit';
- pkce: boolean;
- pkceMethod?: 'plain' | 'S256';
- extraParams?: Record;
-};
-
-type OAuth2PopupResponse = {
- code: string;
- codeChallenge: string | undefined;
-};
-
-function getGrantType(property: OAuth2Property) {
+function getGrantType(property: OAuth2Property) {
if (
isNil(property.grantType) ||
property.grantType === BOTH_CLIENT_CREDENTIALS_AND_AUTHORIZATION_CODE
@@ -178,6 +162,13 @@ function getPredefinedOAuth2App(
return null;
}
+export const oauth2Utils = {
+ openOAuth2Popup,
+ useThirdPartyLogin,
+ getGrantType,
+ getPredefinedOAuth2App,
+};
+
export type OAuth2App =
| {
oauth2Type:
@@ -199,9 +190,18 @@ export type PiecesOAuth2AppsMap = Record<
| undefined
>;
-export const oauth2Utils = {
- openOAuth2Popup,
- useThirdPartyLogin,
- getGrantType,
- getPredefinedOAuth2App,
+type OAuth2PopupParams = {
+ authUrl: string;
+ clientId: string;
+ redirectUrl: string;
+ scope: string;
+ prompt?: 'none' | 'consent' | 'login' | 'omit';
+ pkce: boolean;
+ pkceMethod?: 'plain' | 'S256';
+ extraParams?: Record;
+};
+
+type OAuth2PopupResponse = {
+ code: string;
+ codeChallenge: string | undefined;
};
diff --git a/packages/web/src/features/connections/lib/utils.ts b/packages/web/src/features/connections/utils/utils.ts
similarity index 96%
rename from packages/web/src/features/connections/lib/utils.ts
rename to packages/web/src/features/connections/utils/utils.ts
index 5597766743a..1b8e76a2d42 100644
--- a/packages/web/src/features/connections/lib/utils.ts
+++ b/packages/web/src/features/connections/utils/utils.ts
@@ -19,12 +19,12 @@ import {
import { t } from 'i18next';
import { CheckIcon, UnplugIcon, XIcon } from 'lucide-react';
-import { formUtils } from '@/features/pieces/lib/form-utils';
+import { OAuth2App } from '@/features/connections/utils/oauth2-utils';
+import { formUtils } from '@/features/pieces/utils/form-utils';
import { authenticationSession } from '@/lib/authentication-session';
-import { OAuth2App } from '@/lib/oauth2-utils';
-import { appConnectionsApi } from './api/app-connections';
-import { globalConnectionsApi } from './api/global-connections';
+import { appConnectionsApi } from '../api/app-connections';
+import { globalConnectionsApi } from '../api/global-connections';
export class ConnectionNameAlreadyExists extends Error {
constructor() {
diff --git a/packages/web/src/features/flow-runs/lib/flow-runs-api.ts b/packages/web/src/features/flow-runs/api/flow-runs-api.ts
similarity index 100%
rename from packages/web/src/features/flow-runs/lib/flow-runs-api.ts
rename to packages/web/src/features/flow-runs/api/flow-runs-api.ts
diff --git a/packages/web/src/features/flow-runs/components/runs-table/columns.tsx b/packages/web/src/features/flow-runs/components/runs-table/columns.tsx
index f4a5ec6c1f6..4f1046b8a77 100644
--- a/packages/web/src/features/flow-runs/components/runs-table/columns.tsx
+++ b/packages/web/src/features/flow-runs/components/runs-table/columns.tsx
@@ -13,26 +13,26 @@ import {
} from 'lucide-react';
import { Dispatch, SetStateAction } from 'react';
+import { RowDataWithActions } from '@/components/custom/data-table';
+import { DataTableColumnHeader } from '@/components/custom/data-table/data-table-column-header';
+import { TruncatedColumnTextValue } from '@/components/custom/data-table/truncated-column-text-value';
+import { FormattedDate } from '@/components/custom/formatted-date';
+import { StatusIconWithText } from '@/components/custom/status-icon-with-text';
import { Button } from '@/components/ui/button';
import { Checkbox } from '@/components/ui/checkbox';
-import { RowDataWithActions } from '@/components/ui/data-table';
-import { DataTableColumnHeader } from '@/components/ui/data-table/data-table-column-header';
-import { TruncatedColumnTextValue } from '@/components/ui/data-table/truncated-column-text-value';
import {
DropdownMenu,
DropdownMenuContent,
DropdownMenuItem,
DropdownMenuTrigger,
} from '@/components/ui/dropdown-menu';
-import { FormattedDate } from '@/components/ui/formatted-date';
-import { StatusIconWithText } from '@/components/ui/status-icon-with-text';
import {
Tooltip,
TooltipContent,
TooltipTrigger,
} from '@/components/ui/tooltip';
-import { flowRunUtils } from '@/features/flow-runs/lib/flow-run-utils';
-import { formatUtils } from '@/lib/utils';
+import { flowRunUtils } from '@/features/flow-runs/utils/flow-run-utils';
+import { formatUtils } from '@/lib/format-utils';
type SelectedRow = {
id: string;
diff --git a/packages/web/src/features/flow-runs/components/runs-table/index.tsx b/packages/web/src/features/flow-runs/components/runs-table/index.tsx
index 6f71effd235..b0056df1bfc 100644
--- a/packages/web/src/features/flow-runs/components/runs-table/index.tsx
+++ b/packages/web/src/features/flow-runs/components/runs-table/index.tsx
@@ -20,29 +20,29 @@ import {
import { useMemo, useCallback, useState } from 'react';
import { useNavigate, useSearchParams } from 'react-router-dom';
-import { PermissionNeededTooltip } from '@/components/custom/permission-needed-tooltip';
-import { Button } from '@/components/ui/button';
import {
BulkAction,
CURSOR_QUERY_PARAM,
LIMIT_QUERY_PARAM,
DataTable,
DataTableFilters,
-} from '@/components/ui/data-table';
+} from '@/components/custom/data-table';
+import { MessageTooltip } from '@/components/custom/message-tooltip';
+import { PermissionNeededTooltip } from '@/components/custom/permission-needed-tooltip';
+import { Button } from '@/components/ui/button';
import {
DropdownMenu,
DropdownMenuContent,
DropdownMenuItem,
DropdownMenuTrigger,
} from '@/components/ui/dropdown-menu';
-import { MessageTooltip } from '@/components/ui/message-tooltip';
-import { flowRunUtils } from '@/features/flow-runs/lib/flow-run-utils';
-import { flowRunsApi } from '@/features/flow-runs/lib/flow-runs-api';
-import { flowHooks } from '@/features/flows/lib/flow-hooks';
+import { flowRunsApi } from '@/features/flow-runs/api/flow-runs-api';
+import { flowRunUtils } from '@/features/flow-runs/utils/flow-run-utils';
+import { flowHooks } from '@/features/flows/hooks/flow-hooks';
import { useAuthorization } from '@/hooks/authorization-hooks';
import { authenticationSession } from '@/lib/authentication-session';
+import { formatUtils } from '@/lib/format-utils';
import { useNewWindow } from '@/lib/navigation-utils';
-import { formatUtils } from '@/lib/utils';
import { runsTableColumns } from './columns';
import {
diff --git a/packages/web/src/features/flow-runs/components/runs-table/retried-runs-snackbar.tsx b/packages/web/src/features/flow-runs/components/runs-table/retried-runs-snackbar.tsx
index 778e6e7582d..e2598fd3351 100644
--- a/packages/web/src/features/flow-runs/components/runs-table/retried-runs-snackbar.tsx
+++ b/packages/web/src/features/flow-runs/components/runs-table/retried-runs-snackbar.tsx
@@ -2,8 +2,8 @@ import { InfoCircledIcon } from '@radix-ui/react-icons';
import { t } from 'i18next';
import { useNavigate, useSearchParams } from 'react-router-dom';
+import { LIMIT_QUERY_PARAM } from '@/components/custom/data-table';
import { Button } from '@/components/ui/button';
-import { LIMIT_QUERY_PARAM } from '@/components/ui/data-table';
import { authenticationSession } from '@/lib/authentication-session';
export const RUN_IDS_QUERY_PARAM = 'flowRunIds';
diff --git a/packages/web/src/features/flow-runs/components/step-status-icon.tsx b/packages/web/src/features/flow-runs/components/step-status-icon.tsx
index 31fa2a71bfb..f34883a40c3 100644
--- a/packages/web/src/features/flow-runs/components/step-status-icon.tsx
+++ b/packages/web/src/features/flow-runs/components/step-status-icon.tsx
@@ -2,13 +2,13 @@ import { StepOutputStatus } from '@activepieces/shared';
import { t } from 'i18next';
import React from 'react';
-import { LoadingSpinner } from '@/components/ui/spinner';
+import { LoadingSpinner } from '@/components/custom/spinner';
import {
Tooltip,
TooltipContent,
TooltipTrigger,
} from '@/components/ui/tooltip';
-import { flowRunUtils } from '@/features/flow-runs/lib/flow-run-utils';
+import { flowRunUtils } from '@/features/flow-runs/utils/flow-run-utils';
import { cn } from '@/lib/utils';
type StepStatusIconProps = {
diff --git a/packages/web/src/features/flow-runs/index.ts b/packages/web/src/features/flow-runs/index.ts
new file mode 100644
index 00000000000..2d18fc06fc0
--- /dev/null
+++ b/packages/web/src/features/flow-runs/index.ts
@@ -0,0 +1,4 @@
+export { flowRunsApi } from './api/flow-runs-api';
+export { RunsTable } from './components/runs-table';
+export { StepStatusIcon } from './components/step-status-icon';
+export { flowRunUtils } from './utils/flow-run-utils';
diff --git a/packages/web/src/features/flow-runs/lib/flow-run-utils.ts b/packages/web/src/features/flow-runs/utils/flow-run-utils.ts
similarity index 100%
rename from packages/web/src/features/flow-runs/lib/flow-run-utils.ts
rename to packages/web/src/features/flow-runs/utils/flow-run-utils.ts
diff --git a/packages/web/src/features/flows/lib/flows-api.tsx b/packages/web/src/features/flows/api/flows-api.tsx
similarity index 100%
rename from packages/web/src/features/flows/lib/flows-api.tsx
rename to packages/web/src/features/flows/api/flows-api.tsx
diff --git a/packages/web/src/features/flows/lib/sample-data-api.ts b/packages/web/src/features/flows/api/sample-data-api.ts
similarity index 100%
rename from packages/web/src/features/flows/lib/sample-data-api.ts
rename to packages/web/src/features/flows/api/sample-data-api.ts
diff --git a/packages/web/src/features/flows/lib/trigger-events-api.ts b/packages/web/src/features/flows/api/trigger-events-api.ts
similarity index 100%
rename from packages/web/src/features/flows/lib/trigger-events-api.ts
rename to packages/web/src/features/flows/api/trigger-events-api.ts
diff --git a/packages/web/src/features/flows/lib/trigger-run-api.ts b/packages/web/src/features/flows/api/trigger-run-api.ts
similarity index 100%
rename from packages/web/src/features/flows/lib/trigger-run-api.ts
rename to packages/web/src/features/flows/api/trigger-run-api.ts
diff --git a/packages/web/src/features/flows/lib/Import-flow-button.tsx b/packages/web/src/features/flows/components/Import-flow-button.tsx
similarity index 94%
rename from packages/web/src/features/flows/lib/Import-flow-button.tsx
rename to packages/web/src/features/flows/components/Import-flow-button.tsx
index 58d53115832..ea39c2ba607 100644
--- a/packages/web/src/features/flows/lib/Import-flow-button.tsx
+++ b/packages/web/src/features/flows/components/Import-flow-button.tsx
@@ -3,7 +3,7 @@ import { t } from 'i18next';
import { Import } from 'lucide-react';
import { PermissionNeededTooltip } from '@/components/custom/permission-needed-tooltip';
-import { useEmbedding } from '@/components/embed-provider';
+import { useEmbedding } from '@/components/providers/embed-provider';
import { Button } from '@/components/ui/button';
import {
Tooltip,
@@ -13,7 +13,7 @@ import {
import { useAuthorization } from '@/hooks/authorization-hooks';
import { cn } from '@/lib/utils';
-import { ImportFlowDialog } from '../components/import-flow-dialog';
+import { ImportFlowDialog } from './import-flow-dialog';
type ImportFlowButtonProps = {
variant?: 'default' | 'small';
diff --git a/packages/web/src/features/flows/components/change-owner-dialog.tsx b/packages/web/src/features/flows/components/change-owner-dialog.tsx
index cefd4dda96b..10f0ca1680a 100644
--- a/packages/web/src/features/flows/components/change-owner-dialog.tsx
+++ b/packages/web/src/features/flows/components/change-owner-dialog.tsx
@@ -25,9 +25,9 @@ import {
SelectTrigger,
SelectValue,
} from '@/components/ui/select';
-import { projectMembersHooks } from '@/features/members/lib/project-members-hooks';
+import { projectMembersHooks } from '@/features/members/hooks/project-members-hooks';
-import { flowsApi } from '../lib/flows-api';
+import { flowsApi } from '../api/flows-api';
const ChangeOwnerFormSchema = Type.Object({
ownerId: Type.String({
diff --git a/packages/web/src/features/flows/components/flow-status-toggle.tsx b/packages/web/src/features/flows/components/flow-status-toggle.tsx
index b402e85d630..90e8bd305b6 100644
--- a/packages/web/src/features/flows/components/flow-status-toggle.tsx
+++ b/packages/web/src/features/flows/components/flow-status-toggle.tsx
@@ -9,7 +9,7 @@ import { t } from 'i18next';
import { useEffect, useState } from 'react';
import { ApErrorDialog } from '@/components/custom/ap-error-dialog/ap-error-dialog';
-import { LoadingSpinner } from '@/components/ui/spinner';
+import { LoadingSpinner } from '@/components/custom/spinner';
import { useAuthorization } from '@/hooks/authorization-hooks';
import { Switch } from '../../../components/ui/switch';
@@ -18,8 +18,8 @@ import {
TooltipContent,
TooltipTrigger,
} from '../../../components/ui/tooltip';
-import { flowHooks } from '../lib/flow-hooks';
-import { flowsUtils } from '../lib/flows-utils';
+import { flowHooks } from '../hooks/flow-hooks';
+import { flowsUtils } from '../utils/flows-utils';
type FlowStatusToggleProps = {
flow: PopulatedFlow;
diff --git a/packages/web/src/features/flows/components/import-flow-dialog.tsx b/packages/web/src/features/flows/components/import-flow-dialog.tsx
index a5beee9e733..a9b3b186e67 100644
--- a/packages/web/src/features/flows/components/import-flow-dialog.tsx
+++ b/packages/web/src/features/flows/components/import-flow-dialog.tsx
@@ -14,7 +14,8 @@ import React, { useState, useRef } from 'react';
import { useNavigate } from 'react-router-dom';
import { toast } from 'sonner';
-import { useTelemetry } from '@/components/telemetry-provider';
+import { LoadingSpinner } from '@/components/custom/spinner';
+import { useTelemetry } from '@/components/providers/telemetry-provider';
import { Alert, AlertDescription } from '@/components/ui/alert';
import { Button } from '@/components/ui/button';
import {
@@ -36,15 +37,14 @@ import {
SelectItem,
} from '@/components/ui/select';
import { internalErrorToast } from '@/components/ui/sonner';
-import { LoadingSpinner } from '@/components/ui/spinner';
-import { foldersApi } from '@/features/folders/lib/folders-api';
-import { foldersHooks } from '@/features/folders/lib/folders-hooks';
+import { foldersApi } from '@/features/folders/api/folders-api';
+import { foldersHooks } from '@/features/folders/hooks/folders-hooks';
import { api } from '@/lib/api';
import { authenticationSession } from '@/lib/authentication-session';
import { FormError } from '../../../components/ui/form';
-import { flowHooks } from '../lib/flow-hooks';
-import { templateUtils } from '../lib/template-parser';
+import { flowHooks } from '../hooks/flow-hooks';
+import { templateUtils } from '../utils/template-parser';
export type ImportFlowDialogProps =
| {
diff --git a/packages/web/src/features/flows/components/move-flow-dialog.tsx b/packages/web/src/features/flows/components/move-flow-dialog.tsx
index aa205d1beb5..6254c91251f 100644
--- a/packages/web/src/features/flows/components/move-flow-dialog.tsx
+++ b/packages/web/src/features/flows/components/move-flow-dialog.tsx
@@ -25,9 +25,9 @@ import {
SelectTrigger,
SelectValue,
} from '@/components/ui/select';
-import { foldersHooks } from '@/features/folders/lib/folders-hooks';
+import { foldersHooks } from '@/features/folders/hooks/folders-hooks';
-import { flowsApi } from '../lib/flows-api';
+import { flowsApi } from '../api/flows-api';
const MoveFlowFormSchema = Type.Object({
folder: Type.String({
diff --git a/packages/web/src/features/flows/lib/new-flow-button.tsx b/packages/web/src/features/flows/components/new-flow-button.tsx
similarity index 97%
rename from packages/web/src/features/flows/lib/new-flow-button.tsx
rename to packages/web/src/features/flows/components/new-flow-button.tsx
index 98bf8cdfb1b..512aee4aa34 100644
--- a/packages/web/src/features/flows/lib/new-flow-button.tsx
+++ b/packages/web/src/features/flows/components/new-flow-button.tsx
@@ -12,7 +12,7 @@ import {
import { useAuthorization } from '@/hooks/authorization-hooks';
import { cn } from '@/lib/utils';
-import { flowHooks } from './flow-hooks';
+import { flowHooks } from '../hooks/flow-hooks';
type NewFlowButtonProps = {
variant?: 'default' | 'small';
diff --git a/packages/web/src/features/flows/components/rename-flow-dialog.tsx b/packages/web/src/features/flows/components/rename-flow-dialog.tsx
index 599c58c53d5..cdd01514500 100644
--- a/packages/web/src/features/flows/components/rename-flow-dialog.tsx
+++ b/packages/web/src/features/flows/components/rename-flow-dialog.tsx
@@ -18,7 +18,7 @@ import {
import { Form, FormField, FormItem, FormMessage } from '@/components/ui/form';
import { Input } from '@/components/ui/input';
import { Label } from '@/components/ui/label';
-import { flowsApi } from '@/features/flows/lib/flows-api';
+import { flowsApi } from '@/features/flows/api/flows-api';
const RenameFlowSchema = Type.Object({
displayName: Type.String(),
diff --git a/packages/web/src/features/flows/components/share-template-dialog.tsx b/packages/web/src/features/flows/components/share-template-dialog.tsx
index 4e4564250b1..a421b907bdb 100644
--- a/packages/web/src/features/flows/components/share-template-dialog.tsx
+++ b/packages/web/src/features/flows/components/share-template-dialog.tsx
@@ -17,8 +17,8 @@ import {
import { Form, FormField, FormItem, FormMessage } from '@/components/ui/form';
import { Input } from '@/components/ui/input';
import { Label } from '@/components/ui/label';
-import { flowsApi } from '@/features/flows/lib/flows-api';
-import { templatesApi } from '@/features/templates/lib/templates-api';
+import { flowsApi } from '@/features/flows/api/flows-api';
+import { templatesApi } from '@/features/templates/api/templates-api';
import { userHooks } from '@/hooks/user-hooks';
import { useNewWindow } from '@/lib/navigation-utils';
diff --git a/packages/web/src/features/flows/lib/flow-hooks.tsx b/packages/web/src/features/flows/hooks/flow-hooks.tsx
similarity index 95%
rename from packages/web/src/features/flows/lib/flow-hooks.tsx
rename to packages/web/src/features/flows/hooks/flow-hooks.tsx
index 3a9542fb5a6..b72006bb997 100644
--- a/packages/web/src/features/flows/lib/flow-hooks.tsx
+++ b/packages/web/src/features/flows/hooks/flow-hooks.tsx
@@ -24,19 +24,20 @@ import { useNavigate } from 'react-router-dom';
import { toast } from 'sonner';
import { useApErrorDialogStore } from '@/components/custom/ap-error-dialog/ap-error-dialog-store';
-import { useSocket } from '@/components/socket-provider';
+import { useSocket } from '@/components/providers/socket-provider';
import { internalErrorToast } from '@/components/ui/sonner';
-import { flowRunsApi } from '@/features/flow-runs/lib/flow-runs-api';
-import { foldersApi } from '@/features/folders/lib/folders-api';
-import { pieceSelectorUtils } from '@/features/pieces/lib/piece-selector-utils';
-import { piecesApi } from '@/features/pieces/lib/pieces-api';
-import { stepUtils } from '@/features/pieces/lib/step-utils';
+import { flowRunsApi } from '@/features/flow-runs/api/flow-runs-api';
+import { foldersApi } from '@/features/folders/api/folders-api';
+import { piecesApi } from '@/features/pieces/api/pieces-api';
+import { pieceSelectorUtils } from '@/features/pieces/utils/piece-selector-utils';
+import { stepUtils } from '@/features/pieces/utils/step-utils';
import { flagsHooks } from '@/hooks/flags-hooks';
import { authenticationSession } from '@/lib/authentication-session';
-import { downloadFile, NEW_FLOW_QUERY_PARAM } from '@/lib/utils';
+import { downloadFile } from '@/lib/dom-utils';
+import { NEW_FLOW_QUERY_PARAM } from '@/lib/route-utils';
-import { flowsApi } from './flows-api';
-import { flowsUtils } from './flows-utils';
+import { flowsApi } from '../api/flows-api';
+import { flowsUtils } from '../utils/flows-utils';
const createFlowsQueryKey = (projectId: string) => ['flows', projectId];
export const flowHooks = {
diff --git a/packages/web/src/features/flows/lib/sample-data-hooks.ts b/packages/web/src/features/flows/hooks/sample-data-hooks.ts
similarity index 98%
rename from packages/web/src/features/flows/lib/sample-data-hooks.ts
rename to packages/web/src/features/flows/hooks/sample-data-hooks.ts
index b3c69ebb8aa..d2aee8c2923 100644
--- a/packages/web/src/features/flows/lib/sample-data-hooks.ts
+++ b/packages/web/src/features/flows/hooks/sample-data-hooks.ts
@@ -5,7 +5,7 @@ import {
} from '@activepieces/shared';
import { useQuery, QueryClient } from '@tanstack/react-query';
-import { sampleDataApi } from './sample-data-api';
+import { sampleDataApi } from '../api/sample-data-api';
export const sampleDataHooks = {
useSampleDataForFlow: (
diff --git a/packages/web/src/features/flows/lib/trigger-event-hooks.ts b/packages/web/src/features/flows/hooks/trigger-event-hooks.ts
similarity index 92%
rename from packages/web/src/features/flows/lib/trigger-event-hooks.ts
rename to packages/web/src/features/flows/hooks/trigger-event-hooks.ts
index f580702884e..9187da0a334 100644
--- a/packages/web/src/features/flows/lib/trigger-event-hooks.ts
+++ b/packages/web/src/features/flows/hooks/trigger-event-hooks.ts
@@ -3,7 +3,7 @@ import { useQuery } from '@tanstack/react-query';
import { authenticationSession } from '@/lib/authentication-session';
-import { triggerEventsApi } from './trigger-events-api';
+import { triggerEventsApi } from '../api/trigger-events-api';
export const triggerEventHooks = {
usePollResults: (flowVersionId: string, flowId: string) => {
diff --git a/packages/web/src/features/flows/lib/use-flows-bulk-actions.tsx b/packages/web/src/features/flows/hooks/use-flows-bulk-actions.tsx
similarity index 93%
rename from packages/web/src/features/flows/lib/use-flows-bulk-actions.tsx
rename to packages/web/src/features/flows/hooks/use-flows-bulk-actions.tsx
index e5a431a06b3..95d60440a37 100644
--- a/packages/web/src/features/flows/lib/use-flows-bulk-actions.tsx
+++ b/packages/web/src/features/flows/hooks/use-flows-bulk-actions.tsx
@@ -8,25 +8,25 @@ import { t } from 'i18next';
import { CornerUpLeft, Download, Trash2, UploadCloud } from 'lucide-react';
import { useMemo } from 'react';
+import { BulkAction } from '@/components/custom/data-table';
+import { ConfirmationDeleteDialog } from '@/components/custom/delete-dialog';
import { PermissionNeededTooltip } from '@/components/custom/permission-needed-tooltip';
-import { ConfirmationDeleteDialog } from '@/components/delete-dialog';
-import { useEmbedding } from '@/components/embed-provider';
+import { LoadingSpinner } from '@/components/custom/spinner';
+import { useEmbedding } from '@/components/providers/embed-provider';
import { Button } from '@/components/ui/button';
-import { BulkAction } from '@/components/ui/data-table';
-import { LoadingSpinner } from '@/components/ui/spinner';
import { PublishedNeededTooltip } from '@/features/project-releases/components/published-tooltip';
import { PushToGitDialog } from '@/features/project-releases/components/push-to-git-dialog';
-import { gitSyncHooks } from '@/features/project-releases/lib/git-sync-hooks';
+import { gitSyncHooks } from '@/features/project-releases/hooks/git-sync-hooks';
import { useAuthorization } from '@/hooks/authorization-hooks';
import { platformHooks } from '@/hooks/platform-hooks';
import { authenticationSession } from '@/lib/authentication-session';
+import { flowsApi } from '../api/flows-api';
+import { ImportFlowButton } from '../components/Import-flow-button';
import { MoveFlowDialog } from '../components/move-flow-dialog';
+import { NewFlowButton } from '../components/new-flow-button';
import { flowHooks } from './flow-hooks';
-import { flowsApi } from './flows-api';
-import { ImportFlowButton } from './Import-flow-button';
-import { NewFlowButton } from './new-flow-button';
export const useFlowsBulkActions = ({
selectedRows,
diff --git a/packages/web/src/features/flows/index.ts b/packages/web/src/features/flows/index.ts
new file mode 100644
index 00000000000..046c8435310
--- /dev/null
+++ b/packages/web/src/features/flows/index.ts
@@ -0,0 +1,15 @@
+export { flowsApi } from './api/flows-api';
+export { triggerEventsApi } from './api/trigger-events-api';
+export { triggerRunHooks } from './api/trigger-run-api';
+export { ChangeOwnerDialog } from './components/change-owner-dialog';
+export { FlowStatusToggle } from './components/flow-status-toggle';
+export { FlowVersionStateDot } from './components/flow-version-state-dot';
+export { ImportFlowDialog } from './components/import-flow-dialog';
+export { MoveFlowDialog } from './components/move-flow-dialog';
+export { RenameFlowDialog } from './components/rename-flow-dialog';
+export { ShareTemplateDialog } from './components/share-template-dialog';
+export { flowHooks } from './hooks/flow-hooks';
+export { sampleDataHooks } from './hooks/sample-data-hooks';
+export { triggerEventHooks } from './hooks/trigger-event-hooks';
+export { useFlowsBulkActions } from './hooks/use-flows-bulk-actions';
+export { templateUtils } from './utils/template-parser';
diff --git a/packages/web/src/features/flows/lib/flows-utils.tsx b/packages/web/src/features/flows/utils/flows-utils.tsx
similarity index 96%
rename from packages/web/src/features/flows/lib/flows-utils.tsx
rename to packages/web/src/features/flows/utils/flows-utils.tsx
index 13ca8e1ff95..f6846b0d079 100644
--- a/packages/web/src/features/flows/lib/flows-utils.tsx
+++ b/packages/web/src/features/flows/utils/flows-utils.tsx
@@ -4,9 +4,9 @@ import { t } from 'i18next';
import JSZip from 'jszip';
import { TimerReset, TriangleAlert, Zap } from 'lucide-react';
-import { downloadFile } from '@/lib/utils';
+import { downloadFile } from '@/lib/dom-utils';
-import { flowsApi } from './flows-api';
+import { flowsApi } from '../api/flows-api';
const downloadFlow = async (flowId: string) => {
const template = await flowsApi.getTemplate(flowId, {});
diff --git a/packages/web/src/features/flows/lib/template-parser.ts b/packages/web/src/features/flows/utils/template-parser.ts
similarity index 100%
rename from packages/web/src/features/flows/lib/template-parser.ts
rename to packages/web/src/features/flows/utils/template-parser.ts
diff --git a/packages/web/src/features/folders/lib/folders-api.ts b/packages/web/src/features/folders/api/folders-api.ts
similarity index 100%
rename from packages/web/src/features/folders/lib/folders-api.ts
rename to packages/web/src/features/folders/api/folders-api.ts
diff --git a/packages/web/src/features/folders/component/create-folder-dialog.tsx b/packages/web/src/features/folders/components/create-folder-dialog.tsx
similarity index 99%
rename from packages/web/src/features/folders/component/create-folder-dialog.tsx
rename to packages/web/src/features/folders/components/create-folder-dialog.tsx
index d9ffbcd7f51..d261b951f7e 100644
--- a/packages/web/src/features/folders/component/create-folder-dialog.tsx
+++ b/packages/web/src/features/folders/components/create-folder-dialog.tsx
@@ -35,7 +35,7 @@ import { api } from '@/lib/api';
import { authenticationSession } from '@/lib/authentication-session';
import { cn } from '@/lib/utils';
-import { foldersApi } from '../lib/folders-api';
+import { foldersApi } from '../api/folders-api';
type CreateFolderDialogProps = {
updateSearchParams: (_folderId?: string) => void;
diff --git a/packages/web/src/features/folders/component/folder-actions.tsx b/packages/web/src/features/folders/components/folder-actions.tsx
similarity index 97%
rename from packages/web/src/features/folders/component/folder-actions.tsx
rename to packages/web/src/features/folders/components/folder-actions.tsx
index f14c2fa5a5b..b6982cc4db1 100644
--- a/packages/web/src/features/folders/component/folder-actions.tsx
+++ b/packages/web/src/features/folders/components/folder-actions.tsx
@@ -3,8 +3,8 @@ import { t } from 'i18next';
import { EllipsisVertical, Pencil, Trash2 } from 'lucide-react';
import { useState } from 'react';
+import { ConfirmationDeleteDialog } from '@/components/custom/delete-dialog';
import { PermissionNeededTooltip } from '@/components/custom/permission-needed-tooltip';
-import { ConfirmationDeleteDialog } from '@/components/delete-dialog';
import { Button, buttonVariants } from '@/components/ui/button';
import {
DropdownMenu,
@@ -15,7 +15,7 @@ import {
import { useAuthorization } from '@/hooks/authorization-hooks';
import { cn } from '@/lib/utils';
-import { foldersApi } from '../lib/folders-api';
+import { foldersApi } from '../api/folders-api';
import { RenameFolderDialog } from './rename-folder-dialog';
diff --git a/packages/web/src/features/folders/component/folder-badge.tsx b/packages/web/src/features/folders/components/folder-badge.tsx
similarity index 90%
rename from packages/web/src/features/folders/component/folder-badge.tsx
rename to packages/web/src/features/folders/components/folder-badge.tsx
index 9c58fdfb1bb..dc1f715ca1c 100644
--- a/packages/web/src/features/folders/component/folder-badge.tsx
+++ b/packages/web/src/features/folders/components/folder-badge.tsx
@@ -2,7 +2,7 @@ import { t } from 'i18next';
import { Skeleton } from '@/components/ui/skeleton';
-import { foldersHooks } from '../lib/folders-hooks';
+import { foldersHooks } from '../hooks/folders-hooks';
type FolderBadgeProps = {
folderId: string;
diff --git a/packages/web/src/features/folders/component/folder-filter-list.tsx b/packages/web/src/features/folders/components/folder-filter-list.tsx
similarity index 96%
rename from packages/web/src/features/folders/component/folder-filter-list.tsx
rename to packages/web/src/features/folders/components/folder-filter-list.tsx
index d5682980b9c..065433ebbd1 100644
--- a/packages/web/src/features/folders/component/folder-filter-list.tsx
+++ b/packages/web/src/features/folders/components/folder-filter-list.tsx
@@ -11,18 +11,18 @@ import { useEffect } from 'react';
import { useLocation, useSearchParams } from 'react-router-dom';
import { PermissionNeededTooltip } from '@/components/custom/permission-needed-tooltip';
+import { TextWithIcon } from '@/components/custom/text-with-icon';
import { Button } from '@/components/ui/button';
import { ScrollArea } from '@/components/ui/scroll-area';
import { Separator } from '@/components/ui/separator';
import { Skeleton } from '@/components/ui/skeleton';
-import { TextWithIcon } from '@/components/ui/text-with-icon';
-import { flowsApi } from '@/features/flows/lib/flows-api';
+import { flowsApi } from '@/features/flows/api/flows-api';
import { useAuthorization } from '@/hooks/authorization-hooks';
import { authenticationSession } from '@/lib/authentication-session';
import { cn } from '@/lib/utils';
-import { foldersHooks } from '../lib/folders-hooks';
-import { foldersUtils } from '../lib/folders-utils';
+import { foldersHooks } from '../hooks/folders-hooks';
+import { foldersUtils } from '../utils/folders-utils';
import { CreateFolderDialog } from './create-folder-dialog';
import { FolderActions } from './folder-actions';
diff --git a/packages/web/src/features/folders/component/rename-folder-dialog.tsx b/packages/web/src/features/folders/components/rename-folder-dialog.tsx
similarity index 97%
rename from packages/web/src/features/folders/component/rename-folder-dialog.tsx
rename to packages/web/src/features/folders/components/rename-folder-dialog.tsx
index 54a34d386d9..25ea900d0c2 100644
--- a/packages/web/src/features/folders/component/rename-folder-dialog.tsx
+++ b/packages/web/src/features/folders/components/rename-folder-dialog.tsx
@@ -19,9 +19,9 @@ import {
import { FormField, FormItem, FormMessage } from '@/components/ui/form';
import { Input } from '@/components/ui/input';
import { internalErrorToast } from '@/components/ui/sonner';
-import { validationUtils } from '@/lib/utils';
+import { validationUtils } from '@/lib/validation-utils';
-import { foldersApi } from '../lib/folders-api';
+import { foldersApi } from '../api/folders-api';
const RenameFolderSchema = Type.Object({
displayName: Type.String({
diff --git a/packages/web/src/features/folders/lib/folders-hooks.ts b/packages/web/src/features/folders/hooks/folders-hooks.ts
similarity index 93%
rename from packages/web/src/features/folders/lib/folders-hooks.ts
rename to packages/web/src/features/folders/hooks/folders-hooks.ts
index fd6b6235ae1..e2a4368744c 100644
--- a/packages/web/src/features/folders/lib/folders-hooks.ts
+++ b/packages/web/src/features/folders/hooks/folders-hooks.ts
@@ -3,7 +3,7 @@ import { useQuery } from '@tanstack/react-query';
import { authenticationSession } from '@/lib/authentication-session';
-import { foldersApi } from './folders-api';
+import { foldersApi } from '../api/folders-api';
export const foldersHooks = {
useFolders: () => {
diff --git a/packages/web/src/features/folders/index.ts b/packages/web/src/features/folders/index.ts
new file mode 100644
index 00000000000..9434ae54b51
--- /dev/null
+++ b/packages/web/src/features/folders/index.ts
@@ -0,0 +1,6 @@
+export { foldersApi } from './api/folders-api';
+export {
+ FolderFilterList,
+ folderIdParamName,
+} from './components/folder-filter-list';
+export { foldersHooks } from './hooks/folders-hooks';
diff --git a/packages/web/src/features/folders/lib/folders-utils.ts b/packages/web/src/features/folders/utils/folders-utils.ts
similarity index 100%
rename from packages/web/src/features/folders/lib/folders-utils.ts
rename to packages/web/src/features/folders/utils/folders-utils.ts
diff --git a/packages/web/src/features/forms/lib/human-input-api.tsx b/packages/web/src/features/forms/api/human-input-api.tsx
similarity index 100%
rename from packages/web/src/features/forms/lib/human-input-api.tsx
rename to packages/web/src/features/forms/api/human-input-api.tsx
diff --git a/packages/web/src/features/forms/components/ap-form.tsx b/packages/web/src/features/forms/components/ap-form.tsx
index 594577e736b..ef795f991fe 100644
--- a/packages/web/src/features/forms/components/ap-form.tsx
+++ b/packages/web/src/features/forms/components/ap-form.tsx
@@ -19,7 +19,8 @@ import { useLocation } from 'react-router-dom';
import { toast } from 'sonner';
import { ApMarkdown } from '@/components/custom/markdown';
-import { ShowPoweredBy } from '@/components/show-powered-by';
+import { ReadMoreDescription } from '@/components/custom/read-more-description';
+import { ShowPoweredBy } from '@/components/custom/show-powered-by';
import { Button } from '@/components/ui/button';
import { Card, CardContent, CardHeader, CardTitle } from '@/components/ui/card';
import {
@@ -30,13 +31,12 @@ import {
FormItem,
} from '@/components/ui/form';
import { Input } from '@/components/ui/input';
-import { ReadMoreDescription } from '@/components/ui/read-more-description';
import { Textarea } from '@/components/ui/textarea';
import { flagsHooks } from '@/hooks/flags-hooks';
import { api } from '@/lib/api';
import { Checkbox } from '../../../components/ui/checkbox';
-import { humanInputApi } from '../lib/human-input-api';
+import { humanInputApi } from '../api/human-input-api';
type ApFormProps = {
form: FormResponse;
diff --git a/packages/web/src/features/forms/index.ts b/packages/web/src/features/forms/index.ts
new file mode 100644
index 00000000000..430d08c0d79
--- /dev/null
+++ b/packages/web/src/features/forms/index.ts
@@ -0,0 +1,2 @@
+export { humanInputApi } from './api/human-input-api';
+export { ApForm } from './components/ap-form';
diff --git a/packages/web/src/features/members/lib/project-members-api.ts b/packages/web/src/features/members/api/project-members-api.ts
similarity index 100%
rename from packages/web/src/features/members/lib/project-members-api.ts
rename to packages/web/src/features/members/api/project-members-api.ts
diff --git a/packages/web/src/features/members/lib/user-invitation.ts b/packages/web/src/features/members/api/user-invitation.ts
similarity index 100%
rename from packages/web/src/features/members/lib/user-invitation.ts
rename to packages/web/src/features/members/api/user-invitation.ts
diff --git a/packages/web/src/features/members/component/accept-invitation.tsx b/packages/web/src/features/members/components/accept-invitation.tsx
similarity index 95%
rename from packages/web/src/features/members/component/accept-invitation.tsx
rename to packages/web/src/features/members/components/accept-invitation.tsx
index 47de900469c..6cc8b315ae0 100644
--- a/packages/web/src/features/members/component/accept-invitation.tsx
+++ b/packages/web/src/features/members/components/accept-invitation.tsx
@@ -4,11 +4,11 @@ import { t } from 'i18next';
import { useEffect, useState } from 'react';
import { useNavigate, useSearchParams } from 'react-router-dom';
+import { LoadingSpinner } from '@/components/custom/spinner';
import { internalErrorToast } from '@/components/ui/sonner';
-import { LoadingSpinner } from '@/components/ui/spinner';
import { api } from '../../../lib/api';
-import { userInvitationApi } from '../lib/user-invitation';
+import { userInvitationApi } from '../api/user-invitation';
const AcceptInvitation = () => {
const [isInvitationLinkValid, setIsInvitationLinkValid] = useState(true);
diff --git a/packages/web/src/features/members/component/edit-role-dialog.tsx b/packages/web/src/features/members/components/edit-role-dialog.tsx
similarity index 95%
rename from packages/web/src/features/members/component/edit-role-dialog.tsx
rename to packages/web/src/features/members/components/edit-role-dialog.tsx
index c6d44bc52be..046a12671a0 100644
--- a/packages/web/src/features/members/component/edit-role-dialog.tsx
+++ b/packages/web/src/features/members/components/edit-role-dialog.tsx
@@ -22,9 +22,9 @@ import {
SelectValue,
} from '@/components/ui/select';
import { internalErrorToast } from '@/components/ui/sonner';
-import { projectRoleApi } from '@/features/platform-admin/lib/project-role-api';
+import { projectRoleApi } from '@/features/platform-admin/api/project-role-api';
-import { projectMembersApi } from '../lib/project-members-api';
+import { projectMembersApi } from '../api/project-members-api';
interface EditRoleDialogProps {
member: ProjectMemberWithUser;
diff --git a/packages/web/src/features/members/component/invitation-card.tsx b/packages/web/src/features/members/components/invitation-card.tsx
similarity index 86%
rename from packages/web/src/features/members/component/invitation-card.tsx
rename to packages/web/src/features/members/components/invitation-card.tsx
index 6c6024c1c5d..f4b9ea637e6 100644
--- a/packages/web/src/features/members/component/invitation-card.tsx
+++ b/packages/web/src/features/members/components/invitation-card.tsx
@@ -2,14 +2,14 @@ import { Permission, UserInvitation } from '@activepieces/shared';
import { t } from 'i18next';
import { Trash } from 'lucide-react';
+import { ConfirmationDeleteDialog } from '@/components/custom/delete-dialog';
import { PermissionNeededTooltip } from '@/components/custom/permission-needed-tooltip';
-import { UserAvatar } from '@/components/ui/user-avatar';
+import { UserAvatar } from '@/components/custom/user-avatar';
+import { Button } from '@/components/ui/button';
import { useAuthorization } from '@/hooks/authorization-hooks';
-import { ConfirmationDeleteDialog } from '../../../components/delete-dialog';
-import { Button } from '../../../components/ui/button';
-import { userInvitationApi } from '../lib/user-invitation';
-import { userInvitationsHooks } from '../lib/user-invitations-hooks';
+import { userInvitationApi } from '../api/user-invitation';
+import { userInvitationsHooks } from '../hooks/user-invitations-hooks';
export function InvitationCard({ invitation }: { invitation: UserInvitation }) {
const { refetch } = userInvitationsHooks.useInvitations();
diff --git a/packages/web/src/features/members/component/invite-user/invite-user-dialog.tsx b/packages/web/src/features/members/components/invite-user/invite-user-dialog.tsx
similarity index 95%
rename from packages/web/src/features/members/component/invite-user/invite-user-dialog.tsx
rename to packages/web/src/features/members/components/invite-user/invite-user-dialog.tsx
index ef6a8058249..c34de0a4c4d 100644
--- a/packages/web/src/features/members/component/invite-user/invite-user-dialog.tsx
+++ b/packages/web/src/features/members/components/invite-user/invite-user-dialog.tsx
@@ -16,7 +16,8 @@ import { useForm } from 'react-hook-form';
import { useLocation } from 'react-router-dom';
import { toast } from 'sonner';
-import { useEmbedding } from '@/components/embed-provider';
+import { TagInput } from '@/components/custom/tag-input';
+import { useEmbedding } from '@/components/providers/embed-provider';
import { Button } from '@/components/ui/button';
import {
Dialog,
@@ -30,22 +31,21 @@ import {
import { FormField, FormItem, Form, FormMessage } from '@/components/ui/form';
import { Input } from '@/components/ui/input';
import { Label } from '@/components/ui/label';
-import { TagInput } from '@/components/ui/tag-input';
import {
Tooltip,
TooltipContent,
TooltipTrigger,
} from '@/components/ui/tooltip';
-import { PlatformRoleSelect } from '@/features/members/component/platform-role-select';
-import { ProjectRoleSelect } from '@/features/members/component/project-role-select';
-import { userInvitationApi } from '@/features/members/lib/user-invitation';
+import { userInvitationApi } from '@/features/members/api/user-invitation';
+import { PlatformRoleSelect } from '@/features/members/components/platform-role-select';
+import { ProjectRoleSelect } from '@/features/members/components/project-role-select';
+import { projectCollectionUtils } from '@/features/projects/stores/project-collection';
import { useAuthorization } from '@/hooks/authorization-hooks';
import { platformHooks } from '@/hooks/platform-hooks';
-import { projectCollectionUtils } from '@/hooks/project-collection';
import { HttpError } from '@/lib/api';
-import { formatUtils } from '@/lib/utils';
+import { formatUtils } from '@/lib/format-utils';
-import { userInvitationsHooks } from '../../lib/user-invitations-hooks';
+import { userInvitationsHooks } from '../../hooks/user-invitations-hooks';
import { UserSuggestionsPopover } from './user-suggestions-popover';
diff --git a/packages/web/src/features/members/component/invite-user/suggested-user-item.tsx b/packages/web/src/features/members/components/invite-user/suggested-user-item.tsx
similarity index 96%
rename from packages/web/src/features/members/component/invite-user/suggested-user-item.tsx
rename to packages/web/src/features/members/components/invite-user/suggested-user-item.tsx
index 4dc9103449a..c5d2a6dc96a 100644
--- a/packages/web/src/features/members/component/invite-user/suggested-user-item.tsx
+++ b/packages/web/src/features/members/components/invite-user/suggested-user-item.tsx
@@ -1,10 +1,11 @@
import { t } from 'i18next';
import { Mail } from 'lucide-react';
+import { UserAvatar } from '@/components/custom/user-avatar';
import { Badge } from '@/components/ui/badge';
import { CommandItem } from '@/components/ui/command';
-import { UserAvatar } from '@/components/ui/user-avatar';
-import { cn, formatUtils } from '@/lib/utils';
+import { formatUtils } from '@/lib/format-utils';
+import { cn } from '@/lib/utils';
import { EmailStatusType } from './types';
import { SuggestedUser } from './use-user-suggestions';
diff --git a/packages/web/src/features/members/component/invite-user/types.ts b/packages/web/src/features/members/components/invite-user/types.ts
similarity index 100%
rename from packages/web/src/features/members/component/invite-user/types.ts
rename to packages/web/src/features/members/components/invite-user/types.ts
diff --git a/packages/web/src/features/members/component/invite-user/use-user-suggestions.ts b/packages/web/src/features/members/components/invite-user/use-user-suggestions.ts
similarity index 95%
rename from packages/web/src/features/members/component/invite-user/use-user-suggestions.ts
rename to packages/web/src/features/members/components/invite-user/use-user-suggestions.ts
index 0c7a0720f9d..c400039a497 100644
--- a/packages/web/src/features/members/component/invite-user/use-user-suggestions.ts
+++ b/packages/web/src/features/members/components/invite-user/use-user-suggestions.ts
@@ -5,11 +5,11 @@ import {
} from '@activepieces/shared';
import { useMemo } from 'react';
-import { projectMembersHooks } from '@/features/members/lib/project-members-hooks';
-import { userInvitationsHooks } from '@/features/members/lib/user-invitations-hooks';
+import { projectMembersHooks } from '@/features/members/hooks/project-members-hooks';
+import { userInvitationsHooks } from '@/features/members/hooks/user-invitations-hooks';
import { platformUserHooks } from '@/hooks/platform-user-hooks';
import { userHooks } from '@/hooks/user-hooks';
-import { formatUtils } from '@/lib/utils';
+import { formatUtils } from '@/lib/format-utils';
import { EmailStatusType } from './types';
diff --git a/packages/web/src/features/members/component/invite-user/user-suggestions-popover.tsx b/packages/web/src/features/members/components/invite-user/user-suggestions-popover.tsx
similarity index 100%
rename from packages/web/src/features/members/component/invite-user/user-suggestions-popover.tsx
rename to packages/web/src/features/members/components/invite-user/user-suggestions-popover.tsx
diff --git a/packages/web/src/features/members/component/platform-role-select.tsx b/packages/web/src/features/members/components/platform-role-select.tsx
similarity index 91%
rename from packages/web/src/features/members/component/platform-role-select.tsx
rename to packages/web/src/features/members/components/platform-role-select.tsx
index 612406f1b8d..0b214d00c13 100644
--- a/packages/web/src/features/members/component/platform-role-select.tsx
+++ b/packages/web/src/features/members/components/platform-role-select.tsx
@@ -3,7 +3,7 @@ import { UseFormReturn } from 'react-hook-form';
import { FormField, FormItem, FormMessage } from '@/components/ui/form';
import { Label } from '@/components/ui/label';
-import { RoleSelector } from '@/features/members/component/role-selector';
+import { RoleSelector } from '@/features/members/components/role-selector';
type PlatformRoleSelectProps = {
form: UseFormReturn;
diff --git a/packages/web/src/features/members/component/project-member-card.tsx b/packages/web/src/features/members/components/project-member-card.tsx
similarity index 87%
rename from packages/web/src/features/members/component/project-member-card.tsx
rename to packages/web/src/features/members/components/project-member-card.tsx
index 5cc6223d528..858118c9aa1 100644
--- a/packages/web/src/features/members/component/project-member-card.tsx
+++ b/packages/web/src/features/members/components/project-member-card.tsx
@@ -2,15 +2,15 @@ import { ProjectMemberWithUser, Permission } from '@activepieces/shared';
import { t } from 'i18next';
import { Trash } from 'lucide-react';
+import { ConfirmationDeleteDialog } from '@/components/custom/delete-dialog';
import { PermissionNeededTooltip } from '@/components/custom/permission-needed-tooltip';
-import { UserAvatar } from '@/components/ui/user-avatar';
+import { UserAvatar } from '@/components/custom/user-avatar';
+import { Button } from '@/components/ui/button';
+import { projectCollectionUtils } from '@/features/projects/stores/project-collection';
import { useAuthorization } from '@/hooks/authorization-hooks';
-import { projectCollectionUtils } from '@/hooks/project-collection';
-import { ConfirmationDeleteDialog } from '../../../components/delete-dialog';
-import { Button } from '../../../components/ui/button';
-import { projectMembersApi } from '../lib/project-members-api';
-import { projectMembersHooks } from '../lib/project-members-hooks';
+import { projectMembersApi } from '../api/project-members-api';
+import { projectMembersHooks } from '../hooks/project-members-hooks';
import { EditRoleDialog } from './edit-role-dialog';
diff --git a/packages/web/src/features/members/component/project-role-select.tsx b/packages/web/src/features/members/components/project-role-select.tsx
similarity index 92%
rename from packages/web/src/features/members/component/project-role-select.tsx
rename to packages/web/src/features/members/components/project-role-select.tsx
index b79e2442160..b3bb4ccdf18 100644
--- a/packages/web/src/features/members/component/project-role-select.tsx
+++ b/packages/web/src/features/members/components/project-role-select.tsx
@@ -6,8 +6,8 @@ import { UseFormReturn } from 'react-hook-form';
import { FormField, FormItem, FormMessage } from '@/components/ui/form';
import { Label } from '@/components/ui/label';
-import { RoleSelector } from '@/features/members/component/role-selector';
-import { projectRoleApi } from '@/features/platform-admin/lib/project-role-api';
+import { RoleSelector } from '@/features/members/components/role-selector';
+import { projectRoleApi } from '@/features/platform-admin/api/project-role-api';
import { platformHooks } from '@/hooks/platform-hooks';
type ProjectRoleSelectProps = {
diff --git a/packages/web/src/features/members/component/role-selector.tsx b/packages/web/src/features/members/components/role-selector.tsx
similarity index 100%
rename from packages/web/src/features/members/component/role-selector.tsx
rename to packages/web/src/features/members/components/role-selector.tsx
diff --git a/packages/web/src/features/members/lib/project-members-hooks.ts b/packages/web/src/features/members/hooks/project-members-hooks.ts
similarity index 94%
rename from packages/web/src/features/members/lib/project-members-hooks.ts
rename to packages/web/src/features/members/hooks/project-members-hooks.ts
index 16cf44acba6..b4019cc7731 100644
--- a/packages/web/src/features/members/lib/project-members-hooks.ts
+++ b/packages/web/src/features/members/hooks/project-members-hooks.ts
@@ -8,8 +8,7 @@ import { useQuery } from '@tanstack/react-query';
import { flagsHooks } from '@/hooks/flags-hooks';
import { authenticationSession } from '../../../lib/authentication-session';
-
-import { projectMembersApi } from './project-members-api';
+import { projectMembersApi } from '../api/project-members-api';
export const projectMembersHooks = {
useProjectMembers: () => {
diff --git a/packages/web/src/features/members/lib/user-invitations-hooks.ts b/packages/web/src/features/members/hooks/user-invitations-hooks.ts
similarity index 92%
rename from packages/web/src/features/members/lib/user-invitations-hooks.ts
rename to packages/web/src/features/members/hooks/user-invitations-hooks.ts
index 2095e474b84..736a75f0f1f 100644
--- a/packages/web/src/features/members/lib/user-invitations-hooks.ts
+++ b/packages/web/src/features/members/hooks/user-invitations-hooks.ts
@@ -1,7 +1,7 @@
import { InvitationType, UserInvitation } from '@activepieces/shared';
import { useQuery } from '@tanstack/react-query';
-import { userInvitationApi } from './user-invitation';
+import { userInvitationApi } from '../api/user-invitation';
const userInvitationsQueryKey = 'user-invitations';
diff --git a/packages/web/src/features/members/index.ts b/packages/web/src/features/members/index.ts
new file mode 100644
index 00000000000..a5875d301df
--- /dev/null
+++ b/packages/web/src/features/members/index.ts
@@ -0,0 +1,9 @@
+export { projectMembersApi } from './api/project-members-api';
+export { userInvitationApi } from './api/user-invitation';
+export { AcceptInvitation } from './components/accept-invitation';
+export { InviteUserDialog } from './components/invite-user/invite-user-dialog';
+export { PlatformRoleSelect } from './components/platform-role-select';
+export { ProjectRoleSelect } from './components/project-role-select';
+export { RoleSelector } from './components/role-selector';
+export { projectMembersHooks } from './hooks/project-members-hooks';
+export { userInvitationsHooks } from './hooks/user-invitations-hooks';
diff --git a/packages/web/src/features/pieces/lib/pieces-api.ts b/packages/web/src/features/pieces/api/pieces-api.ts
similarity index 100%
rename from packages/web/src/features/pieces/lib/pieces-api.ts
rename to packages/web/src/features/pieces/api/pieces-api.ts
diff --git a/packages/web/src/features/pieces/components/install-piece-dialog.tsx b/packages/web/src/features/pieces/components/install-piece-dialog.tsx
index 3c9969cf13f..6789eda9752 100644
--- a/packages/web/src/features/pieces/components/install-piece-dialog.tsx
+++ b/packages/web/src/features/pieces/components/install-piece-dialog.tsx
@@ -45,7 +45,7 @@ import { platformHooks } from '@/hooks/platform-hooks';
import { api } from '@/lib/api';
import { authenticationSession } from '@/lib/authentication-session';
-import { piecesApi } from '../lib/pieces-api';
+import { piecesApi } from '../api/pieces-api';
const FormSchema = Type.Object(
{
packageType: Type.Enum(PackageType),
diff --git a/packages/web/src/features/pieces/components/piece-display-name.tsx b/packages/web/src/features/pieces/components/piece-display-name.tsx
index e72372ea1e9..c059055a7c2 100644
--- a/packages/web/src/features/pieces/components/piece-display-name.tsx
+++ b/packages/web/src/features/pieces/components/piece-display-name.tsx
@@ -1,4 +1,4 @@
-import { piecesHooks } from '../lib/pieces-hooks';
+import { piecesHooks } from '../hooks/pieces-hooks';
type PieceDisplayNameProps = {
pieceName: string;
@@ -13,4 +13,4 @@ const PieceDisplayName = ({ pieceName, fallback }: PieceDisplayNameProps) => {
return {pieceModel?.displayName || fallback || pieceName};
};
-export default PieceDisplayName;
+export { PieceDisplayName };
diff --git a/packages/web/src/features/pieces/components/piece-icon-from-name.tsx b/packages/web/src/features/pieces/components/piece-icon-from-name.tsx
index 98b766dd0bd..7e01f1d3aa7 100644
--- a/packages/web/src/features/pieces/components/piece-icon-from-name.tsx
+++ b/packages/web/src/features/pieces/components/piece-icon-from-name.tsx
@@ -1,4 +1,4 @@
-import { piecesHooks } from '../lib/pieces-hooks';
+import { piecesHooks } from '../hooks/pieces-hooks';
import { PieceIcon } from './piece-icon';
@@ -33,4 +33,4 @@ const PieceIconWithPieceName = ({
);
};
-export default PieceIconWithPieceName;
+export { PieceIconWithPieceName };
diff --git a/packages/web/src/features/pieces/components/piece-icon-list.tsx b/packages/web/src/features/pieces/components/piece-icon-list.tsx
index b88ab1dd3b6..161d811cde5 100644
--- a/packages/web/src/features/pieces/components/piece-icon-list.tsx
+++ b/packages/web/src/features/pieces/components/piece-icon-list.tsx
@@ -13,9 +13,9 @@ import {
TooltipContent,
TooltipTrigger,
} from '../../../components/ui/tooltip';
-import { StepMetadata } from '../../../lib/types';
-import { piecesHooks } from '../lib/pieces-hooks';
-import { extractPieceNamesAndCoreMetadata } from '../lib/step-utils';
+import { piecesHooks } from '../hooks/pieces-hooks';
+import { StepMetadata } from '../types';
+import { extractPieceNamesAndCoreMetadata } from '../utils/step-utils';
import { PieceIcon } from './piece-icon';
diff --git a/packages/web/src/features/pieces/components/piece-icon.tsx b/packages/web/src/features/pieces/components/piece-icon.tsx
index 71f2d87d2f2..5ad5b924787 100644
--- a/packages/web/src/features/pieces/components/piece-icon.tsx
+++ b/packages/web/src/features/pieces/components/piece-icon.tsx
@@ -1,8 +1,8 @@
import { VariantProps, cva } from 'class-variance-authority';
import React from 'react';
-import { ImageWithColorBackground } from '@/components/ui/image-with-color-background';
-import ImageWithFallback from '@/components/ui/image-with-fallback';
+import { ImageWithColorBackground } from '@/components/custom/image-with-color-background';
+import ImageWithFallback from '@/components/custom/image-with-fallback';
import { Skeleton } from '@/components/ui/skeleton';
import {
Tooltip,
diff --git a/packages/web/src/features/pieces/components/piece-selector-search.tsx b/packages/web/src/features/pieces/components/piece-selector-search.tsx
index 6047fefb7e1..33b259008ea 100644
--- a/packages/web/src/features/pieces/components/piece-selector-search.tsx
+++ b/packages/web/src/features/pieces/components/piece-selector-search.tsx
@@ -1,14 +1,13 @@
import { t } from 'i18next';
import { ArrowLeftIcon } from 'lucide-react';
+import { SearchInput } from '@/components/custom/search-input';
import { Button } from '@/components/ui/button';
-import { usePieceSearchContext } from '@/features/pieces/lib/piece-search-context';
+import { usePieceSearchContext } from '@/features/pieces/stores/piece-search-context';
import {
PieceSelectorTabType,
usePieceSelectorTabs,
-} from '@/features/pieces/lib/piece-selector-tabs-provider';
-
-import { SearchInput } from '../../../components/ui/search-input';
+} from '@/features/pieces/stores/piece-selector-tabs-provider';
type PiecesSearchInputProps = {
searchInputRef: React.RefObject;
diff --git a/packages/web/src/features/pieces/components/piece-selector-tabs.tsx b/packages/web/src/features/pieces/components/piece-selector-tabs.tsx
index da7b09e8611..005d2d43947 100644
--- a/packages/web/src/features/pieces/components/piece-selector-tabs.tsx
+++ b/packages/web/src/features/pieces/components/piece-selector-tabs.tsx
@@ -3,7 +3,7 @@ import { Tabs, TabsTrigger, TabsList } from '@/components/ui/tabs';
import {
PieceSelectorTabType,
usePieceSelectorTabs,
-} from '../lib/piece-selector-tabs-provider';
+} from '../stores/piece-selector-tabs-provider';
type TabType = {
value: PieceSelectorTabType;
diff --git a/packages/web/src/features/pieces/lib/pieces-hooks.ts b/packages/web/src/features/pieces/hooks/pieces-hooks.ts
similarity index 97%
rename from packages/web/src/features/pieces/lib/pieces-hooks.ts
rename to packages/web/src/features/pieces/hooks/pieces-hooks.ts
index f3bb2aec9be..728cad9bdc6 100644
--- a/packages/web/src/features/pieces/lib/pieces-hooks.ts
+++ b/packages/web/src/features/pieces/hooks/pieces-hooks.ts
@@ -19,22 +19,23 @@ import { useMutation, useQueries, useQuery } from '@tanstack/react-query';
import { t } from 'i18next';
import { useTranslation } from 'react-i18next';
-import { useTelemetry } from '@/components/telemetry-provider';
-import { appConnectionsApi } from '@/features/connections/lib/api/app-connections';
-import { flagsHooks } from '@/hooks/flags-hooks';
-import { platformHooks } from '@/hooks/platform-hooks';
-import { authenticationSession } from '@/lib/authentication-session';
+import { useTelemetry } from '@/components/providers/telemetry-provider';
+import { appConnectionsApi } from '@/features/connections/api/app-connections';
import {
StepMetadataWithSuggestions,
CategorizedStepMetadataWithSuggestions,
-} from '@/lib/types';
+} from '@/features/pieces/types';
+import { flagsHooks } from '@/hooks/flags-hooks';
+import { platformHooks } from '@/hooks/platform-hooks';
+import { authenticationSession } from '@/lib/authentication-session';
-import { pieceSearchUtils } from './piece-search-utils';
+import { piecesApi } from '../api/pieces-api';
import {
PieceSelectorTabType,
usePieceSelectorTabs,
-} from './piece-selector-tabs-provider';
-import { piecesApi } from './pieces-api';
+} from '../stores/piece-selector-tabs-provider';
+import { pieceSearchUtils } from '../utils/piece-search-utils';
+
import { stepsHooks } from './steps-hooks';
const {
diff --git a/packages/web/src/features/pieces/lib/steps-hooks.ts b/packages/web/src/features/pieces/hooks/steps-hooks.ts
similarity index 97%
rename from packages/web/src/features/pieces/lib/steps-hooks.ts
rename to packages/web/src/features/pieces/hooks/steps-hooks.ts
index f43e7d331c0..507c184c6f8 100644
--- a/packages/web/src/features/pieces/lib/steps-hooks.ts
+++ b/packages/web/src/features/pieces/hooks/steps-hooks.ts
@@ -11,17 +11,16 @@ import { useTranslation } from 'react-i18next';
import { authenticationSession } from '@/lib/authentication-session';
+import { piecesApi } from '../api/pieces-api';
import {
StepMetadataWithActionOrTriggerOrAgentDisplayName,
StepMetadataWithSuggestions,
-} from '../../../lib/types';
-
-import { piecesApi } from './pieces-api';
+} from '../types';
import {
CORE_ACTIONS_METADATA,
CORE_STEP_METADATA,
stepUtils,
-} from './step-utils';
+} from '../utils/step-utils';
export const stepsHooks = {
useStepMetadata: ({ step }: UseStepMetadata) => {
diff --git a/packages/web/src/features/pieces/index.ts b/packages/web/src/features/pieces/index.ts
new file mode 100644
index 00000000000..102bcc4e37c
--- /dev/null
+++ b/packages/web/src/features/pieces/index.ts
@@ -0,0 +1,42 @@
+export { piecesApi } from './api/pieces-api';
+export { InstallPieceDialog } from './components/install-piece-dialog';
+export { PieceDisplayName } from './components/piece-display-name';
+export { PieceIcon } from './components/piece-icon';
+export { PieceIconWithPieceName } from './components/piece-icon-from-name';
+export { PieceIconList } from './components/piece-icon-list';
+export { PiecesSearchInput } from './components/piece-selector-search';
+export { PieceSelectorTabs } from './components/piece-selector-tabs';
+export { piecesHooks } from './hooks/pieces-hooks';
+export { stepsHooks } from './hooks/steps-hooks';
+export {
+ usePieceSearchContext,
+ PieceSearchProvider,
+} from './stores/piece-search-context';
+export {
+ PieceSelectorTabsProvider,
+ PieceSelectorTabType,
+ usePieceSelectorTabs,
+} from './stores/piece-selector-tabs-provider';
+export type {
+ PieceSelectorItem,
+ PieceSelectorOperation,
+ PieceStepMetadataWithSuggestions,
+ StepMetadata,
+ StepMetadataWithSuggestions,
+ PieceSelectorPieceItem,
+ HandleSelectActionOrTrigger,
+ PieceStepMetadata,
+ PrimitiveStepMetadata,
+ StepMetadataWithActionOrTriggerOrAgentDisplayName,
+ CategorizedStepMetadataWithSuggestions,
+} from './types';
+export { formUtils } from './utils/form-utils';
+export {
+ PIECE_SELECTOR_ELEMENTS_HEIGHTS,
+ pieceSelectorUtils,
+} from './utils/piece-selector-utils';
+export {
+ CORE_ACTIONS_METADATA,
+ extractPieceNamesAndCoreMetadata,
+ stepUtils,
+} from './utils/step-utils';
diff --git a/packages/web/src/features/pieces/lib/piece-search-context.tsx b/packages/web/src/features/pieces/stores/piece-search-context.tsx
similarity index 100%
rename from packages/web/src/features/pieces/lib/piece-search-context.tsx
rename to packages/web/src/features/pieces/stores/piece-search-context.tsx
diff --git a/packages/web/src/features/pieces/lib/piece-selector-tabs-provider.tsx b/packages/web/src/features/pieces/stores/piece-selector-tabs-provider.tsx
similarity index 96%
rename from packages/web/src/features/pieces/lib/piece-selector-tabs-provider.tsx
rename to packages/web/src/features/pieces/stores/piece-selector-tabs-provider.tsx
index 00868327102..b9f48f38c71 100644
--- a/packages/web/src/features/pieces/lib/piece-selector-tabs-provider.tsx
+++ b/packages/web/src/features/pieces/stores/piece-selector-tabs-provider.tsx
@@ -1,6 +1,6 @@
import { createContext, useContext, useState } from 'react';
-import { StepMetadataWithSuggestions } from '@/lib/types';
+import { StepMetadataWithSuggestions } from '@/features/pieces/types';
export enum PieceSelectorTabType {
EXPLORE = 'EXPLORE',
diff --git a/packages/web/src/lib/types.ts b/packages/web/src/features/pieces/types/index.ts
similarity index 92%
rename from packages/web/src/lib/types.ts
rename to packages/web/src/features/pieces/types/index.ts
index eaea0be1656..8ee2de3e98c 100644
--- a/packages/web/src/lib/types.ts
+++ b/packages/web/src/features/pieces/types/index.ts
@@ -100,15 +100,3 @@ export type PieceSelectorPieceItem =
export type PieceSelectorItem = PieceSelectorPieceItem | PrimitiveStepMetadata;
export type HandleSelectActionOrTrigger = (item: PieceSelectorItem) => void;
-
-export enum RightSideBarType {
- NONE = 'none',
- PIECE_SETTINGS = 'piece-settings',
- VERSIONS = 'versions',
- RUNS = 'runs',
-}
-
-export enum ChatDrawerSource {
- TEST_FLOW = 'test-flow',
- TEST_STEP = 'test-step',
-}
diff --git a/packages/web/src/features/pieces/lib/form-utils.tsx b/packages/web/src/features/pieces/utils/form-utils.tsx
similarity index 100%
rename from packages/web/src/features/pieces/lib/form-utils.tsx
rename to packages/web/src/features/pieces/utils/form-utils.tsx
diff --git a/packages/web/src/features/pieces/lib/piece-search-utils.ts b/packages/web/src/features/pieces/utils/piece-search-utils.ts
similarity index 99%
rename from packages/web/src/features/pieces/lib/piece-search-utils.ts
rename to packages/web/src/features/pieces/utils/piece-search-utils.ts
index 3751c653099..4a750211ce4 100644
--- a/packages/web/src/features/pieces/lib/piece-search-utils.ts
+++ b/packages/web/src/features/pieces/utils/piece-search-utils.ts
@@ -11,7 +11,7 @@ import {
PieceStepMetadataWithSuggestions,
StepMetadata,
StepMetadataWithSuggestions,
-} from '@/lib/types';
+} from '@/features/pieces/types';
const isFlowController = (stepMetadata: StepMetadata) => {
if (
diff --git a/packages/web/src/features/pieces/lib/piece-selector-utils.ts b/packages/web/src/features/pieces/utils/piece-selector-utils.ts
similarity index 99%
rename from packages/web/src/features/pieces/lib/piece-selector-utils.ts
rename to packages/web/src/features/pieces/utils/piece-selector-utils.ts
index bb0f206e019..7415858491d 100644
--- a/packages/web/src/features/pieces/lib/piece-selector-utils.ts
+++ b/packages/web/src/features/pieces/utils/piece-selector-utils.ts
@@ -29,7 +29,7 @@ import {
PieceSelectorOperation,
PieceSelectorPieceItem,
PieceStepMetadataWithSuggestions,
-} from '@/lib/types';
+} from '@/features/pieces/types';
import { formUtils } from './form-utils';
const defaultCode = `export const code = async (inputs) => {
diff --git a/packages/web/src/features/pieces/lib/step-utils.tsx b/packages/web/src/features/pieces/utils/step-utils.tsx
similarity index 98%
rename from packages/web/src/features/pieces/lib/step-utils.tsx
rename to packages/web/src/features/pieces/utils/step-utils.tsx
index 1da95341ca0..09167cd928d 100644
--- a/packages/web/src/features/pieces/lib/step-utils.tsx
+++ b/packages/web/src/features/pieces/utils/step-utils.tsx
@@ -17,14 +17,13 @@ import {
} from '@activepieces/shared';
import { t } from 'i18next';
+import { piecesApi } from '../api/pieces-api';
import {
PieceStepMetadata,
PrimitiveStepMetadata,
StepMetadata,
StepMetadataWithActionOrTriggerOrAgentDisplayName,
-} from '../../../lib/types';
-
-import { piecesApi } from './pieces-api';
+} from '../types';
export const CORE_STEP_METADATA: Record<
Exclude | FlowTriggerType.EMPTY,
diff --git a/packages/web/src/features/platform-admin/lib/ai-provider-api.ts b/packages/web/src/features/platform-admin/api/ai-provider-api.ts
similarity index 100%
rename from packages/web/src/features/platform-admin/lib/ai-provider-api.ts
rename to packages/web/src/features/platform-admin/api/ai-provider-api.ts
diff --git a/packages/web/src/features/platform-admin/lib/analytics-api.ts b/packages/web/src/features/platform-admin/api/analytics-api.ts
similarity index 100%
rename from packages/web/src/features/platform-admin/lib/analytics-api.ts
rename to packages/web/src/features/platform-admin/api/analytics-api.ts
diff --git a/packages/web/src/features/platform-admin/lib/api-key-api.ts b/packages/web/src/features/platform-admin/api/api-key-api.ts
similarity index 100%
rename from packages/web/src/features/platform-admin/lib/api-key-api.ts
rename to packages/web/src/features/platform-admin/api/api-key-api.ts
diff --git a/packages/web/src/features/platform-admin/lib/audit-events-api.ts b/packages/web/src/features/platform-admin/api/audit-events-api.ts
similarity index 100%
rename from packages/web/src/features/platform-admin/lib/audit-events-api.ts
rename to packages/web/src/features/platform-admin/api/audit-events-api.ts
diff --git a/packages/web/src/features/platform-admin/lib/pieces-tags.ts b/packages/web/src/features/platform-admin/api/pieces-tags.ts
similarity index 100%
rename from packages/web/src/features/platform-admin/lib/pieces-tags.ts
rename to packages/web/src/features/platform-admin/api/pieces-tags.ts
diff --git a/packages/web/src/features/platform-admin/lib/project-role-api.ts b/packages/web/src/features/platform-admin/api/project-role-api.ts
similarity index 100%
rename from packages/web/src/features/platform-admin/lib/project-role-api.ts
rename to packages/web/src/features/platform-admin/api/project-role-api.ts
diff --git a/packages/web/src/features/platform-admin/lib/signing-key-api.ts b/packages/web/src/features/platform-admin/api/signing-key-api.ts
similarity index 100%
rename from packages/web/src/features/platform-admin/lib/signing-key-api.ts
rename to packages/web/src/features/platform-admin/api/signing-key-api.ts
diff --git a/packages/web/src/features/platform-admin/lib/workers-api.ts b/packages/web/src/features/platform-admin/api/workers-api.ts
similarity index 100%
rename from packages/web/src/features/platform-admin/lib/workers-api.ts
rename to packages/web/src/features/platform-admin/api/workers-api.ts
diff --git a/packages/web/src/features/platform-admin/components/new-signing-key-dialog.tsx b/packages/web/src/features/platform-admin/components/new-signing-key-dialog.tsx
index 35a13c50dc9..822e67d5e2d 100644
--- a/packages/web/src/features/platform-admin/components/new-signing-key-dialog.tsx
+++ b/packages/web/src/features/platform-admin/components/new-signing-key-dialog.tsx
@@ -21,7 +21,7 @@ import {
import { Form, FormField, FormItem, FormMessage } from '@/components/ui/form';
import { Input } from '@/components/ui/input';
import { Label } from '@/components/ui/label';
-import { signingKeyApi } from '@/features/platform-admin/lib/signing-key-api';
+import { signingKeyApi } from '@/features/platform-admin/api/signing-key-api';
type NewSigningKeyDialogProps = {
children: React.ReactNode;
diff --git a/packages/web/src/features/platform-admin/lib/analytics-hooks.ts b/packages/web/src/features/platform-admin/hooks/analytics-hooks.ts
similarity index 95%
rename from packages/web/src/features/platform-admin/lib/analytics-hooks.ts
rename to packages/web/src/features/platform-admin/hooks/analytics-hooks.ts
index 2835c23aed7..811a1895bf9 100644
--- a/packages/web/src/features/platform-admin/lib/analytics-hooks.ts
+++ b/packages/web/src/features/platform-admin/hooks/analytics-hooks.ts
@@ -7,9 +7,9 @@ import {
import { useMutation, useQuery, useQueryClient } from '@tanstack/react-query';
import { useCallback, useContext } from 'react';
-import { analyticsApi } from '@/features/platform-admin/lib/analytics-api';
+import { analyticsApi } from '@/features/platform-admin/api/analytics-api';
-import { RefreshAnalyticsContext } from './refresh-analytics-context';
+import { RefreshAnalyticsContext } from '../stores/refresh-analytics-context';
const analyticsQueryKey = ['analytics'];
const projectLeaderboardQueryKey = (timePeriod: AnalyticsTimePeriod) => [
diff --git a/packages/web/src/features/platform-admin/index.ts b/packages/web/src/features/platform-admin/index.ts
new file mode 100644
index 00000000000..0749ea4e703
--- /dev/null
+++ b/packages/web/src/features/platform-admin/index.ts
@@ -0,0 +1,14 @@
+export { aiProviderApi } from './api/ai-provider-api';
+export { analyticsApi } from './api/analytics-api';
+export { apiKeyApi } from './api/api-key-api';
+export { auditEventsApi } from './api/audit-events-api';
+export { piecesTagsApi } from './api/pieces-tags';
+export { projectRoleApi } from './api/project-role-api';
+export { signingKeyApi } from './api/signing-key-api';
+export { workersApi } from './api/workers-api';
+export { NewSigningKeyDialog } from './components/new-signing-key-dialog';
+export { platformAnalyticsHooks } from './hooks/analytics-hooks';
+export {
+ RefreshAnalyticsContext,
+ RefreshAnalyticsProvider,
+} from './stores/refresh-analytics-context';
diff --git a/packages/web/src/features/platform-admin/lib/refresh-analytics-context.tsx b/packages/web/src/features/platform-admin/stores/refresh-analytics-context.tsx
similarity index 100%
rename from packages/web/src/features/platform-admin/lib/refresh-analytics-context.tsx
rename to packages/web/src/features/platform-admin/stores/refresh-analytics-context.tsx
diff --git a/packages/web/src/features/project-releases/lib/git-sync-api.ts b/packages/web/src/features/project-releases/api/git-sync-api.ts
similarity index 100%
rename from packages/web/src/features/project-releases/lib/git-sync-api.ts
rename to packages/web/src/features/project-releases/api/git-sync-api.ts
diff --git a/packages/web/src/features/project-releases/lib/project-release-api.ts b/packages/web/src/features/project-releases/api/project-release-api.ts
similarity index 100%
rename from packages/web/src/features/project-releases/lib/project-release-api.ts
rename to packages/web/src/features/project-releases/api/project-release-api.ts
diff --git a/packages/web/src/features/project-releases/components/connect-git-dialog.tsx b/packages/web/src/features/project-releases/components/connect-git-dialog.tsx
index 9ddac9f724f..ffc48efb449 100644
--- a/packages/web/src/features/project-releases/components/connect-git-dialog.tsx
+++ b/packages/web/src/features/project-releases/components/connect-git-dialog.tsx
@@ -37,8 +37,8 @@ import { platformHooks } from '@/hooks/platform-hooks';
import { api } from '@/lib/api';
import { authenticationSession } from '@/lib/authentication-session';
-import { gitSyncApi } from '../lib/git-sync-api';
-import { gitSyncHooks } from '../lib/git-sync-hooks';
+import { gitSyncApi } from '../api/git-sync-api';
+import { gitSyncHooks } from '../hooks/git-sync-hooks';
type ConnectGitProps = {
open?: boolean;
diff --git a/packages/web/src/features/project-releases/components/push-to-git-dialog.tsx b/packages/web/src/features/project-releases/components/push-to-git-dialog.tsx
index 11dc5765ce8..1d9661e0bce 100644
--- a/packages/web/src/features/project-releases/components/push-to-git-dialog.tsx
+++ b/packages/web/src/features/project-releases/components/push-to-git-dialog.tsx
@@ -34,8 +34,8 @@ import { Textarea } from '@/components/ui/textarea';
import { platformHooks } from '@/hooks/platform-hooks';
import { authenticationSession } from '@/lib/authentication-session';
-import { gitSyncApi } from '../lib/git-sync-api';
-import { gitSyncHooks } from '../lib/git-sync-hooks';
+import { gitSyncApi } from '../api/git-sync-api';
+import { gitSyncHooks } from '../hooks/git-sync-hooks';
type PushToGitDialogProps =
| {
diff --git a/packages/web/src/features/project-releases/lib/git-sync-hooks.ts b/packages/web/src/features/project-releases/hooks/git-sync-hooks.ts
similarity index 95%
rename from packages/web/src/features/project-releases/lib/git-sync-hooks.ts
rename to packages/web/src/features/project-releases/hooks/git-sync-hooks.ts
index 22d59b94d0a..469a3eb8460 100644
--- a/packages/web/src/features/project-releases/lib/git-sync-hooks.ts
+++ b/packages/web/src/features/project-releases/hooks/git-sync-hooks.ts
@@ -5,7 +5,7 @@ import { useAuthorization } from '@/hooks/authorization-hooks';
import { platformHooks } from '@/hooks/platform-hooks';
import { authenticationSession } from '@/lib/authentication-session';
-import { gitSyncApi } from './git-sync-api';
+import { gitSyncApi } from '../api/git-sync-api';
export const gitSyncHooks = {
useGitSync: (projectId: string, enabled: boolean) => {
diff --git a/packages/web/src/features/project-releases/index.ts b/packages/web/src/features/project-releases/index.ts
new file mode 100644
index 00000000000..a89bab8e469
--- /dev/null
+++ b/packages/web/src/features/project-releases/index.ts
@@ -0,0 +1,6 @@
+export { gitSyncApi } from './api/git-sync-api';
+export { projectReleaseApi } from './api/project-release-api';
+export { ConnectGitDialog } from './components/connect-git-dialog';
+export { PublishedNeededTooltip } from './components/published-tooltip';
+export { PushToGitDialog } from './components/push-to-git-dialog';
+export { gitSyncHooks } from './hooks/git-sync-hooks';
diff --git a/packages/web/src/features/projects/components/edit-project-dialog.tsx b/packages/web/src/features/projects/components/edit-project-dialog.tsx
index a9c4738eac0..3fa00a8604d 100644
--- a/packages/web/src/features/projects/components/edit-project-dialog.tsx
+++ b/packages/web/src/features/projects/components/edit-project-dialog.tsx
@@ -30,10 +30,10 @@ import { Input } from '@/components/ui/input';
import { Label } from '@/components/ui/label';
import { SkeletonList } from '@/components/ui/skeleton';
import { internalErrorToast } from '@/components/ui/sonner';
-import { globalConnectionsQueries } from '@/features/connections/lib/global-connections-hooks';
+import { globalConnectionsQueries } from '@/features/connections/hooks/global-connections-hooks';
+import { projectCollectionUtils } from '@/features/projects/stores/project-collection';
import { useAuthorization } from '@/hooks/authorization-hooks';
import { platformHooks } from '@/hooks/platform-hooks';
-import { projectCollectionUtils } from '@/hooks/project-collection';
import { userHooks } from '@/hooks/user-hooks';
interface EditProjectDialogProps {
diff --git a/packages/web/src/features/projects/components/platform-switcher.tsx b/packages/web/src/features/projects/components/platform-switcher.tsx
index be14ff2c0b6..a72aece7612 100644
--- a/packages/web/src/features/projects/components/platform-switcher.tsx
+++ b/packages/web/src/features/projects/components/platform-switcher.tsx
@@ -8,7 +8,7 @@ import {
DropdownMenuItem,
DropdownMenuTrigger,
} from '@/components/ui/dropdown-menu';
-import { projectHooks } from '@/hooks/project-collection';
+import { projectHooks } from '@/features/projects/stores/project-collection';
import { authenticationSession } from '@/lib/authentication-session';
import { cn } from '@/lib/utils';
diff --git a/packages/web/src/features/projects/index.ts b/packages/web/src/features/projects/index.ts
new file mode 100644
index 00000000000..981a5b56f2b
--- /dev/null
+++ b/packages/web/src/features/projects/index.ts
@@ -0,0 +1,7 @@
+export { EditProjectDialog } from './components/edit-project-dialog';
+export { PlatformSwitcher } from './components/platform-switcher';
+export {
+ getProjectName,
+ projectCollectionUtils,
+ projectHooks,
+} from './stores/project-collection';
diff --git a/packages/web/src/hooks/project-collection.ts b/packages/web/src/features/projects/stores/project-collection.ts
similarity index 99%
rename from packages/web/src/hooks/project-collection.ts
rename to packages/web/src/features/projects/stores/project-collection.ts
index d3ebdd1f121..143284790e8 100644
--- a/packages/web/src/hooks/project-collection.ts
+++ b/packages/web/src/features/projects/stores/project-collection.ts
@@ -20,7 +20,7 @@ import { QueryClient, useMutation, useQuery } from '@tanstack/react-query';
import { useEffect } from 'react';
import { useLocation } from 'react-router-dom';
-import { useEmbedding } from '@/components/embed-provider';
+import { useEmbedding } from '@/components/providers/embed-provider';
import { api } from '@/lib/api';
import { authenticationSession } from '@/lib/authentication-session';
diff --git a/packages/web/src/features/secret-managers/lib/secret-managers-api.ts b/packages/web/src/features/secret-managers/api/secret-managers-api.ts
similarity index 100%
rename from packages/web/src/features/secret-managers/lib/secret-managers-api.ts
rename to packages/web/src/features/secret-managers/api/secret-managers-api.ts
diff --git a/packages/web/src/features/secret-managers/lib/secret-managers-hooks.ts b/packages/web/src/features/secret-managers/hooks/secret-managers-hooks.ts
similarity index 97%
rename from packages/web/src/features/secret-managers/lib/secret-managers-hooks.ts
rename to packages/web/src/features/secret-managers/hooks/secret-managers-hooks.ts
index f57eed6e939..37e32c255f7 100644
--- a/packages/web/src/features/secret-managers/lib/secret-managers-hooks.ts
+++ b/packages/web/src/features/secret-managers/hooks/secret-managers-hooks.ts
@@ -9,7 +9,7 @@ import { toast } from 'sonner';
import { platformHooks } from '@/hooks/platform-hooks';
-import { secretManagersApi } from './secret-managers-api';
+import { secretManagersApi } from '../api/secret-managers-api';
export const secretManagersHooks = {
useListSecretManagers: ({
diff --git a/packages/web/src/features/secret-managers/index.ts b/packages/web/src/features/secret-managers/index.ts
new file mode 100644
index 00000000000..03b6e567c77
--- /dev/null
+++ b/packages/web/src/features/secret-managers/index.ts
@@ -0,0 +1 @@
+export { secretManagersHooks } from './hooks/secret-managers-hooks';
diff --git a/packages/web/src/features/tables/lib/fields-api.ts b/packages/web/src/features/tables/api/fields-api.ts
similarity index 100%
rename from packages/web/src/features/tables/lib/fields-api.ts
rename to packages/web/src/features/tables/api/fields-api.ts
diff --git a/packages/web/src/features/tables/lib/records-api.ts b/packages/web/src/features/tables/api/records-api.ts
similarity index 97%
rename from packages/web/src/features/tables/lib/records-api.ts
rename to packages/web/src/features/tables/api/records-api.ts
index a0ac5a4d5c3..6f6e47a7c01 100644
--- a/packages/web/src/features/tables/lib/records-api.ts
+++ b/packages/web/src/features/tables/api/records-api.ts
@@ -9,7 +9,7 @@ import {
import { api } from '@/lib/api';
-import { FieldsMapping } from './utils';
+import { FieldsMapping } from '../utils/utils';
export const recordsApi = {
list(request: ListRecordsRequest): Promise> {
diff --git a/packages/web/src/features/tables/lib/tables-api.ts b/packages/web/src/features/tables/api/tables-api.ts
similarity index 100%
rename from packages/web/src/features/tables/lib/tables-api.ts
rename to packages/web/src/features/tables/api/tables-api.ts
diff --git a/packages/web/src/features/tables/components/ap-field-header.tsx b/packages/web/src/features/tables/components/ap-field-header.tsx
index c34ef949977..31f7504f871 100644
--- a/packages/web/src/features/tables/components/ap-field-header.tsx
+++ b/packages/web/src/features/tables/components/ap-field-header.tsx
@@ -15,8 +15,8 @@ import {
import { useAuthorization } from '@/hooks/authorization-hooks';
import { cn } from '@/lib/utils';
-import { ClientField } from '../lib/store/ap-tables-client-state';
-import { FieldHeaderContext, tablesUtils } from '../lib/utils';
+import { ClientField } from '../stores/store/ap-tables-client-state';
+import { FieldHeaderContext, tablesUtils } from '../utils/utils';
import ApFieldActionMenuItemRenderer, {
FieldActionType,
diff --git a/packages/web/src/features/tables/components/ap-table-actions-menu.tsx b/packages/web/src/features/tables/components/ap-table-actions-menu.tsx
index 93dc46eef07..5504ffd8a70 100644
--- a/packages/web/src/features/tables/components/ap-table-actions-menu.tsx
+++ b/packages/web/src/features/tables/components/ap-table-actions-menu.tsx
@@ -10,8 +10,8 @@ import {
} from 'lucide-react';
import React, { useState } from 'react';
+import { ConfirmationDeleteDialog } from '@/components/custom/delete-dialog';
import { PermissionNeededTooltip } from '@/components/custom/permission-needed-tooltip';
-import { ConfirmationDeleteDialog } from '@/components/delete-dialog';
import {
DropdownMenu,
DropdownMenuContent,
@@ -20,11 +20,11 @@ import {
DropdownMenuTrigger,
} from '@/components/ui/dropdown-menu';
import { PushToGitDialog } from '@/features/project-releases/components/push-to-git-dialog';
-import { gitSyncHooks } from '@/features/project-releases/lib/git-sync-hooks';
+import { gitSyncHooks } from '@/features/project-releases/hooks/git-sync-hooks';
import { useAuthorization } from '@/hooks/authorization-hooks';
-import { tablesApi } from '../lib/tables-api';
-import { tablesUtils } from '../lib/utils';
+import { tablesApi } from '../api/tables-api';
+import { tablesUtils } from '../utils/utils';
import { ImportTableDialog } from './import-table-dialog';
import RenameTableDialog from './rename-table-dialog';
@@ -51,7 +51,7 @@ const ApTableActionsMenu = ({
const exportTemplate = async () => {
const tableTemplate = await tablesApi.getTemplate(table.id);
- const { downloadFile } = await import('@/lib/utils');
+ const { downloadFile } = await import('@/lib/dom-utils');
downloadFile({
obj: JSON.stringify(tableTemplate, null, 2),
fileName: tableTemplate.name,
diff --git a/packages/web/src/features/tables/components/ap-table-header.tsx b/packages/web/src/features/tables/components/ap-table-header.tsx
index 8ec9dd7f6bd..dd930c7cac0 100644
--- a/packages/web/src/features/tables/components/ap-table-header.tsx
+++ b/packages/web/src/features/tables/components/ap-table-header.tsx
@@ -12,9 +12,10 @@ import {
} from 'lucide-react';
import { useState } from 'react';
+import { ConfirmationDeleteDialog } from '@/components/custom/delete-dialog';
+import EditableText from '@/components/custom/editable-text';
import { PageHeader } from '@/components/custom/page-header';
import { PermissionNeededTooltip } from '@/components/custom/permission-needed-tooltip';
-import { ConfirmationDeleteDialog } from '@/components/delete-dialog';
import {
Breadcrumb,
BreadcrumbItem,
@@ -31,18 +32,17 @@ import {
DropdownMenuSeparator,
DropdownMenuTrigger,
} from '@/components/ui/dropdown-menu';
-import EditableText from '@/components/ui/editable-text';
import { PushToGitDialog } from '@/features/project-releases/components/push-to-git-dialog';
-import { gitSyncHooks } from '@/features/project-releases/lib/git-sync-hooks';
-import { useAuthorization } from '@/hooks/authorization-hooks';
+import { gitSyncHooks } from '@/features/project-releases/hooks/git-sync-hooks';
import {
getProjectName,
projectCollectionUtils,
-} from '@/hooks/project-collection';
-import { downloadFile } from '@/lib/utils';
+} from '@/features/projects/stores/project-collection';
+import { useAuthorization } from '@/hooks/authorization-hooks';
+import { downloadFile } from '@/lib/dom-utils';
-import { tablesApi } from '../lib/tables-api';
-import { tablesUtils } from '../lib/utils';
+import { tablesApi } from '../api/tables-api';
+import { tablesUtils } from '../utils/utils';
import { useTableState } from './ap-table-state-provider';
import { ImportTableDialog } from './import-table-dialog';
diff --git a/packages/web/src/features/tables/components/ap-table-state-provider.tsx b/packages/web/src/features/tables/components/ap-table-state-provider.tsx
index c55ca7c6545..a477d9c920d 100644
--- a/packages/web/src/features/tables/components/ap-table-state-provider.tsx
+++ b/packages/web/src/features/tables/components/ap-table-state-provider.tsx
@@ -6,18 +6,18 @@ import { createContext, useContext, useRef } from 'react';
import { Link, useParams } from 'react-router-dom';
import { useStore } from 'zustand';
+import { LoadingScreen } from '@/components/custom/loading-screen';
import { buttonVariants } from '@/components/ui/button';
-import { LoadingScreen } from '@/components/ui/loading-screen';
import {
TableState,
ApTableStore,
createApTableStore,
-} from '@/features/tables/lib/store/ap-tables-client-state';
+} from '@/features/tables/stores/store/ap-tables-client-state';
import { cn } from '@/lib/utils';
-import { fieldsApi } from '../lib/fields-api';
-import { recordsApi } from '../lib/records-api';
-import { tablesApi } from '../lib/tables-api';
+import { fieldsApi } from '../api/fields-api';
+import { recordsApi } from '../api/records-api';
+import { tablesApi } from '../api/tables-api';
const TableContext = createContext(null);
diff --git a/packages/web/src/features/tables/components/date-editor.tsx b/packages/web/src/features/tables/components/date-editor.tsx
index dc07c0a21ec..ba73d74624a 100644
--- a/packages/web/src/features/tables/components/date-editor.tsx
+++ b/packages/web/src/features/tables/components/date-editor.tsx
@@ -7,7 +7,8 @@ import {
PopoverContent,
PopoverTrigger,
} from '@/components/ui/popover';
-import { cn, formatUtils } from '@/lib/utils';
+import { formatUtils } from '@/lib/format-utils';
+import { cn } from '@/lib/utils';
import { useCellContext } from './cell-context';
diff --git a/packages/web/src/features/tables/components/editable-cell.tsx b/packages/web/src/features/tables/components/editable-cell.tsx
index f8fa3cce7b7..efacd8e3eeb 100644
--- a/packages/web/src/features/tables/components/editable-cell.tsx
+++ b/packages/web/src/features/tables/components/editable-cell.tsx
@@ -5,8 +5,8 @@ import { ErrorBoundary } from 'react-error-boundary';
import { cn } from '@/lib/utils';
-import { ClientField } from '../lib/store/ap-tables-client-state';
-import { Row } from '../lib/types';
+import { ClientField } from '../stores/store/ap-tables-client-state';
+import { Row } from '../types/types';
import { useTableState } from './ap-table-state-provider';
import { CellProvider } from './cell-context';
diff --git a/packages/web/src/features/tables/components/field-action-menu-item-renderer.tsx b/packages/web/src/features/tables/components/field-action-menu-item-renderer.tsx
index ac6c2e0e8af..225d8fc2721 100644
--- a/packages/web/src/features/tables/components/field-action-menu-item-renderer.tsx
+++ b/packages/web/src/features/tables/components/field-action-menu-item-renderer.tsx
@@ -2,10 +2,10 @@ import { t } from 'i18next';
import { Pencil, Trash } from 'lucide-react';
import { useContext } from 'react';
-import { ConfirmationDeleteDialog } from '@/components/delete-dialog';
+import { ConfirmationDeleteDialog } from '@/components/custom/delete-dialog';
import { DropdownMenuItem } from '@/components/ui/dropdown-menu';
-import { FieldHeaderContext } from '../lib/utils';
+import { FieldHeaderContext } from '../utils/utils';
import { useTableState } from './ap-table-state-provider';
import RenameFieldPopoverContent from './rename-field-popovercontent';
diff --git a/packages/web/src/features/tables/components/fields-mapping.tsx b/packages/web/src/features/tables/components/fields-mapping.tsx
index c2ad22f90c3..404a356acf6 100644
--- a/packages/web/src/features/tables/components/fields-mapping.tsx
+++ b/packages/web/src/features/tables/components/fields-mapping.tsx
@@ -6,7 +6,7 @@ import { useEffect, useState } from 'react';
import { SearchableSelect } from '@/components/custom/searchable-select';
import { Input } from '@/components/ui/input';
-import { FieldsMapping } from '../lib/utils';
+import { FieldsMapping } from '../utils/utils';
const FieldsMappingControl = ({
onChange,
diff --git a/packages/web/src/features/tables/components/import-table-dialog.tsx b/packages/web/src/features/tables/components/import-table-dialog.tsx
index fc0027d3e44..e2be3262a86 100644
--- a/packages/web/src/features/tables/components/import-table-dialog.tsx
+++ b/packages/web/src/features/tables/components/import-table-dialog.tsx
@@ -33,9 +33,9 @@ import { flagsHooks } from '@/hooks/flags-hooks';
import { api } from '@/lib/api';
import { authenticationSession } from '@/lib/authentication-session';
-import { recordsApi } from '../lib/records-api';
-import { tableHooks } from '../lib/table-hooks';
-import { FieldsMapping, fileUtils, SupportedFileType } from '../lib/utils';
+import { recordsApi } from '../api/records-api';
+import { tableHooks } from '../hooks/table-hooks';
+import { FieldsMapping, fileUtils, SupportedFileType } from '../utils/utils';
import { useOptionalTableStore } from './ap-table-state-provider';
import { FieldsMappingControl } from './fields-mapping';
diff --git a/packages/web/src/features/tables/components/new-field-popup.tsx b/packages/web/src/features/tables/components/new-field-popup.tsx
index 1b9f483f72e..dc1bdd10ab3 100644
--- a/packages/web/src/features/tables/components/new-field-popup.tsx
+++ b/packages/web/src/features/tables/components/new-field-popup.tsx
@@ -17,7 +17,7 @@ import {
import { RadioGroup, RadioGroupItem } from '@/components/ui/radio-group';
import { ScrollArea } from '@/components/ui/scroll-area';
import { useTableState } from '@/features/tables/components/ap-table-state-provider';
-import { tablesUtils } from '@/features/tables/lib/utils';
+import { tablesUtils } from '@/features/tables/utils/utils';
import { cn } from '@/lib/utils';
type NewFieldDialogProps = {
diff --git a/packages/web/src/features/tables/components/rename-field-popovercontent.tsx b/packages/web/src/features/tables/components/rename-field-popovercontent.tsx
index a49434eae0c..2bdba02f7f4 100644
--- a/packages/web/src/features/tables/components/rename-field-popovercontent.tsx
+++ b/packages/web/src/features/tables/components/rename-field-popovercontent.tsx
@@ -12,7 +12,7 @@ import {
} from '@/components/ui/form';
import { Input } from '@/components/ui/input';
-import { FieldHeaderContext } from '../lib/utils';
+import { FieldHeaderContext } from '../utils/utils';
import { useTableState } from './ap-table-state-provider';
diff --git a/packages/web/src/features/tables/components/rename-table-dialog.tsx b/packages/web/src/features/tables/components/rename-table-dialog.tsx
index 9409dc09164..57ff3953763 100644
--- a/packages/web/src/features/tables/components/rename-table-dialog.tsx
+++ b/packages/web/src/features/tables/components/rename-table-dialog.tsx
@@ -24,7 +24,7 @@ import {
} from '@/components/ui/form';
import { Input } from '@/components/ui/input';
-import { tablesApi } from '../lib/tables-api';
+import { tablesApi } from '../api/tables-api';
type RenameTableDialogProps = {
tableName: string;
diff --git a/packages/web/src/features/tables/components/select-column.tsx b/packages/web/src/features/tables/components/select-column.tsx
index 4734665ec49..b9145db479d 100644
--- a/packages/web/src/features/tables/components/select-column.tsx
+++ b/packages/web/src/features/tables/components/select-column.tsx
@@ -3,7 +3,7 @@ import { useHeaderRowSelection, useRowSelection } from 'react-data-grid';
import { Checkbox } from '@/components/ui/checkbox';
import { cn } from '@/lib/utils';
-import { Row } from '../lib/types';
+import { Row } from '../types/types';
export function SelectHeaderCell() {
const { isRowSelected, onRowSelectionChange } = useHeaderRowSelection();
diff --git a/packages/web/src/features/tables/components/table-columns.tsx b/packages/web/src/features/tables/components/table-columns.tsx
index 63afda70b5a..94228ae483c 100644
--- a/packages/web/src/features/tables/components/table-columns.tsx
+++ b/packages/web/src/features/tables/components/table-columns.tsx
@@ -6,8 +6,8 @@ import { Column, RenderCellProps } from 'react-data-grid';
import { useAuthorization } from '@/hooks/authorization-hooks';
import { flagsHooks } from '@/hooks/flags-hooks';
-import { ClientRecordData } from '../lib/store/ap-tables-client-state';
-import { Row } from '../lib/types';
+import { ClientRecordData } from '../stores/store/ap-tables-client-state';
+import { Row } from '../types/types';
import { ApFieldHeader } from './ap-field-header';
import { useTableState } from './ap-table-state-provider';
diff --git a/packages/web/src/features/tables/lib/table-hooks.ts b/packages/web/src/features/tables/hooks/table-hooks.ts
similarity index 96%
rename from packages/web/src/features/tables/lib/table-hooks.ts
rename to packages/web/src/features/tables/hooks/table-hooks.ts
index 6eff5b96323..4c6aa1bb74e 100644
--- a/packages/web/src/features/tables/lib/table-hooks.ts
+++ b/packages/web/src/features/tables/hooks/table-hooks.ts
@@ -8,11 +8,11 @@ import { useMutation, useQuery, useQueryClient } from '@tanstack/react-query';
import { useNavigate, useSearchParams } from 'react-router-dom';
import { authenticationSession } from '@/lib/authentication-session';
-import { NEW_TABLE_QUERY_PARAM } from '@/lib/utils';
+import { NEW_TABLE_QUERY_PARAM } from '@/lib/route-utils';
-import { fieldsApi } from './fields-api';
-import { recordsApi } from './records-api';
-import { tablesApi } from './tables-api';
+import { fieldsApi } from '../api/fields-api';
+import { recordsApi } from '../api/records-api';
+import { tablesApi } from '../api/tables-api';
const queryKeys = (searchParams: URLSearchParams, projectId: string) => {
return ['tables', searchParams.toString(), projectId];
diff --git a/packages/web/src/features/tables/index.ts b/packages/web/src/features/tables/index.ts
new file mode 100644
index 00000000000..8fb05b1aebd
--- /dev/null
+++ b/packages/web/src/features/tables/index.ts
@@ -0,0 +1,19 @@
+export { tablesApi } from './api/tables-api';
+export { ApTableActionsMenu } from './components/ap-table-actions-menu';
+export { ApTableFooter } from './components/ap-table-footer';
+export { ApTableHeader } from './components/ap-table-header';
+export {
+ useTableState,
+ ApTableStateProvider,
+} from './components/ap-table-state-provider';
+export { ImportTableDialog } from './components/import-table-dialog';
+export { mapRecordsToRows, useTableColumns } from './components/table-columns';
+export { tableHooks } from './hooks/table-hooks';
+export { createApTableStore } from './stores/store/ap-tables-client-state';
+export type {
+ ApTableStore,
+ TableState,
+} from './stores/store/ap-tables-client-state';
+export { ROW_HEIGHT_MAP, RowHeight } from './types/types';
+export type { Row } from './types/types';
+export { tablesUtils } from './utils/utils';
diff --git a/packages/web/src/features/tables/lib/store/ap-tables-client-state.tsx b/packages/web/src/features/tables/stores/store/ap-tables-client-state.tsx
similarity index 100%
rename from packages/web/src/features/tables/lib/store/ap-tables-client-state.tsx
rename to packages/web/src/features/tables/stores/store/ap-tables-client-state.tsx
diff --git a/packages/web/src/features/tables/lib/store/ap-tables-server-state.ts b/packages/web/src/features/tables/stores/store/ap-tables-server-state.ts
similarity index 96%
rename from packages/web/src/features/tables/lib/store/ap-tables-server-state.ts
rename to packages/web/src/features/tables/stores/store/ap-tables-server-state.ts
index 0c8957d1b49..18783e79ce1 100644
--- a/packages/web/src/features/tables/lib/store/ap-tables-server-state.ts
+++ b/packages/web/src/features/tables/stores/store/ap-tables-server-state.ts
@@ -8,9 +8,9 @@ import {
import { PromiseQueue } from '@/lib/promise-queue';
-import { fieldsApi } from '../fields-api';
-import { recordsApi } from '../records-api';
-import { tablesApi } from '../tables-api';
+import { fieldsApi } from '../../api/fields-api';
+import { recordsApi } from '../../api/records-api';
+import { tablesApi } from '../../api/tables-api';
import { ClientRecordData } from './ap-tables-client-state';
diff --git a/packages/web/src/features/tables/lib/types.ts b/packages/web/src/features/tables/types/types.ts
similarity index 100%
rename from packages/web/src/features/tables/lib/types.ts
rename to packages/web/src/features/tables/types/types.ts
diff --git a/packages/web/src/features/tables/lib/utils.tsx b/packages/web/src/features/tables/utils/utils.tsx
similarity index 96%
rename from packages/web/src/features/tables/lib/utils.tsx
rename to packages/web/src/features/tables/utils/utils.tsx
index 507f9aa4ed8..2d086aa06dd 100644
--- a/packages/web/src/features/tables/lib/utils.tsx
+++ b/packages/web/src/features/tables/utils/utils.tsx
@@ -3,9 +3,12 @@ import JSZip from 'jszip';
import { Type, Calendar, Hash, ChevronDownCircle } from 'lucide-react';
import { createContext, ReactNode } from 'react';
-import { downloadFile } from '@/lib/utils';
+import { downloadFile } from '@/lib/dom-utils';
-import { ClientField, ClientRecordData } from './store/ap-tables-client-state';
+import {
+ ClientField,
+ ClientRecordData,
+} from '../stores/store/ap-tables-client-state';
function getColumnIcon(type: FieldType): ReactNode {
switch (type) {
diff --git a/packages/web/src/features/templates/lib/templates-api.ts b/packages/web/src/features/templates/api/templates-api.ts
similarity index 100%
rename from packages/web/src/features/templates/lib/templates-api.ts
rename to packages/web/src/features/templates/api/templates-api.ts
diff --git a/packages/web/src/features/templates/lib/templates-telemetry-api.ts b/packages/web/src/features/templates/api/templates-telemetry-api.ts
similarity index 100%
rename from packages/web/src/features/templates/lib/templates-telemetry-api.ts
rename to packages/web/src/features/templates/api/templates-telemetry-api.ts
diff --git a/packages/web/src/features/templates/components/share-template.tsx b/packages/web/src/features/templates/components/share-template.tsx
index 3ad70d543da..03df15c2535 100644
--- a/packages/web/src/features/templates/components/share-template.tsx
+++ b/packages/web/src/features/templates/components/share-template.tsx
@@ -14,7 +14,7 @@ import { Button } from '@/components/ui/button';
import { Card, CardContent, CardHeader } from '@/components/ui/card';
import { Separator } from '@/components/ui/separator';
import { internalErrorToast } from '@/components/ui/sonner';
-import { flowHooks } from '@/features/flows/lib/flow-hooks';
+import { flowHooks } from '@/features/flows/hooks/flow-hooks';
import { api } from '@/lib/api';
import { authenticationSession } from '@/lib/authentication-session';
import { FROM_QUERY_PARAM } from '@/lib/navigation-utils';
diff --git a/packages/web/src/features/templates/hooks/templates-hook.ts b/packages/web/src/features/templates/hooks/templates-hook.ts
index 8c8da07c64f..604c9da0bea 100644
--- a/packages/web/src/features/templates/hooks/templates-hook.ts
+++ b/packages/web/src/features/templates/hooks/templates-hook.ts
@@ -3,7 +3,7 @@ import { useQuery } from '@tanstack/react-query';
import { useSearchParams } from 'react-router-dom';
import { useDebounce } from 'use-debounce';
-import { templatesApi } from '../lib/templates-api';
+import { templatesApi } from '../api/templates-api';
export const templatesHooks = {
useTemplateCategories: () => {
diff --git a/packages/web/src/features/templates/hooks/use-gradient-from-pieces.ts b/packages/web/src/features/templates/hooks/use-gradient-from-pieces.ts
index 42275d0d48a..399b71352b2 100644
--- a/packages/web/src/features/templates/hooks/use-gradient-from-pieces.ts
+++ b/packages/web/src/features/templates/hooks/use-gradient-from-pieces.ts
@@ -7,10 +7,10 @@ import {
import { useQueries } from '@tanstack/react-query';
import { useMemo } from 'react';
-import { piecesHooks } from '@/features/pieces/lib/pieces-hooks';
-import { extractPieceNamesAndCoreMetadata } from '@/features/pieces/lib/step-utils';
+import { piecesHooks } from '@/features/pieces/hooks/pieces-hooks';
+import { StepMetadata } from '@/features/pieces/types';
+import { extractPieceNamesAndCoreMetadata } from '@/features/pieces/utils/step-utils';
import { colorsUtils } from '@/lib/color-utils';
-import { StepMetadata } from '@/lib/types';
const rgbToHex = (r: number, g: number, b: number): string => {
return '#' + [r, g, b].map((x) => x.toString(16).padStart(2, '0')).join('');
diff --git a/packages/web/src/features/templates/index.ts b/packages/web/src/features/templates/index.ts
new file mode 100644
index 00000000000..3164610cd79
--- /dev/null
+++ b/packages/web/src/features/templates/index.ts
@@ -0,0 +1,5 @@
+export { templatesApi } from './api/templates-api';
+export { templatesTelemetryApi } from './api/templates-telemetry-api';
+export { ShareTemplate } from './components/share-template';
+export { templatesHooks } from './hooks/templates-hook';
+export { useGradientFromPieces } from './hooks/use-gradient-from-pieces';
diff --git a/packages/web/src/hooks/authorization-hooks.ts b/packages/web/src/hooks/authorization-hooks.ts
index cb67c4161ed..6088c5ebc7e 100644
--- a/packages/web/src/hooks/authorization-hooks.ts
+++ b/packages/web/src/hooks/authorization-hooks.ts
@@ -7,11 +7,11 @@ import {
} from '@activepieces/shared';
import { useQuery } from '@tanstack/react-query';
+import { authenticationApi } from '@/api/authentication-api';
+import { platformApi } from '@/api/platforms-api';
import { flagsHooks } from '@/hooks/flags-hooks';
import { userHooks } from '@/hooks/user-hooks';
-import { authenticationApi } from '@/lib/authentication-api';
import { authenticationSession } from '@/lib/authentication-session';
-import { platformApi } from '@/lib/platforms-api';
export const useAuthorization = () => {
const { data: edition } = flagsHooks.useFlag(ApFlagId.EDITION);
diff --git a/packages/web/src/hooks/flags-hooks.ts b/packages/web/src/hooks/flags-hooks.ts
index 38a56cbd9de..5c6f7672c42 100644
--- a/packages/web/src/hooks/flags-hooks.ts
+++ b/packages/web/src/hooks/flags-hooks.ts
@@ -1,7 +1,7 @@
import { ApFlagId } from '@activepieces/shared';
import { useSuspenseQuery } from '@tanstack/react-query';
-import { flagsApi, FlagsMap } from '../lib/flags-api';
+import { flagsApi, FlagsMap } from '../api/flags-api';
type WebsiteBrand = {
websiteName: string;
diff --git a/packages/web/src/hooks/owner-column-hooks.tsx b/packages/web/src/hooks/owner-column-hooks.tsx
index 80bd20ad26e..d8fe1824d1d 100644
--- a/packages/web/src/hooks/owner-column-hooks.tsx
+++ b/packages/web/src/hooks/owner-column-hooks.tsx
@@ -7,14 +7,15 @@ import { ColumnDef } from '@tanstack/react-table';
import { t } from 'i18next';
import { User } from 'lucide-react';
-import { ApAvatar } from '../components/custom/ap-avatar';
-import { useEmbedding } from '../components/embed-provider';
import {
DataTableFilters,
DataWithId,
RowDataWithActions,
-} from '../components/ui/data-table';
-import { DataTableColumnHeader } from '../components/ui/data-table/data-table-column-header';
+} from '@/components/custom/data-table';
+import { DataTableColumnHeader } from '@/components/custom/data-table/data-table-column-header';
+import { useEmbedding } from '@/components/providers/embed-provider';
+
+import { ApAvatar } from '../components/custom/ap-avatar';
function useOwnerColumn(
columns: ColumnDef, unknown>[],
diff --git a/packages/web/src/hooks/platform-hooks.ts b/packages/web/src/hooks/platform-hooks.ts
index 92fcf92c927..9aa30b00a71 100644
--- a/packages/web/src/hooks/platform-hooks.ts
+++ b/packages/web/src/hooks/platform-hooks.ts
@@ -8,10 +8,9 @@ import { t } from 'i18next';
import { useNavigate } from 'react-router-dom';
import { toast } from 'sonner';
+import { platformApi } from '@/api/platforms-api';
import { authenticationSession } from '@/lib/authentication-session';
-import { platformApi } from '../lib/platforms-api';
-
import { flagsHooks } from './flags-hooks';
export const platformHooks = {
diff --git a/packages/web/src/hooks/platform-user-hooks.ts b/packages/web/src/hooks/platform-user-hooks.ts
index 82e7228c90c..de55a4d32d8 100644
--- a/packages/web/src/hooks/platform-user-hooks.ts
+++ b/packages/web/src/hooks/platform-user-hooks.ts
@@ -1,7 +1,7 @@
import { SeekPage, UserWithMetaInformation } from '@activepieces/shared';
import { useQuery } from '@tanstack/react-query';
-import { platformUserApi } from '@/lib/platform-user-api';
+import { platformUserApi } from '@/api/platform-user-api';
export const platformUserHooks = {
useUsers: () => {
diff --git a/packages/web/src/hooks/use-element-size.ts b/packages/web/src/hooks/use-element-size.ts
new file mode 100644
index 00000000000..ea8575c7ba1
--- /dev/null
+++ b/packages/web/src/hooks/use-element-size.ts
@@ -0,0 +1,27 @@
+import { RefObject, useEffect, useState } from 'react';
+import { useDebouncedCallback } from 'use-debounce';
+
+export const useElementSize = (ref: RefObject) => {
+ const [size, setSize] = useState({ width: 0, height: 0 });
+ const debouncedSetSize = useDebouncedCallback(setSize, 150);
+ useEffect(() => {
+ const handleResize = (entries: ResizeObserverEntry[]) => {
+ if (entries[0]) {
+ const { width, height } = entries[0].contentRect;
+ debouncedSetSize({ width, height });
+ }
+ };
+
+ const resizeObserver = new ResizeObserver(handleResize);
+
+ if (ref.current) {
+ resizeObserver.observe(ref.current);
+ }
+
+ return () => {
+ resizeObserver.disconnect();
+ };
+ }, [debouncedSetSize, ref]);
+
+ return size;
+};
diff --git a/packages/web/src/hooks/use-forwarded-ref.ts b/packages/web/src/hooks/use-forwarded-ref.ts
new file mode 100644
index 00000000000..eaa669836ec
--- /dev/null
+++ b/packages/web/src/hooks/use-forwarded-ref.ts
@@ -0,0 +1,16 @@
+import { useEffect, useRef } from 'react';
+
+export function useForwardedRef(ref: React.ForwardedRef) {
+ const innerRef = useRef(null);
+
+ useEffect(() => {
+ if (!ref) return;
+ if (typeof ref === 'function') {
+ ref(innerRef.current);
+ } else {
+ ref.current = innerRef.current;
+ }
+ });
+
+ return innerRef;
+}
diff --git a/packages/web/src/hooks/use-time-ago.ts b/packages/web/src/hooks/use-time-ago.ts
new file mode 100644
index 00000000000..9132b12b5c3
--- /dev/null
+++ b/packages/web/src/hooks/use-time-ago.ts
@@ -0,0 +1,35 @@
+import dayjs from 'dayjs';
+import { useEffect, useState } from 'react';
+
+import { formatUtils } from '@/lib/format-utils';
+
+export const useTimeAgo = (date: Date) => {
+ const [timeAgo, setTimeAgo] = useState(() =>
+ formatUtils.formatDateToAgo(date),
+ );
+
+ useEffect(() => {
+ const updateInterval = () => {
+ const now = dayjs();
+ const inputDate = dayjs(date);
+ const diffInSeconds = now.diff(inputDate, 'second');
+
+ // Update every second if less than a minute
+ // Update every minute if less than an hour
+ // Update every hour if less than a day
+ // Update every day if more than a day
+ if (diffInSeconds < 60) return 1000;
+ if (diffInSeconds < 3600) return 60000;
+ if (diffInSeconds < 86400) return 3600000;
+ return 86400000;
+ };
+
+ const intervalId = setInterval(() => {
+ setTimeAgo(formatUtils.formatDateToAgo(date));
+ }, updateInterval());
+
+ return () => clearInterval(intervalId);
+ }, [date]);
+
+ return timeAgo;
+};
diff --git a/packages/web/src/hooks/user-hooks.ts b/packages/web/src/hooks/user-hooks.ts
index 469e5216ebb..59f306fa0b9 100644
--- a/packages/web/src/hooks/user-hooks.ts
+++ b/packages/web/src/hooks/user-hooks.ts
@@ -1,8 +1,8 @@
import { isNil, UserWithBadges } from '@activepieces/shared';
import { QueryClient, useQuery, useSuspenseQuery } from '@tanstack/react-query';
+import { userApi } from '@/api/user-api';
import { authenticationSession } from '@/lib/authentication-session';
-import { userApi } from '@/lib/user-api';
export const userHooks = {
useCurrentUser: () => {
diff --git a/packages/web/src/lib/authentication-session.ts b/packages/web/src/lib/authentication-session.ts
index 36d65342922..959e18ff8d6 100644
--- a/packages/web/src/lib/authentication-session.ts
+++ b/packages/web/src/lib/authentication-session.ts
@@ -6,8 +6,9 @@ import {
import dayjs from 'dayjs';
import { jwtDecode } from 'jwt-decode';
+import { authenticationApi } from '@/api/authentication-api';
+
import { ApStorage } from './ap-browser-storage';
-import { authenticationApi } from './authentication-api';
const tokenKey = 'token';
const projectIdKey = 'projectId';
export const authenticationSession = {
diff --git a/packages/web/src/lib/color-util.ts b/packages/web/src/lib/color-util.ts
deleted file mode 100644
index 3944d215a8e..00000000000
--- a/packages/web/src/lib/color-util.ts
+++ /dev/null
@@ -1,71 +0,0 @@
-const hexToHslString = (hex: string) => {
- const { hue, saturation, lightness } = parseToHsl(hex);
- return `${hue.toFixed(1)} ${(saturation * 100).toFixed(1)}% ${(
- lightness * 100
- ).toFixed(1)}%`;
-};
-
-const parseToHsl = (hex: string) => {
- // Remove the '#' character if it exists
- hex = hex.replace(/^#/, '');
-
- // Convert 3-digit hex to 6-digit hex
- if (hex.length === 3) {
- hex = hex
- .split('')
- .map((char) => char + char)
- .join('');
- }
-
- // Convert hex to RGB
- const r = parseInt(hex.substring(0, 2), 16) / 255;
- const g = parseInt(hex.substring(2, 4), 16) / 255;
- const b = parseInt(hex.substring(4, 6), 16) / 255;
-
- // Find the maximum and minimum values to get lightness
- const max = Math.max(r, g, b);
- const min = Math.min(r, g, b);
-
- // Calculate lightness
- const lightness = (max + min) / 2;
-
- let hue = 0;
- let saturation = 0;
-
- if (max !== min) {
- const delta = max - min;
-
- // Calculate saturation
- saturation =
- lightness > 0.5 ? delta / (2 - max - min) : delta / (max + min);
-
- // Calculate hue
- switch (max) {
- case r:
- hue = (g - b) / delta + (g < b ? 6 : 0);
- break;
- case g:
- hue = (b - r) / delta + 2;
- break;
- case b:
- hue = (r - g) / delta + 4;
- break;
- }
-
- hue /= 6;
- }
-
- // Convert hue to degrees
- hue = hue * 360;
-
- return {
- hue,
- saturation,
- lightness,
- };
-};
-
-export const colorsUtils = {
- hexToHslString,
- parseToHsl,
-};
diff --git a/packages/web/src/lib/color-utils.ts b/packages/web/src/lib/color-utils.ts
index 1164ca9efb2..12bd7960332 100644
--- a/packages/web/src/lib/color-utils.ts
+++ b/packages/web/src/lib/color-utils.ts
@@ -19,7 +19,76 @@ function loadImage(url: string): Promise {
return promise;
}
+function parseToHsl(hex: string) {
+ // Remove the '#' character if it exists
+ hex = hex.replace(/^#/, '');
+
+ // Convert 3-digit hex to 6-digit hex
+ if (hex.length === 3) {
+ hex = hex
+ .split('')
+ .map((char) => char + char)
+ .join('');
+ }
+
+ // Convert hex to RGB
+ const r = parseInt(hex.substring(0, 2), 16) / 255;
+ const g = parseInt(hex.substring(2, 4), 16) / 255;
+ const b = parseInt(hex.substring(4, 6), 16) / 255;
+
+ // Find the maximum and minimum values to get lightness
+ const max = Math.max(r, g, b);
+ const min = Math.min(r, g, b);
+
+ // Calculate lightness
+ const lightness = (max + min) / 2;
+
+ let hue = 0;
+ let saturation = 0;
+
+ if (max !== min) {
+ const delta = max - min;
+
+ // Calculate saturation
+ saturation =
+ lightness > 0.5 ? delta / (2 - max - min) : delta / (max + min);
+
+ // Calculate hue
+ switch (max) {
+ case r:
+ hue = (g - b) / delta + (g < b ? 6 : 0);
+ break;
+ case g:
+ hue = (b - r) / delta + 2;
+ break;
+ case b:
+ hue = (r - g) / delta + 4;
+ break;
+ }
+
+ hue /= 6;
+ }
+
+ // Convert hue to degrees
+ hue = hue * 360;
+
+ return {
+ hue,
+ saturation,
+ lightness,
+ };
+}
+
+function hexToHslString(hex: string) {
+ const { hue, saturation, lightness } = parseToHsl(hex);
+ return `${hue.toFixed(1)} ${(saturation * 100).toFixed(1)}% ${(
+ lightness * 100
+ ).toFixed(1)}%`;
+}
+
export const colorsUtils = {
+ hexToHslString,
+ parseToHsl,
isGrayColor: (r: number, g: number, b: number): boolean => {
const threshold = 15;
const darkThreshold = 150;
diff --git a/packages/web/src/lib/dom-utils.ts b/packages/web/src/lib/dom-utils.ts
new file mode 100644
index 00000000000..f857d8fcc7b
--- /dev/null
+++ b/packages/web/src/lib/dom-utils.ts
@@ -0,0 +1,95 @@
+import JSZip from 'jszip';
+
+export const isStepFileUrl = (json: unknown): json is string => {
+ return (
+ Boolean(json) &&
+ typeof json === 'string' &&
+ (json.includes('/api/v1/step-files/') || json.includes('file://'))
+ );
+};
+
+export const parentWindow: Window = window.opener ?? window.parent;
+
+export const cleanLeadingSlash = (url: string) => {
+ return url.startsWith('/') ? url.slice(1) : url;
+};
+
+export const cleanTrailingSlash = (url: string) => {
+ return url.endsWith('/') ? url.slice(0, -1) : url;
+};
+
+export const combinePaths = ({
+ firstPath,
+ secondPath,
+}: {
+ firstPath: string;
+ secondPath: string;
+}) => {
+ const cleanedFirstPath = cleanTrailingSlash(firstPath);
+ const cleanedSecondPath = cleanLeadingSlash(secondPath);
+ return `${cleanedFirstPath}/${cleanedSecondPath}`;
+};
+
+export const downloadFile = async ({
+ obj,
+ fileName,
+ extension,
+}: DownloadFileProps) => {
+ const blob =
+ extension === 'zip'
+ ? await obj.generateAsync({ type: 'blob' })
+ : //utf-8 with bom
+ new Blob([new Uint8Array([0xef, 0xbb, 0xbf]), obj], {
+ type: getBlobType(extension),
+ });
+ const url = URL.createObjectURL(blob);
+ const link = document.createElement('a');
+ link.href = url;
+ link.download = `${fileName}.${extension}`;
+ document.body.appendChild(link);
+ link.click();
+ document.body.removeChild(link);
+ URL.revokeObjectURL(url);
+};
+
+export const wait = (ms: number) => {
+ return new Promise((resolve) => setTimeout(resolve, ms));
+};
+
+export const scrollToElementAndClickIt = (elementId: string) => {
+ const element = document.getElementById(elementId);
+ element?.scrollIntoView({
+ behavior: 'instant',
+ block: 'start',
+ });
+ element?.click();
+};
+
+export const isMac = () => {
+ return /(Mac)/i.test(navigator.userAgent);
+};
+
+function getBlobType(extension: 'json' | 'txt' | 'csv') {
+ switch (extension) {
+ case 'csv':
+ return 'text/csv';
+ case 'json':
+ return 'application/json';
+ case 'txt':
+ return 'text/plain';
+ default:
+ return `text/plain`;
+ }
+}
+
+type DownloadFileProps =
+ | {
+ obj: string;
+ fileName: string;
+ extension: 'json' | 'txt' | 'csv';
+ }
+ | {
+ obj: JSZip;
+ fileName: string;
+ extension: 'zip';
+ };
diff --git a/packages/web/src/lib/format-utils.ts b/packages/web/src/lib/format-utils.ts
new file mode 100644
index 00000000000..01f0da7e063
--- /dev/null
+++ b/packages/web/src/lib/format-utils.ts
@@ -0,0 +1,187 @@
+import dayjs from 'dayjs';
+import duration from 'dayjs/plugin/duration';
+dayjs.extend(duration);
+import i18next, { t } from 'i18next';
+
+const emailRegex =
+ /^(([^<>()[\]\\.,;:\s@"]+(\.[^<>()[\]\\.,;:\s@"]+)*)|(".+"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$/;
+
+export const formatUtils = {
+ emailRegex,
+ convertEnumToHumanReadable(str: string) {
+ const words = str.split(/[_.]/);
+ return words
+ .map(
+ (word) =>
+ word.charAt(0).toUpperCase() + word.slice(1).toLocaleLowerCase(),
+ )
+ .join(' ');
+ },
+ convertEnumToReadable(value: string): string {
+ return (
+ value.charAt(0).toUpperCase() +
+ value.slice(1).toLowerCase().replace(/_/g, ' ')
+ );
+ },
+ formatNumber(number: number) {
+ return new Intl.NumberFormat(i18next.language).format(number);
+ },
+ formatDateOnlyOrFail(date: Date, fallback: string) {
+ try {
+ return this.formatDateOnly(date);
+ } catch (error) {
+ return fallback;
+ }
+ },
+ formatDateOnly(date: Date) {
+ return Intl.DateTimeFormat(i18next.language, {
+ month: 'numeric',
+ day: 'numeric',
+ year: 'numeric',
+ }).format(date);
+ },
+ formatDateWithTime(date: Date, hideCurrentYear: boolean) {
+ const now = dayjs();
+ const inputDate = dayjs(date);
+ const isToday = inputDate.isSame(now, 'day');
+ const isYesterday = inputDate.isSame(now.subtract(1, 'day'), 'day');
+ const isSameYear = inputDate.isSame(now, 'year');
+
+ const timeFormat = new Intl.DateTimeFormat(i18next.language, {
+ hour: 'numeric',
+ minute: 'numeric',
+ hour12: true,
+ });
+
+ if (isToday) {
+ return `${t('Today')}, ${timeFormat.format(date)}`;
+ } else if (isYesterday) {
+ return `${t('Yesterday')}, ${timeFormat.format(date)}`;
+ }
+
+ if (isSameYear && !hideCurrentYear) {
+ return Intl.DateTimeFormat(i18next.language, {
+ month: 'short',
+ day: 'numeric',
+ hour: 'numeric',
+ minute: 'numeric',
+ hour12: true,
+ }).format(date);
+ }
+
+ return Intl.DateTimeFormat(i18next.language, {
+ month: 'short',
+ day: 'numeric',
+ year: 'numeric',
+ hour: 'numeric',
+ minute: 'numeric',
+ hour12: true,
+ }).format(date);
+ },
+ formatDate(date: Date) {
+ const now = dayjs();
+ const inputDate = dayjs(date);
+ const isToday = inputDate.isSame(now, 'day');
+ const isYesterday = inputDate.isSame(now.subtract(1, 'day'), 'day');
+ const isSameYear = inputDate.isSame(now, 'year');
+
+ if (isToday) {
+ return t('Today');
+ }
+
+ if (isYesterday) {
+ return t('Yesterday');
+ }
+
+ if (isSameYear) {
+ return Intl.DateTimeFormat(i18next.language, {
+ month: 'short',
+ day: 'numeric',
+ }).format(date);
+ }
+
+ return Intl.DateTimeFormat(i18next.language, {
+ month: 'short',
+ day: 'numeric',
+ year: 'numeric',
+ }).format(date);
+ },
+ formatToHoursAndMinutes(seconds: number) {
+ const d = dayjs.duration(Math.round(seconds), 'seconds');
+ const h = Math.floor(d.asHours());
+ const m = d.minutes();
+ const s = d.seconds();
+
+ if (h > 0 && m > 0) return `${h}h ${m}m`;
+ if (h > 0) return `${h}h`;
+ if (m > 0 && s > 0) return `${m}m ${s}s`;
+ if (m > 0) return `${m}m`;
+ return `${s}s`;
+ },
+ formatDateToAgo(date: Date) {
+ const now = dayjs();
+ const inputDate = dayjs(date);
+ const diffInSeconds = now.diff(inputDate, 'second');
+ const diffInMinutes = now.diff(inputDate, 'minute');
+ const diffInHours = now.diff(inputDate, 'hour');
+ const diffInDays = now.diff(inputDate, 'day');
+
+ if (diffInSeconds < 60) {
+ return `${diffInSeconds}s ago`;
+ }
+ if (diffInMinutes < 60) {
+ return `${diffInMinutes}m ago`;
+ }
+ if (diffInHours < 24) {
+ return `${diffInHours}h ago`;
+ }
+ if (diffInDays < 30) {
+ return `${diffInDays}d ago`;
+ }
+ return inputDate.format('MMM D, YYYY');
+ },
+ formatDuration(durationMs: number | undefined, short?: boolean): string {
+ if (durationMs === undefined) {
+ return '-';
+ }
+ if (durationMs < 1000) {
+ const durationMsFormatted = Math.floor(durationMs);
+ return short
+ ? `${durationMsFormatted} ms`
+ : `${durationMsFormatted} milliseconds`;
+ }
+ const seconds = Math.floor(durationMs / 1000);
+ const minutes = Math.floor(seconds / 60);
+
+ if (seconds < 60) {
+ return short ? `${seconds} s` : `${seconds} seconds`;
+ }
+
+ if (minutes > 0) {
+ const remainingSeconds = seconds % 60;
+ return short
+ ? `${minutes} min ${
+ remainingSeconds > 0 ? `${remainingSeconds} s` : ''
+ }`
+ : `${minutes} minutes${
+ remainingSeconds > 0 ? ` ${remainingSeconds} seconds` : ''
+ }`;
+ }
+ return short ? `${seconds} s` : `${seconds} seconds`;
+ },
+ urlIsNotLocalhostOrIp(url: string): boolean {
+ const parsed = new URL(url);
+ if (
+ parsed.hostname === 'localhost' ||
+ parsed.hostname === '127.0.0.1' ||
+ parsed.hostname === '::1'
+ ) {
+ return false;
+ }
+ const ipv4Regex = /^(?:\d{1,3}\.){3}\d{1,3}$/;
+ if (ipv4Regex.test(parsed.hostname)) {
+ return false;
+ }
+ return parsed.protocol === 'https:';
+ },
+};
diff --git a/packages/web/src/lib/locale-utils.ts b/packages/web/src/lib/locale-utils.ts
new file mode 100644
index 00000000000..529d7172347
--- /dev/null
+++ b/packages/web/src/lib/locale-utils.ts
@@ -0,0 +1,13 @@
+import { LocalesEnum } from '@activepieces/shared';
+
+export const localesMap = {
+ [LocalesEnum.CHINESE_SIMPLIFIED]: '简体中文',
+ [LocalesEnum.GERMAN]: 'Deutsch',
+ [LocalesEnum.ENGLISH]: 'English',
+ [LocalesEnum.SPANISH]: 'Español',
+ [LocalesEnum.FRENCH]: 'Français',
+ [LocalesEnum.JAPANESE]: '日本語',
+ [LocalesEnum.DUTCH]: 'Nederlands',
+ [LocalesEnum.PORTUGUESE]: 'Português',
+ [LocalesEnum.CHINESE_TRADITIONAL]: '繁體中文',
+};
diff --git a/packages/web/src/lib/navigation-utils.tsx b/packages/web/src/lib/navigation-utils.tsx
index 6c4c2afdd5b..f0f78f380cc 100644
--- a/packages/web/src/lib/navigation-utils.tsx
+++ b/packages/web/src/lib/navigation-utils.tsx
@@ -1,6 +1,6 @@
import { useNavigate, useSearchParams } from 'react-router-dom';
-import { useEmbedding } from '../components/embed-provider';
+import { useEmbedding } from '@/components/providers/embed-provider';
export const useNewWindow = () => {
const { embedState } = useEmbedding();
diff --git a/packages/web/src/lib/route-utils.ts b/packages/web/src/lib/route-utils.ts
new file mode 100644
index 00000000000..9d9bd7a53c3
--- /dev/null
+++ b/packages/web/src/lib/route-utils.ts
@@ -0,0 +1,32 @@
+import { Permission } from '@activepieces/shared';
+
+import { authenticationSession } from './authentication-session';
+
+export const routesThatRequireProjectId = {
+ runs: '/runs',
+ singleRun: '/runs/:runId',
+ flows: '/flows',
+ singleFlow: '/flows/:flowId',
+ connections: '/connections',
+ singleConnection: '/connections/:connectionId',
+ tables: '/tables',
+ singleTable: '/tables/:tableId',
+ settings: '/settings',
+ releases: '/releases',
+ singleRelease: '/releases/:releaseId',
+};
+
+export const determineDefaultRoute = (
+ checkAccess: (permission: Permission) => boolean,
+) => {
+ if (checkAccess(Permission.READ_FLOW)) {
+ return authenticationSession.appendProjectRoutePrefix('/flows');
+ }
+ if (checkAccess(Permission.READ_RUN)) {
+ return authenticationSession.appendProjectRoutePrefix('/runs');
+ }
+ return authenticationSession.appendProjectRoutePrefix('/settings');
+};
+
+export const NEW_FLOW_QUERY_PARAM = 'newFlow';
+export const NEW_TABLE_QUERY_PARAM = 'newTable';
diff --git a/packages/web/src/lib/test/color-utils.test.ts b/packages/web/src/lib/test/color-utils.test.ts
new file mode 100644
index 00000000000..d0964ab3061
--- /dev/null
+++ b/packages/web/src/lib/test/color-utils.test.ts
@@ -0,0 +1,74 @@
+import { describe, it, expect } from 'vitest';
+
+import { colorsUtils } from '../color-utils';
+
+describe('colorsUtils.parseToHsl', () => {
+ it('parses pure red', () => {
+ const result = colorsUtils.parseToHsl('#FF0000');
+ expect(result.hue).toBeCloseTo(0);
+ expect(result.saturation).toBeCloseTo(1);
+ expect(result.lightness).toBeCloseTo(0.5);
+ });
+
+ it('parses pure green', () => {
+ const result = colorsUtils.parseToHsl('#00FF00');
+ expect(result.hue).toBeCloseTo(120);
+ expect(result.saturation).toBeCloseTo(1);
+ expect(result.lightness).toBeCloseTo(0.5);
+ });
+
+ it('parses pure blue', () => {
+ const result = colorsUtils.parseToHsl('#0000FF');
+ expect(result.hue).toBeCloseTo(240);
+ expect(result.saturation).toBeCloseTo(1);
+ expect(result.lightness).toBeCloseTo(0.5);
+ });
+
+ it('parses white', () => {
+ const result = colorsUtils.parseToHsl('#FFFFFF');
+ expect(result.saturation).toBeCloseTo(0);
+ expect(result.lightness).toBeCloseTo(1);
+ });
+
+ it('parses black', () => {
+ const result = colorsUtils.parseToHsl('#000000');
+ expect(result.saturation).toBeCloseTo(0);
+ expect(result.lightness).toBeCloseTo(0);
+ });
+
+ it('parses 3-digit hex', () => {
+ const result = colorsUtils.parseToHsl('#F00');
+ expect(result.hue).toBeCloseTo(0);
+ expect(result.saturation).toBeCloseTo(1);
+ expect(result.lightness).toBeCloseTo(0.5);
+ });
+});
+
+describe('colorsUtils.hexToHslString', () => {
+ it('formats pure red correctly', () => {
+ const result = colorsUtils.hexToHslString('#FF0000');
+ expect(result).toBe('0.0 100.0% 50.0%');
+ });
+});
+
+describe('colorsUtils.isGrayColor', () => {
+ it('returns true for gray RGB values', () => {
+ expect(colorsUtils.isGrayColor(128, 128, 128)).toBe(true);
+ });
+
+ it('returns true for dark RGB values', () => {
+ expect(colorsUtils.isGrayColor(50, 50, 50)).toBe(true);
+ });
+
+ it('returns true for light RGB values', () => {
+ expect(colorsUtils.isGrayColor(230, 230, 230)).toBe(true);
+ });
+
+ it('returns false for colorful RGB values', () => {
+ expect(colorsUtils.isGrayColor(255, 0, 0)).toBe(false);
+ });
+
+ it('returns false for moderately colorful values', () => {
+ expect(colorsUtils.isGrayColor(200, 100, 50)).toBe(false);
+ });
+});
diff --git a/packages/web/src/lib/test/utils.test.ts b/packages/web/src/lib/test/utils.test.ts
new file mode 100644
index 00000000000..011096f1728
--- /dev/null
+++ b/packages/web/src/lib/test/utils.test.ts
@@ -0,0 +1,272 @@
+// @vitest-environment jsdom
+import { AxiosError, AxiosHeaders } from 'axios';
+import { describe, it, expect, vi, beforeEach, afterEach } from 'vitest';
+
+vi.mock('i18next', () => ({
+ default: { language: 'en' },
+ t: (key: string) => key,
+}));
+
+import { formatUtils } from '../format-utils';
+import { validationUtils } from '../validation-utils';
+
+describe('formatUtils.convertEnumToHumanReadable', () => {
+ it('converts underscore-separated enum', () => {
+ expect(formatUtils.convertEnumToHumanReadable('HELLO_WORLD')).toBe(
+ 'Hello World',
+ );
+ });
+
+ it('converts dot-separated enum', () => {
+ expect(formatUtils.convertEnumToHumanReadable('HELLO.WORLD')).toBe(
+ 'Hello World',
+ );
+ });
+
+ it('handles single word', () => {
+ expect(formatUtils.convertEnumToHumanReadable('HELLO')).toBe('Hello');
+ });
+});
+
+describe('formatUtils.convertEnumToReadable', () => {
+ it('converts underscore-separated enum to readable', () => {
+ expect(formatUtils.convertEnumToReadable('HELLO_WORLD')).toBe(
+ 'Hello world',
+ );
+ });
+
+ it('handles single word', () => {
+ expect(formatUtils.convertEnumToReadable('ACTIVE')).toBe('Active');
+ });
+});
+
+describe('formatUtils.formatDuration', () => {
+ it('returns dash for undefined', () => {
+ expect(formatUtils.formatDuration(undefined)).toBe('-');
+ });
+
+ it('formats milliseconds', () => {
+ expect(formatUtils.formatDuration(500)).toBe('500 milliseconds');
+ });
+
+ it('formats milliseconds in short mode', () => {
+ expect(formatUtils.formatDuration(500, true)).toBe('500 ms');
+ });
+
+ it('formats seconds', () => {
+ expect(formatUtils.formatDuration(5000)).toBe('5 seconds');
+ });
+
+ it('formats seconds in short mode', () => {
+ expect(formatUtils.formatDuration(5000, true)).toBe('5 s');
+ });
+
+ it('formats minutes and seconds', () => {
+ expect(formatUtils.formatDuration(90000)).toBe('1 minutes 30 seconds');
+ });
+
+ it('formats minutes and seconds in short mode', () => {
+ expect(formatUtils.formatDuration(90000, true)).toBe('1 min 30 s');
+ });
+
+ it('formats exact minutes', () => {
+ expect(formatUtils.formatDuration(120000)).toBe('2 minutes');
+ });
+});
+
+describe('formatUtils.formatToHoursAndMinutes', () => {
+ it('formats seconds only', () => {
+ expect(formatUtils.formatToHoursAndMinutes(45)).toBe('45s');
+ });
+
+ it('formats minutes and seconds', () => {
+ expect(formatUtils.formatToHoursAndMinutes(125)).toBe('2m 5s');
+ });
+
+ it('formats exact minutes', () => {
+ expect(formatUtils.formatToHoursAndMinutes(120)).toBe('2m');
+ });
+
+ it('formats hours and minutes', () => {
+ expect(formatUtils.formatToHoursAndMinutes(3720)).toBe('1h 2m');
+ });
+
+ it('formats exact hours', () => {
+ expect(formatUtils.formatToHoursAndMinutes(3600)).toBe('1h');
+ });
+});
+
+describe('formatUtils.urlIsNotLocalhostOrIp', () => {
+ it('returns false for localhost', () => {
+ expect(formatUtils.urlIsNotLocalhostOrIp('http://localhost:3000')).toBe(
+ false,
+ );
+ });
+
+ it('returns false for 127.0.0.1', () => {
+ expect(formatUtils.urlIsNotLocalhostOrIp('http://127.0.0.1:3000')).toBe(
+ false,
+ );
+ });
+
+ it('returns false for IP address', () => {
+ expect(formatUtils.urlIsNotLocalhostOrIp('http://192.168.1.1:3000')).toBe(
+ false,
+ );
+ });
+
+ it('returns true for valid https URL', () => {
+ expect(formatUtils.urlIsNotLocalhostOrIp('https://example.com')).toBe(true);
+ });
+
+ it('returns false for http URL with valid domain', () => {
+ expect(formatUtils.urlIsNotLocalhostOrIp('http://example.com')).toBe(false);
+ });
+});
+
+describe('formatUtils.formatDateToAgo', () => {
+ beforeEach(() => {
+ vi.useFakeTimers();
+ vi.setSystemTime(new Date('2025-06-15T12:00:00Z'));
+ });
+
+ it('formats seconds ago', () => {
+ const date = new Date('2025-06-15T11:59:30Z');
+ expect(formatUtils.formatDateToAgo(date)).toBe('30s ago');
+ });
+
+ it('formats minutes ago', () => {
+ const date = new Date('2025-06-15T11:55:00Z');
+ expect(formatUtils.formatDateToAgo(date)).toBe('5m ago');
+ });
+
+ it('formats hours ago', () => {
+ const date = new Date('2025-06-15T09:00:00Z');
+ expect(formatUtils.formatDateToAgo(date)).toBe('3h ago');
+ });
+
+ it('formats days ago', () => {
+ const date = new Date('2025-06-13T12:00:00Z');
+ expect(formatUtils.formatDateToAgo(date)).toBe('2d ago');
+ });
+
+ it('formats dates older than 30 days as date string', () => {
+ const date = new Date('2025-04-01T12:00:00Z');
+ const result = formatUtils.formatDateToAgo(date);
+ expect(result).toContain('Apr');
+ expect(result).toContain('2025');
+ });
+
+ afterEach(() => {
+ vi.useRealTimers();
+ });
+});
+
+describe('formatUtils.formatDate', () => {
+ beforeEach(() => {
+ vi.useFakeTimers();
+ vi.setSystemTime(new Date('2025-06-15T12:00:00Z'));
+ });
+
+ it('returns Today for today', () => {
+ const date = new Date('2025-06-15T08:00:00Z');
+ expect(formatUtils.formatDate(date)).toBe('Today');
+ });
+
+ it('returns Yesterday for yesterday', () => {
+ const date = new Date('2025-06-14T08:00:00Z');
+ expect(formatUtils.formatDate(date)).toBe('Yesterday');
+ });
+
+ it('formats same year date without year', () => {
+ const date = new Date('2025-03-10T08:00:00Z');
+ const result = formatUtils.formatDate(date);
+ expect(result).toContain('Mar');
+ expect(result).toContain('10');
+ expect(result).not.toContain('2025');
+ });
+
+ it('formats different year date with year', () => {
+ const date = new Date('2024-03-10T08:00:00Z');
+ const result = formatUtils.formatDate(date);
+ expect(result).toContain('Mar');
+ expect(result).toContain('2024');
+ });
+
+ afterEach(() => {
+ vi.useRealTimers();
+ });
+});
+
+describe('formatUtils.formatDateWithTime', () => {
+ beforeEach(() => {
+ vi.useFakeTimers();
+ vi.setSystemTime(new Date('2025-06-15T12:00:00Z'));
+ });
+
+ it('formats today with time', () => {
+ const date = new Date('2025-06-15T08:30:00Z');
+ const result = formatUtils.formatDateWithTime(date, false);
+ expect(result).toContain('Today');
+ });
+
+ it('formats yesterday with time', () => {
+ const date = new Date('2025-06-14T08:30:00Z');
+ const result = formatUtils.formatDateWithTime(date, false);
+ expect(result).toContain('Yesterday');
+ });
+
+ it('formats same year date with time', () => {
+ const date = new Date('2025-03-10T08:30:00Z');
+ const result = formatUtils.formatDateWithTime(date, false);
+ expect(result).toContain('Mar');
+ expect(result).toContain('10');
+ });
+
+ it('formats different year date with year and time', () => {
+ const date = new Date('2024-03-10T08:30:00Z');
+ const result = formatUtils.formatDateWithTime(date, false);
+ expect(result).toContain('Mar');
+ expect(result).toContain('2024');
+ });
+
+ afterEach(() => {
+ vi.useRealTimers();
+ });
+});
+
+function makeAxiosError(status: number, data: unknown): AxiosError {
+ const error = new AxiosError('test');
+ error.response = {
+ status,
+ data,
+ statusText: 'Conflict',
+ headers: {},
+ config: { headers: new AxiosHeaders() },
+ };
+ return error;
+}
+
+describe('validationUtils.isValidationError', () => {
+ beforeEach(() => {
+ vi.spyOn(console, 'error').mockImplementation(() => {});
+ });
+
+ afterEach(() => {
+ vi.restoreAllMocks();
+ });
+
+ it('returns true for AxiosError with 409 and VALIDATION code', () => {
+ const error = makeAxiosError(409, { code: 'VALIDATION' });
+ expect(validationUtils.isValidationError(error)).toBe(true);
+ });
+
+ it('returns false for non-axios error', () => {
+ expect(validationUtils.isValidationError(new Error('test'))).toBe(false);
+ });
+
+ it('returns false for wrong status code', () => {
+ const error = makeAxiosError(400, { code: 'VALIDATION' });
+ expect(validationUtils.isValidationError(error)).toBe(false);
+ });
+});
diff --git a/packages/web/src/lib/utils.ts b/packages/web/src/lib/utils.ts
index 90f0e7acfed..d0ee799abfe 100644
--- a/packages/web/src/lib/utils.ts
+++ b/packages/web/src/lib/utils.ts
@@ -1,415 +1,8 @@
-import { LocalesEnum, Permission } from '@activepieces/shared';
-import { AxiosError } from 'axios';
import { clsx, type ClassValue } from 'clsx';
-import dayjs from 'dayjs';
-import duration from 'dayjs/plugin/duration';
-dayjs.extend(duration);
-import i18next, { t } from 'i18next';
-import JSZip from 'jszip';
-import { useEffect, useRef, useState, RefObject } from 'react';
import { twMerge } from 'tailwind-merge';
-import { useDebouncedCallback } from 'use-debounce';
-
-import { authenticationSession } from './authentication-session';
export function cn(...inputs: ClassValue[]) {
return twMerge(clsx(inputs));
}
export const GAP_SIZE_FOR_STEP_SETTINGS = 'gap-3';
-const emailRegex =
- /^(([^<>()[\]\\.,;:\s@"]+(\.[^<>()[\]\\.,;:\s@"]+)*)|(".+"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$/;
-
-export const formatUtils = {
- emailRegex,
- convertEnumToHumanReadable(str: string) {
- const words = str.split(/[_.]/);
- return words
- .map(
- (word) =>
- word.charAt(0).toUpperCase() + word.slice(1).toLocaleLowerCase(),
- )
- .join(' ');
- },
- convertEnumToReadable(value: string): string {
- return (
- value.charAt(0).toUpperCase() +
- value.slice(1).toLowerCase().replace(/_/g, ' ')
- );
- },
- formatNumber(number: number) {
- return new Intl.NumberFormat(i18next.language).format(number);
- },
- formatDateOnlyOrFail(date: Date, fallback: string) {
- try {
- return this.formatDateOnly(date);
- } catch (error) {
- return fallback;
- }
- },
- formatDateOnly(date: Date) {
- return Intl.DateTimeFormat(i18next.language, {
- month: 'numeric',
- day: 'numeric',
- year: 'numeric',
- }).format(date);
- },
- formatDateWithTime(date: Date, hideCurrentYear: boolean) {
- const now = dayjs();
- const inputDate = dayjs(date);
- const isToday = inputDate.isSame(now, 'day');
- const isYesterday = inputDate.isSame(now.subtract(1, 'day'), 'day');
- const isSameYear = inputDate.isSame(now, 'year');
-
- const timeFormat = new Intl.DateTimeFormat(i18next.language, {
- hour: 'numeric',
- minute: 'numeric',
- hour12: true,
- });
-
- if (isToday) {
- return `${t('Today')}, ${timeFormat.format(date)}`;
- } else if (isYesterday) {
- return `${t('Yesterday')}, ${timeFormat.format(date)}`;
- }
-
- if (isSameYear && !hideCurrentYear) {
- return Intl.DateTimeFormat(i18next.language, {
- month: 'short',
- day: 'numeric',
- hour: 'numeric',
- minute: 'numeric',
- hour12: true,
- }).format(date);
- }
-
- return Intl.DateTimeFormat(i18next.language, {
- month: 'short',
- day: 'numeric',
- year: 'numeric',
- hour: 'numeric',
- minute: 'numeric',
- hour12: true,
- }).format(date);
- },
- formatDate(date: Date) {
- const now = dayjs();
- const inputDate = dayjs(date);
- const isToday = inputDate.isSame(now, 'day');
- const isYesterday = inputDate.isSame(now.subtract(1, 'day'), 'day');
- const isSameYear = inputDate.isSame(now, 'year');
-
- if (isToday) {
- return t('Today');
- }
-
- if (isYesterday) {
- return t('Yesterday');
- }
-
- if (isSameYear) {
- return Intl.DateTimeFormat(i18next.language, {
- month: 'short',
- day: 'numeric',
- }).format(date);
- }
-
- return Intl.DateTimeFormat(i18next.language, {
- month: 'short',
- day: 'numeric',
- year: 'numeric',
- }).format(date);
- },
- formatToHoursAndMinutes(seconds: number) {
- const d = dayjs.duration(Math.round(seconds), 'seconds');
- const h = Math.floor(d.asHours());
- const m = d.minutes();
- const s = d.seconds();
-
- if (h > 0 && m > 0) return `${h}h ${m}m`;
- if (h > 0) return `${h}h`;
- if (m > 0 && s > 0) return `${m}m ${s}s`;
- if (m > 0) return `${m}m`;
- return `${s}s`;
- },
- formatDateToAgo(date: Date) {
- const now = dayjs();
- const inputDate = dayjs(date);
- const diffInSeconds = now.diff(inputDate, 'second');
- const diffInMinutes = now.diff(inputDate, 'minute');
- const diffInHours = now.diff(inputDate, 'hour');
- const diffInDays = now.diff(inputDate, 'day');
-
- if (diffInSeconds < 60) {
- return `${diffInSeconds}s ago`;
- }
- if (diffInMinutes < 60) {
- return `${diffInMinutes}m ago`;
- }
- if (diffInHours < 24) {
- return `${diffInHours}h ago`;
- }
- if (diffInDays < 30) {
- return `${diffInDays}d ago`;
- }
- return inputDate.format('MMM D, YYYY');
- },
- formatDuration(durationMs: number | undefined, short?: boolean): string {
- if (durationMs === undefined) {
- return '-';
- }
- if (durationMs < 1000) {
- const durationMsFormatted = Math.floor(durationMs);
- return short
- ? `${durationMsFormatted} ms`
- : `${durationMsFormatted} milliseconds`;
- }
- const seconds = Math.floor(durationMs / 1000);
- const minutes = Math.floor(seconds / 60);
-
- if (seconds < 60) {
- return short ? `${seconds} s` : `${seconds} seconds`;
- }
-
- if (minutes > 0) {
- const remainingSeconds = seconds % 60;
- return short
- ? `${minutes} min ${
- remainingSeconds > 0 ? `${remainingSeconds} s` : ''
- }`
- : `${minutes} minutes${
- remainingSeconds > 0 ? ` ${remainingSeconds} seconds` : ''
- }`;
- }
- return short ? `${seconds} s` : `${seconds} seconds`;
- },
- urlIsNotLocalhostOrIp(url: string): boolean {
- const parsed = new URL(url);
- if (
- parsed.hostname === 'localhost' ||
- parsed.hostname === '127.0.0.1' ||
- parsed.hostname === '::1'
- ) {
- return false;
- }
- const ipv4Regex = /^(?:\d{1,3}\.){3}\d{1,3}$/;
- if (ipv4Regex.test(parsed.hostname)) {
- return false;
- }
- return parsed.protocol === 'https:';
- },
-};
-
-export const validationUtils = {
- isValidationError: (
- error: unknown,
- ): error is AxiosError<{ code?: string; params?: { message?: string } }> => {
- console.error('isValidationError', error);
- return (
- error instanceof AxiosError &&
- error.response?.status === 409 &&
- error.response?.data?.code === 'VALIDATION'
- );
- },
-};
-
-export function useForwardedRef(ref: React.ForwardedRef) {
- const innerRef = useRef(null);
-
- useEffect(() => {
- if (!ref) return;
- if (typeof ref === 'function') {
- ref(innerRef.current);
- } else {
- ref.current = innerRef.current;
- }
- });
-
- return innerRef;
-}
-
-export const localesMap = {
- [LocalesEnum.CHINESE_SIMPLIFIED]: '简体中文',
- [LocalesEnum.GERMAN]: 'Deutsch',
- [LocalesEnum.ENGLISH]: 'English',
- [LocalesEnum.SPANISH]: 'Español',
- [LocalesEnum.FRENCH]: 'Français',
- [LocalesEnum.JAPANESE]: '日本語',
- [LocalesEnum.DUTCH]: 'Nederlands',
- [LocalesEnum.PORTUGUESE]: 'Português',
- [LocalesEnum.CHINESE_TRADITIONAL]: '繁體中文',
-};
-
-export const useElementSize = (ref: RefObject) => {
- const [size, setSize] = useState({ width: 0, height: 0 });
- const debouncedSetSize = useDebouncedCallback(setSize, 150);
- useEffect(() => {
- const handleResize = (entries: ResizeObserverEntry[]) => {
- if (entries[0]) {
- const { width, height } = entries[0].contentRect;
- debouncedSetSize({ width, height });
- }
- };
-
- const resizeObserver = new ResizeObserver(handleResize);
-
- if (ref.current) {
- resizeObserver.observe(ref.current);
- }
-
- return () => {
- resizeObserver.disconnect();
- };
- }, [debouncedSetSize, ref]);
-
- return size;
-};
-
-export const isStepFileUrl = (json: unknown): json is string => {
- return (
- Boolean(json) &&
- typeof json === 'string' &&
- (json.includes('/api/v1/step-files/') || json.includes('file://'))
- );
-};
-
-export const useTimeAgo = (date: Date) => {
- const [timeAgo, setTimeAgo] = useState(() =>
- formatUtils.formatDateToAgo(date),
- );
-
- useEffect(() => {
- const updateInterval = () => {
- const now = dayjs();
- const inputDate = dayjs(date);
- const diffInSeconds = now.diff(inputDate, 'second');
-
- // Update every second if less than a minute
- // Update every minute if less than an hour
- // Update every hour if less than a day
- // Update every day if more than a day
- if (diffInSeconds < 60) return 1000;
- if (diffInSeconds < 3600) return 60000;
- if (diffInSeconds < 86400) return 3600000;
- return 86400000;
- };
-
- const intervalId = setInterval(() => {
- setTimeAgo(formatUtils.formatDateToAgo(date));
- }, updateInterval());
-
- return () => clearInterval(intervalId);
- }, [date]);
-
- return timeAgo;
-};
-
-export const determineDefaultRoute = (
- checkAccess: (permission: Permission) => boolean,
-) => {
- if (checkAccess(Permission.READ_FLOW)) {
- return authenticationSession.appendProjectRoutePrefix('/flows');
- }
- if (checkAccess(Permission.READ_RUN)) {
- return authenticationSession.appendProjectRoutePrefix('/runs');
- }
- return authenticationSession.appendProjectRoutePrefix('/settings');
-};
-export const NEW_FLOW_QUERY_PARAM = 'newFlow';
-export const NEW_TABLE_QUERY_PARAM = 'newTable';
-export const parentWindow: Window = window.opener ?? window.parent;
-export const cleanLeadingSlash = (url: string) => {
- return url.startsWith('/') ? url.slice(1) : url;
-};
-
-export const cleanTrailingSlash = (url: string) => {
- return url.endsWith('/') ? url.slice(0, -1) : url;
-};
-export const combinePaths = ({
- firstPath,
- secondPath,
-}: {
- firstPath: string;
- secondPath: string;
-}) => {
- const cleanedFirstPath = cleanTrailingSlash(firstPath);
- const cleanedSecondPath = cleanLeadingSlash(secondPath);
- return `${cleanedFirstPath}/${cleanedSecondPath}`;
-};
-
-const getBlobType = (extension: 'json' | 'txt' | 'csv') => {
- switch (extension) {
- case 'csv':
- return 'text/csv';
- case 'json':
- return 'application/json';
- case 'txt':
- return 'text/plain';
- default:
- return `text/plain`;
- }
-};
-
-type downloadFileProps =
- | {
- obj: string;
- fileName: string;
- extension: 'json' | 'txt' | 'csv';
- }
- | {
- obj: JSZip;
- fileName: string;
- extension: 'zip';
- };
-export const downloadFile = async ({
- obj,
- fileName,
- extension,
-}: downloadFileProps) => {
- const blob =
- extension === 'zip'
- ? await obj.generateAsync({ type: 'blob' })
- : //utf-8 with bom
- new Blob([new Uint8Array([0xef, 0xbb, 0xbf]), obj], {
- type: getBlobType(extension),
- });
- const url = URL.createObjectURL(blob);
- const link = document.createElement('a');
- link.href = url;
- link.download = `${fileName}.${extension}`;
- document.body.appendChild(link);
- link.click();
- document.body.removeChild(link);
- URL.revokeObjectURL(url);
-};
-
-export const wait = (ms: number) => {
- return new Promise((resolve) => setTimeout(resolve, ms));
-};
-
-export const scrollToElementAndClickIt = (elementId: string) => {
- const element = document.getElementById(elementId);
- element?.scrollIntoView({
- behavior: 'instant',
- block: 'start',
- });
- element?.click();
-};
-
-export const routesThatRequireProjectId = {
- runs: '/runs',
- singleRun: '/runs/:runId',
- flows: '/flows',
- singleFlow: '/flows/:flowId',
- connections: '/connections',
- singleConnection: '/connections/:connectionId',
- tables: '/tables',
- singleTable: '/tables/:tableId',
- settings: '/settings',
- releases: '/releases',
- singleRelease: '/releases/:releaseId',
-};
-
-export const isMac = () => {
- return /(Mac)/i.test(navigator.userAgent);
-};
diff --git a/packages/web/src/lib/validation-utils.ts b/packages/web/src/lib/validation-utils.ts
new file mode 100644
index 00000000000..02d786ff5a7
--- /dev/null
+++ b/packages/web/src/lib/validation-utils.ts
@@ -0,0 +1,14 @@
+import { AxiosError } from 'axios';
+
+export const validationUtils = {
+ isValidationError: (
+ error: unknown,
+ ): error is AxiosError<{ code?: string; params?: { message?: string } }> => {
+ console.error('isValidationError', error);
+ return (
+ error instanceof AxiosError &&
+ error.response?.status === 409 &&
+ error.response?.data?.code === 'VALIDATION'
+ );
+ },
+};
diff --git a/packages/web/vitest.config.ts b/packages/web/vitest.config.ts
new file mode 100644
index 00000000000..8ea4d3deb9b
--- /dev/null
+++ b/packages/web/vitest.config.ts
@@ -0,0 +1,19 @@
+import path from 'path';
+
+import { defineConfig } from 'vitest/config';
+
+export default defineConfig({
+ test: {
+ globals: true,
+ environment: 'node',
+ },
+ resolve: {
+ alias: {
+ '@': path.resolve(__dirname, './src'),
+ '@activepieces/shared': path.resolve(
+ __dirname,
+ '../../packages/shared/src',
+ ),
+ },
+ },
+});