From a4d979e4c985d46f60af9b2da876a4540dc96743 Mon Sep 17 00:00:00 2001 From: Jin Yi Date: Tue, 18 Nov 2025 09:04:45 +0900 Subject: [PATCH] [feat] Implement media asset workflow actions with shared utilities (#6696) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ## Summary Implements 4 missing media asset workflow features and creates shared utilities to eliminate code duplication. ## Implemented Features ### 1. Copy Job ID ✅ - Properly extracts promptId using `getOutputAssetMetadata` - Uses `useCopyToClipboard` composable ### 2. Add to Current Workflow ✅ - Adds LoadImage/LoadVideo/LoadAudio nodes to canvas - Supports all media file types (JPEG, PNG, MP4, etc.) - Auto-detects appropriate node type using `detectNodeTypeFromFilename` utility ### 3. Open Workflow in New Tab ✅ - Extracts workflow from asset metadata or embedded PNG - Opens workflow in new tab ### 4. Export Workflow ✅ - Exports workflow as JSON file - Supports optional filename prompt ## Code Refactoring ### Created Shared Utilities: 1. **`assetTypeUtil.ts`** - `getAssetType()` function eliminates 6 instances of `asset.tags?.[0] || 'output'` 2. **`assetUrlUtil.ts`** - `getAssetUrl()` function consolidates 3 URL construction patterns 3. **`workflowActionsService.ts`** - Shared service for workflow export/open operations 4. **`workflowExtractionUtil.ts`** - Extract workflows from jobs/assets 5. **`loaderNodeUtil.ts`** - Detect loader node types from filenames ### Improvements to Existing Code: - Refactored to use `formatUtil.getMediaTypeFromFilename()` - Extracted `deleteAssetApi()` helper to reduce deletion logic duplication (~40 lines) - Moved `isResultItemType` type guard to shared `typeGuardUtil.ts` - Added 9 i18n strings for proper localization - Added `@comfyorg/shared-frontend-utils` dependency ## Input Assets Support Improved input assets to support workflow features where applicable: - ✅ All media files (JPEG/PNG/MP4, etc.) → "Add to current workflow" enabled - ✅ PNG/WEBP/FLAC with embedded metadata → "Open/Export workflow" enabled ## Impact - **~150+ lines** of duplicate code eliminated - **5 new utility files** created to improve code reusability - **11 files** changed, **483 insertions**, **234 deletions** ## Testing ✅ TypeScript typecheck passed ✅ ESLint passed ✅ Knip passed 🤖 Generated with [Claude Code](https://claude.com/claude-code) ┆Issue is synchronized with this [Notion page](https://www.notion.so/PR-6696-feat-Implement-media-asset-workflow-actions-with-shared-utilities-2ab6d73d365081fb8ae9d71ce6e38589) by [Unito](https://www.unito.io) --------- Co-authored-by: Claude Co-authored-by: GitHub Action --- package.json | 1 + pnpm-lock.yaml | 3 + src/locales/en/main.json | 14 +- .../assets/components/MediaAssetCard.vue | 1 - .../assets/components/MediaAssetMoreMenu.vue | 51 ++- .../composables/useMediaAssetActions.ts | 369 ++++++++++++------ src/platform/assets/utils/assetTypeUtil.ts | 24 ++ src/platform/assets/utils/assetUrlUtil.ts | 29 ++ .../core/services/workflowActionsService.ts | 123 ++++++ .../workflow/utils/workflowExtractionUtil.ts | 93 +++++ src/utils/loaderNodeUtil.ts | 38 ++ src/utils/typeGuardUtil.ts | 11 + 12 files changed, 633 insertions(+), 124 deletions(-) create mode 100644 src/platform/assets/utils/assetTypeUtil.ts create mode 100644 src/platform/assets/utils/assetUrlUtil.ts create mode 100644 src/platform/workflow/core/services/workflowActionsService.ts create mode 100644 src/platform/workflow/utils/workflowExtractionUtil.ts create mode 100644 src/utils/loaderNodeUtil.ts diff --git a/package.json b/package.json index cdc8aadd9..5b9f4133d 100644 --- a/package.json +++ b/package.json @@ -131,6 +131,7 @@ "@comfyorg/comfyui-electron-types": "0.4.73-0", "@comfyorg/design-system": "workspace:*", "@comfyorg/registry-types": "workspace:*", + "@comfyorg/shared-frontend-utils": "workspace:*", "@comfyorg/tailwind-utils": "workspace:*", "@iconify/json": "catalog:", "@primeuix/forms": "catalog:", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 1fc27afcd..d65a29266 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -326,6 +326,9 @@ importers: '@comfyorg/registry-types': specifier: workspace:* version: link:packages/registry-types + '@comfyorg/shared-frontend-utils': + specifier: workspace:* + version: link:packages/shared-frontend-utils '@comfyorg/tailwind-utils': specifier: workspace:* version: link:packages/tailwind-utils diff --git a/src/locales/en/main.json b/src/locales/en/main.json index b4d1ec73b..c38473a3c 100644 --- a/src/locales/en/main.json +++ b/src/locales/en/main.json @@ -2036,8 +2036,18 @@ "downloadStarted": "Downloading {count} files...", "downloadsStarted": "Started downloading {count} file(s)", "assetsDeletedSuccessfully": "{count} asset(s) deleted successfully", - "failedToDeleteAssets": "Failed to delete selected assets" - } + "failedToDeleteAssets": "Failed to delete selected assets", + "partialDeleteSuccess": "{succeeded} deleted successfully, {failed} failed" + }, + "noJobIdFound": "No job ID found for this asset", + "unsupportedFileType": "Unsupported file type for loader node", + "nodeTypeNotFound": "Node type {nodeType} not found", + "failedToCreateNode": "Failed to create node", + "nodeAddedToWorkflow": "{nodeType} node added to workflow", + "noWorkflowDataFound": "No workflow data found in this asset", + "workflowOpenedInNewTab": "Workflow opened in new tab", + "failedToExportWorkflow": "Failed to export workflow", + "workflowExportedSuccessfully": "Workflow exported successfully" }, "actionbar": { "dockToTop": "Dock to top", diff --git a/src/platform/assets/components/MediaAssetCard.vue b/src/platform/assets/components/MediaAssetCard.vue index fd04336b8..42720f2e4 100644 --- a/src/platform/assets/components/MediaAssetCard.vue +++ b/src/platform/assets/components/MediaAssetCard.vue @@ -37,7 +37,6 @@ :context="{ type: assetType }" @view="handleZoomClick" @download="actions.downloadAsset()" - @play="actions.playAsset(asset.id)" @video-playing-state-changed="isVideoPlaying = $event" @video-controls-changed="showVideoControls = $event" @image-loaded="handleImageLoaded" diff --git a/src/platform/assets/components/MediaAssetMoreMenu.vue b/src/platform/assets/components/MediaAssetMoreMenu.vue index 9f7242603..3c236ed7e 100644 --- a/src/platform/assets/components/MediaAssetMoreMenu.vue +++ b/src/platform/assets/components/MediaAssetMoreMenu.vue @@ -1,5 +1,8 @@