Changeset 3102299
- Timestamp:
- 06/13/2024 12:40:28 PM (22 months ago)
- Location:
- simple-webstats
- Files:
-
- 115 added
- 9 edited
-
tags/1.2.0 (added)
-
tags/1.2.0/css (added)
-
tags/1.2.0/css/dashboard.min.css (added)
-
tags/1.2.0/css/dashboard.scss (added)
-
tags/1.2.0/css/global.min.css (added)
-
tags/1.2.0/css/global.scss (added)
-
tags/1.2.0/css/widget.min.css (added)
-
tags/1.2.0/css/widget.scss (added)
-
tags/1.2.0/inc (added)
-
tags/1.2.0/inc/collector.php (added)
-
tags/1.2.0/inc/dashboard.php (added)
-
tags/1.2.0/inc/setup.php (added)
-
tags/1.2.0/index.php (added)
-
tags/1.2.0/js (added)
-
tags/1.2.0/js/collector.js (added)
-
tags/1.2.0/js/collector.min.js (added)
-
tags/1.2.0/js/dashboard.js (added)
-
tags/1.2.0/js/dashboard.min.js (added)
-
tags/1.2.0/js/inc (added)
-
tags/1.2.0/js/inc/countries.js (added)
-
tags/1.2.0/lib (added)
-
tags/1.2.0/lib/chartjs (added)
-
tags/1.2.0/lib/chartjs/chart.umd.min.js (added)
-
tags/1.2.0/lib/freakflags (added)
-
tags/1.2.0/lib/freakflags/flagSprite42.png (added)
-
tags/1.2.0/lib/freakflags/freakflags.css (added)
-
tags/1.2.0/readme.txt (added)
-
tags/1.2.0/simple-webstats.php (added)
-
tags/1.2.0/vendor-prefixed (added)
-
tags/1.2.0/vendor-prefixed/autoload-classmap.php (added)
-
tags/1.2.0/vendor-prefixed/autoload-files.php (added)
-
tags/1.2.0/vendor-prefixed/autoload.php (added)
-
tags/1.2.0/vendor-prefixed/matomo (added)
-
tags/1.2.0/vendor-prefixed/matomo/device-detector (added)
-
tags/1.2.0/vendor-prefixed/matomo/device-detector/Cache (added)
-
tags/1.2.0/vendor-prefixed/matomo/device-detector/Cache/CacheInterface.php (added)
-
tags/1.2.0/vendor-prefixed/matomo/device-detector/Cache/DoctrineBridge.php (added)
-
tags/1.2.0/vendor-prefixed/matomo/device-detector/Cache/LaravelCache.php (added)
-
tags/1.2.0/vendor-prefixed/matomo/device-detector/Cache/PSR16Bridge.php (added)
-
tags/1.2.0/vendor-prefixed/matomo/device-detector/Cache/PSR6Bridge.php (added)
-
tags/1.2.0/vendor-prefixed/matomo/device-detector/Cache/StaticCache.php (added)
-
tags/1.2.0/vendor-prefixed/matomo/device-detector/ClientHints.php (added)
-
tags/1.2.0/vendor-prefixed/matomo/device-detector/DeviceDetector.php (added)
-
tags/1.2.0/vendor-prefixed/matomo/device-detector/LICENSE (added)
-
tags/1.2.0/vendor-prefixed/matomo/device-detector/Parser (added)
-
tags/1.2.0/vendor-prefixed/matomo/device-detector/Parser/AbstractBotParser.php (added)
-
tags/1.2.0/vendor-prefixed/matomo/device-detector/Parser/AbstractParser.php (added)
-
tags/1.2.0/vendor-prefixed/matomo/device-detector/Parser/Bot.php (added)
-
tags/1.2.0/vendor-prefixed/matomo/device-detector/Parser/Client (added)
-
tags/1.2.0/vendor-prefixed/matomo/device-detector/Parser/Client/AbstractClientParser.php (added)
-
tags/1.2.0/vendor-prefixed/matomo/device-detector/Parser/Client/Browser (added)
-
tags/1.2.0/vendor-prefixed/matomo/device-detector/Parser/Client/Browser.php (added)
-
tags/1.2.0/vendor-prefixed/matomo/device-detector/Parser/Client/Browser/Engine (added)
-
tags/1.2.0/vendor-prefixed/matomo/device-detector/Parser/Client/Browser/Engine.php (added)
-
tags/1.2.0/vendor-prefixed/matomo/device-detector/Parser/Client/Browser/Engine/Version.php (added)
-
tags/1.2.0/vendor-prefixed/matomo/device-detector/Parser/Client/FeedReader.php (added)
-
tags/1.2.0/vendor-prefixed/matomo/device-detector/Parser/Client/Hints (added)
-
tags/1.2.0/vendor-prefixed/matomo/device-detector/Parser/Client/Hints/AppHints.php (added)
-
tags/1.2.0/vendor-prefixed/matomo/device-detector/Parser/Client/Hints/BrowserHints.php (added)
-
tags/1.2.0/vendor-prefixed/matomo/device-detector/Parser/Client/Library.php (added)
-
tags/1.2.0/vendor-prefixed/matomo/device-detector/Parser/Client/MediaPlayer.php (added)
-
tags/1.2.0/vendor-prefixed/matomo/device-detector/Parser/Client/MobileApp.php (added)
-
tags/1.2.0/vendor-prefixed/matomo/device-detector/Parser/Client/PIM.php (added)
-
tags/1.2.0/vendor-prefixed/matomo/device-detector/Parser/Device (added)
-
tags/1.2.0/vendor-prefixed/matomo/device-detector/Parser/Device/AbstractDeviceParser.php (added)
-
tags/1.2.0/vendor-prefixed/matomo/device-detector/Parser/Device/Camera.php (added)
-
tags/1.2.0/vendor-prefixed/matomo/device-detector/Parser/Device/CarBrowser.php (added)
-
tags/1.2.0/vendor-prefixed/matomo/device-detector/Parser/Device/Console.php (added)
-
tags/1.2.0/vendor-prefixed/matomo/device-detector/Parser/Device/HbbTv.php (added)
-
tags/1.2.0/vendor-prefixed/matomo/device-detector/Parser/Device/Mobile.php (added)
-
tags/1.2.0/vendor-prefixed/matomo/device-detector/Parser/Device/Notebook.php (added)
-
tags/1.2.0/vendor-prefixed/matomo/device-detector/Parser/Device/PortableMediaPlayer.php (added)
-
tags/1.2.0/vendor-prefixed/matomo/device-detector/Parser/Device/ShellTv.php (added)
-
tags/1.2.0/vendor-prefixed/matomo/device-detector/Parser/OperatingSystem.php (added)
-
tags/1.2.0/vendor-prefixed/matomo/device-detector/Parser/VendorFragment.php (added)
-
tags/1.2.0/vendor-prefixed/matomo/device-detector/README.md (added)
-
tags/1.2.0/vendor-prefixed/matomo/device-detector/Yaml (added)
-
tags/1.2.0/vendor-prefixed/matomo/device-detector/Yaml/ParserInterface.php (added)
-
tags/1.2.0/vendor-prefixed/matomo/device-detector/Yaml/Pecl.php (added)
-
tags/1.2.0/vendor-prefixed/matomo/device-detector/Yaml/Spyc.php (added)
-
tags/1.2.0/vendor-prefixed/matomo/device-detector/Yaml/Symfony.php (added)
-
tags/1.2.0/vendor-prefixed/matomo/device-detector/autoload.php (added)
-
tags/1.2.0/vendor-prefixed/matomo/device-detector/composer.json (added)
-
tags/1.2.0/vendor-prefixed/matomo/device-detector/phpcs.xml (added)
-
tags/1.2.0/vendor-prefixed/matomo/device-detector/regexes (added)
-
tags/1.2.0/vendor-prefixed/matomo/device-detector/regexes/bots.yml (added)
-
tags/1.2.0/vendor-prefixed/matomo/device-detector/regexes/client (added)
-
tags/1.2.0/vendor-prefixed/matomo/device-detector/regexes/client/browser_engine.yml (added)
-
tags/1.2.0/vendor-prefixed/matomo/device-detector/regexes/client/browsers.yml (added)
-
tags/1.2.0/vendor-prefixed/matomo/device-detector/regexes/client/feed_readers.yml (added)
-
tags/1.2.0/vendor-prefixed/matomo/device-detector/regexes/client/hints (added)
-
tags/1.2.0/vendor-prefixed/matomo/device-detector/regexes/client/hints/apps.yml (added)
-
tags/1.2.0/vendor-prefixed/matomo/device-detector/regexes/client/hints/browsers.yml (added)
-
tags/1.2.0/vendor-prefixed/matomo/device-detector/regexes/client/libraries.yml (added)
-
tags/1.2.0/vendor-prefixed/matomo/device-detector/regexes/client/mediaplayers.yml (added)
-
tags/1.2.0/vendor-prefixed/matomo/device-detector/regexes/client/mobile_apps.yml (added)
-
tags/1.2.0/vendor-prefixed/matomo/device-detector/regexes/client/pim.yml (added)
-
tags/1.2.0/vendor-prefixed/matomo/device-detector/regexes/device (added)
-
tags/1.2.0/vendor-prefixed/matomo/device-detector/regexes/device/cameras.yml (added)
-
tags/1.2.0/vendor-prefixed/matomo/device-detector/regexes/device/car_browsers.yml (added)
-
tags/1.2.0/vendor-prefixed/matomo/device-detector/regexes/device/consoles.yml (added)
-
tags/1.2.0/vendor-prefixed/matomo/device-detector/regexes/device/mobiles.yml (added)
-
tags/1.2.0/vendor-prefixed/matomo/device-detector/regexes/device/notebooks.yml (added)
-
tags/1.2.0/vendor-prefixed/matomo/device-detector/regexes/device/portable_media_player.yml (added)
-
tags/1.2.0/vendor-prefixed/matomo/device-detector/regexes/device/shell_tv.yml (added)
-
tags/1.2.0/vendor-prefixed/matomo/device-detector/regexes/device/televisions.yml (added)
-
tags/1.2.0/vendor-prefixed/matomo/device-detector/regexes/oss.yml (added)
-
tags/1.2.0/vendor-prefixed/matomo/device-detector/regexes/vendorfragments.yml (added)
-
tags/1.2.0/vendor-prefixed/mustangostang (added)
-
tags/1.2.0/vendor-prefixed/mustangostang/spyc (added)
-
tags/1.2.0/vendor-prefixed/mustangostang/spyc/Spyc.php (added)
-
trunk/css/dashboard.min.css (modified) (1 diff)
-
trunk/css/dashboard.scss (modified) (4 diffs)
-
trunk/css/global.min.css (added)
-
trunk/css/global.scss (added)
-
trunk/css/widget.min.css (added)
-
trunk/css/widget.scss (added)
-
trunk/inc/collector.php (modified) (1 diff)
-
trunk/inc/dashboard.php (modified) (10 diffs)
-
trunk/js/dashboard.js (modified) (9 diffs)
-
trunk/js/dashboard.min.js (modified) (1 diff)
-
trunk/js/inc/countries.js (modified) (1 diff)
-
trunk/readme.txt (modified) (2 diffs)
-
trunk/simple-webstats.php (modified) (3 diffs)
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 22 22 position: relative; 23 23 grid-column-end: span 6; 24 background: linear-gradient(#2c3d4e, lighten(#2c3d4e, 5%));25 color: #fff;26 24 padding: 10px; 27 25 border-radius: 5px; … … 32 30 margin: 0 0 10px 0; 33 31 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 }81 32 } 82 33 … … 106 57 min-height: 401px; 107 58 .inner { 108 display: grid;109 grid-template-columns: repeat(6, 1fr);110 59 grid-gap: 20px; 111 60 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 }181 61 } 182 62 .chart { 183 position: relative;184 63 height: 200px; 185 64 } 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 215 65 } 216 66 … … 329 179 } 330 180 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 349 181 } 350 182 -
simple-webstats/trunk/inc/collector.php
r3101173 r3102299 36 36 // set/get UID salt 37 37 $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())) 39 40 { 40 41 $this->uidSalt = bin2hex(random_bytes(8)); 41 42 update_option('swstats_uid_salt', $this->uidSalt); 43 update_option('swstats_uid_salt_expiry', time()+(60*60*24*7)); 42 44 } 43 45 -
simple-webstats/trunk/inc/dashboard.php
r3062605 r3102299 23 23 wp_enqueue_script('chartjs', SWSTATS_URL.'lib/chartjs/chart.umd.min.js', [], false, true); 24 24 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')); 25 26 wp_enqueue_style('swstats_dash', SWSTATS_URL.'css/dashboard.min.css', [], filemtime(SWSTATS_PATH.'css/dashboard.min.css')); 26 27 wp_enqueue_style('freakflags', SWSTATS_URL.'lib/freakflags/freakflags.css', [], filemtime(SWSTATS_PATH.'lib/freakflags/freakflags.css')); … … 40 41 $this->monthFormat = 'F Y'; 41 42 $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>'; 43 62 } 44 63 … … 50 69 // period options 51 70 $periods = array( 71 'last24hours' => __('Last 24 hours', 'simple-webstats'), 52 72 'today' => __('Today', 'simple-webstats'), 53 73 'yesterday' => __('Yesterday', 'simple-webstats'), … … 63 83 // get period option 64 84 $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'; 66 86 67 87 echo '<div class="swstats-dash wrap" data-ajaxurl="'.esc_url(admin_url('admin-ajax.php')).'">'; … … 264 284 $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); 265 285 $visitsResult = $wpdb->get_results($sql); 266 $visits = $this->format_chart_data($visitsResult, $timeBounds );286 $visits = $this->format_chart_data($visitsResult, $timeBounds, $period); 267 287 268 288 // views dataset … … 270 290 $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); 271 291 $viewsResult = $wpdb->get_results($sql); 272 $views = $this->format_chart_data($viewsResult, $timeBounds );292 $views = $this->format_chart_data($viewsResult, $timeBounds, $period); 273 293 274 294 $chartdata = array('granularities' => $timeBounds['chartGranularities'], 'defaultGranularity' => $timeBounds['defaultChartGranularity'], 'visits' => $visits, 'views' => $views, 'visitsLabel' => __('Visits', 'simple-webstats'), 'viewsLabel' => __('Views', 'simple-webstats')); … … 282 302 283 303 // 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) 285 305 { 286 306 $dataSets = array(); … … 306 326 { 307 327 $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; 309 330 if($this->hourFormat == 'H') $labelSuffix = ':00'; 310 331 } … … 462 483 } 463 484 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') { 465 491 $dateTimeStart->setTime(0, 0, 0); 466 492 $dateTimeComparativeStart->modify('-1 day')->setTime(0, 0, 0); … … 554 580 $hours = count($this->get_time_intervals($bounds['start'], $bounds['end'], '+1 hour', 'YmdH')); 555 581 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'); 559 585 if($hours <= 240) $bounds['chartGranularities']['hour'] = __('Hours', 'simple-webstats'); 560 586 561 587 if($years >= 4) $bounds['defaultChartGranularity'] = 'year'; 562 588 elseif($months >= 6) $bounds['defaultChartGranularity'] = 'month'; 563 elseif($days >= 3) $bounds['defaultChartGranularity'] = 'day';589 elseif($days >= 4) $bounds['defaultChartGranularity'] = 'day'; 564 590 else $bounds['defaultChartGranularity'] = 'hour'; 565 591 -
simple-webstats/trunk/js/dashboard.js
r3062605 r3102299 2 2 3 3 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'); 5 5 let viewRequests = Array(viewPanels.length).fill(null); 6 6 … … 93 93 let panelType = viewPanel.dataset.type; 94 94 let isSummaryPanel = (panelType === 'summary') ? true : false; 95 let isWidget = (viewPanel.closest('#swstats-widget')) ? true : false; 95 96 let panelInner = viewPanel.querySelector('.inner'); 96 97 let panelLoading = viewPanel.querySelector('.loading'); … … 103 104 104 105 let data = { 105 nonce: viewPanel.dataset.nonce, 106 period: periodSelect.value 106 nonce: viewPanel.dataset.nonce 107 107 }; 108 if(isWidget) { 109 // default period for widget 110 data['period'] = 'last24hours'; 111 } 112 else { 113 data['period'] = periodSelect.value; 114 } 108 115 if(isSummaryPanel) { 109 116 data['action'] = 'swstats_get_summary_data'; … … 178 185 var bodyCell = document.createElement('div'); 179 186 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]; 182 189 } 183 190 if(index == 0) bodyCell.innerHTML = cell; … … 193 200 // output summary data 194 201 function output_summary_data(summaryPanel, data, chartdata) { 202 let isWidget = (summaryPanel.closest('#swstats-widget')) ? true : false; 195 203 let panelInner = summaryPanel.querySelector('.inner'); 196 204 var output = ''; … … 220 228 221 229 // output chart granularity controls 222 if( Object.keys(chartdata.granularities).length > 1) {230 if(!isWidget && (Object.keys(chartdata.granularities).length > 1)) { 223 231 let granularityControls = document.createElement('div'); 224 232 granularityControls.classList.add('granularity'); … … 283 291 } 284 292 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 285 301 // format numbers for output 286 302 function format_number(num) { … … 325 341 } 326 342 327 // get ajax URL and init343 // init dashboad page 328 344 let dashboard = document.querySelector('.swstats-dash'); 329 345 if(dashboard && dashboard.dataset.ajaxurl) { … … 331 347 init_dashboard(); 332 348 } 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 } 333 365 334 366 })(); -
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)}))}))}})();1 const 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 = {1 const swstats_countries = { 2 2 AF : 'Afghanistan', 3 3 AX : 'Aland Islands', -
simple-webstats/trunk/readme.txt
r3101173 r3102299 5 5 Tested up to: 6.5 6 6 Requires PHP: 7.3 7 Stable tag: 1. 1.07 Stable tag: 1.2.0 8 8 License: GPLv2 or later 9 9 … … 50 50 == Changelog == 51 51 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 52 58 = 1.1.0 = 53 59 -
simple-webstats/trunk/simple-webstats.php
r3101173 r3102299 4 4 * Plugin Name: Simple Webstats 5 5 * Description: Privacy-focused cookie-free web analytics for WordPress. 6 * Version: 1. 1.06 * Version: 1.2.0 7 7 * Requires at least: 4.6 8 8 * Requires PHP: 7.3 … … 20 20 21 21 // config 22 define('SWSTATS_VERSION', '1. 1.0');22 define('SWSTATS_VERSION', '1.2.0'); 23 23 define('SWSTATS_PATH', plugin_dir_path(__FILE__)); 24 24 define('SWSTATS_URL', plugin_dir_url(__FILE__)); … … 48 48 delete_option('swstats_version'); 49 49 delete_option('swstats_uid_salt'); 50 delete_option('swstats_uid_salt_expiry'); 50 51 51 52 // delete user options
Note: See TracChangeset
for help on using the changeset viewer.