@@ -5,7 +5,20 @@ import _ from 'lodash'
55import ModeIcon from 'boost/components/ModeIcon'
66import MarkdownPreview from 'boost/components/MarkdownPreview'
77import CodeEditor from 'boost/components/CodeEditor'
8- import { IDLE_MODE , CREATE_MODE , EDIT_MODE , switchMode , switchArticle , switchFolder , clearSearch , updateArticle , destroyArticle , NEW } from 'boost/actions'
8+ import {
9+ IDLE_MODE ,
10+ CREATE_MODE ,
11+ EDIT_MODE ,
12+ switchMode ,
13+ switchArticle ,
14+ switchFolder ,
15+ clearSearch ,
16+ lockStatus ,
17+ unlockStatus ,
18+ updateArticle ,
19+ destroyArticle ,
20+ NEW
21+ } from 'boost/actions'
922import linkState from 'boost/linkState'
1023import FolderMark from 'boost/components/FolderMark'
1124import TagLink from 'boost/components/TagLink'
@@ -82,7 +95,12 @@ export default class ArticleDetail extends React.Component {
8295
8396 this . state = {
8497 article : makeInstantArticle ( props . activeArticle ) ,
85- previewMode : false
98+ previewMode : false ,
99+ isArticleEdited : false ,
100+ isTagChanged : false ,
101+ isTitleChanged : false ,
102+ isContentChanged : false ,
103+ isModeChanged : false
86104 }
87105 }
88106
@@ -117,7 +135,11 @@ export default class ArticleDetail extends React.Component {
117135 if ( isModeChanged ) {
118136 Object . assign ( nextState , {
119137 openDeleteConfirmMenu : false ,
120- previewMode : false
138+ previewMode : false ,
139+ isArticleEdited : false ,
140+ isTagChanged : false ,
141+ isTitleChanged : false ,
142+ isContentChanged : false
121143 } )
122144 }
123145
@@ -224,6 +246,8 @@ export default class ArticleDetail extends React.Component {
224246
225247 handleCancelButtonClick ( e ) {
226248 let { activeArticle, dispatch } = this . props
249+
250+ dispatch ( unlockStatus ( ) )
227251 if ( activeArticle . status === NEW ) dispatch ( switchArticle ( null ) )
228252 dispatch ( switchMode ( IDLE_MODE ) )
229253 }
@@ -236,6 +260,8 @@ export default class ArticleDetail extends React.Component {
236260 let folder = _ . findWhere ( folders , { key : article . FolderKey } )
237261 if ( folder == null ) return false
238262
263+ dispatch ( unlockStatus ( ) )
264+
239265 delete newArticle . status
240266 newArticle . updatedAt = new Date ( )
241267 if ( newArticle . createdAt == null ) {
@@ -263,19 +289,85 @@ export default class ArticleDetail extends React.Component {
263289 this . setState ( { article : article } )
264290 }
265291
292+ handleTitleChange ( e ) {
293+ let { article } = this . state
294+ article . title = e . target . value
295+ let _isTitleChanged = article . title !== this . props . activeArticle . title
296+
297+ let { isTagChanged, isContentChanged, isArticleEdited, isModeChanged } = this . state
298+ let _isArticleEdited = _isTitleChanged || isTagChanged || isContentChanged || isModeChanged
299+
300+ this . setState ( {
301+ article,
302+ isTitleChanged : _isTitleChanged ,
303+ isArticleEdited : _isArticleEdited
304+ } , ( ) => {
305+ if ( isArticleEdited !== _isArticleEdited ) {
306+ let { dispatch } = this . props
307+ if ( _isArticleEdited ) {
308+ console . log ( 'lockit' )
309+ dispatch ( lockStatus ( ) )
310+ } else {
311+ console . log ( 'unlockit' )
312+ dispatch ( unlockStatus ( ) )
313+ }
314+ }
315+ } )
316+ }
317+
266318 handleTagsChange ( newTag , tags ) {
267319 let article = this . state . article
268320 article . tags = tags
269321
270322 this . setState ( { article : article } )
323+
324+ let _isTagChanged = _ . difference ( article . tags , this . props . activeArticle . tags ) . length > 0 || _ . difference ( this . props . activeArticle . tags , article . tags ) . length > 0
325+
326+ let { isTitleChanged, isContentChanged, isArticleEdited, isModeChanged } = this . state
327+ let _isArticleEdited = _isTagChanged || isTitleChanged || isContentChanged || isModeChanged
328+
329+ this . setState ( {
330+ article,
331+ isTagChanged : _isTagChanged ,
332+ isArticleEdited : _isArticleEdited
333+ } , ( ) => {
334+ if ( isArticleEdited !== _isArticleEdited ) {
335+ let { dispatch } = this . props
336+ if ( _isArticleEdited ) {
337+ console . log ( 'lockit' )
338+ dispatch ( lockStatus ( ) )
339+ } else {
340+ console . log ( 'unlockit' )
341+ dispatch ( unlockStatus ( ) )
342+ }
343+ }
344+ } )
271345 }
272346
273347 handleModeChange ( value ) {
274- let article = this . state . article
348+ let { article } = this . state
275349 article . mode = value
350+ let _isModeChanged = article . mode !== this . props . activeArticle . mode
351+
352+ let { isTagChanged, isContentChanged, isArticleEdited, isTitleChanged } = this . state
353+ let _isArticleEdited = _isModeChanged || isTagChanged || isContentChanged || isTitleChanged
354+
276355 this . setState ( {
277- article : article ,
278- previewMode : false
356+ article,
357+ previewMode : false ,
358+ isModeChanged : _isModeChanged ,
359+ isArticleEdited : _isArticleEdited
360+ } , ( ) => {
361+ if ( isArticleEdited !== _isArticleEdited ) {
362+ let { dispatch } = this . props
363+ if ( _isArticleEdited ) {
364+ console . log ( 'lockit' )
365+ dispatch ( lockStatus ( ) )
366+ } else {
367+ console . log ( 'unlockit' )
368+ dispatch ( unlockStatus ( ) )
369+ }
370+ }
279371 } )
280372 }
281373
@@ -286,9 +378,29 @@ export default class ArticleDetail extends React.Component {
286378 }
287379
288380 handleContentChange ( e , value ) {
289- let article = this . state . article
381+ let { article } = this . state
290382 article . content = value
291- this . setState ( { article : article } )
383+ let _isContentChanged = article . content !== this . props . activeArticle . content
384+
385+ let { isTagChanged, isModeChanged, isArticleEdited, isTitleChanged } = this . state
386+ let _isArticleEdited = _isContentChanged || isTagChanged || isModeChanged || isTitleChanged
387+
388+ this . setState ( {
389+ article,
390+ isContentChanged : _isContentChanged ,
391+ isArticleEdited : _isArticleEdited
392+ } , ( ) => {
393+ if ( isArticleEdited !== _isArticleEdited ) {
394+ let { dispatch } = this . props
395+ if ( _isArticleEdited ) {
396+ console . log ( 'lockit' )
397+ dispatch ( lockStatus ( ) )
398+ } else {
399+ console . log ( 'unlockit' )
400+ dispatch ( unlockStatus ( ) )
401+ }
402+ }
403+ } )
292404 }
293405
294406 handleTogglePreviewButtonClick ( e ) {
@@ -322,6 +434,7 @@ export default class ArticleDetail extends React.Component {
322434 >
323435 { folderOptions }
324436 </ select >
437+ { this . state . isArticleEdited ? ' (edited)' : '' }
325438
326439 < TagSelect
327440 tags = { this . state . article . tags }
@@ -347,7 +460,7 @@ export default class ArticleDetail extends React.Component {
347460 < div className = 'detailPanel' >
348461 < div className = 'header' >
349462 < div className = 'title' >
350- < input onKeyDown = { e => this . handleTitleKeyDown ( e ) } placeholder = 'Title' ref = 'title' valueLink = { this . linkState ( ' article.title' ) } />
463+ < input onKeyDown = { e => this . handleTitleKeyDown ( e ) } placeholder = 'Title' ref = 'title' value = { this . state . article . title } onChange = { e => this . handleTitleChange ( e ) } />
351464 </ div >
352465 < ModeSelect
353466 ref = 'mode'
@@ -396,6 +509,7 @@ export default class ArticleDetail extends React.Component {
396509ArticleDetail . propTypes = {
397510 status : PropTypes . shape ( ) ,
398511 activeArticle : PropTypes . shape ( ) ,
399- activeUser : PropTypes . shape ( )
512+ activeUser : PropTypes . shape ( ) ,
513+ dispatch : PropTypes . func
400514}
401515ArticleDetail . prototype . linkState = linkState
0 commit comments