2024-07-27 07:41:38 +00:00
import React , { Component } from 'react' ;
import PropTypes from 'prop-types' ;
import { Modal , ModalHeader , ModalBody } from 'reactstrap' ;
import moment from 'moment' ;
import { gettext , lang , trashReposExpireDays } from '../../utils/constants' ;
import { seafileAPI } from '../../utils/seafile-api' ;
import { Utils } from '../../utils/utils' ;
import toaster from '../../components/toast' ;
import Loading from '../../components/loading' ;
import EmptyTip from '../../components/empty-tip' ;
import '../../css/my-deleted-repos.css' ;
moment . locale ( lang ) ;
class MyLibsDeleted extends Component {
constructor ( props ) {
super ( props ) ;
this . state = {
deletedRepoList : [ ] ,
isLoading : true ,
} ;
}
componentDidMount ( ) {
seafileAPI . listDeletedRepo ( ) . then ( res => {
this . setState ( {
deletedRepoList : res . data ,
isLoading : false ,
} ) ;
} ) . catch ( error => {
let errMessage = Utils . getErrorMsg ( error ) ;
toaster . danger ( errMessage ) ;
} ) ;
}
refreshDeletedRepoList = ( repoID ) => {
let deletedRepoList = this . state . deletedRepoList . filter ( item => {
return item . repo _id !== repoID ;
} ) ;
this . setState ( { deletedRepoList : deletedRepoList } ) ;
} ;
render ( ) {
const { deletedRepoList : repos } = this . state ;
return (
< Modal isOpen = { true } toggle = { this . props . toggleDialog } className = "my-deleted-repos-dialog" >
< ModalHeader toggle = { this . props . toggleDialog } >
{ gettext ( 'Deleted Libraries' ) }
< / M o d a l H e a d e r >
< ModalBody className = "my-deleted-repos-container" >
{ this . state . isLoading && < Loading / > }
{ ( ! this . state . isLoading && repos . length === 0 ) &&
< EmptyTip forDialog = { true } className = "my-deleted-repos-empty-tip" >
< h2 className = "h6 font-weight-normal" > { gettext ( 'No deleted libraries' ) } < / h 2 >
< p className = "empty-explanation" > { gettext ( 'You have not deleted any libraries in the last {placeholder} days. A deleted library will be cleaned automatically after this period.' ) . replace ( '{placeholder}' , trashReposExpireDays ) } < / p >
< / E m p t y T i p >
}
{ repos . length !== 0 &&
< div >
< p className = "tip my-deleted-repos-tip" > { gettext ( 'Tip: libraries deleted {placeholder} days ago will be cleaned automatically.' ) . replace ( '{placeholder}' , trashReposExpireDays ) } < / p >
< table >
< thead >
< tr >
2024-08-12 04:14:03 +00:00
< th width = "10%" > { /* img*/ } < / t h >
< th width = "50%" > { gettext ( 'Name' ) } < / t h >
< th width = "28%" > { gettext ( 'Deleted Time' ) } < / t h >
< th width = "12%" > < / t h >
2024-07-27 07:41:38 +00:00
< / t r >
< / t h e a d >
< tbody >
{ repos . map ( ( item ) => {
return (
< DeletedRepoItem
key = { item . repo _id }
repo = { item }
refreshDeletedRepoList = { this . refreshDeletedRepoList }
/ >
) ;
} ) }
< / t b o d y >
< / t a b l e >
< / d i v >
}
< / M o d a l B o d y >
< / M o d a l >
) ;
}
}
class DeletedRepoItem extends Component {
constructor ( props ) {
super ( props ) ;
this . state = {
hideRestoreMenu : true ,
highlight : false ,
} ;
}
onMouseEnter = ( ) => {
this . setState ( {
hideRestoreMenu : false ,
highlight : true ,
} ) ;
} ;
onMouseLeave = ( ) => {
this . setState ( {
hideRestoreMenu : true ,
highlight : false ,
} ) ;
} ;
restoreDeletedRepo = ( e ) => {
e . preventDefault ( ) ;
let repoID = this . props . repo . repo _id ;
let repoName = this . props . repo . repo _name ;
seafileAPI . restoreDeletedRepo ( repoID ) . then ( res => {
let message = gettext ( 'Successfully restored the library {library_name}.' ) . replace ( '{library_name}' , repoName ) ;
toaster . success ( message ) ;
this . props . refreshDeletedRepoList ( repoID ) ;
} ) . catch ( error => {
const errMessage = Utils . getErrorMsg ( error ) ;
toaster . danger ( errMessage ) ;
} ) ;
} ;
render ( ) {
let localTime = moment . utc ( this . props . repo . del _time ) . toDate ( ) ;
localTime = moment ( localTime ) . fromNow ( ) ;
let iconUrl = Utils . getLibIconUrl ( this . props . repo ) ;
return (
< tr
className = { this . state . highlight ? 'tr-highlight' : '' }
onMouseEnter = { this . onMouseEnter }
onMouseLeave = { this . onMouseLeave }
tabIndex = "0"
onFocus = { this . onMouseEnter }
>
< td className = "text-center" > < img src = { iconUrl } alt = '' width = "24" / > < / t d >
< td className = "name" > { this . props . repo . repo _name } < / t d >
< td className = "update" > { localTime } < / t d >
< td >
< a href = "#" onClick = { this . restoreDeletedRepo } title = { gettext ( 'Restore' ) }
role = "button" aria - label = { gettext ( 'Restore' ) }
className = { ` sf2-icon-reply action-icon ${ this . state . highlight ? '' : 'vh' } ` } >
< / a >
< / t d >
< / t r >
) ;
}
}
DeletedRepoItem . propTypes = {
repo : PropTypes . object . isRequired ,
refreshDeletedRepoList : PropTypes . func . isRequired ,
} ;
MyLibsDeleted . propTypes = {
toggleDialog : PropTypes . func . isRequired
} ;
export default MyLibsDeleted ;