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; continue;
} }
if (isAgentPsdImageLayerSlot(layer)) { if (canReplaceImageLayer) {
const explicitUrl = String(body.imageAssignments[layer.id] || "").trim(); const explicitUrl = String(body.imageAssignments[layer.id] || "").trim();
if (explicitUrl) { if (explicitUrl) {
imageAssignments[layer.id] = 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)) { if (Object.hasOwn(body.textAssignments, layer.id)) {
textAssignments[layer.id] = String( textAssignments[layer.id] = String(
body.textAssignments[layer.id] ?? "" body.textAssignments[layer.id] ?? ""

View File

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

View File

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

View File

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