'resultbestlicense' field of index renamed to 'resultbestaccessright' and 'bestlicense' field renamed to 'bestaccessright' | htmlProjectReport - project landing: fix query for research data tab in app box | Remove '-' when there are no unclassified subjects in landing pages | Similar Research Results and Related Research Results: case for software results added | Publication landing, Dataset landing, Software landing: 'collectedfrom' parsed through 'instance' field | Search Pages and project landing page: Alert when CSV download fails | Organization landing: encoding funder's info in queries
git-svn-id: https://svn.driver.research-infrastructures.eu/driver/dnet40/modules/uoa-services-portal/trunk@49550 d315682c-612b-4755-9ff5-7f18f6832af3
This commit is contained in:
parent
131bbd64b8
commit
f8f8512978
|
@ -38,7 +38,7 @@ export class DatasetService {
|
||||||
res[1]['children'],
|
res[1]['children'],
|
||||||
res[1]['pid'],
|
res[1]['pid'],
|
||||||
res[1]['subject'],
|
res[1]['subject'],
|
||||||
res[1]['bestlicense'],
|
res[1]['bestaccessright'],
|
||||||
res[1]['collectedfrom'],
|
res[1]['collectedfrom'],
|
||||||
res[1]['context'],
|
res[1]['context'],
|
||||||
//res[1]['resulttype'],
|
//res[1]['resulttype'],
|
||||||
|
@ -72,8 +72,8 @@ export class DatasetService {
|
||||||
this.datasetInfo.embargoEndDate = data[0].embargoenddate;
|
this.datasetInfo.embargoEndDate = data[0].embargoenddate;
|
||||||
}
|
}
|
||||||
this.datasetInfo.title = {"name": "", "url": "", "accessMode": ""};
|
this.datasetInfo.title = {"name": "", "url": "", "accessMode": ""};
|
||||||
if(data[0]['bestlicense'].hasOwnProperty("classid")) {
|
if(data[0]['bestaccessright'].hasOwnProperty("classid")) {
|
||||||
this.datasetInfo.title.accessMode = data[0]['bestlicense'].classid;
|
this.datasetInfo.title.accessMode = data[0]['bestaccessright'].classid;
|
||||||
}
|
}
|
||||||
if(data[1] != null) {
|
if(data[1] != null) {
|
||||||
if(Array.isArray(data[1])) {
|
if(Array.isArray(data[1])) {
|
||||||
|
@ -148,6 +148,10 @@ export class DatasetService {
|
||||||
url = instance['webresource'][0].url;
|
url = instance['webresource'][0].url;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if(instance.hasOwnProperty("collectedfrom")) {
|
||||||
|
this.datasetInfo.collectedFrom = this.parsingFunctions.parseCollectedFrom(instance['collectedfrom']);
|
||||||
|
}
|
||||||
|
|
||||||
if(instance.hasOwnProperty("hostedby")) {
|
if(instance.hasOwnProperty("hostedby")) {
|
||||||
if(instance['hostedby'].name != "other resources" && instance['hostedby'].name != "Unknown Repository") {
|
if(instance['hostedby'].name != "other resources" && instance['hostedby'].name != "Unknown Repository") {
|
||||||
this.parsingFunctions.parseDownloadFrom(this.datasetInfo.downloadFrom, instance, url);
|
this.parsingFunctions.parseDownloadFrom(this.datasetInfo.downloadFrom, instance, url);
|
||||||
|
@ -182,12 +186,12 @@ export class DatasetService {
|
||||||
}
|
}
|
||||||
|
|
||||||
// if(data[6] != null) {
|
// if(data[6] != null) {
|
||||||
// this.datasetInfo.bestlicense = data[6].classid;
|
// this.datasetInfo.bestaccessright = data[6].classid;
|
||||||
// }
|
// }
|
||||||
|
|
||||||
if(data[7] != null) {
|
// if(data[7] != null) {
|
||||||
this.datasetInfo.collectedFrom = this.parsingFunctions.parseCollectedFrom(data[7]);
|
// this.datasetInfo.collectedFrom = this.parsingFunctions.parseCollectedFrom(data[7]);
|
||||||
}
|
// }
|
||||||
|
|
||||||
// null argument is for journal
|
// null argument is for journal
|
||||||
this.datasetInfo.downloadFrom = this.parsingFunctions.addPublisherToDownloadFrom(
|
this.datasetInfo.downloadFrom = this.parsingFunctions.addPublisherToDownloadFrom(
|
||||||
|
|
|
@ -77,9 +77,9 @@ export class HtmlProjectReportComponent{
|
||||||
this.showLoading = false;
|
this.showLoading = false;
|
||||||
this.warningMessage="Requested size is not an integer";
|
this.warningMessage="Requested size is not an integer";
|
||||||
}
|
}
|
||||||
|
console.info(params['type']);
|
||||||
if(params['type'] && (params['type'] == "research data" || params['type'] == "publication")){
|
if(params['type'] && (params['type'] == "dataset" || params['type'] == "publication")){
|
||||||
this.resultsType = params['type'];
|
this.resultsType = (params['type'] == "dataset") ? 'research data' : params['type'];
|
||||||
this.updateTitle("Project's "+this.resultsType+" report");
|
this.updateTitle("Project's "+this.resultsType+" report");
|
||||||
this.updateDescription("project, project "+ this.resultsType +" report, funding, open access, publications, research data");
|
this.updateDescription("project, project "+ this.resultsType +" report, funding, open access, publications, research data");
|
||||||
} else {
|
} else {
|
||||||
|
|
|
@ -11,9 +11,12 @@ export class HtmlProjectReportService {
|
||||||
|
|
||||||
getHTML(id: string, size: number, type:string):any {
|
getHTML(id: string, size: number, type:string):any {
|
||||||
console.info("getHTML in service");
|
console.info("getHTML in service");
|
||||||
|
|
||||||
|
let resultTypeId: string = (type == "research data") ? 'dataset' : type;
|
||||||
|
let requestType: string = (resultTypeId == "dataset") ? 'datasets' : 'publications';
|
||||||
//let url = OpenaireProperties. getSearchAPIURLLast() + 'publications/' +id+"?format=json";
|
//let url = OpenaireProperties. getSearchAPIURLLast() + 'publications/' +id+"?format=json";
|
||||||
let url = OpenaireProperties.getCsvAPIURL();
|
let url = OpenaireProperties.getCsvAPIURL();
|
||||||
url += 'resources?format=html&page=0&size='+size+'&type=publications&query=(((oaftype exact result) and (resulttypeid exact '+type+')) and (relprojectid exact "'+id+'"))';
|
url += 'resources?format=html&page=0&size='+size+'&type='+requestType+'&query=(((oaftype exact result) and (resulttypeid exact '+resultTypeId+')) and (relprojectid exact "'+id+'"))';
|
||||||
let key = url;
|
let key = url;
|
||||||
if (this._cache.has(key)) {
|
if (this._cache.has(key)) {
|
||||||
return Observable.of(this._cache.get(key));
|
return Observable.of(this._cache.get(key));
|
||||||
|
|
|
@ -312,8 +312,10 @@ export class ParsingFunctions {
|
||||||
|
|
||||||
if(relation['resulttype'].classname == "publication") {
|
if(relation['resulttype'].classname == "publication") {
|
||||||
researchResult['class'] = "publication";
|
researchResult['class'] = "publication";
|
||||||
} else {
|
} else if(relation['resulttype'].classname == "dataset") {
|
||||||
researchResult['class'] = "dataset";
|
researchResult['class'] = "dataset";
|
||||||
|
} else {
|
||||||
|
researchResult['class'] = "software";
|
||||||
}
|
}
|
||||||
|
|
||||||
researchResult['id'] = relation['to'].content;
|
researchResult['id'] = relation['to'].content;
|
||||||
|
|
|
@ -17,11 +17,11 @@ import {Component, Input} from '@angular/core';
|
||||||
<span class="uk-text-bold">{{key}}:</span> {{otherSubjects.get(key).join(" | ")}}
|
<span class="uk-text-bold">{{key}}:</span> {{otherSubjects.get(key).join(" | ")}}
|
||||||
</div>
|
</div>
|
||||||
</li>
|
</li>
|
||||||
<li *ngIf="(subjects == undefined || subjects.length == 0) &&
|
<!--li *ngIf="(subjects == undefined || subjects.length == 0) &&
|
||||||
(otherSubjects == undefined || otherSubjects.size == 0) &&
|
(otherSubjects == undefined || otherSubjects.size == 0) &&
|
||||||
classifiedSubjects != undefined && classifiedSubjects.size > 0">
|
classifiedSubjects != undefined && classifiedSubjects.size > 0">
|
||||||
-
|
-
|
||||||
</li>
|
</li-->
|
||||||
</ul>
|
</ul>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
|
|
@ -24,6 +24,7 @@ import {OpenaireProperties} from '../../utils/properties/openaireProperties';
|
||||||
<!--span *ngIf="item['class'] == 'dataset'" class="glyphicon glyphicon-star" aria-hidden="true"-->
|
<!--span *ngIf="item['class'] == 'dataset'" class="glyphicon glyphicon-star" aria-hidden="true"-->
|
||||||
<img *ngIf="item['class'] == 'publication'" class= "entityIcon" src="assets/publication.png" alt="(Publication)">
|
<img *ngIf="item['class'] == 'publication'" class= "entityIcon" src="assets/publication.png" alt="(Publication)">
|
||||||
<img *ngIf="item['class'] == 'dataset'" class= "entityIcon" src="assets/dataset.png" alt="(Dataset)">
|
<img *ngIf="item['class'] == 'dataset'" class= "entityIcon" src="assets/dataset.png" alt="(Dataset)">
|
||||||
|
<img *ngIf="item['class'] == 'software'" class= "entityIcon" src="assets/dataset.png" alt="(Software)">
|
||||||
|
|
||||||
<!--/span-->
|
<!--/span-->
|
||||||
<!--a *ngIf="item['url'] != '' && item['name'] != ''" href="{{item['url']}}"-->
|
<!--a *ngIf="item['url'] != '' && item['name'] != ''" href="{{item['url']}}"-->
|
||||||
|
@ -32,6 +33,11 @@ import {OpenaireProperties} from '../../utils/properties/openaireProperties';
|
||||||
{{item['name']}}
|
{{item['name']}}
|
||||||
</a>
|
</a>
|
||||||
|
|
||||||
|
<a *ngIf="item['id'] != '' && item['name'] != '' && item['class'] == 'software'"
|
||||||
|
[queryParams]="{softwareId: item.id}" routerLinkActive="router-link-active" routerLink="/search/software">
|
||||||
|
{{item['name']}}
|
||||||
|
</a>
|
||||||
|
|
||||||
<a *ngIf="item['id'] != '' && item['name'] != '' && item['class'] == 'publication'"
|
<a *ngIf="item['id'] != '' && item['name'] != '' && item['class'] == 'publication'"
|
||||||
[queryParams]="{articleId: item.id}" routerLinkActive="router-link-active" routerLink="/search/publication">
|
[queryParams]="{articleId: item.id}" routerLinkActive="router-link-active" routerLink="/search/publication">
|
||||||
<!--a *ngIf="item['url'] != '' && item['name'] != '' && item['class'] == 'publication'"
|
<!--a *ngIf="item['url'] != '' && item['name'] != '' && item['class'] == 'publication'"
|
||||||
|
|
|
@ -159,7 +159,7 @@
|
||||||
<!--a href="{{downloadURLAPI}}resources?size={{organizationInfo.projects.get(key).length}}&{{csvProjectParamsHead}}{{organizationInfo.projects.get(key)[0]['funderId']}}{{csvParamsTail}}">
|
<!--a href="{{downloadURLAPI}}resources?size={{organizationInfo.projects.get(key).length}}&{{csvProjectParamsHead}}{{organizationInfo.projects.get(key)[0]['funderId']}}{{csvParamsTail}}">
|
||||||
Download projects report (CSV) for {{key}}
|
Download projects report (CSV) for {{key}}
|
||||||
</a-->
|
</a-->
|
||||||
<a class="clickable" (click)="downloadFile(downloadURLAPI+'resources?size='+funder.number+'&'+csvProjectParamsHead+funder.id+csvParamsTail)">
|
<a class="clickable" (click)="downloadFile(downloadURLAPI+'resources?size='+funder.number+'&'+csvProjectParamsHead+encodeURI(funder.id)+csvParamsTail)">
|
||||||
<!--span class="clickable" (click)="downloadProjectsFile(downloadURLAPI+'organizations/'+organizationId+'/projects?fq=(funderid exact '+funder.id+')&size='+funder.number)"-->
|
<!--span class="clickable" (click)="downloadProjectsFile(downloadURLAPI+'organizations/'+organizationId+'/projects?fq=(funderid exact '+funder.id+')&size='+funder.number)"-->
|
||||||
<span class="uk-icon"><svg width="20" height="20" viewBox="0 0 20 20" xmlns="http://www.w3.org/2000/svg" icon="download" ratio="1"><polyline fill="none" stroke="#000" points="14,10 9.5,14.5 5,10"></polyline><rect x="3" y="17" width="13" height="1"></rect><line fill="none" stroke="#000" x1="9.5" y1="13.91" x2="9.5" y2="3"></line></svg></span>
|
<span class="uk-icon"><svg width="20" height="20" viewBox="0 0 20 20" xmlns="http://www.w3.org/2000/svg" icon="download" ratio="1"><polyline fill="none" stroke="#000" points="14,10 9.5,14.5 5,10"></polyline><rect x="3" y="17" width="13" height="1"></rect><line fill="none" stroke="#000" x1="9.5" y1="13.91" x2="9.5" y2="3"></line></svg></span>
|
||||||
<span class="uk-icon-download"> Project list for {{funder.name}} (CSV)</span>
|
<span class="uk-icon-download"> Project list for {{funder.name}} (CSV)</span>
|
||||||
|
@ -167,7 +167,7 @@
|
||||||
</li>
|
</li>
|
||||||
|
|
||||||
<li *ngFor="let funder of fetchProjects.funders">
|
<li *ngFor="let funder of fetchProjects.funders">
|
||||||
<a class="clickable" (click)="confirmOpenApplyAll(funder.name,funder.id, funder.number)">
|
<a class="clickable" (click)="confirmOpenApplyAll(funder.name,encodeURI(funder.id), funder.number)">
|
||||||
<span class="uk-icon"><svg width="20" height="20" viewBox="0 0 20 20" xmlns="http://www.w3.org/2000/svg" icon="download" ratio="1"><polyline fill="none" stroke="#000" points="14,10 9.5,14.5 5,10"></polyline><rect x="3" y="17" width="13" height="1"></rect><line fill="none" stroke="#000" x1="9.5" y1="13.91" x2="9.5" y2="3"></line></svg></span>
|
<span class="uk-icon"><svg width="20" height="20" viewBox="0 0 20 20" xmlns="http://www.w3.org/2000/svg" icon="download" ratio="1"><polyline fill="none" stroke="#000" points="14,10 9.5,14.5 5,10"></polyline><rect x="3" y="17" width="13" height="1"></rect><line fill="none" stroke="#000" x1="9.5" y1="13.91" x2="9.5" y2="3"></line></svg></span>
|
||||||
<span class="uk-icon-download"> Project Publications for {{funder.name}} (CSV)</span>
|
<span class="uk-icon-download"> Project Publications for {{funder.name}} (CSV)</span>
|
||||||
</a>
|
</a>
|
||||||
|
|
|
@ -20,6 +20,7 @@ import {RouterHelper} from '../../utils/routerHelper.class';
|
||||||
import {ModalLoading} from '../../utils/modal/loading.component';
|
import {ModalLoading} from '../../utils/modal/loading.component';
|
||||||
import {AlertModal} from '../../utils/modal/alert';
|
import {AlertModal} from '../../utils/modal/alert';
|
||||||
import {PiwikService} from '../../utils/piwik/piwik.service';
|
import {PiwikService} from '../../utils/piwik/piwik.service';
|
||||||
|
import {StringUtils} from '../../utils/string-utils.class';
|
||||||
|
|
||||||
@Component({
|
@Component({
|
||||||
selector: 'organization',
|
selector: 'organization',
|
||||||
|
@ -315,7 +316,8 @@ export class OrganizationComponent {
|
||||||
let projects = [];
|
let projects = [];
|
||||||
let counter: number = count;
|
let counter: number = count;
|
||||||
let title: boolean = false;
|
let title: boolean = false;
|
||||||
this.countProjectsSub = this._searchProjectsService.getProjectsForOrganizations(this.organizationId,' and (funder exact '+ funderId + ' ) ',1,count,[]).subscribe(
|
|
||||||
|
this.countProjectsSub = this._searchProjectsService.getProjectsForOrganizations(this.organizationId,' and (funder exact "'+ funderId + '" ) ',1,count,[]).subscribe(
|
||||||
data =>
|
data =>
|
||||||
{
|
{
|
||||||
projects = data[1];
|
projects = data[1];
|
||||||
|
@ -480,4 +482,8 @@ export class OrganizationComponent {
|
||||||
this.alertCsvError.okButtonText = "OK";
|
this.alertCsvError.okButtonText = "OK";
|
||||||
this.alertCsvError.open();
|
this.alertCsvError.open();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
encodeURI(input: string): string {
|
||||||
|
return StringUtils.URIEncode(input);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -348,7 +348,7 @@
|
||||||
</li>
|
</li>
|
||||||
<li>
|
<li>
|
||||||
<a target="_blank"
|
<a target="_blank"
|
||||||
href="/project-report?projectId={{projectId}}&size={{fetchDatasets.searchUtils.totalResults}}&type=research data">
|
href="/project-report?projectId={{projectId}}&size={{fetchDatasets.searchUtils.totalResults}}&type=dataset">
|
||||||
<span class="uk-icon"><svg width="20" height="20" viewBox="0 0 20 20" xmlns="http://www.w3.org/2000/svg" icon="table" ratio="1"><rect x="1" y="3" width="18" height="1"></rect><rect x="1" y="7" width="18" height="1"></rect><rect x="1" y="11" width="18" height="1"></rect><rect x="1" y="15" width="18" height="1"></rect></svg></span> Get {{projectInfo.funder}} report (HTML)
|
<span class="uk-icon"><svg width="20" height="20" viewBox="0 0 20 20" xmlns="http://www.w3.org/2000/svg" icon="table" ratio="1"><rect x="1" y="3" width="18" height="1"></rect><rect x="1" y="7" width="18" height="1"></rect><rect x="1" y="11" width="18" height="1"></rect><rect x="1" y="15" width="18" height="1"></rect></svg></span> Get {{projectInfo.funder}} report (HTML)
|
||||||
</a>
|
</a>
|
||||||
</li>
|
</li>
|
||||||
|
@ -375,6 +375,7 @@
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<modal-loading></modal-loading>
|
<modal-loading></modal-loading>
|
||||||
|
<modal-alert #AlertModalCsvError></modal-alert>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
|
@ -78,6 +78,8 @@ export class ProjectComponent{
|
||||||
public errorCodes:ErrorCodes = new ErrorCodes();
|
public errorCodes:ErrorCodes = new ErrorCodes();
|
||||||
|
|
||||||
@ViewChild (ModalLoading) loading : ModalLoading ;
|
@ViewChild (ModalLoading) loading : ModalLoading ;
|
||||||
|
// Alert box when something is wrong with CSV requests
|
||||||
|
@ViewChild('AlertModalCsvError') alertCsvError;
|
||||||
|
|
||||||
sub: any; piwiksub: any; infoSub: any; downloadFilePiwikSub: any;
|
sub: any; piwiksub: any; infoSub: any; downloadFilePiwikSub: any;
|
||||||
|
|
||||||
|
@ -139,7 +141,7 @@ export class ProjectComponent{
|
||||||
|
|
||||||
this.createClipboard();
|
this.createClipboard();
|
||||||
this.csvParams = "format=csv-special&page=0&type=publications&query=(((oaftype exact result) and (resulttypeid exact publication)) and (relprojectid exact "+this.projectId+"))&size=";
|
this.csvParams = "format=csv-special&page=0&type=publications&query=(((oaftype exact result) and (resulttypeid exact publication)) and (relprojectid exact "+this.projectId+"))&size=";
|
||||||
this.csvParamsDatasets = "format=csv-special&page=0&type=publications&query=(((oaftype exact result) and (resulttypeid exact dataset)) and (relprojectid exact "+this.projectId+"))&size=";
|
this.csvParamsDatasets = "format=csv-special&page=0&type=datasets&query=(((oaftype exact result) and (resulttypeid exact dataset)) and (relprojectid exact "+this.projectId+"))&size=";
|
||||||
|
|
||||||
if (typeof document !== 'undefined') {
|
if (typeof document !== 'undefined') {
|
||||||
this.element.nativeElement.scrollIntoView();
|
this.element.nativeElement.scrollIntoView();
|
||||||
|
@ -265,7 +267,11 @@ export class ProjectComponent{
|
||||||
this.downloadFilePiwikSub = this._piwikService.trackDownload(url).subscribe();
|
this.downloadFilePiwikSub = this._piwikService.trackDownload(url).subscribe();
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
error => console.log("Error downloading the file."),
|
error => {
|
||||||
|
console.log("Error downloading the file.");
|
||||||
|
this.closeLoading();
|
||||||
|
this.confirmOpenCsvError();
|
||||||
|
},
|
||||||
() => console.log('Completed file download.')
|
() => console.log('Completed file download.')
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
@ -343,4 +349,12 @@ export class ProjectComponent{
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public confirmOpenCsvError(){
|
||||||
|
this.alertCsvError.cancelButton = false;
|
||||||
|
this.alertCsvError.okButton = true;
|
||||||
|
this.alertCsvError.alertTitle = "ERROR DOWNLOADING CSV FILE";
|
||||||
|
this.alertCsvError.message = "There was an error in csv downloading. Please try again later.";
|
||||||
|
this.alertCsvError.okButtonText = "OK";
|
||||||
|
this.alertCsvError.open();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -7,6 +7,7 @@ import { RouterModule } from '@angular/router';
|
||||||
import { ProjectServiceModule} from './projectService.module';
|
import { ProjectServiceModule} from './projectService.module';
|
||||||
// import {HtmlProgressReportService} from './htmlProgressReport.service';
|
// import {HtmlProgressReportService} from './htmlProgressReport.service';
|
||||||
import{LoadingModalModule} from '../../utils/modal/loadingModal.module';
|
import{LoadingModalModule} from '../../utils/modal/loadingModal.module';
|
||||||
|
import {AlertModalModule} from '../../utils/modal/alertModal.module';
|
||||||
import {ErrorMessagesModule} from '../../utils/errorMessages.module';
|
import {ErrorMessagesModule} from '../../utils/errorMessages.module';
|
||||||
|
|
||||||
import { ProjectComponent } from './project.component';
|
import { ProjectComponent } from './project.component';
|
||||||
|
@ -25,7 +26,7 @@ import {IsRouteEnabled} from '../../error/isRouteEnabled.guard';
|
||||||
@NgModule({
|
@NgModule({
|
||||||
imports: [
|
imports: [
|
||||||
CommonModule, FormsModule, RouterModule, LandingModule,
|
CommonModule, FormsModule, RouterModule, LandingModule,
|
||||||
ProjectRoutingModule, LoadingModalModule, ErrorMessagesModule,
|
ProjectRoutingModule, LoadingModalModule, AlertModalModule, ErrorMessagesModule,
|
||||||
TabResultModule, IFrameModule, MetricsModule, ReportsServiceModule,
|
TabResultModule, IFrameModule, MetricsModule, ReportsServiceModule,
|
||||||
PublicationsServiceModule, DatasetsServiceModule, SoftwareServiceModule, ProjectServiceModule
|
PublicationsServiceModule, DatasetsServiceModule, SoftwareServiceModule, ProjectServiceModule
|
||||||
],
|
],
|
||||||
|
|
|
@ -124,7 +124,7 @@ export class PublicationComponent {
|
||||||
this.publicationInfo = data;
|
this.publicationInfo = data;
|
||||||
|
|
||||||
// this.result = []
|
// this.result = []
|
||||||
// this.result = {id: id, type :"dataset", source : "openaire", title: this.publicationInfo.title,url: '', result: '', accessRights: this.publicationInfo.bestlicense, embargoEndDate: ''};
|
// this.result = {id: id, type :"dataset", source : "openaire", title: this.publicationInfo.title,url: '', result: '', accessRights: this.publicationInfo.bestaccessright, embargoEndDate: ''};
|
||||||
this.updateTitle(this.publicationInfo.title.name);
|
this.updateTitle(this.publicationInfo.title.name);
|
||||||
this.updateDescription("Dataset, search, repositories, open access,"+this.publicationInfo.title.name);
|
this.updateDescription("Dataset, search, repositories, open access,"+this.publicationInfo.title.name);
|
||||||
if(OpenaireProperties.isPiwikTrackEnabled() && (typeof document !== 'undefined')){
|
if(OpenaireProperties.isPiwikTrackEnabled() && (typeof document !== 'undefined')){
|
||||||
|
|
|
@ -39,7 +39,7 @@ export class PublicationService {
|
||||||
res[1]['oaf:result']['journal'],
|
res[1]['oaf:result']['journal'],
|
||||||
res[1]['oaf:result']['language'],
|
res[1]['oaf:result']['language'],
|
||||||
res[1]['oaf:result']['subject'],
|
res[1]['oaf:result']['subject'],
|
||||||
res[1]['oaf:result']['bestlicense'],
|
res[1]['oaf:result']['bestaccessright'],
|
||||||
res[1]['oaf:result']['collectedfrom'],
|
res[1]['oaf:result']['collectedfrom'],
|
||||||
(res[1]['extraInfo']!= undefined && res[1]['extraInfo']['citations']!= undefined)? res[1]['extraInfo']['citations']['citation']:null,
|
(res[1]['extraInfo']!= undefined && res[1]['extraInfo']['citations']!= undefined)? res[1]['extraInfo']['citations']['citation']:null,
|
||||||
res[1]['oaf:result']['context'],
|
res[1]['oaf:result']['context'],
|
||||||
|
@ -75,8 +75,8 @@ export class PublicationService {
|
||||||
}
|
}
|
||||||
|
|
||||||
this.publicationInfo.title = {"name": "", "url": "", "accessMode": ""};
|
this.publicationInfo.title = {"name": "", "url": "", "accessMode": ""};
|
||||||
if(data[0]['bestlicense'].hasOwnProperty("classid")) {
|
if(data[0]['bestaccessright'].hasOwnProperty("classid")) {
|
||||||
this.publicationInfo.title.accessMode = data[0]['bestlicense'].classid;
|
this.publicationInfo.title.accessMode = data[0]['bestaccessright'].classid;
|
||||||
}
|
}
|
||||||
|
|
||||||
if(data[1] != null) {
|
if(data[1] != null) {
|
||||||
|
@ -153,6 +153,10 @@ export class PublicationService {
|
||||||
url = instance['webresource'][0].url;
|
url = instance['webresource'][0].url;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if(instance.hasOwnProperty("collectedfrom")) {
|
||||||
|
this.publicationInfo.collectedFrom = this.parsingFunctions.parseCollectedFrom(instance['collectedfrom']);
|
||||||
|
}
|
||||||
|
|
||||||
if(instance.hasOwnProperty("hostedby")) {
|
if(instance.hasOwnProperty("hostedby")) {
|
||||||
if(instance['hostedby'].name != "other resources" && instance['hostedby'].name != "Unknown Repository") {
|
if(instance['hostedby'].name != "other resources" && instance['hostedby'].name != "Unknown Repository") {
|
||||||
this.parsingFunctions.parseDownloadFrom(this.publicationInfo.downloadFrom, instance, url);
|
this.parsingFunctions.parseDownloadFrom(this.publicationInfo.downloadFrom, instance, url);
|
||||||
|
@ -218,12 +222,12 @@ export class PublicationService {
|
||||||
}
|
}
|
||||||
|
|
||||||
// if(data[8] != null) {
|
// if(data[8] != null) {
|
||||||
// this.publicationInfo.bestlicense = data[8].classid;
|
// this.publicationInfo.bestaccessright = data[8].classid;
|
||||||
// }
|
// }
|
||||||
|
|
||||||
if(data[9] != null) {
|
// if(data[9] != null) {
|
||||||
this.publicationInfo.collectedFrom = this.parsingFunctions.parseCollectedFrom(data[9]);
|
// this.publicationInfo.collectedFrom = this.parsingFunctions.parseCollectedFrom(data[9]);
|
||||||
}
|
// }
|
||||||
|
|
||||||
this.publicationInfo.downloadFrom = this.parsingFunctions.addPublisherToDownloadFrom(
|
this.publicationInfo.downloadFrom = this.parsingFunctions.addPublisherToDownloadFrom(
|
||||||
this.publicationInfo.downloadFrom, this.publicationInfo.publisher,
|
this.publicationInfo.downloadFrom, this.publicationInfo.publisher,
|
||||||
|
|
|
@ -38,7 +38,7 @@ export class SoftwareService {
|
||||||
res[1]['children'],
|
res[1]['children'],
|
||||||
res[1]['pid'],
|
res[1]['pid'],
|
||||||
res[1]['subject'],
|
res[1]['subject'],
|
||||||
res[1]['bestlicense'],
|
res[1]['bestaccessright'],
|
||||||
res[1]['collectedfrom'],
|
res[1]['collectedfrom'],
|
||||||
res[1]['context'],
|
res[1]['context'],
|
||||||
//res[1]['resulttype'],
|
//res[1]['resulttype'],
|
||||||
|
@ -72,8 +72,8 @@ export class SoftwareService {
|
||||||
this.softwareInfo.embargoEndDate = data[0].embargoenddate;
|
this.softwareInfo.embargoEndDate = data[0].embargoenddate;
|
||||||
}
|
}
|
||||||
this.softwareInfo.title = {"name": "", "url": "", "accessMode": ""};
|
this.softwareInfo.title = {"name": "", "url": "", "accessMode": ""};
|
||||||
if(data[0]['bestlicense'].hasOwnProperty("classid")) {
|
if(data[0]['bestaccessright'].hasOwnProperty("classid")) {
|
||||||
this.softwareInfo.title.accessMode = data[0]['bestlicense'].classid;
|
this.softwareInfo.title.accessMode = data[0]['bestaccessright'].classid;
|
||||||
}
|
}
|
||||||
if(data[1] != null) {
|
if(data[1] != null) {
|
||||||
if(Array.isArray(data[1])) {
|
if(Array.isArray(data[1])) {
|
||||||
|
@ -148,6 +148,10 @@ export class SoftwareService {
|
||||||
url = instance['webresource'][0].url;
|
url = instance['webresource'][0].url;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if(instance.hasOwnProperty("collectedfrom")) {
|
||||||
|
this.softwareInfo.collectedFrom = this.parsingFunctions.parseCollectedFrom(instance['collectedfrom']);
|
||||||
|
}
|
||||||
|
|
||||||
if(instance.hasOwnProperty("hostedby")) {
|
if(instance.hasOwnProperty("hostedby")) {
|
||||||
if(instance['hostedby'].name != "other resources" && instance['hostedby'].name != "Unknown Repository") {
|
if(instance['hostedby'].name != "other resources" && instance['hostedby'].name != "Unknown Repository") {
|
||||||
this.parsingFunctions.parseDownloadFrom(this.softwareInfo.downloadFrom, instance, url);
|
this.parsingFunctions.parseDownloadFrom(this.softwareInfo.downloadFrom, instance, url);
|
||||||
|
@ -182,12 +186,12 @@ export class SoftwareService {
|
||||||
}
|
}
|
||||||
|
|
||||||
// if(data[6] != null) {
|
// if(data[6] != null) {
|
||||||
// this.softwareInfo.bestlicense = data[6].classid;
|
// this.softwareInfo.bestaccessright = data[6].classid;
|
||||||
// }
|
// }
|
||||||
|
|
||||||
if(data[7] != null) {
|
// if(data[7] != null) {
|
||||||
this.softwareInfo.collectedFrom = this.parsingFunctions.parseCollectedFrom(data[7]);
|
// this.softwareInfo.collectedFrom = this.parsingFunctions.parseCollectedFrom(data[7]);
|
||||||
}
|
// }
|
||||||
|
|
||||||
// null argument is for journal
|
// null argument is for journal
|
||||||
this.softwareInfo.downloadFrom = this.parsingFunctions.addPublisherToDownloadFrom(
|
this.softwareInfo.downloadFrom = this.parsingFunctions.addPublisherToDownloadFrom(
|
||||||
|
|
|
@ -17,6 +17,7 @@ import {PiwikService} from '../../utils/piwik/piwik.service';
|
||||||
</span>
|
</span>
|
||||||
<!--modal-alert></modal-alert-->
|
<!--modal-alert></modal-alert-->
|
||||||
<modal-loading></modal-loading>
|
<modal-loading></modal-loading>
|
||||||
|
<modal-alert #AlertModalCsvError></modal-alert>
|
||||||
`
|
`
|
||||||
})
|
})
|
||||||
|
|
||||||
|
@ -31,6 +32,8 @@ export class SearchDownloadComponent {
|
||||||
downloadFilePiwikSub: any;
|
downloadFilePiwikSub: any;
|
||||||
|
|
||||||
@ViewChild (ModalLoading) loading : ModalLoading ;
|
@ViewChild (ModalLoading) loading : ModalLoading ;
|
||||||
|
// Alert box when something is wrong with CSV requests
|
||||||
|
@ViewChild('AlertModalCsvError') alertCsvError;
|
||||||
|
|
||||||
constructor ( private _reportsService: ReportsService, private _piwikService:PiwikService) {}
|
constructor ( private _reportsService: ReportsService, private _piwikService:PiwikService) {}
|
||||||
|
|
||||||
|
@ -71,7 +74,11 @@ export class SearchDownloadComponent {
|
||||||
this.downloadFilePiwikSub = this._piwikService.trackDownload(url).subscribe();
|
this.downloadFilePiwikSub = this._piwikService.trackDownload(url).subscribe();
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
error => console.log("Error downloading the file."),
|
error => {
|
||||||
|
console.log("Error downloading the file.");
|
||||||
|
this.closeLoading();
|
||||||
|
this.confirmOpenCsvError();
|
||||||
|
},
|
||||||
() => console.log('Completed file download.')
|
() => console.log('Completed file download.')
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
@ -93,4 +100,13 @@ export class SearchDownloadComponent {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public confirmOpenCsvError(){
|
||||||
|
this.alertCsvError.cancelButton = false;
|
||||||
|
this.alertCsvError.okButton = true;
|
||||||
|
this.alertCsvError.alertTitle = "ERROR DOWNLOADING CSV FILE";
|
||||||
|
this.alertCsvError.message = "There was an error in csv downloading. Please try again later.";
|
||||||
|
this.alertCsvError.okButtonText = "OK";
|
||||||
|
this.alertCsvError.open();
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -3,11 +3,12 @@ import { CommonModule } from '@angular/common';
|
||||||
import { FormsModule } from '@angular/forms';
|
import { FormsModule } from '@angular/forms';
|
||||||
|
|
||||||
import {SearchDownloadComponent} from './searchDownload.component';
|
import {SearchDownloadComponent} from './searchDownload.component';
|
||||||
import{LoadingModalModule} from '../../utils/modal/loadingModal.module';
|
import {LoadingModalModule} from '../../utils/modal/loadingModal.module';
|
||||||
|
import {AlertModalModule} from '../../utils/modal/alertModal.module';
|
||||||
|
|
||||||
@NgModule({
|
@NgModule({
|
||||||
imports: [
|
imports: [
|
||||||
CommonModule, FormsModule, LoadingModalModule
|
CommonModule, FormsModule, LoadingModalModule, AlertModalModule
|
||||||
],
|
],
|
||||||
declarations: [
|
declarations: [
|
||||||
SearchDownloadComponent
|
SearchDownloadComponent
|
||||||
|
|
|
@ -185,8 +185,8 @@ export class SearchDatasetsService {
|
||||||
//result['title'].url = OpenaireProperties.getsearchLinkToDataset();
|
//result['title'].url = OpenaireProperties.getsearchLinkToDataset();
|
||||||
//result['title'].url += Array.isArray(data) ? data[i]['result']['header']['dri:objIdentifier'] : data['result']['header']['dri:objIdentifier'];
|
//result['title'].url += Array.isArray(data) ? data[i]['result']['header']['dri:objIdentifier'] : data['result']['header']['dri:objIdentifier'];
|
||||||
result['id'] = Array.isArray(data) ? data[i]['result']['header']['dri:objIdentifier'] : data['result']['header']['dri:objIdentifier'];
|
result['id'] = Array.isArray(data) ? data[i]['result']['header']['dri:objIdentifier'] : data['result']['header']['dri:objIdentifier'];
|
||||||
if(resData['bestlicense'].hasOwnProperty("classid")) {
|
if(resData['bestaccessright'].hasOwnProperty("classid")) {
|
||||||
result['title'].accessMode = resData['bestlicense'].classid;
|
result['title'].accessMode = resData['bestaccessright'].classid;
|
||||||
}
|
}
|
||||||
|
|
||||||
if(resData['rels'].hasOwnProperty("rel")) {
|
if(resData['rels'].hasOwnProperty("rel")) {
|
||||||
|
|
|
@ -225,8 +225,8 @@ export class SearchPublicationsService {
|
||||||
//result['title'].url = OpenaireProperties.getsearchLinkToPublication();
|
//result['title'].url = OpenaireProperties.getsearchLinkToPublication();
|
||||||
//result['title'].url += Array.isArray(data) ? data[i]['result']['header']['dri:objIdentifier'] : data['result']['header']['dri:objIdentifier'];
|
//result['title'].url += Array.isArray(data) ? data[i]['result']['header']['dri:objIdentifier'] : data['result']['header']['dri:objIdentifier'];
|
||||||
result['id'] = Array.isArray(data) ? data[i]['result']['header']['dri:objIdentifier'] : data['result']['header']['dri:objIdentifier'];
|
result['id'] = Array.isArray(data) ? data[i]['result']['header']['dri:objIdentifier'] : data['result']['header']['dri:objIdentifier'];
|
||||||
if(resData['bestlicense'].hasOwnProperty("classid")) {
|
if(resData['bestaccessright'].hasOwnProperty("classid")) {
|
||||||
result['title'].accessMode = resData['bestlicense'].classid;
|
result['title'].accessMode = resData['bestaccessright'].classid;
|
||||||
}
|
}
|
||||||
|
|
||||||
if(resData['rels'].hasOwnProperty("rel")) {
|
if(resData['rels'].hasOwnProperty("rel")) {
|
||||||
|
@ -398,8 +398,8 @@ export class SearchPublicationsService {
|
||||||
|
|
||||||
//result.push(resData.embargoenddate);
|
//result.push(resData.embargoenddate);
|
||||||
|
|
||||||
if(resData['bestlicense'].hasOwnProperty("classid")) {
|
if(resData['bestaccessright'].hasOwnProperty("classid")) {
|
||||||
result.push(this.quote(resData['bestlicense'].classid));
|
result.push(this.quote(resData['bestaccessright'].classid));
|
||||||
} else {
|
} else {
|
||||||
result.push("");
|
result.push("");
|
||||||
}
|
}
|
||||||
|
|
|
@ -185,8 +185,8 @@ export class SearchSoftwareService {
|
||||||
//result['title'].url = OpenaireProperties.getsearchLinkToSoftware();
|
//result['title'].url = OpenaireProperties.getsearchLinkToSoftware();
|
||||||
//result['title'].url += Array.isArray(data) ? data[i]['result']['header']['dri:objIdentifier'] : data['result']['header']['dri:objIdentifier'];
|
//result['title'].url += Array.isArray(data) ? data[i]['result']['header']['dri:objIdentifier'] : data['result']['header']['dri:objIdentifier'];
|
||||||
result['id'] = Array.isArray(data) ? data[i]['result']['header']['dri:objIdentifier'] : data['result']['header']['dri:objIdentifier'];
|
result['id'] = Array.isArray(data) ? data[i]['result']['header']['dri:objIdentifier'] : data['result']['header']['dri:objIdentifier'];
|
||||||
if(resData['bestlicense'].hasOwnProperty("classid")) {
|
if(resData['bestaccessright'].hasOwnProperty("classid")) {
|
||||||
result['title'].accessMode = resData['bestlicense'].classid;
|
result['title'].accessMode = resData['bestaccessright'].classid;
|
||||||
}
|
}
|
||||||
|
|
||||||
if(resData['rels'].hasOwnProperty("rel")) {
|
if(resData['rels'].hasOwnProperty("rel")) {
|
||||||
|
|
|
@ -14,7 +14,7 @@ export class DatasetInfo {
|
||||||
otherSubjects: Map<string, string[]>;
|
otherSubjects: Map<string, string[]>;
|
||||||
classifiedSubjects: Map<string, string[]>;
|
classifiedSubjects: Map<string, string[]>;
|
||||||
description: string;
|
description: string;
|
||||||
//bestlicense: string;
|
//bestaccessright: string;
|
||||||
collectedFrom: { "name": string, "id": string}[];
|
collectedFrom: { "name": string, "id": string}[];
|
||||||
projectsProvenanceVocabulary: { "sysimport:crosswalk:repository": string,
|
projectsProvenanceVocabulary: { "sysimport:crosswalk:repository": string,
|
||||||
"sysimport:crosswalk:entityregistry": string,
|
"sysimport:crosswalk:entityregistry": string,
|
||||||
|
|
|
@ -16,7 +16,7 @@ export class PublicationInfo {
|
||||||
otherSubjects: Map<string, string[]>;
|
otherSubjects: Map<string, string[]>;
|
||||||
classifiedSubjects: Map<string, string[]>; //<class of subject, subjects>
|
classifiedSubjects: Map<string, string[]>; //<class of subject, subjects>
|
||||||
description: string;
|
description: string;
|
||||||
//bestlicense: string;
|
//bestaccessright: string;
|
||||||
collectedFrom: { "name": string, "id": string}[];
|
collectedFrom: { "name": string, "id": string}[];
|
||||||
projectsProvenanceVocabulary: { "sysimport:crosswalk:repository": string,
|
projectsProvenanceVocabulary: { "sysimport:crosswalk:repository": string,
|
||||||
"sysimport:crosswalk:entityregistry": string,
|
"sysimport:crosswalk:entityregistry": string,
|
||||||
|
@ -39,7 +39,7 @@ export class PublicationInfo {
|
||||||
fundedByProjects: { "id": string, "acronym": string, "title": string,
|
fundedByProjects: { "id": string, "acronym": string, "title": string,
|
||||||
"funderShortname": string, "funderName": string,
|
"funderShortname": string, "funderName": string,
|
||||||
"funding": string, "code": string, "provenanceAction": string,
|
"funding": string, "code": string, "provenanceAction": string,
|
||||||
"inline": boolean}[];
|
"inline": boolean}[];
|
||||||
bioentities: Map<string, Map<string, string>>; //<site name, <>>
|
bioentities: Map<string, Map<string, string>>; //<site name, <>>
|
||||||
software: { "name": string, "url": string}[]; //<site name, <>>
|
software: { "name": string, "url": string}[]; //<site name, <>>
|
||||||
//relatedPublications: { "name": string, "url": string, "date": string, "trust": number}[];
|
//relatedPublications: { "name": string, "url": string, "date": string, "trust": number}[];
|
||||||
|
|
|
@ -14,7 +14,7 @@ export class SoftwareInfo {
|
||||||
otherSubjects: Map<string, string[]>;
|
otherSubjects: Map<string, string[]>;
|
||||||
classifiedSubjects: Map<string, string[]>;
|
classifiedSubjects: Map<string, string[]>;
|
||||||
description: string;
|
description: string;
|
||||||
//bestlicense: string;
|
//bestaccessright: string;
|
||||||
collectedFrom: { "name": string, "id": string}[];
|
collectedFrom: { "name": string, "id": string}[];
|
||||||
projectsProvenanceVocabulary: { "sysimport:crosswalk:repository": string,
|
projectsProvenanceVocabulary: { "sysimport:crosswalk:repository": string,
|
||||||
"sysimport:crosswalk:entityregistry": string,
|
"sysimport:crosswalk:entityregistry": string,
|
||||||
|
|
|
@ -7,12 +7,12 @@ export class SearchFields {
|
||||||
"relfunder",
|
"relfunder",
|
||||||
"relfundinglevel0_id","relfundinglevel1_id","relfundinglevel2_id",
|
"relfundinglevel0_id","relfundinglevel1_id","relfundinglevel2_id",
|
||||||
"relproject","resultacceptanceyear",
|
"relproject","resultacceptanceyear",
|
||||||
"resultbestlicense", "instancetypename", "resultlanguagename", "community","resulthostingdatasource"];
|
"resultbestaccessright", "instancetypename", "resultlanguagename", "community","resulthostingdatasource"];
|
||||||
|
|
||||||
public RESULT_ADVANCED_FIELDS:string[] = ["q","resulttitle","relperson","resultpublisher","instancetypename",
|
public RESULT_ADVANCED_FIELDS:string[] = ["q","resulttitle","relperson","resultpublisher","instancetypename",
|
||||||
"resultlanguagename", "community","relprojectid", "relfunder",
|
"resultlanguagename", "community","relprojectid", "relfunder",
|
||||||
"relfundinglevel0_id","relfundinglevel1_id","relfundinglevel2_id",
|
"relfundinglevel0_id","relfundinglevel1_id","relfundinglevel2_id",
|
||||||
"resultdateofacceptance","resultbestlicense","pid","resulthostingdatasourceid","collectedfromdatasourceid", "relorganizationid"];
|
"resultdateofacceptance","resultbestaccessright","pid","resulthostingdatasourceid","collectedfromdatasourceid", "relorganizationid"];
|
||||||
public RESULT_FIELDS: { [key:string]:FieldDetails}={
|
public RESULT_FIELDS: { [key:string]:FieldDetails}={
|
||||||
["q"]:{name:"All fields", type:"keyword", param:"q", equalityOperator: "="},
|
["q"]:{name:"All fields", type:"keyword", param:"q", equalityOperator: "="},
|
||||||
["resulttitle"]:{name:"Title", type:"keyword", param:"title", equalityOperator: "="},
|
["resulttitle"]:{name:"Title", type:"keyword", param:"title", equalityOperator: "="},
|
||||||
|
@ -34,8 +34,8 @@ export class SearchFields {
|
||||||
["relfundinglevel2_id"]:{name:"Funding Substream level 2", type:"refine", param:"funderlv2", equalityOperator: " exact "},
|
["relfundinglevel2_id"]:{name:"Funding Substream level 2", type:"refine", param:"funderlv2", equalityOperator: " exact "},
|
||||||
["resultacceptanceyear"]:{name:"Publication Date", type:"keyword", param:"year", equalityOperator: " exact "},
|
["resultacceptanceyear"]:{name:"Publication Date", type:"keyword", param:"year", equalityOperator: " exact "},
|
||||||
["resultdateofacceptance"]:{name:"Publication Date", type:"date", param:"date", equalityOperator: " within "},
|
["resultdateofacceptance"]:{name:"Publication Date", type:"date", param:"date", equalityOperator: " within "},
|
||||||
["resultbestlicense"]:{name:"Access Mode", type:"vocabulary", param:"access", equalityOperator: " exact "},
|
["resultbestaccessright"]:{name:"Access Mode", type:"vocabulary", param:"access", equalityOperator: " exact "},
|
||||||
// ["resultbestlicenseid"]:{name:"Access Mode", type:"refine", param:"access", equalityOperator: " exact "},
|
// ["resultbestaccessright"]:{name:"Access Mode", type:"refine", param:"access", equalityOperator: " exact "},
|
||||||
["collectedfrom"]:{name:"Content Provider", type:"refine", param:"datasource", equalityOperator: " exact "},
|
["collectedfrom"]:{name:"Content Provider", type:"refine", param:"datasource", equalityOperator: " exact "},
|
||||||
["relorganizationid"]:{name:"Organization", type:"entity", param:"organization", equalityOperator: " exact "},
|
["relorganizationid"]:{name:"Organization", type:"entity", param:"organization", equalityOperator: " exact "},
|
||||||
["collectedfromdatasourceid"]:{name:"Collected from Content Provider", type:"entity", param:"collectedFrom", equalityOperator: " exact "}
|
["collectedfromdatasourceid"]:{name:"Collected from Content Provider", type:"entity", param:"collectedFrom", equalityOperator: " exact "}
|
||||||
|
|
Loading…
Reference in New Issue