diff options
Diffstat (limited to 'ui/include/classes/widgets/CWidgetHelper.php')
-rw-r--r-- | ui/include/classes/widgets/CWidgetHelper.php | 1611 |
1 files changed, 0 insertions, 1611 deletions
diff --git a/ui/include/classes/widgets/CWidgetHelper.php b/ui/include/classes/widgets/CWidgetHelper.php deleted file mode 100644 index 4336c73ac7c..00000000000 --- a/ui/include/classes/widgets/CWidgetHelper.php +++ /dev/null @@ -1,1611 +0,0 @@ -<?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. -**/ - - -class CWidgetHelper { - - public const DATASET_TYPE_SINGLE_ITEM = 0; - public const DATASET_TYPE_PATTERN_ITEM = 1; - - /** - * Create CForm for widget configuration form. - * - * @return CForm - */ - public static function createForm(): CForm { - return (new CForm('post')) - ->cleanItems() - ->setId('widget-dialogue-form') - ->setName('widget_dialogue_form') - ->addClass(ZBX_STYLE_DASHBOARD_WIDGET_FORM); - } - - /** - * Create CFormGrid for widget configuration form with default fields in it. - * - * @param string $name - * @param string $type - * @param int $view_mode ZBX_WIDGET_VIEW_MODE_NORMAL | ZBX_WIDGET_VIEW_MODE_HIDDEN_HEADER - * @param array $known_widget_types - * @param CWidgetFieldSelect|null $field_rf_rate - * - * @return CFormGrid - */ - public static function createFormGrid(string $name, string $type, int $view_mode, array $known_widget_types, - ?CWidgetFieldSelect $field_rf_rate): CFormGrid { - - $deprecated_widget_types = array_intersect_key($known_widget_types, - array_flip(CWidgetConfig::DEPRECATED_WIDGETS) - ); - - $widget_types_select = (new CSelect('type')) - ->setFocusableElementId('label-type') - ->setId('type') - ->setValue($type) - ->setAttribute('autofocus', 'autofocus') - ->addOptions(CSelect::createOptionsFromArray( - array_diff_key($known_widget_types, $deprecated_widget_types)) - ); - - if ($deprecated_widget_types) { - $widget_types_select->addOptionGroup( - (new CSelectOptionGroup(_('Deprecated'))) - ->addOptions(CSelect::createOptionsFromArray($deprecated_widget_types)) - ); - } - - return (new CFormGrid()) - ->addItem([ - new CLabel(_('Type'), 'label-type'), - new CFormField(array_key_exists($type, $deprecated_widget_types) - ? [$widget_types_select, ' ', makeWarningIcon(_('Widget is deprecated.'))] - : $widget_types_select - ) - ]) - ->addItem( - (new CFormField( - (new CCheckBox('show_header')) - ->setLabel(_('Show header')) - ->setLabelPosition(CCheckBox::LABEL_POSITION_LEFT) - ->setId('show_header') - ->setChecked($view_mode == ZBX_WIDGET_VIEW_MODE_NORMAL) - ))->addClass('form-field-show-header') - ) - ->addItem([ - new CLabel(_('Name'), 'name'), - new CFormField( - (new CTextBox('name', $name)) - ->setAttribute('placeholder', _('default')) - ->setWidth(ZBX_TEXTAREA_STANDARD_WIDTH) - ) - ]) - ->addItem($field_rf_rate !== null - ? [ - self::getLabel($field_rf_rate), - new CFormField(self::getSelect($field_rf_rate)) - ] - : null - ); - } - - /** - * Creates label linked to the field. - * - * @param CWidgetField $field - * @param string $class Custom CSS class for label. - * @param mixed $hint Hint box text. - * - * @return CLabel - */ - public static function getLabel($field, $class = null, $hint = null) { - $help_icon = ($hint !== null) - ? makeHelpIcon($hint) - : null; - - if ($field instanceof CWidgetFieldSelect) { - return (new CLabel([$field->getLabel(), $help_icon], 'label-'.$field->getName())) - ->setAsteriskMark(self::isAriaRequired($field)) - ->addClass($class); - } - - return (new CLabel([$field->getLabel(), $help_icon], $field->getName())) - ->setAsteriskMark(self::isAriaRequired($field)) - ->addClass($class); - } - - /** - * @param CWidgetFieldSelect $field - * - * @return CSelect - */ - public static function getSelect($field) { - return (new CSelect($field->getName())) - ->setId($field->getName()) - ->setFocusableElementId('label-'.$field->getName()) - ->setValue($field->getValue()) - ->addOptions(CSelect::createOptionsFromArray($field->getValues())) - ->setDisabled($field->getFlags() & CWidgetField::FLAG_DISABLED) - ->setAriaRequired(self::isAriaRequired($field)); - } - - /** - * @param CWidgetFieldTextArea $field - * - * @return CTextArea - */ - public static function getTextArea($field) { - return (new CTextArea($field->getName(), $field->getValue())) - ->setAriaRequired(self::isAriaRequired($field)) - ->setEnabled(!($field->getFlags() & CWidgetField::FLAG_DISABLED)) - ->setAdaptiveWidth($field->getWidth()); - } - - /** - * @param CWidgetFieldTextBox $field - * - * @return CTextBox - */ - public static function getTextBox($field) { - return (new CTextBox($field->getName(), $field->getValue())) - ->setAriaRequired(self::isAriaRequired($field)) - ->setEnabled(!($field->getFlags() & CWidgetField::FLAG_DISABLED)) - ->setAttribute('placeholder', $field->getPlaceholder()) - ->setWidth($field->getWidth()); - } - - /** - * @param CWidgetFieldLatLng $field - * - * @return CTextBox - */ - public static function getLatLngZoomBox($field) { - return (new CTextBox($field->getName(), $field->getValue())) - ->setAttribute('placeholder', $field->getPlaceholder()) - ->setWidth($field->getWidth()); - } - - /** - * @param CWidgetFieldUrl $field - * - * @return CTextBox - */ - public static function getUrlBox($field) { - return (new CTextBox($field->getName(), $field->getValue())) - ->setAriaRequired(self::isAriaRequired($field)) - ->setWidth(ZBX_TEXTAREA_STANDARD_WIDTH); - } - - /** - * @param CWidgetFieldRangeControl $field - * - * @return CRangeControl - */ - public static function getRangeControl($field) { - return (new CRangeControl($field->getName(), (int) $field->getValue())) - ->setEnabled(!($field->getFlags() & CWidgetField::FLAG_DISABLED)) - ->setWidth(ZBX_TEXTAREA_MEDIUM_WIDTH) - ->setStep($field->getStep()) - ->setMin($field->getMin()) - ->setMax($field->getMax()); - } - - /** - * @param CWidgetFieldHostPatternSelect $field Widget field object. - * @param string $form_name HTML form element name. - * - * @return CPatternSelect - */ - public static function getHostPatternSelect($field, $form_name) { - return (new CPatternSelect([ - 'name' => $field->getName().'[]', - 'object_name' => 'hosts', - 'data' => $field->getValue(), - 'placeholder' => $field->getPlaceholder(), - 'wildcard_allowed' => 1, - 'popup' => [ - 'parameters' => [ - 'srctbl' => 'hosts', - 'srcfld1' => 'hostid', - 'dstfrm' => $form_name, - 'dstfld1' => zbx_formatDomId($field->getName().'[]') - ] - ], - 'add_post_js' => false - ])) - ->setEnabled(!($field->getFlags() & CWidgetField::FLAG_DISABLED)) - ->setAriaRequired(self::isAriaRequired($field)) - ->setWidth(ZBX_TEXTAREA_STANDARD_WIDTH); - } - - /** - * @param CWidgetFieldCheckBox $field - * - * @return array - */ - public static function getCheckBox($field) { - return [(new CVar($field->getName(), '0'))->removeId(), (new CCheckBox($field->getName())) - ->setChecked((bool) $field->getValue()) - ->setEnabled(!($field->getFlags() & CWidgetField::FLAG_DISABLED)) - ->setLabel($field->getCaption()) - ->onChange($field->getAction()) - ]; - } - - /** - * @param CWidgetFieldColor $field - * @param bool $use_default Tell the Color picker whether to use Default color feature or not. - * - * @return CColor - */ - public static function getColor($field, $use_default = false) { - // appendColorPickerJs(false), because the script responsible for it is in widget.item.form.view. - $color_picker = (new CColor($field->getName(), $field->getValue()))->appendColorPickerJs(false); - if ($use_default) { - $color_picker->enableUseDefault(); - } - return $color_picker; - } - - /** - * Creates label linked to the multiselect field. - * - * @param CWidgetFieldMs $field - * - * @return CLabel - */ - public static function getMultiselectLabel($field) { - $field_name = $field->getName(); - - if ($field instanceof CWidgetFieldMs) { - $field_name .= ($field->isMultiple() ? '[]' : ''); - } - else { - $field_name .= '[]'; - } - - return (new CLabel($field->getLabel(), $field_name.'_ms')) - ->setAsteriskMark(self::isAriaRequired($field)); - } - - /** - * @param CWidgetFieldMs $field - * @param array $captions - * @param string $form_name - * - * @return CMultiSelect - */ - private static function getMultiselectField($field, $captions, $form_name, $object_name, $popup_options) { - $field_name = $field->getName().($field->isMultiple() ? '[]' : ''); - $options = [ - 'name' => $field_name, - 'object_name' => $object_name, - 'multiple' => $field->isMultiple(), - 'data' => $captions, - 'popup' => [ - 'parameters' => [ - 'dstfrm' => $form_name, - 'dstfld1' => zbx_formatDomId($field_name) - ] + $popup_options - ], - 'add_post_js' => false - ]; - - if ($field instanceof CWidgetFieldMsHost && $field->getFilterPreselect()) { - $options['popup']['filter_preselect']['id'] = $field->getFilterPreselect(); - $options['popup']['filter_preselect']['submit_as'] = 'groupid'; - } - - return (new CMultiSelect($options)) - ->setWidth(ZBX_TEXTAREA_STANDARD_WIDTH) - ->setAriaRequired(self::isAriaRequired($field)); - } - - /** - * @param CWidgetFieldMsGroup $field - * @param array $captions - * @param string $form_name - * - * @return CMultiSelect - */ - public static function getGroup($field, $captions, $form_name) { - return self::getMultiselectField($field, $captions, $form_name, 'hostGroup', [ - 'srctbl' => 'host_groups', - 'srcfld1' => 'groupid', - 'real_hosts' => true, - 'enrich_parent_groups' => true - ] + $field->getFilterParameters()); - } - - /** - * @param CWidgetFieldMsHost $field - * @param array $captions - * @param string $form_name - * - * @return CMultiSelect - */ - public static function getHost($field, $captions, $form_name) { - return self::getMultiselectField($field, $captions, $form_name, 'hosts', [ - 'srctbl' => 'hosts', - 'srcfld1' => 'hostid' - ] + $field->getFilterParameters()); - } - - /** - * @param CWidgetFieldMsItem $field - * @param array $captions - * @param string $form_name - * - * @return CMultiSelect - */ - public static function getItem($field, $captions, $form_name) { - return self::getMultiselectField($field, $captions, $form_name, 'items', [ - 'srctbl' => 'items', - 'srcfld1' => 'itemid' - ] + $field->getFilterParameters()); - } - - /** - * @param CWidgetFieldMsGraph $field - * @param array $captions - * @param string $form_name - * - * @return CMultiSelect - */ - public static function getGraph($field, $captions, $form_name) { - return self::getMultiselectField($field, $captions, $form_name, 'graphs', [ - 'srctbl' => 'graphs', - 'srcfld1' => 'graphid', - 'srcfld2' => 'name', - 'with_graphs' => true - ] + $field->getFilterParameters()); - } - - /** - * @param CWidgetFieldMsItemPrototype $field - * @param array $captions - * @param string $form_name - * - * @return CMultiSelect - */ - public static function getItemPrototype($field, $captions, $form_name) { - return self::getMultiselectField($field, $captions, $form_name, 'item_prototypes', [ - 'srctbl' => 'item_prototypes', - 'srcfld1' => 'itemid' - ] + $field->getFilterParameters()); - } - - /** - * @param CWidgetFieldMsGraphPrototype $field - * @param array $captions - * @param string $form_name - * - * @return CMultiSelect - */ - public static function getGraphPrototype($field, $captions, $form_name) { - return self::getMultiselectField($field, $captions, $form_name, 'graph_prototypes', [ - 'srctbl' => 'graph_prototypes', - 'srcfld1' => 'graphid', - 'srcfld2' => 'name', - 'with_graph_prototypes' => true - ] + $field->getFilterParameters()); - } - - /** - * @param CWidgetFieldMsService $field - * @param array $captions - * @param string $form_name - * - * @return CMultiSelect - */ - public static function getService($field, $captions, $form_name) { - return (new CMultiSelect([ - 'name' => $field->getName().($field->isMultiple() ? '[]' : ''), - 'object_name' => 'services', - 'multiple' => $field->isMultiple(), - 'data' => $captions, - 'custom_select' => true, - 'add_post_js' => false - ])) - ->setWidth(ZBX_TEXTAREA_STANDARD_WIDTH) - ->setAriaRequired(self::isAriaRequired($field)); - } - - /** - * @param CWidgetFieldMsSla $field - * @param array $captions - * @param string $form_name - * - * @return CMultiSelect - */ - public static function getSla($field, $captions, $form_name) { - return self::getMultiselectField($field, $captions, $form_name, 'sla', [ - 'srctbl' => 'sla', - 'srcfld1' => 'slaid' - ] + $field->getFilterParameters()); - } - - public static function getSelectResource($field, $caption, $form_name) { - return [ - (new CTextBox($field->getName().'_caption', $caption, true)) - ->setWidth(ZBX_TEXTAREA_STANDARD_WIDTH) - ->setAriaRequired(self::isAriaRequired($field)), - (new CDiv())->addClass(ZBX_STYLE_FORM_INPUT_MARGIN), - (new CButton('select', _('Select'))) - ->addClass(ZBX_STYLE_BTN_GREY) - ->onClick('return PopUp("popup.generic", '.json_encode($field->getPopupOptions($form_name)).', - {dialogue_class: "modal-popup-generic"} - );') - ]; - } - - /** - * Creates select field without values, to later fill it by JS script. - * - * @param CWidgetFieldWidgetSelect $field - * - * @return CSelect - */ - public static function getEmptySelect($field) { - return (new CSelect($field->getName())) - ->setFocusableElementId('label-'.$field->getName()) - ->setId($field->getName()) - ->setWidth(ZBX_TEXTAREA_STANDARD_WIDTH) - ->setAriaRequired(self::isAriaRequired($field)); - } - - /** - * @param CWidgetFieldIntegerBox $field - * - * @return CNumericBox - */ - public static function getIntegerBox(CWidgetFieldIntegerBox $field): CNumericBox { - return (new CNumericBox($field->getName(), $field->getValue(), $field->getMaxLength(), false, - ($field->getFlags() & CWidgetField::FLAG_NOT_EMPTY) == 0 - )) - ->setWidth(ZBX_TEXTAREA_NUMERIC_STANDARD_WIDTH) - ->setAriaRequired(self::isAriaRequired($field)); - } - - /** - * @param CWidgetFieldNumericBox $field - * - * @return CTextBox - */ - public static function getNumericBox($field) { - return (new CTextBox($field->getName(), $field->getValue())) - ->setAriaRequired(self::isAriaRequired($field)) - ->setEnabled(!($field->getFlags() & CWidgetField::FLAG_DISABLED)) - ->setAttribute('placeholder', $field->getPlaceholder()) - ->setWidth($field->getWidth()); - } - - /** - * @param CWidgetFieldRadioButtonList $field - * - * @return CRadioButtonList - */ - public static function getRadioButtonList($field) { - $radio_button_list = (new CRadioButtonList($field->getName(), $field->getValue())) - ->setModern($field->getModern()) - ->setAriaRequired(self::isAriaRequired($field)); - - foreach ($field->getValues() as $key => $value) { - $radio_button_list - ->addValue($value, $key, null, $field->getAction()) - ->setEnabled(!($field->getFlags() & CWidgetField::FLAG_DISABLED)); - } - - return $radio_button_list; - } - - /** - * @param CWidgetFieldSeverities $field - * - * @return CSeverityCheckBoxList - */ - public static function getSeverities($field) { - return (new CSeverityCheckBoxList($field->getName())) - ->setChecked($field->getValue()) - ->setEnabled(!($field->getFlags() & CWidgetField::FLAG_DISABLED)) - ->setWidth(ZBX_TEXTAREA_STANDARD_WIDTH); - } - - /** - * @param CWidgetFieldCheckBoxList $field - * @param array $list Option list array. - * @param array $class_list List of additional CSS classes. - * - * @return CList - */ - public static function getCheckBoxList($field, array $list, array $class_list = []) { - $checkbox_list = (new CList())->addClass(ZBX_STYLE_LIST_CHECK_RADIO); - if ($class_list) { - foreach ($class_list as $class) { - $checkbox_list->addClass($class); - } - } - - foreach ($list as $key => $label) { - $checkbox_list->addItem( - (new CCheckBox($field->getName().'[]', $key)) - ->setLabel($label) - ->setId($field->getName().'_'.$key) - ->setChecked(in_array($key, $field->getValue())) - ->setEnabled(!($field->getFlags() & CWidgetField::FLAG_DISABLED)) - ); - } - - return $checkbox_list; - } - - /** - * @param CWidgetFieldColumnsList $field Widget columns field. - * - * @return CDiv - */ - public static function getWidgetColumns(CWidgetFieldColumnsList $field) { - $columns = $field->getValue(); - $header = [ - '', - (new CColHeader(_('Name')))->addStyle('width: 39%'), - (new CColHeader(_('Data')))->addStyle('width: 59%'), - _('Action') - ]; - $row_actions = [ - (new CButton('edit', _('Edit'))) - ->addClass(ZBX_STYLE_BTN_LINK) - ->removeId(), - (new CButton('remove', _('Remove'))) - ->addClass(ZBX_STYLE_BTN_LINK) - ->removeId() - ]; - $table = (new CTable()) - ->setId('list_'.$field->getName()) - ->setHeader($header); - $enabled = !($field->getFlags() & CWidgetField::FLAG_DISABLED); - - foreach ($columns as $column_index => $column) { - $column_data = [new CVar('sortorder['.$field->getName().'][]', $column_index)]; - - foreach ($column as $key => $value) { - $column_data[] = new CVar($field->getName().'['.$column_index.']['.$key.']', $value); - } - - $label = array_key_exists('item', $column) ? $column['item'] : ''; - - if ($column['data'] == CWidgetFieldColumnsList::DATA_HOST_NAME) { - $label = new CTag('em', true, _('Host name')); - } - else if ($column['data'] == CWidgetFieldColumnsList::DATA_TEXT) { - $label = new CTag('em', true, $column['text']); - } - - $table->addRow((new CRow([ - (new CCol((new CDiv)->addClass(ZBX_STYLE_DRAG_ICON)))->addClass(ZBX_STYLE_TD_DRAG_ICON), - (new CDiv($column['name']))->addClass('text'), - (new CDiv($label))->addClass('text'), - (new CList(array_merge($row_actions, [$column_data])))->addClass(ZBX_STYLE_HOR_LIST) - ]))->addClass('sortable')); - } - - $table->addRow( - (new CCol( - (new CButton('add', _('Add'))) - ->addClass(ZBX_STYLE_BTN_LINK) - ->setEnabled($enabled) - ))->setColSpan(count($header)) - ); - - return $table; - } - - /** - * @param CWidgetFieldTags $field - * - * @return CTable - */ - public static function getTags($field) { - $tags = $field->getValue(); - - if (!$tags) { - $tags = [['tag' => '', 'operator' => TAG_OPERATOR_LIKE, 'value' => '']]; - } - - $tags_table = (new CTable()) - ->setId('tags_table_'.$field->getName()) - ->addClass('table-tags') - ->addClass('table-initial-width'); - - $enabled = !($field->getFlags() & CWidgetField::FLAG_DISABLED); - $i = 0; - - foreach ($tags as $tag) { - $zselect_operator = (new CSelect($field->getName().'['.$i.'][operator]')) - ->addOptions(CSelect::createOptionsFromArray([ - TAG_OPERATOR_EXISTS => _('Exists'), - TAG_OPERATOR_EQUAL => _('Equals'), - TAG_OPERATOR_LIKE => _('Contains'), - TAG_OPERATOR_NOT_EXISTS => _('Does not exist'), - TAG_OPERATOR_NOT_EQUAL => _('Does not equal'), - TAG_OPERATOR_NOT_LIKE => _('Does not contain') - ])) - ->setValue($tag['operator']) - ->setFocusableElementId($field->getName().'-'.$i.'-operator-select') - ->setId($field->getName().'_'.$i.'_operator'); - - if (!$enabled) { - $zselect_operator->setDisabled(); - } - - $tags_table->addRow([ - (new CTextBox($field->getName().'['.$i.'][tag]', $tag['tag'])) - ->setAttribute('placeholder', _('tag')) - ->setWidth(ZBX_TEXTAREA_FILTER_SMALL_WIDTH) - ->setAriaRequired(self::isAriaRequired($field)) - ->setEnabled($enabled), - $zselect_operator, - (new CTextBox($field->getName().'['.$i.'][value]', $tag['value'])) - ->setAttribute('placeholder', _('value')) - ->setWidth(ZBX_TEXTAREA_FILTER_SMALL_WIDTH) - ->setAriaRequired(self::isAriaRequired($field)) - ->setId($field->getName().'_'.$i.'_value') - ->setEnabled($enabled), - (new CCol( - (new CButton($field->getName().'['.$i.'][remove]', _('Remove'))) - ->addClass(ZBX_STYLE_BTN_LINK) - ->addClass('element-table-remove') - ->setEnabled($enabled) - ))->addClass(ZBX_STYLE_NOWRAP) - ], 'form_row'); - - $i++; - } - - $tags_table->addRow( - (new CCol( - (new CButton('tags_add', _('Add'))) - ->addClass(ZBX_STYLE_BTN_LINK) - ->addClass('element-table-add') - ->setEnabled($enabled) - ))->setColSpan(3) - ); - - return $tags_table; - } - - /** - * JS Template for one tag line for Tags field - * - * @param CWidgetFieldTags $field - * - * @return string - */ - public static function getTagsTemplate($field) { - return (new CRow([ - (new CTextBox($field->getName().'[#{rowNum}][tag]')) - ->setAttribute('placeholder', _('tag')) - ->setWidth(ZBX_TEXTAREA_FILTER_SMALL_WIDTH) - ->setAriaRequired(self::isAriaRequired($field)), - (new CSelect($field->getName().'[#{rowNum}][operator]')) - ->addOptions(CSelect::createOptionsFromArray([ - TAG_OPERATOR_EXISTS => _('Exists'), - TAG_OPERATOR_EQUAL => _('Equals'), - TAG_OPERATOR_LIKE => _('Contains'), - TAG_OPERATOR_NOT_EXISTS => _('Does not exist'), - TAG_OPERATOR_NOT_EQUAL => _('Does not equal'), - TAG_OPERATOR_NOT_LIKE => _('Does not contain') - ])) - ->setValue(TAG_OPERATOR_LIKE) - ->setFocusableElementId($field->getName().'-#{rowNum}-operator-select') - ->setId($field->getName().'_#{rowNum}_operator'), - (new CTextBox($field->getName().'[#{rowNum}][value]')) - ->setAttribute('placeholder', _('value')) - ->setWidth(ZBX_TEXTAREA_FILTER_SMALL_WIDTH) - ->setAriaRequired(self::isAriaRequired($field)) - ->setId($field->getName().'_#{rowNum}_value'), - (new CCol( - (new CButton($field->getName().'[#{rowNum}][remove]', _('Remove'))) - ->addClass(ZBX_STYLE_BTN_LINK) - ->addClass('element-table-remove') - ))->addClass(ZBX_STYLE_NOWRAP) - ])) - ->addClass('form_row') - ->toString(); - } - - /** - * @param CWidgetFieldDatePicker $field - * - * @return CDateSelector - */ - public static function getDatePicker(CWidgetFieldDatePicker $field): CDateSelector { - return (new CDateSelector($field->getName(), $field->getValue())) - ->setAriaRequired(self::isAriaRequired($field)) - ->setMaxLength(DB::getFieldLength('widget_field', 'value_str')) - ->setEnabled(($field->getFlags() & CWidgetField::FLAG_DISABLED) == 0); - } - - /** - * Function returns array containing HTML objects filled with given values. Used to generate HTML in widget - * overrides field. - * - * @param CWidgetFieldGraphOverride $field - * @param array $value Values to fill in particular data set row. See self::setValue() for - * detailed description. - * @param string $form_name Name of form in which data set fields resides. - * @param int|string $row_num Unique data set numeric identifier. Used to make unique field names. - * - * @return CListItem - */ - public static function getGraphOverrideLayout($field, array $value, $form_name, $row_num) { - $inputs = []; - - // Create override options list. - foreach (CWidgetFieldGraphOverride::getOverrideOptions() as $option) { - if (array_key_exists($option, $value)) { - $inputs[] = (new CVar($field->getName().'['.$row_num.']['.$option.']', $value[$option])); - } - } - - return (new CListItem([ - /** - * First line: host pattern field, item pattern field. - * Contains also drag and drop button and delete button. - */ - (new CDiv([ - (new CDiv()) - ->addClass(ZBX_STYLE_DRAG_ICON) - ->addStyle('position: absolute; margin-left: -25px;'), - (new CDiv([ - (new CDiv( - (new CPatternSelect([ - 'name' => $field->getName().'['.$row_num.'][hosts][]', - 'object_name' => 'hosts', - 'data' => $value['hosts'], - 'placeholder' => _('host pattern'), - 'wildcard_allowed' => 1, - 'popup' => [ - 'parameters' => [ - 'srctbl' => 'hosts', - 'srcfld1' => 'hostid', - 'dstfrm' => $form_name, - 'dstfld1' => zbx_formatDomId($field->getName().'['.$row_num.'][hosts][]') - ] - ], - 'add_post_js' => false - ])) - ->setEnabled(!($field->getFlags() & CWidgetField::FLAG_DISABLED)) - ->setAriaRequired(self::isAriaRequired($field)) - ->setWidth(ZBX_TEXTAREA_MEDIUM_WIDTH) - ))->addClass(ZBX_STYLE_COLUMN_50), - (new CDiv( - (new CPatternSelect([ - 'name' => $field->getName().'['.$row_num.'][items][]', - 'object_name' => 'items', - 'data' => $value['items'], - 'placeholder' => _('item pattern'), - 'multiple' => true, - 'wildcard_allowed' => 1, - 'popup' => [ - 'parameters' => [ - 'srctbl' => 'items', - 'srcfld1' => 'itemid', - 'real_hosts' => 1, - 'numeric' => 1, - 'dstfrm' => $form_name, - 'dstfld1' => zbx_formatDomId($field->getName().'['.$row_num.'][items][]') - ] - ], - 'add_post_js' => false - ])) - ->setEnabled(!($field->getFlags() & CWidgetField::FLAG_DISABLED)) - ->setAriaRequired(self::isAriaRequired($field)) - ->setWidth(ZBX_TEXTAREA_MEDIUM_WIDTH) - ))->addClass(ZBX_STYLE_COLUMN_50) - ])) - ->addClass(ZBX_STYLE_COLUMNS) - ->addClass(ZBX_STYLE_COLUMNS_NOWRAP) - ->addClass(ZBX_STYLE_COLUMN_95), - - (new CDiv( - (new CButton()) - ->setAttribute('title', _('Delete')) - ->addClass(ZBX_STYLE_BTN_REMOVE) - ->removeId() - )) - ->addClass(ZBX_STYLE_COLUMN_5) - ])) - ->addClass(ZBX_STYLE_COLUMNS), - - // Selected override options. - (new CList($inputs)) - ->addClass(ZBX_STYLE_OVERRIDES_OPTIONS_LIST) - ->addItem((new CButton(null, (new CSpan()) - ->addClass(ZBX_STYLE_PLUS_ICON) - ->addStyle('margin-right: 0px;') - )) - ->setAttribute('data-row', $row_num) - ->addClass(ZBX_STYLE_BTN_ALT) - ) - ])) - ->addClass(ZBX_STYLE_OVERRIDES_LIST_ITEM); - } - - /** - * Return template used by dynamic rows in CWidgetFieldGraphOverride field. - * - * @param CWidgetFieldGraphOverride $field - * @param string $form_name Form name in which override field is located. - * - * @return string - */ - public static function getGraphOverrideTemplate($field, $form_name) { - $value = CWidgetFieldGraphOverride::getDefaults(); - - return self::getGraphOverrideLayout($field, $value, $form_name, '#{rowNum}')->toString(); - } - - /** - * @param CWidgetFieldGraphOverride $field - * - * @return CList - */ - public static function getGraphOverride($field, $form_name) { - $list = (new CList())->addClass(ZBX_STYLE_OVERRIDES_LIST); - - $values = $field->getValue(); - - if (!$values) { - $values = []; - } - - $i = 0; - - foreach ($values as $override) { - $list->addItem(self::getGraphOverrideLayout($field, $override, $form_name, $i)); - - $i++; - } - - // Add 'Add' button under the list. - $list->addItem( - (new CDiv( - (new CButton('override_add', [(new CSpan())->addClass(ZBX_STYLE_PLUS_ICON), _('Add new override')])) - ->addClass(ZBX_STYLE_BTN_ALT) - ->setId('override-add') - )), - 'overrides-foot' - ); - - return $list; - } - - /** - * Function returns array containing string values used as titles for override options. - * - * @return array - */ - private static function getGraphOverrideOptionNames() { - 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. - * - * @return array - */ - private static function getGraphOverrideMenu() { - 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']] - ] - ] - ] - ]; - } - - /** - * Return javascript necessary to initialize CWidgetFieldGraphOverride field. - * - * @param CWidgetFieldGraphOverride $field - * - * @return string - */ - public static function getGraphOverrideJavascript($field) { - 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(self::getGraphOverrideOptionNames()).', - makeName: function(option, row_id) { - return "'.$field->getName().'[" + row_id + "][" + option + "]"; - }, - makeOption: function(name) { - return name.match( - /.*\[('.implode('|', CWidgetFieldGraphOverride::getOverrideOptions()).')\]/ - )[1]; - }, - override: ".'.ZBX_STYLE_OVERRIDES_LIST_ITEM.'", - overridesList: ".'.ZBX_STYLE_OVERRIDES_LIST.'", - onUpdate: () => widget_svggraph_form.onGraphConfigChange(), - menu: '.json_encode(self::getGraphOverrideMenu()).' - }); - } - - // Initialize dynamicRows. - jQuery("#overrides") - .dynamicRows({ - template: "#overrides-row", - beforeRow: ".overrides-foot", - remove: ".'.ZBX_STYLE_BTN_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"); - } - }); - '; - } - - /** - * Function returns array containing HTML objects filled with given values. Used to generate HTML row in widget - * data set field. - * - * @param string $field_name - * @param array $value Values to fill in particular data set row. See self::setValue() for detailed - * description. - * @param string $form_name Name of form in which data set fields resides. - * @param int|string $row_num Unique data set numeric identifier. Used to make unique field names. - * @param bool $is_opened Either accordion row is made opened or closed. - * - * @return CListItem - */ - private static function getGraphDataSetLayout($field_name, array $value, $form_name, $row_num, $is_opened, - int $dataset_type = CWidgetHelper::DATASET_TYPE_PATTERN_ITEM) { - $dataset_head = [ - new CDiv((new CSimpleButton(' '))->addClass(ZBX_STYLE_LIST_ACCORDION_ITEM_TOGGLE)), - new CVar($field_name.'['.$row_num.'][dataset_type]', $dataset_type, '') - ]; - - if ($dataset_type == self::DATASET_TYPE_PATTERN_ITEM) { - $host_pattern_field = (new CPatternSelect([ - 'name' => $field_name.'['.$row_num.'][hosts][]', - 'object_name' => 'hosts', - 'data' => $value['hosts'], - 'placeholder' => _('host pattern'), - 'wildcard_allowed' => 1, - 'popup' => [ - 'parameters' => [ - 'srctbl' => 'hosts', - 'srcfld1' => 'host', - 'dstfrm' => $form_name, - 'dstfld1' => zbx_formatDomId($field_name.'['.$row_num.'][hosts][]') - ] - ], - 'add_post_js' => false - ])) - ->addClass('js-hosts-multiselect') - ->setWidth(ZBX_TEXTAREA_MEDIUM_WIDTH); - - $dataset_head = array_merge($dataset_head, [ - (new CColor($field_name.'['.$row_num.'][color]', $value['color']))->appendColorPickerJs(false), - $host_pattern_field, - (new CPatternSelect([ - 'name' => $field_name.'['.$row_num.'][items][]', - 'object_name' => 'items', - 'data' => $value['items'], - 'placeholder' => _('item pattern'), - 'wildcard_allowed' => 1, - 'popup' => [ - 'parameters' => [ - 'srctbl' => 'items', - 'srcfld1' => 'name', - 'real_hosts' => 1, - 'numeric' => 1, - 'dstfrm' => $form_name, - 'dstfld1' => zbx_formatDomId($field_name.'['.$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 - ])) - ->addClass('js-items-multiselect') - ->setWidth(ZBX_TEXTAREA_MEDIUM_WIDTH) - ]); - } - else { - $item_rows = []; - foreach($value['itemids'] as $i => $itemid) { - $item_name = array_key_exists($itemid, $value['item_names']) - ? $value['item_names'][$itemid] - : ''; - - $item_rows[] = (new CRow([ - (new CCol( - (new CDiv())->addClass(ZBX_STYLE_DRAG_ICON) - )) - ->addClass('table-col-handle') - ->addClass(ZBX_STYLE_TD_DRAG_ICON), - (new CCol( - (new CColor($field_name.'['.$row_num.'][color][]', $value['color'][$i], - 'items_'.$row_num.'_'.($i + 1).'_color' - ))->appendColorPickerJs(false) - ))->addClass('table-col-color'), - (new CCol(new CSpan(($i + 1).':')))->addClass('table-col-no'), - (new CCol( - (new CLink($item_name)) - ->setId('items_'.$row_num.'_'.($i + 1).'_name') - ->addClass('js-click-expend') - ))->addClass('table-col-name'), - (new CCol([ - (new CButton('button', _('Remove'))) - ->addClass(ZBX_STYLE_BTN_LINK) - ->addClass('element-table-remove'), - new CVar($field_name.'['.$row_num.'][itemids][]', $itemid, - 'items_'.$row_num.'_'.($i + 1).'_input' - ) - ])) - ->addClass('table-col-action') - ->addClass(ZBX_STYLE_NOWRAP) - ])) - ->addClass(ZBX_STYLE_SORTABLE) - ->addClass('single-item-table-row'); - } - - $empty_msg_block = (new CDiv(_('No item selected.')))->addClass('no-items-message'); - - $items_list = (new CTable()) - ->addClass('single-item-table') - ->setAttribute('data-set', $row_num) - ->setColumns([ - (new CTableColumn())->addClass('table-col-handle'), - (new CTableColumn())->addClass('table-col-color'), - (new CTableColumn())->addClass('table-col-no'), - (new CTableColumn(_('Name')))->addClass('table-col-name'), - (new CTableColumn(_('Action')))->addClass('table-col-action') - ]) - ->addItem([ - $item_rows, - (new CTag('tfoot', true)) - ->addItem( - (new CCol( - (new CList()) - ->addClass(ZBX_STYLE_INLINE_FILTER_FOOTER) - ->addItem( - (new CSimpleButton(_('Add'))) - ->addClass(ZBX_STYLE_BTN_LINK) - ->addClass('js-add-item') - ) - ))->setColSpan(5) - ) - ]); - - $dataset_head = array_merge($dataset_head, [ - (new CDiv([$empty_msg_block, $items_list]))->addClass('items-list table-forms-separator') - ]); - } - - $dataset_head[] = (new CDiv( - (new CButton()) - ->setAttribute('title', _('Delete')) - ->addClass(ZBX_STYLE_BTN_REMOVE) - ->removeId() - ))->addClass('dataset-actions'); - - return (new CListItem([ - (new CDiv()) - ->addClass(ZBX_STYLE_DRAG_ICON) - ->addClass(ZBX_STYLE_SORTABLE_DRAG_HANDLE) - ->addClass('js-main-drag-icon'), - (new CDiv()) - ->addClass(ZBX_STYLE_LIST_ACCORDION_ITEM_HEAD) - ->addClass('dataset-head') - ->addItem($dataset_head), - (new CDiv()) - ->addClass(ZBX_STYLE_LIST_ACCORDION_ITEM_BODY) - ->addClass('dataset-body') - ->addItem([ - (new CFormGrid()) - ->addItem([ - new CLabel(_('Draw')), - new CFormField( - (new CRadioButtonList($field_name.'['.$row_num.'][type]', (int) $value['type'])) - ->addClass('js-type') - ->addValue(_('Line'), SVG_GRAPH_TYPE_LINE) - ->addValue(_('Points'), SVG_GRAPH_TYPE_POINTS) - ->addValue(_('Staircase'), SVG_GRAPH_TYPE_STAIRCASE) - ->addValue(_('Bar'), SVG_GRAPH_TYPE_BAR) - ->setModern(true) - ) - ]) - ->addItem([ - new CLabel(_('Stacked'), $field_name.'['.$row_num.'][stacked]'), - new CFormField([ - (new CVar($field_name.'['.$row_num.'][stacked]', '0'))->removeId(), - (new CCheckBox($field_name.'['.$row_num.'][stacked]')) - ->addClass('js-stacked') - ->setChecked((bool) $value['stacked']) - ->setEnabled($value['type'] != SVG_GRAPH_TYPE_POINTS) - ]) - ]) - ->addItem([ - new CLabel(_('Width')), - new CFormField( - (new CRangeControl($field_name.'['.$row_num.'][width]', (int) $value['width'])) - ->setEnabled(!in_array($value['type'], [SVG_GRAPH_TYPE_POINTS, SVG_GRAPH_TYPE_BAR])) - ->setWidth(ZBX_TEXTAREA_MEDIUM_WIDTH) - ->setStep(1) - ->setMin(0) - ->setMax(10) - ) - ]) - ->addItem([ - new CLabel(_('Point size')), - new CFormField( - (new CRangeControl($field_name.'['.$row_num.'][pointsize]', (int) $value['pointsize'])) - ->setEnabled($value['type'] == SVG_GRAPH_TYPE_POINTS) - ->setWidth(ZBX_TEXTAREA_MEDIUM_WIDTH) - ->setStep(1) - ->setMin(1) - ->setMax(10) - ) - ]) - ->addItem([ - new CLabel(_('Transparency')), - new CFormField( - (new CRangeControl($field_name.'['.$row_num.'][transparency]', - (int) $value['transparency']) - ) - ->setWidth(ZBX_TEXTAREA_MEDIUM_WIDTH) - ->setStep(1) - ->setMin(0) - ->setMax(10) - ) - ]) - ->addItem([ - new CLabel(_('Fill')), - new CFormField( - (new CRangeControl($field_name.'['.$row_num.'][fill]', (int) $value['fill'])) - ->setEnabled(!in_array($value['type'], [SVG_GRAPH_TYPE_POINTS, SVG_GRAPH_TYPE_BAR])) - ->setWidth(ZBX_TEXTAREA_MEDIUM_WIDTH) - ->setStep(1) - ->setMin(0) - ->setMax(10) - ) - ]), - (new CFormGrid()) - ->addItem([ - new CLabel(_('Missing data')), - new CFormField( - (new CRadioButtonList($field_name.'['.$row_num.'][missingdatafunc]', - (int) $value['missingdatafunc']) - ) - ->addValue(_('None'), SVG_GRAPH_MISSING_DATA_NONE) - ->addValue(_x('Connected', 'missing data function'), - SVG_GRAPH_MISSING_DATA_CONNECTED - ) - ->addValue(_x('Treat as 0', 'missing data function'), - SVG_GRAPH_MISSING_DATA_TREAT_AS_ZERO - ) - ->addValue(_x('Last known', 'missing data function'), - SVG_GRAPH_MISSING_DATA_LAST_KNOWN - ) - ->setEnabled(!in_array($value['type'], [SVG_GRAPH_TYPE_POINTS, SVG_GRAPH_TYPE_BAR])) - ->setModern(true) - ) - ]) - ->addItem([ - new CLabel(_('Y-axis')), - new CFormField( - (new CRadioButtonList($field_name.'['.$row_num.'][axisy]', (int) $value['axisy'])) - ->addValue(_('Left'), GRAPH_YAXIS_SIDE_LEFT) - ->addValue(_('Right'), GRAPH_YAXIS_SIDE_RIGHT) - ->setModern(true) - ) - ]) - ->addItem([ - new CLabel(_('Time shift'), $field_name.'['.$row_num.'][timeshift]'), - new CFormField( - (new CTextBox($field_name.'['.$row_num.'][timeshift]', $value['timeshift'])) - ->setAttribute('placeholder', _('none')) - ->setWidth(ZBX_TEXTAREA_TINY_WIDTH) - ) - ]) - ->addItem([ - new CLabel(_('Aggregation function'), - 'label-'.$field_name.'_'.$row_num.'_aggregate_function' - ), - new CFormField( - (new CSelect($field_name.'['.$row_num.'][aggregate_function]')) - ->setId($field_name.'_'.$row_num.'_aggregate_function') - ->setFocusableElementId('label-'.$field_name.'_'.$row_num.'_aggregate_function') - ->setValue((int) $value['aggregate_function']) - ->addOptions(CSelect::createOptionsFromArray([ - AGGREGATE_NONE => graph_item_aggr_fnc2str(AGGREGATE_NONE), - AGGREGATE_MIN => graph_item_aggr_fnc2str(AGGREGATE_MIN), - AGGREGATE_MAX => graph_item_aggr_fnc2str(AGGREGATE_MAX), - AGGREGATE_AVG => graph_item_aggr_fnc2str(AGGREGATE_AVG), - AGGREGATE_COUNT => graph_item_aggr_fnc2str(AGGREGATE_COUNT), - AGGREGATE_SUM => graph_item_aggr_fnc2str(AGGREGATE_SUM), - AGGREGATE_FIRST => graph_item_aggr_fnc2str(AGGREGATE_FIRST), - AGGREGATE_LAST => graph_item_aggr_fnc2str(AGGREGATE_LAST) - ])) - ->setWidth(ZBX_TEXTAREA_TINY_WIDTH) - ) - ]) - ->addItem([ - new CLabel(_('Aggregation interval'), $field_name.'['.$row_num.'][aggregate_interval]'), - new CFormField( - (new CTextBox($field_name.'['.$row_num.'][aggregate_interval]', - $value['aggregate_interval'] - )) - ->setEnabled($value['aggregate_function'] != AGGREGATE_NONE) - ->setAttribute('placeholder', GRAPH_AGGREGATE_DEFAULT_INTERVAL) - ->setWidth(ZBX_TEXTAREA_TINY_WIDTH) - ) - ]) - ->addItem([ - new CLabel(_('Aggregate')), - new CFormField( - (new CRadioButtonList($field_name.'['.$row_num.'][aggregate_grouping]', - (int) $value['aggregate_grouping']) - ) - ->addValue(_('Each item'), GRAPH_AGGREGATE_BY_ITEM) - ->addValue(_('Data set'), GRAPH_AGGREGATE_BY_DATASET) - ->setEnabled($value['aggregate_function'] != AGGREGATE_NONE) - ->setModern(true) - ) - ]) - ->addItem([ - new CLabel(_('Approximation'), - 'label-'.$field_name.'_'.$row_num.'_approximation' - ), - new CFormField( - (new CSelect($field_name.'['.$row_num.'][approximation]')) - ->setId($field_name.'_'.$row_num.'_approximation') - ->setFocusableElementId('label-'.$field_name.'_'.$row_num.'_approximation') - ->setValue((int) $value['approximation']) - ->addOptions(CSelect::createOptionsFromArray([ - APPROXIMATION_ALL => [ - 'label' => _('all'), - 'disabled' => ($value['type'] != SVG_GRAPH_TYPE_LINE || (bool) $value['stacked']) - ], - APPROXIMATION_MIN => _('min'), - APPROXIMATION_AVG => _('avg'), - APPROXIMATION_MAX => _('max') - ])) - ->setWidth(ZBX_TEXTAREA_TINY_WIDTH) - ) - ]) - ]) - ])) - ->addClass(ZBX_STYLE_LIST_ACCORDION_ITEM) - ->addClass(ZBX_STYLE_SORTABLE_ITEM) - ->addClass($is_opened ? ZBX_STYLE_LIST_ACCORDION_ITEM_OPENED : ZBX_STYLE_LIST_ACCORDION_ITEM_CLOSED) - ->setAttribute('data-set', $row_num) - ->setAttribute('data-type', $dataset_type); - } - - /** - * Return template used by dynamic rows in CWidgetFieldGraphDataSet field. - * - * @param CWidgetFieldGraphDataSet $field - * @param string $form_name Form name in which data set field resides. - * @param int $dataset_type - * - * @return string - */ - public static function getGraphDataSetTemplate($field, $form_name, int $dataset_type) { - $value = ['color' => '#{color}'] + CWidgetFieldGraphDataSet::getDefaults(); - - return self::getGraphDataSetLayout($field->getName(), $value, $form_name, '#{rowNum}', true, $dataset_type)->toString(); - } - - /** - * @param CWidgetFieldGraphDataSet $field - * - * @return CList - */ - public static function getGraphDataSet($field, $form_name) { - $list = (new CList()) - ->setId('data_sets') - ->addClass(ZBX_STYLE_SORTABLE_LIST); - - $values = $field->getValue(); - - if (!$values) { - $values[] = CWidgetFieldGraphDataSet::getDefaults(); - } - - // Get item names for single item datasets. - $itemids = array_merge(...array_column($values, 'itemids')); - if ($itemids) { - $names = self::getItemNames($itemids); - } - - foreach ($values as $i => $value) { - if ($value['dataset_type'] == self::DATASET_TYPE_SINGLE_ITEM) { - $value['item_names'] = $names; - } - - $list->addItem( - self::getGraphDataSetLayout($field->getName(), $value, $form_name, $i, $i == 0, $value['dataset_type']) - ); - } - - return $list; - } - - public static function getGraphDataSetFooter() { - return (new CList()) - ->addClass(ZBX_STYLE_BTN_SPLIT) - ->addItem([ - (new CButton(null, [ - (new CSpan())->addClass(ZBX_STYLE_PLUS_ICON), - _('Add new data set') - ])) - ->setId('dataset-add') - ->addClass(ZBX_STYLE_BTN_ALT), - (new CButton(null, '​')) - ->setId('dataset-menu') - ->addClass(ZBX_STYLE_BTN_ALT) - ->addClass(ZBX_STYLE_BTN_TOGGLE_CHEVRON) - ]); - } - - private static function getItemNames(array $itemids): array { - $names = []; - - $items = API::Item()->get([ - 'output' => ['itemid', 'hostid', 'name'], - 'selectHosts' => ['hostid', 'name'], - 'webitems' => true, - 'itemids' => $itemids, - 'preservekeys' => true - ]); - - if (!$items) { - return $names; - } - - foreach ($items as $item) { - $hosts = array_column($item['hosts'], 'name', 'hostid'); - $names[$item['itemid']] = $hosts[$item['hostid']].NAME_DELIMITER.$item['name']; - } - - return $names; - } - - public static function getThresholds(CWidgetFieldThresholds $field): CDiv { - $thresholds_table = (new CTable()) - ->setId(sprintf(CWidgetFieldThresholds::THRESHOLDS_TABLE_ID, $field->getName())) - ->addClass(ZBX_STYLE_TABLE_FORMS) - ->setHeader([ - '', - (new CColHeader(_('Threshold')))->setWidth('100%'), - _('Action') - ]) - ->setFooter(new CRow( - new CCol( - (new CSimpleButton(_('Add'))) - ->addClass(ZBX_STYLE_BTN_LINK) - ->addClass('element-table-add') - ) - )); - - foreach ($field->getValue() as $i => $threshold) { - $thresholds_table->addRow( - self::getThresholdsTemplate($field->getName(), $i, $threshold['color'], $threshold['threshold']) - ); - } - - return (new CDiv($thresholds_table)) - ->addClass('table-forms-separator') - ->setWidth(ZBX_TEXTAREA_STANDARD_WIDTH); - } - - public static function getThresholdsTemplate($name, $index = '#{rowNum}', $color = '#{color}', - $threshold = '#{threshold}'): CRow { - return (new CRow([ - (new CColor($name.'['.$index.'][color]', $color))->appendColorPickerJs(false), - (new CTextBox($name.'['.$index.'][threshold]', $threshold, false)) - ->setWidth(ZBX_TEXTAREA_TINY_WIDTH) - ->setAriaRequired(), - (new CButton($name.'['.$index.'][remove]', _('Remove'))) - ->addClass(ZBX_STYLE_BTN_LINK) - ->addClass('element-table-remove') - ]))->addClass('form_row'); - } - - /** - * @param CWidgetField $field - * - * @return int - */ - public static function isAriaRequired($field) { - return ($field->getFlags() & CWidgetField::FLAG_LABEL_ASTERISK); - } -} |