payload
Version:
Node, React, Headless CMS and Application Framework built on Next.js
298 lines (297 loc) • 12.5 kB
JavaScript
import { generateFilePathOrURL } from './generateFilePathOrURL.js';
import { mimeTypeValidator } from './mimeTypeValidator.js';
export const getBaseUploadFields = ({ collection, config })=>{
const uploadOptions = typeof collection.upload === 'object' ? collection.upload : {};
const mimeType = {
name: 'mimeType',
type: 'text',
admin: {
hidden: true,
readOnly: true
},
label: 'MIME Type'
};
const thumbnailURL = {
name: 'thumbnailURL',
type: 'text',
admin: {
hidden: true,
readOnly: true
},
hooks: {
afterRead: [
({ originalDoc, req })=>{
const adminThumbnail = typeof collection.upload !== 'boolean' ? collection.upload?.adminThumbnail : undefined;
if (typeof adminThumbnail === 'function') {
return adminThumbnail({
doc: originalDoc
});
}
return generateFilePathOrURL({
collectionSlug: collection.slug,
config,
filename: typeof adminThumbnail === 'string' ? originalDoc.sizes?.[adminThumbnail].filename : undefined,
relative: false,
serverURL: req.payload.config.serverURL,
urlOrPath: typeof adminThumbnail === 'string' ? originalDoc.sizes?.[adminThumbnail].url : undefined
});
}
]
},
label: 'Thumbnail URL'
};
const width = {
name: 'width',
type: 'number',
admin: {
hidden: true,
readOnly: true
},
label: ({ t })=>t('upload:width')
};
const height = {
name: 'height',
type: 'number',
admin: {
hidden: true,
readOnly: true
},
label: ({ t })=>t('upload:height')
};
const filesize = {
name: 'filesize',
type: 'number',
admin: {
hidden: true,
readOnly: true
},
label: ({ t })=>t('upload:fileSize')
};
const filename = {
name: 'filename',
type: 'text',
admin: {
disableBulkEdit: true,
hidden: true,
readOnly: true
},
index: true,
label: ({ t })=>t('upload:fileName')
};
// Only set unique: true if the collection does not have a compound index
if (collection.upload === true || typeof collection.upload === 'object' && !collection.upload.filenameCompoundIndex) {
filename.unique = true;
}
const url = {
name: 'url',
type: 'text',
admin: {
hidden: true,
readOnly: true
},
label: 'URL'
};
let uploadFields = [
{
...url,
hooks: {
afterRead: [
({ data, originalDoc, req, value })=>generateFilePathOrURL({
collectionSlug: collection.slug,
config,
filename: data?.filename || originalDoc?.filename,
relative: false,
serverURL: req.payload.config.serverURL,
urlOrPath: value
})
],
beforeChange: [
({ collection, data, originalDoc, req, value })=>generateFilePathOrURL({
collectionSlug: collection?.slug,
config,
filename: data?.filename || originalDoc?.filename,
relative: true,
serverURL: req.payload.config.serverURL,
urlOrPath: value
})
]
}
},
thumbnailURL,
filename,
mimeType,
filesize,
width,
height
];
// Add focal point fields if not disabled
if (uploadOptions.focalPoint !== false || uploadOptions.imageSizes || uploadOptions.resizeOptions) {
uploadFields = uploadFields.concat([
'focalX',
'focalY'
].map((name)=>{
return {
name,
type: 'number',
admin: {
disableGroupBy: true,
disableListColumn: true,
disableListFilter: true,
hidden: true
}
};
}));
}
if (uploadOptions.mimeTypes) {
mimeType.validate = mimeTypeValidator(uploadOptions.mimeTypes);
}
// In Payload v4, image size subfields (`url`, `width`, `height`, etc.) should
// default to `disableGroupBy: true`, `disableListColumn: true` and `disableListFilter: true`
// to avoid cluttering the collection list view and filters by default.
if (uploadOptions.imageSizes) {
uploadFields = uploadFields.concat([
{
name: 'sizes',
type: 'group',
admin: {
hidden: true
},
fields: uploadOptions.imageSizes.map((size)=>({
name: size.name,
type: 'group',
admin: {
hidden: true,
...size.admin?.disableGroupBy && {
disableGroupBy: true
},
...size.admin?.disableListColumn && {
disableListColumn: true
},
...size.admin?.disableListFilter && {
disableListFilter: true
}
},
fields: [
{
...url,
admin: {
...url.admin,
...size.admin?.disableGroupBy && {
disableGroupBy: true
},
...size.admin?.disableListColumn && {
disableListColumn: true
},
...size.admin?.disableListFilter && {
disableListFilter: true
}
},
hooks: {
afterRead: [
({ collection, data, originalDoc, req, value })=>generateFilePathOrURL({
collectionSlug: collection?.slug,
config,
filename: data?.sizes?.[size.name]?.filename || originalDoc?.sizes?.[size.name]?.filename,
relative: false,
serverURL: req.payload.config.serverURL,
urlOrPath: value
})
],
beforeChange: [
({ collection, data, originalDoc, req, value })=>generateFilePathOrURL({
collectionSlug: collection?.slug,
config,
filename: data?.sizes?.[size.name]?.filename || originalDoc?.sizes?.[size.name]?.filename || data?.filename || originalDoc?.filename,
relative: true,
serverURL: req.payload.config.serverURL,
urlOrPath: value
})
]
}
},
{
...width,
admin: {
...width.admin,
...size.admin?.disableGroupBy && {
disableGroupBy: true
},
...size.admin?.disableListColumn && {
disableListColumn: true
},
...size.admin?.disableListFilter && {
disableListFilter: true
}
}
},
{
...height,
admin: {
...height.admin,
...size.admin?.disableGroupBy && {
disableGroupBy: true
},
...size.admin?.disableListColumn && {
disableListColumn: true
},
...size.admin?.disableListFilter && {
disableListFilter: true
}
}
},
{
...mimeType,
admin: {
...mimeType.admin,
...size.admin?.disableGroupBy && {
disableGroupBy: true
},
...size.admin?.disableListColumn && {
disableListColumn: true
},
...size.admin?.disableListFilter && {
disableListFilter: true
}
}
},
{
...filesize,
admin: {
...filesize.admin,
...size.admin?.disableGroupBy && {
disableGroupBy: true
},
...size.admin?.disableListColumn && {
disableListColumn: true
},
...size.admin?.disableListFilter && {
disableListFilter: true
}
}
},
{
...filename,
admin: {
...filename.admin,
...size.admin?.disableGroupBy && {
disableGroupBy: true
},
...size.admin?.disableListColumn && {
disableListColumn: true
},
...size.admin?.disableListFilter && {
disableListFilter: true
}
},
unique: false
}
],
label: size.name
})),
label: ({ t })=>t('upload:sizes')
}
]);
}
return uploadFields;
};
//# sourceMappingURL=getBaseFields.js.map