SmartIT_Extensions/BMC/smart-it-full-helix/scripts/app/change/risk-questions-directive.js

145 lines
8.1 KiB
JavaScript

"use strict";
(function () {
'use strict';
angular.module('changeModule')
.directive('riskQuestions', [
function () {
return {
restrict: 'E',
templateUrl: 'views/change/risk-questions.html',
scope: {
ticket: '=',
mode: '=',
pendingReload: '=',
reloadIf: '=',
form: '=',
editMode: '='
},
controller: ['$scope', 'createTicketModel', 'events', '$state', 'systemAlertService',
function ($scope, createTicketModel, events, $state, systemAlertService) {
$scope.responsesCopy = $scope.ticket.questionResponses;
$scope.state = {};
$scope.$watch('mode', function (newMode, oldMode) {
if (newMode && newMode === 'auto' && oldMode === 'manual') {
$scope.ticket.riskIsUserSpecified = false;
_.forEach($scope.ticket.questionDefinitions, function (question) {
question.selectedOption = $scope.questionResponsesCopy && _.cloneDeep($scope.questionResponsesCopy[question.id]);
if (question.selectedOption) {
question.selectedOption.parentQuestion = null;
}
});
$scope.ticket.questionResponses = $scope.questionResponsesCopy;
setPendingChangeFlag();
}
});
$scope.riskQuestionsEnabled = function () {
return $scope.mode && $scope.mode === 'auto';
};
$scope.questionOptionSelected = function (question, option) {
return $scope.questionResponsesCopy && $scope.questionResponsesCopy[question.id] === option;
};
$scope.selectQuestionOption = function (question, option) {
option.parentQuestion = _.cloneDeep(question);
$scope.questionResponsesCopy = $scope.questionResponsesCopy || {};
var selectedOption = $scope.questionResponsesCopy[question.id]
? $scope.questionResponsesCopy[question.id] === option ? null : option
: option;
$scope.questionResponsesCopy[question.id] = selectedOption;
//cloneDeep and null setting done for avoiding cyclical reference
question.selectedOption = _.cloneDeep(selectedOption);
question.selectedOption.parentQuestion = null;
$scope.ticket.questionResponses = $scope.questionResponsesCopy;
setPendingChangeFlag();
};
$scope.$watch('reloadIf', function () {
if ($scope.reloadIf) {
$scope.loadRiskQuestions();
}
});
$scope.loadRiskQuestions = function () {
if ($scope.ticket.company && $scope.ticket.categorizations) {
$scope.ticket.questionDefinitions = null;
$scope.ticket.questionResponses = null;
$scope.state.questionsLoading = true;
createTicketModel.getList(EntityVO.TYPE_RISKQUESTION, {
companies: [$scope.ticket.company],
categorizations: $scope.ticket.categorizations
}).then(function (questions) {
$scope.reloadIf = false;
$scope.state.questionsLoading = false;
$scope.ticket.questionDefinitions = questions;
if ($scope.mode === 'auto' && questions.length === 0) {
$scope.mode = '';
}
if ($scope.editMode) {
normalizeResponses();
}
});
}
};
function normalizeResponses() {
if ($scope.ticket.questionResponses) {
$scope.responsesCopy = $scope.ticket.questionResponses;
}
$scope.questionResponsesCopy = null;
angular.forEach($scope.responsesCopy, function (response) {
var question = _.head(_.filter($scope.ticket.questionDefinitions, { id: response.questionId }));
if (question) {
var option = _.head(_.filter(question.options, { id: response.optionId }));
if (option) {
$scope.selectQuestionOption(question, option);
}
question.responseId = response.id;
}
clearPendingChangeFlag();
});
}
$scope.$on(events.TOGGLE_EDIT_MODE, toggleEditMode);
$scope.$on(events.SAVE_CHANGES, save);
$scope.$on(events.DISCARD_CHANGES, cancel);
$scope.$on(events.SAVE_ALL_CHANGES_COMPLETE, function () {
});
function toggleEditMode() {
$scope.ticket.questionDefinitions = null;
$scope.reloadIf = true;
}
function save() {
$scope.$emit(events.SAVE_CHANGES_REQUEST, {}, true);
$scope.ticket.questionResponses = $scope.questionResponsesCopy;
if ($scope.state.pendingRiskQuestionsChange && $scope.mode === 'auto') {
createTicketModel.saveRiskResponse($scope.ticket)
.then(function () {
$scope.$emit(events.SAVE_CHANGES_COMPLETE);
clearPendingChangeFlag();
$state.go($state.current, {}, { reload: true });
}, function (error) {
systemAlertService.error({
text: error.data && error.data.error,
clear: false
});
$scope.mode = 'auto';
$scope.$emit(events.SAVE_CHANGES_FAULT_CONTINUE);
});
}
else {
$scope.$emit(events.SAVE_CHANGES_COMPLETE);
cancel();
}
}
function cancel() {
$scope.ticket.questionResponses = $scope.responsesCopy;
clearPendingChangeFlag();
}
function setPendingChangeFlag() {
$scope.state.pendingRiskQuestionsChange = true;
}
function clearPendingChangeFlag() {
$scope.state.pendingRiskQuestionsChange = false;
}
}
]
};
}
]);
})();