From 60510bbf8d1b78cad901722d4f9003665412d71e Mon Sep 17 00:00:00 2001 From: "Josh Berman [SSW]" <137844305+joshbermanssw@users.noreply.github.com> Date: Tue, 24 Feb 2026 15:38:13 +1100 Subject: [PATCH] =?UTF-8?q?=E2=9C=A8=20Object=20Schema=20-=20add=20openFor?= =?UTF-8?q?mOnCreate=20boolean=20=20(#6447)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .changeset/purple-keys-compete.md | 6 +++++ .../@tinacms/schema-tools/src/types/index.ts | 10 ++++++-- .../plugins/group-list-field-plugin.tsx | 24 +++++++++++++++++++ 3 files changed, 38 insertions(+), 2 deletions(-) create mode 100644 .changeset/purple-keys-compete.md diff --git a/.changeset/purple-keys-compete.md b/.changeset/purple-keys-compete.md new file mode 100644 index 0000000000..da9ea7a91e --- /dev/null +++ b/.changeset/purple-keys-compete.md @@ -0,0 +1,6 @@ +--- +"@tinacms/schema-tools": minor +"tinacms": minor +--- + +✨ Object Schema - Add openFormOnCreate flag. Allowing users to opt-in to automatically going inside an object form when the field is true diff --git a/packages/@tinacms/schema-tools/src/types/index.ts b/packages/@tinacms/schema-tools/src/types/index.ts index fa32348183..978d7e5325 100644 --- a/packages/@tinacms/schema-tools/src/types/index.ts +++ b/packages/@tinacms/schema-tools/src/types/index.ts @@ -469,8 +469,14 @@ export type ObjectField = ( | FieldGeneric ) & MaybeNamespace & - BaseField & - ( + BaseField & { + /** + * @default false + * When `list: true`, automatically opens the form for newly created list items. + * When used without `list: true`, this does not do anything. + */ + openFormOnCreate?: boolean; + } & ( | { type: 'object'; fields: Field[]; diff --git a/packages/tinacms/src/toolkit/fields/plugins/group-list-field-plugin.tsx b/packages/tinacms/src/toolkit/fields/plugins/group-list-field-plugin.tsx index 2c5a46c1ad..7238d26200 100644 --- a/packages/tinacms/src/toolkit/fields/plugins/group-list-field-plugin.tsx +++ b/packages/tinacms/src/toolkit/fields/plugins/group-list-field-plugin.tsx @@ -13,6 +13,7 @@ interface GroupFieldDefinititon extends Field { component: 'group'; fields: Field[]; defaultItem?: object | (() => object); + openFormOnCreate?: boolean; addItemBehavior?: 'append' | 'prepend'; /** * An optional function which generates `props` for @@ -46,6 +47,9 @@ interface GroupProps { } const Group = ({ tinaForm, form, field, input, meta, index }: GroupProps) => { + const cms = useCMS(); + const { dispatch: setFocusedField } = + useEvent('field:focus'); const addItem = React.useCallback(() => { let obj = {}; if (typeof field.defaultItem === 'function') { @@ -58,6 +62,26 @@ const Group = ({ tinaForm, form, field, input, meta, index }: GroupProps) => { } else { form.mutators.push(field.name, obj); } + if (field.openFormOnCreate) { + const state = tinaForm.finalForm.getState(); + const newIndex = field.addItemBehavior === 'prepend' ? 0 : items.length; + if (state.invalid === true) { + // @ts-ignore + cms.alerts.error('Cannot navigate away from an invalid form.'); + return; + } + cms.dispatch({ + type: 'forms:set-active-field-name', + value: { + formId: tinaForm.id, + fieldName: `${field.name}.${newIndex}`, + }, + }); + setFocusedField({ + id: tinaForm.id, + fieldName: `${field.name}.${newIndex}`, + }); + } }, [form, field]); const items = input.value || [];