UNPKG

ngx-export-as

Version:

[![npm version](https://badge.fury.io/js/ngx-export-as.svg)](https://badge.fury.io/js/ngx-export-as)

1 lines 21.8 kB
{"version":3,"file":"ngx-export-as.mjs","sources":["../../../projects/ngx-export-as/src/lib/export-as.service.ts","../../../projects/ngx-export-as/src/lib/export-as.module.ts","../../../projects/ngx-export-as/src/public_api.ts","../../../projects/ngx-export-as/src/ngx-export-as.ts"],"sourcesContent":["import { Inject, Injectable, PLATFORM_ID } from '@angular/core';\nimport { Observable } from 'rxjs';\n\nimport { ExportAsConfig } from './export-as-config.model';\n\nimport html2canvas from 'html2canvas';\nimport * as XLSX from 'xlsx';\n// import HTMLtoDOCX from 'html-to-docx';\nimport html2pdf from 'html2pdf.js';\nimport { isPlatformBrowser } from '@angular/common';\n\n@Injectable()\nexport class ExportAsService {\n\n constructor(\n @Inject(PLATFORM_ID) private platformId: Object\n ) {\n if (isPlatformBrowser(this.platformId)) {\n window['html2canvas'] = html2canvas;\n }\n }\n\n /**\n * Main base64 get method, it will return the file as base64 string\n * @param config your config\n */\n get(config: ExportAsConfig): Observable<string | null> {\n // structure method name dynamically by type\n const func = 'get' + config.type.toUpperCase();\n // if type supported execute and return\n if (this[func]) {\n return this[func](config);\n }\n\n // throw error for unsupported formats\n return new Observable((observer) => { observer.error('Export type is not supported.'); });\n }\n\n /**\n * Save exported file in old javascript way\n * @param config your custom config\n * @param fileName Name of the file to be saved as\n */\n save(config: ExportAsConfig, fileName: string): Observable<string | null> {\n // set download\n config.download = true;\n // get file name with type\n config.fileName = fileName + '.' + config.type;\n return this.get(config);\n }\n\n /**\n * Converts content string to blob object\n * @param content string to be converted\n */\n contentToBlob(content: string): Observable<Blob> {\n return new Observable((observer) => {\n // get content string and extract mime type\n const arr = content.split(','), mime = arr[0].match(/:(.*?);/)[1],\n bstr = atob(arr[1]);\n let n = bstr.length;\n const u8arr = new Uint8Array(n);\n while (n--) {\n u8arr[n] = bstr.charCodeAt(n);\n }\n observer.next(new Blob([u8arr], { type: mime }));\n observer.complete();\n });\n }\n\n /**\n * Removes base64 file type from a string like \"data:text/csv;base64,\"\n * @param fileContent the base64 string to remove the type from\n */\n removeFileTypeFromBase64(fileContent: string): string {\n const re = /^data:[^]*;base64,/g;\n const newContent: string = re[Symbol.replace](fileContent, '');\n return newContent;\n }\n\n /**\n * Structure the base64 file content with the file type string\n * @param fileContent file content\n * @param fileMime file mime type \"text/csv\"\n */\n addFileTypeToBase64(fileContent: string, fileMime: string): string {\n return `data:${fileMime};base64,${fileContent}`;\n }\n\n /**\n * create downloadable file from dataURL\n * @param fileName downloadable file name\n * @param dataURL file content as dataURL\n */\n downloadFromDataURL(fileName: string, dataURL: string): void {\n // create blob\n this.contentToBlob(dataURL).subscribe(blob => {\n // download the blob\n this.downloadFromBlob(blob, fileName);\n });\n }\n\n /**\n * Downloads the blob object as a file\n * @param blob file object as blob\n * @param fileName downloadable file name\n */\n downloadFromBlob(blob: Blob, fileName: string) {\n // get object url\n const url = window.URL.createObjectURL(blob);\n // check for microsoft internet explorer\n if (window.navigator && window.navigator['msSaveOrOpenBlob']) {\n // use IE download or open if the user using IE\n window.navigator['msSaveOrOpenBlob'](blob, fileName);\n } else {\n this.saveFile(fileName, url);\n }\n }\n\n private saveFile(fileName: string, url: string) {\n // if not using IE then create link element\n const element = document.createElement('a');\n // set download attr with file name\n element.setAttribute('download', fileName);\n // set the element as hidden\n element.style.display = 'none';\n // append the body\n document.body.appendChild(element);\n // set href attr\n element.href = url;\n // click on it to start downloading\n element.click();\n // remove the link from the dom\n document.body.removeChild(element);\n }\n\n private getPDF(config: ExportAsConfig): Observable<string | null> {\n return new Observable((observer) => {\n if (!config.options) {\n config.options = {};\n }\n config.options.filename = config.fileName;\n const element: HTMLElement = document.getElementById(config.elementIdOrContent);\n const pdf = html2pdf().set(config.options).from(element ? element : config.elementIdOrContent);\n\n const download = config.download;\n const pdfCallbackFn = config.options.pdfCallbackFn;\n if (download) {\n if (pdfCallbackFn) {\n this.applyPdfCallbackFn(pdf, pdfCallbackFn).save();\n } else {\n pdf.save();\n }\n observer.next(null);\n observer.complete();\n } else {\n if (pdfCallbackFn) {\n this.applyPdfCallbackFn(pdf, pdfCallbackFn).outputPdf('datauristring').then(data => {\n observer.next(data);\n observer.complete();\n });\n } else {\n pdf.outputPdf('datauristring').then(data => {\n observer.next(data);\n observer.complete();\n });\n }\n }\n });\n }\n\n private applyPdfCallbackFn(pdf, pdfCallbackFn) {\n return pdf.toPdf().get('pdf').then((pdfRef) => {\n pdfCallbackFn(pdfRef);\n });\n }\n\n private getPNG(config: ExportAsConfig): Observable<string | null> {\n return new Observable((observer) => {\n const element: HTMLElement = document.getElementById(config.elementIdOrContent);\n html2canvas(element, config.options).then((canvas) => {\n const imgData = canvas.toDataURL('image/PNG');\n if (config.type === 'png' && config.download) {\n this.downloadFromDataURL(config.fileName, imgData);\n observer.next(null);\n } else {\n observer.next(imgData);\n }\n observer.complete();\n }, err => {\n observer.error(err);\n });\n });\n }\n\n private getCSV(config: ExportAsConfig): Observable<string | null> {\n return new Observable((observer) => {\n const element: HTMLElement = document.getElementById(config.elementIdOrContent);\n const csv = [];\n const rows: any = element.querySelectorAll('table tr');\n for (let index = 0; index < rows.length; index++) {\n const rowElement = rows[index];\n const row = [];\n const cols = rowElement.querySelectorAll('td, th');\n for (let colIndex = 0; colIndex < cols.length; colIndex++) {\n const col = cols[colIndex];\n row.push('\"'+col.innerText+'\"');\n }\n csv.push(row.join(','));\n }\n const csvContent = 'data:text/csv;base64,' + this.btoa(csv.join('\\n'));\n if (config.download) {\n this.downloadFromDataURL(config.fileName, csvContent);\n observer.next(null);\n } else {\n observer.next(csvContent);\n }\n observer.complete();\n });\n }\n\n private getTXT(config: ExportAsConfig): Observable<string | null> {\n const nameFrags = config.fileName.split('.');\n config.fileName = `${nameFrags[0]}.txt`;\n return this.getCSV(config);\n }\n\n private getXLS(config: ExportAsConfig): Observable<string | null> {\n return new Observable((observer) => {\n\n const element: HTMLElement = document.getElementById(config.elementIdOrContent);\n const ws3 = XLSX.utils.table_to_sheet(element, config.options);\n const wb = XLSX.utils.book_new();\n XLSX.utils.book_append_sheet(wb, ws3, config.fileName);\n const out = XLSX.write(wb, { type: 'base64' });\n const xlsContent = 'data:application/vnd.openxmlformats-officedocument.spreadsheetml.sheet;base64,' + out;\n if (config.download) {\n this.downloadFromDataURL(config.fileName, xlsContent);\n observer.next(null);\n } else {\n observer.next(xlsContent);\n }\n observer.complete();\n });\n }\n\n private getXLSX(config: ExportAsConfig): Observable<string | null> {\n return this.getXLS(config);\n }\n\n // private getDOCX(config: ExportAsConfig): Observable<string | null> {\n // return new Observable((observer) => {\n // const contentDocument: string = document.getElementById(config.elementIdOrContent).outerHTML;\n // const content = '<!DOCTYPE html>' + contentDocument;\n // HTMLtoDOCX(content, null, config.options).then(converted => {\n // if (config.download) {\n // this.downloadFromBlob(converted, config.fileName);\n // observer.next();\n // observer.complete();\n // } else {\n // const reader = new FileReader();\n // reader.onloadend = () => {\n // const base64data = reader.result as string;\n // observer.next(base64data);\n // observer.complete();\n // };\n // reader.readAsDataURL(converted);\n // }\n // });\n // });\n // }\n\n // private getDOC(config: ExportAsConfig): Observable<string | null> {\n // return this.getDOCX(config);\n // }\n\n private getJSON(config: ExportAsConfig): Observable<any[] | null> {\n return new Observable((observer) => {\n const data = []; // first row needs to be headers\n const headers = [];\n const table = <HTMLTableElement>document.getElementById(config.elementIdOrContent);\n for (let index = 0; index < table.rows[0].cells.length; index++) {\n headers[index] = table.rows[0].cells[index].innerHTML.toLowerCase().replace(/ /gi, '');\n }\n // go through cells\n for (let i = 1; i < table.rows.length; i++) {\n const tableRow = table.rows[i]; const rowData = {};\n for (let j = 0; j < tableRow.cells.length; j++) {\n rowData[headers[j]] = tableRow.cells[j].innerHTML;\n }\n data.push(rowData);\n }\n const jsonString = JSON.stringify(data);\n const jsonBase64 = this.btoa(jsonString);\n const dataStr = 'data:text/json;base64,' + jsonBase64;\n if (config.download) {\n this.downloadFromDataURL(config.fileName, dataStr);\n observer.next(null);\n } else {\n observer.next(data);\n }\n observer.complete();\n });\n }\n\n private getXML(config: ExportAsConfig): Observable<string | null> {\n return new Observable((observer) => {\n let xml = '<?xml version=\"1.0\" encoding=\"UTF-8\"?><Root><Classes>';\n const tritem = document.getElementById(config.elementIdOrContent).getElementsByTagName('tr');\n for (let i = 0; i < tritem.length; i++) {\n const celldata = tritem[i];\n if (celldata.cells.length > 0) {\n xml += '<Class name=\"' + celldata.cells[0].textContent + '\">\\n';\n for (let m = 1; m < celldata.cells.length; ++m) {\n xml += '\\t<data>' + celldata.cells[m].textContent + '</data>\\n';\n }\n xml += '</Class>\\n';\n }\n }\n xml += '</Classes></Root>';\n const base64 = 'data:text/xml;base64,' + this.btoa(xml);\n if (config.download) {\n this.downloadFromDataURL(config.fileName, base64);\n observer.next(null);\n } else {\n observer.next(base64);\n }\n observer.complete();\n });\n }\n\n private btoa(content: string) {\n return btoa(unescape(encodeURIComponent(content)));\n }\n\n}\n","/**\n * angular imports\n */\nimport { NgModule } from '@angular/core';\n\n/**\n * my imports\n */\nimport { ExportAsService } from './export-as.service';\n\n@NgModule({\n providers: [ExportAsService],\n})\nexport class ExportAsModule { }\n\n\n","/*\n * Public API Surface of ngx-export-as\n */\n\nexport * from './lib/export-as.service';\nexport * from './lib/export-as-config.model';\nexport * from './lib/export-as.module';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public_api';\n"],"names":[],"mappings":"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"}