Some checks failed
Build & Deploy / 🔍 Prepare (push) Successful in 20s
Build & Deploy / 🧪 QA (push) Failing after 34s
Build & Deploy / 🏗️ Build (push) Has started running
Build & Deploy / 🚀 Deploy (push) Has been cancelled
Build & Deploy / 🧪 Smoke Test (push) Has been cancelled
Build & Deploy / ⚡ Lighthouse (push) Has been cancelled
Build & Deploy / 🔔 Notify (push) Has been cancelled
56 lines
2.1 KiB
Plaintext
56 lines
2.1 KiB
Plaintext
import { fieldAffectsData, fieldIsHiddenOrDisabled, fieldIsID } from 'payload/shared';
|
|
const shouldSkipField = field => field.type !== 'ui' && fieldIsHiddenOrDisabled(field) && !fieldIsID(field) || field?.admin?.disableListColumn === true;
|
|
export const filterFieldsWithPermissions = ({
|
|
fieldPermissions,
|
|
fields
|
|
}) => {
|
|
return (fields ?? []).reduce((acc, field) => {
|
|
if (shouldSkipField(field)) {
|
|
return acc;
|
|
}
|
|
// handle tabs
|
|
if (field.type === 'tabs' && 'tabs' in field) {
|
|
const formattedField = {
|
|
...field,
|
|
tabs: field.tabs.map(tab => ({
|
|
...tab,
|
|
fields: filterFieldsWithPermissions({
|
|
fieldPermissions: typeof fieldPermissions === 'boolean' ? fieldPermissions : 'name' in tab && tab.name ? fieldPermissions[tab.name]?.fields || fieldPermissions[tab.name] : fieldPermissions,
|
|
fields: tab.fields
|
|
})
|
|
}))
|
|
};
|
|
acc.push(formattedField);
|
|
return acc;
|
|
}
|
|
// handle fields with subfields (row, group, collapsible, etc.)
|
|
if ('fields' in field && Array.isArray(field.fields)) {
|
|
const formattedField = {
|
|
...field,
|
|
fields: filterFieldsWithPermissions({
|
|
fieldPermissions: typeof fieldPermissions === 'boolean' ? fieldPermissions : 'name' in field && field.name ? fieldPermissions?.[field.name]?.fields || fieldPermissions?.[field.name] : fieldPermissions,
|
|
fields: field.fields
|
|
})
|
|
};
|
|
acc.push(formattedField);
|
|
return acc;
|
|
}
|
|
if (fieldPermissions === true) {
|
|
acc.push(field);
|
|
return acc;
|
|
}
|
|
if (fieldAffectsData(field)) {
|
|
const fieldPermission = fieldPermissions?.[field.name];
|
|
// Always allow ID fields, or if explicitly granted (true or { read: true })
|
|
// undefined means field is not in permissions object = denied
|
|
if (fieldIsID(field) || fieldPermission === true || fieldPermission?.read === true) {
|
|
acc.push(field);
|
|
}
|
|
return acc;
|
|
}
|
|
// leaf
|
|
acc.push(field);
|
|
return acc;
|
|
}, []);
|
|
};
|
|
//# sourceMappingURL=filterFieldsWithPermissions.js.map |