mirror of
https://github.com/langgenius/dify.git
synced 2025-11-12 09:25:17 +00:00
pipeline header
This commit is contained in:
parent
0099f2296d
commit
13ce6317f1
@ -21,7 +21,7 @@ const WorkflowHeader = () => {
|
|||||||
setCurrentLogItem: state.setCurrentLogItem,
|
setCurrentLogItem: state.setCurrentLogItem,
|
||||||
setShowMessageLogModal: state.setShowMessageLogModal,
|
setShowMessageLogModal: state.setShowMessageLogModal,
|
||||||
})))
|
})))
|
||||||
const resetWorkflowVersionHistory = useResetWorkflowVersionHistory(appDetail!.id)
|
const resetWorkflowVersionHistory = useResetWorkflowVersionHistory()
|
||||||
const isChatMode = useIsChatMode()
|
const isChatMode = useIsChatMode()
|
||||||
|
|
||||||
const handleClearLogAndMessageModal = useCallback(() => {
|
const handleClearLogAndMessageModal = useCallback(() => {
|
||||||
|
|||||||
@ -13,7 +13,6 @@ import WorkflowPreview from '@/app/components/workflow/panel/workflow-preview'
|
|||||||
import ChatRecord from '@/app/components/workflow/panel/chat-record'
|
import ChatRecord from '@/app/components/workflow/panel/chat-record'
|
||||||
import ChatVariablePanel from '@/app/components/workflow/panel/chat-variable-panel'
|
import ChatVariablePanel from '@/app/components/workflow/panel/chat-variable-panel'
|
||||||
import GlobalVariablePanel from '@/app/components/workflow/panel/global-variable-panel'
|
import GlobalVariablePanel from '@/app/components/workflow/panel/global-variable-panel'
|
||||||
import VersionHistoryPanel from '@/app/components/workflow/panel/version-history-panel'
|
|
||||||
import { useStore as useAppStore } from '@/app/components/app/store'
|
import { useStore as useAppStore } from '@/app/components/app/store'
|
||||||
import MessageLogModal from '@/app/components/base/message-log-modal'
|
import MessageLogModal from '@/app/components/base/message-log-modal'
|
||||||
import type { PanelProps } from '@/app/components/workflow/panel'
|
import type { PanelProps } from '@/app/components/workflow/panel'
|
||||||
@ -52,7 +51,6 @@ const WorkflowPanelOnRight = () => {
|
|||||||
const showDebugAndPreviewPanel = useStore(s => s.showDebugAndPreviewPanel)
|
const showDebugAndPreviewPanel = useStore(s => s.showDebugAndPreviewPanel)
|
||||||
const showChatVariablePanel = useStore(s => s.showChatVariablePanel)
|
const showChatVariablePanel = useStore(s => s.showChatVariablePanel)
|
||||||
const showGlobalVariablePanel = useStore(s => s.showGlobalVariablePanel)
|
const showGlobalVariablePanel = useStore(s => s.showGlobalVariablePanel)
|
||||||
const showWorkflowVersionHistoryPanel = useStore(s => s.showWorkflowVersionHistoryPanel)
|
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<>
|
<>
|
||||||
@ -86,23 +84,30 @@ const WorkflowPanelOnRight = () => {
|
|||||||
<GlobalVariablePanel />
|
<GlobalVariablePanel />
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
{
|
|
||||||
showWorkflowVersionHistoryPanel && (
|
|
||||||
<VersionHistoryPanel/>
|
|
||||||
)
|
|
||||||
}
|
|
||||||
</>
|
</>
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
const WorkflowPanel = () => {
|
const WorkflowPanel = () => {
|
||||||
|
const appDetail = useAppStore(s => s.appDetail)
|
||||||
|
const versionHistoryPanelProps = useMemo(() => {
|
||||||
|
const appId = appDetail?.id
|
||||||
|
return {
|
||||||
|
getVersionListUrl: `/apps/${appId}/workflows`,
|
||||||
|
deleteVersionUrl: (versionId: string) => `/apps/${appId}/workflows/${versionId}`,
|
||||||
|
updateVersionUrl: (versionId: string) => `/apps/${appId}/workflows/${versionId}`,
|
||||||
|
latestVersionId: appDetail?.workflow?.id,
|
||||||
|
}
|
||||||
|
}, [appDetail?.id, appDetail?.workflow?.id])
|
||||||
|
|
||||||
const panelProps: PanelProps = useMemo(() => {
|
const panelProps: PanelProps = useMemo(() => {
|
||||||
return {
|
return {
|
||||||
components: {
|
components: {
|
||||||
left: <WorkflowPanelOnLeft />,
|
left: <WorkflowPanelOnLeft />,
|
||||||
right: <WorkflowPanelOnRight />,
|
right: <WorkflowPanelOnRight />,
|
||||||
},
|
},
|
||||||
|
versionHistoryPanelProps,
|
||||||
}
|
}
|
||||||
}, [])
|
}, [versionHistoryPanelProps])
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<Panel {...panelProps} />
|
<Panel {...panelProps} />
|
||||||
|
|||||||
@ -1,6 +1,8 @@
|
|||||||
import type { FC } from 'react'
|
import type { FC } from 'react'
|
||||||
import { memo } from 'react'
|
import { memo } from 'react'
|
||||||
import { useNodes } from 'reactflow'
|
import { useNodes } from 'reactflow'
|
||||||
|
import type { VersionHistoryPanelProps } from '@/app/components/workflow/panel/version-history-panel'
|
||||||
|
import VersionHistoryPanel from '@/app/components/workflow/panel/version-history-panel'
|
||||||
import type { CommonNodeType } from '../types'
|
import type { CommonNodeType } from '../types'
|
||||||
import { Panel as NodePanel } from '../nodes'
|
import { Panel as NodePanel } from '../nodes'
|
||||||
import { useStore } from '../store'
|
import { useStore } from '../store'
|
||||||
@ -12,14 +14,17 @@ export type PanelProps = {
|
|||||||
left?: React.ReactNode
|
left?: React.ReactNode
|
||||||
right?: React.ReactNode
|
right?: React.ReactNode
|
||||||
}
|
}
|
||||||
|
versionHistoryPanelProps?: VersionHistoryPanelProps
|
||||||
}
|
}
|
||||||
const Panel: FC<PanelProps> = ({
|
const Panel: FC<PanelProps> = ({
|
||||||
components,
|
components,
|
||||||
|
versionHistoryPanelProps,
|
||||||
}) => {
|
}) => {
|
||||||
const nodes = useNodes<CommonNodeType>()
|
const nodes = useNodes<CommonNodeType>()
|
||||||
const selectedNode = nodes.find(node => node.data.selected)
|
const selectedNode = nodes.find(node => node.data.selected)
|
||||||
const showEnvPanel = useStore(s => s.showEnvPanel)
|
const showEnvPanel = useStore(s => s.showEnvPanel)
|
||||||
const isRestoring = useStore(s => s.isRestoring)
|
const isRestoring = useStore(s => s.isRestoring)
|
||||||
|
const showWorkflowVersionHistoryPanel = useStore(s => s.showWorkflowVersionHistoryPanel)
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<div
|
<div
|
||||||
@ -38,6 +43,11 @@ const Panel: FC<PanelProps> = ({
|
|||||||
{
|
{
|
||||||
components?.right
|
components?.right
|
||||||
}
|
}
|
||||||
|
{
|
||||||
|
showWorkflowVersionHistoryPanel && (
|
||||||
|
<VersionHistoryPanel {...versionHistoryPanelProps} />
|
||||||
|
)
|
||||||
|
}
|
||||||
{
|
{
|
||||||
showEnvPanel && (
|
showEnvPanel && (
|
||||||
<EnvPanel />
|
<EnvPanel />
|
||||||
|
|||||||
@ -8,7 +8,6 @@ import { VersionHistoryContextMenuOptions, WorkflowVersionFilterOptions } from '
|
|||||||
import VersionHistoryItem from './version-history-item'
|
import VersionHistoryItem from './version-history-item'
|
||||||
import Filter from './filter'
|
import Filter from './filter'
|
||||||
import type { VersionHistory } from '@/types/workflow'
|
import type { VersionHistory } from '@/types/workflow'
|
||||||
import { useStore as useAppStore } from '@/app/components/app/store'
|
|
||||||
import { useDeleteWorkflow, useResetWorkflowVersionHistory, useUpdateWorkflow, useWorkflowVersionHistory } from '@/service/use-workflow'
|
import { useDeleteWorkflow, useResetWorkflowVersionHistory, useUpdateWorkflow, useWorkflowVersionHistory } from '@/service/use-workflow'
|
||||||
import Divider from '@/app/components/base/divider'
|
import Divider from '@/app/components/base/divider'
|
||||||
import Loading from './loading'
|
import Loading from './loading'
|
||||||
@ -22,7 +21,18 @@ import Toast from '@/app/components/base/toast'
|
|||||||
const HISTORY_PER_PAGE = 10
|
const HISTORY_PER_PAGE = 10
|
||||||
const INITIAL_PAGE = 1
|
const INITIAL_PAGE = 1
|
||||||
|
|
||||||
const VersionHistoryPanel = () => {
|
export type VersionHistoryPanelProps = {
|
||||||
|
getVersionListUrl?: string
|
||||||
|
deleteVersionUrl?: (versionId: string) => string
|
||||||
|
updateVersionUrl?: (versionId: string) => string
|
||||||
|
latestVersionId?: string
|
||||||
|
}
|
||||||
|
export const VersionHistoryPanel = ({
|
||||||
|
getVersionListUrl,
|
||||||
|
deleteVersionUrl,
|
||||||
|
updateVersionUrl,
|
||||||
|
latestVersionId,
|
||||||
|
}: VersionHistoryPanelProps) => {
|
||||||
const [filterValue, setFilterValue] = useState(WorkflowVersionFilterOptions.all)
|
const [filterValue, setFilterValue] = useState(WorkflowVersionFilterOptions.all)
|
||||||
const [isOnlyShowNamedVersions, setIsOnlyShowNamedVersions] = useState(false)
|
const [isOnlyShowNamedVersions, setIsOnlyShowNamedVersions] = useState(false)
|
||||||
const [operatedItem, setOperatedItem] = useState<VersionHistory>()
|
const [operatedItem, setOperatedItem] = useState<VersionHistory>()
|
||||||
@ -32,7 +42,6 @@ const VersionHistoryPanel = () => {
|
|||||||
const workflowStore = useWorkflowStore()
|
const workflowStore = useWorkflowStore()
|
||||||
const { handleSyncWorkflowDraft } = useNodesSyncDraft()
|
const { handleSyncWorkflowDraft } = useNodesSyncDraft()
|
||||||
const { handleRestoreFromPublishedWorkflow, handleLoadBackupDraft } = useWorkflowRun()
|
const { handleRestoreFromPublishedWorkflow, handleLoadBackupDraft } = useWorkflowRun()
|
||||||
const appDetail = useAppStore.getState().appDetail
|
|
||||||
const setShowWorkflowVersionHistoryPanel = useStore(s => s.setShowWorkflowVersionHistoryPanel)
|
const setShowWorkflowVersionHistoryPanel = useStore(s => s.setShowWorkflowVersionHistoryPanel)
|
||||||
const currentVersion = useStore(s => s.currentVersion)
|
const currentVersion = useStore(s => s.currentVersion)
|
||||||
const setCurrentVersion = useStore(s => s.setCurrentVersion)
|
const setCurrentVersion = useStore(s => s.setCurrentVersion)
|
||||||
@ -45,7 +54,7 @@ const VersionHistoryPanel = () => {
|
|||||||
hasNextPage,
|
hasNextPage,
|
||||||
isFetching,
|
isFetching,
|
||||||
} = useWorkflowVersionHistory({
|
} = useWorkflowVersionHistory({
|
||||||
appId: appDetail!.id,
|
url: getVersionListUrl || '',
|
||||||
initialPage: INITIAL_PAGE,
|
initialPage: INITIAL_PAGE,
|
||||||
limit: HISTORY_PER_PAGE,
|
limit: HISTORY_PER_PAGE,
|
||||||
userId: filterValue === WorkflowVersionFilterOptions.onlyYours ? userProfile.id : '',
|
userId: filterValue === WorkflowVersionFilterOptions.onlyYours ? userProfile.id : '',
|
||||||
@ -112,7 +121,7 @@ const VersionHistoryPanel = () => {
|
|||||||
}
|
}
|
||||||
}, [])
|
}, [])
|
||||||
|
|
||||||
const resetWorkflowVersionHistory = useResetWorkflowVersionHistory(appDetail!.id)
|
const resetWorkflowVersionHistory = useResetWorkflowVersionHistory()
|
||||||
|
|
||||||
const handleRestore = useCallback((item: VersionHistory) => {
|
const handleRestore = useCallback((item: VersionHistory) => {
|
||||||
setShowWorkflowVersionHistoryPanel(false)
|
setShowWorkflowVersionHistoryPanel(false)
|
||||||
@ -138,10 +147,10 @@ const VersionHistoryPanel = () => {
|
|||||||
})
|
})
|
||||||
}, [setShowWorkflowVersionHistoryPanel, handleSyncWorkflowDraft, workflowStore, handleRestoreFromPublishedWorkflow, resetWorkflowVersionHistory, t])
|
}, [setShowWorkflowVersionHistoryPanel, handleSyncWorkflowDraft, workflowStore, handleRestoreFromPublishedWorkflow, resetWorkflowVersionHistory, t])
|
||||||
|
|
||||||
const { mutateAsync: deleteWorkflow } = useDeleteWorkflow(appDetail!.id)
|
const { mutateAsync: deleteWorkflow } = useDeleteWorkflow()
|
||||||
|
|
||||||
const handleDelete = useCallback(async (id: string) => {
|
const handleDelete = useCallback(async (id: string) => {
|
||||||
await deleteWorkflow(id, {
|
await deleteWorkflow(deleteVersionUrl?.(id) || '', {
|
||||||
onSuccess: () => {
|
onSuccess: () => {
|
||||||
setDeleteConfirmOpen(false)
|
setDeleteConfirmOpen(false)
|
||||||
Toast.notify({
|
Toast.notify({
|
||||||
@ -160,14 +169,14 @@ const VersionHistoryPanel = () => {
|
|||||||
setDeleteConfirmOpen(false)
|
setDeleteConfirmOpen(false)
|
||||||
},
|
},
|
||||||
})
|
})
|
||||||
}, [t, deleteWorkflow, resetWorkflowVersionHistory])
|
}, [t, deleteWorkflow, resetWorkflowVersionHistory, deleteVersionUrl])
|
||||||
|
|
||||||
const { mutateAsync: updateWorkflow } = useUpdateWorkflow(appDetail!.id)
|
const { mutateAsync: updateWorkflow } = useUpdateWorkflow()
|
||||||
|
|
||||||
const handleUpdateWorkflow = useCallback(async (params: { id?: string, title: string, releaseNotes: string }) => {
|
const handleUpdateWorkflow = useCallback(async (params: { id?: string, title: string, releaseNotes: string }) => {
|
||||||
const { id, ...rest } = params
|
const { id, ...rest } = params
|
||||||
await updateWorkflow({
|
await updateWorkflow({
|
||||||
workflowId: id!,
|
url: updateVersionUrl?.(id || '') || '',
|
||||||
...rest,
|
...rest,
|
||||||
}, {
|
}, {
|
||||||
onSuccess: () => {
|
onSuccess: () => {
|
||||||
@ -188,7 +197,7 @@ const VersionHistoryPanel = () => {
|
|||||||
setEditModalOpen(false)
|
setEditModalOpen(false)
|
||||||
},
|
},
|
||||||
})
|
})
|
||||||
}, [t, updateWorkflow, resetWorkflowVersionHistory])
|
}, [t, updateWorkflow, resetWorkflowVersionHistory, updateVersionUrl])
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<div className='flex w-[268px] flex-col rounded-l-2xl border-y-[0.5px] border-l-[0.5px] border-components-panel-border bg-components-panel-bg shadow-xl shadow-shadow-shadow-5'>
|
<div className='flex w-[268px] flex-col rounded-l-2xl border-y-[0.5px] border-l-[0.5px] border-components-panel-border bg-components-panel-bg shadow-xl shadow-shadow-shadow-5'>
|
||||||
@ -222,7 +231,7 @@ const VersionHistoryPanel = () => {
|
|||||||
key={item.id}
|
key={item.id}
|
||||||
item={item}
|
item={item}
|
||||||
currentVersion={currentVersion}
|
currentVersion={currentVersion}
|
||||||
latestVersionId={appDetail!.workflow!.id}
|
latestVersionId={latestVersionId || ''}
|
||||||
onClick={handleVersionClick}
|
onClick={handleVersionClick}
|
||||||
handleClickMenuItem={handleClickMenuItem.bind(null, item)}
|
handleClickMenuItem={handleClickMenuItem.bind(null, item)}
|
||||||
isLast={isLast}
|
isLast={isLast}
|
||||||
|
|||||||
@ -35,10 +35,11 @@ export const useWorkflowConfig = (appId: string, onSuccess: (v: WorkflowConfigRe
|
|||||||
const WorkflowVersionHistoryKey = [NAME_SPACE, 'versionHistory']
|
const WorkflowVersionHistoryKey = [NAME_SPACE, 'versionHistory']
|
||||||
|
|
||||||
export const useWorkflowVersionHistory = (params: FetchWorkflowDraftPageParams) => {
|
export const useWorkflowVersionHistory = (params: FetchWorkflowDraftPageParams) => {
|
||||||
const { appId, initialPage, limit, userId, namedOnly } = params
|
const { url, initialPage, limit, userId, namedOnly } = params
|
||||||
return useInfiniteQuery({
|
return useInfiniteQuery({
|
||||||
queryKey: [...WorkflowVersionHistoryKey, appId, initialPage, limit, userId, namedOnly],
|
enabled: !!url,
|
||||||
queryFn: ({ pageParam = 1 }) => get<FetchWorkflowDraftPageResponse>(`/apps/${appId}/workflows`, {
|
queryKey: [...WorkflowVersionHistoryKey, url, initialPage, limit, userId, namedOnly],
|
||||||
|
queryFn: ({ pageParam = 1 }) => get<FetchWorkflowDraftPageResponse>(url, {
|
||||||
params: {
|
params: {
|
||||||
page: pageParam,
|
page: pageParam,
|
||||||
limit,
|
limit,
|
||||||
@ -51,14 +52,14 @@ export const useWorkflowVersionHistory = (params: FetchWorkflowDraftPageParams)
|
|||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
export const useResetWorkflowVersionHistory = (appId: string) => {
|
export const useResetWorkflowVersionHistory = () => {
|
||||||
return useReset([...WorkflowVersionHistoryKey, appId])
|
return useReset([...WorkflowVersionHistoryKey])
|
||||||
}
|
}
|
||||||
|
|
||||||
export const useUpdateWorkflow = (appId: string) => {
|
export const useUpdateWorkflow = () => {
|
||||||
return useMutation({
|
return useMutation({
|
||||||
mutationKey: [NAME_SPACE, 'update'],
|
mutationKey: [NAME_SPACE, 'update'],
|
||||||
mutationFn: (params: UpdateWorkflowParams) => patch(`/apps/${appId}/workflows/${params.workflowId}`, {
|
mutationFn: (params: UpdateWorkflowParams) => patch(params.url, {
|
||||||
body: {
|
body: {
|
||||||
marked_name: params.title,
|
marked_name: params.title,
|
||||||
marked_comment: params.releaseNotes,
|
marked_comment: params.releaseNotes,
|
||||||
@ -67,10 +68,10 @@ export const useUpdateWorkflow = (appId: string) => {
|
|||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
export const useDeleteWorkflow = (appId: string) => {
|
export const useDeleteWorkflow = () => {
|
||||||
return useMutation({
|
return useMutation({
|
||||||
mutationKey: [NAME_SPACE, 'delete'],
|
mutationKey: [NAME_SPACE, 'delete'],
|
||||||
mutationFn: (workflowId: string) => del(`/apps/${appId}/workflows/${workflowId}`),
|
mutationFn: (url: string) => del(url),
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -128,7 +128,7 @@ export type FetchWorkflowDraftResponse = {
|
|||||||
export type VersionHistory = FetchWorkflowDraftResponse
|
export type VersionHistory = FetchWorkflowDraftResponse
|
||||||
|
|
||||||
export type FetchWorkflowDraftPageParams = {
|
export type FetchWorkflowDraftPageParams = {
|
||||||
appId: string
|
url: string
|
||||||
initialPage: number
|
initialPage: number
|
||||||
limit: number
|
limit: number
|
||||||
userId?: string
|
userId?: string
|
||||||
@ -348,7 +348,7 @@ export type PublishWorkflowParams = {
|
|||||||
}
|
}
|
||||||
|
|
||||||
export type UpdateWorkflowParams = {
|
export type UpdateWorkflowParams = {
|
||||||
workflowId: string
|
url: string
|
||||||
title: string
|
title: string
|
||||||
releaseNotes: string
|
releaseNotes: string
|
||||||
}
|
}
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user