import React from "react"; import PropTypes from "prop-types"; import Backdrop from "@appserver/components/backdrop"; import { size } from "@appserver/components/utils/device"; import { Provider } from "@appserver/components/utils/context"; import { isMobile } from "react-device-detect"; import Article from "./sub-components/article"; import SubArticleHeader from "./sub-components/article-header"; import SubArticleMainButton from "./sub-components/article-main-button"; import SubArticleBody from "./sub-components/article-body"; import ArticlePinPanel from "./sub-components/article-pin-panel"; import Section from "./sub-components/section"; import SubSectionHeader from "./sub-components/section-header"; import SubSectionFilter from "./sub-components/section-filter"; import SubSectionBody from "./sub-components/section-body"; import SubSectionBodyContent from "./sub-components/section-body-content"; import SubSectionPaging from "./sub-components/section-paging"; import SectionToggler from "./sub-components/section-toggler"; import ReactResizeDetector from "react-resize-detector"; import FloatingButton from "../FloatingButton"; import { inject, observer } from "mobx-react"; import Selecto from "react-selecto"; import styled from "styled-components"; const StyledSelectoWrapper = styled.div` .selecto-selection { z-index: 200; } `; function ArticleHeader() { return null; } ArticleHeader.displayName = "ArticleHeader"; function ArticleMainButton() { return null; } ArticleMainButton.displayName = "ArticleMainButton"; function ArticleBody() { return null; } ArticleBody.displayName = "ArticleBody"; function SectionHeader() { return null; } SectionHeader.displayName = "SectionHeader"; function SectionFilter() { return null; } SectionFilter.displayName = "SectionFilter"; function SectionBody() { return null; } SectionBody.displayName = "SectionBody"; function SectionPaging() { return null; } SectionPaging.displayName = "SectionPaging"; class PageLayout extends React.Component { static ArticleHeader = ArticleHeader; static ArticleMainButton = ArticleMainButton; static ArticleBody = ArticleBody; static SectionHeader = SectionHeader; static SectionFilter = SectionFilter; static SectionBody = SectionBody; static SectionPaging = SectionPaging; constructor(props) { super(props); const isArticleVisibleAndPinned = !!this.props.isArticlePinned; this.state = { isBackdropVisible: false, isArticleVisible: isArticleVisibleAndPinned, isArticlePinned: isArticleVisibleAndPinned, }; this.timeoutHandler = null; this.intervalHandler = null; this.scroll = null; } componentDidUpdate(prevProps) { if (!this.scroll) { this.scroll = document.getElementsByClassName("section-scroll")[0]; } if ( (this.props.hideAside && !this.state.isArticlePinned && this.props.hideAside !== prevProps.hideAside) || (this.props.isLoading !== prevProps.isLoading && this.props.isLoaded && this.state.isArticleVisible && !this.state.isArticlePinned) ) { this.backdropClick(); } } componentDidMount() { window.addEventListener("orientationchange", this.orientationChangeHandler); this.orientationChangeHandler(); } componentWillUnmount() { window.removeEventListener( "orientationchange", this.orientationChangeHandler ); if (this.intervalHandler) clearInterval(this.intervalHandler); if (this.timeoutHandler) clearTimeout(this.timeoutHandler); } orientationChangeHandler = () => { const isValueExist = !!this.props.isArticlePinned; const isEnoughWidth = screen.availWidth > size.smallTablet; if (!isEnoughWidth && isValueExist) { this.backdropClick(); } if (isEnoughWidth && isValueExist) { this.pinArticle(); } }; backdropClick = () => { this.setState({ isBackdropVisible: false, isArticleVisible: false, isArticlePinned: false, }); isMobile && this.props.setArticleVisibleOnUnpin(false); }; pinArticle = () => { this.setState({ isBackdropVisible: false, isArticlePinned: true, isArticleVisible: true, }); this.props.setArticlePinned(true); isMobile && this.props.setArticleVisibleOnUnpin(false); }; unpinArticle = () => { this.setState({ isBackdropVisible: true, isArticlePinned: false, isArticleVisible: true, }); this.props.setArticlePinned(false); isMobile && this.props.setArticleVisibleOnUnpin(true); }; showArticle = () => { this.setState({ isBackdropVisible: true, isArticleVisible: true, isArticlePinned: false, }); isMobile && this.props.setArticleVisibleOnUnpin(true); }; onSelect = (e) => { if (this.props.dragging) return; const items = e.selected; this.props.setSelections(items); }; dragCondition = (e) => { const path = e.inputEvent.composedPath(); const isBackdrop = path.some( (x) => x.classList && x.classList.contains("backdrop-active") ); const notSelectablePath = path.some( (x) => x.classList && x.classList.contains("not-selectable") ); if (notSelectablePath || isBackdrop) { return false; } else return true; }; onScroll = (e) => { this.scroll.scrollBy(e.direction[0] * 10, e.direction[1] * 10); }; render() { const { onDrop, showPrimaryProgressBar, primaryProgressBarIcon, primaryProgressBarValue, showPrimaryButtonAlert, showSecondaryProgressBar, secondaryProgressBarValue, secondaryProgressBarIcon, showSecondaryButtonAlert, uploadFiles, viewAs, //withBodyAutoFocus, withBodyScroll, children, isLoaded, isHeaderVisible, //headerBorderBottom, onOpenUploadPanel, isTabletView, firstLoad, isLoading, dragging, } = this.props; let articleHeaderContent = null; let articleMainButtonContent = null; let articleBodyContent = null; let sectionHeaderContent = null; let sectionFilterContent = null; let sectionPagingContent = null; let sectionBodyContent = null; React.Children.forEach(children, (child) => { const childType = child && child.type && (child.type.displayName || child.type.name); switch (childType) { case ArticleHeader.displayName: articleHeaderContent = child; break; case ArticleMainButton.displayName: articleMainButtonContent = child; break; case ArticleBody.displayName: articleBodyContent = child; break; case SectionHeader.displayName: sectionHeaderContent = child; break; case SectionFilter.displayName: sectionFilterContent = child; break; case SectionPaging.displayName: sectionPagingContent = child; break; case SectionBody.displayName: sectionBodyContent = child; break; default: break; } }); const isArticleHeaderAvailable = !!articleHeaderContent, isArticleMainButtonAvailable = !!articleMainButtonContent, isArticleBodyAvailable = !!articleBodyContent, isArticleAvailable = isArticleHeaderAvailable || isArticleMainButtonAvailable || isArticleBodyAvailable, isSectionHeaderAvailable = !!sectionHeaderContent, isSectionFilterAvailable = !!sectionFilterContent, isSectionPagingAvailable = !!sectionPagingContent, isSectionBodyAvailable = !!sectionBodyContent || isSectionFilterAvailable || isSectionPagingAvailable, isSectionAvailable = isSectionHeaderAvailable || isSectionFilterAvailable || isSectionBodyAvailable || isSectionPagingAvailable || isArticleAvailable, isBackdropAvailable = isArticleAvailable; const renderPageLayout = () => { return ( <> {isBackdropAvailable && ( )} {isArticleAvailable && (
{isArticleHeaderAvailable && ( {articleHeaderContent ? articleHeaderContent.props.children : null} )} {isArticleMainButtonAvailable && ( {articleMainButtonContent ? articleMainButtonContent.props.children : null} )} {isArticleBodyAvailable && ( {articleBodyContent ? articleBodyContent.props.children : null} )} {isArticleBodyAvailable && ( )}
)} {isSectionAvailable && ( {({ width, height }) => (
{isSectionHeaderAvailable && ( {sectionHeaderContent ? sectionHeaderContent.props.children : null} )} {isSectionFilterAvailable && ( {sectionFilterContent ? sectionFilterContent.props.children : null} )} {isSectionBodyAvailable && ( <> {isSectionFilterAvailable && ( {sectionFilterContent ? sectionFilterContent.props.children : null} )} {sectionBodyContent ? sectionBodyContent.props.children : null} {isSectionPagingAvailable && ( {sectionPagingContent ? sectionPagingContent.props.children : null} )} )} {showPrimaryProgressBar && showSecondaryProgressBar ? ( <> ) : showPrimaryProgressBar && !showSecondaryProgressBar ? ( ) : !showPrimaryProgressBar && showSecondaryProgressBar ? ( ) : ( <> )} {isArticleAvailable && ( )}
)}
)} ); }; const scrollOptions = this.scroll ? { container: this.scroll, throttleTime: 0, threshold: 100, } : {}; return ( <> {renderPageLayout()} {!isMobile && uploadFiles && !dragging && ( )} ); } } PageLayout.propTypes = { children: PropTypes.any, withBodyScroll: PropTypes.bool, withBodyAutoFocus: PropTypes.bool, showPrimaryProgressBar: PropTypes.bool, primaryProgressBarValue: PropTypes.number, showPrimaryButtonAlert: PropTypes.bool, progressBarDropDownContent: PropTypes.any, primaryProgressBarIcon: PropTypes.string, showSecondaryProgressBar: PropTypes.bool, secondaryProgressBarValue: PropTypes.number, secondaryProgressBarIcon: PropTypes.string, showSecondaryButtonAlert: PropTypes.bool, onDrop: PropTypes.func, setSelections: PropTypes.func, uploadFiles: PropTypes.bool, hideAside: PropTypes.bool, isLoaded: PropTypes.bool, viewAs: PropTypes.string, uploadPanelVisible: PropTypes.bool, onOpenUploadPanel: PropTypes.func, isTabletView: PropTypes.bool, isHeaderVisible: PropTypes.bool, firstLoad: PropTypes.bool, isLoading: PropTypes.bool, }; PageLayout.defaultProps = { withBodyScroll: true, withBodyAutoFocus: false, }; PageLayout.ArticleHeader = ArticleHeader; PageLayout.ArticleMainButton = ArticleMainButton; PageLayout.ArticleBody = ArticleBody; PageLayout.SectionHeader = SectionHeader; PageLayout.SectionFilter = SectionFilter; PageLayout.SectionBody = SectionBody; PageLayout.SectionPaging = SectionPaging; export default inject(({ auth }) => { const { isLoaded, settingsStore } = auth; const { isHeaderVisible, isTabletView, isArticlePinned, setArticlePinned, setArticleVisibleOnUnpin, } = settingsStore; return { isLoaded, isTabletView, isHeaderVisible, isArticlePinned, setArticlePinned, setArticleVisibleOnUnpin, }; })(observer(PageLayout));