import { BaseComponent } from '@common/base/base.component'; import { OnInit, Component, Input, Output, EventEmitter } from '@angular/core'; import { FormGroup } from '@angular/forms'; import { TranslateService } from '@ngx-translate/core'; import { ConfigurationService } from '@app/core/services/configuration/configuration.service'; import { MultipleAutoCompleteConfiguration } from '@app/library/auto-complete/multiple/multiple-auto-complete-configuration'; import { map, takeUntil } from 'rxjs/operators'; import { Observable } from 'rxjs'; import { ExternalSourcesService } from '@app/core/services/external-sources/external-sources.service'; import { isNullOrUndefined } from 'util'; import { MatDialog } from '@angular/material'; import { DatasetProfileModel } from '@app/core/model/dataset/dataset-profile'; import { DatasetProfileCriteria } from '@app/core/query/dataset-profile/dataset-profile-criteria'; import { DataTableRequest } from '@app/core/model/data-table/data-table-request'; import { DmpService } from '@app/core/services/dmp/dmp.service'; import { DmpProfileDefinition } from '@app/core/model/dmp-profile/dmp-profile'; import { DmpProfileService } from '@app/core/services/dmp/dmp-profile.service'; import { AvailableProfilesComponent } from '../available-profiles/available-profiles.component'; import { DmpEditorModel } from '../dmp-editor.model'; import { Router } from '@angular/router'; @Component({ selector: 'dataset-info', templateUrl: './dataset-info.component.html', styleUrls: ['./dataset-info.component.scss'] }) export class DatasetInfoComponent extends BaseComponent implements OnInit { @Input() formGroup: FormGroup = null; @Input() isUserOwner: boolean; @Input() dmp: DmpEditorModel; @Input() isPublic: boolean; @Input() isFinalized: boolean; @Input() isNewVersion: boolean; @Input() isClone: boolean; @Output() onFormChanged: EventEmitter = new EventEmitter(); selectedDmpProfileDefinition: DmpProfileDefinition; profilesAutoCompleteConfiguration: MultipleAutoCompleteConfiguration; constructor( private language: TranslateService, private configurationService: ConfigurationService, private externalSourcesService: ExternalSourcesService, private dialog: MatDialog, private _service: DmpService, private dmpProfileService: DmpProfileService, private router: Router ) { super(); } ngOnInit() { this.profilesAutoCompleteConfiguration = { filterFn: this.filterProfiles.bind(this), initialItems: (excludedItems: any[]) => this.filterProfiles('').pipe(map(result => result.filter(resultItem => (excludedItems || []).map(x => x.id).indexOf(resultItem.id) === -1))), displayFn: (item) => item['label'], titleFn: (item) => item['label'], subtitleFn: (item) => item['description'] }; if (this.formGroup.get('definition')) { this.selectedDmpProfileDefinition = this.formGroup.get('definition').value; } this.registerFormEventsForDmpProfile(); if (this.isNewVersion) { this.formGroup.get('label').disable(); } if (!this.isUserOwner && !this.isClone) { this.formGroup.disable(); } if (isNullOrUndefined(this.formGroup.get('extraProperties').get('publicDate').value)) { this.formGroup.get('extraProperties').get('publicDate').patchValue(new Date()); } this.formGroup.valueChanges.pipe(takeUntil(this._destroyed)) .subscribe(x => { this.profilesAutoCompleteConfiguration = { filterFn: this.filterProfiles.bind(this), initialItems: (excludedItems: any[]) => this.filterProfiles('').pipe(map(result => result.filter(resultItem => (excludedItems || []).map(x => x.id).indexOf(resultItem.id) === -1))), displayFn: (item) => item['label'], titleFn: (item) => item['label'], subtitleFn: (item) => item['description'] }; this.onFormChanged.emit(); }); } // Researchers filterProfiles(value: string): Observable { const request = new DataTableRequest(null, null, { fields: ['+label'] }); const criteria = new DatasetProfileCriteria(); criteria.like = value; request.criteria = criteria; return this._service.searchDMPProfiles(request); } registerFormEventsForDmpProfile(definitionProperties?: DmpProfileDefinition): void { this.formGroup.get('profile').valueChanges .pipe( takeUntil(this._destroyed)) .subscribe(Option => { if (Option instanceof Object) { this.selectedDmpProfileDefinition = null; this.dmpProfileService.getSingle(Option.id) .pipe(takeUntil(this._destroyed)) .subscribe(result => { this.selectedDmpProfileDefinition = result.definition; }); } else { this.selectedDmpProfileDefinition = null; } this.selectedDmpProfileDefinition = definitionProperties; }) } availableProfiles(event: MouseEvent) { event.stopPropagation(); const dialogRef = this.dialog.open(AvailableProfilesComponent, { data: { profiles: this.formGroup.get('profiles') } }); return false; } addDataset(id: String) { this.router.navigate(['/datasets/new/' + id]); } }