From be628ea0ec60279e4f5c296947c739baf0ff0495 Mon Sep 17 00:00:00 2001 From: Youssef ABIDI Date: Tue, 26 Sep 2017 13:08:41 +0100 Subject: [PATCH] fixes --- src/app/pages/.DS_Store | Bin 6148 -> 6148 bytes src/app/pages/surveys/.DS_Store | Bin 6148 -> 6148 bytes src/app/pages/surveys/create/.DS_Store | Bin 0 -> 6148 bytes src/app/pages/surveys/create/create.html | 36 +++++-- src/app/pages/surveys/create/create.module.js | 41 +++++--- src/app/pages/surveys/create/createTabCtrl.js | 77 ++++++++++---- .../surveys/create/widgets/multiple.html | 14 ++- .../surveys/create/widgets/successModal.html | 10 ++ src/app/pages/surveys/list/list.controller.js | 57 +++++++++- src/app/pages/surveys/list/list.html | 26 ++++- src/app/pages/surveys/list/surveyDetails.html | 40 +++++++ src/app/pages/surveys/survey.service.js | 4 +- src/app/pages/surveys/surveys.module.js | 50 ++++++++- src/app/pages/teams/answer.service.js | 37 ++++--- src/app/pages/viewer/ViewerPageCtrl.js | 73 +++++++------ src/app/pages/viewer/viewer.html | 17 ++- .../theme/components/baWizard/baWizard.html | 5 +- .../baWizard/baWizardStep.directive.js | 99 ++++++++++++++---- src/assets/pictures/none.jpeg | Bin 0 -> 7773 bytes src/sass/theme/_custom.scss | 83 ++++++++++++++- src/sass/theme/_layout.scss | 31 ++++++ 21 files changed, 580 insertions(+), 120 deletions(-) create mode 100644 src/app/pages/surveys/create/.DS_Store create mode 100644 src/app/pages/surveys/create/widgets/successModal.html create mode 100644 src/app/pages/surveys/list/surveyDetails.html create mode 100644 src/assets/pictures/none.jpeg diff --git a/src/app/pages/.DS_Store b/src/app/pages/.DS_Store index 8ee0e853dd7087c80cd6e90a20a8fad338440809..f0fab09fbd8851eddeb43016df052a5e0ccbeb7c 100644 GIT binary patch delta 314 zcmZoMXfc=|#>B)qu~2NHo}wrR0|Nsi1A_nqLotIMLoP!;LkdIb#)r!p>p?R73ag=md)%O{2ag_+4%4~^JIPzLjjQK4L}T}K}?3t0U}$N0r&?^+5i9m delta 88 zcmZoMXfc=|#>CJ*u~2NHo}wr-0|Nsi1A_nqLn=chLvc!Ra!ykI#6opO=E)UIa+B{d sschC`zR9vVfH{F_Gdl-A2TQz)` zVCL=4&dhFJ!fqCTjJES@U;v;`RZLE4j);z{b|i_O9#MRa4f4C9oK1^z+KD#DZ)8B< zT@N#?k>d%?_opAlEpQ13mw5 zzQ6xBldNY97z6)`0ZGS`@raKU&(_Yv=~?Tjk5mX@i(W TtOL?Ru^$0XgBfGsM;Z78SJzmv delta 70 zcmZoMXfc=|#>AjHu~2NHo+1YW5HK<@2yAv_KE|>+fcX{EW_AvK4xj>{$am(+{342+ UKzW7)kiy9(Jj$D6L{=~Z044qo@Bjb+ diff --git a/src/app/pages/surveys/create/.DS_Store b/src/app/pages/surveys/create/.DS_Store new file mode 100644 index 0000000000000000000000000000000000000000..a2329238c1b1e736a18874154e4d77fff216c6e6 GIT binary patch literal 6148 zcmeHK-D(p-6h70&cGEPl7ZnOB?4@8S5mS2`(pFFeg9+({mAKnonvv~p*_|Ym5XhCc zUicV3fDfSf13rLw?ayQAH$Op>Xzvs&bKuN(GIPE&yI+`@9U@}&UU;3zB_andv9N;X z7beH0&)I_MSpqUuLr_GU)Fna3bJ@1TDqt1(*A$Rzw?v1OVdeT*w?Eczd^=7LgE$S4 zA-9KH@T=dHA(DO5tYb<4Wg4La`HPMQdxCsC&A=^6+7 zJPFf5J?$l7e(-bQj(f3@MSV~keiF5L&I2BEajJ@%L=`uD(Zytr`?Tm3JMQ{$Sl!y% z@T%47Xu}(BZ&wiCxH%d*#iDcN+MRZA`sCU37cXDEe)IO-r_Wy?5{zNqv0$&l# z$lPycNt`A}7@4pp*%r^40_G2NO6Tmk?c-VntO9>t0l7bTaEUd8V~uL-K%=ezzyi9J zA(kHtlH(by860cG2#jeeP*a(?VlYidzi0Al2FDsTotU|NFf%hVHx#C3M}1GF6RT;o ztyRD(Fs;C%{^`o|fA9DA|7nu_Wfiar{8tLF!ftc7j#n~g>)gx9v(|$@f=iQmV~vV} k#vI2gkVo-4Tp7kZ831br#~RTCvmXLV2HRK#{;C4s0nWs&rT_o{ literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..19cd0d4d663b146918faac4f4c16c321d1af0261 GIT binary patch literal 7773 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 Y+)rd