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.

365 lines
11 KiB

1 year ago
<?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('template')))->removeId())
->setId('templates-form')
->setName('template-edit-form')
->addItem((new CSubmitButton())->addClass(ZBX_STYLE_FORM_SUBMIT_HIDDEN))
->addVar('clone_templateid', $data['clone_templateid'] ?? null)
->addVar('clone', $data['clone'] ?: null);
// Template tab.
$template_tab = (new CFormGrid())
->addItem([
(new CLabel(_('Template name'), 'template_name'))->setAsteriskMark(),
new CFormField(
(new CTextBox('template_name', $data['template_name'], false, DB::getFieldLength('hosts', 'host')))
->setWidth(ZBX_TEXTAREA_STANDARD_WIDTH)
->setAriaRequired()
->setAttribute('autofocus', 'autofocus')
)
])
->addItem([
new CLabel(_('Visible name'), 'visiblename'),
new CFormField(
(new CTextBox('visiblename', $data['visible_name'], false, DB::getFieldLength('hosts', 'name')))
->setWidth(ZBX_TEXTAREA_STANDARD_WIDTH)
)
]);
$templates_field_items = [];
if ($data['linked_templates']) {
$linked_templates= (new CTable())
->setHeader([_('Name'), _('Action')])
->setId('linked-templates')
->addClass(ZBX_STYLE_TABLE_FORMS)
->addStyle('width: '.ZBX_TEXTAREA_STANDARD_WIDTH.'px;');
foreach ($data['linked_templates'] as $template) {
if (array_key_exists($template['templateid'], $data['writable_templates'])) {
$template_link = (new CLink($template['name']))
->addClass('js-edit-linked-template')
->setAttribute('data-templateid', $template['templateid']);
}
else {
$template_link = new CSpan($template['name']);
}
$linked_templates->addRow([
$template_link->addClass(ZBX_STYLE_WORDWRAP),
(new CCol(
new CHorList([
(new CButtonLink(_('Unlink')))
->setAttribute('data-templateid', $template['templateid'])
->addClass('js-unlink'),
(array_key_exists($template['templateid'], $data['original_templates']))
? (new CButtonLink(_('Unlink and clear')))
->setAttribute('data-templateid', $template['templateid'])
->addClass('js-unlink-and-clear')
: null
])
))
->addItem((new CVar('templates['.$template['templateid'].']', $template['templateid']))->removeId())
->addClass(ZBX_STYLE_NOWRAP)
], null, 'conditions_'.$template['templateid']);
}
$templates_field_items[] = $linked_templates;
}
$templates_field_items[] = (new CMultiSelect([
'name' => 'template_add_templates[]',
'object_name' => 'templates',
'data' => $data['add_templates'],
'popup' => [
'parameters' => [
'srctbl' => 'templates',
'srcfld1' => 'hostid',
'srcfld2' => 'host',
'dstfrm' => $form->getName(),
'dstfld1' => 'template_add_templates_',
'excludeids' => ($data['templateid'] == null) ? [] : [$data['templateid']],
'disableids' => array_column($data['linked_templates'], 'templateid')
]
]
]))->setWidth(ZBX_TEXTAREA_STANDARD_WIDTH);
$template_tab
->addItem([
new CLabel(_('Templates'), 'template_add_templates__ms'),
new CFormField(
(count($templates_field_items) > 1)
? (new CDiv($templates_field_items))->addClass('linked-templates')
: $templates_field_items
)
])
->addItem([
(new CLabel(_('Template groups'), 'template_groups__ms'))->setAsteriskMark(),
new CFormField(
(new CMultiSelect([
'name' => 'template_groups[]',
'object_name' => 'templateGroup',
'add_new' => (CWebUser::$data['type'] == USER_TYPE_SUPER_ADMIN),
'data' => $data['groups_ms'],
'popup' => [
'parameters' => [
'srctbl' => 'template_groups',
'srcfld1' => 'groupid',
'dstfrm' => $form->getName(),
'dstfld1' => 'template_groups_',
'editable' => true,
'disableids' => array_column($data['groups_ms'], 'id')
]
]
]))
->setAriaRequired()
->setWidth(ZBX_TEXTAREA_STANDARD_WIDTH)
)
])
->addItem([
new CLabel(_('Description'), 'description'),
new CFormField(
(new CTextArea('description', $data['description']))
->setWidth(ZBX_TEXTAREA_STANDARD_WIDTH)
->setMaxlength(DB::getFieldLength('hosts', 'description'))
)
]);
if ($data['vendor']) {
$template_tab->addItem([
new CLabel(_('Vendor and version')),
new CFormField(implode(', ', [
$data['vendor']['name'],
$data['vendor']['version']
]))
]);
}
// Tags tab.
$tags_tab = (new CFormGrid)
->addItem([
new CLabel(_('Tags')),
new CFormField(
new CPartial('configuration.tags.tab', [
'source' => 'template',
'tags' => $data['tags'],
'readonly' => $data['readonly'],
'tabs_id' => 'template-tabs',
'tags_tab_id' => 'template-tags-tab',
'with_label' => true
]))
]);
$form->addItem(
(new CTemplateTag('tag-row-tmpl'))
->addItem(renderTagTableRow('#{rowNum}', '', '', ZBX_TAG_MANUAL, ['add_post_js' => false]))
);
// Macros tab.
$tmpl = $data['show_inherited_macros'] ? 'hostmacros.inherited.list.html' : 'hostmacros.list.html';
$macros_tab = (new CFormList('macrosFormList'))
->addRow(null, (new CRadioButtonList('show_inherited_template_macros', (int) $data['show_inherited_macros']))
->addValue(_('Template macros'), 0)
->addValue(_('Inherited and template macros'), 1)
->setModern()
)
->addRow(null, new CPartial($tmpl, [
'macros' => $data['macros'],
'readonly' => $data['readonly']
]), 'template_macros_container');
if (!$data['readonly']) {
$macro_row_tmpl = (new CTemplateTag('macro-row-tmpl'))
->addItem(
(new CRow([
(new CCol([
(new CTextAreaFlexible('macros[#{rowNum}][macro]', '', ['add_post_js' => false]))
->addClass('macro')
->setWidth(ZBX_TEXTAREA_MACRO_WIDTH)
->setAttribute('placeholder', '{$MACRO}')
->disableSpellcheck()
]))->addClass(ZBX_STYLE_TEXTAREA_FLEXIBLE_PARENT),
(new CCol(
new CMacroValue(ZBX_MACRO_TYPE_TEXT, 'macros[#{rowNum}]', '', false)
))->addClass(ZBX_STYLE_TEXTAREA_FLEXIBLE_PARENT),
(new CCol(
(new CTextAreaFlexible('macros[#{rowNum}][description]', '', ['add_post_js' => false]))
->setMaxlength(DB::getFieldLength('globalmacro', 'description'))
->setWidth(ZBX_TEXTAREA_MACRO_VALUE_WIDTH)
->setAttribute('placeholder', _('description'))
))->addClass(ZBX_STYLE_TEXTAREA_FLEXIBLE_PARENT),
(new CCol(
(new CButton('macros[#{rowNum}][remove]', _('Remove')))
->addClass(ZBX_STYLE_BTN_LINK)
->addClass('element-table-remove')
))->addClass(ZBX_STYLE_NOWRAP)
]))
->addClass('form_row')
);
$macro_row_inherited_tmpl = (new CTemplateTag('macro-row-tmpl-inherited'))
->addItem(
(new CRow([
(new CCol([
(new CTextAreaFlexible('macros[#{rowNum}][macro]', '', ['add_post_js' => false]))
->addClass('macro')
->setWidth(ZBX_TEXTAREA_MACRO_WIDTH)
->setAttribute('placeholder', '{$MACRO}')
->disableSpellcheck(),
new CInput('hidden', 'macros[#{rowNum}][inherited_type]', ZBX_PROPERTY_OWN)
]))->addClass(ZBX_STYLE_TEXTAREA_FLEXIBLE_PARENT),
(new CCol(
new CMacroValue(ZBX_MACRO_TYPE_TEXT, 'macros[#{rowNum}]', '', false)
))->addClass(ZBX_STYLE_TEXTAREA_FLEXIBLE_PARENT),
(new CCol(
(new CButton('macros[#{rowNum}][remove]', _('Remove')))
->addClass(ZBX_STYLE_BTN_LINK)
->addClass('element-table-remove')
))->addClass(ZBX_STYLE_NOWRAP),
[
new CCol(
(new CDiv())
->addClass(ZBX_STYLE_OVERFLOW_ELLIPSIS)
->setAdaptiveWidth(ZBX_TEXTAREA_MACRO_VALUE_WIDTH)
),
new CCol(),
new CCol(
(new CDiv())
->addClass(ZBX_STYLE_OVERFLOW_ELLIPSIS)
->setAdaptiveWidth(ZBX_TEXTAREA_MACRO_VALUE_WIDTH)
)
]
]))->addClass('form_row')
)
->addItem(
(new CRow([
(new CCol(
(new CTextAreaFlexible('macros[#{rowNum}][description]', '', ['add_post_js' => false]))
->setMaxlength(DB::getFieldLength('globalmacro', 'description'))
->setWidth(ZBX_TEXTAREA_STANDARD_WIDTH)
->setAttribute('placeholder', _('description'))
))->addClass(ZBX_STYLE_TEXTAREA_FLEXIBLE_PARENT)->setColSpan(8)
]))->addClass('form_row')
);
$macros_tab
->addItem($macro_row_tmpl)
->addItem($macro_row_inherited_tmpl);
}
// Value mapping tab.
$valuemap_tab = (new CFormList('valuemap-formlist'))->addRow(
_('Value mapping'),
new CPartial('configuration.valuemap', [
'source' => 'template',
'valuemaps' => $data['valuemaps'],
'readonly' => $data['readonly'],
'form' => 'templates',
'table_id' => 'template-valuemap-table',
'with_label' => true
])
);
if ($data['templateid']) {
$buttons = [
[
'title' => _('Update'),
'keepOpen' => true,
'isSubmit' => true,
'action' => 'template_edit_popup.submit();'
],
[
'title' => _('Clone'),
'class' => ZBX_STYLE_BTN_ALT,
'keepOpen' => true,
'isSubmit' => false,
'action' => 'template_edit_popup.clone();'
],
[
'title' => _('Delete'),
'confirmation' => _('Delete template?'),
'class' => ZBX_STYLE_BTN_ALT,
'keepOpen' => true,
'isSubmit' => false,
'action' => 'template_edit_popup.delete();'
],
[
'title' => _('Delete and clear'),
'confirmation' => _('Delete and clear template? (Warning: all linked hosts will be cleared!)'),
'class' => ZBX_STYLE_BTN_ALT,
'keepOpen' => true,
'isSubmit' => false,
'action' => 'template_edit_popup.deleteAndClear();'
]
];
}
else {
$buttons = [
[
'title' => _('Add'),
'keepOpen' => true,
'isSubmit' => true,
'action' => 'template_edit_popup.submit();'
]
];
}
$tabs = (new CTabView(['id' => 'template-tabs']))
->addTab('template-tab', _('Templates'), $template_tab)
->addTab('template-tags-tab', _('Tags'), $tags_tab, TAB_INDICATOR_TAGS)
->addTab('template-macro-tab', _('Macros'),$macros_tab, TAB_INDICATOR_TEMPLATE_MACROS)
->addTab('template-valuemap-tab', _('Value mapping'), $valuemap_tab, TAB_INDICATOR_TEMPLATE_VALUEMAPS)
->setSelected(0);
$form
->addItem($tabs)
->addItem(
(new CScriptTag('
template_edit_popup.init('.json_encode([
'templateid' => $data['templateid'],
'warnings' => $data['warnings']
], JSON_THROW_ON_ERROR).');
'))->setOnDocumentReady()
);
$output = [
'header' => $data['templateid'] === null ? _('New template') : _('Template'),
'doc_url' => CDocHelper::getUrl(CDocHelper::DATA_COLLECTION_TEMPLATES_EDIT),
'body' => $form->toString(),
'buttons' => $buttons,
'script_inline' => getPagePostJs().$this->readJsFile('template.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);