Refactor layout .show/.isShown to handle branch nodes

This commit is contained in:
Josh Ponelat
2017-10-18 13:07:38 +02:00
parent f1f29aa7e1
commit f6b86d2d33
3 changed files with 11 additions and 20 deletions

View File

@@ -37,17 +37,3 @@ export function changeMode(thing, mode="") {
payload: {thing, mode} payload: {thing, mode}
} }
} }
// export function onlyShow(thing, shown=true) {
// thing = normalizeArray(thing)
// if(thing.length < 2)
// throw new Error("layoutActions.onlyShow only works, when `thing` is an array with length > 1")
// return {
// type: ONLY_SHOW,
// payload: {thing, shown}
// }
// }

View File

@@ -1,3 +1,4 @@
import { fromJS } from "immutable"
import { import {
UPDATE_LAYOUT, UPDATE_LAYOUT,
UPDATE_FILTER, UPDATE_FILTER,
@@ -12,9 +13,14 @@ export default {
[UPDATE_FILTER]: (state, action) => state.set("filter", action.payload), [UPDATE_FILTER]: (state, action) => state.set("filter", action.payload),
[SHOW]: (state, action) => { [SHOW]: (state, action) => {
let thing = action.payload.thing const isShown = action.payload.shown
let shown = action.payload.shown // This is one way to serialize an array, another (preferred) is to convert to json-pointer
return state.setIn(["shown"].concat(thing), shown) // TODO: use json-pointer serilization instead of fromJS(...), for performance
const thingToShow = fromJS(action.payload.thing)
// This is a map of paths to bools
// eg: [one, two] => true
// eg: [one] => false
return state.update("shown", fromJS({}), a => a.set(thingToShow, isShown))
}, },
[UPDATE_MODE]: (state, action) => { [UPDATE_MODE]: (state, action) => {
@@ -24,4 +30,3 @@ export default {
} }
} }

View File

@@ -1,5 +1,6 @@
import { createSelector } from "reselect" import { createSelector } from "reselect"
import { normalizeArray } from "core/utils" import { normalizeArray } from "core/utils"
import { fromJS } from "immutable"
const state = state => state const state = state => state
@@ -9,7 +10,7 @@ export const currentFilter = state => state.get("filter")
export const isShown = (state, thing, def) => { export const isShown = (state, thing, def) => {
thing = normalizeArray(thing) thing = normalizeArray(thing)
return Boolean(state.getIn(["shown", ...thing], def)) return state.get("shown", fromJS({})).get(fromJS(thing), def)
} }
export const whatMode = (state, thing, def="") => { export const whatMode = (state, thing, def="") => {
@@ -21,4 +22,3 @@ export const showSummary = createSelector(
state, state,
state => !isShown(state, "editor") state => !isShown(state, "editor")
) )