import { DataSource } from '@angular/cdk/table'; import { Component, OnInit, ViewChild } from '@angular/core'; import { MatPaginator, MatSnackBar, MatSort, PageEvent } from '@angular/material'; import { ActivatedRoute, Params, Router } from '@angular/router'; import { TranslateService } from '@ngx-translate/core'; import { Observable } from 'rxjs'; import { takeUntil } from 'rxjs/operators'; import { BaseComponent } from '../../core/common/base/base.component'; import { DataManagementPlanProfileCriteria } from '../../models/criteria/dmp-profile/DataManagementPlanProfileCriteria'; import { DataManagementPlanProfileListingModel } from '../../models/data-management-plan-profile/DataManagementPlanProfileListingModel'; import { DataTableRequest } from '../../models/data-table/DataTableRequest'; import { DataManagementPlanProfileService } from '../../services/data-management-plan-profile/datamanagement-profile.service'; import { DataManagementPlanProfileCriteriaComponent } from '../../shared/components/criteria/datamanagementplanprofile/dmp-profile-criteria.component'; @Component({ selector: 'app-dmp-profile-listing-component', templateUrl: 'dmp-profile-listing.component.html', styleUrls: ['./dmp-profile-listing.component.scss'], providers: [DataManagementPlanProfileService] }) export class DataManagementPlanProfileListingComponent extends BaseComponent implements OnInit { @ViewChild(MatPaginator) _paginator: MatPaginator; @ViewChild(MatSort) sort: MatSort; @ViewChild(DataManagementPlanProfileCriteriaComponent) criteria: DataManagementPlanProfileCriteriaComponent; dataSource: DatasetDataSource | null; displayedColumns: String[] = ['label', 'status', 'created']; pageEvent: PageEvent; titlePrefix: String; dmpId: String; statuses = [ { value: '0', viewValue: 'Active' }, { value: '1', viewValue: 'Inactive' } ]; constructor( private router: Router, private languageService: TranslateService, public snackBar: MatSnackBar, public route: ActivatedRoute, public dataManagementPlanService: DataManagementPlanProfileService ) { super(); } ngOnInit() { this.route.params .pipe(takeUntil(this._destroyed)) .subscribe((params: Params) => { this.dmpId = params['dmpId']; this.criteria.setCriteria(this.getDefaultCriteria()); this.refresh(); this.criteria.setRefreshCallback(() => this.refresh()); }); } refresh() { this.dataSource = new DatasetDataSource(this.dataManagementPlanService, this._paginator, this.sort, this.languageService, this.snackBar, this.criteria); } rowClick(rowId: String) { this.router.navigate(['dmp-profiles/' + rowId]); } getDefaultCriteria(): DataManagementPlanProfileCriteria { const defaultCriteria = new DataManagementPlanProfileCriteria(); return defaultCriteria; } // makeItPublic(id: String) { // debugger; // this.datasetService.makeDatasetPublic(id).pipe(takeUntil(this._destroyed)).subscribe(); // } } export class DatasetDataSource extends DataSource { totalCount = 0; isLoadingResults = false; constructor( private _service: DataManagementPlanProfileService, private _paginator: MatPaginator, private _sort: MatSort, private _languageService: TranslateService, private _snackBar: MatSnackBar, private _criteria: DataManagementPlanProfileCriteriaComponent ) { super(); } connect(): Observable { const displayDataChanges = [ this._paginator.page //this._sort.matSortChange ]; return Observable.merge(...displayDataChanges) .startWith(null) .switchMap(() => { setTimeout(() => { this.isLoadingResults = true; }); const startIndex = this._paginator.pageIndex * this._paginator.pageSize; let fields: Array = new Array(); if (this._sort.active) { fields = this._sort.direction === 'asc' ? ['+' + this._sort.active] : ['-' + this._sort.active]; } const request = new DataTableRequest(startIndex, this._paginator.pageSize, { fields: fields }); request.criteria = this._criteria.criteria; return this._service.getPaged(request); }) /*.catch((error: any) => { this._snackBar.openFromComponent(SnackBarNotificationComponent, { data: { message: 'GENERAL.SNACK-BAR.FORMS-BAD-REQUEST', language: this._languageService }, duration: 3000, extraClasses: ['snackbar-warning'] }); //this._criteria.criteria.onCallbackError(error); return Observable.of(null); })*/ .map(result => { setTimeout(() => { this.isLoadingResults = false; }); return result; }) .map(result => { if (!result) { return []; } if (this._paginator.pageIndex === 0) { this.totalCount = result.totalCount; } return result.data; }); } disconnect() { // No-op } }