ngx-nested-data-table
Version:
angular master-detail table angular material style
157 lines (156 loc) • 15.7 kB
JavaScript
/**
* @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