diff --git a/src/file/document/document.spec.ts b/src/file/document/document.spec.ts index fb8831c381..c4ecad66bb 100644 --- a/src/file/document/document.spec.ts +++ b/src/file/document/document.spec.ts @@ -59,7 +59,10 @@ describe("Document", () => { describe("#createTable", () => { it("should create a new table and append it to body", () => { - const table = document.createTable(2, 3); + const table = document.createTable({ + rows: 2, + columns: 3, + }); expect(table).to.be.an.instanceof(Table); const body = new Formatter().format(document)["w:document"][1]["w:body"]; expect(body) @@ -69,7 +72,10 @@ describe("Document", () => { }); it("should create a table with the correct dimensions", () => { - document.createTable(2, 3); + document.createTable({ + rows: 2, + columns: 3, + }); const body = new Formatter().format(document)["w:document"][1]["w:body"]; expect(body) .to.be.an("array") diff --git a/src/file/document/document.ts b/src/file/document/document.ts index 5ca48ccb50..e9a0e71c27 100644 --- a/src/file/document/document.ts +++ b/src/file/document/document.ts @@ -1,7 +1,7 @@ // http://officeopenxml.com/WPdocument.php import { XmlComponent } from "file/xml-components"; import { Paragraph } from "../paragraph"; -import { Table } from "../table"; +import { ITableOptions, Table } from "../table"; import { TableOfContents } from "../table-of-contents"; import { Body } from "./body"; import { SectionPropertiesOptions } from "./body/section-properties"; @@ -58,8 +58,8 @@ export class Document extends XmlComponent { return this; } - public createTable(rows: number, cols: number): Table { - const table = new Table(rows, cols); + public createTable(options: ITableOptions): Table { + const table = new Table(options); this.addTable(table); return table; } diff --git a/src/file/file.spec.ts b/src/file/file.spec.ts index f8e2ca9077..0d28459f2a 100644 --- a/src/file/file.spec.ts +++ b/src/file/file.spec.ts @@ -93,7 +93,12 @@ describe("File", () => { it("should call the underlying document's addTable", () => { const wrapper = new File(); const spy = sinon.spy(wrapper.Document, "addTable"); - wrapper.addTable(new Table(1, 1)); + wrapper.addTable( + new Table({ + rows: 1, + columns: 1, + }), + ); expect(spy.called).to.equal(true); }); @@ -103,7 +108,10 @@ describe("File", () => { it("should call the underlying document's createTable", () => { const wrapper = new File(); const spy = sinon.spy(wrapper.Document, "createTable"); - wrapper.createTable(1, 1); + wrapper.createTable({ + rows: 1, + columns: 1, + }); expect(spy.called).to.equal(true); }); diff --git a/src/file/file.ts b/src/file/file.ts index 0d8a6a0b3d..f6cf109b94 100644 --- a/src/file/file.ts +++ b/src/file/file.ts @@ -24,7 +24,7 @@ import { Settings } from "./settings"; import { Styles } from "./styles"; import { ExternalStylesFactory } from "./styles/external-styles-factory"; import { DefaultStylesFactory } from "./styles/factory"; -import { Table } from "./table"; +import { ITableOptions, Table } from "./table"; import { TableOfContents } from "./table-of-contents"; export class File { @@ -131,8 +131,8 @@ export class File { return this; } - public createTable(rows: number, cols: number): Table { - return this.document.createTable(rows, cols); + public createTable(options: ITableOptions): Table { + return this.document.createTable(options); } public addImage(image: Image): File { diff --git a/src/file/footer-wrapper.spec.ts b/src/file/footer-wrapper.spec.ts index e1942bc7a4..c7bc5564fa 100644 --- a/src/file/footer-wrapper.spec.ts +++ b/src/file/footer-wrapper.spec.ts @@ -21,7 +21,12 @@ describe("FooterWrapper", () => { it("should call the underlying footer's addParagraph", () => { const file = new FooterWrapper(new Media(), 1); const spy = sinon.spy(file.Footer, "addTable"); - file.addTable(new Table(1, 1)); + file.addTable( + new Table({ + rows: 1, + columns: 1, + }), + ); expect(spy.called).to.equal(true); }); diff --git a/src/file/footer/footer.ts b/src/file/footer/footer.ts index 0aa5938d0b..6934447d83 100644 --- a/src/file/footer/footer.ts +++ b/src/file/footer/footer.ts @@ -53,7 +53,10 @@ export class Footer extends InitializableXmlComponent { } public createTable(rows: number, cols: number): Table { - const table = new Table(rows, cols); + const table = new Table({ + rows: rows, + columns: cols, + }); this.addTable(table); return table; } diff --git a/src/file/header-wrapper.spec.ts b/src/file/header-wrapper.spec.ts index f7d73c39cc..c457753ced 100644 --- a/src/file/header-wrapper.spec.ts +++ b/src/file/header-wrapper.spec.ts @@ -21,7 +21,12 @@ describe("HeaderWrapper", () => { it("should call the underlying header's addTable", () => { const wrapper = new HeaderWrapper(new Media(), 1); const spy = sinon.spy(wrapper.Header, "addTable"); - wrapper.addTable(new Table(1, 1)); + wrapper.addTable( + new Table({ + rows: 1, + columns: 1, + }), + ); expect(spy.called).to.equal(true); }); diff --git a/src/file/header/header.ts b/src/file/header/header.ts index a7c352b367..a812b1b453 100644 --- a/src/file/header/header.ts +++ b/src/file/header/header.ts @@ -64,7 +64,10 @@ export class Header extends InitializableXmlComponent { } public createTable(rows: number, cols: number): Table { - const table = new Table(rows, cols); + const table = new Table({ + rows: rows, + columns: cols, + }); this.addTable(table); return table; } diff --git a/src/file/table/table-row/table-row.ts b/src/file/table/table-row/table-row.ts index b7c4e38fa2..6e091abffd 100644 --- a/src/file/table/table-row/table-row.ts +++ b/src/file/table/table-row/table-row.ts @@ -13,8 +13,8 @@ export class TableRow extends XmlComponent { cells.forEach((c) => this.root.push(c)); } - public getCell(ix: number): TableCell { - const cell = this.cells[ix]; + public getCell(index: number): TableCell { + const cell = this.cells[index]; if (!cell) { throw Error("Index out of bounds when trying to get cell on row"); diff --git a/src/file/table/table.ts b/src/file/table/table.ts index f45422a110..6c7de2e950 100644 --- a/src/file/table/table.ts +++ b/src/file/table/table.ts @@ -21,31 +21,62 @@ export interface IWidthOptions { readonly type?: WidthType; } +export interface ITableOptions { + readonly rows: number; + readonly columns: number; + readonly width?: number; + readonly widthUnitType?: WidthType; + readonly columnWidths?: number[]; + readonly margains?: { + readonly margainUnitType?: WidthType; + readonly top?: number; + readonly bottom?: number; + readonly right?: number; + readonly left?: number; + }; + readonly float?: ITableFloatOptions; +} + export class Table extends XmlComponent { private readonly properties: TableProperties; private readonly rows: TableRow[]; - constructor( - rowCount: number, - columnCount: number, - widthOptions: IWidthOptions = { width: 100, type: WidthType.AUTO }, - colSizes: number[] = Array(columnCount).fill(100), - ) { + constructor({ + rows, + columns, + width = 100, + widthUnitType = WidthType.AUTO, + columnWidths = Array(columns).fill(100), + margains: { margainUnitType, top, bottom, right, left } = { margainUnitType: WidthType.AUTO, top: 0, bottom: 0, right: 0, left: 0 }, + float, + }: ITableOptions) { super("w:tbl"); this.properties = new TableProperties(); this.root.push(this.properties); this.properties.setBorder(); - this.properties.setWidth(widthOptions.width, widthOptions.type); - const grid = new TableGrid(colSizes); + this.properties.setWidth(width, widthUnitType); + this.properties.CellMargin.addBottomMargin(bottom || 0, margainUnitType); + this.properties.CellMargin.addTopMargin(top || 0, margainUnitType); + this.properties.CellMargin.addLeftMargin(left || 0, margainUnitType); + this.properties.CellMargin.addRightMargin(right || 0, margainUnitType); + const grid = new TableGrid(columnWidths); this.root.push(grid); - this.rows = []; - for (let i = 0; i < rowCount; i++) { - const cells = Array(columnCount).fill(new TableCell()); - const row = new TableRow(cells); - this.rows.push(row); - this.root.push(row); + this.rows = Array(rows) + .fill(0) + .map(() => { + const cells = Array(columns) + .fill(0) + .map(() => new TableCell()); + const row = new TableRow(cells); + return row; + }); + + this.rows.forEach((x) => this.root.push(x)); + + if (float) { + this.properties.setTableFloatProperties(float); } }