// @flow import { observable } from "mobx"; import { inject, observer } from "mobx-react"; import * as React from "react"; 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, DropdownMenuItem } from "components/DropdownMenu"; import Modal from "components/Modal"; import VisuallyHidden from "components/VisuallyHidden"; import getDataTransferFiles from "utils/getDataTransferFiles"; import importFile from "utils/importFile"; 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, }; @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 document = await importFile({ file: files[0], documents: this.props.documents, collectionId: this.props.collection.id, }); this.props.history.push(document.url); } catch (err) { this.props.ui.showToast(err.message); } }; 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, collection, position, onOpen, onClose } = this.props; const can = policies.abilities(collection.id); return ( <> (this.file = ref)} onChange={this.onFilePicked} onClick={(ev) => ev.stopPropagation()} accept="text/markdown, text/plain" /> {collection && ( <> {can.update && ( New document )} {can.update && ( Import document )} {can.update &&
} {can.update && ( Edit… )} {can.update && ( Permissions… )} {can.export && ( Export… )} )} {can.delete && ( Delete… )}
); } } export default inject( "ui", "documents", "policies" )(withRouter(CollectionMenu));