import React from 'react'; import {IExtensionActivationResult, IArticleActionBulk, IArticle} from 'superdesk-api'; import {flatMap, groupBy} from 'lodash'; import {extensions} from 'appConfig'; import {DropdownTree} from 'core/ui/components/dropdown-tree'; import {Icon} from 'core/ui/components/Icon2'; import {sortByDisplayPriority} from 'core/helpers/sortByDisplayPriority'; export interface IArticleActionBulkExtended extends IArticleActionBulk { // this is possible for all extensions since they don't depend on external state // most of core actions are relying on service state which would be destroyed if we closed the bar too early // when `canAutocloseMultiActionBar` set to false, core actions close it themselves when they are done canAutocloseMultiActionBar: boolean; } interface IProps { articles: Array; compact: boolean; getCoreActions(articles: Array): Array; hideMultiActionBar(): void; } interface IState { actions?: Array; } function getActionsBulkFromExtensions(articles): Promise> { const getActionsBulk : Array = flatMap( Object.values(extensions).map(({activationResult}) => activationResult), (activationResult) => activationResult.contributions != null && activationResult.contributions.entities != null && activationResult.contributions.entities.article != null && activationResult.contributions.entities.article.getActionsBulk != null ? activationResult.contributions.entities.article.getActionsBulk : [], ); return Promise.all( getActionsBulk.map((getPromise) => getPromise(articles)), ).then((res) => flatMap(res).map((action) => ({...action, canAutocloseMultiActionBar: true}))); } export class MultiActionBarReact extends React.Component { constructor(props: IProps) { super(props); this.state = {}; this.onTrigger = this.onTrigger.bind(this); } private onTrigger(action: IArticleActionBulkExtended) { if (action.canAutocloseMultiActionBar) { this.props.hideMultiActionBar(); } action.onTrigger(); } componentDidMount() { getActionsBulkFromExtensions(this.props.articles).then((actionsBulkFromExtensions) => { this.setState({ actions: sortByDisplayPriority( this.props.getCoreActions(this.props.articles).concat(actionsBulkFromExtensions), ), }); }); } componentDidUpdate(prevProps) { // update when more items are selected / deselected if (prevProps !== this.props) { getActionsBulkFromExtensions(this.props.articles).then((actionsBulkFromExtensions) => { this.setState({ actions: sortByDisplayPriority( this.props.getCoreActions(this.props.articles).concat(actionsBulkFromExtensions), ), }); }); } } render() { if (this.state.actions == null) { return null; } if (this.props.compact) { return (
( )} groups={[{render: () => null, items: this.state.actions}]} renderItem={(key, item, closeDropdown) => ( )} />
); } else { const groups = groupBy(this.state.actions, (item) => item.group && item.group.label); const groupNames = Object.keys(groups); return (
{ groupNames.map((group, i) => group === 'undefined' ? groups[group].map((action, key) => ( )) : ( ( )} key={i} groups={[{render: () => null, items: groups[group]}]} renderItem={(key, item, closeDropdown) => ( )} /> ), ) }
); } } }