2018-11-30 17:18:41 +08:00
import React , { Component , Fragment } from 'react' ;
2019-03-19 10:35:21 +08:00
import cookie from 'react-cookies' ;
2024-11-25 10:23:42 +08:00
import classnames from 'classnames' ;
import Repo from '../../models/repo' ;
2018-11-30 17:18:41 +08:00
import { seafileAPI } from '../../utils/seafile-api' ;
2024-07-27 15:41:38 +08:00
import { gettext } from '../../utils/constants' ;
2018-12-28 15:19:10 +08:00
import { Utils } from '../../utils/utils' ;
2019-07-16 10:01:09 +08:00
import toaster from '../../components/toast' ;
2019-02-13 14:21:39 +08:00
import Loading from '../../components/loading' ;
2019-06-10 17:30:10 +08:00
import EmptyTip from '../../components/empty-tip' ;
2024-07-09 15:08:47 +08:00
import ModalPortal from '../../components/modal-portal' ;
2024-11-25 10:23:42 +08:00
import ViewModes from '../../components/view-modes' ;
import ReposSortMenu from '../../components/sort-menu' ;
import SingleDropdownToolbar from '../../components/toolbar/single-dropdown-toolbar' ;
import SortOptionsDialog from '../../components/dialog/sort-options' ;
2024-07-09 15:08:47 +08:00
import CreateRepoDialog from '../../components/dialog/create-repo-dialog' ;
2024-12-23 22:26:11 +08:00
import DeletedReposDialog from '../../components/dialog/my-deleted-repos-dialog' ;
2024-11-25 10:23:42 +08:00
import { LIST _MODE } from '../../components/dir-view-mode/constants' ;
import MylibRepoListView from './mylib-repo-list-view' ;
2018-11-30 17:18:41 +08:00
class MyLibraries extends Component {
constructor ( props ) {
super ( props ) ;
this . state = {
errorMsg : '' ,
2019-02-13 14:21:39 +08:00
isLoading : true ,
repoList : [ ] ,
2024-07-27 15:41:38 +08:00
isDeletedReposDialogOpen : false ,
2024-07-09 15:08:47 +08:00
isCreateRepoDialogOpen : false ,
2019-07-16 07:55:55 +08:00
isSortOptionsDialogOpen : false ,
2024-11-25 10:23:42 +08:00
currentViewMode : localStorage . getItem ( 'sf_repo_list_view_mode' ) || LIST _MODE ,
2019-05-29 14:43:22 +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'
2018-11-30 17:18:41 +08:00
} ;
2019-02-13 14:21:39 +08:00
2020-01-03 16:50:17 +08:00
this . emptyTip = (
2024-08-20 11:19:11 +08:00
< EmptyTip
title = { gettext ( 'No libraries' ) }
2024-11-20 20:36:24 +08:00
text = { gettext ( 'You have not created any libraries yet. A library is a container to organize your files and folders. A library can also be shared with others and synced to your connected devices. You can create a library by clicking the "New Library" item in the dropdown menu.' ) }
2024-08-20 11:19:11 +08:00
>
2019-06-10 17:30:10 +08:00
< / E m p t y T i p >
2019-02-13 14:21:39 +08:00
) ;
2018-11-30 17:18:41 +08:00
}
componentDidMount ( ) {
2024-07-18 11:58:42 +08:00
seafileAPI . listRepos ( { type : 'mine' } ) . then ( ( res ) => {
2018-12-28 15:19:10 +08:00
let repoList = res . data . repos . map ( ( item ) => {
return new Repo ( item ) ;
} ) ;
2018-11-30 17:18:41 +08:00
this . setState ( {
2019-02-13 14:21:39 +08:00
isLoading : false ,
repoList : Utils . sortRepos ( repoList , this . state . sortBy , this . state . sortOrder )
2018-11-30 17:18:41 +08:00
} ) ;
} ) . catch ( ( error ) => {
2019-12-05 15:45:16 +08:00
this . setState ( {
isLoading : false ,
errorMsg : Utils . getErrorMsg ( error , true ) // true: show login tip if 403
} ) ;
2018-11-30 17:18:41 +08:00
} ) ;
}
2019-07-16 07:55:55 +08:00
toggleSortOptionsDialog = ( ) => {
this . setState ( {
isSortOptionsDialogOpen : ! this . state . isSortOptionsDialogOpen
} ) ;
2023-09-13 08:40:50 +08:00
} ;
2019-07-16 07:55:55 +08:00
2018-12-07 10:36:59 +08:00
onCreateRepo = ( repo ) => {
2024-07-09 15:08:47 +08:00
this . toggleCreateRepoDialog ( ) ;
2018-12-07 10:36:59 +08:00
seafileAPI . createMineRepo ( repo ) . then ( ( res ) => {
2019-08-08 13:08:13 +08:00
const newRepo = new Repo ( {
2018-12-17 15:12:10 +08:00
repo _id : res . data . repo _id ,
repo _name : res . data . repo _name ,
size : res . data . repo _size ,
mtime : res . data . mtime ,
owner _email : res . data . email ,
encrypted : res . data . encrypted ,
2019-08-08 13:08:13 +08:00
permission : res . data . permission ,
storage _name : res . data . storage _name
} ) ;
this . state . repoList . unshift ( newRepo ) ;
2024-07-18 11:58:42 +08:00
this . setState ( { repoList : this . state . repoList } ) ;
2019-07-16 10:01:09 +08:00
} ) . catch ( error => {
let errMessage = Utils . getErrorMsg ( error ) ;
toaster . danger ( errMessage ) ;
2018-12-07 10:36:59 +08:00
} ) ;
2023-09-13 08:40:50 +08:00
} ;
2018-12-07 10:36:59 +08:00
2019-02-13 14:21:39 +08:00
sortRepoList = ( 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 ) ;
2018-12-28 15:19:10 +08:00
this . setState ( {
sortBy : sortBy ,
sortOrder : sortOrder ,
2019-02-13 14:21:39 +08:00
repoList : Utils . sortRepos ( this . state . repoList , sortBy , sortOrder )
2018-12-28 15:19:10 +08:00
} ) ;
2023-09-13 08:40:50 +08:00
} ;
2018-12-28 15:19:10 +08:00
2018-12-12 15:34:54 +08:00
onTransferRepo = ( repoID ) => {
2019-02-13 14:21:39 +08:00
let repoList = this . state . repoList . filter ( item => {
2018-12-12 15:34:54 +08:00
return item . repo _id !== repoID ;
2019-01-31 17:37:02 +08:00
} ) ;
2024-07-18 11:58:42 +08:00
this . setState ( { repoList : repoList } ) ;
2023-09-13 08:40:50 +08:00
} ;
2018-12-07 02:46:47 +00:00
2018-12-12 15:34:54 +08:00
onRenameRepo = ( repo , newName ) => {
2019-02-13 14:21:39 +08:00
let repoList = this . state . repoList . map ( item => {
2018-12-12 15:34:54 +08:00
if ( item . repo _id === repo . repo _id ) {
item . repo _name = newName ;
2018-12-07 02:46:47 +00:00
}
2018-12-12 15:34:54 +08:00
return item ;
} ) ;
2024-07-18 11:58:42 +08:00
this . setState ( { repoList : repoList } ) ;
2023-09-13 08:40:50 +08:00
} ;
2020-11-02 13:56:35 +08:00
2023-02-03 09:51:18 +08:00
onMonitorRepo = ( repo , monitored ) => {
let repoList = this . state . repoList . map ( item => {
if ( item . repo _id === repo . repo _id ) {
item . monitored = monitored ;
}
return item ;
} ) ;
2024-07-18 11:58:42 +08:00
this . setState ( { repoList : repoList } ) ;
2023-09-13 08:40:50 +08:00
} ;
2023-02-03 09:51:18 +08:00
2018-12-12 15:34:54 +08:00
onDeleteRepo = ( repo ) => {
2019-02-13 14:21:39 +08:00
let repoList = this . state . repoList . filter ( item => {
2018-12-12 15:34:54 +08:00
return item . repo _id !== repo . repo _id ;
} ) ;
2024-07-18 11:58:42 +08:00
this . setState ( { repoList : repoList } ) ;
2023-09-13 08:40:50 +08:00
} ;
2018-12-12 15:34:54 +08:00
2024-07-09 15:08:47 +08:00
toggleCreateRepoDialog = ( ) => {
2024-07-18 11:58:42 +08:00
this . setState ( { isCreateRepoDialogOpen : ! this . state . isCreateRepoDialogOpen } ) ;
2024-07-09 15:08:47 +08:00
} ;
2024-07-27 15:41:38 +08:00
toggleDeletedReposDialog = ( ) => {
2024-07-09 15:08:47 +08:00
this . setState ( {
2024-07-27 15:41:38 +08:00
isDeletedReposDialogOpen : ! this . state . isDeletedReposDialogOpen
2024-07-09 15:08:47 +08:00
} ) ;
} ;
2024-11-25 10:23:42 +08:00
switchViewMode = ( newMode ) => {
this . setState ( {
currentViewMode : newMode
} , ( ) => {
localStorage . setItem ( 'sf_repo_list_view_mode' , newMode ) ;
} ) ;
} ;
onSelectSortOption = ( sortOption ) => {
const [ sortBy , sortOrder ] = sortOption . value . split ( '-' ) ;
this . setState ( { sortBy , sortOrder } , ( ) => {
this . sortRepoList ( sortBy , sortOrder ) ;
} ) ;
} ;
2018-11-30 17:18:41 +08:00
render ( ) {
2024-11-25 10:23:42 +08:00
const { isLoading , errorMsg , currentViewMode , sortBy , sortOrder , repoList } = this . state ;
const isDesktop = Utils . isDesktop ( ) ;
2018-11-30 17:18:41 +08:00
return (
< Fragment >
2018-12-12 15:34:54 +08:00
< div className = "main-panel-center flex-row" >
2018-11-30 17:18:41 +08:00
< div className = "cur-view-container" >
2019-08-29 15:28:54 +08:00
< div className = "cur-view-path" >
2024-07-09 15:08:47 +08:00
< h3 className = "sf-heading m-0" >
{ gettext ( 'My Libraries' ) }
< SingleDropdownToolbar
2024-07-27 15:41:38 +08:00
opList = { [
{ 'text' : gettext ( 'New Library' ) , 'onClick' : this . toggleCreateRepoDialog } ,
{ 'text' : gettext ( 'Deleted Libraries' ) , 'onClick' : this . toggleDeletedReposDialog }
] }
2024-07-09 15:08:47 +08:00
/ >
< / h 3 >
2024-11-25 10:23:42 +08:00
{ isDesktop ? (
< div className = "d-flex align-items-center" >
< div className = "mr-2" >
< ViewModes currentViewMode = { currentViewMode } switchViewMode = { this . switchViewMode } / >
< / d i v >
< ReposSortMenu sortBy = { sortBy } sortOrder = { sortOrder } onSelectSortOption = { this . onSelectSortOption } / >
< / d i v >
) : (
< >
{ repoList . length > 0 &&
< span className = "sf3-font sf3-font-sort action-icon" onClick = { this . toggleSortOptionsDialog } > < / s p a n >
}
< / >
) }
2018-11-30 17:18:41 +08:00
< / d i v >
2024-11-25 10:23:42 +08:00
< div className = { classnames ( 'cur-view-content' , 'repos-container' , { 'pt-3' : currentViewMode != LIST _MODE } ) } >
{ isLoading
? < Loading / >
: errorMsg
? < p className = "error text-center mt-8" > { errorMsg } < / p >
: repoList . length == 0
? this . emptyTip
: (
< MylibRepoListView
sortBy = { sortBy }
sortOrder = { sortOrder }
repoList = { this . state . repoList }
onRenameRepo = { this . onRenameRepo }
onDeleteRepo = { this . onDeleteRepo }
onTransferRepo = { this . onTransferRepo }
onMonitorRepo = { this . onMonitorRepo }
sortRepoList = { this . sortRepoList }
currentViewMode = { currentViewMode }
/ >
)
2019-02-13 14:21:39 +08:00
}
2018-11-30 17:18:41 +08:00
< / d i v >
< / d i v >
2019-07-16 07:55:55 +08:00
{ this . state . isSortOptionsDialogOpen &&
< SortOptionsDialog
toggleDialog = { this . toggleSortOptionsDialog }
2024-11-25 10:23:42 +08:00
sortBy = { sortBy }
sortOrder = { sortOrder }
2019-07-17 17:37:39 +08:00
sortItems = { this . sortRepoList }
2019-07-16 07:55:55 +08:00
/ >
}
2024-07-09 15:08:47 +08:00
{ this . state . isCreateRepoDialogOpen && (
< ModalPortal >
< CreateRepoDialog
libraryType = 'mine'
onCreateRepo = { this . onCreateRepo }
onCreateToggle = { this . toggleCreateRepoDialog }
/ >
< / M o d a l P o r t a l >
) }
2024-07-27 15:41:38 +08:00
{ this . state . isDeletedReposDialogOpen && (
< ModalPortal >
< DeletedReposDialog
toggleDialog = { this . toggleDeletedReposDialog }
/ >
< / M o d a l P o r t a l >
) }
2018-11-30 17:18:41 +08:00
< / d i v >
< / F r a g m e n t >
) ;
}
}
export default MyLibraries ;