1<?php 2/* 3** Zabbix 4** Copyright (C) 2001-2021 Zabbix SIA 5** 6** This program is free software; you can redistribute it and/or modify 7** it under the terms of the GNU General Public License as published by 8** the Free Software Foundation; either version 2 of the License, or 9** (at your option) any later version. 10** 11** This program is distributed in the hope that it will be useful, 12** but WITHOUT ANY WARRANTY; without even the implied warranty of 13** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 14** GNU General Public License for more details. 15** 16** You should have received a copy of the GNU General Public License 17** along with this program; if not, write to the Free Software 18** Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. 19**/ 20 21 22/** 23 * @var CView $this 24 */ 25 26// Visibility box javascript is already added in main page. It should not be added in popup response. 27define('CVISIBILITYBOX_JAVASCRIPT_INSERTED', 1); 28 29$output = [ 30 'header' => $data['title'] 31]; 32 33$options = $data['options']; 34$field_values = $data['field_values']; 35 36$operations_popup_form = (new CForm()) 37 ->cleanItems() 38 ->setId('lldoperation_form') 39 ->addVar('no', $options['no']) 40 ->addItem((new CVar('templated', $options['templated']))->removeId()) 41 ->addVar('action', 'popup.lldoperation') 42 ->addItem((new CInput('submit', 'submit'))->addStyle('display: none;')); 43 44$operations_popup_form_list = (new CFormList()) 45 ->addRow( 46 (new CLabel(_('Object'), 'label-operationobject')), 47 (new CSelect('operationobject')) 48 ->setValue($options['operationobject']) 49 ->setFocusableElementId('label-operationobject') 50 ->addOptions(CSelect::createOptionsFromArray([ 51 OPERATION_OBJECT_ITEM_PROTOTYPE => _('Item prototype'), 52 OPERATION_OBJECT_TRIGGER_PROTOTYPE => _('Trigger prototype'), 53 OPERATION_OBJECT_GRAPH_PROTOTYPE => _('Graph prototype'), 54 OPERATION_OBJECT_HOST_PROTOTYPE => _('Host prototype') 55 ])) 56 ->setId('operationobject') 57 ->setReadonly($options['templated']) 58 ) 59 ->addRow((new CLabel(_('Condition'), 'label-operator')), [ 60 (new CSelect('operator')) 61 ->setValue($options['operator']) 62 ->setFocusableElementId('label-operator') 63 ->addOptions(CSelect::createOptionsFromArray([ 64 CONDITION_OPERATOR_EQUAL => _('equals'), 65 CONDITION_OPERATOR_NOT_EQUAL => _('does not equal'), 66 CONDITION_OPERATOR_LIKE => _('contains'), 67 CONDITION_OPERATOR_NOT_LIKE => _('does not contain'), 68 CONDITION_OPERATOR_REGEXP => _('matches'), 69 CONDITION_OPERATOR_NOT_REGEXP => _('does not match') 70 ])) 71 ->setReadonly($options['templated']) 72 ->addClass(ZBX_STYLE_FORM_INPUT_MARGIN), 73 (new CTextBox('value', $options['value'], $options['templated'], 74 DB::getFieldLength('lld_override_operation', 'value'))) 75 ->setWidth(ZBX_TEXTAREA_MACRO_VALUE_WIDTH) 76 ->setAttribute('placeholder', _('pattern')) 77 ]) 78 ->addRow( 79 (new CVisibilityBox('visible[opstatus]', 'opstatus_status', _('Original'))) 80 ->setLabel(_('Create enabled')) 81 ->setChecked(array_key_exists('opstatus', $options)) 82 ->setReadonly($options['templated']), 83 (new CRadioButtonList('opstatus[status]', (int) $field_values['opstatus']['status'])) 84 ->addValue(_('Yes'), ZBX_PROTOTYPE_STATUS_ENABLED) 85 ->addValue(_('No'), ZBX_PROTOTYPE_STATUS_DISABLED) 86 ->setModern(true) 87 ->setReadonly($options['templated']), 88 'opstatus_row' 89 ) 90 ->addRow( 91 (new CVisibilityBox('visible[opdiscover]', 'opdiscover_discover', _('Original'))) 92 ->setLabel(_('Discover')) 93 ->setChecked(array_key_exists('opdiscover', $options)) 94 ->setReadonly($options['templated']), 95 (new CRadioButtonList('opdiscover[discover]', (int) $field_values['opdiscover']['discover'])) 96 ->addValue(_('Yes'), ZBX_PROTOTYPE_DISCOVER) 97 ->addValue(_('No'), ZBX_PROTOTYPE_NO_DISCOVER) 98 ->setModern(true) 99 ->setReadonly($options['templated']), 100 'opdiscover_row' 101 ); 102 103$update_interval = (new CTable()) 104 ->setId('update_interval') 105 ->addRow([_('Delay'), 106 (new CDiv((new CTextBox('opperiod[delay]', $field_values['opperiod']['delay'], $options['templated'])) 107 ->setWidth(ZBX_TEXTAREA_SMALL_WIDTH) 108 )) 109 ]); 110 111$custom_intervals = (new CTable()) 112 ->setId('lld_overrides_custom_intervals') 113 ->setHeader([ 114 new CColHeader(_('Type')), 115 new CColHeader(_('Interval')), 116 new CColHeader(_('Period')), 117 (new CColHeader(_('Action')))->setWidth(50) 118 ]) 119 ->addClass(ZBX_STYLE_TABLE_FORMS_SEPARATOR) 120 ->setAttribute('style', 'min-width: '.ZBX_TEXTAREA_STANDARD_WIDTH.'px;'); 121 122foreach ($field_values['opperiod']['delay_flex'] as $i => $delay_flex) { 123 $type_input = (new CRadioButtonList('opperiod[delay_flex]['.$i.'][type]', (int) $delay_flex['type'])) 124 ->addValue(_('Flexible'), ITEM_DELAY_FLEXIBLE) 125 ->addValue(_('Scheduling'), ITEM_DELAY_SCHEDULING) 126 ->setModern(true) 127 ->setReadonly($options['templated']); 128 129 if ($delay_flex['type'] == ITEM_DELAY_FLEXIBLE) { 130 $delay_input = (new CTextBox('opperiod[delay_flex]['.$i.'][delay]', $delay_flex['delay'], 131 $options['templated'])) 132 ->setAttribute('placeholder', ZBX_ITEM_FLEXIBLE_DELAY_DEFAULT); 133 $period_input = (new CTextBox('opperiod[delay_flex]['.$i.'][period]', $delay_flex['period'], 134 $options['templated'])) 135 ->setAttribute('placeholder', ZBX_DEFAULT_INTERVAL); 136 $schedule_input = (new CTextBox('opperiod[delay_flex]['.$i.'][schedule]', '', $options['templated'])) 137 ->setAttribute('placeholder', ZBX_ITEM_SCHEDULING_DEFAULT) 138 ->setAttribute('style', 'display: none;'); 139 } 140 else { 141 $delay_input = (new CTextBox('opperiod[delay_flex]['.$i.'][delay]', '', $options['templated'])) 142 ->setAttribute('placeholder', ZBX_ITEM_FLEXIBLE_DELAY_DEFAULT) 143 ->setAttribute('style', 'display: none;'); 144 $period_input = (new CTextBox('opperiod[delay_flex]['.$i.'][period]', '', $options['templated'])) 145 ->setAttribute('placeholder', ZBX_DEFAULT_INTERVAL) 146 ->setAttribute('style', 'display: none;'); 147 $schedule_input = (new CTextBox('opperiod[delay_flex]['.$i.'][schedule]', $delay_flex['schedule'], 148 $options['templated'])) 149 ->setAttribute('placeholder', ZBX_ITEM_SCHEDULING_DEFAULT); 150 } 151 152 $button = (new CButton('opperiod[delay_flex]['.$i.'][remove]', _('Remove'))) 153 ->addClass(ZBX_STYLE_BTN_LINK) 154 ->addClass('element-table-remove') 155 ->setEnabled(!$options['templated']); 156 157 $custom_intervals->addRow([$type_input, [$delay_input, $schedule_input], $period_input, $button], 'form_row'); 158} 159 160$custom_intervals->addRow([(new CButton('interval_add', _('Add'))) 161 ->addClass(ZBX_STYLE_BTN_LINK) 162 ->addClass('element-table-add') 163 ->setEnabled(!$options['templated']) 164 ->removeId() 165]); 166 167$update_interval->addRow( 168 (new CRow([ 169 (new CCol(_('Custom intervals')))->setAttribute('style', 'vertical-align: top;'), 170 new CCol($custom_intervals) 171 ])) 172); 173 174$operations_popup_form_list 175 ->addRow( 176 (new CVisibilityBox('visible[opperiod]', 'opperiod_div', _('Original'))) 177 ->setLabel(_('Update interval')) 178 ->setChecked(array_key_exists('opperiod', $options)) 179 ->setReadonly($options['templated']), 180 (new CDiv($update_interval))->setId('opperiod_div'), 181 'opperiod_row' 182 ) 183 ->addRow( 184 (new CVisibilityBox('visible[ophistory]', 'ophistory_div', _('Original'))) 185 ->setLabel(_('History storage period')) 186 ->setChecked(array_key_exists('ophistory', $options)) 187 ->setReadonly($options['templated']), 188 (new CDiv([ 189 (new CRadioButtonList('ophistory[history_mode]', (int) $field_values['ophistory']['history_mode'])) 190 ->addValue(_('Do not keep history'), ITEM_STORAGE_OFF) 191 ->addValue(_('Storage period'), ITEM_STORAGE_CUSTOM) 192 ->setModern(true) 193 ->setReadonly($options['templated']), 194 (new CDiv())->addClass(ZBX_STYLE_FORM_INPUT_MARGIN), 195 (new CTextBox('ophistory[history]', $field_values['ophistory']['history'], $options['templated'], 196 DB::getFieldLength('lld_override_ophistory', 'history'))) 197 ->setWidth(ZBX_TEXTAREA_TINY_WIDTH) 198 ->setAriaRequired() 199 ])) 200 ->addClass('wrap-multiple-controls') 201 ->setId('ophistory_div'), 202 'ophistory_row' 203 ) 204 ->addRow( 205 (new CVisibilityBox('visible[optrends]', 'optrends_div', _('Original'))) 206 ->setLabel(_('Trend storage period')) 207 ->setChecked(array_key_exists('optrends', $options)) 208 ->setReadonly($options['templated']), 209 (new CDiv([ 210 (new CRadioButtonList('optrends[trends_mode]', (int) $field_values['optrends']['trends_mode'])) 211 ->addValue(_('Do not keep trends'), ITEM_STORAGE_OFF) 212 ->addValue(_('Storage period'), ITEM_STORAGE_CUSTOM) 213 ->setModern(true) 214 ->setReadonly($options['templated']), 215 (new CDiv())->addClass(ZBX_STYLE_FORM_INPUT_MARGIN), 216 (new CTextBox('optrends[trends]', $field_values['optrends']['trends'], $options['templated'], 217 DB::getFieldLength('lld_override_optrends', 'trends'))) 218 ->setWidth(ZBX_TEXTAREA_TINY_WIDTH) 219 ->setAriaRequired() 220 ])) 221 ->addClass('wrap-multiple-controls') 222 ->setId('optrends_div'), 223 'optrends_row' 224 ) 225 ->addRow( 226 (new CVisibilityBox('visible[opseverity]', 'opseverity_div', _('Original'))) 227 ->setLabel(_('Severity')) 228 ->setChecked(array_key_exists('opseverity', $options)) 229 ->setReadonly($options['templated']), 230 (new CDiv( 231 (new CSeverity([ 232 'name' => 'opseverity[severity]', 233 'value' => (int) $field_values['opseverity']['severity'] 234 ]))->setReadonly($options['templated']) 235 ))->setId('opseverity_div'), 236 'opseverity_row' 237 ) 238 ->addRow( 239 (new CVisibilityBox('visible[optemplate]', 'optemplate_div', _('Original'))) 240 ->setLabel(_('Link templates')) 241 ->setChecked(array_key_exists('optemplate', $options)) 242 ->setReadonly($options['templated']), 243 (new CDiv([ 244 (new CMultiSelect([ 245 'name' => 'optemplate[]', 246 'object_name' => 'templates', 247 'data' => $field_values['optemplate'], 248 'disabled' => (bool) $options['templated'], 249 'popup' => [ 250 'parameters' => [ 251 'srctbl' => 'templates', 252 'srcfld1' => 'hostid', 253 'srcfld2' => 'host', 254 'dstfrm' => 'lldoperation_form', 255 'dstfld1' => 'optemplate_' 256 ] 257 ] 258 ]))->setWidth(ZBX_TEXTAREA_STANDARD_WIDTH) 259 ]))->setId('optemplate_div'), 260 'optemplate_row' 261 ) 262 ->addRow( 263 (new CVisibilityBox('visible[optag]', 'optag_div', _('Original'))) 264 ->setLabel(_('Tags')) 265 ->setChecked(array_key_exists('optag', $options)) 266 ->setReadonly($options['templated']), 267 (new CDiv( 268 renderTagTable($field_values['optag'], $options['templated'], 269 ['field_name' => 'optag', 'add_post_js' => false]) 270 ->setHeader([_('Name'), _('Value'), _('Action')]) 271 ->addClass(ZBX_STYLE_TABLE_FORMS_SEPARATOR) 272 ->setId('tags-table') 273 ))->setId('optag_div'), 274 'optag_row' 275 ) 276 ->addRow( 277 (new CVisibilityBox('visible[opinventory]', 'opinventory_inventory_mode', _('Original'))) 278 ->setLabel(_('Host inventory')) 279 ->setChecked(array_key_exists('opinventory', $options)) 280 ->setReadonly($options['templated']), 281 (new CRadioButtonList('opinventory[inventory_mode]', (int) $field_values['opinventory']['inventory_mode'])) 282 ->addValue(_('Disabled'), HOST_INVENTORY_DISABLED) 283 ->addValue(_('Manual'), HOST_INVENTORY_MANUAL) 284 ->addValue(_('Automatic'), HOST_INVENTORY_AUTOMATIC) 285 ->setModern(true) 286 ->setReadonly($options['templated']), 287 'opinventory_row' 288 ); 289 290$output['buttons'] = [ 291 [ 292 'title' => ($options['no'] > 0) ? _('Update') : _('Add'), 293 'class' => '', 294 'keepOpen' => true, 295 'enabled' => !$options['templated'], 296 'isSubmit' => true, 297 'action' => 'return lldoverrides.operations.edit_form.validate(overlay);' 298 ] 299]; 300 301$operations_popup_form->addItem($operations_popup_form_list); 302 303// Operations editing form. 304$output['body'] = (new CDiv($operations_popup_form))->toString(); 305$output['script_inline'] = 'lldoverrides.operations.onOperationOverlayReadyCb('.$options['no'].');'; 306// Get JS generated by CVisibilityBox fields and for multiselect fields. 307$output['script_inline'] .= getPagePostJs(); 308// Unused action rows should be "removed from dom" only after post JS will be done. 309$output['script_inline'] .= 'lldoverrides.operations.edit_form.initHideActionRows();'; 310 311if ($data['user']['debug_mode'] == GROUP_DEBUG_MODE_ENABLED) { 312 CProfiler::getInstance()->stop(); 313 $output['debug'] = CProfiler::getInstance()->make()->toString(); 314} 315 316echo json_encode($output); 317