import { Injectable } from "@angular/core"; import { TranslateService } from "@ngx-translate/core"; import { ColumnType, TableColumn} from "../../models"; import moment from 'moment'; import { TrueFalsePipe } from "../../pipes"; @Injectable() export class CsvExportService { constructor(private translateService: TranslateService, private trueFalsePipe: TrueFalsePipe) {} private downloadCSV(csv: BlobPart, filename: string) { let csvFile: Blob; let downloadLink: HTMLAnchorElement; csvFile = new Blob([csv], { type: 'text/csv' }); downloadLink = document.createElement('a'); downloadLink.download = filename; downloadLink.href = window.URL.createObjectURL(csvFile); downloadLink.style.display = 'none'; document.body.appendChild(downloadLink); downloadLink.click(); document.body.removeChild(downloadLink); } exportTableToCsv(displayedColumns: TableColumn[], displayedRows: any[], exportFileName: string) { const csv = []; const date = new Date(); const filename = `${exportFileName}_${moment().format(moment.HTML5_FMT.DATETIME_LOCAL_MS)}.csv`; for (let i = 0; i < displayedRows.length; i++) { let row = []; if (i === 0) { for (let m = 0; m < displayedColumns.length; m++) { if (displayedColumns[m].label) { row.push(this.getTranslatedText(displayedColumns[m].label)); } else { row.push('') } } csv.push(row.join(',')); row = []; } for (let j = 0; j < displayedColumns.length; j++) { const val = displayedRows[i][displayedColumns[j].prop]; const r = displayedRows[i]; const c = displayedColumns[j]; const temp = this.exportTableRow(r, c, val); row.push(`"${temp}"`); } csv.push(row.join(',')) } this.downloadCSV(csv.join('\n'), filename); } private exportTableRow(row: any, column: TableColumn, value: any) { if (value == null) { return ''; } switch (column.columnType) { case ColumnType.TEXT: return this.getTranslatedText(value); case ColumnType.NUMBER: return value; case ColumnType.BOOLEAN: return this.getTranslatedText(this.trueFalsePipe.transform(value, column.booleanFormat)); default: return this.getTranslatedText(value); } } private getTranslatedText(value: string): string { if (value == null || value == '') { return ''; } return this.translateService.instant(value) } }