blob: 47e15c80b20dc536f796072cf946feadd661e8cb [file] [log] [blame]
// Copyright (C) 2019 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.
(function() {
'use strict';
const Defs = {};
/**
* @typedef {{
* message: string,
* sub_tasks: Array<Defs.Task>,
* hint: ?string,
* name: string,
* status: string
* }}
*/
Defs.Task;
Polymer({
is: 'gr-task-plugin',
properties: {
change: {
type: Object,
},
// @type {Array<Defs.Task>}
_tasks: {
type: Array,
notify: true,
value() { return []; },
},
},
attached() {
this._getTasks();
},
_getTasks() {
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) {
const taskPluginInfo = cinfo.plugins.find(
pluginInfo => pluginInfo.name === 'task');
if (taskPluginInfo) {
this._tasks = this._addTasks(taskPluginInfo.roots);
}
}
}
});
},
_getTaskDescription(task) {
let inProgress = task.in_progress ? " (IN PROGRESS)" : "";
return (task.hint || task.name) + inProgress;
},
_computeMessage(task) {
switch (task.status) {
case 'FAIL':
case 'READY':
case 'INVALID':
return this._getTaskDescription(task);
}
},
_computeIcon(task) {
const icon = {};
switch (task.status) {
case 'FAIL':
icon.id = 'gr-icons:close';
icon.color = 'red';
icon.tooltip = 'Blocked';
break;
case 'READY':
icon.id = 'gr-icons:check';
icon.color = 'green';
icon.tooltip = 'Needs';
break;
}
return icon;
},
_addTasks(tasks) { // rename to process, remove DOM bits
if (!tasks) return [];
tasks.forEach(task => {
task.message = this._computeMessage(task);
task.icon = this._computeIcon(task);
this._addTasks(task.sub_tasks);
});
return tasks;
},
});
})();