diff --git a/src/app/pages/.DS_Store b/src/app/pages/.DS_Store index 8ee0e85..f0fab09 100644 Binary files a/src/app/pages/.DS_Store and b/src/app/pages/.DS_Store differ diff --git a/src/app/pages/surveys/.DS_Store b/src/app/pages/surveys/.DS_Store index 5008ddf..523a3b4 100644 Binary files a/src/app/pages/surveys/.DS_Store and b/src/app/pages/surveys/.DS_Store differ diff --git a/src/app/pages/surveys/create/.DS_Store b/src/app/pages/surveys/create/.DS_Store new file mode 100644 index 0000000..a232923 Binary files /dev/null and b/src/app/pages/surveys/create/.DS_Store differ diff --git a/src/app/pages/surveys/create/create.html b/src/app/pages/surveys/create/create.html index dfb9d44..4a1d681 100644 --- a/src/app/pages/surveys/create/create.html +++ b/src/app/pages/surveys/create/create.html @@ -7,6 +7,26 @@

+
+ +
+ Survey type : + + + + +
+
+
@@ -44,6 +64,7 @@
- -
- 360 Survey : -
- -
+ + +
- - + +
-
+
-
+
+
+ +
+ +
diff --git a/src/app/pages/surveys/create/widgets/successModal.html b/src/app/pages/surveys/create/widgets/successModal.html new file mode 100644 index 0000000..904a3e0 --- /dev/null +++ b/src/app/pages/surveys/create/widgets/successModal.html @@ -0,0 +1,10 @@ + + diff --git a/src/app/pages/surveys/list/list.controller.js b/src/app/pages/surveys/list/list.controller.js index a16d5a3..7a71a9d 100644 --- a/src/app/pages/surveys/list/list.controller.js +++ b/src/app/pages/surveys/list/list.controller.js @@ -5,7 +5,7 @@ .controller('list', list); /** @ngInject */ - function list( SurveyService, $scope, $rootScope, $log, $state, toastr) { + function list( SurveyService, AnswerService, $scope, $rootScope, $log, $state, toastr, baConfig) { var vm = this; $rootScope.$state = $state; @@ -14,6 +14,7 @@ .list() .then(function (data){ vm.surveys = data; + getSurveyCompletion(); $log.info("Got the survey data",data); }, function (error){ $log.error(error); @@ -61,12 +62,66 @@ } }; + function getSurveyCompletion() { + angular.forEach(vm.surveys, function(survey, key) { + var totalMembers = 0 + var totalAnswers = survey.answers.length + var totalQuestions = survey.elements.length + var completion = 0 + + angular.forEach(survey.list, function(list, key) { + totalMembers = totalMembers + list.members.length + }); + + totalQuestions = survey.type == "s_360" ? totalQuestions * totalMembers : totalQuestions; + + completion = (((totalAnswers) / (totalMembers * totalQuestions))*100).toFixed(0) + + survey.completion = completion; + //console.log('totalAnswers / TOTAL', totalAnswers, totalMembers * totalQuestions); + + }); + + //console.log('getSurveyCompletion', vm.surveys); + } + + function analyzeSurvey(survey) { + var params = {"survey":survey.id} + AnswerService + .analyze(params) + .then(function (data){ + vm.analysis = data; + vm.activeSurvey = survey; + $log.info("Got answers analysis",data); + }, function (error){ + $log.error(error); + }); + } + function activate(){ vm.surveys = []; + vm.activeSurvey = {}; vm.goToCreate = goToCreate; + vm.analyzeSurvey = analyzeSurvey; vm.editSurvey = editSurvey; vm.removeSurvey = removeSurvey; + var layoutColors = baConfig.colors; + vm.doughnutOptions = { + elements: { + arc: { + borderWidth: 0 + } + }, + legend: { + display: true, + position: 'bottom', + labels: { + fontColor: layoutColors.defaultText + } + } + }; + loadSurveys(); } diff --git a/src/app/pages/surveys/list/list.html b/src/app/pages/surveys/list/list.html index db9f0ef..b23e10b 100644 --- a/src/app/pages/surveys/list/list.html +++ b/src/app/pages/surveys/list/list.html @@ -35,12 +35,18 @@ {{ survey.updatedAt | date:'shortDate' }} - {{ survey.responses || 0 }} - {{ survey.status }} + +
+
+ {{survey.completion}}% Complete +
+
+ + - + @@ -50,6 +56,20 @@
+ + +
+ +
+
+
+ +
+ + +
diff --git a/src/app/pages/surveys/list/surveyDetails.html b/src/app/pages/surveys/list/surveyDetails.html new file mode 100644 index 0000000..674a6dc --- /dev/null +++ b/src/app/pages/surveys/list/surveyDetails.html @@ -0,0 +1,40 @@ + + + +
+
+ +
+
+ {{vm.activeSurvey.completion}}% of question answred (Respondents : {{vm.analysis.respondents.length}} of {{vm.analysis.recipents}}) +
+
+
+ +
+ +
+
{{ e.text }}
+
+ + +
+ + +
+ + + +
+
+ +
+
+
+ +
+ + + +
\ No newline at end of file diff --git a/src/app/pages/surveys/survey.service.js b/src/app/pages/surveys/survey.service.js index 95dc084..bf6f5c6 100644 --- a/src/app/pages/surveys/survey.service.js +++ b/src/app/pages/surveys/survey.service.js @@ -32,7 +32,7 @@ function get(id) { var deferred = $q.defer(); - $http.get(endpoint) + $http.get(endpoint + "/" + id) .success(function(data) { deferred.resolve(data); }).error(function(msg, code) { @@ -42,7 +42,7 @@ return deferred.promise; - return $http.get(endpoint, id); + return $http.get(endpoint + "/" + id); } function create(survey) { diff --git a/src/app/pages/surveys/surveys.module.js b/src/app/pages/surveys/surveys.module.js index 1b52c36..6f8211e 100644 --- a/src/app/pages/surveys/surveys.module.js +++ b/src/app/pages/surveys/surveys.module.js @@ -8,7 +8,7 @@ angular.module('BlurAdmin.pages.surveys', [ 'BlurAdmin.pages.surveys.create', 'BlurAdmin.pages.surveys.list', - ]).config(routeConfig); + ]).config(routeConfig).config(chartJsConfig); /** @ngInject */ function routeConfig($stateProvider) { @@ -45,4 +45,52 @@ }); } + function chartJsConfig(ChartJsProvider, baConfigProvider) { + var layoutColors = baConfigProvider.colors; + // Configure all charts + ChartJsProvider.setOptions({ + chartColors: [ + layoutColors.primary, layoutColors.danger, layoutColors.warning, layoutColors.success, layoutColors.info, layoutColors.default, layoutColors.primaryDark, layoutColors.successDark, layoutColors.warningLight, layoutColors.successLight, layoutColors.primaryLight], + responsive: true, + maintainAspectRatio: false, + animation: { + duration: 2500 + }, + scale: { + gridLines: { + color: layoutColors.border + }, + scaleLabel: { + fontColor: layoutColors.defaultText + }, + ticks: { + fontColor: layoutColors.defaultText, + showLabelBackdrop: false + } + } + }); + // Configure all line charts + ChartJsProvider.setOptions('Line', { + datasetFill: false + }); + // Configure all radar charts + ChartJsProvider.setOptions('radar', { + scale: { + pointLabels: { + fontColor: layoutColors.defaultText + }, + ticks: { + maxTicksLimit: 5, + display: false + } + } + }); + // Configure all bar charts + ChartJsProvider.setOptions('bar', { + tooltips: { + enabled: false + } + }); + } + })(); diff --git a/src/app/pages/teams/answer.service.js b/src/app/pages/teams/answer.service.js index 7e2f931..a8369c0 100644 --- a/src/app/pages/teams/answer.service.js +++ b/src/app/pages/teams/answer.service.js @@ -16,7 +16,7 @@ params = params || {}; var deferred = $q.defer(); - $http.get(endpoint) + $http.get(endpoint, { params : params}) .success(function(data) { deferred.resolve(data); }).error(function(msg, code) { @@ -30,33 +30,46 @@ } function create(answer) { - console.log("new Answer Object", answer); - // return $http.post(endpoint, answer); - } - - function put(answer) { - return $http.put(endpoint + "/" + answer.id, answer); + return $http.post(endpoint, answer); } function get(id) { return $http.get(endpoint + "/" + id); } - function edit(answer) { - console.log("edit Answer Object", answer); + function update(answer) { + return $http.put(endpoint + "/"+answer.id, answer); } function remove(id) { return $http.delete(endpoint + "/" + id); } + function analyze(params) { + params = params || {}; + endpoint = endpoint + "/analyze" + + var deferred = $q.defer(); + $http.get(endpoint, { params : params}) + .success(function(data) { + deferred.resolve(data); + }).error(function(msg, code) { + deferred.reject(msg); + }); + + return deferred.promise; + + + return $http.get(endpoint, params); + } + return { list:list, create:create, - edit:edit, + update:update, get:get, - put:put, - remove:remove + remove:remove, + analyze:analyze } } })(); diff --git a/src/app/pages/viewer/ViewerPageCtrl.js b/src/app/pages/viewer/ViewerPageCtrl.js index 07871c0..43b57dc 100644 --- a/src/app/pages/viewer/ViewerPageCtrl.js +++ b/src/app/pages/viewer/ViewerPageCtrl.js @@ -14,56 +14,69 @@ var vm = this; - function loadSurveys() { + function loadSurvey(id) { SurveyService - .list() + .get(id) .then(function (data){ - vm.surveys = data; + vm.survey = data; $log.info("Got the survey data",data); - vm.survey = getSurvey(); //building forms elements - vm.forms = []; - angular.forEach(vm.survey.elements, function(element, key) { - - angular.forEach(vm.survey.list.members, function(member, key) { - if(member._id != vm.activeMemberId) { - vm.forms[member._id] = {}; - //vm.forms[member._id].$element_id = false; - /*var form = []; - form[element._id] = []; - vm.forms.push(form); - var input = []; - input[element._id] = false; - vm.forms[member._id].push(input);*/ - } + + //angular.forEach(vm.survey.elements, function(element, key) { + // console.log("element",element); + angular.forEach(vm.survey.list, function(list, key) { + console.log("list",list); + angular.forEach(list.members, function(member, key) { + //console.log("member",member); + vm.forms[member.id] = {}; + vm.forms[member.id].elements = vm.survey.elements; + vm.forms[member.id].question = {}; + if(member.id != vm.activeMemberId) { + vm.members.push(member); + + } else + vm.askedMember = member; //.push(k + ': ' + member); + }); + vm.members.push(vm.askedMember); + //Thnak You message + vm.members.push({"id": "none", "name" : ": )"}); }); - }); - console.log(vm.survey); - console.log(vm.forms); + // }); + /*console.log("loadSurvey:vm.survey",vm.survey); + console.log("loadSurvey:vm.survey.list.members",vm.survey.list.members); + console.log("loadSurvey:vm.forms",vm.forms);*/ }, function (error){ $log.error(error); }); } - function getSurvey() { - $log.info("getSurvey",$stateParams.survey_id); - return vm.surveys.filter(function(s){ - return s.id == $stateParams.survey_id; - })[0]; - } + function activate(){ - vm.surveys = []; - vm.survey = []; + vm.forms = []; + vm.survey = {}; + vm.members = []; + vm.askedMember = {}; vm.activeMemberId = $stateParams.member_id; - loadSurveys(); + loadSurvey($stateParams.survey_id); console.log(vm.activeMemberId) } + vm.getInitials = function(string) { + var names = string.split(' '), + initials = names[0].substring(0, 1).toUpperCase(); + + if (names.length > 1) { + initials += names[names.length - 1].substring(0, 1).toUpperCase(); + } + //console.log("getInitials", string, initials) + return initials; + }; + vm.test = function(form){ //$scope.submitted = true; alert("Angular is Awesome!!!"); diff --git a/src/app/pages/viewer/viewer.html b/src/app/pages/viewer/viewer.html index 3d25441..ac46a4e 100644 --- a/src/app/pages/viewer/viewer.html +++ b/src/app/pages/viewer/viewer.html @@ -11,13 +11,18 @@
- -
+ + +
+
+

{{ m.name }}

+ +

{{ e.text }}

+
+
+

Congratulations! You have successfully filled the form!

+
+ +
+ + diff --git a/src/app/theme/components/baWizard/baWizard.html b/src/app/theme/components/baWizard/baWizard.html index a8c7c4f..a013604 100644 --- a/src/app/theme/components/baWizard/baWizard.html +++ b/src/app/theme/components/baWizard/baWizard.html @@ -1,7 +1,8 @@
-
- {{t.title}} +
+ {{ $baWizardController.tabNum != $index ? t.title : ''}} +
diff --git a/src/app/theme/components/baWizard/baWizardStep.directive.js b/src/app/theme/components/baWizard/baWizardStep.directive.js index 47438f4..6a7f277 100644 --- a/src/app/theme/components/baWizard/baWizardStep.directive.js +++ b/src/app/theme/components/baWizard/baWizardStep.directive.js @@ -5,7 +5,7 @@ .directive('baWizardStep', baWizardStep); /** @ngInject */ - function baWizardStep($http) { + function baWizardStep($http, AnswerService, $filter) { return { restrict: 'E', transclude: true, @@ -14,7 +14,7 @@ form: '=' }, templateUrl: 'app/theme/components/baWizard/baWizardStep.html', - link: function($scope, $element, $attrs, wizard, AnswerService) { + link: function($scope, $element, $attrs, wizard) { $scope.selected = true; var tab = { @@ -24,7 +24,8 @@ isComplete: isComplete, isAvailiable: isAvailiable, prevTab: undefined, - setPrev: setPrev + setPrev: setPrev, + mid: $attrs.mid }; wizard.addTab(tab); @@ -38,34 +39,94 @@ } function submit() { - var apiBaseUrl = "http://localhost:9000" - var endpoint = apiBaseUrl + "/answers"; + + var elements = angular.fromJson($attrs.elements); + var memberEvaluated = angular.fromJson($attrs.evaluated); + var memberAsked = angular.fromJson($attrs.asked); $scope.form && $scope.form.$setSubmitted(true); if($scope.form && $scope.form.$invalid == false) { - //console.log("inner", $scope.form.innerForm); + console.log("$attrs.elements", elements); + console.log("inner", $scope.form.innerForm); + angular.forEach($scope.form.innerForm, function(val, key) { - if((key.indexOf("_") !== -1) && (key.indexOf("_comment") == -1)) { + + if((key.indexOf("_") !== -1) && (key.indexOf("_comment") == -1) && (key.indexOf("_submitted") == -1) && (key.indexOf("_question") == -1)) { var res = key.split("_"); - //console.log("res", res); + console.log("res", res); //console.log("val", val); var commentKey = key + "_comment"; + var submittedKey = key + "_submitted"; + //console.log("key", key); + //console.log("commentKey", commentKey); + //console.log("submittedKey", submittedKey); + var element = $filter('filter')(elements, {'_id':res[3]}) var answer = { "value" : val.$viewValue, - "comment" : $scope.form.innerForm[commentKey].$viewValue, + "comment" : ($scope.form.innerForm[commentKey]) ? $scope.form.innerForm[commentKey].$viewValue : '', "survey" : res[0], - "memberEvaluated" : res[1], - "memberAsked" : res[2] + "evaluated" : memberEvaluated, + "asked" : memberAsked, + "question": element[0] } - console.log($scope); - //AnswerService.create(answer); - /*$http.post(endpoint, answer).success(function(data) { - console.log(data.data); - //return response.data; - }).error(function(msg, code) { - //deferred.reject(msg); - });*/ + console.log("$attrs",$attrs); + console.log("submit:answer",answer); + if ($scope.form.innerForm[submittedKey].$viewValue) { + answer.id = $scope.form.innerForm[submittedKey].$viewValue; + AnswerService + .update(answer) + .then( + function (data){ + console.log("answer.update",data); + $scope.form.innerForm[submittedKey].$viewValue = data.data.id; + }, + function (error){ + console.log("Error updating the answer"); + } + ); + } else { + //checking if the answer already exist + var params = {"survey":answer.survey, "asked":answer.asked.id, "evaluated":answer.evaluated.id, "question":answer.question._id} + AnswerService + .list(params) + .then( + function (data){ + console.log("answer.check",data); + if(data.length > 0) { + answer.id = data[0].id; + AnswerService + .update(answer) + .then( + function (data){ + console.log("answer.update",data); + $scope.form.innerForm[submittedKey].$viewValue = data.data.id; + }, + function (error){ + console.log("Error updating the answer"); + } + ); + } else + AnswerService + .create(answer) + .then( + function (data){ + console.log("answer.create",data); + $scope.form.innerForm[submittedKey].$viewValue = data.data.id; + }, + function (error){ + console.log("Error creating the answer"); + } + ); + + }, + function (error){ + console.log("Error getting the answer"); + } + ); + + } + } }) diff --git a/src/assets/pictures/none.jpeg b/src/assets/pictures/none.jpeg new file mode 100644 index 0000000..19cd0d4 Binary files /dev/null and b/src/assets/pictures/none.jpeg differ diff --git a/src/sass/theme/_custom.scss b/src/sass/theme/_custom.scss index 84f7c36..b900768 100644 --- a/src/sass/theme/_custom.scss +++ b/src/sass/theme/_custom.scss @@ -6,12 +6,12 @@ } .roll-in-blurred-right { - -webkit-animation: roll-in-blurred-right 0.65s cubic-bezier(0.230, 1.000, 0.320, 1.000) 1s both; - animation: roll-in-blurred-right 0.65s cubic-bezier(0.230, 1.000, 0.320, 1.000) 1s both; + -webkit-animation: roll-in-blurred-right 0.65s cubic-bezier(0.230, 1.000, 0.320, 1.000) 1500ms both; + animation: roll-in-blurred-right 0.65s cubic-bezier(0.230, 1.000, 0.320, 1.000) 1500ms both; } .roll-in-blurred-left { - -webkit-animation: roll-in-blurred-left 0.65s cubic-bezier(0.230, 1.000, 0.320, 1.000) both; - animation: roll-in-blurred-left 0.65s cubic-bezier(0.230, 1.000, 0.320, 1.000) both; + -webkit-animation: roll-in-blurred-left 0.65s cubic-bezier(0.230, 1.000, 0.320, 1.000) 1500ms both; + animation: roll-in-blurred-left 0.65s cubic-bezier(0.230, 1.000, 0.320, 1.000) 1500ms both; } .slide-out-blurred-left { -webkit-animation: slide-out-blurred-left 0.45s cubic-bezier(0.755, 0.050, 0.855, 0.060) both; @@ -21,6 +21,10 @@ -webkit-animation: slide-out-blurred-right 0.45s cubic-bezier(0.755, 0.050, 0.855, 0.060) both; animation: slide-out-blurred-right 0.45s cubic-bezier(0.755, 0.050, 0.855, 0.060) both; } +.heartbeat { + -webkit-animation: heartbeat 1.5s ease-in-out infinite both; + animation: heartbeat 1.5s ease-in-out infinite both; +} @-webkit-keyframes roll-in-blurred-right { 0% { @@ -175,4 +179,75 @@ } +@-webkit-keyframes heartbeat { + from { + -webkit-transform: scale(1); + transform: scale(1); + -webkit-transform-origin: center center; + transform-origin: center center; + -webkit-animation-timing-function: ease-out; + animation-timing-function: ease-out; + } + 10% { + -webkit-transform: scale(0.91); + transform: scale(0.91); + -webkit-animation-timing-function: ease-in; + animation-timing-function: ease-in; + } + 17% { + -webkit-transform: scale(0.98); + transform: scale(0.98); + -webkit-animation-timing-function: ease-out; + animation-timing-function: ease-out; + } + 33% { + -webkit-transform: scale(0.87); + transform: scale(0.87); + -webkit-animation-timing-function: ease-in; + animation-timing-function: ease-in; + } + 45% { + -webkit-transform: scale(1); + transform: scale(1); + -webkit-animation-timing-function: ease-out; + animation-timing-function: ease-out; + } +} +@keyframes heartbeat { + from { + -webkit-transform: scale(1); + transform: scale(1); + -webkit-transform-origin: center center; + transform-origin: center center; + -webkit-animation-timing-function: ease-out; + animation-timing-function: ease-out; + } + 10% { + -webkit-transform: scale(0.91); + transform: scale(0.91); + -webkit-animation-timing-function: ease-in; + animation-timing-function: ease-in; + } + 17% { + -webkit-transform: scale(0.98); + transform: scale(0.98); + -webkit-animation-timing-function: ease-out; + animation-timing-function: ease-out; + } + 33% { + -webkit-transform: scale(0.87); + transform: scale(0.87); + -webkit-animation-timing-function: ease-in; + animation-timing-function: ease-in; + } + 45% { + -webkit-transform: scale(1); + transform: scale(1); + -webkit-animation-timing-function: ease-out; + animation-timing-function: ease-out; + } +} + + + diff --git a/src/sass/theme/_layout.scss b/src/sass/theme/_layout.scss index 2d1544d..23e15ae 100644 --- a/src/sass/theme/_layout.scss +++ b/src/sass/theme/_layout.scss @@ -278,6 +278,12 @@ a { margin-right: 20px; } +#surveys #survey-sending .compose-container { + background-color: white; +} +#surveys #survey-sending .compose-footer { + background-color: white; +} @@ -333,4 +339,29 @@ a { .bootstrap .autocomplete .suggestion-item.selected em { color: #262626; background-color: #ffff00; +} + +.ba-wizard-navigation{ +display: inline-block !important; +color: rgb(255, 255, 255); background-color: #60afdd; +display: inline-block; font-family: Arial,"Helvetica Neue",Helvetica,sans-serif; +font-size: 36px !important; border-radius: 80px; width: 80px; height: 80px; line-height: 80px !important; margin: 3px; text-align: center; +} + +.ba-wizard-navigation-container { + padding: 0px 0 !important; +} +.ba-wizard-navigation.active{ +background-color: white; +} +.ba-wizard-navigation .little-human-picture { + border-radius: 80px; width: 80px; height: 80px;margin-top: -5px; +} + +.ng-invalid.form-control { + border: 1px solid #ed7878; +} + +#surveys .progress{ + margin: 10px; } \ No newline at end of file