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

Side by Side Diff: chrome/browser/resources/md_bookmarks/store.js

Issue 2675503002: [MD Bookmarks] Remove Multiple Selected Items. (Closed)
Patch Set: add test Created 3 years, 10 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 unified diff | Download patch
OLDNEW
1 // Copyright 2016 The Chromium Authors. All rights reserved. 1 // Copyright 2016 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 var BookmarksStore = Polymer({ 5 var BookmarksStore = Polymer({
6 is: 'bookmarks-store', 6 is: 'bookmarks-store',
7 7
8 properties: { 8 properties: {
9 /** @type {BookmarkTreeNode} */ 9 /** @type {BookmarkTreeNode} */
10 rootNode: { 10 rootNode: {
(...skipping 27 matching lines...) Expand all
38 }, 38 },
39 39
40 /** @type {Object<?string, !BookmarkTreeNode>} */ 40 /** @type {Object<?string, !BookmarkTreeNode>} */
41 idToNodeMap_: Object, 41 idToNodeMap_: Object,
42 42
43 /** @type {?number} */ 43 /** @type {?number} */
44 anchorIndex_: Number, 44 anchorIndex_: Number,
45 45
46 /** @type {Set<string>} */ 46 /** @type {Set<string>} */
47 searchResultSet_: Object, 47 searchResultSet_: Object,
48
49 /** @type {Set<string>} */
50 selectedItemSet_: Object,
48 }, 51 },
49 52
50 /** @private {Object} */ 53 /** @private {Object} */
51 documentListeners_: null, 54 documentListeners_: null,
52 55
53 /** @override */ 56 /** @override */
54 attached: function() { 57 attached: function() {
55 this.documentListeners_ = { 58 this.documentListeners_ = {
56 'folder-open-changed': this.onFolderOpenChanged_.bind(this), 59 'folder-open-changed': this.onFolderOpenChanged_.bind(this),
60 'remove-item': this.onItemRemoved_.bind(this),
57 'search-term-changed': this.onSearchTermChanged_.bind(this), 61 'search-term-changed': this.onSearchTermChanged_.bind(this),
58 'select-item': this.onItemSelected_.bind(this), 62 'select-item': this.onItemSelected_.bind(this),
59 'selected-folder-changed': this.onSelectedFolderChanged_.bind(this), 63 'selected-folder-changed': this.onSelectedFolderChanged_.bind(this),
60 }; 64 };
61 for (var event in this.documentListeners_) 65 for (var event in this.documentListeners_)
62 document.addEventListener(event, this.documentListeners_[event]); 66 document.addEventListener(event, this.documentListeners_[event]);
63 }, 67 },
64 68
65 /** @override */ 69 /** @override */
66 detached: function() { 70 detached: function() {
(...skipping 18 matching lines...) Expand all
85 // bookmarks-store, private: 89 // bookmarks-store, private:
86 90
87 /** 91 /**
88 * @param {BookmarkTreeNode} rootNode 92 * @param {BookmarkTreeNode} rootNode
89 * @private 93 * @private
90 */ 94 */
91 setupStore_: function(rootNode) { 95 setupStore_: function(rootNode) {
92 this.rootNode = rootNode; 96 this.rootNode = rootNode;
93 this.idToNodeMap_ = {}; 97 this.idToNodeMap_ = {};
94 this.rootNode.path = 'rootNode'; 98 this.rootNode.path = 'rootNode';
99 this.selectedItemSet_ = new Set();
95 BookmarksStore.generatePaths(rootNode, 0); 100 BookmarksStore.generatePaths(rootNode, 0);
96 BookmarksStore.initNodes(this.rootNode, this.idToNodeMap_); 101 BookmarksStore.initNodes(this.rootNode, this.idToNodeMap_);
97 102
98 // Initialize the store's fields from the router. 103 // Initialize the store's fields from the router.
99 if (this.$.router.searchTerm) 104 if (this.$.router.searchTerm)
100 this.searchTerm = this.$.router.searchTerm; 105 this.searchTerm = this.$.router.searchTerm;
101 else 106 else
102 this.fire('selected-folder-changed', this.$.router.selectedId); 107 this.fire('selected-folder-changed', this.$.router.selectedId);
103 }, 108 },
104 109
(...skipping 75 matching lines...) Expand 10 before | Expand all | Expand 10 after
180 }, 185 },
181 186
182 /** 187 /**
183 * Remove all selected items in the list. 188 * Remove all selected items in the list.
184 * @private 189 * @private
185 */ 190 */
186 clearSelectedItems_: function() { 191 clearSelectedItems_: function() {
187 if (!this.displayedList) 192 if (!this.displayedList)
188 return; 193 return;
189 194
195 this.selectedItemSet_.clear();
196
190 for (var i = 0; i < this.displayedList.length; i++) { 197 for (var i = 0; i < this.displayedList.length; i++) {
191 if (!this.displayedList[i].isSelectedItem) 198 if (!this.displayedList[i].isSelectedItem)
192 continue; 199 continue;
193 200
194 this.set('displayedList.#' + i + '.isSelectedItem', false); 201 this.set('displayedList.#' + i + '.isSelectedItem', false);
195 } 202 }
196 }, 203 },
197 204
198 /** 205 /**
199 * Return the index in the search result of an item. 206 * Return the index in the search result of an item.
(...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after
245 this.anchorIndex_ = this.getIndexInList_(item); 252 this.anchorIndex_ = this.getIndexInList_(item);
246 startIndex = this.anchorIndex_; 253 startIndex = this.anchorIndex_;
247 endIndex = this.anchorIndex_; 254 endIndex = this.anchorIndex_;
248 } else { 255 } else {
249 var selectedIndex = this.getIndexInList_(item); 256 var selectedIndex = this.getIndexInList_(item);
250 startIndex = Math.min(this.anchorIndex_, selectedIndex); 257 startIndex = Math.min(this.anchorIndex_, selectedIndex);
251 endIndex = Math.max(this.anchorIndex_, selectedIndex); 258 endIndex = Math.max(this.anchorIndex_, selectedIndex);
252 } 259 }
253 for (var i = startIndex; i <= endIndex; i++) { 260 for (var i = startIndex; i <= endIndex; i++) {
254 this.set('displayedList.#' + i + '.isSelectedItem', true); 261 this.set('displayedList.#' + i + '.isSelectedItem', true);
262 this.selectedItemSet_.add(this.displayedList[i]);
255 } 263 }
256 }, 264 },
257 265
258 /** 266 /**
259 * Selects a single item in the displayedList. 267 * Selects a single item in the displayedList.
260 * @param {BookmarkTreeNode} item 268 * @param {BookmarkTreeNode} item
261 * @private 269 * @private
262 */ 270 */
263 selectItem_: function(item) { 271 selectItem_: function(item) {
264 this.anchorIndex_ = this.getIndexInList_(item); 272 this.anchorIndex_ = this.getIndexInList_(item);
265 this.set('displayedList.#' + this.anchorIndex_ + '.isSelectedItem', true); 273 this.set('displayedList.#' + this.anchorIndex_ + '.isSelectedItem', true);
274 this.selectedItemSet_.add(this.displayedList[this.anchorIndex_]);
275 },
276
277 /**
278 * @param {BookmarkTreeNode} item
279 * @private
280 */
281 removeSingleItem_: function(item) {
282 if (item.url) {
283 chrome.bookmarks.remove(item.id, function() {
284 // TODO(jiaxi): Add toast later.
285 }.bind(this));
286 } else {
287 chrome.bookmarks.removeTree(item.id, function() {
288 // TODO(jiaxi): Add toast later.
289 }.bind(this));
290 }
266 }, 291 },
267 292
268 ////////////////////////////////////////////////////////////////////////////// 293 //////////////////////////////////////////////////////////////////////////////
269 // bookmarks-store, bookmarks API event listeners: 294 // bookmarks-store, bookmarks API event listeners:
270 295
271 /** 296 /**
272 * Callback for when a bookmark node is removed. 297 * Callback for when a bookmark node is removed.
273 * If a folder is selected or is an ancestor of a selected folder, the parent 298 * If a folder is selected or is an ancestor of a selected folder, the parent
274 * of the removed folder will be selected. 299 * of the removed folder will be selected.
275 * @param {string} id The id of the removed bookmark node. 300 * @param {string} id The id of the removed bookmark node.
(...skipping 119 matching lines...) Expand 10 before | Expand all | Expand 10 after
395 */ 420 */
396 onItemSelected_: function(e) { 421 onItemSelected_: function(e) {
397 if (!e.detail.add) 422 if (!e.detail.add)
398 this.clearSelectedItems_(); 423 this.clearSelectedItems_();
399 424
400 if (e.detail.range) 425 if (e.detail.range)
401 this.selectRange_(e.detail.item); 426 this.selectRange_(e.detail.item);
402 else 427 else
403 this.selectItem_(e.detail.item); 428 this.selectItem_(e.detail.item);
404 }, 429 },
430
431 /**
432 * @param {CustomEvent} e
433 * @private
434 */
435 onItemRemoved_: function(e) {
436 var item = /** BookmarkTreeNode */ (e.detail);
437 if (this.selectedItemSet_.size == 1 || !item.isSelectedItem) {
438 this.removeSingleItem_(item);
439 } else {
440 for (let item of this.selectedItemSet_)
441 this.removeSingleItem_(item);
442 }
443 },
405 }); 444 });
406 445
407 //////////////////////////////////////////////////////////////////////////////// 446 ////////////////////////////////////////////////////////////////////////////////
408 // bookmarks-store, static methods: 447 // bookmarks-store, static methods:
409 448
410 /** 449 /**
411 * Stores the path from the store to a node inside the node. 450 * Stores the path from the store to a node inside the node.
412 * @param {BookmarkTreeNode} bookmarkNode 451 * @param {BookmarkTreeNode} bookmarkNode
413 * @param {number} startIndex 452 * @param {number} startIndex
414 */ 453 */
(...skipping 21 matching lines...) Expand all
436 idToNodeMap[bookmarkNode.id] = bookmarkNode; 475 idToNodeMap[bookmarkNode.id] = bookmarkNode;
437 476
438 if (bookmarkNode.url) 477 if (bookmarkNode.url)
439 return; 478 return;
440 479
441 bookmarkNode.isSelectedFolder = false; 480 bookmarkNode.isSelectedFolder = false;
442 bookmarkNode.isOpen = true; 481 bookmarkNode.isOpen = true;
443 for (var i = 0; i < bookmarkNode.children.length; i++) 482 for (var i = 0; i < bookmarkNode.children.length; i++)
444 BookmarksStore.initNodes(bookmarkNode.children[i], idToNodeMap); 483 BookmarksStore.initNodes(bookmarkNode.children[i], idToNodeMap);
445 }; 484 };
OLDNEW
« no previous file with comments | « chrome/browser/resources/md_bookmarks/list.js ('k') | chrome/test/data/webui/md_bookmarks/store_test.js » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698