import _ from 'lodash'; import {IArticleActionBulkExtended} from 'apps/monitoring/MultiActionBarReact'; import {IArticle} from 'superdesk-api'; import {getMultiActions} from '../controllers/get-multi-actions'; import ng from 'core/services/ng'; import {getBulkActions} from '../controllers/get-bulk-actions'; interface IScope extends ng.IScope { multi: any; display: any; type: any; activity: any; spike: any; publish: any; state: any; toggleDisplay(): void; hideMultiActionBar(): void; hideMultiActionBar(): void; getActions(articles: Array): Array; isOpenItemType(type: any): boolean; } export function isOpenItemType(type) { var openItem = ng.get('authoringWorkspace').getItem(); return openItem && openItem.type === type; } MultiActionBar.$inject = [ 'asset', 'multi', 'superdesk', 'keyboardManager', 'api', 'archiveService', ]; export function MultiActionBar( asset, multi, superdesk, keyboardManager, api, archiveService, ) { return { templateUrl: asset.templateUrl('apps/search/views/multi-action-bar.html'), scope: true, link: function(scope: IScope) { const getSelectedItems = () => multi.getItems(); const unselectAll = () => multi.reset(); const multiActions = getMultiActions( getSelectedItems, unselectAll, ); scope.multi = multi; scope.display = true; scope.$watch(multi.getItems, detectType); scope.$watch('multi.count', () => { scope.display = true; }); scope.toggleDisplay = () => { scope.display = !scope.display; }; scope.hideMultiActionBar = () => { scope.display = multi.reset(); }; scope.getActions = (articles: Array): Array => getBulkActions( articles, multiActions, getSelectedItems, unselectAll, () => { scope.$apply(); }, ); scope.$on('item:lock', (_e, data) => { if (_.includes(multi.getIds(), data.item)) { // locked item is in the selections so update lock info var selectedItems = multi.getItems(); _.find(selectedItems, (_item) => _item._id === data.item).lock_user = data.user; detectType(selectedItems); } }); scope.$on('item:unlock', (_e, data) => { if (multi.getIds().includes(data.item)) { const selectedItems = multi.getItems(); // When selected items are unlocked update their lock info and allowed actions api.find('archive', data.item).then((_item) => { const index = selectedItems.findIndex((item) => item._id === _item._id); selectedItems[index] = _.extend(selectedItems[index], _item); detectType(selectedItems); }); } }); scope.isOpenItemType = isOpenItemType; /** * Detects type of all selected items and assign it to scope, * but only when it's same for all of them. * * @param {Array} items */ function detectType(items) { var types = {}; var states = []; var activities = {}; angular.forEach(items, (item) => { const type = archiveService.getType(item); types[type] = 1; states.push(item.state); var _activities = superdesk.findActivities({action: 'list', type: type}, item) || []; let allowOnSessionOwnerLock = ['spike']; _activities.forEach((activity) => { // Ignore activities if the item is locked (except those in allowOnSessionOwnerLock) if (!item.lock_user || allowOnSessionOwnerLock.indexOf(activity._id) >= 0) { activities[activity._id] = activities[activity._id] ? activities[activity._id] + 1 : 1; } }); }); // keep only activities available for all items Object.keys(activities).forEach((activity) => { if (activities[activity] < items.length) { activities[activity] = 0; } }); var typesList = Object.keys(types); scope.type = typesList.length === 1 ? typesList[0] : null; scope.state = typesList.length === 1 ? states[0] : null; scope.activity = activities; } keyboardManager.bind('ctrl+shift+#', () => { if (scope.activity.spike > 0) { multiActions.spikeItems(); } }); }, }; }