2018-09-30 04:19:30 +00:00
import React from 'react' ;
2018-10-16 10:19:51 +00:00
import PropTypes from 'prop-types' ;
2018-09-30 04:19:30 +00:00
import { Link } from '@reach/router' ;
2018-12-17 09:06:59 +00:00
import Group from '../models/group' ;
2019-01-24 02:02:18 +00:00
import { gettext , siteRoot , enableWiki , canAddRepo , canGenerateShareLink , canGenerateUploadLink } from '../utils/constants' ;
2018-09-30 04:19:30 +00:00
import { seafileAPI } from '../utils/seafile-api' ;
2018-11-01 09:52:59 +00:00
import { Badge } from 'reactstrap' ;
2018-09-30 04:19:30 +00:00
2019-04-17 02:32:32 +00:00
import { canViewOrg , isDocs , isPro } from '../utils/constants' ;
2018-11-19 10:28:31 +00:00
2018-10-16 10:19:51 +00:00
const propTypes = {
2018-12-06 03:28:16 +00:00
currentTab : PropTypes . oneOfType ( [ PropTypes . string , PropTypes . number ] ) . isRequired ,
2018-11-22 09:00:23 +00:00
tabItemClick : PropTypes . func . isRequired ,
draftCounts : PropTypes . number ,
2018-10-16 10:19:51 +00:00
} ;
2018-10-08 07:33:40 +00:00
class MainSideNav extends React . Component {
2018-09-30 04:19:30 +00:00
constructor ( props ) {
super ( props ) ;
this . state = {
groupsExtended : false ,
sharedExtended : false ,
closeSideBar : false ,
groupItems : [ ] ,
} ;
this . listHeight = 24 ; //for caculate tabheight
this . groupsHeight = 0 ;
this . adminHeight = 0 ;
}
grpsExtend = ( ) => {
this . setState ( {
groupsExtended : ! this . state . groupsExtended ,
2018-10-16 10:19:51 +00:00
} ) ;
2018-09-30 04:19:30 +00:00
this . loadGroups ( ) ;
}
shExtend = ( ) => {
this . setState ( {
sharedExtended : ! this . state . sharedExtended ,
2018-10-16 10:19:51 +00:00
} ) ;
2018-09-30 04:19:30 +00:00
}
loadGroups = ( ) => {
let _this = this ;
2019-01-08 05:55:00 +00:00
seafileAPI . listGroups ( ) . then ( res => {
2018-12-17 09:06:59 +00:00
let groupList = res . data . map ( item => {
let group = new Group ( item ) ;
return group ;
2019-01-31 09:37:02 +00:00
} ) ;
2018-12-17 09:06:59 +00:00
this . groupsHeight = ( groupList . length + 1 ) * _this . listHeight ;
2018-09-30 04:19:30 +00:00
_this . setState ( {
2018-12-17 09:06:59 +00:00
groupItems : groupList
2018-10-16 10:19:51 +00:00
} ) ;
} ) ;
2018-09-30 04:19:30 +00:00
}
2018-12-11 09:52:19 +00:00
tabItemClick = ( param , id ) => {
this . props . tabItemClick ( param , id ) ;
2018-09-30 04:19:30 +00:00
}
2018-12-06 03:28:16 +00:00
getActiveClass = ( tab ) => {
return this . props . currentTab === tab ? 'active' : '' ;
}
2018-09-30 04:19:30 +00:00
renderSharedGroups ( ) {
let style = { height : 0 } ;
if ( this . state . groupsExtended ) {
style = { height : this . groupsHeight } ;
}
return (
2018-12-06 03:28:16 +00:00
< ul className = { ` nav sub-nav nav-pills flex-column grp-list ${ this . state . groupsExtended ? 'side-panel-slide' : 'side-panel-slide-up' } ` } style = { style } >
< li className = "nav-item" >
< Link to = { siteRoot + 'groups/' } className = { ` nav-link ellipsis ${ this . getActiveClass ( 'groups' ) } ` } onClick = { ( ) => this . tabItemClick ( 'groups' ) } >
2018-10-16 10:19:51 +00:00
< span className = "sharp" aria - hidden = "true" > # < / s p a n >
2018-12-06 06:39:21 +00:00
< span className = "nav-text" > { gettext ( 'All Groups' ) } < / s p a n >
2018-12-04 08:52:27 +00:00
< / L i n k >
2018-09-30 04:19:30 +00:00
< / l i >
{ this . state . groupItems . map ( item => {
return (
2018-12-06 03:28:16 +00:00
< li key = { item . id } className = "nav-item" >
2018-12-11 09:52:19 +00:00
< Link to = { siteRoot + 'group/' + item . id + '/' } className = { ` nav-link ellipsis ${ this . getActiveClass ( item . name ) } ` } onClick = { ( ) => this . tabItemClick ( item . name , item . id ) } >
2018-09-30 04:19:30 +00:00
< span className = "sharp" aria - hidden = "true" > # < / s p a n >
2018-12-06 06:39:21 +00:00
< span className = "nav-text" > { item . name } < / s p a n >
2018-12-04 08:52:27 +00:00
< / L i n k >
2018-09-30 04:19:30 +00:00
< / l i >
2018-10-16 10:19:51 +00:00
) ;
2018-09-30 04:19:30 +00:00
} ) }
< / u l >
2018-10-16 10:19:51 +00:00
) ;
2018-09-30 04:19:30 +00:00
}
renderSharedAdmin ( ) {
let height = 0 ;
if ( this . state . sharedExtended ) {
if ( ! this . adminHeight ) {
this . adminHeight = 3 * this . listHeight ;
}
height = this . adminHeight ;
}
let style = { height : height } ;
2019-01-24 02:02:18 +00:00
let linksNavItem = null ;
if ( canGenerateShareLink ) {
linksNavItem = (
< li className = "nav-item" >
< Link to = { siteRoot + 'share-admin-share-links/' } className = { ` nav-link ellipsis ${ this . getActiveClass ( 'share-admin-share-links' ) } ` } title = { gettext ( 'Links' ) } onClick = { ( ) => this . tabItemClick ( 'share-admin-share-links' ) } >
< span aria - hidden = "true" className = "sharp" > # < / s p a n >
< span className = "nav-text" > { gettext ( 'Links' ) } < / s p a n >
< / L i n k >
< / l i >
) ;
} else if ( canGenerateUploadLink ) {
linksNavItem = (
< li className = "nav-item" >
< Link to = { siteRoot + 'share-admin-upload-links/' } className = { ` nav-link ellipsis ${ this . getActiveClass ( 'share-admin-upload-links' ) } ` } title = { gettext ( 'Links' ) } onClick = { ( ) => this . tabItemClick ( 'share-admin-upload-links' ) } >
< span aria - hidden = "true" className = "sharp" > # < / s p a n >
< span className = "nav-text" > { gettext ( 'Links' ) } < / s p a n >
< / L i n k >
< / l i >
) ;
}
2018-09-30 04:19:30 +00:00
return (
2018-12-06 03:28:16 +00:00
< ul className = { ` nav sub-nav nav-pills flex-column ${ this . state . sharedExtended ? 'side-panel-slide' : 'side-panel-slide-up' } ` } style = { style } >
2019-01-24 02:02:18 +00:00
{ canAddRepo && (
2019-01-31 09:37:02 +00:00
< li className = "nav-item" >
< Link to = { siteRoot + 'share-admin-libs/' } className = { ` nav-link ellipsis ${ this . getActiveClass ( 'share-admin-libs' ) } ` } title = { gettext ( 'Libraries' ) } onClick = { ( ) => this . tabItemClick ( 'share-admin-libs' ) } >
< span aria - hidden = "true" className = "sharp" > # < / s p a n >
< span className = "nav-text" > { gettext ( 'Libraries' ) } < / s p a n >
< / L i n k >
< / l i >
2019-01-24 02:02:18 +00:00
) }
2018-12-06 03:28:16 +00:00
< li className = "nav-item" >
< Link to = { siteRoot + 'share-admin-folders/' } className = { ` nav-link ellipsis ${ this . getActiveClass ( 'share-admin-folders' ) } ` } title = { gettext ( 'Folders' ) } onClick = { ( ) => this . tabItemClick ( 'share-admin-folders' ) } >
2018-09-30 04:19:30 +00:00
< span aria - hidden = "true" className = "sharp" > # < / s p a n >
2018-12-06 06:39:21 +00:00
< span className = "nav-text" > { gettext ( 'Folders' ) } < / s p a n >
2018-11-19 03:53:44 +00:00
< / L i n k >
2018-09-30 04:19:30 +00:00
< / l i >
2019-01-24 02:02:18 +00:00
{ linksNavItem }
2018-09-30 04:19:30 +00:00
< / u l >
2018-10-16 10:19:51 +00:00
) ;
2018-09-30 04:19:30 +00:00
}
render ( ) {
2019-04-17 02:32:32 +00:00
let showActivity = isDocs || isPro ;
2018-09-30 04:19:30 +00:00
return (
2018-12-06 03:28:16 +00:00
< div className = "side-nav" >
2018-09-30 04:19:30 +00:00
< div className = "side-nav-con" >
2018-12-21 08:16:45 +00:00
< h3 className = "sf-heading" > { gettext ( 'Files' ) } < / h 3 >
2018-12-06 03:28:16 +00:00
< ul className = "nav nav-pills flex-column nav-container" >
2019-01-24 02:02:18 +00:00
{ canAddRepo && (
2019-01-31 09:37:02 +00:00
< li className = "nav-item" >
< Link to = { siteRoot + 'my-libs/' } className = { ` nav-link ellipsis ${ this . getActiveClass ( 'my-libs' ) || this . getActiveClass ( 'deleted' ) } ` } title = { gettext ( 'My Libraries' ) } onClick = { ( ) => this . tabItemClick ( 'my-libs' ) } >
< span className = "sf2-icon-user" aria - hidden = "true" > < / s p a n >
< span className = "nav-text" > { gettext ( 'My Libraries' ) } < / s p a n >
< / L i n k >
< / l i >
2019-01-24 02:02:18 +00:00
) }
2018-12-06 03:28:16 +00:00
< li className = "nav-item" >
< Link to = { siteRoot + 'shared-libs/' } className = { ` nav-link ellipsis ${ this . getActiveClass ( 'shared-libs' ) } ` } title = { gettext ( 'Shared with me' ) } onClick = { ( ) => this . tabItemClick ( 'shared-libs' ) } >
2018-09-30 04:19:30 +00:00
< span className = "sf2-icon-share" aria - hidden = "true" > < / s p a n >
2018-12-06 06:39:21 +00:00
< span className = "nav-text" > { gettext ( 'Shared with me' ) } < / s p a n >
2018-11-22 08:49:48 +00:00
< / L i n k >
2018-09-30 04:19:30 +00:00
< / l i >
2018-11-19 10:28:31 +00:00
{ canViewOrg &&
2018-12-06 03:28:16 +00:00
< li className = "nav-item" onClick = { ( ) => this . tabItemClick ( 'org' ) } >
2018-12-21 07:40:59 +00:00
< Link to = { siteRoot + 'org/' } className = { ` nav-link ellipsis ${ this . getActiveClass ( 'org' ) } ` } title = { gettext ( 'Shared with all' ) } >
2018-11-19 10:28:31 +00:00
< span className = "sf2-icon-organization" aria - hidden = "true" > < / s p a n >
2018-12-06 06:39:21 +00:00
< span className = "nav-text" > { gettext ( 'Shared with all' ) } < / s p a n >
2018-12-21 07:40:59 +00:00
< / L i n k >
2018-11-19 10:28:31 +00:00
< / l i >
}
2018-12-06 03:28:16 +00:00
< li className = "nav-item flex-column" id = "group-nav" >
< a className = "nav-link ellipsis" title = { gettext ( 'Shared with groups' ) } onClick = { this . grpsExtend } >
2018-09-30 04:19:30 +00:00
< span className = { ` toggle-icon float-right fas ${ this . state . groupsExtended ? 'fa-caret-down' : 'fa-caret-left' } ` } aria - hidden = "true" > < / s p a n >
< span className = "sf2-icon-group" aria - hidden = "true" > < / s p a n >
2018-12-06 06:39:21 +00:00
< span className = "nav-text" > { gettext ( 'Shared with groups' ) } < / s p a n >
2018-09-30 04:19:30 +00:00
< / a >
{ this . renderSharedGroups ( ) }
< / l i >
< / u l >
2018-12-21 08:16:45 +00:00
< h3 className = "sf-heading" > { gettext ( 'Tools' ) } < / h 3 >
2018-12-06 03:28:16 +00:00
< ul className = "nav nav-pills flex-column nav-container" >
< li className = "nav-item" >
< Link className = { ` nav-link ellipsis ${ this . getActiveClass ( 'starred' ) } ` } to = { siteRoot + 'starred/' } title = { gettext ( 'Favorites' ) } onClick = { ( ) => this . tabItemClick ( 'starred' ) } >
2018-09-30 04:19:30 +00:00
< span className = "sf2-icon-star" aria - hidden = "true" > < / s p a n >
2018-12-06 06:39:21 +00:00
< span className = "nav-text" > { gettext ( 'Favorites' ) } < / s p a n >
2018-10-15 07:51:29 +00:00
< / L i n k >
2018-09-30 04:19:30 +00:00
< / l i >
2019-04-17 02:32:32 +00:00
{ showActivity &&
2019-03-29 10:15:39 +00:00
< li className = "nav-item" >
< Link className = { ` nav-link ellipsis ${ this . getActiveClass ( 'dashboard' ) } ` } to = { siteRoot + 'dashboard/' } title = { gettext ( 'Activities' ) } onClick = { ( ) => this . tabItemClick ( 'dashboard' ) } >
< span className = "sf2-icon-clock" aria - hidden = "true" > < / s p a n >
< span className = "nav-text" > { gettext ( 'Activities' ) } < / s p a n >
< / L i n k >
< / l i >
}
2018-12-10 05:33:32 +00:00
{ enableWiki &&
< li className = "nav-item" >
2019-04-24 08:40:23 +00:00
< Link className = { ` nav-link ellipsis ${ this . getActiveClass ( 'published' ) } ` } to = { siteRoot + 'published/' } title = { gettext ( 'Published Libraries' ) } onClick = { ( ) => this . tabItemClick ( 'published' ) } >
2019-01-31 09:37:02 +00:00
< span className = "sf2-icon-wiki-view" aria - hidden = "true" > < / s p a n >
2019-04-17 02:34:43 +00:00
< span className = "nav-text" > { gettext ( 'Published Libraries' ) } < / s p a n >
2019-01-31 09:37:02 +00:00
< / L i n k >
< / l i >
2018-12-10 05:33:32 +00:00
}
2019-03-29 10:15:39 +00:00
{ isDocs &&
< li className = "nav-item" onClick = { ( ) => this . tabItemClick ( 'drafts' ) } >
< Link className = { ` nav-link ellipsis ${ this . getActiveClass ( 'drafts' ) } ` } to = { siteRoot + 'drafts/' } title = { gettext ( 'Drafts' ) } >
< span className = "sf2-icon-edit" aria - hidden = "true" > < / s p a n >
< span className = "draft-info nav-text" >
{ gettext ( 'Drafts' ) }
{ this . props . draftCounts === 0 ? '' : < Badge color = "info" pill > { this . props . draftCounts } < / B a d g e > }
< / s p a n >
< / L i n k >
< / l i >
}
2019-02-18 09:48:35 +00:00
< li className = "nav-item" >
< Link className = { ` nav-link ellipsis ${ this . getActiveClass ( 'linked-devices' ) } ` } to = { siteRoot + 'linked-devices/' } title = { gettext ( 'Linked Devices' ) } onClick = { ( ) => this . tabItemClick ( 'linked-devices' ) } >
< span className = "sf2-icon-monitor" aria - hidden = "true" > < / s p a n >
< span className = "nav-text" > { gettext ( 'Linked Devices' ) } < / s p a n >
< / L i n k >
< / l i >
2018-12-06 03:28:16 +00:00
< li className = "nav-item flex-column" id = "share-admin-nav" >
< a className = "nav-link ellipsis" title = { gettext ( 'Share Admin' ) } onClick = { this . shExtend } >
2018-09-30 04:19:30 +00:00
< span className = { ` toggle-icon float-right fas ${ this . state . sharedExtended ? 'fa-caret-down' : 'fa-caret-left' } ` } aria - hidden = "true" > < / s p a n >
2018-12-06 06:39:21 +00:00
< span className = "sf2-icon-wrench" aria - hidden = "true" > < / s p a n >
< span className = "nav-text" > { gettext ( 'Share Admin' ) } < / s p a n >
2018-09-30 04:19:30 +00:00
< / a >
{ this . renderSharedAdmin ( ) }
< / l i >
< / u l >
< / d i v >
< / d i v >
2018-10-16 10:19:51 +00:00
) ;
2018-09-30 04:19:30 +00:00
}
}
2018-10-16 10:19:51 +00:00
MainSideNav . propTypes = propTypes ;
2018-09-30 04:19:30 +00:00
export default MainSideNav ;