Deposit Results Page: messages fixed | compatibility, countries info added in Search Dataproviders Page | Dataproviders landing page: no tabs for unknown types | CSV (problem with double quotes) added in Compatible Dataproviders, Entity Registries, Search Publications pages

git-svn-id: https://svn.driver.research-infrastructures.eu/driver/dnet40/modules/uoa-services-portal/trunk@44732 d315682c-612b-4755-9ff5-7f18f6832af3
This commit is contained in:
konstantina.galouni 2016-11-29 12:44:54 +00:00
parent 7fc478f933
commit b328a6028d
8 changed files with 355 additions and 93 deletions

View File

@ -40,8 +40,8 @@ import {OrganizationService} from '../services/organization.service';
<search-result [(results)]="searchDataprovidersComponent.results" [(status)]= "searchDataprovidersComponent.status"></search-result>
</div>
<div *ngIf="(searchDataprovidersComponent.status == errorCodes.NONE && status == errorCodes.DONE)
|| status == errorCodes.NONE" class = "alert alert-warning">
<div *ngIf="(searchDataprovidersComponent.searchUtils.totalResults == 0 && status == errorCodes.DONE)
|| status == errorCodes.NONE || status == errorCodes.ERROR" class = "alert alert-warning">
<div *ngIf="organization != undefined">
No data providers found
<span *ngIf="organization != undefined">
@ -53,9 +53,12 @@ import {OrganizationService} from '../services/organization.service';
</span>
.
</div>
<div *ngIf="organization == undefined">
<div *ngIf="organization == undefined && organizationId != ''">
No organization with ID: {{organizationId}} found.
</div>
<div *ngIf="organizationId == ''">
No ID for organization.
</div>
You can still deposit your publications and/or research data in
<a href="{{zenodo}}">OpenAIRE's Zenodo catch-all repository </a>
@ -67,7 +70,7 @@ import {OrganizationService} from '../services/organization.service';
export class DepositResultComponent {
private organization: {"name": string, "url": string};
private organizationId: string;
private organizationId: string = "";
private status: number;
private errorCodes:ErrorCodes = new ErrorCodes();
@ -105,6 +108,13 @@ export class DepositResultComponent {
});
}
ngDoCheck() {
if(this.organizationId == "" || this.organizationId == undefined) {
this.organizationId = "";
this.status = this.errorCodes.ERROR;
}
}
ngOnDestroy() {
this.sub.unsubscribe();
if(this.subDataproviders != undefined) {

View File

@ -9,7 +9,7 @@ import { SearchDatasetsService } from '../../services/searchDatasets.service';
@Component({
selector: 'tabs',
template: `
<ul class="nav nav-tabs">
<ul *ngIf="tabs != undefined" class="nav nav-tabs">
<li *ngIf="tabs.length>0" class="active">
<a *ngIf="tabs[0].content=='publicationsTab' || tabs[0].content=='datasetsTab'"
data-toggle="tab" href="#{{tabs[0].content}}">
@ -37,7 +37,7 @@ import { SearchDatasetsService } from '../../services/searchDatasets.service';
</li>
</ul>
<div class="tab-content">
<div *ngIf="tabs != undefined" class="tab-content">
<div *ngIf="tabs.length>0" id="{{tabs[0].content}}" class="tab-pane fade in active panel-body">
<div *ngIf="tabs[0].content=='publicationsTab' || tabs[0].content=='datasetsTab'">
@ -111,7 +111,7 @@ export class TabsComponent {
}
ngOnInit() {
if(this.tabs != []) {
if(this.tabs != undefined && this.tabs.length > 0) {
this.search(this.tabs[0].content);
}

View File

@ -9,6 +9,7 @@ import {OpenaireProperties, ErrorCodes} from '../../utils/properties/openairePro
import {SearchFields} from '../../utils/properties/searchFields';
import {SearchPageComponent } from '../searchUtils/searchPage.component';
import {SearchUtilsClass } from '../searchUtils/searchUtils.class';
import {ExportCSVComponent} from '../../utils/exportCSV.component';
@Component({
selector: 'search-dataproviders',
@ -16,7 +17,8 @@ import {SearchUtilsClass } from '../searchUtils/searchUtils.class';
<search-page pageTitle="Compatible Dataproviders" type="datasource" [(filters)] = "filters"
[(results)] = "results" [(searchUtils)] = "searchUtils"
[baseUrl] = "baseUrl" [showResultCount]=false (queryChange)="queryChanged($event)" >
[baseUrl] = "baseUrl" [showResultCount]=false (queryChange)="queryChanged($event)"
(downloadClick)="downloadClicked($event)">
</search-page>
<!--table-view [(datasources)] = results></table-view-->
@ -38,6 +40,12 @@ export class SearchCompatibleDataprovidersComponent {
private _prefixQueryFields: {field:string,opName:string,opValue:string,values:string[]}[] =[{field:"compatibility",opName:"cm",opValue:"not", values:["UNKNOWN","hostedBy","notCompatible"]},{field:"type",opName:"tp",opValue:"not",values: ["other"]}];
// ["entityregistry","entityregistry::projects","entityregistry::repositories"]}];
private _prefixQuery: string = "";
private CSV: any = { "columnNames": [ "Title", "Type", "Coutries", "Compatibility" ],
"export":[]
};
private CSVDownloaded = false;
@ViewChild (SearchPageComponent) searchPage : SearchPageComponent ;
constructor (private route: ActivatedRoute, private _searchDataprovidersService: SearchDataprovidersService ) {
@ -140,4 +148,33 @@ export class SearchCompatibleDataprovidersComponent {
return filters;
}
private downloadClicked($event) {
if(!this.CSVDownloaded) {
this.CSVDownloaded = false;
var parameters = $event.value;
//this.getResultsCSV(parameters, false, 1, 1000);
this._searchDataprovidersService.searchCompatibleDataprovidersCSV(parameters,this.searchPage.getRefineFieldsQuery(), 1, 1000).subscribe(
data => {
this.CSV.export = data;
ExportCSVComponent.downloadCSV(this.CSV, "compatibleDataproviders.csv");
var errorCodes:ErrorCodes = new ErrorCodes();
this.searchUtils.status = errorCodes.DONE;
},
err => {
console.error(err);
//TODO check erros (service not available, bad request)
// if( ){
// this.searchUtils.status = ErrorCodes.ERROR;
// }
var errorCodes:ErrorCodes = new ErrorCodes();
this.searchUtils.status = errorCodes.ERROR;
}
);
}
}
}

View File

@ -9,7 +9,7 @@ import {OpenaireProperties, ErrorCodes} from '../../utils/properties/openairePro
import {SearchFields} from '../../utils/properties/searchFields';
import {SearchPageComponent } from '../searchUtils/searchPage.component';
import {SearchUtilsClass } from '../searchUtils/searchUtils.class';
import {ExportCSVComponent} from '../../utils/exportCSV.component';
@Component({
selector: 'search-entity-registries',
@ -17,7 +17,8 @@ import {SearchUtilsClass } from '../searchUtils/searchUtils.class';
<search-page pageTitle="Entity Registries" type="datasource" [(filters)] = "filters"
[(results)] = "results" [(searchUtils)] = "searchUtils"
[baseUrl] = "baseUrl" [showResultCount]=false (queryChange)="queryChanged($event)" >
[baseUrl] = "baseUrl" [showResultCount]=false (queryChange)="queryChanged($event)"
(downloadClick)="downloadClicked($event)">
</search-page>
`
@ -38,6 +39,12 @@ export class SearchEntityRegistriesComponent {
{field:"type",opName:"tp",opValue:"and",values: ["other"]}];
// ["entityregistry","entityregistry::projects","entityregistry::repositories"]}];
private _prefixQuery: string = "";
private CSV: any = { "columnNames": [ "Title", "Type", "Coutries", "Compatibility" ],
"export":[]
};
private CSVDownloaded = false;
@ViewChild (SearchPageComponent) searchPage : SearchPageComponent ;
constructor (private route: ActivatedRoute, private _searchDataprovidersService: SearchDataprovidersService ) {
@ -136,4 +143,34 @@ export class SearchEntityRegistriesComponent {
return filters;
}
private downloadClicked($event) {
if(!this.CSVDownloaded) {
this.CSVDownloaded = false;
var parameters = $event.value;
//this.getResultsCSV(parameters, false, 1, 1000);
this._searchDataprovidersService.searchEntityRegistriesCSV(parameters, this.searchPage.getRefineFieldsQuery(), 1, 1000).subscribe(
data => {
this.CSV.export = data;
ExportCSVComponent.downloadCSV(this.CSV, "etityRegistries.csv");
var errorCodes:ErrorCodes = new ErrorCodes();
this.searchUtils.status = errorCodes.DONE;
},
err => {
console.error(err);
//TODO check erros (service not available, bad request)
// if( ){
// this.searchUtils.status = ErrorCodes.ERROR;
// }
var errorCodes:ErrorCodes = new ErrorCodes();
this.searchUtils.status = errorCodes.ERROR;
}
);
}
}
}

View File

@ -75,7 +75,7 @@ import { ErrorCodes} from '../../utils/properties/openaireProperties';
</span>
</div>
<span *ngIf="result.startYear && result.endYear"> ({{result.startYear}} - {{result.endYear}})</span>
<div *ngIf="result['organizations'] != undefined">
<div *ngIf="result['organizations'] != undefined && result['organizations'].length > 0">
<span> Organizations: </span>
<span *ngFor="let organization of result['organizations'] let i=index">
<a *ngIf="organization.url != undefined" href="{{organization.url}}">
@ -110,7 +110,7 @@ import { ErrorCodes} from '../../utils/properties/openaireProperties';
Compatibility: {{result.compatibility}}
</div>
<div *ngIf="result['countries'] != undefined">
<div *ngIf="result['countries'] != undefined && result['countries'].length > 0">
Countries: {{result.countries}}
</div>

View File

@ -10,6 +10,7 @@ import {OpenaireProperties, ErrorCodes} from '../../utils/properties/openairePro
import {SearchFields} from '../../utils/properties/searchFields';
import {SearchPageComponent } from '../searchUtils/searchPage.component';
import {SearchUtilsClass} from '../searchUtils/searchUtils.class';
import {ExportCSVComponent} from '../../utils/exportCSV.component';
@Component({
selector: 'search-publications',
@ -17,7 +18,8 @@ import {SearchUtilsClass} from '../searchUtils/searchUtils.class';
<search-page pageTitle="Search Publications" type="publication" [(filters)] = "filters"
[(results)] = "results"
[(searchUtils)] = "searchUtils" [(baseUrl)] = baseUrl (queryChange)="queryChanged($event)" >
[(searchUtils)] = "searchUtils" [(baseUrl)] = baseUrl
(queryChange)="queryChanged($event)" (downloadClick)="downloadClicked($event)">
</search-page>
`
@ -39,6 +41,13 @@ export class SearchPublicationsComponent {
@ViewChild (SearchPageComponent) searchPage : SearchPageComponent ;
private _location:Location;
private CSV: any = { "columnNames": ["Title", "Authors", "Publication Year", "DOI",
/*"Download From", "Publication type", "Journal",*/
"Funder", "Project Name (GA Number)", "Access"],
"export":[]
};
private CSVDownloaded = false;
constructor (private route: ActivatedRoute, private _searchPublicationsService: SearchPublicationsService ) {
var errorCodes:ErrorCodes = new ErrorCodes();
this.searchUtils.status =errorCodes.LOADING;
@ -211,5 +220,34 @@ private _getResults(parameters:string,refine:boolean, page: number, size: number
this._getResults(parameters, true, this.searchUtils.page, this.searchUtils.size);
}
private downloadClicked($event) {
if(!this.CSVDownloaded) {
this.CSVDownloaded = false;
var parameters = $event.value;
//this.getResultsCSV(parameters, false, 1, 1000);
this._searchPublicationsService.searchPublicationsCSV(parameters, this.searchPage.getRefineFieldsQuery(), 1, 1000).subscribe(
data => {
this.CSV.export = data;
ExportCSVComponent.downloadCSV(this.CSV, "publications.csv");
var errorCodes:ErrorCodes = new ErrorCodes();
this.searchUtils.status = errorCodes.DONE;
},
err => {
console.error(err);
//TODO check erros (service not available, bad request)
// if( ){
// this.searchUtils.status = ErrorCodes.ERROR;
// }
var errorCodes:ErrorCodes = new ErrorCodes();
this.searchUtils.status = errorCodes.ERROR;
}
);
}
}
}

View File

@ -173,6 +173,52 @@ export class SearchDataprovidersService {
});
}
searchEntityRegistriesCSV (params: string,refineParams:string, page: number, size: number):any {
let url = OpenaireProperties.getSearchResourcesAPIURL();
url += "?query=((oaftype exact datasource) and(datasourcetypeuiid = other))"
if(params!= null && params != '' ) {
url += params;
}
if(refineParams!= null && refineParams != '' ) {
url += refineParams;
}
url += "&page="+page+"&size="+size;
let key = url;
if (this._cache.has(key)) {
return Observable.of(this._cache.get(key));
}
return this.http.get(url)
.map(res => <any> res.json())
//.do(res => console.info(res))
.map(res => this.parseResultsCSV(res['results']))
.do(res => {
this._cache.set(key, res);
});
}
searchCompatibleDataprovidersCSV (params: string,refineParams:string, page: number, size: number):any {
let url = OpenaireProperties.getSearchResourcesAPIURL();
url += "?query=((oaftype exact datasource) not(datasourcecompatibilityid = UNKNOWN) not(datasourcecompatibilityid = hostedBy) not(datasourcecompatibilityid = notCompatible) not(datasourcetypeuiid = other))"
if(params!= null && params != '' ) {
url += params;
}
if(refineParams!= null && refineParams != '' ) {
url += refineParams;
}
url += "&page="+page+"&size="+size;
let key = url;
if (this._cache.has(key)) {
return Observable.of(this._cache.get(key));
}
return this.http.get(url)
.map(res => <any> res.json())
//.do(res => console.info(res))
.map(res => this.parseResultsCSV(res['results']))
.do(res => {
this._cache.set(key, res);
});
}
parseResults(data: any): SearchResult[] {
let results: SearchResult[] = [];
@ -190,9 +236,7 @@ export class SearchDataprovidersService {
result['title'].url = OpenaireProperties.getsearchLinkToDataProvider();
result['title'].url += Array.isArray(data) ? data[i]['result']['header']['dri:objIdentifier'] : data['result']['header']['dri:objIdentifier'];
if(resData['datasourcetype'].hasOwnProperty("classname")) {
result['type'] = resData['datasourcetype'].classname;
}
result['type'] = this.getDataproviderType(resData);
if(resData.hasOwnProperty('accessinfopackage')) {
let OAIPMHURL: string;
@ -209,46 +253,11 @@ export class SearchDataprovidersService {
result['websiteURL'] = resData.websiteurl;
if(resData['rels'].hasOwnProperty("rel")) {
let countriesSet: Set<string> = new Set<string>();
let res:[string[], {"name":string, "url":string}[]] = this.getDataproviderCountriesOrganizations(resData, true, true);
result['organizations'] = res[1];
result['countries'] = res[0];
let counter = 0;
let relLength = Array.isArray(resData['rels']['rel']) ? resData['rels']['rel'].length : 1;
for(let i=0; i<relLength; i++) {
let relation = Array.isArray(resData['rels']['rel']) ? resData['rels']['rel'][i] : resData['rels']['rel'];
if(relation.hasOwnProperty("to")) {
if(relation['to'].class == "provides" && relation['to'].type == "organization") {
if(result['organizations'] == undefined) {
result['organizations'] = new Array<{"name": string, "url": string}>();
}
result['organizations'][counter] = {"name": "", "url": ""};
result['organizations'][counter]['name'] = relation.legalname;
result['organizations'][counter]['url'] = OpenaireProperties.getsearchLinkToOrganization()+relation['to'].content;
if(relation.hasOwnProperty('country') &&
relation.country.hasOwnProperty('classname')) {
if(result['countries'] == undefined) {
result['countries'] = [];
}
if(!countriesSet.has(relation.country.classname)) {
countriesSet.add(relation.country.classname);
result['countries'].push(relation.country.classname);
}
}
counter++;
}
}
}
}
if(resData.hasOwnProperty('openairecompatibility')) {
result['compatibility'] = resData['openairecompatibility'].classname;
}
result['compatibility'] = this.getDataproviderCompatibility(resData)
results.push(result);
@ -257,36 +266,44 @@ export class SearchDataprovidersService {
return results;
}
getDataproviderType(resData: any): string {
if(resData['datasourcetype'].hasOwnProperty("classname")) {
return resData['datasourcetype'].classname;
} else {
return '';
}
}
parseResultsCSV(data: any): any {
let results: any = [];
getDataproviderCompatibility(resData: any): string {
if(resData.hasOwnProperty('openairecompatibility')) {
return resData['openairecompatibility'].classname;
} else {
return '';
}
}
let length = Array.isArray(data) ? data.length : 1;
getDataproviderCountriesOrganizations(resData: any, getCountries: boolean, getOrganizations: boolean): [string[], {"name": string, "url": string}[]] {
let countries: string[] = [];
let organizations: {"name": string, "url": string}[] = [];
for(let i=0; i<length; i++) {
let resData = Array.isArray(data) ? data[i]['result']['metadata']['oaf:entity']['oaf:datasource'] : data['result']['metadata']['oaf:entity']['oaf:datasource'];
if(resData['rels'].hasOwnProperty("rel")) {
let countriesSet: Set<string> = new Set<string>();
var result: any = [];
let relLength = Array.isArray(resData['rels']['rel']) ? resData['rels']['rel'].length : 1;
result.push(this.quote(resData.officialname));
for(let i=0; i<relLength; i++) {
let relation = Array.isArray(resData['rels']['rel']) ? resData['rels']['rel'][i] : resData['rels']['rel'];
if(resData['datasourcetype'].hasOwnProperty("classname")) {
result.push(this.quote(resData['datasourcetype'].classname));
} else {
result.push('');
}
if(relation.hasOwnProperty("to")) {
if(relation['to'].class == "provides" && relation['to'].type == "organization") {
if(getOrganizations) {
let item: {"name":string, "url":string} = {"name": "", "url": ""};
item['name'] = relation.legalname;
item['url'] = OpenaireProperties.getsearchLinkToOrganization()+relation['to'].content;
organizations.push(item);
}
if(resData['rels'].hasOwnProperty("rel")) {
let countries = [];
let countriesSet: Set<string> = new Set<string>();
let relLength = Array.isArray(resData['rels']['rel']) ? resData['rels']['rel'].length : 1;
for(let i=0; i<relLength; i++) {
let relation = Array.isArray(resData['rels']['rel']) ? resData['rels']['rel'][i] : resData['rels']['rel'];
if(relation.hasOwnProperty("to")) {
if(relation['to'].class == "provides" && relation['to'].type == "organization") {
if(getCountries) {
if(relation.hasOwnProperty('country') &&
relation.country.hasOwnProperty('classname')) {
if(!countriesSet.has(relation.country.classname)) {
@ -297,29 +314,32 @@ export class SearchDataprovidersService {
}
}
}
result.push(this.quote(countries));
} else {
result.push('');
}
if(resData.hasOwnProperty('openairecompatibility')) {
result.push(this.quote(resData['openairecompatibility'].classname));
} else {
result.push('');
}
results.push(result);
}
return [countries, organizations];
}
parseResultsCSV(data: any): any {
let results: any = [];
let length = Array.isArray(data) ? data.length : 1;
for(let i=0; i<length; i++) {
let resData = Array.isArray(data) ? data[i]['result']['metadata']['oaf:entity']['oaf:datasource'] : data['result']['metadata']['oaf:entity']['oaf:datasource'];
var result: any = [];
result.push(this.quote(resData.officialname));
result.push(this.quote(this.getDataproviderType(resData)));
result.push(this.quote(this.getDataproviderCountriesOrganizations(resData, true, false)[0]));
result.push(this.quote(this.getDataproviderCompatibility(resData)));
results.push(result);
}
return results;
}
numOfDataproviders(params: string):any {
console.info("getOfDataproviders : Dataproviders Service + params="+params);
//OpenaireProperties.getSearchAPIURL()
//"http://rudie.di.uoa.gr:8080/dnet-functionality-services-2.0.0-SNAPSHOT/rest/v2/api/"
let url = OpenaireProperties.getSearchAPIURL()+params;
let key = url;
if (this._cache.has(key)) {

View File

@ -99,12 +99,39 @@ export class SearchPublicationsService {
});
}
searchPublicationsCSV (params: string, refineParams:string, page: number, size: number):any {
let link = OpenaireProperties.getSearchAPIURL()+"publications";
let url = link+"?";
if(params!= null && params != '' ) {
url += params;
}
if(refineParams!= null && refineParams != '' ) {
url += refineParams;
}
url += "&page="+page+"&size="+size;
let key = url;
if (this._cache.has(key)) {
return Observable.of(this._cache.get(key));
}
return this.http.get(url)
.map(res => <any> res.json())
//.do(res => console.info(res))
.map(res => this.parseResultsCSV(res['results']))
.do(res => {
this._cache.set(key, res);
});
}
parseResults(data: any): SearchResult[] {
let results: SearchResult[] = [];
let length = Array.isArray(data) ? data.length : 1;
console.info(Array.isArray(data));
for(let i=0; i<length; i++) {
let resData = Array.isArray(data) ? data[i]['result']['metadata']['oaf:entity']['oaf:result'] : data['result']['metadata']['oaf:entity']['oaf:result'];
@ -202,6 +229,95 @@ console.info(Array.isArray(data));
return results;
}
parseResultsCSV(data: any): any {
let results: any = [];
let length = Array.isArray(data) ? data.length : 1;
for(let i=0; i<length; i++) {
let resData = Array.isArray(data) ? data[i]['result']['metadata']['oaf:entity']['oaf:result'] : data['result']['metadata']['oaf:entity']['oaf:result'];
var result: any = [];
if(Array.isArray(resData['title'])) {
result.push(this.quote(resData['title'][0].content));
} else {
result.push(this.quote(resData['title'].content));
}
var authors: string[] = [];
var projects: string[] = [];
var funder: string = "";
if(resData['rels'].hasOwnProperty("rel")) {
let relLength = Array.isArray(resData['rels']['rel']) ? resData['rels']['rel'].length : 1;
for(let j=0; j<relLength; j++) {
let relation = Array.isArray(resData['rels']['rel']) ? resData['rels']['rel'][j] : resData['rels']['rel'];
if(relation.hasOwnProperty("to")) {
if(relation['to'].class == "hasAuthor") {
authors.push(relation.fullname);
} else if(relation['to'].class == "isProducedBy") {
if(relation.code != "") {
projects.push(relation.title+" ("+relation.code+")");
} else {
projects.push(relation.title);
}
if(relation.hasOwnProperty("funding")) {
let fundingLength = Array.isArray(relation['funding']) ? relation['funding'].length : 1;
for(let z=0; z<fundingLength; z++) {
let fundingData = Array.isArray(relation['funding']) ? relation['funding'][z] : relation['funding'];
if(fundingData.hasOwnProperty("funder")) {
funder = fundingData['funder'].shortname;
}
}
}
}
}
}
result.push(this.quote(authors));
var year: string = "";
if(resData.hasOwnProperty("dateofacceptance")) {
year = resData.dateofacceptance;
}
result.push(year);
var id:string = Array.isArray(data) ? data[i]['result']['header']['dri:objIdentifier'] : data['result']['header']['dri:objIdentifier'];
result.push(this.quote(id));
result.push(funder);
result.push(this.quote(projects));
} else {
result.push(this.quote(''));
var year: string = "";
if(resData.hasOwnProperty("dateofacceptance")) {
year = resData.dateofacceptance;
}
result.push(year);
var id:string = Array.isArray(data) ? data[i]['result']['header']['dri:objIdentifier'] : data['result']['header']['dri:objIdentifier'];
result.push(this.quote(id));
result.push(funder);
result.push("");
}
//result.push(resData.embargoenddate);
if(resData['bestlicense'].hasOwnProperty("classid")) {
result.push(this.quote(resData['bestlicense'].classid));
} else {
result.push("");
}
results.push(result);
}
return results;
}
numOfEntityPublications(id: string, entity: string):any {
//OpenaireProperties.getSearchAPIURL()
@ -233,4 +349,8 @@ console.info(Array.isArray(data));
this._cache.set(key, res);
});
}
private quote(word: any): string {
return '"'+word+'"';
}
}