| /** |
| * @fileoverview The bulk of the Runs History page. |
| */ |
| |
| import '../../../elements-sk/modules/tabs-sk'; |
| |
| import { html } from 'lit-html'; |
| import { DomReady } from '../../../infra-sk/modules/dom'; |
| import { fromObject } from '../../../infra-sk/modules/query'; |
| import { jsonOrThrow } from '../../../infra-sk/modules/jsonOrThrow'; |
| import { define } from '../../../elements-sk/modules/define'; |
| import { errorMessage } from '../../../elements-sk/modules/errorMessage'; |
| |
| import { ElementSk } from '../../../infra-sk/modules/ElementSk'; |
| import { getCtDbTimestamp } from '../ctfe_utils'; |
| |
| import { CompletedTask, CompletedTaskResponse } from '../json'; |
| |
| export class RunsHistorySummarySk extends ElementSk { |
| private _tasks: CompletedTask[] = []; |
| |
| private _uniqueUsers: number = 0; |
| |
| private _period: number = 0; |
| |
| constructor() { |
| super(RunsHistorySummarySk.template); |
| } |
| |
| private static template = (el: RunsHistorySummarySk) => html` |
| <div> |
| <h4>CT Runs Summary</h4> |
| <tabs-sk |
| @tab-selected-sk=${(e: CustomEvent) => |
| (el.period = [7, 30, 365, 0][e.detail.index])}> |
| <button>Last Week</button> |
| <button>Last Month</button> |
| <button>Last Year</button> |
| <button>All Time</button> |
| </tabs-sk> |
| <br /><br /> |
| <span> |
| ${el._tasks.length} runs by ${el._uniqueUsers} users |
| ${el.period > 0 ? `last ${el.period} days` : 'all time'} |
| </span> |
| <br /> |
| <table |
| class="queue surface-themes-sk secondary-links runssummary" |
| id="runssummary"> |
| <tr> |
| <th>Type</th> |
| <th>User</th> |
| <th>Description</th> |
| <th>Completed</th> |
| </tr> |
| ${el._tasks.map((task: CompletedTask) => |
| RunsHistorySummarySk.taskRowTemplate(task) |
| )} |
| </table> |
| </div> |
| `; |
| |
| private static taskRowTemplate = (task: CompletedTask) => html` |
| <tr> |
| <td>${task.type}</td> |
| <td>${task.username}</td> |
| <td>${task.description}</td> |
| <td class="nowrap">${task.ts_completed}</td> |
| </tr> |
| `; |
| |
| connectedCallback(): void { |
| super.connectedCallback(); |
| // We wait for everything to load so scaffolding event handlers are |
| // attached. |
| DomReady.then(() => { |
| this.period = 7; // kicks off the reload. |
| }); |
| } |
| |
| /** |
| * @prop {Number} period - Number of days to look back for tasks. |
| */ |
| get period(): number { |
| return this._period; |
| } |
| |
| set period(val: number) { |
| this._period = val; |
| this._reload(); |
| } |
| |
| _reload(): void { |
| this.dispatchEvent(new CustomEvent('begin-task', { bubbles: true })); |
| let completedAfter; |
| if (this._period > 0) { |
| const d = new Date(); |
| d.setDate(d.getDate() - this._period); |
| completedAfter = getCtDbTimestamp(d); |
| } else { |
| completedAfter = getCtDbTimestamp(new Date(0)); |
| } |
| |
| const queryParams = { |
| completed_after: completedAfter, |
| exclude_ctadmin_tasks: true, |
| }; |
| fetch(`/_/completed_tasks?${fromObject(queryParams)}`, { method: 'POST' }) |
| .then(jsonOrThrow) |
| .then((json: CompletedTaskResponse) => { |
| this._tasks = json.completed_tasks!; |
| this._uniqueUsers = json.unique_users; |
| }) |
| .catch((e) => { |
| errorMessage(e); |
| }) |
| .finally(() => { |
| this._render(); |
| this.dispatchEvent(new CustomEvent('end-task', { bubbles: true })); |
| }); |
| } |
| } |
| |
| define('runs-history-summary-sk', RunsHistorySummarySk); |