UNPKG

dynamic-mat-table

Version:

dynamic-mat-table is an Angular component for presenting large and complex data with a lightning fast performance (at least 10x faster) and excellent level of control over the presentation.

133 lines 17.8 kB
import { Injectable } from '@angular/core'; import * as i0 from "@angular/core"; export class TableService { constructor() { } /************************************* Local Export *****************************************/ static getFormattedTime() { const today = new Date(); const y = today.getFullYear(); const m = today.getMonth() + 1; const d = today.getDate(); const h = today.getHours(); const mi = today.getMinutes(); const s = today.getSeconds(); return y + "-" + m + "-" + d + "-" + h + "-" + mi + "-" + s; } // private downloadBlob(blob: any, filename: string) { // if (navigator.msSaveBlob) { // IE 10+ // navigator.msSaveBlob(blob, filename); // } else { // const link = document.createElement('a'); // if (link.download !== undefined) { // // Browsers that support HTML5 download attribute // const link = window.document.createElement('a'); // const date = new Date(); // link.className = 'download' + date.getUTCFullYear() + date.getUTCMonth() + date.getUTCSeconds(); // link.setAttribute('href', blob); // link.setAttribute('download', filename); // link.style.visibility = 'hidden'; // link.click(); // // setTimeout(() => { // // const g = document.body.getElementsByClassName(link.className); // // document.body.removeChild(link); // // }); // } // } // } downloadBlob(blob, filename) { if (navigator.msSaveBlob) { // IE 10+ navigator.msSaveBlob(blob, filename); } else { const link = document.createElement("a"); if (link.download !== undefined) { // Browsers that support HTML5 download attribute const url = URL.createObjectURL(blob); link.setAttribute("href", url); link.setAttribute("download", filename); link.style.visibility = "hidden"; document.body.appendChild(link); link.click(); document.body.removeChild(link); } } } exportToCsv(columns, rows, selectionModel, filename = "") { filename = filename === "" ? this.tableName + TableService.getFormattedTime() + ".csv" : filename; if (!rows || !rows.length) { return; } const fields = columns.filter((c) => c.exportable !== false && c.display !== 'hidden'); const separator = ","; const CR_LF = "\n"; //'\u0D0A'; const keys = fields.map(f => f.name); const headers = fields.map(f => f.header); const csvContent = headers.join(separator) + CR_LF + rows .map((row) => { return fields.map((f) => { let cell = f.toExport(row, "csv") || ""; cell = cell instanceof Date ? cell.toLocaleString() : cell.toString().replace(/"/g, '""'); if (cell.search(/("|,|\n)/g) >= 0) { cell = `"${cell}"`; } return cell; }).join(separator); }).join(CR_LF); const blob = new Blob([ new Uint8Array([0xEF, 0xBB, 0xBF]), csvContent ], { type: 'text/csv;charset=utf-8' }); this.downloadBlob(blob, filename); } exportToJson(rows, filename = "") { filename = filename === "" ? this.tableName + TableService.getFormattedTime() + ".json" : filename; const blob = new Blob([JSON.stringify(rows)], { type: "text/csv;charset=utf-8;", }); this.downloadBlob(blob, filename); } /************************************* Save Setting into storage *****************************************/ loadSavedColumnInfo(columnInfo, saveName) { // Only load if a save name is passed in if (saveName) { if (!localStorage) { return; } const loadedInfo = localStorage.getItem(`${saveName}-columns`); if (loadedInfo) { return JSON.parse(loadedInfo); } this.saveColumnInfo(columnInfo); return columnInfo; } } saveColumnInfo(columnInfo, saveName = this.tableName) { if (saveName) { if (!localStorage) { return; } localStorage.setItem(`${saveName}-columns`, JSON.stringify(columnInfo)); } } } /** @nocollapse */ TableService.ɵprov = i0.ɵɵdefineInjectable({ factory: function TableService_Factory() { return new TableService(); }, token: TableService, providedIn: "root" }); /** @type {!Array<{type: !Function, args: (undefined|!Array<?>)}>} */ TableService.decorators = [ { type: Injectable, args: [{ providedIn: "root", },] } ]; /** * @type {function(): !Array<(null|{ * type: ?, * decorators: (undefined|!Array<{type: !Function, args: (undefined|!Array<?>)}>), * })>} * @nocollapse */ TableService.ctorParameters = () => []; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZHluYW1pYy1tYXQtdGFibGUuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2R5bmFtaWMtbWF0LXRhYmxlL3NyYy9saWIvZHluYW1pYy1tYXQtdGFibGUvZHluYW1pYy1tYXQtdGFibGUuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sZUFBZSxDQUFDOztBQU8zQyxNQUFNLE9BQU8sWUFBWTtJQUl2QixnQkFBZ0IsQ0FBQztJQUVqQiw4RkFBOEY7SUFDOUYsTUFBTSxDQUFDLGdCQUFnQjtRQUVyQixNQUFNLEtBQUssR0FBRyxJQUFJLElBQUksRUFBRSxDQUFDO1FBQ3pCLE1BQU0sQ0FBQyxHQUFHLEtBQUssQ0FBQyxXQUFXLEVBQUUsQ0FBQztRQUM5QixNQUFNLENBQUMsR0FBRyxLQUFLLENBQUMsUUFBUSxFQUFFLEdBQUcsQ0FBQyxDQUFDO1FBQy9CLE1BQU0sQ0FBQyxHQUFHLEtBQUssQ0FBQyxPQUFPLEVBQUUsQ0FBQztRQUMxQixNQUFNLENBQUMsR0FBRyxLQUFLLENBQUMsUUFBUSxFQUFFLENBQUM7UUFDM0IsTUFBTSxFQUFFLEdBQUcsS0FBSyxDQUFDLFVBQVUsRUFBRSxDQUFDO1FBQzlCLE1BQU0sQ0FBQyxHQUFHLEtBQUssQ0FBQyxVQUFVLEVBQUUsQ0FBQztRQUM3QixPQUFPLENBQUMsR0FBRyxHQUFHLEdBQUcsQ0FBQyxHQUFHLEdBQUcsR0FBRyxDQUFDLEdBQUcsR0FBRyxHQUFHLENBQUMsR0FBRyxHQUFHLEdBQUcsRUFBRSxHQUFHLEdBQUcsR0FBRyxDQUFDLENBQUM7SUFDOUQsQ0FBQztJQUVELHNEQUFzRDtJQUN0RCwwQ0FBMEM7SUFDMUMsNENBQTRDO0lBQzVDLGFBQWE7SUFDYixnREFBZ0Q7SUFDaEQseUNBQXlDO0lBQ3pDLDBEQUEwRDtJQUMxRCx5REFBeUQ7SUFDekQsaUNBQWlDO0lBQ2pDLHlHQUF5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QUFDLENBQUM7WUFFL0QsSUFBSSxVQUFVLEVBQ2Q7Z0JBQ0UsT0FBTyxJQUFJLENBQUMsS0FBSyxDQUFDLFVBQVUsQ0FBQyxDQUFDO2FBQy9CO1lBQ0QsSUFBSSxDQUFDLGNBQWMsQ0FBQyxVQUFVLENBQUMsQ0FBQztZQUNoQyxPQUFPLFVBQVUsQ0FBQztTQUNuQjtJQUNILENBQUM7SUFFTSxjQUFjLENBQUMsVUFBNkIsRUFBRSxXQUFtQixJQUFJLENBQUMsU0FBUztRQUVwRixJQUFJLFFBQVEsRUFDWjtZQUNFLElBQUksQ0FBQyxZQUFZLEVBQ2pCO2dCQUNFLE9BQU87YUFDUjtZQUVELFlBQVksQ0FBQyxPQUFPLENBQUMsR0FBRyxRQUFRLFVBQVUsRUFBRSxJQUFJLENBQUMsU0FBUyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUM7U0FDekU7SUFDSCxDQUFDOzs7OztZQXJKRixVQUFVLFNBQUM7Z0JBQ1YsVUFBVSxFQUFFLE1BQU07YUFDbkIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJbmplY3RhYmxlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IFRhYmxlRmllbGQgfSBmcm9tICcuLi9tb2RlbHMvdGFibGUtZmllbGQubW9kZWwnO1xyXG5pbXBvcnQgeyBTZWxlY3Rpb25Nb2RlbCB9IGZyb20gJ0Bhbmd1bGFyL2Nkay9jb2xsZWN0aW9ucyc7XHJcbmltcG9ydCB7IFRhYmxlUm93IH0gZnJvbSAnLi4vbW9kZWxzL3RhYmxlLXJvdy5tb2RlbCc7XHJcbkBJbmplY3RhYmxlKHtcclxuICBwcm92aWRlZEluOiBcInJvb3RcIixcclxufSlcclxuZXhwb3J0IGNsYXNzIFRhYmxlU2VydmljZVxyXG57XHJcbiAgcHVibGljIHRhYmxlTmFtZTogc3RyaW5nO1xyXG5cclxuICBjb25zdHJ1Y3RvcigpIHsgfVxyXG5cclxuICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiBMb2NhbCBFeHBvcnQgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXHJcbiAgc3RhdGljIGdldEZvcm1hdHRlZFRpbWUoKVxyXG4gIHtcclxuICAgIGNvbnN0IHRvZGF5ID0gbmV3IERhdGUoKTtcclxuICAgIGNvbnN0IHkgPSB0b2RheS5nZXRGdWxsWWVhcigpO1xyXG4gICAgY29uc3QgbSA9IHRvZGF5LmdldE1vbnRoKCkgKyAxO1xyXG4gICAgY29uc3QgZCA9IHRvZGF5LmdldERhdGUoKTtcclxuICAgIGNvbnN0IGggPSB0b2RheS5nZXRIb3VycygpO1xyXG4gICAgY29uc3QgbWkgPSB0b2RheS5nZXRNaW51dGVzKCk7XHJcbiAgICBjb25zdCBzID0gdG9kYXkuZ2V0U2Vjb25kcygpO1xyXG4gICAgcmV0dXJuIHkgKyBcIi1cIiArIG0gKyBcIi1cIiArIGQgKyBcIi1cIiArIGggKyBcIi1cIiArIG1pICsgXCItXCIgKyBzO1xyXG4gIH1cclxuXHJcbiAgLy8gcHJpdmF0ZSBkb3dubG9hZEJsb2IoYmxvYjogYW55LCBmaWxlbmFtZTogc3RyaW5nKSB7XHJcbiAgLy8gICBpZiAobmF2aWdhdG9yLm1zU2F2ZUJsb2IpIHsgLy8gSUUgMTArXHJcbiAgLy8gICAgIG5hdmlnYXRvci5tc1NhdmVCbG9iKGJsb2IsIGZpbGVuYW1lKTtcclxuICAvLyAgIH0gZWxzZSB7XHJcbiAgLy8gICAgIGNvbnN0IGxpbmsgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdhJyk7XHJcbiAgLy8gICAgIGlmIChsaW5rLmRvd25sb2FkICE9PSB1bmRlZmluZWQpIHtcclxuICAvLyAgICAgICAvLyBCcm93c2VycyB0aGF0IHN1cHBvcnQgSFRNTDUgZG93bmxvYWQgYXR0cmlidXRlXHJcbiAgLy8gICAgICAgY29uc3QgbGluayA9IHdpbmRvdy5kb2N1bWVudC5jcmVhdGVFbGVtZW50KCdhJyk7XHJcbiAgLy8gICAgICAgY29uc3QgZGF0ZSA9IG5ldyBEYXRlKCk7XHJcbiAgLy8gICAgICAgbGluay5jbGFzc05hbWUgPSAnZG93bmxvYWQnICsgZGF0ZS5nZXRVVENGdWxsWWVhcigpICsgZGF0ZS5nZXRVVENNb250aCgpICsgZGF0ZS5nZXRVVENTZWNvbmRzKCk7XHJcbiAgLy8gICAgICAgbGluay5zZXRBdHRyaWJ1dGUoJ2hyZWYnLCBibG9iKTtcclxuICAvLyAgICAgICBsaW5rLnNldEF0dHJpYnV0ZSgnZG93bmxvYWQnLCBmaWxlbmFtZSk7XHJcbiAgLy8gICAgICAgbGluay5zdHlsZS52aXNpYmlsaXR5ID0gJ2hpZGRlbic7XHJcbiAgLy8gICAgICAgbGluay5jbGljaygpO1xyXG4gIC8vICAgICAgIC8vIHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gIC8vICAgICAgIC8vICAgY29uc3QgZyA9IGRvY3VtZW50LmJvZHkuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZShsaW5rLmNsYXNzTmFtZSk7XHJcbiAgLy8gICAgICAgLy8gICBkb2N1bWVudC5ib2R5LnJlbW92ZUNoaWxkKGxpbmspO1xyXG4gIC8vICAgICAgIC8vIH0pO1xyXG4gIC8vICAgICB9XHJcbiAgLy8gICB9XHJcbiAgLy8gfVxyXG5cclxuICBwcml2YXRlIGRvd25sb2FkQmxvYihibG9iOiBCbG9iIHwgYW55LCBmaWxlbmFtZTogc3RyaW5nKVxyXG4gIHtcclxuICAgIGlmICgobmF2aWdhdG9yIGFzIGFueSkubXNTYXZlQmxvYilcclxuICAgIHtcclxuICAgICAgLy8gSUUgMTArXHJcbiAgICAgIChuYXZpZ2F0b3IgYXMgYW55KS5tc1NhdmVCbG9iKGJsb2IsIGZpbGVuYW1lKTtcclxuICAgIH0gZWxzZVxyXG4gICAge1xyXG4gICAgICBjb25zdCBsaW5rID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImFcIik7XHJcbiAgICAgIGlmIChsaW5rLmRvd25sb2FkICE9PSB1bmRlZmluZWQpXHJcbiAgICAgIHtcclxuICAgICAgICAvLyBCcm93c2VycyB0aGF0IHN1cHBvcnQgSFRNTDUgZG93bmxvYWQgYXR0cmlidXRlXHJcbiAgICAgICAgY29uc3QgdXJsID0gVVJMLmNyZWF0ZU9iamVjdFVSTChibG9iKTtcclxuICAgICAgICBsaW5rLnNldEF0dHJpYnV0ZShcImhyZWZcIiwgdXJsKTtcclxuICAgICAgICBsaW5rLnNldEF0dHJpYnV0ZShcImRvd25sb2FkXCIsIGZpbGVuYW1lKTtcclxuICAgICAgICBsaW5rLnN0eWxlLnZpc2liaWxpdHkgPSBcImhpZGRlblwiO1xyXG4gICAgICAgIGRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQobGluayk7XHJcbiAgICAgICAgbGluay5jbGljaygpO1xyXG4gICAgICAgIGRvY3VtZW50LmJvZHkucmVtb3ZlQ2hpbGQobGluayk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gIHB1YmxpYyBleHBvcnRUb0NzdjxUIGV4dGVuZHMgVGFibGVSb3c+KGNvbHVtbnM6IFRhYmxlRmllbGQ8VD5bXSwgcm93czogb2JqZWN0W10sIHNlbGVjdGlvbk1vZGVsOiBTZWxlY3Rpb25Nb2RlbDxhbnk+LCBmaWxlbmFtZTogc3RyaW5nID0gXCJcIilcclxuICB7XHJcbiAgICBmaWxlbmFtZSA9IGZpbGVuYW1lID09PSBcIlwiID8gdGhpcy50YWJsZU5hbWUgKyBUYWJsZVNlcnZpY2UuZ2V0Rm9ybWF0dGVkVGltZSgpICsgXCIuY3N2XCIgOiBmaWxlbmFtZTtcclxuICAgIGlmICghcm93cyB8fCAhcm93cy5sZW5ndGgpXHJcbiAgICB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuICAgIGNvbnN0IGZpZWxkcyA9IGNvbHVtbnMuZmlsdGVyKChjKSA9PiBjLmV4cG9ydGFibGUgIT09IGZhbHNlICYmIGMuZGlzcGxheSAhPT0gJ2hpZGRlbicpO1xyXG4gICAgY29uc3Qgc2VwYXJhdG9yID0gXCIsXCI7XHJcbiAgICBjb25zdCBDUl9MRiA9IFwiXFxuXCI7IC8vJ1xcdTBEMEEnO1xyXG4gICAgY29uc3Qga2V5cyA9IGZpZWxkcy5tYXAoZiA9PiBmLm5hbWUpO1xyXG4gICAgY29uc3QgaGVhZGVycyA9IGZpZWxkcy5tYXAoZiA9PiBmLmhlYWRlcik7XHJcbiAgICBjb25zdCBjc3ZDb250ZW50ID0gaGVhZGVycy5qb2luKHNlcGFyYXRvcikgKyBDUl9MRiArXHJcbiAgICAgIHJvd3NcclxuICAgICAgICAubWFwKChyb3cpID0+XHJcbiAgICAgICAge1xyXG4gICAgICAgICAgcmV0dXJuIGZpZWxkcy5tYXAoKGYpID0+XHJcbiAgICAgICAgICB7XHJcbiAgICAgICAgICAgIGxldCBjZWxsID0gZi50b0V4cG9ydChyb3csIFwiY3N2XCIpIHx8IFwiXCI7XHJcbiAgICAgICAgICAgIGNlbGwgPSBjZWxsIGluc3RhbmNlb2YgRGF0ZSA/IGNlbGwudG9Mb2NhbGVTdHJpbmcoKSA6IGNlbGwudG9TdHJpbmcoKS5yZXBsYWNlKC9cIi9nLCAnXCJcIicpO1xyXG4gICAgICAgICAgICBpZiAoY2VsbC5zZWFyY2goLyhcInwsfFxcbikvZykgPj0gMClcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgIGNlbGwgPSBgXCIke2NlbGx9XCJgO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHJldHVybiBjZWxsO1xyXG4gICAgICAgICAgfSkuam9pbihzZXBhcmF0b3IpO1xyXG4gICAgICAgIH0pLmpvaW4oQ1JfTEYpO1xyXG5cclxuICAgIGNvbnN0IGJsb2IgPSBuZXcgQmxvYihbXHJcbiAgICAgIG5ldyBVaW50OEFycmF5KFsweEVGLCAweEJCLCAweEJGXSksIC8qIFVURi04IEJPTSAqL1xyXG4gICAgICBjc3ZDb250ZW50XSwgeyB0eXBlOiAndGV4dC9jc3Y7Y2hhcnNldD11dGYtOCcgfSk7XHJcbiAgICB0aGlzLmRvd25sb2FkQmxvYihibG9iLCBmaWxlbmFtZSk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgZXhwb3J0VG9Kc29uKHJvd3M6IG9iamVjdFtdLCBmaWxlbmFtZTogc3RyaW5nID0gXCJcIilcclxuICB7XHJcbiAgICBmaWxlbmFtZSA9XHJcbiAgICAgIGZpbGVuYW1lID09PSBcIlwiXHJcbiAgICAgICAgPyB0aGlzLnRhYmxlTmFtZSArIFRhYmxlU2VydmljZS5nZXRGb3JtYXR0ZWRUaW1lKCkgKyBcIi5qc29uXCJcclxuICAgICAgICA6IGZpbGVuYW1lO1xyXG4gICAgY29uc3QgYmxvYiA9IG5ldyBCbG9iKFtKU09OLnN0cmluZ2lmeShyb3dzKV0sIHtcclxuICAgICAgdHlwZTogXCJ0ZXh0L2NzdjtjaGFyc2V0PXV0Zi04O1wiLFxyXG4gICAgfSk7XHJcbiAgICB0aGlzLmRvd25sb2FkQmxvYihibG9iLCBmaWxlbmFtZSk7XHJcbiAgfVxyXG5cclxuICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiBTYXZlIFNldHRpbmcgaW50byBzdG9yYWdlICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xyXG4gIHB1YmxpYyBsb2FkU2F2ZWRDb2x1bW5JbmZvKFxyXG4gICAgY29sdW1uSW5mbzogVGFibGVGaWVsZDxhbnk+W10sXHJcbiAgICBzYXZlTmFtZT86IHN0cmluZ1xyXG4gICk6IFRhYmxlRmllbGQ8YW55PltdXHJcbiAge1xyXG4gICAgLy8gT25seSBsb2FkIGlmIGEgc2F2ZSBuYW1lIGlzIHBhc3NlZCBpblxyXG4gICAgaWYgKHNhdmVOYW1lKVxyXG4gICAge1xyXG4gICAgICBpZiAoIWxvY2FsU3RvcmFnZSlcclxuICAgICAge1xyXG4gICAgICAgIHJldHVybjtcclxuICAgICAgfVxyXG5cclxuICAgICAgY29uc3QgbG9hZGVkSW5mbyA9IGxvY2FsU3RvcmFnZS5nZXRJdGVtKGAke3NhdmVOYW1lfS1jb2x1bW5zYCk7XHJcblxyXG4gICAgICBpZiAobG9hZGVkSW5mbylcclxuICAgICAge1xyXG4gICAgICAgIHJldHVybiBKU09OLnBhcnNlKGxvYWRlZEluZm8pO1xyXG4gICAgICB9XHJcbiAgICAgIHRoaXMuc2F2ZUNvbHVtbkluZm8oY29sdW1uSW5mbyk7XHJcbiAgICAgIHJldHVybiBjb2x1bW5JbmZvO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHVibGljIHNhdmVDb2x1bW5JbmZvKGNvbHVtbkluZm86IFRhYmxlRmllbGQ8YW55PltdLCBzYXZlTmFtZTogc3RyaW5nID0gdGhpcy50YWJsZU5hbWUpOiB2b2lkXHJcbiAge1xyXG4gICAgaWYgKHNhdmVOYW1lKVxyXG4gICAge1xyXG4gICAgICBpZiAoIWxvY2FsU3RvcmFnZSlcclxuICAgICAge1xyXG4gICAgICAgIHJldHVybjtcclxuICAgICAgfVxyXG5cclxuICAgICAgbG9jYWxTdG9yYWdlLnNldEl0ZW0oYCR7c2F2ZU5hbWV9LWNvbHVtbnNgLCBKU09OLnN0cmluZ2lmeShjb2x1bW5JbmZvKSk7XHJcbiAgICB9XHJcbiAgfVxyXG59XHJcbiJdfQ==