payload 0.14.6-beta.0 → 0.14.10-beta.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (41) hide show
  1. package/.eslintrc.js +1 -0
  2. package/CHANGELOG.md +34 -2
  3. package/components/index.js +2 -2
  4. package/components/styles.css +1 -1
  5. package/dist/admin/components/elements/Button/index.js +10 -5
  6. package/dist/admin/components/elements/Button/index.scss +20 -0
  7. package/dist/admin/components/elements/Button/types.d.ts +1 -0
  8. package/dist/admin/components/elements/Tooltip/index.scss +1 -0
  9. package/dist/admin/components/forms/Form/reduceFieldsToValues.d.ts +1 -1
  10. package/dist/admin/components/forms/Form/reduceFieldsToValues.js +4 -4
  11. package/dist/admin/components/forms/field-types/RichText/RichText.js +4 -4
  12. package/dist/admin/components/forms/field-types/RichText/elements/index.d.ts +2 -1
  13. package/dist/admin/components/forms/field-types/RichText/elements/isListActive.js +4 -1
  14. package/dist/admin/components/forms/field-types/RichText/elements/li/index.js +1 -1
  15. package/dist/admin/components/forms/field-types/RichText/elements/upload/Element/EditModal/index.d.ts +16 -0
  16. package/dist/admin/components/forms/field-types/RichText/elements/upload/Element/EditModal/index.js +47 -0
  17. package/dist/admin/components/forms/field-types/RichText/elements/upload/Element/EditModal/index.scss +41 -0
  18. package/dist/admin/components/forms/field-types/RichText/elements/upload/Element/SwapUploadModal/index.d.ts +13 -0
  19. package/dist/admin/components/forms/field-types/RichText/elements/upload/Element/SwapUploadModal/index.js +96 -0
  20. package/dist/admin/components/forms/field-types/RichText/elements/upload/Element/SwapUploadModal/index.scss +25 -0
  21. package/dist/admin/components/forms/field-types/RichText/elements/upload/Element/index.d.ts +2 -2
  22. package/dist/admin/components/forms/field-types/RichText/elements/upload/Element/index.js +41 -107
  23. package/dist/admin/components/forms/field-types/RichText/elements/upload/Element/index.scss +55 -12
  24. package/dist/admin/components/forms/field-types/RichText/elements/upload/index.d.ts +2 -1
  25. package/dist/admin/scss/vars.scss +4 -0
  26. package/dist/collections/operations/delete.js +8 -2
  27. package/dist/fields/config/schema.js +6 -1
  28. package/dist/fields/config/types.d.ts +7 -0
  29. package/dist/fields/config/types.js +1 -1
  30. package/dist/fields/richText/populate.d.ts +21 -0
  31. package/dist/fields/richText/populate.js +27 -0
  32. package/dist/fields/richText/recurseNestedFields.d.ts +16 -0
  33. package/dist/fields/richText/recurseNestedFields.js +171 -0
  34. package/dist/fields/richText/relationshipPromise.d.ts +27 -0
  35. package/dist/fields/richText/relationshipPromise.js +75 -0
  36. package/dist/fields/traverseFields.js +3 -3
  37. package/dist/graphql/schema/buildObjectType.js +3 -3
  38. package/docs/fields/rich-text.mdx +22 -2
  39. package/package.json +1 -1
  40. package/dist/fields/richTextRelationshipPromise.d.ts +0 -15
  41. package/dist/fields/richTextRelationshipPromise.js +0 -79
