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