UNPKG

terriajs

Version:

Geospatial data visualization platform.

98 lines (85 loc) 4.06 kB
'use strict'; import ObserverModelMixin from '../ObserveModelMixin'; import React from 'react'; import createReactClass from 'create-react-class'; import PropTypes from 'prop-types'; import parseCustomHtmlToReact from '../Custom/parseCustomHtmlToReact'; import Styles from './help-screen-window.scss'; import classNames from 'classnames'; import defined from 'terriajs-cesium/Source/Core/defined'; import HelpViewState from '../../ReactViewModels/HelpViewState'; const HelpScreenWindow = createReactClass({ displayName: 'HelpScreenWindow', mixins: [ObserverModelMixin], propTypes: { helpViewState: PropTypes.object }, render() { const currentScreen = this.props.helpViewState.currentScreen; if (!defined(currentScreen) || !defined(currentScreen.rectangle)) { return false; } const windowClass = classNames(Styles.window, { [Styles.isActive]: currentScreen }); const buttonText = currentScreen && currentScreen.totalNumberOfScreens === currentScreen.currentScreenNumber ? 'DONE' : 'NEXT'; const positionLeft = calculateLeftPosition(currentScreen); const positionTop = calculateTopPosition(currentScreen); const caretTop = currentScreen && currentScreen.caretTop; const caretLeft = currentScreen && currentScreen.caretLeft; const width = currentScreen && currentScreen.width; return ( <div style={{left: positionLeft + 'px', top: positionTop + 'px', width: width + 'px'}} className={windowClass} aria-hidden={ !currentScreen }> <span style={{left: caretLeft + 'px', top: caretTop + 'px'}} className={Styles.caret}/> <div className={Styles.content}> {parseCustomHtmlToReact(currentScreen && currentScreen.message())} </div> <div className={Styles.screenCount}> <strong>{currentScreen && currentScreen.currentScreenNumber + '/' + currentScreen.totalNumberOfScreens}</strong> </div> <div className={Styles.nextButton}> <button type='button' onClick={currentScreen && currentScreen.onNext} className={Styles.btn}><strong>{buttonText}</strong></button> </div> </div>); }, }); /** * Work out the screen pixel value for left positioning based on helpScreen parameters. * @private */ function calculateLeftPosition(helpScreen) { const screenRect = helpScreen.rectangle; let leftPosition = 0; if (helpScreen.positionLeft === HelpViewState.RelativePosition.RECT_LEFT) { leftPosition = screenRect.left; } else if (helpScreen.positionLeft === HelpViewState.RelativePosition.RECT_RIGHT) { leftPosition = screenRect.right; } else if (helpScreen.positionLeft === HelpViewState.RelativePosition.RECT_TOP) { leftPosition = screenRect.top; } else if (helpScreen.positionLeft === HelpViewState.RelativePosition.RECT_BOTTOM) { leftPosition = screenRect.bottom; } leftPosition += helpScreen.offsetLeft; return leftPosition; } /** * Work out the screen pixel value for top positioning based on helpScreen parameters. * @private */ function calculateTopPosition(helpScreen) { const screenRect = helpScreen.rectangle; let topPosition = 0; if (helpScreen.positionTop === HelpViewState.RelativePosition.RECT_LEFT) { topPosition = screenRect.left; } else if (helpScreen.positionTop === HelpViewState.RelativePosition.RECT_RIGHT) { topPosition = screenRect.right; } else if (helpScreen.positionTop === HelpViewState.RelativePosition.RECT_TOP) { topPosition = screenRect.top; } else if (helpScreen.positionTop === HelpViewState.RelativePosition.RECT_BOTTOM) { topPosition = screenRect.bottom; } topPosition += helpScreen.offsetTop; return topPosition; } module.exports = HelpScreenWindow;