From 070775dfd9e35446ec95da86433f0f28a5e08720 Mon Sep 17 00:00:00 2001 From: Linghong Date: Sat, 8 Aug 2026 16:30:26 +0000 Subject: [PATCH] =?UTF-8?q?=E9=9F=B3=E9=A2=91=E4=BF=A1=E6=81=AF=E9=A1=B5?= =?UTF-8?q?=20Task=20=E5=88=A4=E6=8D=AE=E6=94=B9=E7=94=A8=E8=B5=84?= =?UTF-8?q?=E6=BA=90=E5=8E=9F=E5=A7=8B=E7=B1=BB=E5=9E=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit layer.assetKind 是 assetKindOverride ?? resourceAssetKind,用户在画布上改一次「素材标签」 就能翻转判据:背景音乐被改标成「音效」会换用完整 id,音效被改标成「背景音乐」则退回 formatTaskIdForDisplay 的截断假值——上一版修复被一次改标就废掉。 - 判据换成 resolveLayerResourceAssetKind;它在资源类型缺省时回退到 layer.assetKind, 刚生成、尚未注册资源行的音效层同样命中 - soundEffect 那一支保留为补充判据:它和生成 action 一样长在 generationInputs 上, 元数据整块缺失时会一并消失,不能当主判据 - 补两条回归:背景音乐改标为音效仍截断、音效改标为背景音乐仍显示完整 id Co-Authored-By: Claude Opus 5 --- .../ImageCanvasMetadataModalView.test.tsx | 59 +++++++++++++++++++ .../ImageCanvasMetadataModalView.tsx | 11 ++-- 2 files changed, 66 insertions(+), 4 deletions(-) diff --git a/src/components/image-editor/ImageCanvasMetadataModalView.test.tsx b/src/components/image-editor/ImageCanvasMetadataModalView.test.tsx index cd1aaf265..2ca6814df 100644 --- a/src/components/image-editor/ImageCanvasMetadataModalView.test.tsx +++ b/src/components/image-editor/ImageCanvasMetadataModalView.test.tsx @@ -380,6 +380,65 @@ describe('ImageCanvasMetadataModalView', () => { expect(within(dialog).queryByText('1234')).toBeNull(); }); + it('keeps the task id display tied to the resource kind across asset tag overrides', () => { + // 中文注释:素材标签只改 assetKindOverride,资源原始类型才是展示口径的依据。背景音乐被 + // 改标成「音效」不该换用完整 id,音效被改标成「背景音乐」更不能退回截断假值。 + const { unmount } = render( + , + ); + + const musicDialog = screen.getByRole('dialog', { name: '音频信息' }); + expect(within(musicDialog).getByText('75')).toBeTruthy(); + expect(within(musicDialog).queryByText('audio-task-75')).toBeNull(); + unmount(); + + render( + , + ); + + const soundEffectDialog = screen.getByRole('dialog', { name: '音频信息' }); + expect( + within(soundEffectDialog).getByText('task-sfx-v2-1234-abcd'), + ).toBeTruthy(); + expect(within(soundEffectDialog).queryByText('1234')).toBeNull(); + }); + it('does not render a dialog when no layer is selected', () => { render(); diff --git a/src/components/image-editor/ImageCanvasMetadataModalView.tsx b/src/components/image-editor/ImageCanvasMetadataModalView.tsx index 7a9237bd9..c3385dda8 100644 --- a/src/components/image-editor/ImageCanvasMetadataModalView.tsx +++ b/src/components/image-editor/ImageCanvasMetadataModalView.tsx @@ -1,4 +1,5 @@ import { UnifiedModal } from '../common/UnifiedModal'; +import { resolveLayerResourceAssetKind } from './ImageCanvasEditorModel'; import type { CanvasLayer } from './ImageCanvasEditorTypes'; import { formatTaskIdForDisplay } from './ImageCanvasExportModel'; import { @@ -106,10 +107,12 @@ export function ImageCanvasMetadataModalView({
Task
{/* 中文注释:音效的 taskId 是 operation id 形态,`formatTaskIdForDisplay` 的 - 「取最后一段数字」会把它截成 `0` 这类误导值。判据取图层自身的 assetKind, - 不再依赖 soundEffect 元数据是否解析成功——元数据一旦缺失,Task 这一栏不该 - 跟着降级成假值。 */} - {layer.assetKind === 'sound-effect' || + 「取最后一段数字」会把它截成 `0` 这类误导值。判据必须落在资源原始类型上: + `layer.assetKind` 是 `assetKindOverride ?? resourceAssetKind`,用户在画布上 + 改一次「素材标签」就能让音效层显示成截断假值、让背景音乐层改用完整 id。 + soundEffect 那一支只是补充——它和 action 一样长在 generationInputs 上,元数据 + 整块缺失时会一并消失,而那正是这里要兜住的场景。 */} + {resolveLayerResourceAssetKind(layer) === 'sound-effect' || layer.generationInputs?.soundEffect?.schemaVersion === 2 ? layer.taskId || '-' : formatTaskIdForDisplay(layer.taskId)}