= ({
Signer
+
+
+
= ({
setNewFieldName('');
setFieldMode('inline');
setFieldType('owner');
+ setFieldLocked(false);
}}
style={{
padding: '4px 12px',
diff --git a/packages/template-builder/src/index.tsx b/packages/template-builder/src/index.tsx
index 060da1bd56..81d2fe073c 100644
--- a/packages/template-builder/src/index.tsx
+++ b/packages/template-builder/src/index.tsx
@@ -39,6 +39,7 @@ const getTemplateFieldsFromEditor = (editor: Editor): Types.TemplateField[] => {
mode,
group: structuredContentHelpers.getGroup?.(attrs.tag) ?? undefined,
fieldType: parsedTag?.fieldType ?? 'owner',
+ lockMode: attrs.lockMode ?? undefined,
} as Types.TemplateField;
});
};
@@ -51,6 +52,7 @@ const SuperDocTemplateBuilder = forwardRef = {
+ alias: field.alias,
+ tag: tagData,
+ ...(lockMode != null && { lockMode }),
+ };
+
const success = (
mode === 'inline'
- ? editor.commands.insertStructuredContentInline?.({
- attrs: {
- alias: field.alias,
- tag: tagData,
- },
- text: field.defaultValue || field.alias,
- })
- : editor.commands.insertStructuredContentBlock?.({
- attrs: {
- alias: field.alias,
- tag: tagData,
- },
- text: field.defaultValue || field.alias,
- })
+ ? editor.commands.insertStructuredContentInline?.({ attrs, text: field.defaultValue || field.alias })
+ : editor.commands.insertStructuredContentBlock?.({ attrs, text: field.defaultValue || field.alias })
) as boolean | undefined;
if (success) {
@@ -174,7 +172,7 @@ const SuperDocTemplateBuilder = forwardRef = {
+ alias: field.alias,
+ tag: tagWithGroup,
+ ...(lockMode != null && { lockMode }),
+ };
const success =
mode === 'inline'
- ? editor.commands.insertStructuredContentInline?.({
- attrs: {
- alias: field.alias,
- tag: tagWithGroup,
- },
- text: field.alias,
- })
- : editor.commands.insertStructuredContentBlock?.({
- attrs: {
- alias: field.alias,
- tag: tagWithGroup,
- },
- text: field.alias,
- });
+ ? editor.commands.insertStructuredContentInline?.({ attrs, text: field.alias })
+ : editor.commands.insertStructuredContentBlock?.({ attrs, text: field.alias });
if (success) {
if (!field.group) {
@@ -556,7 +551,7 @@ const SuperDocTemplateBuilder = forwardRef {
diff --git a/packages/template-builder/src/tests/utils.test.ts b/packages/template-builder/src/tests/utils.test.ts
index 5b5e411c10..bac98e92e7 100644
--- a/packages/template-builder/src/tests/utils.test.ts
+++ b/packages/template-builder/src/tests/utils.test.ts
@@ -72,6 +72,18 @@ describe('areTemplateFieldsEqual', () => {
const b: TemplateField[] = [{ id: '1', alias: 'Name', fieldType: 'signer' }];
expect(areTemplateFieldsEqual(a, b)).toBe(false);
});
+
+ it('returns false when lockMode differs', () => {
+ const a: TemplateField[] = [{ id: '1', alias: 'Name', lockMode: 'unlocked' }];
+ const b: TemplateField[] = [{ id: '1', alias: 'Name', lockMode: 'sdtContentLocked' }];
+ expect(areTemplateFieldsEqual(a, b)).toBe(false);
+ });
+
+ it('returns true when lockMode is the same', () => {
+ const a: TemplateField[] = [{ id: '1', alias: 'Name', lockMode: 'contentLocked' }];
+ const b: TemplateField[] = [{ id: '1', alias: 'Name', lockMode: 'contentLocked' }];
+ expect(areTemplateFieldsEqual(a, b)).toBe(true);
+ });
});
describe('resolveToolbar', () => {
diff --git a/packages/template-builder/src/types.ts b/packages/template-builder/src/types.ts
index 591d305431..f60d1b6447 100644
--- a/packages/template-builder/src/types.ts
+++ b/packages/template-builder/src/types.ts
@@ -1,5 +1,7 @@
import type { SuperDoc } from 'superdoc';
+export type LockMode = 'unlocked' | 'sdtLocked' | 'contentLocked' | 'sdtContentLocked';
+
/** Field definition for template builder */
export interface FieldDefinition {
id: string;
@@ -9,6 +11,7 @@ export interface FieldDefinition {
mode?: 'inline' | 'block';
group?: string;
fieldType?: string;
+ lockMode?: LockMode;
}
/** Field instance in a template document */
@@ -20,6 +23,7 @@ export interface TemplateField {
mode?: 'inline' | 'block';
group?: string;
fieldType?: string;
+ lockMode?: LockMode;
}
export interface TriggerEvent {
@@ -114,6 +118,9 @@ export interface SuperDocTemplateBuilderProps {
list?: ListConfig;
toolbar?: boolean | string | ToolbarConfig;
+ /** Lock mode applied to all inserted fields unless overridden per-field */
+ defaultLockMode?: LockMode;
+
/** Content Security Policy nonce for dynamically injected styles */
cspNonce?: string;
diff --git a/packages/template-builder/src/utils.ts b/packages/template-builder/src/utils.ts
index 989944825e..8d6ef295af 100644
--- a/packages/template-builder/src/utils.ts
+++ b/packages/template-builder/src/utils.ts
@@ -18,7 +18,8 @@ export const areTemplateFieldsEqual = (a: TemplateField[], b: TemplateField[]):
left.position !== right.position ||
left.mode !== right.mode ||
left.group !== right.group ||
- left.fieldType !== right.fieldType
+ left.fieldType !== right.fieldType ||
+ left.lockMode !== right.lockMode
) {
return false;
}