DocSpace-buildtools/web/ASC.Web.Components/src/components/page-layout/index.js

192 lines
7.2 KiB
JavaScript
Raw Normal View History

import React from 'react'
import PropTypes from 'prop-types'
import Backdrop from '../backdrop'
import Article from './sub-comoponents/article'
import ArticleHeader from './sub-comoponents/article-header'
import ArticleMainButton from './sub-comoponents/article-main-button'
import ArticleBody from './sub-comoponents/article-body'
import ArticlePinPanel from './sub-comoponents/article-pin-panel'
import Section from './sub-comoponents/section'
import SectionHeader from './sub-comoponents/section-header'
import SectionFilter from './sub-comoponents/section-filter'
import SectionBody from './sub-comoponents/section-body'
import SectionPaging from './sub-comoponents/section-paging'
import SectionToggler from './sub-comoponents/section-toggler'
2019-08-02 09:43:16 +00:00
class PageLayout extends React.PureComponent {
constructor(props) {
super(props);
this.state = this.mapPropsToState(props);
}
componentDidUpdate(prevProps, prevState) {
if (this.hasChanges(this.props,prevProps)) {
this.setState(this.mapPropsToState(this.props));
}
}
hasChanges = (currentProps, prevProps) => {
return currentProps.articleHeaderContent != prevProps.articleHeaderContent ||
currentProps.articleMainButtonContent != prevProps.articleMainButtonContent ||
currentProps.articleBodyContent != prevProps.articleBodyContent ||
currentProps.sectionHeaderContent != prevProps.sectionHeaderContent ||
currentProps.sectionFilterContent != prevProps.sectionFilterContent ||
currentProps.sectionBodyContent != prevProps.sectionBodyContent ||
currentProps.sectionPagingContent != prevProps.sectionPagingContent;
}
mapPropsToState = (props) => {
let isArticleHeaderAvailable = !!props.articleHeaderContent,
isArticleMainButtonAvailable = !!props.articleMainButtonContent,
2019-07-12 10:31:18 +00:00
isArticleBodyAvailable = !!props.articleBodyContent,
isArticleAvailable = isArticleHeaderAvailable || isArticleMainButtonAvailable || isArticleBodyAvailable,
2019-07-12 10:31:18 +00:00
isSectionHeaderAvailable = !!props.sectionHeaderContent,
isSectionFilterAvailable = !!props.sectionFilterContent,
2019-07-12 10:31:18 +00:00
isSectionBodyAvailable = !!props.sectionBodyContent,
isSectionPagingAvailable = !!props.sectionPagingContent,
isSectionAvailable = isSectionHeaderAvailable || isSectionFilterAvailable || isSectionBodyAvailable || isSectionPagingAvailable || isArticleAvailable,
2019-07-12 10:35:13 +00:00
isBackdropAvailable = isArticleAvailable;
2019-07-12 10:31:18 +00:00
let newState = {
2019-07-12 10:31:18 +00:00
isBackdropAvailable: isBackdropAvailable,
isArticleAvailable: isArticleAvailable,
isArticleHeaderAvailable: isArticleHeaderAvailable,
isArticleMainButtonAvailable: isArticleMainButtonAvailable,
2019-07-12 10:31:18 +00:00
isArticleBodyAvailable: isArticleBodyAvailable,
isSectionAvailable: isSectionAvailable,
isSectionHeaderAvailable: isSectionHeaderAvailable,
isSectionFilterAvailable: isSectionFilterAvailable,
2019-07-12 10:31:18 +00:00
isSectionBodyAvailable: isSectionBodyAvailable,
isSectionPagingAvailable: isSectionPagingAvailable,
2019-07-12 10:31:18 +00:00
2019-07-11 14:40:55 +00:00
isBackdropVisible: props.isBackdropVisible,
isArticleVisible: props.isArticleVisible,
2019-07-12 08:25:32 +00:00
isArticlePinned: props.isArticlePinned,
articleHeaderContent: props.articleHeaderContent,
articleMainButtonContent: props.articleMainButtonContent,
2019-07-12 08:25:32 +00:00
articleBodyContent: props.articleBodyContent,
sectionHeaderContent: props.sectionHeaderContent,
sectionFilterContent: props.sectionFilterContent,
sectionBodyContent: props.sectionBodyContent,
sectionPagingContent: props.sectionPagingContent,
};
return newState;
}
backdropClick = () => {
this.setState({
isBackdropVisible: false,
2019-07-11 14:40:55 +00:00
isArticleVisible: false,
isArticlePinned: false
});
};
pinArticle = () => {
this.setState({
isBackdropVisible: false,
isArticlePinned: true,
2019-07-11 14:40:55 +00:00
isArticleVisible: true
});
};
unpinArticle = () => {
this.setState({
isBackdropVisible: true,
isArticlePinned: false,
2019-07-11 14:40:55 +00:00
isArticleVisible: true
});
};
showArticle = () => {
this.setState({
isBackdropVisible: true,
2019-07-11 14:40:55 +00:00
isArticleVisible: true,
isArticlePinned: false
});
};
render() {
return (
<>
2019-07-12 10:31:18 +00:00
{
this.state.isBackdropAvailable &&
<Backdrop zIndex={400} visible={this.state.isBackdropVisible} onClick={this.backdropClick}/>
2019-07-12 10:31:18 +00:00
}
{
this.state.isArticleAvailable &&
<Article visible={this.state.isArticleVisible} pinned={this.state.isArticlePinned}>
2019-07-12 10:31:18 +00:00
{
this.state.isArticleHeaderAvailable &&
<ArticleHeader visible={this.state.isArticlePinned}>{this.state.articleHeaderContent}</ArticleHeader>
2019-07-12 10:31:18 +00:00
}
{
this.state.isArticleMainButtonAvailable &&
<ArticleMainButton>{this.state.articleMainButtonContent}</ArticleMainButton>
}
2019-07-12 10:31:18 +00:00
{
this.state.isArticleBodyAvailable &&
<ArticleBody>{this.state.articleBodyContent}</ArticleBody>
2019-07-12 10:31:18 +00:00
}
{
this.state.isArticleBodyAvailable &&
<ArticlePinPanel pinned={this.state.isArticlePinned} pinText="Pin this panel" onPin={this.pinArticle} unpinText="Unpin this panel" onUnpin={this.unpinArticle}/>
2019-07-12 10:31:18 +00:00
}
</Article>
2019-07-12 10:31:18 +00:00
}
{
this.state.isSectionAvailable &&
<Section>
2019-07-12 10:31:18 +00:00
{
this.state.isSectionHeaderAvailable &&
<SectionHeader>{this.state.sectionHeaderContent}</SectionHeader>
2019-07-12 10:31:18 +00:00
}
{
this.state.isSectionFilterAvailable &&
<SectionFilter>{this.state.sectionFilterContent}</SectionFilter>
}
2019-07-12 10:31:18 +00:00
{
this.state.isSectionBodyAvailable &&
<SectionBody withScroll={this.props.withBodyScroll}>{this.state.sectionBodyContent}</SectionBody>
2019-07-12 10:31:18 +00:00
}
{
this.state.isSectionPagingAvailable &&
<SectionPaging>{this.state.sectionPagingContent}</SectionPaging>
}
{
2019-07-12 10:31:18 +00:00
this.state.isArticleAvailable &&
<SectionToggler visible={!this.state.isArticlePinned} onClick={this.showArticle}/>
}
</Section>
2019-07-12 10:31:18 +00:00
}
</>
)
}
}
PageLayout.propTypes = {
isBackdropVisible: PropTypes.bool,
2019-07-11 14:40:55 +00:00
isArticleVisible: PropTypes.bool,
2019-07-12 08:25:32 +00:00
isArticlePinned: PropTypes.bool,
articleHeaderContent: PropTypes.oneOfType([PropTypes.arrayOf(PropTypes.node), PropTypes.node]),
articleMainButtonContent: PropTypes.oneOfType([PropTypes.arrayOf(PropTypes.node), PropTypes.node]),
2019-07-12 08:25:32 +00:00
articleBodyContent: PropTypes.oneOfType([PropTypes.arrayOf(PropTypes.node), PropTypes.node]),
sectionHeaderContent: PropTypes.oneOfType([PropTypes.arrayOf(PropTypes.node), PropTypes.node]),
sectionFilterContent: PropTypes.oneOfType([PropTypes.arrayOf(PropTypes.node), PropTypes.node]),
sectionBodyContent: PropTypes.oneOfType([PropTypes.arrayOf(PropTypes.node), PropTypes.node]),
sectionPagingContent: PropTypes.oneOfType([PropTypes.arrayOf(PropTypes.node), PropTypes.node]),
withBodyScroll: PropTypes.bool
}
PageLayout.defaultProps = {
isBackdropVisible: false,
2019-07-11 14:40:55 +00:00
isArticleVisible: false,
isArticlePinned: false,
withBodyScroll: true
}
export default PageLayout