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.

353 lines
11 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.
**/
/**
* @var CView $this
* @var array $data
*/
$form = (new CForm())
->addItem((new CVar(CCsrfTokenHelper::CSRF_TOKEN_NAME, CCsrfTokenHelper::get('correlation')))->removeId())
->setId('correlation-form')
->addVar('correlationid', $data['correlationid'])
->addItem((new CInput('submit', null))->addStyle('display: none;'));
$form_grid = (new CFormGrid())
->addItem([
(new CLabel(_('Name'), 'name'))->setAsteriskMark(),
new CFormField(
(new CTextBox('name', $data['name']))
->setWidth(ZBX_TEXTAREA_STANDARD_WIDTH)
->setAriaRequired()
->setAttribute('autofocus', 'autofocus')
)
]);
$remove_button = (new CButtonLink(_('Remove')))->addClass('js-condition-remove');
$condition_tag_template = (new CTemplateTag('condition-tag-row-tmpl'))
->addItem(
(new CRow([
(new CCol('#{label}'))
->addClass('label')
->setAttribute('data-conditiontype', '#{conditiontype}')
->setAttribute('data-formulaid', '#{label}'),
(new CCol([
'#{condition_name}', ' ', new CTag('em', true, '#{data}')
]))
->addClass(ZBX_STYLE_WORDWRAP)
->addStyle(ZBX_TEXTAREA_BIG_WIDTH.'px;'),
(new CCol([
$remove_button,
(new CInput('hidden'))
->setAttribute('value', '#{conditiontype}')
->setName('conditions[#{row_index}][type]'),
(new CInput('hidden'))
->setAttribute('value', '#{operator}')
->setName('conditions[#{row_index}][operator]'),
(new CInput('hidden'))
->setAttribute('value', '#{tag}')
->setName('conditions[#{row_index}][tag]'),
(new CInput('hidden'))
->setAttribute('value', '#{label}')
->setName('conditions[#{row_index}][formulaid]')
]))
]))->setId('conditions_#{row_index}')
);
$condition_hostgroup_template = (new CTemplateTag('condition-hostgr-row-tmpl'))->addItem(
(new CRow([
(new CCol('#{label}'))
->addClass('label')
->setAttribute('data-conditiontype', '#{conditiontype}')
->setAttribute('data-formulaid', '#{label}'),
(new CCol([
'#{condition_name}', ' ', new CTag('em', true, '#{data}')
]))
->addClass(ZBX_STYLE_WORDWRAP)
->addStyle(ZBX_TEXTAREA_BIG_WIDTH.'px;'),
(new CCol([
$remove_button,
(new CInput('hidden'))
->setAttribute('value', '#{conditiontype}')
->setName('conditions[#{row_index}][type]'),
(new CInput('hidden'))
->setAttribute('value', '#{operator}')
->setName('conditions[#{row_index}][operator]'),
(new CInput('hidden'))
->setAttribute('value', '#{groupid}')
->setName('conditions[#{row_index}][groupid]'),
(new CInput('hidden'))
->setAttribute('value', '#{label}')
->setName('conditions[#{row_index}][formulaid]')
]))
]))->setId('conditions_#{row_index}')
);
$condition_tag_pair_template = (new CTemplateTag('condition-tag-pair-row-tmpl'))->addItem(
(new CRow([
(new CCol('#{label}'))
->addClass('label')
->setAttribute('data-conditiontype', '#{conditiontype}')
->setAttribute('data-formulaid', '#{label}'),
(new CCol([
'#{condition_name}', ' ', new CTag('em', true, '#{data_old_tag}'), ' ', '#{condition_operator}', ' ',
'#{condition_name2}', ' ', new CTag('em', true, '#{data_new_tag}')
]))
->addClass(ZBX_STYLE_WORDWRAP)
->addStyle(ZBX_TEXTAREA_BIG_WIDTH.'px;'),
(new CCol([
$remove_button,
(new CInput('hidden'))
->setAttribute('value', '#{conditiontype}')
->setName('conditions[#{row_index}][type]'),
(new CInput('hidden'))
->setAttribute('value', '#{operator}')
->setName('conditions[#{row_index}][operator]'),
(new CInput('hidden'))
->setAttribute('value', '#{oldtag}')
->setName('conditions[#{row_index}][oldtag]'),
(new CInput('hidden'))
->setAttribute('value', '#{newtag}')
->setName('conditions[#{row_index}][newtag]'),
(new CInput('hidden'))
->setAttribute('value', '#{label}')
->setName('conditions[#{row_index}][formulaid]')
]))
]))->setId('conditions_#{row_index}')
);
$condition_old_new_tag_template = (new CTemplateTag('condition-old-new-tag-row-tmpl'))->addItem(
(new CRow([
(new CCol('#{label}'))
->addClass('label')
->setAttribute('data-conditiontype', '#{conditiontype}')
->setAttribute('data-formulaid', '#{label}'),
(new CCol([
'#{condition_name}', ' ', new CTag('em', true, '#{tag}'), ' ',
'#{condition_operator}', ' ', new CTag('em', true, '#{value}')
]))
->addClass(ZBX_STYLE_WORDWRAP)
->addStyle(ZBX_TEXTAREA_BIG_WIDTH),
(new CCol([
$remove_button,
(new CInput('hidden'))
->setAttribute('value', '#{conditiontype}')
->setName('conditions[#{row_index}][type]'),
(new CInput('hidden'))
->setAttribute('value', '#{operator}')
->setName('conditions[#{row_index}][operator]'),
(new CInput('hidden'))
->setAttribute('value', '#{tag}')
->setName('conditions[#{row_index}][tag]'),
(new CInput('hidden'))
->setAttribute('value', '#{value}')
->setName('conditions[#{row_index}][value]'),
(new CInput('hidden'))
->setAttribute('value', '#{label}')
->setName('conditions[#{row_index}][formulaid]')
]))
]))->setId('conditions_#{row_index}')
);
// Create condition table, add HTML templates and add the "Add" link. Table content is generated by JS.
$condition_table = (new CTable())
->setId('condition_table')
->addClass(ZBX_STYLE_TABLE_FORMS)
->setHeader([_('Label'), _('Name'), _('Action')])
->addItem([
$condition_tag_template,
$condition_hostgroup_template,
$condition_tag_pair_template,
$condition_old_new_tag_template
])
->addItem(
(new CTag('tfoot', true))
->addItem(
(new CCol(
(new CButtonLink(_('Add')))
->setAttribute('data-action', 'add')
->addClass('js-condition-add')
))->setColSpan(4)
)
);
$form_grid
->addItem([
(new CLabel(_('Type of calculation'), 'evaltype_select'))->setId('label-evaltype'),
(new CFormField(
[
(new CDiv(
(new CSelect('evaltype'))
->setId('evaltype')
->setValue($data['evaltype'])
->setFocusableElementId('evaltype_select')
->addOptions(CSelect::createOptionsFromArray([
CONDITION_EVAL_TYPE_AND_OR => _('And/Or'),
CONDITION_EVAL_TYPE_AND => _('And'),
CONDITION_EVAL_TYPE_OR => _('Or'),
CONDITION_EVAL_TYPE_EXPRESSION => _('Custom expression')
]))
->addClass(ZBX_STYLE_FORM_INPUT_MARGIN)
))->addClass(ZBX_STYLE_CELL),
(new CDiv([
(new CSpan())->setId('expression'),
(new CTextBox('formula', $data['formula']))
->addStyle('width: 100%;')
->setId('formula')
->setAttribute('placeholder', 'A or (B and C) ...')
]))
->addClass(ZBX_STYLE_CELL)
->addClass(ZBX_STYLE_CELL_EXPRESSION)
->addStyle('width: 100%;')
->addStyle('white-space: initial;')
]
))->addStyle('width: '.ZBX_TEXTAREA_STANDARD_WIDTH.'px;')
])
->addItem([
(new CLabel(_('Conditions'), $condition_table->getId()))->setAsteriskMark(),
(new CFormField($condition_table))
->addClass(ZBX_STYLE_TABLE_FORMS_SEPARATOR)
->addStyle('min-width: '.ZBX_TEXTAREA_STANDARD_WIDTH.'px;')
->addStyle('max-width: '.ZBX_TEXTAREA_STANDARD_WIDTH.'px;')
->setAriaRequired()
])
->addItem([
new CLabel(_('Description'), 'description'),
new CFormField(
(new CTextArea('description', $data['description']))
->setWidth(ZBX_TEXTAREA_STANDARD_WIDTH)
->setMaxlength(DB::getFieldLength('hosts', 'description'))
)
])
->addItem([
new CLabel(_('Operations')),
new CFormField(
(new CCheckBoxList())
->setVertical()
->setOptions([
[
'label' => _('Close old events'),
'checked' => $data['op_close_old'],
'name' => 'op_close_old',
'id' => 'operation_0_type',
'value' => '1'
],
[
'label' => _('Close new event'),
'checked' => $data['op_close_new'],
'name' => 'op_close_new',
'id' => 'operation_1_type',
'value' => '1'
]
])
)
])
->addItem([
new CFormField((new CLabel(_('At least one operation must be selected.')))->setAsteriskMark())
])
->addItem([
new CLabel(_('Enabled'), 'status'),
new CFormField(
(new CCheckBox('status', ZBX_CORRELATION_ENABLED))
->setChecked($data['status'] == ZBX_CORRELATION_ENABLED)
->setUncheckedValue(ZBX_CORRELATION_DISABLED)
)
]);
$form
->addItem($form_grid)
->addItem(
(new CScriptTag(
'correlation_edit_popup.init('.json_encode([
'correlation' => $data
], JSON_THROW_ON_ERROR).');'
))->setOnDocumentReady()
);
if ($data['correlationid'] === null) {
$buttons = [
[
'title' => _('Add'),
'keepOpen' => true,
'isSubmit' => true,
'action' => 'correlation_edit_popup.submit();'
]
];
}
else {
$buttons = [
[
'title' => _('Update'),
'keepOpen' => true,
'isSubmit' => true,
'action' => 'correlation_edit_popup.submit();'
],
[
'title' => _('Clone'),
'class' => ZBX_STYLE_BTN_ALT, 'js-clone',
'keepOpen' => true,
'isSubmit' => false,
'action' => 'correlation_edit_popup.clone('.json_encode([
'title' => _('New event correlation'),
'buttons' => [
[
'title' => _('Add'),
'class' => 'js-add',
'keepOpen' => true,
'isSubmit' => true,
'action' => 'correlation_edit_popup.submit();'
],
[
'title' => _('Cancel'),
'class' => ZBX_STYLE_BTN_ALT,
'cancel' => true,
'action' => ''
]
]
]).');'
],
[
'title' => _('Delete'),
'confirmation' => _('Delete event correlation?'),
'class' => ZBX_STYLE_BTN_ALT,
'keepOpen' => true,
'isSubmit' => false,
'action' => 'correlation_edit_popup.delete();'
]
];
}
$output = [
'header' => $data['correlationid'] === null ? _('New event correlation') : _('Event correlation'),
'doc_url' => CDocHelper::getUrl(CDocHelper::DATA_COLLECTION_CORRELATION_EDIT),
'body' => $form->toString(),
'buttons' => $buttons,
'script_inline' => getPagePostJs().$this->readJsFile('correlation.edit.js.php')
];
if ($data['user']['debug_mode'] == GROUP_DEBUG_MODE_ENABLED) {
CProfiler::getInstance()->stop();
$output['debug'] = CProfiler::getInstance()->make()->toString();
}
echo json_encode($output);