import { Component, OnInit } from '@angular/core'; import { Observable } from 'rxjs'; import { ValidationErrorModel } from '../../../../common/forms/validation/error-model/validation-error-model'; import { DatasetStatus } from '../../../../core/common/enum/dataset-status'; import { ExternalSourceItemModel } from '../../../../core/model/external-sources/external-source-item'; import { DatasetCriteria } from '../../../../core/query/dataset/dataset-criteria'; import { TagCriteria } from '../../../../core/query/tag/tag-criteria'; import { ExternalSourcesService } from '../../../../core/services/external-sources/external-sources.service'; import { EnumUtils } from '../../../../core/services/utilities/enum-utils.service'; import { RequestItem } from '../../../../core/query/request-item'; import { BaseCriteriaComponent } from '../../../misc/criteria/base-criteria.component'; import { DmpCriteria } from '../../../../core/query/dmp/dmp-criteria'; import { DmpService } from '../../../../core/services/dmp/dmp.service'; import { DataTableRequest } from '../../../../core/model/data-table/data-table-request'; import { DataTableData } from '../../../../core/model/data-table/data-table-data'; import { DmpListingModel } from '../../../../core/model/dmp/dmp-listing'; import { Input } from '@angular/core'; import { MatDialog, MatSnackBar } from '@angular/material'; import { DatasetUploadDialogue } from './dataset-upload-dialogue/dataset-upload-dialogue.component'; import { takeUntil } from 'rxjs/operators'; import { reserveSlots } from '@angular/core/src/render3/instructions'; import { DatasetWizardService } from '../../../../core/services/dataset-wizard/dataset-wizard.service'; import { ViewChild } from '@angular/core'; import { UiNotificationService, SnackBarNotificationLevel } from '../../../../core/services/notification/ui-notification-service'; import { Router } from '@angular/router'; import { TranslateService } from '@ngx-translate/core'; import { FormGroup, FormBuilder, FormControl } from '@angular/forms'; import { MultipleAutoCompleteConfiguration } from '../../../../library/auto-complete/multiple/multiple-auto-complete-configuration'; import { OrganisationCriteria } from '../../../../core/query/organisation/organisation-criteria'; import { OrganisationService } from '../../../../core/services/organisation/organisation.service'; import { ProjectCriteria } from '../../../../core/query/project/project-criteria'; import { ProjectService } from '../../../../core/services/project/project.service'; @Component({ selector: 'app-dataset-criteria-component', templateUrl: './dataset-criteria.component.html', styleUrls: ['./dataset-criteria.component.scss'] }) export class DatasetCriteriaComponent extends BaseCriteriaComponent implements OnInit { @Input() dmpSearchEnabled; public criteria: any; public filteringTagsAsync = false; public filteredTags: ExternalSourceItemModel[]; statuses = DatasetStatus; options: FormGroup; public formGroup = new FormBuilder().group({ like: new FormControl(), dmpIds: new FormControl(), projects: new FormControl(), status: new FormControl(), role: new FormControl(), organisations: new FormControl() }); tagsAutoCompleteConfiguration = { filterFn: this.filterTags.bind(this), initialItems: (excludedItems: any[]) => this.filterTags('').map(result => result.filter(resultItem => excludedItems.map(x => x.id).indexOf(resultItem.id) === -1)), displayFn: (item) => item['name'], titleFn: (item) => item['name'] }; dmpAutoCompleteConfiguration = { filterFn: (x, excluded) => this.filterDmps(x).map(x => x.data), initialItems: (extraData) => this.filterDmps('').map(x => x.data), displayFn: (item) => item['label'], titleFn: (item) => item['label'] }; projectAutoCompleteConfiguration: MultipleAutoCompleteConfiguration = { filterFn: this.filterProject.bind(this), initialItems: (excludedItems: any[]) => this.filterProject('').map(result => result.filter(resultItem => excludedItems.map(x => x.id).indexOf(resultItem.id) === -1)), displayFn: (item) => item['label'], titleFn: (item) => item['label'] }; organisationAutoCompleteConfiguration: MultipleAutoCompleteConfiguration = { filterFn: this.filterOrganisations.bind(this), initialItems: (excludedItems: any[]) => this.filterOrganisations('').map(result => result.filter(resultItem => excludedItems.map(x => x.id).indexOf(resultItem.id) === -1)), displayFn: (item) => item['name'], titleFn: (item) => item['name'] } constructor( private externalSourcesService: ExternalSourcesService, public enumUtils: EnumUtils, public dmpService: DmpService, public datasetWizardService: DatasetWizardService, private dialog: MatDialog, private snackBar: MatSnackBar, private uiNotificationService: UiNotificationService, private router: Router, private language: TranslateService, public projectService: ProjectService, private organisationService: OrganisationService, fb: FormBuilder ) { super(new ValidationErrorModel()); // this.options = fb.group({ // status: new FormControl(), // floatLabel: 'auto', // }); } ngOnInit() { super.ngOnInit(); this.formGroup.get('like').valueChanges .pipe(takeUntil(this._destroyed)) .subscribe(x => this.controlModified()); this.formGroup.get('dmpIds').valueChanges .pipe(takeUntil(this._destroyed)) .subscribe(x => this.controlModified()); this.formGroup.get('projects').valueChanges .pipe(takeUntil(this._destroyed)) .subscribe(x => this.controlModified()); this.formGroup.get('status').valueChanges .pipe(takeUntil(this._destroyed)) .subscribe(x => this.controlModified()); this.formGroup.get('role').valueChanges .pipe(takeUntil(this._destroyed)) .subscribe(x => this.controlModified()); this.formGroup.get('organisations').valueChanges .pipe(takeUntil(this._destroyed)) .subscribe(x => this.controlModified()); // if (this.criteria == null) { this.criteria = {}; } } setCriteria(criteria: DatasetCriteria): void { this.formGroup.get('like').patchValue(criteria.like); this.formGroup.get('dmpIds').patchValue(criteria.dmpIds); this.formGroup.get('projects').patchValue(criteria.projects); this.formGroup.get('status').patchValue(criteria.like); this.formGroup.get('role').patchValue(criteria.like); // this.criteria = criteria; } controlModified(): void { this.clearErrorModel(); if (this.refreshCallback != null && (this.formGroup.get('like').value == null || this.formGroup.get('like').value.length === 0 || this.formGroup.get('like').value.length > 2) ) { setTimeout(() => this.refreshCallback()); } // if (this.refreshCallback != null && // (this.criteria.like == null || this.criteria.like.length === 0 || this.criteria.like.length > 2) // ) { // this.refreshCallback(); // } } filterTags(value: string): Observable { this.filteredTags = undefined; this.filteringTagsAsync = true; const requestItem: RequestItem = new RequestItem(); const criteria: TagCriteria = new TagCriteria(); criteria.like = value; requestItem.criteria = criteria; return this.externalSourcesService.searchDatasetTags(requestItem); } filterDmps(value: string): Observable> { const fields: Array = new Array(); fields.push('asc'); const dmpDataTableRequest: DataTableRequest = new DataTableRequest(0, null, { fields: fields }); dmpDataTableRequest.criteria = new DmpCriteria(); dmpDataTableRequest.criteria.like = value; return this.dmpService.getPaged(dmpDataTableRequest, "autocomplete"); } filterProject(query: string) { const fields: Array = new Array(); fields.push('asc'); const projectRequestItem: DataTableRequest = new DataTableRequest(0, null, { fields: fields }); projectRequestItem.criteria = new ProjectCriteria(); projectRequestItem.criteria.like = query; return this.projectService.getPaged(projectRequestItem, "autocomplete").map(x => x.data); } filterOrganisations(value: string) { const fields: Array = new Array(); fields.push('asc'); const dataTableRequest: DataTableRequest = new DataTableRequest(0, null, { fields: fields }); dataTableRequest.criteria = new OrganisationCriteria(); dataTableRequest.criteria.labelLike = value; return this.organisationService.searchInternalOrganisations(dataTableRequest).map(x => x.data); } fileImport(event) { const dialogRef = this.dialog.open(DatasetUploadDialogue, { data: { fileList: FileList, success: Boolean, datasetTitle: String, dmpId: String, datasetProfileId: String, dmpSearchEnabled: this.dmpSearchEnabled, criteria: this.criteria } }); dialogRef.afterClosed().pipe(takeUntil(this._destroyed)).subscribe(result => { if (result && result.success) { this.datasetWizardService.uploadXml(result.fileList, result.datasetTitle, result.dmpId, result.datasetProfileId) .pipe(takeUntil(this._destroyed)) .subscribe( complete => this.onCallbackSuccess(), error => this.onCallbackError(error) ); } }) } onCallbackSuccess(): void { this.uiNotificationService.snackBarNotification(this.language.instant('DATASET-UPLOAD.SNACK-BAR.SUCCESSFUL-CREATION'), SnackBarNotificationLevel.Success); this.router.navigate(['/plans']); } onCallbackError(error: any) { this.uiNotificationService.snackBarNotification(this.language.instant('DATASET-UPLOAD.SNACK-BAR.UNSUCCESSFUL'), SnackBarNotificationLevel.Success); } }