Fix duplication of persisted workflow (#2124)

Co-authored-by: github-actions <github-actions@github.com>
This commit is contained in:
Chenlei Hu
2025-01-02 12:16:39 -05:00
committed by GitHub
parent bb988edf9f
commit 9c1eacf0af
15 changed files with 70 additions and 2 deletions

View File

@@ -396,6 +396,36 @@ test.describe('Menu', () => {
)
})
test('Can duplicate workflow', async ({ comfyPage }) => {
const tab = comfyPage.menu.workflowsTab
await comfyPage.menu.topbar.saveWorkflow('workflow1.json')
expect(await tab.getTopLevelSavedWorkflowNames()).toEqual(
expect.arrayContaining(['workflow1.json'])
)
await comfyPage.executeCommand('Comfy.DuplicateWorkflow')
expect(await tab.getOpenedWorkflowNames()).toEqual([
'workflow1.json',
'*workflow1 (Copy).json'
])
await comfyPage.executeCommand('Comfy.DuplicateWorkflow')
expect(await tab.getOpenedWorkflowNames()).toEqual([
'workflow1.json',
'*workflow1 (Copy).json',
'*workflow1 (Copy) (2).json'
])
await comfyPage.executeCommand('Comfy.DuplicateWorkflow')
expect(await tab.getOpenedWorkflowNames()).toEqual([
'workflow1.json',
'*workflow1 (Copy).json',
'*workflow1 (Copy) (2).json',
'*workflow1 (Copy) (3).json'
])
})
test('Can rename nested workflow from opened workflow item', async ({
comfyPage
}) => {

View File

@@ -21,8 +21,9 @@ import { useWorkspaceStore } from '@/stores/workspaceStore'
export function useCoreCommands(): ComfyCommand[] {
const workflowService = useWorkflowService()
const workflowStore = useWorkflowStore()
const dialogService = useDialogService()
const getTracker = () => useWorkflowStore()?.activeWorkflow?.changeTracker
const getTracker = () => workflowStore.activeWorkflow?.changeTracker
const getSelectedNodes = (): LGraphNode[] => {
const selectedNodes = app.canvas.selected_nodes
@@ -512,6 +513,15 @@ export function useCoreCommands(): ComfyCommand[] {
function: () => {
dialogService.showSettingsDialog('about')
}
},
{
id: 'Comfy.DuplicateWorkflow',
icon: 'pi pi-clone',
label: 'Duplicate Current Workflow',
versionAdded: '1.6.15',
function: () => {
workflowService.duplicateWorkflow(workflowStore.activeWorkflow!)
}
}
]
}

View File

@@ -74,6 +74,9 @@
"Comfy_ClearWorkflow": {
"label": "Clear Workflow"
},
"Comfy_DuplicateWorkflow": {
"label": "Duplicate Current Workflow"
},
"Comfy_ExportWorkflow": {
"label": "Export Workflow"
},

View File

@@ -348,6 +348,7 @@
"Zoom Out": "Zoom Out",
"Clear Pending Tasks": "Clear Pending Tasks",
"Clear Workflow": "Clear Workflow",
"Duplicate Current Workflow": "Duplicate Current Workflow",
"Export": "Export",
"Export (API)": "Export (API)",
"Fit Group To Contents": "Fit Group To Contents",

View File

@@ -74,6 +74,9 @@
"Comfy_ClearWorkflow": {
"label": "Effacer le flux de travail"
},
"Comfy_DuplicateWorkflow": {
"label": "Dupliquer le flux de travail actuel"
},
"Comfy_ExportWorkflow": {
"label": "Exporter le flux de travail"
},

View File

@@ -263,6 +263,7 @@
"ComfyUI Issues": "Problèmes de ComfyUI",
"Convert selected nodes to group node": "Convertir les nœuds sélectionnés en nœud de groupe",
"Desktop User Guide": "Guide de l'utilisateur de bureau",
"Duplicate Current Workflow": "Dupliquer le flux de travail actuel",
"Edit": "Éditer",
"Export": "Exporter",
"Export (API)": "Exporter (API)",

View File

@@ -74,6 +74,9 @@
"Comfy_ClearWorkflow": {
"label": "ワークフローをクリア"
},
"Comfy_DuplicateWorkflow": {
"label": "現在のワークフローを複製"
},
"Comfy_ExportWorkflow": {
"label": "ワークフローをエクスポート"
},

View File

@@ -263,6 +263,7 @@
"ComfyUI Issues": "ComfyUIの問題",
"Convert selected nodes to group node": "選択したノードをグループノードに変換",
"Desktop User Guide": "デスクトップユーザーガイド",
"Duplicate Current Workflow": "現在のワークフローを複製",
"Edit": "編集",
"Export": "エクスポート",
"Export (API)": "エクスポート (API)",

View File

@@ -74,6 +74,9 @@
"Comfy_ClearWorkflow": {
"label": "워크플로 지우기"
},
"Comfy_DuplicateWorkflow": {
"label": "현재 워크플로우 복제"
},
"Comfy_ExportWorkflow": {
"label": "워크플로 내보내기"
},

View File

@@ -263,6 +263,7 @@
"ComfyUI Issues": "ComfyUI 이슈 페이지",
"Convert selected nodes to group node": "선택한 노드를 그룹 노드로 변환",
"Desktop User Guide": "데스크톱 사용자 가이드",
"Duplicate Current Workflow": "현재 워크플로우 복제",
"Edit": "편집",
"Export": "내보내기",
"Export (API)": "내보내기 (API)",

View File

@@ -74,6 +74,9 @@
"Comfy_ClearWorkflow": {
"label": "Очистить рабочий процесс"
},
"Comfy_DuplicateWorkflow": {
"label": "Дублировать текущий рабочий процесс"
},
"Comfy_ExportWorkflow": {
"label": "Экспорт рабочего процесса"
},

View File

@@ -263,6 +263,7 @@
"ComfyUI Issues": "Проблемы ComfyUI",
"Convert selected nodes to group node": "Преобразовать выбранные узлы в групповой узел",
"Desktop User Guide": "Руководство пользователя для настольных ПК",
"Duplicate Current Workflow": "Дублировать текущий рабочий процесс",
"Edit": "Редактировать",
"Export": "Экспортировать",
"Export (API)": "Экспорт (API)",

View File

@@ -74,6 +74,9 @@
"Comfy_ClearWorkflow": {
"label": "清除工作流"
},
"Comfy_DuplicateWorkflow": {
"label": "复制当前工作流"
},
"Comfy_ExportWorkflow": {
"label": "导出工作流"
},

View File

@@ -263,6 +263,7 @@
"ComfyUI Issues": "ComfyUI 问题",
"Convert selected nodes to group node": "将选中节点转换为组节点",
"Desktop User Guide": "桌面端用户指南",
"Duplicate Current Workflow": "复制当前工作流",
"Edit": "编辑",
"Export": "导出",
"Export (API)": "导出 (API)",

View File

@@ -357,7 +357,11 @@ export const useWorkflowService = () => {
*/
const duplicateWorkflow = async (workflow: ComfyWorkflow) => {
const state = JSON.parse(JSON.stringify(workflow.activeState))
await app.loadGraphData(state, true, true, workflow.filename)
const suffix = workflow.isPersisted ? ' (Copy)' : ''
// Remove the suffix `(2)` or similar
const filename = workflow.filename.replace(/\s*\(\d+\)$/, '') + suffix
await app.loadGraphData(state, true, true, filename)
}
return {