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

Commit 17aa547

Browse files
committed
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.
1 parent 01f0bf9 commit 17aa547

2 files changed

Lines changed: 29 additions & 26 deletions

File tree

src/index.tsx

Lines changed: 19 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -143,7 +143,9 @@ const SuperDocTemplateBuilder = forwardRef<
143143
const [templateFields, setTemplateFields] = useState<Types.TemplateField[]>(
144144
fields.initial || [],
145145
);
146-
const [selectedFieldId, setSelectedFieldId] = useState<string | null>(null);
146+
const [selectedFieldId, setSelectedFieldId] = useState<string | number | null>(
147+
null,
148+
);
147149
const [menuVisible, setMenuVisible] = useState(false);
148150
const [menuPosition, setMenuPosition] = useState<DOMRect | undefined>();
149151
const [menuQuery, setMenuQuery] = useState<string>("");
@@ -202,13 +204,12 @@ const SuperDocTemplateBuilder = forwardRef<
202204
if (!superdocRef.current?.activeEditor) return false;
203205

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

207209
const success =
208210
mode === "inline"
209211
? editor.commands.insertStructuredContentInline?.({
210212
attrs: {
211-
id: fieldId,
212213
alias: field.alias,
213214
tag: field.metadata
214215
? JSON.stringify(field.metadata)
@@ -218,7 +219,6 @@ const SuperDocTemplateBuilder = forwardRef<
218219
})
219220
: editor.commands.insertStructuredContentBlock?.({
220221
attrs: {
221-
id: fieldId,
222222
alias: field.alias,
223223
tag: field.metadata
224224
? JSON.stringify(field.metadata)
@@ -228,28 +228,28 @@ const SuperDocTemplateBuilder = forwardRef<
228228
});
229229

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

237-
setTemplateFields((prev) => {
238-
const updated = [...prev, newField];
239-
onFieldsChange?.(updated);
240-
return updated;
241-
});
233+
setTemplateFields(updatedFields);
234+
onFieldsChange?.(updatedFields);
235+
236+
const insertedField = updatedFields.find(
237+
(candidate) =>
238+
!previousFields.some((existing) => existing.id === candidate.id),
239+
);
242240

243-
onFieldInsert?.(newField);
241+
if (insertedField) {
242+
onFieldInsert?.(insertedField);
243+
}
244244
}
245245

246246
return success;
247247
},
248-
[onFieldInsert, onFieldsChange],
248+
[onFieldInsert, onFieldsChange, templateFields],
249249
);
250250

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

255255
const editor = superdocRef.current.activeEditor;
@@ -275,7 +275,7 @@ const SuperDocTemplateBuilder = forwardRef<
275275
);
276276

277277
const deleteField = useCallback(
278-
(id: string): boolean => {
278+
(id: string | number): boolean => {
279279
const editor = superdocRef.current?.activeEditor;
280280

281281
if (!editor) {
@@ -348,7 +348,7 @@ const SuperDocTemplateBuilder = forwardRef<
348348
);
349349

350350
const selectField = useCallback(
351-
(id: string) => {
351+
(id: string | number) => {
352352
if (!superdocRef.current?.activeEditor) return;
353353

354354
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)