Index: appengine_apps/trooper_o_matic/ui/build-table.html |
diff --git a/appengine_apps/trooper_o_matic/ui/build-table.html b/appengine_apps/trooper_o_matic/ui/build-table.html |
deleted file mode 100644 |
index 73a7c0f2d1937f647b65a45b84c40f89842b6ab6..0000000000000000000000000000000000000000 |
--- a/appengine_apps/trooper_o_matic/ui/build-table.html |
+++ /dev/null |
@@ -1,193 +0,0 @@ |
- <!-- Copyright (c) 2014 The Chromium Authors. All rights reserved. |
- Use of this source code is governed by a BSD-style license that can be |
- found in the LICENSE file. --> |
- |
-<link rel="import" href="../bower_components/core-ajax/core-ajax.html"> |
- |
-<polymer-element name="build-table" attributes="builds auto"> |
- <template> |
- <style> |
- :host { |
- font-family: 'RobotoDraft'; |
- font-size: 13px; |
- font-weight: 400; |
- line-height: 1.5; |
- color: #212121; |
- } |
- table { |
- border-spacing: 0; |
- } |
- th, td { |
- padding: 4px 16px 4px 4px; |
- text-align: left; |
- cursor: pointer; |
- } |
- .error { |
- color: red; |
- font-weight: bold; |
- } |
- .warning { |
- color: orange; |
- font-weight: bold; |
- } |
- .ok { |
- color: green; |
- font-weight: bold; |
- } |
- tr:hover { |
- background-color: #e9eaed; |
- } |
- th { |
- background-color: white; |
- } |
- th[data-sortdown] { |
- background-image: url('/images/sort-down.gif'); |
- background-repeat: no-repeat; |
- background-position: 95% 40%; |
- background-color: white; |
- } |
- th[data-sortup] { |
- background-image: url('/images/sort-up.gif'); |
- background-repeat: no-repeat; |
- background-position: 95% 40%; |
- background-color: white; |
- } |
- </style> |
- <table> |
- <tr> |
- <th data-type="master" on-click="{{ updateSort }}">Master</th> |
- <th data-type="builder" on-click="{{ updateSort }}">Builder</th> |
- <th data-type="buildnumber" on-click="{{ updateSort }}">Build Number</th> |
- <th data-type="buildtime" on-click="{{ updateSort }}">Build Time (HH:MM:SS)</th> |
- <th data-type="result" on-click="{{ updateSort }}">Result</th> |
- <th data-type="revision" on-click="{{ updateSort }}">Revision</th> |
- <th data-type="name" on-click="{{ updateSortForResponse }}">Longest Step</th> |
- <th data-type="duration" on-click="{{ updateSortForResponse }}">Longest Step Duration</th> |
- <th data-type="percent" on-click="{{ updateSortForResponse }}">Longest Step %</th> |
- </tr> |
- <template repeat="{{ build in builds }}"> |
- <tr data-master="{{ build.master }}" |
- data-builder="{{ build.builder }}" |
- data-buildnumber="{{ build.buildnumber }}" |
- on-click="{{ trClick }}"> |
- <td>{{ build.master }}</td> |
- <td>{{ build.builder }}</td> |
- <td>{{ build.buildnumber }}</td> |
- <td class="{{ howBadIsTime(build.buildtime) }}">{{ build.buildtime | prettifyBuildTime }}</td> |
- <td class="{{ howBadIsResult(build.result) }}">{{ build.result | resultToString }}</td> |
- <td>{{ build.revision }}</td> |
- <td class='longest-step'>{{ build.response.steps.max.name }}</td> |
- <td class='longest-step-duration {{ howBadIsTime(build.response.steps.max.duration) }}'> |
- {{ build.response.steps.max.duration | prettifyBuildTime }}</td> |
- <td class='longest-step-percent'>{{ build.response.steps.max.percent | prettifyPercent }}</td> |
- <core-ajax url='http://build.chromium.org/p/{{ build.master }}/json/builders/{{ build.builder }}/builds/{{ build.buildnumber }}' |
- handleAs='json' auto="{{ auto }}" response="{{ build.response }}" on-core-response="{{ findLongest }}"></core-ajax> |
- </tr> |
- </template> |
- </table> |
- </template> |
- <script> |
- Polymer('build-table', { |
- auto: true, |
- trClick: function(event, detail, sender) { |
- var master = sender.getAttribute('data-master'); |
- var builder = sender.getAttribute('data-builder'); |
- var buildnumber = sender.getAttribute('data-buildnumber'); |
- var url = 'http://build.chromium.org/p/{1}/builders/{2}/builds/{3}'. |
- assign(master, builder, buildnumber); |
- window.open(url); |
- }, |
- resultToString: function(value) { |
- return ["success", "warning", "failure", "skipped", "exception", "retry"][value]; |
- }, |
- prettifyBuildTime: function(value) { |
- var s = Math.round(value); |
- var m = 0; |
- var h = 0; |
- if (s >= 60) { |
- m = Math.floor(s / 60); |
- s = s % 60; |
- if (m >= 60) { |
- h = Math.floor(m / 60); |
- m = m % 60; |
- } |
- } |
- |
- return h + ":" + (m > 9 ? m : '0' + m) + ":" + (s > 9 ? s : '0' + s); |
- }, |
- prettifyPercent: function(percent) { |
- return (percent * 100).toFixed(1) + '%'; |
- }, |
- howBadIsTime: function(time) { |
- if (time > 60 * 60) { |
- return 'error'; |
- } else if (time > 30 * 60) { |
- return 'warning'; |
- } else { |
- return ''; |
- } |
- }, |
- howBadIsResult: function(result) { |
- return ['ok', 'warning', 'error', 'warning', 'error', 'warning'][result]; |
- }, |
- _sort: function(sender, extractor) { |
- var th = sender; |
- var sortDir = 'down'; |
- if (th.getAttribute('data-sortdown')) { |
- sortDir = 'up'; |
- } |
- var headers = this.shadowRoot.querySelectorAll('th'); |
- for (var i = 0; i < headers.length; i++) { |
- headers[i].removeAttribute('data-sortdown'); |
- headers[i].removeAttribute('data-sortup'); |
- } |
- th.setAttribute('data-sort' + sortDir, true); |
- this.builds.sort(function(a, b) { |
- var aVal = extractor(a), bVal = extractor(b); |
- if (!isNaN(Number(aVal)) && !isNaN(Number(bVal))) { |
- if (sortDir == 'down') { |
- return aVal - bVal; |
- } else { |
- return bVal - aVal; |
- } |
- } else { |
- if (sortDir == 'down') { |
- return aVal.localeCompare(bVal); |
- } else { |
- return bVal.localeCompare(aVal); |
- } |
- } |
- }); |
- }, |
- updateSort: function(event, detail, sender) { |
- var type = sender.getAttribute('data-type'); |
- this._sort(sender, function(a) { return a[type] }); |
- }, |
- updateSortForResponse: function(event, detail, sender) { |
- var type = sender.getAttribute('data-type'); |
- this._sort(sender, function(a) { return a.response.steps.max[type] }); |
- }, |
- findLongest: function(event, data) { |
- var maxDuration = 0; |
- var maxDurationName = ''; |
- var buildDuration = 0; |
- var steps = data.response.steps; |
- if (steps == null) |
- steps.max= {name: 'waiting', duration: 0, percent: 0}; |
- steps.forEach(function(step) { |
- var name = step.name |
- if (name == 'steps') { |
- return; |
- } |
- var duration = step.times[1] - step.times[0]; |
- if (duration > maxDuration) { |
- maxDuration = duration; |
- maxDurationName = name; |
- } |
- buildDuration += duration; |
- }); |
- steps.max = {name: maxDurationName, duration: maxDuration, percent: maxDuration / buildDuration}; |
- } |
- }); |
- </script> |
-</polymer-element> |