隐藏图片信息中的上游标识
图片信息弹窗标题固定为图片信息,不再拼接图片名称 图片信息弹窗移除 Provider 展示行 Task 展示收口为任务标识末尾数字,避免暴露 Provider 字符串 补充图片信息脱敏展示回归测试 更新画板角色形象生成文档中的图片信息展示口径
This commit is contained in:
@@ -57,6 +57,13 @@
|
||||
- 提交生成规范时,若存在参考图,前端必须把参考图作为 `referenceImageSrcs[0]` 提交到 `/api/editor/images/generations`,并在生图提示词开头自动追加“参考图生成规范”语义:要求模型参考图 1 的构图、风格、材质、色彩、形状语言和视觉层级生成规范图,但不要复制参考图中的文字、水印或无关背景。
|
||||
- 生成结果的信息快照必须记录该参考图,标题为 `参考图`,便于后续在图片信息面板回看生成输入。
|
||||
|
||||
## 图片信息展示
|
||||
|
||||
- 图片信息弹窗标题固定为 `图片信息`,不拼接图片 / 图层名称。
|
||||
- 图片信息弹窗不展示 Provider 行,也不在 Task 中暴露 Provider 字符串。
|
||||
- Task 只展示任务标识里的数字部分;若任务标识没有数字,则显示 `-`。
|
||||
- 图片 / 图层名称只用于画布内部选择、图层列表和素材管理,不进入图片信息弹窗。
|
||||
|
||||
## 可访问性与状态
|
||||
|
||||
- 点选状态下画布显示状态提示 `请选择画布中的图片作为角色形象规范,按 Esc 退出`。
|
||||
|
||||
@@ -31,7 +31,7 @@ describe('ImageCanvasMetadataModalView', () => {
|
||||
layer={createLayer({
|
||||
model: 'gpt-image-2',
|
||||
provider: 'VectorEngine',
|
||||
taskId: 'task-123',
|
||||
taskId: 'gpt-image-2-task-123',
|
||||
objectKey: 'generated/object.png',
|
||||
generationInputs: {
|
||||
fields: [{ title: '生成提示词', value: '清爽游戏按钮' }],
|
||||
@@ -48,8 +48,9 @@ describe('ImageCanvasMetadataModalView', () => {
|
||||
/>,
|
||||
);
|
||||
|
||||
const dialog = screen.getByRole('dialog', { name: '生成主图图片信息' });
|
||||
const dialog = screen.getByRole('dialog', { name: '图片信息' });
|
||||
|
||||
expect(within(dialog).queryByText('生成主图')).toBeNull();
|
||||
expect(within(dialog).getByText('生成图片')).toBeTruthy();
|
||||
expect(within(dialog).getByText('生成提示词')).toBeTruthy();
|
||||
expect(within(dialog).getByText('清爽游戏按钮')).toBeTruthy();
|
||||
@@ -57,8 +58,10 @@ describe('ImageCanvasMetadataModalView', () => {
|
||||
expect(within(dialog).getByText('角色立绘')).toBeTruthy();
|
||||
expect(within(dialog).getByText('gpt-image-2')).toBeTruthy();
|
||||
expect(within(dialog).getByText('1024 x 768 px')).toBeTruthy();
|
||||
expect(within(dialog).getByText('VectorEngine')).toBeTruthy();
|
||||
expect(within(dialog).getByText('task-123')).toBeTruthy();
|
||||
expect(within(dialog).queryByText('Provider')).toBeNull();
|
||||
expect(within(dialog).queryByText(/VectorEngine/u)).toBeNull();
|
||||
expect(within(dialog).queryByText(/task-/u)).toBeNull();
|
||||
expect(within(dialog).getByText('123')).toBeTruthy();
|
||||
expect(within(dialog).getByText('generated/object.png')).toBeTruthy();
|
||||
});
|
||||
|
||||
@@ -80,8 +83,9 @@ describe('ImageCanvasMetadataModalView', () => {
|
||||
/>,
|
||||
);
|
||||
|
||||
const dialog = screen.getByRole('dialog', { name: '上传素材图片信息' });
|
||||
const dialog = screen.getByRole('dialog', { name: '图片信息' });
|
||||
|
||||
expect(within(dialog).queryByText('上传素材')).toBeNull();
|
||||
expect(within(dialog).getByText('上传图片')).toBeTruthy();
|
||||
expect(within(dialog).getAllByText('-').length).toBeGreaterThanOrEqual(3);
|
||||
expect(within(dialog).getByText('asset-object-1')).toBeTruthy();
|
||||
|
||||
@@ -7,6 +7,11 @@ export type ImageCanvasMetadataModalViewProps = {
|
||||
onClose: () => void;
|
||||
};
|
||||
|
||||
function formatTaskIdForDisplay(taskId?: string | null) {
|
||||
const numericParts = taskId?.match(/\d+/gu);
|
||||
return numericParts?.length ? numericParts[numericParts.length - 1] : '-';
|
||||
}
|
||||
|
||||
export function ImageCanvasMetadataModalView({
|
||||
layer,
|
||||
onClose,
|
||||
@@ -14,7 +19,7 @@ export function ImageCanvasMetadataModalView({
|
||||
return (
|
||||
<UnifiedModal
|
||||
open={Boolean(layer)}
|
||||
title={layer ? `${layer.title}图片信息` : '图片信息'}
|
||||
title="图片信息"
|
||||
size="sm"
|
||||
closeLabel="关闭图片信息"
|
||||
onClose={onClose}
|
||||
@@ -70,10 +75,8 @@ export function ImageCanvasMetadataModalView({
|
||||
<dd>
|
||||
{layer.originalWidth} x {layer.originalHeight} px
|
||||
</dd>
|
||||
<dt>Provider</dt>
|
||||
<dd>{layer.provider ?? '-'}</dd>
|
||||
<dt>Task</dt>
|
||||
<dd>{layer.taskId ?? '-'}</dd>
|
||||
<dd>{formatTaskIdForDisplay(layer.taskId)}</dd>
|
||||
<dt>Object</dt>
|
||||
<dd>{layer.objectKey ?? layer.assetObjectId ?? '-'}</dd>
|
||||
</dl>
|
||||
|
||||
Reference in New Issue
Block a user