payload-plugin-scheduler
Version:
Scheduled posts plugin for PayloadCMS
119 lines (118 loc) • 4.86 kB
JavaScript
import db from 'debug';
import { resolvePublishDateField } from './config.js';
import { publishDateFieldCustomKey, publishDateFieldOverridesCustomKey } from './lib.js';
import PublishDateField from './fields/PublishDate/index.js';
export const debug = db('payload-plugin-scheduler');
export const flattenFields = (fields)=>{
return fields.flatMap((field)=>{
const nestedFields = [];
if ('fields' in field && Array.isArray(field.fields)) {
nestedFields.push(...flattenFields(field.fields));
}
if ('tabs' in field && Array.isArray(field.tabs)) {
field.tabs.forEach((tab)=>{
if ('fields' in tab && Array.isArray(tab.fields)) {
nestedFields.push(...flattenFields(tab.fields));
}
});
}
return [
field,
...nestedFields
];
});
};
export const isPluginPublishDateField = (field)=>{
return 'custom' in field && field.custom?.[publishDateFieldCustomKey] === true;
};
export const getPublishDateFieldNameFromFields = (fields)=>{
const publishDateField = flattenFields(fields).find(isPluginPublishDateField);
return publishDateField?.name;
};
export const fieldHasName = (field, name)=>{
return 'name' in field && field.name === name;
};
const getManualPublishDateFieldOverrides = (field)=>{
if ('custom' in field && field.custom?.[publishDateFieldOverridesCustomKey]) {
return field.custom[publishDateFieldOverridesCustomKey];
}
return {};
};
/**
* Manual publishDate() fields only mark placement. During config decoration,
* replace them with the normalized global field config plus any manual display
* overrides stored by publishDate().
*/ export const applyManualPublishDateFieldOverrides = (field, scheduleConfig)=>{
if (isPluginPublishDateField(field)) {
return resolvePublishDateField(scheduleConfig, getManualPublishDateFieldOverrides(field));
}
if ('fields' in field && Array.isArray(field.fields)) {
return {
...field,
fields: field.fields.map((nestedField)=>applyManualPublishDateFieldOverrides(nestedField, scheduleConfig))
};
}
if ('tabs' in field && Array.isArray(field.tabs)) {
return {
...field,
tabs: field.tabs.map((tab)=>{
if ('fields' in tab && Array.isArray(tab.fields)) {
return {
...tab,
fields: tab.fields.map((nestedField)=>applyManualPublishDateFieldOverrides(nestedField, scheduleConfig))
};
}
return tab;
})
};
}
return field;
};
/**For each configured collection/global, validate any manually placed
* publishDate() field, prevent name collisions, and auto-inject the field when
* the entity is opted in but has not placed it manually.
*/ export const resolvePublishDateFieldsForEntity = ({ enabled, entityType, fields, fieldName, scheduleConfig, slug })=>{
const allFields = flattenFields(fields);
const pluginFields = allFields.filter(isPluginPublishDateField);
const label = `${entityType} "${slug}"`;
if (pluginFields.length > 0 && !enabled) {
throw new Error(`[payload-plugin-scheduler] publishDate() can only be used in opted-in collections/globals. Found manual field in ${label}.`);
}
if (!enabled) {
return fields;
}
if (pluginFields.length === 1) {
return fields.map((field)=>applyManualPublishDateFieldOverrides(field, scheduleConfig));
}
const conflictingField = allFields.find((field)=>fieldHasName(field, fieldName));
if (conflictingField) {
throw new Error(`[payload-plugin-scheduler] ${label} already has a non-plugin field named "${fieldName}". Use publishDate() or configure a different publishDate.name.`);
}
return [
...fields,
PublishDateField(scheduleConfig)
];
};
/**
* Merge the plugin's schedulePublish settings into the entity's versions.drafts.schedulePublish settings.
*/ export const withScheduledPublishVersions = (entity, timeIntervals)=>{
const versions = typeof entity.versions === 'object' ? entity.versions : {};
const existingDrafts = versions.drafts;
const drafts = typeof existingDrafts === 'object' ? existingDrafts : {};
const existingSchedulePublish = drafts.schedulePublish;
const schedulePublish = typeof existingSchedulePublish === 'object' ? existingSchedulePublish : {};
return {
...entity,
versions: {
...versions,
drafts: {
...drafts,
schedulePublish: {
...schedulePublish,
timeIntervals
}
}
}
};
};
//# sourceMappingURL=util.js.map