From 45d7c4b21d76b2130ae59cd5da05de020d7c3c4e Mon Sep 17 00:00:00 2001 From: David Baldwynn Date: Sat, 28 Oct 2017 02:35:34 -0700 Subject: [PATCH] added support for computing analytics on backend --- app/models/form.server.model.js | 94 +++++++++++++++---- .../edit-submissions-form.client.directive.js | 43 --------- .../edit-submissions-form.client.view.html | 42 ++++----- 3 files changed, 98 insertions(+), 81 deletions(-) diff --git a/app/models/form.server.model.js b/app/models/form.server.model.js index b20d1a9e..e3b60598 100644 --- a/app/models/form.server.model.js +++ b/app/models/form.server.model.js @@ -202,29 +202,59 @@ FormSchema.virtual('analytics.views').get(function () { } }); -FormSchema.virtual('analytics.submissions').get(function () { - return this.submissions.length; -}); +function getDeviceStatistics(visitors){ + var newStatItem = function(){ + return { + visits: 0, + responses: 0, + completion: 0, + average_time: 0, + total_time: 0 + }; + }; -FormSchema.virtual('analytics.conversionRate').get(function () { - if(this.analytics && this.analytics.visitors && this.analytics.visitors.length > 0){ - return this.submissions.length/this.analytics.visitors.length*100; - } else { - return 0; - } -}); + var stats = { + desktop: newStatItem(), + tablet: newStatItem(), + phone: newStatItem(), + other: newStatItem() + }; -FormSchema.virtual('analytics.fields').get(function () { + if(visitors) { + for (var i = 0; i < visitors.length; i++) { + var visitor = visitors[i]; + var deviceType = visitor.deviceType; + + stats[deviceType].visits++; + + if (visitor.isSubmitted) { + stats[deviceType].total_time = stats[deviceType].total_time + visitor.timeElapsed; + stats[deviceType].responses++; + } + + if(stats[deviceType].visits) { + stats[deviceType].completion = 100*(stats[deviceType].responses / stats[deviceType].visits).toFixed(2); + } + + if(stats[deviceType].responses){ + stats[deviceType].average_time = (stats[deviceType].total_time / stats[deviceType].responses).toFixed(0); + } + } + } + return stats; +} + +function getFieldAnalytics(form){ var fieldDropoffs = []; - var visitors = this.analytics.visitors; - var that = this; + var visitors = form.analytics.visitors; + var that = form; - if(this.form_fields.length === 0) { + if(form.form_fields.length === 0) { return null; } - for(var i=0; i 0){ + return numSubmissions.length/form.analytics.visitors.length*100; + } else { + return 0; + } +} + +FormSchema.virtual('formAnalytics').get(function () { + var that = this; + mongoose.model('FormSubmission').find({ form: that._id }) + .select("id") + .lean() + .exec(function(err, results){ + if(err){ + return null; + } + + var submissionCount = results.count; + + return { + fields: getFieldAnalytics(that), + submissions: submissionCount, + conversionRate: getConversionRate(that), + deviceStatistics: getDeviceStatistics(that.analytics.visitors) + } + }); + }); FormSchema.plugin(timeStampPlugin, { diff --git a/public/modules/forms/admin/directives/edit-submissions-form.client.directive.js b/public/modules/forms/admin/directives/edit-submissions-form.client.directive.js index baa7f66b..866226ac 100644 --- a/public/modules/forms/admin/directives/edit-submissions-form.client.directive.js +++ b/public/modules/forms/admin/directives/edit-submissions-form.client.directive.js @@ -62,49 +62,6 @@ angular.module('forms').directive('editSubmissionsFormDirective', ['$rootScope', return (totalTime/numSubmissions).toFixed(0); })(); - $scope.DeviceStatistics = (function(){ - var newStatItem = function(){ - return { - visits: 0, - responses: 0, - completion: 0, - average_time: 0, - total_time: 0 - }; - }; - - var stats = { - desktop: newStatItem(), - tablet: newStatItem(), - phone: newStatItem(), - other: newStatItem() - }; - - if($scope.myform.analytics && $scope.myform.analytics.visitors) { - var visitors = $scope.myform.analytics.visitors; - for (var i = 0; i < visitors.length; i++) { - var visitor = visitors[i]; - var deviceType = visitor.deviceType; - - stats[deviceType].visits++; - - if (visitor.isSubmitted) { - stats[deviceType].total_time = stats[deviceType].total_time + visitor.timeElapsed; - stats[deviceType].responses++; - } - - if(stats[deviceType].visits) { - stats[deviceType].completion = 100*(stats[deviceType].responses / stats[deviceType].visits).toFixed(2); - } - - if(stats[deviceType].responses){ - stats[deviceType].average_time = (stats[deviceType].total_time / stats[deviceType].responses).toFixed(0); - } - } - } - return stats; - })(); - var updateFields = $interval(initController, 1000000); $scope.$on('$destroy', function() { diff --git a/public/modules/forms/admin/views/directiveViews/form/edit-submissions-form.client.view.html b/public/modules/forms/admin/views/directiveViews/form/edit-submissions-form.client.view.html index d33d81d6..8f0c1bf0 100644 --- a/public/modules/forms/admin/views/directiveViews/form/edit-submissions-form.client.view.html +++ b/public/modules/forms/admin/views/directiveViews/form/edit-submissions-form.client.view.html @@ -1,5 +1,5 @@
-
+
{{ 'TOTAL_VIEWS' | translate }} @@ -19,15 +19,15 @@
- {{myform.analytics.visitors.length}} + {{myform.formAnalytics.visitors.length}}
- {{myform.analytics.submissions}} + {{table.rows.length}}
- {{myform.analytics.conversionRate | number:0}}% + {{myform.formAnalytics.conversionRate | number:0}}%
@@ -58,7 +58,7 @@ {{ 'UNIQUE_VISITS' | translate }}
- {{DeviceStatistics.desktop.visits}} + {{myform.formformAnalytics.deviceStatistics.desktop.visits}}
@@ -67,7 +67,7 @@ {{ 'UNIQUE_VISITS' | translate }}
- {{DeviceStatistics.tablet.visits}} + {{myform.formformAnalytics.deviceStatistics.tablet.visits}}
@@ -76,7 +76,7 @@ {{ 'UNIQUE_VISITS' | translate }}
- {{DeviceStatistics.tablet.visits}} + {{myform.formformAnalytics.deviceStatistics.tablet.visits}}
@@ -85,7 +85,7 @@ {{ 'UNIQUE_VISITS' | translate }}
- {{DeviceStatistics.other.visits}} + {{myform.formformAnalytics.deviceStatistics.other.visits}}
@@ -96,7 +96,7 @@ {{ 'RESPONSES' | translate }}
- {{DeviceStatistics.desktop.responses}} + {{myform.formformAnalytics.deviceStatistics.desktop.responses}}
@@ -105,7 +105,7 @@ {{ 'RESPONSES' | translate }}
- {{DeviceStatistics.tablet.responses}} + {{myform.formformAnalytics.deviceStatistics.tablet.responses}}
@@ -114,7 +114,7 @@ {{ 'RESPONSES' | translate }}
- {{DeviceStatistics.phone.responses}} + {{myform.formformAnalytics.deviceStatistics.phone.responses}}
@@ -123,7 +123,7 @@ {{ 'RESPONSES' | translate }}
- {{DeviceStatistics.other.responses}} + {{myform.formformAnalytics.deviceStatistics.other.responses}}
@@ -134,7 +134,7 @@ {{ 'COMPLETION_RATE' | translate }}
- {{DeviceStatistics.desktop.completion}}% + {{myform.formformAnalytics.deviceStatistics.desktop.completion}}%
@@ -143,7 +143,7 @@ {{ 'COMPLETION_RATE' | translate }}
- {{DeviceStatistics.tablet.completion}}% + {{myform.formformAnalytics.deviceStatistics.tablet.completion}}%
@@ -152,7 +152,7 @@ {{ 'COMPLETION_RATE' | translate }}
- {{DeviceStatistics.phone.completion}}% + {{myform.formformAnalytics.deviceStatistics.phone.completion}}%
@@ -161,7 +161,7 @@ {{ 'COMPLETION_RATE' | translate }}
- {{DeviceStatistics.other.completion}}% + {{myform.formformAnalytics.deviceStatistics.other.completion}}%
@@ -172,7 +172,7 @@ {{ 'AVERAGE_TIME_TO_COMPLETE' | translate }}
- {{DeviceStatistics.desktop.average_time | secondsToDateTime | date:'mm:ss'}} + {{myform.formformAnalytics.deviceStatistics.desktop.average_time | secondsToDateTime | date:'mm:ss'}}
@@ -181,7 +181,7 @@ {{ 'AVERAGE_TIME_TO_COMPLETE' | translate }}
- {{DeviceStatistics.tablet.average_time | secondsToDateTime | date:'mm:ss'}} + {{myform.formformAnalytics.deviceStatistics.tablet.average_time | secondsToDateTime | date:'mm:ss'}}
@@ -190,7 +190,7 @@ {{ 'AVERAGE_TIME_TO_COMPLETE' | translate }}
- {{DeviceStatistics.phone.average_time | secondsToDateTime | date:'mm:ss'}} + {{myform.formformAnalytics.deviceStatistics.phone.average_time | secondsToDateTime | date:'mm:ss'}}
@@ -199,7 +199,7 @@ {{ 'AVERAGE_TIME_TO_COMPLETE' | translate }}
- {{DeviceStatistics.other.average_time | secondsToDateTime | date:'mm:ss'}} + {{myform.formformAnalytics.deviceStatistics.other.average_time | secondsToDateTime | date:'mm:ss'}}
@@ -221,7 +221,7 @@ -
+
{{fieldStats.field.title}}