1
1
/*
2
2
* License information at https://github.com/Caltech-IPAC/firefly/blob/master/License.txt
3
3
*/
4
- import { without , union , difference , get } from 'lodash' ;
4
+ import { without , union , difference , get , includes , has } from 'lodash' ;
5
5
import { flux } from '../Firefly.js' ;
6
6
import { clone } from '../util/WebUtil.js' ;
7
7
import ImagePlotCntlr , { ExpandType } from './ImagePlotCntlr.js' ;
@@ -95,7 +95,8 @@ function initState() {
95
95
mounted : false ,
96
96
containerType : IMAGE ,
97
97
layoutDetail : 'none' ,
98
- customData : { }
98
+ customData : { } ,
99
+ lastActiveItemId : ''
99
100
} ,
100
101
{
101
102
viewerId :DEFAULT_PLOT2D_VIEWER_ID ,
@@ -107,7 +108,8 @@ function initState() {
107
108
mounted : false ,
108
109
containerType : PLOT2D ,
109
110
layoutDetail : 'none' ,
110
- customData : { }
111
+ customData : { } ,
112
+ lastActiveItemId : ''
111
113
}
112
114
] ;
113
115
}
@@ -127,7 +129,7 @@ function initState() {
127
129
* @param {boolean } mounted
128
130
*/
129
131
export function dispatchAddViewer ( viewerId , canReceiveNewPlots , containerType , mounted = false ) {
130
- flux . process ( { type : ADD_VIEWER , payload : { viewerId, canReceiveNewPlots, containerType, mounted} } ) ;
132
+ flux . process ( { type : ADD_VIEWER , payload : { viewerId, canReceiveNewPlots, containerType, mounted, lastActiveItemId : '' } } ) ;
131
133
}
132
134
133
135
/**
@@ -379,7 +381,8 @@ function reducer(state=initState(), action={}) {
379
381
}
380
382
break ;
381
383
case ImagePlotCntlr . CHANGE_ACTIVE_PLOT_VIEW :
382
- // update last plot view
384
+ case ImagePlotCntlr . PLOT_IMAGE :
385
+ retState = changeActiveItem ( state , payload , IMAGE ) ;
383
386
break ;
384
387
default :
385
388
break ;
@@ -403,13 +406,20 @@ function imageViewerCanAdd(state, viewerId, plotId) {
403
406
function addViewer ( state , payload ) {
404
407
405
408
const { viewerId, containerType, layout= GRID , canReceiveNewPlots= NewPlotMode . replace_only . key , mounted= false } = payload ;
409
+ var { lastActiveItemId} = payload ;
406
410
var entryInState = hasViewerId ( state , viewerId ) ;
407
411
408
412
if ( entryInState ) {
409
413
entryInState = Object . assign ( entryInState , { canReceiveNewPlots, mounted, containerType} ) ;
414
+
415
+ if ( has ( entryInState , 'lastActiveItemId' ) ) {
416
+ lastActiveItemId = entryInState . lastActiveItemId ? entryInState . lastActiveItemId : get ( entryInState , [ 'itemIdAry' , '0' ] , '' ) ;
417
+ entryInState = Object . assign ( entryInState , { lastActiveItemId} ) ;
418
+ }
410
419
return [ ...state ] ;
411
420
} else {
412
- const entry = { viewerId, containerType, canReceiveNewPlots, layout, mounted, itemIdAry : [ ] , customData : { } } ;
421
+ const entry = { viewerId, containerType, canReceiveNewPlots, layout, mounted, itemIdAry : [ ] , customData : { } ,
422
+ lastActiveItemId} ;
413
423
return [ ...state , entry ] ;
414
424
}
415
425
}
@@ -468,7 +478,15 @@ function replaceImages(state,viewerId,itemIdAry,containerType) {
468
478
}
469
479
}
470
480
471
- return state . map ( ( entry ) => entry . viewerId === viewerId ? clone ( entry , { itemIdAry} ) : entry ) ;
481
+ var updateViewer = ( entry ) => {
482
+ if ( has ( entry , 'lastActiveItemId' ) ) {
483
+ return { itemIdAry, lastActiveItemId : get ( itemIdAry , '0' , '' ) } ;
484
+ } else {
485
+ return { itemIdAry} ;
486
+ }
487
+ } ;
488
+
489
+ return state . map ( ( entry ) => entry . viewerId === viewerId ? clone ( entry , updateViewer ( entry ) ) : entry ) ;
472
490
}
473
491
474
492
@@ -484,8 +502,19 @@ function removeItems(state,action) {
484
502
var viewer = state . find ( ( entry ) => entry . viewerId === viewerId ) ;
485
503
if ( ! viewer ) return state ;
486
504
505
+ var rmIdAry = itemIdAry . slice ( ) ;
487
506
itemIdAry = difference ( viewer . itemIdAry , itemIdAry ) ;
488
- return state . map ( ( entry ) => entry . viewerId === viewerId ? clone ( entry , { itemIdAry} ) : entry ) ;
507
+
508
+ var updateViewer = ( entry ) => {
509
+
510
+ if ( has ( entry , 'lastActiveItemId' ) && rmIdAry . includes ( entry . lastActiveItemId ) ) {
511
+ return { itemIdAry, lastActiveItemId : get ( itemIdAry , '0' , '' ) } ;
512
+ } else {
513
+ return { itemIdAry}
514
+ }
515
+ } ;
516
+
517
+ return state . map ( ( entry ) => entry . viewerId === viewerId ? clone ( entry , updateViewer ( entry ) ) : entry ) ;
489
518
}
490
519
491
520
@@ -499,7 +528,13 @@ function removeItems(state,action) {
499
528
function deleteSingleItem ( state , itemId , containerType ) {
500
529
return state . map ( ( viewer ) => {
501
530
if ( viewer . containerType !== containerType || ! viewer . itemIdAry . includes ( itemId ) ) return viewer ;
502
- return clone ( viewer , { itemIdAry : without ( viewer . itemIdAry , itemId ) } ) ;
531
+ const v = clone ( viewer , { itemIdAry : without ( viewer . itemIdAry , itemId ) } ) ;
532
+
533
+ if ( has ( v , 'lastActiveItemId' ) && ( v . lastActiveItemId === itemId ) ) {
534
+ return clone ( v , { lastActiveItemId : get ( v , 'itemIdAry.0' , '' ) } ) ;
535
+ } else {
536
+ return v ;
537
+ }
503
538
} ) ;
504
539
}
505
540
@@ -525,5 +560,28 @@ function updateCustomData(state,action) {
525
560
return state . map ( ( entry ) => entry . viewerId === viewerId ? clone ( entry , { customData} ) : entry ) ;
526
561
}
527
562
563
+ function changeActiveItem ( state , payload , containerType ) {
564
+ var { plotId, viewerId} = payload ;
565
+
566
+ return state . map ( ( viewer ) => {
567
+ var isView = false ;
568
+
569
+ if ( ! has ( viewer , 'lastActiveItemId' ) ) return viewer ;
528
570
571
+ if ( viewerId ) { // plot image action case
572
+ if ( ( viewerId === viewer . viewerId ) && viewer . itemIdAry . includes ( plotId ) ) {
573
+ isView = true ;
574
+ }
575
+ } else { // change active plot action case
576
+ if ( ( viewer . containerType === containerType ) && ( viewer . itemIdAry . includes ( plotId ) ) ) {
577
+ isView = true ;
578
+ }
579
+ }
529
580
581
+ if ( isView ) {
582
+ return clone ( viewer , { lastActiveItemId : plotId } ) ;
583
+ } else {
584
+ return viewer ;
585
+ }
586
+ } ) ;
587
+ }
0 commit comments