import {Component, Input, Output, EventEmitter,ViewChild} from '@angular/core'; import {Observable} from 'rxjs/Observable'; import {SearchCrossrefService} from '../../claim-utils/service/searchCrossref.service'; import {SearchDataciteService} from '../../claim-utils/service/searchDatacite.service'; import {ModalLoading} from '../../../utils/modal/loading.component'; import {Dates, DOI} from '../../../utils/string-utils.class'; import {ClaimResult} from '../../claim-utils/claimEntities.class'; import{EnvProperties} from '../../../utils/properties/env-properties'; @Component({ selector: 'bulk-claim', template: `
Upload a DOI csv file:
` }) //[(ngModel)]="date" export class BulkClaimComponent { filesToUpload: Array; navigateTo: string = "Search"; source: string = "crossref"; type : string = "publication"; resultsFromSearch:number; @Input() public select:boolean = true ; @Input() public results; @Input() public properties:EnvProperties; allIds:string[] = []; foundIds:string[] = []; duplicateIds:string[] = []; notFoundIds:string[] = []; noValidIds:string[] = []; showReport:boolean = false; showInfo :boolean = false; @ViewChild (ModalLoading) loading : ModalLoading ; errorMessage = ""; infoMEssage = ""; enableUpload:boolean = true; constructor(private _searchCrossrefService: SearchCrossrefService, private _searchDataciteService: SearchDataciteService) { this.filesToUpload = []; } ngOnInit() {} upload() { this.enableUpload = false; this.showReport = false; this.errorMessage = ""; if(this.filesToUpload.length == 0){ this.errorMessage = "There is no selected file to upload."; return ; } this.loading.open(); this.makeFileRequest(this.properties.uploadService, [], this.filesToUpload).then((result) => { var rows = (result as any).split('\n'); // I have used space, you can use any thing. var i = 0; this.duplicateIds = []; this.allIds = []; this.foundIds = []; this.noValidIds = []; this.results.slice(0,this.results.length); this.notFoundIds = []; var limit = 100; for(i=0;i<((rows.length>limit)?limit:rows.length);i++){ if(rows[i] && rows[i] != null ){ console.log("Row is:" + rows[i]); var values = rows[i].split(','); var id=this.removeDoubleQuotes(values[0]); if(DOI.isValidDOI(id)){ var accessMode = (values[1] != undefined) ? this.removeDoubleQuotes(values[1]):"OPEN"; accessMode = (this.validateAccessMode(accessMode)?accessMode:"OPEN"); var embargoDate =(values[2] != undefined) ? this.removeDoubleQuotes(values[2]):Dates.getDateToday(); embargoDate = (Dates.isValidDate(embargoDate)?embargoDate:Dates.getDateToday()); if(this.allIds.indexOf(id)>-1){ this.duplicateIds.push(id); }else{ this.allIds.push(id); this.fetchResult(id,accessMode,embargoDate); } }else{ this.noValidIds.push(id); } } } }, (error) => { this.enableUpload = true; console.log(error); this.loading.close(); this.errorMessage = "An error occured while uploading..."; }); } private removeDoubleQuotes(value){ if(value.indexOf('"')== 0){ value = value.substring(1,value.length); } var index =+value.indexOf('"'); if(index == (value.length - 1) || index == (value.length - 2) ){ value = value.substring(0,index); } return value; } private validateAccessMode(value){ var accessModes = ["OPEN", "CLOSED", "EMBARGO"]; if(accessModes.indexOf(value) > -1){ return true; } return false; } fileChangeEvent(fileInput: any){ this.filesToUpload = > fileInput.target.files; } makeFileRequest(url: string, params: Array, files: Array) { return new Promise((resolve, reject) => { var formData: any = new FormData(); var xhr = new XMLHttpRequest(); for(var i = 0; i < files.length; i++) { formData.append("uploads[]", files[i], files[i].name); } xhr.onreadystatechange = function () { if (xhr.readyState == 4) { if (xhr.status == 200) { resolve(xhr.response); } else { reject(xhr.response); } } } xhr.open("POST", url, true); xhr.send(formData); }); } fetchResult(id:string,accessMode:string,date:string){ this._searchCrossrefService.searchCrossrefByDOIs([id], this.properties.searchCrossrefAPIURL, true).subscribe( data => { var result = data[0]; if(data.length > 0){ this.foundIds.push(id); result.embargoEndDate = date; this.results.push(result); this.endOfFetching(); }else{ this.searchInDatacite(id,accessMode,date); // this.notFoundIds.push(id); } }, err => { console.log(err); this.notFoundIds.push(id); this.endOfFetching(); } ); } searchInDatacite(id:string,accessMode:string,date:string){ this._searchDataciteService.getDataciteResultByDOI(id,this.properties,true).subscribe( items => { if(items.length > 0){ var result = items[0]; this.foundIds.push(id); result.embargoEndDate = date; this.results.push(result); }else{ this.notFoundIds.push(id); } this.endOfFetching(); }, err => { console.log(err); this.notFoundIds.push(id); this.endOfFetching(); } ); } endOfFetching(){ if(this.allIds.length == this.foundIds.length+this.notFoundIds.length+ this.duplicateIds.length ){ this.showReport = true; this.enableUpload = true; this.loading.close(); } } }