This commit is contained in:
2026-07-31 23:21:51 +02:00
parent f6b4b36df8
commit f14f2cfd98
294 changed files with 5880 additions and 0 deletions
+79
View File
@@ -0,0 +1,79 @@
/**
* Wraps each SEO-enabled collection's fields into a tabbed UI: a "Content" tab
* holding the collection's own fields, and an "SEO" tab holding the `meta`
* group that @payloadcms/plugin-seo added.
*
* This replaces plugin-seo's own `tabbedUI`, which merges tabs by inspecting
* the first field and breaks when other plugins/fields (roles, slug) already
* sit in the collection — producing an empty SEO tab. Running this AFTER
* plugin-seo (so `meta` already exists) and after other field injections lets
* us build the tabs deterministically.
*
* If a collection's first field is already a tabs field, the SEO tab is
* appended to it instead of creating a new wrapper.
*/ export function injectSeoTabs(config, seo) {
return {
...config,
collections: (config.collections ?? []).map((collection)=>{
if (!seo.collections.includes(collection.slug)) {
return collection;
}
const fields = collection.fields ?? [];
// Separate the meta group (added by plugin-seo) from the rest.
const metaField = fields.find((f)=>'name' in f && f.name === 'meta');
const otherFields = fields.filter((f)=>!('name' in f && f.name === 'meta'));
// Nothing to do if plugin-seo hasn't added meta (shouldn't happen).
if (!metaField) {
return collection;
}
// If the collection already leads with a tabs field, append an SEO tab.
const firstField = otherFields[0];
if (firstField && firstField.type === 'tabs') {
const existingTabs = firstField;
const withSeoTab = {
...existingTabs,
tabs: [
...existingTabs.tabs,
{
fields: [
metaField
],
label: 'SEO'
}
]
};
return {
...collection,
fields: [
withSeoTab,
...otherFields.slice(1)
]
};
}
// Otherwise wrap everything: Content tab + SEO tab.
const tabs = {
type: 'tabs',
tabs: [
{
fields: otherFields,
label: collection.labels?.singular?.toString() || 'Content'
},
{
fields: [
metaField
],
label: 'SEO'
}
]
};
return {
...collection,
fields: [
tabs
]
};
})
};
}
//# sourceMappingURL=injectSeoTabs.js.map