payload 0.15.12 → 0.16.1
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 +2 -1
- package/CHANGELOG.md +22 -0
- package/dist/admin/components/elements/ReactSelect/types.d.ts +1 -1
- package/dist/admin/components/forms/Form/buildStateFromSchema/addFieldStatePromise.d.ts +18 -0
- package/dist/admin/components/forms/Form/buildStateFromSchema/addFieldStatePromise.js +158 -0
- package/dist/admin/components/forms/Form/{buildStateFromSchema.d.ts → buildStateFromSchema/index.d.ts} +4 -3
- package/dist/admin/components/forms/Form/buildStateFromSchema/index.js +25 -0
- package/dist/admin/components/forms/Form/buildStateFromSchema/iterateFields.d.ts +18 -0
- package/dist/admin/components/forms/Form/buildStateFromSchema/iterateFields.js +24 -0
- package/dist/admin/components/forms/Form/index.js +2 -6
- package/dist/admin/components/forms/RenderFields/index.js +1 -1
- package/dist/admin/components/forms/field-types/Array/Array.js +6 -3
- package/dist/admin/components/forms/field-types/Blocks/Blocks.js +4 -2
- package/dist/admin/components/forms/field-types/Relationship/index.js +3 -1
- package/dist/admin/components/forms/field-types/RichText/elements/upload/Element/EditModal/index.js +4 -2
- package/dist/admin/components/views/Account/index.js +2 -2
- package/dist/admin/components/views/Global/index.js +4 -4
- package/dist/admin/components/views/collections/Edit/index.js +7 -4
- package/dist/collections/tests/defaultValue.spec.d.ts +1 -0
- package/dist/collections/tests/defaultValue.spec.js +95 -0
- package/dist/fields/config/schema.js +16 -15
- package/dist/fields/config/types.d.ts +2 -0
- package/dist/fields/config/types.js +1 -1
- package/dist/fields/getDefaultValue.d.ts +9 -0
- package/dist/fields/getDefaultValue.js +14 -0
- package/dist/fields/performFieldOperations.js +5 -1
- package/dist/fields/traverseFields.d.ts +1 -0
- package/dist/fields/traverseFields.js +13 -3
- package/dist/fields/validationPromise.d.ts +3 -1
- package/dist/fields/validationPromise.js +3 -2
- package/dist/fields/validations.js +3 -4
- package/dist/localization/middleware.js +1 -2
- package/dist/mongoose/buildSchema.js +1 -2
- package/dist/uploads/mimeTypeValidator.js +4 -1
- package/dist/uploads/mimeTypeValidator.spec.js +7 -1
- package/dist/uploads/uploadFile.js +3 -2
- package/dist/versions/tests/globals-graphql.spec.js +2 -2
- package/dist/webpack/getBaseConfig.js +1 -2
- package/docs/fields/array.mdx +1 -1
- package/docs/fields/blocks.mdx +1 -1
- package/docs/fields/checkbox.mdx +1 -1
- package/docs/fields/code.mdx +1 -1
- package/docs/fields/date.mdx +1 -1
- package/docs/fields/email.mdx +1 -1
- package/docs/fields/group.mdx +1 -1
- package/docs/fields/number.mdx +1 -1
- package/docs/fields/overview.mdx +35 -1
- package/docs/fields/point.mdx +1 -1
- package/docs/fields/radio.mdx +1 -1
- package/docs/fields/relationship.mdx +1 -1
- package/docs/fields/rich-text.mdx +1 -1
- package/docs/fields/select.mdx +1 -1
- package/docs/fields/text.mdx +1 -1
- package/docs/fields/textarea.mdx +1 -1
- package/docs/fields/upload.mdx +1 -1
- package/docs/queries/overview.mdx +1 -1
- package/docs/rest-api/overview.mdx +1 -1
- package/package.json +1 -1
- package/dist/admin/components/forms/Form/buildStateFromSchema.js +0 -140
package/.eslintrc.js
CHANGED
|
@@ -55,13 +55,14 @@ module.exports = {
|
|
|
55
55
|
},
|
|
56
56
|
],
|
|
57
57
|
rules: {
|
|
58
|
-
'no-sparse-arrays': 'off',
|
|
59
58
|
'import/no-extraneous-dependencies': ['error', { packageDir: './' }],
|
|
60
59
|
'react/jsx-filename-extension': [2, { extensions: ['.js', '.jsx', '.ts', '.tsx'] }],
|
|
61
60
|
'import/prefer-default-export': 'off',
|
|
62
61
|
'react/prop-types': 'off',
|
|
63
62
|
'react/require-default-props': 'off',
|
|
64
63
|
'react/no-unused-prop-types': 'off',
|
|
64
|
+
'no-console': 'warn',
|
|
65
|
+
'no-sparse-arrays': 'off',
|
|
65
66
|
'no-underscore-dangle': 'off',
|
|
66
67
|
'no-use-before-define': 'off',
|
|
67
68
|
'arrow-body-style': 0,
|
package/CHANGELOG.md
CHANGED
|
@@ -1,3 +1,25 @@
|
|
|
1
|
+
## [0.16.1](https://github.com/payloadcms/payload/compare/v0.16.0...v0.16.1) (2022-04-29)
|
|
2
|
+
|
|
3
|
+
|
|
4
|
+
### Features
|
|
5
|
+
|
|
6
|
+
* exposes payload within server-side validation args ([e46b942](https://github.com/payloadcms/payload/commit/e46b94225957bba7758a0a2c22776c44a2d2d633))
|
|
7
|
+
|
|
8
|
+
# [0.16.0](https://github.com/payloadcms/payload/compare/v0.15.13...v0.16.0) (2022-04-29)
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
### Bug Fixes
|
|
12
|
+
|
|
13
|
+
* file upload safely handles missing mimeTypes ([#540](https://github.com/payloadcms/payload/issues/540)) ([bf48fdf](https://github.com/payloadcms/payload/commit/bf48fdf18961a2e57bcc5aae73de4c569e97e42b))
|
|
14
|
+
|
|
15
|
+
|
|
16
|
+
### Features
|
|
17
|
+
|
|
18
|
+
* allow subfield readOnly to override parent readOnly ([#546](https://github.com/payloadcms/payload/issues/546)) ([834f4c2](https://github.com/payloadcms/payload/commit/834f4c270020bf32852c00a3abbb908853689006))
|
|
19
|
+
* allows defaultValue to accept async function to calculate defaultValue ([#547](https://github.com/payloadcms/payload/issues/547)) ([e297eb9](https://github.com/payloadcms/payload/commit/e297eb90907d933524d220255d5f8dc4276358c5))
|
|
20
|
+
|
|
21
|
+
## [0.15.13](https://github.com/payloadcms/payload/compare/v0.15.12...v0.15.13) (2022-04-26)
|
|
22
|
+
|
|
1
23
|
## [0.15.12](https://github.com/payloadcms/payload/compare/v0.15.11...v0.15.12) (2022-04-26)
|
|
2
24
|
|
|
3
25
|
|
|
@@ -2,7 +2,7 @@ import { OptionsType, GroupedOptionsType } from 'react-select';
|
|
|
2
2
|
export declare type Options = OptionsType<Value> | GroupedOptionsType<Value>;
|
|
3
3
|
export declare type Value = {
|
|
4
4
|
label: string;
|
|
5
|
-
value: string;
|
|
5
|
+
value: string | null;
|
|
6
6
|
options?: Options;
|
|
7
7
|
};
|
|
8
8
|
export declare type Props = {
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import { User } from '../../../../../auth';
|
|
2
|
+
import { NonPresentationalField } from '../../../../../fields/config/types';
|
|
3
|
+
import { Fields, Data } from '../types';
|
|
4
|
+
declare type Args = {
|
|
5
|
+
field: NonPresentationalField;
|
|
6
|
+
locale: string;
|
|
7
|
+
user: User;
|
|
8
|
+
state: Fields;
|
|
9
|
+
path: string;
|
|
10
|
+
passesCondition: boolean;
|
|
11
|
+
fieldPromises: Promise<void>[];
|
|
12
|
+
id: string | number;
|
|
13
|
+
operation: 'create' | 'update';
|
|
14
|
+
data: Data;
|
|
15
|
+
fullData: Data;
|
|
16
|
+
};
|
|
17
|
+
export declare const addFieldStatePromise: ({ field, locale, user, state, path, passesCondition, fullData, data, fieldPromises, id, operation, }: Args) => Promise<void>;
|
|
18
|
+
export {};
|
|
@@ -0,0 +1,158 @@
|
|
|
1
|
+
/* eslint-disable no-param-reassign */
|
|
2
|
+
import ObjectID from 'bson-objectid';
|
|
3
|
+
import { fieldAffectsData, fieldHasSubFields } from '../../../../../fields/config/types';
|
|
4
|
+
import getValueWithDefault from '../../../../../fields/getDefaultValue';
|
|
5
|
+
import { iterateFields } from './iterateFields';
|
|
6
|
+
export const addFieldStatePromise = async ({ field, locale, user, state, path, passesCondition, fullData, data, fieldPromises, id, operation, }) => {
|
|
7
|
+
var _a;
|
|
8
|
+
if (fieldAffectsData(field)) {
|
|
9
|
+
const fieldState = {
|
|
10
|
+
valid: true,
|
|
11
|
+
value: undefined,
|
|
12
|
+
initialValue: undefined,
|
|
13
|
+
validate: field.validate,
|
|
14
|
+
condition: (_a = field.admin) === null || _a === void 0 ? void 0 : _a.condition,
|
|
15
|
+
passesCondition,
|
|
16
|
+
};
|
|
17
|
+
const valueWithDefault = await getValueWithDefault({ value: data[field.name], defaultValue: field.defaultValue, locale, user });
|
|
18
|
+
data[field.name] = valueWithDefault;
|
|
19
|
+
let validationResult = true;
|
|
20
|
+
if (typeof fieldState.validate === 'function') {
|
|
21
|
+
validationResult = await fieldState.validate(data[field.name], {
|
|
22
|
+
...field,
|
|
23
|
+
data: fullData,
|
|
24
|
+
user,
|
|
25
|
+
siblingData: data,
|
|
26
|
+
id,
|
|
27
|
+
operation,
|
|
28
|
+
});
|
|
29
|
+
}
|
|
30
|
+
if (typeof validationResult === 'string') {
|
|
31
|
+
fieldState.errorMessage = validationResult;
|
|
32
|
+
fieldState.valid = false;
|
|
33
|
+
}
|
|
34
|
+
else {
|
|
35
|
+
fieldState.valid = true;
|
|
36
|
+
}
|
|
37
|
+
switch (field.type) {
|
|
38
|
+
case 'array': {
|
|
39
|
+
const arrayValue = Array.isArray(valueWithDefault) ? valueWithDefault : [];
|
|
40
|
+
arrayValue.forEach((row, i) => {
|
|
41
|
+
const rowPath = `${path}${field.name}.${i}.`;
|
|
42
|
+
state[`${rowPath}id`] = {
|
|
43
|
+
value: row.id,
|
|
44
|
+
initialValue: row.id || new ObjectID().toHexString(),
|
|
45
|
+
valid: true,
|
|
46
|
+
};
|
|
47
|
+
iterateFields({
|
|
48
|
+
state,
|
|
49
|
+
fields: field.fields,
|
|
50
|
+
data: row,
|
|
51
|
+
parentPassesCondition: passesCondition,
|
|
52
|
+
path: rowPath,
|
|
53
|
+
user,
|
|
54
|
+
fieldPromises,
|
|
55
|
+
fullData,
|
|
56
|
+
id,
|
|
57
|
+
locale,
|
|
58
|
+
operation,
|
|
59
|
+
});
|
|
60
|
+
});
|
|
61
|
+
// Add values to field state
|
|
62
|
+
fieldState.value = arrayValue.length;
|
|
63
|
+
fieldState.initialValue = arrayValue.length;
|
|
64
|
+
if (arrayValue.length > 0) {
|
|
65
|
+
fieldState.disableFormData = true;
|
|
66
|
+
}
|
|
67
|
+
// Add field to state
|
|
68
|
+
state[`${path}${field.name}`] = fieldState;
|
|
69
|
+
break;
|
|
70
|
+
}
|
|
71
|
+
case 'blocks': {
|
|
72
|
+
const blocksValue = Array.isArray(valueWithDefault) ? valueWithDefault : [];
|
|
73
|
+
blocksValue.forEach((row, i) => {
|
|
74
|
+
const block = field.blocks.find((blockType) => blockType.slug === row.blockType);
|
|
75
|
+
const rowPath = `${path}${field.name}.${i}.`;
|
|
76
|
+
if (block) {
|
|
77
|
+
state[`${rowPath}id`] = {
|
|
78
|
+
value: row.id,
|
|
79
|
+
initialValue: row.id || new ObjectID().toHexString(),
|
|
80
|
+
valid: true,
|
|
81
|
+
};
|
|
82
|
+
state[`${rowPath}blockType`] = {
|
|
83
|
+
value: row.blockType,
|
|
84
|
+
initialValue: row.blockType,
|
|
85
|
+
valid: true,
|
|
86
|
+
};
|
|
87
|
+
state[`${rowPath}blockName`] = {
|
|
88
|
+
value: row.blockName,
|
|
89
|
+
initialValue: row.blockName,
|
|
90
|
+
valid: true,
|
|
91
|
+
};
|
|
92
|
+
iterateFields({
|
|
93
|
+
state,
|
|
94
|
+
fields: block.fields,
|
|
95
|
+
data: row,
|
|
96
|
+
fullData,
|
|
97
|
+
parentPassesCondition: passesCondition,
|
|
98
|
+
path: rowPath,
|
|
99
|
+
user,
|
|
100
|
+
locale,
|
|
101
|
+
operation,
|
|
102
|
+
fieldPromises,
|
|
103
|
+
id,
|
|
104
|
+
});
|
|
105
|
+
}
|
|
106
|
+
});
|
|
107
|
+
// Add values to field state
|
|
108
|
+
fieldState.value = blocksValue.length;
|
|
109
|
+
fieldState.initialValue = blocksValue.length;
|
|
110
|
+
if (blocksValue.length > 0) {
|
|
111
|
+
fieldState.disableFormData = true;
|
|
112
|
+
}
|
|
113
|
+
// Add field to state
|
|
114
|
+
state[`${path}${field.name}`] = fieldState;
|
|
115
|
+
break;
|
|
116
|
+
}
|
|
117
|
+
case 'group': {
|
|
118
|
+
iterateFields({
|
|
119
|
+
state,
|
|
120
|
+
id,
|
|
121
|
+
operation,
|
|
122
|
+
fieldPromises,
|
|
123
|
+
fields: field.fields,
|
|
124
|
+
data: data === null || data === void 0 ? void 0 : data[field.name],
|
|
125
|
+
fullData,
|
|
126
|
+
parentPassesCondition: passesCondition,
|
|
127
|
+
path: `${path}${field.name}.`,
|
|
128
|
+
locale,
|
|
129
|
+
user,
|
|
130
|
+
});
|
|
131
|
+
break;
|
|
132
|
+
}
|
|
133
|
+
default: {
|
|
134
|
+
fieldState.value = valueWithDefault;
|
|
135
|
+
fieldState.initialValue = valueWithDefault;
|
|
136
|
+
// Add field to state
|
|
137
|
+
state[`${path}${field.name}`] = fieldState;
|
|
138
|
+
break;
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
else if (fieldHasSubFields(field)) {
|
|
143
|
+
// Handle field types that do not use names (row, etc)
|
|
144
|
+
iterateFields({
|
|
145
|
+
state,
|
|
146
|
+
fields: field.fields,
|
|
147
|
+
data,
|
|
148
|
+
parentPassesCondition: passesCondition,
|
|
149
|
+
path,
|
|
150
|
+
user,
|
|
151
|
+
fieldPromises,
|
|
152
|
+
fullData,
|
|
153
|
+
id,
|
|
154
|
+
locale,
|
|
155
|
+
operation,
|
|
156
|
+
});
|
|
157
|
+
}
|
|
158
|
+
};
|
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import { User } from '
|
|
2
|
-
import { Field as FieldSchema } from '
|
|
3
|
-
import { Fields, Data } from '
|
|
1
|
+
import { User } from '../../../../../auth';
|
|
2
|
+
import { Field as FieldSchema } from '../../../../../fields/config/types';
|
|
3
|
+
import { Fields, Data } from '../types';
|
|
4
4
|
declare type Args = {
|
|
5
5
|
fieldSchema: FieldSchema[];
|
|
6
6
|
data?: Data;
|
|
@@ -8,6 +8,7 @@ declare type Args = {
|
|
|
8
8
|
user?: User;
|
|
9
9
|
id?: string | number;
|
|
10
10
|
operation?: 'create' | 'update';
|
|
11
|
+
locale: string;
|
|
11
12
|
};
|
|
12
13
|
declare const buildStateFromSchema: (args: Args) => Promise<Fields>;
|
|
13
14
|
export default buildStateFromSchema;
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import { iterateFields } from './iterateFields';
|
|
2
|
+
const buildStateFromSchema = async (args) => {
|
|
3
|
+
const { fieldSchema, data: fullData = {}, user, id, operation, locale, } = args;
|
|
4
|
+
if (fieldSchema) {
|
|
5
|
+
const fieldPromises = [];
|
|
6
|
+
const state = {};
|
|
7
|
+
iterateFields({
|
|
8
|
+
state,
|
|
9
|
+
fields: fieldSchema,
|
|
10
|
+
id,
|
|
11
|
+
locale,
|
|
12
|
+
operation,
|
|
13
|
+
path: '',
|
|
14
|
+
user,
|
|
15
|
+
fieldPromises,
|
|
16
|
+
data: fullData,
|
|
17
|
+
fullData,
|
|
18
|
+
parentPassesCondition: true,
|
|
19
|
+
});
|
|
20
|
+
await Promise.all(fieldPromises);
|
|
21
|
+
return state;
|
|
22
|
+
}
|
|
23
|
+
return {};
|
|
24
|
+
};
|
|
25
|
+
export default buildStateFromSchema;
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import { User } from '../../../../../auth';
|
|
2
|
+
import { Field as FieldSchema } from '../../../../../fields/config/types';
|
|
3
|
+
import { Fields, Data } from '../types';
|
|
4
|
+
declare type Args = {
|
|
5
|
+
state: Fields;
|
|
6
|
+
fields: FieldSchema[];
|
|
7
|
+
data: Data;
|
|
8
|
+
fullData: Data;
|
|
9
|
+
parentPassesCondition: boolean;
|
|
10
|
+
path: string;
|
|
11
|
+
user: User;
|
|
12
|
+
locale: string;
|
|
13
|
+
fieldPromises: Promise<void>[];
|
|
14
|
+
id: string | number;
|
|
15
|
+
operation: 'create' | 'update';
|
|
16
|
+
};
|
|
17
|
+
export declare const iterateFields: ({ fields, data, parentPassesCondition, path, fullData, user, locale, operation, fieldPromises, id, state, }: Args) => void;
|
|
18
|
+
export {};
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import { fieldIsPresentationalOnly, } from '../../../../../fields/config/types';
|
|
2
|
+
import { addFieldStatePromise } from './addFieldStatePromise';
|
|
3
|
+
export const iterateFields = ({ fields, data, parentPassesCondition, path = '', fullData, user, locale, operation, fieldPromises, id, state, }) => {
|
|
4
|
+
fields.forEach((field) => {
|
|
5
|
+
var _a, _b;
|
|
6
|
+
const initialData = data;
|
|
7
|
+
if (!fieldIsPresentationalOnly(field) && !((_a = field === null || field === void 0 ? void 0 : field.admin) === null || _a === void 0 ? void 0 : _a.disabled)) {
|
|
8
|
+
const passesCondition = Boolean((((_b = field === null || field === void 0 ? void 0 : field.admin) === null || _b === void 0 ? void 0 : _b.condition) ? field.admin.condition(fullData || {}, initialData || {}) : true) && parentPassesCondition);
|
|
9
|
+
fieldPromises.push(addFieldStatePromise({
|
|
10
|
+
fullData,
|
|
11
|
+
id,
|
|
12
|
+
locale,
|
|
13
|
+
operation,
|
|
14
|
+
path,
|
|
15
|
+
state,
|
|
16
|
+
user,
|
|
17
|
+
fieldPromises,
|
|
18
|
+
field,
|
|
19
|
+
passesCondition,
|
|
20
|
+
data,
|
|
21
|
+
}));
|
|
22
|
+
}
|
|
23
|
+
});
|
|
24
|
+
};
|
|
@@ -247,10 +247,10 @@ const Form = (props) => {
|
|
|
247
247
|
return formData;
|
|
248
248
|
}, [contextRef]);
|
|
249
249
|
const reset = useCallback(async (fieldSchema, data) => {
|
|
250
|
-
const state = await buildStateFromSchema({ fieldSchema, data, user, id, operation });
|
|
250
|
+
const state = await buildStateFromSchema({ fieldSchema, data, user, id, operation, locale });
|
|
251
251
|
contextRef.current = { ...initContextState };
|
|
252
252
|
dispatchFields({ type: 'REPLACE_STATE', state });
|
|
253
|
-
}, [id, user, operation]);
|
|
253
|
+
}, [id, user, operation, locale]);
|
|
254
254
|
contextRef.current.dispatchFields = dispatchFields;
|
|
255
255
|
contextRef.current.submit = submit;
|
|
256
256
|
contextRef.current.getFields = getFields;
|
|
@@ -295,10 +295,6 @@ const Form = (props) => {
|
|
|
295
295
|
className,
|
|
296
296
|
baseClass,
|
|
297
297
|
].filter(Boolean).join(' ');
|
|
298
|
-
if (log) {
|
|
299
|
-
// eslint-disable-next-line no-console
|
|
300
|
-
console.log(fields);
|
|
301
|
-
}
|
|
302
298
|
return (React.createElement("form", { noValidate: true, onSubmit: (e) => contextRef.current.submit({}, e), method: method, action: action, className: classes, ref: formRef },
|
|
303
299
|
React.createElement(FormContext.Provider, { value: contextRef.current },
|
|
304
300
|
React.createElement(FormWatchContext.Provider, { value: {
|
|
@@ -41,7 +41,7 @@ const RenderFields = (props) => {
|
|
|
41
41
|
const isFieldAffectingData = fieldAffectsData(field);
|
|
42
42
|
const fieldPermissions = isFieldAffectingData ? permissions === null || permissions === void 0 ? void 0 : permissions[field.name] : permissions;
|
|
43
43
|
let { admin: { readOnly } = {} } = field;
|
|
44
|
-
if (readOnlyOverride)
|
|
44
|
+
if (readOnlyOverride && readOnly !== false)
|
|
45
45
|
readOnly = true;
|
|
46
46
|
if ((isFieldAffectingData && ((_d = (_c = permissions === null || permissions === void 0 ? void 0 : permissions[field === null || field === void 0 ? void 0 : field.name]) === null || _c === void 0 ? void 0 : _c.read) === null || _d === void 0 ? void 0 : _d.permission) !== false) || !isFieldAffectingData) {
|
|
47
47
|
if (isFieldAffectingData && ((_f = (_e = permissions === null || permissions === void 0 ? void 0 : permissions[field === null || field === void 0 ? void 0 : field.name]) === null || _e === void 0 ? void 0 : _e[operation]) === null || _f === void 0 ? void 0 : _f.permission) === false) {
|
|
@@ -8,6 +8,7 @@ import reducer from '../rowReducer';
|
|
|
8
8
|
import { useForm } from '../../Form/context';
|
|
9
9
|
import buildStateFromSchema from '../../Form/buildStateFromSchema';
|
|
10
10
|
import useField from '../../useField';
|
|
11
|
+
import { useLocale } from '../../../utilities/Locale';
|
|
11
12
|
import Error from '../../Error';
|
|
12
13
|
import { array } from '../../../../../fields/validations';
|
|
13
14
|
import Banner from '../../../elements/Banner';
|
|
@@ -34,6 +35,7 @@ const ArrayFieldType = (props) => {
|
|
|
34
35
|
const formContext = useForm();
|
|
35
36
|
const { user } = useAuth();
|
|
36
37
|
const { id } = useDocumentInfo();
|
|
38
|
+
const locale = useLocale();
|
|
37
39
|
const operation = useOperation();
|
|
38
40
|
const { dispatchFields } = formContext;
|
|
39
41
|
const path = pathFromProps || name;
|
|
@@ -48,15 +50,16 @@ const ArrayFieldType = (props) => {
|
|
|
48
50
|
condition,
|
|
49
51
|
});
|
|
50
52
|
const addRow = useCallback(async (rowIndex) => {
|
|
51
|
-
const subFieldState = await buildStateFromSchema({ fieldSchema: fields, operation, id, user });
|
|
53
|
+
const subFieldState = await buildStateFromSchema({ fieldSchema: fields, operation, id, user, locale });
|
|
52
54
|
dispatchFields({ type: 'ADD_ROW', rowIndex, subFieldState, path });
|
|
53
55
|
dispatchRows({ type: 'ADD', rowIndex });
|
|
54
56
|
setValue(value + 1);
|
|
55
|
-
}, [dispatchRows, dispatchFields, fields, path, setValue, value, operation, id, user]);
|
|
57
|
+
}, [dispatchRows, dispatchFields, fields, path, setValue, value, operation, id, user, locale]);
|
|
56
58
|
const removeRow = useCallback((rowIndex) => {
|
|
57
59
|
dispatchRows({ type: 'REMOVE', rowIndex });
|
|
58
60
|
dispatchFields({ type: 'REMOVE_ROW', rowIndex, path });
|
|
59
|
-
|
|
61
|
+
setValue(value - 1);
|
|
62
|
+
}, [dispatchRows, dispatchFields, path, value, setValue]);
|
|
60
63
|
const moveRow = useCallback((moveFromIndex, moveToIndex) => {
|
|
61
64
|
dispatchRows({ type: 'MOVE', moveFromIndex, moveToIndex });
|
|
62
65
|
dispatchFields({ type: 'MOVE_ROW', moveFromIndex, moveToIndex, path });
|
|
@@ -2,6 +2,7 @@ import React, { useCallback, useEffect, useReducer, useState } from 'react';
|
|
|
2
2
|
import { DragDropContext, Droppable } from 'react-beautiful-dnd';
|
|
3
3
|
import { useAuth } from '@payloadcms/config-provider';
|
|
4
4
|
import { usePreferences } from '../../../utilities/Preferences';
|
|
5
|
+
import { useLocale } from '../../../utilities/Locale';
|
|
5
6
|
import withCondition from '../../withCondition';
|
|
6
7
|
import Button from '../../../elements/Button';
|
|
7
8
|
import reducer from '../rowReducer';
|
|
@@ -32,6 +33,7 @@ const Blocks = (props) => {
|
|
|
32
33
|
const formContext = useForm();
|
|
33
34
|
const { user } = useAuth();
|
|
34
35
|
const { id } = useDocumentInfo();
|
|
36
|
+
const locale = useLocale();
|
|
35
37
|
const operation = useOperation();
|
|
36
38
|
const { dispatchFields } = formContext;
|
|
37
39
|
const memoizedValidate = useCallback((value, options) => {
|
|
@@ -46,11 +48,11 @@ const Blocks = (props) => {
|
|
|
46
48
|
});
|
|
47
49
|
const addRow = useCallback(async (rowIndex, blockType) => {
|
|
48
50
|
const block = blocks.find((potentialBlock) => potentialBlock.slug === blockType);
|
|
49
|
-
const subFieldState = await buildStateFromSchema({ fieldSchema: block.fields, operation, id, user });
|
|
51
|
+
const subFieldState = await buildStateFromSchema({ fieldSchema: block.fields, operation, id, user, locale });
|
|
50
52
|
dispatchFields({ type: 'ADD_ROW', rowIndex, subFieldState, path, blockType });
|
|
51
53
|
dispatchRows({ type: 'ADD', rowIndex, blockType });
|
|
52
54
|
setValue(value + 1);
|
|
53
|
-
}, [path, setValue, value, blocks, dispatchFields, operation, id, user]);
|
|
55
|
+
}, [path, setValue, value, blocks, dispatchFields, operation, id, user, locale]);
|
|
54
56
|
const removeRow = useCallback((rowIndex) => {
|
|
55
57
|
dispatchRows({ type: 'REMOVE', rowIndex });
|
|
56
58
|
dispatchFields({ type: 'REMOVE_ROW', rowIndex, path });
|
|
@@ -26,7 +26,7 @@ const Relationship = (props) => {
|
|
|
26
26
|
const { getData, getSiblingData } = useWatchForm();
|
|
27
27
|
const formProcessing = useFormProcessing();
|
|
28
28
|
const hasMultipleRelations = Array.isArray(relationTo);
|
|
29
|
-
const [options, dispatchOptions] = useReducer(optionsReducer, required || hasMany ? [] : [{ value:
|
|
29
|
+
const [options, dispatchOptions] = useReducer(optionsReducer, required || hasMany ? [] : [{ value: null, label: 'None' }]);
|
|
30
30
|
const [lastFullyLoadedRelation, setLastFullyLoadedRelation] = useState(-1);
|
|
31
31
|
const [lastLoadedPage, setLastLoadedPage] = useState(1);
|
|
32
32
|
const [errorLoading, setErrorLoading] = useState('');
|
|
@@ -228,6 +228,8 @@ const Relationship = (props) => {
|
|
|
228
228
|
readOnly && `${baseClass}--read-only`,
|
|
229
229
|
].filter(Boolean).join(' ');
|
|
230
230
|
const valueToRender = (findOptionsByValue() || value);
|
|
231
|
+
if ((valueToRender === null || valueToRender === void 0 ? void 0 : valueToRender.value) === 'null')
|
|
232
|
+
valueToRender.value = null;
|
|
231
233
|
return (React.createElement("div", { className: classes, style: {
|
|
232
234
|
...style,
|
|
233
235
|
width,
|
package/dist/admin/components/forms/field-types/RichText/elements/upload/Element/EditModal/index.js
CHANGED
|
@@ -12,11 +12,13 @@ import Form from '../../../../../../Form';
|
|
|
12
12
|
import reduceFieldsToValues from '../../../../../../Form/reduceFieldsToValues';
|
|
13
13
|
import Submit from '../../../../../../Submit';
|
|
14
14
|
import './index.scss';
|
|
15
|
+
import { useLocale } from '../../../../../../../utilities/Locale';
|
|
15
16
|
const baseClass = 'edit-upload-modal';
|
|
16
17
|
export const EditModal = ({ slug, closeModal, relatedCollectionConfig, fieldSchema, element }) => {
|
|
17
18
|
const editor = useSlateStatic();
|
|
18
19
|
const [initialState, setInitialState] = useState({});
|
|
19
20
|
const { user } = useAuth();
|
|
21
|
+
const locale = useLocale();
|
|
20
22
|
const handleUpdateEditData = useCallback((fields) => {
|
|
21
23
|
const newNode = {
|
|
22
24
|
fields: reduceFieldsToValues(fields, true),
|
|
@@ -27,11 +29,11 @@ export const EditModal = ({ slug, closeModal, relatedCollectionConfig, fieldSche
|
|
|
27
29
|
}, [closeModal, editor, element]);
|
|
28
30
|
useEffect(() => {
|
|
29
31
|
const awaitInitialState = async () => {
|
|
30
|
-
const state = await buildStateFromSchema({ fieldSchema, data: element === null || element === void 0 ? void 0 : element.fields, user, operation: 'update' });
|
|
32
|
+
const state = await buildStateFromSchema({ fieldSchema, data: element === null || element === void 0 ? void 0 : element.fields, user, operation: 'update', locale });
|
|
31
33
|
setInitialState(state);
|
|
32
34
|
};
|
|
33
35
|
awaitInitialState();
|
|
34
|
-
}, [fieldSchema, element.fields, user]);
|
|
36
|
+
}, [fieldSchema, element.fields, user, locale]);
|
|
35
37
|
return (React.createElement(Modal, { slug: slug, className: baseClass },
|
|
36
38
|
React.createElement(MinimalTemplate, { width: "normal" },
|
|
37
39
|
React.createElement("header", { className: `${baseClass}__header` },
|
|
@@ -38,11 +38,11 @@ const AccountView = () => {
|
|
|
38
38
|
}, [setStepNav]);
|
|
39
39
|
useEffect(() => {
|
|
40
40
|
const awaitInitialState = async () => {
|
|
41
|
-
const state = await buildStateFromSchema({ fieldSchema: fields, data: dataToRender, operation: 'update', id, user });
|
|
41
|
+
const state = await buildStateFromSchema({ fieldSchema: fields, data: dataToRender, operation: 'update', id, user, locale });
|
|
42
42
|
setInitialState(state);
|
|
43
43
|
};
|
|
44
44
|
awaitInitialState();
|
|
45
|
-
}, [dataToRender, fields, id, user]);
|
|
45
|
+
}, [dataToRender, fields, id, user, locale]);
|
|
46
46
|
return (React.createElement(NegativeFieldGutterProvider, { allow: true },
|
|
47
47
|
React.createElement(RenderCustomComponent, { DefaultComponent: DefaultAccount, CustomComponent: CustomAccount, componentProps: {
|
|
48
48
|
action,
|
|
@@ -22,9 +22,9 @@ const GlobalView = (props) => {
|
|
|
22
22
|
const { slug, label, fields, admin: { components: { views: { Edit: CustomEdit, } = {}, } = {}, } = {}, } = global;
|
|
23
23
|
const onSave = useCallback(async (json) => {
|
|
24
24
|
getVersions();
|
|
25
|
-
const state = await buildStateFromSchema({ fieldSchema: fields, data: json.result, operation: 'update', user });
|
|
25
|
+
const state = await buildStateFromSchema({ fieldSchema: fields, data: json.result, operation: 'update', user, locale });
|
|
26
26
|
setInitialState(state);
|
|
27
|
-
}, [getVersions, fields, user]);
|
|
27
|
+
}, [getVersions, fields, user, locale]);
|
|
28
28
|
const [{ data, isLoading }] = usePayloadAPI(`${serverURL}${api}/globals/${slug}`, { initialParams: { 'fallback-locale': 'null', depth: 0, draft: 'true' } });
|
|
29
29
|
const dataToRender = (locationState === null || locationState === void 0 ? void 0 : locationState.data) || data;
|
|
30
30
|
useEffect(() => {
|
|
@@ -35,11 +35,11 @@ const GlobalView = (props) => {
|
|
|
35
35
|
}, [setStepNav, label]);
|
|
36
36
|
useEffect(() => {
|
|
37
37
|
const awaitInitialState = async () => {
|
|
38
|
-
const state = await buildStateFromSchema({ fieldSchema: fields, data: dataToRender, user, operation: 'update' });
|
|
38
|
+
const state = await buildStateFromSchema({ fieldSchema: fields, data: dataToRender, user, operation: 'update', locale });
|
|
39
39
|
setInitialState(state);
|
|
40
40
|
};
|
|
41
41
|
awaitInitialState();
|
|
42
|
-
}, [dataToRender, fields, user]);
|
|
42
|
+
}, [dataToRender, fields, user, locale]);
|
|
43
43
|
const globalPermissions = (_a = permissions === null || permissions === void 0 ? void 0 : permissions.globals) === null || _a === void 0 ? void 0 : _a[slug];
|
|
44
44
|
return (React.createElement(NegativeFieldGutterProvider, { allow: true },
|
|
45
45
|
React.createElement(RenderCustomComponent, { DefaultComponent: DefaultGlobal, CustomComponent: CustomEdit, componentProps: {
|
|
@@ -32,10 +32,10 @@ const EditView = (props) => {
|
|
|
32
32
|
history.push(`${admin}/collections/${collection.slug}/${(_a = json === null || json === void 0 ? void 0 : json.doc) === null || _a === void 0 ? void 0 : _a.id}`);
|
|
33
33
|
}
|
|
34
34
|
else {
|
|
35
|
-
const state = await buildStateFromSchema({ fieldSchema: collection.fields, data: json.doc, user, id, operation: 'update' });
|
|
35
|
+
const state = await buildStateFromSchema({ fieldSchema: collection.fields, data: json.doc, user, id, operation: 'update', locale });
|
|
36
36
|
setInitialState(state);
|
|
37
37
|
}
|
|
38
|
-
}, [admin, collection, history, isEditing, getVersions, user, id]);
|
|
38
|
+
}, [admin, collection, history, isEditing, getVersions, user, id, locale]);
|
|
39
39
|
const [{ data, isLoading, isError }] = usePayloadAPI((isEditing ? `${serverURL}${api}/${slug}/${id}` : null), { initialParams: { 'fallback-locale': 'null', depth: 0, draft: 'true' } });
|
|
40
40
|
const dataToRender = (locationState === null || locationState === void 0 ? void 0 : locationState.data) || data;
|
|
41
41
|
useEffect(() => {
|
|
@@ -70,12 +70,15 @@ const EditView = (props) => {
|
|
|
70
70
|
setStepNav(nav);
|
|
71
71
|
}, [setStepNav, isEditing, pluralLabel, dataToRender, slug, useAsTitle, admin]);
|
|
72
72
|
useEffect(() => {
|
|
73
|
+
if (isLoading) {
|
|
74
|
+
return;
|
|
75
|
+
}
|
|
73
76
|
const awaitInitialState = async () => {
|
|
74
|
-
const state = await buildStateFromSchema({ fieldSchema: fields, data: dataToRender, user, operation: isEditing ? 'update' : 'create', id });
|
|
77
|
+
const state = await buildStateFromSchema({ fieldSchema: fields, data: dataToRender, user, operation: isEditing ? 'update' : 'create', id, locale });
|
|
75
78
|
setInitialState(state);
|
|
76
79
|
};
|
|
77
80
|
awaitInitialState();
|
|
78
|
-
}, [dataToRender, fields, isEditing, id, user]);
|
|
81
|
+
}, [dataToRender, fields, isEditing, id, user, locale, isLoading]);
|
|
79
82
|
if (isError) {
|
|
80
83
|
return (React.createElement(Redirect, { to: `${admin}/not-found` }));
|
|
81
84
|
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
const load_1 = __importDefault(require("../../config/load"));
|
|
7
|
+
const testCredentials_1 = require("../../mongoose/testCredentials");
|
|
8
|
+
require('isomorphic-fetch');
|
|
9
|
+
const { serverURL: url } = (0, load_1.default)();
|
|
10
|
+
let token = null;
|
|
11
|
+
let headers = null;
|
|
12
|
+
describe('DefaultValue - REST', () => {
|
|
13
|
+
beforeAll(async (done) => {
|
|
14
|
+
const response = await fetch(`${url}/api/admins/login`, {
|
|
15
|
+
body: JSON.stringify({
|
|
16
|
+
email: testCredentials_1.email,
|
|
17
|
+
password: testCredentials_1.password,
|
|
18
|
+
}),
|
|
19
|
+
headers: {
|
|
20
|
+
'Content-Type': 'application/json',
|
|
21
|
+
},
|
|
22
|
+
method: 'post',
|
|
23
|
+
});
|
|
24
|
+
const data = await response.json();
|
|
25
|
+
({ token } = data);
|
|
26
|
+
headers = {
|
|
27
|
+
Authorization: `JWT ${token}`,
|
|
28
|
+
'Content-Type': 'application/json',
|
|
29
|
+
};
|
|
30
|
+
done();
|
|
31
|
+
});
|
|
32
|
+
describe('DefaultValues', () => {
|
|
33
|
+
let document;
|
|
34
|
+
beforeAll(async (done) => {
|
|
35
|
+
const result = await fetch(`${url}/api/default-values`, {
|
|
36
|
+
body: JSON.stringify({}),
|
|
37
|
+
headers,
|
|
38
|
+
method: 'post',
|
|
39
|
+
});
|
|
40
|
+
const data = await result.json();
|
|
41
|
+
document = data.doc;
|
|
42
|
+
done();
|
|
43
|
+
});
|
|
44
|
+
it('should create with defaultValues saved', async () => {
|
|
45
|
+
expect(document.id).toBeDefined();
|
|
46
|
+
expect(document.function).toStrictEqual('function');
|
|
47
|
+
expect(document.asyncText).toStrictEqual('asyncFunction');
|
|
48
|
+
expect(document.array[0].arrayText1).toStrictEqual('Get out');
|
|
49
|
+
expect(document.group.nestedText1).toStrictEqual('this should take priority');
|
|
50
|
+
expect(document.group.nestedText2).toStrictEqual('nested default text 2');
|
|
51
|
+
expect(document.group.nestedText3).toStrictEqual('neat');
|
|
52
|
+
});
|
|
53
|
+
it('should not overwrite other locales when updating', async () => {
|
|
54
|
+
const slug = 'updated';
|
|
55
|
+
const esSlug = 'spanish';
|
|
56
|
+
const createResult = await fetch(`${url}/api/default-values`, {
|
|
57
|
+
body: JSON.stringify({
|
|
58
|
+
text: 'unique',
|
|
59
|
+
slug: 'unique',
|
|
60
|
+
}),
|
|
61
|
+
headers,
|
|
62
|
+
method: 'post',
|
|
63
|
+
});
|
|
64
|
+
const createData = await createResult.json();
|
|
65
|
+
const { id } = createData.doc;
|
|
66
|
+
const enResult = await fetch(`${url}/api/default-values/${id}?locale=en`, {
|
|
67
|
+
body: JSON.stringify({
|
|
68
|
+
slug,
|
|
69
|
+
}),
|
|
70
|
+
headers,
|
|
71
|
+
method: 'put',
|
|
72
|
+
});
|
|
73
|
+
const enData = await enResult.json();
|
|
74
|
+
const esResult = await fetch(`${url}/api/default-values/${id}?locale=es`, {
|
|
75
|
+
body: JSON.stringify({
|
|
76
|
+
slug: esSlug,
|
|
77
|
+
}),
|
|
78
|
+
headers,
|
|
79
|
+
method: 'put',
|
|
80
|
+
});
|
|
81
|
+
const esData = await esResult.json();
|
|
82
|
+
const allResult = await fetch(`${url}/api/default-values/${id}?locale=all`, {
|
|
83
|
+
headers,
|
|
84
|
+
method: 'get',
|
|
85
|
+
});
|
|
86
|
+
const allData = await allResult.json();
|
|
87
|
+
expect(createData.doc.slug).toStrictEqual('unique');
|
|
88
|
+
expect(enData.doc.slug).toStrictEqual(slug);
|
|
89
|
+
expect(esData.doc.slug).toStrictEqual(esSlug);
|
|
90
|
+
expect(allData.slug.en).toStrictEqual(slug);
|
|
91
|
+
expect(allData.slug.es).toStrictEqual(esSlug);
|
|
92
|
+
});
|
|
93
|
+
});
|
|
94
|
+
});
|
|
95
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGVmYXVsdFZhbHVlLnNwZWMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvY29sbGVjdGlvbnMvdGVzdHMvZGVmYXVsdFZhbHVlLnNwZWMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFBQSw2REFBMEM7QUFDMUMsb0VBQWlFO0FBRWpFLE9BQU8sQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDO0FBRTVCLE1BQU0sRUFBRSxTQUFTLEVBQUUsR0FBRyxFQUFFLEdBQUcsSUFBQSxjQUFTLEdBQUUsQ0FBQztBQUV2QyxJQUFJLEtBQUssR0FBRyxJQUFJLENBQUM7QUFDakIsSUFBSSxPQUFPLEdBQUcsSUFBSSxDQUFDO0FBRW5CLFFBQVEsQ0FBQyxxQkFBcUIsRUFBRSxHQUFHLEVBQUU7SUFDbkMsU0FBUyxDQUFDLEtBQUssRUFBRSxJQUFJLEVBQUUsRUFBRTtRQUN2QixNQUFNLFFBQVEsR0FBRyxNQUFNLEtBQUssQ0FBQyxHQUFHLEdBQUcsbUJBQW1CLEVBQUU7WUFDdEQsSUFBSSxFQUFFLElBQUksQ0FBQyxTQUFTLENBQUM7Z0JBQ25CLEtBQUssRUFBTCx1QkFBSztnQkFDTCxRQUFRLEVBQVIsMEJBQVE7YUFDVCxDQUFDO1lBQ0YsT0FBTyxFQUFFO2dCQUNQLGNBQWMsRUFBRSxrQkFBa0I7YUFDbkM7WUFDRCxNQUFNLEVBQUUsTUFBTTtTQUNmLENBQUMsQ0FBQztRQUVILE1BQU0sSUFBSSxHQUFHLE1BQU0sUUFBUSxDQUFDLElBQUksRUFBRSxDQUFDO1FBRW5DLENBQUMsRUFBRSxLQUFLLEVBQUUsR0FBRyxJQUFJLENBQUMsQ0FBQztRQUNuQixPQUFPLEdBQUc7WUFDUixhQUFhLEVBQUUsT0FBTyxLQUFLLEVBQUU7WUFDN0IsY0FBYyxFQUFFLGtCQUFrQjtTQUNuQyxDQUFDO1FBRUYsSUFBSSxFQUFFLENBQUM7SUFDVCxDQUFDLENBQUMsQ0FBQztJQUVILFFBQVEsQ0FBQyxlQUFlLEVBQUUsR0FBRyxFQUFFO1FBQzdCLElB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
|