From 7cf5ddfebedf8eecca3828230a04040adacffa03 Mon Sep 17 00:00:00 2001 From: apapachristou Date: Fri, 26 Jun 2020 12:08:51 +0300 Subject: [PATCH 001/364] Redesign of landing page, sign in interface, sidebar, navbar, dashboard (still in progress) --- dmp-frontend/src/app/app-routing.module.ts | 7 + dmp-frontend/src/app/app.component.html | 55 +- dmp-frontend/src/app/app.component.scss | 21 +- dmp-frontend/src/app/app.component.ts | 24 +- dmp-frontend/src/app/app.module.ts | 2 + .../app/ui/auth/login/login.component.html | 8 +- .../app/ui/dashboard/dashboard.component.html | 106 ++- .../app/ui/dashboard/dashboard.component.scss | 515 ++++++++++--- .../app/ui/dashboard/dashboard.component.ts | 6 + .../src/app/ui/dashboard/dashboard.module.ts | 2 + .../recent-edited-activity.component.css | 180 ++++- .../recent-edited-activity.component.html | 89 ++- .../recent-edited-activity.component.ts | 1 + .../src/app/ui/guest/guest.component.html | 344 +++++++++ .../src/app/ui/guest/guest.component.scss | 724 ++++++++++++++++++ .../src/app/ui/guest/guest.component.ts | 62 ++ dmp-frontend/src/app/ui/guest/guest.module.ts | 17 + .../src/app/ui/guest/guest.routing.ts | 16 + .../app/ui/misc/search/search.component.css | 3 +- .../src/app/ui/navbar/navbar.component.html | 133 ++-- .../src/app/ui/navbar/navbar.component.scss | 64 +- .../src/app/ui/navbar/navbar.component.ts | 54 +- .../sidebar-footer.component.css | 10 +- .../sidebar-footer.component.html | 58 +- .../sidebar-footer.component.ts | 4 + .../src/app/ui/sidebar/sidebar.component.css | 43 +- .../src/app/ui/sidebar/sidebar.component.html | 90 +-- .../src/app/ui/sidebar/sidebar.component.scss | 13 + .../src/app/ui/sidebar/sidebar.component.ts | 38 +- dmp-frontend/src/assets/css/demo.css | 325 +++++++- dmp-frontend/src/assets/i18n/en.json | 15 +- dmp-frontend/src/assets/i18n/es.json | 9 +- dmp-frontend/src/assets/i18n/gr.json | 9 +- .../images/argos-login/NoPath - Copy (2).png | Bin 0 -> 1989 bytes .../argos-login/NoPath - Copy (2)@2x.png | Bin 0 -> 4081 bytes .../images/argos-login/NoPath - Copy (4).png | Bin 0 -> 1617 bytes .../argos-login/NoPath - Copy (4)@2x.png | Bin 0 -> 3185 bytes .../images/argos-login/NoPath - Copy (5).png | Bin 0 -> 1590 bytes .../argos-login/NoPath - Copy (5)@2x.png | Bin 0 -> 3420 bytes .../images/argos-login/NoPath - Copy (6).png | Bin 0 -> 2175 bytes .../argos-login/NoPath - Copy (6)@2x.png | Bin 0 -> 4266 bytes .../images/argos-login/NoPath - Copy (7).png | Bin 0 -> 5795 bytes .../argos-login/NoPath - Copy (7)@2x.png | Bin 0 -> 14963 bytes .../images/argos-login/NoPath - Copy.png | Bin 0 -> 2075 bytes .../images/argos-login/NoPath - Copy@2x.png | Bin 0 -> 4366 bytes .../src/assets/scss/core/_responsive.scss | 9 +- .../scss/core/_sidebar-and-main-panel.scss | 10 +- .../sign-in-dialog.component.html | 63 ++ .../sign-in-dialog.component.scss | 331 ++++++++ .../sign-in-dialog.component.ts | 224 ++++++ .../sign-in-dialog/sign-in-dialog.module.ts | 14 + dmp-frontend/src/styles.scss | 225 +++--- 52 files changed, 3408 insertions(+), 515 deletions(-) create mode 100644 dmp-frontend/src/app/ui/guest/guest.component.html create mode 100644 dmp-frontend/src/app/ui/guest/guest.component.scss create mode 100644 dmp-frontend/src/app/ui/guest/guest.component.ts create mode 100644 dmp-frontend/src/app/ui/guest/guest.module.ts create mode 100644 dmp-frontend/src/app/ui/guest/guest.routing.ts create mode 100644 dmp-frontend/src/assets/images/argos-login/NoPath - Copy (2).png create mode 100644 dmp-frontend/src/assets/images/argos-login/NoPath - Copy (2)@2x.png create mode 100644 dmp-frontend/src/assets/images/argos-login/NoPath - Copy (4).png create mode 100644 dmp-frontend/src/assets/images/argos-login/NoPath - Copy (4)@2x.png create mode 100644 dmp-frontend/src/assets/images/argos-login/NoPath - Copy (5).png create mode 100644 dmp-frontend/src/assets/images/argos-login/NoPath - Copy (5)@2x.png create mode 100644 dmp-frontend/src/assets/images/argos-login/NoPath - Copy (6).png create mode 100644 dmp-frontend/src/assets/images/argos-login/NoPath - Copy (6)@2x.png create mode 100644 dmp-frontend/src/assets/images/argos-login/NoPath - Copy (7).png create mode 100644 dmp-frontend/src/assets/images/argos-login/NoPath - Copy (7)@2x.png create mode 100644 dmp-frontend/src/assets/images/argos-login/NoPath - Copy.png create mode 100644 dmp-frontend/src/assets/images/argos-login/NoPath - Copy@2x.png create mode 100644 dmp-frontend/src/common/modules/sign-in-dialog/sign-in-dialog.component.html create mode 100644 dmp-frontend/src/common/modules/sign-in-dialog/sign-in-dialog.component.scss create mode 100644 dmp-frontend/src/common/modules/sign-in-dialog/sign-in-dialog.component.ts create mode 100644 dmp-frontend/src/common/modules/sign-in-dialog/sign-in-dialog.module.ts diff --git a/dmp-frontend/src/app/app-routing.module.ts b/dmp-frontend/src/app/app-routing.module.ts index 8ceeea0a5..76fff95f3 100644 --- a/dmp-frontend/src/app/app-routing.module.ts +++ b/dmp-frontend/src/app/app-routing.module.ts @@ -154,6 +154,13 @@ const appRoutes: Routes = [ breadcrumb: true } }, + { + path: 'guest', + loadChildren: () => import('./ui/guest/guest.module').then(m => m.GuestModule), + data: { + breadcrumb: true + } + }, { path: 'splash', loadChildren: () => import('./ui/splash/splash.module').then(m => m.SplashModule), diff --git a/dmp-frontend/src/app/app.component.html b/dmp-frontend/src/app/app.component.html index 632595d63..4da74d4e8 100644 --- a/dmp-frontend/src/app/app.component.html +++ b/dmp-frontend/src/app/app.component.html @@ -1,42 +1,17 @@ -
- -
- -
- - -
-
+
+ + + + + + +
+ +
+
+
- - - - - + diff --git a/dmp-frontend/src/app/app.component.scss b/dmp-frontend/src/app/app.component.scss index 51ca45e9b..68549ddb0 100644 --- a/dmp-frontend/src/app/app.component.scss +++ b/dmp-frontend/src/app/app.component.scss @@ -6,9 +6,26 @@ width: 100%; } +// .main-container { +// margin-top: 64px; +// padding-top: 10px; +// } + .main-container { - margin-top: 64px; - padding-top: 10px; + top: 80px; + left: 0; + right: 0; +} + +.sidenav { + display: flex; + align-items: center; + justify-content: center; + width: 260px; + background: #ffffff 0% 0% no-repeat padding-box; + box-shadow: 0px 0px 16px 2px #00000029; + border-right-width: 0px; + opacity: 1; } .sidebar-shadow { diff --git a/dmp-frontend/src/app/app.component.ts b/dmp-frontend/src/app/app.component.ts index 5b777bc75..39a950841 100644 --- a/dmp-frontend/src/app/app.component.ts +++ b/dmp-frontend/src/app/app.component.ts @@ -32,7 +32,6 @@ export class AppComponent implements OnInit { sideNavOpen = false; helpContentEnabled: boolean; private statusChangeSubscription: Subscription; - onlySplash = false; constructor( private router: Router, @@ -61,18 +60,17 @@ export class AppComponent implements OnInit { } ngOnInit() { - if (this.location.path() === '') { - if (!this.configurationService.useSplash) { - this.onlySplash = false; + if (this.location.path() === '' || this.location.path() === '/home') { + if (this.isAuthenticated()) { this.router.navigate(['/reload']).then(() => this.router.navigate(['/home'])); - } else { - this.onlySplash = true; - this.router.navigate(['/reload']).then(() => this.router.navigate(['/splash'])); + } else if (!this.isAuthenticated()) { + this.router.navigate(['/reload']).then(() => this.router.navigate(['/guest'])); } - } else if (this.location.path() === '/splash') { - this.onlySplash = true; - } else { - this.onlySplash = false; + // if (!this.configurationService.useSplash) { + // this.router.navigate(['/reload']).then(() => this.router.navigate(['/home'])); + // } else { + // this.router.navigate(['/reload']).then(() => this.router.navigate(['/splash'])); + // } } if (!this.cookieService.check("cookiesConsent")) { this.cookieService.set("cookiesConsent", "false", 356); @@ -171,5 +169,9 @@ export class AppComponent implements OnInit { this.authentication.current() && this.authentication.current().culture ? this.cultureService.cultureSelected(this.authentication.current().culture) : this.cultureService.cultureSelected(this.configurationService.defaultCulture); this.authentication.current() && this.authentication.current().language ? this.language.changeLanguage(this.authentication.current().language) : this.language.changeLanguage('en'); } + + toggleNavbar(event) { + document.getElementById('hamburger').classList.toggle("change"); + } } diff --git a/dmp-frontend/src/app/app.module.ts b/dmp-frontend/src/app/app.module.ts index 556d685a1..e8ca4ec64 100644 --- a/dmp-frontend/src/app/app.module.ts +++ b/dmp-frontend/src/app/app.module.ts @@ -31,6 +31,7 @@ import { TranslateServerLoader } from './core/services/language/server.loader'; import { BaseHttpService } from './core/services/http/base-http.service'; import { ConfigurationService } from './core/services/configuration/configuration.service'; import { Oauth2DialogModule } from './ui/misc/oauth2-dialog/oauth2-dialog.module'; +import { GuestModule } from './ui/guest/guest.module'; // AoT requires an exported function for factories export function HttpLoaderFactory(http: HttpClient, appConfig: ConfigurationService) { @@ -98,6 +99,7 @@ const cookieConfig: NgcCookieConsentConfig = { DatasetCreateWizardModule, NavbarModule, SidebarModule, + GuestModule, NgcCookieConsentModule.forRoot(cookieConfig), Oauth2DialogModule ], diff --git a/dmp-frontend/src/app/ui/auth/login/login.component.html b/dmp-frontend/src/app/ui/auth/login/login.component.html index dd1c8fc9e..c3000c009 100644 --- a/dmp-frontend/src/app/ui/auth/login/login.component.html +++ b/dmp-frontend/src/app/ui/auth/login/login.component.html @@ -3,22 +3,22 @@
+
+ +
diff --git a/dmp-frontend/src/app/ui/dashboard/recent-edited-dataset-activity/recent-edited-dataset-activity.component.html b/dmp-frontend/src/app/ui/dashboard/recent-edited-dataset-activity/recent-edited-dataset-activity.component.html index 93a39c637..3d057a645 100644 --- a/dmp-frontend/src/app/ui/dashboard/recent-edited-dataset-activity/recent-edited-dataset-activity.component.html +++ b/dmp-frontend/src/app/ui/dashboard/recent-edited-dataset-activity/recent-edited-dataset-activity.component.html @@ -19,9 +19,11 @@ {{'DATASET-LISTING.COLUMNS.GRANT' | translate}}: {{activity.grant}}
-
{{'DATASET-LISTING.TOOLTIP.PART-OF' | translate}}
-
{{'DATASET-LISTING.TOOLTIP.DMP' | translate}}
-
{{'DATASET-LISTING.TOOLTIP.DMP-FOR' | translate}}: {{activity.dmp}}
+
{{'DATASET-LISTING.TOOLTIP.PART-OF' | translate}} +
{{'DATASET-LISTING.TOOLTIP.DMP' | translate}}
+
+ +
{{'DATASET-LISTING.TOOLTIP.DMP-FOR' | translate}}: {{activity.dmp}}
@@ -59,5 +61,8 @@
+
+ +
diff --git a/dmp-frontend/src/app/ui/dashboard/recent-edited-dataset-activity/recent-edited-dataset-activity.component.ts b/dmp-frontend/src/app/ui/dashboard/recent-edited-dataset-activity/recent-edited-dataset-activity.component.ts index d46264e0f..769780f85 100644 --- a/dmp-frontend/src/app/ui/dashboard/recent-edited-dataset-activity/recent-edited-dataset-activity.component.ts +++ b/dmp-frontend/src/app/ui/dashboard/recent-edited-dataset-activity/recent-edited-dataset-activity.component.ts @@ -1,4 +1,4 @@ -import { Component, OnInit } from '@angular/core'; +import { Component, OnInit, Output, EventEmitter } from '@angular/core'; import { DatasetListingModel } from '@app/core/model/dataset/dataset-listing'; import { DatasetService } from '@app/core/services/dataset/dataset.service'; import { DataTableRequest } from '@app/core/model/data-table/data-table-request'; @@ -28,7 +28,12 @@ import { DatasetStatus } from '@app/core/common/enum/dataset-status'; }) export class RecentEditedDatasetActivityComponent extends BaseComponent implements OnInit { + @Output() totalCountDatasets: EventEmitter = new EventEmitter(); + datasetActivities: DatasetListingModel[]; + totalCount: number; + startIndex: number = 4; + pageSize: number = 5; // publicMode = false; constructor( @@ -47,17 +52,33 @@ export class RecentEditedDatasetActivityComponent extends BaseComponent implemen ngOnInit() { if (this.isAuthenticated()) { const fields: Array = ["-modified"]; - const datasetDataTableRequest: DataTableRequest = new DataTableRequest(0, 5, { fields: fields }); + const datasetDataTableRequest: DataTableRequest = new DataTableRequest(0, this.pageSize, { fields: fields }); datasetDataTableRequest.criteria = new DatasetCriteria(); datasetDataTableRequest.criteria.like = ""; this.datasetService .getPaged(datasetDataTableRequest) .subscribe(response => { this.datasetActivities = response.data; + this.totalCount = response.totalCount; + this.totalCountDatasets.emit(this.totalCount); }); } } + public loadMore() { + const fields: Array = ["-modified"]; + const request = new DataTableRequest(this.startIndex, this.pageSize, { fields: fields }); + + request.criteria = new DatasetCriteria(); + request.criteria.like = ""; + + this.datasetService.getPaged(request).pipe(takeUntil(this._destroyed)).subscribe(result => { + if (!result) { return []; } + this.datasetActivities = this.datasetActivities.concat(result.data); + }); + this.startIndex = this.startIndex + this.pageSize; + } + public isAuthenticated(): boolean { return !!this.authentication.current(); } diff --git a/dmp-frontend/src/app/ui/dashboard/recent-edited-dmp-activity/recent-edited-dmp-activity.component.css b/dmp-frontend/src/app/ui/dashboard/recent-edited-dmp-activity/recent-edited-dmp-activity.component.css new file mode 100644 index 000000000..c2ce5bb3c --- /dev/null +++ b/dmp-frontend/src/app/ui/dashboard/recent-edited-dmp-activity/recent-edited-dmp-activity.component.css @@ -0,0 +1,243 @@ +.latest-activity-title { + text-align: left; + font-weight: 300; + font-family: "Roboto", sans-serif; + font-size: 1.25rem; + letter-spacing: 0px; + color: #212121; + opacity: 0.6; + padding-bottom: 1.2rem; +} + +.dmp-card, +.dataset-card { + min-width: 712px; + /* min-height: 308px; */ + background: #ffffff 0% 0% no-repeat padding-box; + box-shadow: 0px 3px 6px #0000001a; + border-radius: 4px; + opacity: 1; + margin-top: 2.43rem; + margin-bottom: 1rem; +} + +.remove-border-bottom ::ng-deep .mat-tab-header { + border-bottom: none; +} + +input[type="text"] { + background: #fafafa 0% 0% no-repeat padding-box; + border: 1px solid #d1d1d1; + border-radius: 4px; + opacity: 1; + width: 347px; + height: 56px; + font-family: Arial, FontAwesome; + padding-left: 15px; +} + +.edited-date { + text-align: left; + font-weight: 300; + font-family: "Roboto", sans-serif; + line-height: 2.4; + letter-spacing: 0px; + color: #212121; + opacity: 0.6; +} + +.dmp-label { + background: #129d99 0% 0% no-repeat padding-box; + border-radius: 4px 0px; + opacity: 1; + width: 67px; + height: 37px; + color: #ffffff; + line-height: 2.4; + opacity: 0.75; +} + +.dataset-label { + width: 158px; + height: 37px; + background: #f7dd72 0% 0% no-repeat padding-box; + border-radius: 4px 0px; + text-align: left; + line-height: 2.8; + font-size: 0.875rem; + letter-spacing: 0px; + color: #212121; + opacity: 0.75; +} + +.dmp-title, +.dataset-title { + text-align: left; + font-weight: 500; + font-family: "Roboto", sans-serif; + font-size: 1rem; + opacity: 0.81; + padding-top: 0.75rem; + padding-bottom: 0.55rem; + color: #212121; +} + +.dataset-subtitle, +.dmp-subtitle { + display: flex; + flex-direction: row; + text-align: left; + font-weight: 400; + font-family: "Roboto", sans-serif; + font-size: 0.875rem; + opacity: 1; + align-items: center; + color: #848484; +} + +.dmp-title-draft { + text-align: left; + font-weight: 500; + font-family: "Roboto", sans-serif; + font-size: 1rem; + opacity: 0.81; + padding-top: 0.75rem; + padding-bottom: 0.55rem; + color: #f16868; +} + +.icon-align { + display: inline-flex; + vertical-align: middle; + padding-bottom: 0.4rem; +} + +.dataset-card-actions, +.dmp-card-actions { + display: flex; + flex-direction: row; + border-top: 1px solid #dbdbdb; + line-height: 4; + color: #848484; +} + +.dataset-card-actions a, +.dmp-card-actions a { + color: #848484 !important; + text-decoration: none !important; +} + +.dataset-card-actions a:hover, +.dmp-card-actions a:hover { + color: #129d99 !important; +} + +.dmp-dataset-descriptions-title { + color: #000000; + opacity: 0.6; + padding-top: 1.5rem; + padding-bottom: 0.8rem; +} + +.dmp-dataset-descriptions-name { + color: #000000; + opacity: 0.6; + font-weight: 700; +} + +.show-more { + color: black !important; +} + +.show-more:hover { + color: #129d99 !important; +} + +.btn-load-more { + border: 2px solid #212121; + border-radius: 30px; + opacity: 1; + width: 132px; + height: 40px; + margin-top: 4.125rem; +} + +.btn-load-more:hover { + background-color: black; + color: white; +} + +.draft { + color: #f16868; +} + +.pointer { + cursor: pointer; +} + +/* th { + text-transform: uppercase; +} + +a { + color: #212529; +} + +.table-row { + cursor: pointer; + display: table-row; +} + +.is-public { + padding-left: 5px; + padding-right: 5px; + border: 1px solid #00b29f3b; + color: #00b29f; + background-color: #00b29f0f; + border-radius: 10em; + text-align: center; +} + +.template-name { + padding-left: 0.5em; + border: 1px solid rgb(218, 227, 243); + color: rgb(43, 104, 209); + background-color: rgb(236, 241, 249); + border-radius: 10em; + text-align: center; + max-width: 160px; + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; +} + +.chip { + padding: 0.1em 1em; + margin-bottom: 1em; + margin-left: 2.5em; + margin-right: 2.5em; + border-radius: 10em; + background-color: #0d7489; + color: #fff; + text-transform: uppercase; + text-align: center; + font-weight: 500; + max-width: 160px; + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; +} + +.mat-icon-button :hover { + color: rgb(120, 173, 220); +} + +.view-all { + margin-left: auto; + margin-bottom: 0px !important; + color: #6aa4d9; +} + +.view-all:hover { + color: rgb(46, 117, 182) !important; +} */ diff --git a/dmp-frontend/src/app/ui/dashboard/recent-edited-dmp-activity/recent-edited-dmp-activity.component.html b/dmp-frontend/src/app/ui/dashboard/recent-edited-dmp-activity/recent-edited-dmp-activity.component.html new file mode 100644 index 000000000..76973f33e --- /dev/null +++ b/dmp-frontend/src/app/ui/dashboard/recent-edited-dmp-activity/recent-edited-dmp-activity.component.html @@ -0,0 +1,208 @@ +
+
+ +
+
+
+
{{ 'DMP-LISTING.DMP' | translate }}
+
{{ 'DMP-LISTING.EDITED' | translate }}: {{ activity.modifiedTime | date: "longDate" }}
+
+
{{activity.label}}
+
+ {{ roleDisplay(activity.users) }} + . + public{{'TYPES.DMP-VISIBILITY.PUBLIC' | translate}} + done{{ enumUtils.toDmpStatusString(activity.status) }} + create{{ enumUtils.toDmpStatusString(activity.status) }} + . + {{'DMP-LISTING.VERSION' | translate}} {{activity.version}} + . + {{ 'DMP-LISTING.GRANT' | translate }}: {{activity.grant}} +
+
{{'DMP-LISTING.CONTAINED-DATASETS' | translate}}: ({{activity.datasets.length}}) +
+
+
+
{{dataset.label}},
+
{{dataset.label}}
+
+
+ {{'GENERAL.ACTIONS.SHOW-MORE' | translate}} +
+ + + + + + + + + + + + + +
+
+
+ +
+
+ + + + + + + diff --git a/dmp-frontend/src/app/ui/dashboard/recent-edited-dmp-activity/recent-edited-dmp-activity.component.ts b/dmp-frontend/src/app/ui/dashboard/recent-edited-dmp-activity/recent-edited-dmp-activity.component.ts new file mode 100644 index 000000000..7cc18c095 --- /dev/null +++ b/dmp-frontend/src/app/ui/dashboard/recent-edited-dmp-activity/recent-edited-dmp-activity.component.ts @@ -0,0 +1,328 @@ +import { Component, OnInit, Output, EventEmitter } from '@angular/core'; +import { MatDialog } from '@angular/material'; +import { Router } from '@angular/router'; +import { RecentActivityType } from '@app/core/common/enum/recent-activity-type'; +import { Principal } from '@app/core/model/auth/principal'; +import { DataTableRequest } from '@app/core/model/data-table/data-table-request'; +import { DmpListingModel } from '@app/core/model/dmp/dmp-listing'; +import { DmpCriteria } from '@app/core/query/dmp/dmp-criteria'; +import { AuthService } from '@app/core/services/auth/auth.service'; +import { DmpService } from '@app/core/services/dmp/dmp.service'; +import { SnackBarNotificationLevel, UiNotificationService } from '@app/core/services/notification/ui-notification-service'; +import { EnumUtils } from '@app/core/services/utilities/enum-utils.service'; +import { ConfirmationDialogComponent } from '@common/modules/confirmation-dialog/confirmation-dialog.component'; +import { BaseComponent } from '@common/base/base.component'; +import { TranslateService } from '@ngx-translate/core'; +import * as FileSaver from 'file-saver'; +import { takeUntil } from 'rxjs/operators'; +import { DmpInvitationDialogComponent } from '@app/ui/dmp/invitation/dmp-invitation.component'; +import { DmpStatus } from '@app/core/common/enum/dmp-status'; +import { DatasetService } from '@app/core/services/dataset/dataset.service'; +import { DatasetListingModel } from '@app/core/model/dataset/dataset-listing'; +import { Role } from '@app/core/common/enum/role'; + +@Component({ + selector: 'app-recent-edited-dmp-activity', + templateUrl: './recent-edited-dmp-activity.component.html', + styleUrls: ['./recent-edited-dmp-activity.component.css'] +}) +export class RecentEditedDmpActivityComponent extends BaseComponent implements OnInit { + + @Output() totalCountDmps: EventEmitter = new EventEmitter(); + + dmpActivities: DmpListingModel[]; + datasetActivities: DatasetListingModel[]; + // allRecentActivities: RecentActivity[] = []; + recentActivityTypeEnum = RecentActivityType; + isDraft: boolean; + + totalCount: number; + startIndex: number = 4; + pageSize: number = 5; + + constructor( + private router: Router, + public enumUtils: EnumUtils, + private authentication: AuthService, + private dmpService: DmpService, + private datasetService: DatasetService, + private language: TranslateService, + private dialog: MatDialog, + private uiNotificationService: UiNotificationService + ) { + super(); + } + + ngOnInit() { + if (this.isAuthenticated()) { + const fields: Array = ["-modified"]; + const dmpDataTableRequest: DataTableRequest = new DataTableRequest(0, 5, { fields: fields }); + dmpDataTableRequest.criteria = new DmpCriteria(); + dmpDataTableRequest.criteria.like = ""; + this.dmpService + .getPaged(dmpDataTableRequest, "listing") + .subscribe(response => { + this.dmpActivities = response.data; + this.totalCount = response.totalCount; + this.totalCountDmps.emit(this.totalCount); + // this.dmpActivities.forEach(dmpActivity => { + // const recentActivity: RecentActivity = { + // activityData: dmpActivity, + // activityType: RecentActivityType.Dmp + // }; + // this.allRecentActivities.push(recentActivity) + // }) + }); + + // const datasetDataTableRequest: DataTableRequest = new DataTableRequest(0, 5, { fields: fields }); + // datasetDataTableRequest.criteria = new DatasetCriteria(); + // datasetDataTableRequest.criteria.like = ""; + // this.datasetService + // .getPaged(datasetDataTableRequest) + // .subscribe(response => { + // this.datasetActivities = response.data; + // this.datasetActivities.forEach(datasetActivity => { + // const recentActivity: RecentActivity = { + // activityData: datasetActivity, + // activityType: RecentActivityType.Dataset + // }; + // this.allRecentActivities.push(recentActivity) + // }) + // }); + } + } + + public isAuthenticated(): boolean { + return !!this.authentication.current(); + } + + isUserOwner(activity: DmpListingModel): boolean { + const principal: Principal = this.authentication.current(); + if (principal) return principal.id === activity.users.find(x => x.role === Role.Owner).id; + } + + editClicked(dmp: DmpListingModel) { + this.router.navigate(['/plans/edit/' + dmp.id]); + } + + cloneClicked(dmp: DmpListingModel) { + this.router.navigate(['/plans/clone/' + dmp.id]); + } + + deleteClicked(dmp: DmpListingModel) { + const dialogRef = this.dialog.open(ConfirmationDialogComponent, { + maxWidth: '300px', + restoreFocus: false, + data: { + message: this.language.instant('GENERAL.CONFIRMATION-DIALOG.DELETE-ITEM'), + confirmButton: this.language.instant('GENERAL.CONFIRMATION-DIALOG.ACTIONS.DELETE'), + cancelButton: this.language.instant('GENERAL.CONFIRMATION-DIALOG.ACTIONS.CANCEL'), + isDeleteConfirmation: true + } + }); + dialogRef.afterClosed().pipe(takeUntil(this._destroyed)).subscribe(result => { + if (result) { + this.dmpService.delete(dmp.id) + .pipe(takeUntil(this._destroyed)) + .subscribe( + complete => { this.onCallbackSuccess() }, + error => this.onDeleteCallbackError(error) + ); + } + }); + } + + openShareDialog(rowId: any, rowName: any) { + const dialogRef = this.dialog.open(DmpInvitationDialogComponent, { + // height: '250px', + // width: '700px', + restoreFocus: false, + data: { + dmpId: rowId, + dmpName: rowName + } + }); + } + + isDraftDmp(activity: DmpListingModel) { + return activity.status == DmpStatus.Draft; + } + + onCallbackSuccess(): void { + this.uiNotificationService.snackBarNotification(this.language.instant('GENERAL.SNACK-BAR.SUCCESSFUL-UPDATE'), SnackBarNotificationLevel.Success); + this.router.navigate(['/plans']); + } + + onDeleteCallbackError(error) { + this.uiNotificationService.snackBarNotification(error.error.message ? error.error.message : this.language.instant('GENERAL.SNACK-BAR.UNSUCCESSFUL-DELETE'), SnackBarNotificationLevel.Error); + } + + redirect(id: string, type: RecentActivityType) { + switch (type) { + case RecentActivityType.Grant: { + this.router.navigate(["grants/edit/" + id]); + return; + } + case RecentActivityType.Dataset: { + this.router.navigate(["datasets/edit/" + id]); + return; + } + case RecentActivityType.Dmp: { + this.router.navigate(["plans/overview/" + id]); + return; + } + default: + throw new Error("Unsupported Activity Type "); + } + } + + // navigateToUrl() { + // this.router.navigate(["plans/"]); + // } + + roleDisplay(value: any) { + const principal: Principal = this.authentication.current(); + let role: number; + if (principal) { + value.forEach(element => { + if (principal.id === element.id) { + role = element.role; + } + }); + } + if (role === 0) { + return this.language.instant('DMP-LISTING.OWNER'); + } + else if (role === 1) { + return this.language.instant('DMP-LISTING.MEMBER'); + } + else { + return this.language.instant('DMP-LISTING.OWNER'); + } + } + + // dmpProfileDisplay(value: any) { + // if (value != null) { + // return value; + // } + // else { + // return "--"; + // } + // } + + downloadXml(id: string) { + this.dmpService.downloadXML(id) + .pipe(takeUntil(this._destroyed)) + .subscribe(response => { + const blob = new Blob([response.body], { type: 'application/xml' }); + const filename = this.getFilenameFromContentDispositionHeader(response.headers.get('Content-Disposition')); + + FileSaver.saveAs(blob, filename); + }); + } + + downloadDocx(id: string) { + this.dmpService.downloadDocx(id) + .pipe(takeUntil(this._destroyed)) + .subscribe(response => { + const blob = new Blob([response.body], { type: 'application/msword' }); + const filename = this.getFilenameFromContentDispositionHeader(response.headers.get('Content-Disposition')); + + FileSaver.saveAs(blob, filename); + }); + } + + downloadPDF(id: string) { + this.dmpService.downloadPDF(id) + .pipe(takeUntil(this._destroyed)) + .subscribe(response => { + const blob = new Blob([response.body], { type: 'application/pdf' }); + const filename = this.getFilenameFromContentDispositionHeader(response.headers.get('Content-Disposition')); + + FileSaver.saveAs(blob, filename); + }); + } + + downloadJson(id: string) { + this.dmpService.downloadJson(id) + .pipe(takeUntil(this._destroyed)) + .subscribe(response => { + const blob = new Blob([response.body], { type: 'application/json' }); + const filename = this.getFilenameFromContentDispositionHeader(response.headers.get('Content-Disposition')); + FileSaver.saveAs(blob, filename); + }) + } + + getFilenameFromContentDispositionHeader(header: string): string { + const regex: RegExp = new RegExp(/filename[^;=\n]*=((['"]).*?\2|[^;\n]*)/g); + + const matches = header.match(regex); + let filename: string; + for (let i = 0; i < matches.length; i++) { + const match = matches[i]; + if (match.includes('filename="')) { + filename = match.substring(10, match.length - 1); + break; + } else if (match.includes('filename=')) { + filename = match.substring(9); + break; + } + } + return filename; + } + + addDataset(activityId: String) { + this.router.navigate(['/datasets/new/' + activityId]); + } + + newVersion(id: String, label: String) { + this.router.navigate(['/plans/new_version/' + id, { dmpLabel: label }]); + } + + viewVersions(rowId: String, rowLabel: String, activity: DmpListingModel) { + if (activity.public && !this.isUserOwner) { + this.router.navigate(['/explore-plans/versions/' + rowId], { queryParams: { groupLabel: rowLabel } }); + } else { + this.router.navigate(['/plans/versions/' + rowId], { queryParams: { groupLabel: rowLabel } }); + } + } + + public loadMore() { + const fields: Array = ["-modified"]; + const request = new DataTableRequest(this.startIndex, this.pageSize, { fields: fields }); + + request.criteria = new DmpCriteria(); + request.criteria.like = ""; + + this.dmpService.getPaged(request, "listing").pipe(takeUntil(this._destroyed)).subscribe(result => { + if (!result) { return []; } + this.dmpActivities = this.dmpActivities.concat(result.data); + }); + this.startIndex = this.startIndex + this.pageSize; + } + + // advancedClicked(dmp: DmpListingModel) { + // const dialogRef = this.dialog.open(ExportMethodDialogComponent, { + // maxWidth: '500px', + // data: { + // message: "Download as:", + // XMLButton: "XML", + // documentButton: "Document", + // pdfButton: "PDF", + // jsonButton: "JSON" + + // } + // }); + // dialogRef.afterClosed().pipe(takeUntil(this._destroyed)).subscribe(result => { + // if (result == "pdf") { + // this.downloadPDF(dmp.id); + // } else if (result == "xml") { + // this.downloadXml(dmp.id); + // } else if (result == "doc") { + // this.downloadDocx(dmp.id); + // } else if (result == "json") { + // this.downloadJson(dmp.id) + // } + // }); + // } +} From 134313eb3e2ba44f9c9c29f342a18219ac80ed7b Mon Sep 17 00:00:00 2001 From: gpapavgeri Date: Wed, 1 Jul 2020 18:32:22 +0300 Subject: [PATCH 015/364] dmp-overview_update --- .../dmp/overview/dmp-overview.component.html | 109 +++++++++++------- .../dmp/overview/dmp-overview.component.scss | 99 ++++++++++------ .../ui/dmp/overview/dmp-overview.component.ts | 59 ++++++++-- dmp-frontend/src/assets/i18n/en.json | 2 + dmp-frontend/src/assets/i18n/es.json | 2 + dmp-frontend/src/assets/i18n/gr.json | 2 + 6 files changed, 187 insertions(+), 86 deletions(-) diff --git a/dmp-frontend/src/app/ui/dmp/overview/dmp-overview.component.html b/dmp-frontend/src/app/ui/dmp/overview/dmp-overview.component.html index 49b8df844..32c2bdf7a 100644 --- a/dmp-frontend/src/app/ui/dmp/overview/dmp-overview.component.html +++ b/dmp-frontend/src/app/ui/dmp/overview/dmp-overview.component.html @@ -1,16 +1,14 @@
- + chevron_left

{{'DMP-WIZARD.ACTIONS.BACK' | translate}}

-
+
- +

{{ dmp.label }}

@@ -28,29 +26,25 @@ {{'DMP-OVERVIEW.PRIVATE' | translate}}
-
-
+
+
lock_outline {{'DMP-OVERVIEW.LOCKED' | translate}}
-
+
lock_open {{'DMP-OVERVIEW.UNLOCKED' | translate}}
-
{{'GENERAL.STATUSES.EDIT' | translate}} : {{dmp.modifiedTime | date:"longDate"}}
-
+
check {{'DATASET-LISTING.COLUMNS.FINALIZED' | translate}}
@@ -72,19 +66,33 @@ matTooltip="{{'DMP-LISTING.ACTIONS.DELETE' | translate}}" matTooltipPosition="above"> delete - --> + +
{{'DMP-OVERVIEW.GRANT' | translate}}
{{ dmp.grant.label }}
{{'DMP-OVERVIEW.RESEARCHERS' | translate}}
-
+
 
-
{{ researcher.name }}
+
{{ researcher.name }},
+
{{ researcher.name }}
{{'DATASET-LISTING.COLUMNS.DESCRIPTION' | translate}}
@@ -112,7 +120,7 @@
- @@ -127,20 +135,18 @@
-
+

{{'DMP-EDITOR.TITLE.SUBTITLE' | translate}}

-

- {{ dmp.doi }}

-

 

+

+ {{ dmp.doi }}

-
-
+
+
+
+ +

{{ 'DMP-LISTING.ACTIONS.FINALIZE' | translate }}

+
+
+
+
+
+

{{ 'DMP-LISTING.ACTIONS.DEPOSIT' | translate }}

-
+

{{ 'DMP-LISTING.ACTIONS.EXPORT' | translate }}

-
+ class="row ml-0 mr-0 pl-4 pb-3 d-flex align-items-center" (click)="publish(dmp.id)"> @@ -198,23 +216,30 @@
-
-
+
+

{{ 'DMP-OVERVIEW.DMP-AUTHORS' | translate }}

-
- -
-
-

{{ user.name }}

-

{{ roleDisplay(user) }}

+
+
+
+ +
+

{{ user.name }} + ({{ 'DMP-OVERVIEW.YOU' | translate }}) +

+

{{ roleDisplay(user) }}

+
+
+ class="row mt-3 mb-3 d-flex align-items-center justify-content-center">
-
- +
+ Costs + +
diff --git a/dmp-frontend/src/app/ui/dmp/editor/general-tab/general-tab.component.scss b/dmp-frontend/src/app/ui/dmp/editor/general-tab/general-tab.component.scss index 05d8ae793..595aabb5c 100644 --- a/dmp-frontend/src/app/ui/dmp/editor/general-tab/general-tab.component.scss +++ b/dmp-frontend/src/app/ui/dmp/editor/general-tab/general-tab.component.scss @@ -37,3 +37,7 @@ ::ng-deep .mat-form-field-appearance-legacy .mat-form-field-wrapper { padding-bottom: 1.25em; } + +.cost-placeholder { + text-decoration: underline; +} From 747ad60fb1ff2639849e13d770d697cf54d1d906 Mon Sep 17 00:00:00 2001 From: George Kalampokis Date: Thu, 2 Jul 2020 10:16:11 +0300 Subject: [PATCH 017/364] Update cost listing --- .../general-tab/extra-properties-form.model.ts | 17 ++++++++++++++--- .../editor/general-tab/general-tab.component.ts | 7 +++++-- 2 files changed, 19 insertions(+), 5 deletions(-) diff --git a/dmp-frontend/src/app/ui/dmp/editor/general-tab/extra-properties-form.model.ts b/dmp-frontend/src/app/ui/dmp/editor/general-tab/extra-properties-form.model.ts index 5d4d4d0a9..8124cc5d5 100644 --- a/dmp-frontend/src/app/ui/dmp/editor/general-tab/extra-properties-form.model.ts +++ b/dmp-frontend/src/app/ui/dmp/editor/general-tab/extra-properties-form.model.ts @@ -3,6 +3,7 @@ import { FormGroup, FormBuilder, Validators } from '@angular/forms'; import { BackendErrorValidator } from '@common/forms/validation/custom-validator'; import { CostModel } from '@app/core/model/dmp/cost'; import { isNullOrUndefined } from 'util'; +import { CostEditorModel } from '../cost-editor/add-cost/add-cost.model'; export class ExtraPropertiesFormModel { public language: string; @@ -10,7 +11,7 @@ export class ExtraPropertiesFormModel { public visible: boolean; public publicDate: Date; public contact: string; - public costs: CostModel[] = []; + public costs: CostEditorModel[] = []; fromModel(item: any): ExtraPropertiesFormModel { this.language = item.language; @@ -26,15 +27,25 @@ export class ExtraPropertiesFormModel { buildForm(context: ValidationContext = null, disabled: boolean = false): FormGroup { if (context == null) { context = this.createValidationContext(); } - + const formBuilder = new FormBuilder(); const formGroup = new FormBuilder().group({ language: [{ value: this.language, disabled: disabled }, context.getValidation('language').validators], license: [{ value: this.license, disabled: disabled }, context.getValidation('license').validators], visible: [{ value: this.visible, disabled: disabled }, context.getValidation('visible').validators], publicDate: [{ value: this.publicDate, disabled: disabled }, context.getValidation('publicDate').validators], contact: [{ value: this.contact, disabled: disabled }, context.getValidation('contact').validators], - costs: [{ value: this.costs, disabled: disabled }, context.getValidation('costs').validators] + // costs: [{ value: this.costs, disabled: disabled }, context.getValidation('costs').validators] }); + + const costArray = new Array(); + //if (this.externalDatasets && this.externalDatasets.length > 0) { + this.costs.forEach(item => { + costArray.push(item.buildForm(context.getValidation('externalDatasets').descendantValidations, disabled)); + }); + // } else { + // //externalDatasetsFormArray.push(new ExternalDatasetModel().buildForm(context.getValidation('externalDatasets').descendantValidations, disabled)); + // } + formGroup.addControl('costs', formBuilder.array(costArray)); return formGroup; } diff --git a/dmp-frontend/src/app/ui/dmp/editor/general-tab/general-tab.component.ts b/dmp-frontend/src/app/ui/dmp/editor/general-tab/general-tab.component.ts index 54387fa92..f699dad91 100644 --- a/dmp-frontend/src/app/ui/dmp/editor/general-tab/general-tab.component.ts +++ b/dmp-frontend/src/app/ui/dmp/editor/general-tab/general-tab.component.ts @@ -1,6 +1,6 @@ import { Component, Input, OnInit } from '@angular/core'; -import { FormGroup } from '@angular/forms'; +import { FormGroup, FormArray } from '@angular/forms'; import { MatDialog } from '@angular/material/dialog'; import { DataTableRequest } from '@app/core/model/data-table/data-table-request'; import { DatasetProfileModel } from '@app/core/model/dataset/dataset-profile'; @@ -27,6 +27,7 @@ import { LanguageInfoService } from '@app/core/services/culture/language-info-se import { LanguageInfo } from '@app/core/model/language-info'; import { LicenseCriteria } from '@app/core/query/license/license-criteria'; import { AddCostComponent } from '../cost-editor/add-cost/add-cost.component'; +import { CostEditorModel } from '../cost-editor/add-cost/add-cost.model'; interface Visible { value: boolean; @@ -271,7 +272,9 @@ export class GeneralTabComponent extends BaseComponent implements OnInit { if (result) { const costsArray = this.formGroup.get('extraProperties').get('costs').value || []; costsArray.push(result); - this.formGroup.get('extraProperties').get('costs').setValue(costsArray); + let costeditModel: CostEditorModel = new CostEditorModel(); + costeditModel = costeditModel.fromModel(result); + (this.formGroup.get('extraProperties').get('costs')).push(costeditModel.buildForm(null, true)); } }); } From 44d9cf537a017ab3db45d8f73623de4fa1dbc73d Mon Sep 17 00:00:00 2001 From: apapachristou Date: Thu, 2 Jul 2020 11:25:06 +0300 Subject: [PATCH 018/364] Adds invite shortcut on DMPs and fixes change language bug on ui --- .../app/ui/dashboard/dashboard.component.html | 18 ++-- .../ui/dashboard/drafts/drafts.component.html | 2 +- .../ui/dashboard/drafts/drafts.component.ts | 13 +++ ...ent-edited-dataset-activity.component.html | 2 +- ...ecent-edited-dataset-activity.component.ts | 13 +++ .../language-content/language.component.ts | 86 ++++++++++--------- .../src/app/ui/sidebar/sidebar.component.scss | 5 ++ dmp-frontend/src/assets/i18n/en.json | 5 ++ dmp-frontend/src/assets/i18n/es.json | 5 ++ dmp-frontend/src/assets/i18n/gr.json | 7 +- 10 files changed, 101 insertions(+), 55 deletions(-) diff --git a/dmp-frontend/src/app/ui/dashboard/dashboard.component.html b/dmp-frontend/src/app/ui/dashboard/dashboard.component.html index 601ccf0bd..d50ae2413 100644 --- a/dmp-frontend/src/app/ui/dashboard/dashboard.component.html +++ b/dmp-frontend/src/app/ui/dashboard/dashboard.component.html @@ -8,12 +8,10 @@
diff --git a/dmp-frontend/src/app/ui/dashboard/drafts/drafts.component.html b/dmp-frontend/src/app/ui/dashboard/drafts/drafts.component.html index 767a57fb7..eb053a3c7 100644 --- a/dmp-frontend/src/app/ui/dashboard/drafts/drafts.component.html +++ b/dmp-frontend/src/app/ui/dashboard/drafts/drafts.component.html @@ -26,7 +26,7 @@
diff --git a/dmp-frontend/src/app/ui/dashboard/drafts/drafts.component.ts b/dmp-frontend/src/app/ui/dashboard/drafts/drafts.component.ts index 0d3a63409..597925313 100644 --- a/dmp-frontend/src/app/ui/dashboard/drafts/drafts.component.ts +++ b/dmp-frontend/src/app/ui/dashboard/drafts/drafts.component.ts @@ -20,6 +20,7 @@ import { SnackBarNotificationLevel } from '@app/core/services/notification/ui-no import * as FileSaver from 'file-saver'; import { EnumUtils } from '@app/core/services/utilities/enum-utils.service'; import { UiNotificationService } from '@app/core/services/notification/ui-notification-service'; +import { DmpInvitationDialogComponent } from '@app/ui/dmp/invitation/dmp-invitation.component'; @Component({ selector: 'app-drafts', @@ -161,6 +162,18 @@ export class DraftsComponent extends BaseComponent implements OnInit { }); } + openShareDialog(dmpRowId: any, dmpRowName: any) { + const dialogRef = this.dialog.open(DmpInvitationDialogComponent, { + // height: '250px', + // width: '700px', + restoreFocus: false, + data: { + dmpId: dmpRowId, + dmpName: dmpRowName + } + }); + } + onCallbackSuccess(id?: String): void { this.uiNotificationService.snackBarNotification(this.language.instant('GENERAL.SNACK-BAR.SUCCESSFUL-UPDATE'), SnackBarNotificationLevel.Success); id ? this.router.navigate(['/reload']).then(() => { this.router.navigate(['/datasets', 'edit', id]); }) : this.router.navigate(['/datasets']); diff --git a/dmp-frontend/src/app/ui/dashboard/recent-edited-dataset-activity/recent-edited-dataset-activity.component.html b/dmp-frontend/src/app/ui/dashboard/recent-edited-dataset-activity/recent-edited-dataset-activity.component.html index 3d057a645..b555cdc02 100644 --- a/dmp-frontend/src/app/ui/dashboard/recent-edited-dataset-activity/recent-edited-dataset-activity.component.html +++ b/dmp-frontend/src/app/ui/dashboard/recent-edited-dataset-activity/recent-edited-dataset-activity.component.html @@ -28,7 +28,7 @@
diff --git a/dmp-frontend/src/app/ui/dashboard/recent-edited-dataset-activity/recent-edited-dataset-activity.component.ts b/dmp-frontend/src/app/ui/dashboard/recent-edited-dataset-activity/recent-edited-dataset-activity.component.ts index 769780f85..e163cc42d 100644 --- a/dmp-frontend/src/app/ui/dashboard/recent-edited-dataset-activity/recent-edited-dataset-activity.component.ts +++ b/dmp-frontend/src/app/ui/dashboard/recent-edited-dataset-activity/recent-edited-dataset-activity.component.ts @@ -20,6 +20,7 @@ import { ValidationErrorModel } from '@common/forms/validation/error-model/valid import { UiNotificationService } from '@app/core/services/notification/ui-notification-service'; import { SnackBarNotificationLevel } from '@common/modules/notification/ui-notification-service'; import { DatasetStatus } from '@app/core/common/enum/dataset-status'; +import { DmpInvitationDialogComponent } from '@app/ui/dmp/invitation/dmp-invitation.component'; @Component({ selector: 'app-recent-edited-dataset-activity', @@ -151,6 +152,18 @@ export class RecentEditedDatasetActivityComponent extends BaseComponent implemen }); } + openShareDialog(dmpRowId: any, dmpRowName: any, activity: any) { + const dialogRef = this.dialog.open(DmpInvitationDialogComponent, { + // height: '250px', + // width: '700px', + restoreFocus: false, + data: { + dmpId: dmpRowId, + dmpName: dmpRowName + } + }); + } + getFilenameFromContentDispositionHeader(header: string): string { const regex: RegExp = new RegExp(/filename[^;=\n]*=((['"]).*?\2|[^;\n]*)/g); diff --git a/dmp-frontend/src/app/ui/language/language-content/language.component.ts b/dmp-frontend/src/app/ui/language/language-content/language.component.ts index 791ed94d1..9eff5109f 100644 --- a/dmp-frontend/src/app/ui/language/language-content/language.component.ts +++ b/dmp-frontend/src/app/ui/language/language-content/language.component.ts @@ -1,4 +1,4 @@ -import { Component, OnInit } from '@angular/core'; +import { Component, OnInit, Output, EventEmitter } from '@angular/core'; import { Router } from '@angular/router'; import { AuthService } from '@app/core/services/auth/auth.service'; import { LanguageService } from '@app/core/services/language/language.service'; @@ -9,53 +9,55 @@ import { BaseComponent } from '@common/base/base.component'; const availableLanguages: any[] = require('../../../../assets/resources/language.json'); @Component({ - selector: 'app-language', - templateUrl: './language.component.html', - styleUrls: ['./language.component.scss'] + selector: 'app-language', + templateUrl: './language.component.html', + styleUrls: ['./language.component.scss'] }) export class LanguageComponent extends BaseComponent implements OnInit { + @Output() languageChange: EventEmitter = new EventEmitter(); languages = availableLanguages; - constructor( - private router: Router, - private authentication: AuthService, - private languageService: LanguageService, - private userService: UserService - ) { super(); } + constructor( + private router: Router, + private authentication: AuthService, + private languageService: LanguageService, + private userService: UserService + ) { super(); } - ngOnInit() { - } - - public isAuthenticated(): boolean { - return !(!this.authentication.current()); -} - - public getCurrentLanguage(): any { - const lang = this.languages.find(lang => lang.value === this.languageService.getCurrentLanguage()); - return lang; -} - - onLanguageSelected(selectedLanguage: any) { - if (this.isAuthenticated()) { - const langMap = new Map(); - langMap.set('language', selectedLanguage.value); - this.userService.updateUserSettings({language: this.languages.find(lang => lang.value === selectedLanguage.value)}) - .pipe(takeUntil(this._destroyed)) - .subscribe((response) => { - this.languageService.changeLanguage(selectedLanguage.value); - this.authentication.me() - .pipe(takeUntil(this._destroyed)) - .subscribe ( innerResponse => - {this.router.navigateByUrl(this.router.url);}); - }, - error => { - console.log(error); - }); - } else { - this.languageService.changeLanguage(selectedLanguage.value); - this.router.navigateByUrl(this.router.url); + ngOnInit() { + this.languageChange.emit(this.getCurrentLanguage().value) + } + + public isAuthenticated(): boolean { + return !(!this.authentication.current()); + } + + public getCurrentLanguage(): any { + const lang = this.languages.find(lang => lang.value === this.languageService.getCurrentLanguage()); + return lang; + } + + onLanguageSelected(selectedLanguage: any) { + if (this.isAuthenticated()) { + const langMap = new Map(); + langMap.set('language', selectedLanguage.value); + this.userService.updateUserSettings({ language: this.languages.find(lang => lang.value === selectedLanguage.value) }) + .pipe(takeUntil(this._destroyed)) + .subscribe((response) => { + this.languageService.changeLanguage(selectedLanguage.value); + this.authentication.me() + .pipe(takeUntil(this._destroyed)) + .subscribe(innerResponse => { this.router.navigateByUrl(this.router.url); }); + }, + error => { + console.log(error); + }); + } else { + this.languageService.changeLanguage(selectedLanguage.value); + this.router.navigateByUrl(this.router.url); + } + this.languageChange.emit(selectedLanguage.value); } -} } diff --git a/dmp-frontend/src/app/ui/sidebar/sidebar.component.scss b/dmp-frontend/src/app/ui/sidebar/sidebar.component.scss index 593d91ba2..0e90859e5 100644 --- a/dmp-frontend/src/app/ui/sidebar/sidebar.component.scss +++ b/dmp-frontend/src/app/ui/sidebar/sidebar.component.scss @@ -36,3 +36,8 @@ $mat-card-header-size: 30px !default; .active a i{ color: #23BCBA; } + +mat-list-item { + display: flex !important; + height: auto !important; +} diff --git a/dmp-frontend/src/assets/i18n/en.json b/dmp-frontend/src/assets/i18n/en.json index dccd10204..10bb1e2d2 100644 --- a/dmp-frontend/src/assets/i18n/en.json +++ b/dmp-frontend/src/assets/i18n/en.json @@ -1123,7 +1123,12 @@ "GRANTS": "Grants", "MY-DMPS": "My DMPs", "TITLE": "What is ARGOS?", + "DMP-QUESTION": "What is a DMP in ARGOS?", "INFO-TEXT": "ARGOS is an open extensible service that simplifies the management, validation, monitoring and maintenance and of Data Management Plans. It allows actors (researchers, managers, supervisors etc) to create actionable DMPs that may be freely exchanged among infrastructures for carrying out specific aspects of the Data management process in accordance with the intentions and commitment of Data owners.", + "INFO-DMP-TEXT": "A Data Management Plan (DMP) is a living document describing the datasets that are generated and/ or re-used during and after a research lifetime. DMPs aim to provide researchers with essential information to re-produce,re-distribute and re-purpose research results thus assuring for their validity and exploitation.", + "NEW-QUESTION": "New with DMPs? Visit", + "OPEN-AIR-GUIDE": "OpenAIRE’s Guide for Researchers", + "LEARN-MORE": "to learn more about how to create one!", "ORGANIZATIONS": "Related Organizations", "DMPS": "DMPs", "MY-DATASETS": "My Dataset Descriptions", diff --git a/dmp-frontend/src/assets/i18n/es.json b/dmp-frontend/src/assets/i18n/es.json index 9261319cd..8c67bed8f 100644 --- a/dmp-frontend/src/assets/i18n/es.json +++ b/dmp-frontend/src/assets/i18n/es.json @@ -1110,7 +1110,12 @@ "GRANTS": "Subvenciones", "MY-DMPS": "Mis PGDs", "TITLE": "¿Qué es ARGOS?", + "DMP-QUESTION": "¿Que es un DMP en ARGOS?", "INFO-TEXT": "ARGOS es un servicio extensible y abierto que simplifica la gestión, validación, monitorización y mantenimiento de los Plan de Gestión de Datos. Permite a los participantes (investigadores, gestores, supervisores, etc) crear un PGDs visible que puede ser compartido libremente entre distintas infraestructuras para llevar a cabo aspectos específicos del proceso de Gestión de Datos de acuerdo con los propósitos y el compromiso de los propietarios de los datos.", + "INFO-DMP-TEXT": "A Data Management Plan (DMP) is a living document describing the datasets that are generated and/ or re-used during and after a research lifetime. DMPs aim to provide researchers with essential information to re-produce,re-distribute and re-purpose research results thus assuring for their validity and exploitation.", + "NEW-QUESTION": "¿Nuevo con DMP? Visitar", + "OPEN-AIR-GUIDE": "Guía de OpenAIRE para investigadores", + "LEARN-MORE": "para aprender más sobre cómo crear uno!", "ORGANIZATIONS": "Organizaciones relacionadas", "DMPS": "PGDs", "MY-DATASETS": "Mis descripciones del Dataset", diff --git a/dmp-frontend/src/assets/i18n/gr.json b/dmp-frontend/src/assets/i18n/gr.json index fa4f747da..5bc65bc3d 100644 --- a/dmp-frontend/src/assets/i18n/gr.json +++ b/dmp-frontend/src/assets/i18n/gr.json @@ -1097,8 +1097,13 @@ "MY-GRANTS": "Οι Επιχορηγήσεις μου", "GRANTS": "Επιχορηγήσεις", "MY-DMPS": "Τα Σχέδια Διαχείρισης Δεδομένων μου", - "TITLE": "Τi είναι το ARGOS?", + "TITLE": "Τι είναι το ARGOS?", + "DMP-QUESTION": "Τι είναι το DMP στο ARGOS?", + "NEW-QUESTION": "Νέος με τα DMP; Επίσκεψου", + "OPEN-AIR-GUIDE": "Οδηγός για ερευνητές του OpenAIRE", + "LEARN-MORE": "για να μάθετε περισσότερα για το πώς να δημιουργήσετε ένα!", "INFO-TEXT": "Το ARGOS είναι μια ανοικτή επεκτάσιμη υπηρεσία που απλοποιεί τη διαχείριση, την επικύρωση, την παρακολούθηση και τη συντήρηση των Σχεδίων Διαχείρισης Δεδομένων. Επιτρέπει στους φορείς (ερευνητές, υπεύθυνους έρευνας, διευθυντές κλπ.) να δημιουργούν ζωντανά Σχέδια Διαχείρισης Δεδομένων που μπορούν να ανταλλάσσονται ελεύθερα μεταξύ των υποδομών για τη διεξαγωγή συγκεκριμένων πτυχών της διαδικασίας διαχείρισης Δεδομένων, σύμφωνα με τις προθέσεις και τη δέσμευση των κατόχων Δεδομένων.", + "INFO-DMP-TEXT": "A Data Management Plan (DMP) is a living document describing the datasets that are generated and/ or re-used during and after a research lifetime. DMPs aim to provide researchers with essential information to re-produce,re-distribute and re-purpose research results thus assuring for their validity and exploitation.", "ORGANIZATIONS": "Σχετικοί Οργανισμοί", "DMPS": "Σχέδια Διαχείρισης Δεδομένων", "MY-DATASETS": "Οι Περιγραφές Συνόλων Δεδομένων μου", From 325979a896f38672577f404df53428ef2b714cf6 Mon Sep 17 00:00:00 2001 From: George Kalampokis Date: Thu, 2 Jul 2020 11:57:59 +0300 Subject: [PATCH 019/364] Add criteria for the recent activity model --- .../controllers/DashBoardController.java | 7 +++--- .../criteria/RecentActivityCriteria.java | 22 +++++++++++++++++++ .../logic/managers/DashBoardManager.java | 9 +++++--- .../core/common/enum/recent-activity-order.ts | 6 +++++ .../recent-activity-criteria.ts | 6 +++++ .../services/dashboard/dashboard.service.ts | 5 +++-- 6 files changed, 47 insertions(+), 8 deletions(-) create mode 100644 dmp-backend/web/src/main/java/eu/eudat/criteria/RecentActivityCriteria.java create mode 100644 dmp-frontend/src/app/core/common/enum/recent-activity-order.ts create mode 100644 dmp-frontend/src/app/core/query/recent-activity/recent-activity-criteria.ts 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 5b375c49b..65e7c3a09 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,5 +1,6 @@ package eu.eudat.controllers; +import eu.eudat.criteria.RecentActivityCriteria; import eu.eudat.logic.managers.DashBoardManager; import eu.eudat.logic.security.claims.ClaimedAuthorities; import eu.eudat.logic.services.ApiContext; @@ -44,11 +45,11 @@ public class DashBoardController extends BaseController { return ResponseEntity.status(HttpStatus.OK).body(new ResponseItem().status(ApiMessageCode.NO_MESSAGE).payload(statistics)); } - @RequestMapping(method = RequestMethod.GET, value = {"/dashboard/recentActivity"}, produces = "application/json") + @RequestMapping(method = RequestMethod.POST, value = {"/dashboard/recentActivity"}, produces = "application/json") @Transactional - public ResponseEntity>> getNewRecentActivity(@RequestParam(name = "numOfActivities", required = false, defaultValue = "5") Integer numberOfActivities, + public ResponseEntity>> getNewRecentActivity(@RequestBody RecentActivityCriteria criteria, @RequestParam(name = "numOfActivities", required = false, defaultValue = "5") Integer numberOfActivities, @ClaimedAuthorities(claims = {Authorities.ADMIN, Authorities.MANAGER, Authorities.USER, Authorities.ANONYMOUS}) Principal principal) { - List statistics = dashBoardManager.getNewRecentActivity(principal, numberOfActivities); + List statistics = dashBoardManager.getNewRecentActivity(criteria, principal, numberOfActivities); return ResponseEntity.status(HttpStatus.OK).body(new ResponseItem>().status(ApiMessageCode.NO_MESSAGE).payload(statistics)); } diff --git a/dmp-backend/web/src/main/java/eu/eudat/criteria/RecentActivityCriteria.java b/dmp-backend/web/src/main/java/eu/eudat/criteria/RecentActivityCriteria.java new file mode 100644 index 000000000..40cf806c1 --- /dev/null +++ b/dmp-backend/web/src/main/java/eu/eudat/criteria/RecentActivityCriteria.java @@ -0,0 +1,22 @@ +package eu.eudat.criteria; + +public class RecentActivityCriteria { + private String like; + private String order; + + public String getLike() { + return like; + } + + public void setLike(String like) { + this.like = like; + } + + public String getOrder() { + return order; + } + + public void setOrder(String order) { + this.order = order; + } +} 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 eba7e1a58..4b190e65a 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 @@ -1,5 +1,6 @@ package eu.eudat.logic.managers; +import eu.eudat.criteria.RecentActivityCriteria; import eu.eudat.data.dao.criteria.*; import eu.eudat.data.dao.entities.DMPDao; import eu.eudat.data.dao.entities.DatasetDao; @@ -182,16 +183,18 @@ public class DashBoardManager { } @Transactional - public List getNewRecentActivity(Principal principal, Integer numberofactivities) { + public List getNewRecentActivity(RecentActivityCriteria criteria, Principal principal, Integer numberofactivities) { List recentActivityModels = new ArrayList<>(); DMPDao dataManagementPlanRepository = databaseRepository.getDmpDao(); DatasetDao datasetRepository = databaseRepository.getDatasetDao(); UserInfo user = new UserInfo(); user.setId(principal.getId()); DatasetCriteria datasetCriteria = new DatasetCriteria(); + datasetCriteria.setLike(criteria.getLike()); datasetCriteria.setAllVersions(false); DataManagementPlanCriteria dataManagementPlanCriteria = new DataManagementPlanCriteria(); dataManagementPlanCriteria.setAllVersions(false); + dataManagementPlanCriteria.setLike(criteria.getLike()); QueryableList dmpList; QueryableList datasetList; @@ -210,7 +213,7 @@ public class DashBoardManager { CompletableFuture> dmps = dmpList .withHint(HintedModelFactory.getHint(DataManagementPlanListingModel.class)) - .orderBy((builder, root) -> builder.desc(root.get("modified"))) + .orderBy((builder, root) -> builder.desc(root.get(criteria.getOrder()))) .take(numberofactivities) .selectAsync(item -> { return new RecentDmpModel().fromEntity(item); @@ -219,7 +222,7 @@ public class DashBoardManager { CompletableFuture> datasets = datasetList .withHint(HintedModelFactory.getHint(DatasetListingModel.class)) - .orderBy((builder, root) -> builder.desc(root.get("modified"))) + .orderBy((builder, root) -> builder.desc(root.get(criteria.getOrder()))) .take(numberofactivities) .selectAsync(item -> { return new RecentDatasetModel().fromEntity(item); diff --git a/dmp-frontend/src/app/core/common/enum/recent-activity-order.ts b/dmp-frontend/src/app/core/common/enum/recent-activity-order.ts new file mode 100644 index 000000000..792ede63c --- /dev/null +++ b/dmp-frontend/src/app/core/common/enum/recent-activity-order.ts @@ -0,0 +1,6 @@ +export enum RecentActivityOrder { + LABEL = "label", + CREATED = "created", + MODIFIED = "modified", + STATUS = "status" +} diff --git a/dmp-frontend/src/app/core/query/recent-activity/recent-activity-criteria.ts b/dmp-frontend/src/app/core/query/recent-activity/recent-activity-criteria.ts new file mode 100644 index 000000000..1c21402b9 --- /dev/null +++ b/dmp-frontend/src/app/core/query/recent-activity/recent-activity-criteria.ts @@ -0,0 +1,6 @@ +import { RecentActivityOrder } from '@app/core/common/enum/recent-activity-order'; +import { BaseCriteria } from '../base-criteria'; + +export class RecentActivityCriteria extends BaseCriteria{ + public order: RecentActivityOrder = RecentActivityOrder.MODIFIED; +} diff --git a/dmp-frontend/src/app/core/services/dashboard/dashboard.service.ts b/dmp-frontend/src/app/core/services/dashboard/dashboard.service.ts index b715942de..6537c1c83 100644 --- a/dmp-frontend/src/app/core/services/dashboard/dashboard.service.ts +++ b/dmp-frontend/src/app/core/services/dashboard/dashboard.service.ts @@ -5,6 +5,7 @@ import { environment } from '../../../../environments/environment'; import { DashboardStatisticsModel } from '../../model/dashboard/dashboard-statistics-model'; import { BaseHttpService } from '../http/base-http.service'; import { ConfigurationService } from '../configuration/configuration.service'; +import { RecentActivityCriteria } from '@app/core/query/recent-activity/recent-activity-criteria'; @Injectable() export class DashboardService { @@ -25,7 +26,7 @@ export class DashboardService { return this.http.get(this.actionUrl + 'me/getStatistics', { headers: this.headers }); } - getRecentAcitvity(): Observable { - return this.http.get(this.actionUrl + 'recentActivity', {headers: this.headers}); + getRecentAcitvity(criteria: RecentActivityCriteria): Observable { + return this.http.post(this.actionUrl + 'recentActivity', criteria, {headers: this.headers}); } } From f5093a69952b148381e6485ac5678a421acffa5d Mon Sep 17 00:00:00 2001 From: George Kalampokis Date: Thu, 2 Jul 2020 11:59:58 +0300 Subject: [PATCH 020/364] Add type to the recent activity model --- .../recent/model/RecentActivityModel.java | 35 +++++++++++++++++++ .../recent/model/RecentDatasetModel.java | 2 +- .../recent/model/RecentDmpModel.java | 1 + 3 files changed, 37 insertions(+), 1 deletion(-) diff --git a/dmp-backend/web/src/main/java/eu/eudat/models/data/dashboard/recent/model/RecentActivityModel.java b/dmp-backend/web/src/main/java/eu/eudat/models/data/dashboard/recent/model/RecentActivityModel.java index 015c76af3..8f72a044d 100644 --- a/dmp-backend/web/src/main/java/eu/eudat/models/data/dashboard/recent/model/RecentActivityModel.java +++ b/dmp-backend/web/src/main/java/eu/eudat/models/data/dashboard/recent/model/RecentActivityModel.java @@ -16,6 +16,7 @@ public abstract class RecentActivityModel { private Date finalizedAt; private Date publishedAt; private String profile; + private RecentActivityType type; public String getId() { return id; @@ -121,5 +122,39 @@ public abstract class RecentActivityModel { this.profile = profile; } + public RecentActivityType getType() { + return type; + } + + public void setType(RecentActivityType type) { + this.type = type; + } + public abstract RecentActivityModel fromEntity(T entity); + + public enum RecentActivityType { + DMP(1), DATASET(2); + + private final int index; + + RecentActivityType(int index) { + this.index = index; + } + + public int getIndex() { + return index; + } + + public static RecentActivityType fromIndex(int index) { + switch (index) { + case 1: + return DMP; + case 2: + return DATASET; + default: + throw new IllegalArgumentException("Recent Activity Type : \"" + index + "\" is not supported."); + } + + } + } } diff --git a/dmp-backend/web/src/main/java/eu/eudat/models/data/dashboard/recent/model/RecentDatasetModel.java b/dmp-backend/web/src/main/java/eu/eudat/models/data/dashboard/recent/model/RecentDatasetModel.java index 58156453c..c1eddfd42 100644 --- a/dmp-backend/web/src/main/java/eu/eudat/models/data/dashboard/recent/model/RecentDatasetModel.java +++ b/dmp-backend/web/src/main/java/eu/eudat/models/data/dashboard/recent/model/RecentDatasetModel.java @@ -4,7 +4,6 @@ import eu.eudat.data.entities.Dataset; import eu.eudat.logic.utilities.helpers.LabelBuilder; import eu.eudat.models.data.dataset.DataRepository; import eu.eudat.models.data.dataset.Service; -import eu.eudat.models.data.listingmodels.DatasetListingModel; import java.util.Date; import java.util.stream.Collectors; @@ -80,6 +79,7 @@ public class RecentDatasetModel extends RecentActivityModel { } public RecentDatasetModel fromDmpEntity(Dataset entity) { + this.setType(RecentActivityType.DATASET); this.setId(entity.getId().toString()); this.setTitle(entity.getLabel()); this.setDescription(entity.getDescription()); diff --git a/dmp-backend/web/src/main/java/eu/eudat/models/data/dashboard/recent/model/RecentDmpModel.java b/dmp-backend/web/src/main/java/eu/eudat/models/data/dashboard/recent/model/RecentDmpModel.java index 9c28bdec2..82b630cd9 100644 --- a/dmp-backend/web/src/main/java/eu/eudat/models/data/dashboard/recent/model/RecentDmpModel.java +++ b/dmp-backend/web/src/main/java/eu/eudat/models/data/dashboard/recent/model/RecentDmpModel.java @@ -90,6 +90,7 @@ public class RecentDmpModel extends RecentActivityModel { @Override @Transactional public RecentActivityModel fromEntity(DMP entity) { + this.setType(RecentActivityType.DMP); this.setId(entity.getId().toString()); this.setTitle(entity.getLabel()); this.setDescription(entity.getDescription()); From 62118179ffd2380a72369a3659f97328836a97b6 Mon Sep 17 00:00:00 2001 From: George Kalampokis Date: Thu, 2 Jul 2020 17:06:47 +0300 Subject: [PATCH 021/364] Update the cost listing (near finalization) and fix some issues while loading costs from the backend --- .../add-cost/add-cost.component.ts | 2 +- .../cost-listing/cost-listing.component.html | 16 ++++++++-- .../cost-listing/cost-listing.component.ts | 30 +++++++++++++------ .../extra-properties-form.model.ts | 6 ++-- .../general-tab/general-tab.component.html | 2 +- .../general-tab/general-tab.component.scss | 4 +++ 6 files changed, 44 insertions(+), 16 deletions(-) diff --git a/dmp-frontend/src/app/ui/dmp/editor/cost-editor/add-cost/add-cost.component.ts b/dmp-frontend/src/app/ui/dmp/editor/cost-editor/add-cost/add-cost.component.ts index e6f8d57e7..7a4da0f75 100644 --- a/dmp-frontend/src/app/ui/dmp/editor/cost-editor/add-cost/add-cost.component.ts +++ b/dmp-frontend/src/app/ui/dmp/editor/cost-editor/add-cost/add-cost.component.ts @@ -23,7 +23,7 @@ export class AddCostComponent extends BaseComponent implements OnInit { initialItems: () => this.searchCurrency(''), displayFn: (item) => typeof (item) == 'string' ? JSON.parse(item)['name'] : item.name, titleFn: (item) => typeof (item) == 'string' ? JSON.parse(item)['name'] : item.name, - valueAssign: (item) => typeof (item) == 'string' ? JSON.parse(item)['value'] : item.value + valueAssign: (item) => JSON.stringify(item) }; constructor( diff --git a/dmp-frontend/src/app/ui/dmp/editor/cost-editor/cost-listing/cost-listing.component.html b/dmp-frontend/src/app/ui/dmp/editor/cost-editor/cost-listing/cost-listing.component.html index 1fb26780b..8ed92f09d 100644 --- a/dmp-frontend/src/app/ui/dmp/editor/cost-editor/cost-listing/cost-listing.component.html +++ b/dmp-frontend/src/app/ui/dmp/editor/cost-editor/cost-listing/cost-listing.component.html @@ -9,20 +9,30 @@
- +
- +
- +
+
+
+
+
+
+
+
+
+
+
diff --git a/dmp-frontend/src/app/ui/dmp/editor/cost-editor/cost-listing/cost-listing.component.ts b/dmp-frontend/src/app/ui/dmp/editor/cost-editor/cost-listing/cost-listing.component.ts index 1272e51c6..16bbc9a89 100644 --- a/dmp-frontend/src/app/ui/dmp/editor/cost-editor/cost-listing/cost-listing.component.ts +++ b/dmp-frontend/src/app/ui/dmp/editor/cost-editor/cost-listing/cost-listing.component.ts @@ -1,12 +1,13 @@ import { Component, OnInit, Input } from '@angular/core'; import { BaseComponent } from '@common/base/base.component'; -import { FormArray } from '@angular/forms'; +import { FormArray, FormControl } from '@angular/forms'; import { takeUntil } from 'rxjs/operators'; import { CostModel } from '@app/core/model/dmp/cost'; import { SingleAutoCompleteConfiguration } from '@app/library/auto-complete/single/single-auto-complete-configuration'; import { CurrencyService } from '@app/core/services/currency/currency.service'; import { Observable } from 'rxjs'; import { LocalFetchModel } from '@app/core/model/local-fetch/local-fetch.model'; +import { CostEditorModel } from '../add-cost/add-cost.model'; @Component({ selector: 'app-cost-listing', @@ -17,14 +18,14 @@ export class CostListingComponent extends BaseComponent implements OnInit { @Input() form: FormArray; - costs: CostModel[] = []; + private cost: CostEditorModel[] = []; currencyAutoCompleteConfiguration: SingleAutoCompleteConfiguration = { filterFn: this.searchCurrency.bind(this), initialItems: () => this.searchCurrency(''), displayFn: (item) => typeof (item) == 'string' ? JSON.parse(item)['name'] : item.name, titleFn: (item) => typeof (item) == 'string' ? JSON.parse(item)['name'] : item.name, - valueAssign: (item) => this.getValue(item) + valueAssign: (item) => JSON.stringify(item) }; constructor( @@ -34,18 +35,29 @@ export class CostListingComponent extends BaseComponent implements OnInit { } ngOnInit() { - this.form.valueChanges.pipe(takeUntil(this._destroyed)).subscribe(value => { - this.costs = value; - }); } searchCurrency(like: string): Observable { return this.currencyService.get(like); } - getValue(item: any): any { - console.log(item); - return item; +switchEditMode(event: number) { + const control = this.form.at(event); + if (control.disabled) { + this.cost[event] = control.value; + control.enable(); + } else { + control.disable(); } +} + +removeCost(event: number) { + this.form.removeAt(event); +} + +revertEdits(event: number) { + this.form.at(event).setValue(this.cost[event]); + this.form.at(event).disable(); +} } diff --git a/dmp-frontend/src/app/ui/dmp/editor/general-tab/extra-properties-form.model.ts b/dmp-frontend/src/app/ui/dmp/editor/general-tab/extra-properties-form.model.ts index 8124cc5d5..8ef442501 100644 --- a/dmp-frontend/src/app/ui/dmp/editor/general-tab/extra-properties-form.model.ts +++ b/dmp-frontend/src/app/ui/dmp/editor/general-tab/extra-properties-form.model.ts @@ -20,7 +20,9 @@ export class ExtraPropertiesFormModel { this.publicDate = item.publicDate; this.contact = item.contact; if (!isNullOrUndefined(item.costs)) { - this.costs = item.costs; + (item.costs).forEach(element => { + this.costs.push(new CostEditorModel().fromModel(element)); + }); } return this; } @@ -40,7 +42,7 @@ export class ExtraPropertiesFormModel { const costArray = new Array(); //if (this.externalDatasets && this.externalDatasets.length > 0) { this.costs.forEach(item => { - costArray.push(item.buildForm(context.getValidation('externalDatasets').descendantValidations, disabled)); + costArray.push(item.buildForm(context.getValidation('costs').descendantValidations, disabled)); }); // } else { // //externalDatasetsFormArray.push(new ExternalDatasetModel().buildForm(context.getValidation('externalDatasets').descendantValidations, disabled)); diff --git a/dmp-frontend/src/app/ui/dmp/editor/general-tab/general-tab.component.html b/dmp-frontend/src/app/ui/dmp/editor/general-tab/general-tab.component.html index 2d85e7ccc..78852a3a6 100644 --- a/dmp-frontend/src/app/ui/dmp/editor/general-tab/general-tab.component.html +++ b/dmp-frontend/src/app/ui/dmp/editor/general-tab/general-tab.component.html @@ -143,7 +143,7 @@
Costs -
diff --git a/dmp-frontend/src/app/ui/dmp/editor/general-tab/general-tab.component.scss b/dmp-frontend/src/app/ui/dmp/editor/general-tab/general-tab.component.scss index 595aabb5c..322c63d34 100644 --- a/dmp-frontend/src/app/ui/dmp/editor/general-tab/general-tab.component.scss +++ b/dmp-frontend/src/app/ui/dmp/editor/general-tab/general-tab.component.scss @@ -41,3 +41,7 @@ .cost-placeholder { text-decoration: underline; } + +.cost-add { + margin-top: 1em; +} From 1ec90d7b5263438875a71fb9d99b0d1d8f2325f2 Mon Sep 17 00:00:00 2001 From: George Kalampokis Date: Thu, 2 Jul 2020 17:08:38 +0300 Subject: [PATCH 022/364] Properly remove associate Collaborators from a DMP --- .../managers/DataManagementPlanManager.java | 19 ++++++++++++++++++- 1 file changed, 18 insertions(+), 1 deletion(-) diff --git a/dmp-backend/web/src/main/java/eu/eudat/logic/managers/DataManagementPlanManager.java b/dmp-backend/web/src/main/java/eu/eudat/logic/managers/DataManagementPlanManager.java index f9a8499ca..614e1cf42 100644 --- a/dmp-backend/web/src/main/java/eu/eudat/logic/managers/DataManagementPlanManager.java +++ b/dmp-backend/web/src/main/java/eu/eudat/logic/managers/DataManagementPlanManager.java @@ -372,6 +372,14 @@ public class DataManagementPlanManager { apiContext.getOperationsContext().getDatabaseRepository().getGrantDao().createOrUpdate(newDmp.getGrant()); newDmp = apiContext.getOperationsContext().getDatabaseRepository().getDmpDao().createOrUpdate(newDmp); + if (dataManagementPlan.getUsers() != null && !dataManagementPlan.getUsers().isEmpty()) { + clearUsers(newDmp); + for (UserInfoListingModel userListing : dataManagementPlan.getUsers()) { + UserInfo tempUser = apiContext.getOperationsContext().getDatabaseRepository().getUserInfoDao().find(userListing.getId()); + assignUser(dmp, tempUser, UserDMP.UserDMPRoles.fromInteger(userListing.getRole())); + } + } + // Dataset manipulation for when the DMP is set to be finalized. if (dataManagementPlan.getStatus() == DMP.DMPStatus.FINALISED.getValue()) { if (dataManagementPlan.getDatasetsToBeFinalized() != null && !dataManagementPlan.getDatasetsToBeFinalized().isEmpty()) { @@ -1447,13 +1455,22 @@ public class DataManagementPlanManager { * */ private void assignUser(DMP dmp, UserInfo userInfo) { + this.assignUser(dmp, userInfo, UserDMP.UserDMPRoles.OWNER); + } + + private void assignUser(DMP dmp, UserInfo userInfo, UserDMP.UserDMPRoles role) { UserDMP userDMP = new UserDMP(); userDMP.setDmp(dmp); userDMP.setUser(userInfo); - userDMP.setRole(UserDMP.UserDMPRoles.OWNER.getValue()); + userDMP.setRole(role.getValue()); databaseRepository.getUserDmpDao().createOrUpdate(userDMP); } + private void clearUsers(DMP dmp) { + List userDMPs = apiContext.getOperationsContext().getDatabaseRepository().getUserDmpDao().asQueryable().where(((builder, root) -> builder.equal(root.get("dmp").get("id"), dmp.getId()))).toList(); + userDMPs.forEach(userDMP -> apiContext.getOperationsContext().getDatabaseRepository().getUserDmpDao().delete(userDMP)); + } + private void assignGrandUserIfInternal(DMP dmp, UserInfo user) { if (dmp.getGrant().getCreationUser() == null && (dmp.getGrant().getReference() != null && dmp.getGrant().getReference().startsWith("dmp:"))) { dmp.getGrant().setCreationUser(user); From 094cff06b171186b2b1a7ff2b891231fe59559e2 Mon Sep 17 00:00:00 2001 From: George Kalampokis Date: Thu, 2 Jul 2020 17:08:38 +0300 Subject: [PATCH 023/364] Properly remove associate Collaborators from a DMP --- .../managers/DataManagementPlanManager.java | 19 ++++++++++++++++++- 1 file changed, 18 insertions(+), 1 deletion(-) diff --git a/dmp-backend/web/src/main/java/eu/eudat/logic/managers/DataManagementPlanManager.java b/dmp-backend/web/src/main/java/eu/eudat/logic/managers/DataManagementPlanManager.java index 9583b2862..8d272f67d 100644 --- a/dmp-backend/web/src/main/java/eu/eudat/logic/managers/DataManagementPlanManager.java +++ b/dmp-backend/web/src/main/java/eu/eudat/logic/managers/DataManagementPlanManager.java @@ -368,6 +368,14 @@ public class DataManagementPlanManager { apiContext.getOperationsContext().getDatabaseRepository().getGrantDao().createOrUpdate(newDmp.getGrant()); newDmp = apiContext.getOperationsContext().getDatabaseRepository().getDmpDao().createOrUpdate(newDmp); + if (dataManagementPlan.getUsers() != null && !dataManagementPlan.getUsers().isEmpty()) { + clearUsers(newDmp); + for (UserInfoListingModel userListing : dataManagementPlan.getUsers()) { + UserInfo tempUser = apiContext.getOperationsContext().getDatabaseRepository().getUserInfoDao().find(userListing.getId()); + assignUser(dmp, tempUser, UserDMP.UserDMPRoles.fromInteger(userListing.getRole())); + } + } + // Dataset manipulation for when the DMP is set to be finalized. if (dataManagementPlan.getStatus() == DMP.DMPStatus.FINALISED.getValue()) { if (dataManagementPlan.getDatasetsToBeFinalized() != null && !dataManagementPlan.getDatasetsToBeFinalized().isEmpty()) { @@ -1445,13 +1453,22 @@ public class DataManagementPlanManager { * */ private void assignUser(DMP dmp, UserInfo userInfo) { + this.assignUser(dmp, userInfo, UserDMP.UserDMPRoles.OWNER); + } + + private void assignUser(DMP dmp, UserInfo userInfo, UserDMP.UserDMPRoles role) { UserDMP userDMP = new UserDMP(); userDMP.setDmp(dmp); userDMP.setUser(userInfo); - userDMP.setRole(UserDMP.UserDMPRoles.OWNER.getValue()); + userDMP.setRole(role.getValue()); databaseRepository.getUserDmpDao().createOrUpdate(userDMP); } + private void clearUsers(DMP dmp) { + List userDMPs = apiContext.getOperationsContext().getDatabaseRepository().getUserDmpDao().asQueryable().where(((builder, root) -> builder.equal(root.get("dmp").get("id"), dmp.getId()))).toList(); + userDMPs.forEach(userDMP -> apiContext.getOperationsContext().getDatabaseRepository().getUserDmpDao().delete(userDMP)); + } + private void assignGrandUserIfInternal(DMP dmp, UserInfo user) { if (dmp.getGrant().getCreationUser() == null && (dmp.getGrant().getReference() != null && dmp.getGrant().getReference().startsWith("dmp:"))) { dmp.getGrant().setCreationUser(user); From faaa57e2be0418a8558570a7e7a58abdb361bb7f Mon Sep 17 00:00:00 2001 From: gpapavgeri Date: Thu, 2 Jul 2020 18:29:33 +0300 Subject: [PATCH 024/364] dmp overview re-design -- not completed: lock, remove, versions --- .../configuration/configuration.service.ts | 5 ++ .../src/app/ui/dataset/dataset.routing.ts | 10 ++- .../editor/people-tab/people-tab.component.ts | 2 +- .../dmp/overview/dmp-overview.component.html | 47 +++++-------- .../dmp/overview/dmp-overview.component.scss | 8 ++- .../ui/dmp/overview/dmp-overview.component.ts | 67 ++++++++++++++++--- dmp-frontend/src/assets/config/config.json | 3 +- 7 files changed, 97 insertions(+), 45 deletions(-) diff --git a/dmp-frontend/src/app/core/services/configuration/configuration.service.ts b/dmp-frontend/src/app/core/services/configuration/configuration.service.ts index 0dcc59286..fced31bfe 100644 --- a/dmp-frontend/src/app/core/services/configuration/configuration.service.ts +++ b/dmp-frontend/src/app/core/services/configuration/configuration.service.ts @@ -72,6 +72,10 @@ export class ConfigurationService extends BaseComponent { return this._useSplash; } + private _orcidPath: string; + get orcidPath(): string { + return this._orcidPath; + } public loadConfiguration(): Promise { return new Promise((r, e) => { @@ -110,6 +114,7 @@ export class ConfigurationService extends BaseComponent { this._allowOrganizationCreator = config.allowOrganizationCreator; this._doiLink = config.doiLink; this._useSplash = config.useSplash; + this._orcidPath = config.orcidPath; } } diff --git a/dmp-frontend/src/app/ui/dataset/dataset.routing.ts b/dmp-frontend/src/app/ui/dataset/dataset.routing.ts index e90d0dff1..a17296a13 100644 --- a/dmp-frontend/src/app/ui/dataset/dataset.routing.ts +++ b/dmp-frontend/src/app/ui/dataset/dataset.routing.ts @@ -75,7 +75,15 @@ const routes: Routes = [ breadcrumb: true, title: 'GENERAL.TITLES.DATASET-UPDATE' }, - } + }, + // { + // path: 'overview/:id', + // component: DatasetOverviewComponent, + // data: { + // breadcrumb: true, + // title: 'GENERAL.TITLES.DATASET-OVERVIEW' + // }, + // }, ]; @NgModule({ diff --git a/dmp-frontend/src/app/ui/dmp/editor/people-tab/people-tab.component.ts b/dmp-frontend/src/app/ui/dmp/editor/people-tab/people-tab.component.ts index e5f6b992c..8fc0f073f 100644 --- a/dmp-frontend/src/app/ui/dmp/editor/people-tab/people-tab.component.ts +++ b/dmp-frontend/src/app/ui/dmp/editor/people-tab/people-tab.component.ts @@ -86,5 +86,5 @@ export class PeopleTabComponent implements OnInit { })); } }); - } + } } diff --git a/dmp-frontend/src/app/ui/dmp/overview/dmp-overview.component.html b/dmp-frontend/src/app/ui/dmp/overview/dmp-overview.component.html index 32c2bdf7a..5faabb907 100644 --- a/dmp-frontend/src/app/ui/dmp/overview/dmp-overview.component.html +++ b/dmp-frontend/src/app/ui/dmp/overview/dmp-overview.component.html @@ -26,7 +26,7 @@ {{'DMP-OVERVIEW.PRIVATE' | translate}}
-
+
lock_outline {{'DMP-OVERVIEW.LOCKED' | translate}} @@ -66,33 +66,23 @@ matTooltip="{{'DMP-LISTING.ACTIONS.DELETE' | translate}}" matTooltipPosition="above"> delete - - -
{{'DMP-OVERVIEW.GRANT' | translate}}
{{ dmp.grant.label }}
{{'DMP-OVERVIEW.RESEARCHERS' | translate}}
-
-
 
-
{{ researcher.name }},
-
{{ researcher.name }}
+
{{'DATASET-LISTING.COLUMNS.DESCRIPTION' | translate}}
@@ -103,13 +93,6 @@
-

{{ user.name }} - ({{ 'DMP-OVERVIEW.YOU' | translate }}) + + ({{ 'DMP-OVERVIEW.YOU' | translate }})

{{ roleDisplay(user) }}

diff --git a/dmp-frontend/src/app/ui/dmp/overview/dmp-overview.component.scss b/dmp-frontend/src/app/ui/dmp/overview/dmp-overview.component.scss index a5e7b6b22..cf3220afb 100644 --- a/dmp-frontend/src/app/ui/dmp/overview/dmp-overview.component.scss +++ b/dmp-frontend/src/app/ui/dmp/overview/dmp-overview.component.scss @@ -145,6 +145,7 @@ color: #008887; padding-right: 0.5em; align-self: center; + } .header { @@ -181,6 +182,11 @@ font-size: 0.8em; letter-spacing: 0.009em; color: #7D7D7D; + width: 12em; + height: 1em; + overflow: hidden; + border: none; + padding: 0px; } .doi-panel { @@ -257,7 +263,7 @@ } .dmp-label, .dataset-btn, .add-dataset-btn, - .doi-panel { + .doi-panel, .researcher { display: flex; align-items: center; } diff --git a/dmp-frontend/src/app/ui/dmp/overview/dmp-overview.component.ts b/dmp-frontend/src/app/ui/dmp/overview/dmp-overview.component.ts index 9bddb0db8..1d233f5fc 100644 --- a/dmp-frontend/src/app/ui/dmp/overview/dmp-overview.component.ts +++ b/dmp-frontend/src/app/ui/dmp/overview/dmp-overview.component.ts @@ -1,5 +1,5 @@ -import { Component, OnInit, Input } from '@angular/core'; +import { Component, OnInit, Input, ViewChild, ElementRef } from '@angular/core'; import { MatDialog } from '@angular/material/dialog'; import { ActivatedRoute, Params, Router } from '@angular/router'; import { DatasetStatus } from '@app/core/common/enum/dataset-status'; @@ -18,7 +18,7 @@ import { BreadcrumbItem } from '@app/ui/misc/breadcrumb/definition/breadcrumb-it import { BaseComponent } from '@common/base/base.component'; import { TranslateService } from '@ngx-translate/core'; import * as FileSaver from 'file-saver'; -import { Observable, of as observableOf } from 'rxjs'; +import { Observable, of as observableOf, interval } from 'rxjs'; import { takeUntil } from 'rxjs/operators'; import { Role } from "@app/core/common/enum/role"; import { DmpInvitationDialogComponent } from '../invitation/dmp-invitation.component'; @@ -32,8 +32,9 @@ import { UserService } from '@app/core/services/user/user.service'; import { Location } from '@angular/common'; import { FormGroup } from '@angular/forms'; import { LockService } from '@app/core/services/lock/lock.service'; -import { ReturnStatement } from '@angular/compiler'; +import { ReturnStatement, ConditionalExpr } from '@angular/compiler'; import { LockModel } from '@app/core/model/lock/lock.model'; +import { Guid } from '@common/types/guid'; @Component({ selector: 'app-dmp-overview', @@ -53,6 +54,10 @@ export class DmpOverviewComponent extends BaseComponent implements OnInit { hasDOIToken = false; lock: LockModel; lockStatus: Boolean; + textMessage: any; + + @ViewChild('doi', { static: false }) + doi: ElementRef; @Input() formGroup: FormGroup; @@ -88,6 +93,7 @@ export class DmpOverviewComponent extends BaseComponent implements OnInit { .pipe(takeUntil(this._destroyed)) .subscribe(data => { this.dmp = data; + this.checkLockStatus(this.dmp.id); this.setIsUserOwner(); const breadCrumbs = []; breadCrumbs.push({ parentComponentName: null, label: this.language.instant('NAV-BAR.MY-DMPS'), url: "/plans" }); @@ -110,6 +116,7 @@ export class DmpOverviewComponent extends BaseComponent implements OnInit { .pipe(takeUntil(this._destroyed)) .subscribe(data => { this.dmp = data; + this.checkLockStatus(this.dmp.id); this.setIsUserOwner(); const breadCrumbs = []; breadCrumbs.push({ parentComponentName: null, label: this.language.instant('NAV-BAR.PUBLIC-DMPS'), url: "/explore-plans" }); @@ -144,6 +151,11 @@ export class DmpOverviewComponent extends BaseComponent implements OnInit { } } + isUserAuthor(userId: string): boolean { + const principal: Principal = this.authentication.current(); + return userId === principal.id; + } + editClicked(dmp: DmpOverviewModel) { this.router.navigate(['/plans/edit/' + dmp.id]); } @@ -175,6 +187,7 @@ export class DmpOverviewComponent extends BaseComponent implements OnInit { this.router.navigate(['/datasets/publicEdit/' + datasetId]); } else { this.router.navigate(['/datasets/edit/' + datasetId]); + console.log('inhere') } } @@ -547,7 +560,7 @@ export class DmpOverviewComponent extends BaseComponent implements OnInit { this.onCallbackSuccess() }, error => this.onFinalizeCallbackError(error) - );; + ); } goBack(): void { @@ -572,18 +585,51 @@ export class DmpOverviewComponent extends BaseComponent implements OnInit { } }); } - - checkLockStatus(id: string): Observable { - return this.lockService.checkLockStatus(id); + + copyDoi(doi) { + console.log(doi.nativeElement.innerHTML); + let domElement = doi.nativeElement as HTMLInputElement; + domElement.select(); + document.execCommand('copy'); + domElement.setSelectionRange(0, 0); + alert('Doi Copied to Clipboard'); + } + + public getOrcidPath(): string { + return this.configurationService.orcidPath; } - createOrUpdate(id: string): Observable { - // this.lock = new LockModel(id, this.getUserFromDMP()); - return this.lockService.createOrUpdate(this.lock); + checkLockStatus(id: string){ + this.lockService.checkLockStatus(id).pipe(takeUntil(this._destroyed)) + .subscribe(lockStatus => this.lockStatus = lockStatus); } + getUserFromDMP(): any { + if (this.dmp) { + const principal: Principal = this.authentication.current(); + return this.dmp.users.find(x => x.id === principal.id); + } + } + + createOrUpdate(id: string): void { + if (!this.lockStatus) { + this.lock = new LockModel(id, this.getUserFromDMP()); + this.lockService.createOrUpdate(this.lock).pipe(takeUntil(this._destroyed)).subscribe(async result => { + this.lock.id = Guid.parse(result); + this.checkLockStatus(id); + // interval(this.configurationService.lockInterval).pipe(takeUntil(this._destroyed)).subscribe(() => this.pumpLock()); + }); + } + } + // private pumpLock() { + // this.lock.touchedAt = new Date(); + // this.lockStatus = true; + // this.lockService.createOrUpdate(this.lock).pipe(takeUntil(this._destroyed)).subscribe(async result => this.lock.id = Guid.parse(result)); + // } + + // advancedClicked() { // const dialogRef = this.dialog.open(ExportMethodDialogComponent, { // maxWidth: '500px', @@ -627,4 +673,5 @@ export class DmpOverviewComponent extends BaseComponent implements OnInit { // }); // } + } diff --git a/dmp-frontend/src/assets/config/config.json b/dmp-frontend/src/assets/config/config.json index be0623a0a..cff19d7d4 100644 --- a/dmp-frontend/src/assets/config/config.json +++ b/dmp-frontend/src/assets/config/config.json @@ -52,5 +52,6 @@ "guideAssets": "assets/images/guide", "allowOrganizationCreator": true, "doiLink": "https://sandbox.zenodo.org/record/", - "useSplash": false + "useSplash": false, + "orcidPath": "https://orcid.org/" } From 7127f6dbd6773ce5b3c8ca4bc3fb631b57482388 Mon Sep 17 00:00:00 2001 From: George Kalampokis Date: Thu, 2 Jul 2020 18:35:16 +0300 Subject: [PATCH 025/364] Minor fix over cost listing --- .../ui/dmp/editor/general-tab/extra-properties-form.model.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dmp-frontend/src/app/ui/dmp/editor/general-tab/extra-properties-form.model.ts b/dmp-frontend/src/app/ui/dmp/editor/general-tab/extra-properties-form.model.ts index 8ef442501..c2dc45d91 100644 --- a/dmp-frontend/src/app/ui/dmp/editor/general-tab/extra-properties-form.model.ts +++ b/dmp-frontend/src/app/ui/dmp/editor/general-tab/extra-properties-form.model.ts @@ -42,7 +42,7 @@ export class ExtraPropertiesFormModel { const costArray = new Array(); //if (this.externalDatasets && this.externalDatasets.length > 0) { this.costs.forEach(item => { - costArray.push(item.buildForm(context.getValidation('costs').descendantValidations, disabled)); + costArray.push(item.buildForm(context.getValidation('costs').descendantValidations, true)); }); // } else { // //externalDatasetsFormArray.push(new ExternalDatasetModel().buildForm(context.getValidation('externalDatasets').descendantValidations, disabled)); From 6d491b5930f487a6a4d2ce03f57ea365ea8fafed Mon Sep 17 00:00:00 2001 From: George Kalampokis Date: Thu, 2 Jul 2020 18:36:18 +0300 Subject: [PATCH 026/364] Rda mapper will now be able to use the new DMP fields --- .../eudat/models/rda/mapper/DmpRDAMapper.java | 25 ++++++++++++++++--- 1 file changed, 22 insertions(+), 3 deletions(-) diff --git a/dmp-backend/web/src/main/java/eu/eudat/models/rda/mapper/DmpRDAMapper.java b/dmp-backend/web/src/main/java/eu/eudat/models/rda/mapper/DmpRDAMapper.java index a64649c86..bda50f6ba 100644 --- a/dmp-backend/web/src/main/java/eu/eudat/models/rda/mapper/DmpRDAMapper.java +++ b/dmp-backend/web/src/main/java/eu/eudat/models/rda/mapper/DmpRDAMapper.java @@ -3,6 +3,7 @@ package eu.eudat.models.rda.mapper; import eu.eudat.data.entities.*; import eu.eudat.logic.services.ApiContext; import eu.eudat.logic.utilities.helpers.StreamDistinctBy; +import eu.eudat.models.rda.Cost; import eu.eudat.models.rda.Dmp; import eu.eudat.models.rda.DmpId; import net.minidev.json.JSONObject; @@ -43,16 +44,34 @@ public class DmpRDAMapper { Map extraProperties = new org.json.JSONObject(dmp.getExtraProperties()).toMap(); if (!extraProperties.isEmpty()) { - rda.setLanguage(LanguageRDAMapper.mapLanguageIsoToRDAIso(extraProperties.get("language").toString())); + if (extraProperties.get("language") != null) { + rda.setLanguage(LanguageRDAMapper.mapLanguageIsoToRDAIso(extraProperties.get("language").toString())); + } + if (extraProperties.get("costs") != null) { + rda.setCost(new ArrayList<>()); + ((List) extraProperties.get("costs")).forEach(costl -> { + Cost cost = new Cost(); + Map code = new org.json.JSONObject((String) ((Map) costl).get("code")).toMap(); + cost.setCurrencyCode(Cost.CurrencyCode.fromValue((String) code.get("value"))); + cost.setDescription((String) ((Map) costl).get("description")); + cost.setTitle((String) ((Map) costl).get("title")); + cost.setValue(((Integer) ((Map) costl).get("value")).doubleValue()); + rda.getCost().add(cost); + }); + } + if (extraProperties.get("contact") != null) { + UserInfo contact = apiContext.getOperationsContext().getDatabaseRepository().getUserInfoDao().find(UUID.fromString((String)extraProperties.get("contact"))); + rda.setContact(ContactRDAMapper.toRDA(contact)); + } } - UserInfo creator; + /*UserInfo creator; if (dmp.getCreator() != null) { creator = dmp.getCreator(); } else { creator = dmp.getUsers().stream().filter(userDMP -> userDMP.getRole().equals(UserDMP.UserDMPRoles.OWNER.getValue())).map(UserDMP::getUser).findFirst().orElse(new UserInfo()); } - rda.setContact(ContactRDAMapper.toRDA(creator)); + rda.setContact(ContactRDAMapper.toRDA(creator));*/ rda.setContributor(new ArrayList<>()); if (dmp.getResearchers() != null && !dmp.getResearchers().isEmpty()) { rda.getContributor().addAll(dmp.getResearchers().stream().map(ContributorRDAMapper::toRDA).collect(Collectors.toList())); From 52662f33f44f368fdc88665be1ed461b150d70fd Mon Sep 17 00:00:00 2001 From: apapachristou Date: Thu, 2 Jul 2020 19:34:27 +0300 Subject: [PATCH 027/364] Adds all recent activity --- .../recent-activity/recent-activity.model.ts | 6 + .../recent-dmp-activity.model.ts | 2 - .../services/dashboard/dashboard.service.ts | 12 +- .../app/ui/dashboard/dashboard.component.html | 17 +- .../app/ui/dashboard/dashboard.component.scss | 6 +- .../app/ui/dashboard/dashboard.component.ts | 5 + .../ui/dashboard/drafts/drafts.component.ts | 4 +- .../recent-edited-activity.component.html | 219 ++++++++++-------- .../recent-edited-activity.component.ts | 171 +++++++++++--- ...ecent-edited-dataset-activity.component.ts | 5 +- .../recent-edited-dmp-activity.component.html | 141 +---------- .../recent-edited-dmp-activity.component.ts | 5 +- .../src/app/ui/sidebar/sidebar.component.scss | 4 + dmp-frontend/src/styles.scss | 2 +- 14 files changed, 314 insertions(+), 285 deletions(-) diff --git a/dmp-frontend/src/app/core/model/recent-activity/recent-activity.model.ts b/dmp-frontend/src/app/core/model/recent-activity/recent-activity.model.ts index b195e63b2..7bf5eecdb 100644 --- a/dmp-frontend/src/app/core/model/recent-activity/recent-activity.model.ts +++ b/dmp-frontend/src/app/core/model/recent-activity/recent-activity.model.ts @@ -1,3 +1,6 @@ +import { RecentActivityType } from '@app/core/common/enum/recent-activity-type'; +import { UserInfoListingModel } from '../user/user-info-listing'; + export class RecentActivityModel { id: String; title: String; @@ -12,5 +15,8 @@ export class RecentActivityModel { finalizedAt: Date; publishedAt: Date; profile: String; + type: RecentActivityType; + users: UserInfoListingModel[]; + public: boolean; } diff --git a/dmp-frontend/src/app/core/model/recent-activity/recent-dmp-activity.model.ts b/dmp-frontend/src/app/core/model/recent-activity/recent-dmp-activity.model.ts index 88045ace9..a1ab59124 100644 --- a/dmp-frontend/src/app/core/model/recent-activity/recent-dmp-activity.model.ts +++ b/dmp-frontend/src/app/core/model/recent-activity/recent-dmp-activity.model.ts @@ -10,6 +10,4 @@ export class RecentDmpModel extends RecentActivityModel { associatedProfiles: DmpAssociatedProfileModel[]; organisations: String; groupId: string; - users: UserInfoListingModel[]; - isPublic: boolean; } diff --git a/dmp-frontend/src/app/core/services/dashboard/dashboard.service.ts b/dmp-frontend/src/app/core/services/dashboard/dashboard.service.ts index a10a33131..c85881a86 100644 --- a/dmp-frontend/src/app/core/services/dashboard/dashboard.service.ts +++ b/dmp-frontend/src/app/core/services/dashboard/dashboard.service.ts @@ -7,6 +7,8 @@ import { BaseHttpService } from '../http/base-http.service'; import { ConfigurationService } from '../configuration/configuration.service'; import { RecentActivityModel } from '@app/core/model/recent-activity/recent-activity.model'; import { RecentActivityCriteria } from '@app/core/query/recent-activity/recent-activity-criteria'; +import { DataTableData } from '@app/core/model/data-table/data-table-data'; +import { DataTableRequest } from '@app/core/model/data-table/data-table-request'; @Injectable() export class DashboardService { @@ -19,6 +21,10 @@ export class DashboardService { this.actionUrl = configurationService.server + 'dashboard/'; } + getPaged(dataTableRequest: DataTableRequest): Observable> { + return this.http.post>(this.actionUrl + 'paged', dataTableRequest); + } + getStatistics(): Observable { return this.http.get(this.actionUrl + 'getStatistics', { headers: this.headers }); } @@ -27,7 +33,7 @@ export class DashboardService { return this.http.get(this.actionUrl + 'me/getStatistics', { headers: this.headers }); } - getRecentAcitvity(criteria: RecentActivityCriteria): Observable { - return this.http.post(this.actionUrl + 'recentActivity', criteria, {headers: this.headers}); - } + // getRecentAcitvity(criteria: RecentActivityCriteria): Observable { + // return this.http.post(this.actionUrl + 'recentActivity', criteria, {headers: this.headers}); + // } } diff --git a/dmp-frontend/src/app/ui/dashboard/dashboard.component.html b/dmp-frontend/src/app/ui/dashboard/dashboard.component.html index d50ae2413..55867cb5b 100644 --- a/dmp-frontend/src/app/ui/dashboard/dashboard.component.html +++ b/dmp-frontend/src/app/ui/dashboard/dashboard.component.html @@ -5,21 +5,21 @@ && dashboardStatisticsData?.totalGrantCount === 0 && dashboardStatisticsData?.totalOrganisationCount === 0">
-
+
-

{{'DASHBOARD.DMP-QUESTION' | translate}}

+

{{'DASHBOARD.DMP-QUESTION' | translate}}

{{'DASHBOARD.INFO-DMP-TEXT' | translate}}

{{'DASHBOARD.NEW-QUESTION' | translate}} {{'DASHBOARD.OPEN-AIR-GUIDE' | translate}} {{'DASHBOARD.LEARN-MORE' | translate}}

- +
-
+
{{'DASHBOARD.PERSONAL-USAGE' | translate}}
0
{{'DASHBOARD.DMPS' | translate}} @@ -36,10 +36,9 @@ || dashboardStatisticsData?.totalDataSetCount !== 0 || dashboardStatisticsData?.totalGrantCount !== 0 || dashboardStatisticsData?.totalOrganisationCount !== 0"> -
-
+
clear

{{'DASHBOARD.DMP-ABOUT-BEG' | translate}} @@ -51,9 +50,9 @@

Latest activity
- +
- +
@@ -69,7 +68,7 @@
-
+
{{'DASHBOARD.PERSONAL-USAGE' | translate}}
{{dashboardStatisticsData?.totalDataManagementPlanCount}}
diff --git a/dmp-frontend/src/app/ui/dashboard/dashboard.component.scss b/dmp-frontend/src/app/ui/dashboard/dashboard.component.scss index 914d21664..eb221e931 100644 --- a/dmp-frontend/src/app/ui/dashboard/dashboard.component.scss +++ b/dmp-frontend/src/app/ui/dashboard/dashboard.component.scss @@ -1,6 +1,6 @@ .main-content { background-color: #f5f5f5; - padding-top: 3.68rem; + padding-top: 4.68rem; padding-bottom: 3rem; // padding-left: 3.31rem; padding-left: 1rem; @@ -303,6 +303,10 @@ input[type="text"] { color: #f16868; } +.stats { + padding: 0rem 7em 4rem 3rem; +} + ::ng-deep .mat-tab-group.mat-primary .mat-ink-bar, .mat-tab-nav-bar.mat-primary .mat-ink-bar { background: #129d99; diff --git a/dmp-frontend/src/app/ui/dashboard/dashboard.component.ts b/dmp-frontend/src/app/ui/dashboard/dashboard.component.ts index 06a3f2939..f7e728b46 100644 --- a/dmp-frontend/src/app/ui/dashboard/dashboard.component.ts +++ b/dmp-frontend/src/app/ui/dashboard/dashboard.component.ts @@ -56,6 +56,7 @@ export class DashboardComponent extends BaseComponent implements OnInit, IBreadC totalDatasets: number; totalDmps: number; totalDraftDatasets: number; + totalRecents: number; constructor( @@ -202,6 +203,10 @@ export class DashboardComponent extends BaseComponent implements OnInit, IBreadC this.totalDraftDatasets = event; } + onCountAllRecent(event): void { + this.totalRecents = event; + } + // viewAllPublicDmpsClicked() { // this.router.navigate(['/explore-plans']); // } diff --git a/dmp-frontend/src/app/ui/dashboard/drafts/drafts.component.ts b/dmp-frontend/src/app/ui/dashboard/drafts/drafts.component.ts index 597925313..c15803bbe 100644 --- a/dmp-frontend/src/app/ui/dashboard/drafts/drafts.component.ts +++ b/dmp-frontend/src/app/ui/dashboard/drafts/drafts.component.ts @@ -62,7 +62,8 @@ export class DraftsComponent extends BaseComponent implements OnInit { this.datasetService.getPaged(dmpDataTableRequest).subscribe(response => { this.datasetDrafts = response.data; this.totalCount = response.totalCount; - this.totalCountDraftDatasets.emit(this.totalCount); + this.totalCountDraftDatasets.emit(this.pageSize); + // this.totalCountDraftDatasets.emit(this.totalCount); }); } @@ -247,5 +248,6 @@ export class DraftsComponent extends BaseComponent implements OnInit { this.datasetDrafts = this.datasetDrafts.concat(result.data); }); this.startIndex = this.startIndex + this.pageSize; + this.totalCountDraftDatasets.emit(this.startIndex + 1); } } diff --git a/dmp-frontend/src/app/ui/dashboard/recent-edited-activity/recent-edited-activity.component.html b/dmp-frontend/src/app/ui/dashboard/recent-edited-activity/recent-edited-activity.component.html index 0cf7f52f4..4975212cb 100644 --- a/dmp-frontend/src/app/ui/dashboard/recent-edited-activity/recent-edited-activity.component.html +++ b/dmp-frontend/src/app/ui/dashboard/recent-edited-activity/recent-edited-activity.component.html @@ -1,107 +1,140 @@ -
-
- -
-
-
-
{{ 'DMP-LISTING.DMP' | translate }}
-
{{ 'DMP-LISTING.EDITED' | translate }}: {{ activity.modifiedTime | date: "longDate" }}
+
+
+
+
+
+
+
{{ 'DMP-LISTING.DMP' | translate }}
+
{{ 'DMP-LISTING.EDITED' | translate }}: {{ activity.modified | date: "longDate" }}
+
+
{{activity.title}}
+
+ {{ roleDisplay(activity.users) }} + . + public{{'TYPES.DMP-VISIBILITY.PUBLIC' | translate}} + done{{ enumUtils.toDmpStatusString(activity.status) }} + create{{ enumUtils.toDmpStatusString(activity.status) }} + . + {{'DMP-LISTING.VERSION' | translate}} {{activity.version}} + . + {{ 'DMP-LISTING.GRANT' | translate }}: {{activity.grant}} +
+
{{'DMP-LISTING.CONTAINED-DATASETS' | translate}}: ({{ getDatasets(activity).length }}) +
+
+
+
{{dataset.title}},
+
{{dataset.title}}
+
+
+ {{'GENERAL.ACTIONS.SHOW-MORE' | translate}}
-
{{activity.label}}
-
- {{ roleDisplay(activity.users) }} - . - public{{'TYPES.DMP-VISIBILITY.PUBLIC' | translate}} - done{{ enumUtils.toDmpStatusString(activity.status) }} - create{{ enumUtils.toDmpStatusString(activity.status) }} - . - {{'DMP-LISTING.VERSION' | translate}} {{activity.version}} - . - {{ 'DMP-LISTING.GRANT' | translate }}: {{activity.grant}} + -
{{'DMP-LISTING.CONTAINED-DATASETS' | translate}}: ({{activity.datasets.length}}) -
-
-
-
{{dataset.label}},
-
{{dataset.label}}
+ + + + + + + + + + + + +
+
+
+
+
+ +
+
{{'DATASET-LISTING.DATASET-DESCRIPTION' | translate}}
+
{{'DATASET-LISTING.STATES.EDITED' | translate}}: {{activity.modified | date:"longDate"}}
+
+
{{'DATASET-LISTING.DATASET-DESCRIPTION' | translate}}: {{activity.title}}
+
+ {{ roleDisplay(activity.users) }} + . + public{{'DATASET-LISTING.STATES.PUBLIC' | translate}} + done{{ enumUtils.toDmpStatusString(activity.status) }} + create{{ enumUtils.toDmpStatusString(activity.status) }} + . + {{'DATASET-LISTING.COLUMNS.GRANT' | translate}}: {{activity.grant}} +
+
+
{{'DATASET-LISTING.TOOLTIP.PART-OF' | translate}} +
{{'DATASET-LISTING.TOOLTIP.DMP' | translate}}
+
+ +
{{'DATASET-LISTING.TOOLTIP.DMP-FOR' | translate}}: {{ getDmp(activity) }}
- {{'GENERAL.ACTIONS.SHOW-MORE' | translate}} -
- + + + + + + - - - - - - - - - - - + + + + + +
- +
- - -
@@ -19,12 +18,12 @@ . {{ 'DMP-LISTING.GRANT' | translate }}: {{activity.grant}}
-
{{'DMP-LISTING.CONTAINED-DATASETS' | translate}}: ({{activity.datasets.length}}) +
{{'DMP-LISTING.CONTAINED-DATASETS' | translate}}: ({{ activity.datasets.length }})
-
{{dataset.label}},
-
{{dataset.label}}
+
{{dataset.label}},
+
{{dataset.label}}
{{'GENERAL.ACTIONS.SHOW-MORE' | translate}} @@ -72,137 +71,3 @@
- - - - - - - diff --git a/dmp-frontend/src/app/ui/dashboard/recent-edited-dmp-activity/recent-edited-dmp-activity.component.ts b/dmp-frontend/src/app/ui/dashboard/recent-edited-dmp-activity/recent-edited-dmp-activity.component.ts index 7cc18c095..5d1299cac 100644 --- a/dmp-frontend/src/app/ui/dashboard/recent-edited-dmp-activity/recent-edited-dmp-activity.component.ts +++ b/dmp-frontend/src/app/ui/dashboard/recent-edited-dmp-activity/recent-edited-dmp-activity.component.ts @@ -64,7 +64,8 @@ export class RecentEditedDmpActivityComponent extends BaseComponent implements O .subscribe(response => { this.dmpActivities = response.data; this.totalCount = response.totalCount; - this.totalCountDmps.emit(this.totalCount); + this.totalCountDmps.emit(this.pageSize); + // this.totalCountDmps.emit(this.totalCount); // this.dmpActivities.forEach(dmpActivity => { // const recentActivity: RecentActivity = { // activityData: dmpActivity, @@ -299,6 +300,8 @@ export class RecentEditedDmpActivityComponent extends BaseComponent implements O this.dmpActivities = this.dmpActivities.concat(result.data); }); this.startIndex = this.startIndex + this.pageSize; + + this.totalCountDmps.emit(this.startIndex + 1); } // advancedClicked(dmp: DmpListingModel) { diff --git a/dmp-frontend/src/app/ui/sidebar/sidebar.component.scss b/dmp-frontend/src/app/ui/sidebar/sidebar.component.scss index 0e90859e5..cf2df085a 100644 --- a/dmp-frontend/src/app/ui/sidebar/sidebar.component.scss +++ b/dmp-frontend/src/app/ui/sidebar/sidebar.component.scss @@ -41,3 +41,7 @@ mat-list-item { display: flex !important; height: auto !important; } + +::ng-deep .mat-list-item-content { + width: 100% !important; +} diff --git a/dmp-frontend/src/styles.scss b/dmp-frontend/src/styles.scss index 6f8546081..ba53ff116 100644 --- a/dmp-frontend/src/styles.scss +++ b/dmp-frontend/src/styles.scss @@ -162,7 +162,7 @@ .main-content { background-color: #f5f5f5; - padding-top: 3.68rem; + padding-top: 4.68rem; padding-bottom: 3rem; // padding-left: 3.31rem; padding-left: 1rem; From ce24afd16fb56a214197e892c67375f37d3568e6 Mon Sep 17 00:00:00 2001 From: apapachristou Date: Fri, 3 Jul 2020 10:40:22 +0300 Subject: [PATCH 028/364] Adds text and button to add dataset on empty tab list on dashboard --- .../app/ui/dashboard/dashboard.component.html | 29 +- .../app/ui/dashboard/dashboard.component.scss | 439 +++++++++--------- dmp-frontend/src/assets/i18n/en.json | 4 + dmp-frontend/src/assets/i18n/es.json | 4 + dmp-frontend/src/assets/i18n/gr.json | 4 + 5 files changed, 262 insertions(+), 218 deletions(-) diff --git a/dmp-frontend/src/app/ui/dashboard/dashboard.component.html b/dmp-frontend/src/app/ui/dashboard/dashboard.component.html index 55867cb5b..402c5a6b7 100644 --- a/dmp-frontend/src/app/ui/dashboard/dashboard.component.html +++ b/dmp-frontend/src/app/ui/dashboard/dashboard.component.html @@ -45,26 +45,35 @@ {{'DASHBOARD.DATASET-DESCRIPTIONS' | translate}} {{'DASHBOARD.DMP-ABOUT-END' | translate}}

- +
-
Latest activity
+
{{'DASHBOARD.LATEST-ACTIVITY' | translate}}
- -
+ +
+
{{'DASHBOARD.EMPTY-LIST' | translate}}
- -
+ +
+
{{'DASHBOARD.EMPTY-LIST' | translate}}
- -
+ +
+
{{'DASHBOARD.EMPTY-LIST' | translate}}
- -
+ +
+
{{'DASHBOARD.EMPTY-LIST' | translate}}
+
+ +
diff --git a/dmp-frontend/src/app/ui/dashboard/dashboard.component.scss b/dmp-frontend/src/app/ui/dashboard/dashboard.component.scss index eb221e931..46690bf67 100644 --- a/dmp-frontend/src/app/ui/dashboard/dashboard.component.scss +++ b/dmp-frontend/src/app/ui/dashboard/dashboard.component.scss @@ -1,327 +1,350 @@ .main-content { - background-color: #f5f5f5; - padding-top: 4.68rem; - padding-bottom: 3rem; - // padding-left: 3.31rem; - padding-left: 1rem; - margin: 0; - display: flex; - flex-grow: 1; + background-color: #f5f5f5; + padding-top: 4.68rem; + padding-bottom: 3rem; + // padding-left: 3.31rem; + padding-left: 1rem; + margin: 0; + display: flex; + flex-grow: 1; } .card { - background: #ffffff 0% 0% no-repeat padding-box; - box-shadow: 0px 3px 6px #00000029; - border-radius: 4px; - width: 712px; - margin-bottom: 3.75rem; - /* height: 407px; */ - opacity: 1; + background: #ffffff 0% 0% no-repeat padding-box; + box-shadow: 0px 3px 6px #00000029; + border-radius: 4px; + width: 712px; + margin-bottom: 3.75rem; + /* height: 407px; */ + opacity: 1; } .card-title { - text-align: left; - font: Bold 20px/30px Roboto; - letter-spacing: 0px; - color: #212121; - padding-left: 40px; - /* padding-top: 40px; */ - padding-right: 55px; - opacity: 1; + text-align: left; + font: Bold 20px/30px Roboto; + letter-spacing: 0px; + color: #212121; + padding-left: 40px; + /* padding-top: 40px; */ + padding-right: 55px; + opacity: 1; } .card-content { - text-align: left; - font: Light 16px/26px Roboto; - letter-spacing: 0px; - color: #212121; - padding-left: 40px; - padding-top: 36px; - padding-right: 55px; - opacity: 1; + text-align: left; + font: Light 16px/26px Roboto; + letter-spacing: 0px; + color: #212121; + padding-left: 40px; + padding-top: 36px; + padding-right: 55px; + opacity: 1; } .clear-icon { - cursor: pointer; + cursor: pointer; } .normal-btn { - min-width: 162px; - max-width: 256px; - height: 40px; - cursor: pointer; - background: #129d99 0% 0% no-repeat padding-box; - box-shadow: 0px 3px 6px #1e202029; - border-radius: 30px; - border: none; - color: #ffffff; - opacity: 1; - line-height: 1; - font-size: 0.87rem; - padding: 0.62rem 1.87rem; - margin-left: 40px; + min-width: 162px; + max-width: 256px; + height: 40px; + cursor: pointer; + background: #129d99 0% 0% no-repeat padding-box; + box-shadow: 0px 3px 6px #1e202029; + border-radius: 30px; + border: none; + color: #ffffff; + opacity: 1; + line-height: 1; + font-size: 0.87rem; + padding: 0.62rem 1.87rem; + margin-left: 40px; } .yellow-btn { - min-width: 162px; - max-width: 256px; - height: 40px; - cursor: pointer; - background: #f7dd72 0% 0% no-repeat padding-box; - border-radius: 30px; - opacity: 1; - border: none; - color: #000000; - opacity: 1; - line-height: 1; - font-size: 0.87rem; - padding: 0.62rem 1.87rem; - margin-left: 40px; + min-width: 162px; + max-width: 256px; + height: 40px; + cursor: pointer; + background: #f7dd72 0% 0% no-repeat padding-box; + border-radius: 30px; + opacity: 1; + border: none; + color: #000000; + opacity: 1; + line-height: 1; + font-size: 0.87rem; + padding: 0.62rem 1.87rem; + margin-left: 40px; } .personal-usage { - text-align: left; - font-weight: 300; - font-family: "Roboto", sans-serif; - font-size: 1.25rem; - letter-spacing: 0px; - color: #212121; - opacity: 0.6; + text-align: left; + font-weight: 300; + font-family: "Roboto", sans-serif; + font-size: 1.25rem; + letter-spacing: 0px; + color: #212121; + opacity: 0.6; } .counter-zero { - text-align: left; - font: Bold 48px/30px Roboto; - letter-spacing: 0px; - color: #212121; - opacity: 0.36; - padding-top: 2rem; - padding-bottom: 0.5rem; + text-align: left; + font: Bold 48px/30px Roboto; + letter-spacing: 0px; + color: #212121; + opacity: 0.36; + padding-top: 2rem; + padding-bottom: 0.5rem; } .counter { - text-align: left; - font: Bold 48px/30px Roboto; - letter-spacing: 0px; - color: #212121; - opacity: 0.85; - padding-top: 2rem; - padding-bottom: 0.5rem; + text-align: left; + font: Bold 48px/30px Roboto; + letter-spacing: 0px; + color: #212121; + opacity: 0.85; + padding-top: 2rem; + padding-bottom: 0.5rem; } .link { - text-align: left; - text-decoration: underline; - font-weight: 300; - font-family: "Roboto", sans-serif; - font-size: 1rem; - letter-spacing: 0px; - color: #1eb5b4; - opacity: 1; + text-align: left; + text-decoration: underline; + font-weight: 300; + font-family: "Roboto", sans-serif; + font-size: 1rem; + letter-spacing: 0px; + color: #1eb5b4; + opacity: 1; } .link-disabled { - text-align: left; - font-weight: 300; - font-family: "Roboto", sans-serif; - font-size: 1rem; - letter-spacing: 0px; - color: #212121; - opacity: 0.6; + text-align: left; + font-weight: 300; + font-family: "Roboto", sans-serif; + font-size: 1rem; + letter-spacing: 0px; + color: #212121; + opacity: 0.6; } .latest-activity-title { - text-align: left; - font-weight: 300; - font-family: "Roboto", sans-serif; - font-size: 1.25rem; - letter-spacing: 0px; - color: #212121; - opacity: 0.6; - padding-bottom: 1.2rem; + text-align: left; + font-weight: 300; + font-family: "Roboto", sans-serif; + font-size: 1.25rem; + letter-spacing: 0px; + color: #212121; + opacity: 0.6; + padding-bottom: 1.2rem; } .dmp-card, .dataset-card { - min-width: 712px; - /* min-height: 308px; */ - background: #ffffff 0% 0% no-repeat padding-box; - box-shadow: 0px 3px 6px #0000001a; - border-radius: 4px; - opacity: 1; - margin-top: 2.43rem; - margin-bottom: 1rem; + min-width: 712px; + /* min-height: 308px; */ + background: #ffffff 0% 0% no-repeat padding-box; + box-shadow: 0px 3px 6px #0000001a; + border-radius: 4px; + opacity: 1; + margin-top: 2.43rem; + margin-bottom: 1rem; } .remove-border-bottom ::ng-deep .mat-tab-header { - border-bottom: none; + border-bottom: none; } input[type="text"] { - background: #fafafa 0% 0% no-repeat padding-box; - border: 1px solid #d1d1d1; - border-radius: 4px; - opacity: 1; - width: 347px; - height: 56px; - font-family: Arial, FontAwesome; - padding-left: 15px; + background: #fafafa 0% 0% no-repeat padding-box; + border: 1px solid #d1d1d1; + border-radius: 4px; + opacity: 1; + width: 347px; + height: 56px; + font-family: Arial, FontAwesome; + padding-left: 15px; } .edited-date { - text-align: left; - font-weight: 300; - font-family: "Roboto", sans-serif; - line-height: 2.4; - letter-spacing: 0px; - color: #212121; - opacity: 0.6; + text-align: left; + font-weight: 300; + font-family: "Roboto", sans-serif; + line-height: 2.4; + letter-spacing: 0px; + color: #212121; + opacity: 0.6; } .dmp-label { - background: #129d99 0% 0% no-repeat padding-box; - border-radius: 4px 0px; - opacity: 1; - width: 67px; - height: 37px; - color: #ffffff; - line-height: 2.4; - opacity: 0.75; + background: #129d99 0% 0% no-repeat padding-box; + border-radius: 4px 0px; + opacity: 1; + width: 67px; + height: 37px; + color: #ffffff; + line-height: 2.4; + opacity: 0.75; } .dataset-label { - width: 158px; - height: 37px; - background: #f7dd72 0% 0% no-repeat padding-box; - border-radius: 4px 0px; - text-align: left; - line-height: 2.8; - font-size: 0.875rem; - letter-spacing: 0px; - color: #212121; - opacity: 0.75; + width: 158px; + height: 37px; + background: #f7dd72 0% 0% no-repeat padding-box; + border-radius: 4px 0px; + text-align: left; + line-height: 2.8; + font-size: 0.875rem; + letter-spacing: 0px; + color: #212121; + opacity: 0.75; } .dmp-title, .dataset-title { - text-align: left; - font-weight: 500; - font-family: "Roboto", sans-serif; - font-size: 1rem; - opacity: 0.81; - padding-top: 0.75rem; - padding-bottom: 0.55rem; - color: #212121; + text-align: left; + font-weight: 500; + font-family: "Roboto", sans-serif; + font-size: 1rem; + opacity: 0.81; + padding-top: 0.75rem; + padding-bottom: 0.55rem; + color: #212121; } .dataset-subtitle, .dmp-subtitle { - display: flex; - flex-direction: row; - text-align: left; - font-weight: 400; - font-family: "Roboto", sans-serif; - font-size: 0.875rem; - opacity: 1; - align-items: center; - color: #848484; + display: flex; + flex-direction: row; + text-align: left; + font-weight: 400; + font-family: "Roboto", sans-serif; + font-size: 0.875rem; + opacity: 1; + align-items: center; + color: #848484; } .dmp-title-draft { - text-align: left; - font-weight: 500; - font-family: "Roboto", sans-serif; - font-size: 1rem; - opacity: 0.81; - padding-top: 0.75rem; - padding-bottom: 0.55rem; - color: #f16868; + text-align: left; + font-weight: 500; + font-family: "Roboto", sans-serif; + font-size: 1rem; + opacity: 0.81; + padding-top: 0.75rem; + padding-bottom: 0.55rem; + color: #f16868; } .icon-align { - display: inline-flex; - vertical-align: middle; - padding-bottom: 0.4rem; + display: inline-flex; + vertical-align: middle; + padding-bottom: 0.4rem; } .dataset-card-actions, .dmp-card-actions { - display: flex; - flex-direction: row; - border-top: 1px solid #dbdbdb; - line-height: 4; - color: #848484; + display: flex; + flex-direction: row; + border-top: 1px solid #dbdbdb; + line-height: 4; + color: #848484; } .dataset-card-actions a, .dmp-card-actions a { - color: #848484 !important; - text-decoration: none !important; + color: #848484 !important; + text-decoration: none !important; } .dataset-card-actions a:hover, .dmp-card-actions a:hover { - color: #129d99 !important; + color: #129d99 !important; } .dmp-dataset-descriptions-title { - color: #000000; - opacity: 0.6; - padding-top: 1.5rem; - padding-bottom: 0.8rem; + color: #000000; + opacity: 0.6; + padding-top: 1.5rem; + padding-bottom: 0.8rem; } .dmp-dataset-descriptions-name { - color: #000000; - opacity: 0.6; - font-weight: 700; + color: #000000; + opacity: 0.6; + font-weight: 700; } .show-more { - color: black !important; + color: black !important; } .show-more:hover { - color: #129d99 !important; + color: #129d99 !important; } .btn-load-more { - border: 2px solid #212121; - border-radius: 30px; - opacity: 1; - width: 132px; - height: 40px; - margin-top: 4.125rem; + border: 2px solid #212121; + border-radius: 30px; + opacity: 1; + width: 132px; + height: 40px; + margin-top: 4.125rem; } .btn-load-more:hover { - background-color: black; - color: white; + background-color: black; + color: white; } .draft { - color: #f16868; + color: #f16868; } .stats { - padding: 0rem 7em 4rem 3rem; + padding: 0rem 7em 4rem 3rem; +} + +.empty-list { + color: #212121; + font-size: 1.25rem; + font-weight: 300; + letter-spacing: 0px; + color: #212121; + opacity: 0.6; + display: flex; + padding-top: 4.68rem; + justify-content: center; +} + +.add-dataset { + width: 142px; + height: 40px; + background: #f7dd72 0% 0% no-repeat padding-box; + box-shadow: 0px 3px 6px #1e202029; + border-radius: 30px; + opacity: 1; + margin-top: 2.5rem; + margin-bottom: 1.5rem; } ::ng-deep .mat-tab-group.mat-primary .mat-ink-bar, .mat-tab-nav-bar.mat-primary .mat-ink-bar { - background: #129d99; - height: 5px; + background: #129d99; + height: 5px; } ::ng-deep .mat-tab-label { - min-width: auto !important; - background-color: transparent; + min-width: auto !important; + background-color: transparent; } ::ng-deep .mat-tab-label.mat-tab-label-active { - min-width: auto !important; - background-color: transparent; - font-weight: 700; + min-width: auto !important; + background-color: transparent; + font-weight: 700; } /* ::ng-deep .mat-tab-group { diff --git a/dmp-frontend/src/assets/i18n/en.json b/dmp-frontend/src/assets/i18n/en.json index 10bb1e2d2..1220fc8f6 100644 --- a/dmp-frontend/src/assets/i18n/en.json +++ b/dmp-frontend/src/assets/i18n/en.json @@ -1141,10 +1141,14 @@ "GRANTS": "Grants", "RELATED-ORGANISATIONS": "Related Organisations", "DRAFTS": "Drafts", + "ALL": "All", + "EMPTY-LIST": "Nothing here yet.", + "LATEST-ACTIVITY": "Latest Activity", "DMP-ABOUT-BEG": "A DMP in Argos consists of key information about research, such as purpose, objectives and researchers involved, but also about documentation of research datasets, namely", "DMP-ABOUT-END": ", that highlight the steps followed and the means used across data management activities.", "ACTIONS": { "ADD-DATASET-DESCRIPTION": "Add Dataset Description", + "ADD-DATASET": "Add Dataset", "ADD-DMP-DESCRIPTION": "Add DMP Description" } }, diff --git a/dmp-frontend/src/assets/i18n/es.json b/dmp-frontend/src/assets/i18n/es.json index 8c67bed8f..54ceaad32 100644 --- a/dmp-frontend/src/assets/i18n/es.json +++ b/dmp-frontend/src/assets/i18n/es.json @@ -1128,8 +1128,12 @@ "GRANTS": "Subvenciones", "RELATED-ORGANISATIONS": "Organizaciones Relacionadas", "DRAFTS": "Borradores", + "ALL": "All", + "LATEST-ACTIVITY": "Latest Activity", + "EMPTY-LIST": "Nothing here yet.", "ACTIONS": { "ADD-DATASET-DESCRIPTION": "Agregar Dataset Descripción", + "ADD-DATASET": "Add Dataset", "ADD-DMP-DESCRIPTION": "Agregar DMP Descripción" } }, diff --git a/dmp-frontend/src/assets/i18n/gr.json b/dmp-frontend/src/assets/i18n/gr.json index 5bc65bc3d..1a815f9c1 100644 --- a/dmp-frontend/src/assets/i18n/gr.json +++ b/dmp-frontend/src/assets/i18n/gr.json @@ -1116,8 +1116,12 @@ "GRANTS": "Grants", "RELATED-ORGANISATIONS": "Σχετικοί Οργανισμοί", "DRAFTS": "Προσχέδια", + "ALL": "Όλα", + "LATEST-ACTIVITY": "Latest Activity", + "EMPTY-LIST": "Nothing here yet.", "ACTIONS": { "ADD-DATASET-DESCRIPTION": "Προσθήκη Περιγραφή Dataset", + "ADD-DATASET": "Add Dataset", "ADD-DMP-DESCRIPTION": "Προσθήκη Περιγραφή DMP" } }, From b57f6fb73cef3a8d2c6398ad7536845b4e3a57b2 Mon Sep 17 00:00:00 2001 From: George Kalampokis Date: Fri, 3 Jul 2020 10:43:19 +0300 Subject: [PATCH 029/364] Recent Activity controller will require a custom DataTable Request --- .../controllers/DashBoardController.java | 5 +-- .../logic/managers/DashBoardManager.java | 28 +++++++++++----- .../RecentActivityTableRequest.java | 33 +++++++++++++++++++ .../services/dashboard/dashboard.service.ts | 5 +-- 4 files changed, 59 insertions(+), 12 deletions(-) create mode 100644 dmp-backend/web/src/main/java/eu/eudat/models/data/dashboard/recent/tablerequest/RecentActivityTableRequest.java 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 65e7c3a09..0e3e7d936 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 @@ -6,6 +6,7 @@ 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.recent.model.RecentActivityModel; +import eu.eudat.models.data.dashboard.recent.tablerequest.RecentActivityTableRequest; import eu.eudat.models.data.dashboard.searchbar.SearchBarItem; import eu.eudat.models.data.dashboard.statistics.DashBoardStatistics; import eu.eudat.models.data.helpers.responses.ResponseItem; @@ -47,9 +48,9 @@ public class DashBoardController extends BaseController { @RequestMapping(method = RequestMethod.POST, value = {"/dashboard/recentActivity"}, produces = "application/json") @Transactional - public ResponseEntity>> getNewRecentActivity(@RequestBody RecentActivityCriteria criteria, @RequestParam(name = "numOfActivities", required = false, defaultValue = "5") Integer numberOfActivities, + public ResponseEntity>> getNewRecentActivity(@RequestBody RecentActivityTableRequest tableRequest, @ClaimedAuthorities(claims = {Authorities.ADMIN, Authorities.MANAGER, Authorities.USER, Authorities.ANONYMOUS}) Principal principal) { - List statistics = dashBoardManager.getNewRecentActivity(criteria, principal, numberOfActivities); + List statistics = dashBoardManager.getNewRecentActivity(tableRequest, principal); return ResponseEntity.status(HttpStatus.OK).body(new ResponseItem>().status(ApiMessageCode.NO_MESSAGE).payload(statistics)); } 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 4b190e65a..f45382bab 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 @@ -18,6 +18,7 @@ import eu.eudat.models.data.dashboard.recent.RecentActivityData; import eu.eudat.models.data.dashboard.recent.model.RecentActivityModel; import eu.eudat.models.data.dashboard.recent.model.RecentDatasetModel; import eu.eudat.models.data.dashboard.recent.model.RecentDmpModel; +import eu.eudat.models.data.dashboard.recent.tablerequest.RecentActivityTableRequest; import eu.eudat.models.data.dashboard.searchbar.SearchBarItem; import eu.eudat.models.data.dashboard.statistics.DashBoardStatistics; import eu.eudat.models.data.listingmodels.DataManagementPlanListingModel; @@ -35,11 +36,19 @@ import java.io.IOException; import java.util.*; import java.util.concurrent.CompletableFuture; import java.util.stream.Collectors; +import java.util.stream.Stream; @Component public class DashBoardManager { private static final Logger logger = LoggerFactory.getLogger(DashBoardManager.class); + private final Map> comparators = Stream.of(new Object[][] { + { "modified", Comparator.comparing(o -> ((RecentActivityModel)o).getModified())}, + { "created", Comparator.comparing(o -> ((RecentActivityModel)o).getCreated())}, + { "label", Comparator.comparing(o -> ((RecentActivityModel)o).getTitle())}, + { "status", Comparator.comparing(o -> ((RecentActivityModel)o).getStatus())} + }).collect(Collectors.toMap(data -> (String) data[0], data -> (Comparator)data[1])); + private ApiContext apiContext; private DatabaseRepository databaseRepository; @@ -183,18 +192,18 @@ public class DashBoardManager { } @Transactional - public List getNewRecentActivity(RecentActivityCriteria criteria, Principal principal, Integer numberofactivities) { + public List getNewRecentActivity(RecentActivityTableRequest tableRequest, Principal principal) { List recentActivityModels = new ArrayList<>(); DMPDao dataManagementPlanRepository = databaseRepository.getDmpDao(); DatasetDao datasetRepository = databaseRepository.getDatasetDao(); UserInfo user = new UserInfo(); user.setId(principal.getId()); DatasetCriteria datasetCriteria = new DatasetCriteria(); - datasetCriteria.setLike(criteria.getLike()); + datasetCriteria.setLike(tableRequest.getCriteria().getLike()); datasetCriteria.setAllVersions(false); DataManagementPlanCriteria dataManagementPlanCriteria = new DataManagementPlanCriteria(); dataManagementPlanCriteria.setAllVersions(false); - dataManagementPlanCriteria.setLike(criteria.getLike()); + dataManagementPlanCriteria.setLike(tableRequest.getCriteria().getLike()); QueryableList dmpList; QueryableList datasetList; @@ -213,8 +222,9 @@ public class DashBoardManager { CompletableFuture> dmps = dmpList .withHint(HintedModelFactory.getHint(DataManagementPlanListingModel.class)) - .orderBy((builder, root) -> builder.desc(root.get(criteria.getOrder()))) - .take(numberofactivities) + .orderBy((builder, root) -> builder.desc(root.get(tableRequest.getCriteria().getOrder()))) + .skip(tableRequest.getOffset()) + .take(tableRequest.getSize()) .selectAsync(item -> { return new RecentDmpModel().fromEntity(item); }) @@ -222,15 +232,17 @@ public class DashBoardManager { CompletableFuture> datasets = datasetList .withHint(HintedModelFactory.getHint(DatasetListingModel.class)) - .orderBy((builder, root) -> builder.desc(root.get(criteria.getOrder()))) - .take(numberofactivities) + .orderBy((builder, root) -> builder.desc(root.get(tableRequest.getCriteria().getOrder()))) + .skip(tableRequest.getOffset()) + .take(tableRequest.getSize()) .selectAsync(item -> { return new RecentDatasetModel().fromEntity(item); }) .whenComplete((datasetActivities, throwable) -> recentActivityModels.addAll(datasetActivities)); CompletableFuture.allOf(dmps, datasets).join(); - return recentActivityModels.stream().sorted(Comparator.comparing(RecentActivityModel::getModified)).collect(Collectors.toList()); + + return recentActivityModels.stream().sorted(this.comparators.get(tableRequest.getCriteria().getOrder())).collect(Collectors.toList()); } public List searchUserData(String like, Principal principal) { diff --git a/dmp-backend/web/src/main/java/eu/eudat/models/data/dashboard/recent/tablerequest/RecentActivityTableRequest.java b/dmp-backend/web/src/main/java/eu/eudat/models/data/dashboard/recent/tablerequest/RecentActivityTableRequest.java new file mode 100644 index 000000000..bf6678e9e --- /dev/null +++ b/dmp-backend/web/src/main/java/eu/eudat/models/data/dashboard/recent/tablerequest/RecentActivityTableRequest.java @@ -0,0 +1,33 @@ +package eu.eudat.models.data.dashboard.recent.tablerequest; + +import eu.eudat.criteria.RecentActivityCriteria; + +public class RecentActivityTableRequest { + private RecentActivityCriteria criteria; + private int offset; + private int size; + + public int getOffset() { + return offset; + } + + public void setOffset(int offset) { + this.offset = offset; + } + + public int getSize() { + return size; + } + + public void setSize(int size) { + this.size = size; + } + + public RecentActivityCriteria getCriteria() { + return criteria; + } + + public void setCriteria(RecentActivityCriteria criteria) { + this.criteria = criteria; + } +} diff --git a/dmp-frontend/src/app/core/services/dashboard/dashboard.service.ts b/dmp-frontend/src/app/core/services/dashboard/dashboard.service.ts index a10a33131..93377f52b 100644 --- a/dmp-frontend/src/app/core/services/dashboard/dashboard.service.ts +++ b/dmp-frontend/src/app/core/services/dashboard/dashboard.service.ts @@ -7,6 +7,7 @@ import { BaseHttpService } from '../http/base-http.service'; import { ConfigurationService } from '../configuration/configuration.service'; import { RecentActivityModel } from '@app/core/model/recent-activity/recent-activity.model'; import { RecentActivityCriteria } from '@app/core/query/recent-activity/recent-activity-criteria'; +import { DataTableRequest } from '@app/core/model/data-table/data-table-request'; @Injectable() export class DashboardService { @@ -27,7 +28,7 @@ export class DashboardService { return this.http.get(this.actionUrl + 'me/getStatistics', { headers: this.headers }); } - getRecentAcitvity(criteria: RecentActivityCriteria): Observable { - return this.http.post(this.actionUrl + 'recentActivity', criteria, {headers: this.headers}); + getRecentAcitvity(request: DataTableRequest): Observable { + return this.http.post(this.actionUrl + 'recentActivity', request, {headers: this.headers}); } } From 71279a716e325b7c3edac02e2b547ea7a891e633 Mon Sep 17 00:00:00 2001 From: George Kalampokis Date: Fri, 3 Jul 2020 10:43:54 +0300 Subject: [PATCH 030/364] Minor changes to Recent Activity Model --- .../recent/model/RecentActivityModel.java | 21 ++++++++++++++++++ .../recent/model/RecentDatasetModel.java | 3 +++ .../recent/model/RecentDmpModel.java | 22 ++----------------- 3 files changed, 26 insertions(+), 20 deletions(-) diff --git a/dmp-backend/web/src/main/java/eu/eudat/models/data/dashboard/recent/model/RecentActivityModel.java b/dmp-backend/web/src/main/java/eu/eudat/models/data/dashboard/recent/model/RecentActivityModel.java index 8f72a044d..66587a849 100644 --- a/dmp-backend/web/src/main/java/eu/eudat/models/data/dashboard/recent/model/RecentActivityModel.java +++ b/dmp-backend/web/src/main/java/eu/eudat/models/data/dashboard/recent/model/RecentActivityModel.java @@ -1,6 +1,9 @@ package eu.eudat.models.data.dashboard.recent.model; +import eu.eudat.models.data.listingmodels.UserInfoListingModel; + import java.util.Date; +import java.util.List; public abstract class RecentActivityModel { private String id; @@ -17,6 +20,8 @@ public abstract class RecentActivityModel { private Date publishedAt; private String profile; private RecentActivityType type; + private List users; + private Boolean isPublic; public String getId() { return id; @@ -130,6 +135,22 @@ public abstract class RecentActivityModel { this.type = type; } + public List getUsers() { + return users; + } + + public void setUsers(List users) { + this.users = users; + } + + public Boolean getPublic() { + return isPublic; + } + + public void setPublic(Boolean aPublic) { + isPublic = aPublic; + } + public abstract RecentActivityModel fromEntity(T entity); public enum RecentActivityType { diff --git a/dmp-backend/web/src/main/java/eu/eudat/models/data/dashboard/recent/model/RecentDatasetModel.java b/dmp-backend/web/src/main/java/eu/eudat/models/data/dashboard/recent/model/RecentDatasetModel.java index c1eddfd42..d930ebfe8 100644 --- a/dmp-backend/web/src/main/java/eu/eudat/models/data/dashboard/recent/model/RecentDatasetModel.java +++ b/dmp-backend/web/src/main/java/eu/eudat/models/data/dashboard/recent/model/RecentDatasetModel.java @@ -4,6 +4,7 @@ import eu.eudat.data.entities.Dataset; import eu.eudat.logic.utilities.helpers.LabelBuilder; import eu.eudat.models.data.dataset.DataRepository; import eu.eudat.models.data.dataset.Service; +import eu.eudat.models.data.listingmodels.UserInfoListingModel; import java.util.Date; import java.util.stream.Collectors; @@ -75,6 +76,8 @@ public class RecentDatasetModel extends RecentActivityModel { this.setDmpId(entity.getDmp() != null ? entity.getDmp().getId().toString() : ""); this.setRegistries(LabelBuilder.getLabel(entity.getRegistries().stream().map(item -> new eu.eudat.models.data.dataset.Registry().fromDataModel(item)).collect(Collectors.toList()))); this.setServices(LabelBuilder.getLabel(entity.getServices().stream().map(item -> new Service().fromDataModel(item.getService())).collect(Collectors.toList()))); + this.setPublic(entity.getDmp().isPublic()); + this.setUsers(entity.getDmp().getUsers().stream().map(x -> new UserInfoListingModel().fromDataModel(x)).collect(Collectors.toList())); return this; } diff --git a/dmp-backend/web/src/main/java/eu/eudat/models/data/dashboard/recent/model/RecentDmpModel.java b/dmp-backend/web/src/main/java/eu/eudat/models/data/dashboard/recent/model/RecentDmpModel.java index 82b630cd9..68e241d87 100644 --- a/dmp-backend/web/src/main/java/eu/eudat/models/data/dashboard/recent/model/RecentDmpModel.java +++ b/dmp-backend/web/src/main/java/eu/eudat/models/data/dashboard/recent/model/RecentDmpModel.java @@ -19,8 +19,6 @@ public class RecentDmpModel extends RecentActivityModel { private List associatedProfiles; private String organisations; private UUID groupId; - private List users; - private Boolean isPublic; public String getDoi() { @@ -71,22 +69,6 @@ public class RecentDmpModel extends RecentActivityModel { this.groupId = groupId; } - public List getUsers() { - return users; - } - - public void setUsers(List users) { - this.users = users; - } - - public Boolean getPublic() { - return isPublic; - } - - public void setPublic(Boolean aPublic) { - isPublic = aPublic; - } - @Override @Transactional public RecentActivityModel fromEntity(DMP entity) { @@ -105,11 +87,11 @@ public class RecentDmpModel extends RecentActivityModel { this.setGrantAbbreviation(entity.getGrant().getAbbreviation()); this.setGrantId(entity.getGrant().getId().toString()); this.groupId = entity.getGroupId(); - this.isPublic = entity.isPublic(); + this.setPublic(entity.isPublic()); this.organisations = LabelBuilder.getLabel(entity.getOrganisations().stream().map(item -> new Organisation().fromDataModel(item)).collect(Collectors.toList())); if (entity.getProfile() != null) this.setProfile(entity.getProfile().getLabel()); this.setPublishedAt(entity.getPublishedAt()); - this.users = entity.getUsers().stream().map(x -> new UserInfoListingModel().fromDataModel(x)).collect(Collectors.toList()); + this.setUsers(entity.getUsers().stream().map(x -> new UserInfoListingModel().fromDataModel(x)).collect(Collectors.toList())); return this; } } From 2fb270d66c69e37bca0e699e20198a067f9a6280 Mon Sep 17 00:00:00 2001 From: George Kalampokis Date: Fri, 3 Jul 2020 10:47:04 +0300 Subject: [PATCH 031/364] Fix minor issues with the new merge --- .../recent-edited-activity.component.ts | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/dmp-frontend/src/app/ui/dashboard/recent-edited-activity/recent-edited-activity.component.ts b/dmp-frontend/src/app/ui/dashboard/recent-edited-activity/recent-edited-activity.component.ts index 609fab7b3..aeaa2088e 100644 --- a/dmp-frontend/src/app/ui/dashboard/recent-edited-activity/recent-edited-activity.component.ts +++ b/dmp-frontend/src/app/ui/dashboard/recent-edited-activity/recent-edited-activity.component.ts @@ -67,9 +67,9 @@ export class RecentEditedActivityComponent extends BaseComponent implements OnIn allDataTableRequest.criteria = new RecentActivityCriteria(); allDataTableRequest.criteria.like = ""; this.dashboardService - .getPaged(allDataTableRequest) + .getRecentAcitvity(allDataTableRequest) .subscribe(response => { - this.allRecentActivities = response.data; + this.allRecentActivities = response; this.totalCountRecentEdited.emit(this.pageSize); }); } @@ -370,9 +370,9 @@ export class RecentEditedActivityComponent extends BaseComponent implements OnIn request.criteria = new RecentActivityCriteria(); request.criteria.like = ""; - this.dashboardService.getPaged(request).pipe(takeUntil(this._destroyed)).subscribe(result => { + this.dashboardService.getRecentAcitvity(request).pipe(takeUntil(this._destroyed)).subscribe(result => { if (!result) { return []; } - this.allRecentActivities = this.allRecentActivities.concat(result.data); + this.allRecentActivities = this.allRecentActivities.concat(result); }); this.startIndex = this.startIndex + this.pageSize; From 150667350c70199637e22d3f66b802a8c628f5fb Mon Sep 17 00:00:00 2001 From: George Kalampokis Date: Fri, 3 Jul 2020 11:23:13 +0300 Subject: [PATCH 032/364] Further Fixes over Recent Activity model --- .../dashboard/recent/model/RecentActivityModel.java | 12 ++++++------ .../dashboard/recent/model/RecentDatasetModel.java | 3 ++- .../data/dashboard/recent/model/RecentDmpModel.java | 2 +- .../tablerequest/RecentActivityTableRequest.java | 10 +++++----- .../recent-edited-activity.component.html | 4 ++-- 5 files changed, 16 insertions(+), 15 deletions(-) diff --git a/dmp-backend/web/src/main/java/eu/eudat/models/data/dashboard/recent/model/RecentActivityModel.java b/dmp-backend/web/src/main/java/eu/eudat/models/data/dashboard/recent/model/RecentActivityModel.java index 66587a849..f1a23f776 100644 --- a/dmp-backend/web/src/main/java/eu/eudat/models/data/dashboard/recent/model/RecentActivityModel.java +++ b/dmp-backend/web/src/main/java/eu/eudat/models/data/dashboard/recent/model/RecentActivityModel.java @@ -19,7 +19,7 @@ public abstract class RecentActivityModel { private Date finalizedAt; private Date publishedAt; private String profile; - private RecentActivityType type; + private int type; private List users; private Boolean isPublic; @@ -127,11 +127,11 @@ public abstract class RecentActivityModel { this.profile = profile; } - public RecentActivityType getType() { + public int getType() { return type; } - public void setType(RecentActivityType type) { + public void setType(int type) { this.type = type; } @@ -154,7 +154,7 @@ public abstract class RecentActivityModel { public abstract RecentActivityModel fromEntity(T entity); public enum RecentActivityType { - DMP(1), DATASET(2); + DMP(2), DATASET(1); private final int index; @@ -168,9 +168,9 @@ public abstract class RecentActivityModel { public static RecentActivityType fromIndex(int index) { switch (index) { - case 1: - return DMP; case 2: + return DMP; + case 1: return DATASET; default: throw new IllegalArgumentException("Recent Activity Type : \"" + index + "\" is not supported."); diff --git a/dmp-backend/web/src/main/java/eu/eudat/models/data/dashboard/recent/model/RecentDatasetModel.java b/dmp-backend/web/src/main/java/eu/eudat/models/data/dashboard/recent/model/RecentDatasetModel.java index d930ebfe8..baae02ebd 100644 --- a/dmp-backend/web/src/main/java/eu/eudat/models/data/dashboard/recent/model/RecentDatasetModel.java +++ b/dmp-backend/web/src/main/java/eu/eudat/models/data/dashboard/recent/model/RecentDatasetModel.java @@ -58,6 +58,7 @@ public class RecentDatasetModel extends RecentActivityModel { @Override public RecentActivityModel fromEntity(Dataset entity) { + this.setType(RecentActivityType.DATASET.getIndex()); this.setId(entity.getId().toString()); this.setTitle(entity.getLabel()); this.setDescription(entity.getDescription()); @@ -82,7 +83,7 @@ public class RecentDatasetModel extends RecentActivityModel { } public RecentDatasetModel fromDmpEntity(Dataset entity) { - this.setType(RecentActivityType.DATASET); + this.setType(RecentActivityType.DATASET.getIndex()); this.setId(entity.getId().toString()); this.setTitle(entity.getLabel()); this.setDescription(entity.getDescription()); diff --git a/dmp-backend/web/src/main/java/eu/eudat/models/data/dashboard/recent/model/RecentDmpModel.java b/dmp-backend/web/src/main/java/eu/eudat/models/data/dashboard/recent/model/RecentDmpModel.java index 68e241d87..d6a879819 100644 --- a/dmp-backend/web/src/main/java/eu/eudat/models/data/dashboard/recent/model/RecentDmpModel.java +++ b/dmp-backend/web/src/main/java/eu/eudat/models/data/dashboard/recent/model/RecentDmpModel.java @@ -72,7 +72,7 @@ public class RecentDmpModel extends RecentActivityModel { @Override @Transactional public RecentActivityModel fromEntity(DMP entity) { - this.setType(RecentActivityType.DMP); + this.setType(RecentActivityType.DMP.getIndex()); this.setId(entity.getId().toString()); this.setTitle(entity.getLabel()); this.setDescription(entity.getDescription()); diff --git a/dmp-backend/web/src/main/java/eu/eudat/models/data/dashboard/recent/tablerequest/RecentActivityTableRequest.java b/dmp-backend/web/src/main/java/eu/eudat/models/data/dashboard/recent/tablerequest/RecentActivityTableRequest.java index bf6678e9e..43a68c822 100644 --- a/dmp-backend/web/src/main/java/eu/eudat/models/data/dashboard/recent/tablerequest/RecentActivityTableRequest.java +++ b/dmp-backend/web/src/main/java/eu/eudat/models/data/dashboard/recent/tablerequest/RecentActivityTableRequest.java @@ -5,7 +5,7 @@ import eu.eudat.criteria.RecentActivityCriteria; public class RecentActivityTableRequest { private RecentActivityCriteria criteria; private int offset; - private int size; + private int length; public int getOffset() { return offset; @@ -15,12 +15,12 @@ public class RecentActivityTableRequest { this.offset = offset; } - public int getSize() { - return size; + public int getLength() { + return length; } - public void setSize(int size) { - this.size = size; + public void setLength(int length) { + this.length = length; } public RecentActivityCriteria getCriteria() { diff --git a/dmp-frontend/src/app/ui/dashboard/recent-edited-activity/recent-edited-activity.component.html b/dmp-frontend/src/app/ui/dashboard/recent-edited-activity/recent-edited-activity.component.html index 4975212cb..d4bb29370 100644 --- a/dmp-frontend/src/app/ui/dashboard/recent-edited-activity/recent-edited-activity.component.html +++ b/dmp-frontend/src/app/ui/dashboard/recent-edited-activity/recent-edited-activity.component.html @@ -1,6 +1,6 @@
-
+
@@ -68,7 +68,7 @@
-
+
From fbb2dc214a6a25a7563a9102f7479856ba5fb952 Mon Sep 17 00:00:00 2001 From: apapachristou Date: Fri, 3 Jul 2020 11:23:18 +0300 Subject: [PATCH 033/364] Adda language --- dmp-frontend/src/assets/i18n/en.json | 1 + dmp-frontend/src/assets/i18n/es.json | 1 + dmp-frontend/src/assets/i18n/gr.json | 3 ++- 3 files changed, 4 insertions(+), 1 deletion(-) diff --git a/dmp-frontend/src/assets/i18n/en.json b/dmp-frontend/src/assets/i18n/en.json index 1220fc8f6..20e9debf8 100644 --- a/dmp-frontend/src/assets/i18n/en.json +++ b/dmp-frontend/src/assets/i18n/en.json @@ -395,6 +395,7 @@ "EDITED": "Edited", "VERSION": "Version", "CONTAINED-DATASETS": "Contained Dataset Descriptions", + "TEXT-INFO": "Information in a DMP show how datasets have been collected and/or generated, how they have been processed and analysed, i.e. using which tools, standards, methodologies etc, but also where and how datasets are backed up, published and preserved, including any costs associated with personnel dedicated for data curation/ stewardship activities or costs for acquiring or building data management services. Not sure how a DMP looks in practice? Browse Public DMPs and LIBER community in Zenodo to get an idea!", "COLUMNS": { "NAME": "Name", "GRANT": "Grant", diff --git a/dmp-frontend/src/assets/i18n/es.json b/dmp-frontend/src/assets/i18n/es.json index 54ceaad32..dd931b4c6 100644 --- a/dmp-frontend/src/assets/i18n/es.json +++ b/dmp-frontend/src/assets/i18n/es.json @@ -394,6 +394,7 @@ "EDITED": "Editado en", "VERSION": "Versión", "CONTAINED-DATASETS": "Descripción del Dataset contenidos", + "TEXT-INFO": "Information in a DMP show how datasets have been collected and/or generated, how they have been processed and analysed, i.e. using which tools, standards, methodologies etc, but also where and how datasets are backed up, published and preserved, including any costs associated with personnel dedicated for data curation/ stewardship activities or costs for acquiring or building data management services. Not sure how a DMP looks in practice? Browse Public DMPs and LIBER community in Zenodo to get an idea!", "COLUMNS": { "NAME": "Nombre", "GRANT": "Subvención", diff --git a/dmp-frontend/src/assets/i18n/gr.json b/dmp-frontend/src/assets/i18n/gr.json index 1a815f9c1..1c5aa3a0d 100644 --- a/dmp-frontend/src/assets/i18n/gr.json +++ b/dmp-frontend/src/assets/i18n/gr.json @@ -394,6 +394,7 @@ "EDITED": "Επεξεργάστηκε", "VERSION": "Έκδοση", "CONTAINED-DATASETS": "Δεδομένα που συμπεριλαμβάνει", + "TEXT-INFO": "Information in a DMP show how datasets have been collected and/or generated, how they have been processed and analysed, i.e. using which tools, standards, methodologies etc, but also where and how datasets are backed up, published and preserved, including any costs associated with personnel dedicated for data curation/ stewardship activities or costs for acquiring or building data management services. Not sure how a DMP looks in practice? Browse Public DMPs and LIBER community in Zenodo to get an idea!", "COLUMNS": { "NAME": "Τίτλος", "GRANT": "Επιχορήγηση", @@ -434,7 +435,7 @@ "DOWNLOAD-DOCX": "Λήψη Document", "DOWNLOAD-PDF": "Λήψη PDF", "SETTINGS": "Ρυθμίσεις", - "GETDOI": "Λήψη μονοσήμαντου αναγνωριστικού ψηφιακού αντικειμένου (DOI)" + "GETDOI": "Λήψη μονοσήμαντου αναγνωριστικού ψηφιακού αντικειμένου (DOI)", }, "TOOLTIP": { "DMP-STATUS": { From f1dc5f5f5fc99a13beaf3abfa669347af463aafd Mon Sep 17 00:00:00 2001 From: apapachristou Date: Fri, 3 Jul 2020 12:01:34 +0300 Subject: [PATCH 034/364] Adds language --- dmp-frontend/src/assets/i18n/en.json | 3 ++- dmp-frontend/src/assets/i18n/es.json | 1 + dmp-frontend/src/assets/i18n/gr.json | 1 + 3 files changed, 4 insertions(+), 1 deletion(-) diff --git a/dmp-frontend/src/assets/i18n/en.json b/dmp-frontend/src/assets/i18n/en.json index 77133347a..db1b97c8b 100644 --- a/dmp-frontend/src/assets/i18n/en.json +++ b/dmp-frontend/src/assets/i18n/en.json @@ -396,7 +396,8 @@ "EDITED": "Edited", "VERSION": "Version", "CONTAINED-DATASETS": "Contained Dataset Descriptions", - "TEXT-INFO": "Information in a DMP show how datasets have been collected and/or generated, how they have been processed and analysed, i.e. using which tools, standards, methodologies etc, but also where and how datasets are backed up, published and preserved, including any costs associated with personnel dedicated for data curation/ stewardship activities or costs for acquiring or building data management services. Not sure how a DMP looks in practice? Browse Public DMPs and LIBER community in Zenodo to get an idea!", + "TEXT-INFO": "Information in a DMP show how datasets have been collected and/or generated, how they have been processed and analysed, i.e. using which tools, standards, methodologies etc, but also where and how datasets are backed up, published and preserved, including any costs associated with personnel dedicated for data curation/ stewardship activities or costs for acquiring or building data management services.", + "TEXT-INFO-QUESTION": "Not sure how a DMP looks in practice? Browse Public DMPs and LIBER community in Zenodo to get an idea!", "COLUMNS": { "NAME": "Name", "GRANT": "Grant", diff --git a/dmp-frontend/src/assets/i18n/es.json b/dmp-frontend/src/assets/i18n/es.json index 3af53342c..70de7834e 100644 --- a/dmp-frontend/src/assets/i18n/es.json +++ b/dmp-frontend/src/assets/i18n/es.json @@ -396,6 +396,7 @@ "VERSION": "Versión", "CONTAINED-DATASETS": "Descripción del Dataset contenidos", "TEXT-INFO": "Information in a DMP show how datasets have been collected and/or generated, how they have been processed and analysed, i.e. using which tools, standards, methodologies etc, but also where and how datasets are backed up, published and preserved, including any costs associated with personnel dedicated for data curation/ stewardship activities or costs for acquiring or building data management services. Not sure how a DMP looks in practice? Browse Public DMPs and LIBER community in Zenodo to get an idea!", + "TEXT-INFO-QUESTION": "Not sure how a DMP looks in practice? Browse Public DMPs and LIBER community in Zenodo to get an idea!", "COLUMNS": { "NAME": "Nombre", "GRANT": "Subvención", diff --git a/dmp-frontend/src/assets/i18n/gr.json b/dmp-frontend/src/assets/i18n/gr.json index c3fba4c5b..c3d7b0710 100644 --- a/dmp-frontend/src/assets/i18n/gr.json +++ b/dmp-frontend/src/assets/i18n/gr.json @@ -396,6 +396,7 @@ "VERSION": "Έκδοση", "CONTAINED-DATASETS": "Δεδομένα που συμπεριλαμβάνει", "TEXT-INFO": "Information in a DMP show how datasets have been collected and/or generated, how they have been processed and analysed, i.e. using which tools, standards, methodologies etc, but also where and how datasets are backed up, published and preserved, including any costs associated with personnel dedicated for data curation/ stewardship activities or costs for acquiring or building data management services. Not sure how a DMP looks in practice? Browse Public DMPs and LIBER community in Zenodo to get an idea!", + "TEXT-INFO-QUESTION": "Not sure how a DMP looks in practice? Browse Public DMPs and LIBER community in Zenodo to get an idea!", "COLUMNS": { "NAME": "Τίτλος", "GRANT": "Επιχορήγηση", From acf8b587286e093e6ba3a75c2bf566c68f6690e7 Mon Sep 17 00:00:00 2001 From: George Kalampokis Date: Fri, 3 Jul 2020 12:18:53 +0300 Subject: [PATCH 035/364] Fixed and improved the recent activity manager --- .../eudat/logic/managers/DashBoardManager.java | 18 +++++++++++++----- 1 file changed, 13 insertions(+), 5 deletions(-) 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 f45382bab..04bddbd5d 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 @@ -224,25 +224,33 @@ public class DashBoardManager { .withHint(HintedModelFactory.getHint(DataManagementPlanListingModel.class)) .orderBy((builder, root) -> builder.desc(root.get(tableRequest.getCriteria().getOrder()))) .skip(tableRequest.getOffset()) - .take(tableRequest.getSize()) + .take(tableRequest.getLength()) .selectAsync(item -> { return new RecentDmpModel().fromEntity(item); }) - .whenComplete((dmpActivities, throwable) -> recentActivityModels.addAll(dmpActivities)); + .whenComplete((dmpActivities, throwable) -> { + if (dmpActivities != null) { + recentActivityModels.addAll(dmpActivities); + } + }); CompletableFuture> datasets = datasetList .withHint(HintedModelFactory.getHint(DatasetListingModel.class)) .orderBy((builder, root) -> builder.desc(root.get(tableRequest.getCriteria().getOrder()))) .skip(tableRequest.getOffset()) - .take(tableRequest.getSize()) + .take(tableRequest.getLength()) .selectAsync(item -> { return new RecentDatasetModel().fromEntity(item); }) - .whenComplete((datasetActivities, throwable) -> recentActivityModels.addAll(datasetActivities)); + .whenComplete((datasetActivities, throwable) -> { + if (datasetActivities != null) { + recentActivityModels.addAll(datasetActivities); + } + }); CompletableFuture.allOf(dmps, datasets).join(); - return recentActivityModels.stream().sorted(this.comparators.get(tableRequest.getCriteria().getOrder())).collect(Collectors.toList()); + return recentActivityModels.stream().sorted(this.comparators.get(tableRequest.getCriteria().getOrder())).limit(tableRequest.getLength()).collect(Collectors.toList()); } public List searchUserData(String like, Principal principal) { From 2cb6583bf4cf9f4ac155a5c7c15ec2f9e16469fa Mon Sep 17 00:00:00 2001 From: apapachristou Date: Fri, 3 Jul 2020 12:45:52 +0300 Subject: [PATCH 036/364] Removes guest component --- dmp-frontend/src/app/app-routing.module.ts | 7 - dmp-frontend/src/app/app.component.html | 19 +- dmp-frontend/src/app/app.component.ts | 20 +- dmp-frontend/src/app/app.module.ts | 2 - .../src/app/ui/guest/guest.component.html | 344 --------- .../src/app/ui/guest/guest.component.scss | 724 ------------------ .../src/app/ui/guest/guest.component.ts | 61 -- dmp-frontend/src/app/ui/guest/guest.module.ts | 17 - .../src/app/ui/guest/guest.routing.ts | 16 - .../src/app/ui/navbar/navbar.component.html | 2 +- dmp-frontend/src/assets/i18n/gr.json | 2 +- 11 files changed, 27 insertions(+), 1187 deletions(-) delete mode 100644 dmp-frontend/src/app/ui/guest/guest.component.html delete mode 100644 dmp-frontend/src/app/ui/guest/guest.component.scss delete mode 100644 dmp-frontend/src/app/ui/guest/guest.component.ts delete mode 100644 dmp-frontend/src/app/ui/guest/guest.module.ts delete mode 100644 dmp-frontend/src/app/ui/guest/guest.routing.ts diff --git a/dmp-frontend/src/app/app-routing.module.ts b/dmp-frontend/src/app/app-routing.module.ts index b60b49d78..d847ca441 100644 --- a/dmp-frontend/src/app/app-routing.module.ts +++ b/dmp-frontend/src/app/app-routing.module.ts @@ -155,13 +155,6 @@ const appRoutes: Routes = [ title: 'GENERAL.TITLES.COOKIES-POLICY' } }, - { - path: 'guest', - loadChildren: () => import('./ui/guest/guest.module').then(m => m.GuestModule), - data: { - breadcrumb: true - } - }, { path: 'home', loadChildren: () => import('./ui/dashboard/dashboard.module').then(m => m.DashboardModule), diff --git a/dmp-frontend/src/app/app.component.html b/dmp-frontend/src/app/app.component.html index 6db7d1e40..68f4c4a75 100644 --- a/dmp-frontend/src/app/app.component.html +++ b/dmp-frontend/src/app/app.component.html @@ -1,4 +1,4 @@ -
+
@@ -10,8 +10,17 @@
+
-
- -
- + + diff --git a/dmp-frontend/src/app/app.component.ts b/dmp-frontend/src/app/app.component.ts index 9d4bd3d8a..999752643 100644 --- a/dmp-frontend/src/app/app.component.ts +++ b/dmp-frontend/src/app/app.component.ts @@ -32,6 +32,7 @@ export class AppComponent implements OnInit { sideNavOpen = false; helpContentEnabled: boolean; private statusChangeSubscription: Subscription; + onlySplash = true; constructor( private router: Router, @@ -60,17 +61,18 @@ export class AppComponent implements OnInit { } ngOnInit() { - if (this.location.path() === '' || this.location.path() === '/home') { - if (this.isAuthenticated()) { + if (this.location.path() === '') { + if (!this.configurationService.useSplash) { + this.onlySplash = false; this.router.navigate(['/reload']).then(() => this.router.navigate(['/home'])); - } else if (!this.isAuthenticated()) { - this.router.navigate(['/reload']).then(() => this.router.navigate(['/guest'])); + } else { + this.onlySplash = true; + this.router.navigate(['/reload']).then(() => this.router.navigate(['/splash'])); } - // if (!this.configurationService.useSplash) { - // this.router.navigate(['/reload']).then(() => this.router.navigate(['/home'])); - // } else { - // this.router.navigate(['/reload']).then(() => this.router.navigate(['/splash'])); - // } + } else if (this.location.path() === '/splash') { + this.onlySplash = true; + } else { + this.onlySplash = false; } if (!this.cookieService.check("cookiesConsent")) { this.cookieService.set("cookiesConsent", "false", 356); diff --git a/dmp-frontend/src/app/app.module.ts b/dmp-frontend/src/app/app.module.ts index 77df7c5ab..8523db47b 100644 --- a/dmp-frontend/src/app/app.module.ts +++ b/dmp-frontend/src/app/app.module.ts @@ -31,7 +31,6 @@ import { TranslateServerLoader } from './core/services/language/server.loader'; import { BaseHttpService } from './core/services/http/base-http.service'; import { ConfigurationService } from './core/services/configuration/configuration.service'; import { Oauth2DialogModule } from './ui/misc/oauth2-dialog/oauth2-dialog.module'; -import { GuestModule } from './ui/guest/guest.module'; // AoT requires an exported function for factories export function HttpLoaderFactory(http: HttpClient, appConfig: ConfigurationService) { @@ -99,7 +98,6 @@ const cookieConfig: NgcCookieConsentConfig = { DatasetCreateWizardModule, NavbarModule, SidebarModule, - GuestModule, NgcCookieConsentModule.forRoot(cookieConfig), Oauth2DialogModule ], diff --git a/dmp-frontend/src/app/ui/guest/guest.component.html b/dmp-frontend/src/app/ui/guest/guest.component.html deleted file mode 100644 index e99a92ed9..000000000 --- a/dmp-frontend/src/app/ui/guest/guest.component.html +++ /dev/null @@ -1,344 +0,0 @@ -
- - - -
-
-
-
-

Plan and follow your data

-
-
-

Create

 
machine actionable DMPs.
-
-
-

Configure

 
to best fit your dicsipline.
-
-
-

Link

 
to EOSC components out of the box.
-
-
-

Share

 
easily in your repository.
-
-
-
-

Bring your Data Management Plans closer to where data are generated, analysed and stored.

-
-
- -
-
-
- -
-
-
-
- -
-
-
-
-

Start your

-
-

Argos

 

experience

-
-
-
-

1

 

Select Templates

-
-
-

2

 

Fill the information

-
-
-

3

 

Share DMP

-
-
-
-
- -
-
-
-
- -
-
-
Features
-
-
-
-
-
-
-
Produce DMP outputs
-
-
-
- Close the data management planning lifecycle by publishing your DMPs in a FAIR manner. Assign licenses, PIDs and publish DMPs in a repository of your choice. -
-
-
-
-
- -
-
-
Update DMPs
-
-
-
- Treat DMPs as living documents. Secure their provenance and continue work in new versions (new DOIs assigned). -
-
-
-
-
-
-
- -
-
-
Re-use datasets & templates
-
-
-
- Identify datasets to be re-used in your DMP. Copy or clone dataset descriptions to other DMPs. -
-
-
-
-
- -
-
-
Import and Export DMPs
-
-
-
- Import a .json file of your DMP and continue work in ARGOS. Export DMPs in machine readable (.xml) and machine-actionable (.json) formats. -
-
-
-
-
-
-
- -
-
-
Customise dataset descriptions
-
-
-
- Differentiate DMPs from dataset descriptions. Describe your datasets with more than one template and tailor its content to your specific needs. -
-
-
-
-
- -
-
-
Connect with OpenAIRE & EOSC
-
-
-
- Use OpenAIRE and EOSC underlying services, sources and semantics to ease completion of DMPs and trace the quality of your research. -
-
-
-
-
-
- -
-
-
-
-
- Who Benefits -
-
-
- -
-
-
-
-
-
-
-
- Funders -
-
- Include DMPs in data management policies. -
-
-
- - Add, update and modify DMP templates -
-
- - Enrich your organisations’ research graph -
-
- - Link argos to your  - Monitoring Dashboard -
-
-
-
-
-
- Researchers -
-
- Become Research Data Management literate and lead Open Science cultural change/ practices. -
-
-
- - Comply with DMP requirements -
-
- - Learn and apply best practices for DMPs -
-
- - Co-edit DMPs and manage workload -
-
-
-
-
-
- Institutions -
-
- Support Open and FAIR Data Management Planning. -
-
-
- - Add, update and modify DMP templates -
-
- - Connect your organisations’ services -
-
- - Ensure research integrity and excellence -
-
-
-
-
-
- -
-
-
-
- -
-
-
- - co-branding -
-
- - ARGOS is based on OpenDMP, an open source software that can be deployed by third parties. ARGOS development team welcomes contributions by the international community to strengthen functionalities and further align with global fora. - -
-
-
- -
-
-
-
-
-
- -
-
-
-
- -
-
- -
-
- -
-
-
-
- - - - -
- -
- -
-
-
-
Unless otherwise indicated, all materials created by OpenAIRE are licenced under
  -
ATTRIBUTION 4.0 INTERNATIONAL LICENSE.
-
-
-
-
diff --git a/dmp-frontend/src/app/ui/guest/guest.component.scss b/dmp-frontend/src/app/ui/guest/guest.component.scss deleted file mode 100644 index e0c5c508c..000000000 --- a/dmp-frontend/src/app/ui/guest/guest.component.scss +++ /dev/null @@ -1,724 +0,0 @@ -// Contact -.main-contact { - padding: 3rem 16.5rem; -} - -.required { - color: #E54242; - font-weight: 400; - font-family: 'Roboto', sans-serif; - font-size: 1rem; -} - -.form { - padding-top: 3.5rem; -} - -.form-title { - text-align: left; - font-weight: 700; - font-family: 'Roboto', sans-serif; - font-size: 1.12rem; - color: #212121; -} - -// Footer -.footer { - background: #F3F3F3 0% 0% no-repeat padding-box; - opacity: 1; -} - -.footer-text { - text-align: left; - font-size: 0.75rem; - font-weight: 300; - font-family: 'Roboto', sans-serif; - color: #000000; - opacity: 1; - max-width: 460px; - margin: 0rem 2.5rem; -} - -.btn-social { - border: 1px solid black !important; - color: black; - font-size: 28px; - opacity: 0.8; - padding: 0.2rem 1.2rem; -} - -// .twitter, .youtube, .linkedin { -// padding: .375rem .575rem !important; -// } - -.newsletter { - text-align: left; - font-weight: 500; - font-size: 1.18rem; - color: #000000; - opacity: 1; -} - -.wifi-rotate { - color: black; - -ms-transform: rotate(45deg); - transform: rotate(45deg); -} - -.conditions-policy { - text-align: left; - text-decoration: underline; - font-weight: 400; - font-family: 'Roboto',sans-serif; - font-size: 1rem; - color: #000000; - opacity: 1; -} - -.licence { - text-align: left; - font-weight: 300; - font-family: 'Roboto',sans-serif; - font-size: 0.75rem; - line-height: 2.4; - color: #000000; - opacity: 1; -} - -// Header -header.head { - text-align: center; - color: #fff; - background-image: url("../../../assets/splash/assets/img/gradinet-background.svg"); - background-repeat: no-repeat; - background-size: cover; -} - -.head-subtitles { - margin-top: 1.93rem; -} - -.head-subtitle { - margin-top: 1.65rem; - width: 23.4rem; -} - -.head-start-dmp { - display: flex; - margin-top: 2.6rem; -} - -@media (min-width: 768px) { - header.head { - padding-top: 3.8rem; - /* padding-bottom: calc(100% - 3.8rem); */ - padding-bottom: 5.4rem; - } -} - -// Navbar -.bootstrap-overrides .navbar { - position: relative; - display: flex; - flex-wrap: wrap; - align-items: center; - justify-content: space-between; - padding-top: 3.18rem; - padding-left: 0; - padding-right: 0; - background-color: white; - margin-bottom: 0px !important; -} - -.bootstrap-overrides .navbar .container { - display: flex; - flex-wrap: wrap; - align-items: center; - justify-content: space-between; -} - -.bootstrap-overrides .navbar-brand { - display: inline-block; - width: 135px; - height: 51px; - font-size: 1.25rem; - line-height: inherit; - white-space: nowrap; -} - -.bootstrap-overrides .navbar-nav { - display: flex; - flex-direction: column; - padding-left: 0; - margin-bottom: 0; - margin-left: auto; - list-style: none; -} - -.bootstrap-overrides .navbar-nav .nav-link { - padding-right: 0; - padding-left: 0; -} - -.bootstrap-overrides .navbar-nav .dropdown-menu { - position: static; - float: none; -} - -.navbar-collapse { - flex-basis: 100%; - flex-grow: 1; - align-items: center; - padding-top: 0.5rem; -} - -.navbar-toggler { - padding: 0.25rem 0.75rem; - font-size: 1.25rem; - line-height: 1; - background-color: transparent; - border: 1px solid transparent; - border-radius: 0.25rem; -} - -.navbar-toggler:hover, .navbar-toggler:focus { - text-decoration: none; -} - -.navbar-toggler-icon { - display: inline-block; - width: 1.5em; - height: 1.5em; - vertical-align: middle; - content: ""; - background: no-repeat center center; - background-size: 100% 100%; -} - -.nav { - display: flex; - flex-wrap: wrap; - padding-left: 0; - margin-bottom: 0; - list-style: none; -} - -.my-nav-link { - display: block; - padding: 0.5rem 1rem; - margin-left: 1rem; - cursor: pointer; - text-align: left; - font: Bold 14px/17px Roboto; - letter-spacing: 0px; - color: #000000; - opacity: 1; -} - -.my-nav-link:hover, .my-nav-link:focus { - text-decoration: none; -} - -.my-nav-link.disabled { - color: #6c757d; - pointer-events: none; - cursor: default; -} - -.active-nav-link { - border-bottom: 4px solid #23BCBA !important; - border-left: 0 !important; - border-right: 0 !important; - border-radius: 0px !important; -} - -.my-nav-item { - margin-bottom: -1px; - position: relative; - display: inline-block; -} - -.my-nav-link { - width: fit-content; - border: 1px solid transparent; - border-top-left-radius: 0.25rem; - border-top-right-radius: 0.25rem; -} - -/* .my-nav-link:hover { - border-bottom: 4px solid #23BCBA !important; - border-left: 0 !important; - border-right: 0 !important; - border-radius: 0px !important; -} */ - -.my-nav-link.disabled { - color: #6c757d; - background-color: transparent; - border-color: transparent; -} - -.my-nav-link.active, .my-nav-item.show .my-nav-link { - color: #495057; - background-color: #fff; - border-color: #dee2e6 #dee2e6 #fff; -} - -.my-nav-link { - border-radius: 0.25rem; -} - -.my-nav-link.active, .show>.my-nav-link { - color: #000000; - background-color: #23BCBA; -} - -.nav-fill .my-nav-item { - flex: 1 1 auto; - text-align: center; -} - -.nav-justified .my-nav-item { - flex-basis: 0; - flex-grow: 1; - text-align: center; -} - -.navbar-expand { - flex-flow: row nowrap; - justify-content: flex-start; -} - -.navbar-expand>.container, .navbar-expand>.container-fluid, .navbar-expand>.container-sm, .navbar-expand>.container-md, .navbar-expand>.container-lg, .navbar-expand>.container-xl { - padding-right: 0; - padding-left: 0; -} - -.navbar-expand .navbar-nav { - flex-direction: row; -} - -.navbar-expand .navbar-nav .dropdown-menu { - position: absolute; -} - -.navbar-expand .navbar-nav .my-nav-link { - padding-right: 1rem; - padding-left: 1rem; -} - -.navbar-expand>.container, .navbar-expand>.container-fluid, .navbar-expand>.container-sm, .navbar-expand>.container-md, .navbar-expand>.container-lg, .navbar-expand>.container-xl { - flex-wrap: nowrap; -} - -.navbar-expand .navbar-collapse { - display: flex !important; - flex-basis: auto; -} - -.navbar-expand .navbar-toggler { - display: none; -} - -.dropdown-top { - width: 0px; - border-bottom: 10px solid #23BCBA; - border-left: 10px solid transparent; - border-right: 10px solid transparent; - margin: 0 20%; -} - -.dropdown { - position: relative; - display: inline-block; -} - -.dropdown-content { - display: none; - position: absolute; - z-index: 2; -} - -.dropdown-options { - background-color: #23BCBA; - border-radius: 5px; - min-width: 160px; - width: 214px; - overflow: auto; - padding: 20px 0px; -} - -.dropdown-content a { - text-align: left; - font-weight: 700; - font-family: 'Roboto', sans-serif; - font-size: 0.87rem; - color: #FFFFFF; - text-transform: uppercase; - opacity: 1; - padding: 8px 28px; - text-decoration: none; - display: block; -} - -.dropdown-options a:hover { - background-color: rgba(255, 255, 255, 0.609) !important; -} - -.dropdown-options a:hover { - background-color: #ddd; -} - -.my-nav-item:hover .dropdown-content { - display: block; -} - -.show { - display: block; -} - -@media (max-width: 991.98px) { - .navbar-expand-lg>.container { - padding-right: 0; - padding-left: 0; - } - #nav.navbar-shrink { - padding-top: 1rem; - padding-bottom: 1rem; - background-color: #212529 !important; - } - #nav.navbar-shrink .navbar-brand { - font-size: 1.25em; - } - #nav.navbar-shrink .navbar-brand svg { - height: 1.5rem; - } - #nav.navbar-shrink .my-nav-link, #nav.navbar-shrink button { - color: white; - } - #nav.navbar-shrink .my-nav-link:hover { - color: #23BCBA; - } -} - -@media (min-width: 992px) { - .navbar-expand-lg { - flex-flow: row nowrap; - justify-content: flex-start; - } - .navbar-expand-lg .navbar-nav { - flex-direction: row; - } - .navbar-expand-lg .navbar-nav .dropdown-menu { - position: absolute; - } - .navbar-expand-lg .navbar-nav .my-nav-link { - padding-right: 1.2rem; - padding-left: 1.2rem; - } - .navbar-expand-lg>.container { - flex-wrap: nowrap; - } - .navbar-expand-lg .navbar-collapse { - display: flex !important; - flex-basis: auto; - } - .navbar-expand-lg .navbar-toggler { - display: none; - } -} - -@media (min-width: 992px) { - #nav { - padding-top: 1.5rem; - padding-bottom: 1.5rem; - border: none; - background-color: transparent; - transition: padding-top 0.3s ease-in-out, padding-bottom 0.3s ease-in-out; - } - #nav .navbar-brand { - font-size: 1.5em; - transition: font-size 0.3s ease-in-out; - } - #nav .navbar-brand img { - /* height: 2rem; */ - transition: height 0.3s ease-in-out; - } - #nav.navbar-shrink { - padding-top: 1rem; - padding-bottom: 1rem; - background-color: #212529 !important; - } - #nav.navbar-shrink .navbar-brand { - font-size: 1.25em; - } - #nav.navbar-shrink .navbar-brand svg, #mainNav.navbar-shrink .navbar-brand img { - height: 1.5rem; - } - #nav.navbar-shrink .my-nav-link, #nav.navbar-shrink button { - color: white; - } - #nav.navbar-shrink .my-nav-link:hover { - color: #23BCBA; - } - #nav .navbar-nav .my-nav-item { - margin-right: 1rem; - } - #nav .navbar-nav .my-nav-item:last-child { - margin-right: 0; - } -} - -// Section - -section.start { - text-align: center; - color: #fff; - background: #23BCBA 0% 0% no-repeat padding-box; -} - -.template-img { - margin-right: 6.8rem; -} - -.options { - padding-top: 4rem; -} - -.option-row { - cursor: pointer; -} - -.option-number { - text-align: left; - font-weight: 700; - font-family: 'Roboto', sans-serif; - font-size: 3.25rem; - line-height: 1; - letter-spacing: 0px; - color: #0E6978; - opacity: 1; - padding: 0rem 1rem; -} - -.option-text { - display: flex; - align-items: center; - text-align: left; - font-weight: 300; - font-family: 'Roboto', sans-serif; - font-size: 1.56rem; - line-height: 1.68rem; - letter-spacing: 0px; - color: #FFFFFF; -} - -.selected { - opacity: 1; -} - -.not-selected { - opacity: 0.6; -} - -.features-layout { - display: flex; - justify-content: space-around; - padding-bottom: 4rem; -} - -.features-title { - display: flex; - justify-content: center; - font-weight: 700; - font-family: 'Roboto', sans-serif; - font-size: 2.37rem; - padding-bottom: 3rem; - color: #212121; - opacity: 1; -} - -.feature-subtitle { - text-align: center; - font-weight: 700; - font-family: 'Roboto', sans-serif; - font-size: 1.87rem; - padding: 1.5rem 0rem; - color: #000000; - opacity: 0.8; -} - -.feature-img { - display: flex; - justify-content: center; -} - -.feature-desc { - text-align: center; - font-size: 1rem; - color: #292747; - opacity: 1; - max-width: 429px; -} - -section.benefits { - background: #F3F3F3 0% 0% no-repeat padding-box; - opacity: 1; -} - -.section-title-1 { - text-align: center; - font-weight: 300; - font-family: 'Roboto', sans-serif; - font-size: 2.37rem; - color: #212121; -} - -.section-title-2 { - text-align: center; - font-weight: 700; - font-family: 'Roboto', sans-serif; - font-size: 2.37rem; - color: #212121; -} - -.section-title-3 { - text-align: left; - font-weight: 300; - font-family: 'Roboto', sans-serif; - font-size: 2.37rem; - color: #212121; -} - -.benefit-card { - width: 370px; - height: 378px; - background: #FFFFFF 0% 0% no-repeat padding-box; - box-shadow: 0px 6px 15px #0000001A; - border-radius: 36px; - opacity: 1; -} - -.benefit-card-title { - text-align: center; - font-weight: 300; - font-family: 'Roboto', sans-serif; - font-size: 1.68rem; - color: #292747; - opacity: 1; - padding: 2.81rem 0rem 1.5rem 0rem; -} - -.benefit-desc { - text-align: center; - color: #292747; - max-width: 226px; -} - -.benefit-desc-1 { - text-align: center; - color: #292747; - max-width: 250px; -} - -.benefit-card hr { - width: 286px; - border: 1px solid #DBDBDB; - opacity: 1; - margin-top: 1.5rem !important; - margin-bottom: 1.5rem !important; -} - -.benefit-card-subtitle { - text-align: left; - font-weight: 400; - font-family: 'Roboto', sans-serif; - font-size: 0.87rem; - color: #292747; - padding-left: 10px; -} - -.benefit-card-sub-color { - text-align: left; - font-weight: 400; - font-family: 'Roboto', sans-serif; - font-size: 0.87rem; - color: #008887; -} - -.benefit-ic { - margin-left: 40px !important; - margin-bottom: .8rem; -} - -.branding-logo { - display: flex; - align-items: flex-end; -} - -.co-branding-text { - text-align: left; - font-family: 'Roboto', sans-serif; - font-weight: 300; - font-size: 1rem; - color: #212121; - opacity: 0.81; - max-width: 357px; - padding-top: 1.5rem; -} - -.media-kit-logo-title, .moo-card-logo-title { - text-align: left; - font-weight: 300; - font-family: 'Roboto',sans-serif; - font-size: 1.25rem; - letter-spacing: 0px; - color: #212121; - opacity: 0.81; -} - -.co-branding p, .user-guide p, .media-kit p { - text-align: left; - font-family: 'Roboto', sans-serif; - font-weight: 400; - font-size: 0.87rem; - line-height: 1.6rem; - letter-spacing: 0px; - color: #212121; - opacity: 0.8; - padding: 2rem 0rem; -} - -section.media-kit-logo { - background: #F3F3F3; - opacity: 1; -} - -@media (min-width: 768px) { - section.start, section.features, section.co-branding, section.user-guide, section.media-kit .footer { - padding-top: 6rem; - padding-bottom: 5.4rem; - } - section.benefits { - padding-top: 3.8rem; - padding-bottom: 5.4rem; - } - section.contact { - padding-top: 2.8rem; - padding-bottom: 0.5rem; - } - section.how-it-works { - padding-top: 2.8rem; - padding-bottom: 3.8rem; - } - section.media-kit-logo, section.moo-cards { - padding-top: 4rem; - padding-bottom: 5rem; - } - .footer { - padding-top: 4.8rem; - padding-bottom: 2rem; - } -} - - diff --git a/dmp-frontend/src/app/ui/guest/guest.component.ts b/dmp-frontend/src/app/ui/guest/guest.component.ts deleted file mode 100644 index 461cae13f..000000000 --- a/dmp-frontend/src/app/ui/guest/guest.component.ts +++ /dev/null @@ -1,61 +0,0 @@ -import { Component, OnInit } from '@angular/core'; -import { MatDialog } from '@angular/material'; -import { SignInDialogComponent } from '@common/modules/sign-in-dialog/sign-in-dialog.component'; - -@Component({ - selector: 'app-guest-component', - templateUrl: './guest.component.html', - styleUrls: ['./guest.component.scss'] -}) -export class GuestComponent implements OnInit { - - constructor(public dialog: MatDialog) { - - } - - ngOnInit() { - this.navbarCollapse(); - window.addEventListener('scroll', this.scroll, true); - } - - ngOnDestroy() { - window.removeEventListener('scroll', this.scroll, true); - } - - public toggleClass(ids, option) { - ids.forEach(id => { - var element = document.getElementById(id); - var className = element.getAttribute("class").replace(/ .*/, ''); - console.log(className); - if (id === option) { - element.classList.replace(className, "selected"); - } else { - element.classList.replace(className, "not-selected"); - } - }) - } - - public navbarCollapse() { - var element = document.getElementById('nav'); - if (document.body.scrollTop > 100 || document.documentElement.scrollTop > 100) { - element.classList.add("navbar-shrink"); - element.classList.add("fixed-top"); - } else { - element.classList.remove("navbar-shrink"); - element.classList.remove("fixed-top"); - } - }; - - scroll = (event): void => { - this.navbarCollapse(); - }; - - public openSignInDialog(): void { - const dialogRef = this.dialog.open(SignInDialogComponent); - - dialogRef.afterClosed().subscribe(result => { - }); - } - -} - diff --git a/dmp-frontend/src/app/ui/guest/guest.module.ts b/dmp-frontend/src/app/ui/guest/guest.module.ts deleted file mode 100644 index 33d89c021..000000000 --- a/dmp-frontend/src/app/ui/guest/guest.module.ts +++ /dev/null @@ -1,17 +0,0 @@ -import { NgModule } from '@angular/core'; -import { CommonUiModule } from '@common/ui/common-ui.module'; -import { GuestComponent } from './guest.component'; -import { GuestRoutingModule } from './guest.routing'; -import { SignInDialogModule } from '@common/modules/sign-in-dialog/sign-in-dialog.module'; - -@NgModule({ - imports: [ - CommonUiModule, - GuestRoutingModule, - SignInDialogModule - ], - declarations: [ - GuestComponent - ] -}) -export class GuestModule { } diff --git a/dmp-frontend/src/app/ui/guest/guest.routing.ts b/dmp-frontend/src/app/ui/guest/guest.routing.ts deleted file mode 100644 index 835cb3d1c..000000000 --- a/dmp-frontend/src/app/ui/guest/guest.routing.ts +++ /dev/null @@ -1,16 +0,0 @@ -import { NgModule } from '@angular/core'; -import { RouterModule, Routes } from '@angular/router'; -import { GuestComponent } from './guest.component'; - -const routes: Routes = [ - { - path: '', - component: GuestComponent, - }, -]; - -@NgModule({ - imports: [RouterModule.forChild(routes)], - exports: [RouterModule] -}) -export class GuestRoutingModule { } diff --git a/dmp-frontend/src/app/ui/navbar/navbar.component.html b/dmp-frontend/src/app/ui/navbar/navbar.component.html index a815836d1..ab12bdd6b 100644 --- a/dmp-frontend/src/app/ui/navbar/navbar.component.html +++ b/dmp-frontend/src/app/ui/navbar/navbar.component.html @@ -7,7 +7,7 @@
- +
-
+
diff --git a/dmp-frontend/src/app/ui/dashboard/recent-edited-activity/recent-edited-activity.component.html b/dmp-frontend/src/app/ui/dashboard/recent-edited-activity/recent-edited-activity.component.html index d4bb29370..3945e5cc0 100644 --- a/dmp-frontend/src/app/ui/dashboard/recent-edited-activity/recent-edited-activity.component.html +++ b/dmp-frontend/src/app/ui/dashboard/recent-edited-activity/recent-edited-activity.component.html @@ -130,7 +130,7 @@
-
+
diff --git a/dmp-frontend/src/app/ui/dashboard/recent-edited-activity/recent-edited-activity.component.ts b/dmp-frontend/src/app/ui/dashboard/recent-edited-activity/recent-edited-activity.component.ts index aeaa2088e..ddd1c7167 100644 --- a/dmp-frontend/src/app/ui/dashboard/recent-edited-activity/recent-edited-activity.component.ts +++ b/dmp-frontend/src/app/ui/dashboard/recent-edited-activity/recent-edited-activity.component.ts @@ -67,7 +67,7 @@ export class RecentEditedActivityComponent extends BaseComponent implements OnIn allDataTableRequest.criteria = new RecentActivityCriteria(); allDataTableRequest.criteria.like = ""; this.dashboardService - .getRecentAcitvity(allDataTableRequest) + .getRecentActivity(allDataTableRequest) .subscribe(response => { this.allRecentActivities = response; this.totalCountRecentEdited.emit(this.pageSize); @@ -370,7 +370,7 @@ export class RecentEditedActivityComponent extends BaseComponent implements OnIn request.criteria = new RecentActivityCriteria(); request.criteria.like = ""; - this.dashboardService.getRecentAcitvity(request).pipe(takeUntil(this._destroyed)).subscribe(result => { + this.dashboardService.getRecentActivity(request).pipe(takeUntil(this._destroyed)).subscribe(result => { if (!result) { return []; } this.allRecentActivities = this.allRecentActivities.concat(result); }); diff --git a/dmp-frontend/src/app/ui/dashboard/recent-edited-dataset-activity/recent-edited-dataset-activity.component.html b/dmp-frontend/src/app/ui/dashboard/recent-edited-dataset-activity/recent-edited-dataset-activity.component.html index b555cdc02..7a3b48a1f 100644 --- a/dmp-frontend/src/app/ui/dashboard/recent-edited-dataset-activity/recent-edited-dataset-activity.component.html +++ b/dmp-frontend/src/app/ui/dashboard/recent-edited-dataset-activity/recent-edited-dataset-activity.component.html @@ -61,7 +61,7 @@
-
+
diff --git a/dmp-frontend/src/app/ui/dashboard/recent-edited-dmp-activity/recent-edited-dmp-activity.component.html b/dmp-frontend/src/app/ui/dashboard/recent-edited-dmp-activity/recent-edited-dmp-activity.component.html index 9add5f9a7..a495e9052 100644 --- a/dmp-frontend/src/app/ui/dashboard/recent-edited-dmp-activity/recent-edited-dmp-activity.component.html +++ b/dmp-frontend/src/app/ui/dashboard/recent-edited-dmp-activity/recent-edited-dmp-activity.component.html @@ -67,7 +67,7 @@
-
+
diff --git a/dmp-frontend/src/assets/css/demo.css b/dmp-frontend/src/assets/css/demo.css index b8c55e631..efae1933a 100644 --- a/dmp-frontend/src/assets/css/demo.css +++ b/dmp-frontend/src/assets/css/demo.css @@ -409,8 +409,8 @@ textarea { p { text-align: left; font-family: 'Roboto', sans-serif; - font-weight: 300; - font-size: 1.25rem; + /* font-weight: 300; + font-size: 1.25rem; */ letter-spacing: 0px; color: #212121; } @@ -648,6 +648,15 @@ hr { padding-right: .5rem; } +.btn-load-more { + border: 2px solid #212121; + border-radius: 30px; + opacity: 1; + width: 132px; + height: 40px; + margin-top: 4.125rem; +} + @media (min-width: 576px) { .container { max-width: 540px; diff --git a/dmp-frontend/src/assets/i18n/en.json b/dmp-frontend/src/assets/i18n/en.json index db1b97c8b..9393ad549 100644 --- a/dmp-frontend/src/assets/i18n/en.json +++ b/dmp-frontend/src/assets/i18n/en.json @@ -397,7 +397,9 @@ "VERSION": "Version", "CONTAINED-DATASETS": "Contained Dataset Descriptions", "TEXT-INFO": "Information in a DMP show how datasets have been collected and/or generated, how they have been processed and analysed, i.e. using which tools, standards, methodologies etc, but also where and how datasets are backed up, published and preserved, including any costs associated with personnel dedicated for data curation/ stewardship activities or costs for acquiring or building data management services.", - "TEXT-INFO-QUESTION": "Not sure how a DMP looks in practice? Browse Public DMPs and LIBER community in Zenodo to get an idea!", + "TEXT-INFO-QUESTION": "Not sure how a DMP looks in practice? Browse Public DMPs and", + "LINK-ZENODO": "LIBER community in Zenodo", + "GET-IDEA": "to get an idea!", "COLUMNS": { "NAME": "Name", "GRANT": "Grant", diff --git a/dmp-frontend/src/assets/i18n/es.json b/dmp-frontend/src/assets/i18n/es.json index 70de7834e..14d5538ed 100644 --- a/dmp-frontend/src/assets/i18n/es.json +++ b/dmp-frontend/src/assets/i18n/es.json @@ -396,7 +396,9 @@ "VERSION": "Versión", "CONTAINED-DATASETS": "Descripción del Dataset contenidos", "TEXT-INFO": "Information in a DMP show how datasets have been collected and/or generated, how they have been processed and analysed, i.e. using which tools, standards, methodologies etc, but also where and how datasets are backed up, published and preserved, including any costs associated with personnel dedicated for data curation/ stewardship activities or costs for acquiring or building data management services. Not sure how a DMP looks in practice? Browse Public DMPs and LIBER community in Zenodo to get an idea!", - "TEXT-INFO-QUESTION": "Not sure how a DMP looks in practice? Browse Public DMPs and LIBER community in Zenodo to get an idea!", + "TEXT-INFO-QUESTION": "Not sure how a DMP looks in practice? Browse Public DMPs and", + "LINK-ZENODO": "LIBER community in Zenodo", + "GET-IDEA": "to get an idea!", "COLUMNS": { "NAME": "Nombre", "GRANT": "Subvención", diff --git a/dmp-frontend/src/assets/i18n/gr.json b/dmp-frontend/src/assets/i18n/gr.json index 4f82d9214..0004865c3 100644 --- a/dmp-frontend/src/assets/i18n/gr.json +++ b/dmp-frontend/src/assets/i18n/gr.json @@ -396,7 +396,9 @@ "VERSION": "Έκδοση", "CONTAINED-DATASETS": "Δεδομένα που συμπεριλαμβάνει", "TEXT-INFO": "Information in a DMP show how datasets have been collected and/or generated, how they have been processed and analysed, i.e. using which tools, standards, methodologies etc, but also where and how datasets are backed up, published and preserved, including any costs associated with personnel dedicated for data curation/ stewardship activities or costs for acquiring or building data management services. Not sure how a DMP looks in practice? Browse Public DMPs and LIBER community in Zenodo to get an idea!", - "TEXT-INFO-QUESTION": "Not sure how a DMP looks in practice? Browse Public DMPs and LIBER community in Zenodo to get an idea!", + "TEXT-INFO-QUESTION": "Not sure how a DMP looks in practice? Browse Public DMPs and", + "LINK-ZENODO": "LIBER community in Zenodo", + "GET-IDEA": "to get an idea!", "COLUMNS": { "NAME": "Τίτλος", "GRANT": "Επιχορήγηση", From 372c9bb074d188d8c384a31193cb666892b5d7d9 Mon Sep 17 00:00:00 2001 From: George Kalampokis Date: Fri, 3 Jul 2020 16:11:54 +0300 Subject: [PATCH 039/364] Add support for Dataset Overview --- .../java/eu/eudat/controllers/Datasets.java | 37 +++++++++++ .../eudat/logic/managers/DatasetManager.java | 23 +++++++ .../logic/mapper/elastic/DatasetMapper.java | 2 - .../data/dataset/DatasetOverviewModel.java | 64 +++++++++++++++++++ 4 files changed, 124 insertions(+), 2 deletions(-) diff --git a/dmp-backend/web/src/main/java/eu/eudat/controllers/Datasets.java b/dmp-backend/web/src/main/java/eu/eudat/controllers/Datasets.java index 74edf561e..781237cab 100644 --- a/dmp-backend/web/src/main/java/eu/eudat/controllers/Datasets.java +++ b/dmp-backend/web/src/main/java/eu/eudat/controllers/Datasets.java @@ -4,9 +4,12 @@ import eu.eudat.data.entities.Dataset; import eu.eudat.data.query.items.table.dataset.DatasetPublicTableRequest; import eu.eudat.data.query.items.table.dataset.DatasetTableRequest; import eu.eudat.data.query.items.table.datasetprofile.DatasetProfileTableRequestItem; +import eu.eudat.exceptions.security.UnauthorisedException; import eu.eudat.logic.managers.DatasetManager; +import eu.eudat.logic.managers.DatasetWizardManager; import eu.eudat.logic.security.claims.ClaimedAuthorities; import eu.eudat.logic.services.ApiContext; +import eu.eudat.models.data.dataset.DatasetOverviewModel; import eu.eudat.models.data.datasetprofile.DatasetProfileListingModel; import eu.eudat.models.data.helpers.common.DataTableData; import eu.eudat.models.data.helpers.responses.ResponseItem; @@ -52,6 +55,32 @@ public class Datasets extends BaseController { return ResponseEntity.status(HttpStatus.OK).body(new ResponseItem>().status(ApiMessageCode.NO_MESSAGE).payload(dataTable)); } + @RequestMapping(method = RequestMethod.GET, value = {"/overview/{id}"}) + public @ResponseBody + ResponseEntity getOverviewSingle(@PathVariable String id,@ClaimedAuthorities(claims = {Authorities.ADMIN, Authorities.MANAGER, Authorities.USER, Authorities.ANONYMOUS}) Principal principal) { + try { + DatasetOverviewModel dataset = this.datasetManager.getOverviewSingle(id, principal, false); + return ResponseEntity.status(HttpStatus.OK).body(new ResponseItem().status(ApiMessageCode.NO_MESSAGE).payload(dataset)); + } catch (Exception e) { + if (e instanceof UnauthorisedException) { + return ResponseEntity.status(HttpStatus.FORBIDDEN).body(new ResponseItem().status(ApiMessageCode.ERROR_MESSAGE)); + } else { + return ResponseEntity.status(HttpStatus.NOT_FOUND).body(new ResponseItem().status(ApiMessageCode.ERROR_MESSAGE)); + } + } + } + + @RequestMapping(method = RequestMethod.GET, value = {"/publicOverview/{id}"}) + public @ResponseBody + ResponseEntity getOverviewSinglePublic(@PathVariable String id, @ClaimedAuthorities(claims = {Authorities.ADMIN, Authorities.MANAGER, Authorities.USER, Authorities.ANONYMOUS}) Principal principal) throws Exception { +// try { + DatasetOverviewModel dataset = this.datasetManager.getOverviewSingle(id, principal, true); + return ResponseEntity.status(HttpStatus.OK).body(new ResponseItem().status(ApiMessageCode.NO_MESSAGE).payload(dataset)); +// } catch (Exception ex) { +// return ResponseEntity.status(HttpStatus.BAD_REQUEST).body(new ResponseItem().status(ApiMessageCode.NO_MESSAGE).message(ex.getMessage())); +// } + } + @Transactional @RequestMapping(method = RequestMethod.GET, value = {"/makepublic/{id}"}, produces = "application/json") public @ResponseBody @@ -82,5 +111,13 @@ public class Datasets extends BaseController { this.datasetManager.clearIndex(principal); return ResponseEntity.status(HttpStatus.OK).body(new ResponseItem().status(ApiMessageCode.SUCCESS_MESSAGE).message("Cleared").payload(null)); } + + @javax.transaction.Transactional + @RequestMapping(method = RequestMethod.DELETE, value = {"/delete/{id}"}, produces = "application/json") + public @ResponseBody + ResponseEntity> delete(@PathVariable(value = "id") UUID id, Principal principal) throws Exception { + new DatasetWizardManager().delete(this.getApiContext(), id); + return ResponseEntity.status(HttpStatus.OK).body(new ResponseItem().status(ApiMessageCode.SUCCESS_MESSAGE).message("Deleted")); + } } 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 caaba293d..a0fe6d159 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 @@ -17,6 +17,7 @@ import eu.eudat.data.query.items.table.datasetprofile.DatasetProfileTableRequest import eu.eudat.elastic.criteria.DatasetCriteria; import eu.eudat.elastic.entities.Tag; import eu.eudat.elastic.repository.DatasetRepository; +import eu.eudat.exceptions.security.ForbiddenException; import eu.eudat.exceptions.security.UnauthorisedException; import eu.eudat.logic.builders.BuilderFactory; import eu.eudat.logic.builders.entity.UserInfoBuilder; @@ -32,6 +33,7 @@ import eu.eudat.logic.utilities.documents.xml.ExportXmlBuilder; import eu.eudat.logic.utilities.helpers.StreamDistinctBy; import eu.eudat.logic.utilities.json.JsonSearcher; import eu.eudat.models.HintedModelFactory; +import eu.eudat.models.data.dataset.DatasetOverviewModel; import eu.eudat.models.data.datasetImport.DatasetImportField; import eu.eudat.models.data.datasetImport.DatasetImportPagedDatasetProfile; import eu.eudat.models.data.datasetprofile.DatasetProfileListingModel; @@ -39,6 +41,7 @@ import eu.eudat.models.data.datasetwizard.DatasetWizardModel; import eu.eudat.models.data.dmp.AssociatedProfile; import eu.eudat.models.data.dmp.DataManagementPlan; import eu.eudat.models.data.helpers.common.DataTableData; +import eu.eudat.models.data.listingmodels.DataManagementPlanOverviewModel; import eu.eudat.models.data.listingmodels.DatasetListingModel; import eu.eudat.models.data.security.Principal; import eu.eudat.models.data.user.composite.PagedDatasetProfile; @@ -325,6 +328,26 @@ public class DatasetManager { } } + public DatasetOverviewModel getOverviewSingle(String id, Principal principal, boolean isPublic) throws Exception { + Dataset datasetEntity = databaseRepository.getDatasetDao().find(UUID.fromString(id)); + if (datasetEntity.getStatus() == Dataset.Status.DELETED.getValue()) { + throw new Exception("Dataset is deleted."); + } + if (!isPublic && principal == null) { + throw new UnauthorisedException(); + } else + if (!isPublic && datasetEntity.getDmp().getUsers() + .stream().noneMatch(userInfo -> userInfo.getUser().getId() == principal.getId())) { + throw new UnauthorisedException(); + } else if (isPublic && !datasetEntity.getDmp().isPublic()) { + throw new ForbiddenException("Selected Dataset is not public"); + } + DatasetOverviewModel dataset = new DatasetOverviewModel(); + dataset.fromDataModel(datasetEntity); + + return dataset; + } + public PagedDatasetProfile getPagedProfile(DatasetWizardModel dataset, eu.eudat.data.entities.Dataset datasetEntity) { eu.eudat.models.data.user.composite.DatasetProfile datasetprofile = userManager.generateDatasetProfileModel(datasetEntity.getProfile()); datasetprofile.setStatus(dataset.getStatus()); diff --git a/dmp-backend/web/src/main/java/eu/eudat/logic/mapper/elastic/DatasetMapper.java b/dmp-backend/web/src/main/java/eu/eudat/logic/mapper/elastic/DatasetMapper.java index c9a3723f0..22cce074d 100644 --- a/dmp-backend/web/src/main/java/eu/eudat/logic/mapper/elastic/DatasetMapper.java +++ b/dmp-backend/web/src/main/java/eu/eudat/logic/mapper/elastic/DatasetMapper.java @@ -3,9 +3,7 @@ package eu.eudat.logic.mapper.elastic; import eu.eudat.data.dao.criteria.DataManagementPlanCriteria; import eu.eudat.data.entities.DMP; import eu.eudat.elastic.criteria.DatasetCriteria; -import eu.eudat.elastic.entities.Collaborator; import eu.eudat.elastic.entities.Dataset; -import eu.eudat.elastic.entities.Organization; import eu.eudat.elastic.entities.Tag; import eu.eudat.logic.managers.DatasetManager; import eu.eudat.logic.services.ApiContext; diff --git a/dmp-backend/web/src/main/java/eu/eudat/models/data/dataset/DatasetOverviewModel.java b/dmp-backend/web/src/main/java/eu/eudat/models/data/dataset/DatasetOverviewModel.java index bf29b0822..1fe23c6a8 100644 --- a/dmp-backend/web/src/main/java/eu/eudat/models/data/dataset/DatasetOverviewModel.java +++ b/dmp-backend/web/src/main/java/eu/eudat/models/data/dataset/DatasetOverviewModel.java @@ -3,8 +3,12 @@ package eu.eudat.models.data.dataset; import eu.eudat.data.entities.Dataset; import eu.eudat.models.DataModel; import eu.eudat.models.data.datasetprofile.DatasetProfileOverviewModel; +import eu.eudat.models.data.listingmodels.UserInfoListingModel; +import java.util.Date; +import java.util.List; import java.util.UUID; +import java.util.stream.Collectors; public class DatasetOverviewModel implements DataModel { @@ -12,6 +16,12 @@ public class DatasetOverviewModel implements DataModel users; + private String dmp; + private String grant; + private String description; + private Boolean isPublic; + private Date modified; public UUID getId() { return id; @@ -41,12 +51,66 @@ public class DatasetOverviewModel implements DataModel getUsers() { + return users; + } + + public void setUsers(List users) { + this.users = users; + } + + public String getDmp() { + return dmp; + } + + public void setDmp(String dmp) { + this.dmp = dmp; + } + + public String getGrant() { + return grant; + } + + public void setGrant(String grant) { + this.grant = grant; + } + + public String getDescription() { + return description; + } + + public void setDescription(String description) { + this.description = description; + } + + public Boolean getPublic() { + return isPublic; + } + + public void setPublic(Boolean aPublic) { + isPublic = aPublic; + } + + public Date getModified() { + return modified; + } + + public void setModified(Date modified) { + this.modified = modified; + } + @Override public DatasetOverviewModel fromDataModel(Dataset entity) { this.id = entity.getId(); this.label = entity.getLabel(); this.status = entity.getStatus(); this.datasetTemplate = new DatasetProfileOverviewModel().fromDataModel(entity.getProfile()); + this.users = entity.getDmp().getUsers().stream().map(x -> new UserInfoListingModel().fromDataModel(x)).collect(Collectors.toList()); + this.dmp = entity.getDmp().getLabel(); + this.grant = entity.getDmp().getGrant().getLabel(); + this.description = entity.getDescription(); + this.isPublic = entity.getDmp().isPublic(); + this.modified = entity.getModified(); return this; } From 344e49afc4fc608f5ea83f214031126bf4c3f718 Mon Sep 17 00:00:00 2001 From: gpapavgeri Date: Fri, 3 Jul 2020 16:58:13 +0300 Subject: [PATCH 040/364] dataset-overview_update v1 --- .../core/model/dataset/dataset-overview.ts | 7 + .../core/services/dataset/dataset.service.ts | 20 ++ .../src/app/ui/dataset/dataset.module.ts | 4 +- .../src/app/ui/dataset/dataset.routing.ts | 25 +- .../overview/dataset-overview.component.html | 238 +++++++++++++++ .../overview/dataset-overview.component.scss | 281 ++++++++++++++++++ .../overview/dataset-overview.component.ts | 217 ++++++++++++++ .../overview/dataset-overview.module.ts | 25 ++ .../dmp/overview/dmp-overview.component.html | 2 +- .../explore-dataset/explore-dataset.module.ts | 4 +- .../explore-dataset.routing.ts | 9 + dmp-frontend/src/assets/i18n/en.json | 7 + dmp-frontend/src/assets/i18n/es.json | 9 +- dmp-frontend/src/assets/i18n/gr.json | 7 + 14 files changed, 843 insertions(+), 12 deletions(-) create mode 100644 dmp-frontend/src/app/ui/dataset/overview/dataset-overview.component.html create mode 100644 dmp-frontend/src/app/ui/dataset/overview/dataset-overview.component.scss create mode 100644 dmp-frontend/src/app/ui/dataset/overview/dataset-overview.component.ts create mode 100644 dmp-frontend/src/app/ui/dataset/overview/dataset-overview.module.ts diff --git a/dmp-frontend/src/app/core/model/dataset/dataset-overview.ts b/dmp-frontend/src/app/core/model/dataset/dataset-overview.ts index 7377a1984..75d03a082 100644 --- a/dmp-frontend/src/app/core/model/dataset/dataset-overview.ts +++ b/dmp-frontend/src/app/core/model/dataset/dataset-overview.ts @@ -5,4 +5,11 @@ export interface DatasetOverviewModel { label: string; status: any; datasetTemplate: DatasetProfileModel; + + users: any[]; + dmp: String; + grant: String; + description: String; + public: boolean; + modified: Date; } diff --git a/dmp-frontend/src/app/core/services/dataset/dataset.service.ts b/dmp-frontend/src/app/core/services/dataset/dataset.service.ts index 7b157833a..d21df6676 100644 --- a/dmp-frontend/src/app/core/services/dataset/dataset.service.ts +++ b/dmp-frontend/src/app/core/services/dataset/dataset.service.ts @@ -10,11 +10,15 @@ import { ExploreDatasetCriteriaModel } from '../../query/explore-dataset/explore import { BaseHttpService } from '../http/base-http.service'; import { DatasetProfileCriteria } from '../../query/dataset-profile/dataset-profile-criteria'; import { ConfigurationService } from '../configuration/configuration.service'; +import { DatasetOverviewModel } from '@app/core/model/dataset/dataset-overview'; +import { HttpHeaders } from '@angular/common/http'; +import { DatasetModel } from '@app/core/model/dataset/dataset'; @Injectable() export class DatasetService { private actionUrl: string; + private headers = new HttpHeaders(); constructor( private http: BaseHttpService, @@ -49,4 +53,20 @@ export class DatasetService { clearIndex() { return this.http.delete(this.actionUrl + 'index'); } + + getOverviewSingle(id: string): Observable { + return this.http.get(this.actionUrl + 'overview/' + id, { headers: this.headers }); + } + + getOverviewSinglePublic(id: string): Observable { + return this.http.get(this.actionUrl + 'publicOverview/' + id, { headers: this.headers }) + } + + clone(datasetModel: DatasetModel, id: String): Observable { + return this.http.post(this.actionUrl + 'clone/' + id, datasetModel, { headers: this.headers }); + } + + delete(id: String): Observable { + return this.http.delete(this.actionUrl + 'delete/' + id, { headers: this.headers }); // + 'delete/' + } } diff --git a/dmp-frontend/src/app/ui/dataset/dataset.module.ts b/dmp-frontend/src/app/ui/dataset/dataset.module.ts index 804bb64ae..4d10643f5 100644 --- a/dmp-frontend/src/app/ui/dataset/dataset.module.ts +++ b/dmp-frontend/src/app/ui/dataset/dataset.module.ts @@ -23,6 +23,7 @@ import { ConfirmationDialogModule } from '@common/modules/confirmation-dialog/co import { CommonUiModule } from '@common/ui/common-ui.module'; import { AngularStickyThingsModule } from '@w11k/angular-sticky-things'; import { DatasetCopyDialogModule } from './dataset-wizard/dataset-copy-dialogue/dataset-copy-dialogue.module'; +import { DatasetOverviewModule } from './overview/dataset-overview.module'; @NgModule({ imports: [ @@ -38,7 +39,8 @@ import { DatasetCopyDialogModule } from './dataset-wizard/dataset-copy-dialogue/ AngularStickyThingsModule, DatasetRoutingModule, FormValidationErrorsDialogModule, - DatasetCopyDialogModule + DatasetCopyDialogModule, + DatasetOverviewModule ], declarations: [ DatasetListingComponent, diff --git a/dmp-frontend/src/app/ui/dataset/dataset.routing.ts b/dmp-frontend/src/app/ui/dataset/dataset.routing.ts index a17296a13..b024aa044 100644 --- a/dmp-frontend/src/app/ui/dataset/dataset.routing.ts +++ b/dmp-frontend/src/app/ui/dataset/dataset.routing.ts @@ -3,6 +3,7 @@ import { RouterModule, Routes } from '@angular/router'; import { AuthGuard } from '../../core/auth-guard.service'; import { DatasetWizardComponent } from './dataset-wizard/dataset-wizard.component'; import { DatasetListingComponent } from './listing/dataset-listing.component'; +import { DatasetOverviewComponent } from './overview/dataset-overview.component'; const routes: Routes = [ { @@ -76,14 +77,22 @@ const routes: Routes = [ title: 'GENERAL.TITLES.DATASET-UPDATE' }, }, - // { - // path: 'overview/:id', - // component: DatasetOverviewComponent, - // data: { - // breadcrumb: true, - // title: 'GENERAL.TITLES.DATASET-OVERVIEW' - // }, - // }, + { + path: 'overview/:id', + component: DatasetOverviewComponent, + data: { + breadcrumb: true, + title: 'GENERAL.TITLES.DATASET-OVERVIEW' + }, + }, + { + path: 'publicOverview/:publicId', + component: DatasetOverviewComponent, + data: { + breadcrumb: true, + title: 'GENERAL.TITLES.DATASET-OVERVIEW' + }, + } ]; @NgModule({ diff --git a/dmp-frontend/src/app/ui/dataset/overview/dataset-overview.component.html b/dmp-frontend/src/app/ui/dataset/overview/dataset-overview.component.html new file mode 100644 index 000000000..140569ba0 --- /dev/null +++ b/dmp-frontend/src/app/ui/dataset/overview/dataset-overview.component.html @@ -0,0 +1,238 @@ +
+
+ + + chevron_left +

{{'DMP-WIZARD.ACTIONS.BACK' | translate}}

+
+
+
+
+ + +

Dataset Label dataset label

+
+
+ +
+

+ Owner + +

+
+
+ +
+ public + + Public +
+ +
+ + +
{{'GENERAL.STATUSES.EDIT' | translate}} : + + 03/07/2020 +
+ +
+
+ + + + + + + +
+
{{'DATASET-LISTING.TOOLTIP.PART-OF' | translate}}
+
+ +
+
{{'DMP-OVERVIEW.GRANT' | translate}}
+
Label
+ +
{{'DMP-OVERVIEW.RESEARCHERS' | translate}}
+ + + +
+
+ +
+
+ +
+
\ No newline at end of file diff --git a/dmp-frontend/src/app/ui/dataset/overview/dataset-overview.component.scss b/dmp-frontend/src/app/ui/dataset/overview/dataset-overview.component.scss new file mode 100644 index 000000000..2370e3179 --- /dev/null +++ b/dmp-frontend/src/app/ui/dataset/overview/dataset-overview.component.scss @@ -0,0 +1,281 @@ +.container-fluid { + margin: 2em 4em; + padding: 2em; +} + +// ********ICONS******** + +.back-icon { + opacity: 0.4; +} + +.mat-mini-fab { + width: 2.5em; + height: 2.5em; + color: #212121; + background-color: #F7DD72; +} + +.mat-mini-fab-icon, .status-icon { + font-size: 1.2em; +} + +.mat-mini-fab:hover { + background-color: #129D99; + color: #FFFFFF; +} + +.status-icon { + color: #A7A7A7; +} + +.account-icon { + font-size: 2.5em; +} + +// ********BUTTONS******** + +.version-btn { + // width: 6.7em; + height: 1.8em; + border: 1px solid #707070; + border-radius: 4px; + background-color: transparent; +} + +.id-btn { + background: url('../../../../assets/images/NoPath.png') no-repeat center; + width: 1em; + margin-right: 0.3em; + align-self: center; +} + +.dmp-btn { + width: 35em; + padding: 0 1em; + background-color: #129D99; + border-radius: 4px; + justify-content: space-between; + color: #212121; + opacity: 0.8; +} + +.show-more-btn { + width: 31.6em; + padding: 0 1em; + background-color: #ffffff00; + color: #129D99; + font-weight: 700; +} + +.add-dataset-btn { + border: none; + font: Bold 0.875em Open Sans; + color: #444444; + background-color: transparent; +} + +.frame-btn { + border: 1px solid #212121; + color: black; +} + +.finalize-btn { + border: 1px solid #129D99; + color: #129D99; +} + +.frame-btn, .finalize-btn { + background: #FFFFFF; + box-shadow: 0px 2px 6px #00000029; +} + +.remove-btn { + border: none; + background-color: transparent; + font-size: 0.875em; + font-weight: bold; + margin-left: auto; +} + +.invite-btn{ + width: 9.4em; + height: 2.9em; + background: #FFFFFF; + box-shadow: 0px 3px 6px #1E202029; + border: 2px solid #212121; + border-radius: 30px; +} + +.account_btn { + background: white; + color: #D5D5D5; + border: none; + height: 2.9em; +} + +// ********TEXT******** + +.dataset-logo { + width: 6em; + height: 2.6em; + background: #F7DD72; + border-radius: 4px; + font-size: 0.875em; + // color: #212121; + // color: black; + // opacity: 0.75; +} + +.label-txt { + font-size: 0.875em; +} + +.label2-txt { + font-size: 1em; +} + +.label-txt, .label2-txt { + color: #848484; +} + +.dataset-label { + font-weight: bold; +} + +.uppercase { + text-transform: uppercase; +} + +.researcher { + font-size: 0.875em; + color: #008887; + padding-right: 0.5em; + align-self: center; + +} + +.header { + opacity: 0.6; + margin-top: 1em; + margin-bottom: 0.25em; +} + +.dataset-label, .header { + font-size: 1.25em; + color: #212121; +} + +.desc-txt { + width: 48.25em; + font-size: 1em; + color: #212121; + margin-bottom: 1.875em; +} + +.dmp-btn-label { + margin-right: 1em; + overflow: hidden; +} + +.doi-label { + font-size: 1em; + color: #212121; + opacity: 0.6; + margin-bottom: 0.3em; +} + +.doi-txt { + font-size: 0.8em; + letter-spacing: 0.009em; + color: #7D7D7D; + width: 12em; + height: 1em; + overflow: hidden; + border: none; + padding: 0px; +} + +.doi-panel { + height: 3.5em; + background: #FAFAFA; + border: 1px solid #D1D1D1; + border-radius: 4px; + flex-direction: row; + justify-content: space-between; +} + +.doi-link { + color: white; +} + +.frame { + background: #FFFFFF; + box-shadow: 0px 1px 5px #00000026; + border-radius: 4px; + overflow: hidden; +} + +.frame-txt { + color: #000000; +} + +.finalize-txt { + color: #129D99; +} + +.frame-txt, .finalize-txt { + font-size: 0.75em; + font-weight: bold; + letter-spacing: 0px; + text-transform: uppercase; + cursor: pointer; +} + +.hr-line { + border: 1px solid #DBDBDB; + // width: 274px; + // width: 17em; + width: 100%; +} + +.authors { + display: flex; + flex-direction: row; + justify-content: space-between; + width: 100%; +} + +.authors-label { + font-size: 0.875em; + color: #212121; + height: 1.4em; + margin-bottom: 0px; +} + +.authors-role { + font-size: 0.875em; + color: #A8A8A8; + height: 1.4em; + margin-bottom: 0px; +} + +// ********CENTER ELEMENTS******** + +.mat-mini-fab, .mat-mini-fab-icon, +.status-icon, .dataset-logo, .frame-btn, .finalize-btn { + display: flex; + justify-content: center; + align-items: center; +} + +.dataset-label, .dmp-btn, .add-dataset-btn, + .doi-panel, .researcher { + display: flex; + align-items: center; +} + +.show-more-btn { + display: flex; + justify-content: center; +} \ No newline at end of file diff --git a/dmp-frontend/src/app/ui/dataset/overview/dataset-overview.component.ts b/dmp-frontend/src/app/ui/dataset/overview/dataset-overview.component.ts new file mode 100644 index 000000000..5029a259a --- /dev/null +++ b/dmp-frontend/src/app/ui/dataset/overview/dataset-overview.component.ts @@ -0,0 +1,217 @@ +import { Component, OnInit } from '@angular/core'; +import { BaseComponent } from '@common/base/base.component'; +import { DatasetOverviewModel } from '@app/core/model/dataset/dataset-overview'; +import { BreadcrumbItem } from '@app/ui/misc/breadcrumb/definition/breadcrumb-item'; +import { Observable, of as observableOf, interval } from 'rxjs'; +import { ActivatedRoute, Router, Params } from '@angular/router'; +import { DatasetService } from '@app/core/services/dataset/dataset.service'; +import { TranslateService } from '@ngx-translate/core'; +import { AuthService } from '@app/core/services/auth/auth.service'; +import { MatDialog } from '@angular/material'; +import { SnackBarNotificationLevel, UiNotificationService } from '@app/core/services/notification/ui-notification-service'; +import { ConfigurationService } from '@app/core/services/configuration/configuration.service'; +import { Oauth2DialogService } from '@app/ui/misc/oauth2-dialog/service/oauth2-dialog.service'; +import { UserService } from '@app/core/services/user/user.service'; +import { takeUntil } from 'rxjs/operators'; +import { Principal } from '@app/core/model/auth/principal'; +import { Role } from '@app/core/common/enum/role'; +import { Location } from '@angular/common'; +import { UserInfoListingModel } from '@app/core/model/user/user-info-listing'; +import { DatasetStatus } from '@app/core/common/enum/dataset-status'; +import { ConfirmationDialogComponent } from '@common/modules/confirmation-dialog/confirmation-dialog.component'; + + +@Component({ + selector: 'app-dataset-overview', + templateUrl: './dataset-overview.component.html', + styleUrls: ['./dataset-overview.component.scss'] +}) +export class DatasetOverviewComponent extends BaseComponent implements OnInit { + + dataset: DatasetOverviewModel; + isNew = true; + isFinalized = false; + isPublicView = true; + hasPublishButton: boolean = true; + breadCrumbs: Observable = observableOf(); + isUserOwner: boolean; + expand = false; + hasDOIToken = false; + + constructor( + private route: ActivatedRoute, + private router: Router, + private datasetService: DatasetService, + private translate: TranslateService, + private authentication: AuthService, + private dialog: MatDialog, + private language: TranslateService, + private uiNotificationService: UiNotificationService, + private configurationService: ConfigurationService, + private oauth2DialogService: Oauth2DialogService, + private userService: UserService, + private location: Location + ) { + super(); + } + + ngOnInit() { + // Gets dataset data using parameter id + this.route.params + .pipe(takeUntil(this._destroyed)) + .subscribe((params: Params) => { + const itemId = params['id']; + const publicId = params['publicId']; + if (itemId != null) { + this.isNew = false; + this.isPublicView = false; + this.datasetService.getOverviewSingle(itemId) + .pipe(takeUntil(this._destroyed)) + .subscribe(data => { + this.dataset = data; + // this.checkLockStatus(this.dataset.id); + this.setIsUserOwner(); + const breadCrumbs = []; + breadCrumbs.push({ parentComponentName: null, label: this.language.instant('NAV-BAR.MY-DATASET-DESCRIPTIONS'), url: "/datasets" }); + breadCrumbs.push({ parentComponentName: 'DatasetListingComponent', label: this.dataset.label, url: '/datasets/overview/' + this.dataset.id }); + this.breadCrumbs = observableOf(breadCrumbs); + }, (error: any) => { + if (error.status === 404) { + return this.onFetchingDeletedCallbackError('/datasets/'); + } + if (error.status === 403) { + return this.onFetchingForbiddenCallbackError('/datasets/'); + } + }); + } + else if (publicId != null) { + this.isNew = false; + this.isFinalized = true; + this.isPublicView = true; + this.datasetService.getOverviewSinglePublic(publicId) + .pipe(takeUntil(this._destroyed)) + .subscribe(data => { + this.dataset = data; + // this.checkLockStatus(this.dataset.id); + this.setIsUserOwner(); + const breadCrumbs = []; + breadCrumbs.push({ parentComponentName: null, label: this.language.instant('NAV-BAR.PUBLIC DATASETS'), url: "/explore" }); + breadCrumbs.push({ parentComponentName: 'DatasetListingComponent', label: this.dataset.label, url: '/datasets/publicOverview/' + this.dataset.id }); + this.breadCrumbs = observableOf(breadCrumbs); + }, (error: any) => { + if (error.status === 404) { + return this.onFetchingDeletedCallbackError('/explore'); + } + if (error.status === 403) { + return this.onFetchingForbiddenCallbackError('/explore'); + } + }); + } + }); + } + + onFetchingDeletedCallbackError(redirectRoot: string) { + this.uiNotificationService.snackBarNotification(this.language.instant('DATASET-OVERVIEW.ERROR.DELETED-DATASET'), SnackBarNotificationLevel.Error); + this.router.navigate([redirectRoot]); + } + + onFetchingForbiddenCallbackError(redirectRoot: string) { + this.uiNotificationService.snackBarNotification(this.language.instant('DATASET-OVERVIEW.ERROR.FORBIDEN-DATASET'), SnackBarNotificationLevel.Error); + this.router.navigate([redirectRoot]); + } + + goBack(): void { + this.location.back(); + } + + setIsUserOwner() { + if (this.dataset) { + const principal: Principal = this.authentication.current(); + if (principal) this.isUserOwner = principal.id === this.dataset.users.find(x => x.role === Role.Owner).id; + } + } + + isUserDatasetRelated() { + const principal: Principal = this.authentication.current(); + let isRelated: boolean = false; + if (this.dataset && principal) { + this.dataset.users.forEach(element => { + if (element.id === principal.id) { + isRelated = true; + } + }) + } + return isRelated; + } + + roleDisplayFromList(value: UserInfoListingModel[]) { + const principal: Principal = this.authentication.current(); + let role: number; + if (principal) { + value.forEach(element => { + if (principal.id === element.id) { + role = element.role; + } + }); + } + if (role === Role.Owner) { + return this.translate.instant('DMP-LISTING.OWNER'); + } else if (role === Role.Member) { + return this.translate.instant('DMP-LISTING.MEMBER'); + } else { + return this.translate.instant('DMP-LISTING.OWNER'); + } + } + + public isAuthenticated(): boolean { + return !(!this.authentication.current()); + } + + cloneClicked(dataset: DatasetOverviewModel) { + this.router.navigate(['/datasets/clone/' + dataset.id]); + } + + isDraftDataset(dataset: DatasetOverviewModel) { + // return dataset.status == DatasetStatus.Draft; + } + + editClicked(dataset: DatasetOverviewModel) { + this.router.navigate(['/datasets/edit/' + dataset.id]); + } + + deleteClicked() { + const dialogRef = this.dialog.open(ConfirmationDialogComponent, { + maxWidth: '300px', + data: { + message: this.language.instant('GENERAL.CONFIRMATION-DIALOG.DELETE-ITEM'), + confirmButton: this.language.instant('GENERAL.CONFIRMATION-DIALOG.ACTIONS.DELETE'), + cancelButton: this.language.instant('GENERAL.CONFIRMATION-DIALOG.ACTIONS.CANCEL'), + isDeleteConfirmation: true + } + }); + dialogRef.afterClosed().pipe(takeUntil(this._destroyed)).subscribe(result => { + if (result) { + this.datasetService.delete(this.dataset.id) + .pipe(takeUntil(this._destroyed)) + .subscribe( + complete => { this.onCallbackSuccess() }, + error => this.onDeleteCallbackError(error) + ); + } + }); + } + + onCallbackSuccess(): void { + this.uiNotificationService.snackBarNotification(this.isNew ? this.language.instant('GENERAL.SNACK-BAR.SUCCESSFUL-CREATION') : this.language.instant('GENERAL.SNACK-BAR.SUCCESSFUL-UPDATE'), SnackBarNotificationLevel.Success); + this.router.navigate(['/datasets']); + } + + onDeleteCallbackError(error) { + this.uiNotificationService.snackBarNotification(error.error.message ? error.error.message : this.language.instant('GENERAL.SNACK-BAR.UNSUCCESSFUL-DELETE'), SnackBarNotificationLevel.Error); + } + + public getOrcidPath(): string { + return this.configurationService.orcidPath; + } + +} diff --git a/dmp-frontend/src/app/ui/dataset/overview/dataset-overview.module.ts b/dmp-frontend/src/app/ui/dataset/overview/dataset-overview.module.ts new file mode 100644 index 000000000..293bffdfb --- /dev/null +++ b/dmp-frontend/src/app/ui/dataset/overview/dataset-overview.module.ts @@ -0,0 +1,25 @@ +import { NgModule } from '@angular/core'; +import { FormattingModule } from '@app/core/formatting.module'; +import { AutoCompleteModule } from '@app/library/auto-complete/auto-complete.module'; +import { ConfirmationDialogModule } from '@common/modules/confirmation-dialog/confirmation-dialog.module'; +import { ExportMethodDialogModule } from '@app/library/export-method-dialog/export-method-dialog.module'; +import { UrlListingModule } from '@app/library/url-listing/url-listing.module'; +import { CommonFormsModule } from '@common/forms/common-forms.module'; +import { CommonUiModule } from '@common/ui/common-ui.module'; +import { DatasetOverviewComponent } from './dataset-overview.component'; + +@NgModule({ + imports: [ + CommonUiModule, + CommonFormsModule, + UrlListingModule, + ConfirmationDialogModule, + ExportMethodDialogModule, + FormattingModule, + AutoCompleteModule + ], + declarations: [ + DatasetOverviewComponent + ] +}) +export class DatasetOverviewModule { } \ No newline at end of file diff --git a/dmp-frontend/src/app/ui/dmp/overview/dmp-overview.component.html b/dmp-frontend/src/app/ui/dmp/overview/dmp-overview.component.html index 5faabb907..14334cf22 100644 --- a/dmp-frontend/src/app/ui/dmp/overview/dmp-overview.component.html +++ b/dmp-frontend/src/app/ui/dmp/overview/dmp-overview.component.html @@ -9,7 +9,7 @@
-

{{ dmp.label }}

+

{{ dmp.label }}

diff --git a/dmp-frontend/src/app/ui/explore-dataset/explore-dataset.module.ts b/dmp-frontend/src/app/ui/explore-dataset/explore-dataset.module.ts index b06554524..468946180 100644 --- a/dmp-frontend/src/app/ui/explore-dataset/explore-dataset.module.ts +++ b/dmp-frontend/src/app/ui/explore-dataset/explore-dataset.module.ts @@ -7,13 +7,15 @@ import { ExploreDatasetFiltersComponent } from '@app/ui/explore-dataset/filters/ import { ExploreDatasetListingItemComponent } from '@app/ui/explore-dataset/listing-item/explore-dataset-listing-item.component'; import { CommonFormsModule } from '@common/forms/common-forms.module'; import { CommonUiModule } from '@common/ui/common-ui.module'; +import { DatasetOverviewModule } from '../dataset/overview/dataset-overview.module'; @NgModule({ imports: [ CommonUiModule, CommonFormsModule, AutoCompleteModule, - ExploreDatasetRoutingModule + ExploreDatasetRoutingModule, + DatasetOverviewModule ], declarations: [ ExploreDatasetListingComponent, diff --git a/dmp-frontend/src/app/ui/explore-dataset/explore-dataset.routing.ts b/dmp-frontend/src/app/ui/explore-dataset/explore-dataset.routing.ts index fd9f14154..f1d28185b 100644 --- a/dmp-frontend/src/app/ui/explore-dataset/explore-dataset.routing.ts +++ b/dmp-frontend/src/app/ui/explore-dataset/explore-dataset.routing.ts @@ -1,6 +1,7 @@ import { NgModule } from '@angular/core'; import { RouterModule, Routes } from '@angular/router'; import { ExploreDatasetListingComponent } from './explore-dataset-listing.component'; +import { DatasetOverviewComponent } from '../dataset/overview/dataset-overview.component'; const routes: Routes = [ { @@ -9,6 +10,14 @@ const routes: Routes = [ data: { breadcrumb: true }, + }, + { + path: 'overview/:publicId', + component: DatasetOverviewComponent, + data: { + breadcrumb: true, + title: 'GENERAL.TITLES.EXPLORE-PLANS-OVERVIEW' + }, } ]; diff --git a/dmp-frontend/src/assets/i18n/en.json b/dmp-frontend/src/assets/i18n/en.json index 10bb1e2d2..66ec80215 100644 --- a/dmp-frontend/src/assets/i18n/en.json +++ b/dmp-frontend/src/assets/i18n/en.json @@ -561,6 +561,13 @@ "USE-DEFAULT": "Use Default Token" } }, + "DATASET-OVERVIEW": { + "DATASET-AUTHORS": "Dataset Authors", + "ERROR": { + "DELETED-DATASET": "The requested dataset is deleted", + "FORBIDEN-DATASET": "You are not allowed to access this dataset" + } + }, "DATASET-LISTING": { "TITLE": "Dataset Descriptions", "DATASET-DESCRIPTION": "Dataset Description", diff --git a/dmp-frontend/src/assets/i18n/es.json b/dmp-frontend/src/assets/i18n/es.json index 8c67bed8f..17f985fe5 100644 --- a/dmp-frontend/src/assets/i18n/es.json +++ b/dmp-frontend/src/assets/i18n/es.json @@ -552,13 +552,20 @@ }, "ERROR": { "DELETED-DMP": "El PGD solicitado está borrado", - "FORBIDEN-DMP": "You are not allowed to access this DMP" + "FORBIDEN-DMP": "No tiene permiso para acceder a esto DMP" }, "MULTIPLE-DIALOG": { "ZENODO-LOGIN": "Login with Zenodo", "USE-DEFAULT": "Use Default Token" } }, + "DATASET-OVERVIEW": { + "DATASET-AUTHORS": "Dataset Autores", + "ERROR": { + "DELETED-DATASET": "El Dataset solicitado está borrado", + "FORBIDEN-DATASET": "No tiene permiso para acceder a esto Dataset" + } + }, "DATASET-LISTING": { "TITLE": "Descripciones del Dataset", "DATASET-DESCRIPTION": "Descripción del Dataset", diff --git a/dmp-frontend/src/assets/i18n/gr.json b/dmp-frontend/src/assets/i18n/gr.json index 5bc65bc3d..4681aeeaa 100644 --- a/dmp-frontend/src/assets/i18n/gr.json +++ b/dmp-frontend/src/assets/i18n/gr.json @@ -556,6 +556,13 @@ "FORBIDEN-DMP": "Δεν επιτρέπεται η πρόσβαση σε αυτό το Σχέδιο Διαχείρισης Δεδομένων" } }, + "DATASET-OVERVIEW": { + "DATASET-AUTHORS": "Συγγραφείς Περιγραφής Δεδομένων", + "ERROR": { + "DELETED-DATASET": "H επιλεγμένη Περιγραφή Δεδομένων θα διαγραφεί", + "FORBIDEN-DATASET": "Δεν επιτρέπεται η πρόσβαση σε αυτή την Περιγραφή Δεδομένων" + } + }, "DATASET-LISTING": { "TITLE": "Περιγραφές Συνόλων Δεδομένων", "DATASET-DESCRIPTION": "Περιγραφή Δεδομένων", From 6d9dcc4ec93ff83e73d8395e774a270c8d0ef89f Mon Sep 17 00:00:00 2001 From: apapachristou Date: Fri, 3 Jul 2020 17:17:23 +0300 Subject: [PATCH 041/364] Dmp Listing (1st Commit) --- .../recent-edited-activity.component.html | 2 +- .../recent-edited-activity.component.ts | 59 +++--- .../ui/dmp/listing/dmp-listing.component.html | 172 ++++++++++-------- .../ui/dmp/listing/dmp-listing.component.scss | 154 ++++++++++++---- .../ui/dmp/listing/dmp-listing.component.ts | 72 +++++++- .../dmp-listing-item.component.html | 80 ++++++-- .../dmp-listing-item.component.scss | 166 +++++++++++++++++ .../dmp-listing-item.component.ts | 128 ++++++++++++- 8 files changed, 685 insertions(+), 148 deletions(-) diff --git a/dmp-frontend/src/app/ui/dashboard/recent-edited-activity/recent-edited-activity.component.html b/dmp-frontend/src/app/ui/dashboard/recent-edited-activity/recent-edited-activity.component.html index 9db1b30d9..5202bd3ec 100644 --- a/dmp-frontend/src/app/ui/dashboard/recent-edited-activity/recent-edited-activity.component.html +++ b/dmp-frontend/src/app/ui/dashboard/recent-edited-activity/recent-edited-activity.component.html @@ -38,7 +38,7 @@
- diff --git a/dmp-frontend/src/app/ui/dashboard/recent-edited-activity/recent-edited-activity.component.ts b/dmp-frontend/src/app/ui/dashboard/recent-edited-activity/recent-edited-activity.component.ts index 11b0872c3..a6de9996b 100644 --- a/dmp-frontend/src/app/ui/dashboard/recent-edited-activity/recent-edited-activity.component.ts +++ b/dmp-frontend/src/app/ui/dashboard/recent-edited-activity/recent-edited-activity.component.ts @@ -239,7 +239,7 @@ export class RecentEditedActivityComponent extends BaseComponent implements OnIn }); } - downloadPDF(id: string) { + downloadPdf(id: string) { this.dmpService.downloadPDF(id) .pipe(takeUntil(this._destroyed)) .subscribe(response => { @@ -260,6 +260,40 @@ export class RecentEditedActivityComponent extends BaseComponent implements OnIn }) } + downloadPDF(dataset: DatasetListingModel): void { + this.datasetWizardService.downloadPDF(dataset.id as string) + .pipe(takeUntil(this._destroyed)) + .subscribe(response => { + const blob = new Blob([response.body], { type: 'application/pdf' }); + const filename = this.getFilenameFromContentDispositionHeader(response.headers.get('Content-Disposition')); + + FileSaver.saveAs(blob, filename); + }); + } + + downloadDOCX(dataset: DatasetListingModel): void { + this.datasetWizardService.downloadDOCX(dataset.id as string) + .pipe(takeUntil(this._destroyed)) + .subscribe(response => { + const blob = new Blob([response.body], { type: 'application/msword' }); + const filename = this.getFilenameFromContentDispositionHeader(response.headers.get('Content-Disposition')); + + FileSaver.saveAs(blob, filename); + }); + + } + + downloadXML(dataset: DatasetListingModel): void { + this.datasetWizardService.downloadXML(dataset.id as string) + .pipe(takeUntil(this._destroyed)) + .subscribe(response => { + const blob = new Blob([response.body], { type: 'application/xml' }); + const filename = this.getFilenameFromContentDispositionHeader(response.headers.get('Content-Disposition')); + + FileSaver.saveAs(blob, filename); + }); + } + getFilenameFromContentDispositionHeader(header: string): string { const regex: RegExp = new RegExp(/filename[^;=\n]*=((['"]).*?\2|[^;\n]*)/g); @@ -341,29 +375,6 @@ export class RecentEditedActivityComponent extends BaseComponent implements OnIn }); } - downloadDOCX(dataset: RecentDatasetModel): void { - this.datasetWizardService.downloadDOCX(dataset.id as string) - .pipe(takeUntil(this._destroyed)) - .subscribe(response => { - const blob = new Blob([response.body], { type: 'application/msword' }); - const filename = this.getFilenameFromContentDispositionHeader(response.headers.get('Content-Disposition')); - - FileSaver.saveAs(blob, filename); - }); - - } - - downloadXML(dataset: RecentDatasetModel): void { - this.datasetWizardService.downloadXML(dataset.id as string) - .pipe(takeUntil(this._destroyed)) - .subscribe(response => { - const blob = new Blob([response.body], { type: 'application/xml' }); - const filename = this.getFilenameFromContentDispositionHeader(response.headers.get('Content-Disposition')); - - FileSaver.saveAs(blob, filename); - }); - } - public loadMore() { const fields: Array = ["-modified"]; const request = new DataTableRequest(this.startIndex, this.pageSize, { fields: fields }); diff --git a/dmp-frontend/src/app/ui/dmp/listing/dmp-listing.component.html b/dmp-frontend/src/app/ui/dmp/listing/dmp-listing.component.html index d1180c790..f8d882505 100644 --- a/dmp-frontend/src/app/ui/dmp/listing/dmp-listing.component.html +++ b/dmp-frontend/src/app/ui/dmp/listing/dmp-listing.component.html @@ -1,4 +1,33 @@ -
+
+
+
+ clear +
+

{{'DMP-LISTING.TEXT-INFO' | translate}}

+

{{'DMP-LISTING.TEXT-INFO-QUESTION' | translate}} {{'DMP-LISTING.LINK-ZENODO' | translate}} {{'DMP-LISTING.GET-IDEA' | translate}}

+
+
+
+
+
+ +
+
+
+ +
+
+ +
+
+
+
+
+
+ + + +
- @@ -30,7 +57,6 @@ cloud_upload {{'DMP-UPLOAD.ACTIONS.IMPORT' | translate}} - @@ -45,7 +71,6 @@
-
@@ -59,81 +84,84 @@
-
+
--> + + + + + + + --> diff --git a/dmp-frontend/src/app/ui/dmp/listing/dmp-listing.component.scss b/dmp-frontend/src/app/ui/dmp/listing/dmp-listing.component.scss index 8cf41554a..9b7bbc953 100644 --- a/dmp-frontend/src/app/ui/dmp/listing/dmp-listing.component.scss +++ b/dmp-frontend/src/app/ui/dmp/listing/dmp-listing.component.scss @@ -52,48 +52,138 @@ } .all-versions { - color: #999999 !important; + color: #999999 !important; } .dmp-label { - color: #089dbb !important; + color: #089dbb !important; } .import { - margin: 10px; - padding: 0px; - } + margin: 10px; + padding: 0px; +} - .more-horiz { - font-size: 28px; - color: #aaaaaa; - } +.more-horiz { + font-size: 28px; + color: #aaaaaa; +} - .more-icon :hover { - color: #00b29f; - } +.more-icon :hover { + color: #00b29f; +} - .header-image { - background: url("/assets/images/new-dashboard-bg.png") no-repeat; - background-size: cover; - margin-top: 70px; - min-height: 15em; - position: relative; - } +.header-image { + background: url("/assets/images/new-dashboard-bg.png") no-repeat; + background-size: cover; + margin-top: 70px; + min-height: 15em; + position: relative; +} - .header-text-container { - background: rgba(255, 255, 255, 0.7); - position: absolute; - bottom: 0px; - padding-left: 5em; - padding-right: 10em; - padding-top: 2em; - padding-bottom: 2em; - } - - .explore-dmp-content { - padding: 30px 15px; - } +.header-text-container { + background: rgba(255, 255, 255, 0.7); + position: absolute; + bottom: 0px; + padding-left: 5em; + padding-right: 10em; + padding-top: 2em; + padding-bottom: 2em; +} + +.explore-dmp-content { + padding: 30px 15px; +} + +.main-content { + background-color: #f5f5f5; + padding-top: 9.68rem; + padding-bottom: 3rem; + padding-left: 3rem; + padding-right: 3rem; + margin: 0; + display: flex; + flex-grow: 1; +} + +.card { + background: #ffffff 0% 0% no-repeat padding-box; + box-shadow: 0px 3px 6px #00000029; + border-radius: 4px; + // width: 987px; + margin-bottom: 3.75rem; + /* height: 407px; */ + opacity: 1; +} + +.card-title { + text-align: left; + font: Bold 20px/30px Roboto; + letter-spacing: 0px; + color: #212121; + padding-left: 40px; + /* padding-top: 40px; */ + padding-right: 55px; + opacity: 1; +} + +.card-content { + text-align: left; + font: Light 16px/26px Roboto; + letter-spacing: 0px; + color: #212121; + padding-left: 40px; + padding-top: 36px; + padding-bottom: 36px; + padding-right: 55px; + opacity: 1; +} + +.clear-icon { + cursor: pointer; +} + +.normal-btn { + min-width: 162px; + max-width: 256px; + height: 40px; + cursor: pointer; + background: #129d99 0% 0% no-repeat padding-box; + box-shadow: 0px 3px 6px #1e202029; + border-radius: 30px; + border: none; + color: #ffffff; + opacity: 1; + line-height: 1; + font-size: 0.87rem; + padding: 0.62rem 1.87rem; + margin-left: 40px; +} + +.yellow-btn { + min-width: 162px; + max-width: 256px; + height: 40px; + cursor: pointer; + background: #f7dd72 0% 0% no-repeat padding-box; + border-radius: 30px; + opacity: 1; + border: none; + color: #000000; + opacity: 1; + line-height: 1; + font-size: 0.87rem; + padding: 0.62rem 1.87rem; + margin-left: 40px; +} + +.info-text { + text-align: left; + font-weight: 300; + font-size: 1rem; + letter-spacing: 0px; + color: #212121; +} // .bot-paginator { // margin-top: auto; diff --git a/dmp-frontend/src/app/ui/dmp/listing/dmp-listing.component.ts b/dmp-frontend/src/app/ui/dmp/listing/dmp-listing.component.ts index 58ccae56c..9ad0be183 100644 --- a/dmp-frontend/src/app/ui/dmp/listing/dmp-listing.component.ts +++ b/dmp-frontend/src/app/ui/dmp/listing/dmp-listing.component.ts @@ -46,6 +46,10 @@ export class DmpListingComponent extends BaseComponent implements OnInit, IBread allVersions: boolean = false; groupLabel: string; isPublic: boolean = false; + public isVisible = true + + startIndex: number = 0; + pageSize: number = 5; constructor( private dmpService: DmpService, @@ -144,13 +148,15 @@ export class DmpListingComponent extends BaseComponent implements OnInit, IBread } refresh(resetPages = false) { - if (this._paginator.pageSize === undefined) this._paginator.pageSize = 10; - if (resetPages) this._paginator.pageIndex = 0; - const startIndex = this._paginator.pageIndex * this._paginator.pageSize; + // if (this._paginator.pageSize === undefined) this._paginator.pageSize = 10; + // if (resetPages) this._paginator.pageIndex = 0; + // const startIndex = this._paginator.pageIndex * this._paginator.pageSize; + let fields: Array = new Array(); // if (this.sort && this.sort.active) { fields = this.sort.direction === 'asc' ? ['+' + this.sort.active] : ['-' + this.sort.active]; } fields.push('-modified'); - const request = new DataTableRequest(startIndex, this._paginator.pageSize, { fields: fields }); + + const request = new DataTableRequest(this.startIndex, this.pageSize, { fields: fields }); let value = this.criteria.formGroup.value; request.criteria = { like: value.like, @@ -180,7 +186,7 @@ export class DmpListingComponent extends BaseComponent implements OnInit, IBread request.criteria.grantStatus = value.grantStatus; this.dmpService.getPaged(request, "listing").pipe(takeUntil(this._destroyed)).subscribe(result => { if (!result) { return []; } - if (this._paginator.pageIndex === 0) { this.totalCount = result.totalCount; } + // if (this._paginator.pageIndex === 0) { this.totalCount = result.totalCount; } result.data.map(item => { item['datasets'].map(dmp => { dmp.url = 'datasets/edit/' + dmp.url; @@ -193,6 +199,56 @@ export class DmpListingComponent extends BaseComponent implements OnInit, IBread }); } + public loadMore() { + this.startIndex = this.startIndex + this.pageSize; + const fields: Array = ["-modified"]; + const request = new DataTableRequest(this.startIndex, this.pageSize, { fields: fields }); + + // request.criteria = new DmpCriteria(); + // request.criteria.like = ""; + + let value = this.criteria.formGroup.value; + request.criteria = { + like: value.like, + grants: value.grants, + role: value.role + } + if (value.status == 2) { + request.criteria.isPublic = true; + } else { + request.criteria.status = value.status; + request.criteria.isPublic = false; + } + request.criteria.onlyPublic = this.isPublic; + if (this.isPublic) { + request.criteria.isPublic = true; + } + if (value.datasetTemplates) + request.criteria.datasetTemplates = value.datasetTemplates.map(x => x.id); + if (value.collaborators) + request.criteria.collaborators = value.collaborators.map(x => x.id); + if (value.organisations) + request.criteria.organisations = value.organisations.map(x => x.id); + if (this.itemId) { + request.criteria.groupIds = [this.itemId]; + request.criteria.allVersions = true; + } + request.criteria.grantStatus = value.grantStatus; + + this.dmpService.getPaged(request, "listing").pipe(takeUntil(this._destroyed)).subscribe(result => { + if (!result) { return []; } + result.data.map(item => { + item['datasets'].map(dmp => { + dmp.url = 'datasets/edit/' + dmp.url; + dmp.all = 'datasets/dmp/' + item.id; + return dmp; + }); + return item; + }); + this.listingItems = this.listingItems.concat(result.data); + }); + } + pageThisEvent(event) { this.refresh(); } @@ -201,6 +257,10 @@ export class DmpListingComponent extends BaseComponent implements OnInit, IBread // this.router.navigate(['/plans/overview/' + dmp.id]); // } + public closeCard(): void { + this.isVisible = false; + } + addDataset(rowId: String) { this.router.navigate(['/datasets/new/' + rowId]); } @@ -242,7 +302,7 @@ export class DmpListingComponent extends BaseComponent implements OnInit, IBread this.dmpService.uploadXml(result.fileList, result.dmpTitle, result.dmpProfiles) .pipe(takeUntil(this._destroyed)) .subscribe((complete) => this.onCallbackImportComplete(), - (error) => this.onCallbackImportFail(error.error)); + (error) => this.onCallbackImportFail(error.error)); } }); } diff --git a/dmp-frontend/src/app/ui/dmp/listing/listing-item/dmp-listing-item.component.html b/dmp-frontend/src/app/ui/dmp/listing/listing-item/dmp-listing-item.component.html index 57b224cb9..a2c494b47 100644 --- a/dmp-frontend/src/app/ui/dmp/listing/listing-item/dmp-listing-item.component.html +++ b/dmp-frontend/src/app/ui/dmp/listing/listing-item/dmp-listing-item.component.html @@ -1,4 +1,71 @@ -
-

{{ 'TYPES.DMP.DRAFT' | translate }}: {{dmp.label}}

{{dmp.label}}

-
@@ -85,13 +149,7 @@
-
-
+
--> diff --git a/dmp-frontend/src/app/ui/dmp/listing/listing-item/dmp-listing-item.component.scss b/dmp-frontend/src/app/ui/dmp/listing/listing-item/dmp-listing-item.component.scss index c7aab10fd..39c045d89 100644 --- a/dmp-frontend/src/app/ui/dmp/listing/listing-item/dmp-listing-item.component.scss +++ b/dmp-frontend/src/app/ui/dmp/listing/listing-item/dmp-listing-item.component.scss @@ -111,6 +111,172 @@ p { min-width: 74px; } +.dmp-card, +.dataset-card { + min-width: 712px; + /* min-height: 308px; */ + background: #ffffff 0% 0% no-repeat padding-box; + box-shadow: 0px 3px 6px #0000001a; + border-radius: 4px; + opacity: 1; + margin-top: 2.43rem; + margin-bottom: 1rem; +} + +.remove-border-bottom ::ng-deep .mat-tab-header { + border-bottom: none; +} + +input[type="text"] { + background: #fafafa 0% 0% no-repeat padding-box; + border: 1px solid #d1d1d1; + border-radius: 4px; + opacity: 1; + width: 347px; + height: 56px; + font-family: Arial, FontAwesome; + padding-left: 15px; +} + +.edited-date { + text-align: left; + font-weight: 300; + font-family: "Roboto", sans-serif; + line-height: 2.4; + letter-spacing: 0px; + color: #212121; + opacity: 0.6; +} + +.dmp-label { + background: #129d99 0% 0% no-repeat padding-box; + border-radius: 4px 0px; + opacity: 1; + width: 67px; + height: 37px; + color: #ffffff; + line-height: 2.4; + opacity: 0.75; +} + +.dataset-label { + width: 158px; + height: 37px; + background: #f7dd72 0% 0% no-repeat padding-box; + border-radius: 4px 0px; + text-align: left; + line-height: 2.8; + font-size: 0.875rem; + letter-spacing: 0px; + color: #212121; + opacity: 0.75; +} + +.dmp-title, +.dataset-title { + text-align: left; + font-weight: 500; + font-family: "Roboto", sans-serif; + font-size: 1rem; + opacity: 0.81; + padding-top: 0.75rem; + padding-bottom: 0.55rem; + color: #212121; +} + +.dataset-subtitle, +.dmp-subtitle { + display: flex; + flex-direction: row; + text-align: left; + font-weight: 400; + font-family: "Roboto", sans-serif; + font-size: 0.875rem; + opacity: 1; + align-items: center; + color: #848484; +} + +.dmp-title-draft { + text-align: left; + font-weight: 500; + font-family: "Roboto", sans-serif; + font-size: 1rem; + opacity: 0.81; + padding-top: 0.75rem; + padding-bottom: 0.55rem; + color: #f16868; +} + +.icon-align { + display: inline-flex; + vertical-align: middle; + padding-bottom: 0.4rem; +} + +.dataset-card-actions, +.dmp-card-actions { + display: flex; + flex-direction: row; + border-top: 1px solid #dbdbdb; + line-height: 4; + color: #848484; +} + +.dataset-card-actions a, +.dmp-card-actions a { + color: #848484 !important; + text-decoration: none !important; +} + +.dataset-card-actions a:hover, +.dmp-card-actions a:hover { + color: #129d99 !important; +} + +.dmp-dataset-descriptions-title { + color: #000000; + opacity: 0.6; + padding-top: 1.5rem; + padding-bottom: 0.8rem; +} + +.dmp-dataset-descriptions-name { + color: #000000; + opacity: 0.6; + font-weight: 700; +} + +.show-more { + color: black !important; +} + +.show-more:hover { + color: #129d99 !important; +} + +.btn-load-more { + border: 2px solid #212121; + border-radius: 30px; + opacity: 1; + width: 132px; + height: 40px; + margin-top: 4.125rem; +} + +.btn-load-more:hover { + background-color: black; + color: white; +} + +.draft { + color: #f16868; +} + +.pointer { + cursor: pointer; +} + ::ng-deep .mat-menu-panel { max-width: 282px !important; } diff --git a/dmp-frontend/src/app/ui/dmp/listing/listing-item/dmp-listing-item.component.ts b/dmp-frontend/src/app/ui/dmp/listing/listing-item/dmp-listing-item.component.ts index 0f20ccc2d..51d44dfe9 100644 --- a/dmp-frontend/src/app/ui/dmp/listing/listing-item/dmp-listing-item.component.ts +++ b/dmp-frontend/src/app/ui/dmp/listing/listing-item/dmp-listing-item.component.ts @@ -8,13 +8,21 @@ import { AuthService } from '../../../../core/services/auth/auth.service'; import { Principal } from '../../../../core/model/auth/principal'; import { TranslateService } from '@ngx-translate/core'; import { DmpStatus } from '../../../../core/common/enum/dmp-status'; +import { EnumUtils } from '@app/core/services/utilities/enum-utils.service'; +import { DmpService } from '@app/core/services/dmp/dmp.service'; +import { takeUntil } from 'rxjs/operators'; +import { BaseComponent } from '@common/base/base.component'; +import * as FileSaver from 'file-saver'; +import { ConfirmationDialogComponent } from '@common/modules/confirmation-dialog/confirmation-dialog.component'; +import { UiNotificationService, SnackBarNotificationLevel } from '@app/core/services/notification/ui-notification-service'; +import { Role } from '@app/core/common/enum/role'; @Component({ selector: 'app-dmp-listing-item-component', templateUrl: './dmp-listing-item.component.html', styleUrls: ['./dmp-listing-item.component.scss'], }) -export class DmpListingItemComponent implements OnInit { +export class DmpListingItemComponent extends BaseComponent implements OnInit { @Input() dmp: DmpListingModel; @Input() showDivider: boolean = true; @@ -29,7 +37,13 @@ export class DmpListingItemComponent implements OnInit { private router: Router, private dialog: MatDialog, private authentication: AuthService, - private translate: TranslateService) { } + public enumUtils: EnumUtils, + private dmpService: DmpService, + private language: TranslateService, + private translate: TranslateService, + private uiNotificationService: UiNotificationService) { + super(); + } ngOnInit() { if (this.dmp.status == DmpStatus.Draft) { @@ -105,4 +119,114 @@ export class DmpListingItemComponent implements OnInit { return this.translate.instant('DMP-LISTING.OWNER'); } } + + cloneClicked(dmp: DmpListingModel) { + this.router.navigate(['/plans/clone/' + dmp.id]); + } + + newVersion(id: String, label: String) { + this.router.navigate(['/plans/new_version/' + id, { dmpLabel: label }]); + } + + downloadXml(id: string) { + this.dmpService.downloadXML(id) + .pipe(takeUntil(this._destroyed)) + .subscribe(response => { + const blob = new Blob([response.body], { type: 'application/xml' }); + const filename = this.getFilenameFromContentDispositionHeader(response.headers.get('Content-Disposition')); + + FileSaver.saveAs(blob, filename); + }); + } + + downloadDocx(id: string) { + this.dmpService.downloadDocx(id) + .pipe(takeUntil(this._destroyed)) + .subscribe(response => { + const blob = new Blob([response.body], { type: 'application/msword' }); + const filename = this.getFilenameFromContentDispositionHeader(response.headers.get('Content-Disposition')); + + FileSaver.saveAs(blob, filename); + }); + } + + downloadPDF(id: string) { + this.dmpService.downloadPDF(id) + .pipe(takeUntil(this._destroyed)) + .subscribe(response => { + const blob = new Blob([response.body], { type: 'application/pdf' }); + const filename = this.getFilenameFromContentDispositionHeader(response.headers.get('Content-Disposition')); + + FileSaver.saveAs(blob, filename); + }); + } + + downloadJson(id: string) { + this.dmpService.downloadJson(id) + .pipe(takeUntil(this._destroyed)) + .subscribe(response => { + const blob = new Blob([response.body], { type: 'application/json' }); + const filename = this.getFilenameFromContentDispositionHeader(response.headers.get('Content-Disposition')); + FileSaver.saveAs(blob, filename); + }) + } + + getFilenameFromContentDispositionHeader(header: string): string { + const regex: RegExp = new RegExp(/filename[^;=\n]*=((['"]).*?\2|[^;\n]*)/g); + + const matches = header.match(regex); + let filename: string; + for (let i = 0; i < matches.length; i++) { + const match = matches[i]; + if (match.includes('filename="')) { + filename = match.substring(10, match.length - 1); + break; + } else if (match.includes('filename=')) { + filename = match.substring(9); + break; + } + } + return filename; + } + + deleteClicked(dmp: DmpListingModel) { + const dialogRef = this.dialog.open(ConfirmationDialogComponent, { + maxWidth: '300px', + restoreFocus: false, + data: { + message: this.language.instant('GENERAL.CONFIRMATION-DIALOG.DELETE-ITEM'), + confirmButton: this.language.instant('GENERAL.CONFIRMATION-DIALOG.ACTIONS.DELETE'), + cancelButton: this.language.instant('GENERAL.CONFIRMATION-DIALOG.ACTIONS.CANCEL'), + isDeleteConfirmation: true + } + }); + dialogRef.afterClosed().pipe(takeUntil(this._destroyed)).subscribe(result => { + if (result) { + this.dmpService.delete(dmp.id) + .pipe(takeUntil(this._destroyed)) + .subscribe( + complete => { this.onCallbackSuccess() }, + error => this.onDeleteCallbackError(error) + ); + } + }); + } + + isDraftDmp(activity: DmpListingModel) { + return activity.status == DmpStatus.Draft; + } + + onCallbackSuccess(): void { + this.uiNotificationService.snackBarNotification(this.language.instant('GENERAL.SNACK-BAR.SUCCESSFUL-UPDATE'), SnackBarNotificationLevel.Success); + this.router.navigate(['/plans']); + } + + onDeleteCallbackError(error) { + this.uiNotificationService.snackBarNotification(error.error.message ? error.error.message : this.language.instant('GENERAL.SNACK-BAR.UNSUCCESSFUL-DELETE'), SnackBarNotificationLevel.Error); + } + + isUserOwner(activity: DmpListingModel): boolean { + const principal: Principal = this.authentication.current(); + if (principal) return principal.id === activity.users.find(x => x.role === Role.Owner).id; + } } From 21d19dbf58b69f38a3f15f05ae3eae04f3112c6c Mon Sep 17 00:00:00 2001 From: gpapavgeri Date: Fri, 3 Jul 2020 18:31:35 +0300 Subject: [PATCH 042/364] dataset-overview_update v2 --- .../core/model/dataset/dataset-overview.ts | 3 +- .../overview/dataset-overview.component.html | 182 ++++++++---------- .../overview/dataset-overview.component.scss | 20 +- .../overview/dataset-overview.component.ts | 8 +- .../dmp/overview/dmp-overview.component.html | 2 +- dmp-frontend/src/assets/i18n/en.json | 2 +- dmp-frontend/src/assets/i18n/es.json | 2 +- 7 files changed, 105 insertions(+), 114 deletions(-) diff --git a/dmp-frontend/src/app/core/model/dataset/dataset-overview.ts b/dmp-frontend/src/app/core/model/dataset/dataset-overview.ts index 75d03a082..34bbe936c 100644 --- a/dmp-frontend/src/app/core/model/dataset/dataset-overview.ts +++ b/dmp-frontend/src/app/core/model/dataset/dataset-overview.ts @@ -1,4 +1,5 @@ import { DatasetProfileModel } from "./dataset-profile"; +import { GrantOverviewModel } from '../grant/grant-overview'; export interface DatasetOverviewModel { id: string; @@ -8,7 +9,7 @@ export interface DatasetOverviewModel { users: any[]; dmp: String; - grant: String; + grant: GrantOverviewModel; description: String; public: boolean; modified: Date; diff --git a/dmp-frontend/src/app/ui/dataset/overview/dataset-overview.component.html b/dmp-frontend/src/app/ui/dataset/overview/dataset-overview.component.html index 140569ba0..ea6fa3f22 100644 --- a/dmp-frontend/src/app/ui/dataset/overview/dataset-overview.component.html +++ b/dmp-frontend/src/app/ui/dataset/overview/dataset-overview.component.html @@ -1,38 +1,33 @@
- - - chevron_left -

{{'DMP-WIZARD.ACTIONS.BACK' | translate}}

-
-
-
-
- - -

Dataset Label dataset label

-
-
- -
-

- Owner - -

+
+ + chevron_left +

{{'DMP-WIZARD.ACTIONS.BACK' | translate}}

+
+
+
+
+ +

{{ dataset.label }}

-
- -
- public - - Public +
+
+

+ {{ roleDisplayFromList(dataset.users) }} +

- -
- - -
{{'GENERAL.STATUSES.EDIT' | translate}} : - - 03/07/2020 -
- -
-
- - - - - - - -
-
{{'DATASET-LISTING.TOOLTIP.PART-OF' | translate}}
-
-
- -
-
{{'DMP-OVERVIEW.GRANT' | translate}}
-
Label
+ +
+ +
{{'DMP-OVERVIEW.GRANT' | translate}}
+
Grant label
{{'DMP-OVERVIEW.RESEARCHERS' | translate}}
-
-
-
+ + + + + + +
-
\ No newline at end of file diff --git a/dmp-frontend/src/app/ui/dataset/overview/dataset-overview.component.scss b/dmp-frontend/src/app/ui/dataset/overview/dataset-overview.component.scss index 2370e3179..cc76c8022 100644 --- a/dmp-frontend/src/app/ui/dataset/overview/dataset-overview.component.scss +++ b/dmp-frontend/src/app/ui/dataset/overview/dataset-overview.component.scss @@ -52,11 +52,16 @@ .dmp-btn { width: 35em; - padding: 0 1em; + height: 2.3em; background-color: #129D99; border-radius: 4px; + flex-direction: rows; justify-content: space-between; - color: #212121; + border: none; +} + +.dmp-btn, .dmp-btn > mat-icon { + color: #ffffff; opacity: 0.8; } @@ -68,13 +73,6 @@ font-weight: 700; } -.add-dataset-btn { - border: none; - font: Bold 0.875em Open Sans; - color: #444444; - background-color: transparent; -} - .frame-btn { border: 1px solid #212121; color: black; @@ -176,6 +174,8 @@ .dmp-btn-label { margin-right: 1em; overflow: hidden; + color: #FFFFFF; + opacity: 0.8; } .doi-label { @@ -269,7 +269,7 @@ align-items: center; } -.dataset-label, .dmp-btn, .add-dataset-btn, +.dataset-label, .dmp-btn, .doi-panel, .researcher { display: flex; align-items: center; diff --git a/dmp-frontend/src/app/ui/dataset/overview/dataset-overview.component.ts b/dmp-frontend/src/app/ui/dataset/overview/dataset-overview.component.ts index 5029a259a..e7cbd4742 100644 --- a/dmp-frontend/src/app/ui/dataset/overview/dataset-overview.component.ts +++ b/dmp-frontend/src/app/ui/dataset/overview/dataset-overview.component.ts @@ -172,7 +172,7 @@ export class DatasetOverviewComponent extends BaseComponent implements OnInit { } isDraftDataset(dataset: DatasetOverviewModel) { - // return dataset.status == DatasetStatus.Draft; + return dataset.status == DatasetStatus.Draft; } editClicked(dataset: DatasetOverviewModel) { @@ -212,6 +212,10 @@ export class DatasetOverviewComponent extends BaseComponent implements OnInit { public getOrcidPath(): string { return this.configurationService.orcidPath; - } + } + + // showPublishButton(dataset: DatasetOverviewModel) { + // return this.isFinalizedDmp(dmp) && !dmp.isPublic && this.hasPublishButton; + // } } diff --git a/dmp-frontend/src/app/ui/dmp/overview/dmp-overview.component.html b/dmp-frontend/src/app/ui/dmp/overview/dmp-overview.component.html index 14334cf22..cd5c4e1f2 100644 --- a/dmp-frontend/src/app/ui/dmp/overview/dmp-overview.component.html +++ b/dmp-frontend/src/app/ui/dmp/overview/dmp-overview.component.html @@ -78,7 +78,7 @@
{{'DMP-OVERVIEW.RESEARCHERS' | translate}}
- +
 
{{ researcher.name }},
{{ researcher.name }}
diff --git a/dmp-frontend/src/assets/i18n/en.json b/dmp-frontend/src/assets/i18n/en.json index 453e3c1e8..11ed9caaf 100644 --- a/dmp-frontend/src/assets/i18n/en.json +++ b/dmp-frontend/src/assets/i18n/en.json @@ -567,7 +567,7 @@ } }, "DATASET-OVERVIEW": { - "DATASET-AUTHORS": "Dataset Authors", + "DATASET-AUTHORS": "Dataset description Authors", "ERROR": { "DELETED-DATASET": "The requested dataset is deleted", "FORBIDEN-DATASET": "You are not allowed to access this dataset" diff --git a/dmp-frontend/src/assets/i18n/es.json b/dmp-frontend/src/assets/i18n/es.json index ee404a301..dc4e1e6e4 100644 --- a/dmp-frontend/src/assets/i18n/es.json +++ b/dmp-frontend/src/assets/i18n/es.json @@ -565,7 +565,7 @@ } }, "DATASET-OVERVIEW": { - "DATASET-AUTHORS": "Dataset Autores", + "DATASET-AUTHORS": "Descripciones del Dataset Autores", "ERROR": { "DELETED-DATASET": "El Dataset solicitado está borrado", "FORBIDEN-DATASET": "No tiene permiso para acceder a esto Dataset" From 132f5675d363e0f433c3917b07172c7412c9e5c9 Mon Sep 17 00:00:00 2001 From: apapachristou Date: Fri, 3 Jul 2020 18:51:27 +0300 Subject: [PATCH 043/364] Adds Filters Dialog on Dmp Listing ( 2nd Commit ) --- dmp-frontend/src/app/ui/dmp/dmp.module.ts | 7 ++++-- .../dmp-criteria-dialog.component.html | 2 ++ .../criteria/dmp-criteria-dialog.component.ts | 24 +++++++++++++++++++ .../ui/dmp/listing/dmp-listing.component.html | 13 ++++++---- .../ui/dmp/listing/dmp-listing.component.scss | 13 ++++++++++ .../ui/dmp/listing/dmp-listing.component.ts | 17 +++++++++++++ dmp-frontend/src/assets/css/demo.css | 9 +++++++ 7 files changed, 78 insertions(+), 7 deletions(-) create mode 100644 dmp-frontend/src/app/ui/dmp/listing/criteria/dmp-criteria-dialog.component.html create mode 100644 dmp-frontend/src/app/ui/dmp/listing/criteria/dmp-criteria-dialog.component.ts diff --git a/dmp-frontend/src/app/ui/dmp/dmp.module.ts b/dmp-frontend/src/app/ui/dmp/dmp.module.ts index d331894da..9db709001 100644 --- a/dmp-frontend/src/app/ui/dmp/dmp.module.ts +++ b/dmp-frontend/src/app/ui/dmp/dmp.module.ts @@ -32,6 +32,7 @@ import { FormValidationErrorsDialogModule } from '@common/forms/form-validation- import { CommonUiModule } from '@common/ui/common-ui.module'; import { MultipleChoiceDialogModule } from '@common/modules/multiple-choice-dialog/multiple-choice-dialog.module'; import { AddOrganizationComponent } from './editor/add-organization/add-organization.component'; +import { DmpCriteriaDialogComponent } from './listing/criteria/dmp-criteria-dialog.component'; @NgModule({ imports: [ @@ -69,7 +70,8 @@ import { AddOrganizationComponent } from './editor/add-organization/add-organiza GrantTabComponent, DatasetsTabComponent, DmpCloneComponent, - AddOrganizationComponent + AddOrganizationComponent, + DmpCriteriaDialogComponent ], entryComponents: [ DmpInvitationDialogComponent, @@ -77,7 +79,8 @@ import { AddOrganizationComponent } from './editor/add-organization/add-organiza AvailableProfilesComponent, DmpFinalizeDialogComponent, DmpUploadDialogue, - AddOrganizationComponent + AddOrganizationComponent, + DmpCriteriaDialogComponent ] }) export class DmpModule { } diff --git a/dmp-frontend/src/app/ui/dmp/listing/criteria/dmp-criteria-dialog.component.html b/dmp-frontend/src/app/ui/dmp/listing/criteria/dmp-criteria-dialog.component.html new file mode 100644 index 000000000..a558369b6 --- /dev/null +++ b/dmp-frontend/src/app/ui/dmp/listing/criteria/dmp-criteria-dialog.component.html @@ -0,0 +1,2 @@ +
clear + diff --git a/dmp-frontend/src/app/ui/dmp/listing/criteria/dmp-criteria-dialog.component.ts b/dmp-frontend/src/app/ui/dmp/listing/criteria/dmp-criteria-dialog.component.ts new file mode 100644 index 000000000..945d900cf --- /dev/null +++ b/dmp-frontend/src/app/ui/dmp/listing/criteria/dmp-criteria-dialog.component.ts @@ -0,0 +1,24 @@ +import { Inject, Component } from '@angular/core'; +import { MAT_DIALOG_DATA, MatDialogRef } from '@angular/material'; + +@Component({ + selector: 'dmp-criteria-dialog-component', + templateUrl: './dmp-criteria-dialog.component.html', +}) + +export class DmpCriteriaDialogComponent { + + constructor( + public dialogRef: MatDialogRef, + @Inject(MAT_DIALOG_DATA) public data: { showGrant: boolean, isPublic: boolean } + ) { } + + onNoClick(): void { + this.dialogRef.close(); + } + + onClose(): void { + this.dialogRef.close(); + } + +} diff --git a/dmp-frontend/src/app/ui/dmp/listing/dmp-listing.component.html b/dmp-frontend/src/app/ui/dmp/listing/dmp-listing.component.html index f8d882505..ac5cf9a16 100644 --- a/dmp-frontend/src/app/ui/dmp/listing/dmp-listing.component.html +++ b/dmp-frontend/src/app/ui/dmp/listing/dmp-listing.component.html @@ -1,11 +1,14 @@
-
- clear -
-

{{'DMP-LISTING.TEXT-INFO' | translate}}

-

{{'DMP-LISTING.TEXT-INFO-QUESTION' | translate}} {{'DMP-LISTING.LINK-ZENODO' | translate}} {{'DMP-LISTING.GET-IDEA' | translate}}

+
+
+ clear +
+

{{'DMP-LISTING.TEXT-INFO' | translate}}

+

{{'DMP-LISTING.TEXT-INFO-QUESTION' | translate}} {{'DMP-LISTING.LINK-ZENODO' | translate}} {{'DMP-LISTING.GET-IDEA' | translate}}

+
+
diff --git a/dmp-frontend/src/app/ui/dmp/listing/dmp-listing.component.scss b/dmp-frontend/src/app/ui/dmp/listing/dmp-listing.component.scss index 9b7bbc953..3fe73fa18 100644 --- a/dmp-frontend/src/app/ui/dmp/listing/dmp-listing.component.scss +++ b/dmp-frontend/src/app/ui/dmp/listing/dmp-listing.component.scss @@ -185,6 +185,19 @@ color: #212121; } +.filter-btn { + position: fixed; + right: 0px; + z-index: 100; +} + +.filter-btn button { + color: white; + background-color: #23BCBA; + width: 52px; + height: 45px; +} + // .bot-paginator { // margin-top: auto; // } diff --git a/dmp-frontend/src/app/ui/dmp/listing/dmp-listing.component.ts b/dmp-frontend/src/app/ui/dmp/listing/dmp-listing.component.ts index 9ad0be183..1f74408d3 100644 --- a/dmp-frontend/src/app/ui/dmp/listing/dmp-listing.component.ts +++ b/dmp-frontend/src/app/ui/dmp/listing/dmp-listing.component.ts @@ -23,6 +23,7 @@ import { DmpUploadDialogue } from './upload-dialogue/dmp-upload-dialogue.compone import { UiNotificationService, SnackBarNotificationLevel } from '@app/core/services/notification/ui-notification-service'; import { isNullOrUndefined } from 'util'; import { AuthService } from '@app/core/services/auth/auth.service'; +import { DmpCriteriaDialogComponent } from './criteria/dmp-criteria-dialog.component'; @Component({ @@ -315,6 +316,22 @@ export class DmpListingComponent extends BaseComponent implements OnInit, IBread private onCallbackImportFail(error: any) { this.uiNotificationService.snackBarNotification(error.message, SnackBarNotificationLevel.Error); } + + openFiltersDialog(): void { + const dialogRef = this.dialog.open(DmpCriteriaDialogComponent, { + width: '456px', + height: '100%', + restoreFocus: false, + data: { + showGrant: this.showGrant, + isPublic: this.isPublic + }, + position: { right: '0px;' } + }); + + dialogRef.afterClosed().subscribe(result => { + }); + } } // export class DmpDataSource extends DataSource { diff --git a/dmp-frontend/src/assets/css/demo.css b/dmp-frontend/src/assets/css/demo.css index efae1933a..158a19232 100644 --- a/dmp-frontend/src/assets/css/demo.css +++ b/dmp-frontend/src/assets/css/demo.css @@ -657,6 +657,15 @@ hr { margin-top: 4.125rem; } +.btn-load-more:hover { + background-color: black; + color: white; +} + +.pointer { + cursor: pointer; +} + @media (min-width: 576px) { .container { max-width: 540px; From 7f56afad5f060ed52f6598db036c84cda0387580 Mon Sep 17 00:00:00 2001 From: George Kalampokis Date: Mon, 6 Jul 2020 11:40:00 +0300 Subject: [PATCH 044/364] Add OpenAIRE source for external Datasets --- .../logic/managers/DataRepositoryManager.java | 2 +- .../managers/ExternalDatasetManager.java | 2 +- .../eudat/logic/managers/FunderManager.java | 2 +- .../eu/eudat/logic/managers/GrantManager.java | 2 +- .../eudat/logic/managers/LicenseManager.java | 2 +- .../logic/managers/OrganisationsManager.java | 2 +- .../eudat/logic/managers/ProjectManager.java | 2 +- .../eudat/logic/managers/RegistryManager.java | 2 +- .../logic/managers/ResearcherManager.java | 2 +- .../eudat/logic/managers/ServiceManager.java | 2 +- .../logic/proxy/fetching/RemoteFetcher.java | 88 +++++++++++-------- .../external/ExternalDatasetSourcesModel.java | 12 +-- .../models/data/external/ExternalItem.java | 2 +- .../external/FundersExternalSourcesModel.java | 18 ++-- .../external/GrantsExternalSourcesModel.java | 16 ++-- .../LicensesExternalSourcesModel.java | 10 +-- .../OrganisationsExternalSourcesModel.java | 14 +-- .../ProjectsExternalSourcesModel.java | 16 ++-- .../RegistriesExternalSourcesModel.java | 12 +-- .../ResearchersExternalSourcesModel.java | 14 +-- .../external/ServiceExternalSourcesModel.java | 12 +-- .../external/TagExternalSourcesModel.java | 12 +-- .../resources/externalUrls/ExternalUrls.xml | 18 ++++ 23 files changed, 148 insertions(+), 116 deletions(-) diff --git a/dmp-backend/web/src/main/java/eu/eudat/logic/managers/DataRepositoryManager.java b/dmp-backend/web/src/main/java/eu/eudat/logic/managers/DataRepositoryManager.java index 31634fe0c..fc6cb8f9d 100644 --- a/dmp-backend/web/src/main/java/eu/eudat/logic/managers/DataRepositoryManager.java +++ b/dmp-backend/web/src/main/java/eu/eudat/logic/managers/DataRepositoryManager.java @@ -38,7 +38,7 @@ public class DataRepositoryManager { public List getDataRepositories(String query, String type, Principal principal) throws HugeResultSet, NoURLFound { ExternalUrlCriteria externalUrlCriteria = new ExternalUrlCriteria(query); - List> remoteRepos = this.apiContext.getOperationsContext().getRemoteFetcher().getRepositories(externalUrlCriteria, type); + List> remoteRepos = this.apiContext.getOperationsContext().getRemoteFetcher().getRepositories(externalUrlCriteria, type); DataRepositoryCriteria criteria = new DataRepositoryCriteria(); if (!query.isEmpty()) criteria.setLike(query); diff --git a/dmp-backend/web/src/main/java/eu/eudat/logic/managers/ExternalDatasetManager.java b/dmp-backend/web/src/main/java/eu/eudat/logic/managers/ExternalDatasetManager.java index f8f72ce31..2d8f12fa7 100644 --- a/dmp-backend/web/src/main/java/eu/eudat/logic/managers/ExternalDatasetManager.java +++ b/dmp-backend/web/src/main/java/eu/eudat/logic/managers/ExternalDatasetManager.java @@ -57,7 +57,7 @@ public class ExternalDatasetManager { // Fetch external Datasets from external sources. ExternalUrlCriteria externalUrlCriteria = new ExternalUrlCriteria(query); - List> remoteRepos = remoteFetcher.getDatasets(externalUrlCriteria, type); + List> remoteRepos = remoteFetcher.getDatasets(externalUrlCriteria, type); // Parse items from external sources to listing models. ObjectMapper mapper = new ObjectMapper().configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false); diff --git a/dmp-backend/web/src/main/java/eu/eudat/logic/managers/FunderManager.java b/dmp-backend/web/src/main/java/eu/eudat/logic/managers/FunderManager.java index a14a1e8df..fd4567e03 100644 --- a/dmp-backend/web/src/main/java/eu/eudat/logic/managers/FunderManager.java +++ b/dmp-backend/web/src/main/java/eu/eudat/logic/managers/FunderManager.java @@ -42,7 +42,7 @@ public class FunderManager { QueryableList authItems = apiContext.getOperationsContext().getDatabaseRepository().getFunderDao().getAuthenticated(items, userInfo); List funders = authItems.select(item -> new eu.eudat.models.data.funder.Funder().fromDataModel(item)); ExternalUrlCriteria externalUrlCriteria = new ExternalUrlCriteria(funderCriteria.getCriteria().getLike()); - List> remoteRepos = remoteFetcher.getFunders(externalUrlCriteria); + List> remoteRepos = remoteFetcher.getFunders(externalUrlCriteria); FundersExternalSourcesModel fundersExternalSourcesModel = new FundersExternalSourcesModel().fromExternalItem(remoteRepos); for (ExternalSourcesItemModel externalListingItem : fundersExternalSourcesModel) { eu.eudat.models.data.funder.Funder funder = apiContext.getOperationsContext().getBuilderFactory().getBuilder(FunderBuilder.class) diff --git a/dmp-backend/web/src/main/java/eu/eudat/logic/managers/GrantManager.java b/dmp-backend/web/src/main/java/eu/eudat/logic/managers/GrantManager.java index e020593ed..885940a36 100644 --- a/dmp-backend/web/src/main/java/eu/eudat/logic/managers/GrantManager.java +++ b/dmp-backend/web/src/main/java/eu/eudat/logic/managers/GrantManager.java @@ -126,7 +126,7 @@ public class GrantManager { QueryableList authItems = apiContext.getOperationsContext().getDatabaseRepository().getGrantDao().getAuthenticated(items, userInfo); List grants = authItems.select(item -> new Grant().fromDataModel(item)); - List> remoteRepos = remoteFetcher.getGrants(externalUrlCriteria); + List> remoteRepos = remoteFetcher.getGrants(externalUrlCriteria); GrantsExternalSourcesModel grantsExternalSourcesModel = new GrantsExternalSourcesModel().fromExternalItem(remoteRepos); for (ExternalSourcesItemModel externalListingItem : grantsExternalSourcesModel) { diff --git a/dmp-backend/web/src/main/java/eu/eudat/logic/managers/LicenseManager.java b/dmp-backend/web/src/main/java/eu/eudat/logic/managers/LicenseManager.java index da06aedd3..fe174fe29 100644 --- a/dmp-backend/web/src/main/java/eu/eudat/logic/managers/LicenseManager.java +++ b/dmp-backend/web/src/main/java/eu/eudat/logic/managers/LicenseManager.java @@ -33,7 +33,7 @@ public class LicenseManager { public List getLicenses(String query, String type) throws HugeResultSet, NoURLFound { ExternalUrlCriteria externalUrlCriteria = new ExternalUrlCriteria(query); - List> remoteRepos = this.apiContext.getOperationsContext().getRemoteFetcher().getlicenses(externalUrlCriteria, type); + List> remoteRepos = this.apiContext.getOperationsContext().getRemoteFetcher().getlicenses(externalUrlCriteria, type); DataRepositoryCriteria criteria = new DataRepositoryCriteria(); if (!query.isEmpty()) criteria.setLike(query); diff --git a/dmp-backend/web/src/main/java/eu/eudat/logic/managers/OrganisationsManager.java b/dmp-backend/web/src/main/java/eu/eudat/logic/managers/OrganisationsManager.java index 5e67be552..0860c3391 100644 --- a/dmp-backend/web/src/main/java/eu/eudat/logic/managers/OrganisationsManager.java +++ b/dmp-backend/web/src/main/java/eu/eudat/logic/managers/OrganisationsManager.java @@ -68,7 +68,7 @@ public class OrganisationsManager { public List getCriteriaWithExternal(String query, String type) throws HugeResultSet, NoURLFound { ExternalUrlCriteria externalUrlCriteria = new ExternalUrlCriteria(query); - List> remoteRepos = apiContext.getOperationsContext().getRemoteFetcher().getOrganisations(externalUrlCriteria, type); + List> remoteRepos = apiContext.getOperationsContext().getRemoteFetcher().getOrganisations(externalUrlCriteria, type); OrganisationsExternalSourcesModel organisationsExternalSourcesModel = new OrganisationsExternalSourcesModel().fromExternalItem(remoteRepos); List organisations = new LinkedList<>(); for (ExternalSourcesItemModel externalListingItem : organisationsExternalSourcesModel) { diff --git a/dmp-backend/web/src/main/java/eu/eudat/logic/managers/ProjectManager.java b/dmp-backend/web/src/main/java/eu/eudat/logic/managers/ProjectManager.java index 6919a5de5..f02242826 100644 --- a/dmp-backend/web/src/main/java/eu/eudat/logic/managers/ProjectManager.java +++ b/dmp-backend/web/src/main/java/eu/eudat/logic/managers/ProjectManager.java @@ -41,7 +41,7 @@ public class ProjectManager { QueryableList authItems = apiContext.getOperationsContext().getDatabaseRepository().getProjectDao().getAuthenticated(items, userInfo); List projects = authItems.select(item -> new Project().fromDataModel(item)); ExternalUrlCriteria externalUrlCriteria = new ExternalUrlCriteria(projectCriteria.getCriteria().getLike()); - List> remoteRepos = remoteFetcher.getProjects(externalUrlCriteria); + List> remoteRepos = remoteFetcher.getProjects(externalUrlCriteria); ProjectsExternalSourcesModel projectsExternalSourcesModel = new ProjectsExternalSourcesModel().fromExternalItem(remoteRepos); for (ExternalSourcesItemModel externalListingItem : projectsExternalSourcesModel) { eu.eudat.models.data.project.Project project = apiContext.getOperationsContext().getBuilderFactory().getBuilder(ProjectBuilder.class) diff --git a/dmp-backend/web/src/main/java/eu/eudat/logic/managers/RegistryManager.java b/dmp-backend/web/src/main/java/eu/eudat/logic/managers/RegistryManager.java index 9220d6221..c9444e002 100644 --- a/dmp-backend/web/src/main/java/eu/eudat/logic/managers/RegistryManager.java +++ b/dmp-backend/web/src/main/java/eu/eudat/logic/managers/RegistryManager.java @@ -39,7 +39,7 @@ public class RegistryManager { public List getRegistries(String query, String type, Principal principal) throws HugeResultSet, NoURLFound { ExternalUrlCriteria externalUrlCriteria = new ExternalUrlCriteria(query); - List> remoteRepos = this.apiContext.getOperationsContext().getRemoteFetcher().getRegistries(externalUrlCriteria, type); + List> remoteRepos = this.apiContext.getOperationsContext().getRemoteFetcher().getRegistries(externalUrlCriteria, type); RegistryCriteria criteria = new RegistryCriteria(); if (!query.isEmpty()) criteria.setLike(query); diff --git a/dmp-backend/web/src/main/java/eu/eudat/logic/managers/ResearcherManager.java b/dmp-backend/web/src/main/java/eu/eudat/logic/managers/ResearcherManager.java index 0d9104056..e7c54eecc 100644 --- a/dmp-backend/web/src/main/java/eu/eudat/logic/managers/ResearcherManager.java +++ b/dmp-backend/web/src/main/java/eu/eudat/logic/managers/ResearcherManager.java @@ -57,7 +57,7 @@ public class ResearcherManager { item.setTag(keyToSourceMap.get(item.getKey())); } ExternalUrlCriteria externalUrlCriteria = new ExternalUrlCriteria(researcherCriteriaRequest.getCriteria().getName()); - List> remoteRepos = remoteFetcher.getResearchers(externalUrlCriteria,null); + List> remoteRepos = remoteFetcher.getResearchers(externalUrlCriteria,null); ResearchersExternalSourcesModel researchersExternalSourcesModel = new ResearchersExternalSourcesModel().fromExternalItem(remoteRepos); for (ExternalSourcesItemModel externalListingItem : researchersExternalSourcesModel) { eu.eudat.models.data.dmp.Researcher researcher = apiContext.getOperationsContext().getBuilderFactory().getBuilder(ResearcherBuilder.class) diff --git a/dmp-backend/web/src/main/java/eu/eudat/logic/managers/ServiceManager.java b/dmp-backend/web/src/main/java/eu/eudat/logic/managers/ServiceManager.java index 222aa3675..2b724ca27 100644 --- a/dmp-backend/web/src/main/java/eu/eudat/logic/managers/ServiceManager.java +++ b/dmp-backend/web/src/main/java/eu/eudat/logic/managers/ServiceManager.java @@ -36,7 +36,7 @@ public class ServiceManager { public List getServices(String query, String type, Principal principal) throws HugeResultSet, NoURLFound { ExternalUrlCriteria externalUrlCriteria = new ExternalUrlCriteria(query); - List> remoteRepos = this.apiContext.getOperationsContext().getRemoteFetcher().getServices(externalUrlCriteria, type); + List> remoteRepos = this.apiContext.getOperationsContext().getRemoteFetcher().getServices(externalUrlCriteria, type); ServiceCriteria criteria = new ServiceCriteria(); if (!query.isEmpty()) criteria.setLike(query); diff --git a/dmp-backend/web/src/main/java/eu/eudat/logic/proxy/fetching/RemoteFetcher.java b/dmp-backend/web/src/main/java/eu/eudat/logic/proxy/fetching/RemoteFetcher.java index 41f42281c..05cad3823 100644 --- a/dmp-backend/web/src/main/java/eu/eudat/logic/proxy/fetching/RemoteFetcher.java +++ b/dmp-backend/web/src/main/java/eu/eudat/logic/proxy/fetching/RemoteFetcher.java @@ -43,7 +43,7 @@ public class RemoteFetcher { } @Cacheable("repositories") - public List> getRepositories(ExternalUrlCriteria externalUrlCriteria, String key) throws NoURLFound, HugeResultSet { + public List> getRepositories(ExternalUrlCriteria externalUrlCriteria, String key) throws NoURLFound, HugeResultSet { List urlConfigs = key != null && !key.isEmpty() ? configLoader.getExternalUrls().getRepositories().getUrls().stream().filter(item -> item.getKey().equals(key)).collect(Collectors.toList()) : configLoader.getExternalUrls().getRepositories().getUrls(); @@ -52,28 +52,28 @@ public class RemoteFetcher { } @Cacheable("grants") - public List> getGrants(ExternalUrlCriteria externalUrlCriteria) throws NoURLFound, HugeResultSet { + public List> getGrants(ExternalUrlCriteria externalUrlCriteria) throws NoURLFound, HugeResultSet { List urlConfigs = configLoader.getExternalUrls().getGrants().getUrls(); FetchStrategy fetchStrategy = configLoader.getExternalUrls().getGrants().getFetchMode(); return getAll(urlConfigs, fetchStrategy, externalUrlCriteria); } @Cacheable("projects") - public List> getProjects(ExternalUrlCriteria externalUrlCriteria) throws NoURLFound, HugeResultSet { + public List> getProjects(ExternalUrlCriteria externalUrlCriteria) throws NoURLFound, HugeResultSet { List urlConfigs = configLoader.getExternalUrls().getProjects().getUrls(); FetchStrategy fetchStrategy = configLoader.getExternalUrls().getProjects().getFetchMode(); return getAll(urlConfigs, fetchStrategy, externalUrlCriteria); } @Cacheable("funders") - public List> getFunders(ExternalUrlCriteria externalUrlCriteria) throws NoURLFound, HugeResultSet { + public List> getFunders(ExternalUrlCriteria externalUrlCriteria) throws NoURLFound, HugeResultSet { List urlConfigs = configLoader.getExternalUrls().getFunders().getUrls(); FetchStrategy fetchStrategy = configLoader.getExternalUrls().getFunders().getFetchMode(); return getAll(urlConfigs, fetchStrategy, externalUrlCriteria); } @Cacheable("organisations") - public List> getOrganisations(ExternalUrlCriteria externalUrlCriteria, String key) throws NoURLFound, HugeResultSet { + public List> getOrganisations(ExternalUrlCriteria externalUrlCriteria, String key) throws NoURLFound, HugeResultSet { List urlConfigs = key != null && !key.isEmpty() ? configLoader.getExternalUrls().getOrganisations().getUrls().stream().filter(item -> item.getKey().equals(key)).collect(Collectors.toList()) : configLoader.getExternalUrls().getOrganisations().getUrls(); @@ -82,7 +82,7 @@ public class RemoteFetcher { } @Cacheable("registries") - public List> getRegistries(ExternalUrlCriteria externalUrlCriteria, String key) throws NoURLFound, HugeResultSet { + public List> getRegistries(ExternalUrlCriteria externalUrlCriteria, String key) throws NoURLFound, HugeResultSet { List urlConfigs = key != null && !key.isEmpty() ? configLoader.getExternalUrls().getRegistries().getUrls().stream().filter(item -> item.getKey().equals(key)).collect(Collectors.toList()) : configLoader.getExternalUrls().getRegistries().getUrls(); @@ -91,7 +91,7 @@ public class RemoteFetcher { } @Cacheable("services") - public List> getServices(ExternalUrlCriteria externalUrlCriteria, String key) throws NoURLFound, HugeResultSet { + public List> getServices(ExternalUrlCriteria externalUrlCriteria, String key) throws NoURLFound, HugeResultSet { List urlConfigs = key != null && !key.isEmpty() ? configLoader.getExternalUrls().getServices().getUrls().stream().filter(item -> item.getKey().equals(key)).collect(Collectors.toList()) : configLoader.getExternalUrls().getServices().getUrls(); @@ -100,7 +100,7 @@ public class RemoteFetcher { } @Cacheable("researchers") - public List> getResearchers(ExternalUrlCriteria externalUrlCriteria, String key) throws NoURLFound, HugeResultSet { + public List> getResearchers(ExternalUrlCriteria externalUrlCriteria, String key) throws NoURLFound, HugeResultSet { List urlConfigs = key != null && !key.isEmpty() ? configLoader.getExternalUrls().getResearchers().getUrls().stream().filter(item -> item.getKey().equals(key)).collect(Collectors.toList()) : configLoader.getExternalUrls().getResearchers().getUrls(); @@ -118,7 +118,7 @@ public class RemoteFetcher { }*/ @Cacheable("externalDatasets") - public List> getDatasets(ExternalUrlCriteria externalUrlCriteria, String key) throws NoURLFound, HugeResultSet { + public List> getDatasets(ExternalUrlCriteria externalUrlCriteria, String key) throws NoURLFound, HugeResultSet { List urlConfigs = key != null && !key.isEmpty() ? configLoader.getExternalUrls().getDatasets().getUrls().stream().filter(item -> item.getKey().equals(key)).collect(Collectors.toList()) : configLoader.getExternalUrls().getDatasets().getUrls(); @@ -127,7 +127,7 @@ public class RemoteFetcher { } @Cacheable("licenses") - public List> getlicenses(ExternalUrlCriteria externalUrlCriteria, String key) throws NoURLFound, HugeResultSet { + public List> getlicenses(ExternalUrlCriteria externalUrlCriteria, String key) throws NoURLFound, HugeResultSet { List urlConfigs = key != null && !key.isEmpty() ? configLoader.getExternalUrls().getLicenses().getUrls().stream().filter(item -> item.getKey().equals(key)).collect(Collectors.toList()) : configLoader.getExternalUrls().getLicenses().getUrls(); @@ -136,9 +136,9 @@ public class RemoteFetcher { } - private List> getAll(List urlConfigs, FetchStrategy fetchStrategy, ExternalUrlCriteria externalUrlCriteria) throws NoURLFound, HugeResultSet { + private List> getAll(List urlConfigs, FetchStrategy fetchStrategy, ExternalUrlCriteria externalUrlCriteria) throws NoURLFound, HugeResultSet { - List> results = new LinkedList<>(); + List> results = new LinkedList<>(); if (urlConfigs == null || urlConfigs.isEmpty()) return results; // throw new NoURLFound("No Repository urls found in configuration"); @@ -217,7 +217,7 @@ public class RemoteFetcher { return completedPath; } - private List> getAllResultsFromUrl(String path, FetchStrategy fetchStrategy, final DataUrlConfiguration jsonDataPath, final String jsonPaginationPath, ExternalUrlCriteria externalUrlCriteria, String tag, String key, String contentType, String firstPage) throws HugeResultSet { + private List> getAllResultsFromUrl(String path, FetchStrategy fetchStrategy, final DataUrlConfiguration jsonDataPath, final String jsonPaginationPath, ExternalUrlCriteria externalUrlCriteria, String tag, String key, String contentType, String firstPage) throws HugeResultSet { Set pages = new HashSet<>(); String replacedPath = replaceCriteriaOnUrl(path, externalUrlCriteria, firstPage); @@ -277,12 +277,26 @@ public class RemoteFetcher { + "[" + jsonDataPath.getFieldsUrlConfiguration().getName() + "," + jsonDataPath.getFieldsUrlConfiguration().getId() + "]"), new HashMap<>(1, 1)); - List> fixedResults = results.getResults().stream().map(item -> { + List> fixedResults = results.getResults().stream().map(item -> { String id = jsonDataPath.getFieldsUrlConfiguration().getId().replace("'", ""); + String name = jsonDataPath.getFieldsUrlConfiguration().getName().replace("'", ""); if (! (item.get(id) instanceof String)) { - Object obj = item.get(id); - JSONArray jarr = (JSONArray) obj; - item.put(id, jarr.get(0).toString()); + if (item.get(id) instanceof LinkedHashMap) { + item.put(id, ((Map)item.get(id)).get("content")); + } else { + Object obj = item.get(id); + JSONArray jarr = (JSONArray) obj; + item.put(id, jarr.get(0).toString()); + } + } + if (! (item.get(name) instanceof String)) { + if (item.get(name) instanceof LinkedHashMap) { + item.put(name, ((Map)item.get(name)).get("content")); + } else { + Object obj = item.get(name); + JSONArray jarr = (JSONArray) obj; + item.put(name, ((Map)jarr.get(1)).get("content")); + } } return item; }).collect(Collectors.toList()); @@ -294,10 +308,10 @@ public class RemoteFetcher { + "," + jsonDataPath.getFieldsUrlConfiguration().getHost() + "]"), new HashMap<>(1, 1)); - List> multiResults = results.results.stream().map(result -> { + List> multiResults = results.results.stream().map(result -> { ExternalUrlCriteria externalUrlCriteria = new ExternalUrlCriteria(); - externalUrlCriteria.setPath(result.get("path")); - externalUrlCriteria.setHost(result.get("host")); + externalUrlCriteria.setPath((String) result.get("path")); + externalUrlCriteria.setHost((String) result.get("host")); String replacedPath = replaceCriteriaOnUrl(jsonDataPath.getUrlConfiguration().getUrl(), externalUrlCriteria, jsonDataPath.getUrlConfiguration().getFirstpage()); return getResultsFromUrl(replacedPath, jsonDataPath.getUrlConfiguration().getData(), jsonDataPath.getUrlConfiguration().getData().getPath(), jsonDataPath.getUrlConfiguration().getContentType()); }).filter(Objects::nonNull).map(results1 -> results1.results.get(0)).collect(Collectors.toList()); @@ -306,9 +320,9 @@ public class RemoteFetcher { List> tempRes = jsonContext.read(jsonDataPath.getPath() + "[" + jsonDataPath.getFieldsUrlConfiguration().getId() + "," + jsonDataPath.getFieldsUrlConfiguration().getName() + "," + jsonDataPath.getFieldsUrlConfiguration().getTypes() + "," + jsonDataPath.getFieldsUrlConfiguration().getUri() + "]"); - List> finalRes = new ArrayList<>(); + List> finalRes = new ArrayList<>(); tempRes.forEach(map -> { - Map resMap = new HashMap<>(); + Map resMap = new HashMap<>(); map.forEach((key, value) -> { if (key.equals(jsonDataPath.getFieldsUrlConfiguration().getTypes().substring(1, jsonDataPath.getFieldsUrlConfiguration().getTypes().length() - 1))) { resMap.put("tags", ((JSONArray) value).toJSONString()); @@ -343,7 +357,7 @@ public class RemoteFetcher { reader = new PropertyDescriptor(jsonDataPath.getParseField(), aClass).getReadMethod(); } ObjectMapper objectMapper = new ObjectMapper(); - List> values = new ArrayList<>(); + List> values = new ArrayList<>(); int max = 1; if (reader != null) { Object invokedField = reader.invoke(data); @@ -363,10 +377,10 @@ public class RemoteFetcher { } else { value = data; } - Map map = objectMapper.convertValue(value, Map.class); + Map map = objectMapper.convertValue(value, Map.class); if (jsonDataPath.getMergedFields() != null && !jsonDataPath.getMergedFields().isEmpty() && jsonDataPath.getMergedFieldName() != null && !jsonDataPath.getMergedFieldName().isEmpty()) { - Map finalMap = new HashMap<>(); - for (Map.Entry entry : map.entrySet()) { + Map finalMap = new HashMap<>(); + for (Map.Entry entry : map.entrySet()) { if (jsonDataPath.getMergedFields().contains(entry.getKey())) { if (!finalMap.containsKey(jsonDataPath.getMergedFieldName())) { finalMap.put(jsonDataPath.getMergedFieldName(), entry.getValue()); @@ -402,8 +416,8 @@ public class RemoteFetcher { return null; } - private List> getAllResultsFromMockUpJson(String path, String query) { - List> internalResults; + private List> getAllResultsFromMockUpJson(String path, String query) { + List> internalResults; try { String filePath = Paths.get(path).toUri().toURL().toString(); ObjectMapper mapper = new ObjectMapper(); @@ -415,14 +429,14 @@ public class RemoteFetcher { } } - private List> searchListMap(List> internalResults, String query) { - List> list = new LinkedList<>(); - for (Map map : internalResults) + private List> searchListMap(List> internalResults, String query) { + List> list = new LinkedList<>(); + for (Map map : internalResults) { - if (map.get("name") != null && map.get("name").toUpperCase().contains(query.toUpperCase())) { + if (map.get("name") != null && ((String)map.get("name")).toUpperCase().contains(query.toUpperCase())) { list.add(map); } - if (map.get("label") != null && map.get("label").toUpperCase().contains(query.toUpperCase())) { + if (map.get("label") != null && ((String)map.get("label")).toUpperCase().contains(query.toUpperCase())) { list.add(map); } } @@ -443,7 +457,7 @@ public class RemoteFetcher { static class Results { - List> results; + List> results; Map pagination; Results() { @@ -451,16 +465,16 @@ public class RemoteFetcher { this.pagination = new HashMap<>(); } - Results(List> results, Map pagination) { + Results(List> results, Map pagination) { this.results = results; this.pagination = pagination; } - List> getResults() { + List> getResults() { return results; } - public void setResults(List> results) { + public void setResults(List> results) { this.results = results; } diff --git a/dmp-backend/web/src/main/java/eu/eudat/models/data/external/ExternalDatasetSourcesModel.java b/dmp-backend/web/src/main/java/eu/eudat/models/data/external/ExternalDatasetSourcesModel.java index 405e5ee92..0e19c57f2 100644 --- a/dmp-backend/web/src/main/java/eu/eudat/models/data/external/ExternalDatasetSourcesModel.java +++ b/dmp-backend/web/src/main/java/eu/eudat/models/data/external/ExternalDatasetSourcesModel.java @@ -6,13 +6,13 @@ import java.util.Map; public class ExternalDatasetSourcesModel extends ExternalListingItem { @Override - public ExternalDatasetSourcesModel fromExternalItem(List> values) { - for (Map item : values) { + public ExternalDatasetSourcesModel fromExternalItem(List> values) { + for (Map item : values) { ExternalSourcesItemModel model = new ExternalSourcesItemModel(); - model.setId(item.get("pid")); - model.setUri(item.get("uri")); - model.setName(item.get("name")); - model.setSource(item.get("source")); + model.setId((String)item.get("pid")); + model.setUri((String)item.get("uri")); + model.setName((String)item.get("name")); + model.setSource((String)item.get("source")); this.add(model); } return this; diff --git a/dmp-backend/web/src/main/java/eu/eudat/models/data/external/ExternalItem.java b/dmp-backend/web/src/main/java/eu/eudat/models/data/external/ExternalItem.java index a8fed07a2..65c05c520 100644 --- a/dmp-backend/web/src/main/java/eu/eudat/models/data/external/ExternalItem.java +++ b/dmp-backend/web/src/main/java/eu/eudat/models/data/external/ExternalItem.java @@ -5,5 +5,5 @@ import java.util.Map; public interface ExternalItem { - T fromExternalItem(List> values); + T fromExternalItem(List> values); } diff --git a/dmp-backend/web/src/main/java/eu/eudat/models/data/external/FundersExternalSourcesModel.java b/dmp-backend/web/src/main/java/eu/eudat/models/data/external/FundersExternalSourcesModel.java index 9ef6c2c8d..78a766235 100644 --- a/dmp-backend/web/src/main/java/eu/eudat/models/data/external/FundersExternalSourcesModel.java +++ b/dmp-backend/web/src/main/java/eu/eudat/models/data/external/FundersExternalSourcesModel.java @@ -6,16 +6,16 @@ import java.util.Map; public class FundersExternalSourcesModel extends ExternalListingItem { @Override - public FundersExternalSourcesModel fromExternalItem(List> values) { - for (Map item : values) { + public FundersExternalSourcesModel fromExternalItem(List> values) { + for (Map item : values) { ExternalSourcesItemModel model = new ExternalSourcesItemModel(); - model.setRemoteId(item.get("pid")); - model.setUri(item.get("uri")); - model.setName(item.get("name")); - model.setDescription(item.get("description")); - model.setSource(item.get("source")); - model.setTag(item.get("tag")); - model.setKey(item.get("key")); + model.setRemoteId((String)item.get("pid")); + model.setUri((String)item.get("uri")); + model.setName((String)item.get("name")); + model.setDescription((String)item.get("description")); + model.setSource((String)item.get("source")); + model.setTag((String)item.get("tag")); + model.setKey((String)item.get("key")); this.add(model); } return this; diff --git a/dmp-backend/web/src/main/java/eu/eudat/models/data/external/GrantsExternalSourcesModel.java b/dmp-backend/web/src/main/java/eu/eudat/models/data/external/GrantsExternalSourcesModel.java index f960310e1..0a9e442c2 100644 --- a/dmp-backend/web/src/main/java/eu/eudat/models/data/external/GrantsExternalSourcesModel.java +++ b/dmp-backend/web/src/main/java/eu/eudat/models/data/external/GrantsExternalSourcesModel.java @@ -6,15 +6,15 @@ import java.util.Map; public class GrantsExternalSourcesModel extends ExternalListingItem { @Override - public GrantsExternalSourcesModel fromExternalItem(List> values) { - for (Map item : values) { + public GrantsExternalSourcesModel fromExternalItem(List> values) { + for (Map item : values) { ExternalSourcesItemModel model = new ExternalSourcesItemModel(); - model.setRemoteId(item.get("pid")); - model.setUri(item.get("uri")); - model.setName(item.get("name")); - model.setDescription(item.get("description")); - model.setTag(item.get("tag")); - model.setKey(item.get("key")); + model.setRemoteId((String)item.get("pid")); + model.setUri((String)item.get("uri")); + model.setName((String)item.get("name")); + model.setDescription((String)item.get("description")); + model.setTag((String)item.get("tag")); + model.setKey((String)item.get("key")); this.add(model); } return this; diff --git a/dmp-backend/web/src/main/java/eu/eudat/models/data/external/LicensesExternalSourcesModel.java b/dmp-backend/web/src/main/java/eu/eudat/models/data/external/LicensesExternalSourcesModel.java index 0f8d648ac..18c3793f4 100644 --- a/dmp-backend/web/src/main/java/eu/eudat/models/data/external/LicensesExternalSourcesModel.java +++ b/dmp-backend/web/src/main/java/eu/eudat/models/data/external/LicensesExternalSourcesModel.java @@ -6,12 +6,12 @@ import java.util.Map; public class LicensesExternalSourcesModel extends ExternalListingItem { @Override - public LicensesExternalSourcesModel fromExternalItem(List> values) { - for (Map item : values) { + public LicensesExternalSourcesModel fromExternalItem(List> values) { + for (Map item : values) { ExternalSourcesItemModel model = new ExternalSourcesItemModel(); - model.setId(item.get("id")); - model.setUri(item.get("uri")); - model.setName(item.get("name")); + model.setId((String)item.get("id")); + model.setUri((String)item.get("uri")); + model.setName((String)item.get("name")); this.add(model); } return this; diff --git a/dmp-backend/web/src/main/java/eu/eudat/models/data/external/OrganisationsExternalSourcesModel.java b/dmp-backend/web/src/main/java/eu/eudat/models/data/external/OrganisationsExternalSourcesModel.java index 6a91d9b13..66a94b38f 100644 --- a/dmp-backend/web/src/main/java/eu/eudat/models/data/external/OrganisationsExternalSourcesModel.java +++ b/dmp-backend/web/src/main/java/eu/eudat/models/data/external/OrganisationsExternalSourcesModel.java @@ -8,14 +8,14 @@ import java.util.Map; @Component public class OrganisationsExternalSourcesModel extends ExternalListingItem { @Override - public OrganisationsExternalSourcesModel fromExternalItem(List> values) { - for (Map item : values) { + public OrganisationsExternalSourcesModel fromExternalItem(List> values) { + for (Map item : values) { ExternalSourcesItemModel model = new ExternalSourcesItemModel(); - model.setRemoteId(item.get("pid")); - model.setUri(item.get("uri")); - model.setName(item.get("name")); - model.setTag(item.get("tag")); - model.setKey(item.get("key")); + model.setRemoteId((String)item.get("pid")); + model.setUri((String)item.get("uri")); + model.setName((String)item.get("name")); + model.setTag((String)item.get("tag")); + model.setKey((String)item.get("key")); this.add(model); } return this; diff --git a/dmp-backend/web/src/main/java/eu/eudat/models/data/external/ProjectsExternalSourcesModel.java b/dmp-backend/web/src/main/java/eu/eudat/models/data/external/ProjectsExternalSourcesModel.java index 3fc922d09..1d83d7939 100644 --- a/dmp-backend/web/src/main/java/eu/eudat/models/data/external/ProjectsExternalSourcesModel.java +++ b/dmp-backend/web/src/main/java/eu/eudat/models/data/external/ProjectsExternalSourcesModel.java @@ -14,8 +14,8 @@ public class ProjectsExternalSourcesModel extends ExternalListingItem> values) { - for (Map item : values) { + public ProjectsExternalSourcesModel fromExternalItem(List> values) { + for (Map item : values) { ExternalSourcesItemModel model = new ExternalSourcesItemModel(); try { JsonNode node = mapper.readTree(mapper.writeValueAsBytes(item)); @@ -23,42 +23,42 @@ public class ProjectsExternalSourcesModel extends ExternalListingItem { @Override - public RegistriesExternalSourcesModel fromExternalItem(List> values) { - for (Map item : values) { + public RegistriesExternalSourcesModel fromExternalItem(List> values) { + for (Map item : values) { ExternalSourcesItemModel model = new ExternalSourcesItemModel(); - model.setId(item.get("pid")); - model.setUri(item.get("uri")); - model.setName(item.get("name")); - model.setTag(item.get("tag")); + model.setId((String)item.get("pid")); + model.setUri((String)item.get("uri")); + model.setName((String)item.get("name")); + model.setTag((String)item.get("tag")); this.add(model); } return this; diff --git a/dmp-backend/web/src/main/java/eu/eudat/models/data/external/ResearchersExternalSourcesModel.java b/dmp-backend/web/src/main/java/eu/eudat/models/data/external/ResearchersExternalSourcesModel.java index 63a5529d4..c8563d82e 100644 --- a/dmp-backend/web/src/main/java/eu/eudat/models/data/external/ResearchersExternalSourcesModel.java +++ b/dmp-backend/web/src/main/java/eu/eudat/models/data/external/ResearchersExternalSourcesModel.java @@ -6,14 +6,14 @@ import java.util.Map; public class ResearchersExternalSourcesModel extends ExternalListingItem { @Override - public ResearchersExternalSourcesModel fromExternalItem(List> values) { - for (Map item : values) { + public ResearchersExternalSourcesModel fromExternalItem(List> values) { + for (Map item : values) { ExternalSourcesItemModel model = new ExternalSourcesItemModel(); - model.setRemoteId(item.get("pid")); - model.setUri(item.get("uri")); - model.setName(item.get("name")); - model.setTag(item.get("tag")); - model.setKey(item.get("key")); + model.setRemoteId((String)item.get("pid")); + model.setUri((String)item.get("uri")); + model.setName((String)item.get("name")); + model.setTag((String)item.get("tag")); + model.setKey((String)item.get("key")); this.add(model); } return this; diff --git a/dmp-backend/web/src/main/java/eu/eudat/models/data/external/ServiceExternalSourcesModel.java b/dmp-backend/web/src/main/java/eu/eudat/models/data/external/ServiceExternalSourcesModel.java index 20ff5716d..316e10f6f 100644 --- a/dmp-backend/web/src/main/java/eu/eudat/models/data/external/ServiceExternalSourcesModel.java +++ b/dmp-backend/web/src/main/java/eu/eudat/models/data/external/ServiceExternalSourcesModel.java @@ -6,13 +6,13 @@ import java.util.Map; public class ServiceExternalSourcesModel extends ExternalListingItem { @Override - public ServiceExternalSourcesModel fromExternalItem(List> values) { - for (Map item : values) { + public ServiceExternalSourcesModel fromExternalItem(List> values) { + for (Map item : values) { ExternalSourcesItemModel model = new ExternalSourcesItemModel(); - model.setId(item.get("pid")); - model.setUri(item.get("label")); - model.setName(item.get("name")); - model.setTag(item.get("tag")); + model.setId((String)item.get("pid")); + model.setUri((String)item.get("label")); + model.setName((String)item.get("name")); + model.setTag((String)item.get("tag")); this.add(model); } return this; diff --git a/dmp-backend/web/src/main/java/eu/eudat/models/data/external/TagExternalSourcesModel.java b/dmp-backend/web/src/main/java/eu/eudat/models/data/external/TagExternalSourcesModel.java index 394d91523..5e6ce1c97 100644 --- a/dmp-backend/web/src/main/java/eu/eudat/models/data/external/TagExternalSourcesModel.java +++ b/dmp-backend/web/src/main/java/eu/eudat/models/data/external/TagExternalSourcesModel.java @@ -9,13 +9,13 @@ import java.util.Map; public class TagExternalSourcesModel extends ExternalListingItem { @Override - public TagExternalSourcesModel fromExternalItem(List> values) { - for (Map item : values) { + public TagExternalSourcesModel fromExternalItem(List> values) { + for (Map item : values) { ExternalSourcesItemModel model = new ExternalSourcesItemModel(); - model.setId(item.get("pid")); - model.setUri(item.get("label")); - model.setName(item.get("name")); - model.setTag(item.get("tag")); + model.setId((String)item.get("pid")); + model.setUri((String)item.get("label")); + model.setName((String)item.get("name")); + model.setTag((String)item.get("tag")); this.add(model); } return this; diff --git a/dmp-backend/web/src/main/resources/externalUrls/ExternalUrls.xml b/dmp-backend/web/src/main/resources/externalUrls/ExternalUrls.xml index 498f492f1..198965e9f 100644 --- a/dmp-backend/web/src/main/resources/externalUrls/ExternalUrls.xml +++ b/dmp-backend/web/src/main/resources/externalUrls/ExternalUrls.xml @@ -897,6 +897,24 @@ $['meta']['pagination']['page','pages','count'] + + openaire + + 2 + External + https://services.openaire.eu/search/v2/api/datasets/?q={like}&page={page}&size={pageSize}&format=json + 0 + application/json; charset=utf-8 + + $['results'][*]['result']['metadata']['oaf:entity']['oaf:result'] + + 'pid' + 'title' + 'count' + + + $['meta']['page','size','total'] + -
{{'GENERAL.STATUSES.EDIT' | translate}} : +
{{'GENERAL.STATUSES.EDIT' | translate}} : {{dataset.modified | date:"longDate"}}
- +
+ create + {{'TYPES.DATASET-STATUS.DRAFT' | translate}} +
+
-
{{ 'DATASET-LISTING.TOOLTIP.DMP-FOR' | translate }}: {{ dataset.datasetTemplate.label }}
@@ -85,7 +90,7 @@
{{'DMP-OVERVIEW.GRANT' | translate}}
-
Grant label
+
Grant label
{{'DMP-OVERVIEW.RESEARCHERS' | translate}}
@@ -127,8 +132,8 @@
-->
- - +
- - +
diff --git a/dmp-frontend/src/app/ui/dataset/overview/dataset-overview.component.scss b/dmp-frontend/src/app/ui/dataset/overview/dataset-overview.component.scss index cc76c8022..979463146 100644 --- a/dmp-frontend/src/app/ui/dataset/overview/dataset-overview.component.scss +++ b/dmp-frontend/src/app/ui/dataset/overview/dataset-overview.component.scss @@ -20,7 +20,7 @@ font-size: 1.2em; } -.mat-mini-fab:hover { +.actions-btn:hover { background-color: #129D99; color: #FFFFFF; } @@ -150,13 +150,12 @@ color: #008887; padding-right: 0.5em; align-self: center; - } .header { opacity: 0.6; margin-top: 1em; - margin-bottom: 0.25em; + margin-bottom: 0.5em; } .dataset-label, .header { @@ -262,7 +261,7 @@ // ********CENTER ELEMENTS******** -.mat-mini-fab, .mat-mini-fab-icon, +.mat-mini-fab, .mat-mini-fab-icon, .actions-btn, .status-icon, .dataset-logo, .frame-btn, .finalize-btn { display: flex; justify-content: center; diff --git a/dmp-frontend/src/app/ui/dataset/overview/dataset-overview.component.ts b/dmp-frontend/src/app/ui/dataset/overview/dataset-overview.component.ts index e7cbd4742..6df5ec3b3 100644 --- a/dmp-frontend/src/app/ui/dataset/overview/dataset-overview.component.ts +++ b/dmp-frontend/src/app/ui/dataset/overview/dataset-overview.component.ts @@ -19,6 +19,12 @@ import { Location } from '@angular/common'; import { UserInfoListingModel } from '@app/core/model/user/user-info-listing'; import { DatasetStatus } from '@app/core/common/enum/dataset-status'; import { ConfirmationDialogComponent } from '@common/modules/confirmation-dialog/confirmation-dialog.component'; +import * as FileSaver from 'file-saver'; +import { DmpInvitationDialogComponent } from '@app/ui/dmp/invitation/dmp-invitation.component'; +import { DatasetWizardEditorModel } from '../dataset-wizard/dataset-wizard-editor.model'; +import { DatasetWizardService } from '@app/core/services/dataset-wizard/dataset-wizard.service'; +import { FormControl } from '@angular/forms'; +import { DatasetCopyDialogueComponent } from '../dataset-wizard/dataset-copy-dialogue/dataset-copy-dialogue.component'; @Component({ @@ -29,6 +35,7 @@ import { ConfirmationDialogComponent } from '@common/modules/confirmation-dialog export class DatasetOverviewComponent extends BaseComponent implements OnInit { dataset: DatasetOverviewModel; + datasetWizardModel: DatasetWizardEditorModel; isNew = true; isFinalized = false; isPublicView = true; @@ -50,7 +57,8 @@ export class DatasetOverviewComponent extends BaseComponent implements OnInit { private configurationService: ConfigurationService, private oauth2DialogService: Oauth2DialogService, private userService: UserService, - private location: Location + private location: Location, + private datasetWizardService: DatasetWizardService ) { super(); } @@ -69,6 +77,10 @@ export class DatasetOverviewComponent extends BaseComponent implements OnInit { .pipe(takeUntil(this._destroyed)) .subscribe(data => { this.dataset = data; + this.datasetWizardService.getSingle(this.dataset.id).pipe(takeUntil(this._destroyed)) + .subscribe(data => { + this.datasetWizardModel = new DatasetWizardEditorModel().fromModel(data); + }); // this.checkLockStatus(this.dataset.id); this.setIsUserOwner(); const breadCrumbs = []; @@ -92,6 +104,10 @@ export class DatasetOverviewComponent extends BaseComponent implements OnInit { .pipe(takeUntil(this._destroyed)) .subscribe(data => { this.dataset = data; + this.datasetWizardService.getSingle(this.dataset.id).pipe(takeUntil(this._destroyed)) + .subscribe(data => { + this.datasetWizardModel = new DatasetWizardEditorModel().fromModel(data); + }); // this.checkLockStatus(this.dataset.id); this.setIsUserOwner(); const breadCrumbs = []; @@ -130,7 +146,12 @@ export class DatasetOverviewComponent extends BaseComponent implements OnInit { if (principal) this.isUserOwner = principal.id === this.dataset.users.find(x => x.role === Role.Owner).id; } } - + + isUserAuthor(userId: string): boolean { + const principal: Principal = this.authentication.current(); + return userId === principal.id; + } + isUserDatasetRelated() { const principal: Principal = this.authentication.current(); let isRelated: boolean = false; @@ -143,6 +164,17 @@ export class DatasetOverviewComponent extends BaseComponent implements OnInit { } return isRelated; } + + roleDisplay(value: UserInfoListingModel) { + if (value.role === Role.Owner) { + return this.translate.instant('DMP-LISTING.OWNER'); + } else if (value.role === Role.Member) { + return this.translate.instant('DMP-LISTING.MEMBER'); + } else { + return this.translate.instant('DMP-LISTING.OWNER'); + } + } + roleDisplayFromList(value: UserInfoListingModel[]) { const principal: Principal = this.authentication.current(); @@ -162,21 +194,37 @@ export class DatasetOverviewComponent extends BaseComponent implements OnInit { return this.translate.instant('DMP-LISTING.OWNER'); } } + + openShareDialog(rowId: any, rowName: any) { + const dialogRef = this.dialog.open(DmpInvitationDialogComponent, { + // height: '250px', + // width: '700px', + restoreFocus: false, + data: { + dmpId: rowId, + dmpName: rowName + } + }); + } public isAuthenticated(): boolean { return !(!this.authentication.current()); } - cloneClicked(dataset: DatasetOverviewModel) { - this.router.navigate(['/datasets/clone/' + dataset.id]); - } - isDraftDataset(dataset: DatasetOverviewModel) { return dataset.status == DatasetStatus.Draft; } + + isFinalizedDataset(dataset: DatasetOverviewModel) { + return dataset.status == DatasetStatus.Finalized; + } editClicked(dataset: DatasetOverviewModel) { - this.router.navigate(['/datasets/edit/' + dataset.id]); + if (dataset.public) { + this.router.navigate(['/datasets/publicEdit/' + dataset.id]); + } else { + this.router.navigate(['/datasets/edit/' + dataset.id]); + } } deleteClicked() { @@ -200,6 +248,10 @@ export class DatasetOverviewComponent extends BaseComponent implements OnInit { } }); } + + dmpClicked(dmpId: String) { + this.router.navigate(['/plans/overview/' + dmpId]); + } onCallbackSuccess(): void { this.uiNotificationService.snackBarNotification(this.isNew ? this.language.instant('GENERAL.SNACK-BAR.SUCCESSFUL-CREATION') : this.language.instant('GENERAL.SNACK-BAR.SUCCESSFUL-UPDATE'), SnackBarNotificationLevel.Success); @@ -213,9 +265,116 @@ export class DatasetOverviewComponent extends BaseComponent implements OnInit { public getOrcidPath(): string { return this.configurationService.orcidPath; } + + downloadPDF(id: string) { + this.datasetService.downloadPDF(id) + .pipe(takeUntil(this._destroyed)) + .subscribe(response => { + const blob = new Blob([response.body], { type: 'application/pdf' }); + const filename = this.getFilenameFromContentDispositionHeader(response.headers.get('Content-Disposition')); + + FileSaver.saveAs(blob, filename); + }); + } + + downloadDocx(id: string) { + this.datasetService.downloadDocx(id) + .pipe(takeUntil(this._destroyed)) + .subscribe(response => { + const blob = new Blob([response.body], { type: 'application/msword' }); + const filename = this.getFilenameFromContentDispositionHeader(response.headers.get('Content-Disposition')); + + FileSaver.saveAs(blob, filename); + }); + } + + downloadXml(id: string) { + this.datasetService.downloadXML(id) + .pipe(takeUntil(this._destroyed)) + .subscribe(response => { + const blob = new Blob([response.body], { type: 'application/xml' }); + const filename = this.getFilenameFromContentDispositionHeader(response.headers.get('Content-Disposition')); + + FileSaver.saveAs(blob, filename); + }); + } + + downloadJson(id: string) { + this.datasetService.downloadJson(id) + .pipe(takeUntil(this._destroyed)) + .subscribe(response => { + const blob = new Blob([response.body], { type: 'application/json' }); + const filename = this.getFilenameFromContentDispositionHeader(response.headers.get('Content-Disposition')); + FileSaver.saveAs(blob, filename); + }) + } + + getFilenameFromContentDispositionHeader(header: string): string { + const regex: RegExp = new RegExp(/filename[^;=\n]*=((['"]).*?\2|[^;\n]*)/g); + + const matches = header.match(regex); + let filename: string; + for (let i = 0; i < matches.length; i++) { + const match = matches[i]; + if (match.includes('filename="')) { + filename = match.substring(10, match.length - 1); + break; + } else if (match.includes('filename=')) { + filename = match.substring(9); + break; + } + } + return filename; + } + + showPublishButton(dataset: DatasetOverviewModel) { + return this.isFinalizedDataset(dataset) && !dataset.public && this.hasPublishButton; + } + + publish(datasetId: String) { + const dialogRef = this.dialog.open(ConfirmationDialogComponent, { + maxWidth: '500px', + restoreFocus: false, + data: { + message: this.language.instant('GENERAL.CONFIRMATION-DIALOG.PUBLISH-ITEM'), + privacyPolicyNames: this.language.instant('GENERAL.CONFIRMATION-DIALOG.PRIVACY-POLICY-NAMES'), + confirmButton: this.language.instant('GENERAL.CONFIRMATION-DIALOG.ACTIONS.CONFIRM'), + cancelButton: this.language.instant('GENERAL.CONFIRMATION-DIALOG.ACTIONS.CANCEL'), + isDeleteConfirmation: false + } + }); + dialogRef.afterClosed().pipe(takeUntil(this._destroyed)).subscribe(result => { + if (result) { + this.datasetService.publish(datasetId) + .pipe(takeUntil(this._destroyed)) + .subscribe(() => { this.hasPublishButton = false }); + } + }); + } + + openDmpSearchDialogue() { + const formControl = new FormControl(); + const dialogRef = this.dialog.open(DatasetCopyDialogueComponent, { + width: '500px', + restoreFocus: false, + data: { + formControl: formControl, + datasetId: this.dataset.id, + datasetProfileId: this.datasetWizardModel.profile, + datasetProfileExist: false, + confirmButton: this.language.instant('DATASET-WIZARD.DIALOGUE.COPY'), + cancelButton: this.language.instant('DATASET-WIZARD.DIALOGUE.CANCEL') + } + }); + + dialogRef.afterClosed().pipe(takeUntil(this._destroyed)) + .subscribe(result => { + if (result && result.datasetProfileExist) { + const newDmpId = result.formControl.value.id + this.router.navigate(['/datasets/copy/' + result.datasetId], { queryParams: { newDmpId: newDmpId } }); + } + }); + } - // showPublishButton(dataset: DatasetOverviewModel) { - // return this.isFinalizedDmp(dmp) && !dmp.isPublic && this.hasPublishButton; - // } } diff --git a/dmp-frontend/src/app/ui/dmp/overview/dmp-overview.component.html b/dmp-frontend/src/app/ui/dmp/overview/dmp-overview.component.html index cd5c4e1f2..5ee16de2b 100644 --- a/dmp-frontend/src/app/ui/dmp/overview/dmp-overview.component.html +++ b/dmp-frontend/src/app/ui/dmp/overview/dmp-overview.component.html @@ -46,7 +46,11 @@
check - {{'DATASET-LISTING.COLUMNS.FINALIZED' | translate}} + {{'TYPES.DMP.FINALISED' | translate}} +
+
+ create + {{'TYPES.DMP.DRAFT' | translate}}
diff --git a/dmp-frontend/src/app/ui/dmp/overview/dmp-overview.component.scss b/dmp-frontend/src/app/ui/dmp/overview/dmp-overview.component.scss index 9ceae05d1..97e0fc96d 100644 --- a/dmp-frontend/src/app/ui/dmp/overview/dmp-overview.component.scss +++ b/dmp-frontend/src/app/ui/dmp/overview/dmp-overview.component.scss @@ -161,7 +161,7 @@ .header { opacity: 0.6; margin-top: 1em; - margin-bottom: 0.25em; + margin-bottom: 0.5em; } .dmp-label, .header { diff --git a/dmp-frontend/src/app/ui/dmp/overview/dmp-overview.component.ts b/dmp-frontend/src/app/ui/dmp/overview/dmp-overview.component.ts index 1d233f5fc..14f877006 100644 --- a/dmp-frontend/src/app/ui/dmp/overview/dmp-overview.component.ts +++ b/dmp-frontend/src/app/ui/dmp/overview/dmp-overview.component.ts @@ -183,12 +183,12 @@ export class DmpOverviewComponent extends BaseComponent implements OnInit { } datasetClicked(datasetId: String) { - if (this.isPublicView) { - this.router.navigate(['/datasets/publicEdit/' + datasetId]); - } else { - this.router.navigate(['/datasets/edit/' + datasetId]); - console.log('inhere') - } + // if (this.isPublicView) { + // this.router.navigate(['/datasets/publicEdit/' + datasetId]); + // } else { + // this.router.navigate(['/datasets/edit/' + datasetId]); + // } + this.router.navigate(['/datasets/overview/' + datasetId]); } datasetsClicked(dmpId: String) { diff --git a/dmp-frontend/src/assets/i18n/en.json b/dmp-frontend/src/assets/i18n/en.json index 11ed9caaf..452088bf1 100644 --- a/dmp-frontend/src/assets/i18n/en.json +++ b/dmp-frontend/src/assets/i18n/en.json @@ -106,6 +106,7 @@ "LOGIN": "Login", "DMP-OVERVIEW": "DMP Overview", "DMP-EDIT": "Edit DMP", + "DATASET-OVERVIEW": "Dataset Overview", "DATASET-EDIT": "Dataset View/Edit", "DMP-NEW-VERSION": "DMP New Version", "DMP-CLONE": "Clone DMP", @@ -567,7 +568,7 @@ } }, "DATASET-OVERVIEW": { - "DATASET-AUTHORS": "Dataset description Authors", + "DATASET-AUTHORS": "Dataset description authors", "ERROR": { "DELETED-DATASET": "The requested dataset is deleted", "FORBIDEN-DATASET": "You are not allowed to access this dataset" diff --git a/dmp-frontend/src/assets/i18n/es.json b/dmp-frontend/src/assets/i18n/es.json index dc4e1e6e4..02fa89ccd 100644 --- a/dmp-frontend/src/assets/i18n/es.json +++ b/dmp-frontend/src/assets/i18n/es.json @@ -105,6 +105,7 @@ "LOGIN": "Iniciar sesión", "DMP-OVERVIEW": "Resumen del PGD", "DMP-EDIT": "Editar el PGD", + "DATASET-OVERVIEW": "Resumen del Dataset", "DATASET-EDIT": "Ver/Editar el Dataset", "DMP-NEW-VERSION": "Nueva versiónd del PGD", "DMP-CLONE": "Clonar el PGD", @@ -565,7 +566,7 @@ } }, "DATASET-OVERVIEW": { - "DATASET-AUTHORS": "Descripciones del Dataset Autores", + "DATASET-AUTHORS": "Descripciones del dataset autores", "ERROR": { "DELETED-DATASET": "El Dataset solicitado está borrado", "FORBIDEN-DATASET": "No tiene permiso para acceder a esto Dataset" diff --git a/dmp-frontend/src/assets/i18n/gr.json b/dmp-frontend/src/assets/i18n/gr.json index 75dc1c0e2..4f696bf13 100644 --- a/dmp-frontend/src/assets/i18n/gr.json +++ b/dmp-frontend/src/assets/i18n/gr.json @@ -105,6 +105,7 @@ "LOGIN": "Σύνδεση", "DMP-OVERVIEW": "Επισκόπηση Σχεδίου Διαχείρισης Δεδομένων", "DMP-EDIT": "Επεξεργασία Σχεδίου Διαχείρισης Δεδομένων", + "DATASET-OVERVIEW": "Επισκόπηση Συνόλου Δεδομένων", "DATASET-EDIT": "Προβολή / Επεξεργασία Συνόλου Δεδομένων", "DMP-NEW-VERSION": "Νέα έκδοση Σχεδίου Διαχείρισης Δεδομένων", "DMP-CLONE": "Κλωνοποίηση Σχεδίου Διαχείρισης Δεδομένων", @@ -566,7 +567,7 @@ } }, "DATASET-OVERVIEW": { - "DATASET-AUTHORS": "Συγγραφείς Περιγραφής Δεδομένων", + "DATASET-AUTHORS": "Συγγραφείς περιγραφής δεδομένων", "ERROR": { "DELETED-DATASET": "H επιλεγμένη Περιγραφή Δεδομένων θα διαγραφεί", "FORBIDEN-DATASET": "Δεν επιτρέπεται η πρόσβαση σε αυτή την Περιγραφή Δεδομένων" From 84bb291cd698d5947097ae3b912ccd3361652950 Mon Sep 17 00:00:00 2001 From: George Kalampokis Date: Mon, 6 Jul 2020 14:11:14 +0300 Subject: [PATCH 047/364] Make DMP total count to use distinct in order to avoid counting duplicate entries --- .../java/eu/eudat/logic/managers/DataManagementPlanManager.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dmp-backend/web/src/main/java/eu/eudat/logic/managers/DataManagementPlanManager.java b/dmp-backend/web/src/main/java/eu/eudat/logic/managers/DataManagementPlanManager.java index 8d272f67d..6d62ddb4e 100644 --- a/dmp-backend/web/src/main/java/eu/eudat/logic/managers/DataManagementPlanManager.java +++ b/dmp-backend/web/src/main/java/eu/eudat/logic/managers/DataManagementPlanManager.java @@ -189,7 +189,7 @@ public class DataManagementPlanManager { .whenComplete((resultList, throwable) -> dataTable.setData(resultList)); } - CompletableFuture countFuture = authItems.countAsync().whenComplete((count, throwable) -> dataTable.setTotalCount(count)); + CompletableFuture countFuture = authItems.distinct().countAsync().whenComplete((count, throwable) -> dataTable.setTotalCount(count)); CompletableFuture.allOf(itemsFuture, countFuture).join(); return dataTable; } From f432caa58465b1b2215588410f11107373020f81 Mon Sep 17 00:00:00 2001 From: George Kalampokis Date: Mon, 6 Jul 2020 14:18:42 +0300 Subject: [PATCH 048/364] When getting user statistics on the dashboard make sure the DMP count to be distinct --- .../src/main/java/eu/eudat/logic/managers/DashBoardManager.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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 2796406fb..709b4265d 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 @@ -137,7 +137,7 @@ public class DashBoardManager { List roles = new LinkedList<>(); List finalDmps = dmps; - CompletableFuture dmpFuture = dataManagementPlanRepository.getAuthenticated(dmps != null ? dataManagementPlanRepository.asQueryable().where((builder, root) -> root.get("id").in(finalDmps.stream().map(Dmp::getId).collect(Collectors.toList()))) : dataManagementPlanRepository.getWithCriteria(dataManagementPlanCriteria), principal.getId(), roles).countAsync() + CompletableFuture dmpFuture = dataManagementPlanRepository.getAuthenticated(dmps != null ? dataManagementPlanRepository.asQueryable().where((builder, root) -> root.get("id").in(finalDmps.stream().map(Dmp::getId).collect(Collectors.toList()))) : dataManagementPlanRepository.getWithCriteria(dataManagementPlanCriteria), principal.getId(), roles).distinct().countAsync() .whenComplete((dmpsStats, throwable) -> statistics.setTotalDataManagementPlanCount(dmpsStats)); List finalDatasets = datasets; CompletableFuture datasetFuture = datasetRepository.getAuthenticated(datasets != null ? datasetRepository.asQueryable().where((builder, root) -> root.get("id").in(finalDatasets.stream().map(x -> UUID.fromString(x.getId())).collect(Collectors.toList()))) : datasetRepository.getWithCriteria(datasetCriteria), user, roles).countAsync() From 029c246a4bb1fc3d54e9d92d246ddc8ed3a373ab Mon Sep 17 00:00:00 2001 From: George Kalampokis Date: Mon, 6 Jul 2020 18:23:37 +0300 Subject: [PATCH 049/364] Fixed minor issue --- dmp-frontend/src/app/ui/dmp/dmp.module.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/dmp-frontend/src/app/ui/dmp/dmp.module.ts b/dmp-frontend/src/app/ui/dmp/dmp.module.ts index 7a503afd3..dee306705 100644 --- a/dmp-frontend/src/app/ui/dmp/dmp.module.ts +++ b/dmp-frontend/src/app/ui/dmp/dmp.module.ts @@ -73,7 +73,7 @@ import { DmpCriteriaDialogComponent } from './listing/criteria/dmp-criteria-dial DatasetsTabComponent, DmpCloneComponent, AddOrganizationComponent, - DmpCriteriaDialogComponent + DmpCriteriaDialogComponent, AddOrganizationComponent, AddCostComponent, CostListingComponent @@ -85,7 +85,7 @@ import { DmpCriteriaDialogComponent } from './listing/criteria/dmp-criteria-dial DmpFinalizeDialogComponent, DmpUploadDialogue, AddOrganizationComponent, - DmpCriteriaDialogComponent + DmpCriteriaDialogComponent, AddOrganizationComponent, AddCostComponent ] From 7c3f06d9f4af003d3d9c7c27ca14e5e23118f8e6 Mon Sep 17 00:00:00 2001 From: gpapavgeri Date: Mon, 6 Jul 2020 18:42:54 +0300 Subject: [PATCH 050/364] dataset-overview_update v4 --- .../core/model/dataset/dataset-overview.ts | 3 +- .../app/core/model/researcher/researcher.ts | 2 +- .../overview/dataset-overview.component.html | 90 +--- .../overview/dataset-overview.component.scss | 3 +- .../overview/dataset-overview.component.ts | 411 +++++++++--------- .../dmp/overview/dmp-overview.component.html | 28 +- .../ui/dmp/overview/dmp-overview.component.ts | 19 - 7 files changed, 226 insertions(+), 330 deletions(-) diff --git a/dmp-frontend/src/app/core/model/dataset/dataset-overview.ts b/dmp-frontend/src/app/core/model/dataset/dataset-overview.ts index 34bbe936c..3080a1548 100644 --- a/dmp-frontend/src/app/core/model/dataset/dataset-overview.ts +++ b/dmp-frontend/src/app/core/model/dataset/dataset-overview.ts @@ -1,5 +1,6 @@ import { DatasetProfileModel } from "./dataset-profile"; import { GrantOverviewModel } from '../grant/grant-overview'; +import { DmpOverviewModel } from '../dmp/dmp-overview'; export interface DatasetOverviewModel { id: string; @@ -8,7 +9,7 @@ export interface DatasetOverviewModel { datasetTemplate: DatasetProfileModel; users: any[]; - dmp: String; + dmp: DmpOverviewModel; grant: GrantOverviewModel; description: String; public: boolean; diff --git a/dmp-frontend/src/app/core/model/researcher/researcher.ts b/dmp-frontend/src/app/core/model/researcher/researcher.ts index 6c5bf6a98..9d23a8403 100644 --- a/dmp-frontend/src/app/core/model/researcher/researcher.ts +++ b/dmp-frontend/src/app/core/model/researcher/researcher.ts @@ -1,5 +1,5 @@ export interface ResearcherModel { - id: String; + id: string; name: String; reference: String; lastName: String; diff --git a/dmp-frontend/src/app/ui/dataset/overview/dataset-overview.component.html b/dmp-frontend/src/app/ui/dataset/overview/dataset-overview.component.html index dcd35cc47..a85436ba8 100644 --- a/dmp-frontend/src/app/ui/dataset/overview/dataset-overview.component.html +++ b/dmp-frontend/src/app/ui/dataset/overview/dataset-overview.component.html @@ -8,8 +8,8 @@
- -

{{ dataset.label }}

+ +

{{ dataset.label }}

@@ -27,20 +27,10 @@ {{'DMP-OVERVIEW.PRIVATE' | translate}}
- - +
+ lock_outline + {{'DMP-OVERVIEW.LOCKED' | translate}} +
{{'GENERAL.STATUSES.EDIT' | translate}} : {{dataset.modified | date:"longDate"}}
@@ -49,10 +39,6 @@ check {{'TYPES.DATASET-STATUS.FINALISED' | translate}}
-
- create - {{'TYPES.DATASET-STATUS.DRAFT' | translate}} -
@@ -71,17 +57,10 @@ matTooltipPosition="above"> delete -
{{'DATASET-LISTING.TOOLTIP.PART-OF' | translate}}
-
{{'DMP-OVERVIEW.GRANT' | translate}}
-
Grant label
- +
{{ dataset.grant.label }}
{{'DMP-OVERVIEW.RESEARCHERS' | translate}}
- +
{{'DATASET-LISTING.COLUMNS.DESCRIPTION' | translate}}
@@ -109,28 +87,6 @@
-
-
- -
- -

{{ 'DMP-LISTING.ACTIONS.MAKE-PUBLIC' | translate }}

-
-
-
-
- lock_outline - {{'DMP-OVERVIEW.LOCKED' | translate}} -
-
- lock_open - {{'DMP-OVERVIEW.UNLOCKED' | translate}} -
+
+ lock_outline + {{'DMP-OVERVIEW.LOCKED' | translate}}
-
- create - {{'TYPES.DMP.DRAFT' | translate}} -
@@ -60,22 +50,16 @@ matTooltip="{{'DMP-LISTING.ACTIONS.CLONE' | translate}}" matTooltipPosition="above"> content_copy - - -
{{'DMP-OVERVIEW.GRANT' | translate}}
{{ dmp.grant.label }}
@@ -145,7 +129,7 @@
-
+
- + +
@@ -60,7 +62,7 @@
-
About
+
FAQs
FAQs
@@ -108,7 +110,7 @@
-

ARGOS is comprised of two main functionalities: DMP templates and Dataset Descriptions. +

ARGOS is comprised of two main functionalities: DMP templates and Dataset Descriptions. Additional entities are Projects that link to funders and grants information.
ARGOS can be used for:

A. viewing/ consulting publicly released DMPs and @@ -131,7 +133,7 @@ Examples may refer to embedding DMP and DMP tools in specific curricula or even utilization of the tool for researchers and students familiarization with the concept and process, as part of library instructions’ sessions. -

+
@@ -206,4 +208,4 @@ - \ No newline at end of file + diff --git a/dmp-frontend/src/assets/splash/about/how-it-works.html b/dmp-frontend/src/assets/splash/about/how-it-works.html index 9bfe06404..7446523a2 100644 --- a/dmp-frontend/src/assets/splash/about/how-it-works.html +++ b/dmp-frontend/src/assets/splash/about/how-it-works.html @@ -59,7 +59,7 @@
-
About
+
How it works
How it works
From ace12c3140e7d2ed0e6b3d6baec6dfc7445a62e9 Mon Sep 17 00:00:00 2001 From: George Kalampokis Date: Tue, 7 Jul 2020 12:22:45 +0300 Subject: [PATCH 052/364] Add updateusers end point for DMP --- .../src/main/java/eu/eudat/controllers/DMPs.java | 14 ++++++++++++++ .../logic/managers/DataManagementPlanManager.java | 12 ++++++++++++ .../src/app/core/services/dmp/dmp.service.ts | 5 +++++ 3 files changed, 31 insertions(+) diff --git a/dmp-backend/web/src/main/java/eu/eudat/controllers/DMPs.java b/dmp-backend/web/src/main/java/eu/eudat/controllers/DMPs.java index 371a61386..135cac60b 100644 --- a/dmp-backend/web/src/main/java/eu/eudat/controllers/DMPs.java +++ b/dmp-backend/web/src/main/java/eu/eudat/controllers/DMPs.java @@ -28,6 +28,7 @@ import eu.eudat.models.data.helpers.common.DataTableData; import eu.eudat.models.data.helpers.responses.ResponseItem; import eu.eudat.models.data.listingmodels.DataManagementPlanListingModel; import eu.eudat.models.data.listingmodels.DataManagementPlanOverviewModel; +import eu.eudat.models.data.listingmodels.UserInfoListingModel; import eu.eudat.models.data.security.Principal; import eu.eudat.query.DMPQuery; import eu.eudat.types.ApiMessageCode; @@ -277,6 +278,19 @@ public class DMPs extends BaseController { } } + + @Transactional + @RequestMapping(method = RequestMethod.POST, value = {"/updateusers/{id}"}) + public ResponseEntity> updateUsers(@PathVariable String id, @RequestBody List users, Principal principal) { + try { + this.dataManagementPlanManager.updateUsers(UUID.fromString(id), users, principal); + return ResponseEntity.status(HttpStatus.OK).body(new ResponseItem().status(ApiMessageCode.SUCCESS_MESSAGE).message("Successfully Updated Colaborators for Data Datamanagement Plan.")); + } catch (Exception e) { + logger.error(e.getMessage(), e); + return ResponseEntity.status(HttpStatus.BAD_REQUEST).body(new ResponseItem().status(ApiMessageCode.ERROR_MESSAGE).message("Failed to update the users of Data Management Plan.")); + } + } + /* * DOI Generation * */ diff --git a/dmp-backend/web/src/main/java/eu/eudat/logic/managers/DataManagementPlanManager.java b/dmp-backend/web/src/main/java/eu/eudat/logic/managers/DataManagementPlanManager.java index 6d62ddb4e..495811aaa 100644 --- a/dmp-backend/web/src/main/java/eu/eudat/logic/managers/DataManagementPlanManager.java +++ b/dmp-backend/web/src/main/java/eu/eudat/logic/managers/DataManagementPlanManager.java @@ -867,6 +867,18 @@ public class DataManagementPlanManager { this.updateIndex(dmp); } + public void updateUsers(UUID id, List users, Principal principal) throws Exception { + DMP dmp = this.apiContext.getOperationsContext().getDatabaseRepository().getDmpDao().find(id); + if (!isUserOwnerOfDmp(dmp, principal)) + throw new Exception("User does not have the privilege to do this action."); + clearUsers(dmp); + for (UserInfoListingModel userListing : users) { + UserInfo tempUser = apiContext.getOperationsContext().getDatabaseRepository().getUserInfoDao().find(userListing.getId()); + assignUser(dmp, tempUser, UserDMP.UserDMPRoles.fromInteger(userListing.getRole())); + } + + } + /* * Export Data * */ diff --git a/dmp-frontend/src/app/core/services/dmp/dmp.service.ts b/dmp-frontend/src/app/core/services/dmp/dmp.service.ts index 9819c90e3..e97f1ec25 100644 --- a/dmp-frontend/src/app/core/services/dmp/dmp.service.ts +++ b/dmp-frontend/src/app/core/services/dmp/dmp.service.ts @@ -19,6 +19,7 @@ import { ExploreDmpCriteriaModel } from '../../query/explore-dmp/explore-dmp-cri import { RequestItem } from '../../query/request-item'; import { BaseHttpService } from '../http/base-http.service'; import { ConfigurationService } from '../configuration/configuration.service'; +import { UserInfoListingModel } from '@app/core/model/user/user-info-listing'; @Injectable() export class DmpService { @@ -96,6 +97,10 @@ export class DmpService { return this.http.post(this.actionUrl + 'unfinalize/' + id, { headers: this.headers }); } + updateUsers(id: string, users: UserInfoListingModel[]): Observable { + return this.http.post(`${this.actionUrl}updateusers/${id}`, users, {headers: this.headers}); + } + getDoi(id: string): Observable { return this.http.post(this.actionUrl + 'createZenodoDoi/' + id, { headers: this.headers }); } From 2ab58f292626d2026c0e377ee9b0657e57ce3666 Mon Sep 17 00:00:00 2001 From: apapachristou Date: Tue, 7 Jul 2020 13:12:57 +0300 Subject: [PATCH 053/364] Add filters on the side on dmp listing --- dmp-frontend/src/app/app.component.html | 2 +- ...et-external-references-editor.component.ts | 2 - .../dmp-criteria-dialog.component.html | 2 +- .../criteria/dmp-criteria-dialog.component.ts | 22 ++- .../criteria/dmp-criteria.component.html | 4 +- .../ui/dmp/listing/dmp-listing.component.html | 10 +- .../ui/dmp/listing/dmp-listing.component.scss | 3 +- .../ui/dmp/listing/dmp-listing.component.ts | 138 +++++++++--------- .../ui/dmp/overview/dmp-overview.component.ts | 10 +- .../oauth2-dialog/oauth2-dialog.component.ts | 1 - 10 files changed, 98 insertions(+), 96 deletions(-) diff --git a/dmp-frontend/src/app/app.component.html b/dmp-frontend/src/app/app.component.html index 68f4c4a75..6243a45e8 100644 --- a/dmp-frontend/src/app/app.component.html +++ b/dmp-frontend/src/app/app.component.html @@ -5,7 +5,7 @@ -
+
diff --git a/dmp-frontend/src/app/ui/dataset/dataset-wizard/external-references/dataset-external-references-editor.component.ts b/dmp-frontend/src/app/ui/dataset/dataset-wizard/external-references/dataset-external-references-editor.component.ts index d4319f40b..bbb59b775 100644 --- a/dmp-frontend/src/app/ui/dataset/dataset-wizard/external-references/dataset-external-references-editor.component.ts +++ b/dmp-frontend/src/app/ui/dataset/dataset-wizard/external-references/dataset-external-references-editor.component.ts @@ -247,12 +247,10 @@ export class DatasetExternalReferencesEditorComponent extends BaseComponent impl } removeTag(tag: any) { - console.log((this.formGroup.get('tags')).value); (this.formGroup.get('tags')).removeAt(((this.formGroup.get('tags')).value as any[]).indexOf(tag)); } addTag(ev: MatChipInputEvent) { - console.log((this.formGroup.get('tags')).value); if (ev.value !== '' && isNullOrUndefined(((this.formGroup.get('tags')).value as ExternalTagEditorModel[]).find(tag => tag.name === ev.value))) { (this.formGroup.get('tags')).push(new ExternalTagEditorModel('', ev.value).buildForm()); } diff --git a/dmp-frontend/src/app/ui/dmp/listing/criteria/dmp-criteria-dialog.component.html b/dmp-frontend/src/app/ui/dmp/listing/criteria/dmp-criteria-dialog.component.html index a558369b6..d137b3900 100644 --- a/dmp-frontend/src/app/ui/dmp/listing/criteria/dmp-criteria-dialog.component.html +++ b/dmp-frontend/src/app/ui/dmp/listing/criteria/dmp-criteria-dialog.component.html @@ -1,2 +1,2 @@ clear - + diff --git a/dmp-frontend/src/app/ui/dmp/listing/criteria/dmp-criteria-dialog.component.ts b/dmp-frontend/src/app/ui/dmp/listing/criteria/dmp-criteria-dialog.component.ts index 945d900cf..31355d3e4 100644 --- a/dmp-frontend/src/app/ui/dmp/listing/criteria/dmp-criteria-dialog.component.ts +++ b/dmp-frontend/src/app/ui/dmp/listing/criteria/dmp-criteria-dialog.component.ts @@ -1,17 +1,27 @@ -import { Inject, Component } from '@angular/core'; +import { Inject, Component, ViewChild, OnInit, Output, EventEmitter } from '@angular/core'; import { MAT_DIALOG_DATA, MatDialogRef } from '@angular/material'; +import { DmpCriteriaComponent } from './dmp-criteria.component'; +import { DmpCriteria } from '@app/core/query/dmp/dmp-criteria'; @Component({ selector: 'dmp-criteria-dialog-component', templateUrl: './dmp-criteria-dialog.component.html', }) -export class DmpCriteriaDialogComponent { +export class DmpCriteriaDialogComponent implements OnInit { + + @ViewChild(DmpCriteriaComponent, { static: true }) criteria: DmpCriteriaComponent; constructor( public dialogRef: MatDialogRef, - @Inject(MAT_DIALOG_DATA) public data: { showGrant: boolean, isPublic: boolean } - ) { } + @Inject(MAT_DIALOG_DATA) public data: { showGrant: boolean, isPublic: boolean, criteria: DmpCriteria, updateDataFn: Function } + ) { + } + + ngOnInit() { + this.criteria.setCriteria(this.data.criteria); + // this.data.updateDataFn(this.criteria); + } onNoClick(): void { this.dialogRef.close(); @@ -21,4 +31,8 @@ export class DmpCriteriaDialogComponent { this.dialogRef.close(); } + onFiltersChanged(event) { + this.data.updateDataFn(this.criteria); + } + } diff --git a/dmp-frontend/src/app/ui/dmp/listing/criteria/dmp-criteria.component.html b/dmp-frontend/src/app/ui/dmp/listing/criteria/dmp-criteria.component.html index 737b12ee5..4181250b5 100644 --- a/dmp-frontend/src/app/ui/dmp/listing/criteria/dmp-criteria.component.html +++ b/dmp-frontend/src/app/ui/dmp/listing/criteria/dmp-criteria.component.html @@ -16,7 +16,7 @@
{{ 'TYPES.DMP-VISIBILITY.VISIBILITY' | translate }}
- {{ 'TYPES.DMP-VISIBILITY.ANY' | translate }} + {{ 'TYPES.DMP-VISIBILITY.ANY' | translate }} {{ 'TYPES.DMP-VISIBILITY.PUBLIC' | translate }} {{ 'TYPES.DMP-VISIBILITY.FINALIZED' | translate }} {{ 'TYPES.DMP-VISIBILITY.DRAFT' | translate }} @@ -81,7 +81,7 @@
{{ 'DATASET-PROFILE-LISTING.COLUMNS.ROLE' | translate }}
- {{ 'TYPES.DATASET-ROLE.ANY' | translate }} + {{ 'TYPES.DATASET-ROLE.ANY' | translate }} {{ 'TYPES.DATASET-ROLE.OWNER' | translate }} {{ 'TYPES.DATASET-ROLE.MEMBER' | translate }} diff --git a/dmp-frontend/src/app/ui/dmp/listing/dmp-listing.component.html b/dmp-frontend/src/app/ui/dmp/listing/dmp-listing.component.html index ac5cf9a16..b860a01eb 100644 --- a/dmp-frontend/src/app/ui/dmp/listing/dmp-listing.component.html +++ b/dmp-frontend/src/app/ui/dmp/listing/dmp-listing.component.html @@ -8,18 +8,18 @@

{{'DMP-LISTING.TEXT-INFO-QUESTION' | translate}} {{'DMP-LISTING.LINK-ZENODO' | translate}} {{'DMP-LISTING.GET-IDEA' | translate}}

-
+
-
+ +
-
+
diff --git a/dmp-frontend/src/app/ui/dmp/listing/dmp-listing.component.scss b/dmp-frontend/src/app/ui/dmp/listing/dmp-listing.component.scss index 3fe73fa18..6248d3a2d 100644 --- a/dmp-frontend/src/app/ui/dmp/listing/dmp-listing.component.scss +++ b/dmp-frontend/src/app/ui/dmp/listing/dmp-listing.component.scss @@ -189,12 +189,13 @@ position: fixed; right: 0px; z-index: 100; + width: 37px; } .filter-btn button { color: white; background-color: #23BCBA; - width: 52px; + width: 37px; height: 45px; } diff --git a/dmp-frontend/src/app/ui/dmp/listing/dmp-listing.component.ts b/dmp-frontend/src/app/ui/dmp/listing/dmp-listing.component.ts index 1f74408d3..8cd507e04 100644 --- a/dmp-frontend/src/app/ui/dmp/listing/dmp-listing.component.ts +++ b/dmp-frontend/src/app/ui/dmp/listing/dmp-listing.component.ts @@ -35,7 +35,7 @@ export class DmpListingComponent extends BaseComponent implements OnInit, IBread @ViewChild(MatPaginator, { static: true }) _paginator: MatPaginator; @ViewChild(MatSort, { static: false }) sort: MatSort; - @ViewChild(DmpCriteriaComponent, { static: true }) criteria: DmpCriteriaComponent; + // @ViewChild(DmpCriteriaComponent, { static: true }) criteria: DmpCriteriaComponent; breadCrumbs: Observable = observableOf([{ parentComponentName: null, label: 'DMPs', url: "/plans" }]); itemId: string; @@ -52,11 +52,13 @@ export class DmpListingComponent extends BaseComponent implements OnInit, IBread startIndex: number = 0; pageSize: number = 5; + criteria: DmpCriteria; + constructor( private dmpService: DmpService, private router: Router, private route: ActivatedRoute, - private dialog: MatDialog, + public dialog: MatDialog, public enumUtils: EnumUtils, private language: TranslateService, private grantService: GrantService, @@ -83,12 +85,14 @@ export class DmpListingComponent extends BaseComponent implements OnInit, IBread // const grant: GrantListingModel = { // id: this.grantId // } - this.criteria.setCriteria({ like: null, grants: [grant], groupIds: null, allVersions: false }); + // this.breadCrumbs = Observable.of([{ parentComponentName: 'GrantEditorComponent', label: grantLabel, url: '/grants/edit/' + this.grantId }]); + grantLabel = this.route.snapshot.queryParams.grantLabel; + + this.criteria = { like: null, grants: [grant], groupIds: null, allVersions: false } + // this.criteria.setCriteria({ like: null, grants: [grant], groupIds: null, allVersions: false }); this.refresh(); - grantLabel = this.route.snapshot.queryParams.grantLabel; - // this.breadCrumbs = Observable.of([{ parentComponentName: 'GrantEditorComponent', label: grantLabel, url: '/grants/edit/' + this.grantId }]); - this.criteria.setRefreshCallback((resetPages) => this.refresh(resetPages)); + // this.criteria.setRefreshCallback((resetPages) => this.refresh(resetPages)); }) } else if (params['groupId']) { @@ -106,10 +110,12 @@ export class DmpListingComponent extends BaseComponent implements OnInit, IBread }] ); }) - this.criteria.setCriteria(this.getDefaultCriteria()); this.groupLabel = this.route.snapshot.queryParams.groupLabel; + + // this.criteria.setCriteria(this.getDefaultCriteria()); + this.criteria = this.getDefaultCriteria(); this.refresh(); - this.criteria.setRefreshCallback((resetPages) => this.refresh(resetPages)); + // this.criteria.setRefreshCallback((resetPages) => this.refresh(resetPages)); } else { this.itemId = params['groupId']; this.showGrant = true; @@ -134,9 +140,10 @@ export class DmpListingComponent extends BaseComponent implements OnInit, IBread }] ); }) - this.criteria.setCriteria(this.getDefaultCriteria()); + // this.criteria.setCriteria(this.getDefaultCriteria()); + this.criteria = this.getDefaultCriteria(); this.refresh(); - this.criteria.setRefreshCallback((resetPages) => this.refresh(resetPages)); + // this.criteria.setRefreshCallback((resetPages) => this.refresh(resetPages)); } if (this.grantId != null) { @@ -148,7 +155,7 @@ export class DmpListingComponent extends BaseComponent implements OnInit, IBread }); } - refresh(resetPages = false) { + public refresh(resetPages = false) { // if (this._paginator.pageSize === undefined) this._paginator.pageSize = 10; // if (resetPages) this._paginator.pageIndex = 0; // const startIndex = this._paginator.pageIndex * this._paginator.pageSize; @@ -158,36 +165,10 @@ export class DmpListingComponent extends BaseComponent implements OnInit, IBread fields.push('-modified'); const request = new DataTableRequest(this.startIndex, this.pageSize, { fields: fields }); - let value = this.criteria.formGroup.value; - request.criteria = { - like: value.like, - grants: value.grants, - role: value.role - } - if (value.status == 2) { - request.criteria.isPublic = true; - } else { - request.criteria.status = value.status; - request.criteria.isPublic = false; - } - request.criteria.onlyPublic = this.isPublic; - if (this.isPublic) { - request.criteria.isPublic = true; - } - if (value.datasetTemplates) - request.criteria.datasetTemplates = value.datasetTemplates.map(x => x.id); - if (value.collaborators) - request.criteria.collaborators = value.collaborators.map(x => x.id); - if (value.organisations) - request.criteria.organisations = value.organisations.map(x => x.id); - if (this.itemId) { - request.criteria.groupIds = [this.itemId]; - request.criteria.allVersions = true; - } - request.criteria.grantStatus = value.grantStatus; + request.criteria = this.criteria; + this.dmpService.getPaged(request, "listing").pipe(takeUntil(this._destroyed)).subscribe(result => { if (!result) { return []; } - // if (this._paginator.pageIndex === 0) { this.totalCount = result.totalCount; } result.data.map(item => { item['datasets'].map(dmp => { dmp.url = 'datasets/edit/' + dmp.url; @@ -197,6 +178,7 @@ export class DmpListingComponent extends BaseComponent implements OnInit, IBread return item; }); this.listingItems = result.data; + this.totalCount = result.totalCount; }); } @@ -204,37 +186,7 @@ export class DmpListingComponent extends BaseComponent implements OnInit, IBread this.startIndex = this.startIndex + this.pageSize; const fields: Array = ["-modified"]; const request = new DataTableRequest(this.startIndex, this.pageSize, { fields: fields }); - - // request.criteria = new DmpCriteria(); - // request.criteria.like = ""; - - let value = this.criteria.formGroup.value; - request.criteria = { - like: value.like, - grants: value.grants, - role: value.role - } - if (value.status == 2) { - request.criteria.isPublic = true; - } else { - request.criteria.status = value.status; - request.criteria.isPublic = false; - } - request.criteria.onlyPublic = this.isPublic; - if (this.isPublic) { - request.criteria.isPublic = true; - } - if (value.datasetTemplates) - request.criteria.datasetTemplates = value.datasetTemplates.map(x => x.id); - if (value.collaborators) - request.criteria.collaborators = value.collaborators.map(x => x.id); - if (value.organisations) - request.criteria.organisations = value.organisations.map(x => x.id); - if (this.itemId) { - request.criteria.groupIds = [this.itemId]; - request.criteria.allVersions = true; - } - request.criteria.grantStatus = value.grantStatus; + request.criteria = this.criteria; this.dmpService.getPaged(request, "listing").pipe(takeUntil(this._destroyed)).subscribe(result => { if (!result) { return []; } @@ -281,8 +233,6 @@ export class DmpListingComponent extends BaseComponent implements OnInit, IBread openShareDialog(rowId: any, rowName: any) { const dialogRef = this.dialog.open(DmpInvitationDialogComponent, { - // height: '250px', - // width: '700px', data: { dmpId: rowId, dmpName: rowName @@ -324,7 +274,10 @@ export class DmpListingComponent extends BaseComponent implements OnInit, IBread restoreFocus: false, data: { showGrant: this.showGrant, - isPublic: this.isPublic + isPublic: this.isPublic, + criteria: this.criteria, + // criteria: this.grantId ? this.criteria : this.getDefaultCriteria(), + updateDataFn: this.updateDataFn.bind(this) }, position: { right: '0px;' } }); @@ -332,6 +285,45 @@ export class DmpListingComponent extends BaseComponent implements OnInit, IBread dialogRef.afterClosed().subscribe(result => { }); } + + updateDataFn(criteria: DmpCriteriaComponent): void { + this.toDmpCriteria(criteria); + this.refresh(); + } + + toDmpCriteria(criteria: DmpCriteriaComponent): void { + let formGroup = criteria.formGroup; + this.criteria = { + like: formGroup.get('like').value, + grants: formGroup.get('grants').value, + role: formGroup.get('role').value + } + this.criteria.status = formGroup.get('status').value; + if (formGroup.get('status').value == 2) { + this.criteria.isPublic = true; + } else { + this.criteria.isPublic = false; + } + this.criteria.onlyPublic = this.isPublic; + if (this.isPublic) { + this.criteria.isPublic = true; + } + if (formGroup.get('datasetTemplates').value) + this.criteria.datasetTemplates = formGroup.get('datasetTemplates').value.map(x => x.id); + if (formGroup.get('collaborators').value) + this.criteria.collaborators = formGroup.get('collaborators').value.map(x => x.id); + if (formGroup.get('organisations').value) + this.criteria.organisations = formGroup.get('organisations').value.map(x => x.id); + if (this.itemId) { + this.criteria.groupIds = [this.itemId]; + this.criteria.allVersions = true; + } + this.criteria.grantStatus = formGroup.get('grantStatus').value; + } + + hasScrollbar(): boolean { + return document.getElementById("main-page").scrollHeight > document.documentElement.clientHeight; + } } // export class DmpDataSource extends DataSource { diff --git a/dmp-frontend/src/app/ui/dmp/overview/dmp-overview.component.ts b/dmp-frontend/src/app/ui/dmp/overview/dmp-overview.component.ts index 1d233f5fc..a68fe6841 100644 --- a/dmp-frontend/src/app/ui/dmp/overview/dmp-overview.component.ts +++ b/dmp-frontend/src/app/ui/dmp/overview/dmp-overview.component.ts @@ -187,7 +187,6 @@ export class DmpOverviewComponent extends BaseComponent implements OnInit { this.router.navigate(['/datasets/publicEdit/' + datasetId]); } else { this.router.navigate(['/datasets/edit/' + datasetId]); - console.log('inhere') } } @@ -585,16 +584,15 @@ export class DmpOverviewComponent extends BaseComponent implements OnInit { } }); } - + copyDoi(doi) { - console.log(doi.nativeElement.innerHTML); let domElement = doi.nativeElement as HTMLInputElement; domElement.select(); document.execCommand('copy'); domElement.setSelectionRange(0, 0); alert('Doi Copied to Clipboard'); } - + public getOrcidPath(): string { return this.configurationService.orcidPath; } @@ -610,7 +608,7 @@ export class DmpOverviewComponent extends BaseComponent implements OnInit { return this.dmp.users.find(x => x.id === principal.id); } } - + createOrUpdate(id: string): void { if (!this.lockStatus) { this.lock = new LockModel(id, this.getUserFromDMP()); @@ -629,7 +627,7 @@ export class DmpOverviewComponent extends BaseComponent implements OnInit { // this.lockService.createOrUpdate(this.lock).pipe(takeUntil(this._destroyed)).subscribe(async result => this.lock.id = Guid.parse(result)); // } - + // advancedClicked() { // const dialogRef = this.dialog.open(ExportMethodDialogComponent, { // maxWidth: '500px', diff --git a/dmp-frontend/src/app/ui/misc/oauth2-dialog/oauth2-dialog.component.ts b/dmp-frontend/src/app/ui/misc/oauth2-dialog/oauth2-dialog.component.ts index 7d9c2f6aa..c73a6c673 100644 --- a/dmp-frontend/src/app/ui/misc/oauth2-dialog/oauth2-dialog.component.ts +++ b/dmp-frontend/src/app/ui/misc/oauth2-dialog/oauth2-dialog.component.ts @@ -29,7 +29,6 @@ export class Oauth2DialogComponent extends BaseComponent implements OnInit{ } private loadUrl(url: string ) { - console.log(url); window.location.href = url; } From b94363ba5be0fce2a1de1e9045ce652cdd5e114e Mon Sep 17 00:00:00 2001 From: apapachristou Date: Tue, 7 Jul 2020 13:33:04 +0300 Subject: [PATCH 054/364] Adds links to datasets on listings --- .../src/app/ui/dashboard/drafts/drafts.component.html | 3 +-- .../recent-edited-activity.component.html | 3 +-- .../recent-edited-dataset-activity.component.html | 3 +-- .../app/ui/dmp/listing/criteria/dmp-criteria.component.ts | 5 ++++- 4 files changed, 7 insertions(+), 7 deletions(-) diff --git a/dmp-frontend/src/app/ui/dashboard/drafts/drafts.component.html b/dmp-frontend/src/app/ui/dashboard/drafts/drafts.component.html index aca54fa5f..d62bb2fc2 100644 --- a/dmp-frontend/src/app/ui/dashboard/drafts/drafts.component.html +++ b/dmp-frontend/src/app/ui/dashboard/drafts/drafts.component.html @@ -1,7 +1,6 @@
-
- +
{{'DATASET-LISTING.DATASET-DESCRIPTION' | translate}}
{{'DATASET-LISTING.STATES.EDITED' | translate}}: {{activity.modified | date:"longDate"}}
diff --git a/dmp-frontend/src/app/ui/dashboard/recent-edited-activity/recent-edited-activity.component.html b/dmp-frontend/src/app/ui/dashboard/recent-edited-activity/recent-edited-activity.component.html index 5202bd3ec..c2902536d 100644 --- a/dmp-frontend/src/app/ui/dashboard/recent-edited-activity/recent-edited-activity.component.html +++ b/dmp-frontend/src/app/ui/dashboard/recent-edited-activity/recent-edited-activity.component.html @@ -70,8 +70,7 @@
-
- +
{{'DATASET-LISTING.DATASET-DESCRIPTION' | translate}}
{{'DATASET-LISTING.STATES.EDITED' | translate}}: {{activity.modified | date:"longDate"}}
diff --git a/dmp-frontend/src/app/ui/dashboard/recent-edited-dataset-activity/recent-edited-dataset-activity.component.html b/dmp-frontend/src/app/ui/dashboard/recent-edited-dataset-activity/recent-edited-dataset-activity.component.html index 7a3b48a1f..89ab52de0 100644 --- a/dmp-frontend/src/app/ui/dashboard/recent-edited-dataset-activity/recent-edited-dataset-activity.component.html +++ b/dmp-frontend/src/app/ui/dashboard/recent-edited-dataset-activity/recent-edited-dataset-activity.component.html @@ -2,8 +2,7 @@
-
- +
{{'DATASET-LISTING.DATASET-DESCRIPTION' | translate}}
{{'DATASET-LISTING.STATES.EDITED' | translate}}: {{activity.modified | date:"longDate"}}
diff --git a/dmp-frontend/src/app/ui/dmp/listing/criteria/dmp-criteria.component.ts b/dmp-frontend/src/app/ui/dmp/listing/criteria/dmp-criteria.component.ts index 2a990faec..7296d4fee 100644 --- a/dmp-frontend/src/app/ui/dmp/listing/criteria/dmp-criteria.component.ts +++ b/dmp-frontend/src/app/ui/dmp/listing/criteria/dmp-criteria.component.ts @@ -1,5 +1,5 @@ -import { Component, Input, OnInit } from '@angular/core'; +import { Component, Input, OnInit, Output, EventEmitter } from '@angular/core'; import { FormBuilder, FormControl } from '@angular/forms'; import { MatDialog } from '@angular/material/dialog'; import { DataTableRequest } from '@app/core/model/data-table/data-table-request'; @@ -34,6 +34,8 @@ export class DmpCriteriaComponent extends BaseCriteriaComponent implements OnIni @Input() showGrant: boolean; @Input() isPublic: boolean; + @Output() filtersChanged: EventEmitter = new EventEmitter(); + filteringGrantsAsync = false; sizeError = false; maxFileSize: number = 1048576; @@ -139,6 +141,7 @@ export class DmpCriteriaComponent extends BaseCriteriaComponent implements OnIni controlModified(): void { this.clearErrorModel(); + this.filtersChanged.emit(); if (this.refreshCallback != null && (this.formGroup.get('like').value == null || this.formGroup.get('like').value.length === 0 || this.formGroup.get('like').value.length > 2) ) { From d3e7f57cbdbb95c6e1d79a162bcfb81ab128c671 Mon Sep 17 00:00:00 2001 From: apapachristou Date: Tue, 7 Jul 2020 15:54:12 +0300 Subject: [PATCH 055/364] Adds search on dmp listing, fixes bug on load more --- .../criteria/dmp-criteria.component.html | 4 +-- .../ui/dmp/listing/dmp-listing.component.html | 15 +++++++-- .../ui/dmp/listing/dmp-listing.component.scss | 31 ++++++++++++++----- .../ui/dmp/listing/dmp-listing.component.ts | 19 ++++++++++++ 4 files changed, 56 insertions(+), 13 deletions(-) diff --git a/dmp-frontend/src/app/ui/dmp/listing/criteria/dmp-criteria.component.html b/dmp-frontend/src/app/ui/dmp/listing/criteria/dmp-criteria.component.html index 4181250b5..9fbde9a29 100644 --- a/dmp-frontend/src/app/ui/dmp/listing/criteria/dmp-criteria.component.html +++ b/dmp-frontend/src/app/ui/dmp/listing/criteria/dmp-criteria.component.html @@ -3,13 +3,13 @@
{{'CRITERIA.FILTERS'| translate}}
- + diff --git a/dmp-frontend/src/app/ui/dmp/listing/dmp-listing.component.html b/dmp-frontend/src/app/ui/dmp/listing/dmp-listing.component.html index b860a01eb..57d773e51 100644 --- a/dmp-frontend/src/app/ui/dmp/listing/dmp-listing.component.html +++ b/dmp-frontend/src/app/ui/dmp/listing/dmp-listing.component.html @@ -8,18 +8,27 @@

{{'DMP-LISTING.TEXT-INFO-QUESTION' | translate}} {{'DMP-LISTING.LINK-ZENODO' | translate}} {{'DMP-LISTING.GET-IDEA' | translate}}

-
+
-
+ + + search + + {{formGroup.get('like').getError('backendError').message}} + + +
-
+
diff --git a/dmp-frontend/src/app/ui/dmp/listing/dmp-listing.component.scss b/dmp-frontend/src/app/ui/dmp/listing/dmp-listing.component.scss index 6248d3a2d..318765330 100644 --- a/dmp-frontend/src/app/ui/dmp/listing/dmp-listing.component.scss +++ b/dmp-frontend/src/app/ui/dmp/listing/dmp-listing.component.scss @@ -186,17 +186,32 @@ } .filter-btn { - position: fixed; - right: 0px; - z-index: 100; - width: 37px; + position: fixed; + right: 0px; + z-index: 100; + width: 37px; } .filter-btn button { - color: white; - background-color: #23BCBA; - width: 37px; - height: 45px; + color: white; + background-color: #23bcba; + width: 37px; + height: 45px; +} + +.search-form { + // font-size: 12px; + text-align: left; + width: 17.5rem; +} + +.search-form mat-icon { + color: #129d99; +} + +::ng-deep .mat-form-field-wrapper { + background-color: white !important; + padding-bottom: 0 !important; } // .bot-paginator { diff --git a/dmp-frontend/src/app/ui/dmp/listing/dmp-listing.component.ts b/dmp-frontend/src/app/ui/dmp/listing/dmp-listing.component.ts index 8cd507e04..88b50b691 100644 --- a/dmp-frontend/src/app/ui/dmp/listing/dmp-listing.component.ts +++ b/dmp-frontend/src/app/ui/dmp/listing/dmp-listing.component.ts @@ -24,6 +24,7 @@ import { UiNotificationService, SnackBarNotificationLevel } from '@app/core/serv import { isNullOrUndefined } from 'util'; import { AuthService } from '@app/core/services/auth/auth.service'; import { DmpCriteriaDialogComponent } from './criteria/dmp-criteria-dialog.component'; +import { FormBuilder, FormControl } from '@angular/forms'; @Component({ @@ -53,6 +54,9 @@ export class DmpListingComponent extends BaseComponent implements OnInit, IBread pageSize: number = 5; criteria: DmpCriteria; + public formGroup = new FormBuilder().group({ + like: new FormControl() + }) constructor( private dmpService: DmpService, @@ -153,6 +157,10 @@ export class DmpListingComponent extends BaseComponent implements OnInit, IBread } }); + + this.formGroup.get('like').valueChanges + .pipe(takeUntil(this._destroyed)) + .subscribe(x => this.controlModified()); } public refresh(resetPages = false) { @@ -206,6 +214,17 @@ export class DmpListingComponent extends BaseComponent implements OnInit, IBread this.refresh(); } + controlModified(): void { + // this.clearErrorModel(); + // if (this.refreshCallback != null && + // (this.formGroup.get('like').value == null || this.formGroup.get('like').value.length === 0 || this.formGroup.get('like').value.length > 2) + // ) { + // setTimeout(() => this.refreshCallback(true)); + // } + this.criteria.like = this.formGroup.get("like").value; + this.refresh(); + } + // rowClicked(dmp: DmpListingModel) { // this.router.navigate(['/plans/overview/' + dmp.id]); // } From 5c8c156220c6c1249d252830ad7081fe492eb83b Mon Sep 17 00:00:00 2001 From: apapachristou Date: Tue, 7 Jul 2020 18:29:15 +0300 Subject: [PATCH 056/364] Fixes on filters of dmp listing --- .../criteria/dmp-criteria-dialog.component.html | 2 +- .../criteria/dmp-criteria-dialog.component.ts | 4 ++-- .../dmp/listing/criteria/dmp-criteria.component.ts | 13 ++++++++++++- .../app/ui/dmp/listing/dmp-listing.component.html | 5 +---- .../app/ui/dmp/listing/dmp-listing.component.scss | 2 +- .../src/app/ui/dmp/listing/dmp-listing.component.ts | 7 +++++-- 6 files changed, 22 insertions(+), 11 deletions(-) diff --git a/dmp-frontend/src/app/ui/dmp/listing/criteria/dmp-criteria-dialog.component.html b/dmp-frontend/src/app/ui/dmp/listing/criteria/dmp-criteria-dialog.component.html index d137b3900..8646ab950 100644 --- a/dmp-frontend/src/app/ui/dmp/listing/criteria/dmp-criteria-dialog.component.html +++ b/dmp-frontend/src/app/ui/dmp/listing/criteria/dmp-criteria-dialog.component.html @@ -1,2 +1,2 @@ clear - + diff --git a/dmp-frontend/src/app/ui/dmp/listing/criteria/dmp-criteria-dialog.component.ts b/dmp-frontend/src/app/ui/dmp/listing/criteria/dmp-criteria-dialog.component.ts index 31355d3e4..c835030f6 100644 --- a/dmp-frontend/src/app/ui/dmp/listing/criteria/dmp-criteria-dialog.component.ts +++ b/dmp-frontend/src/app/ui/dmp/listing/criteria/dmp-criteria-dialog.component.ts @@ -2,6 +2,7 @@ import { Inject, Component, ViewChild, OnInit, Output, EventEmitter } from '@ang import { MAT_DIALOG_DATA, MatDialogRef } from '@angular/material'; import { DmpCriteriaComponent } from './dmp-criteria.component'; import { DmpCriteria } from '@app/core/query/dmp/dmp-criteria'; +import { FormGroup } from '@angular/forms'; @Component({ selector: 'dmp-criteria-dialog-component', @@ -14,13 +15,12 @@ export class DmpCriteriaDialogComponent implements OnInit { constructor( public dialogRef: MatDialogRef, - @Inject(MAT_DIALOG_DATA) public data: { showGrant: boolean, isPublic: boolean, criteria: DmpCriteria, updateDataFn: Function } + @Inject(MAT_DIALOG_DATA) public data: { showGrant: boolean, isPublic: boolean, criteria: DmpCriteria, formGroup: FormGroup, updateDataFn: Function } ) { } ngOnInit() { this.criteria.setCriteria(this.data.criteria); - // this.data.updateDataFn(this.criteria); } onNoClick(): void { diff --git a/dmp-frontend/src/app/ui/dmp/listing/criteria/dmp-criteria.component.ts b/dmp-frontend/src/app/ui/dmp/listing/criteria/dmp-criteria.component.ts index 7296d4fee..54e4b4dd8 100644 --- a/dmp-frontend/src/app/ui/dmp/listing/criteria/dmp-criteria.component.ts +++ b/dmp-frontend/src/app/ui/dmp/listing/criteria/dmp-criteria.component.ts @@ -1,6 +1,6 @@ import { Component, Input, OnInit, Output, EventEmitter } from '@angular/core'; -import { FormBuilder, FormControl } from '@angular/forms'; +import { FormBuilder, FormControl, FormGroup } from '@angular/forms'; import { MatDialog } from '@angular/material/dialog'; import { DataTableRequest } from '@app/core/model/data-table/data-table-request'; import { GrantListingModel } from '@app/core/model/grant/grant-listing'; @@ -34,6 +34,7 @@ export class DmpCriteriaComponent extends BaseCriteriaComponent implements OnIni @Input() showGrant: boolean; @Input() isPublic: boolean; + @Input() criteriaFormGroup: FormGroup; @Output() filtersChanged: EventEmitter = new EventEmitter(); filteringGrantsAsync = false; @@ -98,6 +99,15 @@ export class DmpCriteriaComponent extends BaseCriteriaComponent implements OnIni ngOnInit() { super.ngOnInit(); + + // This if is just for passing label on chips of dialog + if (this.formGroup && this.criteriaFormGroup) { + this.formGroup.get('datasetTemplates').setValue(this.criteriaFormGroup.get('datasetTemplates').value); + this.formGroup.get('grants').setValue(this.criteriaFormGroup.get('grants').value); + this.formGroup.get('collaborators').setValue(this.criteriaFormGroup.get('collaborators').value); + this.formGroup.get('organisations').setValue(this.criteriaFormGroup.get('organisations').value); + } + this.formGroup.get('role').valueChanges .pipe(takeUntil(this._destroyed)) .subscribe(x => this.controlModified()); @@ -133,6 +143,7 @@ export class DmpCriteriaComponent extends BaseCriteriaComponent implements OnIni this.formGroup.get('collaborators').patchValue(criteria.collaborators); this.formGroup.get('datasetTemplates').patchValue(criteria.datasetTemplates); this.formGroup.get('grantStatus').patchValue(criteria.grantStatus); + this.formGroup.get('organisations').patchValue(criteria.organisations); } onCallbackError(error: any) { diff --git a/dmp-frontend/src/app/ui/dmp/listing/dmp-listing.component.html b/dmp-frontend/src/app/ui/dmp/listing/dmp-listing.component.html index 57d773e51..9a4aaf680 100644 --- a/dmp-frontend/src/app/ui/dmp/listing/dmp-listing.component.html +++ b/dmp-frontend/src/app/ui/dmp/listing/dmp-listing.component.html @@ -8,15 +8,12 @@

{{'DMP-LISTING.TEXT-INFO-QUESTION' | translate}} {{'DMP-LISTING.LINK-ZENODO' | translate}} {{'DMP-LISTING.GET-IDEA' | translate}}

-
- search diff --git a/dmp-frontend/src/app/ui/dmp/listing/dmp-listing.component.scss b/dmp-frontend/src/app/ui/dmp/listing/dmp-listing.component.scss index 318765330..09bb2e64f 100644 --- a/dmp-frontend/src/app/ui/dmp/listing/dmp-listing.component.scss +++ b/dmp-frontend/src/app/ui/dmp/listing/dmp-listing.component.scss @@ -209,7 +209,7 @@ color: #129d99; } -::ng-deep .mat-form-field-wrapper { +::ng-deep .search-form .mat-form-field-wrapper { background-color: white !important; padding-bottom: 0 !important; } diff --git a/dmp-frontend/src/app/ui/dmp/listing/dmp-listing.component.ts b/dmp-frontend/src/app/ui/dmp/listing/dmp-listing.component.ts index 88b50b691..d9c351631 100644 --- a/dmp-frontend/src/app/ui/dmp/listing/dmp-listing.component.ts +++ b/dmp-frontend/src/app/ui/dmp/listing/dmp-listing.component.ts @@ -24,7 +24,7 @@ import { UiNotificationService, SnackBarNotificationLevel } from '@app/core/serv import { isNullOrUndefined } from 'util'; import { AuthService } from '@app/core/services/auth/auth.service'; import { DmpCriteriaDialogComponent } from './criteria/dmp-criteria-dialog.component'; -import { FormBuilder, FormControl } from '@angular/forms'; +import { FormBuilder, FormControl, FormGroup } from '@angular/forms'; @Component({ @@ -54,6 +54,7 @@ export class DmpListingComponent extends BaseComponent implements OnInit, IBread pageSize: number = 5; criteria: DmpCriteria; + criteriaFormGroup: FormGroup; public formGroup = new FormBuilder().group({ like: new FormControl() }) @@ -295,6 +296,7 @@ export class DmpListingComponent extends BaseComponent implements OnInit, IBread showGrant: this.showGrant, isPublic: this.isPublic, criteria: this.criteria, + formGroup: this.criteriaFormGroup, // criteria: this.grantId ? this.criteria : this.getDefaultCriteria(), updateDataFn: this.updateDataFn.bind(this) }, @@ -306,6 +308,7 @@ export class DmpListingComponent extends BaseComponent implements OnInit, IBread } updateDataFn(criteria: DmpCriteriaComponent): void { + this.criteriaFormGroup = criteria.formGroup; this.toDmpCriteria(criteria); this.refresh(); } @@ -341,7 +344,7 @@ export class DmpListingComponent extends BaseComponent implements OnInit, IBread } hasScrollbar(): boolean { - return document.getElementById("main-page").scrollHeight > document.documentElement.clientHeight; + return document.getElementById("main-page").scrollHeight > document.documentElement.clientHeight } } From bb0c5a039128b753fde63f19a5178b1153ab2109 Mon Sep 17 00:00:00 2001 From: gpapavgeri Date: Tue, 7 Jul 2020 18:30:25 +0300 Subject: [PATCH 057/364] Invite authors-pop up_v1 --- .../overview/dataset-overview.component.html | 2 +- .../overview/dataset-overview.component.scss | 2 +- .../overview/dataset-overview.component.ts | 8 +++ .../invitation/dmp-invitation.component.html | 53 ++++++++++++++---- .../invitation/dmp-invitation.component.scss | 56 +++++++++++++++++++ .../invitation/dmp-invitation.component.ts | 5 ++ .../dmp/overview/dmp-overview.component.html | 15 +++-- .../ui/dmp/overview/dmp-overview.component.ts | 33 ++++------- dmp-frontend/src/assets/i18n/en.json | 2 + dmp-frontend/src/assets/i18n/es.json | 2 + dmp-frontend/src/assets/i18n/gr.json | 2 + 11 files changed, 137 insertions(+), 43 deletions(-) diff --git a/dmp-frontend/src/app/ui/dataset/overview/dataset-overview.component.html b/dmp-frontend/src/app/ui/dataset/overview/dataset-overview.component.html index a85436ba8..dba577e25 100644 --- a/dmp-frontend/src/app/ui/dataset/overview/dataset-overview.component.html +++ b/dmp-frontend/src/app/ui/dataset/overview/dataset-overview.component.html @@ -143,7 +143,7 @@

{{ roleDisplay(user) }}

-
diff --git a/dmp-frontend/src/app/ui/dataset/overview/dataset-overview.component.scss b/dmp-frontend/src/app/ui/dataset/overview/dataset-overview.component.scss index 6b918f358..e80bc3a5a 100644 --- a/dmp-frontend/src/app/ui/dataset/overview/dataset-overview.component.scss +++ b/dmp-frontend/src/app/ui/dataset/overview/dataset-overview.component.scss @@ -55,7 +55,7 @@ height: 2.3em; background-color: #129D99; border-radius: 4px; - flex-direction: rows; + flex-direction: row; justify-content: space-between; border: none; } diff --git a/dmp-frontend/src/app/ui/dataset/overview/dataset-overview.component.ts b/dmp-frontend/src/app/ui/dataset/overview/dataset-overview.component.ts index adb861816..6e1a22ef4 100644 --- a/dmp-frontend/src/app/ui/dataset/overview/dataset-overview.component.ts +++ b/dmp-frontend/src/app/ui/dataset/overview/dataset-overview.component.ts @@ -370,6 +370,14 @@ export class DatasetOverviewComponent extends BaseComponent implements OnInit { }); } + removeUserFromDmp() { + // return this.dmpService.removeUserFromDmp().pipe(takeUntil(this._destroyed)) + // .subscribe( + // complete => { this.onCallbackSuccess() }, + // error => this.onDeleteCallbackError(error) + // ); + } + } diff --git a/dmp-frontend/src/app/ui/dmp/invitation/dmp-invitation.component.html b/dmp-frontend/src/app/ui/dmp/invitation/dmp-invitation.component.html index 7b57c6b4a..48c5bcdc9 100644 --- a/dmp-frontend/src/app/ui/dmp/invitation/dmp-invitation.component.html +++ b/dmp-frontend/src/app/ui/dmp/invitation/dmp-invitation.component.html @@ -1,16 +1,47 @@ -
+
+ +
+ close +
+
+

{{'DMP-LISTING.ACTIONS.INVITE-AUTHORS' | translate}}

+
+
+ + + + {{email}} + cancel + + + + +
+ +
+
+ +
+ + + + - +
--> + + - - + + - -
+ \ No newline at end of file diff --git a/dmp-frontend/src/app/ui/dmp/invitation/dmp-invitation.component.scss b/dmp-frontend/src/app/ui/dmp/invitation/dmp-invitation.component.scss index e69de29bb..cee86fde2 100644 --- a/dmp-frontend/src/app/ui/dmp/invitation/dmp-invitation.component.scss +++ b/dmp-frontend/src/app/ui/dmp/invitation/dmp-invitation.component.scss @@ -0,0 +1,56 @@ +.form-container { + width: 530px; + height: 228px; + padding: 4.5px 5.5px 14px 18px; + // margin: 28.5px 29.5px 38px 42px; +} + +.close-icon { + cursor: pointer; +} + +.title { + // text-align: left; + font-size: 38px; + font-weight: lighter; + color: #000000; + opacity: 0.8; + margin-bottom: 32px; +} + +.content { + width: 496px; + margin: 0px; + padding: 0px; +} + +.input { + border: 2px black; +} + +.mat-form-field { + background: #FAFAFA; + border: 1px solid #D1D1D1; + border-radius: 4px; +} + +::ng-deep .mat-form-field-underline { + display: none; +} + +::ng-deep .multiple-auto-complete[_ngcontent-mut-c19] { + display: none; +} + +.invite-btn{ + width: 6.64em; + height: 2.93em; + background: #FFFFFF; + border: 1px solid #B5B5B5; + border-radius: 30px; + font-weight: bold; + letter-spacing: -0.35px; + color: #B5B5B5; + margin-bottom: 1px; + } + diff --git a/dmp-frontend/src/app/ui/dmp/invitation/dmp-invitation.component.ts b/dmp-frontend/src/app/ui/dmp/invitation/dmp-invitation.component.ts index bbda70d88..20936c1c8 100644 --- a/dmp-frontend/src/app/ui/dmp/invitation/dmp-invitation.component.ts +++ b/dmp-frontend/src/app/ui/dmp/invitation/dmp-invitation.component.ts @@ -18,6 +18,7 @@ import { map, takeUntil } from 'rxjs/operators'; @Component({ selector: 'app-invitation-component', templateUrl: 'dmp-invitation.component.html', + styleUrls: ['./dmp-invitation.component.scss'], }) export class DmpInvitationDialogComponent extends BaseComponent implements OnInit { @@ -91,6 +92,10 @@ export class DmpInvitationDialogComponent extends BaseComponent implements OnIni ); } + closeDialog(): void { + this.dialogRef.close(); + } + filterUsers(value: string): Observable { this.filteredUsers = undefined; this.filteredUsersAsync = true; diff --git a/dmp-frontend/src/app/ui/dmp/overview/dmp-overview.component.html b/dmp-frontend/src/app/ui/dmp/overview/dmp-overview.component.html index e69f6c004..c28357438 100644 --- a/dmp-frontend/src/app/ui/dmp/overview/dmp-overview.component.html +++ b/dmp-frontend/src/app/ui/dmp/overview/dmp-overview.component.html @@ -50,13 +50,13 @@ matTooltip="{{'DMP-LISTING.ACTIONS.CLONE' | translate}}" matTooltipPosition="above"> content_copy - - @@ -154,8 +154,8 @@

{{ 'DMP-LISTING.ACTIONS.EXPORT' | translate }}

-
+
@@ -206,8 +206,7 @@

{{ roleDisplay(user) }}

-
diff --git a/dmp-frontend/src/app/ui/dmp/overview/dmp-overview.component.ts b/dmp-frontend/src/app/ui/dmp/overview/dmp-overview.component.ts index d29c8be25..11ad516ae 100644 --- a/dmp-frontend/src/app/ui/dmp/overview/dmp-overview.component.ts +++ b/dmp-frontend/src/app/ui/dmp/overview/dmp-overview.component.ts @@ -566,25 +566,14 @@ export class DmpOverviewComponent extends BaseComponent implements OnInit { this.location.back(); } - removeCollaborator(id: string) { - const dialogRef = this.dialog.open(ConfirmationDialogComponent, { - maxWidth: '300px', - data: { - message: this.language.instant('GENERAL.CONFIRMATION-DIALOG.DELETE-USER'), - confirmButton: this.language.instant('GENERAL.CONFIRMATION-DIALOG.ACTIONS.REMOVE'), - cancelButton: this.language.instant('GENERAL.CONFIRMATION-DIALOG.ACTIONS.CANCEL'), - isDeleteConfirmation: false - } - }); - dialogRef.afterClosed().subscribe(result => { - if (result) { - this.formGroup.get('users').setValue(this.formGroup.get('users').value.filter(function (val, index, arr) { - return val.id !== id; - })); - } - }); + removeUserFromDmp() { + // return this.dmpService.updateUsers(this.dmp.id, this.dmp.users).pipe(takeUntil(this._destroyed)) + // .subscribe( + // complete => { this.onCallbackSuccess() }, + // error => this.onDeleteCallbackError(error) + // ); } - + copyDoi(doi) { console.log(doi.nativeElement.innerHTML); let domElement = doi.nativeElement as HTMLInputElement; @@ -593,14 +582,14 @@ export class DmpOverviewComponent extends BaseComponent implements OnInit { domElement.setSelectionRange(0, 0); alert('Doi Copied to Clipboard'); } - + public getOrcidPath(): string { return this.configurationService.orcidPath; } - checkLockStatus(id: string){ + checkLockStatus(id: string) { this.lockService.checkLockStatus(id).pipe(takeUntil(this._destroyed)) - .subscribe(lockStatus => this.lockStatus = lockStatus); + .subscribe(lockStatus => this.lockStatus = lockStatus); } getUserFromDMP(): any { @@ -610,7 +599,7 @@ export class DmpOverviewComponent extends BaseComponent implements OnInit { } } - + // advancedClicked() { // const dialogRef = this.dialog.open(ExportMethodDialogComponent, { // maxWidth: '500px', diff --git a/dmp-frontend/src/assets/i18n/en.json b/dmp-frontend/src/assets/i18n/en.json index b556ceb4f..ec53721ec 100644 --- a/dmp-frontend/src/assets/i18n/en.json +++ b/dmp-frontend/src/assets/i18n/en.json @@ -419,6 +419,7 @@ "NEW-WITH-WIZARD": "New DMP using the wizard", "EDIT": "Edit", "INVITE": "Invite Contributors", + "INVITE-AUTHORS": "Invite authors", "INVITE-SHORT": "Invite", "ADD-DATASET": "Add Dataset Description To DMP", "ADD-DATASET-DESCRIPTION": "Add dataset description", @@ -914,6 +915,7 @@ "TITLE": "Send Invitations for ", "AUTOCOMPLETE-USER": "User", "AUTOCOMPLETE-EMAIL": "Email", + "AUTOCOMPLETE-USER-EMAIL": "Kat or kat@example.com", "ACTIONS": { "SEND-INVITATION": "Send Invitations", "CANCEL": "Cancel" diff --git a/dmp-frontend/src/assets/i18n/es.json b/dmp-frontend/src/assets/i18n/es.json index 02fa89ccd..d35ec3b29 100644 --- a/dmp-frontend/src/assets/i18n/es.json +++ b/dmp-frontend/src/assets/i18n/es.json @@ -418,6 +418,7 @@ "NEW-WITH-WIZARD": "Nuevo PGD utilizando el asistente", "EDIT": "Editar", "INVITE": "Invitar a participantes", + "INVITE-AUTHORS": "Invitar a autores", "INVITE-SHORT": "Invitar", "ADD-DATASET-SHORT": "Añadir Dataset", "ADD-DATASET-DESCRIPTION": "Añadir la descripción del Dataset", @@ -909,6 +910,7 @@ "TITLE": "Enviar invitaciones para ", "AUTOCOMPLETE-USER": "Usuario", "AUTOCOMPLETE-EMAIL": "Email", + "AUTOCOMPLETE-USER-EMAIL": "Kat o kat@example.com", "ACTIONS": { "SEND-INVITATION": "Enviar invitaciones", "CANCEL": "Cancelar" diff --git a/dmp-frontend/src/assets/i18n/gr.json b/dmp-frontend/src/assets/i18n/gr.json index 4f696bf13..40d99556e 100644 --- a/dmp-frontend/src/assets/i18n/gr.json +++ b/dmp-frontend/src/assets/i18n/gr.json @@ -418,6 +418,7 @@ "NEW-WITH-WIZARD": "Νέο Σχέδιο Διαχείρισης Δεδομένων χρησιμοποιώντας τον wizard", "EDIT": "Επεξεργασία", "INVITE": "Πρόσκληση Συνεργατών", + "INVITE-AUTHORS": "Πρόσκληση συγγραφέων", "INVITE-SHORT": "Πρόσκληση", "ADD-DATASET": "Προσθήκη Περιγραφής Συνόλου Δεδομένων στο Σχέδιο Διαχείρισης Δεδομένων", "ADD-DATASET-SHORT": "Προσθήκη Συνόλου Δεδομένων", @@ -910,6 +911,7 @@ "TITLE": "Αποστολή Προσκλήσεων για", "AUTOCOMPLETE-USER": "Χρήστης", "AUTOCOMPLETE-EMAIL": "Email", + "AUTOCOMPLETE-USER-EMAIL": "Kat ή kat@example.com", "ACTIONS": { "SEND-INVITATION": "Αποστολή Προσκλήσεων", "CANCEL": "Ακύρωση" From 8ffdfdba1f03f08b92572679312e9000d1217015 Mon Sep 17 00:00:00 2001 From: George Kalampokis Date: Wed, 8 Jul 2020 16:56:55 +0300 Subject: [PATCH 058/364] If DMP is lacking the visibility option then create a Zenodo DOI with resstricted file access and no license --- .../managers/DataManagementPlanManager.java | 31 +++++++++++-------- 1 file changed, 18 insertions(+), 13 deletions(-) diff --git a/dmp-backend/web/src/main/java/eu/eudat/logic/managers/DataManagementPlanManager.java b/dmp-backend/web/src/main/java/eu/eudat/logic/managers/DataManagementPlanManager.java index 8d272f67d..bf7f73d37 100644 --- a/dmp-backend/web/src/main/java/eu/eudat/logic/managers/DataManagementPlanManager.java +++ b/dmp-backend/web/src/main/java/eu/eudat/logic/managers/DataManagementPlanManager.java @@ -1672,21 +1672,26 @@ public class DataManagementPlanManager { dataBuilder.append(" \"description\": \"").append((dmp.getDescription() != null && !dmp.getDescription().isEmpty() ? dmp.getDescription() : "

")).append("\",\n"); dataBuilder.append(" \"version\": \"").append(dmp.getVersion()).append("\",\n"); dataBuilder.append(" \"access_right\": \""); - if (((Boolean)extraProperties.get("visible"))) { - Instant publicationDate = Instant.parse(extraProperties.get("publicDate").toString()); - if (publicationDate.isBefore(Instant.now())) { - dataBuilder.append("open\",\n"); - } else { - dataBuilder.append("embargoed\",\n"); - dataBuilder.append(" \"embargo_date\": \"" + publicationDate + "\",\n"); - } - - if (extraProperties.get("license") != null) { - dataBuilder.append(" \"license\": \"").append(((Map)extraProperties.get("license")).get("pid")).append("\",\n"); - } - } else { + if (extraProperties.get("visible") == null) { dataBuilder.append("restricted\",\n"); dataBuilder.append(" \"access_conditions\": \"\",\n"); + } else { + if (((Boolean) extraProperties.get("visible"))) { + Instant publicationDate = Instant.parse(extraProperties.get("publicDate").toString()); + if (publicationDate.isBefore(Instant.now())) { + dataBuilder.append("open\",\n"); + } else { + dataBuilder.append("embargoed\",\n"); + dataBuilder.append(" \"embargo_date\": \"" + publicationDate + "\",\n"); + } + + if (extraProperties.get("license") != null) { + dataBuilder.append(" \"license\": \"").append(((Map) extraProperties.get("license")).get("pid")).append("\",\n"); + } + } else { + dataBuilder.append("restricted\",\n"); + dataBuilder.append(" \"access_conditions\": \"\",\n"); + } } if (dmp.isPublic()) { dataBuilder.append(" \"related_identifiers\": [{\n"); From a728e7da4aa9ac860ed3c2dd1a8dee04cab313f5 Mon Sep 17 00:00:00 2001 From: George Kalampokis Date: Wed, 8 Jul 2020 16:56:55 +0300 Subject: [PATCH 059/364] If DMP is lacking the visibility option then create a Zenodo DOI with resstricted file access and no license --- .../managers/DataManagementPlanManager.java | 31 +++++++++++-------- 1 file changed, 18 insertions(+), 13 deletions(-) diff --git a/dmp-backend/web/src/main/java/eu/eudat/logic/managers/DataManagementPlanManager.java b/dmp-backend/web/src/main/java/eu/eudat/logic/managers/DataManagementPlanManager.java index 495811aaa..3d63d6ea7 100644 --- a/dmp-backend/web/src/main/java/eu/eudat/logic/managers/DataManagementPlanManager.java +++ b/dmp-backend/web/src/main/java/eu/eudat/logic/managers/DataManagementPlanManager.java @@ -1684,21 +1684,26 @@ public class DataManagementPlanManager { dataBuilder.append(" \"description\": \"").append((dmp.getDescription() != null && !dmp.getDescription().isEmpty() ? dmp.getDescription() : "

")).append("\",\n"); dataBuilder.append(" \"version\": \"").append(dmp.getVersion()).append("\",\n"); dataBuilder.append(" \"access_right\": \""); - if (((Boolean)extraProperties.get("visible"))) { - Instant publicationDate = Instant.parse(extraProperties.get("publicDate").toString()); - if (publicationDate.isBefore(Instant.now())) { - dataBuilder.append("open\",\n"); - } else { - dataBuilder.append("embargoed\",\n"); - dataBuilder.append(" \"embargo_date\": \"" + publicationDate + "\",\n"); - } - - if (extraProperties.get("license") != null) { - dataBuilder.append(" \"license\": \"").append(((Map)extraProperties.get("license")).get("pid")).append("\",\n"); - } - } else { + if (extraProperties.get("visible") == null) { dataBuilder.append("restricted\",\n"); dataBuilder.append(" \"access_conditions\": \"\",\n"); + } else { + if (((Boolean) extraProperties.get("visible"))) { + Instant publicationDate = Instant.parse(extraProperties.get("publicDate").toString()); + if (publicationDate.isBefore(Instant.now())) { + dataBuilder.append("open\",\n"); + } else { + dataBuilder.append("embargoed\",\n"); + dataBuilder.append(" \"embargo_date\": \"" + publicationDate + "\",\n"); + } + + if (extraProperties.get("license") != null) { + dataBuilder.append(" \"license\": \"").append(((Map) extraProperties.get("license")).get("pid")).append("\",\n"); + } + } else { + dataBuilder.append("restricted\",\n"); + dataBuilder.append(" \"access_conditions\": \"\",\n"); + } } if (dmp.isPublic()) { dataBuilder.append(" \"related_identifiers\": [{\n"); From 5aa231e2bff03a7f38e9df74de022bcf3f99bc6f Mon Sep 17 00:00:00 2001 From: apapachristou Date: Wed, 8 Jul 2020 17:54:41 +0300 Subject: [PATCH 060/364] Adds complete dataset listing redesign --- .../app/ui/dashboard/dashboard.component.scss | 4 +- .../ui/dashboard/drafts/drafts.component.css | 1 + .../recent-edited-activity.component.css | 1 + ...ent-edited-dataset-activity.component.scss | 1 + .../src/app/ui/dataset/dataset.module.ts | 7 +- .../dataset-criteria-dialog.component.html | 2 + .../dataset-criteria-dialog.component.ts | 38 ++++ .../criteria/dataset-criteria.component.html | 10 +- .../criteria/dataset-criteria.component.ts | 19 +- .../listing/dataset-listing.component.html | 52 ++++- .../listing/dataset-listing.component.scss | 172 ++++++++++++++-- .../listing/dataset-listing.component.ts | 180 ++++++++++++----- .../dataset-listing-item.component.html | 73 ++++++- .../dataset-listing-item.component.scss | 171 ++++++++++++++++ .../dataset-listing-item.component.ts | 183 +++++++++++++++++- .../criteria/dmp-criteria.component.html | 2 +- .../ui/dmp/listing/dmp-listing.component.html | 11 +- .../ui/dmp/listing/dmp-listing.component.scss | 25 ++- .../ui/dmp/listing/dmp-listing.component.ts | 2 +- .../dmp-listing-item.component.ts | 7 +- .../explore-dmp-filters.component.ts | 4 +- dmp-frontend/src/assets/i18n/en.json | 16 +- dmp-frontend/src/assets/i18n/es.json | 16 +- dmp-frontend/src/assets/i18n/gr.json | 16 +- 24 files changed, 894 insertions(+), 119 deletions(-) create mode 100644 dmp-frontend/src/app/ui/dataset/listing/criteria/dataset-criteria-dialogue/dataset-criteria-dialog.component.html create mode 100644 dmp-frontend/src/app/ui/dataset/listing/criteria/dataset-criteria-dialogue/dataset-criteria-dialog.component.ts diff --git a/dmp-frontend/src/app/ui/dashboard/dashboard.component.scss b/dmp-frontend/src/app/ui/dashboard/dashboard.component.scss index 46690bf67..7be22ca89 100644 --- a/dmp-frontend/src/app/ui/dashboard/dashboard.component.scss +++ b/dmp-frontend/src/app/ui/dashboard/dashboard.component.scss @@ -32,7 +32,8 @@ .card-content { text-align: left; - font: Light 16px/26px Roboto; + font-weight: 300; + font-size: 1rem; letter-spacing: 0px; color: #212121; padding-left: 40px; @@ -200,6 +201,7 @@ input[type="text"] { letter-spacing: 0px; color: #212121; opacity: 0.75; + font-weight: 400; } .dmp-title, diff --git a/dmp-frontend/src/app/ui/dashboard/drafts/drafts.component.css b/dmp-frontend/src/app/ui/dashboard/drafts/drafts.component.css index 893d3700c..349ff9f54 100644 --- a/dmp-frontend/src/app/ui/dashboard/drafts/drafts.component.css +++ b/dmp-frontend/src/app/ui/dashboard/drafts/drafts.component.css @@ -68,6 +68,7 @@ input[type="text"] { letter-spacing: 0px; color: #212121; opacity: 0.75; + font-weight: 400; } .dmp-title, diff --git a/dmp-frontend/src/app/ui/dashboard/recent-edited-activity/recent-edited-activity.component.css b/dmp-frontend/src/app/ui/dashboard/recent-edited-activity/recent-edited-activity.component.css index c2ce5bb3c..9492c6421 100644 --- a/dmp-frontend/src/app/ui/dashboard/recent-edited-activity/recent-edited-activity.component.css +++ b/dmp-frontend/src/app/ui/dashboard/recent-edited-activity/recent-edited-activity.component.css @@ -68,6 +68,7 @@ input[type="text"] { letter-spacing: 0px; color: #212121; opacity: 0.75; + font-weight: 400; } .dmp-title, diff --git a/dmp-frontend/src/app/ui/dashboard/recent-edited-dataset-activity/recent-edited-dataset-activity.component.scss b/dmp-frontend/src/app/ui/dashboard/recent-edited-dataset-activity/recent-edited-dataset-activity.component.scss index e7c8878da..63a38eb0c 100644 --- a/dmp-frontend/src/app/ui/dashboard/recent-edited-dataset-activity/recent-edited-dataset-activity.component.scss +++ b/dmp-frontend/src/app/ui/dashboard/recent-edited-dataset-activity/recent-edited-dataset-activity.component.scss @@ -68,6 +68,7 @@ input[type="text"] { letter-spacing: 0px; color: #212121; opacity: 0.75; + font-weight: 400; } .dmp-title, diff --git a/dmp-frontend/src/app/ui/dataset/dataset.module.ts b/dmp-frontend/src/app/ui/dataset/dataset.module.ts index 4d10643f5..76674c623 100644 --- a/dmp-frontend/src/app/ui/dataset/dataset.module.ts +++ b/dmp-frontend/src/app/ui/dataset/dataset.module.ts @@ -24,6 +24,7 @@ import { CommonUiModule } from '@common/ui/common-ui.module'; import { AngularStickyThingsModule } from '@w11k/angular-sticky-things'; import { DatasetCopyDialogModule } from './dataset-wizard/dataset-copy-dialogue/dataset-copy-dialogue.module'; import { DatasetOverviewModule } from './overview/dataset-overview.module'; +import { DatasetCriteriaDialogComponent } from './listing/criteria/dataset-criteria-dialogue/dataset-criteria-dialog.component'; @NgModule({ imports: [ @@ -53,14 +54,16 @@ import { DatasetOverviewModule } from './overview/dataset-overview.module'; DatasetExternalRegistryDialogEditorComponent, DatasetExternalServiceDialogEditorComponent, DatasetUploadDialogue, - DatasetListingItemComponent + DatasetListingItemComponent, + DatasetCriteriaDialogComponent ], entryComponents: [ DatasetExternalDataRepositoryDialogEditorComponent, DatasetExternalDatasetDialogEditorComponent, DatasetExternalRegistryDialogEditorComponent, DatasetExternalServiceDialogEditorComponent, - DatasetUploadDialogue + DatasetUploadDialogue, + DatasetCriteriaDialogComponent ] }) export class DatasetModule { } diff --git a/dmp-frontend/src/app/ui/dataset/listing/criteria/dataset-criteria-dialogue/dataset-criteria-dialog.component.html b/dmp-frontend/src/app/ui/dataset/listing/criteria/dataset-criteria-dialogue/dataset-criteria-dialog.component.html new file mode 100644 index 000000000..61787906e --- /dev/null +++ b/dmp-frontend/src/app/ui/dataset/listing/criteria/dataset-criteria-dialogue/dataset-criteria-dialog.component.html @@ -0,0 +1,2 @@ +clear + diff --git a/dmp-frontend/src/app/ui/dataset/listing/criteria/dataset-criteria-dialogue/dataset-criteria-dialog.component.ts b/dmp-frontend/src/app/ui/dataset/listing/criteria/dataset-criteria-dialogue/dataset-criteria-dialog.component.ts new file mode 100644 index 000000000..29f9f212b --- /dev/null +++ b/dmp-frontend/src/app/ui/dataset/listing/criteria/dataset-criteria-dialogue/dataset-criteria-dialog.component.ts @@ -0,0 +1,38 @@ +import { Inject, Component, ViewChild, OnInit, Output, EventEmitter } from '@angular/core'; +import { MAT_DIALOG_DATA, MatDialogRef } from '@angular/material'; +import { FormGroup } from '@angular/forms'; +import { DatasetCriteriaComponent } from '../dataset-criteria.component'; +import { DatasetCriteria } from '@app/core/query/dataset/dataset-criteria'; + +@Component({ + selector: 'dataset-criteria-dialog-component', + templateUrl: './dataset-criteria-dialog.component.html', +}) + +export class DatasetCriteriaDialogComponent implements OnInit { + + @ViewChild(DatasetCriteriaComponent, { static: true }) criteria: DatasetCriteriaComponent; + + constructor( + public dialogRef: MatDialogRef, + @Inject(MAT_DIALOG_DATA) public data: { isPublic: boolean, status: Number, criteria: DatasetCriteria, formGroup: FormGroup, updateDataFn: Function } + ) { + } + + ngOnInit() { + this.criteria.setCriteria(this.data.criteria); + } + + onNoClick(): void { + this.dialogRef.close(); + } + + onClose(): void { + this.dialogRef.close(); + } + + onFiltersChanged(event) { + this.data.updateDataFn(this.criteria); + } + +} diff --git a/dmp-frontend/src/app/ui/dataset/listing/criteria/dataset-criteria.component.html b/dmp-frontend/src/app/ui/dataset/listing/criteria/dataset-criteria.component.html index e7f535af9..b50c6e0c8 100644 --- a/dmp-frontend/src/app/ui/dataset/listing/criteria/dataset-criteria.component.html +++ b/dmp-frontend/src/app/ui/dataset/listing/criteria/dataset-criteria.component.html @@ -3,20 +3,20 @@
{{'CRITERIA.FILTERS'| translate}}
- +
{{'CRITERIA.DATA-SETS.STATUS'| translate}}
- {{ 'TYPES.DATASET-STATUS.ANY' | translate }} + {{ 'TYPES.DATASET-STATUS.ANY' | translate }} {{ 'TYPES.DATASET-STATUS.DRAFT' | translate }} {{ 'TYPES.DATASET-STATUS.FINALISED' | translate }} @@ -27,7 +27,7 @@
{{ 'FACET-SEARCH.GRANT-STATUS.TITLE' | translate }}
- {{ 'FACET-SEARCH.GRANT-STATUS.OPTIONS.ANY' | translate }} + {{ 'FACET-SEARCH.GRANT-STATUS.OPTIONS.ANY' | translate }} {{ 'FACET-SEARCH.GRANT-STATUS.OPTIONS.ACTIVE' | translate }} {{ 'FACET-SEARCH.GRANT-STATUS.OPTIONS.INACTIVE' | translate }} @@ -93,7 +93,7 @@
{{'CRITERIA.DATA-SETS.ROLE' | translate }}
- {{ 'TYPES.DATASET-ROLE.ANY' | translate }} + {{ 'TYPES.DATASET-ROLE.ANY' | translate }} {{ 'TYPES.DATASET-ROLE.OWNER' | translate }} {{ 'TYPES.DATASET-ROLE.MEMBER' | translate }} diff --git a/dmp-frontend/src/app/ui/dataset/listing/criteria/dataset-criteria.component.ts b/dmp-frontend/src/app/ui/dataset/listing/criteria/dataset-criteria.component.ts index 1656c6965..433662496 100644 --- a/dmp-frontend/src/app/ui/dataset/listing/criteria/dataset-criteria.component.ts +++ b/dmp-frontend/src/app/ui/dataset/listing/criteria/dataset-criteria.component.ts @@ -1,5 +1,5 @@ -import { Component, Input, OnInit } from '@angular/core'; +import { Component, Input, OnInit, Output, EventEmitter } from '@angular/core'; import { FormBuilder, FormControl, FormGroup } from '@angular/forms'; import { MatDialog } from '@angular/material/dialog'; import { MatSnackBar } from '@angular/material/snack-bar'; @@ -48,6 +48,8 @@ export class DatasetCriteriaComponent extends BaseCriteriaComponent implements O @Input() dmpSearchEnabled; @Input() status; @Input() isPublic: boolean; + @Input() criteriaFormGroup: FormGroup; + @Output() filtersChanged: EventEmitter = new EventEmitter(); public criteria: any; public filteringTagsAsync = false; public filteredTags: ExternalSourceItemModel[]; @@ -139,6 +141,18 @@ export class DatasetCriteriaComponent extends BaseCriteriaComponent implements O ngOnInit() { super.ngOnInit(); + + // This if is just for passing label on chips of dialog + if (this.formGroup && this.criteriaFormGroup) { + this.formGroup.get('datasetTemplates').setValue(this.criteriaFormGroup.get('datasetTemplates').value); + this.formGroup.get('groupIds').setValue(this.criteriaFormGroup.get('groupIds').value); + this.formGroup.get('grants').setValue(this.criteriaFormGroup.get('grants').value); + this.formGroup.get('collaborators').setValue(this.criteriaFormGroup.get('collaborators').value); + this.formGroup.get('organisations').setValue(this.criteriaFormGroup.get('organisations').value); + this.formGroup.get('tags').setValue(this.criteriaFormGroup.get('tags').value); + + } + this.formGroup.get('like').valueChanges .pipe(takeUntil(this._destroyed)) .subscribe(x => this.controlModified()); @@ -173,7 +187,7 @@ export class DatasetCriteriaComponent extends BaseCriteriaComponent implements O .pipe(takeUntil(this._destroyed)) .subscribe(x => this.controlModified()); // if (this.criteria == null) { this.criteria = {}; } - this.formGroup.patchValue({'status': this.status !== undefined ? this.status : 'null'}); + // this.formGroup.patchValue({'status': this.status !== undefined ? this.status : 'null'}); } setCriteria(criteria: DatasetCriteria): void { @@ -192,6 +206,7 @@ export class DatasetCriteriaComponent extends BaseCriteriaComponent implements O controlModified(): void { this.clearErrorModel(); + this.filtersChanged.emit(); if (this.refreshCallback != null && (this.formGroup.get('like').value == null || this.formGroup.get('like').value.length === 0 || this.formGroup.get('like').value.length > 2) ) { diff --git a/dmp-frontend/src/app/ui/dataset/listing/dataset-listing.component.html b/dmp-frontend/src/app/ui/dataset/listing/dataset-listing.component.html index d617ca699..703dd8ec7 100644 --- a/dmp-frontend/src/app/ui/dataset/listing/dataset-listing.component.html +++ b/dmp-frontend/src/app/ui/dataset/listing/dataset-listing.component.html @@ -1,4 +1,51 @@ -
+
+
+
+
+ clear +
+

{{'DATASET-LISTING.TEXT-INFO' | translate}} {{'DATASET-LISTING.LINK-PUBLIC-DATASETS' | translate}} {{'DATASET-LISTING.TEXT-INFO-REST' | translate}}

+

{{'DATASET-LISTING.TEXT-INFO-PAR' | translate}} +

+ +
+
+
+
+ +
+
+
+
+ + + search + + {{formGroup.get('like').getError('backendError').message}} + + +
+
+ +
+
+ +
+
+
+ {{'DATASET-LISTING.EMPTY-LIST' | translate}} +
+
+
+
+
+ + +
-
+
--> diff --git a/dmp-frontend/src/app/ui/dataset/listing/dataset-listing.component.scss b/dmp-frontend/src/app/ui/dataset/listing/dataset-listing.component.scss index e69441181..ec91a8459 100644 --- a/dmp-frontend/src/app/ui/dataset/listing/dataset-listing.component.scss +++ b/dmp-frontend/src/app/ui/dataset/listing/dataset-listing.component.scss @@ -12,26 +12,162 @@ } .header-image { - background: url("/assets/images/new-dashboard-bg.png") no-repeat; - background-size: cover; - margin-top: 70px; - min-height: 15em; - position: relative; - } + background: url("/assets/images/new-dashboard-bg.png") no-repeat; + background-size: cover; + margin-top: 70px; + min-height: 15em; + position: relative; +} - .header-text-container { - background: rgba(255, 255, 255, 0.7); - position: absolute; - bottom: 0px; - padding-left: 5em; - padding-right: 10em; - padding-top: 2em; - padding-bottom: 2em; - } +.header-text-container { + background: rgba(255, 255, 255, 0.7); + position: absolute; + bottom: 0px; + padding-left: 5em; + padding-right: 10em; + padding-top: 2em; + padding-bottom: 2em; +} - .explore-dmp-content { - padding: 30px 15px; - } +.explore-dmp-content { + padding: 30px 15px; +} + +.main-content { + background-color: #f5f5f5; + padding-top: 9.68rem; + padding-bottom: 3rem; + padding-left: 3rem; + padding-right: 3rem; + margin: 0; + display: flex; + flex-grow: 1; +} + +.card { + background: #ffffff 0% 0% no-repeat padding-box; + box-shadow: 0px 3px 6px #00000029; + border-radius: 4px; + // width: 987px; + margin-bottom: 3.75rem; + /* height: 407px; */ + opacity: 1; +} + +.card-title { + text-align: left; + font: Bold 20px/30px Roboto; + letter-spacing: 0px; + color: #212121; + padding-left: 40px; + /* padding-top: 40px; */ + padding-right: 55px; + opacity: 1; +} + +.card-content { + text-align: left; + font-weight: 300; + letter-spacing: 0px; + color: #212121; + padding-left: 40px; + padding-top: 36px; + padding-bottom: 36px; + padding-right: 55px; + opacity: 1; +} + +.clear-icon { + cursor: pointer; +} + +.normal-btn { + min-width: 162px; + max-width: 256px; + height: 40px; + cursor: pointer; + background: #129d99 0% 0% no-repeat padding-box; + box-shadow: 0px 3px 6px #1e202029; + border-radius: 30px; + border: none; + color: #ffffff; + opacity: 1; + line-height: 1; + font-size: 0.87rem; + padding: 0.62rem 1.87rem; + margin-left: 40px; +} + +.yellow-btn { + min-width: 162px; + max-width: 256px; + height: 40px; + cursor: pointer; + background: #f7dd72 0% 0% no-repeat padding-box; + border-radius: 30px; + opacity: 1; + border: none; + color: #000000; + opacity: 1; + line-height: 1; + font-size: 0.87rem; + padding: 0.62rem 1.87rem; + font-weight: 700; +} + +.info-text { + text-align: left; + font-weight: 300; + font-size: 1rem; + letter-spacing: 0px; + color: #212121; +} + +.filter-btn { + position: fixed; + right: 0px; + z-index: 100; + width: 37px; +} + +.filter-btn button { + color: white; + background-color: #23bcba; + width: 37px; + height: 45px; +} + +.search-form { + // font-size: 12px; + text-align: left; + width: 20rem; +} + +.search-form mat-icon { + color: #129d99; +} + +.empty-list { + text-align: center; + font-weight: 300; + font-size: 1.25rem; + letter-spacing: 0px; + color: #212121; + opacity: 0.6; +} + +.pointer:hover { + color: #00b29f; +} + +::ng-deep .search-form .mat-form-field-wrapper { + background-color: white !important; + padding-bottom: 0 !important; +} + +::ng-deep .mat-form-field-appearance-outline .mat-form-field-infix { + padding: 0.3rem 0rem 0.6rem 0rem !important; +} ::ng-deep .mat-paginator-container { flex-direction: row-reverse !important; diff --git a/dmp-frontend/src/app/ui/dataset/listing/dataset-listing.component.ts b/dmp-frontend/src/app/ui/dataset/listing/dataset-listing.component.ts index 90d1550aa..61fb4a7ee 100644 --- a/dmp-frontend/src/app/ui/dataset/listing/dataset-listing.component.ts +++ b/dmp-frontend/src/app/ui/dataset/listing/dataset-listing.component.ts @@ -19,6 +19,9 @@ import { takeUntil } from 'rxjs/operators'; import { ExternalTagEditorModel } from '../dataset-wizard/dataset-wizard-editor.model'; import { AuthService } from '@app/core/services/auth/auth.service'; import { isNullOrUndefined } from 'util'; +import { DatasetCriteriaDialogComponent } from './criteria/dataset-criteria-dialogue/dataset-criteria-dialog.component'; +import { MatDialog } from '@angular/material'; +import { FormGroup, FormBuilder, FormControl } from '@angular/forms'; @Component({ selector: 'app-dataset-listing-component', @@ -29,7 +32,7 @@ export class DatasetListingComponent extends BaseComponent implements OnInit, IB @ViewChild(MatPaginator, { static: true }) _paginator: MatPaginator; @ViewChild(MatSort, { static: false }) sort: MatSort; - @ViewChild(DatasetCriteriaComponent, { static: true }) criteria: DatasetCriteriaComponent; + // @ViewChild(DatasetCriteriaComponent, { static: true }) criteria: DatasetCriteriaComponent; breadCrumbs: Observable; @@ -41,11 +44,21 @@ export class DatasetListingComponent extends BaseComponent implements OnInit, IB listingItems: DatasetListingModel[] = []; isPublic: boolean = false; + public isVisible = true + + startIndex: number = 0; + pageSize: number = 5; + criteria: DatasetCriteria; + criteriaFormGroup: FormGroup; + public formGroup = new FormBuilder().group({ + like: new FormControl() + }); constructor( private datasetService: DatasetService, private router: Router, private route: ActivatedRoute, + public dialog: MatDialog, private dmpService: DmpService, private language: TranslateService, private authService: AuthService @@ -69,9 +82,10 @@ export class DatasetListingComponent extends BaseComponent implements OnInit, IB if (this.dmpId != null) { this.dmpSearchEnabled = false; const dmp = await this.dmpService.getSingle(this.dmpId).toPromise(); - this.criteria.setCriteria(this.getDefaultCriteria(dmp)); + this.criteria = this.getDefaultCriteria(dmp); + // this.criteria.setCriteria(this.getDefaultCriteria(dmp)); this.refresh(); - this.criteria.setRefreshCallback((resetPages) => this.refresh(resetPages)); + // this.criteria.setRefreshCallback((resetPages) => this.refresh(resetPages)); this.breadCrumbs = observableOf([{ parentComponentName: 'DmpEditorComponent', label: dmp.label, @@ -81,9 +95,10 @@ export class DatasetListingComponent extends BaseComponent implements OnInit, IB this.titlePrefix = 'for ' + params['dmpLabel']; } } else { - this.criteria.setCriteria(this.getDefaultCriteria()); + this.criteria = this.getDefaultCriteria(); + // this.criteria.setCriteria(this.getDefaultCriteria()); this.refresh(); - this.criteria.setRefreshCallback((resetPages) => this.refresh(resetPages)); + // this.criteria.setRefreshCallback((resetPages) => this.refresh(resetPages)); this.breadCrumbs = observableOf([{ parentComponentName: null, label: this.language.instant('NAV-BAR.MY-DATASET-DESCRIPTIONS'), @@ -92,69 +107,63 @@ export class DatasetListingComponent extends BaseComponent implements OnInit, IB } if (this.status != null && this.status == DatasetStatus.Draft) { - this.criteria.setCriteria(this.getDraftCriteria()); - this.criteria.setRefreshCallback((resetPages) => this.refresh(resetPages)); + this.criteria = this.getDraftCriteria(); + // this.criteria.setRefreshCallback((resetPages) => this.refresh(resetPages)); this.refresh(); } }); + + this.formGroup.get('like').valueChanges + .pipe(takeUntil(this._destroyed)) + .subscribe(x => this.controlModified()); + } + + controlModified(): void { + // this.clearErrorModel(); + // if (this.refreshCallback != null && + // (this.formGroup.get('like').value == null || this.formGroup.get('like').value.length === 0 || this.formGroup.get('like').value.length > 2) + // ) { + // setTimeout(() => this.refreshCallback(true)); + // } + this.criteria.like = this.formGroup.get("like").value; + this.refresh(); } refresh(resetPages = false) { - if (this._paginator.pageSize === undefined) this._paginator.pageSize = 10; - if (resetPages) this._paginator.pageIndex = 0; - const startIndex = this._paginator.pageIndex * this._paginator.pageSize; + // if (this._paginator.pageSize === undefined) this._paginator.pageSize = 10; + // if (resetPages) this._paginator.pageIndex = 0; + // const startIndex = this._paginator.pageIndex * this._paginator.pageSize; let fields: Array = new Array(); fields.push('-modified'); //if (this.sort && this.sort.active) { fields = this.sort.direction === 'asc' ? ['+' + this.sort.active] : ['-' + this.sort.active]; } - const request = new DataTableRequest(startIndex, this._paginator.pageSize, { fields: fields }); - let value = this.criteria.formGroup.value; - request.criteria = { - like: value.like, - status: value.status, - allVersions: value.allVersions, - role: value.role - } - if (value.tags) { - request.criteria.tags = value.tags.map(x => (x)); - } - if (value.collaborators) { - request.criteria.collaborators = value.collaborators.map(x => x.id); - } - if (value.dmpIds) { - request.criteria.dmpIds = value.dmpIds.map(x => x.id); - } - if (value.groupIds) { - request.criteria.groupIds = value.groupIds.map(x => x.groupId); - } - if (value.grants) { - request.criteria.grants = value.grants.map(x => x.id); - } - if (value.organisations) { - request.criteria.organisations = value.organisations.map(x => x.id); - } - if (value.datasetTemplates) { - request.criteria.datasetTemplates = value.datasetTemplates.map(x => x.id) - } - if(value.grantStatus) { - request.criteria.grantStatus = value.grantStatus; - } - request.criteria.isPublic = this.isPublic; - // if (this.itemId) { - // // request.criteria.groupIds = [this.itemId]; - // request.criteria.allVersions = true; - // } + const request = new DataTableRequest(this.startIndex, this.pageSize, { fields: fields }); + request.criteria = this.criteria; + this.datasetService.getPaged(request).pipe(takeUntil(this._destroyed)).subscribe(result => { if (!result) { return []; } - if (this._paginator.pageIndex === 0) { this.totalCount = result.totalCount; } + // if (this._paginator.pageIndex === 0) { this.totalCount = result.totalCount; } + this.totalCount = result.totalCount; this.listingItems = result.data; }); } + public loadMore() { + this.startIndex = this.startIndex + this.pageSize; + const fields: Array = ["-modified"]; + const request = new DataTableRequest(this.startIndex, this.pageSize, { fields: fields }); + request.criteria = this.criteria; + + this.datasetService.getPaged(request).pipe(takeUntil(this._destroyed)).subscribe(result => { + if (!result) { return []; } + // if (this._paginator.pageIndex === 0) { this.totalCount = result.totalCount; } + this.listingItems = this.listingItems.concat(result.data); + }); + } + pageThisEvent(event) { this.refresh(); } - getDefaultCriteria(dmp: any = null): DatasetCriteria { const defaultCriteria = new DatasetCriteria(); if (dmp != null) { @@ -175,6 +184,79 @@ export class DatasetListingComponent extends BaseComponent implements OnInit, IB .subscribe(); } + openFiltersDialog(): void { + const dialogRef = this.dialog.open(DatasetCriteriaDialogComponent, { + width: '456px', + height: '100%', + restoreFocus: false, + data: { + isPublic: this.isPublic, + status: this.status, + criteria: this.criteria, + formGroup: this.criteriaFormGroup, + // criteria: this.grantId ? this.criteria : this.getDefaultCriteria(), + updateDataFn: this.updateDataFn.bind(this) + }, + position: { right: '0px;' } + }); + + dialogRef.afterClosed().subscribe(result => { + }); + } + + updateDataFn(criteria: DatasetCriteriaComponent): void { + this.criteriaFormGroup = criteria.formGroup; + this.toDatasetCriteria(criteria); + this.refresh(); + } + + toDatasetCriteria(criteria: DatasetCriteriaComponent) { + let formGroup = criteria.formGroup; + this.criteria = { + like: formGroup.get("like").value, + status: formGroup.get("status").value, + allVersions: formGroup.get("allVersions").value, + role: formGroup.get("role").value + } + if (formGroup.get("tags") && formGroup.get("tags").value) { + this.criteria.tags = formGroup.get("tags").value.map(x => (x)); + } + if (formGroup.get("collaborators") && formGroup.get("collaborators").value) { + this.criteria.collaborators = formGroup.get("collaborators").value.map(x => x.id); + } + if (formGroup.get("dmpIds") && formGroup.get("dmpIds").value) { + this.criteria.dmpIds = formGroup.get("dmpIds").value.map(x => x.id); + } + if (formGroup.get("groupIds") && formGroup.get("groupIds").value) { + this.criteria.groupIds = formGroup.get("groupIds").value.map(x => x.groupId); + } + if (formGroup.get("grants") && formGroup.get("grants").value) { + this.criteria.grants = formGroup.get("grants").value.map(x => x.id); + } + if (formGroup.get("organisations") && formGroup.get("organisations").value) { + this.criteria.organisations = formGroup.get("organisations").value.map(x => x.id); + } + if (formGroup.get("datasetTemplates") && formGroup.get("datasetTemplates").value) { + this.criteria.datasetTemplates = formGroup.get("datasetTemplates").value.map(x => x.id) + } + if (formGroup.get("grantStatus") && formGroup.get("grantStatus").value) { + this.criteria.grantStatus = formGroup.get("grantStatus").value; + } + this.criteria.isPublic = this.isPublic; + // if (this.itemId) { + // // this.criteria.groupIds = [this.itemId]; + // this.criteria.allVersions = true; + // } + } + + public closeCard(): void { + this.isVisible = false; + } + + hasScrollbar(): boolean { + return document.getElementById("main-page").scrollHeight > document.documentElement.clientHeight + } + // rowClicked(dataset: DatasetListingModel) { // this.router.navigate(['/datasets/edit/' + dataset.id]); // } diff --git a/dmp-frontend/src/app/ui/dataset/listing/listing-item/dataset-listing-item.component.html b/dmp-frontend/src/app/ui/dataset/listing/listing-item/dataset-listing-item.component.html index 6837ff834..b6616610c 100644 --- a/dmp-frontend/src/app/ui/dataset/listing/listing-item/dataset-listing-item.component.html +++ b/dmp-frontend/src/app/ui/dataset/listing/listing-item/dataset-listing-item.component.html @@ -1,14 +1,75 @@ - + -
+ diff --git a/dmp-frontend/src/app/ui/dataset/listing/listing-item/dataset-listing-item.component.scss b/dmp-frontend/src/app/ui/dataset/listing/listing-item/dataset-listing-item.component.scss index 72e315e7e..5b9fc777e 100644 --- a/dmp-frontend/src/app/ui/dataset/listing/listing-item/dataset-listing-item.component.scss +++ b/dmp-frontend/src/app/ui/dataset/listing/listing-item/dataset-listing-item.component.scss @@ -76,3 +76,174 @@ p { .finalized-bookmark { color: #08bd63; } + +.dmp-card, +.dataset-card { + min-width: 712px; + /* min-height: 308px; */ + background: #ffffff 0% 0% no-repeat padding-box; + box-shadow: 0px 3px 6px #0000001a; + border-radius: 4px; + opacity: 1; + margin-top: 2.43rem; + margin-bottom: 1rem; +} + +.remove-border-bottom ::ng-deep .mat-tab-header { + border-bottom: none; +} + +input[type="text"] { + background: #fafafa 0% 0% no-repeat padding-box; + border: 1px solid #d1d1d1; + border-radius: 4px; + opacity: 1; + width: 347px; + height: 56px; + font-family: Arial, FontAwesome; + padding-left: 15px; +} + +.edited-date { + text-align: left; + font-weight: 300; + font-family: "Roboto", sans-serif; + line-height: 2.4; + letter-spacing: 0px; + color: #212121; + opacity: 0.6; +} + +.dmp-label { + background: #129d99 0% 0% no-repeat padding-box; + border-radius: 4px 0px; + opacity: 1; + width: 67px; + height: 37px; + color: #ffffff; + line-height: 2.4; + opacity: 0.75; +} + +.dataset-label { + width: 158px; + height: 37px; + background: #f7dd72 0% 0% no-repeat padding-box; + border-radius: 4px 0px; + text-align: left; + line-height: 2.8; + font-size: 0.875rem; + font-weight: 400; + letter-spacing: 0px; + color: #212121; + opacity: 0.75; +} + +.dmp-title, +.dataset-title { + text-align: left; + font-weight: 500; + font-family: "Roboto", sans-serif; + font-size: 1rem; + opacity: 0.81; + padding-top: 0.75rem; + padding-bottom: 0.55rem; + color: #212121; +} + +.dataset-subtitle, +.dmp-subtitle { + display: flex; + flex-direction: row; + text-align: left; + font-weight: 400; + font-family: "Roboto", sans-serif; + font-size: 0.875rem; + opacity: 1; + align-items: center; + color: #848484; +} + +.dmp-title-draft { + text-align: left; + font-weight: 500; + font-family: "Roboto", sans-serif; + font-size: 1rem; + opacity: 0.81; + padding-top: 0.75rem; + padding-bottom: 0.55rem; + color: #f16868; +} + +.icon-align { + display: inline-flex; + vertical-align: middle; + padding-bottom: 0.4rem; +} + +.dataset-card-actions, +.dmp-card-actions { + display: flex; + flex-direction: row; + border-top: 1px solid #dbdbdb; + line-height: 4; + color: #848484; +} + +.dataset-card-actions a, +.dmp-card-actions a { + color: #848484 !important; + text-decoration: none !important; +} + +.dataset-card-actions a:hover, +.dmp-card-actions a:hover { + color: #129d99 !important; +} + +.dmp-dataset-descriptions-title { + color: #000000; + opacity: 0.6; + padding-top: 1.5rem; + padding-bottom: 0.8rem; +} + +.dmp-dataset-descriptions-name { + color: #000000; + opacity: 0.6; + font-weight: 700; +} + +.show-more { + color: black !important; +} + +.show-more:hover { + color: #129d99 !important; +} + +.btn-load-more { + border: 2px solid #212121; + border-radius: 30px; + opacity: 1; + width: 132px; + height: 40px; + margin-top: 4.125rem; +} + +.btn-load-more:hover { + background-color: black; + color: white; +} + +.draft { + color: #f16868; +} + +.pointer { + cursor: pointer; +} + +::ng-deep .mat-menu-panel { + max-width: 282px !important; +} diff --git a/dmp-frontend/src/app/ui/dataset/listing/listing-item/dataset-listing-item.component.ts b/dmp-frontend/src/app/ui/dataset/listing/listing-item/dataset-listing-item.component.ts index 9d8f8325e..edbfa95dd 100644 --- a/dmp-frontend/src/app/ui/dataset/listing/listing-item/dataset-listing-item.component.ts +++ b/dmp-frontend/src/app/ui/dataset/listing/listing-item/dataset-listing-item.component.ts @@ -2,13 +2,28 @@ import { Component, OnInit, Input, Output, EventEmitter } from '@angular/core'; import { DatasetListingModel } from '../../../../core/model/dataset/dataset-listing'; import { Router } from '@angular/router'; import { DatasetStatus } from '../../../../core/common/enum/dataset-status'; +import { EnumUtils } from '@app/core/services/utilities/enum-utils.service'; +import { DatasetWizardService } from '@app/core/services/dataset-wizard/dataset-wizard.service'; +import { BaseComponent } from '@common/base/base.component'; +import { takeUntil } from 'rxjs/operators'; +import * as FileSaver from 'file-saver'; +import { DmpInvitationDialogComponent } from '@app/ui/dmp/invitation/dmp-invitation.component'; +import { MatDialog } from '@angular/material'; +import { DatasetCopyDialogueComponent } from '../../dataset-wizard/dataset-copy-dialogue/dataset-copy-dialogue.component'; +import { FormControl } from '@angular/forms'; +import { TranslateService } from '@ngx-translate/core'; +import { ConfirmationDialogComponent } from '@common/modules/confirmation-dialog/confirmation-dialog.component'; +import { UiNotificationService, SnackBarNotificationLevel } from '@app/core/services/notification/ui-notification-service'; +import { ValidationErrorModel } from '@common/forms/validation/error-model/validation-error-model'; +import { Principal } from '@app/core/model/auth/principal'; +import { AuthService } from '@app/core/services/auth/auth.service'; @Component({ selector: 'app-dataset-listing-item-component', templateUrl: './dataset-listing-item.component.html', styleUrls: ['./dataset-listing-item.component.scss'] }) -export class DatasetListingItemComponent implements OnInit { +export class DatasetListingItemComponent extends BaseComponent implements OnInit { @Input() dataset: DatasetListingModel; @Input() showDivider: boolean = true; @@ -18,19 +33,29 @@ export class DatasetListingItemComponent implements OnInit { isDraft: boolean; isDeleted: boolean; - constructor(private router: Router) { } + constructor( + private router: Router, + public enumUtils: EnumUtils, + private datasetWizardService: DatasetWizardService, + public dialog: MatDialog, + private language: TranslateService, + private authentication: AuthService, + private uiNotificationService: UiNotificationService + ) { + super(); + } ngOnInit() { if (this.dataset.status === DatasetStatus.Draft) { this.isDraft = true; this.isDeleted = false; - } else if (this.dataset.status === DatasetStatus.Deleted) { - this.isDeleted = true; - } + } else if (this.dataset.status === DatasetStatus.Deleted) { + this.isDeleted = true; + } else { this.isDraft = false; this.isDeleted = false; - } + } } getItemLink(): string[] { @@ -41,6 +66,152 @@ export class DatasetListingItemComponent implements OnInit { return this.isPublic ? [`/explore-plans/publicOverview/${this.dataset.dmpId}`] : [`/plans/edit/${this.dataset.dmpId}`]; } + downloadPDF(dataset: DatasetListingModel): void { + this.datasetWizardService.downloadPDF(dataset.id as string) + .pipe(takeUntil(this._destroyed)) + .subscribe(response => { + const blob = new Blob([response.body], { type: 'application/pdf' }); + const filename = this.getFilenameFromContentDispositionHeader(response.headers.get('Content-Disposition')); + + FileSaver.saveAs(blob, filename); + }); + } + + downloadDOCX(dataset: DatasetListingModel): void { + this.datasetWizardService.downloadDOCX(dataset.id as string) + .pipe(takeUntil(this._destroyed)) + .subscribe(response => { + const blob = new Blob([response.body], { type: 'application/msword' }); + const filename = this.getFilenameFromContentDispositionHeader(response.headers.get('Content-Disposition')); + + FileSaver.saveAs(blob, filename); + }); + + } + + downloadXML(dataset: DatasetListingModel): void { + this.datasetWizardService.downloadXML(dataset.id as string) + .pipe(takeUntil(this._destroyed)) + .subscribe(response => { + const blob = new Blob([response.body], { type: 'application/xml' }); + const filename = this.getFilenameFromContentDispositionHeader(response.headers.get('Content-Disposition')); + + FileSaver.saveAs(blob, filename); + }); + } + + getFilenameFromContentDispositionHeader(header: string): string { + const regex: RegExp = new RegExp(/filename[^;=\n]*=((['"]).*?\2|[^;\n]*)/g); + + const matches = header.match(regex); + let filename: string; + for (let i = 0; i < matches.length; i++) { + const match = matches[i]; + if (match.includes('filename="')) { + filename = match.substring(10, match.length - 1); + break; + } else if (match.includes('filename=')) { + filename = match.substring(9); + break; + } + } + return filename; + } + + openShareDialog(dmpRowId: any, dmpRowName: any, activity: any) { + const dialogRef = this.dialog.open(DmpInvitationDialogComponent, { + // height: '250px', + // width: '700px', + restoreFocus: false, + data: { + dmpId: dmpRowId, + dmpName: dmpRowName + } + }); + } + + openDmpSearchDialogue(dataset: DatasetListingModel) { + const formControl = new FormControl(); + const dialogRef = this.dialog.open(DatasetCopyDialogueComponent, { + width: '500px', + restoreFocus: false, + data: { + formControl: formControl, + datasetId: dataset.id, + datasetProfileId: dataset.profile, + datasetProfileExist: false, + confirmButton: this.language.instant('DATASET-WIZARD.DIALOGUE.COPY'), + cancelButton: this.language.instant('DATASET-WIZARD.DIALOGUE.CANCEL') + } + }); + + dialogRef.afterClosed().pipe(takeUntil(this._destroyed)) + .subscribe(result => { + if (result && result.datasetProfileExist) { + const newDmpId = result.formControl.value.id + this.router.navigate(['/datasets/copy/' + result.datasetId], { queryParams: { newDmpId: newDmpId } }); + } + }); + } + + openConfirm(id: string): void { + const dialogRef = this.dialog.open(ConfirmationDialogComponent, { + maxWidth: '300px', + restoreFocus: false, + data: { + message: this.language.instant('GENERAL.CONFIRMATION-DIALOG.DELETE-ITEM'), + confirmButton: this.language.instant('GENERAL.CONFIRMATION-DIALOG.ACTIONS.DELETE'), + cancelButton: this.language.instant('GENERAL.CONFIRMATION-DIALOG.ACTIONS.CANCEL'), + isDeleteConfirmation: true + } + }); + dialogRef.afterClosed().pipe(takeUntil(this._destroyed)).subscribe(result => { + if (result) { + this.datasetWizardService.delete(id) + .pipe(takeUntil(this._destroyed)) + .subscribe( + complete => this.onCallbackSuccess(), + // error => this.onCallbackError(error) + ); + } + }); + } + + onCallbackSuccess(id?: String): void { + this.uiNotificationService.snackBarNotification(this.language.instant('GENERAL.SNACK-BAR.SUCCESSFUL-UPDATE'), SnackBarNotificationLevel.Success); + id ? this.router.navigate(['/reload']).then(() => { this.router.navigate(['/datasets', 'edit', id]); }) : this.router.navigate(['/datasets']); + } + + roleDisplay(value: any) { + const principal: Principal = this.authentication.current(); + let role: number; + if (principal) { + value.forEach(element => { + if (principal.id === element.id) { + role = element.role; + } + }); + } + if (role === 0) { + return this.language.instant('DMP-LISTING.OWNER'); + } + else if (role === 1) { + return this.language.instant('DMP-LISTING.MEMBER'); + } + else { + return this.language.instant('DMP-LISTING.OWNER'); + } + } + + // onCallbackError(error: any) { + // this.setErrorModel(error.error); + // } + + // public setErrorModel(validationErrorModel: ValidationErrorModel) { + // Object.keys(validationErrorModel).forEach(item => { + // (this.dataset.validationErrorModel)[item] = (validationErrorModel)[item]; + // }); + // } // grantClicked(dataset: DatasetListingModel) { // this.router.navigate(['/grants/edit/' + dataset.grantId]); diff --git a/dmp-frontend/src/app/ui/dmp/listing/criteria/dmp-criteria.component.html b/dmp-frontend/src/app/ui/dmp/listing/criteria/dmp-criteria.component.html index 9fbde9a29..c73aac723 100644 --- a/dmp-frontend/src/app/ui/dmp/listing/criteria/dmp-criteria.component.html +++ b/dmp-frontend/src/app/ui/dmp/listing/criteria/dmp-criteria.component.html @@ -29,7 +29,7 @@
{{ 'FACET-SEARCH.GRANT-STATUS.TITLE' | translate }}
- {{ 'FACET-SEARCH.GRANT-STATUS.OPTIONS.ANY' | translate }} + {{ 'FACET-SEARCH.GRANT-STATUS.OPTIONS.ANY' | translate }} {{ 'FACET-SEARCH.GRANT-STATUS.OPTIONS.ACTIVE' | translate }} diff --git a/dmp-frontend/src/app/ui/dmp/listing/dmp-listing.component.html b/dmp-frontend/src/app/ui/dmp/listing/dmp-listing.component.html index 9a4aaf680..a57e09e98 100644 --- a/dmp-frontend/src/app/ui/dmp/listing/dmp-listing.component.html +++ b/dmp-frontend/src/app/ui/dmp/listing/dmp-listing.component.html @@ -8,14 +8,16 @@

{{'DMP-LISTING.TEXT-INFO-QUESTION' | translate}} {{'DMP-LISTING.LINK-ZENODO' | translate}} {{'DMP-LISTING.GET-IDEA' | translate}}

-
+ +
- + search {{formGroup.get('like').getError('backendError').message}} @@ -29,6 +31,9 @@
+
+ {{'DMP-LISTING.EMPTY-LIST' | translate}} +
diff --git a/dmp-frontend/src/app/ui/dmp/listing/dmp-listing.component.scss b/dmp-frontend/src/app/ui/dmp/listing/dmp-listing.component.scss index 09bb2e64f..fbebe8c46 100644 --- a/dmp-frontend/src/app/ui/dmp/listing/dmp-listing.component.scss +++ b/dmp-frontend/src/app/ui/dmp/listing/dmp-listing.component.scss @@ -129,7 +129,7 @@ .card-content { text-align: left; - font: Light 16px/26px Roboto; + font-weight: 300; letter-spacing: 0px; color: #212121; padding-left: 40px; @@ -202,16 +202,33 @@ .search-form { // font-size: 12px; text-align: left; - width: 17.5rem; + width: 20rem; } .search-form mat-icon { color: #129d99; } +.empty-list { + text-align: center; + font-weight: 300; + font-size: 1.25rem; + letter-spacing: 0px; + color: #212121; + opacity: 0.6; +} + +.pointer:hover { + color: #00b29f; +} + ::ng-deep .search-form .mat-form-field-wrapper { - background-color: white !important; - padding-bottom: 0 !important; + background-color: white !important; + padding-bottom: 0 !important; +} + +::ng-deep .mat-form-field-appearance-outline .mat-form-field-infix { + padding: 0.3rem 0rem 0.6rem 0rem !important; } // .bot-paginator { diff --git a/dmp-frontend/src/app/ui/dmp/listing/dmp-listing.component.ts b/dmp-frontend/src/app/ui/dmp/listing/dmp-listing.component.ts index d9c351631..e4203d2e6 100644 --- a/dmp-frontend/src/app/ui/dmp/listing/dmp-listing.component.ts +++ b/dmp-frontend/src/app/ui/dmp/listing/dmp-listing.component.ts @@ -57,7 +57,7 @@ export class DmpListingComponent extends BaseComponent implements OnInit, IBread criteriaFormGroup: FormGroup; public formGroup = new FormBuilder().group({ like: new FormControl() - }) + }); constructor( private dmpService: DmpService, diff --git a/dmp-frontend/src/app/ui/dmp/listing/listing-item/dmp-listing-item.component.ts b/dmp-frontend/src/app/ui/dmp/listing/listing-item/dmp-listing-item.component.ts index 51d44dfe9..3862fd325 100644 --- a/dmp-frontend/src/app/ui/dmp/listing/listing-item/dmp-listing-item.component.ts +++ b/dmp-frontend/src/app/ui/dmp/listing/listing-item/dmp-listing-item.component.ts @@ -40,7 +40,6 @@ export class DmpListingItemComponent extends BaseComponent implements OnInit { public enumUtils: EnumUtils, private dmpService: DmpService, private language: TranslateService, - private translate: TranslateService, private uiNotificationService: UiNotificationService) { super(); } @@ -110,13 +109,13 @@ export class DmpListingItemComponent extends BaseComponent implements OnInit { }); } if (role === 0) { - return this.translate.instant('DMP-LISTING.OWNER'); + return this.language.instant('DMP-LISTING.OWNER'); } else if (role === 1) { - return this.translate.instant('DMP-LISTING.MEMBER'); + return this.language.instant('DMP-LISTING.MEMBER'); } else { - return this.translate.instant('DMP-LISTING.OWNER'); + return this.language.instant('DMP-LISTING.OWNER'); } } diff --git a/dmp-frontend/src/app/ui/explore-dmp/dmp-explore-filters/explore-dmp-filters.component.ts b/dmp-frontend/src/app/ui/explore-dmp/dmp-explore-filters/explore-dmp-filters.component.ts index 99917f0e4..bb877cde9 100644 --- a/dmp-frontend/src/app/ui/explore-dmp/dmp-explore-filters/explore-dmp-filters.component.ts +++ b/dmp-frontend/src/app/ui/explore-dmp/dmp-explore-filters/explore-dmp-filters.component.ts @@ -130,11 +130,11 @@ export class ExploreDmpFiltersComponent extends BaseCriteriaComponent implements } OnChange($event) { - console.log($event); + // console.log($event); } OnIndeterminateChange($event) { - console.log($event); + // console.log($event); } controlModified() { diff --git a/dmp-frontend/src/assets/i18n/en.json b/dmp-frontend/src/assets/i18n/en.json index ec53721ec..40e99446d 100644 --- a/dmp-frontend/src/assets/i18n/en.json +++ b/dmp-frontend/src/assets/i18n/en.json @@ -454,7 +454,8 @@ "INVOLVED-DATASETS": "Involved Dataset Descriptions", "TEMPLATES-INVOLVED": "Dataset Description Templates Involved" }, - "VIEW-ALL-VERSIONS": "All versions of" + "VIEW-ALL-VERSIONS": "All versions of", + "EMPTY-LIST": "Nothing here yet." }, "DMP-PUBLIC-LISTING": { "TITLE": "Published Data Management Plans", @@ -466,7 +467,8 @@ "PUBLISHED": "Public access - Closed DMP", "INVOLVED-DATASETS": "Involved Dataset Descriptions", "TEMPLATES-INVOLVED": "Dataset Description Templates Involved" - } + }, + "EMPTY-LIST": "Nothing here yet." }, "DMP-UPLOAD": { "TITLE": "Import Data Management Plan", @@ -580,6 +582,10 @@ "DATASET-DESCRIPTION": "Dataset Description", "SELECT-DATASETS-TO-CLONE": "Select which datasets to include in the new DMP. Selected datasets will be editable.", "SELECT-DATASETS-NONE": "Not available Dataset Descriptions for this DMP.", + "TEXT-INFO": "Datasets are documented following pre-defined templates which set the content of dataset descriptions. In Argos, a DMP can contain as many dataset descriptions as the datasets it documents. Browse ", + "TEXT-INFO-REST": " for a look at datasets described in Argos DMPs", + "LINK-PUBLIC-DATASETS": "Public Dataset Descriptions", + "TEXT-INFO-PAR": "New datasets can be added to existing DMPs at any time and be described with more than one template. Dataset descriptions can also be cloned and re-used in other DMPs as well as be deleted without negatively affecting the DMP as a whole.", "COLUMNS": { "NAME": "Name", "REFERNCE": "Reference", @@ -622,7 +628,8 @@ "VERSION": "DMP Version", "PART-OF": "Part of", "DMP-FOR": "DMP for" - } + }, + "EMPTY-LIST": "Nothing here yet." }, "DATASET-PUBLIC-LISTING": { "TITLE": "Published Dataset Descriptions", @@ -631,7 +638,8 @@ "DMP": "DMP", "GRANT": "Grant", "TEMPLATES-INVOLVED": "Dataset Description Template" - } + }, + "EMPTY-LIST": "Nothing here yet." }, "DATASET-PROFILE-LISTING": { "TITLE": "Dataset Description Templates", diff --git a/dmp-frontend/src/assets/i18n/es.json b/dmp-frontend/src/assets/i18n/es.json index d35ec3b29..d74d93fcb 100644 --- a/dmp-frontend/src/assets/i18n/es.json +++ b/dmp-frontend/src/assets/i18n/es.json @@ -452,7 +452,8 @@ "INVOLVED-DATASETS": "Descripciones del Dataset implicadas", "TEMPLATES-INVOLVED": "Plantillas de descripción del Dataset implicadas" }, - "VIEW-ALL-VERSIONS": "Todas las versiones de" + "VIEW-ALL-VERSIONS": "Todas las versiones de", + "EMPTY-LIST": "Nothing here yet." }, "DMP-PUBLIC-LISTING": { "TITLE": "Plan de Gestión de Datos publicado", @@ -464,7 +465,8 @@ "PUBLISHED": "Acceso público - PGD cerrado", "INVOLVED-DATASETS": "Descripciones del Dataset implicadas", "TEMPLATES-INVOLVED": "Plantillas del Dataset implicadas" - } + }, + "EMPTY-LIST": "Nothing here yet." }, "DMP-UPLOAD": { "TITLE": "Importar Plan de Gestión de Datos", @@ -578,6 +580,10 @@ "DATASET-DESCRIPTION": "Descripción del Dataset", "SELECT-DATASETS-TO-CLONE": "Seleccione qué datasets incluye en el nuevo PDG. Los datasets será editables.", "SELECT-DATASETS-NONE": "Las descripciones del Dataset no está disponibles para este PGD.", + "TEXT-INFO": "Datasets are documented following pre-defined templates which set the content of dataset descriptions. In Argos, a DMP can contain as many dataset descriptions as the datasets it documents. Browse ", + "TEXT-INFO-REST": " for a look at datasets described in Argos DMPs", + "LINK-PUBLIC-DATASETS": "Public Dataset Descriptions", + "TEXT-INFO-PAR": "New datasets can be added to existing DMPs at any time and be described with more than one template. Dataset descriptions can also be cloned and re-used in other DMPs as well as be deleted without negatively affecting the DMP as a whole.", "COLUMNS": { "NAME": "Nombre", "REFERNCE": "Referencia", @@ -618,7 +624,8 @@ "GRANT": "Subvención", "TEMPLATES-INVOLVED": "Dataset Description Template", "VERSION": "PGD Versión" - } + }, + "EMPTY-LIST": "Nothing here yet." }, "DATASET-PUBLIC-LISTING": { "TITLE": "Descripción del Dataset publicada", @@ -627,7 +634,8 @@ "DMP": "PGD", "GRANT": "Subvención", "TEMPLATES-INVOLVED": "Plantilla de descripción del Dataset" - } + }, + "EMPTY-LIST": "Nothing here yet." }, "DATASET-PROFILE-LISTING": { "TITLE": "Plantillas de descripción del Dataset", diff --git a/dmp-frontend/src/assets/i18n/gr.json b/dmp-frontend/src/assets/i18n/gr.json index 40d99556e..1184deffa 100644 --- a/dmp-frontend/src/assets/i18n/gr.json +++ b/dmp-frontend/src/assets/i18n/gr.json @@ -453,7 +453,8 @@ "INVOLVED-DATASETS": "Εμπλεκόμενες Περιγραφές Συνόλων Δεδομένων", "TEMPLATES-INVOLVED": "Εμπλεκόμενα Templates Περιγραφών Συνόλων Δεδομένων" }, - "VIEW-ALL-VERSIONS": "Όλες οι εκδόσεις" + "VIEW-ALL-VERSIONS": "Όλες οι εκδόσεις", + "EMPTY-LIST": "Nothing here yet." }, "DMP-PUBLIC-LISTING": { "TITLE": "Δημοσιευμένα Σχέδια Διαχείρισης Δεδομένων", @@ -465,7 +466,8 @@ "PUBLISHED": "Δημόσια Πρόσβαση - Κλειστό Σχέδιο Διαχείρισης Δεδομένων", "INVOLVED-DATASETS": "Εμπλεκόμενες Περιγραφές Συνόλων Δεδομένων", "TEMPLATES-INVOLVED": "Εμπλεκόμενα Templates Περιγραφών Συνόλων Δεδομένων" - } + }, + "EMPTY-LIST": "Nothing here yet." }, "DMP-UPLOAD": { "TITLE": "Εισαγωγή Σχεδίου Διαχείρισης Δεδομένων", @@ -579,6 +581,10 @@ "DATASET-DESCRIPTION": "Περιγραφή Δεδομένων", "SELECT-DATASETS-TO-CLONE": "Επιλογή των συνόλων δεδομένων που θα συμπεριληφθούν στο νέο Σχέδιο Διαχείρισης Δεδομένων. Τα επιλεγμένα σύνολα δεδομένα θα είναι επεξεργάσιμα.", "SELECT-DATASETS-NONE": "Μη διαθέσιμες Περιγραφές Συνόλου Δεδομένων για αυτό το Σχέδιο Διαχείρισης Δεδομένων", + "TEXT-INFO": "Datasets are documented following pre-defined templates which set the content of dataset descriptions. In Argos, a DMP can contain as many dataset descriptions as the datasets it documents. Browse ", + "TEXT-INFO-REST": " for a look at datasets described in Argos DMPs", + "LINK-PUBLIC-DATASETS": "Public Dataset Descriptions", + "TEXT-INFO-PAR": "New datasets can be added to existing DMPs at any time and be described with more than one template. Dataset descriptions can also be cloned and re-used in other DMPs as well as be deleted without negatively affecting the DMP as a whole.", "COLUMNS": { "NAME": "Τίτλος", "REFERNCE": "Αναφορά", @@ -619,7 +625,8 @@ "GRANT": "Επιχορήγηση", "TEMPLATES-INVOLVED": "Template Περιγραφής Συνόλου Δεδομένων", "VERSION": "Έκδοση Σχεδίου Διαχείρισης Δεδομένων" - } + }, + "EMPTY-LIST": "Nothing here yet." }, "DATASET-PUBLIC-LISTING": { "TITLE": "Δημοσιευμένες Περιγραφές Συνόλων Δεδομένων", @@ -628,7 +635,8 @@ "DMP": "Σχέδιο Διαχείρισης Δεδομένων", "GRANT": "Επιχορήγηση", "TEMPLATES-INVOLVED": "Template Περιγραφής Συνόλου Δεδομένων" - } + }, + "EMPTY-LIST": "Nothing here yet." }, "DATASET-PROFILE-LISTING": { "TITLE": "Templates Περιγραφής Συνόλου Δεδομένων", From 3ba34e1e6988caefe14fbc0755bc7b6356970f65 Mon Sep 17 00:00:00 2001 From: George Kalampokis Date: Wed, 8 Jul 2020 18:23:06 +0300 Subject: [PATCH 061/364] Fixed issue when viewing the public DMPs --- .../src/app/ui/dmp/listing/dmp-listing.component.ts | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/dmp-frontend/src/app/ui/dmp/listing/dmp-listing.component.ts b/dmp-frontend/src/app/ui/dmp/listing/dmp-listing.component.ts index d9c351631..d0012c2a4 100644 --- a/dmp-frontend/src/app/ui/dmp/listing/dmp-listing.component.ts +++ b/dmp-frontend/src/app/ui/dmp/listing/dmp-listing.component.ts @@ -23,8 +23,8 @@ import { DmpUploadDialogue } from './upload-dialogue/dmp-upload-dialogue.compone import { UiNotificationService, SnackBarNotificationLevel } from '@app/core/services/notification/ui-notification-service'; import { isNullOrUndefined } from 'util'; import { AuthService } from '@app/core/services/auth/auth.service'; -import { DmpCriteriaDialogComponent } from './criteria/dmp-criteria-dialog.component'; import { FormBuilder, FormControl, FormGroup } from '@angular/forms'; +import { DmpCriteriaDialogComponent } from './criteria/dmp-criteria-dialog.component'; @Component({ @@ -248,6 +248,10 @@ export class DmpListingComponent extends BaseComponent implements OnInit, IBread getDefaultCriteria(): DmpCriteria { const defaultCriteria = new DmpCriteria(); + if (this.isPublic) { + defaultCriteria.isPublic = true; + defaultCriteria.onlyPublic = true; + } return defaultCriteria; } From e428e8a5df548a43dca7bc95cb004776a45a6250 Mon Sep 17 00:00:00 2001 From: George Kalampokis Date: Wed, 8 Jul 2020 18:26:07 +0300 Subject: [PATCH 062/364] When creating new DMPs pre-set the visibility (restricted) and the contact (creator). They can be changed later in the draft phase. --- .../eu/eudat/models/data/quickwizard/DmpQuickWizardModel.java | 2 ++ dmp-frontend/src/app/ui/dmp/editor/dmp-editor.component.ts | 2 ++ 2 files changed, 4 insertions(+) diff --git a/dmp-backend/web/src/main/java/eu/eudat/models/data/quickwizard/DmpQuickWizardModel.java b/dmp-backend/web/src/main/java/eu/eudat/models/data/quickwizard/DmpQuickWizardModel.java index 93aa43722..d67f9724b 100644 --- a/dmp-backend/web/src/main/java/eu/eudat/models/data/quickwizard/DmpQuickWizardModel.java +++ b/dmp-backend/web/src/main/java/eu/eudat/models/data/quickwizard/DmpQuickWizardModel.java @@ -101,6 +101,8 @@ public class DmpQuickWizardModel { dataManagementPlanEntity.setAssociatedUsers(user); dataManagementPlanEntity.setExtraProperties(new HashMap<>()); dataManagementPlanEntity.getExtraProperties().put("language", this.language); + dataManagementPlanEntity.getExtraProperties().put("visible", false); + dataManagementPlanEntity.getExtraProperties().put("contact", principal.getId().toString()); return dataManagementPlanEntity; } diff --git a/dmp-frontend/src/app/ui/dmp/editor/dmp-editor.component.ts b/dmp-frontend/src/app/ui/dmp/editor/dmp-editor.component.ts index 25f661180..74de57de3 100644 --- a/dmp-frontend/src/app/ui/dmp/editor/dmp-editor.component.ts +++ b/dmp-frontend/src/app/ui/dmp/editor/dmp-editor.component.ts @@ -228,6 +228,8 @@ export class DmpEditorComponent extends BaseComponent implements OnInit, IBreadC this.dmp.project = new ProjectFormModel(); this.dmp.funder = new FunderFormModel(); this.dmp.extraProperties = new ExtraPropertiesFormModel(); + this.dmp.extraProperties.visible = false; + this.dmp.extraProperties.contact = this.authService.current().id; this.formGroup = this.dmp.buildForm(); this.registerFormEventsForNewItem(); if (this.isAuthenticated) { From ff532c56fb34ce2b540ccb2577a2f5fceeb6129f Mon Sep 17 00:00:00 2001 From: apapachristou Date: Wed, 8 Jul 2020 18:28:34 +0300 Subject: [PATCH 063/364] Fixes bug on public dmp / datasets listing --- .../listing/dataset-listing.component.ts | 2 ++ .../ui/dmp/listing/dmp-listing.component.ts | 27 ++++++++++++------- 2 files changed, 19 insertions(+), 10 deletions(-) diff --git a/dmp-frontend/src/app/ui/dataset/listing/dataset-listing.component.ts b/dmp-frontend/src/app/ui/dataset/listing/dataset-listing.component.ts index 61fb4a7ee..a3a62cbf3 100644 --- a/dmp-frontend/src/app/ui/dataset/listing/dataset-listing.component.ts +++ b/dmp-frontend/src/app/ui/dataset/listing/dataset-listing.component.ts @@ -137,6 +137,7 @@ export class DatasetListingComponent extends BaseComponent implements OnInit, IB fields.push('-modified'); //if (this.sort && this.sort.active) { fields = this.sort.direction === 'asc' ? ['+' + this.sort.active] : ['-' + this.sort.active]; } const request = new DataTableRequest(this.startIndex, this.pageSize, { fields: fields }); + this.criteria.isPublic = this.isPublic; request.criteria = this.criteria; this.datasetService.getPaged(request).pipe(takeUntil(this._destroyed)).subscribe(result => { @@ -151,6 +152,7 @@ export class DatasetListingComponent extends BaseComponent implements OnInit, IB this.startIndex = this.startIndex + this.pageSize; const fields: Array = ["-modified"]; const request = new DataTableRequest(this.startIndex, this.pageSize, { fields: fields }); + this.criteria.isPublic = this.isPublic; request.criteria = this.criteria; this.datasetService.getPaged(request).pipe(takeUntil(this._destroyed)).subscribe(result => { diff --git a/dmp-frontend/src/app/ui/dmp/listing/dmp-listing.component.ts b/dmp-frontend/src/app/ui/dmp/listing/dmp-listing.component.ts index e4203d2e6..5bf058928 100644 --- a/dmp-frontend/src/app/ui/dmp/listing/dmp-listing.component.ts +++ b/dmp-frontend/src/app/ui/dmp/listing/dmp-listing.component.ts @@ -174,6 +174,7 @@ export class DmpListingComponent extends BaseComponent implements OnInit, IBread fields.push('-modified'); const request = new DataTableRequest(this.startIndex, this.pageSize, { fields: fields }); + this.setPublicCriteria(); request.criteria = this.criteria; this.dmpService.getPaged(request, "listing").pipe(takeUntil(this._destroyed)).subscribe(result => { @@ -195,6 +196,7 @@ export class DmpListingComponent extends BaseComponent implements OnInit, IBread this.startIndex = this.startIndex + this.pageSize; const fields: Array = ["-modified"]; const request = new DataTableRequest(this.startIndex, this.pageSize, { fields: fields }); + this.setPublicCriteria(); request.criteria = this.criteria; this.dmpService.getPaged(request, "listing").pipe(takeUntil(this._destroyed)).subscribe(result => { @@ -321,15 +323,7 @@ export class DmpListingComponent extends BaseComponent implements OnInit, IBread role: formGroup.get('role').value } this.criteria.status = formGroup.get('status').value; - if (formGroup.get('status').value == 2) { - this.criteria.isPublic = true; - } else { - this.criteria.isPublic = false; - } - this.criteria.onlyPublic = this.isPublic; - if (this.isPublic) { - this.criteria.isPublic = true; - } + this.setPublicCriteria(formGroup); if (formGroup.get('datasetTemplates').value) this.criteria.datasetTemplates = formGroup.get('datasetTemplates').value.map(x => x.id); if (formGroup.get('collaborators').value) @@ -343,8 +337,21 @@ export class DmpListingComponent extends BaseComponent implements OnInit, IBread this.criteria.grantStatus = formGroup.get('grantStatus').value; } + setPublicCriteria(formGroup?: FormGroup): void { + if (formGroup && formGroup.get('status').value == 2) { + this.criteria.isPublic = true; + } + + this.criteria.onlyPublic = this.isPublic; + if (this.isPublic) { + this.criteria.isPublic = true; + } else { + this.criteria.isPublic = false; + } + } + hasScrollbar(): boolean { - return document.getElementById("main-page").scrollHeight > document.documentElement.clientHeight + return document.getElementById("main-page").scrollHeight > document.documentElement.clientHeight } } From a4b61c217262fe4c8103724f3cf263978cd6eb8e Mon Sep 17 00:00:00 2001 From: gpapavgeri Date: Thu, 9 Jul 2020 10:17:49 +0300 Subject: [PATCH 064/364] dmp&dataset overview_remove user & invite user update --- .../eudat/logic/managers/DatasetManager.java | 6 +- .../multiple-auto-complete.component.ts | 7 +- .../overview/dataset-overview.component.html | 5 +- .../overview/dataset-overview.component.ts | 73 +++++++++++++++---- .../invitation/dmp-invitation.component.html | 19 ++--- .../invitation/dmp-invitation.component.scss | 34 +++++---- .../invitation/dmp-invitation.component.ts | 21 ++++-- .../dmp/overview/dmp-overview.component.html | 2 +- .../ui/dmp/overview/dmp-overview.component.ts | 35 +++++++-- 9 files changed, 138 insertions(+), 64 deletions(-) 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 a0fe6d159..725f130e8 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 @@ -1054,8 +1054,10 @@ public class DatasetManager { criteria.setGroupIds(Collections.singletonList(item.getProfile().getGroupId())); List profiles = apiContext.getOperationsContext().getDatabaseRepository().getDatasetProfileDao().getWithCriteria(criteria).toList(); boolean islast = false; - profiles = profiles.stream().sorted(Comparator.comparing(DatasetProfile::getVersion)).collect(Collectors.toList()); - islast = profiles.get(0).getId().equals(item.getProfile().getId()); + if (!profiles.isEmpty()) { + profiles = profiles.stream().sorted(Comparator.comparing(DatasetProfile::getVersion)).collect(Collectors.toList()); + islast = profiles.get(0).getId().equals(item.getProfile().getId()); + } listingModel.setProfileLatestVersion(islast); return listingModel; } diff --git a/dmp-frontend/src/app/library/auto-complete/multiple/multiple-auto-complete.component.ts b/dmp-frontend/src/app/library/auto-complete/multiple/multiple-auto-complete.component.ts index ff0663383..5f05404a0 100644 --- a/dmp-frontend/src/app/library/auto-complete/multiple/multiple-auto-complete.component.ts +++ b/dmp-frontend/src/app/library/auto-complete/multiple/multiple-auto-complete.component.ts @@ -303,12 +303,13 @@ export class MultipleAutoCompleteComponent extends _CustomComponentMixinBase imp //Chip Functions _addItem(event: MatChipInputEvent): void { + const input = event.input; const value = event.value; // Add our fruit - // if ((value || '').trim()) { - // this.selectedItems.push(value.trim()); - // } + if ((value || '').trim()) { + this.optionSelectedInternal(value); + } // Reset the input value if (input) { this.inputValue = ''; diff --git a/dmp-frontend/src/app/ui/dataset/overview/dataset-overview.component.html b/dmp-frontend/src/app/ui/dataset/overview/dataset-overview.component.html index dba577e25..40d668854 100644 --- a/dmp-frontend/src/app/ui/dataset/overview/dataset-overview.component.html +++ b/dmp-frontend/src/app/ui/dataset/overview/dataset-overview.component.html @@ -62,7 +62,8 @@
@@ -143,7 +144,7 @@

{{ roleDisplay(user) }}

-
diff --git a/dmp-frontend/src/app/ui/dataset/overview/dataset-overview.component.ts b/dmp-frontend/src/app/ui/dataset/overview/dataset-overview.component.ts index 6e1a22ef4..0f79504df 100644 --- a/dmp-frontend/src/app/ui/dataset/overview/dataset-overview.component.ts +++ b/dmp-frontend/src/app/ui/dataset/overview/dataset-overview.component.ts @@ -48,7 +48,9 @@ export class DatasetOverviewComponent extends BaseComponent implements OnInit { expand = false; hasDOIToken = false; researchers: ResearcherModel[]; - lockStatus: Boolean; + users: UserInfoListingModel[]; + lockStatus = false; + // lockStatus: Boolean; constructor( private route: ActivatedRoute, @@ -85,11 +87,12 @@ export class DatasetOverviewComponent extends BaseComponent implements OnInit { .subscribe(data => { this.dataset = data; this.getDmpResearchers(); + this.getDmpUsers(); this.datasetWizardService.getSingle(this.dataset.id).pipe(takeUntil(this._destroyed)) .subscribe(data => { this.datasetWizardModel = new DatasetWizardEditorModel().fromModel(data); }); - this.checkLockStatus(this.dataset.id); + // this.checkLockStatus(this.dataset.id); this.setIsUserOwner(); const breadCrumbs = []; breadCrumbs.push({ parentComponentName: null, label: this.language.instant('NAV-BAR.MY-DATASET-DESCRIPTIONS'), url: "/datasets" }); @@ -113,11 +116,12 @@ export class DatasetOverviewComponent extends BaseComponent implements OnInit { .subscribe(data => { this.dataset = data; this.getDmpResearchers(); + this.getDmpUsers(); this.datasetWizardService.getSingle(this.dataset.id).pipe(takeUntil(this._destroyed)) .subscribe(data => { this.datasetWizardModel = new DatasetWizardEditorModel().fromModel(data); }); - this.checkLockStatus(this.dataset.id); + // this.checkLockStatus(this.dataset.id); this.setIsUserOwner(); const breadCrumbs = []; breadCrumbs.push({ parentComponentName: null, label: this.language.instant('NAV-BAR.PUBLIC DATASETS'), url: "/explore" }); @@ -135,10 +139,10 @@ export class DatasetOverviewComponent extends BaseComponent implements OnInit { }); } - checkLockStatus(id: string){ - this.lockService.checkLockStatus(id).pipe(takeUntil(this._destroyed)) - .subscribe(lockStatus => this.lockStatus = lockStatus); - } + checkLockStatus(id: string) { + this.lockService.checkLockStatus(id).pipe(takeUntil(this._destroyed)) + .subscribe(lockStatus => this.lockStatus = lockStatus); + } onFetchingDeletedCallbackError(redirectRoot: string) { this.uiNotificationService.snackBarNotification(this.language.instant('DATASET-OVERVIEW.ERROR.DELETED-DATASET'), SnackBarNotificationLevel.Error); @@ -154,6 +158,12 @@ export class DatasetOverviewComponent extends BaseComponent implements OnInit { this.location.back(); } + reloadComponent(): void { + this.router.navigateByUrl('/datasets', { skipLocationChange: true }).then(() => { + this.router.navigate([`/datasets/overview/${this.dataset.id}`]); + }); + } + getDmpResearchers() { this.dmpService.getSingle(this.dataset.dmp.id).pipe(takeUntil(this._destroyed)) .subscribe(data => { @@ -161,6 +171,13 @@ export class DatasetOverviewComponent extends BaseComponent implements OnInit { }); } + getDmpUsers() { + this.dmpService.getSingle(this.dataset.dmp.id).pipe(takeUntil(this._destroyed)) + .subscribe(data => { + this.users = data.users; + }); + } + setIsUserOwner() { if (this.dataset) { const principal: Principal = this.authentication.current(); @@ -261,7 +278,10 @@ export class DatasetOverviewComponent extends BaseComponent implements OnInit { this.datasetService.delete(this.dataset.id) .pipe(takeUntil(this._destroyed)) .subscribe( - complete => { this.onCallbackSuccess() }, + complete => { + this.onCallbackSuccess(); + this.router.navigate(['/datasets']); + }, error => this.onDeleteCallbackError(error) ); } @@ -274,7 +294,6 @@ export class DatasetOverviewComponent extends BaseComponent implements OnInit { onCallbackSuccess(): void { this.uiNotificationService.snackBarNotification(this.isNew ? this.language.instant('GENERAL.SNACK-BAR.SUCCESSFUL-CREATION') : this.language.instant('GENERAL.SNACK-BAR.SUCCESSFUL-UPDATE'), SnackBarNotificationLevel.Success); - this.router.navigate(['/datasets']); } onDeleteCallbackError(error) { @@ -370,14 +389,36 @@ export class DatasetOverviewComponent extends BaseComponent implements OnInit { }); } - removeUserFromDmp() { - // return this.dmpService.removeUserFromDmp().pipe(takeUntil(this._destroyed)) - // .subscribe( - // complete => { this.onCallbackSuccess() }, - // error => this.onDeleteCallbackError(error) - // ); - } + updateUsers() { + return this.dmpService.updateUsers(this.dataset.dmp.id, this.users).pipe(takeUntil(this._destroyed)) + .subscribe( + complete => { + this.onCallbackSuccess(); + this.reloadComponent(); + }, + error => this.onDeleteCallbackError(error) + ); + } + removeUserFromDmp(user: UserInfoListingModel) { + const dialogRef = this.dialog.open(ConfirmationDialogComponent, { + data: { + message: this.language.instant('GENERAL.CONFIRMATION-DIALOG.DELETE-USER'), + confirmButton: this.language.instant('GENERAL.CONFIRMATION-DIALOG.ACTIONS.REMOVE'), + cancelButton: this.language.instant('GENERAL.CONFIRMATION-DIALOG.ACTIONS.CANCEL'), + isDeleteConfirmation: false + } + }); + dialogRef.afterClosed().subscribe(result => { + if (result) { + const index = this.users.findIndex(x => x.id === user.id); + if (index > -1) { + this.users.splice(index, 1); + } + this.updateUsers(); + } + }); + } } diff --git a/dmp-frontend/src/app/ui/dmp/invitation/dmp-invitation.component.html b/dmp-frontend/src/app/ui/dmp/invitation/dmp-invitation.component.html index 48c5bcdc9..e6b43c548 100644 --- a/dmp-frontend/src/app/ui/dmp/invitation/dmp-invitation.component.html +++ b/dmp-frontend/src/app/ui/dmp/invitation/dmp-invitation.component.html @@ -7,19 +7,14 @@

{{'DMP-LISTING.ACTIONS.INVITE-AUTHORS' | translate}}

- - - - {{email}} - cancel - - - + + + + -
+
diff --git a/dmp-frontend/src/app/ui/dmp/invitation/dmp-invitation.component.scss b/dmp-frontend/src/app/ui/dmp/invitation/dmp-invitation.component.scss index cee86fde2..996466d32 100644 --- a/dmp-frontend/src/app/ui/dmp/invitation/dmp-invitation.component.scss +++ b/dmp-frontend/src/app/ui/dmp/invitation/dmp-invitation.component.scss @@ -1,8 +1,7 @@ .form-container { - width: 530px; - height: 228px; - padding: 4.5px 5.5px 14px 18px; - // margin: 28.5px 29.5px 38px 42px; + width: 33em; + min-height: 14em; + padding: 0.28em 0.34em 0.875em 1.125em; } .close-icon { @@ -10,24 +9,19 @@ } .title { - // text-align: left; - font-size: 38px; + font-size: 2.375em; font-weight: lighter; color: #000000; opacity: 0.8; - margin-bottom: 32px; + margin-bottom: 0.842em; } .content { - width: 496px; + width: 31em; margin: 0px; padding: 0px; } -.input { - border: 2px black; -} - .mat-form-field { background: #FAFAFA; border: 1px solid #D1D1D1; @@ -38,11 +32,19 @@ display: none; } -::ng-deep .multiple-auto-complete[_ngcontent-mut-c19] { +::ng-deep .mat-form-field-wrapper { + padding: 0em !important; +} + +::ng-deep .mat-form-field-infix { + border: none; +} + +::ng-deep .align-arrow-right { display: none; } -.invite-btn{ +.invite-btn { width: 6.64em; height: 2.93em; background: #FFFFFF; @@ -51,6 +53,6 @@ font-weight: bold; letter-spacing: -0.35px; color: #B5B5B5; - margin-bottom: 1px; - } + margin-bottom: 0.25em; +} diff --git a/dmp-frontend/src/app/ui/dmp/invitation/dmp-invitation.component.ts b/dmp-frontend/src/app/ui/dmp/invitation/dmp-invitation.component.ts index 20936c1c8..ddce6723f 100644 --- a/dmp-frontend/src/app/ui/dmp/invitation/dmp-invitation.component.ts +++ b/dmp-frontend/src/app/ui/dmp/invitation/dmp-invitation.component.ts @@ -1,6 +1,6 @@ import { COMMA, ENTER } from '@angular/cdk/keycodes'; -import { Component, Inject, OnInit } from '@angular/core'; +import { Component, Inject, OnInit, ViewChild } from '@angular/core'; import { FormGroup } from '@angular/forms'; import { MatChipInputEvent } from '@angular/material/chips'; import { MatDialogRef, MAT_DIALOG_DATA } from '@angular/material/dialog'; @@ -33,12 +33,17 @@ export class DmpInvitationDialogComponent extends BaseComponent implements OnIni addOnBlur = true; readonly separatorKeysCodes: number[] = [ENTER, COMMA]; - usersAutoCompleteConfiguration: MultipleAutoCompleteConfiguration = { filterFn: this.filterUsers.bind(this), initialItems: (excludedItems: any[]) => this.filterUsers('').pipe(map(result => result.filter(resultItem => (excludedItems || []).map(x => x.id).indexOf(resultItem.id) === -1))), - displayFn: (item) => item.name, - titleFn: (item) => item.name + displayFn: (item) => typeof(item) === 'string' ? item : item.name, + titleFn: (item) => typeof(item) === 'string' ? item : item.name, + valueAssign: (item) => { + + const result = typeof(item) === 'string' ? item : item.email; + console.log(result); + return result; + } }; add(event: MatChipInputEvent): void { @@ -79,8 +84,11 @@ export class DmpInvitationDialogComponent extends BaseComponent implements OnIni let invitationObject: any = {}; invitationObject.dataManagementPlan = this.data.dmpId; invitationObject.users = []; - - invitationObject.users.push(...this.formGroup.get('users').value); + console.log(this.formGroup.get('users').value); + invitationObject.users.push(...(this.formGroup.get('users').value).filter(user => typeof(user) === 'string').map(email => ({ email: email, name: email }))); + invitationObject.users.push(...(this.formGroup.get('users').value).filter(user => typeof(user) !== 'string')); + console.log(invitationObject.users); + //invitationObject.users.push(...this.formGroup.get('users').value); this.emails.forEach(email => { invitationObject.users.push({ email: email, name: email }); }); @@ -114,4 +122,5 @@ export class DmpInvitationDialogComponent extends BaseComponent implements OnIni // this.filteredUsersAsync = false; // }); } + } \ No newline at end of file diff --git a/dmp-frontend/src/app/ui/dmp/overview/dmp-overview.component.html b/dmp-frontend/src/app/ui/dmp/overview/dmp-overview.component.html index c28357438..92357e3fa 100644 --- a/dmp-frontend/src/app/ui/dmp/overview/dmp-overview.component.html +++ b/dmp-frontend/src/app/ui/dmp/overview/dmp-overview.component.html @@ -206,7 +206,7 @@

{{ roleDisplay(user) }}

-
diff --git a/dmp-frontend/src/app/ui/dmp/overview/dmp-overview.component.ts b/dmp-frontend/src/app/ui/dmp/overview/dmp-overview.component.ts index fb73baf7b..3b0330271 100644 --- a/dmp-frontend/src/app/ui/dmp/overview/dmp-overview.component.ts +++ b/dmp-frontend/src/app/ui/dmp/overview/dmp-overview.component.ts @@ -566,12 +566,33 @@ export class DmpOverviewComponent extends BaseComponent implements OnInit { this.location.back(); } - removeUserFromDmp() { - // return this.dmpService.updateUsers(this.dmp.id, this.dmp.users).pipe(takeUntil(this._destroyed)) - // .subscribe( - // complete => { this.onCallbackSuccess() }, - // error => this.onDeleteCallbackError(error) - // ); + updateUsers() { + return this.dmpService.updateUsers(this.dmp.id, this.dmp.users).pipe(takeUntil(this._destroyed)) + .subscribe( + complete => { this.onCallbackSuccess() }, + error => this.onDeleteCallbackError(error) + ); + } + + removeUserFromDmp(user: UserInfoListingModel) { + const dialogRef = this.dialog.open(ConfirmationDialogComponent, { + data: { + message: this.language.instant('GENERAL.CONFIRMATION-DIALOG.DELETE-USER'), + confirmButton: this.language.instant('GENERAL.CONFIRMATION-DIALOG.ACTIONS.REMOVE'), + cancelButton: this.language.instant('GENERAL.CONFIRMATION-DIALOG.ACTIONS.CANCEL'), + isDeleteConfirmation: false + } + }); + dialogRef.afterClosed().subscribe(result => { + if (result) { + const list= this.dmp.users; + const index = this.dmp.users.indexOf(user); + if (index > -1) { + this.dmp.users.splice(index, 1); + } + this.updateUsers(); + } + }); } copyDoi(doi) { @@ -598,6 +619,8 @@ export class DmpOverviewComponent extends BaseComponent implements OnInit { } } + + // advancedClicked() { // const dialogRef = this.dialog.open(ExportMethodDialogComponent, { From 397e23e4d1f6453e091d632f8f57f111bdbb91b8 Mon Sep 17 00:00:00 2001 From: apapachristou Date: Thu, 9 Jul 2020 10:53:17 +0300 Subject: [PATCH 065/364] fixes error shows on development mode "value changed after it was checked... " on listings --- .../app/ui/dataset/listing/dataset-listing.component.html | 2 +- .../src/app/ui/dataset/listing/dataset-listing.component.ts | 6 ++++++ .../src/app/ui/dmp/listing/dmp-listing.component.html | 2 +- .../src/app/ui/dmp/listing/dmp-listing.component.ts | 6 ++++++ 4 files changed, 14 insertions(+), 2 deletions(-) diff --git a/dmp-frontend/src/app/ui/dataset/listing/dataset-listing.component.html b/dmp-frontend/src/app/ui/dataset/listing/dataset-listing.component.html index 703dd8ec7..913aed951 100644 --- a/dmp-frontend/src/app/ui/dataset/listing/dataset-listing.component.html +++ b/dmp-frontend/src/app/ui/dataset/listing/dataset-listing.component.html @@ -13,7 +13,7 @@
-
+
diff --git a/dmp-frontend/src/app/ui/dataset/listing/dataset-listing.component.ts b/dmp-frontend/src/app/ui/dataset/listing/dataset-listing.component.ts index a3a62cbf3..fdc462469 100644 --- a/dmp-frontend/src/app/ui/dataset/listing/dataset-listing.component.ts +++ b/dmp-frontend/src/app/ui/dataset/listing/dataset-listing.component.ts @@ -54,6 +54,8 @@ export class DatasetListingComponent extends BaseComponent implements OnInit, IB like: new FormControl() }); + scrollbar: boolean; + constructor( private datasetService: DatasetService, private router: Router, @@ -118,6 +120,10 @@ export class DatasetListingComponent extends BaseComponent implements OnInit, IB .subscribe(x => this.controlModified()); } + ngAfterContentChecked(): void { + this.scrollbar = this.hasScrollbar(); + } + controlModified(): void { // this.clearErrorModel(); // if (this.refreshCallback != null && diff --git a/dmp-frontend/src/app/ui/dmp/listing/dmp-listing.component.html b/dmp-frontend/src/app/ui/dmp/listing/dmp-listing.component.html index a57e09e98..33bb45077 100644 --- a/dmp-frontend/src/app/ui/dmp/listing/dmp-listing.component.html +++ b/dmp-frontend/src/app/ui/dmp/listing/dmp-listing.component.html @@ -8,7 +8,7 @@

{{'DMP-LISTING.TEXT-INFO-QUESTION' | translate}} {{'DMP-LISTING.LINK-ZENODO' | translate}} {{'DMP-LISTING.GET-IDEA' | translate}}

-
+
diff --git a/dmp-frontend/src/app/ui/dmp/listing/dmp-listing.component.ts b/dmp-frontend/src/app/ui/dmp/listing/dmp-listing.component.ts index b93a16750..ed291b369 100644 --- a/dmp-frontend/src/app/ui/dmp/listing/dmp-listing.component.ts +++ b/dmp-frontend/src/app/ui/dmp/listing/dmp-listing.component.ts @@ -59,6 +59,8 @@ export class DmpListingComponent extends BaseComponent implements OnInit, IBread like: new FormControl() }); + scrollbar: boolean; + constructor( private dmpService: DmpService, private router: Router, @@ -164,6 +166,10 @@ export class DmpListingComponent extends BaseComponent implements OnInit, IBread .subscribe(x => this.controlModified()); } + ngAfterContentChecked(): void { + this.scrollbar = this.hasScrollbar(); + } + public refresh(resetPages = false) { // if (this._paginator.pageSize === undefined) this._paginator.pageSize = 10; // if (resetPages) this._paginator.pageIndex = 0; From 4e249e4b8b3094f768693346e052b0b25a9e599a Mon Sep 17 00:00:00 2001 From: George Kalampokis Date: Thu, 9 Jul 2020 13:11:43 +0300 Subject: [PATCH 066/364] Add get All Versions Endpoint to the Backend --- .../main/java/eu/eudat/data/entities/DMP.java | 5 ++ .../main/java/eu/eudat/controllers/DMPs.java | 9 ++++ .../managers/DataManagementPlanManager.java | 32 +++++++++-- .../listingmodels/VersionListingModel.java | 53 +++++++++++++++++++ 4 files changed, 95 insertions(+), 4 deletions(-) create mode 100644 dmp-backend/web/src/main/java/eu/eudat/models/data/listingmodels/VersionListingModel.java diff --git a/dmp-backend/data/src/main/java/eu/eudat/data/entities/DMP.java b/dmp-backend/data/src/main/java/eu/eudat/data/entities/DMP.java index 2d1201680..1a475db17 100644 --- a/dmp-backend/data/src/main/java/eu/eudat/data/entities/DMP.java +++ b/dmp-backend/data/src/main/java/eu/eudat/data/entities/DMP.java @@ -38,7 +38,12 @@ import java.util.stream.Collectors; @NamedSubgraph(name = "users", attributeNodes = {@NamedAttributeNode("user")}), @NamedSubgraph(name = "dataset", attributeNodes = {@NamedAttributeNode("id"), @NamedAttributeNode("label")}) } + ), + @NamedEntityGraph( + name = "versionListingModel", + attributeNodes = {@NamedAttributeNode("id"), @NamedAttributeNode("groupId"), @NamedAttributeNode("version")} ) + }) public class DMP implements DataEntity { diff --git a/dmp-backend/web/src/main/java/eu/eudat/controllers/DMPs.java b/dmp-backend/web/src/main/java/eu/eudat/controllers/DMPs.java index 135cac60b..368420d86 100644 --- a/dmp-backend/web/src/main/java/eu/eudat/controllers/DMPs.java +++ b/dmp-backend/web/src/main/java/eu/eudat/controllers/DMPs.java @@ -29,6 +29,7 @@ import eu.eudat.models.data.helpers.responses.ResponseItem; import eu.eudat.models.data.listingmodels.DataManagementPlanListingModel; import eu.eudat.models.data.listingmodels.DataManagementPlanOverviewModel; import eu.eudat.models.data.listingmodels.UserInfoListingModel; +import eu.eudat.models.data.listingmodels.VersionListingModel; import eu.eudat.models.data.security.Principal; import eu.eudat.query.DMPQuery; import eu.eudat.types.ApiMessageCode; @@ -159,6 +160,14 @@ public class DMPs extends BaseController { return ResponseEntity.status(HttpStatus.OK).body(new ResponseItem>>().status(ApiMessageCode.NO_MESSAGE).payload(dataTable)); } + @RequestMapping(method = RequestMethod.GET, value = {"/versions/{id}"}, consumes = "application/json", produces = "application/json") + public @ResponseBody + ResponseEntity>> getVersions(@PathVariable String groupId, + @ClaimedAuthorities(claims = {Authorities.ADMIN, Authorities.MANAGER, Authorities.USER, Authorities.ANONYMOUS}) Principal principal) throws Exception { + List versions = this.dataManagementPlanManager.getAllVersions(groupId, principal); + return ResponseEntity.status(HttpStatus.OK).body(new ResponseItem>().status(ApiMessageCode.NO_MESSAGE).payload(versions)); + } + /* * Data Export * */ diff --git a/dmp-backend/web/src/main/java/eu/eudat/logic/managers/DataManagementPlanManager.java b/dmp-backend/web/src/main/java/eu/eudat/logic/managers/DataManagementPlanManager.java index 3d63d6ea7..ded7530db 100644 --- a/dmp-backend/web/src/main/java/eu/eudat/logic/managers/DataManagementPlanManager.java +++ b/dmp-backend/web/src/main/java/eu/eudat/logic/managers/DataManagementPlanManager.java @@ -50,10 +50,7 @@ import eu.eudat.models.data.funder.FunderDMPEditorModel; import eu.eudat.models.data.grant.GrantDMPEditorModel; import eu.eudat.models.data.helpermodels.Tuple; import eu.eudat.models.data.helpers.common.DataTableData; -import eu.eudat.models.data.listingmodels.DataManagementPlanListingModel; -import eu.eudat.models.data.listingmodels.DataManagementPlanOverviewModel; -import eu.eudat.models.data.listingmodels.DatasetListingModel; -import eu.eudat.models.data.listingmodels.UserInfoListingModel; +import eu.eudat.models.data.listingmodels.*; import eu.eudat.models.data.project.ProjectDMPEditorModel; import eu.eudat.models.data.security.Principal; import eu.eudat.models.data.user.composite.PagedDatasetProfile; @@ -301,6 +298,33 @@ public class DataManagementPlanManager { return data; } + public List getAllVersions(String groupId, Principal principal) { + UUID principalId = principal.getId(); + List versions = new ArrayList<>(); + QueryableList items = null; + QueryableList authItems = null; + List roles = new LinkedList<>(); + DataManagementPlanCriteria criteria = new DataManagementPlanCriteria(); + criteria.setGroupIds(Collections.singletonList(UUID.fromString(groupId))); + criteria.setAllVersions(true); + criteria.setIsPublic(principalId == null); + criteria.setOnlyPublic(principalId == null); + items = apiContext.getOperationsContext().getDatabaseRepository().getDmpDao().getWithCriteria(criteria); + if (principalId != null) { + authItems = apiContext.getOperationsContext().getDatabaseRepository().getDmpDao().getAuthenticated(items, principalId, roles); + } else { + authItems = items; + } + CompletableFuture> versionFuture = authItems.withHint(HintedModelFactory.getHint(VersionListingModel.class)) + .orderBy(((builder, root) -> builder.asc(root.get("version")))) + .selectAsync(item -> new VersionListingModel().fromDataModel(item)) + .whenComplete(((versionListingModels, throwable) -> versions.addAll(versionListingModels))); + + CompletableFuture.allOf(versionFuture).join(); + + return versions; + } + /* * Data Management * */ diff --git a/dmp-backend/web/src/main/java/eu/eudat/models/data/listingmodels/VersionListingModel.java b/dmp-backend/web/src/main/java/eu/eudat/models/data/listingmodels/VersionListingModel.java new file mode 100644 index 000000000..e62abe66a --- /dev/null +++ b/dmp-backend/web/src/main/java/eu/eudat/models/data/listingmodels/VersionListingModel.java @@ -0,0 +1,53 @@ +package eu.eudat.models.data.listingmodels; + +import eu.eudat.data.entities.DMP; +import eu.eudat.models.DataModel; + +public class VersionListingModel implements DataModel { + private String id; + private String groupId; + private Integer version; + + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public String getGroupId() { + return groupId; + } + + public void setGroupId(String groupId) { + this.groupId = groupId; + } + + public Integer getVersion() { + return version; + } + + public void setVersion(Integer version) { + this.version = version; + } + + @Override + public VersionListingModel fromDataModel(DMP entity) { + this.id = entity.getId().toString(); + this.groupId = entity.getGroupId().toString(); + this.version = entity.getVersion(); + return this; + } + + @Override + public DMP toDataModel() throws Exception { + return null; + } + + @Override + public String getHint() { + return "versionListingModel"; + } +} From ea3b73dd9ccc1161049a4d692f728b803a2be2f1 Mon Sep 17 00:00:00 2001 From: gpapavgeri Date: Thu, 9 Jul 2020 13:45:19 +0300 Subject: [PATCH 067/364] 'Start-new-dmp-dialog' completed except of import from file --- .../app/ui/dashboard/dashboard.component.html | 2 +- .../app/ui/dashboard/dashboard.component.ts | 19 ++++++- dmp-frontend/src/app/ui/dmp/dmp.module.ts | 8 ++- .../start-new-dmp-dialog.component.html | 22 ++++++++ .../start-new-dmp-dialog.component.scss | 54 +++++++++++++++++++ .../start-new-dmp-dialog.component.ts | 39 ++++++++++++++ .../src/app/ui/navbar/navbar.component.html | 3 +- .../src/app/ui/navbar/navbar.component.scss | 13 +++++ .../src/app/ui/navbar/navbar.component.ts | 17 ++++++ dmp-frontend/src/assets/i18n/en.json | 4 ++ dmp-frontend/src/assets/i18n/es.json | 4 ++ dmp-frontend/src/assets/i18n/gr.json | 4 ++ 12 files changed, 184 insertions(+), 5 deletions(-) create mode 100644 dmp-frontend/src/app/ui/dmp/start-new-dmp-dialogue/start-new-dmp-dialog.component.html create mode 100644 dmp-frontend/src/app/ui/dmp/start-new-dmp-dialogue/start-new-dmp-dialog.component.scss create mode 100644 dmp-frontend/src/app/ui/dmp/start-new-dmp-dialogue/start-new-dmp-dialog.component.ts diff --git a/dmp-frontend/src/app/ui/dashboard/dashboard.component.html b/dmp-frontend/src/app/ui/dashboard/dashboard.component.html index 402c5a6b7..905003cd2 100644 --- a/dmp-frontend/src/app/ui/dashboard/dashboard.component.html +++ b/dmp-frontend/src/app/ui/dashboard/dashboard.component.html @@ -14,7 +14,7 @@ {{'DASHBOARD.NEW-QUESTION' | translate}} {{'DASHBOARD.OPEN-AIR-GUIDE' | translate}} {{'DASHBOARD.LEARN-MORE' | translate}}

- +
diff --git a/dmp-frontend/src/app/ui/dashboard/dashboard.component.ts b/dmp-frontend/src/app/ui/dashboard/dashboard.component.ts index f7e728b46..c95b6af80 100644 --- a/dmp-frontend/src/app/ui/dashboard/dashboard.component.ts +++ b/dmp-frontend/src/app/ui/dashboard/dashboard.component.ts @@ -25,6 +25,8 @@ import { BreadcrumbItem } from '../misc/breadcrumb/definition/breadcrumb-item'; import { IBreadCrumbComponent } from '../misc/breadcrumb/definition/IBreadCrumbComponent'; import { DmpCriteria } from '@app/core/query/dmp/dmp-criteria'; import { DatasetCriteria } from '@app/core/query/dataset/dataset-criteria'; +import { MatDialog } from '@angular/material'; +import { StartNewDmpDialogComponent } from '../dmp/start-new-dmp-dialogue/start-new-dmp-dialog.component'; @Component({ @@ -68,7 +70,8 @@ export class DashboardComponent extends BaseComponent implements OnInit, IBreadC private dashboardService: DashboardService, private searchBarService: SearchBarService, private authentication: AuthService, - private userService: UserService + private userService: UserService, + private dialog: MatDialog ) { super(); @@ -207,6 +210,20 @@ export class DashboardComponent extends BaseComponent implements OnInit, IBreadC this.totalRecents = event; } + openNewDmpDialog() { + if (this.dialog.openDialogs.length > 0) { + this.dialog.closeAll(); + } + else { + const dialogRef = this.dialog.open(StartNewDmpDialogComponent, { + disableClose: true, + data: { + isDialog: true + } + }); + } + } + // viewAllPublicDmpsClicked() { // this.router.navigate(['/explore-plans']); // } diff --git a/dmp-frontend/src/app/ui/dmp/dmp.module.ts b/dmp-frontend/src/app/ui/dmp/dmp.module.ts index dee306705..a8a8aca47 100644 --- a/dmp-frontend/src/app/ui/dmp/dmp.module.ts +++ b/dmp-frontend/src/app/ui/dmp/dmp.module.ts @@ -35,6 +35,8 @@ import { AddOrganizationComponent } from './editor/add-organization/add-organiza import { AddCostComponent } from './editor/cost-editor/add-cost/add-cost.component'; import { CostListingComponent } from './editor/cost-editor/cost-listing/cost-listing.component'; import { DmpCriteriaDialogComponent } from './listing/criteria/dmp-criteria-dialog.component'; +import { StartNewDmpDialogComponent } from './start-new-dmp-dialogue/start-new-dmp-dialog.component'; + @NgModule({ imports: [ @@ -76,7 +78,8 @@ import { DmpCriteriaDialogComponent } from './listing/criteria/dmp-criteria-dial DmpCriteriaDialogComponent, AddOrganizationComponent, AddCostComponent, - CostListingComponent + CostListingComponent, + StartNewDmpDialogComponent ], entryComponents: [ DmpInvitationDialogComponent, @@ -87,7 +90,8 @@ import { DmpCriteriaDialogComponent } from './listing/criteria/dmp-criteria-dial AddOrganizationComponent, DmpCriteriaDialogComponent, AddOrganizationComponent, - AddCostComponent + AddCostComponent, + StartNewDmpDialogComponent ] }) export class DmpModule { } diff --git a/dmp-frontend/src/app/ui/dmp/start-new-dmp-dialogue/start-new-dmp-dialog.component.html b/dmp-frontend/src/app/ui/dmp/start-new-dmp-dialogue/start-new-dmp-dialog.component.html new file mode 100644 index 000000000..5b0c101a8 --- /dev/null +++ b/dmp-frontend/src/app/ui/dmp/start-new-dmp-dialogue/start-new-dmp-dialog.component.html @@ -0,0 +1,22 @@ + +
+
+ + close +
+
+

{{'NAV-BAR.START-NEW-DMP' | translate}}

+

{{'NAV-BAR.START-NEW-DMP-TXT' | translate}}

+
+ +

{{ 'QUICKWIZARD.CREATE-ADD.CREATE.QUICKWIZARD_CREATE.FIRST-STEP.OR' | translate }}

+ +
+
+
diff --git a/dmp-frontend/src/app/ui/dmp/start-new-dmp-dialogue/start-new-dmp-dialog.component.scss b/dmp-frontend/src/app/ui/dmp/start-new-dmp-dialogue/start-new-dmp-dialog.component.scss new file mode 100644 index 000000000..10bcb587b --- /dev/null +++ b/dmp-frontend/src/app/ui/dmp/start-new-dmp-dialogue/start-new-dmp-dialog.component.scss @@ -0,0 +1,54 @@ +::ng-deep .mat-dialog-container { + border-radius: 8px; +} + +.form-container { + width: 33rem; + min-height: 14rem; + padding: 0.28rem 0.34rem 0.875rem 0.625rem; +} + +.logo { + width: 8.44rem; +} + +.close-icon { + cursor: pointer; +} + +.content { + margin: 2.17rem 2.304rem 1.1875rem 3.065rem; +} + +.title, .text { + font-size: 1.25rem; + font-weight: lighter; + color: #000000; + opacity: 0.8; +} + +.title { + font-size: 2.375rem; + margin-bottom: 1.1875rem; +} + +.text { + margin-bottom: 2.9375rem; + line-height: 1.9rem; +} + +.upload-btn { + background-color: white; + color: #212121; + font-weight: bold; + box-shadow: 0px 3px 6px #1E202029; + border: 2px solid #212121; +} + +.actions { + width: 26.667rem; + display: flex; + flex-direction: row; + justify-content: space-between; + align-items: center; +} diff --git a/dmp-frontend/src/app/ui/dmp/start-new-dmp-dialogue/start-new-dmp-dialog.component.ts b/dmp-frontend/src/app/ui/dmp/start-new-dmp-dialogue/start-new-dmp-dialog.component.ts new file mode 100644 index 000000000..d9a22912e --- /dev/null +++ b/dmp-frontend/src/app/ui/dmp/start-new-dmp-dialogue/start-new-dmp-dialog.component.ts @@ -0,0 +1,39 @@ +import { Component, Inject } from '@angular/core'; +import { MatDialogRef, MAT_DIALOG_DATA } from '@angular/material/dialog'; +import { Router } from '@angular/router'; + +@Component({ + selector: 'app-start-new-dmp', + templateUrl: './start-new-dmp-dialog.component.html', + styleUrls: ['./start-new-dmp-dialog.component.scss'] +}) +export class StartNewDmpDialogComponent { + + public isDialog: boolean = false; + + constructor( + public dialogRef: MatDialogRef, + @Inject(MAT_DIALOG_DATA) public data: any, + private router: Router + ) { + this.isDialog = data.isDialog; + } + + cancel() { + this.dialogRef.close(); + } + + send() { + this.dialogRef.close(this.data); + } + + close() { + this.dialogRef.close(false); + } + + startWizard() { + this.router.navigate(['/quick-wizard']); + this.close(); + } + +} diff --git a/dmp-frontend/src/app/ui/navbar/navbar.component.html b/dmp-frontend/src/app/ui/navbar/navbar.component.html index ab12bdd6b..9311e4ccd 100644 --- a/dmp-frontend/src/app/ui/navbar/navbar.component.html +++ b/dmp-frontend/src/app/ui/navbar/navbar.component.html @@ -11,7 +11,8 @@