payload
Version:
Node, React, Headless CMS and Application Framework built on Next.js
94 lines (93 loc) • 4.52 kB
JavaScript
import { getTranslation } from '@payloadcms/translations';
import { fieldAffectsData } from '../fields/config/types.js';
import { toWords } from '../utilities/formatLabels.js';
import { operations } from './types.js';
export const getConstraints = (config)=>({
name: 'access',
type: 'group',
admin: {
components: {
Cell: '@payloadcms/ui#QueryPresetsAccessCell'
},
condition: (data)=>Boolean(data?.isShared)
},
fields: operations.map((operation)=>({
type: 'collapsible',
fields: [
{
name: operation,
type: 'group',
admin: {
hideGutter: true
},
fields: [
{
name: 'constraint',
type: 'select',
defaultValue: 'onlyMe',
label: ({ i18n })=>`Specify who can ${operation} this ${getTranslation(config.queryPresets?.labels?.singular || 'Preset', i18n)}`,
options: [
{
label: 'Everyone',
value: 'everyone'
},
{
label: 'Only Me',
value: 'onlyMe'
},
{
label: 'Specific Users',
value: 'specificUsers'
},
...config?.queryPresets?.constraints?.[operation]?.map((option)=>({
label: option.label,
value: option.value
})) || []
]
},
{
name: 'users',
type: 'relationship',
admin: {
condition: (data)=>Boolean(data?.access?.[operation]?.constraint === 'specificUsers')
},
hasMany: true,
hooks: {
beforeChange: [
({ data, req })=>{
if (data?.access?.[operation]?.constraint === 'onlyMe') {
if (req.user) {
return [
req.user.id
];
}
}
return data?.access?.[operation]?.users;
}
]
},
relationTo: 'users'
},
...config?.queryPresets?.constraints?.[operation]?.reduce((acc, option)=>{
option.fields.forEach((field, index)=>{
acc.push({
...field
});
if (fieldAffectsData(field)) {
acc[index].admin = {
...acc[index]?.admin || {},
condition: (data)=>Boolean(data?.access?.[operation]?.constraint === option.value)
};
}
});
return acc;
}, []) || []
],
label: false
}
],
label: ()=>toWords(operation)
})),
label: 'Sharing settings'
});
//# sourceMappingURL=constraints.js.map