payload 0.14.15-beta.0 → 0.14.19-beta.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CHANGELOG.md CHANGED
@@ -1,8 +1,9 @@
1
- ## [0.14.15-beta.0](https://github.com/payloadcms/payload/compare/v0.14.0...v0.14.15-beta.0) (2022-01-31)
1
+ ## [0.14.19-beta.0](https://github.com/payloadcms/payload/compare/v0.14.0...v0.14.19-beta.0) (2022-02-03)
2
2
 
3
3
 
4
4
  ### Bug Fixes
5
5
 
6
+ * [#423](https://github.com/payloadcms/payload/issues/423), [#391](https://github.com/payloadcms/payload/issues/391) - prevents loading edit views until data initializes ([2884654](https://github.com/payloadcms/payload/commit/28846547afc7e7bb8accc5dbe9f3b98593f332fa))
6
7
  * awaits beforeDelete hooks ([609b871](https://github.com/payloadcms/payload/commit/609b871fa274e8b6d9eaf301e52ab42179aad9b7))
7
8
  * ensures multipart/form-data using _payload flattens field data before sending ([ae44727](https://github.com/payloadcms/payload/commit/ae44727fb9734fc3801f7249fa9e78668311c09e))
8
9
  * ensures nested lists always render properly ([20e5dfb](https://github.com/payloadcms/payload/commit/20e5dfbb4ab8dab320d60772f5195c5faffe38d3))
@@ -15,6 +16,7 @@
15
16
 
16
17
  ### Features
17
18
 
19
+ * add before and after login components ([#427](https://github.com/payloadcms/payload/issues/427)) ([5591eea](https://github.com/payloadcms/payload/commit/5591eeafca1aa6e8abcc2d8276f7478e00b75ef2))
18
20
  * adds a way to customize express.static options ([dbb3c50](https://github.com/payloadcms/payload/commit/dbb3c502227597ef4d04c9e5c8db6d2f51a8aac4))
19
21
  * adds admin.upload.collections[collection-name].fields to the RTE to save specific data on upload elements ([3adf44a](https://github.com/payloadcms/payload/commit/3adf44a24162e5adbcebdb0ca7d0d460d23c57eb))
20
22
  * adds indentation controls to rich text ([7df50f9](https://github.com/payloadcms/payload/commit/7df50f9bf9d4867e65bdd8cebdf43e0ab1737a63))
@@ -22,9 +24,10 @@
22
24
  * builds a way for multipart/form-data reqs to retain non-string values ([65b0ad7](https://github.com/payloadcms/payload/commit/65b0ad7f084a9c279a1e4fb799542f97c645653d))
23
25
  * enhances rich text upload with custom field API ([0e4eb90](https://github.com/payloadcms/payload/commit/0e4eb906f2881dca518fea6b41e460bc57da9801))
24
26
  * exposes FieldWithPath type for reuse ([df3a836](https://github.com/payloadcms/payload/commit/df3a83634fcb64724ef239600e3af4fc295fee4f))
27
+ * exposes useLocale for reuse ([bef0206](https://github.com/payloadcms/payload/commit/bef02062e769d1b0279c51af748f06d41c924c8a))
25
28
  * rich text indent PoC ([2deed8b](https://github.com/payloadcms/payload/commit/2deed8b1464931c4bc76a288923b307cf04b6a4a))
26
29
 
27
- ## [0.14.14-beta.0](https://github.com/payloadcms/payload/compare/v0.14.0...v0.14.14-beta.0) (2022-01-25)
30
+ ## [0.14.18-beta.0](https://github.com/payloadcms/payload/compare/v0.14.0...v0.14.18-beta.0) (2022-02-01)
28
31
 
29
32
 
30
33
  ### Bug Fixes
@@ -41,15 +44,17 @@
41
44
 
42
45
  ### Features
43
46
 
47
+ * add before and after login components ([#427](https://github.com/payloadcms/payload/issues/427)) ([5591eea](https://github.com/payloadcms/payload/commit/5591eeafca1aa6e8abcc2d8276f7478e00b75ef2))
48
+ * adds a way to customize express.static options ([dbb3c50](https://github.com/payloadcms/payload/commit/dbb3c502227597ef4d04c9e5c8db6d2f51a8aac4))
44
49
  * adds admin.upload.collections[collection-name].fields to the RTE to save specific data on upload elements ([3adf44a](https://github.com/payloadcms/payload/commit/3adf44a24162e5adbcebdb0ca7d0d460d23c57eb))
45
50
  * adds indentation controls to rich text ([7df50f9](https://github.com/payloadcms/payload/commit/7df50f9bf9d4867e65bdd8cebdf43e0ab1737a63))
46
51
  * adds recursion to richText field to populate relationship and upload nested fields ([42af22c](https://github.com/payloadcms/payload/commit/42af22c2a10de44555bfedf902e7b4a4c9b25d6b))
47
52
  * builds a way for multipart/form-data reqs to retain non-string values ([65b0ad7](https://github.com/payloadcms/payload/commit/65b0ad7f084a9c279a1e4fb799542f97c645653d))
48
53
  * enhances rich text upload with custom field API ([0e4eb90](https://github.com/payloadcms/payload/commit/0e4eb906f2881dca518fea6b41e460bc57da9801))
49
54
  * exposes FieldWithPath type for reuse ([df3a836](https://github.com/payloadcms/payload/commit/df3a83634fcb64724ef239600e3af4fc295fee4f))
55
+ * exposes useLocale for reuse ([bef0206](https://github.com/payloadcms/payload/commit/bef02062e769d1b0279c51af748f06d41c924c8a))
50
56
  * rich text indent PoC ([2deed8b](https://github.com/payloadcms/payload/commit/2deed8b1464931c4bc76a288923b307cf04b6a4a))
51
57
 
52
-
53
58
  # [0.14.0](https://github.com/payloadcms/payload/compare/v0.13.6...v0.14.0) (2022-01-03)
54
59
 
55
60
 
@@ -1 +1,2 @@
1
- export { default as Meta } from '../src/admin/components/utilities/Meta';
1
+ export { default as Meta } from '../dist/admin/components/utilities/Meta';
2
+ export { useLocale } from '../dist/admin/components/utilities/Locale';
@@ -9,7 +9,7 @@ declare type CustomText = {
9
9
  [x: string]: unknown;
10
10
  };
11
11
  declare type CustomElement = {
12
- type: string;
12
+ type?: string;
13
13
  children: CustomText[];
14
14
  };
15
15
  declare module 'slate' {
@@ -155,9 +155,7 @@ const RichText = (props) => {
155
155
  event.preventDefault();
156
156
  const selectedLeaf = Node.descendant(editor, editor.selection.anchor.path);
157
157
  if (Text.isText(selectedLeaf) && String(selectedLeaf.text).length === editor.selection.anchor.offset) {
158
- Transforms.insertNodes(editor, {
159
- text: '',
160
- });
158
+ Transforms.insertNodes(editor, { children: [{ text: '' }] });
161
159
  }
162
160
  else {
163
161
  Transforms.splitNodes(editor);
@@ -55,7 +55,7 @@ const Element = ({ attributes, children, element, path, fieldProps }) => {
55
55
  fieldSchema && (React.createElement(Button, { icon: "edit", round: true, buttonStyle: "icon-label", className: `${baseClass}__actionButton`, onClick: (e) => {
56
56
  e.preventDefault();
57
57
  setModalToRender('edit');
58
- }, tooltip: "Upload Fields" })),
58
+ }, tooltip: "Edit" })),
59
59
  React.createElement(Button, { icon: "swap", round: true, buttonStyle: "icon-label", className: `${baseClass}__actionButton`, onClick: (e) => {
60
60
  e.preventDefault();
61
61
  setModalToRender('swap');
@@ -22,6 +22,7 @@
22
22
  width: base(3.25);
23
23
  height: auto;
24
24
  position: relative;
25
+ overflow: hidden;
25
26
 
26
27
  img, svg {
27
28
  position: absolute;
@@ -2,8 +2,8 @@ import React, { useCallback } from 'react';
2
2
  import useField from '../../useField';
3
3
  import withCondition from '../../withCondition';
4
4
  import { textarea } from '../../../../../fields/validations';
5
- import './index.scss';
6
5
  import TextareaInput from './Input';
6
+ import './index.scss';
7
7
  const Textarea = (props) => {
8
8
  const { path: pathFromProps, name, required, validate = textarea, admin: { readOnly, style, className, width, placeholder, rows, description, condition, } = {}, label, minLength, maxLength, } = props;
9
9
  const path = pathFromProps || name;
@@ -7,9 +7,9 @@ export const LocaleProvider = ({ children }) => {
7
7
  const { localization } = useConfig();
8
8
  const { user } = useAuth();
9
9
  const defaultLocale = (localization && localization.defaultLocale) ? localization.defaultLocale : 'en';
10
- const [locale, setLocale] = useState(defaultLocale);
11
- const { getPreference, setPreference } = usePreferences();
12
10
  const searchParams = useSearchParams();
11
+ const [locale, setLocale] = useState((searchParams === null || searchParams === void 0 ? void 0 : searchParams.locale) || defaultLocale);
12
+ const { getPreference, setPreference } = usePreferences();
13
13
  const localeFromParams = searchParams.locale;
14
14
  useEffect(() => {
15
15
  if (!localization) {
@@ -25,19 +25,18 @@ const DefaultAccount = (props) => {
25
25
  baseClass,
26
26
  ].filter(Boolean).join(' ');
27
27
  return (React.createElement("div", { className: classes },
28
- React.createElement(Form, { className: `${baseClass}__form`, method: "put", action: action, initialState: initialState, disabled: !hasSavePermission },
28
+ isLoading && (React.createElement(Loading, null)),
29
+ !isLoading && (React.createElement(Form, { className: `${baseClass}__form`, method: "put", action: action, initialState: initialState, disabled: !hasSavePermission },
29
30
  React.createElement("div", { className: `${baseClass}__main` },
30
31
  React.createElement(Meta, { title: "Account", description: "Account of current user", keywords: "Account, Dashboard, Payload, CMS" }),
31
32
  React.createElement(Eyebrow, null),
32
33
  React.createElement(LeaveWithoutSaving, null),
33
34
  React.createElement("div", { className: `${baseClass}__edit` },
34
- isLoading && (React.createElement(Loading, null)),
35
- !isLoading && (React.createElement(React.Fragment, null,
36
- React.createElement("header", { className: `${baseClass}__header` },
37
- React.createElement("h1", null,
38
- React.createElement(RenderTitle, { ...{ data, useAsTitle, fallback: '[Untitled]' } }))),
39
- React.createElement(Auth, { useAPIKey: auth.useAPIKey, collection: collection, email: data === null || data === void 0 ? void 0 : data.email, operation: "update" }),
40
- React.createElement(RenderFields, { operation: "update", permissions: permissions.fields, readOnly: !hasSavePermission, filter: (field) => { var _a; return ((_a = field === null || field === void 0 ? void 0 : field.admin) === null || _a === void 0 ? void 0 : _a.position) !== 'sidebar'; }, fieldTypes: fieldTypes, fieldSchema: fields }))))),
35
+ React.createElement("header", { className: `${baseClass}__header` },
36
+ React.createElement("h1", null,
37
+ React.createElement(RenderTitle, { ...{ data, useAsTitle, fallback: '[Untitled]' } }))),
38
+ React.createElement(Auth, { useAPIKey: auth.useAPIKey, collection: collection, email: data === null || data === void 0 ? void 0 : data.email, operation: "update" }),
39
+ React.createElement(RenderFields, { operation: "update", permissions: permissions.fields, readOnly: !hasSavePermission, filter: (field) => { var _a; return ((_a = field === null || field === void 0 ? void 0 : field.admin) === null || _a === void 0 ? void 0 : _a.position) !== 'sidebar'; }, fieldTypes: fieldTypes, fieldSchema: fields }))),
41
40
  React.createElement("div", { className: `${baseClass}__sidebar-wrap` },
42
41
  React.createElement("div", { className: `${baseClass}__sidebar` },
43
42
  React.createElement("div", { className: `${baseClass}__sidebar-sticky-wrap` },
@@ -65,6 +64,6 @@ const DefaultAccount = (props) => {
65
64
  React.createElement("div", null, format(new Date(data.updatedAt), dateFormat)))),
66
65
  data.createdAt && (React.createElement("li", null,
67
66
  React.createElement("div", { className: `${baseClass}__label` }, "Created"),
68
- React.createElement("div", null, format(new Date(data.createdAt), dateFormat)))))))))))));
67
+ React.createElement("div", null, format(new Date(data.createdAt), dateFormat))))))))))))));
69
68
  };
70
69
  export default DefaultAccount;
@@ -10,17 +10,19 @@ import CopyToClipboard from '../../elements/CopyToClipboard';
10
10
  import Meta from '../../utilities/Meta';
11
11
  import fieldTypes from '../../forms/field-types';
12
12
  import LeaveWithoutSaving from '../../modals/LeaveWithoutSaving';
13
- import './index.scss';
14
13
  import ViewDescription from '../../elements/ViewDescription';
14
+ import Loading from '../../elements/Loading';
15
+ import './index.scss';
15
16
  const baseClass = 'global-edit';
16
17
  const DefaultGlobalView = (props) => {
17
18
  var _a;
18
19
  const { admin: { dateFormat } } = useConfig();
19
- const { global, data, onSave, permissions, action, apiURL, initialState, } = props;
20
+ const { global, data, onSave, permissions, action, apiURL, initialState, isLoading, } = props;
20
21
  const { fields, preview, label, admin: { description, } = {}, } = global;
21
22
  const hasSavePermission = (_a = permissions === null || permissions === void 0 ? void 0 : permissions.update) === null || _a === void 0 ? void 0 : _a.permission;
22
23
  return (React.createElement("div", { className: baseClass },
23
- React.createElement(Form, { className: `${baseClass}__form`, method: "post", action: action, onSuccess: onSave, disabled: !hasSavePermission, initialState: initialState },
24
+ isLoading && (React.createElement(Loading, null)),
25
+ !isLoading && (React.createElement(Form, { className: `${baseClass}__form`, method: "post", action: action, onSuccess: onSave, disabled: !hasSavePermission, initialState: initialState },
24
26
  React.createElement("div", { className: `${baseClass}__main` },
25
27
  React.createElement(Meta, { title: label, description: label, keywords: `${label}, Payload, CMS` }),
26
28
  React.createElement(Eyebrow, null),
@@ -51,6 +53,6 @@ const DefaultGlobalView = (props) => {
51
53
  React.createElement("a", { href: apiURL, target: "_blank", rel: "noopener noreferrer" }, apiURL))),
52
54
  data.updatedAt && (React.createElement("li", null,
53
55
  React.createElement("div", { className: `${baseClass}__label` }, "Last Modified"),
54
- React.createElement("div", null, format(new Date(data.updatedAt), dateFormat))))))))))));
56
+ React.createElement("div", null, format(new Date(data.updatedAt), dateFormat)))))))))))));
55
57
  };
56
58
  export default DefaultGlobalView;
@@ -29,7 +29,7 @@ const GlobalView = (props) => {
29
29
  data: json.doc,
30
30
  });
31
31
  };
32
- const [{ data }] = usePayloadAPI(`${serverURL}${api}/globals/${slug}`, { initialParams: { 'fallback-locale': 'null', depth: 0 } });
32
+ const [{ data, isLoading }] = usePayloadAPI(`${serverURL}${api}/globals/${slug}`, { initialParams: { 'fallback-locale': 'null', depth: 0 } });
33
33
  const dataToRender = (locationState === null || locationState === void 0 ? void 0 : locationState.data) || data;
34
34
  useEffect(() => {
35
35
  const nav = [{
@@ -48,6 +48,7 @@ const GlobalView = (props) => {
48
48
  return (React.createElement(DocumentInfoProvider, { slug: slug, type: "global" },
49
49
  React.createElement(NegativeFieldGutterProvider, { allow: true },
50
50
  React.createElement(RenderCustomComponent, { DefaultComponent: DefaultGlobal, CustomComponent: CustomEdit, componentProps: {
51
+ isLoading,
51
52
  data: dataToRender,
52
53
  permissions: globalPermissions,
53
54
  initialState,
@@ -12,4 +12,5 @@ export declare type Props = {
12
12
  action: string;
13
13
  apiURL: string;
14
14
  initialState: Fields;
15
+ isLoading: boolean;
15
16
  };
@@ -14,7 +14,7 @@ const baseClass = 'login';
14
14
  const Login = () => {
15
15
  const history = useHistory();
16
16
  const { user, setToken } = useAuth();
17
- const { admin: { user: userSlug }, serverURL, routes: { admin, api } } = useConfig();
17
+ const { admin: { user: userSlug, components: { beforeLogin, afterLogin, } = {}, }, serverURL, routes: { admin, api, }, } = useConfig();
18
18
  const onSuccess = (data) => {
19
19
  if (data.token) {
20
20
  setToken(data.token);
@@ -39,10 +39,12 @@ const Login = () => {
39
39
  React.createElement(Meta, { title: "Login", description: "Login user", keywords: "Login, Payload, CMS" }),
40
40
  React.createElement("div", { className: `${baseClass}__brand` },
41
41
  React.createElement(Logo, null)),
42
+ Array.isArray(beforeLogin) && beforeLogin.map((Component, i) => React.createElement(Component, { key: i })),
42
43
  React.createElement(Form, { disableSuccessStatus: true, waitForAutocomplete: true, onSuccess: onSuccess, method: "post", action: `${serverURL}${api}/${userSlug}/login` },
43
44
  React.createElement(Email, { label: "Email Address", name: "email", admin: { autoComplete: 'email' }, required: true }),
44
45
  React.createElement(Password, { label: "Password", name: "password", autoComplete: "off", required: true }),
45
46
  React.createElement(Link, { to: `${admin}/forgot` }, "Forgot password?"),
46
- React.createElement(FormSubmit, null, "Login"))));
47
+ React.createElement(FormSubmit, null, "Login")),
48
+ Array.isArray(afterLogin) && afterLogin.map((Component, i) => React.createElement(Component, { key: i }))));
47
49
  };
48
50
  export default Login;
@@ -31,20 +31,20 @@ const DefaultEditView = (props) => {
31
31
  ].filter(Boolean).join(' ');
32
32
  const operation = isEditing ? 'update' : 'create';
33
33
  return (React.createElement("div", { className: classes },
34
- React.createElement(Form, { className: `${baseClass}__form`, method: id ? 'put' : 'post', action: action, onSuccess: onSave, disabled: !hasSavePermission, initialState: initialState },
34
+ isLoading && (React.createElement(Loading, null)),
35
+ !isLoading && (React.createElement(Form, { className: `${baseClass}__form`, method: id ? 'put' : 'post', action: action, onSuccess: onSave, disabled: !hasSavePermission, initialState: initialState },
35
36
  React.createElement("div", { className: `${baseClass}__main` },
36
37
  React.createElement(Meta, { title: `${isEditing ? 'Editing' : 'Creating'} - ${collection.labels.singular}`, description: `${isEditing ? 'Editing' : 'Creating'} - ${collection.labels.singular}`, keywords: `${collection.labels.singular}, Payload, CMS` }),
37
38
  React.createElement(Eyebrow, null),
38
39
  React.createElement(LeaveWithoutSaving, null),
39
40
  React.createElement("div", { className: `${baseClass}__edit` },
40
- isLoading && (React.createElement(Loading, null)),
41
- !isLoading && (React.createElement(React.Fragment, null,
41
+ React.createElement(React.Fragment, null,
42
42
  React.createElement("header", { className: `${baseClass}__header` },
43
43
  React.createElement("h1", null,
44
44
  React.createElement(RenderTitle, { ...{ data, useAsTitle, fallback: '[Untitled]' } }))),
45
45
  auth && (React.createElement(Auth, { useAPIKey: auth.useAPIKey, requirePassword: !isEditing, verify: auth.verify, collection: collection, email: data === null || data === void 0 ? void 0 : data.email, operation: operation })),
46
46
  upload && (React.createElement(Upload, { data: data, collection: collection })),
47
- React.createElement(RenderFields, { operation: operation, readOnly: !hasSavePermission, permissions: permissions.fields, filter: (field) => { var _a, _b; return (!((_a = field === null || field === void 0 ? void 0 : field.admin) === null || _a === void 0 ? void 0 : _a.position) || (((_b = field === null || field === void 0 ? void 0 : field.admin) === null || _b === void 0 ? void 0 : _b.position) !== 'sidebar')); }, fieldTypes: fieldTypes, fieldSchema: fields }))))),
47
+ React.createElement(RenderFields, { operation: operation, readOnly: !hasSavePermission, permissions: permissions.fields, filter: (field) => { var _a, _b; return (!((_a = field === null || field === void 0 ? void 0 : field.admin) === null || _a === void 0 ? void 0 : _a.position) || (((_b = field === null || field === void 0 ? void 0 : field.admin) === null || _b === void 0 ? void 0 : _b.position) !== 'sidebar')); }, fieldTypes: fieldTypes, fieldSchema: fields })))),
48
48
  React.createElement("div", { className: `${baseClass}__sidebar-wrap` },
49
49
  React.createElement("div", { className: `${baseClass}__sidebar` },
50
50
  React.createElement("div", { className: `${baseClass}__sidebar-sticky-wrap` },
@@ -59,25 +59,24 @@ const DefaultEditView = (props) => {
59
59
  React.createElement("div", { className: `${baseClass}__document-actions${(preview && isEditing) ? ` ${baseClass}__document-actions--with-preview` : ''}` },
60
60
  isEditing && (React.createElement(PreviewButton, { generatePreviewURL: preview, data: data })),
61
61
  hasSavePermission && (React.createElement(FormSubmit, null, "Save"))),
62
- !isLoading && (React.createElement(React.Fragment, null,
63
- React.createElement("div", { className: `${baseClass}__sidebar-fields` },
64
- React.createElement(RenderFields, { operation: isEditing ? 'update' : 'create', readOnly: !hasSavePermission, permissions: permissions.fields, filter: (field) => { var _a; return ((_a = field === null || field === void 0 ? void 0 : field.admin) === null || _a === void 0 ? void 0 : _a.position) === 'sidebar'; }, fieldTypes: fieldTypes, fieldSchema: fields })),
65
- isEditing && (React.createElement("ul", { className: `${baseClass}__meta` },
66
- React.createElement("li", { className: `${baseClass}__api-url` },
67
- React.createElement("span", { className: `${baseClass}__label` },
68
- "API URL",
69
- ' ',
70
- React.createElement(CopyToClipboard, { value: apiURL })),
71
- React.createElement("a", { href: apiURL, target: "_blank", rel: "noopener noreferrer" }, apiURL)),
72
- React.createElement("li", null,
73
- React.createElement("div", { className: `${baseClass}__label` }, "ID"),
74
- React.createElement("div", null, id)),
75
- timestamps && (React.createElement(React.Fragment, null,
76
- data.updatedAt && (React.createElement("li", null,
77
- React.createElement("div", { className: `${baseClass}__label` }, "Last Modified"),
78
- React.createElement("div", null, format(new Date(data.updatedAt), dateFormat)))),
79
- data.createdAt && (React.createElement("li", null,
80
- React.createElement("div", { className: `${baseClass}__label` }, "Created"),
81
- React.createElement("div", null, format(new Date(data.createdAt), dateFormat))))))))))))))));
62
+ React.createElement("div", { className: `${baseClass}__sidebar-fields` },
63
+ React.createElement(RenderFields, { operation: isEditing ? 'update' : 'create', readOnly: !hasSavePermission, permissions: permissions.fields, filter: (field) => { var _a; return ((_a = field === null || field === void 0 ? void 0 : field.admin) === null || _a === void 0 ? void 0 : _a.position) === 'sidebar'; }, fieldTypes: fieldTypes, fieldSchema: fields })),
64
+ isEditing && (React.createElement("ul", { className: `${baseClass}__meta` },
65
+ React.createElement("li", { className: `${baseClass}__api-url` },
66
+ React.createElement("span", { className: `${baseClass}__label` },
67
+ "API URL",
68
+ ' ',
69
+ React.createElement(CopyToClipboard, { value: apiURL })),
70
+ React.createElement("a", { href: apiURL, target: "_blank", rel: "noopener noreferrer" }, apiURL)),
71
+ React.createElement("li", null,
72
+ React.createElement("div", { className: `${baseClass}__label` }, "ID"),
73
+ React.createElement("div", null, id)),
74
+ timestamps && (React.createElement(React.Fragment, null,
75
+ data.updatedAt && (React.createElement("li", null,
76
+ React.createElement("div", { className: `${baseClass}__label` }, "Last Modified"),
77
+ React.createElement("div", null, format(new Date(data.updatedAt), dateFormat)))),
78
+ data.createdAt && (React.createElement("li", null,
79
+ React.createElement("div", { className: `${baseClass}__label` }, "Created"),
80
+ React.createElement("div", null, format(new Date(data.createdAt), dateFormat)))))))))))))));
82
81
  };
83
82
  export default DefaultEditView;
@@ -56,6 +56,8 @@ exports.default = joi_1.default.object({
56
56
  })),
57
57
  beforeDashboard: joi_1.default.array().items(component),
58
58
  afterDashboard: joi_1.default.array().items(component),
59
+ beforeLogin: joi_1.default.array().items(component),
60
+ afterLogin: joi_1.default.array().items(component),
59
61
  beforeNavLinks: joi_1.default.array().items(component),
60
62
  afterNavLinks: joi_1.default.array().items(component),
61
63
  Nav: component,
@@ -120,4 +122,4 @@ exports.default = joi_1.default.object({
120
122
  plugins: joi_1.default.array().items(joi_1.default.func()),
121
123
  debug: joi_1.default.boolean(),
122
124
  });
123
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2NoZW1hLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2NvbmZpZy9zY2hlbWEudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFBQSw4Q0FBc0I7QUFFdEIsTUFBTSxTQUFTLEdBQUcsYUFBRyxDQUFDLFlBQVksRUFBRSxDQUFDLEdBQUcsQ0FDdEMsYUFBRyxDQUFDLE1BQU0sRUFBRSxDQUFDLE9BQU8sRUFBRSxFQUN0QixhQUFHLENBQUMsSUFBSSxFQUFFLENBQ1gsQ0FBQztBQUVGLGtCQUFlLGFBQUcsQ0FBQyxNQUFNLENBQUM7SUFDeEIsU0FBUyxFQUFFLGFBQUcsQ0FBQyxNQUFNLEVBQUU7U0FDcEIsR0FBRyxFQUFFO1NBQ0wsUUFBUSxFQUFFO1NBQ1YsTUFBTSxDQUFDLENBQUMsS0FBSyxFQUFFLE1BQU0sRUFBRSxFQUFFO1FBQ3hCLE1BQU0sa0JBQWtCLEdBQUcsS0FBSyxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUVoRCxJQUFJLENBQUMsa0JBQWtCLEVBQUU7WUFDdkIsT0FBTyxNQUFNLENBQUMsT0FBTyxDQUFDLEVBQUUsTUFBTSxFQUFFLHVFQUF1RSxFQUFFLENBQUMsQ0FBQztTQUM1RztRQUVELElBQUksa0JBQWtCLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFO1lBQ3hDLE9BQU8sTUFBTSxDQUFDLE9BQU8sQ0FBQyxFQUFFLE1BQU0sRUFBRSxvR0FBb0csRUFBRSxDQUFDLENBQUM7U0FDekk7UUFFRCxPQUFPLEtBQUssQ0FBQztJQUNmLENBQUMsQ0FBQztJQUNKLFlBQVksRUFBRSxhQUFHLENBQUMsTUFBTSxFQUFFO0lBQzFCLE1BQU0sRUFBRSxhQUFHLENBQUMsTUFBTSxDQUFDO1FBQ2pCLEtBQUssRUFBRSxhQUFHLENBQUMsTUFBTSxFQUFFO1FBQ25CLEdBQUcsRUFBRSxhQUFHLENBQUMsTUFBTSxFQUFFO1FBQ2pCLE9BQU8s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
125
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2NoZW1hLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2NvbmZpZy9zY2hlbWEudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFBQSw4Q0FBc0I7QUFFdEIsTUFBTSxTQUFTLEdBQUcsYUFBRyxDQUFDLFlBQVksRUFBRSxDQUFDLEdBQUcsQ0FDdEMsYUFBRyxDQUFDLE1BQU0sRUFBRSxDQUFDLE9BQU8sRUFBRSxFQUN0QixhQUFHLENBQUMsSUFBSSxFQUFFLENBQ1gsQ0FBQztBQUVGLGtCQUFlLGFBQUcsQ0FBQyxNQUFNLENBQUM7SUFDeEIsU0FBUyxFQUFFLGFBQUcsQ0FBQyxNQUFNLEVBQUU7U0FDcEIsR0FBRyxFQUFFO1NBQ0wsUUFBUSxFQUFFO1NBQ1YsTUFBTSxDQUFDLENBQUMsS0FBSyxFQUFFLE1BQU0sRUFBRSxFQUFFO1FBQ3hCLE1BQU0sa0JBQWtCLEdBQUcsS0FBSyxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUVoRCxJQUFJLENBQUMsa0JBQWtCLEVBQUU7WUFDdkIsT0FBTyxNQUFNLENBQUMsT0FBTyxDQUFDLEVBQUUsTUFBTSxFQUFFLHVFQUF1RSxFQUFFLENBQUMsQ0FBQztTQUM1RztRQUVELElBQUksa0JBQWtCLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFO1lBQ3hDLE9BQU8sTUFBTSxDQUFDLE9BQU8sQ0FBQyxFQUFFLE1BQU0sRUFBRSxvR0FBb0csRUFBRSxDQUFDLENBQUM7U0FDekk7UUFFRCxPQUFPLEtBQUssQ0FBQztJQUNmLENBQUMsQ0FBQztJQUNKLFlBQVksRUFBRSxhQUFHLENBQUMsTUFBTSxFQUFFO0lBQzFCLE1BQU0sRUFBRSxhQUFHLENBQUMsTUFBTSxDQUFDO1FBQ2pCLEtBQUssRUFBRSxhQUFHLENBQUMsTUFBTSxFQUFFO1FBQ25CLEdBQUcsRUFBRSxhQUFHLENBQUMsTUFBTSxFQUFFO1FBQ2pCLE9BQU8s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
@@ -85,6 +85,8 @@ export declare type Config = {
85
85
  routes?: AdminRoute[];
86
86
  beforeDashboard?: React.ComponentType[];
87
87
  afterDashboard?: React.ComponentType[];
88
+ beforeLogin?: React.ComponentType[];
89
+ afterLogin?: React.ComponentType[];
88
90
  beforeNavLinks?: React.ComponentType[];
89
91
  afterNavLinks?: React.ComponentType[];
90
92
  Nav?: React.ComponentType;
@@ -22,10 +22,12 @@ You can override a set of admin panel-wide components by providing a component t
22
22
  | Path | Description |
23
23
  | --------------------- | -------------|
24
24
  | **`Nav`** | Contains the sidebar and mobile Nav in its entirety. |
25
+ | **`BeforeDashboard`** | Array of components to inject into the built-in Dashboard, _before_ the default dashboard contents. [Demo](https://github.com/payloadcms/payload/tree/master/demo/client/components/AfterDashboard) |
26
+ | **`AfterDashboard`** | Array of components to inject into the built-in Dashboard, _after_ the default dashboard contents. |
27
+ | **`BeforeLogin`** | Array of components to inject into the built-in Login, _before_ the default login form. |
28
+ | **`AfterLogin`** | Array of components to inject into the built-in Login, _after_ the default login form. |
25
29
  | **`BeforeNavLinks`** | Array of components to inject into the built-in Nav, _before_ the links themselves. |
26
- | **`AfterNavLinks`** | Array of components to inject into the built-in Nav, _after_ the links themselves. [Demo](https://github.com/payloadcms/payload/tree/master/demo/client/components/AfterNavLinks) |
27
- | **`BeforeDashboard`** | Array of components to inject into the built-in Dashboard, _before_ the default dashboard contents. |
28
- | **`AfterNavLinks`** | Array of components to inject into the built-in Nav, _after_ the default dashboard contents. [Demo](https://github.com/payloadcms/payload/tree/master/demo/client/components/AfterDashboard) |
30
+ | **`AfterNavLinks`** | Array of components to inject into the built-in Nav, _after_ the links. |
29
31
  | **`views.Account`** | The Account view is used to show the currently logged in user's Account page. |
30
32
  | **`views.Dashboard`** | The main landing page of the Admin panel. |
31
33
  | **`graphics.Icon`** | Used as a graphic within the `Nav` component. Often represents a condensed version of a full logo. |
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "payload",
3
- "version": "0.14.15-beta.0",
3
+ "version": "0.14.19-beta.0",
4
4
  "description": "Node, React and MongoDB Headless CMS and Application Framework",
5
5
  "license": "SEE LICENSE IN license.md",
6
6
  "author": {