Merge branch 'origin-main' into feat/end-user-oauth

This commit is contained in:
zhsama
2025-12-01 02:25:44 +08:00
69 changed files with 12800 additions and 1416 deletions

View File

@ -23,7 +23,7 @@ const Empty = () => {
return (
<>
<DefaultCards />
<div className='absolute bottom-0 left-0 right-0 top-0 flex items-center justify-center bg-gradient-to-t from-background-body to-transparent'>
<div className='absolute inset-0 z-20 flex items-center justify-center bg-gradient-to-t from-background-body to-transparent pointer-events-none'>
<span className='system-md-medium text-text-tertiary'>
{t('app.newApp.noAppsFound')}
</span>

View File

@ -187,6 +187,19 @@ const GotoAnything: FC<Props> = ({
}, {} as { [key: string]: SearchResult[] }),
[searchResults])
useEffect(() => {
if (isCommandsMode)
return
if (!searchResults.length)
return
const currentValueExists = searchResults.some(result => `${result.type}-${result.id}` === cmdVal)
if (!currentValueExists)
setCmdVal(`${searchResults[0].type}-${searchResults[0].id}`)
}, [isCommandsMode, searchResults, cmdVal])
const emptyResult = useMemo(() => {
if (searchResults.length || !searchQuery.trim() || isLoading || isCommandsMode)
return null
@ -386,7 +399,7 @@ const GotoAnything: FC<Props> = ({
<Command.Item
key={`${result.type}-${result.id}`}
value={`${result.type}-${result.id}`}
className='flex cursor-pointer items-center gap-3 rounded-md p-3 will-change-[background-color] aria-[selected=true]:bg-state-base-hover data-[selected=true]:bg-state-base-hover'
className='flex cursor-pointer items-center gap-3 rounded-md p-3 will-change-[background-color] hover:bg-state-base-hover aria-[selected=true]:bg-state-base-hover-alt data-[selected=true]:bg-state-base-hover-alt'
onSelect={() => handleNavigate(result)}
>
{result.icon}

View File

@ -52,7 +52,12 @@ const Nav = ({
`}>
<Link href={link + (linkLastSearchParams && `?${linkLastSearchParams}`)}>
<div
onClick={() => setAppDetail()}
onClick={(e) => {
// Don't clear state if opening in new tab/window
if (e.metaKey || e.ctrlKey || e.shiftKey || e.button !== 0)
return
setAppDetail()
}}
className={classNames(
'flex h-7 cursor-pointer items-center rounded-[10px] px-2.5',
isActivated ? 'text-components-main-nav-nav-button-text-active' : 'text-components-main-nav-nav-button-text',

View File

@ -77,6 +77,8 @@ export type Collection = {
timeout?: number
sse_read_timeout?: number
}
// Workflow
workflow_app_id?: string
}
export type ToolParameter = {

View File

@ -1,5 +1,6 @@
import {
memo,
useMemo,
} from 'react'
import { useTranslation } from 'react-i18next'
import { useEdges } from 'reactflow'
@ -16,6 +17,10 @@ import {
} from '@/app/components/workflow/hooks'
import ShortcutsName from '@/app/components/workflow/shortcuts-name'
import type { Node } from '@/app/components/workflow/types'
import { BlockEnum } from '@/app/components/workflow/types'
import { CollectionType } from '@/app/components/tools/types'
import { useAllWorkflowTools } from '@/service/use-tools'
import { canFindTool } from '@/utils'
type PanelOperatorPopupProps = {
id: string
@ -45,6 +50,14 @@ const PanelOperatorPopup = ({
const showChangeBlock = !nodeMetaData.isTypeFixed && !nodesReadOnly
const isChildNode = !!(data.isInIteration || data.isInLoop)
const { data: workflowTools } = useAllWorkflowTools()
const isWorkflowTool = data.type === BlockEnum.Tool && data.provider_type === CollectionType.workflow
const workflowAppId = useMemo(() => {
if (!isWorkflowTool || !workflowTools || !data.provider_id) return undefined
const workflowTool = workflowTools.find(item => canFindTool(item.id, data.provider_id))
return workflowTool?.workflow_app_id
}, [isWorkflowTool, workflowTools, data.provider_id])
return (
<div className='w-[240px] rounded-lg border-[0.5px] border-components-panel-border bg-components-panel-bg shadow-xl'>
{
@ -137,6 +150,22 @@ const PanelOperatorPopup = ({
</>
)
}
{
isWorkflowTool && workflowAppId && (
<>
<div className='p-1'>
<a
href={`/app/${workflowAppId}/workflow`}
target='_blank'
className='flex h-8 cursor-pointer items-center rounded-lg px-3 text-sm text-text-secondary hover:bg-state-base-hover'
>
{t('workflow.panel.openWorkflow')}
</a>
</div>
<div className='h-px bg-divider-regular'></div>
</>
)
}
{
showHelpLink && nodeMetaData.helpLinkUri && (
<>

View File

@ -374,6 +374,7 @@ const translation = {
optional_and_hidden: '(optional & hidden)',
goTo: 'Gehe zu',
startNode: 'Startknoten',
openWorkflow: 'Workflow öffnen',
},
nodes: {
common: {

View File

@ -383,6 +383,7 @@ const translation = {
userInputField: 'User Input Field',
changeBlock: 'Change Node',
helpLink: 'View Docs',
openWorkflow: 'Open Workflow',
about: 'About',
createdBy: 'Created By ',
nextStep: 'Next Step',

View File

@ -374,6 +374,7 @@ const translation = {
optional_and_hidden: '(opcional y oculto)',
goTo: 'Ir a',
startNode: 'Nodo de inicio',
openWorkflow: 'Abrir flujo de trabajo',
},
nodes: {
common: {

View File

@ -374,6 +374,7 @@ const translation = {
optional_and_hidden: '(اختیاری و پنهان)',
goTo: 'برو به',
startNode: 'گره شروع',
openWorkflow: 'باز کردن جریان کاری',
},
nodes: {
common: {

View File

@ -374,6 +374,7 @@ const translation = {
optional_and_hidden: '(optionnel et caché)',
goTo: 'Aller à',
startNode: 'Nœud de départ',
openWorkflow: 'Ouvrir le flux de travail',
},
nodes: {
common: {

View File

@ -386,6 +386,7 @@ const translation = {
optional_and_hidden: '(वैकल्पिक और छिपा हुआ)',
goTo: 'जाओ',
startNode: 'प्रारंभ नोड',
openWorkflow: 'वर्कफ़्लो खोलें',
},
nodes: {
common: {

View File

@ -381,6 +381,7 @@ const translation = {
goTo: 'Pergi ke',
startNode: 'Mulai Node',
scrollToSelectedNode: 'Gulir ke node yang dipilih',
openWorkflow: 'Buka Alur Kerja',
},
nodes: {
common: {

View File

@ -389,6 +389,7 @@ const translation = {
optional_and_hidden: '(opzionale e nascosto)',
goTo: 'Vai a',
startNode: 'Nodo iniziale',
openWorkflow: 'Apri flusso di lavoro',
},
nodes: {
common: {

View File

@ -401,6 +401,7 @@ const translation = {
minimize: '全画面を終了する',
scrollToSelectedNode: '選択したノードまでスクロール',
optional_and_hidden: '(オプションおよび非表示)',
openWorkflow: 'ワークフローを開く',
},
nodes: {
common: {

View File

@ -395,6 +395,7 @@ const translation = {
optional_and_hidden: '(선택 사항 및 숨김)',
goTo: '로 이동',
startNode: '시작 노드',
openWorkflow: '워크플로 열기',
},
nodes: {
common: {

View File

@ -374,6 +374,7 @@ const translation = {
optional_and_hidden: '(opcjonalne i ukryte)',
goTo: 'Idź do',
startNode: 'Węzeł początkowy',
openWorkflow: 'Otwórz przepływ pracy',
},
nodes: {
common: {

View File

@ -374,6 +374,7 @@ const translation = {
optional_and_hidden: '(opcional & oculto)',
goTo: 'Ir para',
startNode: 'Iniciar Nó',
openWorkflow: 'Abrir fluxo de trabalho',
},
nodes: {
common: {

View File

@ -374,6 +374,7 @@ const translation = {
optional_and_hidden: '(opțional și ascuns)',
goTo: 'Du-te la',
startNode: 'Nod de start',
openWorkflow: 'Deschide fluxul de lucru',
},
nodes: {
common: {

View File

@ -374,6 +374,7 @@ const translation = {
optional_and_hidden: '(необязательно и скрыто)',
goTo: 'Перейти к',
startNode: 'Начальный узел',
openWorkflow: 'Открыть рабочий процесс',
},
nodes: {
common: {

View File

@ -381,6 +381,7 @@ const translation = {
optional_and_hidden: '(neobvezno in skrito)',
goTo: 'Pojdi na',
startNode: 'Začetni vozel',
openWorkflow: 'Odpri delovni tok',
},
nodes: {
common: {

View File

@ -374,6 +374,7 @@ const translation = {
optional_and_hidden: '(ตัวเลือก & ซ่อน)',
goTo: 'ไปที่',
startNode: 'เริ่มต้นโหนด',
openWorkflow: 'เปิดเวิร์กโฟลว์',
},
nodes: {
common: {

View File

@ -374,6 +374,7 @@ const translation = {
optional_and_hidden: '(isteğe bağlı ve gizli)',
goTo: 'Git',
startNode: 'Başlangıç Düğümü',
openWorkflow: 'İş Akışını Aç',
},
nodes: {
common: {

View File

@ -374,6 +374,7 @@ const translation = {
optional_and_hidden: '(необов\'язково & приховано)',
goTo: 'Перейти до',
startNode: 'Початковий вузол',
openWorkflow: 'Відкрити робочий процес',
},
nodes: {
common: {

View File

@ -374,6 +374,7 @@ const translation = {
optional_and_hidden: '(tùy chọn & ẩn)',
goTo: 'Đi tới',
startNode: 'Nút Bắt đầu',
openWorkflow: 'Mở quy trình làm việc',
},
nodes: {
common: {

View File

@ -383,6 +383,7 @@ const translation = {
userInputField: '用户输入字段',
changeBlock: '更改节点',
helpLink: '查看帮助文档',
openWorkflow: '打开工作流',
about: '关于',
createdBy: '作者',
nextStep: '下一步',

View File

@ -379,6 +379,7 @@ const translation = {
optional_and_hidden: '(可選且隱藏)',
goTo: '前往',
startNode: '起始節點',
openWorkflow: '打開工作流程',
},
nodes: {
common: {