UNPKG

payload

Version:

Node, React, Headless CMS and Application Framework built on Next.js

149 lines (148 loc) 5.92 kB
import { transformWhereQuery } from '../utilities/transformWhereQuery.js'; import { validateWhereQuery } from '../utilities/validateWhereQuery.js'; import { getAccess } from './access.js'; import { getConstraints } from './constraints.js'; import { operations } from './types.js'; export const queryPresetsCollectionSlug = 'payload-query-presets'; export const getQueryPresetsConfig = (config)=>({ slug: queryPresetsCollectionSlug, access: getAccess(config), admin: { defaultColumns: [ 'title', 'isShared', 'access', 'where', 'columns' ], hidden: true, useAsTitle: 'title' }, fields: [ { name: 'title', type: 'text', required: true }, { name: 'isShared', type: 'checkbox', defaultValue: false, validate: (isShared, { data })=>{ const typedData = data; // ensure the `isShared` is only true if all constraints are 'onlyMe' if (typedData?.access) { const someOperationsAreShared = Object.values(typedData.access).some((operation)=>operation.constraint !== 'onlyMe'); if (!isShared && someOperationsAreShared) { return 'If any constraint is not "onlyMe", the preset must be shared'; } } return true; } }, getConstraints(config), { name: 'where', type: 'json', admin: { components: { Cell: '@payloadcms/ui#QueryPresetsWhereCell', Field: '@payloadcms/ui#QueryPresetsWhereField' } }, hooks: { beforeValidate: [ ({ data })=>{ // transform the "where" query here so that the client-side doesn't have to if (data?.where) { if (validateWhereQuery(data.where)) { return data.where; } else { return transformWhereQuery(data.where); } } return data?.where; } ] }, label: 'Filters' }, { name: 'columns', type: 'json', admin: { components: { Cell: '@payloadcms/ui#QueryPresetsColumnsCell', Field: '@payloadcms/ui#QueryPresetsColumnField' } }, validate: (value)=>{ if (value) { try { JSON.parse(JSON.stringify(value)); } catch { return 'Invalid JSON'; } } return true; } }, { name: 'relatedCollection', type: 'select', admin: { hidden: true }, options: config.collections ? config.collections.reduce((acc, collection)=>{ if (collection.enableQueryPresets) { acc.push({ label: collection.labels?.plural || collection.slug, value: collection.slug }); } return acc; }, []) : [], required: true } ], hooks: { beforeValidate: [ ({ data, operation, req })=>{ // TODO: type this const typedData = data; if (operation === 'create' || operation === 'update') { // Ensure all operations have a constraint operations.forEach((operation)=>{ if (!typedData.access) { typedData.access = {}; } if (!typedData.access?.[operation]) { typedData[operation] = {}; } // Ensure all operations have a constraint if (!typedData.access[operation]?.constraint) { typedData.access[operation] = { ...typedData.access[operation], constraint: 'onlyMe' }; } }); // If at least one constraint is not `onlyMe` then `isShared` must be true if (typedData?.access) { const someOperationsAreShared = Object.values(typedData.access).some(// TODO: remove the `any` here (operation)=>operation.constraint !== 'onlyMe'); typedData.isShared = someOperationsAreShared; } } return typedData; } ] }, labels: { plural: 'Presets', singular: 'Preset', ...config.queryPresets?.labels || {} }, lockDocuments: false }); //# sourceMappingURL=config.js.map