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.

329 lines
10 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('action')))->removeId())
->setName('action.edit')
->setId('action-form')
->addVar('actionid', $data['actionid'] ?: 0)
->addVar('eventsource', $data['eventsource']);
// Enable form submitting on Enter.
$form->addItem((new CSubmitButton())->addClass(ZBX_STYLE_FORM_SUBMIT_HIDDEN));
// Action tab.
$action_tab = (new CFormGrid())
->addItem([
(new CLabel(_('Name'), 'name'))->setAsteriskMark(),
new CFormField(
(new CTextBox('name', $data['action']['name'] ?: ''))
->setWidth(ZBX_TEXTAREA_STANDARD_WIDTH)
->setAriaRequired()
->setAttribute('autofocus', 'autofocus')
)
]);
// Create condition table.
$condition_table = (new CTable())
->setId('conditionTable')
->setAttribute('style', 'width: 100%;')
->setHeader([_('Label'), _('Name'), _('Action')]);
$formula = (new CTextBox('formula', $data['formula'], false, DB::getFieldLength('actions', 'formula')))
->setWidth(ZBX_TEXTAREA_STANDARD_WIDTH)
->setId('formula')
->setAttribute('placeholder', 'A or (B and C) ...');
$condition_hidden_data = (new CCol([
(new CButtonLink(_('Remove')))
->addClass('js-remove-condition'),
(new CInput('hidden'))
->setAttribute('value', '#{conditiontype}')
->setName('conditions[#{row_index}][conditiontype]'),
(new CInput('hidden'))
->setAttribute('value', '#{operator}')
->setName('conditions[#{row_index}][operator]'),
(new CInput('hidden'))
->setAttribute('value', '#{value}')
->setName('conditions[#{row_index}][value]'),
(new CInput('hidden'))
->setAttribute('value', '#{value2}')
->setName('conditions[#{row_index}][value2]'),
(new CInput('hidden'))
->setAttribute('value', '#{label}')
->setName('conditions[#{row_index}][formulaid]')
]));
$condition_suppressed_template = (new CTemplateTag('condition-suppressed-row-tmpl'))->addItem(
(new CRow([
(new CCol('#{label}'))
->addClass('label')
->setAttribute('data-conditiontype', '#{conditiontype}')
->setAttribute('data-formulaid', '#{label}'),
(new CCol('#{condition_name}'))
->addClass(ZBX_STYLE_WORDWRAP)
->addStyle(ZBX_TEXTAREA_BIG_WIDTH),
$condition_hidden_data
]))->setAttribute('data-row_index', '#{row_index}')
);
$condition_template_default = (new CTemplateTag('condition-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),
$condition_hidden_data
]))->setAttribute('data-row_index', '#{row_index}')
);
$condition_tag_value_template = (new CTemplateTag('condition-tag-value-row-tmpl'))->addItem(
(new CRow([
(new CCol('#{label}'))
->addClass('label')
->setAttribute('data-conditiontype', '#{conditiontype}')
->setAttribute('data-formulaid', '#{label}'),
(new CCol([
_('Value of tag'), ' ', new CTag('em', true, '#{value2}'), ' ',
'#{operator_name}', ' ', new CTag('em', true, '#{value}')
]))
->addClass(ZBX_STYLE_WORDWRAP)
->addStyle(ZBX_TEXTAREA_BIG_WIDTH),
$condition_hidden_data
]))->setAttribute('data-row_index', '#{row_index}')
);
$action_tab->addItem([
(new CLabel(_('Type of calculation'), 'evaltype_select'))->setId('label-evaltype'),
(new CFormField([
(new CDiv([
(new CSelect('evaltype'))
->setId('evaltype')
->setFocusableElementId('evaltype_select')
->setValue($data['action']['filter']['evaltype'])
->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')
])),
(new CDiv())->addClass(ZBX_STYLE_FORM_INPUT_MARGIN)
]))->addClass(ZBX_STYLE_CELL),
(new CDiv([
(new CSpan(''))
->addStyle('white-space: normal;')
->setId('expression'),
$formula
]))
->addClass(ZBX_STYLE_CELL)
->addClass(ZBX_STYLE_CELL_EXPRESSION),
$condition_suppressed_template,
$condition_template_default,
$condition_tag_value_template
]))->setId('evaltype-formfield')
])->setId('actionCalculationRow');
$condition_table->addItem(
(new CTag('tfoot', true))
->addItem(
(new CCol(
(new CButtonLink(_('Add')))
->addClass('js-condition-create')
->setAttribute('data-eventsource', $data['eventsource'])
))->setColSpan(4)
)
);
// action tab
$action_tab
->addItem([
new CLabel(_('Conditions')),
(new CFormField($condition_table))
->addClass(ZBX_STYLE_TABLE_FORMS_SEPARATOR)
->setAttribute('style', 'min-width: '.ZBX_TEXTAREA_BIG_WIDTH.'px;')
])
->addItem([
new CLabel(_('Enabled'), 'status'),
new CFormField(
(new CCheckBox('status', ACTION_STATUS_ENABLED))
->setChecked($data['action']['status'] == ACTION_STATUS_ENABLED)
)
])
->addItem(
new CFormField((new CLabel(_('At least one operation must exist.')))->setAsteriskMark())
);
// Operations tab.
$operations_tab = (new CFormGrid());
if (in_array($data['eventsource'], [EVENT_SOURCE_TRIGGERS, EVENT_SOURCE_INTERNAL, EVENT_SOURCE_SERVICE])) {
$operations_tab->addItem([
(new CLabel(_('Default operation step duration'), 'esc_period'))->setAsteriskMark(),
new CFormField(
(new CTextBox('esc_period', $data['action']['esc_period']))
->setId('esc_period')
->setWidth(ZBX_TEXTAREA_SMALL_WIDTH)
->setAriaRequired()
)
]);
}
// Operations table.
$data['esc_period'] = $data['action']['esc_period'];
$operations_tab->addItem([
new CLabel(_('Operations')),
(new CFormField(new CPartial('action.operations', $data)))
->addClass(ZBX_STYLE_TABLE_FORMS_SEPARATOR)
->setId('operations-container')
->setAttribute('style', 'min-width: '.ZBX_TEXTAREA_BIG_WIDTH.'px;')
]);
// Recovery operations table.
if (in_array($data['eventsource'], [EVENT_SOURCE_TRIGGERS, EVENT_SOURCE_INTERNAL, EVENT_SOURCE_SERVICE])) {
$operations_tab->addItem([
new CLabel(_('Recovery operations')),
(new CFormField(new CPartial('action.recovery.operations', $data)))
->addClass(ZBX_STYLE_TABLE_FORMS_SEPARATOR)
->setId('recovery-operations-container')
->setAttribute('style', 'min-width: '.ZBX_TEXTAREA_BIG_WIDTH.'px;')
]);
}
// Update operations table.
if ($data['eventsource'] == EVENT_SOURCE_TRIGGERS || $data['eventsource'] == EVENT_SOURCE_SERVICE) {
$operations_tab->addItem([
new CLabel(_('Update operations')),
(new CFormField(new CPartial('action.update.operations', $data)))
->addClass(ZBX_STYLE_TABLE_FORMS_SEPARATOR)
->setId('update-operations-container')
->setAttribute('style', 'min-width: '.ZBX_TEXTAREA_BIG_WIDTH.'px;')
]);
}
if ($data['eventsource'] == EVENT_SOURCE_TRIGGERS) {
$operations_tab
->addItem([
new CLabel(_('Pause operations for symptom problems'), 'pause_symptoms'),
new CFormField((new CCheckBox('pause_symptoms', ACTION_PAUSE_SYMPTOMS_TRUE))
->setChecked($data['action']['pause_symptoms'] == ACTION_PAUSE_SYMPTOMS_TRUE)
)
])
->addItem([
new CLabel(_('Pause operations for suppressed problems'), 'pause_suppressed'),
new CFormField((new CCheckBox('pause_suppressed', ACTION_PAUSE_SUPPRESSED_TRUE))
->setChecked($data['action']['pause_suppressed'] == ACTION_PAUSE_SUPPRESSED_TRUE)
)
])
->addItem([
new CLabel(_('Notify about canceled escalations'), 'notify_if_canceled'),
new CFormField((new CCheckBox('notify_if_canceled', ACTION_NOTIFY_IF_CANCELED_TRUE))
->setChecked($data['action']['notify_if_canceled'] == ACTION_NOTIFY_IF_CANCELED_TRUE)
)
]);
}
$operations_tab->addItem(
new CFormField((new CLabel(_('At least one operation must exist.')))->setAsteriskMark())
);
$tabs = (new CTabView())
->setSelected(0)
->addTab('action-tab', _('Action'), $action_tab)
->addTab('action-operations-tab', _('Operations'), $operations_tab, TAB_INDICATOR_OPERATIONS);
$form
->addItem($tabs)
->addItem(
(new CScriptTag('
action_edit_popup.init('.json_encode([
'condition_operators' => condition_operator2str(),
'condition_types' => condition_type2str(),
'conditions' => $data['action']['filter']['conditions'],
'actionid' => $data['actionid'] ?: 0,
'eventsource' => $data['eventsource'],
'allowed_operations' => $data['allowedOperations']
], JSON_THROW_ON_ERROR).');
'))->setOnDocumentReady()
);
if ($data['actionid'] !== 0) {
$buttons = [
[
'title' => _('Update'),
'keepOpen' => true,
'isSubmit' => true,
'action' => 'action_edit_popup.submit();'
],
[
'title' => _('Clone'),
'class' => implode(' ', [ZBX_STYLE_BTN_ALT, 'js-clone']),
'keepOpen' => true,
'isSubmit' => false,
'action' => 'action_edit_popup.clone();'
],
[
'title' => _('Delete'),
'confirmation' => _('Delete current action?'),
'class' => ZBX_STYLE_BTN_ALT,
'keepOpen' => true,
'isSubmit' => false,
'action' => 'action_edit_popup.delete();'
]
];
}
else {
$buttons = [
[
'title' => _('Add'),
'class' => 'js-add',
'keepOpen' => true,
'isSubmit' => true,
'action' => 'action_edit_popup.submit();'
]
];
}
$output = [
'header' => $data['actionid'] !== 0 ? _('Action') : _('New action'),
'doc_url' => CDocHelper::getUrl(CDocHelper::ALERTS_ACTION_EDIT),
'body' => $form->toString(),
'buttons' => $buttons,
'script_inline' => getPagePostJs().
$this->readJsFile('popup.action.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);