| // Copyright 2017 The Chromium Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| import 'chrome://resources/polymer/v3_0/iron-location/iron-location.js'; |
| import 'chrome://resources/polymer/v3_0/iron-location/iron-query-params.js'; |
| |
| import {html, Polymer} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js'; |
| |
| import {selectFolder, setSearchTerm} from './actions.js'; |
| import {BOOKMARKS_BAR_ID} from './constants.js'; |
| import {StoreClient} from './store_client.js'; |
| |
| Polymer({ |
| /** |
| * This element is a one way bound interface that routes the page URL to |
| * the searchTerm and selectedId. Clients must initialize themselves by |
| * reading the router's fields after attach. |
| */ |
| is: 'bookmarks-router', |
| |
| _template: html`{__html_template__}`, |
| |
| behaviors: [ |
| StoreClient, |
| ], |
| |
| properties: { |
| /** |
| * Parameter q is routed to the searchTerm. |
| * Parameter id is routed to the selectedId. |
| * @private |
| */ |
| queryParams_: Object, |
| |
| /** @private {string} */ |
| query_: { |
| type: String, |
| observer: 'onQueryChanged_', |
| }, |
| |
| /** @private {string} */ |
| urlQuery_: { |
| type: String, |
| observer: 'onUrlQueryChanged_', |
| }, |
| |
| /** @private */ |
| searchTerm_: { |
| type: String, |
| value: '', |
| }, |
| |
| /** @private {?string} */ |
| selectedId_: String, |
| }, |
| |
| observers: [ |
| 'onQueryParamsChanged_(queryParams_)', |
| 'onStateChanged_(searchTerm_, selectedId_)', |
| ], |
| |
| attached() { |
| this.watch('selectedId_', function(state) { |
| return state.selectedFolder; |
| }); |
| this.watch('searchTerm_', function(state) { |
| return state.search.term; |
| }); |
| this.updateFromStore(); |
| }, |
| |
| /** @private */ |
| onQueryParamsChanged_() { |
| const searchTerm = this.queryParams_.q || ''; |
| let selectedId = this.queryParams_.id; |
| if (!selectedId && !searchTerm) { |
| selectedId = BOOKMARKS_BAR_ID; |
| } |
| |
| if (searchTerm !== this.searchTerm_) { |
| this.searchTerm_ = searchTerm; |
| this.dispatch(setSearchTerm(searchTerm)); |
| } |
| |
| if (selectedId && selectedId !== this.selectedId_) { |
| this.selectedId_ = selectedId; |
| // Need to dispatch a deferred action so that during page load |
| // `this.getState()` will only evaluate after the Store is initialized. |
| this.dispatchAsync((dispatch) => { |
| dispatch(selectFolder(selectedId, this.getState().nodes)); |
| }); |
| } |
| }, |
| |
| /** |
| * @param {?string} current Current value of the query. |
| * @param {?string} previous Previous value of the query. |
| * @private |
| */ |
| onQueryChanged_(current, previous) { |
| if (previous !== undefined) { |
| this.urlQuery_ = this.query_; |
| } |
| }, |
| |
| /** @private */ |
| onUrlQueryChanged_() { |
| this.query_ = this.urlQuery_; |
| }, |
| |
| /** @private */ |
| onStateChanged_() { |
| this.debounce('updateQueryParams', this.updateQueryParams_.bind(this)); |
| }, |
| |
| /** @private */ |
| updateQueryParams_() { |
| if (this.searchTerm_) { |
| this.queryParams_ = {q: this.searchTerm_}; |
| } else if (this.selectedId_ !== BOOKMARKS_BAR_ID) { |
| this.queryParams_ = {id: this.selectedId_}; |
| } else { |
| this.queryParams_ = {}; |
| } |
| }, |
| }); |