Skip to content

Commit

Permalink
feat: allows admin thumbnail to be set programmatically
Browse files Browse the repository at this point in the history
  • Loading branch information
jmikrut committed Mar 14, 2021
1 parent 65c81c7 commit b6a9fe4
Show file tree
Hide file tree
Showing 17 changed files with 85 additions and 76 deletions.
2 changes: 1 addition & 1 deletion demo/collections/Media.ts
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@ const Media: PayloadCollectionConfig = {
upload: {
staticURL: '/media',
staticDir: './media',
adminThumbnail: 'mobile',
adminThumbnail: ({ doc }) => `/media/${doc.filename}`,
imageSizes: [
{
name: 'tablet',
Expand Down
37 changes: 23 additions & 14 deletions src/admin/components/elements/FileDetails/index.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -12,17 +12,26 @@ import './index.scss';
const baseClass = 'file-details';

const FileDetails: React.FC<Props> = (props) => {
const {
doc,
collection,
handleRemove,
} = props;

const {
upload: {
staticURL,
},
} = collection;

const {
filename,
mimeType,
filesize,
staticURL,
adminThumbnail,
sizes,
handleRemove,
width,
height,
} = props;
mimeType,
sizes,
} = doc;

const [moreInfoOpen, setMoreInfoOpen] = useState(false);

Expand All @@ -31,18 +40,18 @@ const FileDetails: React.FC<Props> = (props) => {
return (
<div className={baseClass}>
<header>
<Thumbnail {...{
mimeType, adminThumbnail, sizes, staticURL, filename,
}}
<Thumbnail
doc={doc}
collection={collection}
/>
<div className={`${baseClass}__main-detail`}>
<Meta
staticURL={staticURL}
filename={filename}
filesize={filesize}
width={width}
height={height}
mimeType={mimeType}
filename={filename as string}
filesize={filesize as number}
width={width as number}
height={height as number}
mimeType={mimeType as string}
/>
{hasSizes && (
<Button
Expand Down
12 changes: 3 additions & 9 deletions src/admin/components/elements/FileDetails/types.ts
Original file line number Diff line number Diff line change
@@ -1,13 +1,7 @@
import { FileSizes } from '../../../../uploads/types';
import { CollectionConfig } from '../../../../collections/config/types';

export type Props = {
filename: string,
mimeType: string,
filesize: number,
staticURL: string,
width?: number,
height?: number,
sizes?: FileSizes,
adminThumbnail?: string,
collection: CollectionConfig
doc: Record<string, unknown>
handleRemove?: () => void,
}
14 changes: 7 additions & 7 deletions src/admin/components/elements/Thumbnail/index.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -10,17 +10,17 @@ const baseClass = 'thumbnail';

const Thumbnail: React.FC<Props> = (props) => {
const {
filename,
mimeType,
staticURL,
sizes,
adminThumbnail,
doc,
doc: {
filename,
},
collection,
size,
} = props;

const { serverURL } = useConfig();

const thumbnail = getThumbnail(mimeType, staticURL, filename, sizes, adminThumbnail);
const thumbnail = getThumbnail(collection, doc);

const classes = [
baseClass,
Expand All @@ -32,7 +32,7 @@ const Thumbnail: React.FC<Props> = (props) => {
{thumbnail && (
<img
src={`${serverURL}${thumbnail}`}
alt={filename}
alt={filename as string}
/>
)}
{!thumbnail && (
Expand Down
9 changes: 3 additions & 6 deletions src/admin/components/elements/Thumbnail/types.ts
Original file line number Diff line number Diff line change
@@ -1,10 +1,7 @@
import { FileSizes } from '../../../../uploads/types';
import { CollectionConfig } from '../../../../collections/config/types';

export type Props = {
filename: string,
sizes?: FileSizes
adminThumbnail?: string,
mimeType?: string,
staticURL: string,
doc: Record<string, unknown>
collection: CollectionConfig
size?: 'small' | 'medium' | 'large' | 'expand',
}
18 changes: 5 additions & 13 deletions src/admin/components/elements/UploadCard/index.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -10,15 +10,8 @@ const baseClass = 'upload-card';
const UploadCard: React.FC<Props> = (props) => {
const {
onClick,
mimeType,
sizes,
filename,
collection: {
upload: {
adminThumbnail,
staticURL,
} = {},
} = {},
doc,
collection,
} = props;

const classes = [
Expand All @@ -33,12 +26,11 @@ const UploadCard: React.FC<Props> = (props) => {
>
<Thumbnail
size="expand"
{...{
mimeType, adminThumbnail, sizes, staticURL, filename,
}}
doc={doc}
collection={collection}
/>
<div className={`${baseClass}__filename`}>
{filename}
{doc?.filename}
</div>
</div>
);
Expand Down
6 changes: 1 addition & 5 deletions src/admin/components/elements/UploadCard/types.ts
Original file line number Diff line number Diff line change
@@ -1,11 +1,7 @@
import { CollectionConfig } from '../../../../collections/config/types';
import { FileSizes } from '../../../../uploads/types';

export type Props = {
collection: CollectionConfig,
id: string,
filename: string,
mimeType: string,
sizes?: FileSizes,
doc: Record<string, unknown>
onClick?: () => void,
}
3 changes: 1 addition & 2 deletions src/admin/components/elements/UploadGallery/index.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -9,14 +9,13 @@ const baseClass = 'upload-gallery';
const UploadGallery: React.FC<Props> = (props) => {
const { docs, onCardClick, collection } = props;


if (docs && docs.length > 0) {
return (
<ul className={baseClass}>
{docs.map((doc, i) => (
<li key={i}>
<UploadCard
{...doc as {id: string, filesize: number, mimeType: string, filename: string}}
doc={doc}
{...{ collection }}
onClick={() => onCardClick(doc)}
/>
Expand Down
2 changes: 1 addition & 1 deletion src/admin/components/elements/UploadGallery/types.ts
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
import { CollectionConfig } from '../../../../collections/config/types';

export type Props = {
docs?: unknown[],
docs?: Record<string, unknown>[],
collection: CollectionConfig,
onCardClick: (doc) => void,
}
Original file line number Diff line number Diff line change
Expand Up @@ -65,7 +65,7 @@ const AddUploadModal: React.FC<Props> = (props) => {
/>
</header>
<Upload
{...collection.upload}
collection={collection}
/>
<NegativeFieldGutterProvider allow>
<RenderFields
Expand Down
4 changes: 2 additions & 2 deletions src/admin/components/forms/field-types/Upload/index.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -107,8 +107,8 @@ const Upload: React.FC<Props> = (props) => {
<React.Fragment>
{(internalValue && !missingFile) && (
<FileDetails
{...collection.upload}
{...internalValue}
collection={collection}
doc={internalValue}
handleRemove={() => {
setInternalValue(undefined);
setValue(null);
Expand Down
2 changes: 1 addition & 1 deletion src/admin/components/views/collections/Edit/Default.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -102,7 +102,7 @@ const DefaultEditView: React.FC<Props> = (props) => {
{upload && (
<Upload
data={data}
{...upload}
collection={collection}
/>
)}
<RenderFields
Expand Down
12 changes: 5 additions & 7 deletions src/admin/components/views/collections/Edit/Upload/index.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,7 @@ const validate = (value) => {
return true;
};

const File: React.FC<Props> = (props) => {
const Upload: React.FC<Props> = (props) => {
const inputRef = useRef(null);
const dropRef = useRef(null);
const [fileList, setFileList] = useState(undefined);
Expand All @@ -35,8 +35,7 @@ const File: React.FC<Props> = (props) => {

const {
data = {} as Data,
adminThumbnail,
staticURL,
collection,
} = props;

const { filename } = data;
Expand Down Expand Up @@ -140,9 +139,8 @@ const File: React.FC<Props> = (props) => {
/>
{(filename && !replacingFile) && (
<FileDetails
{...data}
staticURL={staticURL}
adminThumbnail={adminThumbnail}
doc={data}
collection={collection}
handleRemove={() => {
setReplacingFile(true);
setFileList(null);
Expand Down Expand Up @@ -199,4 +197,4 @@ const File: React.FC<Props> = (props) => {
);
};

export default File;
export default Upload;
4 changes: 3 additions & 1 deletion src/admin/components/views/collections/Edit/Upload/types.ts
Original file line number Diff line number Diff line change
@@ -1,3 +1,5 @@
import { CollectionConfig } from '../../../../../../collections/config/types';

export type Data = {
filename: string
mimeType: string
Expand All @@ -6,6 +8,6 @@ export type Data = {

export type Props = {
data?: Data
collection: CollectionConfig
adminThumbnail?: string
staticURL: string
}
5 changes: 4 additions & 1 deletion src/collections/config/schema.ts
Original file line number Diff line number Diff line change
Expand Up @@ -79,7 +79,10 @@ const collectionSchema = joi.object().keys({
joi.object({
staticURL: joi.string(),
staticDir: joi.string(),
adminThumbnail: joi.string(),
adminThumbnail: joi.alternatives().try(
joi.string(),
joi.func(),
),
imageSizes: joi.array().items(
joi.object().keys({
name: joi.string(),
Expand Down
23 changes: 20 additions & 3 deletions src/uploads/getThumbnail.ts
Original file line number Diff line number Diff line change
@@ -1,8 +1,25 @@
import { CollectionConfig } from '../collections/config/types';
import isImage from './isImage';
import { FileSizes } from './types';

const getThumbnail = (mimeType: string, staticURL: string, filename: string, sizes: FileSizes, adminThumbnail: string): string | boolean => {
if (isImage(mimeType)) {
const getThumbnail = (collection: CollectionConfig, doc: Record<string, unknown>): string | boolean => {
const {
upload: {
staticURL,
adminThumbnail,
},
} = collection;

const {
mimeType,
sizes,
filename,
} = doc;

if (typeof adminThumbnail === 'function') {
return adminThumbnail({ doc });
}

if (isImage(mimeType as string)) {
if (sizes?.[adminThumbnail]?.filename) {
return `${staticURL}/${sizes[adminThumbnail].filename}`;
}
Expand Down
6 changes: 4 additions & 2 deletions src/uploads/types.ts
Original file line number Diff line number Diff line change
Expand Up @@ -27,19 +27,21 @@ export type ImageSize = {
height: number,
crop?: string, // comes from sharp package
};
export type GetAdminThumbnail = (args: { doc: Record<string, unknown> }) => string

export type IncomingUploadType = {
imageSizes?: ImageSize[];
staticURL?: string;
staticDir?: string;
adminThumbnail?: string;
adminThumbnail?: string | GetAdminThumbnail;
}


export type Upload = {
imageSizes?: ImageSize[]
staticURL: string
staticDir: string
adminThumbnail?: string
adminThumbnail?: string | GetAdminThumbnail
}

export type File = {
Expand Down

0 comments on commit b6a9fe4

Please sign in to comment.