openaire-library/searchPages/searchUtils/entitiesSelection.component.ts

265 lines
12 KiB
TypeScript

import {Component, EventEmitter, Input, Output, ViewChild} from '@angular/core';
import {FormBuilder} from "@angular/forms";
import {EnvProperties} from "../../utils/properties/env-properties";
import {SearchCustomFilter} from "./searchUtils.class";
import {ConfigurationService} from "../../utils/configuration/configuration.service";
import {Router} from "@angular/router";
import {MatSelect} from "@angular/material";
import {Subscription} from "rxjs";
import {properties} from '../../../../environments/environment';
@Component({
selector: 'entities-selection',
template: `
<span *ngIf="!disableSelect && show>1 && selectedEntity"
class=" entitiesSelection portal-box uk-text-small clickable" style=""
(click)="open()">
<mat-select *ngIf="!onlyresults" [(value)]="selectedEntity"
(valueChange)="entityChanged()" [disableOptionCentering]="true" [panelClass]="matPanelClass">
<mat-option *ngIf="simpleView && showAll"
value="all">All content
</mat-option>
<mat-option *ngIf="showResearchOutcomes" value="result">Research outcomes</mat-option>
<mat-option *ngIf="showProjects" value="project">Projects</mat-option>
<mat-option *ngIf="showDataProviders" value="dataprovider">Content providers</mat-option>
<mat-option *ngIf="showOrganizations" value="organization">Organizations</mat-option>
</mat-select>
<mat-select *ngIf="onlyresults" [(value)]="selectedEntity"
(valueChange)="entityChanged()" [disableOptionCentering]="true" [panelClass]="matPanelClass">
<mat-option
*ngIf="simpleView && showAll"
value="all">All research outcomes
</mat-option>
<mat-option *ngIf="showPublications" value="publications">Publications</mat-option>
<mat-option *ngIf="showDatasets" value="datasets">Datasets</mat-option>
<mat-option *ngIf="showSoftware" value="software">Software</mat-option>
<mat-option *ngIf="showOther" value="other">Other Research products</mat-option>
</mat-select>
</span>
<span *ngIf="currentEntity && disableSelect" class="entitiesSelection portal-box uk-text-small " style="">
<div>
<span *ngIf="currentEntity=='all'">{{onlyresults ? 'All research outcomes' : 'All content'}}</span>
<span *ngIf="currentEntity=='result'">Research outcomes</span>
<span *ngIf="currentEntity=='project'">Projects</span>
<span *ngIf="currentEntity=='dataprovider'">Content providers</span>
<span *ngIf="currentEntity=='organization'">Organizations</span>
<span *ngIf="currentEntity=='publications'">Publications</span>
<span *ngIf="currentEntity=='datasets'">Datasets</span>
<span *ngIf="currentEntity=='software'">Software</span>
<span *ngIf="currentEntity=='other'">Other Research products</span>
</div>
</span>
<!--<span *ngIf="onlyresults && !disableSelect">
<select *ngIf="show" [(ngModel)]="selectedEntity" class="uk-select uk-width-auto portal-box uk-text-small" (ngModelChange)="entityChanged()" >
<option
*ngIf="simpleView && (show)>1 && !(this.customFilter && this.customFilter.queryFieldName=='communityId' )"
value="all">All research outcomes
</option>
<option *ngIf="showPublications" value="publications">Publications</option>
<option *ngIf="showDatasets" value="datasets">Datasets</option>
<option *ngIf="showSoftware" value="software">Software</option>
<option *ngIf="showOther" value="other">Other Research products</option>
</select>
</span>-->
`
})
export class EntitiesSelectionComponent {
showResearchOutcomes: boolean = false;
showPublications: boolean = false;
showDatasets: boolean = false;
showSoftware: boolean = false;
showOther: boolean = false;
showProjects: boolean = false;
showDataProviders: boolean = false;
showOrganizations: boolean = false;
showAll: boolean = true;
@Input() allEnable = false;
@Input() properties: EnvProperties = properties;
@Input() customFilter: SearchCustomFilter = null;
@Input() @Output() selectedEntity = "Research Outcomes";
@Input() currentEntity = "Research Outcomes";
@Input() simpleView: boolean = true;
@Input() onChangeNavigate: boolean = true;
@Output() selectionChange = new EventEmitter();
@Input() onlyresults: boolean = false;
@Input() matPanelClass = "matSelectionPanel";
@Input() disableSelect: boolean = false;
show = 0;
@ViewChild(MatSelect) matSelect: MatSelect;
subs: Subscription[] = [];
constructor(private _fb: FormBuilder, private config: ConfigurationService, private router: Router) {}
ngOnInit() {
this.show = 0;
if(!this.allEnable) {
if((this.customFilter && this.customFilter.queryFieldName == "communityId") || (this.properties.adminToolsCommunity !== "monitor")) {
//this.config.getCommunityInformation(this.properties, (this.customFilter && this.customFilter.queryFieldName == "communityId") ? this.customFilter.valueId : this.properties.adminToolsCommunity).subscribe(data => {
this.subs.push(this.config.communityInformationState.subscribe(data => {
if(data) {
let showEntity = {};
let showPage = {};
if(data['entities']) {
for (let i = 0; i < data['entities'].length; i++) {
showEntity["" + data['entities'][i]["pid"] + ""] = data['entities'][i]["isEnabled"];
}
}
if(data['pages']) {
for (let i = 0; i < data['pages'].length; i++) {
showPage["" + data['pages'][i]["route"] + ""] = data['pages'][i]["isEnabled"];
}
}
this.showResearchOutcomes = showPage[this.simpleView?this.properties.searchLinkToResults:this.properties.searchLinkToAdvancedResults] && (showEntity["publication"] || showEntity["dataset"] || showEntity["software"] || showEntity["orp"]);
this.showPublications = showPage[this.simpleView?this.properties.searchLinkToResults:this.properties.searchLinkToAdvancedResults] && showEntity["publication"];
this.showDatasets = showPage[this.simpleView?this.properties.searchLinkToResults:this.properties.searchLinkToAdvancedResults] && showEntity["dataset"];
this.showSoftware = showPage[this.simpleView?this.properties.searchLinkToResults:this.properties.searchLinkToAdvancedResults] && showEntity["software"];
this.showOther = showPage[this.simpleView?this.properties.searchLinkToResults:this.properties.searchLinkToAdvancedResults] && showEntity["orp"];
this.showProjects = showPage[this.simpleView?this.properties.searchLinkToProjects:this.properties.searchLinkToAdvancedProjects] && showEntity["project"];
this.showOrganizations = showPage[this.simpleView?this.properties.searchLinkToOrganizations:this.properties.searchLinkToAdvancedOrganizations] && showEntity["organization"];
this.showDataProviders = showPage[this.simpleView?this.properties.searchLinkToDataProviders:this.properties.searchLinkToAdvancedDataProviders] && showEntity["datasource"];
if (this.customFilter && this.customFilter.queryFieldName == "communityId" || this.properties.adminToolsCommunity === "connect") {
//for community pages: no organization in simple search, only results in advanced
this.showAll = false;
this.showOrganizations = false;
if (!this.simpleView) {
this.showProjects = false;
this.showDataProviders = false;
}
}
if (this.showResearchOutcomes) {
this.show++;
}
if (this.showDataProviders) {
this.show++;
}
if (this.showOrganizations) {
this.show++;
}
if (this.showProjects) {
this.show++;
}
if (this.show == 1) {
this.disableSelect = true;
}
}
}));
} else if((this.customFilter && this.customFilter.queryFieldName == "community") && this.properties.adminToolsCommunity === "monitor") {
this.show = 1;
this.disableSelect = true;
} else if(this.customFilter && (this.customFilter.queryFieldName == "relfunder" || this.customFilter.queryFieldName == "funder")) {
/*this.showResearchOutcomes = true;
this.showPublications = true;
this.showDatasets = true;
this.showSoftware = true;
this.showOther = true;
this.showProjects = true;
this.showAll = false;
this.show = 2;*/
this.show = 1;
this.disableSelect = true;
} else if(this.customFilter && this.customFilter.queryFieldName == "relorganizationid") {
/*this.showResearchOutcomes = true;
this.showPublications = true;
this.showDatasets = true;
this.showSoftware = true;
this.showOther = true;
this.showProjects = true;
this.showDataProviders = true;
this.showAll = false;
this.show = 3;*/
this.show = 1;
this.disableSelect = true;
} else {
this.showResearchOutcomes = true;
this.showPublications = true;
this.showDatasets = true;
this.showSoftware = true;
this.showOther = true;
this.showProjects = true;
this.showOrganizations = true;
this.showDataProviders = true;
this.showAll = false;
this.show = 4;
}
} else {
this.showResearchOutcomes = true;
this.showPublications = true;
this.showDatasets = true;
this.showSoftware = true;
this.showOther = true;
this.showProjects = true;
this.showOrganizations = true;
this.showDataProviders = true;
this.showAll = true;
this.show = 5;
}
this.selectedEntity = this.currentEntity;
this.selectionChange.emit({
entity: this.selectedEntity,
simpleUrl: this.getUrl(true),
advancedUrl: this.getUrl(false)
});
}
public ngOnDestroy() {
for (let sub of this.subs) {
sub.unsubscribe();
}
}
entityChanged() {
if (!this.simpleView || this.onChangeNavigate) {
this.router.navigate([this.getUrl(this.simpleView)], {queryParams: this.customFilter?this.customFilter.getParameters():{}});
} else {
this.selectionChange.emit({
entity: this.selectedEntity,
simpleUrl: this.getUrl(true),
advancedUrl: this.getUrl(false)
});
}
}
getUrl(simpleView: boolean) {
let url = "";
if (!this.onlyresults) {
if (this.selectedEntity == "all") {
url = (simpleView ? "/search/find/" : null);
} else if (this.selectedEntity == "result") {
url = (simpleView ? this.properties.searchLinkToResults : this.properties.searchLinkToAdvancedResults);
} else if (this.selectedEntity == "project") {
url = (simpleView ? this.properties.searchLinkToProjects : this.properties.searchLinkToAdvancedProjects);
} else if (this.selectedEntity == "dataprovider") {
url = (simpleView ? this.properties.searchLinkToDataProviders : this.properties.searchLinkToAdvancedDataProviders);
} else if (this.selectedEntity == "organization") {
url = (simpleView ? this.properties.searchLinkToOrganizations : this.properties.searchLinkToAdvancedOrganizations);
}
} else {
url = (simpleView ? this.properties.searchLinkToResults : this.properties.searchLinkToAdvancedResults);
}
return url;
}
toggle() {
if (this.matSelect) {
this.matSelect.toggle();
}
}
open() {
if (this.matSelect && !this.matSelect.focused) {
this.matSelect.open();
}
}
}