修复图集快速编辑后端校验与错误提示

后端允许完整图标图集进入图片快速编辑,仅继续禁止单个图标。

快速编辑失败时向红色错误框传递具体错误文案。

补充前后端回归测试并同步画布编辑器技术文档。
This commit is contained in:
2026-07-15 21:11:46 +08:00
parent 271b153308
commit cfdba640ee
4 changed files with 38 additions and 17 deletions
File diff suppressed because one or more lines are too long
@@ -2099,14 +2099,14 @@ fn ensure_editor_image_edit_asset_kind_allowed(asset_kind: Option<&str>) -> Resu
let Some(asset_kind) = asset_kind.map(str::trim).filter(|value| !value.is_empty()) else {
return Ok(());
};
if !matches!(asset_kind, "icon" | "icon-spritesheet") {
if asset_kind != "icon" {
return Ok(());
}
Err(
AppError::from_status(StatusCode::BAD_REQUEST).with_details(json!({
"provider": "editor-image-edit",
"message": "图标与图标图集不支持快速编辑",
"message": "单个图标不支持快速编辑",
"assetKind": asset_kind,
})),
)
@@ -9186,21 +9186,20 @@ mod tests {
}
#[test]
fn editor_image_edit_rejects_icons_but_allows_icon_specs() {
for asset_kind in ["icon", "icon-spritesheet"] {
let error = ensure_editor_image_edit_asset_kind_allowed(Some(asset_kind))
.expect_err("icon assets should not support quick edit");
assert_eq!(error.status_code(), StatusCode::BAD_REQUEST);
assert_eq!(
error.details().and_then(|details| details.get("message")),
Some(&json!("图标与图标图集不支持快速编辑")),
);
assert_eq!(
error.details().and_then(|details| details.get("assetKind")),
Some(&json!(asset_kind)),
);
}
fn editor_image_edit_rejects_individual_icons_but_allows_spritesheets_and_specs() {
let error = ensure_editor_image_edit_asset_kind_allowed(Some("icon"))
.expect_err("individual icon assets should not support quick edit");
assert_eq!(error.status_code(), StatusCode::BAD_REQUEST);
assert_eq!(
error.details().and_then(|details| details.get("message")),
Some(&json!("单个图标不支持快速编辑")),
);
assert_eq!(
error.details().and_then(|details| details.get("assetKind")),
Some(&json!("icon")),
);
assert!(ensure_editor_image_edit_asset_kind_allowed(Some("icon-spritesheet")).is_ok());
assert!(ensure_editor_image_edit_asset_kind_allowed(Some("icon-spec")).is_ok());
assert!(ensure_editor_image_edit_asset_kind_allowed(Some("image")).is_ok());
assert!(ensure_editor_image_edit_asset_kind_allowed(None).is_ok());
@@ -124,6 +124,27 @@ describe('ImageCanvasQuickEditPanelView', () => {
expect(rememberImageModel).toHaveBeenCalledWith('gpt-image-2');
});
it('renders the failure message inside the quick edit alert', () => {
render(
<QuickEditPanelHarness
initialPanel={{
sourceLayerId: 'layer-a',
prompt: '调整图集布局',
size: '1024x1024',
aspectRatio: '1:1',
imageSize: '1K',
model: 'gpt-image-2',
status: 'failed',
errorMessage: '图集快速编辑失败',
}}
/>,
);
expect(screen.getByRole('alert').textContent).toContain(
'图集快速编辑失败',
);
});
it('submits without rendering a standalone close button', () => {
const submitQuickEdit = vi.fn();
render(
@@ -53,6 +53,7 @@ function createQuickEditDialog(
mode: isQuickEdit ? 'quick-edit' : 'generate',
prompt: panel.prompt,
status: panel.status,
errorMessage: panel.errorMessage,
sourceLayerId: panel.sourceLayerId,
generationReferences: panel.quickEditReferences,
assetLabel: panel.assetLabel,