import { BomRegion } from "@arrow/bom/core"; export class BomPreviewModel { id: string; fileName: string; name: string; /** * File size with notation (in user friendly form) */ fileSize: any; /** * File size in number of bytes */ fileSizeBytes: number; numberOfLines: number; headerRow: number; dataRow: number; sheetData: Array = []; sheetList: Array = []; sheetName: string; rows: Array = []; headers: Array = []; columns: Array = []; colAmount: number; maxValue: number = 25; metadata: any; sheetStats: any; bomRegions: BomRegion[]; constructor(data: any) { this.id = data.jsonId; // strips the file type to get only the file name this.name = data.metadata.fileName; // convert file size number to data unit string this.fileSize = this.fileSizeConverter(data.metadata.fileSizeInBytes); this.fileSizeBytes = data.metadata.fileSizeInBytes; this.sheetData = data.previews; // get list of xml sheets this.sheetList = Object.keys(this.sheetData); // set first sheet as default view this.sheetName = this.sheetList[0]; this.metadata = data.metadata; this._refreshSheetStats(); this.rows = this.sheetData[this.sheetName]; this.columns = data.columns; this.headerRow = 1; this.dataRow = this.findDataRow(this.rows); // once everything is setup, update view this.bomRegions = data.bomRegions; this.update(); } private _refreshSheetStats(): void { const sheetStats = this.metadata.sheets .filter((s: any) => { return s.sheetName === this.sheetName; }) .pop(); this.numberOfLines = sheetStats.rows; this.colAmount = sheetStats.columns; } /** * Converts a number to its data unit string equivalent. * @param bytes Number to be converted. */ fileSizeConverter(bytes: number): string { const units = [' bytes', 'k', 'm', 'g']; let unit = 0; while (bytes >= 1024) { bytes /= 1024; unit++; } return bytes.toFixed() + units[unit]; } /** * Searches data object to find the next row with valid data, then return the index of the element. * Only runs at instantiation. * @param data Array of rows of data. * @return number Index of data. */ findDataRow(data: Array): number { return data.findIndex(row => row.find((item: any) => { return item ? !!item.length : 0 })); } /** * Triggered by change of the sheet or row number change, updates preview view. */ update(): void { this._refreshSheetStats(); this.rows = this.sheetData[this.sheetName]; this.headers = this.rows[this.headerRow - 1]; } }