// @flow import { observable } from "mobx"; import { inject, observer } from "mobx-react"; import { PlusIcon } from "outline-icons"; import * as React from "react"; import styled from "styled-components"; import AuthStore from "stores/AuthStore"; import CollectionGroupMembershipsStore from "stores/CollectionGroupMembershipsStore"; import GroupsStore from "stores/GroupsStore"; import MembershipsStore from "stores/MembershipsStore"; import UiStore from "stores/UiStore"; import UsersStore from "stores/UsersStore"; import Collection from "models/Collection"; import Button from "components/Button"; import Empty from "components/Empty"; import Flex from "components/Flex"; import HelpText from "components/HelpText"; import Modal from "components/Modal"; import PaginatedList from "components/PaginatedList"; import Subheading from "components/Subheading"; import AddGroupsToCollection from "./AddGroupsToCollection"; import AddPeopleToCollection from "./AddPeopleToCollection"; import CollectionGroupMemberListItem from "./components/CollectionGroupMemberListItem"; import MemberListItem from "./components/MemberListItem"; type Props = { ui: UiStore, auth: AuthStore, collection: Collection, users: UsersStore, memberships: MembershipsStore, collectionGroupMemberships: CollectionGroupMembershipsStore, groups: GroupsStore, onEdit: () => void, }; @observer class CollectionMembers extends React.Component { @observable addGroupModalOpen: boolean = false; @observable addMemberModalOpen: boolean = false; handleAddGroupModalOpen = () => { this.addGroupModalOpen = true; }; handleAddGroupModalClose = () => { this.addGroupModalOpen = false; }; handleAddMemberModalOpen = () => { this.addMemberModalOpen = true; }; handleAddMemberModalClose = () => { this.addMemberModalOpen = false; }; handleRemoveUser = (user) => { try { this.props.memberships.delete({ collectionId: this.props.collection.id, userId: user.id, }); this.props.ui.showToast(`${user.name} was removed from the collection`); } catch (err) { this.props.ui.showToast("Could not remove user"); } }; handleUpdateUser = (user, permission) => { try { this.props.memberships.create({ collectionId: this.props.collection.id, userId: user.id, permission, }); this.props.ui.showToast(`${user.name} permissions were updated`); } catch (err) { this.props.ui.showToast("Could not update user"); } }; handleRemoveGroup = (group) => { try { this.props.collectionGroupMemberships.delete({ collectionId: this.props.collection.id, groupId: group.id, }); this.props.ui.showToast(`${group.name} was removed from the collection`); } catch (err) { this.props.ui.showToast("Could not remove group"); } }; handleUpdateGroup = (group, permission) => { try { this.props.collectionGroupMemberships.create({ collectionId: this.props.collection.id, groupId: group.id, permission, }); this.props.ui.showToast(`${group.name} permissions were updated`); } catch (err) { this.props.ui.showToast("Could not update user"); } }; render() { const { collection, users, groups, memberships, collectionGroupMemberships, auth, } = this.props; const { user } = auth; if (!user) return null; const key = memberships.orderedData .map((m) => m.permission) .concat(collection.private) .join("-"); return ( {collection.private ? ( <> Choose which groups and team members have access to view and edit documents in the private {collection.name}{" "} collection. You can make this collection visible to the entire team by{" "} changing its visibility . ) : ( The {collection.name} collection is accessible by everyone on the team. If you want to limit who can view the collection,{" "} make it private . )} {collection.private && ( Groups This collection has no groups.} renderItem={(group) => ( this.handleRemoveGroup(group)} onUpdate={(permission) => this.handleUpdateGroup(group, permission) } /> )} /> )} {collection.private ? ( <> Individual Members ) : ( Members )} ( this.handleRemoveUser(item)} onUpdate={(permission) => this.handleUpdateUser(item, permission)} /> )} /> ); } } const GroupsWrap = styled.div` margin-bottom: 50px; `; export default inject( "auth", "users", "memberships", "collectionGroupMemberships", "groups", "ui" )(CollectionMembers);