音频信息页 Task 判据改用资源原始类型
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:
@@ -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)}
|
||||
|
||||
Reference in New Issue
Block a user