payload 0.10.3-beta.0 → 0.10.6
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/CHANGELOG.md +15 -30
- package/components/index.js +1 -1
- package/components/styles.css +1 -1
- package/dist/admin/components/elements/Button/index.js +2 -0
- package/dist/admin/components/elements/Button/types.d.ts +1 -1
- package/dist/admin/components/elements/Popup/index.js +2 -1
- package/dist/admin/components/elements/Popup/types.d.ts +1 -0
- package/dist/admin/components/elements/ReactSelect/index.js +2 -1
- package/dist/admin/components/elements/ReactSelect/types.d.ts +1 -0
- package/dist/admin/components/elements/UploadCard/index.js +2 -1
- package/dist/admin/components/elements/UploadCard/types.d.ts +1 -0
- package/dist/admin/components/forms/field-types/RichText/RichText.d.ts +18 -0
- package/dist/admin/components/forms/field-types/RichText/RichText.js +27 -22
- package/dist/admin/components/forms/field-types/RichText/elements/index.d.ts +10 -2
- package/dist/admin/components/forms/field-types/RichText/elements/index.js +2 -0
- package/dist/admin/components/forms/field-types/RichText/elements/isActive.js +2 -2
- package/dist/admin/components/forms/field-types/RichText/elements/link/index.d.ts +2 -1
- package/dist/admin/components/forms/field-types/RichText/elements/link/utilities.js +3 -3
- package/dist/admin/components/forms/field-types/RichText/elements/relationship/Button/index.js +1 -4
- package/dist/admin/components/forms/field-types/RichText/elements/relationship/Element/index.d.ts +1 -5
- package/dist/admin/components/forms/field-types/RichText/elements/relationship/Element/index.js +9 -2
- package/dist/admin/components/forms/field-types/RichText/elements/relationship/Element/index.scss +5 -0
- package/dist/admin/components/forms/field-types/RichText/elements/relationship/index.d.ts +1 -5
- package/dist/admin/components/forms/field-types/RichText/elements/toggle.js +2 -2
- package/dist/admin/components/forms/field-types/RichText/elements/upload/Button/index.d.ts +7 -0
- package/dist/admin/components/forms/field-types/RichText/elements/upload/Button/index.js +124 -0
- package/dist/admin/components/forms/field-types/RichText/elements/upload/Button/index.scss +7 -0
- package/dist/admin/components/forms/field-types/RichText/elements/upload/Element/index.d.ts +10 -0
- package/dist/admin/components/forms/field-types/RichText/elements/upload/Element/index.js +132 -0
- package/dist/admin/components/forms/field-types/RichText/elements/upload/Element/index.scss +45 -0
- package/dist/admin/components/forms/field-types/RichText/elements/upload/index.d.ts +14 -0
- package/dist/admin/components/forms/field-types/RichText/elements/upload/index.js +10 -0
- package/dist/admin/components/forms/field-types/RichText/elements/upload/modal.scss +29 -0
- package/dist/admin/components/forms/field-types/RichText/elements/upload/plugin.d.ts +2 -0
- package/dist/admin/components/forms/field-types/RichText/elements/upload/plugin.js +7 -0
- package/dist/admin/components/icons/Edit/index.d.ts +4 -0
- package/dist/admin/components/icons/Edit/index.js +7 -0
- package/dist/admin/components/icons/Edit/index.scss +12 -0
- package/dist/admin/components/icons/Upload/index.d.ts +4 -0
- package/dist/admin/components/icons/Upload/index.js +6 -0
- package/dist/admin/components/icons/Upload/index.scss +11 -0
- package/dist/admin/components/views/collections/List/formatFields.d.ts +1 -5
- package/dist/collections/buildSchema.js +4 -2
- package/dist/collections/operations/find.js +6 -2
- package/dist/collections/operations/local/update.d.ts +1 -0
- package/dist/collections/operations/local/update.js +3 -2
- package/dist/collections/operations/update.d.ts +1 -0
- package/dist/collections/operations/update.js +3 -3
- package/dist/config/schema.js +2 -1
- package/dist/fields/config/types.d.ts +1 -1
- package/dist/fields/richTextRelationshipPromise.js +2 -2
- package/dist/mongoose/buildSchema.d.ts +7 -2
- package/dist/mongoose/buildSchema.js +82 -241
- package/dist/uploads/imageResizer.js +2 -2
- package/dist/utilities/flattenWhereConstraints.d.ts +3 -0
- package/dist/utilities/flattenWhereConstraints.js +18 -0
- package/docs/fields/rich-text.mdx +7 -2
- package/docs/local-api/overview.mdx +5 -0
- package/package.json +5 -5
package/dist/admin/components/forms/field-types/RichText/elements/relationship/Button/index.js
CHANGED
|
@@ -25,14 +25,11 @@ const insertRelationship = (editor, { value, relationTo }) => {
|
|
|
25
25
|
text,
|
|
26
26
|
],
|
|
27
27
|
};
|
|
28
|
-
const nodes = [relationship, { children: [{ text: '' }] }];
|
|
28
|
+
const nodes = [relationship, { type: 'p', children: [{ text: '' }] }];
|
|
29
29
|
if (editor.blurSelection) {
|
|
30
30
|
Transforms.select(editor, editor.blurSelection);
|
|
31
31
|
}
|
|
32
32
|
Transforms.insertNodes(editor, nodes);
|
|
33
|
-
const currentPath = editor.selection.anchor.path[0];
|
|
34
|
-
const newSelection = { anchor: { path: [currentPath + 1, 0], offset: 0 }, focus: { path: [currentPath + 1, 0], offset: 0 } };
|
|
35
|
-
Transforms.select(editor, newSelection);
|
|
36
33
|
ReactEditor.focus(editor);
|
|
37
34
|
};
|
|
38
35
|
const RelationshipButton = ({ path }) => {
|
package/dist/admin/components/forms/field-types/RichText/elements/relationship/Element/index.d.ts
CHANGED
|
@@ -1,8 +1,4 @@
|
|
|
1
1
|
/// <reference types="react" />
|
|
2
2
|
import './index.scss';
|
|
3
|
-
declare const Element: (
|
|
4
|
-
attributes: any;
|
|
5
|
-
children: any;
|
|
6
|
-
element: any;
|
|
7
|
-
}) => JSX.Element;
|
|
3
|
+
declare const Element: (props: any) => JSX.Element;
|
|
8
4
|
export default Element;
|
package/dist/admin/components/forms/field-types/RichText/elements/relationship/Element/index.js
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import React, { useState } from 'react';
|
|
2
|
+
import { useFocused, useSelected } from 'slate-react';
|
|
2
3
|
import { useConfig } from '@payloadcms/config-provider';
|
|
3
4
|
import RelationshipIcon from '../../../../../../icons/Relationship';
|
|
4
5
|
import usePayloadAPI from '../../../../../../../hooks/usePayloadAPI';
|
|
@@ -7,13 +8,19 @@ const baseClass = 'rich-text-relationship';
|
|
|
7
8
|
const initialParams = {
|
|
8
9
|
depth: 0,
|
|
9
10
|
};
|
|
10
|
-
const Element = (
|
|
11
|
+
const Element = (props) => {
|
|
11
12
|
var _a;
|
|
13
|
+
const { attributes, children, element } = props;
|
|
12
14
|
const { relationTo, value } = element;
|
|
13
15
|
const { collections, serverURL, routes: { api } } = useConfig();
|
|
14
16
|
const [relatedCollection] = useState(() => collections.find((coll) => coll.slug === relationTo));
|
|
17
|
+
const selected = useSelected();
|
|
18
|
+
const focused = useFocused();
|
|
15
19
|
const [{ data }] = usePayloadAPI(`${serverURL}${api}/${relatedCollection.slug}/${value === null || value === void 0 ? void 0 : value.id}`, { initialParams });
|
|
16
|
-
return (React.createElement("div", { className:
|
|
20
|
+
return (React.createElement("div", { className: [
|
|
21
|
+
baseClass,
|
|
22
|
+
(selected && focused) && `${baseClass}--selected`,
|
|
23
|
+
].filter(Boolean).join(' '), contentEditable: false, ...attributes },
|
|
17
24
|
React.createElement(RelationshipIcon, null),
|
|
18
25
|
React.createElement("div", { className: `${baseClass}__wrap` },
|
|
19
26
|
React.createElement("div", { className: `${baseClass}__label` },
|
|
@@ -3,11 +3,7 @@ declare const _default: {
|
|
|
3
3
|
Button: import("react").FC<{
|
|
4
4
|
path: string;
|
|
5
5
|
}>;
|
|
6
|
-
Element: (
|
|
7
|
-
attributes: any;
|
|
8
|
-
children: any;
|
|
9
|
-
element: any;
|
|
10
|
-
}) => JSX.Element;
|
|
6
|
+
Element: (props: any) => JSX.Element;
|
|
11
7
|
plugins: ((incomingEditor: any) => any)[];
|
|
12
8
|
};
|
|
13
9
|
export default _default;
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { Transforms } from 'slate';
|
|
1
|
+
import { Element, Transforms } from 'slate';
|
|
2
2
|
import { ReactEditor } from 'slate-react';
|
|
3
3
|
import isElementActive from './isActive';
|
|
4
4
|
import listTypes from './listTypes';
|
|
@@ -16,7 +16,7 @@ const toggleElement = (editor, format) => {
|
|
|
16
16
|
Transforms.select(editor, editor.blurSelection);
|
|
17
17
|
}
|
|
18
18
|
Transforms.unwrapNodes(editor, {
|
|
19
|
-
match: (n) => listTypes.includes(n.type),
|
|
19
|
+
match: (n) => Element.isElement(n) && listTypes.includes(n.type),
|
|
20
20
|
split: true,
|
|
21
21
|
});
|
|
22
22
|
Transforms.setNodes(editor, { type });
|
|
@@ -0,0 +1,124 @@
|
|
|
1
|
+
import React, { Fragment, useEffect, useState } from 'react';
|
|
2
|
+
import { Modal, useModal } from '@faceless-ui/modal';
|
|
3
|
+
import { Transforms } from 'slate';
|
|
4
|
+
import { ReactEditor, useSlate } from 'slate-react';
|
|
5
|
+
import { useConfig } from '@payloadcms/config-provider';
|
|
6
|
+
import ElementButton from '../../Button';
|
|
7
|
+
import UploadIcon from '../../../../../../icons/Upload';
|
|
8
|
+
import usePayloadAPI from '../../../../../../../hooks/usePayloadAPI';
|
|
9
|
+
import UploadGallery from '../../../../../../elements/UploadGallery';
|
|
10
|
+
import ListControls from '../../../../../../elements/ListControls';
|
|
11
|
+
import ReactSelect from '../../../../../../elements/ReactSelect';
|
|
12
|
+
import Paginator from '../../../../../../elements/Paginator';
|
|
13
|
+
import formatFields from '../../../../../../views/collections/List/formatFields';
|
|
14
|
+
import Label from '../../../../../Label';
|
|
15
|
+
import MinimalTemplate from '../../../../../../templates/Minimal';
|
|
16
|
+
import Button from '../../../../../../elements/Button';
|
|
17
|
+
import './index.scss';
|
|
18
|
+
import '../modal.scss';
|
|
19
|
+
const baseClass = 'upload-rich-text-button';
|
|
20
|
+
const baseModalClass = 'rich-text-upload-modal';
|
|
21
|
+
const insertUpload = (editor, { value, relationTo }) => {
|
|
22
|
+
const text = { text: ' ' };
|
|
23
|
+
const upload = {
|
|
24
|
+
type: 'upload',
|
|
25
|
+
value,
|
|
26
|
+
relationTo,
|
|
27
|
+
children: [
|
|
28
|
+
text,
|
|
29
|
+
],
|
|
30
|
+
};
|
|
31
|
+
const nodes = [upload, { type: 'p', children: [{ text: '' }] }];
|
|
32
|
+
if (editor.blurSelection) {
|
|
33
|
+
Transforms.select(editor, editor.blurSelection);
|
|
34
|
+
}
|
|
35
|
+
Transforms.insertNodes(editor, nodes);
|
|
36
|
+
ReactEditor.focus(editor);
|
|
37
|
+
};
|
|
38
|
+
const UploadButton = ({ path }) => {
|
|
39
|
+
const { open, closeAll, currentModal } = useModal();
|
|
40
|
+
const editor = useSlate();
|
|
41
|
+
const { serverURL, routes: { api }, collections } = useConfig();
|
|
42
|
+
const [availableCollections] = useState(() => collections.filter(({ admin: { enableRichTextRelationship }, upload }) => (Boolean(upload) && enableRichTextRelationship)));
|
|
43
|
+
const [renderModal, setRenderModal] = useState(false);
|
|
44
|
+
const [modalCollectionOption, setModalCollectionOption] = useState(() => {
|
|
45
|
+
const firstAvailableCollection = collections.find(({ admin: { enableRichTextRelationship }, upload }) => (Boolean(upload) && enableRichTextRelationship));
|
|
46
|
+
return { label: firstAvailableCollection.labels.singular, value: firstAvailableCollection.slug };
|
|
47
|
+
});
|
|
48
|
+
const [modalCollection, setModalCollection] = useState(() => collections.find(({ admin: { enableRichTextRelationship }, upload }) => (Boolean(upload) && enableRichTextRelationship)));
|
|
49
|
+
const [listControls, setListControls] = useState({});
|
|
50
|
+
const [page, setPage] = useState(null);
|
|
51
|
+
const [sort, setSort] = useState(null);
|
|
52
|
+
const [fields, setFields] = useState(formatFields(modalCollection));
|
|
53
|
+
const [hasEnabledCollections] = useState(() => collections.find(({ upload, admin: { enableRichTextRelationship } }) => upload && enableRichTextRelationship));
|
|
54
|
+
const modalSlug = `${path}-add-upload`;
|
|
55
|
+
const moreThanOneAvailableCollection = availableCollections.length > 1;
|
|
56
|
+
const isOpen = currentModal === modalSlug;
|
|
57
|
+
// If modal is open, get active page of upload gallery
|
|
58
|
+
const apiURL = isOpen ? `${serverURL}${api}/${modalCollection.slug}` : null;
|
|
59
|
+
const [{ data }, { setParams }] = usePayloadAPI(apiURL, {});
|
|
60
|
+
useEffect(() => {
|
|
61
|
+
setFields(formatFields(modalCollection));
|
|
62
|
+
}, [modalCollection]);
|
|
63
|
+
useEffect(() => {
|
|
64
|
+
if (renderModal) {
|
|
65
|
+
open(modalSlug);
|
|
66
|
+
}
|
|
67
|
+
}, [renderModal, open, modalSlug]);
|
|
68
|
+
useEffect(() => {
|
|
69
|
+
const params = {};
|
|
70
|
+
if (page)
|
|
71
|
+
params.page = page;
|
|
72
|
+
if (listControls === null || listControls === void 0 ? void 0 : listControls.where)
|
|
73
|
+
params.where = listControls.where;
|
|
74
|
+
if (sort)
|
|
75
|
+
params.sort = sort;
|
|
76
|
+
setParams(params);
|
|
77
|
+
}, [setParams, page, listControls, sort]);
|
|
78
|
+
useEffect(() => {
|
|
79
|
+
setModalCollection(collections.find(({ slug }) => modalCollectionOption.value === slug));
|
|
80
|
+
}, [modalCollectionOption, collections]);
|
|
81
|
+
if (!hasEnabledCollections)
|
|
82
|
+
return null;
|
|
83
|
+
return (React.createElement(Fragment, null,
|
|
84
|
+
React.createElement(ElementButton, { className: baseClass, format: "upload", onClick: () => setRenderModal(true) },
|
|
85
|
+
React.createElement(UploadIcon, null)),
|
|
86
|
+
renderModal && (React.createElement(Modal, { className: baseModalClass, slug: modalSlug }, isOpen && (React.createElement(MinimalTemplate, { width: "wide" },
|
|
87
|
+
React.createElement("header", { className: `${baseModalClass}__header` },
|
|
88
|
+
React.createElement("h1", null,
|
|
89
|
+
"Add",
|
|
90
|
+
' ',
|
|
91
|
+
modalCollection.labels.singular),
|
|
92
|
+
React.createElement(Button, { icon: "x", round: true, buttonStyle: "icon-label", iconStyle: "with-border", onClick: () => {
|
|
93
|
+
closeAll();
|
|
94
|
+
setRenderModal(false);
|
|
95
|
+
} })),
|
|
96
|
+
moreThanOneAvailableCollection && (React.createElement("div", { className: `${baseModalClass}__select-collection-wrap` },
|
|
97
|
+
React.createElement(Label, { label: "Select a Collection to Browse" }),
|
|
98
|
+
React.createElement(ReactSelect, { className: `${baseClass}__select-collection`, value: modalCollectionOption, onChange: setModalCollectionOption, options: availableCollections.map((coll) => ({ label: coll.labels.singular, value: coll.slug })) }))),
|
|
99
|
+
React.createElement(ListControls, { handleChange: setListControls, collection: {
|
|
100
|
+
...modalCollection,
|
|
101
|
+
fields,
|
|
102
|
+
}, enableColumns: false, setSort: setSort, enableSort: true }),
|
|
103
|
+
React.createElement(UploadGallery, { docs: data === null || data === void 0 ? void 0 : data.docs, collection: modalCollection, onCardClick: (doc) => {
|
|
104
|
+
insertUpload(editor, {
|
|
105
|
+
value: {
|
|
106
|
+
id: doc.id,
|
|
107
|
+
},
|
|
108
|
+
relationTo: modalCollection.slug,
|
|
109
|
+
});
|
|
110
|
+
setRenderModal(false);
|
|
111
|
+
closeAll();
|
|
112
|
+
} }),
|
|
113
|
+
React.createElement("div", { className: `${baseClass}__page-controls` },
|
|
114
|
+
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 }),
|
|
115
|
+
(data === null || data === void 0 ? void 0 : data.totalDocs) > 0 && (React.createElement("div", { className: `${baseClass}__page-info` },
|
|
116
|
+
data.page,
|
|
117
|
+
"-",
|
|
118
|
+
data.totalPages > 1 ? data.limit : data.totalDocs,
|
|
119
|
+
' ',
|
|
120
|
+
"of",
|
|
121
|
+
' ',
|
|
122
|
+
data.totalDocs)))))))));
|
|
123
|
+
};
|
|
124
|
+
export default UploadButton;
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
/// <reference types="react" />
|
|
2
|
+
import './index.scss';
|
|
3
|
+
import '../modal.scss';
|
|
4
|
+
declare const Element: ({ attributes, children, element, path }: {
|
|
5
|
+
attributes: any;
|
|
6
|
+
children: any;
|
|
7
|
+
element: any;
|
|
8
|
+
path: any;
|
|
9
|
+
}) => JSX.Element;
|
|
10
|
+
export default Element;
|
|
@@ -0,0 +1,132 @@
|
|
|
1
|
+
import React, { useState, useEffect, useCallback } from 'react';
|
|
2
|
+
import { Modal, useModal } from '@faceless-ui/modal';
|
|
3
|
+
import { Transforms } from 'slate';
|
|
4
|
+
import { ReactEditor, useSlateStatic, useFocused, useSelected } from 'slate-react';
|
|
5
|
+
import { useConfig } from '@payloadcms/config-provider';
|
|
6
|
+
import usePayloadAPI from '../../../../../../../hooks/usePayloadAPI';
|
|
7
|
+
import FileGraphic from '../../../../../../graphics/File';
|
|
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
|
+
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 Label from '../../../../../Label';
|
|
17
|
+
import './index.scss';
|
|
18
|
+
import '../modal.scss';
|
|
19
|
+
const baseClass = 'rich-text-upload';
|
|
20
|
+
const baseModalClass = 'rich-text-upload-modal';
|
|
21
|
+
const initialParams = {
|
|
22
|
+
depth: 0,
|
|
23
|
+
};
|
|
24
|
+
const Element = ({ attributes, children, element, path }) => {
|
|
25
|
+
const { relationTo, value } = element;
|
|
26
|
+
const { closeAll, currentModal, open } = useModal();
|
|
27
|
+
const { collections, serverURL, routes: { api } } = useConfig();
|
|
28
|
+
const [availableCollections] = useState(() => collections.filter(({ admin: { enableRichTextRelationship }, upload }) => (Boolean(upload) && enableRichTextRelationship)));
|
|
29
|
+
const [renderModal, setRenderModal] = useState(false);
|
|
30
|
+
const [relatedCollection, setRelatedCollection] = useState(() => collections.find((coll) => coll.slug === relationTo));
|
|
31
|
+
const [modalCollectionOption, setModalCollectionOption] = useState({ label: relatedCollection.labels.singular, value: relatedCollection.slug });
|
|
32
|
+
const [modalCollection, setModalCollection] = useState(relatedCollection);
|
|
33
|
+
const [listControls, setListControls] = useState({});
|
|
34
|
+
const [page, setPage] = useState(null);
|
|
35
|
+
const [sort, setSort] = useState(null);
|
|
36
|
+
const [fields, setFields] = useState(formatFields(relatedCollection));
|
|
37
|
+
const editor = useSlateStatic();
|
|
38
|
+
const selected = useSelected();
|
|
39
|
+
const focused = useFocused();
|
|
40
|
+
const modalSlug = `${path}-edit-upload`;
|
|
41
|
+
const isOpen = currentModal === modalSlug;
|
|
42
|
+
const moreThanOneAvailableCollection = availableCollections.length > 1;
|
|
43
|
+
// Get the referenced document
|
|
44
|
+
const [{ data: upload }] = usePayloadAPI(`${serverURL}${api}/${relatedCollection.slug}/${value === null || value === void 0 ? void 0 : value.id}`, { initialParams });
|
|
45
|
+
// If modal is open, get active page of upload gallery
|
|
46
|
+
const apiURL = isOpen ? `${serverURL}${api}/${modalCollection.slug}` : null;
|
|
47
|
+
const [{ data }, { setParams }] = usePayloadAPI(apiURL, {});
|
|
48
|
+
const thumbnailSRC = useThumbnail(relatedCollection, upload);
|
|
49
|
+
const handleUpdateUpload = useCallback((doc) => {
|
|
50
|
+
const newNode = {
|
|
51
|
+
type: 'upload',
|
|
52
|
+
value: { id: doc.id },
|
|
53
|
+
relationTo: modalCollection.slug,
|
|
54
|
+
children: [
|
|
55
|
+
{ text: ' ' },
|
|
56
|
+
],
|
|
57
|
+
};
|
|
58
|
+
const elementPath = ReactEditor.findPath(editor, element);
|
|
59
|
+
Transforms.setNodes(editor, newNode, { at: elementPath });
|
|
60
|
+
closeAll();
|
|
61
|
+
}, [closeAll, editor, element, modalCollection]);
|
|
62
|
+
useEffect(() => {
|
|
63
|
+
setFields(formatFields(relatedCollection));
|
|
64
|
+
}, [relatedCollection]);
|
|
65
|
+
useEffect(() => {
|
|
66
|
+
if (renderModal && modalSlug) {
|
|
67
|
+
open(modalSlug);
|
|
68
|
+
}
|
|
69
|
+
}, [renderModal, open, modalSlug]);
|
|
70
|
+
useEffect(() => {
|
|
71
|
+
const params = {};
|
|
72
|
+
if (page)
|
|
73
|
+
params.page = page;
|
|
74
|
+
if (listControls === null || listControls === void 0 ? void 0 : listControls.where)
|
|
75
|
+
params.where = listControls.where;
|
|
76
|
+
if (sort)
|
|
77
|
+
params.sort = sort;
|
|
78
|
+
setParams(params);
|
|
79
|
+
}, [setParams, page, listControls, sort]);
|
|
80
|
+
useEffect(() => {
|
|
81
|
+
setModalCollection(collections.find(({ slug }) => modalCollectionOption.value === slug));
|
|
82
|
+
}, [modalCollectionOption, collections]);
|
|
83
|
+
return (React.createElement("div", { className: [
|
|
84
|
+
baseClass,
|
|
85
|
+
(selected && focused) && `${baseClass}--selected`,
|
|
86
|
+
].filter(Boolean).join(' '), contentEditable: false, ...attributes },
|
|
87
|
+
React.createElement("div", { className: `${baseClass}__thumbnail` },
|
|
88
|
+
thumbnailSRC && (React.createElement("img", { src: thumbnailSRC, alt: upload === null || upload === void 0 ? void 0 : upload.filename })),
|
|
89
|
+
!thumbnailSRC && (React.createElement(FileGraphic, null))),
|
|
90
|
+
React.createElement("div", { className: `${baseClass}__wrap` },
|
|
91
|
+
React.createElement("div", { className: `${baseClass}__label` }, relatedCollection.labels.singular),
|
|
92
|
+
React.createElement("h5", null, upload === null || upload === void 0 ? void 0 : upload.filename)),
|
|
93
|
+
React.createElement(Button, { icon: "edit", round: true, buttonStyle: "icon-label", iconStyle: "with-border", className: `${baseClass}__button`, onClick: (e) => {
|
|
94
|
+
e.preventDefault();
|
|
95
|
+
setRenderModal(true);
|
|
96
|
+
} }),
|
|
97
|
+
children,
|
|
98
|
+
renderModal && (React.createElement(Modal, { className: baseModalClass, slug: modalSlug }, isOpen && (React.createElement(MinimalTemplate, { width: "wide" },
|
|
99
|
+
React.createElement("header", { className: `${baseModalClass}__header` },
|
|
100
|
+
React.createElement("h1", null,
|
|
101
|
+
"Choose",
|
|
102
|
+
' ',
|
|
103
|
+
modalCollection.labels.singular),
|
|
104
|
+
React.createElement(Button, { icon: "x", round: true, buttonStyle: "icon-label", iconStyle: "with-border", onClick: () => {
|
|
105
|
+
closeAll();
|
|
106
|
+
setRenderModal(false);
|
|
107
|
+
} })),
|
|
108
|
+
moreThanOneAvailableCollection && (React.createElement("div", { className: `${baseModalClass}__select-collection-wrap` },
|
|
109
|
+
React.createElement(Label, { label: "Select a Collection to Browse" }),
|
|
110
|
+
React.createElement(ReactSelect, { className: `${baseClass}__select-collection`, value: modalCollectionOption, onChange: setModalCollectionOption, options: availableCollections.map((coll) => ({ label: coll.labels.singular, value: coll.slug })) }))),
|
|
111
|
+
React.createElement(ListControls, { handleChange: setListControls, collection: {
|
|
112
|
+
...modalCollection,
|
|
113
|
+
fields,
|
|
114
|
+
}, enableColumns: false, setSort: setSort, enableSort: true }),
|
|
115
|
+
React.createElement(UploadGallery, { docs: data === null || data === void 0 ? void 0 : data.docs, collection: modalCollection, onCardClick: (doc) => {
|
|
116
|
+
handleUpdateUpload(doc);
|
|
117
|
+
setRelatedCollection(modalCollection);
|
|
118
|
+
setRenderModal(false);
|
|
119
|
+
closeAll();
|
|
120
|
+
} }),
|
|
121
|
+
React.createElement("div", { className: `${baseClass}__page-controls` },
|
|
122
|
+
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 }),
|
|
123
|
+
(data === null || data === void 0 ? void 0 : data.totalDocs) > 0 && (React.createElement("div", { className: `${baseClass}__page-info` },
|
|
124
|
+
data.page,
|
|
125
|
+
"-",
|
|
126
|
+
data.totalPages > 1 ? data.limit : data.totalDocs,
|
|
127
|
+
' ',
|
|
128
|
+
"of",
|
|
129
|
+
' ',
|
|
130
|
+
data.totalDocs)))))))));
|
|
131
|
+
};
|
|
132
|
+
export default Element;
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
@import '../../../../../../../scss/styles.scss';
|
|
2
|
+
|
|
3
|
+
.rich-text-upload {
|
|
4
|
+
max-width: base(15);
|
|
5
|
+
display: flex;
|
|
6
|
+
align-items: center;
|
|
7
|
+
background: $color-background-gray;
|
|
8
|
+
position: relative;
|
|
9
|
+
|
|
10
|
+
&__button {
|
|
11
|
+
margin: 0;
|
|
12
|
+
position: absolute;
|
|
13
|
+
top: base(.5);
|
|
14
|
+
right: base(.5);
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
h5 {
|
|
18
|
+
white-space: nowrap;
|
|
19
|
+
text-overflow: ellipsis;
|
|
20
|
+
overflow: hidden;
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
&__thumbnail {
|
|
24
|
+
width: base(4);
|
|
25
|
+
max-height: base(4);
|
|
26
|
+
|
|
27
|
+
img, svg {
|
|
28
|
+
object-fit: cover;
|
|
29
|
+
width: 100%;
|
|
30
|
+
height: 100%;
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
&__wrap {
|
|
35
|
+
padding: base(.5) base(.5) base(.5) base(1);
|
|
36
|
+
text-align: left;
|
|
37
|
+
overflow: hidden;
|
|
38
|
+
text-overflow: ellipsis;
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
&--selected {
|
|
42
|
+
box-shadow: $focus-box-shadow;
|
|
43
|
+
outline: none;
|
|
44
|
+
}
|
|
45
|
+
}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
/// <reference types="react" />
|
|
2
|
+
declare const _default: {
|
|
3
|
+
Button: import("react").FC<{
|
|
4
|
+
path: string;
|
|
5
|
+
}>;
|
|
6
|
+
Element: ({ attributes, children, element, path }: {
|
|
7
|
+
attributes: any;
|
|
8
|
+
children: any;
|
|
9
|
+
element: any;
|
|
10
|
+
path: any;
|
|
11
|
+
}) => JSX.Element;
|
|
12
|
+
plugins: ((incomingEditor: any) => any)[];
|
|
13
|
+
};
|
|
14
|
+
export default _default;
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
@import '../../../../../../scss/styles.scss';
|
|
2
|
+
|
|
3
|
+
.rich-text-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
|
+
&__select-collection-wrap {
|
|
27
|
+
margin-bottom: base(1);
|
|
28
|
+
}
|
|
29
|
+
}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
import './index.scss';
|
|
3
|
+
const Edit = () => (React.createElement("svg", { className: "icon icon--edit", xmlns: "http://www.w3.org/2000/svg", viewBox: "0 0 25 25" },
|
|
4
|
+
React.createElement("polygon", { className: "fill", points: "16.92 16.86 8.25 16.86 8.25 8.21 12.54 8.21 12.54 6.63 6.68 6.63 6.68 18.43 18.5 18.43 18.5 12.53 16.92 12.53 16.92 16.86" }),
|
|
5
|
+
React.createElement("polygon", { className: "fill", points: "16.31 7.33 17.42 8.44 12.66 13.2 11.51 13.24 11.55 12.09 16.31 7.33" }),
|
|
6
|
+
React.createElement("rect", { className: "fill", x: "16.94", y: "6.44", width: "1.58", height: "1.15", transform: "translate(10.16 -10.48) rotate(45)" })));
|
|
7
|
+
export default Edit;
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
import './index.scss';
|
|
3
|
+
const Upload = () => (React.createElement("svg", { className: "icon icon--upload", xmlns: "http://www.w3.org/2000/svg", viewBox: "0 0 25 25" },
|
|
4
|
+
React.createElement("path", { d: "M20.06,5.12h-15v15h15Zm-2,2v7L15.37,11l-3.27,4.1-2-1.58-3,3.74V7.12Z", className: "fill" }),
|
|
5
|
+
React.createElement("circle", { cx: "9.69", cy: "9.47", r: "0.97", className: "fill" })));
|
|
6
|
+
export default Upload;
|
|
@@ -1,8 +1,4 @@
|
|
|
1
1
|
import { SanitizedCollectionConfig } from '../../../../../collections/config/types';
|
|
2
2
|
import { Field } from '../../../../../fields/config/types';
|
|
3
|
-
declare const formatFields: (config: SanitizedCollectionConfig) =>
|
|
4
|
-
name: string;
|
|
5
|
-
label: string;
|
|
6
|
-
type: string;
|
|
7
|
-
})[];
|
|
3
|
+
declare const formatFields: (config: SanitizedCollectionConfig) => Field[];
|
|
8
4
|
export default formatFields;
|
|
@@ -7,10 +7,12 @@ const mongoose_paginate_v2_1 = __importDefault(require("mongoose-paginate-v2"));
|
|
|
7
7
|
const buildQuery_1 = __importDefault(require("../mongoose/buildQuery"));
|
|
8
8
|
const buildSchema_1 = __importDefault(require("../mongoose/buildSchema"));
|
|
9
9
|
const buildCollectionSchema = (collection, config, schemaOptions = {}) => {
|
|
10
|
-
const schema = buildSchema_1.default(config, collection.fields, {
|
|
10
|
+
const schema = buildSchema_1.default(config, collection.fields, {
|
|
11
|
+
options: { timestamps: collection.timestamps !== false, ...schemaOptions },
|
|
12
|
+
});
|
|
11
13
|
schema.plugin(mongoose_paginate_v2_1.default, { useEstimatedCount: true })
|
|
12
14
|
.plugin(buildQuery_1.default);
|
|
13
15
|
return schema;
|
|
14
16
|
};
|
|
15
17
|
exports.default = buildCollectionSchema;
|
|
16
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
18
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYnVpbGRTY2hlbWEuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvY29sbGVjdGlvbnMvYnVpbGRTY2hlbWEudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFBQSxnRkFBNEM7QUFHNUMsd0VBQXNEO0FBQ3RELDBFQUFrRDtBQUdsRCxNQUFNLHFCQUFxQixHQUFHLENBQUMsVUFBcUMsRUFBRSxNQUF1QixFQUFFLGFBQWEsR0FBRyxFQUFFLEVBQVUsRUFBRTtJQUMzSCxNQUFNLE1BQU0sR0FBRyxxQkFBVyxDQUN4QixNQUFNLEVBQ04sVUFBVSxDQUFDLE1BQU0sRUFDakI7UUFDRSxPQUFPLEVBQUUsRUFBRSxVQUFVLEVBQUUsVUFBVSxDQUFDLFVBQVUsS0FBSyxLQUFLLEVBQUUsR0FBRyxhQUFhLEVBQUU7S0FDM0UsQ0FDRixDQUFDO0lBRUYsTUFBTSxDQUFDLE1BQU0sQ0FBQyw4QkFBUSxFQUFFLEVBQUUsaUJBQWlCLEVBQUUsSUFBSSxFQUFFLENBQUM7U0FDakQsTUFBTSxDQUFDLG9CQUFnQixDQUFDLENBQUM7SUFFNUIsT0FBTyxNQUFNLENBQUM7QUFDaEIsQ0FBQyxDQUFDO0FBRUYsa0JBQWUscUJBQXFCLENBQUMifQ==
|
|
@@ -6,6 +6,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
6
6
|
const executeAccess_1 = __importDefault(require("../../auth/executeAccess"));
|
|
7
7
|
const sanitizeInternalFields_1 = __importDefault(require("../../utilities/sanitizeInternalFields"));
|
|
8
8
|
const types_1 = require("../../auth/types");
|
|
9
|
+
const flattenWhereConstraints_1 = __importDefault(require("../../utilities/flattenWhereConstraints"));
|
|
9
10
|
async function find(incomingArgs) {
|
|
10
11
|
let args = incomingArgs;
|
|
11
12
|
// /////////////////////////////////////
|
|
@@ -23,6 +24,7 @@ async function find(incomingArgs) {
|
|
|
23
24
|
// Access
|
|
24
25
|
// /////////////////////////////////////
|
|
25
26
|
const queryToBuild = {};
|
|
27
|
+
let useEstimatedCount = false;
|
|
26
28
|
if (where) {
|
|
27
29
|
let and = [];
|
|
28
30
|
if (Array.isArray(where.and))
|
|
@@ -35,6 +37,8 @@ async function find(incomingArgs) {
|
|
|
35
37
|
...and,
|
|
36
38
|
],
|
|
37
39
|
};
|
|
40
|
+
const constraints = flattenWhereConstraints_1.default(queryToBuild);
|
|
41
|
+
useEstimatedCount = constraints.some((prop) => Object.keys(prop).some((key) => key === 'near'));
|
|
38
42
|
}
|
|
39
43
|
if (!overrideAccess) {
|
|
40
44
|
const accessResults = await executeAccess_1.default({ req }, collectionConfig.access.read);
|
|
@@ -73,7 +77,7 @@ async function find(incomingArgs) {
|
|
|
73
77
|
sort,
|
|
74
78
|
lean: true,
|
|
75
79
|
leanWithId: true,
|
|
76
|
-
useEstimatedCount
|
|
80
|
+
useEstimatedCount,
|
|
77
81
|
};
|
|
78
82
|
const paginatedDocs = await Model.paginate(query, optionsToExecute);
|
|
79
83
|
// /////////////////////////////////////
|
|
@@ -132,4 +136,4 @@ async function find(incomingArgs) {
|
|
|
132
136
|
return result;
|
|
133
137
|
}
|
|
134
138
|
exports.default = find;
|
|
135
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
139
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmluZC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9jb2xsZWN0aW9ucy9vcGVyYXRpb25zL2ZpbmQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFFQSw2RUFBcUQ7QUFDckQsb0dBQTRFO0FBRTVFLDRDQUF3RDtBQUN4RCxzR0FBOEU7QUFjOUUsS0FBSyxVQUFVLElBQUksQ0FBQyxZQUF1QjtJQUN6QyxJQUFJLElBQUksR0FBRyxZQUFZLENBQUM7SUFFeEIsd0NBQXdDO0lBQ3hDLCtCQUErQjtJQUMvQix3Q0FBd0M7SUFFeEMsTUFBTSxJQUFJLENBQUMsVUFBVSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsZUFBZSxDQUFDLE1BQU0sQ0FBQyxLQUFLLEVBQUUsU0FBUyxFQUFFLElBQUksRUFBRSxFQUFFO1FBQ2xGLE1BQU0sU0FBUyxDQUFDO1FBRWhCLElBQUksR0FBRyxDQUFDLE1BQU0sSUFBSSxDQUFDO1lBQ2pCLElBQUk7WUFDSixTQUFTLEVBQUUsTUFBTTtTQUNsQixDQUFDLENBQUMsSUFBSSxJQUFJLENBQUM7SUFDZCxDQUFDLEVBQUUsT0FBTyxDQUFDLE9BQU8sRUFBRSxDQUFDLENBQUM7SUFFdEIsTUFBTSxFQUNKLEtBQUssRUFDTCxJQUFJLEVBQ0osS0FBSyxFQUNMLEtBQUssRUFDTCxVQUFVLEVBQUUsRUFDVixLQUFLLEVBQ0wsTUFBTSxFQUFFLGdCQUFnQixHQUN6QixFQUNELEdBQUcsRUFDSCxHQUFHLEVBQUUsRUFDSCxNQUFNLEdBQ1AsRUFDRCxjQUFjLEVBQ2QsZ0JBQWdCLEdBQ2pCLEdBQUcsSUFBSSxDQUFDO0lBRVQsd0NBQXdDO0lBQ3hDLFNBQVM7SUFDVCx3Q0FBd0M7SUFFeEMsTUFBTSxZQUFZLEdBQXFCLEVBQUUsQ0FBQztJQUMxQyxJQUFJLGlCQUFpQixHQUFHLEtBQUssQ0FBQztJQUU5QixJQUFJLEtBQUssRUFBRTtRQUNULElBQUksR0FBRyxHQUFHLEVBQUUsQ0FBQztRQUViLElBQUksS0FBSyxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDO1lBQUUsR0FBRyxHQUFHLEtBQUssQ0FBQyxHQUFHLENBQUM7UUFDOUMsSUFBSSxLQUFLLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUM7WUFBRSxHQUFHLEdBQUcsS0FBSyxDQUFDLEdBQUcsQ0FBQztRQUU5QyxZQUFZLENBQUMsS0FBSyxHQUFHO1lBQ25CLEdBQUcsS0FBSztZQUNSLEdBQUcsRUFBRTtnQkFDSCxHQUFHLEdBQUc7YUFDUDtTQUNGLENBQUM7UUFFRixNQUFNLFdBQVcsR0FBRyxpQ0FBdUIsQ0FBQyxZQUFZLENBQUMsQ0FBQztRQUUxRCxpQkFBaUIsR0FBRyxXQUFXLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxFQUFFLEVBQUUsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLEdBQUcsRUFBRSxFQUFFLENBQUMsR0FBRyxLQUFLLE1BQU0sQ0FBQyxDQUFDLENBQUM7S0FDakc7SUFFRCxJQUFJLENBQUMsY0FBYyxFQUFFO1FBQ25CLE1BQU0sYUFBYSxHQUFHLE1BQU0sdUJBQWEsQ0FBQyxFQUFFLEdBQUcsRUFBRSxFQUFFLGdCQUFnQixDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUVqRixJQUFJLDRCQUFvQixDQUFDLGFBQWEsQ0FBQyxFQUFFO1lBQ3ZDLElBQUksQ0FBQyxLQUFLLEVBQUU7Z0JBQ1YsWUFBWSxDQUFDLEtBQUssR0FBRztvQkFDbkIsR0FBRyxFQUFFO3dCQUNILGFBQWE7cUJBQ2Q7aUJBQ0YsQ0FBQzthQUNIO2lCQUFNO2dCQUNKLFlBQVksQ0FBQyxLQUFLLENBQUMsR0FBZSxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsQ0FBQzthQUN6RDtTQUNGO0tBQ0Y7SUFFRCxNQUFNLEtBQUssR0FBRyxNQUFNLEtBQUssQ0FBQyxVQUFVLENBQUMsWUFBWSxFQUFFLE1BQU0sQ0FBQyxDQUFDO0lBRTNELHdDQUF3QztJQUN4QyxPQUFPO0lBQ1Asd0NBQXdDO0lBRXhDLElBQUksRUFBRSxJQUFJLEVBQUUsR0FBRyxJQUFJLENBQUM7SUFFcEIsSUFBSSxDQUFDLElBQUksRUFBRTtRQUNULElBQUksZ0JBQWdCLENBQUMsVUFBVSxFQUFFO1lBQy9CLElBQUksR0FBRyxZQUFZLENBQUM7U0FDckI7YUFBTTtZQUNMLElBQUksR0FBRyxNQUFNLENBQUM7U0FDZjtLQUNGO1NBQU0sSUFBSSxJQUFJLEtBQUssSUFBSSxJQUFJLElBQUksS0FBSyxLQUFLLEVBQUU7UUFDMUMsSUFBSSxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxFQUFFLEtBQUssQ0FBQyxDQUFDO0tBQ2xDO0lBRUQsTUFBTSxnQkFBZ0IsR0FBRztRQUN2QixJQUFJLEVBQUUsSUFBSSxJQUFJLENBQUM7UUFDZixLQUFLLEVBQUUsS0FBSyxJQUFJLEVBQUU7UUFDbEIsSUFBSTtRQUNKLElBQUksRUFBRSxJQUFJO1FBQ1YsVUFBVSxFQUFFLElBQUk7UUFDaEIsaUJBQWlCO0tBQ2xCLENBQUM7SUFFRixNQUFNLGFBQWEsR0FBRyxNQUFNLEtBQUssQ0FBQyxRQUFRLENBQUMsS0FBSyxFQUFFLGdCQUFnQixDQUFDLENBQUM7SUFFcEUsd0NBQXdDO0lBQ3hDLDBCQUEwQjtJQUMxQix3Q0FBd0M7SUFFeEMsSUFBSSxNQUFNLEdBQUc7UUFDWCxHQUFHLGFBQWE7UUFDaEIsSUFBSSxFQUFFLE1BQU0sT0FBTyxDQUFDLEdBQUcsQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxLQUFLLEVBQUUsR0FBRyxFQUFFLEVBQUU7WUFDM0QsTUFBTSxTQUFTLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUN0QyxJQUFJLE1BQU0sR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLFNBQVMsQ0FBQyxDQUFDO1lBRW5DLE1BQU0sZ0JBQWdCLENBQUMsS0FBSyxDQUFDLFVBQVUsQ0FBQyxNQUFNLENBQUMsS0FBSyxFQUFFLFNBQVMsRUFBRSxJQUFJLEVBQUUsRUFBRTtnQkFDdkUsTUFBTSxTQUFTLENBQUM7Z0JBRWhCLE1BQU0sR0FBRyxNQUFNLElBQUksQ0FBQyxFQUFFLEdBQUcsRUFBRSxLQUFLLEVBQUUsR0FBRyxFQUFFLE1BQU0sRUFBRSxDQUFDLElBQUksTUFBTSxDQUFDO1lBQzdELENBQUMsRUFBRSxPQUFPLENBQUMsT0FBTyxFQUFFLENBQUMsQ0FBQztZQUV0QixPQUFPLE1BQU0sQ0FBQztRQUNoQixDQUFDLENBQUMsQ0FBQztLQUNhLENBQUM7SUFFbkIsd0NBQXdDO0lBQ3hDLHFCQUFxQjtJQUNyQix3Q0FBd0M7SUFFeEMsTUFBTSxHQUFHO1FBQ1AsR0FBRyxNQUFNO1FBQ1QsSUFBSSxFQUFFLE1BQU0sT0FBTyxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxLQUFLLEVBQUUsSUFBSSxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsc0JBQXNCLENBQ2pGLGdCQUFnQixFQUNoQjtZQUNFLEtBQUs7WUFDTCxJQUFJO1lBQ0osR0FBRztZQUNILEVBQUUsRUFBRSxJQUFJLENBQUMsRUFBRTtZQUNYLElBQUksRUFBRSxXQUFXO1lBQ2pCLFNBQVMsRUFBRSxNQUFNO1lBQ2pCLGNBQWM7WUFDZCxjQUFjLEVBQUUsSUFBSTtZQUNwQixnQkFBZ0I7U0FDakIsRUFDRCxJQUFJLENBQ0wsQ0FBQyxDQUFDO0tBQ0osQ0FBQztJQUVGLHdDQUF3QztJQUN4Qyx5QkFBeUI7SUFDekIsd0NBQXdDO0lBRXhDLE1BQU0sR0FBRztRQUNQLEdBQUcsTUFBTTtRQUNULElBQUksRUFBRSxNQUFNLE9BQU8sQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsS0FBSyxFQUFFLEdBQUcsRUFBRSxFQUFFO1lBQ3BELElBQUksTUFBTSxHQUFHLEdBQUcsQ0FBQztZQUVqQixNQUFNLGdCQUFnQixDQUFDLEtBQUssQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLEtBQUssRUFBRSxTQUFTLEVBQUUsSUFBSSxFQUFFLEVBQUU7Z0JBQ3RFLE1BQU0sU0FBUyxDQUFDO2dCQUVoQixNQUFNLEdBQUcsTUFBTSxJQUFJLENBQUMsRUFBRSxHQUFHLEVBQUUsS0FBSyxFQUFFLEdBQUcsRUFBRSxDQUFDLElBQUksR0FBRyxDQUFDO1lBQ2xELENBQUMsRUFBRSxPQUFPLENBQUMsT0FBTyxFQUFFLENBQUMsQ0FBQztZQUV0QixPQUFPLE1BQU0sQ0FBQztRQUNoQixDQUFDLENBQUMsQ0FBQztLQUNKLENBQUM7SUFFRix3Q0FBd0M7SUFDeEMsaUJBQWlCO0lBQ2pCLHdDQUF3QztJQUV4QyxNQUFNLEdBQUc7UUFDUCxHQUFHLE1BQU07UUFDVCxJQUFJLEVBQUUsTUFBTSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLEVBQUUsRUFBRSxDQUFDLGdDQUFzQixDQUFDLEdBQUcsQ0FBQyxDQUFDO0tBQzVELENBQUM7SUFFRixPQUFPLE1BQU0sQ0FBQztBQUNoQixDQUFDO0FBRUQsa0JBQWUsSUFBSSxDQUFDIn0=
|