790 lines
56 KiB
JavaScript
790 lines
56 KiB
JavaScript
"use strict";
|
|
(function () {
|
|
'use strict';
|
|
angular.module('myitsmApp')
|
|
.directive('assigneeChooser', ['ticketService', 'searchModel', 'userModel', '$q', 'i18nService', 'events', '$timeout', 'objectValueMapperService',
|
|
function (ticketService, searchModel, userModel, $q, i18nService, events, $timeout, objectValueMapperService) {
|
|
return {
|
|
restrict: 'EA',
|
|
scope: {
|
|
ticket: '=',
|
|
assignee: '=',
|
|
role: '@',
|
|
label: "=",
|
|
assignToMe: '=?',
|
|
isDraft: '='
|
|
},
|
|
templateUrl: 'views/common/assignee-chooser-directive.html',
|
|
link: function (scope) {
|
|
var role = '', state = {
|
|
processing: true,
|
|
tooManyCompanies: false,
|
|
tooManyOrganizations: false,
|
|
tooManySupportGroups: false,
|
|
tooManySupportPeople: false
|
|
}, allCompanies = {
|
|
name: i18nService.getLocalizedString('assignBlade.company.all'),
|
|
id: 'All'
|
|
}, allOrganizations = {
|
|
name: i18nService.getLocalizedString('assignBlade.organization.all'),
|
|
id: 'All'
|
|
}, allSupportGroups = {
|
|
name: i18nService.getLocalizedString('assignBlade.supportGroup.all'),
|
|
id: 'All'
|
|
}, timerPromise, pauseInterval = 2000;
|
|
scope.assigneeCompany = {};
|
|
scope.assigneeOrganization = {};
|
|
scope.companies = [];
|
|
scope.assignment = {
|
|
organizations: [],
|
|
groups: []
|
|
};
|
|
scope.organizations = [];
|
|
scope.groups = [];
|
|
scope.search = { text: '', filterText: '' };
|
|
scope.selectedParent = {};
|
|
scope.conditions = {
|
|
showAssignToGroup: true,
|
|
showAssignToMe: true
|
|
};
|
|
scope.searchUser = function (row) {
|
|
var searchText = (scope.search.filterText || '').toLowerCase();
|
|
return (row.fullName.toLowerCase().indexOf(searchText) !== -1 ||
|
|
row.loginId.toLowerCase().indexOf(searchText) !== -1 ||
|
|
row.email.toLowerCase().indexOf(searchText) !== -1 ||
|
|
row.id.toLowerCase().indexOf(searchText) !== -1);
|
|
};
|
|
function init() {
|
|
if (scope.role) {
|
|
role = scope.role;
|
|
}
|
|
else if (scope.ticket.type === EntityVO.TYPE_WORKORDER) {
|
|
role = 'workorderassignee';
|
|
}
|
|
else if (scope.ticket.type === EntityVO.TYPE_RELEASE) {
|
|
role = 'releasecoordinator';
|
|
}
|
|
else if (scope.ticket.type === EntityVO.TYPE_KNOWLEDGE) {
|
|
var ticketStatusValue = scope.ticket.status ? scope.ticket.status.value : scope.ticket.statusValue ? scope.ticket.statusValue.value : '';
|
|
role = 'knowledgeassignee';
|
|
if (ticketStatusValue !== EntityVO.STATUS_CONTENT_REVIEW && ticketStatusValue !== EntityVO.STATUS_SME_REVIEW) {
|
|
scope.conditions.showAssignToGroup = false;
|
|
}
|
|
}
|
|
else if (scope.ticket.type === EntityVO.TYPE_CHANGE) {
|
|
role = 'changecoordinator';
|
|
}
|
|
if (scope.ticket.accessMappings) {
|
|
if (scope.role === 'changecoordinator' || scope.role === 'problemcoordinator') {
|
|
scope.conditions.showAssignToMe = scope.ticket.accessMappings.coordinatorSelfAssignmentAllowed;
|
|
}
|
|
else if (scope.role === 'workordermanager' || scope.role === 'changemanager') {
|
|
scope.conditions.showAssignToMe = scope.ticket.accessMappings.managerSelfAssignmentAllowed;
|
|
}
|
|
else if (role === 'knowledgeassignee') {
|
|
scope.conditions.showAssignToMe = scope.ticket.accessMappings['assignee-self-assignmentEditAllowed'];
|
|
}
|
|
else if (!scope.role) {
|
|
scope.conditions.showAssignToMe = scope.ticket.accessMappings.assigneeSelfAssignmentAllowed;
|
|
}
|
|
}
|
|
if (scope.ticket.type === EntityVO.TYPE_PROBLEM || scope.ticket.type === EntityVO.TYPE_KNOWNERROR
|
|
|| scope.ticket.type === EntityVO.TYPE_RELEASE) {
|
|
scope.conditions.showAssignToMe = userModel.userFullData.availableForAssignment;
|
|
}
|
|
if (scope.assignee.person && scope.assignee.person.loginId === userModel.userFullData.loginId && scope.ticket.type !== EntityVO.TYPE_ACTIVITY) {
|
|
scope.assignToMe = true;
|
|
}
|
|
if (scope.ticket.type === EntityVO.TYPE_CHANGE && (scope.role == "changecoordinator" && scope.ticket.supportGroup && scope.ticket.supportGroup.id !== (scope.assignee.person.supportGroupId))) {
|
|
scope.assignee.person.supportGroupId = scope.ticket.supportGroup.id;
|
|
scope.assignee.person.supportGroup = scope.ticket.supportGroup.name;
|
|
}
|
|
else if (scope.ticket.type === EntityVO.TYPE_PROBLEM || scope.ticket.type === EntityVO.TYPE_KNOWNERROR) {
|
|
if (scope.role === "problemcoordinator" && scope.ticket.coordinatorGroup && scope.ticket.coordinatorGroup.id !== (scope.assignee.person.supportGroupId || scope.assignee.group.id)) {
|
|
scope.assignee.person.supportGroupId = scope.ticket.coordinatorGroup.id;
|
|
scope.assignee.person.supportGroup = scope.ticket.coordinatorGroup.name;
|
|
}
|
|
else if (scope.role !== "problemcoordinator" && scope.ticket.supportGroup && scope.ticket.supportGroup.id && (scope.ticket.supportGroup.id !== scope.assignee.group.id || scope.ticket.supportGroup.id !== scope.assignee.person.supportGroupId)) {
|
|
scope.assignee.person.supportGroupId = scope.ticket.supportGroup.id;
|
|
scope.assignee.person.supportGroup = scope.ticket.supportGroup.name;
|
|
}
|
|
}
|
|
getCompanies().then(function () {
|
|
var customerCompany = null;
|
|
if (scope.assignee.group.id || scope.assignToMe) {
|
|
var promises = [], locationCompany = null, ownerCompany = null, authorCompany = null, primaryCompany = null;
|
|
if (scope.ticket.type !== EntityVO.TYPE_KNOWLEDGE) {
|
|
customerCompany = getCustomerCompanyName();
|
|
if ((scope.ticket.type === EntityVO.TYPE_TASK || scope.ticket.type === EntityVO.TYPE_CHANGE) && scope.ticket.id && scope.ticket.company) {
|
|
locationCompany = scope.ticket.company.name;
|
|
}
|
|
else if (!(scope.ticket instanceof TicketConsoleItemVO) && (scope.ticket.type === EntityVO.TYPE_INCIDENT || scope.ticket.type === EntityVO.TYPE_WORKORDER)) {
|
|
locationCompany = objectValueMapperService.getExactValueByFieldName('locationCompany');
|
|
}
|
|
else {
|
|
locationCompany = scope.ticket.locationCompany ? scope.ticket.locationCompany.name : null;
|
|
}
|
|
}
|
|
else {
|
|
primaryCompany = getPrimaryCompany().name;
|
|
ownerCompany = scope.ticket.owner && scope.ticket.owner.company ? scope.ticket.owner.company.name : '';
|
|
authorCompany = scope.ticket.author && scope.ticket.author.company ? scope.ticket.author.company.name : '';
|
|
}
|
|
scope.assigneeCompany = scope.assignee.group.company || {};
|
|
scope.assigneeOrganization = scope.assignee.group.organization ? { name: scope.assignee.group.organization } : allOrganizations;
|
|
if (scope.assignToMe) {
|
|
scope.assigneeCompany = allCompanies;
|
|
scope.assigneeOrganization = allOrganizations;
|
|
scope.assignee.group = allSupportGroups;
|
|
scope.assignee.isGroup = false;
|
|
scope.search.text = userModel.userFullData.fullName;
|
|
scope.assigneeLoginId = userModel.userFullData.loginId;
|
|
scope.conditions.showAssignToGroup = false;
|
|
if ((scope.ticket.type === EntityVO.TYPE_TASK || scope.ticket.type === EntityVO.TYPE_ACTIVITY) && _.isUndefined(customerCompany)) {
|
|
customerCompany = scope.ticket.company && scope.ticket.company.name;
|
|
}
|
|
}
|
|
promises.push(getSupportOrganizationsForCompany(scope.assigneeCompany, role, customerCompany, locationCompany, ownerCompany, primaryCompany, authorCompany));
|
|
promises.push(getSupportGroupsForCompanyAndOrg(scope.assigneeCompany, scope.assigneeOrganization, role, customerCompany, locationCompany, ownerCompany, primaryCompany, authorCompany));
|
|
if (scope.ticket.type !== EntityVO.TYPE_KNOWLEDGE) {
|
|
promises.push(ticketService.getAssigneeBySupportGroupId(scope.assignee.group.id === 'All' ? '' : scope.assignee.group.id, scope.search.text, scope.assigneeLoginId, customerCompany, role, null, true, null, locationCompany, null, null, true));
|
|
}
|
|
else {
|
|
promises.push(ticketService.getAssigneeBySupportGroupId(scope.assignee.group.id === 'All' ? '' : scope.assignee.group.id, scope.search.text, scope.assigneeLoginId, customerCompany, role, null, true, primaryCompany, '', ownerCompany, authorCompany, true));
|
|
}
|
|
$q.all(promises).then(function (results) {
|
|
scope.assignment.organizations = results[0];
|
|
scope.assignment.groups = results[1];
|
|
state.tooManySupportPeople = results[2].exceedsChunkSize;
|
|
if (results[2].results.length) {
|
|
handleMembers(results[2].results);
|
|
}
|
|
}).finally(completeProcessing);
|
|
}
|
|
else {
|
|
scope.assigneeCompany = {};
|
|
customerCompany = {};
|
|
if (scope.ticket.customer && scope.ticket.customer.company && !_.isEmpty(scope.ticket.customer.company)) {
|
|
customerCompany = scope.ticket.customer.company;
|
|
}
|
|
else if (scope.ticket.selectedCompany) {
|
|
customerCompany = { name: scope.ticket.selectedCompany };
|
|
}
|
|
else if (scope.ticket.author && scope.ticket.author.company) {
|
|
customerCompany = scope.ticket.author.company;
|
|
}
|
|
else if (scope.ticket.company) {
|
|
customerCompany = scope.ticket.company;
|
|
}
|
|
if (customerCompany.name && scope.companies.length) {
|
|
_.some(scope.companies, function (company) {
|
|
if (company.name === customerCompany.name) {
|
|
scope.assigneeCompany = company;
|
|
return true;
|
|
}
|
|
});
|
|
}
|
|
scope.selectCompany(scope.assigneeCompany);
|
|
}
|
|
});
|
|
}
|
|
scope.selectAssignToMe = function () {
|
|
if (scope.assignToMe) {
|
|
scope.assigneeCompany = allCompanies;
|
|
scope.assigneeOrganization = allOrganizations;
|
|
scope.assignee.group = allSupportGroups;
|
|
scope.assignee.isGroup = false;
|
|
scope.search.text = userModel.userFullData.fullName;
|
|
scope.assigneeLoginId = userModel.userFullData.loginId;
|
|
scope.conditions.showAssignToGroup = false;
|
|
scope.onSearchTextChanged();
|
|
}
|
|
else {
|
|
scope.search.text = '';
|
|
scope.assigneeLoginId = '';
|
|
scope.conditions.showAssignToGroup = true;
|
|
if (scope.ticket.type === EntityVO.TYPE_KNOWLEDGE) {
|
|
var ticketStatusValue = scope.ticket.status ? scope.ticket.status.value : scope.ticket.statusValue ? scope.ticket.statusValue.value : '';
|
|
if (ticketStatusValue !== EntityVO.STATUS_CONTENT_REVIEW && ticketStatusValue !== EntityVO.STATUS_SME_REVIEW) {
|
|
scope.conditions.showAssignToGroup = false;
|
|
}
|
|
}
|
|
scope.selectedParent = {};
|
|
scope.selectGroup(scope.assignee.group);
|
|
}
|
|
};
|
|
scope.selectCompany = function (company) {
|
|
state.processing = true;
|
|
scope.assigneeCompany = company || {};
|
|
scope.assignment.organizations = [];
|
|
scope.assigneeOrganization = allOrganizations;
|
|
scope.assignment.groups = [];
|
|
scope.assignee.group = {};
|
|
scope.assignee.group.persons = [];
|
|
scope.assignee.person = {};
|
|
scope.assignee.isGroup = false;
|
|
var promises = [], customerCompany = null, locationCompany = null, ownerCompany = null, authorCompany = null, primaryCompany = null;
|
|
if (scope.ticket.type === EntityVO.TYPE_KNOWLEDGE) {
|
|
primaryCompany = getPrimaryCompany().name;
|
|
ownerCompany = scope.ticket.owner.company ? scope.ticket.owner.company.name : '';
|
|
authorCompany = scope.ticket.author.company ? scope.ticket.author.company.name : '';
|
|
if (primaryCompany === "All") {
|
|
primaryCompany = null;
|
|
}
|
|
}
|
|
else {
|
|
if (!(scope.ticket instanceof TicketConsoleItemVO) && (scope.ticket.type === EntityVO.TYPE_INCIDENT || scope.ticket.type === EntityVO.TYPE_WORKORDER)) {
|
|
customerCompany = objectValueMapperService.getExactValueByFieldName('customerCompany') || '';
|
|
}
|
|
else {
|
|
customerCompany = (scope.ticket.customer && scope.ticket.customer.company && !_.isEmpty(scope.ticket.customer.company)) ? scope.ticket.customer.company.name : (scope.ticket.company ? scope.ticket.company.name : '');
|
|
}
|
|
if ((scope.ticket.type === EntityVO.TYPE_TASK || scope.ticket.type === EntityVO.TYPE_CHANGE) && scope.ticket.id && scope.ticket.company) {
|
|
locationCompany = scope.ticket.company.name;
|
|
}
|
|
else if (!(scope.ticket instanceof TicketConsoleItemVO) && (scope.ticket.type === EntityVO.TYPE_INCIDENT || scope.ticket.type === EntityVO.TYPE_WORKORDER)) {
|
|
locationCompany = objectValueMapperService.getExactValueByFieldName('locationCompany');
|
|
}
|
|
else {
|
|
locationCompany = scope.ticket.locationCompany ? scope.ticket.locationCompany.name : null;
|
|
}
|
|
}
|
|
if (scope.assigneeCompany.name) {
|
|
promises.push(getSupportOrganizationsForCompany(scope.assigneeCompany, role, customerCompany, locationCompany, ownerCompany, primaryCompany, authorCompany));
|
|
promises.push(getSupportGroupsForCompanyAndOrg(scope.assigneeCompany, scope.assigneeOrganization, role, customerCompany, locationCompany, ownerCompany, primaryCompany, authorCompany));
|
|
promises.push(ticketService.getAssigneeSupportGroupPersons(scope.assigneeCompany.id === 'All' ? '' : scope.assigneeCompany.name, '', (scope.search.text ? scope.search.text : ''), '', role, null, customerCompany, locationCompany, ownerCompany, primaryCompany, authorCompany, true, true));
|
|
}
|
|
$q.all(promises).then(function (results) {
|
|
scope.assignment.organizations = results[0];
|
|
scope.assignment.groups = results[1];
|
|
if ((scope.assignment.groups && scope.assignment.groups.length) || state.tooManySupportGroups) {
|
|
allSupportGroups.persons = [];
|
|
scope.assignee.group = allSupportGroups;
|
|
}
|
|
state.tooManySupportPeople = results[2] && results[2].exceedsChunkSize;
|
|
if (scope.assignToMe) {
|
|
scope.onSearchTextChanged();
|
|
}
|
|
else if (results[2].results.length) {
|
|
handleMembers(results[2].results);
|
|
}
|
|
completeProcessing();
|
|
}).catch(completeProcessing);
|
|
};
|
|
scope.selectOrganization = function (organization) {
|
|
state.processing = true;
|
|
scope.assigneeOrganization = organization;
|
|
scope.assignee.group = {};
|
|
scope.assignee.group.persons = [];
|
|
scope.assignee.person = {};
|
|
scope.assignee.isGroup = false;
|
|
var promises = [], customerCompany = null, locationCompany = null, ownerCompany = null, authorCompany = null, primaryCompany = null;
|
|
if (scope.ticket.type === EntityVO.TYPE_KNOWLEDGE) {
|
|
primaryCompany = getPrimaryCompany().name;
|
|
ownerCompany = scope.ticket.owner.company ? scope.ticket.owner.company.name : '';
|
|
authorCompany = scope.ticket.author.company ? scope.ticket.author.company.name : '';
|
|
if (primaryCompany === "All") {
|
|
primaryCompany = null;
|
|
}
|
|
}
|
|
else {
|
|
if (!(scope.ticket instanceof TicketConsoleItemVO) && (scope.ticket.type === EntityVO.TYPE_INCIDENT || scope.ticket.type === EntityVO.TYPE_WORKORDER)) {
|
|
customerCompany = objectValueMapperService.getExactValueByFieldName('customerCompany') || '';
|
|
}
|
|
else {
|
|
customerCompany = (scope.ticket.customer && scope.ticket.customer.company && !_.isEmpty(scope.ticket.customer.company)) ? scope.ticket.customer.company.name : (scope.ticket.company ? scope.ticket.company.name : '');
|
|
}
|
|
if ((scope.ticket.type === EntityVO.TYPE_TASK || scope.ticket.type === EntityVO.TYPE_CHANGE) && scope.ticket.id && scope.ticket.company) {
|
|
locationCompany = scope.ticket.company.name;
|
|
}
|
|
else if (!(scope.ticket instanceof TicketConsoleItemVO) && (scope.ticket.type === EntityVO.TYPE_INCIDENT || scope.ticket.type === EntityVO.TYPE_WORKORDER)) {
|
|
locationCompany = objectValueMapperService.getExactValueByFieldName('locationCompany');
|
|
}
|
|
else {
|
|
locationCompany = scope.ticket.locationCompany ? scope.ticket.locationCompany.name : null;
|
|
}
|
|
}
|
|
promises.push(getSupportGroupsForCompanyAndOrg(scope.assigneeCompany, scope.assigneeOrganization, role, customerCompany, locationCompany, ownerCompany, primaryCompany, authorCompany));
|
|
promises.push(ticketService.getAssigneeSupportGroupPersons(scope.assigneeCompany.id === 'All' ? '' : scope.assigneeCompany.name, organization.id === 'All' ? '' : organization.name, (scope.search.text ? scope.search.text : ''), '', role, null, customerCompany, locationCompany, ownerCompany, primaryCompany, authorCompany, true, true));
|
|
$q.all(promises).then(function (results) {
|
|
scope.assignment.groups = results[0];
|
|
if (scope.assignment.groups.length || state.tooManySupportGroups) {
|
|
allSupportGroups.persons = [];
|
|
scope.assignee.group = allSupportGroups;
|
|
}
|
|
state.tooManySupportPeople = results[1].exceedsChunkSize;
|
|
if (scope.assignToMe) {
|
|
scope.onSearchTextChanged();
|
|
}
|
|
else if (results[1].results.length) {
|
|
handleMembers(results[1].results);
|
|
}
|
|
completeProcessing();
|
|
}).catch(completeProcessing);
|
|
};
|
|
scope.selectGroup = function (group) {
|
|
state.processing = true;
|
|
scope.assignee.group = group;
|
|
scope.assignee.group.persons = [];
|
|
scope.assignee.person = {};
|
|
var customerCompany = null, locationCompany = null, ownerCompany = null, authorCompany = null, primaryCompany = null;
|
|
if (scope.ticket.type === EntityVO.TYPE_KNOWLEDGE) {
|
|
primaryCompany = getPrimaryCompany().name;
|
|
ownerCompany = scope.ticket.owner.company ? scope.ticket.owner.company.name : '';
|
|
authorCompany = scope.ticket.author.company ? scope.ticket.author.company.name : '';
|
|
if (primaryCompany === "All") {
|
|
primaryCompany = null;
|
|
}
|
|
}
|
|
else {
|
|
if (!(scope.ticket instanceof TicketConsoleItemVO) && (scope.ticket.type === EntityVO.TYPE_INCIDENT || scope.ticket.type === EntityVO.TYPE_WORKORDER)) {
|
|
customerCompany = objectValueMapperService.getExactValueByFieldName('customerCompany') || '';
|
|
}
|
|
else {
|
|
customerCompany = (scope.ticket.customer && scope.ticket.customer.company && !_.isEmpty(scope.ticket.customer.company)) ? scope.ticket.customer.company.name : (scope.ticket.company ? scope.ticket.company.name : '');
|
|
}
|
|
if ((scope.ticket.type === EntityVO.TYPE_TASK || scope.ticket.type === EntityVO.TYPE_CHANGE) && scope.ticket.id && scope.ticket.company) {
|
|
locationCompany = scope.ticket.company.name;
|
|
}
|
|
else if (!(scope.ticket instanceof TicketConsoleItemVO) && (scope.ticket.type === EntityVO.TYPE_INCIDENT || scope.ticket.type === EntityVO.TYPE_WORKORDER)) {
|
|
locationCompany = objectValueMapperService.getExactValueByFieldName('locationCompany');
|
|
}
|
|
else {
|
|
locationCompany = scope.ticket.locationCompany ? scope.ticket.locationCompany.name : null;
|
|
}
|
|
}
|
|
if (group.id === 'All') {
|
|
scope.assignee.isGroup = false;
|
|
ticketService.getAssigneeSupportGroupPersons(scope.assigneeCompany.id === 'All' ? '' : scope.assigneeCompany.name, scope.assigneeOrganization.id === 'All' ? '' : scope.assigneeOrganization.name, (scope.search.text ? scope.search.text : ''), '', role, null, customerCompany, locationCompany, ownerCompany, primaryCompany, authorCompany, true, true)
|
|
.then(function (searchResult) {
|
|
state.tooManySupportPeople = searchResult.exceedsChunkSize;
|
|
if (scope.assignToMe) {
|
|
scope.onSearchTextChanged();
|
|
}
|
|
else if (searchResult.results.length) {
|
|
handleMembers(searchResult.results);
|
|
}
|
|
completeProcessing();
|
|
}).catch(completeProcessing);
|
|
}
|
|
else {
|
|
ticketService.getAssigneeBySupportGroupId(scope.assignee.group.id, (scope.search.text ? scope.search.text : ''), '', customerCompany, role, searchModel.supportPersonChunkSize, true, null, locationCompany, ownerCompany, authorCompany, true)
|
|
.then(function (searchResult) {
|
|
state.tooManySupportPeople = searchResult.exceedsChunkSize;
|
|
if (scope.assignToMe) {
|
|
scope.onSearchTextChanged();
|
|
}
|
|
else if (searchResult.results.length) {
|
|
handleMembers(searchResult.results);
|
|
}
|
|
completeProcessing();
|
|
}).catch(completeProcessing);
|
|
}
|
|
};
|
|
scope.assignToGroup = function () {
|
|
scope.assignee.isGroup = true;
|
|
scope.assignee.person = {};
|
|
scope.$emit(events.MODAL_FORM_IS_DIRTY);
|
|
};
|
|
scope.assignToPerson = function (person) {
|
|
if (person.type === 'parent') {
|
|
scope.selectedParent = scope.selectedParent.id === person.id ? {} : person;
|
|
}
|
|
else {
|
|
scope.assignee.isGroup = false;
|
|
scope.assignee.person = person;
|
|
scope.$emit(events.MODAL_FORM_IS_DIRTY);
|
|
}
|
|
};
|
|
scope.clearSearchText = function () {
|
|
scope.search.text = '';
|
|
if (scope.assignToMe) {
|
|
scope.assignToMe = false;
|
|
if (scope.ticket.type === EntityVO.TYPE_KNOWLEDGE) {
|
|
var ticketStatusValue = scope.ticket.status ? scope.ticket.status.value : scope.ticket.statusValue ? scope.ticket.statusValue.value : '';
|
|
if (ticketStatusValue !== EntityVO.STATUS_CONTENT_REVIEW && ticketStatusValue !== EntityVO.STATUS_SME_REVIEW) {
|
|
scope.conditions.showAssignToGroup = false;
|
|
}
|
|
else {
|
|
scope.conditions.showAssignToGroup = true;
|
|
}
|
|
}
|
|
else {
|
|
scope.conditions.showAssignToGroup = true;
|
|
}
|
|
scope.selectGroup(scope.assignee.group);
|
|
}
|
|
else {
|
|
scope.onSearchTextChanged();
|
|
}
|
|
};
|
|
scope.onSearchTextChanged = function () {
|
|
var ownerCompany = null, authorCompany = null;
|
|
if (scope.search.text !== userModel.userFullData.fullName) {
|
|
scope.assigneeLoginId = '';
|
|
}
|
|
if (state.tooManySupportPeople || scope.assignToMe) {
|
|
scope.search.filterText = '';
|
|
scope.assignee.person = {};
|
|
if (scope.search.text.length > 2 || scope.search.text.length === 0) {
|
|
$timeout.cancel(timerPromise);
|
|
timerPromise = $timeout(function () {
|
|
// take a local copy of the search text we use for this particular query
|
|
var searchText = scope.search.text;
|
|
state.processing = true;
|
|
var locationCompany = null, customerCompany, primaryCompany = getPrimaryCompany();
|
|
primaryCompany = primaryCompany ? primaryCompany.name : '';
|
|
if (scope.ticket.type !== EntityVO.TYPE_KNOWLEDGE) {
|
|
if (!(scope.ticket instanceof TicketConsoleItemVO) && (scope.ticket.type === EntityVO.TYPE_INCIDENT || scope.ticket.type === EntityVO.TYPE_WORKORDER)) {
|
|
customerCompany = objectValueMapperService.getExactValueByFieldName('customerCompany') || '';
|
|
}
|
|
else {
|
|
customerCompany = (scope.ticket.customer && scope.ticket.customer.company) ? scope.ticket.customer.company.name : (scope.ticket.company ? scope.ticket.company.name : '');
|
|
}
|
|
if ((scope.ticket.type === EntityVO.TYPE_TASK || scope.ticket.type === EntityVO.TYPE_CHANGE) && scope.ticket.id && scope.ticket.company) {
|
|
locationCompany = scope.ticket.company.name;
|
|
}
|
|
else if (!(scope.ticket instanceof TicketConsoleItemVO) && (scope.ticket.type === EntityVO.TYPE_INCIDENT || scope.ticket.type === EntityVO.TYPE_WORKORDER)) {
|
|
locationCompany = objectValueMapperService.getExactValueByFieldName('locationCompany');
|
|
}
|
|
else {
|
|
locationCompany = scope.ticket.locationCompany ? scope.ticket.locationCompany.name : null;
|
|
}
|
|
}
|
|
else {
|
|
ownerCompany = scope.ticket.owner.company ? scope.ticket.owner.company.name : '';
|
|
authorCompany = scope.ticket.author.company ? scope.ticket.author.company.name : '';
|
|
}
|
|
if (scope.assignee.group.id === 'All') {
|
|
ticketService.getAssigneeSupportGroupPersons(scope.assigneeCompany.id === 'All' ? '' : scope.assigneeCompany.name, scope.assigneeOrganization.id === 'All' ? '' : scope.assigneeOrganization.name, scope.search.text, scope.assigneeLoginId, role, null, customerCompany, locationCompany, ownerCompany, primaryCompany, authorCompany, true, true)
|
|
.then(function (searchResult) {
|
|
// it might happen that several async queries were in progress if a user were typing fast
|
|
// but we are interested only in responses that correspond to the current scope.search.text value
|
|
if (scope.search.text === searchText) {
|
|
handleMembers(searchResult.results);
|
|
}
|
|
})
|
|
.finally(function () {
|
|
state.processing = false;
|
|
});
|
|
}
|
|
else {
|
|
ticketService.getAssigneeBySupportGroupId(scope.assignee.group.id, scope.search.text, scope.assigneeLoginId, null, role, null, true, null, locationCompany, ownerCompany, authorCompany, true)
|
|
.then(function (searchResult) {
|
|
if (scope.search.text === searchText) {
|
|
handleMembers(searchResult.results);
|
|
}
|
|
})
|
|
.finally(function () {
|
|
state.processing = false;
|
|
});
|
|
}
|
|
}, pauseInterval);
|
|
}
|
|
else {
|
|
scope.assignee.group.persons = [];
|
|
}
|
|
}
|
|
else {
|
|
scope.search.filterText = scope.search.text;
|
|
}
|
|
};
|
|
scope.setGroupToAll = function () {
|
|
allSupportGroups.persons = [];
|
|
scope.selectGroup(allSupportGroups);
|
|
};
|
|
scope.getSupportGroupsForCompanyAndOrgByName = function (name) {
|
|
var customerCompany = null, locationCompany = null, ownerCompany = null, authorCompany = null, primaryCompany = null;
|
|
if (scope.ticket.type === EntityVO.TYPE_KNOWLEDGE) {
|
|
primaryCompany = getPrimaryCompany().name;
|
|
ownerCompany = scope.ticket.owner.company ? scope.ticket.owner.company.name : '';
|
|
authorCompany = scope.ticket.author.company ? scope.ticket.author.company.name : '';
|
|
if (primaryCompany === "All") {
|
|
primaryCompany = null;
|
|
}
|
|
}
|
|
else {
|
|
if (!(scope.ticket instanceof TicketConsoleItemVO) && (scope.ticket.type === EntityVO.TYPE_INCIDENT || scope.ticket.type === EntityVO.TYPE_WORKORDER)) {
|
|
customerCompany = objectValueMapperService.getExactValueByFieldName('customerCompany') || '';
|
|
}
|
|
else {
|
|
customerCompany = (scope.ticket.customer && scope.ticket.customer.company) ? scope.ticket.customer.company.name : (scope.ticket.company ? scope.ticket.company.name : '');
|
|
}
|
|
if ((scope.ticket.type === EntityVO.TYPE_TASK || scope.ticket.type === EntityVO.TYPE_CHANGE) && scope.ticket.id && scope.ticket.company) {
|
|
locationCompany = scope.ticket.company.name;
|
|
}
|
|
else if (!(scope.ticket instanceof TicketConsoleItemVO) && (scope.ticket.type === EntityVO.TYPE_INCIDENT || scope.ticket.type === EntityVO.TYPE_WORKORDER)) {
|
|
locationCompany = objectValueMapperService.getExactValueByFieldName('locationCompany');
|
|
}
|
|
else {
|
|
locationCompany = scope.ticket.locationCompany ? scope.ticket.locationCompany.name : null;
|
|
}
|
|
}
|
|
return searchModel.getAssigneeSupportGroupsForCompanyAndOrgByName(scope.assigneeCompany.id === 'All' ? '' : scope.assigneeCompany.name, scope.assigneeOrganization.id === 'All' ? '' : scope.assigneeOrganization.name, name, null, customerCompany, locationCompany, ownerCompany, primaryCompany, authorCompany, role).then(function (result) {
|
|
return { list: result.supportGroups, exceedsChunkSize: result.exceedsChunkSize };
|
|
});
|
|
};
|
|
function getCustomerCompanyName() {
|
|
var companyName = null;
|
|
if (scope.ticket.type !== EntityVO.TYPE_KNOWLEDGE) {
|
|
if (scope.ticket.type === EntityVO.TYPE_INCIDENT || scope.ticket.type === EntityVO.TYPE_WORKORDER) {
|
|
companyName = objectValueMapperService.getExactValueByFieldName('customerCompany');
|
|
}
|
|
else if (scope.ticket.customer) {
|
|
companyName = scope.ticket.customer.company && scope.ticket.customer.company.name;
|
|
}
|
|
else {
|
|
companyName = scope.ticket.company ? scope.ticket.company.name : scope.ticket.selectedCompany;
|
|
}
|
|
}
|
|
return companyName;
|
|
}
|
|
function getSupportGroupsForCompanyAndOrg(assigneeCompany, organization, role, customerCompany, locationCompany, ownerCompany, primaryCompany, authorCompany) {
|
|
return searchModel.getAssigneeSupportGroupsForCompanyAndOrg(assigneeCompany.id === 'All' ? '' : assigneeCompany.name, organization.id === 'All' ? '' : organization.name, role, null, customerCompany, locationCompany, ownerCompany, primaryCompany, authorCompany, true)
|
|
.then(function (groups) {
|
|
groups.supportGroups = _.uniqBy(groups.supportGroups, function (group) {
|
|
return group.id;
|
|
});
|
|
groups.supportGroups = _.sortBy(groups.supportGroups, function (group) {
|
|
return group.name;
|
|
});
|
|
state.tooManySupportGroups = groups.exceedsChunkSize;
|
|
if (groups.supportGroups.length && groups.supportGroups[0].id !== 'All') {
|
|
allSupportGroups.persons = [];
|
|
groups.supportGroups.unshift(allSupportGroups);
|
|
}
|
|
var groupArr = [];
|
|
_.forEach(groups.supportGroups, function (group) {
|
|
if (group.id !== 'All') {
|
|
if (groupArr.indexOf(group.name) === -1) {
|
|
groupArr.push(group.name);
|
|
}
|
|
else {
|
|
var filteredGroups = _.filter(groups.supportGroups, { name: group.name });
|
|
_.forEach(filteredGroups, function (filteredGroup) {
|
|
filteredGroup.duplicate = true;
|
|
});
|
|
}
|
|
}
|
|
});
|
|
return groups.supportGroups;
|
|
});
|
|
}
|
|
scope.getSupportOrganizationsByTextAndCompany = function (searchText) {
|
|
var customerCompany = null, locationCompany = null, ownerCompany = null, authorCompany = null, primaryCompany = null;
|
|
if (scope.ticket.type === EntityVO.TYPE_KNOWLEDGE) {
|
|
primaryCompany = getPrimaryCompany().name;
|
|
ownerCompany = scope.ticket.owner.company ? scope.ticket.owner.company.name : '';
|
|
authorCompany = scope.ticket.author.company ? scope.ticket.author.company.name : '';
|
|
if (primaryCompany === "All") {
|
|
primaryCompany = null;
|
|
}
|
|
}
|
|
else {
|
|
if (!(scope.ticket instanceof TicketConsoleItemVO) && (scope.ticket.type === EntityVO.TYPE_INCIDENT || scope.ticket.type === EntityVO.TYPE_WORKORDER)) {
|
|
customerCompany = objectValueMapperService.getExactValueByFieldName('customerCompany') || '';
|
|
}
|
|
else {
|
|
customerCompany = (scope.ticket.customer && scope.ticket.customer.company) ? scope.ticket.customer.company.name : (scope.ticket.company ? scope.ticket.company.name : '');
|
|
}
|
|
if ((scope.ticket.type === EntityVO.TYPE_TASK || scope.ticket.type === EntityVO.TYPE_CHANGE) && scope.ticket.id && scope.ticket.company) {
|
|
locationCompany = scope.ticket.company.name;
|
|
}
|
|
else if (!(scope.ticket instanceof TicketConsoleItemVO) && (scope.ticket.type === EntityVO.TYPE_INCIDENT || scope.ticket.type === EntityVO.TYPE_WORKORDER)) {
|
|
locationCompany = objectValueMapperService.getExactValueByFieldName('locationCompany');
|
|
}
|
|
else {
|
|
locationCompany = scope.ticket.locationCompany ? scope.ticket.locationCompany.name : null;
|
|
}
|
|
}
|
|
return searchModel.getSupportOrganizationsByTextAndCompany(searchText, scope.assigneeCompany.id === 'All' ? '' : scope.assigneeCompany.name, null, customerCompany, locationCompany, ownerCompany, primaryCompany, authorCompany).then(function (result) {
|
|
return { list: result.organizations, exceedsChunkSize: result.exceedsChunkSize };
|
|
});
|
|
};
|
|
function getSupportOrganizationsForCompany(assigneeCompany, role, customerCompany, locationCompany, ownerCompany, primaryCompany, authorCompany) {
|
|
return searchModel.getAssigneeSupportOrgByCompany(assigneeCompany.id === 'All' ? '' : assigneeCompany.name, null, role, customerCompany, locationCompany, ownerCompany, primaryCompany, authorCompany)
|
|
.then(function (result) {
|
|
state.tooManyOrganizations = result.exceedsChunkSize;
|
|
if (result.organizations && result.organizations.length && result.organizations[0].id !== 'All') {
|
|
result.organizations.unshift(allOrganizations);
|
|
}
|
|
var orgArr = [];
|
|
_.forEach(result.organizations, function (organization) {
|
|
if (organization.id !== 'All') {
|
|
if (orgArr.indexOf(organization.name) === -1) {
|
|
orgArr.push(organization.name);
|
|
}
|
|
else {
|
|
var filteredOrgs = _.filter(result.organizations, { name: organization.name });
|
|
_.forEach(filteredOrgs, function (filteredOrg) {
|
|
filteredOrg.duplicate = true;
|
|
});
|
|
}
|
|
}
|
|
});
|
|
return result.organizations;
|
|
});
|
|
}
|
|
function getCompanies() {
|
|
var options = {}, customerCompany;
|
|
if (scope.ticket.type === EntityVO.TYPE_KNOWLEDGE) {
|
|
var primaryCompany = getPrimaryCompany();
|
|
options = {
|
|
ownerCompany: scope.ticket.owner.company ? scope.ticket.owner.company.name : '',
|
|
authorCompany: scope.ticket.author.company ? scope.ticket.author.company.name : ''
|
|
};
|
|
if (primaryCompany.name !== "All") {
|
|
options.primaryCompany = primaryCompany.name;
|
|
}
|
|
}
|
|
else {
|
|
if (!(scope.ticket instanceof TicketConsoleItemVO) && (scope.ticket.type === EntityVO.TYPE_INCIDENT || scope.ticket.type === EntityVO.TYPE_WORKORDER)) {
|
|
customerCompany = objectValueMapperService.getExactValueByFieldName('customerCompany') || '';
|
|
}
|
|
else {
|
|
customerCompany = (scope.ticket.customer && scope.ticket.customer.company) ? scope.ticket.customer.company.name : (scope.ticket.company ? scope.ticket.company.name : '');
|
|
}
|
|
if (!customerCompany) {
|
|
customerCompany = scope.ticket.selectedCompany;
|
|
}
|
|
options = { customerCompany: customerCompany };
|
|
if ((scope.ticket.type === EntityVO.TYPE_TASK || scope.ticket.type === EntityVO.TYPE_CHANGE) && scope.ticket.id && scope.ticket.company) {
|
|
options.locationCompany = scope.ticket.company.name;
|
|
}
|
|
else if (!(scope.ticket instanceof TicketConsoleItemVO) && (scope.ticket.type === EntityVO.TYPE_INCIDENT || scope.ticket.type === EntityVO.TYPE_WORKORDER)) {
|
|
options.locationCompany = objectValueMapperService.getExactValueByFieldName('locationCompany');
|
|
}
|
|
else if (scope.ticket.locationCompany && scope.ticket.locationCompany.name) {
|
|
options.locationCompany = scope.ticket.locationCompany.name;
|
|
}
|
|
}
|
|
if (role) {
|
|
options.role = role;
|
|
}
|
|
if ((scope.ticket.type === EntityVO.TYPE_TASK || scope.ticket.type === EntityVO.TYPE_ACTIVITY) && _.isUndefined(options.customerCompany)) {
|
|
options.customerCompany = scope.ticket.company.name;
|
|
}
|
|
return searchModel.getAssigneeSupportCompanies(options).then(function (companies) {
|
|
state.tooManyCompanies = companies.exceedsChunkSize;
|
|
if (companies.objects.length && companies.objects[0].id !== 'All') {
|
|
companies.objects.unshift(allCompanies);
|
|
}
|
|
scope.companies = _.cloneDeep(companies.objects);
|
|
});
|
|
}
|
|
function getPrimaryCompany() {
|
|
if (scope.ticket.allCompanies) {
|
|
return _.find(scope.ticket.allCompanies, function (company) {
|
|
return company.primary;
|
|
});
|
|
}
|
|
else {
|
|
return scope.ticket.company;
|
|
}
|
|
}
|
|
scope.getCompaniesByName = function (name) {
|
|
var options = {}, customerCompany;
|
|
if (!(scope.ticket instanceof TicketConsoleItemVO) && (scope.ticket.type === EntityVO.TYPE_INCIDENT || scope.ticket.type === EntityVO.TYPE_WORKORDER)) {
|
|
customerCompany = objectValueMapperService.getExactValueByFieldName('customerCompany') || '';
|
|
}
|
|
else {
|
|
customerCompany = (scope.ticket.customer && scope.ticket.customer.company) ? scope.ticket.customer.company.name : (scope.ticket.company ? scope.ticket.company.name : '');
|
|
}
|
|
if (!customerCompany) {
|
|
customerCompany = scope.ticket.selectedCompany;
|
|
}
|
|
options.customerCompany = customerCompany;
|
|
if (scope.ticket.locationCompany && scope.ticket.locationCompany.name) {
|
|
options.locationCompany = scope.ticket.locationCompany.name;
|
|
}
|
|
else if (!(scope.ticket instanceof TicketConsoleItemVO) && (scope.ticket.type === EntityVO.TYPE_INCIDENT || scope.ticket.type === EntityVO.TYPE_WORKORDER)) {
|
|
options.locationCompany = objectValueMapperService.getExactValueByFieldName('locationCompany');
|
|
}
|
|
else if ((scope.ticket.type === EntityVO.TYPE_TASK || scope.ticket.type === EntityVO.TYPE_CHANGE) && scope.ticket.id && scope.ticket.company) {
|
|
options.locationCompany = scope.ticket.company.name;
|
|
}
|
|
return searchModel.getAssigneeSupportCompaniesByText(name, options).then(function (companies) {
|
|
scope.companies = _.cloneDeep(companies.objects);
|
|
return { list: companies.objects, exceedsChunkSize: companies.exceedsChunkSize };
|
|
});
|
|
};
|
|
function handleMembers(members) {
|
|
if (scope.assignee.person && scope.assignee.person.loginId && !scope.assignToMe) {
|
|
scope.assignee.group.persons = _.reject(members, function (member) {
|
|
return member.loginId === scope.assignee.person.loginId;
|
|
});
|
|
}
|
|
else {
|
|
scope.assignee.group.persons = members;
|
|
}
|
|
scope.assignee.group.persons = _.sortBy(scope.assignee.group.persons, function (person) {
|
|
return person.fullName.toLowerCase();
|
|
});
|
|
if (scope.assignee.group.id === 'All') {
|
|
var originalList = getUniqueUsersBySupportGroups(scope.assignee.group.persons);
|
|
var newList = [];
|
|
for (var count = 0; count < (originalList.length - 1); count++) {
|
|
if (originalList[count].loginId === originalList[count + 1].loginId) {
|
|
var parent = _.cloneDeep(originalList[count]);
|
|
parent.type = 'parent';
|
|
newList.push(parent);
|
|
originalList[count].type = 'child';
|
|
newList.push(originalList[count]);
|
|
count++;
|
|
var numOfChildren = 1;
|
|
do {
|
|
originalList[count].type = 'child';
|
|
newList.push(originalList[count]);
|
|
numOfChildren++;
|
|
count++;
|
|
} while (count < originalList.length && originalList[count - 1].loginId === originalList[count].loginId);
|
|
parent.numOfChildren = numOfChildren;
|
|
count--;
|
|
}
|
|
else {
|
|
newList.push(originalList[count]);
|
|
}
|
|
}
|
|
if (count < originalList.length) {
|
|
newList.push(originalList[count]);
|
|
}
|
|
scope.assignee.group.persons = _.sortBy(newList, function (person) {
|
|
return person.fullName.toLowerCase();
|
|
});
|
|
if (scope.assignToMe && scope.assignee.group.persons.length > 0) {
|
|
scope.assignToPerson(scope.assignee.group.persons[0]);
|
|
}
|
|
}
|
|
completeProcessing();
|
|
}
|
|
function getUniqueUsersBySupportGroups(users) {
|
|
return (users || []).reduce(function (acc, person) {
|
|
var hasUserFromThisGroup = acc.some(function (item) {
|
|
return item.supportGroupId === person.supportGroupId && item.loginId === person.loginId;
|
|
});
|
|
if (!hasUserFromThisGroup) {
|
|
acc.push(person);
|
|
}
|
|
return acc;
|
|
}, []);
|
|
}
|
|
function completeProcessing() {
|
|
state.processing = false;
|
|
}
|
|
scope.onValueChange = function () {
|
|
scope.$emit(events.WIDGET_VALUE_CHANGE, { fieldName: scope.data.name });
|
|
};
|
|
scope.$watch('data.setValueFlag', function (value) {
|
|
if (value !== '#$#' && value) {
|
|
scope.data.value = value;
|
|
scope.onValueChange();
|
|
scope.data.setValueFlag = '#$#';
|
|
}
|
|
});
|
|
scope.state = state;
|
|
init();
|
|
}
|
|
};
|
|
}]);
|
|
}());
|