Files
Genarrative/src/components/image-editor/ImageCanvasMetadataModalView.tsx
T
kdletters a27798be77 合并生成参数恢复与改造入口修复
合入 PR 135 的 GenerationInputs V2 稳定字段与严格恢复链路
统一缺失来源时保留改造入口并在点击后复检拒绝
保留主分支 SFX V2 自动时长、Loop 与权威元数据语义
将队列引用槽位与场景配方修复移植到 PR 137 的模块结构
2026-08-08 22:03:50 +08:00

117 lines
4.2 KiB
TypeScript

import { UnifiedModal } from '../common/UnifiedModal';
import type { CanvasLayer } from './ImageCanvasEditorTypes';
import { formatTaskIdForDisplay } from './ImageCanvasExportModel';
import {
formatEditorGenerationInputFieldValue,
formatLayerImageType,
getEditorLayerModelDisplayName,
isEditorUserVisibleGenerationInputField,
} from './ImageCanvasGenerationModel';
export type ImageCanvasMetadataModalViewProps = {
layer: CanvasLayer | null;
onClose: () => void;
};
function formatReferenceType(refType: 'project-resource' | 'asset') {
return refType === 'project-resource' ? '项目资源' : '素材';
}
export function ImageCanvasMetadataModalView({
layer,
onClose,
}: ImageCanvasMetadataModalViewProps) {
const visibleGenerationInputFields =
layer?.generationInputs?.fields.filter(
isEditorUserVisibleGenerationInputField,
) ?? [];
const generationInputReferences = layer?.generationInputs?.references ?? [];
const mediaLabel =
layer?.mediaType === 'audio'
? '音频'
: layer?.mediaType === 'video'
? '视频'
: layer?.mediaType === 'image-sequence'
? '序列帧'
: '图片';
// TODO: Remove this override after full dark style support.
return (
<UnifiedModal
open={Boolean(layer)}
title={`${mediaLabel}信息`}
size="sm"
portalTheme="light"
closeLabel={`关闭${mediaLabel}信息`}
onClose={onClose}
panelClassName="image-canvas-editor__metadata-dialog"
bodyClassName="image-canvas-editor__metadata-body"
>
{layer ? (
<dl className="image-canvas-editor__metadata-grid">
<dt>{mediaLabel}类型</dt>
<dd>{formatLayerImageType(layer)}</dd>
<dt>生成输入</dt>
<dd className="image-canvas-editor__metadata-inputs">
{visibleGenerationInputFields.length ||
generationInputReferences.length ? (
<>
{visibleGenerationInputFields.map((field) => (
<div
key={`${field.title}-${field.value}`}
className="image-canvas-editor__metadata-input-field"
>
<span className="image-canvas-editor__metadata-input-title">
{field.title}
</span>
<span>{formatEditorGenerationInputFieldValue(field)}</span>
</div>
))}
{generationInputReferences.length ? (
<div className="image-canvas-editor__metadata-reference-list">
{generationInputReferences.map((reference) => (
<div
key={`${reference.title}-${reference.label ?? ''}-${reference.refType}-${reference.refId}`}
className="image-canvas-editor__metadata-reference-card"
>
<span className="image-canvas-editor__metadata-reference-copy">
<span className="image-canvas-editor__metadata-input-title">
{reference.title}
</span>
<span>{reference.label?.trim() || '参考素材'}</span>
<span className="image-canvas-editor__metadata-reference-id">
{formatReferenceType(reference.refType)} ·{' '}
{reference.refId}
</span>
</span>
</div>
))}
</div>
) : null}
</>
) : (
'-'
)}
</dd>
<dt>Model</dt>
<dd>{getEditorLayerModelDisplayName(layer.model)}</dd>
{layer.mediaType !== 'audio' ? (
<>
<dt>Resolution</dt>
<dd>
{layer.originalWidth} x {layer.originalHeight} px
</dd>
</>
) : null}
<dt>Task</dt>
<dd>
{layer.generationInputs?.soundEffect?.schemaVersion === 2
? layer.taskId || '-'
: formatTaskIdForDisplay(layer.taskId)}
</dd>
</dl>
) : null}
</UnifiedModal>
);
}