Merge branch 'develop' into plugins-functionality
This commit is contained in:
commit
2bb981c489
|
@ -8,29 +8,39 @@ import { properties } from "../../environments/environment";
|
|||
export class CacheInterceptorService implements HttpInterceptor {
|
||||
cachingRequests = [
|
||||
// Remove 2 following lines when bug with hidden refine filters is solved.
|
||||
"/resources2/?format=json&refine=true&fields=resultbestaccessright&fields=instancetypename&fields=fos&fields=relfunder&fields=relfundinglevel0_id&fields=relproject&fields=sdg&fields=country&fields=resultlanguagename&fields=resulthostingdatasource&fields=community&fields=country&&fq=resultbestaccessright exact \"Open Access\"&type=results&page=0&size=0",
|
||||
"/resources2/?format=json&refine=true&fields=instancetypename&fields=foslabel&fields=relfunder&fields=relfundinglevel0_id&fields=relproject&fields=sdg&fields=country&fields=resultlanguagename&fields=resulthostingdatasource&fields=community&&fq=resultbestaccessright exact \"Open Access\"&type=results&page=0&size=0",
|
||||
"/resources2/?format=json&refine=true&fields=funder&fields=fundinglevel0_id&fields=projectstartyear&fields=projectendyear&fields=projectoamandatepublications&&type=projects&page=0&size=0",
|
||||
|
||||
"/resources2/?format=json&refine=true&fields=resultbestaccessright&fields=instancetypename&fields=fos&fields=relfunder&fields=sdg&fields=country&fields=resultlanguagename&fields=resulthostingdatasource&fields=community&&type=results&page=0&size=0",
|
||||
"/resources2/?format=json&refine=true&fields=resultbestaccessright&fields=instancetypename&fields=fos&fields=relfunder&fields=relfundinglevel0_id&fields=relproject&fields=sdg&fields=country&fields=resultlanguagename&fields=resulthostingdatasource&fields=community&fields=country&&fq=resultbestaccessright%20exact%20%22Open%20Access%22&fq=relfunder%20exact%20%22ec__________%3A%3AEC%7C%7CEuropean%20Commission%7C%7CEC%22&type=results&page=0&size=0",
|
||||
"/resources2/?format=json&refine=true&fields=instancetypename&fields=foslabel&fields=relfunder&fields=sdg&fields=country&fields=resultlanguagename&fields=resulthostingdatasource&fields=community&&type=results&page=0&size=0",
|
||||
"/resources2/?format=json&refine=true&fields=instancetypename&fields=foslabel&fields=relfunder&fields=relfundinglevel0_id&fields=relproject&fields=sdg&fields=country&fields=resultlanguagename&fields=resulthostingdatasource&fields=community&&fq=resultbestaccessright%20exact%20%22Open%20Access%22&fq=relfunder%20exact%20%22ec__________%3A%3AEC%7C%7CEuropean%20Commission%7C%7CEC%22&type=results&page=0&size=0",
|
||||
|
||||
"/resources2/?format=json&refine=true&fields=resultbestaccessright&fields=instancetypename&fields=fos&fields=relfunder&fields=sdg&fields=country&fields=resultlanguagename&fields=resulthostingdatasource&fields=community&&type=publications&page=0&size=0",
|
||||
"/resources2/?format=json&refine=true&fields=resultbestaccessright&fields=instancetypename&fields=fos&fields=relfunder&fields=sdg&fields=country&fields=resultlanguagename&fields=resulthostingdatasource&fields=community&&type=datasets&page=0&size=0",
|
||||
"/resources2/?format=json&refine=true&fields=resultbestaccessright&fields=instancetypename&fields=fos&fields=relfunder&fields=sdg&fields=country&fields=resultlanguagename&fields=resulthostingdatasource&fields=community&&type=software&page=0&size=0",
|
||||
"/resources2/?format=json&refine=true&fields=resultbestaccessright&fields=instancetypename&fields=fos&fields=relfunder&fields=sdg&fields=country&fields=resultlanguagename&fields=resulthostingdatasource&fields=community&&type=other&page=0&size=0",
|
||||
"/resources2/?format=json&refine=true&fields=instancetypename&fields=foslabel&fields=relfunder&fields=sdg&fields=country&fields=resultlanguagename&fields=resulthostingdatasource&fields=community&&type=publications&page=0&size=0",
|
||||
"/resources2/?format=json&refine=true&fields=instancetypename&fields=foslabel&fields=relfunder&fields=sdg&fields=country&fields=resultlanguagename&fields=resulthostingdatasource&fields=community&&type=datasets&page=0&size=0",
|
||||
"/resources2/?format=json&refine=true&fields=instancetypename&fields=foslabel&fields=relfunder&fields=sdg&fields=country&fields=resultlanguagename&fields=resulthostingdatasource&fields=community&&type=software&page=0&size=0",
|
||||
"/resources2/?format=json&refine=true&fields=instancetypename&fields=foslabel&fields=relfunder&fields=sdg&fields=country&fields=resultlanguagename&fields=resulthostingdatasource&fields=community&&type=other&page=0&size=0",
|
||||
|
||||
"/resources2/?format=json&refine=true&fields=resultbestaccessright&fields=instancetypename&fields=fos&fields=relfunder&fields=sdg&fields=country&fields=resultlanguagename&fields=resulthostingdatasource&fields=community&&fq=resultbestaccessright%20exact%20%22Open%20Access%22&type=results&page=0&size=0",
|
||||
"/resources2/?format=json&refine=true&fields=resultbestaccessright&fields=instancetypename&fields=fos&fields=relfunder&fields=sdg&fields=country&fields=resultlanguagename&fields=resulthostingdatasource&fields=community&&fq=resultbestaccessright exact \"Open Access\"&type=results&page=0&size=0",
|
||||
"/resources2/?format=json&refine=true&fields=funder&fields=projectstartyear&fields=projectendyear&fields=projectoamandatepublications&&type=projects&page=0&size=0",
|
||||
"/resources2/?format=json&refine=true&fields=instancetypename&fields=foslabel&fields=relfunder&fields=sdg&fields=country&fields=resultlanguagename&fields=resulthostingdatasource&fields=community&&fq=resultbestaccessright%20exact%20%22Open%20Access%22&type=results&page=0&size=0",
|
||||
"/resources2/?format=json&refine=true&fields=instancetypename&fields=foslabel&fields=relfunder&fields=sdg&fields=country&fields=resultlanguagename&fields=resulthostingdatasource&fields=community&&fq=resultbestaccessright exact \"Open Access\"&type=results&page=0&size=0",
|
||||
"/resources2/?format=json&refine=true&fields=funder&fields=projectoamandatepublications&fields=projectstartyear&fields=projectendyear&&type=projects&page=0&size=0",
|
||||
"/resources2/?format=json&refine=true&fields=eoscdatasourcetype&fields=datasourceodlanguages&fields=datasourceodcontenttypes&fields=datasourcecompatibilityname&fields=country&fields=collectedfromname&fields=datasourcethematic&fields=datasourcejurisdiction&&type=datasources&page=0&size=0",
|
||||
"/resources2/?format=json&query= ( (reldatasourcecompatibilityid exact driver or reldatasourcecompatibilityid exact driver-openaire2.0 or reldatasourcecompatibilityid exact openaire2.0 or reldatasourcecompatibilityid exact openaire3.0 or reldatasourcecompatibilityid exact openaire4.0 or reldatasourcecompatibilityid exact openaire-cris_1.1 or reldatasourcecompatibilityid exact openaire2.0_data or reldatasourcecompatibilityid exact hostedBy or relproject=*) ) &refine=true&fields=country&&type=organizations&page=0&size=0",
|
||||
// "/resources2/?format=json&query= ( (reldatasourcecompatibilityid exact driver or reldatasourcecompatibilityid exact driver-openaire2.0 or reldatasourcecompatibilityid exact openaire2.0 or reldatasourcecompatibilityid exact openaire3.0 or reldatasourcecompatibilityid exact openaire4.0 or reldatasourcecompatibilityid exact openaire-cris_1.1 or reldatasourcecompatibilityid exact openaire2.0_data or reldatasourcecompatibilityid exact hostedBy or relproject=*) ) &refine=true&fields=country&&type=organizations&page=0&size=0",
|
||||
"/resources2/?format=json&refine=true&fields=country&&type=organizations&fq=(reldatasourcecompatibilityid exact driver or reldatasourcecompatibilityid exact driver-openaire2.0 or reldatasourcecompatibilityid exact openaire2.0 or reldatasourcecompatibilityid exact openaire3.0 or reldatasourcecompatibilityid exact openaire4.0 or reldatasourcecompatibilityid exact openaire-cris_1.1 or reldatasourcecompatibilityid exact openaire2.0_data or reldatasourcecompatibilityid exact hostedBy or relproject=*)&page=0&size=0&minRef=true",
|
||||
|
||||
"/projects/?format=json&refine=true&page=1&size=0&fields=funder",
|
||||
"/resources2/?format=json&size=0&type=organizations&fq=(reldatasourcecompatibilityid exact driver or reldatasourcecompatibilityid exact driver-openaire2.0 or reldatasourcecompatibilityid exact openaire2.0 or reldatasourcecompatibilityid exact openaire3.0 or reldatasourcecompatibilityid exact openaire4.0 or reldatasourcecompatibilityid exact openaire-cris_1.1 or reldatasourcecompatibilityid exact openaire2.0_data or reldatasourcecompatibilityid exact hostedBy or relproject=*)",
|
||||
|
||||
// "/projects/?format=json&refine=true&page=1&size=0&fields=funder",
|
||||
"/projects/?fields=funder&sf=funder&format=json&size=0",
|
||||
"/results/?fields=relfunder&sf=relfunder&format=json&size=0",
|
||||
|
||||
"/resources/?format=json&query=( oaftype exact datasource and (eoscdatasourcetype exact \"Journal Archive\" or eoscdatasourcetype exact \"Repository\"))&refine=true&fields=datasourcetypename&fields=country&fields=datasourceodsubjects&fields=datasourceodcontenttypes&fields=datasourcecompatibilityname&fields=datasourcethematic&fields=datasourcejurisdiction&&type=datasources&page=0&size=0",
|
||||
|
||||
"/search/v2/api/datasources/count?format=json", "/search/v2/api/publications/count?format=json", "/search/v2/api/datasets/count?format=json", "/search/v2/api/software/count?format=json", "/search/v2/api/other/count?format=json",
|
||||
"relresulttype%3Dpublication"
|
||||
"relresulttype%3Dpublication",
|
||||
|
||||
"/resources2/?format=json&size=0&type=projects",
|
||||
"/resources2/?format=json&size=0&type=datasources",
|
||||
"/resources2/?format=json&size=0&type=results",
|
||||
"/resources2/?format=json&size=0&type=results&fq=resultbestaccessright%20exact%20%22Open%20Access%22"
|
||||
];
|
||||
|
||||
|
||||
|
@ -53,7 +63,8 @@ export class CacheInterceptorService implements HttpInterceptor {
|
|||
if (!properties.useLongCache) {
|
||||
return false;
|
||||
}
|
||||
if(url.indexOf("refine=true") !== -1 || url.indexOf("/count?format=json") !== -1 || url.indexOf("relresulttype%3Dpublication") !== -1) {
|
||||
if(url.indexOf("sf=") !== -1 || url.indexOf("refine=true") !== -1 || url.indexOf("/count?format=json") !== -1 || url.indexOf("relresulttype%3Dpublication") !== -1 ||
|
||||
(url.indexOf("?format=json&size=0&type=") !== -1 && url.indexOf("query=") == -1)) {
|
||||
return this.cachingRequests.some(partUrl => (url.indexOf(partUrl) !== -1));
|
||||
}
|
||||
return false;
|
||||
|
|
|
@ -1,14 +1,16 @@
|
|||
<div *ngIf="showOptions && showOptions.linkToEntities.length > 0" class="uk-width-xlarge@l uk-width-large" [ngClass]="centerAlign ? 'uk-align-center':''">
|
||||
<advanced-search-input (searchEmitter)="search(true)">
|
||||
<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.RESULTS.toLowerCase() + '...'" tooltip="true"></div>
|
||||
</advanced-search-input>
|
||||
</div>
|
||||
<div *ngIf="!showOptions" class="uk-width-xlarge@l uk-width-large">
|
||||
<div search-input [(value)]="keyword" [placeholder]="'Search for ' + openaireEntities.RESULTS.toLowerCase() + '...'"
|
||||
[searchInputClass]="'inner background'" (searchEmitter)="search(true)"></div>
|
||||
<div class="uk-flex uk-flex-center uk-flex-left@m">
|
||||
<div *ngIf="showOptions && showOptions.linkToEntities.length > 0" class="uk-width-xlarge@l uk-width-large" [ngClass]="centerAlign ? 'uk-align-center':''">
|
||||
<advanced-search-input (searchEmitter)="search(true)">
|
||||
<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.RESULTS.toLowerCase() + '...'" tooltip="true"></div>
|
||||
</advanced-search-input>
|
||||
</div>
|
||||
<div *ngIf="!showOptions" class="uk-width-xlarge@l uk-width-large">
|
||||
<div search-input [(value)]="keyword" [placeholder]="'Search for ' + openaireEntities.RESULTS.toLowerCase() + '...'"
|
||||
[searchInputClass]="'inner background'" (searchEmitter)="search(true)"></div>
|
||||
</div>
|
||||
</div>
|
||||
<div *ngIf="!showSearchResults">
|
||||
<div class="uk-text-center uk-text-large uk-text-meta uk-margin-large-top">
|
||||
|
|
|
@ -865,7 +865,7 @@ export class ClaimResultSearchFormComponent {
|
|||
}
|
||||
|
||||
}
|
||||
|
||||
filter.countAllValues = filter.values.length;
|
||||
}
|
||||
return filters;
|
||||
}
|
||||
|
|
|
@ -63,7 +63,7 @@
|
|||
<div class="uk-width-expand">
|
||||
<div class="uk-margin-bottom">
|
||||
<claim-entity [entity]="claim.target" [type]="claim.targetType" [properties]=properties
|
||||
[externalPortalUrl]=externalPortalUrl [source]="true"></claim-entity>
|
||||
[externalPortalUrl]=externalPortalUrl [source]="true" [linkAvailable]="isClaimAvailable(claim)"></claim-entity>
|
||||
</div>
|
||||
<div class="uk-margin-bottom">
|
||||
<span *ngIf="isClaimAvailable(claim) else notAvailable" class="uk-label uk-label-success"
|
||||
|
|
|
@ -111,9 +111,11 @@ export class DisplayClaimsComponent implements OnInit, OnDestroy {
|
|||
this.updateUrl(this.url);
|
||||
this.subscriptions.push(this._piwikService.trackView(this.properties, this.pageTitle).subscribe());
|
||||
|
||||
this.subscriptions.push(this.helper.getPageHelpContents(this.properties, this.communityId, this._router.url).subscribe(contents => {
|
||||
this.pageContents = contents;
|
||||
}));
|
||||
if(properties.adminToolsPortalType !== "explore") {
|
||||
this.subscriptions.push(this.helper.getPageHelpContents(this.properties, this.communityId, this._router.url).subscribe(contents => {
|
||||
this.pageContents = contents;
|
||||
}));
|
||||
}
|
||||
this.subscriptions.push(this.indexInfoService.getLastIndexDate(this.properties).subscribe(res => {
|
||||
this.lastIndexDate = res;
|
||||
}));
|
||||
|
|
|
@ -17,7 +17,6 @@ import {HelperModule} from '../../../utils/helper/helper.module';
|
|||
import {Schema2jsonldModule} from '../../../sharedComponents/schema2jsonld/schema2jsonld.module';
|
||||
import { SEOServiceModule } from '../../../sharedComponents/SEO/SEOService.module';
|
||||
import {IndexInfoServiceModule} from "../../../utils/indexInfoService.module";
|
||||
import {PiwikServiceModule} from "../../../utils/piwik/piwikService.module";
|
||||
import {SearchInputModule} from '../../../sharedComponents/search-input/search-input.module';
|
||||
import {InputModule} from '../../../sharedComponents/input/input.module';
|
||||
import {LoadingModule} from '../../../utils/loading/loading.module';
|
||||
|
@ -30,7 +29,7 @@ import {link} from "../../../utils/icons/icons";
|
|||
@NgModule({
|
||||
imports: [
|
||||
CommonModule, FormsModule, RouterModule, ClaimServiceModule, LoadingModalModule, AlertModalModule,
|
||||
ClaimEntityFormatterModule, PagingModule, HelperModule, Schema2jsonldModule, SEOServiceModule, PiwikServiceModule,
|
||||
ClaimEntityFormatterModule, PagingModule, HelperModule, Schema2jsonldModule, SEOServiceModule,
|
||||
IndexInfoServiceModule, MatSelectModule, SearchInputModule, MatAutocompleteModule, MatChipsModule, MatFormFieldModule, MatSlideToggleModule, InputModule, LoadingModule, NoLoadPaging, IconsModule, DropdownFilterModule
|
||||
|
||||
],
|
||||
|
|
|
@ -18,7 +18,7 @@ import {StringUtils} from "../../../utils/string-utils.class";
|
|||
<div class="uk-flex">
|
||||
<span *ngIf="!source" class="uk-text-meta uk-margin-small-right uk-text-large uk-text-nowrap">Link to:</span>
|
||||
<publication-title [entity]="entity" param="id"
|
||||
path="/search/result" [externalPortalUrl]=externalPortalUrl></publication-title>
|
||||
path="/search/result" [externalPortalUrl]=externalPortalUrl [linkAvailable]="linkAvailable"></publication-title>
|
||||
</div>
|
||||
</div>
|
||||
<div *ngIf="type == 'project'" [attr.uk-tooptip]="getEntityName(type)"
|
||||
|
@ -40,6 +40,7 @@ export class ClaimEntityFormatter {
|
|||
@Input() properties: EnvProperties;
|
||||
@Input() externalPortalUrl: string = null;
|
||||
@Input() source: boolean = true;
|
||||
@Input() linkAvailable: boolean = true;
|
||||
public openAIREEntities = OpenaireEntities;
|
||||
|
||||
constructor() {
|
||||
|
|
|
@ -10,8 +10,8 @@ import {RouterHelper} from '../../../utils/routerHelper.class';
|
|||
<h6 class="uk-margin-remove multi-line-ellipsis lines-2">
|
||||
<p class="uk-margin-remove">
|
||||
<a *ngIf="!externalPortalUrl" [queryParams]="routerHelper.createQueryParam(param,entity.openaireId)"
|
||||
[routerLink]="path" class="uk-link uk-link-heading">{{entity.title?entity.title:"[No title available]"}}</a>
|
||||
<a *ngIf="externalPortalUrl" [href]="externalPortalUrl + path+'?'+param+'='+entity.openaireId" class="uk-link uk-link-heading custom-external">{{entity.title?entity.title:"[No title available]"}}</a>
|
||||
[routerLink]="path" class="uk-link uk-link-heading" [class.uk-disabled]="!linkAvailable">{{entity.title?entity.title:"[No title available]"}}</a>
|
||||
<a *ngIf="externalPortalUrl" [href]="externalPortalUrl + path+'?'+param+'='+entity.openaireId" class="uk-link uk-link-heading custom-external" [class.uk-disabled]="!linkAvailable">{{entity.title?entity.title:"[No title available]"}}</a>
|
||||
</p>
|
||||
</h6>
|
||||
</ng-container>
|
||||
|
@ -23,5 +23,6 @@ export class PublicationTitleFormatter {
|
|||
@Input() path: string;
|
||||
@Input() entity: any;
|
||||
@Input() externalPortalUrl: string = null;
|
||||
@Input() linkAvailable: boolean = true;
|
||||
public routerHelper: RouterHelper = new RouterHelper();
|
||||
}
|
||||
|
|
|
@ -21,14 +21,38 @@ export class SearchOrcidService {
|
|||
let url = properties.searchOrcidURL + term + '/record';
|
||||
|
||||
return this.http.get(url, { headers: headers })
|
||||
//.map(res => res.json()['person'])
|
||||
.pipe(map(res => res['person']))
|
||||
.pipe(map(res => [res['name']['given-names'],
|
||||
res['name']['family-name'],
|
||||
res['name']]))
|
||||
.pipe(map(res => SearchOrcidService.parseOrcidAuthor(res, authorIds, authors, addId)));
|
||||
}
|
||||
//.map(res => res.json()['person'])
|
||||
.pipe(map(res => res['person']))
|
||||
.pipe(map(res => [res['name']['given-names'],
|
||||
res['name']['family-name'],
|
||||
res['name'], res['name']['institution-name']]))
|
||||
|
||||
.pipe(map(res => SearchOrcidService.parseOrcidAuthor(res, authorIds, authors, addId)));
|
||||
}
|
||||
searchOrcidSingleAuthor(term: string, properties: EnvProperties, addId): any {
|
||||
|
||||
//var headers = new Headers();
|
||||
//headers.append('Accept', 'application/orcid+json');
|
||||
let headers = new HttpHeaders({'Accept': 'application/orcid+json'});
|
||||
|
||||
let url ="https://pub.orcid.org/v3.0/expanded-search/?q=orcid:" + term + '&start=0&rows=50';
|
||||
return this.http.get(url, {headers: headers})
|
||||
.pipe(map(res => res['expanded-result']))
|
||||
.pipe(map(res => {
|
||||
if(res) {
|
||||
for (let auth_result of res) {
|
||||
const author = {};
|
||||
author['id'] = auth_result['orcid-id'];
|
||||
author['authorGivenName'] = auth_result['given-names'];
|
||||
author['authorFamilyName'] = auth_result['family-names'];
|
||||
author['institutions'] = auth_result['institution-name'];
|
||||
return author;
|
||||
}
|
||||
}
|
||||
return null;
|
||||
|
||||
}));
|
||||
}
|
||||
searchOrcidAuthors(term: string,
|
||||
properties: EnvProperties): any {
|
||||
|
||||
|
@ -45,17 +69,46 @@ export class SearchOrcidService {
|
|||
|
||||
}
|
||||
|
||||
searchOrcidAuthorsNew(term: string,
|
||||
properties: EnvProperties, size = 10): any {
|
||||
let headers = new HttpHeaders({'Accept': 'application/orcid+json'});
|
||||
// let url = properties.searchOrcidURL+'search?defType=edismax&q='+term+'&qf=given-name^1.0+family-name^2.0+other-names^1.0+credit-name^1.0&start=0&rows=10';
|
||||
let url = /*properties.searchOrcidURL +*/ 'https://pub.orcid.org/v3.0/expanded-search?q=' + StringUtils.URIEncode('{!edismax qf="given-and-family-names^50.0 family-name^10.0 given-names^10.0 credit-name^10.0 other-names^5.0 text^1.0" pf="given-and-family-names^50.0" bq="current-institution-affiliation-name:[* TO *]^100.0 past-institution-affiliation-name:[* TO *]^70" mm=1}') + term + '&start=0&rows=' + size;
|
||||
// given-and-family-names^50.0 family-name^10.0 given-names^10.0 credit-name^10.0 other-names^5.0 text^1.0" pf="given-and-family-names^50.0" bq="current-institution-affiliation-name:[* TO *]^100.0 past-institution-affiliation-name:[* TO *]^70" mm=1}
|
||||
// https://pub.orcid.org/v3.0/expanded-search/?q=%7B!edismax%20qf%3D%22given-and-family-names%5E50.0%20family-name%5E10.0%20given-names%5E10.0%20credit-name%5E10.0%20other-names%5E5.0%20text%5E1.0%22%20pf%3D%22given-and-family-names%5E50.0%22%20bq%3D%22current-institution-affiliation-name%3A%5B*%20TO%20*%5D%5E100.0%20past-institution-affiliation-name%3A%5B*%20TO%20*%5D%5E70%22%20mm%3D1%7Dpaolo%20manghi&start=0&rows=50
|
||||
|
||||
//q={!edismax qf="given-and-family-names^50.0 family-name^10.0 given-names^5.0 credit-name^10.0 other-names^5.0 text^1.0" pf="given-and-family-names^50.0" mm=1}alessia bardi&start=0&rows=10
|
||||
let key = url;
|
||||
return this.http.get(url, {headers: headers})
|
||||
.pipe(map(res => res['expanded-result']))
|
||||
.pipe(map(res => {
|
||||
let authors = [];
|
||||
if(res) {
|
||||
for (let auth_result of res) {
|
||||
const author = {};
|
||||
author['id'] = auth_result['orcid-id'];
|
||||
author['authorGivenName'] = auth_result['given-names'];
|
||||
author['authorFamilyName'] = auth_result['family-names'];
|
||||
author['institutions'] = auth_result['institution-name'];
|
||||
authors.push(author);
|
||||
}
|
||||
}
|
||||
return authors;
|
||||
|
||||
}));
|
||||
}
|
||||
|
||||
searchOrcidPublications(id: string, properties: EnvProperties, parse: boolean = false): any {
|
||||
let headers = new HttpHeaders({'Accept': 'application/orcid+json'});
|
||||
let url = properties.searchOrcidURL + id + '/works';
|
||||
return this.http.get(url, { headers: headers })
|
||||
.pipe(map(res => res['group']))
|
||||
.pipe(map(request => (parse ? SearchOrcidService.parse(id, request) : request)));
|
||||
}
|
||||
return this.http.get(url, { headers: headers })
|
||||
.pipe(map(res => res['group']))
|
||||
.pipe(map(request => (parse ? SearchOrcidService.parse(id, request) : request)));
|
||||
}
|
||||
|
||||
|
||||
static parseOrcidAuthor(data: any, authorIds: string[], authors, addId): any {
|
||||
console.log(data)
|
||||
if (data[2] != null) {
|
||||
if (addId) {
|
||||
authorIds.push(data[2].path);
|
||||
|
@ -72,7 +125,12 @@ export class SearchOrcidService {
|
|||
} else {
|
||||
author['authorFamilyName'] = "";
|
||||
}
|
||||
if (data[3] != null) {
|
||||
author['institution'] = data[3];
|
||||
}
|
||||
console.log(author['institution'])
|
||||
authors.push(author);
|
||||
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
|
|
|
@ -0,0 +1,19 @@
|
|||
import { NgModule} from '@angular/core';
|
||||
import { CommonModule } from '@angular/common';
|
||||
import { FormsModule } from '@angular/forms';
|
||||
import {SearchOrcidService} from "./searchOrcid.service";
|
||||
|
||||
|
||||
@NgModule({
|
||||
imports: [
|
||||
CommonModule, FormsModule
|
||||
],
|
||||
declarations: [
|
||||
],
|
||||
providers:[
|
||||
SearchOrcidService
|
||||
],
|
||||
exports: [
|
||||
]
|
||||
})
|
||||
export class SearchOrcidServiceModule { }
|
|
@ -37,7 +37,6 @@ export class ClaimsAdminComponent {
|
|||
@Input() isConnect: boolean = false;
|
||||
@Input() externalPortalUrl: string;
|
||||
@Input() claimsInfoURL: string;
|
||||
@Input() userInfoURL: string;
|
||||
public user: User = null;
|
||||
sub;
|
||||
|
||||
|
|
|
@ -3,9 +3,6 @@ import { NgModule } from '@angular/core';
|
|||
import { SharedModule } from '../../../openaireLibrary/shared/shared.module';
|
||||
import { ClaimsAdminComponent } from './claimsAdmin.component';
|
||||
import {DisplayClaimsModule} from '../claim-utils/displayClaims/displayClaims.module';
|
||||
import { AdminLoginGuard} from'../../login/adminLoginGuard.guard';
|
||||
import {PreviousRouteRecorder} from '../../utils/piwik/previousRouteRecorder.guard';
|
||||
import {IsRouteEnabled} from '../../error/isRouteEnabled.guard';
|
||||
|
||||
@NgModule({
|
||||
imports: [
|
||||
|
@ -13,7 +10,7 @@ import {IsRouteEnabled} from '../../error/isRouteEnabled.guard';
|
|||
DisplayClaimsModule
|
||||
|
||||
],
|
||||
providers:[AdminLoginGuard, PreviousRouteRecorder,IsRouteEnabled],
|
||||
providers:[],
|
||||
declarations: [
|
||||
ClaimsAdminComponent
|
||||
],
|
||||
|
|
|
@ -29,7 +29,7 @@ export class DirectLinkingComponent {
|
|||
// linkTo: string = null; // entity type (project or context or entity)
|
||||
// linkToEntities: string[] = [];
|
||||
showOptions:ShowOptions = new ShowOptions();
|
||||
validEntityTypes = ["dataset", "publication", "software", "orp", "project", "context"];
|
||||
validEntityTypes = ["dataset", "publication", "software", "other", "project", "context"];
|
||||
sources: ClaimEntity[] = [];
|
||||
inlineEntity: ClaimEntity = null;
|
||||
validInput: boolean = null;//'true;
|
||||
|
@ -74,7 +74,7 @@ export class DirectLinkingComponent {
|
|||
this.getResearchResultById("dataset", this.id);
|
||||
} else if (this.type == "software") {
|
||||
this.getResearchResultById("software", this.id);
|
||||
} else if (this.type == "orp") {
|
||||
} else if (this.type == "other") {
|
||||
this.getResearchResultById("other", this.id);
|
||||
} else {
|
||||
this.validInput = this.isValidInput(null);
|
||||
|
@ -110,9 +110,9 @@ export class DirectLinkingComponent {
|
|||
return false;
|
||||
} else if (this.type == "project" && this.showOptions.linkTo != "result") {
|
||||
return false;
|
||||
} else if (["dataset", "publication", "software", "orp"].indexOf(this.type) != -1 && (["project", "context", "result"].indexOf(this.showOptions.linkTo) == -1)) {
|
||||
} else if (["dataset", "publication", "software", "other"].indexOf(this.type) != -1 && (["project", "context", "result"].indexOf(this.showOptions.linkTo) == -1)) {
|
||||
return false;
|
||||
} else if (["project", "dataset", "publication", "software", "orp"].indexOf(this.type) == -1) {
|
||||
} else if (["project", "dataset", "publication", "software", "other"].indexOf(this.type) == -1) {
|
||||
return false;
|
||||
} else {
|
||||
return true;
|
||||
|
|
|
@ -5,9 +5,6 @@ import { DirectLinkingComponent } from './directLinking.component';
|
|||
|
||||
import {EntitySearchServiceModule} from '../../utils/entitiesAutoComplete/entitySearchService.module';
|
||||
import {SearchResearchResultsServiceModule} from '../../services/searchResearchResultsService.module';
|
||||
import {LoginGuard} from'../../login/loginGuard.guard';
|
||||
import {PreviousRouteRecorder} from '../../utils/piwik/previousRouteRecorder.guard';
|
||||
import {IsRouteEnabled} from '../../error/isRouteEnabled.guard';
|
||||
import {Schema2jsonldModule} from '../../sharedComponents/schema2jsonld/schema2jsonld.module';
|
||||
import { SEOServiceModule } from '../../sharedComponents/SEO/SEOService.module';
|
||||
import {LinkingGenericModule} from '../linking/linkingGeneric.module';
|
||||
|
@ -18,7 +15,7 @@ import {LinkingGenericModule} from '../linking/linkingGeneric.module';
|
|||
EntitySearchServiceModule, SearchResearchResultsServiceModule,
|
||||
Schema2jsonldModule, SEOServiceModule, LinkingGenericModule
|
||||
],
|
||||
providers:[LoginGuard, PreviousRouteRecorder, IsRouteEnabled],
|
||||
providers:[],
|
||||
declarations: [
|
||||
DirectLinkingComponent
|
||||
], exports:[DirectLinkingComponent]
|
||||
|
|
|
@ -269,11 +269,16 @@ export class BulkClaimComponent {
|
|||
}
|
||||
},
|
||||
err => {
|
||||
//console.log(err);
|
||||
// console.log(err);
|
||||
BulkClaimComponent.handleError("Error getting crossref by DOIs: " + id, err);
|
||||
this.notFoundIds.push(id);
|
||||
this.notFoundIdsRow.push(row);
|
||||
this.endOfFetching();
|
||||
|
||||
if(err.status == 404) {
|
||||
this.searchInDatacite(id, accessMode, date, row);
|
||||
} else {
|
||||
this.notFoundIds.push(id);
|
||||
this.notFoundIdsRow.push(row);
|
||||
this.endOfFetching();
|
||||
}
|
||||
}
|
||||
));
|
||||
}
|
||||
|
|
|
@ -16,6 +16,7 @@ import {
|
|||
import {UserManagementService} from "../../../services/user-management.service";
|
||||
import {Subscriber, timer} from "rxjs";
|
||||
import {map} from "rxjs/operators";
|
||||
import {LogService} from "../../../utils/log/log.service";
|
||||
|
||||
@Component({
|
||||
selector: 'claim-insert',
|
||||
|
@ -59,7 +60,7 @@ import {map} from "rxjs/operators";
|
|||
})
|
||||
export class ClaimInsertComponent {
|
||||
constructor(private claimService: ClaimsService, private _router: Router, private route: ActivatedRoute,
|
||||
private userManagementService: UserManagementService) {
|
||||
private userManagementService: UserManagementService, private _logService: LogService) {
|
||||
}
|
||||
subscriptions = [];
|
||||
ngOnDestroy() {
|
||||
|
@ -127,6 +128,7 @@ export class ClaimInsertComponent {
|
|||
public feedRecordsJob;
|
||||
public claims2Insert;
|
||||
public records2Insert
|
||||
infoToLog = [];
|
||||
public insert() {
|
||||
this.confirmOpen();
|
||||
}
|
||||
|
@ -145,6 +147,7 @@ export class ClaimInsertComponent {
|
|||
this.errorInClaims = [];
|
||||
this.insertedRecords = [];
|
||||
this.errorInRecords = [];
|
||||
this.infoToLog = [];
|
||||
this.subscriptions.push(this.userManagementService.getUserInfo().subscribe(user => {
|
||||
if (!user) {
|
||||
this.saveAndNavigate();
|
||||
|
@ -190,10 +193,11 @@ export class ClaimInsertComponent {
|
|||
} else if (entity.project) {
|
||||
claims.push(ClaimInsertComponent.createProjectClaim(result, entity, user.email, dashboard));
|
||||
}
|
||||
|
||||
this.infoToLog.push([ result.title?result.title: result.id, entity.title?entity.title:entity.id]);
|
||||
|
||||
}
|
||||
if (this.inlineEntity) {
|
||||
this.infoToLog.push([ this.inlineEntity.title?this.inlineEntity.title: this.inlineEntity.id, entity.title?entity.title:entity.id]);
|
||||
if (this.inlineEntity.result) {
|
||||
if (entity.result) {
|
||||
|
||||
|
@ -256,6 +260,12 @@ export class ClaimInsertComponent {
|
|||
data => {
|
||||
this.claims2Insert = claims.length;
|
||||
this.claimsJob = data.data;
|
||||
if(this.properties.logServiceUrl) {
|
||||
for(let info of this.infoToLog) {
|
||||
this.subscriptions.push(this._logService.logLink(this.properties, info[0],info[1]).subscribe(res => {
|
||||
}));
|
||||
}
|
||||
}
|
||||
this.saveLocalStorage();
|
||||
let timerSubscription = timer(0, 10000).pipe(
|
||||
map(() => {
|
||||
|
@ -375,7 +385,7 @@ export class ClaimInsertComponent {
|
|||
localStorage.removeItem(this.localStoragePrefix + "claimsJob");
|
||||
localStorage.removeItem(this.localStoragePrefix + "feedRecordsJob");
|
||||
|
||||
this._router.navigate(['/myclaims'], {queryParams: this.params});
|
||||
this._router.navigate([this.properties.myClaimsLink], {queryParams: this.params});
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -557,8 +567,8 @@ export class ClaimInsertComponent {
|
|||
getStatus(){
|
||||
if(this.feedRecordsJob && ! (this.feedRecordsJob.status == "COMPLETE" || this.feedRecordsJob.status == "ERROR") ) {
|
||||
this.subscriptions.push(this.claimService.getStatus(this.feedRecordsJob.id, this.properties.claimsAPIURL).subscribe(data => {
|
||||
console.log("feed", data);
|
||||
this.feedRecordsJob = data.data;
|
||||
// console.log("feed", this.feedRecordsJob.status);
|
||||
if (this.feedRecordsJob.status == "COMPLETE" || data.data.status == "ERROR") {
|
||||
this.insertedRecords = this.feedRecordsJob.insertedIds;
|
||||
this.errorInRecords = this.feedRecordsJob.errorInClaims;
|
||||
|
@ -577,9 +587,9 @@ export class ClaimInsertComponent {
|
|||
}
|
||||
if(this.claimsJob) {
|
||||
this.subscriptions.push(this.claimService.getStatus(this.claimsJob.id, this.properties.claimsAPIURL).subscribe(data => {
|
||||
console.log("claim", data);
|
||||
this.claimsJob = data.data;
|
||||
if ((this.claimsJob.status == "COMPLETE" || data.data.status == "ERROR") && ( !this.feedRecordsJob || !(this.feedRecordsJob.status == "COMPLETE" || data.data.status == "ERROR")) ) {
|
||||
// console.log("claim: ", this.claimsJob.status, this.feedRecordsJob.status?this.feedRecordsJob.status:" no feed job");
|
||||
if ((this.claimsJob.status == "COMPLETE" || data.data.status == "ERROR") && ( !this.feedRecordsJob || (this.feedRecordsJob.status == "COMPLETE" || data.data.status == "ERROR")) ) {
|
||||
this.insertedClaims = this.claimsJob.insertedIds;
|
||||
this.errorInClaims = this.claimsJob.errorInClaims;
|
||||
|
||||
|
|
|
@ -6,10 +6,11 @@ import {LoadingModalModule} from '../../../utils/modal/loadingModal.module';
|
|||
import {ClaimInsertComponent} from './insertClaim.component';
|
||||
import {ClaimServiceModule} from '../../claim-utils/service/claimsService.module';
|
||||
import {IconsModule} from "../../../utils/icons/icons.module";
|
||||
import {LogServiceModule} from "../../../utils/log/LogService.module";
|
||||
|
||||
@NgModule({
|
||||
imports: [
|
||||
SharedModule, AlertModalModule, LoadingModalModule, ClaimServiceModule, IconsModule
|
||||
SharedModule, AlertModalModule, LoadingModalModule, ClaimServiceModule, IconsModule, LogServiceModule
|
||||
],
|
||||
declarations: [ClaimInsertComponent],
|
||||
exports:[ ClaimInsertComponent]
|
||||
|
|
|
@ -73,11 +73,11 @@
|
|||
<div id="tm-main" class="uk-section uk-padding-remove-top" *ngIf="showOptions.show != 'claim'">
|
||||
<div>
|
||||
<schema2jsonld *ngIf="url" [URL]="url" name="Link your {{openaireEntities.RESULTS}}" type="other"></schema2jsonld>
|
||||
<div [class]="((showOptions.show == 'claim')?'':' uk-margin-top ')+' uk-container uk-container-large '">
|
||||
<div class="uk-container uk-container-large">
|
||||
<div *ngIf="properties" class="uk-section uk-padding-remove-top">
|
||||
<div [class]="((showOptions.show == 'claim')?'':' uk-margin-top ')+' uk-container uk-container-large '">
|
||||
<div class="uk-container uk-container-large">
|
||||
<div class="uk-grid basketContainer" *ngIf="showOptions.show!='claim'" uk-grid>
|
||||
<div class="uk-width-2-3 uk-position-z-index">
|
||||
<div class="uk-width-2-3@m uk-position-z-index uk-flex-first@m uk-flex-last uk-margin-medium-top">
|
||||
<h2 *ngIf="inlineEntity" class="uk-text-center">Link source to</h2>
|
||||
<div *ngIf="showOptions.show=='source'">
|
||||
<claim-result-search-form [selectedResults]="sources" [properties]=properties
|
||||
|
@ -109,11 +109,11 @@
|
|||
</div>
|
||||
</div>
|
||||
<!-- Basket-->
|
||||
<div *ngIf="showOptions.show != 'claim'" class="uk-width-1-3">
|
||||
<div *ngIf="showOptions.show != 'claim'" class="uk-width-1-3@m uk-flex-last@m uk-flex-first uk-margin-medium-top">
|
||||
<div id="basket" uk-sticky="offset: 220; end: !*; media: @m" style="z-index: 0!important;">
|
||||
<div class="uk-card uk-card-default linkingBasket">
|
||||
<div class="uk-card-body uk-padding-small">
|
||||
<div class="uk-margin-right">
|
||||
<div>
|
||||
<ng-container *ngIf="inlineEntity">
|
||||
<div class="uk-margin-small-bottom">
|
||||
<div class="uk-text-emphasis uk-text-bolder">Source</div>
|
||||
|
@ -145,7 +145,7 @@
|
|||
</li>
|
||||
</ul>
|
||||
<div *ngIf="showOptions.basketShowSources">
|
||||
<div class="uk-height-medium uk-overflow-auto">
|
||||
<div class="uk-height-max-medium uk-overflow-auto uk-padding uk-padding-remove-left uk-padding-remove-vertical">
|
||||
<div *ngIf="showOptions.show == 'source'" class="uk-padding-small uk-padding-remove-horizontal" style="min-height:17px;">
|
||||
<start-over *ngIf="showOptions.show == 'source' && sources.length> 0"
|
||||
[results]="sources"
|
||||
|
@ -173,7 +173,7 @@
|
|||
</div>
|
||||
</div>
|
||||
<div *ngIf="showOptions.basketShowLinksTo">
|
||||
<div class="uk-height-medium uk-overflow-auto">
|
||||
<div class="uk-height-max-medium uk-overflow-auto uk-padding uk-padding-remove-left uk-padding-remove-vertical">
|
||||
<ng-container *ngTemplateOutlet="destinations_basket"></ng-container>
|
||||
</div>
|
||||
</div>
|
||||
|
|
|
@ -87,9 +87,11 @@ export class LinkingGenericComponent {
|
|||
|
||||
this.subscriptions.push(this._piwikService.trackView(this.properties, this.pageTitle).subscribe());
|
||||
|
||||
if(properties.adminToolsPortalType !== "explore") {
|
||||
this.helper.getPageHelpContents(this.properties, this.communityId, this._router.url).subscribe(contents => {
|
||||
this.pageContents = contents;
|
||||
})
|
||||
}
|
||||
|
||||
|
||||
if( typeof localStorage !== 'undefined') {
|
||||
|
@ -164,19 +166,19 @@ export class LinkingGenericComponent {
|
|||
stepHasChanged(stepId){
|
||||
|
||||
if(stepId == 'source'){
|
||||
console.log("show source")
|
||||
// console.log("show source")
|
||||
this.showOptions.showSource();
|
||||
}else if(stepId == 'target'){
|
||||
console.log("show target")
|
||||
// console.log("show target")
|
||||
this.showOptions.show = this.showOptions.linkTo;
|
||||
this.showOptions.showLinkTo();
|
||||
}else if(stepId == 'claim'){
|
||||
console.log("show target")
|
||||
// console.log("show target")
|
||||
this.showOptions.show = 'claim';
|
||||
}
|
||||
this.cdr.detectChanges();
|
||||
HelperFunctions.scroll(true);
|
||||
console.log('stepHasChanged', stepId, this.showOptions.show)
|
||||
// console.log('stepHasChanged', stepId, this.showOptions.show)
|
||||
}
|
||||
|
||||
stepStatus(stepId){
|
||||
|
|
|
@ -7,20 +7,16 @@ import {SelectedContextsModule} from './selected/selectedContexts.module';
|
|||
import {SelectedPublicationsModule} from './selected/selectedResults.module';
|
||||
import {LinkingGenericComponent} from './linkingGeneric.component';
|
||||
import {StartOverModule} from '../claim-utils/startOver.module';
|
||||
import {LoginGuard} from '../../login/loginGuard.guard';
|
||||
import {PreviousRouteRecorder} from '../../utils/piwik/previousRouteRecorder.guard';
|
||||
import {ClaimContextSearchFormModule} from '../claim-utils/claimContextSearchForm.module';
|
||||
import {ClaimProjectsSearchFormModule} from '../claim-utils/claimProjectSearchForm.module';
|
||||
import {BulkClaimModule} from './bulkClaim/bulkClaim.module';
|
||||
import {ClaimResultSearchFormModule} from '../claim-utils/claimResultSearchForm.module';
|
||||
import {HelperModule} from '../../utils/helper/helper.module';
|
||||
import {IsRouteEnabled} from '../../error/isRouteEnabled.guard';
|
||||
import {Schema2jsonldModule} from '../../sharedComponents/schema2jsonld/schema2jsonld.module';
|
||||
import {SEOServiceModule} from '../../sharedComponents/SEO/SEOService.module';
|
||||
import {MetadataPreviewModule} from './selected/metadataPreview.module';
|
||||
import {ClaimEntitiesMetadataModule} from "./selected/ClaimEntitiesMetadata.module";
|
||||
import {AlertModalModule} from '../../utils/modal/alertModal.module';
|
||||
import {PiwikServiceModule} from "../../utils/piwik/piwikService.module";
|
||||
import {BreadcrumbsModule} from "../../utils/breadcrumbs/breadcrumbs.module";
|
||||
import {StepperModule} from "../../sharedComponents/stepper/stepper.module";
|
||||
import {IconsModule} from "../../utils/icons/icons.module";
|
||||
|
@ -34,10 +30,9 @@ import {link} from "../../utils/icons/icons";
|
|||
StartOverModule,
|
||||
ClaimContextSearchFormModule, ClaimProjectsSearchFormModule, BulkClaimModule, ClaimResultSearchFormModule,
|
||||
HelperModule, Schema2jsonldModule, SEOServiceModule, MetadataPreviewModule, ClaimEntitiesMetadataModule, AlertModalModule,
|
||||
PiwikServiceModule,
|
||||
MatSelectModule, BreadcrumbsModule, StepperModule, IconsModule
|
||||
],
|
||||
providers: [LoginGuard, PreviousRouteRecorder, IsRouteEnabled],
|
||||
providers: [],
|
||||
declarations: [
|
||||
LinkingGenericComponent
|
||||
], exports: [
|
||||
|
|
|
@ -30,7 +30,6 @@ import {Subscriber} from "rxjs";
|
|||
export class MyClaimsComponent {
|
||||
@Input() claimsInfoURL: string;
|
||||
@Input() communityId:string;
|
||||
@Input() userInfoURL: string;
|
||||
public user: User = null;
|
||||
|
||||
constructor(private userManagementService: UserManagementService, private _router: Router) {}
|
||||
|
|
|
@ -3,9 +3,6 @@ import { NgModule } from '@angular/core';
|
|||
import { SharedModule } from '../../../openaireLibrary/shared/shared.module';
|
||||
import { MyClaimsComponent } from './myClaims.component';
|
||||
import {DisplayClaimsModule} from '../claim-utils/displayClaims/displayClaims.module';
|
||||
import {LoginGuard} from'../../login/loginGuard.guard';
|
||||
import {PreviousRouteRecorder} from '../../utils/piwik/previousRouteRecorder.guard';
|
||||
import {IsRouteEnabled} from '../../error/isRouteEnabled.guard';
|
||||
|
||||
@NgModule({
|
||||
imports: [
|
||||
|
@ -13,7 +10,7 @@ import {IsRouteEnabled} from '../../error/isRouteEnabled.guard';
|
|||
DisplayClaimsModule
|
||||
|
||||
],
|
||||
providers:[LoginGuard, PreviousRouteRecorder, IsRouteEnabled],
|
||||
providers:[],
|
||||
declarations: [
|
||||
MyClaimsComponent
|
||||
], exports: [MyClaimsComponent]
|
||||
|
|
|
@ -6,6 +6,9 @@ import {CommunityInfo} from "./community/communityInfo";
|
|||
export class ConnectHelper {
|
||||
|
||||
public static getCommunityFromDomain(domain: string): string{
|
||||
if(properties.dashboard === 'irish') {
|
||||
return properties.adminToolsCommunity;
|
||||
}
|
||||
if(properties.environment == "development" &&
|
||||
(properties.adminToolsPortalType == "connect" || properties.adminToolsPortalType == "community"
|
||||
|| properties.adminToolsPortalType == "aggregator" || properties.adminToolsPortalType == "eosc")) {
|
||||
|
|
|
@ -1,55 +0,0 @@
|
|||
|
||||
<div *ngIf="!hidden" class="">
|
||||
<div *ngIf="showSaveResetButtons" class="uk-article-title custom-article-title">
|
||||
User Email Preferences for Claims Notifications
|
||||
</div>
|
||||
|
||||
<div *ngIf="userValidMessage.length > 0" class = "uk-alert uk-alert-danger uk-animation-fade" role="alert">
|
||||
{{userValidMessage}}
|
||||
</div>
|
||||
<div *ngIf="savedMessage.length > 0" class="uk-alert uk-alert-success uk-animation-fade" role="alert">
|
||||
{{savedMessage}}
|
||||
</div>
|
||||
<errorMessages [status]="[status]" [type]="'notification preferences'"></errorMessages>
|
||||
|
||||
|
||||
<div *ngFor="let notification of notifications; let i=index" >
|
||||
<!-- <div class="uk-accordion-title">Email preferences for {{preferencesFor}}: <strong>{{notification.openaireName}}</strong></div>-->
|
||||
<!-- <div class="uk-accordion-content">-->
|
||||
<form class="uk-form-horizontal"><!-- [formGroup]="myForm"-->
|
||||
<!--[ngClass]="{'has-error':!myForm.controls.notify.valid && myForm.controls.notify.dirty}"-->
|
||||
<div class="uk-margin uk-grid">
|
||||
<div class=" inherit-color uk-width-medium"
|
||||
title="Get e-mail notification when there are new user links related your community">Notify
|
||||
for new user links:</div>
|
||||
|
||||
<mat-slide-toggle [checked]="notification.notify"
|
||||
(change)="($event.source.checked = notification.notify);changeNotify(notification, !notification.notify, i)"></mat-slide-toggle>
|
||||
</div>
|
||||
|
||||
<div *ngIf="notification.notify" [class]="notification.notify ? 'uk-margin' :
|
||||
'uk-margin cursor-not-allowed'">
|
||||
<div class="uk-form-label inherit-color">Frequency:</div>
|
||||
<div class="uk-form-controls">
|
||||
<select [class]="notification.notify ? 'uk-select' : 'uk-select uk-disabled'" id="form-horizontal-select"
|
||||
[(ngModel)]="notification.frequency" (ngModelChange)="changeFrequency(i)" name="select_frequency">
|
||||
<option [ngValue]="24" >Daily</option>
|
||||
<option [ngValue]="48" >Every two days</option>
|
||||
<option [ngValue]="168">Weekly</option>
|
||||
</select>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div *ngIf="showSaveResetButtons" class="uk-float-right">
|
||||
<button type="submit" class="uk-button uk-button-primary" (click)="saveNotification(i)">Save Changes</button>
|
||||
<button type="submit" class="uk-button" (click)="restoreNotification(i)">Reset</button>
|
||||
</div>
|
||||
|
||||
</form>
|
||||
|
||||
</div>
|
||||
<!-- </div>-->
|
||||
<!-- </ul>-->
|
||||
|
||||
</div>
|
||||
|
|
@ -1,259 +0,0 @@
|
|||
import {Component, Input} from '@angular/core';
|
||||
import {Location} from '@angular/common';
|
||||
import {ActivatedRoute, Router} from '@angular/router';
|
||||
import {Session} from '../../login/utils/helper.class';
|
||||
import {EnvProperties} from '../../utils/properties/env-properties';
|
||||
import {MailPrefsService} from './mailPrefs.service';
|
||||
import {ConnectHelper} from '../connectHelper';
|
||||
import {ErrorCodes} from '../../utils/properties/errorCodes';
|
||||
import {ErrorMessagesComponent} from '../../utils/errorMessages.component';
|
||||
import {LoginErrorCodes} from '../../login/utils/guardHelper.class';
|
||||
import {properties} from "../../../../environments/environment";
|
||||
import {Subscriber} from "rxjs";
|
||||
|
||||
declare var UIkit: any;
|
||||
|
||||
@Component({
|
||||
selector: 'mailPrefs',
|
||||
templateUrl: 'mailPrefs.component.html',
|
||||
providers:[MailPrefsService]
|
||||
|
||||
})
|
||||
export class MailPrefsComponent {
|
||||
properties:EnvProperties;
|
||||
subscriptions = [];
|
||||
@Input() communityId: string;
|
||||
public preferencesFor: string = "community";
|
||||
public status: number;
|
||||
|
||||
public notifications = [];
|
||||
public initialNotifications = [];
|
||||
public prefsChanged = {};
|
||||
public hidden: boolean = true;
|
||||
|
||||
//public showForbiddenMessage:boolean = false;
|
||||
public userValidMessage:string = "";
|
||||
public savedMessage: string = "";
|
||||
|
||||
private errorCodes: ErrorCodes;
|
||||
private errorMessages: ErrorMessagesComponent;
|
||||
|
||||
@Input() showSaveResetButtons: boolean = true;
|
||||
|
||||
constructor (private _mailPrefsService: MailPrefsService, private route: ActivatedRoute, private _router:Router, private location: Location) {
|
||||
this.errorCodes = new ErrorCodes();
|
||||
this.errorMessages = new ErrorMessagesComponent();
|
||||
this.status = this.errorCodes.LOADING;
|
||||
}
|
||||
|
||||
ngOnInit() {
|
||||
this.properties = properties;
|
||||
this.subscriptions.push(this.route.params.subscribe(params => {
|
||||
this.hidden = true;
|
||||
console.debug(this.communityId);
|
||||
if(!this.communityId){
|
||||
this.communityId = ConnectHelper.getCommunityFromDomain(this.properties.domain);
|
||||
}
|
||||
if(!this.communityId) {
|
||||
this.communityId = params['community'];
|
||||
}
|
||||
console.debug(this.communityId, params)
|
||||
this.getEmailPreferences();
|
||||
}));
|
||||
|
||||
|
||||
}
|
||||
|
||||
getEmailPreferences() {
|
||||
if(!Session.isLoggedIn()){
|
||||
//this.userValidMessage = "User session has expired. Please login again.";
|
||||
if(this.showSaveResetButtons) {
|
||||
this._router.navigate(['/user-info'], { queryParams: { "errorCode": LoginErrorCodes.NOT_VALID, "redirectUrl": this._router.url} });
|
||||
}
|
||||
} else {
|
||||
this.status = this.errorCodes.LOADING;
|
||||
this.savedMessage = "";
|
||||
|
||||
if(this.communityId && this.communityId != "openaire") {
|
||||
this.preferencesFor = "community";
|
||||
this.subscriptions.push(this._mailPrefsService.getUserEmailPreferencesForCommunity(this.communityId, this.properties.claimsAPIURL).subscribe(
|
||||
data => {
|
||||
if(data.code == "204") {
|
||||
this.status = this.errorCodes.NONE;
|
||||
this.initialNotifications = [{notify: true, frequency:24, openaireId: this.communityId}];
|
||||
} else {
|
||||
this.initialNotifications = data.data;
|
||||
}
|
||||
this.notifications = JSON.parse(JSON.stringify( this.initialNotifications ));
|
||||
|
||||
this.status = this.errorCodes.DONE;
|
||||
this.hidden = false;
|
||||
|
||||
},
|
||||
err => {
|
||||
this.hidden = false;
|
||||
this.handleErrors(err);
|
||||
this.handleError("Error getting user email preferences for community with id: "+this.communityId, err);
|
||||
}
|
||||
));
|
||||
} else {
|
||||
this.preferencesFor = "project";
|
||||
this.subscriptions.push(this._mailPrefsService.getUserEmailPreferencesForOpenaire(this.properties.claimsAPIURL).subscribe(
|
||||
data => {
|
||||
|
||||
if(data.code == "204") {
|
||||
this.status = this.errorCodes.NONE;
|
||||
} else {
|
||||
|
||||
this.initialNotifications = data.data;
|
||||
this.notifications = JSON.parse(JSON.stringify( this.initialNotifications ));
|
||||
//this.notifications = this.initialNotifications.map(x => Object.assign({}, x));
|
||||
//this.notifications = this.initialNotifications;
|
||||
|
||||
this.status = this.errorCodes.DONE;
|
||||
}
|
||||
},
|
||||
err => {
|
||||
//console.info(err);
|
||||
this.handleErrors(err);
|
||||
this.handleError("Error getting user email preferences for openaire", err);
|
||||
}
|
||||
));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
changeNotify(notification: any, checked: boolean, index: number) {
|
||||
if(!Session.isLoggedIn()){
|
||||
//this.userValidMessage = "User session has expired. Please login again.";
|
||||
if(this.showSaveResetButtons) {
|
||||
this._router.navigate(['/user-info'], { queryParams: { "errorCode": LoginErrorCodes.NOT_VALID, "redirectUrl": this._router.url} });
|
||||
}
|
||||
} else {
|
||||
this.savedMessage = "";
|
||||
this.status = this.errorCodes.DONE;
|
||||
notification.notify = checked;
|
||||
this.prefsChanged[index] = true;
|
||||
}
|
||||
}
|
||||
|
||||
changeFrequency(index: number) {
|
||||
if(!Session.isLoggedIn()){
|
||||
//this.userValidMessage = "User session has expired. Please login again.";
|
||||
if(this.showSaveResetButtons) {
|
||||
this._router.navigate(['/user-info'], { queryParams: { "errorCode": LoginErrorCodes.NOT_VALID, "redirectUrl": this._router.url} });
|
||||
}
|
||||
} else {
|
||||
this.savedMessage = "";
|
||||
this.status = this.errorCodes.DONE;
|
||||
if(this.initialNotifications[index].frequency != this.notifications[index].frequency) {
|
||||
this.prefsChanged[index] = true;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
saveNotification(index: number) {
|
||||
if(this.notifications.length > 0 && this.initialNotifications.length > 0) {
|
||||
if(!Session.isLoggedIn()){
|
||||
//this.userValidMessage = "User session has expired. Please login again.";
|
||||
if(this.showSaveResetButtons) {
|
||||
this._router.navigate(['/user-info'], { queryParams: { "errorCode": LoginErrorCodes.NOT_VALID, "redirectUrl": this._router.url} });
|
||||
}
|
||||
} else {
|
||||
if(JSON.stringify(this.notifications[index]) != JSON.stringify(this.initialNotifications[index])) {
|
||||
|
||||
this.status = this.errorCodes.LOADING;
|
||||
this.savedMessage = "";
|
||||
|
||||
this.subscriptions.push(this._mailPrefsService.saveUserEmailPreferences(this.notifications[index], this.properties.claimsAPIURL).subscribe(
|
||||
data => {
|
||||
this.initialNotifications[index] = JSON.parse(JSON.stringify( this.notifications[index] ));
|
||||
|
||||
this.status = this.errorCodes.DONE;
|
||||
|
||||
/*UIkit.notification({
|
||||
message : '<strong>Your email preferences for '+this.notifications[index].openaireName+' have been successfully changed<strong>',
|
||||
status : 'success',
|
||||
timeout : 3000,
|
||||
pos : 'top-center'
|
||||
});*/
|
||||
this.savedMessage = "Notification settings for claims saved!";
|
||||
},
|
||||
err => {
|
||||
//console.log(err);
|
||||
this.handleError("Error saving user email preferences: "+JSON.stringify(this.notifications[index]), err);
|
||||
this.status = this.errorCodes.NOT_SAVED;
|
||||
}
|
||||
));
|
||||
}
|
||||
else {
|
||||
/*UIkit.notification({
|
||||
message : '<strong>No changes selected for '+this.notifications[index].openaireName+' email preferences<strong>',
|
||||
status : 'primary',
|
||||
timeout : 3000,
|
||||
pos : 'top-center'
|
||||
});*/
|
||||
this.savedMessage = "Notification settings for claims saved!";
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
restoreNotification(index: number) {
|
||||
if(!Session.isLoggedIn()){
|
||||
//this.userValidMessage = "User session has expired. Please login again.";
|
||||
if(this.showSaveResetButtons) {
|
||||
this._router.navigate(['/user-info'], { queryParams: { "errorCode": LoginErrorCodes.NOT_VALID, "redirectUrl": this._router.url} });
|
||||
}
|
||||
} else {
|
||||
if(this.notifications.length > 0 && this.initialNotifications.length > 0) {
|
||||
this.status = this.errorCodes.LOADING;
|
||||
this.savedMessage = "";
|
||||
this.notifications[index] = JSON.parse(JSON.stringify( this.initialNotifications[index] ));
|
||||
this.status = this.errorCodes.DONE;
|
||||
this.prefsChanged[index] = false;
|
||||
}
|
||||
}
|
||||
}
|
||||
/*
|
||||
prefsChanged(index: number) : boolean {
|
||||
if(this.notifications.length > 0 && this.initialNotifications.length > 0) {
|
||||
if(JSON.stringify(this.notifications[index]) != JSON.stringify(this.initialNotifications[index])) {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
*/
|
||||
ngOnDestroy() {
|
||||
this.subscriptions.forEach(subscription => {
|
||||
if (subscription instanceof Subscriber) {
|
||||
subscription.unsubscribe();
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
|
||||
handleErrors(err){
|
||||
//this.showErrorMessage = true;
|
||||
//try{
|
||||
var code = "";
|
||||
if(!err.status) {
|
||||
var error = err.json();
|
||||
code = error.code;
|
||||
} else {
|
||||
code = err.status;
|
||||
}
|
||||
this.status = this.errorMessages.getErrorCode(code);
|
||||
}
|
||||
|
||||
private handleError(message: string, error) {
|
||||
console.error("User mail notification preferences Page (for claims): "+message, error);
|
||||
}
|
||||
|
||||
|
||||
//}catch (e) {
|
||||
//console.log("Couldn't parse answer as json")
|
||||
//this.showErrorMessage = true;
|
||||
//}
|
||||
}
|
|
@ -1,23 +0,0 @@
|
|||
import { NgModule} from '@angular/core';
|
||||
import { CommonModule } from '@angular/common';
|
||||
import { RouterModule } from '@angular/router';
|
||||
import { FormsModule, ReactiveFormsModule } from '@angular/forms';
|
||||
|
||||
import { MailPrefsComponent } from './mailPrefs.component';
|
||||
import { MailPrefsService } from './mailPrefs.service';
|
||||
import {ErrorMessagesModule} from '../../utils/errorMessages.module';
|
||||
import { MatSlideToggleModule } from '@angular/material/slide-toggle';
|
||||
|
||||
@NgModule({
|
||||
imports: [
|
||||
CommonModule, RouterModule, FormsModule, ReactiveFormsModule, ErrorMessagesModule, MatSlideToggleModule
|
||||
],
|
||||
declarations: [
|
||||
MailPrefsComponent
|
||||
],
|
||||
providers:[MailPrefsService],
|
||||
exports: [
|
||||
MailPrefsComponent
|
||||
]
|
||||
})
|
||||
export class MailPrefsModule { }
|
|
@ -15,9 +15,10 @@ import {LoadingModule} from "../../utils/loading/loading.module";
|
|||
|
||||
@NgModule({
|
||||
imports: [
|
||||
ClassesRoutingModule,
|
||||
CommonModule, RouterModule, FormsModule,
|
||||
AlertModalModule, ReactiveFormsModule, AdminToolServiceModule, InputModule,
|
||||
AdminTabsModule, PageContentModule, ClassesRoutingModule, SearchInputModule, IconsModule, LoadingModule
|
||||
AdminTabsModule, PageContentModule, SearchInputModule, IconsModule, LoadingModule
|
||||
],
|
||||
declarations: [DivIdsComponent],
|
||||
exports: [DivIdsComponent]
|
||||
|
|
|
@ -16,9 +16,10 @@ import {PageContentModule} from '../sharedComponents/page-content/page-content.m
|
|||
|
||||
@NgModule({
|
||||
imports: [
|
||||
ClassHelpContentFormRoutingModule,
|
||||
CommonModule, FormsModule, RouterModule,
|
||||
SafeHtmlPipeModule, CKEditorModule,
|
||||
AlertModalModule, ReactiveFormsModule, ClassHelpContentFormRoutingModule, AdminToolServiceModule, InputModule, MatSlideToggleModule, IconsModule, LoadingModule, PageContentModule
|
||||
AlertModalModule, ReactiveFormsModule, AdminToolServiceModule, InputModule, MatSlideToggleModule, IconsModule, LoadingModule, PageContentModule
|
||||
],
|
||||
declarations: [
|
||||
ClassContentFormComponent
|
||||
|
|
|
@ -19,8 +19,9 @@ import {PageContentModule} from '../sharedComponents/page-content/page-content.m
|
|||
|
||||
@NgModule({
|
||||
imports: [
|
||||
ClassHelpContentsRoutingModule,
|
||||
CommonModule, RouterModule, FormsModule, SafeHtmlPipeModule,
|
||||
AlertModalModule, ReactiveFormsModule, MatSlideToggleModule, AdminToolServiceModule, InputModule, ClassHelpContentsRoutingModule,
|
||||
AlertModalModule, ReactiveFormsModule, MatSlideToggleModule, AdminToolServiceModule, InputModule,
|
||||
SearchInputModule, IconsModule, LoadingModule, HTMLToStringPipeModule, PageContentModule
|
||||
],
|
||||
declarations: [
|
||||
|
|
|
@ -17,8 +17,9 @@ import {LogoUrlPipeModule} from "../../utils/pipes/logoUrlPipe.module";
|
|||
|
||||
@NgModule({
|
||||
imports: [
|
||||
EntitiesRoutingModule,
|
||||
CommonModule, RouterModule, FormsModule, AdminToolServiceModule,
|
||||
AlertModalModule, ReactiveFormsModule, MatSlideToggleModule, InputModule, PageContentModule, AdminTabsModule, EntitiesRoutingModule, SearchInputModule, IconsModule, LoadingModule, LogoUrlPipeModule
|
||||
AlertModalModule, ReactiveFormsModule, MatSlideToggleModule, InputModule, PageContentModule, AdminTabsModule, SearchInputModule, IconsModule, LoadingModule, LogoUrlPipeModule
|
||||
],
|
||||
declarations: [EntitiesComponent],
|
||||
exports: [EntitiesComponent]
|
||||
|
|
|
@ -16,9 +16,10 @@ import {MatSlideToggleModule} from "@angular/material/slide-toggle";
|
|||
|
||||
@NgModule({
|
||||
imports: [
|
||||
PageHelpContentFormRoutingModule,
|
||||
CommonModule, FormsModule, RouterModule,
|
||||
SafeHtmlPipeModule, CKEditorModule,
|
||||
AlertModalModule, ReactiveFormsModule, PageHelpContentFormRoutingModule, AdminToolServiceModule, InputModule, IconsModule, PageContentModule, LoadingModule, MatSlideToggleModule
|
||||
AlertModalModule, ReactiveFormsModule, AdminToolServiceModule, InputModule, IconsModule, PageContentModule, LoadingModule, MatSlideToggleModule
|
||||
],
|
||||
declarations: [PageContentFormComponent],
|
||||
exports: [PageContentFormComponent]
|
||||
|
|
|
@ -17,8 +17,9 @@ import {HTMLToStringPipeModule} from '../../utils/pipes/HTMLToStringPipe.module'
|
|||
|
||||
@NgModule({
|
||||
imports: [
|
||||
PageHelpContentsRoutingModule,
|
||||
CommonModule, RouterModule, FormsModule, SafeHtmlPipeModule,
|
||||
AlertModalModule, ReactiveFormsModule, MatSlideToggleModule, AdminToolServiceModule, InputModule, PageHelpContentsRoutingModule, PageContentModule,
|
||||
AlertModalModule, ReactiveFormsModule, MatSlideToggleModule, AdminToolServiceModule, InputModule, PageContentModule,
|
||||
SearchInputModule, IconsModule, LoadingModule, HTMLToStringPipeModule
|
||||
],
|
||||
declarations: [
|
||||
|
|
|
@ -18,8 +18,9 @@ import {LogoUrlPipeModule} from '../../utils/pipes/logoUrlPipe.module';
|
|||
|
||||
@NgModule({
|
||||
imports: [
|
||||
MenuRoutingModule,
|
||||
CommonModule, RouterModule, FormsModule, AdminToolServiceModule,
|
||||
AlertModalModule, ReactiveFormsModule, MatSlideToggleModule, InputModule, PageContentModule, AdminTabsModule, MenuRoutingModule, SearchInputModule, IconsModule, LoadingModule,
|
||||
AlertModalModule, ReactiveFormsModule, MatSlideToggleModule, InputModule, PageContentModule, AdminTabsModule, SearchInputModule, IconsModule, LoadingModule,
|
||||
TransitionGroupModule, LogoUrlPipeModule
|
||||
],
|
||||
declarations: [MenuComponent],
|
||||
|
|
|
@ -20,8 +20,9 @@ import {LogoUrlPipeModule} from "../../utils/pipes/logoUrlPipe.module";
|
|||
|
||||
@NgModule({
|
||||
imports: [
|
||||
PagesRoutingModule,
|
||||
CommonModule, RouterModule, FormsModule, AlertModalModule, ReactiveFormsModule, MatSlideToggleModule, AdminToolServiceModule, InputModule,
|
||||
MatAutocompleteModule, MatFormFieldModule, MatChipsModule, AdminTabsModule, PageContentModule, PagesRoutingModule, SearchInputModule, IconsModule, LoadingModule, LogoUrlPipeModule
|
||||
MatAutocompleteModule, MatFormFieldModule, MatChipsModule, AdminTabsModule, PageContentModule, SearchInputModule, IconsModule, LoadingModule, LogoUrlPipeModule
|
||||
],
|
||||
declarations: [PagesComponent],
|
||||
exports: [PagesComponent]
|
||||
|
|
|
@ -1,17 +1,18 @@
|
|||
import {Option} from "../../sharedComponents/input/input.component";
|
||||
import {StakeholderEntities} from "../../monitor/entities/stakeholder";
|
||||
import {StakeholderConfiguration} from "../../monitor-admin/utils/indicator-utils";
|
||||
|
||||
export class PortalUtils{
|
||||
export class PortalUtils {
|
||||
|
||||
portalTypes: Option[] = [
|
||||
{value: 'explore', label: 'Explore Portal'},
|
||||
{value: 'connect', label: 'Connect portal'},
|
||||
{value: 'monitor', label: 'Monitor portal'},
|
||||
{value: 'community', label: 'Community Gateway'},
|
||||
{value: 'funder', label: StakeholderEntities.FUNDER + ' Dashboard'},
|
||||
{value: 'ri', label: StakeholderEntities.RI + ' Dashboard'},
|
||||
{value: 'organization', label: StakeholderEntities.ORGANIZATION + ' Dashboard'},
|
||||
{value: 'project', label: StakeholderEntities.PROJECT + ' Dashboard'}
|
||||
{value: 'funder', label: StakeholderConfiguration.ENTITIES.funder + ' ' + StakeholderConfiguration.ENTITIES.stakeholder},
|
||||
{value: 'ri', label: StakeholderConfiguration.ENTITIES.ri + ' ' + StakeholderConfiguration.ENTITIES.stakeholder},
|
||||
{value: 'organization', label: StakeholderConfiguration.ENTITIES.organization + ' ' + StakeholderConfiguration.ENTITIES.stakeholder},
|
||||
{value: 'project', label: StakeholderConfiguration.ENTITIES.project + ' ' + StakeholderConfiguration.ENTITIES.stakeholder},
|
||||
{value: 'country', label: StakeholderConfiguration.ENTITIES.country + ' ' + StakeholderConfiguration.ENTITIES.stakeholder},
|
||||
];
|
||||
|
||||
}
|
||||
|
|
|
@ -15,9 +15,10 @@ import {LoadingModule} from "../../utils/loading/loading.module";
|
|||
|
||||
@NgModule({
|
||||
imports: [
|
||||
PortalsRoutingModule,
|
||||
CommonModule, FormsModule, AlertModalModule,
|
||||
ReactiveFormsModule,
|
||||
RouterModule, AdminToolServiceModule, InputModule, AdminTabsModule, PageContentModule, PortalsRoutingModule, IconsModule, SearchInputModule, LoadingModule
|
||||
RouterModule, AdminToolServiceModule, InputModule, AdminTabsModule, PageContentModule, IconsModule, SearchInputModule, LoadingModule
|
||||
],
|
||||
declarations: [PortalsComponent],
|
||||
exports: [PortalsComponent]
|
||||
|
|
|
@ -83,7 +83,11 @@ export class LayoutService {
|
|||
* Add hasStickyHeaderOnMobile: true in order to activate uk-sticky in header of mobile/tablet devices.
|
||||
* */
|
||||
private hasStickyHeaderOnMobileSubject: BehaviorSubject<boolean> = new BehaviorSubject<boolean>(false);
|
||||
|
||||
/**
|
||||
* Add a class in root element of the html. (For different theme apply)
|
||||
* Handle it manually in the component, it doesn't use data
|
||||
* */
|
||||
private rootClassSubject: BehaviorSubject<string> = new BehaviorSubject<string>(null);
|
||||
private subscriptions: any[] = [];
|
||||
|
||||
ngOnDestroy() {
|
||||
|
@ -329,4 +333,14 @@ export class LayoutService {
|
|||
setHasStickyHeaderOnMobile(value: boolean) {
|
||||
this.hasStickyHeaderOnMobileSubject.next(value);
|
||||
}
|
||||
|
||||
get rootClass(): Observable<string> {
|
||||
return this.rootClassSubject.asObservable();
|
||||
}
|
||||
|
||||
setRootClass(value: string = null): void {
|
||||
if(this.rootClassSubject.value != value) {
|
||||
this.rootClassSubject.next(value);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -28,6 +28,9 @@
|
|||
[class.hide-on-close]="backItem.icon">{{backItem.title}}</span>
|
||||
</a>
|
||||
</div>
|
||||
<div *ngIf="logoURL" id="sidebar_logo" class="uk-margin-top">
|
||||
<img [src]="logoURL">
|
||||
</div>
|
||||
<div *ngIf="items.length > 0" class="menu_section uk-margin-large-top" [class.mobile]="mobile" style="min-height: 30vh">
|
||||
<ul #nav class="uk-list uk-nav" [class.uk-list-large]="mobile"
|
||||
[class.uk-nav-default]="!mobile" [class.uk-nav-primary]="mobile" uk-nav="duration: 400">
|
||||
|
|
|
@ -28,6 +28,7 @@ export class SideBarComponent implements OnInit, AfterViewInit, OnDestroy, OnCha
|
|||
@Input() activeSubItem: string = '';
|
||||
@Input() backItem: MenuItem = null;
|
||||
@Input() queryParamsHandling;
|
||||
@Input() logoURL: string;
|
||||
@ViewChild("nav") nav: ElementRef;
|
||||
@ViewChild("sidebar_offcanvas") sidebar_offcanvas: ElementRef;
|
||||
public offset: number;
|
||||
|
|
|
@ -0,0 +1,48 @@
|
|||
import {ChangeDetectorRef, Directive, OnInit} from "@angular/core";
|
||||
import {BaseComponent} from "../../../sharedComponents/base/base.component";
|
||||
import {MenuItem} from "../../../sharedComponents/menu";
|
||||
import {LayoutService} from "./layout.service";
|
||||
|
||||
@Directive()
|
||||
export class SidebarBaseComponent extends BaseComponent implements OnInit {
|
||||
hasSidebar: boolean = false;
|
||||
hasInternalSidebar: boolean = false;
|
||||
hasAdminMenu: boolean = false;
|
||||
/**
|
||||
* Menu Items
|
||||
* */
|
||||
sideBarItems: MenuItem[] = [];
|
||||
adminMenuItems: MenuItem[] = [];
|
||||
backItem: MenuItem = null;
|
||||
|
||||
protected layoutService: LayoutService;
|
||||
protected cdr: ChangeDetectorRef;
|
||||
|
||||
constructor() {
|
||||
super();
|
||||
}
|
||||
|
||||
ngOnInit() {
|
||||
this.subscriptions.push(this.layoutService.hasSidebar.subscribe(hasSidebar => {
|
||||
this.hasSidebar = hasSidebar;
|
||||
this.cdr.detectChanges();
|
||||
}));
|
||||
this.subscriptions.push(this.layoutService.hasInternalSidebar.subscribe(hasInternalSidebar => {
|
||||
this.hasInternalSidebar = hasInternalSidebar;
|
||||
this.cdr.detectChanges();
|
||||
}));
|
||||
this.subscriptions.push(this.layoutService.hasAdminMenu.subscribe(hasAdminMenu => {
|
||||
this.hasAdminMenu = hasAdminMenu;
|
||||
this.cdr.detectChanges();
|
||||
}));
|
||||
this.layoutService.setOpen(true);
|
||||
}
|
||||
|
||||
public get open() {
|
||||
return this.layoutService.open;
|
||||
}
|
||||
|
||||
public get hover() {
|
||||
return this.layoutService.hover;
|
||||
}
|
||||
}
|
|
@ -8,14 +8,7 @@ import {
|
|||
SimpleChanges,
|
||||
ViewChild
|
||||
} from '@angular/core';
|
||||
import {
|
||||
UntypedFormArray,
|
||||
UntypedFormBuilder,
|
||||
UntypedFormControl,
|
||||
UntypedFormGroup,
|
||||
ValidatorFn,
|
||||
Validators
|
||||
} from '@angular/forms';
|
||||
import {UntypedFormArray, UntypedFormBuilder, UntypedFormGroup, ValidatorFn, Validators} from '@angular/forms';
|
||||
import {AlertModal} from "../../../utils/modal/alert";
|
||||
import {UserRegistryService} from "../../../services/user-registry.service";
|
||||
import {EnvProperties} from "../../../utils/properties/env-properties";
|
||||
|
@ -29,7 +22,6 @@ import {forkJoin, of, Subscription} from "rxjs";
|
|||
import {NotificationHandler} from "../../../utils/notification-handler";
|
||||
import {ClearCacheService} from "../../../services/clear-cache.service";
|
||||
import {catchError, map, tap} from "rxjs/operators";
|
||||
import notification = CKEDITOR.plugins.notification;
|
||||
import {InputComponent} from "../../../sharedComponents/input/input.component";
|
||||
|
||||
class InvitationResponse {
|
||||
|
@ -148,9 +140,8 @@ export class RoleUsersComponent implements OnInit, OnDestroy, OnChanges {
|
|||
updateLists() {
|
||||
this.loadActive = true;
|
||||
this.loadPending = true;
|
||||
this.subs.push(this.userRegistryService.getActive(this.type, this.id, this.role).subscribe(users => {
|
||||
this.subs.push(this.userRegistryService.getActive(this.type, this.id, this.role, true).subscribe(users => {
|
||||
this.active = users;
|
||||
// users.forEach(user => this.active.push(user));
|
||||
this.filterActiveBySearch(this.filterForm.value.active);
|
||||
this.loadActive = false;
|
||||
this.exists = true;
|
||||
|
@ -162,7 +153,7 @@ export class RoleUsersComponent implements OnInit, OnDestroy, OnChanges {
|
|||
}
|
||||
this.loadActive = false;
|
||||
}));
|
||||
this.subs.push(this.userRegistryService.getPending(this.type, this.id, this.role).subscribe(users => {
|
||||
this.subs.push(this.userRegistryService.getPending(this.type, this.id, this.role, true).subscribe(users => {
|
||||
this.pending = users;
|
||||
this.filterPendingBySearch(this.filterForm.value.pending);
|
||||
this.loadPending = false;
|
||||
|
@ -214,8 +205,8 @@ export class RoleUsersComponent implements OnInit, OnDestroy, OnChanges {
|
|||
this.createRoleModal.okButtonLeft = false;
|
||||
this.createRoleModal.okButtonText = 'Create';
|
||||
this.roleFb = this.fb.group({
|
||||
name: this.fb.control(Role.mapType(this.type) + '.' + this.id, Validators.required),
|
||||
description: this.fb.control(Role.mapType(this.type) + ' ' + this.id, Validators.required)
|
||||
name: this.fb.control(Role.roleName(this.type, this.id), Validators.required),
|
||||
description: this.fb.control(Role.roleName(this.type, this.id), Validators.required)
|
||||
});
|
||||
setTimeout(() => {
|
||||
this.roleFb.get('name').disable();
|
||||
|
@ -285,7 +276,7 @@ export class RoleUsersComponent implements OnInit, OnDestroy, OnChanges {
|
|||
if (!this.pending.includes(response.email)) {
|
||||
this.pending.push(response.email);
|
||||
}
|
||||
if(this.notificationFn) {
|
||||
if(this.notificationFn && properties.notificationsAPIURL) {
|
||||
return this.notificationService.sendNotification(this.notificationFn(this.name, response.email, this.role, response.invitation)).pipe(map(notification => {
|
||||
return notification;
|
||||
}), tap(() => {
|
||||
|
|
|
@ -105,7 +105,7 @@ export class SubscribersComponent implements OnInit, OnDestroy, OnChanges {
|
|||
|
||||
updateList() {
|
||||
this.loading = true;
|
||||
this.subs.push( this.userRegistryService.getActive(this.type, this.id, 'member').subscribe(users => {
|
||||
this.subs.push( this.userRegistryService.getActive(this.type, this.id, 'member', true).subscribe(users => {
|
||||
this.subscribers = users;
|
||||
this.filterBySearch(this.filterForm.value.keyword);
|
||||
this.loading = false;
|
||||
|
@ -141,8 +141,8 @@ export class SubscribersComponent implements OnInit, OnDestroy, OnChanges {
|
|||
this.createRoleModal.okButtonLeft = false;
|
||||
this.createRoleModal.okButtonText = 'create';
|
||||
this.roleFb = this.fb.group({
|
||||
name: this.fb.control(Role.mapType(this.type) + '.' + this.id, Validators.required),
|
||||
description: this.fb.control(Role.mapType(this.type) + ' ' + this.id, Validators.required)
|
||||
name: this.fb.control(Role.roleName(this.type, this.id), Validators.required),
|
||||
description: this.fb.control(Role.roleName(this.type, this.id), Validators.required)
|
||||
});
|
||||
setTimeout(() => {
|
||||
this.roleFb.get('name').disable();
|
||||
|
|
|
@ -15,7 +15,7 @@ import {FullScreenModalComponent} from '../utils/modal/full-screen-modal/full-sc
|
|||
@Component({
|
||||
selector: 'deposit-first-page',
|
||||
template: `
|
||||
<div class="deposit">
|
||||
<div>
|
||||
<div class="uk-container uk-container-large uk-section uk-section-small uk-padding-remove-bottom">
|
||||
<div class="uk-padding-small uk-padding-remove-horizontal">
|
||||
<breadcrumbs [breadcrumbs]="breadcrumbs"></breadcrumbs>
|
||||
|
|
|
@ -5,7 +5,6 @@ import { CommonModule } from '@angular/common';
|
|||
import { FormsModule } from '@angular/forms';
|
||||
import { RouterModule } from '@angular/router';
|
||||
|
||||
import {PiwikServiceModule} from '../utils/piwik/piwikService.module';
|
||||
import {HelperModule} from '../utils/helper/helper.module';
|
||||
import {Schema2jsonldModule} from '../sharedComponents/schema2jsonld/schema2jsonld.module';
|
||||
import { SEOServiceModule } from '../sharedComponents/SEO/SEOService.module';
|
||||
|
@ -18,7 +17,6 @@ import {FullScreenModalModule} from '../utils/modal/full-screen-modal/full-scree
|
|||
imports: [
|
||||
CommonModule, FormsModule,
|
||||
RouterModule,
|
||||
PiwikServiceModule,
|
||||
HelperModule,
|
||||
Schema2jsonldModule, SEOServiceModule, BreadcrumbsModule, SearchInputModule,
|
||||
FullScreenModalModule
|
||||
|
|
|
@ -9,7 +9,6 @@ import {SearchResultsModule } from '../searchPages/searchUtils/searchResults.mod
|
|||
|
||||
import {DataProvidersServiceModule} from '../services/dataProvidersService.module';
|
||||
import {SearchFormModule} from '../searchPages/searchUtils/searchForm.module';
|
||||
import {IsRouteEnabled} from '../error/isRouteEnabled.guard';
|
||||
import {SearchDataProvidersModule} from "../searchPages/searchDataProviders.module";
|
||||
import {BreadcrumbsModule} from "../utils/breadcrumbs/breadcrumbs.module";
|
||||
import {SearchInputModule} from "../sharedComponents/search-input/search-input.module";
|
||||
|
@ -25,7 +24,7 @@ import {SearchInputModule} from "../sharedComponents/search-input/search-input.m
|
|||
declarations: [
|
||||
SearchDataprovidersToDepositComponent
|
||||
],
|
||||
providers:[ IsRouteEnabled],
|
||||
providers:[],
|
||||
exports: [
|
||||
SearchDataprovidersToDepositComponent
|
||||
]
|
||||
|
|
|
@ -19,7 +19,7 @@
|
|||
<li *ngFor="let result of results">
|
||||
<result-preview [properties]="properties" [showOrganizations]="true"
|
||||
[showSubjects]="true" [result]="getResultPreview(result)" [promoteWebsiteURL]="true"
|
||||
[isCard]="true" deposit="true">
|
||||
[isCard]="true" deposit="true" [isMobile]="isMobile">
|
||||
</result-preview>
|
||||
</li>
|
||||
</ul>
|
||||
|
|
|
@ -19,6 +19,7 @@ export class SearchResultsInDepositComponent {
|
|||
@Input() status: number;
|
||||
@Input() type: string;
|
||||
@Input() properties:EnvProperties;
|
||||
@Input() isMobile: boolean = false;
|
||||
|
||||
|
||||
public urlParam: string;
|
||||
|
|
|
@ -11,7 +11,7 @@ import * as url from "url";
|
|||
@Injectable()
|
||||
export class ErrorInterceptorService implements HttpInterceptor {
|
||||
|
||||
private static UNAUTHORIZED_WHITELIST = [properties.userInfoUrl, properties.orcidAPIURL, properties.registryUrl? (properties.registryUrl + 'verification/'):null, properties.eoscDataTransferAPI].filter(value => !!value);
|
||||
private static UNAUTHORIZED_WHITELIST = [properties.orcidAPIURL, properties.registryUrl? (properties.registryUrl + 'verification/'):null, properties.eoscDataTransferAPI].filter(value => !!value);
|
||||
private url: string = null;
|
||||
|
||||
constructor(private router: Router) {
|
||||
|
|
|
@ -6,7 +6,9 @@ import {ConfigurationService} from '../utils/configuration/configuration.service
|
|||
import {ConnectHelper} from '../connect/connectHelper';
|
||||
import {properties} from "../../../environments/environment";
|
||||
|
||||
@Injectable()
|
||||
@Injectable({
|
||||
providedIn: 'root'
|
||||
})
|
||||
export class IsRouteEnabled {
|
||||
|
||||
constructor(private router: Router,
|
||||
|
|
|
@ -7,9 +7,9 @@
|
|||
<div class="uk-container uk-container-large uk-section" uk-scrollspy="target: [uk-scrollspy-class]; cls: uk-animation-slide-bottom-medium; delay: 200">
|
||||
<div class="uk-grid uk-grid-large uk-grid-stack uk-padding-small" uk-grid>
|
||||
<div class="uk-width-3-5@m uk-width-1-1@s uk-flex uk-flex-column uk-flex-center">
|
||||
<span class="uk-align-left uk-margin-remove-bottom">
|
||||
<span uk-scrollspy-class class="uk-text-large" style="color: #EEB204">Beta</span>
|
||||
</span>
|
||||
<!-- <span class="uk-align-left uk-margin-remove-bottom">-->
|
||||
<!-- <span uk-scrollspy-class class="uk-text-large" style="color: #EEB204">Beta</span>-->
|
||||
<!-- </span>-->
|
||||
<div style="max-width: 600px;">
|
||||
<h1 uk-scrollspy-class class="uk-h1 uk-margin-remove-top">
|
||||
<span>Fields of Science <span class="uk-text-primary">.</span></span>
|
||||
|
@ -113,7 +113,7 @@
|
|||
<div *ngFor="let subChild of child.children" style="margin-bottom: 5px;">
|
||||
<a [routerLink]="properties.searchLinkToResults" [queryParams]="buildFosQueryParam(subChild)"
|
||||
class="uk-link-text">
|
||||
{{subChild.label}}
|
||||
{{searchFieldsHelper.getFosParameter() == 'foslabel' ? subChild.label : subChild.id}}
|
||||
</a>
|
||||
</div>
|
||||
</div>
|
||||
|
@ -139,7 +139,7 @@
|
|||
</h3>
|
||||
<div *ngFor="let subSubItem of subItem.children" style="margin-bottom: 5px;">
|
||||
<a [routerLink]="properties.searchLinkToResults" [queryParams]="buildFosQueryParam(subSubItem)"
|
||||
class="uk-link-text" [innerHTML]="highlightKeyword(subSubItem.label)">
|
||||
class="uk-link-text" [innerHTML]="highlightKeyword(searchFieldsHelper.getFosParameter() == 'foslabel' ? subSubItem.label : subSubItem.id)">
|
||||
</a>
|
||||
</div>
|
||||
</div>
|
||||
|
|
|
@ -15,6 +15,7 @@ import {PiwikService} from "../utils/piwik/piwik.service";
|
|||
import {debounceTime, distinctUntilChanged} from "rxjs/operators";
|
||||
import Timeout = NodeJS.Timeout;
|
||||
import {ISVocabulariesService} from "../utils/staticAutoComplete/ISVocabularies.service";
|
||||
import {SearchFields} from "../utils/properties/searchFields";
|
||||
|
||||
declare var UIkit;
|
||||
|
||||
|
@ -46,6 +47,7 @@ export class FosComponent implements OnInit, OnDestroy {
|
|||
private timeout: Timeout;
|
||||
@ViewChild('tabs') tabs: ElementRef;
|
||||
public sliderInit: boolean = false;
|
||||
private searchFieldsHelper: SearchFields = new SearchFields();
|
||||
|
||||
constructor(
|
||||
private vocabulariesService: ISVocabulariesService,
|
||||
|
@ -217,6 +219,6 @@ export class FosComponent implements OnInit, OnDestroy {
|
|||
|
||||
public buildFosQueryParam(fos) {
|
||||
// return {'foslabel': this.urlEncodeAndQuote(fos.id+"||"+fos.label)};
|
||||
return (properties.environment !== 'production' ? ({'foslabel': this.urlEncodeAndQuote(fos.id+"||"+fos.label)}) : ({'fos': this.urlEncodeAndQuote(fos.id)}));
|
||||
return (this.searchFieldsHelper.getFosParameter() == 'foslabel' ? ({'foslabel': this.urlEncodeAndQuote(fos.id+"||"+fos.label)}) : ({'fos': this.urlEncodeAndQuote(fos.id)}));
|
||||
}
|
||||
}
|
||||
|
|
|
@ -2,13 +2,11 @@ import {CommonModule} from "@angular/common";
|
|||
import {NgModule} from "@angular/core";
|
||||
import {FormsModule} from "@angular/forms";
|
||||
import {RouterModule} from "@angular/router";
|
||||
import {PreviousRouteRecorder} from "../utils/piwik/previousRouteRecorder.guard";
|
||||
import {IconsModule} from "../utils/icons/icons.module";
|
||||
import {BreadcrumbsModule} from "../utils/breadcrumbs/breadcrumbs.module";
|
||||
import {Schema2jsonldModule} from "../sharedComponents/schema2jsonld/schema2jsonld.module";
|
||||
import {SearchInputModule} from "../sharedComponents/search-input/search-input.module";
|
||||
import {SEOServiceModule} from "../sharedComponents/SEO/SEOService.module";
|
||||
import {PiwikService} from "../utils/piwik/piwik.service";
|
||||
|
||||
import {FosRoutingModule} from './fos-routing.module';
|
||||
import {FosComponent} from './fos.component';
|
||||
|
@ -22,9 +20,7 @@ import {FosComponent} from './fos.component';
|
|||
declarations: [
|
||||
FosComponent
|
||||
],
|
||||
providers: [
|
||||
PreviousRouteRecorder, PiwikService
|
||||
],
|
||||
providers: [],
|
||||
exports: [
|
||||
FosComponent
|
||||
]
|
||||
|
|
|
@ -1,225 +0,0 @@
|
|||
import {
|
||||
Component,
|
||||
ElementRef,
|
||||
EventEmitter,
|
||||
HostListener,
|
||||
Input,
|
||||
OnDestroy,
|
||||
OnInit,
|
||||
Output,
|
||||
ViewChild
|
||||
} from "@angular/core";
|
||||
import {Annotation, AnnotationService} from "./annotation.service";
|
||||
import {ResultLandingInfo} from "../../utils/entities/resultLandingInfo";
|
||||
import {EnvProperties} from "../../utils/properties/env-properties";
|
||||
import {properties} from "../../../../environments/environment";
|
||||
import {UserManagementService} from "../../services/user-management.service";
|
||||
import {COOKIE, Session, User} from "../../login/utils/helper.class";
|
||||
import {Subscriber} from "rxjs";
|
||||
|
||||
@Component({
|
||||
selector: 'b2note',
|
||||
template: `
|
||||
<div *ngIf="annotations && annotations.length > 0" class="sideInfoTitle uk-margin-small-bottom">Annotations</div>
|
||||
<div class="b2note">
|
||||
<form #form ngNoForm *ngIf="pid && isLoggedIn"
|
||||
[action]="properties.b2noteAPIURL + 'widget'"
|
||||
method="post"
|
||||
target="b2note_iframe"
|
||||
class="uk-padding-small uk-padding-remove-vertical">
|
||||
<!--URL of the annotated record-->
|
||||
<input
|
||||
type="hidden"
|
||||
name="recordurl_tofeed"
|
||||
[value]="url">
|
||||
<!--PID of the annotated record-->
|
||||
<input
|
||||
type="hidden"
|
||||
name="pid_tofeed"
|
||||
[value]="pid">
|
||||
</form>
|
||||
<loading *ngIf="loading" class="uk-margin-medium-top"></loading>
|
||||
<ul *ngIf="annotations && !loading" class="uk-list uk-list-divider">
|
||||
<li *ngFor="let annotation of annotations.slice(0, visibleAnnotations); let i=index" uk-grid
|
||||
class="uk-flex uk-flex-top uk-margin-remove-left">
|
||||
<div [ngClass]="annotation.type" class="type">{{annotation.type}}</div>
|
||||
<div [class.uk-width-1-3]="annotation.targets"
|
||||
[class.uk-width-1-6@s]="annotation.targets">{{annotation.text}}</div>
|
||||
<ul class="uk-width-expand uk-list uk-margin-remove-top" *ngIf="annotation.targets">
|
||||
<li *ngFor="let target of annotation.targets.slice(0, annotation.targetSize)">
|
||||
<a *ngIf="target.url" [href]="target.url" target="_blank">{{target.id}}</a>
|
||||
<a *ngIf="!target.url" routerLink="/search/result"
|
||||
[queryParams]="searchPid(target.id)">{{target.id}}</a>
|
||||
</li>
|
||||
<li *ngIf="annotation.targetSize < annotation.targets.length"><a
|
||||
(click)="open(i)">+ {{annotation.targets.length - annotation.targetSize}}
|
||||
more</a></li>
|
||||
</ul>
|
||||
</li>
|
||||
</ul>
|
||||
<div *ngIf="visibleAnnotations < annotations.length" class="uk-margin-medium-top uk-text-center">
|
||||
<button class="uk-button uk-button-primary"
|
||||
(click)="visibleAnnotations = (visibleAnnotations + annotationSize)">Load More
|
||||
</button>
|
||||
</div>
|
||||
</div>
|
||||
<div [class.uk-hidden]="!visible">
|
||||
<div class="widget-container" cdkDrag>
|
||||
<button type="button" class="close" aria-label="Close" (click)="toggleAnnotation($event)">
|
||||
<span aria-hidden="true">×</span>
|
||||
</button>
|
||||
<iframe #iframe id="b2note_iframe" name="b2note_iframe" class="b2note-iframe">
|
||||
</iframe>
|
||||
</div>
|
||||
</div>`,
|
||||
styleUrls: ['annotation.css']
|
||||
})
|
||||
export class AnnotationComponent implements OnInit, OnDestroy {
|
||||
|
||||
@Input()
|
||||
public landingInfo: ResultLandingInfo = null;
|
||||
@Input()
|
||||
public id: string = null;
|
||||
public properties: EnvProperties = properties;
|
||||
public url: string = null;
|
||||
public pid: string = null;
|
||||
public keywords: string[] = [];
|
||||
public visible: boolean = false;
|
||||
public annotations: Annotation[] = [];
|
||||
public annotationSize: number = 10;
|
||||
public isLoggedIn: boolean = Session.isLoggedIn();
|
||||
public visibleAnnotations: number;
|
||||
public loading: boolean = false;
|
||||
public submitted: boolean = false;
|
||||
@Output()
|
||||
public pidEmitter: EventEmitter<string> = new EventEmitter<string>();
|
||||
@ViewChild('iframe') iframe: ElementRef;
|
||||
@ViewChild('form') form: ElementRef;
|
||||
private subscriptions: any[] = [];
|
||||
|
||||
constructor(private annotationService: AnnotationService) {
|
||||
}
|
||||
|
||||
@HostListener('window:message', ['$event'])
|
||||
public onChange(event) {
|
||||
if (this.properties.b2noteAPIURL.includes(event.origin)) {
|
||||
if (event.data === "B2NOTE loaded") {
|
||||
let token = COOKIE.getCookie('AccessToken');
|
||||
this.iframe.nativeElement.contentWindow.postMessage({token: token}, this.properties.b2noteAPIURL);
|
||||
} else {
|
||||
this.getAnnotations();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
ngOnInit(): void {
|
||||
this.visibleAnnotations = this.annotationSize;
|
||||
if (typeof window !== "undefined") {
|
||||
let id = this.id;
|
||||
this.url = window.location.href;
|
||||
if (this.landingInfo.deletedByInferenceIds) {
|
||||
id = this.landingInfo.deletedByInferenceIds[0];
|
||||
this.url = this.url.replace(this.id, id);
|
||||
}
|
||||
if (this.landingInfo.identifiers && this.landingInfo.identifiers.size > 0) {
|
||||
if (this.landingInfo.identifiers.get('doi')) {
|
||||
this.pid = this.landingInfo.identifiers.get('doi')[0];
|
||||
} else {
|
||||
const key: string = this.landingInfo.identifiers.keys().next().value;
|
||||
if (key) {
|
||||
this.pid = this.landingInfo.identifiers.get(key)[0];
|
||||
}
|
||||
}
|
||||
}
|
||||
if (this.pid) {
|
||||
this.getAnnotations();
|
||||
}
|
||||
this.pidEmitter.emit(this.pid);
|
||||
}
|
||||
}
|
||||
|
||||
public get enabled(): boolean {
|
||||
return this.pid && this.isLoggedIn;
|
||||
}
|
||||
|
||||
private clearSubscriptions() {
|
||||
this.subscriptions.forEach(subscription => {
|
||||
if (subscription instanceof Subscriber) {
|
||||
subscription.unsubscribe();
|
||||
}
|
||||
});
|
||||
this.subscriptions = [];
|
||||
}
|
||||
|
||||
private getAnnotations() {
|
||||
if (!this.annotations || this.annotations.length === 0) {
|
||||
this.loading = true;
|
||||
}
|
||||
this.subscriptions.push(this.annotationService.getAllAnnotations(this.pid).subscribe(annotations => {
|
||||
this.annotations.forEach((annotation, index) => {
|
||||
if (!annotations.find(element => element.type === annotation.type && element.text === annotation.text)) {
|
||||
this.annotations.splice(index, 1);
|
||||
}
|
||||
});
|
||||
annotations.forEach(annotation => {
|
||||
if (!this.annotations.find(element => element.type === annotation.type && element.text === annotation.text)) {
|
||||
annotation.targetSize = 3;
|
||||
this.annotationService.getAnnotationTargets(annotation.text, annotation.type).subscribe(targets => {
|
||||
annotation.targets = targets.filter(target => target.id !== this.pid);
|
||||
});
|
||||
this.annotations.push(annotation);
|
||||
}
|
||||
});
|
||||
this.annotations = this.sort(this.annotations);
|
||||
this.loading = false;
|
||||
}, error => {
|
||||
this.loading = false;
|
||||
}));
|
||||
}
|
||||
|
||||
public sort(annotations: Annotation[]): Annotation[] {
|
||||
return annotations.sort((a, b) => {
|
||||
if (a.type === b.type) {
|
||||
return 1;
|
||||
} else if (a.type === 'semantic') {
|
||||
return -1;
|
||||
} else if (b.type === 'semantic') {
|
||||
return 1;
|
||||
} else if (a.type === 'keyword') {
|
||||
return -1;
|
||||
} else if (b.type === 'keyword') {
|
||||
return 1;
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
public searchPid(pid: string): { [k: string]: any; } {
|
||||
return {
|
||||
pid: pid
|
||||
}
|
||||
}
|
||||
|
||||
ngOnDestroy() {
|
||||
this.clearSubscriptions();
|
||||
}
|
||||
|
||||
toggleAnnotation(event) {
|
||||
if (this.visible) {
|
||||
event.preventDefault();
|
||||
} else if(!this.submitted) {
|
||||
this.form.nativeElement.submit();
|
||||
this.submitted = true;
|
||||
}
|
||||
this.visible = !this.visible;
|
||||
}
|
||||
|
||||
open(i: number) {
|
||||
this.annotations.forEach((annotation, index) => {
|
||||
if (index != i) {
|
||||
annotation.targetSize = 3;
|
||||
} else {
|
||||
annotation.targetSize = annotation.targets.length
|
||||
}
|
||||
});
|
||||
}
|
||||
}
|
|
@ -1,41 +0,0 @@
|
|||
.widget-container {
|
||||
position: fixed;
|
||||
left: 50%;
|
||||
top: 50%;
|
||||
z-index: 1000;
|
||||
padding: 19px;
|
||||
margin-left: -167px;
|
||||
margin-top: -311px;
|
||||
box-shadow: 0 3px 1px -2px rgba(0, 0, 0, 0.2),
|
||||
0 2px 2px 0 rgba(0, 0, 0, 0.14),
|
||||
0 1px 5px 0 rgba(0, 0, 0, 0.12);
|
||||
border: 1px solid #e3e3e3;
|
||||
border-radius: 4px;
|
||||
outline: 0;
|
||||
min-height: 20px;
|
||||
background-color: #f5f5f5;
|
||||
cursor: move;
|
||||
}
|
||||
|
||||
.widget-container:hover, .widget-container:active{
|
||||
box-shadow: 0 5px 5px -3px rgba(0, 0, 0, 0.2),
|
||||
0 8px 10px 1px rgba(0, 0, 0, 0.14),
|
||||
0 3px 14px 2px rgba(0, 0, 0, 0.12);
|
||||
}
|
||||
|
||||
.close {
|
||||
float: right;
|
||||
padding: 0;
|
||||
cursor: pointer;
|
||||
background: transparent;
|
||||
border: 0;
|
||||
font-size: 21px;
|
||||
font-weight: bold;
|
||||
opacity: 0.2;
|
||||
}
|
||||
|
||||
.b2note-iframe {
|
||||
width: 100%;
|
||||
height: 600px;
|
||||
border: 1px solid #dddddd;
|
||||
}
|
|
@ -1,13 +0,0 @@
|
|||
import {NgModule} from "@angular/core";
|
||||
import {AnnotationComponent} from "./annotation.component";
|
||||
import {CommonModule} from "@angular/common";
|
||||
import {DragDropModule} from "@angular/cdk/drag-drop";
|
||||
import {RouterModule} from "@angular/router";
|
||||
import {LoadingModule} from "../../utils/loading/loading.module";
|
||||
|
||||
@NgModule({
|
||||
imports: [CommonModule, DragDropModule, RouterModule, LoadingModule],
|
||||
declarations: [AnnotationComponent],
|
||||
exports: [AnnotationComponent]
|
||||
})
|
||||
export class AnnotationModule {}
|
|
@ -1,95 +0,0 @@
|
|||
import {Injectable} from "@angular/core";
|
||||
import {HttpClient} from "@angular/common/http";
|
||||
import {Observable} from "rxjs";
|
||||
import {EnvProperties} from "../../utils/properties/env-properties";
|
||||
import {map} from "rxjs/operators";
|
||||
import {properties} from "../../../../environments/environment";
|
||||
|
||||
export interface AnnotationTarget {
|
||||
id: string;
|
||||
url: string;
|
||||
}
|
||||
|
||||
export interface Annotation {
|
||||
text: string;
|
||||
type: 'semantic' | 'keyword' | 'comment';
|
||||
targets?: AnnotationTarget[];
|
||||
targetSize?: number;
|
||||
}
|
||||
|
||||
@Injectable({
|
||||
providedIn: "root"
|
||||
})
|
||||
export class AnnotationService {
|
||||
|
||||
api = 'api/';
|
||||
|
||||
constructor(private http: HttpClient) {
|
||||
}
|
||||
|
||||
getAllAnnotations(source: string): Observable<Annotation[]> {
|
||||
let url = properties.b2noteAPIURL + this.api + 'annotations?target-id[]=' + encodeURIComponent(source);
|
||||
return this.http.get<Annotation[]>(url).pipe(map((response: any[]) => {
|
||||
return this.parseAnnotations(response);
|
||||
}));
|
||||
}
|
||||
|
||||
getAnnotationTargets(value: string, type: 'semantic' | 'keyword' | 'comment'): Observable<AnnotationTarget[]> {
|
||||
let url = properties.b2noteAPIURL + this.api + 'annotations?value=' + encodeURIComponent(value) + '&type[]=' + type;
|
||||
return this.http.get<AnnotationTarget[]>(url).pipe(map((response: any[]) => {
|
||||
return this.parseAnnotationTargets(response);
|
||||
}));
|
||||
}
|
||||
|
||||
private parseAnnotations(response: any[]): Annotation[] {
|
||||
let annotations: Annotation[] = [];
|
||||
if (response && response.length > 0) {
|
||||
response.forEach(value => {
|
||||
if (value.visibility === 'public') {
|
||||
let body = value.body;
|
||||
if (body.type === 'TextualBody') {
|
||||
if (body.purpose === 'tagging') {
|
||||
annotations.push({
|
||||
text: body.value,
|
||||
type: "keyword"
|
||||
});
|
||||
} else {
|
||||
annotations.push({
|
||||
text: body.value,
|
||||
type: "comment"
|
||||
});
|
||||
}
|
||||
} else {
|
||||
let items = body.items;
|
||||
let text: string = null;
|
||||
items.forEach(item => {
|
||||
if (item.type === 'TextualBody') {
|
||||
text = item.value;
|
||||
}
|
||||
});
|
||||
annotations.push({
|
||||
text: text,
|
||||
type: "semantic"
|
||||
});
|
||||
}
|
||||
}
|
||||
});
|
||||
}
|
||||
return annotations;
|
||||
}
|
||||
|
||||
private parseAnnotationTargets(response: any[]): AnnotationTarget[] {
|
||||
let targets: AnnotationTarget[] = [];
|
||||
if (response && response.length > 0) {
|
||||
response.forEach(value => {
|
||||
if (value.visibility === 'public') {
|
||||
targets.push({
|
||||
id: value.target.id,
|
||||
url: value.target.source
|
||||
});
|
||||
}
|
||||
});
|
||||
}
|
||||
return targets;
|
||||
}
|
||||
}
|
|
@ -0,0 +1,12 @@
|
|||
import { NgModule } from '@angular/core';
|
||||
import { RouterModule } from '@angular/router';
|
||||
import { PreviousRouteRecorder } from "../../utils/piwik/previousRouteRecorder.guard";
|
||||
import { DataProviderComponent } from "./dataProvider.component";
|
||||
|
||||
|
||||
@NgModule({
|
||||
imports: [
|
||||
RouterModule.forChild([{ path: '', component: DataProviderComponent, canDeactivate: [PreviousRouteRecorder] }])
|
||||
]
|
||||
})
|
||||
export class DataProviderRoutingModule { }
|
|
@ -1,3 +1,8 @@
|
|||
<!-- schema.org-->
|
||||
<schema2jsonld *ngIf="dataProviderInfo"
|
||||
[data]=dataProviderInfo [URL]="canonicalUrl" type="datasource"
|
||||
[otherURL]="(dataProviderInfo.provenance)?provenanceUrls:null"></schema2jsonld>
|
||||
|
||||
<!-- Desktop view -->
|
||||
<div class="uk-visible@m landing uk-section uk-padding-remove tm-middle">
|
||||
<div *ngIf="!isMobile" class="tm-main">
|
||||
|
@ -95,11 +100,7 @@
|
|||
<div [attr.style]="'margin-top: '+(graph_height? 'calc(40px + 20px - '+graph_height+'px)': '40px')">
|
||||
<div class="uk-grid uk-grid-small" uk-grid>
|
||||
<div class="uk-width-expand">
|
||||
<!-- schema.org-->
|
||||
<schema2jsonld [data]=dataProviderInfo
|
||||
[URL]="canonicalUrl"
|
||||
type="datasource"
|
||||
[otherURL]="(dataProviderInfo.provenance)?provenanceUrls:null"></schema2jsonld>
|
||||
|
||||
<!-- Actions for mobile viewport -->
|
||||
<div class="uk-flex uk-flex-right uk-margin-medium-bottom uk-hidden@s">
|
||||
<div>
|
||||
|
@ -188,7 +189,7 @@
|
|||
</div>
|
||||
<div *ngIf="dataProviderInfo && hasMetrics" class="uk-width-1-1 uk-width-medium@s">
|
||||
<div class="landing-metrics-card uk-text-small uk-flex uk-padding-small">
|
||||
<div class="uk-width-expand uk-flex uk-flex-middle">
|
||||
<div class="uk-width-expand uk-flex uk-flex-top">
|
||||
<div class="uk-grid uk-grid-small uk-flex-nowrap" uk-grid uk-height-match="target: > div > .cell">
|
||||
<div>
|
||||
<ng-container>
|
||||
|
|
|
@ -206,8 +206,10 @@ export class DataProviderComponent {
|
|||
}
|
||||
}));
|
||||
}
|
||||
//this.getDivContents();
|
||||
this.getPageContents();
|
||||
if(properties.adminToolsPortalType !== "explore") {
|
||||
//this.getDivContents();
|
||||
this.getPageContents();
|
||||
}
|
||||
this.updateUrl(this.properties.domain + this.properties.baseLink + this._router.url);
|
||||
this.seoService.createLinkForCanonicalURL(this.properties.domain +this.properties.baseLink + this._router.url);
|
||||
this.subscriptions.push(this.route.queryParams.subscribe(data => {
|
||||
|
@ -394,8 +396,8 @@ export class DataProviderComponent {
|
|||
this.updateUrl(this.canonicalUrl);
|
||||
this.seoService.createLinkForCanonicalURL(this.properties.domain +this.properties.baseLink + this._router.url);
|
||||
if (typeof document !== 'undefined') {
|
||||
this.getDataProviderAggregationStatus(this.dataProviderInfo.originalId);
|
||||
// this.getCollectedFulltexts();
|
||||
// this.getDataProviderAggregationStatus(this.dataProviderInfo.originalId);
|
||||
this.getCollectedFulltexts();
|
||||
this.countResultsWithFundingInfo();
|
||||
} else {
|
||||
this.aggregationStatusIsInitialized = true;
|
||||
|
@ -454,34 +456,34 @@ export class DataProviderComponent {
|
|||
}
|
||||
}
|
||||
|
||||
private getDataProviderAggregationStatus(originalId: string) {
|
||||
this.subscriptions.push(this._dataproviderService.getDataproviderAggregationStatus(originalId, this.properties).subscribe(
|
||||
data => {
|
||||
this.dataProviderInfo.aggregationStatus = data;
|
||||
this.aggregationStatusIsInitialized = true;
|
||||
},
|
||||
err => {
|
||||
//console.log(err);
|
||||
this.aggregationStatusIsInitialized = true;
|
||||
this.handleError("Error getting "+this.getTypeName()+" aggregation status for id: " + this.datasourceId, err);
|
||||
}
|
||||
));
|
||||
}
|
||||
|
||||
// private getCollectedFulltexts() {
|
||||
// this.subscriptions.push(this._dataproviderService.getCollectedFulltexts(this.datasourceId).subscribe(
|
||||
// (data: string) => {
|
||||
// this.dataProviderInfo.aggregationStatus = {"fulltexts": data};
|
||||
// private getDataProviderAggregationStatus(originalId: string) {
|
||||
// this.subscriptions.push(this._dataproviderService.getDataproviderAggregationStatus(originalId, this.properties).subscribe(
|
||||
// data => {
|
||||
// this.dataProviderInfo.aggregationStatus = data;
|
||||
// this.aggregationStatusIsInitialized = true;
|
||||
// },
|
||||
// err => {
|
||||
// //console.log(err);
|
||||
// this.aggregationStatusIsInitialized = true;
|
||||
// this.handleError("Error getting "+this.getTypeName()+" collected fulltexts for id: " + this.datasourceId, err);
|
||||
// this.handleError("Error getting "+this.getTypeName()+" aggregation status for id: " + this.datasourceId, err);
|
||||
// }
|
||||
// ));
|
||||
// }
|
||||
|
||||
private getCollectedFulltexts() {
|
||||
this.subscriptions.push(this._dataproviderService.getCollectedFulltexts(this.datasourceId).subscribe(
|
||||
(data: string) => {
|
||||
this.dataProviderInfo.aggregationStatus = {"fulltexts": data};
|
||||
this.aggregationStatusIsInitialized = true;
|
||||
},
|
||||
err => {
|
||||
//console.log(err);
|
||||
this.aggregationStatusIsInitialized = true;
|
||||
this.handleError("Error getting "+this.getTypeName()+" collected fulltexts for id: " + this.datasourceId, err);
|
||||
}
|
||||
));
|
||||
}
|
||||
|
||||
private countResultsWithFundingInfo() {
|
||||
this.subscriptions.push(this._searchResearchResultsService.countCollectedResultsWithFundingInfo(this.datasourceId).subscribe(
|
||||
fundedContent => {
|
||||
|
|
|
@ -36,10 +36,12 @@ import {ResultLandingUtilsModule} from "../landing-utils/resultLandingUtils.modu
|
|||
import {FullScreenModalModule} from '../../utils/modal/full-screen-modal/full-screen-modal.module';
|
||||
import {SafeHtmlPipeModule} from '../../utils/pipes/safeHTMLPipe.module';
|
||||
import {EntityActionsModule} from "../../utils/entity-actions/entity-actions.module";
|
||||
import {DataProviderRoutingModule} from "./dataProvider-routing.module";
|
||||
|
||||
@NgModule({
|
||||
imports:
|
||||
[CommonModule, FormsModule, RouterModule,
|
||||
DataProviderRoutingModule,
|
||||
IFrameModule, ErrorMessagesModule, LandingModule,
|
||||
DataProvidersServiceModule, ProjectsServiceModule, SearchResearchResultsServiceModule,
|
||||
PagingModule, Schema2jsonldModule, SEOServiceModule, ShowPublisherModule, HelperModule,
|
||||
|
|
|
@ -83,10 +83,10 @@ export class DataProviderService {
|
|||
.pipe(map(res => this.parseDataproviderAggregationStatus(res)));
|
||||
}
|
||||
|
||||
// getCollectedFulltexts(datasourceId: string) {
|
||||
// return this.http.get(properties.pdfStatisticsAPIURL+"/api/stats/getNumberOfPayloadsForDatasource?datasourceId="+datasourceId)
|
||||
// .pipe(map(res => res))
|
||||
// }
|
||||
getCollectedFulltexts(datasourceId: string) {
|
||||
return this.http.get(properties.pdfStatisticsAPIURL+"/stats/getNumberOfPayloadsForDatasource?datasourceId="+datasourceId)
|
||||
.pipe(map(res => res))
|
||||
}
|
||||
|
||||
private handleError (error: HttpErrorResponse) {
|
||||
// in a real world app, we may send the error to some remote logging infrastructure
|
||||
|
|
|
@ -9,7 +9,8 @@
|
|||
<landing-header *ngIf="resultLandingInfo" [properties]="properties" [title]="title"
|
||||
[subTitle]="resultLandingInfo.subtitle" [underCuration]="resultLandingInfo.underCurationMessage"
|
||||
[entityType]="entityType" [types]="resultLandingInfo.types"
|
||||
[year]="resultLandingInfo.date" [embargoEndDate]="resultLandingInfo.embargoEndDate">
|
||||
[year]="resultLandingInfo.date" [embargoEndDate]="resultLandingInfo.embargoEndDate"
|
||||
[publiclyFunded]="resultLandingInfo.publiclyFunded" [projects]="resultLandingInfo.fundedByProjects">
|
||||
</landing-header>
|
||||
<landing-header *ngIf="organizationInfo" [properties]="properties" [title]="title"
|
||||
[subTitle]="(organizationInfo.name && organizationInfo.title.name !== organizationInfo.name)?organizationInfo.name:null"
|
||||
|
|
|
@ -1,302 +0,0 @@
|
|||
import {Component, Input} from '@angular/core';
|
||||
import {ActivatedRoute, Router} from '@angular/router';
|
||||
import {Meta, Title} from '@angular/platform-browser';
|
||||
|
||||
import {EnvProperties} from '../../utils/properties/env-properties';
|
||||
|
||||
import {HtmlProjectReportService} from './htmlProjectReport.service';
|
||||
import {ProjectService} from '../project/project.service';
|
||||
import {PiwikService} from '../../utils/piwik/piwik.service';
|
||||
import {SEOService} from '../../sharedComponents/SEO/SEO.service';
|
||||
import {HelperService} from "../../utils/helper/helper.service";
|
||||
import {Subscriber} from "rxjs";
|
||||
import {properties} from "../../../../environments/environment";
|
||||
|
||||
declare var UIkit: any;
|
||||
|
||||
@Component({
|
||||
selector: 'htmlProjectReport',
|
||||
template: `
|
||||
<div id="tm-main" class=" uk-section uk-padding-remove-top tm-middle">
|
||||
<div uk-grid>
|
||||
<div class="tm-main uk-width-1-1@s uk-width-1-1@m uk-width-1-1@l uk-row-first ">
|
||||
<helper *ngIf="pageContents && pageContents['top'] && pageContents['top'].length > 0"
|
||||
[texts]="pageContents['top']" styleName="uk-width-1-1"></helper>
|
||||
<div class="uk-container uk-margin-top uk-width-1-1">
|
||||
<div *ngIf="warningMessage" class="uk-alert uk-alert-warning" role="alert">{{warningMessage}}</div>
|
||||
<div [style.display]="showLoading ? 'inline' : 'none'"
|
||||
class="uk-animation-fade uk-margin-large-top uk-width-1-1" role="alert"><span
|
||||
class="loading-gif uk-align-center"></span></div>
|
||||
|
||||
<div *ngIf="!showLoading && !warningMessage">
|
||||
<div *ngIf="header1" class="uk-h4 uk-text-bold ">{{header1}}</div>
|
||||
<div *ngIf="header1 || htmlResult" class=" ">{{header2}}</div>
|
||||
|
||||
<div class="uk-clearfix uk-margin-bottom">
|
||||
<button *ngIf="htmlResult" class="uk-icon-clipboard uk-button uk-button-primary clipBtn uk-float-right"
|
||||
(click)="copied()">
|
||||
Copy to clipboard
|
||||
</button>
|
||||
</div>
|
||||
<!--div class="uk-panel-scrollable custom-html-table-height" *ngIf="htmlResult" id="clipboard" [innerHTML]="htmlResult"></div-->
|
||||
<div class="uk-overflow-auto custom-html-table-height" *ngIf="htmlResult" id="clipboard"
|
||||
[innerHTML]="htmlResult"></div>
|
||||
|
||||
<div *ngIf="errorMessage" class="uk-alert uk-alert-danger" role="alert">{{errorMessage}}</div>
|
||||
</div>
|
||||
</div>
|
||||
<helper *ngIf="pageContents && pageContents['bottom'] && pageContents['bottom'].length > 0"
|
||||
[texts]="pageContents['bottom']" styleName="uk-width-1-1"></helper>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
`
|
||||
})
|
||||
export class HtmlProjectReportComponent {
|
||||
@Input() communityId = null;
|
||||
private projectId: string;
|
||||
private totalResults: number = 10;
|
||||
private resultsType: string = "publication";
|
||||
|
||||
public header1: string = "";
|
||||
public header2: string = "";
|
||||
public htmlResult: string = "";
|
||||
|
||||
subscriptions = [];
|
||||
|
||||
public warningMessage: string = "";
|
||||
public errorMessage: string = "";
|
||||
public showLoading: boolean = true;
|
||||
properties: EnvProperties;
|
||||
public pageContents = null;
|
||||
public divContents = null;
|
||||
|
||||
constructor(private route: ActivatedRoute,
|
||||
private htmlService: HtmlProjectReportService,
|
||||
private _piwikService: PiwikService,
|
||||
private _projectService: ProjectService,
|
||||
private _meta: Meta,
|
||||
private _title: Title,
|
||||
private _router: Router,
|
||||
private helper: HelperService,
|
||||
private seoService: SEOService) {
|
||||
}
|
||||
|
||||
ngOnInit() {
|
||||
|
||||
this.properties = properties;
|
||||
//this.getDivContents();
|
||||
this.getPageContents();
|
||||
this.updateUrl(this.properties.domain + this.properties.baseLink + this._router.url);
|
||||
this.seoService.createLinkForCanonicalURL(this.properties.domain + this.properties.baseLink + this._router.url);
|
||||
|
||||
|
||||
this.subscriptions.push(this.route.queryParams.subscribe(params => {
|
||||
this.projectId = params['projectId'];
|
||||
|
||||
if (params['size'] == parseInt(params['size'], 10)) {
|
||||
this.totalResults = params['size'];
|
||||
} else {
|
||||
this.showLoading = false;
|
||||
this.warningMessage = "Requested size is not an integer";
|
||||
}
|
||||
|
||||
if (params['type'] && (params['type'] == "publication" || params['type'] == "dataset" || params['type'] == "software" || params['type'] == "other")) {
|
||||
if (params['type'] == "publication") {
|
||||
this.resultsType = 'publication';
|
||||
} else if (params['type'] == "dataset") {
|
||||
this.resultsType = 'research data';
|
||||
} else if (params['type'] == "software") {
|
||||
this.resultsType = 'software';
|
||||
} else if (params['type'] == "other") {
|
||||
this.resultsType = "other research product";
|
||||
}
|
||||
|
||||
var title = "Project's " + this.resultsType + " report";
|
||||
var description = "project, project " + this.resultsType + " report, funding, open access, publications, research data, software, other research products";
|
||||
this.updateTitle(title);
|
||||
this.updateDescription(description);
|
||||
|
||||
|
||||
} else {
|
||||
this.showLoading = false;
|
||||
this.warningMessage = "Requested type should be publication or research data or software or other research product";
|
||||
}
|
||||
|
||||
//showLoading is true if no warnings
|
||||
if (this.showLoading) {
|
||||
if (this.projectId) {
|
||||
this.createHeaders();
|
||||
} else {
|
||||
this.showLoading = false;
|
||||
this.warningMessage = "No valid project id";
|
||||
}
|
||||
}
|
||||
}));
|
||||
}
|
||||
|
||||
private getPageContents() {
|
||||
if(this.communityId) {
|
||||
this.subscriptions.push(this.helper.getPageHelpContents(this.properties, this.communityId, this._router.url).subscribe(contents => {
|
||||
this.pageContents = contents;
|
||||
}));
|
||||
}
|
||||
}
|
||||
|
||||
private getDivContents() {
|
||||
if(this.communityId) {
|
||||
this.subscriptions.push(this.helper.getDivHelpContents(this.properties, this.communityId, this._router.url).subscribe(contents => {
|
||||
this.divContents = contents;
|
||||
}));
|
||||
}
|
||||
}
|
||||
|
||||
ngOnDestroy() {
|
||||
this.subscriptions.forEach(subscription => {
|
||||
if (subscription instanceof Subscriber) {
|
||||
subscription.unsubscribe();
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
private createHeaders() {
|
||||
this.subscriptions.push(this._projectService.getHTMLInfo(this.projectId, this.properties).subscribe(
|
||||
data => {
|
||||
this.createHeader1(data);
|
||||
if (data.acronym) {
|
||||
this.updateTitle(data.acronym + " " + this.resultsType + " report");
|
||||
} else if (data.title) {
|
||||
this.updateTitle(data.title + " " + this.resultsType + " report");
|
||||
}
|
||||
this.subscriptions.push(this._piwikService.trackView(this.properties, ((data.acronym) ? data.acronym : data.title) + " " + this.resultsType + " report").subscribe());
|
||||
},
|
||||
err => {
|
||||
this.handleError("Error getting html information for project id: " + this.projectId, err);
|
||||
//console.log(err);
|
||||
this.createClipboard();
|
||||
}
|
||||
));
|
||||
|
||||
if (this.resultsType == "publication") {
|
||||
this.header2 += this.totalResults.toLocaleString('en-US') + " publications";
|
||||
} else if (this.resultsType == "research data") {
|
||||
this.header2 += this.totalResults.toLocaleString('en-US') + " research data";
|
||||
} else if (this.resultsType == "software") {
|
||||
this.header2 += this.totalResults.toLocaleString('en-US') + " software";
|
||||
} else if (this.resultsType == "other research product") {
|
||||
this.header2 += this.totalResults.toLocaleString('en-US') + " other";
|
||||
}
|
||||
}
|
||||
|
||||
private createClipboard() {
|
||||
let intro: string = '<!doctype html>';
|
||||
intro += '<html lang="en-gb" dir="ltr" vocab="http://schema.org/">';
|
||||
intro += '<head>';
|
||||
intro += '<title>' + this.header1 + '</title>'
|
||||
intro += '</head>';
|
||||
|
||||
if (typeof window !== 'undefined') {
|
||||
this.subscriptions.push(this.htmlService.getHTML(this.projectId, this.resultsType, this.properties.csvAPIURL).subscribe(
|
||||
data => {
|
||||
//let body: string = intro+'<body><h1>'+this.header1+'</h1><h2>'+this.header2+'</h2>'+data+'</body></html>';
|
||||
let body: string = intro + '<body><h1>' + this.header1 + '</h1><h2>' + this.header2 + '</h2>';
|
||||
body += "<table><thead><tr> <th>Title</th><th>Authors</th><th>Publication Year</th><th>DOI</th><th>Permanent Identifier</th><th>Publication type</th><th>Journal</th><th>Project Name (GA Number)</th><th>Access Mode</th></tr></thead><tbody>" + data + "</tbody></table>";
|
||||
body += '</body></html>';
|
||||
|
||||
//this.htmlResult = data;
|
||||
this.htmlResult = "<table><thead><tr> <th>Title</th><th>Authors</th><th>Publication Year</th><th>DOI</th><th>Permanent Identifier</th><th>Publication type</th><th>Journal</th><th>Project Name (GA Number)</th><th>Access Mode</th></tr></thead><tbody>" + data + "</tbody></table>";
|
||||
|
||||
let clipboard;
|
||||
let Clipboard;
|
||||
Clipboard = require('clipboard');
|
||||
clipboard = new Clipboard('.clipBtn', {
|
||||
/*target: function(trigger) {
|
||||
return document.getElementById("clipboard");
|
||||
}*/
|
||||
text: function (trigger) {
|
||||
return body;//document.getElementById("clipboard").getAttribute('innerHTML');//"aaaa"+tmp+"oo";
|
||||
}
|
||||
});
|
||||
|
||||
this.showLoading = false;
|
||||
},
|
||||
err => {
|
||||
//console.log(err);
|
||||
this.handleError("Error getting html for id: " + this.projectId, err);
|
||||
|
||||
this.errorMessage = 'Service not available';
|
||||
this.showLoading = false;
|
||||
}
|
||||
));
|
||||
}
|
||||
}
|
||||
|
||||
createHeader1(data: { "title": string, "acronym": string, "callIdentifier": string }) {
|
||||
if (this.resultsType == "publication") {
|
||||
this.header1 += "Publications";
|
||||
} else if (this.resultsType == "research data") {
|
||||
this.header1 += "Research Data";
|
||||
} else if (this.resultsType == "software") {
|
||||
this.header1 += "Software";
|
||||
} else if (this.resultsType == "other research product") {
|
||||
this.header1 += "Other Research Products";
|
||||
}
|
||||
|
||||
if (data != undefined) {
|
||||
if (data.title != undefined && data.title != "") {
|
||||
this.header1 += data.title;
|
||||
}
|
||||
if ((data.title != undefined && data.title != "") &&
|
||||
((data.acronym != undefined && data.acronym != "") ||
|
||||
(data.callIdentifier != undefined && data.callIdentifier != ""))) {
|
||||
this.header1 += "(";
|
||||
}
|
||||
if (data.acronym != undefined && data.acronym != "") {
|
||||
this.header1 += data.acronym + " - ";
|
||||
}
|
||||
if (data.callIdentifier != undefined && data.callIdentifier != "") {
|
||||
this.header1 += data.callIdentifier;
|
||||
}
|
||||
if ((data.title != undefined && data.title != "") &&
|
||||
((data.acronym != undefined && data.acronym != "") ||
|
||||
(data.callIdentifier != undefined && data.callIdentifier != ""))) {
|
||||
this.header1 += ")";
|
||||
}
|
||||
}
|
||||
|
||||
this.createClipboard();
|
||||
}
|
||||
|
||||
public copied() {
|
||||
UIkit.notification({
|
||||
message: '<strong>Raw html is copied. Please paste it on an html file.<strong>',
|
||||
status: 'success',
|
||||
timeout: 3000,
|
||||
pos: 'top-center'
|
||||
});
|
||||
}
|
||||
|
||||
private updateDescription(description: string) {
|
||||
this._meta.updateTag({content: description}, "name='description'");
|
||||
this._meta.updateTag({content: description}, "property='og:description'");
|
||||
}
|
||||
|
||||
private updateTitle(title: string) {
|
||||
var _prefix = "";
|
||||
if(!this.communityId) {
|
||||
_prefix = "OpenAIRE | ";
|
||||
}
|
||||
var _title = _prefix + ((title.length > 50) ? title.substring(0, 50) : title);
|
||||
this._title.setTitle(_title);
|
||||
this._meta.updateTag({content: _title}, "property='og:title'");
|
||||
}
|
||||
|
||||
private updateUrl(url: string) {
|
||||
this._meta.updateTag({content: url}, "property='og:url'");
|
||||
}
|
||||
|
||||
private handleError(message: string, error) {
|
||||
console.error("Html Project Report Page: " + message, error);
|
||||
}
|
||||
}
|
|
@ -1,30 +0,0 @@
|
|||
//import {MaterialModule} from '@angular/material';
|
||||
import { NgModule} from '@angular/core';
|
||||
import { CommonModule } from '@angular/common';
|
||||
import { FormsModule } from '@angular/forms';
|
||||
import { ProjectServiceModule} from '../project/projectService.module';
|
||||
|
||||
|
||||
import {HtmlProjectReportService} from './htmlProjectReport.service';
|
||||
import {HtmlProjectReportComponent} from './htmlProjectReport.component';
|
||||
import {PiwikServiceModule} from '../../utils/piwik/piwikService.module';
|
||||
import { SEOServiceModule } from '../../sharedComponents/SEO/SEOService.module';
|
||||
import {HelperModule} from "../../utils/helper/helper.module";
|
||||
import {RouterModule} from '@angular/router';
|
||||
|
||||
@NgModule({
|
||||
imports: [
|
||||
CommonModule, FormsModule, ProjectServiceModule, PiwikServiceModule, SEOServiceModule, HelperModule,
|
||||
RouterModule
|
||||
],
|
||||
declarations: [
|
||||
HtmlProjectReportComponent
|
||||
],
|
||||
providers:[
|
||||
HtmlProjectReportService
|
||||
],
|
||||
exports: [
|
||||
HtmlProjectReportComponent
|
||||
]
|
||||
})
|
||||
export class HtmlProjectReportModule { }
|
|
@ -14,78 +14,91 @@ import {RouterHelper} from "../../utils/routerHelper.class";
|
|||
<div class="uk-flex uk-flex-middle"
|
||||
[ngClass]="isMobile ? ('uk-flex-column ' + (!(usedBy == 'landing') ? 'uk-margin-left uk-margin-xsmall-bottom' : '')) : 'uk-grid uk-grid-small uk-child-width-auto'"
|
||||
[attr.uk-grid]="!isMobile ? '' : null">
|
||||
<div *ngIf="properties.environment != 'production' && availableOn[0].fulltext" class="uk-flex uk-flex-middle"
|
||||
[ngClass]="isMobile ? 'uk-width-1-1' : 'uk-text-bolder'">
|
||||
<a [href]="availableOn[0].fulltext" target="_blank"
|
||||
class="uk-flex uk-flex-middle uk-button-link"
|
||||
[ngClass]="isMobile ? ((usedBy == 'landing') ? 'uk-width-1-1 uk-padding-small uk-padding-remove-horizontal' : '') : 'uk-flex-center'">
|
||||
<!-- <icon [flex]="true" [ratio]="0.7" name="download" visuallyHidden="download"></icon>-->
|
||||
<icon name="download" visuallyHidden="donwload" [flex]="true" [ratio]="(isMobile && usedBy == 'landing') ? 1 : 0.8"></icon>
|
||||
<span class="uk-margin-xsmall-left">Full-Text</span>
|
||||
</a>
|
||||
</div>
|
||||
<div *ngIf="isMobile && (usedBy == 'landing') && availableOn[0].fulltext" class="uk-width-1-1"><hr></div>
|
||||
<div *ngIf="availableOn[0].downloadUrl" [ngClass]="isMobile ? 'uk-width-1-1' : ''">
|
||||
<div class="uk-flex uk-flex-middle" [ngClass]="isMobile ? ((usedBy == 'landing') ? 'uk-padding-small uk-padding-remove-horizontal' : '') : ''">
|
||||
<span [class]="'uk-margin-xsmall-right ' + (availableOn[0].accessRightIcon == 'open_access' ? 'open-access' : 'closed-access')"
|
||||
uk-tooltip [title]="getAccessLabel(availableOn[0].accessRight)">
|
||||
<icon [name]="availableOn[0].accessRightIcon" [flex]="true" [ratio]="(isMobile && usedBy == 'landing') ? 1 : 0.8"></icon>
|
||||
</span>
|
||||
<ng-container *ngIf="!isMobile">
|
||||
<a uk-tooltip="Source" target="_blank"
|
||||
class="uk-flex uk-flex-middle uk-flex-center uk-button-link uk-text-bolder">
|
||||
<span>{{sliceString(availableOn[0].downloadNames.join("; "), 20)}}</span>
|
||||
<span>
|
||||
<!-- <icon [flex]="true" [name]="'expand_' + (isOpen?'less':'more')"></icon>-->
|
||||
<icon [flex]="true" [name]="(isOpen?'arrow_drop_up':'arrow_drop_down')"></icon>
|
||||
</span>
|
||||
</a>
|
||||
<div #dropElement uk-drop="mode: click; pos: bottom-left; flip: false; shift: false" class="uk-drop download-drop">
|
||||
<div class="uk-card uk-card-default uk-padding-small uk-padding-remove-horizontal uk-text-small uk-height-max-large uk-overflow-auto">
|
||||
<ng-container *ngTemplateOutlet="availableOnList"></ng-container>
|
||||
</div>
|
||||
</div>
|
||||
</ng-container>
|
||||
|
||||
<ng-container *ngIf="isMobile">
|
||||
<a #toggle class="uk-flex uk-flex-between uk-flex-middle uk-flex-center uk-width-expand uk-button-link">
|
||||
<span>{{sliceString(availableOn[0].downloadNames.join("; "), 20)}}</span>
|
||||
<span>
|
||||
<icon [flex]="true" ratio="1.5" name="arrow_right"></icon>
|
||||
</span>
|
||||
</a>
|
||||
<mobile-dropdown [toggle]="toggle">
|
||||
<div class="uk-text-emphasis uk-text-bolder uk-text-center uk-padding-small uk-padding-remove-vertical uk-text-uppercase">
|
||||
Sources
|
||||
</div>
|
||||
<div class="uk-text-small download-drop uk-padding uk-padding-remove-horizontal">
|
||||
<ng-container *ngTemplateOutlet="availableOnList"></ng-container>
|
||||
</div>
|
||||
</mobile-dropdown>
|
||||
</ng-container>
|
||||
<ng-container *ngIf="inModal">
|
||||
<div class="uk-text-small uk-height-max-small uk-overflow-auto">
|
||||
<ng-container *ngTemplateOutlet="availableOnList"></ng-container>
|
||||
</div>
|
||||
</div>
|
||||
</ng-container>
|
||||
|
||||
<ng-container *ngIf="!inModal">
|
||||
<div *ngIf="availableOn[0].fulltext" class="uk-flex uk-flex-middle"
|
||||
[ngClass]="isMobile ? 'uk-width-1-1' : 'uk-text-bolder'">
|
||||
<a [href]="availableOn[0].fulltext" target="_blank"
|
||||
class="uk-flex uk-flex-middle uk-button-link"
|
||||
[ngClass]="isMobile ? ((usedBy == 'landing') ? 'uk-width-1-1 uk-padding-small uk-padding-remove-horizontal' : '') : 'uk-flex-center'">
|
||||
<!-- <icon [flex]="true" [ratio]="0.7" name="download" visuallyHidden="download"></icon>-->
|
||||
<icon name="download" visuallyHidden="donwload" [flex]="true" [ratio]="(isMobile && usedBy == 'landing') ? 1 : 0.8"></icon>
|
||||
<span class="uk-margin-xsmall-left">Full-Text</span>
|
||||
</a>
|
||||
</div>
|
||||
|
||||
<div *ngIf="properties.environment != 'production' && isMobile && (usedBy == 'landing') && availableOn[0].fulltext" class="uk-width-1-1"><hr></div><div *ngIf="availableOn[0].downloadUrl" [ngClass]="isMobile ? 'uk-width-1-1' : ''">
|
||||
<div class="uk-flex uk-flex-middle" [ngClass]="isMobile ? ((usedBy == 'landing') ? 'uk-padding-small uk-padding-remove-horizontal' : '') : ''">
|
||||
<span [class]="'uk-margin-xsmall-right ' + (availableOn[0].accessRightIcon == 'open_access' ? 'open-access' : 'closed-access')"
|
||||
uk-tooltip [title]="getAccessLabel(availableOn[0].accessRight)">
|
||||
<icon [name]="availableOn[0].accessRightIcon" [flex]="true" [ratio]="(isMobile && usedBy == 'landing') ? 1 : 0.8"></icon>
|
||||
</span>
|
||||
<ng-container *ngIf="!isMobile">
|
||||
<a target="_blank"
|
||||
class="uk-flex uk-flex-middle uk-flex-center uk-button-link uk-text-bolder">
|
||||
<span>{{sliceString(availableOn[0].downloadNames.join("; "), 20)}}</span>
|
||||
<span>
|
||||
<!-- <icon [flex]="true" [name]="'expand_' + (isOpen?'less':'more')"></icon>-->
|
||||
<icon [flex]="true" [name]="(isOpen?'arrow_drop_up':'arrow_drop_down')"></icon>
|
||||
</span>
|
||||
</a>
|
||||
<div #dropElement uk-drop="mode: click; pos: bottom-left; flip: false; shift: false" class="uk-drop download-drop">
|
||||
<div class="uk-card uk-card-default uk-padding-small uk-padding-remove-horizontal uk-text-small uk-height-max-large uk-overflow-auto">
|
||||
<ng-container *ngTemplateOutlet="availableOnList"></ng-container>
|
||||
</div>
|
||||
</div>
|
||||
</ng-container>
|
||||
|
||||
<ng-container *ngIf="isMobile">
|
||||
<a #toggle class="uk-flex uk-flex-between uk-flex-middle uk-flex-center uk-width-expand uk-button-link">
|
||||
<span>{{sliceString(availableOn[0].downloadNames.join("; "), 20)}}</span>
|
||||
<span>
|
||||
<icon [flex]="true" ratio="1.5" name="arrow_right"></icon>
|
||||
</span>
|
||||
</a>
|
||||
<mobile-dropdown [toggle]="toggle">
|
||||
<div class="uk-text-emphasis uk-text-bolder uk-text-center uk-padding-small uk-padding-remove-vertical uk-text-uppercase">
|
||||
Sources
|
||||
</div>
|
||||
<div class="uk-text-small download-drop uk-padding uk-padding-remove-horizontal">
|
||||
<ng-container *ngTemplateOutlet="availableOnList"></ng-container>
|
||||
</div>
|
||||
</mobile-dropdown>
|
||||
</ng-container>
|
||||
</div>
|
||||
</div>
|
||||
</ng-container>
|
||||
</div>
|
||||
</ng-container>
|
||||
|
||||
<ng-template #availableOnList>
|
||||
<div *ngFor="let instance of availableOn let i=index" class="download-drop-item uk-flex uk-flex-top">
|
||||
<div *ngFor="let instance of availableOn let i=index" class="download-drop-item uk-flex uk-flex-top"
|
||||
[ngClass]="inModal ? 'uk-margin-small-bottom' : ''">
|
||||
<span
|
||||
[class]="'uk-margin-small-right ' + (instance.accessRightIcon == 'open_access' ? 'open-access' : 'closed-access')"
|
||||
uk-tooltip [title]="getAccessLabel(instance.accessRight)">
|
||||
<icon [name]="instance.accessRightIcon" [flex]="true"></icon>
|
||||
<icon [name]="instance.accessRightIcon" [flex]="true" [ratio]="inModal ? 0.8 : 1"></icon>
|
||||
</span>
|
||||
<div class="uk-width-expand uk-padding-small uk-padding-remove-left uk-padding-remove-vertical">
|
||||
<div class="uk-padding-small uk-padding-remove-left uk-padding-remove-vertical"
|
||||
[ngClass]="inModal ? 'uk-grid' : 'uk-width-expand'">
|
||||
<span class="uk-text-emphasis">
|
||||
<a *ngIf="instance.downloadUrl" [href]="instance.downloadUrl" target="_blank"
|
||||
class="title uk-link-text uk-text-bold custom-external uk-display-inline-block">
|
||||
{{instance.downloadNames.join("; ")}}
|
||||
</a>
|
||||
</span>
|
||||
<div *ngIf="instance.types?.length > 0 || instance.years?.length > 0" class="uk-text-meta">
|
||||
<div *ngIf="instance.types?.length > 0 || instance.years?.length > 0 || instance.peerReviewed" class="uk-text-meta">
|
||||
<span *ngIf="instance.types?.length > 0" class="uk-text-capitalize">{{instance.types.join(" . ")}}</span>
|
||||
<span *ngIf="instance.types?.length > 0 && instance.years?.length > 0"> . </span>
|
||||
<span *ngIf="instance.years?.length > 0">{{instance.years.join(" . ")}}</span>
|
||||
<span *ngIf="(instance.types?.length > 0 || instance.years?.length > 0) && instance.peerReviewed"> . </span>
|
||||
<span *ngIf="instance.peerReviewed">Peer-reviewed</span>
|
||||
</div>
|
||||
<div *ngIf="instance.license" class="uk-text-meta uk-text-truncate" uk-tooltip [title]="instance.license">
|
||||
License:
|
||||
|
@ -95,7 +108,7 @@ import {RouterHelper} from "../../utils/routerHelper.class";
|
|||
</a>
|
||||
<ng-template #elseBlock> {{instance.license}}</ng-template>
|
||||
</div>
|
||||
<div *ngIf="properties.environment != 'production' && instance.fulltext" class="uk-text-meta uk-text-truncate" uk-tooltip [title]="instance.fulltext">
|
||||
<div *ngIf="instance.fulltext" class="uk-text-meta uk-text-truncate" uk-tooltip [title]="instance.fulltext">
|
||||
Full-Text:
|
||||
<a *ngIf="isUrl(instance.fulltext); else elseBlock"
|
||||
[href]="instance.fulltext" target="_blank" class="custom-external uk-link-text">
|
||||
|
@ -118,6 +131,7 @@ import {RouterHelper} from "../../utils/routerHelper.class";
|
|||
|
||||
export class AvailableOnComponent {
|
||||
@Input() isMobile: boolean = false;
|
||||
@Input() inModal: boolean = false;
|
||||
@Input() usedBy: "search" | "landing" = "search";
|
||||
@Input() prevPath: string = "";
|
||||
@Input() availableOn: HostedByCollectedFrom[];
|
||||
|
|
|
@ -31,22 +31,20 @@ import {RouterHelper} from "../../utils/routerHelper.class";
|
|||
<!-- types -->
|
||||
<span *ngIf="entityType" class="uk-flex-inline uk-flex-middle uk-flex-wrap"
|
||||
[class.other-separator]="types && removeUnknown(types, true).length > 0">
|
||||
<span class="uk-margin-xsmall-right">
|
||||
<icon *ngIf="entityType.toLowerCase() == 'publication'" name="description" type="outlined"
|
||||
[flex]="true" [ratio]="0.8"></icon>
|
||||
<icon *ngIf="entityType.toLowerCase() == 'research data'" name="database" type="outlined"
|
||||
[flex]="true" [ratio]="0.8"></icon>
|
||||
<icon *ngIf="entityType.toLowerCase() == 'research software'" name="integration_instructions"
|
||||
type="outlined" [flex]="true" [ratio]="0.8"></icon>
|
||||
<icon *ngIf="entityType.toLowerCase() == 'other research product'" name="apps" type="outlined"
|
||||
[flex]="true" [ratio]="0.8"></icon>
|
||||
<icon *ngIf="entityType.toLowerCase() == 'project'" name="assignment_turned_in" type="outlined"
|
||||
[flex]="true" [ratio]="0.8"></icon>
|
||||
<icon *ngIf="entityType.toLowerCase() == 'data source'" name="note_add" type="outlined"
|
||||
[flex]="true" [ratio]="0.8"></icon>
|
||||
<icon *ngIf="entityType.toLowerCase() == 'organization'" name="corporate_fare" type="outlined"
|
||||
[flex]="true" [ratio]="0.8"></icon>
|
||||
</span>
|
||||
<icon *ngIf="entityType.toLowerCase() == 'publication'" name="description" type="outlined"
|
||||
[flex]="true" [ratio]="0.8" class="uk-margin-xsmall-right"></icon>
|
||||
<icon *ngIf="entityType.toLowerCase() == 'research data'" name="database" type="outlined"
|
||||
[flex]="true" [ratio]="0.8" class="uk-margin-xsmall-right"></icon>
|
||||
<icon *ngIf="entityType.toLowerCase() == 'research software'" name="integration_instructions"
|
||||
type="outlined" [flex]="true" [ratio]="0.8" class="uk-margin-xsmall-right"></icon>
|
||||
<icon *ngIf="entityType.toLowerCase() == 'other research product'" name="apps" type="outlined"
|
||||
[flex]="true" [ratio]="0.8" class="uk-margin-xsmall-right"></icon>
|
||||
<icon *ngIf="entityType.toLowerCase() == 'project'" name="assignment_turned_in" type="outlined"
|
||||
[flex]="true" [ratio]="0.8" class="uk-margin-xsmall-right"></icon>
|
||||
<icon *ngIf="entityType.toLowerCase() == 'data source'" name="note_add" type="outlined"
|
||||
[flex]="true" [ratio]="0.8" class="uk-margin-xsmall-right"></icon>
|
||||
<icon *ngIf="entityType.toLowerCase() == 'organization'" name="corporate_fare" type="outlined"
|
||||
[flex]="true" [ratio]="0.8" class="uk-margin-xsmall-right"></icon>
|
||||
<u class="uk-text-capitalize uk-text-bolder">{{entityType}}</u>
|
||||
<span *ngIf="types && removeUnknown(types, true).length > 0">
|
||||
<icon name="keyboard_double_arrow_right" [flex]="true" [ratio]="0.8"></icon>
|
||||
|
@ -120,8 +118,9 @@ import {RouterHelper} from "../../utils/routerHelper.class";
|
|||
<showPublisher *ngIf="publisher || journal" [publisher]="publisher" [journal]="journal"
|
||||
[properties]="properties"></showPublisher>
|
||||
<!-- data provider labels -->
|
||||
<ng-container *ngIf="compatibility && !(compatibility.info == 'not available' && type == 'service')">
|
||||
<span uk-tooltip title="Compatibility">
|
||||
<span *ngIf="compatibility && !(compatibility.info == 'not available' && type == 'service')">
|
||||
<span class="uk-text-meta uk-margin-xsmall-right">Compatibility:</span>
|
||||
<span>
|
||||
<a *ngIf="compatibility.id"
|
||||
[queryParams]="addEoscPrevInParams({datasourceId: compatibility.id})" routerLinkActive="router-link-active"
|
||||
[routerLink]="properties.searchLinkToDataProvider.split('?')[0]">
|
||||
|
@ -139,10 +138,11 @@ import {RouterHelper} from "../../utils/routerHelper.class";
|
|||
{{compatibility.name}}
|
||||
</span>
|
||||
</span>
|
||||
</ng-container>
|
||||
<ng-container *ngIf="compatibilityString">
|
||||
<span uk-tooltip title="Compatibility">{{compatibilityString}}</span>
|
||||
</ng-container>
|
||||
</span>
|
||||
<span *ngIf="compatibilityString">
|
||||
<span class="uk-text-meta uk-margin-xsmall-right">Compatibility:</span>
|
||||
<span>{{compatibilityString}}</span>
|
||||
</span>
|
||||
<ng-container
|
||||
*ngIf="aggregationStatus && aggregationStatus.fulltexts && aggregationStatus.fulltexts > 0">
|
||||
<span>OpenAIRE Text Mining</span>
|
||||
|
@ -150,10 +150,13 @@ import {RouterHelper} from "../../utils/routerHelper.class";
|
|||
<ng-container *ngIf="thematic">
|
||||
<span>Thematic</span>
|
||||
</ng-container>
|
||||
<ng-container *ngIf="publiclyFunded">
|
||||
<span>Publicly funded</span>
|
||||
</ng-container>
|
||||
<!-- Projects -->
|
||||
<span *ngIf="projects && projects.length > 0"
|
||||
[attr.uk-tooltip]="projects.length > projectsLimit ? 'cls: uk-invisible' : 'pos: top; cls: uk-active'" title="Funded by">
|
||||
{{showInline ? projectNames.join(', ') : projectNames.slice(0, projectsLimit).join(', ')}}
|
||||
<span *ngIf="projects && projects.length > 0">
|
||||
<span class="uk-text-meta uk-margin-xsmall-right">Funded by:</span>
|
||||
<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
|
||||
|
@ -165,9 +168,9 @@ import {RouterHelper} from "../../utils/routerHelper.class";
|
|||
</span>
|
||||
</span>
|
||||
<!-- Organizations -->
|
||||
<span *ngIf="organizations && organizations.length > 0"
|
||||
[attr.uk-tooltip]="organizations.length > organizationsLimit ? 'cls: uk-invisible' : 'pos: top; cls: uk-active'" title="Partners">
|
||||
{{showInline ? organizationNames.join(', ') : organizationNames.slice(0, organizationsLimit).join(', ')}}
|
||||
<span *ngIf="organizations && organizations.length > 0">
|
||||
<span class="uk-text-meta uk-margin-xsmall-right">Partners:</span>
|
||||
<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
|
||||
|
@ -179,9 +182,10 @@ import {RouterHelper} from "../../utils/routerHelper.class";
|
|||
</span>
|
||||
</span>
|
||||
<!-- Subjects -->
|
||||
<span uk-tooltip="Subjects" *ngIf="subjects && subjects.length > 0" [class.truncated]="subjects.length > 3">
|
||||
<span *ngIf="subjects && subjects.length > 0" [class.truncated]="subjects.length > 3">
|
||||
{{subjects.slice(0, 3).join(', ')}}
|
||||
</span>
|
||||
<!-- For tabs in landing -->
|
||||
<ng-container *ngIf="provenanceAction">
|
||||
<span>{{provenanceAction}}</span>
|
||||
</ng-container>
|
||||
|
@ -246,6 +250,7 @@ export class EntityMetadataComponent {
|
|||
@Input() type; // data provider landing
|
||||
@Input() provenanceAction: string; // search result
|
||||
@Input() relationName: string; // search result
|
||||
@Input() publiclyFunded: boolean; // search result
|
||||
@Input() projects: Project[];
|
||||
@Input() organizations: Organization[];
|
||||
@Input() subjects: string[];
|
||||
|
|
|
@ -0,0 +1,16 @@
|
|||
import {NgModule} from '@angular/core';
|
||||
import {CommonModule} from '@angular/common';
|
||||
import {EntityMetadataComponent} from './entity-metadata.component';
|
||||
import {IconsModule} from '../../utils/icons/icons.module';
|
||||
import {AlertModalModule} from '../../utils/modal/alertModal.module';
|
||||
import {ShowPublisherModule} from "./showPublisher.module";
|
||||
|
||||
@NgModule({
|
||||
imports: [
|
||||
CommonModule, IconsModule, AlertModalModule, ShowPublisherModule
|
||||
],
|
||||
declarations: [EntityMetadataComponent],
|
||||
providers:[],
|
||||
exports: [EntityMetadataComponent]
|
||||
})
|
||||
export class EntityMetadataModule { }
|
|
@ -2,12 +2,13 @@ import {Component, EventEmitter, Input, Output} from "@angular/core";
|
|||
import {RouterHelper} from "../../utils/routerHelper.class";
|
||||
import {properties} from "../../../../environments/environment";
|
||||
import {StringUtils} from "../../utils/string-utils.class";
|
||||
import {SearchFields} from "../../utils/properties/searchFields";
|
||||
|
||||
@Component({
|
||||
selector: 'fos',
|
||||
template: `
|
||||
<div class="uk-visible@m">
|
||||
<div class="uk-text-xsmall" style="color: #EEB204">Beta</div>
|
||||
<!-- <div class="uk-text-xsmall" style="color: #EEB204">Beta</div>-->
|
||||
<div [class]="'uk-flex uk-flex-between uk-flex-middle uk-margin-'+(viewAll?'':'small-')+'bottom'">
|
||||
<span *ngIf="viewAll" class="clickable uk-h6 uk-flex uk-flex-middle uk-margin-small-right uk-margin-remove-bottom" (click)="viewLessClick()">
|
||||
<icon class="uk-margin-small-right" name="arrow_back" [flex]="true" [ratio]="1.2"></icon>
|
||||
|
@ -45,7 +46,7 @@ import {StringUtils} from "../../utils/string-utils.class";
|
|||
<div class="uk-hidden@m">
|
||||
<div *ngIf="!viewAll" class="uk-grid uk-grid-small uk-grid-divider" uk-grid>
|
||||
<div class="uk-width-1-4 uk-text-meta">
|
||||
<div class="uk-text-xsmall" style="color: #EEB204">Beta</div>
|
||||
<!-- <div class="uk-text-xsmall" style="color: #EEB204">Beta</div>-->
|
||||
{{title}}
|
||||
</div>
|
||||
<div class="uk-width-expand">
|
||||
|
@ -96,6 +97,7 @@ export class FosComponent {
|
|||
public routerHelper: RouterHelper = new RouterHelper();
|
||||
public properties = properties;
|
||||
public title: string = "Fields of Science";
|
||||
private searchFieldsHelper: SearchFields = new SearchFields();
|
||||
|
||||
public viewAllClick() {
|
||||
// if(this.subjects.length <= this.threshold*2) {
|
||||
|
@ -122,11 +124,11 @@ export class FosComponent {
|
|||
|
||||
public buildFosQueryParam(fos) {
|
||||
// return {'foslabel': this.urlEncodeAndQuote(fos.id+"||"+fos.label)};
|
||||
return (properties.environment !== 'production' ? ({'foslabel': this.urlEncodeAndQuote(fos.id+"||"+fos.label)}) : ({'fos': this.urlEncodeAndQuote(fos.id)}));
|
||||
return (this.searchFieldsHelper.getFosParameter() == 'foslabel' ? ({'foslabel': this.urlEncodeAndQuote(fos.id+"||"+fos.label)}) : ({'fos': this.urlEncodeAndQuote(fos.id)}));
|
||||
}
|
||||
|
||||
public buildFosHrefParam(fos): string {
|
||||
// return ('foslabel='+this.urlEncodeAndQuote(fos.id+"||"+fos.label));
|
||||
return (properties.environment !== 'production' ? ('foslabel='+this.urlEncodeAndQuote(fos.id+"||"+fos.label)) : ('fos='+this.urlEncodeAndQuote(fos.id)));
|
||||
return (this.searchFieldsHelper.getFosParameter() == 'foslabel' ? ('foslabel='+this.urlEncodeAndQuote(fos.id+"||"+fos.label)) : ('fos='+this.urlEncodeAndQuote(fos.id)));
|
||||
}
|
||||
}
|
||||
|
|
|
@ -20,14 +20,16 @@ import {RouterHelper} from "../../utils/routerHelper.class";
|
|||
</div>
|
||||
<div *ngIf="!isMobile">
|
||||
<span *ngFor="let item of fundedByProjects.slice(0, viewAll?fundedByProjects.length:threshold) let i=index">
|
||||
<span class="uk-text-emphasis">
|
||||
<span class="uk-text-emphasis" (click)="dropClicked=true">
|
||||
<a class="uk-link uk-link-text">
|
||||
<ng-container *ngTemplateOutlet="funder; context: {item: item}"></ng-container>
|
||||
</a>
|
||||
</span>
|
||||
<div class="default-dropdown uk-margin-remove-top uk-dropdown"
|
||||
uk-dropdown="pos: bottom-left; mode:click">
|
||||
<ng-container *ngTemplateOutlet="dropInfo; context: { item: item}"></ng-container>
|
||||
<ng-container *ngIf="dropClicked">
|
||||
<ng-container *ngTemplateOutlet="dropInfo; context: { item: item, index: i}"></ng-container>
|
||||
</ng-container>
|
||||
</div>
|
||||
<span *ngIf="i < (fundedByProjects.slice(0, viewAll?fundedByProjects.length:threshold).length - 1)">, </span>
|
||||
</span>
|
||||
|
@ -35,13 +37,13 @@ import {RouterHelper} from "../../utils/routerHelper.class";
|
|||
<div *ngIf="isMobile">
|
||||
<div *ngFor="let item of fundedByProjects.slice(0, viewAll?fundedByProjects.length:threshold) let i=index"
|
||||
class="uk-flex uk-flex-middle uk-margin-small-bottom">
|
||||
<span class="uk-text-emphasis uk-width-expand">
|
||||
<span class="uk-text-emphasis uk-width-expand" (click)="dropClicked=true">
|
||||
<ng-container *ngTemplateOutlet="funder; context: {item: item}"></ng-container>
|
||||
</span>
|
||||
<a #toggle><icon name="info" visuallyHidden="info" [type]="'outlined'"></icon></a>
|
||||
<mobile-dropdown [toggle]="toggle">
|
||||
<div class="uk-margin-remove-top">
|
||||
<ng-container *ngTemplateOutlet="dropInfo; context: { item: item}"></ng-container>
|
||||
<div *ngIf="dropClicked" class="uk-margin-remove-top">
|
||||
<ng-container *ngTemplateOutlet="dropInfo; context: { item: item, index: i}"></ng-container>
|
||||
</div>
|
||||
</mobile-dropdown>
|
||||
</div>
|
||||
|
@ -54,7 +56,7 @@ import {RouterHelper} from "../../utils/routerHelper.class";
|
|||
<span *ngIf="item['acronym'] || item['title']">| {{ item['acronym'] ? item['acronym'] : item['title']}}</span>
|
||||
</ng-template>
|
||||
|
||||
<ng-template #dropInfo let-item=item>
|
||||
<ng-template #dropInfo let-item=item let-index=index>
|
||||
<div class="uk-padding-small">
|
||||
<span>Project</span>
|
||||
<div class="uk-margin-bottom">
|
||||
|
@ -84,7 +86,7 @@ import {RouterHelper} from "../../utils/routerHelper.class";
|
|||
<span class="uk-text-meta">Funding stream: </span>{{item.funding}}
|
||||
</li>
|
||||
</ul>
|
||||
<div *ngIf="getVocabularyLabel(item, provenanceActionVocabulary, i) || item.validated" class="uk-text-meta">
|
||||
<div *ngIf="item.provenanceAction || item.validated" class="uk-text-meta">
|
||||
<span *ngIf="item.validated">Validated by funder</span>
|
||||
<span *ngIf="item.provenanceAction && item.validated"> | </span>
|
||||
<span *ngIf="item.provenanceAction">{{item.provenanceAction}}</span>
|
||||
|
@ -105,8 +107,15 @@ export class FundedByComponent {
|
|||
public url = properties.searchLinkToProject.split('?')[0];
|
||||
public title: string = "Funded by";
|
||||
@Input() provenanceActionVocabulary = null;
|
||||
public provenancesCalculated: boolean[] = [];
|
||||
// public provenancesCalculated: boolean[] = [];
|
||||
public routerHelper:RouterHelper = new RouterHelper();
|
||||
public dropClicked: boolean = false;
|
||||
|
||||
public ngOnInit() {
|
||||
this.fundedByProjects.forEach((project, index) => {
|
||||
this.getVocabularyLabel(project, this.provenanceActionVocabulary, index);
|
||||
})
|
||||
}
|
||||
|
||||
public viewAllClick() {
|
||||
if(this.fundedByProjects.length <= this.threshold*2) {
|
||||
|
@ -124,11 +133,11 @@ export class FundedByComponent {
|
|||
}
|
||||
|
||||
public getVocabularyLabel(item: any, vocabulary: any, index: number) {
|
||||
if(!this.provenancesCalculated[index]) {
|
||||
this.provenancesCalculated[index] = true;
|
||||
// if(!this.provenancesCalculated[index]) {
|
||||
// this.provenancesCalculated[index] = true;
|
||||
item.provenanceAction = HelperFunctions.getVocabularyLabel(item.provenanceAction, vocabulary, false);
|
||||
}
|
||||
return item.provenanceAction;
|
||||
// }
|
||||
// return item.provenanceAction;
|
||||
}
|
||||
|
||||
public addEoscPrevInParams(obj) {
|
||||
|
|
|
@ -21,7 +21,7 @@ import {AlertModal} from "../../../utils/modal/alert";
|
|||
[languages]="languages" [programmingLanguages]="programmingLanguages"
|
||||
[compatibility]="compatibility" [aggregationStatus]="aggregationStatus"
|
||||
[thematic]="thematic" [type]="type" [prevPath]="prevPath"
|
||||
[countries]="countries" [projects]="projects"
|
||||
[countries]="countries" [publiclyFunded]="publiclyFunded" [projects]="projects"
|
||||
></entity-metadata>
|
||||
</div>
|
||||
<div *ngIf="authors">
|
||||
|
@ -63,5 +63,6 @@ export class LandingHeaderComponent {
|
|||
@Input() type; // data provider landing
|
||||
@Input() prevPath: string = "";
|
||||
@Input() countries;
|
||||
@Input() publiclyFunded;
|
||||
@Input() projects;
|
||||
}
|
||||
|
|
|
@ -4,12 +4,12 @@ import {CommonModule} from "@angular/common";
|
|||
import {LandingModule} from "../landing.module";
|
||||
import {ShowAuthorsModule} from "../../../utils/authors/showAuthors.module";
|
||||
import {IconsModule} from "src/app/openaireLibrary/utils/icons/icons.module";
|
||||
import {ShowPublisherModule} from "../showPublisher.module";
|
||||
import {RouterModule} from "@angular/router";
|
||||
import {ResultLandingUtilsModule} from "../resultLandingUtils.module";
|
||||
import {EntityMetadataModule} from "../entity-metadata.module";
|
||||
|
||||
@NgModule({
|
||||
imports: [CommonModule, LandingModule, ShowAuthorsModule, IconsModule, ShowPublisherModule, RouterModule, ResultLandingUtilsModule],
|
||||
imports: [CommonModule, LandingModule, ShowAuthorsModule, IconsModule, RouterModule, ResultLandingUtilsModule, EntityMetadataModule],
|
||||
declarations: [LandingHeaderComponent],
|
||||
exports: [LandingHeaderComponent]
|
||||
})
|
||||
|
|
|
@ -8,19 +8,15 @@ import { RouterModule } from '@angular/router';
|
|||
import {TabPagingComponent} from './tabPaging.component';
|
||||
import {ShowTitleComponent} from './showTitle.component';
|
||||
import {AddThisComponent} from './addThis.component';
|
||||
import {PiwikServiceModule} from '../../utils/piwik/piwikService.module';
|
||||
import {PreviousRouteRecorder} from'../../utils/piwik/previousRouteRecorder.guard';
|
||||
|
||||
@NgModule({
|
||||
imports: [
|
||||
CommonModule, FormsModule, RouterModule, PiwikServiceModule
|
||||
CommonModule, FormsModule, RouterModule
|
||||
],
|
||||
declarations: [
|
||||
TabPagingComponent, ShowTitleComponent, AddThisComponent
|
||||
],
|
||||
providers:[
|
||||
PreviousRouteRecorder
|
||||
],
|
||||
providers:[],
|
||||
exports: [
|
||||
TabPagingComponent, ShowTitleComponent, AddThisComponent
|
||||
]
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
import {HostedByCollectedFrom, Project, RelationResult} from "../../utils/result-preview/result-preview";
|
||||
import {Context, Measure, Metric, Reference} from "../../utils/entities/resultLandingInfo";
|
||||
import {Context, Measure, Metric, MetricPerDatasource, Reference} from "../../utils/entities/resultLandingInfo";
|
||||
import {Injectable} from '@angular/core';
|
||||
import {properties} from "../../../../environments/environment";
|
||||
import {StringUtils} from "../../utils/string-utils.class";
|
||||
|
@ -9,11 +9,11 @@ import {StringUtils} from "../../utils/string-utils.class";
|
|||
})
|
||||
export class ParsingFunctions {
|
||||
public eoscSubjects = [
|
||||
{label: 'EOSC::Jupyter Notebook', link: 'https://' + (properties.environment != 'production'?'beta.':'') + 'search.marketplace.eosc-portal.eu/search/service?q=*&fq=tag_list:"EOSC%5C:%5C:Jupyter%20Notebook"', value: 'Jupyter Notebook'},
|
||||
{label: 'EOSC::RO-crate', link: 'https://' + (properties.environment != 'production'?'beta.':'') + 'search.marketplace.eosc-portal.eu/search/data-source?q=*&fq=tag_list:%22eosc%5C:%5C:ro%5C-crate%22', value: 'RO-crate'},
|
||||
{label: 'EOSC::Galaxy Workflow', link: 'https://' + (properties.environment != 'production'?'beta.':'') + 'search.marketplace.eosc-portal.eu/search/service?q=*&fq=tag_list:%22eosc%5C:%5C:galaxy%20workflow%22', value: 'Galaxy Workflow'},
|
||||
{label: 'EOSC::Twitter Data', link: 'https://' + (properties.environment != 'production'?'beta.':'') + 'search.marketplace.eosc-portal.eu/search/service?q=*&fq=tag_list:%22EOSC%5C:%5C:Twitter%20Data%22', value: 'Twitter Data'},
|
||||
{label: 'EOSC::Data Cube', link: 'https://' + (properties.environment != 'production'?'beta.':'') + 'search.marketplace.eosc-portal.eu/search/service?q=*&fq=tag_list:%22EOSC%5C:%5C:Data%20Cube%22', value: 'Data Cube'}
|
||||
{label: 'EOSC::Jupyter Notebook', link: 'https://' + (properties.environment != 'production'?'beta.':'') + 'search.marketplace.eosc-portal.eu/search/service?q=*&fq=eosc_if:%22Jupyter%20Notebook%22', value: 'Jupyter Notebook'},
|
||||
{label: 'EOSC::RO-crate', link: 'https://' + (properties.environment != 'production'?'beta.':'') + 'search.marketplace.eosc-portal.eu/search/service?q=*&fq=eosc_if:%22RO%5C-crate%22', value: 'RO-crate'},
|
||||
{label: 'EOSC::Galaxy Workflow', link: 'https://' + (properties.environment != 'production'?'beta.':'') + 'search.marketplace.eosc-portal.eu/search/service?q=*&fq=eosc_if:%22Galaxy%20Workflow%22', value: 'Galaxy Workflow'},
|
||||
{label: 'EOSC::Twitter Data', link: 'https://' + (properties.environment != 'production'?'beta.':'') + 'search.marketplace.eosc-portal.eu/search/service?q=*&fq=eosc_if:%22Twitter%20Data%22', value: 'Twitter Data'},
|
||||
{label: 'EOSC::Data Cube', link: 'https://' + (properties.environment != 'production'?'beta.':'') + 'search.marketplace.eosc-portal.eu/search/service?q=*&fq=eosc_if:%22Data%20Cube%22', value: 'Data Cube'}
|
||||
]
|
||||
public notebookInSubjects: boolean = false;
|
||||
private notebookKeyword: string = "eosc jupyter notebook";
|
||||
|
@ -265,7 +265,8 @@ export class ParsingFunctions {
|
|||
"types": [],
|
||||
"years": [],
|
||||
"license": "",
|
||||
"fulltext": ""
|
||||
"fulltext": "",
|
||||
"peerReviewed": null
|
||||
};
|
||||
|
||||
if (instance.hasOwnProperty("hostedby")) {
|
||||
|
@ -359,6 +360,10 @@ export class ParsingFunctions {
|
|||
available.fulltext = instance['fulltext'];
|
||||
}
|
||||
|
||||
if(instance.hasOwnProperty("refereed") && instance.refereed.classname == "peerReviewed") {
|
||||
available.peerReviewed = true;
|
||||
}
|
||||
|
||||
hostedBy_collectedFrom.push(available);
|
||||
}
|
||||
|
||||
|
@ -533,7 +538,8 @@ export class ParsingFunctions {
|
|||
|
||||
if (pid.hasOwnProperty("classid") && pid['classid'] != "") {
|
||||
if (pid.classid == "doi" || pid.classid == "pmc" || pid.classid == "handle" || pid.classid == "pmid" || pid.classid == "re3data"
|
||||
|| pid.classid == "swhid") {
|
||||
|| pid.classid == "swhid"
|
||||
|| pid.classid == "ROR" || pid.classid == "ISNI" || pid.classid == "Wikidata" || pid.classid == "FundRef") {
|
||||
if (!identifiers.has(pid.classid)) {
|
||||
identifiers.set(pid.classid, new Array<string>());
|
||||
}
|
||||
|
@ -542,7 +548,8 @@ export class ParsingFunctions {
|
|||
} else {
|
||||
for (let i = 0; i < pid.length; i++) {
|
||||
if (pid[i].classid == "doi" || pid[i].classid == "pmc" || pid[i].classid == "handle" || pid[i].classid == "pmid" || pid[i].classid == "re3data"
|
||||
|| pid[i].classid == "swhid") {
|
||||
|| pid[i].classid == "swhid"
|
||||
|| pid[i].classid == "ROR" || pid[i].classid == "ISNI" || pid[i].classid == "Wikidata" || pid[i].classid == "FundRef") {
|
||||
if (!identifiers.has(pid[i].classid)) {
|
||||
identifiers.set(pid[i].classid, new Array<string>());
|
||||
}
|
||||
|
@ -878,19 +885,43 @@ export class ParsingFunctions {
|
|||
if (elements && elements.length) {
|
||||
let bip: Metric[] = [];
|
||||
let counts: Metric[] = [];
|
||||
let countsPerDatasource: MetricPerDatasource[] = [];
|
||||
let measure: Measure = {};
|
||||
|
||||
let datasourcePosition: Map<string, number> = new Map<string, number>();
|
||||
|
||||
let views: number = 0;
|
||||
let downloads: number = 0;
|
||||
elements.forEach(element => {
|
||||
if (element.id == 'views') {
|
||||
counts.push({name: 'views', icon: 'visibility', value: element.count, order: 0});
|
||||
measure.views = element.count;
|
||||
views += element.count;
|
||||
let datasourceId = element.datasource;
|
||||
if(datasourceId) {
|
||||
if(datasourcePosition.has(element.datasource)) {
|
||||
countsPerDatasource[datasourcePosition.get(element.datasource)].views = element.count;
|
||||
} else {
|
||||
datasourcePosition.set(element.datasource, countsPerDatasource.length);
|
||||
countsPerDatasource.push({"datasourceId": element.datasource.split("||")[0], "datasourceName": element.datasource.split("||")[1], "views": element.count, "downloads": 0})
|
||||
}
|
||||
}
|
||||
// measure.views = element.count;
|
||||
}
|
||||
if (element.id == 'downloads') {
|
||||
counts.push({name: 'downloads', icon: 'download', value: element.count, order: 1});
|
||||
measure.downloads = element.count;
|
||||
downloads += element.count;
|
||||
let datasourceId = element.datasource;
|
||||
if(datasourceId) {
|
||||
if(datasourcePosition.has(element.datasource)) {
|
||||
countsPerDatasource[datasourcePosition.get(element.datasource)].downloads = element.count;
|
||||
} else {
|
||||
datasourcePosition.set(element.datasource, countsPerDatasource.length);
|
||||
countsPerDatasource.push({"datasourceId": element.datasource.split("||")[0], "datasourceName": element.datasource.split("||")[1], "views": 0, "downloads": element.count})
|
||||
}
|
||||
}
|
||||
// measure.downloads = element.count;
|
||||
}
|
||||
if (element.id == 'influence_alt' || element.id == 'citation_count') {
|
||||
bip.push({name: 'citations', icon: 'cite', value: element.score, order: 2});
|
||||
measure.citations = element.score;
|
||||
// measure.citations = element.score;
|
||||
}
|
||||
if (element.id == 'popularity') {
|
||||
let metric: Metric = {name: 'popularity', icon: 'fire', value: null, order: 3};
|
||||
|
@ -902,14 +933,10 @@ export class ParsingFunctions {
|
|||
metric.value = 'Top 1%';
|
||||
} else if (element.class == 'C4') {
|
||||
metric.value = 'Top 10%';
|
||||
} else if (element.class == 'A') {
|
||||
metric.value = 'Exceptional';
|
||||
} else if (element.class == 'B') {
|
||||
metric.value = 'Substantial';
|
||||
} else {
|
||||
metric.value = 'Average';
|
||||
}
|
||||
measure.popularity = metric.value;
|
||||
// measure.popularity = metric.value;
|
||||
bip.push(metric);
|
||||
}
|
||||
if (element.id == 'influence') {
|
||||
|
@ -922,14 +949,10 @@ export class ParsingFunctions {
|
|||
metric.value = 'Top 1%';
|
||||
} else if (element.class == 'C4') {
|
||||
metric.value = 'Top 10%';
|
||||
} else if (element.class == 'A') {
|
||||
metric.value = 'Exceptional';
|
||||
} else if (element.class == 'B') {
|
||||
metric.value = 'Substantial';
|
||||
} else {
|
||||
metric.value = 'Average';
|
||||
}
|
||||
measure.influence = metric.value;
|
||||
// measure.influence = metric.value;
|
||||
bip.push(metric);
|
||||
}
|
||||
if (element.id == 'impulse') {
|
||||
|
@ -942,17 +965,24 @@ export class ParsingFunctions {
|
|||
metric.value = 'Top 1%';
|
||||
} else if (element.class == 'C4') {
|
||||
metric.value = 'Top 10%';
|
||||
} else if (element.class == 'A') {
|
||||
metric.value = 'Exceptional';
|
||||
} else if (element.class == 'B') {
|
||||
metric.value = 'Substantial';
|
||||
} else {
|
||||
metric.value = 'Average';
|
||||
}
|
||||
measure.impulse = metric.value;
|
||||
// measure.impulse = metric.value;
|
||||
bip.push(metric);
|
||||
}
|
||||
});
|
||||
|
||||
if(views > 0) {
|
||||
counts.push({name: 'views', icon: 'visibility', value: views, order: 0});
|
||||
}
|
||||
if(downloads > 0) {
|
||||
counts.push({name: 'downloads', icon: 'download', value: downloads, order: 1});
|
||||
}
|
||||
if(countsPerDatasource && countsPerDatasource.length > 0) {
|
||||
measure.countsPerDatasource = countsPerDatasource;
|
||||
}
|
||||
|
||||
measure.bip = bip.sort((a, b) => a.order - b.order);
|
||||
measure.counts = counts.sort((a, b) => a.order - b.order);
|
||||
return measure;
|
||||
|
|
|
@ -9,7 +9,6 @@ import {ShowSubjectsComponent} from './showSubjects.component';
|
|||
import {FundedByComponent} from './fundedBy.component';
|
||||
import {AvailableOnComponent} from './availableOn.component';
|
||||
import {TabTableComponent} from './tabTable.component';
|
||||
import {ShowPublisherComponent} from "./showPublisher.component";
|
||||
import {ShowPublisherModule} from "./showPublisher.module";
|
||||
import {RelatedToComponent} from "./relatedTo.component";
|
||||
import {FosComponent} from "./fos.component";
|
||||
|
@ -17,13 +16,11 @@ import {SdgComponent} from "./sdg.component";
|
|||
import {IconsModule} from "../../utils/icons/icons.module";
|
||||
import {AlertModalModule} from "../../utils/modal/alertModal.module";
|
||||
import { SearchInputModule } from '../../sharedComponents/search-input/search-input.module';
|
||||
import {EntityMetadataComponent} from "./entity-metadata.component";
|
||||
import {IconsService} from "../../utils/icons/icons.service";
|
||||
import {book, closed_access, cog, database, earth, open_access, unknown_access} from "../../utils/icons/icons";
|
||||
import {FullScreenModalModule} from "../../utils/modal/full-screen-modal/full-screen-modal.module";
|
||||
import {MobileDropdownModule} from "../../utils/mobile-dropdown/mobile-dropdown.module";
|
||||
|
||||
|
||||
@NgModule({
|
||||
imports: [
|
||||
CommonModule, FormsModule, RouterModule, PagingModule, ShowPublisherModule, IconsModule, AlertModalModule,
|
||||
|
@ -32,15 +29,14 @@ import {MobileDropdownModule} from "../../utils/mobile-dropdown/mobile-dropdown.
|
|||
declarations: [
|
||||
ShowIdentifiersComponent,ShowSubjectsComponent,
|
||||
FundedByComponent,AvailableOnComponent,TabTableComponent,
|
||||
RelatedToComponent, FosComponent, SdgComponent,
|
||||
EntityMetadataComponent
|
||||
RelatedToComponent, FosComponent, SdgComponent
|
||||
],
|
||||
providers:[
|
||||
],
|
||||
exports: [
|
||||
ShowIdentifiersComponent, ShowSubjectsComponent,
|
||||
FundedByComponent,AvailableOnComponent, TabTableComponent, ShowPublisherComponent,
|
||||
RelatedToComponent, FosComponent, SdgComponent, EntityMetadataComponent
|
||||
FundedByComponent,AvailableOnComponent, TabTableComponent,
|
||||
RelatedToComponent, FosComponent, SdgComponent
|
||||
]
|
||||
})
|
||||
export class ResultLandingUtilsModule {
|
||||
|
|
|
@ -15,34 +15,36 @@ import {StringUtils} from "../../../utils/string-utils.class";
|
|||
template: `
|
||||
<modal-alert #selectionModal [large]="true" (alertOutput)="modalOutput()" (cancelOutput)="modalCancel()"
|
||||
[okDisabled]="!sent && !selectionStep1 && (form.invalid || sending)">
|
||||
<sdg-selection *ngIf="subjects && subjectType == 'sdg'" #selection [class.uk-hidden]="!selectionStep1"
|
||||
[subjects]="subjects" [entityType]="entityType"></sdg-selection>
|
||||
<fos-selection *ngIf="subjects && subjectType == 'fos'" #selection [class.uk-hidden]="!selectionStep1"
|
||||
[subjects]="subjects" [contentHeight]="selectionModal.bodyHeight" [inModal]="true"></fos-selection>
|
||||
<div [class.uk-hidden]="selectionStep1">
|
||||
<div class="uk-flex uk-flex-column uk-flex-middle">
|
||||
<ng-container *ngIf="!sent && !error">
|
||||
<div>Thank you for your feedback.</div>
|
||||
<div>Before sending us your options, would you like to leave us your e-mail to notify you about the reporting status?</div>
|
||||
<div input class="uk-width-1-2 uk-margin-medium-top uk-margin-medium-bottom"
|
||||
[formInput]="form.get('email')" placeholder="E-mail">
|
||||
<span note>(Optional)</span>
|
||||
<ng-container *ngIf="isOpen">
|
||||
<sdg-selection *ngIf="subjects && subjectType == 'sdg'" #selection [class.uk-hidden]="!selectionStep1"
|
||||
[subjects]="subjects" [entityType]="entityType"></sdg-selection>
|
||||
<fos-selection *ngIf="subjects && subjectType == 'fos'" #selection [class.uk-hidden]="!selectionStep1"
|
||||
[subjects]="subjects" [contentHeight]="selectionModal.bodyHeight" [inModal]="true"></fos-selection>
|
||||
<div [class.uk-hidden]="selectionStep1">
|
||||
<div class="uk-flex uk-flex-column uk-flex-middle">
|
||||
<ng-container *ngIf="!sent && !error">
|
||||
<div>Thank you for your feedback.</div>
|
||||
<div>Before sending us your options, would you like to leave us your e-mail to notify you about the reporting status?</div>
|
||||
<div input class="uk-width-1-2 uk-margin-medium-top uk-margin-medium-bottom"
|
||||
[formInput]="form.get('email')" placeholder="E-mail">
|
||||
<span note>(Optional)</span>
|
||||
</div>
|
||||
<div>
|
||||
<re-captcha (resolved)="handleRecaptcha($event)" [siteKey]="properties.reCaptchaSiteKey"
|
||||
[ngClass]="sending ? 'uk-hidden':''"></re-captcha>
|
||||
<loading [ngClass]="sending ? '':'uk-hidden'"></loading>
|
||||
</div>
|
||||
</ng-container>
|
||||
<ng-container *ngIf="sent">
|
||||
<p>Your feedback is successfully received and it will soon be reviewed by our graph experts!</p>
|
||||
<icon customClass="uk-text-background" name="check" [ratio]="4"></icon>
|
||||
</ng-container>
|
||||
<div *ngIf="error" class="uk-alert uk-alert-danger uk-text-center uk-width-large ng-star-inserted"
|
||||
role="alert">Email sent failed! Please try again.
|
||||
</div>
|
||||
<div>
|
||||
<re-captcha (resolved)="handleRecaptcha($event)" [siteKey]="properties.reCaptchaSiteKey"
|
||||
[ngClass]="sending ? 'uk-hidden':''"></re-captcha>
|
||||
<loading [ngClass]="sending ? '':'uk-hidden'"></loading>
|
||||
</div>
|
||||
</ng-container>
|
||||
<ng-container *ngIf="sent">
|
||||
<p>Your feedback is successfully received and it will soon be reviewed by our graph experts!</p>
|
||||
<icon customClass="uk-text-background" name="check" [ratio]="4"></icon>
|
||||
</ng-container>
|
||||
<div *ngIf="error" class="uk-alert uk-alert-danger uk-text-center uk-width-large ng-star-inserted"
|
||||
role="alert">Email sent failed! Please try again.
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</ng-container>
|
||||
</modal-alert>
|
||||
`
|
||||
})
|
||||
|
@ -62,6 +64,7 @@ export class SdgFosSuggestComponent {
|
|||
public sent: boolean = false;
|
||||
public error: boolean = false;
|
||||
subscriptions: Subscription[] = [];
|
||||
isOpen: boolean = false;
|
||||
|
||||
constructor(private emailService: EmailService, private fb: FormBuilder, private cdr: ChangeDetectorRef) {}
|
||||
|
||||
|
|
|
@ -26,8 +26,9 @@ import {properties} from "../../../../environments/environment";
|
|||
<span class="uk-text-meta uk-text-small" [class.uk-text-uppercase]="key != 're3data'">{{key}}: </span>
|
||||
<span [class.uk-margin-small-left]="modal">
|
||||
<ng-container *ngFor="let item of identifiers.get(key) let j=index">
|
||||
<a *ngIf="key == 'doi' || key == 'pmc' || key == 'pmid' || key == 'handle' || key == 're3data' || key == 'swhid'"
|
||||
[href]="getUrl(key) + item" target="_blank" class="uk-display-inline-block custom-external">
|
||||
<a *ngIf="key == 'doi' || key == 'pmc' || key == 'pmid' || key == 'handle' || key == 're3data' || key == 'swhid'
|
||||
|| key == 'ROR' || key == 'ISNI' || key == 'Wikidata' || key == 'FundRef'"
|
||||
[href]="getUrl(key, item) + item" target="_blank" class="uk-display-inline-block custom-external">
|
||||
{{item}}
|
||||
</a>
|
||||
<ng-container *ngIf="(j !== (identifiers.get(key).length - 1))">, </ng-container>
|
||||
|
@ -113,7 +114,10 @@ export class ShowIdentifiersComponent implements AfterViewInit {
|
|||
});
|
||||
}
|
||||
|
||||
public getUrl(key: string): string {
|
||||
public getUrl(key: string, value: string): string {
|
||||
if(value.includes("http://") || value.includes("https://")) {
|
||||
return "";
|
||||
}
|
||||
if(key == "doi") {
|
||||
return properties.doiURL;
|
||||
} else if(key == "pmc") {
|
||||
|
@ -126,6 +130,14 @@ export class ShowIdentifiersComponent implements AfterViewInit {
|
|||
return properties.r3DataURL;
|
||||
} else if(key == "swhid") {
|
||||
return properties.swhURL;
|
||||
} else if(key == "ROR") {
|
||||
return properties.rorURL;
|
||||
} else if(key == "ISNI") {
|
||||
return properties.isniURL;
|
||||
} else if(key == "Wikidata") {
|
||||
return properties.wikiDataURL;
|
||||
} else if(key == "FundRef") {
|
||||
return properties.fundRefURL;
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -5,7 +5,8 @@ import {EnvProperties} from "../../utils/properties/env-properties";
|
|||
selector: 'showPublisher, [showPublisher]',
|
||||
template: `
|
||||
<ng-container *ngIf="publisher">
|
||||
<span [attr.uk-tooltip]="'cls: uk-active'" [title]="'Publisher'">{{publisher}}</span>
|
||||
<span class="uk-text-meta uk-margin-xsmall-right">Publisher:</span>
|
||||
<span>{{publisher}}</span>
|
||||
<span *ngIf="journal && (journal['journal'] || journal['issn'] || journal['lissn']
|
||||
|| journal['volume'] || journal['eissn'] || journal['issue'])"
|
||||
class="uk-margin-xsmall-left uk-margin-xsmall-right bullet"></span>
|
||||
|
@ -14,7 +15,8 @@ import {EnvProperties} from "../../utils/properties/env-properties";
|
|||
|| journal['volume'] || journal['eissn'] || journal['issue'])">
|
||||
<ng-container *ngIf="journal && (journal['journal'] || journal['issn'] || journal['lissn']
|
||||
|| journal['volume'] || journal['eissn'] || journal['issue'])">
|
||||
<span [attr.uk-tooltip]="'cls: uk-active'" [title]="'Journal'">
|
||||
<span>
|
||||
<span class="uk-text-meta uk-margin-xsmall-right">Journal:</span>
|
||||
<span *ngIf="journal['journal']">{{journal['journal']}}</span>
|
||||
<span *ngIf="journal['journal'] && (journal['volume'] || journal['issue'])">, </span>
|
||||
<ng-container *ngIf="journal['volume']">
|
||||
|
|
|
@ -13,7 +13,7 @@ import {properties} from "../../../../environments/environment";
|
|||
@Component({
|
||||
selector: 'showSubjects',
|
||||
template: `
|
||||
<ng-container *ngIf="!viewAllSubjects && ((classifiedSubjects && classifiedSubjects.size > 0) || (eoscSubjects && eoscSubjects.length > 0))">
|
||||
<ng-container *ngIf="properties.environment == 'production' && !viewAllSubjects && ((classifiedSubjects && classifiedSubjects.size > 0) || (eoscSubjects && eoscSubjects.length > 0))">
|
||||
<div *ngIf="!viewAllClassifiedSubjects" class="uk-text-meta">
|
||||
Subjects by Vocabulary
|
||||
</div>
|
||||
|
@ -22,10 +22,11 @@ import {properties} from "../../../../environments/environment";
|
|||
<div *ngIf="isClassifiedLarge && !viewAllClassifiedSubjects" class="uk-text-right">
|
||||
<a (click)="viewAllSubjectsByVocabularyClicked()" class="view-more-less-link">View all</a>
|
||||
</div>
|
||||
|
||||
</ng-container>
|
||||
|
||||
<ng-container *ngIf="!viewAllClassifiedSubjects && ((subjects && subjects.length > 0) || (otherSubjects && otherSubjects.size > 0))">
|
||||
<div *ngIf="!viewAllSubjects" class="uk-text-meta uk-margin-small-bottom" [class.uk-margin-medium-top]="classifiedSubjects && classifiedSubjects.size > 0">
|
||||
<div *ngIf="!viewAllSubjects" class="uk-text-meta uk-margin-small-bottom"
|
||||
[class.uk-margin-medium-top]="properties.environment == 'production' && ((classifiedSubjects && classifiedSubjects.size > 0) || (eoscSubjects && eoscSubjects.length > 0))">
|
||||
Keywords
|
||||
</div>
|
||||
<ng-container *ngTemplateOutlet="subjects_template; context: {customClasses: (isMobile && viewAllSubjects) ? '' : 'multi-line-ellipsis lines-2', id: 'content'}"></ng-container>
|
||||
|
@ -34,6 +35,16 @@ import {properties} from "../../../../environments/environment";
|
|||
</div>
|
||||
</ng-container>
|
||||
|
||||
<ng-container *ngIf="properties.environment != 'production' && !viewAllSubjects && ((eoscSubjects && eoscSubjects.length > 0))">
|
||||
<div class="uk-text-meta uk-margin-small-bottom"
|
||||
[class.uk-margin-medium-top]="(subjects && subjects.length > 0) || (otherSubjects && otherSubjects.size > 0)">
|
||||
EOSC Subjects
|
||||
</div>
|
||||
<div *ngIf="eoscSubjects && eoscSubjects.length > 0">
|
||||
<ng-container *ngTemplateOutlet="eosc_subjects_template; context: {id: 'content'}"></ng-container>
|
||||
</div>
|
||||
</ng-container>
|
||||
|
||||
<ng-template #subjects_template let-customClasses="customClasses" let-id="id">
|
||||
<div class="uk-text-break" [ngClass]="customClasses">
|
||||
<p *ngIf="subjects && subjects.length > 0"><span #content [id]="id">{{subjects.join(', ')}}</span></p>
|
||||
|
@ -78,7 +89,7 @@ import {properties} from "../../../../environments/environment";
|
|||
<ng-template #eosc_subjects_template let-customClasses="customClasses" let-id="id">
|
||||
<div class="uk-flex-wrap uk-margin-medium-right"
|
||||
[ngClass]="customClasses">
|
||||
<p class="uk-flex uk-flex-middle uk-margin-bottom">
|
||||
<p *ngIf="properties.environment == 'production'" class="uk-flex uk-flex-middle uk-margin-bottom">
|
||||
<span #classifiedContent [id]="id+'_eosc'">
|
||||
<span class="uk-margin-small-top uk-display-inline-block">
|
||||
<span uk-icon="tag"></span>
|
||||
|
@ -91,13 +102,17 @@ import {properties} from "../../../../environments/environment";
|
|||
</span>
|
||||
</span>
|
||||
</p>
|
||||
|
||||
<p *ngIf="properties.environment != 'production' && eoscSubjects && eoscSubjects.length > 0">
|
||||
<span #classifiedContent [id]="id+'_eosc'">{{getValue(eoscSubjects).join(', ')}}</span>
|
||||
</p>
|
||||
</div>
|
||||
</ng-template>
|
||||
|
||||
<modal-alert #subjectsByVocabularyModal *ngIf="!isMobile && ((classifiedSubjects && classifiedSubjects.size > 0) || (eoscSubjects && eoscSubjects.length > 0))" large="true">
|
||||
<div class="uk-text-small">
|
||||
<ng-container *ngTemplateOutlet="subjects_by_vocabulary_template"></ng-container>
|
||||
<ng-container *ngIf="eoscSubjects && eoscSubjects.length > 0"><ng-container *ngTemplateOutlet="eosc_subjects_template"></ng-container></ng-container>
|
||||
<ng-container *ngIf="eoscSubjects && eoscSubjects.length > 0"><ng-container *ngTemplateOutlet="eosc_subjects_template; context: {id: 'content'}"></ng-container></ng-container>
|
||||
</div>
|
||||
</modal-alert>
|
||||
`
|
||||
|
@ -234,4 +249,8 @@ export class ShowSubjectsComponent {
|
|||
this.openSubjectsByVocabularyModal();
|
||||
}
|
||||
}
|
||||
|
||||
getValue(eosSubjects) {
|
||||
return eosSubjects.map(res => res.value);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -0,0 +1,12 @@
|
|||
import { NgModule } from '@angular/core';
|
||||
import { RouterModule } from '@angular/router';
|
||||
import { PreviousRouteRecorder } from "../../utils/piwik/previousRouteRecorder.guard";
|
||||
import { OrganizationComponent } from "./organization.component";
|
||||
|
||||
|
||||
@NgModule({
|
||||
imports: [
|
||||
RouterModule.forChild([{ path: '', component: OrganizationComponent, canDeactivate: [PreviousRouteRecorder] }])
|
||||
]
|
||||
})
|
||||
export class OrganizationRoutingModule { }
|
|
@ -1,3 +1,9 @@
|
|||
<!-- Schema -->
|
||||
<schema2jsonld *ngIf="organizationInfo" [data]=organizationInfo
|
||||
[URL]="properties.domain + properties.baseLink+this.properties.searchLinkToOrganization+organizationInfo.relcanId"
|
||||
type="organization">
|
||||
</schema2jsonld>
|
||||
|
||||
<!-- Desktop view -->
|
||||
<div id="tm-main" class="uk-visible@m landing uk-section uk-padding-remove tm-middle">
|
||||
<div *ngIf="!isMobile" class="tm-main">
|
||||
|
@ -13,57 +19,28 @@
|
|||
</div>
|
||||
</div>
|
||||
<div *ngIf="!showFeedback" class="uk-grid uk-margin-remove-left" uk-grid>
|
||||
<!-- left column -->
|
||||
<!-- <div id="landing-left-sidebar" *ngIf="organizationInfo" class="uk-visible@s uk-padding-remove-horizontal">
|
||||
<div class="uk-flex uk-flex-column uk-flex-right uk-sticky"
|
||||
uk-sticky="end: true" [attr.offset]="offset">
|
||||
<div class="uk-margin-large-bottom uk-align-center">
|
||||
<div class="uk-text-meta uk-text-uppercase">Actions</div>
|
||||
<ul class="uk-list">
|
||||
<li class="uk-text-center">
|
||||
<a (click)="openAddThisModal()" [title]="'Share this '+openaireEntities.ORGANIZATION+' in your social networks'"
|
||||
[attr.uk-tooltip]="'pos: right; cls: uk-active uk-text-small uk-padding-small'">
|
||||
<span class="uk-icon-button uk-icon landing-action-button landing-action-button-portal">
|
||||
<icon name="share" visuallyHidden="share"></icon>
|
||||
</span>
|
||||
</a>
|
||||
</li>
|
||||
<li class="uk-text-center"
|
||||
[title]="'Download reports'"
|
||||
[attr.uk-tooltip]="'pos: right; cls: uk-active uk-text-small uk-padding-small'">
|
||||
<a class="uk-link-text uk-text-bold uk-text-uppercase" (click)="buildFunderOptions(); openDownloadReportsModal()">
|
||||
<span class="uk-icon-button uk-icon landing-action-button landing-action-button-portal">
|
||||
<icon name="download" visuallyHidden="download"></icon>
|
||||
</span>
|
||||
</a>
|
||||
</li>
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
</div> -->
|
||||
|
||||
<!-- center/right column -->
|
||||
<div id="landing-center-content" class="uk-width-expand uk-padding-remove uk-background-default">
|
||||
|
||||
<!-- Graph and feedback -->
|
||||
<ng-template #graph_and_feedback_template>
|
||||
<div class="uk-padding-xsmall">
|
||||
<div class="uk-container uk-container-xlarge uk-flex uk-flex-between uk-flex-wrap uk-margin-small-top uk-margin-small-bottom" [class.uk-invisible]="!organizationInfo">
|
||||
<!-- Last Index Info-->
|
||||
<a href="https://graph.openaire.eu" target="_blank" class="uk-width-1-1 uk-width-auto@l">
|
||||
<img src="assets/common-assets/openaire-badge-1.png" alt="Powered by OpenAIRE graph" style="height: 15px;">
|
||||
</a>
|
||||
<span *ngIf="indexUpdateDate" class="uk-text-baseline uk-text-meta uk-width-1-1 uk-width-auto@l">
|
||||
Last update of records in OpenAIRE: {{indexUpdateDate | date: 'MMM dd, yyyy'}}
|
||||
</span>
|
||||
<div class="uk-padding-xsmall">
|
||||
<div class="uk-container uk-container-xlarge uk-flex uk-flex-between uk-flex-wrap uk-margin-small-top uk-margin-small-bottom" [class.uk-invisible]="!organizationInfo">
|
||||
<!-- Last Index Info-->
|
||||
<a href="https://graph.openaire.eu" target="_blank" class="uk-width-1-1 uk-width-auto@l">
|
||||
<img src="assets/common-assets/openaire-badge-1.png" alt="Powered by OpenAIRE graph" style="height: 15px;">
|
||||
</a>
|
||||
<span *ngIf="indexUpdateDate" class="uk-text-baseline uk-text-meta uk-width-1-1 uk-width-auto@l">
|
||||
Last update of records in OpenAIRE: {{indexUpdateDate | date: 'MMM dd, yyyy'}}
|
||||
</span>
|
||||
|
||||
<!--Feedback-->
|
||||
<div *ngIf="properties.reCaptchaSiteKey" class="uk-width-1-1 uk-width-auto@l">
|
||||
<span class="uk-text-meta uk-text-xsmall">Found an issue? </span>
|
||||
<a (click)="showFeedback = true; scroll()" class="uk-text-xsmall">Give us feedback</a>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<!--Feedback-->
|
||||
<div *ngIf="properties.reCaptchaSiteKey" class="uk-width-1-1 uk-width-auto@l">
|
||||
<span class="uk-text-meta uk-text-xsmall">Found an issue? </span>
|
||||
<a (click)="showFeedback = true; scroll()" class="uk-text-xsmall">Give us feedback</a>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</ng-template>
|
||||
|
||||
<div #graph_and_feedback id="graph_and_feedback" class="uk-blur-background uk-text-xsmall uk-visible@m"
|
||||
|
@ -116,40 +93,11 @@
|
|||
<ng-container *ngIf="organizationInfo">
|
||||
<!-- Main content -->
|
||||
<div [attr.style]="'margin-top: '+(graph_height? 'calc(40px + 20px - '+graph_height+'px)': '40px')">
|
||||
<!-- Schema -->
|
||||
<schema2jsonld *ngIf="organizationInfo" [data]=organizationInfo
|
||||
[URL]="properties.domain + properties.baseLink+this.properties.searchLinkToOrganization+organizationInfo.relcanId"
|
||||
type="organization">
|
||||
</schema2jsonld>
|
||||
<!-- Actions for mobile viewport -->
|
||||
<div class="uk-flex uk-flex-right uk-margin-medium-bottom uk-hidden@s">
|
||||
<div class="uk-margin-small-right">
|
||||
<a (click)="openAddThisModal()" [title]="'Share this '+openaireEntities.ORGANIZATION+' in your social networks'"
|
||||
[attr.uk-tooltip]="'pos: right; cls: uk-active uk-text-small uk-padding-small'">
|
||||
<span class="uk-icon-button uk-icon landing-action-button landing-action-button-portal">
|
||||
<icon name="share" visuallyHidden="share"></icon>
|
||||
</span>
|
||||
</a>
|
||||
</div>
|
||||
<div [title]="'Download reports'"
|
||||
[attr.uk-tooltip]="'pos: right; cls: uk-active uk-text-small uk-padding-small'">
|
||||
<a class="uk-link-text uk-text-bold uk-text-uppercase" (click)="buildFunderOptions(); openDownloadReportsModal()">
|
||||
<span class="uk-icon-button uk-icon landing-action-button landing-action-button-portal">
|
||||
<icon name="download" visuallyHidden="download"></icon>
|
||||
</span>
|
||||
</a>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- Helper -->
|
||||
<helper *ngIf="pageContents && pageContents['top'] && pageContents['top'].length > 0"
|
||||
[texts]="pageContents['top']"></helper>
|
||||
<!-- Versions -->
|
||||
<!-- <span *ngIf="organizationInfo.deletedByInferenceIds" class="uk-text-primary uk-flex uk-flex-middle">
|
||||
<icon flex="true" ratio="0.8" name="auto_awesome_motion"></icon>
|
||||
<a (click)="openDeletedByInference()" class="uk-text-primary uk-text-small uk-margin-small-left">
|
||||
View all {{organizationInfo.deletedByInferenceIds.length}} versions
|
||||
</a>
|
||||
</span> -->
|
||||
|
||||
<!-- Landing header -->
|
||||
<landing-header [properties]="properties" [title]="organizationInfo.title.name"
|
||||
[subTitle]="(organizationInfo.name
|
||||
|
@ -169,6 +117,10 @@
|
|||
<div *ngIf="organizationInfo.country && !organizationInfo.country.toLowerCase().includes('unknown')">
|
||||
<span class="uk-text-meta">Country: </span>{{organizationInfo.country}}
|
||||
</div>
|
||||
<!-- Identifiers -->
|
||||
<div *ngIf="organizationInfo.identifiers && organizationInfo.identifiers.size > 0" class="uk-margin-small-top">
|
||||
<showIdentifiers [identifiers]="organizationInfo.identifiers" [showViewAll]="true"></showIdentifiers>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<!-- Tabs section -->
|
||||
|
@ -255,9 +207,7 @@
|
|||
</search-tab>
|
||||
</div>
|
||||
</div>
|
||||
<div class="uk-text-xsmall uk-hidden@m">
|
||||
<ng-container *ngTemplateOutlet="graph_and_feedback_template"></ng-container>
|
||||
</div>
|
||||
|
||||
<!-- Helper -->
|
||||
<helper *ngIf="pageContents && pageContents['bottom'] && pageContents['bottom'].length > 0"
|
||||
[texts]="pageContents['bottom']">
|
||||
|
@ -268,12 +218,12 @@
|
|||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<!-- Feedback -->
|
||||
<feedback *ngIf="showFeedback && organizationInfo && properties.reCaptchaSiteKey" [organizationInfo]="organizationInfo"
|
||||
[properties]="properties" [entityType]="'organization'" [fields]="feedbackFields"
|
||||
[(showForm)]="showFeedback">
|
||||
</feedback>
|
||||
</div>
|
||||
<!-- Feedback -->
|
||||
<feedback *ngIf="organizationInfo && properties.reCaptchaSiteKey" [organizationInfo]="organizationInfo"
|
||||
[properties]="properties" [entityType]="'organization'" [fields]="feedbackFields"
|
||||
[(showForm)]="showFeedback">
|
||||
</feedback>
|
||||
</div>
|
||||
|
||||
<!-- Mobile view -->
|
||||
|
@ -285,6 +235,23 @@
|
|||
&& organizationInfo.title.name !== organizationInfo.name)?organizationInfo.name:null"
|
||||
[entityType]="'organization'" [prevPath]="prevPath">
|
||||
</landing-header>
|
||||
<div class="uk-text-small">
|
||||
<!-- Web Page -->
|
||||
<div *ngIf="organizationInfo.title && organizationInfo.title.url" class="uk-margin-small-bottom uk-display-inline-block">
|
||||
<span class="uk-text-meta">Web page: </span>
|
||||
<a [href]="organizationInfo.title.url" target="_blank" class="uk-button uk-button-text uk-text-lowercase uk-text-normal custom-external">
|
||||
{{organizationInfo.title.url}}
|
||||
</a>
|
||||
</div>
|
||||
<!-- Country -->
|
||||
<div *ngIf="organizationInfo.country && !organizationInfo.country.toLowerCase().includes('unknown')">
|
||||
<span class="uk-text-meta">Country: </span>{{organizationInfo.country}}
|
||||
</div>
|
||||
<!-- Identifiers -->
|
||||
<div *ngIf="organizationInfo.identifiers && organizationInfo.identifiers.size > 0" class="uk-margin-small-top">
|
||||
<showIdentifiers [identifiers]="organizationInfo.identifiers" [showViewAll]="true" [isMobile]="true"></showIdentifiers>
|
||||
</div>
|
||||
</div>
|
||||
<div class="uk-section uk-margin-top uk-text-large uk-text-empashis uk-text-bold">
|
||||
<hr>
|
||||
<ng-container>
|
||||
|
@ -404,10 +371,7 @@
|
|||
[type]="'organizations'" [prevPath]="prevPath">
|
||||
</organizationsDeletedByInference>
|
||||
</modal-alert>
|
||||
<!-- Share -->
|
||||
<modal-alert *ngIf="organizationInfo" #addThisModal classBody="uk-flex uk-flex-center uk-flex-middle">
|
||||
<addThis></addThis>
|
||||
</modal-alert>
|
||||
|
||||
<!-- Download -->
|
||||
<modal-alert *ngIf="organizationInfo" #downloadReportsModal large="true">
|
||||
<div class="uk-padding-small uk-margin-small-left uk-margin-small-right">
|
||||
|
|
|
@ -77,7 +77,6 @@ export class OrganizationComponent {
|
|||
@ViewChild('downloadReportsFsModal') downloadReportsFsModal: FullScreenModalComponent;
|
||||
// @ViewChild('downloadReportModal') downloadReportModal;
|
||||
// @ViewChild('downloadFunderReportModal') downloadFunderReportModal;
|
||||
@ViewChild('addThisModal') addThisModal;
|
||||
@ViewChild('addThisFsModal') addThisFsModal: FullScreenModalComponent;
|
||||
|
||||
@ViewChild(ModalLoading) loading: ModalLoading;
|
||||
|
@ -172,8 +171,10 @@ export class OrganizationComponent {
|
|||
}
|
||||
}));
|
||||
}
|
||||
//this.getDivContents();
|
||||
this.getPageContents();
|
||||
if(properties.adminToolsPortalType !== "explore") {
|
||||
//this.getDivContents();
|
||||
this.getPageContents();
|
||||
}
|
||||
this.updateUrl(this.properties.domain + this.properties.baseLink + this._router.url);
|
||||
this.seoService.createLinkForCanonicalURL(this.properties.domain +this.properties.baseLink + this._router.url);
|
||||
|
||||
|
@ -715,13 +716,6 @@ export class OrganizationComponent {
|
|||
this.downloadReportsModal.cancel();
|
||||
}
|
||||
|
||||
public openAddThisModal() {
|
||||
this.addThisModal.cancelButton = false;
|
||||
this.addThisModal.okButton = false;
|
||||
this.addThisModal.alertTitle = "Share this "+OpenaireEntities.ORGANIZATION+" in your social networks";
|
||||
this.addThisModal.open();
|
||||
}
|
||||
|
||||
public getParamsForSearchLink(type: string = "") {
|
||||
if(type) {
|
||||
return this.routerHelper.createQueryParams(['f0', 'fv0', 'type', 'qf', 'sortBy'], ['relorganizationid', this.organizationId, type, 'false', 'resultdateofacceptance,descending']);
|
||||
|
|
|
@ -33,11 +33,14 @@ import {graph, versions} from "../../utils/icons/icons";
|
|||
import {FullScreenModalModule} from "../../utils/modal/full-screen-modal/full-screen-modal.module";
|
||||
import {EGIDataTransferModule} from "../../utils/dataTransfer/transferData.module";
|
||||
import {EntityActionsModule} from "../../utils/entity-actions/entity-actions.module";
|
||||
import {OrganizationRoutingModule} from "./organization-routing.module";
|
||||
import {ResultLandingUtilsModule} from "../landing-utils/resultLandingUtils.module";
|
||||
|
||||
|
||||
@NgModule({
|
||||
imports: [
|
||||
CommonModule, FormsModule, RouterModule,
|
||||
OrganizationRoutingModule,
|
||||
LoadingModalModule, AlertModalModule, ErrorMessagesModule,
|
||||
LandingModule,
|
||||
DataProvidersServiceModule,
|
||||
|
@ -49,7 +52,7 @@ import {EntityActionsModule} from "../../utils/entity-actions/entity-actions.mod
|
|||
ProjectsServiceModule,
|
||||
Schema2jsonldModule, SEOServiceModule, HelperModule,
|
||||
OrganizationsDeletedByInferenceModule, LandingHeaderModule, FeedbackModule,
|
||||
TabsModule, SearchTabModule, LoadingModule, IconsModule, InputModule, FullScreenModalModule, EGIDataTransferModule, EntityActionsModule
|
||||
TabsModule, SearchTabModule, LoadingModule, IconsModule, InputModule, FullScreenModalModule, EntityActionsModule, ResultLandingUtilsModule
|
||||
],
|
||||
declarations: [
|
||||
OrganizationComponent,
|
||||
|
|
|
@ -0,0 +1,12 @@
|
|||
import { NgModule } from '@angular/core';
|
||||
import { RouterModule } from '@angular/router';
|
||||
import { PreviousRouteRecorder } from "../../utils/piwik/previousRouteRecorder.guard";
|
||||
import { ProjectComponent } from "./project.component";
|
||||
|
||||
|
||||
@NgModule({
|
||||
imports: [
|
||||
RouterModule.forChild([{ path: '', component: ProjectComponent, canDeactivate: [PreviousRouteRecorder] }])
|
||||
]
|
||||
})
|
||||
export class ProjectRoutingModule { }
|
|
@ -1,3 +1,8 @@
|
|||
<!-- schema.org-->
|
||||
<schema2jsonld *ngIf="projectInfo"
|
||||
[data]=projectInfo [URL]="properties.domain+properties.baseLink+properties.searchLinkToProject+projectId"
|
||||
type="project"></schema2jsonld>
|
||||
|
||||
<!-- Desktop view -->
|
||||
<div class=" uk-visible@m landing uk-section uk-padding-remove tm-middle">
|
||||
<div *ngIf="!isMobile" class="tm-main">
|
||||
|
@ -141,10 +146,7 @@
|
|||
<div [attr.style]="'margin-top: '+(graph_height? 'calc(40px + 20px - '+graph_height+'px)': '40px')">
|
||||
<div class="uk-grid uk-grid-small" uk-grid>
|
||||
<div class="uk-width-expand">
|
||||
<!-- schema.org-->
|
||||
<schema2jsonld [data]=projectInfo
|
||||
[URL]="properties.domain+properties.baseLink+properties.searchLinkToProject+projectId"
|
||||
type="project"></schema2jsonld>
|
||||
|
||||
<!-- Actions for mobile viewport -->
|
||||
<div class="uk-flex uk-flex-right uk-margin-medium-bottom uk-hidden@s">
|
||||
<div class="uk-margin-small-right">
|
||||
|
@ -321,7 +323,7 @@
|
|||
</div>
|
||||
<div *ngIf="projectInfo && hasMetrics" class="uk-width-1-1 uk-width-medium@s">
|
||||
<div class="landing-metrics-card uk-text-small uk-flex uk-padding-small">
|
||||
<div class="uk-width-expand uk-flex uk-flex-middle">
|
||||
<div class="uk-width-expand uk-flex uk-flex-top">
|
||||
<div class="uk-grid uk-grid-small uk-flex-nowrap" uk-grid uk-height-match="target: > div > .cell">
|
||||
<div>
|
||||
<ng-container>
|
||||
|
|
|
@ -218,8 +218,10 @@ export class ProjectComponent {
|
|||
}
|
||||
}));
|
||||
}
|
||||
//this.getDivContents();
|
||||
this.getPageContents();
|
||||
if(properties.adminToolsPortalType !== "explore") {
|
||||
//this.getDivContents();
|
||||
this.getPageContents();
|
||||
}
|
||||
this.updateUrl(this.properties.domain + this.properties.baseLink + this._router.url);
|
||||
this.seoService.createLinkForCanonicalURL(this.properties.domain +this.properties.baseLink + this._router.url);
|
||||
this.subscriptions.push(this.route.queryParams.subscribe(params => {
|
||||
|
@ -897,9 +899,11 @@ export class ProjectComponent {
|
|||
}
|
||||
|
||||
private closeLoading() {
|
||||
if (this.loading) {
|
||||
this.loading.close();
|
||||
}
|
||||
setTimeout(() => {
|
||||
if (this.loading) {
|
||||
this.loading.close();
|
||||
}
|
||||
}, 300)
|
||||
}
|
||||
|
||||
private setMessageLoading(message: string) {
|
||||
|
|
|
@ -32,9 +32,11 @@ import {FullScreenModalModule} from '../../utils/modal/full-screen-modal/full-sc
|
|||
import {SafeHtmlPipeModule} from '../../utils/pipes/safeHTMLPipe.module';
|
||||
import {EGIDataTransferModule} from "../../utils/dataTransfer/transferData.module";
|
||||
import {EntityActionsModule} from "../../utils/entity-actions/entity-actions.module";
|
||||
import {ProjectRoutingModule} from "./project-routing.module";
|
||||
|
||||
@NgModule({
|
||||
imports: [
|
||||
ProjectRoutingModule,
|
||||
CommonModule, FormsModule, RouterModule, LandingModule,
|
||||
LoadingModalModule, AlertModalModule, ErrorMessagesModule,
|
||||
IFrameModule, ReportsServiceModule,
|
||||
|
|
|
@ -27,7 +27,7 @@ import {HelperFunctions} from "../../../utils/HelperFunctions.class";
|
|||
<ul class="uk-list uk-margin">
|
||||
<li *ngFor="let result of results.slice((page-1)*pageSize, page*pageSize)">
|
||||
<result-preview [modal]="modal" [properties]="properties" [hasLink]="false" [result]="getResultPreview(result)"
|
||||
[showOrcid]="false" [isCard]="false" [prevPath]="prevPath" [showInline]="true"
|
||||
[showOrcid]="false" [prevPath]="prevPath" [showInline]="true"
|
||||
[isDeletedByInferenceModal]="true"></result-preview>
|
||||
</li>
|
||||
</ul>
|
||||
|
|
|
@ -145,6 +145,15 @@ export class DeletedByInferenceService {
|
|||
if(author.orcid_pending) {
|
||||
author.orcid_pending = author.orcid_pending.toUpperCase();
|
||||
}
|
||||
|
||||
if(result['authors'][author.rank] && results['authors'][author.rank].fullName == author.content) {
|
||||
if(!author.orcid && result['authors'][author.rank].orcid) {
|
||||
author.orcid = result['authors'][author.rank].orcid;
|
||||
} else if(!author.orcid_pending && result['authors'][author.rank].orcid_pending) {
|
||||
author.orcid_pending = result['authors'][author.rank].orcid_pending;
|
||||
}
|
||||
}
|
||||
|
||||
result['authors'][author.rank] = {"fullName": author.content, "orcid": author.orcid, "orcid_pending": author.orcid_pending};
|
||||
}
|
||||
}
|
||||
|
|
|
@ -0,0 +1,12 @@
|
|||
import { NgModule } from '@angular/core';
|
||||
import { RouterModule } from '@angular/router';
|
||||
import { PreviousRouteRecorder } from "../../utils/piwik/previousRouteRecorder.guard";
|
||||
import { ResultLandingComponent } from "./resultLanding.component";
|
||||
|
||||
|
||||
@NgModule({
|
||||
imports: [
|
||||
RouterModule.forChild([{ path: '', component: ResultLandingComponent, canDeactivate: [PreviousRouteRecorder] }])
|
||||
]
|
||||
})
|
||||
export class ResultLandingRoutingModule { }
|
|
@ -1,6 +1,11 @@
|
|||
<!-- schema.org-->
|
||||
<schema2jsonld *ngIf="resultLandingInfo && resultLandingInfo.record"
|
||||
[data]=resultLandingInfo.record [URL]="canonicalUrl"
|
||||
[searchActionRoute]="properties.searchLinkToResults"></schema2jsonld>
|
||||
|
||||
<!-- Desktop view -->
|
||||
<div id="tm-main" class="uk-visible@m landing uk-section uk-padding-remove tm-middle">
|
||||
<div *ngIf="!isMobile" class="tm-main">
|
||||
<div *ngIf="!isMobile" id="tm-main" class="landing uk-section uk-padding-remove tm-middle">
|
||||
<div class="tm-main">
|
||||
<div class="publication">
|
||||
<div *ngIf="properties.adminToolsPortalType == 'eosc'" class="eosc-explore-back-search-bar">
|
||||
<div class="uk-light uk-container uk-container-large uk-margin-left uk-height-1-1">
|
||||
|
@ -13,70 +18,6 @@
|
|||
</div>
|
||||
</div>
|
||||
<div *ngIf="!showFeedback" class="uk-grid uk-margin-remove-left" uk-grid>
|
||||
|
||||
<!-- left box/sidebar - actions -->
|
||||
<!-- <div id="landing-left-sidebar" *ngIf="resultLandingInfo" class="uk-visible@s uk-padding-remove-horizontal">
|
||||
<div class="uk-flex uk-flex-column uk-flex-between uk-flex-center uk-sticky"
|
||||
uk-sticky="end: true" [attr.offset]="offset">
|
||||
<div class="uk-align-center uk-text-center uk-margin-medium-top uk-flex uk-flex-column uk-flex-between">
|
||||
<ng-container *ngIf="resultLandingInfo && (hasAltMetrics || hasMetrics)">
|
||||
<metrics *ngIf="hasMetrics" class="uk-margin-bottom"
|
||||
[pageViews]="pageViews"
|
||||
[id]="id" [entityType]="'results'" [entity]="title"
|
||||
[viewsFrameUrl]="viewsFrameUrl" [downloadsFrameUrl]="downloadsFrameUrl"
|
||||
(metricsResults)="metricsResults($event)" [properties]=properties
|
||||
[prevPath]="prevPath">
|
||||
</metrics>
|
||||
<altmetrics *ngIf="hasAltMetrics" id="{{resultLandingInfo.identifiers?.get('doi')[0]}}" type="doi"></altmetrics>
|
||||
</ng-container>
|
||||
</div>
|
||||
<div class="uk-margin-large-bottom uk-align-center">
|
||||
<div class="uk-text-meta uk-text-uppercase">Actions</div>
|
||||
<ul class="uk-list">
|
||||
<li class="uk-text-center">
|
||||
<a (click)="openAddThisModal()"
|
||||
[title]="'Share this '+getTypeName() + ' in your social networks'"
|
||||
[attr.uk-tooltip]="'pos: right; cls: uk-active uk-text-small uk-padding-small'">
|
||||
<span class="uk-icon-button uk-icon landing-action-button landing-action-button-portal">
|
||||
<icon name="share" visuallyHidden="share"></icon>
|
||||
</span>
|
||||
</a>
|
||||
</li>
|
||||
<li *ngIf="isRouteAvailable('participate/direct-claim')" class="uk-text-center"
|
||||
[title]="'<span class=\'uk-flex uk-flex-middle\'>Link this '+getTypeName()+' to ...<span class=\'material-icons uk-margin-small-left\'>east</span></span>'"
|
||||
[attr.uk-tooltip]="'pos: right; cls: uk-active uk-text-small uk-padding-small'">
|
||||
<a [queryParams]="routerHelper.createQueryParams(['id','type','linkTo'],[id,type,'project'])"
|
||||
routerLinkActive="router-link-active" routerLink="/participate/direct-claim">
|
||||
<span class="uk-icon-button uk-icon landing-action-button landing-action-button-portal">
|
||||
<icon name="link" visuallyHidden="link"></icon>
|
||||
</span>
|
||||
</a>
|
||||
</li>
|
||||
<li class="uk-text-center">
|
||||
<a (click)="openCiteModal()"
|
||||
[title]="'Cite this '+getTypeName()"
|
||||
[attr.uk-tooltip]="'pos: right; cls: uk-active uk-text-small uk-padding-small'">
|
||||
<span class="uk-icon-button uk-icon landing-action-button landing-action-button-portal">
|
||||
<icon name="quotes" visuallyHidden="cite"></icon>
|
||||
</span>
|
||||
</a>
|
||||
</li>
|
||||
<li *ngIf="properties.adminToolsPortalType == 'explore' || properties.adminToolsPortalType == 'community' || properties.adminToolsPortalType == 'aggregator'"
|
||||
class="uk-text-center">
|
||||
<orcid-work [resultId]="id" [resultTitle]="resultLandingInfo.title" [resultLandingInfo]="resultLandingInfo"
|
||||
[pids]="pidsArrayString" [pageType]="'landing'">
|
||||
</orcid-work>
|
||||
</li>
|
||||
<li *ngIf=" properties.enableEoscDataTransfer && resultLandingInfo.resultType == 'dataset' &&
|
||||
resultLandingInfo.identifiers && resultLandingInfo.identifiers.get('doi')"
|
||||
class="uk-text-center">
|
||||
<egi-transfer-data [dois]="resultLandingInfo.identifiers.get('doi')" [isOpen]="egiTransferModalOpen"></egi-transfer-data>
|
||||
</li>
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
</div> -->
|
||||
|
||||
<!-- center box-->
|
||||
<div id="landing-center-content" class="uk-width-expand uk-padding-remove uk-background-default">
|
||||
|
||||
|
@ -161,58 +102,6 @@
|
|||
<!-- in small screens there is no sticky #graph_and_feedback so margin-top is medium (40px) -->
|
||||
<!-- else margin is medium (40px) - the actual height of uk-sticky-placeholder (graph_height - 20px -> margins of #graph_and_feedback) -->
|
||||
<div [attr.style]="'margin-top: '+(graph_height? 'calc(40px + 20px - '+graph_height+'px)': '40px')">
|
||||
<!-- schema.org-->
|
||||
<schema2jsonld *ngIf="resultLandingInfo.record" [data]=resultLandingInfo.record
|
||||
[URL]="canonicalUrl"
|
||||
[searchActionRoute]="properties.searchLinkToResults"></schema2jsonld>
|
||||
|
||||
<!-- Actions for mobile viewport -->
|
||||
<div class="uk-flex uk-flex-right uk-margin-medium-bottom uk-hidden@s">
|
||||
<!-- Share -->
|
||||
<div class="uk-margin-small-right">
|
||||
<a (click)="openAddThisModal()"
|
||||
[title]="'Share this '+getTypeName() + ' in your social networks'"
|
||||
[attr.uk-tooltip]="'pos: right; cls: uk-active uk-text-small uk-padding-small'">
|
||||
<span class="uk-icon-button uk-icon landing-action-button landing-action-button-portal">
|
||||
<icon name="share" visuallyHidden="share"></icon>
|
||||
</span>
|
||||
</a>
|
||||
</div>
|
||||
<!-- Link to -->
|
||||
<div *ngIf="isRouteAvailable('participate/direct-claim')" class="uk-margin-small-right"
|
||||
[title]="'<span class=\'uk-flex uk-flex-middle\'>Link this '+getTypeName()+' to ...<span class=\'material-icons uk-margin-small-left\'>east</span></span>'"
|
||||
[attr.uk-tooltip]="'pos: right; cls: uk-active uk-text-small uk-padding-small'">
|
||||
<a [queryParams]="routerHelper.createQueryParams(['id','type','linkTo'],[id,type,'project'])"
|
||||
routerLinkActive="router-link-active" routerLink="/participate/direct-claim">
|
||||
<span class="uk-icon-button uk-icon landing-action-button landing-action-button-portal">
|
||||
<icon name="link" visuallyHidden="link"></icon>
|
||||
</span>
|
||||
</a>
|
||||
</div>
|
||||
<!-- Cite this -->
|
||||
<div class="uk-margin-small-right">
|
||||
<a (click)="openCiteModal()"
|
||||
[title]="'Cite this '+getTypeName()"
|
||||
[attr.uk-tooltip]="'pos: right; cls: uk-active uk-text-small uk-padding-small'">
|
||||
<span class="uk-icon-button uk-icon landing-action-button landing-action-button-portal">
|
||||
<icon name="quotes" visuallyHidden="cite"></icon>
|
||||
</span>
|
||||
</a>
|
||||
</div>
|
||||
<!-- ORCID -->
|
||||
<div *ngIf="properties.adminToolsPortalType == 'explore' || properties.adminToolsPortalType == 'community' || properties.adminToolsPortalType == 'aggregator'"
|
||||
class="uk-margin-small-right">
|
||||
<orcid-work [resultId]="id" [resultTitle]="resultLandingInfo.title" [resultLandingInfo]="resultLandingInfo"
|
||||
[pids]="pidsArrayString" [pageType]="'landing'">
|
||||
</orcid-work>
|
||||
</div>
|
||||
<div *ngIf=" properties.enableEoscDataTransfer && resultLandingInfo.resultType == 'dataset' &&
|
||||
resultLandingInfo.identifiers && resultLandingInfo.identifiers.get('doi') &&
|
||||
resultLandingInfo.identifiers.get('doi').join('').indexOf('zenodo.')!=-1"
|
||||
class="">
|
||||
<egi-transfer-data [dois]="resultLandingInfo.identifiers.get('doi')" [isOpen]="egiTransferModalOpen"></egi-transfer-data>
|
||||
</div>
|
||||
</div>
|
||||
<helper *ngIf="pageContents && pageContents['top'] && pageContents['top'].length > 0"
|
||||
[texts]="pageContents['top']"></helper>
|
||||
|
||||
|
@ -228,50 +117,18 @@
|
|||
[publisher]="resultLandingInfo.publisher" [journal]="resultLandingInfo.journal"
|
||||
[languages]="resultLandingInfo.languages" [programmingLanguages]="resultLandingInfo.programmingLanguages"
|
||||
[prevPath]="prevPath" [countries]="resultLandingInfo.countries"
|
||||
[publiclyFunded]="resultLandingInfo.publiclyFunded"
|
||||
[projects]="resultLandingInfo.fundedByProjects">
|
||||
</landing-header>
|
||||
<!-- Labels -->
|
||||
<!-- Not used anymore - access labels will be in action bars, languages in the landing-header component -->
|
||||
<!-- <div class="uk-margin-bottom uk-grid uk-grid-small uk-flex-middle" uk-grid>
|
||||
<ng-container *ngIf="resultLandingInfo.accessMode && resultLandingInfo.accessMode.toLowerCase() !== 'not available'">
|
||||
<div>
|
||||
<span [class]="'uk-label uk-text-truncate '+ (accessClass(resultLandingInfo.accessMode) == 'open' ? 'uk-label-success' : '')"
|
||||
title="Access Mode">{{resultLandingInfo.accessMode}}
|
||||
</span>
|
||||
</div>
|
||||
</ng-container>
|
||||
<ng-container *ngIf="resultLandingInfo.languages &&
|
||||
removeUnknown(resultLandingInfo.languages).length > 0">
|
||||
<ng-container *ngFor="let language of removeUnknown(resultLandingInfo.languages)">
|
||||
<div>
|
||||
<span class="uk-label custom-label label-language" title="Language">{{language}}</span>
|
||||
</div>
|
||||
</ng-container>
|
||||
</ng-container>
|
||||
<ng-container *ngIf="resultLandingInfo.programmingLanguages && resultLandingInfo.programmingLanguages.length > 0">
|
||||
<ng-container *ngFor="let programmingLanguage of resultLandingInfo.programmingLanguages">
|
||||
<div>
|
||||
<span class="uk-label custom-label label-language"
|
||||
title="Programming Language">{{programmingLanguage}}</span>
|
||||
</div>
|
||||
</ng-container>
|
||||
</ng-container>
|
||||
</div> -->
|
||||
<div class="uk-text-small">
|
||||
<!-- Identifiers -->
|
||||
<div *ngIf="resultLandingInfo.identifiers && resultLandingInfo.identifiers.size > 0" class="uk-margin-small-top">
|
||||
<showIdentifiers [identifiers]="resultLandingInfo.identifiers" [showViewAll]="true"></showIdentifiers>
|
||||
</div>
|
||||
<!--Published Date, Journal and Publisher-->
|
||||
<!-- Moved inside landing-header component -->
|
||||
<!-- <div showPublisher [publisher]="resultLandingInfo.publisher"
|
||||
[publishDate]="resultLandingInfo.dateofacceptance"
|
||||
[journal]="resultLandingInfo.journal" [properties]="properties" class="uk-margin-small-top"></div> -->
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div id="main-tabs-div" class="uk-sticky uk-blur-background"
|
||||
uk-sticky="end: true; media: @m" [attr.offset]="offset">
|
||||
<div id="main-tabs-div" class="uk-sticky uk-blur-background" uk-sticky="end: true; media: @m" [attr.offset]="offset">
|
||||
<div class="uk-padding uk-padding-remove-horizontal uk-padding-remove-bottom">
|
||||
<landing-header [ngClass]="stickyHeader ? 'uk-visible@m' : 'uk-invisible'"
|
||||
[properties]="properties" [title]="resultLandingInfo.title"
|
||||
|
@ -280,10 +137,9 @@
|
|||
[date]="resultLandingInfo.dateofacceptance" [embargoEndDate]="resultLandingInfo.embargoEndDate"
|
||||
isSticky="true" [prevPath]="prevPath">
|
||||
</landing-header>
|
||||
<!-- <showTitle *ngIf="stickyHeader" [titleName]="resultLandingInfo.title" classNames="uk-margin-remove-bottom" class="uk-visible@m"></showTitle>-->
|
||||
<my-tabs (selectedActiveTab)="onSelectActiveTab($event)" [offsetForSticky]="offset" [(isSticky)]="stickyHeader">
|
||||
<my-tab tabTitle="Summary" [tabId]="'summary'" [active]="true"></my-tab>
|
||||
<my-tab *ngIf="resultLandingInfo.subjects || resultLandingInfo.otherSubjects || resultLandingInfo.classifiedSubjects"
|
||||
<my-tab *ngIf="hasSubjects"
|
||||
[tabTitle]="'Subjects'" [tabId]="'subjects'">
|
||||
</my-tab>
|
||||
<my-tab *ngIf="resultLandingInfo.references && resultLandingInfo.references.length > 0"
|
||||
|
@ -297,13 +153,13 @@
|
|||
<my-tab *ngIf="resultLandingInfo.bioentities && bioentitiesNum> 0"
|
||||
[tabTitle]="'External Databases'" [tabId]="'bioentities'" [tabNumber]="bioentitiesNum">
|
||||
</my-tab>
|
||||
<my-tab *ngIf="resultLandingInfo && (resultLandingInfo.measure || hasAltMetrics)"
|
||||
[tabTitle]="'Metrics'" [tabId]="'metrics'">
|
||||
</my-tab>
|
||||
<my-tab *ngIf="enermapsId && properties.enermapsURL"
|
||||
[tabTitle]="'Enermaps Tool'" [tabId]="'enermaps'"
|
||||
customClass="portalTab">
|
||||
</my-tab>
|
||||
<my-tab *ngIf="resultLandingInfo && (resultLandingInfo.measure || hasAltMetrics)"
|
||||
[tabTitle]="'Metrics'" [tabId]="'metrics'">
|
||||
</my-tab>
|
||||
</my-tabs>
|
||||
</div>
|
||||
</div>
|
||||
|
@ -312,7 +168,7 @@
|
|||
<ng-container>
|
||||
<ng-container *ngTemplateOutlet="summary_content"></ng-container>
|
||||
</ng-container>
|
||||
<ng-container *ngIf="resultLandingInfo.subjects || resultLandingInfo.otherSubjects || resultLandingInfo.classifiedSubjects">
|
||||
<ng-container *ngIf="hasSubjects">
|
||||
<ng-container *ngTemplateOutlet="subjects_content"></ng-container>
|
||||
</ng-container>
|
||||
<ng-container *ngIf="resultLandingInfo.references && resultLandingInfo.references.length > 0">
|
||||
|
@ -328,14 +184,14 @@
|
|||
<ng-container *ngTemplateOutlet="bioentities_content"></ng-container>
|
||||
</div>
|
||||
</ng-container>
|
||||
<ng-container *ngIf="resultLandingInfo && ((resultLandingInfo.measure && (resultLandingInfo.measure.bip.length || resultLandingInfo.measure.counts.length)) || hasAltMetrics)">
|
||||
<ng-container *ngTemplateOutlet="metricsContent"></ng-container>
|
||||
</ng-container>
|
||||
<ng-container *ngIf="enermapsId && properties.enermapsURL">
|
||||
<div id="enermaps" class="landing-section">
|
||||
<ng-container *ngTemplateOutlet="enermapsTool_content"></ng-container>
|
||||
</div>
|
||||
</ng-container>
|
||||
<ng-container *ngIf="resultLandingInfo && ((resultLandingInfo.measure && (resultLandingInfo.measure.bip.length || resultLandingInfo.measure.counts.length)) || hasAltMetrics)">
|
||||
<ng-container *ngTemplateOutlet="metricsContent"></ng-container>
|
||||
</ng-container>
|
||||
</div>
|
||||
<div class="uk-text-xsmall uk-hidden@m"><ng-container *ngTemplateOutlet="graph_and_feedback_template"></ng-container></div>
|
||||
<helper *ngIf="pageContents && pageContents['bottom'] && pageContents['bottom'].length > 0"
|
||||
|
@ -360,32 +216,12 @@
|
|||
</ng-container>
|
||||
</div>
|
||||
|
||||
<!-- right box/ sidebar-->
|
||||
<ng-container *ngIf="!showFeedback && resultLandingInfo && hasRightSidebarInfo">
|
||||
<a id="landing-right-sidebar-switcher" uk-toggle href="#right-column-offcanvas"
|
||||
class="uk-offcanvas-switcher uk-flex uk-link-reset uk-flex-center uk-flex-middle uk-hidden@m"
|
||||
(click)="rightSidebarOffcanvasClicked = true;">
|
||||
<icon name="more" [ratio]="1.5" customClass="uk-text-primary" [flex]="true" visuallyHidden="sidebar"></icon>
|
||||
</a>
|
||||
<div id="right-column-offcanvas" class="uk-offcanvas" uk-offcanvas="flip: true; overlay: true;">
|
||||
<div class="uk-offcanvas-bar">
|
||||
<button class="uk-offcanvas-close uk-close uk-icon" type="button"
|
||||
(click)="rightSidebarOffcanvasClicked = false">
|
||||
<icon name="close" [ratio]="1.5" visuallyHidden="close"></icon>
|
||||
</button>
|
||||
<div *ngIf="rightSidebarOffcanvasClicked">
|
||||
<ng-container *ngTemplateOutlet="right_column"></ng-container>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</ng-container>
|
||||
|
||||
<ng-template #right_column>
|
||||
<!-- new metrics box -->
|
||||
<div *ngIf="resultLandingInfo && resultLandingInfo.measure && (resultLandingInfo.measure.bip.length || resultLandingInfo.measure.counts.length) && !viewAll"
|
||||
class="uk-margin-medium-top uk-padding uk-padding-remove-vertical">
|
||||
<div class="landing-metrics-card uk-text-small uk-flex uk-padding-small">
|
||||
<div class="uk-width-expand uk-flex uk-flex-middle">
|
||||
<div class="uk-width-expand uk-flex uk-flex-top">
|
||||
<div class="uk-grid uk-grid-small uk-flex-nowrap" uk-grid uk-height-match="target: > div > .cell">
|
||||
<div>
|
||||
<ng-container *ngIf="resultLandingInfo.measure.bip.length">
|
||||
|
@ -453,6 +289,29 @@
|
|||
<!-- </div>-->
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div *ngIf="resultLandingInfo && resultLandingInfo.oaRoutes && !viewAll"
|
||||
class="uk-margin-medium-top uk-padding uk-padding-remove-vertical">
|
||||
<div class="landing-oaroutes-card uk-text-small uk-flex uk-padding-small">
|
||||
<div>
|
||||
<div class="uk-flex uk-flex-top" uk-grid>
|
||||
<div *ngIf="resultLandingInfo.oaRoutes.green" class="uk-flex-nowrap uk-flex uk-flex-middle uk-margin-xsmall-bottom uk-margin-remove-top">
|
||||
<div class="dot green"></div>
|
||||
<div class="uk-text-capitalize">Green</div>
|
||||
</div>
|
||||
<div *ngIf="resultLandingInfo.oaRoutes.oaColor" class="uk-flex-nowrap uk-flex uk-flex-middle uk-margin-xsmall-bottom uk-margin-remove-top">
|
||||
<div class="dot" [ngClass]="resultLandingInfo.oaRoutes.oaColor"></div>
|
||||
<div class="uk-text-capitalize">{{resultLandingInfo.oaRoutes.oaColor}}</div>
|
||||
</div>
|
||||
</div>
|
||||
<div *ngIf="resultLandingInfo.oaRoutes.isInDiamondJournal" class="uk-flex-nowrap uk-flex uk-flex-middle uk-margin-xsmall-bottom uk-text-truncate">
|
||||
<div class="dot diamond"></div>
|
||||
<div>Published in a Diamond OA journal</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="uk-margin-medium-top uk-list uk-list-large uk-padding uk-padding-remove-vertical" [class.uk-list-divider]="!viewAll">
|
||||
<!-- EOSC Services-->
|
||||
<div *ngIf="resultLandingInfo.eoscSubjects?.length > 0 && properties.adminToolsPortalType == 'eosc'
|
||||
|
@ -484,11 +343,10 @@
|
|||
</div>
|
||||
</ng-template>
|
||||
</div>
|
||||
<feedback *ngIf="showFeedback && resultLandingInfo && properties.reCaptchaSiteKey" [resultLandingInfo]="resultLandingInfo"
|
||||
[properties]="properties" [entityType]="getTypeName()" [fields]="feedbackFields"
|
||||
[(showForm)]="showFeedback" [preSelectedField]="feedbackPreSelectedField"></feedback>
|
||||
</div>
|
||||
|
||||
<feedback *ngIf="resultLandingInfo && properties.reCaptchaSiteKey" [resultLandingInfo]="resultLandingInfo"
|
||||
[properties]="properties" [entityType]="getTypeName()" [fields]="feedbackFields"
|
||||
[(showForm)]="showFeedback" [preSelectedField]="feedbackPreSelectedField"></feedback>
|
||||
</div>
|
||||
|
||||
<!-- Mobile view -->
|
||||
|
@ -522,6 +380,7 @@
|
|||
[date]="resultLandingInfo.dateofacceptance" [embargoEndDate]="resultLandingInfo.embargoEndDate"
|
||||
[publisher]="resultLandingInfo.publisher" [journal]="resultLandingInfo.journal"
|
||||
[languages]="resultLandingInfo.languages" [programmingLanguages]="resultLandingInfo.programmingLanguages"
|
||||
[publiclyFunded]="resultLandingInfo.publiclyFunded" [projects]="resultLandingInfo.fundedByProjects"
|
||||
[isMobile]="true" [prevPath]="prevPath">
|
||||
</landing-header>
|
||||
<div class="uk-text-small">
|
||||
|
@ -539,6 +398,31 @@
|
|||
<fos [subjects]="resultLandingInfo.fos" (suggestClicked)="suggestMobileClicked($event)"
|
||||
(viewAllClicked)="viewAllMobile=$event; openFsModal(fosFsModal, 'Fields of Science (FoS)')"></fos>
|
||||
</div>
|
||||
<!-- OA Routes -->
|
||||
<div *ngIf="resultLandingInfo.oaRoutes && !viewAllMobile" class="uk-margin-top uk-grid uk-grid-small uk-grid-divider" uk-grid>
|
||||
<div class="uk-width-auto uk-text-meta">
|
||||
Access Routes
|
||||
</div>
|
||||
<div class="uk-width-expand uk-flex">
|
||||
<div>
|
||||
<div class="uk-flex uk-flex-top" uk-grid>
|
||||
<div *ngIf="resultLandingInfo.oaRoutes.green" class="uk-flex-nowrap uk-flex uk-flex-middle uk-margin-xsmall-bottom uk-margin-remove-top">
|
||||
<div class="dot green"></div>
|
||||
<div class="uk-text-capitalize">Green</div>
|
||||
</div>
|
||||
<div *ngIf="resultLandingInfo.oaRoutes.oaColor" class="uk-flex-nowrap uk-flex uk-flex-middle uk-margin-xsmall-bottom uk-margin-remove-top">
|
||||
<div class="dot" [ngClass]="resultLandingInfo.oaRoutes.oaColor"></div>
|
||||
<div class="uk-text-capitalize">{{resultLandingInfo.oaRoutes.oaColor}}</div>
|
||||
</div>
|
||||
</div>
|
||||
<div *ngIf="resultLandingInfo.oaRoutes.isInDiamondJournal" class="uk-flex-nowrap uk-flex uk-flex-middle uk-margin-xsmall-bottom uk-text-truncate">
|
||||
<div class="dot diamond"></div>
|
||||
<div>Published in a Diamond OA journal</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
</div>
|
||||
<div class="uk-section uk-margin-top uk-text-large uk-text-empashis uk-text-bold">
|
||||
<hr>
|
||||
|
@ -549,7 +433,7 @@
|
|||
</div>
|
||||
<hr>
|
||||
</ng-container>
|
||||
<ng-container *ngIf="resultLandingInfo.subjects || resultLandingInfo.otherSubjects || resultLandingInfo.classifiedSubjects">
|
||||
<ng-container *ngIf="hasSubjects">
|
||||
<div class="clickable uk-flex uk-flex-middle uk-flex-between" (click)="openFsModal(subjectsFsModal, 'Subjects'); onSelectActiveTab('subjects')">
|
||||
<span>Subjects</span>
|
||||
<icon name="chevron_right" [ratio]="1.5" [flex]="true"></icon>
|
||||
|
@ -736,7 +620,7 @@
|
|||
</fs-modal>
|
||||
|
||||
<fs-modal #subjectsFsModal classTitle="uk-tile-default uk-border-bottom" (cancelEmitter)="cancelSubjectsClicked()"
|
||||
*ngIf="resultLandingInfo.subjects || resultLandingInfo.otherSubjects || resultLandingInfo.classifiedSubjects">
|
||||
*ngIf="hasSubjects">
|
||||
<ng-container *ngIf="activeTab == 'subjects'">
|
||||
<ng-container *ngTemplateOutlet="subjects_content"></ng-container>
|
||||
</ng-container>
|
||||
|
@ -835,16 +719,18 @@
|
|||
</modal-alert>
|
||||
|
||||
<modal-alert *ngIf="resultLandingInfo" #addThisModal classBody="uk-flex uk-flex-center uk-flex-middle">
|
||||
<addThis></addThis>
|
||||
<addThis *ngIf="addThisClicked"></addThis>
|
||||
</modal-alert>
|
||||
|
||||
<modal-alert *ngIf="resultLandingInfo && resultLandingInfo.organizations" #organizationsModal>
|
||||
<ng-container *ngTemplateOutlet="organizations_template; context: { threshold: resultLandingInfo.organizations.length}"></ng-container>
|
||||
<ng-container *ngIf="viewAllOrganizations">
|
||||
<ng-container *ngTemplateOutlet="organizations_template; context: { threshold: resultLandingInfo.organizations.length}"></ng-container>
|
||||
</ng-container>
|
||||
</modal-alert>
|
||||
|
||||
<modal-alert *ngIf="!isMobile && resultLandingInfo?.description" #descriptionModal
|
||||
[large]="true">
|
||||
<div [innerHTML]="resultLandingInfo.description"></div>
|
||||
<div *ngIf="descriptionClicked" [innerHTML]="resultLandingInfo.description"></div>
|
||||
</modal-alert>
|
||||
|
||||
<!--<modal-alert *ngIf="resultLandingInfo && resultLandingInfo.sdg?.length > 0"-->
|
||||
|
@ -1240,6 +1126,24 @@
|
|||
</div>
|
||||
</ng-container>
|
||||
</div>
|
||||
<div *ngIf="resultLandingInfo.measure.countsPerDatasource" class="uk-margin-medium-top uk-width-auto">
|
||||
<table class="uk-table uk-table-striped">
|
||||
<thead>
|
||||
<tr>
|
||||
<th class="uk-width-expand uk-width-1-2@xl">Data source</th>
|
||||
<th class="uk-width-auto uk-text-center">Views</th>
|
||||
<th class="uk-width-auto uk-text-center">Downloads</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
<tr *ngFor="let datasource of resultLandingInfo.measure.countsPerDatasource">
|
||||
<td class="uk-text-truncate"><a [routerLink]="properties.searchLinkToDataProvider.split('?')[0]" [queryParams]="{'datasourceId': datasource.datasourceId}">{{datasource.datasourceName}}</a></td>
|
||||
<td class="uk-text-center">{{datasource.views}}</td>
|
||||
<td class="uk-text-center">{{datasource.downloads}}</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
</div>
|
||||
<div class="uk-text-center uk-margin-large-top">
|
||||
<span class="uk-text-meta">Powered by</span>
|
||||
<a href='https://usagecounts.openaire.eu/' target='_blank' class="uk-link-reset">
|
||||
|
@ -1258,6 +1162,7 @@
|
|||
</div>
|
||||
</ng-template>
|
||||
|
||||
<ng-container *ngIf="isMobile">
|
||||
<fs-modal *ngIf="resultLandingInfo && resultLandingInfo.deletedByInferenceIds" #AlertModalDeletedByInferenceFS classTitle="uk-tile-default uk-border-bottom">
|
||||
<deletedByInference *ngIf="type == 'publication' && deleteByInferenceOpened"
|
||||
[id]="resultLandingInfo.record['result']['header']['dri:objIdentifier']"
|
||||
|
@ -1283,5 +1188,6 @@
|
|||
</fs-modal>
|
||||
|
||||
<fs-modal *ngIf="resultLandingInfo" #addThisFsModal classTitle="uk-tile-default uk-border-bottom" classBody="uk-flex uk-flex-center uk-flex-middle">
|
||||
<addThis></addThis>
|
||||
<addThis *ngIf="addThisClicked"></addThis>
|
||||
</fs-modal>
|
||||
</ng-container>
|
|
@ -74,6 +74,8 @@ export class ResultLandingComponent {
|
|||
public linkToSearchPage: string = null;
|
||||
|
||||
public citeThisClicked: boolean;
|
||||
public addThisClicked: boolean;
|
||||
public descriptionClicked: boolean;
|
||||
|
||||
// Metrics tab variables
|
||||
public metricsClicked: boolean;
|
||||
|
@ -134,7 +136,6 @@ export class ResultLandingComponent {
|
|||
|
||||
public isLoggedIn: boolean = false;
|
||||
public pid: string;
|
||||
// @ViewChild("annotation") annotation: AnnotationComponent;
|
||||
public contextsWithLink: any;
|
||||
|
||||
public relatedClassFilters: Option[]=[{"label": "All relations", "value": ""}];
|
||||
|
@ -198,6 +199,9 @@ export class ResultLandingComponent {
|
|||
private userManagementService: UserManagementService,
|
||||
private layoutService: LayoutService,
|
||||
private _contextService: ContextsService) {
|
||||
if(route.snapshot.data && route.snapshot.data['type']) {
|
||||
this.type = route.snapshot.data['type'];
|
||||
}
|
||||
}
|
||||
|
||||
ngOnInit() {
|
||||
|
@ -214,8 +218,10 @@ export class ResultLandingComponent {
|
|||
}
|
||||
}));
|
||||
}
|
||||
//this.getDivContents();
|
||||
this.getPageContents();
|
||||
if(properties.adminToolsPortalType !== "explore") {
|
||||
//this.getDivContents();
|
||||
this.getPageContents();
|
||||
}
|
||||
this.updateUrl(this.properties.domain +this.properties.baseLink + this._router.url);
|
||||
this.seoService.createLinkForCanonicalURL(this.properties.domain +this.properties.baseLink + this._router.url);
|
||||
this.subscriptions.push(this.route.queryParams.subscribe(data => {
|
||||
|
@ -554,10 +560,6 @@ export class ResultLandingComponent {
|
|||
}
|
||||
}
|
||||
}
|
||||
if (this.communityId && this.communityId == "enermaps" && properties.enermapsURL) {
|
||||
this.enermapsId = ParsingFunctions.getEnermapsConceptId(this.resultLandingInfo.contexts);
|
||||
}
|
||||
|
||||
this.relatedClassFilters = [{"label": "All relations", "value": ""}];
|
||||
if (this.resultLandingInfo.relatedClassFilters.size > 1) {
|
||||
for (let relClass of this.resultLandingInfo.relatedClassFilters) {
|
||||
|
@ -591,6 +593,9 @@ export class ResultLandingComponent {
|
|||
this.cdr.detectChanges();
|
||||
|
||||
if (contexts) {
|
||||
if (this.communityId && this.communityId == "enermaps" && properties.enermapsURL) {
|
||||
this.enermapsId = ParsingFunctions.getEnermapsConceptId(contexts);
|
||||
}
|
||||
await this.promise;
|
||||
if(this.publicCommunities && this.publicCommunities.length > 0) {
|
||||
this.resultLandingInfo.contexts = contexts.filter(context => {
|
||||
|
@ -864,6 +869,7 @@ export class ResultLandingComponent {
|
|||
}
|
||||
|
||||
public openAddThisModal() {
|
||||
this.addThisClicked = true;
|
||||
this.addThisModal.cancelButton = false;
|
||||
this.addThisModal.okButton = false;
|
||||
this.addThisModal.alertTitle = "Share this " + this.getTypeName() + " in your social networks";
|
||||
|
@ -1076,6 +1082,7 @@ export class ResultLandingComponent {
|
|||
this.sdgFosSuggest.subjectType="fos";
|
||||
}
|
||||
this.cdr.detectChanges();
|
||||
this.sdgFosSuggest.isOpen = true;
|
||||
this.sdgFosSuggest.openSelectionModal();
|
||||
}
|
||||
|
||||
|
@ -1090,6 +1097,7 @@ export class ResultLandingComponent {
|
|||
}
|
||||
|
||||
public openDescriptionModal() {
|
||||
this.descriptionClicked = true;
|
||||
this.descriptionModal.alertFooter = false;
|
||||
this.descriptionModal.alertTitle = "Abstract";
|
||||
this.descriptionModal.open();
|
||||
|
@ -1173,6 +1181,10 @@ export class ResultLandingComponent {
|
|||
return "Not available access";
|
||||
}
|
||||
|
||||
public get hasSubjects(): boolean {
|
||||
return !!(this.resultLandingInfo.subjects || this.resultLandingInfo.otherSubjects || (this.resultLandingInfo.classifiedSubjects && this.properties.environment == 'production') || this.resultLandingInfo.eoscSubjects);
|
||||
}
|
||||
|
||||
public getEoscParams() {
|
||||
let params = "";
|
||||
if(this.prevPath) {
|
||||
|
|
|
@ -20,7 +20,6 @@ import {ShowAuthorsModule} from "../../utils/authors/showAuthors.module";
|
|||
import {HelperModule} from "../../utils/helper/helper.module";
|
||||
import {ResultLandingUtilsModule} from "../landing-utils/resultLandingUtils.module";
|
||||
import {AlertModalModule} from "../../utils/modal/alertModal.module";
|
||||
import {AnnotationModule} from "../annotation/annotation.module";
|
||||
import {LandingHeaderModule} from "../landing-utils/landing-header/landing-header.module";
|
||||
import {NoLoadPaging} from "../../searchPages/searchUtils/no-load-paging.module";
|
||||
import {ResultPreviewModule} from "../../utils/result-preview/result-preview.module";
|
||||
|
@ -38,14 +37,16 @@ import {SdgFosSuggestModule} from '../landing-utils/sdg-fos-suggest/sdg-fos-sugg
|
|||
import {FullScreenModalModule} from "../../utils/modal/full-screen-modal/full-screen-modal.module";
|
||||
import {SafeHtmlPipeModule} from '../../utils/pipes/safeHTMLPipe.module';
|
||||
import {EntityActionsModule} from "../../utils/entity-actions/entity-actions.module";
|
||||
import {ResultLandingRoutingModule} from "./resultLanding-routing.module";
|
||||
|
||||
@NgModule({
|
||||
imports: [
|
||||
CommonModule, FormsModule, LandingModule, SharedModule, RouterModule,
|
||||
ResultLandingRoutingModule,
|
||||
CiteThisModule, PagingModule, IFrameModule,
|
||||
AltMetricsModule, Schema2jsonldModule, SEOServiceModule,
|
||||
DeletedByInferenceModule, ShowAuthorsModule, HelperModule, ResultLandingUtilsModule, AlertModalModule,
|
||||
AnnotationModule, LandingHeaderModule, NoLoadPaging, ResultPreviewModule, FeedbackModule, TabsModule, LoadingModule,
|
||||
LandingHeaderModule, NoLoadPaging, ResultPreviewModule, FeedbackModule, TabsModule, LoadingModule,
|
||||
OrcidModule, IconsModule, InputModule, EGIDataTransferModule, RecaptchaModule,
|
||||
SdgFosSuggestModule, FullScreenModalModule, SafeHtmlPipeModule, EntityActionsModule
|
||||
],
|
||||
|
|
|
@ -9,6 +9,7 @@ import {HostedByCollectedFrom, Organization} from "../../utils/result-preview/re
|
|||
import {Dates, Identifier, StringUtils} from "../../utils/string-utils.class";
|
||||
import {properties} from "../../../../environments/environment";
|
||||
import {HelperFunctions} from "../../utils/HelperFunctions.class";
|
||||
import {SearchFields} from "../../utils/properties/searchFields";
|
||||
|
||||
@Injectable()
|
||||
export class ResultLandingService {
|
||||
|
@ -141,6 +142,19 @@ export class ResultLandingService {
|
|||
this.resultLandingInfo.publisher = data[0].publisher;
|
||||
this.resultLandingInfo.description = this.parsingFunctions.parseDescription(data[0] && data[0].description ? data[0].description : []);
|
||||
this.resultLandingInfo.embargoEndDate = data[0].embargoenddate ? Dates.getDate(data[0].embargoenddate) : null;
|
||||
|
||||
if(data[0].hasOwnProperty("publiclyfunded") && data[0].publiclyfunded) {
|
||||
this.resultLandingInfo.publiclyFunded = data[0].publiclyfunded;
|
||||
}
|
||||
if((data[0].hasOwnProperty("isgreen") && data[0].isgreen)
|
||||
|| (data[0].hasOwnProperty("openaccesscolor") && data[0].openaccesscolor)
|
||||
|| (data[0].hasOwnProperty("isindiamondjournal") && data[0].isindiamondjournal)) {
|
||||
this.resultLandingInfo.oaRoutes = {
|
||||
"green": data[0].isgreen,
|
||||
"oaColor": data[0].openaccesscolor,
|
||||
"isInDiamondJournal":data[0].isindiamondjournal
|
||||
};
|
||||
}
|
||||
}
|
||||
|
||||
if (data[0]['bestaccessright'] && data[0]['bestaccessright'].hasOwnProperty("classname")) {
|
||||
|
@ -312,19 +326,25 @@ export class ResultLandingService {
|
|||
this.resultLandingInfo.subjects = subjectResults[0];
|
||||
this.resultLandingInfo.otherSubjects = subjectResults[1];
|
||||
this.resultLandingInfo.classifiedSubjects = subjectResults[2];
|
||||
|
||||
if (subjectResults[3]) {
|
||||
let searchFieldsHelper: SearchFields = new SearchFields();
|
||||
subjectResults[3].forEach(element => {
|
||||
this.resultLandingInfo.fos.push({id: element, label: element.replace(/^\d+/, '').trim()});
|
||||
this.resultLandingInfo.fos.push(
|
||||
{id: element, label: searchFieldsHelper.getFosParameter() == "foslabel" ? element.replace(/^\d+/, '').trim() : element}
|
||||
);
|
||||
});
|
||||
}
|
||||
if (this.resultLandingInfo.fos) {
|
||||
this.resultLandingInfo.fos.sort((a, b) => a.id.localeCompare(b.id));
|
||||
}
|
||||
this.resultLandingInfo.sdg = subjectResults[4];
|
||||
if (this.resultLandingInfo.sdg) {
|
||||
this.resultLandingInfo.sdg.sort((a, b) => {
|
||||
return HelperFunctions.sortSDGs(a, b);
|
||||
})
|
||||
if(properties.dashboard != "irish") {
|
||||
this.resultLandingInfo.sdg = subjectResults[4];
|
||||
if (this.resultLandingInfo.sdg) {
|
||||
this.resultLandingInfo.sdg.sort((a, b) => {
|
||||
return HelperFunctions.sortSDGs(a, b);
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
// if(!this.resultLandingInfo.eoscSubjects) {
|
||||
|
@ -376,6 +396,15 @@ export class ResultLandingService {
|
|||
if (author.orcid_pending) {
|
||||
author.orcid_pending = author.orcid_pending.toUpperCase();
|
||||
}
|
||||
|
||||
if(this.resultLandingInfo['authors'][author.rank] && this.resultLandingInfo['authors'][author.rank].fullName == author.content) {
|
||||
if(!author.orcid && this.resultLandingInfo['authors'][author.rank].orcid) {
|
||||
author.orcid = this.resultLandingInfo['authors'][author.rank].orcid;
|
||||
} else if(!author.orcid_pending && this.resultLandingInfo['authors'][author.rank].orcid_pending) {
|
||||
author.orcid_pending = this.resultLandingInfo['authors'][author.rank].orcid_pending;
|
||||
}
|
||||
}
|
||||
|
||||
this.resultLandingInfo['authors'][author.rank] = {
|
||||
"fullName": author.content,
|
||||
"orcid": author.orcid,
|
||||
|
|
|
@ -3,7 +3,7 @@ import { Router, ActivatedRouteSnapshot, RouterStateSnapshot, UrlTree } from '@a
|
|||
import {Observable} from 'rxjs';
|
||||
import {LoginErrorCodes} from './utils/guardHelper.class';
|
||||
|
||||
@Injectable()
|
||||
@Injectable({providedIn: 'root'})
|
||||
export class FreeGuard {
|
||||
|
||||
constructor(private router: Router) {
|
||||
|
|
|
@ -27,7 +27,6 @@ export class UserComponent {
|
|||
public errorCode: string = "";
|
||||
public redirectUrl: string = "";
|
||||
public routerHelper: RouterHelper = new RouterHelper();
|
||||
public loginUrl;
|
||||
public properties: EnvProperties = properties;
|
||||
@Input() mainComponent = true;
|
||||
|
||||
|
@ -40,7 +39,6 @@ export class UserComponent {
|
|||
}
|
||||
|
||||
ngOnInit() {
|
||||
this.loginUrl = this.properties.loginUrl;
|
||||
if (typeof document !== 'undefined') {
|
||||
this.server = false;
|
||||
this.userManagementsService.updateUserInfo( () => {
|
||||
|
|
|
@ -7,16 +7,13 @@ import {UserRoutingModule} from './user-routing.module';
|
|||
|
||||
import {UserComponent} from './user.component';
|
||||
|
||||
import {PreviousRouteRecorder} from '../utils/piwik/previousRouteRecorder.guard';
|
||||
import {LoadingModule} from "../utils/loading/loading.module";
|
||||
|
||||
@NgModule({
|
||||
imports: [
|
||||
CommonModule, FormsModule, UserRoutingModule, RouterModule, LoadingModule
|
||||
],
|
||||
providers: [
|
||||
PreviousRouteRecorder
|
||||
],
|
||||
providers: [],
|
||||
declarations: [
|
||||
UserComponent
|
||||
],
|
||||
|
|
|
@ -122,12 +122,8 @@ export class UserMiniComponent implements OnInit, OnChanges {
|
|||
public isAuthorized: boolean = false;
|
||||
@Input() public mobileView: boolean = false;
|
||||
public firstLetters: string = "";
|
||||
public server: boolean = true;
|
||||
public routerHelper: RouterHelper = new RouterHelper();
|
||||
@Input() userMenuItems;
|
||||
@Input() logInUrl;
|
||||
@Input() logOutUrl;
|
||||
@Input() cookieDomain;
|
||||
@Input() notificationConfiguration: NotificationConfiguration;
|
||||
@ViewChild('notificationsSidebar') notificationsSidebar: NotificationsSidebarComponent;
|
||||
public showNotifications = false;
|
||||
|
@ -137,9 +133,6 @@ export class UserMiniComponent implements OnInit, OnChanges {
|
|||
}
|
||||
|
||||
ngOnInit() {
|
||||
if (typeof document !== 'undefined') {
|
||||
this.server = false;
|
||||
}
|
||||
this.initUser();
|
||||
}
|
||||
|
||||
|
|
|
@ -1,4 +1,5 @@
|
|||
import {stakeholderTypes} from "../../monitor/entities/stakeholder";
|
||||
import {StakeholderConfiguration} from "../../monitor-admin/utils/indicator-utils";
|
||||
|
||||
|
||||
export class User {
|
||||
email: string;
|
||||
|
@ -9,6 +10,7 @@ export class User {
|
|||
expirationDate: number;
|
||||
role: string[];
|
||||
accessToken?: string;
|
||||
orcid?: string;
|
||||
refreshToken?: string;
|
||||
|
||||
constructor(info: any) {
|
||||
|
@ -22,6 +24,9 @@ export class User {
|
|||
if(info.refreshToken) {
|
||||
this.refreshToken = info.refreshToken;
|
||||
}
|
||||
if(info.orcid) {
|
||||
this.orcid = info.orcid;
|
||||
}
|
||||
this.fullname = (info.name) ? info.name : "";
|
||||
if (this.fullname == "") {
|
||||
if (this.firstname != "") {
|
||||
|
@ -37,7 +42,7 @@ export class User {
|
|||
this.role = [];
|
||||
if (info.roles) {
|
||||
info.roles.forEach(role => {
|
||||
this.role.push(role);
|
||||
this.role.push(decodeURIComponent(role).replace('$$', '::'));
|
||||
});
|
||||
} else {
|
||||
if (info.edu_person_entitlements) {
|
||||
|
@ -63,20 +68,31 @@ export class Session {
|
|||
var cookie = COOKIE.getCookie(COOKIE.cookieName_id);
|
||||
return (cookie != null && cookie != "");
|
||||
}
|
||||
|
||||
public static clearReloadUrl() {
|
||||
COOKIE.setCookie("reloadURLs", JSON.stringify([]), -1);
|
||||
}
|
||||
public static setReloadUrl(host: string, path: string, params: string, fragment: string) {
|
||||
var URL = {};
|
||||
let URLs:any[] = this.getReloadUrl();
|
||||
let URL = {};
|
||||
URL["host"] = host;
|
||||
URL["path"] = path;
|
||||
URL["params"] = params;
|
||||
URL["fragment"] = fragment;
|
||||
COOKIE.setCookie("reloadURL", JSON.stringify(URL), -1);
|
||||
URLs.push(URL);
|
||||
COOKIE.setCookie("reloadURLs", JSON.stringify(URLs), -1);
|
||||
}
|
||||
|
||||
public static getReloadUrl() {
|
||||
var URL = COOKIE.getCookie("reloadURL");
|
||||
URL = JSON.parse(URL);
|
||||
return URL;
|
||||
let URLs = COOKIE.getCookie("reloadURLs");
|
||||
let array = JSON.parse(URLs);
|
||||
return array?array:[];
|
||||
|
||||
}
|
||||
public static popReloadUrl() {
|
||||
let array = this.getReloadUrl();
|
||||
let Url = array.length>0?array[0]:null;
|
||||
COOKIE.setCookie("reloadURLs", JSON.stringify(array.slice(1)), -1);
|
||||
return Url;
|
||||
|
||||
}
|
||||
|
||||
|
@ -100,7 +116,7 @@ export class Session {
|
|||
}
|
||||
|
||||
public static isMonitorCurator(user: User): boolean {
|
||||
return stakeholderTypes.filter(stakeholderType => this.isTypeCurator(stakeholderType.value, user)).length > 0;
|
||||
return StakeholderConfiguration.TYPES.filter(stakeholderType => this.isTypeCurator(stakeholderType.value, user)).length > 0;
|
||||
}
|
||||
|
||||
public static isCommunityCurator(user: User): boolean {
|
||||
|
@ -112,7 +128,7 @@ export class Session {
|
|||
}
|
||||
|
||||
public static isCurator(type: string, user: User): boolean {
|
||||
return (type === 'community' || stakeholderTypes.find(stakeholderType => stakeholderType.value == type)) && this.isTypeCurator(type, user);
|
||||
return (type === 'community' || StakeholderConfiguration.TYPES.find(stakeholderType => stakeholderType.value == type)) && this.isTypeCurator(type, user);
|
||||
}
|
||||
|
||||
public static isPortalAdministrator(user: User): boolean {
|
||||
|
@ -206,12 +222,16 @@ export class COOKIE {
|
|||
}
|
||||
|
||||
export class Role {
|
||||
public static GROUP = '';
|
||||
public static PORTAL_ADMIN = 'PORTAL_ADMINISTRATOR';
|
||||
public static REGISTERED_USER = 'REGISTERED_USER';
|
||||
public static ANONYMOUS_USER = 'ROLE_ANONYMOUS';
|
||||
public static USER_MANAGER = 'USER_MANAGER';
|
||||
public static CURATOR_CLAIM = 'CURATOR_CLAIM';
|
||||
|
||||
public static roleName(type: string, id: string) {
|
||||
return this.GROUP + this.mapType(type) + '.' + id;
|
||||
}
|
||||
|
||||
public static mapType(type: string, communityMap: boolean = true): string {
|
||||
if (type == "ri" && communityMap) {
|
||||
|
|
|
@ -1,11 +1,8 @@
|
|||
import {Component, Input, OnDestroy, ViewChild} from "@angular/core";
|
||||
import {Component, Input, ViewChild} from "@angular/core";
|
||||
import {Stakeholder} from "../../../monitor/entities/stakeholder";
|
||||
import {UntypedFormBuilder, UntypedFormGroup, Validators} from "@angular/forms";
|
||||
import {StakeholderUtils} from "../../utils/indicator-utils";
|
||||
import {Option} from "../../../sharedComponents/input/input.component";
|
||||
import {Subscription} from "rxjs";
|
||||
import {EnvProperties} from "../../../utils/properties/env-properties";
|
||||
import {properties} from "src/environments/environment";
|
||||
import {StakeholderService} from "../../../monitor/services/stakeholder.service";
|
||||
import {UtilitiesService} from "../../../services/utilities.service";
|
||||
import {Role, Session, User} from "../../../login/utils/helper.class";
|
||||
|
@ -16,121 +13,132 @@ import {NotificationUtils} from "../../../notifications/notification-utils";
|
|||
import {Notification} from "../../../notifications/notifications";
|
||||
import {NotificationHandler} from "../../../utils/notification-handler";
|
||||
import {StatsProfilesService} from "../../utils/services/stats-profiles.service";
|
||||
import {StakeholderBaseComponent} from "../../utils/stakeholder-base.component";
|
||||
|
||||
@Component({
|
||||
selector: 'edit-stakeholder',
|
||||
template: `
|
||||
<form *ngIf="stakeholderFb" [formGroup]="stakeholderFb">
|
||||
<div class="uk-grid uk-grid-large" uk-grid>
|
||||
<div class="uk-width-1-2@m">
|
||||
<div input id="name" [formInput]="stakeholderFb.get('name')"
|
||||
placeholder="Name"></div>
|
||||
</div>
|
||||
<div class="uk-width-1-2@m">
|
||||
<div input [formInput]="stakeholderFb.get('alias')"
|
||||
placeholder="URL Alias"></div>
|
||||
</div>
|
||||
<div class="uk-width-1-3@m">
|
||||
<div input [formInput]="stakeholderFb.get('index_id')"
|
||||
placeholder="Index ID"></div>
|
||||
</div>
|
||||
<div class="uk-width-1-3@m">
|
||||
<div input [formInput]="stakeholderFb.get('index_name')"
|
||||
placeholder="Index Name"></div>
|
||||
</div>
|
||||
<div class="uk-width-1-3@m">
|
||||
<div input [formInput]="stakeholderFb.get('index_shortName')"
|
||||
placeholder="Index Short Name"></div>
|
||||
</div>
|
||||
<ng-container *ngIf="isCurator">
|
||||
<div class="uk-width-1-3@m">
|
||||
<div *ngIf="statsProfiles" input [formInput]="stakeholderFb.get('statsProfile')" [type]="'select'"
|
||||
[options]="statsProfiles"
|
||||
placeholder="Stats Profile"></div>
|
||||
<div class="uk-margin-medium-bottom">
|
||||
<form *ngIf="stakeholderFb" [formGroup]="stakeholderFb">
|
||||
<div class="uk-grid uk-grid-large" uk-grid>
|
||||
<div class="uk-width-1-2@m">
|
||||
<div input id="name" [formInput]="stakeholderFb.get('name')"
|
||||
placeholder="Name"></div>
|
||||
</div>
|
||||
<div class="uk-width-1-2@m">
|
||||
<div input [formInput]="stakeholderFb.get('alias')"
|
||||
placeholder="URL Alias"></div>
|
||||
</div>
|
||||
<div class="uk-width-1-3@m">
|
||||
<div input [formInput]="stakeholderFb.get('projectUpdateDate')" [type]="'date'"
|
||||
placeholder="Last Project Update"></div>
|
||||
<div input [formInput]="stakeholderFb.get('index_id')"
|
||||
placeholder="Index ID"></div>
|
||||
</div>
|
||||
</ng-container>
|
||||
<div class="uk-width-1-3@m">
|
||||
<div input [formInput]="stakeholderFb.get('locale')" [type]="'select'"
|
||||
[options]="stakeholderUtils.locales"
|
||||
placeholder="Locale"></div>
|
||||
</div>
|
||||
<div class="uk-width-1-1">
|
||||
<div input [type]="'textarea'" placeholder="Description"
|
||||
[rows]="4" [formInput]="stakeholderFb.get('description')"></div>
|
||||
</div>
|
||||
<div class="uk-width-1-1">
|
||||
<input #file id="photo" type="file" class="uk-hidden" (change)="fileChangeEvent($event)"/>
|
||||
<div *ngIf="!stakeholderFb.get('isUpload').value" class="uk-grid uk-grid-column-large" uk-grid>
|
||||
<div class="uk-margin-top uk-width-auto@l uk-width-1-1">
|
||||
<div class="uk-grid uk-grid-column-large uk-flex-middle" uk-grid>
|
||||
<div class="uk-width-auto@l uk-width-1-1 uk-flex uk-flex-center">
|
||||
<button class="uk-button uk-button-primary uk-flex uk-flex-middle uk-flex-wrap"
|
||||
(click)="file.click()">
|
||||
<icon name="cloud_upload" [flex]="true"></icon>
|
||||
<span class="uk-margin-small-left">Upload a file</span>
|
||||
</button>
|
||||
</div>
|
||||
<div class="uk-text-center uk-text-bold uk-width-expand">
|
||||
OR
|
||||
<div class="uk-width-1-3@m">
|
||||
<div input [formInput]="stakeholderFb.get('index_name')"
|
||||
placeholder="Index Name"></div>
|
||||
</div>
|
||||
<div class="uk-width-1-3@m">
|
||||
<div input [formInput]="stakeholderFb.get('index_shortName')"
|
||||
placeholder="Index Short Name"></div>
|
||||
</div>
|
||||
<ng-container *ngIf="isCurator">
|
||||
<div class="uk-width-1-3@m">
|
||||
<div *ngIf="statsProfiles" input [formInput]="stakeholderFb.get('statsProfile')"
|
||||
[type]="'select'"
|
||||
[options]="statsProfiles"
|
||||
placeholder="Stats Profile"></div>
|
||||
</div>
|
||||
<div class="uk-width-1-3@m">
|
||||
<div input [formInput]="stakeholderFb.get('projectUpdateDate')" [type]="'date'"
|
||||
placeholder="Last Project Update"></div>
|
||||
</div>
|
||||
</ng-container>
|
||||
<div class="uk-width-1-3@m">
|
||||
<div input [formInput]="stakeholderFb.get('locale')" [type]="'select'"
|
||||
[options]="stakeholderUtils.locales"
|
||||
placeholder="Locale"></div>
|
||||
</div>
|
||||
<div class="uk-width-1-1">
|
||||
<div input [type]="'textarea'" placeholder="Description"
|
||||
[rows]="4" [formInput]="stakeholderFb.get('description')"></div>
|
||||
</div>
|
||||
<div class="uk-width-1-1">
|
||||
<input #file id="photo" type="file" class="uk-hidden" (change)="fileChangeEvent($event)"/>
|
||||
<div *ngIf="!stakeholderFb.get('isUpload').value" class="uk-grid uk-grid-column-large" uk-grid>
|
||||
<div class="uk-margin-xsmall-top uk-width-auto@l uk-width-1-1">
|
||||
<div class="uk-grid uk-grid-column-large uk-flex-middle" uk-grid>
|
||||
<div class="uk-width-auto@l uk-width-1-1 uk-flex uk-flex-center">
|
||||
<button class="uk-button uk-button-primary uk-flex uk-flex-middle uk-flex-wrap"
|
||||
(click)="file.click()">
|
||||
<icon name="cloud_upload" [flex]="true"></icon>
|
||||
<span class="uk-margin-small-left">Upload a file</span>
|
||||
</button>
|
||||
</div>
|
||||
<div class="uk-text-center uk-text-bold uk-width-expand">
|
||||
OR
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div input class="uk-width-expand" type="logoURL" [placeholder]="'Link to the logo'"
|
||||
[formInput]="stakeholderFb.get('logoUrl')"></div>
|
||||
</div>
|
||||
<div input class="uk-width-expand" type="logoURL" [placeholder]="'Link to the logo'"
|
||||
[formInput]="stakeholderFb.get('logoUrl')"></div>
|
||||
<div *ngIf="stakeholderFb.get('isUpload').value" class="uk-width-1-1 uk-flex uk-flex-middle">
|
||||
<div class="uk-card uk-card-default uk-text-center uk-border-circle">
|
||||
<img class="uk-position-center uk-blend-multiply" [src]="photo">
|
||||
</div>
|
||||
<div class="uk-margin-left">
|
||||
<button (click)="remove()" class="uk-button-danger uk-icon-button uk-icon-button-small">
|
||||
<icon [flex]="true" ratio="0.8" name="delete"></icon>
|
||||
</button>
|
||||
</div>
|
||||
<div class="uk-margin-small-left">
|
||||
<button class="uk-button-secondary uk-icon-button uk-icon-button-small"
|
||||
(click)="file.click()">
|
||||
<icon [flex]="true" ratio="0.8" name="edit"></icon>
|
||||
</button>
|
||||
</div>
|
||||
</div>
|
||||
<!-- Full width error message -->
|
||||
<div *ngIf="uploadError"
|
||||
class="uk-text-danger uk-margin-small-top uk-width-1-1">{{uploadError}}</div>
|
||||
</div>
|
||||
<div *ngIf="stakeholderFb.get('isUpload').value" class="uk-width-1-1 uk-flex uk-flex-middle">
|
||||
<div class="uk-card uk-card-default uk-text-center uk-border-circle">
|
||||
<img class="uk-position-center uk-blend-multiply" [src]="photo">
|
||||
</div>
|
||||
<div class="uk-margin-left">
|
||||
<button (click)="remove()" class="uk-button-danger uk-icon-button uk-icon-button-small">
|
||||
<icon [flex]="true" ratio="0.8" name="delete"></icon>
|
||||
</button>
|
||||
</div>
|
||||
<div class="uk-margin-small-left">
|
||||
<button class="uk-button-secondary uk-icon-button uk-icon-button-small"
|
||||
(click)="file.click()">
|
||||
<icon [flex]="true" ratio="0.8" name="edit"></icon>
|
||||
</button>
|
||||
<div class="uk-width-1-1">
|
||||
<div class="uk-grid uk-child-width-expand@m uk-child-width-1-1" uk-grid>
|
||||
<div *ngIf="showVisibility">
|
||||
<div input [formInput]="stakeholderFb.get('visibility')"
|
||||
[placeholder]="'Select a status'"
|
||||
[options]="stakeholderUtils.visibilities" type="select"></div>
|
||||
</div>
|
||||
<div [class.uk-width-1-2@m]="!showVisibility && !showFunderType && !canChooseTemplate">
|
||||
<div input [formInput]="stakeholderFb.get('type')"
|
||||
[placeholder]="'Select a type of ' + entities.stakeholder"
|
||||
[options]="typesByRole" type="select"></div>
|
||||
</div>
|
||||
<div *ngIf="showFunderType">
|
||||
<div input [formInput]="stakeholderFb.get('funderType')"
|
||||
[placeholder]="'Select a type of ' + entities.funder"
|
||||
[options]="stakeholderUtils.funderTypes" type="select"></div>
|
||||
</div>
|
||||
<div *ngIf="canChooseTemplate">
|
||||
<div [placeholder]="'Select a template'"
|
||||
input [formInput]="stakeholderFb.get('defaultId')"
|
||||
[options]="defaultStakeholdersOptions" type="select"></div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<!-- Full width error message -->
|
||||
<div *ngIf="uploadError" class="uk-text-danger uk-margin-small-top uk-width-1-1">{{uploadError}}</div>
|
||||
</div>
|
||||
<div [class]="canChooseTemplate ? 'uk-width-1-3@m' : 'uk-width-1-2@m'">
|
||||
<div input [formInput]="stakeholderFb.get('visibility')"
|
||||
[placeholder]="'Select a status'"
|
||||
[options]="stakeholderUtils.statuses" type="select"></div>
|
||||
</div>
|
||||
<div [class]="canChooseTemplate ? 'uk-width-1-3@m' : 'uk-width-1-2@m'">
|
||||
<div input [formInput]="stakeholderFb.get('type')"
|
||||
[placeholder]="'Select a type'"
|
||||
[options]="types" type="select"></div>
|
||||
</div>
|
||||
<ng-container *ngIf="canChooseTemplate">
|
||||
<div class="uk-width-1-3@m">
|
||||
<div [placeholder]="'Select a template'"
|
||||
input [formInput]="stakeholderFb.get('defaultId')"
|
||||
[options]="defaultStakeholdersOptions" type="select"></div>
|
||||
</div>
|
||||
</ng-container>
|
||||
</div>
|
||||
</form>
|
||||
<div #notify [class.uk-hidden]="!stakeholderFb" notify-form
|
||||
class="uk-width-1-1 uk-margin-large-top uk-margin-medium-bottom"></div>
|
||||
</form>
|
||||
<div #notify [class.uk-hidden]="!stakeholderFb" notify-form
|
||||
class="uk-width-1-1 uk-margin-large-top"></div>
|
||||
</div>
|
||||
`,
|
||||
styleUrls: ['edit-stakeholder.component.less']
|
||||
})
|
||||
export class EditStakeholderComponent implements OnDestroy {
|
||||
export class EditStakeholderComponent extends StakeholderBaseComponent {
|
||||
@Input()
|
||||
public disableAlias: boolean = false;
|
||||
public stakeholderFb: UntypedFormGroup;
|
||||
public secure: boolean = false;
|
||||
public stakeholderUtils: StakeholderUtils = new StakeholderUtils();
|
||||
public defaultStakeholdersOptions: Option[];
|
||||
public defaultStakeholders: Stakeholder[];
|
||||
public alias: string[];
|
||||
|
@ -138,10 +146,8 @@ export class EditStakeholderComponent implements OnDestroy {
|
|||
public isDefault: boolean;
|
||||
public isNew: boolean;
|
||||
public loading: boolean = false;
|
||||
public types: Option[];
|
||||
public typesByRole: Option[];
|
||||
public statsProfiles: string[];
|
||||
public properties: EnvProperties = properties;
|
||||
private subscriptions: any[] = [];
|
||||
/**
|
||||
* Photo upload
|
||||
* */
|
||||
|
@ -158,16 +164,21 @@ export class EditStakeholderComponent implements OnDestroy {
|
|||
private stakeholderService: StakeholderService,
|
||||
private statsProfileService: StatsProfilesService,
|
||||
private utilsService: UtilitiesService, private userManagementService: UserManagementService,) {
|
||||
super();
|
||||
}
|
||||
|
||||
ngOnDestroy() {
|
||||
this.reset();
|
||||
super.ngOnDestroy();
|
||||
}
|
||||
|
||||
public init(stakeholder: Stakeholder, alias: string[], defaultStakeholders: Stakeholder[], isDefault: boolean, isNew: boolean) {
|
||||
this.reset();
|
||||
this.deleteCurrentPhoto = false;
|
||||
this.stakeholder = stakeholder;
|
||||
if (this.stakeholderUtils.defaultValue(this.stakeholderUtils.visibilities)) {
|
||||
this.stakeholder.visibility = this.stakeholderUtils.defaultValue(this.stakeholderUtils.visibilities);
|
||||
}
|
||||
this.alias = alias;
|
||||
this.defaultStakeholders = defaultStakeholders;
|
||||
this.isDefault = isDefault;
|
||||
|
@ -183,7 +194,7 @@ export class EditStakeholderComponent implements OnDestroy {
|
|||
} else {
|
||||
this.statsProfiles = [];
|
||||
}
|
||||
this.types = this.stakeholderUtils.getTypesByUserRoles(this.user, this.stakeholder.alias);
|
||||
this.typesByRole = this.stakeholderUtils.getTypesByUserRoles(this.user, this.stakeholder.alias);
|
||||
this.stakeholderFb = this.fb.group({
|
||||
_id: this.fb.control(this.stakeholder._id),
|
||||
defaultId: this.fb.control(this.stakeholder.defaultId),
|
||||
|
@ -191,21 +202,22 @@ export class EditStakeholderComponent implements OnDestroy {
|
|||
description: this.fb.control(this.stakeholder.description),
|
||||
index_name: this.fb.control(this.stakeholder.index_name, Validators.required),
|
||||
index_id: this.fb.control(this.stakeholder.index_id, Validators.required),
|
||||
index_shortName: this.fb.control(this.stakeholder.index_shortName, Validators.required),
|
||||
index_shortName: this.fb.control(this.stakeholder.index_shortName),
|
||||
statsProfile: this.fb.control(this.stakeholder.statsProfile, Validators.required),
|
||||
locale: this.fb.control(this.stakeholder.locale, Validators.required),
|
||||
projectUpdateDate: this.fb.control(this.stakeholder.projectUpdateDate),
|
||||
creationDate: this.fb.control(this.stakeholder.creationDate),
|
||||
alias: this.fb.control(this.stakeholder.alias,
|
||||
[
|
||||
Validators.required,
|
||||
this.stakeholderUtils.aliasValidatorString(
|
||||
this.alias.filter(alias => alias !== this.stakeholder.alias)
|
||||
)]
|
||||
[
|
||||
Validators.required,
|
||||
this.stakeholderUtils.aliasValidatorString(
|
||||
this.alias.filter(alias => alias !== this.stakeholder.alias)
|
||||
)]
|
||||
),
|
||||
isDefault: this.fb.control((this.isDefault)),
|
||||
visibility: this.fb.control(this.stakeholder.visibility, Validators.required),
|
||||
type: this.fb.control(this.stakeholder.type, Validators.required),
|
||||
funderType: this.fb.control(this.stakeholder.funderType),
|
||||
topics: this.fb.control(this.stakeholder.topics),
|
||||
isUpload: this.fb.control(this.stakeholder.isUpload),
|
||||
logoUrl: this.fb.control(this.stakeholder.logoUrl),
|
||||
|
@ -234,7 +246,7 @@ export class EditStakeholderComponent implements OnDestroy {
|
|||
this.subscriptions.push(this.stakeholderFb.get('type').valueChanges.subscribe(value => {
|
||||
this.onTypeChange(value, defaultStakeholders);
|
||||
}));
|
||||
this.stakeholderFb.setControl('defaultId', this.fb.control(stakeholder.defaultId, (this.isDefault && !this.isNew)?[]:Validators.required));
|
||||
this.stakeholderFb.setControl('defaultId', this.fb.control(stakeholder.defaultId, (this.isDefault && !this.isNew) ? [] : Validators.required));
|
||||
if (!this.isNew) {
|
||||
this.notification = NotificationUtils.editStakeholder(this.user.firstname + ' ' + this.user.lastname, this.stakeholder.name);
|
||||
this.notify.reset(this.notification.message);
|
||||
|
@ -280,8 +292,8 @@ export class EditStakeholderComponent implements OnDestroy {
|
|||
|
||||
public get disabled(): boolean {
|
||||
return (this.stakeholderFb && this.stakeholderFb.invalid) ||
|
||||
(this.stakeholderFb && this.stakeholderFb.pristine && !this.isNew && !this.file) ||
|
||||
(this.uploadError && this.uploadError.length > 0);
|
||||
(this.stakeholderFb && this.stakeholderFb.pristine && !this.isNew && !this.file) ||
|
||||
(this.uploadError && this.uploadError.length > 0);
|
||||
}
|
||||
|
||||
public get dirty(): boolean {
|
||||
|
@ -303,7 +315,7 @@ export class EditStakeholderComponent implements OnDestroy {
|
|||
}
|
||||
|
||||
onTypeChange(value, defaultStakeholders: Stakeholder[]) {
|
||||
this.stakeholderFb.setControl('defaultId', this.fb.control(this.stakeholder.defaultId, (this.isDefault && !this.isNew)?[]:Validators.required));
|
||||
this.stakeholderFb.setControl('defaultId', this.fb.control(this.stakeholder.defaultId, (this.isDefault && !this.isNew) ? [] : Validators.required));
|
||||
this.defaultStakeholdersOptions = [{
|
||||
label: 'New blank profile',
|
||||
value: '-1'
|
||||
|
@ -340,9 +352,9 @@ export class EditStakeholderComponent implements OnDestroy {
|
|||
if (this.isNew) {
|
||||
let defaultStakeholder = this.defaultStakeholders.find(value => value._id === this.stakeholderFb.getRawValue().defaultId);
|
||||
this.stakeholderFb.setValue(this.stakeholderUtils.createFunderFromDefaultProfile(this.stakeholderFb.getRawValue(),
|
||||
(defaultStakeholder ? defaultStakeholder.topics : []), this.stakeholderFb.getRawValue().isDefault));
|
||||
(defaultStakeholder ? defaultStakeholder.topics : []), this.stakeholderFb.getRawValue().isDefault));
|
||||
this.removePhoto();
|
||||
if(this.stakeholderFb.getRawValue().isDefault) {
|
||||
if (this.stakeholderFb.getRawValue().isDefault) {
|
||||
this.stakeholderFb.get('defaultId').setValue(null);
|
||||
}
|
||||
this.subscriptions.push(this.stakeholderService.buildStakeholder(this.properties.monitorServiceAPIURL,
|
||||
|
@ -437,7 +449,11 @@ export class EditStakeholderComponent implements OnDestroy {
|
|||
public deletePhoto() {
|
||||
if (this.stakeholder.logoUrl && this.stakeholder.isUpload) {
|
||||
this.subscriptions.push(this.utilsService.deletePhoto(this.properties.utilsService + '/delete/' +
|
||||
encodeURIComponent(this.stakeholder.type) + "/" + encodeURIComponent(this.stakeholder.alias) + "/" + this.stakeholder.logoUrl).subscribe());
|
||||
encodeURIComponent(this.stakeholder.type) + "/" + encodeURIComponent(this.stakeholder.alias) + "/" + this.stakeholder.logoUrl).subscribe());
|
||||
}
|
||||
}
|
||||
|
||||
get showFunderType() {
|
||||
return super.showFunderType && this.stakeholderFb?.get('type').value === 'funder' && !this.isDefault;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -1,29 +1,28 @@
|
|||
import {ChangeDetectorRef, Component, OnDestroy, OnInit, ViewChild} from "@angular/core";
|
||||
import {ChangeDetectorRef, Component, OnInit, ViewChild} from "@angular/core";
|
||||
import {StakeholderService} from "../../monitor/services/stakeholder.service";
|
||||
import {EnvProperties} from "../../utils/properties/env-properties";
|
||||
import {Stakeholder} from "../../monitor/entities/stakeholder";
|
||||
import { Subscription, zip} from "rxjs";
|
||||
import {zip} from "rxjs";
|
||||
import {EditStakeholderComponent} from "./edit-stakeholder/edit-stakeholder.component";
|
||||
import {properties} from "src/environments/environment";
|
||||
import {Title} from "@angular/platform-browser";
|
||||
import {BaseComponent} from "../../sharedComponents/base/base.component";
|
||||
import {ActivatedRoute} from "@angular/router";
|
||||
|
||||
@Component({
|
||||
selector: 'general',
|
||||
templateUrl: "./general.component.html"
|
||||
})
|
||||
export class GeneralComponent implements OnInit, OnDestroy {
|
||||
|
||||
export class GeneralComponent extends BaseComponent implements OnInit {
|
||||
public stakeholder: Stakeholder;
|
||||
public alias: string[];
|
||||
public properties: EnvProperties = properties;
|
||||
public defaultStakeholders: Stakeholder[];
|
||||
public loading: boolean = false;
|
||||
private subscriptions: any[] = [];
|
||||
@ViewChild('editStakeholderComponent') editStakeholderComponent: EditStakeholderComponent;
|
||||
|
||||
constructor(private stakeholderService: StakeholderService,
|
||||
private cdr: ChangeDetectorRef,
|
||||
private title: Title) {
|
||||
protected _route: ActivatedRoute,
|
||||
protected _title: Title) {
|
||||
super();
|
||||
}
|
||||
|
||||
ngOnInit() {
|
||||
|
@ -32,7 +31,8 @@ export class GeneralComponent implements OnInit, OnDestroy {
|
|||
this.stakeholder = stakeholder;
|
||||
this.cdr.detectChanges();
|
||||
if(this.stakeholder) {
|
||||
this.title.setTitle(this.stakeholder.name + " | General");
|
||||
this.title = this.stakeholder.name + " | General";
|
||||
this.setMetadata();
|
||||
let data = zip(
|
||||
this.stakeholderService.getDefaultStakeholders(this.properties.monitorServiceAPIURL),
|
||||
this.stakeholderService.getAlias(this.properties.monitorServiceAPIURL)
|
||||
|
@ -51,10 +51,9 @@ export class GeneralComponent implements OnInit, OnDestroy {
|
|||
this.editStakeholderComponent.init(this.stakeholder, this.alias, this.defaultStakeholders, this.stakeholder.defaultId == null, false)
|
||||
}
|
||||
|
||||
|
||||
public save() {
|
||||
this.loading = true;
|
||||
this.editStakeholderComponent.save((stakeholder) => {
|
||||
this.editStakeholderComponent.save(stakeholder => {
|
||||
this.stakeholder = stakeholder;
|
||||
this.stakeholderService.setStakeholder(this.stakeholder);
|
||||
this.reset();
|
||||
|
@ -64,12 +63,4 @@ export class GeneralComponent implements OnInit, OnDestroy {
|
|||
this.loading = false;
|
||||
});
|
||||
}
|
||||
|
||||
ngOnDestroy() {
|
||||
this.subscriptions.forEach(subscription => {
|
||||
if(subscription instanceof Subscription) {
|
||||
subscription.unsubscribe();
|
||||
}
|
||||
});
|
||||
}
|
||||
}
|
||||
|
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue