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.

378 lines
15 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.
**/
use Zabbix\Widgets\Fields\CWidgetFieldGraphOverride;
class CWidgetFieldGraphOverrideView extends CWidgetFieldView {
public function __construct(CWidgetFieldGraphOverride $field) {
$this->field = $field;
}
public function getView(): CList {
$view = (new CList())->addClass(ZBX_STYLE_OVERRIDES_LIST);
$i = 0;
foreach ($this->field->getValue() as $override) {
$view->addItem($this->getItemTemplate($override, $i));
$i++;
}
$view->addItem(
(new CDiv(
(new CButton('override_add', _('Add new override')))
->setId('override-add')
->addClass(ZBX_STYLE_BTN_ALT)
->addClass(ZBX_ICON_PLUS_SMALL)
)),
'overrides-foot'
);
return $view;
}
public function getJavaScript(): string {
return '
// Define it as function to avoid redundancy.
function initializeOverrides() {
jQuery("#overrides .'.ZBX_STYLE_OVERRIDES_OPTIONS_LIST.'").overrides({
add: ".'.ZBX_STYLE_BTN_ALT.'",
options: "input[type=hidden]",
captions: '.json_encode($this->getGraphOverrideOptionNames()).',
makeName: function(option, row_id) {
return "'.$this->field->getName().'[" + row_id + "][" + option + "]";
},
makeOption: function(name) {
return name.match(
/.*\[('.implode('|', $this->field->getOverrideOptions()).')\]/
)[1];
},
override: ".'.ZBX_STYLE_OVERRIDES_LIST_ITEM.'",
overridesList: ".'.ZBX_STYLE_OVERRIDES_LIST.'",
onUpdate: () => widget_svggraph_form.onGraphConfigChange(),
menu: '.json_encode($this->getGraphOverrideMenu()).'
});
}
// Initialize dynamicRows.
jQuery("#overrides")
.dynamicRows({
template: "#overrides-row",
allow_empty: true,
beforeRow: ".overrides-foot",
remove: ".js-remove",
add: "#override-add",
row: ".'.ZBX_STYLE_OVERRIDES_LIST_ITEM.'"
})
.bind("afteradd.dynamicRows", function(event, options) {
const container = jQuery(".overlay-dialogue-body");
container.scrollTop(Math.max(container.scrollTop(),
jQuery("#widget-dialogue-form")[0].scrollHeight - container.height()
));
jQuery(".multiselect", jQuery("#overrides")).each(function() {
jQuery(this).multiSelect(jQuery(this).data("params"));
});
widget_svggraph_form.updateVariableOrder(jQuery("#overrides"), ".'.ZBX_STYLE_OVERRIDES_LIST_ITEM.'", "or");
widget_svggraph_form.onGraphConfigChange();
})
.bind("afterremove.dynamicRows", function(event, options) {
widget_svggraph_form.updateVariableOrder(jQuery("#overrides"), ".'.ZBX_STYLE_OVERRIDES_LIST_ITEM.'", "or");
widget_svggraph_form.onGraphConfigChange();
})
.bind("tableupdate.dynamicRows", function(event, options) {
widget_svggraph_form.updateVariableOrder(jQuery("#overrides"), ".'.ZBX_STYLE_OVERRIDES_LIST_ITEM.'", "or");
initializeOverrides();
if (jQuery("#overrides .'.ZBX_STYLE_OVERRIDES_LIST_ITEM.'").length > 1) {
jQuery("#overrides .drag-icon").removeClass("disabled");
jQuery("#overrides").sortable("enable");
}
else {
jQuery("#overrides .drag-icon").addClass("disabled");
jQuery("#overrides").sortable("disable");
}
});
// Initialize overrides UI control.
initializeOverrides();
// Initialize override pattern-selectors.
jQuery(".multiselect", jQuery("#overrides")).each(function() {
jQuery(this).multiSelect(jQuery(this).data("params"));
});
// Make overrides sortable.
if (jQuery("#overrides .'.ZBX_STYLE_OVERRIDES_LIST_ITEM.'").length < 2) {
jQuery("#overrides .drag-icon").addClass("disabled");
}
jQuery("#overrides").sortable({
items: ".'.ZBX_STYLE_OVERRIDES_LIST_ITEM.'",
containment: "parent",
handle: ".drag-icon",
tolerance: "pointer",
scroll: false,
cursor: "grabbing",
opacity: 0.6,
axis: "y",
disabled: function() {
return jQuery("#overrides .'.ZBX_STYLE_OVERRIDES_LIST_ITEM.'").length < 2;
}(),
start: function() { // Workaround to fix wrong scrolling at initial sort.
jQuery(this).sortable("refreshPositions");
},
stop: () => widget_svggraph_form.onGraphConfigChange(),
update: function() {
widget_svggraph_form.updateVariableOrder(jQuery("#overrides"), ".'.ZBX_STYLE_OVERRIDES_LIST_ITEM.'", "or");
}
});
';
}
public function getTemplates(): array {
return [
new CTemplateTag('overrides-row', $this->getItemTemplate(CWidgetFieldGraphOverride::getDefaults()))
];
}
/**
* Function returns array containing string values used as titles for override options.
*/
private function getGraphOverrideOptionNames(): array {
return [
'width' => _('Width'),
'type' => _('Draw'),
'type'.SVG_GRAPH_TYPE_LINE => _('Line'),
'type'.SVG_GRAPH_TYPE_POINTS => _('Points'),
'type'.SVG_GRAPH_TYPE_STAIRCASE => _('Staircase'),
'type'.SVG_GRAPH_TYPE_BAR => _('Bar'),
'transparency' => _('Transparency'),
'fill' => _('Fill'),
'pointsize' => _('Point size'),
'missingdatafunc' => _('Missing data'),
'missingdatafunc'.SVG_GRAPH_MISSING_DATA_NONE => _('None'),
'missingdatafunc'.SVG_GRAPH_MISSING_DATA_CONNECTED => _x('Connected', 'missing data function'),
'missingdatafunc'.SVG_GRAPH_MISSING_DATA_TREAT_AS_ZERO => _x('Treat as 0', 'missing data function'),
'missingdatafunc'.SVG_GRAPH_MISSING_DATA_LAST_KNOWN => _x('Last known', 'missing data function'),
'axisy' => _('Y-axis'),
'axisy'.GRAPH_YAXIS_SIDE_LEFT => _('Left'),
'axisy'.GRAPH_YAXIS_SIDE_RIGHT => _('Right'),
'timeshift' => _('Time shift')
];
}
/**
* Function returns array used to construct override field menu of available override options.
*/
private function getGraphOverrideMenu(): array {
return [
'sections' => [
[
'name' => _('ADD OVERRIDE'),
'options' => [
['name' => _('Base color'), 'callback' => 'addOverride', 'args' => ['color', '']],
['name' => _('Width').'/0', 'callback' => 'addOverride', 'args' => ['width', 0]],
['name' => _('Width').'/1', 'callback' => 'addOverride', 'args' => ['width', 1]],
['name' => _('Width').'/2', 'callback' => 'addOverride', 'args' => ['width', 2]],
['name' => _('Width').'/3', 'callback' => 'addOverride', 'args' => ['width', 3]],
['name' => _('Width').'/4', 'callback' => 'addOverride', 'args' => ['width', 4]],
['name' => _('Width').'/5', 'callback' => 'addOverride', 'args' => ['width', 5]],
['name' => _('Width').'/6', 'callback' => 'addOverride', 'args' => ['width', 6]],
['name' => _('Width').'/7', 'callback' => 'addOverride', 'args' => ['width', 7]],
['name' => _('Width').'/8', 'callback' => 'addOverride', 'args' => ['width', 8]],
['name' => _('Width').'/9', 'callback' => 'addOverride', 'args' => ['width', 9]],
['name' => _('Width').'/10', 'callback' => 'addOverride', 'args' => ['width', 10]],
['name' => _('Draw').'/'._('Line'), 'callback' => 'addOverride', 'args' => ['type', SVG_GRAPH_TYPE_LINE]],
['name' => _('Draw').'/'._('Points'), 'callback' => 'addOverride', 'args' => ['type', SVG_GRAPH_TYPE_POINTS]],
['name' => _('Draw').'/'._('Staircase'), 'callback' => 'addOverride', 'args' => ['type', SVG_GRAPH_TYPE_STAIRCASE]],
['name' => _('Draw').'/'._('Bar'), 'callback' => 'addOverride', 'args' => ['type', SVG_GRAPH_TYPE_BAR]],
['name' => _('Transparency').'/0', 'callback' => 'addOverride', 'args' => ['transparency', 0]],
['name' => _('Transparency').'/1', 'callback' => 'addOverride', 'args' => ['transparency', 1]],
['name' => _('Transparency').'/2', 'callback' => 'addOverride', 'args' => ['transparency', 2]],
['name' => _('Transparency').'/3', 'callback' => 'addOverride', 'args' => ['transparency', 3]],
['name' => _('Transparency').'/4', 'callback' => 'addOverride', 'args' => ['transparency', 4]],
['name' => _('Transparency').'/5', 'callback' => 'addOverride', 'args' => ['transparency', 5]],
['name' => _('Transparency').'/6', 'callback' => 'addOverride', 'args' => ['transparency', 6]],
['name' => _('Transparency').'/7', 'callback' => 'addOverride', 'args' => ['transparency', 7]],
['name' => _('Transparency').'/8', 'callback' => 'addOverride', 'args' => ['transparency', 8]],
['name' => _('Transparency').'/9', 'callback' => 'addOverride', 'args' => ['transparency', 9]],
['name' => _('Transparency').'/10', 'callback' => 'addOverride', 'args' => ['transparency', 10]],
['name' => _('Fill').'/0', 'callback' => 'addOverride', 'args' => ['fill', 0]],
['name' => _('Fill').'/1', 'callback' => 'addOverride', 'args' => ['fill', 1]],
['name' => _('Fill').'/2', 'callback' => 'addOverride', 'args' => ['fill', 2]],
['name' => _('Fill').'/3', 'callback' => 'addOverride', 'args' => ['fill', 3]],
['name' => _('Fill').'/4', 'callback' => 'addOverride', 'args' => ['fill', 4]],
['name' => _('Fill').'/5', 'callback' => 'addOverride', 'args' => ['fill', 5]],
['name' => _('Fill').'/6', 'callback' => 'addOverride', 'args' => ['fill', 6]],
['name' => _('Fill').'/7', 'callback' => 'addOverride', 'args' => ['fill', 7]],
['name' => _('Fill').'/8', 'callback' => 'addOverride', 'args' => ['fill', 8]],
['name' => _('Fill').'/9', 'callback' => 'addOverride', 'args' => ['fill', 9]],
['name' => _('Fill').'/10', 'callback' => 'addOverride', 'args' => ['fill', 10]],
['name' => _('Point size').'/1', 'callback' => 'addOverride', 'args' => ['pointsize', 1]],
['name' => _('Point size').'/2', 'callback' => 'addOverride', 'args' => ['pointsize', 2]],
['name' => _('Point size').'/3', 'callback' => 'addOverride', 'args' => ['pointsize', 3]],
['name' => _('Point size').'/4', 'callback' => 'addOverride', 'args' => ['pointsize', 4]],
['name' => _('Point size').'/5', 'callback' => 'addOverride', 'args' => ['pointsize', 5]],
['name' => _('Point size').'/6', 'callback' => 'addOverride', 'args' => ['pointsize', 6]],
['name' => _('Point size').'/7', 'callback' => 'addOverride', 'args' => ['pointsize', 7]],
['name' => _('Point size').'/8', 'callback' => 'addOverride', 'args' => ['pointsize', 8]],
['name' => _('Point size').'/9', 'callback' => 'addOverride', 'args' => ['pointsize', 9]],
['name' => _('Point size').'/10', 'callback' => 'addOverride', 'args' => ['pointsize', 10]],
['name' => _('Missing data').'/'._('None'), 'callback' => 'addOverride', 'args' => ['missingdatafunc', SVG_GRAPH_MISSING_DATA_NONE]],
['name' => _('Missing data').'/'._x('Connected', 'missing data function'), 'callback' => 'addOverride', 'args' => ['missingdatafunc', SVG_GRAPH_MISSING_DATA_CONNECTED]],
['name' => _('Missing data').'/'._x('Treat as 0', 'missing data function'), 'callback' => 'addOverride', 'args' => ['missingdatafunc', SVG_GRAPH_MISSING_DATA_TREAT_AS_ZERO]],
['name' => _('Missing data').'/'._x('Last known', 'missing data function'), 'callback' => 'addOverride', 'args' => ['missingdatafunc', SVG_GRAPH_MISSING_DATA_LAST_KNOWN]],
['name' => _('Y-axis').'/'._('Left'), 'callback' => 'addOverride', 'args' => ['axisy', GRAPH_YAXIS_SIDE_LEFT]],
['name' => _('Y-axis').'/'._('Right'), 'callback' => 'addOverride', 'args' => ['axisy', GRAPH_YAXIS_SIDE_RIGHT]],
['name' => _('Time shift'), 'callback' => 'addOverride', 'args' => ['timeshift']]
]
]
]
];
}
private function getItemTemplate(array $value, $row_num = '#{rowNum}'): CListItem {
$inputs = [];
// Create override options list.
foreach ($this->field->getOverrideOptions() as $option) {
if (array_key_exists($option, $value)) {
$inputs[] = (new CVar($this->field->getName().'['.$row_num.']['.$option.']', $value[$option]));
}
}
if ($this->field->isTemplateDashboard()) {
$host_pattern_field = null;
$item_pattern_field = (new CPatternSelect([
'name' => $this->field->getName().'['.$row_num.'][items][]',
'object_name' => 'items',
'data' => $value['items'],
'placeholder' => _('item pattern'),
'wildcard_allowed' => 1,
'popup' => [
'parameters' => [
'srctbl' => 'items',
'srcfld1' => 'itemid',
'hostid' => $this->field->getTemplateId(),
'hide_host_filter' => true,
'numeric' => 1,
'dstfrm' => $this->form_name,
'dstfld1' => zbx_formatDomId($this->field->getName().'['.$row_num.'][items][]')
]
],
'add_post_js' => false
]))
->setEnabled(!$this->isDisabled())
->setAriaRequired($this->isRequired());
}
else {
$host_pattern_field = (new CPatternSelect([
'name' => $this->field->getName().'['.$row_num.'][hosts][]',
'object_name' => 'hosts',
'data' => $value['hosts'],
'placeholder' => _('host pattern'),
'wildcard_allowed' => 1,
'popup' => [
'parameters' => [
'srctbl' => 'hosts',
'srcfld1' => 'hostid',
'dstfrm' => $this->form_name,
'dstfld1' => zbx_formatDomId($this->field->getName().'['.$row_num.'][hosts][]')
]
],
'add_post_js' => false
]))
->setEnabled(!$this->isDisabled())
->setAriaRequired($this->isRequired());
$item_pattern_field = (new CPatternSelect([
'name' => $this->field->getName().'['.$row_num.'][items][]',
'object_name' => 'items',
'data' => $value['items'],
'placeholder' => _('item pattern'),
'wildcard_allowed' => 1,
'popup' => [
'parameters' => [
'srctbl' => 'items',
'srcfld1' => 'itemid',
'real_hosts' => 1,
'numeric' => 1,
'dstfrm' => $this->form_name,
'dstfld1' => zbx_formatDomId($this->field->getName().'['.$row_num.'][items][]')
],
'filter_preselect' => [
'id' => $host_pattern_field->getId(),
'submit_as' => 'host_pattern',
'submit_parameters' => [
'host_pattern_wildcard_allowed' => 1,
'host_pattern_multiple' => 1
],
'multiple' => true
]
],
'autosuggest' => [
'filter_preselect' => [
'id' => $host_pattern_field->getId(),
'submit_as' => 'host_pattern',
'submit_parameters' => [
'host_pattern_wildcard_allowed' => 1,
'host_pattern_multiple' => 1
],
'multiple' => true
]
],
'add_post_js' => false
]))
->setEnabled(!$this->isDisabled())
->setAriaRequired($this->isRequired());
}
return (new CListItem([
(new CDiv())->addClass(ZBX_STYLE_DRAG_ICON),
$host_pattern_field,
$item_pattern_field,
(new CDiv(
(new CButtonIcon(ZBX_ICON_REMOVE_SMALLER, _('Delete')))->addClass('js-remove')
))->addClass('list-item-actions'),
(new CList($inputs))
->addClass(ZBX_STYLE_OVERRIDES_OPTIONS_LIST)
->addItem(
(new CSimpleButton())
->addClass(ZBX_STYLE_BTN_ALT)
->addClass(ZBX_ICON_PLUS_SMALL)
->setAttribute('data-row', $row_num)
)
]))->addClass(ZBX_STYLE_OVERRIDES_LIST_ITEM);
}
}