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