$data['title'] ]; $options = $data['options']; $field_values = $data['field_values']; $operations_popup_form = (new CForm()) ->setId('lldoperation_form') ->addVar('no', $options['no']) ->addItem((new CVar('templated', $options['templated']))->removeId()) ->addVar('action', 'popup.lldoperation'); // Enable form submitting on Enter. $operations_popup_form->addItem((new CSubmitButton())->addClass(ZBX_STYLE_FORM_SUBMIT_HIDDEN)); $operations_popup_form_list = (new CFormList()) ->addRow( (new CLabel(_('Object'), 'label-operationobject')), (new CSelect('operationobject')) ->setValue($options['operationobject']) ->setFocusableElementId('label-operationobject') ->addOptions(CSelect::createOptionsFromArray([ OPERATION_OBJECT_ITEM_PROTOTYPE => _('Item prototype'), OPERATION_OBJECT_TRIGGER_PROTOTYPE => _('Trigger prototype'), OPERATION_OBJECT_GRAPH_PROTOTYPE => _('Graph prototype'), OPERATION_OBJECT_HOST_PROTOTYPE => _('Host prototype') ])) ->setId('operationobject') ->setReadonly($options['templated']) ) ->addRow((new CLabel(_('Condition'), 'label-operator')), [ (new CSelect('operator')) ->setValue($options['operator']) ->setFocusableElementId('label-operator') ->addOptions(CSelect::createOptionsFromArray([ CONDITION_OPERATOR_EQUAL => _('equals'), CONDITION_OPERATOR_NOT_EQUAL => _('does not equal'), CONDITION_OPERATOR_LIKE => _('contains'), CONDITION_OPERATOR_NOT_LIKE => _('does not contain'), CONDITION_OPERATOR_REGEXP => _('matches'), CONDITION_OPERATOR_NOT_REGEXP => _('does not match') ])) ->setReadonly($options['templated']) ->addClass(ZBX_STYLE_FORM_INPUT_MARGIN), (new CTextBox('value', $options['value'], $options['templated'], DB::getFieldLength('lld_override_operation', 'value'))) ->setWidth(ZBX_TEXTAREA_MACRO_VALUE_WIDTH) ->setAttribute('placeholder', _('pattern')) ]) ->addRow( (new CVisibilityBox('visible[opstatus]', 'opstatus_status', _('Original'))) ->setLabel(_('Create enabled')) ->setChecked(array_key_exists('opstatus', $options)) ->setReadonly($options['templated']), (new CRadioButtonList('opstatus[status]', (int) $field_values['opstatus']['status'])) ->addValue(_('Yes'), ZBX_PROTOTYPE_STATUS_ENABLED) ->addValue(_('No'), ZBX_PROTOTYPE_STATUS_DISABLED) ->setModern(true) ->setReadonly($options['templated']), 'opstatus_row' ) ->addRow( (new CVisibilityBox('visible[opdiscover]', 'opdiscover_discover', _('Original'))) ->setLabel(_('Discover')) ->setChecked(array_key_exists('opdiscover', $options)) ->setReadonly($options['templated']), (new CRadioButtonList('opdiscover[discover]', (int) $field_values['opdiscover']['discover'])) ->addValue(_('Yes'), ZBX_PROTOTYPE_DISCOVER) ->addValue(_('No'), ZBX_PROTOTYPE_NO_DISCOVER) ->setModern(true) ->setReadonly($options['templated']), 'opdiscover_row' ); $custom_intervals = (new CTable()) ->setId('lld_overrides_custom_intervals') ->setHeader([ new CColHeader(_('Type')), new CColHeader(_('Interval')), new CColHeader(_('Period')), (new CColHeader(_('Action')))->setWidth(50) ]) ->addClass(ZBX_STYLE_TABLE_FORMS_SEPARATOR) ->setAttribute('style', 'min-width: '.ZBX_TEXTAREA_STANDARD_WIDTH.'px;'); foreach ($field_values['opperiod']['delay_flex'] as $i => $delay_flex) { $type_input = (new CRadioButtonList('opperiod[delay_flex]['.$i.'][type]', (int) $delay_flex['type'])) ->addValue(_('Flexible'), ITEM_DELAY_FLEXIBLE) ->addValue(_('Scheduling'), ITEM_DELAY_SCHEDULING) ->setModern(true) ->setReadonly($options['templated']); if ($delay_flex['type'] == ITEM_DELAY_FLEXIBLE) { $delay_input = (new CTextBox('opperiod[delay_flex]['.$i.'][delay]', $delay_flex['delay'], $options['templated'])) ->setAttribute('placeholder', ZBX_ITEM_FLEXIBLE_DELAY_DEFAULT); $period_input = (new CTextBox('opperiod[delay_flex]['.$i.'][period]', $delay_flex['period'], $options['templated'])) ->setAttribute('placeholder', ZBX_DEFAULT_INTERVAL); $schedule_input = (new CTextBox('opperiod[delay_flex]['.$i.'][schedule]', '', $options['templated'])) ->setAttribute('placeholder', ZBX_ITEM_SCHEDULING_DEFAULT) ->setAttribute('style', 'display: none;'); } else { $delay_input = (new CTextBox('opperiod[delay_flex]['.$i.'][delay]', '', $options['templated'])) ->setAttribute('placeholder', ZBX_ITEM_FLEXIBLE_DELAY_DEFAULT) ->setAttribute('style', 'display: none;'); $period_input = (new CTextBox('opperiod[delay_flex]['.$i.'][period]', '', $options['templated'])) ->setAttribute('placeholder', ZBX_DEFAULT_INTERVAL) ->setAttribute('style', 'display: none;'); $schedule_input = (new CTextBox('opperiod[delay_flex]['.$i.'][schedule]', $delay_flex['schedule'], $options['templated'])) ->setAttribute('placeholder', ZBX_ITEM_SCHEDULING_DEFAULT); } $button = (new CButton('opperiod[delay_flex]['.$i.'][remove]', _('Remove'))) ->addClass(ZBX_STYLE_BTN_LINK) ->addClass('element-table-remove') ->setEnabled(!$options['templated']); $custom_intervals->addRow([$type_input, [$delay_input, $schedule_input], $period_input, $button], 'form_row'); } $custom_intervals->addRow([(new CButton('interval_add', _('Add'))) ->addClass(ZBX_STYLE_BTN_LINK) ->addClass('element-table-add') ->setEnabled(!$options['templated']) ->removeId() ]); $update_interval = (new CTable()) ->setId('opperiod') ->addRow([ _('Delay'), (new CDiv((new CTextBox('opperiod[delay]', $field_values['opperiod']['delay'], $options['templated'])) ->setWidth(ZBX_TEXTAREA_SMALL_WIDTH) )) ]) ->addRow( (new CRow([ (new CCol(_('Custom intervals')))->setAttribute('style', 'vertical-align: top;'), new CCol($custom_intervals) ])) ); $operations_popup_form_list ->addRow( (new CVisibilityBox('visible[opperiod]', 'opperiod', _('Original'))) ->setLabel(_('Update interval')) ->setChecked(array_key_exists('opperiod', $options)) ->setReadonly($options['templated']), $update_interval, 'opperiod_row' ) ->addRow( (new CVisibilityBox('visible[ophistory]', 'ophistory_div', _('Original'))) ->setLabel(_('History storage period')) ->setChecked(array_key_exists('ophistory', $options)) ->setReadonly($options['templated']), (new CDiv([ (new CRadioButtonList('ophistory[history_mode]', (int) $field_values['ophistory']['history_mode'])) ->addValue(_('Do not keep history'), ITEM_STORAGE_OFF) ->addValue(_('Storage period'), ITEM_STORAGE_CUSTOM) ->setModern(true) ->setReadonly($options['templated']), (new CDiv())->addClass(ZBX_STYLE_FORM_INPUT_MARGIN), (new CTextBox('ophistory[history]', $field_values['ophistory']['history'], $options['templated'], DB::getFieldLength('lld_override_ophistory', 'history'))) ->setWidth(ZBX_TEXTAREA_TINY_WIDTH) ->setAriaRequired() ])) ->addClass('wrap-multiple-controls') ->setId('ophistory_div'), 'ophistory_row' ) ->addRow( (new CVisibilityBox('visible[optrends]', 'optrends_div', _('Original'))) ->setLabel(_('Trend storage period')) ->setChecked(array_key_exists('optrends', $options)) ->setReadonly($options['templated']), (new CDiv([ (new CRadioButtonList('optrends[trends_mode]', (int) $field_values['optrends']['trends_mode'])) ->addValue(_('Do not keep trends'), ITEM_STORAGE_OFF) ->addValue(_('Storage period'), ITEM_STORAGE_CUSTOM) ->setModern(true) ->setReadonly($options['templated']), (new CDiv())->addClass(ZBX_STYLE_FORM_INPUT_MARGIN), (new CTextBox('optrends[trends]', $field_values['optrends']['trends'], $options['templated'], DB::getFieldLength('lld_override_optrends', 'trends'))) ->setWidth(ZBX_TEXTAREA_TINY_WIDTH) ->setAriaRequired() ])) ->addClass('wrap-multiple-controls') ->setId('optrends_div'), 'optrends_row' ) ->addRow( (new CVisibilityBox('visible[opseverity]', 'opseverity_div', _('Original'))) ->setLabel(_('Severity')) ->setChecked(array_key_exists('opseverity', $options)) ->setReadonly($options['templated']), (new CDiv( (new CSeverity('opseverity[severity]', (int) $field_values['opseverity']['severity'])) ->setReadonly($options['templated']) ))->setId('opseverity_div'), 'opseverity_row' ) ->addRow( (new CVisibilityBox('visible[optemplate]', 'optemplate_div', _('Original'))) ->setLabel(_('Link templates')) ->setChecked(array_key_exists('optemplate', $options)) ->setReadonly($options['templated']), (new CDiv([ (new CMultiSelect([ 'name' => 'optemplate[]', 'object_name' => 'templates', 'data' => $field_values['optemplate'], 'disabled' => (bool) $options['templated'], 'popup' => [ 'parameters' => [ 'srctbl' => 'templates', 'srcfld1' => 'hostid', 'srcfld2' => 'host', 'dstfrm' => 'lldoperation_form', 'dstfld1' => 'optemplate_' ] ] ]))->setWidth(ZBX_TEXTAREA_STANDARD_WIDTH) ]))->setId('optemplate_div'), 'optemplate_row' ) ->addRow( (new CVisibilityBox('visible[optag]', 'optag_div', _('Original'))) ->setLabel(_('Tags')) ->setChecked(array_key_exists('optag', $options)) ->setReadonly($options['templated']), (new CDiv( renderTagTable($field_values['optag'], $options['templated'], ['field_name' => 'optag', 'add_post_js' => false]) ->setHeader([_('Name'), _('Value'), _('Action')]) ->addClass(ZBX_STYLE_TABLE_FORMS_SEPARATOR) ->addClass('tags-table') ))->setId('optag_div'), 'optag_row' ) ->addRow( (new CVisibilityBox('visible[opinventory]', 'opinventory_inventory_mode', _('Original'))) ->setLabel(_('Host inventory')) ->setChecked(array_key_exists('opinventory', $options)) ->setReadonly($options['templated']), (new CRadioButtonList('opinventory[inventory_mode]', (int) $field_values['opinventory']['inventory_mode'])) ->addValue(_('Disabled'), HOST_INVENTORY_DISABLED) ->addValue(_('Manual'), HOST_INVENTORY_MANUAL) ->addValue(_('Automatic'), HOST_INVENTORY_AUTOMATIC) ->setModern(true) ->setReadonly($options['templated']), 'opinventory_row' ); $output['buttons'] = [ [ 'title' => ($options['no'] > 0) ? _('Update') : _('Add'), 'class' => '', 'keepOpen' => true, 'enabled' => !$options['templated'], 'isSubmit' => true, 'action' => 'return lldoverrides.operations.edit_form.validate(overlay);' ] ]; $operations_popup_form->addItem($operations_popup_form_list); // Operations editing form. $output['body'] = (new CDiv($operations_popup_form))->toString(); $output['script_inline'] = 'lldoverrides.operations.onOperationOverlayReadyCb('.$options['no'].');'; // Get JS generated by CVisibilityBox fields and for multiselect fields. $output['script_inline'] .= getPagePostJs(); // Unused action rows should be "removed from dom" only after post JS will be done. $output['script_inline'] .= 'lldoverrides.operations.edit_form.initHideActionRows();'; if ($data['user']['debug_mode'] == GROUP_DEBUG_MODE_ENABLED) { CProfiler::getInstance()->stop(); $output['debug'] = CProfiler::getInstance()->make()->toString(); } echo json_encode($output);