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
JSX
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,
};