'use strict'; angular.module('forms').directive('editSubmissionsFormDirective', ['$rootScope', '$http', 'Forms', '$stateParams', '$interval', function ($rootScope, $http, Forms, $stateParams, $interval) { return { templateUrl: 'modules/forms/admin/views/directiveViews/form/edit-submissions-form.client.view.html', restrict: 'E', scope: { user:'=', myform: '=' }, controller: function($scope){ $scope.table = { masterChecker: false, rows: [] }; $scope.analyticsData = { deviceStatistics: [], globalStatistics: [] }; $scope.deletionInProgress = false; $scope.waitingForDeletion = false; //Waits until deletionInProgress is false before running getSubmissions $scope.$watch("deletionInProgress",function(newVal, oldVal){ if(newVal === oldVal) return; if(newVal === false && $scope.waitingForDeletion) { $scope.getSubmissions(); $scope.waitingForDeletion = false; } }); $scope.handleSubmissionsRefresh = function(){ if(!$scope.deletionInProgress) { $scope.getSubmissions(); } else { $scope.waitingForDeletion = true; } }; $scope.getSubmissions = function(cb){ $http({ method: 'GET', url: '/forms/'+$scope.myform._id+'/submissions' }).then(function successCallback(response) { var defaultFormFields = _.cloneDeep($scope.myform.form_fields); var submissions = response.data || []; //Iterate through form's submissions for(var i = 0; i < submissions.length; i++){ for(var x = 0; x < submissions[i].form_fields.length; x++){ if(submissions[i].form_fields[x].fieldType === 'dropdown'){ submissions[i].form_fields[x].fieldValue = submissions[i].form_fields[x].fieldValue.option_value; } } submissions[i].selected = false; } $scope.table.rows = submissions; if(cb && typeof cb === 'function'){ cb(); } }, function errorCallback(err){ console.error(err); if(cb && typeof cb === 'function'){ cb(err); } }); }; $scope.getVisitors = function(){ $http({ method: 'GET', url: '/forms/'+$scope.myform._id+'/visitors' }).then(function successCallback(response) { var data = response.data || []; $scope.analyticsData = data[0]; $scope.analyticsData.globalStatistics = $scope.analyticsData.globalStatistics[0]; $scope.analyticsData.deviceStatistics = formatDeviceStatistics($scope.analyticsData.deviceStatistics); }); }; $scope.handleSubmissionsRefresh(); $scope.getVisitors(); //Fetch submissions and visitor data every 1.67 min var updateSubmissions = $interval($scope.handleSubmissionsRefresh, 100000); var updateVisitors = $interval($scope.getVisitors, 1000000); //Prevent $intervals from running after directive is destroyed $scope.$on('$destroy', function() { if (updateSubmissions) { $interval.cancel($scope.updateSubmissions); } if (updateVisitors) { $interval.cancel($scope.updateVisitors); } }); /* ** Analytics Functions */ var formatDeviceStatistics = function(deviceStatData){ var newStatItem = function(){ return { visits: 0, responses: 0, conversion_rate: 0, average_time: 0, total_time: 0 }; }; var stats = { desktop: newStatItem(), tablet: newStatItem(), phone: newStatItem(), other: newStatItem() }; if(deviceStatData.length){ for(var i=0; i