| 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 901203cd1609bdc9d807cbc6942e20b65c75b8f9..06eb94f0adbd863ef1b9799c36f5a094e8fe7c81 100644
|
| --- a/chrome/browser/resources/md_bookmarks/reducers.js
|
| +++ b/chrome/browser/resources/md_bookmarks/reducers.js
|
| @@ -164,12 +164,46 @@ cr.define('bookmarks', function() {
|
| * @param {Action} action
|
| * @return {NodeList}
|
| */
|
| + NodeState.moveBookmark = function(nodes, action) {
|
| + var nodeModifications = {};
|
| + var id = action.id;
|
| +
|
| + // Change node's parent.
|
| + nodeModifications[id] =
|
| + Object.assign({}, nodes[id], {parentId: action.parentId});
|
| +
|
| + // Remove from old parent.
|
| + var oldParentId = action.oldParentId;
|
| + var oldParentChildren = nodes[oldParentId].children.slice();
|
| + oldParentChildren.splice(action.oldIndex, 1);
|
| + nodeModifications[oldParentId] =
|
| + Object.assign({}, nodes[oldParentId], {children: oldParentChildren});
|
| +
|
| + // Add to new parent.
|
| + var parentId = action.parentId;
|
| + var parentChildren = oldParentId == parentId ?
|
| + oldParentChildren :
|
| + nodes[parentId].children.slice();
|
| + parentChildren.splice(action.index, 0, action.id);
|
| + nodeModifications[parentId] =
|
| + Object.assign({}, nodes[parentId], {children: parentChildren});
|
| +
|
| + return Object.assign({}, nodes, nodeModifications);
|
| + };
|
| +
|
| + /**
|
| + * @param {NodeList} nodes
|
| + * @param {Action} action
|
| + * @return {NodeList}
|
| + */
|
| NodeState.updateNodes = function(nodes, action) {
|
| switch (action.name) {
|
| case 'edit-bookmark':
|
| return NodeState.editBookmark(nodes, action);
|
| case 'remove-bookmark':
|
| return NodeState.removeBookmark(nodes, action);
|
| + case 'move-bookmark':
|
| + return NodeState.moveBookmark(nodes, action);
|
| case 'refresh-nodes':
|
| return action.nodes;
|
| default:
|
| @@ -232,19 +266,19 @@ cr.define('bookmarks', function() {
|
|
|
| /**
|
| * @param {ClosedFolderState} closedFolders
|
| - * @param {Action} action
|
| + * @param {string|undefined} id
|
| * @param {NodeList} nodes
|
| * @return {ClosedFolderState}
|
| */
|
| - ClosedFolderState.openAncestorsOf = function(closedFolders, action, nodes) {
|
| - var id = action.id;
|
| + ClosedFolderState.openFolderAndAncestors = function(
|
| + closedFolders, id, nodes) {
|
| var modifications = {};
|
| - var parentId = nodes[id].parentId;
|
| - while (parentId) {
|
| - if (closedFolders[parentId]) {
|
| - modifications[parentId] = false;
|
| + var currentId = id;
|
| + while (currentId) {
|
| + if (closedFolders[currentId]) {
|
| + modifications[currentId] = false;
|
| }
|
| - parentId = nodes[parentId].parentId;
|
| + currentId = nodes[currentId].parentId;
|
| }
|
|
|
| return Object.assign({}, closedFolders, modifications);
|
| @@ -275,7 +309,14 @@ cr.define('bookmarks', function() {
|
| case 'change-folder-open':
|
| return ClosedFolderState.changeFolderOpen(closedFolders, action);
|
| case 'select-folder':
|
| - return ClosedFolderState.openAncestorsOf(closedFolders, action, nodes);
|
| + return ClosedFolderState.openFolderAndAncestors(
|
| + closedFolders, nodes[action.id].parentId, nodes);
|
| + case 'move-bookmark':
|
| + if (!nodes[action.id].children)
|
| + return closedFolders;
|
| +
|
| + return ClosedFolderState.openFolderAndAncestors(
|
| + closedFolders, action.parentId, nodes);
|
| default:
|
| return closedFolders;
|
| };
|
|
|