UNPKG

react-planner-viewer

Version:

react-planner-viewer is a React Component for view plans builded with react-planner in 2D mode

80 lines (60 loc) 1.96 kB
import React from 'react'; import PropTypes from 'prop-types'; import polylabel from 'polylabel'; import areapolygon from 'area-polygon'; import _ from 'lodash'; const STYLE_TEXT = { textAnchor: 'middle', fontSize: '12px', fontFamily: '"Courier New", Courier, monospace', pointerEvents: 'none', fontWeight: 'bold', zIndex: 100, //http://stackoverflow.com/questions/826782/how-to-disable-text-selection-highlighting-using-css WebkitTouchCallout: 'none', /* iOS Safari */ WebkitUserSelect: 'none', /* Chrome/Safari/Opera */ MozUserSelect: 'none', /* Firefox */ MsUserSelect: 'none', /* Internet Explorer/Edge */ userSelect: 'none' }; export default function Area({ layer, area, catalog, fontSize }) { let rendered = catalog.getElement(area.type).render2D(area, layer); let center; let polygon = area.vertices.toArray().map(vertexID => { let { x, y } = layer.vertices.get(vertexID); return [x, y]; }); let polygonWithHoles = polygon; area.holes.forEach(holeID => { let polygonHole = layer.areas.get(holeID).vertices.toArray().map(vertexID => { let { x, y } = layer.vertices.get(vertexID); return [x, y]; }); polygonWithHoles = polygonWithHoles.concat(polygonHole.reverse()); }); center = polylabel([polygonWithHoles], 1.0); const renderAreaName = ( <text x="0" y="0" transform={`translate(${center[0]} ${center[1]}) scale(1, -1)`} style={{ ...STYLE_TEXT, fontSize: fontSize + 'px' }}> {area.getIn(['properties', 'name'])} </text> ); return ( <g data-element-root data-prototype={area.prototype} data-id={area.id} data-selected={area.selected} data-layer={layer.id} data-name={area.properties.get('name')} > {rendered} {renderAreaName} ); </g> ) } Area.propTypes = { area: PropTypes.object.isRequired, layer: PropTypes.object.isRequired, catalog: PropTypes.object.isRequired, };