ngx-nested-data-table
Version:
angular master-detail table angular material style
217 lines (216 loc) • 18.5 kB
JavaScript
/**
* @fileoverview added by tsickle
* @suppress {checkTypes} checked by tsc
*/
import * as tslib_1 from "tslib";
import { DataSource } from '@angular/cdk/collections';
import { map } from 'rxjs/operators';
import { of as observableOf, merge, BehaviorSubject } from 'rxjs';
/**
* Data source for the NgxDataTable view. This class should
* encapsulate all logic for fetching and manipulating the displayed data
* (including sorting, pagination, and filtering).
*/
var /**
* Data source for the NgxDataTable view. This class should
* encapsulate all logic for fetching and manipulating the displayed data
* (including sorting, pagination, and filtering).
*/
NgxDataTableDataSource = /** @class */ (function (_super) {
tslib_1.__extends(NgxDataTableDataSource, _super);
function NgxDataTableDataSource(paginator, _data, sort) {
var _this = _super.call(this) || this;
_this.paginator = paginator;
_this._data = _data;
_this.sort = sort;
_this._filterChange = new BehaviorSubject('');
_this.data = _data;
// Master detail table
var /** @type {?} */ rows = [];
_data.forEach(function (element) {
return element.details
? rows.push(element, { detailRow: true, element: element })
: rows.push(element);
});
_this.data = rows;
return _this;
}
Object.defineProperty(NgxDataTableDataSource.prototype, "filter", {
get: /**
* @return {?}
*/
function () {
return this._filterChange.value;
},
set: /**
* @param {?} filter
* @return {?}
*/
function (filter) {
this._filterChange.next(filter);
},
enumerable: true,
configurable: true
});
/**
* Connect this data source to the table. The table will only update when
* the returned stream emits new items.
* @returns A stream of the items to be rendered.
*/
/**
* Connect this data source to the table. The table will only update when
* the returned stream emits new items.
* @return {?} A stream of the items to be rendered.
*/
NgxDataTableDataSource.prototype.connect = /**
* Connect this data source to the table. The table will only update when
* the returned stream emits new items.
* @return {?} A stream of the items to be rendered.
*/
function () {
var _this = this;
// Combine everything that affects the rendered data into one update
// stream for the data-table to consume.
var /** @type {?} */ dataMutations = [
observableOf(this.data),
this.paginator.page,
this.sort.sortChange,
this._filterChange,
];
// Set the paginator length
this.paginator.length = this.data.length;
return merge.apply(void 0, tslib_1.__spread(dataMutations)).pipe(map(function () {
var /** @type {?} */ filtered = _this._filterData(_this._data);
_this.data = _this._enrichData(filtered);
return _this.getPagedData(_this.getSortedData(tslib_1.__spread(_this.data)));
}));
};
/**
* @param {?} filtered
* @return {?}
*/
NgxDataTableDataSource.prototype._enrichData = /**
* @param {?} filtered
* @return {?}
*/
function (filtered) {
var /** @type {?} */ rows = [];
filtered.forEach(function (element) {
return element.details
? rows.push(element, { detailRow: true, element: element })
: rows.push(element);
});
return rows;
};
/**
* @param {?} data
* @return {?}
*/
NgxDataTableDataSource.prototype._filterData = /**
* @param {?} data
* @return {?}
*/
function (data) {
var _this = this;
this.filteredData =
!this.filter ? data : data.filter(function (obj) {
// Transform the data into a lowercase string of all property values.
var /** @type {?} */ accumulator = function (currentTerm, key) { return currentTerm + obj[key]; };
var /** @type {?} */ dataStr = Object.keys(obj).reduce(accumulator, '').toLowerCase();
// Transform the filter by converting it to lowercase and removing whitespace.
var /** @type {?} */ transformedFilter = _this.filter.trim().toLowerCase();
return dataStr.indexOf(transformedFilter) !== -1;
});
return this.filteredData;
};
/**
* Called when the table is being destroyed. Use this function, to clean up
* any open connections or free any held resources that were set up during connect.
*/
/**
* Called when the table is being destroyed. Use this function, to clean up
* any open connections or free any held resources that were set up during connect.
* @return {?}
*/
NgxDataTableDataSource.prototype.disconnect = /**
* Called when the table is being destroyed. Use this function, to clean up
* any open connections or free any held resources that were set up during connect.
* @return {?}
*/
function () { };
/**
* Paginate the data (client-side). If you're using server-side pagination,
* this would be replaced by requesting the appropriate data from the server.
* @param {?} data
* @return {?}
*/
NgxDataTableDataSource.prototype.getPagedData = /**
* Paginate the data (client-side). If you're using server-side pagination,
* this would be replaced by requesting the appropriate data from the server.
* @param {?} data
* @return {?}
*/
function (data) {
var /** @type {?} */ startIndex = this.paginator.pageIndex * this.paginator.pageSize;
return data.splice(startIndex, this.paginator.pageSize);
};
/**
* Sort the data (client-side). If you're using server-side sorting,
* this would be replaced by requesting the appropriate data from the server.
* @param {?} data
* @return {?}
*/
NgxDataTableDataSource.prototype.getSortedData = /**
* Sort the data (client-side). If you're using server-side sorting,
* this would be replaced by requesting the appropriate data from the server.
* @param {?} data
* @return {?}
*/
function (data) {
var _this = this;
if (!this.sort.active || this.sort.direction === '') {
return data;
}
return data.sort(function (a, b) {
var /** @type {?} */ isAsc = _this.sort.direction === 'asc';
if (isNaN(a[_this.sort.active])) {
return compare(a[_this.sort.active], b[_this.sort.active], isAsc);
}
else {
return compare(+a[_this.sort.active], +b[_this.sort.active], isAsc);
}
});
};
return NgxDataTableDataSource;
}(DataSource));
/**
* Data source for the NgxDataTable view. This class should
* encapsulate all logic for fetching and manipulating the displayed data
* (including sorting, pagination, and filtering).
*/
export { NgxDataTableDataSource };
function NgxDataTableDataSource_tsickle_Closure_declarations() {
/** @type {?} */
NgxDataTableDataSource.prototype.data;
/** @type {?} */
NgxDataTableDataSource.prototype._filterChange;
/** @type {?} */
NgxDataTableDataSource.prototype.filteredData;
/** @type {?} */
NgxDataTableDataSource.prototype.paginator;
/** @type {?} */
NgxDataTableDataSource.prototype._data;
/** @type {?} */
NgxDataTableDataSource.prototype.sort;
}
/**
* Simple sort comparator for example ID/Name columns (for client-side sorting).
* @param {?} a
* @param {?} b
* @param {?} isAsc
* @return {?}
*/
function compare(a, b, isAsc) {
return (a < b ? -1 : 1) * (isAsc ? 1 : -1);
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmd4LWRhdGEtdGFibGUtZGF0YXNvdXJjZS5qcyIsInNvdXJjZVJvb3QiOiJuZzovL25neC1uZXN0ZWQtZGF0YS10YWJsZS8iLCJzb3VyY2VzIjpbImxpYi9uZ3gtZGF0YS10YWJsZS9uZ3gtZGF0YS10YWJsZS1kYXRhc291cmNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7O0FBQUEsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBRXRELE9BQU8sRUFBRSxHQUFHLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUNyQyxPQUFPLEVBQWEsRUFBRSxJQUFJLFlBQVksRUFBRSxLQUFLLEVBQUUsZUFBZSxFQUFnQixNQUFNLE1BQU0sQ0FBQzs7Ozs7O0FBTzNGOzs7OztBQUFBO0lBQTRDLGtEQUFlO0lBWXpELGdDQUNVLFdBQ0EsT0FDQTtRQUhWLFlBS0UsaUJBQU8sU0FXUjtRQWZTLGVBQVMsR0FBVCxTQUFTO1FBQ1QsV0FBSyxHQUFMLEtBQUs7UUFDTCxVQUFJLEdBQUosSUFBSTs4QkFiRSxJQUFJLGVBQWUsQ0FBUyxFQUFFLENBQUM7UUFnQjdDLEtBQUksQ0FBQyxJQUFJLEdBQUcsS0FBSyxDQUFDOztRQUVsQixxQkFBTSxJQUFJLEdBQUcsRUFBRSxDQUFDO1FBQ2hCLEtBQUssQ0FBQyxPQUFPLENBQ1gsVUFBQSxPQUFPO1lBQ0wsT0FBQSxPQUFPLENBQUMsT0FBTztnQkFDYixDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsRUFBRSxTQUFTLEVBQUUsSUFBSSxFQUFFLE9BQU8sU0FBQSxFQUFFLENBQUM7Z0JBQ2xELENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQztRQUZ0QixDQUVzQixDQUN6QixDQUFDO1FBQ0YsS0FBSSxDQUFDLElBQUksR0FBRyxJQUFJLENBQUM7O0tBQ2xCO0lBdkJELHNCQUFJLDBDQUFNOzs7O1FBQVY7WUFDRSxNQUFNLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FB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Q0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0NBQzVDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgRGF0YVNvdXJjZSB9IGZyb20gJ0Bhbmd1bGFyL2Nkay9jb2xsZWN0aW9ucyc7XG5pbXBvcnQgeyBNYXRQYWdpbmF0b3IsIE1hdFNvcnQgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbCc7XG5pbXBvcnQgeyBtYXAgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5pbXBvcnQge09ic2VydmFibGUsIG9mIGFzIG9ic2VydmFibGVPZiwgbWVyZ2UsIEJlaGF2aW9yU3ViamVjdCwgY29tYmluZUxhdGVzdH0gZnJvbSAncnhqcyc7XG5cbi8qKlxuICogRGF0YSBzb3VyY2UgZm9yIHRoZSBOZ3hEYXRhVGFibGUgdmlldy4gVGhpcyBjbGFzcyBzaG91bGRcbiAqIGVuY2Fwc3VsYXRlIGFsbCBsb2dpYyBmb3IgZmV0Y2hpbmcgYW5kIG1hbmlwdWxhdGluZyB0aGUgZGlzcGxheWVkIGRhdGFcbiAqIChpbmNsdWRpbmcgc29ydGluZywgcGFnaW5hdGlvbiwgYW5kIGZpbHRlcmluZykuXG4gKi9cbmV4cG9ydCBjbGFzcyBOZ3hEYXRhVGFibGVEYXRhU291cmNlIGV4dGVuZHMgRGF0YVNvdXJjZTxhbnk+IHtcbiAgcHVibGljIGRhdGE6IGFueVtdO1xuICBfZmlsdGVyQ2hhbmdlID0gbmV3IEJlaGF2aW9yU3ViamVjdDxzdHJpbmc+KCcnKTtcbiAgZmlsdGVyZWREYXRhOiBhbnlbXTtcblxuICBnZXQgZmlsdGVyKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuX2ZpbHRlckNoYW5nZS52YWx1ZTtcbiAgfVxuICBzZXQgZmlsdGVyKGZpbHRlcjogc3RyaW5nKSB7XG4gICAgdGhpcy5fZmlsdGVyQ2hhbmdlLm5leHQoZmlsdGVyKTtcbiAgfVxuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgcGFnaW5hdG9yOiBNYXRQYWdpbmF0b3IsXG4gICAgcHJpdmF0ZSBfZGF0YTogYW55W10sXG4gICAgcHJpdmF0ZSBzb3J0OiBNYXRTb3J0XG4gICkge1xuICAgIHN1cGVyKCk7XG4gICAgdGhpcy5kYXRhID0gX2RhdGE7XG4gICAgLy8gTWFzdGVyIGRldGFpbCB0YWJsZVxuICAgIGNvbnN0IHJvd3MgPSBbXTtcbiAgICBfZGF0YS5mb3JFYWNoKFxuICAgICAgZWxlbWVudCA9PlxuICAgICAgICBlbGVtZW50LmRldGFpbHNcbiAgICAgICAgICA/IHJvd3MucHVzaChlbGVtZW50LCB7IGRldGFpbFJvdzogdHJ1ZSwgZWxlbWVudCB9KVxuICAgICAgICAgIDogcm93cy5wdXNoKGVsZW1lbnQpXG4gICAgKTtcbiAgICB0aGlzLmRhdGEgPSByb3dzO1xuICB9XG5cbiAgLyoqXG4gICAqIENvbm5lY3QgdGhpcyBkYXRhIHNvdXJjZSB0byB0aGUgdGFibGUuIFRoZSB0YWJsZSB3aWxsIG9ubHkgdXBkYXRlIHdoZW5cbiAgICogdGhlIHJldHVybmVkIHN0cmVhbSBlbWl0cyBuZXcgaXRlbXMuXG4gICAqIEByZXR1cm5zIEEgc3RyZWFtIG9mIHRoZSBpdGVtcyB0byBiZSByZW5kZXJlZC5cbiAgICovXG4gIGNvbm5lY3QoKTogT2JzZXJ2YWJsZTxhbnlbXT4ge1xuICAgIC8vIENvbWJpbmUgZXZlcnl0aGluZyB0aGF0IGFmZmVjdHMgdGhlIHJlbmRlcmVkIGRhdGEgaW50byBvbmUgdXBkYXRlXG4gICAgLy8gc3RyZWFtIGZvciB0aGUgZGF0YS10YWJsZSB0byBjb25zdW1lLlxuICAgIGNvbnN0IGRhdGFNdXRhdGlvbnMgPSBbXG4gICAgICBvYnNlcnZhYmxlT2YodGhpcy5kYXRhKSxcbiAgICAgIHRoaXMucGFnaW5hdG9yLnBhZ2UsXG4gICAgICB0aGlzLnNvcnQuc29ydENoYW5nZSxcbiAgICAgIHRoaXMuX2ZpbHRlckNoYW5nZSxcbiAgICBdO1xuXG4gICAgLy8gU2V0IHRoZSBwYWdpbmF0b3IgbGVuZ3RoXG4gICAgdGhpcy5wYWdpbmF0b3IubGVuZ3RoID0gdGhpcy5kYXRhLmxlbmd0aDtcblxuICAgIHJldHVybiBtZXJnZSguLi5kYXRhTXV0YXRpb25zKS5waXBlKFxuICAgICAgbWFwKCgpID0+IHtcbiAgICAgICAgY29uc3QgZmlsdGVyZWQgPSB0aGlzLl9maWx0ZXJEYXRhKHRoaXMuX2RhdGEpO1xuICAgICAgICB0aGlzLmRhdGEgPSB0aGlzLl9lbnJpY2hEYXRhKGZpbHRlcmVkKTtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0UGFnZWREYXRhKHRoaXMuZ2V0U29ydGVkRGF0YShbLi4udGhpcy5kYXRhXSkpO1xuICAgICAgfSlcbiAgICApO1xuICB9XG5cbiAgcHJpdmF0ZSBfZW5yaWNoRGF0YShmaWx0ZXJlZCkge1xuICAgIGNvbnN0IHJvd3MgPSBbXTtcbiAgICBmaWx0ZXJlZC5mb3JFYWNoKFxuICAgICAgZWxlbWVudCA9PlxuICAgICAgICBlbGVtZW50LmRldGFpbHNcbiAgICAgICAgICA/IHJvd3MucHVzaChlbGVtZW50LCB7ZGV0YWlsUm93OiB0cnVlLCBlbGVtZW50fSlcbiAgICAgICAgICA6IHJvd3MucHVzaChlbGVtZW50KVxuICAgICk7XG4gICAgcmV0dXJuIHJvd3M7XG4gIH1cblxuICBwcml2YXRlIF9maWx0ZXJEYXRhKGRhdGE6IGFueVtdKSB7XG4gICAgdGhpcy5maWx0ZXJlZERhdGEgPVxuICAgICAgIXRoaXMuZmlsdGVyID8gZGF0YSA6IGRhdGEuZmlsdGVyKG9iaiA9PiB7XG4gICAgICAvLyBUcmFuc2Zvcm0gdGhlIGRhdGEgaW50byBhIGxvd2VyY2FzZSBzdHJpbmcgb2YgYWxsIHByb3BlcnR5IHZhbHVlcy5cbiAgICAgIGNvbnN0IGFjY3VtdWxhdG9yID0gKGN1cnJlbnRUZXJtLCBrZXkpID0+IGN1cnJlbnRUZXJtICsgb2JqW2tleV07XG4gICAgICBjb25zdCBkYXRhU3RyID0gT2JqZWN0LmtleXMob2JqKS5yZWR1Y2UoYWNjdW11bGF0b3IsICcnKS50b0xvd2VyQ2FzZSgpO1xuXG4gICAgICAvLyBUcmFuc2Zvcm0gdGhlIGZpbHRlciBieSBjb252ZXJ0aW5nIGl0IHRvIGxvd2VyY2FzZSBhbmQgcmVtb3Zpbmcgd2hpdGVzcGFjZS5cbiAgICAgIGNvbnN0IHRyYW5zZm9ybWVkRmlsdGVyID0gdGhpcy5maWx0ZXIudHJpbSgpLnRvTG93ZXJDYXNlKCk7XG5cbiAgICAgIHJldHVybiBkYXRhU3RyLmluZGV4T2YodHJhbnNmb3JtZWRGaWx0ZXIpICE9PSAtMTtcbiAgICB9KTtcbiAgICByZXR1cm4gdGhpcy5maWx0ZXJlZERhdGE7XG4gIH1cblxuICAvKipcbiAgICogIENhbGxlZCB3aGVuIHRoZSB0YWJsZSBpcyBiZWluZyBkZXN0cm95ZWQuIFVzZSB0aGlzIGZ1bmN0aW9uLCB0byBjbGVhbiB1cFxuICAgKiBhbnkgb3BlbiBjb25uZWN0aW9ucyBvciBmcmVlIGFueSBoZWxkIHJlc291cmNlcyB0aGF0IHdlcmUgc2V0IHVwIGR1cmluZyBjb25uZWN0LlxuICAgKi9cbiAgZGlzY29ubmVjdCgpIHt9XG5cbiAgLyoqXG4gICAqIFBhZ2luYXRlIHRoZSBkYXRhIChjbGllbnQtc2lkZSkuIElmIHlvdSdyZSB1c2luZyBzZXJ2ZXItc2lkZSBwYWdpbmF0aW9uLFxuICAgKiB0aGlzIHdvdWxkIGJlIHJlcGxhY2VkIGJ5IHJlcXVlc3RpbmcgdGhlIGFwcHJvcHJpYXRlIGRhdGEgZnJvbSB0aGUgc2VydmVyLlxuICAgKi9cbiAgcHJpdmF0ZSBnZXRQYWdlZERhdGEoZGF0YTogYW55W10pIHtcbiAgICBjb25zdCBzdGFydEluZGV4ID0gdGhpcy5wYWdpbmF0b3IucGFnZUluZGV4ICogdGhpcy5wYWdpbmF0b3IucGFnZVNpemU7XG4gICAgcmV0dXJuIGRhdGEuc3BsaWNlKHN0YXJ0SW5kZXgsIHRoaXMucGFnaW5hdG9yLnBhZ2VTaXplKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTb3J0IHRoZSBkYXRhIChjbGllbnQtc2lkZSkuIElmIHlvdSdyZSB1c2luZyBzZXJ2ZXItc2lkZSBzb3J0aW5nLFxuICAgKiB0aGlzIHdvdWxkIGJlIHJlcGxhY2VkIGJ5IHJlcXVlc3RpbmcgdGhlIGFwcHJvcHJpYXRlIGRhdGEgZnJvbSB0aGUgc2VydmVyLlxuICAgKi9cbiAgcHJpdmF0ZSBnZXRTb3J0ZWREYXRhKGRhdGE6IGFueVtdKSB7XG4gICAgaWYgKCF0aGlzLnNvcnQuYWN0aXZlIHx8IHRoaXMuc29ydC5kaXJlY3Rpb24gPT09ICcnKSB7XG4gICAgICByZXR1cm4gZGF0YTtcbiAgICB9XG5cbiAgICByZXR1cm4gZGF0YS5zb3J0KChhLCBiKSA9PiB7XG4gICAgICBjb25zdCBpc0FzYyA9IHRoaXMuc29ydC5kaXJlY3Rpb24gPT09ICdhc2MnO1xuICAgICAgaWYgKGlzTmFOKGFbdGhpcy5zb3J0LmFjdGl2ZV0pKSB7XG4gICAgICAgIHJldHVybiBjb21wYXJlKGFbdGhpcy5zb3J0LmFjdGl2ZV0sIGJbdGhpcy5zb3J0LmFjdGl2ZV0sIGlzQXNjKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiBjb21wYXJlKCthW3RoaXMuc29ydC5hY3RpdmVdLCArYlt0aGlzLnNvcnQuYWN0aXZlXSwgaXNBc2MpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG59XG5cbi8qKiBTaW1wbGUgc29ydCBjb21wYXJhdG9yIGZvciBleGFtcGxlIElEL05hbWUgY29sdW1ucyAoZm9yIGNsaWVudC1zaWRlIHNvcnRpbmcpLiAqL1xuZnVuY3Rpb24gY29tcGFyZShhLCBiLCBpc0FzYykge1xuICByZXR1cm4gKGEgPCBiID8gLTEgOiAxKSAqIChpc0FzYyA/IDEgOiAtMSk7XG59XG4iXX0=