"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('
')($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: '', // checkboxCellTemplate: '
', 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(); }; } ]); })();