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$this->includeJsFile('configuration.services.edit.js.php');
27
28$service = $this->data['service'];
29
30$widget = (new CWidget())->setTitle(_('Services'));
31
32// create form
33$servicesForm = (new CForm())
34	->setName('servicesForm')
35	->setAttribute('aria-labeledby', ZBX_STYLE_PAGE_TITLE)
36	->addVar('form', $this->data['form'])
37	->addVar('parentid', $this->data['parentid'])
38	->addVar('parentname', $this->data['parentname'])
39	->addVar('triggerid', $this->data['triggerid']);
40if (isset($this->data['service'])) {
41	$servicesForm->addVar('serviceid', $this->data['service']['serviceid']);
42}
43
44// create form list
45$servicesFormList = (new CFormList('servicesFormList'))
46	->addRow(
47		(new CLabel(_('Name'), 'name'))->setAsteriskMark(),
48		(new CTextBox('name', $this->data['name'], false, 128))
49			->setWidth(ZBX_TEXTAREA_STANDARD_WIDTH)
50			->setAriaRequired()
51			->setAttribute('autofocus', 'autofocus')
52	);
53
54// append parent link to form list
55$parent_service_popup_options = [
56	'pservices' => '1'
57];
58if ($this->data['service'] && $this->data['service']['serviceid']) {
59	$parent_service_popup_options['serviceid'] = $this->data['service']['serviceid'];
60}
61$servicesFormList->addRow((new CLabel(_('Parent service'), 'parent_name'))->setAsteriskMark(), [
62	(new CTextBox('parent_name', $this->data['parentname'], true, 128))
63		->setWidth(ZBX_TEXTAREA_STANDARD_WIDTH)
64		->setAriaRequired(),
65	(new CDiv())->addClass(ZBX_STYLE_FORM_INPUT_MARGIN),
66	(new CButton('select_parent', _x('Change', 'verb')))
67		->addClass(ZBX_STYLE_BTN_GREY)
68		->onClick('return PopUp("popup.services",jQuery.extend('.
69			json_encode($parent_service_popup_options).
70				',{parentid: this.form.parentid.value}), null, this);'
71		)
72]);
73
74// append algorithm to form list
75$servicesFormList->addRow(
76	new CLabel(_('Status calculation algorithm'), 'label-algorithm'),
77	(new CSelect('algorithm'))
78		->setId('algorithm')
79		->setValue($data['algorithm'])
80		->addOptions(CSelect::createOptionsFromArray(serviceAlgorithm()))
81		->setFocusableElementId('label-algorithm')
82);
83
84// append SLA to form list
85$showslaCheckbox = (new CCheckBox('showsla'))->setChecked($this->data['showsla'] == SERVICE_SHOW_SLA_ON);
86$goodslaTextBox = (new CTextBox('goodsla', $this->data['goodsla'], false, 8))->setWidth(ZBX_TEXTAREA_TINY_WIDTH);
87if (!$this->data['showsla']) {
88	$goodslaTextBox->setAttribute('disabled', 'disabled');
89}
90$servicesFormList->addRow(_('Calculate SLA, acceptable SLA (in %)'), [
91	$showslaCheckbox, (new CDiv())->addClass(ZBX_STYLE_FORM_INPUT_MARGIN), $goodslaTextBox
92]);
93
94// append trigger to form list
95$servicesFormList->addRow(_('Trigger'), [
96	(new CTextBox('trigger', $this->data['trigger'], true))->setWidth(ZBX_TEXTAREA_STANDARD_WIDTH),
97	(new CDiv())->addClass(ZBX_STYLE_FORM_INPUT_MARGIN),
98	(new CButton('btn1', _('Select')))
99		->addClass(ZBX_STYLE_BTN_GREY)
100		->onClick('return PopUp("popup.generic",'.
101			json_encode([
102				'srctbl' => 'triggers',
103				'srcfld1' => 'triggerid',
104				'srcfld2' => 'description',
105				'dstfrm' => $servicesForm->getName(),
106				'dstfld1' => 'triggerid',
107				'dstfld2' => 'trigger',
108				'real_hosts' => '1',
109				'with_triggers' => '1'
110			]).', null, this);'
111		)
112]);
113$servicesFormList->addRow((new CLabel(_('Sort order (0->999)'), 'sortorder'))->setAsteriskMark(),
114	(new CTextBox('sortorder', $this->data['sortorder'], false, 3))
115		->setWidth(ZBX_TEXTAREA_TINY_WIDTH)
116		->setAriaRequired()
117);
118
119/*
120 * Dependencies tab
121 */
122$servicesChildTable = (new CTable())
123	->setAttribute('style', 'width: 100%;')
124	->setId('service_children')
125	->setHeader([_('Services'), _('Soft'), _('Trigger'), _('Action')]);
126foreach ($this->data['children'] as $child) {
127	$childrenLink = (new CLink($child['name'], 'services.php?form=1&serviceid='.$child['serviceid']))
128		->setTarget('_blank');
129
130	$servicesChildTable->addRow(
131		(new CRow([
132			[
133				$childrenLink,
134				new CVar('children['.$child['serviceid'].'][name]', $child['name']),
135				new CVar('children['.$child['serviceid'].'][serviceid]', $child['serviceid']),
136				new CVar('children['.$child['serviceid'].'][trigger]', $child['trigger'])
137			],
138			(new CCheckBox('children['.$child['serviceid'].'][soft]'))
139				->setChecked(isset($child['soft']) && !empty($child['soft'])),
140			!empty($child['trigger']) ? $child['trigger'] : '',
141			(new CCol(
142				(new CButton('remove', _('Remove')))
143					->onClick('javascript: removeDependentChild(\''.$child['serviceid'].'\');')
144					->addClass(ZBX_STYLE_BTN_LINK)
145					->removeId()
146			))->addClass(ZBX_STYLE_NOWRAP)
147		]))->setId('children_'.$child['serviceid'])
148	);
149}
150$servicesDependenciesFormList = new CFormList('servicesDependensiesFormList');
151
152$dep_service_popup_options = [
153	'cservices' => '1'
154];
155if ($this->data['service'] && $this->data['service']['serviceid']) {
156	$dep_service_popup_options['serviceid'] = $this->data['service']['serviceid'];
157}
158
159$servicesDependenciesFormList->addRow(
160	_('Depends on'),
161	(new CDiv([
162		$servicesChildTable,
163		(new CButton('add_child_service', _('Add')))
164			->onClick('return PopUp("popup.services",jQuery.extend('.
165				json_encode($dep_service_popup_options).
166					',{parentid: this.form.parentid.value}), null, this);'
167			)
168			->addClass(ZBX_STYLE_BTN_LINK)
169	]))
170		->addClass(ZBX_STYLE_TABLE_FORMS_SEPARATOR)
171		->setAttribute('style', 'min-width: '.ZBX_TEXTAREA_BIG_WIDTH.'px;')
172);
173
174// Service times tab.
175$servicesTimeFormList = new CFormList('servicesTimeFormList');
176$servicesTimeTable = (new CTable())
177	->setAttribute('style', 'width: 100%;')
178	->setHeader([_('Type'), _('Interval'), _('Note'), _('Action')]);
179
180$i = 0;
181
182foreach ($data['times'] as $service_time) {
183	switch ($service_time['type']) {
184		case SERVICE_TIME_TYPE_UPTIME:
185			$type = (new CSpan(_('Uptime')))->addClass('enabled');
186			$from = dowHrMinToStr($service_time['ts_from']);
187			$till = dowHrMinToStr($service_time['ts_to'], true);
188			break;
189
190		case SERVICE_TIME_TYPE_DOWNTIME:
191			$type = (new CSpan(_('Downtime')))->addClass('disabled');
192			$from = dowHrMinToStr($service_time['ts_from']);
193			$till = dowHrMinToStr($service_time['ts_to'], true);
194			break;
195
196		case SERVICE_TIME_TYPE_ONETIME_DOWNTIME:
197			$type = (new CSpan(_('One-time downtime')))->addClass('disabled');
198			$from = zbx_date2str(DATE_TIME_FORMAT, $service_time['ts_from']);
199			$till = zbx_date2str(DATE_TIME_FORMAT, $service_time['ts_to']);
200			break;
201	}
202
203	$row = new CRow([
204		[
205			$type,
206			new CVar('times['.$i.'][type]', $service_time['type']),
207			new CVar('times['.$i.'][ts_from]', $service_time['ts_from']),
208			new CVar('times['.$i.'][ts_to]', $service_time['ts_to']),
209			new CVar('times['.$i.'][note]', $service_time['note'])
210		],
211		$from.' - '.$till,
212		(new CCol($service_time['note']))
213			->addClass(ZBX_STYLE_WORDWRAP)
214			->addStyle('max-width: '.ZBX_TEXTAREA_BIG_WIDTH.'px;'),
215		(new CCol(
216			(new CButton('remove', _('Remove')))
217				->onClick('javascript: removeTime(\''.$i.'\');')
218				->addClass(ZBX_STYLE_BTN_LINK)
219				->removeId()
220		))->addClass(ZBX_STYLE_NOWRAP)
221	]);
222	$row->setId('times_'.$i);
223	$servicesTimeTable->addRow($row);
224	$i++;
225}
226
227$servicesTimeFormList->addRow(_('Service times'),
228	(new CDiv($servicesTimeTable))
229		->addClass(ZBX_STYLE_TABLE_FORMS_SEPARATOR)
230		->setAttribute('style', 'min-width: '.ZBX_TEXTAREA_BIG_WIDTH.'px;')
231);
232
233// create service time table
234$serviceTimeTable = (new CFormList())
235	->addRow(
236		(new CLabel(_('Period type'), 'label-period-type')),
237		(new CSelect('new_service_time[type]'))
238			->setId('period-type')
239			->setFocusableElementId('label-period-type')
240			->setValue($data['new_service_time']['type'])
241			->addOptions(CSelect::createOptionsFromArray([
242				SERVICE_TIME_TYPE_UPTIME => _('Uptime'),
243				SERVICE_TIME_TYPE_DOWNTIME => _('Downtime'),
244				SERVICE_TIME_TYPE_ONETIME_DOWNTIME => _('One-time downtime')
245			]))
246	);
247
248if ($data['new_service_time']['type'] == SERVICE_TIME_TYPE_ONETIME_DOWNTIME) {
249	$serviceTimeTable
250		->addRow(
251			_('Note'),
252			(new CTextBox('new_service_time[note]'))
253				->setWidth(ZBX_TEXTAREA_STANDARD_WIDTH)
254				->setAttribute('placeholder', _('short description'))
255		)
256		->addRow(
257			(new CLabel(_('From'), 'new_service_time_from'))->setAsteriskMark(),
258			(new CDateSelector('new_service_time_from', $data['new_service_time_from']))
259				->setDateFormat(ZBX_DATE_TIME)
260				->setPlaceholder(_('YYYY-MM-DD hh:mm'))
261				->setAriaRequired()
262		)
263		->addRow(
264			(new CLabel(_('Till'), 'new_service_time_till'))->setAsteriskMark(),
265			(new CDateSelector('new_service_time_till', $data['new_service_time_till']))
266				->setDateFormat(ZBX_DATE_TIME)
267				->setPlaceholder(_('YYYY-MM-DD hh:mm'))
268				->setAriaRequired()
269		);
270}
271else {
272	$week_from_select = (new CSelect('new_service_time[from_week]'))
273		->setValue(isset($_REQUEST['new_service_time']['from_week']) ? $_REQUEST['new_service_time']['from_week'] : 0);
274
275	$week_to_select = (new CSelect('new_service_time[to_week]'))
276		->setValue(isset($_REQUEST['new_service_time']['from_week']) ? $_REQUEST['new_service_time']['to_week'] : 0);
277
278	for ($dow = 0; $dow < 7; $dow++) {
279		$week_from_select->addOption(new CSelectOption($dow, getDayOfWeekCaption($dow)));
280		$week_to_select->addOption(new CSelectOption($dow, getDayOfWeekCaption($dow)));
281	}
282	$timeFromHourTextBox = (new CTextBox('new_service_time[from_hour]', isset($_REQUEST['new_service_time']['from_hour'])
283			? $_REQUEST['new_service_time']['from_hour'] : '', false, 2))
284		->setWidth(ZBX_TEXTAREA_2DIGITS_WIDTH)
285		->setAriaRequired()
286		->setAttribute('placeholder', _('hh'));
287	$timeFromMinuteTextBox = (new CTextBox('new_service_time[from_minute]', isset($_REQUEST['new_service_time']['from_minute'])
288			? $_REQUEST['new_service_time']['from_minute'] : '', false, 2))
289		->setWidth(ZBX_TEXTAREA_2DIGITS_WIDTH)
290		->setAriaRequired()
291		->setAttribute('placeholder', _('mm'));
292	$timeToHourTextBox = (new CTextBox('new_service_time[to_hour]', isset($_REQUEST['new_service_time']['to_hour'])
293			? $_REQUEST['new_service_time']['to_hour'] : '', false, 2))
294		->setWidth(ZBX_TEXTAREA_2DIGITS_WIDTH)
295		->setAriaRequired()
296		->setAttribute('placeholder', _('hh'));
297	$timeToMinuteTextBox = (new CTextBox('new_service_time[to_minute]', isset($_REQUEST['new_service_time']['to_minute'])
298			? $_REQUEST['new_service_time']['to_minute'] : '', false, 2))
299		->setWidth(ZBX_TEXTAREA_2DIGITS_WIDTH)
300		->setAriaRequired()
301		->setAttribute('placeholder', _('mm'));
302
303	$serviceTimeTable
304		->addRow(
305			(new CLabel(_('From'), 'new_service_time_from'))->setAsteriskMark(),
306			(new CDiv([
307					$week_from_select,
308					(new CDiv())->addClass(ZBX_STYLE_FORM_INPUT_MARGIN),
309					_('Time'),
310					(new CDiv())->addClass(ZBX_STYLE_FORM_INPUT_MARGIN),
311					$timeFromHourTextBox,
312					(new CDiv())->addClass(ZBX_STYLE_FORM_INPUT_MARGIN),
313					':',
314					(new CDiv())->addClass(ZBX_STYLE_FORM_INPUT_MARGIN),
315					$timeFromMinuteTextBox
316			]))
317		)
318		->addRow(
319			(new CLabel(_('Till'), 'new_service_time_to'))->setAsteriskMark(),
320			(new CDiv([
321				$week_to_select,
322				(new CDiv())->addClass(ZBX_STYLE_FORM_INPUT_MARGIN),
323				_('Time'),
324				(new CDiv())->addClass(ZBX_STYLE_FORM_INPUT_MARGIN),
325				$timeToHourTextBox,
326				(new CDiv())->addClass(ZBX_STYLE_FORM_INPUT_MARGIN),
327				':',
328				(new CDiv())->addClass(ZBX_STYLE_FORM_INPUT_MARGIN),
329				$timeToMinuteTextBox
330			]))
331		);
332	$servicesForm->addVar('new_service_time[note]', '');
333}
334
335$servicesTimeFormList->addRow(_('New service time'),
336	(new CDiv([
337		$serviceTimeTable,
338		(new CSimpleButton(_('Add')))
339			->onClick('javascript: submitFormWithParam("'.$servicesForm->getName().'", "add_service_time", "1");')
340			->addClass(ZBX_STYLE_BTN_LINK)
341	]))
342		->addClass(ZBX_STYLE_TABLE_FORMS_SEPARATOR)
343		->setAttribute('style', 'min-width: '.ZBX_TEXTAREA_BIG_WIDTH.'px;')
344);
345
346/*
347 * Append tabs to form
348 */
349$servicesTab = new CTabView();
350if (!$this->data['form_refresh']) {
351	$servicesTab->setSelected(0);
352}
353$servicesTab
354	->addTab('servicesTab', _('Service'), $servicesFormList)
355	->addTab('servicesDependenciesTab', _('Dependencies'), $servicesDependenciesFormList)
356	->addTab('servicesTimeTab', _('Time'), $servicesTimeFormList);
357
358// append buttons to form
359if ($service && $service['serviceid']) {
360	$buttons = [new CButtonCancel()];
361	if (!$service['dependencies']) {
362		array_unshift($buttons, new CButtonDelete(
363			'Delete selected service?',
364			url_param('form').url_param('serviceid').'&saction=1'
365		));
366	}
367
368	$servicesTab->setFooter(makeFormFooter(
369		(new CSubmit('update', _('Update')))->onClick('javascript: document.forms[0].action += \'?saction=1\';'),
370		$buttons
371	));
372}
373else {
374	$servicesTab->setFooter(makeFormFooter(
375		(new CSubmit('add', _('Add')))->onClick('javascript: document.forms[0].action += \'?saction=1\';'),
376		[new CButtonCancel()]
377	));
378}
379
380$servicesForm->addItem($servicesTab);
381
382// append form to widget
383$widget->addItem($servicesForm);
384
385$widget->show();
386