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' ;
2022-12-29 04:21:47 +00:00
import { Link } from '@gatsbyjs/reach-router' ;
2023-07-14 04:55:30 +00:00
import { gettext , siteRoot , canAddRepo , canGenerateShareLink , canGenerateUploadLink , canInvitePeople , dtableWebServer , enableOCM , enableOCMViaWebdav } from '../utils/constants' ;
2018-09-30 04:19:30 +00:00
import { seafileAPI } from '../utils/seafile-api' ;
2019-07-16 02:01:09 +00:00
import { Utils } from '../utils/utils' ;
import toaster from './toast' ;
import Group from '../models/group' ;
2018-09-30 04:19:30 +00:00
2023-08-25 02:23:01 +00:00
import { canViewOrg , isDocs , isPro , isDBSqlite3 , customNavItems } 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 ( ) ;
2023-09-13 00:40:50 +00:00
} ;
2018-09-30 04:19:30 +00:00
shExtend = ( ) => {
this . setState ( {
sharedExtended : ! this . state . sharedExtended ,
2018-10-16 10:19:51 +00:00
} ) ;
2023-09-13 00:40:50 +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 ( {
2019-08-28 04:16:56 +00:00
groupItems : groupList . sort ( ( a , b ) => {
return a . name . toLowerCase ( ) < b . name . toLowerCase ( ) ? - 1 : 1 ;
} )
2018-10-16 10:19:51 +00:00
} ) ;
2019-07-16 02:01:09 +00:00
} ) . catch ( error => {
let errMessage = Utils . getErrorMsg ( error ) ;
toaster . danger ( errMessage ) ;
2018-10-16 10:19:51 +00:00
} ) ;
2023-09-13 00:40:50 +00:00
} ;
2018-09-30 04:19:30 +00:00
2019-08-02 12:53:39 +00:00
tabItemClick = ( e , param , id ) => {
2019-10-21 08:44:49 +00:00
if ( window . uploader &&
window . uploader . isUploadProgressDialogShow &&
2019-08-02 12:53:39 +00:00
window . uploader . totalProgress !== 100 ) {
2019-11-12 06:43:33 +00:00
if ( ! window . confirm ( gettext ( 'A file is being uploaded. Are you sure you want to leave this page?' ) ) ) {
e . preventDefault ( ) ;
return false ;
}
window . uploader . isUploadProgressDialogShow = false ;
2019-08-02 12:53:39 +00:00
}
2018-12-11 09:52:19 +00:00
this . props . tabItemClick ( param , id ) ;
2023-09-13 00:40:50 +00:00
} ;
2018-09-30 04:19:30 +00:00
2019-09-19 07:47:03 +00:00
onDTableClick = ( ) => {
2019-10-21 09:12:05 +00:00
let url = dtableWebServer ;
2019-09-19 07:47:03 +00:00
window . open ( url ) ;
2023-09-13 00:40:50 +00:00
} ;
2019-10-21 08:44:49 +00:00
2018-12-06 03:28:16 +00:00
getActiveClass = ( tab ) => {
return this . props . currentTab === tab ? 'active' : '' ;
2023-09-13 00:40:50 +00:00
} ;
2018-12-06 03:28:16 +00:00
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 } >
2019-10-21 08:44:49 +00:00
< li className = "nav-item" >
2019-08-02 12:53:39 +00:00
< Link to = { siteRoot + 'groups/' } className = { ` nav-link ellipsis ${ this . getActiveClass ( 'groups' ) } ` } onClick = { ( e ) => this . tabItemClick ( e , '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 (
2019-10-21 08:44:49 +00:00
< li key = { item . id } className = "nav-item" >
2019-08-02 12:53:39 +00:00
< Link to = { siteRoot + 'group/' + item . id + '/' } className = { ` nav-link ellipsis ${ this . getActiveClass ( item . name ) } ` } onClick = { ( e ) => this . tabItemClick ( e , 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" >
2019-08-02 12:53:39 +00:00
< Link to = { siteRoot + 'share-admin-share-links/' } className = { ` nav-link ellipsis ${ this . getActiveClass ( 'share-admin-share-links' ) } ` } title = { gettext ( 'Links' ) } onClick = { ( e ) => this . tabItemClick ( e , 'share-admin-share-links' ) } >
2019-01-24 02:02:18 +00:00
< 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" >
2019-08-02 12:53:39 +00:00
< Link to = { siteRoot + 'share-admin-upload-links/' } className = { ` nav-link ellipsis ${ this . getActiveClass ( 'share-admin-upload-links' ) } ` } title = { gettext ( 'Links' ) } onClick = { ( e ) => this . tabItemClick ( e , 'share-admin-upload-links' ) } >
2019-01-24 02:02:18 +00:00
< 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" >
2019-08-02 12:53:39 +00:00
< Link to = { siteRoot + 'share-admin-libs/' } className = { ` nav-link ellipsis ${ this . getActiveClass ( 'share-admin-libs' ) } ` } title = { gettext ( 'Libraries' ) } onClick = { ( e ) => this . tabItemClick ( e , 'share-admin-libs' ) } >
2019-01-31 09:37:02 +00:00
< 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" >
2019-08-02 12:53:39 +00:00
< Link to = { siteRoot + 'share-admin-folders/' } className = { ` nav-link ellipsis ${ this . getActiveClass ( 'share-admin-folders' ) } ` } title = { gettext ( 'Folders' ) } onClick = { ( e ) => this . tabItemClick ( e , '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
}
2019-09-11 05:39:49 +00:00
renderCustomNavItems ( ) {
return (
customNavItems . map ( ( item , idx ) => {
2020-02-10 01:25:17 +00:00
return (
< li key = { idx } className = "nav-item" >
< a href = { item . link } className = "nav-link ellipsis" title = { item . desc } >
< span className = { item . icon } aria - hidden = "true" > < / s p a n >
< span className = "nav-text" > { item . desc } < / s p a n >
< / a >
< / l i >
) ;
2019-09-11 05:39:49 +00:00
} )
) ;
}
2018-09-30 04:19:30 +00:00
render ( ) {
2023-08-25 02:23:01 +00:00
let showActivity = isDocs || isPro || ! isDBSqlite3 ;
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" >
2019-08-02 12:53:39 +00:00
< Link to = { siteRoot + 'my-libs/' } className = { ` nav-link ellipsis ${ this . getActiveClass ( 'my-libs' ) || this . getActiveClass ( 'deleted' ) } ` } title = { gettext ( 'My Libraries' ) } onClick = { ( e ) => this . tabItemClick ( e , 'my-libs' ) } >
2019-01-31 09:37:02 +00:00
< 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" >
2019-08-02 12:53:39 +00:00
< Link to = { siteRoot + 'shared-libs/' } className = { ` nav-link ellipsis ${ this . getActiveClass ( 'shared-libs' ) } ` } title = { gettext ( 'Shared with me' ) } onClick = { ( e ) => this . tabItemClick ( e , '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 &&
2019-08-02 12:53:39 +00:00
< li className = "nav-item" onClick = { ( e ) => this . tabItemClick ( e , '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 = "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 >
2022-10-12 10:10:12 +00:00
< span className = { ` toggle-icon fas ${ this . state . groupsExtended ? 'fa-caret-down' : 'fa-caret-left' } ` } aria - hidden = "true" > < / s p a n >
2018-09-30 04:19:30 +00:00
< / a >
{ this . renderSharedGroups ( ) }
< / l i >
2020-09-24 02:57:45 +00:00
{ enableOCM &&
< li className = "nav-item" >
< Link to = { siteRoot + 'shared-with-ocm/' } className = { ` nav-link ellipsis ${ this . getActiveClass ( 'shared-with-ocm' ) } ` } title = { gettext ( 'Shared from other servers' ) } onClick = { ( e ) => this . tabItemClick ( e , 'shared-with-ocm' ) } >
2020-12-17 07:17:18 +00:00
< span className = "sf3-font-share-from-other-servers sf3-font" aria - hidden = "true" > < / s p a n >
2020-09-24 02:57:45 +00:00
< span className = "nav-text" > { gettext ( 'Shared from other servers' ) } < / s p a n >
< / L i n k >
< / l i >
}
2021-09-27 09:44:23 +00:00
{ enableOCMViaWebdav &&
< li className = "nav-item" >
< Link to = { siteRoot + 'ocm-via-webdav/' } className = { ` nav-link ellipsis ${ this . getActiveClass ( 'ocm-via-webdav' ) } ` } title = { gettext ( 'Shared from other servers' ) } onClick = { ( e ) => this . tabItemClick ( e , 'ocm-via-webdav' ) } >
< span className = "sf3-font-share-from-other-servers sf3-font" aria - hidden = "true" > < / s p a n >
< span className = "nav-text" > { gettext ( 'Shared from other servers' ) } < / s p a n >
< / L i n k >
< / l i >
}
2018-09-30 04:19:30 +00:00
< / u l >
2019-05-31 03:24:53 +00:00
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" >
2019-08-02 12:53:39 +00:00
< Link className = { ` nav-link ellipsis ${ this . getActiveClass ( 'starred' ) } ` } to = { siteRoot + 'starred/' } title = { gettext ( 'Favorites' ) } onClick = { ( e ) => this . tabItemClick ( e , '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" >
2019-08-02 12:53:39 +00:00
< Link className = { ` nav-link ellipsis ${ this . getActiveClass ( 'dashboard' ) } ` } to = { siteRoot + 'dashboard/' } title = { gettext ( 'Activities' ) } onClick = { ( e ) => this . tabItemClick ( e , 'dashboard' ) } >
2019-03-29 10:15:39 +00:00
< 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 >
}
2023-09-13 00:40:50 +00:00
< li className = "nav-item" >
< Link className = { ` nav-link ellipsis ${ this . getActiveClass ( 'published' ) } ` } to = { siteRoot + 'published/' } title = { gettext ( 'Published Libraries' ) } onClick = { ( e ) => this . tabItemClick ( e , 'published' ) } >
< span className = "sf2-icon-wiki-view" aria - hidden = "true" > < / s p a n >
< span className = "nav-text" > { gettext ( 'Published Libraries' ) } < / s p a n >
< / L i n k >
< / l i >
2023-10-31 04:15:12 +00:00
{ / * i s D o c s & &
2019-08-02 12:53:39 +00:00
< li className = "nav-item" onClick = { ( e ) => this . tabItemClick ( e , 'drafts' ) } >
2019-03-29 10:15:39 +00:00
< 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 >
2022-10-12 10:10:12 +00:00
< span className = "nav-text" > { gettext ( 'Drafts' ) } < / s p a n >
{ this . props . draftCounts > 0 && < span id = "draft-num" > { this . props . draftCounts } < / s p a n > }
2019-03-29 10:15:39 +00:00
< / L i n k >
< / l i >
2023-10-31 04:15:12 +00:00
* / }
2019-02-18 09:48:35 +00:00
< li className = "nav-item" >
2019-08-02 12:53:39 +00:00
< Link className = { ` nav-link ellipsis ${ this . getActiveClass ( 'linked-devices' ) } ` } to = { siteRoot + 'linked-devices/' } title = { gettext ( 'Linked Devices' ) } onClick = { ( e ) => this . tabItemClick ( e , 'linked-devices' ) } >
2019-02-18 09:48:35 +00:00
< 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 >
2019-04-12 05:28:15 +00:00
{ canInvitePeople &&
2019-06-04 09:59:54 +00:00
< li className = "nav-item" >
2020-01-03 08:50:17 +00:00
< Link className = { ` nav-link ellipsis ${ this . getActiveClass ( 'invitations' ) } ` } to = { siteRoot + 'invitations/' } title = { gettext ( 'Invite Guest' ) } onClick = { ( e ) => this . tabItemClick ( e , 'invitations' ) } >
2019-04-12 05:28:15 +00:00
< span className = "sf2-icon-invite" aria - hidden = "true" > < / s p a n >
2020-01-03 08:50:17 +00:00
< span className = "nav-text" > { gettext ( 'Invite Guest' ) } < / s p a n >
2019-04-12 05:28:15 +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-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 >
2022-10-12 10:10:12 +00:00
< span className = { ` toggle-icon fas ${ this . state . sharedExtended ? 'fa-caret-down' : 'fa-caret-left' } ` } aria - hidden = "true" > < / s p a n >
2018-09-30 04:19:30 +00:00
< / a >
{ this . renderSharedAdmin ( ) }
< / l i >
2020-02-10 01:25:17 +00:00
{ customNavItems && this . renderCustomNavItems ( ) }
2018-09-30 04:19:30 +00:00
< / u l >
< / d i v >
2019-09-19 07:47:03 +00:00
2019-11-27 02:44:12 +00:00
{ dtableWebServer &&
< div className = "side-nav-link" onClick = { this . onDTableClick } >
< span className = "link-icon icon-left sf3-font sf3-font-dtable-logo" aria - hidden = "true" > < / s p a n >
< span className = "link-text" > SeaTable < / s p a n >
< span className = "link-icon icon-right sf3-font sf3-font-arrow" > < / s p a n >
< / d i v >
}
2018-09-30 04:19:30 +00:00
< / 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 ;