diff --git a/searchPages/searchDataProviders.component.ts b/searchPages/searchDataProviders.component.ts index fcec42c9..7f698b42 100644 --- a/searchPages/searchDataProviders.component.ts +++ b/searchPages/searchDataProviders.component.ts @@ -11,12 +11,13 @@ import {EnvProperties} from '../utils/properties/env-properties'; import {NewSearchPageComponent, SearchForm} from "./searchUtils/newSearchPage.component"; import {DatasourcesHelperClass} from "./searchUtils/datasourcesHelper.class"; import {properties} from "../../../environments/environment"; +import {RefineResultsUtils} from "../services/servicesUtils/refineResults.class"; +import {RefineFieldResultsService} from "../services/refineFieldResults.service"; @Component({ selector: 'search-dataproviders', template: ` - { this.filters = this.searchPage.prepareFiltersToShow([], 0); + this.staticFilters = this.searchPage.prepareStaticFiltersToShow(); this.handleError("Error getting refine filters for "+OpenaireEntities.DATASOURCES+": ", err); this.searchUtils.refineStatus = this.errorMessages.getErrorCode(err.status); @@ -196,6 +212,7 @@ export class SearchDataProvidersComponent { public filtersReturned(refine: boolean, filters: Filter[], totalResults, page: number) { if (refine) { this.filters = this.searchPage.prepareFiltersToShow(filters, totalResults); + this.staticFilters = this.searchPage.prepareStaticFiltersToShow(); } this.searchUtils.refineStatus = this.errorCodes.DONE; if(totalResults == 0) { @@ -279,7 +296,7 @@ export class SearchDataProvidersComponent { this.searchUtils.totalResults = totalResults; this.results = results; if(!refine) { - this.searchPage.buildPageURLParameters(this.filters, [], false); + this.searchPage.buildPageURLParameters(this.filters, [], this.staticFilters, false); } this.searchPage.hideFilters = false; diff --git a/searchPages/searchOrganizations.component.ts b/searchPages/searchOrganizations.component.ts index 54eeff07..fdd49fea 100644 --- a/searchPages/searchOrganizations.component.ts +++ b/searchPages/searchOrganizations.component.ts @@ -127,7 +127,7 @@ export class SearchOrganizationsComponent { // this.searchPage.fieldIdsMap = this.fieldIdsMap; // this.searchPage.customFilter = this.customFilter; // this.searchPage.getSelectedFiltersFromUrl(params); - this.searchPage.prepareSearchPage(this.fieldIds, this.selectedFields, this.refineFields, [], this.fieldIdsMap,this.customFilter,params, "organization"); + this.searchPage.prepareSearchPage(this.fieldIds, this.selectedFields, this.refineFields, [], [], this.fieldIdsMap,this.customFilter,params, "organization"); if(refine) { this._getFilters(this.searchPage.getSearchAPIQueryForAdvancedSearhFields(), this.searchUtils.page, 0, true, this.searchPage.getSearchAPIQueryForRefineFields(params, firstLoad)); } else { @@ -271,7 +271,7 @@ export class SearchOrganizationsComponent { this.searchUtils.totalResults = totalResults; this.results = results; if(!refine) { - this.searchPage.buildPageURLParameters(this.filters, [], false); + this.searchPage.buildPageURLParameters(this.filters, [], [], false); } this.searchPage.hideFilters = false; diff --git a/searchPages/searchProjects.component.ts b/searchPages/searchProjects.component.ts index 1ebae061..60429713 100644 --- a/searchPages/searchProjects.component.ts +++ b/searchPages/searchProjects.component.ts @@ -128,7 +128,7 @@ export class SearchProjectsComponent { this.searchPage.fieldIds = this.fieldIds; this.selectedFields = []; - this.searchPage.prepareSearchPage(this.fieldIds, this.selectedFields, this.refineFields, this.rangeFields, this.fieldIdsMap, this.customFilter, params, "project"); + this.searchPage.prepareSearchPage(this.fieldIds, this.selectedFields, this.refineFields, this.rangeFields, [], this.fieldIdsMap, this.customFilter, params, "project"); if (refine) { this._getFilters(this.searchPage.getSearchAPIQueryForAdvancedSearhFields(), this.searchUtils.page, 0, "", true, this.searchPage.getSearchAPIQueryForRangeFields(params) + this.searchPage.getSearchAPIQueryForRefineFields(params, firstLoad)); } else { @@ -297,7 +297,7 @@ export class SearchProjectsComponent { this.searchUtils.totalResults = totalResults; this.results = results; if (!refine) { - this.searchPage.buildPageURLParameters(this.filters, this.rangeFilters, false); + this.searchPage.buildPageURLParameters(this.filters, this.rangeFilters, [], false); } this.searchPage.hideFilters = false; diff --git a/searchPages/searchResearchResults.component.ts b/searchPages/searchResearchResults.component.ts index f4f03fa7..5da5794b 100644 --- a/searchPages/searchResearchResults.component.ts +++ b/searchPages/searchResearchResults.component.ts @@ -12,6 +12,8 @@ import {RangeFilter} from "../utils/rangeFilter/rangeFilterHelperClasses.class"; import {properties} from "../../../environments/environment"; import {ContextsService} from "../claims/claim-utils/service/contexts.service"; import {StringUtils} from "../utils/string-utils.class"; +import {RefineResultsUtils} from "../services/servicesUtils/refineResults.class"; +import {RefineFieldResultsService} from "../services/refineFieldResults.service"; @Component({ selector: 'search-research-results', @@ -24,6 +26,8 @@ import {StringUtils} from "../utils/string-utils.class"; [searchUtils]="searchUtils" [sortedByChanged]="searchUtils.sortBy" [fieldIds]="fieldIds" [fieldIdsMap]="fieldIdsMap" [selectedFields]="selectedFields" + [staticFields]="staticFields" [staticFilters]="staticFilters" + [staticFieldValues]="staticFieldValues" [csvParams]="csvParams" [csvPath]="getEntityFileName(resultType)" [simpleSearchLink]="simpleSearchLink" [advancedSearchLink]="advancedSearchLink" [disableForms]="disableForms" @@ -64,6 +68,12 @@ export class SearchResearchResultsComponent { public fieldIdsMap = this.searchFields.RESULT_FIELDS; public rangeFields: string[][] = this.searchFields.RESULT_RANGE_FIELDS; public selectedFields: AdvancedField[] = []; + + public staticFields: string[] = this.searchFields.RESULT_STATIC_FIELDS; + public staticFieldValues = this.searchFields.RESULT_STATIC_FIELD_VALUES; + public staticFilters = RefineResultsUtils.parse(this.staticFieldValues, this.staticFields, this.resultType, "search", true); + // public orderedFilters; + public resourcesQuery = "((oaftype exact result) and (resulttypeid exact " + this.resultType + "))"; public csvParams: string; public disableForms: boolean = false; @@ -101,9 +111,13 @@ export class SearchResearchResultsComponent { @Input() orcidQuery: string = ""; @Input() identifiers: string[] = []; + private refineQuery: string = ""; + constructor(private route: ActivatedRoute, private _router: Router, private _searchResearchResultsService: SearchResearchResultsService, - private _contextService: ContextsService) { + private _refineFieldsResultsService: RefineFieldResultsService, + private _contextService: ContextsService, + private cdr: ChangeDetectorRef) { this.results = []; this.errorCodes = new ErrorCodes(); this.errorMessages = new ErrorMessagesComponent(); @@ -166,8 +180,7 @@ export class SearchResearchResultsComponent { this.searchUtils.sortBy = ""; } this.selectedFields = []; - - this.searchPage.prepareSearchPage(this.fieldIds, this.selectedFields, this.refineFields, this.rangeFields, this.fieldIdsMap,this.customFilter,params, this.resultType, this.quickFilter); + this.searchPage.prepareSearchPage(this.fieldIds, this.selectedFields, this.refineFields, this.rangeFields, this.staticFields, this.fieldIdsMap,this.customFilter,params, this.resultType, this.quickFilter); if(refine) { this._getFilters(this.searchPage.getSearchAPIQueryForAdvancedSearhFields(), this.searchUtils.page, 0, "", true, this.searchPage.getSearchAPIQueryForRangeFields(params)+this.searchPage.getSearchAPIQueryForRefineFields(params, firstLoad)); } else { @@ -226,7 +239,7 @@ export class SearchResearchResultsComponent { this.searchUtils.refineStatus = this.errorCodes.LOADING; this.disableRefineForms = true; this.searchPageUpdates.emit({disableForms: this.disableForms, disableRefineForms: this.disableRefineForms, searchUtils: this.searchUtils}); - this.searchFiltersSub = this._searchResearchResultsService.advancedSearchResults(this.resultType, parameters, page, size, sortBy, this.properties, (refine) ? this.searchPage.getRefineFieldsQuery() : null, this.searchPage.getFields(), refineFieldsFilterQuery) + this.searchFiltersSub = this._searchResearchResultsService.advancedSearchResults(this.resultType, parameters, page, size, sortBy, this.properties, (refine) ? this.searchPage.getRefineFieldsQuery() : null, this.searchPage.getFields(), refineFieldsFilterQuery, true) // this.subs.push(this._searchResearchResultsService.advancedSearchResults(this.resultType, parameters, page, size, sortBy, this.properties, (refine) ? this.searchPage.getRefineFieldsQuery() : null, this.searchPage.getFields(), refineFieldsFilterQuery) //.switchMap( .subscribe( @@ -248,6 +261,7 @@ export class SearchResearchResultsComponent { err => { this.filters = this.searchPage.prepareFiltersToShow([], 0); this.rangeFilters = this.searchPage.prepareRangeFiltersToShow(); + this.staticFilters = this.searchPage.prepareStaticFiltersToShow(); this.handleError("Error getting refine filters for " + this.getEntityName(this.resultType, true, true), err); this.searchUtils.refineStatus = this.errorMessages.getErrorCode(err.status); @@ -292,6 +306,45 @@ export class SearchResearchResultsComponent { if (refine) { this.filters = this.searchPage.prepareFiltersToShow(filters, totalResults); this.rangeFilters = this.searchPage.prepareRangeFiltersToShow(); + this.staticFilters = this.searchPage.prepareStaticFiltersToShow(); + + // if(this.orderedFields) { + // this.orderedFilters = []; + // for(let group of this.orderedFields) { + // if (group.type == "refine") { + // let groupedFilters = {title: group.title, values: []}; + // for (let field of group.values) { + // let index = this.filters.findIndex(filter => filter.filterId == field); + // if (index > -1) { + // groupedFilters.values.push(this.filters[index]); + // } + // } + // if (groupedFilters.values.length > 0) { + // this.orderedFilters.push(groupedFilters); + // } + // } else if (group.type == "range") { + // let groupedFilters = {title: group.title, values: []}; + // let from = group.values[0]; + // let to = group.values[1]; + // let index = this.rangeFilters.findIndex(filter => filter.originalFilterIdFrom == from && filter.originalFilterIdTo == to); + // if (index > -1) { + // groupedFilters.values.push(this.rangeFilters[index]); + // this.orderedFilters.push(groupedFilters); + // } + // } else if (group.type == "static") { + // let groupedFilters = {title: group.title, values: []}; + // for (let field of group.values) { + // let index = this.staticFilters.findIndex(filter => filter.filterId == field); + // if (index > -1) { + // groupedFilters.values.push(this.staticFilters[index]); + // } + // } + // if (groupedFilters.values.length > 0) { + // this.orderedFilters.push(groupedFilters); + // } + // } + // } + // } } this.searchUtils.refineStatus = this.errorCodes.DONE; @@ -399,7 +452,7 @@ export class SearchResearchResultsComponent { this.searchUtils.totalResults = totalResults; this.results = results; if(!refine) { - this.searchPage.buildPageURLParameters(this.filters, this.rangeFilters, false); + this.searchPage.buildPageURLParameters(this.filters, this.rangeFilters, this.staticFilters, false); } this.searchPage.hideFilters = false; diff --git a/searchPages/searchUtils/advancedSearchForm.component.html b/searchPages/searchUtils/advancedSearchForm.component.html index 8019c91c..92ad54ca 100644 --- a/searchPages/searchUtils/advancedSearchForm.component.html +++ b/searchPages/searchUtils/advancedSearchForm.component.html @@ -59,8 +59,9 @@ (listUpdated)="listUpdated($event,selectedField.id)" [id]="'autocomplete-'+i"> - + + + + +
  • + + + {{filter.title}}: + {{value.name=='true'?'Yes':'No'}} + + + {{value.name}} + + + +
  • +
    +
    +
    @@ -72,7 +94,7 @@ - +

    Filters

    - Clear All @@ -198,6 +220,7 @@
    0) { - filterURL += ((filterURL.length == 0) ? '?' : '&') + this.resultTypes.filterId + "="; - let filterName = this.resultTypes.title + " "; - for (let value of this.resultTypes.values) { - if (value.selected) { - filterArray.push(filterName + '"' + value.name + '"'); - filtervalues.push(value.name); - filterURL += ((filterName.length == 0) ? ',' : '') + StringUtils.URIEncode('"' + value.id + '"'); - filterName = ""; + // if (this.resultTypes && this.resultTypes.countSelectedValues > 0) { + // filterURL += ((filterURL.length == 0) ? '?' : '&') + this.resultTypes.filterId + "="; + // let filterName = this.resultTypes.title + " "; + // for (let value of this.resultTypes.values) { + // if (value.selected) { + // filterArray.push(filterName + '"' + value.name + '"'); + // filtervalues.push(value.name); + // filterURL += ((filterName.length == 0) ? ',' : '') + StringUtils.URIEncode('"' + value.id + '"'); + // filterName = ""; + // } + // } + // } + for (let filter of this.staticFilters) { + if (filter.countSelectedValues > 0) { + filterURL += ((filterURL.length == 0) ? '?' : '&') + filter.filterId + "="; + let filterName = filter.title + " "; + for (let value of filter.values) { + if (value.selected) { + filterArray.push(filterName + '"' + value.name + '"'); + filtervalues.push(value.name); + filterURL += ((filterName.length == 0) ? ',' : '') + StringUtils.URIEncode('"' + StringUtils.URIEncode(value.id) + '"'); + filterName = ""; + + } } } } @@ -328,9 +349,19 @@ export class NewSearchPageComponent implements OnInit, OnDestroy, OnChanges { // if (this.quickFilter) { // this.removeValueFromQuickFilter(); // } - if (this.resultTypes) { - this.resultTypes.values = []; + for (var i = 0; i < this.staticFilters.length; i++) { + for (var j = 0; j < this.staticFilters[i].countSelectedValues; j++) { + if (this.staticFilters[i].values[j].selected) { + this.staticFilters[i].values[j].selected = false; + } + this.staticFilters[i].countSelectedValues = 0; + this.staticFilters[i].radioValue = ""; + } } + this.selectedStaticFilters = 0; + // if (this.resultTypes) { + // this.resultTypes.values = []; + // } this.goTo(1); // this.clearKeywords(); } @@ -341,7 +372,7 @@ export class NewSearchPageComponent implements OnInit, OnDestroy, OnChanges { } this.searchUtils.page = page; - this.buildPageURLParameters(this.filters, this.rangeFilters, true); + this.buildPageURLParameters(this.filters, this.rangeFilters, this.staticFilters, true); this.router.navigate([this.searchUtils.baseUrl], {queryParams: this.routerHelper.createQueryParams(this.parameterNames, this.parameterValues)}); if (scroll) { HelperFunctions.scrollToId("searchForm"); @@ -427,7 +458,9 @@ export class NewSearchPageComponent implements OnInit, OnDestroy, OnChanges { //if filter is not marked as hidden OR it is hidden but it is dependent to a field that it IS selected if (this.searchFieldsHelper.HIDDEN_FIELDS.indexOf(this.refineFields[i]) == -1 || (selected_filters.indexOf(dependentTo) != -1) || (selected_filters.indexOf(this.refineFields[i]) != -1) - || (this.resultTypes && this.resultTypes.filterId == dependentTo && this.resultTypes.countSelectedValues > 0)) { + || (this.resultTypes && this.resultTypes.filterId == dependentTo && this.resultTypes.countSelectedValues > 0) + // || (this.resultAccesses && this.resultAccesses.filterId == dependentTo && this.resultAccesses.countSelectedValues > 0) + ) { fields.push(this.refineFields[i]); } } @@ -568,6 +601,35 @@ export class NewSearchPageComponent implements OnInit, OnDestroy, OnChanges { } return this.rangeFilters; } + + public checkSelectedStaticFilters(filters: Filter[]) { + for (var i = 0; i < filters.length; i++) { + var filter: Filter = filters[i]; + filter.countSelectedValues = 0; + if (this.parameterNames.indexOf(filter.filterId) != -1) { + let values = (decodeURIComponent(this.parameterValues[this.parameterNames.indexOf(filter.filterId)])).split(/,(?=(?:[^\"]*\"[^\"]*\")*[^\"]*$)/, -1); + for (let filterValue of filter.values) { + if (values.indexOf(StringUtils.quote(filterValue.id)) > -1) { + filterValue.selected = true; + filter.countSelectedValues++; + } else { + filterValue.selected = false; + + } + } + } else { + for (let filterValue of filter.values) { + filterValue.selected = false; + } + } + } + this.filterFilterValues(this.filters); + if (!this.includeOnlyResultsAndFilter) { + this.updateMeta(this.pageTitle); + } + this.staticFilters = filters; + return filters; + } get existingFiltersWithValues() { if (this.filters.length == 0) { @@ -633,6 +695,16 @@ export class NewSearchPageComponent implements OnInit, OnDestroy, OnChanges { } return this.selectedRangeFilters; } + + public countSelectedStaticFilters(filters: Filter[]): number { + this.selectedStaticFilters = 0; + for (let filter of filters) { + if (filter.countSelectedValues > 0) { + this.selectedStaticFilters += filter.countSelectedValues; + } + } + return this.selectedStaticFilters; + } private clearKeywords() { if (this.searchUtils.keyword.length > 0) { @@ -949,6 +1021,12 @@ export class NewSearchPageComponent implements OnInit, OnDestroy, OnChanges { if (this.entityType == "service" && URLparams) { if (URLparams["type"]) { + let types1 = URLparams["type"]; + types1 = Array.isArray(types1) ? types1.join(',').split(",") : types1.split(","); + types1.map(function (t) { + return StringUtils.unquote(StringUtils.URIDecode(t)); + }); + let types = URLparams["type"]; types = Array.isArray(types) ? types.join(',').split(",") : types.split(","); types.map(function (t) { @@ -1112,6 +1190,27 @@ export class NewSearchPageComponent implements OnInit, OnDestroy, OnChanges { allFqs += fq; } } + + for (var i = 0; i < this.staticFields.length; i++) { + var filterId = this.staticFields[i]; + if (URLparams[filterId] != undefined && filterId != "type") { + let values = (StringUtils.URIDecode(StringUtils.URIDecode(URLparams[filterId]))).split(/,(?=(?:[^\"]*\"[^\"]*\")*[^\"]*$)/, -1); + var countvalues = 0; + var fq = ""; + let filterOp: string = this.searchFieldsHelper.getFieldOperator(filterId); + for (let value of values) { + if (value && value.length > 0) { + countvalues++; + fq += (fq.length > 0 ? " " + filterOp + " " : "") + filterId + " exact " + (value); + } + } + if (countvalues > 0) { + fq = "&fq=" + StringUtils.URIEncode(fq); + } + allFqs += fq; + } + } + this.customFilterEnabled = URLparams["cf"] == "true"; if (this.customFilter && (this.customFilter.isHiddenFilter || this.customFilterEnabled)) { allFqs += "&fq=" + StringUtils.URIEncode(this.customFilter.queryFieldName + " exact " + StringUtils.quote((this.customFilter.valueId))); @@ -1138,7 +1237,7 @@ export class NewSearchPageComponent implements OnInit, OnDestroy, OnChanges { types.map(function (t) { return StringUtils.unquote(StringUtils.URIDecode(t)); }); - + if (types.indexOf("publications") != -1 && types.indexOf("datasets") != -1 && types.indexOf("software") != -1 && types.indexOf("other") != -1) { allFqs += "&type=results"; } else { @@ -1347,9 +1446,10 @@ export class NewSearchPageComponent implements OnInit, OnDestroy, OnChanges { * used in paging, advanced search link, Goto() * @param filters either query filters or filters defined by the URL parameters * @param rangeFilters defined by the URL parameters + * @param staticFilters * @param includePage */ - buildPageURLParameters(filters: Filter[], rangeFilters: RangeFilter[], includePage: boolean) { + buildPageURLParameters(filters: Filter[], rangeFilters: RangeFilter[], staticFilters: Filter[], includePage: boolean) { this.parameterNames.splice(0, this.parameterNames.length); this.parameterValues.splice(0, this.parameterValues.length); for (var i = 0; i < this.selectedFields.length; i++) { @@ -1392,31 +1492,47 @@ export class NewSearchPageComponent implements OnInit, OnDestroy, OnChanges { //this.parameterValues.push(this.searchUtils.sortBy); this.parameterValues.push(this.sortedByChanged); } - if (this.resultTypes && - ( - (this.entityType == 'publication' || this.entityType == 'dataset' || this.entityType == 'software' || this.entityType == 'other' || this.entityType == "result") - || - (this.entityType == "service") - ) - ) { - let values = []; - for (let value of this.resultTypes.values) { - if (value.selected) { - values.push(value.id); + + for (let filter of staticFilters) { + var filterLimits = ""; + if (filter.countSelectedValues > 0) { + for (let value of filter.values) { + if (value.selected == true) { + filterLimits += ((filterLimits.length == 0) ? '' : ',') + '"' + StringUtils.URIEncode(value.id) + '"'; + } + } + if (filterLimits.length > 0) { + this.parameterNames.push(filter.filterId); + this.parameterValues.push(filterLimits); } } - this.selectedTypesNum = 0; - if (values.length > 0 && values.length != 4) { - this.parameterNames.push("type"); - this.parameterValues.push(values.join(",")); - this.selectedTypesNum = values.length; - } - // - /* if(this.quickFilter) { - this.parameterNames.push("qf"); - this.parameterValues.push("" + this.quickFilter.selected); - }*/ } + + // if (this.resultTypes && + // ( + // (this.entityType == 'publication' || this.entityType == 'dataset' || this.entityType == 'software' || this.entityType == 'other' || this.entityType == "result") + // || + // (this.entityType == "service") + // ) + // ) { + // let values = []; + // for (let value of this.resultTypes.values) { + // if (value.selected) { + // values.push(value.id); + // } + // } + // this.selectedTypesNum = 0; + // if (values.length > 0 && values.length != 4) { + // this.parameterNames.push("type"); + // this.parameterValues.push(values.join(",")); + // this.selectedTypesNum = values.length; + // } + // // + // /* if(this.quickFilter) { + // this.parameterNames.push("qf"); + // this.parameterValues.push("" + this.quickFilter.selected); + // }*/ + // } for (let filter of filters) { var filterLimits = ""; if (filter.countSelectedValues > 0) { @@ -1482,6 +1598,7 @@ export class NewSearchPageComponent implements OnInit, OnDestroy, OnChanges { getRefineFiltersFromURL(URLparams) { let fields = new SearchFields(); let filters: Filter[] = []; + let staticFilters: Filter[] = []; for (let i = 0; i < this.refineFields.length; i++) { let filterId = this.refineFields[i]; if (URLparams[filterId] != undefined) { @@ -1523,36 +1640,59 @@ export class NewSearchPageComponent implements OnInit, OnDestroy, OnChanges { } }*/ - let options = null; - if ((this.entityType == 'publication' || this.entityType == 'dataset' || this.entityType == 'software' || this.entityType == 'other' || this.entityType == "result")) { - options = this.resultTypeOptions; - } else if (this.entityType == "service") { - options = this.serviceTypeOptions; - } - if (options) { - this.resultTypes = {values:[],filterId:"type", countSelectedValues: 0, filterType: 'checkbox', type:'checkBox', originalFilterId: "", valueIsExact: true, title: "Type",filterOperator:"or"}; - for (let typeOption of Object.keys(options)) { - let type = typeOption; - if ( URLparams["type"] && URLparams["type"].indexOf(type)==-1 || !URLparams["type"]) { - this.resultTypes.values.push({ - name: options[StringUtils.unquote(type)].name, - id: StringUtils.unquote(type), - selected: false, - number: 0 - }); - }else{ - this.resultTypes.values.push({ - name: options[StringUtils.unquote(type)].name, - id: StringUtils.unquote(type), - selected: true, - number: 0 - }); - this.resultTypes.countSelectedValues++; + for (let i = 0; i < this.staticFields.length; i++) { + let filterId = this.staticFields[i]; + if (URLparams[filterId] != undefined) { + let filter = new Filter(); + filter.title = fields.getFieldName(filterId, this.entityType); + 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.name = (v.name.indexOf("::") != -1) ? v.name.substring(v.name.indexOf("::") + 2).split("::").join("|") : v.name; // for funding streams + v.id = StringUtils.unquote(value); + v.selected = true; + filter.values.push(v); + filter.countSelectedValues++; } + staticFilters.push(filter) } } + + // let options = null; + // if ((this.entityType == 'publication' || this.entityType == 'dataset' || this.entityType == 'software' || this.entityType == 'other' || this.entityType == "result")) { + // options = this.resultTypeOptions; + // } else if (this.entityType == "service") { + // options = this.serviceTypeOptions; + // } + // if (options) { + // this.resultTypes = {values:[],filterId:"type", countSelectedValues: 0, filterType: 'checkbox', type:'checkBox', originalFilterId: "", valueIsExact: true, title: "Type",filterOperator:"or"}; + // for (let typeOption of Object.keys(options)) { + // let type = typeOption; + // if ( URLparams["type"] && URLparams["type"].indexOf(type)==-1 || !URLparams["type"]) { + // this.resultTypes.values.push({ + // name: options[StringUtils.unquote(type)].name, + // id: StringUtils.unquote(type), + // selected: false, + // number: 0 + // }); + // }else{ + // this.resultTypes.values.push({ + // name: options[StringUtils.unquote(type)].name, + // id: StringUtils.unquote(type), + // selected: true, + // number: 0 + // }); + // this.resultTypes.countSelectedValues++; + // } + // } + // } this.URLCreatedFilters = filters; + this.URLCreatedStaticFilters = staticFilters; } /** @@ -1641,7 +1781,7 @@ export class NewSearchPageComponent implements OnInit, OnDestroy, OnChanges { this.filters = filters; } - this.buildPageURLParameters(this.URLCreatedFilters, this.URLCreatedRangeFilters, true); + this.buildPageURLParameters(this.URLCreatedFilters, this.URLCreatedRangeFilters, this.URLCreatedStaticFilters, true); //this.checkSelectedRangeFilters(this.rangeFilters); this.checkSelectedFilters(this.filters); @@ -1662,6 +1802,15 @@ export class NewSearchPageComponent implements OnInit, OnDestroy, OnChanges { this.countSelectedRangeFilters(this.rangeFilters); return this.rangeFilters; } + + public prepareStaticFiltersToShow() { + this.staticFilters = RefineResultsUtils.parse(this.staticFieldValues, this.staticFields, this.entityType, "search", true); + this.checkSelectedStaticFilters(this.staticFilters); + this.countSelectedStaticFilters(this.staticFilters); + this.cdr.detectChanges(); + + return this.staticFilters; + } /** * Used to set the variables and search page, and prepare it before the getResults query @@ -1675,18 +1824,20 @@ export class NewSearchPageComponent implements OnInit, OnDestroy, OnChanges { * @param entityType * @param quickFilter */ - prepareSearchPage(fieldIds, selectedFields, refineFields, rangeFields, fieldIdsMap, customFilter, params, entityType, quickFilter = null) { + prepareSearchPage(fieldIds, selectedFields, refineFields, rangeFields, staticFields, fieldIdsMap, customFilter, params, entityType, quickFilter = null) { // console.log(this.refineFields); this.entityType = entityType; this.fieldIds = fieldIds; this.selectedFields = selectedFields; this.refineFields = refineFields; this.rangeFields = rangeFields; + this.staticFields = staticFields; this.fieldIdsMap = fieldIdsMap; this.customFilter = customFilter; this.quickFilter = quickFilter; this.getRangeFiltersFromURL(params); this.getRefineFiltersFromURL(params); + // this.cdr.detectChanges(); this.createAdvancedSearchSelectedFiltersFromURLParameters(params); this.searchTerm = ''; if(params && params['fv0'] && params['f0'] && params['f0'] == 'q'){ @@ -1697,7 +1848,7 @@ export class NewSearchPageComponent implements OnInit, OnDestroy, OnChanges { this.advancedSearchTerms = Object.keys(params).filter(key => key.includes('fv')).length; } } - + removeResultType(type) { for (let value of this.resultTypes.values) { if (type == value.id && value.selected) { diff --git a/utils/properties/searchFields.base.ts b/utils/properties/searchFields.base.ts index 12601615..6c183db7 100644 --- a/utils/properties/searchFields.base.ts +++ b/utils/properties/searchFields.base.ts @@ -7,6 +7,8 @@ export class SearchFieldsBase { //RESULTS //Used for datasets and publications and software and orp //In case Datasets or Software should display different fields, use seperate tables for fields + public RESULT_STATIC_FIELDS = ["resultbestaccessright", "type"]; + // "resultacceptanceyear", public RESULT_RANGE_FIELDS = [ ["resultacceptanceyear", "resultacceptanceyear"] @@ -14,7 +16,7 @@ export class SearchFieldsBase { // Remove Collected From Filter "collectedfrom","collectedfrom" public RESULT_REFINE_FIELDS = [ - "resultbestaccessright", "instancetypename", properties.environment!='production'?"foslabel":'fos', "relfunder", + "instancetypename", properties.environment!='production'?"foslabel":'fos', "relfunder", "relfundinglevel0_id", "relfundinglevel1_id", "relfundinglevel2_id", "relproject", "sdg", "country", "resultlanguagename", "resulthostingdatasource", "community"]; @@ -203,11 +205,11 @@ export class SearchFieldsBase { }, ["resultbestaccessright"]: { name: "Access", - type: "vocabulary", + type: "static", param: "access", operator: "ac", equalityOperator: " exact ", - filterType: "radio" + filterType: "checkbox" }, ["collectedfrom"]: { name: "Collected From", @@ -272,9 +274,33 @@ export class SearchFieldsBase { operator: "fl", equalityOperator: " exact ", filterType: "checkbox" + }, + ["type"]: { + name: "Type", + type: "static", + param: "type", + operator: "tp", + equalityOperator: " = ", + filterType: "checkbox" } }; + public RESULT_STATIC_FIELD_VALUES: { [key: string]: {"name": string, "id": string, "count": string}[] } = { + ["resultbestaccessright"]: [ + { name: "Open Access", id: "Open Access", count: "0" }, + { name: "Closed Access", id: "Closed Access", count: "0" }, + { name: "Restricted", id: "Restricted", count: "0" }, + { name: "Open Source", id: "Open Source", count: "0" }, + { name: "Embargo", id: "Embargo", count: "0" } + ], + ["type"]: [ + { name: OpenaireEntities.PUBLICATIONS, id: "publications", count: "0" }, + { name: OpenaireEntities.DATASETS, id: "datasets", count: "0" }, + { name: OpenaireEntities.SOFTWARE, id: "software", count: "0" }, + { name: OpenaireEntities.OTHER, id: "other", count: "0" } + ] + }; + //PROJECT public PROJECT_RANGE_FIELDS = [ ["projectendyear", "projectstartyear"] @@ -436,6 +462,8 @@ export class SearchFieldsBase { }; //DATAPROVIDERS + public DATASOURCE_STATIC_FIELDS = ["eosctype"]; + // add Collected From Filter "collectedfromname" public DATASOURCE_REFINE_FIELDS: string[] = ["eoscdatasourcetype", "datasourceodlanguages", "datasourceodcontenttypes", "datasourcecompatibilityname", "country", "collectedfromname", "datasourcethematic", @@ -582,9 +610,24 @@ export class SearchFieldsBase { equalityOperator: " exact ", filterType: "checkbox" }, - ["pid"]: {name: "PID", type: "keyword", param: "pid", operator: "pd", equalityOperator: " exact ", filterType: null} + ["pid"]: {name: "PID", type: "keyword", param: "pid", operator: "pd", equalityOperator: " exact ", filterType: null}, + ["eosctype"]: { + name: "EOSC Type", + type: "static", + param: "type", + operator: "tp", + equalityOperator: " = ", + filterType: "checkbox" + } }; + public DATASOURCE_STATIC_FIELD_VALUES: { [key: string]: {"name": string, "id": string, "count": string}[] } = { + ["eosctype"]: [ + { name: OpenaireEntities.DATASOURCES, id: "Data Source", count: "0" }, + { name: "Other "+OpenaireEntities.SERVICES, id: "Service", count: "0" }, + ] + } + public DEPOSIT_DATASOURCE_KEYWORD_FIELDS: { "name": string, "equalityOperator": string } [] = [ {"name": "relorganizationname", "equalityOperator": "="}, {"name": "relorganizationshortname", "equalityOperator": "="}, diff --git a/utils/staticAutoComplete/staticAutoComplete.component.ts b/utils/staticAutoComplete/staticAutoComplete.component.ts index 55813c50..ed9504c2 100644 --- a/utils/staticAutoComplete/staticAutoComplete.component.ts +++ b/utils/staticAutoComplete/staticAutoComplete.component.ts @@ -59,6 +59,7 @@ export class StaticAutoCompleteComponent implements OnChanges{ @Input() public selectedValue:string = ''; @Input() public vocabularyId:string ; @Input() public fieldName:string ; + @Input() public fieldValues; @Input() public entityName:string ; @Input() public fieldId:string ; @Input() properties:EnvProperties; @@ -115,21 +116,26 @@ export class StaticAutoCompleteComponent implements OnChanges{ } ); }else if(this.fieldName && this.entityName){ - this.sub = this._refineService.getRefineFieldResultsByFieldName(this.fieldName,this.entityName, this.properties).subscribe( - data => { - this.list = data; - this.afterListFetchedActions(); + if(this.fieldValues) { + this.list = this._refineService.parse(this.fieldValues, this.fieldName); + this.afterListFetchedActions(); + } else { + this.sub = this._refineService.getRefineFieldResultsByFieldName(this.fieldName, this.entityName, this.properties).subscribe( + data => { + this.list = data; + this.afterListFetchedActions(); - }, - err => { - //console.log(err); - this.handleError("Error getting results for refine field: "+this.fieldName+" for "+this.entityName, err); - this.warningMessage = "Error, couldn't fetch results..."; - this.showLoading = false; - this.afterListFetchedActions(); - } - ); - }else{ + }, + err => { + //console.log(err); + this.handleError("Error getting results for refine field: " + this.fieldName + " for " + this.entityName, err); + this.warningMessage = "Error, couldn't fetch results..."; + this.showLoading = false; + this.afterListFetchedActions(); + } + ); + } + }else{ this.showLoading = false; }