259 lines
14 KiB
JavaScript
259 lines
14 KiB
JavaScript
"use strict";
|
|
(function () {
|
|
'use strict';
|
|
angular.module('customWidgetsModule').directive('ticketRisk', ['customFieldLinkFunction', 'events', 'createTicketModel', 'tabIds', 'objectValueMapperService',
|
|
function (customFieldLinkFunction, events, createTicketModel, tabIds, objectValueMapperService) {
|
|
return {
|
|
restrict: 'E',
|
|
replace: true,
|
|
scope: {
|
|
data: '=',
|
|
context: '=',
|
|
metadata: '=',
|
|
isEditable: '=',
|
|
isNew: '='
|
|
},
|
|
templateUrl: 'views/custom-widgets/ticket-risk.html',
|
|
link: function (scope) {
|
|
customFieldLinkFunction(scope);
|
|
scope.tabIds = tabIds;
|
|
scope.data.modeCheck = false;
|
|
scope.showRiskQuestions = false;
|
|
if (_.isEmpty(scope.context.questionResponses)) {
|
|
scope.context.riskIsUserSpecified = true;
|
|
}
|
|
if (scope.data.value) {
|
|
if (scope.isNew || scope.context.fromCopyChange) {
|
|
scope.data.value.mode = scope.context.riskLevel ? 'manual' : 'auto';
|
|
}
|
|
else if (scope.context.riskIsUserSpecified) {
|
|
scope.data.value.mode = 'manual';
|
|
}
|
|
else {
|
|
scope.data.value.mode = 'auto';
|
|
}
|
|
}
|
|
else {
|
|
scope.data.value = {
|
|
mode: 'auto'
|
|
};
|
|
}
|
|
if (scope.data.value.riskLevel) {
|
|
var riskLevelCopy = _.cloneDeep(scope.data.value.riskLevel);
|
|
}
|
|
else {
|
|
scope.data.value.riskLevel = (_.head(scope.metadata.riskLevels)).name;
|
|
riskLevelCopy = _.cloneDeep(scope.data.value.riskLevel);
|
|
}
|
|
scope.data.value.riskLevelLabel = (_.find(scope.metadata.riskLevels, { name: scope.data.value.riskLevel })).label;
|
|
if (scope.context.questionResponses) {
|
|
scope.data.value.questionResponses = _.cloneDeep(scope.context.questionResponses);
|
|
}
|
|
scope.state = {
|
|
pendingRiskLevelChange: false
|
|
};
|
|
scope.overrideRiskLevelEnabled = function () {
|
|
return scope.data.value.mode && scope.data.value.mode === 'manual';
|
|
};
|
|
scope.riskLevelCls = function (riskLevel, reverseIndex) {
|
|
var result = '';
|
|
if (scope.data.value.riskLevel === riskLevel || scope.data.value.riskLevel === riskLevel.name) {
|
|
var index = scope.metadata.riskLevels.length - reverseIndex;
|
|
scope.data.titleRiskLevelCls = 'risk-level-' + index;
|
|
scope.data.backgroundRiskLevelCls = 'ticket__risk-level-' + index;
|
|
result = 'active ' + scope.data.backgroundRiskLevelCls;
|
|
}
|
|
return result;
|
|
};
|
|
scope.riskLevelChanged = function (riskLevel) {
|
|
if (!scope.isEditable) {
|
|
return false;
|
|
}
|
|
scope.data.value.riskLevel = riskLevel.name;
|
|
scope.data.value.riskLevelLabel = riskLevel.label;
|
|
scope.data.riskIsUserSpecified = true;
|
|
scope.$emit(events.WIDGET_VALUE_CHANGE, { fieldName: scope.data.name, fieldValue: riskLevel.name, memberName: 'riskLevel' });
|
|
};
|
|
/* function setPendingChangeFlag() {
|
|
scope.state.pendingRiskLevelChange = true;
|
|
}
|
|
*/
|
|
function clearPendingChangeFlag() {
|
|
scope.data.value.mode = 'manual';
|
|
scope.state.pendingRiskLevelChange = false;
|
|
}
|
|
scope.responsesCopy = scope.data.value.questionResponses;
|
|
scope.state = {};
|
|
scope.riskQuestionsEnabled = function () {
|
|
return scope.data.value.mode && scope.data.value.mode === 'auto' && scope.isEditable;
|
|
};
|
|
scope.questionOptionSelected = function (question, option) {
|
|
return scope.questionResponsesCopy && scope.questionResponsesCopy[question.id] && scope.questionResponsesCopy[question.id] === option;
|
|
};
|
|
scope.selectQuestionOption = function (question, option) {
|
|
var questionCopy = angular.copy(question); //avoid circular reference
|
|
option.parentQuestion = questionCopy;
|
|
scope.questionResponsesCopy = scope.questionResponsesCopy || {};
|
|
var selectedOption = scope.questionResponsesCopy[question.id]
|
|
? scope.questionResponsesCopy[question.id] === option ? null : option
|
|
: option;
|
|
scope.questionResponsesCopy[question.id] = selectedOption;
|
|
question.selectedOption = selectedOption;
|
|
scope.data.value.questionResponses = scope.questionResponsesCopy;
|
|
};
|
|
scope.$watch('reloadIf', function () {
|
|
if (scope.reloadIf) {
|
|
scope.loadRiskQuestions();
|
|
}
|
|
});
|
|
function getSelectedCategories() {
|
|
var categories = objectValueMapperService.getFieldsByType('category');
|
|
var selectedCategories = [];
|
|
_.forEach(categories, function (category) {
|
|
var selectedCategory = { name: category.name, tiers: {} };
|
|
_.each(category.value.listOfTiers, function (tier) {
|
|
if (tier.selectedValue) {
|
|
selectedCategory.tiers[tier.name] = tier.selectedValue;
|
|
}
|
|
});
|
|
selectedCategories.push(selectedCategory);
|
|
});
|
|
var opCategoryFields = _.filter(objectValueMapperService.getFieldList(), function (field) {
|
|
return field.name.indexOf('operationCategory') !== -1;
|
|
});
|
|
if (opCategoryFields.length > 0) {
|
|
var selectedOpCategoryField = { name: 'operational', tiers: {} };
|
|
_.forEach(opCategoryFields, function (opCategoryField) {
|
|
if (opCategoryField.value) {
|
|
selectedOpCategoryField.tiers[opCategoryField.name] = opCategoryField.value;
|
|
}
|
|
});
|
|
selectedCategories.push(selectedOpCategoryField);
|
|
}
|
|
return selectedCategories;
|
|
}
|
|
scope.loadRiskQuestions = function () {
|
|
if (scope.context.company && scope.context.categorizations) {
|
|
scope.data.value.questionDefinitions = null;
|
|
scope.data.value.questionResponses = null;
|
|
scope.state.questionsLoading = true;
|
|
createTicketModel.getList(EntityVO.TYPE_RISKQUESTION, {
|
|
companies: [scope.context.company],
|
|
categorizations: getSelectedCategories()
|
|
}).then(function (questions) {
|
|
if (scope.isNew) {
|
|
scope.$emit(events.RISK_QUESTION_LOADED);
|
|
}
|
|
scope.reloadIf = false;
|
|
scope.state.questionsLoading = false;
|
|
scope.data.value.questionDefinitions = questions;
|
|
if (scope.data.value.mode === 'auto' && questions.length === 0) {
|
|
scope.data.value.mode = 'manual';
|
|
}
|
|
normalizeResponses();
|
|
});
|
|
}
|
|
};
|
|
function normalizeResponses() {
|
|
scope.$emit(events.RISK_MODE_AUTO, { fieldName: scope.data.name, fieldValue: scope.data.value.riskLevel });
|
|
if (scope.data.value.questionResponses) {
|
|
scope.responsesCopy = scope.data.value.questionResponses;
|
|
}
|
|
scope.questionResponsesCopy = null;
|
|
angular.forEach(scope.responsesCopy, function (response) {
|
|
var question = _.head(_.filter(scope.data.value.questionDefinitions, { id: response.questionId }));
|
|
if (question) {
|
|
var option = _.head(_.filter(question.options, { id: response.optionId }));
|
|
// On edit, we need to have responseId value when directive is getting init
|
|
// Without this value risk question that was no changed will be send to save without id
|
|
// and its value will be lost
|
|
question.responseId = response.id;
|
|
if (option) {
|
|
scope.selectQuestionOption(question, option);
|
|
}
|
|
}
|
|
});
|
|
}
|
|
scope.reloadCheck = function () {
|
|
scope.reloadIf = true;
|
|
scope.data.modeCheck = true;
|
|
scope.data.riskIsUserSpecified = false;
|
|
};
|
|
scope.modeCheck = function () {
|
|
scope.data.modeCheck = false;
|
|
scope.data.riskIsUserSpecified = true;
|
|
scope.$emit(events.WIDGET_VALUE_CHANGE, { fieldName: scope.data.name, fieldValue: scope.data.value.riskLevel, memberName: 'riskLevel' });
|
|
};
|
|
scope.toggleRiskQuestions = function () {
|
|
scope.showRiskQuestions = !scope.showRiskQuestions;
|
|
};
|
|
scope.$on(events.AFTER_SAVED_CHANGES, afterSaveChangesHandler);
|
|
scope.$on(events.AFTER_RISK_UPDATE, afterRiskUpdateHandler);
|
|
scope.$on(events.DISCARD_CHANGES, cancel);
|
|
function afterSaveChangesHandler(event, response) {
|
|
scope.data.value.riskLevel = response.riskLevel;
|
|
riskLevelCopy = _.cloneDeep(scope.data.value.riskLevel);
|
|
scope.showRiskQuestions = false;
|
|
scope.data.value.questionResponses = _.cloneDeep(scope.context.questionResponses);
|
|
}
|
|
function afterRiskUpdateHandler() {
|
|
scope.context.riskIsUserSpecified = false;
|
|
}
|
|
function cancel() {
|
|
scope.data.value.questionResponses = scope.responsesCopy;
|
|
if (riskLevelCopy) {
|
|
scope.data.value.riskLevel = _.cloneDeep(riskLevelCopy);
|
|
}
|
|
if (!scope.context.riskIsUserSpecified) {
|
|
scope.data.value.mode = 'auto';
|
|
scope.reloadCheck();
|
|
}
|
|
else {
|
|
clearPendingChangeFlag();
|
|
}
|
|
}
|
|
scope.onValueChange = function () {
|
|
scope.$emit(events.WIDGET_VALUE_CHANGE, { fieldName: scope.data.name, fieldValue: scope.data.value.riskLevel });
|
|
};
|
|
scope.riskLevel = function () {
|
|
return scope.data.value.riskLevelLabel ? scope.data.value.riskLevelLabel : '';
|
|
};
|
|
scope.overrideRiskLevelTitleEnabled = function () {
|
|
return scope.data.value.mode !== 'auto' || !scope.data.value.riskLevel;
|
|
};
|
|
scope.$watch('data.setValueFlag', function (value) {
|
|
if (value !== '#$#' && value) {
|
|
if (_.has(value, 'riskLevel')) {
|
|
Object.assign(scope.data.value, value);
|
|
}
|
|
else {
|
|
scope.data.value = value;
|
|
}
|
|
scope.onValueChange();
|
|
scope.data.setValueFlag = '#$#';
|
|
}
|
|
});
|
|
function init(isReload) {
|
|
if (scope.data.value.mode === 'auto') {
|
|
scope.data.modeCheck = true;
|
|
scope.loadRiskQuestions();
|
|
}
|
|
else {
|
|
if (isReload) {
|
|
scope.loadRiskQuestions();
|
|
}
|
|
scope.data.riskIsUserSpecified = true;
|
|
scope.$emit(events.RISK_MODE_MANUAL);
|
|
}
|
|
}
|
|
if (scope.data.name === 'changeRisk') {
|
|
scope.$on(events.RELOAD_RISK_QUESTION, function () {
|
|
init(true);
|
|
});
|
|
init();
|
|
}
|
|
}
|
|
};
|
|
}]);
|
|
}());
|