ngx-gem-spaas
Version:
This library contains services, components, images and styles to provide a unified look and way-of-working throughout GEM SPaaS.
1 lines • 27.1 kB
Source Map (JSON)
{"version":3,"file":"ngx-gem-spaas-excel.mjs","sources":["../../../projects/ngx-gem-spaas/excel/src/_services/excel.service.ts","../../../projects/ngx-gem-spaas/excel/src/excel-export/excel-export.component.ts","../../../projects/ngx-gem-spaas/excel/src/excel-export/excel-export.component.html","../../../projects/ngx-gem-spaas/excel/src/excel-import/excel-import.component.ts","../../../projects/ngx-gem-spaas/excel/src/excel-import/excel-import.component.html","../../../projects/ngx-gem-spaas/excel/src/excel.module.ts","../../../projects/ngx-gem-spaas/excel/src/_models/excel.model.ts","../../../projects/ngx-gem-spaas/excel/src/public-api.ts","../../../projects/ngx-gem-spaas/excel/src/ngx-gem-spaas-excel.ts"],"sourcesContent":["import * as ExcelJS from 'exceljs';\r\nimport {saveAs} from 'file-saver';\r\nimport {Injectable} from '@angular/core';\r\nimport {SnackbarService, SettingsModel, SettingsService, UtilsService} from \"ngx-gem-spaas\";\r\nimport {ExcelSheetModel} from \"../_models/excel.model\";\r\n\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class ExcelService {\r\n\r\n private settings: SettingsModel;\r\n\r\n constructor(\r\n private settingsService: SettingsService,\r\n private snackbarService: SnackbarService,\r\n ) {\r\n this.settings = this.settingsService.getSettings();\r\n }\r\n\r\n exportFile(\r\n sheetsToExport: ExcelSheetModel[],\r\n fileName: string,\r\n colsToInclude: string[] = [],\r\n colsToExclude: string[] = [],\r\n isToStringify: boolean = false,\r\n ) {\r\n\r\n const workbook = new ExcelJS.Workbook();\r\n const sheetsCreated: string[] = [];\r\n\r\n for (const sheet of sheetsToExport) {\r\n\r\n // check that a sheet with the same name has not been created yet (throws an error in ExcelJS)\r\n if (!sheetsCreated.includes(sheet.sheetName)) {\r\n\r\n // IF NOT AN ARRAY THEN WRAP IN ARRAY\r\n let arrData = Array.isArray(sheet.sheetData) ? UtilsService.copy(sheet.sheetData) : UtilsService.copy([sheet.sheetData]);\r\n\r\n // SOME COLUMNS CONTAIN OBJECTS: STRINGIFY\r\n if (isToStringify) {\r\n for (const curData of arrData) {\r\n for (const curCol in curData) {\r\n if (curData.hasOwnProperty(curCol) && UtilsService.checkJSON(JSON.stringify(curData[curCol]))) {\r\n curData[curCol] = JSON.stringify(curData[curCol]);\r\n }\r\n }\r\n }\r\n }\r\n\r\n // add sheet\r\n const worksheet = workbook.addWorksheet(sheet.sheetName);\r\n\r\n // add headers\r\n let headers: string[] = colsToInclude?.length ? colsToInclude : Object.keys(sheet.sheetData[0]);\r\n if (colsToExclude?.length) {\r\n headers = headers.filter((h) => !colsToExclude.includes(h));\r\n }\r\n worksheet.addRow(headers);\r\n\r\n // add data\r\n for (const row of sheet.sheetData) {\r\n let r = [];\r\n for (const header of headers) {\r\n if (this.settings.exportExtension === 'csv' && this.settings.decimalSeparator === 'comma') {\r\n row[header] = typeof row[header] === 'number' ? ('' + row[header]).replace('.', ',') : row[header];\r\n }\r\n r.push(row[header]);\r\n }\r\n worksheet.addRow(r);\r\n }\r\n\r\n sheetsCreated.push(sheet.sheetName);\r\n\r\n } else {\r\n this.snackbarService.error(\r\n `Duplicate sheet names: a sheet with name \"${sheet.sheetName}\" has already been created!`\r\n )\r\n }\r\n\r\n }\r\n\r\n // CLEAN FILENAME\r\n const fName = fileName.replace(/ /g, '_');\r\n if (this.settings?.exportExtension === 'xlsx') {\r\n workbook.xlsx.writeBuffer()\r\n .then((buffer) => {\r\n saveAs(new Blob([buffer]), fName + '.' + this.settings.exportExtension)\r\n });\r\n } else {\r\n workbook.csv.writeBuffer(\r\n {formatterOptions: {delimiter: this.settings.getCsvDelimiter()}}\r\n ).then((buffer) => {\r\n saveAs(new Blob([buffer]), fName + '.' + this.settings.exportExtension)\r\n });\r\n }\r\n }\r\n\r\n}\r\n","import {Component, Input} from '@angular/core';\r\nimport {BaseComponent, SettingsModel, SettingsService} from \"ngx-gem-spaas\";\r\nimport {takeUntil} from \"rxjs/operators\";\r\nimport {ExcelService} from \"../_services/excel.service\";\r\nimport {ExcelSheetModel} from \"../_models/excel.model\";\r\n\r\n@Component({\r\n selector: 'spaas-excel-export',\r\n styleUrls: ['./excel-export.component.scss'],\r\n templateUrl: './excel-export.component.html',\r\n})\r\n\r\nexport class ExcelExportComponent extends BaseComponent {\r\n\r\n // TOOLTIP MESSAGE\r\n @Input() tooltipMsg = '';\r\n // FILENAME FOR THE EXCEL FILE\r\n @Input({required: true}) fileName = '';\r\n // DATE TO EXPORT\r\n @Input({required: true}) sheets: ExcelSheetModel[] = [];\r\n\r\n private settings: SettingsModel | null = null;\r\n\r\n constructor(\r\n private excelExportService: ExcelService,\r\n private settingsService: SettingsService,\r\n ) {\r\n super();\r\n this.getSettings();\r\n }\r\n\r\n // ********************************************************************************************************\r\n // LOAD DATA\r\n // ********************************************************************************************************\r\n\r\n private getSettings(): void {\r\n this.settingsService.onNewSettings()\r\n .pipe(takeUntil(this.onDestroy$))\r\n .subscribe((settings) => {\r\n this.settings = settings;\r\n if (!this.tooltipMsg) {\r\n // set default label\r\n this.tooltipMsg = 'export to ' + settings.exportExtension\r\n }\r\n });\r\n }\r\n\r\n // ********************************************************************************************************\r\n // DOM\r\n // ********************************************************************************************************\r\n\r\n // EVENT LISTENERS\r\n\r\n onExport(): void {\r\n if (!this.settings) {\r\n throw new Error(\r\n 'something is wrong with your library implementation: no settings received from settings.service'\r\n );\r\n }\r\n this.excelExportService.exportFile(\r\n this.sheets,\r\n this.fileName,\r\n );\r\n }\r\n\r\n\r\n}\r\n","<mat-icon (click)=\"onExport()\"\r\n fontIcon=\"download\"\r\n matTooltipPosition=\"below\"\r\n [matTooltip]=\"tooltipMsg\">\r\n</mat-icon>\r\n","import * as ExcelJS from 'exceljs';\r\nimport {Component, EventEmitter, Input, Output} from '@angular/core';\r\nimport {BaseComponent, SettingsModel, SettingsService, SnackbarService} from 'ngx-gem-spaas';\r\nimport {takeUntil} from \"rxjs/operators\";\r\nimport {ExcelSheetModel} from \"../_models/excel.model\";\r\n\r\n@Component({\r\n selector: 'spaas-excel-import',\r\n styleUrls: ['./excel-import.component.scss'],\r\n templateUrl: './excel-import.component.html',\r\n})\r\n\r\nexport class ExcelImportComponent extends BaseComponent {\r\n\r\n // TOOLTIP MESSAGE\r\n @Input() tooltipMsg = '';\r\n\r\n // EMIT THE IMPORTED SHEETS\r\n @Output() sheetsImported = new EventEmitter<ExcelSheetModel[]>();\r\n\r\n rawFileContent: ArrayBuffer | string | null = null;\r\n\r\n private settings: SettingsModel | null = null;\r\n\r\n private static parseWorksheet(\r\n worksheet: ExcelJS.Worksheet\r\n ): ExcelSheetModel {\r\n\r\n const newSheet: ExcelSheetModel = {sheetData: [], sheetName: worksheet.name};\r\n const sheetColumns: string[] = []\r\n\r\n worksheet.eachRow({includeEmpty: false}, (row, rowNumber) => {\r\n\r\n // set columns if not set yet\r\n // do not rely on rowNumber to define the first row (being zero or one), it's the actual row number in excel\r\n if (!sheetColumns.length) {\r\n // take column header values from first row as attributes for the rows\r\n row.eachCell({includeEmpty: true}, (cell, colNumber) => {\r\n sheetColumns.push('' + cell.value);\r\n });\r\n } else {\r\n // parse all other rows (so except the first one, which is considered to contain headers)\r\n let rowData: any = {};\r\n row.eachCell({includeEmpty: true}, (cell, colNumber) => {\r\n // colNumber is 1-based !!\r\n if (sheetColumns[colNumber - 1] !== 'null') {\r\n rowData[sheetColumns[colNumber - 1]] = cell.formula ? cell.result : cell.value;\r\n }\r\n });\r\n newSheet.sheetData.push(rowData);\r\n }\r\n });\r\n return newSheet;\r\n }\r\n\r\n constructor(\r\n private settingsService: SettingsService,\r\n private snackbarService: SnackbarService,\r\n ) {\r\n super();\r\n this.getSettings();\r\n }\r\n\r\n // ********************************************************************************************************\r\n // LOAD DATA\r\n // ********************************************************************************************************\r\n\r\n private getSettings(): void {\r\n this.settingsService.onNewSettings()\r\n .pipe(takeUntil(this.onDestroy$))\r\n .subscribe((settings) => {\r\n this.settings = settings;\r\n if (!this.tooltipMsg) {\r\n // set default label\r\n this.tooltipMsg = 'import from ' + settings.exportExtension\r\n }\r\n });\r\n }\r\n\r\n // ********************************************************************************************************\r\n // PROCESS DATA\r\n // ********************************************************************************************************\r\n\r\n readFile(e: any): void {\r\n this.rawFileContent = null;\r\n if (e?.target?.files && e.target.files.length === 1) {\r\n const file = e.target.files[0];\r\n // READ FILE IF EXCEL\r\n const reader = new FileReader();\r\n const isExcel = this.settings?.exportExtension === 'xlsx' && file.type.match('application/vnd.openxmlformats-officedocument.spreadsheetml.sheet');\r\n const isCsv = this.settings?.exportExtension === 'csv' && file.type.match('text/csv');\r\n\r\n if (isExcel) {\r\n\r\n reader.onloadend = () => {\r\n // RESET UPLOADER\r\n e.target.value = null;\r\n // THEN PROCESS RESULT\r\n this.rawFileContent = reader.result;\r\n if (this.rawFileContent) {\r\n this.parseExcel();\r\n } else {\r\n this.snackbarService.message('File does not contain valid data');\r\n }\r\n };\r\n reader.readAsArrayBuffer(file);\r\n\r\n } else if (isCsv) {\r\n\r\n reader.onloadend = () => {\r\n // RESET UPLOADER\r\n e.target.value = null;\r\n // THEN PROCESS RESULT\r\n this.rawFileContent = reader.result;\r\n if (this.rawFileContent) {\r\n this.parseCsv();\r\n } else {\r\n this.snackbarService.message('File does not contain valid data');\r\n }\r\n };\r\n reader.readAsText(file);\r\n\r\n } else {\r\n // neither a valid xlsx, nor a valid csv\r\n this.snackbarService.message(`File type not supported (should be .${this.settings?.exportExtension})`);\r\n }\r\n }\r\n }\r\n\r\n private parseExcel(): void {\r\n\r\n const sheets: ExcelSheetModel[] = [];\r\n const workBook = new ExcelJS.Workbook();\r\n let hasAnyData = false;\r\n\r\n workBook.xlsx.load(this.rawFileContent as Buffer)\r\n .then((wb) => {\r\n\r\n if (wb.worksheets.length) {\r\n\r\n wb.eachSheet((worksheet, sheetId) => {\r\n const newSheet: ExcelSheetModel = ExcelImportComponent.parseWorksheet(worksheet);\r\n hasAnyData = hasAnyData || newSheet.sheetData.length > 0;\r\n sheets.push(newSheet);\r\n });\r\n\r\n this.emitSheets(\r\n hasAnyData,\r\n sheets,\r\n )\r\n\r\n } else {\r\n this.snackbarService.error('Your file does not contain any sheets');\r\n }\r\n\r\n })\r\n .catch((reason) => {\r\n this.snackbarService.error('There was an error importing your file: ' + reason);\r\n return;\r\n })\r\n\r\n }\r\n\r\n private parseCsv(): void {\r\n\r\n const sheet: ExcelSheetModel = {sheetName: 'csv import', sheetData: []};\r\n let dataHeaders: string[] = [];\r\n const rows = ('' + this.rawFileContent).split('\\n') || [];\r\n\r\n for (const row of rows) {\r\n const cells = row.split(this.settings?.getCsvDelimiter() || ',');\r\n if (!dataHeaders.length) {\r\n // take first row with data as headers\r\n dataHeaders = cells;\r\n continue;\r\n }\r\n const newRow: any = {};\r\n for (let cellIdx = 0; cellIdx < cells.length; cellIdx++) {\r\n newRow[dataHeaders[cellIdx]] = cells[cellIdx];\r\n }\r\n sheet.sheetData.push(newRow);\r\n }\r\n\r\n this.emitSheets(\r\n sheet.sheetData.length > 0,\r\n [sheet],\r\n )\r\n\r\n }\r\n\r\n private emitSheets(\r\n hasAnyData: boolean,\r\n sheets: ExcelSheetModel[],\r\n ): void {\r\n if (!hasAnyData) {\r\n this.snackbarService.error('Your file does not contain any data, are you sure you uploaded the correct one?');\r\n } else {\r\n this.sheetsImported.emit(sheets.sort((a, b) => a.sheetName < b.sheetName ? -1 : 1));\r\n }\r\n }\r\n\r\n}\r\n","<label>\r\n <mat-icon [matTooltip]=\"tooltipMsg\"\r\n matTooltipPosition=\"below\"\r\n fontIcon=\"file_upload\">\r\n </mat-icon>\r\n <input type=\"file\"\r\n (change)=\"readFile($event);\">\r\n</label>\r\n","import {NgModule} from \"@angular/core\";\r\nimport {MatTooltipModule} from \"@angular/material/tooltip\";\r\nimport {CommonModule} from \"@angular/common\";\r\nimport {ExcelExportComponent} from \"./excel-export/excel-export.component\";\r\nimport {ExcelImportComponent} from \"./excel-import/excel-import.component\";\r\nimport {MatIconModule} from \"@angular/material/icon\";\r\n\r\n@NgModule({\r\n declarations: [\r\n ExcelExportComponent,\r\n ExcelImportComponent,\r\n ],\r\n exports: [\r\n ExcelExportComponent,\r\n ExcelImportComponent,\r\n ],\r\n imports: [\r\n CommonModule,\r\n MatIconModule,\r\n MatTooltipModule,\r\n ],\r\n providers: []\r\n})\r\nexport class SpaasExcelModule {\r\n}\r\n","export class ExcelSheetModel {\r\n sheetName: string = '';\r\n sheetData: any[] = [];\r\n}\r\n","// MODULE\r\nexport * from './excel.module';\r\n\r\n// COMPONENTS\r\nexport * from './excel-export/excel-export.component';\r\nexport * from './excel-import/excel-import.component';\r\n\r\n// SERVICES\r\nexport * from './_services/excel.service';\r\n\r\n// MODELS AND CONSTANTS\r\nexport * from './_models/excel.model';\r\n\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["i1.ExcelService","i2","i3"],"mappings":"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"}