Compare commits
100 Commits
production
...
master
@ -1 +1 @@
|
||||
Subproject commit acdba43c8bc8244f59e32e450f0dd106bb397037
|
||||
Subproject commit e30672043b03c607fb6c6c1c490d4fa34a772d3d
|
@ -0,0 +1,120 @@
|
||||
import {ChangeDetectorRef, Component, OnDestroy, OnInit, ViewChild} from "@angular/core";
|
||||
import {CommunityService} from "../../openaireLibrary/connect/community/community.service";
|
||||
import {AdvancedCriteriaService} from "./advanced-criteria.service";
|
||||
import {Subscription} from "rxjs";
|
||||
import {SelectionCriteria} from "../../openaireLibrary/utils/entities/contentProvider";
|
||||
import {
|
||||
FullScreenModalComponent
|
||||
} from "../../openaireLibrary/utils/modal/full-screen-modal/full-screen-modal.component";
|
||||
import {NotificationHandler} from "../../openaireLibrary/utils/notification-handler";
|
||||
import {CriteriaComponent} from "../content-providers/criteria/criteria.component";
|
||||
import {CriteriaUtils} from "../content-providers/criteria-utils";
|
||||
import {CommunityInfo} from "../../openaireLibrary/connect/community/communityInfo";
|
||||
|
||||
@Component({
|
||||
selector: 'advanced-criteria',
|
||||
template: `
|
||||
<div page-content>
|
||||
<div *ngIf="selectionCriteria" actions>
|
||||
<div class="uk-section-xsmall uk-margin-top">
|
||||
<div class="uk-flex uk-flex-right@m uk-flex-center">
|
||||
<button *ngIf="selectionCriteria.criteria.length === 0" (click)="openCriteria()" class="uk-button uk-button-default uk-flex uk-flex-middle">
|
||||
<icon name="add" [flex]="true"></icon>
|
||||
<span class="uk-margin-small-left">Add Criteria</span>
|
||||
</button>
|
||||
<button *ngIf="selectionCriteria.criteria.length > 0" (click)="openCriteria()" class="uk-button uk-button-default uk-flex uk-flex-middle">
|
||||
<icon name="edit" [flex]="true"></icon>
|
||||
<span class="uk-margin-small-left">Edit Criteria</span>
|
||||
</button>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div inner>
|
||||
<div *ngIf="loading" class="uk-position-center">
|
||||
<loading></loading>
|
||||
</div>
|
||||
<div *ngIf="!loading">
|
||||
<div *ngIf="selectionCriteria?.criteria?.length > 0" class="uk-margin-small-bottom">
|
||||
<div class="uk-text-meta uk-margin-small-bottom">Criteria</div>
|
||||
<div [innerHTML]="criteriaUtils.getFiltersAsText(selectionCriteria.criteria)"></div>
|
||||
</div>
|
||||
<div *ngIf="selectionCriteria?.criteria?.length === 0" class="message">
|
||||
<h5 class="uk-margin-small-bottom">No criteria yet</h5>
|
||||
<i class="uk-display-block">
|
||||
Add multiple constraints in AND to define a criterion: results that satisfy at least one of the criteria will be included in your community.
|
||||
</i>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<fs-modal #filtersModal (okEmitter)="saveCriteria()" (cancelEmitter)="criteria.reset()"
|
||||
[okButtonDisabled]="!criteria || criteria.disabled">
|
||||
<div *ngIf="selectionCriteria" class="uk-container uk-container-large">
|
||||
<criteria #criteria [height]="filtersModal.bodyHeight" [entityType]="'criterion'"
|
||||
[entityTypePlural]="'criteria'" [selectionCriteria]="selectionCriteria">
|
||||
<div no-criteria>
|
||||
<h5 class="uk-margin-small-bottom">No Criteria yet</h5>
|
||||
<i class="uk-display-block">
|
||||
Add multiple constraints in AND to define a criterion: results that satisfy at least one of the criteria will be included in your community.
|
||||
</i>
|
||||
</div>
|
||||
</criteria>
|
||||
</div>
|
||||
</fs-modal>
|
||||
`
|
||||
})
|
||||
export class AdvancedCriteriaComponent implements OnInit, OnDestroy {
|
||||
public loading = true;
|
||||
public selectionCriteria: SelectionCriteria;
|
||||
public community: CommunityInfo;
|
||||
public criteriaUtils: CriteriaUtils = new CriteriaUtils();
|
||||
private subscriptions: any[] = [];
|
||||
@ViewChild('criteria') criteria: CriteriaComponent;
|
||||
@ViewChild('filtersModal', { static: true }) filtersModal: FullScreenModalComponent;
|
||||
|
||||
constructor(private communityService: CommunityService,
|
||||
private cdr: ChangeDetectorRef,
|
||||
private advancedCriteriaService: AdvancedCriteriaService) {}
|
||||
|
||||
ngOnInit() {
|
||||
this.loading = true;
|
||||
this.subscriptions.push(this.communityService.getCommunityAsObservable().subscribe(community => {
|
||||
this.community = community;
|
||||
this.selectionCriteria = community.selectionCriteria;
|
||||
this.loading = false;
|
||||
}));
|
||||
}
|
||||
|
||||
saveCriteria() {
|
||||
let callback = (selectionCriteria): void => {
|
||||
this.advancedCriteriaService.saveAdvancedCriteria(this.community.communityId, selectionCriteria).subscribe(() => {
|
||||
this.criteria.reset();
|
||||
this.criteria.loading = false;
|
||||
NotificationHandler.rise('Filters have been <b>successfully updated</b>');
|
||||
}, error => {
|
||||
this.criteria.loading = false;
|
||||
this.criteria.handeError('An error has been occurred. Try again later!', error);
|
||||
});
|
||||
}
|
||||
this.loading = true;
|
||||
this.criteria.save(callback);
|
||||
}
|
||||
|
||||
public openCriteria() {
|
||||
this.criteria.reset();
|
||||
this.filtersModal.title = 'Criteria';
|
||||
this.filtersModal.okButtonText = "Save";
|
||||
this.filtersModal.back = true;
|
||||
this.filtersModal.okButton = true;
|
||||
this.filtersModal.open();
|
||||
this.cdr.detectChanges();
|
||||
}
|
||||
|
||||
ngOnDestroy() {
|
||||
this.subscriptions.forEach(subscription => {
|
||||
if(subscription instanceof Subscription) {
|
||||
subscription.unsubscribe();
|
||||
}
|
||||
})
|
||||
}
|
||||
}
|
@ -0,0 +1,18 @@
|
||||
import {NgModule} from "@angular/core";
|
||||
import {CommonModule} from "@angular/common";
|
||||
import {RouterModule} from "@angular/router";
|
||||
import {AdvancedCriteriaComponent} from "./advanced-criteria.component";
|
||||
import {PageContentModule} from "../../openaireLibrary/dashboard/sharedComponents/page-content/page-content.module";
|
||||
import {FullScreenModalModule} from "../../openaireLibrary/utils/modal/full-screen-modal/full-screen-modal.module";
|
||||
import {CriteriaModule} from "../content-providers/criteria/criteria.module";
|
||||
import {IconsModule} from "../../openaireLibrary/utils/icons/icons.module";
|
||||
import {LoadingModule} from "../../openaireLibrary/utils/loading/loading.module";
|
||||
|
||||
@NgModule({
|
||||
imports: [CommonModule, RouterModule.forChild([
|
||||
{path: '', component: AdvancedCriteriaComponent,}
|
||||
]), PageContentModule, FullScreenModalModule, CriteriaModule, IconsModule, LoadingModule],
|
||||
declarations: [AdvancedCriteriaComponent],
|
||||
exports: [AdvancedCriteriaComponent]
|
||||
})
|
||||
export class AdvancedCriteriaModule {}
|
@ -0,0 +1,25 @@
|
||||
import {Injectable} from "@angular/core";
|
||||
import {SelectionCriteria} from "../../openaireLibrary/utils/entities/contentProvider";
|
||||
import {Observable} from "rxjs";
|
||||
import {CommunityInfo} from "../../openaireLibrary/connect/community/communityInfo";
|
||||
import {HttpClient} from "@angular/common/http";
|
||||
import {properties} from "../../../environments/environment";
|
||||
import {map} from "rxjs/operators";
|
||||
import {CommunityService} from "../../openaireLibrary/connect/community/community.service";
|
||||
|
||||
@Injectable({
|
||||
providedIn: 'root'
|
||||
})
|
||||
export class AdvancedCriteriaService {
|
||||
|
||||
constructor(private httpClient: HttpClient,
|
||||
private communityService: CommunityService) {
|
||||
}
|
||||
|
||||
public saveAdvancedCriteria(communityId, selectionCriteria: SelectionCriteria): Observable<void> {
|
||||
return this.httpClient.post(properties.communityAPI + communityId + '/advancedConstraint', selectionCriteria).pipe(map(community => {
|
||||
this.communityService.updateAdvancedCriteria(this.communityService.parseCommunity(community).selectionCriteria);
|
||||
}));
|
||||
}
|
||||
|
||||
}
|
@ -1,42 +0,0 @@
|
||||
import {Component, Input, OnInit} from '@angular/core';
|
||||
import {CommunityInfo} from '../../openaireLibrary/connect/community/communityInfo';
|
||||
import {CommunityService} from '../../openaireLibrary/connect/community/community.service';
|
||||
import {Subscription} from 'rxjs';
|
||||
import {OpenaireEntities} from "../../openaireLibrary/utils/properties/searchFields";
|
||||
|
||||
@Component({
|
||||
selector: 'community-info',
|
||||
template: `
|
||||
<ul *ngIf="community" class="uk-tab uk-margin-remove-bottom uk-margin-medium-top uk-flex uk-flex-center uk-flex-left@m" uk-tab>
|
||||
<li [class.uk-active]="tab === 'profile'"><a routerLink="../profile">Profile</a></li>
|
||||
<li [class.uk-active]="tab === 'organizations'"><a routerLink="../organizations">Organizations</a></li>
|
||||
<li [class.uk-active]="tab === 'projects'"><a routerLink="../projects">{{openAIREEntities.PROJECTS}}</a></li>
|
||||
<li [class.uk-active]="tab === 'content-providers'"><a routerLink="../content-providers">{{openAIREEntities.DATASOURCES}}</a></li>
|
||||
<li *ngIf="community.type !='ri'" [class.uk-active]="tab === 'subjects'"><a routerLink="../subjects">Subjects</a></li>
|
||||
<li [class.uk-active]="tab === 'zenodo-communities'"><a routerLink="../zenodo-communities">Zenodo Communities</a></li>
|
||||
</ul>
|
||||
`
|
||||
})
|
||||
export class CommunityInfoComponent implements OnInit {
|
||||
@Input()
|
||||
public type: string;
|
||||
@Input()
|
||||
public tab: "profile"| "organizations" | "projects" | "content-providers" | "subjects" | "zenodo-communities" = 'profile';
|
||||
public community: CommunityInfo;
|
||||
public openAIREEntities = OpenaireEntities;
|
||||
private sub;
|
||||
|
||||
constructor(private communityService: CommunityService) {
|
||||
}
|
||||
|
||||
ngOnInit() {
|
||||
this.sub =this.communityService.getCommunityAsObservable().subscribe(community => {
|
||||
this.community = community;
|
||||
});
|
||||
}
|
||||
ngOnDestroy() {
|
||||
if (this.sub instanceof Subscription) {
|
||||
this.sub.unsubscribe();
|
||||
}
|
||||
}
|
||||
}
|
@ -1,14 +0,0 @@
|
||||
import {NgModule} from '@angular/core';
|
||||
import {RouterModule} from "@angular/router";
|
||||
import {CommonModule} from "@angular/common";
|
||||
import {CommunityInfoComponent} from "./community-info.component";
|
||||
|
||||
@NgModule({
|
||||
imports: [
|
||||
CommonModule, RouterModule
|
||||
],
|
||||
declarations: [CommunityInfoComponent],
|
||||
exports: [CommunityInfoComponent]
|
||||
})
|
||||
export class CommunityInfoModule {
|
||||
}
|
@ -1,18 +1,44 @@
|
||||
import {Option} from "../../openaireLibrary/sharedComponents/input/input.component";
|
||||
import {Criteria} from "../../openaireLibrary/utils/entities/contentProvider";
|
||||
|
||||
export class CriteriaUtils {
|
||||
public static readonly fields: Option[] = [
|
||||
{value: 'title', label: 'Title'},
|
||||
public readonly fields: Option[] = [
|
||||
{value: 'author', label: 'Author\'s name'},
|
||||
{value: 'title', label: 'Title'},
|
||||
{value: 'orcid', label: 'Author\'s ORCID'},
|
||||
{value: 'contributor', label: 'Contributor'},
|
||||
{value: 'description', label: 'Description'}
|
||||
{value: 'description', label: 'Description'},
|
||||
{value: 'subject', label: 'Subject'},
|
||||
{value: 'fos', label: 'Field of Science'},
|
||||
{value: 'sdg', label: 'SDG'},
|
||||
{value: 'publisher', label: 'Publisher'},
|
||||
{value: 'publicationyear', label: 'Publication Year'}
|
||||
]
|
||||
|
||||
public static readonly verbs: Option[] = [
|
||||
public readonly numericFields: string[] = ['publicationyear'];
|
||||
public readonly verbs: Option[] = [
|
||||
{value: 'contains', label: 'contains'},
|
||||
{value: 'equals', label: 'equals'},
|
||||
{value: 'not_contains', label: 'not contains'},
|
||||
{value: 'not_equals', label: 'not equals'}
|
||||
{value: 'not_equals', label: 'not equals'},
|
||||
{value: 'starts_with', label: 'starts with'}
|
||||
]
|
||||
public readonly verbsForNumbers: Option[] = [
|
||||
{value: 'equals', label: 'equals'},
|
||||
{value: 'lesser_than', label: 'lesser than'},
|
||||
{value: 'greater_than', label: 'greater than'}
|
||||
]
|
||||
|
||||
public getFiltersAsText(criteria: Criteria[]): string {
|
||||
let text = criteria.slice(0, 3).map((criterion, index) => (index + 1) + ". " + criterion.constraint.map(constraint => {
|
||||
let field = this.fields.find(field => field.value === constraint.field)?.label;
|
||||
let matchCase = false;
|
||||
if (!constraint.verb.includes('_caseinsensitive')) {
|
||||
matchCase = true;
|
||||
}
|
||||
let verb = [...this.verbs,...this.verbsForNumbers].find(verb => verb.value === constraint.verb.replace("_caseinsensitive", "")).label;
|
||||
let value = '"' + constraint.value + '"' + (matchCase ? " (Match case)" : "");
|
||||
return field + " " + verb + " " + value;
|
||||
}).join(" <b>and</b> "));
|
||||
return text.join("<br>");
|
||||
}
|
||||
}
|
||||
|
@ -1,120 +1,121 @@
|
||||
<div class="uk-section uk-position-relative" style="min-height: 60vh">
|
||||
<div class="uk-position-relative" style="min-height: 60vh">
|
||||
<div *ngIf="loading" class="uk-position-center">
|
||||
<loading></loading>
|
||||
</div>
|
||||
<ng-container *ngIf="!loading">
|
||||
<div class="uk-flex uk-flex-center uk-margin-medium-bottom">
|
||||
<a (click)="addCriteria()" class="uk-flex uk-flex-middle uk-button uk-button-primary"
|
||||
uk-tooltip="<div>Add filter to limit research results.<br>Results which satisfy any of the selected filters will be included in your community.</div>">
|
||||
<icon name="add" [flex]="true"></icon>
|
||||
<span class="uk-margin-small-left">Add filter</span>
|
||||
</a>
|
||||
</div>
|
||||
<div *ngIf="criteria.length == 0" class="uk-card uk-card-default uk-padding-large uk-text-center uk-margin-bottom uk-text-bold">
|
||||
<div *ngIf="dataProvider">No filters for {{dataProvider.officialname}}.</div>
|
||||
<div>If no filters are specified, all {{openaireEntities.RESULTS | lowercase}} of this {{openaireEntities.DATASOURCE | lowercase}} will be included in your
|
||||
{{openaireEntities.COMMUNITY | lowercase}}.
|
||||
<div class="criteria uk-overflow-auto uk-position-relative" [ngStyle]="{'height.px': criteriaHeight?criteriaHeight:null}">
|
||||
<div *ngIf="criteria.length == 0" class="uk-text-center uk-position-center">
|
||||
<ng-content select="[no-criteria]"></ng-content>
|
||||
</div>
|
||||
</div>
|
||||
<form *ngIf="criteria.length > 0" [formGroup]="selectionCriteria">
|
||||
<div formArrayName="criteria" class="uk-margin-bottom">
|
||||
<no-load-paging (pageChange)="updatePage($event)" [page]="page" [totalResults]="criteria.length"
|
||||
[pageSize]="pageSize" [type]="'filter' + (criteria.length > 1?'s':'')">
|
||||
</no-load-paging>
|
||||
<ul class="uk-list uk-list-xlarge uk-margin-top uk-margin-bottom">
|
||||
<li *ngFor="let criterion of currentPage; let i=index">
|
||||
<div [formGroupName]="getIndex(i).toString()" class="uk-flex">
|
||||
<h3 class="uk-padding uk-margin-remove-bottom uk-margin-top">
|
||||
{{getIndex(i) + 1}}
|
||||
</h3>
|
||||
<div class="uk-width-expand uk-padding-small criterion" formArrayName="constraint">
|
||||
<div class="uk-flex-middle uk-grid uk-margin-small-bottom uk-visible@l" uk-grid>
|
||||
<div class="uk-width-1-4">
|
||||
<label class="uk-text-uppercase uk-text-bold">Field</label>
|
||||
</div>
|
||||
<div class="uk-width-1-4">
|
||||
<label class="uk-text-uppercase uk-text-bold">Operator</label>
|
||||
</div>
|
||||
<div class="uk-width-1-4">
|
||||
<label class="uk-text-uppercase uk-text-bold">Term</label>
|
||||
</div>
|
||||
<div class="uk-width-expand uk-text-truncate">
|
||||
<label class="uk-text-bold uk-text-uppercase">Match Case</label>
|
||||
</div>
|
||||
</div>
|
||||
<div *ngFor="let constraint of getConstraint(getIndex(i)).controls; let j=index" [formGroupName]="j.toString()"
|
||||
class="uk-margin-bottom uk-hidden@l">
|
||||
<div class="uk-flex-middle uk-grid-small uk-margin-medium-bottom" uk-grid>
|
||||
<div class="uk-flex uk-flex-right uk-width-1-1">
|
||||
<button class="uk-close uk-icon" (click)="removeConstraint(getIndex(i), j)">
|
||||
<icon name="close" ratio="1.5" [flex]="true"
|
||||
[attr.uk-tooltip]="(getConstraint(getIndex(i)).length === 1?'By removing this constraint, the filter will be removed too':null)"></icon>
|
||||
</button>
|
||||
<form *ngIf="criteria.length > 0" [formGroup]="selectionCriteriaForm">
|
||||
<div formArrayName="criteria" class="uk-margin-bottom">
|
||||
<ul class="uk-list uk-list-xlarge uk-margin-top uk-margin-bottom">
|
||||
<li *ngFor="let criterion of criteria.controls; let i=index">
|
||||
<div [id]="'criterion-' + i.toString()" [formGroupName]="i.toString()" class="uk-flex">
|
||||
<h3 class="uk-padding uk-margin-remove-bottom uk-margin-top">
|
||||
{{i + 1}}
|
||||
</h3>
|
||||
<div class="uk-width-expand uk-padding-small uk-border uk-border-rounded" formArrayName="constraint">
|
||||
<div class="uk-flex-middle uk-grid uk-margin-small-bottom uk-visible@l" uk-grid>
|
||||
<div class="uk-width-1-4">
|
||||
<label class="uk-text-uppercase uk-text-bold">Field</label>
|
||||
</div>
|
||||
<div class="uk-width-1-1" input type="select" inputClass="border-bottom" [placeholder]="{static: true, label: 'Choose a field'}"
|
||||
[options]="fields" [formInput]="constraint.get('field')">
|
||||
<label class="uk-text-uppercase uk-text-bold uk-width-1-3 uk-text-truncate">Field:</label>
|
||||
<div class="uk-width-1-4">
|
||||
<label class="uk-text-uppercase uk-text-bold">Operator</label>
|
||||
</div>
|
||||
<div class="uk-width-1-1" input type="select" inputClass="border-bottom"
|
||||
[options]="verbs" [formInput]="constraint.get('verb')">
|
||||
<label class="uk-text-uppercase uk-text-bold uk-width-1-3 uk-text-truncate">Operator:</label>
|
||||
<div class="uk-width-1-4">
|
||||
<label class="uk-text-uppercase uk-text-bold">Term</label>
|
||||
</div>
|
||||
<div class="uk-width-1-1" input [placeholder]="{static: true, label: 'Type a keyword'}"
|
||||
[formInput]="constraint.get('value')">
|
||||
<label class="uk-text-uppercase uk-text-bold uk-width-1-3 uk-text-truncate">Term:</label>
|
||||
<div class="uk-width-expand uk-text-truncate">
|
||||
<label class="uk-text-bold uk-text-uppercase">Match Case</label>
|
||||
</div>
|
||||
<div class="uk-width-1-1">
|
||||
<div class="uk-grid" uk-grid>
|
||||
<label class="uk-text-uppercase uk-text-bold uk-width-1-3 uk-text-truncate">Match Case</label>
|
||||
<div class="uk-width-expand">
|
||||
<mat-slide-toggle [checked]="constraint.get('verb_suffix').value === ''"
|
||||
[attr.uk-tooltip]="(constraint.get('verb_suffix').value === ''?('Only \'\'' + constraint.get('value').value + '\'\' matches'):
|
||||
</div>
|
||||
<div *ngFor="let constraint of getConstraint(i).controls; let j=index" [formGroupName]="j.toString()"
|
||||
class="uk-margin-bottom uk-hidden@l">
|
||||
<div class="uk-flex-middle uk-grid-small uk-margin-medium-bottom" uk-grid>
|
||||
<div class="uk-flex uk-flex-right uk-width-1-1">
|
||||
<button class="uk-close uk-icon" (click)="removeConstraint(i, j)">
|
||||
<icon name="close" ratio="1.5" [flex]="true"
|
||||
[attr.uk-tooltip]="(getConstraint(i).length === 1?'By removing this constraint, the ' + entityType + ' will be removed too':null)"></icon>
|
||||
</button>
|
||||
</div>
|
||||
<div class="uk-width-1-1" input type="select" inputClass="border-bottom" [placeholder]="{static: true, label: 'Choose a field'}"
|
||||
[options]="criteriaUtils.fields" [formInput]="constraint.get('field')" (valueChange)="resetFieldWhenValueChange(constraint)">
|
||||
<label class="uk-text-uppercase uk-text-bold uk-width-1-3 uk-text-truncate">Field:</label>
|
||||
</div>
|
||||
<div *ngIf="criteriaUtils.numericFields.indexOf(constraint.get('field').value) == -1" class="uk-width-1-1" input type="select" inputClass="border-bottom"
|
||||
[options]="criteriaUtils.verbs" [formInput]="constraint.get('verb')">
|
||||
<label class="uk-text-uppercase uk-text-bold uk-width-1-3 uk-text-truncate">Operator:</label>
|
||||
</div>
|
||||
<div *ngIf="criteriaUtils.numericFields.indexOf(constraint.get('field').value) != -1" class="uk-width-1-1" input type="select" inputClass="border-bottom"
|
||||
[options]="criteriaUtils.verbsForNumbers" [formInput]="constraint.get('verb')">
|
||||
<label class="uk-text-uppercase uk-text-bold uk-width-1-3 uk-text-truncate">Operator:</label>
|
||||
</div>
|
||||
<div class="uk-width-1-1" input [placeholder]="{static: true, label: 'Type a keyword'}"
|
||||
[formInput]="constraint.get('value')">
|
||||
<label class="uk-text-uppercase uk-text-bold uk-width-1-3 uk-text-truncate">Term:</label>
|
||||
</div>
|
||||
<div class="uk-width-1-1">
|
||||
<div class="uk-grid" uk-grid>
|
||||
<label class="uk-text-uppercase uk-text-bold uk-width-1-3 uk-text-truncate">Match Case</label>
|
||||
<div class="uk-width-expand">
|
||||
<mat-slide-toggle [checked]="constraint.get('verb_suffix').value === ''"
|
||||
[attr.uk-tooltip]="(constraint.get('verb_suffix').value === ''?('Only \'\'' + constraint.get('value').value + '\'\' matches'):
|
||||
('Both \'\'' + constraint.get('value').value.toUpperCase() + '\'\' and \'\'' + constraint.get('value').value.toLowerCase() + '\'\' match'))"
|
||||
(change)="caseSensitive($event, constraint)"></mat-slide-toggle>
|
||||
(change)="caseSensitive($event, constraint)"></mat-slide-toggle>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div *ngFor="let constraint of getConstraint(getIndex(i)).controls; let j=index"
|
||||
[formGroupName]="j.toString()" class="uk-margin-bottom uk-visible@l">
|
||||
<div class="uk-flex uk-flex-middle uk-grid" uk-grid>
|
||||
<div class="uk-width-1-4" input type="select" inputClass="border-bottom" [placeholder]="{static: true, label: 'Choose a field'}"
|
||||
[options]="fields" [formInput]="constraint.get('field')"></div>
|
||||
<div class="uk-width-1-4" input type="select" inputClass="border-bottom"
|
||||
[options]="verbs" [formInput]="constraint.get('verb')"></div>
|
||||
<div class="uk-width-1-4" input [placeholder]="{static: true, label: 'Type a keyword'}"
|
||||
[formInput]="constraint.get('value')"></div>
|
||||
<div class="uk-width-expand">
|
||||
<mat-slide-toggle [checked]="constraint.get('verb_suffix').value === ''" class="uk-margin-left"
|
||||
[attr.uk-tooltip]="(constraint.get('verb_suffix').value === ''?('Only \'\'' + constraint.get('value').value + '\'\' matches'):
|
||||
<div *ngFor="let constraint of getConstraint(i).controls; let j=index"
|
||||
[formGroupName]="j.toString()" class="uk-margin-bottom uk-visible@l">
|
||||
<div class="uk-flex uk-flex-middle uk-grid" uk-grid>
|
||||
<div class="uk-width-1-4" input type="select" inputClass="border-bottom" [placeholder]="{static: true, label: 'Choose a field'}"
|
||||
[options]="criteriaUtils.fields" [formInput]="constraint.get('field')"></div>
|
||||
<div *ngIf="criteriaUtils.numericFields.indexOf(constraint.get('field').value) == -1" class="uk-width-1-4" input type="select" inputClass="border-bottom"
|
||||
[options]="criteriaUtils.verbs" [formInput]="constraint.get('verb')"></div>
|
||||
<div *ngIf="criteriaUtils.numericFields.indexOf(constraint.get('field').value) != -1" class="uk-width-1-4" input type="select" inputClass="border-bottom"
|
||||
[options]="criteriaUtils.verbsForNumbers" [formInput]="constraint.get('verb')"></div>
|
||||
<div *ngIf="constraint.get('field').value !== 'fos' && constraint.get('field').value !== 'sdg'" class="uk-width-1-4" inputClass="flat small" input [placeholder]="{static: true, label: 'Type a keyword'}"
|
||||
[formInput]="constraint.get('value')"></div>
|
||||
<div *ngIf="constraint.get('field').value === 'fos'" class="uk-width-1-4" inputClass="flat small" input [placeholder]="{static: true, label: 'Choose a FoS'}"
|
||||
[formInput]="constraint.get('value')" type="select" [options]="fos"></div>
|
||||
<div *ngIf="constraint.get('field').value === 'sdg'" class="uk-width-1-4" inputClass="flat small" input [placeholder]="{static: true, label: 'Choose a FoS'}"
|
||||
[formInput]="constraint.get('value')" type="select" [options]="sdg"></div>
|
||||
<div class="uk-width-expand">
|
||||
<mat-slide-toggle [checked]="constraint.get('verb_suffix').value === ''" class="uk-margin-left"
|
||||
[attr.uk-tooltip]="(constraint.get('verb_suffix').value === ''?('Only \'\'' + constraint.get('value').value + '\'\' matches'):
|
||||
('Both \'\'' + constraint.get('value').value.toUpperCase() + '\'\' and \'\'' + constraint.get('value').value.toLowerCase() + '\'\' match'))"
|
||||
(change)="caseSensitive($event, constraint)"></mat-slide-toggle>
|
||||
</div>
|
||||
<div class="uk-flex uk-flex-center">
|
||||
<button class="uk-close uk-icon" (click)="removeConstraint(getIndex(i), j)">
|
||||
<icon name="close" ratio="1.5" [flex]="true"
|
||||
[attr.uk-tooltip]="(getConstraint(getIndex(i)).length === 1?'By removing this constraint, the filter will be removed too':null)"></icon>
|
||||
</button>
|
||||
(change)="caseSensitive($event, constraint)"></mat-slide-toggle>
|
||||
</div>
|
||||
<div class="uk-flex uk-flex-center">
|
||||
<button class="uk-close uk-icon" (click)="removeConstraint(i, j)">
|
||||
<icon name="close" ratio="1.5" [flex]="true"
|
||||
[attr.uk-tooltip]="(getConstraint(i).length === 1?'By removing this constraint, the ' + entityType + ' will be removed too':null)"></icon>
|
||||
</button>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="uk-margin-top uk-width-1-1 uk-flex uk-flex-center uk-flex-left@l">
|
||||
<a (click)="addConstraint(getIndex(i))" class="uk-flex uk-flex-middle uk-button uk-button-link">
|
||||
<icon name="add" [flex]="true"></icon>
|
||||
<span class="uk-margin-small-left">Add Constraint</span>
|
||||
</a>
|
||||
<div class="uk-margin-top uk-width-1-1 uk-flex uk-flex-center uk-flex-left@l">
|
||||
<a (click)="addConstraint(i)" class="uk-flex uk-flex-middle uk-button uk-button-link">
|
||||
<icon name="add" [flex]="true"></icon>
|
||||
<span class="uk-margin-small-left">Add Constraint</span>
|
||||
</a>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</li>
|
||||
</ul>
|
||||
<div class="uk-margin-small-top">
|
||||
<paging-no-load [currentPage]="page" [totalResults]="criteria.length" [size]="pageSize"
|
||||
(pageChange)="updatePage($event)" customClasses="uk-flex-right@m uk-flex-center">
|
||||
</paging-no-load>
|
||||
</li>
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
</form>
|
||||
</form>
|
||||
</div>
|
||||
<div class="uk-flex uk-flex-center uk-margin-top">
|
||||
<a (click)="addCriteria()" class="uk-flex uk-flex-middle uk-button uk-button-primary"
|
||||
[attr.uk-tooltip]="'<div>Add a ' + entityType + ' to limit research results.<br>Results which satisfy any of the selected ' + entityTypePlural + ' will be included in your ' + openaireEntities.COMMUNITY + '.</div>'">
|
||||
<icon name="add" [flex]="true"></icon>
|
||||
<span class="uk-margin-small-left">Add {{entityType}}</span>
|
||||
</a>
|
||||
</div>
|
||||
</ng-container>
|
||||
</div>
|
||||
|
@ -1,8 +1,3 @@
|
||||
@import (reference) "~src/assets/openaire-theme/less/_import-variables.less";
|
||||
|
||||
.criterion {
|
||||
border: @global-border solid @global-border-width;
|
||||
border-radius: @global-border-radius;
|
||||
max-height: 400px;
|
||||
overflow: auto;
|
||||
.criteria {
|
||||
padding-right: 20px;
|
||||
}
|
||||
|
@ -1,128 +1,337 @@
|
||||
<div page-content>
|
||||
<div header>
|
||||
<div class="uk-flex uk-flex-middle uk-margin-medium-top info">
|
||||
<div>
|
||||
<div class="uk-text-background uk-text-bold uk-text-small">Admin Dashboard - Manage Subjects
|
||||
<div actions>
|
||||
<div class="uk-section-xsmall uk-margin-top">
|
||||
<div class="uk-flex uk-flex-right@m uk-flex-center uk-flex-middle uk-grid" uk-grid>
|
||||
<div [disabled]="loading" search-input class="uk-width-1-3@xl uk-width-2-5@l uk-width-1-2@m uk-width-1-1"
|
||||
[searchControl]="filterForm" [expandable]="true" placeholder="Search Subjects" searchInputClass="outer">
|
||||
</div>
|
||||
<div>
|
||||
<button class="uk-button uk-button-default uk-flex uk-flex-middle"
|
||||
[disabled]="loading" [class.uk-disabled]="loading"
|
||||
(click)="editAllSubjects()"
|
||||
uk-tooltip="title:<div><div class='uk-margin-small-bottom uk-text-bold'>Add or edit subjects</div> All the research results associated to the subjects specified here will be automatically linked to the community dashboard in the next run of OpenAIRE workflows.</div>">
|
||||
<span>Add/Edit Subjects</span>
|
||||
</button>
|
||||
</div>
|
||||
<h1 class="uk-h6 uk-margin-remove">{{community.shortTitle}}</h1>
|
||||
</div>
|
||||
</div>
|
||||
<community-info tab="subjects"></community-info>
|
||||
</div>
|
||||
<div actions>
|
||||
<div class="uk-section-xsmall">
|
||||
<div class="uk-flex uk-flex-right@m uk-flex-center uk-flex-middle uk-grid uk-margin-top" uk-grid>
|
||||
<div [disabled]="showLoading" search-input class="uk-width-1-3@xl uk-width-2-5@l uk-width-1-2@m uk-width-1-1"
|
||||
[searchControl]="filterForm" [expandable]="true" placeholder="Search Subjects" searchInputClass="outer">
|
||||
</div>
|
||||
<!-- <a *ngIf="!subjectsEnabled" (click)="enablePage()" class="uk-link-heading uk-text-small uk-text-uppercase"
|
||||
uk-tooltip="title:<div class='uk-padding-small'>This information will be visible in <b>Subjects page</b> of Research Community Dashboard, which is <b>disabled</b>. <br> Click to enable id.</div>">
|
||||
<span class="uk-text-secondary"><icon name="check_circle_outlined"></icon></span>
|
||||
Enable page
|
||||
</a>-->
|
||||
<div>
|
||||
<button class="uk-button uk-button-default uk-flex uk-flex-middle"
|
||||
[disabled]="showLoading" [class.uk-disabled]="showLoading"
|
||||
(click)="newSubject()"
|
||||
uk-tooltip="title:<div><div class='uk-margin-small-bottom uk-text-bold'>Add new subjects</div> All the research results associated to the subjects specified here will be automatically linked to the community dashboard in the next run of OpenAIRE workflows.</div>">
|
||||
<icon name="add" [flex]="true"></icon>
|
||||
<span class="uk-margin-small-left">New Subject</span>
|
||||
</button>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div inner>
|
||||
<div class="uk-section uk-section-small uk-position-relative" style="min-height: 60vh">
|
||||
<div *ngIf="showLoading" class="uk-position-center">
|
||||
<div class="uk-section uk-section-small uk-position-relative" style="min-height: 60vh">
|
||||
<div *ngIf="loading" class="uk-position-center">
|
||||
<loading></loading>
|
||||
</div>
|
||||
<div *ngIf="!showLoading">
|
||||
<div *ngIf="community.subjects.length == 0"
|
||||
class="uk-card uk-card-default uk-padding-large uk-text-center uk-margin-bottom uk-text-bold">
|
||||
<div>No subjects
|
||||
<span *ngIf="originalSubjects.length == 0; else: notFound">for {{community.shortTitle}}</span>
|
||||
<ng-template #notFound>found</ng-template>
|
||||
</div>
|
||||
</div>
|
||||
<div *ngIf="community.subjects.length > 0">
|
||||
<no-load-paging *ngIf="community.subjects.length > 0" [type]="'Subjects'"
|
||||
[page]="page" [pageSize]="size" (pageChange)="updatePage($event)"
|
||||
[totalResults]="community.subjects.length">
|
||||
</no-load-paging>
|
||||
<div class="uk-grid uk-grid-large uk-grid-match uk-child-width-1-1 uk-child-width-1-2@m uk-margin-top uk-margin-bottom" uk-grid>
|
||||
<div *ngFor='let subject of currentPage; let i = index;'>
|
||||
<div class="uk-card uk-card-default">
|
||||
<div class="uk-card-body">
|
||||
<h6 uk-tooltip="title:All the research results associated to this subjects will be automatically linked to the community dashboard."
|
||||
class="uk-display-inline-block">
|
||||
{{subject}}
|
||||
</h6>
|
||||
</div>
|
||||
<div class="uk-card-footer uk-padding-remove-vertical">
|
||||
<div class="uk-grid uk-grid-small uk-flex-nowrap uk-grid-divider uk-flex-right" uk-grid>
|
||||
<div *ngIf="!loading">
|
||||
<div *ngIf="displayedSubjects?.length == 0 && displayedSdg?.length == 0 && displayedFos?.length == 0"
|
||||
class="uk-card uk-card-default uk-padding-large uk-text-center uk-margin-bottom uk-text-bold">
|
||||
<div>No subjects</div>
|
||||
</div>
|
||||
<div *ngIf="displayedSubjects?.length > 0 || displayedSdg?.length > 0 || displayedFos?.length > 0">
|
||||
<ul uk-tab class="uk-tab uk-margin-bottom uk-flex uk-flex-center uk-flex-left@m">
|
||||
<li class="uk-active" *ngIf="displayedAllSubjects?.length" (click)="groupSubjects(displayedAllSubjects, 'all')">
|
||||
<a>All ({{displayedAllSubjects.length}})</a>
|
||||
</li>
|
||||
<li (click)="groupSubjects(displayedSubjects, 'freeText')">
|
||||
<a>Free Text ({{displayedSubjects.length}})</a>
|
||||
</li>
|
||||
<li (click)="groupSubjects(displayedSdg, 'sdg')">
|
||||
<a>SDGs ({{displayedSdg.length}})</a>
|
||||
</li>
|
||||
<li (click)="groupSubjects(displayedFos, 'fos')">
|
||||
<a>Fields of Science ({{displayedFos.length}})</a>
|
||||
</li>
|
||||
</ul>
|
||||
<ul class="uk-switcher">
|
||||
<li>
|
||||
<ng-container *ngIf="displayedAllSubjects?.length">
|
||||
<div>
|
||||
<ul class="uk-nav uk-nav-default uk-flex uk-flex-wrap">
|
||||
<li *ngFor="let item of groupedAllSubjects; let i = index;" class="uk-margin-right" [class.uk-margin-left]="i != 0"
|
||||
[class]="indexAll == i ? 'uk-active':''" (click)="changeDisplayedSubjects(i, item)">
|
||||
<a class="uk-padding-remove">{{item.group}}</a>
|
||||
</li>
|
||||
</ul>
|
||||
</div>
|
||||
<!-- View for 'All' -->
|
||||
<div *ngIf="indexAll == 0 && groupedAllSubjects.length > 1" class="uk-margin-large-top uk-grid uk-child-width-1-4@m" uk-grid>
|
||||
<div *ngFor="let item of groupedAllSubjects.slice(1); let i = index;">
|
||||
<div>
|
||||
<h6>{{item.group}}</h6>
|
||||
<div *ngFor="let subItem of item.data.slice(0, subjectsLimit)" class="uk-margin-small-bottom">
|
||||
<span [attr.uk-tooltip]="subItem.length > maxCharacters ? 'cls: uk-active' : 'cls: uk-invisible'" [title]="subItem">
|
||||
{{subItem.length > maxCharacters ? subItem.substring(0,maxCharacters)+'...' : subItem}}
|
||||
</span>
|
||||
</div>
|
||||
<div *ngIf="item.data.length > subjectsLimit">
|
||||
<a (click)="changeDisplayedSubjects(i+1, item)" class="view-more-less-link">
|
||||
View all
|
||||
</a>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<!-- View for a single group -->
|
||||
<div *ngIf="indexAll != 0 || groupedAllSubjects.length == 1" class="uk-margin-large-top">
|
||||
<div>
|
||||
<div>
|
||||
<h6>{{groupedAllSubjects[indexAll].group}}</h6>
|
||||
<ng-container *ngIf="subjectsColumns?.length == 0; else elseBlock">
|
||||
<div *ngFor="let subItem of groupedAllSubjects[indexAll].data" class="uk-margin-small-bottom">
|
||||
<span [attr.uk-tooltip]="subItem.length > maxCharacters ? 'cls: uk-active' : 'cls: uk-invisible'" [title]="subItem">
|
||||
{{subItem.length > maxCharacters ? subItem.substring(0,maxCharacters)+'...' : subItem}}
|
||||
</span>
|
||||
</div>
|
||||
</ng-container>
|
||||
<ng-template #elseBlock>
|
||||
<div class="uk-grid uk-child-width-1-4@m" uk-grid>
|
||||
<div *ngFor="let group of subjectsColumns">
|
||||
<div *ngFor="let subItem of group" class="uk-margin-small-bottom">
|
||||
<span [attr.uk-tooltip]="subItem.length > maxCharacters ? 'cls: uk-active' : 'cls: uk-invisible'" [title]="subItem">
|
||||
{{subItem.length > maxCharacters ? subItem.substring(0,maxCharacters)+'...' : subItem}}
|
||||
</span>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</ng-template>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</ng-container>
|
||||
<ng-container *ngIf="displayedAllSubjects?.length === 0">
|
||||
<div class="uk-position-relative uk-height-medium">
|
||||
<h6 class="uk-position-center uk-margin-remove">There are no subjects yet</h6>
|
||||
</div>
|
||||
</ng-container>
|
||||
</li>
|
||||
<li>
|
||||
<ng-container *ngIf="displayedSubjects?.length">
|
||||
<div>
|
||||
<ul class="uk-nav uk-nav-default uk-flex uk-flex-wrap">
|
||||
<li *ngFor="let item of groupedSubjects; let i = index;" class="uk-margin-right" [class.uk-margin-left]="i != 0"
|
||||
[class]="indexSubjects == i ? 'uk-active':''" (click)="changeDisplayedSubjects(i, item)">
|
||||
<a class="uk-padding-remove">{{item.group}}</a>
|
||||
</li>
|
||||
</ul>
|
||||
</div>
|
||||
<!-- View for 'All' -->
|
||||
<div *ngIf="indexSubjects == 0 && groupedSubjects.length > 1" class="uk-margin-large-top uk-grid uk-child-width-1-4@m" uk-grid>
|
||||
<div *ngFor="let item of groupedSubjects.slice(1); let i = index;">
|
||||
<div>
|
||||
<div class="uk-padding-small uk-padding-remove-horizontal">
|
||||
<a (click)="editSubject(subject)"
|
||||
class="uk-button uk-button-link uk-flex uk-flex-middle">
|
||||
<icon name="edit" [flex]="true"></icon>
|
||||
<span class="uk-margin-xsmall-left">Edit</span>
|
||||
<h6>{{item.group}}</h6>
|
||||
<div *ngFor="let subItem of item.data.slice(0, subjectsLimit)" class="uk-margin-small-bottom">
|
||||
<span [attr.uk-tooltip]="subItem.length > maxCharacters ? 'cls: uk-active' : 'cls: uk-invisible'" [title]="subItem">
|
||||
{{subItem.length > maxCharacters ? subItem.substring(0,maxCharacters)+'...' : subItem}}
|
||||
</span>
|
||||
</div>
|
||||
<div *ngIf="item.data.length > subjectsLimit">
|
||||
<a (click)="changeDisplayedSubjects(i+1, item)" class="view-more-less-link">
|
||||
View all
|
||||
</a>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<!-- View for a single group -->
|
||||
<div *ngIf="indexSubjects != 0 || groupedSubjects.length == 1" class="uk-margin-large-top">
|
||||
<div>
|
||||
<div>
|
||||
<h6>{{groupedSubjects[indexSubjects]?.group}}</h6>
|
||||
<ng-container *ngIf="subjectsColumns?.length == 0; else elseBlock">
|
||||
<div *ngFor="let subItem of groupedSubjects[indexSubjects]?.data" class="uk-margin-small-bottom">
|
||||
<span [attr.uk-tooltip]="subItem.length > maxCharacters ? 'cls: uk-active' : 'cls: uk-invisible'" [title]="subItem">
|
||||
{{subItem.length > maxCharacters ? subItem.substring(0,maxCharacters)+'...' : subItem}}
|
||||
</span>
|
||||
</div>
|
||||
</ng-container>
|
||||
<ng-template #elseBlock>
|
||||
<div class="uk-grid uk-child-width-1-4@m" uk-grid>
|
||||
<div *ngFor="let group of subjectsColumns">
|
||||
<div *ngFor="let subItem of group" class="uk-margin-small-bottom">
|
||||
<span [attr.uk-tooltip]="subItem.length > maxCharacters ? 'cls: uk-active' : 'cls: uk-invisible'" [title]="subItem">
|
||||
{{subItem.length > maxCharacters ? subItem.substring(0,maxCharacters)+'...' : subItem}}
|
||||
</span>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</ng-template>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</ng-container>
|
||||
<ng-container *ngIf="displayedSubjects?.length === 0">
|
||||
<div class="uk-position-relative uk-height-medium">
|
||||
<h6 class="uk-position-center uk-margin-remove">There are no subjects yet</h6>
|
||||
</div>
|
||||
</ng-container>
|
||||
</li>
|
||||
<li>
|
||||
<ng-container *ngIf="displayedSdg?.length">
|
||||
<div>
|
||||
<ul class="uk-nav uk-nav-default uk-flex uk-flex-wrap">
|
||||
<li *ngFor="let item of groupedSdg; let i = index;" class="uk-margin-right" [class.uk-margin-left]="i != 0"
|
||||
[class]="indexSdg == i ? 'uk-active':''" (click)="changeDisplayedSubjects(i, item)">
|
||||
<a class="uk-padding-remove">{{item.group}}</a>
|
||||
</li>
|
||||
</ul>
|
||||
</div>
|
||||
<!-- View for 'All' -->
|
||||
<div *ngIf="indexSdg == 0 && groupedSdg.length > 1" class="uk-margin-large-top uk-grid uk-child-width-1-4@m" uk-grid>
|
||||
<div *ngFor="let item of groupedSdg.slice(1); let i = index;">
|
||||
<div>
|
||||
<div class="uk-padding-small uk-padding-remove-horizontal">
|
||||
<button class="uk-button uk-button-link uk-flex uk-flex-middle"
|
||||
(click)="removeModalOpen(subject, i)">
|
||||
<icon name="delete" [flex]="true"></icon>
|
||||
<span class="uk-margin-xsmall-left">Delete</span>
|
||||
</button>
|
||||
<h6>{{item.group}}</h6>
|
||||
<div *ngFor="let subItem of item.data.slice(0, subjectsLimit)" class="uk-margin-small-bottom">
|
||||
<span [attr.uk-tooltip]="subItem.length > maxCharacters ? 'cls: uk-active' : 'cls: uk-invisible'" [title]="subItem">
|
||||
{{subItem.length > maxCharacters ? subItem.substring(0,maxCharacters)+'...' : subItem}}
|
||||
</span>
|
||||
</div>
|
||||
<div *ngIf="item.data.length > subjectsLimit">
|
||||
<a (click)="changeDisplayedSubjects(i+1, item)" class="view-more-less-link">
|
||||
View all
|
||||
</a>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="uk-margin-small-top">
|
||||
<paging-no-load [currentPage]="page" [totalResults]="community.subjects.length" [size]="size"
|
||||
(pageChange)="updatePage($event)" customClasses="uk-flex-right@m uk-flex-center">
|
||||
</paging-no-load>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<!-- View for a single group -->
|
||||
<div *ngIf="indexSdg != 0 || groupedSdg.length == 1" class="uk-margin-large-top">
|
||||
<div>
|
||||
<div>
|
||||
<h6>{{groupedSdg[indexSdg].group}}</h6>
|
||||
<ng-container *ngIf="subjectsColumns?.length == 0; else elseBlock">
|
||||
<div *ngFor="let subItem of groupedSdg[indexSdg].data" class="uk-margin-small-bottom">
|
||||
<span [attr.uk-tooltip]="subItem.length > maxCharacters ? 'cls: uk-active' : 'cls: uk-invisible'" [title]="subItem">
|
||||
{{subItem.length > maxCharacters ? subItem.substring(0,maxCharacters)+'...' : subItem}}
|
||||
</span>
|
||||
</div>
|
||||
</ng-container>
|
||||
<ng-template #elseBlock>
|
||||
<div class="uk-grid uk-child-width-1-4@m" uk-grid>
|
||||
<div *ngFor="let group of subjectsColumns">
|
||||
<div *ngFor="let subItem of group" class="uk-margin-small-bottom">
|
||||
<span [attr.uk-tooltip]="subItem.length > maxCharacters ? 'cls: uk-active' : 'cls: uk-invisible'" [title]="subItem">
|
||||
{{subItem.length > maxCharacters ? subItem.substring(0,maxCharacters)+'...' : subItem}}
|
||||
</span>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</ng-template>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</ng-container>
|
||||
<ng-container *ngIf="displayedSdg?.length === 0">
|
||||
<div class="uk-position-relative uk-height-medium">
|
||||
<h6 class="uk-position-center uk-margin-remove">There are no subjects yet</h6>
|
||||
</div>
|
||||
</ng-container>
|
||||
</li>
|
||||
<li>
|
||||
<ng-container *ngIf="displayedFos?.length">
|
||||
<div>
|
||||
<ul class="uk-nav uk-nav-default uk-flex uk-flex-wrap">
|
||||
<li *ngFor="let item of groupedFos; let i = index;" class="uk-margin-right" [class.uk-margin-left]="i != 0"
|
||||
[class]="indexFos == i ? 'uk-active':''" (click)="changeDisplayedSubjects(i, item)">
|
||||
<a class="uk-padding-remove">{{item.group}}</a>
|
||||
</li>
|
||||
</ul>
|
||||
</div>
|
||||
<!-- View for 'All' -->
|
||||
<div *ngIf="indexFos == 0 && groupedFos.length > 1" class="uk-margin-large-top uk-grid uk-child-width-1-4@m" uk-grid>
|
||||
<div *ngFor="let item of groupedFos.slice(1); let i = index;">
|
||||
<div>
|
||||
<h6>{{item.group}}</h6>
|
||||
<div *ngFor="let subItem of item.data.slice(0, subjectsLimit)" class="uk-margin-small-bottom">
|
||||
<span [attr.uk-tooltip]="subItem.length > maxCharacters ? 'cls: uk-active' : 'cls: uk-invisible'" [title]="subItem">
|
||||
{{subItem.length > maxCharacters ? subItem.substring(0,maxCharacters)+'...' : subItem}}
|
||||
</span>
|
||||
</div>
|
||||
<div *ngIf="item.data.length > subjectsLimit">
|
||||
<a (click)="changeDisplayedSubjects(i+1, item)" class="view-more-less-link">
|
||||
View all
|
||||
</a>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<!-- View for a single group -->
|
||||
<div *ngIf="indexFos != 0 || groupedFos.length == 1" class="uk-margin-large-top">
|
||||
<div>
|
||||
<div>
|
||||
<h6>{{groupedFos[indexFos].group}}</h6>
|
||||
<ng-container *ngIf="subjectsColumns?.length == 0; else elseBlock">
|
||||
<div *ngFor="let subItem of groupedFos[indexFos].data" class="uk-margin-small-bottom">
|
||||
<span [attr.uk-tooltip]="subItem.length > maxCharacters ? 'cls: uk-active' : 'cls: uk-invisible'" [title]="subItem">
|
||||
{{subItem.length > maxCharacters ? subItem.substring(0,maxCharacters)+'...' : subItem}}
|
||||
</span>
|
||||
</div>
|
||||
</ng-container>
|
||||
<ng-template #elseBlock>
|
||||
<div class="uk-grid uk-child-width-1-4@m" uk-grid>
|
||||
<div *ngFor="let group of subjectsColumns">
|
||||
<div *ngFor="let subItem of group" class="uk-margin-small-bottom">
|
||||
<span [attr.uk-tooltip]="subItem.length > maxCharacters ? 'cls: uk-active' : 'cls: uk-invisible'" [title]="subItem">
|
||||
{{subItem.length > maxCharacters ? subItem.substring(0,maxCharacters)+'...' : subItem}}
|
||||
</span>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</ng-template>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</ng-container>
|
||||
<ng-container *ngIf="displayedFos?.length === 0">
|
||||
<div class="uk-position-relative uk-height-medium">
|
||||
<h6 class="uk-position-center uk-margin-remove">There are no subjects yet</h6>
|
||||
</div>
|
||||
</ng-container>
|
||||
</li>
|
||||
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<modal-alert #deleteModal (alertOutput)="saveSubjects()" [overflowBody]="false" classTitle="uk-background-primary uk-light"></modal-alert>
|
||||
<fs-modal #fsModal classBody="uk-container-small" (okEmitter)="saveSubjects()" [okButtonDisabled]="myForm && (myForm.invalid || !myForm.dirty)">
|
||||
<form *ngIf="myForm">
|
||||
<div class="uk-margin-top uk-flex-center uk-flex uk-margin-medium-bottom">
|
||||
<a *ngIf="!isEditModal" (click)="addSubjectInForm()">
|
||||
<button class="uk-button uk-button-primary uk-flex uk-flex-middle">
|
||||
<icon name="add" [flex]="true"></icon>
|
||||
<span class="uk-margin-xsmall-left">Add Subject</span>
|
||||
</button>
|
||||
</a>
|
||||
</div>
|
||||
<div class="uk-grid uk-child-width-1-1" uk-grid>
|
||||
<div *ngFor=" let control of myForm.controls; index as i" class="uk-flex uk-flex-middle">
|
||||
<div input [formInput]="myForm.controls[i]" type="text"
|
||||
placeholder="Type subjects as free text keywords" class="uk-width-expand"></div>
|
||||
<div *ngIf="!isEditModal" class="uk-width-auto uk-flex uk-flex-center uk-margin-left">
|
||||
<button class="uk-close uk-icon" [class.uk-invisible]="myForm.length === 1"
|
||||
(click)="removeSubjectInForm(i)">
|
||||
<icon name="close" [flex]="true" [ratio]="1.5"></icon>
|
||||
</button>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</form>
|
||||
</fs-modal>
|
||||
<!--<modal-alert #enablePageModal (alertOutput)="enablePage()">
|
||||
<div class="uk-padding uk-padding-remove-horizontal">
|
||||
This information will be visible in <span class="uk-text-bold">Subjects page</span> of Research Community
|
||||
Dashboard, which is <span class="uk-text-bold">disabled</span>.
|
||||
Do you want to <span class="uk-text-bold">enable</span> it now?
|
||||
<fs-modal #fsModal classBody="uk-container-large" (okEmitter)="saveAllSubjects()" [okButtonDisabled]="!hasChanges && !sdgSelection.hasChanges && !fosSelection.hasChanges">
|
||||
<div>
|
||||
<ul uk-tab #modalTabs class="uk-tab uk-margin-top uk-margin-large-bottom uk-flex uk-flex-center uk-flex-left@m">
|
||||
<li class="uk-active">
|
||||
<a>Free Text ({{displayedSubjects.length}})</a>
|
||||
</li>
|
||||
<li>
|
||||
<a>SDGs ({{sdgSelection.getSelectedSubjects().length}})<span *ngIf="sdgSelection.hasChanges">*</span></a>
|
||||
</li>
|
||||
<li>
|
||||
<a>Fields of Science ({{fosSelection.getSelectedSubjects().length}})<span *ngIf="fosSelection.hasChanges">*</span></a>
|
||||
</li>
|
||||
</ul>
|
||||
<ul class="uk-switcher">
|
||||
<li *ngIf="subjectsForm">
|
||||
<div #addSubjectsInput input [type]="'chips'" [formInput]="subjectsForm" [inputClass]="'flat small'" [extendEnter]="onEnter"
|
||||
[separators]="[',', 'enter']" [visibleChips]="3" class="uk-width-1-1 uk-width-xlarge@m"
|
||||
[placeholder]="{static: true, label: 'Type subjects as free text keywords'}">
|
||||
<div tools class="uk-flex uk-flex-right">
|
||||
<button (click)="addSubjectsIntoList()" class="uk-button uk-button-link uk-margin-xsmall-left uk-margin-right">add</button>
|
||||
</div>
|
||||
<div note class="uk-text-xsmall">Separate subjects with commas</div>
|
||||
</div>
|
||||
<div class="uk-margin-large-top">
|
||||
<span *ngFor="let subject of displayedSubjects; let i = index;"
|
||||
class="uk-label uk-label-primary uk-flex-inline uk-flex-middle uk-margin-right uk-margin-bottom">
|
||||
<span class="uk-margin-small-right uk-text-truncate">{{subject}}</span>
|
||||
<button (click)="removeSubjectFromList(i)" class="uk-close uk-icon">
|
||||
<icon name="close" flex="true" ratio="0.7"></icon>
|
||||
</button>
|
||||
</span>
|
||||
</div>
|
||||
</li>
|
||||
<li>
|
||||
<sdg-selection #sdgSelection [subjects]="displayedSdg" [isFeedback]="false"></sdg-selection>
|
||||
</li>
|
||||
<li>
|
||||
<fos-selection #fosSelection [subjects]="displayedFos" [inModal]="true"></fos-selection>
|
||||
</li>
|
||||
</ul>
|
||||
</div>
|
||||
</modal-alert>-->
|
||||
</fs-modal>
|
||||
|
@ -1 +1 @@
|
||||
Subproject commit fdcbc17b88deb76cee2cd4432282468be9f56b7e
|
||||
Subproject commit 3b437aafda7a716a0a89785a106456cbe520dce3
|
@ -1 +1 @@
|
||||
Subproject commit 201ff990c0b2532951a796b10799ab95cb40c0b0
|
||||
Subproject commit 99ab54cdd7b973a2ba047f0a6b37667270b58439
|
@ -1,91 +1,14 @@
|
||||
import {EnvProperties} from '../app/openaireLibrary/utils/properties/env-properties';
|
||||
import {common, commonBeta, commonProd} from "../app/openaireLibrary/utils/properties/environments/environment";
|
||||
|
||||
export let properties: EnvProperties = {
|
||||
environment: "beta",
|
||||
dashboard: 'connect',
|
||||
let props: EnvProperties = {
|
||||
isDashboard: true,
|
||||
adminToolsPortalType: "community",
|
||||
enablePiwikTrack: false,
|
||||
useCache: false,
|
||||
framesAPIURL: "https://beta.openaire.eu/stats3/",
|
||||
claimsAPIURL: "https://beta.services.openaire.eu/claims/rest/claimsService/",
|
||||
statisticsAPIURL: "https://beta.services.openaire.eu/stats-api/",
|
||||
statisticsFrameAPIURL: "https://beta.openaire.eu/stats/",
|
||||
statisticsFrameNewAPIURL: "https://stats.madgik.di.uoa.gr/stats-api/",
|
||||
useNewStatistisTool: true,
|
||||
searchAPIURLLAst: "https://beta.services.openaire.eu/search/v2/api/",
|
||||
searchResourcesAPIURL: "https://beta.services.openaire.eu/search/v2/api/resources",
|
||||
openCitationsAPIURL: "https://services.openaire.eu/opencitations/getCitations?id=",
|
||||
csvAPIURL: "https://beta.services.openaire.eu/search/v2/api/reports",
|
||||
searchCrossrefAPIURL: "https://api.crossref.org/works",
|
||||
searchDataciteAPIURL: "https://api.datacite.org/works",
|
||||
searchOrcidURL: "https://pub.orcid.org/",
|
||||
orcidURL: "https://orcid.org/",
|
||||
doiURL: "https://dx.doi.org/",
|
||||
cordisURL: "http://cordis.europa.eu/projects/",
|
||||
openDoarURL: "http://v2.sherpa.ac.uk/id/repository/",
|
||||
r3DataURL: "http://service.re3data.org/repository/",
|
||||
sherpaURL: "http://www.sherpa.ac.uk/romeo/search.php?issn=",
|
||||
zenodo: "https://zenodo.org/",
|
||||
zenodoCommunities: "https://zenodo.org/api/communities/",
|
||||
openAccess: "https://www.openaire.eu/support/faq#article-id-234",
|
||||
openAccessRepo: "https://www.openaire.eu/support/faq#article-id-310",
|
||||
fp7Guidlines: "https://www.openaire.eu/open-access-in-fp7-seventh-research-framework-programme",
|
||||
h2020Guidlines: "https://www.openaire.eu/oa-publications/h2020/open-access-in-horizon-2020",
|
||||
ercGuidlines: "http://erc.europa.eu/sites/default/files/document/file/ERC_Open_Access_Guidelines-revised_2014.pdf",
|
||||
helpdesk: "https://www.openaire.eu/support/helpdesk",
|
||||
helpdeskEmail: "helpdesk@openaire.eu",
|
||||
utilsService: "https://demo.openaire.eu/utils-service",
|
||||
vocabulariesAPI: "https://beta.services.openaire.eu/provision/mvc/vocabularies/",
|
||||
piwikBaseUrl: " https://analytics.openaire.eu/piwik.php?idsite=6",
|
||||
registryUrl: 'https://beta.services.openaire.eu/uoa-user-management/api/registry/',
|
||||
loginUrl: "https://beta.services.openaire.eu/login-service/openid_connect_login",
|
||||
userInfoUrl: "https://beta.services.openaire.eu/login-service/userInfo",
|
||||
logoutUrl: "https://beta.services.openaire.eu/login-service/openid_logout",
|
||||
cookieDomain: ".openaire.eu",
|
||||
feedbackmail: "feedback@openaire.eu",
|
||||
feedbackmailForMissingEntities: "feedback@openaire.eu",
|
||||
cacheUrl: "https://demo.openaire.eu/cache/get?url=",
|
||||
deleteCacheUrl: 'https://demo.openaire.eu/cache/clear',
|
||||
deleteBrowserCacheUrl: 'https://beta.services.openaire.eu/uoa-admin-tools/cache',
|
||||
adminToolsAPIURL: "https://beta.services.openaire.eu/uoa-admin-tools/",
|
||||
adminToolsCommunity: "openaire",
|
||||
communityAPI: "https://beta.services.openaire.eu/openaire/community/",
|
||||
miningBackendURL: "https://beta.services.openaire.eu/interactive-mining",
|
||||
csvLimit: 2000,
|
||||
pagingLimit: 20,
|
||||
resultsPerPage: 10,
|
||||
baseLink: "",
|
||||
domain: "https://beta.admin.connect.openaire.eu/",
|
||||
baseOpenaireLink: "https://beta.explore.openaire.eu",
|
||||
searchLinkToPublication: "/search/publication?articleId=",
|
||||
searchLinkToProject: "/search/project?projectId=",
|
||||
searchLinkToDataProvider: "/search/dataprovider?datasourceId=",
|
||||
searchLinkToDataset: "/search/dataset?datasetId=",
|
||||
searchLinkToOrganization: "/search/organization?organizationId=",
|
||||
searchLinkToPublications: "/search/find/publications",
|
||||
searchLinkToDataProviders: "/search/find/dataproviders",
|
||||
searchLinkToProjects: "/search/find/projects",
|
||||
searchLinkToDatasets: "/search/find/datasets",
|
||||
searchLinkToSoftware: "/search/find/software",
|
||||
searchLinkToOrganizations: "/search/find/organizations",
|
||||
searchLinkToCompatibleDataProviders: "/search/content-providers",
|
||||
searchLinkToEntityRegistriesDataProviders: "/search/entity-registries",
|
||||
searchLinkToJournals: "/search/journals",
|
||||
searchLinkToAdvancedPublications: "/search/advanced/publications",
|
||||
searchLinkToAdvancedProjects: "/search/advanced/projects",
|
||||
searchLinkToAdvancedDatasets: "/search/advanced/datasets",
|
||||
searchLinkToAdvancedSoftware: "/search/advanced/software",
|
||||
searchLinkToAdvancedDataProviders: "/search/advanced/dataproviders",
|
||||
searchLinkToAdvancedOrganizations: "/search/advanced/organizations",
|
||||
lastIndexInformationLink: "https://beta.openaire.eu/aggregation-and-content-provision-workflows",
|
||||
showLastIndexInformationLink: false,
|
||||
widgetLink: "https://beta.openaire.eu/index.php?option=com_openaire&view=widget&format=raw&projectId=",
|
||||
claimsInformationLink: "https://beta.openaire.eu/linking",
|
||||
lastIndexUpdate: "2020-05-06",
|
||||
indexInfoAPI: "https://beta.services.openaire.eu/openaire/info/",
|
||||
admins: ["rcd@openaire.eu"],
|
||||
adminPortalURL: "https://beta.admin.connect.openaire.eu",
|
||||
errorLink: '/error',
|
||||
connectPortalUrl: 'https://beta.connect.openaire.eu'
|
||||
domain:'https://beta.admin.connect.openaire.eu'
|
||||
|
||||
};
|
||||
|
||||
export let properties: EnvProperties = {
|
||||
...common, ...commonBeta, ...props
|
||||
}
|
||||
|
@ -1,91 +1,15 @@
|
||||
import {EnvProperties} from '../app/openaireLibrary/utils/properties/env-properties';
|
||||
import {common, commonProd} from "../app/openaireLibrary/utils/properties/environments/environment";
|
||||
|
||||
let props: EnvProperties = {
|
||||
|
||||
export let properties: EnvProperties = {
|
||||
environment:"production",
|
||||
dashboard: 'connect',
|
||||
isDashboard: true,
|
||||
adminToolsPortalType: "community",
|
||||
enablePiwikTrack: false,
|
||||
useCache: false,
|
||||
framesAPIURL: "https://www.openaire.eu/stats3/",
|
||||
claimsAPIURL: "https://services.openaire.eu/claims/rest/claimsService/",
|
||||
statisticsAPIURL: "https://beta.services.openaire.eu/stats-api/",
|
||||
statisticsFrameAPIURL:"https://www.openaire.eu/stats/",
|
||||
statisticsFrameNewAPIURL: "http://marilyn.athenarc.gr:8080/stats-api/",
|
||||
useNewStatistisTool:false,
|
||||
searchAPIURLLAst: "https://services.openaire.eu/search/v2/api/",
|
||||
searchResourcesAPIURL: "https://services.openaire.eu/search/v2/api/resources",
|
||||
openCitationsAPIURL: "https://services.openaire.eu/opencitations/getCitations?id=",
|
||||
csvAPIURL: "https://services.openaire.eu/search/v2/api/reports",
|
||||
searchCrossrefAPIURL: "https://api.crossref.org/works",
|
||||
searchDataciteAPIURL: "https://api.datacite.org/works",
|
||||
searchOrcidURL: "https://pub.orcid.org/",
|
||||
orcidURL: "https://orcid.org/",
|
||||
doiURL: "https://dx.doi.org/",
|
||||
cordisURL: "http://cordis.europa.eu/projects/",
|
||||
openDoarURL: "http://v2.sherpa.ac.uk/id/repository/",
|
||||
r3DataURL: "http://service.re3data.org/repository/",
|
||||
sherpaURL: "http://www.sherpa.ac.uk/romeo/search.php?issn=",
|
||||
zenodo: "https://zenodo.org/",
|
||||
zenodoCommunities: "https://zenodo.org/api/communities/",
|
||||
openAccess: "https://www.openaire.eu/support/faq#article-id-234",
|
||||
openAccessRepo: "https://www.openaire.eu/support/faq#article-id-310",
|
||||
fp7Guidlines: "https://www.openaire.eu/open-access-in-fp7-seventh-research-framework-programme",
|
||||
h2020Guidlines: "https://www.openaire.eu/oa-publications/h2020/open-access-in-horizon-2020",
|
||||
ercGuidlines: "http://erc.europa.eu/sites/default/files/document/file/ERC_Open_Access_Guidelines-revised_2014.pdf",
|
||||
helpdesk: "https://www.openaire.eu/support/helpdesk",
|
||||
helpdeskEmail: "helpdesk@openaire.eu",
|
||||
utilsService: "https://explore.openaire.eu/utils-service",
|
||||
vocabulariesAPI:"https://services.openaire.eu/provision/mvc/vocabularies/",
|
||||
piwikBaseUrl:" https://analytics.openaire.eu/piwik.php?idsite=6",
|
||||
loginUrl: "https://services.openaire.eu/login-service/openid_connect_login",
|
||||
registryUrl: 'https://services.openaire.eu/uoa-user-management/api/registry/',
|
||||
userInfoUrl: "https://services.openaire.eu/login-service/userInfo",
|
||||
logoutUrl: "https://services.openaire.eu/login-service/openid_logout",
|
||||
cookieDomain:".openaire.eu",
|
||||
feedbackmail:"openaire.test@gmail.com",
|
||||
feedbackmailForMissingEntities: "feedback@openaire.eu",
|
||||
cacheUrl:"https://explore.openaire.eu/cache/get?url=",
|
||||
deleteCacheUrl: 'https://explore.openaire.eu/cache/clear',
|
||||
deleteBrowserCacheUrl: 'https://services.openaire.eu/uoa-admin-tools/cache',
|
||||
adminToolsAPIURL:"https://services.openaire.eu/uoa-admin-tools/",
|
||||
adminToolsCommunity:"openaire",
|
||||
communityAPI: "https://services.openaire.eu/openaire/community/",
|
||||
miningBackendURL: "https://beta.services.openaire.eu/interactive-mining",
|
||||
csvLimit: 2000,
|
||||
pagingLimit: 20,
|
||||
resultsPerPage: 10,
|
||||
baseLink: "",
|
||||
domain: "https://admin.explore.openaire.eu/",
|
||||
baseOpenaireLink: "https://explore.openaire.eu",
|
||||
searchLinkToPublication: "/search/publication?articleId=",
|
||||
searchLinkToProject: "/search/project?projectId=",
|
||||
searchLinkToDataProvider: "/search/dataprovider?datasourceId=",
|
||||
searchLinkToDataset: "/search/dataset?datasetId=",
|
||||
searchLinkToOrganization: "/search/organization?organizationId=",
|
||||
searchLinkToPublications: "/search/find/publications",
|
||||
searchLinkToDataProviders: "/search/find/dataproviders",
|
||||
searchLinkToProjects: "/search/find/projects",
|
||||
searchLinkToDatasets: "/search/find/datasets",
|
||||
searchLinkToSoftware: "/search/find/software",
|
||||
searchLinkToOrganizations: "/search/find/organizations",
|
||||
searchLinkToCompatibleDataProviders: "/search/content-providers",
|
||||
searchLinkToEntityRegistriesDataProviders: "/search/entity-registries",
|
||||
searchLinkToJournals: "/search/journals",
|
||||
searchLinkToAdvancedPublications: "/search/advanced/publications",
|
||||
searchLinkToAdvancedProjects: "/search/advanced/projects",
|
||||
searchLinkToAdvancedDatasets: "/search/advanced/datasets",
|
||||
searchLinkToAdvancedSoftware: "/search/advanced/software",
|
||||
searchLinkToAdvancedDataProviders: "/search/advanced/dataproviders",
|
||||
searchLinkToAdvancedOrganizations: "/search/advanced/organizations",
|
||||
lastIndexInformationLink: "https://www.openaire.eu/aggregation-and-content-provision-workflows",
|
||||
showLastIndexInformationLink: false,
|
||||
widgetLink: "https://www.openaire.eu/index.php?option=com_openaire&view=widget&format=raw&projectId=",
|
||||
claimsInformationLink: "https://www.openaire.eu/linking",
|
||||
lastIndexUpdate: "2020-12-17",
|
||||
indexInfoAPI: "https://services.openaire.eu/openaire/info/",
|
||||
admins: ["rcd@openaire.eu"],
|
||||
adminPortalURL: "https://admin.connect.openaire.eu",
|
||||
errorLink: '/error',
|
||||
connectPortalUrl: 'https://connect.openaire.eu'
|
||||
domain:'https://admin.connect.openaire.eu',
|
||||
|
||||
};
|
||||
|
||||
export let properties: EnvProperties = {
|
||||
...common, ...commonProd, ...props
|
||||
}
|
||||
|
Loading…
Reference in New Issue