1
0
mirror of https://github.com/haiwen/seahub.git synced 2025-08-19 23:48:51 +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

@ -112,10 +112,10 @@ class ShareDialog extends React.Component {
{enableDirPrivateShare && {enableDirPrivateShare &&
<Fragment> <Fragment>
<TabPane tabId="shareToUser"> <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>
<TabPane tabId="shareToGroup"> <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> </TabPane>
</Fragment> </Fragment>
} }

View File

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

View File

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

View File

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

View File

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

View File

@ -462,7 +462,6 @@ class DirentListItem extends React.Component {
repoID={this.props.repoID} repoID={this.props.repoID}
repoEncrypted={false} repoEncrypted={false}
enableDirPrivateShare={this.props.enableDirPrivateShare} enableDirPrivateShare={this.props.enableDirPrivateShare}
isAdmin={this.props.isAdmin}
isGroupOwnedRepo={this.props.isGroupOwnedRepo} isGroupOwnedRepo={this.props.isGroupOwnedRepo}
toggleDialog={this.closeSharedDialog} toggleDialog={this.closeSharedDialog}
/> />

View File

@ -1,6 +1,6 @@
import React, { Fragment } from 'react'; import React, { Fragment } from 'react';
import PropTypes from 'prop-types'; 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 { Utils } from '../../utils/utils';
import Loading from '../loading'; import Loading from '../loading';
import DirentListItem from './dirent-list-item'; import DirentListItem from './dirent-list-item';
@ -16,8 +16,6 @@ import toaster from '../toast';
const propTypes = { const propTypes = {
path: PropTypes.string.isRequired, path: PropTypes.string.isRequired,
repoID: PropTypes.string.isRequired, repoID: PropTypes.string.isRequired,
repoEncrypted: PropTypes.bool.isRequired,
isRepoOwner: PropTypes.bool,
currentRepoInfo: PropTypes.object, currentRepoInfo: PropTypes.object,
isAllItemSelected: PropTypes.bool.isRequired, isAllItemSelected: PropTypes.bool.isRequired,
isDirentListLoading: PropTypes.bool.isRequired, isDirentListLoading: PropTypes.bool.isRequired,
@ -52,6 +50,10 @@ class DirentListView extends React.Component {
isCreateFileDialogShow: false, isCreateFileDialogShow: false,
fileType: '' fileType: ''
}; };
this.isRepoOwner = props.currentRepoInfo.owner_email === username;
this.isAdmin = props.currentRepoInfo.is_admin;
this.repoEncrypted = props.currentRepoInfo.encrypted;
} }
onFreezedItem = () => { onFreezedItem = () => {
@ -122,7 +124,7 @@ class DirentListView extends React.Component {
return Utils.imageCheck(item.name); return Utils.imageCheck(item.name);
}); });
const useThumbnail = !this.props.repoEncrypted; const useThumbnail = !this.repoEncrypted;
let prepareItem = (item) => { let prepareItem = (item) => {
const name = item.name; const name = item.name;
@ -260,7 +262,11 @@ class DirentListView extends React.Component {
path={this.props.path} path={this.props.path}
repoID={this.props.repoID} repoID={this.props.repoID}
currentRepoInfo={this.props.currentRepoInfo} 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} direntList={this.props.direntList}
onItemClick={this.props.onItemClick} onItemClick={this.props.onItemClick}
onItemRenameToggle={this.onItemRenameToggle} onItemRenameToggle={this.onItemRenameToggle}
@ -276,10 +282,6 @@ class DirentListView extends React.Component {
onDirentClick={this.props.onDirentClick} onDirentClick={this.props.onDirentClick}
onItemDetails={this.onItemDetails} onItemDetails={this.onItemDetails}
showImagePopup={this.showImagePopup} 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, repoEncrypted: PropTypes.bool.isRequired,
enableDirPrivateShare: PropTypes.bool.isRequired, enableDirPrivateShare: PropTypes.bool.isRequired,
userPerm: PropTypes.string.isRequired, userPerm: PropTypes.string.isRequired,
isAdmin: PropTypes.bool.isRequired,
isGroupOwnedRepo: PropTypes.bool.isRequired, isGroupOwnedRepo: PropTypes.bool.isRequired,
showShareBtn: PropTypes.bool.isRequired, showShareBtn: PropTypes.bool.isRequired,
onAddFile: PropTypes.func.isRequired, onAddFile: PropTypes.func.isRequired,
@ -155,7 +154,7 @@ class DirOperationToolbar extends React.Component {
render() { render() {
let { path, repoName } = this.props; let { path, repoName } = this.props;
let itemType = 'dir'; let itemType = path === '/' ? 'library' : 'dir';
let itemName = path == '/' ? repoName : Utils.getFolderName(path); let itemName = path == '/' ? repoName : Utils.getFolderName(path);
return ( return (
<Fragment> <Fragment>
@ -217,7 +216,6 @@ class DirOperationToolbar extends React.Component {
repoEncrypted={this.props.repoEncrypted} repoEncrypted={this.props.repoEncrypted}
enableDirPrivateShare={this.props.enableDirPrivateShare} enableDirPrivateShare={this.props.enableDirPrivateShare}
userPerm={this.props.userPerm} userPerm={this.props.userPerm}
isAdmin={this.props.isAdmin}
isGroupOwnedRepo={this.props.isGroupOwnedRepo} isGroupOwnedRepo={this.props.isGroupOwnedRepo}
toggleDialog={this.onShareClick} toggleDialog={this.onShareClick}
/> />

View File

@ -10,11 +10,15 @@ class RepoInfo {
this.owner_name = object.owner_name; this.owner_name = object.owner_name;
this.owner_email = object.owner_email; this.owner_email = object.owner_email;
this.owner_contact_email = object.owner_contact_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_admin = object.is_admin;
this.is_virtual = object.is_virtual; this.is_virtual = object.is_virtual;
this.no_quota = object.no_quota; this.no_quota = object.no_quota;
this.has_been_shared_out = object.has_been_shared_out; this.has_been_shared_out = object.has_been_shared_out;
this.encrypted = object.encrypted; this.encrypted = object.encrypted;
this.lib_need_decrypt = object.lib_need_decrypt;
} }
} }

View File

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

View File

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

View File

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