232 lines
6.2 KiB
JavaScript
232 lines
6.2 KiB
JavaScript
import React from 'react';
|
||
import ReactDOM from 'react-dom';
|
||
import isEmpty from 'lodash/isEmpty';
|
||
import {Icon} from 'antd';
|
||
import { WeaMap } from 'ecCom';
|
||
import { Polyline, Marker, InfoWindow } from 'react-amap';
|
||
import '../style/map.less';
|
||
|
||
let mapInstance;
|
||
const iconCls = {
|
||
'0': 'markerRBg',
|
||
'1': 'markerYBg'
|
||
}
|
||
const colors = ["#0072E3", "#BE77FF", "#FFD306", "#02DF82", "#D94600", "#AE0000", "#5CADAD", "#AE57A4", "#613030 ", "#D9006C"];
|
||
const cLength = colors.length;
|
||
const content = i => `<div class='markerContent ${iconCls[0]}'>${i + 1}</div>`;
|
||
const createDetailTemplete = c => {
|
||
const {crm = [], pics = []} = c;
|
||
let picDom = '',crmDom = '';
|
||
pics.map(pic => picDom += `<div class='mb5-img'><img src=${pic} border="0" width="65" height="64"/></div>`);
|
||
crm.map(d => crmDom += `<div class='crm-text-elli'>${d}</div>`);
|
||
|
||
return `<div class="hrm-map-detail">
|
||
<i class="cursor-pointer icon-coms-Clear" onclick='return closeHrmMapInfoWindow();'></i>
|
||
<div class="mb5">
|
||
<span class="mr10">${c.name}</span>
|
||
<span class="gray mb5">${c.time}</span>
|
||
<span class="signTitle">${c.signTitle}</span>
|
||
</div>
|
||
<div class='info-wrap'>
|
||
${c.information?`<div class="mb5 m-information">${c.information}</div>`:''}
|
||
${c.pics?`<div class="mb5">
|
||
${picDom}
|
||
</div>`:''}
|
||
${crm && crm.length > 0 ?
|
||
`
|
||
<div class='mb5' style="display: flex">
|
||
<i class="icon-coms-currency-Customer" style="margin-right: 10px; color: #999;font-size:14.3px"></i>
|
||
<div style="flex: 1, width: '98%'">
|
||
${crmDom}
|
||
</div>
|
||
</div>
|
||
` : ''}
|
||
<div class="gray" style="display: flex">
|
||
<i class="icon-coms-position" style="margin-right: 10px; color: #999; font-size:13.3px"></i>
|
||
<div class='location'>
|
||
${c.title}
|
||
</div>
|
||
</div>
|
||
</div>
|
||
</div>`
|
||
}
|
||
|
||
class Main extends React.Component {
|
||
constructor(props) {
|
||
super(props);
|
||
this.state = {
|
||
markers: [],
|
||
polylines: [],
|
||
infoWindow: {
|
||
visible: false,
|
||
isCustom: true
|
||
},
|
||
showMap: false
|
||
}
|
||
}
|
||
|
||
componentDidMount() {
|
||
window.closeHrmMapInfoWindow = this.closeInfoWindow;
|
||
this.initMap();
|
||
}
|
||
|
||
componentWillReceiveProps(nextProps){
|
||
this.initMap(nextProps);
|
||
}
|
||
|
||
closeInfoWindow = () => {
|
||
this.setState({
|
||
infoWindow: {
|
||
...this.state.infoWindow,
|
||
visible: false
|
||
}
|
||
})
|
||
}
|
||
|
||
initMap = (nextProps) => {
|
||
this.setState({showMap: false});
|
||
|
||
let _props = nextProps || this.props;
|
||
const {config, mult} = _props;
|
||
|
||
if(isEmpty(config) || (mult && config.length == 0))
|
||
return;
|
||
this.setState({infoWindow: {...this.state.infoWindow, visible: false}});
|
||
this.addMarker(_props);
|
||
}
|
||
|
||
addMarker = (nextProps) => {
|
||
let _props = nextProps || this.props;
|
||
const { config, mult } = _props
|
||
let markers = [];
|
||
let polylines = [];
|
||
if(mult){
|
||
config.map((c, i) => {
|
||
let path = [];
|
||
c.items.reverse().map((item, j) => {
|
||
const markerProps = {
|
||
title: item.title,
|
||
content: content(j),
|
||
position: {
|
||
longitude: item.x,
|
||
latitude: item.y
|
||
},
|
||
events: {
|
||
click: (e) => {
|
||
this.setState({
|
||
infoWindow: {
|
||
...this.state.infoWindow,
|
||
content:createDetailTemplete(item),
|
||
position: {
|
||
longitude: item.x,
|
||
latitude: item.y
|
||
},
|
||
visible: true
|
||
}
|
||
})
|
||
}
|
||
}
|
||
}
|
||
path.push(markerProps.position);
|
||
markers.push(<Marker ecId={`${this && this.props && this.props.ecId || ''}_Marker@jhtbtu@${j}`} {...markerProps} />)
|
||
});
|
||
const polylineProps = {
|
||
path,
|
||
style: {
|
||
strokeColor: colors[i % cLength],
|
||
strokeOpacity: 1,
|
||
strokeWeight: 2,
|
||
strokeStyle: "solid"
|
||
}
|
||
}
|
||
polylines.push(<Polyline ecId={`${this && this.props && this.props.ecId || ''}_Polyline@xitg2a@${i}`} {...polylineProps} />)
|
||
})
|
||
}else{
|
||
const markerProps = {
|
||
title: config.title,
|
||
content: content(0),
|
||
position: {
|
||
longitude: config.x,
|
||
latitude: config.y
|
||
},
|
||
events: {
|
||
click: (e) => {
|
||
this.setState({
|
||
infoWindow: {
|
||
...this.state.infoWindow,
|
||
content:createDetailTemplete(config),
|
||
position: {
|
||
longitude: config.x,
|
||
latitude: config.y
|
||
},
|
||
visible: true
|
||
}
|
||
})
|
||
}
|
||
}
|
||
}
|
||
markers.push(<Marker ecId={`${this && this.props && this.props.ecId || ''}_Marker@osq030@1`} {...markerProps} />)
|
||
}
|
||
this.setState({markers, polylines, showMap: true});
|
||
}
|
||
|
||
setFitView = () => {
|
||
setTimeout(() => {
|
||
mapInstance && mapInstance.setFitView();
|
||
}, 0)
|
||
}
|
||
|
||
setMapInstance = (instanace) => {
|
||
if(instanace.CLASS_NAME === 'AMap.Map'){
|
||
mapInstance = instanace;
|
||
}
|
||
}
|
||
|
||
render() {
|
||
const mapEvt = {
|
||
created: instanace => this.setMapInstance(instanace),
|
||
complete: () => this.setFitView()
|
||
}
|
||
const mapProps = {
|
||
zoom: 14,
|
||
resizeEnable: true,
|
||
plugins: [
|
||
'Scale', {
|
||
name: 'ToolBar',
|
||
options: {
|
||
locate: false
|
||
},
|
||
}
|
||
],
|
||
events: mapEvt
|
||
}
|
||
return (
|
||
<div className='wea-hrm-map' style={{width: '100%', height: '100%'}}>
|
||
{
|
||
this.state.showMap &&
|
||
<WeaMap ecId={`${this && this.props && this.props.ecId || ''}_WeaMap@y92jjs`} {...mapProps}>
|
||
{this.state.markers}
|
||
{this.state.polylines}
|
||
{
|
||
this.state.infoWindow.visible &&
|
||
<InfoWindow ecId={`${this && this.props && this.props.ecId || ''}_InfoWindow@2da6iw`} {...this.state.infoWindow}/>
|
||
}
|
||
</WeaMap>
|
||
}
|
||
</div>
|
||
);
|
||
}
|
||
}
|
||
|
||
Main.propTypes = {
|
||
position: React.PropTypes.any, // 位置,可以是经纬度数组或LngLat实例
|
||
title: React.PropTypes.string, // 提示文字
|
||
zoom: React.PropTypes.number, // 缩放比例
|
||
};
|
||
|
||
Main.defaultProps = {
|
||
zoom: 14,
|
||
};
|
||
|
||
export default Main;
|