diff --git a/api/controllers/console/app/workflow_trigger.py b/api/controllers/console/app/workflow_trigger.py index cd9f60cd6e..85d87fe2c5 100644 --- a/api/controllers/console/app/workflow_trigger.py +++ b/api/controllers/console/app/workflow_trigger.py @@ -1,4 +1,5 @@ import logging +from typing import Any from flask_restx import Resource, marshal_with, reqparse from sqlalchemy import select @@ -99,12 +100,12 @@ class AppTriggersApi(Resource): plugin_trigger_map = {plugin_trigger.node_id: plugin_trigger for plugin_trigger in plugin_triggers} tenant_id = current_user.current_tenant_id if isinstance(current_user, Account) else None - provider_cache: dict[str, dict[str, str]] = {} + provider_cache: dict[str, dict[str, Any]] = {} - def resolve_provider_metadata(provider_id: str) -> dict[str, str]: + def resolve_provider_metadata(provider_id: str) -> dict[str, Any]: if provider_id in provider_cache: return provider_cache[provider_id] - metadata: dict[str, str] = {} + metadata: dict[str, Any] = {} if not tenant_id: provider_cache[provider_id] = metadata return metadata @@ -116,6 +117,7 @@ class AppTriggersApi(Resource): "plugin_unique_identifier": controller.plugin_unique_identifier, "icon": api_entity.icon or "", "provider_name": api_entity.name, + "provider_label": api_entity.label, } except Exception: metadata = {} @@ -137,6 +139,7 @@ class AppTriggersApi(Resource): trigger.icon = metadata.get("icon", "") # type: ignore[attr-defined] if not trigger.provider_name: trigger.provider_name = metadata.get("provider_name", "") + trigger.provider_label = metadata.get("provider_label") # type: ignore[attr-defined] else: trigger.icon = "" # type: ignore[attr-defined] @@ -201,6 +204,7 @@ class AppTriggerEnableApi(Resource): trigger.event_name = plugin_trigger.event_name # type: ignore[attr-defined] trigger.plugin_id = controller.plugin_id # type: ignore[attr-defined] trigger.plugin_unique_identifier = controller.plugin_unique_identifier # type: ignore[attr-defined] + trigger.provider_label = controller.to_api_entity().label # type: ignore[attr-defined] plugin_icon = controller.to_api_entity().icon or "" except Exception: plugin_icon = "" diff --git a/api/fields/workflow_trigger_fields.py b/api/fields/workflow_trigger_fields.py index 0d37d3dd85..67000687f7 100644 --- a/api/fields/workflow_trigger_fields.py +++ b/api/fields/workflow_trigger_fields.py @@ -6,6 +6,7 @@ trigger_fields = { "title": fields.String, "node_id": fields.String, "provider_name": fields.String, + "provider_label": fields.Raw, "provider_id": fields.String, "subscription_id": fields.String, "event_name": fields.String, diff --git a/api/services/workflow_app_service.py b/api/services/workflow_app_service.py index ca817cee24..d136f0eb98 100644 --- a/api/services/workflow_app_service.py +++ b/api/services/workflow_app_service.py @@ -1,6 +1,7 @@ import json import uuid from datetime import datetime +from typing import Any from sqlalchemy import and_, func, or_, select from sqlalchemy.orm import Session @@ -182,17 +183,18 @@ class WorkflowAppService: ) plugin_trigger_map = {plugin.node_id: plugin for plugin in plugin_triggers} - provider_cache: dict[str, dict[str, str]] = {} + provider_cache: dict[str, dict[str, Any]] = {} - def resolve_provider(provider_id: str) -> dict[str, str]: + def resolve_provider(provider_id: str) -> dict[str, Any]: if provider_id in provider_cache: return provider_cache[provider_id] - metadata: dict[str, str] = {} + metadata: dict[str, Any] = {} try: controller = TriggerManager.get_trigger_provider(app_model.tenant_id, TriggerProviderID(provider_id)) api_entity = controller.to_api_entity() metadata = { "provider_name": api_entity.name, + "provider_label": api_entity.label, "icon": api_entity.icon or "", "plugin_id": controller.plugin_id, "plugin_unique_identifier": controller.plugin_unique_identifier, diff --git a/web/app/components/app/workflow-log/trigger-by-display.tsx b/web/app/components/app/workflow-log/trigger-by-display.tsx index 9b98ae7c64..2d71ad097a 100644 --- a/web/app/components/app/workflow-log/trigger-by-display.tsx +++ b/web/app/components/app/workflow-log/trigger-by-display.tsx @@ -93,16 +93,26 @@ const getTriggerIcon = (triggeredFrom: string, triggerInfo?: TriggerInfo) => { } } +const pickLabel = (labelMap?: Record, language?: string) => { + if (!labelMap) + return '' + if (language && labelMap[language]) + return labelMap[language] + return labelMap.en_US || labelMap['en-US'] || Object.values(labelMap)[0] || '' +} + const TriggerByDisplay: FC = ({ triggeredFrom, className = '', showText = true, triggerInfo, }) => { - const { t } = useTranslation() + const { t, i18n } = useTranslation() const resolvedType = resolveTriggerType(triggerInfo?.type || triggeredFrom) - const displayName = triggerInfo?.provider_name || getTriggerDisplayName(resolvedType, t) + const providerDisplayName = pickLabel(triggerInfo?.provider_label, i18n.language) + || triggerInfo?.provider_name + const displayName = providerDisplayName || getTriggerDisplayName(resolvedType, t) const icon = getTriggerIcon(resolvedType, triggerInfo) return ( diff --git a/web/models/log.ts b/web/models/log.ts index 1b5b7c253e..2f9a99fa11 100644 --- a/web/models/log.ts +++ b/web/models/log.ts @@ -249,6 +249,7 @@ export type TriggerInfo = { workflow_trigger_log_id?: string provider_id?: string provider_name?: string + provider_label?: Record subscription_id?: string event_name?: string plugin_id?: string diff --git a/web/service/use-tools.ts b/web/service/use-tools.ts index a6258d4e1f..1157c3f747 100644 --- a/web/service/use-tools.ts +++ b/web/service/use-tools.ts @@ -335,6 +335,7 @@ export type AppTrigger = { title: string node_id: string provider_name: string + provider_label?: Record provider_id?: string subscription_id?: string plugin_id?: string