From 9c1eacf0afa359eeb6ab03dd7fbfc10e9fe46f3c Mon Sep 17 00:00:00 2001 From: Chenlei Hu Date: Thu, 2 Jan 2025 12:16:39 -0500 Subject: [PATCH] Fix duplication of persisted workflow (#2124) Co-authored-by: github-actions --- browser_tests/menu.spec.ts | 30 ++++++++++++++++++++++++++++++ src/hooks/coreCommandHooks.ts | 12 +++++++++++- src/locales/en/commands.json | 3 +++ src/locales/en/main.json | 1 + src/locales/fr/commands.json | 3 +++ src/locales/fr/main.json | 1 + src/locales/ja/commands.json | 3 +++ src/locales/ja/main.json | 1 + src/locales/ko/commands.json | 3 +++ src/locales/ko/main.json | 1 + src/locales/ru/commands.json | 3 +++ src/locales/ru/main.json | 1 + src/locales/zh/commands.json | 3 +++ src/locales/zh/main.json | 1 + src/services/workflowService.ts | 6 +++++- 15 files changed, 70 insertions(+), 2 deletions(-) diff --git a/browser_tests/menu.spec.ts b/browser_tests/menu.spec.ts index ee566efba..5365086c6 100644 --- a/browser_tests/menu.spec.ts +++ b/browser_tests/menu.spec.ts @@ -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 }) => { diff --git a/src/hooks/coreCommandHooks.ts b/src/hooks/coreCommandHooks.ts index 668421dde..1db6a2b1e 100644 --- a/src/hooks/coreCommandHooks.ts +++ b/src/hooks/coreCommandHooks.ts @@ -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!) + } } ] } diff --git a/src/locales/en/commands.json b/src/locales/en/commands.json index 704c60d09..d9a516b99 100644 --- a/src/locales/en/commands.json +++ b/src/locales/en/commands.json @@ -74,6 +74,9 @@ "Comfy_ClearWorkflow": { "label": "Clear Workflow" }, + "Comfy_DuplicateWorkflow": { + "label": "Duplicate Current Workflow" + }, "Comfy_ExportWorkflow": { "label": "Export Workflow" }, diff --git a/src/locales/en/main.json b/src/locales/en/main.json index 64a8fbdbb..55cb92ffc 100644 --- a/src/locales/en/main.json +++ b/src/locales/en/main.json @@ -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", diff --git a/src/locales/fr/commands.json b/src/locales/fr/commands.json index b47f55bcb..8619bfa8f 100644 --- a/src/locales/fr/commands.json +++ b/src/locales/fr/commands.json @@ -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" }, diff --git a/src/locales/fr/main.json b/src/locales/fr/main.json index 5ef0e8808..cb18d537e 100644 --- a/src/locales/fr/main.json +++ b/src/locales/fr/main.json @@ -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)", diff --git a/src/locales/ja/commands.json b/src/locales/ja/commands.json index 052802319..9361b7e60 100644 --- a/src/locales/ja/commands.json +++ b/src/locales/ja/commands.json @@ -74,6 +74,9 @@ "Comfy_ClearWorkflow": { "label": "ワークフローをクリア" }, + "Comfy_DuplicateWorkflow": { + "label": "現在のワークフローを複製" + }, "Comfy_ExportWorkflow": { "label": "ワークフローをエクスポート" }, diff --git a/src/locales/ja/main.json b/src/locales/ja/main.json index 848d6e6c8..eda6a6de6 100644 --- a/src/locales/ja/main.json +++ b/src/locales/ja/main.json @@ -263,6 +263,7 @@ "ComfyUI Issues": "ComfyUIの問題", "Convert selected nodes to group node": "選択したノードをグループノードに変換", "Desktop User Guide": "デスクトップユーザーガイド", + "Duplicate Current Workflow": "現在のワークフローを複製", "Edit": "編集", "Export": "エクスポート", "Export (API)": "エクスポート (API)", diff --git a/src/locales/ko/commands.json b/src/locales/ko/commands.json index 674167167..269d37fcb 100644 --- a/src/locales/ko/commands.json +++ b/src/locales/ko/commands.json @@ -74,6 +74,9 @@ "Comfy_ClearWorkflow": { "label": "워크플로 지우기" }, + "Comfy_DuplicateWorkflow": { + "label": "현재 워크플로우 복제" + }, "Comfy_ExportWorkflow": { "label": "워크플로 내보내기" }, diff --git a/src/locales/ko/main.json b/src/locales/ko/main.json index ecb554d19..b8213f9d4 100644 --- a/src/locales/ko/main.json +++ b/src/locales/ko/main.json @@ -263,6 +263,7 @@ "ComfyUI Issues": "ComfyUI 이슈 페이지", "Convert selected nodes to group node": "선택한 노드를 그룹 노드로 변환", "Desktop User Guide": "데스크톱 사용자 가이드", + "Duplicate Current Workflow": "현재 워크플로우 복제", "Edit": "편집", "Export": "내보내기", "Export (API)": "내보내기 (API)", diff --git a/src/locales/ru/commands.json b/src/locales/ru/commands.json index d0c50bf17..6de7948dd 100644 --- a/src/locales/ru/commands.json +++ b/src/locales/ru/commands.json @@ -74,6 +74,9 @@ "Comfy_ClearWorkflow": { "label": "Очистить рабочий процесс" }, + "Comfy_DuplicateWorkflow": { + "label": "Дублировать текущий рабочий процесс" + }, "Comfy_ExportWorkflow": { "label": "Экспорт рабочего процесса" }, diff --git a/src/locales/ru/main.json b/src/locales/ru/main.json index 44c7b9228..191022ca8 100644 --- a/src/locales/ru/main.json +++ b/src/locales/ru/main.json @@ -263,6 +263,7 @@ "ComfyUI Issues": "Проблемы ComfyUI", "Convert selected nodes to group node": "Преобразовать выбранные узлы в групповой узел", "Desktop User Guide": "Руководство пользователя для настольных ПК", + "Duplicate Current Workflow": "Дублировать текущий рабочий процесс", "Edit": "Редактировать", "Export": "Экспортировать", "Export (API)": "Экспорт (API)", diff --git a/src/locales/zh/commands.json b/src/locales/zh/commands.json index ff5aa4b73..1f39893a3 100644 --- a/src/locales/zh/commands.json +++ b/src/locales/zh/commands.json @@ -74,6 +74,9 @@ "Comfy_ClearWorkflow": { "label": "清除工作流" }, + "Comfy_DuplicateWorkflow": { + "label": "复制当前工作流" + }, "Comfy_ExportWorkflow": { "label": "导出工作流" }, diff --git a/src/locales/zh/main.json b/src/locales/zh/main.json index 5d8dd287d..a27e5673b 100644 --- a/src/locales/zh/main.json +++ b/src/locales/zh/main.json @@ -263,6 +263,7 @@ "ComfyUI Issues": "ComfyUI 问题", "Convert selected nodes to group node": "将选中节点转换为组节点", "Desktop User Guide": "桌面端用户指南", + "Duplicate Current Workflow": "复制当前工作流", "Edit": "编辑", "Export": "导出", "Export (API)": "导出 (API)", diff --git a/src/services/workflowService.ts b/src/services/workflowService.ts index 5f373e07a..bbdabd318 100644 --- a/src/services/workflowService.ts +++ b/src/services/workflowService.ts @@ -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 {