Skip to content

Commit

Permalink
Merge branch 'pageviews-minutes' into staging
Browse files Browse the repository at this point in the history
Conflicts:
	karma.conf.js
  • Loading branch information
milafrerichs committed Aug 19, 2015
2 parents 2a61ffd + 577dead commit 8f4d6aa
Show file tree
Hide file tree
Showing 5 changed files with 4,328 additions and 99 deletions.
2 changes: 2 additions & 0 deletions karma.conf.js
Expand Up @@ -7,6 +7,8 @@ module.exports = function(config) {
'public/javascripts/vendor/raphael-min.js',
'public/javascripts/vendor/morris.min.js',
'public/javascripts/helpers/helper.js',
'public/javascripts/vendor/handlebars-v3.0.3.js',
'public/javascripts/landing-pages.js',
'public/javascripts/traffic.js',
'tests/**/*Spec.js',
'tests/fixtures/**/*'
Expand Down
7 changes: 4 additions & 3 deletions public/index.html
Expand Up @@ -66,6 +66,7 @@ <h2 class="brick-heading">Most popular pages</h2>
<script src="https://cdnjs.cloudflare.com/ajax/libs/raphael/2.1.4/raphael-min.js"></script>
<script src="//cdnjs.cloudflare.com/ajax/libs/morris.js/0.5.1/morris.min.js"></script>
<script src="javascripts/vendor/mustache.js"></script>
<script src="javascripts/vendor/handlebars-v3.0.3.js"></script>
<script src="javascripts/vendor/pretty.js"></script>
<script src="javascripts/vendor/bezier.js"></script>

Expand Down Expand Up @@ -118,19 +119,19 @@ <h2 class="brick-heading">Most popular pages</h2>
</li>
</script>

<script type="template" id="landing-pages-item">
<script type="template" id="landing-pages-items">
{{#each pages}}
<li>
<div>
{{#has_url}}<a href="http://{{ url }}" target="_blank">{{/has_url}}
{{ term }}
{{#has_url}}</a>{{/has_url}}

{{#has_source}}
<em>via: {{ source }}</em>
{{/has_source}}
</div>
</li>
{{/each}}
</script>

</body>
</html>
139 changes: 43 additions & 96 deletions public/javascripts/landing-pages.js
Expand Up @@ -5,21 +5,15 @@

var landing = {
terms: [],
urls: [],
newTerms: [],
newURLs: [],
newSources: [],
el: false,
nextRefresh: 0,
limit: 10,

endpoint: function(profileId){
endpoint: function(){
return "/realtime?"
+ "ids=ga:"+matrix.settings.profileId+"&"
+ "metrics=ga:activeVisitors&"
+ "dimensions=ga:pageTitle,ga:pagePath,rt:source&"
+ "metrics=rt:pageViews&"
+ "dimensions=ga:pageTitle,ga:pagePath,rt:source,rt:minutesAgo&"
/*+ "filters="+ encodeURIComponent("ga:pagePath==/search") +"&"*/
+ "sort=-ga:activeVisitors&"
+ "sort=rt:minutesAgo&"
+ "max-results=10000";
},
safeTerm: function(term){
Expand All @@ -42,107 +36,60 @@
return true;
},
addTerm: function(term, count, url, source){

var i, _i;
for(i=0, _i=landing.terms.length; i<_i; i++){
if(landing.terms[i].term === term){
landing.terms[i].nextTick = count;
return true;
}
}
landing.terms.push({
term: term,
total: 0,
nextTick: count,
currentTick: 0,
url: url,
source: source
});
},
zeroNextTicks: function(){
var i, _i, newTerms = [];
for(i=0, _i=landing.terms.length; i<_i; i++){
landing.terms[i].nextTick = 0;
var i;
for(i=0;i<count;i++) {
landing.terms.push({
term: term,
total: count,
url: url,
source: source,
has_url: !!url,
has_source: !!source && (source != "(not set)")
});
}
},
addNextTickValues: function(data){

var i, _i, term, url, source;
parseData: function(data) {
var i, _i, term, url, source, minutesAgo,
termColumn = 0, urlColumn = 1, sourceColumn = 2,
minutesAgoColumn = 3, countColumn = 4, maxMinutes = 2;
for(i=0,_i=data.rows.length; i<_i; i++){
term = data.rows[i][0].split(' - ');
url = data.rows[i][1];
source = data.rows[i][2];
if(term[0] !== 'Search' && landing.safeTerm(term[0])){
landing.addTerm(term[0], root.parseInt(data.rows[i][3], 10), url, source);
}

}
},
addTimeIndexValues: function(){
var i, _i, j, _j, term, time, newPeople, nonZeroTerms = [];
for(i=0, _i=landing.terms.length; i<_i; i++){
term = landing.terms[i];
newPeople = term.currentTick < term.nextTick ? term.nextTick - term.currentTick : 0;
term.total = term.total + newPeople;
term.currentTick = term.nextTick;
if(newPeople > 0){
for(j=0,_j=newPeople; j<_j; j++){
landing.newTerms.push(term.term);
landing.newURLs.push(term.url);
landing.newSources.push(term.source);
term = data.rows[i][termColumn].split(/ \u2013|\u2014 /);
url = data.rows[i][urlColumn];
source = data.rows[i][sourceColumn];
minutesAgo = root.parseInt(data.rows[i][minutesAgoColumn]);
if(minutesAgo < maxMinutes) {
if(term[0] !== 'Search' && landing.safeTerm(term[0])){
landing.addTerm(term[0], root.parseInt(data.rows[i][countColumn], 10), url, source);
}
}
if(term.currentTick > 0){
nonZeroTerms.push(term);
}else {
break;
}
}
//landing.newTerms.sort(function(){ return Math.floor((Math.random() * 3) - 1) });
landing.terms = nonZeroTerms;
},
parseResponse: function(data){
var term, i, _i;

landing.zeroNextTicks();
landing.addNextTickValues(data);
landing.addTimeIndexValues();
},
displayResults: function(){
var term = landing.newTerms.pop();
var url = landing.newURLs.pop();
var source = landing.newSources.pop();
var el = landing.el;
if(term){
var context = {
term: term,
has_url: !!url,
url: url,
has_source: !!source && (source != "(not set)"),
source: source
}

var tempList = el.ol().template("landing-pages-item", context);
root.matrix.manager.animateInto(tempList.firstElementChild, el,
landing.limit);
setTimeout(landing.displayResults,
(landing.nextRefresh - Date.now())/landing.newTerms.length);
} else {
setTimeout(landing.displayResults, 5000);
parseResponse: function(error, data){
if(error) { return -1; }
if(data.hasOwnProperty('rows')) {
landing.terms = [];
landing.parseData(data);
landing.refreshResults();
}else {
return -1;
}
},
refreshResults: function() {
var html = landing.compiledTemplate({pages: landing.terms });
landing.el.innerHTML = html + landing.el.innerHTML;
},
init: function(){
var source;
landing.el = document.getElementById('search');
source = document.getElementById("landing-pages-items");
landing.compiledTemplate = Handlebars.compile(source.innerHTML);
landing.reload();
landing.displayResults();
window.setInterval(landing.reload, 60e3);
document.addEventListener(
"visibilitychange",
function() { root.matrix.manager.positionFixups(landing); },
false);
},
reload: function(){
var endpoint = landing.endpoint(root.matrix.settings.profileId);
landing.nextRefresh = Date.now() + 60e3;
d3.json(endpoint, landing.parseResponse);
d3.json(landing.endpoint(), landing.parseResponse);
}
};

Expand Down

0 comments on commit 8f4d6aa

Please sign in to comment.