// @flow import { observable } from "mobx"; import { inject, observer } from "mobx-react"; import * as React from "react"; import { withTranslation, type TFunction } from "react-i18next"; import { withRouter, type RouterHistory } from "react-router-dom"; import DocumentsStore from "stores/DocumentsStore"; import PoliciesStore from "stores/PoliciesStore"; import UiStore from "stores/UiStore"; import Collection from "models/Collection"; import CollectionDelete from "scenes/CollectionDelete"; import CollectionEdit from "scenes/CollectionEdit"; import CollectionExport from "scenes/CollectionExport"; import CollectionMembers from "scenes/CollectionMembers"; import { DropdownMenu } from "components/DropdownMenu"; import DropdownMenuItems from "components/DropdownMenu/DropdownMenuItems"; import Modal from "components/Modal"; import VisuallyHidden from "components/VisuallyHidden"; import getDataTransferFiles from "utils/getDataTransferFiles"; import { newDocumentUrl } from "utils/routeHelpers"; type Props = { position?: "left" | "right" | "center", ui: UiStore, policies: PoliciesStore, documents: DocumentsStore, collection: Collection, history: RouterHistory, onOpen?: () => void, onClose?: () => void, t: TFunction, }; @observer class CollectionMenu extends React.Component { file: ?HTMLInputElement; @observable showCollectionMembers = false; @observable showCollectionEdit = false; @observable showCollectionDelete = false; @observable showCollectionExport = false; onNewDocument = (ev: SyntheticEvent<>) => { ev.preventDefault(); const { collection } = this.props; this.props.history.push(newDocumentUrl(collection.id)); }; onImportDocument = (ev: SyntheticEvent<>) => { ev.preventDefault(); ev.stopPropagation(); // simulate a click on the file upload input element if (this.file) this.file.click(); }; onFilePicked = async (ev: SyntheticEvent<>) => { const files = getDataTransferFiles(ev); try { const file = files[0]; const document = await this.props.documents.import( file, null, this.props.collection.id, { publish: true } ); this.props.history.push(document.url); } catch (err) { this.props.ui.showToast(err.message, { type: "error", }); } }; handleEditCollectionOpen = (ev: SyntheticEvent<>) => { ev.preventDefault(); this.showCollectionEdit = true; }; handleEditCollectionClose = () => { this.showCollectionEdit = false; }; handleDeleteCollectionOpen = (ev: SyntheticEvent<>) => { ev.preventDefault(); this.showCollectionDelete = true; }; handleDeleteCollectionClose = () => { this.showCollectionDelete = false; }; handleExportCollectionOpen = (ev: SyntheticEvent<>) => { ev.preventDefault(); this.showCollectionExport = true; }; handleExportCollectionClose = () => { this.showCollectionExport = false; }; handleMembersModalOpen = (ev: SyntheticEvent<>) => { ev.preventDefault(); this.showCollectionMembers = true; }; handleMembersModalClose = () => { this.showCollectionMembers = false; }; render() { const { policies, documents, collection, position, onOpen, onClose, t, } = this.props; const can = policies.abilities(collection.id); return ( <> (this.file = ref)} onChange={this.onFilePicked} onClick={(ev) => ev.stopPropagation()} accept={documents.importFileTypes.join(", ")} /> ); } } export default withTranslation()( inject("ui", "documents", "policies")(withRouter(CollectionMenu)) );