| <!-- |
| Copyright (C) 2016 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="../bower_components/iron-input/iron-input.html"> |
| <link rel="import" href="../behaviors/rest-client-behavior.html"> |
| <link rel="import" href="gr-button.html"> |
| |
| <dom-module id="gr-download-dialog"> |
| <template> |
| <style> |
| :host { |
| display: block; |
| padding: 1em; |
| } |
| ul { |
| list-style: none; |
| margin-bottom: .5em; |
| } |
| li { |
| display: inline-block; |
| margin: 0; |
| padding: 0; |
| } |
| li gr-button { |
| margin-right: 1em; |
| } |
| label, |
| input { |
| display: block; |
| } |
| label { |
| font-weight: bold; |
| } |
| input { |
| font-family: var(--monospace-font-family); |
| font-size: inherit; |
| margin-bottom: .5em; |
| width: 60em; |
| } |
| li[selected] gr-button { |
| color: #000; |
| font-weight: bold; |
| text-decoration: none; |
| } |
| header { |
| display: flex; |
| justify-content: space-between; |
| } |
| main { |
| border-bottom: 1px solid #ddd; |
| border-top: 1px solid #ddd; |
| padding: .5em; |
| } |
| footer { |
| display: flex; |
| justify-content: space-between; |
| padding-top: .75em; |
| } |
| .closeButtonContainer { |
| display: flex; |
| flex: 1; |
| justify-content: flex-end; |
| } |
| .patchFiles { |
| margin-right: 2em; |
| } |
| .patchFiles a, |
| .archives a { |
| display: inline-block; |
| margin-right: 1em; |
| } |
| .patchFiles a:last-of-type, |
| .archives a:last-of-type { |
| margin-right: 0; |
| } |
| </style> |
| <header> |
| <ul hidden$="[[!_schemes.length]]" hidden> |
| <template is="dom-repeat" items="[[_schemes]]" as="scheme"> |
| <li selected$="[[_computeSchemeSelected(scheme, _selectedScheme)]]"> |
| <gr-button link data-scheme$="[[scheme]]" on-tap="_handleSchemeTap"> |
| [[scheme]] |
| </gr-button> |
| </li> |
| </template> |
| </ul> |
| <span class="closeButtonContainer"> |
| <gr-button link on-tap="_handleCloseTap">Close</gr-button> |
| </span> |
| </header> |
| <main hidden$="[[!_schemes.length]]" hidden> |
| <template is="dom-repeat" |
| items="[[_computeDownloadCommands(change, patchNum, _selectedScheme)]]" |
| as="command"> |
| <div class="command"> |
| <label>[[command.title]]</label> |
| <input is="iron-input" |
| type="text" |
| bind-value="[[command.command]]" |
| on-tap="_handleInputTap" |
| readonly> |
| </div> |
| </template> |
| </main> |
| <footer> |
| <div class="patchFiles"> |
| <label>Patch file</label> |
| <div> |
| <a href$="[[_computeDownloadLink(change, patchNum)]]"> |
| [[_computeDownloadFilename(change, patchNum)]] |
| </a> |
| <a href$="[[_computeZipDownloadLink(change, patchNum)]]"> |
| [[_computeZipDownloadFilename(change, patchNum)]] |
| </a> |
| </div> |
| </div> |
| <div class="archivesContainer" hidden$="[[!config.archives.length]]" hidden> |
| <label>Archive</label> |
| <div class="archives"> |
| <template is="dom-repeat" items="[[config.archives]]" as="format"> |
| <a href$="[[_computeArchiveDownloadLink(change, patchNum, format)]]"> |
| [[format]] |
| </a> |
| </template> |
| </div> |
| </div> |
| </footer> |
| </template> |
| <script> |
| (function() { |
| 'use strict'; |
| |
| Polymer({ |
| is: 'gr-download-dialog', |
| |
| /** |
| * Fired when the user presses the close button. |
| * |
| * @event close |
| */ |
| |
| properties: { |
| change: Object, |
| patchNum: String, |
| config: Object, |
| |
| _schemes: { |
| type: Array, |
| value: function() { return []; }, |
| computed: '_computeSchemes(change, patchNum)', |
| observer: '_schemesChanged', |
| }, |
| _selectedScheme: String, |
| }, |
| |
| hostAttributes: { |
| role: 'dialog', |
| }, |
| |
| behaviors: [ |
| Gerrit.RESTClientBehavior, |
| ], |
| |
| _computeDownloadCommands: function(change, patchNum, _selectedScheme) { |
| var commandObj; |
| for (var rev in change.revisions) { |
| if (change.revisions[rev]._number == patchNum) { |
| commandObj = change.revisions[rev].fetch[_selectedScheme].commands; |
| break; |
| } |
| } |
| var commands = []; |
| for (var title in commandObj) { |
| commands.push({ |
| title: title, |
| command: commandObj[title], |
| }); |
| } |
| return commands; |
| }, |
| |
| _computeZipDownloadLink: function(change, patchNum) { |
| return this._computeDownloadLink(change, patchNum, true); |
| }, |
| |
| _computeZipDownloadFilename: function(change, patchNum) { |
| return this._computeDownloadFilename(change, patchNum, true); |
| }, |
| |
| _computeDownloadLink: function(change, patchNum, zip) { |
| return this.changeBaseURL(change._number, patchNum) + '/patch?' + |
| (zip ? 'zip' : 'download'); |
| }, |
| |
| _computeDownloadFilename: function(change, patchNum, zip) { |
| var shortRev; |
| for (var rev in change.revisions) { |
| if (change.revisions[rev]._number == patchNum) { |
| shortRev = rev.substr(0, 7); |
| break; |
| } |
| } |
| return shortRev + '.diff.' + (zip ? 'zip' : 'base64'); |
| }, |
| |
| _computeArchiveDownloadLink: function(change, patchNum, format) { |
| return this.changeBaseURL(change._number, patchNum) + |
| '/archive?format=' + format; |
| }, |
| |
| _computeSchemes: function(change, patchNum) { |
| for (var rev in change.revisions) { |
| if (change.revisions[rev]._number == patchNum) { |
| var fetch = change.revisions[rev].fetch; |
| if (fetch) { |
| return Object.keys(fetch).sort(); |
| } |
| break; |
| } |
| } |
| return []; |
| }, |
| |
| _computeSchemeSelected: function(scheme, selectedScheme) { |
| return scheme == selectedScheme; |
| }, |
| |
| _handleSchemeTap: function(e) { |
| e.preventDefault(); |
| var el = Polymer.dom(e).rootTarget; |
| // TODO(andybons): Save as default scheme in preferences. |
| this._selectedScheme = el.getAttribute('data-scheme'); |
| }, |
| |
| _handleInputTap: function(e) { |
| e.preventDefault(); |
| Polymer.dom(e).rootTarget.select(); |
| }, |
| |
| _handleCloseTap: function(e) { |
| e.preventDefault(); |
| this.fire('close', null, {bubbles: false}); |
| }, |
| |
| _schemesChanged: function(schemes) { |
| if (schemes.length == 0) { return; } |
| if (schemes.indexOf(this._selectedScheme) == -1) { |
| this._selectedScheme = schemes.sort()[0]; |
| } |
| }, |
| |
| }); |
| })(); |
| </script> |
| </dom-module> |