payload 1.1.28-beta.0 → 1.2.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.
Files changed (127) hide show
  1. package/CHANGELOG.md +116 -97
  2. package/components/fields/Select.ts +1 -1
  3. package/dist/admin/components/elements/ReactSelect/index.js +2 -2
  4. package/dist/admin/components/elements/VersionsCount/index.js +1 -1
  5. package/dist/admin/components/elements/WhereBuilder/Condition/Text/index.js +5 -1
  6. package/dist/admin/components/forms/Form/buildStateFromSchema/addFieldStatePromise.d.ts +3 -3
  7. package/dist/admin/components/forms/Form/buildStateFromSchema/addFieldStatePromise.js +7 -7
  8. package/dist/admin/components/forms/Form/buildStateFromSchema/index.d.ts +2 -2
  9. package/dist/admin/components/forms/Form/buildStateFromSchema/index.js +2 -2
  10. package/dist/admin/components/forms/Form/buildStateFromSchema/iterateFields.d.ts +3 -3
  11. package/dist/admin/components/forms/Form/buildStateFromSchema/iterateFields.js +2 -2
  12. package/dist/admin/components/forms/Form/index.js +4 -4
  13. package/dist/admin/components/forms/field-types/Array/index.js +2 -2
  14. package/dist/admin/components/forms/field-types/Blocks/index.js +2 -2
  15. package/dist/admin/components/forms/field-types/Relationship/AddNew/Modal/index.js +2 -2
  16. package/dist/admin/components/forms/field-types/RichText/elements/link/Button.js +2 -2
  17. package/dist/admin/components/forms/field-types/RichText/elements/link/Element.js +3 -3
  18. package/dist/admin/components/forms/field-types/RichText/elements/upload/Element/EditModal/index.js +2 -2
  19. package/dist/admin/components/forms/field-types/Select/Input.js +13 -3
  20. package/dist/admin/components/forms/field-types/Textarea/Input.js +1 -1
  21. package/dist/admin/components/forms/field-types/Textarea/index.scss +3 -6
  22. package/dist/admin/components/forms/useField/index.js +2 -2
  23. package/dist/admin/components/utilities/I18n/index.js +4 -1
  24. package/dist/admin/components/views/Account/index.js +10 -5
  25. package/dist/admin/components/views/Global/index.js +5 -5
  26. package/dist/admin/components/views/Login/index.js +1 -1
  27. package/dist/admin/components/views/Version/RenderFieldsToDiff/fields/Iterable/index.js +1 -1
  28. package/dist/admin/components/views/Version/RenderFieldsToDiff/fields/Nested/index.js +15 -9
  29. package/dist/admin/components/views/Version/RenderFieldsToDiff/fields/Relationship/index.js +5 -2
  30. package/dist/admin/components/views/Version/RenderFieldsToDiff/fields/Select/index.d.ts +5 -0
  31. package/dist/admin/components/views/Version/RenderFieldsToDiff/fields/Select/index.js +34 -0
  32. package/dist/admin/components/views/Version/RenderFieldsToDiff/fields/Select/index.scss +10 -0
  33. package/dist/admin/components/views/Version/RenderFieldsToDiff/fields/Text/index.js +3 -2
  34. package/dist/admin/components/views/Version/RenderFieldsToDiff/fields/index.js +3 -2
  35. package/dist/admin/components/views/Versions/index.js +1 -1
  36. package/dist/admin/components/views/collections/Edit/Auth/APIKey.js +2 -2
  37. package/dist/admin/components/views/collections/Edit/Default.js +5 -2
  38. package/dist/admin/components/views/collections/Edit/SetStepNav.d.ts +7 -0
  39. package/dist/admin/components/views/collections/Edit/SetStepNav.js +31 -0
  40. package/dist/admin/components/views/collections/Edit/index.js +6 -40
  41. package/dist/admin/hooks/usePayloadAPI.js +3 -1
  42. package/dist/auth/executeAccess.js +3 -3
  43. package/dist/auth/getExecuteStaticAccess.js +2 -2
  44. package/dist/auth/operations/forgotPassword.js +5 -5
  45. package/dist/auth/operations/local/forgotPassword.js +3 -1
  46. package/dist/auth/operations/local/login.js +3 -1
  47. package/dist/auth/operations/local/resetPassword.js +3 -1
  48. package/dist/auth/operations/local/unlock.js +3 -1
  49. package/dist/auth/operations/login.js +4 -4
  50. package/dist/auth/operations/logout.js +2 -2
  51. package/dist/auth/operations/refresh.js +2 -2
  52. package/dist/auth/operations/registerFirstUser.js +2 -2
  53. package/dist/auth/sendVerificationEmail.js +3 -3
  54. package/dist/collections/operations/create.js +4 -4
  55. package/dist/collections/operations/delete.js +6 -6
  56. package/dist/collections/operations/findByID.js +4 -4
  57. package/dist/collections/operations/findVersionByID.js +5 -5
  58. package/dist/collections/operations/local/create.js +3 -1
  59. package/dist/collections/operations/local/delete.js +3 -1
  60. package/dist/collections/operations/local/find.js +3 -1
  61. package/dist/collections/operations/local/findByID.js +3 -1
  62. package/dist/collections/operations/local/findVersionByID.js +3 -1
  63. package/dist/collections/operations/local/findVersions.js +5 -2
  64. package/dist/collections/operations/local/restoreVersion.js +4 -2
  65. package/dist/collections/operations/local/update.js +5 -2
  66. package/dist/collections/operations/restoreVersion.js +5 -5
  67. package/dist/collections/operations/update.js +6 -6
  68. package/dist/collections/requestHandlers/create.js +2 -2
  69. package/dist/collections/requestHandlers/delete.js +2 -2
  70. package/dist/collections/requestHandlers/restoreVersion.js +2 -2
  71. package/dist/collections/requestHandlers/update.js +4 -4
  72. package/dist/errors/AuthenticationError.d.ts +2 -2
  73. package/dist/errors/AuthenticationError.js +3 -3
  74. package/dist/errors/ErrorDeletingFile.d.ts +2 -2
  75. package/dist/errors/ErrorDeletingFile.js +3 -3
  76. package/dist/errors/FileUploadError.d.ts +2 -2
  77. package/dist/errors/FileUploadError.js +3 -3
  78. package/dist/errors/Forbidden.d.ts +2 -2
  79. package/dist/errors/Forbidden.js +3 -3
  80. package/dist/errors/LockedAuth.d.ts +2 -2
  81. package/dist/errors/LockedAuth.js +3 -3
  82. package/dist/errors/MissingFile.d.ts +2 -2
  83. package/dist/errors/MissingFile.js +3 -3
  84. package/dist/errors/NotFound.d.ts +2 -2
  85. package/dist/errors/NotFound.js +3 -3
  86. package/dist/errors/UnathorizedError.d.ts +2 -2
  87. package/dist/errors/UnathorizedError.js +3 -3
  88. package/dist/errors/ValidationError.d.ts +2 -2
  89. package/dist/errors/ValidationError.js +3 -3
  90. package/dist/express/middleware/i18n.js +3 -3
  91. package/dist/express/types.d.ts +2 -1
  92. package/dist/fields/config/types.d.ts +2 -2
  93. package/dist/fields/hooks/beforeChange/index.js +2 -2
  94. package/dist/fields/hooks/beforeChange/promise.js +8 -2
  95. package/dist/fields/validations.js +51 -51
  96. package/dist/fields/validations.spec.js +2 -3
  97. package/dist/globals/operations/findVersionByID.js +5 -5
  98. package/dist/globals/operations/local/findOne.js +5 -1
  99. package/dist/globals/operations/local/findVersionByID.js +5 -1
  100. package/dist/globals/operations/local/findVersions.js +5 -1
  101. package/dist/globals/operations/local/restoreVersion.js +5 -1
  102. package/dist/globals/operations/local/update.js +5 -1
  103. package/dist/globals/operations/restoreVersion.js +3 -3
  104. package/dist/globals/requestHandlers/restoreVersion.js +2 -2
  105. package/dist/globals/requestHandlers/update.js +4 -4
  106. package/dist/preferences/operations/delete.js +2 -2
  107. package/dist/preferences/operations/findOne.js +2 -2
  108. package/dist/preferences/operations/update.js +2 -2
  109. package/dist/preferences/requestHandlers/delete.js +2 -2
  110. package/dist/preferences/requestHandlers/findOne.js +2 -2
  111. package/dist/preferences/requestHandlers/update.js +2 -2
  112. package/dist/translations/en.json +2 -0
  113. package/dist/translations/index.d.ts +5 -0
  114. package/dist/translations/init.d.ts +2 -2
  115. package/dist/translations/init.js +4 -1
  116. package/dist/translations/it.json +18 -15
  117. package/dist/uploads/generateFileData.js +3 -3
  118. package/dist/uploads/uploadFiles.d.ts +2 -2
  119. package/dist/uploads/uploadFiles.js +3 -3
  120. package/dist/versions/drafts/saveCollectionDraft.js +4 -3
  121. package/dist/versions/drafts/saveGlobalDraft.js +4 -3
  122. package/dist/versions/ensurePublishedCollectionVersion.js +2 -1
  123. package/dist/versions/ensurePublishedGlobalVersion.js +2 -1
  124. package/docs/authentication/config.mdx +1 -1
  125. package/docs/configuration/i18n.mdx +2 -2
  126. package/docs/fields/overview.mdx +1 -1
  127. package/package.json +1 -1
