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.
401 lines
9.7 KiB
401 lines
9.7 KiB
1 year ago
|
/*
|
||
|
** 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.
|
||
|
**/
|
||
|
|
||
|
|
||
|
var globalAllObjForViewSwitcher = {};
|
||
|
var CViewSwitcher = function(objId, objAction, confData, disableDDItems) {
|
||
|
this.mainObj = document.getElementById(objId);
|
||
|
this.objAction = objAction;
|
||
|
|
||
|
if (is_null(this.mainObj)) {
|
||
|
throw('ViewSwitcher error: main object not found!');
|
||
|
}
|
||
|
this.depObjects = {};
|
||
|
|
||
|
if (disableDDItems) {
|
||
|
this.disableDDItems = disableDDItems;
|
||
|
}
|
||
|
|
||
|
for (var key in confData) {
|
||
|
if (empty(confData[key])) {
|
||
|
continue;
|
||
|
}
|
||
|
this.depObjects[key] = {};
|
||
|
|
||
|
for (var vKey in confData[key]) {
|
||
|
if (empty(confData[key][vKey])) {
|
||
|
continue;
|
||
|
}
|
||
|
|
||
|
if (is_string(confData[key][vKey])) {
|
||
|
this.depObjects[key][vKey] = {'id': confData[key][vKey]};
|
||
|
}
|
||
|
else if (is_object(confData[key][vKey])) {
|
||
|
this.depObjects[key][vKey] = confData[key][vKey];
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
jQuery(this.mainObj).on(objAction, this.rebuildView.bindAsEventListener(this));
|
||
|
globalAllObjForViewSwitcher[objId] = this;
|
||
|
|
||
|
this.hideAllObjs();
|
||
|
this.rebuildView();
|
||
|
};
|
||
|
|
||
|
CViewSwitcher.prototype = {
|
||
|
mainObj: null,
|
||
|
depObjects: {},
|
||
|
lastValue: null,
|
||
|
|
||
|
rebuildView: function(e) {
|
||
|
var myValue = this.objValue(this.mainObj);
|
||
|
|
||
|
// Enable previously disabled dropdown items.
|
||
|
if (this.disableDDItems && this.disableDDItems[this.lastValue]) {
|
||
|
for (var DDi in this.disableDDItems[this.lastValue]) {
|
||
|
if (jQuery('#' + DDi).length == 0) {
|
||
|
continue;
|
||
|
}
|
||
|
|
||
|
jQuery('#' + DDi).get(0).getOptions().map((opt) => opt.disabled = false);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
// Disable dropdown items.
|
||
|
if (this.disableDDItems && this.disableDDItems[myValue]) {
|
||
|
for (var DDi in this.disableDDItems[myValue]) {
|
||
|
var DD = jQuery('#' + DDi);
|
||
|
|
||
|
if (DD.length == 0) {
|
||
|
continue;
|
||
|
}
|
||
|
|
||
|
for (var Oi in this.disableDDItems[myValue][DDi]) {
|
||
|
if (DD.get(0).getOptionByValue(this.disableDDItems[myValue][DDi][Oi]) === null) {
|
||
|
continue;
|
||
|
}
|
||
|
|
||
|
DD.get(0).getOptionByValue(this.disableDDItems[myValue][DDi][Oi]).disabled = true;
|
||
|
}
|
||
|
|
||
|
// If selected option unavailable set to first available.
|
||
|
if (DD.get(0).getOptionByValue(DD.val()).disabled) {
|
||
|
for (let opt of DD.get(0).getOptions()) {
|
||
|
if (!opt.disabled) {
|
||
|
DD.val(opt.value);
|
||
|
break;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
DD.trigger(this.objAction);
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
if (isset(this.lastValue, this.depObjects)) {
|
||
|
for (var key in this.depObjects[this.lastValue]) {
|
||
|
if (empty(this.depObjects[this.lastValue][key])) {
|
||
|
continue;
|
||
|
}
|
||
|
this.hideObj(this.depObjects[this.lastValue][key]);
|
||
|
|
||
|
if (isset(this.depObjects[this.lastValue][key].id, globalAllObjForViewSwitcher)) {
|
||
|
for (var i in globalAllObjForViewSwitcher[this.depObjects[this.lastValue][key].id].depObjects) {
|
||
|
for (var j in globalAllObjForViewSwitcher[this.depObjects[this.lastValue][key].id].depObjects[i]) {
|
||
|
this.hideObj(globalAllObjForViewSwitcher[this.depObjects[this.lastValue][key].id].depObjects[i][j]);
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
if (isset(myValue, this.depObjects) && !this.mainObj.disabled) {
|
||
|
for (var key in this.depObjects[myValue]) {
|
||
|
if (empty(this.depObjects[myValue][key])) {
|
||
|
continue;
|
||
|
}
|
||
|
this.showObj(this.depObjects[myValue][key]);
|
||
|
|
||
|
if (isset(this.depObjects[myValue][key].id, globalAllObjForViewSwitcher)) {
|
||
|
globalAllObjForViewSwitcher[this.depObjects[myValue][key].id].rebuildView();
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
this.lastValue = myValue;
|
||
|
},
|
||
|
|
||
|
objValue: function(obj) {
|
||
|
if (is_null(obj)) {
|
||
|
return null;
|
||
|
}
|
||
|
|
||
|
switch (obj.tagName.toLowerCase()) {
|
||
|
case 'select':
|
||
|
return (obj.selectedIndex > -1) ? obj.options[obj.selectedIndex].value : null;
|
||
|
|
||
|
case 'input':
|
||
|
if (obj.getAttribute('type').toLowerCase() === 'checkbox') {
|
||
|
return obj.checked ? obj.value : null;
|
||
|
}
|
||
|
return obj.value;
|
||
|
|
||
|
default:
|
||
|
return obj.value;
|
||
|
}
|
||
|
},
|
||
|
|
||
|
setObjValue : function (obj, value) {
|
||
|
if (is_null(obj) || !isset('tagName', obj)) {
|
||
|
return null;
|
||
|
}
|
||
|
|
||
|
switch (obj.tagName.toLowerCase()) {
|
||
|
case 'select':
|
||
|
for (var idx in obj.options) {
|
||
|
if (obj.options[idx].value == value) {
|
||
|
obj.selectedIndex = idx;
|
||
|
break;
|
||
|
}
|
||
|
}
|
||
|
break;
|
||
|
|
||
|
case 'input':
|
||
|
const input_type = obj.getAttribute('type');
|
||
|
if (!is_null(input_type) && input_type.toLowerCase() === 'checkbox') {
|
||
|
obj.checked = true;
|
||
|
}
|
||
|
obj.value = value;
|
||
|
break;
|
||
|
|
||
|
case 'textarea':
|
||
|
default:
|
||
|
obj.value = value;
|
||
|
break;
|
||
|
}
|
||
|
},
|
||
|
|
||
|
objDisplay: function(obj) {
|
||
|
if (is_null(obj) || !isset('tagName', obj)) {
|
||
|
return null;
|
||
|
}
|
||
|
switch (obj.tagName.toLowerCase()) {
|
||
|
case 'th':
|
||
|
case 'td':
|
||
|
obj.style.display = 'table-cell';
|
||
|
break;
|
||
|
case 'tr':
|
||
|
obj.style.display = 'table-row';
|
||
|
break;
|
||
|
case 'img':
|
||
|
case 'div':
|
||
|
case 'li':
|
||
|
obj.style.display = '';
|
||
|
break;
|
||
|
case 'z-select':
|
||
|
obj.style.display = 'inline-grid';
|
||
|
break
|
||
|
default:
|
||
|
obj.style.display = 'inline';
|
||
|
}
|
||
|
},
|
||
|
|
||
|
disableObj: function(obj, disable) {
|
||
|
if (is_null(obj) || !isset('tagName', obj)) {
|
||
|
return null;
|
||
|
}
|
||
|
obj.disabled = disable;
|
||
|
if (obj == this.mainObj) {
|
||
|
this.rebuildView();
|
||
|
}
|
||
|
},
|
||
|
|
||
|
hideObj: function(data) {
|
||
|
var element = document.getElementById(data.id);
|
||
|
if (element === null) {
|
||
|
return true;
|
||
|
}
|
||
|
this.disableObj(element, true);
|
||
|
element.style.display = 'none';
|
||
|
},
|
||
|
|
||
|
showObj: function(data) {
|
||
|
var element = document.getElementById(data.id);
|
||
|
if (element === null) {
|
||
|
return true;
|
||
|
}
|
||
|
this.disableObj(element, false);
|
||
|
|
||
|
if (!is_null(data)) {
|
||
|
var objValue = this.objValue(element);
|
||
|
var defaultValue = false;
|
||
|
|
||
|
for (var i in this.depObjects) {
|
||
|
for (var j in this.depObjects[i]) {
|
||
|
if (this.depObjects[i][j]['id'] == data.id
|
||
|
&& isset('defaultValue', this.depObjects[i][j])
|
||
|
&& this.depObjects[i][j]['defaultValue'] != ''
|
||
|
&& this.depObjects[i][j]['defaultValue'] == objValue) {
|
||
|
defaultValue = true;
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
if ((objValue == '' || defaultValue) && isset('defaultValue', data)) {
|
||
|
this.setObjValue(element, data.defaultValue);
|
||
|
}
|
||
|
}
|
||
|
this.objDisplay(element);
|
||
|
},
|
||
|
|
||
|
hideAllObjs: function() {
|
||
|
var hidden = {};
|
||
|
for (var i in this.depObjects) {
|
||
|
if (empty(this.depObjects[i])) {
|
||
|
continue;
|
||
|
}
|
||
|
for (var a in this.depObjects[i]) {
|
||
|
if (empty(this.depObjects[i][a])) {
|
||
|
continue;
|
||
|
}
|
||
|
if (isset(this.depObjects[i][a].id, hidden)) {
|
||
|
continue;
|
||
|
}
|
||
|
|
||
|
hidden[this.depObjects[i][a].id] = true;
|
||
|
|
||
|
var elm = document.getElementById(this.depObjects[i][a].id);
|
||
|
if (elm === null) {
|
||
|
continue;
|
||
|
}
|
||
|
this.hideObj(this.depObjects[i][a]);
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
};
|
||
|
|
||
|
function ActionProcessor(actions) {
|
||
|
this.actions = actions || {};
|
||
|
this.bindEvents();
|
||
|
}
|
||
|
|
||
|
ActionProcessor.prototype = {
|
||
|
bindEvents: function() {
|
||
|
var elementId, elementsList = {};
|
||
|
|
||
|
for (var i = 0; i < this.actions.length; i++) {
|
||
|
var action = this.actions[i];
|
||
|
for (var j = 0; j < action.cond.length; j++) {
|
||
|
for (elementId in action.cond[j]) {
|
||
|
elementsList[elementId] = true;
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
var handler = jQuery.proxy(this.process, this);
|
||
|
|
||
|
for (elementId in elementsList) {
|
||
|
var elem = jQuery('#' + elementId);
|
||
|
switch (elem.get(0).nodeName.toLowerCase()) {
|
||
|
case 'z-select':
|
||
|
case 'select':
|
||
|
elem.change(handler);
|
||
|
break;
|
||
|
case 'input':
|
||
|
switch (elem.attr('type')) {
|
||
|
case 'checkbox':
|
||
|
case 'text':
|
||
|
elem.change(handler);
|
||
|
break;
|
||
|
case 'radio':
|
||
|
var elemName = elem.attr('name');
|
||
|
jQuery('input[name=' + elemName + ']').click(handler);
|
||
|
break;
|
||
|
default:
|
||
|
elem.click(handler);
|
||
|
}
|
||
|
break;
|
||
|
}
|
||
|
}
|
||
|
},
|
||
|
|
||
|
getValue: function(elementId) {
|
||
|
var elem = jQuery('#' + elementId);
|
||
|
var type = elem.attr('type');
|
||
|
if (type == 'radio' || type == 'checkbox') {
|
||
|
return elem.prop('checked') === true ? 'checked' : 'unchecked';
|
||
|
}
|
||
|
else {
|
||
|
return elem.val();
|
||
|
}
|
||
|
},
|
||
|
|
||
|
checkConditions: function(conditions) {
|
||
|
var elementId, i, ln, failed;
|
||
|
|
||
|
for (i = 0, ln = conditions.length; i < ln; i++) {
|
||
|
failed = false;
|
||
|
|
||
|
for (elementId in conditions[i]) {
|
||
|
if (this.getValue(elementId) !== conditions[i][elementId]) {
|
||
|
failed = true;
|
||
|
break;
|
||
|
}
|
||
|
}
|
||
|
if (!failed) {
|
||
|
return true;
|
||
|
}
|
||
|
}
|
||
|
return false;
|
||
|
},
|
||
|
|
||
|
process: function() {
|
||
|
var action;
|
||
|
this.hidden = jQuery();
|
||
|
|
||
|
for (var i = 0; i < this.actions.length; i++) {
|
||
|
action = this.actions[i];
|
||
|
switch (action.action) {
|
||
|
case 'show':
|
||
|
this.actionToggle(action.value, this.checkConditions(action.cond));
|
||
|
break;
|
||
|
case 'hide':
|
||
|
this.actionToggle(action.value, !this.checkConditions(action.cond));
|
||
|
break;
|
||
|
case 'enable':
|
||
|
jQuery(action.value)
|
||
|
.prop('disabled', !this.checkConditions(action.cond))
|
||
|
.closest('.color-picker')
|
||
|
.toggleClass('disabled', !this.checkConditions(action.cond));
|
||
|
break;
|
||
|
case 'disable':
|
||
|
jQuery(action.value)
|
||
|
.prop('disabled', this.checkConditions(action.cond))
|
||
|
.closest('.color-picker')
|
||
|
.toggleClass('disabled', this.checkConditions(action.cond));
|
||
|
break;
|
||
|
}
|
||
|
}
|
||
|
},
|
||
|
|
||
|
actionToggle: function(value, toggle) {
|
||
|
jQuery(value).toggle(toggle);
|
||
|
this.hidden = toggle ? this.hidden.not(jQuery(':input', value)) : this.hidden.add(jQuery(':input', value));
|
||
|
}
|
||
|
};
|