修复画布参考图上传删除链路 (#164)
Project CI / Repository checks (push) Successful in 3m3s
Project CI / Frontend tests (push) Successful in 3m32s
Project CI / Backend tests (push) Successful in 5m45s
Project CI / Native shell tests (push) Successful in 16m17s

主站规范生成支持多张参考图

修复普通生成参考图删除与提交状态不同步

优化触屏设备删除按钮可达性并补充回归测试

---------

Co-authored-by: kdletters <kdletters@qq.com>
Reviewed-on: http://192.168.35.82/git/GenarrativeAI/Genarrative/pulls/164
Co-authored-by: 孟豪 <mh18530625731@163.com>
Co-committed-by: 孟豪 <mh18530625731@163.com>
This commit was merged in pull request #164.
This commit is contained in:
2026-08-21 11:55:32 +08:00
committed by 段舒康
parent 7e3adc38b9
commit e4e3cab559
20 changed files with 698 additions and 72 deletions
@@ -94,6 +94,41 @@ function resetFailedGenerationDialog(dialog: GenerateDialogState) {
};
}
export function resolveSpecGenerationReferences(
dialog: GenerateDialogState | null | undefined,
) {
if (!dialog || dialog.mode !== 'spec') {
return [];
}
if (dialog.specType === 'icon') {
return dialog.specReference ? [dialog.specReference] : [];
}
if (dialog.generationReferences?.length) {
return dialog.generationReferences;
}
return dialog.specReference ? [dialog.specReference] : [];
}
export function setSpecGenerationReferences(
dialog: GenerateDialogState,
references: NonNullable<GenerateDialogState['generationReferences']>,
) {
if (dialog.mode !== 'spec') {
return dialog;
}
return dialog.specType === 'icon'
? {
...dialog,
specReference: references[0] ?? null,
generationReferences: [],
}
: {
...dialog,
specReference: null,
generationReferences: references,
};
}
function resetFailedGenerationPanel(panel: QuickEditPanelState) {
return {
...panel,
@@ -1017,12 +1052,22 @@ function createNormalizedGenerationDialogDraft({
characterView: getNormalizedString(sourceLayer, 'characterView'),
customPrompt: getNormalizedString(sourceLayer, 'customPrompt'),
},
specReference:
resolveNormalizedReferences(
sourceLayer,
'reference',
availableLayers,
)[0] ?? null,
...(specType === 'icon'
? {
specReference:
resolveNormalizedReferences(
sourceLayer,
'reference',
availableLayers,
)[0] ?? null,
}
: {
generationReferences: resolveNormalizedReferences(
sourceLayer,
'reference',
availableLayers,
),
}),
},
sourceLayer,
);
@@ -1776,14 +1821,25 @@ export function createSameSourceGenerationDialogDraft({
if (sourceMode === 'spec') {
const specType = resolveSpecTypeFromSourceLayer(sourceLayer, sourceDialog);
const sourceReferences =
sourceDialog?.mode === 'spec'
? resolveSpecGenerationReferences(sourceDialog)
: [];
return placeDraftBesideSourceLayer(
restoreSpecValuesFromLayer(
{
...createSpecDialogDraft({ canvasSize, viewport, specType }),
prompt,
sourceLayerId: sourceLayer.id,
specReference:
sourceDialog?.mode === 'spec' ? sourceDialog.specReference : null,
...(specType === 'icon'
? {
specReference: sourceReferences[0] ?? null,
generationReferences: [],
}
: {
specReference: null,
generationReferences: sourceReferences,
}),
},
sourceLayer,
specType,
@@ -2102,11 +2158,20 @@ export function appendGenerationReference(
if (getReferenceMediaType(layer) !== 'image') {
return dialog;
}
return {
const resetDialog = {
...resetFailedGenerationDialog(dialog),
specReference: createCanvasLayerReference(layer),
composerOpen: true,
};
return setSpecGenerationReferences(
resetDialog,
dialog.specType === 'icon'
? [createCanvasLayerReference(layer)]
: appendLimitedImageReferences(
resolveSpecGenerationReferences(dialog),
[createCanvasLayerReference(layer)],
resolveDialogExtraImageReferenceLimit(dialog),
),
);
}
if (dialog?.mode === 'video' && !isSeedanceVideoModel(dialog.videoModel)) {
return dialog;