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
JavaScript
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==