payload 1.1.10 → 1.1.11
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/dist/admin/components/elements/DuplicateDocument/index.js +9 -2
- package/dist/admin/components/forms/field-types/Array/index.js +1 -1
- package/dist/admin/components/forms/field-types/Blocks/index.js +3 -3
- package/dist/collections/config/schema.js +4 -1
- package/dist/collections/config/types.d.ts +11 -0
- package/docs/configuration/collections.mdx +45 -0
- package/package.json +1 -1
|
@@ -25,11 +25,18 @@ const Duplicate = ({ slug, collection, id }) => {
|
|
|
25
25
|
return;
|
|
26
26
|
}
|
|
27
27
|
const create = async (locale = '') => {
|
|
28
|
+
var _a;
|
|
28
29
|
const response = await requests.get(`${serverURL}${api}/${slug}/${id}`, {
|
|
29
30
|
locale,
|
|
30
31
|
depth: 0,
|
|
31
32
|
});
|
|
32
|
-
|
|
33
|
+
let data = await response.json();
|
|
34
|
+
if (typeof ((_a = collection.admin.hooks) === null || _a === void 0 ? void 0 : _a.beforeDuplicate) === 'function') {
|
|
35
|
+
data = await collection.admin.hooks.beforeDuplicate({
|
|
36
|
+
data,
|
|
37
|
+
locale,
|
|
38
|
+
});
|
|
39
|
+
}
|
|
33
40
|
const result = await requests.post(`${serverURL}${api}/${slug}`, {
|
|
34
41
|
headers: {
|
|
35
42
|
'Content-Type': 'application/json',
|
|
@@ -84,7 +91,7 @@ const Duplicate = ({ slug, collection, id }) => {
|
|
|
84
91
|
pathname: `${admin}/collections/${slug}/${duplicateID}`,
|
|
85
92
|
});
|
|
86
93
|
}, 10);
|
|
87
|
-
}, [modified, localization, collection
|
|
94
|
+
}, [modified, localization, collection, setModified, toggleModal, modalSlug, serverURL, api, slug, id, push, admin]);
|
|
88
95
|
const confirm = useCallback(async () => {
|
|
89
96
|
setHasClicked(false);
|
|
90
97
|
await handleClick(true);
|
|
@@ -51,7 +51,7 @@ const ArrayFieldType = (props) => {
|
|
|
51
51
|
const memoizedValidate = useCallback((value, options) => {
|
|
52
52
|
return validate(value, { ...options, minRows, maxRows, required });
|
|
53
53
|
}, [maxRows, minRows, required, validate]);
|
|
54
|
-
const [disableFormData, setDisableFormData] = useState(
|
|
54
|
+
const [disableFormData, setDisableFormData] = useState(true);
|
|
55
55
|
const { showError, errorMessage, value, setValue, } = useField({
|
|
56
56
|
path,
|
|
57
57
|
validate: memoizedValidate,
|
|
@@ -31,7 +31,7 @@ const labelDefaults = {
|
|
|
31
31
|
singular: 'Block',
|
|
32
32
|
plural: 'Blocks',
|
|
33
33
|
};
|
|
34
|
-
const
|
|
34
|
+
const BlocksField = (props) => {
|
|
35
35
|
const { label, name, path: pathFromProps, blocks, labels = labelDefaults, fieldTypes, maxRows, minRows, required, validate = blocksValidator, permissions, admin: { readOnly, description, condition, initCollapsed, className, }, } = props;
|
|
36
36
|
const path = pathFromProps || name;
|
|
37
37
|
const { preferencesKey } = useDocumentInfo();
|
|
@@ -47,7 +47,7 @@ const Index = (props) => {
|
|
|
47
47
|
const memoizedValidate = useCallback((value, options) => {
|
|
48
48
|
return validate(value, { ...options, minRows, maxRows, required });
|
|
49
49
|
}, [maxRows, minRows, required, validate]);
|
|
50
|
-
const [disableFormData, setDisableFormData] = useState(
|
|
50
|
+
const [disableFormData, setDisableFormData] = useState(true);
|
|
51
51
|
const [selectorIndexOpen, setSelectorIndexOpen] = useState();
|
|
52
52
|
const { showError, errorMessage, value, setValue, } = useField({
|
|
53
53
|
path,
|
|
@@ -215,4 +215,4 @@ const Index = (props) => {
|
|
|
215
215
|
(!readOnly && !hasMaxRows) && (React.createElement("div", { className: `${baseClass}__add-button-wrap` },
|
|
216
216
|
React.createElement(Popup, { buttonType: "custom", size: "large", horizontalAlign: "left", button: (React.createElement(Button, { buttonStyle: "icon-label", icon: "plus", iconPosition: "left", iconStyle: "with-border" }, `Add ${labels.singular}`)), render: ({ close }) => (React.createElement(BlockSelector, { blocks: blocks, addRow: addRow, addRowIndex: value, close: close })) }))))));
|
|
217
217
|
};
|
|
218
|
-
export default withCondition(
|
|
218
|
+
export default withCondition(BlocksField);
|
|
@@ -32,6 +32,9 @@ const collectionSchema = joi_1.default.object().keys({
|
|
|
32
32
|
listSearchableFields: joi_1.default.array().items(joi_1.default.string()),
|
|
33
33
|
group: joi_1.default.string(),
|
|
34
34
|
description: joi_1.default.alternatives().try(joi_1.default.string(), componentSchema_1.componentSchema),
|
|
35
|
+
hooks: joi_1.default.object({
|
|
36
|
+
beforeDuplicate: joi_1.default.func(),
|
|
37
|
+
}),
|
|
35
38
|
enableRichTextRelationship: joi_1.default.boolean(),
|
|
36
39
|
components: joi_1.default.object({
|
|
37
40
|
views: joi_1.default.object({
|
|
@@ -135,4 +138,4 @@ const collectionSchema = joi_1.default.object().keys({
|
|
|
135
138
|
}), joi_1.default.boolean()),
|
|
136
139
|
});
|
|
137
140
|
exports.default = collectionSchema;
|
|
138
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
141
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2NoZW1hLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2NvbGxlY3Rpb25zL2NvbmZpZy9zY2hlbWEudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFBQSw4Q0FBc0I7QUFDdEIscUVBQWtFO0FBQ2xFLGdEQUFzRDtBQUV0RCxNQUFNLGtCQUFrQixHQUFHLGFBQUcsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxJQUFJLENBQUM7SUFDM0MsT0FBTyxFQUFFLGFBQUcsQ0FBQyxPQUFPLEVBQUU7SUFDdEIsTUFBTSxFQUFFLGFBQUcsQ0FBQyxPQUFPLEVBQUU7Q0FDdEIsQ0FBQyxDQUFDO0FBRUgsTUFBTSxnQkFBZ0IsR0FBRyxhQUFHLENBQUMsTUFBTSxFQUFFLENBQUMsSUFBSSxDQUFDO0lBQ3pDLElBQUksRUFBRSxhQUFHLENBQUMsTUFBTSxFQUFFLENBQUMsUUFBUSxFQUFFO0lBQzdCLE1BQU0sRUFBRSxhQUFHLENBQUMsTUFBTSxDQUFDO1FBQ2pCLFFBQVEsRUFBRSxhQUFHLENBQUMsTUFBTSxFQUFFO1FBQ3RCLE1BQU0sRUFBRSxhQUFHLENBQUMsTUFBTSxFQUFFO0tBQ3JCLENBQUM7SUFDRixNQUFNLEVBQUUsYUFBRyxDQUFDLE1BQU0sQ0FBQztRQUNqQixNQUFNLEVBQUUsYUFBRyxDQUFDLElBQUksRUFBRTtRQUNsQixJQUFJLEVBQUUsYUFBRyxDQUFDLElBQUksRUFBRTtRQUNoQixZQUFZLEVBQUUsYUFBRyxDQUFDLElBQUksRUFBRTtRQUN4QixNQUFNLEVBQUUsYUFBRyxDQUFDLElBQUksRUFBRTtRQUNsQixNQUFNLEVBQUUsYUFBRyxDQUFDLElBQUksRUFBRTtRQUNsQixNQUFNLEVBQUUsYUFBRyxDQUFDLElBQUksRUFBRTtRQUNsQixLQUFLLEVBQUUsYUFBRyxDQUFDLElBQUksRUFBRTtLQUNsQixDQUFDO0lBQ0YsVUFBVSxFQUFFLGFBQUcsQ0FBQyxPQUFPLEVBQUU7SUFDekIsS0FBSyxFQUFFLGFBQUcsQ0FB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
|
|
@@ -120,6 +120,11 @@ export declare type AfterRefreshHook<T extends TypeWithID = any> = (args: {
|
|
|
120
120
|
export declare type AfterForgotPasswordHook = (args: {
|
|
121
121
|
args?: any;
|
|
122
122
|
}) => any;
|
|
123
|
+
declare type BeforeDuplicateArgs<T> = {
|
|
124
|
+
data: T;
|
|
125
|
+
locale?: string;
|
|
126
|
+
};
|
|
127
|
+
export declare type BeforeDuplicate<T = any> = (args: BeforeDuplicateArgs<T>) => T | Promise<T>;
|
|
123
128
|
export declare type CollectionAdminOptions = {
|
|
124
129
|
/**
|
|
125
130
|
* Field to use as title in Edit view and first column in List view
|
|
@@ -133,6 +138,12 @@ export declare type CollectionAdminOptions = {
|
|
|
133
138
|
* Additional fields to be searched via the full text search
|
|
134
139
|
*/
|
|
135
140
|
listSearchableFields?: string[];
|
|
141
|
+
hooks?: {
|
|
142
|
+
/**
|
|
143
|
+
* Function that allows you to modify a document's data before it is duplicated
|
|
144
|
+
*/
|
|
145
|
+
beforeDuplicate?: BeforeDuplicate;
|
|
146
|
+
};
|
|
136
147
|
/**
|
|
137
148
|
* Place collections into a navigational group
|
|
138
149
|
* */
|
|
@@ -62,6 +62,7 @@ You can customize the way that the Admin panel behaves on a collection-by-collec
|
|
|
62
62
|
| Option | Description |
|
|
63
63
|
| ---------------------------- | -------------|
|
|
64
64
|
| `group` | Text used as a label for grouping collection links together in the navigation. |
|
|
65
|
+
| `hooks` | Admin-specific hooks for this collection. [More](#admin-hooks) |
|
|
65
66
|
| `useAsTitle` | Specify a top-level field to use for a document title throughout the Admin panel. If no field is defined, the ID of the document is used as the title. |
|
|
66
67
|
| `description` | Text or React component to display below the Collection label in the List view to give editors more information. |
|
|
67
68
|
| `defaultColumns` | Array of field names that correspond to which columns to show by default in this collection's List view. |
|
|
@@ -131,6 +132,50 @@ For example, let's say you have a Posts collection with `title`, `metaDescriptio
|
|
|
131
132
|
If you are adding <strong>listSearchableFields</strong>, make sure you index each of these fields so your admin queries can remain performant.
|
|
132
133
|
</Banner>
|
|
133
134
|
|
|
135
|
+
### Admin Hooks
|
|
136
|
+
|
|
137
|
+
In addition to collection hooks themselves, Payload provides for admin UI-specific hooks that you can leverage.
|
|
138
|
+
|
|
139
|
+
**`beforeDuplicate`**
|
|
140
|
+
|
|
141
|
+
The `beforeDuplicate` hook is an async function that accepts an object containing the data to duplicate, as well as the locale of the doc to duplicate. Within this hook, you can modify the data to be duplicated, which is useful in cases where you have unique fields that need to be incremented or similar, as well as if you want to automatically modify a document's `title`.
|
|
142
|
+
|
|
143
|
+
Example:
|
|
144
|
+
|
|
145
|
+
```ts
|
|
146
|
+
import { BeforeDuplicate, CollectionConfig } from 'payload/types';
|
|
147
|
+
// Your auto-generated Page type
|
|
148
|
+
import { Page } from '../payload-types.ts';
|
|
149
|
+
|
|
150
|
+
const beforeDuplicate: BeforeDuplicate<Page> = ({ data }) => {
|
|
151
|
+
return {
|
|
152
|
+
...data,
|
|
153
|
+
title: `${data.title} Copy`,
|
|
154
|
+
uniqueField: data.uniqueField ? `${data.uniqueField}-copy` : '',
|
|
155
|
+
};
|
|
156
|
+
};
|
|
157
|
+
|
|
158
|
+
export const Page: CollectionConfig = {
|
|
159
|
+
slug: 'pages',
|
|
160
|
+
admin: {
|
|
161
|
+
hooks: {
|
|
162
|
+
beforeDuplicate,
|
|
163
|
+
}
|
|
164
|
+
},
|
|
165
|
+
fields: [
|
|
166
|
+
{
|
|
167
|
+
name: 'title',
|
|
168
|
+
type: 'text',
|
|
169
|
+
},
|
|
170
|
+
{
|
|
171
|
+
name: 'uniqueField',
|
|
172
|
+
type: 'text',
|
|
173
|
+
unique: true,
|
|
174
|
+
}
|
|
175
|
+
]
|
|
176
|
+
}
|
|
177
|
+
```
|
|
178
|
+
|
|
134
179
|
### TypeScript
|
|
135
180
|
|
|
136
181
|
You can import collection types as follows:
|