| // Copyright 2023 The Chromium Authors |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| import {CustomElement} from '//resources/js/custom_element.js'; |
| import {getTrustedHTML} from '//resources/js/static_types.js'; |
| |
| import {getTemplate} from './diagnose_info_table.html.js'; |
| |
| export class DiagnoseInfoTableElement extends CustomElement { |
| static get is() { |
| return 'diagnose-info-table'; |
| } |
| |
| static override get template() { |
| return getTemplate(); |
| } |
| |
| private tableTitle_: HTMLElement; |
| private tableHead_: HTMLElement; |
| private tableBody_: HTMLElement; |
| private tableFooter_: HTMLElement; |
| private lastTableEntries_: Array<Record<string, string>>; |
| |
| constructor() { |
| super(); |
| this.tableTitle_ = this.getRequiredElement('caption#table-title'); |
| this.tableHead_ = this.getRequiredElement('thead'); |
| this.tableBody_ = this.getRequiredElement('tbody'); |
| this.tableFooter_ = this.getRequiredElement('caption#table-footer'); |
| this.style.display = 'none'; |
| this.lastTableEntries_ = []; |
| } |
| |
| hideTable() { |
| this.style.display = 'none'; |
| this.tableTitle_.textContent = ''; |
| this.tableHead_.innerHTML = getTrustedHTML``; |
| this.tableBody_.innerHTML = getTrustedHTML``; |
| this.tableFooter_.textContent = ''; |
| } |
| |
| visible(): boolean { |
| return !(this.style.display === 'none'); |
| } |
| |
| updateTable( |
| tableName: string, entries: Array<Record<string, string>>, |
| footer: string|undefined = undefined) { |
| if (entries.length === 0) { |
| this.hideTable(); |
| return; |
| } |
| this.lastTableEntries_ = entries; |
| this.style.display = 'block'; |
| this.tableTitle_.textContent = tableName; |
| this.tableHead_.innerHTML = getTrustedHTML``; |
| this.tableBody_.innerHTML = getTrustedHTML``; |
| const tableHeadFirstRow = document.createElement('tr'); |
| this.tableHead_.appendChild(tableHeadFirstRow); |
| for (let i: number = 0; i < entries.length; i++) { |
| const entry = entries[i]; |
| const tableBodyRow = document.createElement('tr'); |
| for (const fieldName in entry) { |
| if (i === 0) { |
| const nameCell = document.createElement('th'); |
| nameCell.textContent = fieldName; |
| tableHeadFirstRow.appendChild(nameCell); |
| } |
| const valueCell = document.createElement('td'); |
| valueCell.textContent = entry[fieldName]!; |
| tableBodyRow.appendChild(valueCell); |
| } |
| this.tableBody_.appendChild(tableBodyRow); |
| } |
| if (footer === undefined) { |
| this.tableFooter_.textContent = ''; |
| } else { |
| this.tableFooter_.textContent = footer; |
| } |
| } |
| |
| outputTable(): Record<string, any> { |
| const table: Record<string, any> = {}; |
| const name = this.tableTitle_.textContent; |
| table[name!] = this.lastTableEntries_; |
| return table; |
| } |
| } |
| |
| declare global { |
| interface HTMLElementTagNameMap { |
| 'diagnose-info-table': DiagnoseInfoTableElement; |
| } |
| } |
| |
| customElements.define(DiagnoseInfoTableElement.is, DiagnoseInfoTableElement); |