[Library|Trunk]

Search Pages:
	when refine filters have no result, Show them on the left
	create filters using the URL params



git-svn-id: https://svn.driver.research-infrastructures.eu/driver/dnet40/modules/uoa-services-library/trunk/ng-openaire-library/src/app@58052 d315682c-612b-4755-9ff5-7f18f6832af3
This commit is contained in:
argiro.kokogiannaki 2020-02-04 13:27:42 +00:00
parent 07bdf020ba
commit 908712ed50
5 changed files with 96 additions and 71 deletions

View File

@ -8,7 +8,6 @@ import {SearchFields} from '../utils/properties/searchFields';
import {SearchCustomFilter, SearchUtilsClass} from './searchUtils/searchUtils.class';
import {EnvProperties} from '../utils/properties/env-properties';
import {NewSearchPageComponent} from "./searchUtils/newSearchPage.component";
import {DOI} from "../utils/string-utils.class";
@Component({
@ -34,15 +33,7 @@ import {DOI} from "../utils/string-utils.class";
[simpleView]="simpleView" formPlaceholderText="Search by title, author, doi, abstract content..."
>
</new-search-page>
<!--
Field missing from simple search!
formPlaceholderText = "Search for {{ getEntityName(resultType, true, true) | titlecase }}"
[(filters)] = "filters"
[(baseUrl)] = baseUrl
[advancedSearchLink]="advancedSearchLink"
[(advancedSearchParameters)]=advancedSearchParameters-->
`
})
@ -141,6 +132,8 @@ export class SearchResearchResultsComponent {
this.searchPage.refineFields = this.refineFields;
this.searchPage.fieldIdsMap = this.fieldIdsMap;
this.searchPage.customFilter = this.customFilter;
this.searchPage.unknownFilters = this.searchPage.getEmptyRefineFilters(params);
this.searchPage.createAdvancedSearchSelectedFiltersFromURLParameters(params);
this._getResults(this.searchPage.getSearchAPIQueryForAdvancedSearhFields(), this.searchUtils.page, this.searchUtils.size, this.searchUtils.sortBy, refine, this.searchPage.getSearchAPIQueryForRefineFields(params));
});
@ -152,26 +145,6 @@ export class SearchResearchResultsComponent {
sub: any;
/*public getResults(parameters:string, page: number, size: number, sortBy: string, refine:boolean ) {
if (page > this.pagingLimit) {
size = 0;
}
if (page <= this.pagingLimit || this.searchUtils.status == this.errorCodes.LOADING) {
if (parameters != null && parameters != '') {
this.csvParams = "&fq=(" + this.resourcesQuery + " and (" + parameters + "))";
} else {
this.csvParams = "&fq=" + this.resourcesQuery;
}
this.searchUtils.status = this.errorCodes.LOADING;
this.disableForms = true;
this.results = [];
this.searchUtils.totalResults = 0;
this._getResults(parameters, page, size, sortBy, refine);
}
}*/
public _getResults(parameters: string, page: number, size: number, sortBy: string, refine: boolean, refineFieldsFilterQuery = null) {
if (page > this.pagingLimit) {
size = 0;
@ -195,11 +168,8 @@ export class SearchResearchResultsComponent {
this.searchUtils.totalResults = data[0];
this.results = data[1];
if (refine) {
this.filters = data[2];
console.info(this.filters);
this.filters = this.searchPage.prepareFiltersToShow(data[2]);
}
this.searchPage.checkSelectedFilters(this.filters);
// this.searchPage.updateBaseUrlWithParameters(this.filters);
this.searchPage.updateBaseUrlWithParameters();
this.searchUtils.status = this.errorCodes.DONE;

View File

@ -117,7 +117,7 @@
[routerLink]="advancedSearchLink" style="z-index:1;" [queryParams]="advancedSearchLinkParameters"
[class]="(isDisabled)?'uk-float-right uk-disabled uk-link-muted portal-link uk-margin-right ':'uk-float-right portal-link uk-margin-right '">Advanced search
</a>
<search-form [isDisabled]="isDisabled" [(keyword)]="selectedFields[0].value"
<search-form *ngIf="selectedFields.length > 0" [isDisabled]="isDisabled" [(keyword)]="selectedFields[0].value"
(keywordChange)="simpleKeywordChanged($event)"
[placeholderText]="formPlaceholderText"></search-form>
</div>

View File

@ -29,7 +29,7 @@
<div id="tm-main" class=" tm-middle">
<div uk-grid uk-grid>
<div uk-grid>
<div class="tm-main uk-width-1-1@s uk-width-1-1@m uk-width-1-1@l uk-row-first ">
<div class="uk-container">
<div>
@ -59,10 +59,10 @@
class="uk-width-1-2" [loadPaging]="loadPaging" [oldTotalResults]="oldTotalResults" [(searchUtils)] = "searchUtils" [type]="csvPath" [csvParams]="csvParams" [totalResults]="searchUtils.totalResults">
</search-download>
<div *ngIf="countFilters()>0" class="uk-margin-small-bottom">
<div *ngIf="selectedFilters>0" class="uk-margin-small-bottom">
<div class="uk-grid uk-margin-bottom uk-margin-top">
<span class="uk-text-bold uk-text-large">Filters</span>
<a *ngIf="countFilters()>1" (click)="clearFilters()" [class]="((disableForms)?'uk-disabled uk-link-muted':'')+' portal-link ' + 'uk-width-1-2'">
<a *ngIf="selectedFilters>1" (click)="clearFilters()" [class]="((disableForms)?'uk-disabled uk-link-muted':'')+' portal-link ' + 'uk-width-1-2'">
Clear All
</a>
</div>
@ -88,16 +88,18 @@
</div>
<div class="uk-margin-small-bottom uk-margin-small-top uk-grid">
<a *ngIf= "showUnknownFilters" class = " portal-link" (click) = "clearFilters() " >Try new Query</a>
</div>
<!-- <div class="uk-margin-small-bottom uk-margin-small-top uk-grid">-->
<!-- <a *ngIf= "showUnknownFilters" class = " portal-link" (click) = "clearFilters() " >Try new Query</a>-->
<!-- </div>-->
</div>
<div *ngIf="filters.length === 0 && searchUtils.keyword.length === 0 && results.length > 0" class="uk-margin-top">
<span class="uk-text-meta">No filters available</span>
</div>
<div class="uk-text-large">Filter By:</div>
<search-filter *ngFor="let filter of filters " [addShowMore]=false [isDisabled]="disableForms" [filter]="filter" [showResultCount]=showResultCount (onFilterChange)="filterChanged($event)" ></search-filter>
<div *ngIf="!showUnknownFilters">
<div class="uk-text-large">Filter By:</div>
<search-filter *ngFor="let filter of filters " [addShowMore]=false [isDisabled]="disableForms" [filter]="filter" [showResultCount]=showResultCount (onFilterChange)="filterChanged($event)" ></search-filter>
</div>
</div>
</div>
@ -120,26 +122,25 @@
'community' && entityType != 'funder') && usedBy == 'search'"
class="uk-width-1-2" [loadPaging]="loadPaging" [oldTotalResults]="oldTotalResults" [(searchUtils)] = "searchUtils" [type]="csvPath" [csvParams]="csvParams" [totalResults]="searchUtils.totalResults">
</search-download>
<div class="uk-width-1-1 uk-margin-small-bottom ">
<div class="uk-grid uk-margin-bottom uk-margin-top">
<div *ngIf="selectedFilters>0" class="uk-grid uk-margin-bottom uk-margin-top">
<span class="uk-text-bold uk-text-large">Filters</span>
<a *ngIf="countFilters()>1" (click)="clearFilters()" [class]="((disableForms)?'uk-disabled uk-link-muted':'')+' portal-link ' + 'uk-width-1-2'">
<a *ngIf="selectedFilters>1" (click)="clearFilters()" [class]="((disableForms)?'uk-disabled uk-link-muted':'')+' portal-link ' + 'uk-width-1-2'">
Clear All
</a>
</div>
<div *ngIf="countFilters()>0" class="uk-margin-small-bottom">
<div *ngIf=" selectedFilters>0" class="uk-margin-small-bottom">
<span *ngIf = "searchUtils.keyword.length > 0"><span class="uk-text-bold">Keywords:</span>
<!-- <span *ngIf = "searchUtils.keyword.length > 0"><span class="uk-text-bold">Keywords:</span>
<a (click) = "clearKeywords() " title="Remove keywords" [class]="((disableForms)?' uk-disabled':' ')+' portal-color '"><span class=" clickable " aria-hidden="true"><span class="uk-icon ">
<svg width="16" height="16" viewBox="0 0 20 20" xmlns="http://www.w3.org/2000/svg" icon="close" ratio="0.8"><path fill="none" stroke="#000" stroke-width="1.6" d="M16,16 L4,4"></path><path fill="none" stroke="#000" stroke-width="1.6" d="M16,4 L4,16"></path></svg>
</span></span></a>
<span [innerHtml]="searchUtils.keyword"></span>
</span>
</span>-->
<div *ngFor="let filter of filters " >
<span *ngIf = "filter.countSelectedValues > 0"> <span class="uk-text-bold">{{filter.title}}:</span>
<span *ngIf = "filter.countSelectedValues > 0" > <span class="uk-text-bold">{{filter.title}}:</span>
<label *ngFor="let value of getSelectedValues(filter); let i = index; let end = last; "
[title]="'Remove '+value.name" (click) = "removeFilter(value, filter) ">
<a [class]="((disableForms)?' uk-disabled':' ')+' portal-color '"><span class=" clickable" aria-hidden="true"><span class="uk-icon">
@ -152,14 +153,16 @@
</div>
</div>
<div class="uk-margin-small-bottom uk-margin-small-top uk-grid">
<a *ngIf= "showUnknownFilters" class = " portal-link" (click) = "clearFilters() " >Try new Query</a>
</div>
<!-- <div class="uk-margin-small-bottom uk-margin-small-top uk-grid">-->
<!-- <a *ngIf= "showUnknownFilters" class = " portal-link" (click) = "clearFilters() " >Try new Query</a>-->
<!-- </div>-->
</div>
<div *ngIf="filters.length === 0 && searchUtils.keyword.length === 0 && results.length > 0" class="uk-margin-top">
<div *ngIf="filters.length === 0 && results.length > 0" class="uk-margin-top">
<span class="uk-text-meta">No filters available</span>
</div>
<search-filter *ngFor="let filter of filters " [filterValuesNum]="filterValuesNum" [showMoreInline]="showMoreFilterValuesInline" [isDisabled]="disableForms" [filter]="filter" [showResultCount]=showResultCount (onFilterChange)="filterChanged($event)" ></search-filter>
<div *ngIf="!showUnknownFilters">
<search-filter *ngFor="let filter of filters " [filterValuesNum]="filterValuesNum" [showMoreInline]="showMoreFilterValuesInline" [isDisabled]="disableForms" [filter]="filter" [showResultCount]=showResultCount (onFilterChange)="filterChanged($event)" ></search-filter>
</div>
</div>
<div class="uk-width-expand@m uk-with-1-1@s">
<div *ngIf="openaireLink"> <a class="uk-margin-top uk-button uk-button-text" [href]=openaireLink target="_blank" >Results in OpenAIRE</a></div>

View File

@ -15,6 +15,7 @@ import {EnvProperties} from '../../utils/properties/env-properties';
import {SEOService} from '../../sharedComponents/SEO/SEO.service';
import {HelperService} from "../../utils/helper/helper.service";
import {SearchFields} from "../../utils/properties/searchFields";
import {RefineResultsUtils} from "../../services/servicesUtils/refineResults.class";
@Component({
selector: 'new-search-page',
@ -46,10 +47,12 @@ export class NewSearchPageComponent {
//From simple:
@Input() refineFields = [];
@Input() filters = [];
selectedFilters:number = 0;
private queryParameters: Map<string, string> = new Map<string, string>();
private searchFieldsHelper: SearchFields = new SearchFields();
@Input() newQueryButton: boolean = true;
public showUnknownFilters: boolean = false; // when a filter exists in query but has no results, so no filters returned from the query
unknownFilters: Filter[] = [];
@Input() showRefine: boolean = true;
@Input() tableViewLink: string;
@Input() mapUrl: string = "";
@ -169,6 +172,7 @@ export class NewSearchPageComponent {
this.filters[i].countSelectedValues = 0;
}
}
this.selectedFilters = 0;
this.goTo(1);
// this.clearKeywords();
}
@ -353,24 +357,14 @@ export class NewSearchPageComponent {
return filters;
}
public countFilters(): number {
var filters = 0;
this.showUnknownFilters = false;
for (let filter of this.filters) {
public countSelectedFilters(filters:Filter[]): number {
this.selectedFilters = 0;
for (let filter of filters) {
if (filter.countSelectedValues > 0) {
filters += filter.countSelectedValues;
this.selectedFilters += filter.countSelectedValues;
}
}
if (this.searchUtils.keyword.length > 0) {
filters++;
}
var errorCodes: ErrorCodes = new ErrorCodes();
if (this.queryParameters.keys() && this.searchUtils.totalResults == 0 && this.searchUtils.status != errorCodes.LOADING) {
if (this.newQueryButton) {
this.showUnknownFilters = true;
}
}
return filters;
return this.selectedFilters;
}
private clearKeywords() {
@ -382,6 +376,7 @@ export class NewSearchPageComponent {
private removeFilter(value: Value, filter: Filter) {
filter.countSelectedValues--;
this.selectedFilters--;
if (value.selected == true) {
value.selected = false;
}
@ -543,7 +538,7 @@ console.log(params);
var countvalues = 0;
var fq = "";
let filterOp: string = this.searchFieldsHelper.getFieldOperator(filterId);
console.info(filterId, filterOp);
// console.info(filterId, filterOp);
for (let value of values) {
countvalues++;
var paramId = this.fieldIdsMap[filterId].param;
@ -695,5 +690,56 @@ console.log(params);
return params + allLimits;
}
getEmptyRefineFilters(URLparams) {
let fields = new SearchFields();
let filters: Filter[] = [];
for (let i = 0; i < this.refineFields.length; i++) {
let filterId = this.refineFields[i];
if (URLparams[filterId] != undefined) {
let filter = new Filter();
filter.title = fields.getFieldName(filterId, "publication");
filter.filterId = filterId;
filter.originalFilterId = filterId;
filter.values = [];
let values = StringUtils.URIDecode(URLparams[filterId]).split(/,(?=(?:[^\"]*\"[^\"]*\")*[^\"]*$)/, -1);
for (let value of values) {
let v: Value = new Value();
v.name = RefineResultsUtils.keepPartAfterCharacters(StringUtils.unquote(value), "||");
v.id = StringUtils.unquote(value);
v.selected = true;
filter.values.push(v);
// console.log(v)
filter.countSelectedValues++;
}
filters.push(filter)
}
}
// console.log("Empty Filters");
// console.log(filters);
return filters;
}
/**
* Checks if query has no results, display Filters from URL parameters
* Mark checked the selected filters
* Count the checked
* @param filters
*/
public prepareFiltersToShow(filters:Filter[]):Filter[]{
if (this.unknownFilters.length > 0 && this.searchUtils.totalResults == 0) {
this.showUnknownFilters = true;
this.filters = this.unknownFilters;
} else if (this.searchUtils.totalResults != 0 ) {
this.showUnknownFilters = false;
this.filters = filters;
}
this.checkSelectedFilters(this.filters);
this.countSelectedFilters(this.filters);
return this.filters;
}
}

View File

@ -63,4 +63,10 @@ export class RefineResultsUtils {
}
return field.name;
}
public static keepPartAfterCharacters(name, characters):string {
if( name.indexOf(characters) !=-1){
return name.split(characters)[1];
}
return name;
}
}