2019-03-15 02:10:24 +00:00
import React , { Fragment } from 'react' ;
import PropTypes from 'prop-types' ;
2019-03-28 09:34:01 +00:00
import { DropdownToggle , Dropdown , DropdownMenu , DropdownItem , Tooltip , Modal } from 'reactstrap' ;
2019-03-15 02:10:24 +00:00
import { Utils } from '../../utils/utils' ;
import { gettext , siteRoot } from '../../utils/constants' ;
import { seafileAPI } from '../../utils/seafile-api' ;
import ModalPotal from '../modal-portal' ;
import ShareDialog from '../dialog/share-dialog' ;
import EditFileTagDialog from '../dialog/edit-filetag-dialog' ;
import ListRelatedFileDialog from '../dialog/list-related-file-dialog' ;
import AddRelatedFileDialog from '../dialog/add-related-file-dialog' ;
const propTypes = {
path : PropTypes . string . isRequired ,
repoID : PropTypes . string . isRequired ,
userPerm : PropTypes . string . isRequired ,
repoEncrypted : PropTypes . bool . isRequired ,
enableDirPrivateShare : PropTypes . bool . isRequired ,
isGroupOwnedRepo : PropTypes . bool . isRequired ,
filePermission : PropTypes . bool . isRequired ,
isDraft : PropTypes . bool . isRequired ,
hasDraft : PropTypes . bool . isRequired ,
fileTags : PropTypes . array . isRequired ,
relatedFiles : PropTypes . array . isRequired ,
onFileTagChanged : PropTypes . func . isRequired ,
onRelatedFileChange : PropTypes . func . isRequired ,
} ;
class ViewFileToolbar extends React . Component {
constructor ( props ) {
super ( props ) ;
this . state = {
isDraftMessageShow : false ,
isMoreMenuShow : false ,
isShareDialogShow : false ,
isEditTagDialogShow : false ,
isListRelatedFileDialogShow : false ,
isAddRelatedFileDialogShow : false ,
2019-03-28 09:34:01 +00:00
isRelatedFileDialogShow : false ,
2019-03-15 02:10:24 +00:00
} ;
}
onEditClick = ( e ) => {
e . preventDefault ( ) ;
let { path , repoID } = this . props ;
let url = siteRoot + 'lib/' + repoID + '/file' + Utils . encodePath ( path ) + '?mode=edit' ;
window . open ( url ) ;
}
onNewDraft = ( e ) => {
e . preventDefault ( ) ;
let { path , repoID } = this . props ;
seafileAPI . createDraft ( repoID , path ) . then ( res => {
window . location . href = siteRoot + 'lib/' + res . data . origin _repo _id + '/file' + res . data . draft _file _path + '?mode=edit' ;
} ) ;
}
onDraftHover = ( ) => {
this . setState ( { isDraftMessageShow : ! this . state . isDraftMessageShow } ) ;
}
toggleMore = ( ) => {
this . setState ( { isMoreMenuShow : ! this . state . isMoreMenuShow } ) ;
}
onShareToggle = ( ) => {
this . setState ( { isShareDialogShow : ! this . state . isShareDialogShow } ) ;
}
onEditFileTagToggle = ( ) => {
this . setState ( { isEditTagDialogShow : ! this . state . isEditTagDialogShow } ) ;
}
onListRelatedFileToggle = ( ) => {
2019-03-28 09:34:01 +00:00
this . setState ( {
isListRelatedFileDialogShow : true ,
isRelatedFileDialogShow : true ,
} ) ;
}
toggleCancel = ( ) => {
this . setState ( {
isListRelatedFileDialogShow : false ,
isAddRelatedFileDialogShow : false ,
isRelatedFileDialogShow : false ,
} )
}
onCloseAddRelatedFileDialog = ( ) => {
this . setState ( {
isListRelatedFileDialogShow : true ,
isAddRelatedFileDialogShow : false ,
} ) ;
2019-03-15 02:10:24 +00:00
}
onAddRelatedFileToggle = ( ) => {
this . setState ( {
2019-03-28 09:34:01 +00:00
isListRelatedFileDialogShow : false ,
isAddRelatedFileDialogShow : true ,
2019-03-15 02:10:24 +00:00
} ) ;
}
render ( ) {
let name = Utils . getFileName ( this . props . path ) ;
let dirent = { name : name } ;
return (
< Fragment >
< div className = "dir-operation" >
{ ( this . props . filePermission && ! this . props . hasDraft ) && (
< Fragment >
< button className = "btn btn-secondary operation-item" title = { gettext ( 'Edit File' ) } onClick = { this . onEditClick } > { gettext ( 'Edit' ) } < / b u t t o n >
< / F r a g m e n t >
) }
{ /* default have read priv */ }
{ ( ! this . props . isDraft && ! this . props . hasDraft ) && (
< Fragment >
< button id = "new-draft" className = "btn btn-secondary operation-item" onClick = { this . onNewDraft } > { gettext ( 'New Draft' ) } < / b u t t o n >
< Tooltip target = "new-draft" placement = "bottom" isOpen = { this . state . isDraftMessageShow } toggle = { this . onDraftHover } > { gettext ( 'Create a draft from this file, instead of editing it directly.' ) } < / T o o l t i p >
< / F r a g m e n t >
) }
{ this . props . filePermission && (
< Dropdown isOpen = { this . state . isMoreMenuShow } toggle = { this . toggleMore } >
< DropdownToggle className = 'btn btn-secondary operation-item' >
{ gettext ( 'More' ) }
< / D r o p d o w n T o g g l e >
< DropdownMenu >
< DropdownItem onClick = { this . onShareToggle } > { gettext ( 'Share' ) } < / D r o p d o w n I t e m >
2019-03-19 00:06:33 +00:00
< DropdownItem onClick = { this . onEditFileTagToggle } > { gettext ( 'Tags' ) } < / D r o p d o w n I t e m >
< DropdownItem onClick = { this . onListRelatedFileToggle } > { gettext ( 'Related Files' ) } < / D r o p d o w n I t e m >
2019-03-15 02:10:24 +00:00
< / D r o p d o w n M e n u >
< / D r o p d o w n >
) }
< / d i v >
{ this . state . isShareDialogShow && (
< ModalPotal >
< ShareDialog
itemType = { 'file' }
itemName = { Utils . getFileName ( this . props . path ) }
itemPath = { this . props . path }
repoID = { this . props . repoID }
repoEncrypted = { this . props . repoEncrypted }
enableDirPrivateShare = { this . props . enableDirPrivateShare }
userPerm = { this . props . userPerm }
isGroupOwnedRepo = { this . props . isGroupOwnedRepo }
toggleDialog = { this . onShareToggle }
/ >
< / M o d a l P o t a l >
) }
{ this . state . isEditTagDialogShow && (
< ModalPotal >
< EditFileTagDialog
filePath = { this . props . path }
repoID = { this . props . repoID }
fileTagList = { this . props . fileTags }
toggleCancel = { this . onEditFileTagToggle }
onFileTagChanged = { this . props . onFileTagChanged }
/ >
< / M o d a l P o t a l >
) }
2019-03-28 09:34:01 +00:00
{ this . state . isRelatedFileDialogShow && (
2019-03-15 02:10:24 +00:00
< ModalPotal >
2019-03-28 09:34:01 +00:00
< Modal isOpen = { true } toggle = { this . toggleCancel } size = 'lg' style = { { width : '650px' } } >
{ this . state . isListRelatedFileDialogShow &&
< ListRelatedFileDialog
repoID = { this . props . repoID }
filePath = { this . props . path }
relatedFiles = { this . props . relatedFiles }
toggleCancel = { this . toggleCancel }
addRelatedFileToggle = { this . onAddRelatedFileToggle }
onRelatedFileChange = { this . props . onRelatedFileChange }
/ >
}
{ this . state . isAddRelatedFileDialogShow &&
< AddRelatedFileDialog
dirent = { dirent }
repoID = { this . props . repoID }
filePath = { this . props . path }
onRelatedFileChange = { this . props . onRelatedFileChange }
toggleCancel = { this . onCloseAddRelatedFileDialog }
onClose = { this . toggleCancel }
/ >
}
< / M o d a l >
2019-03-15 02:10:24 +00:00
< / M o d a l P o t a l >
) }
< / F r a g m e n t >
) ;
}
}
ViewFileToolbar . propTypes = propTypes ;
export default ViewFileToolbar ;