import {of as observableOf, Observable } from 'rxjs'; import {map, takeUntil } from 'rxjs/operators'; import { AfterViewInit, Component, EventEmitter, Input, OnInit, Output, ViewChild } from "@angular/core"; import { FormBuilder, FormControl, FormGroup } from "@angular/forms"; import { MatAccordion } from "@angular/material/expansion"; import { MatGridTileHeaderCssMatStyler } from "@angular/material/grid-list"; import { fadeInItems } from "@angular/material/menu"; import { ActivatedRoute } from "@angular/router"; import { TranslateService } from "@ngx-translate/core"; import { ValidationErrorModel } from "../../../common/forms/validation/error-model/validation-error-model"; import { GrantStateType } from '../../../core/common/enum/grant-state-type'; import { DataTableRequest } from "../../../core/model/data-table/data-table-request"; import { DatasetProfileModel } from "../../../core/model/dataset/dataset-profile"; import { ExternalSourceItemModel } from "../../../core/model/external-sources/external-source-item"; import { GrantListingModel } from "../../../core/model/grant/grant-listing"; import { ExploreDatasetCriteriaModel } from "../../../core/query/explore-dataset/explore-dataset-criteria"; import { ExploreDmpCriteriaModel } from "../../../core/query/explore-dmp/explore-dmp-criteria"; import { GrantCriteria } from "../../../core/query/grant/grant-criteria"; import { DatasetService } from "../../../core/services/dataset/dataset.service"; import { DmpService } from "../../../core/services/dmp/dmp.service"; import { ExternalSourcesService } from "../../../core/services/external-sources/external-sources.service"; import { GrantService } from "../../../core/services/grant/grant.service"; import { MultipleAutoCompleteConfiguration } from "../../../library/auto-complete/multiple/multiple-auto-complete-configuration"; import { BaseCriteriaComponent } from "../../misc/criteria/base-criteria.component"; import { OrganizationModel } from "../../../core/model/organisation/organization"; import { OrganisationCriteria } from "../../../core/query/organisation/organisation-criteria"; import { OrganisationService } from "../../../core/services/organisation/organisation.service"; @Component({ selector: 'app-explore-dmp-filters-component', templateUrl: './explore-dmp-filters.component.html', styleUrls: ['./explore-dmp-filters.component.scss'] }) export class ExploreDmpFiltersComponent extends BaseCriteriaComponent implements OnInit, AfterViewInit { @Input() facetCriteria = new ExploreDmpCriteriaModel(); @Output() facetCriteriaChange = new EventEmitter(); @Input() displayTitleFunc: (value) => string; GrantStateType = GrantStateType; grants: Observable; profiles: Observable; dmpOrganisations: Observable; grantOptions: Observable; grantStateOptions: Observable; filteringOrganisationsAsync = false; filteredOrganisations: OrganizationModel[]; status: GrantStateType; IsChecked: boolean; IsIndeterminate: boolean; LabelAlign: string; IsDisabled: boolean; Active: string; Inactive: string; @ViewChild('facetAccordion', { static: false }) accordion: MatAccordion; displayGrantStateValue = (option) => option['value']; displayGrantStateLabel = (option) => option['label']; displayGrantValue = (option) => option['id']; displayGrantLabel = (option) => option['label']; displayProfileValue = (option) => option['id']; displayProfileLabel = (option) => option['label']; displayDmpOrganisationsValue = (option) => option['id']; displayDmpOrganisationsLabel = (option) => option['name']; profileAutoCompleteConfiguration: MultipleAutoCompleteConfiguration = { filterFn: this.filterProfile.bind(this), initialItems: (excludedItems: any[]) => this.getProfiles().pipe( map(result => result.filter(resultItem => excludedItems.map(x => x.id).indexOf(resultItem.id) === -1))), displayFn: (item) => item['label'], titleFn: (item) => item['label'] }; organizationAutoCompleteConfiguration: MultipleAutoCompleteConfiguration = { filterFn: this.filterOrganisation.bind(this), initialItems: (excludedItems: any[]) => this.getOrganisations().pipe( map(result => result.filter(resultItem => excludedItems.map(x => x.id).indexOf(resultItem.id) === -1))), displayFn: (item) => item['name'], titleFn: (item) => item['name'] } grantAutoCompleteConfiguration: MultipleAutoCompleteConfiguration = { filterFn: this.filterGrant.bind(this), initialItems: (excludedItems: any[]) => this.filterGrant('').pipe( map(result => result.filter(resultItem => excludedItems.map(x => x.id).indexOf(resultItem.id) === -1))), displayFn: (item) => item['label'], titleFn: (item) => item['label'] } constructor( public activatedRoute: ActivatedRoute, public languageService: TranslateService, public grantService: GrantService, public datasetProfileService: DatasetService, public organisationService: OrganisationService, public externalSourcesService: ExternalSourcesService, private dmpService: DmpService ) { super(new ValidationErrorModel()); this.IsChecked = false; this.IsIndeterminate = false; this.LabelAlign = 'after'; this.IsDisabled = false; this.Active = "0"; this.Inactive = "1"; } ngOnInit() { setTimeout(x => { this.grantStateOptions = observableOf( [ { label: this.languageService.instant('FACET-SEARCH.GRANT-STATUS.OPTIONS.INACTIVE'), value: GrantStateType.Finished }, { label: this.languageService.instant('FACET-SEARCH.GRANT-STATUS.OPTIONS.ACTIVE'), value: GrantStateType.OnGoing }, ]); }); this.profiles = this.datasetProfileService.getDatasetProfiles(); const fields: Array = new Array(); fields.push('asc'); this.dmpOrganisations = this.organisationService.searchPublicOrganisations(new DataTableRequest(0, null, { fields: fields })).pipe(map(x => x.data)); } ngAfterViewInit(): void { // this.accordion.openAll(); } OnChange($event) { console.log($event); } OnIndeterminateChange($event) { console.log($event); } controlModified() { this.facetCriteriaChange.emit(this.facetCriteria); } grantSearch(value: string): Observable { const grantCriteria = new GrantCriteria(); grantCriteria.grantStateType = this.facetCriteria.grantStatus; grantCriteria['length'] = 10; grantCriteria.like = value; const fields: Array = new Array(); fields.push('asc'); const dataTableRequest: DataTableRequest = new DataTableRequest(0, null, { fields: fields }); dataTableRequest.criteria = grantCriteria; return this.grantService.getPublicPaged(dataTableRequest).pipe(map(x => x.data)); } grantStatusChanged(event) { this.facetCriteria.grantStatus = event.value; // this.facetCriteria.grantStatus = +event.source.ariaLabel; // For checkboxes // this.facetCriteria.grantStatus = event.option.value.value; // For // if (!event.source.checked) { if (event.value === 'null') { this.facetCriteria.grantStatus = null; this.grants = observableOf([]); this.facetCriteria.grants = []; } // if (event.checked) { // if (event.option.selected) { // if (event.source.checked) { else { const fields: Array = new Array(); fields.push('asc'); const dataTableRequest: DataTableRequest = new DataTableRequest(0, null, { fields: fields }); dataTableRequest.criteria = new GrantCriteria(); dataTableRequest.criteria.grantStateType = this.facetCriteria.grantStatus; dataTableRequest.criteria['length'] = 10; this.grants = this.grantService.getPublicPaged(dataTableRequest).pipe(map(x => x.data)); this.facetCriteria.grants = []; } this.facetCriteriaChange.emit(this.facetCriteria); } grantChanged(event: any) { const eventValue = event.option.value.id; if (event.option.selected) { this.facetCriteria.grants.push(eventValue); } if (!event.option.selected) { const index = this.facetCriteria.grants.indexOf(eventValue); this.facetCriteria.grants.splice(index, 1); } this.facetCriteriaChange.emit(this.facetCriteria); } removeGrant(grant) { this.facetCriteria.grants.splice(this.facetCriteria.grants.indexOf(grant), 1); this.facetCriteriaChange.emit(this.facetCriteria); } onProfileOptionSelected(items: DatasetProfileModel[]) { this.facetCriteria.datasetProfile.splice(0); this.facetCriteria.datasetProfile.push(...items.map(x => x.id)); this.facetCriteriaChange.emit(this.facetCriteria); } onProfileOptionRemoved(item: DatasetProfileModel) { const index = this.facetCriteria.datasetProfile.indexOf(item.id); if (index >= 0) { this.facetCriteria.datasetProfile.splice(index, 1); this.facetCriteriaChange.emit(this.facetCriteria); } } profileChanged(event: any) { const eventValue = event.option.value.id; if (event.option.selected) { this.facetCriteria.datasetProfile.push(eventValue); } if (!event.option.selected) { const index = this.facetCriteria.datasetProfile.indexOf(eventValue); this.facetCriteria.datasetProfile.splice(index, 1); } this.facetCriteriaChange.emit(this.facetCriteria); } removeProfile(profile) { this.facetCriteria.datasetProfile.splice(this.facetCriteria.datasetProfile.indexOf(profile), 1); this.facetCriteriaChange.emit(this.facetCriteria); } onOrganizationOptionSelected(items: OrganizationModel[]) { this.facetCriteria.dmpOrganisations.splice(0); this.facetCriteria.dmpOrganisations.push(...items.map(x => x.id)); this.facetCriteriaChange.emit(this.facetCriteria); } onOrganizationOptionRemoved(item: OrganizationModel) { const index = this.facetCriteria.dmpOrganisations.indexOf(item.id); if (index >= 0) { this.facetCriteria.dmpOrganisations.splice(index, 1); this.facetCriteriaChange.emit(this.facetCriteria); } } onGrantOptionSelected(items: GrantListingModel[]) { this.facetCriteria.grants.splice(0); this.facetCriteria.grants.push(...items.map(x => x.id)); this.facetCriteriaChange.emit(this.facetCriteria); } onGrantOptionRemoved(item: GrantListingModel) { const index = this.facetCriteria.grants.indexOf(item.id); if (index >= 0) { this.facetCriteria.grants.splice(index, 1); this.facetCriteriaChange.emit(this.facetCriteria); } } dmpOrganisationChanged(event: any) { const eventValue = event.option.value.id; if (event.option.selected) { this.facetCriteria.dmpOrganisations.push(eventValue); } if (!event.option.selected) { const index = this.facetCriteria.dmpOrganisations.indexOf(eventValue); this.facetCriteria.dmpOrganisations.splice(index, 1); } this.facetCriteriaChange.emit(this.facetCriteria); } profileSearch(value: string) { return this.datasetProfileService.getDatasetProfiles(); } dmpOrganisationSearch(value: string): Observable { 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.searchPublicOrganisations(dataTableRequest).pipe(map(x => x.data)); } removeOrganisation(organisation) { this.facetCriteria.dmpOrganisations.splice(this.facetCriteria.dmpOrganisations.indexOf(organisation), 1); this.facetCriteriaChange.emit(this.facetCriteria); } getProfiles() { return this.datasetProfileService.getDatasetProfiles(); } getOrganisations() { const fields: Array = new Array(); fields.push('asc'); const dataTableRequest: DataTableRequest = new DataTableRequest(0, null, { fields: fields }); dataTableRequest.criteria = new OrganisationCriteria(); dataTableRequest.criteria.labelLike = ''; return this.organisationService.searchPublicOrganisations(dataTableRequest).pipe(map(x => x.data)); } filterGrant(query: string) { const fields: Array = new Array(); fields.push('asc'); const grantRequestItem: DataTableRequest = new DataTableRequest(0, null, { fields: fields }); grantRequestItem.criteria = new GrantCriteria(); grantRequestItem.criteria.like = query; return this.grantService.getPublicPaged(grantRequestItem).pipe(map(x => x.data)); } filterProfile(query: string) { const fields: Array = new Array(); fields.push('asc'); const profileRequestItem: DataTableRequest = new DataTableRequest(0, null, { fields: fields }); profileRequestItem.criteria = new ExploreDatasetCriteriaModel(); profileRequestItem.criteria.like = query; return this.dmpService.getPublicPaged(profileRequestItem, "listing").pipe(map(x => x.data)); } filterOrganisation(value: string) { this.filteringOrganisationsAsync = true; 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.searchPublicOrganisations(dataTableRequest).pipe(map(x => x.data)); } displayLabel(value) { return this.displayTitleFunc ? this.displayTitleFunc(value) : value; } isOptionSelected(profile: any) { return this.formGroup.value.map(x => x.id).indexOf(profile.id) !== -1; } }