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
26if (array_key_exists('filter_options', $data)) { ?>
27	<script type="text/javascript">
28	$(function() {
29		var options = <?= json_encode($data['filter_options']) ?>,
30			filter = new CTabFilter($('#monitoring_problem_filter')[0], options),
31			refresh_interval = <?= $data['refresh_interval'] ?>,
32			refresh_timer,
33			filter_item,
34			filter_counter_fetch,
35			active_filter = filter._active_item,
36			global_timerange = {
37				from: options.timeselector.from,
38				to: options.timeselector.to
39			};
40
41		const url = new Curl('zabbix.php', false);
42		url.setArgument('action', 'problem.view.refresh');
43		const refresh_url = url.getUrl();
44
45		/**
46		 * Update on filter changes.
47		 */
48		filter.on(TABFILTER_EVENT_URLSET, () => {
49			let url = new Curl();
50
51			url.setArgument('action', 'problem.view.csv');
52			$('#export_csv').attr('data-url', url.getUrl());
53			refreshResults();
54			refreshCounters();
55
56			if (active_filter !== filter._active_item) {
57				active_filter = filter._active_item;
58				chkbxRange.checkObjectAll(chkbxRange.pageGoName, false);
59				chkbxRange.clearSelectedOnFilterChange();
60			}
61		});
62
63		/**
64		 * Update filter item counter when filter settings updated.
65		 */
66		filter.on(TABFILTER_EVENT_UPDATE, (ev) => {
67			if (!filter._active_item.hasCounter() || ev.detail.filter_property !== 'properties') {
68				return;
69			}
70
71			if (filter_counter_fetch) {
72				filter_counter_fetch.abort();
73			}
74
75			filter_counter_fetch = new AbortController();
76			filter_item = filter._active_item;
77
78			fetch(refresh_url, {
79				method: 'POST',
80				signal: filter_counter_fetch.signal,
81				body: new URLSearchParams({filter_counters: 1, counter_index: filter_item._index})
82			})
83				.then(response => response.json())
84				.then(response => {
85					filter_item.updateCounter(response.filter_counters.pop());
86				});
87		});
88
89		/**
90		 * Refresh results table via window.flickerfreeScreen.refresh call.
91		 */
92		function refreshResults() {
93			let url = new Curl(),
94				screen = window.flickerfreeScreen.screens['problem'],
95				data = $.extend(<?= json_encode($data['filter_defaults']) ?>,
96					global_timerange, url.getArgumentsObject()
97				);
98
99			data.inventory = data.inventory
100				? data.inventory.filter(inventory => 'value' in inventory && inventory.value !== '')
101				: data.inventory;
102			data.tags = data.tags
103				? data.tags.filter(tag => !(tag.tag === '' && tag.value === ''))
104				: data.tags;
105			data.severities = data.severities
106				? data.severities.filter((value, key) => value == key)
107				: data.severities;
108
109			// Modify filter data of flickerfreeScreen object with id 'problem'.
110			if (data.page === null) {
111				delete data.page;
112			}
113
114			if (data.filter_custom_time) {
115				screen.timeline.from = data.from;
116				screen.timeline.to = data.to;
117			}
118			else {
119				screen.timeline.from = global_timerange.from;
120				screen.timeline.to = global_timerange.to;
121			}
122
123			screen.data.filter = data;
124			screen.data.sort = data.sort;
125			screen.data.sortorder = data.sortorder;
126
127			// Close all opened hint boxes otherwise flicker free screen will not refresh it content.
128			for (var i = overlays_stack.length - 1; i >= 0; i--) {
129				let hintbox = overlays_stack.getById(overlays_stack.stack[i]);
130
131				if (hintbox.type === 'hintbox') {
132					hintBox.hideHint(hintbox.element, true);
133					removeFromOverlaysStack(overlays_stack.stack[i]);
134				}
135			}
136
137			window.flickerfreeScreen.refresh(screen.id);
138		}
139
140		function refreshCounters() {
141			clearTimeout(refresh_timer);
142
143			fetch(refresh_url, {
144				method: 'POST',
145				body: new URLSearchParams({filter_counters: 1})
146			})
147				.then(response => response.json())
148				.then(response => {
149					if (response.filter_counters) {
150						filter.updateCounters(response.filter_counters);
151					}
152
153					if (refresh_interval > 0) {
154						refresh_timer = setTimeout(refreshCounters, refresh_interval);
155					}
156				})
157				.catch(() => {
158					/**
159					 * On error restart refresh timer.
160					 * If refresh interval is set to 0 (no refresh) schedule initialization request after 5 sec.
161					 */
162					refresh_timer = setTimeout(refreshCounters, refresh_interval > 0 ? refresh_interval : 5000);
163				});
164		}
165
166		refreshCounters();
167
168		// Keep timeselector changes in global_timerange.
169		$.subscribe('timeselector.rangeupdate', (e, data) => {
170			if (data.idx === '<?= CControllerProblem::FILTER_IDX ?>') {
171				global_timerange.from = data.from;
172				global_timerange.to = data.to;
173			}
174		});
175	});
176	</script>
177<?php
178}
179?>
180<script type="text/javascript">
181	jQuery(function($) {
182		$(document).on({
183			mouseenter: function() {
184				if ($(this)[0].scrollWidth > $(this)[0].offsetWidth) {
185					$(this).attr({title: $(this).text()});
186				}
187			},
188			mouseleave: function() {
189				if ($(this).is('[title]')) {
190					$(this).removeAttr('title');
191				}
192			}
193		}, 'table.<?= ZBX_STYLE_COMPACT_VIEW ?> a.<?= ZBX_STYLE_LINK_ACTION ?>');
194
195		$.subscribe('acknowledge.create', function(event, response) {
196			// Clear all selected checkboxes in Monitoring->Problems.
197			if (chkbxRange.prefix === 'problem') {
198				chkbxRange.checkObjectAll(chkbxRange.pageGoName, false);
199				chkbxRange.clearSelectedOnFilterChange();
200			}
201
202			window.flickerfreeScreen.refresh('problem');
203
204			clearMessages();
205			addMessage(makeMessageBox('good', [], response.message, true, false));
206		});
207
208		$(document).on('submit', '#problem_form', function(e) {
209			e.preventDefault();
210
211			acknowledgePopUp({eventids: chkbxRange.selectedIds}, this);
212		});
213	});
214</script>
215