You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
183 lines
6.0 KiB
183 lines
6.0 KiB
{% extends 'base_no_lmenu.html' %}{% load i18n %}
|
|
{% block main %}
|
|
<script src="https://api-maps.yandex.ru/2.1/?lang=ru_RU" type="text/javascript"></script>
|
|
|
|
<script type="text/javascript">
|
|
ymaps.ready(init);
|
|
var myMap;
|
|
|
|
function placemark_click(e){
|
|
var plcmrk = e.get('target');
|
|
plcmrk.properties.set('balloonContent', "{% trans 'Loading..' %}");
|
|
var html = $.ajax({
|
|
url: "{% url 'mapapp:dot_tooltip' %}",
|
|
data: {'d': plcmrk.properties._data.dot_id},
|
|
async: false
|
|
}).responseText;
|
|
plcmrk.properties.set('balloonContent', html);
|
|
}
|
|
|
|
function open_in_new_window(e){
|
|
var data = e.get('target').properties._data;
|
|
var win = window.open("{% url 'mapapp:to_single_dev' %}?dot_id=" + data.dot_id, '_blank');
|
|
if (win)
|
|
win.focus();
|
|
else
|
|
showErr("{% trans 'Please allow popups for this website' %}");
|
|
}
|
|
|
|
function load_dots(r){
|
|
for(let e of r){
|
|
var iconname = 'dev.png';;
|
|
var click_callback = placemark_click;
|
|
if(e.devcount > 1){
|
|
iconname='relay_rack.png';
|
|
}else if(e.devcount == 1){
|
|
var dev = e.device;
|
|
console.log(dev.status);
|
|
if(dev.status == 'unr' || dev.status == 'dwn')
|
|
iconname='dev_bug.png';
|
|
else if(dev.status == 'up')
|
|
iconname='dev_ok.png';
|
|
click_callback = open_in_new_window;
|
|
}else{
|
|
iconname='flag_black.png';
|
|
}
|
|
dot_place([e.latitude, e.longitude], {
|
|
hintContent: e.title,
|
|
dot_id: e.pk
|
|
}, click_callback, iconname);
|
|
}
|
|
}
|
|
|
|
function dot_place(pos, opts, click_callback, icon_name='dev_ok.png'){
|
|
var dot = new ymaps.Placemark(pos, opts, {
|
|
iconLayout: 'default#image',
|
|
iconImageHref: '/static/img/gmarkers/'+icon_name,
|
|
iconImageSize: [32, 48],
|
|
iconImageOffset: [-16, -48]
|
|
});
|
|
dot.events.add('click', click_callback);
|
|
myMap.geoObjects.add(dot);
|
|
}
|
|
|
|
function on_success_add_dot(r){
|
|
hide_ModalMyContent();
|
|
var d = $.parseJSON(r);
|
|
|
|
if(d.error){
|
|
alert(d.error);
|
|
return false;
|
|
}
|
|
|
|
dot_place([d.latitude, d.longitude], {
|
|
hintContent: d.title,
|
|
dot_id: d.pk
|
|
}, placemark_click);
|
|
}
|
|
|
|
function add_dot(e){
|
|
var coords = e.get('coords');
|
|
$.get('{% url 'mapapp:modal_add_dot' %}', {'coords': coords.join(',')}, function(r){
|
|
show_ModalMyContent(r);
|
|
$('.form-ajax').ajform({'on_response': on_success_add_dot});
|
|
});
|
|
e.preventDefault();
|
|
}
|
|
|
|
function init(){
|
|
|
|
var win = $(window);
|
|
|
|
myMap = new ymaps.Map("yamap", {
|
|
center: [45.449160, 34.735454],
|
|
zoom: 12,
|
|
controls: ['zoomControl', 'geolocationControl']
|
|
});
|
|
myMap.controls.add('typeSelector', {position: {left: 45, top: 10}});
|
|
|
|
$.getJSON("{% url 'mapapp:get_dots' %}", load_dots);
|
|
|
|
myMap.events.add('dblclick', add_dot);
|
|
|
|
$('.mapbtns').on('click', function(){
|
|
$.getJSON($(this).attr('data-href'), function(dot_ids){
|
|
var it = myMap.geoObjects.getIterator(), obj;
|
|
var points = [];
|
|
while(obj = it.getNext()){
|
|
if(obj.geometry == undefined) break;
|
|
if(obj.geometry.getType() == "Point"){
|
|
var dot_id = obj.properties.get('dot_id');
|
|
var is_dot_contains = dot_ids.includes(dot_id);
|
|
obj.options.set('visible', is_dot_contains);
|
|
if(is_dot_contains)
|
|
points.push(obj);
|
|
}
|
|
}
|
|
var bnds = ymaps.geoQuery(points).getBounds();
|
|
if(bnds){
|
|
if(points.length > 1)
|
|
myMap.setBounds(bnds, {duration: 400, checkZoomRange: true, useMapMargin: true, zoomMargin: 30});
|
|
else
|
|
myMap.panTo([points[0].geometry.getCoordinates()]);
|
|
}
|
|
});
|
|
$('.mapbtns').removeClass('active');
|
|
$(this).addClass('active');
|
|
});
|
|
|
|
}
|
|
function showAll(){
|
|
var it = myMap.geoObjects.getIterator(), obj;
|
|
while(obj = it.getNext()){
|
|
if(obj.geometry == undefined) break;
|
|
if(obj.geometry.getType() == "Point"){
|
|
obj.options.set('visible', true);
|
|
}
|
|
}
|
|
myMap.setBounds(myMap.geoObjects.getBounds(), {duration: 400});
|
|
$('.mapbtns').removeClass('active');
|
|
}
|
|
</script>
|
|
|
|
|
|
<div id="yamap" class="col-sm-12"></div>
|
|
<style>
|
|
#yamap{
|
|
margin-left: -15px;
|
|
margin-top: -9px;
|
|
padding: 0;
|
|
position: fixed;
|
|
height: 95vh;
|
|
width: 100%;
|
|
}
|
|
#yapanel{
|
|
position: absolute;
|
|
right: 12px;
|
|
top: 5px;
|
|
}
|
|
.list-group-item{
|
|
padding: 3px 15px;
|
|
}
|
|
</style>
|
|
|
|
<div class="panel panel-default hidden-sm hidden-xs" id="yapanel">
|
|
<div class="panel-heading">
|
|
<h4 class="modal-title">
|
|
{% trans 'Layers' %}
|
|
<a href="https://github.com/nerosketch/djing/blob/master/docs/map.md" title="{% trans 'Help' %}" target="_blank" data-toggle="tooltip">?</a>
|
|
</h4>
|
|
</div>
|
|
<div class="list-group">
|
|
{% for grp in groups %}
|
|
<button type="button" data-href="{% url 'mapapp:resolve_dots_by_group' grp.pk %}" class="list-group-item mapbtns">{{ grp.title }}</button>
|
|
{% endfor %}
|
|
</div>
|
|
<div class="panel-footer">
|
|
<a href="#" onclick="showAll();" class="btn btn-default">
|
|
<span class="glyphicon glyphicon-eye-open"></span> {% trans 'Show all' %}
|
|
</a>
|
|
</div>
|
|
</div>
|
|
|
|
{% endblock %}
|