import { Component, OnInit } from '@angular/core'; import { Exercise } from 'app/shared/model/exercise.model'; import { SearchInput } from 'app/shared/model/search/search-input.model'; import { SearchService } from 'app/search/service/search-service'; import { SearchResultsDTO } from 'app/shared/model/search/search-results-dto.model'; import { SearchResultDTO } from 'app/shared/model/search/search-result-dto.model'; import { AccountService } from 'app/core/auth/account.service'; @Component({ selector: 'jhi-search', templateUrl: './search.component.html', styleUrls: ['./search.scss'], }) export class SearchComponent implements OnInit { results: Exercise[] = []; selectedResult?: Exercise; hitCount = 0; private searchInput: SearchInput = new SearchInput(); constructor(protected searchService: SearchService, public accountService: AccountService) {} ngOnInit(): void {} selectExercise(exercise: Exercise): void { this.selectedResult = exercise; } updateSearchInput(searchInput: SearchInput): void { searchInput.page = 0; this.searchInput = searchInput; this.results = []; this.hitCount = 0; this.search(); } private search(): void { if ( this.searchInput.fulltextQuery || this.searchInput.metadata.programmingLanguage || this.searchInput.metadata.keyword || this.searchInput.metadata.author || this.searchInput.metadata.license ) { this.searchService.searchPageDetails(this.searchInput).subscribe( (data: SearchResultsDTO) => { const searchResults = this.parseSearchResultsDTO(data); this.results = this.results.concat(searchResults); ++this.searchInput.page; }, () => alert('Search failed') ); } } private parseSearchResultsDTO(searchResultsDTO: SearchResultsDTO): Exercise[] { this.hitCount = searchResultsDTO.hitCount; // fix string to date conversion: unfortunatelly dates are not converted correctly :-() searchResultsDTO.searchResult.forEach(hit => { // eslint-disable-next-line @typescript-eslint/camelcase hit.project.last_activity_at = new Date(hit.project.last_activity_at); // eslint-disable-next-line @typescript-eslint/camelcase hit.file.indexing_date = new Date(hit.file.indexing_date); }); return searchResultsDTO.searchResult.map(this.searchResultToExercise); } private searchResultToExercise(searchResult: SearchResultDTO): Exercise { return { title: searchResult.metadata.title, license: searchResult.metadata.license, description: searchResult.metadata.description, programmingLanguages: searchResult.metadata.programmingLanguage, languages: searchResult.metadata.language, creators: searchResult.metadata.creator, contributor: searchResult.metadata.contributor, publisher: searchResult.metadata.publisher, imageURL: searchResult.metadata.image, rating: searchResult.ranking5, lastUpdate: searchResult.project.last_activity_at, timeRequired: searchResult.metadata.timeRequired, requires: searchResult.metadata.requires, deprecated: searchResult.metadata.deprecated, difficulty: searchResult.metadata.difficulty, educationLevel: searchResult.metadata.educationLevel, format: searchResult.metadata.format, keyword: searchResult.metadata.keyword, status: searchResult.metadata.status, type: searchResult.metadata.type, structure: searchResult.metadata.structure, version: searchResult.metadata.version, metadataVersion: searchResult.metadata.metadataVersion, gitlabURL: searchResult.project.url, originalResult: searchResult, views: searchResult.views, downloads: searchResult.downloads, }; } onScroll(): void { this.search(); } }