payload 0.14.7-beta.0 → 0.14.11-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.
- package/.eslintrc.js +1 -0
- package/CHANGELOG.md +55 -2
- package/components/index.js +2 -2
- package/components/styles.css +1 -1
- package/dist/admin/components/elements/Button/index.js +10 -5
- package/dist/admin/components/elements/Button/index.scss +20 -0
- package/dist/admin/components/elements/Button/types.d.ts +1 -0
- package/dist/admin/components/elements/Tooltip/index.scss +1 -0
- package/dist/admin/components/forms/Form/reduceFieldsToValues.d.ts +1 -1
- package/dist/admin/components/forms/Form/reduceFieldsToValues.js +4 -4
- package/dist/admin/components/forms/field-types/RichText/RichText.js +4 -4
- package/dist/admin/components/forms/field-types/RichText/elements/index.d.ts +2 -1
- package/dist/admin/components/forms/field-types/RichText/elements/upload/Element/EditModal/index.d.ts +16 -0
- package/dist/admin/components/forms/field-types/RichText/elements/upload/Element/EditModal/index.js +47 -0
- package/dist/admin/components/forms/field-types/RichText/elements/upload/Element/EditModal/index.scss +41 -0
- package/dist/admin/components/forms/field-types/RichText/elements/upload/Element/SwapUploadModal/index.d.ts +13 -0
- package/dist/admin/components/forms/field-types/RichText/elements/upload/Element/SwapUploadModal/index.js +96 -0
- package/dist/admin/components/forms/field-types/RichText/elements/upload/Element/SwapUploadModal/index.scss +25 -0
- package/dist/admin/components/forms/field-types/RichText/elements/upload/Element/index.d.ts +2 -2
- package/dist/admin/components/forms/field-types/RichText/elements/upload/Element/index.js +41 -107
- package/dist/admin/components/forms/field-types/RichText/elements/upload/Element/index.scss +55 -12
- package/dist/admin/components/forms/field-types/RichText/elements/upload/index.d.ts +2 -1
- package/dist/admin/scss/vars.scss +4 -0
- package/dist/collections/operations/delete.js +8 -2
- package/dist/fields/config/schema.js +6 -1
- package/dist/fields/config/types.d.ts +7 -0
- package/dist/fields/config/types.js +1 -1
- package/dist/fields/richText/populate.d.ts +21 -0
- package/dist/fields/richText/populate.js +27 -0
- package/dist/fields/richText/recurseNestedFields.d.ts +16 -0
- package/dist/fields/richText/recurseNestedFields.js +171 -0
- package/dist/fields/richText/relationshipPromise.d.ts +27 -0
- package/dist/fields/richText/relationshipPromise.js +75 -0
- package/dist/fields/traverseFields.js +9 -9
- package/dist/graphql/schema/buildObjectType.js +3 -3
- package/docs/fields/rich-text.mdx +22 -2
- package/package.json +1 -1
- package/dist/fields/richTextRelationshipPromise.d.ts +0 -15
- package/dist/fields/richTextRelationshipPromise.js +0 -79
package/dist/admin/components/forms/field-types/RichText/elements/upload/Element/EditModal/index.js
ADDED
|
@@ -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
|
-
|
|
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, {
|
|
2
|
-
import {
|
|
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
|
|
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 '
|
|
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,
|
|
20
|
+
const { closeAll, open } = useModal();
|
|
28
21
|
const { collections, serverURL, routes: { api } } = useConfig();
|
|
29
|
-
const [
|
|
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
|
|
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.
|
|
33
|
+
Transforms.removeNodes(editor, { at: elementPath });
|
|
34
|
+
}, [editor, element]);
|
|
35
|
+
const closeModal = useCallback(() => {
|
|
62
36
|
closeAll();
|
|
63
|
-
|
|
37
|
+
setModalToRender(null);
|
|
38
|
+
}, [closeAll]);
|
|
64
39
|
useEffect(() => {
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
}, [modalCollection]);
|
|
68
|
-
useEffect(() => {
|
|
69
|
-
if (renderModal && modalSlug) {
|
|
70
|
-
open(modalSlug);
|
|
40
|
+
if (modalToRender && modalSlug) {
|
|
41
|
+
open(`${modalSlug}`);
|
|
71
42
|
}
|
|
72
|
-
}, [
|
|
73
|
-
|
|
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}
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
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
|
-
|
|
104
|
-
|
|
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:
|
|
7
|
+
background: white;
|
|
8
8
|
position: relative;
|
|
9
9
|
|
|
10
|
-
&
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
10
|
+
&__card {
|
|
11
|
+
@include soft-shadow-bottom;
|
|
12
|
+
display: flex;
|
|
13
|
+
flex-direction: column;
|
|
14
|
+
width: 100%;
|
|
15
15
|
}
|
|
16
16
|
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
text-overflow: ellipsis;
|
|
20
|
-
overflow: hidden;
|
|
17
|
+
&__topRow {
|
|
18
|
+
display: flex;
|
|
21
19
|
}
|
|
22
20
|
|
|
23
21
|
&__thumbnail {
|
|
24
|
-
width: base(
|
|
25
|
-
|
|
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.
|
|
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,
|
|
145
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGVsZXRlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2NvbGxlY3Rpb25zL29wZXJhdGlvbnMvZGVsZXRlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7O0FBQUEsNENBQW9CO0FBQ3BCLGdEQUF3QjtBQUd4QixvR0FBNEU7QUFDNUUseUNBQXNFO0FBQ3RFLDZFQUFxRDtBQUdyRCw0Q0FBd0Q7QUFFeEQsMEVBQWtEO0FBV2xELEtBQUssVUFBVSxXQUFXLENBQUMsWUFBdUI7SUFDaEQsSUFBSSxJQUFJLEdBQUcsWUFBWSxDQUFDO0lBRXhCLHdDQUF3QztJQUN4QywrQkFBK0I7SUFDL0Isd0NBQXdDO0lBRXhDLE1BQU0sSUFBSSxDQUFDLFVBQVUsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLGVBQWUsQ0FBQyxNQUFNLENBQUMsS0FBSyxFQUFFLFNBQThDLEVBQUUsSUFBeUIsRUFBRSxFQUFFO1FBQzVJLE1BQU0sU0FBUyxDQUFDO1FBRWhCLElBQUksR0FBRyxDQUFDLE1BQU0sSUFBSSxDQUFDO1lBQ2pCLElBQUk7WUFDSixTQUFTLEVBQUUsUUFBUTtTQUNwQixDQUFDLENBQUMsSUFBSSxJQUFJLENBQUM7SUFDZCxDQUFDLEVBQUUsT0FBTyxDQUFDLE9BQU8sRUFBRSxDQUFDLENBQUM7SUFFdEIsTUFBTSxFQUNKLEtBQUssRUFDTCxVQUFVLEVBQUUsRUFDVixLQUFLLEVBQ0wsTUFBTSxFQUFFLGdCQUFnQixHQUN6QixFQUNELEVBQUUsRUFDRixHQUFHLEVBQ0gsR0FBRyxFQUFFLEVBQ0gsTUFBTSxHQUNQLEVBQ0QsY0FBYyxFQUNkLGdCQUFnQixHQUNqQixHQUFHLElBQUksQ0FBQztJQUVULHdDQUF3QztJQUN4QyxTQUFTO0lBQ1Qsd0NBQXdDO0lBRXhDLE1BQU0sYUFBYSxHQUFHLENBQUMsY0FBYyxDQUFDLENBQUMsQ0FBQyxNQUFNLElBQUEsdUJBQWEsRUFBQyxFQUFFLEdBQUcsRUFBRSxFQUFFLEVBQUUsRUFBRSxn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
|