875 lines
45 KiB
JavaScript
875 lines
45 KiB
JavaScript
"use strict";
|
|
(function () {
|
|
'use strict';
|
|
angular.module('consoleModule')
|
|
.controller('ConsoleController', ['$scope', 'knowledgeConsoleModel', 'ticketConsoleModel', 'assetConsoleModel', 'ticketActionService', 'userModel', 'followService', 'ribbonValidationService',
|
|
'$state', '$compile', '$modal', 'systemAlertService', '$filter', 'urlCreatorService', 'knowledgeArticleModel', 'events', 'emailModel', '$q', 'screenConfigurationModel',
|
|
'$timeout', 'browser', '$rootScope', 'utilityFunctions', '$sce', 'pwaModel',
|
|
function ($scope, knowledgeConsoleModel, ticketConsoleModel, assetConsoleModel, ticketActionService, userModel, followService, ribbonValidationService, $state, $compile, $modal, systemAlertService, $filter, urlCreatorService, knowledgeArticleModel, events, emailModel, $q, screenConfigurationModel, $timeout, browser, $rootScope, utilityFunctions, $sce, pwaModel) {
|
|
var state = {
|
|
bootstraping: true,
|
|
processing: false,
|
|
loadingMoreTickets: false,
|
|
updatingMetric: false
|
|
}, selectedItems = [], sortInfo = { fields: [], directions: [], columns: [] }, ngGridShowLoadingMoreSpinner = {
|
|
init: function (scope, grid) {
|
|
grid.$viewport.append($compile('<div class="ngLoadingMoreSpinnerContainer" ng-if="state.loadingMoreTickets"><div loading-spinner if="true" inline="true" centered="true"></div></div>')($scope));
|
|
}
|
|
}, consoleModel = null, tooltipTimer = null, defaultPresets, userPresets, duplicatesPresets;
|
|
switch ($scope.consoleType) {
|
|
case 'ticket':
|
|
consoleModel = ticketConsoleModel;
|
|
break;
|
|
case 'knowledge':
|
|
consoleModel = knowledgeConsoleModel;
|
|
break;
|
|
case 'asset':
|
|
consoleModel = assetConsoleModel;
|
|
break;
|
|
}
|
|
$scope.advancedQualification = {
|
|
name: 'advanceSearchQuery',
|
|
value: ''
|
|
};
|
|
$scope.isMobile = browser.isMobile;
|
|
if (consoleModel) {
|
|
$scope.ribbonConfig = consoleModel.ribbonConfig;
|
|
$scope.criteria = consoleModel.criteria;
|
|
$scope.selectedFilters = consoleModel.selectedFilters;
|
|
$scope.advancedQualification.value = (consoleModel.criteria && consoleModel.criteria.filterCriteria && consoleModel.criteria.filterCriteria.advanceSearchQuery) ? consoleModel.criteria.filterCriteria.advanceSearchQuery : '';
|
|
}
|
|
$scope.userModel = userModel;
|
|
$scope.ticketTypeSelected = [];
|
|
$scope.searchDisabled = false;
|
|
$scope.searchValue = '';
|
|
$scope.quickSearch = {
|
|
searchText: (ticketConsoleModel && ticketConsoleModel.criteria.filterCriteria.quickSearchText) ? ticketConsoleModel.criteria.filterCriteria.quickSearchText : '',
|
|
isQuickSearchTriggerd: false
|
|
};
|
|
$scope.maxFilterPills = 2;
|
|
//todo: Viktor: I need to find better solution to eliminate copy-paste in ticketActions
|
|
$scope.itemActions = {
|
|
assign: function ($event) {
|
|
ticketActionService.showBulkAssignDialog($scope.selectedItems).result.then(function (newAssignee) {
|
|
var name = newAssignee.assignee.fullName ? newAssignee.assignee.fullName : newAssignee.group.name;
|
|
systemAlertService.success({
|
|
text: $scope.selectedItems.length + ' ' + $filter('i18n')('console.ribbonAction.assign.success') + ' ' + name,
|
|
hide: 10000
|
|
});
|
|
$event.currentTarget.focus();
|
|
return $scope.getNewItemList();
|
|
}, function () {
|
|
$event.currentTarget.focus();
|
|
});
|
|
},
|
|
share: function ($event) {
|
|
if ($scope.selectedItems[0].type === EntityVO.TYPE_SERVICEREQUEST || $scope.selectedItems[0].type === EntityVO.TYPE_KNOWLEDGE) {
|
|
ticketActionService.showShareDialog($scope.selectedItems).result.then(function () {
|
|
$scope.gridOptions.selectAll(false);
|
|
$event.currentTarget.focus();
|
|
}, function () {
|
|
$event.currentTarget.focus();
|
|
});
|
|
}
|
|
else {
|
|
emailModel.createEmail($scope.selectedItems);
|
|
}
|
|
},
|
|
link: function ($event) {
|
|
ticketActionService.showLinkDialog($scope.selectedItems, false).result.then(function () {
|
|
systemAlertService.success({
|
|
text: $filter('i18n')('console.ribbonAction.relation.success'),
|
|
hide: 10000
|
|
});
|
|
$scope.consoleItems.allSelected = false;
|
|
$scope.getNewItemList();
|
|
$event.currentTarget.focus();
|
|
}, function () {
|
|
$event.currentTarget.focus();
|
|
});
|
|
},
|
|
follow: function () {
|
|
state.processing = true;
|
|
followService.follow($scope.selectedItems).then(function () {
|
|
systemAlertService.success({
|
|
text: $filter('i18n')('console.ribbonAction.follow.success', $scope.selectedItems.length),
|
|
hide: 10000
|
|
});
|
|
($scope.consoleType === 'knowledge') && knowledgeArticleModel.updateCachedArticles(_.map($scope.selectedItems, 'id'), {
|
|
following: true
|
|
});
|
|
}).catch(function (error) {
|
|
if (error) {
|
|
systemAlertService.error({
|
|
text: error.data.errorCode ? $filter('i18n')('error.unknown') : error.data.error,
|
|
clear: false
|
|
});
|
|
}
|
|
}).finally(function () {
|
|
state.processing = false;
|
|
});
|
|
},
|
|
unfollow: function () {
|
|
state.processing = true;
|
|
followService.unfollow($scope.selectedItems).then(function () {
|
|
systemAlertService.success({
|
|
text: $filter('i18n')('console.ribbonAction.unfollow.success', $scope.selectedItems.length),
|
|
hide: 10000
|
|
});
|
|
($scope.consoleType === 'knowledge') && knowledgeArticleModel.updateCachedArticles(_.map($scope.selectedItems, 'id'), {
|
|
following: false
|
|
});
|
|
}).catch(function (error) {
|
|
if (error) {
|
|
systemAlertService.error({
|
|
text: error.data.errorCode ? $filter('i18n')('error.unknown') : error.data.error,
|
|
clear: false
|
|
});
|
|
}
|
|
}).finally(function () {
|
|
state.processing = false;
|
|
});
|
|
},
|
|
flag: function () {
|
|
toggleBulkNeedsAttentionFlag(true);
|
|
},
|
|
unflag: function () {
|
|
toggleBulkNeedsAttentionFlag(false);
|
|
},
|
|
openInNewTab: function () {
|
|
var urls = selectedItems.map(function (item) {
|
|
return urlCreatorService.create(item);
|
|
});
|
|
_.forEach(urls, function (url) {
|
|
$timeout(function () {
|
|
window.open(url);
|
|
}, 1);
|
|
});
|
|
},
|
|
changeStatus: function ($event) {
|
|
ticketActionService.showEditStatusDialog($scope.selectedItems, false).result.then(function (statusData) {
|
|
systemAlertService.success({
|
|
text: $filter('i18n')('console.ribbonAction.editStatus.success') + statusData.statuslabel,
|
|
hide: 10000
|
|
});
|
|
$scope.consoleItems.allSelected = false;
|
|
$scope.getNewItemList();
|
|
$event.currentTarget.focus();
|
|
}, function () {
|
|
$event.currentTarget.focus();
|
|
});
|
|
},
|
|
assess: function () {
|
|
consoleModel.kcsFilters.assessmentMode = true;
|
|
$state.go(EntityVO.TYPE_KNOWLEDGE, { id: $scope.selectedItems[0].id, assessMode: true });
|
|
}
|
|
};
|
|
function toggleBulkNeedsAttentionFlag(flag) {
|
|
var modalInstance = $modal.open({
|
|
templateUrl: 'views/ticket-console/bulk-need-attention-modal.html',
|
|
windowClass: 'bmc-need-attention-modal',
|
|
backdrop: 'static',
|
|
size: 'lg',
|
|
controller: ['$scope', function ($scope) {
|
|
$scope.flag = flag;
|
|
}]
|
|
});
|
|
modalInstance.result.then(function (data) {
|
|
if (!_.isEmpty(data)) {
|
|
state.processing = true;
|
|
data = (flag ? "Needs Attention Flagged: " : "Needs Attention Unflagged: ") + data;
|
|
ticketActionService.toggleNeedAttentionFlag($scope.selectedItems, { needsAttention: (flag ? 'Yes' : 'No'), worknote: (data || '') }).then(function () {
|
|
var successMsg = flag ? 'console.ribbonAction.needAttention.flag.success' : 'console.ribbonAction.needAttention.unflag.success';
|
|
systemAlertService.success({
|
|
text: $filter('i18n')(successMsg, $scope.selectedItems.length),
|
|
hide: 10000
|
|
});
|
|
$scope.getNewItemList();
|
|
$scope.getMetrics();
|
|
}).finally(function () {
|
|
state.processing = false;
|
|
});
|
|
}
|
|
});
|
|
}
|
|
$scope.checkDateFilterAdded = function () {
|
|
return consoleModel.checkDateFilterAdded();
|
|
};
|
|
$scope.setDefaultPreset = function (userPreset) {
|
|
_.each($scope.userSavedFilterPresets, function (preset) {
|
|
preset.defaultpreset = false;
|
|
if (preset.name === userPreset.name) {
|
|
preset.defaultpreset = true;
|
|
}
|
|
});
|
|
if (userPreset.systemgenerated) {
|
|
var temp = _.find(duplicatesPresets, {
|
|
name: userPreset.name
|
|
});
|
|
if (temp) {
|
|
userPreset.id = temp.id;
|
|
}
|
|
else {
|
|
userPreset.id = null;
|
|
}
|
|
}
|
|
var filterSet = {
|
|
name: userPreset.name,
|
|
id: userPreset.id || null,
|
|
defaultpreset: userPreset.defaultpreset,
|
|
systemgenerated: userPreset.systemgenerated
|
|
};
|
|
userModel.updateUserPreferences(consoleModel.filterPreferenceGroup, filterSet)
|
|
.then(function (data) {
|
|
_.each(data, function (responsePreset) {
|
|
if (!(responsePreset.createDate && responsePreset.systemgenerated)) {
|
|
var index = _.findIndex(consoleModel.userSavedPresets, function (userSavedPreset) {
|
|
if (userSavedPreset.id === responsePreset.id) {
|
|
return true;
|
|
}
|
|
return false;
|
|
});
|
|
if (index > -1) {
|
|
if (consoleModel.userSavedPresets[index].columnId) {
|
|
responsePreset.columnId = consoleModel.userSavedPresets[index].columnId;
|
|
responsePreset.columnValue = angular.copy(consoleModel.userSavedPresets[index].columnValue);
|
|
}
|
|
consoleModel.userSavedPresets[index] = responsePreset;
|
|
}
|
|
}
|
|
});
|
|
$scope.setDefaultPresetOnload();
|
|
})
|
|
.catch(function () {
|
|
systemAlertService.warning({
|
|
text: $filter('i18n')('error.unknown'),
|
|
hide: 10000
|
|
});
|
|
return;
|
|
});
|
|
};
|
|
$scope.setDefaultPresetOnload = function () {
|
|
defaultPresets = [];
|
|
userPresets = [];
|
|
duplicatesPresets = [];
|
|
//find values for each pre-sets
|
|
_.each(consoleModel.userSavedPresets, function (preset) {
|
|
//need to check for ID - and replace createDate check
|
|
if (!preset.createDate) {
|
|
defaultPresets.push(preset);
|
|
}
|
|
if (preset.createDate && preset.systemgenerated) {
|
|
duplicatesPresets.push(preset);
|
|
}
|
|
if (!preset.systemgenerated) {
|
|
userPresets.push(preset);
|
|
}
|
|
});
|
|
//find id for default preset and match them
|
|
_.each(defaultPresets, function (preset) {
|
|
var temp = _.find(duplicatesPresets, {
|
|
name: preset.name,
|
|
systemgenerated: true
|
|
});
|
|
if (temp) {
|
|
preset.id = temp.id;
|
|
preset.defaultpreset = temp.defaultpreset;
|
|
}
|
|
});
|
|
// if no default selected then set fist to default on load always- SW00513638
|
|
var isDefaultPresent = _.find(consoleModel.userSavedPresets, { defaultpreset: true });
|
|
if (!isDefaultPresent) {
|
|
consoleModel.userSavedPresets[0].defaultpreset = true;
|
|
}
|
|
return consoleModel.userSavedPresets = defaultPresets.concat(userPresets);
|
|
};
|
|
$scope.isRestrictToDateSearchEnabled = function () {
|
|
if ($scope.consoleType === 'ticket') {
|
|
return consoleModel.restrictConsoleResultForNoOfDays;
|
|
}
|
|
return false;
|
|
};
|
|
$scope.init = function () {
|
|
$scope.columnsConfig = consoleModel.columnsConfig;
|
|
$scope.userSavedFilterPresets = $scope.setDefaultPresetOnload();
|
|
$scope.ticketMetric = consoleModel.statsConfig;
|
|
$scope.filterConfig = consoleModel.filterConfig;
|
|
$scope.ticketTypeFilter = consoleModel.ticketTypeFilter;
|
|
$scope.assetTypeFilter = consoleModel.assetTypeFilter;
|
|
//Make all filters visible by defa ult if no filters are pre-selected
|
|
var ticketTypesIndex = _.findIndex($scope.selectedFilters, function (filter) {
|
|
return filter.criteria.name === 'ticketTypes';
|
|
}), assetTypesIndex = _.findIndex($scope.selectedFilters, function (filter) {
|
|
return filter.criteria.name === 'assetTypes';
|
|
});
|
|
if (ticketTypesIndex !== -1) {
|
|
_.forEach($scope.selectedFilters, function (filter) {
|
|
if (filter.criteria.name === 'ticketTypes') {
|
|
$scope.updateFilterGrouping(filter.name);
|
|
}
|
|
});
|
|
}
|
|
else if (assetTypesIndex !== -1) {
|
|
_.forEach($scope.filterConfig, function (filter) {
|
|
filter.onDisplay = true;
|
|
if (filter.name === 'statuses') {
|
|
_.forEach(filter.options, function (specificStatus) {
|
|
specificStatus.onDisplay = true;
|
|
});
|
|
}
|
|
//Hide advanced asset filters which are type specific
|
|
if ($scope.consoleType === EntityVO.TYPE_ASSET) {
|
|
filter.onDisplay = filter.assetType ? false : true;
|
|
}
|
|
});
|
|
_.forEach($scope.selectedFilters, function (filter) {
|
|
if (filter.criteria.name === 'assetTypes') {
|
|
$scope.updateAssetFilterGrouping(filter.name);
|
|
}
|
|
});
|
|
}
|
|
else {
|
|
_.forEach($scope.filterConfig, function (filter) {
|
|
filter.onDisplay = true;
|
|
if (filter.name === 'statuses' || filter.name === 'priorities') {
|
|
_.forEach(filter.options, function (specificStatus) {
|
|
specificStatus.onDisplay = true;
|
|
});
|
|
}
|
|
});
|
|
}
|
|
$scope.setColumnDefinition();
|
|
if ($scope.displayMetric) {
|
|
$scope.getMetrics();
|
|
}
|
|
// SW00542241 - Fix for IE slowness of console
|
|
$scope.displayFilters = (!(browser.isIE && $scope.consoleType === 'ticket'));
|
|
$scope.normalizedFilterConfig = normalizeFilterConfig($scope.filterConfig);
|
|
return $scope.getNewItemList(false, true).finally(function () {
|
|
revalidateRibbon();
|
|
state.bootstraping = false;
|
|
if (!$scope.showNeedAttentionStat) {
|
|
$scope.ticketMetric = _.reject($scope.ticketMetric, { name: 'needsAttention' });
|
|
}
|
|
if (!$scope.showSecurityTickets) {
|
|
$scope.ticketMetric = _.reject($scope.ticketMetric, { name: 'securitytickets' });
|
|
}
|
|
});
|
|
};
|
|
function normalizeFilterConfig(filterConfig) {
|
|
return _.filter(filterConfig, function (filter, i, a) {
|
|
return filter.options.length && filter.onDisplay && filter !== $scope.ticketTypeFilter && filter !== $scope.assetTypeFilter;
|
|
});
|
|
}
|
|
$scope.getNewItemList = function (fromRefresh, isInit) {
|
|
if (fromRefresh) {
|
|
var filterCriteriaKeysList = Object.keys(consoleModel.criteria.filterCriteria);
|
|
filterCriteriaKeysList.forEach(function (key) {
|
|
var fCriteria = consoleModel.criteria.filterCriteria[key];
|
|
if (consoleModel.filterDict[key] && consoleModel.filterDict[key].options && consoleModel.filterDict[key].options.length && !_.isEmpty(fCriteria)) {
|
|
var filterObj = _.find(consoleModel.filterDict[key].options, (function (fCriteriaId) {
|
|
return function (item) {
|
|
return item.label === fCriteriaId;
|
|
};
|
|
}(fCriteria[0].id)));
|
|
if (filterObj && filterObj.type === "date" && filterObj.label != "customRange") {
|
|
if (fCriteria[0].start && filterObj.defaultValues.start) {
|
|
fCriteria[0].start = $rootScope.$eval(filterObj.defaultValues.start, { moment: moment });
|
|
}
|
|
if (fCriteria[0].end && filterObj.defaultValues.end) {
|
|
fCriteria[0].end = $rootScope.$eval(filterObj.defaultValues.end, { moment: moment });
|
|
}
|
|
}
|
|
}
|
|
});
|
|
}
|
|
consoleModel.dropCriteriaStartIndex();
|
|
if (!consoleModel.isSearchEnabled()) {
|
|
$scope.searchDisabled = true;
|
|
$scope.itemList = [];
|
|
$scope.totalItemsFound = 0;
|
|
return $q.when(1);
|
|
}
|
|
state.processing = true;
|
|
$scope.searchDisabled = false;
|
|
return getTickets().catch(function (error) {
|
|
if (error) {
|
|
systemAlertService.error({
|
|
text: error.data.errorCode ? $filter('i18n')('error.unknown') : error.data.error,
|
|
clear: false
|
|
});
|
|
}
|
|
}).finally(function () {
|
|
if (isInit && browser.isIE) {
|
|
state.processing = false;
|
|
}
|
|
else {
|
|
state.processing = consoleModel.metaDataRefresh || false;
|
|
}
|
|
if ($scope.userModel.isAccessibleUser || $scope.isMobile) {
|
|
$scope.$broadcast(events.SELECT_ALL_TICKETS, false);
|
|
}
|
|
else {
|
|
$scope.gridOptions.selectAll(false);
|
|
}
|
|
});
|
|
};
|
|
$scope.loadMoreTickets = function () {
|
|
state.loadingMoreTickets = true;
|
|
getTickets().finally(function () {
|
|
state.loadingMoreTickets = false;
|
|
state.lastRecordFetch = new Date();
|
|
});
|
|
};
|
|
var getTickets = function () {
|
|
return consoleModel.getItemList().then(function (totalItems) {
|
|
if ($scope.isPublishedClicked) {
|
|
$scope.itemList = _.filter(consoleModel.itemList, function (item) {
|
|
return item.statusValue.value === 'Published';
|
|
});
|
|
$scope.totalItemsFound = totalItems;
|
|
$scope.isPublishedClicked = false;
|
|
}
|
|
else {
|
|
$scope.itemList = consoleModel.itemList;
|
|
$scope.totalItemsFound = totalItems;
|
|
}
|
|
if ($scope.consoleType === 'ticket') {
|
|
highlightSearchText();
|
|
}
|
|
$scope.exceedChunkSize = consoleModel.exceedChunkSize;
|
|
});
|
|
};
|
|
function highlightSearchText() {
|
|
if (!$scope.advancedQualenabled) {
|
|
$scope.itemList = _.map($scope.itemList, function (item) {
|
|
item.highlight = ticketConsoleModel.criteria.filterCriteria.quickSearchText;
|
|
return item;
|
|
});
|
|
}
|
|
}
|
|
$scope.refreshToShowStats = function () {
|
|
state.updatingMetric = true;
|
|
$scope.showStats = true;
|
|
consoleModel.getTicketConsoleMetric().finally(function () {
|
|
state.updatingMetric = false;
|
|
});
|
|
};
|
|
$scope.getMetrics = function () {
|
|
if ($scope.consoleType === 'asset' || $scope.searchDisabled) {
|
|
return;
|
|
}
|
|
$scope.showStats = _.cloneDeep(consoleModel.showStats);
|
|
if ($scope.showStats) {
|
|
state.updatingMetric = true;
|
|
consoleModel.getTicketConsoleMetric().finally(function () {
|
|
state.updatingMetric = false;
|
|
});
|
|
}
|
|
};
|
|
$scope.applySearch = function () {
|
|
var filter = _.find($scope.filterConfig, { name: 'keywords' });
|
|
var option = _.find(filter.options, { subtype: 'keyword' });
|
|
$scope.applyKeywordFilter(filter, option, this.searchValue);
|
|
$scope.applyFilter();
|
|
this.searchValue = '';
|
|
};
|
|
$scope.setColumnDefinition = function () {
|
|
$scope.columnsConfig = consoleModel.columnsConfig;
|
|
$scope.gridColumns = angular.copy(_.sortBy(_.filter($scope.columnsConfig, 'visible'), 'order'));
|
|
if (consoleModel.presetColumns && consoleModel.presetColumns.length) {
|
|
$scope.gridColumns = angular.copy(consoleModel.presetColumns);
|
|
}
|
|
if (window.isRtl) {
|
|
$scope.gridColumns.reverse();
|
|
}
|
|
};
|
|
$scope.startColumnConfigurator = function ($event) {
|
|
var columnConfigurator = $modal.open({
|
|
templateUrl: 'views/console/column-configurator-action-blade.html',
|
|
controller: 'ConsoleColumnConfiguratorController',
|
|
windowClass: 'action-blade',
|
|
size: 'lg',
|
|
resolve: {
|
|
params: function () {
|
|
return {
|
|
consoleType: $scope.consoleType
|
|
};
|
|
}
|
|
}
|
|
});
|
|
columnConfigurator.result.then(function (flag) {
|
|
if (flag === 'refresh') {
|
|
$scope.applyUserFilterPreset(consoleModel.userSavedFilterPresets[0]);
|
|
consoleModel.resetCache(function () {
|
|
systemAlertService.success({
|
|
text: $filter('i18n')('screenConfiguration.metadataRefreshedSuccessfullyTicketConsole'),
|
|
hide: 10000
|
|
});
|
|
$state.go('ticketConsole', { refreshMetadata: true }, { reload: true });
|
|
});
|
|
}
|
|
$scope.setColumnDefinition();
|
|
if (consoleModel.appliedPreset && !consoleModel.appliedPreset.columnId) {
|
|
consoleModel.populateAttributeNames();
|
|
}
|
|
}).finally(function () {
|
|
$event.currentTarget.focus();
|
|
});
|
|
};
|
|
$scope.openColumnConfigModal = function () {
|
|
if ($state.params.refreshMetadata) {
|
|
consoleModel.metaDataRefresh = false;
|
|
$scope.startColumnConfigurator();
|
|
}
|
|
};
|
|
//Filters shown and hidden as per ticket type selected
|
|
$scope.updateFilterGrouping = function (filterName) {
|
|
var ticketRemoved = _.remove($scope.ticketTypeSelected, function (ticketType) {
|
|
return filterName === ticketType;
|
|
});
|
|
if (ticketRemoved.length === 0 && !_.isUndefined($scope.filterConfig)) {
|
|
$scope.ticketTypeSelected.push(filterName);
|
|
}
|
|
_.forEach($scope.filterConfig, function (filter) {
|
|
if (angular.isUndefined(filter.ticketType) || $scope.ticketTypeSelected.length === 0
|
|
|| _.intersection(filter.ticketType, $scope.ticketTypeSelected).length !== 0) {
|
|
filter.onDisplay = true;
|
|
if (filter.name === 'statuses' || filter.name === 'priorities' || (filter.type === 'custom' && filter.fieldType === 'staticSelectionField')) { //Showing status filters as per ticket types selected
|
|
_.forEach(filter.options, function (specificStatus) {
|
|
if ($scope.ticketTypeSelected.length === 0
|
|
|| _.intersection(specificStatus.criteria.ticketTypes, $scope.ticketTypeSelected).length !== 0) {
|
|
specificStatus.onDisplay = true;
|
|
}
|
|
else {
|
|
specificStatus.onDisplay = false;
|
|
}
|
|
});
|
|
}
|
|
}
|
|
else {
|
|
filter.onDisplay = false;
|
|
}
|
|
});
|
|
};
|
|
//Filters shown and hidden as per asset type selected
|
|
$scope.updateAssetFilterGrouping = function () {
|
|
$scope.assetTypeFilter = consoleModel.assetTypeFilter;
|
|
$scope.filterConfig = consoleModel.filterConfig;
|
|
var selectedAssetTypes = _.map(_.filter($scope.assetTypeFilter.options, { 'active': true }), 'criteriaValue');
|
|
_.forEach($scope.filterConfig, function (filter) {
|
|
if (filter.assetType) {
|
|
//filter.onDisplay = _.intersection(filter.assetType, selectedAssetTypes).length ? true : false;
|
|
if (filter.criteriaKeys) {
|
|
if (filter.selectiveClearFilters) {
|
|
consoleModel.clearSelectiveCriteriaKeyValues(filter);
|
|
}
|
|
else {
|
|
consoleModel.clearCriteriaKeyValues(null, filter.criteriaKeys);
|
|
}
|
|
}
|
|
//Hide advanced filters when multiple asset types are selected
|
|
filter.onDisplay = selectedAssetTypes.length === 1 && selectedAssetTypes[0] === filter.assetType[0];
|
|
}
|
|
if (filter.name === 'assetSubTypes') {
|
|
_.forEach(filter.options, function (specificSubtype) {
|
|
specificSubtype.onDisplay = !selectedAssetTypes || !selectedAssetTypes.length || _.includes(selectedAssetTypes, specificSubtype.criteria.typeName);
|
|
});
|
|
}
|
|
});
|
|
};
|
|
$scope.filterButtonClicked = function () {
|
|
if (browser.isIE && $scope.consoleType === 'ticket') {
|
|
if (!$scope.displayFilters) {
|
|
state.processing = true;
|
|
}
|
|
$timeout(function () {
|
|
$scope.displayFilters = true;
|
|
}, 1);
|
|
}
|
|
else {
|
|
return false;
|
|
}
|
|
};
|
|
$scope.openLaunchActionBlade = function (actionItem, event) {
|
|
var modalInstance = $modal.open({
|
|
templateUrl: 'views/asset/asset-launch-action-blade.html',
|
|
controller: 'AssetLaunchActionController',
|
|
windowClass: 'action-blade',
|
|
size: 'lg',
|
|
resolve: {
|
|
linkParams: function () {
|
|
return {
|
|
selectedItem: $scope.selectedItems,
|
|
actionItem: actionItem
|
|
};
|
|
}
|
|
}
|
|
});
|
|
modalInstance.result.then(function (data) {
|
|
event.currentTarget.focus();
|
|
if (!_.isEmpty(data)) {
|
|
$scope.getNewItemList();
|
|
}
|
|
});
|
|
};
|
|
var openEntityDetailPage = function (ticketVO, event) {
|
|
if (event && event.shiftKey) {
|
|
$timeout(function () {
|
|
window.open(urlCreatorService.create(ticketVO));
|
|
}, 1);
|
|
return;
|
|
}
|
|
var pvEnabled = pwaModel.isPwaEnabled();
|
|
if ($scope.consoleType === 'asset') {
|
|
var assetStateName = pvEnabled ? 'assetPV' : ticketVO.ticketType;
|
|
$state.go(assetStateName, {
|
|
assetId: ticketVO.reconciliationId,
|
|
assetClassId: ticketVO.classId
|
|
});
|
|
return;
|
|
}
|
|
// state names correspond to item type ("incident", "workorder")
|
|
var states = {
|
|
incident: pvEnabled ? 'incidentPV' : EntityVO.TYPE_INCIDENT,
|
|
workorder: pvEnabled ? 'workorderPV' : EntityVO.TYPE_WORKORDER,
|
|
task: pvEnabled ? 'taskPV' : EntityVO.TYPE_TASK,
|
|
request: EntityVO.TYPE_SERVICEREQUEST,
|
|
knowledge: EntityVO.TYPE_KNOWLEDGE,
|
|
change: EntityVO.TYPE_CHANGE,
|
|
problem: pvEnabled ? 'problemPV' : EntityVO.TYPE_PROBLEM,
|
|
knownerror: pvEnabled ? 'knownerrorPV' : EntityVO.TYPE_KNOWNERROR,
|
|
asset: EntityVO.TYPE_ASSET,
|
|
release: EntityVO.TYPE_RELEASE
|
|
};
|
|
if (!states[ticketVO.type]) {
|
|
return;
|
|
}
|
|
if (states[ticketVO.type] === EntityVO.TYPE_KNOWLEDGE) {
|
|
$state.go(states[ticketVO.type], { id: ticketVO.id, preventIncrement: false });
|
|
return;
|
|
}
|
|
$state.go(states[ticketVO.type], { id: ticketVO.id });
|
|
};
|
|
var revalidateRibbon = function () {
|
|
$scope.ribbonConfig.forEach(function (item) {
|
|
item.isActive = item.active ? $scope.$eval(item.active, { ribbonValidationService: ribbonValidationService }) : false;
|
|
item.isHidden = item.hidden ? $scope.$eval(item.hidden, { ribbonValidationService: ribbonValidationService }) : false;
|
|
});
|
|
};
|
|
$scope.consoleItems = {
|
|
allSelected: false
|
|
};
|
|
$scope.gridOptions = {
|
|
data: 'itemList',
|
|
headerRowHeight: 43,
|
|
rowHeight: 40,
|
|
sortInfo: sortInfo,
|
|
useExternalSorting: true,
|
|
enableColumnResize: true,
|
|
showSelectionCheckbox: true,
|
|
checkboxHeaderTemplate: '<label class="ngSelectionHeaderLabel"><input ux-id="select-all-checkbox" class="ngSelectionHeader" type="checkbox" ng-show="multiSelect" ng-model="consoleItems.allSelected" ng-change="toggleSelectAll(consoleItems.allSelected)"/></label>',
|
|
// checkboxCellTemplate: '<div class="ngSelectionCell"><input tabindex="-1" class="ngSelectionCheckbox" type="checkbox" ng-checked="row.selected" /></div>',
|
|
selectedItems: selectedItems,
|
|
beforeSelectionChange: function (rowItem, event) {
|
|
var result;
|
|
if (!event || !event.target || $(event.target).hasClass('ngSelectionCheckbox') || $(event.target).hasClass('ngSelectionCell')) {
|
|
result = true;
|
|
}
|
|
else {
|
|
result = false;
|
|
openEntityDetailPage(rowItem.entity, event);
|
|
}
|
|
return result;
|
|
},
|
|
afterSelectionChange: function () {
|
|
revalidateRibbon();
|
|
},
|
|
plugins: [ngGridShowLoadingMoreSpinner],
|
|
columnDefs: 'gridColumns'
|
|
};
|
|
if ($scope.consoleType === EntityVO.TYPE_ASSET) {
|
|
$scope.gridOptions.showSelectionCheckbox = false;
|
|
screenConfigurationModel.loadActionsForRuntime(EntityVO.TYPE_ASSET).then(function () {
|
|
var contextActions = screenConfigurationModel.runtimeActionsCache[EntityVO.TYPE_ASSET];
|
|
$scope.gridOptions.showSelectionCheckbox = _.some(contextActions.actionList, function (action) {
|
|
return action.actionType === 'launch' && _.includes(action.supportedPlatforms, 'web');
|
|
});
|
|
});
|
|
}
|
|
$scope.$on('ngGridEventScroll', function (event) {
|
|
var timeDifference = state.lastRecordFetch ? ((new Date()).getTime() - state.lastRecordFetch.getTime()) / 1000 : 1; //Set to 1 if no value as that would be initial call.
|
|
if (timeDifference < 1) {
|
|
console.log("Scroll function skipped");
|
|
return;
|
|
}
|
|
console.log("Scroll function initiated");
|
|
if ((($scope.criteria.chunkInfo.startIndex + consoleModel.defaultChunkSize) < $scope.totalItemsFound || consoleModel.exceedChunkSize) && !state.loadingMoreTickets) {
|
|
$scope.criteria.chunkInfo.startIndex += consoleModel.defaultChunkSize;
|
|
}
|
|
});
|
|
$scope.state = state;
|
|
$scope.selectedItems = selectedItems;
|
|
$scope.sortInfo = sortInfo;
|
|
$scope.openEntityDetailPage = openEntityDetailPage;
|
|
$scope.$watch('sortInfo', function (newValue, oldValue) {
|
|
if (!angular.equals(newValue, oldValue)) { //initialization of controller
|
|
$scope.criteria.sortInfo = {
|
|
sortFieldName: sortInfo.columns[0].colDef.attributeName,
|
|
sortFieldOrder: sortInfo.directions[0].toUpperCase()
|
|
};
|
|
}
|
|
}, true);
|
|
$scope.$watch('gridOptions.$gridScope.isColumnResizing', function (newValue, oldValue) {
|
|
if (newValue === false && oldValue === true) { //on stop resizing
|
|
$scope.gridOptions.$gridScope.hasUserChangedGridColumnWidths = false;
|
|
var colsToUpdate = {}, insertUpdateColumn = function (columnName, propName, propValue) {
|
|
if (!colsToUpdate[columnName]) {
|
|
colsToUpdate[columnName] = {};
|
|
}
|
|
colsToUpdate[columnName][propName] = propValue;
|
|
};
|
|
_.forEach($scope.gridOptions.$gridScope.columns, function (column) {
|
|
if (column.colDef.name) {
|
|
if (column.width !== column.colDef.width) {
|
|
insertUpdateColumn(column.colDef.name, 'width', column.width);
|
|
var foundCol = _.find(consoleModel.columnsConfig, { name: column.colDef.name });
|
|
if (foundCol) {
|
|
foundCol.width = column.width;
|
|
}
|
|
}
|
|
insertUpdateColumn(column.colDef.name, 'order', (column.colDef.index + 1));
|
|
insertUpdateColumn(column.colDef.name, 'visible', true);
|
|
if (consoleModel.columnsConfig[column.colDef.name].type) {
|
|
insertUpdateColumn(column.colDef.name, 'type', consoleModel.columnsConfig[column.colDef.name].type);
|
|
}
|
|
}
|
|
});
|
|
consoleModel.updateColumnConfig(colsToUpdate);
|
|
}
|
|
}, true);
|
|
$scope.handleRowSelection = function (selectedRows) {
|
|
$scope.selectedItems = selectedItems = selectedRows;
|
|
revalidateRibbon();
|
|
};
|
|
$scope.$watch('userModel.isAccessibleUser', function () {
|
|
if (selectedItems.length) {
|
|
for (var i = 0; i < selectedItems.length; i++) {
|
|
selectedItems[i].selected = false;
|
|
}
|
|
}
|
|
$scope.selectedItems = selectedItems = [];
|
|
if (!$scope.userModel.isAccessibleUser) {
|
|
$scope.gridOptions.selectedItems = selectedItems;
|
|
}
|
|
}, true);
|
|
$scope.$watch('totalItemsFound', function () {
|
|
if ($scope.userModel.isAccessibleUser || $scope.isMobile) {
|
|
$scope.selectedItems = selectedItems = [];
|
|
}
|
|
}, true);
|
|
$scope.$on(events.UPDATE_GRID_COLUMNS, $scope.setColumnDefinition);
|
|
$scope.isAllTypeChange = function (selectedItems) {
|
|
var flag = true, i;
|
|
for (i = 0; i < selectedItems.length; i++) {
|
|
if (selectedItems[i].type !== EntityVO.TYPE_CHANGE) {
|
|
flag = false;
|
|
break;
|
|
}
|
|
}
|
|
return flag;
|
|
};
|
|
$scope.showChangeWarning = function (selectedItems) {
|
|
var flag = true, i;
|
|
for (i = 0; i < selectedItems.length; i++) {
|
|
if (selectedItems[i].type !== EntityVO.TYPE_CHANGE || !selectedItems[i].allowBulkUpdateStatus) {
|
|
flag = false;
|
|
break;
|
|
}
|
|
}
|
|
return flag;
|
|
};
|
|
$scope.applyAdavancedQualSearch = function () {
|
|
$scope.isApplyClicked = true;
|
|
consoleModel.applyFilter({
|
|
advancedFilter: true,
|
|
criteria: $scope.advancedQualification
|
|
});
|
|
};
|
|
$scope.clearQuickSearch = function () {
|
|
if ($scope.consoleType !== 'ticket')
|
|
return;
|
|
$scope.quickSearch.searchText = '';
|
|
if (ticketConsoleModel.criteria.filterCriteria.quickSearchText !== '') {
|
|
setQuickSearchText($scope.quickSearch.searchText);
|
|
}
|
|
$scope.focusQuickSearch();
|
|
};
|
|
$scope.applyQuickSearch = function () {
|
|
var inputSearch = $scope.quickSearch.searchText.trim();
|
|
$scope.quickSearch.searchText = inputSearch;
|
|
if (inputSearch.length > 2) {
|
|
//Avoid same search again as well as search is triggered when there is change in criteria watch
|
|
//if user enters same text and click search then watch will not trigger but isQuickSearchTriggerd will be true
|
|
if (ticketConsoleModel.criteria.filterCriteria.quickSearchText !== inputSearch) {
|
|
setQuickSearchText(inputSearch);
|
|
}
|
|
}
|
|
else {
|
|
showTooltipForQuickSearch('minChar');
|
|
}
|
|
};
|
|
function setQuickSearchText(text) {
|
|
$scope.quickSearch.isQuickSearchTriggerd = true;
|
|
ticketConsoleModel.applyQuickSearch(text);
|
|
$scope.quickSearch.isTooltipOpen = false;
|
|
}
|
|
function trimFirstThreeWildCardCharacters() {
|
|
var wildcardChars = ['%', '_'], result = utilityFunctions.trimFirstThreeWildCardCharacters($scope.quickSearch.searchText.trim(), wildcardChars);
|
|
if (result.showTooltip) {
|
|
$scope.quickSearch.searchText = result.text;
|
|
showTooltipForQuickSearch('leading');
|
|
}
|
|
}
|
|
function showTooltipForQuickSearch(type) {
|
|
var msg, input;
|
|
switch (type) {
|
|
case 'leading':
|
|
msg = 'console.filter.search.tooltip.leadingWildcard';
|
|
break;
|
|
case 'minChar':
|
|
msg = 'console.filter.search.tooltip.minCharacter';
|
|
break;
|
|
default:
|
|
msg = 'common.labels.exceedsCharLimit';
|
|
input = consoleModel.quickSearchMaxCharLimit;
|
|
}
|
|
if (tooltipTimer) {
|
|
$timeout.cancel(tooltipTimer);
|
|
}
|
|
$scope.tooltipMessage = $filter('i18n')(msg, input);
|
|
$scope.quickSearch.isTooltipOpen = true;
|
|
tooltipTimer = $timeout(function () {
|
|
$scope.quickSearch.isTooltipOpen = false;
|
|
}, 10000);
|
|
}
|
|
function limitSearchText() {
|
|
var inputSearch = $scope.quickSearch.searchText.trim();
|
|
if (inputSearch.length > consoleModel.quickSearchMaxCharLimit) {
|
|
$scope.quickSearch.searchText = inputSearch;
|
|
$scope.quickSearch.searchText = $scope.quickSearch.searchText.slice(0, consoleModel.quickSearchMaxCharLimit);
|
|
showTooltipForQuickSearch('exceed');
|
|
}
|
|
}
|
|
$scope.onSearchTextChange = function () {
|
|
if ($scope.quickSearch.searchText == '') {
|
|
this.clearQuickSearch();
|
|
}
|
|
$scope.quickSearch.isTooltipOpen = false;
|
|
trimFirstThreeWildCardCharacters();
|
|
limitSearchText();
|
|
};
|
|
}
|
|
]);
|
|
})();
|