blob: 95ad3f3ab597580e406566cc789f58d9f3e1fa76 [file] [log] [blame]
/**
* @license
* Copyright (C) 2023 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
import {htmlTemplate} from './gr-task-summary_html.js';
import {GrTaskChip} from './gr-task-chip.js';
class GrTaskSummary extends Polymer.Element {
static get is() {
return 'gr-task-summary';
}
static get template() {
return htmlTemplate;
}
static get properties() {
return {
change: {
type: Object,
},
ready_count: {
type: Number,
notify: true,
value: 0,
},
fail_count: {
type: Number,
notify: true,
value: 0,
},
invalid_count: {
type: Number,
notify: true,
value: 0,
},
waiting_count: {
type: Number,
notify: true,
value: 0,
},
duplicate_count: {
type: Number,
notify: true,
value: 0,
},
pass_count: {
type: Number,
notify: true,
value: 0,
},
is_loading: {
type: Boolean,
value: true,
},
tasks_info: {
type: Object,
},
};
}
/** @override */
ready() {
super.ready();
this._fetch_tasks();
document.addEventListener(`request-tasks-${this.change._number}`, e => {
document.dispatchEvent(
new CustomEvent(`response-tasks-${this.change._number}`, {
detail: {
tasks_info: this.tasks_info,
is_loading: this.is_loading,
},
composed: true, bubbles: true,
}));
});
}
_fetch_tasks() {
const endpoint =
`/changes/?q=change:${this.change._number}&--task--applicable`;
return this.plugin.restApi().get(endpoint).then(response => {
if (response && response.length === 1) {
const cinfo = response[0];
if (cinfo.plugins) {
this.tasks_info = cinfo.plugins.find(
pluginInfo => pluginInfo.name === 'task');
this._compute_counts(this.tasks_info.roots);
}
}
}).finally(e => {
this.is_loading = false;
if (!this._can_show_summary(
this.is_loading, this.ready_count,
this.fail_count, this.invalid_count,
this.waiting_count, this.duplicate_count,
this.pass_count)) {
this._hide_tasks_tab();
}
});
}
_compute_counts(tasks) {
if (!tasks) return [];
tasks.forEach(task => {
switch (task.status) {
case 'FAIL':
this.fail_count++;
break;
case 'READY':
this.ready_count++;
break;
case 'INVALID':
this.invalid_count++;
break;
case 'WAITING':
this.waiting_count++;
break;
case 'DUPLICATE':
this.duplicate_count++;
break;
case 'PASS':
this.pass_count++;
break;
}
this._compute_counts(task.sub_tasks);
});
}
_hide_tasks_tab() {
const paperTabs = GrTaskChip.getPrimaryTabs();
const tabs = paperTabs.querySelectorAll('paper-tab');
for (let i=0; i <= tabs.length; i++) {
if (tabs[i].dataset['name'] === 'change-view-tab-header-task') {
tabs[i].setAttribute('hidden', true);
paperTabs.selected = 0;
break;
}
}
}
_can_show_summary(is_loading, ready_count,
fail_count, invalid_count,
waiting_count, duplicate_count,
pass_count) {
if (is_loading || ready_count || fail_count || invalid_count ||
waiting_count || duplicate_count || pass_count) {
return true;
}
return false;
}
}
customElements.define(GrTaskSummary.is, GrTaskSummary);