@@ -0,0 +1,47 @@
1
+ import React, { useCallback, useEffect, useState } from 'react';
2
+ import { Transforms } from 'slate';
3
+ import { ReactEditor, useSlateStatic } from 'slate-react';
4
+ import { Modal } from '@faceless-ui/modal';
5
+ import buildStateFromSchema from '../../../../../../Form/buildStateFromSchema';
6
+ import MinimalTemplate from '../../../../../../../templates/Minimal';
7
+ import Button from '../../../../../../../elements/Button';
8
+ import RenderFields from '../../../../../../RenderFields';
9
+ import fieldTypes from '../../../../..';
10
+ import Form from '../../../../../../Form';
11
+ import reduceFieldsToValues from '../../../../../../Form/reduceFieldsToValues';
12
+ import Submit from '../../../../../../Submit';
13
+ import './index.scss';
14
+ const baseClass = 'edit-upload-modal';
15
+ export const EditModal = ({ slug, closeModal, relatedCollectionConfig, fieldSchema, element }) => {
16
+ const editor = useSlateStatic();
17
+ const [initialState, setInitialState] = useState({});
18
+ const handleUpdateEditData = useCallback((fields) => {
19
+ const newNode = {
20
+ fields: reduceFieldsToValues(fields, true),
21
+ };
22
+ const elementPath = ReactEditor.findPath(editor, element);
23
+ Transforms.setNodes(editor, newNode, { at: elementPath });
24
+ closeModal();
25
+ }, [closeModal, editor, element]);
26
+ useEffect(() => {
27
+ const awaitInitialState = async () => {
28
+ const state = await buildStateFromSchema(fieldSchema, element === null || element === void 0 ? void 0 : element.fields);
29
+ setInitialState(state);
30
+ };
31
+ awaitInitialState();
32
+ }, [fieldSchema, element.fields]);
33
+ return (React.createElement(Modal, { slug: slug, className: baseClass },
34
+ React.createElement(MinimalTemplate, { width: "normal" },
35
+ React.createElement("header", { className: `${baseClass}__header` },
36
+ React.createElement("h1", null,
37
+ "Edit",
38
+ ' ',
39
+ relatedCollectionConfig.labels.singular,
40
+ ' ',
41
+ "data"),
42
+ React.createElement(Button, { icon: "x", round: true, buttonStyle: "icon-label", onClick: closeModal })),
43
+ React.createElement("div", null,
44
+ React.createElement(Form, { onSubmit: handleUpdateEditData, initialState: initialState },
45
+ React.createElement(RenderFields, { readOnly: false, fieldTypes: fieldTypes, fieldSchema: fieldSchema }),
46
+ React.createElement(Submit, null, "Save changes"))))));
47
+ };
@@ -0,0 +1,41 @@
1
+ @import '../../../../../../../../scss/styles.scss';
2
+
3
+ .edit-upload-modal {
4
+ @include blur-bg;
5
+ display: flex;
6
+ align-items: center;
7
+
8
+ .template-minimal {
9
+ padding-top: base(4);
10
+ align-items: flex-start;
11
+ }
12
+
13
+ &__header {
14
+ margin-bottom: $baseline;
15
+ display: flex;
16
+
17
+ h1 {
18
+ margin: 0 auto 0 0;
19
+ }
20
+
21
+ .btn {
22
+ margin: 0 0 0 $baseline;
23
+ }
24
+ }
25
+
26
+ .rich-text__wrap {
27
+ .field-type-gutter {
28
+ display: none;
29
+ }
30
+ }
31
+ .rich-text__toolbar {
32
+ margin-bottom: 0;
33
+ }
34
+ .rich-text__editor {
35
+ background-color: white;
36
+ border: 1px solid $color-light-gray;
37
+ border-top: none;
38
+ min-height: base(5);
39
+ padding: base(.35) base(.5);
40
+ }
41
+ }
@@ -0,0 +1,13 @@
1
+ import * as React from 'react';
2
+ import { Element } from 'slate';
3
+ import { SanitizedCollectionConfig } from '../../../../../../../../../collections/config/types';
4
+ import './index.scss';
5
+ declare type Props = {
6
+ slug: string;
7
+ element: Element;
8
+ closeModal: () => void;
9
+ setRelatedCollectionConfig: (collectionConfig: SanitizedCollectionConfig) => void;
10
+ relatedCollectionConfig: SanitizedCollectionConfig;
11
+ };
12
+ export declare const SwapUploadModal: React.FC<Props>;
13
+ export {};
@@ -0,0 +1,96 @@
1
+ import * as React from 'react';
2
+ import { Modal } from '@faceless-ui/modal';
3
+ import { useConfig } from '@payloadcms/config-provider';
4
+ import { Transforms } from 'slate';
5
+ import { ReactEditor, useSlateStatic } from 'slate-react';
6
+ import usePayloadAPI from '../../../../../../../../hooks/usePayloadAPI';
7
+ import MinimalTemplate from '../../../../../../../templates/Minimal';
8
+ import Button from '../../../../../../../elements/Button';
9
+ import Label from '../../../../../../Label';
10
+ import ReactSelect from '../../../../../../../elements/ReactSelect';
11
+ import ListControls from '../../../../../../../elements/ListControls';
12
+ import UploadGallery from '../../../../../../../elements/UploadGallery';
13
+ import Paginator from '../../../../../../../elements/Paginator';
14
+ import PerPage from '../../../../../../../elements/PerPage';
15
+ import formatFields from '../../../../../../../views/collections/List/formatFields';
16
+ import './index.scss';
17
+ const baseClass = 'swap-upload-modal';
18
+ export const SwapUploadModal = ({ closeModal, element, setRelatedCollectionConfig, relatedCollectionConfig, slug }) => {
19
+ const { collections, serverURL, routes: { api } } = useConfig();
20
+ const editor = useSlateStatic();
21
+ const [modalCollection, setModalCollection] = React.useState(relatedCollectionConfig);
22
+ const [modalCollectionOption, setModalCollectionOption] = React.useState({ label: relatedCollectionConfig.labels.singular, value: relatedCollectionConfig.slug });
23
+ const [availableCollections] = React.useState(() => collections.filter(({ admin: { enableRichTextRelationship }, upload }) => (Boolean(upload) && enableRichTextRelationship)));
24
+ const [fields, setFields] = React.useState(() => formatFields(modalCollection));
25
+ const [limit, setLimit] = React.useState();
26
+ const [sort, setSort] = React.useState(null);
27
+ const [where, setWhere] = React.useState(null);
28
+ const [page, setPage] = React.useState(null);
29
+ const moreThanOneAvailableCollection = availableCollections.length > 1;
30
+ const apiURL = `${serverURL}${api}/${modalCollection.slug}`;
31
+ const [{ data }, { setParams }] = usePayloadAPI(apiURL, {});
32
+ const handleUpdateUpload = React.useCallback((doc) => {
33
+ const newNode = {
34
+ type: 'upload',
35
+ value: { id: doc.id },
36
+ relationTo: modalCollection.slug,
37
+ children: [
38
+ { text: ' ' },
39
+ ],
40
+ };
41
+ const elementPath = ReactEditor.findPath(editor, element);
42
+ Transforms.setNodes(editor, newNode, { at: elementPath });
43
+ closeModal();
44
+ }, [closeModal, editor, element, modalCollection]);
45
+ React.useEffect(() => {
46
+ const params = {};
47
+ if (page)
48
+ params.page = page;
49
+ if (where)
50
+ params.where = where;
51
+ if (sort)
52
+ params.sort = sort;
53
+ if (limit)
54
+ params.limit = limit;
55
+ setParams(params);
56
+ }, [setParams, page, sort, where, limit]);
57
+ React.useEffect(() => {
58
+ setFields(formatFields(modalCollection));
59
+ setLimit(modalCollection.admin.pagination.defaultLimit);
60
+ }, [modalCollection]);
61
+ React.useEffect(() => {
62
+ setModalCollection(collections.find(({ slug: collectionSlug }) => modalCollectionOption.value === collectionSlug));
63
+ }, [modalCollectionOption, collections]);
64
+ return (React.createElement(Modal, { className: baseClass, slug: slug },
65
+ React.createElement(MinimalTemplate, { width: "wide" },
66
+ React.createElement("header", { className: `${baseClass}__header` },
67
+ React.createElement("h1", null,
68
+ "Choose",
69
+ ' ',
70
+ modalCollection.labels.singular),
71
+ React.createElement(Button, { icon: "x", round: true, buttonStyle: "icon-label", iconStyle: "with-border", onClick: closeModal })),
72
+ moreThanOneAvailableCollection && (React.createElement("div", { className: `${baseClass}__select-collection-wrap` },
73
+ React.createElement(Label, { label: "Select a Collection to Browse" }),
74
+ React.createElement(ReactSelect, { className: `${baseClass}__select-collection`, value: modalCollectionOption, onChange: setModalCollectionOption, options: availableCollections.map((coll) => ({ label: coll.labels.singular, value: coll.slug })) }))),
75
+ React.createElement(ListControls, { collection: {
76
+ ...modalCollection,
77
+ fields,
78
+ }, enableColumns: false, enableSort: true, modifySearchQuery: false, handleSortChange: setSort, handleWhereChange: setWhere }),
79
+ React.createElement(UploadGallery, { docs: data === null || data === void 0 ? void 0 : data.docs, collection: modalCollection, onCardClick: (doc) => {
80
+ handleUpdateUpload(doc);
81
+ setRelatedCollectionConfig(modalCollection);
82
+ closeModal();
83
+ } }),
84
+ React.createElement("div", { className: `${baseClass}__page-controls` },
85
+ React.createElement(Paginator, { limit: data.limit, totalPages: data.totalPages, page: data.page, hasPrevPage: data.hasPrevPage, hasNextPage: data.hasNextPage, prevPage: data.prevPage, nextPage: data.nextPage, numberOfNeighbors: 1, onChange: setPage, disableHistoryChange: true }),
86
+ (data === null || data === void 0 ? void 0 : data.totalDocs) > 0 && (React.createElement(React.Fragment, null,
87
+ React.createElement("div", { className: `${baseClass}__page-info` },
88
+ data.page,
89
+ "-",
90
+ data.totalPages > 1 ? data.limit : data.totalDocs,
91
+ ' ',
92
+ "of",
93
+ ' ',
94
+ data.totalDocs),
95
+ React.createElement(PerPage, { collection: modalCollection, limit: limit, modifySearchParams: false, handleChange: setLimit })))))));
96
+ };
@@ -0,0 +1,25 @@
1
+ @import '../../../../../../../../scss/styles.scss';
2
+
3
+ .swap-upload-modal {
4
+ @include blur-bg;
5
+ display: flex;
6
+ align-items: center;
7
+
8
+ .template-minimal {
9
+ padding-top: base(4);
10
+ align-items: flex-start;
11
+ }
12
+
13
+ &__header {
14
+ margin-bottom: $baseline;
15
+ display: flex;
16
+
17
+ h1 {
18
+ margin: 0 auto 0 0;
19
+ }
20
+
21
+ .btn {
22
+ margin: 0 0 0 $baseline;
23
+ }
24
+ }
25
+ }
@@ -1,10 +1,10 @@
1
1
  /// <reference types="react" />
