Merged in feature/page_actions (pull request #198)

Feature/page actions
This commit is contained in:
Philipp Czora
2019-02-21 10:31:32 +00:00
8 changed files with 147 additions and 14 deletions

View File

@@ -4,6 +4,8 @@ import Loading from "./../Loading";
import ErrorNotification from "./../ErrorNotification";
import Title from "./Title";
import Subtitle from "./Subtitle";
import injectSheet from "react-jss";
import classNames from "classnames";
type Props = {
title?: string,
@@ -11,17 +13,26 @@ type Props = {
loading?: boolean,
error?: Error,
showContentOnError?: boolean,
children: React.Node
children: React.Node,
// context props
classes: Object
};
const styles = {
spacing: {
marginTop: "1.25rem",
textAlign: "right"
}
};
class Page extends React.Component<Props> {
render() {
const { title, error, subtitle } = this.props;
const { error } = this.props;
return (
<section className="section">
<div className="container">
<Title title={title} />
<Subtitle subtitle={subtitle} />
{this.renderPageHeader()}
<ErrorNotification error={error} />
{this.renderContent()}
</div>
@@ -29,16 +40,55 @@ class Page extends React.Component<Props> {
);
}
renderPageHeader() {
const { title, subtitle, children, classes } = this.props;
let content = null;
let pageActionsExists = false;
React.Children.forEach(children, child => {
if (child && child.type.name === "PageActions") {
content = child;
pageActionsExists = true;
}
});
let underline = pageActionsExists ? (
<hr className="header-with-actions" />
) : null;
return (
<>
<div className="columns">
<div className="column">
<Title title={title} />
<Subtitle subtitle={subtitle} />
</div>
<div className="column is-two-fifths">
<div className={classNames(classes.spacing, "is-mobile-create-button-spacing")}>{content}</div>
</div>
</div>
{underline}
</>
);
}
renderContent() {
const { loading, children, showContentOnError, error } = this.props;
if (error && !showContentOnError) {
return null;
}
if (loading) {
return <Loading />;
}
return children;
let content = [];
React.Children.forEach(children, child => {
if (child && child.type.name !== "PageActions") {
content.push(child);
}
});
return content;
}
}
export default Page;
export default injectSheet(styles)(Page);

View File

@@ -0,0 +1,28 @@
//@flow
import * as React from "react";
import Loading from "./../Loading";
type Props = {
loading?: boolean,
error?: Error,
children: React.Node
};
class PageActions extends React.Component<Props> {
render() {
return <>{this.renderContent()}</>;
}
renderContent() {
const { loading, children, error } = this.props;
if (error) {
return null;
}
if (loading) {
return <Loading />;
}
return children;
}
}
export default PageActions;

View File

@@ -9,7 +9,7 @@ class Subtitle extends React.Component<Props> {
render() {
const { subtitle } = this.props;
if (subtitle) {
return <h1 className="subtitle">{subtitle}</h1>;
return <h2 className="subtitle">{subtitle}</h2>;
}
return null;
}

View File

@@ -3,6 +3,7 @@
export { default as Footer } from "./Footer.js";
export { default as Header } from "./Header.js";
export { default as Page } from "./Page.js";
export { default as PageActions } from "./PageActions.js";
export { default as Subtitle } from "./Subtitle.js";
export { default as Title } from "./Title.js";