Plugin Directory

Changeset 3102299


Ignore:
Timestamp:
06/13/2024 12:40:28 PM (22 months ago)
Author:
edhicks
Message:

v1.2.0

Location:
simple-webstats
Files:
115 added
9 edited

Legend:

Unmodified
Added
Removed
  • simple-webstats/trunk/css/dashboard.min.css

    r3062605 r3102299  
    1 .swstats-dash{position:relative}.swstats-dash a{box-shadow:none}.swstats-dash #periodselect{font-size:16px;margin-top:10px}.swstats-dash .panels{display:grid;grid-template-columns:repeat(6, 1fr);grid-gap:15px;margin-top:20px}.swstats-dash .panels>div{position:relative;grid-column-end:span 6;background:linear-gradient(#2c3d4e, #354a5e);color:#fff;padding:10px;border-radius:5px;box-shadow:0 10px 20px rgba(0,0,0,.2)}.swstats-dash .panels h2{margin:0 0 10px 0;color:#fff}.swstats-dash .panels .inner{position:relative;z-index:2}.swstats-dash .panels .loading,.swstats-dash .panels .nodata{position:absolute;top:50%;left:50%;-webkit-transform:translate(-50%, -50%);transform:translate(-50%, -50%)}.swstats-dash .panels .loading{z-index:1}.swstats-dash .panels .loading i{display:inline-block;width:8px;height:8px;margin:0 3px;border-radius:50%;background-color:#fff;-webkit-animation:pulse 600ms ease-out alternate infinite;animation:pulse 600ms ease-out alternate infinite}.swstats-dash .panels .loading i:nth-child(1){-webkit-animation-delay:-300ms;animation-delay:-300ms}.swstats-dash .panels .loading i:nth-child(2){-webkit-animation-delay:-150ms;animation-delay:-150ms}.swstats-dash .panels .nodata{z-index:0;margin:0}.swstats-dash .panels .inner,.swstats-dash .panels .loading,.swstats-dash .panels .nodata{transition:opacity 300ms ease-out;opacity:0}.swstats-dash .panels .inner.show,.swstats-dash .panels .loading.show,.swstats-dash .panels .nodata.show{opacity:1}.swstats-dash .panels .switches{position:absolute;top:0px;right:10px}.swstats-dash .panels .switches a{display:inline-block;margin-left:.5em;color:#fff;opacity:.67;transition:opacity 100ms ease-out}.swstats-dash .panels .switches a:hover{opacity:1}.swstats-dash .panels .switches a:nth-child(1){display:none}.swstats-dash .summary-panel{padding:20px;min-height:401px}.swstats-dash .summary-panel .inner{display:grid;grid-template-columns:repeat(6, 1fr);grid-gap:20px;margin:10px}.swstats-dash .summary-panel .inner>div{position:relative;grid-column-end:span 3}.swstats-dash .summary-panel .inner>div::before{content:"";position:absolute;top:0;left:-10px;width:1px;height:100%;background-color:#fff;opacity:.2}.swstats-dash .summary-panel .inner>div:nth-child(2n+1)::before{display:none}.swstats-dash .summary-panel .inner>div.granularity,.swstats-dash .summary-panel .inner>div.chart{grid-column:1/-1}.swstats-dash .summary-panel .inner>div.granularity::before,.swstats-dash .summary-panel .inner>div.chart::before{display:none}.swstats-dash .summary-panel .inner h3{font-size:1em;color:rgba(255,255,255,.67);white-space:nowrap;margin:0 0 .33em 0}.swstats-dash .summary-panel .inner p{font-size:18px;line-height:1;margin:0;white-space:nowrap}.swstats-dash .summary-panel .inner p .comparison{display:inline-block;font-size:11px;margin-left:.5em}.swstats-dash .summary-panel .inner p .comparison.green{color:#96de96}.swstats-dash .summary-panel .inner p .comparison.red{color:#f78c8c}.swstats-dash .summary-panel .inner>div.visits h3::after,.swstats-dash .summary-panel .inner>div.views h3::after{content:"";display:inline-block;vertical-align:baseline;border-radius:50%;margin-left:8px;width:10px;height:10px}.swstats-dash .summary-panel .inner>div.visits h3::after{background-color:rgba(54,162,235,.8)}.swstats-dash .summary-panel .inner>div.views h3::after{background-color:rgba(150,222,150,.8)}.swstats-dash .summary-panel .chart{position:relative;height:200px}.swstats-dash .summary-panel .granularity{position:absolute;top:0;left:50%;-webkit-transform:translateX(-50%);transform:translateX(-50%);line-height:1;font-size:11px;white-space:nowrap}.swstats-dash .summary-panel .granularity a{display:inline-block;margin-left:3px;color:rgba(255,255,255,.67);text-decoration:none;transition:color 100ms ease-out;padding:4px 7px 5px 7px;border-radius:1em;background-color:rgba(0,0,0,.5)}.swstats-dash .summary-panel .granularity a:first-child{margin-left:0}.swstats-dash .summary-panel .granularity a:hover{color:#fff}.swstats-dash .summary-panel .granularity a.active{color:#fff}.swstats-dash .data-panel{min-height:120px}.swstats-dash .data-panel h2{margin:10px}.swstats-dash .table{margin:5px 0}.swstats-dash .table .row{display:grid;grid-template-columns:1fr 4em;grid-gap:20px;padding:0 10px;background-repeat:no-repeat;background-position:0 0;-webkit-animation:bar 600ms 400ms ease-out both;animation:bar 600ms 400ms ease-out both}.swstats-dash .table .row.cols3{grid-template-columns:1fr 4em 4em}.swstats-dash .table .row.head{font-weight:bold;opacity:.67}.swstats-dash .table .row.body{margin-top:3px}.swstats-dash .table .row div{padding:6px 0;text-align:right}.swstats-dash .table .row div:first-child{text-align:left;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.swstats-dash .table .fflag{vertical-align:-1px;margin-right:6px}@media(min-width: 400px){.swstats-dash #periodselect{position:absolute;top:10px;right:0;margin:0}.swstats-dash .panels{margin-top:30px}.swstats-dash .summary-panel{min-height:419px}.swstats-dash .summary-panel .inner p{font-size:24px}}@media(min-width: 600px){.swstats-dash .summary-panel{min-height:403px}.swstats-dash .summary-panel .inner div{grid-column-end:span 2}.swstats-dash .summary-panel .inner div:nth-child(2n+1)::before{display:block}.swstats-dash .summary-panel .inner div:nth-child(3n+1)::before{display:none}.swstats-dash .summary-panel .chart{height:250px}}@media(min-width: 880px){.swstats-dash .panels div.half{grid-column-end:span 3}.swstats-dash .panels div.third{grid-column-end:span 2}.swstats-dash .data-panel{min-height:406px}}@media(min-width: 1220px){.swstats-dash .summary-panel{min-height:366px}.swstats-dash .summary-panel .inner div{grid-column-end:span 1}.swstats-dash .summary-panel .inner div:nth-child(3n+1)::before{display:block}.swstats-dash .summary-panel .inner div:nth-child(6n+1)::before{display:none}.swstats-dash .summary-panel .chart{height:280px}}@-webkit-keyframes bar{0%{background-size:0 100%}100%{background-size:100% 100%}}@keyframes bar{0%{background-size:0 100%}100%{background-size:100% 100%}}@-webkit-keyframes pulse{0%{-webkit-transform:scale(0.5);transform:scale(0.5)}100%{-webkit-transform:scale(1);transform:scale(1)}}@keyframes pulse{0%{-webkit-transform:scale(0.5);transform:scale(0.5)}100%{-webkit-transform:scale(1);transform:scale(1)}}
     1.swstats-dash{position:relative}.swstats-dash a{box-shadow:none}.swstats-dash #periodselect{font-size:16px;margin-top:10px}.swstats-dash .panels{display:grid;grid-template-columns:repeat(6, 1fr);grid-gap:15px;margin-top:20px}.swstats-dash .panels>div{position:relative;grid-column-end:span 6;padding:10px;border-radius:5px;box-shadow:0 10px 20px rgba(0,0,0,.2)}.swstats-dash .panels h2{margin:0 0 10px 0;color:#fff}.swstats-dash .panels .switches{position:absolute;top:0px;right:10px}.swstats-dash .panels .switches a{display:inline-block;margin-left:.5em;color:#fff;opacity:.67;transition:opacity 100ms ease-out}.swstats-dash .panels .switches a:hover{opacity:1}.swstats-dash .panels .switches a:nth-child(1){display:none}.swstats-dash .summary-panel{padding:20px;min-height:401px}.swstats-dash .summary-panel .inner{grid-gap:20px;margin:10px}.swstats-dash .summary-panel .chart{height:200px}.swstats-dash .data-panel{min-height:120px}.swstats-dash .data-panel h2{margin:10px}.swstats-dash .table{margin:5px 0}.swstats-dash .table .row{display:grid;grid-template-columns:1fr 4em;grid-gap:20px;padding:0 10px;background-repeat:no-repeat;background-position:0 0;-webkit-animation:bar 600ms 400ms ease-out both;animation:bar 600ms 400ms ease-out both}.swstats-dash .table .row.cols3{grid-template-columns:1fr 4em 4em}.swstats-dash .table .row.head{font-weight:bold;opacity:.67}.swstats-dash .table .row.body{margin-top:3px}.swstats-dash .table .row div{padding:6px 0;text-align:right}.swstats-dash .table .row div:first-child{text-align:left;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.swstats-dash .table .fflag{vertical-align:-1px;margin-right:6px}@media(min-width: 400px){.swstats-dash #periodselect{position:absolute;top:10px;right:0;margin:0}.swstats-dash .panels{margin-top:30px}.swstats-dash .summary-panel{min-height:419px}.swstats-dash .summary-panel .inner p{font-size:24px}}@media(min-width: 600px){.swstats-dash .summary-panel{min-height:403px}.swstats-dash .summary-panel .inner div{grid-column-end:span 2}.swstats-dash .summary-panel .inner div:nth-child(2n+1)::before{display:block}.swstats-dash .summary-panel .inner div:nth-child(3n+1)::before{display:none}.swstats-dash .summary-panel .chart{height:250px}}@media(min-width: 880px){.swstats-dash .panels div.half{grid-column-end:span 3}.swstats-dash .panels div.third{grid-column-end:span 2}.swstats-dash .data-panel{min-height:406px}}@media(min-width: 1220px){.swstats-dash .summary-panel{min-height:366px}.swstats-dash .summary-panel .inner div{grid-column-end:span 1}.swstats-dash .summary-panel .inner div:nth-child(3n+1)::before{display:block}.swstats-dash .summary-panel .inner div:nth-child(6n+1)::before{display:none}.swstats-dash .summary-panel .chart{height:280px}}
  • simple-webstats/trunk/css/dashboard.scss

    r3062605 r3102299  
    2222            position: relative;
    2323            grid-column-end: span 6;
    24             background: linear-gradient(#2c3d4e, lighten(#2c3d4e, 5%));
    25             color: #fff;
    2624            padding: 10px;
    2725            border-radius: 5px;
     
    3230            margin: 0 0 10px 0;
    3331            color: #fff;
    34         }
    35        
    36         .inner {
    37             position: relative;
    38             z-index: 2;
    39         }
    40        
    41         .loading,
    42         .nodata {
    43             position: absolute;
    44             top: 50%;
    45             left: 50%;
    46             transform: translate(-50%, -50%);
    47         }
    48        
    49         .loading {
    50             z-index: 1;
    51             i {
    52                 display: inline-block;
    53                 width: 8px;
    54                 height: 8px;
    55                 margin: 0 3px;
    56                 border-radius: 50%;
    57                 background-color: #fff;
    58                 animation: pulse 600ms ease-out alternate infinite;
    59                 &:nth-child(1) {
    60                     animation-delay: -300ms;
    61                 }
    62                 &:nth-child(2) {
    63                     animation-delay: -150ms;
    64                 }
    65             }
    66         }
    67        
    68         .nodata {
    69             z-index: 0;
    70             margin: 0;
    71         }
    72        
    73         .inner,
    74         .loading,
    75         .nodata {
    76             transition: opacity 300ms ease-out;
    77             opacity: 0;
    78             &.show {
    79                 opacity: 1;
    80             }
    8132        }
    8233       
     
    10657        min-height: 401px;
    10758        .inner {
    108             display: grid;
    109             grid-template-columns: repeat(6, 1fr);
    11059            grid-gap: 20px;
    11160            margin: 10px;
    112             & > div {
    113                 position: relative;
    114                 grid-column-end: span 3;
    115                 &::before {
    116                     content: '';
    117                     position: absolute;
    118                     top: 0;
    119                     left: -10px;
    120                     width: 1px;
    121                     height: 100%;
    122                     background-color: #fff;
    123                     opacity: .2;
    124                 }
    125                 &:nth-child(2n+1)::before {
    126                     display: none;
    127                 }
    128                 &.granularity,
    129                 &.chart {
    130                     grid-column: 1/-1;
    131                     &::before {
    132                         display: none;
    133                     }
    134                 }
    135             }
    136             h3 {
    137                 font-size: 1em;
    138                 color: rgba(#fff, .67);
    139                 white-space: nowrap;
    140                 margin: 0 0 .33em 0;
    141             }
    142             p {
    143                 font-size: 18px;
    144                 line-height: 1;
    145                 margin: 0;
    146                 white-space: nowrap;
    147                 .comparison {
    148                     display: inline-block;
    149                     font-size: 11px;
    150                     margin-left: .5em;
    151                     &.green {
    152                         color: rgb(150, 222, 150);
    153                     }
    154                     &.red {
    155                         color: rgb(247, 140, 140);
    156                     }
    157                 }
    158             }
    159             & > div.visits,
    160             & > div.views {
    161                 h3::after {
    162                     content: '';
    163                     display: inline-block;
    164                     vertical-align: baseline;
    165                     border-radius: 50%;
    166                     margin-left: 8px;
    167                     width: 10px;
    168                     height: 10px;
    169                 }
    170             }
    171             & > div.visits {
    172                 h3::after {
    173                     background-color: rgb(54, 162, 235, .8);
    174                 }
    175             }
    176             & > div.views {
    177                 h3::after {
    178                     background-color: rgb(150, 222, 150, .8);
    179                 }
    180             }
    18161        }
    18262        .chart {
    183             position: relative;
    18463            height: 200px;
    18564        }
    186         .granularity {
    187             position: absolute;
    188             top: 0;
    189             left: 50%;
    190             transform: translateX(-50%);
    191             line-height: 1;
    192             font-size: 11px;
    193             white-space: nowrap;
    194             a {
    195                 display: inline-block;
    196                 margin-left: 3px;
    197                 color: rgba(#fff, .67);
    198                 text-decoration: none;
    199                 transition: color 100ms ease-out;
    200                 padding: 4px 7px 5px 7px;
    201                 border-radius: 1em;
    202                 background-color: rgba(#000, .5);
    203                 &:first-child {
    204                     margin-left: 0;
    205                 }
    206                 &:hover {
    207                     color: rgba(#fff, 1);
    208                 }
    209                 &.active {
    210                     color: rgba(#fff, 1);
    211                 }
    212             }
    213         }
    214        
    21565    }
    21666   
     
    329179    }
    330180   
    331     @keyframes bar {
    332         0% {
    333             background-size: 0 100%;
    334         }
    335         100% {
    336             background-size: 100% 100%;
    337         }
    338     }
    339    
    340     @keyframes pulse {
    341         0% {
    342             transform: scale(.5);
    343         }
    344         100% {
    345             transform: scale(1);
    346         }
    347     }
    348    
    349181}
    350182
  • simple-webstats/trunk/inc/collector.php

    r3101173 r3102299  
    3636        // set/get UID salt
    3737        $this->uidSalt = get_option('swstats_uid_salt');
    38         if(!$this->uidSalt)
     38        $uidSaltExpiry = intval(get_option('swstats_uid_salt_expiry'));
     39        if(!$this->uidSalt || !$uidSaltExpiry || ($uidSaltExpiry <= time()))
    3940        {
    4041            $this->uidSalt = bin2hex(random_bytes(8));
    4142            update_option('swstats_uid_salt', $this->uidSalt);
     43            update_option('swstats_uid_salt_expiry', time()+(60*60*24*7));
    4244        }
    4345       
  • simple-webstats/trunk/inc/dashboard.php

    r3062605 r3102299  
    2323                    wp_enqueue_script('chartjs', SWSTATS_URL.'lib/chartjs/chart.umd.min.js', [], false, true);
    2424                    wp_enqueue_script('swstats_dash', SWSTATS_URL.'js/dashboard.min.js', ['chartjs'], filemtime(SWSTATS_PATH.'js/dashboard.min.js'), true);
     25                    wp_enqueue_style('swstats_global', SWSTATS_URL.'css/global.min.css', [], filemtime(SWSTATS_PATH.'css/global.min.css'));
    2526                    wp_enqueue_style('swstats_dash', SWSTATS_URL.'css/dashboard.min.css', [], filemtime(SWSTATS_PATH.'css/dashboard.min.css'));
    2627                    wp_enqueue_style('freakflags', SWSTATS_URL.'lib/freakflags/freakflags.css', [], filemtime(SWSTATS_PATH.'lib/freakflags/freakflags.css'));
     
    4041        $this->monthFormat = 'F Y';
    4142        $this->hourFormat = (stristr($timeFormat, 'a') === false) ? 'H' : 'ga';
    42    
     43       
     44        // set up dashboard widget
     45        add_action('wp_dashboard_setup', function() {
     46            add_action('admin_enqueue_scripts', function() {
     47                wp_enqueue_script('chartjs', SWSTATS_URL.'lib/chartjs/chart.umd.min.js', [], false, true);
     48                wp_enqueue_script('swstats_dash', SWSTATS_URL.'js/dashboard.min.js', ['chartjs'], filemtime(SWSTATS_PATH.'js/dashboard.min.js'), true);
     49                wp_enqueue_style('swstats_global', SWSTATS_URL.'css/global.min.css', [], filemtime(SWSTATS_PATH.'css/global.min.css'));
     50                wp_enqueue_style('swstats_widget', SWSTATS_URL.'css/widget.min.css', [], filemtime(SWSTATS_PATH.'css/widget.min.css'));
     51            });
     52            wp_add_dashboard_widget('swstats-widget', 'Simple Webstats - '.__('Last 24 hours', 'simple-webstats'), array($this, 'widget'));
     53        });
     54   
     55    }
     56   
     57   
     58    // output dashboard widget
     59    function widget()
     60    {
     61        echo '<div class="panel" data-type="summary" data-nonce="'.esc_attr(wp_create_nonce('swstats_get_summary')).'" data-ajaxurl="'.esc_url(admin_url('admin-ajax.php')).'"><div class="inner"></div><div class="loading show"><i></i><i></i><i></i></div></div>';
    4362    }
    4463   
     
    5069        // period options
    5170        $periods = array(
     71            'last24hours' => __('Last 24 hours', 'simple-webstats'),
    5272            'today' => __('Today', 'simple-webstats'),
    5373            'yesterday' => __('Yesterday', 'simple-webstats'),
     
    6383        // get period option
    6484        $period = get_user_option('swstats_period');
    65         if(!$period || !array_key_exists($period, $periods)) $period = 'today';
     85        if(!$period || !array_key_exists($period, $periods)) $period = 'last24hours';
    6686               
    6787        echo '<div class="swstats-dash wrap" data-ajaxurl="'.esc_url(admin_url('admin-ajax.php')).'">';
     
    264284        $sql = $wpdb->prepare("SELECT DATE_FORMAT(FROM_UNIXTIME(v.entrytime), '%%Y%%m%%d%%H') AS grouptime, MIN(v.entrytime) AS ts, COUNT(*) AS val FROM %i AS v %1s GROUP BY grouptime ORDER BY grouptime", $wpdb->prefix.SWSTATS_VIEWS_TABLE, $whereClauses);
    265285        $visitsResult = $wpdb->get_results($sql);
    266         $visits = $this->format_chart_data($visitsResult, $timeBounds);
     286        $visits = $this->format_chart_data($visitsResult, $timeBounds, $period);
    267287       
    268288        // views dataset
     
    270290        $sql = $wpdb->prepare("SELECT DATE_FORMAT(FROM_UNIXTIME(v.entrytime), '%%Y%%m%%d%%H') AS grouptime, MIN(v.entrytime) AS ts, COUNT(*) AS val FROM %i AS v %1s GROUP BY grouptime ORDER BY grouptime", $wpdb->prefix.SWSTATS_VIEWS_TABLE, $whereClauses);
    271291        $viewsResult = $wpdb->get_results($sql);
    272         $views = $this->format_chart_data($viewsResult, $timeBounds);
     292        $views = $this->format_chart_data($viewsResult, $timeBounds, $period);
    273293               
    274294        $chartdata = array('granularities' => $timeBounds['chartGranularities'], 'defaultGranularity' => $timeBounds['defaultChartGranularity'], 'visits' => $visits, 'views' => $views, 'visitsLabel' => __('Visits', 'simple-webstats'), 'viewsLabel' => __('Views', 'simple-webstats'));     
     
    282302   
    283303    // format chart data, labelling datetimes according to timezone, and filling in zero values
    284     function format_chart_data($data, $timeBounds)
     304    function format_chart_data($data, $timeBounds, $period)
    285305    {
    286306        $dataSets = array();
     
    306326            {
    307327                $increment = "+1 hour";
    308                 $format = $this->dateFormat.' '.$this->hourFormat;
     328                if(($period == 'last24hours') || ($period == 'today') || ($period == 'yesterday')) $format = $this->hourFormat;
     329                else $format = $this->dateFormat.' '.$this->hourFormat;
    309330                if($this->hourFormat == 'H') $labelSuffix = ':00';
    310331            }
     
    462483        }
    463484       
    464         if($period == 'today') {
     485        if($period == 'last24hours') {
     486            $dateTimeStart->modify('-1 day');
     487            $dateTimeComparativeStart->modify('-2 days');
     488            $dateTimeComparativeEnd->modify('-1 day');
     489        }
     490        elseif($period == 'today') {
    465491            $dateTimeStart->setTime(0, 0, 0);
    466492            $dateTimeComparativeStart->modify('-1 day')->setTime(0, 0, 0);
     
    554580        $hours = count($this->get_time_intervals($bounds['start'], $bounds['end'], '+1 hour', 'YmdH'));
    555581               
    556         if($years >= 2) $bounds['chartGranularities']['year'] = __('Years', 'simple-webstats');
    557         if(($months >= 2) && ($months <= 120)) $bounds['chartGranularities']['month'] = __('Months', 'simple-webstats');
    558         if(($days >= 2) && ($days <= 366)) $bounds['chartGranularities']['day'] = __('Days', 'simple-webstats');
     582        if($years >= 3) $bounds['chartGranularities']['year'] = __('Years', 'simple-webstats');
     583        if(($months >= 3) && ($months <= 120)) $bounds['chartGranularities']['month'] = __('Months', 'simple-webstats');
     584        if(($days >= 3) && ($days <= 366)) $bounds['chartGranularities']['day'] = __('Days', 'simple-webstats');
    559585        if($hours <= 240) $bounds['chartGranularities']['hour'] = __('Hours', 'simple-webstats');
    560586       
    561587        if($years >= 4) $bounds['defaultChartGranularity'] = 'year';
    562588        elseif($months >= 6) $bounds['defaultChartGranularity'] = 'month';
    563         elseif($days >= 3) $bounds['defaultChartGranularity'] = 'day';
     589        elseif($days >= 4) $bounds['defaultChartGranularity'] = 'day';
    564590        else $bounds['defaultChartGranularity'] = 'hour';
    565591       
  • simple-webstats/trunk/js/dashboard.js

    r3062605 r3102299  
    22   
    33    let periodSelect = document.getElementById('periodselect');
    4     let viewPanels = document.querySelectorAll('.swstats-dash .panels > div');
     4    let viewPanels = document.querySelectorAll('.swstats-dash .panels > div, #swstats-widget .panel');
    55    let viewRequests = Array(viewPanels.length).fill(null);
    66   
     
    9393            let panelType = viewPanel.dataset.type;
    9494            let isSummaryPanel = (panelType === 'summary') ? true : false;
     95            let isWidget = (viewPanel.closest('#swstats-widget')) ? true : false;
    9596            let panelInner = viewPanel.querySelector('.inner');
    9697            let panelLoading = viewPanel.querySelector('.loading');
     
    103104           
    104105            let data = {
    105                 nonce: viewPanel.dataset.nonce,
    106                 period: periodSelect.value
     106                nonce: viewPanel.dataset.nonce
    107107            };
     108            if(isWidget) {
     109                // default period for widget
     110                data['period'] = 'last24hours';
     111            }
     112            else {
     113                data['period'] = periodSelect.value;
     114            }
    108115            if(isSummaryPanel) {
    109116                data['action'] = 'swstats_get_summary_data';
     
    178185                    var bodyCell = document.createElement('div');
    179186                    if((index == 0) && (type == 'countries')) {
    180                         if(!countries[cell]) cell = '<span class="fflag fflag-NONE ff-sm"></span>Unknown';
    181                         else cell = '<span class="fflag fflag-'+cell+' ff-sm"></span>'+countries[cell];
     187                        if(!swstats_countries[cell]) cell = '<span class="fflag fflag-NONE ff-sm"></span>Unknown';
     188                        else cell = '<span class="fflag fflag-'+cell+' ff-sm"></span>'+swstats_countries[cell];
    182189                    }
    183190                    if(index == 0) bodyCell.innerHTML = cell;
     
    193200    // output summary data
    194201    function output_summary_data(summaryPanel, data, chartdata) {
     202        let isWidget = (summaryPanel.closest('#swstats-widget')) ? true : false;
    195203        let panelInner = summaryPanel.querySelector('.inner');
    196204        var output = '';
     
    220228       
    221229        // output chart granularity controls
    222         if(Object.keys(chartdata.granularities).length > 1) {
     230        if(!isWidget && (Object.keys(chartdata.granularities).length > 1)) {
    223231            let granularityControls = document.createElement('div');
    224232            granularityControls.classList.add('granularity');
     
    283291    }
    284292   
     293    // init widget
     294    function init_widget(widgetPanel) {
     295       
     296        // trigger loading data for view panels
     297        viewPanels.forEach(el => { load_view_data(el); });
     298       
     299    }
     300   
    285301    // format numbers for output
    286302    function format_number(num) {
     
    325341    }
    326342   
    327     // get ajax URL and init
     343    // init dashboad page
    328344    let dashboard = document.querySelector('.swstats-dash');
    329345    if(dashboard && dashboard.dataset.ajaxurl) {
     
    331347        init_dashboard();
    332348    }
     349   
     350    // init dashboard widget
     351    let widgetPanel = document.querySelector('#swstats-widget .panel');
     352    if(widgetPanel && widgetPanel.dataset.ajaxurl) {
     353       
     354        // make widget clickable
     355        let widgetInside = document.querySelector('#swstats-widget .inside');
     356        if(widgetInside) widgetInside.addEventListener('click', function(e){
     357            e.preventDefault();
     358            window.location = 'admin.php?page=swstats_dash';
     359        });
     360       
     361        var ajaxURL = widgetPanel.dataset.ajaxurl;
     362        init_widget();
     363       
     364    }
    333365
    334366})();
  • simple-webstats/trunk/js/dashboard.min.js

    r3062605 r3102299  
    1 const countries={AF:"Afghanistan",AX:"Aland Islands",AL:"Albania",DZ:"Algeria",AS:"American Samoa",AD:"Andorra",AO:"Angola",AI:"Anguilla",AQ:"Antarctica",AG:"Antigua And Barbuda",AR:"Argentina",AM:"Armenia",AW:"Aruba",AU:"Australia",AT:"Austria",AZ:"Azerbaijan",BS:"Bahamas",BH:"Bahrain",BD:"Bangladesh",BB:"Barbados",BY:"Belarus",BE:"Belgium",BZ:"Belize",BJ:"Benin",BM:"Bermuda",BT:"Bhutan",BO:"Bolivia",BA:"Bosnia And Herzegovina",BW:"Botswana",BV:"Bouvet Island",BR:"Brazil",IO:"British Indian Ocean Territory",BN:"Brunei Darussalam",BG:"Bulgaria",BF:"Burkina Faso",BI:"Burundi",KH:"Cambodia",CM:"Cameroon",CA:"Canada",CV:"Cape Verde",KY:"Cayman Islands",CF:"Central African Republic",TD:"Chad",CL:"Chile",CN:"China",CX:"Christmas Island",CC:"Cocos (Keeling) Islands",CO:"Colombia",KM:"Comoros",CG:"Congo",CD:"Congo, Democratic Republic",CK:"Cook Islands",CR:"Costa Rica",CI:"Cote D'Ivoire",HR:"Croatia",CU:"Cuba",CY:"Cyprus",CZ:"Czech Republic",DK:"Denmark",DJ:"Djibouti",DM:"Dominica",DO:"Dominican Republic",EC:"Ecuador",EG:"Egypt",SV:"El Salvador",GQ:"Equatorial Guinea",ER:"Eritrea",EE:"Estonia",ET:"Ethiopia",FK:"Falkland Islands (Malvinas)",FO:"Faroe Islands",FJ:"Fiji",FI:"Finland",FR:"France",GF:"French Guiana",PF:"French Polynesia",TF:"French Southern Territories",GA:"Gabon",GM:"Gambia",GE:"Georgia",DE:"Germany",GH:"Ghana",GI:"Gibraltar",GR:"Greece",GL:"Greenland",GD:"Grenada",GP:"Guadeloupe",GU:"Guam",GT:"Guatemala",GG:"Guernsey",GN:"Guinea",GW:"Guinea-Bissau",GY:"Guyana",HT:"Haiti",HM:"Heard Island & Mcdonald Islands",VA:"Holy See (Vatican City State)",HN:"Honduras",HK:"Hong Kong",HU:"Hungary",IS:"Iceland",IN:"India",ID:"Indonesia",IR:"Iran, Islamic Republic Of",IQ:"Iraq",IE:"Ireland",IM:"Isle Of Man",IL:"Israel",IT:"Italy",JM:"Jamaica",JP:"Japan",JE:"Jersey",JO:"Jordan",KZ:"Kazakhstan",KE:"Kenya",KI:"Kiribati",KR:"Korea",KW:"Kuwait",KG:"Kyrgyzstan",LA:"Lao People's Democratic Republic",LV:"Latvia",LB:"Lebanon",LS:"Lesotho",LR:"Liberia",LY:"Libyan Arab Jamahiriya",LI:"Liechtenstein",LT:"Lithuania",LU:"Luxembourg",MO:"Macao",MK:"Macedonia",MG:"Madagascar",MW:"Malawi",MY:"Malaysia",MV:"Maldives",ML:"Mali",MT:"Malta",MH:"Marshall Islands",MQ:"Martinique",MR:"Mauritania",MU:"Mauritius",YT:"Mayotte",MX:"Mexico",FM:"Micronesia, Federated States Of",MD:"Moldova",MC:"Monaco",MN:"Mongolia",ME:"Montenegro",MS:"Montserrat",MA:"Morocco",MZ:"Mozambique",MM:"Myanmar",NA:"Namibia",NR:"Nauru",NP:"Nepal",NL:"Netherlands",AN:"Netherlands Antilles",NC:"New Caledonia",NZ:"New Zealand",NI:"Nicaragua",NE:"Niger",NG:"Nigeria",NU:"Niue",NF:"Norfolk Island",MP:"Northern Mariana Islands",NO:"Norway",OM:"Oman",PK:"Pakistan",PW:"Palau",PS:"Palestinian Territory, Occupied",PA:"Panama",PG:"Papua New Guinea",PY:"Paraguay",PE:"Peru",PH:"Philippines",PN:"Pitcairn",PL:"Poland",PT:"Portugal",PR:"Puerto Rico",QA:"Qatar",RE:"Reunion",RO:"Romania",RU:"Russian Federation",RW:"Rwanda",BL:"Saint Barthelemy",SH:"Saint Helena",KN:"Saint Kitts And Nevis",LC:"Saint Lucia",MF:"Saint Martin",PM:"Saint Pierre And Miquelon",VC:"Saint Vincent And Grenadines",WS:"Samoa",SM:"San Marino",ST:"Sao Tome And Principe",SA:"Saudi Arabia",SN:"Senegal",RS:"Serbia",SC:"Seychelles",SL:"Sierra Leone",SG:"Singapore",SK:"Slovakia",SI:"Slovenia",SB:"Solomon Islands",SO:"Somalia",ZA:"South Africa",GS:"South Georgia And Sandwich Isl.",ES:"Spain",LK:"Sri Lanka",SD:"Sudan",SR:"Suriname",SJ:"Svalbard And Jan Mayen",SZ:"Swaziland",SE:"Sweden",CH:"Switzerland",SY:"Syrian Arab Republic",TW:"Taiwan",TJ:"Tajikistan",TZ:"Tanzania",TH:"Thailand",TL:"Timor-Leste",TG:"Togo",TK:"Tokelau",TO:"Tonga",TT:"Trinidad And Tobago",TN:"Tunisia",TR:"Turkey",TM:"Turkmenistan",TC:"Turks And Caicos Islands",TV:"Tuvalu",UG:"Uganda",UA:"Ukraine",AE:"United Arab Emirates",GB:"United Kingdom",US:"United States",UM:"United States Outlying Islands",UY:"Uruguay",UZ:"Uzbekistan",VU:"Vanuatu",VE:"Venezuela",VN:"Viet Nam",VG:"Virgin Islands, British",VI:"Virgin Islands, U.S.",WF:"Wallis And Futuna",EH:"Western Sahara",YE:"Yemen",ZM:"Zambia",ZW:"Zimbabwe"};(()=>{let a=document.getElementById("periodselect"),e=document.querySelectorAll(".swstats-dash .panels > div"),t=Array(e.length).fill(null);Chart.defaults.font.family='-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,Oxygen-Sans,Ubuntu,Cantarell,"Helvetica Neue",sans-serif',Chart.defaults.font.size=11,Chart.defaults.plugins.legend.display=!1,Chart.defaults.color="rgba(255,255,255,.8)",Chart.defaults.maintainAspectRatio=!1,Chart.defaults.borderColor="rgba(255,255,255,.1)",Chart.defaults.elements.point.pointStyle=!1,Chart.defaults.elements.line.borderWidth=2,Chart.defaults.elements.line.borderCapStyle="round",Chart.defaults.elements.line.borderJoinStyle="round";let n={type:"line",options:{scales:{x:{border:{display:!1},grid:{display:!1},ticks:{maxRotation:0,minRotation:0,autoSkipPadding:15,padding:5},afterTickToLabelConversion:function(a){a.ticks[0].label="",a.ticks[a.ticks.length-1].label=""}},y:{border:{display:!1},beginAtZero:!0,grid:{drawTicks:!1},position:"right",ticks:{maxRotation:0,minRotation:0,precision:0,padding:-10,mirror:!0,z:10,callback:(a,e,t)=>0==a?"":o(a)}}}}};function i(a,e){return{labels:Object.keys(a.visits[e]),datasets:[{label:a.visitsLabel,data:a.visits[e],borderColor:"rgba(54, 162, 235, .8)",backgroundColor:"rgba(54, 162, 235, .8)"},{label:a.viewsLabel,data:a.views[e],borderColor:"rgba(150, 222, 150, .8)",backgroundColor:"rgba(150, 222, 150, .8)"}]}}function r(r){if(r.dataset.type&&r.dataset.nonce){let u=Array.prototype.indexOf.call(e,r),m=r.dataset.type,h="summary"===m,S=r.querySelector(".inner"),g=r.querySelector(".loading");if(S.classList.remove("show"),g.classList.add("show"),!h){r.querySelector(".nodata").classList.remove("show")}let b={nonce:r.dataset.nonce,period:a.value};h?b.action="swstats_get_summary_data":(b.action="swstats_get_table_data",b.dataType=m,b.viewID=r.dataset.viewid,b.numResults=10),t[u]&&"readyState"in t[u]&&t[u].readyState<4&&t[u].abort();let f=[];Object.keys(b).forEach((a=>f.push(encodeURIComponent(a)+"="+encodeURIComponent(b[a]))));let C=f.join("&");t[u]=new XMLHttpRequest,t[u].open("POST",p,!0),t[u].setRequestHeader("Content-Type","application/x-www-form-urlencoded"),t[u].onload=function(){if(this.status>=200&&this.status<400){let a=!1;this.response&&(a=JSON.parse(this.response)),a.data&&a.newNonce?(r.dataset.nonce=a.newNonce,h?function(a,e,t){let r=a.querySelector(".inner");var u="";for(const[a,t]of Object.entries(e)){if(u+='<div class="'+a+'"><h3>'+t.label+"</h3><p>",null===t.value?u+="--":"number"==t.format?u+=o(t.value):"time"==t.format?u+=s(t.value):"percent"==t.format?u+=l(t.value,2):u+=t.value,null!==t.comparison){let e=d(t.value,t.comparison);null!==e&&(u+="bouncerate"==a?c(e,!0):c(e))}u+="</p></div>"}r.innerHTML=u;let p=document.createElement("div");p.classList.add("chart");const m=document.createElement("canvas");if(p.appendChild(m),Object.keys(t.granularities).length>1){let a=document.createElement("div");a.classList.add("granularity");for(const[e,n]of Object.entries(t.granularities)){let r=document.createElement("a");r.innerText=n,r.href="#",r.dataset.granularity=e,e==t.defaultGranularity&&r.classList.add("active"),r.addEventListener("click",(function(a){a.preventDefault(),h.data=i(t,this.dataset.granularity),h.update(),this.parentNode.querySelectorAll("a").forEach((a=>{a.classList.remove("active")})),this.classList.add("active")})),a.appendChild(r)}p.appendChild(a)}r.appendChild(p),n.data=i(t,t.defaultGranularity);const h=new Chart(m,n)}(r,a.data,a.chartdata):function(a,e,t,n){let i=a.dataset.type;if(a&&i&&e&&t){let s=a.querySelector(".table");s.replaceChildren();let l=a.querySelector(".nodata");if(0==t.length)return l.classList.add("show"),!1;l.classList.remove("show");var r=document.createElement("div");r.classList.add("row","head","cols"+e.length),e.forEach((a=>{var e=document.createElement("div");e.innerHTML=a,r.appendChild(e)})),s.appendChild(r),t.forEach((a=>{var t=document.createElement("div");if(t.classList.add("row","body","cols"+e.length),n){let e=Math.round(a[1]/n*1e3)/10;t.style.backgroundImage="linear-gradient(90deg, rgba(255,255,255,.1) "+e+"%, rgba(255,255,255,0) "+e+"%)"}a.forEach(((a,e)=>{var n=document.createElement("div");0==e&&"countries"==i&&(a=countries[a]?'<span class="fflag fflag-'+a+' ff-sm"></span>'+countries[a]:'<span class="fflag fflag-NONE ff-sm"></span>Unknown'),n.innerHTML=0==e?a:o(a),t.appendChild(n)})),s.appendChild(t)}))}}(r,a.headers,a.data,a.count),S.classList.add("show"),g.classList.remove("show")):console.log("Simple Webstats Error: "+a.error)}else console.log("Simple Webstats: Connection Error")},t[u].onerror=function(){console.log("Simple Webstats: Connection Error")},t[u].send(C)}}function o(a){return a>=1e8?parseFloat((a/1e6).toFixed(0))+"M":a>=1e6?parseFloat((a/1e6).toFixed(1))+"M":a>=1e5?parseFloat((a/1e3).toFixed(0))+"K":a>=1e3?parseFloat((a/1e3).toFixed(1))+"K":parseFloat((a/1).toFixed(2))}function s(a){a=Math.round(a);var e=Math.floor(a/60);return e>0&&(a-=60*e),e+"m "+String(a).padStart(2,"0")+"s"}function l(a,e){return parseFloat((100*a).toFixed(e))+"%"}function d(a,e){if(a=parseFloat(a),e=parseFloat(e),0==a||0==e)return null;return(a-e)/e}function c(a,e){a=parseFloat((100*a).toFixed(1)),!0!==e&&(e=!1);let t='<span class="comparison '+(!e&&a>=0||e&&a<=0?"green":"red")+'">';return a>=0&&(t+="+"),t+=a+"%</span>",t}let u=document.querySelector(".swstats-dash");if(u&&u.dataset.ajaxurl){var p=u.dataset.ajaxurl;e.forEach((a=>{r(a)})),a.addEventListener("change",(function(){e.forEach((a=>{r(a)}))})),document.querySelectorAll(".swstats-dash .data-panel .switches a").forEach((a=>{a.addEventListener("click",(function(e){e.preventDefault();let t=a.closest(".switches").querySelectorAll("a"),n=a.closest(".data-panel"),i=n.querySelector("h2");n.dataset.viewid=a.dataset.viewid,i.innerText=a.innerText,a.style.display="none",t.forEach((e=>{a.isEqualNode(e)||(e.style.display="inline-block")})),r(n)}))}))}})();
     1const swstats_countries={AF:"Afghanistan",AX:"Aland Islands",AL:"Albania",DZ:"Algeria",AS:"American Samoa",AD:"Andorra",AO:"Angola",AI:"Anguilla",AQ:"Antarctica",AG:"Antigua And Barbuda",AR:"Argentina",AM:"Armenia",AW:"Aruba",AU:"Australia",AT:"Austria",AZ:"Azerbaijan",BS:"Bahamas",BH:"Bahrain",BD:"Bangladesh",BB:"Barbados",BY:"Belarus",BE:"Belgium",BZ:"Belize",BJ:"Benin",BM:"Bermuda",BT:"Bhutan",BO:"Bolivia",BA:"Bosnia And Herzegovina",BW:"Botswana",BV:"Bouvet Island",BR:"Brazil",IO:"British Indian Ocean Territory",BN:"Brunei Darussalam",BG:"Bulgaria",BF:"Burkina Faso",BI:"Burundi",KH:"Cambodia",CM:"Cameroon",CA:"Canada",CV:"Cape Verde",KY:"Cayman Islands",CF:"Central African Republic",TD:"Chad",CL:"Chile",CN:"China",CX:"Christmas Island",CC:"Cocos (Keeling) Islands",CO:"Colombia",KM:"Comoros",CG:"Congo",CD:"Congo, Democratic Republic",CK:"Cook Islands",CR:"Costa Rica",CI:"Cote D'Ivoire",HR:"Croatia",CU:"Cuba",CY:"Cyprus",CZ:"Czech Republic",DK:"Denmark",DJ:"Djibouti",DM:"Dominica",DO:"Dominican Republic",EC:"Ecuador",EG:"Egypt",SV:"El Salvador",GQ:"Equatorial Guinea",ER:"Eritrea",EE:"Estonia",ET:"Ethiopia",FK:"Falkland Islands (Malvinas)",FO:"Faroe Islands",FJ:"Fiji",FI:"Finland",FR:"France",GF:"French Guiana",PF:"French Polynesia",TF:"French Southern Territories",GA:"Gabon",GM:"Gambia",GE:"Georgia",DE:"Germany",GH:"Ghana",GI:"Gibraltar",GR:"Greece",GL:"Greenland",GD:"Grenada",GP:"Guadeloupe",GU:"Guam",GT:"Guatemala",GG:"Guernsey",GN:"Guinea",GW:"Guinea-Bissau",GY:"Guyana",HT:"Haiti",HM:"Heard Island & Mcdonald Islands",VA:"Holy See (Vatican City State)",HN:"Honduras",HK:"Hong Kong",HU:"Hungary",IS:"Iceland",IN:"India",ID:"Indonesia",IR:"Iran, Islamic Republic Of",IQ:"Iraq",IE:"Ireland",IM:"Isle Of Man",IL:"Israel",IT:"Italy",JM:"Jamaica",JP:"Japan",JE:"Jersey",JO:"Jordan",KZ:"Kazakhstan",KE:"Kenya",KI:"Kiribati",KR:"Korea",KW:"Kuwait",KG:"Kyrgyzstan",LA:"Lao People's Democratic Republic",LV:"Latvia",LB:"Lebanon",LS:"Lesotho",LR:"Liberia",LY:"Libyan Arab Jamahiriya",LI:"Liechtenstein",LT:"Lithuania",LU:"Luxembourg",MO:"Macao",MK:"Macedonia",MG:"Madagascar",MW:"Malawi",MY:"Malaysia",MV:"Maldives",ML:"Mali",MT:"Malta",MH:"Marshall Islands",MQ:"Martinique",MR:"Mauritania",MU:"Mauritius",YT:"Mayotte",MX:"Mexico",FM:"Micronesia, Federated States Of",MD:"Moldova",MC:"Monaco",MN:"Mongolia",ME:"Montenegro",MS:"Montserrat",MA:"Morocco",MZ:"Mozambique",MM:"Myanmar",NA:"Namibia",NR:"Nauru",NP:"Nepal",NL:"Netherlands",AN:"Netherlands Antilles",NC:"New Caledonia",NZ:"New Zealand",NI:"Nicaragua",NE:"Niger",NG:"Nigeria",NU:"Niue",NF:"Norfolk Island",MP:"Northern Mariana Islands",NO:"Norway",OM:"Oman",PK:"Pakistan",PW:"Palau",PS:"Palestinian Territory, Occupied",PA:"Panama",PG:"Papua New Guinea",PY:"Paraguay",PE:"Peru",PH:"Philippines",PN:"Pitcairn",PL:"Poland",PT:"Portugal",PR:"Puerto Rico",QA:"Qatar",RE:"Reunion",RO:"Romania",RU:"Russian Federation",RW:"Rwanda",BL:"Saint Barthelemy",SH:"Saint Helena",KN:"Saint Kitts And Nevis",LC:"Saint Lucia",MF:"Saint Martin",PM:"Saint Pierre And Miquelon",VC:"Saint Vincent And Grenadines",WS:"Samoa",SM:"San Marino",ST:"Sao Tome And Principe",SA:"Saudi Arabia",SN:"Senegal",RS:"Serbia",SC:"Seychelles",SL:"Sierra Leone",SG:"Singapore",SK:"Slovakia",SI:"Slovenia",SB:"Solomon Islands",SO:"Somalia",ZA:"South Africa",GS:"South Georgia And Sandwich Isl.",ES:"Spain",LK:"Sri Lanka",SD:"Sudan",SR:"Suriname",SJ:"Svalbard And Jan Mayen",SZ:"Swaziland",SE:"Sweden",CH:"Switzerland",SY:"Syrian Arab Republic",TW:"Taiwan",TJ:"Tajikistan",TZ:"Tanzania",TH:"Thailand",TL:"Timor-Leste",TG:"Togo",TK:"Tokelau",TO:"Tonga",TT:"Trinidad And Tobago",TN:"Tunisia",TR:"Turkey",TM:"Turkmenistan",TC:"Turks And Caicos Islands",TV:"Tuvalu",UG:"Uganda",UA:"Ukraine",AE:"United Arab Emirates",GB:"United Kingdom",US:"United States",UM:"United States Outlying Islands",UY:"Uruguay",UZ:"Uzbekistan",VU:"Vanuatu",VE:"Venezuela",VN:"Viet Nam",VG:"Virgin Islands, British",VI:"Virgin Islands, U.S.",WF:"Wallis And Futuna",EH:"Western Sahara",YE:"Yemen",ZM:"Zambia",ZW:"Zimbabwe"};(()=>{let a=document.getElementById("periodselect"),e=document.querySelectorAll(".swstats-dash .panels > div, #swstats-widget .panel"),t=Array(e.length).fill(null);Chart.defaults.font.family='-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,Oxygen-Sans,Ubuntu,Cantarell,"Helvetica Neue",sans-serif',Chart.defaults.font.size=11,Chart.defaults.plugins.legend.display=!1,Chart.defaults.color="rgba(255,255,255,.8)",Chart.defaults.maintainAspectRatio=!1,Chart.defaults.borderColor="rgba(255,255,255,.1)",Chart.defaults.elements.point.pointStyle=!1,Chart.defaults.elements.line.borderWidth=2,Chart.defaults.elements.line.borderCapStyle="round",Chart.defaults.elements.line.borderJoinStyle="round";let n={type:"line",options:{scales:{x:{border:{display:!1},grid:{display:!1},ticks:{maxRotation:0,minRotation:0,autoSkipPadding:15,padding:5},afterTickToLabelConversion:function(a){a.ticks[0].label="",a.ticks[a.ticks.length-1].label=""}},y:{border:{display:!1},beginAtZero:!0,grid:{drawTicks:!1},position:"right",ticks:{maxRotation:0,minRotation:0,precision:0,padding:-10,mirror:!0,z:10,callback:(a,e,t)=>0==a?"":s(a)}}}}};function i(a,e){return{labels:Object.keys(a.visits[e]),datasets:[{label:a.visitsLabel,data:a.visits[e],borderColor:"rgba(54, 162, 235, .8)",backgroundColor:"rgba(54, 162, 235, .8)"},{label:a.viewsLabel,data:a.views[e],borderColor:"rgba(150, 222, 150, .8)",backgroundColor:"rgba(150, 222, 150, .8)"}]}}function r(r){if(r.dataset.type&&r.dataset.nonce){let u=Array.prototype.indexOf.call(e,r),m=r.dataset.type,h="summary"===m,S=!!r.closest("#swstats-widget"),g=r.querySelector(".inner"),f=r.querySelector(".loading");if(g.classList.remove("show"),f.classList.add("show"),!h){r.querySelector(".nodata").classList.remove("show")}let y={nonce:r.dataset.nonce};y.period=S?"last24hours":a.value,h?y.action="swstats_get_summary_data":(y.action="swstats_get_table_data",y.dataType=m,y.viewID=r.dataset.viewid,y.numResults=10),t[u]&&"readyState"in t[u]&&t[u].readyState<4&&t[u].abort();let b=[];Object.keys(y).forEach((a=>b.push(encodeURIComponent(a)+"="+encodeURIComponent(y[a]))));let C=b.join("&");t[u]=new XMLHttpRequest,t[u].open("POST",p,!0),t[u].setRequestHeader("Content-Type","application/x-www-form-urlencoded"),t[u].onload=function(){if(this.status>=200&&this.status<400){let a=!1;this.response&&(a=JSON.parse(this.response)),a.data&&a.newNonce?(r.dataset.nonce=a.newNonce,h?function(a,e,t){let r=!!a.closest("#swstats-widget"),u=a.querySelector(".inner");var p="";for(const[a,t]of Object.entries(e)){if(p+='<div class="'+a+'"><h3>'+t.label+"</h3><p>",null===t.value?p+="--":"number"==t.format?p+=s(t.value):"time"==t.format?p+=o(t.value):"percent"==t.format?p+=l(t.value,2):p+=t.value,null!==t.comparison){let e=d(t.value,t.comparison);null!==e&&(p+="bouncerate"==a?c(e,!0):c(e))}p+="</p></div>"}u.innerHTML=p;let m=document.createElement("div");m.classList.add("chart");const h=document.createElement("canvas");if(m.appendChild(h),!r&&Object.keys(t.granularities).length>1){let a=document.createElement("div");a.classList.add("granularity");for(const[e,n]of Object.entries(t.granularities)){let r=document.createElement("a");r.innerText=n,r.href="#",r.dataset.granularity=e,e==t.defaultGranularity&&r.classList.add("active"),r.addEventListener("click",(function(a){a.preventDefault(),S.data=i(t,this.dataset.granularity),S.update(),this.parentNode.querySelectorAll("a").forEach((a=>{a.classList.remove("active")})),this.classList.add("active")})),a.appendChild(r)}m.appendChild(a)}u.appendChild(m),n.data=i(t,t.defaultGranularity);const S=new Chart(h,n)}(r,a.data,a.chartdata):function(a,e,t,n){let i=a.dataset.type;if(a&&i&&e&&t){let o=a.querySelector(".table");o.replaceChildren();let l=a.querySelector(".nodata");if(0==t.length)return l.classList.add("show"),!1;l.classList.remove("show");var r=document.createElement("div");r.classList.add("row","head","cols"+e.length),e.forEach((a=>{var e=document.createElement("div");e.innerHTML=a,r.appendChild(e)})),o.appendChild(r),t.forEach((a=>{var t=document.createElement("div");if(t.classList.add("row","body","cols"+e.length),n){let e=Math.round(a[1]/n*1e3)/10;t.style.backgroundImage="linear-gradient(90deg, rgba(255,255,255,.1) "+e+"%, rgba(255,255,255,0) "+e+"%)"}a.forEach(((a,e)=>{var n=document.createElement("div");0==e&&"countries"==i&&(a=swstats_countries[a]?'<span class="fflag fflag-'+a+' ff-sm"></span>'+swstats_countries[a]:'<span class="fflag fflag-NONE ff-sm"></span>Unknown'),n.innerHTML=0==e?a:s(a),t.appendChild(n)})),o.appendChild(t)}))}}(r,a.headers,a.data,a.count),g.classList.add("show"),f.classList.remove("show")):console.log("Simple Webstats Error: "+a.error)}else console.log("Simple Webstats: Connection Error")},t[u].onerror=function(){console.log("Simple Webstats: Connection Error")},t[u].send(C)}}function s(a){return a>=1e8?parseFloat((a/1e6).toFixed(0))+"M":a>=1e6?parseFloat((a/1e6).toFixed(1))+"M":a>=1e5?parseFloat((a/1e3).toFixed(0))+"K":a>=1e3?parseFloat((a/1e3).toFixed(1))+"K":parseFloat((a/1).toFixed(2))}function o(a){a=Math.round(a);var e=Math.floor(a/60);return e>0&&(a-=60*e),e+"m "+String(a).padStart(2,"0")+"s"}function l(a,e){return parseFloat((100*a).toFixed(e))+"%"}function d(a,e){if(a=parseFloat(a),e=parseFloat(e),0==a||0==e)return null;return(a-e)/e}function c(a,e){a=parseFloat((100*a).toFixed(1)),!0!==e&&(e=!1);let t='<span class="comparison '+(!e&&a>=0||e&&a<=0?"green":"red")+'">';return a>=0&&(t+="+"),t+=a+"%</span>",t}let u=document.querySelector(".swstats-dash");if(u&&u.dataset.ajaxurl){var p=u.dataset.ajaxurl;e.forEach((a=>{r(a)})),a.addEventListener("change",(function(){e.forEach((a=>{r(a)}))})),document.querySelectorAll(".swstats-dash .data-panel .switches a").forEach((a=>{a.addEventListener("click",(function(e){e.preventDefault();let t=a.closest(".switches").querySelectorAll("a"),n=a.closest(".data-panel"),i=n.querySelector("h2");n.dataset.viewid=a.dataset.viewid,i.innerText=a.innerText,a.style.display="none",t.forEach((e=>{a.isEqualNode(e)||(e.style.display="inline-block")})),r(n)}))}))}let m=document.querySelector("#swstats-widget .panel");if(m&&m.dataset.ajaxurl){let a=document.querySelector("#swstats-widget .inside");a&&a.addEventListener("click",(function(a){a.preventDefault(),window.location="admin.php?page=swstats_dash"}));p=m.dataset.ajaxurl;e.forEach((a=>{r(a)}))}})();
  • simple-webstats/trunk/js/inc/countries.js

    r3062605 r3102299  
    1 const countries = {
     1const swstats_countries = {
    22    AF : 'Afghanistan',
    33    AX : 'Aland Islands',
  • simple-webstats/trunk/readme.txt

    r3101173 r3102299  
    55Tested up to: 6.5
    66Requires PHP: 7.3
    7 Stable tag: 1.1.0
     7Stable tag: 1.2.0
    88License: GPLv2 or later
    99
     
    5050== Changelog ==
    5151
     52= 1.2.0 =
     53
     54* Added dashboard widget.
     55* Added "Last 24 hours" view.
     56* Added rotation of UID salt to increase data anonymity.
     57
    5258= 1.1.0 =
    5359
  • simple-webstats/trunk/simple-webstats.php

    r3101173 r3102299  
    44* Plugin Name: Simple Webstats
    55* Description: Privacy-focused cookie-free web analytics for WordPress.
    6 * Version: 1.1.0
     6* Version: 1.2.0
    77* Requires at least: 4.6
    88* Requires PHP: 7.3
     
    2020
    2121// config
    22 define('SWSTATS_VERSION', '1.1.0');
     22define('SWSTATS_VERSION', '1.2.0');
    2323define('SWSTATS_PATH',  plugin_dir_path(__FILE__));
    2424define('SWSTATS_URL',  plugin_dir_url(__FILE__));
     
    4848    delete_option('swstats_version');
    4949    delete_option('swstats_uid_salt');
     50    delete_option('swstats_uid_salt_expiry');
    5051   
    5152    // delete user options
Note: See TracChangeset for help on using the changeset viewer.