1
0
mirror of https://github.com/haiwen/seahub.git synced 2025-08-02 07:47:32 +00:00

Dir mode optimized (#2992)

* optimized isRepoOwner&isAdmin

* optimized isAdmin

* optimized encrypted porps

* optimized showShareBtn judgement

* repair share bug

* update showShareBtn logic

* delete unnecessary comment
This commit is contained in:
杨顺强 2019-02-27 13:53:36 +08:00 committed by Daniel Pan
parent 34d4fe1017
commit 344eca259a
12 changed files with 61 additions and 81 deletions

View File

@ -54,7 +54,7 @@ class ShareDialog extends React.Component {
const {repoEncrypted, userPerm, enableDirPrivateShare} = this.props;
const enableShareLink = !repoEncrypted && canGenerateShareLink;
const enableUploadLink = !repoEncrypted && canGenerateUploadLink && userPerm == 'rw';
return (
<Fragment>
<div className="share-dialog-side">
@ -112,10 +112,10 @@ class ShareDialog extends React.Component {
{enableDirPrivateShare &&
<Fragment>
<TabPane tabId="shareToUser">
<ShareToUser isGroupOwnedRepo={this.props.isGroupOwnedRepo} itemPath={this.props.itemPath} repoID={this.props.repoID} />
<ShareToUser itemType={this.props.itemType} isGroupOwnedRepo={this.props.isGroupOwnedRepo} itemPath={this.props.itemPath} repoID={this.props.repoID} />
</TabPane>
<TabPane tabId="shareToGroup">
<ShareToGroup isGroupOwnedRepo={this.props.isGroupOwnedRepo} itemPath={this.props.itemPath} repoID={this.props.repoID} />
<ShareToGroup itemType={this.props.itemType} isGroupOwnedRepo={this.props.isGroupOwnedRepo} itemPath={this.props.itemPath} repoID={this.props.repoID} />
</TabPane>
</Fragment>
}

View File

@ -86,6 +86,7 @@ class GroupList extends React.Component {
const propTypes = {
isGroupOwnedRepo: PropTypes.bool,
itemPath: PropTypes.string.isRequired,
itemType: PropTypes.string.isRequired,
repoID: PropTypes.string.isRequired
};
@ -106,7 +107,12 @@ class ShareToGroup extends React.Component {
sharedItems: []
};
this.options = [];
this.permissions = ['rw', 'r', 'cloud-edit', 'preview'];
this.permissions = []
if (this.props.itemType === 'library') {
this.permissions = ['rw', 'r', 'admin', 'cloud-edit', 'preview'];
} else if (this.props.itemType === 'dir') {
this.permissions = ['rw', 'r', 'cloud-edit', 'preview'];
}
if (this.props.isGroupOwnedRepo || !isPro) {
this.permissions = ['rw', 'r'];
}

View File

@ -86,6 +86,7 @@ class UserList extends React.Component {
const propTypes = {
isGroupOwnedRepo: PropTypes.bool,
itemPath: PropTypes.string.isRequired,
itemType: PropTypes.string.isRequired,
repoID: PropTypes.string.isRequired
};
@ -106,7 +107,12 @@ class ShareToUser extends React.Component {
sharedItems: []
};
this.options = [];
this.permissions = ['rw', 'r', 'admin', 'cloud-edit', 'preview'];
this.permissions = [];
if (this.props.itemType === 'library') {
this.permissions = ['rw', 'r', 'admin', 'cloud-edit', 'preview'];
} else if (this.props.itemType === 'dir') {
this.permissions = ['rw', 'r', 'cloud-edit', 'preview'];
}
if (this.props.isGroupOwnedRepo || !isPro) {
this.permissions = ['rw', 'r'];
}

View File

@ -2,7 +2,7 @@ import React, { Fragment } from 'react';
import PropTypes from 'prop-types';
import DirColumnNav from './dir-column-nav';
import DirColumnFile from './dir-column-file';
import DirListMode from './dir-list-view';
import DirListView from './dir-list-view';
import '../../css/lib-content-view.css';
@ -12,11 +12,8 @@ const propTypes = {
// repoinfo
currentRepoInfo: PropTypes.object.isRequired,
repoPermission: PropTypes.bool.isRequired,
repoEncrypted: PropTypes.bool.isRequired,
enableDirPrivateShare: PropTypes.bool.isRequired,
userPrem: PropTypes.bool,
isAdmin: PropTypes.bool.isRequired,
isRepoOwner: PropTypes.bool.isRequired,
isGroupOwnedRepo: PropTypes.bool.isRequired,
// tree
isTreeDataLoading: PropTypes.bool.isRequired,
@ -110,13 +107,10 @@ class DirColumnView extends React.Component {
onLinkClick={this.props.onLinkClick}
/>
) : (
<DirListMode
<DirListView
path={this.props.path}
repoID={this.props.repoID}
currentRepoInfo={this.props.currentRepoInfo}
repoEncrypted={this.props.repoEncrypted}
isRepoOwner={this.props.isRepoOwner}
isAdmin={this.props.isAdmin}
isGroupOwnedRepo={this.props.isGroupOwnedRepo}
enableDirPrivateShare={this.props.enableDirPrivateShare}
isRepoInfoBarShow={this.props.isRepoInfoBarShow}

View File

@ -7,9 +7,6 @@ const propTypes = {
path: PropTypes.string.isRequired,
repoID: PropTypes.string.isRequired,
currentRepoInfo: PropTypes.object.isRequired,
repoEncrypted: PropTypes.bool.isRequired,
isRepoOwner: PropTypes.bool.isRequired,
isAdmin: PropTypes.bool.isRequired,
isGroupOwnedRepo: PropTypes.bool.isRequired,
enableDirPrivateShare: PropTypes.bool.isRequired,
isRepoInfoBarShow: PropTypes.bool.isRequired,
@ -57,9 +54,6 @@ class DirListView extends React.Component {
path={this.props.path}
currentRepoInfo={this.props.currentRepoInfo}
repoID={this.props.repoID}
repoEncrypted={this.props.repoEncrypted}
isRepoOwner={this.props.isRepoOwner}
isAdmin={this.props.isAdmin}
isGroupOwnedRepo={this.props.isGroupOwnedRepo}
enableDirPrivateShare={this.props.enableDirPrivateShare}
direntList={this.props.direntList}

View File

@ -337,7 +337,7 @@ class DirentListItem extends React.Component {
let iconUrl = Utils.getDirentIcon(dirent);
const {repoEncrypted, isRepoOwner, isAdmin} = this.props;
const { repoEncrypted, isRepoOwner, isAdmin } = this.props;
let showShare = false;
if (!repoEncrypted &&
(dirent.permission == 'rw' || dirent.permission == 'r')) {
@ -462,7 +462,6 @@ class DirentListItem extends React.Component {
repoID={this.props.repoID}
repoEncrypted={false}
enableDirPrivateShare={this.props.enableDirPrivateShare}
isAdmin={this.props.isAdmin}
isGroupOwnedRepo={this.props.isGroupOwnedRepo}
toggleDialog={this.closeSharedDialog}
/>

View File

@ -1,6 +1,6 @@
import React, { Fragment } from 'react';
import PropTypes from 'prop-types';
import { siteRoot, gettext, thumbnailSizeForOriginal } from '../../utils/constants';
import { siteRoot, gettext, thumbnailSizeForOriginal, username } from '../../utils/constants';
import { Utils } from '../../utils/utils';
import Loading from '../loading';
import DirentListItem from './dirent-list-item';
@ -16,8 +16,6 @@ import toaster from '../toast';
const propTypes = {
path: PropTypes.string.isRequired,
repoID: PropTypes.string.isRequired,
repoEncrypted: PropTypes.bool.isRequired,
isRepoOwner: PropTypes.bool,
currentRepoInfo: PropTypes.object,
isAllItemSelected: PropTypes.bool.isRequired,
isDirentListLoading: PropTypes.bool.isRequired,
@ -52,6 +50,10 @@ class DirentListView extends React.Component {
isCreateFileDialogShow: false,
fileType: ''
};
this.isRepoOwner = props.currentRepoInfo.owner_email === username;
this.isAdmin = props.currentRepoInfo.is_admin;
this.repoEncrypted = props.currentRepoInfo.encrypted;
}
onFreezedItem = () => {
@ -122,7 +124,7 @@ class DirentListView extends React.Component {
return Utils.imageCheck(item.name);
});
const useThumbnail = !this.props.repoEncrypted;
const useThumbnail = !this.repoEncrypted;
let prepareItem = (item) => {
const name = item.name;
@ -260,7 +262,11 @@ class DirentListView extends React.Component {
path={this.props.path}
repoID={this.props.repoID}
currentRepoInfo={this.props.currentRepoInfo}
isRepoOwner={this.props.isRepoOwner}
isAdmin={this.isAdmin}
isRepoOwner={this.isRepoOwner}
repoEncrypted={this.repoEncrypted}
enableDirPrivateShare={this.props.enableDirPrivateShare}
isGroupOwnedRepo={this.props.isGroupOwnedRepo}
direntList={this.props.direntList}
onItemClick={this.props.onItemClick}
onItemRenameToggle={this.onItemRenameToggle}
@ -276,10 +282,6 @@ class DirentListView extends React.Component {
onDirentClick={this.props.onDirentClick}
onItemDetails={this.onItemDetails}
showImagePopup={this.showImagePopup}
repoEncrypted={this.props.repoEncrypted}
enableDirPrivateShare={this.props.enableDirPrivateShare}
isAdmin={this.props.isAdmin}
isGroupOwnedRepo={this.props.isGroupOwnedRepo}
/>
);
})

View File

@ -14,7 +14,6 @@ const propTypes = {
repoEncrypted: PropTypes.bool.isRequired,
enableDirPrivateShare: PropTypes.bool.isRequired,
userPerm: PropTypes.string.isRequired,
isAdmin: PropTypes.bool.isRequired,
isGroupOwnedRepo: PropTypes.bool.isRequired,
showShareBtn: PropTypes.bool.isRequired,
onAddFile: PropTypes.func.isRequired,
@ -155,7 +154,7 @@ class DirOperationToolbar extends React.Component {
render() {
let { path, repoName } = this.props;
let itemType = 'dir';
let itemType = path === '/' ? 'library' : 'dir';
let itemName = path == '/' ? repoName : Utils.getFolderName(path);
return (
<Fragment>
@ -217,7 +216,6 @@ class DirOperationToolbar extends React.Component {
repoEncrypted={this.props.repoEncrypted}
enableDirPrivateShare={this.props.enableDirPrivateShare}
userPerm={this.props.userPerm}
isAdmin={this.props.isAdmin}
isGroupOwnedRepo={this.props.isGroupOwnedRepo}
toggleDialog={this.onShareClick}
/>

View File

@ -10,11 +10,15 @@ class RepoInfo {
this.owner_name = object.owner_name;
this.owner_email = object.owner_email;
this.owner_contact_email = object.owner_contact_email;
// is repo shared admin;
// is repo shared admin && is one of current ordinary group's admins;
// is one of current group owned group's admins;
this.is_admin = object.is_admin;
this.is_virtual = object.is_virtual;
this.no_quota = object.no_quota;
this.has_been_shared_out = object.has_been_shared_out;
this.encrypted = object.encrypted;
this.lib_need_decrypt = object.lib_need_decrypt;
}
}

View File

@ -15,13 +15,9 @@ const propTypes = {
// repoinfo
currentRepoInfo: PropTypes.object.isRequired,
repoID: PropTypes.string.isRequired,
repoName: PropTypes.string.isRequired,
repoPermission: PropTypes.bool.isRequired,
repoEncrypted: PropTypes.bool.isRequired,
enableDirPrivateShare: PropTypes.bool.isRequired,
userPrem: PropTypes.bool,
isAdmin: PropTypes.bool.isRequired,
isRepoOwner: PropTypes.bool.isRequired,
isGroupOwnedRepo: PropTypes.bool.isRequired,
// path func
onTabNavClick: PropTypes.func.isRequired,
@ -133,10 +129,10 @@ class LibContentContainer extends React.Component {
<div className="cur-view-container">
<div className="cur-view-path">
<CurDirPath
pathPrefix={this.props.pathPrefix}
currentPath={this.props.path}
repoID={repoID}
repoName={this.props.currentRepoInfo.repo_name}
pathPrefix={this.props.pathPrefix}
currentPath={this.props.path}
permission={this.props.repoPermission}
onTabNavClick={this.props.onTabNavClick}
onPathClick={this.onPathClick}
@ -151,9 +147,6 @@ class LibContentContainer extends React.Component {
path={this.props.path}
repoID={repoID}
currentRepoInfo={this.props.currentRepoInfo}
repoEncrypted={this.props.repoEncrypted}
isRepoOwner={this.props.isRepoOwner}
isAdmin={this.props.isAdmin}
isGroupOwnedRepo={this.props.isGroupOwnedRepo}
enableDirPrivateShare={this.props.enableDirPrivateShare}
isRepoInfoBarShow={isRepoInfoBarShow}
@ -191,9 +184,6 @@ class LibContentContainer extends React.Component {
repoID={repoID}
currentRepoInfo={this.props.currentRepoInfo}
repoPermission={this.props.repoPermission}
repoEncrypted={this.props.repoEncrypted}
isRepoOwner={this.props.isRepoOwner}
isAdmin={this.props.isAdmin}
isGroupOwnedRepo={this.props.isGroupOwnedRepo}
enableDirPrivateShare={this.props.enableDirPrivateShare}
isTreeDataLoading={this.props.isTreeDataLoading}

View File

@ -28,7 +28,6 @@ const propTypes = {
direntList: PropTypes.array.isRequired,
repoName: PropTypes.string.isRequired,
repoEncrypted: PropTypes.bool.isRequired,
isAdmin: PropTypes.bool.isRequired,
isGroupOwnedRepo: PropTypes.bool.isRequired,
userPerm: PropTypes.string.isRequired,
showShareBtn: PropTypes.bool.isRequired,
@ -122,7 +121,6 @@ class LibContentToolbar extends React.Component {
showShareBtn={this.props.showShareBtn}
enableDirPrivateShare={this.props.enableDirPrivateShare}
userPerm={this.props.userPerm}
isAdmin={this.props.isAdmin}
isGroupOwnedRepo={this.props.isGroupOwnedRepo}
onAddFile={this.props.onAddFile}
onAddFolder={this.props.onAddFolder}

View File

@ -42,11 +42,7 @@ class LibContentView extends React.Component {
repoEncrypted: false,
libNeedDecrypt: false,
isGroupOwnedRepo: false,
isDepartmentAdmin: false,
isAdmin: false,
ownerEmail: '',
userPerm: '',
isVirtual: false,
selectedDirentList: [],
isDraft: false,
hasDraft: false,
@ -98,27 +94,11 @@ class LibContentView extends React.Component {
this.setState({
currentRepoInfo: repoInfo,
repoName: repoInfo.repo_name,
libNeedDecrypt: res.data.lib_need_decrypt,
libNeedDecrypt: repoInfo.lib_need_decrypt,
repoEncrypted: repoInfo.encrypted,
isVirtual: repoInfo.is_virtual,
isAdmin: repoInfo.is_admin,
ownerEmail: repoInfo.owner_email,
repoPermission: repoInfo.permission === 'rw'
});
const ownerEmail = repoInfo.owner_email;
if (repoInfo.owner_email.indexOf('@seafile_group') != -1) {
const groupID = ownerEmail.substring(0, ownerEmail.indexOf('@'));
this.setState({isGroupOwnedRepo: true});
seafileAPI.getGroup(groupID).then(res => {
if (res.data.admins.indexOf(username) != -1) {
this.setState({isDepartmentAdmin: true});
}
});
}
let repoID = repoInfo.repo_id;
let path = location.slice(location.indexOf(repoID) + repoID.length + 1); // get the string after repoID
path = path.slice(path.indexOf('/')); // get current path
@ -127,7 +107,7 @@ class LibContentView extends React.Component {
this.setState({path: path});
if (!res.data.lib_need_decrypt) {
if (!repoInfo.lib_need_decrypt) {
this.loadDirData(path);
}
}).catch(error => {
@ -1192,15 +1172,29 @@ class LibContentView extends React.Component {
let showShareBtn = false;
let enableDirPrivateShare = false;
const { repoEncrypted, isAdmin, ownerEmail, userPerm, isVirtual, isDepartmentAdmin } = this.state;
let isRepoOwner = ownerEmail === username;
let { currentRepoInfo, repoEncrypted, userPerm } = this.state;
let isAdmin = currentRepoInfo.is_admin;
let isVirtual = currentRepoInfo.is_virtual;
let isRepoOwner = currentRepoInfo.owner_email === username;
if (!repoEncrypted) {
if ((canGenerateShareLink || canGenerateUploadLink || isRepoOwner || isAdmin) && (userPerm == 'rw' || userPerm == 'r')) {
showShareBtn = true;
if (!isVirtual && (isRepoOwner || isAdmin || isDepartmentAdmin)) {
enableDirPrivateShare = true;
}
let showGenerateShareLinkTab = false;
if (canGenerateShareLink && (userPerm == 'rw' || userPerm == 'r')) {
showGenerateShareLinkTab = true;
}
let showGenerateUploadLinkTab = false;
if (canGenerateUploadLink && (userPerm == 'rw')) {
showGenerateUploadLinkTab = true;
}
if (!isVirtual && (isRepoOwner || isAdmin)) {
enableDirPrivateShare = true;
}
if (showGenerateShareLinkTab || showGenerateUploadLinkTab || enableDirPrivateShare) {
showShareBtn = true;
}
}
return (
@ -1222,7 +1216,6 @@ class LibContentView extends React.Component {
direntList={this.state.direntList}
repoName={this.state.repoName}
repoEncrypted={this.state.repoEncrypted}
isAdmin={this.state.isAdmin}
isGroupOwnedRepo={this.state.isGroupOwnedRepo}
userPerm={this.state.userPerm}
showShareBtn={showShareBtn}
@ -1244,13 +1237,9 @@ class LibContentView extends React.Component {
pathExist={this.state.pathExist}
currentRepoInfo={this.state.currentRepoInfo}
repoID={this.props.repoID}
repoName={this.state.repoName}
repoPermission={this.state.repoPermission}
repoEncrypted={this.state.repoEncrypted}
enableDirPrivateShare={enableDirPrivateShare}
userPerm={userPerm}
isAdmin={isAdmin}
isRepoOwner={isRepoOwner}
isGroupOwnedRepo={this.state.isGroupOwnedRepo}
onTabNavClick={this.props.onTabNavClick}
onMainNavBarClick={this.onMainNavBarClick}