| <!-- |
| Copyright (C) 2015 The Android Open Source Project |
| |
| Licensed under the Apache License, Version 2.0 (the "License"); |
| you may not use this file except in compliance with the License. |
| You may obtain a copy of the License at |
| |
| http://www.apache.org/licenses/LICENSE-2.0 |
| |
| Unless required by applicable law or agreed to in writing, software |
| distributed under the License is distributed on an "AS IS" BASIS, |
| WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| See the License for the specific language governing permissions and |
| limitations under the License. |
| --> |
| |
| <link rel="import" href="../bower_components/polymer/polymer.html"> |
| <link rel="import" href="../behaviors/rest-client-behavior.html"> |
| <link rel="import" href="gr-ajax.html"> |
| <link rel="import" href="gr-change-list.html"> |
| |
| <dom-module id="gr-change-list-view"> |
| <template> |
| <style> |
| :host { |
| background-color: var(--view-background-color); |
| display: block; |
| margin: 0 1.25rem; |
| } |
| .loading { |
| margin-top: 1em; |
| color: #666; |
| background-color: #f1f2f3; |
| } |
| gr-change-list { |
| margin-top: 1em; |
| width: 100%; |
| } |
| nav { |
| margin-bottom: 1em; |
| padding: .5em 0; |
| text-align: center; |
| } |
| nav a { |
| display: inline-block; |
| } |
| nav a:first-of-type { |
| margin-right: .5em; |
| } |
| [hidden] { |
| display: none !important; |
| } |
| </style> |
| <gr-ajax |
| auto |
| url="/changes/" |
| params="[[_computeQueryParams(_query, _offset)]]" |
| last-response="{{_changes}}" |
| loading="{{_loading}}"></gr-ajax> |
| <div class="loading" hidden$="[[!_loading]]">Loading...</div> |
| <div hidden$="[[_loading]]" hidden> |
| <gr-change-list |
| changes="{{_changes}}" |
| selected-index="{{viewState.selectedChangeIndex}}" |
| show-star="[[loggedIn]]"></gr-change-list> |
| <nav> |
| <a href$="[[_computeNavLink(_query, _offset, -1)]]" |
| hidden$="[[_hidePrevArrow(_offset)]]">← Prev</a> |
| <a href$="[[_computeNavLink(_query, _offset, 1)]]" |
| hidden$="[[_hideNextArrow(_changes.length)]]">Next →</a> |
| </nav> |
| </div> |
| </template> |
| <script> |
| (function() { |
| 'use strict'; |
| |
| var DEFAULT_NUM_CHANGES = 25; |
| |
| Polymer({ |
| is: 'gr-change-list-view', |
| |
| /** |
| * Fired when the title of the page should change. |
| * |
| * @event title-change |
| */ |
| |
| properties: { |
| /** |
| * URL params passed from the router. |
| */ |
| params: { |
| type: Object, |
| observer: '_paramsChanged', |
| }, |
| |
| /** |
| * True when user is logged in. |
| */ |
| loggedIn: { |
| type: Boolean, |
| value: false, |
| }, |
| |
| /** |
| * State persisted across restamps of the element. |
| */ |
| viewState: { |
| type: Object, |
| notify: true, |
| value: function() { return {}; }, |
| }, |
| |
| /** |
| * Currently active query. |
| */ |
| _query: String, |
| |
| /** |
| * Offset of currently visible query results. |
| */ |
| _offset: Number, |
| |
| /** |
| * Change objects loaded from the server. |
| */ |
| _changes: Array, |
| |
| /** |
| * For showing a "loading..." string during ajax requests. |
| */ |
| _loading: { |
| type: Boolean, |
| value: true, |
| }, |
| }, |
| |
| behaviors: [ |
| Gerrit.RESTClientBehavior, |
| ], |
| |
| attached: function() { |
| this.fire('title-change', {title: this._query}); |
| }, |
| |
| _paramsChanged: function(value) { |
| if (value.view != this.tagName.toLowerCase()) { return; } |
| |
| this._query = value.query; |
| this._offset = value.offset || 0; |
| if (this.viewState.query != this._query || |
| this.viewState.offset != this._offset) { |
| this.set('viewState.selectedChangeIndex', 0); |
| this.set('viewState.query', this._query); |
| this.set('viewState.offset', this._offset); |
| } |
| |
| this.fire('title-change', {title: this._query}); |
| }, |
| |
| _computeQueryParams: function(query, offset) { |
| var options = this.listChangesOptionsToHex( |
| this.ListChangesOption.LABELS, |
| this.ListChangesOption.DETAILED_ACCOUNTS |
| ); |
| var obj = { |
| n: DEFAULT_NUM_CHANGES, // Number of results to return. |
| O: options, |
| S: offset || 0, |
| }; |
| if (query && query.length > 0) { |
| obj.q = query; |
| } |
| return obj; |
| }, |
| |
| _computeNavLink: function(query, offset, direction) { |
| // Offset could be a string when passed from the router. |
| offset = +(offset || 0); |
| var newOffset = Math.max(0, offset + (25 * direction)); |
| var href = '/q/' + query; |
| if (newOffset > 0) { |
| href += ',' + newOffset; |
| } |
| return href; |
| }, |
| |
| _hidePrevArrow: function(offset) { |
| return offset == 0; |
| }, |
| |
| _hideNextArrow: function(changesLen) { |
| return changesLen < DEFAULT_NUM_CHANGES; |
| }, |
| |
| }); |
| })(); |
| </script> |
| </dom-module> |