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

/*
** 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);
};