payload 0.15.13 → 0.16.2
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 +33 -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 +4 -2
- 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/auth/operations/login.js +6 -8
- package/dist/collections/config/types.d.ts +1 -0
- package/dist/collections/operations/create.js +21 -20
- package/dist/collections/operations/delete.js +6 -7
- package/dist/collections/operations/find.js +8 -9
- package/dist/collections/operations/findByID.js +7 -9
- package/dist/collections/operations/findVersionByID.js +7 -9
- package/dist/collections/operations/findVersions.js +8 -10
- package/dist/collections/operations/restoreVersion.js +9 -13
- package/dist/collections/operations/update.js +26 -33
- package/dist/collections/tests/defaultValue.spec.d.ts +1 -0
- package/dist/collections/tests/defaultValue.spec.js +95 -0
- package/dist/collections/tests/hooks.spec.js +5 -1
- package/dist/fields/config/sanitize.d.ts +2 -1
- package/dist/fields/config/sanitize.js +5 -5
- package/dist/fields/config/sanitize.spec.js +30 -19
- package/dist/fields/config/schema.js +16 -15
- package/dist/fields/config/types.d.ts +8 -4
- package/dist/fields/config/types.js +6 -2
- package/dist/fields/getDefaultValue.d.ts +9 -0
- package/dist/fields/getDefaultValue.js +14 -0
- package/dist/fields/hooks/afterChange/index.d.ts +12 -0
- package/dist/fields/hooks/afterChange/index.js +26 -0
- package/dist/fields/hooks/afterChange/promise.d.ts +14 -0
- package/dist/fields/hooks/afterChange/promise.js +104 -0
- package/dist/fields/hooks/afterChange/traverseFields.d.ts +14 -0
- package/dist/fields/hooks/afterChange/traverseFields.js +20 -0
- package/dist/fields/hooks/afterRead/index.d.ts +16 -0
- package/dist/fields/hooks/afterRead/index.js +40 -0
- package/dist/fields/hooks/afterRead/promise.d.ts +18 -0
- package/dist/fields/hooks/afterRead/promise.js +225 -0
- package/dist/fields/hooks/afterRead/relationshipPopulationPromise.d.ts +13 -0
- package/dist/fields/hooks/afterRead/relationshipPopulationPromise.js +84 -0
- package/dist/fields/hooks/afterRead/traverseFields.d.ts +18 -0
- package/dist/fields/hooks/afterRead/traverseFields.js +24 -0
- package/dist/fields/hooks/beforeChange/index.d.ts +16 -0
- package/dist/fields/hooks/beforeChange/index.js +40 -0
- package/dist/fields/hooks/beforeChange/promise.d.ts +25 -0
- package/dist/fields/hooks/beforeChange/promise.js +236 -0
- package/dist/fields/hooks/beforeChange/traverseFields.d.ts +25 -0
- package/dist/fields/hooks/beforeChange/traverseFields.js +27 -0
- package/dist/fields/hooks/beforeValidate/index.d.ts +14 -0
- package/dist/fields/hooks/beforeValidate/index.js +28 -0
- package/dist/fields/hooks/beforeValidate/promise.d.ts +16 -0
- package/dist/fields/hooks/beforeValidate/promise.js +229 -0
- package/dist/fields/hooks/beforeValidate/traverseFields.d.ts +16 -0
- package/dist/fields/hooks/beforeValidate/traverseFields.js +22 -0
- package/dist/fields/richText/populate.d.ts +1 -3
- package/dist/fields/richText/populate.js +3 -3
- package/dist/fields/richText/recurseNestedFields.d.ts +1 -3
- package/dist/fields/richText/recurseNestedFields.js +7 -15
- package/dist/fields/richText/relationshipPromise.d.ts +6 -9
- package/dist/fields/richText/relationshipPromise.js +11 -15
- package/dist/fields/validations.js +3 -4
- package/dist/globals/config/types.d.ts +1 -0
- package/dist/globals/operations/findOne.js +11 -11
- package/dist/globals/operations/findVersionByID.js +5 -8
- package/dist/globals/operations/findVersions.js +7 -9
- package/dist/globals/operations/restoreVersion.js +12 -14
- package/dist/globals/operations/update.js +29 -33
- package/dist/graphql/schema/buildObjectType.js +3 -5
- package/dist/index.d.ts +0 -2
- package/dist/index.js +1 -3
- 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/drafts/saveCollectionDraft.d.ts +1 -1
- package/dist/versions/drafts/saveCollectionDraft.js +1 -1
- package/dist/versions/ensurePublishedCollectionVersion.js +5 -7
- package/dist/versions/ensurePublishedGlobalVersion.js +5 -6
- package/dist/versions/saveCollectionVersion.js +6 -7
- package/dist/versions/saveGlobalVersion.js +7 -7
- 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 +37 -2
- 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/hooks/collections.mdx +1 -0
- package/docs/hooks/fields.mdx +4 -3
- package/docs/hooks/globals.mdx +1 -0
- package/docs/production/preventing-abuse.mdx +16 -5
- package/docs/queries/overview.mdx +1 -1
- package/docs/rest-api/overview.mdx +1 -1
- package/package.json +4 -1
- package/dist/admin/components/forms/Form/buildStateFromSchema.js +0 -140
- package/dist/fields/accessPromise.d.ts +0 -22
- package/dist/fields/accessPromise.js +0 -39
- package/dist/fields/hookPromise.d.ts +0 -16
- package/dist/fields/hookPromise.js +0 -53
- package/dist/fields/performFieldOperations.d.ts +0 -25
- package/dist/fields/performFieldOperations.js +0 -86
- package/dist/fields/relationshipPopulationPromise.d.ts +0 -15
- package/dist/fields/relationshipPopulationPromise.js +0 -86
- package/dist/fields/traverseFields.d.ts +0 -40
- package/dist/fields/traverseFields.js +0 -329
- package/dist/fields/validationPromise.d.ts +0 -22
- package/dist/fields/validationPromise.js +0 -34
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,36 @@
|
|
|
1
|
+
## [0.16.2](https://github.com/payloadcms/payload/compare/v0.16.1...v0.16.2) (2022-05-02)
|
|
2
|
+
|
|
3
|
+
|
|
4
|
+
### Bug Fixes
|
|
5
|
+
|
|
6
|
+
* checkbox defaultValues and more typing of sanitize ([#550](https://github.com/payloadcms/payload/issues/550)) ([1e4a68f](https://github.com/payloadcms/payload/commit/1e4a68f76eeaab58ced0cc500223a1b86d66668e))
|
|
7
|
+
|
|
8
|
+
|
|
9
|
+
### Features
|
|
10
|
+
|
|
11
|
+
* exposes findMany argument to afterRead hooks to discern between find and findByID ([b3832e2](https://github.com/payloadcms/payload/commit/b3832e21c91fa5d52067cfc24a0b4f8aa6e178ec))
|
|
12
|
+
* optimizes field operations ([18489fa](https://github.com/payloadcms/payload/commit/18489facebe5d7b0abc87dcc30fae28510b6bb19))
|
|
13
|
+
|
|
14
|
+
## [0.16.1](https://github.com/payloadcms/payload/compare/v0.16.0...v0.16.1) (2022-04-29)
|
|
15
|
+
|
|
16
|
+
|
|
17
|
+
### Features
|
|
18
|
+
|
|
19
|
+
* exposes payload within server-side validation args ([e46b942](https://github.com/payloadcms/payload/commit/e46b94225957bba7758a0a2c22776c44a2d2d633))
|
|
20
|
+
|
|
21
|
+
# [0.16.0](https://github.com/payloadcms/payload/compare/v0.15.13...v0.16.0) (2022-04-29)
|
|
22
|
+
|
|
23
|
+
|
|
24
|
+
### Bug Fixes
|
|
25
|
+
|
|
26
|
+
* file upload safely handles missing mimeTypes ([#540](https://github.com/payloadcms/payload/issues/540)) ([bf48fdf](https://github.com/payloadcms/payload/commit/bf48fdf18961a2e57bcc5aae73de4c569e97e42b))
|
|
27
|
+
|
|
28
|
+
|
|
29
|
+
### Features
|
|
30
|
+
|
|
31
|
+
* allow subfield readOnly to override parent readOnly ([#546](https://github.com/payloadcms/payload/issues/546)) ([834f4c2](https://github.com/payloadcms/payload/commit/834f4c270020bf32852c00a3abbb908853689006))
|
|
32
|
+
* 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))
|
|
33
|
+
|
|
1
34
|
## [0.15.13](https://github.com/payloadcms/payload/compare/v0.15.12...v0.15.13) (2022-04-26)
|
|
2
35
|
|
|
3
36
|
## [0.15.12](https://github.com/payloadcms/payload/compare/v0.15.11...v0.15.12) (2022-04-26)
|
|
@@ -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,11 +50,11 @@ 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 });
|
|
@@ -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
|
}
|
|
@@ -9,6 +9,7 @@ const getCookieExpiration_1 = __importDefault(require("../../utilities/getCookie
|
|
|
9
9
|
const isLocked_1 = __importDefault(require("../isLocked"));
|
|
10
10
|
const sanitizeInternalFields_1 = __importDefault(require("../../utilities/sanitizeInternalFields"));
|
|
11
11
|
const types_1 = require("../../fields/config/types");
|
|
12
|
+
const afterRead_1 = require("../../fields/hooks/afterRead");
|
|
12
13
|
async function login(incomingArgs) {
|
|
13
14
|
const { config, operations, secret } = this;
|
|
14
15
|
let args = incomingArgs;
|
|
@@ -109,15 +110,12 @@ async function login(incomingArgs) {
|
|
|
109
110
|
// /////////////////////////////////////
|
|
110
111
|
// afterRead - Fields
|
|
111
112
|
// /////////////////////////////////////
|
|
112
|
-
user = await
|
|
113
|
+
user = await (0, afterRead_1.afterRead)({
|
|
113
114
|
depth,
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
data: user,
|
|
117
|
-
hook: 'afterRead',
|
|
118
|
-
operation: 'read',
|
|
115
|
+
doc: user,
|
|
116
|
+
entityConfig: collectionConfig,
|
|
119
117
|
overrideAccess,
|
|
120
|
-
|
|
118
|
+
req,
|
|
121
119
|
showHiddenFields,
|
|
122
120
|
});
|
|
123
121
|
// /////////////////////////////////////
|
|
@@ -140,4 +138,4 @@ async function login(incomingArgs) {
|
|
|
140
138
|
};
|
|
141
139
|
}
|
|
142
140
|
exports.default = login;
|
|
143
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
141
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibG9naW4uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvYXV0aC9vcGVyYXRpb25zL2xvZ2luLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7O0FBQUEsZ0VBQStCO0FBRS9CLHlDQUErRDtBQUUvRCw4RkFBc0U7QUFDdEUsMkRBQW1DO0FBQ25DLG9HQUE0RTtBQUM1RSxxREFBdUY7QUFJdkYsNERBQXlEO0FBcUJ6RCxLQUFLLFVBQVUsS0FBSyxDQUFnQixZQUF1QjtJQUN6RCxNQUFNLEVBQUUsTUFBTSxFQUFFLFVBQVUsRUFBRSxNQUFNLEVBQUUsR0FBRyxJQUFJLENBQUM7SUFFNUMsSUFBSSxJQUFJLEdBQUcsWUFBWSxDQUFDO0lBRXhCLHdDQUF3QztJQUN4QywrQkFBK0I7SUFDL0Isd0NBQXdDO0lBRXhDLE1BQU0sSUFBSSxDQUFDLFVBQVUsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLGVBQWUsQ0FBQyxNQUFNLENBQUMsS0FBSyxFQUFFLFNBQVMsRUFBRSxJQUFJLEVBQUUsRUFBRTtRQUNsRixNQUFNLFNBQVMsQ0FBQztRQUVoQixJQUFJLEdBQUcsQ0FBQyxNQUFNLElBQUksQ0FBQztZQUNqQixJQUFJO1lBQ0osU0FBUyxFQUFFLE9BQU87U0FDbkIsQ0FBQyxDQUFDLElBQUksSUFBSSxDQUFDO0lBQ2QsQ0FBQyxFQUFFLE9BQU8sQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUFDO0lBRXRCLE1BQU0sRUFDSixVQUFVLEVBQUUsRUFDVixLQUFLLEVBQ0wsTUFBTSxFQUFFLGdCQUFnQixHQUN6QixFQUNELElBQUksRUFDSixHQUFHLEVBQ0gsS0FBSyxFQUNMLGNBQWMsRUFDZCxnQkFBZ0IsR0FDakIsR0FBRyxJQUFJLENBQUM7SUFFVCx3Q0FBd0M7SUFDeEMsUUFBUTtJQUNSLHdDQUF3QztJQUV4QyxNQUFNLEVBQUUsS0FBSyxFQUFFLGdCQUFnQixFQUFFLFFBQVEsRUFBRSxHQUFHLElBQUksQ0FBQztJQUVuRCxNQUFNLEtBQUssR0FBRyxnQkFBZ0IsQ0FBQyxDQUFDLENBQUUsZ0JBQTJCLENBQUMsV0FBVyxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQztJQUVuRiw2REFBNkQ7SUFDN0QsNEVBQTRFO0lBQzVFLE1BQU0sT0FBTyxHQUFHLE1BQU0sS0FBSyxDQUFDLGNBQWMsQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUVsRCxJQUFJLENBQUMsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLE1BQU0sSUFBSSxPQUFPLENBQUMsU0FBUyxLQUFLLEtBQUssQ0FBQyxFQUFFO1FBQ25GLE1BQU0sSUFBSSw0QkFBbUIsRUFBRSxDQUFDO0tBQ2pDO0lBRUQsSUFBSSxPQUFPLElBQUksSUFBQSxrQkFBUSxFQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUMsRUFBRTtRQUMxQyxNQUFNLElBQUksbUJBQVUsRUFBRSxDQUFDO0tBQ3hCO0lBRUQsTUFBTSxVQUFVLEdBQUcsTUFBTSxPQUFPLENBQUMsWUFBWSxDQUFDLFFBQVEsQ0FBQyxDQUFDO0lBRXhELE1BQU0sdUJBQXVCLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLGdCQUFnQixHQUFHLENBQUMsQ0FBQztJQUVqRixJQUFJLENBQUMsVUFBVSxDQUFDLElBQUksRUFBRTtRQUNwQixJQUFJLHVCQUF1QjtZQUFFLE1BQU0sT0FBTyxDQUFDLGdCQUFnQixFQUFFLENBQUM7UUFDOUQsTUFBTSxJQUFJLDRCQUFtQixFQUFFLENBQUM7S0FDakM7SUFFRCxJQUFJLHVCQUF1QixFQUFFO1FBQzNCLE1BQU0sVUFBVSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDO1lBQ3ZDLFVBQVUsRUFBRTtnQkFDVixLQUFLO2dCQUNMLE1BQU0sRUFBRSxnQkFBZ0I7YUFDekI7WUFDRCxHQUFHO1lBQ0gsSUFBSTtZQUNKLGNBQWMsRUFBRSxJQUFJO1NBQ3JCLENBQUMsQ0FBQztLQUNKO0lBRUQsSUFBSSxJQUFJLEdBQUcsT0FBTyxDQUFDLE1BQU0sQ0FBQyxFQUFFLFFBQVEsRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDO0lBQzlDLElBQUksR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQztJQUN4QyxJQUFJLEdBQUcsSUFBQSxnQ0FBc0IsRUFBQyxJQUFJLENBQUMsQ0FBQztJQUVwQyxNQUFNLFlBQVksR0FBRyxnQkFBZ0IsQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUMsWUFBWSxFQUFFLEtBQVksRUFBRSxFQUFFO1FBQ2pGLE1BQU0sTUFBTSxHQUFHO1lBQ2IsR0FBRyxZQUFZO1NBQ2hCLENBQUM7UUFFRixJQUFJLENBQUMsSUFBQSx3QkFBZ0IsRUFBQyxLQUFLLENBQUMsSUFBSSxJQUFBLHlCQUFpQixFQUFDLEtBQUssQ0FBQyxFQUFFO1lBQ3hELEtBQUssQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLENBQUMsUUFBUSxFQUFFLEVBQUU7Z0JBQ2hDLElBQUksSUFBQSx3QkFBZ0IsRUFBQyxRQUFRLENBQUMsSUFBSSxRQUFRLENBQUMsU0FBUyxFQUFFO29CQUNwRCxNQUFNLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLENBQUM7aUJBQzdDO1lBQ0gsQ0FBQyxDQUFDLENBQUM7U0FDSjtRQUVELElBQUksSUFBQSx3QkFBZ0IsRUFBQyxLQUFLLENBQUMsSUFBSSxLQUFLLENBQUMsU0FBUyxFQUFFO1lBQzlDLE1BQU0sQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQztTQUN2QztRQUVELE9BQU8sTUFBTSxDQUFDO0lBQ2hCLENBQUMsRUFBRTtRQUNELEtBQUs7UUFDTCxFQUFFLEVBQUUsSUFBSSxDQUFDLEVBQUU7UUFDWCxVQUFVLEVBQUUsZ0JBQWdCLENBQUMsSUFBSTtLQUNsQyxDQUFDLENBQUM7SUFFSCxNQUFNLEtBQUssR0FBRyxzQkFBRyxDQUFDLElBQUksQ0FDcEIsWUFBWSxFQUNaLE1BQU0sRUFDTjtRQUNFLFNBQVMsRUFBRSxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsZUFBZTtLQUNqRCxDQUNGLENBQUM7SUFFRixJQUFJLElBQUksQ0FBQyxHQUFHLEVBQUU7UUFDWixNQUFNLGFBQWEsR0FBa0I7WUFDbkMsSUFBSSxFQUFFLEdBQUc7WUFDVCxRQUFRLEVBQUUsSUFBSTtZQUNkLE9BQU8sRUFBRSxJQUFBLDZCQUFtQixFQUFDLGdCQUFnQixDQUFDLElBQUksQ0FBQyxlQUFlLENBQUM7WUFDbkUsTUFBTSxFQUFFLGdCQUFnQixDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsTUFBTTtZQUM1QyxRQUFRLEVBQUUsZ0JBQWdCLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxRQUFRO1lBQ2hELE1BQU0sRUFBRSxTQUFTO1NBQ2xCLENBQUM7UUFFRixJQUFJLGdCQUFnQixDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsTUFBTTtZQUFFLGFBQWEsQ0FBQyxNQUFNLEdBQUcsZ0JBQWdCLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUM7UUFFdEcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsR0FBRyxNQUFNLENBQUMsWUFBWSxRQUFRLEVBQUUsS0FBSyxFQUFFLGFBQWEsQ0FBQyxDQUFDO0tBQ3ZFO0lBRUQsR0FBRyxDQUFDLElBQUksR0FBRyxJQUFJLENBQUM7SUFFaEIsd0NBQXdDO0lBQ3hDLDBCQUEwQjtJQUMxQix3Q0FBd0M7SUFFeEMsTUFBTSxnQkFBZ0IsQ0FBQyxLQUFLLENBQUMsVUFBVSxDQUFDLE1BQU0sQ0FBQyxLQUFLLEVBQUUsU0FBUyxFQUFFLElBQUksRUFBRSxFQUFFO1FBQ3ZFLE1BQU0sU0FBUyxDQUFDO1FBRWhCLElBQUksR0FBRyxNQUFNLElBQUksQ0FBQztZQUNoQixHQUFHLEVBQUUsSUFBSTtZQUNULEdBQUcsRUFBRSxJQUFJLENBQUMsR0FBRztZQUNiLEtBQUs7U0FDTixDQUFDLElBQUksSUFBSSxDQUFDO0lBQ2IsQ0FBQyxFQUFFLE9BQU8sQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUFDO0lBRXRCLHdDQUF3QztJQUN4QyxxQkFBcUI7SUFDckIsd0NBQXdDO0lBRXhDLElBQUksR0FBRyxNQUFNLElBQUEscUJBQVMsRUFBQztRQUNyQixLQUFLO1FBQ0wsR0FBRyxFQUFFLElBQUk7UUFDVCxZQUFZLEVBQUUsZ0JBQWdCO1FBQzlCLGNBQWM7UUFDZCxHQUFHO1FBQ0gsZ0JBQWdCO0tBQ2pCLENBQUMsQ0FBQztJQUVILHdDQUF3QztJQUN4Qyx5QkFBeUI7SUFDekIsd0NBQXdDO0lBRXhDLE1BQU0sZ0JBQWdCLENBQUMsS0FBSyxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsS0FBSyxFQUFFLFNBQVMsRUFBRSxJQUFJLEVBQUUsRUFBRTtRQUN0RSxNQUFNLFNBQVMsQ0FBQztRQUVoQixJQUFJLEdBQUcsTUFBTSxJQUFJLENBQUM7WUFDaEIsR0FBRztZQUNILEdBQUcsRUFBRSxJQUFJO1NBQ1YsQ0FBQyxJQUFJLElBQUksQ0FBQztJQUNiLENBQUMsRUFBRSxPQUFPLENBQUMsT0FBTyxFQUFFLENBQUMsQ0FBQztJQUV0Qix3Q0FBd0M7SUFDeEMsaUJBQWlCO0lBQ2pCLHdDQUF3QztJQUV4QyxPQUFPO1FBQ0wsS0FBSztRQUNMLElBQUk7UUFDSixHQUFHLEVBQUcsc0JBQUcsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFvQixDQUFDLEdBQUc7S0FDL0MsQ0FBQztBQUNKLENBQUM7QUFFRCxrQkFBZSxLQUFLLENBQUMifQ==
|