"use strict"; (function () { 'use strict'; angular.module('feedModule') .controller('ActivityFeedController', ['$scope', '$filter', '$interval', 'feedModel', 'configurationModel', 'attachmentService', 'events', 'userModel', 'personModel', 'metadataModel', '$window', 'systemAlertService', function ($scope, $filter, $interval, feedModel, configurationModel, attachmentService, events, userModel, personModel, metadataModel, $window, systemAlertService) { var keyCode = { space: 32 }, feedRefreshInterval = metadataModel.cache && metadataModel.cache.global && metadataModel.cache.global.configurationParameters && metadataModel.cache.global.configurationParameters.timelineRefreshInterval ? parseInt(metadataModel.cache.global.configurationParameters.timelineRefreshInterval) * 1000 : 60000, isTabInFocus = true; $scope.feedModel = feedModel; $scope.activityTypeFilters = []; $scope.workinfoTypeFilters = []; $scope.userModel = { isAccessibleUser: userModel.isAccessibleUser }; $scope.pendingFilterUpdate = false; if ($scope.type === EntityVO.TYPE_PERSON) { $scope.personModel = personModel; } var initTime = '', feed = [], entity = {}, state = { loadingFeeds: !$scope.isDraft, loadingMoreFeeds: false, allFeedsLoaded: false, filterReady: false, filerExpanded: false, isNotAuthorized: false }, feedItem = { first: {}, last: {} }, setInitialState = function () { initTime = moment().valueOf(); state.allFeedsLoaded = false; feed.length = 0; feedItem.first = {}; }, getActivityFeedItems = function (criteria) { return feedModel.getActivityFeedItems(entity, criteria || {}).then(function (result) { if (result.isNotAuthorized) { state.isNotAuthorized = true; } else { populateActivityFeed(result); } }); }, populateActivityFeed = function (items) { if (!_.isEmpty(items)) { Array.prototype.push.apply(feed, items); feedItem.last = _.last(items); if (_.isEmpty(feedItem.first)) { feedItem.first = _.head(items); } if ($scope.parentContext) { $scope.parentContext.feed = feed; } } else { state.allFeedsLoaded = true; } }; angular.element($window).bind('focus', function () { isTabInFocus = true; }).bind('blur', function () { isTabInFocus = false; }); $scope.getActivityFeedItems = function (source) { if ($scope.getActivityFeedItemsDebounced) { $scope.getActivityFeedItemsDebounced.cancel(); } state.loadingFeeds = true; setInitialState(); getActivityFeedItems().finally(function () { state.loadingFeeds = false; }); }; $scope.getNewActivityFeedItems = function () { if (!state.loadingFeeds && !state.savingNote && isTabInFocus) { feedModel.getActivityFeedItems(entity, { criteria: 'gt,' + (feedItem.first.createDate || initTime) }).then(function (items) { if (!_.isEmpty(items)) { feedItem.first = _.head(items); _.forEach(items.reverse(), function (feedItem) { _.remove(feed, function (arrayItem) { return arrayItem.id === feedItem.id; }); feed.unshift(feedItem); }); } }); } }; $scope.loadMoreFeeds = function () { if (!state.loadingMoreFeeds && !state.allFeedsLoaded && !state.loadingFeeds) { state.loadingMoreFeeds = true; getActivityFeedItems({ criteria: 'lt,' + feedItem.last.createDate }).finally(function () { state.loadingMoreFeeds = false; }); } }; $scope.changeFilters = function (filterOption) { if (filterOption) { filterOption.selected = !filterOption.selected; } $scope.pendingFilterUpdate = true; }; $scope.keyPressOnFilterItem = function ($event, filterItem) { if ($event && $event.keyCode === keyCode.space) { $scope.applyFilter(filterItem); $event.preventDefault(); $event.stopPropagation(); } }; $scope.applyFilter = function (filterOption) { if (filterOption) { filterOption.selected = !filterOption.selected; } feedModel.buildFeedFilter(feedModel.activityFeed, $scope.activityTypeFilters.concat($scope.workinfoTypeFilters)); $scope.getActivityFeedItems(); }; $scope.clearSearchText = function () { feedModel.activityFeed.params.searchQuery = ''; }; $scope.handleAttachmentClick = function (type, attachment, returnAsBlob, isMyITComment) { state.loadingFeeds = true; attachmentService.getAttachmentFile(type, attachment, returnAsBlob, isMyITComment) .finally(function () { state.loadingFeeds = false; }); }; $scope.saveNote = function (noteData) { state.savingNote = true; return feedModel.saveNote(entity, noteData).then(function (data) { if (!noteData.isNeedAttentionFlag) { $scope.getActivityFeedItems(); } if (noteData.addFlagNote) { if (noteData.isNeedAttentionFlag && data && data.status !== 500) { $scope.$emit(events.TICKET_PROFILE_RESEND_EVENT, { eventName: events.REFRESH_TICKET_FROM_TITLE_BAR }); systemAlertService.success({ text: noteData.flag ? $filter('i18n')('console.filter.optionName.flagged') : $filter('i18n')('console.filter.optionName.unflagged'), hide: 10000 }); } else { $scope.$emit(events.TICKET_PROFILE_RESEND_EVENT, { eventName: events.REFRESH_KNOWLEDGE_ARTICLE }); } } }).finally(function () { state.savingNote = false; }); }; $scope.showContext = function (feedItem) { if (feedItem && feedItem.relatedObject) { return feedItem.relatedObject.id !== $scope.itemId; } }; $scope.searchInputTitle = ($scope.type === EntityVO.TYPE_KNOWLEDGE) ? $filter('i18n')('feed.filter.name.KnowledgeSearch') : $filter('i18n')('feed.filter.name.Search'); $scope.state = state; $scope.feed = feed; $scope.showActivityTypeFilters = $scope.assetClassId !== 'POI'; $scope.showWorkinfoTypeFilters = $scope.assetClassId !== 'POI'; if (!$scope.isDraft) { var removeWatcher = $scope.$watch('feedModel.activityFeed.params.searchQuery', function (newVal, oldVal) { if (newVal) { $scope.getActivityFeedItemsDebounced(); } else if (oldVal) { feedModel.activityFeed.params.searchQuery = ''; $scope.getActivityFeedItems(); } }); $scope.getActivityFeedItemsDebounced = _.debounce($scope.getActivityFeedItems, 1000); var newFeedsPromise = $interval($scope.getNewActivityFeedItems, feedRefreshInterval); $scope.$on('$destroy', function () { $interval.cancel(newFeedsPromise); removeWatcher(); feedModel.activityFeed.params.searchQuery = ''; angular.element($window).unbind('focus blur'); }); $scope.$watch('assetObject', function (newVal) { if (newVal && entity && entity.type === EntityVO.TYPE_ASSET) { if ($scope.assetClassId !== 'POI' && $scope.assetObject) { entity.poiId = $scope.assetObject.poiId || ''; $scope.applyFilter(); } } }); $scope.$watch('itemId', function (newVal) { if (newVal) { entity.type = $scope.type; entity.id = $scope.itemId; entity.poiId = null; if ($scope.assetClassId === 'POI') { entity.poiId = $scope.itemId; } var activityTypeFilters = configurationModel.get('feed.activity.' + entity.type + '.filter'); $scope.activityTypeFilters = _.isEmpty(activityTypeFilters) ? [] : activityTypeFilters; if (!configurationModel.isServerApplicationEnabled(EntityVO.TYPE_SLM)) { $scope.activityTypeFilters = _.reject($scope.activityTypeFilters, { name: 'slaAlerts' }); } _.forEach($scope.activityTypeFilters, function (filterItem) { filterItem.selected = false; filterItem.localizedLabel = $filter('i18n')('feed.filter.optionName.' + filterItem.label); }); $scope.activityTypeFilters = _.sortBy($scope.activityTypeFilters, 'localizedLabel'); feedModel.getWorkinfoTypeFilters(entity.type).then(function (filters) { $scope.workinfoTypeFilters = filters; if ($scope.workinfoTypeFilters.length) { _.forEach($scope.workinfoTypeFilters, function (filterItem) { //filterItem.selected = true; filterItem.localizedLabel = $filter('i18n')(filterItem.label); }); $scope.workinfoTypeFilters = _.sortBy($scope.workinfoTypeFilters, 'localizedLabel'); } state.filterReady = true; if (!$scope.assetClassId || $scope.assetClassId === 'POI') { $scope.applyFilter(); } }); } }); $scope.$watch('parentContext', function () { if ($scope.parentContext) { $scope.parentContext.feed = feed; } }); $scope.$watch('personModel.personDetails', function () { if ($scope.personModel && $scope.personModel.personDetails) { $scope.parentContext = $scope.personModel.personDetails; } }); $scope.$watch(function () { return userModel.isAccessibleUser; }, function (newValue) { $scope.userModel.isAccessibleUser = newValue; }); $scope.$on(events.REFRESH_ACTIVITY_FEED, function () { $scope.getActivityFeedItems(); }); $scope.$on(events.ADD_NEW_ACTIVITY_FEED_TO_LIST, function () { $scope.getNewActivityFeedItems(); }); } } ]); })();