2018-11-26 09:53:18 +00:00
import React , { Component } from 'react' ;
2018-11-19 03:53:44 +00:00
import { seafileAPI } from '../../utils/seafile-api' ;
import { Utils } from '../../utils/utils' ;
import { gettext , siteRoot , loginUrl , isPro } from '../../utils/constants' ;
class Content extends Component {
render ( ) {
const { loading , errorMsg , items } = this . props . data ;
if ( loading ) {
return < span className = "loading-icon loading-tip" > < / s p a n > ;
} else if ( errorMsg ) {
return < p className = "error text-center" > { errorMsg } < / p > ;
} else {
const emptyTip = (
< div className = "empty-tip" >
< h2 > { gettext ( 'You have not shared any libraries' ) } < / h 2 >
< p > { gettext ( "You can share libraries with your friends and colleagues by clicking the share icon of your own libraries in your home page or creating a new library in groups you are in." ) } < / p >
< / d i v >
) ;
const table = (
< table className = "table table-hover table-vcenter" >
< thead >
< tr >
< th width = "7%" > { /*icon*/ } < / t h >
< th width = "30%" > { gettext ( "Name" ) } < a className = "table-sort-op by-name" href = "#" > < span className = "sort-icon icon-caret-down hide" > < /span>{/ * TODO : sort by name * / } < / a > < / t h >
< th width = "30%" > { gettext ( "Share To" ) } < / t h >
< th width = "25%" > { gettext ( "Permission" ) } < / t h >
< th width = "8%" > < / t h >
< / t r >
< / t h e a d >
< TableBody items = { items } / >
< / t a b l e >
) ;
return items . length ? table : emptyTip ;
}
}
}
class TableBody extends Component {
constructor ( props ) {
super ( props ) ;
this . state = {
items : this . props . items
} ;
}
componentDidMount ( ) {
document . addEventListener ( 'click' , this . clickDocument ) ;
}
clickDocument ( e ) {
// TODO: click 'outside' to hide `<select>`
}
render ( ) {
let listItems = this . state . items . map ( function ( item , index ) {
return < Item key = { index } data = { item } / > ;
} , this ) ;
return (
< tbody > { listItems } < / t b o d y >
) ;
}
}
class Item extends Component {
constructor ( props ) {
super ( props ) ;
this . state = {
share _permission : this . props . data . share _permission ,
is _admin : this . props . data . is _admin ,
showOpIcon : false ,
showSelect : false ,
unshared : false
} ;
this . handleMouseOver = this . handleMouseOver . bind ( this ) ;
this . handleMouseOut = this . handleMouseOut . bind ( this ) ;
this . showSelect = this . showSelect . bind ( this ) ;
this . changePerm = this . changePerm . bind ( this ) ;
this . unshare = this . unshare . bind ( this ) ;
}
handleMouseOver ( ) {
this . setState ( {
showOpIcon : true
} ) ;
}
handleMouseOut ( ) {
this . setState ( {
showOpIcon : false
} ) ;
}
unshare ( e ) {
e . preventDefault ( ) ;
const data = this . props . data ;
const share _type = data . share _type ;
let options = {
'share_type' : share _type
} ;
if ( share _type == 'personal' ) {
options . user = data . user _email ;
} else if ( share _type == 'group' ) {
options . group _id = data . group _id ;
}
seafileAPI . unshareRepo ( data . repo _id , options )
. then ( ( res ) => {
this . setState ( {
unshared : true
} ) ;
// TODO: show feedback msg
// gettext("Successfully deleted 1 item")
} )
. catch ( ( error ) => {
// TODO: show feedback msg
} ) ;
}
showSelect ( e ) {
e . preventDefault ( ) ;
this . setState ( {
showSelect : true
} ) ;
}
changePerm ( e ) {
const data = this . props . data ;
const share _type = data . share _type ;
const perm = e . target . value ;
let options = {
'share_type' : share _type ,
'permission' : perm
} ;
if ( share _type == 'personal' ) {
options . user = data . user _email ;
} else if ( share _type == 'group' ) {
options . group _id = data . group _id ;
}
seafileAPI . updateRepoSharePerm ( data . repo _id , options ) . then ( ( res ) => {
this . setState ( {
share _permission : perm == 'admin' ? 'rw' : perm ,
is _admin : perm == 'admin' ,
showSelect : false
} ) ;
// TODO: show feedback msg
// gettext("Successfully modified permission")
} ) . catch ( ( error ) => {
// TODO: show feedback msg
} ) ;
}
render ( ) {
if ( this . state . unshared ) {
return null ;
}
const data = this . props . data ;
const share _permission = this . state . share _permission ;
const is _admin = this . state . is _admin ;
let is _readonly = false ;
if ( share _permission == 'r' || share _permission == 'preview' ) {
is _readonly = true ;
}
data . icon _url = Utils . getLibIconUrl ( {
is _encrypted : data . encrypted ,
is _readonly : is _readonly ,
size : Utils . isHiDPI ( ) ? 48 : 24
} ) ;
data . icon _title = Utils . getLibIconTitle ( {
'encrypted' : data . encrypted ,
'is_admin' : is _admin ,
'permission' : share _permission
} ) ;
data . url = ` ${ siteRoot } #my-libs/lib/ ${ data . repo _id } / ` ;
let shareTo ;
const shareType = data . share _type ;
if ( shareType == 'personal' ) {
shareTo = < td title = { data . contact _email } > { data . user _name } < / t d > ;
} else if ( shareType == 'group' ) {
shareTo = < td > { data . group _name } < / t d > ;
} else if ( shareType == 'public' ) {
shareTo = < td > { gettext ( 'all members' ) } < / t d > ;
}
data . cur _perm = share _permission ;
// show 'admin' perm or not
data . show _admin = isPro && data . share _type != 'public' ;
if ( data . show _admin && is _admin ) {
data . cur _perm = 'admin' ;
}
data . cur _perm _text = Utils . sharePerms [ data . cur _perm ] ;
let iconVisibility = this . state . showOpIcon ? '' : ' invisible' ;
let editIconClassName = 'perm-edit-icon sf2-icon-edit op-icon' + iconVisibility ;
let unshareIconClassName = 'unshare op-icon sf2-icon-delete' + iconVisibility ;
let permOption = function ( options ) {
return < option value = { options . perm } > { Utils . sharePerms [ options . perm ] } < / o p t i o n > ;
} ;
const item = (
< tr onMouseOver = { this . handleMouseOver } onMouseOut = { this . handleMouseOut } >
< td > < img src = { data . icon _url } title = { data . icon _title } alt = { data . icon _title } width = "24" / > < / t d >
< td > < a href = { data . url } > { data . repo _name } < / a > < / t d >
{ shareTo }
{
this . state . showSelect ? (
< td >
< select className = "form-control" defaultValue = { data . cur _perm } onChange = { this . changePerm } >
{ permOption ( { perm : 'rw' } ) }
{ permOption ( { perm : 'r' } ) }
{ data . show _admin ? permOption ( { perm : 'admin' } ) : '' }
{ isPro ? permOption ( { perm : 'cloud-edit' } ) : '' }
{ isPro ? permOption ( { perm : 'preview' } ) : '' }
< / s e l e c t >
< / t d >
) : (
< td >
< span > { data . cur _perm _text } < / s p a n >
< a href = "#" title = { gettext ( 'Edit' ) } className = { editIconClassName } onClick = { this . showSelect } > < / a >
< / t d >
)
}
< td > < a href = "#" className = { unshareIconClassName } title = { gettext ( 'Unshare' ) } onClick = { this . unshare } > < / a > < / t d >
< / t r >
) ;
return item ;
}
}
class ShareAdminLibraries extends Component {
constructor ( props ) {
super ( props ) ;
this . state = {
loading : true ,
errorMsg : '' ,
items : [ ]
} ;
}
componentDidMount ( ) {
2018-11-19 06:26:23 +00:00
seafileAPI . listSharedRepos ( ) . then ( ( res ) => {
2018-11-19 03:53:44 +00:00
// res: {data: Array(2), status: 200, statusText: "OK", headers: {…}, config: {…}, …}
this . setState ( {
loading : false ,
items : res . data
} ) ;
} ) . catch ( ( error ) => {
if ( error . response ) {
if ( error . response . status == 403 ) {
this . setState ( {
loading : false ,
errorMsg : gettext ( "Permission denied" )
} ) ;
location . href = ` ${ loginUrl } ?next= ${ encodeURIComponent ( location . href ) } ` ;
} else {
this . setState ( {
loading : false ,
errorMsg : gettext ( "Error" )
} ) ;
}
} else {
this . setState ( {
loading : false ,
errorMsg : gettext ( "Please check the network." )
} ) ;
}
} ) ;
}
render ( ) {
return (
2018-11-26 09:53:18 +00:00
< div className = "main-panel-center" >
< div className = "cur-view-container" id = "share-admin-libs" >
< div className = "cur-view-path" >
< h3 className = "sf-heading" > { gettext ( "Libraries" ) } < / h 3 >
< / d i v >
< div className = "cur-view-content" >
< Content data = { this . state } / >
2018-11-26 06:00:32 +00:00
< / d i v >
2018-11-19 03:53:44 +00:00
< / d i v >
2018-11-26 09:53:18 +00:00
< / d i v >
2018-11-19 03:53:44 +00:00
) ;
}
}
export default ShareAdminLibraries ;