| <!-- The <trybot-controls-sk> custom element declaration. |
| |
| Shows an overview of the patchsets that have been run for a CL. |
| It color codes bots according to their state (running, failed etc.) |
| and exposes links to view the digests associated individual |
| patchsets. |
| |
| Attributes: |
| None |
| |
| Events: |
| state-change - Fires when the state of control variables changes. This |
| should result in a reload of the page. The 'detail' field of the |
| event object contains the new state object. |
| |
| state-update - Fires when the state is updated. This reflects a state that |
| is already represented on the current page and should NOT result in |
| a page reload but an update of the URL. |
| |
| |
| Methods: |
| setState(state) - Sets the state of the variables controlled by the |
| UI elements. This should be called at least once before 'setIssue', |
| usually the state is extracted from the URL. |
| |
| setIssue(issue) - Sets the current issue as returned by the /json/search endpoint. |
| If issue is null the element does not show and is usually the result of search |
| that was not querying for an issue. |
| |
| Mailboxes: |
| None |
| |
| --> |
| <link rel="import" href="bower_components/polymer/polymer.html"> |
| <link rel="import" href="bower_components/iron-flex-layout/iron-flex-layout-classes.html"> |
| <link rel="import" href="bower_components/paper-toggle-button/paper-toggle-button.html"> |
| <link rel="import" href="bower_components/paper-dropdown-menu/paper-dropdown-menu.html"> |
| <link rel="import" href="bower_components/paper-listbox/paper-listbox.html"> |
| <link rel="import" href="bower_components/paper-item/paper-item.html"> |
| <link rel="import" href="bower_components/iron-icons/iron-icons.html"> |
| <link rel="import" href="bower_components/paper-button/paper-button.html"> |
| <link rel="import" href="shared-styles.html"> |
| |
| <dom-module id="trybot-controls-sk"> |
| <template> |
| <style include="iron-flex iron-flex-alignment"></style> |
| <style include="shared-styles"> |
| .scheduledTryjob { |
| background-color: #E0E0E0; |
| } |
| |
| .runningTryjob { |
| background-color: #FFEB3B; |
| } |
| |
| .completeTryjob { |
| background-color: #8BC34A; |
| } |
| |
| .ingestedTryjob { |
| background-color: #8BC34A; |
| color: white; |
| } |
| |
| .ingestedTryjob:after { |
| content: "\2714"; |
| } |
| |
| .failedTryjob { |
| background-color: #F44336; |
| color: white; |
| } |
| |
| .tryjobStatus { |
| padding-right: .5em; |
| padding-left: .5em; |
| margin-left: 0.5em; |
| margin-right: 0.5em; |
| margin-top: 0.3em; |
| margin-bottom: 0.3em; |
| padding: 0.2em 1em 0.2em 1em; |
| float: left; |
| } |
| |
| .tryjobContainer { |
| max-width: 80%; |
| margin-top: 1em; |
| margin-bottom: 1em; |
| } |
| |
| .issueHeader, .issueHeader a { |
| font-weight: bold; |
| font-size: medium; |
| } |
| |
| .issueHeader { |
| margin-right: 2em; |
| } |
| |
| .issueHeader.triagelogLink a { |
| color:#1f78b4; |
| } |
| |
| .currentPatchset::after { |
| content: "*"; |
| } |
| |
| .triagelogLink { |
| font-size: smaller; |
| } |
| |
| .masterToggle { |
| margin-left: 5em; |
| } |
| |
| .controlsContainer { |
| margin:1em 0 1em 0; |
| } |
| |
| .legend { |
| font-weight: bolder; |
| } |
| |
| .legendContainer { |
| border: 1px solid #CCCC; |
| float: right; |
| } |
| </style> |
| <template is="dom-if" if={{_issue}}> |
| <div class="layout horizontal"> |
| <div class="issueHeader">Issue:</div> |
| <div class="issueHeader"> |
| <a href$="{{_issue.url}}" target="_blank" rel="noopener"> |
| {{_issue.subject}} |
| </a> |
| </div> |
| <div class="issueHeader">{{_issue.owner}}</div> |
| <div class="issueHeader triagelogLink"> |
| <a href$="/triagelog?issue=[[_issue.id]]"><iron-icon icon="icons:find-in-page"></iron-icon>Triagelog</a> |
| </div> |
| </div> |
| <div class="controlsContainer layout horizontal"> |
| <paper-dropdown-menu id="patchsetDropDown" label="Patchset" horizontal-align="left"> |
| <paper-listbox id="itemMenu" class="dropdown-content" selected="{{_state.patchsets}}" attr-for-selected="value"> |
| <template is="dom-repeat" items="{{_patchsets}}"> |
| <paper-item value="[[item.val]]">[[item.label]]</paper-item> |
| </template> |
| </paper-listbox> |
| </paper-dropdown-menu> |
| <paper-toggle-button class="masterToggle" checked="{{_state.master}}">Include Master</paper-toggle-button> |
| </div> |
| <div class="tryjobContainer horizontal layout wrap" hidden$="[[!_tryjobs]]"> |
| <template is="dom-repeat" items={{_tryjobs}} as="tryjob"> |
| <div class$="{{tryjob.status}}Tryjob tryjobStatus" title$="Status: [[tryjob.status]]">{{tryjob.builder}}</div> |
| </template> |
| </div> |
| <div class="legendContainer" hidden$="[[!_tryjobs]]"> |
| <div class="tryjobContainer horizontal layout"> |
| <div class="tryjobStatus legend">Legend:</div> |
| <div class="scheduledTryjob tryjobStatus">scheduled</div> |
| <div class="runningTryjob tryjobStatus">running</div> |
| <div class="completeTryjob tryjobStatus">complete</div> |
| <div class="ingestedTryjob tryjobStatus">ingested</div> |
| </div> |
| </div> |
| <div class="horizontal layout" hidden$="[[_tryjobs]]"> |
| No Tryjobs for Patchset [[_state.patchsets]]. |
| </div> |
| </template> |
| </template> |
| |
| <script> |
| Polymer({ |
| is: "trybot-controls-sk", |
| |
| behaviors: [gold.PageStateBehavior], |
| |
| properties: { |
| _issue: { |
| type: Object, |
| value: null |
| }, |
| |
| _state: { |
| type: Object, |
| value: null |
| }, |
| }, |
| |
| observers: [ |
| '_fireStateChange(_state.*)' |
| ], |
| |
| ready: function() { |
| this._setDefaultState(gold.defaultSearchState, true); |
| }, |
| |
| setState: function(state) { |
| this._noFire = true; |
| this.set('_state', sk.object.shallowCopy(state)); |
| }, |
| |
| setIssue: function(issue) { |
| this._noFire = true; |
| this._setPatchsetInfo(issue); |
| this.set("_issue", issue); |
| }, |
| |
| _setPatchsetInfo: function(issue) { |
| if (!issue || !issue.patchsets) { |
| return; |
| } |
| var currSelected = (issue.queryPatchsets && issue.queryPatchsets.length && issue.queryPatchsets[0]) || -1; |
| var patchsets = []; |
| var group = []; |
| var tryjobs = []; |
| for(var i=0; i < issue.patchsets.length; i++) { |
| group.push(issue.patchsets[i]); |
| if (issue.patchsets[i].tryjobs) { |
| patchsets.push(this._getPatchsetInfo(group)); |
| group = []; |
| if (issue.patchsets[i].id === currSelected) { |
| tryjobs.push.apply(tryjobs, issue.patchsets[i].tryjobs); |
| } |
| } |
| } |
| if (group.length > 0) { |
| patchsets.push(this._getPatchsetInfo(group)); |
| } |
| tryjobs.sort(function(a,b) { |
| return (a.builder < b.builder) ? -1 : ((a.builder === b.builder)? 0 : 1); |
| }); |
| |
| this.set('_patchsets', patchsets); |
| this.set('_state.patchsets', currSelected); |
| this.set('_tryjobs', tryjobs); |
| this.fire('state-update', sk.object.shallowCopy(this._state)); |
| }, |
| |
| _fireStateChange: function(observer) { |
| // Do not fire when element is first initialized (null) or when it was |
| // explicitly requested to not fire the event (_noFire). |
| if ((observer.value === null) || (this._noFire)) { |
| this._noFire = false; |
| return; |
| } |
| this.fire('state-change', sk.object.shallowCopy(this._state)); |
| }, |
| |
| _getPatchsetInfo: function(group) { |
| return { |
| label: 'Patchset ' + group[0].id + ((group.length>1) ? ' - ' +group[group.length-1].id:''), |
| val: group[group.length-1].id |
| }; |
| }, |
| |
| _patchsetHref: function(patchset) { |
| return this._baseUrl + patchset.id; |
| }, |
| |
| _isCurr: function(patchset) { |
| return (this._issue.queryPatchsets.indexOf(patchset.id) !== -1) ? 'currentPatchset' : ''; |
| }, |
| |
| _plusOne: function(index) { |
| return index+1; |
| } |
| }); |
| </script> |
| </dom-module> |