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.
935 lines
27 KiB
935 lines
27 KiB
1 year ago
|
<?php
|
||
|
/*
|
||
|
** 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
|
||
|
*/
|
||
|
|
||
|
$output = [
|
||
|
'header' => $data['title'],
|
||
|
'body' => '',
|
||
|
'controls' => '',
|
||
|
'script_inline' => '',
|
||
|
'buttons' => null
|
||
|
];
|
||
|
|
||
|
$options = $data['options'];
|
||
|
$controls = [];
|
||
|
$form = null;
|
||
|
$script_inline = '';
|
||
|
|
||
|
// Construct table header.
|
||
|
$header_form = ($data['popup_type'] === 'help_items') ? (new CForm()): new CDiv();
|
||
|
$header_form->setId('generic-popup-form');
|
||
|
|
||
|
// Add host group multiselect control.
|
||
|
if (array_key_exists('groups', $data['filter'])) {
|
||
|
$multiselect_options = $data['filter']['groups'];
|
||
|
$multiselect_options['popup']['parameters']['dstfrm'] = $header_form->getId();
|
||
|
|
||
|
$hostgroup_ms = (new CMultiSelect($multiselect_options))->setWidth(ZBX_TEXTAREA_FILTER_STANDARD_WIDTH);
|
||
|
$controls[] = (new CFormList())->addRow(new CLabel(_('Host group'), 'popup_host_group_ms'), $hostgroup_ms);
|
||
|
|
||
|
$script_inline .= $hostgroup_ms->getPostJS(). 'popup_generic.initGroupsFilter();';
|
||
|
}
|
||
|
|
||
|
// Add template group multiselect control.
|
||
|
if (array_key_exists('templategroups', $data['filter'])) {
|
||
|
$multiselect_options = $data['filter']['templategroups'];
|
||
|
$multiselect_options['popup']['parameters']['dstfrm'] = $header_form->getId();
|
||
|
|
||
|
$templategroup_ms = (new CMultiSelect($multiselect_options))->setWidth(ZBX_TEXTAREA_FILTER_STANDARD_WIDTH);
|
||
|
$controls[] = (new CFormList())
|
||
|
->addRow(new CLabel(_('Template group'), 'popup_template_group_ms'), $templategroup_ms);
|
||
|
|
||
|
$script_inline .= $templategroup_ms->getPostJS(). 'popup_generic.initTemplategroupsFilter();';
|
||
|
}
|
||
|
|
||
|
// Add host multiselect.
|
||
|
if (array_key_exists('hosts', $data['filter'])) {
|
||
|
$multiselect_options = $data['filter']['hosts'];
|
||
|
$multiselect_options['popup']['parameters']['dstfrm'] = $header_form->getId();
|
||
|
|
||
|
$host_ms = (new CMultiSelect($multiselect_options))->setWidth(ZBX_TEXTAREA_FILTER_STANDARD_WIDTH);
|
||
|
if ($multiselect_options['disabled']) {
|
||
|
$host_ms->setTitle(_('You cannot switch hosts for current selection.'));
|
||
|
}
|
||
|
$controls[] = (new CFormList())->addRow(new CLabel(_('Host'), 'popup_host_ms'), $host_ms);
|
||
|
|
||
|
$script_inline .= $host_ms->getPostJS(). 'popup_generic.initHostsFilter();';
|
||
|
}
|
||
|
|
||
|
// Add template multiselect.
|
||
|
if (array_key_exists('templates', $data['filter'])) {
|
||
|
$multiselect_options = $data['filter']['templates'];
|
||
|
$multiselect_options['popup']['parameters']['dstfrm'] = $header_form->getId();
|
||
|
|
||
|
$template_ms = (new CMultiSelect($multiselect_options))->setWidth(ZBX_TEXTAREA_FILTER_STANDARD_WIDTH);
|
||
|
if ($multiselect_options['disabled']) {
|
||
|
$template_ms->setTitle(_('You cannot switch templates for current selection.'));
|
||
|
}
|
||
|
$controls[] = (new CFormList())->addRow(new CLabel(_('Template'), 'popup_template_ms'), $template_ms);
|
||
|
|
||
|
$script_inline .= $template_ms->getPostJS(). 'popup_generic.initTemplatesFilter();';
|
||
|
}
|
||
|
|
||
|
// Show Type dropdown in header for help items.
|
||
|
if ($data['popup_type'] === 'help_items') {
|
||
|
switch ($options['itemtype']) {
|
||
|
case ITEM_TYPE_ZABBIX:
|
||
|
case ITEM_TYPE_ZABBIX_ACTIVE:
|
||
|
$popup_doc_url = CDocHelper::ITEM_TYPES_ZABBIX_AGENT;
|
||
|
break;
|
||
|
|
||
|
case ITEM_TYPE_SIMPLE:
|
||
|
$popup_doc_url = CDocHelper::ITEM_TYPES_SIMPLE_CHECK;
|
||
|
break;
|
||
|
|
||
|
case ITEM_TYPE_SNMPTRAP:
|
||
|
$popup_doc_url = CDocHelper::ITEM_TYPES_SNMP_TRAP;
|
||
|
break;
|
||
|
|
||
|
case ITEM_TYPE_INTERNAL:
|
||
|
$popup_doc_url = CDocHelper::ITEM_TYPES_ZABBIX_INTERNAL;
|
||
|
break;
|
||
|
|
||
|
case ITEM_TYPE_DB_MONITOR:
|
||
|
$popup_doc_url = CDocHelper::ITEM_TYPES_DB_MONITOR;
|
||
|
break;
|
||
|
|
||
|
case ITEM_TYPE_IPMI:
|
||
|
$popup_doc_url = CDocHelper::ITEM_TYPES_IPMI_AGENT;
|
||
|
break;
|
||
|
|
||
|
case ITEM_TYPE_JMX:
|
||
|
$popup_doc_url = CDocHelper::ITEM_TYPES_JMX_AGENT;
|
||
|
break;
|
||
|
}
|
||
|
|
||
|
$output['doc_url'] = CDocHelper::getUrl($popup_doc_url);
|
||
|
|
||
|
$types_select = (new CSelect('itemtype'))
|
||
|
->setId('itemtype')
|
||
|
->setFocusableElementId('label-itemtype')
|
||
|
->setAttribute('autofocus', 'autofocus')
|
||
|
->setValue($options['itemtype']);
|
||
|
|
||
|
$script_inline .= 'popup_generic.initHelpItems();';
|
||
|
|
||
|
$header_form
|
||
|
->addVar('srctbl', $data['popup_type'])
|
||
|
->addVar('srcfld1', $options['srcfld1'])
|
||
|
->addVar('dstfrm', $options['dstfrm'])
|
||
|
->addVar('dstfld1', $options['dstfld1']);
|
||
|
|
||
|
foreach (CControllerPopupGeneric::ALLOWED_ITEM_TYPES as $type) {
|
||
|
$types_select->addOption(new CSelectOption($type, item_type2str($type)));
|
||
|
}
|
||
|
|
||
|
$controls[] = [
|
||
|
new CLabel(_('Type'), $types_select->getFocusableElementId()),
|
||
|
(new CDiv())->addClass(ZBX_STYLE_FORM_INPUT_MARGIN),
|
||
|
$types_select
|
||
|
];
|
||
|
}
|
||
|
|
||
|
if ($controls) {
|
||
|
$header_form->addItem($controls);
|
||
|
$output['controls'] = $header_form->toString();
|
||
|
}
|
||
|
|
||
|
// Create form.
|
||
|
if ($data['form']) {
|
||
|
$form = (new CForm())
|
||
|
->setName($data['form']['name'])
|
||
|
->setId($data['form']['id']);
|
||
|
}
|
||
|
|
||
|
$table_columns = [];
|
||
|
|
||
|
if ($data['multiselect'] && $form !== null) {
|
||
|
$ch_box = (new CColHeader(
|
||
|
(new CCheckBox('all_records'))->onClick("checkAll('".$form->getName()."', 'all_records', 'item');")
|
||
|
))->addClass(ZBX_STYLE_CELL_WIDTH);
|
||
|
|
||
|
$table_columns[] = $ch_box;
|
||
|
}
|
||
|
|
||
|
$table = (new CTableInfo())->setHeader(array_merge($table_columns, $data['table_columns']));
|
||
|
|
||
|
if ($data['preselect_required']) {
|
||
|
$table->setNoDataMessage(_('Specify some filter condition to see the values.'));
|
||
|
}
|
||
|
|
||
|
// Output table rows.
|
||
|
switch ($data['popup_type']) {
|
||
|
case 'hosts':
|
||
|
case 'template_groups':
|
||
|
case 'host_groups':
|
||
|
case 'proxies':
|
||
|
case 'host_templates':
|
||
|
case 'templates':
|
||
|
case 'drules':
|
||
|
case 'roles':
|
||
|
case 'api_methods':
|
||
|
case 'dashboard':
|
||
|
case 'sysmaps':
|
||
|
foreach ($data['table_records'] as $item) {
|
||
|
$check_box = $data['multiselect']
|
||
|
? new CCheckBox('item['.$item['id'].']', $item['id'])
|
||
|
: null;
|
||
|
|
||
|
if (array_key_exists('_disabled', $item)) {
|
||
|
if ($data['multiselect']) {
|
||
|
$check_box->setChecked(1);
|
||
|
$check_box->setEnabled(false);
|
||
|
}
|
||
|
$name = $item['name'];
|
||
|
|
||
|
unset($data['table_records'][$item['id']]);
|
||
|
}
|
||
|
else {
|
||
|
$name = (new CLink($item['name']))
|
||
|
->setId('spanid'.$item['id'])
|
||
|
->setAttribute('data-reference', $options['reference'])
|
||
|
->setAttribute('data-itemid', $item['id'])
|
||
|
->setAttribute('data-parentid', $options['parentid'])
|
||
|
->onClick('
|
||
|
addValue(this.dataset.reference, this.dataset.itemid, this.dataset.parentid ?? null);
|
||
|
popup_generic.closePopup(event);
|
||
|
');
|
||
|
}
|
||
|
|
||
|
$table->addRow([$check_box, $name]);
|
||
|
}
|
||
|
break;
|
||
|
|
||
|
case 'users':
|
||
|
foreach ($data['table_records'] as &$user) {
|
||
|
$check_box = $data['multiselect']
|
||
|
? new CCheckBox('item['.$user['userid'].']', $user['userid'])
|
||
|
: null;
|
||
|
|
||
|
if (array_key_exists('_disabled', $user)) {
|
||
|
if ($data['multiselect']) {
|
||
|
$check_box->setChecked(1);
|
||
|
$check_box->setEnabled(false);
|
||
|
}
|
||
|
|
||
|
$table->addRow([$check_box, $user['username'], $user['name'], $user['surname']]);
|
||
|
}
|
||
|
else {
|
||
|
$username = (new CLink($user['username']))
|
||
|
->setId('spanid'.$user['userid'])
|
||
|
->setAttribute('data-reference', $options['reference'])
|
||
|
->setAttribute('data-userid', $user['userid'])
|
||
|
->setAttribute('data-parentid', $options['parentid'])
|
||
|
->onClick('
|
||
|
addValue(this.dataset.reference, this.dataset.userid, this.dataset.parentid ?? null);
|
||
|
popup_generic.closePopup(event);
|
||
|
');
|
||
|
|
||
|
$table->addRow([$check_box, $username, $user['name'], $user['surname']]);
|
||
|
|
||
|
$entry = [];
|
||
|
$srcfld1 = $options['srcfld1'];
|
||
|
if ($srcfld1 === 'userid') {
|
||
|
$entry['id'] = $user['userid'];
|
||
|
}
|
||
|
elseif ($srcfld1 === 'username') {
|
||
|
$entry['name'] = $user['username'];
|
||
|
}
|
||
|
|
||
|
$srcfld2 = $options['srcfld2'];
|
||
|
if ($srcfld2 === 'fullname') {
|
||
|
$entry['name'] = getUserFullname($user);
|
||
|
}
|
||
|
elseif (array_key_exists($srcfld2, $user)) {
|
||
|
$entry[$srcfld2] = $user[$srcfld2];
|
||
|
}
|
||
|
|
||
|
$user = $entry;
|
||
|
}
|
||
|
}
|
||
|
unset($user);
|
||
|
break;
|
||
|
|
||
|
case 'usrgrp':
|
||
|
foreach ($data['table_records'] as &$item) {
|
||
|
$check_box = $data['multiselect']
|
||
|
? new CCheckBox('item['.$item['usrgrpid'].']', $item['usrgrpid'])
|
||
|
: null;
|
||
|
|
||
|
if (array_key_exists('_disabled', $item)) {
|
||
|
if ($data['multiselect']) {
|
||
|
$check_box->setChecked(1);
|
||
|
$check_box->setEnabled(false);
|
||
|
}
|
||
|
|
||
|
$name = $item['name'];
|
||
|
}
|
||
|
else {
|
||
|
$name = (new CLink($item['name']))
|
||
|
->setId('spanid'.$item['usrgrpid'])
|
||
|
->setAttribute('data-reference', $options['reference'])
|
||
|
->setAttribute('data-usrgrpid', $item['usrgrpid'])
|
||
|
->setAttribute('data-parentid', $options['parentid'])
|
||
|
->onClick('
|
||
|
addValue(this.dataset.reference, this.dataset.usrgrpid, this.dataset.parentid ?? null);
|
||
|
popup_generic.closePopup(event);
|
||
|
');
|
||
|
|
||
|
$item['id'] = $item['usrgrpid'];
|
||
|
}
|
||
|
|
||
|
$table->addRow([$check_box, $name]);
|
||
|
}
|
||
|
unset($item);
|
||
|
break;
|
||
|
|
||
|
case 'triggers':
|
||
|
case 'template_triggers':
|
||
|
case 'trigger_prototypes':
|
||
|
foreach ($data['table_records'] as &$trigger) {
|
||
|
$host = reset($trigger['hosts']);
|
||
|
$trigger['hostname'] = $host['name'];
|
||
|
|
||
|
$description = new CLink($trigger['description']);
|
||
|
$trigger['description'] = $trigger['hostname'].NAME_DELIMITER.$trigger['description'];
|
||
|
|
||
|
$check_box = $data['multiselect']
|
||
|
? new CCheckBox('item['.zbx_jsValue($trigger[$options['srcfld1']]).']', $trigger['triggerid'])
|
||
|
: null;
|
||
|
|
||
|
if (array_key_exists('_disabled', $trigger)) {
|
||
|
if ($data['multiselect']) {
|
||
|
$check_box->setChecked(1);
|
||
|
$check_box->setEnabled(false);
|
||
|
}
|
||
|
$description = new CLabel($trigger['description']);
|
||
|
}
|
||
|
|
||
|
if ($data['multiselect']) {
|
||
|
$description
|
||
|
->setAttribute('data-reference', $options['reference'])
|
||
|
->setAttribute('data-triggerid', $trigger['triggerid'])
|
||
|
->setAttribute('data-parentid', $options['parentid'])
|
||
|
->onClick('
|
||
|
addValue(this.dataset.reference, this.dataset.triggerid, this.dataset.parentid ?? null);
|
||
|
popup_generic.closePopup(event);
|
||
|
');
|
||
|
}
|
||
|
else {
|
||
|
$values = [];
|
||
|
|
||
|
if ($options['dstfld1'] !== '' && $options['srcfld1'] !== '') {
|
||
|
$values[$options['dstfld1']] = $trigger[$options['srcfld1']];
|
||
|
}
|
||
|
if ($options['dstfld2'] !== '' && $options['srcfld2'] !== '') {
|
||
|
$values[$options['dstfld2']] = $trigger[$options['srcfld2']];
|
||
|
}
|
||
|
if ($options['dstfld3'] !== '' && $options['srcfld3'] !== '') {
|
||
|
$values[$options['dstfld3']] = $trigger[$options['srcfld3']];
|
||
|
}
|
||
|
|
||
|
$description
|
||
|
->setAttribute('data-dstfrm', $options['dstfrm'])
|
||
|
->setAttribute('data-values', json_encode($values))
|
||
|
->onClick('
|
||
|
addValues(this.dataset.dstfrm, JSON.parse(this.dataset.values));
|
||
|
popup_generic.closePopup(event);
|
||
|
');
|
||
|
}
|
||
|
|
||
|
if ($trigger['dependencies']) {
|
||
|
$description = [$description, BR(), bold(_('Depends on')), BR()];
|
||
|
|
||
|
$dependencies = CMacrosResolverHelper::resolveTriggerNames(
|
||
|
zbx_toHash($trigger['dependencies'], 'triggerid')
|
||
|
);
|
||
|
|
||
|
foreach ($dependencies as $dependency) {
|
||
|
$description[] = $dependency['description'];
|
||
|
$description[] = BR();
|
||
|
}
|
||
|
array_pop($description);
|
||
|
}
|
||
|
|
||
|
$table->addRow([
|
||
|
$check_box,
|
||
|
$description,
|
||
|
CSeverityHelper::makeSeverityCell((int) $trigger['priority']),
|
||
|
(new CSpan(triggerIndicator($trigger['status'], $trigger['state'])))
|
||
|
->addClass(triggerIndicatorStyle($trigger['status'], $trigger['state']))
|
||
|
]);
|
||
|
|
||
|
if ($data['multiselect']) {
|
||
|
$trigger = [
|
||
|
'id' => $trigger['triggerid'],
|
||
|
'name' => $trigger['description'],
|
||
|
'triggerid' => $trigger['triggerid'],
|
||
|
'description' => $trigger['description'],
|
||
|
'expression' => $trigger['expression'],
|
||
|
'priority' => $trigger['priority'],
|
||
|
'status' => $trigger['status'],
|
||
|
'host' => $trigger['hostname']
|
||
|
];
|
||
|
}
|
||
|
}
|
||
|
unset($trigger);
|
||
|
break;
|
||
|
|
||
|
case 'help_items':
|
||
|
foreach ($data['table_records'] as $key => $item) {
|
||
|
$item['key'] = $key;
|
||
|
|
||
|
$values = [
|
||
|
$options['dstfld1'] => $item[$options['srcfld1']]
|
||
|
];
|
||
|
|
||
|
if ($options['dstfld2'] !== '' && $options['srcfld2'] !== '') {
|
||
|
$values[$options['dstfld2']] = $item[$options['srcfld2']];
|
||
|
}
|
||
|
|
||
|
$name = (new CLink($key))
|
||
|
->setAttribute('data-dstfld1', $options['dstfld1'])
|
||
|
->setAttribute('data-dstfld2', $options['dstfld2'])
|
||
|
->setAttribute('data-values', json_encode($values))
|
||
|
->onClick('
|
||
|
const values = JSON.parse(this.dataset.values);
|
||
|
|
||
|
popup_generic.setPopupOpenerFieldValues({[this.dataset.dstfld1]: values[this.dataset.dstfld1]});
|
||
|
|
||
|
document
|
||
|
.getElementById(this.dataset.dstfld1)
|
||
|
.dispatchEvent(new CustomEvent("help_items.paste"));
|
||
|
|
||
|
updateItemFormElements();
|
||
|
|
||
|
if (this.dataset.dstfld2 in values) {
|
||
|
popup_generic.setPopupOpenerFieldValues({[this.dataset.dstfld2]: values[this.dataset.dstfld2]});
|
||
|
}
|
||
|
|
||
|
popup_generic.closePopup(event);
|
||
|
');
|
||
|
|
||
|
$documentation_link = (new CLink(null, CDocHelper::getUrl($item['documentation_link'])))
|
||
|
->addClass(ZBX_STYLE_BTN_ICON)
|
||
|
->addClass(ZBX_ICON_HELP)
|
||
|
->setTitle(_('Help'))
|
||
|
->setTarget('_blank');
|
||
|
|
||
|
$table->addRow([$name, $item['description'], $documentation_link]);
|
||
|
}
|
||
|
unset($data['table_records']);
|
||
|
break;
|
||
|
|
||
|
case 'dchecks':
|
||
|
foreach ($data['table_records'] as $d_rule) {
|
||
|
foreach ($d_rule['dchecks'] as $d_check) {
|
||
|
$name = $d_rule['name'].
|
||
|
NAME_DELIMITER.discovery_check2str($d_check['type'], $d_check['key_'], $d_check['ports'],
|
||
|
$d_check['allow_redirect']
|
||
|
);
|
||
|
|
||
|
$values = [
|
||
|
$options['dstfld1'] => $d_check[$options['srcfld1']]
|
||
|
];
|
||
|
|
||
|
if ($options['dstfld2'] !== '' && $options['srcfld2'] === 'name') {
|
||
|
$values[$options['dstfld2']] = $name;
|
||
|
}
|
||
|
|
||
|
$table->addRow(
|
||
|
(new CLink($name))
|
||
|
->setAttribute('data-dstfld1', $options['dstfld1'])
|
||
|
->setAttribute('data-dstfld2', $options['dstfld2'])
|
||
|
->setAttribute('data-values', json_encode($values))
|
||
|
->onClick('
|
||
|
const values = JSON.parse(this.dataset.values);
|
||
|
|
||
|
popup_generic.setPopupOpenerFieldValues({
|
||
|
[this.dataset.dstfld1]: values[this.dataset.dstfld1]
|
||
|
});
|
||
|
|
||
|
if (this.dataset.dstfld2 in values) {
|
||
|
popup_generic.setPopupOpenerFieldValues({
|
||
|
[this.dataset.dstfld2]: values[this.dataset.dstfld2]
|
||
|
});
|
||
|
}
|
||
|
|
||
|
popup_generic.closePopup(event);
|
||
|
')
|
||
|
);
|
||
|
}
|
||
|
}
|
||
|
unset($data['table_records']);
|
||
|
break;
|
||
|
|
||
|
case 'items':
|
||
|
case 'template_items':
|
||
|
case 'item_prototypes':
|
||
|
|
||
|
if ($options['srcfld2'] !== '' && $options['dstfld2'] !== '') {
|
||
|
// TODO: this condition must be removed after all item and item_prototype fields changing to multiselect
|
||
|
foreach ($data['table_records'] as &$item) {
|
||
|
$host = reset($item['hosts']);
|
||
|
$item['hostname'] = $host['name'];
|
||
|
|
||
|
$description = (new CLink($item['name']))->addClass(ZBX_STYLE_WORDBREAK);
|
||
|
$item['name'] = $item['hostname'].NAME_DELIMITER.$item['name'];
|
||
|
|
||
|
$checkbox_key = is_numeric($item[$options['srcfld1']])
|
||
|
? $item[$options['srcfld1']]
|
||
|
: zbx_jsValue($item[$options['srcfld1']]);
|
||
|
|
||
|
if ($data['multiselect']) {
|
||
|
$description
|
||
|
->setAttribute('data-reference', $options['reference'])
|
||
|
->setAttribute('data-itemid', $options['itemid'])
|
||
|
->setAttribute('data-parentid', $options['parentid'])
|
||
|
->onClick('
|
||
|
addValue(this.dataset.reference, this.dataset.itemid, this.dataset.parentid ?? null);
|
||
|
popup_generic.closePopup(event);
|
||
|
');
|
||
|
}
|
||
|
else {
|
||
|
$values = [];
|
||
|
|
||
|
if ($options['dstfld1'] !== '' && $options['srcfld1'] !== '') {
|
||
|
$values[$options['dstfld1']] = $item[$options['srcfld1']];
|
||
|
}
|
||
|
if ($options['dstfld2'] !== '' && $options['srcfld2'] !== '') {
|
||
|
$values[$options['dstfld2']] = $item[$options['srcfld2']];
|
||
|
}
|
||
|
if ($options['dstfld3'] !== '' && $options['srcfld3'] !== '') {
|
||
|
$values[$options['dstfld3']] = $item[$options['srcfld3']];
|
||
|
}
|
||
|
|
||
|
$description
|
||
|
->setAttribute('data-dstfrm', $options['dstfrm'])
|
||
|
->setAttribute('data-values', json_encode($values))
|
||
|
->onClick('
|
||
|
addValues(this.dataset.dstfrm, JSON.parse(this.dataset.values));
|
||
|
popup_generic.closePopup(event);
|
||
|
');
|
||
|
}
|
||
|
|
||
|
$table->addRow([
|
||
|
$data['multiselect'] ? new CCheckBox('item['.$checkbox_key.']', $item['itemid']) : null,
|
||
|
$description,
|
||
|
(new CDiv($item['key_']))->addClass(ZBX_STYLE_WORDWRAP),
|
||
|
item_type2str($item['type']),
|
||
|
itemValueTypeString($item['value_type']),
|
||
|
($data['popup_type'] === 'items')
|
||
|
? (new CSpan(itemIndicator($item['status'], $item['state'])))
|
||
|
->addClass(itemIndicatorStyle($item['status'], $item['state']))
|
||
|
: null
|
||
|
]);
|
||
|
|
||
|
if ($data['multiselect']) {
|
||
|
$item = [
|
||
|
'id' => $item['itemid'],
|
||
|
'itemid' => $item['itemid'],
|
||
|
'name' => $item['name'],
|
||
|
'key_' => $item['key_'],
|
||
|
'flags' => $item['flags'],
|
||
|
'type' => $item['type'],
|
||
|
'value_type' => $item['value_type'],
|
||
|
'host' => $item['hostname']
|
||
|
];
|
||
|
}
|
||
|
}
|
||
|
unset($item);
|
||
|
}
|
||
|
else {
|
||
|
foreach ($data['table_records'] as &$item) {
|
||
|
$host = reset($item['hosts']);
|
||
|
$item_pattern = array_key_exists('pattern', $item) ? $item['pattern'] : $item['itemid'];
|
||
|
|
||
|
$table->addRow([
|
||
|
$data['multiselect']
|
||
|
? new CCheckBox('item['.$item['itemid'].']', $item_pattern)
|
||
|
: null,
|
||
|
(new CLink($item['name']))
|
||
|
->setAttribute('data-reference', $options['reference'])
|
||
|
->setAttribute('data-pattern', $item_pattern)
|
||
|
->setAttribute('data-parentid', $options['parentid'])
|
||
|
->onClick('
|
||
|
addValue(this.dataset.reference, this.dataset.pattern, this.dataset.parentid ?? null);
|
||
|
popup_generic.closePopup(event);
|
||
|
')
|
||
|
->addClass(ZBX_STYLE_WORDBREAK),
|
||
|
(new CDiv($item['key_']))->addClass(ZBX_STYLE_WORDWRAP),
|
||
|
item_type2str($item['type']),
|
||
|
itemValueTypeString($item['value_type']),
|
||
|
($data['popup_type'] === 'items')
|
||
|
? (new CSpan(itemIndicator($item['status'], $item['state'])))
|
||
|
->addClass(itemIndicatorStyle($item['status'], $item['state']))
|
||
|
: null
|
||
|
]);
|
||
|
|
||
|
$item = [
|
||
|
'id' => $item_pattern,
|
||
|
'itemid' => $item['itemid'],
|
||
|
'name' => $options['patternselect']
|
||
|
? $item['name']
|
||
|
: $host['name'].NAME_DELIMITER.$item['name'],
|
||
|
'key_' => $item['key_'],
|
||
|
'flags' => $item['flags'],
|
||
|
'type' => $item['type'],
|
||
|
'value_type' => $item['value_type'],
|
||
|
'host' => $host['name']
|
||
|
];
|
||
|
}
|
||
|
unset($item);
|
||
|
}
|
||
|
break;
|
||
|
|
||
|
case 'graphs':
|
||
|
case 'graph_prototypes':
|
||
|
foreach ($data['table_records'] as &$graph) {
|
||
|
switch ($graph['graphtype']) {
|
||
|
case GRAPH_TYPE_STACKED:
|
||
|
$graphtype = _('Stacked');
|
||
|
break;
|
||
|
case GRAPH_TYPE_PIE:
|
||
|
$graphtype = _('Pie');
|
||
|
break;
|
||
|
case GRAPH_TYPE_EXPLODED:
|
||
|
$graphtype = _('Exploded');
|
||
|
break;
|
||
|
default:
|
||
|
$graphtype = _('Normal');
|
||
|
break;
|
||
|
}
|
||
|
|
||
|
$table->addRow([
|
||
|
// Multiselect checkbox.
|
||
|
$data['multiselect']
|
||
|
? new CCheckBox('item['.json_encode($graph[$options['srcfld1']]).']', $graph['graphid'])
|
||
|
: null,
|
||
|
|
||
|
// Clickable graph name.
|
||
|
(new CLink($graph['name']))
|
||
|
->setAttribute('data-reference', $options['reference'])
|
||
|
->setAttribute('data-graphid', $graph['graphid'])
|
||
|
->setAttribute('data-parentid', $options['parentid'])
|
||
|
->onClick('
|
||
|
addValue(this.dataset.reference, this.dataset.graphid, this.dataset.parentid ?? null);
|
||
|
popup_generic.closePopup(event);
|
||
|
'),
|
||
|
|
||
|
// Graph type.
|
||
|
$graphtype
|
||
|
]);
|
||
|
|
||
|
if ($options['patternselect']) {
|
||
|
$graph_name = $graph['name'];
|
||
|
}
|
||
|
else {
|
||
|
if ($data['popup_type'] === 'graphs') {
|
||
|
$host_name = $graph['hosts'][0]['name'];
|
||
|
}
|
||
|
else {
|
||
|
$host_names = array_column($graph['hosts'], 'name', 'hostid');
|
||
|
$host_name = $host_names[$graph['discoveryRule']['hostid']];
|
||
|
}
|
||
|
|
||
|
$graph_name = $host_name.NAME_DELIMITER.$graph['name'];
|
||
|
}
|
||
|
|
||
|
// For returned data array.
|
||
|
$graph = [
|
||
|
'id' => $graph['graphid'],
|
||
|
'name' => $graph_name
|
||
|
];
|
||
|
}
|
||
|
unset($graph);
|
||
|
break;
|
||
|
|
||
|
case 'valuemap_names':
|
||
|
foreach ($data['table_records'] as $valuemap) {
|
||
|
$table->addRow([
|
||
|
new CCheckBox('item['.$valuemap['id'].']', $valuemap['id']),
|
||
|
(new CLink($valuemap['name'], '#'))
|
||
|
->setId('spanid'.$valuemap['id'])
|
||
|
->setAttribute('data-reference', $options['reference'])
|
||
|
->setAttribute('data-valuemapid', $valuemap['id'])
|
||
|
->setAttribute('data-parentid', $options['parentid'])
|
||
|
->onClick('
|
||
|
addValue(this.dataset.reference, this.dataset.valuemapid, this.dataset.parentid ?? null);
|
||
|
popup_generic.closePopup(event);
|
||
|
')
|
||
|
]);
|
||
|
}
|
||
|
break;
|
||
|
|
||
|
case 'valuemaps':
|
||
|
case 'template_valuemaps':
|
||
|
foreach ($data['table_records'] as $valuemap) {
|
||
|
$name = [];
|
||
|
$check_box = $data['multiselect']
|
||
|
? new CCheckBox('item['.$valuemap['id'].']', $valuemap['id'])
|
||
|
: null;
|
||
|
|
||
|
$name[] = (new CSpan($valuemap['hostname']))->addClass(ZBX_STYLE_GREY);
|
||
|
$name[] = NAME_DELIMITER;
|
||
|
|
||
|
if (array_key_exists('_disabled', $valuemap) && $valuemap['_disabled']) {
|
||
|
if ($data['multiselect']) {
|
||
|
$check_box->setChecked(1);
|
||
|
$check_box->setEnabled(false);
|
||
|
}
|
||
|
$name[] = (new CSpan($valuemap['name']))->addClass(ZBX_STYLE_GREY);
|
||
|
|
||
|
unset($data['table_records'][$valuemap['id']]);
|
||
|
}
|
||
|
else {
|
||
|
$name[] = (new CLink($valuemap['name'], '#'))
|
||
|
->setId('spanid'.$valuemap['id'])
|
||
|
->setAttribute('data-reference', $options['reference'])
|
||
|
->setAttribute('data-valuemapid', $valuemap['id'])
|
||
|
->setAttribute('data-parentid', $options['parentid'])
|
||
|
->onClick('
|
||
|
addValue(this.dataset.reference, this.dataset.valuemapid, this.dataset.parentid ?? null);
|
||
|
popup_generic.closePopup(event);
|
||
|
');
|
||
|
}
|
||
|
|
||
|
$mappings_table = [];
|
||
|
|
||
|
foreach (array_slice($valuemap['mappings'], 0, 3) as $mapping) {
|
||
|
switch ($mapping['type']) {
|
||
|
case VALUEMAP_MAPPING_TYPE_EQUAL:
|
||
|
$value = '='.$mapping['value'];
|
||
|
break;
|
||
|
|
||
|
case VALUEMAP_MAPPING_TYPE_GREATER_EQUAL:
|
||
|
$value = '>='.$mapping['value'];
|
||
|
break;
|
||
|
|
||
|
case VALUEMAP_MAPPING_TYPE_LESS_EQUAL:
|
||
|
$value = '<='.$mapping['value'];
|
||
|
break;
|
||
|
|
||
|
case VALUEMAP_MAPPING_TYPE_DEFAULT:
|
||
|
$value = new CTag('em', true, _('default'));
|
||
|
break;
|
||
|
|
||
|
default:
|
||
|
$value = $mapping['value'];
|
||
|
}
|
||
|
|
||
|
$mappings_table[] = new CDiv($value);
|
||
|
$mappings_table[] = new CDiv('⇒');
|
||
|
$mappings_table[] = new CDiv($mapping['newvalue']);
|
||
|
}
|
||
|
|
||
|
$hellip = (count($valuemap['mappings']) > 3) ? HELLIP() : null;
|
||
|
$table->addRow([$check_box, $name, [
|
||
|
(new CDiv($mappings_table))->addClass(ZBX_STYLE_VALUEMAP_MAPPINGS_TABLE), $hellip
|
||
|
]]);
|
||
|
}
|
||
|
break;
|
||
|
|
||
|
case 'sla':
|
||
|
foreach ($data['table_records'] as $item) {
|
||
|
$check_box = $data['multiselect']
|
||
|
? new CCheckBox('item['.$item['id'].']', $item['id'])
|
||
|
: null;
|
||
|
|
||
|
if (array_key_exists('_disabled', $item)) {
|
||
|
if ($data['multiselect']) {
|
||
|
$check_box->setChecked(1);
|
||
|
$check_box->setEnabled(false);
|
||
|
}
|
||
|
$name = $item['name'];
|
||
|
|
||
|
unset($data['table_records'][$item['id']]);
|
||
|
}
|
||
|
else {
|
||
|
$name = (new CLink($item['name']))
|
||
|
->setId('spanid'.$item['id'])
|
||
|
->setAttribute('data-reference', $options['reference'])
|
||
|
->setAttribute('data-itemid', $item['id'])
|
||
|
->setAttribute('data-parentid', $options['parentid'])
|
||
|
->onClick('
|
||
|
addValue(this.dataset.reference, this.dataset.itemid, this.dataset.parentid ?? null);
|
||
|
popup_generic.closePopup(event);
|
||
|
');
|
||
|
}
|
||
|
|
||
|
if (array_key_exists('status', $item)) {
|
||
|
$status_tag = $item['status'] == ZBX_SLA_STATUS_ENABLED
|
||
|
? (new CSpan(_('Enabled')))->addClass(ZBX_STYLE_GREEN)
|
||
|
: (new CSpan(_('Disabled')))->addClass(ZBX_STYLE_RED);
|
||
|
}
|
||
|
else {
|
||
|
$status_tag = null;
|
||
|
}
|
||
|
|
||
|
$table->addRow([$check_box, $name, $status_tag]);
|
||
|
}
|
||
|
break;
|
||
|
|
||
|
case 'actions':
|
||
|
foreach ($data['table_records'] as &$action) {
|
||
|
$check_box = $data['multiselect']
|
||
|
? new CCheckBox('item['.$action['actionid'].']', $action['actionid'])
|
||
|
: null;
|
||
|
|
||
|
$name = (new CLink($action['name']))
|
||
|
->setId('spanid'.$action['actionid'])
|
||
|
->setAttribute('data-reference', $options['reference'])
|
||
|
->setAttribute('data-actionid', $action['actionid'])
|
||
|
->setAttribute('data-parentid', $options['parentid'])
|
||
|
->onClick('
|
||
|
addValue(this.dataset.reference, this.dataset.actionid, this.dataset.parentid ?? null);
|
||
|
popup_generic.closePopup(event);
|
||
|
');
|
||
|
|
||
|
$table->addRow([$check_box, $name]);
|
||
|
|
||
|
$entry = [];
|
||
|
|
||
|
if ($options['srcfld1'] === 'actionid') {
|
||
|
$entry['id'] = $action['actionid'];
|
||
|
}
|
||
|
|
||
|
if ($options['srcfld2'] === 'name') {
|
||
|
$entry['name'] = $action['name'];
|
||
|
}
|
||
|
|
||
|
$action = $entry;
|
||
|
}
|
||
|
unset($action);
|
||
|
break;
|
||
|
|
||
|
case 'media_types':
|
||
|
foreach ($data['table_records'] as &$media_type) {
|
||
|
$check_box = $data['multiselect']
|
||
|
? new CCheckBox('item['.$media_type['mediatypeid'].']', $media_type['mediatypeid'])
|
||
|
: null;
|
||
|
|
||
|
$name = (new CLink($media_type['name']))
|
||
|
->setId('spanid'.$media_type['mediatypeid'])
|
||
|
->setAttribute('data-reference', $options['reference'])
|
||
|
->setAttribute('data-mediatypeid', $media_type['mediatypeid'])
|
||
|
->setAttribute('data-parentid', $options['parentid'])
|
||
|
->onClick('
|
||
|
addValue(this.dataset.reference, this.dataset.mediatypeid, this.dataset.parentid ?? null);
|
||
|
popup_generic.closePopup(event);
|
||
|
');
|
||
|
|
||
|
$table->addRow([$check_box, $name]);
|
||
|
|
||
|
$entry = [];
|
||
|
|
||
|
if ($options['srcfld1'] === 'mediatypeid') {
|
||
|
$entry['id'] = $media_type['mediatypeid'];
|
||
|
}
|
||
|
|
||
|
if ($options['srcfld2'] === 'name') {
|
||
|
$entry['name'] = $media_type['name'];
|
||
|
}
|
||
|
|
||
|
$media_type = $entry;
|
||
|
}
|
||
|
unset($media_type);
|
||
|
break;
|
||
|
}
|
||
|
|
||
|
// Add submit button at footer.
|
||
|
if ($data['multiselect'] && $form !== null) {
|
||
|
$form
|
||
|
->setAttribute('data-reference', $options['reference'])
|
||
|
->setAttribute('data-parentid', $options['parentid']);
|
||
|
|
||
|
$output['buttons'] = [
|
||
|
[
|
||
|
'title' => _('Select'),
|
||
|
'class' => '',
|
||
|
'isSubmit' => true,
|
||
|
'action' => '
|
||
|
const form = document.getElementById("'.$form->getId().'");
|
||
|
addSelectedValues(form.dataset.reference, form.dataset.parentid ?? null);
|
||
|
'
|
||
|
]
|
||
|
];
|
||
|
}
|
||
|
|
||
|
// Types require results returned as array.
|
||
|
$types = [
|
||
|
'actions',
|
||
|
'api_methods',
|
||
|
'dashboard',
|
||
|
'graphs',
|
||
|
'graph_prototypes',
|
||
|
'hosts',
|
||
|
'host_templates',
|
||
|
'host_groups',
|
||
|
'template_groups',
|
||
|
'items',
|
||
|
'item_prototypes',
|
||
|
'media_types',
|
||
|
'proxies',
|
||
|
'roles',
|
||
|
'templates',
|
||
|
'users',
|
||
|
'usrgrp',
|
||
|
'sla',
|
||
|
'valuemaps',
|
||
|
'template_valuemaps',
|
||
|
'sysmaps'
|
||
|
];
|
||
|
|
||
|
if (array_key_exists('table_records', $data) && ($data['multiselect'] || in_array($data['popup_type'], $types))) {
|
||
|
$output['data'] = $data['table_records'];
|
||
|
}
|
||
|
|
||
|
$script_inline .= 'popup_generic.init();';
|
||
|
|
||
|
$output['script_inline'] = $this->readJsFile('popup.generic.js.php').
|
||
|
'jQuery(document).ready(function() {'.
|
||
|
$script_inline.
|
||
|
'});';
|
||
|
|
||
|
if ($form) {
|
||
|
// Enable form submitting on Enter.
|
||
|
$form->addItem((new CSubmitButton())->addClass(ZBX_STYLE_FORM_SUBMIT_HIDDEN));
|
||
|
|
||
|
$form->addItem($table);
|
||
|
|
||
|
$output['body'] = (new CDiv([$data['messages'], $form]))->toString();
|
||
|
}
|
||
|
else {
|
||
|
$output['body'] = (new CDiv([$data['messages'], $table]))->toString();
|
||
|
}
|
||
|
|
||
|
if ($data['user']['debug_mode'] == GROUP_DEBUG_MODE_ENABLED) {
|
||
|
CProfiler::getInstance()->stop();
|
||
|
$output['debug'] = CProfiler::getInstance()->make()->toString();
|
||
|
}
|
||
|
|
||
|
echo json_encode($output);
|