@@ -248,6 +248,7 @@ export class EditingModeExtension implements DocumentRegistry.IWidgetExtension<N
248
248
const reviewMenu = new Menu ( { commands : reviewCommands } ) ;
249
249
250
250
const sharedModel = context . model . sharedModel ;
251
+ const suggestions : { [ key : string ] : Menu . IItem } = { } ;
251
252
var myForkId = '' ; // curently allows only one suggestion per user
252
253
253
254
editingMenu . title . label = 'Editing' ;
@@ -321,49 +322,77 @@ export class EditingModeExtension implements DocumentRegistry.IWidgetExtension<N
321
322
if ( changes . stateChange ) {
322
323
changes . stateChange . forEach ( value => {
323
324
const forkPrefix = 'fork_' ;
324
- if ( value . name . startsWith ( forkPrefix ) ) {
325
- const newForkId = value . name . slice ( forkPrefix . length ) ;
326
- suggestionCommands . addCommand ( newForkId , {
327
- label : newForkId ,
328
- execute : ( ) => {
329
- if ( myForkId === newForkId ) {
330
- editingMenu . title . label = 'Suggesting' ;
331
- // our suggestion, cannot be reviewed
332
- reviewMenu . clearItems ( ) ;
333
- }
334
- else {
335
- editingMenu . title . label = 'Editing' ;
336
- // not our suggestion, can be reviewed
337
- reviewMenu . clearItems ( ) ;
338
- reviewMenu . addItem ( { type : 'command' , command : 'merge' } ) ;
339
- reviewMenu . addItem ( { type : 'command' , command : 'discard' } ) ;
340
- }
341
- suggestionMenu . title . label = newForkId ;
342
- sharedModel . provider . connectFork ( newForkId ) ;
343
- open_dialog ( 'Suggesting' , this . _trans ) ;
344
- }
345
- } ) ;
346
- suggestionMenu . addItem ( { type : 'command' , command : newForkId } ) ;
347
- if ( ( myForkId !== 'pending' ) && ( myForkId !== newForkId ) ) {
348
- const dialog = new Dialog ( {
349
- title : this . _trans . __ ( 'New suggestion' ) ,
350
- body : this . _trans . __ ( 'View suggestion?' ) ,
351
- buttons : [
352
- Dialog . okButton ( { label : 'View' } ) ,
353
- Dialog . cancelButton ( { label : 'Discard' } ) ,
354
- ] ,
355
- } ) ;
356
- dialog . launch ( ) . then ( resp => {
357
- dialog . close ( ) ;
358
- if ( resp . button . label === 'View' ) {
359
- sharedModel . provider . connectFork ( newForkId ) ;
360
- suggestionMenu . title . label = newForkId ;
361
- editingMenu . title . label = 'Editing' ;
362
- reviewMenu . clearItems ( ) ;
363
- reviewMenu . addItem ( { type : 'command' , command : 'merge' } ) ;
364
- reviewMenu . addItem ( { type : 'command' , command : 'discard' } ) ;
325
+ if ( value . name === 'merge' ) {
326
+ // FIXME: a client who is not connected to the fork should not see this update
327
+ if ( sharedModel . currentRoomId === value . newValue ) {
328
+ editingMenu . title . label = 'Editing' ;
329
+ suggestionMenu . title . label = 'Root' ;
330
+ const item : Menu . IItem = suggestions [ value . newValue ] ;
331
+ delete suggestions [ value . newValue ] ;
332
+ suggestionMenu . removeItem ( item ) ;
333
+ reviewMenu . clearItems ( ) ;
334
+ sharedModel . provider . connectFork ( sharedModel . rootRoomId ) ;
335
+ open_dialog ( 'Editing' , this . _trans ) ;
336
+ }
337
+ }
338
+ else if ( value . name . startsWith ( forkPrefix ) ) {
339
+ const forkId = value . name . slice ( forkPrefix . length ) ;
340
+ if ( value . newValue === 'new' ) {
341
+ suggestionCommands . addCommand ( forkId , {
342
+ label : forkId ,
343
+ execute : ( ) => {
344
+ if ( myForkId === forkId ) {
345
+ editingMenu . title . label = 'Suggesting' ;
346
+ // our suggestion, cannot be reviewed
347
+ reviewMenu . clearItems ( ) ;
348
+ }
349
+ else {
350
+ editingMenu . title . label = 'Editing' ;
351
+ // not our suggestion, can be reviewed
352
+ reviewMenu . clearItems ( ) ;
353
+ reviewMenu . addItem ( { type : 'command' , command : 'merge' } ) ;
354
+ reviewMenu . addItem ( { type : 'command' , command : 'discard' } ) ;
355
+ }
356
+ suggestionMenu . title . label = forkId ;
357
+ sharedModel . provider . connectFork ( forkId ) ;
358
+ open_dialog ( 'Suggesting' , this . _trans ) ;
365
359
}
366
360
} ) ;
361
+ const item = suggestionMenu . addItem ( { type : 'command' , command : forkId } ) ;
362
+ suggestions [ forkId ] = item ;
363
+ if ( ( myForkId !== 'pending' ) && ( myForkId !== forkId ) ) {
364
+ const dialog = new Dialog ( {
365
+ title : this . _trans . __ ( 'New suggestion' ) ,
366
+ body : this . _trans . __ ( 'View suggestion?' ) ,
367
+ buttons : [
368
+ Dialog . okButton ( { label : 'View' } ) ,
369
+ Dialog . cancelButton ( { label : 'Discard' } ) ,
370
+ ] ,
371
+ } ) ;
372
+ dialog . launch ( ) . then ( resp => {
373
+ dialog . close ( ) ;
374
+ if ( resp . button . label === 'View' ) {
375
+ sharedModel . provider . connectFork ( forkId ) ;
376
+ suggestionMenu . title . label = forkId ;
377
+ editingMenu . title . label = 'Editing' ;
378
+ reviewMenu . clearItems ( ) ;
379
+ reviewMenu . addItem ( { type : 'command' , command : 'merge' } ) ;
380
+ reviewMenu . addItem ( { type : 'command' , command : 'discard' } ) ;
381
+ }
382
+ } ) ;
383
+ }
384
+ }
385
+ else if ( value . newValue === undefined ) {
386
+ if ( sharedModel . currentRoomId === forkId ) {
387
+ editingMenu . title . label = 'Editing' ;
388
+ suggestionMenu . title . label = 'Root' ;
389
+ const item : Menu . IItem = suggestions [ value . newValue ] ;
390
+ delete suggestions [ value . newValue ] ;
391
+ suggestionMenu . removeItem ( item ) ;
392
+ reviewMenu . clearItems ( ) ;
393
+ sharedModel . provider . connectFork ( sharedModel . rootRoomId ) ;
394
+ open_dialog ( 'Editing' , this . _trans ) ;
395
+ }
367
396
}
368
397
}
369
398
} ) ;
0 commit comments