SmartIT_Extensions/BMC/smart-it-full-helix/scripts/app/custom-widgets/ticket-risk-directive.js

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();
}
}
};
}]);
}());