214 lines
6.9 KiB
TypeScript
214 lines
6.9 KiB
TypeScript
import {Component, Input,Output, ElementRef, EventEmitter, ViewChild} from '@angular/core';
|
|
import {Observable} from 'rxjs/Observable';
|
|
import {SearchProjectsService} from '../../services/searchProjects.service';
|
|
import {ProjectService} from '../../landingPages/project/project.service';
|
|
// import {ModalLoading} from '../../utils/modal/loading.component';
|
|
import { Subject } from 'rxjs/Subject';
|
|
import {ClaimProject} from './claimEntities.class';
|
|
declare var UIkit:any;
|
|
import{EnvProperties} from '../../utils/properties/env-properties';
|
|
|
|
@Component({
|
|
selector: 'claim-projects-search-form',
|
|
|
|
template: `
|
|
<form [class]="((inlineClaim)?'':' uk-card uk-card-default uk-padding uk-padding-medium ')+ 'uk-animation' " >
|
|
<div class="uk-text-lead">Search for projects <helper div="link-project-form" tooltip=true></helper></div>
|
|
<div class="uk-grid">
|
|
<div class="uk-grid uk-width-expand">
|
|
<div class="uk-width-auto@m uk-first-column">
|
|
<select class="uk-select uk-width-large" [(ngModel)]="selectedFunderId" name="select_funder" >
|
|
<option value="0" (click)="funderChanged('0','Select funder:')">Select funder:</option>
|
|
<option *ngFor="let funder of funders" [value]="funder.id" (click)="funderChanged(funder.id,funder.name)">{{(funder.name.split("||").length > 0)?(funder.name.split("||")[0]+" ("+funder.name.split("||")[1]+")"):(funder.name)}}</option>
|
|
</select>
|
|
</div>
|
|
<div class="uk-width-expand@m">
|
|
|
|
<entities-autocomplete [(properties)]=properties entityType="project" [funderId]="selectedFunderId" [allowDuplicates]=true [showSelected]=false [placeHolderMessage] = "'Project name or ID'" title = "Projects" [multipleSelections]=true (addItem) = "select($event)" ></entities-autocomplete>
|
|
</div>
|
|
</div>
|
|
|
|
</div>
|
|
</form>
|
|
|
|
`
|
|
|
|
})
|
|
export class ClaimProjectsSearchFormComponent {
|
|
ngOnInit() {
|
|
this.getFunders();
|
|
}
|
|
// @ViewChild (ModalLoading) loading : ModalLoading ;
|
|
|
|
// @Input() public inline: boolean = false ; // for claimed started from landing pages
|
|
public query = '';
|
|
@Input() public selectedProjects=[] ;
|
|
public elementRef;
|
|
|
|
public funders:string[];
|
|
public selectedFunderId:string ="0";
|
|
selectedFunderName:string ="Select funder:";
|
|
@Output() projectSelected = new EventEmitter();
|
|
@Input() public properties:EnvProperties;
|
|
@Input() public inlineClaim:boolean=false;
|
|
@Input() localStoragePrefix:string = "";
|
|
|
|
public projects:string[];
|
|
public warningMessage = "";
|
|
public infoMessage = "";
|
|
|
|
// public searchTermStream = new Subject<string>();
|
|
// filtered: Observable<{}> = this.searchTermStream
|
|
// .debounceTime(300).distinctUntilChanged()
|
|
// .switchMap((term: string) => this._projectService.searchForProjectsObs(term, this.selectedFunderId));
|
|
public tries:number = 0 ;
|
|
public keywordlimit = 3;
|
|
|
|
constructor(private _service: ProjectService, private _projectService: SearchProjectsService, myElement: ElementRef) {
|
|
this.elementRef = myElement;
|
|
}
|
|
|
|
|
|
// search() {
|
|
// console.info("heeere "+this.query );
|
|
// this.infoMessage = "";
|
|
// // this.filtered = [];
|
|
// if(this.query == ""){
|
|
// this.tries = 0;
|
|
// this.warningMessage = "";
|
|
// } else if(this.query && this.query.length < this.keywordlimit){
|
|
// this.tries++;
|
|
// if(this.tries == this.keywordlimit -1 ){
|
|
// this.warningMessage = "Type at least " + this.keywordlimit + " characters";
|
|
// this.tries = 0;
|
|
// }
|
|
// }else{
|
|
// console.info("doo the search "+this.query );
|
|
//
|
|
// this.tries = 0;
|
|
// this.warningMessage = "";
|
|
// this.searchTermStream.next(this.query);
|
|
//
|
|
// }
|
|
//
|
|
// }
|
|
select(item){
|
|
if(this.selectedProjects.length > 50){
|
|
UIkit.notification({
|
|
message : 'Your basket exceeds the number of allowed projects (50)',
|
|
status : 'warning',
|
|
timeout : 1500,
|
|
pos : 'top-center'
|
|
});
|
|
return;
|
|
}
|
|
this.query = "";
|
|
// this.searchTermStream.next(this.query); //clear
|
|
item = item.value;
|
|
var project: ClaimProject = new ClaimProject();
|
|
project.funderId = item.funderId;
|
|
project.funderName = item.funderName;
|
|
project.projectId = item.id;
|
|
project.projectName = item.projectName;
|
|
project.projectAcronym = item.projectAcronym;
|
|
project.startDate = item.startDate;
|
|
project.endDate = item.endDate;
|
|
project.code = item.code;
|
|
project.jurisdiction = item.jurisdiction;
|
|
project.fundingLevel0 = item.fundingLevel0;
|
|
|
|
|
|
|
|
// this._service.getProjectDates(project.projectId).subscribe(
|
|
// data => {
|
|
// project.startDate = data.startDate;
|
|
// project.endDate = data.endDate;
|
|
// },
|
|
// err => console.log(err)
|
|
// );
|
|
var index:number =this.selectedProjects.indexOf(project);
|
|
var found:boolean = false;
|
|
this.warningMessage = "";
|
|
|
|
for (var _i = 0; _i < this.selectedProjects.length; _i++) {
|
|
let item = this.selectedProjects[_i];
|
|
if(item.projectId == project.projectId){
|
|
found=true;
|
|
this.warningMessage = "Project already in your basket";
|
|
}
|
|
}
|
|
|
|
if (!found) {
|
|
this.selectedProjects.push(project);
|
|
if(this.selectedProjects != null){
|
|
localStorage.setItem(this.localStoragePrefix + "projects", JSON.stringify(this.selectedProjects));
|
|
}
|
|
this.projectSelected.emit({
|
|
value: true
|
|
});
|
|
UIkit.notification({
|
|
message : 'A new project added in the basket.',
|
|
status : 'primary',
|
|
timeout : 1500,
|
|
pos : 'top-center'
|
|
});
|
|
}else{
|
|
UIkit.notification({
|
|
message : 'The project is already in your basket.',
|
|
status : 'warning',
|
|
timeout : 1500,
|
|
pos : 'top-center'
|
|
});
|
|
}
|
|
|
|
}
|
|
showItem(item):string{
|
|
return ((item.field[1]['@value'])?item.field[1]['@value']+" - ":"" ) + item.field[3]['@value'];
|
|
}
|
|
remove(item){
|
|
var index:number =this.selectedProjects.indexOf(item);
|
|
if (index > -1) {
|
|
this.selectedProjects.splice(index, 1);
|
|
}
|
|
|
|
}
|
|
handleClick(event){
|
|
var clickedComponent = event.target;
|
|
var inside = false;
|
|
do {
|
|
if (clickedComponent === this.elementRef.nativeElement) {
|
|
inside = true;
|
|
}
|
|
clickedComponent = clickedComponent.parentNode;
|
|
} while (clickedComponent);
|
|
|
|
}
|
|
getFunders () {
|
|
this._projectService.getFunders(this.properties).subscribe(
|
|
data => {
|
|
this.funders = data[1];
|
|
},
|
|
err => {
|
|
this.handleError("Error getting funders", err);
|
|
//console.log(err)
|
|
}
|
|
);
|
|
}
|
|
|
|
getProjects () {
|
|
if(this.selectedFunderId != '0'){
|
|
|
|
}
|
|
}
|
|
funderChanged(funderId:string, funderName:string){
|
|
this.selectedFunderId = funderId;
|
|
this.selectedFunderName = funderName;
|
|
//console.info("Selected funder:"+this.selectedFunderId+ ' name:'+funderName );
|
|
|
|
}
|
|
|
|
private handleError(message: string, error) {
|
|
console.error("Claim project search form (component): "+message, error);
|
|
}
|
|
}
|