Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(496)

Unified Diff: chrome/browser/resources/md_bookmarks/reducers.js

Issue 2722083002: [MD Bookmarks] Flatten sidebar. (Closed)
Patch Set: Created 3 years, 9 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: chrome/browser/resources/md_bookmarks/reducers.js
diff --git a/chrome/browser/resources/md_bookmarks/reducers.js b/chrome/browser/resources/md_bookmarks/reducers.js
index 209f9af1ef3daf2013157ba5d9a97ad69c63eed7..66f4e8a8683fd8976277abbaa24c3dd8dd14bcee 100644
--- a/chrome/browser/resources/md_bookmarks/reducers.js
+++ b/chrome/browser/resources/md_bookmarks/reducers.js
@@ -221,54 +221,126 @@ cr.define('bookmarks', function() {
}
};
- var ClosedFolderState = {};
+ var SidebarState = {};
/**
- * @param {ClosedFolderState} state
+ * Returns the modifications for |folders| needed to show or hide all nodes
+ * beneath |nodeId| that are not beneath a closed folder.
+ * @param {!Array<SidebarFolder>} folders
+ * @param {number} nodeIdx
+ * @param {boolean} open
+ * @return {!Array<SidebarFolder>}
+ */
+ SidebarState.updateVisibleFoldersBelowNode = function(
+ folders, nodeIdx, open) {
+ var node = Object.assign({}, folders[nodeIdx]);
+ node.open = open;
+
+ if (!node.visible)
+ return {};
+
+ var modifications = {};
+ var stack = [{node: node, showing: node.visible}];
+ for (var i = nodeIdx + 1; i < folders.length; i++) {
+ var n = folders[i];
+
+ // Pop off nodes deeper than the current node.
+ while (stack.length && n.depth <= stack[stack.length - 1].node.depth)
+ stack.pop();
+
+ if (!stack.length)
+ break;
+
+ var parent = stack[stack.length - 1];
+ var visible = parent.node.open && parent.showing;
+
+ // Add modification if desired visibility is not the current visibility.
+ if (visible != n.visible)
+ modifications[i] = Object.assign({}, n, {visible: visible});
+
+ // Add node to stack if it's deeper than the current node.
+ if (n.depth > parent.node.depth)
+ stack.push({node: n, showing: visible});
+ }
+
+ return modifications;
+ };
+
+ /**
+ * @param {SidebarState} state
+ * @param {Action} action
+ * @return {SidebarState}
+ */
+ SidebarState.changeFolderOpen = function(state, action) {
+ var newFolders = state.folders.slice();
+ var idx = state.folderMap[action.id];
+ var folder = newFolders[idx];
+ if (folder.open == action.open)
+ return state;
+
+ newFolders[idx] = /** @type {SidebarFolder} */ (
+ Object.assign({}, folder, {open: action.open}));
+ newFolders = /** @type {!Array<SidebarFolder>} */ (Object.assign(
+ newFolders,
+ this.updateVisibleFoldersBelowNode(state.folders, idx, action.open)));
+ return /** @type {SidebarState} */ (
+ Object.assign({}, state, {folders: newFolders}));
+ };
+
+ /**
+ * @param {SidebarState} state
* @param {Action} action
* @param {NodeList} nodes
- * @return {ClosedFolderState}
+ * @return {SidebarState}
*/
- ClosedFolderState.openAncestorsOf = function(state, action, nodes) {
+ SidebarState.openAncestorsOf = function(state, action, nodes) {
var id = action.id;
- var modifications = {};
- var parentId = nodes[id].parentId;
- while (parentId) {
- if (state[parentId]) {
- modifications[parentId] = false;
- }
- parentId = nodes[parentId].parentId;
+ var newState = state;
+ var parentId = nodes[id].parentId || '';
+ while (nodes[parentId] && nodes[parentId].parentId) {
+ newState = this.changeFolderOpen(
+ newState, bookmarks.actions.changeFolderOpen(parentId, true));
+ parentId = nodes[parentId].parentId || '';
}
- return Object.assign({}, state, modifications);
+ return newState;
};
/**
- * @param {ClosedFolderState} state
+ * @param {SidebarState} state
* @param {Action} action
- * @return {ClosedFolderState}
+ * @return {SidebarState}
*/
- ClosedFolderState.toggleFolderOpen = function(state, action) {
- var id = action.id;
- var closed = !action.open;
- var modification = {};
- modification[id] = closed;
+ SidebarState.removeBookmark = function(state, action) {
+ var newFolders = state.folders.slice();
- return Object.assign({}, state, modification);
+ for (var i = 0; i < newFolders.length; i++) {
+ if (action.id != newFolders[i].id)
+ continue;
+
+ newFolders.splice(i, 1);
+ }
+
+ return /** @type {SidebarState} */ (Object.assign({}, state, {
+ folders: newFolders,
+ folderMap: bookmarks.util.createFolderMap(newFolders),
+ }));
};
/**
- * @param {ClosedFolderState} state
+ * @param {SidebarState} state
* @param {Action} action
* @param {NodeList} nodes
- * @return {ClosedFolderState}
+ * @return {SidebarState}
*/
- ClosedFolderState.updateClosedFolders = function(state, action, nodes) {
+ SidebarState.updateSidebar = function(state, action, nodes) {
switch (action.name) {
+ case 'remove-bookmark':
+ return this.removeBookmark(state, action);
case 'change-folder-open':
- return ClosedFolderState.toggleFolderOpen(state, action);
+ return this.changeFolderOpen(state, action);
case 'select-folder':
- return ClosedFolderState.openAncestorsOf(state, action, nodes);
+ return this.openAncestorsOf(state, action, nodes);
default:
return state;
};
@@ -284,21 +356,20 @@ cr.define('bookmarks', function() {
function reduceAction(state, action) {
return {
nodes: NodeState.updateNodes(state.nodes, action),
+ search: SearchState.updateSearch(state.search, action),
selectedFolder: SelectedFolderState.updateSelectedFolder(
state.selectedFolder, action, state.nodes),
- closedFolders: ClosedFolderState.updateClosedFolders(
- state.closedFolders, action, state.nodes),
- search: SearchState.updateSearch(state.search, action),
selection: SelectionState.updateSelection(state.selection, action),
+ sidebar: SidebarState.updateSidebar(state.sidebar, action, state.nodes),
};
}
return {
reduceAction: reduceAction,
- ClosedFolderState: ClosedFolderState,
NodeState: NodeState,
SearchState: SearchState,
SelectedFolderState: SelectedFolderState,
SelectionState: SelectionState,
+ SidebarState: SidebarState,
};
});
« no previous file with comments | « chrome/browser/resources/md_bookmarks/folder_node.js ('k') | chrome/browser/resources/md_bookmarks/sidebar.html » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698