2
2
  import './index.scss';
3
- import '../modal.scss';
4
- declare const Element: ({ attributes, children, element, path }: {
3
+ declare const Element: ({ attributes, children, element, path, fieldProps }: {
5
4
  attributes: any;
6
5
  children: any;
7
6
  element: any;
8
7
  path: any;
8
+ fieldProps: any;
9
9
  }) => JSX.Element;
10
10
  export default Element;
@@ -1,139 +1,73 @@
1
- import React, { Fragment, useState, useEffect, useCallback } from 'react';
2
- import { Modal, useModal } from '@faceless-ui/modal';
1
+ import React, { useState, useEffect, useCallback } from 'react';
2
+ import { useModal } from '@faceless-ui/modal';
3
3
  import { Transforms } from 'slate';
4
4
  import { ReactEditor, useSlateStatic, useFocused, useSelected } from 'slate-react';
5
5
  import { useConfig } from '@payloadcms/config-provider';
6
6
  import usePayloadAPI from '../../../../../../../hooks/usePayloadAPI';
7
7
  import FileGraphic from '../../../../../../graphics/File';
8
8
  import useThumbnail from '../../../../../../../hooks/useThumbnail';
9
- import MinimalTemplate from '../../../../../../templates/Minimal';
10
- import UploadGallery from '../../../../../../elements/UploadGallery';
11
- import ListControls from '../../../../../../elements/ListControls';
12
9
  import Button from '../../../../../../elements/Button';
13
- import ReactSelect from '../../../../../../elements/ReactSelect';
14
- import Paginator from '../../../../../../elements/Paginator';
15
- import formatFields from '../../../../../../views/collections/List/formatFields';
16
- import PerPage from '../../../../../../elements/PerPage';
17
- import Label from '../../../../../Label';
10
+ import { SwapUploadModal } from './SwapUploadModal';
18
11
  import './index.scss';
19
- import '../modal.scss';
12
+ import { EditModal } from './EditModal';
20
13
  const baseClass = 'rich-text-upload';
21
- const baseModalClass = 'rich-text-upload-modal';
22
14
  const initialParams = {
23
15
  depth: 0,
24
16
  };
25
- const Element = ({ attributes, children, element, path }) => {
17
+ const Element = ({ attributes, children, element, path, fieldProps }) => {
18
+ var _a, _b, _c, _d;
26
19
  const { relationTo, value } = element;
27
- const { closeAll, currentModal, open } = useModal();
20
+ const { closeAll, open } = useModal();
28
21
  const { collections, serverURL, routes: { api } } = useConfig();
29
- const [availableCollections] = useState(() => collections.filter(({ admin: { enableRichTextRelationship }, upload }) => (Boolean(upload) && enableRichTextRelationship)));
30
- const [renderModal, setRenderModal] = useState(false);
22
+ const [modalToRender, setModalToRender] = useState(undefined);
31
23
  const [relatedCollection, setRelatedCollection] = useState(() => collections.find((coll) => coll.slug === relationTo));
32
- const [modalCollectionOption, setModalCollectionOption] = useState({ label: relatedCollection.labels.singular, value: relatedCollection.slug });
33
- const [modalCollection, setModalCollection] = useState(relatedCollection);
34
- const [fields, setFields] = useState(() => formatFields(modalCollection));
35
- const [limit, setLimit] = useState();
36
- const [sort, setSort] = useState(null);
37
- const [where, setWhere] = useState(null);
38
- const [page, setPage] = useState(null);
39
24
  const editor = useSlateStatic();
40
25
  const selected = useSelected();
41
26
  const focused = useFocused();
42
- const modalSlug = `${path}-edit-upload`;
43
- const isOpen = currentModal === modalSlug;
44
- const moreThanOneAvailableCollection = availableCollections.length > 1;
27
+ const modalSlug = `${path}-edit-upload-${modalToRender}`;
45
28
  // Get the referenced document
46
29
  const [{ data: upload }] = usePayloadAPI(`${serverURL}${api}/${relatedCollection.slug}/${value === null || value === void 0 ? void 0 : value.id}`, { initialParams });
47
- // If modal is open, get active page of upload gallery
48
- const apiURL = isOpen ? `${serverURL}${api}/${modalCollection.slug}` : null;
49
- const [{ data }, { setParams }] = usePayloadAPI(apiURL, {});
50
30
  const thumbnailSRC = useThumbnail(relatedCollection, upload);
51
- const handleUpdateUpload = useCallback((doc) => {
52
- const newNode = {
53
- type: 'upload',
54
- value: { id: doc.id },
55
- relationTo: modalCollection.slug,
56
- children: [
57
- { text: ' ' },
58
- ],
59
- };
31
+ const removeUpload = useCallback(() => {
60
32
  const elementPath = ReactEditor.findPath(editor, element);
61
- Transforms.setNodes(editor, newNode, { at: elementPath });
33
+ Transforms.removeNodes(editor, { at: elementPath });
34
+ }, [editor, element]);
35
+ const closeModal = useCallback(() => {
62
36
  closeAll();
63
- }, [closeAll, editor, element, modalCollection]);
37
+ setModalToRender(null);
38
+ }, [closeAll]);
64
39
  useEffect(() => {
65
- setFields(formatFields(modalCollection));
66
- setLimit(modalCollection.admin.pagination.defaultLimit);
67
- }, [modalCollection]);
68
- useEffect(() => {
69
- if (renderModal && modalSlug) {
70
- open(modalSlug);
40
+ if (modalToRender && modalSlug) {
41
+ open(`${modalSlug}`);
71
42
  }
72
- }, [renderModal, open, modalSlug]);
73
- useEffect(() => {
74
- const params = {};
75
- if (page)
76
- params.page = page;
77
- if (where)
78
- params.where = where;
79
- if (sort)
80
- params.sort = sort;
81
- if (limit)
82
- params.limit = limit;
83
- setParams(params);
84
- }, [setParams, page, sort, where, limit]);
85
- useEffect(() => {
86
- setModalCollection(collections.find(({ slug }) => modalCollectionOption.value === slug));
87
- }, [modalCollectionOption, collections]);
43
+ }, [modalToRender, open, modalSlug]);
44
+ const fieldSchema = (_d = (_c = (_b = (_a = fieldProps === null || fieldProps === void 0 ? void 0 : fieldProps.admin) === null || _a === void 0 ? void 0 : _a.upload) === null || _b === void 0 ? void 0 : _b.collections) === null || _c === void 0 ? void 0 : _c[relatedCollection.slug]) === null || _d === void 0 ? void 0 : _d.fields;
88
45
  return (React.createElement("div", { className: [
89
46
  baseClass,
90
47
  (selected && focused) && `${baseClass}--selected`,
91
48
  ].filter(Boolean).join(' '), contentEditable: false, ...attributes },
92
- React.createElement("div", { className: `${baseClass}__thumbnail` },
93
- thumbnailSRC && (React.createElement("img", { src: thumbnailSRC, alt: upload === null || upload === void 0 ? void 0 : upload.filename })),
94
- !thumbnailSRC && (React.createElement(FileGraphic, null))),
95
- React.createElement("div", { className: `${baseClass}__wrap` },
96
- React.createElement("div", { className: `${baseClass}__label` }, relatedCollection.labels.singular),
97
- React.createElement("h5", null, upload === null || upload === void 0 ? void 0 : upload.filename)),
98
- React.createElement(Button, { icon: "edit", round: true, buttonStyle: "icon-label", iconStyle: "with-border", className: `${baseClass}__button`, onClick: (e) => {
99
- e.preventDefault();
100
- setRenderModal(true);
101
- } }),
49
+ React.createElement("div", { className: `${baseClass}__card` },
50
+ React.createElement("div", { className: `${baseClass}__topRow` },
51
+ React.createElement("div", { className: `${baseClass}__thumbnail` }, thumbnailSRC ? (React.createElement("img", { src: thumbnailSRC, alt: upload === null || upload === void 0 ? void 0 : upload.filename })) : (React.createElement(FileGraphic, null))),
52
+ React.createElement("div", { className: `${baseClass}__topRowRightPanel` },
53
+ React.createElement("div", { className: `${baseClass}__collectionLabel` }, relatedCollection.labels.singular),
54
+ React.createElement("div", { className: `${baseClass}__actions` },
55
+ fieldSchema && (React.createElement(Button, { icon: "edit", round: true, buttonStyle: "icon-label", className: `${baseClass}__actionButton`, onClick: (e) => {
56
+ e.preventDefault();
57
+ setModalToRender('edit');
58
+ }, tooltip: "Upload Fields" })),
59
+ React.createElement(Button, { icon: "swap", round: true, buttonStyle: "icon-label", className: `${baseClass}__actionButton`, onClick: (e) => {
60
+ e.preventDefault();
61
+ setModalToRender('swap');
62
+ }, tooltip: "Swap Upload" }),
63
+ React.createElement(Button, { icon: "x", round: true, buttonStyle: "icon-label", className: `${baseClass}__actionButton`, onClick: (e) => {
64
+ e.preventDefault();
65
+ removeUpload();
66
+ }, tooltip: "Remove Upload" })))),
67
+ React.createElement("div", { className: `${baseClass}__bottomRow` },
68
+ React.createElement("h5", null, upload === null || upload === void 0 ? void 0 : upload.filename))),
102
69
  children,
103
- renderModal && (React.createElement(Modal, { className: baseModalClass, slug: modalSlug }, isOpen && (React.createElement(MinimalTemplate, { width: "wide" },
104
- React.createElement("header", { className: `${baseModalClass}__header` },
105
- React.createElement("h1", null,
106
- "Choose",
107
- ' ',
108
- modalCollection.labels.singular),
109
- React.createElement(Button, { icon: "x", round: true, buttonStyle: "icon-label", iconStyle: "with-border", onClick: () => {
110
- closeAll();
111
- setRenderModal(false);
112
- } })),
113
- moreThanOneAvailableCollection && (React.createElement("div", { className: `${baseModalClass}__select-collection-wrap` },
114
- React.createElement(Label, { label: "Select a Collection to Browse" }),
115
- React.createElement(ReactSelect, { className: `${baseClass}__select-collection`, value: modalCollectionOption, onChange: setModalCollectionOption, options: availableCollections.map((coll) => ({ label: coll.labels.singular, value: coll.slug })) }))),
116
- React.createElement(ListControls, { collection: {
117
- ...modalCollection,
118
- fields,
119
- }, enableColumns: false, enableSort: true, modifySearchQuery: false, handleSortChange: setSort, handleWhereChange: setWhere }),
120
- React.createElement(UploadGallery, { docs: data === null || data === void 0 ? void 0 : data.docs, collection: modalCollection, onCardClick: (doc) => {
121
- handleUpdateUpload(doc);
122
- setRelatedCollection(modalCollection);
123
- setRenderModal(false);
124
- closeAll();
125
- } }),
126
- React.createElement("div", { className: `${baseModalClass}__page-controls` },
127
- React.createElement(Paginator, { limit: data.limit, totalPages: data.totalPages, page: data.page, hasPrevPage: data.hasPrevPage, hasNextPage: data.hasNextPage, prevPage: data.prevPage, nextPage: data.nextPage, numberOfNeighbors: 1, onChange: setPage, disableHistoryChange: true }),
128
- (data === null || data === void 0 ? void 0 : data.totalDocs) > 0 && (React.createElement(Fragment, null,
129
- React.createElement("div", { className: `${baseModalClass}__page-info` },
130
- data.page,
131
- "-",
132
- data.totalPages > 1 ? data.limit : data.totalDocs,
133
- ' ',
134
- "of",
135
- ' ',
136
- data.totalDocs),
137
- React.createElement(PerPage, { collection: modalCollection, limit: limit, modifySearchParams: false, handleChange: setLimit }))))))))));
70
+ modalToRender === 'swap' && (React.createElement(SwapUploadModal, { slug: modalSlug, element: element, closeModal: closeModal, setRelatedCollectionConfig: setRelatedCollection, relatedCollectionConfig: relatedCollection })),
71
+ (modalToRender === 'edit' && fieldSchema) && (React.createElement(EditModal, { slug: modalSlug, closeModal: closeModal, relatedCollectionConfig: relatedCollection, fieldSchema: fieldSchema, element: element }))));
138
72
  };
