diff --git a/dmp-backend/data/src/main/java/eu/eudat/data/query/items/table/dataset/DatasetPublicTableRequest.java b/dmp-backend/data/src/main/java/eu/eudat/data/query/items/table/dataset/DatasetPublicTableRequest.java index ad438a278..27546ccae 100644 --- a/dmp-backend/data/src/main/java/eu/eudat/data/query/items/table/dataset/DatasetPublicTableRequest.java +++ b/dmp-backend/data/src/main/java/eu/eudat/data/query/items/table/dataset/DatasetPublicTableRequest.java @@ -20,6 +20,8 @@ public class DatasetPublicTableRequest extends TableQuery builder.equal(root.get("dmp").get("version"), query.subQueryMax((builder1, externalRoot, nestedRoot) -> builder1.equal(externalRoot.get("dmp").get("groupId"), nestedRoot.get("dmp").get("groupId")), Arrays.asList(new SelectionField(FieldSelectionType.COMPOSITE_FIELD, "dmp:version")), String.class))); + if (this.getCriteria().getLike() != null && !this.getCriteria().getLike().isEmpty()) + query.where((builder, root) -> builder.like(root.get("label"), "%" + this.getCriteria().getLike() + "%")); if (this.getCriteria().projects != null && !this.getCriteria().projects.isEmpty()) query.where(((builder, root) -> root.get("dmp").get("project").get("id").in(this.getCriteria().projects))); if (this.getCriteria().projectStatus != null) query diff --git a/dmp-backend/web/src/main/java/eu/eudat/logic/managers/DatasetManager.java b/dmp-backend/web/src/main/java/eu/eudat/logic/managers/DatasetManager.java index f03263954..7c1f7e03d 100644 --- a/dmp-backend/web/src/main/java/eu/eudat/logic/managers/DatasetManager.java +++ b/dmp-backend/web/src/main/java/eu/eudat/logic/managers/DatasetManager.java @@ -80,8 +80,7 @@ public class DatasetManager { public DataTableData getPaged(ApiContext apiContext, DatasetPublicTableRequest datasetTableRequest, Principal principal) throws Exception { datasetTableRequest.setQuery(apiContext.getOperationsContext().getDatabaseRepository().getDatasetDao().asQueryable().withHint(HintedModelFactory.getHint(DatasetListingModel.class))); QueryableList pagedItems = PaginationManager.applyPaging(datasetTableRequest.applyCriteria(), datasetTableRequest); - DataTableData dataTable = new DataTableData(); - + DataTableData dataTable = new DataTableData<>(); CompletableFuture> itemsFuture = pagedItems. selectAsync(item -> new DatasetListingModel().fromDataModel(item)).whenComplete((resultList, throwable) -> { diff --git a/dmp-backend/web/src/main/resources/application.properties b/dmp-backend/web/src/main/resources/application.properties index b3d677cf7..09759d640 100644 --- a/dmp-backend/web/src/main/resources/application.properties +++ b/dmp-backend/web/src/main/resources/application.properties @@ -3,7 +3,8 @@ #eu.eudat.logic.security.portmapping.https = 7444 ########################/Security######################################## server.port=8080 -server.tomcat.max-threads = 1000 +server.tomcat.max-threads = 20 +server.tomcat.max-connections = 10000 logging.file=/logs/spring-boot-logging.log ##########################Persistence########################################## database.driver-class-name=org.postgresql.Driver diff --git a/dmp-frontend/.editorconfig b/dmp-frontend/.editorconfig index 6e87a003d..2e8b0ef1b 100644 --- a/dmp-frontend/.editorconfig +++ b/dmp-frontend/.editorconfig @@ -3,8 +3,8 @@ root = true [*] charset = utf-8 -indent_style = space -indent_size = 2 +indent_style = tab +indent_size = 4 insert_final_newline = true trim_trailing_whitespace = true diff --git a/dmp-frontend/Dockerfile b/dmp-frontend/Dockerfile index fff27ccaa..a1aaa80d3 100644 --- a/dmp-frontend/Dockerfile +++ b/dmp-frontend/Dockerfile @@ -2,6 +2,7 @@ FROM johnpapa/angular-cli as angular WORKDIR /app COPY package.json /app/ RUN npm cache clear --force && npm install + COPY ./ /app/ ARG env=dev ARG aot=--no-aot diff --git a/dmp-frontend/nginx-custom.conf b/dmp-frontend/nginx-custom.conf index 4ee48806b..fdb50e93d 100644 --- a/dmp-frontend/nginx-custom.conf +++ b/dmp-frontend/nginx-custom.conf @@ -9,4 +9,8 @@ server { location /material/ { alias /usr/share/nginx/static/; } + + location /.well-known/ { + alias /usr/share/nginx/wwwcert/; + } } \ No newline at end of file diff --git a/dmp-frontend/src/app/dataset-profile-form/dataset-profile.module.ts b/dmp-frontend/src/app/dataset-profile-form/dataset-profile.module.ts index 0004728b5..6340c5746 100644 --- a/dmp-frontend/src/app/dataset-profile-form/dataset-profile.module.ts +++ b/dmp-frontend/src/app/dataset-profile-form/dataset-profile.module.ts @@ -1,9 +1,9 @@ -import { NgModule } from "@angular/core"; +import { NgModule } from '@angular/core'; import { CommonModule } from '@angular/common'; import { FormsModule, ReactiveFormsModule } from '@angular/forms'; -import { DatasetProfileRoutes } from "./dataset-profile.router"; -import { RouterModule } from "@angular/router"; +import { DatasetProfileRoutes } from './dataset-profile.router'; +import { RouterModule } from '@angular/router'; import { FormComponent } from './form/form.component'; //import { GroupFieldFormComponent } from './groupfield-form/groupfield-form.component'; @@ -12,7 +12,7 @@ import { SectionFormComponent } from './section-form/section-form.component'; import { PageFormComponent } from './page-form/page-component'; import { CompositeFieldFormComponent } from './compositefield-form/compositefield-form.component'; import { FieldFormComponent } from './field-form/field-form.component'; -import { HttpClientModule, HttpClient } from "@angular/common/http"; +import { HttpClientModule, HttpClient } from '@angular/common/http'; import { CheckBoxComponent } from '../shared/componentsAdmin/checkbox/checkbox-component'; import { FreeTextData } from '../models/DataField/FreeTextData'; @@ -23,63 +23,63 @@ import { RadioBoxComponent } from '../shared/componentsAdmin/radiobox/radiobox-c import { WordlistComponent } from '../shared/componentsAdmin/wordlist/wordlist-component'; import { AutocompleteComponent } from '../shared/componentsAdmin/autocomplete/autocomplete-component'; import { ComboboxComponent } from '../shared/componentsAdmin/combobox/combobox-component'; -import { SharedModule } from "../shared/shared.module"; -import { DatasetProfilePreviewerComponent } from "./previewer/dataset-profile-previewer.component"; -import { DynamicFormModule } from "../form/dynamic-form.module"; +import { SharedModule } from '../shared/shared.module'; +import { DatasetProfilePreviewerComponent } from './previewer/dataset-profile-previewer.component'; +import { DynamicFormModule } from '../form/dynamic-form.module'; @NgModule({ - imports: [ - CommonModule, - FormsModule, - HttpClientModule, - ReactiveFormsModule, - RouterModule, - SharedModule, - DynamicFormModule, - RouterModule.forChild(DatasetProfileRoutes) - ], + imports: [ + CommonModule, + FormsModule, + HttpClientModule, + ReactiveFormsModule, + RouterModule, + SharedModule, + DynamicFormModule, + RouterModule.forChild(DatasetProfileRoutes) + ], - declarations: [ - FormComponent, - //GroupFieldFormComponent, - RuleFormComponent, - SectionFormComponent, - PageFormComponent, - CompositeFieldFormComponent, - FieldFormComponent, - TextAreaComponent, - CheckBoxComponent, - BooleanDecisionComponent, - FreeTextComponent, - ComboboxComponent, - AutocompleteComponent, - WordlistComponent, - RadioBoxComponent, - DatasetProfilePreviewerComponent - ], + declarations: [ + FormComponent, + //GroupFieldFormComponent, + RuleFormComponent, + SectionFormComponent, + PageFormComponent, + CompositeFieldFormComponent, + FieldFormComponent, + TextAreaComponent, + CheckBoxComponent, + BooleanDecisionComponent, + FreeTextComponent, + ComboboxComponent, + AutocompleteComponent, + WordlistComponent, + RadioBoxComponent, + DatasetProfilePreviewerComponent + ], - exports: [ - FormComponent, - //GroupFieldFormComponent, - RuleFormComponent, - SectionFormComponent, - PageFormComponent, - CompositeFieldFormComponent, - FieldFormComponent, - TextAreaComponent, - CheckBoxComponent, - BooleanDecisionComponent, - FreeTextComponent, - ComboboxComponent, - AutocompleteComponent, - WordlistComponent, - RadioBoxComponent - ], - providers: [ - ], - entryComponents: [ - DatasetProfilePreviewerComponent - ] + exports: [ + FormComponent, + //GroupFieldFormComponent, + RuleFormComponent, + SectionFormComponent, + PageFormComponent, + CompositeFieldFormComponent, + FieldFormComponent, + TextAreaComponent, + CheckBoxComponent, + BooleanDecisionComponent, + FreeTextComponent, + ComboboxComponent, + AutocompleteComponent, + WordlistComponent, + RadioBoxComponent + ], + providers: [ + ], + entryComponents: [ + DatasetProfilePreviewerComponent + ] }) diff --git a/dmp-frontend/src/app/dataset-profile-form/dataset-profile.router.ts b/dmp-frontend/src/app/dataset-profile-form/dataset-profile.router.ts index e4f05656b..c63b11d83 100644 --- a/dmp-frontend/src/app/dataset-profile-form/dataset-profile.router.ts +++ b/dmp-frontend/src/app/dataset-profile-form/dataset-profile.router.ts @@ -2,13 +2,13 @@ import { RouterModule, Routes } from '@angular/router'; import { FormComponent } from 'app/dataset-profile-form/form/form.component'; export const DatasetProfileRoutes: Routes = [ - { - path: ':id', - component: FormComponent - }, - { - path: '', - component: FormComponent - } + { + path: ':id', + component: FormComponent + }, + { + path: '', + component: FormComponent + } ]; diff --git a/dmp-frontend/src/app/dataset-profile-form/rule-component/rule.component.ts b/dmp-frontend/src/app/dataset-profile-form/rule-component/rule.component.ts index 562ef914a..34980934f 100644 --- a/dmp-frontend/src/app/dataset-profile-form/rule-component/rule.component.ts +++ b/dmp-frontend/src/app/dataset-profile-form/rule-component/rule.component.ts @@ -1,18 +1,17 @@ -import { Component, Input, Output, EventEmitter } from '@angular/core'; -import { FormGroup } from '@angular/forms' -import { Rule } from 'app/models/datasetProfileAdmin/Rule' +import { Component, Input } from '@angular/core'; +import { FormGroup } from '@angular/forms'; @Component({ - selector: 'rule-form', - templateUrl: './rule.component.html', - styleUrls: ['./rule.component.scss'] + selector: 'app-rule-form', + templateUrl: './rule.component.html', + styleUrls: ['./rule.component.scss'] }) export class RuleFormComponent { -@Input() form: FormGroup; -@Input() dataModel: FormGroup; + @Input() form: FormGroup; + @Input() dataModel: FormGroup; -TargetValidation(){ -} + TargetValidation() { + } -} \ No newline at end of file +} diff --git a/dmp-frontend/src/app/datasets/dataset-public/dataset-public-listing.component.html b/dmp-frontend/src/app/datasets/dataset-public/dataset-public-listing.component.html index 8a3c7387a..4ce458ce2 100644 --- a/dmp-frontend/src/app/datasets/dataset-public/dataset-public-listing.component.html +++ b/dmp-frontend/src/app/datasets/dataset-public/dataset-public-listing.component.html @@ -1,15 +1,13 @@ -
+
+

{{'DATASET-PUBLIC-LISTING.TITLE' | translate}} {{titlePrefix}}

-
+
-
+
-

{{'DATASET-PUBLIC-LISTING.TITLE' | translate}} {{titlePrefix}}

- - diff --git a/dmp-frontend/src/app/datasets/dataset-public/dataset-public-listing.component.scss b/dmp-frontend/src/app/datasets/dataset-public/dataset-public-listing.component.scss index e69de29bb..d750ff77c 100644 --- a/dmp-frontend/src/app/datasets/dataset-public/dataset-public-listing.component.scss +++ b/dmp-frontend/src/app/datasets/dataset-public/dataset-public-listing.component.scss @@ -0,0 +1,3 @@ +text-center{ + text-align: center +} diff --git a/dmp-frontend/src/app/models/datasetprofile/DatasetProfileModel.ts b/dmp-frontend/src/app/models/datasetprofile/DatasetProfileModel.ts index 24bfee236..879045eee 100644 --- a/dmp-frontend/src/app/models/datasetprofile/DatasetProfileModel.ts +++ b/dmp-frontend/src/app/models/datasetprofile/DatasetProfileModel.ts @@ -2,7 +2,7 @@ import { BaseErrorModel } from '../error/BaseErrorModel'; import { BackendErrorValidator } from '../../utilities/validators/BackendErrorValidator'; import { FormBuilder, FormGroup, Validators } from '@angular/forms'; import { ValidationContext } from '../../utilities/validators/ValidationContext'; -import { Serializable } from "../Serializable"; +import { Serializable } from '../Serializable'; export class DatasetProfileModel implements Serializable { public id: String; @@ -29,4 +29,4 @@ export class DatasetProfileModel implements Serializable { //baseContext.validation.push({ key: 'id', validators: [Validators.required, BackendErrorValidator(this.errorModel, 'id')] }); return baseContext; } -} \ No newline at end of file +} diff --git a/dmp-frontend/src/app/models/external-sources/ExternalSourcesItemModel.ts b/dmp-frontend/src/app/models/external-sources/ExternalSourcesItemModel.ts index aec2fd4b4..0977d18cb 100644 --- a/dmp-frontend/src/app/models/external-sources/ExternalSourcesItemModel.ts +++ b/dmp-frontend/src/app/models/external-sources/ExternalSourcesItemModel.ts @@ -2,4 +2,4 @@ export interface ExternalSourcesItemModel { id: String; name: String; description: String; -} \ No newline at end of file +} diff --git a/dmp-frontend/src/app/services/breadcrumb/breadcrumb-resolver.service.ts b/dmp-frontend/src/app/services/breadcrumb/breadcrumb-resolver.service.ts index b60200afd..5913414c7 100644 --- a/dmp-frontend/src/app/services/breadcrumb/breadcrumb-resolver.service.ts +++ b/dmp-frontend/src/app/services/breadcrumb/breadcrumb-resolver.service.ts @@ -13,71 +13,71 @@ export class BreadCrumbResolverService { private parentComponents = []; private breadCrumbs: Observable = Observable.of([]); constructor( - private router: Router, - private zone: NgZone + private router: Router, + private zone: NgZone ) { } public push(component: any) { - let existingComponentIndex = this.activeComponents.map(x => x.constructor.name).indexOf(component.constructor.name); - if (existingComponentIndex !== -1) this.activeComponents.splice(existingComponentIndex, 1) - this.activeComponents.push(component); + const existingComponentIndex = this.activeComponents.map(x => x.constructor.name).indexOf(component.constructor.name); + if (existingComponentIndex !== -1) { this.activeComponents.splice(existingComponentIndex, 1); } + this.activeComponents.push(component); } public clear() { - this.activeComponents.length = 0; - this.breadCrumbs = Observable.of([]) + this.activeComponents.length = 0; + this.breadCrumbs = Observable.of([]); } public resolve(activatedRoute: ActivatedRoute): Observable { - this.breadCrumbs = Observable.of([]) - let routeComponents = this.getComponentsFromRoute(activatedRoute, []); - this.activeComponents.filter(x => routeComponents.indexOf(x.constructor.name) !== -1).forEach(x => { - if (x.hasOwnProperty('breadCrumbs')) { - let componentItems = this.resolveDependentComponents((x).breadCrumbs, []); - this.breadCrumbs = Observable.of(componentItems); - } - }) - return this.breadCrumbs; + this.breadCrumbs = Observable.of([]); + const routeComponents = this.getComponentsFromRoute(activatedRoute, []); + this.activeComponents.filter(x => routeComponents.indexOf(x.constructor.name) !== -1).forEach(x => { + if (x.hasOwnProperty('breadCrumbs')) { + const componentItems = this.resolveDependentComponents((x).breadCrumbs, []); + this.breadCrumbs = Observable.of(componentItems); + } + }); + return this.breadCrumbs; } private getComponentsFromRoute(activatedRoute: ActivatedRoute, routeComponents: any[]): any[] { - activatedRoute.children.forEach(x => { - if (x.children.length > 0) this.getComponentsFromRoute(x.children[0], routeComponents); - if (x.component) routeComponents.push(x.component['name']) - }) - if (activatedRoute.component) routeComponents.push(activatedRoute.component['name']) + activatedRoute.children.forEach(x => { + if (x.children.length > 0) { this.getComponentsFromRoute(x.children[0], routeComponents); } + if (x.component) { routeComponents.push(x.component['name']); } + }); + if (activatedRoute.component) { routeComponents.push(activatedRoute.component['name']); } - return routeComponents; + return routeComponents; } resolveDependentComponents(items: Observable, components: any[]): any[] { - items.subscribe(breadCrumbs => { - breadCrumbs.forEach(async item => { - let parentComponent = item.parentComponentName ? this.findComponent(item.parentComponentName) : null - if (parentComponent && parentComponent.hasOwnProperty('breadCrumbs')) { - components = this.pushToStart(components, this.resolveDependentComponents((parentComponent).breadCrumbs, components)) - } else if (item.notFoundResolver) { - components = this.pushToStart(components, item.notFoundResolver) - //components = this.pushToStart(components, [unresolvedComponentItems]) - } - }) - components = this.pushToEnd(components, breadCrumbs); - }) - return components + items.subscribe(breadCrumbs => { + breadCrumbs.forEach(async item => { + const parentComponent = item.parentComponentName ? this.findComponent(item.parentComponentName) : null; + if (parentComponent && parentComponent.hasOwnProperty('breadCrumbs')) { + components = this.pushToStart(components, this.resolveDependentComponents((parentComponent).breadCrumbs, components)); + } else if (item.notFoundResolver) { + components = this.pushToStart(components, item.notFoundResolver); + //components = this.pushToStart(components, [unresolvedComponentItems]) + } + }); + components = this.pushToEnd(components, breadCrumbs); + }); + return components; } private findComponent(componentName: string): any { - for (let i = 0; i < this.activeComponents.length; i++) { - if (this.activeComponents[i].constructor.name === componentName) return this.activeComponents[i]; - } - return null + for (let i = 0; i < this.activeComponents.length; i++) { + if (this.activeComponents[i].constructor.name === componentName) { return this.activeComponents[i]; } + } + return null; } pushToStart(first: any[], second: any[]) { - return [].concat(second.filter(x => first.map(firstX => firstX.label).indexOf(x.label) == -1), first); + return [].concat(second.filter(x => first.map(firstX => firstX.label).indexOf(x.label) === -1), first); } pushToEnd(first: any[], second: any[]) { - return [].concat(first, second.filter(x => first.map(firstX => firstX.label).indexOf(x.label) == -1)); + return [].concat(first, second.filter(x => first.map(firstX => firstX.label).indexOf(x.label) === -1)); } } diff --git a/dmp-frontend/src/app/services/dataset/dataset.service.ts b/dmp-frontend/src/app/services/dataset/dataset.service.ts index 5603ec152..0736bef01 100644 --- a/dmp-frontend/src/app/services/dataset/dataset.service.ts +++ b/dmp-frontend/src/app/services/dataset/dataset.service.ts @@ -22,27 +22,27 @@ export class DatasetService { constructor(private http: BaseHttpService) { - this.actionUrl = HostConfiguration.Server + 'datasets/'; + this.actionUrl = HostConfiguration.Server + 'datasets/'; - this.headers = new HttpHeaders(); - this.headers = this.headers.set('Content-Type', 'application/json'); - this.headers = this.headers.set('Accept', 'application/json'); + this.headers = new HttpHeaders(); + this.headers = this.headers.set('Content-Type', 'application/json'); + this.headers = this.headers.set('Accept', 'application/json'); } getPaged(dataTableRequest: DataTableRequest): Observable> { - return this.http.post>(this.actionUrl + 'getPaged', dataTableRequest, { headers: this.headers }); + return this.http.post>(this.actionUrl + 'getPaged', dataTableRequest, { headers: this.headers }); } getPublicPaged(dataTableRequest: DataTableRequest): Observable> { - return this.http.post>(this.actionUrl + 'public/paged', dataTableRequest, { headers: this.headers }); + return this.http.post>(this.actionUrl + 'public/paged', dataTableRequest, { headers: this.headers }); } makeDatasetPublic(id: String) { - return this.http.get(this.actionUrl + 'makepublic/' + id, { headers: this.headers }) + return this.http.get(this.actionUrl + 'makepublic/' + id, { headers: this.headers }); } getDatasetProfiles(): Observable { - return this.http.get(HostConfiguration.Server + 'datasetprofiles/getAll', { headers: this.headers }) + return this.http.get(HostConfiguration.Server + 'datasetprofiles/getAll', { headers: this.headers }); } } diff --git a/dmp-frontend/src/app/shared/components/facets/facet-search-component/facet-search-section.component.html b/dmp-frontend/src/app/shared/components/facets/facet-search-component/facet-search-section.component.html new file mode 100644 index 000000000..b0b3865db --- /dev/null +++ b/dmp-frontend/src/app/shared/components/facets/facet-search-component/facet-search-section.component.html @@ -0,0 +1,15 @@ +
+ + + +
+ + {{ option }} + cancel + + + + +

{{ displayLabel(option) }}

+
+
diff --git a/dmp-frontend/src/app/shared/components/facets/facet-search-component/facet-search-section.component.scss b/dmp-frontend/src/app/shared/components/facets/facet-search-component/facet-search-section.component.scss new file mode 100644 index 000000000..e69de29bb diff --git a/dmp-frontend/src/app/shared/components/facets/facet-search-component/facet-search-section.component.ts b/dmp-frontend/src/app/shared/components/facets/facet-search-component/facet-search-section.component.ts new file mode 100644 index 000000000..87bb31711 --- /dev/null +++ b/dmp-frontend/src/app/shared/components/facets/facet-search-component/facet-search-section.component.ts @@ -0,0 +1,71 @@ +import { Component, ViewEncapsulation, OnInit, Input, Output, ViewChild, EventEmitter } from '@angular/core'; +import { Observable } from 'rxjs/Observable'; +import { FormControl } from '@angular/forms'; +import { MatSelectionList } from '@angular/material'; + +@Component({ + selector: 'app-facet-section-component', + templateUrl: './facet-search-section.component.html', + styleUrls: ['./facet-search-section.component.scss'], + encapsulation: ViewEncapsulation.None, +}) +export class FacetSearchSectionComponent implements OnInit { + + @Input() + searchEnabled = false; + + @Input() + filterOptions: (value) => Observable; + + @Input() + options: Observable = Observable.of([]); + + @Input() + displayTitleFunc: (value) => string; + + @Input() + displayValueFunc: (value) => string; + + @Output() + selectedChanged = new EventEmitter(); + + @Output() + optionRemoved = new EventEmitter(); + + optionSearchControl = new FormControl(''); + + private selectedOptions: any[] = []; + + @ViewChild('optionsList') selectionList: MatSelectionList; + + + ngOnInit(): void { + this.optionSearchControl.valueChanges.subscribe(x => { if (this.filterOptions) { this.options = this.filterOptions(x); } }); + } + + public selectionChanged(event: any) { + this.selectedChanged.emit(event); + } + + public removeOption(project) { + const list = this.selectionList.selectedOptions.selected.map(x => x.value); + const indexOfProject = list.indexOf(project); + if (this.selectionList.selectedOptions.selected[indexOfProject]) { + this.selectionList.selectedOptions.selected[indexOfProject].selected = false; + this.selectionList.selectedOptions.selected.splice(indexOfProject, 1); + } + this.optionRemoved.emit(project); + } + + public isOptionSelected(value) { + return this.selectedOptions.indexOf(value) !== -1; + } + + displayLabel(value) { + return this.displayTitleFunc ? this.displayTitleFunc(value) : value; + } + + displayValue(value) { + return this.displayValueFunc ? this.displayValueFunc(value) : value; + } +} diff --git a/dmp-frontend/src/app/shared/components/facets/facet-search.component.html b/dmp-frontend/src/app/shared/components/facets/facet-search.component.html index 003d6b175..ec244ab85 100644 --- a/dmp-frontend/src/app/shared/components/facets/facet-search.component.html +++ b/dmp-frontend/src/app/shared/components/facets/facet-search.component.html @@ -1,35 +1,70 @@ -
- -

{{ 'FACET-SEARCH.PROJECT-STATUS.TITLE' | translate }}

- - {{ 'FACET-SEARCH.PROJECT-STATUS.OPTIONS.INACTIVE' | translate }} - - - {{ 'FACET-SEARCH.PROJECT-STATUS.OPTIONS.ACTIVE' | translate }} - -
- - -

{{ 'FACET-SEARCH.PROJECT.TITLE' | translate }}

- - {{ project.label }} - -
- - -

{{ 'FACET-SEARCH.PROFILES.TITLE' | translate }}

- - {{ profile.label }} - -
- - -

{{ 'FACET-SEARCH.DMP-ORGANISATIONS.TITLE' | translate }}

- - {{ dmpOrganisation.name }} - -
-
+ + + + + {{ 'FACET-SEARCH.PROJECT-STATUS.TITLE' | translate }} + + + + +

{{ 'FACET-SEARCH.PROJECT-STATUS.OPTIONS.INACTIVE' | translate }}

+
+ +

{{ 'FACET-SEARCH.PROJECT-STATUS.OPTIONS.ACTIVE' | translate }}

+
+
+
+ + + + {{ 'FACET-SEARCH.PROJECT.TITLE' | translate }} + + +
+ + + +
+ + {{ + project }} + cancel + + + + +

{{ project.label }}

+
+
+
+ + + + {{ 'FACET-SEARCH.PROFILES.TITLE' | translate }} + + + + +

{{ profile.label }}

+
+
+
+ + + + {{ 'FACET-SEARCH.DMP-ORGANISATIONS.TITLE' | translate }} + + +
+ + + +
+ + +

{{ dmpOrganisation.name }}

+
+
+
+
diff --git a/dmp-frontend/src/app/shared/components/facets/facet-search.component.ts b/dmp-frontend/src/app/shared/components/facets/facet-search.component.ts index a74076119..742f917cf 100644 --- a/dmp-frontend/src/app/shared/components/facets/facet-search.component.ts +++ b/dmp-frontend/src/app/shared/components/facets/facet-search.component.ts @@ -17,90 +17,142 @@ import { DatasetProfileModel } from '../../../models/datasetprofile/DatasetProfi import { RequestItem } from '../../../models/criteria/RequestItem'; import { ExternalSourcesService } from '../../../services/external-sources/external-sources.service'; import { ExternalSourcesItemModel } from '../../../models/external-sources/ExternalSourcesItemModel'; +import { FormControl } from '@angular/forms'; +import { LanguageService } from '../../../services/language/language.service'; +import { TranslateService } from '@ngx-translate/core'; @Component({ - selector: 'app-facet', - templateUrl: './facet-search.component.html', - styleUrls: ['./facet-search.component.scss'], - encapsulation: ViewEncapsulation.None, - providers: [ProjectService] + selector: 'app-facet', + templateUrl: './facet-search.component.html', + styleUrls: ['./facet-search.component.scss'], + encapsulation: ViewEncapsulation.None, + providers: [ProjectService] }) export class FacetSearchComponent implements OnInit { - @Input() - facetCriteria = new FacetSearchCriteriaModel(); - - @Output() - facetCriteriaChange = new EventEmitter(); - - ProjectStateType = ProjectStateType; - projects: Observable - profiles: Observable - dmpOrganisations: Observable - - @ViewChild("project") selectionList: MatSelectionList - - constructor( - public activatedRoute: ActivatedRoute, - public projectService: ProjectService, - public datasetProfileService: DatasetService, - public externalSourcesService: ExternalSourcesService - ) { - } - - ngOnInit() { - this.profiles = this.datasetProfileService.getDatasetProfiles() - this.selectionList.selectedOptions = new SelectionModel(false); - this.dmpOrganisations = this.externalSourcesService.searchDMPOrganizations('') - } - - public projectStatusChanged(event) { - this.facetCriteria.projectStatus = event.option.value - if (!event.option.selected) { - this.facetCriteria.projectStatus = null; - this.projects = Observable.of([]) - this.facetCriteria.projects = [] - } - if (event.option.selected) { - let projectCriteria = new ProjectCriteria() - projectCriteria.projectStateType = this.facetCriteria.projectStatus; - projectCriteria["length"] = 10; - let dataTableRequest: RequestItem = { criteria: projectCriteria }; - this.projects = this.projectService.get(dataTableRequest); - this.facetCriteria.projects = [] - } - this.facetCriteriaChange.emit(this.facetCriteria); - } - - public projectChanged(event: any) { - let eventValue = event.option.value - if (event.option.selected) this.facetCriteria.projects.push(eventValue); - if (!event.option.selected) { - var index = this.facetCriteria.projects.indexOf(eventValue); - this.facetCriteria.projects.splice(index, 1); - } - this.facetCriteriaChange.emit(this.facetCriteria); - } - - public profileChanged(event: any) { - let eventValue = event.option.value - if (event.option.selected) { - this.facetCriteria.datasetProfile.push(eventValue); - } - if (!event.option.selected) { - var index = this.facetCriteria.datasetProfile.indexOf(eventValue); - this.facetCriteria.datasetProfile.splice(index, 1); - } - this.facetCriteriaChange.emit(this.facetCriteria); - } - - public dmpOrganisationChanged(event: any) { - let eventValue = event.option.value - if (event.option.selected) this.facetCriteria.dmpOrganisations.push(eventValue); - if (!event.option.selected) { - var index = this.facetCriteria.dmpOrganisations.indexOf(eventValue); - this.facetCriteria.dmpOrganisations.splice(index, 1); - } - this.facetCriteriaChange.emit(this.facetCriteria); - } + @Input() + facetCriteria = new FacetSearchCriteriaModel(); + + @Output() + facetCriteriaChange = new EventEmitter(); + + + + + removable = true; + ProjectStateType = ProjectStateType; + projects: Observable; + profiles: Observable; + dmpOrganisations: Observable; + projectSearchControl = new FormControl(''); + organisationSearchControl = new FormControl(''); + + projectStateOptions = Observable.of( + [ + { label: this.languageService.instant('FACET-SEARCH.PROJECT-STATUS.OPTIONS.INACTIVE'), value: ProjectStateType.Finished }, + { label: this.languageService.instant('FACET-SEARCH.PROJECT-STATUS.OPTIONS.ACTIVE'), value: ProjectStateType.OnGoing }, + ]); + projectOptions: Observable; + + @ViewChild('project') projectSelectionList: MatSelectionList; + + displayProjectStateValue = (option) => option['value']; + displayProjectStateLabel = (option) => option['label']; + + displayProjectValue = (option) => option['id']; + displayProjectLabel = (option) => option['label']; + + constructor( + public activatedRoute: ActivatedRoute, + public projectService: ProjectService, + public languageService: TranslateService, + public datasetProfileService: DatasetService, + public externalSourcesService: ExternalSourcesService + ) { + } + + ngOnInit() { + this.profiles = this.datasetProfileService.getDatasetProfiles(); + this.dmpOrganisations = this.externalSourcesService.searchDMPOrganizations(''); + this.projectSearchControl.valueChanges.subscribe(x => this.projectSearch(x)); + this.organisationSearchControl.valueChanges.subscribe(x => this.dmpOrganisationSearch(x)); + } + + public projectStatusChanged(event) { + this.facetCriteria.projectStatus = event.option.value; + if (!event.option.selected) { + this.facetCriteria.projectStatus = null; + this.projects = Observable.of([]); + this.facetCriteria.projects = []; + } + if (event.option.selected) { + const projectCriteria = new ProjectCriteria(); + projectCriteria.projectStateType = this.facetCriteria.projectStatus; + projectCriteria['length'] = 10; + const dataTableRequest: RequestItem = { criteria: projectCriteria }; + this.projects = this.projectService.get(dataTableRequest); + this.facetCriteria.projects = []; + } + this.facetCriteriaChange.emit(this.facetCriteria); + } + + public projectChanged(event: any) { + const eventValue = event.option.value; + if (event.option.selected) { this.facetCriteria.projects.push(eventValue); } + if (!event.option.selected) { + const index = this.facetCriteria.projects.indexOf(eventValue); + this.facetCriteria.projects.splice(index, 1); + } + this.facetCriteriaChange.emit(this.facetCriteria); + } + + removeProject(project) { + const list = this.projectSelectionList.selectedOptions.selected.map(x => x.value); + const indexOfProject = list.indexOf(project); + if (this.projectSelectionList.selectedOptions.selected[indexOfProject]) { + this.projectSelectionList.selectedOptions.selected[indexOfProject].selected = false; + this.projectSelectionList.selectedOptions.selected.splice(indexOfProject, 1); + } + this.facetCriteria.projects.splice(this.facetCriteria.projects.indexOf(project), 1); + this.facetCriteriaChange.emit(this.facetCriteria); + } + + public profileChanged(event: any) { + const eventValue = event.option.value; + if (event.option.selected) { + this.facetCriteria.datasetProfile.push(eventValue); + } + if (!event.option.selected) { + const index = this.facetCriteria.datasetProfile.indexOf(eventValue); + this.facetCriteria.datasetProfile.splice(index, 1); + } + this.facetCriteriaChange.emit(this.facetCriteria); + } + + public dmpOrganisationChanged(event: any) { + const eventValue = event.option.value; + if (event.option.selected) { this.facetCriteria.dmpOrganisations.push(eventValue); } + if (!event.option.selected) { + const index = this.facetCriteria.dmpOrganisations.indexOf(eventValue); + this.facetCriteria.dmpOrganisations.splice(index, 1); + } + this.facetCriteriaChange.emit(this.facetCriteria); + } + + public projectIsSelected(value: string) { + return this.facetCriteria.projects.indexOf(value) !== -1; + } + + public projectSearch(value: string): Observable { + const projectCriteria = new ProjectCriteria(); + projectCriteria.projectStateType = this.facetCriteria.projectStatus; + projectCriteria['length'] = 10; + projectCriteria.like = value; + const dataTableRequest: RequestItem = { criteria: projectCriteria }; + return this.projectService.get(dataTableRequest); + } + + public dmpOrganisationSearch(value: string) { + this.dmpOrganisations = this.externalSourcesService.searchDMPOrganizations(value); + } } diff --git a/dmp-frontend/src/app/shared/components/figurecard/figurecard.component.ts b/dmp-frontend/src/app/shared/components/figurecard/figurecard.component.ts index 32c325d53..7feb543cd 100644 --- a/dmp-frontend/src/app/shared/components/figurecard/figurecard.component.ts +++ b/dmp-frontend/src/app/shared/components/figurecard/figurecard.component.ts @@ -20,22 +20,22 @@ export class FigurecardComponent implements OnInit { @Input() buttonTitle: string; @Input() buttonRedirectLink: string; - constructor(private router: Router,private authService: AuthService) { } + constructor(private router: Router, private authService: AuthService) { } ngOnInit() { } navigateToUrl() { - if(!this.isAuthenticated()) return; + if (!this.isAuthenticated()) { return; } this.router.navigate([this.routelLink]); - } + } - createNew(){ - this.router.navigate([this.buttonRedirectLink]); - } + createNew() { + this.router.navigate([this.buttonRedirectLink]); + } - isAuthenticated(){ - return this.authService.current() != null; - } + isAuthenticated() { + return this.authService.current() != null; + } } diff --git a/dmp-frontend/src/app/shared/components/navigation/navigation.component.html b/dmp-frontend/src/app/shared/components/navigation/navigation.component.html index 54f85fe92..9915b4b18 100644 --- a/dmp-frontend/src/app/shared/components/navigation/navigation.component.html +++ b/dmp-frontend/src/app/shared/components/navigation/navigation.component.html @@ -1,6 +1,6 @@
{{this.languageResolver.getBy('navbar') | translate}} diff --git a/dmp-frontend/src/app/shared/components/navigation/navigation.component.scss b/dmp-frontend/src/app/shared/components/navigation/navigation.component.scss index 2be63d415..816925725 100644 --- a/dmp-frontend/src/app/shared/components/navigation/navigation.component.scss +++ b/dmp-frontend/src/app/shared/components/navigation/navigation.component.scss @@ -33,9 +33,11 @@ font-size: 14px; } -.logo { - width: 38px; - height: 38px; +.app-logo { + height: 60px; + img{ + height: inherit; + } } .user-profile{ diff --git a/dmp-frontend/src/app/shared/components/user-dialog/user-dialog.component.html b/dmp-frontend/src/app/shared/components/user-dialog/user-dialog.component.html index 375fec73b..56071b61e 100644 --- a/dmp-frontend/src/app/shared/components/user-dialog/user-dialog.component.html +++ b/dmp-frontend/src/app/shared/components/user-dialog/user-dialog.component.html @@ -14,7 +14,7 @@
-
+
{{'USER-DIALOG.EXIT' | translate}}
-

You dont need to have a registered account for OpenDMPs

+

You dont need to have a registered account for OpenDMP

diff --git a/dmp-frontend/src/assets/images/OpenDMP.png b/dmp-frontend/src/assets/images/OpenDMP.png new file mode 100644 index 000000000..6259b5813 Binary files /dev/null and b/dmp-frontend/src/assets/images/OpenDMP.png differ diff --git a/dmp-frontend/src/assets/images/openDmps.png b/dmp-frontend/src/assets/images/openDmps.png deleted file mode 100644 index 5750aa88c..000000000 Binary files a/dmp-frontend/src/assets/images/openDmps.png and /dev/null differ diff --git a/dmp-frontend/src/assets/lang/en.json b/dmp-frontend/src/assets/lang/en.json index 7b06278bc..cc1550a08 100644 --- a/dmp-frontend/src/assets/lang/en.json +++ b/dmp-frontend/src/assets/lang/en.json @@ -29,7 +29,7 @@ } }, "NAV-BAR": { - "TITLE": "OpenDMPS", + "TITLE": "OpenDMP", "PROJECTS": "Projects", "DMPS": "DMPs", "DATASETS": "Datasets", @@ -316,7 +316,7 @@ }, "HOMEPAGE": { "OPEN-DMPS": { - "STATS": "OpenDMPS DashBoard" + "STATS": "OpenDMP DashBoard" }, "MY-DMPS": { "STATS": "My DashBoard" @@ -388,13 +388,15 @@ } }, "PROJECT": { - "TITLE": "Project" + "TITLE": "Project", + "FILTER": "Filter Projects" }, "PROFILES": { "TITLE": "Dataset specification" }, "DMP-ORGANISATIONS": { - "TITLE": "DMP Organisations" + "TITLE": "DMP Organisations", + "FILTER": "Filter Organisations" } } } diff --git a/dmp-frontend/static/index.html b/dmp-frontend/static/index.html index 6adbe2c25..f61ccae56 100644 --- a/dmp-frontend/static/index.html +++ b/dmp-frontend/static/index.html @@ -19,11 +19,11 @@ - \ No newline at end of file + diff --git a/docker-compose.yml b/docker-compose.yml index 2dc0ea360..1b94552b3 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -41,6 +41,7 @@ services: container_name: dmp-frontend volumes: - ./static:/usr/share/nginx/static + - /srv/docker/wwwcert:/usr/share/nginx/wwwcert ports: ['0.0.0.0:80:80'] networks: ['stack']