// External modules import * as React from 'react'; import {Dispatch} from 'redux'; import {connect} from 'react-redux'; // Types import {ASSET_ACTIONS, IAssetCallback, IAssetItem, LIST_ACTION} from '../../interfaces'; import {IApplicationState} from '../../store'; import {superdeskApi, samsApi} from '../../apis'; // Redux Actions & Selectors import { closeAssetContentPanel, deleteAssets, onEditAsset, queryAssetsFromCurrentSearch, forceUnlockAsset, } from '../../store/assets/actions'; import {getSelectedAsset, getSetNameForSelectedAsset} from '../../store/assets/selectors'; // UI import {Dropdown, FormLabel, IconButton} from 'superdesk-ui-framework/react'; import { FormRow, PanelContent, PanelContentBlock, PanelContentBlockInner, PanelHeader, Text, } from '../../ui'; import {VersionUserDateLines} from '../common/versionUserDateLines'; // Utils import {getHumanReadableFileSize} from '../../utils/ui'; import {getDropdownItemsForActions, getMimetypeHumanReadable} from '../../utils/assets'; interface IProps { asset?: IAssetItem; setName?: string; deleteAsset(asset: IAssetItem): void; onEditAsset(asset: IAssetItem): void; onPanelClosed(): void; downloadAsset(asset: Partial): void; queryAssetsFromCurrentSearch(listStyle: LIST_ACTION): void; forceUnlockAsset(asset: IAssetItem): void; } const mapStateToProps = (state: IApplicationState) => ({ asset: getSelectedAsset(state), setName: getSetNameForSelectedAsset(state), }); const mapDispatchToProps = (dispatch: Dispatch) => ({ onEditAsset: (asset: IAssetItem) => dispatch(onEditAsset(asset)), deleteAsset: (asset: IAssetItem) => dispatch(deleteAssets(asset)), onPanelClosed: () => dispatch(closeAssetContentPanel()), queryAssetsFromCurrentSearch: (listAction?: LIST_ACTION) => dispatch(queryAssetsFromCurrentSearch(listAction)), forceUnlockAsset: (asset: IAssetItem) => dispatch(forceUnlockAsset(asset)), }); export function downloadAssetBinary(asset: IAssetItem): void { samsApi.assets.getAssetBinary(asset); } export class AssetPreviewPanelComponent extends React.PureComponent { constructor(props: IProps) { super(props); this.onEditAsset = this.onEditAsset.bind(this); this.onDownloadSingleAssetCompressedBinary = this.onDownloadSingleAssetCompressedBinary.bind(this); this.onDeleteAsset = this.onDeleteAsset.bind(this); } onEditAsset(): void { this.props.onEditAsset(this.props.asset!); } onDeleteAsset(): void { this.props.deleteAsset(this.props.asset!); } onDownloadSingleAssetCompressedBinary(): void { downloadAssetBinary(this.props.asset!); } render() { const {gettext} = superdeskApi.localization; const actions: Array = [{ action: ASSET_ACTIONS.EDIT, onSelect: this.onEditAsset, }, { action: ASSET_ACTIONS.DOWNLOAD, onSelect: this.onDownloadSingleAssetCompressedBinary, }, { action: ASSET_ACTIONS.DELETE, onSelect: this.onDeleteAsset, }, ]; if (superdeskApi.privileges.hasPrivilege('sams_manage_assets')) { actions.push({ action: ASSET_ACTIONS.FORCE_UNLOCK, onSelect: this.props.forceUnlockAsset, }); } const newActions = getDropdownItemsForActions(this.props.asset!, actions); if (this.props.asset?._id == null) { return null; } return ( false} /> {this.props.asset?.name} {this.props.asset?.description || '-'} {this.props.asset?.filename} {getHumanReadableFileSize(this.props.asset?.length)} {getMimetypeHumanReadable(this.props.asset?.mimetype)} ({this.props.asset?.mimetype}) {this.props.asset?.state} {this.props.setName} ); } } export const AssetPreviewPanel = connect( mapStateToProps, mapDispatchToProps, )(AssetPreviewPanelComponent);