139
73
  export default Element;
@@ -4,33 +4,76 @@
4
4
  max-width: base(15);
5
5
  display: flex;
6
6
  align-items: center;
7
- background: $color-background-gray;
7
+ background: white;
8
8
  position: relative;
9
9
 
10
- &__button {
11
- margin: 0;
12
- position: absolute;
13
- top: base(.5);
14
- right: base(.5);
10
+ &__card {
11
+ @include soft-shadow-bottom;
12
+ display: flex;
13
+ flex-direction: column;
14
+ width: 100%;
15
15
  }
16
16
 
17
- h5 {
18
- white-space: nowrap;
19
- text-overflow: ellipsis;
20
- overflow: hidden;
17
+ &__topRow {
18
+ display: flex;
21
19
  }
22
20
 
23
21
  &__thumbnail {
24
- width: base(4);
25
- max-height: base(4);
22
+ width: base(3.25);
23
+ height: auto;
24
+ position: relative;
26
25
 
27
26
  img, svg {
27
+ position: absolute;
28
28
  object-fit: cover;
29
29
  width: 100%;
30
30
  height: 100%;
31
+ background-color: $color-dark-gray;
32
+ }
33
+ }
34
+
35
+ &__topRowRightPanel {
36
+ flex-grow: 1;
37
+ display: flex;
38
+ align-items: center;
39
+ padding: base(.75) base(1);
40
+ justify-content: space-between;
41
+ }
42
+
43
+ &__actions {
44
+ display: flex;
45
+ align-items: center;
46
+ }
47
+
48
+ &__actionButton {
49
+ margin: 0;
50
+ margin-right: base(.5);
51
+ border-radius: 0;
52
+
53
+ line {
54
+ stroke-width: $style-stroke-width-m;
55
+ }
56
+
57
+ &:last-child {
58
+ margin-right: 0;
31
59
  }
32
60
  }
33
61
 
62
+ &__collectionLabel {
63
+ margin-right: base(3);
64
+ }
65
+
66
+ &__bottomRow {
67
+ padding: base(.5);
68
+ border-top: 1px solid $color-background-gray;
69
+ }
70
+
71
+ h5 {
72
+ white-space: nowrap;
73
+ text-overflow: ellipsis;
74
+ overflow: hidden;
75
+ }
76
+
34
77
  &__wrap {
35
78
  padding: base(.5) base(.5) base(.5) base(1);
36
79
  text-align: left;
@@ -3,11 +3,12 @@ declare const _default: {
3
3
  Button: import("react").FC<{
4
4
  path: string;
5
5
  }>;
6
- Element: ({ attributes, children, element, path }: {
6
+ Element: ({ attributes, children, element, path, fieldProps }: {
7
7
  attributes: any;
8
8
  children: any;
9
9
  element: any;
10
10
  path: any;
11
+ fieldProps: any;
11
12
  }) => JSX.Element;
12
13
  plugins: ((incomingEditor: any) => any)[];
13
14
  };
@@ -107,6 +107,10 @@ $focus-box-shadow: 0 0 0 $style-stroke-width-m $color-green;
107
107
  }
108
108
  }
109
109
 
110
+ @mixin soft-shadow-bottom {
111
+ box-shadow: 0 7px 14px 0px rgb(0 0 0 / 5%);
112
+ }
113
+
110
114
  //////////////////////////////
111
115
  // STYLE MIXINS
112
116
  //////////////////////////////
@@ -31,7 +31,13 @@ async function deleteQuery(incomingArgs) {
31
31
  // /////////////////////////////////////
32
32
  // beforeDelete - Collection
33
33
  // /////////////////////////////////////
34
- collectionConfig.hooks.beforeDelete.forEach((hook) => hook({ req, id }));
34
+ await collectionConfig.hooks.beforeDelete.reduce(async (priorHook, hook) => {
35
+ await priorHook;
36
+ return hook({
37
+ req,
38
+ id,
39
+ });
40
+ }, Promise.resolve());
35
41
  // /////////////////////////////////////
36
42
  // Retrieve document
37
43
  // /////////////////////////////////////
@@ -136,4 +142,4 @@ async function deleteQuery(incomingArgs) {
136
142
  return result;
137
143
  }
138
144
  exports.default = deleteQuery;
139
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGVsZXRlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2NvbGxlY3Rpb25zL29wZXJhdGlvbnMvZGVsZXRlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7O0FBQUEsNENBQW9CO0FBQ3BCLGdEQUF3QjtBQUd4QixvR0FBNEU7QUFDNUUseUNBQXNFO0FBQ3RFLDZFQUFxRDtBQUdyRCw0Q0FBd0Q7QUFFeEQsMEVBQWtEO0FBV2xELEtBQUssVUFBVSxXQUFXLENBQUMsWUFBdUI7SUFDaEQsSUFBSSxJQUFJLEdBQUcsWUFBWSxDQUFDO0lBRXhCLHdDQUF3QztJQUN4QywrQkFBK0I7SUFDL0Isd0NBQXdDO0lBRXhDLE1BQU0sSUFBSSxDQUFDLFVBQVUsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLGVBQWUsQ0FBQyxNQUFNLENBQUMsS0FBSyxFQUFFLFNBQThDLEVBQUUsSUFBeUIsRUFBRSxFQUFFO1FBQzVJLE1BQU0sU0FBUyxDQUFDO1FBRWhCLElBQUksR0FBRyxDQUFDLE1BQU0sSUFBSSxDQUFDO1lBQ2pCLElBQUk7WUFDSixTQUFTLEVBQUUsUUFBUTtTQUNwQixDQUFDLENBQUMsSUFBSSxJQUFJLENBQUM7SUFDZCxDQUFDLEVBQUUsT0FBTyxDQUFDLE9BQU8sRUFBRSxDQUFDLENBQUM7SUFFdEIsTUFBTSxFQUNKLEtBQUssRUFDTCxVQUFVLEVBQUUsRUFDVixLQUFLLEVBQ0wsTUFBTSxFQUFFLGdCQUFnQixHQUN6QixFQUNELEVBQUUsRUFDRixHQUFHLEVBQ0gsR0FBRyxFQUFFLEVBQ0gsTUFBTSxHQUNQLEVBQ0QsY0FBYyxFQUNkLGdCQUFnQixHQUNqQixHQUFHLElBQUksQ0FBQztJQUVULHdDQUF3QztJQUN4QyxTQUFTO0lBQ1Qsd0NBQXdDO0lBRXhDLE1BQU0sYUFBYSxHQUFHLENBQUMsY0FBYyxDQUFDLENBQUMsQ0FBQyxNQUFNLElBQUEsdUJBQWEsRUFBQyxFQUFFLEdBQUcsRUFBRSxFQUFFLEVBQUUsRUFBRSxn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
145
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGVsZXRlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2NvbGxlY3Rpb25zL29wZXJhdGlvbnMvZGVsZXRlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7O0FBQUEsNENBQW9CO0FBQ3BCLGdEQUF3QjtBQUd4QixvR0FBNEU7QUFDNUUseUNBQXNFO0FBQ3RFLDZFQUFxRDtBQUdyRCw0Q0FBd0Q7QUFFeEQsMEVBQWtEO0FBV2xELEtBQUssVUFBVSxXQUFXLENBQUMsWUFBdUI7SUFDaEQsSUFBSSxJQUFJLEdBQUcsWUFBWSxDQUFDO0lBRXhCLHdDQUF3QztJQUN4QywrQkFBK0I7SUFDL0Isd0NBQXdDO0lBRXhDLE1BQU0sSUFBSSxDQUFDLFVBQVUsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLGVBQWUsQ0FBQyxNQUFNLENBQUMsS0FBSyxFQUFFLFNBQThDLEVBQUUsSUFBeUIsRUFBRSxFQUFFO1FBQzVJLE1BQU0sU0FBUyxDQUFDO1FBRWhCLElBQUksR0FBRyxDQUFDLE1BQU0sSUFBSSxDQUFDO1lBQ2pCLElBQUk7WUFDSixTQUFTLEVBQUUsUUFBUTtTQUNwQixDQUFDLENBQUMsSUFBSSxJQUFJLENBQUM7SUFDZCxDQUFDLEVBQUUsT0FBTyxDQUFDLE9BQU8sRUFBRSxDQUFDLENBQUM7SUFFdEIsTUFBTSxFQUNKLEtBQUssRUFDTCxVQUFVLEVBQUUsRUFDVixLQUFLLEVBQ0wsTUFBTSxFQUFFLGdCQUFnQixHQUN6QixFQUNELEVBQUUsRUFDRixHQUFHLEVBQ0gsR0FBRyxFQUFFLEVBQ0gsTUFBTSxHQUNQLEVBQ0QsY0FBYyxFQUNkLGdCQUFnQixHQUNqQixHQUFHLElBQUksQ0FBQztJQUVULHdDQUF3QztJQUN4QyxTQUFTO0lBQ1Qsd0NBQXdDO0lBRXhDLE1BQU0sYUFBYSxHQUFHLENBQUMsY0FBYyxDQUFDLENBQUMsQ0FBQyxNQUFNLElBQUEsdUJBQWEsRUFBQyxFQUFFLEdBQUcsRUFBRSxFQUFFLEVBQUUsRUFBRSxn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