Skip to content

Commit 300e9e2

Browse files
authored
feat: introduce default home, 404 and error pages (#336)
1 parent 9e475bd commit 300e9e2

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

46 files changed

+1079
-246
lines changed

packages/demo-site/package.json

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,8 @@
55
"dependencies": {
66
"apollo-link-batch-http": "^1.2.3",
77
"demo-theme": "0.0.0",
8+
"invariant": "^2.2.4",
9+
"react-helmet": "^5.2.0",
810
"react-hot-loader": "^4.3.5",
911
"webiny-app": "0.0.0",
1012
"webiny-app-cms": "0.0.0",

packages/demo-site/src/App.js

Lines changed: 11 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,19 +2,27 @@
22
import { hot } from "react-hot-loader";
33
import React from "react";
44
import { Webiny, Router } from "webiny-app";
5-
// import { addPlugin } from "webiny-plugins";
65
import { CmsProvider } from "webiny-app-cms/context";
7-
import { app as cmsApp} from "webiny-app-cms/site";
6+
import { app as cmsApp } from "webiny-app-cms/site";
87
import myTheme from "demo-theme";
98
import config from "./config";
9+
import { GenericNotFoundPage, GenericErrorPage } from "./cms";
1010

1111
cmsApp();
1212

1313
const App = () => {
1414
return (
1515
<Webiny config={config}>
1616
{({ router }) => (
17-
<CmsProvider theme={myTheme}>
17+
<CmsProvider
18+
theme={myTheme}
19+
defaults={{
20+
pages: {
21+
notFound: GenericNotFoundPage,
22+
error: GenericErrorPage
23+
}
24+
}}
25+
>
1826
<Router router={router} />
1927
</CmsProvider>
2028
)}
Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
// @flow
2+
import React from "react";
3+
import { Helmet } from "react-helmet";
4+
5+
export default function GenericErrorPage() {
6+
return (
7+
<div className="webiny-cms-page">
8+
<>
9+
<Helmet>
10+
<meta charSet="utf-8" />
11+
<title>An error occurred.</title>
12+
</Helmet>
13+
<div>An error occurred.</div>
14+
</>
15+
</div>
16+
);
17+
}
Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
// @flow
2+
import React from "react";
3+
import { Helmet } from "react-helmet";
4+
5+
export default function GenericErrorPage() {
6+
return (
7+
<div>
8+
<>
9+
<Helmet>
10+
<meta charSet="utf-8" />
11+
<title>Page not found.</title>
12+
</Helmet>
13+
<div>Page not found.</div>
14+
</>
15+
</div>
16+
);
17+
}

packages/demo-site/src/cms/index.js

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
// @flow
2+
export { default as GenericErrorPage } from "./GenericErrorPage";
3+
export { default as GenericNotFoundPage } from "./GenericNotFoundPage";
Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
// @flow
2+
import { settingsFactory } from "webiny-api/entities";
3+
4+
import { Model } from "webiny-model";
5+
import { EntityModel } from "webiny-entity";
6+
7+
const cmsSettingsPagesModelFactory = (settings, { cms: { entities } }) => {
8+
return class CmsSettingsModel extends EntityModel {
9+
constructor() {
10+
super();
11+
this.setParentEntity(settings);
12+
this.attr("home").entity(entities.Page);
13+
this.attr("notFound").entity(entities.Page);
14+
this.attr("error").entity(entities.Page);
15+
}
16+
};
17+
};
18+
19+
const cmsSettingsModelFactory = (...args) => {
20+
return class CmsSettingsModel extends Model {
21+
constructor() {
22+
super();
23+
this.attr("pages").model(cmsSettingsPagesModelFactory(...args));
24+
}
25+
};
26+
};
27+
28+
export const cmsSettingsFactory = (...args) => {
29+
return class CmsSettings extends settingsFactory(...args) {
30+
static key = "cms";
31+
32+
data: Object;
33+
load: Function;
34+
35+
constructor() {
36+
super();
37+
this.attr("data").model(cmsSettingsModelFactory(this, ...args));
38+
}
39+
};
40+
};

packages/webiny-api-cms/src/entities/index.js

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,3 +5,4 @@ export { menuFactory } from "webiny-api-cms/entities/Menu.entity";
55
export { pageFactory } from "webiny-api-cms/entities/Page.entity";
66
export { tagFactory } from "webiny-api-cms/entities/Tag.entity";
77
export { tags2PagesFactory } from "webiny-api-cms/entities/Tags2Pages.entity";
8+
export { cmsSettingsFactory } from "webiny-api-cms/entities/CmsSettings.entity";

packages/webiny-api-cms/src/install/importData.js

Lines changed: 25 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,10 @@
11
// @flow
22
import setupEntities from "./setupEntities";
3+
import createDefaultPages from "./importData/createDefaultPages";
34

45
export default async (context: Object) => {
56
setupEntities(context);
6-
const { Category, Element, Page, Tag, Menu } = context.cms.entities;
7+
const { Category, Element, Tag, Menu } = context.cms.entities;
78

89
const menu = new Menu();
910
menu.populate({
@@ -34,31 +35,32 @@ export default async (context: Object) => {
3435
await t.save();
3536
});
3637

37-
const blogCategory = new Category();
38-
blogCategory.populate({
39-
name: "Blog",
40-
slug: "blog",
41-
url: "/blog/",
42-
layout: "blog"
43-
});
44-
await blogCategory.save();
38+
const categories = {
39+
blog: new Category(),
40+
static: new Category()
41+
};
4542

46-
const staticCategory = new Category();
47-
staticCategory.populate({
48-
name: "Static",
49-
slug: "static",
50-
url: "/",
51-
layout: "static"
52-
});
53-
await staticCategory.save();
43+
await categories.blog
44+
.populate({
45+
name: "Blog",
46+
slug: "blog",
47+
url: "/blog/",
48+
layout: "blog"
49+
})
50+
.save();
5451

55-
const page = new Page();
56-
page.populate({
57-
title: "Demo blog post",
58-
category: blogCategory
59-
});
60-
await page.save();
52+
await categories.static
53+
.populate({
54+
name: "Static",
55+
slug: "static",
56+
url: "/",
57+
layout: "static"
58+
})
59+
.save();
60+
61+
await createDefaultPages(context, { categories });
6162

63+
// Create sample element.
6264
const element = new Element();
6365
element.populate({
6466
name: "Custom text",
Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,49 @@
1+
// @flow
2+
import { notFound, homepage, error } from "./staticPages";
3+
4+
const createDefaultPage = async ({ page, data, category }) => {
5+
page.populate({ ...data, category });
6+
await page.save();
7+
8+
page.published = true;
9+
await page.save();
10+
11+
return page;
12+
};
13+
14+
const createDefaultPages = async (context: Object, { categories }: Object) => {
15+
const { Page, CmsSettings } = context.cms.entities;
16+
17+
// Create default pages - demo blog, error, not found and homepage and also assign to settings.
18+
const demoBlogPage = new Page();
19+
demoBlogPage.populate({
20+
title: "Demo blog post",
21+
category: categories.blog
22+
});
23+
await demoBlogPage.save();
24+
25+
const cmsSettings = new CmsSettings();
26+
cmsSettings.data = {
27+
pages: {
28+
home: await createDefaultPage({
29+
page: new Page(),
30+
data: homepage,
31+
category: categories.static
32+
}),
33+
error: await createDefaultPage({
34+
page: new Page(),
35+
data: error,
36+
category: categories.static
37+
}),
38+
notFound: await createDefaultPage({
39+
page: new Page(),
40+
data: notFound,
41+
category: categories.static
42+
})
43+
}
44+
};
45+
46+
await cmsSettings.save();
47+
};
48+
49+
export default createDefaultPages;
Lines changed: 80 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,80 @@
1+
// @flow
2+
export default {
3+
title: "Error Page",
4+
url: "/error",
5+
content: {
6+
id: "P3NNeXWAk",
7+
data: {},
8+
settings: {},
9+
elements: [
10+
{
11+
id: "STaGA7c5Jt",
12+
data: {},
13+
settings: {},
14+
elements: [
15+
{
16+
id: "E0j-dyOuLN",
17+
data: {},
18+
settings: { style: { margin: "15px", padding: "15px" } },
19+
elements: [
20+
{
21+
id: "iwpwZYraMw",
22+
data: { width: 100 },
23+
settings: { style: { margin: "20px" } },
24+
elements: [
25+
{
26+
id: "zACl76J1b",
27+
data: {
28+
text: {
29+
object: "value",
30+
document: {
31+
object: "document",
32+
data: {},
33+
nodes: [
34+
{
35+
object: "block",
36+
type: "paragraph",
37+
data: { align: "center" },
38+
nodes: [
39+
{
40+
object: "text",
41+
leaves: [
42+
{
43+
object: "leaf",
44+
text:
45+
"Woops, something went wrong! :(",
46+
marks: []
47+
}
48+
]
49+
}
50+
]
51+
}
52+
]
53+
}
54+
}
55+
},
56+
settings: { style: { padding: "20px" } },
57+
elements: [],
58+
path: "0.0.0.0.0",
59+
type: "cms-element-text"
60+
}
61+
],
62+
path: "0.0.0.0",
63+
type: "cms-element-column"
64+
}
65+
],
66+
path: "0.0.0",
67+
type: "cms-element-row"
68+
}
69+
],
70+
path: "0.0",
71+
type: "cms-element-block"
72+
}
73+
],
74+
path: "0",
75+
type: "cms-element-document"
76+
},
77+
settings: {
78+
general: { layout: "static" }
79+
}
80+
};

0 commit comments

Comments
 (0)