import { Component, ViewChild, OnInit, AfterViewInit } from "@angular/core"; import { MatPaginator, MatSort, MatSnackBar } from "@angular/material"; import { Router } from "@angular/router"; import { TranslateService } from "@ngx-translate/core"; import { DataSource } from "@angular/cdk/table"; import { Observable } from "rxjs/Observable"; import { DataTableRequest } from "@app/models/data-table/DataTableRequest"; import { SnackBarNotificationComponent } from "../shared/components/notificaiton/snack-bar-notification.component"; import { DataManagementPlanService } from "../services/data-management-plan/data-management-plan.service"; import { DataManagementPlanCriteriaComponent } from "../shared/components/criteria/data-management-plan/dmp-criteria.component"; import { DataManagementPlanCriteria } from "../models/criteria/data-management-plan/DataManagementPlanCriteria"; import { DataManagementPlanListingModel } from "../models/data-managemnt-plans/DataManagementPlanListingModel"; @Component({ selector: 'app-dmp-listing-component', templateUrl: 'dmp-listing.component.html', styleUrls: ['./dmp-listing.component.scss'], providers: [DataManagementPlanService] }) export class DataManagementPlanListingComponent implements OnInit { @ViewChild(MatPaginator) _paginator: MatPaginator; @ViewChild(MatSort) sort: MatSort; @ViewChild(DataManagementPlanCriteriaComponent) criteria: DataManagementPlanCriteriaComponent; dataSource: DataManagementPlanDataSource | null; displayedColumns: String[] = ['name', 'project', 'profile', 'researchers', 'organisations', 'version']; constructor( private dataManagementPlanService: DataManagementPlanService, private router: Router, private languageService: TranslateService, public snackBar: MatSnackBar, ) { } ngOnInit() { this.criteria.setCriteria(this.getDefaultCriteria()); this.refresh(); this.criteria.setRefreshCallback(() => this.refresh()); } refresh() { this.dataSource = new DataManagementPlanDataSource(this.dataManagementPlanService, this._paginator, this.sort, this.languageService, this.snackBar, this.criteria, ); } rowClick(rowId: String) { this.router.navigate(['/dmp/' + rowId]); } getDefaultCriteria(): DataManagementPlanCriteria { const defaultCriteria = new DataManagementPlanCriteria(); return defaultCriteria; } } export class DataManagementPlanDataSource extends DataSource { totalCount = 0; isLoadingResults = false; constructor( private _service: DataManagementPlanService, private _paginator: MatPaginator, private _sort: MatSort, private _languageService: TranslateService, private _snackBar: MatSnackBar, private _criteria: DataManagementPlanCriteriaComponent ) { super(); //this._paginator.page.subscribe((pageEvent: PageEvent) => { // this.store.dispatch(new LoadPhotosRequestAction(pageEvent.pageIndex, pageEvent.pageSize)) //}) } connect(): Observable { const displayDataChanges = [ this._paginator.page //this._sort.matSortChange ]; // If the user changes the sort order, reset back to the first page. //this._sort.matSortChange.subscribe(() => { // this._paginator.pageIndex = 0; //}) return Observable.merge(...displayDataChanges) .startWith(null) .switchMap(() => { setTimeout(() => { this.isLoadingResults = true; }); const startIndex = this._paginator.pageIndex * this._paginator.pageSize; const request = new DataTableRequest(startIndex, this._paginator.pageSize); 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.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 } }