2018-12-10 13:44:11 +08:00
import React , { Fragment } from 'react' ;
2018-12-19 10:44:23 +08:00
import { Popover } from 'reactstrap' ;
2018-12-08 08:37:18 +08:00
import PropTypes from 'prop-types' ;
2019-03-19 10:35:21 +08:00
import cookie from 'react-cookies' ;
2019-12-05 15:45:16 +08:00
import { gettext , siteRoot , username , canAddRepo } from '../../utils/constants' ;
2018-12-11 18:05:57 +08:00
import { Link } from '@reach/router' ;
2018-12-08 08:37:18 +08:00
import { seafileAPI } from '../../utils/seafile-api' ;
2019-01-02 10:53:38 +08:00
import { Utils } from '../../utils/utils' ;
2018-12-10 13:44:11 +08:00
import Loading from '../../components/loading' ;
2019-06-10 17:30:10 +08:00
import EmptyTip from '../../components/empty-tip' ;
2018-12-10 17:59:26 +08:00
import ModalPortal from '../../components/modal-portal' ;
2018-12-08 08:37:18 +08:00
import Group from '../../models/group' ;
2018-12-18 17:21:01 +08:00
import Repo from '../../models/repo' ;
2019-05-28 17:48:44 +08:00
import toaster from '../../components/toast' ;
2018-12-10 13:44:11 +08:00
import CommonToolbar from '../../components/toolbar/common-toolbar' ;
2018-12-10 17:59:26 +08:00
import CreateRepoDialog from '../../components/dialog/create-repo-dialog' ;
import CreateDepartmentRepoDialog from '../../components/dialog/create-department-repo-dialog' ;
2018-12-19 10:44:23 +08:00
import DismissGroupDialog from '../../components/dialog/dismiss-group-dialog' ;
import RenameGroupDialog from '../../components/dialog/rename-group-dialog' ;
2018-12-24 18:25:12 +08:00
import TransferGroupDialog from '../../components/dialog/transfer-group-dialog' ;
// import ImportMembersDialog from '../../components/dialog/import-members-dialog';
import ManageMembersDialog from '../../components/dialog/manage-members-dialog' ;
2019-07-04 13:49:16 +08:00
import LeaveGroupDialog from '../../components/dialog/leave-group-dialog' ;
2018-12-10 18:19:03 +08:00
import SharedRepoListView from '../../components/shared-repo-list-view/shared-repo-list-view' ;
2018-12-29 18:25:18 +08:00
import LibDetail from '../../components/dirent-detail/lib-details' ;
2019-07-18 20:21:50 +08:00
import SortOptionsDialog from '../../components/dialog/sort-options' ;
2018-12-29 18:25:18 +08:00
2018-12-24 18:25:12 +08:00
import '../../css/group-view.css' ;
2018-12-08 08:37:18 +08:00
const propTypes = {
2018-12-08 16:35:00 +08:00
onShowSidePanel : PropTypes . func . isRequired ,
onSearchedClick : PropTypes . func . isRequired ,
2018-12-19 10:44:23 +08:00
onGroupChanged : PropTypes . func . isRequired ,
2019-01-31 17:37:02 +08:00
onTabNavClick : PropTypes . func . isRequired ,
2018-12-19 10:44:23 +08:00
groupID : PropTypes . string ,
2018-12-08 08:37:18 +08:00
} ;
class GroupView extends React . Component {
constructor ( props ) {
super ( props ) ;
this . state = {
isLoading : true ,
errMessage : '' ,
2018-12-08 16:35:00 +08:00
emptyTip : null ,
2018-12-08 08:37:18 +08:00
currentGroup : null ,
2018-12-29 18:25:18 +08:00
currentRepo : null ,
2018-12-08 16:35:00 +08:00
isStaff : false ,
2018-12-24 18:25:12 +08:00
isOwner : false ,
2019-05-29 13:57:12 +08:00
sortBy : cookie . load ( 'seafile-repo-dir-sort-by' ) || 'name' , // 'name' or 'time' or 'size'
2019-04-12 14:30:08 +08:00
sortOrder : cookie . load ( 'seafile-repo-dir-sort-order' ) || 'asc' , // 'asc' or 'desc'
2019-07-18 20:21:50 +08:00
isSortOptionsDialogOpen : false ,
2018-12-08 08:37:18 +08:00
repoList : [ ] ,
2018-12-10 17:59:26 +08:00
libraryType : 'group' ,
isCreateRepoDialogShow : false ,
isDepartmentGroup : false ,
2018-12-19 10:44:23 +08:00
showGroupDropdown : false ,
2018-12-24 18:25:12 +08:00
showGroupMembersPopover : false ,
2018-12-19 10:44:23 +08:00
showRenameGroupDialog : false ,
showDismissGroupDialog : false ,
2018-12-24 18:25:12 +08:00
showTransferGroupDialog : false ,
// showImportMembersDialog: false,
showManageMembersDialog : false ,
groupMembers : [ ] ,
2018-12-29 18:25:18 +08:00
isShowDetails : false ,
2019-07-05 11:05:26 +08:00
isLeaveGroupDialogOpen : false ,
2018-12-19 10:44:23 +08:00
} ;
2018-12-08 08:37:18 +08:00
}
componentDidMount ( ) {
let groupID = this . props . groupID ;
this . loadGroup ( groupID ) ;
}
componentWillReceiveProps ( nextProps ) {
if ( nextProps . groupID !== this . props . groupID ) {
this . loadGroup ( nextProps . groupID ) ;
}
}
loadGroup = ( groupID ) => {
seafileAPI . getGroup ( groupID ) . then ( ( res ) => {
let currentGroup = new Group ( res . data ) ;
2018-12-08 16:35:00 +08:00
let emptyTip = this . getEmptyTip ( currentGroup ) ;
let isStaff = currentGroup . admins . indexOf ( username ) > - 1 ; //for item operations
2018-12-24 18:25:12 +08:00
let isOwner = currentGroup . owner === username ? true : false ;
2019-01-23 14:12:13 +08:00
let isDepartmentGroup = currentGroup . parent _group _id !== 0 ;
2018-12-08 16:35:00 +08:00
this . setState ( {
emptyTip : emptyTip ,
currentGroup : currentGroup ,
isStaff : isStaff ,
2018-12-10 17:59:26 +08:00
isDepartmentGroup : isDepartmentGroup ,
2018-12-24 18:25:12 +08:00
isOwner : isOwner ,
2018-12-08 16:35:00 +08:00
} ) ;
2018-12-08 08:37:18 +08:00
this . loadRepos ( groupID ) ;
} ) . catch ( ( error ) => {
2019-12-05 15:45:16 +08:00
this . setState ( {
isLoading : false ,
2019-12-19 13:44:30 +08:00
errMessage : Utils . getErrorMsg ( error , true ) // true: show login tip if 403
2019-12-05 15:45:16 +08:00
} ) ;
2018-12-08 08:37:18 +08:00
} ) ;
}
loadRepos = ( groupID ) => {
this . setState ( { isLoading : true } ) ;
seafileAPI . listGroupRepos ( groupID ) . then ( ( res ) => {
let repoList = res . data . map ( item => {
2018-12-18 17:21:01 +08:00
let repo = new Repo ( item ) ;
return repo ;
2018-12-08 08:37:18 +08:00
} ) ;
this . setState ( {
isLoading : false ,
2019-01-02 10:53:38 +08:00
repoList : Utils . sortRepos ( repoList , this . state . sortBy , this . state . sortOrder )
2018-12-08 08:37:18 +08:00
} ) ;
} ) . catch ( ( error ) => {
2019-12-05 15:45:16 +08:00
this . setState ( {
isLoading : false ,
2019-12-19 13:44:30 +08:00
errMessage : Utils . getErrorMsg ( error , true ) // true: show login tip if 403
2019-12-05 15:45:16 +08:00
} ) ;
2018-12-08 08:37:18 +08:00
} ) ;
}
2018-12-08 16:35:00 +08:00
getEmptyTip = ( currentGroup ) => {
2018-12-08 08:37:18 +08:00
let emptyTip = null ;
if ( currentGroup ) {
if ( currentGroup . parent _group _id === 0 ) {
emptyTip = (
2019-06-10 17:30:10 +08:00
< EmptyTip >
2020-01-03 16:50:17 +08:00
< h2 > { gettext ( 'No libraries shared with this group' ) } < / h 2 >
< p > { gettext ( 'No libraries have been shared with this group yet. A library shared with a group can be accessed by all group members. You can share a library with a group in "My Libraries". You can also create a new library to be shared with this group by clicking the "New Library" button in the menu bar.' ) } < / p >
2019-06-10 17:30:10 +08:00
< / E m p t y T i p >
2018-12-08 08:37:18 +08:00
) ;
} else {
2018-12-08 16:35:00 +08:00
if ( currentGroup . admins . indexOf ( username ) == - 1 ) { // is a member of this group
2018-12-08 08:37:18 +08:00
emptyTip = (
2019-06-10 17:30:10 +08:00
< EmptyTip >
2018-12-08 08:37:18 +08:00
< h2 > { gettext ( 'No libraries' ) } < / h 2 >
2019-06-10 17:30:10 +08:00
< / E m p t y T i p >
2018-12-08 08:37:18 +08:00
) ;
} else {
emptyTip = (
2019-06-10 17:30:10 +08:00
< EmptyTip >
2018-12-08 08:37:18 +08:00
< h2 > { gettext ( 'No libraries' ) } < / h 2 >
< p > { gettext ( 'You can create libraries by clicking the "New Library" button above.' ) } < / p >
2019-06-10 17:30:10 +08:00
< / E m p t y T i p >
2018-12-08 08:37:18 +08:00
) ;
}
}
}
return emptyTip ;
}
2018-12-10 17:59:26 +08:00
onCreateRepoToggle = ( ) => {
this . setState ( { isCreateRepoDialogShow : ! this . state . isCreateRepoDialogShow } ) ;
}
2018-12-16 11:17:17 +08:00
onCreateRepo = ( repo , groupOwnerType ) => {
2018-12-10 13:44:11 +08:00
let groupId = this . props . groupID ;
2018-12-16 11:17:17 +08:00
if ( groupOwnerType && groupOwnerType === 'department' ) {
seafileAPI . createGroupOwnedLibrary ( groupId , repo ) . then ( res => { //need modify endpoint api
let object = {
repo _id : res . data . id ,
repo _name : res . data . name ,
2018-12-17 15:12:10 +08:00
owner _name : res . data . group _name ,
2018-12-16 11:17:17 +08:00
owner _email : res . data . owner ,
permission : res . data . permission ,
mtime : res . data . mtime ,
size : res . data . size ,
encrypted : res . data . encrypted ,
} ;
2018-12-18 17:21:01 +08:00
let repo = new Repo ( object ) ;
2018-12-16 11:17:17 +08:00
let repoList = this . addRepoItem ( repo ) ;
this . setState ( { repoList : repoList } ) ;
2019-07-16 10:01:09 +08:00
} ) . catch ( error => {
let errMessage = Utils . getErrorMsg ( error ) ;
toaster . danger ( errMessage ) ;
2018-12-16 11:17:17 +08:00
} ) ;
} else {
seafileAPI . createGroupRepo ( groupId , repo ) . then ( res => {
2018-12-18 17:21:01 +08:00
let repo = new Repo ( res . data ) ;
2018-12-16 11:17:17 +08:00
let repoList = this . addRepoItem ( repo ) ;
this . setState ( { repoList : repoList } ) ;
2019-07-16 10:01:09 +08:00
} ) . catch ( error => {
let errMessage = Utils . getErrorMsg ( error ) ;
toaster . danger ( errMessage ) ;
2018-12-16 11:17:17 +08:00
} ) ;
}
this . onCreateRepoToggle ( ) ;
}
onItemDelete = ( repo ) => {
let groupID = this . props . groupID ;
2020-07-27 11:06:59 +08:00
let repoList = this . state . repoList . filter ( item => {
return item . repo _id !== repo . repo _id ;
2018-12-10 13:44:11 +08:00
} ) ;
2020-07-27 11:06:59 +08:00
this . setState ( { repoList : repoList } ) ;
this . loadGroup ( groupID ) ;
2018-12-10 13:44:11 +08:00
}
addRepoItem = ( repo ) => {
let newRepoList = this . state . repoList . map ( item => { return item ; } ) ;
2018-12-22 15:18:53 +08:00
newRepoList . unshift ( repo ) ;
2018-12-10 13:44:11 +08:00
return newRepoList ;
}
2018-12-10 18:37:59 +08:00
onItemUnshare = ( repo ) => {
2018-12-10 17:59:26 +08:00
let group = this . state . currentGroup ;
2019-07-02 15:36:08 +08:00
seafileAPI . unshareRepoToGroup ( repo . repo _id , group . id ) . then ( ( ) => {
2018-12-10 17:59:26 +08:00
let repoList = this . state . repoList . filter ( item => {
return item . repo _id !== repo . repo _id ;
} ) ;
this . setState ( { repoList : repoList } ) ;
2019-07-01 15:41:30 +08:00
this . loadGroup ( group . id ) ;
2019-07-16 10:01:09 +08:00
} ) . catch ( error => {
let errMessage = Utils . getErrorMsg ( error ) ;
toaster . danger ( errMessage ) ;
2018-12-10 17:59:26 +08:00
} ) ;
}
2019-02-11 15:22:42 +08:00
onItemRename = ( repo , newName ) => {
seafileAPI . renameGroupOwnedLibrary ( this . props . groupID , repo . repo _id , newName ) . then ( res => {
let repoList = this . state . repoList . map ( item => {
if ( item . repo _id === repo . repo _id ) {
item . repo _name = newName ;
}
return item ;
} ) ;
this . setState ( { repoList : repoList } ) ;
2019-07-16 10:01:09 +08:00
} ) . catch ( error => {
let errMessage = Utils . getErrorMsg ( error ) ;
toaster . danger ( errMessage ) ;
2019-02-11 15:22:42 +08:00
} ) ;
}
2018-12-13 14:40:09 +08:00
onTabNavClick = ( tabName ) => {
this . props . onTabNavClick ( tabName ) ;
}
2018-12-19 10:44:23 +08:00
toggleGroupDropdown = ( ) => {
this . setState ( {
showGroupDropdown : ! this . state . showGroupDropdown
} ) ;
}
toggleDismissGroupDialog = ( ) => {
this . setState ( {
2018-12-29 11:43:07 +08:00
showDismissGroupDialog : ! this . state . showDismissGroupDialog ,
showGroupDropdown : false ,
2018-12-19 10:44:23 +08:00
} ) ;
}
toggleRenameGroupDialog = ( ) => {
this . setState ( {
2018-12-29 11:43:07 +08:00
showRenameGroupDialog : ! this . state . showRenameGroupDialog ,
showGroupDropdown : false ,
2018-12-19 10:44:23 +08:00
} ) ;
}
2018-12-13 14:40:09 +08:00
2018-12-24 18:25:12 +08:00
toggleTransferGroupDialog = ( ) => {
this . setState ( {
2018-12-29 11:43:07 +08:00
showTransferGroupDialog : ! this . state . showTransferGroupDialog ,
showGroupDropdown : false ,
2018-12-24 18:25:12 +08:00
} ) ;
}
// toggleImportMembersDialog= () => {
// this.setState({
// showImportMembersDialog: !this.state.showImportMembersDialog
// });
// }
toggleManageMembersDialog = ( ) => {
this . setState ( {
2018-12-29 11:43:07 +08:00
showManageMembersDialog : ! this . state . showManageMembersDialog ,
showGroupDropdown : false ,
2018-12-24 18:25:12 +08:00
} ) ;
}
2019-07-04 13:49:16 +08:00
toggleLeaveGroupDialog = ( ) => {
this . setState ( {
2019-07-05 11:05:26 +08:00
isLeaveGroupDialogOpen : ! this . state . isLeaveGroupDialogOpen ,
2019-07-04 13:49:16 +08:00
showGroupDropdown : false ,
} ) ;
}
2018-12-24 18:25:12 +08:00
listGroupMembers = ( ) => {
seafileAPI . listGroupMembers ( this . props . groupID ) . then ( ( res ) => {
this . setState ( {
groupMembers : res . data
} ) ;
2019-07-16 10:01:09 +08:00
} ) . catch ( error => {
let errMessage = Utils . getErrorMsg ( error ) ;
toaster . danger ( errMessage ) ;
2018-12-24 18:25:12 +08:00
} ) ;
}
toggleGroupMembersPopover = ( state ) => {
if ( state === 'open' ) {
this . listGroupMembers ( ) ;
this . setState ( {
showGroupMembersPopover : true
} ) ;
} else {
this . setState ( {
showGroupMembersPopover : false
} ) ;
}
}
2018-12-29 18:25:18 +08:00
onItemDetails = ( repo ) => {
this . setState ( {
isShowDetails : true ,
currentRepo : repo ,
} ) ;
}
closeDetails = ( ) => {
this . setState ( { isShowDetails : false } ) ;
}
2019-01-02 10:53:38 +08:00
sortItems = ( sortBy , sortOrder ) => {
2019-04-12 14:30:08 +08:00
cookie . save ( 'seafile-repo-dir-sort-by' , sortBy ) ;
cookie . save ( 'seafile-repo-dir-sort-order' , sortOrder ) ;
2019-01-02 10:53:38 +08:00
this . setState ( {
sortBy : sortBy ,
sortOrder : sortOrder ,
repoList : Utils . sortRepos ( this . state . repoList , sortBy , sortOrder )
} ) ;
}
2019-03-07 16:40:01 +08:00
translateRole = ( role ) => {
if ( role === 'Admin' ) {
return gettext ( 'Admin' ) ;
}
else if ( role === 'Member' ) {
return gettext ( 'Member' ) ;
}
else if ( role === 'Owner' ) {
return gettext ( 'Owner' ) ;
}
}
2019-07-18 20:21:50 +08:00
toggleSortOptionsDialog = ( ) => {
this . setState ( {
isSortOptionsDialogOpen : ! this . state . isSortOptionsDialogOpen
} ) ;
}
2018-12-08 08:37:18 +08:00
render ( ) {
2019-05-05 12:00:41 +08:00
let { errMessage , emptyTip , currentGroup , isDepartmentGroup , isStaff } = this . state ;
2019-09-04 15:52:24 +08:00
let isShowSettingIcon = false ;
if ( currentGroup ) { // group message is loaded
if ( currentGroup . parent _group _id === 0 ) {
isShowSettingIcon = true ;
} else {
if ( currentGroup . admins . indexOf ( username ) > - 1 ) {
isShowSettingIcon = true ;
}
}
}
2019-07-01 15:41:30 +08:00
let useRate = 0 ;
if ( isDepartmentGroup && currentGroup . group _quota ) {
useRate = currentGroup . group _quota _usage / currentGroup . group _quota * 100 + '%' ;
}
2018-12-08 08:37:18 +08:00
return (
2018-12-10 13:44:11 +08:00
< Fragment >
2019-02-20 11:54:25 +08:00
< div className = "main-panel-north border-left-show" >
< div className = "cur-view-toolbar" >
2018-12-10 17:59:26 +08:00
< span className = "sf2-icon-menu side-nav-toggle hidden-md-up d-md-none" title = "Side Nav Menu" onClick = { this . props . onShowSidePanel } > < / s p a n >
< div className = "operation" >
2019-05-05 13:25:02 +08:00
{ ( ( ! isDepartmentGroup && canAddRepo ) || ( isDepartmentGroup && isStaff ) ) && (
2019-08-22 20:23:08 +08:00
Utils . isDesktop ( ) ? (
2019-01-31 17:37:02 +08:00
< button className = "btn btn-secondary operation-item" title = { gettext ( 'New Library' ) } onClick = { this . onCreateRepoToggle } >
< i className = "fas fa-plus-square text-secondary mr-1" > < / i > { g e t t e x t ( ' N e w L i b r a r y ' ) }
< / b u t t o n >
2019-08-22 20:23:08 +08:00
) : (
< span className = "sf2-icon-plus mobile-toolbar-icon" title = { gettext ( 'New Library' ) } onClick = { this . onCreateRepoToggle } > < / s p a n >
)
2019-01-24 10:02:18 +08:00
) }
2018-12-10 17:59:26 +08:00
< / d i v >
< / d i v >
2018-12-10 13:44:11 +08:00
< CommonToolbar onSearchedClick = { this . props . onSearchedClick } / >
< / d i v >
2018-12-29 18:25:18 +08:00
< div className = "main-panel-center flex-row" >
2018-12-10 13:44:11 +08:00
< div className = "cur-view-container" >
< div className = "cur-view-path" >
2019-05-05 13:16:32 +08:00
{ currentGroup && (
2018-12-10 18:12:46 +08:00
< Fragment >
< div className = "path-container" >
2019-01-31 17:37:02 +08:00
< Link to = { ` ${ siteRoot } groups/ ` } onClick = { ( ) => this . onTabNavClick ( 'groups' ) } > { gettext ( 'Groups' ) } < / L i n k >
2018-12-10 18:12:46 +08:00
< span className = "path-split" > / < / s p a n >
< span > { currentGroup . name } < / s p a n >
2019-07-01 18:40:49 +08:00
{ isDepartmentGroup && (
2019-06-27 18:38:23 +08:00
< Fragment >
< span className = "department-group-icon fas fa-building" title = { gettext ( 'This is a special group representing a department.' ) } > < / s p a n >
2019-07-01 18:40:49 +08:00
{ currentGroup . group _quota > 0 &&
< span className = "department-usage-container" >
< div className = "department-usage" >
< span id = "quota-bar" className = "department-quota-bar" > < span id = "quota-usage" className = "usage" style = { { width : useRate } } > < / s p a n > < / s p a n >
< span className = "department-quota-info" > { Utils . bytesToSize ( currentGroup . group _quota _usage ) } / { Utils . bytesToSize ( currentGroup . group _quota ) } < / s p a n >
< / d i v >
< / s p a n >
}
2019-06-27 18:38:23 +08:00
< / F r a g m e n t >
2018-12-10 18:12:46 +08:00
) }
< / d i v >
< div className = "path-tool" >
2019-07-05 11:05:26 +08:00
{ isShowSettingIcon &&
2018-12-19 10:44:23 +08:00
< React . Fragment >
2018-12-28 11:12:24 +08:00
< a href = "#" className = "sf2-icon-cog1 action-icon group-top-action-icon" title = "Settings" id = "settings"
2018-12-19 10:44:23 +08:00
onClick = { this . toggleGroupDropdown } > < / a >
< Popover placement = "bottom" isOpen = { this . state . showGroupDropdown } target = "settings"
toggle = { this . toggleGroupDropdown } hideArrow = { true } className = "sf-popover" >
< div className = "sf-popover-hd sf-popover-title" >
2018-12-24 18:25:12 +08:00
< span > { gettext ( 'Settings' ) } < / s p a n >
2018-12-28 11:12:24 +08:00
< a href = "#" className = "sf-popover-close js-close sf2-icon-x1 action-icon"
2018-12-19 10:44:23 +08:00
onClick = { this . toggleGroupDropdown } > < / a >
< / d i v >
< div className = "sf-popover-con" >
2019-07-04 13:49:16 +08:00
{ ( this . state . isStaff || this . state . isOwner ) &&
2018-12-19 10:44:23 +08:00
< ul className = "sf-popover-list" >
2018-12-24 18:25:12 +08:00
< li > < a href = "#" className = "sf-popover-item" onClick = { this . toggleRenameGroupDialog } > { gettext ( 'Rename' ) } < / a > < / l i >
{
this . state . isOwner &&
< li > < a href = "#" className = "sf-popover-item" onClick = { this . toggleTransferGroupDialog } > { gettext ( 'Transfer' ) } < / a > < / l i >
}
2018-12-19 10:44:23 +08:00
< / u l >
2019-07-04 13:49:16 +08:00
}
{ ( this . state . isStaff || this . state . isOwner ) &&
2018-12-19 10:44:23 +08:00
< ul className = "sf-popover-list" >
2018-12-24 18:25:12 +08:00
{ /* <li><a href="#" className="sf-popover-item" onClick={this.toggleImportMembersDialog} >{gettext('Import Members')}</a></li> */ }
< li > < a href = "#" className = "sf-popover-item" onClick = { this . toggleManageMembersDialog } > { gettext ( 'Manage Members' ) } < / a > < / l i >
2018-12-19 10:44:23 +08:00
< / u l >
2019-07-04 13:49:16 +08:00
}
2018-12-24 18:25:12 +08:00
{
this . state . isOwner &&
< ul className = "sf-popover-list" >
2019-06-25 16:56:42 +08:00
< li > < a href = "#" className = "sf-popover-item" onClick = { this . toggleDismissGroupDialog } > { gettext ( 'Delete Group' ) } < / a > < / l i >
2018-12-24 18:25:12 +08:00
< / u l >
}
2019-07-04 13:49:16 +08:00
{ /* gourp owner only can dissmiss group, admin could not quit, department member could not quit */ }
{ ( ! this . state . isOwner && ! this . state . isStaff && ! isDepartmentGroup ) &&
< ul className = "sf-popover-list" >
2019-07-05 11:05:26 +08:00
< li > < a href = "#" className = "sf-popover-item" onClick = { this . toggleLeaveGroupDialog } > { gettext ( 'Leave Group' ) } < / a > < / l i >
2019-07-04 13:49:16 +08:00
< / u l >
}
2018-12-19 10:44:23 +08:00
< / d i v >
< / P o p o v e r >
< / R e a c t . F r a g m e n t >
}
2018-12-24 18:25:12 +08:00
< a href = "#"
2018-12-28 11:12:24 +08:00
className = "sf2-icon-user2 action-icon group-top-action-icon"
2018-12-24 18:25:12 +08:00
title = { gettext ( 'Members' ) } id = "groupMembers"
onClick = { ( ) => this . toggleGroupMembersPopover ( 'open' ) } >
< / a >
< Popover placement = "bottom" isOpen = { this . state . showGroupMembersPopover } target = "groupMembers"
toggle = { this . toggleGroupMembersPopover } hideArrow = { true } className = "sf-popover" >
2019-03-07 16:40:01 +08:00
< div className = "sf-popover-hd sf-popover-title group-member-list-header" >
2018-12-24 18:25:12 +08:00
< span > { gettext ( 'Members' ) } < / s p a n >
2018-12-28 11:12:24 +08:00
< a href = "#" className = "sf-popover-close js-close sf2-icon-x1 action-icon"
2018-12-24 18:25:12 +08:00
onClick = { this . toggleGroupMembersPopover } > < / a >
< / d i v >
< div className = "sf-popover-con" >
< ul className = "sf-popover-list group-member-list" >
2019-07-01 15:41:30 +08:00
{ this . state . groupMembers . map ( ( item , index ) => {
return (
< li key = { index } >
< a href = "#" className = "sf-popover-item user-item d-flex" >
< img src = { item . avatar _url } alt = "" className = "group-member-avatar avatar" / >
< span className = "txt-item ellipsis d-flex" >
< span className = "group-member-name ellipsis" > { item . name } < / s p a n >
< span className = "group-member-admin" > { this . translateRole ( item . role ) } < / s p a n >
< / s p a n >
< / a >
< / l i >
) ;
} ) }
2018-12-24 18:25:12 +08:00
< / u l >
< / d i v >
< / P o p o v e r >
2019-08-22 20:23:08 +08:00
{ ( ! Utils . isDesktop ( ) && this . state . repoList . length > 0 ) && < span className = "sf3-font sf3-font-sort action-icon" onClick = { this . toggleSortOptionsDialog } > < / s p a n > }
2019-07-18 20:21:50 +08:00
{ this . state . isSortOptionsDialogOpen &&
< SortOptionsDialog
toggleDialog = { this . toggleSortOptionsDialog }
sortBy = { this . state . sortBy }
sortOrder = { this . state . sortOrder }
sortItems = { this . sortItems }
/ >
}
2018-12-10 18:12:46 +08:00
< / d i v >
< / F r a g m e n t >
) }
2018-12-10 13:44:11 +08:00
< / d i v >
< div className = "cur-view-content" >
{ this . state . isLoading && < Loading / > }
2019-12-19 13:44:30 +08:00
{ ( ! this . state . isLoading && errMessage ) && < div className = "error text-center mt-2" > { errMessage } < / d i v > }
2018-12-10 13:44:11 +08:00
{ ( ! this . state . isLoading && this . state . repoList . length === 0 ) && emptyTip }
{ ( ! this . state . isLoading && this . state . repoList . length > 0 ) &&
2018-12-10 18:19:03 +08:00
< SharedRepoListView
2018-12-10 13:44:11 +08:00
repoList = { this . state . repoList }
currentGroup = { this . state . currentGroup }
2019-01-02 10:53:38 +08:00
sortBy = { this . state . sortBy }
sortOrder = { this . state . sortOrder }
sortItems = { this . sortItems }
2018-12-10 18:37:59 +08:00
onItemUnshare = { this . onItemUnshare }
2018-12-16 11:17:17 +08:00
onItemDelete = { this . onItemDelete }
2018-12-29 18:25:18 +08:00
onItemDetails = { this . onItemDetails }
2019-02-11 15:22:42 +08:00
onItemRename = { this . onItemRename }
2018-12-10 13:44:11 +08:00
/ >
}
< / d i v >
< / d i v >
2018-12-29 18:25:18 +08:00
{ this . state . isShowDetails && (
< div className = "cur-view-detail" >
< LibDetail currentRepo = { this . state . currentRepo } closeDetails = { this . closeDetails } / >
< / d i v >
) }
2018-12-10 13:44:11 +08:00
< / d i v >
2018-12-10 17:59:26 +08:00
{ this . state . isCreateRepoDialogShow && ! this . state . isDepartmentGroup && (
< ModalPortal >
< CreateRepoDialog
libraryType = { this . state . libraryType }
onCreateToggle = { this . onCreateRepoToggle }
onCreateRepo = { this . onCreateRepo }
/ >
< / M o d a l P o r t a l >
) }
{ this . state . isCreateRepoDialogShow && this . state . isDepartmentGroup &&
2019-06-24 17:01:14 +08:00
< CreateRepoDialog
2018-12-10 17:59:26 +08:00
isAdmin = { this . state . isAdmin }
onCreateToggle = { this . onCreateRepoToggle }
onCreateRepo = { this . onCreateRepo }
2019-06-24 17:01:14 +08:00
libraryType = 'department'
2018-12-10 17:59:26 +08:00
/ >
}
2018-12-24 18:25:12 +08:00
{ this . state . showRenameGroupDialog &&
2018-12-19 10:44:23 +08:00
< RenameGroupDialog
showRenameGroupDialog = { this . state . showRenameGroupDialog }
toggleRenameGroupDialog = { this . toggleRenameGroupDialog }
loadGroup = { this . loadGroup }
groupID = { this . props . groupID }
onGroupChanged = { this . props . onGroupChanged }
2018-12-29 11:43:07 +08:00
currentGroupName = { currentGroup . name }
2018-12-19 10:44:23 +08:00
/ >
}
2018-12-24 18:25:12 +08:00
{ this . state . showDismissGroupDialog &&
2018-12-19 10:44:23 +08:00
< DismissGroupDialog
showDismissGroupDialog = { this . state . showDismissGroupDialog }
toggleDismissGroupDialog = { this . toggleDismissGroupDialog }
loadGroup = { this . loadGroup }
groupID = { this . props . groupID }
onGroupChanged = { this . props . onGroupChanged }
/ >
}
2018-12-24 18:25:12 +08:00
{ this . state . showTransferGroupDialog &&
< TransferGroupDialog
toggleTransferGroupDialog = { this . toggleTransferGroupDialog }
groupID = { this . props . groupID }
onGroupChanged = { this . props . onGroupChanged }
/ >
}
{ / * t h i s . s t a t e . s h o w I m p o r t M e m b e r s D i a l o g & &
< ImportMembersDialog
toggleImportMembersDialog = { this . toggleImportMembersDialog }
groupID = { this . props . groupID }
onGroupChanged = { this . props . onGroupChanged }
/ >
* / }
{ this . state . showManageMembersDialog &&
< ManageMembersDialog
toggleManageMembersDialog = { this . toggleManageMembersDialog }
groupID = { this . props . groupID }
onGroupChanged = { this . props . onGroupChanged }
isOwner = { this . state . isOwner }
/ >
}
2019-07-05 11:05:26 +08:00
{ this . state . isLeaveGroupDialogOpen &&
2019-07-04 13:49:16 +08:00
< LeaveGroupDialog
toggleLeaveGroupDialog = { this . toggleLeaveGroupDialog }
groupID = { this . props . groupID }
onGroupChanged = { this . props . onGroupChanged }
/ >
}
2018-12-10 13:44:11 +08:00
< / F r a g m e n t >
2018-12-08 08:37:18 +08:00
) ;
}
}
GroupView . propTypes = propTypes ;
export default GroupView ;