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 (
 |
{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 (
 |
@@ -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; }