UNPKG

ngx-nested-data-table

Version:
217 lines (216 loc) 18.5 kB
/** * @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=