// Copyright (c) Microsoft Corporation. All rights reserved. Licensed under the MIT license. // See LICENSE in the project root for license information. import { IDocNodeParameters, DocNode } from '@microsoft/tsdoc'; import { CustomDocNodeKind } from './CustomDocNodeKind'; import { DocTableRow } from './DocTableRow'; import { DocTableCell } from './DocTableCell'; /** * Constructor parameters for {@link DocTable}. */ export interface IDocTableParameters extends IDocNodeParameters { headerCells?: ReadonlyArray; headerTitles?: string[]; cssClass?: string; caption?: string; } /** * Represents table, similar to an HTML `` element. */ export class DocTable extends DocNode { public readonly header: DocTableRow; public cssClass?: string; public caption?: string; private _rows: DocTableRow[]; public constructor(parameters: IDocTableParameters, rows?: ReadonlyArray) { super(parameters); this.header = new DocTableRow({ configuration: this.configuration }); this._rows = []; if (parameters) { this.cssClass = parameters.cssClass; this.caption = parameters.caption; if (parameters.headerTitles) { if (parameters.headerCells) { throw new Error( 'IDocTableParameters.headerCells and IDocTableParameters.headerTitles' + ' cannot both be specified' ); } for (const cellText of parameters.headerTitles) { this.header.addPlainTextCell(cellText); } } else if (parameters.headerCells) { for (const cell of parameters.headerCells) { this.header.addCell(cell); } } } if (rows) { for (const row of rows) { this.addRow(row); } } } /** @override */ public get kind(): string { return CustomDocNodeKind.Table; } public get rows(): ReadonlyArray { return this._rows; } public addRow(row: DocTableRow): void { this._rows.push(row); } public createAndAddRow(): DocTableRow { const row: DocTableRow = new DocTableRow({ configuration: this.configuration }); this.addRow(row); return row; } /** @override */ protected onGetChildNodes(): ReadonlyArray { return [this.header, ...this._rows]; } }