diff --git a/client/app/scripts/reducers/__tests__/root-test.js b/client/app/scripts/reducers/__tests__/root-test.js index 4bb3d1a68c..991c366c18 100644 --- a/client/app/scripts/reducers/__tests__/root-test.js +++ b/client/app/scripts/reducers/__tests__/root-test.js @@ -280,6 +280,25 @@ describe('RootReducer', () => { }] }; + const ReceiveTopologiesHiddenAction = { + type: ActionTypes.RECEIVE_TOPOLOGIES, + topologies: [{ + url: '/topo1', + name: 'Topo1', + stats: { + node_count: 1 + } + }, { + hide_if_empty: true, + url: '/topo2', + name: 'Topo2', + stats: { + node_count: 0, + filtered_nodes: 0 + } + }] + }; + const RouteAction = { type: ActionTypes.ROUTE_TOPOLOGY, state: {} @@ -567,6 +586,21 @@ describe('RootReducer', () => { expect(isTopologyNodeCountZero(nextState)).toBeFalsy(); }); + it('keeps hidden topology visible if selected', () => { + let nextState = initialState; + nextState = reducer(nextState, ClickTopology2Action); + nextState = reducer(nextState, ReceiveTopologiesHiddenAction); + expect(nextState.get('currentTopologyId')).toEqual('topo2'); + expect(nextState.get('topologies').toJS().length).toEqual(2); + }); + + it('keeps hidden topology hidden if not selected', () => { + let nextState = initialState; + nextState = reducer(nextState, ClickTopologyAction); + nextState = reducer(nextState, ReceiveTopologiesHiddenAction); + expect(nextState.get('topologies').toJS().length).toEqual(1); + }); + // selection of relatives it('keeps relatives as a stack', () => { diff --git a/client/app/scripts/reducers/root.js b/client/app/scripts/reducers/root.js index 81e6b60075..849157bb52 100644 --- a/client/app/scripts/reducers/root.js +++ b/client/app/scripts/reducers/root.js @@ -110,17 +110,17 @@ function calcSelectType(topology) { // adds ID field to topology (based on last part of URL path) and save urls in // map for easy lookup function processTopologies(state, nextTopologies) { + // add IDs to topology objects in-place + const topologiesWithId = updateTopologyIds(nextTopologies); // filter out hidden topos - const visibleTopologies = filterHiddenTopologies(nextTopologies); + const visibleTopologies = filterHiddenTopologies(topologiesWithId, state.get('currentTopologyId')); // set `selectType` field for topology and sub_topologies options (recursive). const topologiesWithSelectType = visibleTopologies.map(calcSelectType); - // add IDs to topology objects in-place - const topologiesWithId = updateTopologyIds(topologiesWithSelectType); // cache URLs by ID state = state.set('topologyUrlsById', - setTopologyUrlsById(state.get('topologyUrlsById'), topologiesWithId)); + setTopologyUrlsById(state.get('topologyUrlsById'), topologiesWithSelectType)); - const topologiesWithFullnames = addTopologyFullname(topologiesWithId); + const topologiesWithFullnames = addTopologyFullname(topologiesWithSelectType); const immNextTopologies = fromJS(topologiesWithFullnames).sortBy(topologySorter); return state.set('topologies', immNextTopologies); } diff --git a/client/app/scripts/utils/topology-utils.js b/client/app/scripts/utils/topology-utils.js index efce0f6d12..fc2ba4d299 100644 --- a/client/app/scripts/utils/topology-utils.js +++ b/client/app/scripts/utils/topology-utils.js @@ -126,9 +126,9 @@ export function setTopologyUrlsById(topologyUrlsById, topologies) { return urlMap; } -export function filterHiddenTopologies(topologies) { +export function filterHiddenTopologies(topologies, currentTopologyId) { return topologies.filter(t => (!t.hide_if_empty || t.stats.node_count > 0 || - t.stats.filtered_nodes > 0)); + t.stats.filtered_nodes > 0 || t.id === currentTopologyId)); } export function getCurrentTopologyOptions(state) {