| /** | |
| * @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); |