view assets/index_dashboard.html.hbs @ 77:fd0237049be0

Show paths instead of tags & apply rust fixes
author Lewin Bormann <lbo@spheniscida.de>
date Mon, 31 Jul 2023 09:31:37 +0200
parents 2a7b358c2710
children
line wrap: on
line source

<!DOCTYPE html>
<html>
    <head>
        <title>Analyrics</title>

        <meta name="robots" content="noindex">
        <meta name="viewport" content="width=device-width, initial-scale=1">

        <link rel="stylesheet" href="static/style.css" type="text/css" />
        <link rel="icon" type="image/png" href="static/favicon.ico">

        <script src="static/chart.min.js" type="application/javascript"></script>

        <script type="application/javascript">
            let from = "{{ date.today }}";
            let duration = {{ date.duration }}; // in days

            function formatDate(d) {
                let m = d.getUTCMonth()+1; m = m < 10 ? "0"+m : m;
                let day = d.getUTCDate(); day = day < 10 ? "0"+day : day;

                return `${d.getUTCFullYear()}-${m}-${day}`;
            }
            function adjustURLDateParams(dateOffsetDays, durationMultiplier) {
                let usp = new URLSearchParams(window.location.search);
                let from_date = new Date(usp.get("from") || from);
                let gduration = +usp.get("duration") || duration;

                let new_from_date = formatDate(new Date(from_date.getTime() + (dateOffsetDays + gduration * (1-durationMultiplier)) * 86400 * 1000));
                console.log(from_date, new_from_date);
                let new_duration = gduration * durationMultiplier;

                usp.set("from", new_from_date);
                usp.set("duration", new_duration.toFixed());
                window.location.search = usp.toString();
            };
            function toggleBots(checkboxid) {
                let box = document.getElementById(checkboxid);
                let usp = new URLSearchParams(window.location.search);
                usp.set("includebots", box.checked);
                window.location.search = usp.toString();
            };
            function resetDateParams() {
                let usp = new URLSearchParams(window.location.search);
                usp.delete("duration");
                usp.delete("from");
                window.location.search = usp.toString();
            };
        </script>

    </head>
    <body>

    <!-- Header -->
    <div id="header">
        <span id="logo">AnaLyrics</span>
        <form id="logout" action="logout" method="POST">
            <input type="submit" value="Log out" />
        </form>
        <div class="usersettings"><a href="{{ basepath }}settings">Settings</a></div>
        <div class="useraction"><b>{{username}}</b>.</div>
        <div class="userdomain">{{#if domain}}Domain: <b>{{domain}}</b>{{else}}<i>(all domains)</i>{{/if}}</div>
    </div>
    {{#if flash}}<div id="flash"><span id="flashtext">{{flash}}<span></div>{{/if}}
    {{#if error}}<div id="error"><span id="errortext">{{error}}</span></div>{{/if}}

    <!-- Time navigation -->
    <div id="timebox">
        <div id="timeindicator">
            from {{ date.today }} (for {{date.duration}} days)
        </div>
        <div id="timenav">
            <button class="timenavbutton" onclick="adjustURLDateParams(-30, 1)">-30d</button>
            <button class="timenavbutton" onclick="adjustURLDateParams(-7, 1)">-7d</button>
            <button class="timenavbutton" onclick="adjustURLDateParams(-1, 1)">-1d</button>
            <span class="timenavbuttonlabel">&nbsp;&lt; begin &gt;&nbsp;</span>
            <button class="timenavbutton" onclick="adjustURLDateParams(1, 1)">+1d</button>
            <button class="timenavbutton" onclick="adjustURLDateParams(7, 1)">+7d</button>
            <button class="timenavbutton" onclick="adjustURLDateParams(30, 1)">+30d</button>
        </div>
        <div id="durationnav">
            <button class="timenavbutton" onclick="adjustURLDateParams(0, 1/8)">x⅛</button>
            <button class="timenavbutton" onclick="adjustURLDateParams(0, 1/4)"></button>
            <button class="timenavbutton" onclick="adjustURLDateParams(0, 1/2)"></button>
            <span class="timenavbuttonlabel">&lt; duration &gt;&nbsp;</span>
            <button class="timenavbutton" onclick="adjustURLDateParams(0, 2)">x2</button>
            <button class="timenavbutton" onclick="adjustURLDateParams(0, 4)">x4</button>
            <button class="timenavbutton" onclick="adjustURLDateParams(0, 8)">x8</button>
        </div>
        <div id="timereset">
            <button onclick="resetDateParams()">Reset</button>
        </div>
        <div id="topconfig">
            <label for="botbox" id="botboxlabel">Include bots</label>
            <input type="checkbox" id="botbox" name="botbox" onclick="toggleBots('botbox')"></input>
        </div>
    </div>


    <!-- Plots -- only shown when logged in. -->
    <div class="plotrow row1">
        <div class="plotframe fullwidth">
          <div class="plottitle">Visits and Sessions</div>
          <div class="chartcontainer1"><canvas id="visitsAndSessions" height="100"></canvas></div>
        </div>
    </div>
    <div class="plotrow row2">
        <div class="plotframe halfwidth">Top paths
            <div class="chartcontainer2"><canvas id="topPaths"></canvas></div> </div>
        <div class="plotframe halfwidth">Requests per Session
            <div class="chartcontainer2"><canvas id="requestsBySession"></canvas></div> </div>
    </div>
    <div class="plotrow row3">
        <div class="plotframe halfwidth">Sessions by country
            <div class="chartcontainer2"><canvas id="sessionsByCountry"></canvas></div> </div>
        <div class="plotframe halfwidth">Top External Referers
            <div class="chartcontainer2"><canvas id="topRefer"></canvas></div> </div>
    </div>
    <div class="plotrow row3">
      <div class="plotframe fullwidth">Recent Sessions
        <table align="center" id="sessionstable">
          <tr>
              <th>Start</th><th>Duration</th><th>Requests</th><th>Paths</th><th>Referer</th><th>Country/City</th><th>User Agent</th>
          </tr>
          {{ #each recentSessions }}
          <tr>
              <td>{{ start }}</td><td>{{ duration }}</td><td>{{ count }}</td><td>{{ paths }}</td><td>{{ refer }}</td><td>{{ origin_country }} {{ origin_city }}</td><td>{{ ua }}</td>
          </tr>
          {{ /each }}
        </table>
      </div>
    </div>

    <script>
        let plots = {"visitsAndSessions": {{{ chartconfig.visitsAndSessions }}},
                     "topPaths": {{{ chartconfig.topPaths }}},
                     "requestsBySession": {{{ chartconfig.requestsBySession }}},
                     "sessionsByCountry": {{{ chartconfig.sessionsByCountry }}},
                     "topRefer": {{{ chartconfig.topRefer }}} };

        Object.keys(plots).forEach((cv) => {
                    if (plots[cv] == undefined) {
                                return;
                            }
                    const ctx = document.getElementById(cv).getContext('2d');
                    const myChart = new Chart(ctx, plots[cv]);
                });
    </script>

    <script>
        // Set up page after load.
        (function() {
        let box = document.getElementById("botbox");
        let usp = new URLSearchParams(window.location.search);
        box.checked = usp.get("includebots") == "true";
        })();
    </script>

    </body>
</html>