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.
zabbix/ui/app/views/js/popup.operation.edit.js.php

655 lines
20 KiB

<?php declare(strict_types = 0);
/*
** 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.
**/
?>
window.operation_popup = new class {
init({eventsource, recovery_phase, data, actionid}) {
this.recovery_phase = recovery_phase;
this.eventsource = eventsource;
this.overlay = overlays_stack.getById('operations');
this.dialogue = this.overlay.$dialogue[0];
this.form = this.overlay.$dialogue.$body[0].querySelector('form');
this.actionid = actionid;
this.row_index = data.row_index;
this.data = data;
if (document.getElementById('operation-condition-list')) {
this.condition_count = (document.getElementById('operation-condition-list').rows.length - 2);
}
this._loadViews();
this._processTypeOfCalculation();
if (this.data.opconditions.length > 0) {
this.data.opconditions.map((row, index) => {
this._createOperationConditionsRow(row, index);
})
}
}
_loadViews() {
this._customMessageFields();
this.#loadHostTags(this.data.optag);
this._removeAllFields();
const operation_type = document.getElementById('operation-type-select').getAttribute('value');
this._changeView(operation_type);
document.querySelector('#operation-type-select').onchange = () => {
const operation_type = document.getElementById('operation-type-select').value;
this._removeAllFields();
this._changeView(operation_type);
this._processTypeOfCalculation();
}
this.dialogue.addEventListener('click', (e) => {
if (e.target.classList.contains('operation-condition-list-footer')) {
this._openConditionsPopup(e.target);
}
else if (e.target.classList.contains('js-remove')) {
e.target.closest('tr').remove();
this._processTypeOfCalculation();
}
else if (e.target.classList.contains('element-table-add')) {
const tags_table = this.form.querySelector('#tags-table');
const form_rows = tags_table.querySelectorAll('.form_row')
let row_index = 0;
if (form_rows.length !== 0) {
const last_row = form_rows[form_rows.length - 1];
row_index = parseInt(last_row.getAttribute('data-id')) + 1;
}
this.#addHostTags([{tag: '', value:'', row_index: row_index}]);
}
else if (e.target.classList.contains('element-table-remove')) {
e.target.closest('tr').remove();
}
});
}
/**
* Adds empty row if no host tags are initially present and adds a row index for each host tag.
*
* @param {array} optags Operation host tags.
*/
#loadHostTags(optags) {
if (optags.length === 0) {
optags.push({tag: '', value:'', row_index: 0});
}
else {
optags.map((optag, index) => {
optag.row_index = index;
});
}
this.#addHostTags(optags);
}
/**
* Adds rows for "Add host tags" and "Remove host tags" options based on row template.
*
* @param {array} optags Operation host tags.
*/
#addHostTags(optags) {
const tags_table = this.form.querySelector('#tags-table');
const template = new Template(this.form.querySelector('#operation-host-tags-row-tmpl').innerHTML);
optags.forEach((optag) => {
tags_table.rows[tags_table.rows.length - 1].insertAdjacentHTML('beforebegin', template.evaluate(optag));
$(`#operation_optag_${optag.row_index}_tag, #operation_optag_${optag.row_index}_value`).textareaFlexible();
});
}
_changeView(operation_type) {
let type = parseInt(operation_type.replace(/\D/g, ''));
if ((/\b(scriptid)\b/g).test(operation_type)) {
type = <?= OPERATION_TYPE_COMMAND ?>;
}
switch (type) {
case <?= OPERATION_TYPE_MESSAGE ?>:
this._sendMessageFields();
break;
case <?= OPERATION_TYPE_GROUP_ADD ?>:
case <?= OPERATION_TYPE_GROUP_REMOVE ?>:
this._hostGroupFields();
break;
case <?= OPERATION_TYPE_TEMPLATE_ADD ?>:
case <?= OPERATION_TYPE_TEMPLATE_REMOVE ?>:
this._templateFields();
break;
case <?= OPERATION_TYPE_HOST_INVENTORY ?>:
this._hostInventoryFields();
break;
case <?= OPERATION_TYPE_RECOVERY_MESSAGE ?>:
this._allInvolvedRecoveryFields();
break;
case <?= OPERATION_TYPE_UPDATE_MESSAGE ?>:
this._allInvolvedFieldsUpdate();
break;
case <?= OPERATION_TYPE_HOST_ADD ?>:
case <?= OPERATION_TYPE_HOST_REMOVE ?>:
case <?= OPERATION_TYPE_HOST_ENABLE ?>:
case <?= OPERATION_TYPE_HOST_DISABLE ?>:
break;
case <?= OPERATION_TYPE_HOST_TAGS_ADD ?>:
case <?= OPERATION_TYPE_HOST_TAGS_REMOVE ?>:
this.#hostTagsFields();
break;
case <?= OPERATION_TYPE_UPDATE_MESSAGE ?>:
this._allInvolvedFieldsUpdate();
break;
case <?= OPERATION_TYPE_COMMAND ?>:
this._addScriptFields();
break;
default:
this._sendMessageFields();
break;
}
}
_allInvolvedRecoveryFields() {
const fields = [
'operation-message-custom', 'operation-opmessage-subject', 'operation_opmessage_message',
'operation-message-subject-label', 'operation_opmessage_default_msg'
];
this._enableFormFields(fields);
this._customMessageFields();
}
_allInvolvedFieldsUpdate() {
const fields = [
'operation-message-custom-label', 'operation-message-custom', 'operation-opmessage-subject',
'operation_opmessage_message', 'operation_opmessage_default_msg', 'operation-message-mediatype-default'
];
this._enableFormFields(fields);
this._customMessageFields();
}
_hostGroupFields() {
document.getElementById('operation-attr-hostgroups').style.display='';
document.getElementById('operation-attr-hostgroups-label').style.display='';
this._enableFormFields(['operation-attr-hostgroups']);
this._updateHostGroupMs();
this.hostgroup_ms.on('change', () => {
this._updateHostGroupMs();
});
}
_updateHostGroupMs() {
this.hostgroup_ms = $('#operation_opgroup__groupid');
this.hostgroup_ms.multiSelect('setDisabledEntries',
[... this.form.querySelectorAll('[name^="operation[opgroup]["]')].map((input) => input.value)
);
}
/**
* Shows or hides the host tags fields.
*/
#hostTagsFields() {
this.form.querySelector('#operation-host-tags').style.display = '';
this._enableFormFields(['operation-host-tags']);
}
_templateFields() {
document.getElementById('operation-attr-templates').style.display='';
document.getElementById('operation-attr-templates-label').style.display='';
this._enableFormFields(['operation-attr-templates']);
this._updateTemplateMs();
this.template_ms.on('change', () => {
this._updateTemplateMs();
});
}
_updateTemplateMs() {
this.template_ms = $('#operation_optemplate__templateid');
this.template_ms.multiSelect('setDisabledEntries',
[... this.form.querySelectorAll('[name^="operation[optemplate]["]')].map((input) => input.value)
);
}
_removeAllFields() {
for (const field of this.form.getElementsByClassName('form-field')) {
if (field.id === 'operation-type') {
continue;
}
field.style.display = 'none';
field.getElementsByTagName('input')
}
for (const label of this.form.getElementsByTagName('label')) {
if (label.id === 'operation-type-label') {
continue;
}
label.style.display = 'none';
}
for (const input of this.form.querySelectorAll('input, textarea')) {
if (['operation_eventsource', 'operation_recovery', 'submit'].includes(input.id)) {
continue;
}
if (input.name === 'operation[operationtype]') {
continue;
}
input.setAttribute('disabled', true);
input.style.display = 'none';
}
}
_sendMessageFields() {
document.getElementById('operation_opmessage_default_msg').dispatchEvent(new Event('change'));
switch (this.eventsource) {
case <?= EVENT_SOURCE_TRIGGERS ?>:
this.fields = [
'operation-message-user-groups', 'operation-condition-table', 'operation-evaltype-label',
'operation-condition-list-label', 'operation-condition-list', 'step-from', 'operation-step-range',
'operation-step-duration', 'operation-message-notice', 'operation-message-notice', 'operation-type',
'operation-message-users', 'operation-evaltype', 'operation-message-mediatype-only',
'operation-message-custom', 'operation_esc_period', 'operation-message-custom-label',
'operation_opmessage_default_msg', 'operation-condition-row', 'operation_opmessage_usr__userid_ms',
'operation-condition-evaltype-formula', 'user-groups-label', 'operation_opmessage_grp__usrgrpid_ms'
];
this._customMessageFields();
break;
case <?= EVENT_SOURCE_INTERNAL ?>:
case <?= EVENT_SOURCE_SERVICE?>:
this.fields = [
'step-from', 'operation-step-range', 'operation-step-duration', 'operation-message-notice',
'operation-message-user-groups', 'operation-message-notice', 'operation-message-users',
'operation-message-mediatype-only', 'operation-message-custom', 'operation_esc_period',
'operation-message-custom-label', 'operation_opmessage_default_msg', 'operation-type',
'operation_opmessage_grp__usrgrpid_ms', 'operation_opmessage_usr__userid_ms'
];
this._customMessageFields();
break;
case <?= EVENT_SOURCE_DISCOVERY ?>:
case <?= EVENT_SOURCE_AUTOREGISTRATION ?>:
this.fields = [
'operation-message-notice', 'operation-message-user-groups', 'operation-message-users',
'operation-message-mediatype-only', 'operation-message-custom', 'operation_esc_period',
'operation-message-custom-label', 'operation_opmessage_default_msg', 'operation-message-notice',
'operation-type', 'operation_opmessage_grp__usrgrpid_ms', 'operation_opmessage_usr__userid_ms'
];
this._customMessageFields();
break;
}
this._enableFormFields(this.fields);
this._updateUserGroupMs();
this._updateUserMs()
this.usergroup_ms.on('change', () => {
this._updateUserGroupMs();
});
this.user_ms.on('change', () => {
this._updateUserMs();
});
}
_updateUserGroupMs() {
this.usergroup_ms = $('#operation_opmessage_grp__usrgrpid');
this.usergroup_ms.multiSelect('setDisabledEntries',
[... this.form.querySelectorAll('[name^="operation[opmessage_grp]["]')].map((input) => input.value)
);
}
_updateUserMs() {
this.user_ms = $('#operation_opmessage_usr__userid');
this.user_ms.multiSelect('setDisabledEntries',
[... this.form.querySelectorAll('[name^="operation[opmessage_usr]["]')].map((input) => input.value)
);
}
_enableFormFields(fields = []) {
for (const field of this.form.getElementsByClassName('form-field')) {
if (fields.includes(field.id)) {
field.style.display = '';
for (const input of field.querySelectorAll('input, textarea')) {
input.removeAttribute('disabled');
input.style.display = '';
}
for (const label of field.querySelectorAll('label')) {
label.style.display = '';
}
}
}
for (const label of this.form.getElementsByTagName('label')) {
if (fields.includes(label.id.replace('-label', ''))) {
label.style.display = '';
}
if (fields.includes(label.htmlFor)) {
label.style.display = '';
}
}
}
_hostInventoryFields() {
const fields = ['operation-attr-inventory'];
this._enableFormFields(fields);
}
_addScriptFields() {
let fields;
switch (this.eventsource) {
case <?= EVENT_SOURCE_TRIGGERS ?>:
fields = [
'step-from', 'operation-step-range', 'operation-step-duration', 'operation-command-targets-label',
'operation-command-checkbox', 'operation-command-chst-label', 'operation_opcommand_host_ms',
'operation-opcommand-hst-label', 'operation-opcommand-grp', 'operation-command-targets',
'operation-condition-table', 'operation-condition-list-label', 'operation-condition-list',
'operation_opcommand_hst__hostidch', 'operation_opcommand_hst__hostid_current_host',
'operation_opcommand_hostgroup_ms'
];
break;
case <?= EVENT_SOURCE_SERVICE ?>:
fields = [
'step-from', 'operation-step-range', 'operation-step-duration',
'operation-command-targets-label'
];
break;
case <?= EVENT_SOURCE_DISCOVERY ?>:
case <?= EVENT_SOURCE_AUTOREGISTRATION ?>:
fields = [
'operation-command-targets-label', 'operation-command-checkbox', 'operation-command-chst',
'operation-command-chst-label', 'operation-opcommand-hst-label', 'operation-opcommand-grp',
'operation-command-targets', 'operation-condition-table', 'operation-condition-list-label',
'operation-condition-list', 'operation_opcommand_hst__hostidch', 'operation_opcommand_host_ms',
'operation_opcommand_hostgroup_ms'
];
}
this._enableFormFields(fields);
this._updateOperationHostMs();
this._updateOperationHostGroupMs();
this.host_ms.on('change', () => {
this._updateOperationHostMs();
});
this.hostgroup_ms.on('change', () => {
this._updateOperationHostGroupMs();
});
}
_updateOperationHostMs() {
this.host_ms = $('#operation_opcommand_hst__hostid');
this.host_ms.multiSelect('setDisabledEntries',
[... this.form.querySelectorAll('[name^="operation[opcommand_hst]["]')].map((input) => input.value)
);
}
_updateOperationHostGroupMs() {
this.hostgroup_ms = $('#operation_opcommand_grp__groupid');
this.hostgroup_ms.multiSelect('setDisabledEntries',
[... this.form.querySelectorAll('[name^="operation[opcommand_grp]["]')].map((input) => input.value)
);
}
_createHiddenInput(name, value) {
const input = document.createElement('input');
input.type = 'hidden';
input.name = name;
input.value = value;
return input;
}
_openConditionsPopup(trigger_element) {
this._processTypeOfCalculation();
let row_index = 0;
while (document.querySelector(`#operation-condition-list [data-id="${row_index}"]`) !== null) {
row_index++;
}
const parameters = {
type: <?= ZBX_POPUP_CONDITION_TYPE_ACTION_OPERATION ?>,
source: this.eventsource,
row_index: row_index
};
const overlay = PopUp('popup.condition.operations', parameters, {
dialogueid: 'operation-condition',
dialogue_class: 'modal-popup-medium',
trigger_element: trigger_element
});
overlay.$dialogue[0].addEventListener('condition.dialogue.submit', (e) => {
this._createOperationConditionsRow(e.detail, row_index);
});
}
/**
* Check if row with the same conditiontype and value already exists.
*/
_checkConditionRow(input) {
const result = [];
[...document.getElementById('operation-condition-list').getElementsByTagName('tr')].map(element => {
const table_row = element.getElementsByTagName('td')[2];
if (table_row !== undefined) {
const conditiontype = table_row.getElementsByTagName('input')[0].value;
const value = table_row.getElementsByTagName('input')[2].value;
result.push(input.conditiontype === conditiontype && input.value === value);
if (input.row_index == element.dataset.id) {
input.row_index++;
}
}
result.push(false);
});
return result;
}
_createOperationConditionsRow(input, row_index) {
const has_row = this._checkConditionRow(input);
const result = [has_row.some(element => element === true)]
if (result[0] === true) {
return;
}
else {
if (input.conditiontype == <?= CONDITION_TYPE_EVENT_ACKNOWLEDGED ?>) {
if (input.value == 1) {
input.name = <?= json_encode(_('Event is acknowledged')) ?> + ' ';
}
else if (input.value == 0) {
input.name = <?= json_encode(_('Event is not acknowledged')) ?> + ' ';
}
}
input.label = num2letter(row_index);
input.row_index = row_index;
const template = new Template(document.getElementById('operation-condition-row-tmpl').innerHTML);
document
.querySelector('#operation-condition-list tbody')
.insertAdjacentHTML('beforeend', template.evaluate(input));
}
this._processTypeOfCalculation();
}
submit() {
this.form.append(this._createHiddenInput('row_index', this.row_index));
this.form.append(this._createHiddenInput('actionid', this.actionid));
const curl = new Curl('zabbix.php');
curl.setArgument('action', 'action.operation.check');
const fields = getFormFields(this.form);
if (fields.operation.esc_period != null) {
fields.operation.esc_period = fields.operation.esc_period.trim();
}
this._post(curl.getUrl(), fields);
}
_post(url, data, success_callback) {
fetch(url, {
method: 'POST',
headers: {'Content-Type': 'application/json'},
body: JSON.stringify(data)
})
.then((response) => response.json())
.then((response) => {
if ('error' in response) {
throw {error: response.error};
}
overlayDialogueDestroy(this.overlay.dialogueid);
this.dialogue.dispatchEvent(new CustomEvent('operation.submit', {detail: response}));
})
.then(success_callback)
.catch((exception) => {
for (const element of this.form.parentNode.children) {
if (element.matches('.msg-good, .msg-bad, .msg-warning')) {
element.parentNode.removeChild(element);
}
}
let title, messages;
if (typeof exception === 'object' && 'error' in exception) {
title = exception.error.title;
messages = exception.error.messages;
}
else {
messages = [<?= json_encode(_('Unexpected server error.')) ?>];
}
const message_box = makeMessageBox('bad', messages, title)[0];
this.form.parentNode.insertBefore(message_box, this.form);
})
.finally(() => {
this.overlay.unsetLoading();
});
}
_processTypeOfCalculation() {
let row_count;
document.getElementById('operation-condition-list')
? row_count = document.getElementById('operation-condition-list').rows.length - 2
: row_count = 0;
document.querySelector('#operation-evaltype').style.display = row_count > 1 ? '' : 'none';
document.querySelector('#operation-evaltype-label').style.display = row_count > 1 ? '' : 'none';
document.querySelector('#operation-condition-row').style.display = row_count > 1 ? '' : 'none';
const labels = document.querySelectorAll('#operation-condition-list .label');
const conditions = [];
[...labels].forEach(function (label) {
conditions.push({
id: label.dataset.formulaid,
type: label.dataset.conditiontype
});
});
document.getElementById('operation-condition-evaltype-formula')
.innerHTML = getConditionFormula(conditions, + document.querySelector('#operation-evaltype').value);
document.querySelector('#operation-evaltype').onchange = function() {
const labels = document.querySelectorAll('#operation-condition-list .label');
const conditions = [];
[...labels].forEach(function (label) {
conditions.push({
id: label.dataset.formulaid,
type: label.dataset.conditiontype
});
});
document.getElementById('operation-condition-evaltype-formula')
.innerHTML = getConditionFormula(conditions, + document.querySelector('#operation-evaltype').value);
}
}
_customMessageFields() {
const default_msg = document.querySelector('#operation_opmessage_default_msg');
const message_fields = [
'operation-message-subject-label', 'operation-opmessage-subject', 'operation-message-label',
'operation_opmessage_message', 'operation-message-subject', 'operation-message'
];
default_msg.onchange = function() {
if (document.querySelector('#operation_opmessage_default_msg').checked) {
message_fields.forEach((field) => {
document.getElementById(field).style.display='';
document.getElementById(field).removeAttribute('disabled');
});
document.querySelector('#operation_opmessage_default_msg').value = 0;
}
else {
message_fields.forEach((field) => {
document.getElementById(field).style.display='none';
});
document.querySelector('#operation_opmessage_default_msg').value = 1;
}
}
default_msg.dispatchEvent(new Event('change'));
}
}