blob: 4d2c0528edc97c445028027a6d84d8eb54c89a51 [file] [log] [blame]
<!-- The <push-selection-sk> custom element declaration.
Presents a dialog of package choices and generates an event when the user has
made a selection. It is a custom element used by <push-server-sk>.
Attributes:
'choices'
The list of packages that are available.
'choice'
The selected package.
Events:
'change-package'
A 'change-package' event is generated when the user selects a package to push.
The change event has the following attributes:
event.detail.name - The full name of the package selected.
Methods:
toggle()
Toggles the visibility of the selection dialog.
-->
<dom-module id="push-selection-sk">
<style>
.pushSelection {
font-family: monospace;
padding: 0.5em;
cursor: pointer;
}
.pushSelection:hover {
background: #eee;
}
.built {
color: #D95F02;
display:inline;
}
.userid {
color: #7570B3;
display:inline;
}
paper-dialog div {
padding: 5px 24px;
}
#scrollable {
height: 80vh;
overflow-y: auto;
}
</style>
<template>
<paper-dialog id=chooser>
<h2>Choose a release package to push</h2>
<div id=scrollable>
<iron-selector id=newChoice>
<template is="dom-repeat" items$="{{choices}}">
<div class=pushSelection data-name$="{{item.Name}}">
<iron-icon icon$="{{checkIfInstalled(choice, item.Name)}}" title="Currently installed"></iron-icon>
<a target=_blank href="{{linkToCommit(item.Hash)}}">{{short(item.Hash)}}</a>
<a target=_blank href="{{linkToDiff(item.Hash)}}">log</a>
<pre class=built>{{humanDiffDate(item.Built)}}</pre>
<pre class=userid title$="{{item.UserID}}">{{short(item.UserID)}}</pre>
<span>{{item.Note}}</span>
<iron-icon icon$="{{warnIfDirty(item.Dirty)}}" title="Uncommited changes when the package was built."></iron-icon>
</div>
</template>
</iron-selector>
</div>
<div class="buttons">
<paper-button dialog-dismiss>Cancel</paper-button>
</div>
</paper-dialog>
</template>
</dom-module>
<script>
Polymer({
is: "push-selection-sk",
ready: function() {
var that = this;
this.$.newChoice.addEventListener('click', function(e) {
if (e.target.nodeName == 'A') {
return;
}
that.toggle();
var div = sk.findParent(e.target, "DIV");
if (div == null) {
return
}
var detail = { name: div.dataset.name };
that.dispatchEvent(new CustomEvent('change-package', {detail: detail}));
});
},
properties: {
choices: {
type: Array,
value: function() { return []; },
},
choice: {
type: String,
value: '',
},
installedHash: {
type: String,
computed: 'findInstalledHash(choice, choices)',
}
},
toggle: function() {
this.$.chooser.toggle();
},
// short is a utility function used in templates to truncate strings.
short: function(s) {
return s.slice(0, 8);
},
humanDiffDate: sk.human.diffDate,
checkIfInstalled: function(id, name) {
if (id == name) {
return 'check';
}
return ' '; // Don't return an empty string here. Fixes skia:5153.
},
warnIfDirty: function(dirty) {
return dirty ? 'warning' : ' '; // Don't return an empty string here, to force the icon to change.
},
linkToCommit: function(hash) {
return 'https://skia.googlesource.com/buildbot/+/' + hash;
},
findInstalledHash: function(choice, choices) {
ret = '';
choices.forEach(function(e) {
if (e.Name == choice) {
ret = e.Hash;
}
});
return ret;
},
linkToDiff: function(hash) {
if (this.installedHash == '' || this.installedHash == hash) {
return this.linkToCommit(hash);
} else {
// This link only works if the installed package is older than
// the package you are inspecting, which is normally the case.
// To get the link 100% right would require looking up the hashes
// in the Git repo.
return 'https://skia.googlesource.com/buildbot/+log/' + this.installedHash + '..' + hash;
}
},
});
</script>