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.
223 lines
6.1 KiB
223 lines
6.1 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.
|
|
**/
|
|
|
|
|
|
/**
|
|
* Item value widget view.
|
|
*
|
|
* @var CView $this
|
|
* @var array $data
|
|
*/
|
|
|
|
use Widgets\Item\Widget;
|
|
|
|
if ($data['error'] !== '') {
|
|
$body = (new CTableInfo())->setNoDataMessage($data['error']);
|
|
}
|
|
else {
|
|
$classes_vertical = [
|
|
Widget::POSITION_TOP => 'top',
|
|
Widget::POSITION_MIDDLE => 'middle',
|
|
Widget::POSITION_BOTTOM => 'bottom'
|
|
];
|
|
$classes_horizontal = [
|
|
Widget::POSITION_LEFT => 'left',
|
|
Widget::POSITION_CENTER => 'center',
|
|
Widget::POSITION_RIGHT => 'right'
|
|
];
|
|
|
|
$rows = [];
|
|
|
|
foreach ($classes_vertical as $row_key => $row_class) {
|
|
$cols = [];
|
|
|
|
foreach ($classes_horizontal as $column_key => $column_class) {
|
|
if (!array_key_exists($row_key, $data['cells'])
|
|
|| !array_key_exists($column_key, $data['cells'][$row_key])) {
|
|
continue;
|
|
}
|
|
|
|
$div = new CDiv();
|
|
|
|
$cell = $data['cells'][$row_key][$column_key];
|
|
$cell_type = array_keys($cell)[0];
|
|
$cell_data = array_values($cell)[0];
|
|
|
|
$div->addClass($row_class);
|
|
$div->addClass($column_class);
|
|
|
|
switch ($cell_type) {
|
|
case 'item_description':
|
|
$div->addClass('item-description');
|
|
|
|
if (strpos($cell_data['text'], "\n") !== false) {
|
|
$cell_data['text'] = zbx_nl2br($cell_data['text']);
|
|
$div->addClass('multiline');
|
|
}
|
|
|
|
$div = addTextFormatting($div, $cell_data);
|
|
break;
|
|
|
|
case 'item_time':
|
|
$div->addClass('item-time');
|
|
$div = addTextFormatting($div, $cell_data);
|
|
break;
|
|
|
|
case 'item_value':
|
|
$div->addClass('item-value');
|
|
|
|
if (array_key_exists('value_type', $cell_data)) {
|
|
$div->addClass(($cell_data['value_type'] == ITEM_VALUE_TYPE_FLOAT
|
|
|| $cell_data['value_type'] == ITEM_VALUE_TYPE_UINT64)
|
|
? 'type-number'
|
|
: 'type-text'
|
|
);
|
|
}
|
|
|
|
$div->addItem(drawValueCell($cell_data));
|
|
break;
|
|
}
|
|
|
|
$cols[] = $div;
|
|
}
|
|
|
|
$rows[] = new CDiv($cols);
|
|
}
|
|
|
|
$body = new CDiv(
|
|
new CLink($rows, $data['url'])
|
|
);
|
|
|
|
if ($data['bg_color'] !== '') {
|
|
$body->addStyle('background-color: #'.$data['bg_color'].';');
|
|
}
|
|
}
|
|
|
|
(new CWidgetView($data))
|
|
->addItem($body)
|
|
->show();
|
|
|
|
/**
|
|
* Prepare content for value cell.
|
|
*
|
|
* @param array $cell_data Data with all value cell parts.
|
|
*
|
|
* @return array
|
|
*/
|
|
function drawValueCell(array $cell_data): array {
|
|
$item_cell = [];
|
|
|
|
if (array_key_exists('units', $cell_data['parts'])) {
|
|
$units_div = (new CDiv())->addClass('units');
|
|
$units_div = addTextFormatting($units_div, $cell_data['parts']['units']);
|
|
}
|
|
|
|
// Units ABOVE value.
|
|
if (array_key_exists('units', $cell_data['parts']) && $cell_data['units_pos'] == Widget::POSITION_ABOVE) {
|
|
$item_cell[] = $units_div;
|
|
}
|
|
|
|
$item_content_div = (new CDiv())->addClass('item-value-content');
|
|
|
|
// Units BEFORE value.
|
|
if (array_key_exists('units', $cell_data['parts']) && $cell_data['units_pos'] == Widget::POSITION_BEFORE) {
|
|
$item_content_div->addItem($units_div);
|
|
}
|
|
|
|
if (array_key_exists('value', $cell_data['parts'])) {
|
|
$item_value_div = (new CDiv())->addClass('value');
|
|
|
|
if ($cell_data['parts']['value']['text'] === null) {
|
|
$cell_data['parts']['value']['text'] = _('No data');
|
|
$item_value_div->addClass('item-value-no-data');
|
|
}
|
|
|
|
$item_value_div = addTextFormatting($item_value_div, $cell_data['parts']['value']);
|
|
$item_content_div->addItem($item_value_div);
|
|
}
|
|
|
|
if (array_key_exists('decimals', $cell_data['parts'])) {
|
|
$item_decimals_div = (new CDiv())->addClass('decimals');
|
|
$item_decimals_div = addTextFormatting($item_decimals_div, $cell_data['parts']['decimals']);
|
|
$item_content_div->addItem($item_decimals_div);
|
|
}
|
|
|
|
// Units AFTER value.
|
|
if (array_key_exists('units', $cell_data['parts']) && $cell_data['units_pos'] == Widget::POSITION_AFTER) {
|
|
$item_content_div->addItem($units_div);
|
|
}
|
|
|
|
$item_cell[] = $item_content_div;
|
|
|
|
if (array_key_exists('change_indicator', $cell_data['parts'])) {
|
|
$change_data = $cell_data['parts']['change_indicator'];
|
|
$item_change_div = (new CDiv())->addClass('change-indicator');
|
|
$item_change_div->addStyle(
|
|
sprintf('--widget-item-font: %1$s;', number_format($change_data['font_size'] / 100, 2))
|
|
);
|
|
|
|
switch ($change_data['type']) {
|
|
case Widget::CHANGE_INDICATOR_UP:
|
|
$arrow_data = ['up' => true, 'fill_color' => $change_data['color']];
|
|
break;
|
|
case Widget::CHANGE_INDICATOR_DOWN:
|
|
$arrow_data = ['down' => true, 'fill_color' => $change_data['color']];
|
|
break;
|
|
case Widget::CHANGE_INDICATOR_UP_DOWN:
|
|
$arrow_data = ['up' => true, 'down' => true, 'fill_color' => $change_data['color']];
|
|
break;
|
|
}
|
|
|
|
$item_change_div->addItem(new CSvgArrow($arrow_data));
|
|
$item_content_div->addItem($item_change_div);
|
|
}
|
|
|
|
// Units BELOW value.
|
|
if (array_key_exists('units', $cell_data['parts']) && $cell_data['units_pos'] == Widget::POSITION_BELOW) {
|
|
$item_cell[] = $units_div;
|
|
}
|
|
|
|
return $item_cell;
|
|
}
|
|
|
|
/**
|
|
* Adds formatting and content for text part on widget, based on provided data.
|
|
*
|
|
* @param CDiv $div Div where text element will be displayed.
|
|
* @param array $text_data Text divs settings and content.
|
|
*
|
|
* @return CDiv
|
|
*/
|
|
function addTextFormatting(CDiv $div, array $text_data): CDiv {
|
|
if ($text_data['bold']) {
|
|
$div->addClass('bold');
|
|
}
|
|
|
|
$div->addStyle(sprintf('--widget-item-font: %1$s;', number_format($text_data['font_size'] / 100, 2)));
|
|
|
|
if ($text_data['color'] !== '') {
|
|
$div->addStyle(sprintf('color: #%1$s;', $text_data['color']));
|
|
}
|
|
|
|
$div->addItem($text_data['text']);
|
|
|
|
return $div;
|
|
}
|