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.
175 lines
4.5 KiB
175 lines
4.5 KiB
/*
|
|
** Zabbix
|
|
** Copyright (C) 2001-2023 Zabbix SIA
|
|
**
|
|
** This program is free software; you can redistribute it and/or modify
|
|
** it under the terms of the GNU General Public License as published by
|
|
** the Free Software Foundation; either version 2 of the License, or
|
|
** (at your option) any later version.
|
|
**
|
|
** This program is distributed in the hope that it will be useful,
|
|
** but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
** GNU General Public License for more details.
|
|
**
|
|
** You should have received a copy of the GNU General Public License
|
|
** along with this program; if not, write to the Free Software
|
|
** Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
|
**/
|
|
|
|
|
|
/**
|
|
* Extend Leaflet Map with functions necessary for Zabbix "Geomap" widget.
|
|
*
|
|
* @type {L.Map}
|
|
*/
|
|
L.Map.include({
|
|
|
|
_center: null,
|
|
|
|
navigateHomeControl: null,
|
|
severityFilterControl: null,
|
|
|
|
setDefaultView: function(latLng, zoom) {
|
|
this._center = {
|
|
latLng: latLng,
|
|
zoom: zoom
|
|
};
|
|
},
|
|
|
|
updateFilter: function(filter_data) {
|
|
this.getContainer().dispatchEvent(new CustomEvent('filter', {detail: filter_data}));
|
|
},
|
|
|
|
elmntCounter: (function() {
|
|
let counter = 0;
|
|
return function() {
|
|
return ++counter;
|
|
}
|
|
})()
|
|
});
|
|
|
|
/**
|
|
* Leaflet extension to provide severity filter in "Geomap" widget.
|
|
*
|
|
* @type {L.Control}
|
|
*/
|
|
L.Control.severityFilterFilterControl = L.Control.extend({
|
|
|
|
_severity_levels: null,
|
|
_filter_checked: [],
|
|
|
|
initialize: function({checked, severity_levels, disabled}) {
|
|
this._filter_checked = checked;
|
|
this._severity_levels = severity_levels;
|
|
this._disabled = disabled;
|
|
},
|
|
|
|
onAdd: function(map) {
|
|
const div = L.DomUtil.create('div', 'leaflet-bar leaflet-control');
|
|
const btn = L.DomUtil.create('a', 'geomap-filter-button ' + ZBX_ICON_FILTER, div);
|
|
this.bar = L.DomUtil.create('ul', 'checkbox-list geomap-filter', div);
|
|
|
|
btn.ariaLabel = t('Severity filter');
|
|
btn.title = t('Severity filter');
|
|
btn.role = 'button';
|
|
btn.href = '#';
|
|
|
|
if (!this._disabled) {
|
|
for (const [severity, prop] of this._severity_levels) {
|
|
const li = L.DomUtil.create('li', '', this.bar);
|
|
const chbox = L.DomUtil.create('input', '', li);
|
|
const label = L.DomUtil.create('label', '', li);
|
|
const span = L.DomUtil.create('span', '');
|
|
const chBoxId = 'filter_severity_' + map.elmntCounter();
|
|
|
|
label.append(span, document.createTextNode(prop.name));
|
|
chbox.checked = this._filter_checked.includes(severity.toString(10));
|
|
chbox.classList.add('checkbox-radio');
|
|
chbox.type = 'checkbox';
|
|
chbox.value = severity;
|
|
chbox.id = chBoxId;
|
|
label.htmlFor = chBoxId;
|
|
}
|
|
|
|
L.DomEvent.on(btn, 'click', () => {this.bar.classList.toggle('collapsed')});
|
|
L.DomEvent.on(this.bar, 'dblclick', (e) => {L.DomEvent.stopPropagation(e)});
|
|
L.DomEvent.on(div, 'change', () => {
|
|
map.updateFilter([...this.bar.querySelectorAll('input[type="checkbox"]:checked')].map(n => n.value));
|
|
});
|
|
}
|
|
else {
|
|
div.classList.add('disabled');
|
|
}
|
|
|
|
L.DomEvent.on(btn, 'dblclick', (e) => {L.DomEvent.stopPropagation(e)});
|
|
|
|
return div;
|
|
},
|
|
|
|
close: function() {
|
|
this.bar.classList.remove('collapsed');
|
|
}
|
|
});
|
|
|
|
/**
|
|
* Factory function for L.Control.severityFilterFilterControl.
|
|
*
|
|
* @param {object} opts Filter options.
|
|
*
|
|
* @return {L.control.severityFilter}
|
|
*/
|
|
L.control.severityFilter = function(opts) {
|
|
return new L.Control.severityFilterFilterControl(opts);
|
|
};
|
|
|
|
|
|
/**
|
|
* Leaflet extension to provide "Navigate home" button in "Geomap" widget.
|
|
*
|
|
* @type L.Control
|
|
*/
|
|
L.Control.navigateHomeControl = L.Control.extend({
|
|
|
|
_div: null,
|
|
|
|
onAdd: function(map) {
|
|
this._div = L.DomUtil.create('div', 'leaflet-bar leaflet-control');
|
|
this._btn = L.DomUtil.create('a', 'navigate-home-button ' + ZBX_ICON_HOME, this._div);
|
|
|
|
this._btn.role = 'button';
|
|
this._btn.href = '#';
|
|
|
|
L.DomEvent.on(this._btn, 'click', () => {map.setView(map._center.latLng, map._center.zoom)});
|
|
L.DomEvent.on(this._btn, 'dblclick', (e) => {L.DomEvent.stopPropagation(e)});
|
|
|
|
this._div.style.visibility = 'hidden';
|
|
|
|
return this._div;
|
|
},
|
|
|
|
setTitle: function(title) {
|
|
this._btn.ariaLabel = title;
|
|
this._btn.title = title;
|
|
},
|
|
|
|
show: function() {
|
|
this._div.style.visibility = 'visible';
|
|
},
|
|
|
|
hide: function() {
|
|
this._div.style.visibility = 'hidden';
|
|
}
|
|
});
|
|
|
|
/**
|
|
* Factory function for L.Control.navigateHomeControl.
|
|
*
|
|
* @param {object} opts
|
|
*
|
|
* @return {L.control.navigateHomeControl}
|
|
*/
|
|
L.control.navigateHomeBtn = function(opts) {
|
|
return new L.Control.navigateHomeControl(opts);
|
|
};
|