SmartIT_Extensions/BMC/smart-it-full-helix/scripts/app/problem/problem-details-editor-dire...

195 lines
11 KiB
JavaScript

"use strict";
/**
* Created by ygowtham on 7/14/2015.
*/
(function () {
'use strict';
angular.module('ticketModule')
.directive('problemDetailsEditor', ['events', 'userModel', 'systemAlertService', '$filter', 'screenConfigurationModel', 'ticketModel', 'categoriesService', 'searchModel',
function (events, userModel, systemAlertService, $filter, screenConfigurationModel, ticketModel, categoriesService, searchModel) {
return {
restrict: 'E',
replace: true,
templateUrl: 'views/problem/problem-details-editor.html',
scope: {
ticket: '=',
metadata: '=',
form: '=',
updateIsHandledByParent: '='
},
link: function (scope) {
scope.state = {
tooManyCompanies: false
};
scope.siteOptions = {
company: {
visible: false,
attribute: 'companyName'
},
region: {
attribute: 'region'
},
siteGroup: {
attribute: 'siteGroup'
},
site: {
attribute: 'name'
}
};
scope.selections = {
investigationDrivers: scope.metadata.investigationDrivers,
companies: [],
rootCause: []
};
scope.getCompaniesByName = function (name) {
return searchModel.getCompaniesByText(name).then(function (response) {
return { list: response.companies, exceedsChunkSize: response.exceedsChunkSize };
});
};
searchModel.getOperatingCompanies(null, -1).then(function (response) {
scope.selections.companies = _.cloneDeep(response.companies);
scope.state.tooManyCompanies = response.exceedsChunkSize;
});
scope.updatedInfo = {
location: scope.ticket.location ? scope.ticket.location : {}
};
scope.updatedInfo.location.companyName = scope.ticket.company.name;
getRootCause(null, scope.ticket.categorizations);
scope.updateCompany = function () {
showCompanyChangeDialog().then(function (result) {
if (result) {
scope.$broadcast(events.CLEAR_AFFECTED_SERVICE, scope.updatedInfo.company);
scope.$broadcast(events.CLEAR_CATEGORY_DETAILS, scope.updatedInfo.company);
scope.$broadcast(events.CLEAR_FOUNDATION_SERVICE, scope.updatedInfo.company);
scope.updatedInfo.rootCause = { name: '' };
}
else {
scope.updatedInfo.company = scope.ticket.company;
}
});
};
scope.buildSiteTag = function (site) {
var siteGroup = site.siteGroup ? ' > ' + site.siteGroup : '', siteName = site.name ? ' > ' + site.name : '', siteRegion = site.region ? site.region : '';
return siteRegion + siteGroup + siteName;
};
function showCompanyChangeDialog() {
var modal = systemAlertService.modal({
type: 'info',
title: $filter('i18n')('common.notification.dirty.title'),
text: $filter('i18n')('create.problem.companyChange.warning'),
buttons: [
{
text: $filter('i18n')('common.button.yes'),
data: true
},
{
text: $filter('i18n')('common.button.no'),
data: false
}
]
});
return modal.result;
}
scope.clear = function (attribute) {
scope.updatedInfo[attribute] = null;
};
function toggleEditMode() {
scope.editMode = true;
getInitialUpdateData();
}
function getInitialUpdateData() {
scope.isDescRequired = _.includes(scope.metadata && scope.metadata.requiredOOTBObjectName, 'desc');
scope.updatedInfo = {
location: scope.ticket.location ? scope.ticket.location : {},
company: scope.ticket.company,
workaround: scope.ticket.workaround,
resolution: scope.ticket.resolution,
rootCause: scope.ticket.rootCause ? { name: scope.ticket.rootCause } : null,
investigationDriver: !scope.ticket.investigationDriver ? '' : _.find(scope.metadata.investigationDrivers, function (obj) {
return obj.name === scope.ticket.investigationDriver;
}) || { name: scope.ticket.investigationDriver }
};
scope.updatedInfo.location.companyName = scope.updatedInfo.company.name; //necessary in order to limit the search for sites based on company
}
function handleSaveChanges() {
var changes = collectChanges();
var singleMode = !scope.updateIsHandledByParent;
scope.$emit(events.SAVE_CHANGES_REQUEST, changes, singleMode || scope.ticket.isDraft);
}
function collectChanges() {
var problemChanges = {};
if (scope.updatedInfo.company.name !== scope.ticket.company.name) {
problemChanges.company = scope.updatedInfo.company.name;
}
if (scope.updatedInfo.investigationDriver.name !== scope.ticket.investigationDriver) {
problemChanges.investigationDriver = scope.updatedInfo.investigationDriver.name;
}
if (scope.updatedInfo.location !== scope.ticket.location) {
problemChanges.location = scope.updatedInfo.location;
}
if (scope.updatedInfo.workaround !== scope.ticket.workaround) {
problemChanges.workaround = scope.updatedInfo.workaround;
}
if (scope.updatedInfo.resolution !== scope.ticket.resolution) {
problemChanges.resolution = scope.updatedInfo.resolution;
}
problemChanges.rootCause = scope.updatedInfo.rootCause ? scope.updatedInfo.rootCause.name : '';
return problemChanges;
}
function close() {
scope.editMode = false;
}
function handleSaveComplete(event, eventData) {
if (!_.isEmpty(eventData)) {
scope.ticket.company = eventData.company ? eventData.company : scope.ticket.company;
scope.ticket.investigationDriver = eventData.investigationDriver ? eventData.investigationDriver : scope.ticket.investigationDriver;
scope.ticket.location = eventData.location ? eventData.location : scope.ticket.location;
scope.ticket.workaround = eventData.workaround ? eventData.workaround : "";
scope.ticket.resolution = eventData.resolution ? eventData.resolution : "";
scope.ticket.rootCause = eventData.rootCause ? eventData.rootCause : "";
}
if (scope.ticket.isDraft) {
applyChanges();
scope.$emit(events.SAVE_CHANGES_COMPLETE);
}
close();
}
function applyChanges() {
scope.ticket.company = scope.updatedInfo.company.name !== scope.ticket.company.name ? scope.updatedInfo.company.name : scope.ticket.company;
scope.ticket.investigationDriver = scope.updatedInfo.investigationDriver.name !== scope.ticket.investigationDriver ? scope.updatedInfo.investigationDriver.name : scope.ticket.investigationDriver;
scope.ticket.location = scope.updatedInfo.location !== scope.ticket.location ? scope.updatedInfo.location : scope.ticket.location;
scope.ticket.rootCause = scope.updatedInfo.rootCause ? scope.updatedInfo.rootCause.name : '';
scope.ticket.workaround = scope.updatedInfo.workaround !== scope.ticket.workaround ? scope.updatedInfo.workaround : scope.ticket.workaround;
scope.ticket.resolution = scope.updatedInfo.resolution !== scope.ticket.resolution ? scope.updatedInfo.resolution : scope.ticket.resolution;
}
function handleSaveFault() {
scope.$broadcast(events.SAVE_CHANGES_COMPLETE); //needed to reset the child scopes of all contained directives
close();
}
scope.hasCustomFields = function (panelId) {
var panel = screenConfigurationModel.getPanelById(panelId);
return panel && panel.hasCustomFields();
};
function getRootCause(event, data) {
var params = {};
params.depends = categoriesService.buildCategoriesForRootCause(data, scope.metadata.allCategories);
params.depends.productManufacturer = null;
ticketModel.getRootCause(params, scope.ticket.company).then(function (response) {
if (response) {
scope.selections.rootCause = response;
}
});
}
getInitialUpdateData();
scope.$on(events.TICKET_UPDATE_ROOTCAUSE, getRootCause);
scope.$on(events.SAVE_CHANGES, handleSaveChanges);
scope.$on(events.TOGGLE_EDIT_MODE, toggleEditMode);
scope.$on(events.SAVE_ALL_CHANGES_COMPLETE, handleSaveComplete);
scope.$on(events.SAVE_ALL_CHANGES_FAULT, handleSaveFault);
scope.$on(events.DISCARD_CHANGES, close);
}
};
}
]);
})();