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

Commit 50edc47

Browse files
Refactor: Allow numeric IDs for template fields
Co-authored-by: caiopizzol <caiopizzol@gmail.com>
1 parent 01f0bf9 commit 50edc47

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)