blob: 00d923ba848e5352b0af563d8c257988c76a7c1f [file] [log] [blame]
<!--
The <chromium-build-runs-sk> custom element declaration. Displays a table with details about each
completed and pending Chromium build task.
Attributes:
defaultSize: The number of Chromium build runs to show per page, default 10.
Events:
None.
Methods:
reload: queries for updated information on Chromium build runs.
-->
<dom-module id="chromium-build-runs-sk">
<style>
table.runshistory {
border-spacing: 0px;
}
tr.headers {
background-color: #CCCCFF;
text-align: center;
}
td.nowrap {
white-space: nowrap;
}
table.runshistory > tbody > tr > td {
padding: 10px;
border: solid black 1px;
}
.delete-button, .redo-button {
--paper-icon-button-disabled: {
display: none;
}
}
.oldruns {
margin-left: 20px;
}
</style>
<template>
<confirm-dialog-sk id="confirm_dialog"></confirm-dialog-sk>
<h2>Chromium Builds</h2>
<paging-sk pagination="{{pagination}}" on-pagechange="pageChangedHandler"></paging-sk>
<br/>
<table class="runshistory" id="runshistory" cellpadding="5" border="1">
<tr class="headers">
<td>Id</td>
<td>Chromium Commit Hash</td>
<td>Submitted On</td>
<td>Skia Commit Hash</td>
<td>User</td>
<td>Timestamps</td>
<td>Results</td>
<td>Task Repeats</td>
</tr>
<template is="dom-repeat" items="{{chromiumBuilds}}" as="chromiumBuild" index-as="index">
<tr style="border: 1px solid black;">
<!-- Id col -->
<td class="nowrap">
<span>{{chromiumBuild.Id}}</span>
<paper-icon-button icon="delete" mini
class="delete-button"
disabled="{{!chromiumBuild.canDelete}}"
alt="Delete"
data-index$="{{index}}"
data-type="delete">
</paper-icon-button>
<paper-icon-button icon="redo" mini
class="redo-button"
disabled="{{!chromiumBuild.canRedo}}"
alt="Redo"
data-index$="{{index}}"
data-type="redo">
</paper-icon-button>
</td>
<!-- Chromium Commit Hash col -->
<td><a href="{{chromiumCommitUrl(chromiumBuild.ChromiumRev)}}">{{shortHash(chromiumBuild.ChromiumRev)}}</a></td>
<!-- Submitted On col -->
<td class="nowrap">{{ formatTimestamp(chromiumBuild.ChromiumRevTs) }}</td>
<!-- Skia Commit Hash col -->
<td><a href="{{skiaCommitUrl(chromiumBuild.SkiaRev)}}">{{shortHash(chromiumBuild.SkiaRev)}}</a></td>
<!-- User col -->
<td>{{chromiumBuild.Username}}</td>
<!-- Timestamps col -->
<td>
<table>
<tr>
<td>Requested:</td>
<td class="nowrap">{{ formatTimestamp(chromiumBuild.TsAdded) }}</td>
</tr>
<tr>
<td>Started:</td>
<td class="nowrap">{{ formatTimestamp(chromiumBuild.TsStarted) }}</td>
</tr>
<tr>
<td>Completed:</td>
<td class="nowrap">{{ formatTimestamp(chromiumBuild.TsCompleted) }}</td>
</tr>
</table>
</td>
<!-- Results col -->
<td class="nowrap">
<template is="dom-if" if="{{chromiumBuild.Failure}}">
<div style="color:red;">Failed</div>
</template>
<template is="dom-if" if="{{!chromiumBuild.TaskDone}}">
<div style="color:green;">Waiting</div>
</template>
<template is="dom-if"
if="{{isDone(chromiumBuild.Failure, chromiumBuild.TaskDone)}}">
Done
</template>
<template is="dom-if" if="{{chromiumBuild.Log}}">
<a href="{{chromiumBuild.Log}}" target="_blank">log</a>
</template>
<template is="dom-if" if="{{chromiumBuild.SwarmingLogs}}">
<br/>
<a href="{{chromiumBuild.SwarmingLogs}}" target="_blank">Swarming Logs</a>
</template>
</td>
<!-- Task Repeats -->
<td>{{ formatRepeatAfterDays(chromiumBuild.RepeatAfterDays) }}</td>
</tr>
</template>
</table>
</template>
</dom-module>
<script>
Polymer({
is: "chromium-build-runs-sk",
properties: {
chromiumBuilds: {
type: Array,
value: function() { return []; },
},
defaultSize: {
type: Number,
value: 10,
},
pagination: {
type: Object,
value: function() { return {}; },
},
pageChangedHandler: {
type: Object,
value: function() { return null; },
},
},
ready: function() {
this.pagination = {"offset": 0, "size": this.defaultSize};
this.pageChangedHandler = this.reload.bind(this);
var that = this;
this.$.runshistory.addEventListener('click', function(e) {
var button = sk.findParent(e.target, "PAPER-ICON-BUTTON");
if (button != null) {
if (button.dataset.type == "delete") {
var index = button.dataset.index;
var note = that.deleteNote(that.chromiumBuilds, index);
that.$.confirm_dialog.open("Proceed with deleting task?" + note)
.then(that.deleteTask.bind(that, index));
} else if (button.dataset.type == "redo") {
var index = button.dataset.index;
that.$.confirm_dialog.open("Reschedule this task?")
.then(that.redoTask.bind(that, index));
}
}
});
this.reload();
},
reload: function() {
var queryParams = {
"offset": this.pagination.offset,
"size": this.pagination.size,
}
var queryStr = "?" + sk.query.fromObject(queryParams);
sk.post("/_/get_chromium_build_tasks" + queryStr).then(JSON.parse).then(function(json) {
this.pagination = json.pagination;
this.chromiumBuilds = json.data;
for (var i = 0; i < this.chromiumBuilds.length; i++) {
this.chromiumBuilds[i].canDelete = json.permissions[i].DeleteAllowed;
this.chromiumBuilds[i].canRedo = json.permissions[i].RedoAllowed;
this.chromiumBuilds[i].Id = json.ids[i];
}
}.bind(this)).catch(sk.errorMessage);
},
deleteNote: function(chromiumBuilds, deleteIndex) {
if (deleteIndex >= 0 &&
chromiumBuilds[deleteIndex].TaskDone &&
!chromiumBuilds[deleteIndex].Failure) {
return " Note: This build will no longer be available for running other tasks.";
} else {
return "";
}
},
deleteTask: function(deleteIndex) {
var params = {};
params["id"] = this.chromiumBuilds[deleteIndex].Id;
sk.post("/_/delete_chromium_build_task", JSON.stringify(params)).then(function() {
$$$("#confirm_toast").text = "Deleted task " + params["id"];
$$$("#confirm_toast").show();
}.bind(this)).catch(sk.errorMessage).then(function() {
this.reload();
}.bind(this));
},
redoTask: function(redoIndex) {
var params = {};
params["id"] = this.chromiumBuilds[redoIndex].Id;
sk.post("/_/redo_chromium_build_task", JSON.stringify(params)).then(function() {
$$$("#confirm_toast").text = "Resubmitted task " + params["id"];
$$$("#confirm_toast").show();
}.bind(this)).catch(sk.errorMessage).then(function() {
this.reload();
}.bind(this));
},
chromiumCommitUrl: ctfe.chromiumBuild.chromiumCommitUrl,
skiaCommitUrl: ctfe.chromiumBuild.skiaCommitUrl,
shortHash: ctfe.chromiumBuild.shortHash,
formatTimestamp: ctfe.getFormattedTimestamp,
formatRepeatAfterDays: ctfe.formatRepeatAfterDays,
isDone: function(failure, taskDone) {
return !failure && taskDone;
},
});
</script>