frontend dashboard changes
This commit is contained in:
parent
9685b323e1
commit
9e13eb4d01
|
@ -20,11 +20,10 @@ const appRoutes: Routes = [
|
||||||
pathMatch: 'full'
|
pathMatch: 'full'
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
path: 'datasetcreatewizard',
|
path: 'home',
|
||||||
loadChildren: () => import('./ui/dataset-create-wizard/dataset-create-wizard.module').then(m => m.DatasetCreateWizardModule),
|
loadChildren: () => import('./ui/dashboard/dashboard.module').then(m => m.DashboardModule),
|
||||||
data: {
|
data: {
|
||||||
breadcrumb: true,
|
breadcrumb: true
|
||||||
title: 'GENERAL.TITLES.DATASETCREATEWIZARD'
|
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
|
@ -43,23 +42,6 @@ const appRoutes: Routes = [
|
||||||
title: 'GENERAL.TITLES.EXPLORE'
|
title: 'GENERAL.TITLES.EXPLORE'
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
{
|
|
||||||
path: 'about',
|
|
||||||
loadChildren: () => import('./ui/about/about.module').then(m => m.AboutModule),
|
|
||||||
data: {
|
|
||||||
breadcrumb: true,
|
|
||||||
title: 'GENERAL.TITLES.ABOUT'
|
|
||||||
}
|
|
||||||
},
|
|
||||||
// ----------- UNCOMMENT TO ADD AGAIN GRANTS --------
|
|
||||||
// {
|
|
||||||
// path: 'grants',
|
|
||||||
// loadChildren: () => import('./ui/grant/grant.module').then(m => m.GrantModule),
|
|
||||||
// data: {
|
|
||||||
// breadcrumb: true,
|
|
||||||
// title: 'GENERAL.TITLES.GRANTS'
|
|
||||||
// }
|
|
||||||
// },
|
|
||||||
{
|
{
|
||||||
path: 'plans',
|
path: 'plans',
|
||||||
loadChildren: () => import('./ui/dmp/dmp.module').then(m => m.DmpModule),
|
loadChildren: () => import('./ui/dmp/dmp.module').then(m => m.DmpModule),
|
||||||
|
@ -88,6 +70,36 @@ const appRoutes: Routes = [
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
{
|
||||||
|
path: 'datasetcreatewizard',
|
||||||
|
loadChildren: () => import('./ui/dataset-create-wizard/dataset-create-wizard.module').then(m => m.DatasetCreateWizardModule),
|
||||||
|
data: {
|
||||||
|
breadcrumb: true,
|
||||||
|
title: 'GENERAL.TITLES.DATASETCREATEWIZARD'
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
{
|
||||||
|
path: 'about',
|
||||||
|
loadChildren: () => import('./ui/about/about.module').then(m => m.AboutModule),
|
||||||
|
data: {
|
||||||
|
breadcrumb: true,
|
||||||
|
title: 'GENERAL.TITLES.ABOUT'
|
||||||
|
}
|
||||||
|
},
|
||||||
|
// ----------- UNCOMMENT TO ADD AGAIN GRANTS --------
|
||||||
|
// {
|
||||||
|
// path: 'grants',
|
||||||
|
// loadChildren: () => import('./ui/grant/grant.module').then(m => m.GrantModule),
|
||||||
|
// data: {
|
||||||
|
// breadcrumb: true,
|
||||||
|
// title: 'GENERAL.TITLES.GRANTS'
|
||||||
|
// }
|
||||||
|
// },
|
||||||
|
|
||||||
{
|
{
|
||||||
path: 'quick-wizard',
|
path: 'quick-wizard',
|
||||||
loadChildren: () => import('./ui/quick-wizard/quick-wizard.module').then(m => m.OuickWizardModule),
|
loadChildren: () => import('./ui/quick-wizard/quick-wizard.module').then(m => m.OuickWizardModule),
|
||||||
|
@ -192,13 +204,7 @@ const appRoutes: Routes = [
|
||||||
title: 'GENERAL.TITLES.COOKIES-POLICY'
|
title: 'GENERAL.TITLES.COOKIES-POLICY'
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
{
|
|
||||||
path: 'home',
|
|
||||||
loadChildren: () => import('./ui/dashboard/dashboard.module').then(m => m.DashboardModule),
|
|
||||||
data: {
|
|
||||||
breadcrumb: true
|
|
||||||
}
|
|
||||||
},
|
|
||||||
// {
|
// {
|
||||||
// path: 'splash',
|
// path: 'splash',
|
||||||
// loadChildren: () => import('./ui/splash/splash.module').then(m => m.SplashModule),
|
// loadChildren: () => import('./ui/splash/splash.module').then(m => m.SplashModule),
|
||||||
|
|
|
@ -0,0 +1,4 @@
|
||||||
|
export enum RecentActivityItemType {
|
||||||
|
Dmp = 0,
|
||||||
|
Description = 1
|
||||||
|
}
|
|
@ -1,4 +1,9 @@
|
||||||
export enum RecentActivityOrder {
|
export enum RecentActivityOrder {
|
||||||
|
UpdatedAt = 0,
|
||||||
|
Label = 1,
|
||||||
|
Status = 2,
|
||||||
|
|
||||||
|
//TODO: delete them since these are from the prerefactor model
|
||||||
LABEL = "label",
|
LABEL = "label",
|
||||||
CREATED = "created",
|
CREATED = "created",
|
||||||
MODIFIED = "modified",
|
MODIFIED = "modified",
|
||||||
|
|
|
@ -1,5 +0,0 @@
|
||||||
export enum RecentActivityType {
|
|
||||||
Grant = 0,
|
|
||||||
Dataset = 1,
|
|
||||||
Dmp = 2
|
|
||||||
}
|
|
|
@ -1,6 +0,0 @@
|
||||||
export interface DashboardStatisticsModel {
|
|
||||||
totalDataManagementPlanCount: number;
|
|
||||||
totalGrantCount: number;
|
|
||||||
totalDataSetCount: number;
|
|
||||||
totalOrganisationCount: number;
|
|
||||||
}
|
|
|
@ -0,0 +1,6 @@
|
||||||
|
export interface DashboardStatistics {
|
||||||
|
dmpCount: number;
|
||||||
|
descriptionCount: number;
|
||||||
|
organizationCount: number;
|
||||||
|
grantCount: number;
|
||||||
|
}
|
|
@ -0,0 +1,9 @@
|
||||||
|
import { RecentActivityItemType } from "@app/core/common/enum/recent-activity-item-type";
|
||||||
|
import { Description } from "../description/description";
|
||||||
|
import { Dmp } from "../dmp/dmp";
|
||||||
|
|
||||||
|
export interface RecentActivityItem {
|
||||||
|
type: RecentActivityItemType;
|
||||||
|
dmp: Dmp;
|
||||||
|
description: Description;
|
||||||
|
}
|
|
@ -1,23 +0,0 @@
|
||||||
import { RecentActivityType } from '@app/core/common/enum/recent-activity-type';
|
|
||||||
import { UserInfoListingModel } from '../user/user-info-listing';
|
|
||||||
import { DatasetProfileModel } from '../dataset/dataset-profile';
|
|
||||||
|
|
||||||
export class RecentActivityModel {
|
|
||||||
id: string;
|
|
||||||
title: string;
|
|
||||||
description: String;
|
|
||||||
created: Date;
|
|
||||||
modified: Date;
|
|
||||||
status: number;
|
|
||||||
version: number;
|
|
||||||
grant: String;
|
|
||||||
grantAbbreviation: String;
|
|
||||||
grantId: String;
|
|
||||||
finalizedAt: Date;
|
|
||||||
publishedAt: Date;
|
|
||||||
profile: DatasetProfileModel;
|
|
||||||
type: RecentActivityType;
|
|
||||||
users: UserInfoListingModel[];
|
|
||||||
public: boolean;
|
|
||||||
}
|
|
||||||
|
|
|
@ -1,9 +0,0 @@
|
||||||
import { RecentActivityModel } from "./recent-activity.model";
|
|
||||||
|
|
||||||
export class RecentDatasetModel extends RecentActivityModel {
|
|
||||||
dmp: String;
|
|
||||||
dmpId: String;
|
|
||||||
dataRepositories: String;
|
|
||||||
registries: String;
|
|
||||||
services: String;
|
|
||||||
}
|
|
|
@ -1,10 +0,0 @@
|
||||||
import { DatasetUrlListing } from '../dataset/dataset-url-listing';
|
|
||||||
import { RecentActivityModel } from './recent-activity.model';
|
|
||||||
|
|
||||||
export class RecentDmpModel extends RecentActivityModel {
|
|
||||||
doi: String;
|
|
||||||
extraProperties: Map<String, any>;
|
|
||||||
datasets: DatasetUrlListing[];
|
|
||||||
organisations: String;
|
|
||||||
groupId: string;
|
|
||||||
}
|
|
|
@ -0,0 +1,25 @@
|
||||||
|
import { Lookup } from "@common/model/lookup";
|
||||||
|
import { RecentActivityOrder } from "../common/enum/recent-activity-order";
|
||||||
|
import { ReferenceType } from "../common/enum/reference-type";
|
||||||
|
|
||||||
|
export class RecentActivityItemLookup implements RecentActivityItemFilter {
|
||||||
|
like: string;
|
||||||
|
onlyDraft: boolean;
|
||||||
|
userIds: string;
|
||||||
|
page: Lookup.Paging;
|
||||||
|
project: Lookup.FieldDirectives;
|
||||||
|
orderField: RecentActivityOrder;
|
||||||
|
|
||||||
|
constructor() {
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
export interface RecentActivityItemFilter {
|
||||||
|
like: string;
|
||||||
|
onlyDraft: boolean;
|
||||||
|
userIds: string;
|
||||||
|
page: Lookup.Paging;
|
||||||
|
project: Lookup.FieldDirectives;
|
||||||
|
orderField: RecentActivityOrder;
|
||||||
|
}
|
|
@ -1,7 +0,0 @@
|
||||||
import { RecentActivityOrder } from '@app/core/common/enum/recent-activity-order';
|
|
||||||
import { BaseCriteria } from '../base-criteria';
|
|
||||||
|
|
||||||
export class RecentActivityCriteria extends BaseCriteria{
|
|
||||||
public status?: Number;
|
|
||||||
public order: RecentActivityOrder = RecentActivityOrder.MODIFIED;
|
|
||||||
}
|
|
|
@ -1,38 +1,38 @@
|
||||||
import { HttpHeaders } from '@angular/common/http';
|
import { HttpHeaders } from '@angular/common/http';
|
||||||
import { Injectable } from '@angular/core';
|
import { Injectable } from '@angular/core';
|
||||||
import { Observable } from 'rxjs';
|
import { DashboardStatistics } from '@app/core/model/dashboard/dashboard-statistics';
|
||||||
import { environment } from '../../../../environments/environment';
|
import { RecentActivityItem } from '@app/core/model/dashboard/recent-activity-item';
|
||||||
import { DashboardStatisticsModel } from '../../model/dashboard/dashboard-statistics-model';
|
import { RecentActivityItemLookup } from '@app/core/query/recent-activity-item-lookup.lookup';
|
||||||
import { BaseHttpService } from '../http/base-http.service';
|
import { Observable, throwError } from 'rxjs';
|
||||||
|
import { catchError } from 'rxjs/operators';
|
||||||
import { ConfigurationService } from '../configuration/configuration.service';
|
import { ConfigurationService } from '../configuration/configuration.service';
|
||||||
import { RecentActivityModel } from '@app/core/model/recent-activity/recent-activity.model';
|
import { BaseHttpV2Service } from '../http/base-http-v2.service';
|
||||||
import { RecentActivityCriteria } from '@app/core/query/recent-activity/recent-activity-criteria';
|
|
||||||
import { DataTableRequest, DataTableMultiTypeRequest } from '@app/core/model/data-table/data-table-request';
|
|
||||||
|
|
||||||
@Injectable()
|
@Injectable()
|
||||||
export class DashboardService {
|
export class DashboardService {
|
||||||
|
|
||||||
private headers: HttpHeaders;
|
private headers = new HttpHeaders();
|
||||||
|
|
||||||
|
constructor(
|
||||||
|
private http: BaseHttpV2Service,
|
||||||
|
private configurationService: ConfigurationService,
|
||||||
|
) {
|
||||||
|
}
|
||||||
|
|
||||||
private get apiBase(): string { return `${this.configurationService.server}dashboard`; }
|
private get apiBase(): string { return `${this.configurationService.server}dashboard`; }
|
||||||
|
|
||||||
|
getMyRecentActivityItems(q: RecentActivityItemLookup): Observable<RecentActivityItem[]> {
|
||||||
constructor(private http: BaseHttpService,
|
const url = `${this.apiBase}/mine/recent-activity`;
|
||||||
private configurationService: ConfigurationService) {
|
return this.http.post<RecentActivityItem[]>(url, q).pipe(catchError((error: any) => throwError(error)));
|
||||||
}
|
}
|
||||||
|
|
||||||
getStatistics(): Observable<DashboardStatisticsModel> {
|
getMyDashboardStatistics(): Observable<DashboardStatistics> {
|
||||||
return this.http.get<DashboardStatisticsModel>(`${this.apiBase}/getStatistics`, { headers: this.headers });
|
const url = `${this.apiBase}/mine/get-statistics`;
|
||||||
|
return this.http.get<DashboardStatistics>(url).pipe(catchError((error: any) => throwError(error)));
|
||||||
}
|
}
|
||||||
|
|
||||||
getUserStatistics(): Observable<DashboardStatisticsModel> {
|
getPublicDashboardStatistics(): Observable<DashboardStatistics> {
|
||||||
return this.http.get<DashboardStatisticsModel>(`${this.apiBase}/me/getStatistics`, { headers: this.headers });
|
const url = `${this.apiBase}/public/get-statistics`;
|
||||||
|
return this.http.get<DashboardStatistics>(url).pipe(catchError((error: any) => throwError(error)));
|
||||||
}
|
}
|
||||||
|
|
||||||
getRecentActivity(request: DataTableMultiTypeRequest<RecentActivityCriteria>): Observable<RecentActivityModel[]> {
|
|
||||||
return this.http.post<RecentActivityModel[]>(`${this.apiBase}/recentActivity`, request, {headers: this.headers});
|
|
||||||
}
|
|
||||||
|
|
||||||
// getRecentActivity(request: DataTableRequest<RecentActivityCriteria>): Observable<DataTableData<RecentActivityModel>> {
|
|
||||||
// return this.http.post<DataTableData<RecentActivityModel>>(this.actionUrl + 'recentActivity', request, {headers: this.headers});
|
|
||||||
// }
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,14 +0,0 @@
|
||||||
<div class="figure-card card">
|
|
||||||
<div class="card-header" [class.clickable]="isAuthenticated()" (click)="navigateToUrl()" [ngStyle]="{ 'background': linearColor, 'box-shadow': boxShadow }">
|
|
||||||
<i class="material-icons">{{ headerIcon }}</i>
|
|
||||||
</div>
|
|
||||||
<div class="card-content">
|
|
||||||
<p class="category">{{ category | translate }}</p>
|
|
||||||
<h3 class="title">{{ title }}</h3>
|
|
||||||
<button *ngIf="isAuthenticated()" mat-raised-button color="primary" (click)="createNew()">
|
|
||||||
<mat-icon>create_new_folder</mat-icon>
|
|
||||||
</button>
|
|
||||||
</div>
|
|
||||||
<div *ngIf="hasFootContent" class="card-footer">
|
|
||||||
</div>
|
|
||||||
</div>
|
|
|
@ -1,68 +0,0 @@
|
||||||
.figure-card {
|
|
||||||
display: inline-block;
|
|
||||||
position: relative;
|
|
||||||
width: 100%;
|
|
||||||
margin: 25px 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
.card-content {
|
|
||||||
text-align: center;
|
|
||||||
padding: 15px 20px 13px 20px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.card-header {
|
|
||||||
float: left;
|
|
||||||
text-align: center;
|
|
||||||
/*background: linear-gradient(60deg, #ffa726, #fb8c00);*/
|
|
||||||
/*box-shadow: 0 4px 20px 0 rgba(0, 0, 0, 0.14), 0 7px 10px -5px rgba(255, 152, 0, 0.4);*/
|
|
||||||
margin: -20px 15px 0;
|
|
||||||
border-radius: 3px;
|
|
||||||
padding: 15px;
|
|
||||||
position: relative;
|
|
||||||
}
|
|
||||||
|
|
||||||
.clickable{
|
|
||||||
cursor: pointer;
|
|
||||||
}
|
|
||||||
|
|
||||||
.card-header i {
|
|
||||||
font-size: 36px;
|
|
||||||
line-height: 56px;
|
|
||||||
width: 56px;
|
|
||||||
height: 56px;
|
|
||||||
color: #fff;
|
|
||||||
}
|
|
||||||
|
|
||||||
.category {
|
|
||||||
color: #999;
|
|
||||||
}
|
|
||||||
|
|
||||||
.card-footer {
|
|
||||||
margin: 0 20px 10px;
|
|
||||||
padding-top: 10px;
|
|
||||||
border-top: 1px solid #eee;
|
|
||||||
color: #999;
|
|
||||||
font-size: 12px;
|
|
||||||
position: relative;
|
|
||||||
}
|
|
||||||
|
|
||||||
.card-footer i {
|
|
||||||
font-size: 16px;
|
|
||||||
position: relative;
|
|
||||||
top: 4px;
|
|
||||||
color: #999;
|
|
||||||
}
|
|
||||||
|
|
||||||
.card {
|
|
||||||
padding: 25px 20px 20px 20px;
|
|
||||||
display: flex;
|
|
||||||
flex-direction: column;
|
|
||||||
align-items: center;
|
|
||||||
}
|
|
||||||
|
|
||||||
.card {
|
|
||||||
box-shadow: 0 1px 4px 0 rgba(0, 0, 0, 0.14);
|
|
||||||
border-radius: 6px;
|
|
||||||
color: rgba(0, 0, 0, 0.87);
|
|
||||||
background: #fff;
|
|
||||||
}
|
|
|
@ -1,41 +0,0 @@
|
||||||
import { Component, Input, OnInit } from '@angular/core';
|
|
||||||
import { Router } from '@angular/router';
|
|
||||||
import { AuthService } from '../../../core/services/auth/auth.service';
|
|
||||||
|
|
||||||
@Component({
|
|
||||||
selector: 'app-dashboard-card',
|
|
||||||
templateUrl: './card.component.html',
|
|
||||||
styleUrls: ['./card.component.scss']
|
|
||||||
})
|
|
||||||
export class CardComponent implements OnInit {
|
|
||||||
@Input() headerIcon: string;
|
|
||||||
@Input() category: string;
|
|
||||||
@Input() title: string;
|
|
||||||
@Input() footerIcon: string;
|
|
||||||
@Input() footContent: string;
|
|
||||||
@Input() linearColor: string;
|
|
||||||
@Input() boxShadow: string;
|
|
||||||
@Input() routelLink: string;
|
|
||||||
@Input() hasFootContent = false;
|
|
||||||
@Input() buttonTitle: string;
|
|
||||||
@Input() buttonRedirectLink: string;
|
|
||||||
|
|
||||||
constructor(private router: Router, private authService: AuthService) { }
|
|
||||||
|
|
||||||
ngOnInit() {
|
|
||||||
}
|
|
||||||
|
|
||||||
navigateToUrl() {
|
|
||||||
if (!this.isAuthenticated()) { return; }
|
|
||||||
this.router.navigate([this.routelLink]);
|
|
||||||
}
|
|
||||||
|
|
||||||
createNew() {
|
|
||||||
this.router.navigate([this.buttonRedirectLink]);
|
|
||||||
}
|
|
||||||
|
|
||||||
isAuthenticated() {
|
|
||||||
return this.authService.currentAccountIsAuthenticated();
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
|
@ -1,294 +1,168 @@
|
||||||
<div class="main-content dashboard-main-container h-100" [class.non-auth-main-container]="!this.isAuthenticated()">
|
<div class="main-content dashboard-main-container h-100" [class.non-auth-main-container]="!this.isAuthenticated()">
|
||||||
<div *ngIf="this.isAuthenticated()" class="container-fluid">
|
<div *ngIf="this.isAuthenticated()" class="container-fluid">
|
||||||
<div *ngIf="this.dashboardStatisticsData">
|
<div *ngIf="this.dashboardStatistics">
|
||||||
<div class="main-content">
|
<div class="main-content">
|
||||||
<div class="col">
|
<div class="col">
|
||||||
<div class="card col-auto mt-0" [style.display]="isVisible ? 'block' : 'none'">
|
<div class="card col-auto mt-0" [style.display]="isVisible ? 'block' : 'none'">
|
||||||
<a *ngIf="this.hasDmps()" class="col-auto d-flex" (click)="closeCard()"><span class="ml-auto mt-3 material-icons clear-icon">clear</span></a>
|
<a *ngIf="this.hasDmps()" class="col-auto d-flex" (click)="closeCard()"><span class="ml-auto mt-3 material-icons clear-icon">clear</span></a>
|
||||||
|
|
||||||
<p *ngIf="!this.hasDmps()" class="card-title mb-0 pt-4">{{'DASHBOARD.DMP-QUESTION' | translate}}</p>
|
<p *ngIf="!this.hasDmps()" class="card-title mb-0 pt-4">{{'DASHBOARD.DMP-QUESTION' | translate}}</p>
|
||||||
<p *ngIf="!this.hasDmps()" class="card-content mb-0">{{'DASHBOARD.INFO-DMP-TEXT' | translate}}</p>
|
<p *ngIf="!this.hasDmps()" class="card-content mb-0">{{'DASHBOARD.INFO-DMP-TEXT' | translate}}</p>
|
||||||
|
|
||||||
<p *ngIf="!this.hasDmps()" class="card-content pt-3 mb-0">
|
<p *ngIf="!this.hasDmps()" class="card-content pt-3 mb-0">
|
||||||
{{'DASHBOARD.NEW-QUESTION' | translate}} <a href="https://www.openaire.eu/how-to-create-a-data-management-plan" target="_blank"><u>{{'DASHBOARD.OPEN-AIR-GUIDE' | translate}}</u></a> {{'DASHBOARD.LEARN-MORE' | translate}}
|
{{'DASHBOARD.NEW-QUESTION' | translate}} <a href="https://www.openaire.eu/how-to-create-a-data-management-plan" target="_blank"><u>{{'DASHBOARD.OPEN-AIR-GUIDE' | translate}}</u></a> {{'DASHBOARD.LEARN-MORE' | translate}}
|
||||||
</p>
|
</p>
|
||||||
<p *ngIf="this.hasDmps()" class="card-content mb-0 pt-0">{{'DASHBOARD.DMP-ABOUT-BEG' | translate}}
|
<p *ngIf="this.hasDmps()" class="card-content mb-0 pt-0">{{'DASHBOARD.DMP-ABOUT-BEG' | translate}}
|
||||||
<b>{{'DASHBOARD.DATASET-DESCRIPTIONS-DASHBOARD-TEXT' | translate}}</b>
|
<b>{{'DASHBOARD.DATASET-DESCRIPTIONS-DASHBOARD-TEXT' | translate}}</b>
|
||||||
{{'DASHBOARD.DMP-ABOUT-END' | translate}}
|
{{'DASHBOARD.DMP-ABOUT-END' | translate}}
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
<div class="row d-flex align-items-center">
|
<div class="row d-flex align-items-center">
|
||||||
<div *ngIf="!this.hasDmps()" class="col-auto add-dataset-btn d-flex">
|
<div *ngIf="!this.hasDmps()" class="col-auto add-dataset-btn d-flex">
|
||||||
<button type="button" class="col-auto align-self-center normal-btn" (click)="openNewDmpDialog()">{{'DASHBOARD.START-YOUR-FIRST-DMP' | translate}}</button>
|
<button type="button" class="col-auto align-self-center normal-btn" (click)="openNewDmpDialog()">{{'DASHBOARD.START-YOUR-FIRST-DMP' | translate}}</button>
|
||||||
</div>
|
|
||||||
<div *ngIf="this.hasDmps()" class="new-dataset-tour add-dataset-btn col-auto d-flex">
|
|
||||||
<button mat-raised-button type="button" class="col-auto align-self-center yellow-btn" (click)="addNewDataset()">{{'DASHBOARD.ACTIONS.ADD-DESCRIPTION' | translate}}</button>
|
|
||||||
</div>
|
|
||||||
<span class="col-auto ml-auto">
|
|
||||||
<img class="laptop-img\6" src="../../../assets/images/dashboard-popup.png">
|
|
||||||
</span>
|
|
||||||
</div>
|
</div>
|
||||||
</div>
|
<div *ngIf="this.hasDmps()" class="new-dataset-tour add-dataset-btn col-auto d-flex">
|
||||||
|
<button mat-raised-button type="button" class="col-auto align-self-center yellow-btn" (click)="addNewDataset()">{{'DASHBOARD.ACTIONS.ADD-DESCRIPTION' | translate}}</button>
|
||||||
<div *ngIf="this.hasDmps()" class="col">
|
</div>
|
||||||
<div class="latest-activity-title">{{'DASHBOARD.LATEST-ACTIVITY' | translate}}</div>
|
<span class="col-auto ml-auto">
|
||||||
<mat-tab-group mat-align-tabs="start" class="remove-border-bottom"
|
<img class="laptop-img\6" src="../../../assets/images/dashboard-popup.png">
|
||||||
[selectedIndex]="indexFromCurrentType" (selectedTabChange)="currentType = $event.tab.ariaLabel">
|
</span>
|
||||||
<!-- <mat-tab aria-label="recent" label="{{'DASHBOARD.ALL' | translate}} ({{totalRecents}})">-->
|
|
||||||
<mat-tab aria-label="recent" label="{{'DASHBOARD.ALL' | translate}}">
|
|
||||||
<app-recent-edited-activity (totalCountRecentEdited)="onCountAllRecent($event)" [isActive]="currentType == 'recent'"></app-recent-edited-activity>
|
|
||||||
<div *ngIf="totalRecents === 0" class="empty-list">{{'DASHBOARD.EMPTY-LIST' | translate}}</div>
|
|
||||||
</mat-tab>
|
|
||||||
<!-- <mat-tab aria-label="draft" label="{{'DASHBOARD.DRAFTS' | translate}} ({{totalDraftDatasets}})">-->
|
|
||||||
<mat-tab aria-label="drafts" label="{{'DASHBOARD.DRAFTS' | translate}}">
|
|
||||||
<app-drafts (totalCountDraftDatasets)="onCountDraftDatasets($event)" [isActive]="currentType == 'drafts'"></app-drafts>
|
|
||||||
<div *ngIf="totalDraftDatasets === 0" class="empty-list">{{'DASHBOARD.EMPTY-LIST' | translate}}</div>
|
|
||||||
</mat-tab>>
|
|
||||||
<!-- <mat-tab aria-label="dmps" label="{{'DASHBOARD.DMPS' | translate}} ({{totalDmps}})">-->
|
|
||||||
<mat-tab aria-label="dmps" label="{{'DASHBOARD.DMPS' | translate}}">
|
|
||||||
<app-recent-edited-dmp-activity (totalCountDmps)="onCountDmps($event)" [isActive]="currentType == 'dmps'"></app-recent-edited-dmp-activity>
|
|
||||||
<div *ngIf="totalDmps === 0" class="empty-list">{{'DASHBOARD.EMPTY-LIST' | translate}}</div>
|
|
||||||
</mat-tab>
|
|
||||||
<!-- <mat-tab aria-label="datasets" label="{{'DASHBOARD.DESCRIPTIONS' | translate}} ({{totalDatasets}})">-->
|
|
||||||
<mat-tab aria-label="datasets" label="{{'DASHBOARD.DESCRIPTIONS' | translate}}">
|
|
||||||
<app-recent-edited-dataset-activity (totalCountDatasets)="onCountDatasets($event)" [isActive]="currentType == 'datasets'"></app-recent-edited-dataset-activity>
|
|
||||||
<div *ngIf="totalDatasets === 0" class="empty-list">{{'DASHBOARD.EMPTY-LIST' | translate}}</div>
|
|
||||||
<div *ngIf="totalDatasets === 0" class="col-auto d-flex justify-content-center">
|
|
||||||
<button mat-raised-button class="add-dataset" (click)="addNewDataset()">
|
|
||||||
<mat-icon>add</mat-icon> {{'DASHBOARD.ACTIONS.ADD-DESCRIPTION' | translate}}
|
|
||||||
</button>
|
|
||||||
</div>
|
|
||||||
</mat-tab>
|
|
||||||
</mat-tab-group>
|
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<!-- Right Sidebar -->
|
<div *ngIf="this.hasDmps()" class="col">
|
||||||
<div *ngIf="!this.hasDmps()" class="col-auto ml-auto stats">
|
<div class="latest-activity-title">{{'DASHBOARD.LATEST-ACTIVITY' | translate}}</div>
|
||||||
<div class="personal-usage">{{'DASHBOARD.PERSONAL-USAGE' | translate}}</div>
|
<mat-tab-group mat-align-tabs="start" class="remove-border-bottom" [selectedIndex]="indexFromCurrentType" (selectedTabChange)="currentType = $event.tab.ariaLabel">
|
||||||
<div class="counter-zero">0</div>
|
<mat-tab aria-label="recent" label="{{'DASHBOARD.ALL' | translate}}">
|
||||||
<a [routerLink]="['/plans']" class="link">{{'DASHBOARD.DMPS' | translate}}</a>
|
<app-recent-edited-activity (totalCountRecentEdited)="onCountAllRecent($event)" [isActive]="currentType == 'recent'"></app-recent-edited-activity>
|
||||||
<div class="counter-zero">0</div>
|
<div *ngIf="totalRecents === 0" class="empty-list">{{'DASHBOARD.EMPTY-LIST' | translate}}</div>
|
||||||
<a [routerLink]="['/datasets']" class="link">{{'DASHBOARD.DESCRIPTIONS' | translate}}</a>
|
</mat-tab>
|
||||||
<div class="counter-zero">0</div>
|
<mat-tab aria-label="drafts" label="{{'DASHBOARD.DRAFTS' | translate}}">
|
||||||
<a class="link-disabled">{{'DASHBOARD.GRANTS' | translate}}</a>
|
<app-drafts (totalCountDraftDatasets)="onCountDraftDatasets($event)" [isActive]="currentType == 'drafts'"></app-drafts>
|
||||||
<div class="counter-zero">0</div>
|
<div *ngIf="totalDraftDatasets === 0" class="empty-list">{{'DASHBOARD.EMPTY-LIST' | translate}}</div>
|
||||||
<a class="link-disabled">{{'DASHBOARD.RELATED-ORGANISATIONS' | translate}}</a>
|
</mat-tab>>
|
||||||
</div>
|
<mat-tab aria-label="dmps" label="{{'DASHBOARD.DMPS' | translate}}">
|
||||||
|
<app-recent-edited-dmp-activity (totalCountDmps)="onCountDmps($event)" [isActive]="currentType == 'dmps'"></app-recent-edited-dmp-activity>
|
||||||
<div *ngIf="this.hasDmps()" class="col-auto stats">
|
<div *ngIf="totalDmps === 0" class="empty-list">{{'DASHBOARD.EMPTY-LIST' | translate}}</div>
|
||||||
<div class="personal-usage">{{'DASHBOARD.PERSONAL-USAGE' | translate}}</div>
|
</mat-tab>
|
||||||
<div [ngClass]="{'counter': dashboardStatisticsData?.totalDataManagementPlanCount != 0, 'counter-zero': dashboardStatisticsData?.totalDataManagementPlanCount == 0}">
|
<mat-tab aria-label="datasets" label="{{'DASHBOARD.DESCRIPTIONS' | translate}}">
|
||||||
{{dashboardStatisticsData?.totalDataManagementPlanCount}}</div>
|
<app-recent-edited-dataset-activity (totalCountDatasets)="onCountDatasets($event)" [isActive]="currentType == 'datasets'"></app-recent-edited-dataset-activity>
|
||||||
<a [routerLink]="['/plans']" class="link">{{'DASHBOARD.DMPS' | translate}}</a>
|
<div *ngIf="totalDatasets === 0" class="empty-list">{{'DASHBOARD.EMPTY-LIST' | translate}}</div>
|
||||||
<div [ngClass]="{'counter': dashboardStatisticsData?.totalDataSetCount != 0, 'counter-zero': dashboardStatisticsData?.totalDataSetCount == 0}">
|
<div *ngIf="totalDatasets === 0" class="col-auto d-flex justify-content-center">
|
||||||
{{dashboardStatisticsData?.totalDataSetCount}}</div>
|
<button mat-raised-button class="add-dataset" (click)="addNewDataset()">
|
||||||
<a [routerLink]="['/datasets']" class="link">{{'DASHBOARD.DESCRIPTIONS' | translate}}</a>
|
<mat-icon>add</mat-icon> {{'DASHBOARD.ACTIONS.ADD-DESCRIPTION' | translate}}
|
||||||
<div [ngClass]="{'counter': dashboardStatisticsData?.totalGrantCount != 0, 'counter-zero': dashboardStatisticsData?.totalGrantCount == 0}">
|
</button>
|
||||||
{{dashboardStatisticsData?.totalGrantCount}}</div>
|
</div>
|
||||||
<a href="#" class="link-disabled">{{'DASHBOARD.GRANTS' | translate}}</a>
|
</mat-tab>
|
||||||
<div [ngClass]="{'counter': dashboardStatisticsData?.totalOrganisationCount != 0, 'counter-zero': dashboardStatisticsData?.totalOrganisationCount == 0}">
|
</mat-tab-group>
|
||||||
{{dashboardStatisticsData?.totalOrganisationCount}}</div>
|
|
||||||
<a href="#" class="link-disabled">{{'DASHBOARD.RELATED-ORGANISATIONS' | translate}}</a>
|
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
</div>
|
<!-- Right Sidebar -->
|
||||||
|
<div *ngIf="!this.hasDmps()" class="col-auto ml-auto stats">
|
||||||
<div>
|
<div class="personal-usage">{{'DASHBOARD.PERSONAL-USAGE' | translate}}</div>
|
||||||
<div class="main-content">
|
<div class="counter-zero">0</div>
|
||||||
|
<a [routerLink]="['/plans']" class="link">{{'DASHBOARD.DMPS' | translate}}</a>
|
||||||
|
<div class="counter-zero">0</div>
|
||||||
|
<a [routerLink]="['/datasets']" class="link">{{'DASHBOARD.DESCRIPTIONS' | translate}}</a>
|
||||||
|
<div class="counter-zero">0</div>
|
||||||
|
<a class="link-disabled">{{'DASHBOARD.GRANTS' | translate}}</a>
|
||||||
|
<div class="counter-zero">0</div>
|
||||||
|
<a class="link-disabled">{{'DASHBOARD.RELATED-ORGANISATIONS' | translate}}</a>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div *ngIf="this.hasDmps()" class="col-auto stats">
|
||||||
|
<div class="personal-usage">{{'DASHBOARD.PERSONAL-USAGE' | translate}}</div>
|
||||||
|
<div [ngClass]="{'counter': dashboardStatistics?.dmpCount != 0, 'counter-zero': dashboardStatistics?.dmpCount == 0}">
|
||||||
|
{{dashboardStatistics?.dmpCount}}</div>
|
||||||
|
<a [routerLink]="['/plans']" class="link">{{'DASHBOARD.DMPS' | translate}}</a>
|
||||||
|
<div [ngClass]="{'counter': dashboardStatistics?.descriptionCount != 0, 'counter-zero': dashboardStatistics?.descriptionCount == 0}">
|
||||||
|
{{dashboardStatistics?.descriptionCount}}</div>
|
||||||
|
<a [routerLink]="['/datasets']" class="link">{{'DASHBOARD.DESCRIPTIONS' | translate}}</a>
|
||||||
|
<div [ngClass]="{'counter': dashboardStatistics?.grantCount != 0, 'counter-zero': dashboardStatistics?.grantCount == 0}">
|
||||||
|
{{dashboardStatistics?.grantCount}}</div>
|
||||||
|
<a href="#" class="link-disabled">{{'DASHBOARD.GRANTS' | translate}}</a>
|
||||||
|
<div [ngClass]="{'counter': dashboardStatistics?.organizationCount != 0, 'counter-zero': dashboardStatistics?.organizationCount == 0}">
|
||||||
|
{{dashboardStatistics?.organizationCount}}</div>
|
||||||
|
<a href="#" class="link-disabled">{{'DASHBOARD.RELATED-ORGANISATIONS' | translate}}</a>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<!-- Home screen on log out -->
|
<div>
|
||||||
<div class="col p-0" *ngIf="!this.isAuthenticated()">
|
<div class="main-content">
|
||||||
<div class="col-auto">
|
|
||||||
<!-- <div class="row">
|
|
||||||
<div class="col header-text-container">
|
|
||||||
<h3>{{ 'ABOUT.WELCOME' | translate }}</h3>
|
|
||||||
<h4>{{ 'ABOUT.WELCOME-MESSAGE' | translate }}</h4>
|
|
||||||
</div>
|
|
||||||
</div> -->
|
|
||||||
<div class="main-content">
|
|
||||||
<div class="col">
|
|
||||||
<div class="row">
|
|
||||||
<div class="col d-flex flex-column">
|
|
||||||
<div class="card non-auth-card" [style.display]="isVisible ? 'block' : 'none'">
|
|
||||||
<a class="col-auto d-flex" (click)="closeCard()"><span class="ml-auto mt-3 material-icons clear-icon">clear</span></a>
|
|
||||||
<div class="d-flex flex-column align-items-center non-auth-title-container">
|
|
||||||
<h4 class="pt-4">{{'DASHBOARD.TITLE' | translate}}</h4>
|
|
||||||
<p class="col-auto app-info">{{'DASHBOARD.INFO-TEXT' | translate}}</p>
|
|
||||||
</div>
|
|
||||||
<div class="d-flex">
|
|
||||||
<!-- <button type="button" class="col-auto align-self-center normal-btn" (click)="openNewDmpDialog()">{{'DASHBOARD.START-YOUR-FIRST-DMP' | translate}}</button> -->
|
|
||||||
<img class="col-auto ml-auto laptop-img" src="../../../assets/images/dashboard-popup.png">
|
|
||||||
<!-- <img class="col-auto ml-auto laptop-img"> -->
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<div *ngIf="hasDmps()" class="col activity">
|
|
||||||
<div class="latest-activity-title">{{'DASHBOARD.LATEST-ACTIVITY' | translate}}</div>
|
|
||||||
<mat-tab-group mat-align-tabs="start" class="remove-border-bottom" (
|
|
||||||
[selectedIndex]="indexFromCurrentType" selectedTabChange)="currentType = $event.tab.ariaLabel">
|
|
||||||
<!-- <mat-tab aria-label="recent" label="{{'DASHBOARD.ALL' | translate}} ({{totalRecents}})">-->
|
|
||||||
<mat-tab aria-label="recent" label="{{'DASHBOARD.ALL' | translate}}">
|
|
||||||
<app-recent-edited-activity (totalCountRecentEdited)="onCountAllRecent($event)" [isActive]="currentType == 'recent'"></app-recent-edited-activity>
|
|
||||||
<div *ngIf="totalRecents === 0" class="empty-list">{{'DASHBOARD.EMPTY-LIST' | translate}}</div>
|
|
||||||
</mat-tab>
|
|
||||||
<!-- <mat-tab aria-label="dmps" label="{{'DASHBOARD.PUBLIC-DMPS' | translate}} ({{totalDmps}})">-->
|
|
||||||
<mat-tab aria-label="dmps" label="{{'DASHBOARD.PUBLIC-DMPS' | translate}}">
|
|
||||||
<app-recent-edited-dmp-activity (totalCountDmps)="onCountDmps($event)" [isActive]="currentType == 'dmps'"></app-recent-edited-dmp-activity>
|
|
||||||
<div *ngIf="totalDmps === 0" class="empty-list">{{'DASHBOARD.EMPTY-LIST' | translate}}</div>
|
|
||||||
</mat-tab>
|
|
||||||
<!-- <mat-tab aria-label="datasets" label="{{'DASHBOARD.PUBLIC-DATASETS' | translate}} ({{totalDatasets}})">-->
|
|
||||||
<mat-tab aria-label="datasets" label="{{'DASHBOARD.PUBLIC-DATASETS' | translate}}">
|
|
||||||
<app-recent-edited-dataset-activity (totalCountDatasets)="onCountDatasets($event)" [isActive]="currentType == 'datasets'"></app-recent-edited-dataset-activity>
|
|
||||||
<div *ngIf="totalDatasets === 0" class="empty-list">{{'DASHBOARD.EMPTY-LIST' | translate}}</div>
|
|
||||||
<!-- <div *ngIf="totalDatasets === 0" class="col-auto d-flex justify-content-center">
|
|
||||||
<button mat-raised-button class="add-dataset" [routerLink]="['/datasets/new']">
|
|
||||||
<mat-icon>add</mat-icon> {{'DASHBOARD.ACTIONS.ADD-DESCRIPTION' | translate}}
|
|
||||||
</button>
|
|
||||||
</div> -->
|
|
||||||
</mat-tab>
|
|
||||||
</mat-tab-group>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<div class="col-auto">
|
|
||||||
<div *ngIf="!hasDmps()" class="ml-auto pl-4 personal-usage-block">
|
|
||||||
<div class="personal-usage">{{'DASHBOARD.PUBLIC-USAGE' | translate}}</div>
|
|
||||||
<div class="counter-zero">0</div>
|
|
||||||
<a>{{'DASHBOARD.PUBLIC-DMPS' | translate}}</a>
|
|
||||||
<div class="counter-zero">0</div>
|
|
||||||
<a>{{'DASHBOARD.PUBLIC-DATASETS' | translate}}</a>
|
|
||||||
<div class="counter-zero">0</div>
|
|
||||||
<a class="link-disabled">{{'DASHBOARD.GRANTS' | translate}}</a>
|
|
||||||
<div class="counter-zero">0</div>
|
|
||||||
<a class="link-disabled">{{'DASHBOARD.RELATED-ORGANISATIONS' | translate}}</a>
|
|
||||||
</div>
|
|
||||||
<div *ngIf="hasDmps()" class="ml-auto stats">
|
|
||||||
<div class="personal-usage">{{'DASHBOARD.PUBLIC-USAGE' | translate}}</div>
|
|
||||||
<div [ngClass]="{'counter': dashboardStatisticsData?.totalDataManagementPlanCount != 0, 'counter-zero': dashboardStatisticsData?.totalDataManagementPlanCount == 0}">
|
|
||||||
{{dashboardStatisticsData?.totalDataManagementPlanCount}}</div>
|
|
||||||
<a [routerLink]="['/plans']" class="link">{{'DASHBOARD.PUBLIC-DMPS' | translate}}</a>
|
|
||||||
<div [ngClass]="{'counter': dashboardStatisticsData?.totalDataSetCount != 0, 'counter-zero': dashboardStatisticsData?.totalDataSetCount == 0}">
|
|
||||||
{{dashboardStatisticsData?.totalDataSetCount}}</div>
|
|
||||||
<a [routerLink]="['/datasets']" class="link">{{'DASHBOARD.PUBLIC-DATASETS' | translate}}</a>
|
|
||||||
<div [ngClass]="{'counter': dashboardStatisticsData?.totalGrantCount != 0, 'counter-zero': dashboardStatisticsData?.totalGrantCount == 0}">
|
|
||||||
{{dashboardStatisticsData?.totalGrantCount}}</div>
|
|
||||||
<a href="#" class="link-disabled">{{'DASHBOARD.GRANTS' | translate}}</a>
|
|
||||||
<div [ngClass]="{'counter': dashboardStatisticsData?.totalOrganisationCount != 0, 'counter-zero': dashboardStatisticsData?.totalOrganisationCount == 0}">
|
|
||||||
{{dashboardStatisticsData?.totalOrganisationCount}}</div>
|
|
||||||
<a href="#" class="link-disabled">{{'DASHBOARD.RELATED-ORGANISATIONS' | translate}}</a>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
<!-- Home screen on log out -->
|
||||||
|
<div class="col p-0" *ngIf="!this.isAuthenticated()">
|
||||||
<!-- <div class="header-image">
|
<div class="col-auto">
|
||||||
<div class="header-text-container">
|
<div class="main-content">
|
||||||
<h3>{{ 'ABOUT.WELCOME' | translate }}</h3>
|
<div class="col">
|
||||||
<h4>{{ 'ABOUT.WELCOME-MESSAGE' | translate }}</h4>
|
<div class="row">
|
||||||
|
<div class="col d-flex flex-column">
|
||||||
|
<div class="card non-auth-card" [style.display]="isVisible ? 'block' : 'none'">
|
||||||
|
<a class="col-auto d-flex" (click)="closeCard()"><span class="ml-auto mt-3 material-icons clear-icon">clear</span></a>
|
||||||
|
<div class="d-flex flex-column align-items-center non-auth-title-container">
|
||||||
|
<h4 class="pt-4">{{'DASHBOARD.TITLE' | translate}}</h4>
|
||||||
|
<p class="col-auto app-info">{{'DASHBOARD.INFO-TEXT' | translate}}</p>
|
||||||
|
</div>
|
||||||
|
<div class="d-flex">
|
||||||
|
<img class="col-auto ml-auto laptop-img" src="../../../assets/images/dashboard-popup.png">
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<!-- <div *ngIf="hasDmps()" class="col activity">
|
||||||
|
<div class="latest-activity-title">{{'DASHBOARD.LATEST-ACTIVITY' | translate}}</div>
|
||||||
|
<mat-tab-group mat-align-tabs="start" class="remove-border-bottom" ( [selectedIndex]="indexFromCurrentType" selectedTabChange)="currentType = $event.tab.ariaLabel">
|
||||||
|
<mat-tab aria-label="recent" label="{{'DASHBOARD.ALL' | translate}}">
|
||||||
|
<app-recent-edited-activity (totalCountRecentEdited)="onCountAllRecent($event)" [isActive]="currentType == 'recent'"></app-recent-edited-activity>
|
||||||
|
<div *ngIf="totalRecents === 0" class="empty-list">{{'DASHBOARD.EMPTY-LIST' | translate}}</div>
|
||||||
|
</mat-tab>
|
||||||
|
<mat-tab aria-label="dmps" label="{{'DASHBOARD.PUBLIC-DMPS' | translate}}">
|
||||||
|
<app-recent-edited-dmp-activity (totalCountDmps)="onCountDmps($event)" [isActive]="currentType == 'dmps'"></app-recent-edited-dmp-activity>
|
||||||
|
<div *ngIf="totalDmps === 0" class="empty-list">{{'DASHBOARD.EMPTY-LIST' | translate}}</div>
|
||||||
|
</mat-tab>
|
||||||
|
<mat-tab aria-label="datasets" label="{{'DASHBOARD.PUBLIC-DATASETS' | translate}}">
|
||||||
|
<app-recent-edited-dataset-activity (totalCountDatasets)="onCountDatasets($event)" [isActive]="currentType == 'datasets'"></app-recent-edited-dataset-activity>
|
||||||
|
<div *ngIf="totalDatasets === 0" class="empty-list">{{'DASHBOARD.EMPTY-LIST' | translate}}</div>
|
||||||
|
</mat-tab>
|
||||||
|
</mat-tab-group>
|
||||||
|
</div> -->
|
||||||
|
</div>
|
||||||
|
<div class="col-auto">
|
||||||
|
<div *ngIf="!hasDmps()" class="ml-auto pl-4 personal-usage-block">
|
||||||
|
<div class="personal-usage">{{'DASHBOARD.PUBLIC-USAGE' | translate}}</div>
|
||||||
|
<div class="counter-zero">0</div>
|
||||||
|
<a>{{'DASHBOARD.PUBLIC-DMPS' | translate}}</a>
|
||||||
|
<div class="counter-zero">0</div>
|
||||||
|
<a>{{'DASHBOARD.PUBLIC-DATASETS' | translate}}</a>
|
||||||
|
<div class="counter-zero">0</div>
|
||||||
|
<a class="link-disabled">{{'DASHBOARD.GRANTS' | translate}}</a>
|
||||||
|
<div class="counter-zero">0</div>
|
||||||
|
<a class="link-disabled">{{'DASHBOARD.RELATED-ORGANISATIONS' | translate}}</a>
|
||||||
|
</div>
|
||||||
|
<div *ngIf="hasDmps()" class="ml-auto stats">
|
||||||
|
<div class="personal-usage">{{'DASHBOARD.PUBLIC-USAGE' | translate}}</div>
|
||||||
|
<div [ngClass]="{'counter': dashboardStatistics?.dmpCount != 0, 'counter-zero': dashboardStatistics?.dmpCount == 0}">
|
||||||
|
{{dashboardStatistics?.dmpCount}}</div>
|
||||||
|
<a [routerLink]="['/plans']" class="link">{{'DASHBOARD.PUBLIC-DMPS' | translate}}</a>
|
||||||
|
<div [ngClass]="{'counter': dashboardStatistics?.descriptionCount != 0, 'counter-zero': dashboardStatistics?.descriptionCount == 0}">
|
||||||
|
{{dashboardStatistics?.descriptionCount}}</div>
|
||||||
|
<a [routerLink]="['/datasets']" class="link">{{'DASHBOARD.PUBLIC-DATASETS' | translate}}</a>
|
||||||
|
<div [ngClass]="{'counter': dashboardStatistics?.grantCount != 0, 'counter-zero': dashboardStatistics?.grantCount == 0}">
|
||||||
|
{{dashboardStatistics?.grantCount}}</div>
|
||||||
|
<a href="#" class="link-disabled">{{'DASHBOARD.GRANTS' | translate}}</a>
|
||||||
|
<div [ngClass]="{'counter': dashboardStatistics?.organizationCount != 0, 'counter-zero': dashboardStatistics?.organizationCount == 0}">
|
||||||
|
{{dashboardStatistics?.organizationCount}}</div>
|
||||||
|
<a href="#" class="link-disabled">{{'DASHBOARD.RELATED-ORGANISATIONS' | translate}}</a>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="main-content dashboard-main-container" [class.non-auth-main-container]="!this.isAuthenticated()">
|
|
||||||
<div *ngIf="this.isAuthenticated()" class="container-fluid">
|
|
||||||
<div class="row" *ngIf="this.isAuthenticated()">
|
|
||||||
<div class="col-sm-6 col-md-6 col-lg-6">
|
|
||||||
<app-wizard title="{{'QUICKWIZARD.CREATE-ADD.CREATE.TITLE' | translate}}" subtitle="{{'QUICKWIZARD.CREATE-ADD.CREATE.SUBTITLE' | translate}}" routerLink="/quick-wizard" icon="play_circle_outline">
|
|
||||||
</app-wizard>
|
|
||||||
</div>
|
|
||||||
<div class="col-sm-6 col-md-6 col-lg-6">
|
|
||||||
<app-wizard title="{{'QUICKWIZARD.CREATE-ADD.ADD.TITLE' | translate}}" subtitle="{{'QUICKWIZARD.CREATE-ADD.ADD.SUBTITLE' | translate}}" routerLink="/datasetcreatewizard" icon="play_circle_outline"></app-wizard>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<div class="row">
|
|
||||||
<div class="col-md-9">
|
|
||||||
<div class="row">
|
|
||||||
<div class="col-lg-3 col-md-6 col-sm-6">
|
|
||||||
<app-info-counter [title]="'DASHBOARD.MY-DMPS'" [subtitle]="dashboardStatisticsData?.totalDataManagementPlanCount" routerLink='/plans' buttonRedirectLink="/plans/new" icon="view_agenda"></app-info-counter>
|
|
||||||
</div>
|
|
||||||
<div class="col-lg-3 col-md-6 col-sm-6">
|
|
||||||
<app-info-counter [title]="'DASHBOARD.MY-DATASETS'" [subtitle]="dashboardStatisticsData?.totalDataSetCount" routerLink='/datasets' buttonRedirectLink="/datasets/new" icon="library_books"></app-info-counter>
|
|
||||||
</div>
|
|
||||||
<div class="col-lg-3 col-md-6 col-sm-6">
|
|
||||||
<app-info-counter [title]="'DASHBOARD.MY-GRANTS'" [subtitle]="dashboardStatisticsData?.totalGrantCount" icon="work_outline"></app-info-counter>
|
|
||||||
</div>
|
|
||||||
<div class="col-lg-3 col-md-6 col-sm-6">
|
|
||||||
<app-info-counter [title]="'DASHBOARD.ORGANIZATIONS'" [subtitle]="dashboardStatisticsData?.totalOrganisationCount" icon="scatter_plot">
|
|
||||||
</app-info-counter>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<div class="row">
|
|
||||||
<div class="col-lg-12 col-md-12">
|
|
||||||
<app-recent-edited-activity></app-recent-edited-activity>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<div class="col-md-3">
|
|
||||||
<app-drafts></app-drafts>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<div *ngIf="!this.isAuthenticated()" class="container-fluid">
|
|
||||||
<div class="row non-auth-stats">
|
|
||||||
<div class="col-lg-3 col-md-6 col-sm-6">
|
|
||||||
<app-info-counter [title]="'DASHBOARD.DMPS'" [subtitle]="dashboardStatisticsData?.totalDataManagementPlanCount" routerLink='/explore-plans' buttonRedirectLink="/plans/new" icon="view_agenda"></app-info-counter>
|
|
||||||
</div>
|
|
||||||
<div class="col-lg-3 col-md-6 col-sm-6">
|
|
||||||
<app-info-counter [title]="'DASHBOARD.DATASETS'" [subtitle]="dashboardStatisticsData?.totalDataSetCount" routerLink='/explore' buttonRedirectLink="/datasets/new" icon="library_books"></app-info-counter>
|
|
||||||
</div>
|
|
||||||
<div class="col-lg-3 col-md-6 col-sm-6">
|
|
||||||
<app-info-counter [title]="'DASHBOARD.GRANTS'" [subtitle]="dashboardStatisticsData?.totalGrantCount" icon="work_outline"></app-info-counter>
|
|
||||||
</div>
|
|
||||||
<div class="col-lg-3 col-md-6 col-sm-6">
|
|
||||||
<app-info-counter title="Related Organizations" [subtitle]="dashboardStatisticsData?.totalOrganisationCount" icon="scatter_plot"></app-info-counter>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<div class="d-flex flex-column align-items-center non-auth-title-container">
|
|
||||||
<h4>{{'DASHBOARD.TITLE' | translate}}</h4>
|
|
||||||
<p>{{'DASHBOARD.INFO-TEXT' | translate}}</p>
|
|
||||||
</div>
|
|
||||||
<div class="row">
|
|
||||||
<div class="col-lg-6 mt-4">
|
|
||||||
<div class="title">
|
|
||||||
<h4> {{'DASHBOARD.DATA-MANAGEMENT-PLANS' | translate}} </h4>
|
|
||||||
<div class="info">
|
|
||||||
<p class="subtitle">{{ dashboardStatisticsData?.totalDataManagementPlanCount }} {{'HOME.DMPS' | translate}}</p>
|
|
||||||
<a class="view-all" [routerLink]="['/explore-plans']">{{ 'GENERAL.ACTIONS.VIEW-ALL' | translate }}</a>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<mat-divider></mat-divider>
|
|
||||||
<div *ngFor="let dmp of dmpListingItems">
|
|
||||||
<app-dmp-info-counter [dmp]="dmp" (onClick)="dmpClicked($event)"></app-dmp-info-counter>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<div class="col-lg-6 mt-4">
|
|
||||||
<div class="row">
|
|
||||||
<div class="col-12 title">
|
|
||||||
<h4> DATASETS </h4>
|
|
||||||
<div class="info">
|
|
||||||
<p class="subtitle">{{ dashboardStatisticsData?.totalDataSetCount }} {{'HOME.DATASETS' | translate}}</p>
|
|
||||||
<a class="view-all" [routerLink]="['/explore']">{{ 'GENERAL.ACTIONS.VIEW-ALL' | translate }}</a>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<mat-divider class="col-12"></mat-divider>
|
|
||||||
<div class="col-12">
|
|
||||||
<div class="row">
|
|
||||||
<div *ngFor="let dataset of datasetListingItems" class="col-md-6">
|
|
||||||
<app-dataset-info-counter [dataset]="dataset" (onClick)="datasetClicked($event)">
|
|
||||||
</app-dataset-info-counter>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div> -->
|
|
||||||
|
|
|
@ -424,130 +424,3 @@ input[type="text"] {
|
||||||
::ng-deep .mat-form-field-appearance-outline .mat-form-field-infix {
|
::ng-deep .mat-form-field-appearance-outline .mat-form-field-infix {
|
||||||
padding: 0.3rem 0rem 0.6rem 0rem !important;
|
padding: 0.3rem 0rem 0.6rem 0rem !important;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* ::ng-deep .mat-tab-group {
|
|
||||||
height: 100%;
|
|
||||||
}
|
|
||||||
|
|
||||||
::ng-deep .mat-tab-body-wrapper {
|
|
||||||
flex-grow: 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
::ng-deep .mat-tab-body {
|
|
||||||
display: flex !important;
|
|
||||||
flex-direction: column;
|
|
||||||
}
|
|
||||||
|
|
||||||
::ng-deep .mat-tab-body-content {
|
|
||||||
display: flex;
|
|
||||||
flex-direction: column;
|
|
||||||
flex-grow: 1;
|
|
||||||
} */
|
|
||||||
|
|
||||||
// .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;
|
|
||||||
// }
|
|
||||||
|
|
||||||
// .dashboard-main-container {
|
|
||||||
// margin-top: 0px;
|
|
||||||
// }
|
|
||||||
|
|
||||||
// .non-auth-main-container {
|
|
||||||
// padding: 0;
|
|
||||||
// }
|
|
||||||
|
|
||||||
// .non-auth-stats {
|
|
||||||
// background-color: rgba(255, 255, 255, 0.5);
|
|
||||||
// }
|
|
||||||
|
|
||||||
// .non-auth-title-container {
|
|
||||||
// margin-top: 3em;
|
|
||||||
// }
|
|
||||||
|
|
||||||
// .dashboard {
|
|
||||||
// .card {
|
|
||||||
// padding: 25px 20px 20px 20px;
|
|
||||||
// display: flex;
|
|
||||||
// flex-direction: column;
|
|
||||||
// align-items: center;
|
|
||||||
// }
|
|
||||||
|
|
||||||
// .card h6,
|
|
||||||
// p {
|
|
||||||
// color: #999;
|
|
||||||
// }
|
|
||||||
|
|
||||||
// .icon {
|
|
||||||
// margin-top: 20px;
|
|
||||||
// width: 130px;
|
|
||||||
// height: 130px;
|
|
||||||
// border: 1px solid #e5e5e5;
|
|
||||||
// border-radius: 50%;
|
|
||||||
// display: flex;
|
|
||||||
// justify-content: center;
|
|
||||||
// align-items: center;
|
|
||||||
// }
|
|
||||||
|
|
||||||
// .icon i {
|
|
||||||
// font-size: 55px;
|
|
||||||
// color: #e91e63;
|
|
||||||
// }
|
|
||||||
|
|
||||||
// .card-title {
|
|
||||||
// margin-top: 30px;
|
|
||||||
// margin-bottom: 3px;
|
|
||||||
// }
|
|
||||||
|
|
||||||
// .card-description {
|
|
||||||
// margin-bottom: 20px;
|
|
||||||
// }
|
|
||||||
|
|
||||||
// .card-dataset {
|
|
||||||
// display: flex;
|
|
||||||
// flex-direction: column;
|
|
||||||
// padding: 20px;
|
|
||||||
// position: relative;
|
|
||||||
// margin-top: 40px;
|
|
||||||
// }
|
|
||||||
|
|
||||||
// .card {
|
|
||||||
// box-shadow: 0 1px 4px 0 rgba(0, 0, 0, 0.14);
|
|
||||||
// border-radius: 6px;
|
|
||||||
// color: rgba(0, 0, 0, 0.87);
|
|
||||||
// background: #fff;
|
|
||||||
// }
|
|
||||||
|
|
||||||
// .card-raised {
|
|
||||||
// box-shadow: 0 10px 30px -12px rgba(0, 0, 0, 0.42), 0 4px 25px 0px rgba(0, 0, 0, 0.12),
|
|
||||||
// 0 8px 10px -5px rgba(0, 0, 0, 0.2);
|
|
||||||
// }
|
|
||||||
|
|
||||||
// .full-width {
|
|
||||||
// width: 100%;
|
|
||||||
// }
|
|
||||||
// }
|
|
||||||
|
|
||||||
// .info {
|
|
||||||
// display: flex;
|
|
||||||
// flex-wrap: nowrap;
|
|
||||||
// }
|
|
||||||
|
|
||||||
// .subtitle {
|
|
||||||
// margin-bottom: 0px !important;
|
|
||||||
// }
|
|
||||||
|
|
||||||
// .view-all {
|
|
||||||
// margin-left: auto;
|
|
||||||
// margin-bottom: 0px !important;
|
|
||||||
// color: #6aa4d9;
|
|
||||||
// }
|
|
||||||
|
|
||||||
// .view-all:hover {
|
|
||||||
// color: rgb(46, 117, 182) !important;
|
|
||||||
// }
|
|
||||||
|
|
|
@ -1,38 +1,17 @@
|
||||||
|
|
||||||
import { Component, OnInit } from '@angular/core';
|
import { Component, OnInit } from '@angular/core';
|
||||||
import { UntypedFormControl } from '@angular/forms';
|
import { MatDialog } from '@angular/material/dialog';
|
||||||
import { ActivatedRoute, Router } from '@angular/router';
|
import { ActivatedRoute, Router } from '@angular/router';
|
||||||
import { RecentActivityType } from '@app/core/common/enum/recent-activity-type';
|
import { DashboardStatistics } from '@app/core/model/dashboard/dashboard-statistics';
|
||||||
import { DashboardStatisticsModel } from '@app/core/model/dashboard/dashboard-statistics-model';
|
|
||||||
import { SearchBarItem } from '@app/core/model/dashboard/search-bar-item';
|
|
||||||
import { DataTableRequest } from '@app/core/model/data-table/data-table-request';
|
|
||||||
import { DatasetListingModel } from '@app/core/model/dataset/dataset-listing';
|
|
||||||
import { DmpListingModel } from '@app/core/model/dmp/dmp-listing';
|
|
||||||
import { GrantCriteria } from '@app/core/query/grant/grant-criteria';
|
|
||||||
import { RequestItem } from '@app/core/query/request-item';
|
|
||||||
import { AuthService } from '@app/core/services/auth/auth.service';
|
import { AuthService } from '@app/core/services/auth/auth.service';
|
||||||
import { DashboardService } from '@app/core/services/dashboard/dashboard.service';
|
import { DashboardService } from '@app/core/services/dashboard/dashboard.service';
|
||||||
import { DatasetService } from '@app/core/services/dataset/dataset.service';
|
|
||||||
import { DmpService } from '@app/core/services/dmp/dmp.service';
|
|
||||||
import { GrantService } from '@app/core/services/grant/grant.service';
|
|
||||||
import { SearchBarService } from '@app/core/services/search-bar/search-bar.service';
|
|
||||||
import { UserServiceOld } from '@app/core/services/user/user.service-old';
|
|
||||||
import { SingleAutoCompleteConfiguration } from '@app/library/auto-complete/single/single-auto-complete-configuration';
|
|
||||||
import { BaseComponent } from '@common/base/base.component';
|
|
||||||
import { Observable, of as observableOf } from 'rxjs';
|
|
||||||
import { mergeMap, takeUntil } from 'rxjs/operators';
|
|
||||||
import { DmpCriteria } from '@app/core/query/dmp/dmp-criteria';
|
|
||||||
import { DatasetCriteria } from '@app/core/query/dataset/dataset-criteria';
|
|
||||||
import { MatDialog } from '@angular/material/dialog';
|
|
||||||
import { StartNewDmpDialogComponent } from '../dmp/start-new-dmp-dialogue/start-new-dmp-dialog.component';
|
|
||||||
import { StartNewDatasetDialogComponent } from '../dmp/start-new-dataset-dialogue/start-new-dataset-dialog.component';
|
|
||||||
import { DatasetWizardEditorModel } from '../dataset/dataset-wizard/dataset-wizard-editor.model';
|
|
||||||
import { DatasetWizardService } from '@app/core/services/dataset-wizard/dataset-wizard.service';
|
|
||||||
import { TranslateService } from '@ngx-translate/core';
|
|
||||||
import { UiNotificationService, SnackBarNotificationLevel } from '@app/core/services/notification/ui-notification-service';
|
|
||||||
import { GuidedTourService } from '@app/library/guided-tour/guided-tour.service';
|
|
||||||
import { GuidedTour, Orientation } from '@app/library/guided-tour/guided-tour.constants';
|
|
||||||
import { MatomoService } from '@app/core/services/matomo/matomo-service';
|
import { MatomoService } from '@app/core/services/matomo/matomo-service';
|
||||||
|
import { GuidedTour, Orientation } from '@app/library/guided-tour/guided-tour.constants';
|
||||||
|
import { GuidedTourService } from '@app/library/guided-tour/guided-tour.service';
|
||||||
|
import { BaseComponent } from '@common/base/base.component';
|
||||||
|
import { TranslateService } from '@ngx-translate/core';
|
||||||
|
import { takeUntil } from 'rxjs/operators';
|
||||||
|
import { StartNewDmpDialogComponent } from '../dmp/start-new-dmp-dialogue/start-new-dmp-dialog.component';
|
||||||
|
|
||||||
|
|
||||||
@Component({
|
@Component({
|
||||||
|
@ -42,62 +21,27 @@ import { MatomoService } from '@app/core/services/matomo/matomo-service';
|
||||||
})
|
})
|
||||||
export class DashboardComponent extends BaseComponent implements OnInit {
|
export class DashboardComponent extends BaseComponent implements OnInit {
|
||||||
|
|
||||||
public isVisible = true
|
public dashboardStatistics: DashboardStatistics;
|
||||||
|
|
||||||
public userInfo: any;
|
|
||||||
datasetActivities: any[];
|
|
||||||
grantActivities: any[];
|
|
||||||
dmpActivities: any[];
|
|
||||||
organisationActivities: any[];
|
|
||||||
public dashboardStatisticsData: DashboardStatisticsModel;
|
|
||||||
public formControl = new UntypedFormControl();
|
|
||||||
grantAutoCompleteConfiguration: SingleAutoCompleteConfiguration;
|
|
||||||
public searchControl = new UntypedFormControl();
|
|
||||||
filteredOptions: Observable<SearchBarItem[]>;
|
|
||||||
recentActivityTypeEnum = RecentActivityType;
|
|
||||||
public search = false;
|
|
||||||
dmpListingItems: DmpListingModel[] = [];
|
|
||||||
datasetListingItems: DatasetListingModel[] = [];
|
|
||||||
|
|
||||||
totalDatasets: number;
|
|
||||||
totalDmps: number;
|
|
||||||
totalDraftDatasets: number;
|
|
||||||
totalRecents: number;
|
|
||||||
|
|
||||||
dmpText: string;
|
|
||||||
datasetText: string;
|
|
||||||
importFileText: string;
|
|
||||||
startWizardText: string;
|
|
||||||
currentType: string = "recent";
|
currentType: string = "recent";
|
||||||
|
|
||||||
constructor(
|
constructor(
|
||||||
private router: Router,
|
private router: Router,
|
||||||
private route: ActivatedRoute,
|
private route: ActivatedRoute,
|
||||||
private grantService: GrantService,
|
|
||||||
private dmpService: DmpService,
|
|
||||||
private datasetService: DatasetService,
|
|
||||||
private datasetWizardService: DatasetWizardService,
|
|
||||||
private dashboardService: DashboardService,
|
private dashboardService: DashboardService,
|
||||||
private searchBarService: SearchBarService,
|
|
||||||
private authentication: AuthService,
|
private authentication: AuthService,
|
||||||
private userService: UserServiceOld,
|
|
||||||
private dialog: MatDialog,
|
private dialog: MatDialog,
|
||||||
private language: TranslateService,
|
private language: TranslateService,
|
||||||
private uiNotificationService: UiNotificationService,
|
|
||||||
private guidedTourService: GuidedTourService,
|
private guidedTourService: GuidedTourService,
|
||||||
private matomoService: MatomoService
|
private matomoService: MatomoService
|
||||||
) {
|
) {
|
||||||
super();
|
super();
|
||||||
// this.dashboardStatisticsData.totalDataManagementPlanCount = 0;
|
|
||||||
// this.dashboardStatisticsData.totalDataSetCount = 0;
|
|
||||||
// this.dashboardStatisticsData.totalGrantCount = 0;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
ngOnInit() {
|
ngOnInit() {
|
||||||
this.route.queryParams.subscribe(params => {
|
this.route.queryParams.subscribe(params => {
|
||||||
let type = params['type'];
|
let type = params['type'];
|
||||||
if(type || type == "recent" || (type == "drafts" && this.isAuthenticated()) || type == "dmps" || type == "datasets") {
|
if (type || type == "recent" || (type == "drafts" && this.isAuthenticated()) || type == "dmps" || type == "descriptions") {
|
||||||
this.currentType = type;
|
this.currentType = type;
|
||||||
} else {
|
} else {
|
||||||
this.currentType = "recent";
|
this.currentType = "recent";
|
||||||
|
@ -105,157 +49,47 @@ export class DashboardComponent extends BaseComponent implements OnInit {
|
||||||
});
|
});
|
||||||
|
|
||||||
this.matomoService.trackPageView('Home Dashboard');
|
this.matomoService.trackPageView('Home Dashboard');
|
||||||
// if (this.isAuthenticated()) {
|
|
||||||
// this.userService.getRecentActivity()
|
|
||||||
// .pipe(takeUntil(this._destroyed))
|
|
||||||
// .subscribe(response => {
|
|
||||||
// this.datasetActivities = response['recentDatasetActivities'];
|
|
||||||
// this.dmpActivities = response['recentDmpActivities'];
|
|
||||||
// this.grantActivities = response['recentGrantActivities'];
|
|
||||||
// this.organisationActivities = response['totalOrganisationCount'];
|
|
||||||
// });
|
|
||||||
// }
|
|
||||||
|
|
||||||
// this.grantAutoCompleteConfiguration = {
|
|
||||||
// filterFn: this.searchGrant.bind(this),
|
|
||||||
// items: this.searchGrant(''),
|
|
||||||
// displayFn: (item) => item['label'],
|
|
||||||
// titleFn: (item) => item['label']
|
|
||||||
// };
|
|
||||||
|
|
||||||
if (!this.isAuthenticated()) {
|
if (!this.isAuthenticated()) {
|
||||||
this.dashboardService.getStatistics()
|
this.dashboardService.getPublicDashboardStatistics()
|
||||||
.pipe(takeUntil(this._destroyed))
|
.pipe(takeUntil(this._destroyed))
|
||||||
.subscribe(results => {
|
.subscribe(results => {
|
||||||
//let data = results['payload'];
|
this.dashboardStatistics = results;
|
||||||
this.dashboardStatisticsData = results;
|
|
||||||
});
|
});
|
||||||
// this.getPublicDmps();
|
|
||||||
// this.getPublicDatasets();
|
|
||||||
} else {
|
} else {
|
||||||
this.dashboardService.getUserStatistics()
|
this.dashboardService.getMyDashboardStatistics()
|
||||||
.pipe(takeUntil(this._destroyed))
|
.pipe(takeUntil(this._destroyed))
|
||||||
.subscribe(results => {
|
.subscribe(results => {
|
||||||
this.dashboardStatisticsData = results;
|
this.dashboardStatistics = results;
|
||||||
|
|
||||||
if (this.dashboardStatisticsData && this.dashboardStatisticsData.totalDataManagementPlanCount === 0) {
|
if (this.dashboardStatistics && this.dashboardStatistics.dmpCount === 0) {
|
||||||
this.openDashboardTour();
|
this.openDashboardTour();
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
this.filteredOptions = this.searchControl.valueChanges.pipe(mergeMap(x => {
|
|
||||||
return this.searchBarService.search(x);
|
|
||||||
}));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public get indexFromCurrentType() {
|
public get indexFromCurrentType() {
|
||||||
if(this.currentType == "recent") {
|
if (this.currentType == "recent") {
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
if(this.currentType == "drafts") {
|
if (this.currentType == "drafts") {
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
if(this.currentType == "dmps") {
|
if (this.currentType == "dmps") {
|
||||||
return this.isAuthenticated() ? 2 : 1;
|
return this.isAuthenticated() ? 2 : 1;
|
||||||
}
|
}
|
||||||
if(this.currentType == "datasets") {
|
if (this.currentType == "descriptions") {
|
||||||
return this.isAuthenticated() ? 3 : 2;
|
return this.isAuthenticated() ? 3 : 2;
|
||||||
}
|
}
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
// ngAfterContentChecked(): void {
|
|
||||||
// if (this.dashboardStatisticsData && this.dashboardStatisticsData.totalDataManagementPlanCount === 0) {
|
|
||||||
// this.openTour();
|
|
||||||
// }
|
|
||||||
// }
|
|
||||||
|
|
||||||
public isAuthenticated(): boolean {
|
public isAuthenticated(): boolean {
|
||||||
return this.authentication.currentAccountIsAuthenticated();
|
return this.authentication.currentAccountIsAuthenticated();
|
||||||
}
|
}
|
||||||
|
|
||||||
searchGrant(query: string) {
|
|
||||||
const grantRequestItem: RequestItem<GrantCriteria> = new RequestItem();
|
|
||||||
grantRequestItem.criteria = new GrantCriteria();
|
|
||||||
grantRequestItem.criteria.like = query;
|
|
||||||
return this.grantService.getWithExternal(grantRequestItem);
|
|
||||||
}
|
|
||||||
|
|
||||||
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/edit/' + id]);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
default: throw new Error('Unsupported Activity Type ');
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
getPublicDmps() {
|
|
||||||
const dmpCriteria = new DmpCriteria();
|
|
||||||
dmpCriteria.allVersions = false;
|
|
||||||
dmpCriteria.isPublic = true;
|
|
||||||
dmpCriteria.onlyPublic = true;
|
|
||||||
const fields: Array<string> = new Array<string>();
|
|
||||||
fields.push('-finalizedAt');
|
|
||||||
const dataTableRequest: DataTableRequest<DmpCriteria> = new DataTableRequest(0, 2, { fields: fields });
|
|
||||||
dataTableRequest.criteria = dmpCriteria;
|
|
||||||
return this.dmpService.getPaged(dataTableRequest, "listing").pipe(takeUntil(this._destroyed)).subscribe(result => { this.dmpListingItems = result.data; });
|
|
||||||
}
|
|
||||||
|
|
||||||
getPublicDatasets() {
|
|
||||||
const dmpCriteria = new DatasetCriteria();
|
|
||||||
dmpCriteria.allVersions = false;
|
|
||||||
dmpCriteria.isPublic = true;
|
|
||||||
const fields: Array<string> = new Array<string>();
|
|
||||||
fields.push('-modified');
|
|
||||||
const dataTableRequest: DataTableRequest<DatasetCriteria> = new DataTableRequest(0, 4, { fields: fields });
|
|
||||||
dataTableRequest.criteria = dmpCriteria;
|
|
||||||
return this.datasetService.getPaged(dataTableRequest).pipe(takeUntil(this._destroyed)).subscribe(result => { this.datasetListingItems = result.data; });
|
|
||||||
}
|
|
||||||
|
|
||||||
dmpClicked(dmp: DmpListingModel) {
|
|
||||||
if (!this.isAuthenticated()) {
|
|
||||||
this.router.navigate(['../explore-plans/publicOverview', dmp.id], { relativeTo: this.route });
|
|
||||||
} else {
|
|
||||||
this.router.navigate(['/plans/publicEdit/' + dmp.id]);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
datasetClicked(dataset: DatasetListingModel) {
|
|
||||||
this.router.navigate(['/datasets/publicEdit/' + dataset.id]);
|
|
||||||
}
|
|
||||||
|
|
||||||
public closeCard(): void {
|
|
||||||
this.isVisible = false;
|
|
||||||
}
|
|
||||||
|
|
||||||
onCountDmps(event): void {
|
|
||||||
this.totalDmps = event;
|
|
||||||
}
|
|
||||||
|
|
||||||
onCountDatasets(event): void {
|
|
||||||
this.totalDatasets = event;
|
|
||||||
}
|
|
||||||
|
|
||||||
onCountDraftDatasets(event): void {
|
|
||||||
this.totalDraftDatasets = event;
|
|
||||||
}
|
|
||||||
|
|
||||||
onCountAllRecent(event): void {
|
|
||||||
this.totalRecents = event;
|
|
||||||
}
|
|
||||||
|
|
||||||
openNewDmpDialog() {
|
openNewDmpDialog() {
|
||||||
if (this.dialog.openDialogs.length > 0) {
|
if (this.dialog.openDialogs.length > 0) {
|
||||||
this.dialog.closeAll();
|
this.dialog.closeAll();
|
||||||
|
@ -271,43 +105,35 @@ export class DashboardComponent extends BaseComponent implements OnInit {
|
||||||
}
|
}
|
||||||
|
|
||||||
public hasDmps(): boolean {
|
public hasDmps(): boolean {
|
||||||
if (this.dashboardStatisticsData) {
|
if (this.dashboardStatistics) {
|
||||||
return this.dashboardStatisticsData.totalDataManagementPlanCount !== 0
|
return this.dashboardStatistics.dmpCount !== 0
|
||||||
|| this.dashboardStatisticsData.totalDataSetCount !== 0
|
|| this.dashboardStatistics.descriptionCount !== 0
|
||||||
|| this.dashboardStatisticsData.totalGrantCount !== 0
|
|| this.dashboardStatistics.grantCount !== 0
|
||||||
|| this.dashboardStatisticsData.totalOrganisationCount !== 0;
|
|| this.dashboardStatistics.organizationCount !== 0;
|
||||||
} else {
|
} else {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
addNewDataset() {
|
addNewDescription() {
|
||||||
const dialogRef = this.dialog.open(StartNewDatasetDialogComponent, {
|
//TODO: add this
|
||||||
disableClose: false,
|
// const dialogRef = this.dialog.open(StartNewDescriptionDialogComponent, {
|
||||||
restoreFocus: false,
|
// disableClose: false,
|
||||||
data: {
|
// restoreFocus: false,
|
||||||
startNewDmp: false,
|
// data: {
|
||||||
formGroup: new DatasetWizardEditorModel().buildForm()
|
// startNewDmp: false,
|
||||||
}
|
// formGroup: new DescriptionWizardEditorModel().buildForm()
|
||||||
});
|
// }
|
||||||
dialogRef.afterClosed().pipe(takeUntil(this._destroyed)).subscribe(result => {
|
// });
|
||||||
if (result) {
|
// dialogRef.afterClosed().pipe(takeUntil(this._destroyed)).subscribe(result => {
|
||||||
if (result.startNewDmp) {
|
// if (result) {
|
||||||
this.openNewDmpDialog();
|
// if (result.startNewDmp) {
|
||||||
} else {
|
// this.openNewDmpDialog();
|
||||||
this.router.navigate(['/plans', 'edit', result.formGroup.get('dmp').value.id]);
|
// } else {
|
||||||
// Save dataset direct but missing title and template
|
// this.router.navigate(['/plans', 'edit', result.formGroup.get('dmp').value.id]);
|
||||||
// this.datasetWizardService.createDataset(result.formGroup.getRawValue())
|
// }
|
||||||
// .pipe(takeUntil(this._destroyed))
|
// }
|
||||||
// .subscribe(
|
// });
|
||||||
// data => {
|
|
||||||
// this.onCallbackSuccess(data);
|
|
||||||
// },
|
|
||||||
// error => this.onCallbackError(error)
|
|
||||||
// );
|
|
||||||
}
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public dashboardTour: GuidedTour = {
|
public dashboardTour: GuidedTour = {
|
||||||
|
@ -338,7 +164,7 @@ export class DashboardComponent extends BaseComponent implements OnInit {
|
||||||
closeAction: () => this.dialog.closeAll()
|
closeAction: () => this.dialog.closeAll()
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
selector: '.new-dataset-tour',
|
selector: '.new-description-tour',
|
||||||
content: 'Step 4',
|
content: 'Step 4',
|
||||||
orientation: Orientation.BottomLeft,
|
orientation: Orientation.BottomLeft,
|
||||||
isStepUnique: false,
|
isStepUnique: false,
|
||||||
|
@ -348,49 +174,32 @@ export class DashboardComponent extends BaseComponent implements OnInit {
|
||||||
};
|
};
|
||||||
|
|
||||||
public setDashboardTourDmpText(): void {
|
public setDashboardTourDmpText(): void {
|
||||||
this.dmpText = this.language.instant('DASHBOARD.TOUR-GUIDE.DMP') + '\n\n' +
|
const dmpText = this.language.instant('DASHBOARD.TOUR-GUIDE.DMP') + '\n\n' +
|
||||||
this.language.instant('DASHBOARD.TOUR-GUIDE.START-NEW');
|
this.language.instant('DASHBOARD.TOUR-GUIDE.START-NEW');
|
||||||
this.dashboardTour.steps[0].title = this.dmpText;
|
this.dashboardTour.steps[0].title = dmpText;
|
||||||
}
|
}
|
||||||
|
|
||||||
public setDashboardImportFileText(): void {
|
public setDashboardImportFileText(): void {
|
||||||
this.importFileText = this.language.instant('DASHBOARD.TOUR-GUIDE.IMPORT-DMP');
|
const importFileText = this.language.instant('DASHBOARD.TOUR-GUIDE.IMPORT-DMP');
|
||||||
this.dashboardTour.steps[1].title = this.importFileText;
|
this.dashboardTour.steps[1].title = importFileText;
|
||||||
}
|
}
|
||||||
|
|
||||||
public setDashboardStartWizardText(): void {
|
public setDashboardStartWizardText(): void {
|
||||||
this.startWizardText = this.language.instant('DASHBOARD.TOUR-GUIDE.START-WIZARD');
|
const startWizardText = this.language.instant('DASHBOARD.TOUR-GUIDE.START-WIZARD');
|
||||||
this.dashboardTour.steps[2].title = this.startWizardText;
|
this.dashboardTour.steps[2].title = startWizardText;
|
||||||
}
|
}
|
||||||
|
|
||||||
public setDatasetText(): void {
|
public setDescriptionText(): void {
|
||||||
this.datasetText = this.language.instant('DASHBOARD.TOUR-GUIDE.DATASET') + '\n\n' +
|
const descriptionText = this.language.instant('DASHBOARD.TOUR-GUIDE.description') + '\n\n' +
|
||||||
this.language.instant('DASHBOARD.TOUR-GUIDE.NEW-DATASET');
|
this.language.instant('DASHBOARD.TOUR-GUIDE.NEW-description');
|
||||||
this.dashboardTour.steps[3].title = this.datasetText;
|
this.dashboardTour.steps[3].title = descriptionText;
|
||||||
}
|
}
|
||||||
|
|
||||||
openDashboardTour() {
|
openDashboardTour() {
|
||||||
this.setDashboardTourDmpText();
|
this.setDashboardTourDmpText();
|
||||||
this.setDashboardImportFileText();
|
this.setDashboardImportFileText();
|
||||||
this.setDashboardStartWizardText();
|
this.setDashboardStartWizardText();
|
||||||
this.setDatasetText();
|
this.setDescriptionText();
|
||||||
this.guidedTourService.startTour(this.dashboardTour);
|
this.guidedTourService.startTour(this.dashboardTour);
|
||||||
}
|
}
|
||||||
|
|
||||||
// onCallbackSuccess(datasetId: String): void {
|
|
||||||
// this.uiNotificationService.snackBarNotification(this.language.instant('GENERAL.SNACK-BAR.SUCCESSFUL-CREATION'), SnackBarNotificationLevel.Success);
|
|
||||||
// this.router.navigate(['/reload']).then(() => { this.router.navigate(['/datasets', 'edit', datasetId]); });
|
|
||||||
// }
|
|
||||||
|
|
||||||
// onCallbackError(error: any) {
|
|
||||||
// this.uiNotificationService.snackBarNotification(error.error.message ? error.error.message : this.language.instant('GENERAL.SNACK-BAR.UNSUCCESSFUL-UPDATE'), SnackBarNotificationLevel.Error);
|
|
||||||
// }
|
|
||||||
|
|
||||||
// viewAllPublicDmpsClicked() {
|
|
||||||
// this.router.navigate(['/explore-plans']);
|
|
||||||
// }
|
|
||||||
|
|
||||||
// viewAllPublicDatasetsClicked() {
|
|
||||||
// this.router.navigate(['explore']);
|
|
||||||
// }
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,48 +1,39 @@
|
||||||
import { NgModule } from '@angular/core';
|
import { NgModule } from '@angular/core';
|
||||||
import { ExportMethodDialogModule } from '@app/library/export-method-dialog/export-method-dialog.module';
|
|
||||||
import { CardComponent } from '@app/ui/dashboard/card/card.component';
|
|
||||||
import { DashboardComponent } from '@app/ui/dashboard/dashboard.component';
|
|
||||||
import { DashboardRoutingModule } from '@app/ui/dashboard/dashboard.routing';
|
|
||||||
import { DatasetInfoCounterComponent } from '@app/ui/dashboard/dataset-info-counter/dataset-info-counter.component';
|
|
||||||
import { DraftsComponent } from '@app/ui/dashboard/drafts/drafts.component';
|
|
||||||
import { InfoCounterComponent } from '@app/ui/dashboard/info-counter/info-counter.component';
|
|
||||||
import { QuickWizardCreateAdd } from '@app/ui/dashboard/quick-wizard-create-add/quick-wizard-create-add.component';
|
|
||||||
import { RecentActivityComponent } from '@app/ui/dashboard/recent-activity/recent-activity.component';
|
|
||||||
import { RecentEditedActivityComponent } from '@app/ui/dashboard/recent-edited-activity/recent-edited-activity.component';
|
|
||||||
import { RecentVisitedActivityComponent } from '@app/ui/dashboard/recent-visited-activity/recent-visited-activity.component';
|
|
||||||
import { WizardComponent } from '@app/ui/dashboard/wizard/wizard.component';
|
|
||||||
import { CommonUiModule } from '@common/ui/common-ui.module';
|
|
||||||
import { ConfirmationDialogModule } from '@common/modules/confirmation-dialog/confirmation-dialog.module';
|
|
||||||
import { RecentEditedDatasetActivityComponent } from './recent-edited-dataset-activity/recent-edited-dataset-activity.component';
|
|
||||||
import { DatasetCopyDialogModule } from '../dataset/dataset-wizard/dataset-copy-dialogue/dataset-copy-dialogue.module';
|
|
||||||
import { RecentEditedDmpActivityComponent } from './recent-edited-dmp-activity/recent-edited-dmp-activity.component';
|
|
||||||
import { FormsModule, ReactiveFormsModule } from '@angular/forms';
|
import { FormsModule, ReactiveFormsModule } from '@angular/forms';
|
||||||
import { FormattingModule } from '@app/core/formatting.module';
|
import { FormattingModule } from '@app/core/formatting.module';
|
||||||
|
import { ExportMethodDialogModule } from '@app/library/export-method-dialog/export-method-dialog.module';
|
||||||
|
import { DashboardComponent } from '@app/ui/dashboard/dashboard.component';
|
||||||
|
import { DashboardRoutingModule } from '@app/ui/dashboard/dashboard.routing';
|
||||||
|
import { ConfirmationDialogModule } from '@common/modules/confirmation-dialog/confirmation-dialog.module';
|
||||||
|
import { CommonUiModule } from '@common/ui/common-ui.module';
|
||||||
|
import { DatasetCopyDialogModule } from '../dataset/dataset-wizard/dataset-copy-dialogue/dataset-copy-dialogue.module';
|
||||||
|
import { DescriptionModule } from '../description/description.module';
|
||||||
|
import { DmpModule } from '../dmp/dmp.module';
|
||||||
|
import { DraftsComponent } from './drafts/drafts.component';
|
||||||
|
import { RecentEditedActivityComponent } from './recent-edited-activity/recent-edited-activity.component';
|
||||||
|
import { RecentEditedDescriptionActivityComponent } from './recent-edited-description-activity/recent-edited-description-activity.component';
|
||||||
|
import { RecentEditedDmpActivityComponent } from './recent-edited-dmp-activity/recent-edited-dmp-activity.component';
|
||||||
|
|
||||||
@NgModule({
|
@NgModule({
|
||||||
imports: [
|
imports: [
|
||||||
CommonUiModule,
|
CommonUiModule,
|
||||||
FormattingModule,
|
FormattingModule,
|
||||||
DashboardRoutingModule,
|
DashboardRoutingModule,
|
||||||
ExportMethodDialogModule,
|
ExportMethodDialogModule,
|
||||||
ConfirmationDialogModule,
|
ConfirmationDialogModule,
|
||||||
DatasetCopyDialogModule,
|
DatasetCopyDialogModule,
|
||||||
FormsModule,
|
FormsModule,
|
||||||
ReactiveFormsModule
|
ReactiveFormsModule,
|
||||||
],
|
|
||||||
declarations: [
|
DmpModule, //TODO: add only listing component to a seperate module
|
||||||
DashboardComponent,
|
DescriptionModule //TODO: add only listing component to a seperate module
|
||||||
RecentActivityComponent,
|
],
|
||||||
CardComponent,
|
declarations: [
|
||||||
QuickWizardCreateAdd,
|
DashboardComponent,
|
||||||
WizardComponent,
|
RecentEditedActivityComponent,
|
||||||
InfoCounterComponent,
|
RecentEditedDmpActivityComponent,
|
||||||
RecentVisitedActivityComponent,
|
RecentEditedDescriptionActivityComponent,
|
||||||
RecentEditedActivityComponent,
|
DraftsComponent
|
||||||
DraftsComponent,
|
]
|
||||||
DatasetInfoCounterComponent,
|
|
||||||
RecentEditedDatasetActivityComponent,
|
|
||||||
RecentEditedDmpActivityComponent
|
|
||||||
]
|
|
||||||
})
|
})
|
||||||
export class DashboardModule { }
|
export class DashboardModule { }
|
||||||
|
|
|
@ -1,7 +1,6 @@
|
||||||
import { NgModule } from '@angular/core';
|
import { NgModule } from '@angular/core';
|
||||||
import { RouterModule, Routes } from '@angular/router';
|
import { RouterModule, Routes } from '@angular/router';
|
||||||
import { DashboardComponent } from './dashboard.component';
|
import { DashboardComponent } from './dashboard.component';
|
||||||
import { QuickWizardCreateAdd } from './quick-wizard-create-add/quick-wizard-create-add.component';
|
|
||||||
|
|
||||||
const routes: Routes = [
|
const routes: Routes = [
|
||||||
{
|
{
|
||||||
|
|
|
@ -1,77 +0,0 @@
|
||||||
.listing-item {
|
|
||||||
background-color: #ffffff;
|
|
||||||
}
|
|
||||||
|
|
||||||
.gray-container {
|
|
||||||
letter-spacing: 5px;
|
|
||||||
color: #aaaaaa;
|
|
||||||
}
|
|
||||||
|
|
||||||
.container-header {
|
|
||||||
display: flex;
|
|
||||||
align-items: baseline;
|
|
||||||
margin-top: 0px;
|
|
||||||
padding-top: 10px;
|
|
||||||
text-transform: uppercase;
|
|
||||||
min-height: 2.1em;
|
|
||||||
}
|
|
||||||
|
|
||||||
.container-header p {
|
|
||||||
letter-spacing: 5px;
|
|
||||||
color: #aaaaaa;
|
|
||||||
/* padding: 5px 30px; */
|
|
||||||
margin-bottom: 0px;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* h4 {
|
|
||||||
display: inline;
|
|
||||||
padding-left: 1em;
|
|
||||||
} */
|
|
||||||
|
|
||||||
/* .title h4 {
|
|
||||||
padding-left: 30px;
|
|
||||||
line-height: 2em;
|
|
||||||
} */
|
|
||||||
|
|
||||||
.about-item {
|
|
||||||
display: flex;
|
|
||||||
}
|
|
||||||
|
|
||||||
.about-item .length {
|
|
||||||
color: var(--primary-color-3);
|
|
||||||
/* color: #089dbb; */
|
|
||||||
}
|
|
||||||
|
|
||||||
.about-item .title {
|
|
||||||
margin: 2px 10px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.about-item p {
|
|
||||||
margin-left: auto;
|
|
||||||
margin-bottom: 0px;
|
|
||||||
padding-top: 7px;
|
|
||||||
color: #aaaaaa;
|
|
||||||
}
|
|
||||||
|
|
||||||
.icon {
|
|
||||||
color: #08bd63;
|
|
||||||
/* color: #92d050; */
|
|
||||||
}
|
|
||||||
|
|
||||||
hr {
|
|
||||||
margin: 0.6em 0em;
|
|
||||||
}
|
|
||||||
|
|
||||||
.date {
|
|
||||||
display: flex;
|
|
||||||
}
|
|
||||||
|
|
||||||
.date p {
|
|
||||||
margin-left: auto;
|
|
||||||
margin-bottom: 0em;
|
|
||||||
color: #aaaaaa;
|
|
||||||
}
|
|
||||||
|
|
||||||
.desc {
|
|
||||||
min-height: 1.5em;
|
|
||||||
}
|
|
|
@ -1,31 +0,0 @@
|
||||||
<div class="row listing-item" (click)="itemClicked()">
|
|
||||||
<div class="col-12">
|
|
||||||
<div class="row">
|
|
||||||
<div class="col-12 gray-container container-header">
|
|
||||||
<p>{{ dataset.grantAbbreviation }}</p>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<div class="row">
|
|
||||||
<div class="col-12 about-item">
|
|
||||||
<mat-icon class="icon">bookmark</mat-icon>
|
|
||||||
<h4 class="title">{{ dataset.label }}</h4>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<div class="row">
|
|
||||||
<div class="col-12">
|
|
||||||
<p class="mt-1 mb-2 desc">{{dataset.description}}</p>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<div class="row">
|
|
||||||
<div class="col-12 about-item">
|
|
||||||
<div class="pt-1">
|
|
||||||
<div matTooltip="{{ dataset.profile }}" class="chip ml-2 mr-2">{{ dataset.profile }}</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<hr>
|
|
||||||
<div class="date">
|
|
||||||
<p>{{'DATASET-LISTING.COLUMNS.PUBLISHED' | translate}} {{dataset.created | date: "shortDate"}}</p>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
|
@ -1,26 +0,0 @@
|
||||||
import { ComponentFixture, TestBed, waitForAsync } from '@angular/core/testing';
|
|
||||||
|
|
||||||
import { DatasetInfoCounterComponent } from './dataset-info-counter.component';
|
|
||||||
|
|
||||||
describe('DatasetInfoCounterComponent', () => {
|
|
||||||
let component: DatasetInfoCounterComponent;
|
|
||||||
let fixture: ComponentFixture<DatasetInfoCounterComponent>;
|
|
||||||
|
|
||||||
beforeEach(waitForAsync(() => {
|
|
||||||
TestBed.configureTestingModule({
|
|
||||||
declarations: [DatasetInfoCounterComponent],
|
|
||||||
teardown: { destroyAfterEach: false }
|
|
||||||
})
|
|
||||||
.compileComponents();
|
|
||||||
}));
|
|
||||||
|
|
||||||
beforeEach(() => {
|
|
||||||
fixture = TestBed.createComponent(DatasetInfoCounterComponent);
|
|
||||||
component = fixture.componentInstance;
|
|
||||||
fixture.detectChanges();
|
|
||||||
});
|
|
||||||
|
|
||||||
it('should create', () => {
|
|
||||||
expect(component).toBeTruthy();
|
|
||||||
});
|
|
||||||
});
|
|
|
@ -1,22 +0,0 @@
|
||||||
import { Component, OnInit, Input, Output, EventEmitter } from '@angular/core';
|
|
||||||
import { DatasetListingModel } from '../../../core/model/dataset/dataset-listing';
|
|
||||||
|
|
||||||
@Component({
|
|
||||||
selector: 'app-dataset-info-counter',
|
|
||||||
templateUrl: './dataset-info-counter.component.html',
|
|
||||||
styleUrls: ['./dataset-info-counter.component.css']
|
|
||||||
})
|
|
||||||
export class DatasetInfoCounterComponent implements OnInit {
|
|
||||||
|
|
||||||
@Input() dataset: DatasetListingModel;
|
|
||||||
@Output() onClick: EventEmitter<DatasetListingModel> = new EventEmitter();
|
|
||||||
|
|
||||||
constructor() { }
|
|
||||||
|
|
||||||
ngOnInit() {
|
|
||||||
}
|
|
||||||
|
|
||||||
itemClicked() {
|
|
||||||
this.onClick.emit(this.dataset);
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,7 +1,7 @@
|
||||||
<div class="col-md-12 d-flex justify-content-center" *ngIf="allRecentActivities == null">
|
<div class="col-md-12 d-flex justify-content-center" *ngIf="listingItems == null">
|
||||||
<span class="empty-list">{{'DMP-LISTING.EMPTY-LIST' | translate}}</span>
|
<span class="empty-list">{{'DMP-LISTING.EMPTY-LIST' | translate}}</span>
|
||||||
</div>
|
</div>
|
||||||
<div *ngIf="allRecentActivities != null" id="results" #results>
|
<div *ngIf="listingItems != null" id="results" #results>
|
||||||
<div class="d-flex flex-direction-row pt-4">
|
<div class="d-flex flex-direction-row pt-4">
|
||||||
<!-- Sort by -->
|
<!-- Sort by -->
|
||||||
<span class="d-flex align-items-center">{{'DMP-LISTING.SORT-BY' | translate}}:</span>
|
<span class="d-flex align-items-center">{{'DMP-LISTING.SORT-BY' | translate}}:</span>
|
||||||
|
@ -9,8 +9,6 @@
|
||||||
<mat-select placeholder="{{'CRITERIA.LIKE'| translate}}" [formControl]="formGroup.get('order')">
|
<mat-select placeholder="{{'CRITERIA.LIKE'| translate}}" [formControl]="formGroup.get('order')">
|
||||||
<mat-option [value]="order.MODIFIED">{{enumUtils.toRecentActivityOrderString(order.MODIFIED)}}</mat-option>
|
<mat-option [value]="order.MODIFIED">{{enumUtils.toRecentActivityOrderString(order.MODIFIED)}}</mat-option>
|
||||||
<mat-option [value]="order.LABEL">{{enumUtils.toRecentActivityOrderString(order.LABEL)}}</mat-option>
|
<mat-option [value]="order.LABEL">{{enumUtils.toRecentActivityOrderString(order.LABEL)}}</mat-option>
|
||||||
<!-- <mat-option [value]="order.STATUS">{{enumUtils.toRecentActivityOrderString(order.STATUS)}}</mat-option> -->
|
|
||||||
<!-- <mat-option [value]="order.CREATED">{{enumUtils.toRecentActivityOrderString(order.CREATED)}}</mat-option> -->
|
|
||||||
</mat-select>
|
</mat-select>
|
||||||
</mat-form-field>
|
</mat-form-field>
|
||||||
<!-- End of Sort by -->
|
<!-- End of Sort by -->
|
||||||
|
@ -22,144 +20,17 @@
|
||||||
</mat-form-field>
|
</mat-form-field>
|
||||||
<!-- End of Search Filter -->
|
<!-- End of Search Filter -->
|
||||||
</div>
|
</div>
|
||||||
<div *ngIf="allRecentActivities && allRecentActivities.length > 0 && page > 1" class="d-flex justify-content-center">
|
<div *ngIf="listingItems && listingItems.length > 0 && page > 1" class="d-flex justify-content-center">
|
||||||
<button type="button" class="btn-load-more" (click)="loadNextOrPrevious(false)">{{'GENERAL.ACTIONS.LOAD-LESS' | translate}}</button>
|
<button type="button" class="btn-load-more" (click)="loadNextOrPrevious(false)">{{'GENERAL.ACTIONS.LOAD-LESS' | translate}}</button>
|
||||||
</div>
|
</div>
|
||||||
<div *ngFor="let activity of allRecentActivities">
|
<div *ngFor="let item of listingItems; let i = index">
|
||||||
<div *ngIf="activity && activity.type === recentActivityTypeEnum.Dmp.valueOf()">
|
<app-dmp-listing-item-component *ngIf="item.dmp" [showDivider]="i != (listingItems.length - 1)" [dmp]="item.dmp" [isPublic]="isPublic"></app-dmp-listing-item-component>
|
||||||
<div class="dmp-card">
|
<app-description-listing-item-component *ngIf="item.description" [showDivider]="i != (listingItems.length - 1)" [description]="item.description" [isPublic]="isPublic" ></app-description-listing-item-component>
|
||||||
<!-- <a (click)="redirect(activity.id, activity.type)" class="pointer"> -->
|
|
||||||
<a [routerLink]="navigateToUrl(activity.id, activity.type)" class="pointer">
|
|
||||||
<div class="d-flex flex-direction-row">
|
|
||||||
<div class="col-auto dmp-label">{{ 'DMP-LISTING.DMP' | translate }}</div>
|
|
||||||
<div *ngIf="!publicMode" class="col-auto ml-auto edited-date">{{ 'DMP-LISTING.EDITED' | translate }}: {{ activity.modified | dateTimeCultureFormatter: "d MMMM y" }}</div>
|
|
||||||
<div *ngIf="publicMode" class="col-auto ml-auto edited-date">{{ 'DMP-LISTING.PUBLISHED' | translate }}: {{ activity.publishedAt | dateTimeCultureFormatter: "d MMMM y" }}</div>
|
|
||||||
</div>
|
|
||||||
<div class="col-auto dmp-title-draft">{{activity.title}}</div>
|
|
||||||
<div class="dmp-subtitle">
|
|
||||||
<span class="col-auto">{{ roleDisplay(activity.users) }}</span>
|
|
||||||
<span>.</span>
|
|
||||||
<span class=" col-auto draft"><span class="material-icons icon-align">create</span>{{ enumUtils.toDmpStatusString(activity.status) }}</span>
|
|
||||||
<span>.</span>
|
|
||||||
<span class="col-auto">{{'DMP-LISTING.VERSION' | translate}} {{activity.version}}</span>
|
|
||||||
<span>.</span>
|
|
||||||
<span class="col">{{ 'DMP-LISTING.GRANT' | translate }}: {{activity.grant}}</span>
|
|
||||||
</div>
|
|
||||||
<div class="col-auto dmp-dataset-descriptions-title">{{'DMP-LISTING.CONTAINED-DESCRIPTIONS' | translate}}: ({{ getDatasets(activity).length }})
|
|
||||||
</div>
|
|
||||||
<div *ngFor="let dataset of getDatasets(activity); let i = index; let last = last" [ngClass]="{'pb-3': i === activity.datasets.length - 1}">
|
|
||||||
<div *ngIf="i < 3">
|
|
||||||
<div class="col-auto dmp-dataset-descriptions-name" *ngIf="!last && i !== 2">{{dataset.label}},</div>
|
|
||||||
<div class="col-auto dmp-dataset-descriptions-name" *ngIf="last || i == 2">{{dataset.label}}</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<!-- <a class="d-flex justify-content-center pb-3 show-more" *ngIf="getDatasets(activity).length > 3" (click)="redirect(activity.id, activity.type)"><u>{{'GENERAL.ACTIONS.SHOW-MORE' | translate}}</u></a> -->
|
|
||||||
<a class="d-flex justify-content-center pb-3 show-more" *ngIf="getDatasets(activity).length > 3" [routerLink]="navigateToUrl(activity.id, activity.type)"><u>{{'GENERAL.ACTIONS.SHOW-MORE' | translate}}</u></a>
|
|
||||||
</a>
|
|
||||||
<div class="dmp-card-actions">
|
|
||||||
<a class="col-auto border-right pointer" [matMenuTriggerFor]="exportMenu"><span class="material-icons icon-align pr-2">open_in_new</span>{{'DMP-LISTING.ACTIONS.EXPORT' | translate}}</a>
|
|
||||||
<a class="col-auto border-right pointer" *ngIf="isDraftDmp(activity)" [routerLink]="['/plans/edit/' + activity.id]" target="_blank"><span class="material-icons icon-align">add</span>{{'DMP-LISTING.ACTIONS.ADD-DESCRIPTION-SHORT' | translate}}</a>
|
|
||||||
<a class="col-auto border-right pointer" *ngIf="isUserOwner(activity)" (click)="openShareDialog(activity.id, activity.title)"><span class="material-icons icon-align pr-2">group_add</span>{{'DMP-LISTING.ACTIONS.INVITE-SHORT' | translate}}</a>
|
|
||||||
<a class="col-auto border-right pointer" *ngIf="isAuthenticated()" (click)="cloneOrNewVersionClicked(activity, false)"><span class="material-icons icon-align pr-2">filter_none</span>{{'DMP-LISTING.ACTIONS.CLONE' | translate}}</a>
|
|
||||||
<a class="col-auto border-right pointer" *ngIf="!isAuthenticated()" (click)="viewVersions(getGroupId(activity), activity.title, activity)"><span class="material-icons icon-align pr-2">library_books</span>{{'DMP-LISTING.ACTIONS.VIEW-VERSION' | translate}}</a>
|
|
||||||
|
|
||||||
<a class="col-auto border-right pointer" *ngIf="!isDraftDmp(activity) && isUserOwner(activity)" (click)="deleteDmpClicked(activity)"><span class="material-icons icon-align pr-2">delete</span>{{ 'DMP-LISTING.ACTIONS.DELETE' | translate }}</a>
|
|
||||||
<a class="col-auto pointer" *ngIf="isAuthenticated()" [matMenuTriggerFor]="actionsMenu"><span class="material-icons icon-align pl-2">more_horiz</span></a>
|
|
||||||
</div>
|
|
||||||
<mat-menu #exportMenu="matMenu" xPosition="before">
|
|
||||||
<button mat-menu-item (click)="downloadPdf(activity.id)">
|
|
||||||
<i class="fa fa-file-pdf-o pr-2"></i>
|
|
||||||
<span>{{'GENERAL.FILE-TYPES.PDF' | translate}}</span>
|
|
||||||
</button>
|
|
||||||
<button mat-menu-item (click)="downloadDocx(activity.id)">
|
|
||||||
<i class="fa fa-file-word-o pr-2"></i>
|
|
||||||
<span>{{'GENERAL.FILE-TYPES.DOC' | translate}}</span>
|
|
||||||
</button>
|
|
||||||
<button mat-menu-item (click)="downloadXml(activity.id)">
|
|
||||||
<i class="fa fa-file-code-o pr-2"></i>
|
|
||||||
<span>{{'GENERAL.FILE-TYPES.XML' | translate}}</span>
|
|
||||||
</button>
|
|
||||||
<button mat-menu-item (click)="downloadJson(activity.id)">
|
|
||||||
<i class="fa fa-file-o pr-2"></i>
|
|
||||||
<span>{{'GENERAL.FILE-TYPES.JSON' | translate}}</span>
|
|
||||||
</button>
|
|
||||||
</mat-menu>
|
|
||||||
<mat-menu #actionsMenu="matMenu" xPosition="before">
|
|
||||||
<button *ngIf="isUserOwner(activity)" mat-menu-item (click)="cloneOrNewVersionClicked(activity, true)">
|
|
||||||
<mat-icon>queue</mat-icon>{{'DMP-LISTING.ACTIONS.NEW-VERSION' | translate}}
|
|
||||||
</button>
|
|
||||||
<button mat-menu-item (click)="viewVersions(getGroupId(activity), activity.title, activity)">
|
|
||||||
<mat-icon>library_books</mat-icon>{{'DMP-LISTING.ACTIONS.VIEW-VERSION' | translate}}
|
|
||||||
</button>
|
|
||||||
<button mat-menu-item *ngIf="isDraftDmp(activity) && isUserOwner(activity)" (click)="deleteDmpClicked(activity)" class="menu-item">
|
|
||||||
<mat-icon>delete</mat-icon>{{ 'DMP-LISTING.ACTIONS.DELETE' | translate }}
|
|
||||||
</button>
|
|
||||||
</mat-menu>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<div *ngIf="activity && activity.type === recentActivityTypeEnum.Dataset.valueOf()">
|
|
||||||
<div class="dataset-card">
|
|
||||||
<!-- <a (click)="redirect(activity.id, activity.type)" class="pointer"> -->
|
|
||||||
<a [routerLink]="navigateToUrl(activity.id, activity.type)" class="pointer">
|
|
||||||
<div class="d-flex flex-direction-row">
|
|
||||||
<div class="col-auto dataset-label">{{'DATASET-LISTING.DESCRIPTION' | translate}}</div>
|
|
||||||
<div *ngIf="!publicMode" class="col-auto ml-auto edited-date">{{'DATASET-LISTING.STATES.EDITED' | translate}}: {{activity.modified | dateTimeCultureFormatter: "d MMMM y"}}</div>
|
|
||||||
<div *ngIf="publicMode" class="col-auto ml-auto edited-date">{{'DATASET-LISTING.STATES.PUBLISHED' | translate}}: {{activity.publishedAt | dateTimeCultureFormatter: "d MMMM y"}}</div>
|
|
||||||
</div>
|
|
||||||
<div class="col-auto dataset-title-draft">{{activity.title}}</div>
|
|
||||||
<div class="dataset-subtitle">
|
|
||||||
<span class="col-auto">{{ roleDisplay(activity.users) }}</span>
|
|
||||||
<span>.</span>
|
|
||||||
<span class=" col-auto draft"><span class="material-icons icon-align">create</span>{{ enumUtils.toDmpStatusString(activity.status) }}</span>
|
|
||||||
<span>.</span>
|
|
||||||
<span class="col">{{'DATASET-LISTING.COLUMNS.GRANT' | translate}}: {{activity.grant}}</span>
|
|
||||||
</div>
|
|
||||||
<div class="d-flex flex-direction-row pt-3 pb-3">
|
|
||||||
<div class="col-auto dataset-subtitle pr-0">{{'DATASET-LISTING.TOOLTIP.PART-OF' | translate}}
|
|
||||||
<div class="col-auto dmp-label ml-3">{{'DATASET-LISTING.TOOLTIP.DMP' | translate}}</div>
|
|
||||||
</div>
|
|
||||||
<!-- <div class="col-auto dmp-label">{{'DATASET-LISTING.TOOLTIP.DMP' | translate}}</div> -->
|
|
||||||
<div class="col dmp-title">{{ getDmp(activity) }}</div>
|
|
||||||
</div>
|
|
||||||
</a>
|
|
||||||
<div class="dataset-card-actions">
|
|
||||||
<a class="col-auto border-right pointer" [matMenuTriggerFor]="exportMenu"><span class="material-icons icon-align pr-2">open_in_new</span>{{'DATASET-LISTING.ACTIONS.EXPORT' | translate}}</a>
|
|
||||||
<a class="col-auto border-right pointer" *ngIf="isAuthenticated()" (click)="openShareDialog(getDmpId(activity), getDmp(activity))"><span class="material-icons icon-align pr-2">group_add</span>{{'DATASET-LISTING.ACTIONS.INVITE-SHORT' | translate}}</a>
|
|
||||||
<a class="col-auto border-right pointer" *ngIf="isAuthenticated()" (click)="openDmpSearchDialogue(activity)"><span class="material-icons icon-align pr-2">file_copy</span>{{'DATASET-WIZARD.ACTIONS.COPY-DESCRIPTION' | translate}}</a>
|
|
||||||
<a class="col-auto border-right pointer" *ngIf="isAuthenticated()" (click)="deleteDatasetClicked(activity.id)"><span class="material-icons icon-align pr-2">delete</span>{{ 'DATASET-WIZARD.ACTIONS.DELETE' | translate }}</a>
|
|
||||||
|
|
||||||
<!-- <a class="col-auto pointer" [matMenuTriggerFor]="actionsMenu"><span class="material-icons icon-align pl-2">more_horiz</span></a> -->
|
|
||||||
<!-- <a class="col-auto" [matMenuTriggerFor]="actionsMenu" *ngIf="!publicMode"><span class="material-icons icon-align pl-2">more_horiz</span></a> -->
|
|
||||||
</div>
|
|
||||||
<mat-menu #actionsMenu="matMenu">
|
|
||||||
<button mat-menu-item (click)="openDmpSearchDialogue(activity)" class="menu-item">
|
|
||||||
<mat-icon>file_copy</mat-icon>{{'DATASET-WIZARD.ACTIONS.COPY-DESCRIPTION' | translate}}
|
|
||||||
</button>
|
|
||||||
<button mat-menu-item (click)="deleteDatasetClicked(activity.id)" class="menu-item">
|
|
||||||
<mat-icon>delete</mat-icon>{{ 'DATASET-WIZARD.ACTIONS.DELETE' | translate }}
|
|
||||||
</button>
|
|
||||||
</mat-menu>
|
|
||||||
<mat-menu #exportMenu="matMenu" xPosition="before">
|
|
||||||
<button mat-menu-item (click)="downloadPDF(activity)">
|
|
||||||
<i class="fa fa-file-pdf-o pr-2"></i>
|
|
||||||
<span>{{'GENERAL.FILE-TYPES.PDF' | translate}}</span>
|
|
||||||
</button>
|
|
||||||
<button mat-menu-item (click)="downloadDOCX(activity)">
|
|
||||||
<i class="fa fa-file-word-o pr-2"></i>
|
|
||||||
<span>{{'GENERAL.FILE-TYPES.DOC' | translate}}</span>
|
|
||||||
</button>
|
|
||||||
<button mat-menu-item (click)="downloadXML(activity)">
|
|
||||||
<i class="fa fa-file-code-o pr-2"></i>
|
|
||||||
<span>{{'GENERAL.FILE-TYPES.XML' | translate}}</span>
|
|
||||||
</button>
|
|
||||||
</mat-menu>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
</div>
|
||||||
<div class="text-muted d-flex justify-content-center mt-5" *ngIf="!hasMoreActivity && allRecentActivities && allRecentActivities.length > 0">
|
<div class="text-muted d-flex justify-content-center mt-5" *ngIf="!hasMoreActivity && listingItems && listingItems.length > 0">
|
||||||
{{'GENERAL.ACTIONS.NO-MORE-AVAILABLE' | translate}}
|
{{'GENERAL.ACTIONS.NO-MORE-AVAILABLE' | translate}}
|
||||||
</div>
|
</div>
|
||||||
<div *ngIf="allRecentActivities && allRecentActivities.length > 0 && (allRecentActivities.length >= startIndex + pageSize) && hasMoreActivity" class="d-flex justify-content-center">
|
<div *ngIf="listingItems && listingItems.length > 0 && (listingItems.length >= startIndex + pageSize) && hasMoreActivity" class="d-flex justify-content-center">
|
||||||
<button type="button" class="btn-load-more" (click)="loadNextOrPrevious()">{{'GENERAL.ACTIONS.LOAD-MORE' | translate}}</button>
|
<button type="button" class="btn-load-more" (click)="loadNextOrPrevious()">{{'GENERAL.ACTIONS.LOAD-MORE' | translate}}</button>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
|
@ -1,48 +1,20 @@
|
||||||
import { Location } from '@angular/common';
|
import { Location } from '@angular/common';
|
||||||
import { HttpClient } from '@angular/common/http';
|
import { Component, Input, OnInit } from '@angular/core';
|
||||||
import { Component, EventEmitter, Input, OnInit, Output, ViewChild } from '@angular/core';
|
import { UntypedFormBuilder, UntypedFormControl } from '@angular/forms';
|
||||||
import { UntypedFormBuilder, UntypedFormControl, UntypedFormGroup } from '@angular/forms';
|
|
||||||
import { MatDialog } from '@angular/material/dialog';
|
|
||||||
import { ActivatedRoute, Router } from '@angular/router';
|
import { ActivatedRoute, Router } from '@angular/router';
|
||||||
import { DmpBlueprintSectionFieldCategory } from '@app/core/common/enum/dmp-blueprint-section-field-category';
|
|
||||||
import { DmpBlueprintSystemFieldType } from '@app/core/common/enum/dmp-blueprint-system-field-type';
|
|
||||||
import { RecentActivityOrder } from '@app/core/common/enum/recent-activity-order';
|
import { RecentActivityOrder } from '@app/core/common/enum/recent-activity-order';
|
||||||
import { Role } from '@app/core/common/enum/role';
|
import { RecentActivityItem } from '@app/core/model/dashboard/recent-activity-item';
|
||||||
import { DatasetUrlListing } from "@app/core/model/dataset/dataset-url-listing";
|
import { DescriptionTemplate } from '@app/core/model/description-template/description-template';
|
||||||
import { DmpBlueprintDefinition } from '@app/core/model/dmp-blueprint/dmp-blueprint';
|
import { Description } from '@app/core/model/description/description';
|
||||||
import { DmpModel } from "@app/core/model/dmp/dmp";
|
import { Dmp, DmpUser } from "@app/core/model/dmp/dmp";
|
||||||
import { DmpListingModel } from "@app/core/model/dmp/dmp-listing";
|
import { DmpReference, Reference } from '@app/core/model/reference/reference';
|
||||||
import { RecentActivityModel } from "@app/core/model/recent-activity/recent-activity.model";
|
import { RecentActivityItemLookup } from '@app/core/query/recent-activity-item-lookup.lookup';
|
||||||
import { RecentDatasetModel } from "@app/core/model/recent-activity/recent-dataset-activity.model";
|
|
||||||
import { RecentDmpModel } from "@app/core/model/recent-activity/recent-dmp-activity.model";
|
|
||||||
import { RecentActivityCriteria } from "@app/core/query/recent-activity/recent-activity-criteria";
|
|
||||||
import { DashboardService } from "@app/core/services/dashboard/dashboard.service";
|
import { DashboardService } from "@app/core/services/dashboard/dashboard.service";
|
||||||
import { DatasetWizardService } from '@app/core/services/dataset-wizard/dataset-wizard.service';
|
|
||||||
import { DmpBlueprintService } from '@app/core/services/dmp/dmp-blueprint.service';
|
|
||||||
import { DmpService } from "@app/core/services/dmp/dmp.service";
|
|
||||||
import { LockService } from '@app/core/services/lock/lock.service';
|
|
||||||
import { MatomoService } from '@app/core/services/matomo/matomo-service';
|
import { MatomoService } from '@app/core/services/matomo/matomo-service';
|
||||||
import { SnackBarNotificationLevel, UiNotificationService } from '@app/core/services/notification/ui-notification-service';
|
|
||||||
import { EnumUtils } from '@app/core/services/utilities/enum-utils.service';
|
import { EnumUtils } from '@app/core/services/utilities/enum-utils.service';
|
||||||
import { FileUtils } from '@app/core/services/utilities/file-utils.service';
|
|
||||||
import { DatasetCopyDialogueComponent } from '@app/ui/dataset/dataset-wizard/dataset-copy-dialogue/dataset-copy-dialogue.component';
|
|
||||||
import { CloneDialogComponent } from "@app/ui/dmp/clone/clone-dialog/clone-dialog.component";
|
|
||||||
import { DmpEditorModel } from "@app/ui/dmp/editor/dmp-editor.model";
|
|
||||||
import { ExtraPropertiesFormModel } from "@app/ui/dmp/editor/general-tab/extra-properties-form.model";
|
|
||||||
import { FunderFormModel } from "@app/ui/dmp/editor/grant-tab/funder-form-model";
|
|
||||||
import { GrantTabModel } from "@app/ui/dmp/editor/grant-tab/grant-tab-model";
|
|
||||||
import { ProjectFormModel } from "@app/ui/dmp/editor/grant-tab/project-form-model";
|
|
||||||
import { DmpInvitationDialogComponent } from '@app/ui/dmp/invitation/dmp-invitation-dialog.component';
|
|
||||||
import { isNullOrUndefined } from '@app/utilities/enhancers/utils';
|
|
||||||
import { BaseComponent } from '@common/base/base.component';
|
import { BaseComponent } from '@common/base/base.component';
|
||||||
import { ConfirmationDialogComponent } from '@common/modules/confirmation-dialog/confirmation-dialog.component';
|
import { debounceTime, takeUntil } from 'rxjs/operators';
|
||||||
import { TranslateService } from '@ngx-translate/core';
|
import { nameof } from 'ts-simple-nameof';
|
||||||
import * as FileSaver from 'file-saver';
|
|
||||||
import { debounceTime, map, takeUntil } from 'rxjs/operators';
|
|
||||||
import { DmpStatus } from '../../../core/common/enum/dmp-status';
|
|
||||||
import { RecentActivityType } from '../../../core/common/enum/recent-activity-type';
|
|
||||||
import { DataTableMultiTypeRequest } from '../../../core/model/data-table/data-table-request';
|
|
||||||
import { DatasetListingModel } from '../../../core/model/dataset/dataset-listing';
|
|
||||||
import { AuthService } from '../../../core/services/auth/auth.service';
|
import { AuthService } from '../../../core/services/auth/auth.service';
|
||||||
|
|
||||||
@Component({
|
@Component({
|
||||||
|
@ -52,21 +24,10 @@ import { AuthService } from '../../../core/services/auth/auth.service';
|
||||||
})
|
})
|
||||||
export class DraftsComponent extends BaseComponent implements OnInit {
|
export class DraftsComponent extends BaseComponent implements OnInit {
|
||||||
|
|
||||||
@Output() totalCountRecentEdited: EventEmitter<any> = new EventEmitter();
|
lookup: RecentActivityItemLookup = new RecentActivityItemLookup();
|
||||||
|
|
||||||
@ViewChild("results") resultsContainer;
|
|
||||||
allRecentActivities: RecentActivityModel[];
|
|
||||||
recentActivityTypeEnum = RecentActivityType;
|
|
||||||
dmpModel: DmpEditorModel;
|
|
||||||
isDraft: boolean;
|
|
||||||
totalCount: number;
|
|
||||||
startIndex: number = 0;
|
|
||||||
dmpOffset: number = 0;
|
|
||||||
datasetOffset: number = 0;
|
|
||||||
offsetLess: number = 0;
|
|
||||||
pageSize: number = 5;
|
pageSize: number = 5;
|
||||||
dmpFormGroup: UntypedFormGroup;
|
listingItems: RecentActivityItem[];
|
||||||
hasMoreActivity: boolean = true;
|
|
||||||
public formGroup = new UntypedFormBuilder().group({
|
public formGroup = new UntypedFormBuilder().group({
|
||||||
like: new UntypedFormControl(),
|
like: new UntypedFormControl(),
|
||||||
order: new UntypedFormControl()
|
order: new UntypedFormControl()
|
||||||
|
@ -75,6 +36,9 @@ export class DraftsComponent extends BaseComponent implements OnInit {
|
||||||
|
|
||||||
order = RecentActivityOrder;
|
order = RecentActivityOrder;
|
||||||
|
|
||||||
|
totalCount: number;
|
||||||
|
startIndex: number = 0;
|
||||||
|
offsetLess: number = 0;
|
||||||
page: number = 1;
|
page: number = 1;
|
||||||
@Input() isActive: boolean = false;
|
@Input() isActive: boolean = false;
|
||||||
|
|
||||||
|
@ -83,38 +47,34 @@ export class DraftsComponent extends BaseComponent implements OnInit {
|
||||||
private router: Router,
|
private router: Router,
|
||||||
public enumUtils: EnumUtils,
|
public enumUtils: EnumUtils,
|
||||||
private authentication: AuthService,
|
private authentication: AuthService,
|
||||||
private dmpService: DmpService,
|
|
||||||
private dmpBlueprintService: DmpBlueprintService,
|
|
||||||
private dashboardService: DashboardService,
|
private dashboardService: DashboardService,
|
||||||
private language: TranslateService,
|
|
||||||
private dialog: MatDialog,
|
|
||||||
private uiNotificationService: UiNotificationService,
|
|
||||||
private datasetWizardService: DatasetWizardService,
|
|
||||||
private location: Location,
|
private location: Location,
|
||||||
private lockService: LockService,
|
private matomoService: MatomoService
|
||||||
private httpClient: HttpClient,
|
|
||||||
private matomoService: MatomoService,
|
|
||||||
private fileUtils: FileUtils
|
|
||||||
) {
|
) {
|
||||||
super();
|
super();
|
||||||
}
|
}
|
||||||
|
|
||||||
ngOnInit() {
|
ngOnInit() {
|
||||||
this.matomoService.trackPageView('Drafts');
|
this.matomoService.trackPageView('Recent DMP Activity');
|
||||||
this.route.queryParams.subscribe(params => {
|
this.route.queryParams.subscribe(params => {
|
||||||
if (this.isActive) {
|
if (this.isActive) {
|
||||||
let page = (params['page'] === undefined) ? 1 : +params['page'];
|
let page = (params['page'] === undefined) ? 1 : +params['page'];
|
||||||
this.page = (page <= 0) ? 1 : page;
|
this.page = (page <= 0) ? 1 : page;
|
||||||
|
|
||||||
this.datasetOffset = (this.page - 1) * this.pageSize;
|
this.startIndex = (this.page - 1) * this.pageSize;
|
||||||
this.dmpOffset = (this.page - 1) * this.pageSize;
|
|
||||||
if (this.page > 1) {
|
if (this.page > 1) {
|
||||||
this.offsetLess = (this.page - 2) * this.pageSize;
|
this.offsetLess = (this.page - 2) * this.pageSize;
|
||||||
}
|
}
|
||||||
|
|
||||||
let order = params['order'];
|
let order = params['order'];
|
||||||
if (order === undefined || (order != this.order.MODIFIED && order != this.order.LABEL)) {
|
if (this.isAuthenticated()) {
|
||||||
order = this.order.MODIFIED;
|
if (order === undefined || (order != this.order.UpdatedAt && order != this.order.Label && order != this.order.Status)) {
|
||||||
|
order = this.order.UpdatedAt;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
if (order === undefined || (order != this.order.PUBLISHED && order != this.order.LABEL)) {
|
||||||
|
order = this.order.PUBLISHED;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
this.formGroup.get('order').setValue(order);
|
this.formGroup.get('order').setValue(order);
|
||||||
|
|
||||||
|
@ -125,49 +85,7 @@ export class DraftsComponent extends BaseComponent implements OnInit {
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
if (this.isAuthenticated()) {
|
if (this.isAuthenticated()) {
|
||||||
if (!this.formGroup.get('order').value) {
|
this.refresh();
|
||||||
this.formGroup.get('order').setValue(this.order.MODIFIED);
|
|
||||||
}
|
|
||||||
const fields: Array<string> = [((this.formGroup.get('order').value === 'status') || (this.formGroup.get('order').value === 'label') ? '+' : "-") + this.formGroup.get('order').value];
|
|
||||||
const allDataTableRequest: DataTableMultiTypeRequest<RecentActivityCriteria> = new DataTableMultiTypeRequest(this.dmpOffset, this.datasetOffset, 5, { fields: fields });
|
|
||||||
allDataTableRequest.criteria = new RecentActivityCriteria();
|
|
||||||
allDataTableRequest.criteria.like = this.formGroup.get('like').value;
|
|
||||||
allDataTableRequest.criteria.order = this.formGroup.get('order').value;
|
|
||||||
allDataTableRequest.criteria.status = 0;
|
|
||||||
|
|
||||||
this.dashboardService
|
|
||||||
.getRecentActivity(allDataTableRequest)
|
|
||||||
.pipe(takeUntil(this._destroyed))
|
|
||||||
.subscribe(response => {
|
|
||||||
this.allRecentActivities = response;
|
|
||||||
this.allRecentActivities.forEach(recentActivity => {
|
|
||||||
if (recentActivity.type === RecentActivityType.Dataset) {
|
|
||||||
// this.datasetOffset = this.datasetOffset + 1;
|
|
||||||
this.datasetOffset = this.page * this.pageSize;
|
|
||||||
} else if (recentActivity.type === RecentActivityType.Dmp) {
|
|
||||||
// this.dmpOffset = this.dmpOffset + 1;
|
|
||||||
this.dmpOffset = this.page * this.pageSize;
|
|
||||||
}
|
|
||||||
});
|
|
||||||
this.totalCountRecentEdited.emit(this.allRecentActivities.length);
|
|
||||||
if (this.allRecentActivities.length == 0 && this.page > 1) {
|
|
||||||
let queryParams = { type: "recent", page: 1, order: this.formGroup.get("order").value };
|
|
||||||
if (this.formGroup.get("like").value) {
|
|
||||||
queryParams['keyword'] = this.formGroup.get("like").value;
|
|
||||||
}
|
|
||||||
this.router.navigate(["/home"], { queryParams: queryParams })
|
|
||||||
}
|
|
||||||
});
|
|
||||||
this.formGroup.get('like').valueChanges
|
|
||||||
.pipe(takeUntil(this._destroyed), debounceTime(500))
|
|
||||||
.subscribe(x => {
|
|
||||||
this.refresh()
|
|
||||||
});
|
|
||||||
this.formGroup.get('order').valueChanges
|
|
||||||
.pipe(takeUntil(this._destroyed))
|
|
||||||
.subscribe(x => {
|
|
||||||
this.refresh()
|
|
||||||
});
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -178,578 +96,93 @@ export class DraftsComponent extends BaseComponent implements OnInit {
|
||||||
}
|
}
|
||||||
|
|
||||||
updateUrl() {
|
updateUrl() {
|
||||||
let parameters = "?type=drafts" +
|
let parameters = "?type=dmps" +
|
||||||
(this.page != 1 ? "&page=" + this.page : "") +
|
(this.page != 1 ? "&page=" + this.page : "") +
|
||||||
(this.formGroup.get("order").value != this.order.MODIFIED ? "&order=" + this.formGroup.get("order").value : "") +
|
(((this.formGroup.get("order").value != this.order.MODIFIED && !this.publicMode) || (this.formGroup.get("order").value != this.order.PUBLISHED && this.publicMode)) ? "&order=" + this.formGroup.get("order").value : "") +
|
||||||
(this.formGroup.get("like").value ? ("&keyword=" + this.formGroup.get("like").value) : "");
|
(this.formGroup.get("like").value ? ("&keyword=" + this.formGroup.get("like").value) : "");
|
||||||
this.location.go(this.router.url.split('?')[0] + parameters);
|
this.location.go(this.router.url.split('?')[0] + parameters);
|
||||||
}
|
}
|
||||||
|
|
||||||
getDatasets(activity: RecentDmpModel): DatasetUrlListing[] {
|
|
||||||
return activity.datasets;
|
|
||||||
}
|
|
||||||
|
|
||||||
getGroupId(activity: RecentDmpModel): string {
|
|
||||||
return activity.groupId;
|
|
||||||
}
|
|
||||||
|
|
||||||
getDmp(activity: RecentDatasetModel): String {
|
|
||||||
return activity.dmp;
|
|
||||||
}
|
|
||||||
|
|
||||||
getDmpId(activity: RecentDatasetModel): String {
|
|
||||||
return activity.dmpId;
|
|
||||||
}
|
|
||||||
|
|
||||||
public isAuthenticated(): boolean {
|
public isAuthenticated(): boolean {
|
||||||
return this.authentication.currentAccountIsAuthenticated();
|
return this.authentication.currentAccountIsAuthenticated();
|
||||||
}
|
}
|
||||||
|
|
||||||
isUserOwner(activity: DmpListingModel): boolean {
|
|
||||||
const principalId: string = this.authentication.userId()?.toString();
|
|
||||||
if (principalId) return !!activity.users.find(x => (x.role === Role.Owner) && (principalId === x.id));
|
|
||||||
}
|
|
||||||
|
|
||||||
editClicked(dmp: DmpListingModel) {
|
|
||||||
this.router.navigate(['/plans/edit/' + dmp.id]);
|
|
||||||
}
|
|
||||||
|
|
||||||
deleteDmpClicked(dmp: DmpListingModel) {
|
|
||||||
this.lockService.checkLockStatus(dmp.id).pipe(takeUntil(this._destroyed))
|
|
||||||
.subscribe(lockStatus => {
|
|
||||||
if (!lockStatus) {
|
|
||||||
this.openDeleteDmpDialog(dmp);
|
|
||||||
} else {
|
|
||||||
this.openDmpLockedByUserDialog();
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
cloneOrNewVersionClicked(dmp: RecentActivityModel, isNewVersion: boolean) {
|
|
||||||
this.dmpService.getSingle(dmp.id).pipe(map(data => data as DmpModel))
|
|
||||||
.pipe(takeUntil(this._destroyed))
|
|
||||||
.subscribe(data => {
|
|
||||||
this.dmpModel = new DmpEditorModel();
|
|
||||||
this.dmpModel.grant = new GrantTabModel();
|
|
||||||
this.dmpModel.project = new ProjectFormModel();
|
|
||||||
this.dmpModel.funder = new FunderFormModel();
|
|
||||||
this.dmpModel.extraProperties = new ExtraPropertiesFormModel();
|
|
||||||
this.dmpModel.fromModel(data);
|
|
||||||
this.dmpModel.status = DmpStatus.Draft;
|
|
||||||
this.dmpFormGroup = this.dmpModel.buildForm();
|
|
||||||
|
|
||||||
if (!isNullOrUndefined(this.formGroup.get('profile').value)) {
|
|
||||||
this.dmpBlueprintService.getSingle(this.formGroup.get('profile').value)
|
|
||||||
.pipe(takeUntil(this._destroyed))
|
|
||||||
.subscribe(result => {
|
|
||||||
this.checkForGrant(result.definition);
|
|
||||||
this.checkForFunder(result.definition);
|
|
||||||
this.checkForProject(result.definition);
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!isNewVersion) {
|
|
||||||
this.dmpFormGroup.get('label').setValue(dmp.title + " New");
|
|
||||||
}
|
|
||||||
this.openCloneDialog(isNewVersion);
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
private checkForGrant(blueprint: DmpBlueprintDefinition) {
|
|
||||||
let hasGrant = false;
|
|
||||||
blueprint.sections.forEach(section => section.fields.forEach(
|
|
||||||
field => {
|
|
||||||
if (field.category as unknown === DmpBlueprintSectionFieldCategory.SYSTEM && field.systemFieldType === DmpBlueprintSystemFieldType.GRANT) {
|
|
||||||
hasGrant = true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
));
|
|
||||||
if (!hasGrant) {
|
|
||||||
this.formGroup.removeControl('grant');
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private checkForFunder(blueprint: DmpBlueprintDefinition) {
|
|
||||||
let hasFunder = false;
|
|
||||||
blueprint.sections.forEach(section => section.fields.forEach(
|
|
||||||
field => {
|
|
||||||
if (field.category as unknown === DmpBlueprintSectionFieldCategory.SYSTEM && field.systemFieldType === DmpBlueprintSystemFieldType.FUNDER) {
|
|
||||||
hasFunder = true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
));
|
|
||||||
if (!hasFunder) {
|
|
||||||
this.formGroup.removeControl('funder');
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private checkForProject(blueprint: DmpBlueprintDefinition) {
|
|
||||||
let hasProject = false;
|
|
||||||
blueprint.sections.forEach(section => section.fields.forEach(
|
|
||||||
field => {
|
|
||||||
if (field.category as unknown === DmpBlueprintSectionFieldCategory.SYSTEM && field.systemFieldType === DmpBlueprintSystemFieldType.PROJECT) {
|
|
||||||
hasProject = true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
));
|
|
||||||
if (!hasProject) {
|
|
||||||
this.formGroup.removeControl('project');
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
openCloneDialog(isNewVersion: boolean) {
|
|
||||||
const dialogRef = this.dialog.open(CloneDialogComponent, {
|
|
||||||
maxWidth: '700px',
|
|
||||||
maxHeight: '80vh',
|
|
||||||
data: {
|
|
||||||
formGroup: this.dmpFormGroup,
|
|
||||||
datasets: this.dmpFormGroup.get('datasets').value,
|
|
||||||
isNewVersion: isNewVersion,
|
|
||||||
confirmButton: this.language.instant('DMP-EDITOR.CLONE-DIALOG.SAVE'),
|
|
||||||
cancelButton: this.language.instant('DMP-EDITOR.CLONE-DIALOG.CANCEL'),
|
|
||||||
}
|
|
||||||
});
|
|
||||||
dialogRef.afterClosed().pipe(takeUntil(this._destroyed)).subscribe(result => {
|
|
||||||
if (result) {
|
|
||||||
if (!isNewVersion) {
|
|
||||||
this.dmpService.clone(this.dmpFormGroup.getRawValue(), this.dmpFormGroup.get('id').value)
|
|
||||||
.pipe(takeUntil(this._destroyed))
|
|
||||||
.subscribe(
|
|
||||||
complete => this.onCloneOrNewVersionCallbackSuccess(complete),
|
|
||||||
error => this.onCloneOrNewVersionCallbackError(error)
|
|
||||||
);
|
|
||||||
} else if (isNewVersion) {
|
|
||||||
this.dmpService.newVersion(this.dmpFormGroup.getRawValue(), this.dmpFormGroup.get('id').value)
|
|
||||||
.pipe(takeUntil(this._destroyed))
|
|
||||||
.subscribe(
|
|
||||||
complete => this.onCloneOrNewVersionCallbackSuccess(complete),
|
|
||||||
error => this.onCloneOrNewVersionCallbackError(error)
|
|
||||||
);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
openDeleteDmpDialog(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.onDeleteCallbackSuccess(),
|
|
||||||
error => this.onDeleteCallbackError(error)
|
|
||||||
);
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
openDmpLockedByUserDialog() {
|
|
||||||
const dialogRef = this.dialog.open(ConfirmationDialogComponent, {
|
|
||||||
maxWidth: '400px',
|
|
||||||
restoreFocus: false,
|
|
||||||
data: {
|
|
||||||
message: this.language.instant('DMP-EDITOR.ACTIONS.LOCK')
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
openShareDialog(rowId: any, rowName: any) {
|
|
||||||
const dialogRef = this.dialog.open(DmpInvitationDialogComponent, {
|
|
||||||
// height: '250px',
|
|
||||||
// width: '700px',
|
|
||||||
autoFocus: false,
|
|
||||||
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']);
|
|
||||||
}
|
|
||||||
|
|
||||||
reloadPage(): void {
|
|
||||||
const path = this.location.path();
|
|
||||||
this.router.navigateByUrl('/reload', { skipLocationChange: true }).then(() => {
|
|
||||||
this.router.navigate([path]);
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
onDeleteCallbackSuccess(): void {
|
|
||||||
this.uiNotificationService.snackBarNotification(this.language.instant('GENERAL.SNACK-BAR.SUCCESSFUL-DELETE'), SnackBarNotificationLevel.Success);
|
|
||||||
this.reloadPage();
|
|
||||||
}
|
|
||||||
|
|
||||||
onDeleteCallbackError(error) {
|
|
||||||
this.uiNotificationService.snackBarNotification(error.error.message ? this.language.instant(error.error.message) : this.language.instant('GENERAL.SNACK-BAR.UNSUCCESSFUL-DELETE'), SnackBarNotificationLevel.Error);
|
|
||||||
}
|
|
||||||
|
|
||||||
onCloneOrNewVersionCallbackSuccess(dmpId: String): void {
|
|
||||||
this.uiNotificationService.snackBarNotification(this.language.instant('GENERAL.SNACK-BAR.SUCCESSFUL-UPDATE'), SnackBarNotificationLevel.Success);
|
|
||||||
this.router.navigate(['/plans/edit/', dmpId]);
|
|
||||||
}
|
|
||||||
|
|
||||||
onCloneOrNewVersionCallbackError(error: any) {
|
|
||||||
this.uiNotificationService.snackBarNotification(error.error.message ? this.language.instant(error.error.message) : this.language.instant('GENERAL.SNACK-BAR.UNSUCCESSFUL-CLONE'), SnackBarNotificationLevel.Error);
|
|
||||||
}
|
|
||||||
|
|
||||||
redirect(id: string, type: RecentActivityType) {
|
|
||||||
switch (type) {
|
|
||||||
case RecentActivityType.Grant: {
|
|
||||||
this.router.navigate(["grants/edit/" + id]);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
case RecentActivityType.Dataset: {
|
|
||||||
if (this.isAuthenticated()) {
|
|
||||||
this.router.navigate(['../datasets/overview/' + id]);
|
|
||||||
}
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
case RecentActivityType.Dmp: {
|
|
||||||
if (this.isAuthenticated()) {
|
|
||||||
this.router.navigate(['../plans/overview/' + id]);
|
|
||||||
}
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
default:
|
|
||||||
throw new Error("Unsupported Activity Type ");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
navigateToUrl(id: string, type: RecentActivityType): string[] {
|
|
||||||
switch (type) {
|
|
||||||
case RecentActivityType.Grant: {
|
|
||||||
return ["grants/edit/" + id];
|
|
||||||
}
|
|
||||||
case RecentActivityType.Dataset: {
|
|
||||||
if (this.isAuthenticated()) {
|
|
||||||
return ['../datasets/overview/' + id];
|
|
||||||
} else {
|
|
||||||
return ['../explore/publicOverview', id];
|
|
||||||
}
|
|
||||||
}
|
|
||||||
case RecentActivityType.Dmp: {
|
|
||||||
if (this.isAuthenticated()) {
|
|
||||||
return ['../plans/overview/' + id];
|
|
||||||
} else {
|
|
||||||
return ['../explore-plans/publicOverview', id];
|
|
||||||
}
|
|
||||||
}
|
|
||||||
default:
|
|
||||||
throw new Error("Unsupported Activity Type ");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
roleDisplay(value: any) {
|
|
||||||
const principalId: string = this.authentication.userId()?.toString();
|
|
||||||
let role: number;
|
|
||||||
if (principalId) {
|
|
||||||
value.forEach(element => {
|
|
||||||
if (principalId === 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');
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// dmpBlueprintDisplay(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.fileUtils.getFilenameFromContentDispositionHeader(response.headers.get('Content-Disposition'));
|
|
||||||
|
|
||||||
FileSaver.saveAs(blob, filename);
|
|
||||||
this.matomoService.trackDownload('dmps', "xml", id);
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
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.fileUtils.getFilenameFromContentDispositionHeader(response.headers.get('Content-Disposition'));
|
|
||||||
|
|
||||||
FileSaver.saveAs(blob, filename);
|
|
||||||
this.matomoService.trackDownload('dmps', "docx", id);
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
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.fileUtils.getFilenameFromContentDispositionHeader(response.headers.get('Content-Disposition'));
|
|
||||||
|
|
||||||
FileSaver.saveAs(blob, filename);
|
|
||||||
this.matomoService.trackDownload('dmps', "pdf", id);
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
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.fileUtils.getFilenameFromContentDispositionHeader(response.headers.get('Content-Disposition'));
|
|
||||||
FileSaver.saveAs(blob, filename);
|
|
||||||
this.matomoService.trackDownload('dmps', "json", id);
|
|
||||||
}, async error => {
|
|
||||||
this.onExportCallbackError(error);
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
async onExportCallbackError(error: any) {
|
|
||||||
const errorJsonText = await error.error.text();
|
|
||||||
const errorObj = JSON.parse(errorJsonText);
|
|
||||||
this.uiNotificationService.snackBarNotification(errorObj.message, SnackBarNotificationLevel.Error);
|
|
||||||
}
|
|
||||||
|
|
||||||
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.fileUtils.getFilenameFromContentDispositionHeader(response.headers.get('Content-Disposition'));
|
|
||||||
|
|
||||||
FileSaver.saveAs(blob, filename);
|
|
||||||
this.matomoService.trackDownload('datasets', "pdf", dataset.id);
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
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.fileUtils.getFilenameFromContentDispositionHeader(response.headers.get('Content-Disposition'));
|
|
||||||
|
|
||||||
FileSaver.saveAs(blob, filename);
|
|
||||||
this.matomoService.trackDownload('datasets', "docx", dataset.id);
|
|
||||||
});
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
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.fileUtils.getFilenameFromContentDispositionHeader(response.headers.get('Content-Disposition'));
|
|
||||||
|
|
||||||
FileSaver.saveAs(blob, filename);
|
|
||||||
this.matomoService.trackDownload('datasets', "xml", dataset.id);
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
viewVersions(rowId: String, rowLabel: String, activity: DmpListingModel) {
|
|
||||||
if (activity.public && !this.isUserOwner(activity)) {
|
|
||||||
let url = this.router.createUrlTree(['/explore-plans/versions/', rowId, { groupLabel: rowLabel }]);
|
|
||||||
window.open(url.toString(), '_blank');
|
|
||||||
// this.router.navigate(['/explore-plans/versions/' + rowId], { queryParams: { groupLabel: rowLabel } });
|
|
||||||
} else {
|
|
||||||
let url = this.router.createUrlTree(['/plans/versions/', rowId, { groupLabel: rowLabel }]);
|
|
||||||
window.open(url.toString(), '_blank');
|
|
||||||
// this.router.navigate(['/plans/versions/' + rowId], { queryParams: { groupLabel: rowLabel } });
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
openDmpSearchDialogue(dataset: RecentDatasetModel) {
|
|
||||||
const formControl = new UntypedFormControl();
|
|
||||||
const dialogRef = this.dialog.open(DatasetCopyDialogueComponent, {
|
|
||||||
width: '500px',
|
|
||||||
restoreFocus: false,
|
|
||||||
data: {
|
|
||||||
formControl: formControl,
|
|
||||||
datasetId: dataset.id,
|
|
||||||
datasetProfileId: dataset.profile.id,
|
|
||||||
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;
|
|
||||||
// let url = this.router.createUrlTree(['/datasets/copy/', result.datasetId, { newDmpId: newDmpId }]);
|
|
||||||
// window.open(url.toString(), '_blank');
|
|
||||||
this.router.navigate(['/datasets/copy/' + result.datasetId], { queryParams: { newDmpId: newDmpId } });
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
deleteDatasetClicked(id: string) {
|
|
||||||
this.lockService.checkLockStatus(id).pipe(takeUntil(this._destroyed))
|
|
||||||
.subscribe(lockStatus => {
|
|
||||||
if (!lockStatus) {
|
|
||||||
this.openDeleteDatasetDialog(id);
|
|
||||||
} else {
|
|
||||||
this.openDatasetLockedByUserDialog();
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
openDeleteDatasetDialog(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.onDeleteCallbackSuccess(),
|
|
||||||
error => this.onDeleteCallbackError(error)
|
|
||||||
);
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
openDatasetLockedByUserDialog() {
|
|
||||||
const dialogRef = this.dialog.open(ConfirmationDialogComponent, {
|
|
||||||
maxWidth: '400px',
|
|
||||||
restoreFocus: false,
|
|
||||||
data: {
|
|
||||||
message: this.language.instant('DATASET-WIZARD.ACTIONS.LOCK')
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
refresh(): void {
|
refresh(): void {
|
||||||
this.datasetOffset = 0;
|
if (!this.formGroup.get('order').value) {
|
||||||
this.dmpOffset = 0;
|
this.formGroup.get('order').setValue(this.order.UpdatedAt);
|
||||||
this.page = 1;
|
}
|
||||||
this.updateUrl();
|
this.lookup.onlyDraft = true;
|
||||||
|
this.lookup.page = { size: this.pageSize, offset: 0 };
|
||||||
|
this.lookup.orderField = this.formGroup.get('order').value;
|
||||||
|
this.lookup.like = this.formGroup.get('like').value;
|
||||||
|
this.lookup.project = {
|
||||||
|
|
||||||
const fields: Array<string> = [((this.formGroup.get('order').value === 'status') || (this.formGroup.get('order').value === 'label') ? '+' : "-") + this.formGroup.get('order').value];
|
fields: [
|
||||||
// const fields: Array<string> = ["-modified"];
|
[nameof<RecentActivityItem>(x => x.dmp), nameof<Dmp>(x => x.id)].join('.'),
|
||||||
this.startIndex = 0;
|
[nameof<RecentActivityItem>(x => x.dmp), nameof<Dmp>(x => x.label)].join('.'),
|
||||||
const allDataTableRequest: DataTableMultiTypeRequest<RecentActivityCriteria> = new DataTableMultiTypeRequest(0, 0, this.pageSize, { fields: fields });
|
[nameof<RecentActivityItem>(x => x.dmp), nameof<Dmp>(x => x.status)].join('.'),
|
||||||
allDataTableRequest.criteria = new RecentActivityCriteria();
|
[nameof<RecentActivityItem>(x => x.dmp), nameof<Dmp>(x => x.accessType)].join('.'),
|
||||||
allDataTableRequest.criteria.like = this.formGroup.get("like").value;
|
[nameof<RecentActivityItem>(x => x.dmp), nameof<Dmp>(x => x.version)].join('.'),
|
||||||
allDataTableRequest.criteria.order = this.formGroup.get("order").value;
|
[nameof<RecentActivityItem>(x => x.dmp), nameof<Dmp>(x => x.groupId)].join('.'),
|
||||||
allDataTableRequest.criteria.status = 0;
|
[nameof<RecentActivityItem>(x => x.dmp), nameof<Dmp>(x => x.updatedAt)].join('.'),
|
||||||
|
[nameof<RecentActivityItem>(x => x.dmp), nameof<Dmp>(x => x.descriptions), nameof<Description>(x => x.id)].join('.'),
|
||||||
|
[nameof<RecentActivityItem>(x => x.dmp), nameof<Dmp>(x => x.descriptions), nameof<Description>(x => x.label)].join('.'),
|
||||||
|
[nameof<RecentActivityItem>(x => x.dmp), nameof<Dmp>(x => x.dmpUsers), nameof<DmpUser>(x => x.id)].join('.'),
|
||||||
|
[nameof<RecentActivityItem>(x => x.dmp), nameof<Dmp>(x => x.dmpUsers), nameof<DmpUser>(x => x.user.id)].join('.'),
|
||||||
|
[nameof<RecentActivityItem>(x => x.dmp), nameof<Dmp>(x => x.dmpUsers), nameof<DmpUser>(x => x.role)].join('.'),
|
||||||
|
|
||||||
|
[nameof<RecentActivityItem>(x => x.description), nameof<Description>(x => x.id)].join('.'),
|
||||||
|
[nameof<RecentActivityItem>(x => x.description), nameof<Description>(x => x.label)].join('.'),
|
||||||
|
[nameof<RecentActivityItem>(x => x.description), nameof<Description>(x => x.status)].join('.'),
|
||||||
|
[nameof<RecentActivityItem>(x => x.description), nameof<Description>(x => x.updatedAt)].join('.'),
|
||||||
|
[nameof<RecentActivityItem>(x => x.description), nameof<Description>(x => x.descriptionTemplate), nameof<DescriptionTemplate>(x => x.id)].join('.'),
|
||||||
|
[nameof<RecentActivityItem>(x => x.description), nameof<Description>(x => x.descriptionTemplate), nameof<DescriptionTemplate>(x => x.label)].join('.'),
|
||||||
|
[nameof<RecentActivityItem>(x => x.description), nameof<Description>(x => x.descriptionTemplate), nameof<DescriptionTemplate>(x => x.groupId)].join('.'),
|
||||||
|
[nameof<RecentActivityItem>(x => x.description), nameof<Description>(x => x.dmp), nameof<Dmp>(x => x.id)].join('.'),
|
||||||
|
[nameof<RecentActivityItem>(x => x.description), nameof<Description>(x => x.dmp), nameof<Dmp>(x => x.label)].join('.'),
|
||||||
|
[nameof<RecentActivityItem>(x => x.description), nameof<Description>(x => x.dmp), nameof<Dmp>(x => x.accessType)].join('.'),
|
||||||
|
[nameof<RecentActivityItem>(x => x.description), nameof<Description>(x => x.dmp), nameof<Dmp>(x => x.dmpUsers), nameof<DmpUser>(x => x.id)].join('.'),
|
||||||
|
[nameof<RecentActivityItem>(x => x.description), nameof<Description>(x => x.dmp), nameof<Dmp>(x => x.dmpUsers), nameof<DmpUser>(x => x.user.id)].join('.'),
|
||||||
|
[nameof<RecentActivityItem>(x => x.description), nameof<Description>(x => x.dmp), nameof<Dmp>(x => x.dmpUsers), nameof<DmpUser>(x => x.role)].join('.'),
|
||||||
|
[nameof<RecentActivityItem>(x => x.description), nameof<Description>(x => x.dmp), nameof<Dmp>(x => x.dmpReferences), nameof<DmpReference>(x => x.id)].join('.'),
|
||||||
|
[nameof<RecentActivityItem>(x => x.description), nameof<Description>(x => x.dmp), nameof<Dmp>(x => x.dmpReferences), nameof<DmpReference>(x => x.reference), nameof<Reference>(x => x.id)].join('.'),
|
||||||
|
[nameof<RecentActivityItem>(x => x.description), nameof<Description>(x => x.dmp), nameof<Dmp>(x => x.dmpReferences), nameof<DmpReference>(x => x.reference), nameof<Reference>(x => x.label)].join('.'),
|
||||||
|
[nameof<RecentActivityItem>(x => x.description), nameof<Description>(x => x.dmp), nameof<Dmp>(x => x.dmpReferences), nameof<DmpReference>(x => x.reference), nameof<Reference>(x => x.type)].join('.'),
|
||||||
|
[nameof<RecentActivityItem>(x => x.description), nameof<Description>(x => x.dmp), nameof<Dmp>(x => x.dmpReferences), nameof<DmpReference>(x => x.reference), nameof<Reference>(x => x.reference)].join('.'),
|
||||||
|
]
|
||||||
|
};
|
||||||
|
|
||||||
this.dashboardService
|
this.dashboardService
|
||||||
.getRecentActivity(allDataTableRequest)
|
.getMyRecentActivityItems(this.lookup)
|
||||||
.pipe(takeUntil(this._destroyed))
|
.pipe(takeUntil(this._destroyed))
|
||||||
.subscribe(response => {
|
.subscribe(response => {
|
||||||
this.allRecentActivities = response;
|
this.listingItems = response;
|
||||||
this.allRecentActivities.forEach(recentActivity => {
|
//this.totalCount = response.totalCount;
|
||||||
if (recentActivity.type === RecentActivityType.Dataset) {
|
|
||||||
// this.datasetOffset = this.datasetOffset + 1;
|
|
||||||
this.datasetOffset = this.page * this.pageSize;
|
|
||||||
} else if (recentActivity.type === RecentActivityType.Dmp) {
|
|
||||||
// this.dmpOffset = this.dmpOffset + 1;
|
|
||||||
this.dmpOffset = this.page * this.pageSize;
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
if (response.length < this.pageSize) {
|
|
||||||
this.hasMoreActivity = false;
|
//this.totalCountDmps.emit(this.dmpActivities.length);
|
||||||
} else {
|
// if (this.totalCount > 0 && this.totalCount <= (this.page - 1) * this.pageSize && this.page > 1) {
|
||||||
this.hasMoreActivity = true;
|
// let queryParams = { type: "dmps", page: 1, order: this.formGroup.get("order").value };
|
||||||
}
|
// if (this.formGroup.get("like").value) {
|
||||||
this.totalCountRecentEdited.emit(this.allRecentActivities.length);
|
// queryParams['keyword'] = this.formGroup.get("like").value;
|
||||||
|
// }
|
||||||
|
// this.router.navigate(["/home"], { queryParams: queryParams })
|
||||||
|
// }
|
||||||
|
// this.totalCount < this.pageSize ? this.totalCountDmps.emit(response.totalCount) : this.totalCountDmps.emit(this.pageSize);
|
||||||
|
// this.totalCountDmps.emit(this.totalCount);
|
||||||
|
// this.dmpActivities.forEach(dmpActivity => {
|
||||||
|
// const recentActivity: RecentActivity = {
|
||||||
|
// activityData: dmpActivity,
|
||||||
|
// activityType: RecentActivityType.Dmp
|
||||||
|
// };
|
||||||
|
// this.allRecentActivities.push(recentActivity)
|
||||||
|
// })
|
||||||
});
|
});
|
||||||
}
|
this.formGroup.get('like').valueChanges
|
||||||
|
.pipe(takeUntil(this._destroyed), debounceTime(500))
|
||||||
public loadNextOrPrevious(more: boolean = true) {
|
.subscribe(x => this.refresh());
|
||||||
const fields: Array<string> = [((this.formGroup.get('order').value === 'status') || (this.formGroup.get('order').value === 'label') ? '+' : "-") + this.formGroup.get('order').value];
|
this.formGroup.get('order').valueChanges
|
||||||
// const fields: Array<string> = ["-modified"];
|
.pipe(takeUntil(this._destroyed))
|
||||||
let request;
|
.subscribe(x => this.refresh());
|
||||||
if (more) {
|
|
||||||
request = new DataTableMultiTypeRequest<RecentActivityCriteria>(this.dmpOffset, this.datasetOffset, this.pageSize, { fields: fields });
|
|
||||||
} else {
|
|
||||||
request = new DataTableMultiTypeRequest<RecentActivityCriteria>(this.offsetLess, this.offsetLess, this.pageSize, { fields: fields });
|
|
||||||
}
|
|
||||||
request.criteria = new RecentActivityCriteria();
|
|
||||||
request.criteria.like = this.formGroup.get("like").value ? this.formGroup.get("like").value : "";
|
|
||||||
request.criteria.order = this.formGroup.get("order").value;
|
|
||||||
request.criteria.status = 0;
|
|
||||||
|
|
||||||
this.dashboardService.getRecentActivity(request).pipe(takeUntil(this._destroyed)).subscribe(result => {
|
|
||||||
if (!result || result.length == 0) {
|
|
||||||
this.hasMoreActivity = false;
|
|
||||||
// return [];
|
|
||||||
} else {
|
|
||||||
this.page = this.page + (more ? 1 : -1);
|
|
||||||
this.updateUrl();
|
|
||||||
// if(more) {
|
|
||||||
// result.forEach(recentActivity => {
|
|
||||||
// if (recentActivity.type === RecentActivityType.Dataset) {
|
|
||||||
// this.datasetOffset = this.datasetOffset + 1;
|
|
||||||
this.datasetOffset = this.page * this.pageSize;
|
|
||||||
// } else if (recentActivity.type === RecentActivityType.Dmp) {
|
|
||||||
// this.dmpOffset = this.dmpOffset + 1;
|
|
||||||
this.dmpOffset = this.page * this.pageSize;
|
|
||||||
// }
|
|
||||||
// });
|
|
||||||
// }
|
|
||||||
if (this.page > 1) {
|
|
||||||
this.offsetLess = (this.page - 2) * this.pageSize;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (result.length < this.pageSize) {
|
|
||||||
this.hasMoreActivity = false;
|
|
||||||
} else {
|
|
||||||
this.hasMoreActivity = true;
|
|
||||||
}
|
|
||||||
|
|
||||||
// this.allRecentActivities = this.allRecentActivities.concat(result);
|
|
||||||
// this.allRecentActivities = this.allRecentActivities.length > 0 ? this.mergeTwoSortedLists(this.allRecentActivities, result, this.formGroup.get('order').value) : result;
|
|
||||||
this.allRecentActivities = result;
|
|
||||||
this.totalCountRecentEdited.emit(this.allRecentActivities.length);
|
|
||||||
if (more) {
|
|
||||||
this.resultsContainer.nativeElement.scrollIntoView();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,20 +0,0 @@
|
||||||
<div class="card card-stats">
|
|
||||||
<div class="card-header card-header-default card-header-icon" [class.clickable]="isAuthenticated()" (click)="navigateToUrl()">
|
|
||||||
<div *ngIf="routerLink" class="card-icon">
|
|
||||||
<i class="material-icons-outlined">{{ icon }}</i>
|
|
||||||
</div>
|
|
||||||
<div *ngIf="!routerLink" class="card-icon card-icon-nocursor">
|
|
||||||
<i class="material-icons-outlined">{{ icon }}</i>
|
|
||||||
</div>
|
|
||||||
<p class="card-category">{{ title | translate }}</p>
|
|
||||||
<h3 class="card-title">
|
|
||||||
<b>{{ subtitle }}</b>
|
|
||||||
</h3>
|
|
||||||
</div>
|
|
||||||
<div class="card-footer">
|
|
||||||
<div class="stats">
|
|
||||||
<a *ngIf="routerLink" class="view-all" [class.clickable]="isAuthenticated()" [routerLink]="[routerLink]">{{ 'GENERAL.ACTIONS.VIEW-ALL' | translate}}</a>
|
|
||||||
<a *ngIf="!routerLink" class="view-all-hidden" [class.clickable]="isAuthenticated()">{{ 'GENERAL.ACTIONS.VIEW-ALL' | translate}}</a>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
|
@ -1,55 +0,0 @@
|
||||||
import { Component, OnInit, Input, Output, EventEmitter } from "@angular/core";
|
|
||||||
import { Router } from "@angular/router";
|
|
||||||
import { AuthService } from "../../../core/services/auth/auth.service";
|
|
||||||
|
|
||||||
// declare interface RouteInfo {
|
|
||||||
// path: string;
|
|
||||||
// title: string;
|
|
||||||
// subtitle: string;
|
|
||||||
// icon: string;
|
|
||||||
// }
|
|
||||||
// export const INFO_COUNTER_ROUTES: RouteInfo[] = [
|
|
||||||
// { path: '', title: 'DATA MANAGEMENT PLANS', subtitle: '4', icon: 'view_agenda' },
|
|
||||||
// { path: '', title: 'RELATED DATA DESCRIPTIONS', subtitle: '20', icon: 'library_books' },
|
|
||||||
// { path: '', title: 'RELATED GRANTS', subtitle: '4', icon: 'work_outline' },
|
|
||||||
// { path: '', title: 'ORGANIZATIONS', subtitle: '20', icon: 'scatter_plot' }
|
|
||||||
// ];
|
|
||||||
|
|
||||||
@Component({
|
|
||||||
selector: "app-info-counter",
|
|
||||||
templateUrl: "./info-counter.component.html",
|
|
||||||
styleUrls: ["./info-counter.component.css"]
|
|
||||||
})
|
|
||||||
export class InfoCounterComponent implements OnInit {
|
|
||||||
@Input() title: string;
|
|
||||||
@Input() subtitle: string;
|
|
||||||
@Input() icon: string;
|
|
||||||
@Input() routerLink: string;
|
|
||||||
@Input() buttonRedirectLink: string;
|
|
||||||
@Output() onClick: EventEmitter<void> = new EventEmitter<void>();
|
|
||||||
|
|
||||||
infoCounterItems: any[];
|
|
||||||
|
|
||||||
constructor(private router: Router, private authService: AuthService) {}
|
|
||||||
|
|
||||||
ngOnInit() {
|
|
||||||
// this.infoCounterItems = INFO_COUNTER_ROUTES.filter(infoCounterItem => infoCounterItem);
|
|
||||||
}
|
|
||||||
|
|
||||||
navigateToUrl() {
|
|
||||||
if (!this.isAuthenticated()) { return; }
|
|
||||||
this.router.navigate([this.routerLink]);
|
|
||||||
}
|
|
||||||
|
|
||||||
createNew() {
|
|
||||||
this.router.navigate([this.buttonRedirectLink]);
|
|
||||||
}
|
|
||||||
|
|
||||||
isAuthenticated() {
|
|
||||||
return this.authService.currentAccountIsAuthenticated();
|
|
||||||
}
|
|
||||||
|
|
||||||
viewAllClicked() {
|
|
||||||
this.onClick.emit();
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,21 +0,0 @@
|
||||||
<div class="row">
|
|
||||||
<div class="col-2"></div>
|
|
||||||
<div class="col-8 ">
|
|
||||||
<div class="row conteiner">
|
|
||||||
<div class="col">
|
|
||||||
<button mat-button class="buttonNav navbar-button figure-card card" routerLink="/quick-wizard">
|
|
||||||
<h3 class="title">{{'QUICKWIZARD.CREATE-ADD.CREATE.TITLE' | translate}}</h3>
|
|
||||||
</button>
|
|
||||||
</div>
|
|
||||||
<div class="col-auto">
|
|
||||||
<div class="vl"></div>
|
|
||||||
</div>
|
|
||||||
<div class="col">
|
|
||||||
<button mat-button class="buttonNav navbar-button figure-card card" routerLink="/datasetcreatewizard">
|
|
||||||
<h3 class="title">{{'QUICKWIZARD.CREATE-ADD.ADD.TITLE' | translate}}</h3>
|
|
||||||
</button>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<div class="com-2"></div>
|
|
||||||
</div>
|
|
|
@ -1,33 +0,0 @@
|
||||||
.figure-card {
|
|
||||||
display: inline-block;
|
|
||||||
position: relative;
|
|
||||||
width: 100%;
|
|
||||||
margin: 25px 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
.card {
|
|
||||||
padding: 25px 20px 20px 20px;
|
|
||||||
display: flex;
|
|
||||||
flex-direction: column;
|
|
||||||
align-items: center;
|
|
||||||
}
|
|
||||||
|
|
||||||
.card {
|
|
||||||
box-shadow: 0 1px 4px 0 rgba(0, 0, 0, 0.14);
|
|
||||||
border-radius: 6px;
|
|
||||||
color: rgba(0, 0, 0, 0.87);
|
|
||||||
background: #fff;
|
|
||||||
}
|
|
||||||
|
|
||||||
.vl {
|
|
||||||
border-left: solid #999;
|
|
||||||
height: 100%;
|
|
||||||
}
|
|
||||||
|
|
||||||
a {
|
|
||||||
text-decoration: none;
|
|
||||||
}
|
|
||||||
.conteiner{
|
|
||||||
padding: 1em;
|
|
||||||
background-color: #eef1f5;
|
|
||||||
}
|
|
|
@ -1,38 +0,0 @@
|
||||||
import { Component, OnInit } from "@angular/core";
|
|
||||||
import { MatSnackBar } from "@angular/material/snack-bar";
|
|
||||||
import { ActivatedRoute, Router } from "@angular/router";
|
|
||||||
import { BaseComponent } from '@common/base/base.component';
|
|
||||||
import { TranslateService } from "@ngx-translate/core";
|
|
||||||
|
|
||||||
@Component({
|
|
||||||
selector: 'app-quick-wizard-create-add-component',
|
|
||||||
templateUrl: 'quick-wizard-create-add.component.html',
|
|
||||||
styleUrls: ['./quick-wizard-create-add.component.scss']
|
|
||||||
})
|
|
||||||
export class QuickWizardCreateAdd extends BaseComponent implements OnInit {
|
|
||||||
|
|
||||||
constructor(
|
|
||||||
private router: Router,
|
|
||||||
private languageService: TranslateService,
|
|
||||||
public snackBar: MatSnackBar,
|
|
||||||
public route: ActivatedRoute
|
|
||||||
) {
|
|
||||||
super();
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
ngOnInit(): void {
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
navigateToCreate() {
|
|
||||||
this.router.navigate(["/quick-wizard"]);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
navigateToAdd() {
|
|
||||||
this.router.navigate(["/datasetcreatewizard"]);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
}
|
|
|
@ -1,67 +0,0 @@
|
||||||
<div class="container row">
|
|
||||||
<div class="col-md-3">
|
|
||||||
<mat-card class="example-card">
|
|
||||||
<mat-card-header>
|
|
||||||
<mat-card-title>
|
|
||||||
{{'RECENT-ACTIVITY.MY-TITLE-DMP' | translate}}
|
|
||||||
</mat-card-title>
|
|
||||||
</mat-card-header>
|
|
||||||
<mat-card-content>
|
|
||||||
<mat-nav-list *ngIf="dmpActivities != null">
|
|
||||||
<mat-list-item (click)="redirect(activity.id, recentActivityTypeEnum.Dmp)" *ngFor="let activity of dmpActivities">
|
|
||||||
<p mat-line>
|
|
||||||
{{activity.label}}
|
|
||||||
</p>
|
|
||||||
<p mat-line>
|
|
||||||
{{activity.timestamp | date:'shortDate'}}
|
|
||||||
</p>
|
|
||||||
</mat-list-item>
|
|
||||||
</mat-nav-list>
|
|
||||||
</mat-card-content>
|
|
||||||
</mat-card>
|
|
||||||
</div>
|
|
||||||
<div class="col-md-3">
|
|
||||||
<mat-card class="example-card">
|
|
||||||
<mat-card-header>
|
|
||||||
<mat-card-title>
|
|
||||||
{{'RECENT-ACTIVITY.MY-TITLE-GRANT' | translate}}
|
|
||||||
</mat-card-title>
|
|
||||||
</mat-card-header>
|
|
||||||
<mat-card-content>
|
|
||||||
<mat-nav-list *ngIf="grantActivities!=null">
|
|
||||||
<mat-list-item (click)="redirect(activity.id, recentActivityTypeEnum.Grant)" *ngFor="let activity of grantActivities">
|
|
||||||
<p mat-line>
|
|
||||||
{{activity.label}}
|
|
||||||
</p>
|
|
||||||
<p mat-line>
|
|
||||||
{{activity.timestamp | date:'shortDate'}}
|
|
||||||
</p>
|
|
||||||
</mat-list-item>
|
|
||||||
</mat-nav-list>
|
|
||||||
</mat-card-content>
|
|
||||||
|
|
||||||
</mat-card>
|
|
||||||
</div>
|
|
||||||
<div class="col-md-3">
|
|
||||||
<mat-card class="example-card">
|
|
||||||
<mat-card-header>
|
|
||||||
<mat-card-title>
|
|
||||||
{{'RECENT-ACTIVITY.MY-TITLE-DATASET' | translate}}
|
|
||||||
</mat-card-title>
|
|
||||||
</mat-card-header>
|
|
||||||
<mat-card-content>
|
|
||||||
<mat-nav-list *ngIf="datasetActivities!=null">
|
|
||||||
<mat-list-item (click)="redirect(activity.id, recentActivityTypeEnum.Dataset)" *ngFor="let activity of datasetActivities">
|
|
||||||
<p mat-line>
|
|
||||||
{{activity.label}}
|
|
||||||
</p>
|
|
||||||
<p mat-line>
|
|
||||||
{{activity.timestamp | date:'shortDate'}}
|
|
||||||
</p>
|
|
||||||
</mat-list-item>
|
|
||||||
</mat-nav-list>
|
|
||||||
|
|
||||||
</mat-card-content>
|
|
||||||
</mat-card>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
|
@ -1,53 +0,0 @@
|
||||||
import { Component, OnInit } from '@angular/core';
|
|
||||||
import { Router } from '@angular/router';
|
|
||||||
import { RecentActivityType } from '@app/core/common/enum/recent-activity-type';
|
|
||||||
import { UserServiceOld } from '@app/core/services/user/user.service-old';
|
|
||||||
import { BaseComponent } from '@common/base/base.component';
|
|
||||||
import { takeUntil } from 'rxjs/operators';
|
|
||||||
|
|
||||||
@Component({
|
|
||||||
selector: 'app-recent-activity',
|
|
||||||
templateUrl: './recent-activity.component.html',
|
|
||||||
styleUrls: ['./recent-activity.component.scss']
|
|
||||||
})
|
|
||||||
export class RecentActivityComponent extends BaseComponent implements OnInit {
|
|
||||||
|
|
||||||
datasetActivities: any[];
|
|
||||||
grantActivities: any[];
|
|
||||||
dmpActivities: any[];
|
|
||||||
recentActivityTypeEnum = RecentActivityType;
|
|
||||||
|
|
||||||
constructor(
|
|
||||||
private router: Router,
|
|
||||||
private userService: UserServiceOld
|
|
||||||
) { super(); }
|
|
||||||
|
|
||||||
ngOnInit() {
|
|
||||||
this.userService.getRecentActivity()
|
|
||||||
.pipe(takeUntil(this._destroyed))
|
|
||||||
.subscribe(response => {
|
|
||||||
this.datasetActivities = response['recentDatasetActivities'];
|
|
||||||
this.dmpActivities = response['recentDmpActivities'];
|
|
||||||
this.grantActivities = response['recentGrantActivities'];
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
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/edit/' + id]);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
default: throw new Error('Unsupported Activity Type ');
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,7 +1,7 @@
|
||||||
<div class="col-md-12 d-flex justify-content-center" *ngIf="allRecentActivities == null">
|
<div class="col-md-12 d-flex justify-content-center" *ngIf="listingItems == null">
|
||||||
<span class="empty-list">{{'DMP-LISTING.EMPTY-LIST' | translate}}</span>
|
<span class="empty-list">{{'DMP-LISTING.EMPTY-LIST' | translate}}</span>
|
||||||
</div>
|
</div>
|
||||||
<div *ngIf="allRecentActivities != null" id="results" #results>
|
<div *ngIf="listingItems != null" id="results" #results>
|
||||||
<div class="d-flex flex-direction-row pt-4">
|
<div class="d-flex flex-direction-row pt-4">
|
||||||
<!-- Sort by -->
|
<!-- Sort by -->
|
||||||
<span class="d-flex align-items-center">{{'DMP-LISTING.SORT-BY' | translate}}:</span>
|
<span class="d-flex align-items-center">{{'DMP-LISTING.SORT-BY' | translate}}:</span>
|
||||||
|
@ -11,7 +11,6 @@
|
||||||
<mat-option *ngIf="publicMode" [value]="order.PUBLISHED">{{enumUtils.toRecentActivityOrderString(order.PUBLISHED)}}</mat-option>
|
<mat-option *ngIf="publicMode" [value]="order.PUBLISHED">{{enumUtils.toRecentActivityOrderString(order.PUBLISHED)}}</mat-option>
|
||||||
<mat-option [value]="order.LABEL">{{enumUtils.toRecentActivityOrderString(order.LABEL)}}</mat-option>
|
<mat-option [value]="order.LABEL">{{enumUtils.toRecentActivityOrderString(order.LABEL)}}</mat-option>
|
||||||
<mat-option *ngIf="!publicMode" [value]="order.STATUS">{{enumUtils.toRecentActivityOrderString(order.STATUS)}}</mat-option>
|
<mat-option *ngIf="!publicMode" [value]="order.STATUS">{{enumUtils.toRecentActivityOrderString(order.STATUS)}}</mat-option>
|
||||||
<!-- <mat-option [value]="order.CREATED">{{enumUtils.toRecentActivityOrderString(order.CREATED)}}</mat-option> -->
|
|
||||||
</mat-select>
|
</mat-select>
|
||||||
</mat-form-field>
|
</mat-form-field>
|
||||||
<!-- End of Sort by -->
|
<!-- End of Sort by -->
|
||||||
|
@ -26,143 +25,9 @@
|
||||||
<div *ngIf="allRecentActivities && allRecentActivities.length > 0 && page > 1" class="d-flex justify-content-center">
|
<div *ngIf="allRecentActivities && allRecentActivities.length > 0 && page > 1" class="d-flex justify-content-center">
|
||||||
<button type="button" class="btn-load-more" (click)="loadNextOrPrevious(false)">{{'GENERAL.ACTIONS.LOAD-LESS' | translate}}</button>
|
<button type="button" class="btn-load-more" (click)="loadNextOrPrevious(false)">{{'GENERAL.ACTIONS.LOAD-LESS' | translate}}</button>
|
||||||
</div>
|
</div>
|
||||||
<div *ngFor="let activity of allRecentActivities">
|
<div *ngFor="let item of listingItems; let i = index">
|
||||||
<div *ngIf="activity && activity.type === recentActivityTypeEnum.Dmp.valueOf()">
|
<app-dmp-listing-item-component *ngIf="item.dmp" [showDivider]="i != (listingItems.length - 1)" [dmp]="item.dmp" [isPublic]="isPublic"></app-dmp-listing-item-component>
|
||||||
<div class="dmp-card">
|
<app-description-listing-item-component *ngIf="item.description" [showDivider]="i != (listingItems.length - 1)" [description]="item.description" [isPublic]="isPublic" ></app-description-listing-item-component>
|
||||||
<!-- <a (click)="redirect(activity.id, activity.type)" class="pointer"> -->
|
|
||||||
<a [routerLink]="navigateToUrl(activity.id, activity.type)" class="pointer">
|
|
||||||
<div class="d-flex flex-direction-row">
|
|
||||||
<div class="col-auto dmp-label">{{ 'DMP-LISTING.DMP' | translate }}</div>
|
|
||||||
<div *ngIf="!publicMode" class="col-auto ml-auto edited-date">{{ 'DMP-LISTING.EDITED' | translate }}: {{ activity.modified | dateTimeCultureFormatter: "d MMMM y" }}</div>
|
|
||||||
<div *ngIf="publicMode" class="col-auto ml-auto edited-date">{{ 'DMP-LISTING.PUBLISHED' | translate }}: {{ activity.publishedAt | dateTimeCultureFormatter: "d MMMM y" }}</div>
|
|
||||||
</div>
|
|
||||||
<div class="col-auto" [ngClass]="{'dmp-title': activity.status === 1, 'dmp-title-draft': activity.status === 0}">{{activity.title}}</div>
|
|
||||||
<div class="dmp-subtitle">
|
|
||||||
<span class="col-auto">{{ roleDisplay(activity.users) }}</span>
|
|
||||||
<span>.</span>
|
|
||||||
<span class="col-auto" *ngIf="activity.status === 1 && activity.public === true"><span class="material-icons icon-align">public</span>{{'TYPES.DMP-VISIBILITY.PUBLIC' | translate}}</span>
|
|
||||||
<span *ngIf="activity.status === 1 && activity.public === false" class="col-auto"><span class="material-icons icon-align">done</span>{{ enumUtils.toDmpStatusString(activity.status) }}</span>
|
|
||||||
<span *ngIf="activity.status === 0" class=" col-auto draft"><span class="material-icons icon-align">create</span>{{ enumUtils.toDmpStatusString(activity.status) }}</span>
|
|
||||||
<span>.</span>
|
|
||||||
<span class="col-auto">{{'DMP-LISTING.VERSION' | translate}} {{activity.version}}</span>
|
|
||||||
<span>.</span>
|
|
||||||
<span class="col">{{ 'DMP-LISTING.GRANT' | translate }}: {{activity.grant}}</span>
|
|
||||||
</div>
|
|
||||||
<div class="col-auto dmp-dataset-descriptions-title">{{'DMP-LISTING.CONTAINED-DESCRIPTIONS' | translate}}: ({{ getDatasets(activity).length }})
|
|
||||||
</div>
|
|
||||||
<div *ngFor="let dataset of getDatasets(activity); let i = index; let last = last" [ngClass]="{'pb-3': i === activity.datasets.length - 1}">
|
|
||||||
<div *ngIf="i < 3">
|
|
||||||
<div class="col-auto dmp-dataset-descriptions-name" *ngIf="!last && i !== 2">{{dataset.label}},</div>
|
|
||||||
<div class="col-auto dmp-dataset-descriptions-name" *ngIf="last || i == 2">{{dataset.label}}</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<!-- <a class="d-flex justify-content-center pb-3 show-more" *ngIf="getDatasets(activity).length > 3" (click)="redirect(activity.id, activity.type)"><u>{{'GENERAL.ACTIONS.SHOW-MORE' | translate}}</u></a> -->
|
|
||||||
<a class="d-flex justify-content-center pb-3 show-more" *ngIf="getDatasets(activity).length > 3" [routerLink]="navigateToUrl(activity.id, activity.type)"><u>{{'GENERAL.ACTIONS.SHOW-MORE' | translate}}</u></a>
|
|
||||||
</a>
|
|
||||||
<div class="dmp-card-actions">
|
|
||||||
<a class="col-auto border-right pointer" [matMenuTriggerFor]="exportMenu"><span class="material-icons icon-align pr-2">open_in_new</span>{{'DMP-LISTING.ACTIONS.EXPORT' | translate}}</a>
|
|
||||||
<a class="col-auto border-right pointer" *ngIf="isDraftDmp(activity)" [routerLink]="['/plans/edit/' + activity.id]" target="_blank"><span class="material-icons icon-align">add</span>{{'DMP-LISTING.ACTIONS.ADD-DESCRIPTION-SHORT' | translate}}</a>
|
|
||||||
<a class="col-auto border-right pointer" *ngIf="isUserOwner(activity)" (click)="openShareDialog(activity.id, activity.title)"><span class="material-icons icon-align pr-2">group_add</span>{{'DMP-LISTING.ACTIONS.INVITE-SHORT' | translate}}</a>
|
|
||||||
<a class="col-auto border-right pointer" *ngIf="isAuthenticated()" (click)="cloneOrNewVersionClicked(activity, false)"><span class="material-icons icon-align pr-2">filter_none</span>{{'DMP-LISTING.ACTIONS.CLONE' | translate}}</a>
|
|
||||||
<a class="col-auto border-right pointer" *ngIf="!isAuthenticated()" (click)="viewVersions(getGroupId(activity), activity.title, activity)"><span class="material-icons icon-align pr-2">library_books</span>{{'DMP-LISTING.ACTIONS.VIEW-VERSION' | translate}}</a>
|
|
||||||
|
|
||||||
<a class="col-auto border-right pointer" *ngIf="!isDraftDmp(activity) && isUserOwner(activity)" (click)="deleteDmpClicked(activity)"><span class="material-icons icon-align pr-2">delete</span>{{ 'DMP-LISTING.ACTIONS.DELETE' | translate }}</a>
|
|
||||||
<a class="col-auto pointer" *ngIf="isAuthenticated()" [matMenuTriggerFor]="actionsMenu"><span class="material-icons icon-align pl-2">more_horiz</span></a>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<mat-menu #exportMenu="matMenu" xPosition="before">
|
|
||||||
<button mat-menu-item (click)="downloadPdf(activity.id)">
|
|
||||||
<i class="fa fa-file-pdf-o pr-2"></i>
|
|
||||||
<span>{{'GENERAL.FILE-TYPES.PDF' | translate}}</span>
|
|
||||||
</button>
|
|
||||||
<button mat-menu-item (click)="downloadDocx(activity.id)">
|
|
||||||
<i class="fa fa-file-word-o pr-2"></i>
|
|
||||||
<span>{{'GENERAL.FILE-TYPES.DOC' | translate}}</span>
|
|
||||||
</button>
|
|
||||||
<button mat-menu-item (click)="downloadXml(activity.id)">
|
|
||||||
<i class="fa fa-file-code-o pr-2"></i>
|
|
||||||
<span>{{'GENERAL.FILE-TYPES.XML' | translate}}</span>
|
|
||||||
</button>
|
|
||||||
<button mat-menu-item (click)="downloadJson(activity.id)">
|
|
||||||
<i class="fa fa-file-o pr-2"></i>
|
|
||||||
<span>{{'GENERAL.FILE-TYPES.JSON' | translate}}</span>
|
|
||||||
</button>
|
|
||||||
</mat-menu>
|
|
||||||
<mat-menu #actionsMenu="matMenu" xPosition="before">
|
|
||||||
<button *ngIf="isUserOwner(activity)" mat-menu-item (click)="cloneOrNewVersionClicked(activity, true)">
|
|
||||||
<mat-icon>queue</mat-icon>{{'DMP-LISTING.ACTIONS.NEW-VERSION' | translate}}
|
|
||||||
</button>
|
|
||||||
<button mat-menu-item (click)="viewVersions(getGroupId(activity), activity.title, activity)">
|
|
||||||
<mat-icon>library_books</mat-icon>{{'DMP-LISTING.ACTIONS.VIEW-VERSION' | translate}}
|
|
||||||
</button>
|
|
||||||
<button mat-menu-item *ngIf="isDraftDmp(activity) && isUserOwner(activity)" (click)="deleteDmpClicked(activity)" class="menu-item">
|
|
||||||
<mat-icon>delete</mat-icon>{{ 'DMP-LISTING.ACTIONS.DELETE' | translate }}
|
|
||||||
</button>
|
|
||||||
</mat-menu>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<div *ngIf="activity && activity.type === recentActivityTypeEnum.Dataset.valueOf()">
|
|
||||||
<div class="dataset-card">
|
|
||||||
<!-- <a (click)="redirect(activity.id, activity.type)" class="pointer"> -->
|
|
||||||
<a [routerLink]="navigateToUrl(activity.id, activity.type)" class="pointer">
|
|
||||||
<div class="d-flex flex-direction-row">
|
|
||||||
<div class="col-auto dataset-label">{{'DATASET-LISTING.DESCRIPTION' | translate}}</div>
|
|
||||||
<div *ngIf="!publicMode" class="col-auto ml-auto edited-date">{{'DATASET-LISTING.STATES.EDITED' | translate}}: {{activity.modified | dateTimeCultureFormatter: "d MMMM y"}}</div>
|
|
||||||
<div *ngIf="publicMode" class="col-auto ml-auto edited-date">{{'DATASET-LISTING.STATES.PUBLISHED' | translate}}: {{activity.publishedAt | dateTimeCultureFormatter: "d MMMM y"}}</div>
|
|
||||||
</div>
|
|
||||||
<div *ngIf="activity.status === 1" class="col-auto dataset-title">{{activity.title}}</div>
|
|
||||||
<div *ngIf="activity.status === 0" class="col-auto dataset-title-draft">{{activity.title}}</div>
|
|
||||||
<div class="dataset-subtitle">
|
|
||||||
<span class="col-auto">{{ roleDisplay(activity.users) }}</span>
|
|
||||||
<span>.</span>
|
|
||||||
<span class="col-auto" *ngIf="activity.status === 1 && activity.public === true"><span class="material-icons icon-align">public</span>{{'DATASET-LISTING.STATES.PUBLIC' | translate}}</span>
|
|
||||||
<span *ngIf="activity.status === 1 && activity.public === false" class="col-auto"><span class="material-icons icon-align">done</span>{{ enumUtils.toDmpStatusString(activity.status) }}</span>
|
|
||||||
<span *ngIf="activity.status === 0" class=" col-auto draft"><span class="material-icons icon-align">create</span>{{ enumUtils.toDmpStatusString(activity.status) }}</span>
|
|
||||||
<span>.</span>
|
|
||||||
<span class="col">{{'DATASET-LISTING.COLUMNS.GRANT' | translate}}: {{activity.grant}}</span>
|
|
||||||
</div>
|
|
||||||
<div class="d-flex flex-direction-row pt-3 pb-3">
|
|
||||||
<div class="col-auto dataset-subtitle pr-0">{{'DATASET-LISTING.TOOLTIP.PART-OF' | translate}}
|
|
||||||
<div class="col-auto dmp-label ml-3">{{'DATASET-LISTING.TOOLTIP.DMP' | translate}}</div>
|
|
||||||
</div>
|
|
||||||
<!-- <div class="col-auto dmp-label">{{'DATASET-LISTING.TOOLTIP.DMP' | translate}}</div> -->
|
|
||||||
<div class="col dmp-title">{{ getDmp(activity) }}</div>
|
|
||||||
</div>
|
|
||||||
</a>
|
|
||||||
<div class="dataset-card-actions">
|
|
||||||
<a class="col-auto border-right pointer" [matMenuTriggerFor]="exportMenu"><span class="material-icons icon-align pr-2">open_in_new</span>{{'DATASET-LISTING.ACTIONS.EXPORT' | translate}}</a>
|
|
||||||
<a class="col-auto border-right pointer" *ngIf="isAuthenticated()" (click)="openShareDialog(getDmpId(activity), getDmp(activity))"><span class="material-icons icon-align pr-2">group_add</span>{{'DATASET-LISTING.ACTIONS.INVITE-SHORT' | translate}}</a>
|
|
||||||
<a class="col-auto border-right pointer" *ngIf="isAuthenticated()" (click)="openDmpSearchDialogue(activity)"><span class="material-icons icon-align pr-2">file_copy</span>{{'DATASET-WIZARD.ACTIONS.COPY-DESCRIPTION' | translate}}</a>
|
|
||||||
<a class="col-auto border-right pointer" *ngIf="isAuthenticated()" (click)="deleteDatasetClicked(activity.id)"><span class="material-icons icon-align pr-2">delete</span>{{ 'DATASET-WIZARD.ACTIONS.DELETE' | translate }}</a>
|
|
||||||
|
|
||||||
<!-- <a class="col-auto pointer" [matMenuTriggerFor]="actionsMenu"><span class="material-icons icon-align pl-2">more_horiz</span></a> -->
|
|
||||||
<!-- <a class="col-auto" [matMenuTriggerFor]="actionsMenu" *ngIf="!publicMode"><span class="material-icons icon-align pl-2">more_horiz</span></a> -->
|
|
||||||
</div>
|
|
||||||
<mat-menu #actionsMenu="matMenu">
|
|
||||||
<button mat-menu-item (click)="openDmpSearchDialogue(activity)" class="menu-item">
|
|
||||||
<mat-icon>file_copy</mat-icon>{{'DATASET-WIZARD.ACTIONS.COPY-DESCRIPTION' | translate}}
|
|
||||||
</button>
|
|
||||||
<button mat-menu-item (click)="deleteDatasetClicked(activity.id)" class="menu-item">
|
|
||||||
<mat-icon>delete</mat-icon>{{ 'DATASET-WIZARD.ACTIONS.DELETE' | translate }}
|
|
||||||
</button>
|
|
||||||
</mat-menu>
|
|
||||||
|
|
||||||
<mat-menu #exportMenu="matMenu" xPosition="before">
|
|
||||||
<button mat-menu-item (click)="downloadPDF(activity)">
|
|
||||||
<i class="fa fa-file-pdf-o pr-2"></i>
|
|
||||||
<span>{{'GENERAL.FILE-TYPES.PDF' | translate}}</span>
|
|
||||||
</button>
|
|
||||||
<button mat-menu-item (click)="downloadDOCX(activity)">
|
|
||||||
<i class="fa fa-file-word-o pr-2"></i>
|
|
||||||
<span>{{'GENERAL.FILE-TYPES.DOC' | translate}}</span>
|
|
||||||
</button>
|
|
||||||
<button mat-menu-item (click)="downloadXML(activity)">
|
|
||||||
<i class="fa fa-file-code-o pr-2"></i>
|
|
||||||
<span>{{'GENERAL.FILE-TYPES.XML' | translate}}</span>
|
|
||||||
</button>
|
|
||||||
</mat-menu>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
</div>
|
||||||
<div class="text-muted d-flex justify-content-center mt-5" *ngIf="!hasMoreActivity && allRecentActivities && allRecentActivities.length > 0">
|
<div class="text-muted d-flex justify-content-center mt-5" *ngIf="!hasMoreActivity && allRecentActivities && allRecentActivities.length > 0">
|
||||||
{{'GENERAL.ACTIONS.NO-MORE-AVAILABLE' | translate}}
|
{{'GENERAL.ACTIONS.NO-MORE-AVAILABLE' | translate}}
|
||||||
|
@ -171,108 +36,3 @@
|
||||||
<button type="button" class="btn-load-more" (click)="loadNextOrPrevious()">{{'GENERAL.ACTIONS.LOAD-MORE' | translate}}</button>
|
<button type="button" class="btn-load-more" (click)="loadNextOrPrevious()">{{'GENERAL.ACTIONS.LOAD-MORE' | translate}}</button>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
|
||||||
<!-- Old version of dashboard -->
|
|
||||||
<!-- <div class="card">
|
|
||||||
<div class="card-header card-header-plain">
|
|
||||||
<div class="card-desc">
|
|
||||||
<h4 class="card-title">
|
|
||||||
{{ 'RECENT-ACTIVITY.LAST-EDITED-DMP' | translate}}
|
|
||||||
</h4>
|
|
||||||
</div>
|
|
||||||
<a class="view-all" [class.clickable]="isAuthenticated()" [routerLink]="['/plans/']">
|
|
||||||
{{ 'GENERAL.ACTIONS.VIEW-ALL' | translate}}</a>
|
|
||||||
</div>
|
|
||||||
<div class="card-body table-responsive">
|
|
||||||
<table class="table table-hover">
|
|
||||||
<thead class="text-default">
|
|
||||||
<th>{{ 'DATASET-PROFILE-LISTING.COLUMNS.NAME' | translate}}</th>
|
|
||||||
<th>{{ 'DATASET-PROFILE-LISTING.COLUMNS.TEMPLATE' | translate }}</th>
|
|
||||||
<th>{{ 'DATASET-PROFILE-LISTING.COLUMNS.GRANT' | translate }}</th>
|
|
||||||
<th>{{ 'DATASET-PROFILE-LISTING.COLUMNS.ROLE' | translate }}</th>
|
|
||||||
<th>{{ 'DATASET-PROFILE-LISTING.COLUMNS.ORGANIZATION' | translate }}</th>
|
|
||||||
<th>{{ 'DATASET-PROFILE-LISTING.COLUMNS.STATUS' | translate }}</th>
|
|
||||||
<th>{{ 'DATASET-PROFILE-LISTING.COLUMNS.EDITED' | translate }}</th>
|
|
||||||
<th></th>
|
|
||||||
</thead>
|
|
||||||
<tbody *ngIf="dmpActivities != null">
|
|
||||||
<a *ngFor="let activity of dmpActivities" class="table-row" [routerLink]="['../plans/overview/' + activity.id]">
|
|
||||||
<td>{{ activity.label }}</td>
|
|
||||||
<td>
|
|
||||||
<div *ngIf="activity.profile" matTooltip="{{ activity.profile }}" class="template-name">
|
|
||||||
{{ activity.profile }}
|
|
||||||
</div>
|
|
||||||
<div *ngIf="!(activity.profile)" class="template-name">--</div>
|
|
||||||
</td>
|
|
||||||
<td>{{ activity.grant }}</td>
|
|
||||||
<td>{{ roleDisplay(activity.users)}}</td>
|
|
||||||
<td>{{ activity.organisations }}</td>
|
|
||||||
<td *ngIf="activity.status === 1 && activity.public === true">
|
|
||||||
<div class="is-public">
|
|
||||||
{{'TYPES.DMP-VISIBILITY.PUBLIC' | translate}}
|
|
||||||
</div>
|
|
||||||
</td>
|
|
||||||
<td *ngIf="activity.status === 1 && activity.public === false" class="text-center">
|
|
||||||
{{ enumUtils.toDmpStatusString(activity.status) }}
|
|
||||||
</td>
|
|
||||||
<td *ngIf="activity.status === 0" class="text-center">
|
|
||||||
{{ enumUtils.toDmpStatusString(activity.status) }}
|
|
||||||
</td>
|
|
||||||
<td>
|
|
||||||
{{ activity.modifiedTime | date: "shortDate" }}
|
|
||||||
</td>
|
|
||||||
<td>
|
|
||||||
<button mat-icon-button [matMenuTriggerFor]="actionsMenu" class="ml-auto more-icon" (click)="$event.preventDefault(); $event.stopPropagation();">
|
|
||||||
<mat-icon class="more-horiz">more_horiz</mat-icon>
|
|
||||||
</button>
|
|
||||||
<mat-menu #actionsMenu="matMenu">
|
|
||||||
<button mat-menu-item (click)="editClicked(activity)" class="menu-item">
|
|
||||||
<mat-icon>edit</mat-icon>{{ 'DMP-LISTING.ACTIONS.EDIT' | translate }}
|
|
||||||
</button>
|
|
||||||
<button mat-menu-item (click)="cloneClicked(activity)" class="menu-item">
|
|
||||||
<mat-icon>add</mat-icon>{{ 'DMP-LISTING.ACTIONS.CLONE' | translate }}
|
|
||||||
</button>
|
|
||||||
<button mat-menu-item (click)="deleteClicked(activity)" class="menu-item">
|
|
||||||
<mat-icon>delete</mat-icon>{{ 'DMP-LISTING.ACTIONS.DELETE' | translate }}
|
|
||||||
</button>
|
|
||||||
<button mat-menu-item [matMenuTriggerFor]="exportMethod" class="menu-item">
|
|
||||||
<mat-icon>save_alt</mat-icon>{{ 'DMP-LISTING.ACTIONS.EXP-AS' | translate }}
|
|
||||||
</button>
|
|
||||||
</mat-menu>
|
|
||||||
<mat-menu #exportMethod>
|
|
||||||
<button mat-menu-item (click)="downloadPDF(activity.id)">
|
|
||||||
<i class="fa fa-file-pdf-o pr-2"></i>
|
|
||||||
<span>{{'GENERAL.FILE-TYPES.PDF' | translate}}</span>
|
|
||||||
</button>
|
|
||||||
<button mat-menu-item (click)="downloadDocx(activity.id)">
|
|
||||||
<i class="fa fa-file-word-o pr-2"></i>
|
|
||||||
<span>{{'GENERAL.FILE-TYPES.DOC' | translate}}</span>
|
|
||||||
</button>
|
|
||||||
<button mat-menu-item (click)="downloadXml(activity.id)">
|
|
||||||
<i class="fa fa-file-code-o pr-2"></i>
|
|
||||||
<span>{{'GENERAL.FILE-TYPES.XML' | translate}}</span>
|
|
||||||
</button>
|
|
||||||
<button mat-menu-item (click)="downloadJson(activity.id)">
|
|
||||||
<i class="fa fa-file-o pr-2"></i>
|
|
||||||
<span>{{'GENERAL.FILE-TYPES.JSON' | translate}}</span>
|
|
||||||
</button>
|
|
||||||
</mat-menu>
|
|
||||||
</td>
|
|
||||||
</a>
|
|
||||||
</tbody>
|
|
||||||
<tbody *ngIf="dmpActivities == null">
|
|
||||||
<tr>
|
|
||||||
<td></td>
|
|
||||||
<td></td>
|
|
||||||
<td></td>
|
|
||||||
<td></td>
|
|
||||||
<td></td>
|
|
||||||
<td></td>
|
|
||||||
<td></td>
|
|
||||||
<td></td>
|
|
||||||
</tr>
|
|
||||||
</tbody>
|
|
||||||
</table>
|
|
||||||
</div>
|
|
||||||
</div> -->
|
|
||||||
|
|
File diff suppressed because it is too large
Load Diff
|
@ -1,93 +0,0 @@
|
||||||
<div *ngIf="datasetActivities != null" id="datasets" #datasets>
|
|
||||||
<div class="d-flex flex-direction-row pt-4">
|
|
||||||
<!-- Sort by -->
|
|
||||||
<span class="d-flex align-items-center">{{'DMP-LISTING.SORT-BY' | translate}}:</span>
|
|
||||||
<mat-form-field appearance="outline" class="sort-form col-auto">
|
|
||||||
<mat-select placeholder="{{'CRITERIA.LIKE'| translate}}" [formControl]="formGroup.get('order')">
|
|
||||||
<mat-option *ngIf="!publicMode" [value]="order.MODIFIED">{{enumUtils.toRecentActivityOrderString(order.MODIFIED)}}</mat-option>
|
|
||||||
<mat-option *ngIf="publicMode" [value]="order.DATASETPUBLISHED">{{enumUtils.toRecentActivityOrderString(order.DATASETPUBLISHED)}}</mat-option>
|
|
||||||
<mat-option [value]="order.LABEL">{{enumUtils.toRecentActivityOrderString(order.LABEL)}}</mat-option>
|
|
||||||
<mat-option *ngIf="!publicMode" [value]="order.STATUS">{{enumUtils.toRecentActivityOrderString(order.STATUS)}}</mat-option>
|
|
||||||
<!-- <mat-option [value]="order.CREATED">{{enumUtils.toRecentActivityOrderString(order.CREATED)}}</mat-option> -->
|
|
||||||
</mat-select>
|
|
||||||
</mat-form-field>
|
|
||||||
<!-- End of Sort by -->
|
|
||||||
<!-- Search Filter-->
|
|
||||||
<mat-form-field appearance="outline" class="search-form ml-auto col-auto pr-0" floatLabel="never">
|
|
||||||
<mat-icon matSuffix>search</mat-icon>
|
|
||||||
<input matInput placeholder="{{'CRITERIA.DATA-SETS.LIKE'| translate}}" name="likeCriteria" [formControl]="formGroup.get('like')">
|
|
||||||
<mat-error *ngIf="formGroup.get('like').hasError('backendError')">{{formGroup.get('like').getError('backendError').message}}</mat-error>
|
|
||||||
</mat-form-field>
|
|
||||||
<!-- End of Search Filter -->
|
|
||||||
</div>
|
|
||||||
<div *ngIf="datasetActivities && datasetActivities.length > 0 && page > 1" class="d-flex justify-content-center">
|
|
||||||
<button type="button" class="btn-load-more" (click)="loadNextOrPrevious(false)">{{'GENERAL.ACTIONS.LOAD-LESS' | translate}}</button>
|
|
||||||
</div>
|
|
||||||
<div *ngFor="let activity of datasetActivities">
|
|
||||||
<div class="dataset-card">
|
|
||||||
<a [routerLink]="goToOverview(activity.id)" class="pointer">
|
|
||||||
<div class="d-flex flex-direction-row">
|
|
||||||
<div class="col-auto dataset-label">{{'DATASET-LISTING.DESCRIPTION' | translate}}</div>
|
|
||||||
<div *ngIf="!publicMode" class="col-auto ml-auto edited-date">{{'DATASET-LISTING.STATES.EDITED' | translate}}: {{activity.modified | dateTimeCultureFormatter: "d MMMM y"}}</div>
|
|
||||||
<div *ngIf="publicMode" class="col-auto ml-auto edited-date">{{'DATASET-LISTING.STATES.PUBLISHED' | translate}}: {{activity.dmpPublishedAt | dateTimeCultureFormatter: "d MMMM y"}}</div>
|
|
||||||
</div>
|
|
||||||
<div *ngIf="activity.status === 1" class="col-auto dataset-title">{{activity.label}}</div>
|
|
||||||
<div *ngIf="activity.status === 0" class="col-auto dataset-title-draft">{{activity.label}}</div>
|
|
||||||
<div class="dataset-subtitle">
|
|
||||||
<span class="col-auto">{{ roleDisplay(activity.users) }}</span>
|
|
||||||
<span>.</span>
|
|
||||||
<span class="col-auto" *ngIf="activity.status === 1 && activity.public === true"><span class="material-icons icon-align">public</span>{{'DATASET-LISTING.STATES.PUBLIC' | translate}}</span>
|
|
||||||
<span *ngIf="activity.status === 1 && activity.public === false" class="col-auto"><span class="material-icons icon-align">done</span>{{ enumUtils.toDmpStatusString(activity.status) }}</span>
|
|
||||||
<span *ngIf="activity.status === 0" class=" col-auto draft"><span class="material-icons icon-align">create</span>{{ enumUtils.toDmpStatusString(activity.status) }}</span>
|
|
||||||
<span>.</span>
|
|
||||||
<span class="col">{{'DATASET-LISTING.COLUMNS.GRANT' | translate}}: {{activity.grant}}</span>
|
|
||||||
</div>
|
|
||||||
<div class="d-flex flex-direction-row pt-3 pb-3">
|
|
||||||
<div class="col-auto dataset-subtitle pr-0">{{'DATASET-LISTING.TOOLTIP.PART-OF' | translate}}
|
|
||||||
<div class="col-auto dmp-label ml-3">{{'DATASET-LISTING.TOOLTIP.DMP' | translate}}</div>
|
|
||||||
</div>
|
|
||||||
<!-- <div class="col-auto dmp-label">{{'DATASET-LISTING.TOOLTIP.DMP' | translate}}</div> -->
|
|
||||||
<div class="col dmp-title">{{activity.dmp}}</div>
|
|
||||||
</div>
|
|
||||||
</a>
|
|
||||||
<div class="dataset-card-actions">
|
|
||||||
<a class="col-auto border-right pointer" [matMenuTriggerFor]="exportMenu"><span class="material-icons icon-align pr-2">open_in_new</span>{{'DATASET-LISTING.ACTIONS.EXPORT' | translate}}</a>
|
|
||||||
<a class="col-auto border-right pointer" *ngIf="isUserOwner(activity)" (click)="openShareDialog(activity.dmpId, activity.dmp)"><span class="material-icons icon-align pr-2">group_add</span>{{'DATASET-LISTING.ACTIONS.INVITE-SHORT' | translate}}</a>
|
|
||||||
<a class="col-auto border-right pointer" *ngIf="isAuthenticated()" (click)="openDmpSearchDialogue(activity)"><span class="material-icons icon-align pr-2">file_copy</span>{{'DATASET-WIZARD.ACTIONS.COPY-DESCRIPTION' | translate}}</a>
|
|
||||||
<a class="col-auto border-right pointer" *ngIf="isAuthenticated()" (click)="deleteClicked(activity.id)"><span class="material-icons icon-align pr-2">delete</span>{{ 'DATASET-WIZARD.ACTIONS.DELETE' | translate }}</a>
|
|
||||||
|
|
||||||
<!-- <a *ngIf="this.isAuthenticated()" class="col-auto pointer" [matMenuTriggerFor]="actionsMenu"><span class="material-icons icon-align pl-2">more_horiz</span></a> -->
|
|
||||||
<!-- <a class="col-auto" [matMenuTriggerFor]="actionsMenu" *ngIf="!publicMode"><span class="material-icons icon-align pl-2">more_horiz</span></a> -->
|
|
||||||
</div>
|
|
||||||
<mat-menu #actionsMenu="matMenu">
|
|
||||||
<button mat-menu-item *ngIf="isAuthenticated()" (click)="openDmpSearchDialogue(activity)" class="menu-item">
|
|
||||||
<mat-icon>file_copy</mat-icon>{{'DATASET-WIZARD.ACTIONS.COPY-DESCRIPTION' | translate}}
|
|
||||||
</button>
|
|
||||||
<button mat-menu-item (click)="deleteClicked(activity.id)" class="menu-item">
|
|
||||||
<mat-icon>delete</mat-icon>{{ 'DATASET-WIZARD.ACTIONS.DELETE' | translate }}
|
|
||||||
</button>
|
|
||||||
</mat-menu>
|
|
||||||
|
|
||||||
<mat-menu #exportMenu="matMenu" xPosition="before">
|
|
||||||
<button mat-menu-item (click)="downloadPDF(activity)">
|
|
||||||
<i class="fa fa-file-pdf-o pr-2"></i>
|
|
||||||
<span>{{'GENERAL.FILE-TYPES.PDF' | translate}}</span>
|
|
||||||
</button>
|
|
||||||
<button mat-menu-item (click)="downloadDOCX(activity)">
|
|
||||||
<i class="fa fa-file-word-o pr-2"></i>
|
|
||||||
<span>{{'GENERAL.FILE-TYPES.DOC' | translate}}</span>
|
|
||||||
</button>
|
|
||||||
<button mat-menu-item (click)="downloadXML(activity)">
|
|
||||||
<i class="fa fa-file-code-o pr-2"></i>
|
|
||||||
<span>{{'GENERAL.FILE-TYPES.XML' | translate}}</span>
|
|
||||||
</button>
|
|
||||||
</mat-menu>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<div class="text-muted d-flex justify-content-center mt-5" *ngIf="!hasMoreResults && datasetActivities && datasetActivities.length > 0">
|
|
||||||
{{'GENERAL.ACTIONS.NO-MORE-AVAILABLE' | translate}}
|
|
||||||
</div>
|
|
||||||
<div *ngIf="datasetActivities && datasetActivities.length > 0 && datasetActivities.length >= pageSize && hasMoreResults" class="d-flex justify-content-center">
|
|
||||||
<button type="button" class="btn-load-more" (click)="loadNextOrPrevious()">{{'GENERAL.ACTIONS.LOAD-MORE' | translate}}</button>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
|
@ -1,518 +0,0 @@
|
||||||
import { Location } from '@angular/common';
|
|
||||||
import { HttpClient } from '@angular/common/http';
|
|
||||||
import { Component, EventEmitter, Input, OnInit, Output, ViewChild } from '@angular/core';
|
|
||||||
import { UntypedFormBuilder, UntypedFormControl } from '@angular/forms';
|
|
||||||
import { MatDialog } from '@angular/material/dialog';
|
|
||||||
import { ActivatedRoute, Router } from '@angular/router';
|
|
||||||
import { DatasetStatus } from '@app/core/common/enum/dataset-status';
|
|
||||||
import { RecentActivityOrder } from '@app/core/common/enum/recent-activity-order';
|
|
||||||
import { Role } from '@app/core/common/enum/role';
|
|
||||||
import { DataTableRequest } from '@app/core/model/data-table/data-table-request';
|
|
||||||
import { DatasetListingModel } from '@app/core/model/dataset/dataset-listing';
|
|
||||||
import { DatasetCriteria } from '@app/core/query/dataset/dataset-criteria';
|
|
||||||
import { AuthService } from '@app/core/services/auth/auth.service';
|
|
||||||
import { ConfigurationService } from "@app/core/services/configuration/configuration.service";
|
|
||||||
import { DatasetWizardService } from '@app/core/services/dataset-wizard/dataset-wizard.service';
|
|
||||||
import { DatasetService } from '@app/core/services/dataset/dataset.service';
|
|
||||||
import { LockService } from '@app/core/services/lock/lock.service';
|
|
||||||
import { MatomoService } from '@app/core/services/matomo/matomo-service';
|
|
||||||
import { SnackBarNotificationLevel, UiNotificationService } from '@app/core/services/notification/ui-notification-service';
|
|
||||||
import { EnumUtils } from '@app/core/services/utilities/enum-utils.service';
|
|
||||||
import { FileUtils } from '@app/core/services/utilities/file-utils.service';
|
|
||||||
import { DatasetCopyDialogueComponent } from '@app/ui/dataset/dataset-wizard/dataset-copy-dialogue/dataset-copy-dialogue.component';
|
|
||||||
import { DmpInvitationDialogComponent } from '@app/ui/dmp/invitation/dmp-invitation-dialog.component';
|
|
||||||
import { BaseComponent } from '@common/base/base.component';
|
|
||||||
import { ValidationErrorModel } from '@common/forms/validation/error-model/validation-error-model';
|
|
||||||
import { ConfirmationDialogComponent } from '@common/modules/confirmation-dialog/confirmation-dialog.component';
|
|
||||||
import { TranslateService } from '@ngx-translate/core';
|
|
||||||
import * as FileSaver from 'file-saver';
|
|
||||||
import { debounceTime, takeUntil } from 'rxjs/operators';
|
|
||||||
|
|
||||||
@Component({
|
|
||||||
selector: 'app-recent-edited-dataset-activity',
|
|
||||||
templateUrl: './recent-edited-dataset-activity.component.html',
|
|
||||||
styleUrls: ['./recent-edited-dataset-activity.component.scss']
|
|
||||||
})
|
|
||||||
export class RecentEditedDatasetActivityComponent extends BaseComponent implements OnInit {
|
|
||||||
|
|
||||||
@Output() totalCountDatasets: EventEmitter<any> = new EventEmitter();
|
|
||||||
|
|
||||||
@ViewChild("datasets") resultsContainer;
|
|
||||||
|
|
||||||
datasetActivities: DatasetListingModel[];
|
|
||||||
totalCount: number;
|
|
||||||
startIndex: number = 0;
|
|
||||||
offsetLess: number = 0;
|
|
||||||
hasMoreResults: boolean = true;
|
|
||||||
pageSize: number = 5;
|
|
||||||
public formGroup = new UntypedFormBuilder().group({
|
|
||||||
like: new UntypedFormControl(),
|
|
||||||
order: new UntypedFormControl()
|
|
||||||
});
|
|
||||||
publicMode = false;
|
|
||||||
|
|
||||||
order = RecentActivityOrder;
|
|
||||||
|
|
||||||
page: number = 1;
|
|
||||||
@Input() isActive: boolean = false;
|
|
||||||
|
|
||||||
constructor(
|
|
||||||
private route: ActivatedRoute,
|
|
||||||
private authentication: AuthService,
|
|
||||||
private datasetService: DatasetService,
|
|
||||||
private language: TranslateService,
|
|
||||||
public enumUtils: EnumUtils,
|
|
||||||
public dialog: MatDialog,
|
|
||||||
public router: Router,
|
|
||||||
private datasetWizardService: DatasetWizardService,
|
|
||||||
private uiNotificationService: UiNotificationService,
|
|
||||||
private location: Location,
|
|
||||||
private lockService: LockService,
|
|
||||||
private httpClient: HttpClient,
|
|
||||||
private matomoService: MatomoService,
|
|
||||||
private configurationService: ConfigurationService,
|
|
||||||
private fileUtils: FileUtils
|
|
||||||
) {
|
|
||||||
super();
|
|
||||||
}
|
|
||||||
|
|
||||||
ngOnInit() {
|
|
||||||
this.matomoService.trackPageView('Recent Dataset Activity');
|
|
||||||
this.route.queryParams.subscribe(params => {
|
|
||||||
if (this.isActive) {
|
|
||||||
let page = (params['page'] === undefined) ? 1 : +params['page'];
|
|
||||||
this.page = (page <= 0) ? 1 : page;
|
|
||||||
|
|
||||||
this.startIndex = (this.page - 1) * this.pageSize;
|
|
||||||
if (this.page > 1) {
|
|
||||||
this.offsetLess = (this.page - 2) * this.pageSize;
|
|
||||||
}
|
|
||||||
|
|
||||||
let order = params['order'];
|
|
||||||
if (this.isAuthenticated()) {
|
|
||||||
if (order === undefined || (order != this.order.MODIFIED && order != this.order.LABEL && order != this.order.STATUS)) {
|
|
||||||
order = this.order.MODIFIED;
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
if (order === undefined || (order != this.order.DATASETPUBLISHED && order != this.order.LABEL)) {
|
|
||||||
order = this.order.DATASETPUBLISHED;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
this.formGroup.get('order').setValue(order);
|
|
||||||
|
|
||||||
let keyword = (params['keyword'] === undefined || params['keyword'].length <= 0) ? "" : params['keyword'];
|
|
||||||
this.formGroup.get("like").setValue(keyword);
|
|
||||||
|
|
||||||
this.updateUrl();
|
|
||||||
}
|
|
||||||
});
|
|
||||||
if (this.isAuthenticated()) {
|
|
||||||
// const fields: Array<string> = ["-modified"];
|
|
||||||
if (!this.formGroup.get('order').value) {
|
|
||||||
this.formGroup.get('order').setValue(this.order.MODIFIED);
|
|
||||||
}
|
|
||||||
const fields: Array<string> = [((this.formGroup.get('order').value === 'status') || (this.formGroup.get('order').value === 'label') ? '+' : "-") + this.formGroup.get('order').value];
|
|
||||||
const datasetDataTableRequest: DataTableRequest<DatasetCriteria> = new DataTableRequest(this.startIndex, this.pageSize, { fields: fields });
|
|
||||||
datasetDataTableRequest.criteria = new DatasetCriteria();
|
|
||||||
datasetDataTableRequest.criteria.like = this.formGroup.get('like').value;
|
|
||||||
this.datasetService
|
|
||||||
.getPaged(datasetDataTableRequest)
|
|
||||||
.pipe(takeUntil(this._destroyed))
|
|
||||||
.subscribe(response => {
|
|
||||||
this.datasetActivities = response.data;
|
|
||||||
this.totalCount = response.totalCount;
|
|
||||||
this.totalCountDatasets.emit(this.datasetActivities.length)
|
|
||||||
if (this.totalCount > 0 && this.totalCount <= (this.page - 1) * this.pageSize && this.page > 1) {
|
|
||||||
let queryParams = { type: "datasets", page: 1, order: this.formGroup.get("order").value };
|
|
||||||
if (this.formGroup.get("like").value) {
|
|
||||||
queryParams['keyword'] = this.formGroup.get("like").value;
|
|
||||||
}
|
|
||||||
this.router.navigate(["/home"], { queryParams: queryParams })
|
|
||||||
}
|
|
||||||
});
|
|
||||||
this.formGroup.get('like').valueChanges
|
|
||||||
.pipe(takeUntil(this._destroyed), debounceTime(500))
|
|
||||||
.subscribe(x => this.refresh());
|
|
||||||
this.formGroup.get('order').valueChanges
|
|
||||||
.pipe(takeUntil(this._destroyed))
|
|
||||||
.subscribe(x => this.refresh());
|
|
||||||
} else {
|
|
||||||
this.publicMode = true;
|
|
||||||
if (!this.formGroup.get('order').value) {
|
|
||||||
this.formGroup.get('order').setValue(this.order.DATASETPUBLISHED);
|
|
||||||
}
|
|
||||||
const dataTableRequest = this.setPublicDataTableRequest();
|
|
||||||
this.datasetService.getPaged(dataTableRequest).pipe(takeUntil(this._destroyed)).subscribe(response => {
|
|
||||||
this.datasetActivities = response.data;
|
|
||||||
this.totalCount = response.totalCount;
|
|
||||||
this.totalCountDatasets.emit(this.datasetActivities.length);
|
|
||||||
if (this.totalCount > 0 && this.totalCount <= (this.page - 1) * this.pageSize && this.page > 1) {
|
|
||||||
let queryParams = { type: "datasets", page: 1, order: this.formGroup.get("order").value };
|
|
||||||
if (this.formGroup.get("like").value) {
|
|
||||||
queryParams['keyword'] = this.formGroup.get("like").value;
|
|
||||||
}
|
|
||||||
this.router.navigate(["/home"], { queryParams: queryParams })
|
|
||||||
}
|
|
||||||
});
|
|
||||||
this.formGroup.get('like').valueChanges
|
|
||||||
.pipe(takeUntil(this._destroyed), debounceTime(500))
|
|
||||||
.subscribe(x => this.refresh());
|
|
||||||
this.formGroup.get('order').valueChanges
|
|
||||||
.pipe(takeUntil(this._destroyed))
|
|
||||||
.subscribe(x => this.refresh());
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
ngOnChanges() {
|
|
||||||
if (this.isActive) {
|
|
||||||
this.updateUrl();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
updateUrl() {
|
|
||||||
let parameters = "?type=datasets" +
|
|
||||||
(this.page != 1 ? "&page=" + this.page : "") +
|
|
||||||
(((this.formGroup.get("order").value != this.order.MODIFIED && !this.publicMode) || (this.formGroup.get("order").value != this.order.DATASETPUBLISHED && this.publicMode)) ? "&order=" + this.formGroup.get("order").value : "") +
|
|
||||||
(this.formGroup.get("like").value ? ("&keyword=" + this.formGroup.get("like").value) : "");
|
|
||||||
this.location.go(this.router.url.split('?')[0] + parameters);
|
|
||||||
}
|
|
||||||
|
|
||||||
setPublicDataTableRequest(fields?: Array<string>, more: boolean = true): DataTableRequest<DatasetCriteria> {
|
|
||||||
const datasetCriteria = new DatasetCriteria();
|
|
||||||
datasetCriteria.allVersions = false;
|
|
||||||
datasetCriteria.isPublic = true;
|
|
||||||
datasetCriteria.like = this.formGroup.get("like").value ? this.formGroup.get("like").value : "";
|
|
||||||
if (!fields) {
|
|
||||||
fields = new Array<string>('-dmp:publishedAt|join|');
|
|
||||||
}
|
|
||||||
const dataTableRequest: DataTableRequest<DatasetCriteria> = more ? new DataTableRequest(this.startIndex, this.pageSize, { fields: fields }) : new DataTableRequest(this.offsetLess, this.pageSize, { fields: fields });
|
|
||||||
dataTableRequest.criteria = datasetCriteria;
|
|
||||||
return dataTableRequest;
|
|
||||||
}
|
|
||||||
|
|
||||||
refresh(): void {
|
|
||||||
this.startIndex = 0;
|
|
||||||
this.page = 1;
|
|
||||||
this.updateUrl();
|
|
||||||
|
|
||||||
|
|
||||||
const fields: Array<string> = [((this.formGroup.get('order').value === 'status') || (this.formGroup.get('order').value === 'label') ? '+' : "-") + this.formGroup.get('order').value];
|
|
||||||
const datasetDataTableRequest = this.isAuthenticated() ? new DataTableRequest<DatasetCriteria>(this.startIndex, this.pageSize, { fields: fields }) : this.setPublicDataTableRequest(fields);
|
|
||||||
if (this.isAuthenticated()) {
|
|
||||||
datasetDataTableRequest.criteria = new DatasetCriteria();
|
|
||||||
datasetDataTableRequest.criteria.like = this.formGroup.get("like").value ? this.formGroup.get("like").value : "";
|
|
||||||
}
|
|
||||||
this.datasetService
|
|
||||||
.getPaged(datasetDataTableRequest)
|
|
||||||
.pipe(takeUntil(this._destroyed))
|
|
||||||
.subscribe(response => {
|
|
||||||
this.datasetActivities = response.data;
|
|
||||||
this.totalCount = response.totalCount;
|
|
||||||
this.totalCountDatasets.emit(this.datasetActivities.length);
|
|
||||||
if (response.data.length < this.pageSize) {
|
|
||||||
this.hasMoreResults = false;
|
|
||||||
} else {
|
|
||||||
this.hasMoreResults = true;
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
public loadNextOrPrevious(more: boolean = true) {
|
|
||||||
this.startIndex = this.startIndex + this.pageSize;
|
|
||||||
|
|
||||||
const fields: Array<string> = [((this.formGroup.get('order').value === 'status') || (this.formGroup.get('order').value === 'label') ? '+' : "-") + this.formGroup.get('order').value];
|
|
||||||
let request;
|
|
||||||
this.startIndex = (this.page) * this.pageSize;
|
|
||||||
if (this.page > 1) {
|
|
||||||
this.offsetLess = (this.page - 2) * this.pageSize;
|
|
||||||
}
|
|
||||||
if (this.isAuthenticated()) {
|
|
||||||
if (more) {
|
|
||||||
request = new DataTableRequest<DatasetCriteria>(this.startIndex, this.pageSize, { fields: fields });
|
|
||||||
} else {
|
|
||||||
request = new DataTableRequest<DatasetCriteria>(this.offsetLess, this.pageSize, { fields: fields });
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
request = this.setPublicDataTableRequest(fields, more);
|
|
||||||
}
|
|
||||||
if (this.isAuthenticated()) {
|
|
||||||
request.criteria = new DatasetCriteria();
|
|
||||||
request.criteria.like = this.formGroup.get("like").value ? this.formGroup.get("like").value : "";
|
|
||||||
}
|
|
||||||
|
|
||||||
this.datasetService.getPaged(request).pipe(takeUntil(this._destroyed)).subscribe(result => {
|
|
||||||
if (!result || !result.data || result.data.length == 0) {
|
|
||||||
this.hasMoreResults = false;
|
|
||||||
// return [];
|
|
||||||
} else {
|
|
||||||
this.page = this.page + (more ? 1 : -1);
|
|
||||||
this.updateUrl();
|
|
||||||
// this.datasetActivities = this.datasetActivities.concat(result.data);
|
|
||||||
// this.datasetActivities = this.datasetActivities.length > 0 ? this.mergeTwoSortedLists(this.datasetActivities, result.data, this.formGroup.get('order').value) : result.data;
|
|
||||||
this.datasetActivities = result.data;
|
|
||||||
|
|
||||||
if (result.data.length < this.pageSize) {
|
|
||||||
this.hasMoreResults = false;
|
|
||||||
} else {
|
|
||||||
this.hasMoreResults = true;
|
|
||||||
}
|
|
||||||
|
|
||||||
this.totalCountDatasets.emit(this.datasetActivities.length);
|
|
||||||
if (more) {
|
|
||||||
this.resultsContainer.nativeElement.scrollIntoView();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
public isAuthenticated(): boolean {
|
|
||||||
return this.authentication.currentAccountIsAuthenticated();
|
|
||||||
}
|
|
||||||
|
|
||||||
isUserOwner(activity: DatasetListingModel): boolean {
|
|
||||||
const principalId: string = this.authentication.userId()?.toString();
|
|
||||||
if (principalId) return !!activity.users.find(x => (x.role === Role.Owner) && (principalId === x.id));
|
|
||||||
}
|
|
||||||
|
|
||||||
goToOverview(id: string): string[] {
|
|
||||||
if (this.isAuthenticated()) {
|
|
||||||
return ['../datasets/overview/' + id];
|
|
||||||
} else {
|
|
||||||
return ['../explore/publicOverview', id];
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
roleDisplay(value: any) {
|
|
||||||
const principalId: string = this.authentication.userId()?.toString();
|
|
||||||
let role: number;
|
|
||||||
if (principalId) {
|
|
||||||
value.forEach(element => {
|
|
||||||
if (principalId === 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');
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
openDmpSearchDialogue(dataset: DatasetListingModel) {
|
|
||||||
const formControl = new UntypedFormControl();
|
|
||||||
const dialogRef = this.dialog.open(DatasetCopyDialogueComponent, {
|
|
||||||
width: '500px',
|
|
||||||
restoreFocus: false,
|
|
||||||
data: {
|
|
||||||
formControl: formControl,
|
|
||||||
datasetId: dataset.id,
|
|
||||||
datasetProfileId: dataset.profile.id,
|
|
||||||
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 } });
|
|
||||||
// let url = this.router.createUrlTree(['/datasets/copy/', result.datasetId, { newDmpId: newDmpId }]);
|
|
||||||
// window.open(url.toString(), '_blank');
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
deleteClicked(id: string) {
|
|
||||||
this.lockService.checkLockStatus(id).pipe(takeUntil(this._destroyed))
|
|
||||||
.subscribe(lockStatus => {
|
|
||||||
if (!lockStatus) {
|
|
||||||
this.openDeleteDialog(id);
|
|
||||||
} else {
|
|
||||||
this.openLockedByUserDialog();
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
openDeleteDialog(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.onDeleteCallbackSuccess(),
|
|
||||||
error => this.onDeleteCallbackError(error)
|
|
||||||
);
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
openLockedByUserDialog() {
|
|
||||||
const dialogRef = this.dialog.open(ConfirmationDialogComponent, {
|
|
||||||
maxWidth: '400px',
|
|
||||||
restoreFocus: false,
|
|
||||||
data: {
|
|
||||||
message: this.language.instant('DATASET-WIZARD.ACTIONS.LOCK')
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
openShareDialog(dmpRowId: any, dmpRowName: any, activity: any) {
|
|
||||||
const dialogRef = this.dialog.open(DmpInvitationDialogComponent, {
|
|
||||||
// height: '250px',
|
|
||||||
// width: '700px',
|
|
||||||
autoFocus: false,
|
|
||||||
restoreFocus: false,
|
|
||||||
data: {
|
|
||||||
dmpId: dmpRowId,
|
|
||||||
dmpName: dmpRowName
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
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.fileUtils.getFilenameFromContentDispositionHeader(response.headers.get('Content-Disposition'));
|
|
||||||
|
|
||||||
FileSaver.saveAs(blob, filename);
|
|
||||||
this.matomoService.trackDownload('datasets', "pdf", dataset.id);
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
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.fileUtils.getFilenameFromContentDispositionHeader(response.headers.get('Content-Disposition'));
|
|
||||||
|
|
||||||
FileSaver.saveAs(blob, filename);
|
|
||||||
this.matomoService.trackDownload('datasets', "docx", dataset.id);
|
|
||||||
});
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
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.fileUtils.getFilenameFromContentDispositionHeader(response.headers.get('Content-Disposition'));
|
|
||||||
|
|
||||||
FileSaver.saveAs(blob, filename);
|
|
||||||
this.matomoService.trackDownload('datasets', "xml", dataset.id);
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
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']);
|
|
||||||
}
|
|
||||||
|
|
||||||
onCallbackError(error: any) {
|
|
||||||
this.setErrorModel(error.error);
|
|
||||||
}
|
|
||||||
|
|
||||||
reloadPage(): void {
|
|
||||||
const path = this.location.path();
|
|
||||||
this.router.navigateByUrl('/reload', { skipLocationChange: true }).then(() => {
|
|
||||||
this.router.navigate([path]);
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
onDeleteCallbackSuccess(): void {
|
|
||||||
this.uiNotificationService.snackBarNotification(this.language.instant('GENERAL.SNACK-BAR.SUCCESSFUL-DELETE'), SnackBarNotificationLevel.Success);
|
|
||||||
this.reloadPage();
|
|
||||||
}
|
|
||||||
|
|
||||||
onDeleteCallbackError(error) {
|
|
||||||
this.uiNotificationService.snackBarNotification(error.error.message ? this.language.instant(error.error.message) : this.language.instant('GENERAL.SNACK-BAR.UNSUCCESSFUL-DELETE'), SnackBarNotificationLevel.Error);
|
|
||||||
}
|
|
||||||
|
|
||||||
public setErrorModel(validationErrorModel: ValidationErrorModel) {
|
|
||||||
}
|
|
||||||
|
|
||||||
needsUpdate(activity: DatasetListingModel) {
|
|
||||||
if (activity.isProfileLatestVersion || (activity.status === DatasetStatus.Finalized)
|
|
||||||
|| (activity.isProfileLatestVersion == undefined && activity.status == undefined)) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private mergeTwoSortedLists(arr1: DatasetListingModel[], arr2: DatasetListingModel[], order: string): DatasetListingModel[] {
|
|
||||||
let merged = [];
|
|
||||||
let index1 = 0;
|
|
||||||
let index2 = 0;
|
|
||||||
let current = 0;
|
|
||||||
|
|
||||||
while (current < (arr1.length + arr2.length)) {
|
|
||||||
let isArr1Depleted = index1 >= arr1.length;
|
|
||||||
let isArr2Depleted = index2 >= arr2.length;
|
|
||||||
if (order === 'modified') {
|
|
||||||
if (!isArr1Depleted && (isArr2Depleted || (new Date(arr1[index1].modified) > new Date(arr2[index2].modified)))) {
|
|
||||||
merged[current] = arr1[index1];
|
|
||||||
index1++;
|
|
||||||
} else {
|
|
||||||
merged[current] = arr2[index2];
|
|
||||||
index2++;
|
|
||||||
}
|
|
||||||
} else if (order === 'created') {
|
|
||||||
if (!isArr1Depleted && (isArr2Depleted || (new Date(arr1[index1].created) > new Date(arr2[index2].created)))) {
|
|
||||||
merged[current] = arr1[index1];
|
|
||||||
index1++;
|
|
||||||
} else {
|
|
||||||
merged[current] = arr2[index2];
|
|
||||||
index2++;
|
|
||||||
}
|
|
||||||
} else if (order === 'label') {
|
|
||||||
if (!isArr1Depleted && (isArr2Depleted || (arr1[index1].label.localeCompare(arr2[index2].label)))) {
|
|
||||||
merged[current] = arr1[index1];
|
|
||||||
index1++;
|
|
||||||
} else {
|
|
||||||
merged[current] = arr2[index2];
|
|
||||||
index2++;
|
|
||||||
}
|
|
||||||
} else if (order === 'status') {
|
|
||||||
if (!isArr1Depleted && (isArr2Depleted || (arr1[index1].status < arr2[index2].status))) {
|
|
||||||
merged[current] = arr1[index1];
|
|
||||||
index1++;
|
|
||||||
} else {
|
|
||||||
merged[current] = arr2[index2];
|
|
||||||
index2++;
|
|
||||||
}
|
|
||||||
} else if (order === 'dmp:publishedAt|join|') {
|
|
||||||
if (!isArr1Depleted && (isArr2Depleted || (new Date(arr1[index1].dmpPublishedAt) > new Date(arr2[index2].dmpPublishedAt)))) {
|
|
||||||
merged[current] = arr1[index1];
|
|
||||||
index1++;
|
|
||||||
} else {
|
|
||||||
merged[current] = arr2[index2];
|
|
||||||
index2++;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
current++;
|
|
||||||
}
|
|
||||||
return merged;
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -0,0 +1,35 @@
|
||||||
|
<div *ngIf="listingItems != null" id="descriptions" #descriptions>
|
||||||
|
<div class="d-flex flex-direction-row pt-4">
|
||||||
|
<!-- Sort by -->
|
||||||
|
<span class="d-flex align-items-center">{{'DMP-LISTING.SORT-BY' | translate}}:</span>
|
||||||
|
<mat-form-field appearance="outline" class="sort-form col-auto">
|
||||||
|
<mat-select placeholder="{{'CRITERIA.LIKE'| translate}}" [formControl]="formGroup.get('order')">
|
||||||
|
<mat-option *ngIf="!publicMode" [value]="order.MODIFIED">{{enumUtils.toRecentActivityOrderString(order.MODIFIED)}}</mat-option>
|
||||||
|
<mat-option *ngIf="publicMode" [value]="order.DATASETPUBLISHED">{{enumUtils.toRecentActivityOrderString(order.DATASETPUBLISHED)}}</mat-option>
|
||||||
|
<mat-option [value]="order.LABEL">{{enumUtils.toRecentActivityOrderString(order.LABEL)}}</mat-option>
|
||||||
|
<mat-option *ngIf="!publicMode" [value]="order.STATUS">{{enumUtils.toRecentActivityOrderString(order.STATUS)}}</mat-option>
|
||||||
|
<!-- <mat-option [value]="order.CREATED">{{enumUtils.toRecentActivityOrderString(order.CREATED)}}</mat-option> -->
|
||||||
|
</mat-select>
|
||||||
|
</mat-form-field>
|
||||||
|
<!-- End of Sort by -->
|
||||||
|
<!-- Search Filter-->
|
||||||
|
<mat-form-field appearance="outline" class="search-form ml-auto col-auto pr-0" floatLabel="never">
|
||||||
|
<mat-icon matSuffix>search</mat-icon>
|
||||||
|
<input matInput placeholder="{{'CRITERIA.DATA-SETS.LIKE'| translate}}" name="likeCriteria" [formControl]="formGroup.get('like')">
|
||||||
|
<mat-error *ngIf="formGroup.get('like').hasError('backendError')">{{formGroup.get('like').getError('backendError').message}}</mat-error>
|
||||||
|
</mat-form-field>
|
||||||
|
<!-- End of Search Filter -->
|
||||||
|
</div>
|
||||||
|
<div *ngIf="listingItems && listingItems.length > 0 && page > 1" class="d-flex justify-content-center">
|
||||||
|
<button type="button" class="btn-load-more" (click)="loadNextOrPrevious(false)">{{'GENERAL.ACTIONS.LOAD-LESS' | translate}}</button>
|
||||||
|
</div>
|
||||||
|
<div *ngFor="let item of listingItems; let i = index">
|
||||||
|
<app-description-listing-item-component [showDivider]="i != (listingItems.length - 1)" [description]="item" [isPublic]="isPublic" ></app-description-listing-item-component>
|
||||||
|
</div>
|
||||||
|
<div class="text-muted d-flex justify-content-center mt-5" *ngIf="!hasMoreResults && listingItems && listingItems.length > 0">
|
||||||
|
{{'GENERAL.ACTIONS.NO-MORE-AVAILABLE' | translate}}
|
||||||
|
</div>
|
||||||
|
<div *ngIf="listingItems && listingItems.length > 0 && listingItems.length >= pageSize && hasMoreResults" class="d-flex justify-content-center">
|
||||||
|
<button type="button" class="btn-load-more" (click)="loadNextOrPrevious()">{{'GENERAL.ACTIONS.LOAD-MORE' | translate}}</button>
|
||||||
|
</div>
|
||||||
|
</div>
|
|
@ -10,7 +10,7 @@
|
||||||
}
|
}
|
||||||
|
|
||||||
.dmp-card,
|
.dmp-card,
|
||||||
.dataset-card {
|
.description-card {
|
||||||
min-width: 712px;
|
min-width: 712px;
|
||||||
/* min-height: 308px; */
|
/* min-height: 308px; */
|
||||||
background: #ffffff 0% 0% no-repeat padding-box;
|
background: #ffffff 0% 0% no-repeat padding-box;
|
||||||
|
@ -56,7 +56,7 @@ input[type="text"] {
|
||||||
line-height: 2.4;
|
line-height: 2.4;
|
||||||
}
|
}
|
||||||
|
|
||||||
.dataset-label {
|
.description-label {
|
||||||
width: auto;
|
width: auto;
|
||||||
height: 37px;
|
height: 37px;
|
||||||
background: var(--secondary-color) 0% 0% no-repeat padding-box;
|
background: var(--secondary-color) 0% 0% no-repeat padding-box;
|
||||||
|
@ -70,7 +70,7 @@ input[type="text"] {
|
||||||
}
|
}
|
||||||
|
|
||||||
.dmp-title,
|
.dmp-title,
|
||||||
.dataset-title {
|
.description-title {
|
||||||
text-align: left;
|
text-align: left;
|
||||||
font-weight: 600;
|
font-weight: 600;
|
||||||
font-family: "Roboto", sans-serif;
|
font-family: "Roboto", sans-serif;
|
||||||
|
@ -81,7 +81,7 @@ input[type="text"] {
|
||||||
color: #212121;
|
color: #212121;
|
||||||
}
|
}
|
||||||
|
|
||||||
.dataset-subtitle,
|
.description-subtitle,
|
||||||
.dmp-subtitle {
|
.dmp-subtitle {
|
||||||
display: flex;
|
display: flex;
|
||||||
flex-direction: row;
|
flex-direction: row;
|
||||||
|
@ -95,7 +95,7 @@ input[type="text"] {
|
||||||
}
|
}
|
||||||
|
|
||||||
.dmp-title-draft,
|
.dmp-title-draft,
|
||||||
.dataset-title-draft {
|
.description-title-draft {
|
||||||
text-align: left;
|
text-align: left;
|
||||||
font-weight: 600;
|
font-weight: 600;
|
||||||
font-family: "Roboto", sans-serif;
|
font-family: "Roboto", sans-serif;
|
||||||
|
@ -114,7 +114,7 @@ input[type="text"] {
|
||||||
}
|
}
|
||||||
|
|
||||||
.dmp-subtitle,
|
.dmp-subtitle,
|
||||||
.dataset-subtitle {
|
.description-subtitle {
|
||||||
|
|
||||||
.icon-align {
|
.icon-align {
|
||||||
display: inline-flex;
|
display: inline-flex;
|
||||||
|
@ -124,7 +124,7 @@ input[type="text"] {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
.dataset-card-actions,
|
.description-card-actions,
|
||||||
.dmp-card-actions {
|
.dmp-card-actions {
|
||||||
display: flex;
|
display: flex;
|
||||||
flex-direction: row;
|
flex-direction: row;
|
||||||
|
@ -133,25 +133,25 @@ input[type="text"] {
|
||||||
color: #848484;
|
color: #848484;
|
||||||
}
|
}
|
||||||
|
|
||||||
.dataset-card-actions a,
|
.description-card-actions a,
|
||||||
.dmp-card-actions a {
|
.dmp-card-actions a {
|
||||||
color: #848484 !important;
|
color: #848484 !important;
|
||||||
text-decoration: none !important;
|
text-decoration: none !important;
|
||||||
}
|
}
|
||||||
|
|
||||||
.dataset-card-actions a:hover,
|
.description-card-actions a:hover,
|
||||||
.dmp-card-actions a:hover {
|
.dmp-card-actions a:hover {
|
||||||
color: var(--primary-color) !important;
|
color: var(--primary-color) !important;
|
||||||
}
|
}
|
||||||
|
|
||||||
.dmp-dataset-descriptions-title {
|
.dmp-description-descriptions-title {
|
||||||
color: #000000;
|
color: #000000;
|
||||||
opacity: 0.6;
|
opacity: 0.6;
|
||||||
padding-top: 1.5rem;
|
padding-top: 1.5rem;
|
||||||
padding-bottom: 0.8rem;
|
padding-bottom: 0.8rem;
|
||||||
}
|
}
|
||||||
|
|
||||||
.dmp-dataset-descriptions-name {
|
.dmp-description-descriptions-name {
|
||||||
color: #000000;
|
color: #000000;
|
||||||
opacity: 0.6;
|
opacity: 0.6;
|
||||||
font-weight: 700;
|
font-weight: 700;
|
|
@ -0,0 +1,174 @@
|
||||||
|
import { Location } from '@angular/common';
|
||||||
|
import { Component, Input, OnInit } from '@angular/core';
|
||||||
|
import { UntypedFormBuilder, UntypedFormControl } from '@angular/forms';
|
||||||
|
import { ActivatedRoute, Router } from '@angular/router';
|
||||||
|
import { RecentActivityOrder } from '@app/core/common/enum/recent-activity-order';
|
||||||
|
import { DescriptionTemplate } from '@app/core/model/description-template/description-template';
|
||||||
|
import { Description } from '@app/core/model/description/description';
|
||||||
|
import { Dmp, DmpUser } from '@app/core/model/dmp/dmp';
|
||||||
|
import { DmpReference, Reference } from '@app/core/model/reference/reference';
|
||||||
|
import { DescriptionLookup } from '@app/core/query/description.lookup';
|
||||||
|
import { AuthService } from '@app/core/services/auth/auth.service';
|
||||||
|
import { DescriptionService } from '@app/core/services/description/description.service';
|
||||||
|
import { MatomoService } from '@app/core/services/matomo/matomo-service';
|
||||||
|
import { EnumUtils } from '@app/core/services/utilities/enum-utils.service';
|
||||||
|
import { BaseComponent } from '@common/base/base.component';
|
||||||
|
import { debounceTime, takeUntil } from 'rxjs/operators';
|
||||||
|
import { nameof } from 'ts-simple-nameof';
|
||||||
|
|
||||||
|
@Component({
|
||||||
|
selector: 'app-recent-edited-description-activity',
|
||||||
|
templateUrl: './recent-edited-description-activity.component.html',
|
||||||
|
styleUrls: ['./recent-edited-description-activity.component.scss']
|
||||||
|
})
|
||||||
|
export class RecentEditedDescriptionActivityComponent extends BaseComponent implements OnInit {
|
||||||
|
|
||||||
|
lookup: DescriptionLookup = new DescriptionLookup();
|
||||||
|
pageSize: number = 5;
|
||||||
|
listingItems: Description[];
|
||||||
|
|
||||||
|
|
||||||
|
public formGroup = new UntypedFormBuilder().group({
|
||||||
|
like: new UntypedFormControl(),
|
||||||
|
order: new UntypedFormControl()
|
||||||
|
});
|
||||||
|
publicMode = false;
|
||||||
|
|
||||||
|
order = RecentActivityOrder;
|
||||||
|
|
||||||
|
totalCount: number;
|
||||||
|
startIndex: number = 0;
|
||||||
|
offsetLess: number = 0;
|
||||||
|
page: number = 1;
|
||||||
|
@Input() isActive: boolean = false;
|
||||||
|
|
||||||
|
constructor(
|
||||||
|
private route: ActivatedRoute,
|
||||||
|
private router: Router,
|
||||||
|
public enumUtils: EnumUtils,
|
||||||
|
private authentication: AuthService,
|
||||||
|
private descriptionService: DescriptionService,
|
||||||
|
private location: Location,
|
||||||
|
private matomoService: MatomoService
|
||||||
|
) {
|
||||||
|
super();
|
||||||
|
}
|
||||||
|
|
||||||
|
ngOnInit() {
|
||||||
|
this.matomoService.trackPageView('Recent DMP Activity');
|
||||||
|
this.route.queryParams.subscribe(params => {
|
||||||
|
if (this.isActive) {
|
||||||
|
let page = (params['page'] === undefined) ? 1 : +params['page'];
|
||||||
|
this.page = (page <= 0) ? 1 : page;
|
||||||
|
|
||||||
|
this.startIndex = (this.page - 1) * this.pageSize;
|
||||||
|
if (this.page > 1) {
|
||||||
|
this.offsetLess = (this.page - 2) * this.pageSize;
|
||||||
|
}
|
||||||
|
|
||||||
|
let order = params['order'];
|
||||||
|
if (this.isAuthenticated()) {
|
||||||
|
if (order === undefined || (order != this.order.UpdatedAt && order != this.order.Label && order != this.order.Status)) {
|
||||||
|
order = this.order.UpdatedAt;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
if (order === undefined || (order != this.order.PUBLISHED && order != this.order.LABEL)) {
|
||||||
|
order = this.order.PUBLISHED;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
this.formGroup.get('order').setValue(order);
|
||||||
|
|
||||||
|
let keyword = (params['keyword'] === undefined || params['keyword'].length <= 0) ? "" : params['keyword'];
|
||||||
|
this.formGroup.get("like").setValue(keyword);
|
||||||
|
|
||||||
|
this.updateUrl();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
if (this.isAuthenticated()) {
|
||||||
|
this.refresh();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
ngOnChanges() {
|
||||||
|
if (this.isActive) {
|
||||||
|
this.updateUrl();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
updateUrl() {
|
||||||
|
let parameters = "?type=dmps" +
|
||||||
|
(this.page != 1 ? "&page=" + this.page : "") +
|
||||||
|
(((this.formGroup.get("order").value != this.order.MODIFIED && !this.publicMode) || (this.formGroup.get("order").value != this.order.PUBLISHED && this.publicMode)) ? "&order=" + this.formGroup.get("order").value : "") +
|
||||||
|
(this.formGroup.get("like").value ? ("&keyword=" + this.formGroup.get("like").value) : "");
|
||||||
|
this.location.go(this.router.url.split('?')[0] + parameters);
|
||||||
|
}
|
||||||
|
|
||||||
|
public isAuthenticated(): boolean {
|
||||||
|
return this.authentication.currentAccountIsAuthenticated();
|
||||||
|
}
|
||||||
|
|
||||||
|
refresh(): void {
|
||||||
|
if (!this.formGroup.get('order').value) {
|
||||||
|
this.formGroup.get('order').setValue(this.order.UpdatedAt);
|
||||||
|
}
|
||||||
|
this.lookup.page = { size: this.pageSize, offset: 0 };
|
||||||
|
this.lookup.order = { items: ['-' + this.formGroup.get('order').value] };
|
||||||
|
this.lookup.like = this.formGroup.get('like').value;
|
||||||
|
this.lookup.project = {
|
||||||
|
|
||||||
|
fields: [
|
||||||
|
[nameof<Description>(x => x.id)].join('.'),
|
||||||
|
[nameof<Description>(x => x.label)].join('.'),
|
||||||
|
[nameof<Description>(x => x.status)].join('.'),
|
||||||
|
[nameof<Description>(x => x.updatedAt)].join('.'),
|
||||||
|
[nameof<Description>(x => x.descriptionTemplate), nameof<DescriptionTemplate>(x => x.id)].join('.'),
|
||||||
|
[nameof<Description>(x => x.descriptionTemplate), nameof<DescriptionTemplate>(x => x.label)].join('.'),
|
||||||
|
[nameof<Description>(x => x.descriptionTemplate), nameof<DescriptionTemplate>(x => x.groupId)].join('.'),
|
||||||
|
[nameof<Description>(x => x.dmp), nameof<Dmp>(x => x.id)].join('.'),
|
||||||
|
[nameof<Description>(x => x.dmp), nameof<Dmp>(x => x.label)].join('.'),
|
||||||
|
[nameof<Description>(x => x.dmp), nameof<Dmp>(x => x.accessType)].join('.'),
|
||||||
|
[nameof<Description>(x => x.dmp), nameof<Dmp>(x => x.dmpUsers), nameof<DmpUser>(x => x.id)].join('.'),
|
||||||
|
[nameof<Description>(x => x.dmp), nameof<Dmp>(x => x.dmpUsers), nameof<DmpUser>(x => x.user.id)].join('.'),
|
||||||
|
[nameof<Description>(x => x.dmp), nameof<Dmp>(x => x.dmpUsers), nameof<DmpUser>(x => x.role)].join('.'),
|
||||||
|
[nameof<Description>(x => x.dmp), nameof<Dmp>(x => x.dmpReferences), nameof<DmpReference>(x => x.id)].join('.'),
|
||||||
|
[nameof<Description>(x => x.dmp), nameof<Dmp>(x => x.dmpReferences), nameof<DmpReference>(x => x.reference), nameof<Reference>(x => x.id)].join('.'),
|
||||||
|
[nameof<Description>(x => x.dmp), nameof<Dmp>(x => x.dmpReferences), nameof<DmpReference>(x => x.reference), nameof<Reference>(x => x.label)].join('.'),
|
||||||
|
[nameof<Description>(x => x.dmp), nameof<Dmp>(x => x.dmpReferences), nameof<DmpReference>(x => x.reference), nameof<Reference>(x => x.type)].join('.'),
|
||||||
|
[nameof<Description>(x => x.dmp), nameof<Dmp>(x => x.dmpReferences), nameof<DmpReference>(x => x.reference), nameof<Reference>(x => x.reference)].join('.'),
|
||||||
|
]
|
||||||
|
};
|
||||||
|
|
||||||
|
this.descriptionService
|
||||||
|
.query(this.lookup)
|
||||||
|
.pipe(takeUntil(this._destroyed))
|
||||||
|
.subscribe(response => {
|
||||||
|
this.listingItems = response.items;
|
||||||
|
this.totalCount = response.count;
|
||||||
|
|
||||||
|
|
||||||
|
//this.totalCountDmps.emit(this.dmpActivities.length);
|
||||||
|
// if (this.totalCount > 0 && this.totalCount <= (this.page - 1) * this.pageSize && this.page > 1) {
|
||||||
|
// let queryParams = { type: "dmps", page: 1, order: this.formGroup.get("order").value };
|
||||||
|
// if (this.formGroup.get("like").value) {
|
||||||
|
// queryParams['keyword'] = this.formGroup.get("like").value;
|
||||||
|
// }
|
||||||
|
// this.router.navigate(["/home"], { queryParams: queryParams })
|
||||||
|
// }
|
||||||
|
// this.totalCount < this.pageSize ? this.totalCountDmps.emit(response.totalCount) : this.totalCountDmps.emit(this.pageSize);
|
||||||
|
// this.totalCountDmps.emit(this.totalCount);
|
||||||
|
// this.dmpActivities.forEach(dmpActivity => {
|
||||||
|
// const recentActivity: RecentActivity = {
|
||||||
|
// activityData: dmpActivity,
|
||||||
|
// activityType: RecentActivityType.Dmp
|
||||||
|
// };
|
||||||
|
// this.allRecentActivities.push(recentActivity)
|
||||||
|
// })
|
||||||
|
});
|
||||||
|
this.formGroup.get('like').valueChanges
|
||||||
|
.pipe(takeUntil(this._destroyed), debounceTime(500))
|
||||||
|
.subscribe(x => this.refresh());
|
||||||
|
this.formGroup.get('order').valueChanges
|
||||||
|
.pipe(takeUntil(this._destroyed))
|
||||||
|
.subscribe(x => this.refresh());
|
||||||
|
}
|
||||||
|
}
|
|
@ -1,4 +1,4 @@
|
||||||
<div *ngIf="dmpActivities != null" id="dmps" #dmps>
|
<div *ngIf="listingItems != null" id="dmps" #dmps>
|
||||||
<div class="d-flex flex-direction-row pt-4">
|
<div class="d-flex flex-direction-row pt-4">
|
||||||
<!-- Sort by -->
|
<!-- Sort by -->
|
||||||
<span class="d-flex align-items-center">{{'DMP-LISTING.SORT-BY' | translate}}:</span>
|
<span class="d-flex align-items-center">{{'DMP-LISTING.SORT-BY' | translate}}:</span>
|
||||||
|
@ -20,10 +20,13 @@
|
||||||
</mat-form-field>
|
</mat-form-field>
|
||||||
<!-- End of Search Filter -->
|
<!-- End of Search Filter -->
|
||||||
</div>
|
</div>
|
||||||
<div *ngIf="dmpActivities && dmpActivities.length > 0 && page > 1" class="d-flex justify-content-center">
|
<div *ngIf="listingItems && listingItems.length > 0 && page > 1" class="d-flex justify-content-center">
|
||||||
<button type="button" class="btn-load-more" (click)="loadNextOrPrevious(false)">{{'GENERAL.ACTIONS.LOAD-LESS' | translate}}</button>
|
<button type="button" class="btn-load-more" (click)="loadNextOrPrevious(false)">{{'GENERAL.ACTIONS.LOAD-LESS' | translate}}</button>
|
||||||
</div>
|
</div>
|
||||||
<div *ngFor="let activity of dmpActivities">
|
<div *ngFor="let item of listingItems; let i = index">
|
||||||
|
<app-dmp-listing-item-component [showDivider]="i != (listingItems.length - 1)" [dmp]="item" [isPublic]="isPublic"></app-dmp-listing-item-component>
|
||||||
|
</div>
|
||||||
|
<!-- <div *ngFor="let activity of listingItems">
|
||||||
<div class="dmp-card">
|
<div class="dmp-card">
|
||||||
<a [routerLink]="navigateToUrl(activity.id)" class="pointer">
|
<a [routerLink]="navigateToUrl(activity.id)" class="pointer">
|
||||||
<div class="d-flex flex-direction-row">
|
<div class="d-flex flex-direction-row">
|
||||||
|
@ -94,11 +97,11 @@
|
||||||
</button>
|
</button>
|
||||||
</mat-menu>
|
</mat-menu>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div> -->
|
||||||
<div class="text-muted d-flex justify-content-center mt-5" *ngIf="!hasMoreResults && dmpActivities && dmpActivities.length > 0">
|
<div class="text-muted d-flex justify-content-center mt-5" *ngIf="!hasMoreResults && listingItems && listingItems.length > 0">
|
||||||
{{'GENERAL.ACTIONS.NO-MORE-AVAILABLE' | translate}}
|
{{'GENERAL.ACTIONS.NO-MORE-AVAILABLE' | translate}}
|
||||||
</div>
|
</div>
|
||||||
<div *ngIf="dmpActivities && dmpActivities.length > 0 && dmpActivities.length >= pageSize && hasMoreResults" class="d-flex justify-content-center">
|
<div *ngIf="listingItems && listingItems.length > 0 && listingItems.length >= pageSize && hasMoreResults" class="d-flex justify-content-center">
|
||||||
<button type="button" class="btn-load-more" (click)="loadNextOrPrevious()">{{'GENERAL.ACTIONS.LOAD-MORE' | translate}}</button>
|
<button type="button" class="btn-load-more" (click)="loadNextOrPrevious()">{{'GENERAL.ACTIONS.LOAD-MORE' | translate}}</button>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
|
@ -1,44 +1,20 @@
|
||||||
import { Location } from '@angular/common';
|
import { Location } from '@angular/common';
|
||||||
import { HttpClient } from '@angular/common/http';
|
|
||||||
import { Component, EventEmitter, Input, OnInit, Output, ViewChild } from '@angular/core';
|
import { Component, EventEmitter, Input, OnInit, Output, ViewChild } from '@angular/core';
|
||||||
import { UntypedFormBuilder, UntypedFormControl, UntypedFormGroup } from '@angular/forms';
|
import { UntypedFormBuilder, UntypedFormControl, UntypedFormGroup } from '@angular/forms';
|
||||||
import { MatDialog } from '@angular/material/dialog';
|
|
||||||
import { ActivatedRoute, Router } from '@angular/router';
|
import { ActivatedRoute, Router } from '@angular/router';
|
||||||
import { DmpBlueprintSectionFieldCategory } from '@app/core/common/enum/dmp-blueprint-section-field-category';
|
|
||||||
import { DmpBlueprintSystemFieldType } from '@app/core/common/enum/dmp-blueprint-system-field-type';
|
|
||||||
import { DmpStatus } from '@app/core/common/enum/dmp-status';
|
|
||||||
import { RecentActivityOrder } from '@app/core/common/enum/recent-activity-order';
|
import { RecentActivityOrder } from '@app/core/common/enum/recent-activity-order';
|
||||||
import { RecentActivityType } from '@app/core/common/enum/recent-activity-type';
|
import { RecentActivityItem } from '@app/core/model/dashboard/recent-activity-item';
|
||||||
import { Role } from '@app/core/common/enum/role';
|
|
||||||
import { DataTableRequest } from '@app/core/model/data-table/data-table-request';
|
|
||||||
import { DatasetListingModel } from '@app/core/model/dataset/dataset-listing';
|
import { DatasetListingModel } from '@app/core/model/dataset/dataset-listing';
|
||||||
import { DescriptionTemplatesInSection, DmpBlueprint, DmpBlueprintDefinition, DmpBlueprintDefinitionSection, FieldInSection } from '@app/core/model/dmp-blueprint/dmp-blueprint';
|
import { Description } from '@app/core/model/description/description';
|
||||||
import { DmpModel } from '@app/core/model/dmp/dmp';
|
import { Dmp, DmpUser } from '@app/core/model/dmp/dmp';
|
||||||
import { DmpListingModel } from '@app/core/model/dmp/dmp-listing';
|
import { RecentActivityItemLookup } from '@app/core/query/recent-activity-item-lookup.lookup';
|
||||||
import { DmpCriteria } from '@app/core/query/dmp/dmp-criteria';
|
|
||||||
import { AuthService } from '@app/core/services/auth/auth.service';
|
import { AuthService } from '@app/core/services/auth/auth.service';
|
||||||
import { DatasetService } from '@app/core/services/dataset/dataset.service';
|
import { DashboardService } from '@app/core/services/dashboard/dashboard.service';
|
||||||
import { DmpBlueprintService } from '@app/core/services/dmp/dmp-blueprint.service';
|
|
||||||
import { DmpService } from '@app/core/services/dmp/dmp.service';
|
|
||||||
import { LockService } from '@app/core/services/lock/lock.service';
|
|
||||||
import { MatomoService } from '@app/core/services/matomo/matomo-service';
|
import { MatomoService } from '@app/core/services/matomo/matomo-service';
|
||||||
import { SnackBarNotificationLevel, UiNotificationService } from '@app/core/services/notification/ui-notification-service';
|
|
||||||
import { EnumUtils } from '@app/core/services/utilities/enum-utils.service';
|
import { EnumUtils } from '@app/core/services/utilities/enum-utils.service';
|
||||||
import { FileUtils } from '@app/core/services/utilities/file-utils.service';
|
|
||||||
import { CloneDialogComponent } from '@app/ui/dmp/clone/clone-dialog/clone-dialog.component';
|
|
||||||
import { DmpEditorModel } from '@app/ui/dmp/editor/dmp-editor.model';
|
import { DmpEditorModel } from '@app/ui/dmp/editor/dmp-editor.model';
|
||||||
import { ExtraPropertiesFormModel } from '@app/ui/dmp/editor/general-tab/extra-properties-form.model';
|
|
||||||
import { FunderFormModel } from '@app/ui/dmp/editor/grant-tab/funder-form-model';
|
|
||||||
import { GrantTabModel } from '@app/ui/dmp/editor/grant-tab/grant-tab-model';
|
|
||||||
import { ProjectFormModel } from '@app/ui/dmp/editor/grant-tab/project-form-model';
|
|
||||||
import { DmpInvitationDialogComponent } from '@app/ui/dmp/invitation/dmp-invitation-dialog.component';
|
|
||||||
import { isNullOrUndefined } from '@app/utilities/enhancers/utils';
|
|
||||||
import { BaseComponent } from '@common/base/base.component';
|
import { BaseComponent } from '@common/base/base.component';
|
||||||
import { ConfirmationDialogComponent } from '@common/modules/confirmation-dialog/confirmation-dialog.component';
|
import { debounceTime, takeUntil } from 'rxjs/operators';
|
||||||
import { Guid } from '@common/types/guid';
|
|
||||||
import { TranslateService } from '@ngx-translate/core';
|
|
||||||
import * as FileSaver from 'file-saver';
|
|
||||||
import { debounceTime, map, takeUntil } from 'rxjs/operators';
|
|
||||||
import { nameof } from 'ts-simple-nameof';
|
import { nameof } from 'ts-simple-nameof';
|
||||||
|
|
||||||
@Component({
|
@Component({
|
||||||
|
@ -48,21 +24,23 @@ import { nameof } from 'ts-simple-nameof';
|
||||||
})
|
})
|
||||||
export class RecentEditedDmpActivityComponent extends BaseComponent implements OnInit {
|
export class RecentEditedDmpActivityComponent extends BaseComponent implements OnInit {
|
||||||
|
|
||||||
|
lookup: RecentActivityItemLookup = new RecentActivityItemLookup();
|
||||||
|
pageSize: number = 5;
|
||||||
|
|
||||||
|
|
||||||
@Output() totalCountDmps: EventEmitter<any> = new EventEmitter();
|
@Output() totalCountDmps: EventEmitter<any> = new EventEmitter();
|
||||||
|
|
||||||
@ViewChild("dmps") resultsContainer;
|
@ViewChild("dmps") resultsContainer;
|
||||||
|
|
||||||
dmpActivities: DmpListingModel[];
|
listingItems: RecentActivityItem[];
|
||||||
datasetActivities: DatasetListingModel[];
|
datasetActivities: DatasetListingModel[];
|
||||||
dmpModel: DmpEditorModel;
|
dmpModel: DmpEditorModel;
|
||||||
recentActivityTypeEnum = RecentActivityType;
|
|
||||||
isDraft: boolean;
|
isDraft: boolean;
|
||||||
|
|
||||||
totalCount: number;
|
totalCount: number;
|
||||||
startIndex: number = 0;
|
startIndex: number = 0;
|
||||||
offsetLess: number = 0;
|
offsetLess: number = 0;
|
||||||
hasMoreResults: boolean = true;
|
hasMoreResults: boolean = true;
|
||||||
pageSize: number = 5;
|
|
||||||
dmpFormGroup: UntypedFormGroup;
|
dmpFormGroup: UntypedFormGroup;
|
||||||
public formGroup = new UntypedFormBuilder().group({
|
public formGroup = new UntypedFormBuilder().group({
|
||||||
like: new UntypedFormControl(),
|
like: new UntypedFormControl(),
|
||||||
|
@ -80,17 +58,9 @@ export class RecentEditedDmpActivityComponent extends BaseComponent implements O
|
||||||
private router: Router,
|
private router: Router,
|
||||||
public enumUtils: EnumUtils,
|
public enumUtils: EnumUtils,
|
||||||
private authentication: AuthService,
|
private authentication: AuthService,
|
||||||
private dmpService: DmpService,
|
private dashboardService: DashboardService,
|
||||||
private dmpBlueprintService: DmpBlueprintService,
|
|
||||||
private datasetService: DatasetService,
|
|
||||||
private language: TranslateService,
|
|
||||||
private dialog: MatDialog,
|
|
||||||
private uiNotificationService: UiNotificationService,
|
|
||||||
private location: Location,
|
private location: Location,
|
||||||
private lockService: LockService,
|
|
||||||
private httpClient: HttpClient,
|
|
||||||
private matomoService: MatomoService,
|
private matomoService: MatomoService,
|
||||||
private fileUtils: FileUtils
|
|
||||||
) {
|
) {
|
||||||
super();
|
super();
|
||||||
}
|
}
|
||||||
|
@ -126,84 +96,7 @@ export class RecentEditedDmpActivityComponent extends BaseComponent implements O
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
if (this.isAuthenticated()) {
|
if (this.isAuthenticated()) {
|
||||||
// const fields: Array<string> = ["-modified"];
|
this.refresh();
|
||||||
if (!this.formGroup.get('order').value) {
|
|
||||||
this.formGroup.get('order').setValue(this.order.MODIFIED);
|
|
||||||
}
|
|
||||||
const fields: Array<string> = [((this.formGroup.get('order').value === 'status') || (this.formGroup.get('order').value === 'label') ? '+' : "-") + this.formGroup.get('order').value];
|
|
||||||
const dmpDataTableRequest: DataTableRequest<DmpCriteria> = new DataTableRequest(this.startIndex, 5, { fields: fields });
|
|
||||||
dmpDataTableRequest.criteria = new DmpCriteria();
|
|
||||||
dmpDataTableRequest.criteria.like = this.formGroup.get('like').value;
|
|
||||||
this.dmpService
|
|
||||||
.getPaged(dmpDataTableRequest, "listing")
|
|
||||||
.pipe(takeUntil(this._destroyed))
|
|
||||||
.subscribe(response => {
|
|
||||||
this.dmpActivities = response.data;
|
|
||||||
this.totalCount = response.totalCount;
|
|
||||||
this.totalCountDmps.emit(this.dmpActivities.length);
|
|
||||||
if (this.totalCount > 0 && this.totalCount <= (this.page - 1) * this.pageSize && this.page > 1) {
|
|
||||||
let queryParams = { type: "dmps", page: 1, order: this.formGroup.get("order").value };
|
|
||||||
if (this.formGroup.get("like").value) {
|
|
||||||
queryParams['keyword'] = this.formGroup.get("like").value;
|
|
||||||
}
|
|
||||||
this.router.navigate(["/home"], { queryParams: queryParams })
|
|
||||||
}
|
|
||||||
// this.totalCount < this.pageSize ? this.totalCountDmps.emit(response.totalCount) : this.totalCountDmps.emit(this.pageSize);
|
|
||||||
// this.totalCountDmps.emit(this.totalCount);
|
|
||||||
// this.dmpActivities.forEach(dmpActivity => {
|
|
||||||
// const recentActivity: RecentActivity = {
|
|
||||||
// activityData: dmpActivity,
|
|
||||||
// activityType: RecentActivityType.Dmp
|
|
||||||
// };
|
|
||||||
// this.allRecentActivities.push(recentActivity)
|
|
||||||
// })
|
|
||||||
});
|
|
||||||
this.formGroup.get('like').valueChanges
|
|
||||||
.pipe(takeUntil(this._destroyed), debounceTime(500))
|
|
||||||
.subscribe(x => this.refresh());
|
|
||||||
this.formGroup.get('order').valueChanges
|
|
||||||
.pipe(takeUntil(this._destroyed))
|
|
||||||
.subscribe(x => this.refresh());
|
|
||||||
// const datasetDataTableRequest: DataTableRequest<DatasetCriteria> = 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)
|
|
||||||
// })
|
|
||||||
// });
|
|
||||||
} else {
|
|
||||||
this.publicMode = true;
|
|
||||||
if (!this.formGroup.get('order').value) {
|
|
||||||
this.formGroup.get('order').setValue(this.order.PUBLISHED);
|
|
||||||
}
|
|
||||||
const dataTableRequest = this.setPublicDataTableRequest();
|
|
||||||
this.dmpService.getPaged(dataTableRequest, "listing").pipe(takeUntil(this._destroyed)).subscribe(response => {
|
|
||||||
if (!response) { return []; }
|
|
||||||
this.dmpActivities = response.data;
|
|
||||||
this.totalCount = response.totalCount;
|
|
||||||
this.totalCountDmps.emit(this.dmpActivities.length);
|
|
||||||
if (this.totalCount > 0 && this.totalCount <= (this.page - 1) * this.pageSize && this.page > 1) {
|
|
||||||
let queryParams = { type: "dmps", page: 1, order: this.formGroup.get("order").value };
|
|
||||||
if (this.formGroup.get("like").value) {
|
|
||||||
queryParams['keyword'] = this.formGroup.get("like").value;
|
|
||||||
}
|
|
||||||
this.router.navigate(["/home"], { queryParams: queryParams })
|
|
||||||
}
|
|
||||||
});
|
|
||||||
this.formGroup.get('like').valueChanges
|
|
||||||
.pipe(takeUntil(this._destroyed), debounceTime(500))
|
|
||||||
.subscribe(x => this.refresh());
|
|
||||||
this.formGroup.get('order').valueChanges
|
|
||||||
.pipe(takeUntil(this._destroyed))
|
|
||||||
.subscribe(x => this.refresh());
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -225,525 +118,76 @@ export class RecentEditedDmpActivityComponent extends BaseComponent implements O
|
||||||
return this.authentication.currentAccountIsAuthenticated();
|
return this.authentication.currentAccountIsAuthenticated();
|
||||||
}
|
}
|
||||||
|
|
||||||
private setPublicDataTableRequest(fields?: Array<string>, more: boolean = true): DataTableRequest<DmpCriteria> {
|
|
||||||
const dmpCriteria = new DmpCriteria();
|
|
||||||
dmpCriteria.allVersions = false;
|
|
||||||
dmpCriteria.isPublic = true;
|
|
||||||
dmpCriteria.onlyPublic = true;
|
|
||||||
dmpCriteria.like = this.formGroup.get("like").value ? this.formGroup.get("like").value : "";
|
|
||||||
if (!fields) {
|
|
||||||
fields = new Array<string>('-publishedAt');
|
|
||||||
}
|
|
||||||
const dataTableRequest: DataTableRequest<DmpCriteria> = more ? new DataTableRequest(this.startIndex, this.pageSize, { fields: fields }) : new DataTableRequest(this.offsetLess, this.pageSize, { fields: fields });
|
|
||||||
dataTableRequest.criteria = dmpCriteria;
|
|
||||||
return dataTableRequest;
|
|
||||||
}
|
|
||||||
|
|
||||||
isUserOwner(activity: DmpListingModel): boolean {
|
|
||||||
const principalId: string = this.authentication.userId()?.toString();
|
|
||||||
if (principalId) return !!activity.users.find(x => (x.role === Role.Owner) && (principalId === x.id));
|
|
||||||
}
|
|
||||||
|
|
||||||
editClicked(dmp: DmpListingModel) {
|
|
||||||
this.router.navigate(['/plans/edit/' + dmp.id]);
|
|
||||||
}
|
|
||||||
|
|
||||||
cloneOrNewVersionClicked(dmp: DmpListingModel, isNewVersion: boolean) {
|
|
||||||
this.dmpService.getSingle(dmp.id).pipe(map(data => data as DmpModel))
|
|
||||||
.pipe(takeUntil(this._destroyed))
|
|
||||||
.subscribe(data => {
|
|
||||||
this.dmpModel = new DmpEditorModel();
|
|
||||||
this.dmpModel.grant = new GrantTabModel();
|
|
||||||
this.dmpModel.project = new ProjectFormModel();
|
|
||||||
this.dmpModel.funder = new FunderFormModel();
|
|
||||||
this.dmpModel.extraProperties = new ExtraPropertiesFormModel();
|
|
||||||
this.dmpModel.fromModel(data);
|
|
||||||
this.dmpModel.status = DmpStatus.Draft;
|
|
||||||
this.dmpFormGroup = this.dmpModel.buildForm();
|
|
||||||
|
|
||||||
if (!isNullOrUndefined(this.formGroup.get('profile').value)) {
|
|
||||||
this.getBlueprintDefinition(Guid.parse(this.formGroup.get('profile').value), result => {
|
|
||||||
this.checkForGrant(result.definition);
|
|
||||||
this.checkForFunder(result.definition);
|
|
||||||
this.checkForProject(result.definition);
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!isNewVersion) {
|
|
||||||
this.dmpFormGroup.get('label').setValue(dmp.label + " New");
|
|
||||||
}
|
|
||||||
this.openCloneDialog(isNewVersion);
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
private getBlueprintDefinition(blueprintId: Guid, successFunction) {
|
|
||||||
this.dmpBlueprintService.getSingle(blueprintId, [
|
|
||||||
[nameof<DmpBlueprint>(x => x.definition), nameof<DmpBlueprintDefinition>(x => x.sections), nameof<DmpBlueprintDefinitionSection>(x => x.id)].join('.'),
|
|
||||||
[nameof<DmpBlueprint>(x => x.definition), nameof<DmpBlueprintDefinition>(x => x.sections), nameof<DmpBlueprintDefinitionSection>(x => x.label)].join('.'),
|
|
||||||
[nameof<DmpBlueprint>(x => x.definition), nameof<DmpBlueprintDefinition>(x => x.sections), nameof<DmpBlueprintDefinitionSection>(x => x.description)].join('.'),
|
|
||||||
[nameof<DmpBlueprint>(x => x.definition), nameof<DmpBlueprintDefinition>(x => x.sections), nameof<DmpBlueprintDefinitionSection>(x => x.ordinal)].join('.'),
|
|
||||||
[nameof<DmpBlueprint>(x => x.definition), nameof<DmpBlueprintDefinition>(x => x.sections), nameof<DmpBlueprintDefinitionSection>(x => x.hasTemplates)].join('.'),
|
|
||||||
|
|
||||||
[nameof<DmpBlueprint>(x => x.definition), nameof<DmpBlueprintDefinition>(x => x.sections), nameof<DmpBlueprintDefinitionSection>(x => x.fields), nameof<FieldInSection>(x => x.id)].join('.'),
|
|
||||||
[nameof<DmpBlueprint>(x => x.definition), nameof<DmpBlueprintDefinition>(x => x.sections), nameof<DmpBlueprintDefinitionSection>(x => x.fields), nameof<FieldInSection>(x => x.category)].join('.'),
|
|
||||||
[nameof<DmpBlueprint>(x => x.definition), nameof<DmpBlueprintDefinition>(x => x.sections), nameof<DmpBlueprintDefinitionSection>(x => x.fields), nameof<FieldInSection>(x => x.dataType)].join('.'),
|
|
||||||
[nameof<DmpBlueprint>(x => x.definition), nameof<DmpBlueprintDefinition>(x => x.sections), nameof<DmpBlueprintDefinitionSection>(x => x.fields), nameof<FieldInSection>(x => x.systemFieldType)].join('.'),
|
|
||||||
[nameof<DmpBlueprint>(x => x.definition), nameof<DmpBlueprintDefinition>(x => x.sections), nameof<DmpBlueprintDefinitionSection>(x => x.fields), nameof<FieldInSection>(x => x.label)].join('.'),
|
|
||||||
[nameof<DmpBlueprint>(x => x.definition), nameof<DmpBlueprintDefinition>(x => x.sections), nameof<DmpBlueprintDefinitionSection>(x => x.fields), nameof<FieldInSection>(x => x.placeholder)].join('.'),
|
|
||||||
[nameof<DmpBlueprint>(x => x.definition), nameof<DmpBlueprintDefinition>(x => x.sections), nameof<DmpBlueprintDefinitionSection>(x => x.fields), nameof<FieldInSection>(x => x.description)].join('.'),
|
|
||||||
[nameof<DmpBlueprint>(x => x.definition), nameof<DmpBlueprintDefinition>(x => x.sections), nameof<DmpBlueprintDefinitionSection>(x => x.fields), nameof<FieldInSection>(x => x.required)].join('.'),
|
|
||||||
[nameof<DmpBlueprint>(x => x.definition), nameof<DmpBlueprintDefinition>(x => x.sections), nameof<DmpBlueprintDefinitionSection>(x => x.fields), nameof<FieldInSection>(x => x.ordinal)].join('.'),
|
|
||||||
|
|
||||||
[nameof<DmpBlueprint>(x => x.definition), nameof<DmpBlueprintDefinition>(x => x.sections), nameof<DmpBlueprintDefinitionSection>(x => x.descriptionTemplates), nameof<DescriptionTemplatesInSection>(x => x.id)].join('.'),
|
|
||||||
[nameof<DmpBlueprint>(x => x.definition), nameof<DmpBlueprintDefinition>(x => x.sections), nameof<DmpBlueprintDefinitionSection>(x => x.descriptionTemplates), nameof<DescriptionTemplatesInSection>(x => x.descriptionTemplateId)].join('.'),
|
|
||||||
[nameof<DmpBlueprint>(x => x.definition), nameof<DmpBlueprintDefinition>(x => x.sections), nameof<DmpBlueprintDefinitionSection>(x => x.descriptionTemplates), nameof<DescriptionTemplatesInSection>(x => x.label)].join('.'),
|
|
||||||
[nameof<DmpBlueprint>(x => x.definition), nameof<DmpBlueprintDefinition>(x => x.sections), nameof<DmpBlueprintDefinitionSection>(x => x.descriptionTemplates), nameof<DescriptionTemplatesInSection>(x => x.minMultiplicity)].join('.'),
|
|
||||||
[nameof<DmpBlueprint>(x => x.definition), nameof<DmpBlueprintDefinition>(x => x.sections), nameof<DmpBlueprintDefinitionSection>(x => x.descriptionTemplates), nameof<DescriptionTemplatesInSection>(x => x.maxMultiplicity)].join('.'),
|
|
||||||
]
|
|
||||||
)
|
|
||||||
.pipe(map(data => data as DmpBlueprint), takeUntil(this._destroyed))
|
|
||||||
.subscribe(
|
|
||||||
data => successFunction(data),
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
private checkForGrant(blueprint: DmpBlueprintDefinition) {
|
|
||||||
let hasGrant = false;
|
|
||||||
blueprint.sections.forEach(section => section.fields.forEach(
|
|
||||||
field => {
|
|
||||||
if (field.category as unknown === DmpBlueprintSectionFieldCategory.SYSTEM && field.systemFieldType === DmpBlueprintSystemFieldType.GRANT) {
|
|
||||||
hasGrant = true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
));
|
|
||||||
if (!hasGrant) {
|
|
||||||
this.formGroup.removeControl('grant');
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private checkForFunder(blueprint: DmpBlueprintDefinition) {
|
|
||||||
let hasFunder = false;
|
|
||||||
blueprint.sections.forEach(section => section.fields.forEach(
|
|
||||||
field => {
|
|
||||||
if (field.category as unknown === DmpBlueprintSectionFieldCategory.SYSTEM && field.systemFieldType === DmpBlueprintSystemFieldType.FUNDER) {
|
|
||||||
hasFunder = true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
));
|
|
||||||
if (!hasFunder) {
|
|
||||||
this.formGroup.removeControl('funder');
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private checkForProject(blueprint: DmpBlueprintDefinition) {
|
|
||||||
let hasProject = false;
|
|
||||||
blueprint.sections.forEach(section => section.fields.forEach(
|
|
||||||
field => {
|
|
||||||
if (field.category as unknown === DmpBlueprintSectionFieldCategory.SYSTEM && field.systemFieldType === DmpBlueprintSystemFieldType.PROJECT) {
|
|
||||||
hasProject = true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
));
|
|
||||||
if (!hasProject) {
|
|
||||||
this.formGroup.removeControl('project');
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
openCloneDialog(isNewVersion: boolean) {
|
|
||||||
const dialogRef = this.dialog.open(CloneDialogComponent, {
|
|
||||||
maxWidth: '700px',
|
|
||||||
maxHeight: '80vh',
|
|
||||||
data: {
|
|
||||||
formGroup: this.dmpFormGroup,
|
|
||||||
datasets: this.dmpFormGroup.get('datasets').value,
|
|
||||||
isNewVersion: isNewVersion,
|
|
||||||
confirmButton: this.language.instant('DMP-EDITOR.CLONE-DIALOG.SAVE'),
|
|
||||||
cancelButton: this.language.instant('DMP-EDITOR.CLONE-DIALOG.CANCEL'),
|
|
||||||
}
|
|
||||||
});
|
|
||||||
dialogRef.afterClosed().pipe(takeUntil(this._destroyed)).subscribe(result => {
|
|
||||||
if (result) {
|
|
||||||
if (!isNewVersion) {
|
|
||||||
this.dmpService.clone(this.dmpFormGroup.getRawValue(), this.dmpFormGroup.get('id').value)
|
|
||||||
.pipe(takeUntil(this._destroyed))
|
|
||||||
.subscribe(
|
|
||||||
complete => this.onCloneOrNewVersionCallbackSuccess(complete),
|
|
||||||
error => this.onCloneOrNewVersionCallbackError(error)
|
|
||||||
);
|
|
||||||
} else if (isNewVersion) {
|
|
||||||
this.dmpService.newVersion(this.dmpFormGroup.getRawValue(), this.dmpFormGroup.get('id').value)
|
|
||||||
.pipe(takeUntil(this._destroyed))
|
|
||||||
.subscribe(
|
|
||||||
complete => this.onCloneOrNewVersionCallbackSuccess(complete),
|
|
||||||
error => this.onCloneOrNewVersionCallbackError(error)
|
|
||||||
);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
deleteClicked(id: string) {
|
|
||||||
this.lockService.checkLockStatus(id).pipe(takeUntil(this._destroyed))
|
|
||||||
.subscribe(lockStatus => {
|
|
||||||
if (!lockStatus) {
|
|
||||||
this.openDeleteDialog(id);
|
|
||||||
} else {
|
|
||||||
this.openLockedByUserDialog();
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
openDeleteDialog(id: string) {
|
|
||||||
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(id)
|
|
||||||
.pipe(takeUntil(this._destroyed))
|
|
||||||
.subscribe(
|
|
||||||
complete => this.onDeleteCallbackSuccess(),
|
|
||||||
error => this.onDeleteCallbackError(error)
|
|
||||||
);
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
openLockedByUserDialog() {
|
|
||||||
const dialogRef = this.dialog.open(ConfirmationDialogComponent, {
|
|
||||||
maxWidth: '400px',
|
|
||||||
restoreFocus: false,
|
|
||||||
data: {
|
|
||||||
message: this.language.instant('DMP-EDITOR.ACTIONS.LOCK')
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
openShareDialog(rowId: any, rowName: any) {
|
|
||||||
const dialogRef = this.dialog.open(DmpInvitationDialogComponent, {
|
|
||||||
// height: '250px',
|
|
||||||
// width: '700px',
|
|
||||||
autoFocus: false,
|
|
||||||
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']);
|
|
||||||
}
|
|
||||||
|
|
||||||
reloadPage(): void {
|
|
||||||
const path = this.location.path();
|
|
||||||
this.router.navigateByUrl('/reload', { skipLocationChange: true }).then(() => {
|
|
||||||
this.router.navigate([path]);
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
onDeleteCallbackSuccess(): void {
|
|
||||||
this.uiNotificationService.snackBarNotification(this.language.instant('GENERAL.SNACK-BAR.SUCCESSFUL-DELETE'), SnackBarNotificationLevel.Success);
|
|
||||||
this.reloadPage();
|
|
||||||
}
|
|
||||||
|
|
||||||
onDeleteCallbackError(error) {
|
|
||||||
this.uiNotificationService.snackBarNotification(error.error.message ? this.language.instant(error.error.message) : this.language.instant('GENERAL.SNACK-BAR.UNSUCCESSFUL-DELETE'), SnackBarNotificationLevel.Error);
|
|
||||||
}
|
|
||||||
|
|
||||||
onCloneOrNewVersionCallbackSuccess(dmpId: String): void {
|
|
||||||
this.uiNotificationService.snackBarNotification(this.language.instant('GENERAL.SNACK-BAR.SUCCESSFUL-UPDATE'), SnackBarNotificationLevel.Success);
|
|
||||||
this.router.navigate(['/plans/edit/', dmpId]);
|
|
||||||
}
|
|
||||||
|
|
||||||
onCloneOrNewVersionCallbackError(error: any) {
|
|
||||||
this.uiNotificationService.snackBarNotification(error.error.message ? error.error.message : this.language.instant('GENERAL.SNACK-BAR.UNSUCCESSFUL-UPDATE'), SnackBarNotificationLevel.Error);
|
|
||||||
}
|
|
||||||
|
|
||||||
redirect(id: string) {
|
|
||||||
if (this.isAuthenticated()) {
|
|
||||||
this.router.navigate(['../plans/overview/' + id]);
|
|
||||||
} else {
|
|
||||||
this.router.navigate(['../explore-plans/publicOverview', id]);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
navigateToUrl(id: string): string[] {
|
|
||||||
if (this.isAuthenticated()) {
|
|
||||||
return ['../plans/overview/' + id];
|
|
||||||
} else {
|
|
||||||
return ['../explore-plans/publicOverview', id];
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
roleDisplay(value: any) {
|
|
||||||
const principalId: string = this.authentication.userId()?.toString();
|
|
||||||
let role: number;
|
|
||||||
if (principalId) {
|
|
||||||
value.forEach(element => {
|
|
||||||
if (principalId === 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');
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// dmpBlueprintDisplay(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.fileUtils.getFilenameFromContentDispositionHeader(response.headers.get('Content-Disposition'));
|
|
||||||
|
|
||||||
FileSaver.saveAs(blob, filename);
|
|
||||||
this.matomoService.trackDownload('dmps', "xml", id);
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
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.fileUtils.getFilenameFromContentDispositionHeader(response.headers.get('Content-Disposition'));
|
|
||||||
|
|
||||||
FileSaver.saveAs(blob, filename);
|
|
||||||
this.matomoService.trackDownload('dmps', "docx", id);
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
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.fileUtils.getFilenameFromContentDispositionHeader(response.headers.get('Content-Disposition'));
|
|
||||||
|
|
||||||
FileSaver.saveAs(blob, filename);
|
|
||||||
this.matomoService.trackDownload('dmps', "pdf", id);
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
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.fileUtils.getFilenameFromContentDispositionHeader(response.headers.get('Content-Disposition'));
|
|
||||||
FileSaver.saveAs(blob, filename);
|
|
||||||
this.matomoService.trackDownload('dmps', "json", id);
|
|
||||||
}, async error => {
|
|
||||||
this.onExportCallbackError(error);
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
async onExportCallbackError(error: any) {
|
|
||||||
const errorJsonText = await error.error.text();
|
|
||||||
const errorObj = JSON.parse(errorJsonText);
|
|
||||||
this.uiNotificationService.snackBarNotification(errorObj.message, SnackBarNotificationLevel.Error);
|
|
||||||
}
|
|
||||||
|
|
||||||
// newVersion(id: String, label: String) {
|
|
||||||
// let url = this.router.createUrlTree(['/plans/new_version/', id, { dmpLabel: label }]);
|
|
||||||
// window.open(url.toString(), '_blank');
|
|
||||||
// }
|
|
||||||
|
|
||||||
viewVersions(rowId: String, rowLabel: String, activity: DmpListingModel) {
|
|
||||||
if (activity.public && !this.isUserOwner(activity)) {
|
|
||||||
let url = this.router.createUrlTree(['/explore-plans/versions/', rowId, { groupLabel: rowLabel }]);
|
|
||||||
window.open(url.toString(), '_blank');
|
|
||||||
// this.router.navigate(['/explore-plans/versions/' + rowId], { queryParams: { groupLabel: rowLabel } });
|
|
||||||
} else {
|
|
||||||
let url = this.router.createUrlTree(['/plans/versions/', rowId, { groupLabel: rowLabel }]);
|
|
||||||
window.open(url.toString(), '_blank');
|
|
||||||
// this.router.navigate(['/plans/versions/' + rowId], { queryParams: { groupLabel: rowLabel } });
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
refresh(): void {
|
refresh(): void {
|
||||||
this.page = 1;
|
if (!this.formGroup.get('order').value) {
|
||||||
this.updateUrl();
|
this.formGroup.get('order').setValue(this.order.UpdatedAt);
|
||||||
|
|
||||||
const fields: Array<string> = [((this.formGroup.get('order').value === 'status') || (this.formGroup.get('order').value === 'label') ? '+' : "-") + this.formGroup.get('order').value];
|
|
||||||
this.startIndex = 0;
|
|
||||||
const dmpDataTableRequest = this.isAuthenticated() ? new DataTableRequest<DmpCriteria>(this.startIndex, this.pageSize, { fields: fields }) : this.setPublicDataTableRequest(fields);
|
|
||||||
if (this.isAuthenticated()) {
|
|
||||||
dmpDataTableRequest.criteria = new DmpCriteria();
|
|
||||||
dmpDataTableRequest.criteria.like = this.formGroup.get("like").value ? this.formGroup.get("like").value : "";
|
|
||||||
}
|
}
|
||||||
this.dmpService
|
this.lookup.page = { size: this.pageSize, offset: 0 };
|
||||||
.getPaged(dmpDataTableRequest, "listing")
|
this.lookup.orderField = this.formGroup.get('order').value;
|
||||||
|
this.lookup.like = this.formGroup.get('like').value;
|
||||||
|
this.lookup.project = {
|
||||||
|
fields: [
|
||||||
|
[nameof<RecentActivityItem>(x => x.dmp), nameof<Dmp>(x => x.id)].join('.'),
|
||||||
|
[nameof<RecentActivityItem>(x => x.dmp), nameof<Dmp>(x => x.label)].join('.'),
|
||||||
|
[nameof<RecentActivityItem>(x => x.dmp), nameof<Dmp>(x => x.status)].join('.'),
|
||||||
|
[nameof<RecentActivityItem>(x => x.dmp), nameof<Dmp>(x => x.accessType)].join('.'),
|
||||||
|
[nameof<RecentActivityItem>(x => x.dmp), nameof<Dmp>(x => x.version)].join('.'),
|
||||||
|
[nameof<RecentActivityItem>(x => x.dmp), nameof<Dmp>(x => x.groupId)].join('.'),
|
||||||
|
[nameof<RecentActivityItem>(x => x.dmp), nameof<Dmp>(x => x.updatedAt)].join('.'),
|
||||||
|
[nameof<RecentActivityItem>(x => x.dmp), nameof<Dmp>(x => x.descriptions), nameof<Description>(x => x.id)].join('.'),
|
||||||
|
[nameof<RecentActivityItem>(x => x.dmp), nameof<Dmp>(x => x.descriptions), nameof<Description>(x => x.label)].join('.'),
|
||||||
|
[nameof<RecentActivityItem>(x => x.dmp), nameof<Dmp>(x => x.dmpUsers), nameof<DmpUser>(x => x.id)].join('.'),
|
||||||
|
[nameof<RecentActivityItem>(x => x.dmp), nameof<Dmp>(x => x.dmpUsers), nameof<DmpUser>(x => x.user.id)].join('.'),
|
||||||
|
[nameof<RecentActivityItem>(x => x.dmp), nameof<Dmp>(x => x.dmpUsers), nameof<DmpUser>(x => x.role)].join('.'),
|
||||||
|
]
|
||||||
|
};
|
||||||
|
|
||||||
|
this.dashboardService
|
||||||
|
.getMyRecentActivityItems(this.lookup)
|
||||||
|
.pipe(takeUntil(this._destroyed))
|
||||||
.subscribe(response => {
|
.subscribe(response => {
|
||||||
this.dmpActivities = response.data;
|
this.listingItems = response;
|
||||||
this.totalCount = response.totalCount;
|
//this.totalCount = response.totalCount;
|
||||||
this.totalCountDmps.emit(this.dmpActivities.length);
|
|
||||||
if (response.data.length < this.pageSize) {
|
|
||||||
this.hasMoreResults = false;
|
//this.totalCountDmps.emit(this.dmpActivities.length);
|
||||||
} else {
|
// if (this.totalCount > 0 && this.totalCount <= (this.page - 1) * this.pageSize && this.page > 1) {
|
||||||
this.hasMoreResults = true;
|
// let queryParams = { type: "dmps", page: 1, order: this.formGroup.get("order").value };
|
||||||
}
|
// if (this.formGroup.get("like").value) {
|
||||||
|
// queryParams['keyword'] = this.formGroup.get("like").value;
|
||||||
|
// }
|
||||||
|
// this.router.navigate(["/home"], { queryParams: queryParams })
|
||||||
|
// }
|
||||||
|
// this.totalCount < this.pageSize ? this.totalCountDmps.emit(response.totalCount) : this.totalCountDmps.emit(this.pageSize);
|
||||||
|
// this.totalCountDmps.emit(this.totalCount);
|
||||||
|
// this.dmpActivities.forEach(dmpActivity => {
|
||||||
|
// const recentActivity: RecentActivity = {
|
||||||
|
// activityData: dmpActivity,
|
||||||
|
// activityType: RecentActivityType.Dmp
|
||||||
|
// };
|
||||||
|
// this.allRecentActivities.push(recentActivity)
|
||||||
|
// })
|
||||||
});
|
});
|
||||||
|
this.formGroup.get('like').valueChanges
|
||||||
|
.pipe(takeUntil(this._destroyed), debounceTime(500))
|
||||||
|
.subscribe(x => this.refresh());
|
||||||
|
this.formGroup.get('order').valueChanges
|
||||||
|
.pipe(takeUntil(this._destroyed))
|
||||||
|
.subscribe(x => this.refresh());
|
||||||
|
// const datasetDataTableRequest: DataTableRequest<DatasetCriteria> = 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 loadNextOrPrevious(more: boolean = true) {
|
|
||||||
this.startIndex = this.startIndex + this.pageSize;
|
|
||||||
|
|
||||||
const fields: Array<string> = [((this.formGroup.get('order').value === 'status') || (this.formGroup.get('order').value === 'label') ? '+' : "-") + this.formGroup.get('order').value];
|
|
||||||
let request;
|
|
||||||
this.startIndex = (this.page) * this.pageSize;
|
|
||||||
if (this.page > 1) {
|
|
||||||
this.offsetLess = (this.page - 2) * this.pageSize;
|
|
||||||
}
|
|
||||||
if (this.isAuthenticated()) {
|
|
||||||
if (more) {
|
|
||||||
request = new DataTableRequest<DmpCriteria>(this.startIndex, this.pageSize, { fields: fields })
|
|
||||||
} else {
|
|
||||||
request = new DataTableRequest<DmpCriteria>(this.offsetLess, this.pageSize, { fields: fields })
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
request = this.setPublicDataTableRequest(fields, more);
|
|
||||||
}
|
|
||||||
if (this.isAuthenticated()) {
|
|
||||||
request.criteria = new DmpCriteria();
|
|
||||||
request.criteria.like = this.formGroup.get("like").value ? this.formGroup.get("like").value : "";
|
|
||||||
}
|
|
||||||
|
|
||||||
this.dmpService.getPaged(request, "listing").pipe(takeUntil(this._destroyed)).subscribe(result => {
|
|
||||||
if (!result || !result.data || result.data.length == 0) {
|
|
||||||
this.hasMoreResults = false;
|
|
||||||
// return [];
|
|
||||||
} else {
|
|
||||||
this.page = this.page + (more ? 1 : -1);
|
|
||||||
this.updateUrl();
|
|
||||||
// this.dmpActivities = this.dmpActivities.concat(result.data);
|
|
||||||
// this.dmpActivities = this.dmpActivities.length > 0 ? this.mergeTwoSortedLists(this.dmpActivities, result.data, this.formGroup.get('order').value) : result.data;
|
|
||||||
this.dmpActivities = result.data;
|
|
||||||
|
|
||||||
if (result.data.length < this.pageSize) {
|
|
||||||
this.hasMoreResults = false;
|
|
||||||
} else {
|
|
||||||
this.hasMoreResults = true;
|
|
||||||
}
|
|
||||||
|
|
||||||
this.totalCountDmps.emit(this.dmpActivities.length);
|
|
||||||
if (more) {
|
|
||||||
this.resultsContainer.nativeElement.scrollIntoView();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
private mergeTwoSortedLists(arr1: DmpListingModel[], arr2: DmpListingModel[], order: string): DmpListingModel[] {
|
|
||||||
let merged = [];
|
|
||||||
let index1 = 0;
|
|
||||||
let index2 = 0;
|
|
||||||
let current = 0;
|
|
||||||
|
|
||||||
while (current < (arr1.length + arr2.length)) {
|
|
||||||
|
|
||||||
let isArr1Depleted = index1 >= arr1.length;
|
|
||||||
let isArr2Depleted = index2 >= arr2.length;
|
|
||||||
|
|
||||||
if (order === 'modified') {
|
|
||||||
if (!isArr1Depleted && (isArr2Depleted || (new Date(arr1[index1].modifiedTime) > new Date(arr2[index2].modifiedTime)))) {
|
|
||||||
merged[current] = arr1[index1];
|
|
||||||
index1++;
|
|
||||||
} else {
|
|
||||||
merged[current] = arr2[index2];
|
|
||||||
index2++;
|
|
||||||
}
|
|
||||||
} else if (order === 'created') {
|
|
||||||
if (!isArr1Depleted && (isArr2Depleted || (new Date(arr1[index1].creationTime) > new Date(arr2[index2].creationTime)))) {
|
|
||||||
merged[current] = arr1[index1];
|
|
||||||
index1++;
|
|
||||||
} else {
|
|
||||||
merged[current] = arr2[index2];
|
|
||||||
index2++;
|
|
||||||
}
|
|
||||||
} else if (order === 'label') {
|
|
||||||
if (!isArr1Depleted && (isArr2Depleted || (arr1[index1].label.localeCompare(arr2[index2].label)))) {
|
|
||||||
merged[current] = arr1[index1];
|
|
||||||
index1++;
|
|
||||||
} else {
|
|
||||||
merged[current] = arr2[index2];
|
|
||||||
index2++;
|
|
||||||
}
|
|
||||||
} else if (order === 'status') {
|
|
||||||
if (!isArr1Depleted && (isArr2Depleted || (arr1[index1].status < arr2[index2].status))) {
|
|
||||||
merged[current] = arr1[index1];
|
|
||||||
index1++;
|
|
||||||
} else {
|
|
||||||
merged[current] = arr2[index2];
|
|
||||||
index2++;
|
|
||||||
}
|
|
||||||
} else if (order === "publishedAt") {
|
|
||||||
if (!isArr1Depleted && (isArr2Depleted || (new Date(arr1[index1].publishedAt) > new Date(arr2[index2].publishedAt)))) {
|
|
||||||
merged[current] = arr1[index1];
|
|
||||||
index1++;
|
|
||||||
} else {
|
|
||||||
merged[current] = arr2[index2];
|
|
||||||
index2++;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
current++;
|
|
||||||
}
|
|
||||||
return merged;
|
|
||||||
}
|
|
||||||
|
|
||||||
// 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)
|
|
||||||
// }
|
|
||||||
// });
|
|
||||||
// }
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,22 +0,0 @@
|
||||||
th {
|
|
||||||
text-transform: uppercase;
|
|
||||||
}
|
|
||||||
|
|
||||||
.is-public {
|
|
||||||
padding-left: 5px;
|
|
||||||
padding-right: 5px;
|
|
||||||
border: 1px solid var(--primary-color-3)3b;
|
|
||||||
color: var(--primary-color-3);
|
|
||||||
background-color: var(--primary-color-3)0f;
|
|
||||||
border-radius: 10em;
|
|
||||||
text-align: center;
|
|
||||||
}
|
|
||||||
|
|
||||||
.template-name {
|
|
||||||
padding-left: 0px;
|
|
||||||
border: 1px solid rgb(218, 227, 243);
|
|
||||||
color: rgb(43, 104, 209);
|
|
||||||
background-color: rgb(236, 241, 249);
|
|
||||||
border-radius: 10em;
|
|
||||||
text-align: center;
|
|
||||||
}
|
|
|
@ -1,63 +0,0 @@
|
||||||
<div class="card">
|
|
||||||
<div class="card-header card-header-plain">
|
|
||||||
<div class="card-desc">
|
|
||||||
<h4 class="card-title">
|
|
||||||
{{ 'RECENT-ACTIVITY.LAST-VISITED-DMP' | translate}}
|
|
||||||
</h4>
|
|
||||||
<p class="card-category">
|
|
||||||
{{ 'RECENT-ACTIVITY.LICENSE' | translate}}
|
|
||||||
</p>
|
|
||||||
</div>
|
|
||||||
<div class="view-all" [class.clickable]="isAuthenticated()" (click)="navigateToUrl()">
|
|
||||||
{{ 'GENERAL.ACTIONS.VIEW-ALL' | translate}}</div>
|
|
||||||
</div>
|
|
||||||
<div class="card-body table-responsive">
|
|
||||||
<table class="table table-hover">
|
|
||||||
<thead class="text-default">
|
|
||||||
<th>{{ 'DATASET-PROFILE-LISTING.COLUMNS.NAME' | translate }}</th>
|
|
||||||
<th>{{ 'DATASET-PROFILE-LISTING.COLUMNS.TEMPLATE' | translate }}</th>
|
|
||||||
<th>{{ 'DATASET-PROFILE-LISTING.COLUMNS.GRANT' | translate }}</th>
|
|
||||||
<th>{{ 'DATASET-PROFILE-LISTING.COLUMNS.ROLE' | translate }}</th>
|
|
||||||
<th>{{ 'DATASET-PROFILE-LISTING.COLUMNS.ORGANIZATION' | translate }}</th>
|
|
||||||
<th>{{ 'DATASET-PROFILE-LISTING.COLUMNS.STATUS' | translate }}</th>
|
|
||||||
<th>{{ 'DATASET-PROFILE-LISTING.COLUMNS.VISITED' | translate }}</th>
|
|
||||||
<th></th>
|
|
||||||
</thead>
|
|
||||||
<tbody *ngIf="dmpActivities != null">
|
|
||||||
<tr (click)="redirect(activity.id, recentActivityTypeEnum.Dmp)" *ngFor="let activity of dmpActivities" style="cursor: pointer;">
|
|
||||||
<td>{{ activity.label }}</td>
|
|
||||||
<td>
|
|
||||||
<div class="template-name">
|
|
||||||
--
|
|
||||||
</div>
|
|
||||||
</td>
|
|
||||||
<td>{{ activity.grant }}</td>
|
|
||||||
<td>Role Name</td>
|
|
||||||
<td>{{ activity.organisations }}</td>
|
|
||||||
<td *ngIf="activity.status === 1">
|
|
||||||
<div class="is-public">
|
|
||||||
{{ enumUtils.toDmpStatusString(activity.status) }}
|
|
||||||
</div>
|
|
||||||
</td>
|
|
||||||
<td *ngIf="activity.status === 0" style="padding-left: 12px">
|
|
||||||
{{ enumUtils.toDmpStatusString(activity.status) }}
|
|
||||||
</td>
|
|
||||||
<td>{{ activity.creationTime | date: "shortDate" }}</td>
|
|
||||||
<td><i class="material-icons more-icon">more_horiz</i></td>
|
|
||||||
</tr>
|
|
||||||
</tbody>
|
|
||||||
<tbody *ngIf="dmpActivities == null">
|
|
||||||
<tr>
|
|
||||||
<td></td>
|
|
||||||
<td></td>
|
|
||||||
<td></td>
|
|
||||||
<td></td>
|
|
||||||
<td></td>
|
|
||||||
<td></td>
|
|
||||||
<td></td>
|
|
||||||
<td><i class="material-icons more-icon">more_horiz</i></td>
|
|
||||||
</tr>
|
|
||||||
</tbody>
|
|
||||||
</table>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
|
@ -1,73 +0,0 @@
|
||||||
import { Component, OnInit } from "@angular/core";
|
|
||||||
import { Router } from '@angular/router';
|
|
||||||
import { RecentActivityType } from '@app/core/common/enum/recent-activity-type';
|
|
||||||
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 { EnumUtils } from '@app/core/services/utilities/enum-utils.service';
|
|
||||||
import { BaseComponent } from '@common/base/base.component';
|
|
||||||
import { takeUntil } from "rxjs/operators";
|
|
||||||
|
|
||||||
@Component({
|
|
||||||
selector: "app-recent-visited-activity",
|
|
||||||
templateUrl: "./recent-visited-activity.component.html",
|
|
||||||
styleUrls: ["./recent-visited-activity.component.css"]
|
|
||||||
})
|
|
||||||
export class RecentVisitedActivityComponent extends BaseComponent
|
|
||||||
implements OnInit {
|
|
||||||
dmpActivities: DmpListingModel[];
|
|
||||||
recentActivityItems: any[];
|
|
||||||
recentActivityTypeEnum = RecentActivityType;
|
|
||||||
public: boolean = false;
|
|
||||||
|
|
||||||
constructor(
|
|
||||||
private router: Router,
|
|
||||||
private authentication: AuthService,
|
|
||||||
private dmpService: DmpService,
|
|
||||||
public enumUtils: EnumUtils
|
|
||||||
) {
|
|
||||||
super();
|
|
||||||
}
|
|
||||||
|
|
||||||
ngOnInit() {
|
|
||||||
if (this.isAuthenticated()) {
|
|
||||||
const fields: Array<string> = ["-created"];
|
|
||||||
const dmpDataTableRequest: DataTableRequest<DmpCriteria> = new DataTableRequest(0, null, { fields: fields });
|
|
||||||
dmpDataTableRequest.criteria = new DmpCriteria();
|
|
||||||
dmpDataTableRequest.criteria.like = "";
|
|
||||||
this.dmpService
|
|
||||||
.getPaged(dmpDataTableRequest, "listing")
|
|
||||||
.pipe(takeUntil(this._destroyed))
|
|
||||||
.subscribe(response => {
|
|
||||||
this.dmpActivities = response.data;
|
|
||||||
});
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
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/edit/" + id]);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
default:
|
|
||||||
throw new Error("Unsupported Activity Type ");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public isAuthenticated(): boolean {
|
|
||||||
return this.authentication.currentAccountIsAuthenticated();
|
|
||||||
}
|
|
||||||
|
|
||||||
navigateToUrl() { }
|
|
||||||
}
|
|
|
@ -1,10 +0,0 @@
|
||||||
.clickable {
|
|
||||||
cursor: pointer;
|
|
||||||
}
|
|
||||||
|
|
||||||
.play_circle {
|
|
||||||
display: flex;
|
|
||||||
align-self: center;
|
|
||||||
margin: 0px 10px 0px 0px;
|
|
||||||
font-size: 40px;
|
|
||||||
}
|
|
|
@ -1,10 +0,0 @@
|
||||||
<a [routerLink]="[routerLink]" class="card clickable">
|
|
||||||
<div class="row card-header card-header-blue">
|
|
||||||
<div class="col card-desc">
|
|
||||||
<h4 class="card-title pb-1">{{ title }}</h4>
|
|
||||||
<p class="card-category">{{ subtitle }}</p>
|
|
||||||
</div>
|
|
||||||
<i class="col-auto material-icons play_circle">{{ icon }}</i>
|
|
||||||
</div>
|
|
||||||
<div class="card-body table-responsive"></div>
|
|
||||||
</a>
|
|
|
@ -1,30 +0,0 @@
|
||||||
import { Component, OnInit, Input, Output, EventEmitter } from "@angular/core";
|
|
||||||
import { Router } from "@angular/router";
|
|
||||||
|
|
||||||
@Component({
|
|
||||||
selector: "app-wizard",
|
|
||||||
templateUrl: "./wizard.component.html",
|
|
||||||
styleUrls: ["./wizard.component.css"]
|
|
||||||
})
|
|
||||||
export class WizardComponent {
|
|
||||||
@Input() title: string;
|
|
||||||
@Input() subtitle: string;
|
|
||||||
@Input() icon: string;
|
|
||||||
@Input() routerLink: string;
|
|
||||||
@Output() onClick: EventEmitter<void> = new EventEmitter<void>();
|
|
||||||
|
|
||||||
wizardItems: any[];
|
|
||||||
|
|
||||||
constructor(private router: Router) {}
|
|
||||||
|
|
||||||
cardClicked() {
|
|
||||||
this.onClick.emit();
|
|
||||||
}
|
|
||||||
navigateToCreate() {
|
|
||||||
this.router.navigate(["/quick-wizard"]);
|
|
||||||
}
|
|
||||||
|
|
||||||
navigateToAdd() {
|
|
||||||
this.router.navigate(["/datasetcreatewizard"]);
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -108,6 +108,9 @@ import { DmpEditorBlueprintComponent } from './dmp-editor-blueprint/dmp-editor-b
|
||||||
LicenseInfoComponent,
|
LicenseInfoComponent,
|
||||||
DatasetPreviewDialogComponent,
|
DatasetPreviewDialogComponent,
|
||||||
DmpEditorBlueprintComponent
|
DmpEditorBlueprintComponent
|
||||||
]
|
],
|
||||||
|
exports: [
|
||||||
|
DmpListingItemComponent
|
||||||
|
]
|
||||||
})
|
})
|
||||||
export class DmpModule { }
|
export class DmpModule { }
|
||||||
|
|
|
@ -18,6 +18,7 @@ import { GuidedTourService } from '@app/library/guided-tour/guided-tour.service'
|
||||||
// import { IBreadCrumbComponent } from '@app/ui/misc/breadcrumb/definition/IBreadCrumbComponent';
|
// import { IBreadCrumbComponent } from '@app/ui/misc/breadcrumb/definition/IBreadCrumbComponent';
|
||||||
// import { BreadcrumbItem } from '@app/ui/misc/breadcrumb/definition/breadcrumb-item';
|
// import { BreadcrumbItem } from '@app/ui/misc/breadcrumb/definition/breadcrumb-item';
|
||||||
import { IsActive } from '@app/core/common/enum/is-active.enum';
|
import { IsActive } from '@app/core/common/enum/is-active.enum';
|
||||||
|
import { Description } from '@app/core/model/description/description';
|
||||||
import { Dmp, DmpUser } from '@app/core/model/dmp/dmp';
|
import { Dmp, DmpUser } from '@app/core/model/dmp/dmp';
|
||||||
import { DmpLookup } from '@app/core/query/dmp.lookup';
|
import { DmpLookup } from '@app/core/query/dmp.lookup';
|
||||||
import { BaseComponent } from '@common/base/base.component';
|
import { BaseComponent } from '@common/base/base.component';
|
||||||
|
@ -26,7 +27,6 @@ import { TranslateService } from '@ngx-translate/core';
|
||||||
import { NgDialogAnimationService } from "ng-dialog-animation";
|
import { NgDialogAnimationService } from "ng-dialog-animation";
|
||||||
import { debounceTime, takeUntil } from 'rxjs/operators';
|
import { debounceTime, takeUntil } from 'rxjs/operators';
|
||||||
import { nameof } from 'ts-simple-nameof';
|
import { nameof } from 'ts-simple-nameof';
|
||||||
import { Description } from '@app/core/model/description/description';
|
|
||||||
|
|
||||||
@Component({
|
@Component({
|
||||||
selector: 'app-dmp-listing-component',
|
selector: 'app-dmp-listing-component',
|
||||||
|
@ -37,30 +37,13 @@ export class DmpListingComponent extends BaseComponent implements OnInit { //IBr
|
||||||
|
|
||||||
@ViewChild(MatPaginator, { static: true }) _paginator: MatPaginator;
|
@ViewChild(MatPaginator, { static: true }) _paginator: MatPaginator;
|
||||||
@ViewChild(MatSort) sort: MatSort;
|
@ViewChild(MatSort) sort: MatSort;
|
||||||
// @ViewChild(DmpCriteriaComponent, { static: true }) criteria: DmpCriteriaComponent;
|
|
||||||
|
|
||||||
// breadCrumbs: Observable<BreadcrumbItem[]> = observableOf([{ parentComponentName: null, label: 'DMPs', url: "/plans" }]);
|
|
||||||
|
|
||||||
lookup: DmpLookup = new DmpLookup();
|
lookup: DmpLookup = new DmpLookup();
|
||||||
groupId: string;
|
groupId: string;
|
||||||
|
|
||||||
|
|
||||||
// itemId: string;
|
|
||||||
// showGrant: boolean;
|
|
||||||
// titlePrefix: string;
|
|
||||||
totalCount: number;
|
totalCount: number;
|
||||||
listingItems: Dmp[] = [];
|
listingItems: Dmp[] = [];
|
||||||
// allVersions: boolean = false;
|
|
||||||
// groupLabel: string;
|
|
||||||
isPublic: boolean = false;
|
isPublic: boolean = false;
|
||||||
// public isVisible = true
|
|
||||||
hasListingItems = null;
|
hasListingItems = null;
|
||||||
|
|
||||||
// startIndex: number = 0;
|
|
||||||
pageSize: number = 5;
|
pageSize: number = 5;
|
||||||
|
|
||||||
// criteria: DmpCriteria;
|
|
||||||
// criteriaFormGroup: UntypedFormGroup;
|
|
||||||
public formGroup = new UntypedFormBuilder().group({
|
public formGroup = new UntypedFormBuilder().group({
|
||||||
like: new UntypedFormControl(),
|
like: new UntypedFormControl(),
|
||||||
order: new UntypedFormControl()
|
order: new UntypedFormControl()
|
||||||
|
@ -68,8 +51,6 @@ export class DmpListingComponent extends BaseComponent implements OnInit { //IBr
|
||||||
|
|
||||||
scrollbar: boolean;
|
scrollbar: boolean;
|
||||||
order = RecentActivityOrder;
|
order = RecentActivityOrder;
|
||||||
// dmpText: string;
|
|
||||||
// datasetText: string;
|
|
||||||
|
|
||||||
constructor(
|
constructor(
|
||||||
private dmpService: DmpService,
|
private dmpService: DmpService,
|
||||||
|
|
|
@ -6,10 +6,9 @@ import { Router } from '@angular/router';
|
||||||
import { DmpAccessType } from '@app/core/common/enum/dmp-access-type';
|
import { DmpAccessType } from '@app/core/common/enum/dmp-access-type';
|
||||||
import { DmpUserRole } from '@app/core/common/enum/dmp-user-role';
|
import { DmpUserRole } from '@app/core/common/enum/dmp-user-role';
|
||||||
import { ReferenceType } from '@app/core/common/enum/reference-type';
|
import { ReferenceType } from '@app/core/common/enum/reference-type';
|
||||||
import { DescriptionTemplatesInSection, DmpBlueprint, DmpBlueprintDefinition, DmpBlueprintDefinitionSection, FieldInSection } from '@app/core/model/dmp-blueprint/dmp-blueprint';
|
|
||||||
import { Dmp } from '@app/core/model/dmp/dmp';
|
import { Dmp } from '@app/core/model/dmp/dmp';
|
||||||
import { DmpBlueprintService } from '@app/core/services/dmp/dmp-blueprint.service';
|
import { DmpBlueprintService } from '@app/core/services/dmp/dmp-blueprint.service';
|
||||||
import { DmpService } from '@app/core/services/dmp/dmp.service';
|
import { DmpServiceNew } from '@app/core/services/dmp/dmp.service';
|
||||||
import { LockService } from '@app/core/services/lock/lock.service';
|
import { LockService } from '@app/core/services/lock/lock.service';
|
||||||
import { MatomoService } from '@app/core/services/matomo/matomo-service';
|
import { MatomoService } from '@app/core/services/matomo/matomo-service';
|
||||||
import { SnackBarNotificationLevel, UiNotificationService } from '@app/core/services/notification/ui-notification-service';
|
import { SnackBarNotificationLevel, UiNotificationService } from '@app/core/services/notification/ui-notification-service';
|
||||||
|
@ -20,8 +19,7 @@ import { BaseComponent } from '@common/base/base.component';
|
||||||
import { ConfirmationDialogComponent } from '@common/modules/confirmation-dialog/confirmation-dialog.component';
|
import { ConfirmationDialogComponent } from '@common/modules/confirmation-dialog/confirmation-dialog.component';
|
||||||
import { Guid } from '@common/types/guid';
|
import { Guid } from '@common/types/guid';
|
||||||
import { TranslateService } from '@ngx-translate/core';
|
import { TranslateService } from '@ngx-translate/core';
|
||||||
import { map, takeUntil } from 'rxjs/operators';
|
import { takeUntil } from 'rxjs/operators';
|
||||||
import { nameof } from 'ts-simple-nameof';
|
|
||||||
import { DmpStatus } from '../../../../core/common/enum/dmp-status';
|
import { DmpStatus } from '../../../../core/common/enum/dmp-status';
|
||||||
import { AuthService } from '../../../../core/services/auth/auth.service';
|
import { AuthService } from '../../../../core/services/auth/auth.service';
|
||||||
|
|
||||||
|
@ -48,7 +46,7 @@ export class DmpListingItemComponent extends BaseComponent implements OnInit {
|
||||||
private dialog: MatDialog,
|
private dialog: MatDialog,
|
||||||
private authentication: AuthService,
|
private authentication: AuthService,
|
||||||
public enumUtils: EnumUtils,
|
public enumUtils: EnumUtils,
|
||||||
private dmpService: DmpService,
|
private dmpService: DmpServiceNew,
|
||||||
private dmpBlueprintService: DmpBlueprintService,
|
private dmpBlueprintService: DmpBlueprintService,
|
||||||
private language: TranslateService,
|
private language: TranslateService,
|
||||||
private uiNotificationService: UiNotificationService,
|
private uiNotificationService: UiNotificationService,
|
||||||
|
@ -116,7 +114,7 @@ export class DmpListingItemComponent extends BaseComponent implements OnInit {
|
||||||
|
|
||||||
isUserDMPRelated() {
|
isUserDMPRelated() {
|
||||||
const principalId: Guid = this.authentication.userId();
|
const principalId: Guid = this.authentication.userId();
|
||||||
return this.dmp.dmpUsers.some(x => (x.user.id === principalId));
|
return this.dmp.dmpUsers?.some(x => (x.user.id === principalId));
|
||||||
}
|
}
|
||||||
|
|
||||||
cloneOrNewVersionClicked(dmp: Dmp, isNewVersion: boolean) {
|
cloneOrNewVersionClicked(dmp: Dmp, isNewVersion: boolean) {
|
||||||
|
@ -147,37 +145,6 @@ export class DmpListingItemComponent extends BaseComponent implements OnInit {
|
||||||
// });
|
// });
|
||||||
}
|
}
|
||||||
|
|
||||||
private getBlueprintDefinition(blueprintId: Guid, successFunction) {
|
|
||||||
this.dmpBlueprintService.getSingle(blueprintId, [
|
|
||||||
[nameof<DmpBlueprint>(x => x.definition), nameof<DmpBlueprintDefinition>(x => x.sections), nameof<DmpBlueprintDefinitionSection>(x => x.id)].join('.'),
|
|
||||||
[nameof<DmpBlueprint>(x => x.definition), nameof<DmpBlueprintDefinition>(x => x.sections), nameof<DmpBlueprintDefinitionSection>(x => x.label)].join('.'),
|
|
||||||
[nameof<DmpBlueprint>(x => x.definition), nameof<DmpBlueprintDefinition>(x => x.sections), nameof<DmpBlueprintDefinitionSection>(x => x.description)].join('.'),
|
|
||||||
[nameof<DmpBlueprint>(x => x.definition), nameof<DmpBlueprintDefinition>(x => x.sections), nameof<DmpBlueprintDefinitionSection>(x => x.ordinal)].join('.'),
|
|
||||||
[nameof<DmpBlueprint>(x => x.definition), nameof<DmpBlueprintDefinition>(x => x.sections), nameof<DmpBlueprintDefinitionSection>(x => x.hasTemplates)].join('.'),
|
|
||||||
|
|
||||||
[nameof<DmpBlueprint>(x => x.definition), nameof<DmpBlueprintDefinition>(x => x.sections), nameof<DmpBlueprintDefinitionSection>(x => x.fields), nameof<FieldInSection>(x => x.id)].join('.'),
|
|
||||||
[nameof<DmpBlueprint>(x => x.definition), nameof<DmpBlueprintDefinition>(x => x.sections), nameof<DmpBlueprintDefinitionSection>(x => x.fields), nameof<FieldInSection>(x => x.category)].join('.'),
|
|
||||||
[nameof<DmpBlueprint>(x => x.definition), nameof<DmpBlueprintDefinition>(x => x.sections), nameof<DmpBlueprintDefinitionSection>(x => x.fields), nameof<FieldInSection>(x => x.dataType)].join('.'),
|
|
||||||
[nameof<DmpBlueprint>(x => x.definition), nameof<DmpBlueprintDefinition>(x => x.sections), nameof<DmpBlueprintDefinitionSection>(x => x.fields), nameof<FieldInSection>(x => x.systemFieldType)].join('.'),
|
|
||||||
[nameof<DmpBlueprint>(x => x.definition), nameof<DmpBlueprintDefinition>(x => x.sections), nameof<DmpBlueprintDefinitionSection>(x => x.fields), nameof<FieldInSection>(x => x.label)].join('.'),
|
|
||||||
[nameof<DmpBlueprint>(x => x.definition), nameof<DmpBlueprintDefinition>(x => x.sections), nameof<DmpBlueprintDefinitionSection>(x => x.fields), nameof<FieldInSection>(x => x.placeholder)].join('.'),
|
|
||||||
[nameof<DmpBlueprint>(x => x.definition), nameof<DmpBlueprintDefinition>(x => x.sections), nameof<DmpBlueprintDefinitionSection>(x => x.fields), nameof<FieldInSection>(x => x.description)].join('.'),
|
|
||||||
[nameof<DmpBlueprint>(x => x.definition), nameof<DmpBlueprintDefinition>(x => x.sections), nameof<DmpBlueprintDefinitionSection>(x => x.fields), nameof<FieldInSection>(x => x.required)].join('.'),
|
|
||||||
[nameof<DmpBlueprint>(x => x.definition), nameof<DmpBlueprintDefinition>(x => x.sections), nameof<DmpBlueprintDefinitionSection>(x => x.fields), nameof<FieldInSection>(x => x.ordinal)].join('.'),
|
|
||||||
|
|
||||||
[nameof<DmpBlueprint>(x => x.definition), nameof<DmpBlueprintDefinition>(x => x.sections), nameof<DmpBlueprintDefinitionSection>(x => x.descriptionTemplates), nameof<DescriptionTemplatesInSection>(x => x.id)].join('.'),
|
|
||||||
[nameof<DmpBlueprint>(x => x.definition), nameof<DmpBlueprintDefinition>(x => x.sections), nameof<DmpBlueprintDefinitionSection>(x => x.descriptionTemplates), nameof<DescriptionTemplatesInSection>(x => x.descriptionTemplateId)].join('.'),
|
|
||||||
[nameof<DmpBlueprint>(x => x.definition), nameof<DmpBlueprintDefinition>(x => x.sections), nameof<DmpBlueprintDefinitionSection>(x => x.descriptionTemplates), nameof<DescriptionTemplatesInSection>(x => x.label)].join('.'),
|
|
||||||
[nameof<DmpBlueprint>(x => x.definition), nameof<DmpBlueprintDefinition>(x => x.sections), nameof<DmpBlueprintDefinitionSection>(x => x.descriptionTemplates), nameof<DescriptionTemplatesInSection>(x => x.minMultiplicity)].join('.'),
|
|
||||||
[nameof<DmpBlueprint>(x => x.definition), nameof<DmpBlueprintDefinition>(x => x.sections), nameof<DmpBlueprintDefinitionSection>(x => x.descriptionTemplates), nameof<DescriptionTemplatesInSection>(x => x.maxMultiplicity)].join('.'),
|
|
||||||
]
|
|
||||||
)
|
|
||||||
.pipe(map(data => data as DmpBlueprint), takeUntil(this._destroyed))
|
|
||||||
.subscribe(
|
|
||||||
data => successFunction(data),
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
openCloneDialog(isNewVersion: boolean) {
|
openCloneDialog(isNewVersion: boolean) {
|
||||||
// TODO: fix this
|
// TODO: fix this
|
||||||
// const dialogRef = this.dialog.open(CloneDialogComponent, {
|
// const dialogRef = this.dialog.open(CloneDialogComponent, {
|
||||||
|
@ -271,8 +238,8 @@ export class DmpListingItemComponent extends BaseComponent implements OnInit {
|
||||||
// this.uiNotificationService.snackBarNotification(errorObj.message, SnackBarNotificationLevel.Error);
|
// this.uiNotificationService.snackBarNotification(errorObj.message, SnackBarNotificationLevel.Error);
|
||||||
// }
|
// }
|
||||||
|
|
||||||
deleteClicked(id: string) {
|
deleteClicked(id: Guid) {
|
||||||
this.lockService.checkLockStatus(id).pipe(takeUntil(this._destroyed))
|
this.lockService.checkLockStatus(id.toString()).pipe(takeUntil(this._destroyed))
|
||||||
.subscribe(lockStatus => {
|
.subscribe(lockStatus => {
|
||||||
if (!lockStatus) {
|
if (!lockStatus) {
|
||||||
this.openDeleteDialog(id);
|
this.openDeleteDialog(id);
|
||||||
|
@ -282,7 +249,7 @@ export class DmpListingItemComponent extends BaseComponent implements OnInit {
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
openDeleteDialog(id: string) {
|
openDeleteDialog(id: Guid) {
|
||||||
const dialogRef = this.dialog.open(ConfirmationDialogComponent, {
|
const dialogRef = this.dialog.open(ConfirmationDialogComponent, {
|
||||||
maxWidth: '300px',
|
maxWidth: '300px',
|
||||||
restoreFocus: false,
|
restoreFocus: false,
|
||||||
|
@ -351,6 +318,6 @@ export class DmpListingItemComponent extends BaseComponent implements OnInit {
|
||||||
|
|
||||||
isUserOwner(dmp: Dmp): boolean {
|
isUserOwner(dmp: Dmp): boolean {
|
||||||
const principalId: Guid = this.authentication.userId();
|
const principalId: Guid = this.authentication.userId();
|
||||||
if (principalId) return !!dmp.dmpUsers.find(x => (x.role === DmpUserRole.Owner) && (principalId === x.id));
|
if (principalId) return !!dmp.dmpUsers?.find(x => (x.role === DmpUserRole.Owner) && (principalId === x.id));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -175,7 +175,7 @@ export class DmpOverviewComponent extends BaseComponent implements OnInit {
|
||||||
setIsUserOwner() {
|
setIsUserOwner() {
|
||||||
if (this.dmp) {
|
if (this.dmp) {
|
||||||
const principalId: Guid = this.authentication.userId();
|
const principalId: Guid = this.authentication.userId();
|
||||||
if (principalId) this.isUserOwner = !!this.dmp.dmpUsers.find(x => (x.role === DmpUserRole.Owner) && (principalId === x.id));
|
if (principalId) this.isUserOwner = !!this.dmp.dmpUsers?.find(x => (x.role === DmpUserRole.Owner) && (principalId === x.id));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -403,7 +403,7 @@ export class DmpOverviewComponent extends BaseComponent implements OnInit {
|
||||||
|
|
||||||
isUserDmpRelated(): boolean {
|
isUserDmpRelated(): boolean {
|
||||||
const principalId: Guid = this.authentication.userId();
|
const principalId: Guid = this.authentication.userId();
|
||||||
return this.dmp.dmpUsers.some(x => (x.user.id === principalId));
|
return this.dmp.dmpUsers?.some(x => (x.user.id === principalId));
|
||||||
}
|
}
|
||||||
|
|
||||||
isDraftDmp(dmp: Dmp) {
|
isDraftDmp(dmp: Dmp) {
|
||||||
|
|
Loading…
Reference in New Issue