Moves graphs to separate page
parent
e50ac96b50
commit
26c7660bfa
|
@ -0,0 +1,96 @@
|
||||||
|
<?php
|
||||||
|
|
||||||
|
$action = $_REQUEST['action'] ?? '';
|
||||||
|
$agent = $_REQUEST['agent'] ?? '';
|
||||||
|
|
||||||
|
require '../app/classes/settings.php';
|
||||||
|
require '../app/classes/agent.php';
|
||||||
|
require '../app/classes/conference.php';
|
||||||
|
require '../app/classes/host.php';
|
||||||
|
|
||||||
|
$settingsObject = new Settings();
|
||||||
|
$agentObject = new Agent($dbWeb);
|
||||||
|
$hostObject = new Host($dbWeb);
|
||||||
|
|
||||||
|
// Connect to Jilo database for log data
|
||||||
|
$response = connectDB($config, 'jilo', $platformDetails[0]['jilo_database'], $platform_id);
|
||||||
|
if ($response['db'] === null) {
|
||||||
|
Messages::flash('ERROR', 'DEFAULT', $response['error']);
|
||||||
|
} else {
|
||||||
|
$db = $response['db'];
|
||||||
|
}
|
||||||
|
$conferenceObject = new Conference($db);
|
||||||
|
|
||||||
|
// Get date range for the last 7 days
|
||||||
|
$from_time = date('Y-m-d', strtotime('-7 days'));
|
||||||
|
$until_time = date('Y-m-d');
|
||||||
|
|
||||||
|
// Define graphs to show
|
||||||
|
$graphs = [
|
||||||
|
[
|
||||||
|
'graph_name' => 'conferences',
|
||||||
|
'graph_title' => 'Conferences in "' . htmlspecialchars($platformDetails[0]['name']) . '" over time',
|
||||||
|
'datasets' => []
|
||||||
|
],
|
||||||
|
[
|
||||||
|
'graph_name' => 'participants',
|
||||||
|
'graph_title' => 'Participants in "' . htmlspecialchars($platformDetails[0]['name']) . '" over time',
|
||||||
|
'datasets' => []
|
||||||
|
]
|
||||||
|
];
|
||||||
|
|
||||||
|
// Get Jitsi API data
|
||||||
|
$conferences_api = $agentObject->getHistoricalData(
|
||||||
|
$platform_id,
|
||||||
|
'jicofo',
|
||||||
|
'conferences',
|
||||||
|
$from_time,
|
||||||
|
$until_time
|
||||||
|
);
|
||||||
|
$graphs[0]['datasets'][] = [
|
||||||
|
'data' => $conferences_api,
|
||||||
|
'label' => 'Conferences from Jitsi API',
|
||||||
|
'color' => 'rgba(75, 192, 192, 1)'
|
||||||
|
];
|
||||||
|
|
||||||
|
// Get conference data from logs
|
||||||
|
$conferences_logs = $conferenceObject->conferenceNumber(
|
||||||
|
$from_time,
|
||||||
|
$until_time
|
||||||
|
);
|
||||||
|
$graphs[0]['datasets'][] = [
|
||||||
|
'data' => $conferences_logs,
|
||||||
|
'label' => 'Conferences from Logs',
|
||||||
|
'color' => 'rgba(255, 99, 132, 1)'
|
||||||
|
];
|
||||||
|
|
||||||
|
// Get participants data
|
||||||
|
$participants_api = $agentObject->getHistoricalData(
|
||||||
|
$platform_id,
|
||||||
|
'jicofo',
|
||||||
|
'participants',
|
||||||
|
$from_time,
|
||||||
|
$until_time
|
||||||
|
);
|
||||||
|
$graphs[1]['datasets'][] = [
|
||||||
|
'data' => $participants_api,
|
||||||
|
'label' => 'Participants from Jitsi API',
|
||||||
|
'color' => 'rgba(75, 192, 192, 1)'
|
||||||
|
];
|
||||||
|
|
||||||
|
// Prepare data for template
|
||||||
|
$graph = $graphs;
|
||||||
|
|
||||||
|
// prepare the widget
|
||||||
|
$widget['full'] = false;
|
||||||
|
$widget['name'] = 'Graphs';
|
||||||
|
$widget['title'] = 'Jitsi graphs';
|
||||||
|
|
||||||
|
// Get any new messages
|
||||||
|
include '../app/includes/messages.php';
|
||||||
|
include '../app/includes/messages-show.php';
|
||||||
|
|
||||||
|
// Load the template
|
||||||
|
include '../app/templates/graphs.php';
|
||||||
|
|
||||||
|
?>
|
|
@ -0,0 +1,144 @@
|
||||||
|
|
||||||
|
<!-- jitsi graphs -->
|
||||||
|
<div class="container-fluid mt-2">
|
||||||
|
<div class="row mb-4">
|
||||||
|
<div class="col-12 mb-4">
|
||||||
|
<h2 class="mb-0">Jitsi graphs</h2>
|
||||||
|
<small>usage graphs for platform <?= htmlspecialchars($platform_id) ?> (<?= htmlspecialchars($platformDetails[0]['name']) ?>)</small>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="row">
|
||||||
|
<div class="card w-auto bg-light border-light card-body filter-results">
|
||||||
|
<div class="btn-group" role="group">
|
||||||
|
<input type="button" class="button" style="margin-right: 3px;" onclick="setTimeRange('today'); setActive(this)" value="today" />
|
||||||
|
<input type="button" class="button" style="margin-right: 3px;" onclick="setTimeRange('last2days'); setActive(this)" value="last 2 days" />
|
||||||
|
<input type="button" class="button active" style="margin-right: 3px;" onclick="setTimeRange('last7days'); setActive(this)" value="last 7 days" />
|
||||||
|
<input type="button" class="button" style="margin-right: 3px;" onclick="setTimeRange('thisMonth'); setActive(this)" value="month" />
|
||||||
|
<input type="button" class="button" style="margin-right: 18px;" onclick="setTimeRange('thisYear'); setActive(this)" value="year" />
|
||||||
|
<input type="date" style="margin-right: 3px;" id="start-date">
|
||||||
|
<input type="date" style="margin-right: 3px;" id="end-date">
|
||||||
|
<input type="button" id="custom_range" class="button" onclick="setCustomTimeRange(); setActive(this)" value="custom range" />
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<script>
|
||||||
|
// Define an array to store all graph instances
|
||||||
|
var graphs = [];
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<?php foreach ($graph as $data) {
|
||||||
|
include '../app/helpers/graph.php';
|
||||||
|
} ?>
|
||||||
|
|
||||||
|
<script>
|
||||||
|
// Function to update the label and propagate zoom across charts
|
||||||
|
function propagateZoom(chart) {
|
||||||
|
var startDate = chart.scales.x.min;
|
||||||
|
var endDate = chart.scales.x.max;
|
||||||
|
|
||||||
|
// Update the datetime input fields
|
||||||
|
document.getElementById('start-date').value = new Date(startDate).toISOString().slice(0, 10);
|
||||||
|
document.getElementById('end-date').value = new Date(endDate).toISOString().slice(0, 10);
|
||||||
|
|
||||||
|
// Update all charts with the new date range
|
||||||
|
graphs.forEach(function(graphObj) {
|
||||||
|
if (graphObj.graph !== chart) {
|
||||||
|
graphObj.graph.options.scales.x.min = startDate;
|
||||||
|
graphObj.graph.options.scales.x.max = endDate;
|
||||||
|
graphObj.graph.update(); // Redraw chart with new range
|
||||||
|
}
|
||||||
|
updatePeriodLabel(graphObj.graph, graphObj.label); // Update period label
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
// Predefined time range buttons
|
||||||
|
function setTimeRange(range) {
|
||||||
|
var startDate, endDate;
|
||||||
|
var now = new Date();
|
||||||
|
|
||||||
|
switch (range) {
|
||||||
|
case 'today':
|
||||||
|
startDate = new Date(now.setHours(0, 0, 0, 0));
|
||||||
|
endDate = new Date(now.setHours(23, 59, 59, 999));
|
||||||
|
timeRangeName = 'today';
|
||||||
|
break;
|
||||||
|
case 'last2days':
|
||||||
|
startDate = new Date(now.setDate(now.getDate() - 2));
|
||||||
|
endDate = new Date();
|
||||||
|
timeRangeName = 'last 2 days';
|
||||||
|
break;
|
||||||
|
case 'last7days':
|
||||||
|
startDate = new Date(now.setDate(now.getDate() - 7));
|
||||||
|
endDate = new Date();
|
||||||
|
timeRangeName = 'last 7 days';
|
||||||
|
break;
|
||||||
|
case 'thisMonth':
|
||||||
|
startDate = new Date(now.getFullYear(), now.getMonth(), 1);
|
||||||
|
endDate = new Date();
|
||||||
|
timeRangeName = 'this month so far';
|
||||||
|
break;
|
||||||
|
case 'thisYear':
|
||||||
|
startDate = new Date(now.getFullYear(), 0, 1);
|
||||||
|
endDate = new Date();
|
||||||
|
timeRangeName = 'this year so far';
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// We set the date input fields to match the selected period
|
||||||
|
document.getElementById('start-date').value = startDate.toISOString().slice(0, 10);
|
||||||
|
document.getElementById('end-date').value = endDate.toISOString().slice(0, 10);
|
||||||
|
|
||||||
|
// Loop through all graphs and update their time range and label
|
||||||
|
graphs.forEach(function(graphObj) {
|
||||||
|
graphObj.graph.options.scales.x.min = startDate;
|
||||||
|
graphObj.graph.options.scales.x.max = endDate;
|
||||||
|
graphObj.graph.update();
|
||||||
|
updatePeriodLabel(graphObj.graph, graphObj.label); // Update the period label
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
// Custom date range
|
||||||
|
function setCustomTimeRange() {
|
||||||
|
var startDate = document.getElementById('start-date').value;
|
||||||
|
var endDate = document.getElementById('end-date').value;
|
||||||
|
|
||||||
|
if (!startDate || !endDate) return;
|
||||||
|
|
||||||
|
// Convert the input dates to JavaScript Date objects
|
||||||
|
startDate = new Date(startDate);
|
||||||
|
endDate = new Date(endDate);
|
||||||
|
timeRangeName = 'custom range';
|
||||||
|
|
||||||
|
// Loop through all graphs and update the custom time range
|
||||||
|
graphs.forEach(function(graphObj) {
|
||||||
|
graphObj.graph.options.scales.x.min = startDate;
|
||||||
|
graphObj.graph.options.scales.x.max = endDate;
|
||||||
|
graphObj.graph.update();
|
||||||
|
updatePeriodLabel(graphObj.graph, graphObj.label); // Update the period label
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
// Set the clicked button state to active
|
||||||
|
function setActive(element) {
|
||||||
|
// Remove 'active' class from all buttons
|
||||||
|
var buttons = document.querySelectorAll('.button');
|
||||||
|
buttons.forEach(function(btn) {
|
||||||
|
btn.classList.remove('active');
|
||||||
|
});
|
||||||
|
|
||||||
|
// Add 'active' class only to the clicked button
|
||||||
|
element.classList.add('active');
|
||||||
|
}
|
||||||
|
|
||||||
|
// Call setTimeRange('last7days') on page load to pre-load last 7 days by default
|
||||||
|
window.onload = function() {
|
||||||
|
setTimeRange('last7days');
|
||||||
|
};
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<!-- /jitsi graphs -->
|
Loading…
Reference in New Issue