diff --git a/modules/statistics/templates/statistics.twig b/modules/statistics/templates/statistics.twig new file mode 100644 index 0000000000000000000000000000000000000000..7e5d1510fd19f8aa7bbe5279f282c6f77938600b --- /dev/null +++ b/modules/statistics/templates/statistics.twig @@ -0,0 +1,212 @@ +{% set pagetitle = 'SimpleSAMLphp Statistics'|trans %} +{% extends "base.twig" %} + +{% block preload %} + <link href="{{ baseurlpath }}style.css" rel="stylesheet" /> +{% endblock %} +{% block postload %} + <script src="{{ baseurlpath }}javascript.js"></script> +{% endblock %} + +{% block content %} + <h1>{{ current_rule.name }}</h1> + <p>{{ current_rule.descr }}</p> + + <table class="selecttime"> + <tr> + <td class="selecttime_icon"> + <img src="/{{ baseurlpath }}resources/icons/crystal_project/kchart.32x32.png" alt="Report settings" /> + </td> + <td> + <form action="#"> + {% for key, value in post_rule %} + <input type="hidden" name="{{ key|escape('html') }}" value="{{ value|escape('html') }}"> + {% endfor %} + <select onchange="submit();" name="rule"> + {% for key, rule in available_rules %} + {% if key == selected_rule %} + <option selected="selected" value="{{ key }}">{{ rule.name }}</option> + {% else %} + <option value="{{ key }}">{{ rule.name }}</option> + {% endif %} + {% endfor %} + </select> + </form> + </td> + <td class="td_right"> + <form action="#"> + {% for key, value in post_d %} + <input type="hidden" name="{{ key|escape('html') }}" value="{{ value|escape('html') }}"> + {% endfor %} + <select onchange="submit();" name="d"> + {% for key, delim in availdelimiters %} + {% set delimName = delim %} + + {% if delimiterPresentation[delim] is defined %} + {% set delimName = delimiterPresentation[delim] %} + {% endif %} + + {% if key == "_" %} + <option value="_">Total</option> + {% elseif request_d is defined and delim == request_d %} + <option selected="selected" value="{{ delim|escape('html') }}">{{ delimName|escape('html') }}</option> + {% else %} + <option value="{{ delim|escape('html') }}">{{ delimName|escape('html') }}</option> + {% endif %} + {% endfor %} + </select> + </form> + </td> + </tr> + </table> + + <table class="selecttime"> + <tr> + <td class="selecttime_icon"> + <img src="/{{ baseurlpath }}resources/icons/crystal_project/date.32x32.png" alt="Select date and time" /> + </td> + {% if available_times_prev %} + <td><a href="{{ get_times_prev }}">« Previous</a></td> + {% else %} + <td class="selecttime_link_grey">« Previous</td> + {% endif %} + <td class="td_right"> + <form action="#"> + {% for key, value in post_res %} + <input type="hidden" name="{{ key|escape('html') }}" value="{{ value|escape('html') }}"> + {% endfor %} + <select onchange="submit();" name="res"> + {% for key, timeresname in available_timeres %} + {% if key == selected_timeres %} + <option selected="selected" value="{{ key }}">{{ timeresname }}</option> + {% else %} + <option value="{{ key }}">{{ timeresname }}</option> + {% endif %} + {% endfor %} + </select> + </form> + </td> + <td class="td_left"> + <form action="#"> + {% for key, value in post_time %} + <input type="hidden" name="{{ key|escape('html') }}" value="{{ value|escape('html') }}"> + {% endfor %} + <select onchange="submit();" name=time> + {% for key, timedescr in available_times %} + {% if key == selected_time %} + <option selected="selected" value="{{ key }}">{{ timedescr }}</option> + {% else %} + <option value="{{ key }}">{{ timedescr }}</option> + {% endif%} + {% endfor %} + </select> + </form> + </td> + {% if available_times_next %} + <td class="td_right td_next_right"><a href="{{ get_times_next }}">Next »</a></td> + {% else %} + <td class="td_right selecttime_link_grey">Next »</td> + {% endif %} + </tr> + </table> + + <div id="tabdiv"> + <ul class="tabset_tabs"> + <li class="tab-link current" data-tab="graph"><a href="#graph">Graph</a></li> + <li class="tab-link" data-tab="table"><a href="#table">Summary table</a></li> + <li class="tab-link" data-tab="debug"><a href="#debug">Time serie</a></li> + </ul> + + <div id="graph" class="tabset_content current"> + <img src="{{ imgurl }}" alt="Graph" /> + <form action="#"> + <p class="p_right">Compare with total from this dataset + <select onchange="submit();" name="rule2"> + <option value="_">None</option> + {% for key, rule in available_rules %} + {% if key == selected_rule2 %} + <option selected="selected" value="{{ key }}">{{ rule.name }}</option> + {% else %} + <option value="{{ key }}">{{ rule.name }}</option> + {% endif %} + {% endfor %} + </select> + </p> + </form> + </div> + + <div id="table" class="tabset_content"> + {% if pieimgurl is defined %} + <img src="{{ pieimgurl }}" alt="Pie chart" /> + {% endif %} + + <table class="tableview"> + <tr> + <th class="value">Value</th> + <th class="category">Data range</th> + </tr> + {% for key, value in summaryDataset %} + {% if loop.index0 % 2 == 0 %} + {% set class = 'even' %} + {% else %} + {% set class = 'odd' %} + {% endif %} + + {% set keyName = key %} + {% if delimiterPresentation[key] is defined %} + {% set keyName = delimiterPresentation[key] %} + {% endif %} + + {% if key == "_" %} + <tr class="total {{ class }}"> + <td class="value">{{ value }}</td> + <td class="category">{{ keyName }}</td> + </tr> + {% else %} + <tr class="{{ class }}"> + <td class="value">{{ value }}</td> + <td class="category">{{ keyName }}</td> + </tr> + {% endif %} + {% endfor %} + </table> + </div> + + <div id="debug" class="tabset_content"> + <table class="timeseries"> + <tr> + <th>Time</th> + <th>Total</th> + {% for key, value in topdelimiters %} + {% set keyName = key %} + {% if delimiterPresentation[key] is defined %} + {% set keyName = delimiterPresentation[key] %} + {% endif %} + <th>{{ keyName }}</th> + {% endfor %} + </tr> + {% set i = 0 %} + {% for slot, dd in debugdata %} + + {% if i % 2 == 0 %} + {% set class = 'even' %} + {% else %} + {% set class = 'odd' %} + {% endif %} + + <tr class="{{ class }}"> + <td>{{ dd[0] }}</td> + <td class="datacontent">{{ dd[1] }}</td> + {% for key, value in topdelimiters %} + {% if results.slot is defined %} + <td class="datacontent">{{ results.slot.key }}</td> + {% else %} + <td class="datacontent"> </td> + {% endif %} + {% endfor %} + </tr> + {% endfor %} + </table> + </div> + </div> +{% endblock %} diff --git a/modules/statistics/templates/statmeta.twig b/modules/statistics/templates/statmeta.twig new file mode 100644 index 0000000000000000000000000000000000000000..dd2c475c552376eb815c69729eef252f222ab9b4 --- /dev/null +++ b/modules/statistics/templates/statmeta.twig @@ -0,0 +1,39 @@ +{% set pagetitle = 'SimpleSAMLphp Statistics Metadata'|trans %} +{% extends "base.twig" %} + +{% block preload %} + <link href="{{ baseurlpath }}style.css" rel="stylesheet" /> +{% endblock %} + +{% block content %} + <table id="statmeta"> + {% if metadata is defined %} + {% if metadata.lastrun is defined %} + <tr><td>Aggregator last run at</td><td>{{ metadata.lastrun }}</td></tr> + {% endif %} + + {% if metadata.notBefore is defined %} + <tr><td>Aggregated data until</td><td>{{ metadata.notBefore }}</td></tr> + {% endif %} + + {% if metadata.memory is defined %} + <tr><td>Memory usage</td><td>{{ metadata.memory }} MB</td></tr> + {% endif %} + + {% if metadata.memory is defined %} + <tr><td>Execution time</td><td>{{ metadata.time }} seconds</td></tr> + {% endif %} + + {% if metadata.memory is defined %} + <tr><td>SHA1 of last processed logline</td><td>{{ metadata.lastlinehash }}</td></tr> + {% endif %} + + {% if metadata.memory is defined %} + <tr><td>Last processed logline</td><td>{{ metadata.lastline }}</td></tr> + {% endif %} + {% else %} + <tr><td>No metadata found</td></tr> + {% endif %} + </table> + <p>[ <a href="{{ baseurlpath }}showstats.php">Show statistics</a> ]</p> +{% endblock %} diff --git a/modules/statistics/www/javascript.js b/modules/statistics/www/javascript.js index a5aa421a67fffda6c3c2f4527c8227e58b1b9cde..77ef1b1a5e53c34054bdc7593183b7aa7e84f48c 100644 --- a/modules/statistics/www/javascript.js +++ b/modules/statistics/www/javascript.js @@ -1,4 +1,13 @@ $(document).ready(function() { - $("#tabdiv").tabs(); -}); + $('ul.tabset_tabs li').click( + function() { + var tab_id = $(this).attr('data-tab'); + $('ul.tabset_tabs li').removeClass('current'); + $('.tabset_content').removeClass('current'); + $(this).addClass('current'); + $("#"+tab_id).addClass('current'); + $("html, body").animate({ scrollTop: 0 }, "slow"); + } + ) +}) diff --git a/modules/statistics/www/showstats.php b/modules/statistics/www/showstats.php index 051dc9aa55440fd3cd87059ce0a15fe6ab1dc302..1828a10726842cccc6a4cd34941abceb1bbf4073 100644 --- a/modules/statistics/www/showstats.php +++ b/modules/statistics/www/showstats.php @@ -29,6 +29,7 @@ if (array_key_exists('res', $_REQUEST)) { } if (array_key_exists('d', $_REQUEST)) { $delimiter = $_REQUEST['d']; + $t->data['request_d'] = $delimiter; } if ($preferRule2 === '_') { @@ -100,17 +101,19 @@ $t->data['imgurl'] = $grapher->show($axis['axis'], $axis['axispos'], $datasets, if (isset($piedata)) { $t->data['pieimgurl'] = $grapher->showPie( $dataset->getDelimiterPresentationPie(), $piedata); } -$t->data['available.rules'] = $ruleset->availableRulesNames(); -$t->data['available.times'] = $statrule->availableFileSlots($timeres); -$t->data['available.timeres'] = $statrule->availableTimeRes(); -$t->data['available.times.prev'] = $timeNavigation['prev']; -$t->data['available.times.next'] = $timeNavigation['next']; - -$t->data['selected.rule']= $rule; -$t->data['selected.rule2']= $preferRule2; -$t->data['selected.time'] = $fileslot; -$t->data['selected.timeres'] = $timeres; -$t->data['selected.delimiter'] = $delimiter; +$t->data['available_rules'] = $ruleset->availableRulesNames(); +$t->data['available_times'] = $statrule->availableFileSlots($timeres); +$t->data['available_timeres'] = $statrule->availableTimeRes(); +$t->data['available_times_prev'] = $timeNavigation['prev']; +$t->data['available_times_next'] = $timeNavigation['next']; + +$t->data['current_rule'] = $t->data['available_rules'][$rule]; + +$t->data['selected_rule'] = $rule; +$t->data['selected_rule2'] = $preferRule2; +$t->data['selected_time'] = $fileslot; +$t->data['selected_timeres'] = $timeres; +$t->data['selected_delimiter'] = $delimiter; $t->data['debugdata'] = $dataset->getDebugData(); $t->data['results'] = $dataset->getResults(); @@ -118,30 +121,31 @@ $t->data['summaryDataset'] = $dataset->getSummary(); $t->data['topdelimiters'] = $dataset->getTopDelimiters(); $t->data['availdelimiters'] = $dataset->availDelimiters(); -$t->data['delimiterPresentation'] = $dataset->getDelimiterPresentation(); - +$t->data['delimiterPresentation'] = $dataset->getDelimiterPresentation(); $t->data['post_rule'] = getBaseURL($t, 'post', 'rule'); $t->data['post_rule2'] = getBaseURL($t, 'post', 'rule2'); $t->data['post_d'] = getBaseURL($t, 'post', 'd'); $t->data['post_res'] = getBaseURL($t, 'post', 'res'); $t->data['post_time'] = getBaseURL($t, 'post', 'time'); -$t->data['get_times_prev'] = getBaseURL($t, 'get', 'time', $t->data['available.times.prev']); -$t->data['get_times_next'] = getBaseURL($t, 'get', 'time', $t->data['available.times.next']); +$t->data['get_times_prev'] = getBaseURL($t, 'get', 'time', $t->data['available_times_prev']); +$t->data['get_times_next'] = getBaseURL($t, 'get', 'time', $t->data['available_times_next']); + +//$t->data['jquery'] = array('ui' => true, 'core' => true); $t->show(); function getBaseURL($t, $type = 'get', $key = null, $value = null) { $vars = array( - 'rule' => $t->data['selected.rule'], - 'time' => $t->data['selected.time'], - 'res' => $t->data['selected.timeres'], + 'rule' => $t->data['selected_rule'], + 'time' => $t->data['selected_time'], + 'res' => $t->data['selected_timeres'], ); - if (isset($t->data['selected.delimiter'])) { - $vars['d'] = $t->data['selected.delimiter']; + if (isset($t->data['selected_delimiter'])) { + $vars['d'] = $t->data['selected_delimiter']; } - if (!empty($t->data['selected.rule2']) && $t->data['selected.rule2'] !== '_') { - $vars['rule2'] = $t->data['selected.rule2']; + if (!empty($t->data['selected_rule2']) && $t->data['selected_rule2'] !== '_') { + $vars['rule2'] = $t->data['selected_rule2']; } if (isset($key)) { @@ -154,12 +158,7 @@ function getBaseURL($t, $type = 'get', $key = null, $value = null) } if ($type === 'get') { - return SimpleSAML\Module::getModuleURL("statistics/showstats.php") . '?' . http_build_query($vars, '', '&'); - } else { - $text = ''; - foreach($vars as $k => $v) { - $text .= '<input type="hidden" name="' . $k . '" value="'. htmlspecialchars($v) . '" />' . "\n"; - } - return $text; + return SimpleSAML\Module::getModuleURL("statistics/showstats.php") . '?' . http_build_query($vars, '', '&'); } + return $vars; } diff --git a/modules/statistics/www/style.css b/modules/statistics/www/style.css index 1485d07910f3e7bb23af42fc43546184c050338b..aec6545a7521328f8e64f107ac8230be4d6bd890 100644 --- a/modules/statistics/www/style.css +++ b/modules/statistics/www/style.css @@ -1,6 +1,4 @@ @media all { - .ui-tabs-panel { padding: .5em } - div#content { margin: .4em ! important; } @@ -35,10 +33,6 @@ text-align: right; } - div.corner_t { - max-width: none ! important; - } - table.timeseries tr.odd td { background-color: #f4f4f4; } @@ -92,4 +86,33 @@ table#statmeta { width: 100%; } + + ul.tabset_tabs { + margin: 0px; + padding: 0px; + list-style: none; + } + + ul.tabset_tabs li { + background: none; + color: #222; + display: inline-block; + padding: 10px 15px; + cursor: pointer; + } + + ul.tabset_tabs li.current { + background: #ededed; + color: #222; + } + + .tabset_content { + display: none; + background: #ededed; + padding: 15px; + } + + .tabset_content.current { + display: inherit; + } }