Merge remote-tracking branch 'origin/develop' into umbrella
This commit is contained in:
commit
78b2f35c43
|
@ -1,6 +1,7 @@
|
|||
//Classes used in linking / inlinelinking when selecting an entity
|
||||
import {HelperFunctions} from "../../utils/HelperFunctions.class";
|
||||
import {OpenaireEntities} from "../../utils/properties/searchFields";
|
||||
import {ClaimsProperties} from "./claims.properties";
|
||||
|
||||
export class ClaimResult {
|
||||
public source: string;
|
||||
|
@ -189,17 +190,18 @@ export class ShowOptions {
|
|||
|
||||
}
|
||||
|
||||
initSelectOptions(){
|
||||
initSelectOptions(claimProperties:ClaimsProperties){
|
||||
let options =[];
|
||||
if(this.linkToEntities.indexOf('result')!=-1){
|
||||
options.push({value: 'result',label: OpenaireEntities.RESULTS})
|
||||
}
|
||||
if(this.linkToEntities.indexOf('project')!=-1){
|
||||
options.push({value: 'project',label: OpenaireEntities.PROJECTS})
|
||||
options.push({value: 'project',label: claimProperties.SELECT_ENTITIES.projects})
|
||||
}
|
||||
if(this.linkToEntities.indexOf('context')!=-1){
|
||||
options.push({value: 'context',label: OpenaireEntities.COMMUNITIES})
|
||||
}
|
||||
this.selectOptions = options;
|
||||
console.log(options, claimProperties.SELECT_ENTITIES.projects)
|
||||
}
|
||||
}
|
||||
|
|
|
@ -1,69 +1,25 @@
|
|||
<div class="uk-width-xlarge@l uk-width-large" [ngClass]="centerAlign ? 'uk-align-center':''">
|
||||
<div class="uk-width-expand" [ngClass]="centerAlign ? 'uk-align-center':''">
|
||||
<advanced-search-input (searchEmitter)="search(page,size)">
|
||||
<div input type="select" [(value)]="showOptions.show" placeholder="Type" hint="Select..."
|
||||
[options]="showOptions.selectOptions" class="uk-width-2-5"></div>
|
||||
<div class="uk-width-expand" input type="text" [(value)]="keyword" [searchable]="true" placeholder="Entities to link"
|
||||
[hint]="'Search for ' + openaireEntities.PROJECTS + '...'" tooltip="true"></div>
|
||||
[options]="showOptions.selectOptions" class="uk-width-medium@xl uk-width-auto"></div>
|
||||
<div *ngIf="funderOptions && funderOptions.length > 0" input type="select" [(value)]="selectedFunder" placeholder="Funder" hint="Select Funder..."
|
||||
[options]="funderOptions" class="uk-width-expand" (valueChange)="funderChanged($event)"></div>
|
||||
<div class="uk-width-expand" input type="text" [(value)]="keyword" [searchable]="true" placeholder="Projects to link"
|
||||
[hint]="'Search for ' + openaireEntities.PROJECTS + '...'" tooltip="true" [disabled]="isNoProjectFunder"></div>
|
||||
</advanced-search-input>
|
||||
</div>
|
||||
<div *ngIf="!showResults">
|
||||
<div *ngIf=" openaireResultsStatus != errorCodes.LOADING && !isNoProjectFunder && this.selectedFunder && openaireResults.length == 0">
|
||||
<div class="uk-text-center uk-text-large uk-text-meta uk-margin-large-top">No {{openaireEntities.PROJECT.toLowerCase()}} results yet... <br>Start
|
||||
searching for {{openaireEntities.PROJECTS.toLowerCase()}} to add them in the Basket
|
||||
</div>
|
||||
</div>
|
||||
<div *ngIf="showResults" class="uk-margin-top">
|
||||
<div *ngIf=" openaireResultsStatus != errorCodes.LOADING && this.funderOptions.length > 1 && !this.selectedFunder">
|
||||
<div class="uk-text-center uk-text-large uk-text-meta uk-margin-large-top">Select funder or search for projects to proceed
|
||||
</div>
|
||||
</div>
|
||||
<div class="uk-margin-top">
|
||||
<div class="uk-grid" uk-grid>
|
||||
<div class="search-filters uk-width-1-1">
|
||||
<!--<div *ngIf="countFilters()>0 && openaireResultsNum > 0" class="uk-grid uk-flex uk-flex-bottom">
|
||||
<div class="uk-grid">
|
||||
<h6 class="uk-text-bold">Filters</h6>
|
||||
<a *ngIf="countFilters()>1" (click)="clearFilters()"
|
||||
[class]="((openaireResultsStatus ==
|
||||
errorCodes.LOADING)?'uk-disabled uk-link-muted':'')+' portal-link '">
|
||||
Clear All
|
||||
</a>
|
||||
</div>
|
||||
<div *ngIf="countFilters()>0" class="uk-grid uk-grid-small uk-text-small uk-margin-small-top " uk-grid>
|
||||
<ng-container *ngFor="let filter of rangeFilters " >
|
||||
<ng-container *ngIf = "filter.selectedFromAndToValues">
|
||||
<span [title]="'Remove '+ filter.selectedFromAndToValues" (click) = "removeRangeFilter(filter) " >
|
||||
<span class="selectedFilterLabel ">
|
||||
<a [class]="((openaireResultsStatus ==
|
||||
errorCodes.LOADING)?' uk-disabled':' ')+' uk-link-text '">
|
||||
<span class=" clickable" aria-hidden="true">
|
||||
<span class="uk-icon">
|
||||
<svg width="16" height="16" viewBox="0 0 20 20" xmlns="http://www.w3.org/2000/svg" icon="close" ratio="0.8"><path fill="none" stroke="#000" stroke-width="1.6" d="M16,16 L4,4"></path><path fill="none" stroke="#000" stroke-width="1.6" d="M16,4 L4,16"></path></svg>
|
||||
</span>
|
||||
</span>
|
||||
<span class="uk-margin-small-left">{{filter.selectedFromAndToValues}}</span>
|
||||
</a>
|
||||
</span>
|
||||
</span>
|
||||
</ng-container>
|
||||
</ng-container>
|
||||
|
||||
<ng-container *ngFor="let filter of filters " >
|
||||
<ng-container *ngIf = "filter.countSelectedValues > 0">
|
||||
<span *ngFor="let value of getSelectedValues(filter); let i = index; let end = last; "
|
||||
[title]="'Remove '+value.name" (click) = "removeFilter(value, filter) " >
|
||||
<!– if no grid on the div above, remove it and move class 'selectedFilterLabel' on top span –>
|
||||
<span class="selectedFilterLabel ">
|
||||
<a [class]="((openaireResultsStatus ==
|
||||
errorCodes.LOADING)?' uk-disabled':' ')+' uk-link-text '">
|
||||
<span class=" clickable" aria-hidden="true">
|
||||
<span class="uk-icon">
|
||||
<svg width="16" height="16" viewBox="0 0 20 20" xmlns="http://www.w3.org/2000/svg" icon="close" ratio="0.8"><path fill="none" stroke="#000" stroke-width="1.6" d="M16,16 L4,4"></path><path fill="none" stroke="#000" stroke-width="1.6" d="M16,4 L4,16"></path></svg>
|
||||
</span>
|
||||
</span>
|
||||
<span class="uk-margin-small-left" [innerHtml]="(value.name.length > 34)?value.name.substring(0,34)+'...':value.name"></span>
|
||||
</a>
|
||||
</span>
|
||||
</span>
|
||||
</ng-container>
|
||||
</ng-container>
|
||||
</div>
|
||||
</div>-->
|
||||
<!-- <ng-container *ngIf="openaireResultsNum > 0">-->
|
||||
<div *ngIf="!isNoProjectFunder && openaireResultsStatus != errorCodes.LOADING && openaireResultsNum > 1 " class="search-filters uk-width-1-1">
|
||||
<div class="uk-grid uk-grid-small" uk-grid>
|
||||
<ng-container *ngFor="let filter of rangeFilters">
|
||||
<div>
|
||||
|
@ -104,9 +60,12 @@
|
|||
role="alert">Service not available
|
||||
</div>
|
||||
<div *ngIf="openaireResultsStatus == errorCodes.LOADING" class="uk-animation-fade uk-margin-top uk-width-1-1"
|
||||
role="alert"><span class="loading-gif uk-align-center"></span></div>
|
||||
role="alert">
|
||||
<loading></loading>
|
||||
</div>
|
||||
<claim-results [localStoragePrefix]="localStoragePrefix" [results]=openaireResults
|
||||
[selectedResults]=selectedProjects [basketLimit]="basketLimit"></claim-results>
|
||||
<div *ngIf="isNoProjectFunder && openaireResultsStatus != errorCodes.LOADING " class="uk-alert uk-alert-default">No projects for funder <span class=" uk-text-bold">{{selectedFunder.name}}</span>. </div>
|
||||
<div *ngIf="openaireResultsNum != null && openaireResultsNum > 0 && openaireResultsStatus != errorCodes.LOADING " class="uk-flex uk-flex-center ">
|
||||
<paging-no-load [currentPage]="openaireResultsPage"
|
||||
[totalResults]="openaireResultsNum" [term]="keyword"
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
import {Component, ElementRef, EventEmitter, Input, Output} from '@angular/core';
|
||||
import {Component, ElementRef, EventEmitter, Input, Output, ViewChild} from '@angular/core';
|
||||
import {SearchProjectsService} from '../../services/searchProjects.service';
|
||||
import {ProjectService} from '../../landingPages/project/project.service';
|
||||
import {ClaimEntity, ClaimProject} from './claimHelper.class';
|
||||
|
@ -10,6 +10,7 @@ import {RangeFilter} from "../../utils/rangeFilter/rangeFilterHelperClasses.clas
|
|||
import {OpenaireEntities, SearchFields} from "../../utils/properties/searchFields";
|
||||
import {NewSearchPageComponent} from "../../searchPages/searchUtils/newSearchPage.component";
|
||||
import {Subscriber} from "rxjs";
|
||||
import { properties } from 'src/environments/environment';
|
||||
|
||||
declare var UIkit:any;
|
||||
|
||||
|
@ -26,12 +27,11 @@ export class ClaimProjectsSearchFormComponent {
|
|||
public elementRef;
|
||||
|
||||
@Output() projectSelected = new EventEmitter();
|
||||
@Input() public properties:EnvProperties;
|
||||
public properties:EnvProperties = properties;
|
||||
@Input() public inlineClaim:boolean=false;
|
||||
@Input() localStoragePrefix:string = "";
|
||||
@Input() basketLimit;
|
||||
@Input() showOptions;
|
||||
|
||||
public errorCodes:ErrorCodes = new ErrorCodes();
|
||||
public projects:string[];
|
||||
public warningMessage = "";
|
||||
|
@ -53,29 +53,63 @@ export class ClaimProjectsSearchFormComponent {
|
|||
public rangeFields:string[][] = this.searchFields.PROJECT_RANGE_FIELDS;
|
||||
openaireEntities = OpenaireEntities;
|
||||
sub;
|
||||
|
||||
selectedFunder = null;
|
||||
funderOptions = [];
|
||||
isNoProjectFunder = false;
|
||||
|
||||
constructor(private _service: ProjectService, private _projectService: SearchProjectsService, myElement: ElementRef) {
|
||||
this.elementRef = myElement;
|
||||
this.rangeFilters = RangeFilter.parse(this.rangeFields,"project");
|
||||
|
||||
this.rangeFilters = RangeFilter.parse(this.rangeFields,"project");
|
||||
this.getFunders();
|
||||
}
|
||||
ngOnDestroy() {
|
||||
if (this.sub instanceof Subscriber) {
|
||||
this.sub.unsubscribe();
|
||||
}
|
||||
}
|
||||
getFunders(){
|
||||
this.openaireResultsStatus = this.errorCodes.LOADING;
|
||||
this.showResults = true;
|
||||
this.sub = this._projectService.advancedSearchProjects("", 1, 0, this.properties,
|
||||
this.refineFieldsQuery, this.refineFields, "&type=projects&sf=funder").subscribe(
|
||||
data => {
|
||||
let option = {value : null, label: "No funder selected"};
|
||||
this.funderOptions.push(option);
|
||||
for(let v of data[2][0].values){
|
||||
let option = {value : v, label: v.name};
|
||||
this.funderOptions.push(option);
|
||||
}
|
||||
this.openaireResultsStatus = this.errorCodes.DONE;
|
||||
}, error =>{
|
||||
this.openaireResultsStatus = this.errorCodes.ERROR;
|
||||
})
|
||||
}
|
||||
|
||||
funderChanged(value){
|
||||
this.keyword = ""
|
||||
this.selectedFunder = value;
|
||||
this.isNoProjectFunder = this.selectedFunder && this.selectedFunder.number == 1;
|
||||
this.openaireResults = [];
|
||||
if(this.isNoProjectFunder){
|
||||
this.showResults = true;
|
||||
this.search(1,1);
|
||||
}else{
|
||||
this.openaireResults = [];
|
||||
}
|
||||
}
|
||||
search(page,size) {
|
||||
if (this.keyword.length == 0) {
|
||||
/* if (this.keyword.length == 0) {
|
||||
this.showResults = false;
|
||||
return;
|
||||
}
|
||||
}*/
|
||||
this.showResults = true;
|
||||
this.openaireResults = [];
|
||||
this.openaireResultsStatus = this.errorCodes.LOADING;
|
||||
this.prevFilters = this.filters;
|
||||
|
||||
//searchProjects (params: string, refineParams:string, page: number, size: number, refineFields:string[] , properties:EnvProperties ):any {
|
||||
this.sub = this._projectService.advancedSearchProjects(this.createOpenaireQueryParams(), page, size, this.properties, (page == 1) ? this.refineFieldsQuery : null, (page == 1) ? this.refineFields : [], this.createOpenaireRefineQuery()).subscribe(
|
||||
this.sub = this._projectService.advancedSearchProjects(this.createOpenaireQueryParams(), page, size, this.properties, this.createOpenaireRefineQuery(), [], null).subscribe(
|
||||
// this.sub = this._projectService.searchProjects(this.createOpenaireQueryParams(),(page==1)? this.refineFieldsQuery:null, page, size, (page==1)?this.refineFields:[], this.properties).subscribe(
|
||||
data => {
|
||||
if (data != null) {
|
||||
|
@ -91,6 +125,9 @@ export class ClaimProjectsSearchFormComponent {
|
|||
this.openaireResultsStatus = this.errorCodes.NONE;
|
||||
this.filters = this.checkSelectedFilters([], this.prevFilters);
|
||||
}
|
||||
/* if(this.isNoProjectFunder && this.claimResultsComponent){
|
||||
this.claimResultsComponent.add(this.openaireResults[0])
|
||||
}*/
|
||||
} else {
|
||||
this.openaireResultsStatus = this.errorCodes.ERROR;
|
||||
}
|
||||
|
@ -102,83 +139,20 @@ export class ClaimProjectsSearchFormComponent {
|
|||
}
|
||||
);
|
||||
}
|
||||
// select(entity){
|
||||
// if(this.selectedProjects.length > 50){
|
||||
// UIkit.notification({
|
||||
// message : 'Your basket exceeds the number of allowed projects (50)',
|
||||
// status : 'warning',
|
||||
// timeout : 1500,
|
||||
// pos : 'top-center'
|
||||
// });
|
||||
// return;
|
||||
// }
|
||||
// this.query = "";
|
||||
// // this.searchTermStream.next(this.query); //clear
|
||||
// entity = entity.value;
|
||||
// // var project: ClaimProject = new ClaimProject();
|
||||
// // project.funderId = entity.funderId;
|
||||
// // project.funderName = entity.funderName;
|
||||
// // project.id = entity.id;
|
||||
// // project.projectName = entity.projectName;
|
||||
// // project.projectAcronym = entity.projectAcronym;
|
||||
// // project.startDate = entity.startDate;
|
||||
// // project.endDate = entity.endDate;
|
||||
// // project.code = entity.code;
|
||||
// // project.jurisdiction = entity.jurisdiction;
|
||||
// // project.fundingLevel0 = entity.fundingLevel0;
|
||||
//
|
||||
//
|
||||
// var index:number =this.selectedProjects.indexOf(entity);
|
||||
// var found:boolean = false;
|
||||
// this.warningMessage = "";
|
||||
//
|
||||
// for (var _i = 0; _i < this.selectedProjects.length; _i++) {
|
||||
// let project = this.selectedProjects[_i];
|
||||
// if(entity.id == project.id){
|
||||
// found=true;
|
||||
// this.warningMessage = "Project already in your basket";
|
||||
// }
|
||||
// }
|
||||
//
|
||||
// if (!found) {
|
||||
// this.selectedProjects.push(entity);
|
||||
// if(this.selectedProjects != null){
|
||||
// localStorage.setItem(this.localStoragePrefix + "projects", JSON.stringify(this.selectedProjects));
|
||||
// }
|
||||
// this.projectSelected.emit({
|
||||
// value: true
|
||||
// });
|
||||
//
|
||||
// }
|
||||
// }
|
||||
/* static showItem(item):string{
|
||||
return ((item.field[1]['@value'])?item.field[1]['@value']+" - ":"" ) + item.field[3]['@value'];
|
||||
}*/
|
||||
remove(item){
|
||||
remove(item){
|
||||
let index:number =this.selectedProjects.indexOf(item);
|
||||
if (index > -1) {
|
||||
this.selectedProjects.splice(index, 1);
|
||||
}
|
||||
|
||||
}
|
||||
/* handleClick(event){
|
||||
var clickedComponent = event.target;
|
||||
var inside = false;
|
||||
do {
|
||||
if (clickedComponent === this.elementRef.nativeElement) {
|
||||
inside = true;
|
||||
}
|
||||
clickedComponent = clickedComponent.parentNode;
|
||||
} while (clickedComponent);
|
||||
|
||||
}*/
|
||||
static openaire2ClaimEntity(items, properties:EnvProperties){
|
||||
static openaire2ClaimEntity(items, properties:EnvProperties){
|
||||
const projects: ClaimEntity[] = [];
|
||||
for(const item of items){
|
||||
const entity: ClaimEntity = new ClaimEntity();
|
||||
entity.project = new ClaimProject();
|
||||
entity.project.funderId = item.funderId;
|
||||
entity.project.funderShortname = item.funderShortname?item.funderShortname:(entity.project.funderId.split("::")[1]);
|
||||
entity.project.funderShortname = item.funderShortname?item.funderShortname:(entity.project.funderId?entity.project.funderId.split("::")[1]:"");
|
||||
entity.project.funderName = item.funderName;
|
||||
entity.id = item.id;
|
||||
entity.project.url = (item.code !="unidentified") ? properties.searchLinkToProject + entity.id : null;
|
||||
|
@ -214,12 +188,6 @@ export class ClaimProjectsSearchFormComponent {
|
|||
}
|
||||
|
||||
createOpenaireRefineQuery(): string {
|
||||
/*if(this.startYear.length > 0 ){
|
||||
query+='&fq=projectstartyear exact \"'+this.startYear+'\"'
|
||||
}
|
||||
if(this.endYear.length > 0 ){
|
||||
query+='&fq=projectendyear exact \"'+this.endYear+'\"'
|
||||
}*/
|
||||
let allFqs = "";
|
||||
for (let filter of this.filters) {
|
||||
if (filter.countSelectedValues > 0) {
|
||||
|
@ -237,6 +205,12 @@ export class ClaimProjectsSearchFormComponent {
|
|||
}
|
||||
}
|
||||
}
|
||||
if(this.selectedFunder){
|
||||
allFqs += "&fq=" + StringUtils.URIEncode( "funder exact " + (StringUtils.quote(this.selectedFunder.id)));
|
||||
}
|
||||
if(!this.isNoProjectFunder || !this.selectedFunder){
|
||||
allFqs += '&fq=(projectcode<>"unidentified")'
|
||||
}
|
||||
for (let i = 0; i < this.rangeFilters.length; i++) {
|
||||
let filter = this.rangeFilters[i];
|
||||
//selectedFromValue, selectedToValue, equalityOp, equalityOpFrom, equalityOpTo, filterOp ){
|
||||
|
|
|
@ -17,14 +17,15 @@ import {RangeFilterModule} from "../../utils/rangeFilter/rangeFilter.module";
|
|||
import {AdvancedSearchInputModule} from "../../sharedComponents/advanced-search-input/advanced-search-input.module";
|
||||
import {InputModule} from "../../sharedComponents/input/input.module";
|
||||
import {DropdownFilterModule} from "../../utils/dropdown-filter/dropdown-filter.module";
|
||||
import {LoadingModule} from "../../utils/loading/loading.module";
|
||||
|
||||
@NgModule({
|
||||
imports: [
|
||||
SharedModule, CommonModule,
|
||||
// LoadingModalModule,
|
||||
ProjectServiceModule, ProjectsServiceModule, EntitiesAutocompleteModule, HelperModule,
|
||||
PagingModule, SearchFilterModule, ClaimResultsModule, RangeFilterModule, AdvancedSearchInputModule, InputModule, DropdownFilterModule
|
||||
],
|
||||
imports: [
|
||||
SharedModule, CommonModule,
|
||||
// LoadingModalModule,
|
||||
ProjectServiceModule, ProjectsServiceModule, EntitiesAutocompleteModule, HelperModule,
|
||||
PagingModule, SearchFilterModule, ClaimResultsModule, RangeFilterModule, AdvancedSearchInputModule, InputModule, DropdownFilterModule, LoadingModule
|
||||
],
|
||||
providers:[
|
||||
],
|
||||
declarations: [
|
||||
|
|
|
@ -51,7 +51,9 @@
|
|||
</div>
|
||||
</div>
|
||||
<div *ngIf="crossrefStatus === errorCodes.LOADING" class="uk-animation-fade uk-margin-top uk-width-1-1"
|
||||
role="alert"><span class="loading-gif uk-align-center"></span></div>
|
||||
role="alert">
|
||||
<loading></loading>
|
||||
</div>
|
||||
<div>
|
||||
|
||||
<claim-results [localStoragePrefix]=localStoragePrefix [results]=crossrefResults
|
||||
|
@ -114,7 +116,7 @@
|
|||
|
||||
<div *ngIf="openaireResultsStatus === errorCodes.LOADING"
|
||||
class="uk-animation-fade uk-margin-top uk-width-1-1"
|
||||
role="alert"><span class="loading-gif uk-align-center">Loading...</span></div>
|
||||
role="alert"><loading></loading></div>
|
||||
<claim-results [localStoragePrefix]=localStoragePrefix
|
||||
[results]=openaireResults [selectedResults]=selectedResults [basketLimit]="basketLimit"></claim-results>
|
||||
<div class="uk-flex uk-flex-center" *ngIf=" openaireResultsStatus != errorCodes.LOADING && openaireResultsNum != null && openaireResultsNum > 0" >
|
||||
|
@ -177,7 +179,7 @@
|
|||
</div>
|
||||
</div>
|
||||
<div *ngIf="orcidStatus == errorCodes.LOADING" class="uk-animation-fade uk-margin-top uk-width-1-1" role="alert">
|
||||
<span class="loading-gif uk-align-center"></span></div>
|
||||
<loading></loading></div>
|
||||
</div>
|
||||
</div>
|
||||
<div *ngIf="activeTab == 'datacite'" id="datacite" class="uk-animation-fade">
|
||||
|
@ -190,7 +192,7 @@
|
|||
<div class="uk-margin-top">
|
||||
|
||||
<div *ngIf="dataciteStatus == errorCodes.LOADING" class="uk-animation-fade uk-margin-top uk-width-1-1"
|
||||
role="alert"><span class="loading-gif uk-align-center"></span></div>
|
||||
role="alert"><loading></loading></div>
|
||||
<div>
|
||||
<claim-results [localStoragePrefix]=localStoragePrefix *ngIf="dataciteResults.length > 0 "
|
||||
[results]=dataciteResults [selectedResults]=selectedResults [basketLimit]="basketLimit"></claim-results>
|
||||
|
|
|
@ -22,10 +22,11 @@ import {AdvancedSearchInputModule} from "../../sharedComponents/advanced-search-
|
|||
import {InputModule} from "../../sharedComponents/input/input.module";
|
||||
import {SearchInputModule} from "../../sharedComponents/search-input/search-input.module";
|
||||
import {DropdownFilterModule} from "../../utils/dropdown-filter/dropdown-filter.module";
|
||||
import {LoadingModule} from "../../utils/loading/loading.module";
|
||||
|
||||
@NgModule({
|
||||
imports: [SharedModule, CommonModule, SearchResearchResultsServiceModule, PagingModule, SearchCrossrefServiceModule,
|
||||
SearchDataciteServiceModule, HelperModule, SearchFilterModule, ClaimResultsModule, MatSelectModule, QuickSelectionsModule, RangeFilterModule, ClaimProjectsSearchFormModule, AdvancedSearchInputModule, InputModule, SearchInputModule, DropdownFilterModule],
|
||||
SearchDataciteServiceModule, HelperModule, SearchFilterModule, ClaimResultsModule, MatSelectModule, QuickSelectionsModule, RangeFilterModule, ClaimProjectsSearchFormModule, AdvancedSearchInputModule, InputModule, SearchInputModule, DropdownFilterModule, LoadingModule],
|
||||
providers:[
|
||||
SearchOrcidService
|
||||
],
|
||||
|
|
|
@ -1,5 +1,8 @@
|
|||
export class ClaimsProperties{
|
||||
ALLOW_ORGANIZATION_LINKING:boolean = false;
|
||||
SELECT_ENTITIES = {
|
||||
projects:"Funding"
|
||||
}
|
||||
INLINE_ENTITY = {
|
||||
show: true,
|
||||
guideText : null
|
||||
|
|
|
@ -42,7 +42,7 @@ export class LinkingGenericComponent {
|
|||
// show linkToEntities /values: result, project, context
|
||||
|
||||
@Input() sources:ClaimEntity[] =[];
|
||||
properties:EnvProperties;
|
||||
properties:EnvProperties = properties;
|
||||
public openaireEntities = OpenaireEntities;
|
||||
@Input() localStoragePrefix:string = "linking_";
|
||||
url=null;
|
||||
|
@ -72,14 +72,13 @@ export class LinkingGenericComponent {
|
|||
this.breadcrumbs.push({name: "Link", route: null});
|
||||
}
|
||||
this.showOptions.show = 'source';
|
||||
this.showOptions.initSelectOptions();
|
||||
this.showOptions.initSelectOptions(this.claimsProperties);
|
||||
if(this.inlineEntity){
|
||||
this.showOptions.showLinkTo();
|
||||
// this.showOptions.basketShowLinksTo = true;
|
||||
this.showOptions.show = this.showOptions.linkTo;
|
||||
}
|
||||
|
||||
this.properties = properties;
|
||||
this.url = this.properties.domain + this.properties.baseLink+this._router.url;
|
||||
|
||||
var description = "Linking is a functionality provided by OpenAIRE, in order to link research results with a project, a research community or other research results.";
|
||||
|
|
|
@ -3,13 +3,21 @@ import {SharedModule} from '../../../../openaireLibrary/shared/shared.module';
|
|||
import {ClaimEntityTitleComponent} from "./ClaimEntityTitle.component";
|
||||
import {ClaimEntityResultMetadataComponent} from "./ClaimEntityResultMetadata.component";
|
||||
import {ClaimEntityProjectMetadataComponent} from "./ClaimEntityProjectMetadata.component";
|
||||
import {IconsService} from "../../../utils/icons/icons.service";
|
||||
import {coins} from "../../../utils/icons/icons";
|
||||
import {IconsModule} from "../../../utils/icons/icons.module";
|
||||
|
||||
@NgModule({
|
||||
imports: [
|
||||
SharedModule
|
||||
SharedModule,
|
||||
IconsModule
|
||||
],
|
||||
declarations: [
|
||||
ClaimEntityTitleComponent, ClaimEntityResultMetadataComponent, ClaimEntityProjectMetadataComponent
|
||||
], exports:[ ClaimEntityTitleComponent, ClaimEntityResultMetadataComponent, ClaimEntityProjectMetadataComponent]
|
||||
})
|
||||
export class ClaimEntitiesMetadataModule { }
|
||||
export class ClaimEntitiesMetadataModule {
|
||||
constructor(private _iconsService:IconsService) {
|
||||
this._iconsService.registerIcons([coins])
|
||||
}
|
||||
}
|
||||
|
|
|
@ -8,20 +8,28 @@ import {ClaimEntity} from '../../claim-utils/claimHelper.class';
|
|||
<div *ngIf="!shortVersion" class="claim-entity-metadata uk-flex-inline uk-flex-wrap uk-text-xsmall uk-text-emphasis"
|
||||
[class.uk-margin-xsmall-top]="!shortVersion">
|
||||
<span class="uk-text-capitalize">
|
||||
{{entity.type}}
|
||||
{{entity.type == 'project' && entity.project.code == 'unidentified'?'funder':entity.type}}
|
||||
</span>
|
||||
<span *ngIf="entity.project.startDate || entity.project.endDate">
|
||||
{{(entity.project.startDate) ? entity.project.startDate : 'Unknown'}}{{'-' + ((entity.project.endDate) ? entity.project.endDate : 'Unknown')}}
|
||||
</span>
|
||||
</div>
|
||||
<div class="uk-text-small uk-flex uk-flex-wrap" [style.grid-gap]="shortVersion?'10px':'20px'"
|
||||
<div *ngIf="shortVersion && entity.type == 'project' && entity.project.code == 'unidentified'" class="claim-entity-metadata uk-flex-inline uk-flex-wrap uk-text-xsmall uk-text-emphasis"
|
||||
[class.uk-margin-xsmall-top]="!shortVersion">
|
||||
<span class="uk-text-capitalize">
|
||||
funder
|
||||
</span>
|
||||
|
||||
</div>
|
||||
<div *ngIf="entity.project.code!='unidentified'" class="uk-text-small uk-flex uk-flex-wrap" [style.grid-gap]="shortVersion?'0px':'10px'"
|
||||
[class.uk-margin-small-top]="!shortVersion">
|
||||
<div *ngIf="entity.project.funderName || entity.project.funderShortname">
|
||||
<span class="uk-text-meta">Funder: </span>{{entity.project.funderName?entity.project.funderName:entity.project.funderShortname}}
|
||||
</div>
|
||||
<div *ngIf="entity.project.code && entity.project.code!='unidentified'">
|
||||
<div *ngIf="entity.project.code">
|
||||
<span class="uk-text-meta">Project Code: </span>{{entity.project.code}}
|
||||
</div>
|
||||
</div>
|
||||
<div *ngIf="entity.project.funderName || entity.project.funderShortname">
|
||||
<span class="uk-text-meta">Funding: </span>{{entity.project.funderName?entity.project.funderName:entity.project.funderShortname}}
|
||||
</div>
|
||||
|
||||
</div>
|
||||
</ng-container>
|
||||
`,
|
||||
|
|
|
@ -5,19 +5,18 @@ import {ClaimEntity} from '../../claim-utils/claimHelper.class';
|
|||
selector: 'claim-title',
|
||||
template: `
|
||||
<div class="uk-grid uk-flex uk-flex-middle">
|
||||
<span *ngIf="showIcon" class="uk-flex">
|
||||
<span *ngIf="entity.result" class="material-icons uk-text-small uk-text-meta">
|
||||
insert_drive_file
|
||||
</span>
|
||||
<span *ngIf="entity.project" class="material-icons uk-text-small uk-text-meta">
|
||||
assignment_turned_in
|
||||
</span>
|
||||
<span *ngIf="entity.organization" class="material-icons uk-text-small uk-text-meta">
|
||||
account_balance
|
||||
</span>
|
||||
<span *ngIf="entity.type=='community'" class="material-icons uk-text-small uk-text-meta" style="margin-right: 2px;">
|
||||
people
|
||||
</span>
|
||||
<span *ngIf="showIcon" class="uk-flex uk-margin-xsmall-right">
|
||||
<icon *ngIf="entity.result" class=" uk-text-small uk-text-meta" name="insert_drive_file">
|
||||
|
||||
</icon>
|
||||
<icon *ngIf="entity.project && entity.project.code !='unidentified'" class=" uk-text-small uk-text-meta" name="assignment_turned_in">
|
||||
</icon>
|
||||
<icon *ngIf="entity.project && entity.project.code =='unidentified'" class="uk-text-small uk-text-meta" name="coins" [ratio]="1.4">
|
||||
</icon>
|
||||
<icon *ngIf="entity.organization" class=" uk-text-small uk-text-meta" name="account_balance">
|
||||
</icon>
|
||||
<icon *ngIf="entity.type=='community'" class=" uk-text-small uk-text-meta" style="margin-right: 2px;" name="people">
|
||||
</icon>
|
||||
</span>
|
||||
<div class="uk-width-expand multi-line-ellipsis lines-3" style="word-break: break-word;"
|
||||
[class.uk-padding-remove-left]="showIcon" [class.uk-text-truncate]="shortVersion">
|
||||
|
@ -30,7 +29,15 @@ import {ClaimEntity} from '../../claim-utils/claimHelper.class';
|
|||
<span *ngIf="(entity.result && !entity.result.url)">
|
||||
{{entity.title ? sliceString(entity.title) : '[No title available]'}}
|
||||
</span>
|
||||
<span *ngIf="entity.type=='project' && entity.project">
|
||||
<span *ngIf="entity.type=='project' && entity.project && entity.project.code =='unidentified'">
|
||||
<span *ngIf="!shortVersion">
|
||||
{{(entity.project.funderShortname ? '[' + entity.project.funderShortname + '] ' : '') + entity.project.funderName}}
|
||||
</span>
|
||||
<span *ngIf="shortVersion">
|
||||
{{sliceString(entity.project.funderName)}}
|
||||
</span>
|
||||
</span>
|
||||
<span *ngIf="entity.type=='project' && entity.project && entity.project.code!='unidentified'">
|
||||
<a *ngIf="entity.project && entity.project.url" target="_blank" [href]="entity.project.url"
|
||||
class="uk-link uk-text-decoration-none uk-width-expand">
|
||||
<span *ngIf="!shortVersion">
|
||||
|
|
|
@ -8,16 +8,16 @@
|
|||
<div class="uk-flex uk-flex-left@m uk-flex-center uk-width-expand">
|
||||
<ul class="uk-subnav uk-subnav-pill">
|
||||
<li [class.uk-active]="showCurrent" (click)="showCurrent = true">
|
||||
<a class="uk-text-capitalize">{{stakeholderUtils.roles[role]}}s</a>
|
||||
<a class="uk-text-capitalize">{{roleUtils.roles[role]}}s</a>
|
||||
</li>
|
||||
<li [class.uk-active]="!showCurrent" (click)="showCurrent = false">
|
||||
<a>Pending {{stakeholderUtils.roles[role]}}s</a>
|
||||
<a>Pending {{roleUtils.roles[role]}}s</a>
|
||||
</li>
|
||||
</ul>
|
||||
</div>
|
||||
<div class="uk-width-expand@m uk-width-1-1 uk-grid uk-flex-right@m uk-flex-center uk-flex-middle" uk-grid>
|
||||
<div *ngIf="showCurrent" [disabled]="loadActive" search-input class="uk-width-expand@l uk-width-1-1"
|
||||
[searchControl]="filterForm.get('active')" [expandable]="true" [placeholder]="'Search ' + stakeholderUtils.roles[role] + 's'" searchInputClass="outer">
|
||||
[searchControl]="filterForm.get('active')" [expandable]="true" [placeholder]="'Search ' + roleUtils.roles[role] + 's'" searchInputClass="outer">
|
||||
</div>
|
||||
<div *ngIf="!showCurrent" [disabled]="loadPending" search-input class="uk-width-expand@l uk-width-1-1"
|
||||
[searchControl]="filterForm.get('pending')" [expandable]="true" [placeholder]="'Search invitations'" searchInputClass="outer">
|
||||
|
@ -27,7 +27,7 @@
|
|||
[attr.uk-tooltip]="inviteDisableMessage" [class.uk-disabled]="loadPending || loadPending"
|
||||
[disabled]="loadActive || loadPending || !!inviteDisableMessage" (click)="openInviteModal()">
|
||||
<icon name="person_add" [flex]="true" type="filled"></icon>
|
||||
<span class="uk-margin-small-left uk-text-bold uk-text-uppercase">Invite {{stakeholderUtils.roles[role]}}</span>
|
||||
<span class="uk-margin-small-left uk-text-bold uk-text-uppercase">Invite {{roleUtils.roles[role]}}</span>
|
||||
</button>
|
||||
<button *ngIf="!exists && isCurator" class="uk-button uk-button-default uk-flex uk-flex-middle"
|
||||
(click)="openCreateRoleModal()">
|
||||
|
@ -47,16 +47,16 @@
|
|||
<div *ngIf="!loadActive && !loadPending">
|
||||
<div *ngIf="(showCurrent && showActive.length == 0) || (!showCurrent && showPending.length == 0)"
|
||||
class="uk-card uk-card-default uk-padding-large uk-text-center uk-margin-bottom uk-text-bold">
|
||||
<div *ngIf="showCurrent">No {{stakeholderUtils.roles[role]}}s found</div>
|
||||
<div *ngIf="!showCurrent">No pending {{stakeholderUtils.roles[role]}} invitations found</div>
|
||||
<div *ngIf="showCurrent">No {{roleUtils.roles[role]}}s found</div>
|
||||
<div *ngIf="!showCurrent">No pending {{roleUtils.roles[role]}} invitations found</div>
|
||||
</div>
|
||||
<div *ngIf="(showCurrent && showActive.length > 0) || (!showCurrent && showPending.length > 0)">
|
||||
<no-load-paging *ngIf="showCurrent" [type]="(showActive.length > 1)?(stakeholderUtils.roles[role] + 's'):role"
|
||||
<no-load-paging *ngIf="showCurrent" [type]="(showActive.length > 1)?(roleUtils.roles[role] + 's'):role"
|
||||
(pageChange)="updateActivePage($event)"
|
||||
[page]="activePage" [pageSize]="pageSize"
|
||||
[totalResults]="showActive.length">
|
||||
</no-load-paging>
|
||||
<no-load-paging *ngIf="!showCurrent" [type]="stakeholderUtils.roles[role] + ' ' + (showPending.length > 1?'invitations':'invitation')"
|
||||
<no-load-paging *ngIf="!showCurrent" [type]="roleUtils.roles[role] + ' ' + (showPending.length > 1?'invitations':'invitation')"
|
||||
(pageChange)="updatePendingPage($event)"
|
||||
[page]="pendingPage" [pageSize]="pageSize"
|
||||
[totalResults]="showPending.length">
|
||||
|
@ -109,12 +109,12 @@
|
|||
</modal-alert>
|
||||
<modal-alert #deleteModal [overflowBody]="false" (alertOutput)="deleteActive()" classTitle="uk-background-primary uk-light">
|
||||
<div *ngIf="selectedUser">
|
||||
Are you sure you want to remove <span class="uk-text-bold">{{selectedUser}}</span> from {{stakeholderUtils.roles[role]}}s?
|
||||
Are you sure you want to remove <span class="uk-text-bold">{{selectedUser}}</span> from {{roleUtils.roles[role]}}s?
|
||||
</div>
|
||||
</modal-alert>
|
||||
<modal-alert #deletePendingModal [overflowBody]="false" (alertOutput)="deletePending()" classTitle="uk-background-primary uk-light">
|
||||
<div *ngIf="selectedUser">
|
||||
Are you sure you want to cancel {{stakeholderUtils.roles[role]}} invitation of <span class="uk-text-bold">{{selectedUser}}</span>?
|
||||
Are you sure you want to cancel {{roleUtils.roles[role]}} invitation of <span class="uk-text-bold">{{selectedUser}}</span>?
|
||||
</div>
|
||||
</modal-alert>
|
||||
<modal-alert #createRoleModal [overflowBody]="false" (alertOutput)="createGroup()" classTitle="uk-background-primary uk-light"
|
||||
|
|
|
@ -13,7 +13,7 @@ import {AlertModal} from "../../../utils/modal/alert";
|
|||
import {UserRegistryService} from "../../../services/user-registry.service";
|
||||
import {EnvProperties} from "../../../utils/properties/env-properties";
|
||||
import {properties} from "../../../../../environments/environment";
|
||||
import {Role, Session, User} from "../../../login/utils/helper.class";
|
||||
import {Role, RoleUtils, Session, User} from "../../../login/utils/helper.class";
|
||||
import {UserManagementService} from "../../../services/user-management.service";
|
||||
import {Router} from "@angular/router";
|
||||
import {StringUtils} from "../../../utils/string-utils.class";
|
||||
|
@ -92,6 +92,7 @@ export class RoleUsersComponent implements OnInit, OnDestroy, OnChanges {
|
|||
@ViewChild('deletePendingModal') deletePendingModal: AlertModal;
|
||||
@ViewChild('createRoleModal') createRoleModal: AlertModal;
|
||||
public stakeholderUtils: StakeholderUtils = new StakeholderUtils();
|
||||
public roleUtils: RoleUtils = new RoleUtils();
|
||||
private _type: string;
|
||||
|
||||
constructor(private userRegistryService: UserRegistryService,
|
||||
|
@ -188,7 +189,7 @@ export class RoleUsersComponent implements OnInit, OnDestroy, OnChanges {
|
|||
openDeleteModal(item: any) {
|
||||
if (this.showCurrent) {
|
||||
this.selectedUser = item.email;
|
||||
this.deleteModal.alertTitle = 'Delete ' + this.stakeholderUtils.roles[this.role];
|
||||
this.deleteModal.alertTitle = 'Delete ' + this.roleUtils.roles[this.role];
|
||||
this.deleteModal.open();
|
||||
} else {
|
||||
this.selectedUser = item;
|
||||
|
@ -198,7 +199,7 @@ export class RoleUsersComponent implements OnInit, OnDestroy, OnChanges {
|
|||
}
|
||||
|
||||
openInviteModal() {
|
||||
this.inviteModal.alertTitle = 'Invite ' + this.stakeholderUtils.roles[this.role];
|
||||
this.inviteModal.alertTitle = 'Invite ' + this.roleUtils.roles[this.role];
|
||||
this.inviteModal.okButtonLeft = false;
|
||||
this.inviteModal.okButtonText = 'Send';
|
||||
this.emailsForm = this.fb.array([], Validators.required);
|
||||
|
@ -247,7 +248,7 @@ export class RoleUsersComponent implements OnInit, OnDestroy, OnChanges {
|
|||
if (this.currentPendingPage.length === 0) {
|
||||
this.pendingPage = 1;
|
||||
}
|
||||
NotificationHandler.rise(StringUtils.capitalize(this.stakeholderUtils.roles[this.role]) + ' invitation to ' + this.selectedUser + ' has been <b>canceled</b>');
|
||||
NotificationHandler.rise(StringUtils.capitalize(this.roleUtils.roles[this.role]) + ' invitation to ' + this.selectedUser + ' has been <b>canceled</b>');
|
||||
this.loadPending = false;
|
||||
}, error => {
|
||||
NotificationHandler.rise('An error has occurred. Please try again later', 'danger');
|
||||
|
@ -296,7 +297,7 @@ export class RoleUsersComponent implements OnInit, OnDestroy, OnChanges {
|
|||
}
|
||||
} else {
|
||||
NotificationHandler.rise('An error has occurred while sending the invitation mail to ' +
|
||||
response.email + '.Check if the user is already a ' + this.stakeholderUtils.roles[this.role] + ' or try again later', 'danger');
|
||||
response.email + '.Check if the user is already a ' + this.roleUtils.roles[this.role] + ' or try again later', 'danger');
|
||||
return of(null);
|
||||
}
|
||||
});
|
||||
|
@ -316,7 +317,7 @@ export class RoleUsersComponent implements OnInit, OnDestroy, OnChanges {
|
|||
this.updateLists();
|
||||
}, error => {
|
||||
if(error.status === 409) {
|
||||
NotificationHandler.rise('Group already exists. You can try to invite a ' + this.stakeholderUtils.roles[this.role] + ' instead.', 'warning');
|
||||
NotificationHandler.rise('Group already exists. You can try to invite a ' + this.roleUtils.roles[this.role] + ' instead.', 'warning');
|
||||
this.updateLists();
|
||||
} else {
|
||||
NotificationHandler.rise('An error has occurred. Please try again later', 'danger');
|
||||
|
|
|
@ -17,8 +17,8 @@ import {OpenaireEntities} from "../../utils/properties/searchFields";
|
|||
</errorMessages>
|
||||
|
||||
<div *ngIf="fetchResults.searchUtils.status == errorCodes.DONE && !loading" class="uk-text-small">
|
||||
<div class="uk-text-meta uk-margin-medium-bottom">
|
||||
*Only top 100 {{openaireEntities.DATASOURCES}} that host {{openaireEntities.RESULTS}} which are also available via the Federated Research Data Repository are shown.
|
||||
<div *ngIf="results.length > 90" class="uk-text-meta uk-margin-medium-bottom">
|
||||
*Only top 100 {{openaireEntities.DATASOURCES}} that host {{openaireEntities.RESULTS}} which are also available via {{collectedFromName}} are shown.
|
||||
</div>
|
||||
<results-and-pages *ngIf="results.length >pageSize" [type]="openaireEntities.DATASOURCES"
|
||||
[page]="page" [pageSize]="pageSize"
|
||||
|
|
|
@ -159,7 +159,7 @@ import {RouterHelper} from "../../utils/routerHelper.class";
|
|||
<span>{{showInline ? projectNames.join(', ') : projectNames.slice(0, projectsLimit).join(', ')}}</span>
|
||||
<span *ngIf="projects.length > projectsLimit">
|
||||
<a *ngIf="!showInline" (click)="viewAllProjectsClick();" class="uk-background-muted custom-extra-entities">
|
||||
+{{projects.length - projectsLimit | number}} projects
|
||||
+{{projects.length - projectsLimit | number}}{{projects.length == 1000 ? ' more' : ''}} projects
|
||||
</a>
|
||||
<a *ngIf="showInline && lessBtn" (click)="showInline = !showInline; lessBtn = false;"
|
||||
class="uk-background-muted custom-extra-entities">
|
||||
|
@ -173,7 +173,7 @@ import {RouterHelper} from "../../utils/routerHelper.class";
|
|||
<span>{{showInline ? organizationNames.join(', ') : organizationNames.slice(0, organizationsLimit).join(', ')}}</span>
|
||||
<span *ngIf="organizations.length > organizationsLimit">
|
||||
<a *ngIf="!showInline" (click)="viewAllPartnersClick();" class="uk-background-muted custom-extra-entities">
|
||||
+{{organizations.length - organizationsLimit | number}} partners
|
||||
+{{organizations.length - organizationsLimit | number}}{{organizations.length == 1000 ? ' more' : ''}} partners
|
||||
</a>
|
||||
<a *ngIf="showInline && lessBtn" (click)="showInline = !showInline; lessBtn = false;"
|
||||
class="uk-background-muted custom-extra-entities">
|
||||
|
@ -197,6 +197,7 @@ import {RouterHelper} from "../../utils/routerHelper.class";
|
|||
|
||||
|
||||
<modal-alert *ngIf="!isMobile" #partnersModal>
|
||||
<div *ngIf="organizations?.length == 1000" class="uk-text-meta uk-margin-medium-bottom">Only 1000 Partners<span *ngIf="resultTitle"> of {{resultTitle}}</span> are shown here.</div>
|
||||
<div class="uk-text-small uk-text-emphasis uk-grid uk-grid-column-collapse uk-grid-row-small" uk-grid>
|
||||
<ng-container *ngFor="let item of organizations; let i = index">
|
||||
<div class="uk-margin-xsmall-right">
|
||||
|
@ -207,6 +208,7 @@ import {RouterHelper} from "../../utils/routerHelper.class";
|
|||
</modal-alert>
|
||||
|
||||
<modal-alert *ngIf="!isMobile" #projectsModal>
|
||||
<div *ngIf="projects?.length == 1000" class="uk-text-meta uk-margin-medium-bottom">Only 1000 {{openaireEntities.PROJECTS}}<span *ngIf="resultTitle"> of {{resultTitle}}</span> are shown here.</div>
|
||||
<div class="uk-text-small uk-text-emphasis uk-grid uk-grid-column-collapse uk-grid-row-small" uk-grid>
|
||||
<ng-container *ngFor="let item of projects; let i = index">
|
||||
<div class="uk-margin-xsmall-right">
|
||||
|
@ -223,6 +225,7 @@ import {RouterHelper} from "../../utils/routerHelper.class";
|
|||
styleUrls: ['entity-metadata.component.less']
|
||||
})
|
||||
export class EntityMetadataComponent {
|
||||
@Input() resultTitle: string = null;
|
||||
@Input() isMobile: boolean = false;
|
||||
@Input() entityType: string;
|
||||
@Input() types: string[];
|
||||
|
|
|
@ -39,7 +39,7 @@ export class ParsingFunctions {
|
|||
|
||||
let fundedByProject: Project = {
|
||||
"id": "", "acronym": "", "title": "",
|
||||
"funderShortname": "", "funderName": "",
|
||||
"funderShortname": "", "funderName": "", "funderJurisdiction": "",
|
||||
"funding": "", "code": "", "provenanceAction": "", "validated": false
|
||||
};
|
||||
|
||||
|
@ -61,8 +61,7 @@ export class ParsingFunctions {
|
|||
}
|
||||
|
||||
if (relation.hasOwnProperty("funding")) {
|
||||
let funding: { "funderName": string, "funderShortname": string, "stream": string };
|
||||
funding = this.parseFundingTrees(relation.funding);
|
||||
let funding = this.parseFundingTrees(relation.funding);
|
||||
|
||||
if (funding.funderName) {
|
||||
fundedByProject['funderName'] = funding.funderName;
|
||||
|
@ -70,6 +69,9 @@ export class ParsingFunctions {
|
|||
if (funding.funderShortname) {
|
||||
fundedByProject['funderShortname'] = funding.funderShortname;
|
||||
}
|
||||
if(funding.funderJurisdiction) {
|
||||
fundedByProject['funderJurisdiction'] = funding.funderJurisdiction;
|
||||
}
|
||||
if (funding.stream) {
|
||||
fundedByProject['funding'] = funding.stream;
|
||||
}
|
||||
|
@ -79,10 +81,11 @@ export class ParsingFunctions {
|
|||
}
|
||||
|
||||
// publication & research data : for fundedByProjects | project landing : for funding
|
||||
public parseFundingTrees(fundingTree: any): { "funderName": string, "funderShortname": string, "stream": string } {
|
||||
let funding: { "funderName": string, "funderShortname": string, "stream": string } = {
|
||||
public parseFundingTrees(fundingTree: any): any {
|
||||
let funding: { "funderName": string, "funderShortname": string, "funderJurisdiction": string, "stream": string } = {
|
||||
"funderName": "",
|
||||
"funderShortname": "",
|
||||
"funderJurisdiction": "",
|
||||
"stream": ""
|
||||
};
|
||||
let length = Array.isArray(fundingTree) ? fundingTree.length : 1;
|
||||
|
@ -93,6 +96,7 @@ export class ParsingFunctions {
|
|||
if (fundingData.hasOwnProperty("funder")) {
|
||||
funding.funderShortname = fundingData['funder'].shortname;
|
||||
funding.funderName = fundingData['funder'].name;
|
||||
funding.funderJurisdiction = fundingData['funder'].jurisdiction;
|
||||
}
|
||||
|
||||
funding.stream = this.addFundingLevel0(fundingData, funding.stream);
|
||||
|
|
|
@ -116,7 +116,8 @@ export class ProjectsInModalComponent {
|
|||
}
|
||||
if (filterLimits.length > 0) {
|
||||
//this.filterQuery+=' and '+filter.filterId + ' exact '+ filterLimits + ' ';
|
||||
this.filterQuery += ' and ( ' + filterLimits + ' ) ';
|
||||
// this.filterQuery += ' and ( ' + filterLimits + ' ) ';
|
||||
this.filterQuery += '( ' + filterLimits + ' ) ';
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
@ -488,7 +488,7 @@ export class OrganizationComponent {
|
|||
|
||||
let filename: string = 'funder-project-' + this.contentFileName + '-report';
|
||||
|
||||
this.subscriptions.push(this._searchProjectsService.getProjectsForOrganizations(this.organizationId, ' and (funder exact "' + this.encodeURI(this.funderId) + '" ) ', 1, this.funderCount, [], this.properties).subscribe(
|
||||
this.subscriptions.push(this._searchProjectsService.getProjectsForOrganizations(this.organizationId, '(funder exact "' + this.encodeURI(this.funderId) + '" ) ', 1, this.funderCount, [], this.properties).subscribe(
|
||||
data => {
|
||||
projects = data[1];
|
||||
for (let index = 0; index < projects.length; index++) {
|
||||
|
|
|
@ -2,7 +2,9 @@
|
|||
<schema2jsonld *ngIf="resultLandingInfo && resultLandingInfo.record"
|
||||
[data]=resultLandingInfo.record [URL]="canonicalUrl"
|
||||
[searchActionRoute]="properties.searchLinkToResults"></schema2jsonld>
|
||||
|
||||
<div *ngIf="resultLandingInfo && !resultLandingInfo.belongsTo" [innerHTML]="resultLandingInfo.message"
|
||||
class="uk-alert uk-alert-warning uk-position-fixed uk-position-bottom-center uk-text-small" style="z-index: 1000;">
|
||||
</div>
|
||||
<!-- Desktop view -->
|
||||
<div *ngIf="!isMobile" id="tm-main" class="landing uk-section uk-padding-remove tm-middle">
|
||||
<div class="tm-main">
|
||||
|
@ -1200,4 +1202,4 @@
|
|||
<fs-modal *ngIf="resultLandingInfo" #addThisFsModal classTitle="uk-tile-default uk-border-bottom" classBody="uk-flex uk-flex-center uk-flex-middle">
|
||||
<addThis *ngIf="addThisClicked"></addThis>
|
||||
</fs-modal>
|
||||
</ng-container>
|
||||
</ng-container>
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
import {ChangeDetectorRef, Component, ElementRef, Input, ViewChild} from '@angular/core';
|
||||
import {ChangeDetectorRef, Component, ElementRef, EventEmitter, Input, Output, ViewChild} from '@angular/core';
|
||||
import {ActivatedRoute, Router} from '@angular/router';
|
||||
import {Meta, Title} from '@angular/platform-browser';
|
||||
|
||||
|
@ -43,6 +43,7 @@ export class ResultLandingComponent {
|
|||
@Input() type: string = "publication";
|
||||
|
||||
@Input() communityId = null;
|
||||
@Output() result: EventEmitter<ResultLandingInfo> = new EventEmitter<ResultLandingInfo>();
|
||||
enermapsId;
|
||||
// @ViewChild('linkModal') linkModal;
|
||||
@ViewChild('citeModal') citeModal;
|
||||
|
@ -514,6 +515,9 @@ export class ResultLandingComponent {
|
|||
|
||||
this.resultLandingInfo = data;
|
||||
this.id = this.resultLandingInfo.objIdentifier;
|
||||
let typeId = this.identifier?.id?'pid':'id';
|
||||
let id = this.identifier?.id?this.identifier.id:this.id;
|
||||
this.resultLandingInfo.setBelongsTo(typeId, id);
|
||||
//old
|
||||
// this.viewsFrameUrl = this.properties.framesAPIURL + 'merge.php?com=query&data=[{"query":"resRepoViews", "resTitle":"' + this.id + '", "table":"","fields":[{"fld":"sum","agg":"sum","type":"column","yaxis":1,"c":false}],"xaxis":{"name":"month","agg":"sum"},"group":" ","color":"","type":"chart","size":200,"sort":"xaxis","xStyle":{"r":-30,"s":"6","l":"-","ft":"-","wt":"-"},"title":"","subtitle":"","xaxistitle":"Repository","yaxisheaders":["Monthly views"],"generalxaxis":"","theme":0,"in":[],"filters":[{"name":"","values":[""],"to":"-1"}]}]&info_types=["column"]&stacking=normal&steps=false&fontFamily=Courier&spacing=[5,0,0,0]&style=[{"color":"rgba(0, 0, 0, 1)","size":"18"},{"color":"rgba(0, 0, 0, 1)","size":"18"},{"color":"000000","size":""},{"color":"000000","size":""}]&backgroundColor=rgba(255,255,255,1)&colors[]=rgba(67, 67, 72, 1)&colors[]=rgba(144, 237, 125, 1)&colors[]=rgba(247, 163, 92, 1)&colors[]=rgba(128, 133, 233, 1)&colors[]=rgba(241, 92, 128, 1)&colors[]=rgba(228, 211, 84, 1)&colors[]=rgba(43, 144, 143, 1)&colors[]=rgba(244, 91, 91, 1)&colors[]=rgba(145, 232, 225, 1)&xlinew=0&ylinew=1&legends=true&tooltips=true&persistent=false';
|
||||
// this.downloadsFrameUrl = this.properties.framesAPIURL + 'merge.php?com=query&data=[{"query":"resRepoDownloads", "resTitle":"' + this.id + '", "table":"","fields":[{"fld":"sum","agg":"sum","type":"column","yaxis":1,"c":false}],"xaxis":{"name":"month","agg":"sum"},"group":" ","color":"","type":"chart","size":200,"sort":"xaxis","xStyle":{"r":-30,"s":"6","l":"-","ft":"-","wt":"-"},"title":"","subtitle":"","xaxistitle":"Repository","yaxisheaders":["Monthly downloads"],"generalxaxis":"","theme":0,"in":[],"filters":[{"name":"","values":[""],"to":"-1"}]}]&info_types=["column"]&stacking=normal&steps=false&fontFamily=Courier&spacing=[5,0,0,0]&style=[{"color":"rgba(0, 0, 0, 1)","size":"18"},{"color":"rgba(0, 0, 0, 1)","size":"18"},{"color":"000000","size":""},{"color":"000000","size":""}]&backgroundColor=rgba(255,255,255,1)&colors[]=rgba(67, 67, 72, 1)&colors[]=rgba(144, 237, 125, 1)&colors[]=rgba(247, 163, 92, 1)&colors[]=rgba(128, 133, 233, 1)&colors[]=rgba(241, 92, 128, 1)&colors[]=rgba(228, 211, 84, 1)&colors[]=rgba(43, 144, 143, 1)&colors[]=rgba(244, 91, 91, 1)&colors[]=rgba(145, 232, 225, 1)&xlinew=0&ylinew=1&legends=true&tooltips=true&persistent=false';
|
||||
|
@ -591,7 +595,6 @@ export class ResultLandingComponent {
|
|||
this.setActiveTab();
|
||||
|
||||
this.cdr.detectChanges();
|
||||
|
||||
if (contexts) {
|
||||
if (this.communityId && this.communityId == "enermaps" && properties.enermapsURL) {
|
||||
this.enermapsId = ParsingFunctions.getEnermapsConceptId(contexts);
|
||||
|
|
|
@ -220,6 +220,11 @@ export class COOKIE {
|
|||
}
|
||||
}
|
||||
|
||||
class Roles {
|
||||
manager = 'manager';
|
||||
member = 'member';
|
||||
}
|
||||
|
||||
export class Role {
|
||||
public static GROUP = '';
|
||||
public static PORTAL_ADMIN = 'PORTAL_ADMINISTRATOR';
|
||||
|
@ -227,6 +232,7 @@ export class Role {
|
|||
public static ANONYMOUS_USER = 'ROLE_ANONYMOUS';
|
||||
public static USER_MANAGER = 'USER_MANAGER';
|
||||
public static CURATOR_CLAIM = 'CURATOR_CLAIM';
|
||||
public static ROLES: Roles = new Roles();
|
||||
|
||||
public static roleName(type: string, id: string) {
|
||||
return this.GROUP + this.mapType(type) + '.' + id;
|
||||
|
@ -284,3 +290,10 @@ export class Role {
|
|||
return this.mapType(type, false).toUpperCase() + "_" + id.toUpperCase();
|
||||
}
|
||||
}
|
||||
|
||||
export class RoleUtils {
|
||||
|
||||
get roles() {
|
||||
return Role.ROLES;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -181,19 +181,6 @@
|
|||
class="uk-text-center uk-text-bold uk-margin-small-bottom">
|
||||
{{ indicator.name }}
|
||||
</div>
|
||||
<div *ngIf="indicator.indicatorPaths.length > 1" class="uk-margin-medium-bottom">
|
||||
<ul class="uk-subnav uk-subnav-pill uk-subnav-small">
|
||||
<li *ngFor="let indicatorPath of indicator.indicatorPaths; let i=index"
|
||||
class="uk-flex uk-margin-small-top"
|
||||
[class.uk-active]="(!indicator.activePath && i == 0) || indicator.activePath === i">
|
||||
<a (click)="indicator.activePath = i">
|
||||
<span>
|
||||
{{ indicatorPath.parameters.title ? indicatorPath.parameters.title : '--' }}
|
||||
</span>
|
||||
</a>
|
||||
</li>
|
||||
</ul>
|
||||
</div>
|
||||
<iframe *ngIf="!properties.disableFrameLoad && getActiveIndicatorPath(indicator) && getActiveIndicatorPath(indicator).source !=='image' &&
|
||||
safeUrls.get(indicatorUtils.getFullUrl(stakeholder, getActiveIndicatorPath(indicator)))"
|
||||
allowfullscreen="true" mozallowfullscreen="true"
|
||||
|
@ -213,6 +200,13 @@
|
|||
[ngClass]="'uk-height-' + (indicator.height?indicator.height.toLowerCase():'medium')"
|
||||
[src]="getActiveIndicatorPath(indicator).url">
|
||||
</div>
|
||||
<slider-tabs *ngIf="indicator.indicatorPaths.length > 1" [type]="'dynamic'" [flexPosition]="'right'" (activeEmitter)="indicator.activePath = $event"
|
||||
tabsClass="uk-subnav uk-subnav-pill uk-subnav-small" containerClass="uk-margin-top uk-margin-bottom" [border]="false">
|
||||
<slider-tab *ngFor="let indicatorPath of indicator.indicatorPaths; let i=index"
|
||||
[tabTitle]="indicatorPath.parameters.tab ? indicatorPath.parameters.tab : indicatorPath.parameters.title"
|
||||
[tabId]="i" [active]="(!indicator.activePath && i == 0) || indicator.activePath == i">
|
||||
</slider-tab>
|
||||
</slider-tabs>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
@ -483,7 +477,7 @@
|
|||
class="uk-visible-toggle uk-flex uk-margin-small-top" transition-group-item
|
||||
[class.uk-active]="(!indicator.activePath && i == 0) || indicator.activePath === i">
|
||||
<a (click)="activeChartIndicatorPath(i)">
|
||||
<span>{{ getParameter(i, 'title')?.get('value')?.value ? getParameter(i, 'title').get('value').value : 'No title yet' }}</span>
|
||||
<span>{{ getParameter(i, 'tab')?.get('value')?.value ? getParameter(i, 'tab').get('value').value : 'No title yet' }}</span>
|
||||
</a>
|
||||
<span *ngIf="!indicator.defaultId && chartIndicatorPaths.length > 1"
|
||||
class="uk-flex uk-flex-column uk-flex-center uk-margin-small-left"
|
||||
|
@ -548,6 +542,9 @@
|
|||
</div>
|
||||
<div class="uk-width-1-1" formArrayName="parameters">
|
||||
<div class="uk-grid" uk-grid>
|
||||
<div *ngIf="stakeholderUtils.hasMultiChartIndicatorPaths && getParameter(i, 'tab')" input class="uk-width-1-1"
|
||||
[formInput]="getParameter(i, 'tab').get('value')"
|
||||
placeholder="Tab Title"></div>
|
||||
<div *ngIf="getParameter(i, 'title')" input class="uk-width-1-1"
|
||||
[formInput]="getParameter(i, 'title').get('value')"
|
||||
placeholder="Chart Title"></div>
|
||||
|
|
|
@ -668,6 +668,9 @@ export class IndicatorsComponent extends IndicatorStakeholderBaseComponent imple
|
|||
if(!indicatorPath.parameters.statsProfile) {
|
||||
indicatorPath.parameters.statsProfile = null;
|
||||
}
|
||||
if(!indicatorPath.parameters.tab) {
|
||||
indicatorPath.parameters.tab = indicatorPath.parameters.title;
|
||||
}
|
||||
Object.keys(indicatorPath.parameters).forEach(key => {
|
||||
if (this.indicatorUtils.ignoredParameters.indexOf(key) === -1) {
|
||||
if (this.indicatorUtils.parametersValidators.has(key)) {
|
||||
|
|
|
@ -15,11 +15,6 @@ import {Option} from "../../sharedComponents/input/input.component";
|
|||
import {Session} from "../../login/utils/helper.class";
|
||||
import {properties} from "src/environments/environment";
|
||||
|
||||
class Roles {
|
||||
manager = 'manager';
|
||||
member = 'member';
|
||||
}
|
||||
|
||||
class Entities {
|
||||
stakeholder = 'Dashboard';
|
||||
funder = 'Funder';
|
||||
|
@ -49,7 +44,7 @@ export interface OAIndicator {
|
|||
}
|
||||
|
||||
export class StakeholderConfiguration {
|
||||
public static ROLES: Roles = new Roles();
|
||||
|
||||
public static ENTITIES: Entities = new Entities();
|
||||
public static TYPES: Option[] = [
|
||||
{value: 'funder', label: StakeholderConfiguration.ENTITIES.funder},
|
||||
|
@ -76,10 +71,6 @@ export class StakeholderConfiguration {
|
|||
}
|
||||
|
||||
export class StakeholderUtils {
|
||||
get roles() {
|
||||
return StakeholderConfiguration.ROLES;
|
||||
}
|
||||
|
||||
get entities() {
|
||||
return StakeholderConfiguration.ENTITIES;
|
||||
}
|
||||
|
@ -1002,6 +993,7 @@ export class IndicatorUtils {
|
|||
obj[this.getDescriptionObjectName(obj)]["options"]["title"] = ChartHelper.prefix + "title" + ChartHelper.suffix;
|
||||
}
|
||||
indicatorPath.parameters["title"] = title ? title : "";
|
||||
indicatorPath.parameters["tab"] = title ? title : "";
|
||||
}
|
||||
|
||||
private extractSubTitle(obj, indicatorPath: IndicatorPath) {
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
import {AfterViewInit, ChangeDetectorRef, Component, Input, OnInit, ViewChild} from "@angular/core";
|
||||
import {Role, User} from "../login/utils/helper.class";
|
||||
import {Role, RoleUtils, User} from "../login/utils/helper.class";
|
||||
import {ActivatedRoute, Router} from "@angular/router";
|
||||
import {UserManagementService} from "../services/user-management.service";
|
||||
import {UserRegistryService} from "../services/user-registry.service";
|
||||
|
@ -21,7 +21,7 @@ import {StringUtils} from "../utils/string-utils.class";
|
|||
<modal-alert #managerModal [overflowBody]="false" (alertOutput)="verifyManager()" (cancelOutput)="cancel()"
|
||||
[okDisabled]="code.invalid || loading">
|
||||
<div>
|
||||
You have been invited to join <span class="uk-text-bold">{{name}}</span> {{(dashboard)}} Dashboard as a {{stakeholderUtils.roles.manager}}.
|
||||
You have been invited to join <span class="uk-text-bold">{{name}}</span> {{(dashboard)}} Dashboard as a {{roleUtils.roles.manager}}.
|
||||
<span class="uk-text-primary">Fill</span> in the <span class="uk-text-primary">verification code</span>, sent to
|
||||
your email, to accept the invitation request.
|
||||
</div>
|
||||
|
@ -38,7 +38,7 @@ import {StringUtils} from "../utils/string-utils.class";
|
|||
(alertOutput)="verifyMember()" [okDisabled]="(code.invalid || loading)">
|
||||
<div>
|
||||
<div>
|
||||
You have been invited to join <span class="uk-text-bold">{{name}}</span> {{(dashboard)}} Dashboard as a {{stakeholderUtils.roles.member}}.
|
||||
You have been invited to join <span class="uk-text-bold">{{name}}</span> {{(dashboard)}} Dashboard as a {{roleUtils.roles.member}}.
|
||||
<span class="uk-text-primary">Fill</span> in the <span class="uk-text-primary">verification code</span>, sent
|
||||
to your email, to accept the invitation request.
|
||||
</div>
|
||||
|
@ -98,6 +98,7 @@ export class RoleVerificationComponent extends BaseComponent implements OnInit,
|
|||
public error: string = null;
|
||||
public loading: boolean = false;
|
||||
public stakeholderUtils: StakeholderUtils = new StakeholderUtils();
|
||||
public roleUtils: RoleUtils = new RoleUtils();
|
||||
|
||||
constructor(protected _route: ActivatedRoute,
|
||||
protected _router: Router,
|
||||
|
@ -173,7 +174,7 @@ export class RoleVerificationComponent extends BaseComponent implements OnInit,
|
|||
this.managerModal.okButtonText = 'Accept';
|
||||
this.managerModal.stayOpen = true;
|
||||
this.managerModal.cancelButtonText = 'Cancel';
|
||||
this.managerModal.alertTitle = StringUtils.capitalize(this.stakeholderUtils.roles.manager) + ' Invitation';
|
||||
this.managerModal.alertTitle = StringUtils.capitalize(this.roleUtils.roles.manager) + ' Invitation';
|
||||
this.managerModal.open();
|
||||
}
|
||||
|
||||
|
@ -184,7 +185,7 @@ export class RoleVerificationComponent extends BaseComponent implements OnInit,
|
|||
this.memberModal.okButtonLeft = false;
|
||||
this.memberModal.stayOpen = true;
|
||||
this.memberModal.cancelButtonText = 'Cancel';
|
||||
this.memberModal.alertTitle = StringUtils.capitalize(this.stakeholderUtils.roles.member) + ' Invitation';
|
||||
this.memberModal.alertTitle = StringUtils.capitalize(this.roleUtils.roles.member) + ' Invitation';
|
||||
this.cdr.detectChanges();
|
||||
this.memberModal.open();
|
||||
}
|
||||
|
|
|
@ -13,6 +13,7 @@ import {DatasourcesHelperClass} from "./searchUtils/datasourcesHelper.class";
|
|||
import {properties} from "../../../environments/environment";
|
||||
import {RefineResultsUtils} from "../services/servicesUtils/refineResults.class";
|
||||
import {RefineFieldResultsService} from "../services/refineFieldResults.service";
|
||||
import {zip} from "rxjs";
|
||||
|
||||
|
||||
@Component({
|
||||
|
@ -207,12 +208,28 @@ export class SearchDataProvidersComponent {
|
|||
parametersFull = parameters;
|
||||
refineQueryFull = refineFieldsFilterQuery+(refineFieldsFilterQuery.length > 0 && datasourceQueryPrefix.length >0 ? "&" : "")+(datasourceQueryPrefix.length>0 ? "fq=" : "")+datasourceQueryPrefix;
|
||||
}
|
||||
this.searchFiltersSub = this._searchDataProvidersService.advancedSearchDataproviders( parametersFull, page, size, this.properties, (refine /*&& (this.type=="all" || this.type == "deposit")*/) ? this.searchPage.getRefineFieldsQuery() : null, this.searchPage.getFields(), refineQueryFull, isDeposit, true)
|
||||
//.switchMap(
|
||||
.subscribe(
|
||||
|
||||
let filterQueries;
|
||||
let filterIds = [];
|
||||
let fields = this.searchPage.getFields();
|
||||
for(let filter of this.searchPage.URLCreatedFilters) {
|
||||
filterIds.push(filter.filterId);
|
||||
fields = fields.filter(field => field != filter.filterId);
|
||||
}
|
||||
|
||||
if(filterIds.length > 0) {
|
||||
filterQueries = zip(this._searchDataProvidersService.advancedSearchDataproviders(parametersFull, page, size, this.properties, (refine) ? this.searchPage.getRefineFieldsQuery(filterIds) : null, filterIds, refineQueryFull, isDeposit, false),
|
||||
this._searchDataProvidersService.advancedSearchDataproviders(parametersFull, page, size, this.properties, (refine) ? this.searchPage.getRefineFieldsQuery(fields) : null, fields, refineQueryFull, isDeposit, true)
|
||||
);
|
||||
} else {
|
||||
filterQueries = this._searchDataProvidersService.advancedSearchDataproviders(parametersFull, page, size, this.properties, (refine) ? this.searchPage.getRefineFieldsQuery(fields) : null, fields, refineQueryFull, isDeposit, true)
|
||||
}
|
||||
|
||||
this.searchFiltersSub = filterQueries.subscribe(
|
||||
data => {
|
||||
let totalResults = data[0];
|
||||
let filters = data[2];
|
||||
let totalResults = filterIds.length > 0 ? data[0][0] : data[0];
|
||||
let filters = filterIds.length > 0 ? data[0][2].concat(data[1][2]) : data[2];
|
||||
|
||||
this.filtersReturned(refine, filters, totalResults, page);
|
||||
},
|
||||
err => {
|
||||
|
|
|
@ -10,6 +10,7 @@ import {EnvProperties} from '../utils/properties/env-properties';
|
|||
import {NewSearchPageComponent, SearchForm} from "./searchUtils/newSearchPage.component";
|
||||
import {properties} from "../../../environments/environment";
|
||||
import {RefineFieldResultsService} from "../services/refineFieldResults.service";
|
||||
import {zip} from "rxjs";
|
||||
|
||||
|
||||
@Component({
|
||||
|
@ -169,12 +170,28 @@ export class SearchOrganizationsComponent {
|
|||
this.searchUtils.refineStatus = this.errorCodes.LOADING;
|
||||
this.disableRefineForms = true;
|
||||
this.searchPageUpdates.emit({disableForms: this.disableForms, disableRefineForms: this.disableRefineForms, searchUtils: this.searchUtils});
|
||||
this.searchFiltersSub = this._searchOrganizationsService.advancedSearchOrganizations(parameters, page, size, this.properties,(refine) ? this.searchPage.getRefineFieldsQuery() : null, this.searchPage.getFields(), refineFieldsFilterQuery, true)
|
||||
//.switchMap(
|
||||
.subscribe(
|
||||
|
||||
let filterQueries;
|
||||
let filterIds = [];
|
||||
let fields = this.searchPage.getFields();
|
||||
for(let filter of this.searchPage.URLCreatedFilters) {
|
||||
filterIds.push(filter.filterId);
|
||||
fields = fields.filter(field => field != filter.filterId);
|
||||
}
|
||||
|
||||
if(filterIds.length > 0) {
|
||||
filterQueries = zip(this._searchOrganizationsService.advancedSearchOrganizations(parameters, page, size, this.properties, (refine) ? this.searchPage.getRefineFieldsQuery(filterIds) : null, filterIds, refineFieldsFilterQuery, false),
|
||||
this._searchOrganizationsService.advancedSearchOrganizations(parameters, page, size, this.properties, (refine) ? this.searchPage.getRefineFieldsQuery(fields) : null, fields, refineFieldsFilterQuery, true)
|
||||
);
|
||||
} else {
|
||||
filterQueries = this._searchOrganizationsService.advancedSearchOrganizations(parameters, page, size, this.properties, (refine) ? this.searchPage.getRefineFieldsQuery(fields) : null, fields, refineFieldsFilterQuery, true)
|
||||
}
|
||||
|
||||
this.searchFiltersSub = filterQueries.subscribe(
|
||||
data => {
|
||||
let totalResults = data[0];
|
||||
let filters = data[2];
|
||||
let totalResults = filterIds.length > 0 ? data[0][0] : data[0];
|
||||
let filters = filterIds.length > 0 ? data[0][2].concat(data[1][2]) : data[2];
|
||||
|
||||
this.filtersReturned(refine, filters, totalResults, page);
|
||||
},
|
||||
err => {
|
||||
|
|
|
@ -11,6 +11,7 @@ import {NewSearchPageComponent, SearchForm} from "./searchUtils/newSearchPage.co
|
|||
import {RangeFilter} from "../utils/rangeFilter/rangeFilterHelperClasses.class";
|
||||
import {properties} from "../../../environments/environment";
|
||||
import {RefineFieldResultsService} from "../services/refineFieldResults.service";
|
||||
import {zip} from "rxjs";
|
||||
|
||||
@Component({
|
||||
selector: 'search-projects',
|
||||
|
@ -174,30 +175,45 @@ export class SearchProjectsComponent {
|
|||
disableRefineForms: this.disableRefineForms,
|
||||
searchUtils: this.searchUtils
|
||||
});
|
||||
this.searchFiltersSub = this._searchProjectsService.advancedSearchProjects(parameters, page, size, this.properties, (refine) ? this.searchPage.getRefineFieldsQuery() : null, this.searchPage.getFields(), refineFieldsFilterQuery, true)
|
||||
//.switchMap(
|
||||
.subscribe(
|
||||
data => {
|
||||
let totalResults = data[0];
|
||||
let filters = data[2];
|
||||
this.filtersReturned(refine, filters, totalResults, page);
|
||||
|
||||
},
|
||||
err => {
|
||||
this.filters = this.searchPage.prepareFiltersToShow([], 0);
|
||||
this.rangeFilters = this.searchPage.prepareRangeFiltersToShow();
|
||||
|
||||
this.handleError("Error getting refine filters for projects: ", err);
|
||||
this.searchUtils.refineStatus = this.errorMessages.getErrorCode(err.status);
|
||||
|
||||
this.disableRefineForms = false;
|
||||
this.searchPageUpdates.emit({
|
||||
disableForms: this.disableForms,
|
||||
disableRefineForms: this.disableRefineForms,
|
||||
searchUtils: this.searchUtils
|
||||
})
|
||||
}
|
||||
|
||||
let filterQueries;
|
||||
let filterIds = [];
|
||||
let fields = this.searchPage.getFields();
|
||||
for(let filter of this.searchPage.URLCreatedFilters) {
|
||||
filterIds.push(filter.filterId);
|
||||
fields = fields.filter(field => field != filter.filterId);
|
||||
}
|
||||
|
||||
if(filterIds.length > 0) {
|
||||
filterQueries = zip(this._searchProjectsService.advancedSearchProjects(parameters, page, size, this.properties, (refine) ? this.searchPage.getRefineFieldsQuery(filterIds) : null, filterIds, refineFieldsFilterQuery, false),
|
||||
this._searchProjectsService.advancedSearchProjects(parameters, page, size, this.properties, (refine) ? this.searchPage.getRefineFieldsQuery(fields) : null, fields, refineFieldsFilterQuery, true)
|
||||
);
|
||||
} else {
|
||||
filterQueries = this._searchProjectsService.advancedSearchProjects(parameters, page, size, this.properties, (refine) ? this.searchPage.getRefineFieldsQuery(fields) : null, fields, refineFieldsFilterQuery, true)
|
||||
}
|
||||
|
||||
this.searchFiltersSub = filterQueries.subscribe(
|
||||
data => {
|
||||
let totalResults = filterIds.length > 0 ? data[0][0] : data[0];
|
||||
let filters = filterIds.length > 0 ? data[0][2].concat(data[1][2]) : data[2];
|
||||
|
||||
this.filtersReturned(refine, filters, totalResults, page);
|
||||
},
|
||||
err => {
|
||||
this.filters = this.searchPage.prepareFiltersToShow([], 0);
|
||||
this.rangeFilters = this.searchPage.prepareRangeFiltersToShow();
|
||||
|
||||
this.handleError("Error getting refine filters for projects: ", err);
|
||||
this.searchUtils.refineStatus = this.errorMessages.getErrorCode(err.status);
|
||||
|
||||
this.disableRefineForms = false;
|
||||
this.searchPageUpdates.emit({
|
||||
disableForms: this.disableForms,
|
||||
disableRefineForms: this.disableRefineForms,
|
||||
searchUtils: this.searchUtils
|
||||
})
|
||||
}
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -14,6 +14,7 @@ import {ContextsService} from "../claims/claim-utils/service/contexts.service";
|
|||
import {StringUtils} from "../utils/string-utils.class";
|
||||
import {RefineResultsUtils} from "../services/servicesUtils/refineResults.class";
|
||||
import {RefineFieldResultsService} from "../services/refineFieldResults.service";
|
||||
import {zip} from "rxjs";
|
||||
|
||||
@Component({
|
||||
selector: 'search-research-results',
|
||||
|
@ -253,13 +254,27 @@ export class SearchResearchResultsComponent {
|
|||
this.searchUtils.refineStatus = this.errorCodes.LOADING;
|
||||
this.disableRefineForms = true;
|
||||
this.searchPageUpdates.emit({disableForms: this.disableForms, disableRefineForms: this.disableRefineForms, searchUtils: this.searchUtils});
|
||||
this.searchFiltersSub = this._searchResearchResultsService.advancedSearchResults(this.resultType, parameters, page, size, sortBy, this.properties, (refine) ? this.searchPage.getRefineFieldsQuery() : null, this.searchPage.getFields(), refineFieldsFilterQuery, true)
|
||||
// this.subs.push(this._searchResearchResultsService.advancedSearchResults(this.resultType, parameters, page, size, sortBy, this.properties, (refine) ? this.searchPage.getRefineFieldsQuery() : null, this.searchPage.getFields(), refineFieldsFilterQuery)
|
||||
//.switchMap(
|
||||
.subscribe(
|
||||
|
||||
let filterQueries;
|
||||
let filterIds = [];
|
||||
let fields = this.searchPage.getFields();
|
||||
for(let filter of this.searchPage.URLCreatedFilters) {
|
||||
filterIds.push(filter.filterId);
|
||||
fields = fields.filter(field => field != filter.filterId);
|
||||
}
|
||||
|
||||
if(filterIds.length > 0) {
|
||||
filterQueries = zip(this._searchResearchResultsService.advancedSearchResults(this.resultType, parameters, page, size, sortBy, this.properties, (refine) ? this.searchPage.getRefineFieldsQuery(filterIds) : null, filterIds, refineFieldsFilterQuery, false),
|
||||
this._searchResearchResultsService.advancedSearchResults(this.resultType, parameters, page, size, sortBy, this.properties, (refine) ? this.searchPage.getRefineFieldsQuery(fields) : null, fields, refineFieldsFilterQuery, true)
|
||||
);
|
||||
} else {
|
||||
filterQueries = this._searchResearchResultsService.advancedSearchResults(this.resultType, parameters, page, size, sortBy, this.properties, (refine) ? this.searchPage.getRefineFieldsQuery(fields) : null, fields, refineFieldsFilterQuery, true);
|
||||
}
|
||||
|
||||
this.searchFiltersSub = filterQueries.subscribe(
|
||||
data => {
|
||||
let totalResults = data[0];
|
||||
let filters = data[2];
|
||||
let totalResults = filterIds.length > 0 ? data[0][0] : data[0];
|
||||
let filters = filterIds.length > 0 ? data[0][2].concat(data[1][2]) : data[2];
|
||||
|
||||
// if (refine) {
|
||||
// this.filters = this.searchPage.prepareFiltersToShow(filters, totalResults);
|
||||
|
|
|
@ -551,9 +551,11 @@ export class NewSearchPageComponent implements OnInit, OnDestroy, OnChanges {
|
|||
/*
|
||||
* Get a query string of all fields, that want to get from search (e.g. &fields=funderid&fields=projectstartyear&...))
|
||||
*/
|
||||
public getRefineFieldsQuery(): string {
|
||||
|
||||
var fields: string[] = this.getFields();
|
||||
public getRefineFieldsQuery(fields: string[] = null): string {
|
||||
|
||||
if(!fields) {
|
||||
fields = this.getFields();
|
||||
}
|
||||
var fieldsStr = ""
|
||||
for (var i = 0; i < fields.length; i++) {
|
||||
fieldsStr += "&fields=" + fields[i];
|
||||
|
@ -1816,10 +1818,10 @@ export class NewSearchPageComponent implements OnInit, OnDestroy, OnChanges {
|
|||
this.showUnknownFilters = true;
|
||||
this.filters = filters;
|
||||
}
|
||||
|
||||
|
||||
this.buildPageURLParameters(this.URLCreatedFilters, this.URLCreatedRangeFilters, this.URLCreatedStaticFilters, true);
|
||||
//this.checkSelectedRangeFilters(this.rangeFilters);
|
||||
|
||||
|
||||
this.checkSelectedFilters(this.filters);
|
||||
this.countSelectedFilters(this.filters);
|
||||
this.updateMeta(this.pageTitle);
|
||||
|
|
|
@ -34,14 +34,15 @@ export class SearchProjectsService {
|
|||
}
|
||||
getProjectsforDataProvider (datasourceId: string, page: number, size: number, properties:EnvProperties ):any {
|
||||
let url = properties.searchResourcesAPIURL;
|
||||
var basicQuery = "(oaftype exact project) "
|
||||
var basicQuery = "(oaftype exact project) ";
|
||||
var filterQuery = "&fq=(projectcode<>\"unidentified\")";
|
||||
url += "?query=";
|
||||
if(datasourceId!= null && datasourceId != '' ) {
|
||||
url +=" ( "+basicQuery+ " ) " +" and (collectedfromdatasourceid exact \"" + datasourceId + "\" or resulthostingdatasourceid exact \""+ datasourceId + "\")";
|
||||
}else{
|
||||
url +=" ( "+basicQuery+ " ) ";
|
||||
}
|
||||
|
||||
url += filterQuery;
|
||||
url += "&page="+(page-1)+"&size="+size;
|
||||
url += "&format=json";
|
||||
|
||||
|
@ -53,6 +54,7 @@ export class SearchProjectsService {
|
|||
// &type=projects
|
||||
let url = properties.searchAPIURLLAst+"resources2/?format=json";
|
||||
// var basicQuery = "(oaftype exact project) "
|
||||
var basicQuery = "&fq=(projectcode<>\"unidentified\")";
|
||||
// url += "?query=";
|
||||
if(params!= null && params != '' ) {
|
||||
url +="&query=(" + params + ")";
|
||||
|
@ -66,6 +68,8 @@ export class SearchProjectsService {
|
|||
if(refineQuery) {
|
||||
url += "&" + refineQuery;
|
||||
}
|
||||
// url += "&fq="+basicQuery;
|
||||
url += basicQuery;
|
||||
url += "&page="+(page-1)+"&size="+size;
|
||||
url += minRef ? "&minRef=true" : "";
|
||||
|
||||
|
@ -80,11 +84,15 @@ export class SearchProjectsService {
|
|||
let url = properties.searchResourcesAPIURL;
|
||||
var basicQuery = "(oaftype exact project) "
|
||||
url += "?query=";
|
||||
if(filterquery!= null && filterquery != '' ) {
|
||||
url +="( ( "+basicQuery+ " ) and (relorganizationid exact \"" + organizationId + "\")"+" " + filterquery + ")";
|
||||
}else{
|
||||
// if(filterquery!= null && filterquery != '' ) {
|
||||
// url +="( ( "+basicQuery+ " ) and (relorganizationid exact \"" + organizationId + "\")"+" " + filterquery + ")";
|
||||
// }else{
|
||||
url +=" (( "+basicQuery+ " ) " +" and (relorganizationid exact \"" + organizationId + "\"))";
|
||||
// }
|
||||
if(filterquery) {
|
||||
url += "&fq=" + filterquery;
|
||||
}
|
||||
url += "&fq=(projectcode<>\"unidentified\")";
|
||||
if(refineFields!= null && refineFields.length > 0 ) {
|
||||
url +="&refine=true";
|
||||
for(let i=0; i< refineFields.length ; i++ ){
|
||||
|
@ -304,6 +312,8 @@ export class SearchProjectsService {
|
|||
if(refineParams!= null && refineParams != '' ) {
|
||||
url += refineParams;
|
||||
}
|
||||
url += "&fq=(projectcode<>\"unidentified\")";
|
||||
|
||||
return this.http.get((properties.useCache)? (properties.cacheUrl+encodeURIComponent(url)): url)
|
||||
.pipe(map(res => res['meta']['total']));
|
||||
}
|
||||
|
|
|
@ -829,7 +829,6 @@ export class InputComponent implements OnInit, OnDestroy, AfterViewInit, OnChang
|
|||
|
||||
resetValue(event: any) {
|
||||
event.stopPropagation();
|
||||
console.log(1)
|
||||
this.formControl.setValue('');
|
||||
this.focus(true, event);
|
||||
}
|
||||
|
|
|
@ -9,7 +9,7 @@ export class SliderTabComponent {
|
|||
@Input("tabTitle")
|
||||
public title: string;
|
||||
@Input("tabId")
|
||||
public id: string;
|
||||
public id: string | number;
|
||||
@Input()
|
||||
public active: boolean = false;
|
||||
@Input()
|
||||
|
|
|
@ -143,7 +143,7 @@ export class SliderTabsComponent implements AfterViewInit, OnDestroy {
|
|||
/**
|
||||
* Notify regarding new active element
|
||||
* */
|
||||
@Output() activeEmitter: EventEmitter<string> = new EventEmitter<string>();
|
||||
@Output() activeEmitter: EventEmitter<string | number> = new EventEmitter<number>();
|
||||
private activeIndex: number = 0;
|
||||
private subscriptions: any[] = [];
|
||||
private observer: IntersectionObserver;
|
||||
|
@ -235,7 +235,7 @@ export class SliderTabsComponent implements AfterViewInit, OnDestroy {
|
|||
});
|
||||
}, {threshold: 0.1});
|
||||
this.tabs.forEach(tab => {
|
||||
let element = document.getElementById(tab.id);
|
||||
let element = document.getElementById(tab.id.toString());
|
||||
if (element) {
|
||||
this.observer.observe(element);
|
||||
}
|
||||
|
|
|
@ -170,6 +170,17 @@ export class ShowAuthorsComponent {
|
|||
|
||||
ngOnInit() {}
|
||||
|
||||
ngOnDestroy() {
|
||||
if(typeof document !== 'undefined') {
|
||||
let modal_container = document.getElementById("modal-container");
|
||||
modal_container.childNodes.forEach(c=> {
|
||||
if (c['className'] && c['className'].includes("orcid-dropdown")) {
|
||||
modal_container.removeChild(c);
|
||||
}
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
public onClick() {
|
||||
if (this.modal) {
|
||||
this.modal.cancel();
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
import {Email} from "./email";
|
||||
import {Body} from "./body";
|
||||
import {properties} from "../../../../environments/environment";
|
||||
import {User} from "../../login/utils/helper.class";
|
||||
import {Role, User} from "../../login/utils/helper.class";
|
||||
import {StakeholderConfiguration} from "../../monitor-admin/utils/indicator-utils";
|
||||
|
||||
export class Composer {
|
||||
|
@ -33,7 +33,7 @@ export class Composer {
|
|||
|
||||
email.subject = this.subjectPrefix + communityName + ": Welcome new manager";
|
||||
email.body = "<div style='font-size:" + this.noteBodySize + "'><p>Welcome to OpenAIRE Connect!</p>"
|
||||
+ "<p>You are receiving this e-mail as you were assigned as manager of the <a href='https://beta."
|
||||
+ "<p>You are receiving this e-mail as you were assigned as " + Role.ROLES['manager'] + " of the <a href='https://beta."
|
||||
+ communityId + ".openaire.eu/'>" + communityName + "</a> gateway. "
|
||||
+ "In order to access the administration section of your community you must first login using one of the available options. "
|
||||
+ "<br>The administrative rights are associated with the e-mail address that was used to send you this message."
|
||||
|
@ -329,9 +329,9 @@ export class Composer {
|
|||
'<p>The verification code is <b>((__code__))</b>.</p>' +
|
||||
'<p>By logging in and using the service you accept and agree to the <a href="' + pdppLink + '" target="_blank">OpenAIRE personal data protection policy</a>.</p>' +
|
||||
(role === "manager"?
|
||||
'<p>As a manager of the OpenAIRE Monitor Dashboard, you will have access to the administration part of the dashboard, ' +
|
||||
'<p>As a ' + Role.ROLES[role] + ' of the OpenAIRE Monitor Dashboard, you will have access to the administration part of the dashboard, ' +
|
||||
'where you will be able to customize and manage the profile of the ' + name + '.</p>':
|
||||
'<p>As a member of the OpenAIRE Monitor Dashboard, you will have access to the restricted access areas of the profile for the ' + name + '.') +
|
||||
'<p>As a ' + Role.ROLES[role] + ' of the OpenAIRE Monitor Dashboard, you will have access to the restricted access areas of the profile for the ' + name + '.') +
|
||||
'<p>Please contact us at <a href="mailto:' + properties.helpdeskEmail+'">' + properties.helpdeskEmail +
|
||||
'</a> if you have any questions or concerns.</p>' +
|
||||
'<p>Kind Regards<br>The OpenAIRE Team</p>' +
|
||||
|
@ -350,13 +350,13 @@ export class Composer {
|
|||
email.subject = 'National Open Access Monitor Ireland | ' + name;
|
||||
email.recipient = recipient;
|
||||
email.body = '<p>Dear user,</p>' +
|
||||
'<p>You have been invited to be a ' + StakeholderConfiguration.ROLES[role] +' of the for the National Open Access Monitor, Ireland dashboard for the ' + name + '.</p>' +
|
||||
'<p>You have been invited to be a ' + Role.ROLES[role] +' of the for the National Open Access Monitor, Ireland dashboard for the ' + name + '.</p>' +
|
||||
'<p>Click <a href="((__link__))" target="_blank">this URL</a> and use the verification code below to accept the invitation.</p>' +
|
||||
'<p>The verification code is <b>((__code__))</b>.</p>' +
|
||||
'<p>At your first sign in you will be asked to accept and consent to the "OpenAIRE Personal Data Protection Policy and Consent Form" to be able to use the service.</p>' +
|
||||
(role === "manager"?
|
||||
'<p>As a ' + StakeholderConfiguration.ROLES[role] + ' of the National Open Access Monitor, Ireland, you will have access to the administration part of the dashboard, where you will be able to also invite other users to become ' + StakeholderConfiguration.ROLES['member'] + 's.</p>':
|
||||
'<p>As a ' + StakeholderConfiguration.ROLES[role] + ' of the National Open Access Monitor, Ireland, you will have access to the sandbox of the profile for the ' + name + '.') +
|
||||
'<p>As a ' + Role.ROLES[role] + ' of the National Open Access Monitor, Ireland, you will have access to the administration part of the dashboard, where you will be able to also invite other users to become ' + Role.ROLES['member'] + 's.</p>':
|
||||
'<p>As a ' + Role.ROLES[role] + ' of the National Open Access Monitor, Ireland, you will have access to the sandbox of the profile for the ' + name + '.') +
|
||||
'<p>Please contact us at <a href="mailto:' + properties.helpdeskEmail+'">' + properties.helpdeskEmail +
|
||||
'</a> if you have any questions or concerns.</p>' +
|
||||
'<p>Kind Regards<br>The OpenAIRE Team</p>' +
|
||||
|
@ -379,9 +379,9 @@ export class Composer {
|
|||
'<p>Click <a href="((__link__))" target="_blank">this URL</a> and use the verification code below to accept the invitation.</p>' +
|
||||
'<p>The verification code is <b>((__code__))</b>.</p>' +
|
||||
(role === 'manager'?
|
||||
'<p>As a manager of the OpenAIRE Research Community Dashboard, you will have access to the administration part of the dashboard, ' +
|
||||
'<p>As a ' + Role.ROLES[role] + ' of the OpenAIRE Research Community Dashboard, you will have access to the administration part of the dashboard, ' +
|
||||
'where you will be able to customize and manage the content of the ' + name + '.</p>':
|
||||
'<p>As a member of the OpenAIRE Research Community Dashboard, you will have access to the community dashboard and link research results with projects, communities and other research projects.</p>') +
|
||||
'<p>As a ' + Role.ROLES[role] + ' of the OpenAIRE Research Community Dashboard, you will have access to the community dashboard and link research results with projects, communities and other research projects.</p>') +
|
||||
'<p>Please contact us at <a href="mailto:' + properties.helpdeskEmail+'">' + properties.helpdeskEmail +
|
||||
'</a> if you have any questions or concerns.</p>' +
|
||||
'<p>Kind Regards<br>The OpenAIRE Team</p>' +
|
||||
|
|
|
@ -1,202 +1,205 @@
|
|||
import {properties} from "../../../../environments/environment";
|
||||
import {Measure} from "./resultLandingInfo";
|
||||
import {BelongsTo, Measure} from "./resultLandingInfo";
|
||||
|
||||
export class DataproviderProvenance {
|
||||
provenance: Map<string, {"urlPrefix": string, "name": string}>;
|
||||
provenance: Map<string, { "urlPrefix": string, "name": string }>;
|
||||
|
||||
constructor() {
|
||||
this.provenance = new Map();
|
||||
this.provenance.set("opendoar____::", {"urlPrefix": properties.openDoarURL, "name": "OpenDOAR"});//, "idRegexPrefix": ""});
|
||||
this.provenance.set("re3data_____::", {"urlPrefix": properties.r3DataURL, "name": "re3data.org"});
|
||||
this.provenance.set("fairsharing_::", {"urlPrefix": properties.fairSharingURL, "name": "FAIRsharing"});
|
||||
this.provenance.set("eosc________::", {"urlPrefix": properties.eoscMarketplaceURL, "name": "EOSC Service Catalogue"});
|
||||
this.provenance.set("eosc________::", {
|
||||
"urlPrefix": properties.eoscMarketplaceURL,
|
||||
"name": "EOSC Service Catalogue"
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
export class DataProviderInfo {
|
||||
relcanId;
|
||||
objIdentifier: string;
|
||||
record;
|
||||
title: { "name": string, "url": string };
|
||||
officialName: string;
|
||||
type: string;
|
||||
registry: boolean;
|
||||
compatibility: { "info": string, "name": string, "id": string };
|
||||
oaiPmhURL: string;
|
||||
openDoarId: string;
|
||||
r3DataId: string;
|
||||
provenance: Map<string, {"url": string[]}>;
|
||||
originalId: string;
|
||||
countries: string[];
|
||||
journal: {"journal": "", "issn": string, "lissn": string, "eissn": string};
|
||||
description: string;
|
||||
subjects: string[];
|
||||
jurisdiction: string;
|
||||
thematic: boolean;
|
||||
contentpolicy: string;
|
||||
identifiers: Map<string, string[]>; //key is the classname
|
||||
relcanId;
|
||||
objIdentifier: string;
|
||||
record;
|
||||
title: { "name": string, "url": string };
|
||||
officialName: string;
|
||||
type: string;
|
||||
registry: boolean;
|
||||
compatibility: { "info": string, "name": string, "id": string };
|
||||
oaiPmhURL: string;
|
||||
openDoarId: string;
|
||||
r3DataId: string;
|
||||
provenance: Map<string, { "url": string[] }>;
|
||||
originalId: string;
|
||||
countries: string[];
|
||||
journal: { "journal": "", "issn": string, "lissn": string, "eissn": string };
|
||||
description: string;
|
||||
subjects: string[];
|
||||
jurisdiction: string;
|
||||
thematic: boolean;
|
||||
contentpolicy: string;
|
||||
identifiers: Map<string, string[]>; //key is the classname
|
||||
|
||||
fundedContent: string; // search query
|
||||
measure: Measure;
|
||||
|
||||
//collected from datasource api
|
||||
// aggregationStatus: {"fundedContent": string, "indexRecords": string, "fulltexts": string, "lastUpdateDate": string};
|
||||
aggregationStatus: {"fulltexts": string};
|
||||
aggregationStatus: { "fulltexts": string };
|
||||
|
||||
tabs: {"name": string, "content": string}[];
|
||||
tabs2: string[] =[];
|
||||
tabsInTypes = {
|
||||
"publicationsTab": new Set<string>(
|
||||
[ "aggregator::datarepository",
|
||||
"aggregator::pubsrepository::institutional",
|
||||
"aggregator::pubsrepository::unknown",
|
||||
"aggregator::pubsrepository::journals",
|
||||
"crissystem",
|
||||
"datarepository::unknown",
|
||||
"infospace",
|
||||
"pubsrepository::institutional",
|
||||
"pubsrepository::journal",
|
||||
"pubsrepository::unknown",
|
||||
"scholarcomminfra",
|
||||
"pubsrepository::thematic",
|
||||
"pubscatalogue::unknown",
|
||||
"orprepository"
|
||||
]),
|
||||
"datasetsTab": new Set<string>(
|
||||
[ "aggregator::datarepository",
|
||||
"aggregator::pubsrepository::institutional",
|
||||
"aggregator::pubsrepository::unknown",
|
||||
"aggregator::pubsrepository::journals",
|
||||
"crissystem",
|
||||
"datarepository::unknown",
|
||||
"infospace",
|
||||
"pubsrepository::institutional",
|
||||
"pubsrepository::journal",
|
||||
"pubsrepository::unknown",
|
||||
"scholarcomminfra",
|
||||
"pubsrepository::thematic",
|
||||
"pubscatalogue::unknown",
|
||||
"orprepository"
|
||||
]),
|
||||
"statisticsTab": new Set<string>(
|
||||
[ "aggregator::datarepository",
|
||||
"aggregator::pubsrepository::institutional",
|
||||
"aggregator::pubsrepository::unknown",
|
||||
"aggregator::pubsrepository::journals",
|
||||
"crissystem",
|
||||
"datarepository::unknown",
|
||||
"pubsrepository::institutional",
|
||||
"pubsrepository::journal",
|
||||
"pubsrepository::unknown",
|
||||
"pubsrepository::thematic",
|
||||
"pubscatalogue::unknown",
|
||||
"orprepository"
|
||||
]),
|
||||
// "organizationsTab": new Set<string>(
|
||||
// [ "entityregistry::projects",
|
||||
// "entityregistry::repositories"
|
||||
// ]),
|
||||
"projectsTab": new Set<string>(["entityregistry::projects"]),
|
||||
"datasourcesTab": new Set<string>(["entityregistry::repositories"]),
|
||||
"relatedDatasourcesTab": new Set<string>(
|
||||
[ "aggregator::pubsrepository::unknown",
|
||||
"aggregator::pubsrepository::journals",
|
||||
"aggregator::pubsrepository::institutional",
|
||||
"aggregator::datarepository"
|
||||
]),
|
||||
"softwareTab": new Set<string>(
|
||||
[
|
||||
"aggregator::datarepository",
|
||||
"aggregator::pubsrepository::institutional",
|
||||
"aggregator::pubsrepository::unknown",
|
||||
"aggregator::pubsrepository::journals",
|
||||
"crissystem",
|
||||
"datarepository::unknown",
|
||||
"infospace",
|
||||
"pubsrepository::institutional",
|
||||
"pubsrepository::journal",
|
||||
"pubsrepository::unknown",
|
||||
"scholarcomminfra",
|
||||
"pubsrepository::thematic",
|
||||
"pubscatalogue::unknown",
|
||||
"softwarerepository",
|
||||
"aggregator::softwarerepository",
|
||||
"orprepository"
|
||||
]),
|
||||
"orpsTab": new Set<string>(
|
||||
[
|
||||
"aggregator::datarepository",
|
||||
"aggregator::pubsrepository::institutional",
|
||||
"aggregator::pubsrepository::unknown",
|
||||
"aggregator::pubsrepository::journals",
|
||||
"crissystem",
|
||||
"datarepository::unknown",
|
||||
"infospace",
|
||||
"pubsrepository::institutional",
|
||||
"pubsrepository::journal",
|
||||
"pubsrepository::unknown",
|
||||
"scholarcomminfra",
|
||||
"pubsrepository::thematic",
|
||||
"pubscatalogue::unknown",
|
||||
"softwarerepository",
|
||||
"aggregator::softwarerepository",
|
||||
"orprepository"
|
||||
]),
|
||||
"metricsTab": new Set<string>(
|
||||
[ "aggregator::datarepository",
|
||||
"aggregator::pubsrepository::institutional",
|
||||
"aggregator::pubsrepository::unknown",
|
||||
"aggregator::pubsrepository::journals",
|
||||
"crissystem",
|
||||
"datarepository::unknown",
|
||||
"infospace",
|
||||
"pubsrepository::institutional",
|
||||
"pubsrepository::journal",
|
||||
"websource",
|
||||
"pubsrepository::unknown",
|
||||
"scholarcomminfra",
|
||||
"pubsrepository::thematic",
|
||||
"pubscatalogue::unknown",
|
||||
"softwarerepository",
|
||||
"aggregator::softwarerepository",
|
||||
"orprepository"
|
||||
])
|
||||
tabs: { "name": string, "content": string }[];
|
||||
tabs2: string[] = [];
|
||||
tabsInTypes = {
|
||||
"publicationsTab": new Set<string>(
|
||||
["aggregator::datarepository",
|
||||
"aggregator::pubsrepository::institutional",
|
||||
"aggregator::pubsrepository::unknown",
|
||||
"aggregator::pubsrepository::journals",
|
||||
"crissystem",
|
||||
"datarepository::unknown",
|
||||
"infospace",
|
||||
"pubsrepository::institutional",
|
||||
"pubsrepository::journal",
|
||||
"pubsrepository::unknown",
|
||||
"scholarcomminfra",
|
||||
"pubsrepository::thematic",
|
||||
"pubscatalogue::unknown",
|
||||
"orprepository"
|
||||
]),
|
||||
"datasetsTab": new Set<string>(
|
||||
["aggregator::datarepository",
|
||||
"aggregator::pubsrepository::institutional",
|
||||
"aggregator::pubsrepository::unknown",
|
||||
"aggregator::pubsrepository::journals",
|
||||
"crissystem",
|
||||
"datarepository::unknown",
|
||||
"infospace",
|
||||
"pubsrepository::institutional",
|
||||
"pubsrepository::journal",
|
||||
"pubsrepository::unknown",
|
||||
"scholarcomminfra",
|
||||
"pubsrepository::thematic",
|
||||
"pubscatalogue::unknown",
|
||||
"orprepository"
|
||||
]),
|
||||
"statisticsTab": new Set<string>(
|
||||
["aggregator::datarepository",
|
||||
"aggregator::pubsrepository::institutional",
|
||||
"aggregator::pubsrepository::unknown",
|
||||
"aggregator::pubsrepository::journals",
|
||||
"crissystem",
|
||||
"datarepository::unknown",
|
||||
"pubsrepository::institutional",
|
||||
"pubsrepository::journal",
|
||||
"pubsrepository::unknown",
|
||||
"pubsrepository::thematic",
|
||||
"pubscatalogue::unknown",
|
||||
"orprepository"
|
||||
]),
|
||||
// "organizationsTab": new Set<string>(
|
||||
// [ "entityregistry::projects",
|
||||
// "entityregistry::repositories"
|
||||
// ]),
|
||||
"projectsTab": new Set<string>(["entityregistry::projects"]),
|
||||
"datasourcesTab": new Set<string>(["entityregistry::repositories"]),
|
||||
"relatedDatasourcesTab": new Set<string>(
|
||||
["aggregator::pubsrepository::unknown",
|
||||
"aggregator::pubsrepository::journals",
|
||||
"aggregator::pubsrepository::institutional",
|
||||
"aggregator::datarepository"
|
||||
]),
|
||||
"softwareTab": new Set<string>(
|
||||
[
|
||||
"aggregator::datarepository",
|
||||
"aggregator::pubsrepository::institutional",
|
||||
"aggregator::pubsrepository::unknown",
|
||||
"aggregator::pubsrepository::journals",
|
||||
"crissystem",
|
||||
"datarepository::unknown",
|
||||
"infospace",
|
||||
"pubsrepository::institutional",
|
||||
"pubsrepository::journal",
|
||||
"pubsrepository::unknown",
|
||||
"scholarcomminfra",
|
||||
"pubsrepository::thematic",
|
||||
"pubscatalogue::unknown",
|
||||
"softwarerepository",
|
||||
"aggregator::softwarerepository",
|
||||
"orprepository"
|
||||
]),
|
||||
"orpsTab": new Set<string>(
|
||||
[
|
||||
"aggregator::datarepository",
|
||||
"aggregator::pubsrepository::institutional",
|
||||
"aggregator::pubsrepository::unknown",
|
||||
"aggregator::pubsrepository::journals",
|
||||
"crissystem",
|
||||
"datarepository::unknown",
|
||||
"infospace",
|
||||
"pubsrepository::institutional",
|
||||
"pubsrepository::journal",
|
||||
"pubsrepository::unknown",
|
||||
"scholarcomminfra",
|
||||
"pubsrepository::thematic",
|
||||
"pubscatalogue::unknown",
|
||||
"softwarerepository",
|
||||
"aggregator::softwarerepository",
|
||||
"orprepository"
|
||||
]),
|
||||
"metricsTab": new Set<string>(
|
||||
["aggregator::datarepository",
|
||||
"aggregator::pubsrepository::institutional",
|
||||
"aggregator::pubsrepository::unknown",
|
||||
"aggregator::pubsrepository::journals",
|
||||
"crissystem",
|
||||
"datarepository::unknown",
|
||||
"infospace",
|
||||
"pubsrepository::institutional",
|
||||
"pubsrepository::journal",
|
||||
"websource",
|
||||
"pubsrepository::unknown",
|
||||
"scholarcomminfra",
|
||||
"pubsrepository::thematic",
|
||||
"pubscatalogue::unknown",
|
||||
"softwarerepository",
|
||||
"aggregator::softwarerepository",
|
||||
"orprepository"
|
||||
])
|
||||
|
||||
};
|
||||
};
|
||||
|
||||
resultsBy: string;
|
||||
resultTypes = {
|
||||
"collectedFrom": new Set<string>(
|
||||
[ "aggregator::datarepository",
|
||||
"aggregator::pubsrepository::institutional",
|
||||
"aggregator::pubsrepository::unknown",
|
||||
"aggregator::pubsrepository::journals",
|
||||
"entityregistry::projects",
|
||||
"entityregistry::repositories",
|
||||
"infospace",
|
||||
"scholarcomminfra",
|
||||
"pubscatalogue::unknown",
|
||||
"aggregator::softwarerepository"
|
||||
]),
|
||||
"hostedBy": new Set<string>(
|
||||
[ "crissystem",
|
||||
"datarepository::unknown",
|
||||
"pubsrepository::institutional",
|
||||
"pubsrepository::journal",
|
||||
"pubsrepository::unknown",
|
||||
"pubsrepository::thematic",
|
||||
"softwarerepository",
|
||||
"orprepository"
|
||||
])
|
||||
};
|
||||
resultsBy: string;
|
||||
resultTypes = {
|
||||
"collectedFrom": new Set<string>(
|
||||
["aggregator::datarepository",
|
||||
"aggregator::pubsrepository::institutional",
|
||||
"aggregator::pubsrepository::unknown",
|
||||
"aggregator::pubsrepository::journals",
|
||||
"entityregistry::projects",
|
||||
"entityregistry::repositories",
|
||||
"infospace",
|
||||
"scholarcomminfra",
|
||||
"pubscatalogue::unknown",
|
||||
"aggregator::softwarerepository"
|
||||
]),
|
||||
"hostedBy": new Set<string>(
|
||||
["crissystem",
|
||||
"datarepository::unknown",
|
||||
"pubsrepository::institutional",
|
||||
"pubsrepository::journal",
|
||||
"pubsrepository::unknown",
|
||||
"pubsrepository::thematic",
|
||||
"softwarerepository",
|
||||
"orprepository"
|
||||
])
|
||||
};
|
||||
|
||||
organizations: {"acronym": string, "name": string, "id": string}[] = [];
|
||||
//publications: any;
|
||||
//datasets: any;
|
||||
statistics: any;
|
||||
//projects: any;
|
||||
datasources: any;
|
||||
organizations: { "acronym": string, "name": string, "id": string }[] = [];
|
||||
//publications: any;
|
||||
//datasets: any;
|
||||
statistics: any;
|
||||
//projects: any;
|
||||
datasources: any;
|
||||
|
||||
//relatedDatasources: Map<string, {"name": string, "countPublications": string, "countDatasets": string, "countSoftware": string, "countOrps": string}>;
|
||||
relatedDatasources: {"id": string, "name": string, "count": number}[] = [];
|
||||
//relatedDatasources: Map<string, {"name": string, "countPublications": string, "countDatasets": string, "countSoftware": string, "countOrps": string}>;
|
||||
relatedDatasources: { "id": string, "name": string, "count": number }[] = [];
|
||||
}
|
||||
|
|
|
@ -1,3 +1,5 @@
|
|||
import {BelongsTo} from "./resultLandingInfo";
|
||||
|
||||
export interface OrganizationProject {
|
||||
name: string;
|
||||
id: string;
|
||||
|
|
|
@ -1,4 +1,5 @@
|
|||
import {Measure} from "./resultLandingInfo";
|
||||
import {BelongsTo, Measure} from "./resultLandingInfo";
|
||||
import {StringUtils} from "../string-utils.class";
|
||||
|
||||
export class ProjectInfo {
|
||||
id:string;
|
||||
|
@ -23,4 +24,14 @@ export class ProjectInfo {
|
|||
totalDatasets: number;
|
||||
publicationsStatus: any;
|
||||
measure: Measure;
|
||||
belongsTo: boolean = true;
|
||||
message: string;
|
||||
|
||||
setBelongsTo(id: string) {
|
||||
this.belongsTo = !BelongsTo.project || BelongsTo.project.fields.findIndex(field => BelongsTo.check(this, field)) != -1;
|
||||
this.message = !this.belongsTo?BelongsTo.project.message:null;
|
||||
if(this.message) {
|
||||
this.message = this.message.replace('((id))', id);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -6,6 +6,9 @@ import {
|
|||
Project,
|
||||
RelationResult
|
||||
} from "../result-preview/result-preview";
|
||||
import {isArray} from "rxjs/internal-compatibility";
|
||||
import {OpenaireEntities} from "../properties/searchFields";
|
||||
import {StringUtils} from "../string-utils.class";
|
||||
|
||||
export interface Id {
|
||||
type: "pmid" | "doi" | "pmc" | "handle" | "openaire" | "swhid";
|
||||
|
@ -30,18 +33,6 @@ export interface Context {
|
|||
}
|
||||
|
||||
export interface Measure {
|
||||
// /** @deprecated*/
|
||||
// downloads?: string;
|
||||
// /** @deprecated*/
|
||||
// views?: string;
|
||||
// /** @deprecated*/
|
||||
// influence?: string;
|
||||
// /** @deprecated*/
|
||||
// popularity?: string;
|
||||
// /** @deprecated*/
|
||||
// citations?: string;
|
||||
// /** @deprecated*/
|
||||
// impulse?: string;
|
||||
bip?: Metric[]
|
||||
counts?: Metric[]
|
||||
countsPerDatasource?: MetricPerDatasource[];
|
||||
|
@ -61,12 +52,46 @@ export interface Metric {
|
|||
value: any
|
||||
}
|
||||
|
||||
class Field {
|
||||
path: string[];
|
||||
value: string;
|
||||
}
|
||||
|
||||
export class BelongsTo {
|
||||
public static result: BelongsTo = null;
|
||||
public static project: BelongsTo = null;
|
||||
public static organization: BelongsTo = null;
|
||||
public static datasource: BelongsTo = null;
|
||||
|
||||
fields: Field[];
|
||||
message: string;
|
||||
|
||||
public static check(element: any, field: Field): boolean {
|
||||
if (field) {
|
||||
field = Object.assign({}, field);
|
||||
let json: any = element;
|
||||
if (field.path.length > 0) {
|
||||
if (Array.isArray(json)) {
|
||||
return json.findIndex(value => BelongsTo.check(value, field)) != -1;
|
||||
} else {
|
||||
json = json[field.path[0]];
|
||||
field.path = field.path.slice(1);
|
||||
return BelongsTo.check(json, field);
|
||||
}
|
||||
}
|
||||
console.log(json, field.value)
|
||||
return json == field.value;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
export class ResultLandingInfo {
|
||||
relcanId;
|
||||
objIdentifier: string;
|
||||
// PUBLICATION, DATASET, SOFTWARE, ORP
|
||||
record;
|
||||
resultType: "publication"|"dataset"|"other"|"software";
|
||||
resultType: "publication" | "dataset" | "other" | "software";
|
||||
// PUBLICATION, DATASET, SOFTWARE, ORP, DELETED_BY_INFERENCE
|
||||
title: string;
|
||||
accessMode: string;
|
||||
|
@ -79,26 +104,26 @@ export class ResultLandingInfo {
|
|||
languages: string[];
|
||||
countries: string[];
|
||||
description: string;
|
||||
|
||||
|
||||
hostedBy_collectedFrom: HostedByCollectedFrom[];
|
||||
|
||||
|
||||
// PUBLICATION, DATASET, SOFTWARE, ORP
|
||||
fundedByProjects: Project[];
|
||||
|
||||
|
||||
underCurationMessage: boolean;
|
||||
publisher: string;
|
||||
journal: Journal;
|
||||
|
||||
|
||||
subjects: string[];
|
||||
otherSubjects: Map<string, string[]>;
|
||||
classifiedSubjects: Map<string, string[]>; //<class of subject, subjects>
|
||||
fos: {"id": string, "label": string}[] = [];
|
||||
fos: { "id": string, "label": string }[] = [];
|
||||
sdg: string[];
|
||||
eoscSubjects: any[];
|
||||
|
||||
oaRoutes: OARoutes;
|
||||
publiclyFunded: boolean;
|
||||
|
||||
|
||||
// // percentage is for trust
|
||||
// relatedResearchResults: RelationResult[];
|
||||
// // percentage is for similarity
|
||||
|
@ -159,22 +184,35 @@ export class ResultLandingInfo {
|
|||
relatedClassFilters: Set<string> = new Set();
|
||||
|
||||
contexts: Context[];
|
||||
|
||||
|
||||
deletedByInferenceIds: string[];
|
||||
|
||||
|
||||
// PUBLICATION, DATASET, ORP
|
||||
references: Reference[];
|
||||
|
||||
|
||||
// PUBLICATION
|
||||
bioentities: Map<string, Map<string, string>>; //<site name, <>>
|
||||
organizations: Organization[];
|
||||
openCitations: { "url": string, "title": string, "year": string, "doi": string, "authors": string[] }[];
|
||||
|
||||
|
||||
// DATASET
|
||||
subtitle: string;
|
||||
|
||||
|
||||
// SOFTWARE
|
||||
programmingLanguages: string[];
|
||||
|
||||
measure: Measure;
|
||||
measure: Measure;
|
||||
|
||||
belongsTo: boolean = true;
|
||||
message: string;
|
||||
|
||||
setBelongsTo(typeId: string, id: string) {
|
||||
this.belongsTo = !BelongsTo.result || BelongsTo.result.fields.findIndex(field => BelongsTo.check(this, field)) != -1;
|
||||
this.message = !this.belongsTo ? BelongsTo.result.message : null;
|
||||
if (this.message) {
|
||||
this.message = this.message.replace('((result))', StringUtils.getEntityName(this.resultType));
|
||||
this.message = this.message.replace('((type_id))', typeId);
|
||||
this.message = this.message.replace('((id))', id);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -148,7 +148,7 @@ private fetch (link,id,oafEntityType,type, properties:EnvProperties ){
|
|||
if(keyword!= null && keyword != '' ) {
|
||||
if(type=="project") {
|
||||
//name, title, acronym, grantid
|
||||
url += "fq="+'(projectcode_nt="'+keyword+'" ) or (fundershortname='+'"'+keyword+ '"'+') or (projectacronym="'+keyword+'" ) or (projecttitle="'+keyword+'")';
|
||||
url += "fq="+'(projectcode_nt="'+keyword+'" ) or (fundershortname='+'"'+keyword+ '"'+') or (projectacronym="'+keyword+'" ) or (projecttitle="'+keyword+'")&fq=(projectcode<>"unidentified")';
|
||||
} else if(type=="organization") {
|
||||
//name fields
|
||||
url += "fq="+'(organizationlegalname="'+keyword+'" ) or (organizationlegalshortname='+'"'+keyword+ '")';
|
||||
|
|
|
@ -161,3 +161,8 @@ export const unknown_access: Icon = {
|
|||
name: 'unknown_access',
|
||||
data: '<svg xmlns="http://www.w3.org/2000/svg" width="373.336" height="490.004" viewBox="0 0 373.336 490.004"><g id="noun-lock-question-mark-250128" transform="translate(-163.328 -34.992)"><path id="Path_119172" data-name="Path 119172" d="M490,198.33H466.668V151.662a116.67,116.67,0,0,0-233.34,0V198.33H210A46.8,46.8,0,0,0,163.328,245v233.33A46.8,46.8,0,0,0,210,525H490a46.8,46.8,0,0,0,46.668-46.668V245A46.8,46.8,0,0,0,490,198.33ZM365.55,469.78H334.441V438.671H365.55ZM397.441,350l-14,14c-10.891,11.668-17.891,20.223-17.891,43.555H334.441v-7.777a61.712,61.712,0,0,1,17.891-43.555l19.445-19.445A30.98,30.98,0,1,0,318.891,315H287.782a62.223,62.223,0,0,1,124.446,0,49.983,49.983,0,0,1-14.785,35Zm24.887-151.67H277.668V151.662c0-39.668,32.668-72.332,72.332-72.332S422.332,112,422.332,151.662Z"/></g></svg>'
|
||||
}
|
||||
|
||||
export const coins: Icon = {
|
||||
name: 'coins',
|
||||
data: '<?xml version="1.0" encoding="UTF-8"?><svg id="Layer_2" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 315.47 315.47"><g id="Layer_1-2"><g><g><ellipse class="" cx="116.85" cy="98.6" rx="63.94" ry="37.92"/><ellipse class="" cx="199.59" cy="167.66" rx="63.94" ry="37.92"/><path class="cls-3" d="M260.39,185.84c1.25-1.88,2.51-3.76,3.13-5.95-.31,13.48,1.25,14.42-.94,21.63-5.01,17.24-38.86,29.77-64.25,29.15-21.63-.31-39.18-2.82-54.85-15.98-4.39-3.76-9.4-7.52-9.72-12.85,0-10.03,0-11.6,.31-23.82,10.34,38.86,102.8,41.37,126.31,7.84Z"/><path class="cls-3" d="M262.58,209.66c.94,8.78-1.57,13.79-1.88,20.06-.94,14.73-35.1,24.76-61.43,25.07-31.34,.31-63.62-12.22-64.25-24.76-.63-11.28,0-5.33-.94-20.06,21.31,32.28,105.31,31.97,128.5-.31Z"/><path class="cls-3" d="M116.85,140.71c38.55,.31,57.67-17.86,61.74-25.07,1.88-3.45-.31,12.85-.94,13.16-14.1,4.07-31.03,10.03-40.43,21.94-2.82,3.45-3.76,7.52-5.01,12.54,0,.31-13.48-.31-14.42-.31-28.21,0-61.12-13.48-65.82-35.73-.63-4.39,0-8.15,0-17.55,10.03,19.75,36.67,30.71,64.88,31.03Z"/><path class="cls-3" d="M116.85,166.72c5.01,.31,15.04,0,15.04,0-.94,8.78-.63,12.85-1.25,23.19,0,.31-71.15,3.76-78.67-33.85-.63-4.07,0-7.84,0-17.55,15.67,21.31,42.94,27.27,64.88,28.21Z"/><path class="cls-3" d="M130.01,194.3s.94,12.54,.63,21.94c0,.31-68.95,1.88-78.04-27.58l-.63-21.31c16.92,23.51,52.65,27.58,78.04,26.95Z"/></g></g></g></svg>'
|
||||
}
|
||||
|
|
|
@ -77,7 +77,8 @@
|
|||
</div>
|
||||
<!-- Metadata -->
|
||||
<div class="uk-margin-xsmall-top">
|
||||
<entity-metadata [entityType]="type" [types]="result.types" [startYear]="result.startYear?.toString()"
|
||||
<entity-metadata [resultTitle]="result?.title"
|
||||
[entityType]="type" [types]="result.types" [startYear]="result.startYear?.toString()"
|
||||
[endYear]="result.endYear?.toString()"
|
||||
[year]="result.year?.toString()"
|
||||
[openAccessMandatePublications]="result.openAccessMandatePublications"
|
||||
|
|
|
@ -43,6 +43,7 @@ export interface Project {
|
|||
title: string;
|
||||
funderShortname: string;
|
||||
funderName: string;
|
||||
funderJurisdiction?: string
|
||||
funding?: string;
|
||||
code: string;
|
||||
validated?: boolean;
|
||||
|
|
Loading…
Reference in New Issue