'use client'; import { getTranslation } from '@payloadcms/translations'; import { formatDocTitle } from '../../utilities/formatDocTitle/index.js'; const reduceToIDs = options => options.reduce((ids, option) => { if (option.options) { return [...ids, ...reduceToIDs(option.options)]; } return [...ids, { id: option.value, relationTo: option.relationTo }]; }, []); const sortOptions = options => options.sort((a, b) => { if (typeof a?.label?.localeCompare === 'function' && typeof b?.label?.localeCompare === 'function') { return a.label.localeCompare(b.label); } return 0; }); export const optionsReducer = (state, action) => { switch (action.type) { case 'ADD': { const { collection, config, docs, i18n, ids = [], sort } = action; const relation = collection.slug; const loadedIDs = reduceToIDs(state); const newOptions = [...state]; const optionsToAddTo = newOptions.find(optionGroup => optionGroup.label === collection.labels.plural); const newSubOptions = docs.reduce((docSubOptions, doc) => { if (loadedIDs.filter(item => item.id === doc.id && item.relationTo === relation).length === 0) { loadedIDs.push({ id: doc.id, relationTo: relation }); const docTitle = formatDocTitle({ collectionConfig: collection, data: doc, dateFormat: config.admin.dateFormat, fallback: `${i18n.t('general:untitled')} - ID: ${doc.id}`, i18n }); return [...docSubOptions, { label: docTitle, relationTo: relation, value: doc.id }]; } return docSubOptions; }, []); ids.forEach(id => { if (loadedIDs.filter(item => item.id === id && item.relationTo === relation).length === 0) { loadedIDs.push({ id, relationTo: relation }); newSubOptions.push({ allowEdit: false, label: `${i18n.t('general:untitled')} - ID: ${id}`, relationTo: relation, value: id }); } }); if (optionsToAddTo) { const subOptions = [...optionsToAddTo.options, ...newSubOptions]; optionsToAddTo.options = sort ? sortOptions(subOptions) : subOptions; } else { newOptions.push({ label: getTranslation(collection.labels.plural, i18n), options: sort ? sortOptions(newSubOptions) : newSubOptions }); } return newOptions; } case 'CLEAR': { const exemptValues = action.exemptValues ? Array.isArray(action.exemptValues) ? action.exemptValues : [action.exemptValues] : []; const clearedStateWithExemptValues = state.filter(optionGroup => { const clearedOptions = optionGroup.options.filter(option => { if (exemptValues) { return exemptValues.some(exemptValue => { return exemptValue && option.value === exemptValue.value; }); } return false; }); optionGroup.options = clearedOptions; return clearedOptions.length > 0; }); return clearedStateWithExemptValues; } case 'REMOVE': { const { id, collection } = action; const newOptions = [...state]; const indexOfGroup = newOptions.findIndex(optionGroup => optionGroup.label === collection.labels.plural); if (indexOfGroup === -1) { return newOptions; } newOptions[indexOfGroup] = { ...newOptions[indexOfGroup], options: newOptions[indexOfGroup].options.filter(option => option.value !== id) }; return newOptions; } case 'UPDATE': { const { collection, config, doc, i18n } = action; const relation = collection.slug; const newOptions = [...state]; const docTitle = formatDocTitle({ collectionConfig: collection, data: doc, dateFormat: config.admin.dateFormat, fallback: `${i18n.t('general:untitled')} - ID: ${doc.id}`, i18n }); const foundOptionGroup = newOptions.find(optionGroup => optionGroup.label === collection.labels.plural); const foundOption = foundOptionGroup?.options?.find(option => option.value === doc.id); if (foundOption) { foundOption.label = docTitle; foundOption.relationTo = relation; } return newOptions; } default: { return state; } } }; //# sourceMappingURL=optionsReducer.js.map