diff --git a/applications/desktop/__tests__/renderer/menu-spec.js b/applications/desktop/__tests__/renderer/menu-spec.js index 9484478b7d..dde64ddf42 100644 --- a/applications/desktop/__tests__/renderer/menu-spec.js +++ b/applications/desktop/__tests__/renderer/menu-spec.js @@ -261,21 +261,19 @@ describe("menu", () => { }); describe("dispatchUnhideAll", () => { - test("dispatches toggleCellInputVisibility for hidden code cells", () => { + test("", () => { const store = dummyStore({ hideAll: true }); store.dispatch = jest.fn(); menu.dispatchUnhideAll(store); - const first = store - .getState() - .document.getIn(["notebook", "cellOrder"]) - .first(); - const expectedAction = { - type: "TOGGLE_CELL_INPUT_VISIBILITY", - id: first - }; - expect(store.dispatch).toHaveBeenCalledWith(expectedAction); + expect(store.dispatch).toHaveBeenCalledWith({ + type: "UNHIDE_ALL", + payload: { + outputHidden: false, + inputHidden: false + } + }); }); }); diff --git a/applications/desktop/src/main/menu.js b/applications/desktop/src/main/menu.js index c148fdf043..8639589db2 100644 --- a/applications/desktop/src/main/menu.js +++ b/applications/desktop/src/main/menu.js @@ -497,7 +497,7 @@ export function loadFullMenu(store: * = global.store) { click: createSender("menu:clear-all") }, { - label: "Unhide All Outputs", + label: "Unhide Input and Output in all Cells", enabled: BrowserWindow.getAllWindows().length > 0, click: createSender("menu:unhide-all") } diff --git a/applications/desktop/src/notebook/menu.js b/applications/desktop/src/notebook/menu.js index e0116f1476..91bf703f65 100644 --- a/applications/desktop/src/notebook/menu.js +++ b/applications/desktop/src/notebook/menu.js @@ -160,10 +160,7 @@ export function dispatchClearAll(store: *) { } export function dispatchUnhideAll(store: *) { - const hiddenCellIds = selectors.currentHiddenCellIds(store.getState()); - hiddenCellIds.forEach(id => - store.dispatch(actions.toggleCellInputVisibility(id)) - ); + store.dispatch(actions.unhideAll()); } export function dispatchKillKernel(store: *) { diff --git a/packages/core/__tests__/actions-spec.js b/packages/core/__tests__/actions-spec.js index b95f1ce070..5dae20f5c3 100644 --- a/packages/core/__tests__/actions-spec.js +++ b/packages/core/__tests__/actions-spec.js @@ -21,6 +21,34 @@ describe("setLanguageInfo", () => { }); }); +describe("unhideAll", () => { + test("allows being called with sets defaults for outputHidden and inputHidden", () => { + expect(actions.unhideAll({ outputHidden: true })).toEqual({ + type: actionTypes.UNHIDE_ALL, + payload: { + outputHidden: true, + inputHidden: false + } + }); + + expect(actions.unhideAll({ inputHidden: true })).toEqual({ + type: actionTypes.UNHIDE_ALL, + payload: { + outputHidden: false, + inputHidden: true + } + }); + + expect(actions.unhideAll()).toEqual({ + type: actionTypes.UNHIDE_ALL, + payload: { + outputHidden: false, + inputHidden: false + } + }); + }); +}); + describe("commOpenAction", () => { test("creates a COMM_OPEN action", () => { const message = { diff --git a/packages/core/src/actionTypes.js b/packages/core/src/actionTypes.js index 2367ee1749..f822b545a9 100644 --- a/packages/core/src/actionTypes.js +++ b/packages/core/src/actionTypes.js @@ -159,6 +159,15 @@ export type UpdateDisplayAction = { } }; +export const UNHIDE_ALL = "UNHIDE_ALL"; +export type UnhideAll = { + type: "UNHIDE_ALL", + payload: { + inputHidden: boolean, + outputHidden: boolean + } +}; + export const TOGGLE_CELL_OUTPUT_VISIBILITY = "TOGGLE_CELL_OUTPUT_VISIBILITY"; export type ToggleCellOutputVisibilityAction = { type: "TOGGLE_CELL_OUTPUT_VISIBILITY", diff --git a/packages/core/src/actions.js b/packages/core/src/actions.js index 195c59b33e..45625d8ddf 100644 --- a/packages/core/src/actions.js +++ b/packages/core/src/actions.js @@ -30,6 +30,7 @@ import type { import type { Output, StreamOutput } from "@nteract/commutable/src/v4"; import type { + UnhideAll, RestartKernel, RestartKernelFailed, RestartKernelSuccessful, @@ -331,6 +332,18 @@ export function updateCellExecutionCount( return setInCell(id, ["execution_count"], count); } +export function unhideAll( + payload?: { outputHidden: boolean, inputHidden: boolean } = { + outputHidden: false, + inputHidden: false + } +): UnhideAll { + return { + type: "UNHIDE_ALL", + payload: { outputHidden: false, inputHidden: false, ...payload } + }; +} + export function toggleCellOutputVisibility( id: string ): ToggleCellOutputVisibilityAction { diff --git a/packages/core/src/reducers/document.js b/packages/core/src/reducers/document.js index 4f33e1111a..35dd200022 100644 --- a/packages/core/src/reducers/document.js +++ b/packages/core/src/reducers/document.js @@ -10,6 +10,7 @@ import * as actionTypes from "../actionTypes"; // TODO: With the new document plan, I think it starts to make sense to decouple // the document view actions and the underlying document format import type { + UnhideAll, RestartKernel, ClearAllOutputs, PasteCellAction, @@ -576,6 +577,21 @@ function toggleCellOutputVisibility( ); } +function unhideAll(state: DocumentRecord, action: UnhideAll) { + return state.updateIn(["notebook", "cellMap"], cellMap => + cellMap.map(cell => { + if (cell.get("cell_type") === "code") { + return cell.mergeIn(["metadata"], { + // TODO: Verify that we convert to one namespace for hidden input/output + outputHidden: action.payload.outputHidden, + inputHidden: action.payload.inputHidden + }); + } + return cell; + }) + ); +} + function toggleCellInputVisibility( state: DocumentRecord, action: ToggleCellInputVisibilityAction @@ -586,6 +602,7 @@ function toggleCellInputVisibility( !state.getIn(["notebook", "cellMap", id, "metadata", "inputHidden"]) ); } + function updateCellStatus( state: DocumentRecord, action: UpdateCellStatusAction @@ -824,6 +841,8 @@ function handleDocument( return changeCellType(state, action); case actionTypes.TOGGLE_OUTPUT_EXPANSION: return toggleOutputExpansion(state, action); + case actionTypes.UNHIDE_ALL: + return unhideAll(state, action); case actionTypes.CHANGE_FILENAME: return changeFilename(state, action); default: