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

Commit e0e6d31

Browse files
authored
fix: update field ID type and improve field handling (#14)
* fix: update field ID type and improve field handling This commit modifies the TemplateField interface to allow the ID to be either a string or a number. It also updates the SuperDocTemplateBuilder component to handle the new ID type, ensuring that field insertion, deletion, and selection functions correctly accommodate both types. This change enhances flexibility in managing template fields. * refactor: streamline tag mapping in getTemplateFieldsFromEditor function This commit simplifies the mapping logic in the getTemplateFieldsFromEditor function by removing unnecessary filtering. The function now directly returns the mapped tags, enhancing readability and maintainability of the code.
1 parent 42faccc commit e0e6d31

File tree

2 files changed

+39
-38
lines changed

2 files changed

+39
-38
lines changed

src/index.tsx

Lines changed: 29 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -28,18 +28,16 @@ const getTemplateFieldsFromEditor = (
2828
const tags =
2929
structuredContentHelpers.getStructuredContentTags(editor.state) || [];
3030

31-
return tags
32-
.map((entry: any) => {
33-
const node = entry?.node ?? entry;
34-
const attrs = node?.attrs ?? {};
35-
36-
return {
37-
id: attrs.id,
38-
alias: attrs.alias || attrs.label || "",
39-
tag: attrs.tag,
40-
} as Types.TemplateField;
41-
})
42-
.filter((field: Types.TemplateField) => Boolean(field.id));
31+
return tags.map((entry: any) => {
32+
const node = entry?.node ?? entry;
33+
const attrs = node?.attrs ?? {};
34+
35+
return {
36+
id: attrs.id,
37+
alias: attrs.alias || attrs.label || "",
38+
tag: attrs.tag,
39+
} as Types.TemplateField;
40+
});
4341
};
4442

4543
const areTemplateFieldsEqual = (
@@ -143,7 +141,9 @@ const SuperDocTemplateBuilder = forwardRef<
143141
const [templateFields, setTemplateFields] = useState<Types.TemplateField[]>(
144142
fields.initial || [],
145143
);
146-
const [selectedFieldId, setSelectedFieldId] = useState<string | null>(null);
144+
const [selectedFieldId, setSelectedFieldId] = useState<string | number | null>(
145+
null,
146+
);
147147
const [menuVisible, setMenuVisible] = useState(false);
148148
const [menuPosition, setMenuPosition] = useState<DOMRect | undefined>();
149149
const [menuQuery, setMenuQuery] = useState<string>("");
@@ -202,13 +202,12 @@ const SuperDocTemplateBuilder = forwardRef<
202202
if (!superdocRef.current?.activeEditor) return false;
203203

204204
const editor = superdocRef.current.activeEditor;
205-
const fieldId = `field_${Date.now()}`;
205+
const previousFields = templateFields;
206206

207207
const success =
208208
mode === "inline"
209209
? editor.commands.insertStructuredContentInline?.({
210210
attrs: {
211-
id: fieldId,
212211
alias: field.alias,
213212
tag: field.metadata
214213
? JSON.stringify(field.metadata)
@@ -218,7 +217,6 @@ const SuperDocTemplateBuilder = forwardRef<
218217
})
219218
: editor.commands.insertStructuredContentBlock?.({
220219
attrs: {
221-
id: fieldId,
222220
alias: field.alias,
223221
tag: field.metadata
224222
? JSON.stringify(field.metadata)
@@ -228,28 +226,28 @@ const SuperDocTemplateBuilder = forwardRef<
228226
});
229227

230228
if (success) {
231-
const newField: Types.TemplateField = {
232-
id: fieldId,
233-
alias: field.alias,
234-
tag: field.category,
235-
};
229+
const updatedFields = getTemplateFieldsFromEditor(editor);
236230

237-
setTemplateFields((prev) => {
238-
const updated = [...prev, newField];
239-
onFieldsChange?.(updated);
240-
return updated;
241-
});
231+
setTemplateFields(updatedFields);
232+
onFieldsChange?.(updatedFields);
242233

243-
onFieldInsert?.(newField);
234+
const insertedField = updatedFields.find(
235+
(candidate) =>
236+
!previousFields.some((existing) => existing.id === candidate.id),
237+
);
238+
239+
if (insertedField) {
240+
onFieldInsert?.(insertedField);
241+
}
244242
}
245243

246244
return success;
247245
},
248-
[onFieldInsert, onFieldsChange],
246+
[onFieldInsert, onFieldsChange, templateFields],
249247
);
250248

251249
const updateField = useCallback(
252-
(id: string, updates: Partial<Types.TemplateField>): boolean => {
250+
(id: string | number, updates: Partial<Types.TemplateField>): boolean => {
253251
if (!superdocRef.current?.activeEditor) return false;
254252

255253
const editor = superdocRef.current.activeEditor;
@@ -275,7 +273,7 @@ const SuperDocTemplateBuilder = forwardRef<
275273
);
276274

277275
const deleteField = useCallback(
278-
(id: string): boolean => {
276+
(id: string | number): boolean => {
279277
const editor = superdocRef.current?.activeEditor;
280278

281279
if (!editor) {
@@ -348,7 +346,7 @@ const SuperDocTemplateBuilder = forwardRef<
348346
);
349347

350348
const selectField = useCallback(
351-
(id: string) => {
349+
(id: string | number) => {
352350
if (!superdocRef.current?.activeEditor) return;
353351

354352
const editor = superdocRef.current.activeEditor;

src/types.ts

Lines changed: 10 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ export interface FieldDefinition {
99
}
1010

1111
export interface TemplateField {
12-
id: string;
12+
id: string | number;
1313
alias: string;
1414
tag?: string;
1515
position?: number;
@@ -38,8 +38,8 @@ export interface FieldMenuProps {
3838
export interface FieldListProps {
3939
fields: TemplateField[];
4040
onSelect: (field: TemplateField) => void;
41-
onDelete: (fieldId: string) => void;
42-
selectedFieldId?: string;
41+
onDelete: (fieldId: string | number) => void;
42+
selectedFieldId?: string | number;
4343
}
4444

4545
export interface DocumentConfig {
@@ -87,7 +87,7 @@ export interface SuperDocTemplateBuilderProps {
8787
onTrigger?: (event: TriggerEvent) => void;
8888
onFieldInsert?: (field: TemplateField) => void;
8989
onFieldUpdate?: (field: TemplateField) => void;
90-
onFieldDelete?: (fieldId: string) => void;
90+
onFieldDelete?: (fieldId: string | number) => void;
9191
onFieldsChange?: (fields: TemplateField[]) => void;
9292
onFieldSelect?: (field: TemplateField | null) => void;
9393
onFieldCreate?: (
@@ -105,9 +105,12 @@ export interface SuperDocTemplateBuilderHandle {
105105
insertBlockField: (
106106
field: Partial<FieldDefinition> & { alias: string },
107107
) => boolean;
108-
updateField: (id: string, updates: Partial<TemplateField>) => boolean;
109-
deleteField: (id: string) => boolean;
110-
selectField: (id: string) => void;
108+
updateField: (
109+
id: string | number,
110+
updates: Partial<TemplateField>,
111+
) => boolean;
112+
deleteField: (id: string | number) => boolean;
113+
selectField: (id: string | number) => void;
111114
nextField: () => void;
112115
previousField: () => void;
113116
getFields: () => TemplateField[];

0 commit comments

Comments
 (0)