2018-10-15 15:51:29 +08:00
import React from 'react' ;
import { siteRoot , gettext } from '../../utils/constants' ;
import editUtilties from '../../utils/editor-utilties' ;
2018-11-08 10:36:41 +08:00
import { Utils } from '../../utils/utils' ;
2018-10-15 15:51:29 +08:00
import Toast from '../../components/toast' ;
import Loading from '../../components/loading' ;
import DraftListView from '../../components/draft-list-view/draft-list-view' ;
import DraftListMenu from '../../components/draft-list-view/draft-list-menu' ;
class DraftContent extends React . Component {
constructor ( props ) {
super ( props ) ;
this . state = {
isMenuShow : false ,
menuPosition : { top : '' , left : '' } ,
currentDraft : null ,
isItemFreezed : false ,
} ;
}
componentDidMount ( ) {
document . addEventListener ( 'click' , this . onHideContextMenu ) ;
}
componentWillUnmount ( ) {
document . removeEventListener ( 'click' , this . onHideContextMenu ) ;
}
onDeleteHandler = ( ) => {
let draft = this . state . currentDraft ;
2018-11-08 10:36:41 +08:00
let draft _name = Utils . getFileName ( draft . draft _file _path ) ;
2018-10-15 15:51:29 +08:00
editUtilties . deleteDraft ( draft . id ) . then ( res => {
2018-11-08 10:36:41 +08:00
this . props . updateDraftsList ( draft . id ) ;
2018-10-25 17:50:47 +08:00
let msg _s = gettext ( 'Successfully deleted draft %(draft)s.' ) ;
2018-11-08 10:36:41 +08:00
msg _s = msg _s . replace ( '%(draft)s' , draft _name ) ;
2018-10-25 17:50:47 +08:00
Toast . success ( msg _s ) ;
2018-10-15 15:51:29 +08:00
} ) . catch ( ( ) => {
2018-10-25 17:50:47 +08:00
let msg _s = gettext ( 'Failed to delete draft %(draft)s.' ) ;
2018-11-08 10:36:41 +08:00
msg _s = msg _s . replace ( '%(draft)s' , draft _name ) ;
2018-10-25 17:50:47 +08:00
Toast . error ( msg _s ) ;
2018-10-15 15:51:29 +08:00
} ) ;
}
onPublishHandler = ( ) => {
let draft = this . state . currentDraft ;
2018-11-08 10:36:41 +08:00
let draft _name = Utils . getFileName ( draft . draft _file _path ) ;
2018-10-15 15:51:29 +08:00
editUtilties . publishDraft ( draft . id ) . then ( res => {
2018-11-08 10:36:41 +08:00
this . props . updateDraftsList ( draft . id ) ;
2018-10-25 17:50:47 +08:00
let msg _s = gettext ( 'Successfully published draft %(draft)s.' ) ;
2018-11-08 10:36:41 +08:00
msg _s = msg _s . replace ( '%(draft)s' , draft _name ) ;
2018-10-25 17:50:47 +08:00
Toast . success ( msg _s ) ;
2018-10-15 15:51:29 +08:00
} ) . catch ( ( ) => {
2018-10-25 17:50:47 +08:00
let msg _s = gettext ( 'Failed to publish draft %(draft)s.' ) ;
2018-11-08 10:36:41 +08:00
msg _s = msg _s . replace ( '%(draft)s' , draft _name ) ;
2018-10-25 17:50:47 +08:00
Toast . error ( msg _s ) ;
2018-10-15 15:51:29 +08:00
} ) ;
}
onReviewHandler = ( ) => {
let draft = this . state . currentDraft ;
editUtilties . createDraftReview ( draft . id ) . then ( res => {
2018-10-25 13:36:06 +08:00
const w = window . open ( ) ;
2018-10-24 14:37:41 +08:00
w . location = siteRoot + 'drafts/review/' + res . data . id ;
2018-10-16 18:19:51 +08:00
} ) . catch ( ( error ) => {
2018-10-15 15:51:29 +08:00
if ( error . response . status == '409' ) {
2018-10-25 17:50:47 +08:00
Toast . error ( gettext ( 'Review already exists.' ) ) ;
2018-10-15 15:51:29 +08:00
}
} ) ;
}
onMenuToggleClick = ( e , draft ) => {
if ( this . state . isMenuShow ) {
this . onHideContextMenu ( ) ;
} else {
this . onShowContextMenu ( e , draft ) ;
}
}
onShowContextMenu = ( e , draft ) => {
let left = e . clientX - 8 * 16 ;
let top = e . clientY + 10 ;
let position = { top : top , left : left } ;
this . setState ( {
isMenuShow : true ,
menuPosition : position ,
currentDraft : draft ,
isItemFreezed : true
} ) ;
}
onHideContextMenu = ( ) => {
this . setState ( {
isMenuShow : false ,
currentDraft : null ,
isItemFreezed : false
} ) ;
}
render ( ) {
return (
2018-10-25 14:42:53 +08:00
< div className = "cur-view-content" >
2018-11-08 10:36:41 +08:00
{ this . props . isLoadingDraft && < Loading / > }
{ ( ! this . props . isLoadingDraft && this . props . draftList . length !== 0 ) &&
2018-10-15 15:51:29 +08:00
< DraftListView
2018-11-01 17:52:59 +08:00
draftList = { this . props . draftList }
2018-10-15 15:51:29 +08:00
isItemFreezed = { this . state . isItemFreezed }
onMenuToggleClick = { this . onMenuToggleClick }
/ >
}
2018-11-08 10:36:41 +08:00
{ ( ! this . props . isLoadingDraft && this . props . draftList . length === 0 ) &&
2018-10-15 15:51:29 +08:00
< div className = "message empty-tip" >
< h2 > { gettext ( 'No draft yet' ) } < / h 2 >
< p > { gettext ( 'Draft is a way to let you collaborate with others on files. You can create a draft from a file, edit the draft and then ask for a review. The original file will be updated only after the draft be reviewed.' ) } < / p >
< / d i v >
}
{ this . state . isMenuShow &&
< DraftListMenu
isMenuShow = { this . state . isMenuShow }
currentDraft = { this . state . currentDraft }
menuPosition = { this . state . menuPosition }
onPublishHandler = { this . onPublishHandler }
onDeleteHandler = { this . onDeleteHandler }
onReviewHandler = { this . onReviewHandler }
/ >
}
< / d i v >
2018-10-16 18:19:51 +08:00
) ;
2018-10-15 15:51:29 +08:00
}
}
export default DraftContent ;