From 64dd28d885931564fba46cda6a8bbeb266a88a98 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?R=C3=A9gis=20Hanol?= Date: Tue, 4 Aug 2015 18:23:56 +0200 Subject: [PATCH] FIX: time to first response metric --- .../javascripts/admin/models/report.js.es6 | 155 ++++++++---------- test/javascripts/models/report-test.js.es6 | 5 +- 2 files changed, 75 insertions(+), 85 deletions(-) diff --git a/app/assets/javascripts/admin/models/report.js.es6 b/app/assets/javascripts/admin/models/report.js.es6 index ebb63486d..1ce48a144 100644 --- a/app/assets/javascripts/admin/models/report.js.es6 +++ b/app/assets/javascripts/admin/models/report.js.es6 @@ -1,14 +1,12 @@ import round from "discourse/lib/round"; const Report = Discourse.Model.extend({ - reportUrl: function() { - return("/admin/reports/" + this.get('type')); - }.property('type'), + reportUrl: Discourse.computed.fmt("type", "/admin/reports/%@"), valueAt(numDaysAgo) { if (this.data) { - var wantedDate = moment().subtract(numDaysAgo, 'days').format('YYYY-MM-DD'); - var item = this.data.find( function(d) { return d.x === wantedDate; } ); + const wantedDate = moment().subtract(numDaysAgo, "days").format("YYYY-MM-DD"); + const item = this.data.find(d => d.x === wantedDate); if (item) { return item.y; } @@ -16,128 +14,117 @@ const Report = Discourse.Model.extend({ return 0; }, - sumDays(startDaysAgo, endDaysAgo) { + valueFor(startDaysAgo, endDaysAgo) { if (this.data) { - var earliestDate = moment().subtract(endDaysAgo, 'days').startOf('day'); - var latestDate = moment().subtract(startDaysAgo, 'days').startOf('day'); - var d, sum = 0; - _.each(this.data,function(datum){ + const earliestDate = moment().subtract(endDaysAgo, "days").startOf("day"); + const latestDate = moment().subtract(startDaysAgo, "days").startOf("day"); + var d, sum = 0, count = 0; + _.each(this.data, datum => { d = moment(datum.x); - if(d >= earliestDate && d <= latestDate) { + if (d >= earliestDate && d <= latestDate) { sum += datum.y; + count++; } }); + if (this.get("method") === "average") { sum /= count; } return round(sum, -2); } }, - todayCount: function() { - return this.valueAt(0); - }.property('data'), + todayCount: function() { return this.valueAt(0); }.property("data"), + yesterdayCount: function() { return this.valueAt(1); }.property("data"), + sevenDaysAgoCount: function() { return this.valueAt(7); }.property("data"), + thirtyDaysAgoCount: function() { return this.valueAt(30); }.property("data"), - yesterdayCount: function() { - return this.valueAt(1); - }.property('data'), - - lastSevenDaysCount: function() { - return this.sumDays(1,7); - }.property('data'), - - lastThirtyDaysCount: function() { - return this.sumDays(1,30); - }.property('data'), - - sevenDaysAgoCount: function() { - return this.valueAt(7); - }.property('data'), - - thirtyDaysAgoCount: function() { - return this.valueAt(30); - }.property('data'), + lastSevenDaysCount: function() { return this.valueFor(1, 7); }.property("data"), + lastThirtyDaysCount: function() { return this.valueFor(1, 30); }.property("data"), yesterdayTrend: function() { - var yesterdayVal = this.valueAt(1); - var twoDaysAgoVal = this.valueAt(2); - if ( yesterdayVal > twoDaysAgoVal ) { - return 'trending-up'; - } else if ( yesterdayVal < twoDaysAgoVal ) { - return 'trending-down'; + const yesterdayVal = this.valueAt(1); + const twoDaysAgoVal = this.valueAt(2); + if (yesterdayVal > twoDaysAgoVal) { + return "trending-up"; + } else if (yesterdayVal < twoDaysAgoVal) { + return "trending-down"; } else { - return 'no-change'; + return "no-change"; } - }.property('data'), + }.property("data"), sevenDayTrend: function() { - var currentPeriod = this.sumDays(1,7); - var prevPeriod = this.sumDays(8,14); - if ( currentPeriod > prevPeriod ) { - return 'trending-up'; - } else if ( currentPeriod < prevPeriod ) { - return 'trending-down'; + const currentPeriod = this.valueFor(1, 7); + const prevPeriod = this.valueFor(8, 14); + if (currentPeriod > prevPeriod) { + return "trending-up"; + } else if (currentPeriod < prevPeriod) { + return "trending-down"; } else { - return 'no-change'; + return "no-change"; } - }.property('data'), + }.property("data"), thirtyDayTrend: function() { - if( this.get('prev30Days') ) { - var currentPeriod = this.sumDays(1,30); - if( currentPeriod > this.get('prev30Days') ) { - return 'trending-up'; - } else if ( currentPeriod < this.get('prev30Days') ) { - return 'trending-down'; + if (this.get("prev30Days")) { + const currentPeriod = this.valueFor(1, 30); + if (currentPeriod > this.get("prev30Days")) { + return "trending-up"; + } else if (currentPeriod < this.get("prev30Days")) { + return "trending-down"; } } - return 'no-change'; - }.property('data', 'prev30Days'), + return "no-change"; + }.property("data", "prev30Days"), icon: function() { - switch( this.get('type') ) { - case 'flags': - return 'flag'; - case 'likes': - return 'heart'; - default: - return null; + switch (this.get("type")) { + case "flags": return "flag"; + case "likes": return "heart"; + default: return null; } - }.property('type'), + }.property("type"), + + method: function() { + if (this.get("type") === "time_to_first_response") { + return "average"; + } else { + return "sum"; + } + }.property("type"), percentChangeString(val1, val2) { - var val = ((val1 - val2) / val2) * 100; - if( isNaN(val) || !isFinite(val) ) { + const val = ((val1 - val2) / val2) * 100; + if (isNaN(val) || !isFinite(val)) { return null; - } else if( val > 0 ) { - return '+' + val.toFixed(0) + '%'; + } else if (val > 0) { + return "+" + val.toFixed(0) + "%"; } else { - return val.toFixed(0) + '%'; + return val.toFixed(0) + "%"; } }, changeTitle(val1, val2, prevPeriodString) { - var title = ''; - var percentChange = this.percentChangeString(val1, val2); - if( percentChange ) { - title += percentChange + ' change. '; - } - title += 'Was ' + val2 + ' ' + prevPeriodString + '.'; + const percentChange = this.percentChangeString(val1, val2); + var title = ""; + if (percentChange) { title += percentChange + " change. "; } + title += "Was " + val2 + " " + prevPeriodString + "."; return title; }, yesterdayCountTitle: function() { - return this.changeTitle( this.valueAt(1), this.valueAt(2),'two days ago'); - }.property('data'), + return this.changeTitle(this.valueAt(1), this.valueAt(2), "two days ago"); + }.property("data"), sevenDayCountTitle: function() { - return this.changeTitle( this.sumDays(1,7), this.sumDays(8,14), 'two weeks ago'); - }.property('data'), + return this.changeTitle(this.valueFor(1, 7), this.valueFor(8, 14), "two weeks ago"); + }.property("data"), thirtyDayCountTitle: function() { - return this.changeTitle( this.sumDays(1,30), this.get('prev30Days'), 'in the previous 30 day period'); - }.property('data'), + return this.changeTitle(this.valueFor(1, 30), this.get("prev30Days"), "in the previous 30 day period"); + }.property("data"), dataReversed: function() { - return this.get('data').toArray().reverse(); - }.property('data') + return this.get("data").toArray().reverse(); + }.property("data") }); diff --git a/test/javascripts/models/report-test.js.es6 b/test/javascripts/models/report-test.js.es6 index 7ac9e2c9b..f66a84bfa 100644 --- a/test/javascripts/models/report-test.js.es6 +++ b/test/javascripts/models/report-test.js.es6 @@ -14,8 +14,11 @@ test("counts", function() { equal(report.get('todayCount'), 5); equal(report.get('yesterdayCount'), 4); - equal(report.sumDays(2, 4), 6, "adds the values for the given range of days, inclusive"); + equal(report.valueFor(2, 4), 6, "adds the values for the given range of days, inclusive"); equal(report.get('lastSevenDaysCount'), 307, "sums 7 days excluding today"); + + report.set("method", "average"); + equal(report.valueFor(2, 4), 2, "averages the values for the given range of days"); }); test("percentChangeString", function() {