diff --git a/app/components/List/Item.js b/app/components/List/Item.js index 5491fa2e..165967fb 100644 --- a/app/components/List/Item.js +++ b/app/components/List/Item.js @@ -30,6 +30,10 @@ const Wrapper = styled.li` padding: ${props => (props.compact ? '8px' : '12px')} 0; margin: 0; border-bottom: 1px solid ${props => props.theme.divider}; + + &:last-child { + border-bottom: 0; + } `; const Image = styled(Flex)` diff --git a/app/menus/CollectionMenu.js b/app/menus/CollectionMenu.js index 23c3d34a..acff4214 100644 --- a/app/menus/CollectionMenu.js +++ b/app/menus/CollectionMenu.js @@ -14,12 +14,14 @@ import importFile from 'utils/importFile'; import Collection from 'models/Collection'; import UiStore from 'stores/UiStore'; import DocumentsStore from 'stores/DocumentsStore'; +import PoliciesStore from 'stores/PoliciesStore'; import { DropdownMenu, DropdownMenuItem } from 'components/DropdownMenu'; type Props = { label?: React.Node, position?: 'left' | 'right' | 'center', ui: UiStore, + policies: PoliciesStore, documents: DocumentsStore, collection: Collection, history: RouterHistory, @@ -89,7 +91,15 @@ class CollectionMenu extends React.Component { }; render() { - const { collection, label, position, onOpen, onClose } = this.props; + const { + policies, + collection, + label, + position, + onOpen, + onClose, + } = this.props; + const can = policies.abilties(collection.id); return ( @@ -100,7 +110,7 @@ class CollectionMenu extends React.Component { accept="text/markdown, text/plain" /> @@ -124,16 +134,24 @@ class CollectionMenu extends React.Component { Import document
- Edit… - - Permissions… - - - Export… - + {can.update && ( + Edit… + )} + {can.update && ( + + Members… + + )} + {can.export && ( + + Export… + + )}
)} - Delete… + {can.delete && ( + Delete… + )} ); @@ -147,4 +165,6 @@ const HiddenInput = styled.input` visibility: hidden; `; -export default inject('ui', 'documents')(withRouter(CollectionMenu)); +export default inject('ui', 'documents', 'policies')( + withRouter(CollectionMenu) +); diff --git a/app/scenes/Collection.js b/app/scenes/Collection.js index 8da008a0..ce8e507c 100644 --- a/app/scenes/Collection.js +++ b/app/scenes/Collection.js @@ -152,7 +152,7 @@ class CollectionScene extends React.Component { )} diff --git a/app/scenes/CollectionEdit.js b/app/scenes/CollectionEdit.js index 8d43f67a..3ceaf6eb 100644 --- a/app/scenes/CollectionEdit.js +++ b/app/scenes/CollectionEdit.js @@ -6,6 +6,7 @@ import { inject, observer } from 'mobx-react'; import Input from 'components/Input'; import InputRich from 'components/InputRich'; import Button from 'components/Button'; +import Switch from 'components/Switch'; import Flex from 'shared/components/Flex'; import HelpText from 'components/HelpText'; import ColorPicker from 'components/ColorPicker'; @@ -25,11 +26,13 @@ class CollectionEdit extends React.Component { @observable description: string = ''; @observable color: string = '#4E5C6E'; @observable isSaving: boolean; + @observable private: boolean = false; componentWillMount() { this.name = this.props.collection.name; this.description = this.props.collection.description; this.color = this.props.collection.color; + this.private = this.props.collection.private; } handleSubmit = async (ev: SyntheticEvent<*>) => { @@ -41,6 +44,7 @@ class CollectionEdit extends React.Component { name: this.name, description: this.description, color: this.color, + private: this.private, }); this.props.onSubmit(); } catch (err) { @@ -62,6 +66,10 @@ class CollectionEdit extends React.Component { this.color = color; }; + handlePrivateChange = (ev: SyntheticInputEvent<*>) => { + this.private = ev.target.checked; + }; + render() { return ( @@ -91,6 +99,15 @@ class CollectionEdit extends React.Component { minHeight={68} maxHeight={200} /> + + + A private collection will only be visible to invited team members. + ) : ( undefined