Skip to content
This repository was archived by the owner on Jan 30, 2026. It is now read-only.

Commit d46ab5d

Browse files
authored
feat: enhance field handling with mode support in template builder (#16)
* feat: enhance field handling with mode support in template builder This commit introduces a new 'mode' property to the TemplateField interface, allowing fields to be categorized as either 'inline' or 'block'. Updates to the FieldMenu and FieldList components enable users to select the mode when creating fields, improving the overall flexibility and usability of the template builder. Additionally, the App component's styling import has been corrected for consistency. * fix: reset field mode to inline on escape and click events in FieldMenu * fix: update stylesheet import path in App component for consistency
1 parent 7e2a03d commit d46ab5d

File tree

4 files changed

+71
-13
lines changed

4 files changed

+71
-13
lines changed

src/defaults/FieldList.tsx

Lines changed: 27 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -118,16 +118,33 @@ export const FieldList: React.FC<FieldListProps> = ({
118118
>
119119
{field.id}
120120
</div>
121-
{field.alias && field.alias !== field.id && (
122-
<div
123-
style={{
124-
fontSize: "12px",
125-
color: "#4b5563",
126-
}}
127-
>
128-
{field.alias}
129-
</div>
130-
)}
121+
<div
122+
style={{
123+
display: "flex",
124+
alignItems: "center",
125+
gap: "6px",
126+
fontSize: "12px",
127+
color: "#4b5563",
128+
}}
129+
>
130+
{field.alias && field.alias !== field.id && (
131+
<span>{field.alias}</span>
132+
)}
133+
{field.mode && (
134+
<span
135+
style={{
136+
fontSize: "10px",
137+
padding: "2px 6px",
138+
borderRadius: "4px",
139+
background: field.mode === "block" ? "#dbeafe" : "#f3f4f6",
140+
color: field.mode === "block" ? "#1e40af" : "#4b5563",
141+
fontWeight: "500",
142+
}}
143+
>
144+
{field.mode}
145+
</span>
146+
)}
147+
</div>
131148
</div>
132149
</div>
133150
))}

src/defaults/FieldMenu.tsx

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,11 +14,13 @@ export const FieldMenu: React.FC<FieldMenuProps> = ({
1414
}) => {
1515
const [isCreating, setIsCreating] = useState(false);
1616
const [newFieldName, setNewFieldName] = useState("");
17+
const [fieldMode, setFieldMode] = useState<"inline" | "block">("inline");
1718

1819
useEffect(() => {
1920
if (!isVisible) {
2021
setIsCreating(false);
2122
setNewFieldName("");
23+
setFieldMode("inline");
2224
}
2325
}, [isVisible]);
2426

@@ -103,6 +105,7 @@ export const FieldMenu: React.FC<FieldMenuProps> = ({
103105
id: `custom_${Date.now()}`,
104106
label: trimmedName,
105107
category: "Custom",
108+
metadata: { mode: fieldMode },
106109
};
107110

108111
try {
@@ -115,6 +118,7 @@ export const FieldMenu: React.FC<FieldMenuProps> = ({
115118
} finally {
116119
setIsCreating(false);
117120
setNewFieldName("");
121+
setFieldMode("inline");
118122
}
119123
};
120124

@@ -166,6 +170,7 @@ export const FieldMenu: React.FC<FieldMenuProps> = ({
166170
if (event.key === "Escape") {
167171
setIsCreating(false);
168172
setNewFieldName("");
173+
setFieldMode("inline");
169174
}
170175
}}
171176
autoFocus
@@ -176,6 +181,33 @@ export const FieldMenu: React.FC<FieldMenuProps> = ({
176181
borderRadius: "3px",
177182
}}
178183
/>
184+
<div
185+
style={{
186+
marginTop: "8px",
187+
display: "flex",
188+
gap: "12px",
189+
fontSize: "13px",
190+
}}
191+
>
192+
<label style={{ display: "flex", alignItems: "center", gap: "4px", cursor: "pointer" }}>
193+
<input
194+
type="radio"
195+
value="inline"
196+
checked={fieldMode === "inline"}
197+
onChange={() => setFieldMode("inline")}
198+
/>
199+
Inline
200+
</label>
201+
<label style={{ display: "flex", alignItems: "center", gap: "4px", cursor: "pointer" }}>
202+
<input
203+
type="radio"
204+
value="block"
205+
checked={fieldMode === "block"}
206+
onChange={() => setFieldMode("block")}
207+
/>
208+
Block
209+
</label>
210+
</div>
179211
<div
180212
style={{
181213
marginTop: "8px",
@@ -201,6 +233,7 @@ export const FieldMenu: React.FC<FieldMenuProps> = ({
201233
onClick={() => {
202234
setIsCreating(false);
203235
setNewFieldName("");
236+
setFieldMode("inline");
204237
}}
205238
style={{
206239
padding: "4px 12px",

src/index.tsx

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -29,11 +29,14 @@ const getTemplateFieldsFromEditor = (editor: Editor): Types.TemplateField[] => {
2929
return tags.map((entry: any) => {
3030
const node = entry?.node ?? entry;
3131
const attrs = node?.attrs ?? {};
32+
const nodeType = node?.type?.name || "";
33+
const mode = nodeType.includes("Block") ? "block" : "inline";
3234

3335
return {
3436
id: attrs.id,
3537
alias: attrs.alias || attrs.label || "",
3638
tag: attrs.tag,
39+
mode,
3740
} as Types.TemplateField;
3841
});
3942
};
@@ -55,7 +58,8 @@ const areTemplateFieldsEqual = (
5558
left.id !== right.id ||
5659
left.alias !== right.alias ||
5760
left.tag !== right.tag ||
58-
left.position !== right.position
61+
left.position !== right.position ||
62+
left.mode !== right.mode
5963
) {
6064
return false;
6165
}
@@ -522,12 +526,15 @@ const SuperDocTemplateBuilder = forwardRef<
522526
menuTriggerFromRef.current = null;
523527
resetMenuFilter();
524528

529+
const mode = (field.metadata?.mode as "inline" | "block") || "inline";
530+
525531
if (field.id.startsWith("custom_") && onFieldCreate) {
526532
try {
527533
const createdField = await onFieldCreate(field);
528534

529535
if (createdField) {
530-
insertFieldInternal("inline", {
536+
const createdMode = (createdField.metadata?.mode as "inline" | "block") || mode;
537+
insertFieldInternal(createdMode, {
531538
alias: createdField.label,
532539
category: createdField.category,
533540
metadata: createdField.metadata,
@@ -541,7 +548,7 @@ const SuperDocTemplateBuilder = forwardRef<
541548
}
542549
}
543550

544-
insertFieldInternal("inline", {
551+
insertFieldInternal(mode, {
545552
alias: field.label,
546553
category: field.category,
547554
metadata: field.metadata,

src/types.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ export interface TemplateField {
1313
alias: string;
1414
tag?: string;
1515
position?: number;
16+
mode?: "inline" | "block";
1617
}
1718

1819
export interface TriggerEvent {

0 commit comments

Comments
 (0)