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