音频信息页 Task 判据改用资源原始类型
Project CI / Repository checks (pull_request) Successful in 1m10s
Project CI / Frontend tests (pull_request) Successful in 2m49s
Project CI / Backend tests (pull_request) Successful in 3m52s
Project CI / Native shell tests (pull_request) Successful in 13m12s

layer.assetKind 是 assetKindOverride ?? resourceAssetKind,用户在画布上改一次「素材标签」
就能翻转判据:背景音乐被改标成「音效」会换用完整 id,音效被改标成「背景音乐」则退回
formatTaskIdForDisplay 的截断假值——上一版修复被一次改标就废掉。

- 判据换成 resolveLayerResourceAssetKind;它在资源类型缺省时回退到 layer.assetKind,
  刚生成、尚未注册资源行的音效层同样命中
- soundEffect 那一支保留为补充判据:它和生成 action 一样长在 generationInputs 上,
  元数据整块缺失时会一并消失,不能当主判据
- 补两条回归:背景音乐改标为音效仍截断、音效改标为背景音乐仍显示完整 id

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
2026-08-08 16:30:26 +00:00
parent c206e901a0
commit 070775dfd9
2 changed files with 66 additions and 4 deletions
@@ -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(
<ImageCanvasMetadataModalView
layer={createLayer({
title: '游戏背景音乐',
src: '/generated-character-drafts/editor-audios/music.wav',
mediaType: 'audio',
resourceAssetKind: 'background-music',
assetKindOverride: 'sound-effect',
assetKind: 'sound-effect',
originalWidth: 420,
originalHeight: 120,
model: 'suno',
taskId: 'audio-task-75',
generationInputs: {
fields: [{ title: '音乐描述', value: '紧张的地下城循环音乐' }],
references: [],
},
})}
onClose={vi.fn()}
/>,
);
const musicDialog = screen.getByRole('dialog', { name: '音频信息' });
expect(within(musicDialog).getByText('75')).toBeTruthy();
expect(within(musicDialog).queryByText('audio-task-75')).toBeNull();
unmount();
render(
<ImageCanvasMetadataModalView
layer={createLayer({
title: '金币音效',
src: '/generated-character-drafts/editor-audios/coin.mp3',
mediaType: 'audio',
resourceAssetKind: 'sound-effect',
assetKindOverride: 'background-music',
assetKind: 'background-music',
originalWidth: 420,
originalHeight: 120,
model: 'eleven_text_to_sound_v2',
taskId: 'task-sfx-v2-1234-abcd',
generationInputs: {
fields: [{ title: '用户描述', value: '金币落地' }],
references: [],
},
})}
onClose={vi.fn()}
/>,
);
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(<ImageCanvasMetadataModalView layer={null} onClose={vi.fn()} />);
@@ -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({
<dt>Task</dt>
<dd>
{/* 中文注释:音效的 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)}