UNPKG

cluedin-widget

Version:

This project contains all the pages needed for browsing entities and searching them. The aim is to replace the CluedIn.Webapp project with this one when all the pages ( including the Admin page ) will be ported to REACT.

150 lines (127 loc) 3.88 kB
import React, { Component } from 'react'; import Loading from './loading.jsx'; import { WidgetMenu } from './widgetMenu.jsx'; import MiniLoading from './MiniLoading.jsx'; import Ps from 'perfect-scrollbar'; import RaisedButton from 'material-ui/RaisedButton'; import RefreshIndicator from 'material-ui/RefreshIndicator'; import { FormattedMessage } from 'react-intl'; const style = { header: { position: 'relative', padding: '10px', margin: '-15px -15px 15px -15px', background: '#58666e', borderRadius: '2px 2px 0 0', color: '#fff', }, title: { color: '#fff', fontWeight: 600, fontSize: '14px', }, }; export default class Widget extends Component { render() { let { title, minHeight, loading, loadMoreResult, loadingHeight, menu, miniLoading, noScroll, noMaxHeight } = this.props; let widgetClassName = "cluedIn_widget"; let widgetContentStyle = {}; let loadingHtml; let menuContent; let miniLoadingContent; let loadMoreButton; let loadMoreResultText; if (loading) { minHeight = loadingHeight || '300px'; loadingHtml = (<Loading></Loading>); } var widgetStyle = { minHeight: minHeight ? minHeight : 'auto' }; if (!loading && loadMoreResult) { loadMoreResultText = <FormattedMessage id="Widget.LoadMoreResults"/> loadMoreButton = <div style={{margin: '15px -15px -15px -15px'}}> <RaisedButton style={{width:'100%'}} onClick={this.nextPageHandler.bind(this)} label={loadMoreResultText}></RaisedButton> </div>; } if (menu && !miniLoading) { menuContent = <WidgetMenu menu={menu}></WidgetMenu>; } if (miniLoading) { miniLoadingContent = (<div className="cluedIn_widget_title_loading"><MiniLoading></MiniLoading></div>); loadMoreButton = ( <div style={{position: 'relative',textAlign: 'center'}}> <RefreshIndicator style={{ display: 'inline-block', position: 'relative' }} top={0} left={0} status="loading"></RefreshIndicator></div>); } if (noScroll) { widgetContentStyle.overflow = 'hidden'; } if (noMaxHeight) { widgetContentStyle.maxHeight = 'none'; } if (minHeight) { widgetContentStyle.minHeight = minHeight ? minHeight : 'auto'; } if (title) { return ( <div style={widgetStyle} className={widgetClassName}> {loadingHtml} <div style={style.header} className="cluedIn_widget_title"> <span style={style.title}>{title}</span> {miniLoadingContent} {menuContent} </div> <div ref="widgetContent" style={widgetContentStyle} className=" cluedIn_widget_content"> {this.props.children} {loadMoreButton} </div> </div> ) } else { return (<div ref="widgetContent" style={widgetStyle} className=" cluedIn_widget"> {loadingHtml} {this.props.children} {loadMoreButton} </div>) } } nextPageHandler(event) { const { pagingHandler } = this.props; if (pagingHandler) { pagingHandler(); } } componentDidMount() { let { loading, noScroll } = this.props; if (loading || noScroll) { return; } if (this.refs.widgetContent !== null) { Ps.initialize(this.refs.widgetContent, { scrollYMarginOffset: 20, suppressScrollX: true }); } else { Ps.destroy(this.refs.widgetContent); } } componentWillUnmount() { let { loading, noScroll } = this.props; if (loading || noScroll) { return; } if (this.refs.widgetContent !== null) { Ps.destroy(this.refs.widgetContent); } } } Widget.propTypes = { title: React.PropTypes.string }; Widget.defaultProps = { noScroll: true };