diff --git a/web/index.php b/web/index.php index 0bd952987c57bdd129b7f1fe126a99ad3ea1e6a7..bda9fa6b3dbd4fcb2478a26b641299ebf687d493 100644 --- a/web/index.php +++ b/web/index.php @@ -39,9 +39,12 @@ $data['check_result'] = htmlspecialchars($_GET["check_result"]); <script type="text/javascript" src="https://cdn.datatables.net/1.13.6/js/jquery.dataTables.min.js"></script> <link rel="stylesheet" type="text/css" href="https://cdn.datatables.net/1.13.6/css/jquery.dataTables.min.css"/> + + <script type="text/javascript" src="https://cdn.jsdelivr.net/npm/chart.js@4.4.0/dist/chart.umd.min.js"></script> <link rel="stylesheet" type="text/css" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.4.2/css/all.min.css"/> <link rel="stylesheet" type="text/css" href="eccs.css" /> + <link rel="stylesheet" type="text/css" href="statistics.css" /> <script> $( function() { $( "#datepicker" ).datepicker({ @@ -76,6 +79,7 @@ $data['check_result'] = htmlspecialchars($_GET["check_result"]); <div class="boxCalendar"> <div id="calendarGo"> <button id="goButton" onclick="getPastResults()">Go</button> + <button id="statisticsButton">Statistics</button> <label id="lbl-datepicker" for="datepicker" class="strong">Select date:</label> <input type="text" id="datepicker" /> </div> <!-- END calendarGo --> @@ -107,6 +111,19 @@ $data['check_result'] = htmlspecialchars($_GET["check_result"]); var check_result = "<?php echo $data['check_result'] ?>"; </script> <script type="text/javascript" src="eccs.js" /></script> + <script type="text/javascript" src="dataX.js" /></script> + <script type="text/javascript" src="statistics.js" /></script> </div> <!-- END eccs-central --> + <div id="statisticsModal" class="modal"> + <div class="modal-content" style="height:45vh; width:85vw"> + <span class="close">×</span> + <div class="chart-error" style="display: none;"> + <i class="fa fa-exclamation-triangle"></i> Something happened. Can't retrieve data + </div> + <div class="chart-container" style="position: relative; height:40vh; width:80vw"> + <canvas id="statistics"></canvas> + </div> + </div> + </div> </body> </html> diff --git a/web/statistics.css b/web/statistics.css new file mode 100644 index 0000000000000000000000000000000000000000..8e7eba6b3ae4d6b9810de5aa2c057ee11cb4f055 --- /dev/null +++ b/web/statistics.css @@ -0,0 +1,34 @@ +.modal { + display: none; + position: fixed; + z-index: 1; + left: 0; + top: 0; + width: 100%; + height: 100%; + overflow: auto; + background-color: rgb(0,0,0); + background-color: rgba(0,0,0,0.4); +} + +.modal-content { + background-color: #fefefe; + margin: 15% auto 0; + padding: 20px; + border: 1px solid #888; + width: 80%; +} + +.close { + color: #aaa; + float: right; + font-size: 28px; + font-weight: bold; +} + +.close:hover, +.close:focus { + color: black; + text-decoration: none; + cursor: pointer; +} \ No newline at end of file diff --git a/web/statistics.js b/web/statistics.js new file mode 100644 index 0000000000000000000000000000000000000000..6ad8f925839dbc05948246c026ab7f1d6b7aedcd --- /dev/null +++ b/web/statistics.js @@ -0,0 +1,101 @@ +var statChart = {}; +var baseURL = window.location.protocol + "//" + window.location.host; + +function getStatistics() { + + let checkDate = $.datepicker.formatDate("yy-mm-dd", $('#datepicker').datepicker().datepicker('getDate')); + + $.ajax({ + url: baseURL + "/dataX.php", + type : 'POST', + data : { + dateFrom : checkDate + }, + success: function(result) { + drawChart(result) + }, + error: function (jqXHR,error,thrownError) { + showErr(); + } + }); +} + +function showErr() { + $("#statisticsModal .chart-error").css('display', 'block') + $("#statisticsModal .chart-container").css('display', 'none') +} + +function drawChart(data) { + let key = []; + let data1 = []; + let data2 = []; + let data3 = []; + let chartData; + + try { + chartData = $.parseJSON(data) + } catch (err) { + showErr() + } + + chartData = $.parseJSON(data) + + $.each( chartData, function( index, value ) { + key.push(index) + data1.push(value.request_count.api) + data2.push(value.request_count.web) + data3.push(value.request_uniq.idp) + }); + + let options = { + type: 'line', + data: { + labels: key, + datasets: [ + { label: 'API', data: data1 }, + { label: 'WEB', data: data2 }, + { label: 'Unique IdP', data: data3 } + ] + }, + options: { + responsive: true, + maintainAspectRatio: false, + interaction: { + mode: 'index', + intersect: false, + } + } + } + var ctx = document.getElementById('statistics').getContext('2d'); + + $("#statisticsModal .chart-error").css('display', 'none') + $("#statisticsModal .chart-container").css('display', 'block') + + if ($.isEmptyObject(statChart)) { + statChart = new Chart(ctx, options); + } else { + statChart.update(); + } +} + +$(document).ready(function() { + $(".close").on("click", function() { + $("#statisticsModal").hide() + }); + + $(document).on('click',function(e) { + if(($(e.target).closest("#statisticsModal").length > 0) && $(e.target).closest("canvas").length == 0 + && !$(e.target).closest("div").hasClass('modal-content') && !$("#statisticsModal").hasClass('immune')) { + $("#statisticsModal").hide(); + } + }); + + $("#statisticsButton").on("click", function() { + $("#statisticsModal").addClass('immune') + $("#statisticsModal").show() + setTimeout(function() { + $("#statisticsModal").removeClass('immune') + }, 1000); + getStatistics(); + }) +});