| /** | |
| * @license | |
| * Copyright (C) 2021 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 './gr-task-plugin-tasks.js'; | |
| import {htmlTemplate} from './gr-task-plugin_html.js'; | |
| const Defs = {}; | |
| /** | |
| * @typedef {{ | |
| * sub_tasks: Array<Defs.Task>, | |
| * hint: ?string, | |
| * name: string, | |
| * change: ?number, | |
| * status: string | |
| * }} Defs.Task | |
| */ | |
| Defs.Task; | |
| class GrTaskPlugin extends Polymer.Element { | |
| static get is() { | |
| return 'gr-task-plugin'; | |
| } | |
| static get template() { | |
| return htmlTemplate; | |
| } | |
| static get properties() { | |
| return { | |
| change: { | |
| type: Object, | |
| }, | |
| // @type {Array<Defs.Task>} | |
| _tasks: { | |
| type: Array, | |
| notify: true, | |
| value() { return []; }, | |
| }, | |
| _show_all: { | |
| type: String, | |
| notify: true, | |
| value: 'false', | |
| }, | |
| _expand_all: { | |
| type: Boolean, | |
| notify: true, | |
| value: true, | |
| }, | |
| _all_count: { | |
| type: Number, | |
| notify: true, | |
| value: 0, | |
| }, | |
| _ready_count: { | |
| type: Number, | |
| notify: true, | |
| value: 0, | |
| }, | |
| _fail_count: { | |
| type: Number, | |
| notify: true, | |
| value: 0, | |
| }, | |
| _isPending: { | |
| type: Boolean, | |
| value: true, | |
| }, | |
| _tasks_info: { | |
| type: Object, | |
| observer: '_tasksInfoChanged', | |
| }, | |
| }; | |
| } | |
| _is_show_all(show_all) { | |
| return show_all === 'true'; | |
| } | |
| ready() { | |
| super.ready(); | |
| if (!this.change) { | |
| return; | |
| } | |
| document.addEventListener(`response-tasks-${this.change._number}`, e => { | |
| this._tasks_info = e.detail.tasks_info; | |
| this._isPending = e.detail.is_loading; | |
| }); | |
| this._getTasks(); | |
| } | |
| _tasksInfoChanged(newValue, oldValue) { | |
| if (this._tasks_info) { | |
| this._tasks = this._addTasks(this._tasks_info.roots); | |
| } | |
| } | |
| _is_hidden(_isPending, _tasks) { | |
| return (!_isPending && !_tasks.length); | |
| } | |
| async _getTasks() { | |
| while (this._isPending) { | |
| document.dispatchEvent( | |
| new CustomEvent(`request-tasks-${this.change._number}`, { | |
| composed: true, bubbles: true, | |
| })); | |
| await new Promise(r => setTimeout(r, 100)); | |
| } | |
| } | |
| _computeIcon(task) { | |
| const icon = {}; | |
| switch (task.status) { | |
| case 'FAIL': | |
| icon.id = 'close'; | |
| icon.tooltip = 'Failed'; | |
| break; | |
| case 'READY': | |
| icon.id = 'play_arrow'; | |
| icon.tooltip = 'Ready'; | |
| break; | |
| case 'INVALID': | |
| icon.id = 'block'; | |
| icon.tooltip = 'Invalid'; | |
| break; | |
| case 'WAITING': | |
| icon.id = 'pause'; | |
| icon.tooltip = 'Waiting'; | |
| break; | |
| case 'DUPLICATE': | |
| icon.id = 'check_circle'; | |
| icon.tooltip = 'Duplicate'; | |
| break; | |
| case 'PASS': | |
| icon.id = 'check_circle'; | |
| icon.tooltip = 'Passed'; | |
| break; | |
| } | |
| return icon; | |
| } | |
| _isFailOrReadyOrInvalid(task) { | |
| switch (task.status) { | |
| case 'FAIL': | |
| case 'READY': | |
| case 'INVALID': | |
| return true; | |
| } | |
| return false; | |
| } | |
| _computeShowOnNeededAndBlockedFilter(task) { | |
| return this._isFailOrReadyOrInvalid(task) || | |
| (task.sub_tasks && task.sub_tasks.some(t => | |
| this._computeShowOnNeededAndBlockedFilter(t))); | |
| } | |
| _compute_counts(task) { | |
| this._all_count++; | |
| switch (task.status) { | |
| case 'FAIL': | |
| this._fail_count++; | |
| break; | |
| case 'READY': | |
| this._ready_count++; | |
| break; | |
| } | |
| } | |
| _addTasks(tasks) { // rename to process, remove DOM bits | |
| if (!tasks) return []; | |
| tasks.forEach(task => { | |
| task.icon = this._computeIcon(task); | |
| task.showOnFilter = this._computeShowOnNeededAndBlockedFilter(task); | |
| this._compute_counts(task); | |
| this._addTasks(task.sub_tasks); | |
| }); | |
| return tasks; | |
| } | |
| _show_all_tap() { | |
| this._show_all = 'true'; | |
| this._expand_all = 'true'; | |
| } | |
| _needed_and_blocked_tap() { | |
| this._show_all = 'false'; | |
| this._expand_all = 'true'; | |
| } | |
| _switch_expand() { | |
| this._expand_all = !this._expand_all; | |
| } | |
| _computeShowAllLabelText(showAllSections) { | |
| if (showAllSections) { | |
| return 'Hide all'; | |
| } else { | |
| return 'Show all'; | |
| } | |
| } | |
| } | |
| customElements.define(GrTaskPlugin.is, GrTaskPlugin); |