From 381f0941f7ccc5942535acfe9d18fe7303f53077 Mon Sep 17 00:00:00 2001 From: Abdul <106555838+AbdulTheActivePiecer@users.noreply.github.com> Date: Wed, 14 Jan 2026 19:12:11 +0300 Subject: [PATCH 1/6] fix: show external id tooltip for connection in connections table (#10864) --- packages/react-ui/src/app/routes/connections/index.tsx | 5 +++-- .../src/components/custom/clipboard/copy-text-tooltip.tsx | 1 + 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/packages/react-ui/src/app/routes/connections/index.tsx b/packages/react-ui/src/app/routes/connections/index.tsx index ac6124b4caf..02f1841f4dc 100644 --- a/packages/react-ui/src/app/routes/connections/index.tsx +++ b/packages/react-ui/src/app/routes/connections/index.tsx @@ -33,7 +33,6 @@ 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 { StatusIconWithText } from '@/components/ui/status-icon-with-text'; import { @@ -219,7 +218,9 @@ function AppConnectionsPage() { title={t('External ID')} text={row.original.externalId || ''} > - +
+ {row.original.displayName} +
); diff --git a/packages/react-ui/src/components/custom/clipboard/copy-text-tooltip.tsx b/packages/react-ui/src/components/custom/clipboard/copy-text-tooltip.tsx index 5f27b908acb..bebaf1158b2 100644 --- a/packages/react-ui/src/components/custom/clipboard/copy-text-tooltip.tsx +++ b/packages/react-ui/src/components/custom/clipboard/copy-text-tooltip.tsx @@ -20,6 +20,7 @@ const CopyTextTooltip = ({ From 986d20b57e8d3f510ab54db32d4c02250b748852 Mon Sep 17 00:00:00 2001 From: Louai Boumediene <92324961+Louai-Zokerburg@users.noreply.github.com> Date: Wed, 14 Jan 2026 18:05:27 +0100 Subject: [PATCH 2/6] fix: builder text inputs were acting as markdown inputs causing unexpected styling (#10866) --- .../piece-properties/properties-utils.tsx | 3 ++ .../text-input-with-mentions/index.tsx | 51 +++++++++++++++---- .../step-settings/agent-settings/index.tsx | 6 ++- 3 files changed, 48 insertions(+), 12 deletions(-) diff --git a/packages/react-ui/src/app/builder/piece-properties/properties-utils.tsx b/packages/react-ui/src/app/builder/piece-properties/properties-utils.tsx index 2b42149ddde..e23800f3c95 100644 --- a/packages/react-ui/src/app/builder/piece-properties/properties-utils.tsx +++ b/packages/react-ui/src/app/builder/piece-properties/properties-utils.tsx @@ -43,6 +43,7 @@ export const selectGenericFormComponentForProperty = ({ dynamicPropsInfo, propertySettings, hideLabel, + enableMarkdownForInputWithMention, }: SelectGenericFormComponentForPropertyParams) => { switch (property.type) { case PropertyType.ARRAY: @@ -242,6 +243,7 @@ export const selectGenericFormComponentForProperty = ({ disabled={disabled} initialValue={field.value} onChange={field.onChange} + enableMarkdown={enableMarkdownForInputWithMention} > ) : ( ; propertySettings: Record | null; + enableMarkdownForInputWithMention?: boolean; dynamicPropsInfo: | ({ pieceName: string; diff --git a/packages/react-ui/src/app/builder/piece-properties/text-input-with-mentions/index.tsx b/packages/react-ui/src/app/builder/piece-properties/text-input-with-mentions/index.tsx index 4057278e378..bca291341d2 100644 --- a/packages/react-ui/src/app/builder/piece-properties/text-input-with-mentions/index.tsx +++ b/packages/react-ui/src/app/builder/piece-properties/text-input-with-mentions/index.tsx @@ -1,5 +1,10 @@ +import { Document } from '@tiptap/extension-document'; +import { HardBreak } from '@tiptap/extension-hard-break'; +import { History } from '@tiptap/extension-history'; import { MentionNodeAttrs, Mention } from '@tiptap/extension-mention'; +import { Paragraph } from '@tiptap/extension-paragraph'; import { Placeholder } from '@tiptap/extension-placeholder'; +import { Text } from '@tiptap/extension-text'; import { useEditor, EditorContent } from '@tiptap/react'; import StarterKit from '@tiptap/starter-kit'; @@ -17,17 +22,19 @@ type TextInputWithMentionsProps = { onChange: (value: string) => void; placeholder?: string; disabled?: boolean; + enableMarkdown?: boolean; }; -const extensions = (placeholder?: string) => { - return [ - StarterKit.configure({ - heading: { - levels: [1, 2, 3, 4, 5, 6], - }, - }), +const extensions = ({ + enableMarkdown, + placeholder, +}: { + placeholder?: string; + enableMarkdown?: boolean; +}) => { + const baseExtensions = [ Placeholder.configure({ - placeholder, + placeholder: placeholder, emptyNodeClass: 'before:text-muted-foreground opacity-75', }), Mention.configure({ @@ -36,12 +43,33 @@ const extensions = (placeholder?: string) => { }, deleteTriggerWithBackspace: true, renderHTML({ node }) { - const mentionAttrs: MentionNodeAttrs = - node.attrs as unknown as MentionNodeAttrs; + const mentionAttrs = node.attrs as unknown as MentionNodeAttrs; return textMentionUtils.generateMentionHtmlElement(mentionAttrs); }, }), ]; + + if (enableMarkdown) { + return [ + ...baseExtensions, + StarterKit.configure({ + heading: { + levels: [1, 2, 3], + }, + }), + ]; + } + + return [ + ...baseExtensions, + Document, + History, + HardBreak, + Text, + Paragraph.configure({ + HTMLAttributes: {}, + }), + ]; }; function convertToText(value: unknown): string { @@ -63,6 +91,7 @@ export const TextInputWithMentions = ({ onChange, disabled, placeholder, + enableMarkdown, }: TextInputWithMentionsProps) => { const steps = useBuilderStateContext((state) => flowStructureUtil.getAllSteps(state.flowVersion.trigger), @@ -94,7 +123,7 @@ export const TextInputWithMentions = ({ const editor = useEditor({ editable: !disabled, - extensions: extensions(placeholder), + extensions: extensions({ placeholder, enableMarkdown }), content: { type: 'doc', content: textMentionUtils.convertTextToTipTapJsonContent( diff --git a/packages/react-ui/src/app/builder/step-settings/agent-settings/index.tsx b/packages/react-ui/src/app/builder/step-settings/agent-settings/index.tsx index 478d663b61d..ea9395ce790 100644 --- a/packages/react-ui/src/app/builder/step-settings/agent-settings/index.tsx +++ b/packages/react-ui/src/app/builder/step-settings/agent-settings/index.tsx @@ -123,7 +123,11 @@ const selectAgentFormComponentForProperty = ( ); } default: { - return selectGenericFormComponentForProperty(params); + return selectGenericFormComponentForProperty({ + ...params, + enableMarkdownForInputWithMention: + propertyName === AgentPieceProps.PROMPT, + }); } } }; From 256b23d0e033369c066b734a0500733c4617a16e Mon Sep 17 00:00:00 2001 From: Abdul <106555838+AbdulTheActivePiecer@users.noreply.github.com> Date: Wed, 14 Jan 2026 20:19:13 +0300 Subject: [PATCH 3/6] feat: New translation files (#10868) Co-authored-by: automated-commits-ap --- .../community/ai/src/i18n/translation.json | 1 + .../community/http/src/i18n/translation.json | 1 - .../public/locales/de/translation.json | 24 +++++++++---------- .../public/locales/en/translation.json | 24 +++++++++---------- .../public/locales/es/translation.json | 24 +++++++++---------- .../public/locales/fr/translation.json | 24 +++++++++---------- .../public/locales/ja/translation.json | 24 +++++++++---------- .../public/locales/nl/translation.json | 24 +++++++++---------- .../public/locales/pt/translation.json | 24 +++++++++---------- .../public/locales/zh-TW/translation.json | 24 +++++++++---------- .../public/locales/zh/translation.json | 24 +++++++++---------- 11 files changed, 100 insertions(+), 118 deletions(-) diff --git a/packages/pieces/community/ai/src/i18n/translation.json b/packages/pieces/community/ai/src/i18n/translation.json index fe24a710635..e1e7bc4ca81 100644 --- a/packages/pieces/community/ai/src/i18n/translation.json +++ b/packages/pieces/community/ai/src/i18n/translation.json @@ -27,6 +27,7 @@ "Guide Prompt": "Guide Prompt", "Data Schema Type": "Data Schema Type", "Data Definition": "Data Definition", + "AI Model": "AI Model", "Agent Tools": "Agent Tools", "Structured Output": "Structured Output", "Max steps": "Max steps", diff --git a/packages/pieces/community/http/src/i18n/translation.json b/packages/pieces/community/http/src/i18n/translation.json index 3ac72e55658..31e88b721fe 100644 --- a/packages/pieces/community/http/src/i18n/translation.json +++ b/packages/pieces/community/http/src/i18n/translation.json @@ -14,7 +14,6 @@ "Proxy Settings": "Proxy Settings", "Timeout(in seconds)": "Timeout(in seconds)", "On Failure": "On Failure", - "Stop the flow on Failure ?": "Stop the flow on Failure ?", "Enable for files like PDFs, images, etc. A base64 body will be returned.": "Enable for files like PDFs, images, etc. A base64 body will be returned.", "Use a proxy for this request": "Use a proxy for this request", "GET": "GET", diff --git a/packages/react-ui/public/locales/de/translation.json b/packages/react-ui/public/locales/de/translation.json index 06240aabaed..fc2ade30796 100644 --- a/packages/react-ui/public/locales/de/translation.json +++ b/packages/react-ui/public/locales/de/translation.json @@ -21,6 +21,7 @@ "Fit to view": "", "Grab mode": "", "Select mode": "", + "Add note": "", "Replace": "Ersetzen", "Copy": "Kopieren", "Duplicate": "Duplizieren", @@ -38,23 +39,24 @@ "Invalid Move": "Ungültiger Zug", "The destination location is a child of the dragged step": "Die Zielposition ist ein untergeordneter Schritt", "Leaving this page while saving will discard your changes, are you sure you want to leave?": "", + "Double click to edit...": "", + "logo": "Logo", + "Step Icon": "Schritt-Symbol", "Incomplete step": "", "Skipped": "Übersprungen", "Trigger": "", - "logo": "Logo", - "Step Icon": "Schritt-Symbol", "No Steps Pasted": "Keine Schritte eingefügt", "Please make sure you have copied a step(s) and allowed permission to your clipboard": "Bitte stellen Sie sicher, dass Sie einen Schritt(e) und Erlaubnis in Ihre Zwischenablage kopiert haben", "Branch": "Zweig", "Please test the trigger first": "Bitte testen Sie den Auslöser zuerst", "End": "End", "incompleteSteps": "{invalidSteps, plural, =0 {Keine unvollständigen Schritte} =1 {Erledige 1 Schritt} other {Erledige # Schritte}}", - "Discarding changes...": "", - "Publishing...": "", "You have unpublished changes": "", "Discard changes": "", "Publish": "Veröffentlichen", "Saving...": "Speichern...", + "Discarding changes...": "", + "Publishing...": "", "Run Succeeded": "Ausführung erfolgreich", "Run Failed": "Ausführung fehlgeschlagen", "Run Paused": "", @@ -121,9 +123,9 @@ "Input": "Eingabe", "Timeline": "", "Output": "Ausgabe", + "There are no logs captured for this run, because of an internal error, please contact support.": "", + "Logs are kept for {days} days after execution and then deleted.": "", "Show child steps output on round ({iteration}/{totalIterations})": "", - "No Iterations": "", - "All Iterations": "Alle Iterationen", "Canceled": "", "Retry run": "", "On latest version": "", @@ -659,13 +661,6 @@ "Model ID": "", "Model Name": "", "Model Type": "", - "Follow these instructions to get your OpenAI API Key:\n\n1. Visit the following website: https://platform.openai.com/account/api-keys.\n2. Once on the website, locate and click on the option to obtain your OpenAI API Key.\n\nIt is strongly recommended that you add your credit card information to your OpenAI account and upgrade to the paid plan **before** generating the API Key. This will help you prevent 429 errors.\n": "", - "Follow these instructions to get your Claude API Key:\n\n1. Visit the following website: https://console.anthropic.com/settings/keys.\n2. Once on the website, locate and click on the option to obtain your Claude API Key.\n": "", - "Follow these instructions to get your Google API Key:\n1. Visit the following website: https://console.cloud.google.com/apis/credentials.\n2. Once on the website, locate and click on the option to obtain your Google API Key.\n": "", - "Use the Azure Portal to browse to your OpenAI resource and retrieve an API key and resource name.": "", - "Follow these instructions to get your OpenRouter API Key:\n1. Visit the following website: https://openrouter.ai/settings/keys.\n2. Once on the website, locate and click on the option to obtain your OpenRouter API Key.": "", - "Follow these instructions to get your Cloudflare AI Gateway API Key:\n1. Visit the following website: https://developers.cloudflare.com/ai-gateway/get-started/.\n2. Once on the website, follow the instructions to get your account id, gateway id and create an API Key.\n3. After creating the gateway, make sure to enable the Authenticated Gateway Option in your settings.\n4. For each provider you are using, include your keys in the Provider Keys tab.": "", - "Follow these instructions to get your OpenAI Compatible API Key:\n1. Set the base url to your proxy url.\n2. In the api key header, set the value of your auth header name.\n3. In the api key, set your auth header value (full value including the Bearer if any).": "", "Edit": "Bearbeiten", "Resource Name": "Ressourcenname", "Account ID": "", @@ -923,6 +918,9 @@ "No app is selected": "", "(Already added)": "", "No actions found": "", + "AI Model *": "", + "No providers configured": "", + "This provider doesn't have any models configured yet": "", "Add Field": "", "Structured Output": "Strukturierte Ausgabe", "No structured output fields yet.": "", diff --git a/packages/react-ui/public/locales/en/translation.json b/packages/react-ui/public/locales/en/translation.json index 42cfec5814a..386c697e23c 100644 --- a/packages/react-ui/public/locales/en/translation.json +++ b/packages/react-ui/public/locales/en/translation.json @@ -21,6 +21,7 @@ "Fit to view": "", "Grab mode": "", "Select mode": "", + "Add note": "", "Replace": "Replace", "Copy": "Copy", "Duplicate": "Duplicate", @@ -38,23 +39,24 @@ "Invalid Move": "Invalid Move", "The destination location is a child of the dragged step": "The destination location is a child of the dragged step", "Leaving this page while saving will discard your changes, are you sure you want to leave?": "", + "Double click to edit...": "", + "logo": "logo", + "Step Icon": "Step Icon", "Incomplete step": "", "Skipped": "Skipped", "Trigger": "", - "logo": "logo", - "Step Icon": "Step Icon", "No Steps Pasted": "No Steps Pasted", "Please make sure you have copied a step(s) and allowed permission to your clipboard": "Please make sure you have copied a step(s) and allowed permission to your clipboard", "Branch": "Branch", "Please test the trigger first": "Please test the trigger first", "End": "End", "incompleteSteps": "{invalidSteps, plural, =0 {no incomplete steps} =1 {Complete 1 step} other {Complete # steps}}", - "Discarding changes...": "", - "Publishing...": "", "You have unpublished changes": "", "Discard changes": "", "Publish": "Publish", "Saving...": "Saving...", + "Discarding changes...": "", + "Publishing...": "", "Run Succeeded": "Run Succeeded", "Run Failed": "Run Failed", "Run Paused": "", @@ -121,9 +123,9 @@ "Input": "Input", "Timeline": "", "Output": "Output", + "There are no logs captured for this run, because of an internal error, please contact support.": "", + "Logs are kept for {days} days after execution and then deleted.": "", "Show child steps output on round ({iteration}/{totalIterations})": "Show child steps output on round ({iteration}/{totalIterations})", - "No Iterations": "", - "All Iterations": "All Iterations", "Canceled": "", "Retry run": "", "On latest version": "", @@ -659,13 +661,6 @@ "Model ID": "", "Model Name": "", "Model Type": "", - "Follow these instructions to get your OpenAI API Key:\n\n1. Visit the following website: https://platform.openai.com/account/api-keys.\n2. Once on the website, locate and click on the option to obtain your OpenAI API Key.\n\nIt is strongly recommended that you add your credit card information to your OpenAI account and upgrade to the paid plan **before** generating the API Key. This will help you prevent 429 errors.\n": "", - "Follow these instructions to get your Claude API Key:\n\n1. Visit the following website: https://console.anthropic.com/settings/keys.\n2. Once on the website, locate and click on the option to obtain your Claude API Key.\n": "", - "Follow these instructions to get your Google API Key:\n1. Visit the following website: https://console.cloud.google.com/apis/credentials.\n2. Once on the website, locate and click on the option to obtain your Google API Key.\n": "", - "Use the Azure Portal to browse to your OpenAI resource and retrieve an API key and resource name.": "", - "Follow these instructions to get your OpenRouter API Key:\n1. Visit the following website: https://openrouter.ai/settings/keys.\n2. Once on the website, locate and click on the option to obtain your OpenRouter API Key.": "", - "Follow these instructions to get your Cloudflare AI Gateway API Key:\n1. Visit the following website: https://developers.cloudflare.com/ai-gateway/get-started/.\n2. Once on the website, follow the instructions to get your account id, gateway id and create an API Key.\n3. After creating the gateway, make sure to enable the Authenticated Gateway Option in your settings.\n4. For each provider you are using, include your keys in the Provider Keys tab.": "", - "Follow these instructions to get your OpenAI Compatible API Key:\n1. Set the base url to your proxy url.\n2. In the api key header, set the value of your auth header name.\n3. In the api key, set your auth header value (full value including the Bearer if any).": "", "Edit": "Edit", "Resource Name": "Resource Name", "Account ID": "", @@ -923,6 +918,9 @@ "No app is selected": "", "(Already added)": "", "No actions found": "", + "AI Model *": "", + "No providers configured": "", + "This provider doesn't have any models configured yet": "", "Add Field": "", "Structured Output": "Structured Output", "No structured output fields yet.": "", diff --git a/packages/react-ui/public/locales/es/translation.json b/packages/react-ui/public/locales/es/translation.json index 9ab5d6616ed..e6a3fa5115f 100644 --- a/packages/react-ui/public/locales/es/translation.json +++ b/packages/react-ui/public/locales/es/translation.json @@ -21,6 +21,7 @@ "Fit to view": "", "Grab mode": "", "Select mode": "", + "Add note": "", "Replace": "Reemplazar", "Copy": "Copiar", "Duplicate": "Duplicate", @@ -38,23 +39,24 @@ "Invalid Move": "Movimiento inválido", "The destination location is a child of the dragged step": "La ubicación de destino es un hijo del paso arrastrado", "Leaving this page while saving will discard your changes, are you sure you want to leave?": "", + "Double click to edit...": "", + "logo": "logotipo", + "Step Icon": "Icono de Paso", "Incomplete step": "", "Skipped": "Omitido", "Trigger": "", - "logo": "logotipo", - "Step Icon": "Icono de Paso", "No Steps Pasted": "No Pasos Pegados", "Please make sure you have copied a step(s) and allowed permission to your clipboard": "Por favor, asegúrese de que ha copiado el/los paso(s) y permitido el permiso al portapapeles", "Branch": "Rama", "Please test the trigger first": "Por favor pruebe el gatillo primero", "End": "Fin", "incompleteSteps": "{invalidSteps, plural, =0 {No hay pasos incompletos} =1 {Completa 1 paso} other {Completa # pasos}}", - "Discarding changes...": "", - "Publishing...": "", "You have unpublished changes": "", "Discard changes": "", "Publish": "Publicar", "Saving...": "Guardando...", + "Discarding changes...": "", + "Publishing...": "", "Run Succeeded": "Ejecutar con éxito", "Run Failed": "Error al ejecutar", "Run Paused": "", @@ -121,9 +123,9 @@ "Input": "Input", "Timeline": "", "Output": "Salida", + "There are no logs captured for this run, because of an internal error, please contact support.": "", + "Logs are kept for {days} days after execution and then deleted.": "", "Show child steps output on round ({iteration}/{totalIterations})": "", - "No Iterations": "", - "All Iterations": "Todas las iteraciones", "Canceled": "", "Retry run": "", "On latest version": "", @@ -660,13 +662,6 @@ "Model ID": "", "Model Name": "", "Model Type": "", - "Follow these instructions to get your OpenAI API Key:\n\n1. Visit the following website: https://platform.openai.com/account/api-keys.\n2. Once on the website, locate and click on the option to obtain your OpenAI API Key.\n\nIt is strongly recommended that you add your credit card information to your OpenAI account and upgrade to the paid plan **before** generating the API Key. This will help you prevent 429 errors.\n": "", - "Follow these instructions to get your Claude API Key:\n\n1. Visit the following website: https://console.anthropic.com/settings/keys.\n2. Once on the website, locate and click on the option to obtain your Claude API Key.\n": "", - "Follow these instructions to get your Google API Key:\n1. Visit the following website: https://console.cloud.google.com/apis/credentials.\n2. Once on the website, locate and click on the option to obtain your Google API Key.\n": "", - "Use the Azure Portal to browse to your OpenAI resource and retrieve an API key and resource name.": "", - "Follow these instructions to get your OpenRouter API Key:\n1. Visit the following website: https://openrouter.ai/settings/keys.\n2. Once on the website, locate and click on the option to obtain your OpenRouter API Key.": "", - "Follow these instructions to get your Cloudflare AI Gateway API Key:\n1. Visit the following website: https://developers.cloudflare.com/ai-gateway/get-started/.\n2. Once on the website, follow the instructions to get your account id, gateway id and create an API Key.\n3. After creating the gateway, make sure to enable the Authenticated Gateway Option in your settings.\n4. For each provider you are using, include your keys in the Provider Keys tab.": "", - "Follow these instructions to get your OpenAI Compatible API Key:\n1. Set the base url to your proxy url.\n2. In the api key header, set the value of your auth header name.\n3. In the api key, set your auth header value (full value including the Bearer if any).": "", "Edit": "Editar", "Resource Name": "Nombre del recurso", "Account ID": "", @@ -926,6 +921,9 @@ "No app is selected": "", "(Already added)": "", "No actions found": "", + "AI Model *": "", + "No providers configured": "", + "This provider doesn't have any models configured yet": "", "Add Field": "", "Structured Output": "Salida estructurada", "No structured output fields yet.": "", diff --git a/packages/react-ui/public/locales/fr/translation.json b/packages/react-ui/public/locales/fr/translation.json index 4c62edcf8c4..0e59044c123 100644 --- a/packages/react-ui/public/locales/fr/translation.json +++ b/packages/react-ui/public/locales/fr/translation.json @@ -21,6 +21,7 @@ "Fit to view": "", "Grab mode": "", "Select mode": "", + "Add note": "", "Replace": "Remplacer", "Copy": "Copier", "Duplicate": "Dupliquer", @@ -38,23 +39,24 @@ "Invalid Move": "Déplacement invalide", "The destination location is a child of the dragged step": "L'emplacement de destination est enfant de l'étape déplacée", "Leaving this page while saving will discard your changes, are you sure you want to leave?": "", + "Double click to edit...": "", + "logo": "Logo", + "Step Icon": "Icône d'étape", "Incomplete step": "", "Skipped": "Ignoré", "Trigger": "", - "logo": "Logo", - "Step Icon": "Icône d'étape", "No Steps Pasted": "Aucune étape collée", "Please make sure you have copied a step(s) and allowed permission to your clipboard": "Veuillez vous assurer que vous avez copié au moins une étape et que vous avez autorisé la permission dans votre presse-papiers", "Branch": "Branche", "Please test the trigger first": "Veuillez d'abord tester le déclencheur", "End": "Fin", "incompleteSteps": "{invalidSteps, plural, =0 {aucune étape incomplète} =1 {Complétez 1 étape} other {Complétez # étapes}}", - "Discarding changes...": "", - "Publishing...": "", "You have unpublished changes": "", "Discard changes": "", "Publish": "Publier", "Saving...": "Sauvegarde en cours...", + "Discarding changes...": "", + "Publishing...": "", "Run Succeeded": "Exécution réussie", "Run Failed": "Échec de l'exécution", "Run Paused": "", @@ -121,9 +123,9 @@ "Input": "Entrée", "Timeline": "", "Output": "Sortie", + "There are no logs captured for this run, because of an internal error, please contact support.": "", + "Logs are kept for {days} days after execution and then deleted.": "", "Show child steps output on round ({iteration}/{totalIterations})": "", - "No Iterations": "", - "All Iterations": "Toutes les itérations", "Canceled": "", "Retry run": "", "On latest version": "", @@ -660,13 +662,6 @@ "Model ID": "", "Model Name": "", "Model Type": "", - "Follow these instructions to get your OpenAI API Key:\n\n1. Visit the following website: https://platform.openai.com/account/api-keys.\n2. Once on the website, locate and click on the option to obtain your OpenAI API Key.\n\nIt is strongly recommended that you add your credit card information to your OpenAI account and upgrade to the paid plan **before** generating the API Key. This will help you prevent 429 errors.\n": "", - "Follow these instructions to get your Claude API Key:\n\n1. Visit the following website: https://console.anthropic.com/settings/keys.\n2. Once on the website, locate and click on the option to obtain your Claude API Key.\n": "", - "Follow these instructions to get your Google API Key:\n1. Visit the following website: https://console.cloud.google.com/apis/credentials.\n2. Once on the website, locate and click on the option to obtain your Google API Key.\n": "", - "Use the Azure Portal to browse to your OpenAI resource and retrieve an API key and resource name.": "", - "Follow these instructions to get your OpenRouter API Key:\n1. Visit the following website: https://openrouter.ai/settings/keys.\n2. Once on the website, locate and click on the option to obtain your OpenRouter API Key.": "", - "Follow these instructions to get your Cloudflare AI Gateway API Key:\n1. Visit the following website: https://developers.cloudflare.com/ai-gateway/get-started/.\n2. Once on the website, follow the instructions to get your account id, gateway id and create an API Key.\n3. After creating the gateway, make sure to enable the Authenticated Gateway Option in your settings.\n4. For each provider you are using, include your keys in the Provider Keys tab.": "", - "Follow these instructions to get your OpenAI Compatible API Key:\n1. Set the base url to your proxy url.\n2. In the api key header, set the value of your auth header name.\n3. In the api key, set your auth header value (full value including the Bearer if any).": "", "Edit": "Modifier", "Resource Name": "Nom de la ressource", "Account ID": "", @@ -926,6 +921,9 @@ "No app is selected": "", "(Already added)": "", "No actions found": "", + "AI Model *": "", + "No providers configured": "", + "This provider doesn't have any models configured yet": "", "Add Field": "", "Structured Output": "Sortie Structurée", "No structured output fields yet.": "", diff --git a/packages/react-ui/public/locales/ja/translation.json b/packages/react-ui/public/locales/ja/translation.json index de4feebdf7f..8e3cb446a92 100644 --- a/packages/react-ui/public/locales/ja/translation.json +++ b/packages/react-ui/public/locales/ja/translation.json @@ -21,6 +21,7 @@ "Fit to view": "", "Grab mode": "", "Select mode": "", + "Add note": "", "Replace": "置換", "Copy": "コピー", "Duplicate": "Duplicate", @@ -38,23 +39,24 @@ "Invalid Move": "無効な移動です", "The destination location is a child of the dragged step": "移動先の場所はドラッグされたステップの子です", "Leaving this page while saving will discard your changes, are you sure you want to leave?": "", + "Double click to edit...": "", + "logo": "ロゴ", + "Step Icon": "ステップアイコン", "Incomplete step": "", "Skipped": "スキップ", "Trigger": "", - "logo": "ロゴ", - "Step Icon": "ステップアイコン", "No Steps Pasted": "ペーストされたステップはありません", "Please make sure you have copied a step(s) and allowed permission to your clipboard": "ステップをコピーし、クリップボードへのアクセスを許可していることを確認してください", "Branch": "ブランチ", "Please test the trigger first": "最初にトリガーをテストしてください", "End": "終了", "incompleteSteps": "{invalidSteps, plural, =0 {未完成のステップはありません} =1 {1ステップ完了} other {#ステップ完了}}", - "Discarding changes...": "", - "Publishing...": "", "You have unpublished changes": "", "Discard changes": "", "Publish": "公開する", "Saving...": "保存中...", + "Discarding changes...": "", + "Publishing...": "", "Run Succeeded": "実行に成功", "Run Failed": "実行に失敗しました", "Run Paused": "", @@ -121,9 +123,9 @@ "Input": "Input", "Timeline": "", "Output": "出力", + "There are no logs captured for this run, because of an internal error, please contact support.": "", + "Logs are kept for {days} days after execution and then deleted.": "", "Show child steps output on round ({iteration}/{totalIterations})": "", - "No Iterations": "", - "All Iterations": "すべてのイテレーション", "Canceled": "", "Retry run": "", "On latest version": "", @@ -658,13 +660,6 @@ "Model ID": "", "Model Name": "", "Model Type": "", - "Follow these instructions to get your OpenAI API Key:\n\n1. Visit the following website: https://platform.openai.com/account/api-keys.\n2. Once on the website, locate and click on the option to obtain your OpenAI API Key.\n\nIt is strongly recommended that you add your credit card information to your OpenAI account and upgrade to the paid plan **before** generating the API Key. This will help you prevent 429 errors.\n": "", - "Follow these instructions to get your Claude API Key:\n\n1. Visit the following website: https://console.anthropic.com/settings/keys.\n2. Once on the website, locate and click on the option to obtain your Claude API Key.\n": "", - "Follow these instructions to get your Google API Key:\n1. Visit the following website: https://console.cloud.google.com/apis/credentials.\n2. Once on the website, locate and click on the option to obtain your Google API Key.\n": "", - "Use the Azure Portal to browse to your OpenAI resource and retrieve an API key and resource name.": "", - "Follow these instructions to get your OpenRouter API Key:\n1. Visit the following website: https://openrouter.ai/settings/keys.\n2. Once on the website, locate and click on the option to obtain your OpenRouter API Key.": "", - "Follow these instructions to get your Cloudflare AI Gateway API Key:\n1. Visit the following website: https://developers.cloudflare.com/ai-gateway/get-started/.\n2. Once on the website, follow the instructions to get your account id, gateway id and create an API Key.\n3. After creating the gateway, make sure to enable the Authenticated Gateway Option in your settings.\n4. For each provider you are using, include your keys in the Provider Keys tab.": "", - "Follow these instructions to get your OpenAI Compatible API Key:\n1. Set the base url to your proxy url.\n2. In the api key header, set the value of your auth header name.\n3. In the api key, set your auth header value (full value including the Bearer if any).": "", "Edit": "編集", "Resource Name": "リソース名", "Account ID": "", @@ -920,6 +915,9 @@ "No app is selected": "", "(Already added)": "", "No actions found": "", + "AI Model *": "", + "No providers configured": "", + "This provider doesn't have any models configured yet": "", "Add Field": "", "Structured Output": "構造化された出力", "No structured output fields yet.": "", diff --git a/packages/react-ui/public/locales/nl/translation.json b/packages/react-ui/public/locales/nl/translation.json index 3a2a71d02b7..246e6b74cb5 100644 --- a/packages/react-ui/public/locales/nl/translation.json +++ b/packages/react-ui/public/locales/nl/translation.json @@ -21,6 +21,7 @@ "Fit to view": "", "Grab mode": "", "Select mode": "", + "Add note": "", "Replace": "Vervangen", "Copy": "Kopiëer", "Duplicate": "Dupliceer", @@ -38,23 +39,24 @@ "Invalid Move": "Ongeldige Actie", "The destination location is a child of the dragged step": "De bestemmingslocatie is een kind van de geslepen stap", "Leaving this page while saving will discard your changes, are you sure you want to leave?": "", + "Double click to edit...": "", + "logo": "logo", + "Step Icon": "Stap icoon", "Incomplete step": "", "Skipped": "Overgeslagen", "Trigger": "", - "logo": "logo", - "Step Icon": "Stap icoon", "No Steps Pasted": "Geen stappen geplakt", "Please make sure you have copied a step(s) and allowed permission to your clipboard": "Zorg ervoor dat u een stap hebt gekopieerd en dat u toestemming heeft gegeven aan uw klembord", "Branch": "Filiaal", "Please test the trigger first": "Test eerst de trigger", "End": "Einde", "incompleteSteps": "{invalidSteps, plural, one {}=0 {Geen onvolledige stappen} =1 {Voltooi 1 stap} other {Voltooi # stappen}}", - "Discarding changes...": "", - "Publishing...": "", "You have unpublished changes": "", "Discard changes": "", "Publish": "Publiceer", "Saving...": "Opslaan...", + "Discarding changes...": "", + "Publishing...": "", "Run Succeeded": "Run Succesvol", "Run Failed": "Run Mislukt", "Run Paused": "", @@ -121,9 +123,9 @@ "Input": "Input", "Timeline": "", "Output": "Uitvoer", + "There are no logs captured for this run, because of an internal error, please contact support.": "", + "Logs are kept for {days} days after execution and then deleted.": "", "Show child steps output on round ({iteration}/{totalIterations})": "", - "No Iterations": "", - "All Iterations": "Alle iteraties", "Canceled": "", "Retry run": "", "On latest version": "", @@ -659,13 +661,6 @@ "Model ID": "", "Model Name": "", "Model Type": "", - "Follow these instructions to get your OpenAI API Key:\n\n1. Visit the following website: https://platform.openai.com/account/api-keys.\n2. Once on the website, locate and click on the option to obtain your OpenAI API Key.\n\nIt is strongly recommended that you add your credit card information to your OpenAI account and upgrade to the paid plan **before** generating the API Key. This will help you prevent 429 errors.\n": "", - "Follow these instructions to get your Claude API Key:\n\n1. Visit the following website: https://console.anthropic.com/settings/keys.\n2. Once on the website, locate and click on the option to obtain your Claude API Key.\n": "", - "Follow these instructions to get your Google API Key:\n1. Visit the following website: https://console.cloud.google.com/apis/credentials.\n2. Once on the website, locate and click on the option to obtain your Google API Key.\n": "", - "Use the Azure Portal to browse to your OpenAI resource and retrieve an API key and resource name.": "", - "Follow these instructions to get your OpenRouter API Key:\n1. Visit the following website: https://openrouter.ai/settings/keys.\n2. Once on the website, locate and click on the option to obtain your OpenRouter API Key.": "", - "Follow these instructions to get your Cloudflare AI Gateway API Key:\n1. Visit the following website: https://developers.cloudflare.com/ai-gateway/get-started/.\n2. Once on the website, follow the instructions to get your account id, gateway id and create an API Key.\n3. After creating the gateway, make sure to enable the Authenticated Gateway Option in your settings.\n4. For each provider you are using, include your keys in the Provider Keys tab.": "", - "Follow these instructions to get your OpenAI Compatible API Key:\n1. Set the base url to your proxy url.\n2. In the api key header, set the value of your auth header name.\n3. In the api key, set your auth header value (full value including the Bearer if any).": "", "Edit": "Bewerken", "Resource Name": "Resource naam", "Account ID": "", @@ -923,6 +918,9 @@ "No app is selected": "", "(Already added)": "", "No actions found": "", + "AI Model *": "", + "No providers configured": "", + "This provider doesn't have any models configured yet": "", "Add Field": "", "Structured Output": "Gestructureerde uitgang", "No structured output fields yet.": "", diff --git a/packages/react-ui/public/locales/pt/translation.json b/packages/react-ui/public/locales/pt/translation.json index 8dfff91eccd..ff496bc8ec4 100644 --- a/packages/react-ui/public/locales/pt/translation.json +++ b/packages/react-ui/public/locales/pt/translation.json @@ -21,6 +21,7 @@ "Fit to view": "", "Grab mode": "", "Select mode": "", + "Add note": "", "Replace": "Substituir", "Copy": "Copiar", "Duplicate": "Duplicar", @@ -38,23 +39,24 @@ "Invalid Move": "Movimento Inválido", "The destination location is a child of the dragged step": "O local de destino é filho do passo arrastado", "Leaving this page while saving will discard your changes, are you sure you want to leave?": "", + "Double click to edit...": "", + "logo": "logotipo", + "Step Icon": "Ícone do passo", "Incomplete step": "", "Skipped": "Ignorado", "Trigger": "", - "logo": "logotipo", - "Step Icon": "Ícone do passo", "No Steps Pasted": "Nenhum passo colado", "Please make sure you have copied a step(s) and allowed permission to your clipboard": "Por favor, certifique-se de ter copiado uma fase(s) e permitido a permissão para a área de transferência", "Branch": "Ramificação", "Please test the trigger first": "Por favor, teste o disparador primeiro", "End": "Finalizar", "incompleteSteps": "{invalidSteps, plural, =0 {Não há passos incompletos} =1 {Complete 1 passo} other {Complete # passos}}", - "Discarding changes...": "", - "Publishing...": "", "You have unpublished changes": "", "Discard changes": "", "Publish": "Publicar", "Saving...": "Salvando...", + "Discarding changes...": "", + "Publishing...": "", "Run Succeeded": "Execução Bem-sucedida", "Run Failed": "Execução Falhou", "Run Paused": "", @@ -121,9 +123,9 @@ "Input": "Entrada", "Timeline": "", "Output": "Saída", + "There are no logs captured for this run, because of an internal error, please contact support.": "", + "Logs are kept for {days} days after execution and then deleted.": "", "Show child steps output on round ({iteration}/{totalIterations})": "", - "No Iterations": "", - "All Iterations": "Todas as Iterações", "Canceled": "", "Retry run": "", "On latest version": "", @@ -660,13 +662,6 @@ "Model ID": "", "Model Name": "", "Model Type": "", - "Follow these instructions to get your OpenAI API Key:\n\n1. Visit the following website: https://platform.openai.com/account/api-keys.\n2. Once on the website, locate and click on the option to obtain your OpenAI API Key.\n\nIt is strongly recommended that you add your credit card information to your OpenAI account and upgrade to the paid plan **before** generating the API Key. This will help you prevent 429 errors.\n": "", - "Follow these instructions to get your Claude API Key:\n\n1. Visit the following website: https://console.anthropic.com/settings/keys.\n2. Once on the website, locate and click on the option to obtain your Claude API Key.\n": "", - "Follow these instructions to get your Google API Key:\n1. Visit the following website: https://console.cloud.google.com/apis/credentials.\n2. Once on the website, locate and click on the option to obtain your Google API Key.\n": "", - "Use the Azure Portal to browse to your OpenAI resource and retrieve an API key and resource name.": "", - "Follow these instructions to get your OpenRouter API Key:\n1. Visit the following website: https://openrouter.ai/settings/keys.\n2. Once on the website, locate and click on the option to obtain your OpenRouter API Key.": "", - "Follow these instructions to get your Cloudflare AI Gateway API Key:\n1. Visit the following website: https://developers.cloudflare.com/ai-gateway/get-started/.\n2. Once on the website, follow the instructions to get your account id, gateway id and create an API Key.\n3. After creating the gateway, make sure to enable the Authenticated Gateway Option in your settings.\n4. For each provider you are using, include your keys in the Provider Keys tab.": "", - "Follow these instructions to get your OpenAI Compatible API Key:\n1. Set the base url to your proxy url.\n2. In the api key header, set the value of your auth header name.\n3. In the api key, set your auth header value (full value including the Bearer if any).": "", "Edit": "Alterar", "Resource Name": "Nome do Recurso", "Account ID": "", @@ -926,6 +921,9 @@ "No app is selected": "", "(Already added)": "", "No actions found": "", + "AI Model *": "", + "No providers configured": "", + "This provider doesn't have any models configured yet": "", "Add Field": "", "Structured Output": "Saída estruturada", "No structured output fields yet.": "", diff --git a/packages/react-ui/public/locales/zh-TW/translation.json b/packages/react-ui/public/locales/zh-TW/translation.json index 49935dccfbd..6f35dd03f08 100644 --- a/packages/react-ui/public/locales/zh-TW/translation.json +++ b/packages/react-ui/public/locales/zh-TW/translation.json @@ -21,6 +21,7 @@ "Fit to view": "", "Grab mode": "", "Select mode": "", + "Add note": "", "Replace": "", "Copy": "", "Duplicate": "", @@ -38,23 +39,24 @@ "Invalid Move": "", "The destination location is a child of the dragged step": "", "Leaving this page while saving will discard your changes, are you sure you want to leave?": "", + "Double click to edit...": "", + "logo": "", + "Step Icon": "", "Incomplete step": "", "Skipped": "", "Trigger": "", - "logo": "", - "Step Icon": "", "No Steps Pasted": "", "Please make sure you have copied a step(s) and allowed permission to your clipboard": "", "Branch": "", "Please test the trigger first": "", "End": "", "incompleteSteps": "", - "Discarding changes...": "", - "Publishing...": "", "You have unpublished changes": "", "Discard changes": "", "Publish": "", "Saving...": "", + "Discarding changes...": "", + "Publishing...": "", "Run Succeeded": "", "Run Failed": "", "Run Paused": "", @@ -121,9 +123,9 @@ "Input": "", "Timeline": "", "Output": "", + "There are no logs captured for this run, because of an internal error, please contact support.": "", + "Logs are kept for {days} days after execution and then deleted.": "", "Show child steps output on round ({iteration}/{totalIterations})": "", - "No Iterations": "", - "All Iterations": "", "Canceled": "", "Retry run": "", "On latest version": "", @@ -658,13 +660,6 @@ "Model ID": "", "Model Name": "", "Model Type": "", - "Follow these instructions to get your OpenAI API Key:\n\n1. Visit the following website: https://platform.openai.com/account/api-keys.\n2. Once on the website, locate and click on the option to obtain your OpenAI API Key.\n\nIt is strongly recommended that you add your credit card information to your OpenAI account and upgrade to the paid plan **before** generating the API Key. This will help you prevent 429 errors.\n": "", - "Follow these instructions to get your Claude API Key:\n\n1. Visit the following website: https://console.anthropic.com/settings/keys.\n2. Once on the website, locate and click on the option to obtain your Claude API Key.\n": "", - "Follow these instructions to get your Google API Key:\n1. Visit the following website: https://console.cloud.google.com/apis/credentials.\n2. Once on the website, locate and click on the option to obtain your Google API Key.\n": "", - "Use the Azure Portal to browse to your OpenAI resource and retrieve an API key and resource name.": "", - "Follow these instructions to get your OpenRouter API Key:\n1. Visit the following website: https://openrouter.ai/settings/keys.\n2. Once on the website, locate and click on the option to obtain your OpenRouter API Key.": "", - "Follow these instructions to get your Cloudflare AI Gateway API Key:\n1. Visit the following website: https://developers.cloudflare.com/ai-gateway/get-started/.\n2. Once on the website, follow the instructions to get your account id, gateway id and create an API Key.\n3. After creating the gateway, make sure to enable the Authenticated Gateway Option in your settings.\n4. For each provider you are using, include your keys in the Provider Keys tab.": "", - "Follow these instructions to get your OpenAI Compatible API Key:\n1. Set the base url to your proxy url.\n2. In the api key header, set the value of your auth header name.\n3. In the api key, set your auth header value (full value including the Bearer if any).": "", "Edit": "", "Resource Name": "", "Account ID": "", @@ -920,6 +915,9 @@ "No app is selected": "", "(Already added)": "", "No actions found": "", + "AI Model *": "", + "No providers configured": "", + "This provider doesn't have any models configured yet": "", "Add Field": "", "Structured Output": "", "No structured output fields yet.": "", diff --git a/packages/react-ui/public/locales/zh/translation.json b/packages/react-ui/public/locales/zh/translation.json index d379ffc59b4..bc3166b9505 100644 --- a/packages/react-ui/public/locales/zh/translation.json +++ b/packages/react-ui/public/locales/zh/translation.json @@ -21,6 +21,7 @@ "Fit to view": "", "Grab mode": "", "Select mode": "", + "Add note": "", "Replace": "替换", "Copy": "复制", "Duplicate": "Duplicate", @@ -38,23 +39,24 @@ "Invalid Move": "无效移动", "The destination location is a child of the dragged step": "目标位置是拖动步骤的子节点", "Leaving this page while saving will discard your changes, are you sure you want to leave?": "", + "Double click to edit...": "", + "logo": "徽标", + "Step Icon": "步骤图标", "Incomplete step": "", "Skipped": "跳过", "Trigger": "", - "logo": "徽标", - "Step Icon": "步骤图标", "No Steps Pasted": "No Steps Pasted", "Please make sure you have copied a step(s) and allowed permission to your clipboard": "Please make sure you have copied a step(s) and allowed permission to your clipboard", "Branch": "分支", "Please test the trigger first": "请先测试触发器", "End": "结束", "incompleteSteps": "{invalidSteps, plural, =0 {没有不完整的步骤} =1 {完成步骤} other {完成# 步骤}}", - "Discarding changes...": "", - "Publishing...": "", "You have unpublished changes": "", "Discard changes": "", "Publish": "重新上架", "Saving...": "保存中...", + "Discarding changes...": "", + "Publishing...": "", "Run Succeeded": "运行成功", "Run Failed": "运行失败", "Run Paused": "", @@ -121,9 +123,9 @@ "Input": "Input", "Timeline": "", "Output": "产出", + "There are no logs captured for this run, because of an internal error, please contact support.": "", + "Logs are kept for {days} days after execution and then deleted.": "", "Show child steps output on round ({iteration}/{totalIterations})": "", - "No Iterations": "", - "All Iterations": "所有迭代数", "Canceled": "", "Retry run": "", "On latest version": "", @@ -658,13 +660,6 @@ "Model ID": "", "Model Name": "", "Model Type": "", - "Follow these instructions to get your OpenAI API Key:\n\n1. Visit the following website: https://platform.openai.com/account/api-keys.\n2. Once on the website, locate and click on the option to obtain your OpenAI API Key.\n\nIt is strongly recommended that you add your credit card information to your OpenAI account and upgrade to the paid plan **before** generating the API Key. This will help you prevent 429 errors.\n": "", - "Follow these instructions to get your Claude API Key:\n\n1. Visit the following website: https://console.anthropic.com/settings/keys.\n2. Once on the website, locate and click on the option to obtain your Claude API Key.\n": "", - "Follow these instructions to get your Google API Key:\n1. Visit the following website: https://console.cloud.google.com/apis/credentials.\n2. Once on the website, locate and click on the option to obtain your Google API Key.\n": "", - "Use the Azure Portal to browse to your OpenAI resource and retrieve an API key and resource name.": "", - "Follow these instructions to get your OpenRouter API Key:\n1. Visit the following website: https://openrouter.ai/settings/keys.\n2. Once on the website, locate and click on the option to obtain your OpenRouter API Key.": "", - "Follow these instructions to get your Cloudflare AI Gateway API Key:\n1. Visit the following website: https://developers.cloudflare.com/ai-gateway/get-started/.\n2. Once on the website, follow the instructions to get your account id, gateway id and create an API Key.\n3. After creating the gateway, make sure to enable the Authenticated Gateway Option in your settings.\n4. For each provider you are using, include your keys in the Provider Keys tab.": "", - "Follow these instructions to get your OpenAI Compatible API Key:\n1. Set the base url to your proxy url.\n2. In the api key header, set the value of your auth header name.\n3. In the api key, set your auth header value (full value including the Bearer if any).": "", "Edit": "编辑", "Resource Name": "资源名称", "Account ID": "", @@ -920,6 +915,9 @@ "No app is selected": "", "(Already added)": "", "No actions found": "", + "AI Model *": "", + "No providers configured": "", + "This provider doesn't have any models configured yet": "", "Add Field": "", "Structured Output": "Structured Output", "No structured output fields yet.": "", From 20acc5842d30814e7c22615b9a64c1510b9ffd98 Mon Sep 17 00:00:00 2001 From: Abdul <106555838+AbdulTheActivePiecer@users.noreply.github.com> Date: Wed, 14 Jan 2026 21:14:49 +0300 Subject: [PATCH 4/6] fix: hide owners column for flows and connections in embed mode (#10867) --- .../src/app/routes/connections/index.tsx | 414 ++++++++---------- .../app/routes/flows/flows-table/columns.tsx | 41 +- .../app/routes/flows/flows-table/index.tsx | 13 +- .../react-ui/src/hooks/owner-column-hooks.tsx | 113 +++++ .../migrate-v12-fix-piece-version.ts | 1 - packages/server/shared/package.json | 2 +- packages/server/worker/package.json | 2 +- packages/shared/package.json | 2 +- packages/shared/src/lib/common/utils/utils.ts | 12 + 9 files changed, 330 insertions(+), 270 deletions(-) create mode 100644 packages/react-ui/src/hooks/owner-column-hooks.tsx diff --git a/packages/react-ui/src/app/routes/connections/index.tsx b/packages/react-ui/src/app/routes/connections/index.tsx index 02f1841f4dc..d939f9fbc7d 100644 --- a/packages/react-ui/src/app/routes/connections/index.tsx +++ b/packages/react-ui/src/app/routes/connections/index.tsx @@ -4,7 +4,6 @@ import { CheckIcon, Globe, Tag, - User, Replace, Trash2, Plus, @@ -19,7 +18,6 @@ import { useLocation, useNavigate } from 'react-router-dom'; 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 { ApAvatar } from '@/components/custom/ap-avatar'; import { CopyTextTooltip } from '@/components/custom/clipboard/copy-text-tooltip'; import { PermissionNeededTooltip } from '@/components/custom/permission-needed-tooltip'; import { ConfirmationDeleteDialog } from '@/components/delete-dialog'; @@ -50,6 +48,7 @@ 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'; 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'; @@ -125,240 +124,213 @@ function AppConnectionsPage() { const userHasPermissionToWriteAppConnection = checkAccess( Permission.WRITE_APP_CONNECTION, ); - const { data: owners } = appConnectionsQueries.useConnectionsOwners(); - - const ownersOptions = owners?.map((owner) => ({ - label: `${owner.firstName} ${owner.lastName} (${owner.email})`, - value: owner.email, - })); - const filters: DataTableFilters[] = [ - { - type: 'select', - title: t('Status'), - accessorKey: 'status', - options: Object.values(AppConnectionStatus).map((status) => { - return { - label: formatUtils.convertEnumToHumanReadable(status), - value: status, - }; - }), - icon: CheckIcon, - }, - { - type: 'select', - title: t('Pieces'), - accessorKey: 'pieceName', - icon: Puzzle, - options: pieceOptions, - }, - { - type: 'input', - title: t('Name'), - accessorKey: 'displayName', - icon: Tag, - }, - { - type: 'select', - title: t('Owner'), - accessorKey: 'owner', - icon: User, - options: ownersOptions ?? [], - }, - ]; + const filters: DataTableFilters[] = + ownerColumnHooks.useOwnerColumnFilter( + [ + { + type: 'select', + title: t('Status'), + accessorKey: 'status', + options: Object.values(AppConnectionStatus).map((status) => { + return { + label: formatUtils.convertEnumToHumanReadable(status), + value: status, + }; + }), + icon: CheckIcon, + }, + { + type: 'select', + title: t('Pieces'), + accessorKey: 'pieceName', + icon: Puzzle, + options: pieceOptions, + }, + { + type: 'input', + title: t('Name'), + accessorKey: 'displayName', + icon: Tag, + }, + ], + 4, + owners, + ); const columns: ColumnDef< RowDataWithActions, unknown - >[] = [ - { - accessorKey: 'pieceName', - size: 150, - header: ({ column }) => ( - - ), - cell: ({ row }) => { - return ( -
- -
- ); + >[] = ownerColumnHooks.useOwnerColumn( + [ + { + accessorKey: 'pieceName', + size: 150, + header: ({ column }) => ( + + ), + cell: ({ row }) => { + return ( +
+ +
+ ); + }, }, - }, - { - accessorKey: 'displayName', - size: 200, - header: ({ column }) => ( - - ), - cell: ({ row }) => { - const isPlatformConnection = row.original.scope === 'PLATFORM'; - return ( -
- {isPlatformConnection && ( - - - - - -

- {t( - 'This connection is global and can be managed in the platform admin', - )} -

-
-
- )} + { + accessorKey: 'displayName', + size: 200, + header: ({ column }) => ( + + ), + cell: ({ row }) => { + const isPlatformConnection = row.original.scope === 'PLATFORM'; + return ( +
+ {isPlatformConnection && ( + + + + + +

+ {t( + 'This connection is global and can be managed in the platform admin', + )} +

+
+
+ )} - -
- {row.original.displayName} -
-
-
- ); - }, - }, - { - accessorKey: 'status', - size: 120, - header: ({ column }) => ( - - ), - cell: ({ row }) => { - const status = row.original.status; - const { variant, icon: Icon } = - appConnectionUtils.getStatusIcon(status); - return ( -
- -
- ); - }, - }, - { - accessorKey: 'updated', - size: 150, - header: ({ column }) => ( - - ), - cell: ({ row }) => { - return ( -
- -
- ); + +
+ {row.original.displayName} +
+
+
+ ); + }, }, - }, - { - accessorKey: 'owner', - size: 180, - header: ({ column }) => ( - - ), - cell: ({ row }) => { - return ( -
- {row.original.owner && ( - ( + + ), + cell: ({ row }) => { + const status = row.original.status; + const { variant, icon: Icon } = + appConnectionUtils.getStatusIcon(status); + return ( +
+ - )} - {!row.original.owner &&
-
} -
- ); +
+ ); + }, }, - }, - { - accessorKey: 'flowCount', - size: 80, - header: ({ column }) => ( - - ), - cell: ({ row }) => { - return ( -
{ - navigate( - `/flows?connectionExternalId=${row.original.externalId}`, - ); - }} - > - {row.original.flowIds?.length} -
- ); + { + accessorKey: 'updated', + size: 150, + header: ({ column }) => ( + + ), + cell: ({ row }) => { + return ( +
+ +
+ ); + }, }, - }, - { - id: 'actions', - size: 100, - cell: ({ row }) => { - const isPlatformConnection = - row.original.scope === AppConnectionScope.PLATFORM; - const userHasPermissionToRename = isPlatformConnection - ? userPlatformRole === PlatformRole.ADMIN - : userHasPermissionToWriteAppConnection; - return ( -
- {row.original.scope === AppConnectionScope.PROJECT ? ( - { - refetch(); - }} - userHasPermissionToRename={userHasPermissionToRename} - /> - ) : ( - { + { + accessorKey: 'flowCount', + size: 80, + header: ({ column }) => ( + + ), + cell: ({ row }) => { + return ( +
{ + navigate( + `/flows?connectionExternalId=${row.original.externalId}`, + ); + }} + > + {row.original.flowIds?.length} +
+ ); + }, + }, + { + id: 'actions', + size: 100, + cell: ({ row }) => { + const isPlatformConnection = + row.original.scope === AppConnectionScope.PLATFORM; + const userHasPermissionToRename = isPlatformConnection + ? userPlatformRole === PlatformRole.ADMIN + : userHasPermissionToWriteAppConnection; + return ( +
+ {row.original.scope === AppConnectionScope.PROJECT ? ( + { + refetch(); + }} + userHasPermissionToRename={userHasPermissionToRename} + /> + ) : ( + { + refetch(); + }} + /> + )} + { refetch(); }} /> - )} - { - refetch(); - }} - /> -
- ); +
+ ); + }, }, - }, - ]; + ], + 4, + ); const bulkActions: BulkAction[] = useMemo( () => [ diff --git a/packages/react-ui/src/app/routes/flows/flows-table/columns.tsx b/packages/react-ui/src/app/routes/flows/flows-table/columns.tsx index 9edda22a26c..f90f70feed9 100644 --- a/packages/react-ui/src/app/routes/flows/flows-table/columns.tsx +++ b/packages/react-ui/src/app/routes/flows/flows-table/columns.tsx @@ -1,17 +1,9 @@ import { ColumnDef } from '@tanstack/react-table'; import { t } from 'i18next'; -import { - EllipsisVertical, - Tag, - Blocks, - Clock, - ToggleLeft, - User, -} from 'lucide-react'; +import { EllipsisVertical, Tag, Blocks, Clock, ToggleLeft } from 'lucide-react'; import { Dispatch, SetStateAction } from 'react'; import FlowActionMenu from '@/app/components/flow-actions-menu'; -import { ApAvatar } from '@/components/custom/ap-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'; @@ -19,20 +11,18 @@ import { TruncatedColumnTextValue } from '@/components/ui/data-table/truncated-c 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 { isNil, PopulatedFlow } from '@activepieces/shared'; +import { PopulatedFlow } from '@activepieces/shared'; type FlowsTableColumnsProps = { refetch: () => void; refresh: number; setRefresh: Dispatch>; - isEmbedded: boolean; }; export const flowsTableColumns = ({ refetch, refresh, setRefresh, - isEmbedded, }: FlowsTableColumnsProps): (ColumnDef> & { accessorKey: string; })[] => [ @@ -81,33 +71,6 @@ export const flowsTableColumns = ({ ); }, }, - ...(isEmbedded - ? [] - : [ - { - accessorKey: 'owner', - size: 150, - header: ({ column }: { column: any }) => ( - - ), - cell: ({ row }: { row: any }) => { - return isNil(row.original.ownerId) ? ( - - ) : ( - - ); - }, - }, - ]), { accessorKey: 'status', header: ({ column }) => ( diff --git a/packages/react-ui/src/app/routes/flows/flows-table/index.tsx b/packages/react-ui/src/app/routes/flows/flows-table/index.tsx index b83fedeb4eb..65702256166 100644 --- a/packages/react-ui/src/app/routes/flows/flows-table/index.tsx +++ b/packages/react-ui/src/app/routes/flows/flows-table/index.tsx @@ -1,7 +1,7 @@ import { useQuery } from '@tanstack/react-query'; import { t } from 'i18next'; import { CheckIcon, Link2, Workflow } from 'lucide-react'; -import { useMemo, useState } from 'react'; +import { useState } from 'react'; import { useNavigate, useSearchParams } from 'react-router-dom'; import { useEmbedding } from '@/components/embed-provider'; @@ -14,6 +14,7 @@ import { folderIdParamName, } from '@/features/folders/component/folder-filter-list'; import { piecesHooks } from '@/features/pieces/lib/pieces-hooks'; +import { ownerColumnHooks } from '@/hooks/owner-column-hooks'; import { authenticationSession } from '@/lib/authentication-session'; import { useNewWindow } from '@/lib/navigation-utils'; import { formatUtils } from '@/lib/utils'; @@ -82,14 +83,14 @@ export const FlowsTable = ({ refetch: parentRefetch }: FlowsTableProps) => { } }; - const columns = useMemo(() => { - return flowsTableColumns({ + const columns = ownerColumnHooks.useOwnerColumn( + flowsTableColumns({ refetch: handleRefetch, refresh, setRefresh, - isEmbedded: embedState.isEmbedded, - }); - }, [refresh, handleRefetch, embedState.isEmbedded]); + }), + 3, + ); const filters: DataTableFilters< keyof PopulatedFlow | 'connectionExternalId' | 'name' diff --git a/packages/react-ui/src/hooks/owner-column-hooks.tsx b/packages/react-ui/src/hooks/owner-column-hooks.tsx new file mode 100644 index 00000000000..701cf340521 --- /dev/null +++ b/packages/react-ui/src/hooks/owner-column-hooks.tsx @@ -0,0 +1,113 @@ +import { ColumnDef } from '@tanstack/react-table'; +import { t } from 'i18next'; +import { User } from 'lucide-react'; + +import { + AppConnectionOwners, + UserWithMetaInformation, + validateIndexBound, +} from '@activepieces/shared'; + +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'; + +function useOwnerColumn( + columns: ColumnDef, unknown>[], + index: number, +): ColumnDef, unknown>[] { + const { + embedState: { isEmbedded }, + } = useEmbedding(); + console.log('isEmbedded', isEmbedded); + if (isEmbedded) { + return columns; + } + + const ownerColumn: ColumnDef, unknown> = { + accessorKey: 'owner', + size: 180, + header: ({ column }) => ( + + ), + cell: ({ row }) => { + if ('ownerId' in row.original) { + return ; + } else if ('owner' in row.original) { + return ; + } + return
-
; + }, + }; + const safeIndex = validateIndexBound({ index, limit: columns.length }); + return [ + ...columns.slice(0, safeIndex), + ownerColumn, + ...columns.slice(safeIndex), + ]; +} + +function useOwnerColumnFilter< + T extends { owner?: UserWithMetaInformation | null | undefined }, +>( + filters: DataTableFilters[], + index: number, + owners: AppConnectionOwners[] | undefined, +): DataTableFilters[] { + const { + embedState: { isEmbedded }, + } = useEmbedding(); + if (isEmbedded) { + return filters; + } + + const ownersOptions = owners?.map((owner) => ({ + label: `${owner.firstName} ${owner.lastName} (${owner.email})`, + value: owner.email, + })); + const ownerColumnFilter: DataTableFilters = { + type: 'select', + title: t('Owner'), + accessorKey: 'owner', + icon: User, + options: ownersOptions ?? [], + }; + const safeIndex = validateIndexBound({ index, limit: filters.length }); + return [ + ...filters.slice(0, safeIndex), + ownerColumnFilter, + ...filters.slice(safeIndex), + ]; +} + +export const ownerColumnHooks = { + useOwnerColumn, + useOwnerColumnFilter, +}; + +type HasOwner = { + owner?: UserWithMetaInformation | null | undefined; +} & DataWithId; +type HasOwnerId = { ownerId?: string | null | undefined } & DataWithId & + DataWithId; + +const OwnerColumn = ({ ownerId }: { ownerId: string | null | undefined }) => { + return ( +
+ {ownerId && ( + + )} + {!ownerId &&
-
} +
+ ); +}; diff --git a/packages/server/api/src/app/flows/flow-version/migrations/migrate-v12-fix-piece-version.ts b/packages/server/api/src/app/flows/flow-version/migrations/migrate-v12-fix-piece-version.ts index 777e50ebe74..4c782f1945f 100644 --- a/packages/server/api/src/app/flows/flow-version/migrations/migrate-v12-fix-piece-version.ts +++ b/packages/server/api/src/app/flows/flow-version/migrations/migrate-v12-fix-piece-version.ts @@ -1,5 +1,4 @@ import { - assertNotNullOrUndefined, FlowActionType, flowStructureUtil, FlowTriggerType, diff --git a/packages/server/shared/package.json b/packages/server/shared/package.json index 52083408051..40d9ea13152 100644 --- a/packages/server/shared/package.json +++ b/packages/server/shared/package.json @@ -6,7 +6,7 @@ "typings": "./src/index.d.ts", "dependencies": { "@activepieces/pieces-framework": "0.23.0", - "@activepieces/shared": "0.31.1", + "@activepieces/shared": "0.32.0", "tslib": "2.6.2", "pino": "10.1.0", "@hyperdx/node-opentelemetry": "0.8.2", diff --git a/packages/server/worker/package.json b/packages/server/worker/package.json index 502f828e838..cb557822156 100644 --- a/packages/server/worker/package.json +++ b/packages/server/worker/package.json @@ -7,7 +7,7 @@ "dependencies": { "@activepieces/pieces-framework": "0.23.0", "@activepieces/server-shared": "0.0.2", - "@activepieces/shared": "0.31.1", + "@activepieces/shared": "0.32.0", "write-file-atomic": "5.0.1", "tslib": "2.6.2", "@opentelemetry/api": "1.9.0", diff --git a/packages/shared/package.json b/packages/shared/package.json index 0ad412652e6..711494f95ea 100644 --- a/packages/shared/package.json +++ b/packages/shared/package.json @@ -1,5 +1,5 @@ { "name": "@activepieces/shared", - "version": "0.31.1", + "version": "0.32.0", "type": "commonjs" } diff --git a/packages/shared/src/lib/common/utils/utils.ts b/packages/shared/src/lib/common/utils/utils.ts index a4a8042cdba..7b1c741377a 100644 --- a/packages/shared/src/lib/common/utils/utils.ts +++ b/packages/shared/src/lib/common/utils/utils.ts @@ -153,4 +153,16 @@ export function mapsAreSame(a: Map, b: Map): boolean { if (b.get(key) !== value) return false } return true +} + +export function validateIndexBound({ + index, limit, +}: { index: number, limit: number }) { + if (index < 0) { + return 0 + } + if (index >= limit) { + return limit - 1 + } + return index } \ No newline at end of file From 82d5e7d0f2213414eddb2b8d9833d726626f2f3d Mon Sep 17 00:00:00 2001 From: Abdul <106555838+AbdulTheActivePiecer@users.noreply.github.com> Date: Wed, 14 Jan 2026 23:42:38 +0300 Subject: [PATCH 5/6] fix: show a loading skeleton instead of expired run log note when viewing a step in an executing run (#10873) --- .../app/builder/run-details/flow-step-input-output.tsx | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/packages/react-ui/src/app/builder/run-details/flow-step-input-output.tsx b/packages/react-ui/src/app/builder/run-details/flow-step-input-output.tsx index 3de40e99f2b..d75ef261bcb 100644 --- a/packages/react-ui/src/app/builder/run-details/flow-step-input-output.tsx +++ b/packages/react-ui/src/app/builder/run-details/flow-step-input-output.tsx @@ -71,6 +71,11 @@ export const FlowStepInputOutput = () => { ApFlagId.EXECUTION_DATA_RETENTION_DAYS, ); + if (!isRunDone) { + return ; + } + + const message = handleRunFailureOrEmptyLog(run, rententionDays); if (message) { return ( @@ -83,9 +88,6 @@ export const FlowStepInputOutput = () => { ); } - if (!isRunDone) { - return ; - } if (!selectedStepOutput || !selectedStep) { return ( From 37f57f490f8752d332fa4f745eabcd1cb5637b42 Mon Sep 17 00:00:00 2001 From: Abdul <106555838+AbdulTheActivePiecer@users.noreply.github.com> Date: Wed, 14 Jan 2026 23:48:01 +0300 Subject: [PATCH 6/6] fix: lint (#10874) --- .../src/app/builder/run-details/flow-step-input-output.tsx | 2 -- 1 file changed, 2 deletions(-) diff --git a/packages/react-ui/src/app/builder/run-details/flow-step-input-output.tsx b/packages/react-ui/src/app/builder/run-details/flow-step-input-output.tsx index d75ef261bcb..04f5083f63a 100644 --- a/packages/react-ui/src/app/builder/run-details/flow-step-input-output.tsx +++ b/packages/react-ui/src/app/builder/run-details/flow-step-input-output.tsx @@ -75,7 +75,6 @@ export const FlowStepInputOutput = () => { return ; } - const message = handleRunFailureOrEmptyLog(run, rententionDays); if (message) { return ( @@ -88,7 +87,6 @@ export const FlowStepInputOutput = () => { ); } - if (!selectedStepOutput || !selectedStep) { return (