blob: 77eb96903b8f8e9de4b78efe4839ac56a3eed062 [file] [log] [blame]
<!--
This in an HTML Import-able file that contains the definition
of the following elements:
<job-trigger-sk>
A ui for selecting job_specs and commits for triggering jobs.
To use this file import it:
<link href="/res/imp/job-trigger-sk.html" rel="import" />
Usage:
<job-trigger-sk></job-trigger-sk>
Properties:
// input
job_specs: Array<String> the names of the available job_specs.
commits: Array<String> commit hashes.
Methods:
None.
Events:
None.
-->
<link rel="import" href="/res/imp/bower_components/paper-button/paper-button.html">
<link rel="import" href="/res/imp/bower_components/paper-input/paper-input.html">
<link rel="import" href="/res/imp/bower_components/paper-spinner/paper-spinner.html">
<link rel="import" href="/res/common/imp/autocomplete-input-sk.html">
<link rel="import" href="/res/common/imp/input-list-sk.html">
<dom-module id="job-trigger-sk">
<template>
<style>
.container {
margin: 5px;
padding: 10px;
border: 1px solid #eeeeee;
font-size: 12px;
}
h2 {
font-size: 16px;
}
</style>
<div hidden$="{{_loading}}">
<template is="dom-repeat" items="[[_jobs]]">
<div class="container">
<h2>Job</h2>
<autocomplete-input-sk
autocomplete="[[job_specs]]"
id="job_specs_input"
value="{{item.name}}"
on-change="_jobs_changed"></autocomplete-input-sk>
<h2>Commit</h2>
<autocomplete-input-sk
autocomplete="[[commits]]"
id="commit_input"
value="{{item.commit}}"
on-change="_jobs_changed"></autocomplete-input-sk>
</div>
</template>
<paper-icon-button icon="add" on-click="_add_job" raised></paper-icon-button>
<paper-button on-click="_trigger_jobs" raised>Trigger Jobs</paper-button>
<div id="triggered_container" hidden$="{{_hide_triggered_container(_triggered.*)}}" class="container">
<h2>Triggered Jobs</h2>
<template is="dom-repeat" items="[[_triggered]]">
<div class="triggered_job">
<a href="/job/{{item}}">{{item}}</a>
</div>
</template>
</div>
</div>
<paper-spinner active$="{{_loading}}"></paper-spinner>
</template>
<script>
(function(){
Polymer({
is: "job-trigger-sk",
properties: {
job_specs: {
type: Array,
},
commits: {
type: Array,
},
_immediate: {
type: Boolean,
value: false,
},
_loading: {
type: Boolean,
value: false,
},
_jobs: {
type: Array,
},
_triggered: {
type: Array,
value: function() {
return [];
},
},
},
observers: [
"_jobs_changed(_jobs.*)",
],
ready: function() {
// Parse jobs.
var params = sk.query.toParamSet(window.location.search.substring(1));
var jobs = [];
if (params["job"] && params["job"].length > 0) {
for (var i = 0; i < params["job"].length; i++) {
var split = params["job"][i].split("@");
if (split.length != 2) {
sk.errorMessage("Invalid job parameter: " + params["job"][i]);
continue
}
jobs.push({"name": split[0], "commit": split[1]});
}
}
if (jobs.length == 0) {
jobs.push({"name": "", "commit": ""});
}
this.set("_jobs", jobs);
// If "submit=true" is in the URL params, immediately attempt to trigger
// the jobs, and, on success, close the window.
if (params["submit"] && params["submit"].length > 0 && params["submit"][0] == "true") {
this._immediate = true;
this._trigger_jobs();
}
},
_jobs_changed: function() {
var params = sk.query.toParamSet(window.location.search.substring(1));
delete params["job"];
params["job"] = [];
for (var i = 0; i < this._jobs.length; i++) {
params["job"].push(this._jobs[i].name + "@" + this._jobs[i].commit);
}
var newUrl = window.location.href.split("?")[0] + "?" + sk.query.fromParamSet(params);
window.history.replaceState("", "", newUrl);
},
_hide_triggered_container: function() {
return !(this._triggered && this._triggered.length > 0);
},
_add_job: function() {
this.push("_jobs", {"name": "", "commit": ""});
},
_trigger_jobs: function() {
var data = [];
for (var i = 0; i < this._jobs.length; i++) {
var job = this._jobs[i];
if (!job.name) {
sk.errorMessage("Job name is required.");
return;
}
if (!job.commit) {
sk.errorMessage("Commit is required.");
return;
}
data.push(job);
};
var str = JSON.stringify(data);
this._loading = true;
sk.post("/json/trigger", str).then(function(resp) {
this.set("_jobs", [{}]);
this.set("_triggered", JSON.parse(resp));
this._loading = false;
if (this._immediate) {
window.close();
}
}.bind(this), function(err) {
this._loading = false;
sk.errorMessage(err);
}.bind(this));
},
});
})();
</script>
</dom-module>