Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/zabbix/zabbix.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to 'ui/widgets/item/views/widget.view.php')
-rw-r--r--ui/widgets/item/views/widget.view.php222
1 files changed, 222 insertions, 0 deletions
diff --git a/ui/widgets/item/views/widget.view.php b/ui/widgets/item/views/widget.view.php
new file mode 100644
index 00000000000..9b5eb07c08b
--- /dev/null
+++ b/ui/widgets/item/views/widget.view.php
@@ -0,0 +1,222 @@
+<?php declare(strict_types = 0);
+/*
+** Zabbix
+** Copyright (C) 2001-2022 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;
+}