2019-07-11 11:43:07 +00:00
import React from 'react'
import PropTypes from 'prop-types'
2019-07-11 13:21:39 +00:00
import Backdrop from '../backdrop'
2019-07-11 11:43:07 +00:00
2019-07-20 09:48:29 +00:00
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-07-11 11:43:07 +00:00
2019-08-02 09:43:16 +00:00
class PageLayout extends React . PureComponent {
2019-07-11 11:43:07 +00:00
constructor ( props ) {
super ( props ) ;
2019-07-15 10:35:10 +00:00
this . state = this . mapPropsToState ( props ) ;
2019-09-10 07:03:36 +00:00
}
2019-07-15 10:35:10 +00:00
componentDidUpdate ( prevProps , prevState ) {
if ( this . hasChanges ( this . props , prevProps ) ) {
this . setState ( this . mapPropsToState ( this . props ) ) ;
}
}
hasChanges = ( currentProps , prevProps ) => {
2019-07-15 11:37:06 +00:00
return currentProps . articleHeaderContent != prevProps . articleHeaderContent ||
2019-07-19 14:38:29 +00:00
currentProps . articleMainButtonContent != prevProps . articleMainButtonContent ||
2019-07-15 10:35:10 +00:00
currentProps . articleBodyContent != prevProps . articleBodyContent ||
currentProps . sectionHeaderContent != prevProps . sectionHeaderContent ||
2019-07-19 14:38:29 +00:00
currentProps . sectionFilterContent != prevProps . sectionFilterContent ||
currentProps . sectionBodyContent != prevProps . sectionBodyContent ||
currentProps . sectionPagingContent != prevProps . sectionPagingContent ;
2019-07-15 10:35:10 +00:00
}
2019-07-11 11:43:07 +00:00
2019-07-15 10:35:10 +00:00
mapPropsToState = ( props ) => {
2019-07-19 14:38:29 +00:00
let isArticleHeaderAvailable = ! ! props . articleHeaderContent ,
isArticleMainButtonAvailable = ! ! props . articleMainButtonContent ,
2019-07-12 10:31:18 +00:00
isArticleBodyAvailable = ! ! props . articleBodyContent ,
2019-07-19 14:38:29 +00:00
isArticleAvailable = isArticleHeaderAvailable || isArticleMainButtonAvailable || isArticleBodyAvailable ,
2019-07-12 10:31:18 +00:00
isSectionHeaderAvailable = ! ! props . sectionHeaderContent ,
2019-07-19 14:38:29 +00:00
isSectionFilterAvailable = ! ! props . sectionFilterContent ,
2019-07-12 10:31:18 +00:00
isSectionBodyAvailable = ! ! props . sectionBodyContent ,
2019-07-19 14:38:29 +00:00
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
2019-07-15 10:35:10 +00:00
let newState = {
2019-07-12 10:31:18 +00:00
isBackdropAvailable : isBackdropAvailable ,
isArticleAvailable : isArticleAvailable ,
isArticleHeaderAvailable : isArticleHeaderAvailable ,
2019-07-19 14:38:29 +00:00
isArticleMainButtonAvailable : isArticleMainButtonAvailable ,
2019-07-12 10:31:18 +00:00
isArticleBodyAvailable : isArticleBodyAvailable ,
isSectionAvailable : isSectionAvailable ,
isSectionHeaderAvailable : isSectionHeaderAvailable ,
2019-07-19 14:38:29 +00:00
isSectionFilterAvailable : isSectionFilterAvailable ,
2019-07-12 10:31:18 +00:00
isSectionBodyAvailable : isSectionBodyAvailable ,
2019-07-19 14:38:29 +00:00
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 ,
2019-07-19 14:38:29 +00:00
articleMainButtonContent : props . articleMainButtonContent ,
2019-07-12 08:25:32 +00:00
articleBodyContent : props . articleBodyContent ,
sectionHeaderContent : props . sectionHeaderContent ,
2019-07-19 14:38:29 +00:00
sectionFilterContent : props . sectionFilterContent ,
sectionBodyContent : props . sectionBodyContent ,
sectionPagingContent : props . sectionPagingContent ,
2019-07-11 11:43:07 +00:00
} ;
2019-07-15 10:35:10 +00:00
return newState ;
2019-07-11 11:43:07 +00:00
}
backdropClick = ( ) => {
this . setState ( {
2019-07-11 13:21:39 +00:00
isBackdropVisible : false ,
2019-07-11 14:40:55 +00:00
isArticleVisible : false ,
2019-07-11 11:43:07 +00:00
isArticlePinned : false
} ) ;
} ;
pinArticle = ( ) => {
this . setState ( {
2019-07-11 13:21:39 +00:00
isBackdropVisible : false ,
2019-07-11 11:43:07 +00:00
isArticlePinned : true ,
2019-07-11 14:40:55 +00:00
isArticleVisible : true
2019-07-11 11:43:07 +00:00
} ) ;
} ;
unpinArticle = ( ) => {
this . setState ( {
2019-07-11 13:21:39 +00:00
isBackdropVisible : true ,
2019-07-11 11:43:07 +00:00
isArticlePinned : false ,
2019-07-11 14:40:55 +00:00
isArticleVisible : true
2019-07-11 11:43:07 +00:00
} ) ;
} ;
showArticle = ( ) => {
this . setState ( {
2019-07-11 13:21:39 +00:00
isBackdropVisible : true ,
2019-07-11 14:40:55 +00:00
isArticleVisible : true ,
2019-07-11 11:43:07 +00:00
isArticlePinned : false
} ) ;
} ;
render ( ) {
return (
< >
2019-07-12 10:31:18 +00:00
{
this . state . isBackdropAvailable &&
2019-09-05 13:46:46 +00:00
< Backdrop zIndex = { 400 } visible = { this . state . isBackdropVisible } onClick = { this . backdropClick } / >
2019-07-12 10:31:18 +00:00
}
{
this . state . isArticleAvailable &&
2019-07-20 09:48:29 +00:00
< Article visible = { this . state . isArticleVisible } pinned = { this . state . isArticlePinned } >
2019-07-12 10:31:18 +00:00
{
this . state . isArticleHeaderAvailable &&
2019-07-20 09:48:29 +00:00
< ArticleHeader visible = { this . state . isArticlePinned } > { this . state . articleHeaderContent } < / A r t i c l e H e a d e r >
2019-07-12 10:31:18 +00:00
}
2019-07-19 14:38:29 +00:00
{
this . state . isArticleMainButtonAvailable &&
2019-07-20 09:48:29 +00:00
< ArticleMainButton > { this . state . articleMainButtonContent } < / A r t i c l e M a i n B u t t o n >
2019-07-19 14:38:29 +00:00
}
2019-07-12 10:31:18 +00:00
{
this . state . isArticleBodyAvailable &&
2019-07-20 09:48:29 +00:00
< ArticleBody > { this . state . articleBodyContent } < / A r t i c l e B o d y >
2019-07-12 10:31:18 +00:00
}
{
this . state . isArticleBodyAvailable &&
2019-07-20 09:48:29 +00:00
< 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
}
2019-07-20 09:48:29 +00:00
< / A r t i c l e >
2019-07-12 10:31:18 +00:00
}
{
this . state . isSectionAvailable &&
2019-07-20 09:48:29 +00:00
< Section >
2019-07-12 10:31:18 +00:00
{
this . state . isSectionHeaderAvailable &&
2019-07-20 09:48:29 +00:00
< SectionHeader > { this . state . sectionHeaderContent } < / S e c t i o n H e a d e r >
2019-07-12 10:31:18 +00:00
}
2019-07-19 14:38:29 +00:00
{
this . state . isSectionFilterAvailable &&
2019-07-20 09:48:29 +00:00
< SectionFilter > { this . state . sectionFilterContent } < / S e c t i o n F i l t e r >
2019-07-19 14:38:29 +00:00
}
2019-07-12 10:31:18 +00:00
{
this . state . isSectionBodyAvailable &&
2019-08-07 10:57:54 +00:00
< SectionBody withScroll = { this . props . withBodyScroll } > { this . state . sectionBodyContent } < / S e c t i o n B o d y >
2019-07-12 10:31:18 +00:00
}
2019-07-19 14:38:29 +00:00
{
this . state . isSectionPagingAvailable &&
2019-07-20 09:48:29 +00:00
< SectionPaging > { this . state . sectionPagingContent } < / S e c t i o n P a g i n g >
2019-07-19 14:38:29 +00:00
}
2019-07-11 11:43:07 +00:00
{
2019-07-12 10:31:18 +00:00
this . state . isArticleAvailable &&
2019-07-20 09:48:29 +00:00
< SectionToggler visible = { ! this . state . isArticlePinned } onClick = { this . showArticle } / >
2019-07-11 11:43:07 +00:00
}
2019-07-20 09:48:29 +00:00
< / S e c t i o n >
2019-07-12 10:31:18 +00:00
}
2019-07-11 11:43:07 +00:00
< / >
)
}
}
PageLayout . propTypes = {
2019-07-11 13:21:39 +00:00
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 ] ) ,
2019-07-19 14:38:29 +00:00
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 ] ) ,
2019-07-19 14:38:29 +00:00
sectionFilterContent : PropTypes . oneOfType ( [ PropTypes . arrayOf ( PropTypes . node ) , PropTypes . node ] ) ,
sectionBodyContent : PropTypes . oneOfType ( [ PropTypes . arrayOf ( PropTypes . node ) , PropTypes . node ] ) ,
2019-08-07 10:57:54 +00:00
sectionPagingContent : PropTypes . oneOfType ( [ PropTypes . arrayOf ( PropTypes . node ) , PropTypes . node ] ) ,
withBodyScroll : PropTypes . bool
2019-07-11 11:43:07 +00:00
}
PageLayout . defaultProps = {
2019-07-11 13:21:39 +00:00
isBackdropVisible : false ,
2019-07-11 14:40:55 +00:00
isArticleVisible : false ,
2019-08-07 10:57:54 +00:00
isArticlePinned : false ,
withBodyScroll : true
2019-07-11 11:43:07 +00:00
}
export default PageLayout