/*############################################################################# # # # IPFire.org - A linux based firewall # # Copyright (C) 2007-2021 IPFire Team # # # # This program is free software: you can redistribute it and/or modify # # it under the terms of the GNU General Public License as published by # # the Free Software Foundation, either version 3 of the License, or # # (at your option) any later version. # # # # This program is distributed in the hope that it will be useful, # # but WITHOUT ANY WARRANTY; without even the implied warranty of # # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # # GNU General Public License for more details. # # # # You should have received a copy of the GNU General Public License # # along with this program. If not, see . # # # #############################################################################*/ // "onclick" event handler for graph time range select button // buttonObj: reference to the button function rrdimage_selectRange(buttonObj) { if(! (buttonObj && ('range' in buttonObj.dataset))) { return; //required parameters are missing } // Get selected time range from button const range = buttonObj.dataset.range; // Get surrounding div box and select new range let graphBox = $(buttonObj).closest('div'); _rrdimg_setRange(graphBox, range); } // Document loaded: Process all graphs, start reload timers $(function() { $('div.rrdimage').each(function() { let graphBox = $(this); _rrdimg_setRange(graphBox, graphBox.data('defaultRange'), true); }); }); //--- Internal functions --- // Set or update graph time range, start automatic reloading // graphBox: jQuery object, reference to graph div box // range: time range (day, hour, ...) // initMode: don't immediately reload graph, but force timers and attributes update function _rrdimg_setRange(graphBox, range, initMode = false) { if(! ((graphBox instanceof jQuery) && (graphBox.length === 1))) { return; //graphBox element missing } // Check range parameter, default to "day" on error if(! ["hour", "day", "week", "month", "year"].includes(range)) { range = "day"; } // Check if the time range is changed if((graphBox.data('range') !== range) || initMode) { graphBox.data('range', range); //Store new range // Update button highlighting graphBox.find('button').removeClass('selected'); graphBox.find(`button[data-range="${range}"]`).addClass('selected'); } // Clear pending reload timer to prevent multiple image reloads let timerId = graphBox.data('reloadTimer'); if(timerId !== undefined) { window.clearInterval(timerId); graphBox.removeData('reloadTimer'); } // Determine auto reload interval (in seconds), // interval = 0 disables auto reloading by default let interval = 0; switch(range) { case 'hour': interval = 60; break; case 'day': case 'week': interval = 300; break; } // Start reload timer and store reference if(interval > 0) { timerId = window.setInterval(function(graphRef) { _rrdimg_reload(graphRef); }, interval * 1000, graphBox); graphBox.data('reloadTimer', timerId); } // Always reload image unless disabled by init mode if(! initMode) { _rrdimg_reload(graphBox); } } // Reload graph image, add timestamp to prevent caching // graphBox: jQuery object (graph element must be valid) function _rrdimg_reload(graphBox) { const origin = graphBox.data('origin'); const graph = graphBox.data('graph'); const timestamp = Date.now(); // Get user selected range or fall back to default let range = graphBox.data('range'); if(! range) { range = graphBox.data('defaultRange'); } // Generate new image URL with timestamp const imageUrl = `/cgi-bin/getrrdimage.cgi?origin=${origin}&graph=${graph}&range=${range}×tamp=${timestamp}`; // Get graph image and set new URL graphBox.children('img').first().attr('src', imageUrl); }