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

244 lines
12 KiB
JavaScript

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