mirror of
https://github.com/langgenius/dify.git
synced 2026-04-28 06:28:05 +08:00
Merge branch 'origin-main' into feat/end-user-oauth
This commit is contained in:
@ -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>
|
||||
|
||||
@ -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}
|
||||
|
||||
@ -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',
|
||||
|
||||
@ -77,6 +77,8 @@ export type Collection = {
|
||||
timeout?: number
|
||||
sse_read_timeout?: number
|
||||
}
|
||||
// Workflow
|
||||
workflow_app_id?: string
|
||||
}
|
||||
|
||||
export type ToolParameter = {
|
||||
|
||||
@ -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 && (
|
||||
<>
|
||||
|
||||
@ -374,6 +374,7 @@ const translation = {
|
||||
optional_and_hidden: '(optional & hidden)',
|
||||
goTo: 'Gehe zu',
|
||||
startNode: 'Startknoten',
|
||||
openWorkflow: 'Workflow öffnen',
|
||||
},
|
||||
nodes: {
|
||||
common: {
|
||||
|
||||
@ -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',
|
||||
|
||||
@ -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: {
|
||||
|
||||
@ -374,6 +374,7 @@ const translation = {
|
||||
optional_and_hidden: '(اختیاری و پنهان)',
|
||||
goTo: 'برو به',
|
||||
startNode: 'گره شروع',
|
||||
openWorkflow: 'باز کردن جریان کاری',
|
||||
},
|
||||
nodes: {
|
||||
common: {
|
||||
|
||||
@ -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: {
|
||||
|
||||
@ -386,6 +386,7 @@ const translation = {
|
||||
optional_and_hidden: '(वैकल्पिक और छिपा हुआ)',
|
||||
goTo: 'जाओ',
|
||||
startNode: 'प्रारंभ नोड',
|
||||
openWorkflow: 'वर्कफ़्लो खोलें',
|
||||
},
|
||||
nodes: {
|
||||
common: {
|
||||
|
||||
@ -381,6 +381,7 @@ const translation = {
|
||||
goTo: 'Pergi ke',
|
||||
startNode: 'Mulai Node',
|
||||
scrollToSelectedNode: 'Gulir ke node yang dipilih',
|
||||
openWorkflow: 'Buka Alur Kerja',
|
||||
},
|
||||
nodes: {
|
||||
common: {
|
||||
|
||||
@ -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: {
|
||||
|
||||
@ -401,6 +401,7 @@ const translation = {
|
||||
minimize: '全画面を終了する',
|
||||
scrollToSelectedNode: '選択したノードまでスクロール',
|
||||
optional_and_hidden: '(オプションおよび非表示)',
|
||||
openWorkflow: 'ワークフローを開く',
|
||||
},
|
||||
nodes: {
|
||||
common: {
|
||||
|
||||
@ -395,6 +395,7 @@ const translation = {
|
||||
optional_and_hidden: '(선택 사항 및 숨김)',
|
||||
goTo: '로 이동',
|
||||
startNode: '시작 노드',
|
||||
openWorkflow: '워크플로 열기',
|
||||
},
|
||||
nodes: {
|
||||
common: {
|
||||
|
||||
@ -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: {
|
||||
|
||||
@ -374,6 +374,7 @@ const translation = {
|
||||
optional_and_hidden: '(opcional & oculto)',
|
||||
goTo: 'Ir para',
|
||||
startNode: 'Iniciar Nó',
|
||||
openWorkflow: 'Abrir fluxo de trabalho',
|
||||
},
|
||||
nodes: {
|
||||
common: {
|
||||
|
||||
@ -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: {
|
||||
|
||||
@ -374,6 +374,7 @@ const translation = {
|
||||
optional_and_hidden: '(необязательно и скрыто)',
|
||||
goTo: 'Перейти к',
|
||||
startNode: 'Начальный узел',
|
||||
openWorkflow: 'Открыть рабочий процесс',
|
||||
},
|
||||
nodes: {
|
||||
common: {
|
||||
|
||||
@ -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: {
|
||||
|
||||
@ -374,6 +374,7 @@ const translation = {
|
||||
optional_and_hidden: '(ตัวเลือก & ซ่อน)',
|
||||
goTo: 'ไปที่',
|
||||
startNode: 'เริ่มต้นโหนด',
|
||||
openWorkflow: 'เปิดเวิร์กโฟลว์',
|
||||
},
|
||||
nodes: {
|
||||
common: {
|
||||
|
||||
@ -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: {
|
||||
|
||||
@ -374,6 +374,7 @@ const translation = {
|
||||
optional_and_hidden: '(необов\'язково & приховано)',
|
||||
goTo: 'Перейти до',
|
||||
startNode: 'Початковий вузол',
|
||||
openWorkflow: 'Відкрити робочий процес',
|
||||
},
|
||||
nodes: {
|
||||
common: {
|
||||
|
||||
@ -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: {
|
||||
|
||||
@ -383,6 +383,7 @@ const translation = {
|
||||
userInputField: '用户输入字段',
|
||||
changeBlock: '更改节点',
|
||||
helpLink: '查看帮助文档',
|
||||
openWorkflow: '打开工作流',
|
||||
about: '关于',
|
||||
createdBy: '作者',
|
||||
nextStep: '下一步',
|
||||
|
||||
@ -379,6 +379,7 @@ const translation = {
|
||||
optional_and_hidden: '(可選且隱藏)',
|
||||
goTo: '前往',
|
||||
startNode: '起始節點',
|
||||
openWorkflow: '打開工作流程',
|
||||
},
|
||||
nodes: {
|
||||
common: {
|
||||
|
||||
Reference in New Issue
Block a user