var refreshMSeconds = 99999999; var myTimer; var monitorCfg = globalThis.monitorPageConfig || {}; var mbColor = monitorCfg.mbColor || ''; var monitorFont = monitorCfg.monitorFont || '10px'; var dozoomRefresh = Boolean(monitorCfg.doZoomRefresh); var monitorMessages = monitorCfg.messages || {}; var monitorNewForm = monitorCfg.newForm || ''; var monitorNewTitle = monitorCfg.newTitle || ''; function setZoomErrorBackgrounds() { if (mbColor !== '') { $('.monitor_container').css('background-color', mbColor); $('.cactiConsoleContentArea').css('background-color', mbColor); } } // Multi-select filters (Events, Template) return an array when themed by // select2; a plain hidden input returns a comma string. Normalize to a comma // string for request/POST serialization. function serializeMultiVal(value) { if (Array.isArray(value)) { return value.join(','); } return value || ''; } function setIntervalX(callback, delay, repetitions) { let x = 0; const intervalID = globalThis.setInterval(() => { callback(); if (++x === repetitions) { globalThis.clearInterval(intervalID); setZoomErrorBackgrounds(); } }, delay); } if (mbColor === '') { $('.monitor_container').css('background-color', ''); $('.cactiConsoleContentArea').css('background-color', ''); } else { let monoe = false; setZoomErrorBackgrounds(); $('.monitor_errorzoom_title').css('font-size', monitorFont); setIntervalX(() => { if (monoe) { if (mbColor !== '') { $('.monitor_container').css('background-color', ''); $('.cactiConsoleContentArea').css('background-color', ''); } monoe = false; } else { setZoomErrorBackgrounds(); monoe = true; } }, 600, 8); } function timeStep() { const value = Number($('#timer').html()) - 1; if (value <= 0) { applyFilter('refresh'); } else { $('#timer').html(value); // What is a second, well if you are an // imperial storm tropper, it's just a little more than a second. myTimer = setTimeout(timeStep, 1284); } } function muteUnmuteAudio(mute) { if (mute) { $('audio').each(function() { this.pause(); this.currentTime = 0; }); } else if ($('#downhosts').val() === 'true') { $('audio').each(function() { this.play(); }); } } function closeTip() { $(document).tooltip('close'); } function saveCardOrder(grid) { const grouping = grid.data('grouping'); const order = grid .find('.monitorGroupCard') .map((i, el) => $(el).data('group')) .get(); const post = { action: 'ajax_saveorder', grouping, dashboard: $('#dashboard').val(), order, __csrf_magic: csrfMagicToken }; $.post('monitor.php?header=false', post); } function openHostPanel(id) { if (id === undefined || id === null || id === '') { return; } let dlg = $('#monitorPanelDialog'); if (dlg.length === 0) { dlg = $('
').appendTo('body'); } dlg.html(`
${monitorMessages.loading || 'Loading...'}
`); const maxHeight = Math.max(360, $(globalThis).height() - 80); dlg.dialog({ title: monitorMessages.deviceDetails || 'Device Details', width: 720, height: 'auto', maxHeight: maxHeight, modal: false, closeOnEscape: true, position: { my: 'center top', at: 'center top+80', of: globalThis }, open() { // Pause the refresh countdown so the page does not reload underneath // the open dialog. clearTimeout(myTimer); }, close() { myTimer = setTimeout(timeStep, 1000); } }); $.get(`monitor.php?action=ajax_hostpanel&header=false&id=${id}`, (data) => { dlg.html(data); }); } function applyFilter(action = '') { clearTimeout(myTimer); $('.mon_icon').unbind(); let strURL; if (action === 'dashboard') { strURL = `monitor.php?action=dbchange&header=false&dashboard=${$('#dashboard').val()}`; } else { strURL = 'monitor.php?header=false'; if (action !== '') { strURL += `&action=${action}`; } strURL += `&refresh=${$('#refresh').val()}`; strURL += `&grouping=${$('#grouping').val()}`; strURL += `&tree=${$('#tree').val()}`; strURL += `&site=${$('#site').val()}`; strURL += `&template=${serializeMultiVal($('#template').val())}`; strURL += `&view=${$('#view').val()}`; strURL += `&rows=${$('#rows').val()}`; strURL += `&crit=${$('#crit').val()}`; strURL += `&size=${$('#size').val()}`; strURL += `&trim=${$('#trim').val()}`; strURL += `&mute=${$('#mute').val()}`; strURL += `&rfilter=${base64_encode($('#rfilter').val())}`; strURL += `&status=${$('#status').val()}`; const events = $('#events').val(); strURL += `&events=${events ? events.join(',') : ''}`; } if (action === 'ajax_mute_all' || action === 'ajax_unmute_all') { postIt(strURL, { __csrf_magic: csrfMagicToken }); } else { loadIt(strURL); } } function saveFilter() { const url = 'monitor.php?action=save&header=false'; const post = { dashboard: $('#dashboard').val(), refresh: $('#refresh').val(), grouping: $('#grouping').val(), tree: $('#tree').val(), site: $('#site').val(), template: serializeMultiVal($('#template').val()), events: serializeMultiVal($('#events').val()), view: $('#view').val(), rows: $('#rows').val(), crit: $('#crit').val(), rfilter: base64_encode($('#rfilter').val()), trim: $('#trim').val(), mute: $('#mute').val(), size: $('#size').val(), status: $('#status').val(), __csrf_magic: csrfMagicToken }; $.post(url, post).done(() => { $('#text').show().text(monitorMessages.filterSaved || '').fadeOut(2000); }); } function saveNewDashboard(action) { const dashboard = action === 'new' ? '-1' : $('#dashboard').val(); const url = 'monitor.php?header=false'; const post = { action: 'saveDb', dashboard, name: $('#name').val(), refresh: $('#refresh').val(), grouping: $('#grouping').val(), tree: $('#tree').val(), site: $('#site').val(), template: serializeMultiVal($('#template').val()), events: serializeMultiVal($('#events').val()), view: $('#view').val(), rows: $('#rows').val(), crit: $('#crit').val(), rfilter: base64_encode($('#rfilter').val()), trim: $('#trim').val(), size: $('#size').val(), mute: $('#mute').val(), status: $('#status').val(), __csrf_magic: csrfMagicToken }; $('#newdialog').dialog('close'); postIt(url, post); } function removeDashboard() { const post = { action: 'remove', dashboard: $('#dashboard').val(), __csrf_magic: csrfMagicToken }; postIt('monitor.php?header=false', post); } function loadIt(url) { if (typeof loadUrl === 'undefined') { loadPageNoHeader(url); } else { loadUrl({ url }); } } function postIt(url, post, returnLocation) { if (typeof postUrl === 'undefined') { loadPageUsingPost(url, post); } else { postUrl( { url, tabId: returnLocation, type: 'loadPageUsingPost' }, post ); } } function saveDashboard(action) { const btnDialog = { Cancel: { text: monitorMessages.cancel || 'Cancel', id: 'btnCancel', click() { $(this).dialog('close'); } }, Save: { text: monitorMessages.save || 'Save', id: 'btnSave', click() { saveNewDashboard(action); } } }; if ($('#newdialog').length === 0) { $('body').append(monitorNewForm); } $('#newdialog').dialog({ title: monitorNewTitle, minHeight: 80, minWidth: 500, buttons: btnDialog, position: { at: 'center top+240px', of: globalThis }, open() { $('#name').val($('#dashboard option:selected').text()); $('#btnSave').addClass('ui-state-active'); $('#name').focus(); $('#new_dashboard') .off('submit') .on('submit', (event) => { event.preventDefault(); saveNewDashboard('new'); }); } }); } $(() => { if (dozoomRefresh) { applyFilter('refresh'); } const selectmenu = $('#grouping').selectmenu('instance') !== undefined; if ($('#view').val() === 'list') { $('#grouping').prop('disabled', true); if (selectmenu) { $('#grouping').selectmenu('disable'); } } else { $('#grouping').prop('disabled', false); if (selectmenu) { $('#grouping').selectmenu('enable'); } } clearTimeout(myTimer); $('#go').click((event) => { event.preventDefault(); applyFilter('go'); }); $('#clear').click(() => { loadIt('monitor.php?clear=1&header=false'); }); $('#sound').click(() => { if ($('#mute').val() === 'false') { $('#mute').val('true'); muteUnmuteAudio(true); applyFilter('ajax_mute_all'); } else { $('#mute').val('false'); muteUnmuteAudio(false); applyFilter('ajax_unmute_all'); } }); $('#devices').click(() => { document.location = urlPath + 'host.php'; }); $('#refresh, #view, #rows, #trim, #crit, #grouping, #size, #status, #tree, #site').change(() => { applyFilter('change'); }); // Events and Template multi-selects: let the user tick several boxes with // the dropdown staying open (reloading mid-selection would close it, since // the filter is re-rendered), then apply once when the dropdown closes. A // plain multiple select (no select2) has no dropdown to keep open, so it // applies on change. $('#events, #template').on('select2:close', () => { applyFilter('change'); }); $('#events, #template').on('change', function () { if (!$(this).data('select2')) { applyFilter('change'); } }); $('#dashboard').change(() => { applyFilter('dashboard'); }); $('#save').click(() => { saveFilter(); }); $('#new').click(() => { saveDashboard('new'); }); $('#rename').click(() => { saveDashboard('rename'); }); $('#delete').click(() => { removeDashboard(); }); $('.monitorFilterForm').submit((event) => { event.preventDefault(); applyFilter('change'); }); $(document).on('click', '.monitorActions', (event) => { event.preventDefault(); openHostPanel($(event.currentTarget).data('id')); }); $(document).on('click', '.monitorFilterPill', (event) => { event.preventDefault(); event.stopPropagation(); const pill = $(event.currentTarget); const filter = pill.data('filter'); const value = String(pill.data('value')); const sel = $('#' + filter); if (!sel.length) { return; } if (sel.prop('multiple')) { // Additive multi-select (Events): toggle this value in or out of the // current selection, sync the select2 widget without firing the // generic change (which is debounced), then apply immediately. let current = sel.val() || []; if (current.indexOf(value) >= 0) { current = current.filter((v) => v !== value); } else { current = current.concat([value]); } sel.val(current).trigger('change.select2'); applyFilter(); } else { // Single-select (Criticality / Show): toggle on, or clear to default. // The bound change handler applies the filter. sel.val(String(sel.val()) === value ? '-1' : value).trigger('change'); } }); // The filter pills carry role="button" and tabindex="0"; activate them from // the keyboard (Enter / Space) by reusing the click handler above, so they // are operable without a mouse. $(document).on('keydown', '.monitorFilterPill', (event) => { if (event.key === 'Enter' || event.key === ' ' || event.key === 'Spacebar' || event.keyCode === 13 || event.keyCode === 32) { event.preventDefault(); $(event.currentTarget).trigger('click'); } }); if ($.fn.sortable) { $('.monitorGroupGrid').sortable({ items: '.monitorGroupCard', handle: '.monitorGroupDrag', placeholder: 'monitorGroupPlaceholder', forcePlaceholderSize: true, tolerance: 'pointer', update(event, ui) { saveCardOrder($(event.target)); } }); } $('.monitor_device_frame').find('i').tooltip({ items: '.mon_icon', open(event, ui) { ajaxAnchors(); if (event.originalEvent === undefined) { return false; } }, close(event, ui) { ui.tooltip.hover( function() { $(this).stop(true).fadeTo(400, 1); }, function() { $(this).fadeOut('400'); } ); }, position: { my: 'left:15 top', at: 'right center' }, content(callback) { const id = $(this).attr('id'); const size = $('#size').val(); $.get(`monitor.php?action=ajax_status&size=${size}&id=${id}`, (data) => { callback(data); }); } }); myTimer = setTimeout(timeStep, 1000); $(globalThis).resize(() => { $(document).tooltip('option', 'position', { my: 'left:15 top', at: 'right center' }); }); if ($('#mute').val() === 'true') { muteUnmuteAudio(true); } else { muteUnmuteAudio(false); } $('#main').css('margin-right', '15px'); });