mirror of
https://github.com/trambarhq/relaks-wordpress-example.git
synced 2025-09-24 22:41:31 +02:00
Added subpages (issue #5).
This commit is contained in:
@@ -5,7 +5,9 @@ import { Route } from 'routing';
|
||||
import WordPress from 'wordpress';
|
||||
|
||||
import HTML from 'widgets/html';
|
||||
import Breadcrumb from 'widgets/breadcrumb';
|
||||
import PageView from 'widgets/page-view';
|
||||
import PageList from 'widgets/page-list';
|
||||
|
||||
class PagePage extends AsyncComponent {
|
||||
static displayName = 'PagePage';
|
||||
@@ -19,6 +21,8 @@ class PagePage extends AsyncComponent {
|
||||
props.page = await wp.fetchOne('/wp/v2/pages/', pageSlug);
|
||||
meanwhile.show(<PagePageSync {...props} />);
|
||||
props.parentPages = await wp.fetchMultiple('/wp/v2/pages/', parentPageSlugs);
|
||||
meanwhile.show(<PagePageSync {...props} />);
|
||||
props.childPages = await wp.fetchList(`/wp/v2/pages/?parent=${props.page.id}`, { minimum: '100%' });
|
||||
return <PagePageSync {...props} />;
|
||||
}
|
||||
}
|
||||
@@ -27,10 +31,25 @@ class PagePageSync extends PureComponent {
|
||||
static displayName = 'PagePageSync';
|
||||
|
||||
render() {
|
||||
let { page } = this.props;
|
||||
let { route, page, parentPages, childPages } = this.props;
|
||||
let trail = [];
|
||||
let parents = [];
|
||||
if (parentPages) {
|
||||
for (let parentPage of parentPages) {
|
||||
parents.push(parentPage);
|
||||
|
||||
let title = _.get(parentPage, 'title.rendered', '');
|
||||
let slugs = _.map(parents, 'slug');
|
||||
let url = route.find(slugs);
|
||||
trail.push({ label: <HTML text={title} />, url })
|
||||
}
|
||||
parents.push(page);
|
||||
}
|
||||
return (
|
||||
<div className="page">
|
||||
<Breadcrumb trail={trail} />
|
||||
<PageView page={page} />
|
||||
<PageList route={route} pages={childPages} parentPages={parents} />
|
||||
</div>
|
||||
);
|
||||
}
|
||||
@@ -46,6 +65,7 @@ if (process.env.NODE_ENV !== 'production') {
|
||||
PagePageSync.propTypes = {
|
||||
page: PropTypes.object,
|
||||
parentPages: PropTypes.arrayOf(PropTypes.object),
|
||||
childPages: PropTypes.arrayOf(PropTypes.object),
|
||||
route: PropTypes.instanceOf(Route).isRequired,
|
||||
};
|
||||
}
|
||||
|
@@ -12,6 +12,14 @@ function Breadcrumb(props) {
|
||||
return <h4 className="breadcrumb">{children}</h4>;
|
||||
}
|
||||
|
||||
if (process.env.NODE_ENV !== 'production') {
|
||||
const PropTypes = require('prop-types');
|
||||
|
||||
Breadcrumb.propTypes = {
|
||||
trail: PropTypes.arrayOf(PropTypes.object),
|
||||
};
|
||||
}
|
||||
|
||||
export {
|
||||
Breadcrumb as default,
|
||||
Breadcrumb,
|
||||
|
37
src/widgets/page-list-view.jsx
Normal file
37
src/widgets/page-list-view.jsx
Normal file
@@ -0,0 +1,37 @@
|
||||
import _ from 'lodash';
|
||||
import React, { PureComponent } from 'react';
|
||||
import { Route } from 'routing';
|
||||
|
||||
import HTML from 'widgets/html';
|
||||
|
||||
class PageListView extends PureComponent {
|
||||
static displayName = 'PageListView';
|
||||
|
||||
render() {
|
||||
let { route, parentPages, page } = this.props;
|
||||
let title = _.get(page, 'title.rendered', '');
|
||||
let parentSlugs = _.map(parentPages, 'slug');
|
||||
let slugs = _.concat(parentSlugs, page.slug);
|
||||
let url = route.find(slugs);
|
||||
return (
|
||||
<div className="page-list-view">
|
||||
<a href={url}><HTML text={title} /></a>
|
||||
</div>
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
if (process.env.NODE_ENV !== 'production') {
|
||||
const PropTypes = require('prop-types');
|
||||
|
||||
PageListView.propTypes = {
|
||||
page: PropTypes.object,
|
||||
parentPages: PropTypes.arrayOf(PropTypes.object),
|
||||
route: PropTypes.instanceOf(Route).isRequired,
|
||||
};
|
||||
}
|
||||
|
||||
export {
|
||||
PageListView as default,
|
||||
PageListView,
|
||||
};
|
55
src/widgets/page-list.jsx
Normal file
55
src/widgets/page-list.jsx
Normal file
@@ -0,0 +1,55 @@
|
||||
import _ from 'lodash';
|
||||
import React, { PureComponent } from 'react';
|
||||
import { Route } from 'routing';
|
||||
|
||||
import PageListView from 'widgets/page-list-view';
|
||||
|
||||
class PageList extends PureComponent {
|
||||
static displayName = 'PageList'
|
||||
|
||||
render() {
|
||||
let { route, pages, parentPages } = this.props;
|
||||
if (!pages) {
|
||||
return null;
|
||||
}
|
||||
return (
|
||||
<ul className="pages">
|
||||
{
|
||||
pages.map((page) => {
|
||||
return (
|
||||
<li key={page.id}>
|
||||
<PageListView route={route} page={page} parentPages={parentPages} />
|
||||
</li>
|
||||
);
|
||||
})
|
||||
}
|
||||
</ul>
|
||||
)
|
||||
}
|
||||
|
||||
componentDidMount() {
|
||||
this.componentDidUpdate();
|
||||
}
|
||||
|
||||
componentDidUpdate(prevProps, prevState) {
|
||||
let { pages } = this.props;
|
||||
if (pages) {
|
||||
pages.more();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (process.env.NODE_ENV !== 'production') {
|
||||
const PropTypes = require('prop-types');
|
||||
|
||||
PageList.propTypes = {
|
||||
pages: PropTypes.arrayOf(PropTypes.object),
|
||||
parentPages: PropTypes.arrayOf(PropTypes.object),
|
||||
route: PropTypes.instanceOf(Route).isRequired,
|
||||
};
|
||||
}
|
||||
|
||||
export {
|
||||
PageList as default,
|
||||
PageList,
|
||||
};
|
@@ -1,5 +1,7 @@
|
||||
import _ from 'lodash';
|
||||
import Moment from 'moment';
|
||||
import React, { PureComponent } from 'react';
|
||||
import { Route } from 'routing';
|
||||
|
||||
import HTML from 'widgets/html';
|
||||
|
||||
@@ -7,7 +9,7 @@ class PostListView extends PureComponent {
|
||||
static displayName = 'PostListView';
|
||||
|
||||
render() {
|
||||
let { route, category, post, author, month } = this.props;
|
||||
let { route, category, post, month } = this.props;
|
||||
let title = _.get(post, 'title.rendered', '');
|
||||
let excerpt = _.get(post, 'excerpt.rendered', '');
|
||||
excerpt = cleanExcerpt(excerpt);
|
||||
@@ -38,6 +40,17 @@ function cleanExcerpt(excerpt) {
|
||||
return excerpt;
|
||||
}
|
||||
|
||||
if (process.env.NODE_ENV !== 'production') {
|
||||
const PropTypes = require('prop-types');
|
||||
|
||||
PostListView.propTypes = {
|
||||
category: PropTypes.object,
|
||||
post: PropTypes.object,
|
||||
month: PropTypes.instanceOf(Moment),
|
||||
route: PropTypes.instanceOf(Route).isRequired,
|
||||
};
|
||||
}
|
||||
|
||||
export {
|
||||
PostListView as default,
|
||||
PostListView,
|
||||
|
@@ -16,10 +16,10 @@ class PostList extends PureComponent {
|
||||
return (
|
||||
<div className="posts">
|
||||
{
|
||||
posts.map((post, i) => {
|
||||
posts.map((post) => {
|
||||
let author = _.find(authors, { id: post.author_id });
|
||||
let category = _.find(categories, { id: post.categories[0] });
|
||||
return <PostListView route={route} month={month} category={category} post={post} author={author} key={i} />
|
||||
return <PostListView route={route} month={month} category={category} post={post} author={author} key={post.id} />
|
||||
})
|
||||
}
|
||||
</div>
|
||||
|
Reference in New Issue
Block a user