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'; import { RequestItem } from '@app/core/query/request-item'; import { DatasetWizardService } from '@app/core/services/dataset-wizard/dataset-wizard.service'; import { DatasetDescriptionFormEditorModel } from '@app/ui/misc/dataset-description-form/dataset-description-form.model'; import { DatasetWizardEditorModel } from '@app/ui/dataset/dataset-wizard/dataset-wizard-editor.model'; import { DmpListingModel } from '@app/core/model/dmp/dmp-listing'; @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() isNewDataset: boolean; @Input() isClone: boolean; @Output() onFormChanged: EventEmitter = new EventEmitter(); availableProfiles: DatasetProfileModel[] = []; selectedDmpProfileDefinition: DmpProfileDefinition; profilesAutoCompleteConfiguration: MultipleAutoCompleteConfiguration; datasetProfileDefinitionModel: DatasetDescriptionFormEditorModel; constructor( private language: TranslateService, private configurationService: ConfigurationService, private externalSourcesService: ExternalSourcesService, private datasetWizardService: DatasetWizardService, 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.get('datasets')['controls'][0].get('dmp').valueChanges.pipe(takeUntil(this._destroyed)) .subscribe(x => { // this.registerFormListeners(); this.loadDatasetProfiles(); 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; }) } loadDatasetProfiles() { const datasetProfileRequestItem: RequestItem = new RequestItem(); datasetProfileRequestItem.criteria = new DatasetProfileCriteria(); datasetProfileRequestItem.criteria.id = this.formGroup.get('datasets')['controls'][0].get('dmp').value.id; if (datasetProfileRequestItem.criteria.id) { this.datasetWizardService.getAvailableProfiles(datasetProfileRequestItem) .pipe(takeUntil(this._destroyed)) .subscribe(items => { this.availableProfiles = items; }); } } allAvailableProfiles(event: MouseEvent) { event.stopPropagation(); const dialogRef = this.dialog.open(AvailableProfilesComponent, { data: { profiles: this.formGroup.get('profiles') } }); return false; } dmpValueChanged(dmp: DmpListingModel) { if (dmp) { this.formGroup.get('profile').enable(); this.loadDatasetProfiles(); } else { this.availableProfiles = []; this.formGroup.get('profile').reset(); this.formGroup.get('profile').disable(); this.formGroup.removeControl('datasetProfileDefinition'); } } registerFormListeners() { // this.formGroup.get('datasets')['controls'][0].get('dmp').valueChanges // .pipe(takeUntil(this._destroyed)) // .subscribe(x => { // this.dmpValueChanged(x); // }); // this.formGroup.get('profile').valueChanges // .pipe(takeUntil(this._destroyed)) // .subscribe(x => { // //this.datasetProfileValueChanged(x); // }); } datasetProfileValueChanged(profiledId: string) { if (profiledId && profiledId.length > 0) { this.formGroup.removeControl('datasetProfileDefinition'); this.getDefinition(); } } getDefinition() { // if (this.formGroup.invalid) { setTimeout(() => this.stepper.selectedIndex = 0); return; } this.datasetWizardService.getDefinition(this.formGroup.get('profile').value) .pipe(takeUntil(this._destroyed)) .subscribe(item => { this.formGroup.get('datasets')['controls'][0].datasetProfileDefinition = new DatasetDescriptionFormEditorModel().fromModel(item); this.datasetProfileDefinitionModel = this.formGroup.get('datasets')['controls'][0].datasetProfileDefinition; this.formGroup.addControl('datasetProfileDefinition', this.datasetProfileDefinitionModel.buildForm()); }); } addDataset(id: String) { this.router.navigate(['/datasets/new/' + id]); } }