@@ -21,7 +21,7 @@ const TextareaInput = (props) => {
21
21
  } },
22
22
  React.createElement(Error, { showError: showError, message: errorMessage }),
23
23
  React.createElement(Label, { htmlFor: `field-${path.replace(/\./gi, '__')}`, label: label, required: required }),
24
- React.createElement("div", { className: "textarea-outer" },
24
+ React.createElement("label", { className: "textarea-outer", htmlFor: `field-${path.replace(/\./gi, '__')}` },
25
25
  React.createElement("div", { className: "textarea-inner" },
26
26
  React.createElement("div", { className: "textarea-clone", "data-value": value || placeholder || '' }),
27
27
  React.createElement("textarea", { className: "textarea-element", id: `field-${path.replace(/\./gi, '__')}`, value: value || '', onChange: onChange, disabled: readOnly, placeholder: getTranslation(placeholder, i18n), name: path, rows: rows }))),
@@ -6,12 +6,13 @@
6
6
 
7
7
  .textarea-outer {
8
8
  @include formInput();
9
+ display: flex;
9
10
  resize: vertical;
10
- height: auto;
11
11
  min-height: base(3);
12
+ height: 100%;
12
13
 
13
14
  // Scrollbar for giant content
14
- max-height: 90vh;
15
+ max-height: calc(100vh - $top-header-offset - calc(#{base(5)}));
15
16
  overflow: auto;
16
17
 
17
18
  @include mid-break {
@@ -31,7 +32,6 @@
31
32
  position: relative;
32
33
  line-height: inherit;
33
34
  flex-grow: 1;
34
- box-sizing: border-box;
35
35
  background: none;
36
36
  outline: none;
37
37
  }
@@ -49,7 +49,6 @@
49
49
  line-height: inherit;
50
50
  color: inherit;
51
51
  background: none;
52
- box-sizing: border-box;
53
52
  overflow: auto;
54
53
  resize: none;
55
54
  outline: none;
@@ -65,8 +64,6 @@
65
64
  vertical-align: top;
66
65
  display: inline-block;
67
66
  flex-grow: 1;
68
- white-space: pre;
69
- box-sizing: border-box;
70
67
  overflow: hidden;
71
68
  text-overflow: ellipsis;
72
69
  white-space: pre-wrap;
@@ -15,7 +15,7 @@ const useField = (options) => {
15
15
  const operation = useOperation();
16
16
  const field = useFormFields(([fields]) => fields[path]);
17
17
  const dispatchField = useFormFields(([_, dispatch]) => dispatch);
18
- const { i18n } = useTranslation();
18
+ const { t } = useTranslation();
19
19
  const { getData, getSiblingData, setModified } = useForm();
20
20
  const value = field === null || field === void 0 ? void 0 : field.value;
21
21
  const initialValue = field === null || field === void 0 ? void 0 : field.initialValue;
@@ -77,7 +77,7 @@ const useField = (options) => {
77
77
  data: getData(),
78
78
  siblingData: getSiblingData(path),
79
79
  operation,
80
- i18n,
80
+ t,
81
81
  };
82
82
  const validationResult = typeof validate === 'function' ? await validate(value, validateOptions) : true;
83
83
  if (typeof validationResult === 'string') {
@@ -6,10 +6,13 @@ import { defaultOptions } from '../../../../translations/defaultOptions';
6
6
  import { useConfig } from '../Config';
7
7
  export const I18n = () => {
8
8
  const config = useConfig();
9
+ if (i18n.isInitialized) {
10
+ return null;
11
+ }
9
12
  i18n
10
13
  .use(LanguageDetector)
11
14
  .use(initReactI18next)
12
- .init(deepmerge(defaultOptions, config.i18n || {}));
15
+ .init(deepmerge(defaultOptions, config.i18n || { debug: true }));
13
16
  return null;
14
17
  };
15
18
  export default I18n;
@@ -25,29 +25,34 @@ const AccountView = () => {
25
25
  }, } = {}, } = {
26
26
  user: 'users',
27
27
  }, } = useConfig();
28
- const { t, i18n } = useTranslation('account');
28
+ const { t } = useTranslation('authentication');
29
29
  const collection = collections.find((coll) => coll.slug === adminUser);
30
30
  const { fields } = collection;
31
31
  const collectionPermissions = (_a = permissions === null || permissions === void 0 ? void 0 : permissions.collections) === null || _a === void 0 ? void 0 : _a[adminUser];
32
- const [{ data }] = usePayloadAPI(`${serverURL}${api}/${collection === null || collection === void 0 ? void 0 : collection.slug}/${user === null || user === void 0 ? void 0 : user.id}?depth=0`, { initialParams: { 'fallback-locale': 'null' } });
32
+ const [{ data }] = usePayloadAPI(`${serverURL}${api}/${collection === null || collection === void 0 ? void 0 : collection.slug}/${user === null || user === void 0 ? void 0 : user.id}`, {
33
+ initialParams: {
34
+ 'fallback-locale': 'null',
35
+ depth: 0,
36
+ },
37
+ });
33
38
  const hasSavePermission = (_b = collectionPermissions === null || collectionPermissions === void 0 ? void 0 : collectionPermissions.update) === null || _b === void 0 ? void 0 : _b.permission;
34
39
  const dataToRender = (locationState === null || locationState === void 0 ? void 0 : locationState.data) || data;
35
40
  const apiURL = `${serverURL}${api}/${user.collection}/${data === null || data === void 0 ? void 0 : data.id}`;
36
41
  const action = `${serverURL}${api}/${user.collection}/${data === null || data === void 0 ? void 0 : data.id}?locale=${locale}&depth=0`;
37
42
  useEffect(() => {
38
43
  const nav = [{
39
- label: t('authentication:account'),
44
+ label: t('account'),
40
45
  }];
41
46
  setStepNav(nav);
42
47
  }, [setStepNav, t]);
43
48
  useEffect(() => {
44
49
  const awaitInitialState = async () => {
45
- const state = await buildStateFromSchema({ fieldSchema: fields, data: dataToRender, operation: 'update', id, user, locale, i18n });
50
+ const state = await buildStateFromSchema({ fieldSchema: fields, data: dataToRender, operation: 'update', id, user, locale, t });
46
51
  await getPreference(preferencesKey);
47
52
  setInitialState(state);
48
53
  };
49
54
  awaitInitialState();
50
- }, [dataToRender, fields, id, user, locale, preferencesKey, getPreference, i18n]);
55
+ }, [dataToRender, fields, id, user, locale, preferencesKey, getPreference, t]);
51
56
  return (React.createElement(RenderCustomComponent, { DefaultComponent: DefaultAccount, CustomComponent: CustomAccount, componentProps: {
52
57
  action,
53
58
  data,
@@ -20,15 +20,15 @@ const GlobalView = (props) => {
20
20
  const [initialState, setInitialState] = useState();
21
21
  const { getVersions, preferencesKey } = useDocumentInfo();
22
22
  const { getPreference } = usePreferences();
23
- const { i18n } = useTranslation();
23
+ const { t } = useTranslation();
24
24
  const { serverURL, routes: { api, }, } = useConfig();
25
25
  const { global } = props;
26
26
  const { slug, label, fields, admin: { components: { views: { Edit: CustomEdit, } = {}, } = {}, } = {}, } = global;
27
27
  const onSave = useCallback(async (json) => {
28
28
  getVersions();
29
- const state = await buildStateFromSchema({ fieldSchema: fields, data: json.result, operation: 'update', user, locale, i18n });
29
+ const state = await buildStateFromSchema({ fieldSchema: fields, data: json.result, operation: 'update', user, locale, t });
30
30
  setInitialState(state);
31
- }, [getVersions, fields, user, locale, i18n]);
31
+ }, [getVersions, fields, user, locale, t]);
32
32
  const [{ data }] = usePayloadAPI(`${serverURL}${api}/globals/${slug}`, { initialParams: { 'fallback-locale': 'null', depth: 0, draft: 'true' } });
33
33
  const dataToRender = (locationState === null || locationState === void 0 ? void 0 : locationState.data) || data;
34
34
  useEffect(() => {
@@ -39,12 +39,12 @@ const GlobalView = (props) => {
39
39
  }, [setStepNav, label]);
40
40
  useEffect(() => {
41
41
  const awaitInitialState = async () => {
42
- const state = await buildStateFromSchema({ fieldSchema: fields, data: dataToRender, user, operation: 'update', locale, i18n });
42
+ const state = await buildStateFromSchema({ fieldSchema: fields, data: dataToRender, user, operation: 'update', locale, t });
43
43
  await getPreference(preferencesKey);
44
44
  setInitialState(state);
45
45
  };
46
46
  awaitInitialState();
47
- }, [dataToRender, fields, user, locale, getPreference, preferencesKey, i18n]);
47
+ }, [dataToRender, fields, user, locale, getPreference, preferencesKey, t]);
48
48
  const globalPermissions = (_a = permissions === null || permissions === void 0 ? void 0 : permissions.globals) === null || _a === void 0 ? void 0 : _a[slug];
49
49
  return (React.createElement(RenderCustomComponent, { DefaultComponent: DefaultGlobal, CustomComponent: CustomEdit, componentProps: {
50
50
  isLoading: !initialState,
@@ -45,7 +45,7 @@ const Login = () => {
45
45
  !collection.auth.disableLocalStrategy && (React.createElement(Form, { disableSuccessStatus: true, waitForAutocomplete: true, onSuccess: onSuccess, method: "post", action: `${serverURL}${api}/${userSlug}/login` },
46
46
  React.createElement(Email, { label: t('general:email'), name: "email", admin: { autoComplete: 'email' }, required: true }),
47
47
  React.createElement(Password, { label: t('general:password'), name: "password", autoComplete: "off", required: true }),
48
- React.createElement(Link, { to: `${admin}/forgot` }, t('forgotPassword')),
48
+ React.createElement(Link, { to: `${admin}/forgot` }, t('forgotPasswordQuestion')),
49
49
  React.createElement(FormSubmit, null, t('login')))),
50
50
  Array.isArray(afterLogin) && afterLogin.map((Component, i) => React.createElement(Component, { key: i }))));
51
51
  };
@@ -16,7 +16,7 @@ const Iterable = ({ version, comparison, permissions, field, locale, locales, fi
16
16
  return (React.createElement("div", { className: baseClass },
17
17
  field.label && (React.createElement(Label, null,
18
18
  locale && (React.createElement("span", { className: `${baseClass}__locale-label` }, locale)),
19
- field.label)),
19
+ getTranslation(field.label, i18n))),
20
20
  maxRows > 0 && (React.createElement(React.Fragment, null, Array.from(Array(maxRows).keys()).map((row, i) => {
21
21
  const versionRow = (version === null || version === void 0 ? void 0 : version[i]) || {};
22
22
  const comparisonRow = (comparison === null || comparison === void 0 ? void 0 : comparison[i]) || {};
@@ -1,15 +1,21 @@
1
1
  import React from 'react';
2
+ import { useTranslation } from 'react-i18next';
2
3
  import RenderFieldsToDiff from '../..';
3
4
  import Label from '../../Label';
5
+ import { getTranslation } from '../../../../../../../utilities/getTranslation';
4
6
  import './index.scss';
5
7
  const baseClass = 'nested-diff';
6
- const Nested = ({ version, comparison, permissions, field, locale, locales, fieldComponents, disableGutter = false, }) => (React.createElement("div", { className: baseClass },
7
- field.label && (React.createElement(Label, null,
8
- locale && (React.createElement("span", { className: `${baseClass}__locale-label` }, locale)),
9
- field.label)),
10
- React.createElement("div", { className: [
11
- `${baseClass}__wrap`,
12
- !disableGutter && `${baseClass}__wrap--gutter`,
13
- ].filter(Boolean).join(' ') },
14
- React.createElement(RenderFieldsToDiff, { locales: locales, version: version, comparison: comparison, fieldPermissions: permissions, fields: field.fields, fieldComponents: fieldComponents }))));
8
+ const Nested = ({ version, comparison, permissions, field, locale, locales, fieldComponents, disableGutter = false, }) => {
9
+ const { i18n } = useTranslation();
10
+ return (React.createElement("div", { className: baseClass },
11
+ field.label && (React.createElement(Label, null,
12
+ locale && (React.createElement("span", { className: `${baseClass}__locale-label` }, locale)),
13
+ getTranslation(field.label, i18n))),
14
+ React.createElement("div", { className: [
15
+ `${baseClass}__wrap`,
16
+ !disableGutter && `${baseClass}__wrap--gutter`,
17
+ ].filter(Boolean)
18
+ .join(' ') },
19
+ React.createElement(RenderFieldsToDiff, { locales: locales, version: version, comparison: comparison, fieldPermissions: permissions, fields: field.fields, fieldComponents: fieldComponents }))));
20
+ };
15
21
  export default Nested;
@@ -1,10 +1,12 @@
1
1
  import React from 'react';
2
2
  import ReactDiffViewer from 'react-diff-viewer';
3
+ import { useTranslation } from 'react-i18next';
3
4
  import { useConfig } from '../../../../../utilities/Config';
4
5
  import { useLocale } from '../../../../../utilities/Locale';
5
6
  import { fieldAffectsData, fieldIsPresentationalOnly } from '../../../../../../../fields/config/types';
6
7
  import Label from '../../Label';
7
8
  import { diffStyles } from '../styles';
9
+ import { getTranslation } from '../../../../../../../utilities/getTranslation';
8
10
  import './index.scss';
9
11
  const baseClass = 'relationship-diff';
10
12
  const generateLabelFromValue = (collections, field, locale, value) => {
@@ -43,10 +45,11 @@ const generateLabelFromValue = (collections, field, locale, value) => {
43
45
  };
44
46
  const Relationship = ({ field, version, comparison }) => {
45
47
  const { collections } = useConfig();
48
+ const { t, i18n } = useTranslation('general');
46
49
  const locale = useLocale();
47
50
  let placeholder = '';
48
51
  if (version === comparison)
49
- placeholder = '[no value]';
52
+ placeholder = `[${t('noValue')}]`;
50
53
  let versionToRender = version;
51
54
  let comparisonToRender = comparison;
52
55
  if (field.hasMany) {
@@ -62,7 +65,7 @@ const Relationship = ({ field, version, comparison }) => {
62
65
  return (React.createElement("div", { className: baseClass },
63
66
  React.createElement(Label, null,
64
67
  locale && (React.createElement("span", { className: `${baseClass}__locale-label` }, locale)),
65
- field.label),
68
+ getTranslation(field.label, i18n)),
66
69
  React.createElement(ReactDiffViewer, { styles: diffStyles, oldValue: typeof comparisonToRender !== 'undefined' ? String(comparisonToRender) : placeholder, newValue: typeof versionToRender !== 'undefined' ? String(versionToRender) : placeholder, splitView: true, hideLineNumbers: true, showDiffOnly: false })));
67
70
  return null;
68
71
  };
@@ -0,0 +1,5 @@
1
+ import React from 'react';
2
+ import { Props } from '../types';
3
+ import './index.scss';
4
+ declare const Select: React.FC<Props>;
5
+ export default Select;
@@ -0,0 +1,34 @@
1
+ import React from 'react';
2
+ import ReactDiffViewer, { DiffMethod } from 'react-diff-viewer';
3
+ import { useTranslation } from 'react-i18next';
4
+ import Label from '../../Label';
5
+ import { diffStyles } from '../styles';
6
+ import { getTranslation } from '../../../../../../../utilities/getTranslation';
7
+ import './index.scss';
8
+ const baseClass = 'select-diff';
9
+ const getOptionsToRender = (value, options, hasMany) => {
10
+ if (hasMany && Array.isArray(value)) {
11
+ return value.map((val) => options.find((option) => (typeof option === 'string' ? option : option.value) === val));
12
+ }
13
+ return options.find((option) => (typeof option === 'string' ? option : option.value) === value);
14
+ };
15
+ const getTranslatedOptions = (options, i18n) => {
16
+ if (Array.isArray(options)) {
17
+ return options.map((option) => (typeof option === 'string' ? option : getTranslation(option.label, i18n))).join(', ');
18
+ }
19
+ return typeof options === 'string' ? options : getTranslation(options.label, i18n);
20
+ };
21
+ const Select = ({ field, locale, version, comparison, diffMethod }) => {
22
+ let placeholder = '';
23
+ const { t, i18n } = useTranslation('general');
24
+ if (version === comparison)
25
+ placeholder = `[${t('noValue')}]`;
26
+ const comparisonToRender = typeof comparison !== 'undefined' ? getTranslatedOptions(getOptionsToRender(comparison, field.options, field.hasMany), i18n) : placeholder;
27
+ const versionToRender = typeof version !== 'undefined' ? getTranslatedOptions(getOptionsToRender(version, field.options, field.hasMany), i18n) : placeholder;
28
+ return (React.createElement("div", { className: baseClass },
29
+ React.createElement(Label, null,
30
+ locale && (React.createElement("span", { className: `${baseClass}__locale-label` }, locale)),
31
+ getTranslation(field.label, i18n)),
32
+ React.createElement(ReactDiffViewer, { styles: diffStyles, compareMethod: DiffMethod[diffMethod], oldValue: comparisonToRender, newValue: typeof versionToRender !== 'undefined' ? versionToRender : placeholder, splitView: true, hideLineNumbers: true, showDiffOnly: false })));
33
+ };
34
+ export default Select;
@@ -0,0 +1,10 @@
1
+ @import '../../../../../../scss/styles.scss';
2
+
3
+ .select-diff {
4
+ &__locale-label {
5
+ margin-right: base(.25);
6
+ background: var(--theme-elevation-100);
7
+ padding: base(.25);
8
+ border-radius: $style-radius-m;
9
+ }
10
+ }
@@ -3,11 +3,12 @@ import ReactDiffViewer, { DiffMethod } from 'react-diff-viewer';
3
3
  import { useTranslation } from 'react-i18next';
4
4
  import Label from '../../Label';
5
5
  import { diffStyles } from '../styles';
6
+ import { getTranslation } from '../../../../../../../utilities/getTranslation';
6
7
  import './index.scss';
7
8
  const baseClass = 'text-diff';
8
9
  const Text = ({ field, locale, version, comparison, isRichText = false, diffMethod }) => {
9
10
  let placeholder = '';
10
- const { t } = useTranslation('general');
11
+ const { t, i18n } = useTranslation('general');
11
12
  if (version === comparison)
12
13
  placeholder = `[${t('noValue')}]`;
13
14
  let versionToRender = version;
@@ -21,7 +22,7 @@ const Text = ({ field, locale, version, comparison, isRichText = false, diffMeth
21
22
  return (React.createElement("div", { className: baseClass },
22
23
  React.createElement(Label, null,
23
24
  locale && (React.createElement("span", { className: `${baseClass}__locale-label` }, locale)),
24
- field.label),
25
+ getTranslation(field.label, i18n)),
25
26
  React.createElement(ReactDiffViewer, { styles: diffStyles, compareMethod: DiffMethod[diffMethod], oldValue: typeof comparisonToRender !== 'undefined' ? String(comparisonToRender) : placeholder, newValue: typeof versionToRender !== 'undefined' ? String(versionToRender) : placeholder, splitView: true, hideLineNumbers: true, showDiffOnly: false })));
26
27
  };
27
28
  export default Text;
@@ -3,6 +3,7 @@ import Nested from './Nested';
3
3
  import Iterable from './Iterable';
4
4
  import Relationship from './Relationship';
5
5
  import Tabs from './Tabs';
6
+ import Select from './Select';
6
7
  export default {
7
8
  text: Text,
8
9
  textarea: Text,
@@ -10,14 +11,14 @@ export default {
10
11
  email: Text,
11
12
  code: Text,
12
13
  checkbox: Text,
13
- radio: Text,
14
+ radio: Select,
14
15
  row: Nested,
15
16
  collapsible: Nested,
16
17
  group: Nested,
17
18
  array: Iterable,
18
19
  blocks: Iterable,
19
20
  date: Text,
20
- select: Text,
21
+ select: Select,
21
22
  richText: Text,
22
23
  relationship: Relationship,
23
24
  upload: Relationship,
@@ -148,7 +148,7 @@ const Versions = ({ collection, global }) => {
148
148
  React.createElement(Eyebrow, null),
149
149
  React.createElement(Gutter, { className: `${baseClass}__wrap` },
150
150
  React.createElement("header", { className: `${baseClass}__header` },
151
- React.createElement("div", { className: `${baseClass}__intro` }, "Showing versions for:"),
151
+ React.createElement("div", { className: `${baseClass}__intro` }, t('showingVersionsFor')),
152
152
  useIDLabel && (React.createElement(IDLabel, { id: doc === null || doc === void 0 ? void 0 : doc.id })),
153
153
  !useIDLabel && (React.createElement("h1", null, heading))),
154
154
  isLoadingVersions && (React.createElement(Loading, null)),
@@ -12,9 +12,9 @@ const baseClass = 'api-key';
12
12
  const APIKey = () => {
13
13
  const [initialAPIKey, setInitialAPIKey] = useState(null);
14
14
  const [highlightedField, setHighlightedField] = useState(false);
15
- const { i18n } = useTranslation();
15
+ const { t } = useTranslation();
16
16
  const apiKey = useFormFields(([fields]) => fields[path]);
17
- const validate = (val) => text(val, { minLength: 24, maxLength: 48, data: {}, siblingData: {}, i18n });
17
+ const validate = (val) => text(val, { minLength: 24, maxLength: 48, data: {}, siblingData: {}, t });
18
18
  const apiKeyValue = apiKey === null || apiKey === void 0 ? void 0 : apiKey.value;
19
19
  const APIKeyLabel = useMemo(() => (React.createElement("div", { className: `${baseClass}__label` },
20
20
  React.createElement("span", null, "API Key"),
@@ -26,13 +26,15 @@ import SaveDraft from '../../../elements/SaveDraft';
26
26
  import { useDocumentInfo } from '../../../utilities/DocumentInfo';
27
27
  import { OperationContext } from '../../../utilities/OperationProvider';
28
28
  import { Gutter } from '../../../elements/Gutter';
29
+ import { getTranslation } from '../../../../../utilities/getTranslation';
30
+ import { SetStepNav } from './SetStepNav';
29
31
  import './index.scss';
30
32
  const baseClass = 'collection-edit';
31
33
  const DefaultEditView = (props) => {
32
34
  var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k, _l, _m, _o, _p, _q, _r, _s, _t;
33
35
  const { admin: { dateFormat }, routes: { admin } } = useConfig();
34
36
  const { publishedDoc } = useDocumentInfo();
35
- const { t } = useTranslation('general');
37
+ const { t, i18n } = useTranslation('general');
36
38
  const { collection, isEditing, data, onSave, permissions, isLoading, initialState, apiURL, action, hasSavePermission, disableEyebrow, disableActions, disableLeaveWithoutSaving, customHeader, id, } = props;
37
39
  const { slug, fields, admin: { useAsTitle, disableDuplicate, preview, hideAPIURL, }, versions, timestamps, auth, upload, } = collection;
38
40
  const classes = [
@@ -44,8 +46,9 @@ const DefaultEditView = (props) => {
44
46
  isLoading && (React.createElement(Loading, null)),
45
47
  !isLoading && (React.createElement(OperationContext.Provider, { value: operation },
46
48
  React.createElement(Form, { className: `${baseClass}__form`, method: id ? 'patch' : 'post', action: action, onSuccess: onSave, disabled: !hasSavePermission, initialState: initialState },
49
+ React.createElement(SetStepNav, { collection: collection, isEditing: isEditing, id: data.id }),
47
50
  React.createElement("div", { className: `${baseClass}__main` },
48
- React.createElement(Meta, { title: `${isEditing ? t('editing') : t('creating')} - ${collection.labels.singular}`, description: `${isEditing ? t('editing') : t('creating')} - ${collection.labels.singular}`, keywords: `${collection.labels.singular}, Payload, CMS` }),
51
+ React.createElement(Meta, { title: `${isEditing ? t('editing') : t('creating')} - ${getTranslation(collection.labels.singular, i18n)}`, description: `${isEditing ? t('editing') : t('creating')} - ${getTranslation(collection.labels.singular, i18n)}`, keywords: `${getTranslation(collection.labels.singular, i18n)}, Payload, CMS` }),
49
52
  !disableEyebrow && (React.createElement(Eyebrow, null)),
50
53
  (!(((_a = collection.versions) === null || _a === void 0 ? void 0 : _a.drafts) && ((_c = (_b = collection.versions) === null || _b === void 0 ? void 0 : _b.drafts) === null || _c === void 0 ? void 0 : _c.autosave)) && !disableLeaveWithoutSaving) && (React.createElement(LeaveWithoutSaving, null)),
51
54
  React.createElement(Gutter, { className: `${baseClass}__edit` },
@@ -0,0 +1,7 @@
1
+ /// <reference types="react" />
2
+ import { SanitizedCollectionConfig } from '../../../../../collections/config/types';
3
+ export declare const SetStepNav: React.FC<{
4
+ collection: SanitizedCollectionConfig;
5
+ isEditing: boolean;
6
+ id: string;
7
+ }>;
@@ -0,0 +1,31 @@
1
+ import { useEffect } from 'react';
2
+ import { useTranslation } from 'react-i18next';
3
+ import { getTranslation } from '../../../../../utilities/getTranslation';
4
+ import useTitle from '../../../../hooks/useTitle';
5
+ import { useStepNav } from '../../../elements/StepNav';
6
+ import { useConfig } from '../../../utilities/Config';
7
+ export const SetStepNav = ({ collection, isEditing, id }) => {
8
+ const { slug, labels: { plural: pluralLabel, }, admin: { useAsTitle, }, } = collection;
9
+ const { setStepNav } = useStepNav();
10
+ const { t, i18n } = useTranslation('general');
11
+ const { routes: { admin } } = useConfig();
12
+ const title = useTitle(useAsTitle);
13
+ useEffect(() => {
14
+ const nav = [{
15
+ url: `${admin}/collections/${slug}`,
16
+ label: getTranslation(pluralLabel, i18n),
17
+ }];
18
+ if (isEditing) {
19
+ nav.push({
20
+ label: (useAsTitle && useAsTitle !== 'id') ? title || `[${t('untitled')}]` : id,
21
+ });
22
+ }
23
+ else {
24
+ nav.push({
25
+ label: t('createNew'),
26
+ });
27
+ }
28
+ setStepNav(nav);
29
+ }, [setStepNav, isEditing, pluralLabel, id, slug, useAsTitle, admin, t, i18n, title]);
30
+ return null;
31
+ };
@@ -3,7 +3,6 @@ import { Redirect, useRouteMatch, useHistory, useLocation } from 'react-router-d
3
3
  import { useTranslation } from 'react-i18next';
4
4
  import { useConfig } from '../../../utilities/Config';
5
5
  import { useAuth } from '../../../utilities/Auth';
6
- import { useStepNav } from '../../../elements/StepNav';
7
6
  import usePayloadAPI from '../../../../hooks/usePayloadAPI';
8
7
  import RenderCustomComponent from '../../../utilities/RenderCustomComponent';
9
8
  import DefaultEdit from './Default';
@@ -13,11 +12,10 @@ import { useLocale } from '../../../utilities/Locale';
13
12
  import { useDocumentInfo } from '../../../utilities/DocumentInfo';
14
13
  import { usePreferences } from '../../../utilities/Preferences';
15
14
  import { EditDepthContext } from '../../../utilities/EditDepth';
16
- import { getTranslation } from '../../../../../utilities/getTranslation';
17
15
  const EditView = (props) => {
18
16
  var _a, _b, _c;
19
17
  const { collection: incomingCollection, isEditing } = props;
20
- const { slug, labels: { plural: pluralLabel, }, admin: { useAsTitle, components: { views: { Edit: CustomEdit, } = {}, } = {}, } = {}, } = incomingCollection;
18
+ const { slug, admin: { components: { views: { Edit: CustomEdit, } = {}, } = {}, } = {}, } = incomingCollection;
21
19
  const [fields] = useState(() => formatFields(incomingCollection, isEditing));
22
20
  const [collection] = useState(() => ({ ...incomingCollection, fields }));
23
21
  const [redirect, setRedirect] = useState();
@@ -26,12 +24,11 @@ const EditView = (props) => {
26
24
  const { params: { id } = {} } = useRouteMatch();
27
25
  const { state: locationState } = useLocation();
28
26
  const history = useHistory();
29
- const { setStepNav } = useStepNav();
30
27
  const [initialState, setInitialState] = useState();
31
28
  const { permissions, user } = useAuth();
32
29
  const { getVersions, preferencesKey } = useDocumentInfo();
33
30
  const { getPreference } = usePreferences();
34
- const { t, i18n } = useTranslation('general');
31
+ const { t } = useTranslation('general');
35
32
  const onSave = useCallback(async (json) => {
36
33
  var _a;
37
34
  getVersions();
@@ -39,54 +36,23 @@ const EditView = (props) => {
39
36
  setRedirect(`${admin}/collections/${collection.slug}/${(_a = json === null || json === void 0 ? void 0 : json.doc) === null || _a === void 0 ? void 0 : _a.id}`);
40
37
  }
41
38
  else {
42
- const state = await buildStateFromSchema({ fieldSchema: collection.fields, data: json.doc, user, id, operation: 'update', locale, i18n });
39
+ const state = await buildStateFromSchema({ fieldSchema: collection.fields, data: json.doc, user, id, operation: 'update', locale, t });
43
40
  setInitialState(state);
44
41
  }
45
- }, [admin, collection, isEditing, getVersions, user, id, i18n, locale]);
42
+ }, [admin, collection, isEditing, getVersions, user, id, t, locale]);
46
43
  const [{ data, isLoading: isLoadingDocument, isError }] = usePayloadAPI((isEditing ? `${serverURL}${api}/${slug}/${id}` : null), { initialParams: { 'fallback-locale': 'null', depth: 0, draft: 'true' } });
47
44
  const dataToRender = (locationState === null || locationState === void 0 ? void 0 : locationState.data) || data;
48
- useEffect(() => {
49
- const nav = [{
50
- url: `${admin}/collections/${slug}`,
51
- label: getTranslation(pluralLabel, i18n),
52
- }];
53
- if (isEditing) {
54
- let label = '';
55
- if (dataToRender) {
56
- if (useAsTitle) {
57
- if (dataToRender[useAsTitle]) {
58
- label = dataToRender[useAsTitle];
59
- }
60
- else {
61
- label = `[${t('untitled')}]`;
62
- }
63
- }
64
- else {
65
- label = dataToRender.id;
66
- }
67
- }
68
- nav.push({
69
- label,
70
- });
71
- }
72
- else {
73
- nav.push({
74
- label: t('createNew'),
75
- });
76
- }
77
- setStepNav(nav);
78
- }, [setStepNav, isEditing, pluralLabel, dataToRender, slug, useAsTitle, admin, t, i18n]);
79
45
  useEffect(() => {
80
46
  if (isLoadingDocument) {
81
47
  return;
82
48
  }
83
49
  const awaitInitialState = async () => {
84
- const state = await buildStateFromSchema({ fieldSchema: fields, data: dataToRender, user, operation: isEditing ? 'update' : 'create', id, locale, i18n });
50
+ const state = await buildStateFromSchema({ fieldSchema: fields, data: dataToRender, user, operation: isEditing ? 'update' : 'create', id, locale, t });
85
51
  await getPreference(preferencesKey);
86
52
  setInitialState(state);
87
53
  };
88
54
  awaitInitialState();
89
- }, [dataToRender, fields, isEditing, id, user, locale, isLoadingDocument, preferencesKey, getPreference, i18n]);
55
+ }, [dataToRender, fields, isEditing, id, user, locale, isLoadingDocument, preferencesKey, getPreference, t]);
90
56
  useEffect(() => {
91
57
  if (redirect) {
92
58
  history.push(redirect);
@@ -14,13 +14,15 @@ const usePayloadAPI = (url, options = {}) => {
14
14
  const search = queryString.stringify({
15
15
  locale,
16
16
  ...(typeof params === 'object' ? params : {}),
17
+ }, {
18
+ addQueryPrefix: true,
17
19
  });
18
20
  useEffect(() => {
19
21
  const fetchData = async () => {
20
22
  setIsError(false);
21
23
  setIsLoading(true);
22
24
  try {
23
- const response = await requests.get(`${url}?${search}`, {
25
+ const response = await requests.get(`${url}${search}`, {
24
26
  headers: {
25
27
  'Accept-Language': i18n.language,
26
28
  },
@@ -6,7 +6,7 @@ const executeAccess = async (operation, access) => {
6
6
  const result = await access(operation);
7
7
  if (!result) {
8
8
  if (!operation.disableErrors)
9
- throw new errors_1.Forbidden(operation.req.i18n);
9
+ throw new errors_1.Forbidden(operation.req.t);
10
10
  }
11
11
  return result;
12
12
  }
@@ -14,8 +14,8 @@ const executeAccess = async (operation, access) => {
14
14
  return true;
15
15
  }
16
16
  if (!operation.disableErrors)
17
- throw new errors_1.Forbidden(operation.req.i18n);
17
+ throw new errors_1.Forbidden(operation.req.t);
18
18
  return false;
19
19
  };
20
20
  exports.default = executeAccess;
21
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXhlY3V0ZUFjY2Vzcy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9hdXRoL2V4ZWN1dGVBY2Nlc3MudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUFBQSxzQ0FBc0M7QUFHdEMsTUFBTSxhQUFhLEdBQUcsS0FBSyxFQUFFLFNBQVMsRUFBRSxNQUFjLEVBQXlCLEVBQUU7SUFDL0UsSUFBSSxNQUFNLEVBQUU7UUFDVixNQUFNLE1BQU0sR0FBRyxNQUFNLE1BQU0sQ0FBQyxTQUFTLENBQUMsQ0FBQztRQUV2QyxJQUFJLENBQUMsTUFBTSxFQUFFO1lBQ1gsSUFBSSxDQUFDLFNBQVMsQ0FBQyxhQUFhO2dCQUFFLE1BQU0sSUFBSSxrQkFBUyxDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUM7U0FDdkU7UUFFRCxPQUFPLE1BQU0sQ0FBQztLQUNmO0lBRUQsSUFBSSxTQUFTLENBQUMsR0FBRyxDQUFDLElBQUksRUFBRTtRQUN0QixPQUFPLElBQUksQ0FBQztLQUNiO0lBRUQsSUFBSSxDQUFDLFNBQVMsQ0FBQyxhQUFhO1FBQUUsTUFBTSxJQUFJLGtCQUFTLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUN0RSxPQUFPLEtBQUssQ0FBQztBQUNmLENBQUMsQ0FBQztBQUVGLGtCQUFlLGFBQWEsQ0FBQyJ9
21
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXhlY3V0ZUFjY2Vzcy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9hdXRoL2V4ZWN1dGVBY2Nlc3MudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUFBQSxzQ0FBc0M7QUFHdEMsTUFBTSxhQUFhLEdBQUcsS0FBSyxFQUFFLFNBQVMsRUFBRSxNQUFjLEVBQXlCLEVBQUU7SUFDL0UsSUFBSSxNQUFNLEVBQUU7UUFDVixNQUFNLE1BQU0sR0FBRyxNQUFNLE1BQU0sQ0FBQyxTQUFTLENBQUMsQ0FBQztRQUV2QyxJQUFJLENBQUMsTUFBTSxFQUFFO1lBQ1gsSUFBSSxDQUFDLFNBQVMsQ0FBQyxhQUFhO2dCQUFFLE1BQU0sSUFBSSxrQkFBUyxDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7U0FDcEU7UUFFRCxPQUFPLE1BQU0sQ0FBQztLQUNmO0lBRUQsSUFBSSxTQUFTLENBQUMsR0FBRyxDQUFDLElBQUksRUFBRTtRQUN0QixPQUFPLElBQUksQ0FBQztLQUNiO0lBRUQsSUFBSSxDQUFDLFNBQVMsQ0FBQyxhQUFhO1FBQUUsTUFBTSxJQUFJLGtCQUFTLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUNuRSxPQUFPLEtBQUssQ0FBQztBQUNmLENBQUMsQ0FBQztBQUVGLGtCQUFlLGFBQWEsQ0FBQyJ9
@@ -42,7 +42,7 @@ const getExecuteStaticAccess = ({ config, Model }) => async (req, res, next) =>
42
42
  const query = await Model.buildQuery(queryToBuild, req.locale);
43
43
  const doc = await Model.findOne(query);
44
44
  if (!doc) {
45
- throw new errors_1.Forbidden(req.i18n);
45
+ throw new errors_1.Forbidden(req.t);
46
46
  }
47
47
  }
48
48
  }
@@ -53,4 +53,4 @@ const getExecuteStaticAccess = ({ config, Model }) => async (req, res, next) =>
53
53
  }
54
54
  };
55
55
  exports.default = getExecuteStaticAccess;
56
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ2V0RXhlY3V0ZVN0YXRpY0FjY2Vzcy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9hdXRoL2dldEV4ZWN1dGVTdGF0aWNBY2Nlc3MudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFFQSxvRUFBNEM7QUFDNUMsc0NBQXNDO0FBR3RDLE1BQU0sc0JBQXNCLEdBQUcsQ0FBQyxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUUsRUFBRSxFQUFFLENBQUMsS0FBSyxFQUFFLEdBQW1CLEVBQUUsR0FBYSxFQUFFLElBQWtCLEVBQUUsRUFBRTtJQUNySCxJQUFJLEdBQUcsQ0FBQyxNQUFNLEtBQUssU0FBUyxFQUFFO1FBQzVCLE9BQU8sR0FBRyxDQUFDLFVBQVUsQ0FBQyxHQUFHLENBQUMsQ0FBQztLQUM1QjtJQUVELElBQUk7UUFDRixJQUFJLEdBQUcsQ0FBQyxJQUFJLEVBQUU7WUFDWixNQUFNLFlBQVksR0FBRyxNQUFNLElBQUEsdUJBQWEsRUFBQyxFQUFFLEdBQUcsRUFBRSxtQkFBbUIsRUFBRSxJQUFJLEVBQUUsRUFBRSxNQUFNLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDO1lBRWpHLElBQUksT0FBTyxZQUFZLEtBQUssUUFBUSxFQUFFO2dCQUNwQyxNQUFNLFFBQVEsR0FBRyxTQUFTLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDLE9BQU8sQ0FBQyxVQUFVLEVBQUUsRUFBRSxDQUFDLENBQUM7Z0JBRTdELE1BQU0sWUFBWSxHQUFxQjtvQkFDckMsS0FBSyxFQUFFO3dCQUNMLEdBQUcsRUFBRTs0QkFDSDtnQ0FDRSxFQUFFLEVBQUU7b0NBQ0Y7d0NBQ0UsUUFBUSxFQUFFOzRDQUNSLE1BQU0sRUFBRSxRQUFRO3lDQUNqQjtxQ0FDRjtpQ0FDRjs2QkFDRjs0QkFDRCxZQUFZO3lCQUNiO3FCQUNGO2lCQUNGLENBQUM7Z0JBRUYsSUFBSSxNQUFNLENBQUMsTUFBTSxDQUFDLFVBQVUsRUFBRTtvQkFDNUIsTUFBTSxDQUFDLE1BQU0sQ0FBQyxVQUFVLENBQUMsT0FBTyxDQUFDLENBQUMsRUFBRSxJQUFJLEVBQUUsRUFBRSxFQUFFO3dCQUM1QyxZQUFZLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDOzRCQUNoQyxDQUFDLFNBQVMsSUFBSSxXQUFXLENBQUMsRUFBRTtnQ0FDMUIsTUFBTSxFQUFFLFFBQVE7NkJBQ2pCO3lCQUNGLENBQUMsQ0FBQztvQkFDTCxDQUFDLENBQUMsQ0FBQztpQkFDSjtnQkFFRCxNQUFNLEtBQUssR0FBRyxNQUFNLEtBQUssQ0FBQyxVQUFVLENBQUMsWUFBWSxFQUFFLEdBQUcsQ0FBQyxNQUFNLENBQUMsQ0FBQztnQkFDL0QsTUFBTSxHQUFHLEdBQUcsTUFBTSxLQUFLLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDO2dCQUV2QyxJQUFJLENBQUMsR0FBRyxFQUFFO29CQUNSLE1BQU0sSUFBSSxrQkFBUyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQztpQkFDL0I7YUFDRjtTQUNGO1FBRUQsT0FBTyxJQUFJLEVBQUUsQ0FBQztLQUNmO0lBQUMsT0FBTyxLQUFLLEVBQUU7UUFDZCxPQUFPLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztLQUNwQjtBQUNILENBQUMsQ0FBQztBQUVGLGtCQUFlLHNCQUFzQixDQUFDIn0=
56
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ2V0RXhlY3V0ZVN0YXRpY0FjY2Vzcy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9hdXRoL2dldEV4ZWN1dGVTdGF0aWNBY2Nlc3MudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFFQSxvRUFBNEM7QUFDNUMsc0NBQXNDO0FBR3RDLE1BQU0sc0JBQXNCLEdBQUcsQ0FBQyxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUUsRUFBRSxFQUFFLENBQUMsS0FBSyxFQUFFLEdBQW1CLEVBQUUsR0FBYSxFQUFFLElBQWtCLEVBQUUsRUFBRTtJQUNySCxJQUFJLEdBQUcsQ0FBQyxNQUFNLEtBQUssU0FBUyxFQUFFO1FBQzVCLE9BQU8sR0FBRyxDQUFDLFVBQVUsQ0FBQyxHQUFHLENBQUMsQ0FBQztLQUM1QjtJQUVELElBQUk7UUFDRixJQUFJLEdBQUcsQ0FBQyxJQUFJLEVBQUU7WUFDWixNQUFNLFlBQVksR0FBRyxNQUFNLElBQUEsdUJBQWEsRUFBQyxFQUFFLEdBQUcsRUFBRSxtQkFBbUIsRUFBRSxJQUFJLEVBQUUsRUFBRSxNQUFNLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDO1lBRWpHLElBQUksT0FBTyxZQUFZLEtBQUssUUFBUSxFQUFFO2dCQUNwQyxNQUFNLFFBQVEsR0FBRyxTQUFTLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDLE9BQU8sQ0FBQyxVQUFVLEVBQUUsRUFBRSxDQUFDLENBQUM7Z0JBRTdELE1BQU0sWUFBWSxHQUFxQjtvQkFDckMsS0FBSyxFQUFFO3dCQUNMLEdBQUcsRUFBRTs0QkFDSDtnQ0FDRSxFQUFFLEVBQUU7b0NBQ0Y7d0NBQ0UsUUFBUSxFQUFFOzRDQUNSLE1BQU0sRUFBRSxRQUFRO3lDQUNqQjtxQ0FDRjtpQ0FDRjs2QkFDRjs0QkFDRCxZQUFZO3lCQUNiO3FCQUNGO2lCQUNGLENBQUM7Z0JBRUYsSUFBSSxNQUFNLENBQUMsTUFBTSxDQUFDLFVBQVUsRUFBRTtvQkFDNUIsTUFBTSxDQUFDLE1BQU0sQ0FBQyxVQUFVLENBQUMsT0FBTyxDQUFDLENBQUMsRUFBRSxJQUFJLEVBQUUsRUFBRSxFQUFFO3dCQUM1QyxZQUFZLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDOzRCQUNoQyxDQUFDLFNBQVMsSUFBSSxXQUFXLENBQUMsRUFBRTtnQ0FDMUIsTUFBTSxFQUFFLFFBQVE7NkJBQ2pCO3lCQUNGLENBQUMsQ0FBQztvQkFDTCxDQUFDLENBQUMsQ0FBQztpQkFDSjtnQkFFRCxNQUFNLEtBQUssR0FBRyxNQUFNLEtBQUssQ0FBQyxVQUFVLENBQUMsWUFBWSxFQUFFLEdBQUcsQ0FBQyxNQUFNLENBQUMsQ0FBQztnQkFDL0QsTUFBTSxHQUFHLEdBQUcsTUFBTSxLQUFLLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDO2dCQUV2QyxJQUFJLENBQUMsR0FBRyxFQUFFO29CQUNSLE1BQU0sSUFBSSxrQkFBUyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztpQkFDNUI7YUFDRjtTQUNGO1FBRUQsT0FBTyxJQUFJLEVBQUUsQ0FBQztLQUNmO0lBQUMsT0FBTyxLQUFLLEVBQUU7UUFDZCxPQUFPLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztLQUNwQjtBQUNILENBQUMsQ0FBQztBQUVGLGtCQUFlLHNCQUFzQixDQUFDIn0=