UNPKG

ngx-nested-data-table

Version:
157 lines (156 loc) 15.7 kB
/** * @fileoverview added by tsickle * @suppress {checkTypes} checked by tsc */ 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). */ export class NgxDataTableDataSource extends DataSource { /** * @param {?} paginator * @param {?} _data * @param {?} sort */ constructor(paginator, _data, sort) { super(); this.paginator = paginator; this._data = _data; this.sort = sort; this._filterChange = new BehaviorSubject(''); this.data = _data; // Master detail table const /** @type {?} */ rows = []; _data.forEach(element => element.details ? rows.push(element, { detailRow: true, element }) : rows.push(element)); this.data = rows; } /** * @return {?} */ get filter() { return this._filterChange.value; } /** * @param {?} filter * @return {?} */ set filter(filter) { this._filterChange.next(filter); } /** * 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. */ connect() { // Combine everything that affects the rendered data into one update // stream for the data-table to consume. const /** @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(...dataMutations).pipe(map(() => { const /** @type {?} */ filtered = this._filterData(this._data); this.data = this._enrichData(filtered); return this.getPagedData(this.getSortedData([...this.data])); })); } /** * @param {?} filtered * @return {?} */ _enrichData(filtered) { const /** @type {?} */ rows = []; filtered.forEach(element => element.details ? rows.push(element, { detailRow: true, element }) : rows.push(element)); return rows; } /** * @param {?} data * @return {?} */ _filterData(data) { this.filteredData = !this.filter ? data : data.filter(obj => { // Transform the data into a lowercase string of all property values. const /** @type {?} */ accumulator = (currentTerm, key) => currentTerm + obj[key]; const /** @type {?} */ dataStr = Object.keys(obj).reduce(accumulator, '').toLowerCase(); // Transform the filter by converting it to lowercase and removing whitespace. const /** @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. * @return {?} */ disconnect() { } /** * 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 {?} */ getPagedData(data) { const /** @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 {?} */ getSortedData(data) { if (!this.sort.active || this.sort.direction === '') { return data; } return data.sort((a, b) => { const /** @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); } }); } } 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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmd4LWRhdGEtdGFibGUtZGF0YXNvdXJjZS5qcyIsInNvdXJjZVJvb3QiOiJuZzovL25neC1uZXN0ZWQtZGF0YS10YWJsZS8iLCJzb3VyY2VzIjpbImxpYi9uZ3gtZGF0YS10YWJsZS9uZ3gtZGF0YS10YWJsZS1kYXRhc291cmNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7QUFBQSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFFdEQsT0FBTyxFQUFFLEdBQUcsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQ3JDLE9BQU8sRUFBYSxFQUFFLElBQUksWUFBWSxFQUFFLEtBQUssRUFBRSxlQUFlLEVBQWdCLE1BQU0sTUFBTSxDQUFDOzs7Ozs7QUFPM0YsTUFBTSw2QkFBOEIsU0FBUSxVQUFlOzs7Ozs7SUFZekQsWUFDVSxXQUNBLE9BQ0E7UUFFUixLQUFLLEVBQUUsQ0FBQztRQUpBLGNBQVMsR0FBVCxTQUFTO1FBQ1QsVUFBSyxHQUFMLEtBQUs7UUFDTCxTQUFJLEdBQUosSUFBSTs2QkFiRSxJQUFJLGVBQWUsQ0FBUyxFQUFFLENBQUM7UUFnQjdDLElBQUksQ0FBQyxJQUFJLEdBQUcsS0FBSyxDQUFDOztRQUVsQix1QkFBTSxJQUFJLEdBQUcsRUFBRSxDQUFDO1FBQ2hCLEtBQUssQ0FBQyxPQUFPLENBQ1gsT0FBTyxDQUFDLEVBQUUsQ0FDUixPQUFPLENBQUMsT0FBTztZQUNiLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxFQUFFLFNBQVMsRUFBRSxJQUFJLEVBQUUsT0FBTyxFQUFFLENBQUM7WUFDbEQsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQ3pCLENBQUM7UUFDRixJQUFJLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQztLQUNsQjs7OztJQXZCRCxJQUFJLE1BQU07UUFDUixNQUFNLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxLQUFLLENBQUM7S0FDakM7Ozs7O0lB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QUFDLENBQUMsQ0FBQztZQUNwRCxNQUFNLENBQUMsSUFBSSxDQUFDO1NBQ2I7UUFFRCxNQUFNLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRTtZQUN4Qix1QkFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxTQUFTLEtBQUssS0FBSyxDQUFDO1lBQzVDLEVBQUUsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztnQkFDL0IsTUFBTSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsRUFBRSxLQUFLLENBQUMsQ0FBQzthQUNqRTtZQUFDLElBQUksQ0FBQyxDQUFDO2dCQUNOLE1BQU0sQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxFQUFFLEtBQUssQ0FBQyxDQUFDO2FBQ25FO1NBQ0YsQ0FBQyxDQUFDOztDQUVOOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBR0QsaUJBQWlCLENBQUMsRUFBRSxDQUFDLEVBQUUsS0FBSztJQUMxQixNQUFNLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztDQUM1QyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IERhdGFTb3VyY2UgfSBmcm9tICdAYW5ndWxhci9jZGsvY29sbGVjdGlvbnMnO1xuaW1wb3J0IHsgTWF0UGFnaW5hdG9yLCBNYXRTb3J0IH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwnO1xuaW1wb3J0IHsgbWFwIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuaW1wb3J0IHtPYnNlcnZhYmxlLCBvZiBhcyBvYnNlcnZhYmxlT2YsIG1lcmdlLCBCZWhhdmlvclN1YmplY3QsIGNvbWJpbmVMYXRlc3R9IGZyb20gJ3J4anMnO1xuXG4vKipcbiAqIERhdGEgc291cmNlIGZvciB0aGUgTmd4RGF0YVRhYmxlIHZpZXcuIFRoaXMgY2xhc3Mgc2hvdWxkXG4gKiBlbmNhcHN1bGF0ZSBhbGwgbG9naWMgZm9yIGZldGNoaW5nIGFuZCBtYW5pcHVsYXRpbmcgdGhlIGRpc3BsYXllZCBkYXRhXG4gKiAoaW5jbHVkaW5nIHNvcnRpbmcsIHBhZ2luYXRpb24sIGFuZCBmaWx0ZXJpbmcpLlxuICovXG5leHBvcnQgY2xhc3MgTmd4RGF0YVRhYmxlRGF0YVNvdXJjZSBleHRlbmRzIERhdGFTb3VyY2U8YW55PiB7XG4gIHB1YmxpYyBkYXRhOiBhbnlbXTtcbiAgX2ZpbHRlckNoYW5nZSA9IG5ldyBCZWhhdmlvclN1YmplY3Q8c3RyaW5nPignJyk7XG4gIGZpbHRlcmVkRGF0YTogYW55W107XG5cbiAgZ2V0IGZpbHRlcigpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLl9maWx0ZXJDaGFuZ2UudmFsdWU7XG4gIH1cbiAgc2V0IGZpbHRlcihmaWx0ZXI6IHN0cmluZykge1xuICAgIHRoaXMuX2ZpbHRlckNoYW5nZS5uZXh0KGZpbHRlcik7XG4gIH1cblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIHBhZ2luYXRvcjogTWF0UGFnaW5hdG9yLFxuICAgIHByaXZhdGUgX2RhdGE6IGFueVtdLFxuICAgIHByaXZhdGUgc29ydDogTWF0U29ydFxuICApIHtcbiAgICBzdXBlcigpO1xuICAgIHRoaXMuZGF0YSA9IF9kYXRhO1xuICAgIC8vIE1hc3RlciBkZXRhaWwgdGFibGVcbiAgICBjb25zdCByb3dzID0gW107XG4gICAgX2RhdGEuZm9yRWFjaChcbiAgICAgIGVsZW1lbnQgPT5cbiAgICAgICAgZWxlbWVudC5kZXRhaWxzXG4gICAgICAgICAgPyByb3dzLnB1c2goZWxlbWVudCwgeyBkZXRhaWxSb3c6IHRydWUsIGVsZW1lbnQgfSlcbiAgICAgICAgICA6IHJvd3MucHVzaChlbGVtZW50KVxuICAgICk7XG4gICAgdGhpcy5kYXRhID0gcm93cztcbiAgfVxuXG4gIC8qKlxuICAgKiBDb25uZWN0IHRoaXMgZGF0YSBzb3VyY2UgdG8gdGhlIHRhYmxlLiBUaGUgdGFibGUgd2lsbCBvbmx5IHVwZGF0ZSB3aGVuXG4gICAqIHRoZSByZXR1cm5lZCBzdHJlYW0gZW1pdHMgbmV3IGl0ZW1zLlxuICAgKiBAcmV0dXJucyBBIHN0cmVhbSBvZiB0aGUgaXRlbXMgdG8gYmUgcmVuZGVyZWQuXG4gICAqL1xuICBjb25uZWN0KCk6IE9ic2VydmFibGU8YW55W10+IHtcbiAgICAvLyBDb21iaW5lIGV2ZXJ5dGhpbmcgdGhhdCBhZmZlY3RzIHRoZSByZW5kZXJlZCBkYXRhIGludG8gb25lIHVwZGF0ZVxuICAgIC8vIHN0cmVhbSBmb3IgdGhlIGRhdGEtdGFibGUgdG8gY29uc3VtZS5cbiAgICBjb25zdCBkYXRhTXV0YXRpb25zID0gW1xuICAgICAgb2JzZXJ2YWJsZU9mKHRoaXMuZGF0YSksXG4gICAgICB0aGlzLnBhZ2luYXRvci5wYWdlLFxuICAgICAgdGhpcy5zb3J0LnNvcnRDaGFuZ2UsXG4gICAgICB0aGlzLl9maWx0ZXJDaGFuZ2UsXG4gICAgXTtcblxuICAgIC8vIFNldCB0aGUgcGFnaW5hdG9yIGxlbmd0aFxuICAgIHRoaXMucGFnaW5hdG9yLmxlbmd0aCA9IHRoaXMuZGF0YS5sZW5ndGg7XG5cbiAgICByZXR1cm4gbWVyZ2UoLi4uZGF0YU11dGF0aW9ucykucGlwZShcbiAgICAgIG1hcCgoKSA9PiB7XG4gICAgICAgIGNvbnN0IGZpbHRlcmVkID0gdGhpcy5fZmlsdGVyRGF0YSh0aGlzLl9kYXRhKTtcbiAgICAgICAgdGhpcy5kYXRhID0gdGhpcy5fZW5yaWNoRGF0YShmaWx0ZXJlZCk7XG4gICAgICAgIHJldHVybiB0aGlzLmdldFBhZ2VkRGF0YSh0aGlzLmdldFNvcnRlZERhdGEoWy4uLnRoaXMuZGF0YV0pKTtcbiAgICAgIH0pXG4gICAgKTtcbiAgfVxuXG4gIHByaXZhdGUgX2VucmljaERhdGEoZmlsdGVyZWQpIHtcbiAgICBjb25zdCByb3dzID0gW107XG4gICAgZmlsdGVyZWQuZm9yRWFjaChcbiAgICAgIGVsZW1lbnQgPT5cbiAgICAgICAgZWxlbWVudC5kZXRhaWxzXG4gICAgICAgICAgPyByb3dzLnB1c2goZWxlbWVudCwge2RldGFpbFJvdzogdHJ1ZSwgZWxlbWVudH0pXG4gICAgICAgICAgOiByb3dzLnB1c2goZWxlbWVudClcbiAgICApO1xuICAgIHJldHVybiByb3dzO1xuICB9XG5cbiAgcHJpdmF0ZSBfZmlsdGVyRGF0YShkYXRhOiBhbnlbXSkge1xuICAgIHRoaXMuZmlsdGVyZWREYXRhID1cbiAgICAgICF0aGlzLmZpbHRlciA/IGRhdGEgOiBkYXRhLmZpbHRlcihvYmogPT4ge1xuICAgICAgLy8gVHJhbnNmb3JtIHRoZSBkYXRhIGludG8gYSBsb3dlcmNhc2Ugc3RyaW5nIG9mIGFsbCBwcm9wZXJ0eSB2YWx1ZXMuXG4gICAgICBjb25zdCBhY2N1bXVsYXRvciA9IChjdXJyZW50VGVybSwga2V5KSA9PiBjdXJyZW50VGVybSArIG9ialtrZXldO1xuICAgICAgY29uc3QgZGF0YVN0ciA9IE9iamVjdC5rZXlzKG9iaikucmVkdWNlKGFjY3VtdWxhdG9yLCAnJykudG9Mb3dlckNhc2UoKTtcblxuICAgICAgLy8gVHJhbnNmb3JtIHRoZSBmaWx0ZXIgYnkgY29udmVydGluZyBpdCB0byBsb3dlcmNhc2UgYW5kIHJlbW92aW5nIHdoaXRlc3BhY2UuXG4gICAgICBjb25zdCB0cmFuc2Zvcm1lZEZpbHRlciA9IHRoaXMuZmlsdGVyLnRyaW0oKS50b0xvd2VyQ2FzZSgpO1xuXG4gICAgICByZXR1cm4gZGF0YVN0ci5pbmRleE9mKHRyYW5zZm9ybWVkRmlsdGVyKSAhPT0gLTE7XG4gICAgfSk7XG4gICAgcmV0dXJuIHRoaXMuZmlsdGVyZWREYXRhO1xuICB9XG5cbiAgLyoqXG4gICAqICBDYWxsZWQgd2hlbiB0aGUgdGFibGUgaXMgYmVpbmcgZGVzdHJveWVkLiBVc2UgdGhpcyBmdW5jdGlvbiwgdG8gY2xlYW4gdXBcbiAgICogYW55IG9wZW4gY29ubmVjdGlvbnMgb3IgZnJlZSBhbnkgaGVsZCByZXNvdXJjZXMgdGhhdCB3ZXJlIHNldCB1cCBkdXJpbmcgY29ubmVjdC5cbiAgICovXG4gIGRpc2Nvbm5lY3QoKSB7fVxuXG4gIC8qKlxuICAgKiBQYWdpbmF0ZSB0aGUgZGF0YSAoY2xpZW50LXNpZGUpLiBJZiB5b3UncmUgdXNpbmcgc2VydmVyLXNpZGUgcGFnaW5hdGlvbixcbiAgICogdGhpcyB3b3VsZCBiZSByZXBsYWNlZCBieSByZXF1ZXN0aW5nIHRoZSBhcHByb3ByaWF0ZSBkYXRhIGZyb20gdGhlIHNlcnZlci5cbiAgICovXG4gIHByaXZhdGUgZ2V0UGFnZWREYXRhKGRhdGE6IGFueVtdKSB7XG4gICAgY29uc3Qgc3RhcnRJbmRleCA9IHRoaXMucGFnaW5hdG9yLnBhZ2VJbmRleCAqIHRoaXMucGFnaW5hdG9yLnBhZ2VTaXplO1xuICAgIHJldHVybiBkYXRhLnNwbGljZShzdGFydEluZGV4LCB0aGlzLnBhZ2luYXRvci5wYWdlU2l6ZSk7XG4gIH1cblxuICAvKipcbiAgICogU29ydCB0aGUgZGF0YSAoY2xpZW50LXNpZGUpLiBJZiB5b3UncmUgdXNpbmcgc2VydmVyLXNpZGUgc29ydGluZyxcbiAgICogdGhpcyB3b3VsZCBiZSByZXBsYWNlZCBieSByZXF1ZXN0aW5nIHRoZSBhcHByb3ByaWF0ZSBkYXRhIGZyb20gdGhlIHNlcnZlci5cbiAgICovXG4gIHByaXZhdGUgZ2V0U29ydGVkRGF0YShkYXRhOiBhbnlbXSkge1xuICAgIGlmICghdGhpcy5zb3J0LmFjdGl2ZSB8fCB0aGlzLnNvcnQuZGlyZWN0aW9uID09PSAnJykge1xuICAgICAgcmV0dXJuIGRhdGE7XG4gICAgfVxuXG4gICAgcmV0dXJuIGRhdGEuc29ydCgoYSwgYikgPT4ge1xuICAgICAgY29uc3QgaXNBc2MgPSB0aGlzLnNvcnQuZGlyZWN0aW9uID09PSAnYXNjJztcbiAgICAgIGlmIChpc05hTihhW3RoaXMuc29ydC5hY3RpdmVdKSkge1xuICAgICAgICByZXR1cm4gY29tcGFyZShhW3RoaXMuc29ydC5hY3RpdmVdLCBiW3RoaXMuc29ydC5hY3RpdmVdLCBpc0FzYyk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gY29tcGFyZSgrYVt0aGlzLnNvcnQuYWN0aXZlXSwgK2JbdGhpcy5zb3J0LmFjdGl2ZV0sIGlzQXNjKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxufVxuXG4vKiogU2ltcGxlIHNvcnQgY29tcGFyYXRvciBmb3IgZXhhbXBsZSBJRC9OYW1lIGNvbHVtbnMgKGZvciBjbGllbnQtc2lkZSBzb3J0aW5nKS4gKi9cbmZ1bmN0aW9uIGNvbXBhcmUoYSwgYiwgaXNBc2MpIHtcbiAgcmV0dXJuIChhIDwgYiA/IC0xIDogMSkgKiAoaXNBc2MgPyAxIDogLTEpO1xufVxuIl19