finishing reports

pull/348/head
Youssef ABIDI 2017-10-02 10:28:42 +01:00
parent be628ea0ec
commit 59c2f1e907
13 changed files with 766 additions and 83 deletions

View File

@ -30,7 +30,22 @@
});
}
};
});
})
.directive('enforceMaxTags', function() {
return {
require: 'ngModel',
link: function(scope, element, attrs, ngCtrl) {
var maxTags = attrs.maxTags ? parseInt(attrs.maxTags, '10') : null;
ngCtrl.$parsers.push(function(value) {
if (value && maxTags && value.length > maxTags) {
value.splice(value.length - 1, 1);
}
return value;
});
}
};
});
/** @ngInject */
function CreateTabCtrl(SurveyService, ListService,MemberService, $scope, $http, $compile, $timeout, $stateParams, $log, toastr, $uibModal, $state) {
@ -59,7 +74,7 @@
$scope.panelFoldToggle = function(index) {
$scope.survey.elements[index].isUnfolded = !$scope.survey.elements[index].isUnfolded;
console.log($scope.survey.elements[index].isUnfolded);
console.log("panelFoldToggle index isUnfolded $scope.survey.elements", index, $scope.survey.elements[index].isUnfolded, $scope.survey.elements);
};
$scope.getTheFoldingClass = function() {
@ -80,7 +95,7 @@
};
$scope.createEmptyElement = function(type,orderNo){
var item = {
var item = {
id: null,
orderNo: 1,
value: null
@ -95,12 +110,29 @@
isUnfolded: false,
comment: false,
commentLabel: '',
tags:[],
tagsJoined:'',
tag:'',
//tagsJoined:'',
items: (type == 'multiple') ? [item] : [],
};
}
$scope.copyElement = function(index){
//elem.id = null
var originalElem = $scope.survey.elements[index]
var newElem = $scope.createEmptyElement(originalElem.type, $scope.survey.elements.length + 1)
newElem.isUnfolded = false
newElem.text = originalElem.text
newElem.comment = originalElem.comment
newElem.commentLabel = originalElem.commentLabel
newElem.tag = originalElem.tag
newElem.items = originalElem.items
//console.log("$scope.survey.elements", $scope.survey.elements)
$scope.survey.elements.push(newElem);
$scope.updateBuilder();
console.log("$scope.survey.elements", $scope.survey.elements)
}
$scope.addNewItem=function(index){
var item = {
@ -288,6 +320,21 @@
$scope.loadSurvey($stateParams.survey_id);
}
$scope.loadLists();
$scope.tags = [
"Share of expertise with the company" ,
"Acceptable work demands" ,
"Good relations with management" ,
"Team work" ,
"Happiness",
"Innovation",
"Leadership",
"Supportiveness",
"Determination",
"Trust",
"Spirituality / my life",
"Environnement respect"
];
}
$scope.activate();

View File

@ -2,7 +2,7 @@
<div ng-repeat="element in survey.elements" id="q-{{$index}}" class="panel panel-default bootstrap-panel new-question-options-container">
<div ng-repeat="element in survey.elements track by $index" id="q-{{$index}}" class="panel panel-default bootstrap-panel new-question-options-container">
<div class="panel-heading">
<h4 class="panel-title pull-left">Question {{$index+1}}</h4>
<div class="btn-group pull-right">
@ -10,7 +10,7 @@
<button type="button" class="btn btn-default btn-icon" ng-click="panelFoldToggle($index)"><i class="" ng-class="getTheFoldingClass()"></i></button>
<button type="button" class="btn btn-default btn-icon"><i class="fa fa-chevron-down"></i></button>
<button type="button" class="btn btn-default btn-icon"><i class="fa fa-chevron-up"></i></button>
<button type="button" class="btn btn-default btn-icon"><i class="fa fa-pencil-square-o"></i></button>
<button type="button" class="btn btn-default btn-icon" ng-click="copyElement($index)"><i class="fa fa-pencil-square-o"></i></button>
<button type="button" class="btn btn-default btn-icon" ng-click="removeElement($index)"><i class="fa fa-trash-o"></i></button>
</div>
</div>
@ -51,7 +51,6 @@
<span>Required field</span>
</label>
</div>
<!--<div class="col-md-10 pull-right">
<label class="checkbox-inline custom-checkbox nowrap">
<input ng-model="element.multiAnswers" type="checkbox">
@ -61,10 +60,10 @@
<div class="col-md-10 pull-right">
<label class="checkbox-inline custom-checkbox nowrap">
<input ng-model="element.comment" type="checkbox">
<span>Add an "Other" Answer Option or Comment Field</span>
<input ng-model="element.hasComment" type="checkbox">
<span>Add a Comment Field</span>
</label>
<div class="form-group" ng-show=element.comment>
<div class="form-group" ng-show=element.hasComment>
<label for="inputEmail3" class="col-sm-2 control-label">Label</label>
<div class="col-sm-5">
<input ng-model="element.commentLabel" type="text" class="form-control">
@ -76,27 +75,41 @@
</label>
</div>
</div>
</div>
<div class="col-md-10 pull-right">
<ui-select ng-model="element.tag"
class="btn-group bootstrap-select form-control"
ng-disabled="false"
append-to-body="true"
search-enabled="true">
<ui-select-match placeholder="Please choose the question category">
{{$select.selected}}
</ui-select-match>
<ui-select-choices
repeat="withSearchItem in tags | filter: $select.search">
<span ng-bind-html="withSearchItem"></span>
</ui-select-choices>
</ui-select>
</div>
</div>
</div>
<!-- End Answer's Options -->
<hr/>
<!-- Begin Tags -->
<div class="form-group">
<!--<div class="form-group">
<label class="col-md-12">Question Tags</label>
<div class="col-md-12">
<tags-input track-by-expr="$index" class="bootstrap" ng-model="element.tags" use-strings="true">
<tags-input track-by-expr="$index" class="bootstrap" ng-model="element.tags" use-strings="true" max-tags="1" enforce-max-tags>
<auto-complete source="loadTags($query)"></auto-complete>
</tags-input>
</div>
</div>
</div>-->
<!-- End Tags -->
</form>
</div>
</div>

View File

@ -5,7 +5,7 @@
.controller('list', list);
/** @ngInject */
function list( SurveyService, AnswerService, $scope, $rootScope, $log, $state, toastr, baConfig) {
function list( SurveyService, AnswerService, MemberService, $scope, $rootScope, $log, $state, toastr, baConfig, $q, $http, $sce, $filter) {
var vm = this;
$rootScope.$state = $state;
@ -85,6 +85,35 @@
//console.log('getSurveyCompletion', vm.surveys);
}
function printPdf(){
console.log('printing pdf...');
getPDF().then(function(response){
console.log(response);
window.open(response);
},function(err){
console.log('Error: ' + err);
});
};
function getPDF(){
vm.loading = true;
var q = $q.defer();
$http.defaults.headers.common['content-type']= 'application/pdf';
$http.get('http://localhost:9000/pdf/regular', {params : {"survey":vm.activeSurvey.id}, responseType:'arraybuffer'})
.success(function (response) {
console.log(response);
var file = new Blob([response], {type: 'application/pdf'});
var fileURL = URL.createObjectURL(file);
vm.loading = false;
q.resolve(fileURL);
})
.error(function(err){
vm.loading = false;
q.reject(err);
});
return q.promise;
};
function analyzeSurvey(survey) {
var params = {"survey":survey.id}
AnswerService
@ -93,34 +122,234 @@
vm.analysis = data;
vm.activeSurvey = survey;
$log.info("Got answers analysis",data);
getRespondents(survey);
if(vm.activeSurvey.type != "s_360")
getListAnalysis();
else
getS360Analysis();
}, function (error){
$log.error(error);
});
}
function getRespondents(survey) {
var members = vm.analysis.data.overall.respondents.join(', ')
var params = {"ids":members}
MemberService
.list(params)
.then(function (data){
vm.members = data;
$log.info("Got members",data);
angular.forEach(vm.members, function(member, key) {
member.answers = $filter('filter')(vm.analysis.answers, {'asked' : {'id' : member.id}})
})
vm.selectedMember = (vm.members.length > 0) ? vm.members[0] : [];
console.log("getRespondents", vm.members);
}, function (error){
$log.error(error);
});
}
function getS360Analysis(){
vm.s360Analysis = {"lists" : {}, "overall": {}}
//overall
vm.s360Analysis.overall = gets360Data(vm.analysis.data.overall);
//lists
angular.forEach(vm.activeSurvey.list, function(list) {
vm.s360Analysis.lists[list._id] = {}
vm.s360Analysis.lists[list._id].labels = []
vm.s360Analysis.lists[list._id] = gets360Data(vm.analysis.data.lists[list._id]);
});
//individual
vm.s360Analysis.individual = gets360IndividualData(vm.analysis.data.overall);
console.log("listAnalysis", vm.s360Analysis)
}
function gets360Data(listData){
var data = {}
data.labels = []
data.data = []
angular.forEach(vm.activeSurvey.elements, function(element) {
var index = 0;
var sumElementScore = 0;
data.labels.push(element.tag)
angular.forEach(listData.data, function(asked) {
angular.forEach(asked, function(evaluated) {
index++
sumElementScore += evaluated[element._id] ? evaluated[element._id] : 0
//console.log("evaluated, element._id, evaluated[element._id]", evaluated, element._id, evaluated[element._id])
})
})
var average = sumElementScore / index
data.data.push(average);
})
return data;
}
function gets360IndividualData(listData){
//var data = {}
var data = {}
/*data.labels = []
data.data = {}
angular.forEach(listData.members, function(member) {
data.data[member] = {}
//angular.forEach(listData.members, function(m) {
data.data[member] = {}
angular.forEach(vm.activeSurvey.elements, function(element) {
data.data[member][element._id] = []
})
//})
})
var askedData = {}
angular.forEach(vm.activeSurvey.elements, function(element) {
angular.forEach(listData.data, function(asked, a) {
var askedScore = 0
askedData[a] = askedData[a] ? askedData[a] : []
angular.forEach(asked, function(evaluated, e) {
if(e=='59b7f2d5c59b371d734ac120' && element._id =='59b7f8bbc59b371d734ac144')
console.log("evaluated[element._id]",evaluated[element._id])
askedScore += evaluated[element._id] ? evaluated[element._id] : 100
if (a == e) {
var val = evaluated[element._id] ? evaluated[element._id] : 0
//askedData[a][element._id].push(val)
//console.log("a, val, askedData", a, val, askedData)
}
if(e=='59b7f2d5c59b371d734ac120' && element._id =='59b7f8bbc59b371d734ac144')
console.log("askedScore",askedScore)
})
var avg = askedScore / listData.members.length
data.data[a][element._id].push(avg);
})
})*/
//console.log("data.data", data.data)
data.data = {}
data.labels = []
var askedData = {}
angular.forEach(vm.activeSurvey.elements, function(element) {
var index = 0;
var sumElementScore = 0;
data.labels.push(element.tag)
angular.forEach(listData.data, function(asked, a) {
var i = 0;
var askedScore = 0
askedData[a] = askedData[a] ? askedData[a] : []
data.data[a] = data.data[a] ? data.data[a] : []
angular.forEach(asked, function(evaluated, e) {
i++
askedScore = askedScore + evaluated[element._id]
if(e=='59b7f2d5c59b371d734ac120' && element._id =='59b7f8bbc59b371d734ac144')
{
console.log("evaluated[element._id], askedScore, i",evaluated[element._id], askedScore, evaluated)
//console.log("i, evaluated[element._id], a", i, evaluated[element._id], a)
}
if (a == e) {
var val = evaluated[element._id] ? evaluated[element._id] : 0
askedData[a].push(val)
if(e=='59b7f2d5c59b371d734ac120' && element._id =='59b7f8bbc59b371d734ac144')
console.log("a, val, askedData askedScore", a, val, askedData)
}
//console.log("evaluated, element._id, evaluated[element._id]", evaluated, element._id, evaluated[element._id])
})
var avg = askedScore / listData.members.length
data.data[a].push(avg);
})
//var average = sumElementScore / index
//data.data.push(average);
//console.log("data.data, askedData", data.data, askedData);
//data.data.push(average);
})
var finalData = {}
finalData.data = {}
angular.forEach(data.data, function(el, key) {
finalData.data[key] = []
angular.forEach(askedData, function(ask, k) {
if(key == k) {
finalData.data[key] = [el, ask]
}
})
})
finalData.labels = data.labels
return finalData;
}
function getListAnalysis(){
vm.listAnalysis = {}
angular.forEach(vm.activeSurvey.list, function(list) {
vm.listAnalysis[list._id] = {}
//analysis.id = list._id
//analysis.name = list.name
vm.listAnalysis[list._id].labels = []
vm.listAnalysis[list._id].data = []
var listData = vm.analysis.data.lists[list._id]
//console.log(vm.analysis.data.lists[list._id])
angular.forEach(vm.activeSurvey.elements, function(element) {
vm.listAnalysis[list._id].labels.push(element.tag)
var perfectScore = listData.respondents.length * element.items.length //totalParticip * nbrChoix
// nobreReponseN * coeficientN + ...
var totalScore = 0;
for ( var i = 0, _len = listData.data[element._id].length; i < _len; i++ ) {
totalScore += listData.data[element._id][i] * (i+1)
}
var percent = totalScore * 100 / perfectScore
vm.listAnalysis[list._id].data.push(percent);
//console.log("listData.data[element._id], perfectScore, totalScore, percent", listData.data[element._id], perfectScore, totalScore, percent)
})
//vm.listAnalysis.push(analysis)
});
console.log("listAnalysis", vm.listAnalysis)
}
function activate(){
vm.surveys = [];
vm.activeSurvey = {};
vm.members = [];
vm.selectedMember = {};
vm.goToCreate = goToCreate;
vm.analyzeSurvey = analyzeSurvey;
vm.editSurvey = editSurvey;
vm.removeSurvey = removeSurvey;
vm.printPdf = printPdf;
var layoutColors = baConfig.colors;
vm.doughnutOptions = {
elements: {
arc: {
borderWidth: 0
}
},
legend: {
display: true,
position: 'bottom',
labels: {
fontColor: layoutColors.defaultText
}
vm.s360ChartOption = {
scales: {
yAxes: [{
ticks: {
min: 0,
max: 10,
callback: function(value){return value}
},
scaleLabel: {
display: false
}
}]
}
};
vm.series = ['How the others see you', 'How you evaluated yourself'];
loadSurveys();
}

View File

@ -1,12 +1,13 @@
<div id="analysis">
<uib-tabset active="$tabSetStatus.activeTab">
<uib-tab heading="Question summaries">
<uib-tab heading="Question summaries" ng-if="vm.activeSurvey.type != 's_360'">
<button type="button" ng-click="vm.printPdf()">Print PDF in new window</button>
<div class="row">
<div class="col-md-12">
<div class="progress">
<div class="progress-bar progress-bar-success" role="progressbar" aria-valuenow="{{vm.analysis.completion}}" aria-valuemin="0" aria-valuemax="100" style="width: {{vm.analysis.completion}}%">
{{vm.activeSurvey.completion}}% of question answred (Respondents : {{vm.analysis.respondents.length}} of {{vm.analysis.recipents}})
{{vm.activeSurvey.completion}}% of question answred (Respondents : {{vm.analysis.data.overall.respondents.length}} of {{vm.analysis.recipents}})
</div>
</div>
<br>
@ -20,7 +21,7 @@
<div class="chartjs-canvas-holder-first-row" style="max-width: 300px;margin:0 auto;">
<canvas id="doughnut" chart-options="vm.doughnutOptions" class="chart chart-doughnut"
chart-data="vm.analysis.data[e._id]" chart-labels="vm.analysis.labels[e._id]">
chart-data="vm.analysis.data.overall.data[e._id]" chart-labels="vm.analysis.labels[e._id]">
</canvas>
</div>
@ -34,7 +35,159 @@
</div>
</uib-tab>
<uib-tab heading="Survey summary" ng-if="vm.activeSurvey.type == 's_360'">
<div class="row">
<div class="col-md-12">
<div class="progress">
<div class="progress-bar progress-bar-success" role="progressbar" aria-valuenow="{{vm.analysis.completion}}" aria-valuemin="0" aria-valuemax="100" style="width: {{vm.analysis.completion}}%">
{{vm.activeSurvey.completion}}% of question answred (Respondents : {{vm.analysis.data.overall.respondents.length}} of {{vm.analysis.recipents}})
</div>
</div>
<br>
<div class="panel-group">
<div class="panel panel-default bootstrap-panel">
<div class="panel-heading">{{ vm.activeSurvey.name }}</div>
<div class="panel-body">
<div class="chartjs-canvas-holder-first-row" style="width: 100%;margin:0 auto;">
<canvas id="bar" class="chart chart-bar"
chart-data="vm.s360Analysis.overall.data" chart-labels="vm.s360Analysis.overall.labels" chart-options="vm.s360ChartOption">
</canvas>
</div>
</div>
</div>
</div>
</div>
</div>
</uib-tab>
<uib-tab heading="Lists summaries">
<div class="row">
<div class="col-md-12">
<div class="progress">
<div class="progress-bar progress-bar-success" role="progressbar" aria-valuenow="{{vm.analysis.completion}}" aria-valuemin="0" aria-valuemax="100" style="width: {{vm.analysis.completion}}%">
{{vm.activeSurvey.completion}}% of question answred (Respondents : {{vm.analysis.data.overall.respondents.length}} of {{vm.analysis.recipents}})
</div>
</div>
<br>
<div class="panel-group">
<div class="panel panel-default bootstrap-panel" ng-repeat="e in vm.activeSurvey.list">
<div class="panel-heading">{{ e.name }}</div>
<div class="panel-body">
<div class="chartjs-canvas-holder-first-row" style="width: 100%;margin:0 auto;" ng-if="vm.activeSurvey.type != 's_360'">
<canvas id="bar" class="chart chart-bar"
chart-data="vm.listAnalysis[e._id].data" chart-labels="vm.listAnalysis[e._id].labels">
</canvas>
</div>
<div class="chartjs-canvas-holder-first-row" style="width: 100%;margin:0 auto;" ng-if="vm.activeSurvey.type == 's_360'">
<canvas id="bar" class="chart chart-bar"
chart-data="vm.s360Analysis.lists[e._id].data" chart-labels="vm.s360Analysis.lists[e._id].labels" chart-options="vm.s360ChartOption">
</canvas>
</div>
</div>
</div>
</div>
</div>
</div>
</uib-tab>
<uib-tab heading="Individual report" ng-if="vm.activeSurvey.type == 's_360'">
<div class="form-group ">
<ui-select ng-model="vm.selectedMember"
class="btn-group bootstrap-select form-control"
ng-disabled="false"
append-to-body="true"
search-enabled="true"
ng-change="selectedMemberChange()">
<ui-select-match placeholder="Select With Search">
{{$select.selected.name}}
</ui-select-match>
<ui-select-choices
repeat="withSearchItem in vm.members | filter: $select.search">
<span ng-bind-html="withSearchItem.name"></span>
</ui-select-choices>
</ui-select>
</div>
<div class="row">
<div class="col-md-12">
<div class="chartjs-canvas-holder-first-row" style="width: 100%;margin:0 auto;">
<canvas id="bar" class="chart chart-bar"
chart-data="vm.s360Analysis.individual.data[vm.selectedMember.id]" chart-labels="vm.s360Analysis.individual.labels" chart-options="vm.s360ChartOption" chart-series="vm.series">
</canvas>
</div>
</div>
</div>
</uib-tab>
<uib-tab heading="Individual responses">
<div class="form-group ">
<ui-select ng-model="vm.selectedMember"
class="btn-group bootstrap-select form-control"
ng-disabled="false"
append-to-body="true"
search-enabled="true"
ng-change="selectedMemberChange()">
<ui-select-match placeholder="Select With Search">
{{$select.selected.name}}
</ui-select-match>
<ui-select-choices
repeat="withSearchItem in vm.members | filter: $select.search">
<span ng-bind-html="withSearchItem.name"></span>
</ui-select-choices>
</ui-select>
</div>
<div class="row">
<div class="col-md-12">
<div class="panel-group">
<div class="panel panel-default bootstrap-panel" ng-repeat="answer in vm.selectedMember.answers | orderBy:'id':true">
<div class="panel-heading">{{ answer.question.text }} <b ng-if="vm.activeSurvey.type == 's_360'">({{ answer.evaluated.name }})</b></div>
<div class="panel-body">
{{ answer.value }}
</div>
</div>
</div>
</div>
</div>
</uib-tab>
</uib-tabset>
</div>

View File

@ -71,7 +71,7 @@
});
// Configure all line charts
ChartJsProvider.setOptions('Line', {
datasetFill: false
datasetFill: false,
});
// Configure all radar charts
ChartJsProvider.setOptions('radar', {
@ -88,8 +88,23 @@
// Configure all bar charts
ChartJsProvider.setOptions('bar', {
tooltips: {
enabled: false
}
enabled: true
},
scales: {
yAxes: [{
ticks: {
min: 0,
max: 100,
callback: function(value){return value+ "%"}
},
scaleLabel: {
display: true,
labelString: "Percentage"
}
}]
}
});
}

View File

@ -47,10 +47,9 @@
function analyze(params) {
params = params || {};
endpoint = endpoint + "/analyze"
var deferred = $q.defer();
$http.get(endpoint, { params : params})
$http.get(endpoint + "/analyze", { params : params})
.success(function(data) {
deferred.resolve(data);
}).error(function(msg, code) {
@ -60,7 +59,7 @@
return deferred.promise;
return $http.get(endpoint, params);
return $http.get(endpoint + "/analyze", params);
}
return {

View File

@ -236,6 +236,7 @@
for (var i = 0; i < members.length; i++) {
if(multi == false || (multi == true && members[i].Selected == true)) {
var index = list.members.indexOf(members[i].id);
console.log('index', index)
//vm.listMembers = [];
if (action == "add") {
if (index == -1)
@ -248,7 +249,7 @@
}
console.log('updateMembers:modified members', list.members)
vm.activeList.isChecked = true;
ListService
.edit(list)

View File

@ -77,7 +77,7 @@
</div>
</td>
<td>
<button class="btn btn-danger btn-xs pull-left" ng-click="vm.updateMembers([m], 'remove')"><span class="glyphicon glyphicon-trash"></span></button>
<button class="btn btn-danger btn-xs pull-left" ng-click="vm.updateMembers([m], 'remove', false)"><span class="glyphicon glyphicon-trash"></span></button>
</td>
@ -151,7 +151,7 @@
</div>
</td>
<td>
<button class="btn btn-success btn-xs pull-left" ng-click="vm.updateMembers([m], 'add')"><span class="glyphicon glyphicon-plus"></span></button>
<button class="btn btn-success btn-xs pull-left" ng-click="vm.updateMembers([m], 'add', false)"><span class="glyphicon glyphicon-plus"></span></button>
</td>
</tr>

View File

@ -9,7 +9,7 @@
.controller('ViewerPageCtrl', ViewerPageCtrl);
/** @ngInject */
function ViewerPageCtrl($scope, $stateParams, SurveyService, $log) {
function ViewerPageCtrl($scope, $stateParams, SurveyService, AnswerService, $log, $filter) {
//alert('test');
var vm = this;
@ -20,10 +20,12 @@
.then(function (data){
vm.survey = data;
$log.info("Got the survey data",data);
var alreadyAnswered = checkIfAlreadyAnswered();
var isMemberIlligible = checkIfIlligible();
//building forms elements
//angular.forEach(vm.survey.elements, function(element, key) {
// console.log("element",element);
if (!alreadyAnswered && isMemberIlligible) {
angular.forEach(vm.survey.list, function(list, key) {
console.log("list",list);
angular.forEach(list.members, function(member, key) {
@ -32,37 +34,74 @@
vm.forms[member.id].elements = vm.survey.elements;
vm.forms[member.id].question = {};
if(member.id != vm.activeMemberId) {
member.last = false;
vm.members.push(member);
} else
vm.askedMember = member;
//.push(k + ': ' + member);
});
});
vm.askedMember.last = true;
vm.members.push(vm.askedMember);
//Thnak You message
vm.members.push({"id": "none", "name" : ": )"});
});
// });
/*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);*/
} else {
$log.info("Already answered");
if (alreadyAnswered)
vm.alreadyAnswered = true;
else
vm.isMemberIlligible = false;
}
}, function (error){
vm.error = true;
$log.error(error);
});
}
function checkIfAlreadyAnswered() {
console.log("checkIfAlreadyAnswered", vm.survey.respondents.length, vm.survey.respondents.indexOf(vm.activeMemberId))
if (vm.survey.respondents.length > 0 && vm.survey.respondents.indexOf(vm.activeMemberId) !== -1)
return true
return false
}
function checkIfIlligible() {
var element = []
angular.forEach(vm.survey.list, function(list, key) {
if (element.length == 0)
element = $filter('filter')(list.members, {'id':vm.activeMemberId})
})
//console.log("checkIfIlligible", element, element.length)
if (element.length > 0)
return true;
return false;
}
function activate(){
vm.forms = [];
vm.survey = {};
vm.members = [];
vm.alreadyAnswered = false;
vm.isMemberIlligible = true;
vm.error = false;
vm.askedMember = {};
vm.activeMemberId = $stateParams.member_id;
loadSurvey($stateParams.survey_id);
console.log(vm.activeMemberId)
vm.formData = {}
if ($stateParams.member_id && $stateParams.survey_id) {
vm.activeMemberId = $stateParams.member_id;
loadSurvey($stateParams.survey_id);
} else
vm.error = true;
}
@ -77,11 +116,76 @@
return initials;
};
vm.test = function(form){
//$scope.submitted = true;
alert("Angular is Awesome!!!");
console.log('submit', form);
};
vm.validateForm = function(form){
vm.forms[vm.activeMemberId].$submitted = true;
if (!form.$valid ) {
//alert("Please fill in all required fields!");
console.log('error submitting', form);
return false;
}else{
console.log('submitting', vm.formData);
vm.sendAnswers(vm.formData)
}
console.log('submit');
};
vm.sendAnswers = function(formData) {
console.log("formData", formData);
var counter = 0;
angular.forEach(formData, function(val, key) {
if(key.indexOf("_") == -1) {
var elementId = key;
console.log("elementId", elementId);
//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')(vm.survey.elements, {'_id':elementId})
var answer = {
"value" : val.value,
"comment" : (val.comment) ? val.comment : '',
"survey" : vm.survey.id,
"asked" : vm.askedMember,
"question": element[0]
}
AnswerService
.create(answer)
.then(
function (data){
counter++;
console.log("answer.create, counter, elements",data, counter, vm.survey.elements.length);
//trigger this when all the answers are sent
if(counter == vm.survey.elements.length) {
var respondents = vm.survey.respondents;
respondents.push(vm.askedMember.id);
vm.survey.respondents = respondents;
SurveyService
.update(vm.survey)
.then(
function (data){
console.log("updated survey",data);
vm.forms[vm.activeMemberId].$processed = true;
},
function (error){
console.log("Error updating the survey");
}
);
}
},
function (error){
console.log("Error creating the answer");
}
);
}
})
};
activate();

View File

@ -3,26 +3,66 @@
.al-main {margin-left:0 !important;}
</style>
<div class="row">
<div class="row" ng-if="vm.alreadyAnswered">
<div class="col-md-12"
ba-panel
ba-panel-title="Avito Surveys"
ba-panel-class="with-scroll">
<div >
<div class="alert bg-success">
<h4>Well done!</h4>
You have <strong>already</strong> answered this survey.
</div>
</div>
</div>
</div>
<div class="row" ng-if="!vm.isMemberIlligible">
<div class="col-md-12"
ba-panel
ba-panel-title="Avito Surveys"
ba-panel-class="with-scroll">
<div >
<div class="alert bg-danger">
<h4> :( </h4>
You seems to be <strong>not</strong> invited to answer this survey.
</div>
</div>
</div>
</div>
<div class="row" ng-if="vm.error">
<div class="col-md-12"
ba-panel
ba-panel-title="Avito Surveys"
ba-panel-class="with-scroll">
<div >
<div class="alert bg-danger">
<h4> :( </h4>
Something <strong>VERY VERY</strong> bad happened !
</div>
</div>
</div>
</div>
<div class="row" ng-if="!vm.alreadyAnswered && vm.isMemberIlligible && !vm.error">
<div class="col-md-12">
<div ba-panel ba-panel-title="{{vm.survey.name}}" ba-panel-class="with-scroll">
<div class="section-block bold-text ng-scope"><p ng-bind-html="vm.survey.description"></p></div>
<div class="separator"></div>
<ba-wizard>
<ba-wizard ng-if="vm.survey.type == 's_360'">
<ba-wizard-step title="{{ m.id != vm.activeMemberId ? vm.getInitials(m.name) : 'ME' }}" ng-repeat="m in vm.members track by $index" ng-init="memberId = m.id" form="vm.forms[memberId]" mid="{{ m.id }}" elements="{{vm.survey.elements}}" evaluated="{{m}}" asked="{{vm.askedMember}}" survey="{{vm.survey.id}}" name="{{vm.survey.name}}" respondents="{{vm.survey.respondents}}" last="{{ m.last }}">
<ba-wizard-step title="{{ m.id != vm.activeMemberId ? vm.getInitials(m.name) : 'ME' }}" ng-repeat="m in vm.members track by $index" ng-init="memberId = m.id" form="vm.forms[memberId]" mid="{{ m.id }}" elements="{{vm.survey.elements}}" evaluated="{{m}}" asked="{{vm.askedMember}}">
<form name="vm.forms[memberId]" novalidate ng-if="m.id != 'none'">
<form name="vm.forms[memberId]" novalidate ng-if="memberId != 'none'">
<ng-form name="innerForm">
<div class="member-survey">
<div class="separator"></div>
<h3 class="member-full-name">{{ m.name }}</h3>
<div class="separator"></div>
<div id="{{e.id}}" class="form-group answer" ng-repeat="e in vm.survey.elements"
ng-init="elementId = vm.survey.id+'_'+memberId+'_'+vm.activeMemberId+'_'+e._id" ng-class="{'has-error': innerForm[elementId].$invalid && (vm.forms[memberId].$submitted)}">
<input type="hidden" name="{{ elementId }}_submitted" ng-model="vm.innerForm[elementId].submitted" ng-value="false"/>
<!--<input type="hidden" name="{{ elementId }}_question" ng-model="vm.innerForm[elementId].question.$viewValue" ng-value="e"/>-->
<p>{{ e.text }}</p>
<label ng-class="el.multiple ? 'custom-checkbox radio-checkbox nowrap' : 'custom-radio radio-inline nowrap'" ng-repeat="el in e.items">
<input ng-attr-type="{{el.multiple? 'checkbox' : 'radio'}}" name="{{elementId}}" ng-model="vm.innerForm[elementId].$viewValue" ng-value="el.value" ng-attr-required="{{el.required}}">
@ -38,6 +78,9 @@
</div>
</ng-form>
</form>
<form class="form-horizontal" name="vm.finishForm" novalidate ng-if="m.id == 'none'">
<div class="separator"></div>
<h3 class="member-full-name">Congratulations! You have successfully filled the form!</h3>
@ -49,7 +92,43 @@
</ba-wizard>
<div ng-if="vm.survey.type != 's_360'">
<form name="regularForm" novalidate ng-if="vm.survey.type != 's_360'" ng-submit="vm.validateForm(regularForm)" ng-show="!vm.forms[vm.activeMemberId].$processed">
<div class="member-survey">
<h3 class="member-full-name" ng-if="vm.survey.type == 's_regular'">{{ vm.askedMember.name }}</h3>
<div class="separator" ng-if="vm.survey.type == 's_regular'"></div>
<div id="{{e.id}}" class="form-group answer" ng-repeat="e in vm.survey.elements"
ng-init="elementId = e._id" ng-class="{'has-error': regularForm[elementId].$invalid && (vm.forms[vm.activeMemberId].$submitted)}">
<!--<input type="hidden" name="{{ elementId }}_question" ng-model="vm.innerForm[elementId].question.$viewValue" ng-value="e"/>-->
<p>{{ e.text }}</p>
<label ng-class="el.multiple ? 'custom-checkbox radio-checkbox nowrap' : 'custom-radio radio-inline nowrap'" ng-repeat="el in e.items">
<input ng-attr-type="{{el.multiple? 'checkbox' : 'radio'}}" name="{{elementId}}" ng-model="vm.formData[elementId].value" ng-value="el.value" ng-attr-required="{{el.required}}">
<span>{{ el.value }}</span>
</label>
<br><br>
<div class="form-group" ng-if="e.hasComment">
<label for="{{ e._id }}_comment">{{e.commentLabel}}</label>
<input type="text" class="form-control" name="{{ elementId }}_comment" ng-model="vm.formData[elementId].comment" placeholder="..." ng-attr-required="{{e.commentIsRequired}}">
</div>
<div class="separator"></div>
</div>
</div>
<nav>
<ul class="pager ba-wizard-pager">
<li class="next"> <button type="submit" class="btn btn-primary">Submit <span aria-hidden="true"></span></button></li>
</ul>
</nav>
</form>
<form class="form-horizontal" name="vm.finishForm" novalidate ng-if="vm.forms[vm.activeMemberId].$processed">
<h3 class="member-full-name">Congratulations! You have successfully filled the form!</h3>
<div class="separator"></div>
</form>
</div>
</div>
</div>

View File

@ -13,6 +13,10 @@
$stateProvider
.state('viewer', {
url: '/viewer/:survey_id/:member_id',
params: {
survey_id: { squash: true, value: null },
member_id: { squash: true, value: null },
},
title: 'Viewer',
templateUrl: 'app/pages/viewer/viewer.html',
controller: 'ViewerPageCtrl as vm',

View File

@ -5,7 +5,7 @@
.directive('baWizardStep', baWizardStep);
/** @ngInject */
function baWizardStep($http, AnswerService, $filter) {
function baWizardStep($http, AnswerService, SurveyService, $filter) {
return {
restrict: 'E',
transclude: true,
@ -43,6 +43,10 @@
var elements = angular.fromJson($attrs.elements);
var memberEvaluated = angular.fromJson($attrs.evaluated);
var memberAsked = angular.fromJson($attrs.asked);
var survey = $attrs.survey;
var surveyName = $attrs.name;
var isLast = $attrs.last == "true" ? true : false;
var respondents = angular.fromJson($attrs.respondents);
$scope.form && $scope.form.$setSubmitted(true);
if($scope.form && $scope.form.$invalid == false) {
@ -50,22 +54,24 @@
console.log("$attrs.elements", elements);
console.log("inner", $scope.form.innerForm);
angular.forEach($scope.form.innerForm, function(val, key) {
var counter = 0;
if((key.indexOf("_") !== -1) && (key.indexOf("_comment") == -1) && (key.indexOf("_submitted") == -1) && (key.indexOf("_question") == -1)) {
angular.forEach($scope.form.innerForm, function(val, key) {
if((key.indexOf("_") !== -1) && (key.indexOf("_comment") == -1) && (key.indexOf("_submitted") == -1) && (key.indexOf("_last") == -1)) {
var res = key.split("_");
console.log("res", res);
var elementId = res[3];
//console.log("val", val);
var commentKey = key + "_comment";
var submittedKey = key + "_submitted";
var lastKey = key + "_last";
//console.log("key", key);
//console.log("commentKey", commentKey);
//console.log("submittedKey", submittedKey);
var element = $filter('filter')(elements, {'_id':res[3]})
var element = $filter('filter')(elements, {'_id':elementId})
var answer = {
"value" : val.$viewValue,
"comment" : ($scope.form.innerForm[commentKey]) ? $scope.form.innerForm[commentKey].$viewValue : '',
"survey" : res[0],
"survey" : survey,
"evaluated" : memberEvaluated,
"asked" : memberAsked,
"question": element[0]
@ -78,6 +84,9 @@
.update(answer)
.then(
function (data){
counter++;
if(counter == elements.length && isLast)
$scope.isLast(survey, surveyName, memberAsked.id, respondents);
console.log("answer.update",data);
$scope.form.innerForm[submittedKey].$viewValue = data.data.id;
},
@ -99,6 +108,9 @@
.update(answer)
.then(
function (data){
counter++;
if(counter == elements.length && isLast)
$scope.isLast(survey, surveyName, memberAsked.id, respondents);
console.log("answer.update",data);
$scope.form.innerForm[submittedKey].$viewValue = data.data.id;
},
@ -111,6 +123,9 @@
.create(answer)
.then(
function (data){
counter++;
if(counter == elements.length && isLast)
$scope.isLast(survey, surveyName, memberAsked.id, respondents);
console.log("answer.create",data);
$scope.form.innerForm[submittedKey].$viewValue = data.data.id;
},
@ -133,6 +148,23 @@
}
}
$scope.isLast = function(survey, surveyName, member, respondents) {
respondents.push(member);
var surveyObj = {"id":survey, "name": surveyName, "respondents": respondents}
console.log("isLast", surveyObj);
SurveyService
.update(surveyObj)
.then(
function (data){
console.log("updated survey",data);
},
function (error){
console.log("Error updating the survey");
}
);
}
function isComplete() {
return $scope.form ? $scope.form.$valid : true;
}

View File

@ -365,3 +365,10 @@ background-color: white;
#surveys .progress{
margin: 10px;
}
#analysis .panel-group .panel {
margin-bottom: 25px;
}
#analysis .bootstrap-panel .panel-body {
padding: 15px !important;
}