358 lines
23 KiB
JavaScript
358 lines
23 KiB
JavaScript
"use strict";
|
|
/**
|
|
* Created by igor.samulenko on 6/26/2014.
|
|
*/
|
|
(function () {
|
|
'use strict';
|
|
angular.module('ticketModule').controller('AssignController', ['$scope', '$modalInstance', 'userModel', 'screenConfigurationModel', 'ticketService', 'assignParams', 'events', 'systemAlertService', '$q', 'i18nService', 'objectValueMapperService',
|
|
function ($scope, $modalInstance, userModel, screenConfigurationModel, ticketService, assignParams, events, systemAlertService, $q, i18nService, objectValueMapperService) {
|
|
var state = {
|
|
processing: false,
|
|
isDraft: assignParams.isDraft,
|
|
ghostEntity: !!assignParams.ticket.ghostEntity
|
|
}, curAssignee, curAssigneeLoginId, curSupportGroup;
|
|
$scope.hideTabOnExpression = {
|
|
changeManager: false,
|
|
changeCoordinator: false
|
|
};
|
|
$scope.ticket = _.cloneDeep(assignParams.ticket);
|
|
$scope.ticketRef = assignParams.ticket;
|
|
$scope.isDraft = assignParams.isDraft;
|
|
if (assignParams.role) {
|
|
$scope[assignParams.role] = true;
|
|
$scope['assign' + assignParams.role] = true;
|
|
}
|
|
else if (assignParams.activeRole) {
|
|
$scope[assignParams.activeRole] = true;
|
|
}
|
|
var selectedAssignee = {
|
|
group: $scope.ticket.supportGroup && $scope.ticket.supportGroup.id ? new SupportGroupVO().build($scope.ticket.supportGroup) : {},
|
|
person: $scope.ticket.assignee && $scope.ticket.assignee.loginId ? new PersonVO().build($scope.ticket.assignee) : {},
|
|
isGroup: $scope.ticket.supportGroup && $scope.ticket.supportGroup.id && !$scope.ticket.assignee.loginId,
|
|
autoAssign: false
|
|
};
|
|
if ($scope.ticket.type === EntityVO.TYPE_INCIDENT || $scope.ticket.type === EntityVO.TYPE_WORKORDER
|
|
|| $scope.ticket.type === EntityVO.TYPE_TASK) {
|
|
curAssignee = objectValueMapperService.getValueByFieldName('assignee') || objectValueMapperService.getValueByFieldName('assigneeName');
|
|
curSupportGroup = objectValueMapperService.getValueByFieldName('assigneeSupportGroups') || objectValueMapperService.getValueByFieldName('supportGroups');
|
|
assignParams.ticket.assignee = curAssignee;
|
|
assignParams.ticket.supportGroup = curSupportGroup;
|
|
selectedAssignee = {
|
|
group: curSupportGroup && curSupportGroup.id ? curSupportGroup : selectedAssignee.group,
|
|
person: curAssignee && curAssignee.loginId ? curAssignee : selectedAssignee.person,
|
|
isGroup: curSupportGroup && curSupportGroup.id && !(curAssignee && curAssignee.loginId) || selectedAssignee.isGroup,
|
|
autoAssign: false
|
|
};
|
|
}
|
|
else if ($scope.ticket.type === EntityVO.TYPE_CHANGE) {
|
|
curAssignee = objectValueMapperService.getFieldByName('changeCoordinator') || objectValueMapperService.getFieldByName('assigneeName');
|
|
curSupportGroup = objectValueMapperService.getFieldByName('changeCoordinatorSupportGroups');
|
|
$scope.hideTabOnExpression.changeCoordinator = curAssignee.isReadOnly && curSupportGroup.isReadOnly;
|
|
if (curAssignee.assigneeLoginId) {
|
|
curAssigneeLoginId = curAssignee.assigneeLoginId;
|
|
}
|
|
curAssignee = curAssignee.value;
|
|
curSupportGroup = curSupportGroup.value;
|
|
selectedAssignee = {
|
|
group: curSupportGroup && curSupportGroup.id ? curSupportGroup : selectedAssignee.group,
|
|
person: curAssignee && curAssignee.loginId ? curAssignee : selectedAssignee.person,
|
|
isGroup: curSupportGroup && curSupportGroup.id && curAssignee && !curAssignee.loginId && !curAssigneeLoginId,
|
|
autoAssign: false
|
|
};
|
|
}
|
|
var selectedManager = {
|
|
group: $scope.ticket.managerGroup && $scope.ticket.managerGroup.id ? new SupportGroupVO().build($scope.ticket.managerGroup) : {},
|
|
person: $scope.ticket.manager && $scope.ticket.manager.loginId ? new PersonVO().build($scope.ticket.manager) : {},
|
|
isGroup: $scope.ticket.managerGroup && $scope.ticket.managerGroup.id && !$scope.ticket.manager.loginId,
|
|
autoAssign: false
|
|
};
|
|
var currentManager = assignParams.ticket.manager || assignParams.ticket.coordinator, currentManagerGroup = assignParams.ticket.managerGroup || assignParams.ticket.coordinatorGroup;
|
|
if ($scope.ticket.type === EntityVO.TYPE_PROBLEM || $scope.ticket.type === EntityVO.TYPE_KNOWNERROR) {
|
|
selectedManager = {
|
|
group: currentManagerGroup && currentManagerGroup.id ? new SupportGroupVO().build(currentManagerGroup) : {},
|
|
person: currentManager && currentManager.loginId ? new PersonVO().build(currentManager) : {},
|
|
isGroup: currentManagerGroup && currentManagerGroup.id && !currentManager.loginId,
|
|
autoAssign: false
|
|
};
|
|
}
|
|
if ($scope.ticket.type === EntityVO.TYPE_CHANGE) {
|
|
var curChangeManager = objectValueMapperService.getFieldByName('changeManager') || objectValueMapperService.getFieldByName('managerName'), curChangeManagerSupportGroup = objectValueMapperService.getFieldByName('changeManagerSupportGroups'), curChangeManagerLoginId;
|
|
$scope.hideTabOnExpression.changeManager = curChangeManager.isReadOnly && curChangeManagerSupportGroup.isReadOnly;
|
|
if (curChangeManager.assigneeLoginId) {
|
|
curChangeManagerLoginId = curChangeManager.assigneeLoginId;
|
|
}
|
|
curChangeManager = curChangeManager.value;
|
|
curChangeManagerSupportGroup = curChangeManagerSupportGroup.value;
|
|
selectedManager = {
|
|
group: curChangeManagerSupportGroup && curChangeManagerSupportGroup.id ? curChangeManagerSupportGroup : selectedManager.group,
|
|
person: curChangeManager && curChangeManager.loginId ? curChangeManager : selectedManager.person,
|
|
isGroup: curChangeManagerSupportGroup && curChangeManagerSupportGroup.id && curChangeManager && !curChangeManager.loginId && !curChangeManagerLoginId,
|
|
autoAssign: false
|
|
};
|
|
}
|
|
else if ($scope.ticket.type === EntityVO.TYPE_WORKORDER) {
|
|
var curRequestManager = objectValueMapperService.getFieldByName('requestManager') || objectValueMapperService.getFieldByName('managerName'), curRequestManagerSupportGroup = objectValueMapperService.getFieldByName('requestManagerSupportGroups');
|
|
$scope.hideTabOnExpression.requestManager = curRequestManager && curRequestManager.isReadOnly && curRequestManagerSupportGroup && curRequestManagerSupportGroup.isReadOnly;
|
|
if (curRequestManager) {
|
|
curRequestManager = curRequestManager.value;
|
|
}
|
|
if (curRequestManagerSupportGroup) {
|
|
curRequestManagerSupportGroup = curRequestManagerSupportGroup.value;
|
|
}
|
|
selectedManager = {
|
|
group: curRequestManagerSupportGroup && curRequestManagerSupportGroup.id ? curRequestManagerSupportGroup : selectedManager.group,
|
|
person: curRequestManager && curRequestManager.loginId ? curRequestManager : selectedManager.person,
|
|
isGroup: curRequestManagerSupportGroup && curRequestManagerSupportGroup.id && !(curRequestManager && curRequestManager.loginId) || selectedManager.isGroup,
|
|
autoAssign: false
|
|
};
|
|
}
|
|
var panel = screenConfigurationModel.getAssignmentPanel($scope.ticket);
|
|
var clonedPanel = angular.copy(panel);
|
|
var fields = panel.fields || [];
|
|
$scope.hideTabs = fields.length === 0 &&
|
|
$scope.ticket.type !== EntityVO.TYPE_WORKORDER &&
|
|
$scope.ticket.type !== EntityVO.TYPE_CHANGE &&
|
|
$scope.ticket.type !== EntityVO.TYPE_PROBLEM &&
|
|
$scope.ticket.type !== EntityVO.TYPE_KNOWNERROR;
|
|
$scope.groups = [];
|
|
var editedFields = clonedPanel.fields || [];
|
|
screenConfigurationModel.initFieldValues(editedFields, $scope.ticket);
|
|
$scope.customFields = editedFields;
|
|
var originalCustomFields = angular.copy(assignParams.ticket.customFields);
|
|
function handleFieldFormIsDirty() {
|
|
$scope.customFieldFormIsDirty = true;
|
|
$scope.customFieldFormIsValid = clonedPanel.isValid();
|
|
}
|
|
function assigneeCandidateSelected(selection) {
|
|
return selection.person.loginId || selection.isGroup;
|
|
}
|
|
function handleModalFormIsDirty() {
|
|
$scope.assignActionForm.$dirty = true;
|
|
}
|
|
function handleModalBackdropClick() {
|
|
$scope.close();
|
|
}
|
|
$scope.close = function () {
|
|
if ($scope.assignActionForm.$dirty) {
|
|
var modalInstance = systemAlertService.modal({
|
|
title: i18nService.getLocalizedString('common.notification.dirty.title'),
|
|
text: i18nService.getLocalizedString('common.notification.dirty.message'),
|
|
buttons: [
|
|
{
|
|
text: i18nService.getLocalizedString('common.labels.yes'),
|
|
data: true
|
|
},
|
|
{
|
|
text: i18nService.getLocalizedString('common.labels.no'),
|
|
data: false
|
|
}
|
|
]
|
|
});
|
|
modalInstance.result.then(function (data) {
|
|
if (data) {
|
|
assignParams.ticket = _.cloneDeep($scope.ticket);
|
|
$modalInstance.dismiss();
|
|
}
|
|
});
|
|
}
|
|
else {
|
|
assignParams.ticket = _.cloneDeep($scope.ticket);
|
|
$modalInstance.dismiss();
|
|
}
|
|
};
|
|
$scope.enableSave = function () {
|
|
return (selectedAssignee.person.loginId && selectedAssignee.person.supportGroupId && (!assignParams.ticket.assignee || selectedAssignee.person.loginId !== assignParams.ticket.assignee.loginId || selectedAssignee.person.supportGroupId !== assignParams.ticket.supportGroup.id))
|
|
|| (selectedAssignee.isGroup && ((assignParams.ticket.assignee && assignParams.ticket.assignee.id) || (!curSupportGroup || (selectedAssignee.group.id !== curSupportGroup.id))))
|
|
|| selectedAssignee.autoAssign
|
|
|| (selectedManager.person.loginId && selectedManager.person.supportGroupId && (selectedManager.person.loginId !== (currentManager || {}).loginId || selectedManager.person.supportGroupId !== (currentManagerGroup || {}).id))
|
|
|| (selectedManager.isGroup && (currentManager && currentManager.id || (!currentManagerGroup || (selectedManager.group.id !== currentManagerGroup.id))))
|
|
|| selectedManager.autoAssign
|
|
|| $scope.customFieldFormIsDirty && $scope.customFieldFormIsValid;
|
|
};
|
|
$scope.submit = function () {
|
|
state.processing = true;
|
|
var updates = {};
|
|
var attributesMap = {};
|
|
if (assigneeCandidateSelected(selectedAssignee) && !selectedAssignee.autoAssign) {
|
|
if (selectedAssignee.isGroup) {
|
|
if (selectedAssignee.group && $scope.ticket.supportGroup) {
|
|
if ((selectedAssignee.person.loginId !== $scope.ticket.assignee.loginId) || (selectedAssignee.group.id !== $scope.ticket.supportGroup.id)) {
|
|
attributesMap = {
|
|
group: selectedAssignee.group.name,
|
|
groupId: selectedAssignee.group.id,
|
|
company: selectedAssignee.group.company.name,
|
|
organization: selectedAssignee.group.organization,
|
|
autoAssign: false
|
|
};
|
|
}
|
|
selectedAssignee.person = {};
|
|
}
|
|
}
|
|
else {
|
|
if (selectedAssignee.group.id === 'All') {
|
|
if (selectedAssignee.person.supportGroups && selectedAssignee.person.supportGroups.length > 0) {
|
|
if (selectedAssignee.person.supportGroupId) {
|
|
selectedAssignee.group = _.find(selectedAssignee.person.supportGroups, { id: selectedAssignee.person.supportGroupId });
|
|
}
|
|
selectedAssignee.group = selectedAssignee.group || selectedAssignee.person.supportGroups[0];
|
|
}
|
|
else if ($scope.ticket.supportGroup && $scope.ticket.supportGroup.id) {
|
|
selectedAssignee.group = new SupportGroupVO().build($scope.ticket.supportGroup);
|
|
}
|
|
}
|
|
if (selectedAssignee.person.loginId !== $scope.ticket.assignee.loginId || selectedAssignee.group.id !== $scope.ticket.supportGroup.id) {
|
|
attributesMap = {
|
|
loginId: selectedAssignee.person.loginId,
|
|
fullName: selectedAssignee.person.fullName,
|
|
group: selectedAssignee.group && selectedAssignee.group.name ? selectedAssignee.group.name : '',
|
|
groupId: selectedAssignee.group && selectedAssignee.group.id ? selectedAssignee.group.id : '',
|
|
company: selectedAssignee.group && selectedAssignee.group.company && selectedAssignee.group.company.name ? selectedAssignee.group.company.name : '',
|
|
organization: selectedAssignee.group && selectedAssignee.group.organization ? selectedAssignee.group.organization : '',
|
|
autoAssign: false
|
|
};
|
|
}
|
|
}
|
|
}
|
|
else {
|
|
attributesMap = {
|
|
autoAssign: true
|
|
};
|
|
selectedAssignee = { person: {}, group: {} };
|
|
}
|
|
var managerAttributesMap = {};
|
|
if (assigneeCandidateSelected(selectedManager) && !selectedManager.autoAssign) {
|
|
if (selectedManager.isGroup) {
|
|
if ($scope.ticket.type === EntityVO.TYPE_PROBLEM || $scope.ticket.type === EntityVO.TYPE_KNOWNERROR) {
|
|
if (selectedManager.group.id !== $scope.ticket.coordinatorGroup.id || (selectedManager.person.loginId !== ($scope.ticket.coordinator && $scope.ticket.coordinator.loginId))) {
|
|
managerAttributesMap = {
|
|
coordinatorGroup: selectedManager.group.name,
|
|
coordinatorCompany: selectedManager.group.company.name,
|
|
coordinatorOrganization: selectedManager.group.organization,
|
|
coordinatorGroupId: selectedManager.group.id,
|
|
coordinatorAutoAssign: false
|
|
};
|
|
}
|
|
}
|
|
else {
|
|
if ((selectedManager.person.loginId !== ($scope.ticket.manager && $scope.ticket.manager.loginId))
|
|
|| (selectedManager.group.id !== ($scope.ticket.managerGroup && $scope.ticket.managerGroup.id))) {
|
|
managerAttributesMap = {
|
|
managerGroup: selectedManager.group.name,
|
|
managerCompany: selectedManager.group.company.name,
|
|
managerOrganization: selectedManager.group.organization,
|
|
managerGroupId: selectedManager.group.id,
|
|
managerAutoAssign: false
|
|
};
|
|
}
|
|
selectedManager.person = {};
|
|
}
|
|
}
|
|
else {
|
|
if (selectedManager.group.id === 'All') {
|
|
if (selectedManager.person.supportGroups && selectedManager.person.supportGroups.length > 0) {
|
|
if (selectedManager.person.supportGroupId) {
|
|
selectedManager.group = _.find(selectedManager.person.supportGroups, { id: selectedManager.person.supportGroupId });
|
|
}
|
|
selectedManager.group = selectedManager.group || selectedManager.person.supportGroups[0];
|
|
}
|
|
else if (currentManagerGroup && currentManagerGroup.id) {
|
|
selectedManager.group = new SupportGroupVO().build(currentManagerGroup);
|
|
}
|
|
}
|
|
if ($scope.ticket.type === EntityVO.TYPE_PROBLEM || $scope.ticket.type === EntityVO.TYPE_KNOWNERROR) {
|
|
managerAttributesMap = {
|
|
coordinatorLoginId: selectedManager.person.loginId,
|
|
coordinatorFullName: selectedManager.person.fullName,
|
|
coordinatorGroup: selectedManager.group.name,
|
|
coordinatorCompany: selectedManager.group.company.name,
|
|
coordinatorOrganization: selectedManager.group.organization,
|
|
coordinatorGroupId: selectedManager.group.id,
|
|
coordinatorAutoAssign: false
|
|
};
|
|
}
|
|
else {
|
|
managerAttributesMap = {
|
|
managerLoginId: selectedManager.person.loginId,
|
|
managerFullName: selectedManager.person.fullName,
|
|
managerGroup: selectedManager.group.name,
|
|
managerCompany: selectedManager.group.company.name,
|
|
managerOrganization: selectedManager.group.organization,
|
|
managerGroupId: selectedManager.group.id,
|
|
managerAutoAssign: false
|
|
};
|
|
}
|
|
}
|
|
}
|
|
else {
|
|
managerAttributesMap = ($scope.ticket.type === EntityVO.TYPE_PROBLEM || $scope.ticket.type === EntityVO.TYPE_KNOWNERROR) ? { coordinatorAutoAssign: true } : { managerAutoAssign: true };
|
|
}
|
|
updates = _.merge(attributesMap, managerAttributesMap);
|
|
if (fields.length) {
|
|
var changes = screenConfigurationModel.collectChanges($scope.customFields, originalCustomFields);
|
|
if (_.size(changes)) {
|
|
updates = _.merge(updates, { customFields: changes });
|
|
}
|
|
}
|
|
var updateFn = state.isDraft ? $q.when : ticketService.update;
|
|
updateFn($scope.ticket.id, $scope.ticket.type, updates).then(function (results) {
|
|
var response = {
|
|
originalObject: results,
|
|
autoAssign: updates.autoAssign,
|
|
assignee: (results && results.assignee) || selectedAssignee.person,
|
|
group: selectedAssignee.group,
|
|
managerAutoAssign: updates.managerAutoAssign,
|
|
manager: selectedManager.person,
|
|
managerGroup: selectedManager.group,
|
|
coordinatorAutoAssign: updates.coordinatorAutoAssign
|
|
};
|
|
response.group.assignedToGroup = selectedAssignee.isGroup;
|
|
response.managerGroup.assignedToGroup = selectedManager.isGroup;
|
|
if (!state.isDraft && !_.isEmpty(results)) {
|
|
response.accessMappings = results.accessMappings || {};
|
|
response.status = results.status || {};
|
|
response.changes = results.customFields || {};
|
|
if (updates.autoAssign) {
|
|
response.assignee = results.assignee || {};
|
|
response.group = results.supportGroup || {};
|
|
}
|
|
if (updates.coordinatorAutoAssign) {
|
|
response.manager = results.coordinator;
|
|
response.managerGroup = results.coordinatorGroup;
|
|
}
|
|
if (updates.managerAutoAssign) {
|
|
response.manager = results.manager;
|
|
response.managerGroup = results.managerGroup;
|
|
}
|
|
}
|
|
else if (state.isDraft && !_.isUndefined(updates.customFields)) {
|
|
response.changes = updates.customFields;
|
|
}
|
|
response.group.persons = [];
|
|
if (updates.customFields) {
|
|
_.forOwn(updates.customFields, function (val, key) {
|
|
if (typeof response.changes[key] === 'undefined') {
|
|
response.changes[key] = '';
|
|
}
|
|
});
|
|
}
|
|
$modalInstance.close(response);
|
|
}).finally(function () {
|
|
state.processing = false;
|
|
});
|
|
};
|
|
$scope.$on(events.FIELD_FORM_IS_DIRTY, handleFieldFormIsDirty);
|
|
$scope.$on(events.MODAL_FORM_IS_DIRTY, handleModalFormIsDirty);
|
|
$scope.$on(events.MODAL_BACKDROP_CLICK, handleModalBackdropClick);
|
|
$scope.selectedAssignee = selectedAssignee;
|
|
$scope.selectedManager = selectedManager;
|
|
$scope.state = state;
|
|
//Set $dirty true for the first time the blade is loaded.
|
|
setTimeout(function () {
|
|
if ($scope.assignActionForm) {
|
|
$scope.assignActionForm.$dirty = false;
|
|
}
|
|
}, 0);
|
|
}
|
|
]);
|
|
})();
|