|  | // 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. | 
|  | (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, | 
|  | loggedIn: { | 
|  | type: Boolean, | 
|  | value: false, | 
|  | observer: '_loggedInChanged', | 
|  | }, | 
|  |  | 
|  | _schemes: { | 
|  | type: Array, | 
|  | value() { return []; }, | 
|  | computed: '_computeSchemes(change, patchNum)', | 
|  | observer: '_schemesChanged', | 
|  | }, | 
|  | _selectedScheme: String, | 
|  | }, | 
|  |  | 
|  | hostAttributes: { | 
|  | role: 'dialog', | 
|  | }, | 
|  |  | 
|  | behaviors: [ | 
|  | Gerrit.RESTClientBehavior, | 
|  | ], | 
|  |  | 
|  | focus() { | 
|  | if (this._schemes.length) { | 
|  | this.$$('.copyToClipboard').focus(); | 
|  | } else { | 
|  | this.$.download.focus(); | 
|  | } | 
|  | }, | 
|  |  | 
|  | getFocusStops() { | 
|  | const links = this.$$('#archives').querySelectorAll('a'); | 
|  | return { | 
|  | start: this.$.closeButton, | 
|  | end: links[links.length - 1], | 
|  | }; | 
|  | }, | 
|  |  | 
|  | _loggedInChanged(loggedIn) { | 
|  | if (!loggedIn) { return; } | 
|  | this.$.restAPI.getPreferences().then(prefs => { | 
|  | if (prefs.download_scheme) { | 
|  | // Note (issue 5180): normalize the download scheme with lower-case. | 
|  | this._selectedScheme = prefs.download_scheme.toLowerCase(); | 
|  | } | 
|  | }); | 
|  | }, | 
|  |  | 
|  | _computeDownloadCommands(change, patchNum, _selectedScheme) { | 
|  | let commandObj; | 
|  | for (const rev in change.revisions) { | 
|  | if (change.revisions[rev]._number === parseInt(patchNum, 10) && | 
|  | change.revisions[rev].fetch.hasOwnProperty(_selectedScheme)) { | 
|  | commandObj = change.revisions[rev].fetch[_selectedScheme].commands; | 
|  | break; | 
|  | } | 
|  | } | 
|  | const commands = []; | 
|  | for (const title in commandObj) { | 
|  | if (!commandObj.hasOwnProperty(title)) { continue; } | 
|  | commands.push({ | 
|  | title, | 
|  | command: commandObj[title], | 
|  | }); | 
|  | } | 
|  | return commands; | 
|  | }, | 
|  |  | 
|  | _computeZipDownloadLink(change, patchNum) { | 
|  | return this._computeDownloadLink(change, patchNum, true); | 
|  | }, | 
|  |  | 
|  | _computeZipDownloadFilename(change, patchNum) { | 
|  | return this._computeDownloadFilename(change, patchNum, true); | 
|  | }, | 
|  |  | 
|  | _computeDownloadLink(change, patchNum, zip) { | 
|  | return this.changeBaseURL(change._number, patchNum) + '/patch?' + | 
|  | (zip ? 'zip' : 'download'); | 
|  | }, | 
|  |  | 
|  | _computeDownloadFilename(change, patchNum, zip) { | 
|  | let shortRev; | 
|  | for (const rev in change.revisions) { | 
|  | if (change.revisions[rev]._number === parseInt(patchNum, 10)) { | 
|  | shortRev = rev.substr(0, 7); | 
|  | break; | 
|  | } | 
|  | } | 
|  | return shortRev + '.diff.' + (zip ? 'zip' : 'base64'); | 
|  | }, | 
|  |  | 
|  | _computeArchiveDownloadLink(change, patchNum, format) { | 
|  | return this.changeBaseURL(change._number, patchNum) + | 
|  | '/archive?format=' + format; | 
|  | }, | 
|  |  | 
|  | _computeSchemes(change, patchNum) { | 
|  | for (const rev of Object.values(change.revisions || {})) { | 
|  | if (rev._number === parseInt(patchNum, 10)) { | 
|  | const fetch = rev.fetch; | 
|  | if (fetch) { | 
|  | return Object.keys(fetch).sort(); | 
|  | } | 
|  | break; | 
|  | } | 
|  | } | 
|  | return []; | 
|  | }, | 
|  |  | 
|  | _computePatchSetQuantity(revisions) { | 
|  | if (!revisions) { return 0; } | 
|  | return Object.keys(revisions).length; | 
|  | }, | 
|  |  | 
|  | _computeSchemeSelected(scheme, selectedScheme) { | 
|  | return scheme === selectedScheme; | 
|  | }, | 
|  |  | 
|  | _handleSchemeTap(e) { | 
|  | e.preventDefault(); | 
|  | const el = Polymer.dom(e).rootTarget; | 
|  | this._selectedScheme = el.getAttribute('data-scheme'); | 
|  | if (this.loggedIn) { | 
|  | this.$.restAPI.savePreferences({download_scheme: this._selectedScheme}); | 
|  | } | 
|  | }, | 
|  |  | 
|  | _handleInputTap(e) { | 
|  | e.preventDefault(); | 
|  | Polymer.dom(e).rootTarget.select(); | 
|  | }, | 
|  |  | 
|  | _handleCloseTap(e) { | 
|  | e.preventDefault(); | 
|  | this.fire('close', null, {bubbles: false}); | 
|  | }, | 
|  |  | 
|  | _schemesChanged(schemes) { | 
|  | if (schemes.length === 0) { return; } | 
|  | if (!schemes.includes(this._selectedScheme)) { | 
|  | this._selectedScheme = schemes.sort()[0]; | 
|  | } | 
|  | }, | 
|  |  | 
|  | _copyToClipboard(e) { | 
|  | e.target.parentElement.querySelector('.copyCommand').select(); | 
|  | document.execCommand('copy'); | 
|  | getSelection().removeAllRanges(); | 
|  | e.target.textContent = 'done'; | 
|  | setTimeout(() => { e.target.textContent = 'copy'; }, 1000); | 
|  | }, | 
|  | }); | 
|  | })(); |