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-10 05:33:32 +00:00
import { gettext , siteRoot , enableWiki } 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
2018-11-19 10:28:31 +00:00
import { canViewOrg } from '../utils/constants' ;
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 ;
seafileAPI . listGroups ( ) . then ( res => {
let data = res . data . groups ;
this . groupsHeight = ( data . length + 1 ) * _this . listHeight ;
_this . setState ( {
groupItems : data
2018-10-16 10:19:51 +00:00
} ) ;
} ) ;
2018-09-30 04:19:30 +00:00
}
tabItemClick = ( param ) => {
2018-11-22 09:00:23 +00:00
this . props . tabItemClick ( param ) ;
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" >
< Link to = { siteRoot + 'group/' + item . id + '/' } className = { ` nav-link ellipsis ${ this . getActiveClass ( item . id ) } ` } onClick = { ( ) => this . tabItemClick ( 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 } ;
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 } >
< 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' ) } >
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 ( 'Libraries' ) } < / 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 >
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 >
2018-12-06 03:28:16 +00:00
< li className = "nav-item" >
< Link to = { siteRoot + 'share-admin-share-links/' } className = { ` nav-link ellipsis ${ this . getActiveClass ( 'share-admin-share-links' ) || this . getActiveClass ( 'share-admin-upload-links' ) } ` } title = { gettext ( 'Links' ) } onClick = { ( ) => this . tabItemClick ( 'share-admin-share-links' ) } >
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 ( 'Links' ) } < / 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 >
< / u l >
2018-10-16 10:19:51 +00:00
) ;
2018-09-30 04:19:30 +00:00
}
render ( ) {
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" >
< h3 className = "sf-heading" > Files < / h 3 >
2018-12-06 03:28:16 +00:00
< ul className = "nav nav-pills flex-column nav-container" >
< li className = "nav-item" >
< Link to = { siteRoot + 'my-libs/' } className = { ` nav-link ellipsis ${ this . getActiveClass ( 'my-libs' ) } ` } title = { gettext ( 'My Libraries' ) } onClick = { ( ) => this . tabItemClick ( 'my-libs' ) } >
2018-09-30 04:19:30 +00:00
< span className = "sf2-icon-user" aria - hidden = "true" > < / s p a n >
2018-12-06 06:39:21 +00:00
< span className = "nav-text" > { gettext ( 'My Libraries' ) } < / s p a n >
2018-11-30 09:18:41 +00:00
< / L i n k >
2018-09-30 04:19:30 +00:00
< / l i >
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' ) } >
< a href = { 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-11-19 10:28:31 +00:00
< / a >
< / 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 >
< h3 className = "sf-heading" > 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 >
2018-12-06 03:28:16 +00:00
< li className = "nav-item" >
< Link className = { ` nav-link ellipsis ${ this . getActiveClass ( 'dashboard' ) } ` } to = { siteRoot + 'dashboard/' } title = { gettext ( 'Acitivities' ) } onClick = { ( ) => this . tabItemClick ( 'dashboard' ) } >
2018-09-30 04:19:30 +00:00
< span className = "sf2-icon-clock" aria - hidden = "true" > < / s p a n >
2018-12-06 06:39:21 +00:00
< span className = "nav-text" > { gettext ( 'Acitivities' ) } < / s p a n >
2018-09-30 04:19:30 +00:00
< / L i n k >
< / l i >
2018-12-10 05:33:32 +00:00
{ enableWiki &&
< li className = "nav-item" >
2018-12-07 16:01:23 +00:00
< Link className = { ` nav-link ellipsis ${ this . getActiveClass ( 'wikis' ) } ` } to = { siteRoot + 'wikis/' } title = { gettext ( 'Wikis' ) } onClick = { ( ) => this . tabItemClick ( 'wikis' ) } >
< span className = "sf2-icon-wiki-view" aria - hidden = "true" > < / s p a n >
{ gettext ( 'Wikis' ) }
< / L i n k >
< / l i >
2018-12-10 05:33:32 +00:00
}
2018-12-06 03:28:16 +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' ) } >
2018-09-30 04:19:30 +00:00
< span className = "sf2-icon-monitor" aria - hidden = "true" > < / s p a n >
2018-12-06 06:39:21 +00:00
< span className = "nav-text" > { gettext ( 'Linked Devices' ) } < / s p a n >
2018-11-10 09:14:07 +00:00
< / L i n k >
2018-09-30 04:19:30 +00:00
< / l i >
2018-12-06 03:28:16 +00:00
< li className = "nav-item" onClick = { ( ) => this . tabItemClick ( 'drafts' ) } >
< Link className = { ` nav-link ellipsis ${ this . getActiveClass ( 'drafts' ) || this . getActiveClass ( 'reviews' ) } ` } to = { siteRoot + 'drafts/' } title = { gettext ( 'Drafts' ) } >
2018-09-30 04:19:30 +00:00
< span className = "sf2-icon-edit" aria - hidden = "true" > < / s p a n >
2018-12-06 06:39:21 +00:00
< span className = "draft-info nav-text" >
2018-12-06 03:28:16 +00:00
{ gettext ( 'Drafts' ) }
{ this . props . draftCounts === 0 ? '' : < Badge color = "info" pill > { this . props . draftCounts } < / B a d g e > }
< / s p a n >
2018-09-30 04:19:30 +00:00
< / 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 ;