From 5419f98d9560592e5d2cb7cf95f5064f77b5d58a Mon Sep 17 00:00:00 2001 From: shanshuirenjia <978987373@qq.com> Date: Sat, 8 Dec 2018 11:53:45 +0800 Subject: [PATCH] add repo-operation --- .../repo-list-view/repo-list-item.js | 146 ++++++++++++++++-- frontend/src/pages/groups/group-view.js | 14 +- media/css/seahub_react.css | 1 + 3 files changed, 150 insertions(+), 11 deletions(-) diff --git a/frontend/src/components/repo-list-view/repo-list-item.js b/frontend/src/components/repo-list-view/repo-list-item.js index 0c7251342f..d0dd69f94c 100644 --- a/frontend/src/components/repo-list-view/repo-list-item.js +++ b/frontend/src/components/repo-list-view/repo-list-item.js @@ -1,14 +1,15 @@ -import React from 'react'; +import React, { Fragment } from 'react'; import PropTypes from 'prop-types'; import moment from 'moment'; +import { Dropdown, DropdownMenu, DropdownToggle, DropdownItem } from 'reactstrap'; import { Utils } from '../../utils/utils'; -import { siteRoot, } from '../../utils/constants'; +import { gettext, siteRoot, isPro, username, folderPermEnabled } from '../../utils/constants'; const propTypes = { repo: PropTypes.object.isRequired, isItemFreezed: PropTypes.bool.isRequired, isShowRepoOwner: PropTypes.bool.isRequired, - isStuff: PropTypes.bool.isRequired, + currentGroup: PropTypes.object.isRequired }; class RepoListItem extends React.Component { @@ -23,11 +24,23 @@ class RepoListItem extends React.Component { } onMouseEnter = () => { - this.setState({highlight: true}); + this.setState({ + highlight: true, + isOperationShow: true, + }); } onMouseLeave = () => { - this.setState({highlight: false}); + this.setState({ + highlight: false, + isOperationShow: false, + }); + } + + toggleOperationMenu = () => { + this.setState({ + isItemMenuShow: !this.state.isItemMenuShow + }); } getRepoComputeParams = () => { @@ -54,18 +67,132 @@ class RepoListItem extends React.Component { return { iconUrl, iconTitle, libPath }; } - generatorMenu = () => { - //todo + generatorOperations = () => { + let { repo, currentGroup } = this.props; + let isStaff = currentGroup.admins.indexOf(username) > -1; //for group repolist; + let isRepoOwner = repo.owner_email === username; + let isAdmin = repo.is_admin; + + let iconVisibility = this.state.isOperationShow ? '' : ' invisible'; + let shareIconClassName = 'sf2-icon-share sf2-x repo-share-btn op-icon' + iconVisibility; + let unshareIconClassName = 'sf2-icon-x3 sf2-x op-icon' + iconVisibility; + let deleteIconClassName = 'sf2-icon-delete sf2-x op-icon' + iconVisibility; + let operationMenuToggleIconClassName = 'sf2-icon-caret-down item-operation-menu-toggle-icon op-icon'; + if (window.innerWidth >= 768) { + operationMenuToggleIconClassName += iconVisibility; + } + + const commonToggle = ( + + + ); + + const commonOperationsInMenu = ( + + {gettext('Rename')} + {folderPermEnabled ? {gettext('Folder Permission')} : null} + {gettext('Details')} + + ); + + let desktopOperations; + let mobileOperationMenu; + + const share = ; + const unshare = + + const shareDropdownItem = {gettext('Share')}; + const unshareDropdownItem = {gettext('Unshare')}; + + if (isPro) { + if (repo.owner_email.indexOf('@seafile_group') != -1) { // group owned repo + if (isStaff) { + if (repo.owner_email == currentGroup.id + '@seafile_group') { // this repo belongs to the current group + desktopOperations = ( + + {share} + + + {commonToggle} + + {commonOperationsInMenu} + + + + ); + mobileOperationMenu = ( + + {shareDropdownItem} + {gettext('Delete')} + {commonOperationsInMenu} + + ); + } else { + desktopOperations = unshare; + mobileOperationMenu = unshareDropdownItem; + } + } + } else { + desktopOperations = ( + + {isRepoOwner || isAdmin ? share : null} + {isStaff || isRepoOwner || isAdmin ? unshare : null} + + ); + mobileOperationMenu = ( + + {isRepoOwner || isAdmin ? shareDropdownItem : null} + {isStaff || isRepoOwner || isAdmin ? unshareDropdownItem : null} + + ); + } + } else { + desktopOperations = ( + + {isRepoOwner ? share : null} + {isStaff || isRepoOwner ? unshare : null} + + ); + mobileOperationMenu = ( + + {isRepoOwner ? shareDropdownItem : null} + {isStaff || isRepoOwner ? unshareDropdownItem : null} + + ); + } + + const mobileOperations = ( + + {commonToggle} +
+
+
+ {mobileOperationMenu} +
+
+
+ ); + + return { desktopOperations, mobileOperations } } renderPCUI = () => { let { iconUrl, iconTitle, libPath } = this.getRepoComputeParams(); let { repo, isShowRepoOwner } = this.props; + let { desktopOperations } = this.generatorOperations(); return ( {iconTitle} {repo.repo_name} - {} + {desktopOperations} {repo.size} {moment(repo.last_modified).fromNow()} {isShowRepoOwner && {repo.owner_name}} @@ -76,6 +203,7 @@ class RepoListItem extends React.Component { renderMobileUI = () => { let { iconUrl, iconTitle, libPath } = this.getRepoComputeParams(); let { repo, isShowRepoOwner } = this.props; + let { mobileOperations } = this.generatorOperations(); return ( {iconTitle}/ @@ -85,7 +213,7 @@ class RepoListItem extends React.Component { {repo.size} {moment(repo.last_modified).fromNow()} - {} + {mobileOperations} ); } diff --git a/frontend/src/pages/groups/group-view.js b/frontend/src/pages/groups/group-view.js index a7da002cd7..82f2ec9e21 100644 --- a/frontend/src/pages/groups/group-view.js +++ b/frontend/src/pages/groups/group-view.js @@ -101,11 +101,21 @@ class GroupView extends React.Component { onCreateRepo = (repo) => { let groupId = this.props.groupID; - seafileAPI.createGroupRepo(groupId, repo).then(() => { - //todo update group list + seafileAPI.createGroupRepo(groupId, repo).then(res => { + let repo = new RepoInfo(res.data); + let repoList = this.addRepoItem(repo); + this.setState({repoList: repoList}); + }).catch(() => { + //todo }); } + addRepoItem = (repo) => { + let newRepoList = this.state.repoList.map(item => {return item;}); + newRepoList.push(repo); + return newRepoList; + } + getEmptyTip = () => { let currentGroup = this.state.currentGroup; let emptyTip = null; diff --git a/media/css/seahub_react.css b/media/css/seahub_react.css index 576d39cd51..62d00ac20a 100644 --- a/media/css/seahub_react.css +++ b/media/css/seahub_react.css @@ -83,6 +83,7 @@ .sf2-icon-close:before { content:"\e035"; } .sf2-icon-two-columns:before { content:"\e036"; } .sf2-icon-tag:before {content:"\e037"} +.sf2-icon-x3:before {content:"\e035";} /* common class and element style*/ a { color:#eb8205; }