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$output = [];
23
24if (($messages = getMessages()) !== null) {
25	$output['messages'] = $messages->toString();
26}
27
28if (array_key_exists('problems', $data)) {
29	// Show trigger description and URL.
30	$div = new CDiv();
31
32	if ($data['trigger']['comments'] !== '') {
33		$div->addItem(
34			(new CDiv())
35				->addItem(zbx_str2links($data['trigger']['comments']))
36				->addClass(ZBX_STYLE_OVERLAY_DESCR)
37				->addStyle('max-width: 500px')
38		);
39	}
40
41	if ($data['trigger']['url'] !== '') {
42		$trigger_url = CHtmlUrlValidator::validate($data['trigger']['url'], ['allow_user_macro' => false])
43			? $data['trigger']['url']
44			: 'javascript: alert(\''._s('Provided URL "%1$s" is invalid.',
45				json_encode($data['trigger']['url'])).
46			'\');';
47
48		$div->addItem(
49			(new CDiv())
50				->addItem(new CLink(CHtml::encode($data['trigger']['url']), $trigger_url))
51				->addClass(ZBX_STYLE_OVERLAY_DESCR_URL)
52				->addStyle('max-width: 500px')
53		);
54	}
55
56	// sort field indicator
57	$sort_div = (new CSpan())->addClass(ZBX_STYLE_ARROW_DOWN);
58
59	if ($data['show_timeline']) {
60		$header = [
61			(new CColHeader([_('Time'), $sort_div]))->addClass(ZBX_STYLE_RIGHT),
62			(new CColHeader())->addClass(ZBX_STYLE_TIMELINE_TH),
63			(new CColHeader())->addClass(ZBX_STYLE_TIMELINE_TH)
64		];
65	}
66	else {
67		$header = [[_('Time'), $sort_div]];
68	}
69
70	// Show events.
71	$table = (new CTableInfo())
72		->setHeader(array_merge($header, [
73			_('Recovery time'),
74			_('Status'),
75			_('Duration'),
76			_('Ack'),
77			($data['show_tags'] != PROBLEMS_SHOW_TAGS_NONE) ? _('Tags') : null
78		]));
79
80	$today = strtotime('today');
81	$last_clock = 0;
82
83	if ($data['problems'] && $data['show_tags'] != PROBLEMS_SHOW_TAGS_NONE) {
84		$tags = makeTags($data['problems'], true, 'eventid', $data['show_tags'], $data['filter_tags'],
85			$data['tag_name_format'], $data['tag_priority']
86		);
87	}
88
89	$url_details = $data['allowed_ui_problems']
90		? (new CUrl('tr_events.php'))
91			->setArgument('triggerid', $data['trigger']['triggerid'])
92			->setArgument('eventid', '')
93		: null;
94
95	foreach ($data['problems'] as $problem) {
96		$can_be_closed = $data['allowed_close'];
97
98		if ($problem['r_eventid'] != 0) {
99			$value = TRIGGER_VALUE_FALSE;
100			$value_str = _('RESOLVED');
101			$value_clock = $problem['r_clock'];
102			$can_be_closed = false;
103		}
104		else {
105			$in_closing = false;
106
107			foreach ($problem['acknowledges'] as $acknowledge) {
108				if (($acknowledge['action'] & ZBX_PROBLEM_UPDATE_CLOSE) == ZBX_PROBLEM_UPDATE_CLOSE) {
109					$in_closing = true;
110					$can_be_closed = false;
111					break;
112				}
113			}
114
115			$value = $in_closing ? TRIGGER_VALUE_FALSE : TRIGGER_VALUE_TRUE;
116			$value_str = $in_closing ? _('CLOSING') : _('PROBLEM');
117			$value_clock = $in_closing ? time() : $problem['clock'];
118		}
119
120		$cell_clock = ($problem['clock'] >= $today)
121			? zbx_date2str(TIME_FORMAT_SECONDS, $problem['clock'])
122			: zbx_date2str(DATE_TIME_FORMAT_SECONDS, $problem['clock']);
123
124		if ($url_details !== null) {
125			$url_details->setArgument('eventid', $problem['eventid']);
126			$cell_clock = new CCol(new CLink($cell_clock, $url_details));
127		}
128		else {
129			$cell_clock = new CCol($cell_clock);
130		}
131
132		if ($problem['r_eventid'] != 0) {
133			$cell_r_clock = ($problem['r_clock'] >= $today)
134				? zbx_date2str(TIME_FORMAT_SECONDS, $problem['r_clock'])
135				: zbx_date2str(DATE_TIME_FORMAT_SECONDS, $problem['r_clock']);
136			$cell_r_clock = (new CCol(($url_details !== null)
137				? new CLink($cell_r_clock, $url_details)
138				: $cell_r_clock
139			))
140				->addClass(ZBX_STYLE_NOWRAP)
141				->addClass(ZBX_STYLE_RIGHT);
142		}
143		else {
144			$cell_r_clock = '';
145		}
146
147		$is_acknowledged = ($problem['acknowledged'] == EVENT_ACKNOWLEDGED);
148		$cell_status = new CSpan($value_str);
149
150		// Add colors and blinking to span depending on configuration and trigger parameters.
151		addTriggerValueStyle($cell_status, $value, $value_clock, $is_acknowledged);
152
153		if ($data['show_timeline']) {
154			if ($last_clock != 0) {
155				CScreenProblem::addTimelineBreakpoint($table, $last_clock, $problem['clock'], ZBX_SORT_DOWN);
156			}
157			$last_clock = $problem['clock'];
158
159			$row = [
160				$cell_clock->addClass(ZBX_STYLE_TIMELINE_DATE),
161				(new CCol())
162					->addClass(ZBX_STYLE_TIMELINE_AXIS)
163					->addClass(ZBX_STYLE_TIMELINE_DOT),
164				(new CCol())->addClass(ZBX_STYLE_TIMELINE_TD)
165			];
166		}
167		else {
168			$row = [
169				$cell_clock
170					->addClass(ZBX_STYLE_NOWRAP)
171					->addClass(ZBX_STYLE_RIGHT)
172			];
173		}
174
175		// Create acknowledge link.
176		$problem_update_link = ($data['allowed_add_comments'] || $data['allowed_change_severity']
177			|| $data['allowed_acknowledge'] || $can_be_closed)
178			? (new CLink($is_acknowledged ? _('Yes') : _('No')))
179				->addClass($is_acknowledged ? ZBX_STYLE_GREEN : ZBX_STYLE_RED)
180				->addClass(ZBX_STYLE_LINK_ALT)
181				->onClick('acknowledgePopUp('.json_encode(['eventids' => [$problem['eventid']]]).', this);')
182			: (new CSpan($is_acknowledged ? _('Yes') : _('No')))->addClass(
183				$is_acknowledged ? ZBX_STYLE_GREEN : ZBX_STYLE_RED
184			);
185
186		$table->addRow(array_merge($row, [
187			$cell_r_clock,
188			$cell_status,
189			(new CCol(
190				($problem['r_eventid'] != 0)
191					? zbx_date2age($problem['clock'], $problem['r_clock'])
192					: zbx_date2age($problem['clock'])
193			))
194				->addClass(ZBX_STYLE_NOWRAP),
195			$problem_update_link,
196			($data['show_tags'] != PROBLEMS_SHOW_TAGS_NONE) ? $tags[$problem['eventid']] : null
197		]));
198	}
199
200	$div->addItem($table);
201
202	$output['data'] = $div->toString();
203}
204
205echo json_encode($output);
206