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

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();
};
}
]);
})();