fix: honor PSD super locked image slots

This commit is contained in:
Your Name 2026-06-01 18:33:12 +08:00
parent 6e647021cd
commit b189ca1b58
4 changed files with 22 additions and 24 deletions

View File

@ -150,11 +150,14 @@ export async function executeAgentPsdTemplateRenderRequest(
);
}
if (!isAgentPsdTemplateLayerUserEditable(layer)) {
const canReplaceImageLayer =
isAgentPsdImageLayerSlot(layer) && layer.isEditable;
const canEditTextLayer = isAgentPsdTemplateLayerUserEditable(layer);
if (!canReplaceImageLayer && !canEditTextLayer) {
continue;
}
if (isAgentPsdImageLayerSlot(layer)) {
if (canReplaceImageLayer) {
const explicitUrl = String(body.imageAssignments[layer.id] || "").trim();
if (explicitUrl) {
imageAssignments[layer.id] = explicitUrl;
@ -172,7 +175,7 @@ export async function executeAgentPsdTemplateRenderRequest(
}
}
if (isAgentPsdTextLayerSlot(layer)) {
if (canEditTextLayer && isAgentPsdTextLayerSlot(layer)) {
if (Object.hasOwn(body.textAssignments, layer.id)) {
textAssignments[layer.id] = String(
body.textAssignments[layer.id] ?? ""

View File

@ -411,10 +411,9 @@ export function parseAgentPsdTemplateLayers(value: unknown) {
layers.push({
...baseRecord,
slotType: "image",
isDefaultResultSource:
isEditable && !isSuperLocked && record.isDefaultResultSource === true,
isDefaultResultSource: isEditable && record.isDefaultResultSource === true,
allowUserUploadOverride:
isEditable && !isSuperLocked ? record.allowUserUploadOverride !== false : false,
isEditable ? record.allowUserUploadOverride !== false : false,
replaceMode: normalizeAgentPsdTemplateReplaceMode(record.replaceMode),
contentBounds: normalizeAgentPsdTemplateImageContentBounds(
record.contentBounds,
@ -617,7 +616,7 @@ export function getAgentPsdTemplateRuntimeMissingLayers(template: AgentPsdTempla
if (hasUsableRenderBase) {
return (
isAgentPsdImageLayerSlot(layer) &&
isAgentPsdTemplateLayerUserEditable(layer) &&
layer.isEditable &&
!hasAgentPsdTemplateStoredLayerSource(layer)
);
}

View File

@ -728,7 +728,11 @@ function shouldPrepareLayerPreview(
layer: AgentPsdTemplateLayerSlot,
assetProfile: PsdTemplateLayerAssetProfile
) {
return assetProfile === "full" || isAgentPsdTemplateLayerUserEditable(layer);
return (
assetProfile === "full" ||
isAgentPsdTemplateLayerUserEditable(layer) ||
(isAgentPsdImageLayerSlot(layer) && layer.isEditable)
);
}
function shouldPrepareLayerSource(
@ -739,7 +743,7 @@ function shouldPrepareLayerSource(
return true;
}
return isAgentPsdImageLayerSlot(layer) && isAgentPsdTemplateLayerUserEditable(layer);
return isAgentPsdImageLayerSlot(layer) && layer.isEditable;
}
export async function preparePsdTemplateRenderAssets(params: {
@ -795,8 +799,7 @@ export async function preparePsdTemplateRenderAssets(params: {
isAgentPsdTextLayerSlot(targetLayer) &&
targetLayer.styleSource !== "custom";
const shouldResolveImageBounds =
isAgentPsdTemplateLayerUserEditable(targetLayer) &&
isAgentPsdImageLayerSlot(targetLayer);
isAgentPsdImageLayerSlot(targetLayer) && targetLayer.isEditable;
if (
!shouldUploadPreview &&

View File

@ -10,7 +10,6 @@ import {
AGENT_PSD_TEMPLATE_ASSET_VERSION,
hasAgentPsdTemplateRenderSegments,
isAgentPsdImageLayerSlot,
isAgentPsdLayerSuperLocked,
isAgentPsdTemplateLayerUserEditable,
isAgentPsdTextLayerSlot,
type AgentPsdTemplate,
@ -42,7 +41,7 @@ function hasMissingLayerAssets(template: AgentPsdTemplate) {
if (hasRenderBase) {
return (
isAgentPsdImageLayerSlot(layer) &&
isAgentPsdTemplateLayerUserEditable(layer) &&
layer.isEditable &&
!String(layer.sourceUrl || "").trim()
);
}
@ -74,19 +73,13 @@ function hasStaticTemplateLayers(template: AgentPsdTemplate) {
function repairEditableImageLayerSelection(template: AgentPsdTemplate) {
const imageLayers = template.layers.filter(isAgentPsdImageLayerSlot);
const unlockedImageLayers = imageLayers.filter(
(layer) => !isAgentPsdLayerSuperLocked(layer)
);
if (unlockedImageLayers.length === 0) {
if (imageLayers.length === 0) {
return template.layers;
}
const editableImageLayers = unlockedImageLayers.filter(
isAgentPsdTemplateLayerUserEditable
);
const defaultImageLayer = unlockedImageLayers.find(
(layer) =>
isAgentPsdTemplateLayerUserEditable(layer) && layer.isDefaultResultSource
const editableImageLayers = imageLayers.filter((layer) => layer.isEditable);
const defaultImageLayer = imageLayers.find(
(layer) => layer.isEditable && layer.isDefaultResultSource
);
const shouldAutoRepairSelection =
editableImageLayers.length === 0 ||
@ -98,7 +91,7 @@ function repairEditableImageLayerSelection(template: AgentPsdTemplate) {
}
const nextPrimaryLayerId = pickPrimaryPsdImageLayerId({
imageLayers: unlockedImageLayers,
imageLayers,
canvasWidth: template.width,
canvasHeight: template.height,
});