79 lines
2.9 KiB
JavaScript
79 lines
2.9 KiB
JavaScript
/**
|
|
* 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
|