@petkit/ngx-table-descartes
Version:
Angular descartes table component
144 lines (143 loc) • 14 kB
JavaScript
/**
* @fileoverview added by tsickle
* @suppress {checkTypes,extraRequire,uselessCode} checked by tsc
*/
import * as tslib_1 from "tslib";
import { Component, Input, TemplateRef, } from '@angular/core';
import { groupBy, keys, values, orderBy, isArray, } from 'lodash-es';
import { Observable, of, combineLatest, } from 'rxjs';
var TableDescartesComponent = /** @class */ (function () {
function TableDescartesComponent() {
this.data = of([]);
this.order = of(null);
this.table = [];
}
/**
* @return {?}
*/
TableDescartesComponent.prototype.ngOnInit = /**
* @return {?}
*/
function () {
var _this = this;
combineLatest([
this.data,
this.order,
]).subscribe(function (_a) {
var _b = tslib_1.__read(_a, 2), data = _b[0], order = _b[1];
if (!isArray(data)) {
return;
}
/** @type {?} */
var _order = order || (data[0] && keys(data[0]) || null);
_this._order = _order;
if (!isArray(_order)) {
return;
}
/** @type {?} */
var orderData = orderBy(data, _order);
_this.orderData = orderData;
/** @type {?} */
var aoaData = _this.getAoA(orderData, _order);
_this.aoaData = aoaData;
_this.table = _this.format(aoaData);
});
};
/**
* @param {?} AoO
* @param {?} order
* @return {?}
*/
TableDescartesComponent.prototype.getAoA = /**
* @param {?} AoO
* @param {?} order
* @return {?}
*/
function (AoO, order) {
return AoO.map(function (row) { return order.map(function (key) { return row[key]; }).filter(function (key) { return key !== undefined; }); });
};
/**
* @param {?} data
* @return {?}
*/
TableDescartesComponent.prototype.format = /**
* @param {?} data
* @return {?}
*/
function (data) {
var _this = this;
if (!isArray(data) || data.length === 0) {
return [];
}
if (!isArray(data[0]) || data[0].length === 0) {
return [];
}
/** @type {?} */
var groupDatas = groupBy(data, function (row) { return row[0]; });
/** @type {?} */
var result = values(groupDatas).map(function (groupData) {
/** @type {?} */
var _data = [];
/** @type {?} */
var firstCols = [];
/** @type {?} */
var nextResult;
groupData.forEach(function (_a) {
var _b = tslib_1.__read(_a), col = _b[0], row = _b.slice(1);
firstCols.push(col);
_data.push(row);
});
/** @type {?} */
var firstCol = {
content: firstCols[0],
rowspan: firstCols.length,
key: _this._order ? _this._order[_this._order.length - _data[0].length - 1] : null,
};
/** @type {?} */
var next = _this.format(_data);
if (next.length) {
next[0].unshift(firstCol);
nextResult = next;
}
else {
var _a = tslib_1.__read(firstCols), leaves = _a.slice(1);
nextResult = tslib_1.__spread([[firstCol]], leaves.map(function () { return []; }));
}
return nextResult;
}).reduce(function (a, b) { return a.concat(b); }, []);
return result;
};
TableDescartesComponent.decorators = [
{ type: Component, args: [{
selector: 'ngx-table-descartes',
template: "<table class=\"ngx-table-descartes__table\">\n <ng-content></ng-content>\n <tbody>\n <tr *ngFor=\"let row of table; index as i;\">\n <td class=\"ngx-table-descartes__td\" *ngFor=\"let cell of row\" [attr.rowspan]=\"cell.rowspan\">\n <ng-container *ngIf=\"tpl\">\n <ng-container *ngTemplateOutlet=\"tpl; context: {cell: cell, row: aoaData[i], obj: orderData[i]};\"></ng-container>\n </ng-container>\n <ng-container *ngIf=\"!tpl\">{{cell.content}}</ng-container>\n </td>\n </tr>\n </tbody>\n</table>\n\n\n",
styles: [".ngx-table-descartes__table{border-collapse:collapse;width:100%;text-align:center;vertical-align:middle}.ngx-table-descartes__td{border:1px solid #bfbfbf}"]
},] },
];
/** @nocollapse */
TableDescartesComponent.ctorParameters = function () { return []; };
TableDescartesComponent.propDecorators = {
data: [{ type: Input }],
order: [{ type: Input }],
tpl: [{ type: Input }]
};
return TableDescartesComponent;
}());
export { TableDescartesComponent };
if (false) {
/** @type {?} */
TableDescartesComponent.prototype.data;
/** @type {?} */
TableDescartesComponent.prototype.order;
/** @type {?} */
TableDescartesComponent.prototype._order;
/** @type {?} */
TableDescartesComponent.prototype.tpl;
/** @type {?} */
TableDescartesComponent.prototype.orderData;
/** @type {?} */
TableDescartesComponent.prototype.aoaData;
/** @type {?} */
TableDescartesComponent.prototype.table;
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGFibGUtZGVzY2FydGVzLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiJuZzovL0BwZXRraXQvbmd4LXRhYmxlLWRlc2NhcnRlcy8iLCJzb3VyY2VzIjpbInRhYmxlLWRlc2NhcnRlcy90YWJsZS1kZXNjYXJ0ZXMuY29tcG9uZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7O0FBQUEsT0FBTyxFQUNMLFNBQVMsRUFFVCxLQUFLLEVBQ0wsV0FBVyxHQUNaLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFDTCxPQUFPLEVBQ1AsSUFBSSxFQUNKLE1BQU0sRUFDTixPQUFPLEVBQ1AsT0FBTyxHQUNSLE1BQU0sV0FBVyxDQUFDO0FBQ25CLE9BQU8sRUFDTCxVQUFVLEVBQ1YsRUFBRSxFQUNGLGFBQWEsR0FDZCxNQUFNLE1BQU0sQ0FBQzs7SUF1Q1o7b0JBWjhDLEVBQUUsQ0FBQyxFQUFFLENBQUM7cUJBRWYsRUFBRSxDQUFDLElBQUksQ0FBQztxQkFRWCxFQUFFO0tBR25DOzs7O0lBRUQsMENBQVE7OztJQUFSO1FBQUEsaUJBd0JDO1FBdkJDLGFBQWEsQ0FBQztZQUNaLElBQUksQ0FBQyxJQUFJO1lBQ1QsSUFBSSxDQUFDLEtBQUs7U0FDWCxDQUFDLENBQUMsU0FBUyxDQUFDLFVBQUMsRUFBYTtnQkFBYiwwQkFBYSxFQUFaLFlBQUksRUFBRSxhQUFLO1lBQ3hCLEVBQUUsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQztnQkFDbkIsTUFBTSxDQUFDO2FBQ1I7O1lBRUQsSUFBTSxNQUFNLEdBQUcsS0FBSyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxJQUFJLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxJQUFJLENBQUMsQ0FBQztZQUMzRCxLQUFJLENBQUMsTUFBTSxHQUFHLE1BQU0sQ0FBQztZQUNyQixFQUFFLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxNQUFNLENB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QUMsQ0FBQztnQkFDTixvQ0FBUyxvQkFBUyxDQUFjO2dCQUNoQyxVQUFVLHFCQUFJLENBQUMsUUFBUSxDQUFDLEdBQUssTUFBTSxDQUFDLEdBQUcsQ0FBQyxjQUFNLE9BQUEsRUFBRSxFQUFGLENBQUUsQ0FBQyxDQUFDLENBQUM7YUFDcEQ7WUFFRCxNQUFNLENBQUMsVUFBVSxDQUFDO1NBQ25CLENBQUMsQ0FBQyxNQUFNLENBQUMsVUFBQyxDQUFDLEVBQUUsQ0FBQyxJQUFLLE9BQUEsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBWCxDQUFXLEVBQUUsRUFBRSxDQUFDLENBQUM7UUFFckMsTUFBTSxDQUFDLE1BQU0sQ0FBQztLQUNmOztnQkE1R0YsU0FBUyxTQUFDO29CQUNULFFBQVEsRUFBRSxxQkFBcUI7b0JBQy9CLFFBQVEsRUFBRSwwaUJBZVg7b0JBQ0MsTUFBTSxFQUFFLENBQUMsNEpBQTRKLENBQUM7aUJBQ3ZLOzs7Ozt1QkFFRSxLQUFLO3dCQUVMLEtBQUs7c0JBR0wsS0FBSzs7a0NBaERSOztTQTBDYSx1QkFBdUIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBDb21wb25lbnQsXG4gIE9uSW5pdCxcbiAgSW5wdXQsXG4gIFRlbXBsYXRlUmVmLFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7XG4gIGdyb3VwQnksXG4gIGtleXMsXG4gIHZhbHVlcyxcbiAgb3JkZXJCeSxcbiAgaXNBcnJheSxcbn0gZnJvbSAnbG9kYXNoLWVzJztcbmltcG9ydCB7XG4gIE9ic2VydmFibGUsXG4gIG9mLFxuICBjb21iaW5lTGF0ZXN0LFxufSBmcm9tICdyeGpzJztcbmltcG9ydCB7XG4gIElUYWJsZURlc2NhcnRlc1RhYmxlLFxufSBmcm9tICcuL3RhYmxlLWRlc2NhcnRlcy5pbnRlcmZhY2UnO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICduZ3gtdGFibGUtZGVzY2FydGVzJyxcbiAgdGVtcGxhdGU6IGA8dGFibGUgY2xhc3M9XCJuZ3gtdGFibGUtZGVzY2FydGVzX190YWJsZVwiPlxuICA8bmctY29udGVudD48L25nLWNvbnRlbnQ+XG4gIDx0Ym9keT5cbiAgICA8dHIgKm5nRm9yPVwibGV0IHJvdyBvZiB0YWJsZTsgaW5kZXggYXMgaTtcIj5cbiAgICAgIDx0ZCBjbGFzcz1cIm5neC10YWJsZS1kZXNjYXJ0ZXNfX3RkXCIgKm5nRm9yPVwibGV0IGNlbGwgb2Ygcm93XCIgW2F0dHIucm93c3Bhbl09XCJjZWxsLnJvd3NwYW5cIj5cbiAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cInRwbFwiPlxuICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJ0cGw7IGNvbnRleHQ6IHtjZWxsOiBjZWxsLCByb3c6IGFvYURhdGFbaV0sIG9iajogb3JkZXJEYXRhW2ldfTtcIj48L25nLWNvbnRhaW5lcj5cbiAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCIhdHBsXCI+e3tjZWxsLmNvbnRlbnR9fTwvbmctY29udGFpbmVyPlxuICAgICAgPC90ZD5cbiAgICA8L3RyPlxuICA8L3Rib2R5PlxuPC90YWJsZT5cblxuXG5gLFxuICBzdHlsZXM6IFtgLm5neC10YWJsZS1kZXNjYXJ0ZXNfX3RhYmxle2JvcmRlci1jb2xsYXBzZTpjb2xsYXBzZTt3aWR0aDoxMDAlO3RleHQtYWxpZ246Y2VudGVyO3ZlcnRpY2FsLWFsaWduOm1pZGRsZX0ubmd4LXRhYmxlLWRlc2NhcnRlc19fdGR7Ym9yZGVyOjFweCBzb2xpZCAjYmZiZmJmfWBdXG59KVxuZXhwb3J0IGNsYXNzIFRhYmxlRGVzY2FydGVzQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0IHtcbiAgQElucHV0KClcbiAgZGF0YTogT2JzZXJ2YWJsZTx7W2tleTogc3RyaW5nXTogc3RyaW5nfVtdPiA9IG9mKFtdKTtcbiAgQElucHV0KClcbiAgb3JkZXI6IE9ic2VydmFibGU8c3RyaW5nW10gfCBudWxsPiA9IG9mKG51bGwpO1xuICBwcml2YXRlIF9vcmRlcjogc3RyaW5nW10gfCBudWxsO1xuICBASW5wdXQoKVxuICB0cGw6IFRlbXBsYXRlUmVmPGFueT47XG5cblxuICBvcmRlckRhdGE6IHtba2V5OiBzdHJpbmddOiBzdHJpbmd9W11bXTtcbiAgYW9hRGF0YTogc3RyaW5nW11bXTtcbiAgdGFibGU6IElUYWJsZURlc2NhcnRlc1RhYmxlW11bXSA9IFtdO1xuXG4gIGNvbnN0cnVjdG9yKCkge1xuICB9XG5cbiAgbmdPbkluaXQoKSB7XG4gICAgY29tYmluZUxhdGVzdChbXG4gICAgICB0aGlzLmRhdGEsXG4gICAgICB0aGlzLm9yZGVyLFxuICAgIF0pLnN1YnNjcmliZSgoW2RhdGEsIG9yZGVyXSkgPT4ge1xuICAgICAgaWYgKCFpc0FycmF5KGRhdGEpKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgY29uc3QgX29yZGVyID0gb3JkZXIgfHwgKGRhdGFbMF0gJiYga2V5cyhkYXRhWzBdKSB8fCBudWxsKTtcbiAgICAgIHRoaXMuX29yZGVyID0gX29yZGVyO1xuICAgICAgaWYgKCFpc0FycmF5KF9vcmRlcikpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBvcmRlckRhdGEgPSBvcmRlckJ5KGRhdGEsIF9vcmRlcik7XG4gICAgICB0aGlzLm9yZGVyRGF0YSA9IG9yZGVyRGF0YTtcblxuICAgICAgY29uc3QgYW9hRGF0YSA9IHRoaXMuZ2V0QW9BKG9yZGVyRGF0YSwgX29yZGVyKTtcbiAgICAgIHRoaXMuYW9hRGF0YSA9IGFvYURhdGE7XG5cbiAgICAgIHRoaXMudGFibGUgPSB0aGlzLmZvcm1hdChhb2FEYXRhKTtcbiAgICB9KTtcblxuICB9XG5cbiAgZ2V0QW9BKEFvTzogb2JqZWN0W10sIG9yZGVyOiBhbnlbXSk6IHN0cmluZ1tdW10ge1xuICAgIHJldHVybiBBb08ubWFwKHJvdyA9PiBvcmRlci5tYXAoa2V5ID0+IHJvd1trZXldKS5maWx0ZXIoa2V5ID0+IGtleSAhPT0gdW5kZWZpbmVkKSk7XG4gIH1cblxuICBmb3JtYXQoZGF0YTogYW55W11bXSk6IGFueVtdW10ge1xuICAgIGlmICghaXNBcnJheShkYXRhKSB8fCBkYXRhLmxlbmd0aCA9PT0gMCkge1xuICAgICAgcmV0dXJuIFtdO1xuICAgIH1cblxuICAgIGlmICghaXNBcnJheShkYXRhWzBdKSB8fCBkYXRhWzBdLmxlbmd0aCA9PT0gMCkge1xuICAgICAgcmV0dXJuIFtdO1xuICAgIH1cblxuICAgIGNvbnN0IGdyb3VwRGF0YXMgPSBncm91cEJ5KGRhdGEsIHJvdyA9PiByb3dbMF0pO1xuXG4gICAgY29uc3QgcmVzdWx0ID0gdmFsdWVzKGdyb3VwRGF0YXMpLm1hcChncm91cERhdGEgPT4ge1xuICAgICAgY29uc3QgX2RhdGE6IGFueVtdID0gW107XG4gICAgICBjb25zdCBmaXJzdENvbHM6IGFueVtdID0gW107XG4gICAgICBsZXQgbmV4dFJlc3VsdDtcblxuICAgICAgZ3JvdXBEYXRhLmZvckVhY2goKFtjb2wsIC4uLnJvd10pID0+IHtcbiAgICAgICAgZmlyc3RDb2xzLnB1c2goY29sKTtcbiAgICAgICAgX2RhdGEucHVzaChyb3cpO1xuICAgICAgfSk7XG5cbiAgICAgIGNvbnN0IGZpcnN0Q29sID0ge1xuICAgICAgICBjb250ZW50OiBmaXJzdENvbHNbMF0sXG4gICAgICAgIHJvd3NwYW46IGZpcnN0Q29scy5sZW5ndGgsXG4gICAgICAgIGtleTogdGhpcy5fb3JkZXIgPyB0aGlzLl9vcmRlclt0aGlzLl9vcmRlci5sZW5ndGggLSBfZGF0YVswXS5sZW5ndGggLSAxXSA6IG51bGwsXG4gICAgICB9O1xuXG4gICAgICBjb25zdCBuZXh0ID0gdGhpcy5mb3JtYXQoX2RhdGEpO1xuXG4gICAgICBpZiAobmV4dC5sZW5ndGgpIHtcbiAgICAgICAgbmV4dFswXS51bnNoaWZ0KGZpcnN0Q29sKTtcbiAgICAgICAgbmV4dFJlc3VsdCA9IG5leHQ7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zdCBbLCAuLi5sZWF2ZXNdID0gZmlyc3RDb2xzO1xuICAgICAgICBuZXh0UmVzdWx0ID0gW1tmaXJzdENvbF0sIC4uLmxlYXZlcy5tYXAoKCkgPT4gW10pXTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIG5leHRSZXN1bHQ7XG4gICAgfSkucmVkdWNlKChhLCBiKSA9PiBhLmNvbmNhdChiKSwgW10pO1xuXG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxufVxuIl19