payload 0.13.8-beta.0 → 0.13.9-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,3 +1,18 @@
1
+ ## [0.13.9-beta.0](https://github.com/payloadcms/payload/compare/v0.13.6...v0.13.9-beta.0) (2021-12-21)
2
+
3
+
4
+ ### Bug Fixes
5
+
6
+ * [#370](https://github.com/payloadcms/payload/issues/370), only performs password functions when auth enabled ([9738873](https://github.com/payloadcms/payload/commit/97388738def687f3b26eaf8de6b067f4d3758418))
7
+ * [#390](https://github.com/payloadcms/payload/issues/390), safari rich text link bug ([a16b99b](https://github.com/payloadcms/payload/commit/a16b99b0c87d55f768ed74ab35708a291fc7bbb0))
8
+ * [#393](https://github.com/payloadcms/payload/issues/393), ensures preview button gets up to date data ([2f47e39](https://github.com/payloadcms/payload/commit/2f47e39a9f765bd8ce437d4b7500a5b314a192a5))
9
+
10
+
11
+ ### Features
12
+
13
+ * builds custom routes API, Before/After Dashboard and Nav custom components ([e337c62](https://github.com/payloadcms/payload/commit/e337c62ba179821c994404a2b693871b2401861b))
14
+ * exports custom text and select inputs ([52edb5b](https://github.com/payloadcms/payload/commit/52edb5b77f45e267c43a284c5591044ac4d726e7))
15
+
1
16
  ## [0.13.8-beta.0](https://github.com/payloadcms/payload/compare/v0.13.6...v0.13.8-beta.0) (2021-12-20)
2
17
 
3
18
 
@@ -0,0 +1,3 @@
1
+ export { default as Button } from '../dist/admin/components/elements/Button';
2
+ export { default as Card } from '../dist/admin/components/elements/Card';
3
+ export { default as Eyebrow } from '../dist/admin/components/elements/Eyebrow';
@@ -0,0 +1 @@
1
+ export { useStepNav } from '../dist/admin/components/elements/StepNav';
@@ -0,0 +1,2 @@
1
+ export { default as Chevron } from '../src/admin/components/icons/Chevron';
2
+ export { default as X } from '../src/admin/components/icons/X';
@@ -0,0 +1,2 @@
1
+ export { default as DefaultTemplate } from '../dist/admin/components/templates/Default';
2
+ export { default as MinimalTemplate } from '../dist/admin/components/templates/Minimal';
@@ -0,0 +1 @@
1
+ export { default as Meta } from '../src/admin/components/utilities/Meta';
@@ -22,8 +22,9 @@ const UnauthorizedUser = lazy(() => import('./views/UnauthorizedUser'));
22
22
  const Account = lazy(() => import('./views/Account'));
23
23
  const Routes = () => {
24
24
  const [initialized, setInitialized] = useState(null);
25
- const { user, permissions, permissions: { canAccessAdmin }, refreshCookie } = useAuth();
26
- const { admin: { user: userSlug }, routes, collections, globals, } = useConfig();
25
+ const { user, permissions, refreshCookie } = useAuth();
26
+ const canAccessAdmin = permissions === null || permissions === void 0 ? void 0 : permissions.canAccessAdmin;
27
+ const { admin: { user: userSlug, components: { routes: customRoutes, } = {}, }, routes, collections, globals, } = useConfig();
27
28
  useEffect(() => {
28
29
  requests.get(`${routes.api}/${userSlug}/init`).then((res) => res.json().then((data) => {
29
30
  if (data && 'initialized' in data) {
@@ -41,7 +42,12 @@ const Routes = () => {
41
42
  React.createElement(Redirect, { to: `${match.url}/create-first-user` }))));
42
43
  }
43
44
  if (initialized === true) {
45
+ if (user === undefined || canAccessAdmin === undefined) {
46
+ return React.createElement(Loading, null);
47
+ }
44
48
  return (React.createElement(Switch, null,
49
+ Array.isArray(customRoutes) && customRoutes.map(({ path, Component, strict, exact, sensitive }) => (React.createElement(Route, { key: `${match.url}${path}`, path: `${match.url}${path}`, strict: strict, exact: exact, sensitive: sensitive },
50
+ React.createElement(Component, { user: user, canAccessAdmin: canAccessAdmin })))),
45
51
  React.createElement(Route, { path: `${match.url}/login` },
46
52
  React.createElement(Login, null)),
47
53
  React.createElement(Route, { path: `${match.url}/logout` },
@@ -109,9 +115,6 @@ const Routes = () => {
109
115
  }
110
116
  return React.createElement(Loading, null);
111
117
  }
112
- if (user === undefined) {
113
- return React.createElement(Loading, null);
114
- }
115
118
  return React.createElement(Redirect, { to: `${match.url}/login` });
116
119
  } }),
117
120
  React.createElement(Route, { path: `${match.url}*` },
@@ -15,7 +15,7 @@ const DefaultNav = () => {
15
15
  const { permissions } = useAuth();
16
16
  const [menuActive, setMenuActive] = useState(false);
17
17
  const history = useHistory();
18
- const { collections, globals, routes: { admin, }, } = useConfig();
18
+ const { collections, globals, routes: { admin, }, admin: { components: { BeforeNavLinks, AfterNavLinks, }, }, } = useConfig();
19
19
  const classes = [
20
20
  baseClass,
21
21
  menuActive && `${baseClass}--menu-active`,
@@ -32,6 +32,7 @@ const DefaultNav = () => {
32
32
  menuActive && (React.createElement(CloseMenu, null)),
33
33
  !menuActive && (React.createElement(Menu, null)))),
34
34
  React.createElement("div", { className: `${baseClass}__wrap` },
35
+ BeforeNavLinks && React.createElement(BeforeNavLinks, null),
35
36
  React.createElement("span", { className: `${baseClass}__label` }, "Collections"),
36
37
  React.createElement("nav", null, collections && collections.map((collection, i) => {
37
38
  var _a, _b;
@@ -55,6 +56,7 @@ const DefaultNav = () => {
55
56
  }
56
57
  return null;
57
58
  })))),
59
+ AfterNavLinks && React.createElement(AfterNavLinks, null),
58
60
  React.createElement("div", { className: `${baseClass}__controls` },
59
61
  React.createElement(Localizer, null),
60
62
  React.createElement(Link, { to: `${admin}/account`, className: `${baseClass}__account` },
@@ -1,7 +1,6 @@
1
1
  import React from 'react';
2
2
  import { useConfig } from '@payloadcms/config-provider';
3
3
  import DefaultNav from '../../elements/Nav';
4
- import { StepNavProvider } from '../../elements/StepNav';
5
4
  import RenderCustomComponent from '../../utilities/RenderCustomComponent';
6
5
  import Meta from '../../utilities/Meta';
7
6
  import './index.scss';
@@ -15,9 +14,8 @@ const Default = ({ children, className }) => {
15
14
  className,
16
15
  ].filter(Boolean).join(' ');
17
16
  return (React.createElement("div", { className: classes },
18
- React.createElement(StepNavProvider, null,
19
- React.createElement(Meta, { title: "Dashboard", description: "Dashboard for Payload CMS", keywords: "Dashboard, Payload, CMS" }),
20
- React.createElement(RenderCustomComponent, { DefaultComponent: DefaultNav, CustomComponent: CustomNav }),
21
- React.createElement("div", { className: `${baseClass}__wrap` }, children))));
17
+ React.createElement(Meta, { title: "Dashboard", description: "Dashboard for Payload CMS", keywords: "Dashboard, Payload, CMS" }),
18
+ React.createElement(RenderCustomComponent, { DefaultComponent: DefaultNav, CustomComponent: CustomNav }),
19
+ React.createElement("div", { className: `${baseClass}__wrap` }, children)));
22
20
  };
23
21
  export default Default;
@@ -7,10 +7,6 @@
7
7
  &__wrap {
8
8
  padding-left: base(2);
9
9
  min-width: 0;
10
- }
11
-
12
- &__wrap {
13
- display: flex;
14
10
  width: 100%;
15
11
  flex-grow: 1;
16
12
  }
@@ -9,10 +9,11 @@ const baseClass = 'dashboard';
9
9
  const Dashboard = (props) => {
10
10
  const { collections, globals, permissions, } = props;
11
11
  const { push } = useHistory();
12
- const { routes: { admin, }, } = useConfig();
12
+ const { routes: { admin, }, admin: { components: { AfterDashboard, BeforeDashboard, }, }, } = useConfig();
13
13
  return (React.createElement("div", { className: baseClass },
14
14
  React.createElement(Eyebrow, null),
15
15
  React.createElement("div", { className: `${baseClass}__wrap` },
16
+ BeforeDashboard && (React.createElement(BeforeDashboard, null)),
16
17
  React.createElement("h3", { className: `${baseClass}__label` }, "Collections"),
17
18
  React.createElement("ul", { className: `${baseClass}__card-list` }, collections.map((collection) => {
18
19
  var _a, _b, _c;
@@ -23,6 +24,7 @@ const Dashboard = (props) => {
23
24
  (globals.length > 0) && (React.createElement(React.Fragment, null,
24
25
  React.createElement("h3", { className: `${baseClass}__label` }, "Globals"),
25
26
  React.createElement("ul", { className: `${baseClass}__card-list` }, globals.map((global) => (React.createElement("li", { key: global.slug },
26
- React.createElement(Card, { title: global.label, onClick: () => push({ pathname: `${admin}/globals/${global.slug}` }) }))))))))));
27
+ React.createElement(Card, { title: global.label, onClick: () => push({ pathname: `${admin}/globals/${global.slug}` }) }))))))),
28
+ AfterDashboard && (React.createElement(AfterDashboard, null)))));
27
29
  };
28
30
  export default Dashboard;
@@ -13,6 +13,7 @@ import { PreferencesProvider } from './components/utilities/Preferences';
13
13
  import { SearchParamsProvider } from './components/utilities/SearchParams';
14
14
  import { LocaleProvider } from './components/utilities/Locale';
15
15
  import Routes from './components/Routes';
16
+ import { StepNavProvider } from './components/elements/StepNav';
16
17
  import './scss/app.scss';
17
18
  const Index = () => (React.createElement(React.Fragment, null,
18
19
  React.createElement(ConfigProvider, { config: config },
@@ -29,7 +30,8 @@ const Index = () => (React.createElement(React.Fragment, null,
29
30
  React.createElement(PreferencesProvider, null,
30
31
  React.createElement(SearchParamsProvider, null,
31
32
  React.createElement(LocaleProvider, null,
32
- React.createElement(Routes, null))),
33
+ React.createElement(StepNavProvider, null,
34
+ React.createElement(Routes, null)))),
33
35
  React.createElement(ModalContainer, null)))))))),
34
36
  React.createElement(ToastContainer, { position: "bottom-center", transition: Slide })));
35
37
  render(React.createElement(Index, null), document.getElementById('app'));
@@ -46,6 +46,18 @@ exports.default = joi_1.default.object({
46
46
  dateFormat: joi_1.default.string(),
47
47
  components: joi_1.default.object()
48
48
  .keys({
49
+ routes: joi_1.default.array()
50
+ .items(joi_1.default.object().keys({
51
+ Component: component.required(),
52
+ path: joi_1.default.string().required(),
53
+ exact: joi_1.default.bool(),
54
+ strict: joi_1.default.bool(),
55
+ sensitive: joi_1.default.bool(),
56
+ })),
57
+ BeforeDashboard: component,
58
+ AfterDashboard: component,
59
+ BeforeNavLinks: component,
60
+ AfterNavLinks: component,
49
61
  Nav: component,
50
62
  views: joi_1.default.object({
51
63
  Dashboard: component,
@@ -108,4 +120,4 @@ exports.default = joi_1.default.object({
108
120
  plugins: joi_1.default.array().items(joi_1.default.func()),
109
121
  debug: joi_1.default.boolean(),
110
122
  });
111
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2NoZW1hLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2NvbmZpZy9zY2hlbWEudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFBQSw4Q0FBc0I7QUFFdEIsTUFBTSxTQUFTLEdBQUcsYUFBRyxDQUFDLFlBQVksRUFBRSxDQUFDLEdBQUcsQ0FDdEMsYUFBRyxDQUFDLE1BQU0sRUFBRSxDQUFDLE9BQU8sRUFBRSxFQUN0QixhQUFHLENBQUMsSUFBSSxFQUFFLENBQ1gsQ0FBQztBQUVGLGtCQUFlLGFBQUcsQ0FBQyxNQUFNLENBQUM7SUFDeEIsU0FBUyxFQUFFLGFBQUcsQ0FBQyxNQUFNLEVBQUU7U0FDcEIsR0FBRyxFQUFFO1NBQ0wsUUFBUSxFQUFFO1NBQ1YsTUFBTSxDQUFDLENBQUMsS0FBSyxFQUFFLE1BQU0sRUFBRSxFQUFFO1FBQ3hCLE1BQU0sa0JBQWtCLEdBQUcsS0FBSyxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUVoRCxJQUFJLENBQUMsa0JBQWtCLEVBQUU7WUFDdkIsT0FBTyxNQUFNLENBQUMsT0FBTyxDQUFDLEVBQUUsTUFBTSxFQUFFLHVFQUF1RSxFQUFFLENBQUMsQ0FBQztTQUM1RztRQUVELElBQUksa0JBQWtCLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFO1lBQ3hDLE9BQU8sTUFBTSxDQUFDLE9BQU8sQ0FBQyxFQUFFLE1BQU0sRUFBRSxvR0FBb0csRUFBRSxDQUFDLENBQUM7U0FDekk7UUFFRCxPQUFPLEtBQUssQ0FBQztJQUNmLENBQUMsQ0FBQztJQUNKLFlBQVksRUFBRSxhQUFHLENBQUMsTUFBTSxFQUFFO0lBQzFCLE1BQU0sRUFBRSxhQUFHLENBQUMsTUFBTSxDQUFDO1FBQ2pCLEtBQUssRUFBRSxhQUFHLENBQUMsTUFBTSxFQUFFO1FBQ25CLEdBQUcsRUFBRSxhQUFHLENBQUMsTUFBTSxFQUFFO1FBQ2pCLE9BQU8s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
123
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2NoZW1hLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2NvbmZpZy9zY2hlbWEudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFBQSw4Q0FBc0I7QUFFdEIsTUFBTSxTQUFTLEdBQUcsYUFBRyxDQUFDLFlBQVksRUFBRSxDQUFDLEdBQUcsQ0FDdEMsYUFBRyxDQUFDLE1BQU0sRUFBRSxDQUFDLE9BQU8sRUFBRSxFQUN0QixhQUFHLENBQUMsSUFBSSxFQUFFLENBQ1gsQ0FBQztBQUVGLGtCQUFlLGFBQUcsQ0FBQyxNQUFNLENBQUM7SUFDeEIsU0FBUyxFQUFFLGFBQUcsQ0FBQyxNQUFNLEVBQUU7U0FDcEIsR0FBRyxFQUFFO1NBQ0wsUUFBUSxFQUFFO1NBQ1YsTUFBTSxDQUFDLENBQUMsS0FBSyxFQUFFLE1BQU0sRUFBRSxFQUFFO1FBQ3hCLE1BQU0sa0JBQWtCLEdBQUcsS0FBSyxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUVoRCxJQUFJLENBQUMsa0JBQWtCLEVBQUU7WUFDdkIsT0FBTyxNQUFNLENBQUMsT0FBTyxDQUFDLEVBQUUsTUFBTSxFQUFFLHVFQUF1RSxFQUFFLENBQUMsQ0FBQztTQUM1RztRQUVELElBQUksa0JBQWtCLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFO1lBQ3hDLE9BQU8sTUFBTSxDQUFDLE9BQU8sQ0FBQyxFQUFFLE1BQU0sRUFBRSxvR0FBb0csRUFBRSxDQUFDLENBQUM7U0FDekk7UUFFRCxPQUFPLEtBQUssQ0FBQztJQUNmLENBQUMsQ0FBQztJQUNKLFlBQVksRUFBRSxhQUFHLENBQUMsTUFBTSxFQUFFO0lBQzFCLE1BQU0sRUFBRSxhQUFHLENBQUMsTUFBTSxDQUFDO1FBQ2pCLEtBQUssRUFBRSxhQUFHLENBQUMsTUFBTSxFQUFFO1FBQ25CLEdBQUcsRUFBRSxhQUFHLENBQUMsTUFBTSxFQUFFO1FBQ2pCLE9BQU8s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
@@ -1,4 +1,3 @@
1
- /// <reference types="react" />
2
1
  import { Express } from 'express';
3
2
  import { DeepRequired } from 'ts-essentials';
4
3
  import { Transporter } from 'nodemailer';
@@ -7,11 +6,13 @@ import { Configuration } from 'webpack';
7
6
  import SMTPConnection from 'nodemailer/lib/smtp-connection';
8
7
  import GraphQL from 'graphql';
9
8
  import { ConnectionOptions } from 'mongoose';
9
+ import React from 'react';
10
10
  import { Payload } from '..';
11
11
  import { AfterErrorHook, CollectionConfig, SanitizedCollectionConfig } from '../collections/config/types';
12
12
  import { GlobalConfig, SanitizedGlobalConfig } from '../globals/config/types';
13
13
  import { PayloadRequest } from '../express/types';
14
14
  import { Where } from '../types';
15
+ import { User } from '../auth/types';
15
16
  declare type Email = {
16
17
  fromName: string;
17
18
  fromAddress: string;
@@ -56,6 +57,17 @@ export declare type AccessResult = boolean | Where;
56
57
  * Access function
57
58
  */
58
59
  export declare type Access = (args?: any) => AccessResult;
60
+ export declare type AdminView = React.ComponentType<{
61
+ user: User;
62
+ canAccessAdmin: boolean;
63
+ }>;
64
+ export declare type AdminRoute = {
65
+ Component: AdminView;
66
+ path: string;
67
+ exact?: boolean;
68
+ strict?: boolean;
69
+ sensitive?: boolean;
70
+ };
59
71
  export declare type Config = {
60
72
  admin?: {
61
73
  user?: string;
@@ -70,6 +82,11 @@ export declare type Config = {
70
82
  scss?: string;
71
83
  dateFormat?: string;
72
84
  components?: {
85
+ routes?: AdminRoute[];
86
+ BeforeDashboard?: React.ComponentType;
87
+ AfterDashboard?: React.ComponentType;
88
+ BeforeNavLinks?: React.ComponentType;
89
+ AfterNavLinks?: React.ComponentType;
73
90
  Nav?: React.ComponentType;
74
91
  graphics?: {
75
92
  Icon?: React.ComponentType;
@@ -17,4 +17,4 @@ function hasTransportOptions(emailConfig) {
17
17
  return emailConfig.transportOptions !== undefined;
18
18
  }
19
19
  exports.hasTransportOptions = hasTransportOptions;
20
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHlwZXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvY29uZmlnL3R5cGVzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQXlDQTs7O0dBR0c7QUFDSCxTQUFnQixZQUFZLENBQUMsV0FBeUI7SUFDcEQsT0FBUSxXQUE4QixDQUFDLFNBQVMsS0FBSyxTQUFTLENBQUM7QUFDakUsQ0FBQztBQUZELG9DQUVDO0FBRUQ7OztHQUdHO0FBQ0gsU0FBZ0IsbUJBQW1CLENBQUMsV0FBeUI7SUFDM0QsT0FBUSxXQUFxQyxDQUFDLGdCQUFnQixLQUFLLFNBQVMsQ0FBQztBQUMvRSxDQUFDO0FBRkQsa0RBRUMifQ==
20
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHlwZXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvY29uZmlnL3R5cGVzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQTJDQTs7O0dBR0c7QUFDSCxTQUFnQixZQUFZLENBQUMsV0FBeUI7SUFDcEQsT0FBUSxXQUE4QixDQUFDLFNBQVMsS0FBSyxTQUFTLENBQUM7QUFDakUsQ0FBQztBQUZELG9DQUVDO0FBRUQ7OztHQUdHO0FBQ0gsU0FBZ0IsbUJBQW1CLENBQUMsV0FBeUI7SUFDM0QsT0FBUSxXQUFxQyxDQUFDLGdCQUFnQixLQUFLLFNBQVMsQ0FBQztBQUMvRSxDQUFDO0FBRkQsa0RBRUMifQ==
@@ -22,10 +22,15 @@ 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
+ | **`BeforeNavLinks`** | Injects into the built-in Nav, _before_ the links themselves. |
26
+ | **`AfterNavLinks`** | Injects into the built-in Nav, _after_ the links themselves. [Demo](https://github.com/payloadcms/payload/tree/master/demo/client/components/AfterNavLinks) |
27
+ | **`BeforeDashboard`** | Injects into the built-in Dashboard, _before_ the default dashboard contents. |
28
+ | **`AfterNavLinks`** | Injects into the built-in Nav, _after_ the default dashboard contents. [Demo](https://github.com/payloadcms/payload/tree/master/demo/client/components/AfterDashboard) |
25
29
  | **`views.Account`** | The Account view is used to show the currently logged in user's Account page. |
26
30
  | **`views.Dashboard`** | The main landing page of the Admin panel. |
27
31
  | **`graphics.Icon`** | Used as a graphic within the `Nav` component. Often represents a condensed version of a full logo. |
28
32
  | **`graphics.Logo`** | The full logo to be used in contexts like the `Login` view. |
33
+ | **`routes`** | Define your own routes to add to the Payload Admin UI. [More](#custom-routes) |
29
34
 
30
35
  #### Full example:
31
36
 
@@ -107,6 +112,45 @@ const CustomTextField = ({ path }) => {
107
112
  }
108
113
  ```
109
114
 
115
+ ## Custom routes
116
+
117
+ You can easily add your own custom routes to the Payload Admin panel using the `admin.components.routes` property. Payload currently uses the extremely powerful React Router v5.x and custom routes support all the properties of the React Router `<Route />` component.
118
+
119
+ **Custom routes support the following properties:**
120
+
121
+ | Property | Description |
122
+ | ----------------- | -------------|
123
+ | **`Component`** * | Pass in the component that should be rendered when a user navigates to this route. |
124
+ | **`path`** * | React Router `path`. [See the React Router docs](https://v5.reactrouter.com/web/api/Route/path-string-string) for more info. |
125
+ | **`exact`** | React Router `exact` property. [More](https://v5.reactrouter.com/web/api/Route/exact-bool) |
126
+ | **`strict`** | React Router `strict` property. [More](https://v5.reactrouter.com/web/api/Route/strict-bool) |
127
+ | **`sensitive`** | React Router `sensitive` property. [More](https://v5.reactrouter.com/web/api/Route/sensitive-bool) |
128
+
129
+ *\* An asterisk denotes that a property is required.*
130
+
131
+ #### Custom route components
132
+
133
+ Your custom route components will be given all the props that a React Router `<Route />` typically would receive, as well as two props from Payload:
134
+
135
+ | Prop | Description |
136
+ | ---------------------- | -------------|
137
+ | **`user`** | The currently logged in user. Will be `null` if no user is logged in. |
138
+ | **`canAccessAdmin`** * | If the currently logged in user is allowed to access the admin panel or not. |
139
+
140
+ <Banner type="warning">
141
+ <strong>Note:</strong><br/>
142
+ It's up to you to secure your custom routes. If your route requires a user to be logged in or to have certain access rights, you should handle that within your route component yourself.
143
+ </Banner>
144
+
145
+ #### Example
146
+
147
+ You can find examples of custom route views in the [Payload source code `/demo/client/components/views` folder](https://github.com/payloadcms/payload/tree/master/demo/client/components/views). There, you'll find two custom routes:
148
+
149
+ 1. A custom view that uses the `DefaultTemplate`, which is the built-in Payload template that displays the sidebar and "eyebrow nav"
150
+ 1. A custom view that uses the `MinimalTemplate` - which is just a centered template used for things like logging in or out
151
+
152
+ To see how to pass in your custom views to create custom routes of your own, take a look at the `admin.components.routes` property of the [Payload demo config](https://github.com/payloadcms/payload/blob/master/demo/payload.config.ts).
153
+
110
154
  ### Styling Custom Components
111
155
 
112
156
  Payload exports its SCSS variables and mixins for reuse in your own custom components. This is helpful in cases where you might want to style a custom input similarly to Payload's built-ini styling so it blends more thoroughly into the existing admin UI.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "payload",
3
- "version": "0.13.8-beta.0",
3
+ "version": "0.13.9-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": {
@@ -85,7 +85,7 @@
85
85
  "@faceless-ui/modal": "^1.1.4",
86
86
  "@faceless-ui/scroll-info": "^1.2.3",
87
87
  "@faceless-ui/window-info": "^1.2.4",
88
- "@payloadcms/config-provider": "^0.1.0",
88
+ "@payloadcms/config-provider": "0.1.1",
89
89
  "@types/mime": "^2.0.3",
90
90
  "@types/passport-local-mongoose": "^6.1.0",
91
91
  "babel-jest": "^26.3.0",