UNPKG

react-floorplanner

Version:

react-floorplanner is a React Component for plans design. Draw a 2D floorplan and navigate it in 3D mode.

169 lines (148 loc) 4.05 kB
import React, {Component} from 'react'; import PropTypes from 'prop-types'; import IconAdd from 'react-icons/lib/fa/plus-circle'; import {Seq} from 'immutable'; import * as SharedStyle from '../../shared-style'; const STYLE_BOX = { width: '14em', height: '14em', padding: '0.625em', background: '#f7f7f9', border: '1px solid #e1e1e8', cursor: 'pointer', position: 'relative', boxShadow: '0 1px 6px 0 rgba(0, 0, 0, 0.11), 0 1px 4px 0 rgba(0, 0, 0, 0.11)', borderRadius: '2px', transition: 'all .15s ease-in-out', WebkitTransition: 'all .15s ease-in-out', alignSelf: 'center', justifySelf: 'center', }; const STYLE_BOX_HOVER = { ...STYLE_BOX, background: SharedStyle.SECONDARY_COLOR.main }; const STYLE_TITLE = { width:'100%', textAlign:'center', display:'block', marginBottom:'.5em', textTransform: 'capitalize' }; const STYLE_TITLE_HOVER = { ...STYLE_TITLE, color:SharedStyle.COLORS.white }; const STYLE_IMAGE_CONTAINER = { width: '100%', height: '8em', position:'relative', overflow:'hidden', border: 'solid 1px #e6e6e6', padding:0, margin:0, marginBottom: '5px' }; const STYLE_IMAGE = { position:'absolute', background: '#222', width: '100%', height: '100%', backgroundSize: 'contain', backgroundPosition:'50% 50%', backgroundColor:SharedStyle.COLORS.white, backgroundRepeat:'no-repeat', transition: 'all .2s ease-in-out' }; const STYLE_IMAGE_HOVER = { ...STYLE_IMAGE, transform: 'scale(1.2)' }; const STYLE_PLUS_HOVER = { marginTop:'1.5em', color: SharedStyle.SECONDARY_COLOR.main, fontSize: '2em', opacity: '0.7', width: '100%' }; const STYLE_DESCRIPTION = { display: 'block', display: '-webkit-box', height: '2em', margin: '0 auto', fontSize: '0.75em', fontStyle:'italic', lineHeight: '1em', WebkitLineClamp: '2', WebkitBoxOrient: 'vertical', overflow: 'hidden', textOverflow: 'ellipsis', }; const STYLE_TAGS = { listStyle: 'none', margin: '0px', padding: '0px', fontSize: '11px', marginBottom: '3px' }; const STYLE_TAG = { display: 'inline-block', background: '#337ab7', color: SharedStyle.COLORS.white, padding: '1px 4px', marginRight: '3px', borderRadius: '3px' }; export default class CatalogItem extends Component { constructor(props) { super(props); this.state = {hover: false}; } select() { let element = this.props.element; switch (element.prototype) { case 'lines': this.context.linesActions.selectToolDrawingLine(element.name); break; case 'items': this.context.itemsActions.selectToolDrawingItem(element.name); break; case 'holes': this.context.holesActions.selectToolDrawingHole(element.name); break; } this.context.projectActions.pushLastSelectedCatalogElementToHistory(element); } render() { let element = this.props.element; let hover = this.state.hover; return ( <div style={hover ? STYLE_BOX_HOVER : STYLE_BOX} onClick={e => this.select()} onMouseEnter={e => this.setState({hover: true})} onMouseLeave={e => this.setState({hover: false})} > <b style={ !hover ? STYLE_TITLE : STYLE_TITLE_HOVER }>{element.info.title}</b> <div style={ STYLE_IMAGE_CONTAINER }> <div style={{...( !hover ? STYLE_IMAGE: STYLE_IMAGE_HOVER ), backgroundImage: 'url(' + element.info.image + ')'}}> { hover ? <IconAdd style={STYLE_PLUS_HOVER} /> : null } </div> </div> <ul style={STYLE_TAGS}> {element.info.tag.map((tag, index) => <li style={STYLE_TAG} key={index}>{tag}</li>)} </ul> <div style={STYLE_DESCRIPTION}>{element.info.description}</div> </div> ); } } CatalogItem.propTypes = { element: PropTypes.object.isRequired, }; CatalogItem.contextTypes = { itemsActions: PropTypes.object.isRequired, linesActions: PropTypes.object.isRequired, holesActions: PropTypes.object.isRequired, projectActions: PropTypes.object.isRequired };