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 { DataTableRequest } from '../../../core/model/data-table/data-table-request'; import { DatasetListingModel } from '../../../core/model/dataset/dataset-listing'; import { DatasetCriteria } from '../../../core/query/dataset/dataset-criteria'; import { DatasetService } from '../../../core/services/dataset/dataset.service'; import { DmpService } from '../../../core/services/dmp/dmp.service'; import { EnumUtils } from '../../../core/services/utilities/enum-utils.service'; import { BreadcrumbItem } from '../../misc/breadcrumb/definition/breadcrumb-item'; import { IBreadCrumbComponent } from '../../misc/breadcrumb/definition/IBreadCrumbComponent'; import { DatasetCriteriaComponent } from './criteria/dataset-criteria.component'; @Component({ selector: 'app-dataset-listing-component', templateUrl: 'dataset-listing.component.html', styleUrls: ['./dataset-listing.component.scss'] }) export class DatasetListingComponent extends BaseComponent implements OnInit, IBreadCrumbComponent { @ViewChild(MatPaginator) _paginator: MatPaginator; @ViewChild(MatSort) sort: MatSort; @ViewChild(DatasetCriteriaComponent) criteria: DatasetCriteriaComponent; breadCrumbs: Observable; dataSource: DatasetDataSource | null; displayedColumns: String[] = ['label', 'project', 'dmp', 'profile', 'status', 'description', 'created']; pageEvent: PageEvent; titlePrefix: String; dmpId: string; status: Number; dmpSearchEnabled = true; constructor( private datasetService: DatasetService, private router: Router, private languageService: TranslateService, private snackBar: MatSnackBar, private route: ActivatedRoute, private dmpService: DmpService, public enumUtils: EnumUtils ) { super(); } ngOnInit() { this.route.params .pipe(takeUntil(this._destroyed)) .subscribe(async (params: Params) => { const queryParams = this.route.snapshot.queryParams; this.dmpId = queryParams['dmpId']; this.status = queryParams['status']; this.criteria.setRefreshCallback(() => this.refresh()); if (this.dmpId != null) { this.dmpSearchEnabled = false; const dmp = await this.dmpService.getSingle(this.dmpId).toPromise(); this.criteria.setCriteria(this.getDefaultCriteria(dmp)); this.refresh(); this.breadCrumbs = Observable.of([{ parentComponentName: 'DmpEditorComponent', label: dmp.label, url: 'plans/edit/' + this.dmpId }]); if (params['dmpLabel'] !== undefined) { this.titlePrefix = 'for ' + params['dmpLabel']; } } else { this.criteria.setCriteria(this.getDefaultCriteria()); this.refresh(); this.breadCrumbs = Observable.of([]); } if (this.status != null && this.status == 0) { this.criteria.setCriteria(this.getDraftCriteria()); this.refresh(); } }); } refresh() { this.dataSource = new DatasetDataSource(this.datasetService, this._paginator, this.sort, this.languageService, this.snackBar, this.criteria, this.dmpId); } rowClick(rowId: String) { this.router.navigate(['/datasets/edit/' + rowId]); } getDefaultCriteria(dmp: any = null): DatasetCriteria { const defaultCriteria = new DatasetCriteria(); if (dmp != null) { defaultCriteria.dmpIds.push(dmp); } return defaultCriteria; } getDraftCriteria(): DatasetCriteria { const draftCriteria = new DatasetCriteria(); draftCriteria.status = 0; return draftCriteria; } makeItPublic(id: String) { this.datasetService.makeDatasetPublic(id) .pipe(takeUntil(this._destroyed)) .subscribe(); } } export class DatasetDataSource extends DataSource { totalCount = 0; constructor( private _service: DatasetService, private _paginator: MatPaginator, private _sort: MatSort, private _languageService: TranslateService, private _snackBar: MatSnackBar, private _criteria: DatasetCriteriaComponent, private dmpId: String ) { super(); } connect(): Observable { const displayDataChanges = [ this._paginator.page //this._sort.matSortChange ]; return Observable.merge(...displayDataChanges) .startWith(null) .switchMap(() => { 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 = { like: this._criteria.criteria.like, status: this._criteria.criteria.status, dmpIds: this._criteria.criteria.dmpIds ? this._criteria.criteria.dmpIds.map(x => x.id) : null, tags: this._criteria.criteria.tags, allVersions: this._criteria.criteria.allVersions } if (this.dmpId) { request.criteria.allVersions = true; } 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 => { result.data = result.data; return result; }) .map(result => { return result; }) .map(result => { if (!result) { return []; } if (this._paginator.pageIndex === 0) { this.totalCount = result.totalCount; } return result.data; }); } disconnect() { // No-op } }