| // Copyright 2022 The Chromium Authors |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| export interface Column<T> { |
| compare: ((a: T, b: T) => number)|null; |
| |
| render(td: HTMLElement, row: T): void; |
| |
| renderHeader(th: HTMLElement): void; |
| |
| header: string|null; |
| } |
| |
| export class TableModel<T> { |
| cols: Array<Column<T>> = []; |
| emptyRowText: string = ''; |
| sortIdx: number = -1; |
| rowsChangedListeners: Set<() => void>; |
| |
| constructor() { |
| this.rowsChangedListeners = new Set(); |
| } |
| |
| styleRow(_tr: Element, _data: T) {} |
| |
| getRows(): T[] { |
| return []; |
| } |
| |
| notifyRowsChanged() { |
| this.rowsChangedListeners.forEach(f => f()); |
| } |
| } |