From 0f6583ca4b4f11315a4db323472475d793887db9 Mon Sep 17 00:00:00 2001 From: gkolokythas Date: Fri, 3 Jan 2020 16:52:27 +0200 Subject: [PATCH] Fixes bug on "Search bar" not fetching published DMP and published Dataset Descriptions. --- .../controllers/DashBoardController.java | 5 +- .../logic/managers/DashBoardManager.java | 54 +++++++++++++------ .../dashboard/searchbar/SearchBarItem.java | 15 ++++-- .../core/model/dashboard/search-bar-item.ts | 1 + .../app/ui/misc/search/search.component.html | 2 +- .../app/ui/misc/search/search.component.ts | 48 +++++++++++++---- dmp-frontend/src/assets/i18n/en.json | 8 ++- 7 files changed, 98 insertions(+), 35 deletions(-) diff --git a/dmp-backend/web/src/main/java/eu/eudat/controllers/DashBoardController.java b/dmp-backend/web/src/main/java/eu/eudat/controllers/DashBoardController.java index 9c2dff6a1..4fb4e00ca 100644 --- a/dmp-backend/web/src/main/java/eu/eudat/controllers/DashBoardController.java +++ b/dmp-backend/web/src/main/java/eu/eudat/controllers/DashBoardController.java @@ -1,6 +1,7 @@ package eu.eudat.controllers; import eu.eudat.logic.managers.DashBoardManager; +import eu.eudat.logic.security.claims.ClaimedAuthorities; import eu.eudat.logic.services.ApiContext; import eu.eudat.models.data.dashboard.recent.RecentActivity; import eu.eudat.models.data.dashboard.searchbar.SearchBarItem; @@ -8,6 +9,7 @@ import eu.eudat.models.data.dashboard.statistics.DashBoardStatistics; import eu.eudat.models.data.helpers.responses.ResponseItem; import eu.eudat.models.data.security.Principal; import eu.eudat.types.ApiMessageCode; +import eu.eudat.types.Authorities; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; @@ -46,7 +48,8 @@ public class DashBoardController extends BaseController { } @RequestMapping(method = RequestMethod.GET, value = {"/dashboard/search"}, produces = "application/json") - public ResponseEntity>> search(@RequestParam(name = "like") String like, Principal principal) { + public ResponseEntity>> search(@RequestParam(name = "like") String like, + @ClaimedAuthorities(claims = {Authorities.ADMIN, Authorities.MANAGER, Authorities.USER, Authorities.ANONYMOUS}) Principal principal) { List searchBarItemList = dashBoardManager.searchUserData(like, principal); return ResponseEntity.status(HttpStatus.OK).body(new ResponseItem>().status(ApiMessageCode.NO_MESSAGE).payload(searchBarItemList)); } diff --git a/dmp-backend/web/src/main/java/eu/eudat/logic/managers/DashBoardManager.java b/dmp-backend/web/src/main/java/eu/eudat/logic/managers/DashBoardManager.java index ae3cd99f1..281ae0147 100644 --- a/dmp-backend/web/src/main/java/eu/eudat/logic/managers/DashBoardManager.java +++ b/dmp-backend/web/src/main/java/eu/eudat/logic/managers/DashBoardManager.java @@ -132,7 +132,6 @@ public class DashBoardManager { } public List searchUserData(String like, Principal principal) { - RecentActivity activity = new RecentActivity(); UserInfo user = new UserInfo(); user.setId(principal.getId()); DMPDao dataManagementPlanRepository = databaseRepository.getDmpDao(); @@ -141,32 +140,53 @@ public class DashBoardManager { List roles = new LinkedList<>(); List searchBarItems = new LinkedList<>(); - CompletableFuture> dmps = dataManagementPlanRepository.getAuthenticated(dataManagementPlanRepository.asQueryable(), principal.getId(), roles) - .withHint("dmpRecentActivity") + + CompletableFuture> publicDmps = dataManagementPlanRepository.asQueryable() .where((builder, root) -> builder.like(builder.upper(root.get("label")), "%" + like.toUpperCase() + "%")) .where((builder, root) -> builder.notEqual(root.get("status"), DMP.DMPStatus.DELETED.getValue())) + .where((builder, root) -> builder.equal(root.get("isPublic"), true)) .orderBy((builder, root) -> builder.desc(root.get("modified"))) - .selectAsync(item -> new SearchBarItem(item.getId().toString(), item.getLabel(), SearchBarItemType.DMP.getValue())) + .selectAsync(item -> new SearchBarItem(item.getId().toString(), item.getLabel(), SearchBarItemType.DMP.getValue(), true)) .whenComplete((dmpItems, throwable) -> searchBarItems.addAll(dmpItems)); - CompletableFuture> datasets = datasetRepository.getAuthenticated(datasetRepository.asQueryable(), user, roles) - .withHint("datasetRecentActivity") + CompletableFuture> publicDatasets = datasetRepository.asQueryable() .where((builder, root) -> builder.like(builder.upper(root.get("label")), "%" + like.toUpperCase() + "%")) - .where((builder, root) -> builder.notEqual(root.get("status"), Dataset.Status.DELETED.getValue())) - .where((builder, root) -> builder.notEqual(root.get("status"), Dataset.Status.CANCELED.getValue())) + .where((builder, root) -> builder.equal(root.get("status"), Dataset.Status.FINALISED.getValue())) + .where((builder, root) -> builder.equal(root.get("dmp").get("isPublic"), true)) .orderBy((builder, root) -> builder.desc(root.get("modified"))) - .selectAsync(item -> new SearchBarItem(item.getId().toString(), item.getLabel(), SearchBarItemType.DATASET.getValue())) + .selectAsync(item -> new SearchBarItem(item.getId().toString(), item.getLabel(), SearchBarItemType.DATASET.getValue(), true)) .whenComplete((dataSetItems, throwable) -> searchBarItems.addAll(dataSetItems)); - CompletableFuture> grants = grantRepository.getAuthenticated(grantRepository.asQueryable(), user) - .withHint("grantRecentActivity") - .where((builder, root) -> builder.like(builder.upper(root.get("label")), "%" + like.toUpperCase() + "%")) - .orderBy((builder, root) -> builder.desc(root.get("modified"))) - .selectAsync(item -> new SearchBarItem(item.getId().toString(), item.getLabel(), SearchBarItemType.GRANT.getValue())) - .whenComplete((grantItems, throwable) -> searchBarItems.addAll(grantItems)); + if (principal.getId() != null) { + CompletableFuture> dmps = dataManagementPlanRepository.getAuthenticated(dataManagementPlanRepository.asQueryable(), principal.getId(), roles) + .withHint("dmpRecentActivity") + .where((builder, root) -> builder.like(builder.upper(root.get("label")), "%" + like.toUpperCase() + "%")) + .where((builder, root) -> builder.notEqual(root.get("status"), DMP.DMPStatus.DELETED.getValue())) + .orderBy((builder, root) -> builder.desc(root.get("modified"))) + .selectAsync(item -> new SearchBarItem(item.getId().toString(), item.getLabel(), SearchBarItemType.DMP.getValue(), false)) + .whenComplete((dmpItems, throwable) -> searchBarItems.addAll(dmpItems)); + + CompletableFuture> datasets = datasetRepository.getAuthenticated(datasetRepository.asQueryable(), user, roles) + .withHint("datasetRecentActivity") + .where((builder, root) -> builder.like(builder.upper(root.get("label")), "%" + like.toUpperCase() + "%")) + .where((builder, root) -> builder.notEqual(root.get("status"), Dataset.Status.DELETED.getValue())) + .where((builder, root) -> builder.notEqual(root.get("status"), Dataset.Status.CANCELED.getValue())) + .orderBy((builder, root) -> builder.desc(root.get("modified"))) + .selectAsync(item -> new SearchBarItem(item.getId().toString(), item.getLabel(), SearchBarItemType.DATASET.getValue(), false)) + .whenComplete((dataSetItems, throwable) -> searchBarItems.addAll(dataSetItems)); + + CompletableFuture> grants = grantRepository.getAuthenticated(grantRepository.asQueryable(), user) + .withHint("grantRecentActivity") + .where((builder, root) -> builder.like(builder.upper(root.get("label")), "%" + like.toUpperCase() + "%")) + .orderBy((builder, root) -> builder.desc(root.get("modified"))) + .selectAsync(item -> new SearchBarItem(item.getId().toString(), item.getLabel(), SearchBarItemType.GRANT.getValue(), false)) + .whenComplete((grantItems, throwable) -> searchBarItems.addAll(grantItems)); + + CompletableFuture.allOf(grants, dmps, datasets, publicDmps, publicDatasets).join(); + } else { + CompletableFuture.allOf(publicDmps, publicDatasets).join(); + } - CompletableFuture.allOf(grants, dmps, datasets).join(); return searchBarItems; } - } diff --git a/dmp-backend/web/src/main/java/eu/eudat/models/data/dashboard/searchbar/SearchBarItem.java b/dmp-backend/web/src/main/java/eu/eudat/models/data/dashboard/searchbar/SearchBarItem.java index 57ada987d..a698910f9 100644 --- a/dmp-backend/web/src/main/java/eu/eudat/models/data/dashboard/searchbar/SearchBarItem.java +++ b/dmp-backend/web/src/main/java/eu/eudat/models/data/dashboard/searchbar/SearchBarItem.java @@ -1,17 +1,16 @@ package eu.eudat.models.data.dashboard.searchbar; -/** - * Created by ikalyvas on 7/26/2018. - */ public class SearchBarItem { private String id; private String label; private int type; + private boolean isPublished; - public SearchBarItem(String id, String label, int type) { + public SearchBarItem(String id, String label, int type, boolean isPublished) { this.id = id; this.label = label; this.type = type; + this.isPublished = isPublished; } public String getId() { @@ -37,4 +36,12 @@ public class SearchBarItem { public void setType(int type) { this.type = type; } + + public boolean getIsPublished() { + return isPublished; + } + + public void setPublished(boolean published) { + isPublished = published; + } } diff --git a/dmp-frontend/src/app/core/model/dashboard/search-bar-item.ts b/dmp-frontend/src/app/core/model/dashboard/search-bar-item.ts index b8e18cdde..7ee083226 100644 --- a/dmp-frontend/src/app/core/model/dashboard/search-bar-item.ts +++ b/dmp-frontend/src/app/core/model/dashboard/search-bar-item.ts @@ -4,4 +4,5 @@ export interface SearchBarItem { id: string; label: string; type: SearchBarType; + isPublished: boolean; } diff --git a/dmp-frontend/src/app/ui/misc/search/search.component.html b/dmp-frontend/src/app/ui/misc/search/search.component.html index f1f77cfa9..47230806e 100644 --- a/dmp-frontend/src/app/ui/misc/search/search.component.html +++ b/dmp-frontend/src/app/ui/misc/search/search.component.html @@ -8,7 +8,7 @@ {{ option.label }}
- {{ transformType(option.type) }} + {{ transformType(option.type, option.isPublished) }}
diff --git a/dmp-frontend/src/app/ui/misc/search/search.component.ts b/dmp-frontend/src/app/ui/misc/search/search.component.ts index 0fdad5a9a..2dd49ca75 100644 --- a/dmp-frontend/src/app/ui/misc/search/search.component.ts +++ b/dmp-frontend/src/app/ui/misc/search/search.component.ts @@ -1,5 +1,5 @@ -import {mergeMap, distinctUntilChanged, debounceTime} from 'rxjs/operators'; +import { mergeMap, distinctUntilChanged, debounceTime } from 'rxjs/operators'; import { Component, OnInit } from "@angular/core"; import { AuthService } from '../../../core/services/auth/auth.service'; import { FormControl } from "@angular/forms"; @@ -7,6 +7,7 @@ import { SearchBarService } from '../../../core/services/search-bar/search-bar.s import { Router } from '@angular/router'; import { Observable } from "rxjs"; import { SearchBarItem } from "../../../core/model/dashboard/search-bar-item"; +import { TranslateService } from "@ngx-translate/core"; export enum SearchBarType { Dataset = 0, @@ -24,12 +25,17 @@ export class SearchComponent implements OnInit { public searchControl = new FormControl(); filteredOptions: Observable; - constructor(private authentication: AuthService, private router: Router, private searchBarService: SearchBarService) {} + constructor( + private authentication: AuthService, + private router: Router, + private searchBarService: SearchBarService, + private language: TranslateService + ) { } ngOnInit() { - this.filteredOptions = this.searchControl.valueChanges.pipe(debounceTime(500),distinctUntilChanged(),mergeMap(x => { + this.filteredOptions = this.searchControl.valueChanges.pipe(debounceTime(500), distinctUntilChanged(), mergeMap(x => { return this.searchBarService.search(x); - }),); + })); } public isAuthenticated(): boolean { @@ -40,16 +46,36 @@ export class SearchComponent implements OnInit { this.search = false; this.searchControl.patchValue(null); const selectedSearchBarItem = event.option.value; - if (selectedSearchBarItem.type === SearchBarType.Dataset) { this.router.navigate(['datasets/edit/' + selectedSearchBarItem.id]); } - if (selectedSearchBarItem.type === SearchBarType.Grant) { this.router.navigate(['plans/grant/' + selectedSearchBarItem.id]); } - if (selectedSearchBarItem.type === SearchBarType.Dmp) { this.router.navigate(['plans/overview/' + selectedSearchBarItem.id]); } + if (!selectedSearchBarItem.isPublished) { + if (selectedSearchBarItem.type === SearchBarType.Dataset) { this.router.navigate(['datasets/edit/' + selectedSearchBarItem.id]); } + if (selectedSearchBarItem.type === SearchBarType.Grant) { this.router.navigate(['plans/grant/' + selectedSearchBarItem.id]); } + if (selectedSearchBarItem.type === SearchBarType.Dmp) { this.router.navigate(['plans/overview/' + selectedSearchBarItem.id]); } + } else { + if (selectedSearchBarItem.type === SearchBarType.Dataset) { this.router.navigate(['datasets/publicEdit/' + selectedSearchBarItem.id]); } + if (selectedSearchBarItem.type === SearchBarType.Dmp) { this.router.navigate(['explore-plans/overview/' + selectedSearchBarItem.id]); } + } } - transformType(type) { + transformType(type, isPublished) { + let subtitle: string; switch (type) { - case SearchBarType.Dataset: return 'Dataset'; - case SearchBarType.Dmp: return 'DMP'; - case SearchBarType.Grant: return 'Grant'; + case SearchBarType.Dataset: { + subtitle = this.language.instant('NAV-BAR.SEARCH.DATASET'); + break; + } + case SearchBarType.Dmp: { + subtitle = this.language.instant('NAV-BAR.SEARCH.DMP'); + break; + } + case SearchBarType.Grant: { + subtitle = this.language.instant('NAV-BAR.SEARCH.GRANT'); + break; + } + } + if (isPublished) { + return subtitle + " - " + this.language.instant('NAV-BAR.SEARCH.PUBLISHED') + } else { + return subtitle; } } } diff --git a/dmp-frontend/src/assets/i18n/en.json b/dmp-frontend/src/assets/i18n/en.json index 004541b29..077b38c1b 100644 --- a/dmp-frontend/src/assets/i18n/en.json +++ b/dmp-frontend/src/assets/i18n/en.json @@ -175,7 +175,13 @@ "DATASET-TEMPLATES": "DATASET TEMPLATES", "TEMPLATE": "TEMPLATE", "DMP-TEMPLATES": "DMP TEMPLATES", - "USERS-BREADCRUMB": "USERS" + "USERS-BREADCRUMB": "USERS", + "SEARCH": { + "DATASET": "Dataset Description", + "DMP": "DMP", + "GRANT": "Grant", + "PUBLISHED": "Published" + } }, "SIDE-BAR": { "GENERAL": "GENERAL",