SmartIT_Extensions/BMC/smart-it-full-helix/scripts/app/person/person-controller.js

311 lines
18 KiB
JavaScript

"use strict";
(function () {
'use strict';
angular.module('personModule')
.controller('PersonController', ['$scope', 'personModel', 'userModel', '$state', '$filter', 'attachmentService', 'screenConfigurationModel',
'events',
'ticketActionService', '$q', 'chatModel', '$modal', 'openMailClientService', 'configurationModel', 'metadataModel',
'systemAlertService', '$timeout', '$window', '$location',
function ($scope, personModel, userModel, $state, $filter, attachmentService, screenConfigurationModel, events, ticketActionService, $q, chatModel, $modal, openMailClientService, configurationModel, metadataModel, systemAlertService, $timeout, $window, $location) {
var person_id, screenName = screenConfigurationModel.getScreenNameByTicketType(EntityVO.TYPE_PERSON);
$scope.isServiceBrokerEnabled = configurationModel.isServerApplicationEnabled(EntityVO.TYPE_SBEREQUEST);
$scope.$on('personDataUpdated', handlePersonDataUpdated);
var queryMinimalView;
$scope.restrictPersonProfileResultForNoOfDays = 0;
/**
* Public functions
*
*/
$scope.follow = function () {
var userLoginId = userModel.userFullData.loginId;
return personModel.followPerson(userLoginId, $scope.person.loginId);
};
$scope.unfollow = function () {
var userLoginId = userModel.userFullData.loginId;
return personModel.unfollowPerson(userLoginId, $scope.person.loginId);
};
$scope.toggleFollowingFlag = function () {
var toggleFollowingFunction = $scope.person.following ? $scope.unfollow : $scope.follow;
toggleFollowingFunction($scope.person).then(function () {
$scope.person.following = !$scope.person.following;
});
};
$scope.share = function ($event) {
ticketActionService.showShareDialog($scope.person).result.then(function () {
$event.currentTarget.focus();
}, function () {
$event.currentTarget.focus();
});
};
$scope.emailPerson = function () {
var subject = userModel.userFullData.fullName + $filter('i18n')('shareBlade.emailSubject');
openMailClientService.openMailClient($scope.person.email, subject, '');
};
$scope.showPrintDialog = function ($event) {
var ticketPrintDialog = $modal.open({
templateUrl: 'views/common/print-action-blade.html',
controller: 'PrintController',
windowClass: 'action-blade',
size: 'extra-lg',
resolve: {
params: function () {
return {
entity: $scope.person,
feed: $scope.person.feed
};
}
}
});
ticketPrintDialog.result.finally(function () {
$event.currentTarget.focus();
});
};
/**
* Set active task section (Home / Workorders / View All)
* @param {String} sectionId
*/
$scope.setTaskSection = function (sectionId) {
$scope.activeTaskSection = sectionId;
};
/**
* Entry point
*/
$scope.init = function (personId) {
person_id = personId;
$scope.$on(events.TOGGLE_EDIT_MODE, handleToggleEditMode);
$scope.$on(events.EDIT_COMPLETE, handleEditComplete);
if (!personId) {
return;
}
queryMinimalView = 1;
$scope.editHeader = false;
$scope.isCollapsed = true;
$scope.activeTaskSection = 'assets';
$scope.state = {
isPersonDataLoading: true
};
$scope.chatModel = chatModel;
$q.all([personModel.getPersonDetailsByID(personId), screenConfigurationModel.loadScreenConfigurationAndCustomFieldLabels(screenName, EntityVO.TYPE_PERSON)]).then(onPersonDetailsLoaded).finally(onDataLoadComplete);
};
$scope.showProfileDetails = function (item, type, $event) {
if ('href' in $event.target) {
if ($scope.selectedChat && $event.target.href !== 'javascript:void(0)') {
$event.target.target = '_blank';
}
return;
}
switch (type) {
case EntityVO.TYPE_TICKET:
if ($scope.selectedChat) {
var url = $state.href(item.type, { id: item.id });
$window.open(url, '_blank');
}
else {
$state.go(item.type, { id: item.id });
}
break;
case EntityVO.TYPE_ASSET:
if ($scope.selectedChat) {
var url = $state.href(type, { assetId: item.reconciliationId, assetClassId: item.classId });
$window.open(url, '_blank');
}
else {
$state.go(type, { assetId: item.reconciliationId, assetClassId: item.classId });
}
break;
case EntityVO.TYPE_KNOWLEDGE:
if ($scope.selectedChat) {
var url = $state.href(type, { id: item.uuid });
$window.open(url, '_blank');
}
else {
$state.go(type, { id: item.uuid });
}
break;
}
};
$scope.handleFileChange = function (fileInput) {
//TODO: create ng-upload directive, which will be handling file inputs, to get rid of input class hardcoding
attachmentService.uploadProfileThumbnail($scope.person.loginId, EntityVO.TYPE_PERSON, fileInput, '')
.then(function (response) {
if (response.thumbnail) {
$scope.person.thumbnail = response.thumbnail;
if ($scope.person.loginId === userModel.userFullData.loginId) {
userModel.userFullData.thumbnail = response.thumbnail;
}
}
}, function (error) {
systemAlertService.error({
text: $filter('i18n')('attachment.fileExtension.error')
});
});
};
function setRelateToChatFlag() {
var showRelateToChat, showUnRelateToChat;
if (!$scope.selectedChat) {
return;
}
if ($scope.selectedChat && $scope.selectedChat.status !== 'Assigned') {
return;
}
$scope.setDeafultStyleForTickets = true;
if ($scope.selectedChat && $scope.selectedChat.status === 'Assigned') {
showRelateToChat = $scope.selectedChat.ticket && $scope.selectedChat.ticket.ticketId ? false : true;
showUnRelateToChat = $scope.selectedChat.ticket && $scope.selectedChat.ticket.ticketId ? true : false;
if ($scope.setDeafultStyleForTickets && (showRelateToChat || showUnRelateToChat)) {
$scope.setDeafultStyleForTickets = false;
}
}
}
/**
* Handler for toggling edit mode
*
* @param event
* @param editableContentSectionId
*/
function handleToggleEditMode(event, editableContentSectionId) {
$scope.activeEditableSectionId = editableContentSectionId;
if (editableContentSectionId === 'ticket-header') {
$scope.editHeader = true;
}
}
function handleEditComplete(event, editableContentSectionId) {
$scope.activeEditableSectionId = null;
if (editableContentSectionId === 'ticket-header') {
$scope.editHeader = false;
}
}
function handlePersonDataUpdated(event, reloadPerson) {
$timeout(function () {
$scope.person = personModel.personDetails;
if (reloadPerson && !_.isEmpty($scope.person)) {
onPersonDetailsLoaded();
onDataLoadComplete();
}
}, 0);
}
function isLiveChatConsolePath() {
return $location.path().startsWith('/live-chat/console');
}
$scope.editDisabledFor = function (sectionId) {
return $scope.activeEditableSectionId && $scope.activeEditableSectionId !== sectionId;
};
/**
* Handle "Load More" event
*/
$scope.loadMoreRequestedByTickets = function () {
if (!$scope.state.isPersonDataLoading && !$scope.state.isMoreRequestedByTicketsLoading
&& $scope.personOpenTicketsChunkAvailable) {
$scope.state.isMoreRequestedByTicketsLoading = true;
personModel.getOpenTickets(personModel.personDetails.id, personModel.personOpenTickets.ticketList.length, !!$scope.person.isSupportStaff, queryMinimalView, $scope.restrictPersonProfileResultForNoOfDays).finally(function () {
$scope.state.isMoreRequestedByTicketsLoading = false;
$scope.personOpenTickets = personModel.personOpenTickets.ticketList;
$scope.personOpenTicketsTotalMatches = personModel.personOpenTickets.totalMatches;
$scope.personOpenTicketsChunkAvailable = personModel.personOpenTickets.exceedsChunkSize;
setRelateToChatFlag();
});
}
};
$scope.requestedByCount = function () {
if (window.isRtl) {
var localeString = " (" + ($scope.personOpenTicketsTotalMatches || 0) + ") " + $scope.person.firstName + " " + ($filter('i18n')('person.details.tickets.requestedBy'));
return localeString;
}
return ($filter('i18n')('person.details.tickets.requestedBy')) + " " + $scope.person.firstName + " (" + ($scope.personOpenTicketsTotalMatches || 0) + ")";
};
$scope.loadMoreAllTickets = function () {
if (!$scope.state.isPersonDataLoading && !$scope.state.isMoreAllTicketsLoading
&& $scope.personAllTicketsChunkAvailable) {
$scope.state.isMoreAllTicketsLoading = true;
personModel.getAllTickets(personModel.personDetails.id, personModel.personAllTickets.ticketList.length, false, queryMinimalView, $scope.restrictPersonProfileResultForNoOfDays).finally(function () {
$scope.state.isMoreAllTicketsLoading = false;
$scope.personAllTickets = personModel.personAllTickets.ticketList;
$scope.personAllTicketsTotalMatches = personModel.personAllTickets.totalMatches;
$scope.personAllTicketsChunkAvailable = personModel.personAllTickets.exceedsChunkSize;
setRelateToChatFlag();
});
}
};
$scope.loadMoreAssignedTickets = function () {
if (!$scope.state.isPersonDataLoading && !$scope.state.isPersonMoreTicketsLoading
&& personModel.personAssignedTickets.totalMatches > personModel.personAssignedTickets.ticketList.length) {
$scope.state.isPersonMoreTicketsLoading = true;
personModel.getAssignedTickets(personModel.personDetails.id, personModel.personAssignedTickets.ticketList.length, true, queryMinimalView, $scope.restrictPersonProfileResultForNoOfDays).finally(function () {
$scope.state.isPersonMoreTicketsLoading = false;
$scope.personAssignedTickets = personModel.personAssignedTickets.ticketList;
$scope.totalMatches = personModel.personAssignedTickets.totalMatches;
setRelateToChatFlag();
});
}
};
$scope.getMoreOpenServiceBrokerTickets = function () {
$scope.state.isPersonMoreOpenSBETicketsLoading = true;
personModel.getOpenServiceBrokerTickets(personModel.personDetails.id, personModel.personOpenServiceBrokerTickets.ticketList.length, $scope.restrictPersonProfileResultForNoOfDays).finally(function () {
$scope.state.isPersonMoreOpenSBETicketsLoading = false;
$scope.personOpenSBETickets = personModel.personOpenServiceBrokerTickets.ticketList;
$scope.personOpenSBETicketsTotalMatches = personModel.personOpenServiceBrokerTickets.totalMatches;
setRelateToChatFlag();
});
};
$scope.isURL = function (str) {
var regexp = /(ftp|http|https):\/\/(\w+:{0,1}\w*@)?(\S+)(:[0-9]+)?(\/|\/([\w#!:.?+=&%@!\-\/]))?/;
return regexp.test(str);
};
function onPersonDetailsLoaded() {
$scope.restrictPersonProfileResultForNoOfDays = configurationModel.restrictPersonProfileResultForNoOfDays;
$scope.person = personModel.personDetails;
$scope.$emit(events.PERSON_DATA_LOADED, $scope.person);
$scope.disableClick = (_.isUndefined($scope.person.email) || $scope.person.email === "") ? true : false;
$scope.setTarget = $scope.selectedChat ? "_blank" : null;
$scope.personSupportGroups = personModel.personDetails.supportGroups;
$scope.personAvailability = $scope.person.availability;
if (!$scope.isFullVersion && $scope.person.accessMappings) {
$scope.person.accessMappings.detailsEditAllowed = false;
}
if ($scope.person.isSupportStaff) {
personModel.getAssignedTickets($scope.person.loginId, 0, true, queryMinimalView, $scope.restrictPersonProfileResultForNoOfDays).then(function () {
$scope.personAssignedTickets = personModel.personAssignedTickets.ticketList;
$scope.personAssignedTicketsTotalMatches = personModel.personAssignedTickets.totalMatches;
});
personModel.getKnowledgeArticles($scope.person.loginId).then(function () {
$scope.personKnowledgeArticles = personModel.personKnowledgeArticles;
$scope.personKnowledgeArticlesTotalMatches = personModel.personKnowledgeArticles.totalMatches;
});
}
else {
personModel.getAllTickets($scope.person.loginId, 0, false, queryMinimalView, $scope.restrictPersonProfileResultForNoOfDays).then(function () {
//in person-profile however in smart-recorder we are showing and the code for that is different.
$scope.personAllTickets = personModel.personAllTickets.ticketList;
$scope.personAllTicketsTotalMatches = personModel.personAllTickets.totalMatches;
$scope.personAllTicketsChunkAvailable = personModel.personAllTickets.exceedsChunkSize;
});
}
if ($scope.isServiceBrokerEnabled) {
personModel.getOpenServiceBrokerTickets($scope.person.loginId, 0, $scope.restrictPersonProfileResultForNoOfDays).then(function () {
$scope.personOpenSBETickets = personModel.personOpenServiceBrokerTickets.ticketList;
$scope.personOpenSBETicketsTotalMatches = personModel.personOpenServiceBrokerTickets.totalMatches;
});
}
}
function onDataLoadComplete() {
$scope.state.isPersonDataLoading = false;
personModel.getServiceSummaryStats(person_id).then(function () {
$scope.serviceSummary = personModel.serviceSummary;
});
personModel.getPersonAssets(person_id, true).then(function () {
$scope.personAssetList = personModel.personAssets;
});
$q.all(metadataModel.getMetadataByType(EntityVO.TYPE_WORKORDER), metadataModel.getMetadataByType(EntityVO.TYPE_INCIDENT), metadataModel.getMetadataByType(EntityVO.TYPE_ASSET), metadataModel.getMetadataByType(EntityVO.TYPE_PROBLEM), metadataModel.getMetadataByType(EntityVO.TYPE_CHANGE), metadataModel.getMetadataByType(EntityVO.TYPE_TASK), metadataModel.getMetadataByType(EntityVO.TYPE_RELEASE), metadataModel.getMetadataByType(EntityVO.TYPE_KNOWLEDGE)).then(function () {
$scope.restrictPersonProfileResultForNoOfDays = configurationModel.restrictPersonProfileResultForNoOfDays;
personModel.getOpenTickets($scope.person.loginId, 0, !!$scope.person.isSupportStaff, queryMinimalView, $scope.restrictPersonProfileResultForNoOfDays).then(function () {
$scope.personOpenTickets = personModel.personOpenTickets.ticketList;
$scope.personOpenTicketsTotalMatches = personModel.personOpenTickets.totalMatches;
$scope.personOpenTicketsChunkAvailable = personModel.personOpenTickets.exceedsChunkSize;
setRelateToChatFlag();
});
});
}
$scope.$on(events.EDIT_COMPLETE, handleEditComplete);
}]);
})();