From 58dec5ea426ea880d6f17fa1b3296de276551cb7 Mon Sep 17 00:00:00 2001 From: Chenlei Hu Date: Sun, 30 Mar 2025 21:48:10 -0400 Subject: [PATCH] Add reroute migration toast (#3286) Co-authored-by: github-actions --- browser_tests/tests/commands.spec.ts | 4 +- .../reroute-inserted-chromium-linux.png | Bin 26369 -> 25790 bytes .../toast/RerouteMigrationToast.vue | 46 ++++++++++++++++++ src/locales/en/main.json | 6 ++- src/locales/es/main.json | 2 + src/locales/fr/main.json | 2 + src/locales/ja/main.json | 2 + src/locales/ko/main.json | 2 + src/locales/ru/main.json | 2 + src/locales/zh/main.json | 2 + src/scripts/app.ts | 21 +++++--- src/scripts/changeTracker.ts | 3 +- src/services/workflowService.ts | 14 ++---- src/utils/migration/migrateReroute.ts | 4 +- src/views/GraphView.vue | 2 + 15 files changed, 90 insertions(+), 22 deletions(-) create mode 100644 src/components/toast/RerouteMigrationToast.vue diff --git a/browser_tests/tests/commands.spec.ts b/browser_tests/tests/commands.spec.ts index 472935fcb..4225ad228 100644 --- a/browser_tests/tests/commands.spec.ts +++ b/browser_tests/tests/commands.spec.ts @@ -32,7 +32,7 @@ test.describe('Keybindings', () => { }) await comfyPage.executeCommand('TestCommand') - await expect(comfyPage.page.locator('.p-toast')).toBeVisible() + expect(await comfyPage.getToastErrorCount()).toBe(1) }) test('Should handle async command errors', async ({ comfyPage }) => { @@ -45,6 +45,6 @@ test.describe('Keybindings', () => { }) await comfyPage.executeCommand('TestCommand') - await expect(comfyPage.page.locator('.p-toast')).toBeVisible() + expect(await comfyPage.getToastErrorCount()).toBe(1) }) }) diff --git a/browser_tests/tests/rerouteNode.spec.ts-snapshots/reroute-inserted-chromium-linux.png b/browser_tests/tests/rerouteNode.spec.ts-snapshots/reroute-inserted-chromium-linux.png index ae40b415017b8ca4b25e778450d662418c0a1cf0..b5c8dde4445ca8586c4971698eb4f1535bfa1ac4 100644 GIT binary patch literal 25790 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 literal 26369 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 diff --git a/src/components/toast/RerouteMigrationToast.vue b/src/components/toast/RerouteMigrationToast.vue new file mode 100644 index 000000000..cee726321 --- /dev/null +++ b/src/components/toast/RerouteMigrationToast.vue @@ -0,0 +1,46 @@ + + + diff --git a/src/locales/en/main.json b/src/locales/en/main.json index f140d1c48..1abb49889 100644 --- a/src/locales/en/main.json +++ b/src/locales/en/main.json @@ -104,7 +104,8 @@ "interrupted": "Interrupted", "enabling": "Enabling", "disabling": "Disabling", - "updating": "Updating" + "updating": "Updating", + "migrate": "Migrate" }, "manager": { "title": "Custom Nodes Manager", @@ -1024,6 +1025,7 @@ "errorSaveSetting": "Error saving setting {id}: {err}", "errorCopyImage": "Error copying image: {error}", "noTemplatesToExport": "No templates to export", - "failedToFetchLogs": "Failed to fetch server logs" + "failedToFetchLogs": "Failed to fetch server logs", + "migrateToLitegraphReroute": "Reroute nodes will be removed in future versions. Click to migrate to litegraph-native reroute." } } \ No newline at end of file diff --git a/src/locales/es/main.json b/src/locales/es/main.json index 606e0a91c..eddacf571 100644 --- a/src/locales/es/main.json +++ b/src/locales/es/main.json @@ -181,6 +181,7 @@ "loadWorkflow": "Cargar flujo de trabajo", "loading": "Cargando", "logs": "Registros", + "migrate": "Migrar", "missing": "Faltante", "name": "Nombre", "newFolder": "Nueva carpeta", @@ -1000,6 +1001,7 @@ "fileLoadError": "No se puede encontrar el flujo de trabajo en {fileName}", "fileUploadFailed": "Error al subir el archivo", "interrupted": "La ejecución ha sido interrumpida", + "migrateToLitegraphReroute": "Los nodos de reroute se eliminarán en futuras versiones. Haz clic para migrar a reroute nativo de litegraph.", "no3dScene": "No hay escena 3D para aplicar textura", "no3dSceneToExport": "No hay escena 3D para exportar", "noTemplatesToExport": "No hay plantillas para exportar", diff --git a/src/locales/fr/main.json b/src/locales/fr/main.json index a13cec545..b1dab0ff8 100644 --- a/src/locales/fr/main.json +++ b/src/locales/fr/main.json @@ -181,6 +181,7 @@ "loadWorkflow": "Charger le flux de travail", "loading": "Chargement", "logs": "Journaux", + "migrate": "Migrer", "missing": "Manquant", "name": "Nom", "newFolder": "Nouveau dossier", @@ -1000,6 +1001,7 @@ "fileLoadError": "Impossible de trouver le flux de travail dans {fileName}", "fileUploadFailed": "Échec du téléchargement du fichier", "interrupted": "L'exécution a été interrompue", + "migrateToLitegraphReroute": "Les nœuds de reroute seront supprimés dans les futures versions. Cliquez pour migrer vers le reroute natif de litegraph.", "no3dScene": "Aucune scène 3D pour appliquer la texture", "no3dSceneToExport": "Aucune scène 3D à exporter", "noTemplatesToExport": "Aucun modèle à exporter", diff --git a/src/locales/ja/main.json b/src/locales/ja/main.json index 0fe8d149f..582b0c43a 100644 --- a/src/locales/ja/main.json +++ b/src/locales/ja/main.json @@ -181,6 +181,7 @@ "loadWorkflow": "ワークフローを読み込む", "loading": "読み込み中", "logs": "ログ", + "migrate": "移行する", "missing": "不足している", "name": "名前", "newFolder": "新しいフォルダー", @@ -1000,6 +1001,7 @@ "fileLoadError": "{fileName}でワークフローが見つかりません", "fileUploadFailed": "ファイルのアップロードに失敗しました", "interrupted": "実行が中断されました", + "migrateToLitegraphReroute": "将来のバージョンではRerouteノードが削除されます。litegraph-native rerouteに移行するにはクリックしてください。", "no3dScene": "テクスチャを適用する3Dシーンがありません", "no3dSceneToExport": "エクスポートする3Dシーンがありません", "noTemplatesToExport": "エクスポートするテンプレートがありません", diff --git a/src/locales/ko/main.json b/src/locales/ko/main.json index c6c1fc5b7..23831167e 100644 --- a/src/locales/ko/main.json +++ b/src/locales/ko/main.json @@ -181,6 +181,7 @@ "loadWorkflow": "워크플로 로드", "loading": "로딩 중", "logs": "로그", + "migrate": "마이그레이트", "missing": "누락됨", "name": "이름", "newFolder": "새 폴더", @@ -1000,6 +1001,7 @@ "fileLoadError": "{fileName}에서 워크플로우를 찾을 수 없습니다", "fileUploadFailed": "파일 업로드에 실패했습니다", "interrupted": "실행이 중단되었습니다", + "migrateToLitegraphReroute": "미래 버전에서는 Reroute 노드가 제거됩니다. litegraph-native reroute로 마이그레이트하려면 클릭하세요.", "no3dScene": "텍스처를 적용할 3D 장면이 없습니다", "no3dSceneToExport": "내보낼 3D 장면이 없습니다", "noTemplatesToExport": "내보낼 템플릿이 없습니다", diff --git a/src/locales/ru/main.json b/src/locales/ru/main.json index 8ca2b7ad1..5a06754f7 100644 --- a/src/locales/ru/main.json +++ b/src/locales/ru/main.json @@ -181,6 +181,7 @@ "loadWorkflow": "Загрузить рабочий процесс", "loading": "Загрузка", "logs": "Логи", + "migrate": "Мигрировать", "missing": "Отсутствует", "name": "Имя", "newFolder": "Новая папка", @@ -1000,6 +1001,7 @@ "fileLoadError": "Не удалось найти рабочий процесс в {fileName}", "fileUploadFailed": "Не удалось загрузить файл", "interrupted": "Выполнение было прервано", + "migrateToLitegraphReroute": "Узлы перенаправления будут удалены в будущих версиях. Нажмите, чтобы перейти на litegraph-native reroute.", "no3dScene": "Нет 3D сцены для применения текстуры", "no3dSceneToExport": "Нет 3D сцены для экспорта", "noTemplatesToExport": "Нет шаблонов для экспорта", diff --git a/src/locales/zh/main.json b/src/locales/zh/main.json index aebc7a326..8b7a00bca 100644 --- a/src/locales/zh/main.json +++ b/src/locales/zh/main.json @@ -181,6 +181,7 @@ "loadWorkflow": "加载工作流", "loading": "加载中", "logs": "日志", + "migrate": "迁移", "missing": "缺失", "name": "名称", "newFolder": "新文件夹", @@ -1000,6 +1001,7 @@ "fileLoadError": "无法在 {fileName} 中找到工作流", "fileUploadFailed": "文件上传失败", "interrupted": "执行已被中断", + "migrateToLitegraphReroute": "将来的版本中将删除重定向节点。点击以迁移到litegraph-native重定向。", "no3dScene": "没有3D场景可以应用纹理", "no3dSceneToExport": "没有3D场景可以导出", "noTemplatesToExport": "没有模板可以导出", diff --git a/src/scripts/app.ts b/src/scripts/app.ts index ad560609d..1ccfa3646 100644 --- a/src/scripts/app.ts +++ b/src/scripts/app.ts @@ -47,7 +47,7 @@ import { ExtensionManager } from '@/types/extensionTypes' import { ColorAdjustOptions, adjustColor } from '@/utils/colorUtil' import { graphToPrompt } from '@/utils/executionUtil' import { executeWidgetsCallback, isImageNode } from '@/utils/litegraphUtil' -import { migrateLegacyRerouteNodes } from '@/utils/migration/migrateReroute' +import { findLegacyRerouteNodes } from '@/utils/migration/migrateReroute' import { deserialiseAndCreate } from '@/utils/vintageClipboard' import { type ComfyApi, PromptExecutionError, api } from './api' @@ -945,7 +945,11 @@ export class ComfyApp { clean: boolean = true, restore_view: boolean = true, workflow: string | null | ComfyWorkflow = null, - { showMissingNodesDialog = true, showMissingModelsDialog = true } = {} + { + showMissingNodesDialog = true, + showMissingModelsDialog = true, + checkForRerouteMigration = true + } = {} ) { if (clean !== false) { this.clean() @@ -972,11 +976,16 @@ export class ComfyApp { graphData = validatedGraphData ?? graphData } - // Migrate legacy reroute nodes to the new format - if (graphData.version === 0.4) { - graphData = migrateLegacyRerouteNodes(graphData) + if ( + checkForRerouteMigration && + graphData.version === 0.4 && + findLegacyRerouteNodes(graphData).length + ) { + useToastStore().add({ + group: 'reroute-migration', + severity: 'warn' + }) } - useWorkflowService().beforeLoadNewGraph() const missingNodeTypes: MissingNodeType[] = [] diff --git a/src/scripts/changeTracker.ts b/src/scripts/changeTracker.ts index 24ecf789f..14268cbd6 100644 --- a/src/scripts/changeTracker.ts +++ b/src/scripts/changeTracker.ts @@ -135,7 +135,8 @@ export class ChangeTracker { try { await this.app.loadGraphData(prevState, false, false, this.workflow, { showMissingModelsDialog: false, - showMissingNodesDialog: false + showMissingNodesDialog: false, + checkForRerouteMigration: false }) this.activeState = prevState this.updateModified() diff --git a/src/services/workflowService.ts b/src/services/workflowService.ts index 75812b129..6636b2b93 100644 --- a/src/services/workflowService.ts +++ b/src/services/workflowService.ts @@ -3,10 +3,7 @@ import type { SerialisableGraph, Vector2 } from '@comfyorg/litegraph' import { toRaw } from 'vue' import { t } from '@/i18n' -import { - ComfyWorkflowJSON, - WorkflowJSON04 -} from '@/schemas/comfyWorkflowSchema' +import { ComfyWorkflowJSON } from '@/schemas/comfyWorkflowSchema' import { app } from '@/scripts/app' import { blankGraph, defaultGraph } from '@/scripts/defaultGraph' import { downloadBlob } from '@/scripts/utils' @@ -15,7 +12,6 @@ import { useToastStore } from '@/stores/toastStore' import { ComfyWorkflow, useWorkflowStore } from '@/stores/workflowStore' import { useWorkspaceStore } from '@/stores/workspaceStore' import { appendJsonExt } from '@/utils/formatUtil' -import { migrateLegacyRerouteNodes } from '@/utils/migration/migrateReroute' import { useDialogService } from './dialogService' @@ -167,7 +163,8 @@ export const useWorkflowService = () => { workflow, { showMissingModelsDialog: loadFromRemote, - showMissingNodesDialog: loadFromRemote + showMissingNodesDialog: loadFromRemote, + checkForRerouteMigration: loadFromRemote } ) } @@ -328,10 +325,7 @@ export const useWorkflowService = () => { ) => { const loadedWorkflow = await workflow.load() const data = loadedWorkflow.initialState - const workflowJSON = - data.version === 0.4 - ? migrateLegacyRerouteNodes(data as WorkflowJSON04) - : data + const workflowJSON = data const old = localStorage.getItem('litegrapheditor_clipboard') // unknown conversion: ComfyWorkflowJSON is stricter than LiteGraph's // serialisation schema. diff --git a/src/utils/migration/migrateReroute.ts b/src/utils/migration/migrateReroute.ts index 35fa0aa45..786ef9242 100644 --- a/src/utils/migration/migrateReroute.ts +++ b/src/utils/migration/migrateReroute.ts @@ -20,7 +20,9 @@ type LinkExtension = { /** * Identifies all legacy Reroute nodes in a workflow */ -function findLegacyRerouteNodes(workflow: WorkflowJSON04): RerouteNode[] { +export function findLegacyRerouteNodes( + workflow: WorkflowJSON04 +): RerouteNode[] { return workflow.nodes.filter( (node) => node.type === 'Reroute' ) as RerouteNode[] diff --git a/src/views/GraphView.vue b/src/views/GraphView.vue index fd52e79dd..bbadd9ebd 100644 --- a/src/views/GraphView.vue +++ b/src/views/GraphView.vue @@ -14,6 +14,7 @@ + @@ -31,6 +32,7 @@ import MenuHamburger from '@/components/MenuHamburger.vue' import UnloadWindowConfirmDialog from '@/components/dialog/UnloadWindowConfirmDialog.vue' import GraphCanvas from '@/components/graph/GraphCanvas.vue' import GlobalToast from '@/components/toast/GlobalToast.vue' +import RerouteMigrationToast from '@/components/toast/RerouteMigrationToast.vue' import TopMenubar from '@/components/topbar/TopMenubar.vue' import { useCoreCommands } from '@/composables/useCoreCommands' import { useErrorHandling } from '@/composables/useErrorHandling'